Subversion Repositories Kolibri OS

Rev

Rev 5261 | Rev 5310 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5225 alpine 1
#include "rsplatform.h"
5298 alpine 2
 
3
#include "../rsgame.h"
5243 alpine 4
 
5225 alpine 5
rs_app_t rs_app;
5243 alpine 6
 
7
 
8
 
9
 
5225 alpine 10
// set this macro to zero (0) if bug is fixed
11
#define FIX_MENUETOS_LEGACY_ONE_PIXEL_BORDER_GAP_BUG (-1)
5243 alpine 12
 
5225 alpine 13
// Fixed frame rate, set to 25
5243 alpine 14
#define GAME_REQUIRED_FPS 25
15
 
16
 
17
 
18
//extern char   PATH[256];
19
//extern char   PARAM[256];
20
 
5225 alpine 21
int window_width, window_height;
5243 alpine 22
 
5225 alpine 23
int fps = 0;
24
int dt = 1;
25
int draw_dt = 1;
26
int area_width = 160;
27
int area_height = 160;
5261 alpine 28
 
29
int low_performance_counter = 0;
30
 
31
int logic_halted = 0;
5243 alpine 32
 
5225 alpine 33
int w_plus = 0;
5243 alpine 34
 
35
 
36
 
37
 
38
 
5225 alpine 39
#define     BIT_SET(var,mask)   { var |= (mask); }
40
#define     BIT_CLEAR(var,mask) { var &= ~(mask); }
41
#define     BIT_TOGGLE(var,mask) { var ^= (mask); }
5243 alpine 42
 
5225 alpine 43
#define     IS_BIT_SET(var,mask)      ( (var) & (mask) )
44
#define     IS_BIT_CLEARED(var,mask)  (!( (var) & (mask) ))
5243 alpine 45
 
46
 
5225 alpine 47
void BoardPuts(const char *s)
48
{
5243 alpine 49
        unsigned int i = 0;
50
        while(*(s + i))
51
        {
52
                asm volatile ("int $0x40"::"a"(63), "b"(1), "c"(*(s + i)));
53
                i++;
54
        }
5225 alpine 55
}
5243 alpine 56
 
5225 alpine 57
void board_write_integer(const char *s, int i) {
5243 alpine 58
 
59
        char tmp[16];
60
 
61
 
62
 
5225 alpine 63
};
5243 alpine 64
 
65
 
5225 alpine 66
void kol_wnd_resize(unsigned w, unsigned h)
67
{
5243 alpine 68
        asm volatile ("int $0x40"::"a"(67), "b"(-1), "c"(-1), "d"(w), "S"(h));
5225 alpine 69
}
5243 alpine 70
 
71
 
72
 
73
 
5225 alpine 74
void wnd_draw()
75
{
5243 alpine 76
 
77
        char tmp[] = "Fps:000 | Heliothryx Beta by Roman Shuvalov";
78
 
79
        kol_paint_start();
80
 
81
        tmp[4] = '0' + ( (fps/100) % 10 );
82
        tmp[5] = '0' + ( (fps/10) % 10 );
83
        tmp[6] = '0' + ( (fps) % 10 );
84
 
5261 alpine 85
 
86
        if (!logic_halted) {
87
	        kol_wnd_define(100, 100, window_width, window_height, 0x74ddddff, 0x34ddddff, "Heliothryx");
88
	        kol_wnd_caption(tmp);
89
        	GameProcess();
90
        }
91
        else {
92
	        kol_wnd_define(100, 100, window_width, window_height, 0x34ddddff, 0x34ddddff, "Heliothryx");
93
	        //kol_paint_bar(0, 0, window_width, window_height, 0xffffffff);
94
        	kol_paint_string(20, 20, "Performance is too low. Halted. ", 0x902222ff);
95
        };
5243 alpine 96
 
97
        kol_paint_end();
98
 
5225 alpine 99
}
5243 alpine 100
 
101
 
102
 
103
 
5225 alpine 104
/// ===========================================================
5243 alpine 105
 
5225 alpine 106
void kol_main()
107
{
5243 alpine 108
 
109
        BoardPuts("Hello, Heliothryx!\n");
110
 
111
        int    err;
5225 alpine 112
    int    version =-1;
113
 
114
    if((err = InitSound(&version)) !=0 ){
115
        BoardPuts("Sound Error 1\n");
116
    };
117
 
118
    if( (SOUND_VERSION>(version&0xFFFF)) ||
119
        (SOUND_VERSION<(version >> 16))){
120
        BoardPuts("Sound Error 2\n");
121
    }
5243 alpine 122
 
123
 
124
        unsigned event;
125
        unsigned key;
126
        unsigned key_up;
127
 
128
        unsigned btn;
129
        unsigned pos, x, y;
130
        int gx, gy;
131
 
132
        //srand(kol_system_time_get());
133
 
134
        // kol_event_mask( 0xC0000027 ); // enable using of mouse
135
        kol_event_mask(7); // keyboard only
136
 
137
        kol_key_mode_set(1);
138
 
139
        area_width = 640;
140
        area_height = 360;
141
 
142
        // Initializing variables
143
        window_width = FIX_MENUETOS_LEGACY_ONE_PIXEL_BORDER_GAP_BUG + area_width + 10; // 2 x 5px border
144
        window_height = FIX_MENUETOS_LEGACY_ONE_PIXEL_BORDER_GAP_BUG + kol_skin_height() + area_height + 5; // bottom 5px border
145
 
146
 
147
        GameInit();
148
 
149
        wnd_draw();
150
 
151
        fps = 0;
152
 
153
        unsigned int tick_start = kol_time_tick();
154
        unsigned int tick_current = tick_start;
155
        unsigned int tick_last = tick_start;
156
 
157
        unsigned int fps_counter = 0;
158
        int wait_time;
159
        int already_drawn = 0;
160
 
161
        float xf;
162
        float xfs;
163
        int xfs_i;
164
 
165
        while (1) {
166
                tick_last = tick_current;
167
                tick_current = kol_time_tick();
168
                dt = tick_current - tick_last;
169
                tick_last = tick_current;
170
 
171
                already_drawn = 0;
172
 
173
                while (( event = kol_event_wait_time(1) )) {
174
 
175
                        switch (event) {
176
 
177
                                case 1:
178
                                        wnd_draw(); // <--- need to clear event!
179
                                        already_drawn = 1;
180
                                        break;
181
 
182
                                case 2:
183
                                        key = kol_key_get();
184
                                        key = (key & 0xff00)>>8;
185
                                        key_up = key & 0x80;
186
                                        key = key & 0x7F;
5261 alpine 187
 
188
                                        if (!logic_halted) {
5243 alpine 189
 
5261 alpine 190
		                                    if (key_up) {
5298 alpine 191
		                                            GameKeyUp(key);
5261 alpine 192
		                                    }
193
		                                    else {
194
		                                            GameKeyDown(key);
195
		                                    };
196
 
5243 alpine 197
                                        };
198
 
199
                                        break;
200
 
201
                                case 3:
202
                                        switch ((kol_btn_get() & 0xff00)>>8)
203
                                                {
204
                                                case 1: // close button
205
                                                        kol_exit();
206
                                                case 2: // 'new' button
207
                                                        //init_board();
208
                                                        //wnd_draw();
209
                                                        break;
210
                                                }
211
                                        break;
212
 
213
                                case 6:
214
                                        btn = kol_mouse_btn(); // read mouse button
215
                                        pos = kol_mouse_posw(); // read mouse position
216
                                        x = pos / 65536;
217
                                        y = pos % 65536;
218
                                        if (x > window_width)
219
                                                x=0;
220
                                        if (y > window_height)
221
                                                y=0;
222
 
223
 
224
                                        break;
225
                        }
226
 
227
                };
228
 
229
 
230
                if (!already_drawn) {
231
                        wnd_draw();
232
                };
233
 
234
 
235
                fps_counter++;
236
 
237
                tick_current = kol_time_tick();
238
 
239
                if (tick_current > tick_start+100) {
240
                        fps = fps_counter;
241
                        fps_counter = 0;
242
                        tick_start += 100;
243
                };
244
 
245
                draw_dt = tick_current - tick_last;
246
 
247
                wait_time = (100/GAME_REQUIRED_FPS) - draw_dt;
248
                if (wait_time <= 0) {
249
                        wait_time = 1;
250
                };
251
                kol_sleep(wait_time);
5261 alpine 252
 
253
                if (draw_dt > 10) {
254
                	low_performance_counter++;
255
                }
256
                else {
257
                	low_performance_counter--;
258
                	if (low_performance_counter < 0) {
259
                		low_performance_counter = 0;
260
                	};
261
                };
262
 
263
                if (low_performance_counter > 6) {
264
                	logic_halted = 1;
265
                	window_width = 280;
266
                	window_height = 80;
267
                	kol_wnd_caption("Heliothryx");
268
                	kol_wnd_resize(window_width, window_height);
269
                };
5243 alpine 270
 
271
 
272
        }
273
 
274
        GameTerm();
275
 
276
        kol_exit();
5225 alpine 277
}