kolibrios/programs/games/heliothryx/game/rs/rsplatform_kos.c

278 lines
7.7 KiB
C
Raw Normal View History

#include "rsplatform.h"
#include "../rsgame.h"
rs_app_t rs_app;
// set this macro to zero (0) if bug is fixed
#define FIX_MENUETOS_LEGACY_ONE_PIXEL_BORDER_GAP_BUG (-1)
// Fixed frame rate, set to 25
#define GAME_REQUIRED_FPS 25
//extern char PATH[256];
//extern char PARAM[256];
int window_width, window_height;
int fps = 0;
int dt = 1;
int draw_dt = 1;
int area_width = 160;
int area_height = 160;
int low_performance_counter = 0;
int logic_halted = 0;
int w_plus = 0;
#define BIT_SET(var,mask) { var |= (mask); }
#define BIT_CLEAR(var,mask) { var &= ~(mask); }
#define BIT_TOGGLE(var,mask) { var ^= (mask); }
#define IS_BIT_SET(var,mask) ( (var) & (mask) )
#define IS_BIT_CLEARED(var,mask) (!( (var) & (mask) ))
void BoardPuts(const char *s)
{
unsigned int i = 0;
while(*(s + i))
{
asm volatile ("int $0x40"::"a"(63), "b"(1), "c"(*(s + i)));
i++;
}
}
void board_write_integer(const char *s, int i) {
char tmp[16];
};
void kol_wnd_resize(unsigned w, unsigned h)
{
asm volatile ("int $0x40"::"a"(67), "b"(-1), "c"(-1), "d"(w), "S"(h));
}
void wnd_draw()
{
char tmp[] = "Fps:000 | Heliothryx Beta by Roman Shuvalov";
kol_paint_start();
tmp[4] = '0' + ( (fps/100) % 10 );
tmp[5] = '0' + ( (fps/10) % 10 );
tmp[6] = '0' + ( (fps) % 10 );
if (!logic_halted) {
kol_wnd_define(100, 100, window_width, window_height, 0x74ddddff, 0x34ddddff, "Heliothryx");
kol_wnd_caption(tmp);
GameProcess();
}
else {
kol_wnd_define(100, 100, window_width, window_height, 0x34ddddff, 0x34ddddff, "Heliothryx");
//kol_paint_bar(0, 0, window_width, window_height, 0xffffffff);
kol_paint_string(20, 20, "Performance is too low. Halted. ", 0x902222ff);
};
kol_paint_end();
}
/// ===========================================================
void kol_main()
{
BoardPuts("Hello, Heliothryx!\n");
int err;
int version =-1;
if((err = InitSound(&version)) !=0 ){
BoardPuts("Sound Error 1\n");
};
if( (SOUND_VERSION>(version&0xFFFF)) ||
(SOUND_VERSION<(version >> 16))){
BoardPuts("Sound Error 2\n");
}
unsigned event;
unsigned key;
unsigned key_up;
unsigned btn;
unsigned pos, x, y;
int gx, gy;
//srand(kol_system_time_get());
// kol_event_mask( 0xC0000027 ); // enable using of mouse
kol_event_mask(7); // keyboard only
kol_key_mode_set(1);
area_width = 640;
area_height = 360;
// Initializing variables
window_width = FIX_MENUETOS_LEGACY_ONE_PIXEL_BORDER_GAP_BUG + area_width + 10; // 2 x 5px border
window_height = FIX_MENUETOS_LEGACY_ONE_PIXEL_BORDER_GAP_BUG + kol_skin_height() + area_height + 5; // bottom 5px border
GameInit();
wnd_draw();
fps = 0;
unsigned int tick_start = kol_time_tick();
unsigned int tick_current = tick_start;
unsigned int tick_last = tick_start;
unsigned int fps_counter = 0;
int wait_time;
int already_drawn = 0;
float xf;
float xfs;
int xfs_i;
while (1) {
tick_last = tick_current;
tick_current = kol_time_tick();
dt = tick_current - tick_last;
tick_last = tick_current;
already_drawn = 0;
while (( event = kol_event_wait_time(1) )) {
switch (event) {
case 1:
wnd_draw(); // <--- need to clear event!
already_drawn = 1;
break;
case 2:
key = kol_key_get();
key = (key & 0xff00)>>8;
key_up = key & 0x80;
key = key & 0x7F;
if (!logic_halted) {
if (key_up) {
GameKeyUp(key);
}
else {
GameKeyDown(key);
};
};
break;
case 3:
switch ((kol_btn_get() & 0xff00)>>8)
{
case 1: // close button
kol_exit();
case 2: // 'new' button
//init_board();
//wnd_draw();
break;
}
break;
case 6:
btn = kol_mouse_btn(); // read mouse button
pos = kol_mouse_posw(); // read mouse position
x = pos / 65536;
y = pos % 65536;
if (x > window_width)
x=0;
if (y > window_height)
y=0;
break;
}
};
if (!already_drawn) {
wnd_draw();
};
fps_counter++;
tick_current = kol_time_tick();
if (tick_current > tick_start+100) {
fps = fps_counter;
fps_counter = 0;
tick_start += 100;
};
draw_dt = tick_current - tick_last;
wait_time = (100/GAME_REQUIRED_FPS) - draw_dt;
if (wait_time <= 0) {
wait_time = 1;
};
kol_sleep(wait_time);
if (draw_dt > 10) {
low_performance_counter++;
}
else {
low_performance_counter--;
if (low_performance_counter < 0) {
low_performance_counter = 0;
};
};
if (low_performance_counter > 6) {
logic_halted = 1;
window_width = 280;
window_height = 80;
kol_wnd_caption("Heliothryx");
kol_wnd_resize(window_width, window_height);
};
}
GameTerm();
kol_exit();
}