8#include "sprite/npc/BattleMerlee.h"
9#include "sprite/player.h"
96 .generalChance =
F16(100),
98 .chancePerAttempt = 1,
102 .generalChance =
F16(75),
104 .chancePerAttempt = 2,
108 .generalChance =
F16(50),
110 .chancePerAttempt = 3,
114 .generalChance =
F16(25),
116 .chancePerAttempt = 4,
124 .chancePerAttempt = 0,
216 flag = encounterID % 32;
258 script->functionTemp[0] = 25;
262 script->functionTemp[0]--;
264 if (
script->functionTemp[0] == 0) {
273 script->functionTemp[0] = 25;
277 script->functionTemp[0] -= 5;
279 if (
script->functionTemp[0] == 0) {
297 if ((
u32)(npc->
alpha & 0xFF) >= 0xFF) {
309 if (npc->
alpha == 0) {
323 script->functionTemp[1] = 0;
334 script->functionTemp[1] += 10;
423 script->functionTemp[0] = 0;
424 script->functionTemp[1] = 20;
427 if (
script->functionTemp[1] & 1) {
433 if (
script->functionTemp[1] == 15) {
439 if (
script->functionTemp[1] == 10) {
446 script->functionTemp[1]--;
447 if (
script->functionTemp[1] == 0) {
460 script->functionTemp[0] = 0;
461 script->functionTemp[1] = 40;
462 script->functionTemp[2] = 0;
465 script->functionTemp[2]++;
466 if (
script->functionTemp[2] >= 5) {
475 script->functionTemp[2] = 0;
478 return --
script->functionTemp[1] == 0;
535 if (playerYaw < 180.0f) {
745 if (
npc_test_move_taller_with_slipping(
COLLIDER_FLAG_IGNORE_PLAYER, &
testX, &
testY, &
testZ,
distance,
atan2(
npcX,
npcZ,
playerX,
playerZ),
colHeight,
colRadius * 2.0f)) {
749 if (
npc_test_move_taller_with_slipping(
COLLIDER_FLAG_IGNORE_PLAYER, &
testX, &
testY, &
testZ,
distance,
atan2(
playerX,
playerZ,
npcX,
npcZ),
colHeight,
colRadius * 2.0f)) {
808 if (
npc_test_move_taller_with_slipping(
COLLIDER_FLAG_IGNORE_PLAYER, &
testX, &
testY, &
testZ,
distance,
atan2(
npcX,
npcZ,
playerX,
playerZ),
colHeight,
colRadius * 2.0f)) {
812 if (
npc_test_move_taller_with_slipping(
COLLIDER_FLAG_IGNORE_PLAYER, &
testX, &
testY, &
testZ,
distance,
atan2(
playerX,
playerZ,
npcX,
npcZ),
colHeight,
colRadius * 2.0f)) {
893 if (
npc_test_move_taller_with_slipping(
COLLIDER_FLAG_IGNORE_PLAYER, &
testX, &
testY, &
testZ,
distance,
atan2(
npcX,
npcZ,
playerX,
playerZ),
colHeight,
colRadius * 2.0f)) {
897 if (
npc_test_move_taller_with_slipping(
COLLIDER_FLAG_IGNORE_PLAYER, &
testX, &
testY, &
testZ,
distance,
atan2(
playerX,
playerZ,
npcX,
npcZ),
colHeight,
colRadius * 2.0f)) {
986 script->owner1.enemy = enemy;
1020 for (i = 0; i <
encounter->count; i++) {
1022 if (enemy ==
NULL) {
1040 script->owner1.enemy = enemy;
1066 for (i = 0; i <
encounter->count; i++) {
1069 if (enemy ==
NULL) {
1086 script->owner1.enemy = enemy;
1127 for (i = 0; i <
encounter->count; i++) {
1129 if (enemy ==
NULL) {
1146 script->owner1.enemy = enemy;
1185 script->owner1.enemy = enemy;
1209 for (i = 0; i <
encounter->count; i++) {
1211 if (enemy ==
NULL) {
1228 script->owner1.enemy = enemy;
1397 for (i = 0; i <
encounter->count; i++) {
1399 if (enemy !=
NULL &&
1449 for (i = 0; i <
encounter->count; i++) {
1451 if (enemy !=
NULL &&
1578 if (xOffset < 1600) {
1594 draw_box(0,
WINDOW_STYLE_20, posX, 69, 0, width, 28, 255, 0, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
NULL, 0,
NULL,
1601 draw_box(0,
WINDOW_STYLE_20, posX, 69, 0, width, 28, 255, 0, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
NULL, 0,
NULL,
1611 draw_box(0,
WINDOW_STYLE_4, posX, 69, 0, width, 28, 255, 0, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
NULL, 0,
NULL,
1720 for (i = 0; i <
encounter->count; i++) {
1722 if (enemy ==
NULL) {
1735 script->owner1.enemy = enemy;
1743 script->owner1.enemy = enemy;
1772 for (i = 0; i <
encounter->count; i++) {
1774 if (enemy ==
NULL) {
1798 for (i = 0; i <
encounter->count; i++) {
1801 if (enemy ==
NULL) {
1872 for (i = 0; i <
encounter->count; i++) {
1874 if (enemy ==
NULL) {
1889 script->owner1.enemy = enemy;
1910 for (i = 0; i <
encounter->count; i++) {
1912 if (enemy ==
NULL) {
1950 if (enemy ==
NULL) {
1969 script->owner1.enemy = enemy;
2005 for (i = 0; i <
encounter->count; i++) {
2007 if (enemy ==
NULL) {
2022 script->owner1.enemy = enemy;
2043 for (i = 0; i <
encounter->count; i++) {
2045 if (enemy ==
NULL) {
2124 for (i = 0; i <
encounter->count; i++) {
2126 if (enemy ==
NULL) {
2141 script->owner1.enemy = enemy;
2162 for (i = 0; i <
encounter->count; i++) {
2164 if (enemy ==
NULL) {
2202 if (enemy ==
NULL) {
2372 if (enemy ==
NULL) {
2538 enemy->varTable[
k] = 0;
2544 if ((*(
s16*)(&
npcData->drops) & 0xFF00) != 0x8000) {
2588 if (
npcData->initVarCount != 0) {
2589 if (
npcData->initVarCount == 1) {
2590 enemy->varTable[0] =
npcData->initVar.value;
2593 for (
k = 0;
k <
npcData->initVarCount;
k++) {
2622 newNpc->planarFlyDist = 0.0f;
2628 if (
newNpc->collisionDiameter >= 24.0) {
2629 newNpc->shadowScale =
newNpc->collisionDiameter / 24.0;
2631 newNpc->shadowScale = 1.0f;
2674 script->owner1.enemy = enemy;
2696 for (i = 0; i <
encounter->count; i++) {
2698 if (enemy ==
NULL) {
2714 for (i = 0; i <
encounter->count; i++) {
2716 if (enemy ==
NULL) {
2723 script->owner1.enemy = enemy;
2741 for (i = 0; i <
encounter->count; i++) {
2743 if (enemy ==
NULL) {
2765 for (i = 0; i <
encounter->count; i++) {
2767 if (enemy ==
NULL) {
2776 script->owner1.enemy = enemy;
2789 for (i = 0; i <
encounter->count; i++) {
2791 if (enemy ==
NULL) {
2799 script->owner1.enemy = enemy;
BSS s32 PopupMenu_SelectedIndex
#define sfx_play_sound_at_position
EffectInstanceDataPtr data
struct EnergyOrbWaveFXData * energyOrbWave
#define ASSERT(condition)
void create_encounters(void)
s8 LastBattleStartedBySpin
b32 check_conversation_trigger(void)
void update_encounters_conversation(void)
void setup_status_bar_for_world(void)
void update_encounters_neutral(void)
void show_first_strike_message(void)
BSS EffectInstance * WorldMerleeOrbEffect
void update_encounters_post_battle(void)
s8 HasPreBattleSongPushed
s32 get_coin_drop_amount(Enemy *enemy)
BSS s32 WorldMerleeEffectsTime
BSS s16 WorldMerleeEffectsState
void init_encounters_ui(void)
BSS f32 WorldMerleeBasePosY
BSS s32 MerleeDropCoinsEvtID
void update_encounters_pre_battle(void)
s32 get_defeated(s32 mapID, s32 encounterID)
s32 is_starting_conversation(void)
s16 gFirstStrikeMessagePos
void set_defeated(s32 mapID, s32 encounterID)
s8 PendingPartnerAbilityResume
void draw_encounters_pre_battle(void)
void set_battle_formation(Battle *)
BSS Evt * MerleeDropCoinsEvt
void draw_encounters_conversation(void)
EvtScript EVS_MerleeDropCoins
EvtScript EVS_FleeBattleDrops
EncounterStatus gCurrentEncounter
b32 EncounterStateChanged
void draw_encounters_neutral(void)
void partner_handle_after_battle(void)
void draw_encounters_post_battle(void)
BSS EffectInstance * WorldMerleeWaveEffect
EnemyDrops DefaultEnemyDrops
@ FX_INSTANCE_FLAG_DISMISS
@ DEBUG_CONTACT_CANT_TOUCH
@ DEBUG_CONTACT_DIE_ON_TOUCH
@ ENCOUNTER_FLAG_SKIP_FLEE_DROPS
@ ENCOUNTER_FLAG_THUMBS_UP
Mario will do a 'thumbs up' animation after winning.
@ ENCOUNTER_FLAG_CANT_SKIP_WIN_DELAY
@ ITEM_SPAWN_MODE_TOSS_SPAWN_ALWAYS
@ ENCOUNTER_SUBSTATE_CONVERSATION_END
@ ENCOUNTER_SUBSTATE_CONVERSATION_INIT
@ PS_FLAG_ENTERING_BATTLE
@ PS_FLAG_HAS_CONVERSATION_NPC
@ ENCOUNTER_TRIGGER_CONVERSATION
@ ENCOUNTER_TRIGGER_HAMMER
@ ENCOUNTER_TRIGGER_PARTNER
@ ENCOUNTER_SUBSTATE_POST_BATTLE_WON_FADE_IN
@ ENCOUNTER_SUBSTATE_POST_BATTLE_LOST_RESUME
@ ENCOUNTER_SUBSTATE_POST_BATTLE_LOST_FADE_IN
@ ENCOUNTER_SUBSTATE_POST_BATTLE_SKIP
@ ENCOUNTER_SUBSTATE_POST_BATTLE_FLED_RESUME
@ ENCOUNTER_SUBSTATE_POST_BATTLE_WON_KILL
@ ENCOUNTER_SUBSTATE_POST_BATTLE_FLED_INIT
@ ENCOUNTER_SUBSTATE_POST_BATTLE_WON_RESUME
@ ENCOUNTER_SUBSTATE_POST_BATTLE_ENEMY_FLED_INIT
@ ENCOUNTER_SUBSTATE_POST_BATTLE_LOST_DELAY
@ ENCOUNTER_SUBSTATE_POST_BATTLE_FLED_FADE_IN
@ ENCOUNTER_SUBSTATE_POST_BATTLE_LOST_INIT
@ ENCOUNTER_SUBSTATE_POST_BATTLE_ENEMY_FLED_FADE_IN
@ ENCOUNTER_SUBSTATE_POST_BATTLE_INIT
@ ENCOUNTER_SUBSTATE_POST_BATTLE_PLAY_NPC_DEFEAT
@ ENCOUNTER_SUBSTATE_POST_BATTLE_ENEMY_FLED_RESUME
@ ENCOUNTER_SUBSTATE_POST_BATTLE_FLED_DELAY
@ ENCOUNTER_SUBSTATE_POST_BATTLE_WON_CHECK_MERLEE
@ ENEMY_FLAG_RAYCAST_TO_INTERACT
@ ENEMY_FLAG_NO_DELAY_AFTER_FLEE
@ ENEMY_FLAG_IGNORE_ENTITY_COLLISION
@ ENEMY_FLAG_HAS_NO_SPRITE
@ ENEMY_FLAG_IGNORE_HAMMER
@ ENEMY_FLAG_DO_NOT_AUTO_FACE_PLAYER
@ ENEMY_FLAG_IGNORE_PARTNER
@ ENEMY_FLAG_ENABLE_HIT_SCRIPT
@ ENEMY_FLAG_USE_PLAYER_SPRITE
@ ENEMY_FLAG_DONT_SUSPEND_SCRIPTS
@ ENEMY_FLAG_USE_INSPECT_ICON
@ ENEMY_FLAG_NO_SHADOW_RAYCAST
@ ENEMY_FLAG_IGNORE_TOUCH
@ ENEMY_FLAG_CANT_INTERACT
@ ENEMY_FLAG_DONT_UPDATE_SHADOW_Y
@ ENEMY_FLAG_IGNORE_PLAYER_COLLISION
@ ENEMY_FLAG_IGNORE_WORLD_COLLISION
@ ENEMY_FLAG_ACTIVE_WHILE_OFFSCREEN
@ COLLIDER_FLAG_IGNORE_PLAYER
@ PA_FLAG_DIZZY_ATTACK_ENCOUNTER
@ ENCOUNTER_SUBSTATE_PRE_BATTLE_INIT
@ ENCOUNTER_SUBSTATE_PRE_BATTLE_AUTO_WIN
@ ENCOUNTER_SUBSTATE_PRE_BATTLE_LOAD
@ ENCOUNTER_SUBSTATE_PRE_BATTLE_SKIP
@ SOUND_SPEEDY_SPIN_ATTACK
@ SOUND_HIT_PLAYER_NORMAL
@ ACTION_STATE_STEP_DOWN_LAND
@ ACTION_STATE_SPIN_POUND
@ ACTION_STATE_TALK
Reading signs doesn't count.
@ ACTION_STATE_TORNADO_POUND
@ ACTION_STATE_USE_SPINNING_FLOWER
@ ACTION_STATE_ENEMY_FIRST_STRIKE
@ ACTION_STATE_BOUNCE
Used with Kooper.
@ ACTION_STATE_TORNADO_JUMP
@ ENCOUNTER_STATE_POST_BATTLE
@ ENCOUNTER_STATE_CONVERSATION
@ ENCOUNTER_STATE_NEUTRAL
@ ENCOUNTER_STATE_PRE_BATTLE
@ GLOBAL_OVERRIDES_DISABLE_BATTLES
@ ENCOUNTER_SUBSTATE_NEUTRAL
@ ENCOUNTER_SUBSTATE_CREATE_RUN_INIT_SCRIPT
@ ENCOUNTER_SUBSTATE_CREATE_RUN_AI
@ ENCOUNTER_SUBSTATE_CREATE_INIT
@ NPC_FLAG_IGNORE_ENTITY_COLLISION
@ NPC_FLAG_RAYCAST_TO_INTERACT
@ NPC_FLAG_IGNORE_WORLD_COLLISION
@ NPC_FLAG_IGNORE_PLAYER_COLLISION
@ NPC_FLAG_NO_SHADOW_RAYCAST
@ NPC_FLAG_USE_INSPECT_ICON
@ NPC_FLAG_DONT_UPDATE_SHADOW_Y
@ EVT_GROUP_FLAG_INTERACT
@ EVT_FLAG_SUSPENDED
doesn't affect child
void set_screen_overlay_params_back(u8, f32)
void set_battle_stage(s32)
s32 evt_get_variable(Evt *script, Bytecode var)
s32 is_ability_active(s32 arg0)
s32 is_merlee_message_done(void)
void get_screen_coords(s32 camID, f32 x, f32 y, f32 z, s32 *screenX, s32 *screenY, s32 *screenZ)
void set_screen_overlay_alpha(s32, f32)
void spawn_drops(Enemy *enemy)
void partner_disable_input(void)
s32 disable_player_input(void)
s32 resume_all_group(s32 groupFlags)
s32 suspend_all_script(s32 id)
void set_screen_overlay_params_front(u8, f32)
void close_status_bar(void)
void mdl_set_all_tint_type(s32)
s32 enable_player_input(void)
void set_script_flags(Evt *script, s32 flags)
void bgm_pop_battle_song(void)
Evt * start_script(EvtScript *source, s32 priority, s32 initialState)
s32 is_picking_up_item(void)
void set_action_state(s32 actionState)
void clear_script_flags(Evt *script, s32 flags)
s32 partner_test_enemy_collision(Npc *enemy)
b32 npc_test_move_taller_with_slipping(s32, f32 *, f32 *, f32 *, f32, f32, f32, f32)
void show_merlee_message(s16, s16)
void set_screen_overlay_center(s32, s32, s32, s32)
void kill_script_by_ID(s32 id)
void set_screen_overlay_color(s32, u8, u8, u8)
void start_bounce_a(void)
void suggest_player_anim_allow_backward(AnimID anim)
void partner_handle_before_battle(void)
s32 resume_all_script(s32 id)
s32 does_script_exist(s32 id)
void bgm_set_battle_song(s32, s32)
void bgm_push_battle_song(void)
Evt * start_script_in_group(EvtScript *source, u8 priority, u8 initialState, u8 groupFlags)
s32 make_item_entity_delayed(s32 itemID, f32 x, f32 y, f32 z, s32 itemSpawnMode, s32 pickupDelay, s32 pickupVar)
void add_vec2D_polar(f32 *x, f32 *y, f32 r, f32 theta)
Evt * get_script_by_id(s32 id)
f32 get_clamped_angle_diff(f32, f32)
void suspend_all_group(s32 groupFlags)
void * heap_malloc(s32 size)
void mdl_set_shroud_tint_params(u8 r, u8 g, u8 b, u8 a)
struct Evt * interactScript
void kill_enemy(Enemy *enemy)
s32 create_peach_npc(NpcBlueprint *blueprint)
s32 create_standard_npc(NpcBlueprint *blueprint, AnimID *animList)
struct Evt * defeatScript
Npc * get_npc_unsafe(s32 npcID)
EvtScript * interactBytecode
Npc * get_npc_by_index(s32 listIndex)
NpcSettings * npcSettings
void set_npc_yaw(Npc *npc, f32 yaw)
EvtScript * defeatBytecode
EnemyTerritory * territory
void partner_enable_input(void)
void sfx_stop_sound(s32 soundID)
void sfx_play_sound(s32 soundID)
ApiStatus ShowMerleeCoinMessage(Evt *script, b32 isInitialCall)
ApiStatus PlaySound(Evt *script, b32 isInitialCall)
ApiStatus FadeBackgroundLighten(Evt *script, b32 isInitialCall)
ApiStatus DeleteNpc(Evt *script, b32 isInitialCall)
ApiStatus PlayMerleeGatherFX(Evt *script, b32 isInitialCall)
ApiStatus SetNpcAnimation(Evt *script, b32 isInitialCall)
ApiStatus SetEnemyFlagBits(Evt *script, b32 isInitialCall)
ApiStatus FadeInMerlee(Evt *script, b32 isInitialCall)
ApiStatus MerleeStopFX(Evt *script, b32 isInitialCall)
ApiStatus FadeOutMerlee(Evt *script, b32 isInitialCall)
ApiStatus OnFleeBattleDrops(Evt *script, b32 isInitialCall)
ApiStatus SetNpcRotation(Evt *script, b32 isInitialCall)
ApiStatus MerleeUpdateFX(Evt *script, b32 isInitialCall)
ApiStatus FadeBackgroundDarken(Evt *script, b32 isInitialCall)
ApiStatus CreateNpc(Evt *script, b32 isInitialCall)
ApiStatus RemoveNpc(Evt *script, b32 isInitialCall)
ApiStatus GetSelfAnimationFromTable(Evt *script, b32 isInitialCall)
ApiStatus DoNpcDefeat(Evt *script, b32 isInitialCall)
ApiStatus SetNpcPos(Evt *script, b32 isInitialCall)
ApiStatus OnDefeatEnemy(Evt *script, b32 isInitialCall)
ApiStatus GetOwnerEncounterTrigger(Evt *script, b32 isInitialCall)
ApiStatus PlayMerleeOrbFX(Evt *script, b32 isInitialCall)
ApiStatus HasMerleeCasts(Evt *script, b32 isInitialCall)
ApiStatus SetNpcYaw(Evt *script, b32 isInitialCall)
ApiStatus GetCamLookAtObjVector(Evt *script, b32 isInitialCall)
ApiStatus ShowMerleeRanOutMessage(Evt *script, b32 isInitialCall)
ApiStatus func_800458CC(Evt *script, b32 isInitialCall)
ApiStatus OnPlayerFled(Evt *script, b32 isInitialCall)
ApiStatus SetNpcFlagBits(Evt *script, b32 isInitialCall)
ApiStatus GetPlayerPos(Evt *script, b32 isInitialCall)
ApiStatus GetBattleOutcome(Evt *script, b32 isInitialCall)
#define Switch(LVAR)
Marks the start of a switch statement.
#define Set(VAR, INT_VALUE)
Sets the given variable to a given value casted to an integer.
#define CaseEq(RVAR)
Marks the start of a switch case that executes only if LVAR == RVAR. It also marks the end of any pre...
#define End
Signals the end of EVT script data. A script missing this will likely crash on load.
#define Add(VAR, INT_VALUE)
#define EndLoop
Marks the end of a loop.
#define EndCaseGroup
Marks the end of a switch case group (CaseOrEq and/or CaseAndEq), stopping fallthrough.
#define CaseOrEq(RVAR)
Marks the start of a switch case that executes only if LVAR == RVAR.
#define EndIf
Marks the end of an if statement or an else block.
#define ExecWait(EVT_SOURCE)
Launches a new child thread.
#define Thread
Marks the start of a thread block.
#define EndThread
Marks the end of a thread block.
#define Wait(NUM_FRAMES)
Blocks for the given number of frames.
#define EndSwitch
Marks the end of a switch statement and any case.
#define IfEq(LVAR, RVAR)
Marks the beginning of an if statement that only executes if LVAR == RVAR.
#define F16(f)
Fixed-point short literal.
#define Call(FUNC, ARGS...)
Calls a given C EVT API function with any number of arguments.
#define Loop(TIMES)
Marks the beginning of a loop.
#define Return
Kills the current EVT thread.
EvtScript EVS_NpcHitRecoil
PartnerStatus gPartnerStatus
GameStatus * gGameStatusPtr
u8 * gBackgroundTintModePtr
PlayerStatus gPlayerStatus
void fx_damage_stars(s32, f32, f32, f32, f32, f32, f32, s32)