Shipwright/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.h

142 lines
5.2 KiB
C

#ifndef Z_EN_OSSAN_H
#define Z_EN_OSSAN_H
#include "ultra64.h"
#include "global.h"
#include "overlays/actors/ovl_En_Tana/z_en_tana.h"
#include "overlays/actors/ovl_En_GirlA/z_en_girla.h"
struct EnOssan;
typedef void (*EnOssanActionFunc)(struct EnOssan*, GlobalContext*);
typedef void (*EnOssanTalkOwnerFunc)(GlobalContext*);
typedef void (*EnOssanInitFunc)(struct EnOssan*, GlobalContext*);
typedef s16 (*EnOssanGetGirlAParamsFunc)(s16);
typedef void (*EnOssanStateFunc)(struct EnOssan*, GlobalContext*, Player*);
typedef struct {
/* 0x00 */ u32 stickColorR;
/* 0x04 */ u32 stickColorG;
/* 0x08 */ u32 stickColorB;
/* 0x0C */ u32 stickColorA;
/* 0x10 */ f32 stickTexX;
/* 0x14 */ f32 stickTexY;
/* 0x18 */ u32 arrowColorR;
/* 0x1C */ u32 arrowColorG;
/* 0x20 */ u32 arrowColorB;
/* 0x24 */ u32 arrowColorA;
/* 0x28 */ f32 arrowTexX;
/* 0x2C */ f32 arrowTexY;
/* 0x30 */ f32 z;
/* 0x34 */ s32 isEnabled;
} StickDirectionPrompt; // size = 0x38
#define ColChanMix(c1, c2, m) (c1 - (s32)(c2 * m)) & 0xFF
typedef struct EnOssan {
/* 0x0000 */ Actor actor;
/* 0x014C */ SkelAnime skelAnime;
/* 0x0190 */ EnOssanActionFunc actionFunc;
/* 0x0194 */ void (*obj3ToSeg6Func)(struct EnOssan*, GlobalContext*);
/* 0x0198 */ ColliderCylinder collider; // unused
/* 0x01E4 */ s16 timer;
/* 0x01E6 */ s16 delayTimer;
/* 0x01E8 */ s8 objBankIndex1;
/* 0x01E9 */ s8 objBankIndex2;
/* 0x01EA */ s8 objBankIndex3;
/* 0x01EB */ u8 happyMaskShopState;
/* 0x01EC */ u8 happyMaskShopkeeperEyeIdx;
/* 0x01EE */ s16 headRot;
/* 0x01F0 */ s16 headTargetRot;
/* 0x01F2 */ s16 eyeTextureIdx;
/* 0x01F4 */ s16 blinkTimer;
/* 0x01F8 */ void (*blinkFunc)(struct EnOssan*);
/* 0x01FC */ s16 stateFlag;
/* 0x01FE */ s16 tempStateFlag;
/* 0x0200 */ EnGirlA* shelfSlots[8];
// Shelves are indexed as such:
/* 7 5 3 1 */
/* 6 4 2 0 */
/* 0x0220 */ EnTana* shelves;
/* 0x0224 */ s32 stickAccumX;
/* 0x0228 */ s32 stickAccumY;
/* 0x022C */ u8 moveHorizontal;
/* 0x022D */ u8 moveVertical;
/* 0x0230 */ f32 cursorX;
/* 0x0234 */ f32 cursorY;
/* 0x0238 */ f32 cursorZ;
/* 0x023C */ u32 cursorColorR;
/* 0x0240 */ u32 cursorColorG;
/* 0x0244 */ u32 cursorColorB;
/* 0x0248 */ u32 cursorColorA;
/* 0x024C */ f32 cursorAnimTween;
/* 0x0250 */ u8 cursorAnimState;
/* 0x0251 */ u8 drawCursor;
/* 0x0252 */ u8 cursorIndex;
/* 0x0254 */ StickDirectionPrompt stickLeftPrompt;
/* 0x028C */ StickDirectionPrompt stickRightPrompt;
/* 0x02C4 */ f32 arrowAnimTween;
/* 0x02C4 */ f32 stickAnimTween;
/* 0x02CC */ u8 arrowAnimState;
/* 0x02CD */ u8 stickAnimState;
/* 0x02D0 */ f32 shopItemSelectedTween;
/* 0x02D4 */ f32 cameraFaceAngle; // stored in degrees
} EnOssan; // size = 0x02D8
typedef enum {
/* 00 */ OSSAN_TYPE_KOKIRI,
/* 01 */ OSSAN_TYPE_KAKARIKO_POTION,
/* 02 */ OSSAN_TYPE_BOMBCHUS,
/* 03 */ OSSAN_TYPE_MARKET_POTION,
/* 04 */ OSSAN_TYPE_BAZAAR,
/* 05 */ OSSAN_TYPE_ADULT,
/* 06 */ OSSAN_TYPE_TALON,
/* 07 */ OSSAN_TYPE_ZORA,
/* 08 */ OSSAN_TYPE_GORON,
/* 09 */ OSSAN_TYPE_INGO,
/* 10 */ OSSAN_TYPE_MASK
} OssanType;
typedef enum {
/* 00 */ OSSAN_STATE_IDLE,
/* 01 */ OSSAN_STATE_START_CONVERSATION,
/* 02 */ OSSAN_STATE_FACING_SHOPKEEPER,
/* 03 */ OSSAN_STATE_TALKING_TO_SHOPKEEPER,
/* 04 */ OSSAN_STATE_LOOK_SHELF_LEFT,
/* 05 */ OSSAN_STATE_LOOK_SHELF_RIGHT,
/* 06 */ OSSAN_STATE_BROWSE_LEFT_SHELF,
/* 07 */ OSSAN_STATE_BROWSE_RIGHT_SHELF,
/* 08 */ OSSAN_STATE_LOOK_SHOPKEEPER, // From looking at shelf
/* 09 */ OSSAN_STATE_SELECT_ITEM, // Select most items
/* 10 */ OSSAN_STATE_SELECT_ITEM_MILK_BOTTLE,
/* 11 */ OSSAN_STATE_SELECT_ITEM_WEIRD_EGG,
/* 12 */ OSSAN_STATE_SELECT_ITEM_UNIMPLEMENTED, // Handles two unfinished shop items
/* 13 */ OSSAN_STATE_SELECT_ITEM_BOMBS,
/* 14 */ OSSAN_STATE_CANT_GET_ITEM,
/* 15 */ OSSAN_STATE_GIVE_ITEM_FANFARE, // Give Item, hold it up with fanfare
/* 16 */ OSSAN_STATE_ITEM_PURCHASED,
/* 17 */ OSSAN_STATE_CONTINUE_SHOPPING_PROMPT,
/* 18 */ OSSAN_STATE_GIVE_LON_LON_MILK,
/* 19 */ OSSAN_STATE_DISPLAY_ONLY_BOMB_DIALOG, // Turn to shopkeeper, talk about fake bombs
/* 20 */ OSSAN_STATE_WAIT_FOR_DISPLAY_ONLY_BOMB_DIALOG, // Can't Get Goron City Bombs
/* 21 */ OSSAN_STATE_21, // Unused
/* 22 */ OSSAN_STATE_22, // Follows OSSAN_STATE_21
/* 23 */ OSSAN_STATE_QUICK_BUY,
/* 24 */ OSSAN_STATE_SELECT_ITEM_MASK,
/* 25 */ OSSAN_STATE_LEND_MASK_OF_TRUTH, // First time all masks are sold
/* 26 */ OSSAN_STATE_DISCOUNT_DIALOG // Hylian Shield Discount
} EnOssanState;
typedef enum {
OSSAN_HAPPY_STATE_REQUEST_PAYMENT_KEATON_MASK,
OSSAN_HAPPY_STATE_REQUEST_PAYMENT_SPOOKY_MASK,
OSSAN_HAPPY_STATE_REQUEST_PAYMENT_SKULL_MASK,
OSSAN_HAPPY_STATE_REQUEST_PAYMENT_BUNNY_HOOD,
OSSAN_HAPPY_STATE_BORROWED_FIRST_MASK,
OSSAN_HAPPY_STATE_ANGRY, // Give me my money man!
OSSAN_HAPPY_STATE_ALL_MASKS_SOLD, // All masks have been sold
OSSAN_HAPPY_STATE_NONE = 8 // No Action / Payment received!
} EnOssanHappyMaskState;
#endif