2018-07-08 16:08:53 +02:00
|
|
|
|
|
|
|
#ifndef GAME_H__
|
|
|
|
#define GAME_H__
|
|
|
|
|
|
|
|
#include "intern.h"
|
|
|
|
|
2018-07-27 16:02:05 +02:00
|
|
|
#define GAME_SCREEN_W g_options.screen_w
|
|
|
|
#define GAME_SCREEN_H g_options.screen_h
|
2018-07-08 16:08:53 +02:00
|
|
|
|
|
|
|
#define TILEMAP_OFFSET_Y 14
|
2018-07-22 15:28:05 +02:00
|
|
|
#define TILEMAP_SCREEN_W GAME_SCREEN_W
|
|
|
|
#define TILEMAP_SCREEN_H (GAME_SCREEN_H - 40)
|
2018-08-12 14:27:20 +02:00
|
|
|
#define TILEMAP_SCROLL_W 64
|
2018-07-08 16:08:53 +02:00
|
|
|
|
|
|
|
#define PLAYER_JAKE 0
|
|
|
|
#define PLAYER_ELWOOD 1
|
|
|
|
|
|
|
|
#define MAX_DOORS 30
|
|
|
|
#define MAX_LEVELS 6
|
|
|
|
#define MAX_OBJECTS 41
|
|
|
|
|
|
|
|
#define SOUND_0 0
|
|
|
|
#define SOUND_2 2
|
|
|
|
#define SOUND_3 3
|
|
|
|
#define SOUND_4 4
|
|
|
|
#define SOUND_5 5
|
|
|
|
#define SOUND_6 6
|
|
|
|
#define SOUND_7 7
|
|
|
|
#define SOUND_8 8
|
|
|
|
#define SOUND_11 11
|
|
|
|
#define SOUND_12 12
|
|
|
|
#define SOUND_13 13
|
|
|
|
#define SOUND_14 14
|
|
|
|
#define SOUND_15 15
|
|
|
|
#define SOUND_16 16
|
|
|
|
|
2018-07-27 16:02:05 +02:00
|
|
|
#define CHEATS_NO_HIT (1 << 0)
|
|
|
|
#define CHEATS_UNLIMITED_LIFES (1 << 1)
|
|
|
|
#define CHEATS_UNLIMITED_ENERGY (1 << 2)
|
2018-07-08 16:08:53 +02:00
|
|
|
|
|
|
|
struct options_t {
|
|
|
|
uint32_t cheats;
|
|
|
|
int start_level;
|
|
|
|
int start_xpos16;
|
|
|
|
int start_ypos16;
|
2018-07-27 16:02:05 +02:00
|
|
|
int screen_w;
|
|
|
|
int screen_h;
|
2018-07-08 16:08:53 +02:00
|
|
|
bool amiga_copper_bars;
|
|
|
|
bool amiga_colors;
|
2018-07-20 15:51:02 +02:00
|
|
|
bool amiga_status_bar;
|
2018-08-12 14:27:20 +02:00
|
|
|
bool dos_scrolling;
|
2018-08-12 15:44:16 +02:00
|
|
|
bool cga_colors;
|
2018-07-08 16:08:53 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
extern struct options_t g_options;
|
|
|
|
|
|
|
|
struct door_t {
|
|
|
|
uint16_t src_x16, src_y16;
|
|
|
|
uint16_t dst_x16, dst_y16;
|
|
|
|
};
|
|
|
|
|
|
|
|
#define OBJECT_DIRECTION_RIGHT 1
|
|
|
|
#define OBJECT_DIRECTION_LEFT 2
|
|
|
|
|
|
|
|
#define OBJECT_DIRECTION_UP 1
|
|
|
|
|
|
|
|
#define OBJECT_NUM_PLAYER1 39
|
|
|
|
#define OBJECT_NUM_PLAYER2 40
|
|
|
|
|
|
|
|
#define OBJECT_ANIM_DEAD 18
|
|
|
|
|
|
|
|
#define OBJECT_GRAB_CRATE 0
|
|
|
|
#define OBJECT_GRAB_BALLOON 2
|
|
|
|
#define OBJECT_GRAB_UMBRELLA 8
|
|
|
|
|
|
|
|
struct object_t {
|
|
|
|
uint8_t type;
|
|
|
|
uint8_t anim_frame;
|
|
|
|
uint8_t anim_num;
|
|
|
|
const uint8_t **animframes_ptr;
|
|
|
|
uint8_t facing_left;
|
|
|
|
int16_t xvelocity;
|
|
|
|
int16_t yvelocity;
|
|
|
|
int16_t xmaxvelocity;
|
|
|
|
int16_t ymaxvelocity;
|
|
|
|
int16_t screen_xpos;
|
|
|
|
int16_t xpos;
|
|
|
|
int16_t screen_ypos;
|
|
|
|
int16_t ypos;
|
|
|
|
int16_t xacc;
|
|
|
|
int16_t yacc;
|
|
|
|
int16_t unk1C; // xvelocity / 8
|
|
|
|
int16_t unk1E; // yvelocity / 8
|
|
|
|
uint8_t direction_lr;
|
2018-07-12 13:21:15 +02:00
|
|
|
int8_t direction_ud;
|
2018-07-08 16:08:53 +02:00
|
|
|
int16_t xpos16; // tilemap_xpos
|
|
|
|
int16_t ypos16; // tilemap_ypos
|
|
|
|
// int16_t unk26;
|
|
|
|
int16_t floor_ypos16;
|
|
|
|
uint8_t yfriction;
|
|
|
|
uint8_t unk2B;
|
|
|
|
uint8_t sprite_type;
|
|
|
|
uint8_t unk2D; // xfriction
|
|
|
|
int16_t unk2E;
|
|
|
|
int8_t unk2F;
|
|
|
|
uint8_t op;
|
|
|
|
uint8_t grab_state; // 1:carry_crate
|
|
|
|
uint8_t grab_type;
|
|
|
|
uint8_t special_anim; // 2:flying
|
|
|
|
// uint8_t unk35;
|
|
|
|
int16_t player_xdist;
|
|
|
|
int16_t player_ydist;
|
|
|
|
uint8_t sprite3_counter;
|
|
|
|
uint8_t visible_flag;
|
|
|
|
uint8_t moving_direction; // 0:right 1:left
|
|
|
|
uint8_t unk3D; // 1:umbrella 2:balloon
|
|
|
|
uint8_t carry_crate_flag;
|
|
|
|
// int16_t unk3F;
|
|
|
|
// uint8_t unk41;
|
|
|
|
int16_t unk42;
|
|
|
|
uint8_t tile0_flags;
|
|
|
|
uint8_t tile1_flags;
|
|
|
|
uint8_t tile2_flags;
|
|
|
|
int16_t tile012_xpos;
|
|
|
|
int8_t elevator_direction; // -1,1
|
|
|
|
const uint8_t *trigger3;
|
2018-07-08 16:39:28 +02:00
|
|
|
uint8_t trigger3_num;
|
2018-07-08 16:08:53 +02:00
|
|
|
// int16_t unk4E;
|
|
|
|
int16_t unk50;
|
|
|
|
uint8_t data51; // health for obj39/40, horizontal direction for other objects
|
|
|
|
uint8_t unk53;
|
|
|
|
uint8_t unk54;
|
|
|
|
uint8_t unk55;
|
|
|
|
uint8_t unk56;
|
|
|
|
int16_t vinyls_count;
|
|
|
|
uint8_t collide_flag;
|
|
|
|
int16_t unk5A; // always zero
|
|
|
|
uint8_t unk5C;
|
|
|
|
uint8_t unk5D;
|
|
|
|
uint8_t blinking_counter;
|
|
|
|
uint8_t data5F; // music instrument number for obj39/40, counter for other objects
|
|
|
|
uint8_t unk60;
|
|
|
|
uint8_t lifes_count;
|
|
|
|
uint8_t flag_end_level; // level flag, set if music instrument was found
|
|
|
|
uint8_t unk63; // restart_level_flag
|
|
|
|
};
|
|
|
|
|
|
|
|
struct vars_t {
|
|
|
|
int level;
|
|
|
|
int player;
|
|
|
|
int start_level;
|
|
|
|
int16_t level_xpos[MAX_OBJECTS];
|
|
|
|
int16_t level_ypos[MAX_OBJECTS];
|
|
|
|
int screen_tilemap_w, screen_tilemap_h;
|
|
|
|
int screen_tilemap_xorigin, screen_tilemap_yorigin;
|
|
|
|
int screen_tilemap_xoffset, screen_tilemap_yoffset;
|
|
|
|
int screen_tilemap_size_w, screen_tilemap_size_h;
|
2018-08-12 14:27:20 +02:00
|
|
|
int screen_scrolling_dirmask;
|
2018-08-12 15:44:16 +02:00
|
|
|
uint16_t screen_tile_lut[128];
|
2018-07-27 16:02:05 +02:00
|
|
|
bool level_completed_flag;
|
|
|
|
bool play_level_flag;
|
|
|
|
bool game_over_flag;
|
|
|
|
bool found_music_instrument_flag;
|
|
|
|
bool player2_dead_flag;
|
|
|
|
bool player1_dead_flag;
|
|
|
|
bool player2_scrolling_flag;
|
|
|
|
bool play_demo_flag;
|
|
|
|
bool quit_level_flag;
|
|
|
|
bool two_players_flag;
|
2018-08-12 14:27:20 +02:00
|
|
|
bool switch_player_scrolling_flag;
|
2018-07-08 16:08:53 +02:00
|
|
|
int music_num;
|
|
|
|
uint8_t inp_keyboard[256];
|
2018-08-12 14:27:20 +02:00
|
|
|
bool inp_key_space;
|
|
|
|
bool inp_key_up;
|
|
|
|
bool inp_key_down;
|
|
|
|
bool inp_key_right;
|
|
|
|
bool inp_key_left;
|
|
|
|
bool inp_key_up_prev;
|
|
|
|
bool inp_key_down_prev;
|
2018-08-12 15:44:16 +02:00
|
|
|
bool inp_key_space_prev;
|
2018-07-08 16:08:53 +02:00
|
|
|
struct door_t doors[MAX_DOORS];
|
|
|
|
struct object_t objects[MAX_OBJECTS];
|
|
|
|
int vinyls_count;
|
2018-07-08 16:39:28 +02:00
|
|
|
uint16_t level_loop_counter;
|
2018-07-08 16:08:53 +02:00
|
|
|
int triggers_counter;
|
|
|
|
int update_objects_counter;
|
|
|
|
};
|
|
|
|
|
|
|
|
extern struct vars_t g_vars;
|
|
|
|
|
|
|
|
/* staticres.c */
|
|
|
|
extern const uint8_t animframe_00dd[];
|
|
|
|
extern const uint8_t animframe_0135[];
|
|
|
|
extern const uint8_t animframe_01d5[];
|
|
|
|
extern const uint8_t animframe_022d[];
|
|
|
|
extern const int16_t level_xpos_magasin[];
|
|
|
|
extern const int16_t level_ypos_magasin[];
|
|
|
|
extern const int16_t level_xpos_concert[];
|
|
|
|
extern const int16_t level_ypos_concert[];
|
|
|
|
extern const int16_t level_xpos_ville[];
|
|
|
|
extern const int16_t level_ypos_ville[];
|
|
|
|
extern const int16_t level_xpos_egou[];
|
|
|
|
extern const int16_t level_ypos_egou[];
|
|
|
|
extern const int16_t level_xpos_prison[];
|
|
|
|
extern const int16_t level_ypos_prison[];
|
|
|
|
extern const int16_t level_xpos_ent[];
|
|
|
|
extern const int16_t level_ypos_ent[];
|
|
|
|
extern const int16_t level_dim[];
|
|
|
|
extern const uint8_t level_door[];
|
|
|
|
extern const uint16_t level_tilemap_start_xpos[];
|
|
|
|
extern const uint16_t level_tilemap_start_ypos[];
|
|
|
|
extern const uint8_t level_objtypes[];
|
|
|
|
extern uint8_t level_data[];
|
|
|
|
extern const uint8_t *animframes_059d[];
|
|
|
|
extern uint16_t level_obj_w[MAX_OBJECTS];
|
|
|
|
extern uint16_t level_obj_h[MAX_OBJECTS];
|
|
|
|
extern const uint16_t level_obj_type[MAX_OBJECTS];
|
|
|
|
extern uint8_t *level_tilesdata_1e8c[];
|
|
|
|
|
|
|
|
/* game.c */
|
|
|
|
extern void update_input();
|
|
|
|
extern void game_main();
|
|
|
|
extern void do_title_screen();
|
|
|
|
extern void do_select_player();
|
|
|
|
|
|
|
|
/* level.c */
|
|
|
|
extern void load_level_data(int num);
|
|
|
|
extern void do_level_update_tile(int x, int y, int num);
|
|
|
|
extern void do_level_update_panel_lifes(struct object_t *);
|
|
|
|
extern void do_level_enter_door(struct object_t *);
|
|
|
|
extern void do_level_player_hit(struct object_t *);
|
|
|
|
extern void do_level_drop_grabbed_object(struct object_t *);
|
2018-07-12 13:21:15 +02:00
|
|
|
extern void do_level_update_projectile(struct object_t *obj);
|
2018-07-08 16:08:53 +02:00
|
|
|
extern void do_level();
|
|
|
|
|
|
|
|
/* opcodes.c */
|
|
|
|
extern void level_call_object_func(struct object_t *);
|
|
|
|
|
|
|
|
/* screen.c */
|
|
|
|
extern void screen_init();
|
2018-07-22 15:28:05 +02:00
|
|
|
extern void screen_clear_sprites();
|
2018-07-08 16:08:53 +02:00
|
|
|
extern void screen_add_sprite(int x, int y, int frame);
|
|
|
|
extern void screen_redraw_sprites();
|
|
|
|
extern void fade_in_palette();
|
|
|
|
extern void fade_out_palette();
|
|
|
|
extern void screen_adjust_palette_color(int color, int b, int c);
|
|
|
|
extern void screen_vsync();
|
2018-07-22 15:28:05 +02:00
|
|
|
extern void screen_draw_frame(const uint8_t *frame, int fh, int fw, int x, int y);
|
2018-07-08 16:08:53 +02:00
|
|
|
extern void screen_flip();
|
2018-08-12 14:27:20 +02:00
|
|
|
extern void screen_copy_img();
|
2018-07-08 16:08:53 +02:00
|
|
|
extern void screen_unk5();
|
|
|
|
extern void screen_do_transition1(int a);
|
2018-07-22 15:28:05 +02:00
|
|
|
extern void screen_do_transition2();
|
2018-07-08 16:08:53 +02:00
|
|
|
extern void screen_clear(int a);
|
2018-08-12 14:27:20 +02:00
|
|
|
extern void screen_draw_tile(int tile, int type, int x, int y);
|
2018-07-08 16:08:53 +02:00
|
|
|
extern void screen_draw_number(int num, int x, int y, int color);
|
|
|
|
extern void screen_add_game_sprite1(int x, int y, int frame);
|
|
|
|
extern void screen_add_game_sprite2(int x, int y, int frame);
|
|
|
|
extern void screen_add_game_sprite3(int x, int y, int frame, int blinking_counter);
|
|
|
|
extern void screen_add_game_sprite4(int x, int y, int frame, int blinking_counter);
|
2018-07-12 13:21:15 +02:00
|
|
|
extern void screen_load_graphics();
|
2018-07-08 16:08:53 +02:00
|
|
|
|
|
|
|
/* sound.c */
|
2018-07-22 15:28:05 +02:00
|
|
|
extern void sound_init();
|
2018-07-08 16:08:53 +02:00
|
|
|
extern void sound_fini();
|
|
|
|
extern void play_sound(int num);
|
|
|
|
extern void play_music(int num);
|
|
|
|
|
|
|
|
/* triggers.c */
|
|
|
|
extern uint16_t triggers_get_tile_type(int x, int y);
|
|
|
|
extern uint16_t triggers_get_next_tile_flags(int x, int y);
|
|
|
|
extern uint16_t triggers_get_tile_data(struct object_t *obj);
|
|
|
|
extern uint16_t triggers_get_next_tile_num(int x, int y);
|
|
|
|
extern void level_call_trigger_func(struct object_t *obj, int y);
|
2018-07-08 16:39:28 +02:00
|
|
|
extern void triggers_update_tiles1(struct object_t *obj);
|
2018-07-08 16:08:53 +02:00
|
|
|
extern int16_t triggers_get_dy(struct object_t *obj);
|
2018-07-08 16:39:28 +02:00
|
|
|
extern void triggers_update_tiles2(struct object_t *obj);
|
2018-07-08 16:08:53 +02:00
|
|
|
|
|
|
|
#endif /* GAME_H__ */
|