#include "global.h"
#include "globaldata.h"
#include "code_8009804.h"
#include "code_8092334.h"
#include "game_options.h"

struct unkStruct_8094CB0
{
    u16 unk0;
    s16 unk2;
};

EWRAM_DATA_2 GameOptions *gGameOptionsRef = {0};
EWRAM_DATA GameOptions gGameOptions = {0};

void LoadGameOptions(void)
{
    gGameOptionsRef = &gGameOptions;
}

GameOptions * GetGameOptions(void)
{
    return &gGameOptions;
}

void InitializeGameOptions(bool8 initializeGender)
{
    gGameOptionsRef->windowColor = WINDOW_COLOR_BLUE;
    if(initializeGender)
    {
        gGameOptionsRef->playerGender = MALE;
    }
    gGameOptionsRef->unk9 = 0;
    gGameOptionsRef->unkA = 0;
    gGameOptionsRef->dungeonSpeed = DUNGEON_SPEED_SLOW;
    gGameOptionsRef->FarOffPals = FAROFFPALS_LOCK;
    gGameOptionsRef->damageTurn = TRUE;
    gGameOptionsRef->gridEnable = TRUE;
    gGameOptionsRef->mapOption = MAP_OPTION_CLEAR;
    gGameOptionsRef->unkC = 0;
    SetWindowBGColor();
}

bool8 GameOptionsNotChange(GameOptions *r0)
{
    if (gGameOptionsRef->windowColor != r0->windowColor)
        return FALSE;
    if (gGameOptionsRef->unk9 != r0->unk9)
        return FALSE;
    if (gGameOptionsRef->unkA != r0->unkA)
        return FALSE;
    if (gGameOptionsRef->playerGender != r0->playerGender)
        return FALSE;
    if (gGameOptionsRef->dungeonSpeed != r0->dungeonSpeed)
        return FALSE;
    if (gGameOptionsRef->FarOffPals != r0->FarOffPals)
        return FALSE;
    if (gGameOptionsRef->damageTurn != r0->damageTurn)
        return FALSE;
    if (gGameOptionsRef->gridEnable != r0->gridEnable)
        return FALSE;
    if (gGameOptionsRef->mapOption != r0->mapOption)
        return FALSE;
    if (gGameOptionsRef->unkC != r0->unkC)
        return FALSE;

    return TRUE;
}

void WriteGameOptionsBits(DataSerializer *param_1)
{
    u8 zero;
    u8 neg_1;
    u8 *puVar2;


    neg_1 = -1;
    zero = 0;

    WriteBits(param_1, &gGameOptionsRef->windowColor, 2);

    if(gGameOptionsRef->unk9 != 0)
    {
        puVar2 = &neg_1;
    }
    else
    {
        puVar2 = &zero;
    }
    WriteBits(param_1, puVar2, 1);

    if(gGameOptionsRef->unkA != 0)
    {
        puVar2 = &neg_1;
    }
    else
    {
        puVar2 = &zero;
    }
    WriteBits(param_1, puVar2, 1);

    if(gGameOptionsRef->playerGender != MALE)
    {
        puVar2 = &neg_1;
    }
    else
    {
        puVar2 = &zero;
    }
    WriteBits(param_1, puVar2, 1);

    if(gGameOptionsRef->dungeonSpeed != DUNGEON_SPEED_SLOW)
    {
        puVar2 = &neg_1;
    }
    else
    {
        puVar2 = &zero;
    }
    WriteBits(param_1, puVar2, 1);

    if(gGameOptionsRef->FarOffPals != FAROFFPALS_SELF)
    {
        puVar2 = &neg_1;
    }
    else
    {
        puVar2 = &zero;
    }
    WriteBits(param_1, puVar2, 1);

    if(gGameOptionsRef->damageTurn)
    {
        puVar2 = &neg_1;
    }
    else
    {
        puVar2 = &zero;
    }
    WriteBits(param_1, puVar2, 1);

    if(gGameOptionsRef->gridEnable)
    {
        puVar2 = &neg_1;
    }
    else
    {
        puVar2 = &zero;
    }
    WriteBits(param_1, puVar2, 1);

    WriteBits(param_1, &gGameOptionsRef->mapOption, NUM_GBA_MAP_OPTIONS);
    WriteBits(param_1, &gGameOptionsRef->unkC, 2);
}

void ReadGameOptionsBits(DataSerializer *param_1)
{
    u8 byteArray[4];
    ReadBits(param_1, byteArray, 2);
    gGameOptionsRef->windowColor  = byteArray[0] & NUM_WINDOW_COLORS;

    ReadBits(param_1, byteArray, 1);
    gGameOptionsRef->unk9  = byteArray[0] & 1;

    ReadBits(param_1, byteArray, 1);
    gGameOptionsRef->unkA  = byteArray[0] & 1;

    ReadBits(param_1, byteArray, 1);
    gGameOptionsRef->playerGender  = byteArray[0] & 1;

    ReadBits(param_1, byteArray, 1);
    gGameOptionsRef->dungeonSpeed  = byteArray[0] & 1;

    ReadBits(param_1, byteArray, 1);
    gGameOptionsRef->FarOffPals  = byteArray[0] & 1;

    ReadBits(param_1, byteArray, 1);
    gGameOptionsRef->damageTurn  = byteArray[0] & 1;

    ReadBits(param_1, byteArray, 1);
    gGameOptionsRef->gridEnable  = byteArray[0] & 1;

    ReadBits(param_1, byteArray, 3);
    gGameOptionsRef->mapOption  = byteArray[0] & NUM_DS_MAP_OPTIONS;

    ReadBits(param_1, byteArray, 2);
    gGameOptionsRef->unkC  = byteArray[0] & 3;

    SetWindowBGColor();
}

void SetWindowBGColor(void)
{
    struct RGB winColors[] = {
        {0x20, 0x48, 0x68}, // Blue
        {0x80, 0x38, 0x20}, // Red
        {0x28, 0x80, 0x48}, // Green
        {0x28, 0x80, 0x48} // Green
    };

    SetFontsBaseColor(winColors[gGameOptionsRef->windowColor & NUM_WINDOW_COLORS]);
}

bool8 sub_8094C48(void)
{
    switch(gGameOptionsRef->mapOption)
    {
        default:
            return TRUE;
        case TOP_TEAM_DATA_NO_BOTTOM:
        case TOP_MESSAGE_LOG_NO_BOTTOM:
            return FALSE;
    }
}

bool8 DoesNotHaveShadedMap(void)
{
    switch(gGameOptionsRef->mapOption)
    {
        default:
            return TRUE;
        case TOP_TEAM_DATA_SHADED_MAP_BOTTOM:
        case TOP_MESSAGE_LOG_SHADED_MAP_BOTTOM:
            return FALSE;
    }
}

void sub_8094C88(void)
{
    if (gGameOptionsRef->mapOption == 0 || gGameOptionsRef->mapOption == 1 || gGameOptionsRef->mapOption == 2)
        gGameOptionsRef->mapOption = 1;
    else if (gGameOptionsRef->mapOption == 3 || gGameOptionsRef->mapOption == 4 || gGameOptionsRef->mapOption == 5)
        gGameOptionsRef->mapOption = 4;
}

void sub_8094CB0(struct unkStruct_8094CB0 *r0)
{
    r0->unk0 = -1;
    r0->unk2 = -1;
}

void sub_8094CC0(struct unkStruct_8094CB0 *r0)
{
    r0->unk0 = -1;
    r0->unk2 = -1;
}

void sub_8094CD0(struct unkStruct_8094CB0 *r0)
{
    r0->unk0 = -1;
    r0->unk2 = -1;
}

void sub_8094CE0(struct unkStruct_8094CB0 *r0)
{
    r0->unk0 = -1;
    r0->unk2 = -1;
}

void sub_8094CF0(struct unkStruct_8094CB0 *r0)
{
    r0->unk0 = -1;
    r0->unk2 = -1;
}

void sub_8094D00(struct unkStruct_8094CB0 *r0)
{
    r0->unk0 = -1;
    r0->unk2 = -1;
}

u32 sub_8094D10(void)
{
    return 0;
}

u8 sub_8094D14(void)
{
    return 0;
}

u32 sub_8094D18(void)
{
    return 0;
}

u32 sub_8094D1C(void)
{
    return 0;
}

u32 sub_8094D20(void)
{
    return 0;
}

u32 sub_8094D24(void)
{
    return 0;
}

