kolibrios/programs/games/marblematch3/game/rsgame.h
alpine c5b22e42d3 Marble Match-3 game release candidate
git-svn-id: svn://kolibrios.org@5324 a494cfbc-eb01-0410-851d-a64ba20cac60
2014-12-31 12:40:51 +00:00

248 lines
5.1 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 11
#define FIELD_HEIGHT 8
#define FIELD_LENGTH (FIELD_WIDTH * FIELD_HEIGHT)
#define CRYSTAL_SIZE 40
#define FIELD_X0 36
#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 10
#define EXPLOSION_SIZE 64
#define EXPLOSIONS_MAX_COUNT 16
//#define EXPLOSION_PACK(x,y,frame) ( (x) | ( (y)<<8 ) | (frame)<<16 )
#define ANIMATION_PROCESS_TIMER_LIMIT 3
#define SOUND_EXPLOSION_COUNT 8
//#define GAME_MODE_MATCH3 0
//#define GAME_MODE_RAMPAGE 1
#ifdef RS_KOS
#define HISCORE_FILENAME "/sys/games/marble-hiscore.dat"
#else
#define HISCORE_FILENAME "marble-hiscore.dat"
#endif
typedef struct rs_game_t {
rs_texture_t framebuffer;
unsigned char *bgr_framebuffer; // 24-bit BGRBGRBGR... for direct drawing
int loader_counter;
rs_texture_t tex_bg;
rs_texture_t tex_bg_gameplay;
rs_texture_t tex_field;
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];
int sound_index;
rs_soundbuf_t sound_explosion[SOUND_EXPLOSION_COUNT];
rs_soundbuf_t sound_tick;
// rs_soundbuf_t sound_tack;
rs_soundbuf_t sound_click;
rs_soundbuf_t sound_bang;
int status;
// int game_mode;
int menu_replay_timeout;
unsigned int keyboard_state;
// int menu_index;
// int menu_item_index;
int process_timer;
int hiscore;
// 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 need_redraw;
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