/****************************************************************************
 * Copyright (C) 2015-2016 by the SotS Team                                 *
 *                                                                          *
 * This file is part of Sovereign of the Skies.                             *
 *                                                                          *
 *   Sovereign of the Skies is free software: you can redistribute it       *
 *   and/or modify it                                                       *
 *   under the terms of the GNU Lesser General Public License as published  *
 *   by the Free Software Foundation, either version 3 of the License, or   *
 *   (at your option) any later version provided you include a copy of the  *
 *   licence and this header.                                               *
 *                                                                          *
 *   Sovereign of the Skies is distributed in the hope that it will be      *
 *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty of *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
 *   GNU Lesser General Public License for more details.                    *
 *                                                                          *
 *   You should have received a copy of the GNU Lesser General Public       *
 *   License along with Sovereign of the Skies.                             *
 *   If not, see <http://www.gnu.org/licenses/>.                            *
 ****************************************************************************/

/**
 * @file custom_structs_malloc.c
 * @author Sturmvogel
 * @date 15 dec 2016
 * @brief Patch hacks for handling custom battle structures
 */

/* === INCLUDE === */

#include <battle_common.h>
#include <battle_custom_structs.h>
#include <battle_locations.h>
#include <config/core.h>
#include <constants/moves.h>
#include <game_engine.h>
#include <memory.h>

/* === PROTOTYPES === */

/**
 * @brief allocate the new battle struct memory
 */
void malloc_battle_structs();

/**
 * @brief free the new battle struct memory
 */
void free_battle_structs();

/**
 * @brief handle switch in uptates on structures
 */
void battle_switch_in();

/* === IMPLEMENTATIONS === */

void malloc_battle_structs() {
    custom_battle_elements.ptr = (struct custom_battle_struct *)malloc(sizeof(struct custom_battle_struct));
}

void free_battle_structs() {
    free(custom_battle_elements.ptr);
    custom_battle_elements.ptr = 0;
    flag_clear(FLAG_DEOXYS_AURA);
    flag_clear(FLAG_SKIP_BATTLE_MUSIC);
}

// hijack switch in command, clean up battle structs and carry over baton pass
void battle_switch_in() {
    struct bank_affecting *current_bank_affecting = &custom_battle_elements.ptr->bank_affecting[battle_active_bank];
    // copy of the old structure to carry over baton pass effects
    struct bank_affecting prev_bank_affecting = custom_battle_elements.ptr->bank_affecting[battle_active_bank];
    memset(current_bank_affecting, 0, sizeof(struct bank_affecting));
    // handle type 3 if needed
    current_bank_affecting->just_switched_in = 1;
    current_bank_affecting->wish_hp = prev_bank_affecting.wish_hp;
    if (battle_executed_move == MOVE_BATON_PASS) {
        current_bank_affecting->aqua_ring = prev_bank_affecting.aqua_ring;
        current_bank_affecting->embargo = prev_bank_affecting.embargo;
        current_bank_affecting->powertrick = prev_bank_affecting.powertrick;
        current_bank_affecting->gastro_acided = prev_bank_affecting.gastro_acided;
        current_bank_affecting->heal_block = prev_bank_affecting.heal_block;

        if (prev_bank_affecting.powertrick) {
            // carry over switched stats of power trick
            u16 *atk = &battle_participants[battle_active_bank].atk;
            u16 *def = &battle_participants[battle_active_bank].def;
            u16 switch_var = *atk;
            *atk = *def;
            *def = switch_var;
        }
    }

    struct side_affecting *active_side =
        &custom_battle_elements.ptr->side_affecting[get_side_from_bank(battle_active_bank)];
    active_side->stealth_rock_done = 0;
    active_side->sticky_web_done = 0;
    active_side->toxic_spikes_done = 0;
    active_side->lunardance_done = 0;

    return;
}
