2015-02-27 22:11:47 +00:00
|
|
|
/* ReC98
|
|
|
|
* -----
|
|
|
|
* Include file for TH01
|
|
|
|
*/
|
|
|
|
|
2015-03-01 21:52:25 +00:00
|
|
|
#include "ReC98.h"
|
2015-02-27 22:11:47 +00:00
|
|
|
|
2015-03-11 22:29:58 +00:00
|
|
|
// Graphics
|
|
|
|
// --------
|
[C decompilation] [th01/reiiden] Randomly shaped VRAM copy functions, #1
So apparently, TH01 isn't double-buffered in the usual sense, and instead uses
the second hardware framebuffer (page 1) exclusively to keep the background
image and any non-animated sprites, including the cards. Then, in order to
limit flickering when animating the bullet, character and boss sprites on top
of that (or just to the limit number of VRAM accesses, who knows), ZUN goes to
great lengths and tries to make sure to only copy back the pixels that were
modified on plane 0 in the last frame.
(Which doesn't work that well though. When you play the game, you still notice
tons of flickering whenever sprites overlap.)
And by "great lengths", I mean "having a separate counterpart function for
each shape and sprite animated which recalculates and copies back the same
pixels from plane 1 to plane 0", because that's what the new functions here
lead me to believe. Both of them are only called at one place: the wave
function on the second half of Elis' entrance animation, and the horizontal
masked line function for Reimu's X attack animations.
2015-03-10 16:39:00 +00:00
|
|
|
void egc_copy_rect_1_to_0(int x, int y, int w, int h);
|
|
|
|
|
2020-01-10 20:25:29 +00:00
|
|
|
#include "th01/hardware/graph.h"
|
2015-03-11 22:29:58 +00:00
|
|
|
// --------
|
|
|
|
|
|
|
|
// master.lib text function reimplementations
|
|
|
|
// ------------------------------------------
|
|
|
|
typedef enum {
|
|
|
|
CURSOR_HIDE,
|
|
|
|
CURSOR_BLOCK,
|
|
|
|
CURSOR_UNDERLINE
|
|
|
|
} z_text_cursor_t;
|
|
|
|
|
|
|
|
void z_test_init(void);
|
|
|
|
void z_text_25line(void);
|
|
|
|
void z_text_20line(void);
|
|
|
|
void z_text_systemline_show(void);
|
|
|
|
void z_text_systemline_hide(void);
|
|
|
|
void z_text_clear(void);
|
|
|
|
void z_text_show(void);
|
|
|
|
void z_text_hide(void);
|
|
|
|
void z_text_setcursor(z_text_cursor_t type);
|
|
|
|
void z_text_print(const char *cmd);
|
|
|
|
// ----
|
2015-03-07 16:35:30 +00:00
|
|
|
|
|
|
|
// Game
|
|
|
|
#define STAGES_PER_SCENE 4
|
|
|
|
#define SCENE_COUNT 4
|
|
|
|
|
|
|
|
// Resident structure
|
|
|
|
#define RES_ID "ReiidenConfig"
|
|
|
|
|
|
|
|
typedef enum {
|
|
|
|
ROUTE_MAKAI,
|
|
|
|
ROUTE_JIGOKU
|
|
|
|
} route_t;
|
|
|
|
|
|
|
|
typedef enum {
|
|
|
|
MODE_REGULAR = 0,
|
|
|
|
MODE_TEST = 1,
|
|
|
|
MODE_DEBUG = 3
|
|
|
|
} mode_t;
|
|
|
|
|
|
|
|
#pragma option -a1
|
|
|
|
typedef struct {
|
|
|
|
char id[RES_ID_LEN];
|
|
|
|
char rank;
|
|
|
|
char bgm_mode; // 0 = off, 1 = FM
|
|
|
|
char bombs;
|
|
|
|
char start_lives_extra; // Add 2 for the actual number of lives
|
|
|
|
char end_flag;
|
|
|
|
char unused_1;
|
|
|
|
char route;
|
|
|
|
char rem_lives;
|
|
|
|
char snd_need_init;
|
|
|
|
char unused_2;
|
|
|
|
char mode;
|
|
|
|
int bullet_speed;
|
|
|
|
long rand;
|
|
|
|
long score;
|
|
|
|
long continues_total;
|
|
|
|
int continues_per_scene[SCENE_COUNT];
|
|
|
|
long bonus_per_stage[STAGES_PER_SCENE]; // of the current scene
|
|
|
|
int stage;
|
|
|
|
long hiscore;
|
|
|
|
long score_highest; // among all continues
|
|
|
|
unsigned int p_value;
|
|
|
|
} resident_t;
|
|
|
|
#pragma option -a2
|