mirror of
https://github.com/pret/pmd-sky.git
synced 2026-03-21 17:25:15 -05:00
Import struct monster from pmdsky-debug
This commit is contained in:
parent
76e8d94dc1
commit
40e311f222
|
|
@ -118,7 +118,7 @@ XMAP := $(NEF).xMAP
|
|||
|
||||
EXCCFLAGS := -Cpp_exceptions off
|
||||
|
||||
MWCFLAGS = $(DEFINES) -enum int -lang c99 $(EXCCFLAGS) -gccext,on -proc $(PROC) -msgstyle gcc -gccinc -i ./include -i ./include/library -i $(WORK_DIR)/files -I$(WORK_DIR)/lib/include -interworking -inline on,noauto -char signed -W all -W pedantic -W noimpl_signedunsigned -W noimplicitconv -W nounusedarg -W nomissingreturn -W error
|
||||
MWCFLAGS = $(DEFINES) -enum min -lang c99 $(EXCCFLAGS) -gccext,on -proc $(PROC) -msgstyle gcc -gccinc -i ./include -i ./include/library -i $(WORK_DIR)/files -I$(WORK_DIR)/lib/include -interworking -inline on,noauto -char signed -W all -W pedantic -W noimpl_signedunsigned -W noimplicitconv -W nounusedarg -W nomissingreturn -W error
|
||||
|
||||
MWASFLAGS = $(DEFINES) -proc $(PROC_S) -gccinc -i . -i ./include -i $(WORK_DIR)/asm/include -i $(WORK_DIR)/files -i $(WORK_DIR)/lib/asm/include -i $(WORK_DIR)/lib/syscall/asm/include -I$(WORK_DIR)/lib/include -DSDK_ASM
|
||||
MWLDFLAGS := -proc $(PROC) -nopic -nopid -interworking -map closure,unused -symtab sort -m _start -msgstyle gcc
|
||||
|
|
|
|||
|
|
@ -2,7 +2,9 @@
|
|||
#define PMDSKY_DUNGEON_MODE_H
|
||||
|
||||
#include "util.h"
|
||||
#include "enums.h"
|
||||
#include "graphics.h"
|
||||
#include "dungeon_mode_common.h"
|
||||
|
||||
// Used in various contexts, like with entity positions in the dungeon
|
||||
struct position {
|
||||
|
|
@ -24,12 +26,802 @@ struct dungeon {
|
|||
u8 floor; // 0x749
|
||||
u8 PAD2[74554];
|
||||
#ifndef JAPAN
|
||||
u32 PAD3[41];
|
||||
u8 PAD3[164];
|
||||
#endif
|
||||
struct entity* party_members[4]; // 0x4800
|
||||
struct entity* party_members[4]; // 0x12B28
|
||||
// Possibly more stuff
|
||||
};
|
||||
|
||||
// Item info
|
||||
struct item {
|
||||
// 0x0: flags: 1-byte bitfield
|
||||
u8 flags_0x0;
|
||||
/* bool f_exists : 1; // Validity flag */
|
||||
/* bool f_in_shop : 1; // In a Kecleon Shop */
|
||||
/* bool f_unpaid : 1; // Picked up from a Kecleon Shop but not paid for yet */
|
||||
/* bool f_sticky : 1; // Sticky */
|
||||
/* bool f_set : 1; // Usable by L+R */
|
||||
/* bool flag_unk5 : 1; */
|
||||
/* // For stolen items to recover from outlaws (has red X)? Could be for other items for other */
|
||||
/* // types of missions? (Uncertain) */
|
||||
/* bool f_unk_mission_item1 : 1; */
|
||||
/* // For stolen items to recover from outlaws (has red X)? Could be for other items for other */
|
||||
/* // types of missions? (Uncertain) Definitely used temporarily when sorting the items in */
|
||||
/* // storage. */
|
||||
/* bool f_unk_mission_item2 : 1; */
|
||||
// 0x1: For bag items. 0 for none, 1 if held by the leader, 2 for the second party member, etc.
|
||||
u8 held_by;
|
||||
// 0x2: Only for stackable items. Will be 0 if unapplicable. For Poké, this is an "amount code"
|
||||
// rather than the literal amount (see MONEY_QUANTITY_TABLE)
|
||||
u16 quantity;
|
||||
enum item_id id; // 0x4
|
||||
};
|
||||
|
||||
// Monster stat modifier info
|
||||
struct monster_stat_modifiers {
|
||||
// Stages go from 0-20 inclusive, with normal being 10
|
||||
s16 offensive_stages[2]; // 0x0: {atk, sp_atk}
|
||||
s16 defensive_stages[2]; // 0x4: {def, sp_def}
|
||||
s16 hit_chance_stages[2]; // 0x8: {accuracy, evasion}
|
||||
s16 flash_fire_boost; // 0xC: can be 0, 1, or 2
|
||||
undefined field_0xe;
|
||||
undefined field_0xf;
|
||||
// Some moves like Screech affect the damage calculation differently than, e.g., Leer
|
||||
// 0x10: binary fixed-point (8 fraction bits), {atk, sp_atk}; from Charm, Memento, etc.
|
||||
fx32_8 offensive_multipliers[2];
|
||||
// 0x18: binary fixed-point (8 fraction bits), {def, sp_def}; from Screech, etc.
|
||||
fx32_8 defensive_multipliers[2];
|
||||
};
|
||||
|
||||
// Monster statuses
|
||||
// Many fields are indexes that select from a group of status conditions. These fields are named
|
||||
// by the FIRST status in the list (when the index is 1, since 0 usually means no status). For other
|
||||
// statuses in the group, see the subsequent enum values in enum status_id after the first status.
|
||||
struct statuses {
|
||||
bool roost;
|
||||
// 0x1: The typing in entity::types before the flying type is removed for statuses::roost
|
||||
// and restored to entity::types after statuses::roost ends.
|
||||
enum type_id original_types[2];
|
||||
// 0x3: The move id to be used if statuses::bide is 1.
|
||||
u8 bide_move_id;
|
||||
undefined field_0x4;
|
||||
undefined field_0x5;
|
||||
undefined field_0x6;
|
||||
// 0x7: Unique number given to the monster when spawning to differentiate it from other
|
||||
// monsters and to properly keep track of a monster. Likely used because a monster could be
|
||||
// spawned into the same slot as an old monster and using a pointer alone could cause some
|
||||
// issues. Used for Leech Seed, Destiny Bond, Storm Drain, Lightning Rod (probably more).
|
||||
u32 unique_id;
|
||||
// 0xB: Unique number between the wrapped and wrapping target to connect them.
|
||||
u32 wrap_pair_unique_id;
|
||||
// 0xF: Tracks the damage taken to deal when bide status ends. Max 0x3E7 (999).
|
||||
u32 bide_damage_tally;
|
||||
enum monster_behavior monster_behavior : 8; // 0x13
|
||||
u8 sleep; // 0x14: STATUS_SLEEP if 1
|
||||
u8 sleep_turns; // 0x15: Turns left for the status in statuses::sleep
|
||||
u8 burn; // 0x16: STATUS_BURN if 1
|
||||
u8 burn_turns; // 0x17: Turns left for the status in statuses::burn
|
||||
// 0x18: Turns left until residual damage for the status in statuses::burn, if applicable
|
||||
u8 burn_damage_countdown;
|
||||
// 0x19: The number of times the statuses::burn_damage_countdown has reached 0. Only used
|
||||
// when badly poisoned. Determines how much damage the badly poisoned status condition
|
||||
// will deal. There is no noticable difference because the table this value is looked up
|
||||
// on is filled with 0x6
|
||||
u8 badly_poisoned_damage_count;
|
||||
undefined field_0x1a;
|
||||
u8 freeze; // 0x1B: STATUS_FROZEN if 1
|
||||
undefined field_0x1c;
|
||||
undefined field_0x1d;
|
||||
undefined field_0x1e;
|
||||
// 0x1F: Controls the animation that plays when taking damage from the constriction status.
|
||||
// For some reason this is initalized to 0x22 (34)? Which is the animation used by
|
||||
// the exclusive item Nether Veil.
|
||||
u32 constriction_animation;
|
||||
u8 freeze_turns; // 0x23: Turns left for the status in statuses::freeze
|
||||
// 0x24: Turns left until residual damage for the status in statuses::freeze, if applicable
|
||||
u8 freeze_damage_countdown;
|
||||
undefined field_0x25;
|
||||
undefined field_0x26;
|
||||
u8 cringe; // 0x27: STATUS_CRINGE if 1
|
||||
u8 cringe_turns; // 0x28: Turns left for the status in statuses::cringe
|
||||
u8 bide; // 0x29: STATUS_BIDE if 1
|
||||
u8 bide_turns; // 0x2A: Turns left for the status in statuses::bide
|
||||
u8 bide_move_slot; // 0x2B: Slot in the user's move list
|
||||
u8 reflect; // 0x2C: STATUS_REFLECT if 1
|
||||
u8 reflect_turns; // 0x2D: Turns left for the status in statuses::reflect
|
||||
// 0x2E: Turns left until residual healing for the status in statuses::reflect, if applicable
|
||||
u8 reflect_damage_countdown;
|
||||
u8 curse; // 0x2F: STATUS_CURSED if 1
|
||||
// 0x30: Set to monster::is_not_team_member of the attacker (the one causing the decoy status).
|
||||
u8 curse_applier_non_team_member_flag;
|
||||
// 0x31: Set to 1 on a Pokemon when inflicted with the Decoy status.
|
||||
undefined unk_decoy_tracker;
|
||||
u8 curse_turns; // 0x32: Turns left for the status in statuses::curse
|
||||
// 0x33: Turns left until residual damage for the status in statuses::curse, if applicable
|
||||
u8 curse_damage_countdown;
|
||||
undefined field_0x34;
|
||||
undefined field_0x35;
|
||||
undefined field_0x36;
|
||||
u8 leech_seed; // 0x37: STATUS_LEECH_SEED if 1
|
||||
undefined field_0x38;
|
||||
undefined field_0x39;
|
||||
undefined field_0x3a;
|
||||
// 0x3B: Used to track the statuses::statuses_unique_id of the relevant monster for
|
||||
// statuses like Leech Seed and Destiny Bond.
|
||||
u32 statuses_applier_id;
|
||||
// 0x3F: Index into entity_table_hdr::monster_slot_ptrs in the dungeon that the user
|
||||
// (drainer) is held.
|
||||
u8 leech_seed_source_monster_index;
|
||||
u8 leech_seed_turns; // 0x40: Turns left for the status in statuses::leech_seed
|
||||
// 0x41: Turns left until residual damage for the status in statuses::leech_seed, if applicable.
|
||||
// Behaves weirdly without an afflictor
|
||||
u8 leech_seed_damage_countdown;
|
||||
undefined field_0x42;
|
||||
u8 sure_shot; // 0x43: STATUS_SURE_SHOT if 1
|
||||
u8 sure_shot_turns; // 0x44: Turns left for the status in statuses::sure_shot
|
||||
u8 long_toss; // 0x45: STATUS_LONG_TOSS if 1
|
||||
u8 invisible; // 0x46: STATUS_INVISIBLE if 1
|
||||
u8 invisible_turns; // 0x47: Turns left for the status in statuses::invisible
|
||||
u8 blinded; // 0x48: STATUS_BLINKER if 1
|
||||
u8 blinded_turns; // 0x49: Turns left for the status in statuses::blinded
|
||||
u8 muzzled; // 0x4A: STATUS_MUZZLED if 1
|
||||
u8 muzzled_turns; // 0x4B: Turns left for the status in statuses::muzzled
|
||||
u8 miracle_eye; // 0x4C: STATUS_MIRACLE_EYE if 1
|
||||
u8 miracle_eye_turns; // 0x4D: Turns left for the status in statuses::miracle_eye
|
||||
u8 magnet_rise; // 0x4E: STATUS_MAGNET_RISE if 1
|
||||
u8 magnet_rise_turns; // 0x4F: Turns left for the status in statuses::magnet_rise
|
||||
bool power_ears; // 0x50: STATUS_POWER_EARS
|
||||
bool scanning; // 0x51: STATUS_SCANNING
|
||||
bool stair_spotter; // 0x52: STATUS_STAIR_SPOTTER
|
||||
// 0x53: Set when initally spawning a team member with the ability Pickup.
|
||||
bool pickup_flag;
|
||||
bool grudge; // 0x54: STATUS_GRUDGE
|
||||
bool exposed; // 0x55: STATUS_EXPOSED (Foresight/Odor Sleuth)
|
||||
bool type_changed; // 0x56: Flag for if the monster's type has been changed
|
||||
bool boss_flag; // 0x57: Seems to be true for boss monsters
|
||||
// 0x58: Appears to be a flag for when a monster increasces their speed. Maybe only used
|
||||
// by the RunLeaderTurn function to know if the leader has changed their speed stage partway
|
||||
// through the function?
|
||||
undefined unk_sped_up_tracker;
|
||||
// 0x59: Maybe related to being a team member and new recruit? Set to 1 in TryRecruit
|
||||
// and 0 in SpawnTeam. Also checked in EnemyEvolution to be 0 before evolving. Maybe to
|
||||
// prevent a recently recruited ally from evolving after and or to add a monster to the
|
||||
// assembly after the completion of a dungeon?
|
||||
undefined field_0x59;
|
||||
#ifndef JAPAN
|
||||
// 0x5A: Possibly a flag while in action. Could also be a flag to cause the burn from
|
||||
// lava, heal a burn from water, and decrease hunger in the walls.
|
||||
bool in_action;
|
||||
#endif
|
||||
// 0x5B: STATUS_TERRIFIED, interestingly, appears to use 0x1 for the Foe-Fear Orb but
|
||||
// 0x2 for the ability Stench. The distinction only seems to exist for the game to use
|
||||
// a special message for when terrified from stench ends.
|
||||
u8 terrified;
|
||||
u8 terrified_turns; // 0x5C: Turns left for the terrified status
|
||||
u8 perish_song_turns; // 0x5D: Turns left before Perish Song takes effect
|
||||
// 0x5E: Increases progressively while the No-Slip Cap is held. Capped at 0x13
|
||||
// Used to calculate the chance of an item becoming sticky, resets to 0 when that happens
|
||||
u8 no_slip_cap_counter;
|
||||
// 0x5F: Determines how much experience the monster will reward after being defeated
|
||||
// 0 = 0.5x, 1 = 1.0x, 2 = 1.5x
|
||||
u8 exp_yield;
|
||||
// 0x60: Appears to be set when the held item of the monster is going to be used?
|
||||
bool unk_item_use_action;
|
||||
// 0x61: Is initalized to 0x63 (99). Changing it from this value causes the monster to
|
||||
// begin rendering differently? For example, it causes entity::0xB3 to be 1 and forces
|
||||
// entity::0x28 to be 0.
|
||||
undefined field_0x61;
|
||||
// 0x62: Flag for two-turn moves that haven't concluded yet. This is also a graphical flag.
|
||||
// A value of 1 mean "high up" (Fly/Bounce). A value of 2 means some other condition like
|
||||
// Dig, Shadow Force, etc. Other values are treated as invalid. Also used for the move
|
||||
// Seismic Toss when throwing up the target.
|
||||
u8 two_turn_move_invincible;
|
||||
// 0x63: Related to handling AI when a decoy is present on the floor?
|
||||
// Seems to only be 0, 1, 2
|
||||
undefined decoy_ai_tracker;
|
||||
#ifndef JAPAN
|
||||
undefined field_0x64;
|
||||
undefined field_0x65;
|
||||
undefined field_0x66;
|
||||
#endif
|
||||
// 0x67: 1 means normal. 0 means half speed. 2, 3, and 4 mean 2x, 3x, and 4x speed.
|
||||
int speed_stage;
|
||||
// Each counter ticks down to 0 turn by turn. The current speed_stage is calculated as:
|
||||
// min(max({# nonzero speed_up_counters} - {# nonzero speed_down_counters}, 0), 4)
|
||||
u8 speed_up_counters[5]; // 0x6B
|
||||
u8 speed_down_counters[5]; // 0x70
|
||||
u8 stockpile_stage; // 0x75: Goes from 0-3. STATUS_STOCKPILING if nonzero
|
||||
};
|
||||
|
||||
// A bitfield where every bit controls one of the icons that can appear on top of a monster's sprite
|
||||
// to represent status effects. If multiple bits are set, the shown icon cycles through them.
|
||||
struct status_icon_flags {
|
||||
bool f_sleepless : 1; // Blue eye blinking yellow
|
||||
bool f_burn : 1; // Red flame
|
||||
bool f_poison : 1; // White skull
|
||||
bool f_toxic : 1; // Purple skull
|
||||
bool f_confused : 1; // Yellow birds
|
||||
bool f_cowering : 1; // 2 green lines in circle (same as whiffer)
|
||||
bool f_taunt : 1; // Fist icon
|
||||
bool f_encore : 1; // Blue exclamation mark (same as low HP)
|
||||
// Blue shield with white sparks. Also for counter, mini counter, mist,
|
||||
// metal burst, aqua ring, and lucky chant
|
||||
bool f_reflect : 1;
|
||||
bool f_safeguard : 1; // Pink shield. Also for mirror coat
|
||||
bool f_light_screen : 1; // Golden shield. Also for magic coat
|
||||
bool f_protect : 1; // Green shield. Also for mirror move and vital throw
|
||||
bool f_endure : 1; // Blue shield with red sparks
|
||||
bool f_low_hp : 1; // Blue exclamation mark (same as encore)
|
||||
bool f_curse : 1; // Red skull
|
||||
bool f_embargo : 1; // Yellow exclamation mark. Also for gastro acid and snatch
|
||||
bool f_sure_shot : 1; // Blue sword blinking yellow
|
||||
bool f_whiffer : 1; // 2 green lines in circle (same as cowering)
|
||||
bool f_set_damage : 1; // Blue sword blinking red
|
||||
bool f_focus_energy : 1; // Red sword blinking yellow
|
||||
bool f_blinded : 1; // Blue eye with an X
|
||||
bool f_cross_eyed : 1; // Blue question mark
|
||||
bool f_eyedrops : 1; // Blue eye blinking yellow with a circular wave
|
||||
bool f_muzzled : 1; // Blinking red cross
|
||||
bool f_grudge : 1; // Purple shield
|
||||
bool f_exposed : 1; // Blue eye blinking red with a circular wave
|
||||
bool f_sleep : 1; // Red Z's
|
||||
bool f_lowered_stat : 1; // Yellow arrow pointing down
|
||||
bool f_heal_block : 1; // Blinking green cross
|
||||
bool f_miracle_eye : 1; // Blinking orange cross
|
||||
bool f_red_exclamation_mark : 1; // Probably unused
|
||||
bool f_magnet_rise : 1; // Purple arrow pointing up
|
||||
|
||||
// The following 4 bytes appear to have a different meaning, maybe they are intended to
|
||||
// represent icons that are always displayed and do not cycle (inferred from the difference
|
||||
// between the ice block and the other icons). Except for the first bit, the others do not
|
||||
// seem to have an effect, but the code stores the full 4 bytes as a bitwise OR of some of the
|
||||
// flags (see UpdateStatusIconBitfield).
|
||||
bool f_freeze : 1; // Ice block
|
||||
u8 flags_unk2 : 7;
|
||||
undefined field_0x5;
|
||||
undefined field_0x6;
|
||||
undefined field_0x7;
|
||||
};
|
||||
|
||||
// Stores a parameter for an action taken by a monster
|
||||
struct action_parameter {
|
||||
// 0x0: Metadata for the action.
|
||||
// E.g., this is the monster index when taking an action on a monster, the move index when
|
||||
// using a move or a union item_index value when using an item.
|
||||
u8 action_use_idx;
|
||||
undefined field_0x1;
|
||||
struct position item_pos; // 0x2: Position of the item to use when using an item on the floor
|
||||
};
|
||||
|
||||
// Contains data used to describe an action taken by a monster.
|
||||
struct action_data {
|
||||
enum action action_id; // 0x0: Action ID
|
||||
enum direction_id direction : 8; // 0x2: Direction in which the action will be performed
|
||||
undefined field_0x3;
|
||||
struct action_parameter action_parameters[2]; // 0x4: Parameters for the action
|
||||
s16 field_0x10;
|
||||
s16 field_0x12;
|
||||
};
|
||||
|
||||
// Monster info
|
||||
struct monster {
|
||||
// 0x0: flags: 2-byte bitfield
|
||||
// If true, the AI will skip this monster's turn. There's also an unresearched
|
||||
// check related to constriction that reads this flag
|
||||
u16 flags_0x0;
|
||||
//bool f_ai_unk : 1;
|
||||
//bool f_ai_skip_turn : 1; // If true, the AI will skip this monster's turn and reset the flag.
|
||||
//u16 flags_unk2 : 3;
|
||||
//bool f_swapping_places : 1; // Swapping places with another monster
|
||||
//u16 flags_unk6 : 3;
|
||||
//bool f_walking : 1; // Walking (but not dashing)
|
||||
//u16 flags_unk10 : 5;
|
||||
//bool f_swapping_places_petrified_ally : 1; // Swapping places with a petrified ally
|
||||
|
||||
enum monster_id id : 16; // 0x2:
|
||||
enum monster_id apparent_id : 16; // 0x4: What's outwardly displayed if Transformed
|
||||
bool is_not_team_member; // 0x6: true for enemies and allied NPCs that aren't on the team
|
||||
bool is_team_leader; // 0x7
|
||||
// 0x8: An ally is an NPC that isn't a normal team member, e.g. for story boss battles
|
||||
bool is_ally;
|
||||
enum shopkeeper_mode shopkeeper : 8; // 0x9
|
||||
u8 level; // 0xA
|
||||
undefined field_0xb;
|
||||
s16 team_index; // 0xC: In order by team lineup
|
||||
s16 iq; // 0xE
|
||||
s16 hp; // 0x10: Current HP
|
||||
s16 max_hp_stat; // 0x12: Add to max_hp_boost for the actual max HP
|
||||
undefined field_0x14;
|
||||
undefined field_0x15;
|
||||
s16 max_hp_boost; // 0x16: From Life Seeds, Sitrus Berries, etc.
|
||||
undefined field_0x18;
|
||||
undefined field_0x19;
|
||||
u8 offensive_stats[2]; // 0x1A: {atk, sp_atk}
|
||||
u8 defensive_stats[2]; // 0x1C: {def, sp_def}
|
||||
u8 field_0x1e;
|
||||
u8 field_0x1f;
|
||||
s32 exp; // 0x20: Total Exp. Points
|
||||
struct monster_stat_modifiers stat_modifiers; // 0x24
|
||||
s16 hidden_power_base_power; // 0x44
|
||||
enum type_id hidden_power_type : 8; // 0x46
|
||||
undefined field_0x47;
|
||||
enum dungeon_id joined_at : 8; // 0x48: Also used as a unique identifier for special monsters
|
||||
u8 joined_at_floor; // 0x49: Floor number of recruitment. 0 for special recruits
|
||||
struct action_data action; // 0x4A: Determines the action the monster will take on this turn
|
||||
enum type_id types[2]; // 0x5E
|
||||
enum ability_id abilities[2]; // 0x60
|
||||
struct item held_item; // 0x62
|
||||
// 0x68: Previous held item. Used for whenever taking the X-Ray Specs or Y-Ray Specs on or off
|
||||
// in order to update the camera and minimap. Changed to held_item.id after checking.
|
||||
enum item_id previous_held_item_id;
|
||||
// Previous position data is used by the AI
|
||||
struct position prev_pos; // 0x6A: Position 1 turn ago
|
||||
struct position prev_pos2; // 0x6E: Position 2 turns ago
|
||||
struct position prev_pos3; // 0x72: Position 3 turns ago
|
||||
struct position prev_pos4; // 0x76: Position 4 turns ago
|
||||
undefined field_0x7a;
|
||||
undefined field_0x7b;
|
||||
enum ai_objective ai_objective : 8; // 0x7C
|
||||
bool ai_not_next_to_target; // 0x7D: This NPC monster is not next to its current target
|
||||
bool ai_targeting_enemy; // 0x7E: This NPC monster is targeting an enemy monster
|
||||
bool ai_turning_around; // 0x7F: This NPC monster has decided to turn around
|
||||
// 0x80: entity::spawn_genid of the entity currently being targeted
|
||||
u16 ai_target_spawn_genid;
|
||||
undefined field_0x82;
|
||||
undefined field_0x83;
|
||||
struct entity* ai_target; // 0x84: Current or most recent AI target
|
||||
undefined field_0x88;
|
||||
undefined field_0x89;
|
||||
undefined field_0x8a;
|
||||
undefined field_0x8b;
|
||||
struct position ai_target_pos; // 0x8C: Position of the entity currently being targeted
|
||||
// 0x90: Work array while updating skills in the menu. Same meaning as iq_skill_flags.
|
||||
u32 iq_skill_menu_flags[3];
|
||||
// 0x9C: First 9 bytes contain bitfield data; the rest is presumably padding.
|
||||
// Bitvector. See enum iq_skill_id for the meaning of each bit.
|
||||
u32 iq_skill_flags[3];
|
||||
enum tactic_id tactic : 8; // 0xA8
|
||||
|
||||
//struct statuses statuses; // 0xA9 / Need to be inline for alignment
|
||||
bool roost;
|
||||
// 0xAA / 0x1: The typing in entity::types before the flying type is removed for statuses::roost
|
||||
// and restored to entity::types after statuses::roost ends.
|
||||
enum type_id original_types[2];
|
||||
// 0xAC / 0x3: The move id to be used if statuses::bide is 1.
|
||||
u8 bide_move_id;
|
||||
undefined field_0xad;
|
||||
undefined field_0xae;
|
||||
undefined field_0xaf;
|
||||
// 0xB0 / 0x7: Unique number given to the monster when spawning to differentiate it from other
|
||||
// monsters and to properly keep track of a monster. Likely used because a monster could be
|
||||
// spawned into the same slot as an old monster and using a pointer alone could cause some
|
||||
// issues. Used for Leech Seed, Destiny Bond, Storm Drain, Lightning Rod (probably more).
|
||||
u32 unique_id;
|
||||
// 0xB4 / 0xB: Unique number between the wrapped and wrapping target to connect them.
|
||||
u32 wrap_pair_unique_id;
|
||||
// 0xB8 / 0xF: Tracks the damage taken to deal when bide status ends. Max 0x3E7 (999).
|
||||
u32 bide_damage_tally;
|
||||
enum monster_behavior monster_behavior : 8; // 0xBC / 0x13
|
||||
u8 sleep; // 0xBD / 0x14: STATUS_SLEEP if 1
|
||||
u8 sleep_turns; // 0xBE / 0x15: Turns left for the status in statuses::sleep
|
||||
u8 burn; // 0xBF / 0x16: STATUS_BURN if 1
|
||||
u8 burn_turns; // 0xC0 / 0x17: Turns left for the status in statuses::burn
|
||||
// 0xC1 / 0x18: Turns left until residual damage for the status in statuses::burn, if applicable
|
||||
u8 burn_damage_countdown;
|
||||
// 0xC2 / 0x19: The number of times the statuses::burn_damage_countdown has reached 0. Only used
|
||||
// when badly poisoned. Determines how much damage the badly poisoned status condition
|
||||
// will deal. There is no noticable difference because the table this value is looked up
|
||||
// on is filled with 0x6
|
||||
u8 badly_poisoned_damage_count;
|
||||
undefined field_0xc3;
|
||||
u8 freeze; // 0xc4 / 0x1B: STATUS_FROZEN if 1
|
||||
undefined field_0xc5;
|
||||
undefined field_0xc6;
|
||||
undefined field_0xc7;
|
||||
// 0xC8 / 0x1F: Controls the animation that plays when taking damage from the constriction status.
|
||||
// For some reason this is initalized to 0x22 (34)? Which is the animation used by
|
||||
// the exclusive item Nether Veil.
|
||||
u32 constriction_animation;
|
||||
u8 freeze_turns; // 0xCC / 0x23: Turns left for the status in statuses::freeze
|
||||
// 0xCD / 0x24: Turns left until residual damage for the status in statuses::freeze, if applicable
|
||||
u8 freeze_damage_countdown;
|
||||
undefined field_0xCE;
|
||||
undefined field_0xCF;
|
||||
u8 cringe; // 0xD0 / 0x27: STATUS_CRINGE if 1
|
||||
u8 cringe_turns; // 0xD1 / 0x28: Turns left for the status in statuses::cringe
|
||||
u8 bide; // 0xD2 / 0x29: STATUS_BIDE if 1
|
||||
u8 bide_turns; // 0xD3 / 0x2A: Turns left for the status in statuses::bide
|
||||
u8 bide_move_slot; // 0xD4 / 0x2B: Slot in the user's move list
|
||||
u8 reflect; // 0xD5 / 0x2C: STATUS_REFLECT if 1
|
||||
u8 reflect_turns; // 0xD6 / 0x2D: Turns left for the status in statuses::reflect
|
||||
// 0xD7 / 0x2E: Turns left until residual healing for the status in statuses::reflect, if applicable
|
||||
u8 reflect_damage_countdown;
|
||||
u8 curse; // 0xD8 / 0x2F: STATUS_CURSED if 1
|
||||
// 0xD9 / 0x30: Set to monster::is_not_team_member of the attacker (the one causing the decoy status).
|
||||
u8 curse_applier_non_team_member_flag;
|
||||
// 0xDA / 0x31: Set to 1 on a Pokemon when inflicted with the Decoy status.
|
||||
undefined unk_decoy_tracker;
|
||||
u8 curse_turns; // 0xDB / 0x32: Turns left for the status in statuses::curse
|
||||
// 0xDC / 0x33: Turns left until residual damage for the status in statuses::curse, if applicable
|
||||
u8 curse_damage_countdown;
|
||||
undefined field_0xdd;
|
||||
undefined field_0xde;
|
||||
undefined field_0xdf;
|
||||
u8 leech_seed; // 0xE0 / 0x37: STATUS_LEECH_SEED if 1
|
||||
undefined field_0xe1;
|
||||
undefined field_0xe2;
|
||||
undefined field_0xe3;
|
||||
// 0xE4 / 0x3B: Used to track the statuses::statuses_unique_id of the relevant monster for
|
||||
// statuses like Leech Seed and Destiny Bond.
|
||||
u32 statuses_applier_id;
|
||||
// 0xE8 / 0x3F: Index into entity_table_hdr::monster_slot_ptrs in the dungeon that the user
|
||||
// (drainer) is held.
|
||||
u8 leech_seed_source_monster_index;
|
||||
u8 leech_seed_turns; // 0xE9 / 0x40: Turns left for the status in statuses::leech_seed
|
||||
// 0xEA / 0x41: Turns left until residual damage for the status in statuses::leech_seed, if applicable.
|
||||
// Behaves weirdly without an afflictor
|
||||
u8 leech_seed_damage_countdown;
|
||||
undefined field_0xEB;
|
||||
u8 sure_shot; // 0xEC / 0x43: STATUS_SURE_SHOT if 1
|
||||
u8 sure_shot_turns; // 0xED / 0x44: Turns left for the status in statuses::sure_shot
|
||||
u8 long_toss; // 0xEE / 0x45: STATUS_LONG_TOSS if 1
|
||||
u8 invisible; // 0xEF / 0x46: STATUS_INVISIBLE if 1
|
||||
u8 invisible_turns; // 0xF0 / 0x47: Turns left for the status in statuses::invisible
|
||||
u8 blinded; // 0xF1 / 0x48: STATUS_BLINKER if 1
|
||||
u8 blinded_turns; // 0xF2 / 0x49: Turns left for the status in statuses::blinded
|
||||
u8 muzzled; // 0xF3 / 0x4A: STATUS_MUZZLED if 1
|
||||
u8 muzzled_turns; // 0xF4 / 0x4B: Turns left for the status in statuses::muzzled
|
||||
u8 miracle_eye; // 0xF5 / 0x4C: STATUS_MIRACLE_EYE if 1
|
||||
u8 miracle_eye_turns; // 0xF6 / 0x4D: Turns left for the status in statuses::miracle_eye
|
||||
u8 magnet_rise; // 0xF7 / 0x4E: STATUS_MAGNET_RISE if 1
|
||||
u8 magnet_rise_turns; // 0xF8 / 0x4F: Turns left for the status in statuses::magnet_rise
|
||||
bool power_ears; // 0xF9 / 0x50: STATUS_POWER_EARS
|
||||
bool scanning; // 0xFA / 0x51: STATUS_SCANNING
|
||||
bool stair_spotter; // 0xFB / 0x52: STATUS_STAIR_SPOTTER
|
||||
// 0xFC / 0x53: Set when initally spawning a team member with the ability Pickup.
|
||||
bool pickup_flag;
|
||||
bool grudge; // 0xFD / 0x54: STATUS_GRUDGE
|
||||
bool exposed; // 0xFE / 0x55: STATUS_EXPOSED (Foresight/Odor Sleuth)
|
||||
bool type_changed; // 0xFF / 0x56: Flag for if the monster's type has been changed
|
||||
bool boss_flag; // 0x100 / 0x57: Seems to be true for boss monsters
|
||||
// 0x101 / 0x58: Appears to be a flag for when a monster increasces their speed. Maybe only used
|
||||
// by the RunLeaderTurn function to know if the leader has changed their speed stage partway
|
||||
// through the function?
|
||||
undefined unk_sped_up_tracker;
|
||||
// 0x102 / 0x59: Maybe related to being a team member and new recruit? Set to 1 in TryRecruit
|
||||
// and 0 in SpawnTeam. Also checked in EnemyEvolution to be 0 before evolving. Maybe to
|
||||
// prevent a recently recruited ally from evolving after and or to add a monster to the
|
||||
// assembly after the completion of a dungeon?
|
||||
undefined field_0x102;
|
||||
#ifndef JAPAN
|
||||
// 0x103 / 0x5A: Possibly a flag while in action. Could also be a flag to cause the burn from
|
||||
// lava, heal a burn from water, and decrease hunger in the walls.
|
||||
bool in_action;
|
||||
#endif
|
||||
// 0x104 / 0x5B: STATUS_TERRIFIED, interestingly, appears to use 0x1 for the Foe-Fear Orb but
|
||||
// 0x2 for the ability Stench. The distinction only seems to exist for the game to use
|
||||
// a special message for when terrified from stench ends.
|
||||
u8 terrified;
|
||||
u8 terrified_turns; // 0x105 / 0x5C: Turns left for the terrified status
|
||||
u8 perish_song_turns; // 0x106 / 0x5D: Turns left before Perish Song takes effect
|
||||
// 0x107 / 0x5E: Increases progressively while the No-Slip Cap is held. Capped at 0x13
|
||||
// Used to calculate the chance of an item becoming sticky, resets to 0 when that happens
|
||||
u8 no_slip_cap_counter;
|
||||
// 0x108 / 0x5F: Determines how much experience the monster will reward after being defeated
|
||||
// 0 = 0.5x, 1 = 1.0x, 2 = 1.5x
|
||||
u8 exp_yield;
|
||||
// 0x109 / 0x60: Appears to be set when the held item of the monster is going to be used?
|
||||
bool unk_item_use_action;
|
||||
// 0x10A / 0x61: Is initalized to 0x63 (99). Changing it from this value causes the monster to
|
||||
// begin rendering differently? For example, it causes entity::0xB3 to be 1 and forces
|
||||
// entity::0x28 to be 0.
|
||||
undefined field_0x10a;
|
||||
// 0x10B / 0x62: Flag for two-turn moves that haven't concluded yet. This is also a graphical flag.
|
||||
// A value of 1 mean "high up" (Fly/Bounce). A value of 2 means some other condition like
|
||||
// Dig, Shadow Force, etc. Other values are treated as invalid. Also used for the move
|
||||
// Seismic Toss when throwing up the target.
|
||||
u8 two_turn_move_invincible;
|
||||
// 0x10C / 0x63: Related to handling AI when a decoy is present on the floor?
|
||||
// Seems to only be 0, 1, 2
|
||||
undefined decoy_ai_tracker;
|
||||
#ifndef JAPAN
|
||||
undefined field_0x10d;
|
||||
undefined field_0x10e;
|
||||
undefined field_0x10f;
|
||||
#endif
|
||||
// 0x110 / 0x67: 1 means normal. 0 means half speed. 2, 3, and 4 mean 2x, 3x, and 4x speed.
|
||||
int speed_stage;
|
||||
// Each counter ticks down to 0 turn by turn. The current speed_stage is calculated as:
|
||||
// min(max({# nonzero speed_up_counters} - {# nonzero speed_down_counters}, 0), 4)
|
||||
u8 speed_up_counters[5]; // 0x114 / 0x6B
|
||||
u8 speed_down_counters[5]; // 0x119 / 0x70
|
||||
u8 stockpile_stage; // 0x11E / 0x75: Goes from 0-3. STATUS_STOCKPILING if nonzero
|
||||
|
||||
|
||||
undefined field_0x11f;
|
||||
// 0x120: If zero, when the monster is standing in a room, the AI will make it head towards a
|
||||
// random exit. If nonzero, the monster will instead move in a random direction every turn.
|
||||
int random_movement;
|
||||
struct move moves[4]; // 0x124
|
||||
u8 move_flags; // 0x144: 1-byte bitfield
|
||||
undefined field_0x145;
|
||||
struct fixed_point belly; // 0x146
|
||||
struct fixed_point max_belly; // 0x14A:
|
||||
// 0x14E: If true and the monster is an ally, the AI will skip it. False for enemies.
|
||||
bool ai_ally_skip;
|
||||
bool ai_next_to_target; // 0x14F: This NPC monster is next to its current target
|
||||
// 0x150: Set if monster::is_team_leader is true and belly is empty.
|
||||
bool famished;
|
||||
undefined field_0x151;
|
||||
// 0x152: Seems to be true if the monster has already acted this turn: attacked, used an item,
|
||||
// or seemingly anything other than moving/resting. Also true when the monster faints.
|
||||
bool already_acted;
|
||||
// 0x153: True if this enemy should evolve. It is not enough to set this flag to evolve
|
||||
// an enemy monster. You also need to set dungeon::should_enemy_evolve.
|
||||
bool should_evolve;
|
||||
// 0x154: True if using a charged move. Changed together with statuses::bide.
|
||||
bool using_charged_move;
|
||||
// 0x155: True if the target attacked a Pokemon that has STATUS_GRUDGE.
|
||||
bool hit_grudge_monster;
|
||||
undefined field_0x156; // 0 when the monster faints
|
||||
undefined field_0x157;
|
||||
// 0x158: General-purpose bitflags tracking different bits of volatile state.
|
||||
// Together with prev_state_bitflags, this is typically used to determine whether
|
||||
// to log a message on a state change.
|
||||
u16 state_flags;
|
||||
// 0x15A: The previous value of state_bitflags before the last update
|
||||
u16 prev_state_flags;
|
||||
// 0x15C: Appears to control if flash fire should activate.
|
||||
bool apply_flash_fire_boost;
|
||||
// 0x15D: Appears to be a counter for how many times rollout has hit. Likely to be able to
|
||||
// determine how much extra damage consecutive rollout hits should deal.
|
||||
u8 rollout_hit_counter;
|
||||
// 0x15E: If true, the monster is warped after completing its move.
|
||||
bool memento_warp_flag;
|
||||
// 0x15F: If true, the monster's special attack is dropped after the completing its move.
|
||||
bool overheat_special_attack_drop_flag;
|
||||
// 0x160: If true, the monster's shadow is drawn. This value is initalized to 1 for every
|
||||
// monster except Diglett and Dugtrio.
|
||||
bool display_shadow;
|
||||
// 0x161: If true, prevents giving items to this monster. Might have a broader meaning,
|
||||
// such as whether the monster is a guest pokémon.
|
||||
bool cannot_give_items;
|
||||
// 0x162: Related to using a move and either missing or fainting. Set to 1 right before
|
||||
// the function for a move is called and set to 0 (sometimes) in ApplyDamage. Gets set
|
||||
// when the monster faints sometimes with field 0x156. When false, causes random
|
||||
// outcomes with the monster to fail.
|
||||
bool field_0x162;
|
||||
// 0x163: Related to controlling the number of attacks per move use. Possibly to account
|
||||
// for two-turn moves?
|
||||
bool field_0x163;
|
||||
bool took_damage_flag; // 0x164: Set after the monster took damage.
|
||||
// 0x165: Appears to be some sort of validity check? Where 0 is valid and 1 is invalid.
|
||||
// HandleFaint sets this number to 1. Also set to 1 if IsMonsterIdInNormalRange is false.
|
||||
bool field_0x165;
|
||||
// 0x166: Set after the monster attacks (true if the attack missed, false otherwise). If true
|
||||
// when the monster attacks, Practice Swinger will activate.
|
||||
bool practice_swinger_flag;
|
||||
// 0x167: Set to true when the monster receives a critical hit. If true when the monster
|
||||
// attacks, Anger Point will activate. Set to false after the monster attacks.
|
||||
bool anger_point_flag;
|
||||
undefined field_0x168;
|
||||
undefined field_0x169;
|
||||
// 0x16A: When not DIR_NONE, monster will turn in the specified direction and
|
||||
// its AI will be forced to target the tile next to it in that direction.
|
||||
// Used to prevent bosses from turning towards team members the moment the boss fight
|
||||
// starts (which would override their intended starting facing direction).
|
||||
enum direction_id force_turn : 8;
|
||||
undefined field_0x16b;
|
||||
undefined field_0x16c;
|
||||
undefined field_0x16d;
|
||||
undefined field_0x16e;
|
||||
undefined field_0x16f;
|
||||
// 0x170: Set to make the monster disappear when using the move U-turn.
|
||||
bool uturn_hide_monster_flag;
|
||||
// 0x171: Some kind of visual flag? Gets set to 0 temporarily when changing Shaymin form
|
||||
// or when using the Gone Pebble? Also hardcoded to be set to 0 for monsters that generally
|
||||
// tend to float? Otherwise 1?
|
||||
bool field_0x171;
|
||||
// 0x172: Set when the leader and falling through a pitfall trap.
|
||||
bool pitfall_trap_flag_0x172;
|
||||
// 0x173: Some kind of visual flag?
|
||||
bool field_0x173;
|
||||
// 0x174: Set when the leader and falling through a pitfall trap.
|
||||
bool pitfall_trap_flag_0x174;
|
||||
undefined field_0x175;
|
||||
undefined field_0x176;
|
||||
// 0x177: Appears to be the direction for using sleep talk? Set to DIR_NONE when awake.
|
||||
enum direction_id sleep_talk_direction : 8;
|
||||
// 0x178: Appears to be the direction for using snore? Set to DIR_NONE when awake.
|
||||
enum direction_id snore_direction : 8;
|
||||
// 0x179: Seems to be set to 4 when the monster initally throws something and probably
|
||||
// related to direction somehow. Checked in a loop for every monster.
|
||||
u8 field_0x179;
|
||||
// 0x17A: Somehow related to sprite size?
|
||||
undefined field_0x17a;
|
||||
// 0x17B: Somehow related to sprite size?
|
||||
undefined field_0x17b;
|
||||
undefined field_0x17c;
|
||||
undefined field_0x17d;
|
||||
struct position target_pos; // 0x17E: The AI's target's position on screen
|
||||
struct position pixel_pos; // 0x182: The monster's graphical position on screen?
|
||||
undefined field_0x186;
|
||||
undefined field_0x187;
|
||||
undefined field_0x188;
|
||||
undefined field_0x189;
|
||||
undefined field_0x18a;
|
||||
undefined field_0x18b;
|
||||
// 0x18C: Bitflags that cause non-damaging exclusive items to trigger on the
|
||||
// attacker after they have completed their move. For example, the Eclipse Robe
|
||||
// (Darkrai exclusive item) may afflict attacking enemies with the nightmare
|
||||
// status condition. (Only uses first 21 bits).
|
||||
u32 exclusive_item_trigger_bitflags;
|
||||
// 0x190: Appears to be related to the item name of the exclusive item that
|
||||
// caused the effect to trigger.
|
||||
s16 field_0x190;
|
||||
// 0x192: Bitflags that cause non-damaging abilities to trigger on the attacker
|
||||
// after they have completed their move. Abilites like magnet pull, cute charm,
|
||||
// static, and flame body. (Only uses first 11 bits). One exception is the move
|
||||
// Rapid Spin which sets one of the flags for the user.
|
||||
u16 contact_ability_trigger_bitflags;
|
||||
undefined field_0x194;
|
||||
undefined field_0x195;
|
||||
undefined field_0x196;
|
||||
undefined field_0x197;
|
||||
undefined field_0x198;
|
||||
undefined field_0x199;
|
||||
undefined field_0x19a;
|
||||
undefined field_0x19b;
|
||||
struct position pos; // 0x19C: Mirror of the position on the entity struct
|
||||
undefined field_0x1a0;
|
||||
undefined field_0x1a1;
|
||||
undefined field_0x1a2;
|
||||
undefined field_0x1a3;
|
||||
undefined field_0x1a4;
|
||||
undefined field_0x1a5;
|
||||
undefined field_0x1a6;
|
||||
undefined field_0x1a7;
|
||||
undefined field_0x1a8;
|
||||
undefined field_0x1a9;
|
||||
undefined field_0x1aa;
|
||||
undefined field_0x1ab;
|
||||
undefined field_0x1ac;
|
||||
undefined field_0x1ad;
|
||||
undefined field_0x1ae;
|
||||
undefined field_0x1af;
|
||||
undefined field_0x1b0;
|
||||
undefined field_0x1b1;
|
||||
undefined field_0x1b2;
|
||||
undefined field_0x1b3;
|
||||
u16 walk_anim_frames_left; // 0x1B4: Number of frames left in walking animation?
|
||||
undefined field_0x1b6;
|
||||
undefined field_0x1b7;
|
||||
undefined field_0x1b8;
|
||||
undefined field_0x1b9;
|
||||
undefined field_0x1ba;
|
||||
undefined field_0x1bb;
|
||||
undefined field_0x1bc;
|
||||
undefined field_0x1bd;
|
||||
undefined field_0x1be;
|
||||
undefined field_0x1bf;
|
||||
undefined field_0x1c0;
|
||||
undefined field_0x1c1;
|
||||
undefined field_0x1c2;
|
||||
undefined field_0x1c3;
|
||||
undefined field_0x1c4;
|
||||
undefined field_0x1c5;
|
||||
undefined field_0x1c6;
|
||||
undefined field_0x1c7;
|
||||
undefined field_0x1c8;
|
||||
undefined field_0x1c9;
|
||||
undefined field_0x1ca;
|
||||
undefined field_0x1cb;
|
||||
undefined field_0x1cc;
|
||||
undefined field_0x1cd;
|
||||
undefined field_0x1ce;
|
||||
undefined field_0x1cf;
|
||||
undefined field_0x1d0;
|
||||
undefined field_0x1d1;
|
||||
undefined field_0x1d2;
|
||||
undefined field_0x1d3;
|
||||
undefined field_0x1d4;
|
||||
undefined field_0x1d5;
|
||||
undefined field_0x1d6;
|
||||
undefined field_0x1d7;
|
||||
undefined field_0x1d8;
|
||||
undefined field_0x1d9;
|
||||
undefined field_0x1da;
|
||||
undefined field_0x1db;
|
||||
undefined field_0x1dc;
|
||||
undefined field_0x1dd;
|
||||
undefined field_0x1de;
|
||||
undefined field_0x1df;
|
||||
undefined field_0x1e0;
|
||||
undefined field_0x1e1;
|
||||
undefined field_0x1e2;
|
||||
undefined field_0x1e3;
|
||||
undefined field_0x1e4;
|
||||
undefined field_0x1e5;
|
||||
undefined field_0x1e6;
|
||||
undefined field_0x1e7;
|
||||
undefined field_0x1e8;
|
||||
undefined field_0x1e9;
|
||||
undefined field_0x1ea;
|
||||
undefined field_0x1eb;
|
||||
undefined field_0x1ec;
|
||||
undefined field_0x1ed;
|
||||
undefined field_0x1ee;
|
||||
undefined field_0x1ef;
|
||||
undefined field_0x1f0;
|
||||
undefined field_0x1f1;
|
||||
undefined field_0x1f2;
|
||||
undefined field_0x1f3;
|
||||
undefined field_0x1f4;
|
||||
undefined field_0x1f5;
|
||||
undefined field_0x1f6;
|
||||
undefined field_0x1f7;
|
||||
undefined field_0x1f8;
|
||||
undefined field_0x1f9;
|
||||
undefined field_0x1fa;
|
||||
undefined field_0x1fb;
|
||||
undefined field_0x1fc;
|
||||
undefined field_0x1fd;
|
||||
undefined field_0x1fe;
|
||||
undefined field_0x1ff;
|
||||
undefined field_0x200;
|
||||
undefined field_0x201;
|
||||
undefined field_0x202;
|
||||
undefined field_0x203;
|
||||
undefined field_0x204;
|
||||
undefined field_0x205;
|
||||
undefined field_0x206;
|
||||
undefined field_0x207;
|
||||
undefined field_0x208;
|
||||
undefined field_0x209;
|
||||
undefined field_0x20a;
|
||||
undefined field_0x20b;
|
||||
undefined field_0x20c;
|
||||
undefined field_0x20d;
|
||||
undefined field_0x20e;
|
||||
undefined field_0x20f;
|
||||
u8 hp_fractional; // 0x210: 200 * fractional_part(HP)
|
||||
undefined field_0x211;
|
||||
undefined field_0x212;
|
||||
undefined field_0x213;
|
||||
// 0x214: Somehow related to gaining exp through a joy ribbon. Set to 0 after
|
||||
// gaining or losing a level. Also checked and set to 0 when an enemy evolves.
|
||||
// Maybe for a specific scenario of leveling up with exp from a joy ribbon?
|
||||
u32 unk_exp_tracker;
|
||||
// 0x218: Status icons displayed on top of the monster's sprite
|
||||
struct status_icon_flags status_icons;
|
||||
// 0x220: Seems to be related in some way to shadow size and being a water tileset. So
|
||||
// probably controls when the ripple effect when standing on water.
|
||||
u8 water_shadow_ripple_tracker;
|
||||
// 0x221: Set if the current move being used was copied by Me First
|
||||
bool me_first_flag;
|
||||
undefined field_0x222;
|
||||
undefined field_0x223;
|
||||
// Stat boosts from exclusive items with EXCLUSIVE_EFF_STAT_BOOST
|
||||
u8 exclusive_item_offense_boosts[2]; // 0x224: {atk, sp_atk}
|
||||
u8 exclusive_item_defense_boosts[2]; // 0x226: {def, sp_def}
|
||||
// 0x228: Bitvector. See enum exclusive_item_effect_id for the meaning of each bit
|
||||
u32 exclusive_item_effect_flags[5];
|
||||
// 0x23C: Initialized to 0. Probably menu related only, seems to be set to true through the
|
||||
// menu.
|
||||
bool field_0x23c;
|
||||
// 0x23F: When reviving a monster, temporarily set to true. Probably a visual indicator
|
||||
// of some kind?
|
||||
bool unk_revive_visual_tracker;
|
||||
// 0x23E: Gets set to 0 before using an attack and gets set to 1 in LevelUp. Seems to stop
|
||||
// the rest of the attacks (ie from Swift Swim) from continuing. Possibly to avoid the
|
||||
// the monster leveling up and trying to use a move that was just overwritten by a new move?
|
||||
undefined field_0x23e;
|
||||
// 0x23F: Gets set to 1 when the move used won't use up any PP. Used to check if the
|
||||
// monster should lose extra PP from the ability Pressure.
|
||||
bool should_not_lose_pp;
|
||||
};
|
||||
|
||||
|
||||
// Entity type. This is used to tag generic entity pointers.
|
||||
enum entity_type {
|
||||
ENTITY_NOTHING = 0,
|
||||
|
|
@ -40,6 +832,7 @@ enum entity_type {
|
|||
// Used when a temporary instance of this struct is created to pass it to some
|
||||
// function that requires it as a parameter
|
||||
ENTITY_TEMPORARY = 6,
|
||||
ENTITY_PAD = 0xffffffff, // To Force on 32 bits
|
||||
};
|
||||
|
||||
// Generic entity data
|
||||
|
|
@ -82,25 +875,62 @@ struct entity {
|
|||
void* info; // 0xB4: Points to info struct for monster/item/trap
|
||||
};
|
||||
|
||||
// Info struct for leader
|
||||
struct leader_info {
|
||||
u8 PAD[322];
|
||||
#ifndef JAPAN
|
||||
u8 PAD2[4];
|
||||
#endif
|
||||
struct fixed_point belly; // 0x146
|
||||
struct fixed_point max_belly; // 0x14a
|
||||
// Possibly more stuff
|
||||
// Used in menus and the post-dungeon summary.
|
||||
struct monster_summary {
|
||||
enum monster_id id; // 0x0
|
||||
u8 monster_name[10]; // 0x2
|
||||
undefined field_0xC;
|
||||
undefined field_0xD;
|
||||
undefined field_0xE;
|
||||
undefined field_0xF;
|
||||
undefined field_0x10;
|
||||
undefined field_0x11;
|
||||
undefined field_0x12;
|
||||
undefined field_0x13;
|
||||
undefined field_0x14;
|
||||
undefined field_0x15;
|
||||
enum type_id types[2]; // 0x16
|
||||
enum ability_id abilities[2]; // 0x18
|
||||
enum dungeon_id joined_at; // 0x1A
|
||||
u8 joined_at_floor; // 0x1B
|
||||
struct item held_item; // 0x1C
|
||||
undefined field_0x22;
|
||||
undefined field_0x23;
|
||||
s32 hp; // 0x24: Current HP
|
||||
s32 max_hp; // 0x28: Actual max HP (hp + hp boost)
|
||||
u32 level; // 0x2C
|
||||
s32 exp; // 0x30
|
||||
u8 offensive_stats[2]; // 0x34: {atk, sp_atk}
|
||||
u8 defensive_stats[2]; // 0x36: {def, sp_def}
|
||||
bool is_team_leader; // 0x38
|
||||
u8 attack_boost; // 0x39: from things like Power Band, Munch Belt
|
||||
u8 special_attack_boost; // 0x3A
|
||||
u8 defense_boost; // 0x3B
|
||||
u8 special_defense_boost; // 0x3C
|
||||
undefined field_0x3D;
|
||||
s16 iq; // 0x3E
|
||||
undefined field_0x40;
|
||||
undefined field_0x41;
|
||||
// 0x42: Level upon first evolution. Set to 0 in dungeon mode.
|
||||
u8 level_at_first_evo;
|
||||
// 0x43: Level upon first evolution. Set to 0 in dungeon mode.
|
||||
u8 level_at_second_evo;
|
||||
// 0x44: Evolution status. In ground_mode, accounts for luminous spring being unlocked.
|
||||
u8 evo_status;
|
||||
bool inflicted_with_gastro_acid; // 0x45
|
||||
undefined field_0x46;
|
||||
undefined field_0x47;
|
||||
u32 iq_skill_flags[3]; // 0x48
|
||||
enum tactic_id tactic; // 0x54
|
||||
undefined field_0x55;
|
||||
undefined field_0x56;
|
||||
undefined field_0x57;
|
||||
// 0x58: Appears to be a list of all the currently inflicted statues in their enum form. The
|
||||
// last entry (30th) appears to always be STATUS_NONE to serve as a terminator for the list.
|
||||
// While in ground mode, it's always filled with STATUS_NONE.
|
||||
enum status_id active_statuses[30];
|
||||
undefined2 _padding_0x76;
|
||||
};
|
||||
|
||||
// Info struct for party members
|
||||
struct party_member_info {
|
||||
u8 PAD[16];
|
||||
s16 hp_left; // 0x10
|
||||
s16 hp_max_1; // 0x12
|
||||
s16 field_0x14;
|
||||
s16 hp_max_2; // 0x16
|
||||
// Possibly more stuff
|
||||
};
|
||||
|
||||
#endif //PMDSKY_DUNGEON_MODE_H
|
||||
|
|
|
|||
39
include/dungeon_mode_common.h
Normal file
39
include/dungeon_mode_common.h
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
#ifndef HEADERS_TYPES_DUNGEON_MODE_COMMON_H_
|
||||
#define HEADERS_TYPES_DUNGEON_MODE_COMMON_H_
|
||||
|
||||
#include "enums.h"
|
||||
|
||||
// Monster move info
|
||||
struct move {
|
||||
// 0x0: flags0: 1-byte bitfield
|
||||
u8 flags0;
|
||||
/* bool f_exists : 1; // This move will show up in the move list */
|
||||
/* bool f_subsequent_in_link_chain : 1; // This move is in a link chain, but not the first move */
|
||||
/* bool f_enabled_for_ai : 1; // AI can use this move */
|
||||
/* bool f_set : 1; // Usable by L+A */
|
||||
/* bool f_last_used : 1; // This move was the last one used (for things like Torment?) */
|
||||
/* bool f_disabled : 1; // For Torment (and maybe others) */
|
||||
/* u8 flags0_unk6 : 2; */
|
||||
|
||||
u8 field_0x1;
|
||||
|
||||
// 0x2: flags2: 2-byte bitfield
|
||||
u16 flags2;
|
||||
/* bool f_sealed : 1; // Sealed by a Seal Trap. Also prevents AI from using this move */
|
||||
/* u16 flags2_unk1 : 2; */
|
||||
/* bool f_consume_pp : 1; // This move will consume PP this turn */
|
||||
/* bool f_consume_2_pp : 1; // Consume 2 PP this turn. No effect unless f_consume_pp is set */
|
||||
/* u16 flags2_unk5 : 1; */
|
||||
/* // Consume 4 PP this turn. No effect unless f_consume_pp is set, overrides f_consume_2_pp */
|
||||
/* bool f_consume_4_pp : 1; */
|
||||
/* u16 flags2_unk7 : 1; */
|
||||
/* u16 flags2_unk8 : 1; */
|
||||
/* bool f_exclusive_item_pp_boost : 1; // A PP-boosting exclusive item is in effect */
|
||||
/* u16 flags3_unk10 : 6; */
|
||||
|
||||
enum move_id id : 16; // 0x4
|
||||
u8 pp; // 0x6: Current PP
|
||||
u8 ginseng; // 0x7: Ginseng boost
|
||||
};
|
||||
|
||||
#endif
|
||||
3464
include/enums.h
Normal file
3464
include/enums.h
Normal file
File diff suppressed because it is too large
Load Diff
|
|
@ -5,6 +5,7 @@
|
|||
#include "util.h"
|
||||
#include "preprocessString.h"
|
||||
#include "dungeon_mode.h"
|
||||
#include "dungeon.h"
|
||||
|
||||
struct Window {
|
||||
u8 PAD[6];
|
||||
|
|
@ -43,20 +44,47 @@ struct struct_2 {
|
|||
};
|
||||
|
||||
struct struct_3 {
|
||||
u32 field_0x0;
|
||||
u32 field_0x4;
|
||||
u32* a; // 0x8
|
||||
s8 e[4]; // 0x0
|
||||
u32 f; // 0x4
|
||||
struct entity* a; // 0x8
|
||||
u32 b; // 0xC
|
||||
u32 c; // 0x10
|
||||
u32 d; // 0x14
|
||||
};
|
||||
|
||||
struct struct_5 {
|
||||
u32 field_0x0;
|
||||
u32 field_0x4;
|
||||
u8 PAD1[172];
|
||||
struct struct_6* a; // 0xB4
|
||||
};
|
||||
|
||||
struct struct_6 {
|
||||
u8 PAD[74];
|
||||
u16 a; // 0x4A
|
||||
u16 field_0x4c;
|
||||
u8 b; // 0x4E
|
||||
u8 field_0x4f;
|
||||
u16 c; // 0x50
|
||||
u16 d; // 0x52
|
||||
u8 e; // 0x54
|
||||
u8 field_0x55;
|
||||
u16 f; // 0x56
|
||||
u16 g; // 0x58
|
||||
};
|
||||
|
||||
struct struct_4 {
|
||||
u8* str;
|
||||
struct struct_3* st3;
|
||||
};
|
||||
|
||||
#define OV31_02382B54_CONST_1 (0x00000233)
|
||||
|
||||
u32 ov31_02382B54(void);
|
||||
void ov31_02382DAC(void);
|
||||
struct struct_1* ov31_02382E08(void);
|
||||
void ov31_02382E18(u32* arg_1, u32 arg_2);
|
||||
void ov31_02382ED4(u32* arg_1);
|
||||
void ov31_02382E18(struct entity* arg_1, u32 arg_2);
|
||||
void ov31_02382ED4(struct entity* arg_1);
|
||||
void ov31_02382F68(struct Window* window);
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,13 @@
|
|||
#ifndef PMDSKY_UTIL_H
|
||||
#define PMDSKY_UTIL_H
|
||||
|
||||
typedef s32 fx32_8; // 32-bit signed fixed-point number with 8 fraction bits
|
||||
typedef u32 ufx32_8; // 32-bit unsigned fixed-point number with 8 fraction bits
|
||||
typedef u8 undefined;
|
||||
typedef u16 undefined2;
|
||||
typedef u32 undefined4;
|
||||
typedef u8 bool;
|
||||
|
||||
// RGBA8 structure. Sometimes alpha is ignored and only used for padding
|
||||
struct rgba {
|
||||
u8 r;
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ extern struct struct_1 DUNGEON_WINDOW_PARAMS_3;
|
|||
extern u32 DUNGEON_WINDOW_PARAMS_4;
|
||||
extern u32 DUNGEON_MAIN_MENU_ITEMS;
|
||||
|
||||
extern struct {u8* str; struct struct_3* st3;} ov31_0238A2A0;
|
||||
extern struct struct_4 ov31_0238A2A0;
|
||||
|
||||
extern struct struct_1 OVERLAY31_UNKNOWN_STRUCT__NA_2389E30;
|
||||
|
||||
|
|
@ -61,7 +61,7 @@ extern u32 ov29_022F0B9C(void);
|
|||
extern void ov29_022E0C2C(u32);
|
||||
|
||||
extern u32 GetFloorType(void);
|
||||
extern u32 ov29_02338708(u32*);
|
||||
extern u32 ov29_02338708(struct position*);
|
||||
|
||||
void EntryOverlay31(void) {
|
||||
struct struct_1* r0;
|
||||
|
|
@ -81,14 +81,15 @@ void DrawDungeonMenuStatusWindow(struct Window* window)
|
|||
u8 str_buff[DRAW_DUNGEON_MENU_STATUS_WINDOW_BUFF_SIZE];
|
||||
u8 member_name_buffer[256];
|
||||
struct entity* leader;
|
||||
struct leader_info* leader_info;
|
||||
struct monster* leader_info;
|
||||
u8* str;
|
||||
s32 line_offset;
|
||||
u8 is_valid_member;
|
||||
s32 i;
|
||||
|
||||
leader = GetLeader();
|
||||
leader_info = (struct leader_info*)leader->info;
|
||||
leader_info = (struct monster*)leader->info;
|
||||
//str_values.dungeon_0 = leader_info->roost;
|
||||
|
||||
str_values.digits_0 = CeilFixedPoint(leader_info->belly);
|
||||
str_values.digits_1 = CeilFixedPoint(leader_info->max_belly);
|
||||
|
|
@ -121,13 +122,14 @@ void DrawDungeonMenuStatusWindow(struct Window* window)
|
|||
is_valid_member = (party_member->type != ENTITY_NOTHING);
|
||||
}
|
||||
if (is_valid_member) {
|
||||
struct party_member_info* member_info = party_member->info;
|
||||
struct monster* member_info = party_member->info;
|
||||
ov29_022E2A78(member_name_buffer, party_member, 0);
|
||||
|
||||
str_values.string0 = member_name_buffer;
|
||||
str_values.value_0 = member_info->hp_left;
|
||||
str_values.value_0 = member_info->hp;
|
||||
|
||||
str_values.value_1 = MIN(member_info->hp_max_1 + member_info->hp_max_2, DRAW_DUNGEON_MENU_STATUS_WINDOW_CONST_2);
|
||||
str_values.value_1 = MIN(member_info->max_hp_stat + member_info->max_hp_boost,
|
||||
DRAW_DUNGEON_MENU_STATUS_WINDOW_CONST_2);
|
||||
|
||||
str = StringFromId(DRAW_DUNGEON_MENU_STATUS_WINDOW_STR_ID_5);
|
||||
PreprocessString(str_buff, DRAW_DUNGEON_MENU_STATUS_WINDOW_BUFF_SIZE, str, 0, &str_values);
|
||||
|
|
@ -247,7 +249,7 @@ struct struct_1* ov31_02382E08(void)
|
|||
return OVERLAY31_UNKNOWN_POINTER__NA_238A260[1];
|
||||
}
|
||||
|
||||
void ov31_02382E18(u32* arg_1, u32 arg_2)
|
||||
void ov31_02382E18(struct entity* arg_1, u32 arg_2)
|
||||
{
|
||||
ov29_022EA428(6, 0);
|
||||
AdvanceFrame(0x62);
|
||||
|
|
@ -270,7 +272,7 @@ void ov31_02382E18(u32* arg_1, u32 arg_2)
|
|||
ov29_022E0C2C(1);
|
||||
}
|
||||
|
||||
void ov31_02382ED4(u32* arg_1)
|
||||
void ov31_02382ED4(struct entity* arg_1)
|
||||
{
|
||||
struct struct_3* tmp1;
|
||||
if (sub_020348E4(&OVERLAY31_UNKNOWN_STRUCT__NA_2389E30) == 0)
|
||||
|
|
@ -278,7 +280,7 @@ void ov31_02382ED4(u32* arg_1)
|
|||
|
||||
tmp1 = MemAlloc(sizeof(struct struct_3), 8);
|
||||
ov31_0238A2A0.st3 = tmp1;
|
||||
ov31_0238A2A0.st3->field_0x4 = 0;
|
||||
ov31_0238A2A0.st3->f = 0;
|
||||
ov31_0238A2A0.st3->a = arg_1;
|
||||
ov31_0238A2A0.st3->b = 0;
|
||||
ov31_0238A2A0.st3->c = 0;
|
||||
|
|
@ -289,7 +291,7 @@ void ov31_02382ED4(u32* arg_1)
|
|||
r4 = 2;
|
||||
} else if (floor_type == 1) {
|
||||
r4 = 1;
|
||||
} else if (ov29_02338708(arg_1+1)) {
|
||||
} else if (ov29_02338708(&(arg_1->pos))) {
|
||||
r4 = 3;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ OUT_FILE=ctx.c
|
|||
|
||||
GCC=gcc
|
||||
FLAGS="-E -P -dD -undef"
|
||||
INCLUDES="-Iinclude -Iinclude/library -Ifiles -Ilib/include -include global.h"
|
||||
INCLUDES="-Iinclude -Iinclude/library -Ifiles -Ilib/include" # -include global.h"
|
||||
DEFINES="-DGAME_REMASTER=0 -DNORTH_AMERICA -DPM_KEEP_ASSERTS -DSDK_ARM9 -DSDK_CODE_ARM -DSDK_FINALROM"
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user