kolibrios/programs/games/heliothryx/game/rsgame.h

287 lines
5.5 KiB
C
Raw Permalink Normal View History

#ifndef RSGAME_H_INCLUDED
#define RSGAME_H_INCLUDED
/*
Heliothryx
Game by Roman Shuvalov
*/
#ifndef RS_LINUX
#ifndef RS_WIN32
#ifndef RS_KOS
#error Please specify platform
#endif
#endif
#endif
#include "rskos.h"
#include "rs/rsplatform.h"
#include "rs/rsdebug.h"
#include "rs/rsbits.h"
#include "rsgamelogic.h"
#include "rs/rsmx.h"
#define GAME_LANG_EN 0
#define GAME_LANG_RU 1
#define GAME_WIDTH 320
#define GAME_HEIGHT 180
typedef struct {
unsigned int status;
int w;
int h;
unsigned char *data; // BGRA BGRA
} rs_texture_t;
// for little-endian
typedef union color_t {
int d; // 0x44332211 (ARGB)
struct {
unsigned char b; // 0x11
unsigned char g; // 0x22
unsigned char r; // 0x33
unsigned char a; // 0x44
};
} color_t;
// for little-endian (ARGB)
#define COLOR_BLACK 0xFF000000
#define COLOR_TRANSPARENT 0x00000000
#define COLOR_DARK_RED 0xFF401000
void texture_init(rs_texture_t *tex, int w, int h);
void texture_free(rs_texture_t *tex);
void texture_clear(rs_texture_t *tex, unsigned int color);
void texture_draw(rs_texture_t *dest, rs_texture_t *src, int x, int y, int mode);
void texture_draw_vline(rs_texture_t *tex, int x, int y, int l, unsigned int color);
void texture_draw_hline(rs_texture_t *tex, int x, int y, int l, unsigned int color);
void texture_set_pixel(rs_texture_t *tex, int x, int y, unsigned int color);
unsigned char clamp_byte(int value);
#define DRAW_MODE_REPLACE 0
#define DRAW_MODE_ADDITIVE 1
#define DRAW_MODE_ALPHA 2
#define DRAW_MODE_MASK 0x0000FFFF
#define DRAW_TILED_FLAG 0x00010000
typedef struct {
unsigned int status;
int length_samples;
SNDBUF hbuf;
signed short *data;
} rs_soundbuf_t;
void soundbuf_init(rs_soundbuf_t *snd, int length);
void soundbuf_free(rs_soundbuf_t *snd);
void soundbuf_fill(rs_soundbuf_t *snd, int amp, int freq_div);
void soundbuf_sin(rs_soundbuf_t *snd, float freq);
void soundbuf_sin_fade(rs_soundbuf_t *snd, float freq);
void soundbuf_play(rs_soundbuf_t *snd, int mode);
void soundbuf_loop_check(rs_soundbuf_t *snd);
void soundbuf_stop(rs_soundbuf_t *snd);
// Game Objects
#define GAME_OBJS_MAX_COUNT 1024
#define OBJ_PLAYER 0
#define OBJ_BULLET 1
#define OBJ_EXPLOSION 2
#define OBJ_ROCK 3
#define OBJ_MINIROCK 4
#define OBJ_TURRET 5
#define OBJ_RED_BULLET 6
#define OBJ_HUGE_EXPLOSION 7
typedef struct game_obj_t {
int obj_type;
int flags;
int tag;
int radius;
float x;
float y;
int t;
float f;
} game_obj_t;
#define OBJ_FLAG_DESTROYED 0x01
#define OBJ_FLAG_ENEMY 0x02
#define OBJ_FLAG_SIN 0x04
#define OBJ_FLAG_BOSS 0x08 // draw health-bar above
game_obj_t game_obj(int obj_type, int flags, int tag, int radius, float x, float y, int t, float f);
int game_obj_add(game_obj_t obj);
void game_obj_remove(int index);
// Game Registry
#define ROCKS_COUNT 8
#define MINIROCKS_COUNT ROCKS_COUNT // must equal
#define FONTS_COUNT 4
#define EXPLOSIONS_COUNT 8
#define EXPLOSION_RADIUS 16
#define HUGE_EXPLOSIONS_COUNT 24
#define HUGE_EXPLOSION_RADIUS 32
#define STATUS_MENU 0
#define STATUS_PLAYING 1
#define STATUS_PAUSED 2
#define RS_ARROW_LEFT_MASK 0x01
#define RS_ARROW_DOWN_MASK 0x02
#define RS_ARROW_UP_MASK 0x04
#define RS_ARROW_RIGHT_MASK 0x08
#define RS_ATTACK_KEY_MASK 0x10
#define GAME_SHOOT_PERIOD 3
#define GAME_FLAG_BOSS_DESTROYED 0x01
#define GAME_FLAG_INSTRUCTIONS_PASSED 0x02
#define SOUND_EXPLOSIONS_COUNT 8
typedef struct rs_game_t {
rs_texture_t framebuffer;
unsigned char *scaled_framebuffer; // 24-bit BGRBGRBGR... for direct drawing
rs_texture_t tex;
rs_texture_t tex_clouds;
rs_texture_t tex_ground;
rs_texture_t tex_ship[4];
rs_texture_t tex_rocks[ROCKS_COUNT];
rs_texture_t tex_minirocks[MINIROCKS_COUNT];
rs_texture_t tex_explosions[EXPLOSIONS_COUNT];
rs_texture_t tex_huge_explosions[HUGE_EXPLOSIONS_COUNT];
rs_texture_t tex_font[64*FONTS_COUNT];
rs_texture_t tex_gui_line;
int bg_color;
rs_soundbuf_t sound_shoot;
rs_soundbuf_t sound_turret_shoot;
rs_soundbuf_t sound_test2;
rs_soundbuf_t sound_test3;
rs_soundbuf_t sound_explosions[SOUND_EXPLOSIONS_COUNT];
rs_soundbuf_t sound_hit;
rs_soundbuf_t sound_huge_explosion;
rs_soundbuf_t sound_music;
// rs_soundbuf_t sound_music2;
int status;
int flags;
unsigned int keyboard_state;
int menu_index;
int menu_item_index;
int window_scale;
int tz;
int player_x;
int player_y;
int shoot_delay;
int shoot_keypressed;
int shoot_restore_delay;
int health;
int ammo;
int score;
// int ammo_max;
int stage; // (wave)
int stage_timer;
int stage_level; // (stage)
game_obj_t *objs;
int objs_count;
} rs_game_t;
#define GAME_HEALTH_MAX 8
#define GAME_AMMO_MAX 24
extern rs_game_t game;
void game_reg_init();
/* __
/cc\
/aaaa\
|kkkkkk| <-- Easter Egg
\eeee/
------------------------------- */
void game_ding(int i);
void GameInit();
void GameTerm();
void GameKeyDown(int key);
void GameKeyUp(int key);
void GameMouseDown(int x, int y);
void GameMouseUp(int x, int y);
void game_change_window_scale(int d);
int is_key_pressed(int mask);
unsigned short rs_rand();
#endif // RSGAME_H_INCLUDED