blues/p2/resource.h

190 lines
3.8 KiB
C
Raw Normal View History

2019-05-29 01:54:47 +02:00
#ifndef RESOURCE_H__
#define RESOURCE_H__
#include "intern.h"
struct level_gate_t {
2019-06-01 15:24:36 +02:00
uint16_t enter_pos;
2019-05-29 01:54:47 +02:00
uint16_t tilemap_pos;
uint16_t dst_pos;
uint8_t scroll_flag;
2019-06-01 15:24:36 +02:00
};
2019-05-29 01:54:47 +02:00
2019-06-02 02:55:05 +02:00
struct level_column_t {
uint16_t tilemap_pos; /* current column tilemap pos */
2019-05-29 01:54:47 +02:00
uint8_t w;
uint8_t h;
2019-06-02 02:55:05 +02:00
uint16_t trigger_pos; /* compared with player pos */
uint16_t tiles_offset_buf;
uint8_t y_target; /* final y pos */
2019-05-29 01:54:47 +02:00
uint8_t unk9;
2019-06-01 15:24:36 +02:00
};
2019-05-29 01:54:47 +02:00
struct level_bonus_t {
uint8_t tile_num0; /* new tile */
uint8_t tile_num1; /* original tile */
uint8_t count;
2019-06-01 15:24:36 +02:00
uint16_t pos;
};
2019-05-29 01:54:47 +02:00
struct level_item_t {
int16_t x_pos, y_pos;
uint16_t spr_num;
int8_t y_delta;
2019-06-01 15:24:36 +02:00
};
2019-05-29 01:54:47 +02:00
2019-06-02 02:35:19 +02:00
struct level_platform_t {
2019-05-29 01:54:47 +02:00
uint16_t x_pos;
uint16_t y_pos;
uint16_t spr_num;
uint8_t flags;
2019-05-29 02:07:54 +02:00
union {
struct {
2019-06-02 01:47:35 +02:00
uint8_t y_velocity;
2019-05-29 02:07:54 +02:00
uint8_t unk8;
uint8_t unk9;
2019-06-01 15:24:36 +02:00
uint8_t state;
uint16_t y_delta;
uint8_t counter;
2019-05-29 02:07:54 +02:00
} type8;
struct {
2019-06-02 02:35:19 +02:00
int8_t max_velocity;
2019-05-29 02:07:54 +02:00
uint8_t unk9;
2019-06-02 02:35:19 +02:00
uint16_t unkA;
uint16_t counter;
int8_t velocity;
2019-05-29 02:07:54 +02:00
} other;
};
2019-06-01 15:24:36 +02:00
};
2019-05-29 01:54:47 +02:00
2019-05-29 02:42:39 +02:00
struct level_monster_t {
uint8_t len;
uint8_t type;
2019-06-01 15:24:36 +02:00
uint16_t spr_num;
uint8_t flags;
uint8_t energy;
2019-06-01 15:47:44 +02:00
uint8_t respawn_ticks;
2019-05-29 02:42:39 +02:00
uint8_t current_tick;
2019-06-01 15:44:23 +02:00
uint8_t score;
2019-06-01 15:24:36 +02:00
uint16_t x_pos;
uint16_t y_pos;
2019-05-29 02:42:39 +02:00
union {
struct {
2019-06-01 15:24:36 +02:00
uint8_t y_range;
int8_t unkE;
2019-05-29 02:42:39 +02:00
} type2;
2019-06-01 15:47:44 +02:00
struct {
uint8_t unkD;
} type3;
2019-05-29 02:49:50 +02:00
struct {
2019-06-01 15:24:36 +02:00
uint8_t radius;
2019-05-29 02:49:50 +02:00
uint8_t unkE;
uint8_t angle;
2019-06-02 01:47:35 +02:00
uint8_t angle_step;
2019-05-29 02:49:50 +02:00
} type4;
2019-06-01 16:25:06 +02:00
struct {
uint8_t x_range;
uint8_t y_range;
uint8_t unkF;
} type5;
struct {
uint8_t x_range;
const uint8_t *pos;
} type6;
2019-06-01 15:47:44 +02:00
struct {
uint8_t unkD;
uint8_t unkE;
} type7;
2019-05-29 02:42:39 +02:00
struct {
2019-06-01 15:24:36 +02:00
uint8_t x_range;
2019-06-01 15:44:23 +02:00
int8_t y_step;
int8_t x_step;
2019-06-01 15:24:36 +02:00
uint8_t y_range;
2019-05-29 02:42:39 +02:00
} type8;
2019-05-29 02:49:50 +02:00
struct {
2019-06-01 15:24:36 +02:00
int16_t unkD;
int16_t unkF;
2019-06-01 15:47:44 +02:00
int8_t x_step;
uint8_t x_dist;
2019-05-29 02:49:50 +02:00
} type9;
2019-06-01 15:24:36 +02:00
struct {
uint8_t unkD;
} type10;
2019-06-01 15:47:44 +02:00
struct {
uint8_t unkD;
uint8_t unkE;
uint8_t unkF;
} type11;
struct {
uint8_t unkD;
} type12;
2019-05-29 02:42:39 +02:00
};
};
2019-06-02 02:35:19 +02:00
#define MAX_LEVEL_GATES 20
2019-06-02 02:55:05 +02:00
#define MAX_LEVEL_COLUMNS 15
2019-06-02 02:35:19 +02:00
#define MAX_LEVEL_BONUSES 80
#define MAX_LEVEL_ITEMS 70
#define MAX_LEVEL_PLATFORMS 16
#define MAX_LEVEL_MONSTERS 150
2019-05-29 01:54:47 +02:00
struct level_t {
uint8_t tile_attributes0[256];
uint8_t tile_attributes1[256];
uint8_t tile_attributes2[256]; /* 0x80: animated, 0x40: front, 0x20: animate if player is on top */
uint8_t scrolling_top;
uint16_t start_x_pos;
uint16_t start_y_pos;
uint16_t tilemap_w;
uint16_t scrolling_mask; /* 4: screen scroll down 1 line, 2: no horizontal scrolling, 1: wider vertical scrolling */
uint16_t front_tiles_lut[256];
struct level_gate_t gates_tbl[MAX_LEVEL_GATES];
2019-06-02 02:55:05 +02:00
struct level_column_t columns_tbl[MAX_LEVEL_COLUMNS];
2019-05-29 02:42:39 +02:00
struct level_monster_t monsters_tbl[MAX_LEVEL_MONSTERS];
uint8_t monsters_count;
2019-05-29 01:54:47 +02:00
uint16_t items_spr_num_offset;
uint16_t monsters_spr_num_offset;
struct level_bonus_t bonuses_tbl[MAX_LEVEL_BONUSES];
uint8_t tile_attributes3[256];
struct level_item_t items_tbl[MAX_LEVEL_ITEMS];
2019-06-02 02:35:19 +02:00
struct level_platform_t platforms_tbl[MAX_LEVEL_PLATFORMS];
2019-06-02 01:47:35 +02:00
uint16_t boss_xmin;
uint16_t boss_xmax;
2019-06-02 02:55:05 +02:00
uint8_t boss_speed; /* 0..4 */
int16_t boss_energy;
2019-06-02 02:21:03 +02:00
uint8_t boss_state; /* !=255: has boss */
uint16_t boss_x_pos;
uint16_t boss_y_pos;
2019-05-29 01:54:47 +02:00
};
struct resource_t {
bool dos_demo;
uint8_t *maps;
uint8_t *motif;
uint8_t *allfonts;
uint8_t *sprites;
uint8_t *frontdat;
int frontlen;
uint8_t *uniondat;
int unionlen;
uint8_t *leveldat;
int levellen;
uint8_t *vga;
uint8_t *background;
struct level_t level, restart;
uint8_t *samples;
2019-06-01 16:25:06 +02:00
uint16_t spr_monsters_offset;
uint16_t spr_monsters_count;
2019-05-29 01:54:47 +02:00
};
extern struct resource_t g_res;
extern int g_uncompressed_size;
extern void res_init(const char *datapath, int vga_size);
extern void res_fini();
extern void load_leveldat(const uint8_t *data, struct level_t *level);
extern uint8_t *load_file(const char *filename);
#endif