mirror of
https://github.com/pret/pokediamond.git
synced 2026-10-01 23:31:58 -04:00
205 lines
5.4 KiB
C
205 lines
5.4 KiB
C
#include "global.h"
|
|
#include "heap.h"
|
|
#include "party.h"
|
|
#include "player_data.h"
|
|
#include "pokemon.h"
|
|
#include "save_block_2.h"
|
|
#include "unk_02015CC0.h"
|
|
#include "unk_0202C144.h"
|
|
#include "module_05.h"
|
|
#include "script_pokemon_util.h"
|
|
#include "constants/items.h"
|
|
#include "constants/script_pokemon_util.h"
|
|
|
|
#pragma thumb on
|
|
|
|
BOOL MonNotFaintedOrEgg(struct Pokemon * pokemon)
|
|
{
|
|
if (GetMonData(pokemon, MON_DATA_HP, NULL) == 0)
|
|
return FALSE;
|
|
if (GetMonData(pokemon, MON_DATA_IS_EGG, NULL))
|
|
return FALSE;
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL GiveMon(u32 heap_id, struct SaveBlock2 * sav2, u16 species, u8 level, u16 item, u32 mapSec, u32 encounterType)
|
|
{
|
|
u32 ptr;
|
|
struct PlayerData * data = Sav2_PlayerData_GetProfileAddr(sav2);
|
|
struct PlayerParty * party = SavArray_PlayerParty_get(sav2);
|
|
struct Pokemon * mon = AllocMonZeroed(heap_id);
|
|
ZeroMonData(mon);
|
|
CreateMon(mon, species, level, 32, 0, 0, OT_ID_PLAYER_ID, 0);
|
|
FUN_0206A014(mon, data, ITEM_POKE_BALL, mapSec, encounterType, heap_id);
|
|
ptr = item;
|
|
SetMonData(mon, MON_DATA_HELD_ITEM, &ptr);
|
|
BOOL isAdded = AddMonToParty(party, mon);
|
|
if (isAdded)
|
|
{
|
|
FUN_0202C144(sav2, mon);
|
|
}
|
|
FreeToHeap(mon);
|
|
return isAdded;
|
|
}
|
|
|
|
/* Seems to have something to do with Manaphy Egg*/
|
|
BOOL GiveEgg(u32 heapId, struct SaveBlock2 * sav2, u16 species, int level, int metLocIndex, int a3)
|
|
{
|
|
#pragma unused(heapId)
|
|
struct PlayerData * data = Sav2_PlayerData_GetProfileAddr(sav2);
|
|
struct PlayerParty * party = SavArray_PlayerParty_get(sav2);
|
|
struct Pokemon * mon = AllocMonZeroed(32);
|
|
ZeroMonData(mon);
|
|
MOD05_SetEggStats(mon, species, level, data, 4, FUN_02015CF8(metLocIndex, a3));
|
|
BOOL isAdded = AddMonToParty(party, mon);
|
|
FreeToHeap(mon);
|
|
return isAdded;
|
|
}
|
|
|
|
void PartyMonSetMoveInSlot(struct PlayerParty * party, int partySlot, int moveSlot, u16 move)
|
|
{
|
|
struct Pokemon * mon = GetPartyMonByIndex(party, partySlot);
|
|
MonSetMoveInSlot(mon, move, (u8)moveSlot);
|
|
}
|
|
|
|
int GetIdxOfFirstPartyMonWithMove(struct PlayerParty * party, int move)
|
|
{
|
|
int partyCount = GetPartyCount(party);
|
|
|
|
for (int i = 0; i < partyCount; i++)
|
|
{
|
|
struct Pokemon * mon = GetPartyMonByIndex(party, i);
|
|
|
|
if (GetMonData(mon, MON_DATA_IS_EGG, NULL))
|
|
continue;
|
|
if (GetMonData(mon, MON_DATA_MOVE1, NULL) == move
|
|
|| GetMonData(mon, MON_DATA_MOVE2, NULL) == move
|
|
|| GetMonData(mon, MON_DATA_MOVE3, NULL) == move
|
|
|| GetMonData(mon, MON_DATA_MOVE4, NULL) == move)
|
|
return i;
|
|
}
|
|
return 0xFF;
|
|
}
|
|
|
|
int CountAlivePokemon(struct PlayerParty * party)
|
|
{
|
|
int partyCount = GetPartyCount(party);
|
|
int i;
|
|
int aliveCount = 0;
|
|
|
|
for (i = 0; i < partyCount; i++)
|
|
{
|
|
struct Pokemon * mon = GetPartyMonByIndex(party, i);
|
|
|
|
if(MonNotFaintedOrEgg(mon))
|
|
aliveCount++;
|
|
}
|
|
return aliveCount;
|
|
}
|
|
|
|
struct Pokemon * GetFirstAliveMonInParty_CrashIfNone(struct PlayerParty * party)
|
|
{
|
|
int i;
|
|
int partyCount = GetPartyCount(party);
|
|
|
|
for (i = 0; i < partyCount; i++)
|
|
{
|
|
struct Pokemon * mon = GetPartyMonByIndex(party, i);
|
|
|
|
if(MonNotFaintedOrEgg(mon))
|
|
return mon;
|
|
}
|
|
GF_ASSERT(0);
|
|
return 0;
|
|
}
|
|
|
|
struct Pokemon * GetFirstNonEggInParty(struct PlayerParty * party)
|
|
{
|
|
u16 i;
|
|
u16 partyCount = (u16)GetPartyCount(party);
|
|
|
|
for (i = 0; i < partyCount; i++)
|
|
{
|
|
struct Pokemon * mon = GetPartyMonByIndex(party, i);
|
|
|
|
if (!GetMonData(mon, MON_DATA_IS_EGG, NULL))
|
|
return mon;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
BOOL HasEnoughAlivePokemonForDoubleBattle(struct PlayerParty * party)
|
|
{
|
|
return (CountAlivePokemon(party) >= 2);
|
|
}
|
|
|
|
void GiveAllMonsTheSinnohChampRibbon(struct PlayerParty * party)
|
|
{
|
|
u8 var = 1;
|
|
int partyCount = GetPartyCount(party);
|
|
|
|
|
|
for (int i = 0; i < partyCount; i++)
|
|
{
|
|
struct Pokemon * mon = GetPartyMonByIndex(party, i);
|
|
|
|
if (GetMonData(mon, MON_DATA_IS_EGG, NULL))
|
|
continue;
|
|
|
|
SetMonData(mon, MON_DATA_SINNOH_CHAMP_RIBBON, &var);
|
|
}
|
|
}
|
|
|
|
int ApplyPoisonStep(struct PlayerParty * party, int location)
|
|
{
|
|
u32 hp;
|
|
int numPoisoned = 0;
|
|
int numHealed = 0;
|
|
int partyCount = GetPartyCount(party);
|
|
|
|
for (int i = 0; i < partyCount; i++)
|
|
{
|
|
struct Pokemon * mon = GetPartyMonByIndex(party, i);
|
|
|
|
if(!MonNotFaintedOrEgg(mon))
|
|
continue;
|
|
|
|
if (!(GetMonData(mon, MON_DATA_STATUS, NULL) & 0x88))
|
|
continue;
|
|
|
|
hp = GetMonData(mon, MON_DATA_HP, NULL);
|
|
if (hp > 1)
|
|
hp--;
|
|
SetMonData(mon, MON_DATA_HP, &hp);
|
|
if (hp == 1)
|
|
{
|
|
numHealed++;
|
|
MonApplyFriendshipMod(mon, FRIENDSHIP_EVENT_HEAL_FIELD_PSN, (u32)location);
|
|
}
|
|
numPoisoned++;
|
|
}
|
|
|
|
if (numHealed != 0)
|
|
return FLDPSN_HEAL;
|
|
|
|
if (numPoisoned != 0)
|
|
return FLDPSN_PSN;
|
|
|
|
return FLDPSN_NONE;
|
|
}
|
|
|
|
BOOL SurvivePoisoning(struct Pokemon * mon)
|
|
{
|
|
int status;
|
|
if (GetMonData(mon, MON_DATA_STATUS, NULL) & 0x88)
|
|
{
|
|
if (GetMonData(mon, MON_DATA_HP, NULL) == 1)
|
|
{
|
|
status = 0;
|
|
SetMonData(mon, MON_DATA_STATUS, &status);
|
|
return TRUE;
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|