summaryrefslogtreecommitdiff
path: root/src/dungeon_pokemon_attributes_1.c
blob: 93d8d4a1e542366f179a74e23a4de9a2ce19e475 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#include "global.h"
#include "dungeon_pokemon_attributes_1.h"

#include "constants/dungeon.h"
#include "constants/iq_skill.h"
#include "constants/move_id.h"
#include "constants/status.h"
#include "constants/tactic.h"
#include "dungeon_global_data.h"
#include "dungeon_items.h"
#include "dungeon_util.h"
#include "pokemon.h"
#include "pokemon_3.h"

const s16 gItemMasterMinWildLevel[] = {16};

extern bool8 IsIQSkillSet(u8 *, u32);
extern void SetIQSkill(u8 *param_1, u32 skillIndex);
extern bool8 HasIQForSkill(s32 pokeIQ, u8 IQSkillIndex);

extern bool8 CanSee(struct DungeonEntity *, struct DungeonEntity *);

extern u8 GetMoveType(struct PokemonMove *move);
extern s32 GetMovePower(struct PokemonMove *move);

bool8 CanSeeInvisible(struct DungeonEntity *pokemon)
{
    struct DungeonEntityData *pokemonData = pokemon->entityData;
    if (pokemonData->eyesightStatus != EYESIGHT_STATUS_EYEDROPS)
    {
        if (!HasItem(pokemon, ITEM_ID_GOGGLE_SPECS))
            return FALSE;
        else
            return TRUE;
    }
    else
        return TRUE;
}

bool8 HasTactic(struct DungeonEntity *pokemon, u8 tactic)
{
    struct DungeonEntityData *pokemonData = pokemon->entityData;
    if (pokemonData->isLeader)
    {
        bool8 isGoTheOtherWay = tactic == TACTIC_GO_THE_OTHER_WAY;
        return isGoTheOtherWay;
    }
    return pokemonData->tactic == tactic;
}

bool8 HasIQSkill(struct DungeonEntity *pokemon, u8 IQSkill)
{
    return IsIQSkillSet(pokemon->entityData->IQSkillsEnabled, 1 << IQSkill);
}

bool8 HasIQSkillPair(struct DungeonEntity *pokemon, u8 IQSkill1, u8 IQSkill2)
{
    return IsIQSkillSet(pokemon->entityData->IQSkillsEnabled, 1 << IQSkill1 | 1 << IQSkill2);
}

void LoadIQSkills(struct DungeonEntity *pokemon)
{
  u8 *iVar2;
  s32 IQSkill;
  struct DungeonEntityData *pokemonData;

  pokemonData = pokemon->entityData;
  if (pokemonData->isEnemy) {
    iVar2 = pokemonData->IQSkillsEnabled;
    SetIQSkill(iVar2, IQ_SKILL_STATUS_CHECKER);
    SetIQSkill(iVar2, IQ_SKILL_PP_CHECKER);
    SetIQSkill(iVar2, IQ_SKILL_ITEM_CATCHER);
    if (pokemonData->isBoss)
      SetIQSkill(iVar2, IQ_SKILL_SELF_CURER);
    if (pokemonData->level >= *gItemMasterMinWildLevel)
      SetIQSkill(iVar2, IQ_SKILL_ITEM_MASTER);
    pokemonData->tactic = TACTIC_GO_AFTER_FOES;
  }
  else {
    pokemonData->IQSkillsEnabled[0] = 0;
    pokemonData->IQSkillsEnabled[1] = 0;
    pokemonData->IQSkillsEnabled[2] = 0;
    for(IQSkill = IQ_SKILL_TYPE_ADVANTAGE_MASTER; IQSkill < NUM_IQ_SKILLS; IQSkill++)
    {
      if (HasIQForSkill(pokemonData->IQ,IQSkill) &&
            IsIQSkillSet(pokemonData->IQSkillsSelected, 1 << IQSkill))
        {
            SetIQSkill(pokemonData->IQSkillsEnabled,IQSkill);
      }
    }
  }
}

bool8 CanSeeTeammate(struct DungeonEntity * pokemon)
{
  struct DungeonEntity *teamMember;
  s32 memberIdx;

  if (pokemon->entityData->isEnemy) {
      return FALSE;
  }
  else
  {
    for(memberIdx = 0; memberIdx < MAX_TEAM_MEMBERS; memberIdx++)
    {
      teamMember = gDungeonGlobalData->teamPokemon[memberIdx];
      if (EntityExists(pokemon) && (pokemon != teamMember) && (CanSee(pokemon,teamMember)))
      {
        return TRUE;
      }
    }
    return FALSE;
  }
}

u8 GetMoveType_2(struct DungeonEntity *pokemon, struct PokemonMove *pokeMove)
{
    if(pokeMove->moveID == MOVE_HIDDEN_POWER)
        return pokemon->entityData->hiddenPowerType;
    else
        return GetMoveType(pokeMove);
}

s32 CalculateMovePower(struct DungeonEntity *pokemon, struct PokemonMove *pokeMove)
{
    if(pokeMove->moveID == MOVE_HIDDEN_POWER)
        return (pokemon->entityData->hiddenPowerPower + pokeMove->powerBoost);
    else
        return (GetMovePower(pokeMove) + pokeMove->powerBoost);
}

bool8 ToolboxEnabled(struct DungeonEntityData *pokemon)
{
    if(!IsToolboxEnabled(pokemon->entityID))
        return FALSE;
    return TRUE;
}

static inline bool8 sub_8071A8C_sub(struct DungeonEntityData *pokemonData)
{
    if(pokemonData->joinLocation == DUNGEON_JOIN_LOCATION_CLIENT_POKEMON ||
        pokemonData->joinLocation == DUNGEON_RESCUE_TEAM_BASE)
        return TRUE;
    else
        return FALSE;
}

bool8 sub_8071A8C(struct DungeonEntity *pokemon)
{
    struct DungeonEntityData *pokemonData;
    if(EntityExists(pokemon))
    {
        pokemonData = pokemon->entityData;
        if(pokemonData->clientType != CLIENT_TYPE_CLIENT)
        {
            if(!sub_8071A8C_sub(pokemonData))
                return TRUE;
        }
    }
    return FALSE;
}