Shipwright/soh/include/z64player.h

929 lines
39 KiB
C
Raw Permalink Normal View History

#ifndef Z64PLAYER_H
#define Z64PLAYER_H
#include "z64actor.h"
#include "alignment.h"
Rework Get Item Table to be more flexible for adding custom items (#1050) * Adds ItemTableManager class. * Implements new getItem table in game. * Adds rando item table and way to differentiate tables in GetItemEntry. * Adds rough ability to differentiate between rando and vanilla items.merge stashed changes from before develop-zhora merge * Change ItemTableID to be uint16_t so we can use ModIndex for it. * Should fix switch build * Should fix switch build pt 2 * Adds new files to CMakeLists. * Implements fixes for competing getItem calls. * Correctly renders freestanding items Particle effects are probably broken, need to fix them still, I pretty much know how I would do that. * Fixed Particle effects in the new getItem system. * Fixes item fanfares * Partially fixes Ice Traps Obtaining a freestanding Ice Trap causes link to slide forward and receiving one from an NPC plays the sound effect and damage animation but doesn't freeze link. * Some more partial ice trap fixing that wasn't pushed earlier * Removes unused function override * Replaces ::find with ::at and adds exception handling * Removes some commented out code. * Refactors rando's GetItemEntry array into two arrays. One array is for the vanilla items that don't have GetItemEntries in vanilla, the other is for rando exclusive items. They are stored in separate arrays before getting added to the table so that we can apply different modIndexes. The items in the first table have are handled by the vanilla Item_Give, and the second table needed a custom `Randomizer_Item_Give` function. * Renames, relocates, and implements ModIndex enum. * Removes now unused ItemIDs and GetItemIDs Also makes all the necessary changes to other code that was still using them indirectly through the GI to GID map that was removed. There's quite a lot of changes here and I haven't had time to test them yet. * Re-implements GIMESSAGE_UNTRANSLATED as macro * Removes commented out function. * Throws exception if an invalid itemID is used Addresses https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r943694857 * Removes ARRAY_SIZE in favor of ARRAY_COUNT ARRAY_COUNT already exists in `macros.h`, I just didn't find it before. Addresses https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r943153833 * Inverts CheckContainsRandoItem to CheckContainsVanillaItem. Addresses https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r940895135 * Cleanup, bugfixes, removing the `- 1`s from `z_player.c` * Fixes some funky formatting that got committed earlier. * Adds else if to added fanfare sound cases. Addresses https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r940112924 and https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r940113492 * Extends GetItemEntry to include getItemId Also adapts some existing calls for both the entry and the id to only get the entry. * Extends GetItemEntry to include GID. This allows for using it later when drawing freestanding items. Addresses https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r943168136 * Rando-specific items use new textId again. This got lost when merging develop-zhora in because I didn't have custom messages merged when I started this. * Sets global modIndex to MOD_NONE on scene load Fixes a crash when buying items in shops due to them not triggering the rando code that normally sets these items. May have also been crashing vanilla playthroughs. * Realized I had the bgm conditions wrong. * Fixes "static drops" (i.e. sticks from withered babas) * Fixes LACS/Prelude situation... again. * Fixes too many arguments error. Not sure why this didn't fail to build on Windows before. * Fixes Link's Pocket items. * Simplifies sram init for rando-specific items * Fixes issues with approaching bottleable items. * Fixes Ruto's Letter. It was accidentally getting classified as a rando item. * Should re-fix freestanding ice traps * Makes freestanding items set player->getItemEntry. This prevents freestanding items from setting the global modIndex. This is part of a larger transition that needs to happen to switch to setting getItemEntries for all of the rando items. This prevents some things that set getItemId of GI_MAX from granting a Fire Medallion when the global modIndex is MOD_RANDOMIZER. * Makes sure we aren't using getItemEntry when not randoed. * Replace Randomizer_GetRandomizedItemId with Randomizer_GetRandomizedItem and Randomizer_GetItemIdFromKnownCheck with Randomizer_GetItemFromKnownCheck * Introduce some new methods and migrate most actors to them * Fixes ocarina game skull kids to set player->getItemEntry * Sets `z_en_box.c` to set `player->getItemEntry` * Fix logical errors and migrate most of the rest of the rando checks to GiveItemEntryFromActor * Use GiveItemEntryFromActorWithFixedRange in item00 * Fixes Anju to set player->getItemEntry. * Add a few missing cases * Additional fix for Skull Kid * Fixes vanilla ice traps and randomized ice smoke * Fixes rendering of treasure chest game items. * Removes unused `Randomizer_GetItemIdFromGetItemId`. * Cleans up an if statement for item00. * Cleans up another if statement in item00 * This should fix a bug with the Gerudo Archery minigame. I wasn't able to get the bug to happen after making this change. * Documents our new GiveItemEntry fuctions. * Uses more descriptive type name for ItemIDs for creating custom messages. * Fixes potential issue with if statement. * Fixes missed type change. Co-authored-by: Garrett Cox <garrettjcox@gmail.com>
2022-08-23 20:11:38 -04:00
#include "soh/Enhancements/item-tables/ItemTableTypes.h"
struct Player;
typedef enum PlayerSword {
/* 0 */ PLAYER_SWORD_NONE,
/* 1 */ PLAYER_SWORD_KOKIRI,
/* 2 */ PLAYER_SWORD_MASTER,
/* 3 */ PLAYER_SWORD_BIGGORON,
/* 4 */ PLAYER_SWORD_MAX
} PlayerSword;
typedef enum PlayerShield {
/* 0x00 */ PLAYER_SHIELD_NONE,
/* 0x01 */ PLAYER_SHIELD_DEKU,
/* 0x02 */ PLAYER_SHIELD_HYLIAN,
/* 0x03 */ PLAYER_SHIELD_MIRROR,
/* 0x04 */ PLAYER_SHIELD_MAX
} PlayerShield;
typedef enum PlayerTunic {
/* 0x00 */ PLAYER_TUNIC_KOKIRI,
/* 0x01 */ PLAYER_TUNIC_GORON,
/* 0x02 */ PLAYER_TUNIC_ZORA,
/* 0x03 */ PLAYER_TUNIC_MAX
} PlayerTunic;
typedef enum PlayerBoots {
/* 0x00 */ PLAYER_BOOTS_KOKIRI,
/* 0x01 */ PLAYER_BOOTS_IRON,
/* 0x02 */ PLAYER_BOOTS_HOVER,
/* Values below are only relevant when setting regs in Player_SetBootData */
/* 0x03 */ PLAYER_BOOTS_INDOOR,
/* 0x04 */ PLAYER_BOOTS_IRON_UNDERWATER,
/* 0x05 */ PLAYER_BOOTS_KOKIRI_CHILD,
/* 0x06 */ PLAYER_BOOTS_MAX
} PlayerBoots;
typedef enum PlayerStrength {
/* 0x00 */ PLAYER_STR_NONE,
/* 0x01 */ PLAYER_STR_BRACELET,
/* 0x02 */ PLAYER_STR_SILVER_G,
/* 0x03 */ PLAYER_STR_GOLD_G,
/* 0x04 */ PLAYER_STR_MAX
} PlayerStrength;
typedef enum PlayerMask {
/* 0x00 */ PLAYER_MASK_NONE,
/* 0x01 */ PLAYER_MASK_KEATON,
/* 0x02 */ PLAYER_MASK_SKULL,
/* 0x03 */ PLAYER_MASK_SPOOKY,
/* 0x04 */ PLAYER_MASK_BUNNY,
/* 0x05 */ PLAYER_MASK_GORON,
/* 0x06 */ PLAYER_MASK_ZORA,
/* 0x07 */ PLAYER_MASK_GERUDO,
/* 0x08 */ PLAYER_MASK_TRUTH,
/* 0x09 */ PLAYER_MASK_MAX
} PlayerMask;
typedef enum PlayerIdleType {
/* -0x1 */ PLAYER_IDLE_CRIT_HEALTH = -1,
/* 0x0 */ PLAYER_IDLE_DEFAULT,
/* 0x1 */ PLAYER_IDLE_FIDGET
} PlayerIdleType;
typedef enum PlayerItemAction {
/* 0x00 */ PLAYER_IA_NONE,
/* 0x01 */ PLAYER_IA_SWORD_CS, // Hold sword without shield in hand. The sword is not usable.
/* 0x02 */ PLAYER_IA_FISHING_POLE,
/* 0x03 */ PLAYER_IA_SWORD_MASTER,
/* 0x04 */ PLAYER_IA_SWORD_KOKIRI,
/* 0x05 */ PLAYER_IA_SWORD_BIGGORON,
/* 0x06 */ PLAYER_IA_DEKU_STICK,
/* 0x07 */ PLAYER_IA_HAMMER,
/* 0x08 */ PLAYER_IA_BOW,
/* 0x09 */ PLAYER_IA_BOW_FIRE,
/* 0x0A */ PLAYER_IA_BOW_ICE,
/* 0x0B */ PLAYER_IA_BOW_LIGHT,
/* 0x0C */ PLAYER_IA_BOW_0C,
/* 0x0D */ PLAYER_IA_BOW_0D,
/* 0x0E */ PLAYER_IA_BOW_0E,
/* 0x0F */ PLAYER_IA_SLINGSHOT,
/* 0x10 */ PLAYER_IA_HOOKSHOT,
/* 0x11 */ PLAYER_IA_LONGSHOT,
/* 0x12 */ PLAYER_IA_BOMB,
/* 0x13 */ PLAYER_IA_BOMBCHU,
/* 0x14 */ PLAYER_IA_BOOMERANG,
/* 0x15 */ PLAYER_IA_MAGIC_SPELL_15,
/* 0x16 */ PLAYER_IA_MAGIC_SPELL_16,
/* 0x17 */ PLAYER_IA_MAGIC_SPELL_17,
/* 0x18 */ PLAYER_IA_FARORES_WIND,
/* 0x19 */ PLAYER_IA_NAYRUS_LOVE,
/* 0x1A */ PLAYER_IA_DINS_FIRE,
/* 0x1B */ PLAYER_IA_DEKU_NUT,
/* 0x1C */ PLAYER_IA_OCARINA_FAIRY,
/* 0x1D */ PLAYER_IA_OCARINA_OF_TIME,
/* 0x1E */ PLAYER_IA_BOTTLE,
/* 0x1F */ PLAYER_IA_BOTTLE_FISH,
/* 0x20 */ PLAYER_IA_BOTTLE_FIRE,
/* 0x21 */ PLAYER_IA_BOTTLE_BUG,
/* 0x22 */ PLAYER_IA_BOTTLE_POE,
/* 0x23 */ PLAYER_IA_BOTTLE_BIG_POE,
/* 0x24 */ PLAYER_IA_BOTTLE_RUTOS_LETTER,
/* 0x25 */ PLAYER_IA_BOTTLE_POTION_RED,
/* 0x26 */ PLAYER_IA_BOTTLE_POTION_BLUE,
/* 0x27 */ PLAYER_IA_BOTTLE_POTION_GREEN,
/* 0x28 */ PLAYER_IA_BOTTLE_MILK_FULL,
/* 0x29 */ PLAYER_IA_BOTTLE_MILK_HALF,
/* 0x2A */ PLAYER_IA_BOTTLE_FAIRY,
/* 0x2B */ PLAYER_IA_ZELDAS_LETTER,
/* 0x2C */ PLAYER_IA_WEIRD_EGG,
/* 0x2D */ PLAYER_IA_CHICKEN,
/* 0x2E */ PLAYER_IA_MAGIC_BEAN,
/* 0x2F */ PLAYER_IA_POCKET_EGG,
/* 0x30 */ PLAYER_IA_POCKET_CUCCO,
/* 0x31 */ PLAYER_IA_COJIRO,
/* 0x32 */ PLAYER_IA_ODD_MUSHROOM,
/* 0x33 */ PLAYER_IA_ODD_POTION,
/* 0x34 */ PLAYER_IA_POACHERS_SAW,
/* 0x35 */ PLAYER_IA_BROKEN_GORONS_SWORD,
/* 0x36 */ PLAYER_IA_PRESCRIPTION,
/* 0x37 */ PLAYER_IA_FROG,
/* 0x38 */ PLAYER_IA_EYEDROPS,
/* 0x39 */ PLAYER_IA_CLAIM_CHECK,
/* 0x3A */ PLAYER_IA_MASK_KEATON,
/* 0x3B */ PLAYER_IA_MASK_SKULL,
/* 0x3C */ PLAYER_IA_MASK_SPOOKY,
/* 0x3D */ PLAYER_IA_MASK_BUNNY_HOOD,
/* 0x3E */ PLAYER_IA_MASK_GORON,
/* 0x3F */ PLAYER_IA_MASK_ZORA,
/* 0x40 */ PLAYER_IA_MASK_GERUDO,
/* 0x41 */ PLAYER_IA_MASK_TRUTH,
/* 0x42 */ PLAYER_IA_LENS_OF_TRUTH,
/* 0x43 */ PLAYER_IA_MAX
} PlayerItemAction;
typedef enum PlayerLimb {
/* 0x00 */ PLAYER_LIMB_NONE,
/* 0x01 */ PLAYER_LIMB_ROOT,
/* 0x02 */ PLAYER_LIMB_WAIST,
/* 0x03 */ PLAYER_LIMB_LOWER,
/* 0x04 */ PLAYER_LIMB_R_THIGH,
/* 0x05 */ PLAYER_LIMB_R_SHIN,
/* 0x06 */ PLAYER_LIMB_R_FOOT,
/* 0x07 */ PLAYER_LIMB_L_THIGH,
/* 0x08 */ PLAYER_LIMB_L_SHIN,
/* 0x09 */ PLAYER_LIMB_L_FOOT,
/* 0x0A */ PLAYER_LIMB_UPPER,
/* 0x0B */ PLAYER_LIMB_HEAD,
/* 0x0C */ PLAYER_LIMB_HAT,
/* 0x0D */ PLAYER_LIMB_COLLAR,
/* 0x0E */ PLAYER_LIMB_L_SHOULDER,
/* 0x0F */ PLAYER_LIMB_L_FOREARM,
/* 0x10 */ PLAYER_LIMB_L_HAND,
/* 0x11 */ PLAYER_LIMB_R_SHOULDER,
/* 0x12 */ PLAYER_LIMB_R_FOREARM,
/* 0x13 */ PLAYER_LIMB_R_HAND,
/* 0x14 */ PLAYER_LIMB_SHEATH,
/* 0x15 */ PLAYER_LIMB_TORSO,
/* 0x16 */ PLAYER_LIMB_MAX
} PlayerLimb;
typedef enum PlayerBodyPart {
/* 0x00 */ PLAYER_BODYPART_WAIST, // PLAYER_LIMB_WAIST
/* 0x01 */ PLAYER_BODYPART_R_THIGH, // PLAYER_LIMB_R_THIGH
/* 0x02 */ PLAYER_BODYPART_R_SHIN, // PLAYER_LIMB_R_SHIN
/* 0x03 */ PLAYER_BODYPART_R_FOOT, // PLAYER_LIMB_R_FOOT
/* 0x04 */ PLAYER_BODYPART_L_THIGH, // PLAYER_LIMB_L_THIGH
/* 0x05 */ PLAYER_BODYPART_L_SHIN, // PLAYER_LIMB_L_SHIN
/* 0x06 */ PLAYER_BODYPART_L_FOOT, // PLAYER_LIMB_L_FOOT
/* 0x07 */ PLAYER_BODYPART_HEAD, // PLAYER_LIMB_HEAD
/* 0x08 */ PLAYER_BODYPART_HAT, // PLAYER_LIMB_HAT
/* 0x09 */ PLAYER_BODYPART_COLLAR, // PLAYER_LIMB_COLLAR
/* 0x0A */ PLAYER_BODYPART_L_SHOULDER, // PLAYER_LIMB_L_SHOULDER
/* 0x0B */ PLAYER_BODYPART_L_FOREARM, // PLAYER_LIMB_L_FOREARM
/* 0x0C */ PLAYER_BODYPART_L_HAND, // PLAYER_LIMB_L_HAND
/* 0x0D */ PLAYER_BODYPART_R_SHOULDER, // PLAYER_LIMB_R_SHOULDER
/* 0x0E */ PLAYER_BODYPART_R_FOREARM, // PLAYER_LIMB_R_FOREARM
/* 0x0F */ PLAYER_BODYPART_R_HAND, // PLAYER_LIMB_R_HAND
/* 0x10 */ PLAYER_BODYPART_SHEATH, // PLAYER_LIMB_SHEATH
/* 0x11 */ PLAYER_BODYPART_TORSO, // PLAYER_LIMB_TORSO
/* 0x12 */ PLAYER_BODYPART_MAX
} PlayerBodyPart;
typedef enum PlayerMeleeWeaponAnimation {
/* 0 */ PLAYER_MWA_FORWARD_SLASH_1H,
/* 1 */ PLAYER_MWA_FORWARD_SLASH_2H,
/* 2 */ PLAYER_MWA_FORWARD_COMBO_1H,
/* 3 */ PLAYER_MWA_FORWARD_COMBO_2H,
/* 4 */ PLAYER_MWA_RIGHT_SLASH_1H,
/* 5 */ PLAYER_MWA_RIGHT_SLASH_2H,
/* 6 */ PLAYER_MWA_RIGHT_COMBO_1H,
/* 7 */ PLAYER_MWA_RIGHT_COMBO_2H,
/* 8 */ PLAYER_MWA_LEFT_SLASH_1H,
/* 9 */ PLAYER_MWA_LEFT_SLASH_2H,
/* 10 */ PLAYER_MWA_LEFT_COMBO_1H,
/* 11 */ PLAYER_MWA_LEFT_COMBO_2H,
/* 12 */ PLAYER_MWA_STAB_1H,
/* 13 */ PLAYER_MWA_STAB_2H,
/* 14 */ PLAYER_MWA_STAB_COMBO_1H,
/* 15 */ PLAYER_MWA_STAB_COMBO_2H,
/* 16 */ PLAYER_MWA_FLIPSLASH_START,
/* 17 */ PLAYER_MWA_JUMPSLASH_START,
/* 18 */ PLAYER_MWA_FLIPSLASH_FINISH,
/* 19 */ PLAYER_MWA_JUMPSLASH_FINISH,
/* 20 */ PLAYER_MWA_BACKSLASH_RIGHT,
/* 21 */ PLAYER_MWA_BACKSLASH_LEFT,
/* 22 */ PLAYER_MWA_HAMMER_FORWARD,
/* 23 */ PLAYER_MWA_HAMMER_SIDE,
/* 24 */ PLAYER_MWA_SPIN_ATTACK_1H,
/* 25 */ PLAYER_MWA_SPIN_ATTACK_2H,
/* 26 */ PLAYER_MWA_BIG_SPIN_1H,
/* 27 */ PLAYER_MWA_BIG_SPIN_2H,
/* 28 */ PLAYER_MWA_MAX
} PlayerMeleeWeaponAnimation;
typedef enum PlayerDoorType {
/* -1 */ PLAYER_DOORTYPE_AJAR = -1,
/* 0 */ PLAYER_DOORTYPE_NONE,
/* 1 */ PLAYER_DOORTYPE_HANDLE,
/* 2 */ PLAYER_DOORTYPE_SLIDING,
/* 3 */ PLAYER_DOORTYPE_FAKE
} PlayerDoorType;
typedef enum PlayerModelGroup {
/* 0x00 */ PLAYER_MODELGROUP_0, // unused (except for a bug in `Player_OverrideLimbDrawPause`)
/* 0x01 */ PLAYER_MODELGROUP_CHILD_HYLIAN_SHIELD, //hold sword only. used for holding sword only as child link with hylian shield equipped
/* 0x02 */ PLAYER_MODELGROUP_SWORD_AND_SHIELD, // hold sword and shield or just sword if no shield is equipped
/* 0x03 */ PLAYER_MODELGROUP_DEFAULT, // non-specific models, for items that don't have particular link models
/* 0x04 */ PLAYER_MODELGROUP_4, // unused, same as PLAYER_MODELGROUP_DEFAULT
/* 0x05 */ PLAYER_MODELGROUP_BGS, // biggoron sword
/* 0x06 */ PLAYER_MODELGROUP_BOW_SLINGSHOT, // bow/slingshot
/* 0x07 */ PLAYER_MODELGROUP_EXPLOSIVES, // bombs, bombchus, same as PLAYER_MODELGROUP_DEFAULT
/* 0x08 */ PLAYER_MODELGROUP_BOOMERANG,
/* 0x09 */ PLAYER_MODELGROUP_HOOKSHOT,
/* 0x0A */ PLAYER_MODELGROUP_10, // stick/fishing pole (which are drawn separately)
/* 0x0B */ PLAYER_MODELGROUP_HAMMER,
/* 0x0C */ PLAYER_MODELGROUP_OCARINA, // ocarina
/* 0x0D */ PLAYER_MODELGROUP_OOT, // ocarina of time
/* 0x0E */ PLAYER_MODELGROUP_BOTTLE, // bottles (drawn separately)
/* 0x0F */ PLAYER_MODELGROUP_SWORD, // hold sword and no shield, even if one is equipped
/* 0x10 */ PLAYER_MODELGROUP_MAX
} PlayerModelGroup;
typedef enum PlayerModelGroupEntry {
/* 0x00 */ PLAYER_MODELGROUPENTRY_ANIM,
/* 0x01 */ PLAYER_MODELGROUPENTRY_LEFT_HAND,
/* 0x02 */ PLAYER_MODELGROUPENTRY_RIGHT_HAND,
/* 0x03 */ PLAYER_MODELGROUPENTRY_SHEATH,
/* 0x04 */ PLAYER_MODELGROUPENTRY_WAIST,
/* 0x05 */ PLAYER_MODELGROUPENTRY_MAX
} PlayerModelGroupEntry;
typedef enum PlayerModelType {
// left hand
/* 0x00 */ PLAYER_MODELTYPE_LH_OPEN, // empty open hand
/* 0x01 */ PLAYER_MODELTYPE_LH_CLOSED, // empty closed hand
/* 0x02 */ PLAYER_MODELTYPE_LH_SWORD, // holding kokiri/master sword
/* 0x03 */ PLAYER_MODELTYPE_LH_SWORD_2, // unused, same as PLAYER_MODELTYPE_LH_SWORD
/* 0x04 */ PLAYER_MODELTYPE_LH_BGS, // holding bgs/broken giant knife (child: master sword)
/* 0x05 */ PLAYER_MODELTYPE_LH_HAMMER, // holding hammer (child: empty hand)
/* 0x06 */ PLAYER_MODELTYPE_LH_BOOMERANG, // holding boomerang (adult: empty hand)
/* 0x07 */ PLAYER_MODELTYPE_LH_BOTTLE, // holding bottle (bottle drawn separately)
// right hand
/* 0x08 */ PLAYER_MODELTYPE_RH_OPEN, // empty open hand
/* 0x09 */ PLAYER_MODELTYPE_RH_CLOSED, // empty closed hand
/* 0x0A */ PLAYER_MODELTYPE_RH_SHIELD, // holding a shield (including no shield)
/* 0x0B */ PLAYER_MODELTYPE_RH_BOW_SLINGSHOT, // holding bow/slingshot
/* 0x0C */ PLAYER_MODELTYPE_RH_BOW_SLINGSHOT_2, // unused, same as PLAYER_MODELTYPE_RH_BOW_SLINGSHOT
/* 0x0D */ PLAYER_MODELTYPE_RH_OCARINA, // holding ocarina (child: fairy ocarina, adult: OoT)
/* 0x0E */ PLAYER_MODELTYPE_RH_OOT, // holding OoT
/* 0x0F */ PLAYER_MODELTYPE_RH_HOOKSHOT, // holding hookshot (child: empty hand)
// sheath
/* 0x10 */ PLAYER_MODELTYPE_SHEATH_16, // sheathed kokiri/master sword?
/* 0x11 */ PLAYER_MODELTYPE_SHEATH_17, // empty sheath?
/* 0x12 */ PLAYER_MODELTYPE_SHEATH_18, // sword sheathed and shield on back?
/* 0x13 */ PLAYER_MODELTYPE_SHEATH_19, // empty sheath and shield on back?
// waist
/* 0x14 */ PLAYER_MODELTYPE_WAIST,
/* 0x15 */ PLAYER_MODELTYPE_MAX,
/* 0xFF */ PLAYER_MODELTYPE_RH_FF = 0xFF // disable shield collider, cutscene-specific
} PlayerModelType;
typedef enum PlayerAnimType {
/* 0x00 */ PLAYER_ANIMTYPE_0,
/* 0x01 */ PLAYER_ANIMTYPE_1,
/* 0x02 */ PLAYER_ANIMTYPE_2,
/* 0x03 */ PLAYER_ANIMTYPE_3,
/* 0x04 */ PLAYER_ANIMTYPE_4,
/* 0x05 */ PLAYER_ANIMTYPE_5,
/* 0x06 */ PLAYER_ANIMTYPE_MAX
} PlayerAnimType;
/**
* Temporary names, derived from original animation names in `D_80853914`
*/
typedef enum PlayerAnimGroup {
/* 0x00 */ PLAYER_ANIMGROUP_wait,
/* 0x01 */ PLAYER_ANIMGROUP_walk,
/* 0x02 */ PLAYER_ANIMGROUP_run,
/* 0x03 */ PLAYER_ANIMGROUP_damage_run,
/* 0x04 */ PLAYER_ANIMGROUP_heavy_run,
/* 0x05 */ PLAYER_ANIMGROUP_waitL,
/* 0x06 */ PLAYER_ANIMGROUP_waitR,
/* 0x07 */ PLAYER_ANIMGROUP_wait2waitR,
/* 0x08 */ PLAYER_ANIMGROUP_normal2fighter,
/* 0x09 */ PLAYER_ANIMGROUP_doorA_free,
/* 0x0A */ PLAYER_ANIMGROUP_doorA,
/* 0x0B */ PLAYER_ANIMGROUP_doorB_free,
/* 0x0C */ PLAYER_ANIMGROUP_doorB,
/* 0x0D */ PLAYER_ANIMGROUP_carryB,
/* 0x0E */ PLAYER_ANIMGROUP_landing,
/* 0x0F */ PLAYER_ANIMGROUP_short_landing,
/* 0x10 */ PLAYER_ANIMGROUP_landing_roll,
/* 0x11 */ PLAYER_ANIMGROUP_hip_down,
/* 0x12 */ PLAYER_ANIMGROUP_walk_endL,
/* 0x13 */ PLAYER_ANIMGROUP_walk_endR,
/* 0x14 */ PLAYER_ANIMGROUP_defense,
/* 0x15 */ PLAYER_ANIMGROUP_defense_wait,
/* 0x16 */ PLAYER_ANIMGROUP_defense_end,
/* 0x17 */ PLAYER_ANIMGROUP_side_walk,
/* 0x18 */ PLAYER_ANIMGROUP_side_walkL,
/* 0x19 */ PLAYER_ANIMGROUP_side_walkR,
/* 0x1A */ PLAYER_ANIMGROUP_45_turn,
/* 0x1B */ PLAYER_ANIMGROUP_waitL2wait,
/* 0x1C */ PLAYER_ANIMGROUP_waitR2wait,
/* 0x1D */ PLAYER_ANIMGROUP_throw,
/* 0x1E */ PLAYER_ANIMGROUP_put,
/* 0x1F */ PLAYER_ANIMGROUP_back_walk,
/* 0x20 */ PLAYER_ANIMGROUP_check,
/* 0x21 */ PLAYER_ANIMGROUP_check_wait,
/* 0x22 */ PLAYER_ANIMGROUP_check_end,
/* 0x23 */ PLAYER_ANIMGROUP_pull_start,
/* 0x24 */ PLAYER_ANIMGROUP_pulling,
/* 0x25 */ PLAYER_ANIMGROUP_pull_end,
/* 0x26 */ PLAYER_ANIMGROUP_fall_up,
/* 0x27 */ PLAYER_ANIMGROUP_jump_climb_hold,
/* 0x28 */ PLAYER_ANIMGROUP_jump_climb_wait,
/* 0x29 */ PLAYER_ANIMGROUP_jump_climb_up,
/* 0x2A */ PLAYER_ANIMGROUP_down_slope_slip_end,
/* 0x2B */ PLAYER_ANIMGROUP_up_slope_slip_end,
/* 0x2C */ PLAYER_ANIMGROUP_nwait,
/* 0x2D */ PLAYER_ANIMGROUP_MAX
} PlayerAnimGroup;
#define LIMB_BUF_COUNT(limbCount) ((ALIGN16((limbCount) * sizeof(Vec3s)) + sizeof(Vec3s) - 1) / sizeof(Vec3s))
#define PLAYER_LIMB_BUF_COUNT LIMB_BUF_COUNT(PLAYER_LIMB_MAX)
typedef enum PlayerCsAction {
/* 0x00 */ PLAYER_CSACTION_NONE,
/* 0x01 */ PLAYER_CSACTION_1,
/* 0x02 */ PLAYER_CSACTION_2,
/* 0x03 */ PLAYER_CSACTION_3,
/* 0x04 */ PLAYER_CSACTION_4,
/* 0x05 */ PLAYER_CSACTION_5,
/* 0x06 */ PLAYER_CSACTION_6,
/* 0x07 */ PLAYER_CSACTION_7,
/* 0x08 */ PLAYER_CSACTION_8,
/* 0x09 */ PLAYER_CSACTION_9,
/* 0x0A */ PLAYER_CSACTION_10,
/* 0x0B */ PLAYER_CSACTION_11,
/* 0x0C */ PLAYER_CSACTION_12,
/* 0x0D */ PLAYER_CSACTION_13,
/* 0x0E */ PLAYER_CSACTION_14,
/* 0x0F */ PLAYER_CSACTION_15,
/* 0x10 */ PLAYER_CSACTION_16,
/* 0x11 */ PLAYER_CSACTION_17,
/* 0x12 */ PLAYER_CSACTION_18,
/* 0x13 */ PLAYER_CSACTION_19,
/* 0x14 */ PLAYER_CSACTION_20,
/* 0x15 */ PLAYER_CSACTION_21,
/* 0x16 */ PLAYER_CSACTION_22,
/* 0x17 */ PLAYER_CSACTION_23,
/* 0x18 */ PLAYER_CSACTION_24,
/* 0x19 */ PLAYER_CSACTION_25,
/* 0x1A */ PLAYER_CSACTION_26,
/* 0x1B */ PLAYER_CSACTION_27,
/* 0x1C */ PLAYER_CSACTION_28,
/* 0x1D */ PLAYER_CSACTION_29,
/* 0x1E */ PLAYER_CSACTION_30,
/* 0x1F */ PLAYER_CSACTION_31,
/* 0x20 */ PLAYER_CSACTION_32,
/* 0x21 */ PLAYER_CSACTION_33,
/* 0x22 */ PLAYER_CSACTION_34,
/* 0x23 */ PLAYER_CSACTION_35,
/* 0x24 */ PLAYER_CSACTION_36,
/* 0x25 */ PLAYER_CSACTION_37,
/* 0x26 */ PLAYER_CSACTION_38,
/* 0x27 */ PLAYER_CSACTION_39,
/* 0x28 */ PLAYER_CSACTION_40,
/* 0x29 */ PLAYER_CSACTION_41,
/* 0x2A */ PLAYER_CSACTION_42,
/* 0x2B */ PLAYER_CSACTION_43,
/* 0x2C */ PLAYER_CSACTION_44,
/* 0x2D */ PLAYER_CSACTION_45,
/* 0x2E */ PLAYER_CSACTION_46,
/* 0x2F */ PLAYER_CSACTION_47,
/* 0x30 */ PLAYER_CSACTION_48,
/* 0x31 */ PLAYER_CSACTION_49,
/* 0x32 */ PLAYER_CSACTION_50,
/* 0x33 */ PLAYER_CSACTION_51,
/* 0x34 */ PLAYER_CSACTION_52,
/* 0x35 */ PLAYER_CSACTION_53,
/* 0x36 */ PLAYER_CSACTION_54,
/* 0x37 */ PLAYER_CSACTION_55,
/* 0x38 */ PLAYER_CSACTION_56,
/* 0x39 */ PLAYER_CSACTION_57,
/* 0x3A */ PLAYER_CSACTION_58,
/* 0x3B */ PLAYER_CSACTION_59,
/* 0x3C */ PLAYER_CSACTION_60,
/* 0x3D */ PLAYER_CSACTION_61,
/* 0x3E */ PLAYER_CSACTION_62,
/* 0x3F */ PLAYER_CSACTION_63,
/* 0x40 */ PLAYER_CSACTION_64,
/* 0x41 */ PLAYER_CSACTION_65,
/* 0x42 */ PLAYER_CSACTION_66,
/* 0x43 */ PLAYER_CSACTION_67,
/* 0x44 */ PLAYER_CSACTION_68,
/* 0x45 */ PLAYER_CSACTION_69,
/* 0x46 */ PLAYER_CSACTION_70,
/* 0x47 */ PLAYER_CSACTION_71,
/* 0x48 */ PLAYER_CSACTION_72,
/* 0x49 */ PLAYER_CSACTION_73,
/* 0x4A */ PLAYER_CSACTION_74,
/* 0x4B */ PLAYER_CSACTION_75,
/* 0x4C */ PLAYER_CSACTION_76,
/* 0x4D */ PLAYER_CSACTION_77,
/* 0x4E */ PLAYER_CSACTION_78,
/* 0x4F */ PLAYER_CSACTION_79,
/* 0x50 */ PLAYER_CSACTION_80,
/* 0x51 */ PLAYER_CSACTION_81,
/* 0x52 */ PLAYER_CSACTION_82,
/* 0x53 */ PLAYER_CSACTION_83,
/* 0x54 */ PLAYER_CSACTION_84,
/* 0x55 */ PLAYER_CSACTION_85,
/* 0x56 */ PLAYER_CSACTION_86,
/* 0x57 */ PLAYER_CSACTION_87,
/* 0x58 */ PLAYER_CSACTION_88,
/* 0x59 */ PLAYER_CSACTION_89,
/* 0x5A */ PLAYER_CSACTION_90,
/* 0x5B */ PLAYER_CSACTION_91,
/* 0x5C */ PLAYER_CSACTION_92,
/* 0x5D */ PLAYER_CSACTION_93,
/* 0x5E */ PLAYER_CSACTION_94,
/* 0x5F */ PLAYER_CSACTION_95,
/* 0x60 */ PLAYER_CSACTION_96,
/* 0x61 */ PLAYER_CSACTION_97,
/* 0x62 */ PLAYER_CSACTION_98,
/* 0x63 */ PLAYER_CSACTION_99,
/* 0x64 */ PLAYER_CSACTION_100,
/* 0x65 */ PLAYER_CSACTION_101,
/* 0x66 */ PLAYER_CSACTION_102,
/* 0x67 */ PLAYER_CSACTION_MAX
} PlayerCsAction;
typedef enum PlayerCueId {
/* 0x00 */ PLAYER_CUEID_NONE,
/* 0x01 */ PLAYER_CUEID_1,
/* 0x02 */ PLAYER_CUEID_2,
/* 0x03 */ PLAYER_CUEID_3,
/* 0x04 */ PLAYER_CUEID_4,
/* 0x05 */ PLAYER_CUEID_5,
/* 0x06 */ PLAYER_CUEID_6,
/* 0x07 */ PLAYER_CUEID_7,
/* 0x08 */ PLAYER_CUEID_8,
/* 0x09 */ PLAYER_CUEID_9,
/* 0x0A */ PLAYER_CUEID_10,
/* 0x0B */ PLAYER_CUEID_11,
/* 0x0C */ PLAYER_CUEID_12,
/* 0x0D */ PLAYER_CUEID_13,
/* 0x0E */ PLAYER_CUEID_14,
/* 0x0F */ PLAYER_CUEID_15,
/* 0x10 */ PLAYER_CUEID_16,
/* 0x11 */ PLAYER_CUEID_17,
/* 0x12 */ PLAYER_CUEID_18,
/* 0x13 */ PLAYER_CUEID_19,
/* 0x14 */ PLAYER_CUEID_20,
/* 0x15 */ PLAYER_CUEID_21,
/* 0x16 */ PLAYER_CUEID_22,
/* 0x17 */ PLAYER_CUEID_23,
/* 0x18 */ PLAYER_CUEID_24,
/* 0x19 */ PLAYER_CUEID_25,
/* 0x1A */ PLAYER_CUEID_26,
/* 0x1B */ PLAYER_CUEID_27,
/* 0x1C */ PLAYER_CUEID_28,
/* 0x1D */ PLAYER_CUEID_29,
/* 0x1E */ PLAYER_CUEID_30,
/* 0x1F */ PLAYER_CUEID_31,
/* 0x20 */ PLAYER_CUEID_32,
/* 0x21 */ PLAYER_CUEID_33,
/* 0x22 */ PLAYER_CUEID_34,
/* 0x23 */ PLAYER_CUEID_35,
/* 0x24 */ PLAYER_CUEID_36,
/* 0x25 */ PLAYER_CUEID_37,
/* 0x26 */ PLAYER_CUEID_38,
/* 0x27 */ PLAYER_CUEID_39,
/* 0x28 */ PLAYER_CUEID_40,
/* 0x29 */ PLAYER_CUEID_41,
/* 0x2A */ PLAYER_CUEID_42,
/* 0x2B */ PLAYER_CUEID_43,
/* 0x2C */ PLAYER_CUEID_44,
/* 0x2D */ PLAYER_CUEID_45,
/* 0x2E */ PLAYER_CUEID_46,
/* 0x2F */ PLAYER_CUEID_47,
/* 0x30 */ PLAYER_CUEID_48,
/* 0x31 */ PLAYER_CUEID_49,
/* 0x32 */ PLAYER_CUEID_50,
/* 0x33 */ PLAYER_CUEID_51,
/* 0x34 */ PLAYER_CUEID_52,
/* 0x35 */ PLAYER_CUEID_53,
/* 0x36 */ PLAYER_CUEID_54,
/* 0x37 */ PLAYER_CUEID_55,
/* 0x38 */ PLAYER_CUEID_56,
/* 0x39 */ PLAYER_CUEID_57,
/* 0x3A */ PLAYER_CUEID_58,
/* 0x3B */ PLAYER_CUEID_59,
/* 0x3C */ PLAYER_CUEID_60,
/* 0x3D */ PLAYER_CUEID_61,
/* 0x3E */ PLAYER_CUEID_62,
/* 0x3F */ PLAYER_CUEID_63,
/* 0x40 */ PLAYER_CUEID_64,
/* 0x41 */ PLAYER_CUEID_65,
/* 0x42 */ PLAYER_CUEID_66,
/* 0x43 */ PLAYER_CUEID_67,
/* 0x44 */ PLAYER_CUEID_68,
/* 0x45 */ PLAYER_CUEID_69,
/* 0x46 */ PLAYER_CUEID_70,
/* 0x47 */ PLAYER_CUEID_71,
/* 0x48 */ PLAYER_CUEID_72,
/* 0x49 */ PLAYER_CUEID_73,
/* 0x4A */ PLAYER_CUEID_74,
/* 0x4B */ PLAYER_CUEID_75,
/* 0x4C */ PLAYER_CUEID_76,
/* 0x4D */ PLAYER_CUEID_77,
/* 0x4E */ PLAYER_CUEID_MAX
} PlayerCueId;
typedef enum PlayerLedgeClimbType {
/* 0 */ PLAYER_LEDGE_CLIMB_NONE,
/* 1 */ PLAYER_LEDGE_CLIMB_1,
/* 2 */ PLAYER_LEDGE_CLIMB_2,
/* 3 */ PLAYER_LEDGE_CLIMB_3,
/* 4 */ PLAYER_LEDGE_CLIMB_4
} PlayerLedgeClimbType;
typedef enum PlayerStickDirection {
/* -1 */ PLAYER_STICK_DIR_NONE = -1,
/* 0 */ PLAYER_STICK_DIR_FORWARD,
/* 1 */ PLAYER_STICK_DIR_LEFT,
/* 2 */ PLAYER_STICK_DIR_BACKWARD,
/* 3 */ PLAYER_STICK_DIR_RIGHT
} PlayerStickDirection;
typedef enum {
/* 0 */ PLAYER_KNOCKBACK_NONE, // No knockback
/* 1 */ PLAYER_KNOCKBACK_SMALL, // A small hop, remains standing up
/* 2 */ PLAYER_KNOCKBACK_LARGE, // Sent flying in the air and lands laying down on the floor
/* 3 */ PLAYER_KNOCKBACK_LARGE_SHOCK // Same as`PLAYER_KNOCKBACK_LARGE` with a shock effect
} PlayerKnockbackType;
typedef enum {
/* 0 */ PLAYER_HIT_RESPONSE_NONE,
/* 1 */ PLAYER_HIT_RESPONSE_KNOCKBACK_LARGE,
/* 2 */ PLAYER_HIT_RESPONSE_KNOCKBACK_SMALL,
/* 3 */ PLAYER_HIT_RESPONSE_ICE_TRAP,
/* 4 */ PLAYER_HIT_RESPONSE_ELECTRIC_SHOCK
} PlayerDamageResponseType;
typedef struct PlayerAgeProperties {
/* 0x00 */ f32 ceilingCheckHeight;
/* 0x04 */ f32 unk_04;
/* 0x08 */ f32 unk_08;
/* 0x0C */ f32 unk_0C;
/* 0x10 */ f32 unk_10;
/* 0x14 */ f32 unk_14;
/* 0x18 */ f32 unk_18;
/* 0x1C */ f32 unk_1C;
/* 0x20 */ f32 unk_20;
/* 0x24 */ f32 unk_24;
/* 0x28 */ f32 unk_28;
/* 0x2C */ f32 unk_2C;
/* 0x30 */ f32 unk_30;
/* 0x34 */ f32 unk_34;
/* 0x38 */ f32 wallCheckRadius;
/* 0x3C */ f32 unk_3C;
/* 0x40 */ f32 unk_40;
/* 0x44 */ Vec3s unk_44;
/* 0x4A */ Vec3s unk_4A[4];
/* 0x62 */ Vec3s unk_62[4];
/* 0x7A */ Vec3s unk_7A[2];
/* 0x86 */ Vec3s unk_86[2];
/* 0x92 */ u16 unk_92;
/* 0x94 */ u16 unk_94;
/* 0x98 */ LinkAnimationHeader* unk_98;
/* 0x9C */ LinkAnimationHeader* unk_9C;
/* 0xA0 */ LinkAnimationHeader* unk_A0;
/* 0xA4 */ LinkAnimationHeader* unk_A4;
/* 0xA8 */ LinkAnimationHeader* unk_A8;
/* 0xAC */ LinkAnimationHeader* unk_AC[4];
/* 0xBC */ LinkAnimationHeader* unk_BC[2];
/* 0xC4 */ LinkAnimationHeader* unk_C4[2];
/* 0xCC */ LinkAnimationHeader* unk_CC[2];
} PlayerAgeProperties; // size = 0xD4
typedef struct WeaponInfo {
/* 0x00 */ s32 active;
/* 0x04 */ Vec3f tip;
/* 0x10 */ Vec3f base;
} WeaponInfo; // size = 0x1C
// #region SOH [General]
// Supporting pendingFlag
// Upstream TODO: Rename these to be more obviously SoH specific
typedef enum FlagType {
FLAG_NONE,
FLAG_SCENE_SWITCH,
FLAG_SCENE_TREASURE,
FLAG_SCENE_CLEAR,
FLAG_SCENE_COLLECTIBLE,
Rework Get Item Table to be more flexible for adding custom items (#1050) * Adds ItemTableManager class. * Implements new getItem table in game. * Adds rando item table and way to differentiate tables in GetItemEntry. * Adds rough ability to differentiate between rando and vanilla items.merge stashed changes from before develop-zhora merge * Change ItemTableID to be uint16_t so we can use ModIndex for it. * Should fix switch build * Should fix switch build pt 2 * Adds new files to CMakeLists. * Implements fixes for competing getItem calls. * Correctly renders freestanding items Particle effects are probably broken, need to fix them still, I pretty much know how I would do that. * Fixed Particle effects in the new getItem system. * Fixes item fanfares * Partially fixes Ice Traps Obtaining a freestanding Ice Trap causes link to slide forward and receiving one from an NPC plays the sound effect and damage animation but doesn't freeze link. * Some more partial ice trap fixing that wasn't pushed earlier * Removes unused function override * Replaces ::find with ::at and adds exception handling * Removes some commented out code. * Refactors rando's GetItemEntry array into two arrays. One array is for the vanilla items that don't have GetItemEntries in vanilla, the other is for rando exclusive items. They are stored in separate arrays before getting added to the table so that we can apply different modIndexes. The items in the first table have are handled by the vanilla Item_Give, and the second table needed a custom `Randomizer_Item_Give` function. * Renames, relocates, and implements ModIndex enum. * Removes now unused ItemIDs and GetItemIDs Also makes all the necessary changes to other code that was still using them indirectly through the GI to GID map that was removed. There's quite a lot of changes here and I haven't had time to test them yet. * Re-implements GIMESSAGE_UNTRANSLATED as macro * Removes commented out function. * Throws exception if an invalid itemID is used Addresses https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r943694857 * Removes ARRAY_SIZE in favor of ARRAY_COUNT ARRAY_COUNT already exists in `macros.h`, I just didn't find it before. Addresses https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r943153833 * Inverts CheckContainsRandoItem to CheckContainsVanillaItem. Addresses https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r940895135 * Cleanup, bugfixes, removing the `- 1`s from `z_player.c` * Fixes some funky formatting that got committed earlier. * Adds else if to added fanfare sound cases. Addresses https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r940112924 and https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r940113492 * Extends GetItemEntry to include getItemId Also adapts some existing calls for both the entry and the id to only get the entry. * Extends GetItemEntry to include GID. This allows for using it later when drawing freestanding items. Addresses https://github.com/HarbourMasters/Shipwright/pull/1050#discussion_r943168136 * Rando-specific items use new textId again. This got lost when merging develop-zhora in because I didn't have custom messages merged when I started this. * Sets global modIndex to MOD_NONE on scene load Fixes a crash when buying items in shops due to them not triggering the rando code that normally sets these items. May have also been crashing vanilla playthroughs. * Realized I had the bgm conditions wrong. * Fixes "static drops" (i.e. sticks from withered babas) * Fixes LACS/Prelude situation... again. * Fixes too many arguments error. Not sure why this didn't fail to build on Windows before. * Fixes Link's Pocket items. * Simplifies sram init for rando-specific items * Fixes issues with approaching bottleable items. * Fixes Ruto's Letter. It was accidentally getting classified as a rando item. * Should re-fix freestanding ice traps * Makes freestanding items set player->getItemEntry. This prevents freestanding items from setting the global modIndex. This is part of a larger transition that needs to happen to switch to setting getItemEntries for all of the rando items. This prevents some things that set getItemId of GI_MAX from granting a Fire Medallion when the global modIndex is MOD_RANDOMIZER. * Makes sure we aren't using getItemEntry when not randoed. * Replace Randomizer_GetRandomizedItemId with Randomizer_GetRandomizedItem and Randomizer_GetItemIdFromKnownCheck with Randomizer_GetItemFromKnownCheck * Introduce some new methods and migrate most actors to them * Fixes ocarina game skull kids to set player->getItemEntry * Sets `z_en_box.c` to set `player->getItemEntry` * Fix logical errors and migrate most of the rest of the rando checks to GiveItemEntryFromActor * Use GiveItemEntryFromActorWithFixedRange in item00 * Fixes Anju to set player->getItemEntry. * Add a few missing cases * Additional fix for Skull Kid * Fixes vanilla ice traps and randomized ice smoke * Fixes rendering of treasure chest game items. * Removes unused `Randomizer_GetItemIdFromGetItemId`. * Cleans up an if statement for item00. * Cleans up another if statement in item00 * This should fix a bug with the Gerudo Archery minigame. I wasn't able to get the bug to happen after making this change. * Documents our new GiveItemEntry fuctions. * Uses more descriptive type name for ItemIDs for creating custom messages. * Fixes potential issue with if statement. * Fixes missed type change. Co-authored-by: Garrett Cox <garrettjcox@gmail.com>
2022-08-23 20:11:38 -04:00
FLAG_EVENT_CHECK_INF,
FLAG_ITEM_GET_INF,
FLAG_INF_TABLE,
FLAG_EVENT_INF,
FLAG_RANDOMIZER_INF,
FLAG_GS_TOKEN,
} FlagType;
typedef struct PendingFlag {
/* 0x00 */ s32 flagID; // which flag to set when Player_SetPendingFlag is called
/* 0x04 */ FlagType flagType; // type of flag to set when Player_SetPendingFlag is called
} PendingFlag; // size = 0x06
// #endregion
#define PLAYER_STATE1_LOADING (1 << 0) //Transitioning to a new scene
#define PLAYER_STATE1_SWINGING_BOTTLE (1 << 1) // Bottle is swung; Bottle is active and can catch things
#define PLAYER_STATE1_HOOKSHOT_FALLING (1 << 2)
#define PLAYER_STATE1_ITEM_IN_HAND (1 << 3)
#define PLAYER_STATE1_HOSTILE_LOCK_ON (1 << 4) // Currently locked onto a hostile actor. Triggers a "battle" variant of many actions.
#define PLAYER_STATE1_INPUT_DISABLED (1 << 5)
#define PLAYER_STATE1_TALKING (1 << 6) // Currently talking to an actor. This includes item exchanges.
#define PLAYER_STATE1_DEAD (1 << 7) // Player has died. Note that this gets set when the death cutscene has started, after landing from the air.
#define PLAYER_STATE1_START_CHANGING_HELD_ITEM (1 << 8) // Item change process has begun
#define PLAYER_STATE1_READY_TO_FIRE (1 << 9)
#define PLAYER_STATE1_GETTING_ITEM (1 << 10)
#define PLAYER_STATE1_CARRYING_ACTOR (1 << 11) // Currently carrying an actor
#define PLAYER_STATE1_CHARGING_SPIN_ATTACK (1 << 12) // Currently charing a spin attack (by holding down the B button)
#define PLAYER_STATE1_HANGING_OFF_LEDGE (1 << 13)
#define PLAYER_STATE1_CLIMBING_LEDGE (1 << 14)
#define PLAYER_STATE1_Z_TARGETING (1 << 15) // Either lock-on or parallel is active. This flag is never checked for and is practically unused.
#define PLAYER_STATE1_FRIENDLY_ACTOR_FOCUS (1 << 16) // Currently focusing on a friendly actor. Includes friendly lock-on, talking, and more. Usually does not include hostile actor lock-on, see `PLAYER_STATE1_HOSTILE_LOCK_ON`.
#define PLAYER_STATE1_PARALLEL (1 << 17) // "Parallel" mode, Z-Target without an actor lock-on
#define PLAYER_STATE1_JUMPING (1 << 18)
#define PLAYER_STATE1_FREEFALL (1 << 19)
#define PLAYER_STATE1_FIRST_PERSON (1 << 20)
#define PLAYER_STATE1_CLIMBING_LADDER (1 << 21)
#define PLAYER_STATE1_SHIELDING (1 << 22)
#define PLAYER_STATE1_ON_HORSE (1 << 23)
#define PLAYER_STATE1_USING_BOOMERANG (1 << 24) // Currently using the boomerang. This includes all phases (aiming, throwing, and catching).
#define PLAYER_STATE1_BOOMERANG_THROWN (1 << 25) // Boomerang has been thrown and is flying in the air
#define PLAYER_STATE1_DAMAGED (1 << 26)
#define PLAYER_STATE1_IN_WATER (1 << 27)
#define PLAYER_STATE1_IN_ITEM_CS (1 << 28)
#define PLAYER_STATE1_IN_CUTSCENE (1 << 29)
#define PLAYER_STATE1_LOCK_ON_FORCED_TO_RELEASE (1 << 30) // Lock-on was released automatically, for example by leaving the lock-on leash range
#define PLAYER_STATE1_FLOOR_DISABLED (1 << 31) //Used for grottos
#define PLAYER_STATE2_DO_ACTION_GRAB (1 << 0)
#define PLAYER_STATE2_CAN_ACCEPT_TALK_OFFER (1 << 1) // Can accept a talk offer. "Speak" or "Check" is shown on the A button.
#define PLAYER_STATE2_DO_ACTION_CLIMB (1 << 2)
#define PLAYER_STATE2_FOOTSTEP (1 << 3)
#define PLAYER_STATE2_MOVING_DYNAPOLY (1 << 4)
#define PLAYER_STATE2_DISABLE_ROTATION_Z_TARGET (1 << 5)
#define PLAYER_STATE2_DISABLE_ROTATION_ALWAYS (1 << 6)
#define PLAYER_STATE2_GRABBED_BY_ENEMY (1 << 7)
#define PLAYER_STATE2_GRABBING_DYNAPOLY (1 << 8)
#define PLAYER_STATE2_FORCE_SAND_FLOOR_SOUND (1 << 9) // Forces sand footstep sounds regardless of current floor type
#define PLAYER_STATE2_UNDERWATER (1 << 10)
#define PLAYER_STATE2_DIVING (1 << 11)
#define PLAYER_STATE2_STATIONARY_LADDER (1 << 12)
#define PLAYER_STATE2_LOCK_ON_WITH_SWITCH (1 << 13) // Actor lock-on is active, specifically with Switch Targeting. Hold Targeting checks the state of the Z button instead of this flag.
#define PLAYER_STATE2_FROZEN (1 << 14)
#define PLAYER_STATE2_PAUSE_MOST_UPDATING (1 << 15)
#define PLAYER_STATE2_DO_ACTION_ENTER (1 << 16) // Sets the "Enter On A" DoAction
#define PLAYER_STATE2_SPIN_ATTACKING (1 << 17) //w/o magic
#define PLAYER_STATE2_CRAWLING (1 << 18) // Crawling through a crawlspace
#define PLAYER_STATE2_HOPPING (1 << 19) //Sidehop/backflip
#define PLAYER_STATE2_NAVI_ACTIVE (1 << 20) // Navi is visible and active. Could be hovering idle near Link or hovering over other actors.
#define PLAYER_STATE2_NAVI_ALERT (1 << 21)
#define PLAYER_STATE2_DO_ACTION_DOWN (1 << 22)
#define PLAYER_STATE2_NEAR_OCARINA_ACTOR (1 << 23)
#define PLAYER_STATE2_ATTEMPT_PLAY_FOR_ACTOR (1 << 24)
#define PLAYER_STATE2_PLAY_FOR_ACTOR (1 << 25)
#define PLAYER_STATE2_REFLECTION (1 << 26) //Handles Dark Link's Reflection
#define PLAYER_STATE2_OCARINA_PLAYING (1 << 27)
#define PLAYER_STATE2_IDLE_FIDGET (1 << 28) // Playing a fidget idle animation (under typical circumstances, see `Player_ChooseNextIdleAnim` for more info)
#define PLAYER_STATE2_DISABLE_DRAW (1 << 29)
#define PLAYER_STATE2_SWORD_LUNGE (1 << 30)
#define PLAYER_STATE2_FORCED_VOID_OUT (1 << 31)
#define PLAYER_STATE3_IGNORE_CEILING_FLOOR_WATER (1 << 0)
#define PLAYER_STATE3_MIDAIR (1 << 1)
#define PLAYER_STATE3_PAUSE_ACTION_FUNC (1 << 2)
#define PLAYER_STATE3_FINISHED_ATTACKING (1 << 3)
#define PLAYER_STATE3_CHECK_FLOOR_WATER_COLLISION (1 << 4)
#define PLAYER_STATE3_FORCE_PULL_OCARINA (1 << 5)
#define PLAYER_STATE3_RESTORE_NAYRUS_LOVE (1 << 6) // Set by ocarina effects actors when destroyed to signal Nayru's Love may be restored (see `ACTOROVL_ALLOC_ABSOLUTE`)
#define PLAYER_STATE3_FLYING_WITH_HOOKSHOT (1 << 7) // Flying in the air with the hookshot as it pulls Player toward its destination
typedef void (*PlayerActionFunc)(struct Player*, struct PlayState*);
typedef s32 (*UpperActionFunc)(struct Player*, struct PlayState*);
typedef void (*AfterPutAwayFunc)(struct PlayState*, struct Player*);
#define UNK6AE_ROT_FOCUS_X (1 << 0)
#define UNK6AE_ROT_FOCUS_Y (1 << 1)
#define UNK6AE_ROT_FOCUS_Z (1 << 2)
#define UNK6AE_ROT_HEAD_X (1 << 3)
#define UNK6AE_ROT_HEAD_Y (1 << 4)
#define UNK6AE_ROT_HEAD_Z (1 << 5)
#define UNK6AE_ROT_UPPER_X (1 << 6)
#define UNK6AE_ROT_UPPER_Y (1 << 7)
#define UNK6AE_ROT_UPPER_Z (1 << 8)
typedef struct Player {
/* 0x0000 */ Actor actor;
/* 0x014C */ s8 currentTunic; // current tunic from `PlayerTunic`
/* 0x014D */ s8 currentSwordItemId;
/* 0x014E */ s8 currentShield; // current shield from `PlayerShield`
/* 0x014F */ s8 currentBoots; // current boots from `PlayerBoots`
/* 0x0150 */ s8 heldItemButton; // Button index for the item currently used
/* 0x0151 */ s8 heldItemAction; // Item action for the item currently used
/* 0x0152 */ u8 heldItemId; // Item id for the item currently used
/* 0x0153 */ s8 prevBoots; // previous boots from `PlayerBoots`
/* 0x0154 */ s8 itemAction; // the difference between this and heldItemAction is unclear
/* 0x0155 */ char unk_155[0x003];
/* 0x0158 */ u8 modelGroup;
/* 0x0159 */ u8 nextModelGroup;
/* 0x015A */ s8 itemChangeType;
/* 0x015B */ u8 modelAnimType;
/* 0x015C */ u8 leftHandType;
/* 0x015D */ u8 rightHandType;
/* 0x015E */ u8 sheathType;
/* 0x015F */ u8 currentMask; // current mask equipped from `PlayerMask`
/* 0x0160 */ Gfx** rightHandDLists;
/* 0x0164 */ Gfx** leftHandDLists;
/* 0x0168 */ Gfx** sheathDLists;
/* 0x016C */ Gfx** waistDLists;
/* 0x0170 */ u8 giObjectLoading;
/* 0x0174 */ DmaRequest giObjectDmaRequest;
/* 0x0194 */ OSMesgQueue giObjectLoadQueue;
/* 0x01AC */ OSMesg giObjectLoadMsg;
/* 0x01B0 */ void* giObjectSegment; // also used for title card textures
/* 0x01B4 */ SkelAnime skelAnime;
/* 0x01F8 */ Vec3s jointTable[PLAYER_LIMB_BUF_COUNT];
/* 0x0288 */ Vec3s morphTable[PLAYER_LIMB_BUF_COUNT];
/* 0x0318 */ Vec3s blendTable[PLAYER_LIMB_BUF_COUNT];
/* 0x03A8 */ s16 unk_3A8[2];
/* 0x03AC */ Actor* heldActor;
/* 0x03B0 */ Vec3f leftHandPos;
/* 0x03BC */ Vec3s unk_3BC;
/* 0x03C4 */ Actor* unk_3C4;
/* 0x03C8 */ Vec3f unk_3C8;
/* 0x03D4 */ char unk_3D4[0x058];
/* 0x042C */ s8 doorType;
/* 0x042D */ s8 doorDirection;
/* 0x042E */ s16 doorTimer;
/* 0x0430 */ Actor* doorActor;
/* 0x0434 */ s16 getItemId; // Upstream TODO: Document why this is s16 while it's s8 upstream
/* 0x0436 */ u16 getItemDirection;
/* 0x0438 */ Actor* interactRangeActor;
/* 0x043C */ s8 mountSide;
/* 0x043D */ char unk_43D[0x003];
/* 0x0440 */ Actor* rideActor;
/* 0x0444 */ u8 csAction;
/* 0x0445 */ u8 prevCsAction;
/* 0x0446 */ u8 cueId;
/* 0x0447 */ u8 unk_447;
/* 0x0448 */ Actor* csActor; // Actor involved in a `csAction`. Typically the actor that invoked the cutscene.
/* 0x044C */ char unk_44C[0x004];
/* 0x0450 */ Vec3f unk_450;
/* 0x045C */ Vec3f unk_45C;
/* 0x0468 */ char unk_468[0x002];
/* 0x046A */ union {
s16 haltActorsDuringCsAction; // If true, halt actors belonging to certain categories during a `csAction`
s16 slidingDoorBgCamIndex; // `BgCamIndex` used during a sliding door cutscene
} cv; // "Cutscene Variable": context dependent variable that has different meanings depending on what function is called
/* 0x046C */ s16 subCamId;
/* 0x046E */ char unk_46E[0x02A];
/* 0x0498 */ ColliderCylinder cylinder;
/* 0x04E4 */ ColliderQuad meleeWeaponQuads[2];
/* 0x05E4 */ ColliderQuad shieldQuad;
/* 0x0664 */ Actor* focusActor; // Actor that Player and the camera are looking at; Used for lock-on, talking, and more
/* 0x0668 */ char unk_668[0x004];
/* 0x066C */ s32 zTargetActiveTimer; // Non-zero values indicate Z-Targeting should update; Values under 5 indicate lock-on is releasing
/* 0x0670 */ s32 meleeWeaponEffectIndex;
/* 0x0674 */ PlayerActionFunc actionFunc;
/* 0x0678 */ PlayerAgeProperties* ageProperties;
/* 0x067C */ u32 stateFlags1;
/* 0x0680 */ u32 stateFlags2;
/* 0x0684 */ Actor* autoLockOnActor; // Actor that is locked onto automatically without player input; see `Player_SetAutoLockOnActor`
/* 0x0688 */ Actor* boomerangActor;
/* 0x068C */ Actor* naviActor;
/* 0x0690 */ s16 naviTextId;
/* 0x0692 */ u8 stateFlags3;
/* 0x0693 */ s8 exchangeItemId;
/* 0x0694 */ Actor* talkActor; // Actor offering to talk, or currently talking to, depending on context
/* 0x0698 */ f32 talkActorDistance; // xz distance away from `talkActor`
/* 0x069C */ char unk_69C[0x004];
/* 0x06A0 */ f32 unk_6A0;
/* 0x06A4 */ f32 closestSecretDistSq;
/* 0x06A8 */ Actor* unk_6A8;
/* 0x06AC */ s8 idleType;
/* 0x06AD */ u8 unk_6AD;
/* 0x06AE */ u16 unk_6AE_rotFlags; // See `UNK6AE_ROT_` macros. If its flag isn't set, a rot steps to 0.
/* 0x06B0 */ s16 upperLimbYawSecondary;
/* 0x06B2 */ char unk_6B4[0x004];
/* 0x06B6 */ Vec3s headLimbRot;
/* 0x06BC */ Vec3s upperLimbRot;
/* 0x06C2 */ s16 unk_6C2;
/* 0x06C4 */ f32 unk_6C4;
/* 0x06C8 */ SkelAnime upperSkelAnime;
/* 0x070C */ Vec3s upperJointTable[PLAYER_LIMB_BUF_COUNT];
/* 0x079C */ Vec3s upperMorphTable[PLAYER_LIMB_BUF_COUNT];
/* 0x082C */ UpperActionFunc upperActionFunc;
/* 0x0830 */ f32 upperAnimInterpWeight;
/* 0x0834 */ s16 unk_834;
/* 0x0836 */ s8 unk_836;
/* 0x0837 */ u8 putAwayCooldownTimer;
/* 0x0838 */ f32 linearVelocity; // Controls horizontal speed, used for `actor.speed`. Current or target value depending on context.
/* 0x083C */ s16 yaw; // General yaw value, used both for world and shape rotation. Current or target value depending on context.
/* 0x083E */ s16 parallelYaw; // yaw in "parallel" mode, Z-Target without an actor lock-on
/* 0x0840 */ u16 underwaterTimer;
/* 0x0842 */ s8 meleeWeaponAnimation;
/* 0x0843 */ s8 meleeWeaponState;
/* 0x0844 */ s8 unk_844;
/* 0x0845 */ u8 unk_845;
/* 0x0846 */ u8 controlStickDataIndex; // cycles between 0 - 3. Used to index `controlStickSpinAngles` and `controlStickDirections`
/* 0x0847 */ s8 controlStickSpinAngles[4]; // Stores a modified version of the control stick angle for the last 4 frames. Used for checking spins.
/* 0x084B */ s8 controlStickDirections[4]; // Stores the control stick direction (relative to shape yaw) for the last 4 frames. See `PlayerStickDirection`.
/* 0x084F */ union {
s8 actionVar1;
s8 facingUpSlope; // Player_Action_SlideOnSlope: facing uphill when sliding on a slope
s8 bottleCatchType; // Player_Action_SwingBottle: entry type for `sBottleCatchInfo`, corresponds to actor caught in a bottle
} av1; // "Action Variable 1": context dependent variable that has different meanings depending on what action is currently running
/* 0x0850 */ union {
s16 actionVar2;
s16 fallDamageStunTimer; // Player_Action_Idle: Prevents any movement and shakes model up and down quickly to indicate fall damage stun
s16 bonked; // Player_Action_Roll: set to true after bonking into a wall or an actor
s16 startedTextbox; // Player_Action_SwingBottle: set to true when the textbox is started
s16 inWater; // Player_Action_SwingBottle: true if a bottle is swung in water. Used to determine which bottle swing animation to use.
} av2; // "Action Variable 2": context dependent variable that has different meanings depending on what action is currently running
/* 0x0854 */ f32 unk_854;
/* 0x0858 */ f32 unk_858;
/* 0x085C */ f32 unk_85C; // stick length among other things
/* 0x0860 */ s16 unk_860; // stick flame timer among other things
/* 0x0862 */ s16 unk_862; // get item draw ID + 1
/* 0x0864 */ f32 unk_864;
/* 0x0868 */ f32 unk_868;
/* 0x086C */ f32 unk_86C;
/* 0x0870 */ f32 unk_870;
/* 0x0874 */ f32 unk_874;
/* 0x0878 */ f32 unk_878;
/* 0x087C */ s16 unk_87C;
/* 0x087E */ s16 turnRate; // Amount angle is changed every frame when turning in place
/* 0x0880 */ f32 unk_880;
/* 0x0884 */ f32 yDistToLedge; // y distance to ground above an interact wall. LEDGE_DIST_MAX if no ground is found
/* 0x0888 */ f32 distToInteractWall; // xyz distance to the interact wall
/* 0x088C */ u8 ledgeClimbType;
/* 0x088D */ u8 ledgeClimbDelayTimer;
/* 0x088E */ u8 textboxBtnCooldownTimer; // Prevents usage of A/B/C-up when counting down
/* 0x088F */ u8 damageFlickerAnimCounter; // Used to flicker Link after taking damage
/* 0x0890 */ u8 unk_890;
/* 0x0891 */ u8 bodyShockTimer;
/* 0x0892 */ u8 unk_892;
/* 0x0893 */ u8 hoverBootsTimer;
/* 0x0894 */ s16 fallStartHeight; // last truncated Y position before falling
/* 0x0896 */ s16 fallDistance; // truncated Y distance the player has fallen so far (positive is down)
/* 0x0898 */ s16 floorPitch; // angle of the floor slope in the direction of current world yaw (positive for ascending slope)
/* 0x089A */ s16 floorPitchAlt; // the calculation for this value is bugged and doesn't represent anything meaningful
/* 0x089C */ s16 unk_89C;
/* 0x089E */ u16 floorSfxOffset;
/* 0x08A0 */ u8 knockbackDamage;
/* 0x08A1 */ u8 knockbackType;
/* 0x08A2 */ s16 knockbackRot;
/* 0x08A4 */ f32 knockbackSpeed;
/* 0x08A8 */ f32 knockbackYVelocity;
/* 0x08AC */ f32 pushedSpeed; // Pushing player, examples include water currents, floor conveyors, climbing sloped surfaces
/* 0x08B0 */ s16 pushedYaw; // Yaw direction of player being pushed
/* 0x08B4 */ WeaponInfo meleeWeaponInfo[3];
/* 0x0908 */ Vec3f bodyPartsPos[PLAYER_BODYPART_MAX];
/* 0x09E0 */ MtxF mf_9E0;
/* 0x0A20 */ MtxF shieldMf;
/* 0x0A60 */ u8 bodyIsBurning;
/* 0x0A61 */ u8 bodyFlameTimers[PLAYER_BODYPART_MAX]; // one flame per body part
/* 0x0A73 */ u8 unk_A73;
/* 0x0A74 */ AfterPutAwayFunc afterPutAwayFunc; // See `Player_SetupWaitForPutAway` and `Player_Action_WaitForPutAway`
/* 0x0A78 */ s8 invincibilityTimer; // prevents damage when nonzero. Positive values are intangibility, negative are invulnerability
/* 0x0A79 */ u8 floorTypeTimer; // counts up every frame the current floor type is the same as the last frame
/* 0x0A7A */ u8 floorProperty;
/* 0x0A7B */ u8 prevFloorType;
/* 0x0A7C */ f32 prevControlStickMagnitude;
/* 0x0A80 */ s16 prevControlStickAngle;
/* 0x0A82 */ u16 prevFloorSfxOffset;
/* 0x0A84 */ s16 unk_A84;
/* 0x0A86 */ s8 unk_A86;
/* 0x0A87 */ u8 unk_A87;
/* 0x0A88 */ Vec3f unk_A88; // previous body part 0 position
// #region SOH [General]
// Upstream TODO: Rename these to be more obviously SoH specific
/* */ PendingFlag pendingFlag;
/* */ GetItemEntry getItemEntry;
// #endregion
// #region SOH [Enhancements]
// Upstream TODO: Rename this to make it more obvious it is apart of an enhancement
/* */ u8 boomerangQuickRecall; // Has the player pressed the boomerang button while it's in the air still?
/* */ u8 ivanFloating;
/* */ u8 ivanDamageMultiplier;
// #endregion
} Player; // size = 0xA94
testing out item replacement (#416) * skip learning song of storms * don't set flag when getting goron tunic as child * Initiates prelude check when master sword unloads. Not quite how N64 rando does it but so far it's the only way I've found to make it trigger without also triggering the time travel again. * Stops Shadow Temple lore prompts from appearing in rando. * Skips cutscene of royal tomb explosion in rando. Explosion sound doesn't play correctly and I think the debris appears in the wrong place, but the functionality is here. * Improves visual of exploding gravestone. * Adds some comments explaining the rando differences * Skip ruto text box in jabu blue warp For rando * skip intro cutscene in dodongo's cavern * load spoiler files on boot, fix spoilerfile existing check when making new saves * name entry dropped spoiler logic * make sure to actually init the cvar * no chime on load * uncomment * Skip ganondrof cutscene Skip to scream part of the death animation, skipping the text boxes etc. For rando * Update z_boss_ganondrof.c * skip owl flight cutscenes in rando * Fixes skipped text so it only applies to shadow temple. Earlier fix inadvertently applied to some other text as well, changed logic so that only specified sceneNums and textIds can have this enabled, and text skipped by sceneNum can have the skip overriden by textId if needed. Currently there are no overrides so the textId section of the logic is commented out to avoid compilation errors. * Adds a default to the switch case statements that leaves the randoSkipText variable unchanged, just in case. * TEST: Text for item * Adding ganon flavor text * ADD: AMMO Count * format ganon text/hint text * Autoskip the tower cutscene if settings call for tower collapse. * ganon hint text logic * Improved prelude after time travel fix * swapped the sizes between ganon hint text and ganon text, as they were set to the wrong things. * this is all i did * not the cleanest code ever but it's working * ADD: GS Count * ADD: Wallter (crash for now) * TWEAK: Wallet check * FIX: Use DrawItem instread of DrawUpgrade... b-baka! * Fixes some vanilla bugs introduced by rando code. * Added cutscene skip for zelda escaping Using the debug cutscene skipping function. Also added a conditional so the bridge doesn't spawn closed when cutscene is ready to trigger * ADD: X Spacing + Placeholders for song * ADD: default case for items * TWEAK: Spacing * FIX: Light Arrow * ADD: Ammo Option * use groups instead * ADD: More spacing logic * songs and names * TWEAK: Color on wallet * colors * Added flags cutscene before nabooru fight * ADD: ChromaKey text * First attempt skip cs after nabooru defeat * Better implementation for specific rando cutscene skips * use pulseaudio defaults * spaces/tabs * move color push/pop to stop crash * make the colors work again * the real bottle fix * pulseaudio values tuned for n64 audio at 44.1khz * update tlength * remove one hardcoded samplerate * Cleaned up and fixed zelda escape skip The if statement is a freaking monster, but unless we want to skip more cutscenes in the same way later, this is the most compact way of doing it that I know of. * Revert one line to match original nothing functional * another hint line that breaks autonewline logic * don't autospawn epona if we don't have the song/ocarina * Trying to use iron knuckle death effects not working yet * Streamlined OoT cutscene skip for future additions Also cleaned up if statement in general * Made if statement more readable Also added clarity for what cutscene was skipped * Fixed typo in comment * Janky nabooru defeat cs skip * altar text formatting (gonna need help shortening some of the french ones) * more altar text formatting * english altar text formatting complete * make gtg blocking guard check for card not bridge * FIX: Typo! * FIX: Uppercases * FIX: Typo * TWEAK: Alter + some names * TWEAK: More caps! * ADD: Missing string TWEAK more uppercases and namefixe s * Hide nabooru death by covering her in flames * bandaid fix for death crash issue * Twinrova defeat cs skip Skips the animation and manually calls the function to show the "beam" around the sisters * fix crash * fix caps to match * fix great fairy reward mashing/shielding issue * TWEAK : Typo clé to Clé * TWEAK: Some Altar hints TWEAK: Some capitals * TWEAK: Unmatching text + some cap again * TWEAK: More tweaks * fix build * remove extra json.hpp, add hint * Update randomizer_item_tracker.cpp * TWEAK: Double Defense with RedParticles instead of white * make sure we don't optimize out the check to ensure a spoilerfile exists * vanilla ganon boss key hint formatting * TWEAK: FR- better way of the hero text * fix * and again * Initializes dungeonsDone items in gSaveContext to 0. * Replaces sizeof calculation with a NUM_DUNGEONS constant. * Fixes Saria's Gift on the LW Bridge from getting killed when holding shield. * More airtight fix for Saria's Gift on the Bridge. * Lifts one of the conditions in the if statement a little higher to prevent unnecessary lookups of getItemId. * Invalidate text box icon before drawing * Fixes the case where Saria's gift is an Ice Trap. We still get the Ice Trap once, but never again. This does mean you can now hold R while walking in to avoid the ice trap, but everything else seems to work fine. * Initial commit Might need changing when we change the settings in the future * Fixes Door of Time opening cutscene after warping with prelude. * Initial waterfall skip Very rudimentary way of doing things but it seems to work so :shrug: * inital rework * fixed default rotation for 2D sprites * fix tab/space issues * 3d drops rando merge fix again * Allows Impa to appear in the Lullaby check post drawbridge escape. * Changes Ganon's Trials Count setting to a checkbox The checkbox is whether or not to skip all of them. Leaving the box unchecked will mean doing all of them. Eventually this will be switched back to a slider once we implement the logic for which trials start out completed. * Sets all Ganon's Trials to incomplete in new saves. Fixes https://github.com/briaguya-ai/rando-issue-tracker/issues/131 * fix castle guards when oot throw cutscene has already played in rando * Properly removes the beams when trials are cleared. * Removes Question Mark from Skip Ganon's Trials UI. * Adds a todo comment about when to change back to slider. * make deku seeds check for bullet bag * Various tweaks TWEAK: Altar Text TWEAK: Hint names TWEAK: Replace more problematic œ to oe * upgrade ocarina on both child and adult equips * FIX: Jabu Item * update equipped hookshot/longshot when obtained as other age * add hint * don't give the bgs check without the claim check * Skips Darunia Cutscene in Fire Temple * Added a TODO note about not skipping the cutscene. There is a setting we will want to have eventually that will require this cutscene to not be skipped since it is used during a glitch. * remove todo * restore fast ocarina option in imgui that was lost in merge * Fixes grey screen issue + tooltip for 2 handed shield * update to use dg instead of g for textures in item tracker * TWEAK: Default color for cosmetic RAND button was not the corect one * fix texture crash, remove unused item tracker code * don't open mask shop until we get zelda's letter * Update README.md * Prevents "correct" chime under incorrect conditions. * Fixes typo in conditional and adds "bonk" sound effect. "Bonk" sound is NA_SE_SY_OCARINA_ERROR and it plays when conditions for the Door of Time have not been met after playing Song of Time. This is only possible in rando's "Intended" Door of Time option, in which the Ocarina of Time and all 3 spritual stones are required to open the door, instead of the vanilla requirements of just having the song of time. * remove modify dpad equips toggle, replace with checks for dpad menu * remove extra check * add ability to hold c-up to assign to dpad when dpad menuing is enabled * disable d-pad navigation on item menu when holding c-up to equip * dpad+c-up stuff for equipment menu * ADD: Checbox for songs colors * TWEAK: RandoColors for normal songs * kind of quick and dirty but it works * TWEAK: Clarity of the tooltip Co-authored-by: briaguya <briaguya@alice> Co-authored-by: Christopher Leggett <chris@leggett.dev> Co-authored-by: aMannus <mannusmenting@gmail.com> Co-authored-by: PurpleHato <linkvssangoku.jr@gmail.com> Co-authored-by: Dog <5172592+Dog@users.noreply.github.com> Co-authored-by: Vague Rant <vaguerant@users.noreply.github.com> Co-authored-by: Baoulettes <perlouzerie@hotmail.fr> Co-authored-by: Ada <60364512+GreatArgorath@users.noreply.github.com>
2022-07-11 20:11:07 -04:00
#endif