forked from KolibriOS/kolibrios
212 lines
4.5 KiB
C
212 lines
4.5 KiB
C
|
#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 "rs/rsmx.h"
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
#define GAME_WIDTH 512
|
||
|
#define GAME_HEIGHT 512
|
||
|
|
||
|
|
||
|
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 0xFF660000
|
||
|
#define COLOR_DARK_GRAY 0xFF333344
|
||
|
#define COLOR_SILVER 0xFFCCCCDD
|
||
|
#define COLOR_SEMI_TRANSPARENT 0x80808080
|
||
|
|
||
|
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_MULT 3
|
||
|
|
||
|
#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);
|
||
|
void soundbuf_stop(rs_soundbuf_t *snd);
|
||
|
|
||
|
// Game Registry
|
||
|
|
||
|
#define FONTS_COUNT 4
|
||
|
#define CRYSTALS_COUNT 7
|
||
|
|
||
|
#define STATUS_LOADING 0
|
||
|
#define STATUS_MENU 1
|
||
|
#define STATUS_PLAYING 2
|
||
|
#define STATUS_PAUSED 3
|
||
|
|
||
|
|
||
|
#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 BULLETS_COUNT 8
|
||
|
|
||
|
#define GAME_SHOOT_PERIOD 3
|
||
|
|
||
|
#define FIELD_WIDTH 12
|
||
|
#define FIELD_HEIGHT 9
|
||
|
#define FIELD_LENGTH (FIELD_WIDTH * FIELD_HEIGHT)
|
||
|
#define CRYSTAL_SIZE 32
|
||
|
#define FIELD_X0 64
|
||
|
#define FIELD_Y0 128
|
||
|
#define FIELD_ITEM(x,y) (game.field[(y)*FIELD_WIDTH+(x)])
|
||
|
|
||
|
#define CRYSTAL_INDEX_MASK 0x0F
|
||
|
#define CRYSTAL_VISIBLE_BIT 0x10
|
||
|
#define CRYSTAL_EXPLODED_BIT 0x20
|
||
|
#define CRYSTAL_MOVING_BIT 0x40
|
||
|
|
||
|
#define EXPLOSION_FRAMES_COUNT 19
|
||
|
#define EXPLOSION_SIZE 64
|
||
|
|
||
|
#define EXPLOSIONS_MAX_COUNT 16
|
||
|
//#define EXPLOSION_PACK(x,y,frame) ( (x) | ( (y)<<8 ) | (frame)<<16 )
|
||
|
|
||
|
typedef struct rs_game_t {
|
||
|
rs_texture_t framebuffer;
|
||
|
unsigned char *scaled_framebuffer; // 24-bit BGRBGRBGR... for direct drawing
|
||
|
|
||
|
int loader_counter;
|
||
|
|
||
|
rs_texture_t tex_bg;
|
||
|
|
||
|
rs_texture_t tex_logo;
|
||
|
rs_texture_t tex_clouds;
|
||
|
|
||
|
rs_texture_t tex_crystals[CRYSTALS_COUNT];
|
||
|
rs_texture_t tex_cursor;
|
||
|
rs_texture_t tex_explosion[EXPLOSION_FRAMES_COUNT];
|
||
|
|
||
|
rs_texture_t tex_font[64*FONTS_COUNT];
|
||
|
|
||
|
rs_soundbuf_t sound_test1;
|
||
|
rs_soundbuf_t sound_test2;
|
||
|
rs_soundbuf_t sound_test3;
|
||
|
|
||
|
int status;
|
||
|
|
||
|
unsigned int keyboard_state;
|
||
|
|
||
|
int menu_index;
|
||
|
int menu_item_index;
|
||
|
|
||
|
int window_scale;
|
||
|
|
||
|
int tx;
|
||
|
int ty;
|
||
|
int tz;
|
||
|
|
||
|
unsigned char *field;
|
||
|
|
||
|
int selected;
|
||
|
unsigned char selected_x;
|
||
|
unsigned char selected_y;
|
||
|
|
||
|
unsigned int explosions_count;
|
||
|
unsigned int explosions[EXPLOSIONS_MAX_COUNT]; //0x00TTYYXX, TT = frame, YY = fieldY, XX = fieldX
|
||
|
|
||
|
int score;
|
||
|
int time;
|
||
|
|
||
|
|
||
|
} rs_game_t;
|
||
|
|
||
|
extern rs_game_t game;
|
||
|
void game_reg_init();
|
||
|
|
||
|
/* __
|
||
|
/cc\
|
||
|
/aaaa\
|
||
|
|kkkkkk| <-- Easter Egg
|
||
|
\eeee/
|
||
|
------------------------------- */
|
||
|
|
||
|
void GameProcess();
|
||
|
|
||
|
void game_ding(int i);
|
||
|
|
||
|
void GameInit();
|
||
|
void GameTerm();
|
||
|
|
||
|
void GameKeyDown(int key, int first);
|
||
|
void GameKeyUp(int key);
|
||
|
|
||
|
void GameMouseDown(int x, int y);
|
||
|
void GameMouseUp(int x, int y);
|
||
|
|
||
|
|
||
|
#endif // RSGAME_H_INCLUDED
|