296 lines
5.4 KiB
C
296 lines
5.4 KiB
C
|
/*
|
||
|
* Overreact - Mr. 4th Dimention
|
||
|
* Allen Webster
|
||
|
* 03.21.2015 (mm.dd.yyyy)
|
||
|
*/
|
||
|
|
||
|
struct Memory_Block{
|
||
|
void *base;
|
||
|
i32 size, cursor;
|
||
|
};
|
||
|
|
||
|
struct Track{
|
||
|
Sound sound;
|
||
|
Track *next_free;
|
||
|
i32 sample_pos;
|
||
|
real32 sample_pos_dec;
|
||
|
real32 volume;
|
||
|
real32 bend;
|
||
|
bool32 playing;
|
||
|
bool32 looping;
|
||
|
i32 frames_delay;
|
||
|
};
|
||
|
|
||
|
enum Block_Type{
|
||
|
ERROR,
|
||
|
ZOMBIE,
|
||
|
HUMAN,
|
||
|
BRAIN,
|
||
|
AMMO,
|
||
|
BOMB,
|
||
|
WALL,
|
||
|
BLOCK_TYPE_COUNT
|
||
|
};
|
||
|
|
||
|
#define RIGHT 0
|
||
|
#define UP 1
|
||
|
#define LEFT 2
|
||
|
#define DOWN 3
|
||
|
|
||
|
#define ZOMBIE_TURN_THRESHOLD 360
|
||
|
|
||
|
Block_Type block_freq_table[] = {
|
||
|
ZOMBIE,
|
||
|
ZOMBIE,
|
||
|
ZOMBIE,
|
||
|
ZOMBIE,
|
||
|
HUMAN,
|
||
|
HUMAN,
|
||
|
HUMAN,
|
||
|
HUMAN,
|
||
|
HUMAN,
|
||
|
HUMAN,
|
||
|
BRAIN,
|
||
|
BRAIN,
|
||
|
BRAIN,
|
||
|
AMMO,
|
||
|
AMMO,
|
||
|
AMMO,
|
||
|
AMMO,
|
||
|
AMMO,
|
||
|
BOMB,
|
||
|
BOMB,
|
||
|
BOMB,
|
||
|
WALL,
|
||
|
WALL,
|
||
|
WALL,
|
||
|
WALL,
|
||
|
WALL
|
||
|
};
|
||
|
|
||
|
struct Entity{
|
||
|
Block_Type type;
|
||
|
i32 grid_x, grid_y;
|
||
|
real32 show_x, show_y;
|
||
|
bool32 active;
|
||
|
i32 facing;
|
||
|
bool32 firing;
|
||
|
i32 step_forward;
|
||
|
bool32 death_marked;
|
||
|
i32 infection_amount;
|
||
|
real32 wobble;
|
||
|
};
|
||
|
|
||
|
struct Spawn_Request{
|
||
|
Block_Type type;
|
||
|
i32 x, y;
|
||
|
bool32 random;
|
||
|
};
|
||
|
|
||
|
#define TEST_ORDER 0
|
||
|
|
||
|
struct Level_Data{
|
||
|
i32 min_score;
|
||
|
i32 fall_tick_time;
|
||
|
};
|
||
|
|
||
|
Level_Data levels[] = {
|
||
|
{0, 30},
|
||
|
{400, 26},
|
||
|
{1200, 22},
|
||
|
{2400, 18},
|
||
|
{3600, 15}
|
||
|
};
|
||
|
|
||
|
struct Particle{
|
||
|
i32 tex_index;
|
||
|
Vec2 pos, vel;
|
||
|
i32 life_counter;
|
||
|
real32 rot;
|
||
|
real32 rot_vel;
|
||
|
};
|
||
|
|
||
|
#define LIST_PRT_TYPES(m) \
|
||
|
m(prt_ammo); \
|
||
|
m(prt_blood); \
|
||
|
m(prt_bone); \
|
||
|
m(prt_brain); \
|
||
|
m(prt_human); \
|
||
|
m(prt_muzzle); \
|
||
|
m(prt_tnt); \
|
||
|
m(prt_wall); \
|
||
|
m(prt_zombie); \
|
||
|
m(prt_bullet)
|
||
|
|
||
|
struct Particle_Textures{
|
||
|
Render_Texture prt_ammo[5];
|
||
|
Render_Texture prt_blood[6];
|
||
|
Render_Texture prt_bone[6];
|
||
|
Render_Texture prt_brain[4];
|
||
|
Render_Texture prt_human[4];
|
||
|
Render_Texture prt_muzzle[2];
|
||
|
Render_Texture prt_tnt[5];
|
||
|
Render_Texture prt_wall[5];
|
||
|
Render_Texture prt_zombie[4];
|
||
|
Render_Texture prt_bullet[1];
|
||
|
};
|
||
|
|
||
|
struct Particle_Type{
|
||
|
i32 tex_count;
|
||
|
i32 first_tex_id;
|
||
|
};
|
||
|
|
||
|
struct App_Vars{
|
||
|
Memory_Block block;
|
||
|
Game_Input prev_input;
|
||
|
GJ_Context gj;
|
||
|
i32 table_id;
|
||
|
pcg32_random rnd;
|
||
|
|
||
|
Render_Texture background;
|
||
|
Render_Texture human[1][4];
|
||
|
Render_Texture zombie[1];
|
||
|
Render_Texture ammo;
|
||
|
Render_Texture brain;
|
||
|
Render_Texture bomb;
|
||
|
Render_Texture wall;
|
||
|
|
||
|
Render_Texture *prt_textures;
|
||
|
Particle_Type *prt_types;
|
||
|
i32 prt_type_count;
|
||
|
|
||
|
Particle particles[128];
|
||
|
i32 particle_count, particle_max;
|
||
|
|
||
|
#define DECL_INT(t) i32 t##_index
|
||
|
LIST_PRT_TYPES(DECL_INT);
|
||
|
#undef DECL_INT
|
||
|
|
||
|
Render_Texture scorename;
|
||
|
Render_Texture scoreback;
|
||
|
Render_Texture gameover;
|
||
|
Render_Texture shadow;
|
||
|
|
||
|
Render_Texture finish_button[2];
|
||
|
|
||
|
Render_Texture overreact;
|
||
|
Render_Texture title;
|
||
|
Render_Texture title_button;
|
||
|
Render_Texture controls;
|
||
|
|
||
|
Font font;
|
||
|
Font small_font;
|
||
|
|
||
|
Track music;
|
||
|
Track sfx_tracks[32];
|
||
|
Track *sfx_free;
|
||
|
|
||
|
Sound ammo_flip1;
|
||
|
Sound ammo_flip2;
|
||
|
Sound ammo_land;
|
||
|
Sound brains1;
|
||
|
Sound brains2;
|
||
|
Sound explosion;
|
||
|
Sound gun_shot;
|
||
|
Sound person_flip1;
|
||
|
Sound person_flip2;
|
||
|
Sound person_land;
|
||
|
Sound reload;
|
||
|
Sound soft_flip1;
|
||
|
Sound soft_flip2;
|
||
|
Sound soft_land1;
|
||
|
Sound soft_land2;
|
||
|
Sound wall_flip1;
|
||
|
Sound wall_flip2;
|
||
|
Sound wall_land;
|
||
|
Sound zombie_break;
|
||
|
Sound splat_death;
|
||
|
Sound score1;
|
||
|
Sound score2;
|
||
|
|
||
|
Sound menu_music;
|
||
|
Sound gameplay1;
|
||
|
Sound gameplay2;
|
||
|
|
||
|
bool32 song_done;
|
||
|
|
||
|
i32 silence_timer;
|
||
|
i32 fall_timer;
|
||
|
i32 refall_timer;
|
||
|
bool32 game_over;
|
||
|
i32 title_screen;
|
||
|
bool32 controls_screen;
|
||
|
|
||
|
bool32 need_new_block;
|
||
|
bool32 need_to_fill_gaps;
|
||
|
bool32 chain_reacting;
|
||
|
|
||
|
i32 level;
|
||
|
|
||
|
#define COMBO_TIME 20
|
||
|
|
||
|
i32 reaction_timer;
|
||
|
i32 fill_timer;
|
||
|
|
||
|
i32 score;
|
||
|
i32 nonsense_score;
|
||
|
|
||
|
i32 active_field;
|
||
|
i32 blink_timer;
|
||
|
|
||
|
char user_name[16];
|
||
|
i32 user_name_len;
|
||
|
|
||
|
char user_token[16];
|
||
|
i32 user_token_len;
|
||
|
|
||
|
char teaser_name[32];
|
||
|
char teaser_score[64];
|
||
|
i32 teaser_name_len;
|
||
|
i32 teaser_score_len;
|
||
|
bool32 looked_up_teaser;
|
||
|
|
||
|
#define WIDTH 6
|
||
|
#define HEIGHT 7
|
||
|
|
||
|
Entity entities[WIDTH*HEIGHT];
|
||
|
i32 entity_count, entity_max;
|
||
|
|
||
|
Spawn_Request spawns[16];
|
||
|
i32 spawn_count, spawn_max;
|
||
|
|
||
|
Entity *to_free[16];
|
||
|
i32 free_count, free_max;
|
||
|
|
||
|
Entity *grid[WIDTH*HEIGHT];
|
||
|
|
||
|
#if TEST_ORDER == 1
|
||
|
i32 test_type_i;
|
||
|
#endif
|
||
|
};
|
||
|
|
||
|
Grid_Pos right_shot[] = {
|
||
|
{1, 0},
|
||
|
{2, 0},
|
||
|
{3, 0}
|
||
|
};
|
||
|
|
||
|
Grid_Pos up_shot[] = {
|
||
|
{0, -1},
|
||
|
{0, -2},
|
||
|
{0, -3}
|
||
|
};
|
||
|
|
||
|
Grid_Pos left_shot[] = {
|
||
|
{-1, 0},
|
||
|
{-2, 0},
|
||
|
{-3, 0}
|
||
|
};
|
||
|
|
||
|
Grid_Pos down_shot[] = {
|
||
|
{0, 1},
|
||
|
{0, 2},
|
||
|
{0, 3}
|
||
|
};
|
||
|
|