#ifndef ENUMS_H
#define ENUMS_H

#include "sound_ids.h"
#include "sequence_ids.h"
#include "asset_enums.h"

/* All the enums defined here can be used in asset files */

// Alias for brevity.
typedef AssetLevelHeadersEnum MapId;

// There are a few instances of comparing MapId with special, negative values.
typedef enum SpecialMapId {
    SPECIAL_MAP_ID_UNK_NEG10 = -10,
    SPECIAL_MAP_ID_UNK_NEG2 = -2,
    SPECIAL_MAP_ID_NO_LEVEL = -1,
} SpecialMapId;

typedef enum Vehicle {
    VEHICLE_CAR,
    VEHICLE_HOVERCRAFT,
    VEHICLE_PLANE,

    NUMBER_OF_VEHICLE_TYPES
} Vehicle;

typedef enum CameraMode {
    CAMERA_CAR,
    CAMERA_PLANE,
    CAMERA_UNUSED,
    CAMERA_FIXED,
    CAMERA_HOVERCRAFT,
    CAMERA_FINISH_CHALLENGE,
    CAMERA_LOOP,
    CAMERA_FINISH_RACE
} CameraMode;

typedef enum Language {
    LANGUAGE_ENGLISH,
    LANGUAGE_GERMAN,
    LANGUAGE_FRENCH,
    LANGUAGE_JAPANESE
} Language;

typedef enum World {
    WORLD_NONE = -1, // This enum starts at -1 instead of 0.
    WORLD_CENTRAL_AREA,
    WORLD_DINO_DOMAIN,
    WORLD_SHERBET_ISLAND,
    WORLD_SNOWFLAKE_MOUNTAIN,
    WORLD_DRAGON_FOREST,
    WORLD_FUTURE_FUN_LAND
} World;

typedef enum RaceType {
    RACETYPE_DEFAULT           =  0,
    RACETYPE_HORSESHOE_GULCH   =  3,
    RACETYPE_HUBWORLD          =  5,
    RACETYPE_CUTSCENE_1        =  6, // Not sure what the difference between these two are.
    RACETYPE_CUTSCENE_2        =  7,
    RACETYPE_BOSS              =  8,
    RACETYPE_CHALLENGE         = 64, // For masking
    RACETYPE_CHALLENGE_BATTLE  = 64,
    RACETYPE_CHALLENGE_BANANAS = 65,
    RACETYPE_CHALLENGE_EGGS    = 66
} RaceType;

typedef enum HorizontalAlignmentFlags {
    HORZ_ALIGN_LEFT   = 0,
    HORZ_ALIGN_RIGHT  = 1,
    HORZ_ALIGN_CENTER = 4
} HorizontalAlignmentFlags;

typedef enum VerticalAlignmentFlags {
    VERT_ALIGN_TOP    = 0,
    VERT_ALIGN_BOTTOM = 2,
    VERT_ALIGN_MIDDLE = 8
} VerticalAlignmentFlags;

typedef enum AlignmentFlags {
    ALIGN_TOP_LEFT      = VERT_ALIGN_TOP    | HORZ_ALIGN_LEFT,
    ALIGN_TOP_CENTER    = VERT_ALIGN_TOP    | HORZ_ALIGN_CENTER,
    ALIGN_TOP_RIGHT     = VERT_ALIGN_TOP    | HORZ_ALIGN_RIGHT,
    ALIGN_MIDDLE_LEFT   = VERT_ALIGN_MIDDLE | HORZ_ALIGN_LEFT,
    ALIGN_MIDDLE_CENTER = VERT_ALIGN_MIDDLE | HORZ_ALIGN_CENTER,
    ALIGN_MIDDLE_RIGHT  = VERT_ALIGN_MIDDLE | HORZ_ALIGN_RIGHT,
    ALIGN_BOTTOM_LEFT   = VERT_ALIGN_BOTTOM | HORZ_ALIGN_LEFT,
    ALIGN_BOTTOM_CENTER = VERT_ALIGN_BOTTOM | HORZ_ALIGN_CENTER,
    ALIGN_BOTTOM_RIGHT  = VERT_ALIGN_BOTTOM | HORZ_ALIGN_RIGHT
} AlignmentFlags;

typedef enum MiscAsset {
    MISC_ASSET_UNK00,
    MISC_ASSET_UNK01,
    MISC_ASSET_UNK02,
    MISC_ASSET_UNK03,
    MISC_ASSET_UNK04,
    MISC_ASSET_UNK05,
    MISC_ASSET_UNK06,
    MISC_ASSET_UNK07,
    MISC_ASSET_UNK08,
    MISC_RACER_WEIGHT,
    MISC_RACER_HANDLING,
    MISC_ASSET_UNK0B,
    MISC_ASSET_UNK0C,
    MISC_ASSET_UNK0D,
    MISC_ASSET_UNK0E,
    MISC_ASSET_UNK0F,
    MISC_ASSET_UNK10,
    MISC_ASSET_UNK11,
    MISC_ASSET_UNK12,
    MISC_ASSET_UNK13,
    MISC_ASSET_UNK14,
    MISC_ASSET_SHIELD_DATA,
    MISC_ASSET_MAGNET_DATA,
    MISC_ASSET_UNK17,
    MISC_ASSET_UNK18,
    MISC_ASSET_UNK19,
    MISC_ASSET_UNK1A,
    MISC_ASSET_UNK1B,
    MISC_ASSET_UNK1C,
    MISC_ASSET_UNK1D,
    MISC_ASSET_UNK1E,
    MISC_ASSET_UNK1F,
    MISC_ASSET_UNK20,
    MISC_ASSET_UNK21,
    MISC_ASSET_UNK22,
    MISC_ASSET_UNK23,
    MISC_ASSET_UNK24,
    MISC_ASSET_UNK25,
    MISC_ASSET_UNK26,
    MISC_ASSET_UNK27,
    MISC_ASSET_UNK28,
    MISC_ASSET_UNK29,
    MISC_ASSET_UNK2A,
    MISC_ASSET_UNK2B,
    MISC_ASSET_UNK2C,
    MISC_ASSET_UNK2D,
    MISC_ASSET_UNK2E,
    MISC_ASSET_UNK2F,
    MISC_ASSET_UNK30,
    MISC_ASSET_UNK31,
    MISC_ASSET_UNK32,
    MISC_ASSET_UNK33,
    MISC_ASSET_UNK34,
    MISC_ASSET_UNK35,
    MISC_ASSET_UNK36,
    MISC_ASSET_UNK37,
    MISC_ASSET_UNK38,
    MISC_ASSET_UNK39,
    MISC_ASSET_UNK3A,
    MISC_ASSET_UNK3B,
    MISC_ASSET_UNK3C,
    MISC_ASSET_UNK3D,
    MISC_ASSET_UNK3E,
    MISC_ASSET_UNK3F,
    MISC_ASSET_UNK40,
    MISC_ASSET_UNK41,
    MISC_ASSET_UNK42,
    MISC_ASSET_UNK43,
    MISC_ASSET_UNK44,
    MISC_ASSET_UNK45,
    MISC_ASSET_UNK46,
    MISC_ASSET_UNK47,
    MISC_ASSET_UNK48,
    MISC_ASSET_UNK49,
    MISC_ASSET_UNK4A,
    MISC_ASSET_UNK4B,
    MISC_ASSET_UNK4C
} MiscAsset;

typedef enum SurfaceType {
    SURFACE_DEFAULT,
    SURFACE_GRASS,
    SURFACE_SAND,
    SURFACE_UNK03,
    SURFACE_STONE,
    SURFACE_UNK05,
    SURFACE_UNK06,
    SURFACE_UNK07,
    SURFACE_UNK08,
    SURFACE_UNK09,
    SURFACE_FROZEN_WATER,
    SURFACE_UNK0B,
    SURFACE_TAJ_PAD,
    SURFACE_SNOW,
    SURFACE_UNK0E,
    SURFACE_UNK0F,
    SURFACE_UNK10,
    SURFACE_INVIS_WALL,
    SURFACE_UNK12,

    SURFACE_NONE = 255
} SurfaceType;

#endif
