/**************************************************************************** * Copyright (C) 2015-2017 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 . * ****************************************************************************/ /** * @file custom_specials.c * @author Sturmvogel * @date 15 dec 2016 * @brief Special 0x68 implementation to read from LASTRESULT and execute * */ /* === INCLUDES === */ #include "camera_move.h" #include "cutscene_meteor.h" #include #include /* === TYPES === */ typedef void (*special_func)(); /* === PROTOTYPES === */ /** * @brief test routine to switch dns */ void sp_dns_switch(); /** * @brief clear some flags at the beginning of the game */ void sp_init_script(); /** * @brief callasm to call a var-based routine as defined */ void sp_special_casm(); /** * @brief clears some variables at the end of a script */ void sp_clear_variables(); /** * @brief generate a random number, store in last result */ void sp_random_number(); extern void sp_batchmaptile(void); void get_text_pointer_from_lookup(); void sp_check_tileset(); void sp_set_rival(void); extern void sp_crystal_fade(void); extern pchar name_rival_male[5]; extern pchar name_rival_female[5]; /* === STATICS === */ static special_func special_routines[10] = { met_play, cam_sp_move_camera, sp_init_script, NULL, NULL, sp_random_number, sp_check_tileset, sp_batchmaptile, sp_crystal_fade, sp_set_rival, }; /* === IMPLEMENTATIONS === */ void sp_set_rival(void) { if (saveblock2->gender == GENDER_MALE) { pstrcpy(&(saveblock1->rival_name[0]), &name_rival_female[0]); } else { pstrcpy(&(saveblock1->rival_name[0]), &name_rival_male[0]); } } void sp_init_script() { for (u16 i = 0x1000; i < 0x1800; ++i) flag_clear(i); for (u16 i = 0x5000; i <= 0x5100; ++i) var_set(i, 0); } void sp_special_casm() // special 0x68 { u16 *var_special = var_access(CALLASM_VAR); special_routines[*var_special](); } void sp_clear_variables() { (void)var_set(MUGHSOT_1_TABLE, 0); (void)var_set(MUGHSOT_2_TABLE, 0); (void)var_set(MUGSHOT_1_X, 0); (void)var_set(MUGSHOT_2_X, 0); (void)var_set(MUGSHOT_1_Y, 0); (void)var_set(MUGSHOT_2_Y, 0); (void)var_set(TEXT_VAR, 0); return; } void sp_random_number() { var_set(0x800D, (rand() % var_load(0x8000))); }