#ifndef FOX_CO_H
#define FOX_CO_H

#define TEAM_HEAD_XROT (19)
#define TEAM_HEAD_YROT (20)

// Granga Boss:

#define DMG_FLICKER_5 (5)    // Damage indicator flickers for 5 frames
#define DMG_FLICKER_15 (15)  // Damage indicator flickers for 15 frames
#define DMG_DESTROYED (1000) // Damage part is destroyed

typedef enum GrangaStates {
    /* 0 */ GRANGA_STATIONARY,
    /* 1 */ GRANGA_FORWARD_MISSILE,        // walk forward + missile
    /* 2 */ GRANGA_BACKWARDS_LASER_PLASMA, // Walk backwards + lasers + plasma
    /* 3 */ GRANGA_FORWARD_LASER_PLASMA,   // Walk towards player + lasers + plasma
    /* 4 */ GRANGA_FORWARD,                // Walk forward
    /* 5 */ GRANGA_FALL_TO_LEFT,           // Falling from missing left leg
    /* 6 */ GRANGA_FALL_TO_RIGHT,          // Falling from missing right leg
    /* 7 */ GRANGA_EXPLODE,                // BOOM!
} GrangaStates;

typedef enum GrangaWork {
    /* 00 */ GRANGA_WORK_00, // x of missiles launched from it's right arm ?
    /* 01 */ GRANGA_WORK_01, // y of missiles launched from it's right arm ?
    /* 02 */ GRANGA_WORK_02, // z of missiles launched from it's right arm ?
    /* 03 */ GRANGA_WORK_03, // x of something // destroy effect related?
    /* 04 */ GRANGA_WORK_04, // y of something // destroy effect related?
    /* 05 */ GRANGA_WORK_05, // z of something // destroy effect related?
    /* 06 */ GRANGA_WORK_06, // x of missiles launched from it's left arm ?
    /* 07 */ GRANGA_WORK_07, // y of missiles launched from it's left arm ?
    /* 08 */ GRANGA_WORK_08, // z of missiles launched from it's left arm ?
    /* 09 */ GRANGA_WORK_09,
    /* 10 */ GRANGA_WORK_10,
    /* 11 */ GRANGA_WORK_11,
    /* 12 */ GRANGA_WORK_12,
    /* 13 */ GRANGA_WORK_13,
    /* 14 */ GRANGA_WORK_14,
    /* 15 */ GRANGA_WORK_15,
    /* 16 */ GRANGA_WORK_16,  // yRot of missiles launched from both arms ?
    /* 17 */ GRANGA_TARGET_X, // player.pos.x target position
    /* 18 */ GRANGA_TARGET_Y, // player.pos.y target position
    /* 19 */ GRANGA_TARGET_Z, // player.pos.trueZpos target position
    /* 20 */ GRANGA_WORK_20,
    /* 21 */ GRANGA_WORK_21,
    /* 22 */ GRANGA_WORK_22,
    /* 23 */ GRANGA_WORK_23,
    /* 24 */ GRANGA_WORK_24,
    /* 25 */ GRANGA_WORK_25,
    /* 26 */ GRANGA_WORK_26,
    /* 27 */ GRANGA_WORK_27,
    /* 28 */ GRANGA_WORK_28,
    /* 29 */ GRANGA_WORK_29,
    /* 30 */ GRANGA_WORK_30,
    /* 31 */ GRANGA_WORK_31,
    /* 32 */ GRANGA_WORK_32,
    /* 33 */ GRANGA_WORK_33,
    /* 34 */ GRANGA_WORK_34,
    /* 35 */ GRANGA_WORK_35,
    /* 36 */ GRANGA_WORK_36,
    /* 37 */ GRANGA_WORK_37,
    /* 38 */ GRANGA_WORK_38,
    /* 39 */ GRANGA_WORK_39,
    /* 40 */ GRANGA_WORK_40,
    /* 41 */ GRANGA_WORK_41,
    /* 42 */ GRANGA_WORK_42,
    /* 43 */ GRANGA_WORK_43,
    /* 44 */ GRANGA_WORK_44,
    /* 45 */ GRANGA_WORK_45,
    /* 46 */ GRANGA_WORK_46,
    /* 47 */ GRANGA_WORK_47,
    /* 48 */ GRANGA_WORK_48,
    /* 49 */ GRANGA_WORK_49,
    /* 50 */ GRANGA_WORK_50,
    /* 51 */ GRANGA_WORK_51,
    /* 52 */ GRANGA_WORK_52,
    /* 53 */ GRANGA_WORK_53,
    /* 54 */ GRANGA_WORK_54,
    /* 55 */ GRANGA_WORK_55,
    /* 56 */ GRANGA_WORK_56,
    /* 57 */ GRANGA_WORK_57,
    /* 58 */ GRANGA_WORK_58,
    /* 59 */ GRANGA_WORK_59,
    /* 60 */ GRANGA_WORK_60,
    /* 61 */ GRANGA_WORK_61,
    /* 62 */ GRANGA_WORK_62, // x
    /* 63 */ GRANGA_WORK_63, // y
    /* 64 */ GRANGA_WORK_64, // z
    /* 65 */ GRANGA_WORK_65,
    /* 66 */ GRANGA_WORK_66, // xTargetPos ?
    /* 67 */ GRANGA_WORK_67  // zTargetPos ?
} GrangaWork;

typedef enum GrangaSwork {
    /* 00 */ GRANGA_SWK_0,

    // Damage indicators, one per limb
    /* 01 */ GRANGA_RIGHT_ARM_DMG_IND,
    /* 02 */ GRANGA_LEFT_ARM_DMG_IND,
    /* 03 */ GRANGA_GUN_DMG_IND,
    /* 04 */ GRANGA_RIGHT_LEG_DMG_IND,
    /* 07 */ GRANGA_LEFT_LEG_DMG_IND = 7,
    /* 10 */ GRANGA_BACKPACK_DMG_IND = 10,

    /* 18 */ GRANGA_SWK_18 = 18,
    /* 19 */ GRANGA_SWK_19,
    /* 20 */ GRANGA_SWK_20,
    /* 21 */ GRANGA_SWK_21,
    /* 22 */ GRANGA_SWK_22,
    /* 23 */ GRANGA_SWK_23,

    /* 24 */ GRANGA_LEFT_LEG_HP,
    /* 25 */ GRANGA_RIGHT_LEG_HP,
    /* 26 */ GRANGA_LEFT_ARM_HP,
    /* 27 */ GRANGA_RIGHT_ARM_HP,
    /* 28 */ GRANGA_PLASMA_GUN_HP,
    /* 29 */ GRANGA_BACKPACK_HP,

    /* 30 */ GRANGA_ATTACK_STATE,
    /* 31 */ GRANGA_NEXT_STATE,
    /* 32 */ GRANGA_SWK_32,
    /* 33 */ GRANGA_INIT,
    /* 35 */ GRANGA_MISSILE_COUNT = 35,
    /* 36 */ GRANGA_1UP_CHECK
} GrangaSwork;

typedef enum GrangaFwork {
    /* 00 */ GRANGA_FWK_00, // left leg rock angle?
    /* 01 */ GRANGA_FWK_01,
    /* 02 */ GRANGA_FWK_02,
    /* 03 */ GRANGA_FWK_03,
    /* 04 */ GRANGA_FWK_04,
    /* 12 */ GRANGA_FWK_12 = 12,
    /* 13 */ GRANGA_FWK_13,
    /* 14 */ GRANGA_FWK_14,
} GrangaFwork;

typedef enum GrangaDmgParts {
    /* 0 */ GRANGA_DMG_BACKPACK,
    /* 1 */ GRANGA_DMG_LEFT_ARM,
    /* 2 */ GRANGA_DMG_RIGHT_ARM,
    /* 3 */ GRANGA_DMG_GUN,
    /* 4 */ GRANGA_DMG_LEFT_LEG,
    /* 5 */ GRANGA_DMG_RIGHT_LEG,
} GrangaDmgParts;

typedef enum GrangaAttackState {
    /* 0 */ GRANGA_ATTACK_IDLE,
    /* 1 */ GRANGA_ATTACK_MISSILES,
    /* 2 */ GRANGA_ATTACK_LASERS,
    /* 3 */ GRANGA_ATTACK_PLASMA,
} GrangaAttackState;

// Carrier Boss:

typedef enum CoCarrierParts {
    /* 0 */ CARRIER,       // Boss
    /* 1 */ CARRIER_LEFT,  // Left launch bay
    /* 2 */ CARRIER_UPPER, // Right upper launch bay
    /* 3 */ CARRIER_BOTTOM // Right lower launch bay
} CarrierParts;

typedef enum CoCarrierStates {
    /* 0 */ CARRIER_STATE_0,
    /* 1 */ CARRIER_STATE_1,
    /* 2 */ CARRIER_STATE_2, // positioning
    /* 3 */ CARRIER_STATE_3, // Close launch bays
    /* 4 */ CARRIER_STATE_4, // Open left launch bay
    /* 5 */ CARRIER_STATE_5, // open right launch bays
    /* 6 */ CARRIER_STATE_6,
    /* 7 */ CARRIER_STATE_7, // go around beam attack
    /* 8 */ CARRIER_STATE_8, // Dying
    /* 9 */ CARRIER_STATE_9, // Dying cutscene
    /* 10 */ CARRIER_EXPLODE // BOOM!
} CoCarrierStates;

#endif
