/* ReC98 * ----- * Include file for TH02 */ #include "ReC98.h" #include "th01\ranks.h" // Formats #define PI_SLOTS 6 extern void far *pi_slot_buffers[PI_SLOTS]; extern PiHeader pi_slot_headers[PI_SLOTS]; void pi_slot_load(int slot, const char *fn); void pi_slot_palette_apply(int slot); void pi_slot_put(int x, int y, int slot); #define pi_load_put_free(slot, fn) \ pi_slot_load(slot, (fn)); \ pi_slot_palette_apply(slot); \ pi_slot_put(0, 0, slot); \ graph_pi_free(&pi_slot_headers[slot], pi_slot_buffers[slot]); // Hardware void graph_putsa_fx(int x, int y, int color, const char *str); // Gaiji characters /* ZUN messed up and swapped M and N in MIKOFT.BFT for both regular and bold * fonts. Therefore, other code shouldn't really use the straightforward * solution of just adding char literals to a defined start offset, as it may * suggest that this also works for M and N (which it doesn't). So... */ typedef enum { GB_DIGITS = 160, gb_0_ = GB_DIGITS, gb_1_, gb_2_, gb_3_, gb_4_, gb_5_, gb_6_, gb_7_, gb_8_, gb_9_, GB_LETTERS = 105, gb_A_ = GB_LETTERS + 'A', gb_B_, gb_C_, gb_D_, gb_E_, gb_F_, gb_G_, gb_H_, gb_I_, gb_J_, gb_K_, gb_L_, gb_M_ = GB_LETTERS + 'N', gb_N_ = GB_LETTERS + 'M', gb_O_ = GB_LETTERS + 'O', gb_P_, gb_Q_, gb_R_, gb_S_, gb_T_, gb_U_, gb_V_, gb_W_, gb_X_, gb_Y_, gb_Z_, gb_SP = 207, } gaiji_bold_t; typedef enum { gs_YINYANG = 2, // ☯ gs_BOMB, // ◉? ⦿? 🎯? 🖸? Or simply 💣? gs_BULLET = 218, // • gs_PERIOD, // . gs_EXCLAMATION, // ! gs_QUESTION, // ? gs_ELLIPSIS, // … gs_COPYRIGHT, // © gs_HEART, // 🎔 gs_SKULL, // 💀 gs_GHOST, // 👻 gs_SIDDHAM_HAM, // Siddhaṃ seed syllable HĀṂ (I don't even) gs_SPACE, // ␠ gs_ARROW_LEFT, // ← gs_ARROW_RIGHT, // → gs_END, // "End" gs_ALL = 240 // "All" } gaiji_symbols_t; typedef enum { INPUT_UP = 0x1, INPUT_DOWN = 0x2, INPUT_LEFT = 0x4, INPUT_RIGHT = 0x8, INPUT_SHOT = 0x10, INPUT_BOMB = 0x20, INPUT_CANCEL = 0x40, INPUT_OK = 0x80, INPUT_Q = 0x100, INPUT_UP_LEFT = 0x1000, INPUT_UP_RIGHT = 0x2000, INPUT_DOWN_LEFT = 0x4000, INPUT_DOWN_RIGHT = 0x8000 } input_t; extern input_t input; void input_sense(void); void pascal frame_delay(int frames); // Sound #include "libs\kaja\kaja.h" extern char snd_midi_active; extern char snd_midi_possible; void snd_kaja_func(kaja_func_t func); #define SND_LOAD_SONG (KAJA_GET_SONG_ADDRESS << 8) void snd_load(const char *fn, int func); void snd_se_reset(void); void snd_se_play(unsigned char se); void snd_se_update(void); // Music Room #define MUSIC_CMT_FILE "MUSIC.TXT" #define MUSIC_CMT_LINE_LEN 42 #define MUSIC_CMT_LINE_COUNT 20 // Resident structure typedef struct { char id[11]; // = "MIKOConfig" char stage; char debug; long score; int continues_used; char rem_bombs; char rem_lives; char rank; char start_power; char bgm_mode; char start_bombs; char start_lives; long frame; int unused_1; char unused_2; char op_main_retval; char perf; char unused_3; char shottype; char demo_num; int skill; int unused_4; long score_highest; } mikoconfig_t; extern mikoconfig_t *mikoconfig; #define SHOTTYPE_COUNT 3 // Highscores #define SCORE_PLACES 10 #define SCORE_NAME_LEN 6 /* excluding the terminating 0 */ #define EXTRA_CLEAR_FLAGS {1, 2, 4} #define GAME_CLEAR_CONSTANTS {318, 118, 218} #define STAGE_ALL 127 typedef struct { /* For ranks (and therefore, structure instances) #0, #1 and #2 (Easy, * Normal and Hard), this is either GAME_CLEAR_CONSTANTS[rank] or 0, * and indicates whether the main 5 stages have been cleared with the * *shot type* associated with the rank's index, in any difficulty. * Yes, ZUN uses a field in a rank-specific structure to store a * shot type-specific value. * * For rank #3, this is instead interpreted as a bit field using the * EXTRA_CLEAR_FLAGS to indicate whether the Extra Stage has been * cleared with the respective shot type. * Yes, ZUN stores what is technically information about the Extra * rank in the structure of the Lunatic rank. * * For rank #4, this field is unused. */ int cleared; long points[SCORE_PLACES]; long points_sum; unsigned char g_name[SCORE_PLACES][SCORE_NAME_LEN + 1]; unsigned char g_name_first_sum; unsigned char stage[SCORE_PLACES]; unsigned char stage_sum; struct date date[SCORE_PLACES]; unsigned char shottype[SCORE_PLACES]; } score_t; typedef struct { score_t score; long score_sum; // Sum of all bytes in score, pre-encraption } score_file_t; extern char cleared_game_with[SHOTTYPE_COUNT]; extern char cleared_extra_with[SHOTTYPE_COUNT];