From 378b5586ab07e788332b8df62c35b7fd59f0bc53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Nov=C3=A1k?= Date: Sun, 26 Jan 2025 15:03:44 +0100 Subject: [PATCH] import sdl, some tests, nothing work yet --- CMakeLists.txt | 9 ++ MAPS/MAPEDIT.C | 15 +- game/CMakeLists.txt | 28 +++- game/chargen.c | 53 +++---- game/dialogy.c | 2 +- game/enemy.c | 6 +- game/gamesave.c | 17 ++- game/globals.h | 3 +- game/globmap.c | 11 +- game/interfac.c | 34 +++-- game/kouzla.c | 2 +- game/macros.c | 3 +- game/menu.c | 22 ++- game/realgame.c | 2 +- game/setup.c | 8 +- game/skeldal.c | 17 ++- game/sndandmus.c | 16 ++- game/souboje.c | 11 +- game/temp_storage.cpp | 96 +++++++++++++ game/temp_storage.h | 2 +- libs/devices.c | 33 ++++- libs/event.c | 15 +- libs/event.h | 14 +- libs/event_macros.h | 30 ++++ libs/zvuk.h | 3 +- platform/CMakeLists.txt | 6 + platform/FCS_Tasker.h | 34 ----- platform/bios.h | 1 + platform/error.cpp | 9 ++ platform/error.h | 3 + platform/legacy_coroutines.cpp | 141 +++++++++++++++++++ platform/legacy_coroutines.h | 68 +++++++++ platform/sdl/CMakeLists.txt | 1 + platform/sdl/tests/CMakeLists.txt | 16 +++ platform/sdl/tests/sdl_fullscreen_window.cpp | 57 ++++++++ platform/sdl/tests/sdl_minimal_test.cpp | 27 ++++ platform/sdl/tests/sdl_surface_test.cpp | 73 ++++++++++ 37 files changed, 721 insertions(+), 167 deletions(-) create mode 100644 game/temp_storage.cpp create mode 100644 libs/event_macros.h create mode 100644 platform/CMakeLists.txt delete mode 100644 platform/FCS_Tasker.h create mode 100644 platform/error.cpp create mode 100644 platform/error.h create mode 100644 platform/legacy_coroutines.cpp create mode 100644 platform/legacy_coroutines.h create mode 100644 platform/sdl/CMakeLists.txt create mode 100644 platform/sdl/tests/CMakeLists.txt create mode 100644 platform/sdl/tests/sdl_fullscreen_window.cpp create mode 100644 platform/sdl/tests/sdl_minimal_test.cpp create mode 100644 platform/sdl/tests/sdl_surface_test.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 3b2d8cd..df53e06 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,16 @@ cmake_minimum_required(VERSION 3.28) project(skeldal) +# Najít SDL2 knihovnu +find_package(SDL2 REQUIRED) + + include_directories(platform libs) + + +include_directories( ${SDL2_INCLUDE_DIRS}) add_compile_options(-funsigned-char) +enable_testing() add_subdirectory(libs) +add_subdirectory(platform) add_subdirectory(game) diff --git a/MAPS/MAPEDIT.C b/MAPS/MAPEDIT.C index 9ef343c..5e04fea 100644 --- a/MAPS/MAPEDIT.C +++ b/MAPS/MAPEDIT.C @@ -42,7 +42,7 @@ char *script_name; extern word ikones; extern word boldcz; extern word font8x5; -word icone_color[7]={RGB555(8,8,8),RGB555(31,31,31),RGB555(0,0,15),RGB555(16,16,16),RGB555(0x1b,0x1b,0x1b)}; +word icone_color[7]={RGB555(8,8,8),RGB555(31,31,31),RGB555(0,0,15),RGB555(16,16,16),RGB555(0x1b,0x1b,0x1b)}; extern word sipka; static char *error_texts[]= { @@ -233,7 +233,7 @@ static word *p=NULL; const char *c=get_text_field(config_file,"MAPEDIT_WINDOW"); int scale = 1; - if (c != 0) + if (c != 0) { int x,y; if (sscanf(c,"%dx%d",&x,&y) == 2 && x>=640 && y>=480) @@ -301,7 +301,8 @@ static void key_test(va_list args) word c; do { - c=*(word *)task_wait_event(E_KEYBOARD); + EVENT_MSG *msg = task_wait_event(E_KEYBOARD); + c=va_arg(msg->data,unsigned int); } while ((c & 0xff)!='!'); puts("\x7"); @@ -685,7 +686,7 @@ void load_background() { FILE *f; long siz; - + if (gui_background!=NULL) { free(gui_background); @@ -878,7 +879,7 @@ int main(int argc,char *argv[]) TSTR_LIST adv_cfg=read_config(filename); config_file=merge_configs(config_file,adv_cfg); filename[0]=0; - } + } sample_path=get_text_field(config_file,"CESTA_ZVUKY"); if (sample_path==NULL) sample_path=""; mob_dir=get_text_field(config_file,"CESTA_ENEMY"); @@ -886,7 +887,7 @@ int main(int argc,char *argv[]) init_sound(); init(); - concat(mask,get_text_field(config_file,"CESTA_MAPY"),"*.map"); + concat(mask,get_text_field(config_file,"CESTA_MAPY"),"*.map"); atexit(shut_down); // signal(SIGABRT,shut_down); init_mob_list(); @@ -973,4 +974,4 @@ int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLi int GetExeVersion() { return MAPEDIT_NVERSION; - } \ No newline at end of file + } diff --git a/game/CMakeLists.txt b/game/CMakeLists.txt index 6f51955..2bb4b75 100644 --- a/game/CMakeLists.txt +++ b/game/CMakeLists.txt @@ -1,5 +1,27 @@ -SET(files automap.c clk_map.c dialogy.c dump.cpp enemy.c engine2.c globmap.c inv.c kouzla.c menu.c skeldal.c souboje.c -builder.c engine1.c gamesave.c interfac.c kniha.c macros.c realgame.c setup.c sndandmus.c specproc.c) +SET(files automap.c +clk_map.c +dialogy.c +dump.cpp +enemy.c +engine2.c +globmap.c +inv.c +kouzla.c +menu.c +skeldal.c +souboje.c +builder.c +engine1.c +gamesave.c +interfac.c +kniha.c +macros.c +realgame.c +setup.c +chargen.c +sndandmus.c +specproc.c +temp_storage.cpp) add_executable(skeldal ${files}) -target_link_libraries(skeldal skeldal_libs) +target_link_libraries(skeldal skeldal_libs skeldal_platform_libs ${SDL2_LIBRARIES} pthread) diff --git a/game/chargen.c b/game/chargen.c index c350b9e..7e4b550 100644 --- a/game/chargen.c +++ b/game/chargen.c @@ -24,7 +24,7 @@ void display_items_wearing(THUMAN *h); void inv_display_vlastnosti();; -extern void (*inv_redraw)(); +extern void (*inv_redraw)(char); void write_human_big_name(char *c); #define MSG_COLOR1 RGB555(30,30,23) @@ -123,16 +123,16 @@ char *error_text=NULL; -char select_xicht(int id,int xa,int ya,int xr,int yr); -char vol_vlastnosti(int id,int xa,int ya,int xr,int yr); -char go_next_page(int id,int xa,int ya,int xr,int yr); +static char select_xicht(int id,int xa,int ya,int xr,int yr); +static char vol_vlastnosti(int id,int xa,int ya,int xr,int yr); +static char go_next_page(int id,int xa,int ya,int xr,int yr); char vls_click(int id,int xa,int ya,int xr,int yr); -char view_another_click2(int id,int xa,int ya,int xr,int yr); +static char view_another_click2(int id,int xa,int ya,int xr,int yr); //char edit_another_click(int id,int xa,int ya,int xr,int yr); -char edit_another_click2(int id,int xa,int ya,int xr,int yr); -char gen_exit_editor(int id,int xa,int ya,int xr,int yr); +//static char edit_another_click2(int id,int xa,int ya,int xr,int yr); +static char gen_exit_editor(int id,int xa,int ya,int xr,int yr); -void zobraz_staty(T_VLASTS *st); +static void zobraz_staty(T_VLASTS *st); #define CLK_PAGE1 6 @@ -513,9 +513,9 @@ static void edit_name() static void stop_edit_name() { shut_downing_text=1;send_message(E_KEYBOARD,13); - task_sleep(NULL); + task_sleep(); if (edit_task>0 && is_running(edit_task)) - shut_down_task(edit_task); + term_task(edit_task); shut_downing_text=0; } @@ -623,7 +623,7 @@ void generuj_postavu(THUMAN *h) //postava je vygenerovana } -static void redraw_page3() +static void redraw_page3(char) { update_mysky(); schovej_mysku(); @@ -639,7 +639,7 @@ static void redraw_page3() } -static void redraw_svitek() +static void redraw_svitek(char) { if (postavy[cur_edited].bonus==0) { @@ -649,7 +649,7 @@ static void redraw_svitek() if (!postavy[charmax-1].used) mode&=~1; if (!del_mode) mode&=~4; b_disables=mode; - redraw_page3(); + redraw_page3(0); return; } update_mysky(); @@ -694,13 +694,13 @@ static void empty_proc() { } -char potvrzeno(char *text,void (*redraw)()) +char potvrzeno(char *text,void (*redraw)(char)) { int i; unwire_proc=empty_proc; stop_edit_name(); i=message(2,0,1,texty[118],text,texty[114],texty[115])==0; - redraw(); + redraw(0); edit_name(); return i; } @@ -721,7 +721,7 @@ static char view_another_click2(int id,int xa,int ya,int xr,int yr) human_selected=postavy+id; cur_edited=id; edit_name(); - redraw_page3(); + redraw_page3(0); if (del_mode) if (potvrzeno(texty[117],redraw_page3)) { @@ -764,15 +764,14 @@ static void enter_reaction(EVENT_MSG *msg,void **unused) } } -static void enter_reaction2(EVENT_MSG *msg,void **unused) +static void enter_reaction2(EVENT_MSG *msg,void **) { - unused; - int c = va_arg(msg->data, int) + int c = va_arg(msg->data, int); if (msg->msg==E_KEYBOARD && c==13 && !shut_downing_text && ~b_disables & 0x3) { send_message(E_KEYBOARD,13); bott_draw(1); - redraw_page3(); + redraw_page3(0); msg->msg=-1; } } @@ -787,7 +786,7 @@ char gen_exit_editor(int id,int xa,int ya,int xr,int yr) del_mode=0; mouse_set_default(H_MS_DEFAULT); b_disables&=~0x4; - redraw_svitek(); + redraw_svitek(0); return 1; } unwire_proc=empty_proc; @@ -799,7 +798,7 @@ char gen_exit_editor(int id,int xa,int ya,int xr,int yr) else { if (id==2)redraw_generator(1); - else redraw_svitek(); + else redraw_svitek(0); edit_name(); } return 1; @@ -841,7 +840,8 @@ char enter_generator() do { send_message(E_ADD,E_KEYBOARD,enter_reaction); - i=*(char *)task_wait_event(E_CLOSE_GEN); + EVENT_MSG *ev= task_wait_event(E_CLOSE_GEN);; + i=va_arg(ev->data, int); send_message(E_DONE,E_KEYBOARD,enter_reaction); if (i==3 && potvrzeno(texty[116],redraw_generator)) goto znova; if (i==255) return 1; @@ -857,12 +857,13 @@ char enter_generator() b_disables=0x7; do { - redraw_svitek(); + redraw_svitek(0); change_click_map(clk_page2,CLK_PAGE2); do { send_message(E_ADD,E_KEYBOARD,enter_reaction2); - i=*(char *)task_wait_event(E_CLOSE_GEN); + EVENT_MSG *ev= task_wait_event(E_CLOSE_GEN);; + i=va_arg(ev->data, int); send_message(E_DONE,E_KEYBOARD,enter_reaction2); if (i==3 && potvrzeno(texty[116],redraw_svitek)) goto znova; if (i==2) @@ -870,7 +871,7 @@ char enter_generator() del_mode=1; mouse_set_default(H_MS_WHO); b_disables|=0x4; - redraw_svitek(); + redraw_svitek(0); i=3; } } diff --git a/game/dialogy.c b/game/dialogy.c index 0638c72..c7a4e4b 100644 --- a/game/dialogy.c +++ b/game/dialogy.c @@ -170,7 +170,7 @@ static void dialog_anim(va_list args) anm=open_mgif(aptr); while (anm!=NULL && task_quitmsg()) { - task_sleep(NULL); + task_sleep(); if (!spdc) { if (ms_last_event.x<=PIC_X+320 && ms_last_event.y<=PIC_Y+180) diff --git a/game/enemy.c b/game/enemy.c index a28b422..9b72355 100644 --- a/game/enemy.c +++ b/game/enemy.c @@ -142,12 +142,10 @@ int load_enemy_paths(TMPFILE_RD *f) return 0; } -static EVENT_PROC(mob_reload) - { +static void mob_reload(EVENT_MSG *msg,void **){ static int counter=0; - user_ptr; - WHEN_MSG(E_KOUZLO_KOLO) + if (msg->msg = E_KOUZLO_KOLO) { if (insleep) return; if (counter++==10) diff --git a/game/gamesave.c b/game/gamesave.c index 68e01de..3a28995 100644 --- a/game/gamesave.c +++ b/game/gamesave.c @@ -888,7 +888,7 @@ static void load_specific_file(int slot_num,char *filename,void **out,int32_t *s fread(fname,1,12,slot); while(fname[0] && !succes) { - task_sleep(NULL); + task_sleep(); if (task_quitmsg()) break; fread(&siz,1,4,slot); if (!strncmp(fname,filename,12)) succes=1; else @@ -1113,10 +1113,9 @@ char updown_scroll(int id,int xa,int ya,int xr,int yr); static char updown_noinst=0; -static EVENT_PROC(updown_scroll_hold) +static void updown_scroll_hold(EVENT_MSG *msg,void **) { - user_ptr; - WHEN_MSG(E_MOUSE) + if (msg->msg == E_MOUSE) { MS_EVENT *ms; @@ -1128,7 +1127,7 @@ static EVENT_PROC(updown_scroll_hold) updown_noinst=0; } } - WHEN_MSG(E_TIMER) + if (msg->msg == E_TIMER) { MS_EVENT *ms; @@ -1382,12 +1381,12 @@ T_CLK_MAP clk_save[]= {-1,0,0,639,479,close_saveload,9,H_MS_DEFAULT}, }; -static EVENT_PROC(saveload_keyboard) +static void saveload_keyboard(EVENT_MSG *msg,void **) { - user_ptr; - WHEN_MSG(E_KEYBOARD) + if (msg->msg == E_KEYBOARD) { - switch (GET_DATA(word)>>8) + int v = va_arg(msg->data, int); + switch (v>>8) { case 1:unwire_proc();wire_proc();break; case 'H':if (last_select>0) bright_slot((last_select-1)*SLOT_SPACE+1);break; diff --git a/game/globals.h b/game/globals.h index 71d64e7..31501eb 100644 --- a/game/globals.h +++ b/game/globals.h @@ -1386,7 +1386,8 @@ void init_tracks(); void recalc_volumes(int sector,int side); void play_effekt(int x,int y,int xd,int yd,int side,int sided,TMA_SOUND *p); void create_playlist(char *playlist); -void play_next_music(char **c); +const char *get_next_music_from_playlist(); +const char * end_of_song_callback(void *ctx); void purge_playlist(); void restore_sound_names(); void play_sample_at_sector(int sample,int sector1,int sector2,int track, char loop); diff --git a/game/globmap.c b/game/globmap.c index 22f904b..830cf41 100644 --- a/game/globmap.c +++ b/game/globmap.c @@ -495,17 +495,16 @@ static char *fly_text; static int fly_x,fly_y,fly_xs,fly_ys; static void *fly_background; -EVENT_PROC(global_map_point) +void global_map_point(EVENT_MSG *msg,void **) { MS_EVENT *ms; - user_ptr; - WHEN_MSG(E_INIT) + if(msg->msg == E_INIT) { fly_background=NULL;last_index=0;fly_text=NULL; fly_x=0;fly_y=0;fly_xs=4;fly_ys=4; } - WHEN_MSG(E_MOUSE) + if(msg->msg == E_MOUSE) { int x,y,i,xs,ys; char *ptr; @@ -561,7 +560,7 @@ EVENT_PROC(global_map_point) trans_bar(x,y,xs,ys,0); position(x+2,y+2);outtext(fly_text); } - send_message(E_MOUSE,msg); + send_message(E_MOUSE,ms); ukaz_mysku(); showview(fly_x,fly_y,fly_xs+1,fly_ys); showview(fly_x=x,fly_y=y,(fly_xs=xs)+1,fly_ys=ys); @@ -582,7 +581,7 @@ EVENT_PROC(global_map_point) msg->msg=-1; } } - WHEN_MSG(E_DONE) + if (msg->msg == E_DONE) { free(fly_background); } diff --git a/game/interfac.c b/game/interfac.c index 00fe100..312e864 100644 --- a/game/interfac.c +++ b/game/interfac.c @@ -232,23 +232,30 @@ void open_message_win(int pocet_textu,char **texts) static char default_action,cancel_action; -EVENT_PROC(message_keyboard) +void message_keyboard(EVENT_MSG *msg,void **user_ptr) { - switch(GET_MSG()) + char *c; + char *d; + switch(msg->msg) { - case E_INIT:SAVE_USER_PTR(NewArr(char,strlen(GET_DATA(char *))+1)); - strcpy(GET_USER(char *),GET_DATA(char *)); - break; - case E_DONE:free(*GET_USER_PTR()); - SAVE_USER_PTR(NULL); + case E_INIT: + c = va_arg(msg->data, char *); + d = NewArr(char, strlen(c)+1); + strcpy(d, c); + *user_ptr = d; + break; + + case E_DONE:c = *user_ptr; + free(c); + user_ptr = NULL; break; case E_KEYBOARD: { - char *keys=GET_USER(char *); + char *keys=*(char **)(user_ptr); char code,*p; int key; - code=GET_DATA(char); + code=va_arg(msg->data, int); if (code==0) return; code=toupper(code); if (code==13) key=default_action; @@ -383,7 +390,7 @@ void type_text_v2(va_list args) short *back_pic; int i; - task_sleep(NULL); + task_sleep(); schovej_mysku(); set_font(font,color); xs=max_size+text_width("_"); @@ -410,7 +417,10 @@ void type_text_v2(va_list args) position(px+x,y+3);outtext("_"); ukaz_mysku(); showview(x,y,xs,ys); - znak=*(word *)task_wait_event(E_KEYBOARD); //proces bude cekat na klavesu + + EVENT_MSG *ev= task_wait_event(E_KEYBOARD); //proces bude cekat na klavesu + if (ev == NULL) return; + znak=va_arg(ev->data, int); schovej_mysku(); if (task_quitmsg()==1) znak=27; switch(znak & 0xff) @@ -968,7 +978,7 @@ void skeldal_checkbox(OBJREC *o) static void setup_button_init(OBJREC *o,va_list params) { void **d; - char title = va_arg(params, char *); + char *title = va_arg(params, char *); d=NewArr(void *,2); d[0]=NewArr(char,strlen(title)+1); strcpy(d[0],title); diff --git a/game/kouzla.c b/game/kouzla.c index 620bf0d..1ea75ce 100644 --- a/game/kouzla.c +++ b/game/kouzla.c @@ -222,7 +222,7 @@ static void play_anim(va_list args) //tasked animation void play_big_mgif_animation(int block) { add_task(2048,play_anim,block); - task_sleep(NULL); + task_sleep(); } int get_spell_mana(int num) diff --git a/game/macros.c b/game/macros.c index c92a78c..a458661 100644 --- a/game/macros.c +++ b/game/macros.c @@ -611,8 +611,7 @@ void macro_change_music(int textindex) char *nextTrack; create_playlist(trackdef); - play_next_music(&nextTrack); - change_music(nextTrack); + change_music(get_next_music_from_playlist()); } void macro_register_global_event(TMULTI_ACTION *q) diff --git a/game/menu.c b/game/menu.c index f958dd4..2c17b63 100644 --- a/game/menu.c +++ b/game/menu.c @@ -280,7 +280,7 @@ static void preload_anim(va_list args) for(i=0;i<30;i+=2) { apreload(H_ANIM+i); - task_sleep(NULL); + task_sleep(); } for(i=1;i<30;i+=2) { @@ -293,12 +293,12 @@ static void preload_anim(va_list args) break; } apreload(H_ANIM+i); - task_sleep(NULL); + task_sleep(); } for(i=0;i<5;i++) { apreload(H_MENU_ANIM+i); - task_sleep(NULL); + task_sleep(); } apreload(H_MENU_MASK); task_wait_event(E_TIMER); @@ -334,11 +334,10 @@ int enter_menu(char open) init_menu_entries(); add_task(2048,preload_anim); load_ok=0; - while(!load_ok) task_sleep(NULL); + while(!load_ok) task_sleep(); if (!open) { - play_next_music(&d); - change_music(d); + change_music(get_next_music_from_playlist()); } update_mysky(); schovej_mysku(); @@ -352,8 +351,8 @@ int enter_menu(char open) send_message(E_ADD,E_KEYBOARD,klavesnice); ms_last_event.event_type=0x1; send_message(E_MOUSE,&ms_last_event); - d=task_wait_event(E_MENU_SELECT); - c=*d; + EVENT_MSG *ev = task_wait_event(E_MENU_SELECT); + c=va_arg(ev->data, int); disable_click_map(); send_message(E_DONE,E_KEYBOARD,klavesnice); cur_dir[c]=UNSELECT; @@ -599,10 +598,9 @@ void konec_hry() bar(0,0,639,479); effect_show(NULL); create_playlist(texty[205]); - play_next_music(&d); - change_music(d); + change_music(get_next_music_from_playlist()); timer=get_timer_value(); - while (get_timer_value()-timer<150) task_sleep(NULL); + while (get_timer_value()-timer<150) task_sleep(); task_id=add_task(8196,titles,1,"ENDTEXT.TXT"); task_wait_event(E_KEYBOARD); if (is_running(task_id)) term_task(task_id); @@ -617,6 +615,6 @@ void konec_hry() ukaz_mysku(); effect_show(NULL); timer=get_timer_value(); - while (get_timer_value()-timer<150) task_sleep(NULL); + while (get_timer_value()-timer<150) task_sleep(); } diff --git a/game/realgame.c b/game/realgame.c index 0e15cb9..906efdd 100644 --- a/game/realgame.c +++ b/game/realgame.c @@ -1511,7 +1511,7 @@ void postavy_teleport_effect(int sector,int dir,int postava,char effect) while (running_anm) do_events(); play_sample_at_channel(H_SND_TELEPIN,2,100); play_big_mgif_animation(H_TELEPORT); - while (!running_anm) task_sleep(NULL); + while (!running_anm) task_sleep(); kolo=global_anim_counter; if (norefresh) { diff --git a/game/setup.c b/game/setup.c index 76df88d..3c38d12 100644 --- a/game/setup.c +++ b/game/setup.c @@ -78,12 +78,12 @@ static void change_turn() static void unwire_setup(); -static EVENT_PROC(setup_keyboard) +static void setup_keyboard(EVENT_MSG *msg,void **) { - user_ptr; - WHEN_MSG(E_KEYBOARD) + if (msg->msg == E_KEYBOARD) { - if (GET_DATA(char)==27) + char c= va_arg(msg->data, int); + if (c==27) { unwire_proc(); } diff --git a/game/skeldal.c b/game/skeldal.c index b3be230..949a9ee 100644 --- a/game/skeldal.c +++ b/game/skeldal.c @@ -1043,7 +1043,7 @@ SEND_LOG("(INIT) Mouse initialized.",0,0); SEND_LOG("(INIT) Loading mouse cursor.",0,0); mouse_set_default(H_MS_DEFAULT); ukaz_mysku(); - konec_skladby=play_next_music; + set_end_of_song_callback(end_of_song_callback, NULL); SEND_LOG("(INIT) Loading spells.",0,0); kouzla_init(); SEND_LOG("(INIT) Loading items.",0,0); @@ -1143,7 +1143,10 @@ void enter_game() set_game_click_map(); SEND_LOG("(GAME) --------- Waiting for E_CLOSE_MAP ------------\n",0,0); send_message(E_ADD,E_RELOADMAP,reload_map_handler); - end=*(int *)task_wait_event(E_CLOSE_MAP); + { + EVENT_MSG *msg = task_wait_event(E_CLOSE_MAP); + end = va_arg(msg->data, int); + } send_message(E_DONE,E_RELOADMAP,reload_map_handler); SEND_LOG("(GAME) --------- E_CLOSE_MAP triggered, leaving map------------\n",0,0); unwire_main_functs(); @@ -1522,10 +1525,9 @@ static void undef_menu() } -static EVENT_PROC(load_error_report) +static void load_error_report(EVENT_MSG *msg,void **) { - user_ptr; - WHEN_MSG(E_IDLE) + if (msg->msg == E_IDLE) { message(1,0,0,"",texty[79],texty[80]); exit_wait=0; @@ -1551,7 +1553,10 @@ static void load_saved_game(void) wire_save_load(4); ukaz_mysku(); update_mysky(); - game=*((char *)task_wait_event(E_CLOSE_MAP)); + { + EVENT_MSG *msg = task_wait_event(E_CLOSE_MAP); + game = va_arg(msg->data, int); + } unwire_proc(); disable_click_map(); task_wait_event(E_TIMER); diff --git a/game/sndandmus.c b/game/sndandmus.c index de840dc..b79ccd5 100644 --- a/game/sndandmus.c +++ b/game/sndandmus.c @@ -421,13 +421,15 @@ void create_playlist(char *playlist) playing_track=-1; } -void play_next_music(char **c) +const char * end_of_song_callback(void *ctx) { + return get_next_music_from_playlist(); +} +const char *get_next_music_from_playlist() { int i,step; static char d[MAX_FILESYSTEM_PATH]; - *c=NULL; - if (cur_playlist==NULL) return; + if (cur_playlist==NULL) return NULL; if (!remain_play) for(i=0;cur_playlist[i]!=NULL;remain_play++,i++) cur_playlist[i][0]=32; if (play_list_mode==PL_RANDOM) @@ -444,11 +446,15 @@ void play_next_music(char **c) while (step); playing_track=i; snprintf(d,sizeof(d),"%s%s",pathtable[SR_MUSIC],cur_playlist[i]+1); - if (access(d,0) == -1) + if (access(d,0) == -1) { snprintf(d,sizeof(d),"%s%s",pathtable[SR_ORGMUSIC],cur_playlist[i]+1); + if (access(d,0) == -1) { + return NULL; + } + } cur_playlist[i][0]=33; remain_play--; - *c=d; + return d; } void purge_playlist() diff --git a/game/souboje.c b/game/souboje.c index 3ef4bee..65be858 100644 --- a/game/souboje.c +++ b/game/souboje.c @@ -645,11 +645,10 @@ T_CLK_MAP clk_end_game[]= }; -EVENT_PROC(end_game_end_phase) - { +void end_game_end_phase(EVENT_MSG *msg,void **) +{ static int wait=0; - WHEN_MSG(E_TIMER) - { + if (msg->msg == E_TIMER) { if (pass_zavora) return; if (wait==2) { @@ -659,10 +658,10 @@ EVENT_PROC(end_game_end_phase) } else wait++; } - WHEN_MSG(E_INIT) + if (msg->msg == E_INIT) { wait=0; - user_ptr; } +} void wire_end_game() { diff --git a/game/temp_storage.cpp b/game/temp_storage.cpp new file mode 100644 index 0000000..cace888 --- /dev/null +++ b/game/temp_storage.cpp @@ -0,0 +1,96 @@ +#include +#include +#include +#include + +extern "C" { +#include "temp_storage.h" +} + +typedef struct _temp_storage_file_wr { + std::vector *_data; +} TMPFILE_WR; + +typedef struct _temp_storage_file_rd { + std::basic_string_view _data; +} TMPFILE_RD; + +using FileSystem = std::map, std::less<> >; +static FileSystem temp_fsystem; + + +void temp_storage_store(const char *name, const void *data, int32_t size) { + auto b = reinterpret_cast(data); + auto e = b+size; + temp_fsystem[std::string(name)] = {b,e}; +} + +int32_t temp_storage_find(const char *name) { + auto iter = temp_fsystem.find(std::string_view(name)); + if (iter == temp_fsystem.end()) return -1; + return iter->second.size(); +} + +int32_t temp_storage_retrieve(const char *name, void *data, int32_t size) { + auto iter = temp_fsystem.find(std::string_view(name)); + if (iter == temp_fsystem.end()) return -1; + size = std::min(size, iter->second.size()); + std::copy(iter->second.begin(), iter->second.end(), reinterpret_cast(data)); + return iter->second.size(); + +} + +void temp_storage_list(void (*callback)(const char*, void*), void *context) { + for (const auto &[k,v]: temp_fsystem) { + callback(k.c_str(), context); + } +} + +void temp_storage_clear() { + temp_fsystem.clear(); +} + +TMPFILE_RD* temp_storage_open(const char *name) { + auto iter = temp_fsystem.find(std::string_view(name)); + if (iter == temp_fsystem.end()) return NULL; + return new TMPFILE_RD{std::basic_string_view(iter->second.data(), iter->second.size())}; +} + +TMPFILE_WR* temp_storage_create(const char *name) { + auto &v = temp_fsystem[std::string(name)] = {}; + return new TMPFILE_WR{&v}; +} + +TMPFILE_WR* temp_storage_append(const char *name) { + auto &v = temp_fsystem[std::string(name)]; + return new TMPFILE_WR{&v}; +} + +void temp_storage_close_rd(TMPFILE_RD *f) { + delete f; +} + +void temp_storage_close_wr(TMPFILE_WR *f) { + delete f; +} + +void temp_storage_write(const void *data, uint32_t size, TMPFILE_WR *f) { + auto b = reinterpret_cast(data); + auto e = b+size; + std::copy(b,e, std::back_inserter(*f->_data)); +} + +uint32_t temp_storage_read(void *data, uint32_t size, TMPFILE_RD *f) { + auto &d = f->_data; + auto p = d.substr(0,size); + d = d.substr(p.size()); + auto b = reinterpret_cast(data); + std::copy(d.begin(), d.end(), b); + return p.size(); +} + +void temp_storage_skip(TMPFILE_RD *f, int bytes) { + auto &d = f->_data; + auto p = d.substr(0,bytes); + d = d.substr(p.size()); +} diff --git a/game/temp_storage.h b/game/temp_storage.h index e567bed..586cc57 100644 --- a/game/temp_storage.h +++ b/game/temp_storage.h @@ -1,4 +1,4 @@ - +#include ///store to temp storage void temp_storage_store(const char *name, const void *data, int32_t size); diff --git a/libs/devices.c b/libs/devices.c index 37c7720..446baf5 100644 --- a/libs/devices.c +++ b/libs/devices.c @@ -16,16 +16,41 @@ extern MS_EVENT win_mouseEvent; TMS_BASIC_INFO ms_basic_info={0}; static char ms_keys; +/* void get_ms_event(MS_EVENT *event) { CheckMessageQueue(); *event=win_mouseEvent; win_mouseEvent.event=0; } - -char cz_table_1[]=" 1!3457�908+,-./�+��������\"�?=:_2ABCDEFGHIJKLMNOPQRSTUVWXYZ�\\)6=;abcdefghijklmnopqrstuvwxyz/|(; "; -char cz_table_2[]=" !\"#$%&'()*+,-./0123456789:;<=>?@�BCD�FGH�JK�MN�PQ�ST�VWX�Z[\\]^_`�bcd�fgh�jk�mn�pq�st�vwx�z{|}~ "; -char cz_table_3[]=" !\"#$%&'()*+,-./0123456789:;<=>?@AB���FGHIJK�M��PQ����VWXY�[\\]^_`ab���fghijk�m��pq����vwxy�{|}~ "; +*/ +char cz_table_1[] = { 0x20, 0x31, 0x21, 0x33, 0x34, 0x35, 0x37, 0xad, 0x39, + 0x30, 0x38, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x82, 0x2b, 0x88, 0xa8, 0x87, + 0xa9, 0x91, 0x98, 0xa0, 0xa1, 0x5c, 0x22, 0x96, 0x3f, 0x3d, 0x3a, 0x5f, + 0x32, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0xa3, 0x5c, 0x5c, 0x29, 0x36, 0x3d, 0x3b, 0x61, 0x62, + 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, + 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, + 0x2f, 0x7c, 0x28, 0x3b, 0x20 }; +char cz_table_2[] = { 0x20, 0x21, 0x5c, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x8f, 0x42, 0x43, 0x44, 0x90, 0x46, 0x47, 0x48, 0x8b, 0x4a, 0x4b, + 0x8a, 0x4d, 0x4e, 0x95, 0x50, 0x51, 0xab, 0x53, 0x54, 0x97, 0x56, 0x57, + 0x58, 0x9d, 0x5a, 0x5b, 0x5c, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0xa0, 0x62, + 0x63, 0x64, 0x82, 0x66, 0x67, 0x68, 0xa1, 0x6a, 0x6b, 0x8d, 0x6d, 0x6e, + 0xa2, 0x70, 0x71, 0xaa, 0x73, 0x74, 0xa3, 0x76, 0x77, 0x78, 0x98, 0x7a, + 0x7b, 0x7c, 0x7d, 0x7e, 0x20 }; +char cz_table_3[] = { 0x20, 0x21, 0x5c, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x80, 0x85, 0x89, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x9c, 0x4d, 0xa5, 0xa7, 0x50, 0x51, 0x9e, 0x9b, 0x86, 0xa6, 0x56, 0x57, + 0x58, 0x59, 0x92, 0x5b, 0x5c, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, + 0x87, 0x83, 0x88, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x8c, 0x6d, 0xa4, + 0x93, 0x70, 0x71, 0xa9, 0xa8, 0x9f, 0x96, 0x76, 0x77, 0x78, 0x79, 0x91, + 0x7b, 0x7c, 0x7d, 0x7e, 0x20 }; char *cz_key_tabs[]={cz_table_1,cz_table_2,cz_table_3}; void keyboard(EVENT_MSG *msg,void *user_data) diff --git a/libs/event.c b/libs/event.c index 8bd4860..052ac91 100644 --- a/libs/event.c +++ b/libs/event.c @@ -430,11 +430,10 @@ void timer(EVENT_MSG *msg) } } -void tasker(EVENT_MSG *msg,void **data) +void tasker(EVENT_MSG *msg,void **) { - data; switch (msg->msg) { case E_INIT: @@ -449,22 +448,22 @@ void tasker(EVENT_MSG *msg,void **data) case E_IDLE: default: if (q_any_task()>=1) - task_sleep(NULL); + task_sleep(); break; case E_DONE: { - int i; +/* int i; memset(task_info,1,taskcount); do { for (i=1;i +#include /* void *task_sleep(void *param); //#pragma aux task_sleep parm [eax] value [eax] @@ -142,18 +142,6 @@ char is_running(int id_num); */ void timer(EVENT_MSG *msg); -#define EVENT_PROC(name) void name(EVENT_MSG *msg,void **user_ptr) -#define WHEN_MSG(msg_num) if (msg->msg==msg_num) -#define UNTIL_MSG(msg_num) if (msg->msg!=msg_num) -#define GET_DATA(data_type) (va_arg(msg->data, data_type)) -#define GET_DATA_PTR(data_type) (va_arg(msg->data, data_type *)) -#define GET_USER(data_type) (*(data_type *)user_ptr) -#define SAVE_USER_PTR(p) (*user_ptr=p) -#define GET_USER_PTR() user_ptr -#define EVENT_RETURN(value) msg->msg=value -#define GET_MSG_VAR() msg -#define GET_MSG() msg->msg -#define TASK_GET_TERMINATE() ((task_info[cur_task] & TASK_TERMINATING)!=0) #define EVENT_HALT -1 #define EVENT_DONE -2 diff --git a/libs/event_macros.h b/libs/event_macros.h new file mode 100644 index 0000000..271f636 --- /dev/null +++ b/libs/event_macros.h @@ -0,0 +1,30 @@ +/* + * event_macros.h + * + * Created on: 26. 1. 2025 + * Author: ondra + */ + +#ifndef LIBS_EVENT_MACROS_H_ +#define LIBS_EVENT_MACROS_H_ + +#include "event.h" + +#define EVENT_PROC(name) void name(EVENT_MSG *msg,void **user_ptr) +#define WHEN_MSG(msg_num) if (msg->msg==msg_num) +#define UNTIL_MSG(msg_num) if (msg->msg!=msg_num) +#define GET_DATA(data_type) (va_arg(msg->data, data_type)) +#define GET_DATA_PTR(data_type) (va_arg(msg->data, data_type *)) +#define GET_USER(data_type) (*(data_type *)user_ptr) +#define SAVE_USER_PTR(p) (*user_ptr=p) +#define GET_USER_PTR() user_ptr +#define EVENT_RETURN(value) msg->msg=value +#define GET_MSG_VAR() msg +#define GET_MSG() msg->msg +#define TASK_GET_TERMINATE() ((task_info[cur_task] & TASK_TERMINATING)!=0) + + + + + +#endif /* LIBS_EVENT_MACROS_H_ */ diff --git a/libs/zvuk.h b/libs/zvuk.h index 989cd1c..03c8b39 100644 --- a/libs/zvuk.h +++ b/libs/zvuk.h @@ -19,7 +19,7 @@ extern "C" { #define DEV_DIRECTSOUND 9 //only valid device for this module extern int bvolume; -extern void (*konec_skladby)(char **jmeno); + int sound_detect(int *dev,int *port,int *dma, int *irq); void set_mixing_device(int mix_dev,int mix_freq,...); @@ -28,6 +28,7 @@ void stop_mixing(); void play_sample(int channel,void *sample,int32_t size,int32_t lstart,int32_t sfreq,int type); void set_channel_volume(int channel,int left,int right); void init_winamp_plugins(const char *path); +void set_end_of_song_callback(const char * (*cb)(void *), void *ctx); void fade_music(); int mix_back_sound(int synchro); diff --git a/platform/CMakeLists.txt b/platform/CMakeLists.txt new file mode 100644 index 0000000..612169c --- /dev/null +++ b/platform/CMakeLists.txt @@ -0,0 +1,6 @@ +SET(files error.cpp legacy_coroutines.cpp) + +add_library(skeldal_platform_libs ${files}) +set_property(TARGET skeldal_platform_libs PROPERTY CXX_STANDARD 20) + +add_subdirectory(sdl) \ No newline at end of file diff --git a/platform/FCS_Tasker.h b/platform/FCS_Tasker.h deleted file mode 100644 index 78684d7..0000000 --- a/platform/FCS_Tasker.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef _FCS_TASKER_H_ -#define _FCS_TASKER_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -typedef void (*TaskerFunctionName)(va_list); - -void tasker(EVENT_MSG *msg,void **data); -int create_task(); -int add_task(int stack,TaskerFunctionName fcname,...); -void term_task(int id_num); -char is_running(int id_num); -void suspend_task(int id_num,int msg); -void shut_down_task(int id_num); -void unsuspend_task(EVENT_MSG *msg); -void *task_sleep(void *data); -void *task_wait_event(int32_t event_number); -int q_any_task(); -char task_quitmsg(); -char task_quitmsg_by_id(int id); -char q_is_mastertask(); -int q_current_task(); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/platform/bios.h b/platform/bios.h index e69de29..8b13789 100644 --- a/platform/bios.h +++ b/platform/bios.h @@ -0,0 +1 @@ + diff --git a/platform/error.cpp b/platform/error.cpp new file mode 100644 index 0000000..75469d5 --- /dev/null +++ b/platform/error.cpp @@ -0,0 +1,9 @@ +#include +extern "C" { +#include "error.h" +} + + +void display_error(const char *text) { + std::cerr << "ERROR:" << text << std::endl; +} diff --git a/platform/error.h b/platform/error.h new file mode 100644 index 0000000..223eab4 --- /dev/null +++ b/platform/error.h @@ -0,0 +1,3 @@ +#pragma once + +void display_error(const char *text); diff --git a/platform/legacy_coroutines.cpp b/platform/legacy_coroutines.cpp new file mode 100644 index 0000000..0f079cc --- /dev/null +++ b/platform/legacy_coroutines.cpp @@ -0,0 +1,141 @@ +#include "legacy_coroutines.h" + + +#include +#include +#include +#include + +struct TaskInfo { + int id; + std::thread thr; + std::atomic resume_flag = {false}; + std::chrono::system_clock::time_point _wake_up_after = {}; + int wake_up_msg = -1; + bool request_exit = false; + + TaskInfo(int id):id(id) {} +}; + +using TaskList = std::unordered_map >; +static int next_task_id = 1; +static TaskList task_list; + +static int get_new_task_id() { + int id = next_task_id; + next_task_id = (next_task_id + 1) & 0xFFFF; + if (task_list.find(id) != task_list.end()) id = get_new_task_id(); + return id; +} + +static std::atomic resume_master_flag = {false}; +static TaskInfo *current_task_inst = NULL; +static EVENT_MSG *cur_message = NULL; + +static void switch_to_task(TaskInfo *task) { + if (task == current_task_inst) return; + if (task == NULL) { + TaskInfo *me = current_task_inst; + current_task_inst = NULL; + me->resume_flag = false; + resume_master_flag = true; + resume_master_flag.notify_all(); + me->resume_flag.wait(false); + } else if (current_task_inst == NULL) { + current_task_inst = task; + resume_master_flag = false; + task->resume_flag = true; + task->resume_flag.notify_all(); + resume_master_flag.wait(false); + } else { + TaskInfo *me = current_task_inst; + me->resume_flag = false; + task->resume_flag = true; + task->resume_flag.notify_all(); + me->resume_flag.wait(false); + } +} + +static void clean_up_current_task() { + TaskInfo *me = current_task_inst; + if (!me) return; + int id = me->id; + me->thr.detach(); + task_list.erase(id); + current_task_inst = NULL; + resume_master_flag = true; + resume_master_flag.notify_all(); +} + +int add_task(int stack,TaskerFunctionName fcname,...) { + int id = get_new_task_id(); + auto st = task_list.emplace(id, std::make_unique(id)); + TaskInfo *new_task = st.first->second.get(); + va_list args; + va_start(args, fcname); + new_task->thr = std::thread([&]{ + new_task->resume_flag.wait(false); + fcname(args); + clean_up_current_task(); + }); + switch_to_task(new_task); + return id; +} + +void term_task(int id_num) { + auto iter = task_list.find(id_num); + if (iter != task_list.end()) { + iter->second->request_exit = true; + switch_to_task(iter->second.get()); + } +} +char is_running(int id_num) { + return id_num < 0 || task_list.find(id_num) != task_list.end(); +} +void unsuspend_task(EVENT_MSG *msg) { + for (auto &[id, task]: task_list) { + if (task->wake_up_msg == msg->msg) { + EVENT_MSG cpy; + cpy.msg = msg->msg; + va_copy(cpy.data, msg->data); + cur_message = &cpy; + switch_to_task(task.get()); + va_end(cpy.data); + cur_message = NULL; + } + } +} +void task_sleep(void) { + if (current_task_inst) { + switch_to_task(NULL); + } else { + auto now = std::chrono::system_clock::now(); + for (auto &[id, task]: task_list) { + if (task->_wake_up_after < now && task->wake_up_msg == -1) { + switch_to_task(task.get()); + } + } + } +} +EVENT_MSG *task_wait_event(int32_t event_number) { + if (current_task_inst == NULL) return NULL; + current_task_inst->wake_up_msg = event_number; + switch_to_task(NULL); + return NULL; +} +int q_any_task() { + return task_list.size(); +} +char task_quitmsg() { + if (current_task_inst == NULL) return 0; + return current_task_inst->request_exit?1:0; +} +char q_is_mastertask() { + return current_task_inst == NULL; +} +int q_current_task() { + return current_task_inst?current_task_inst->id:-1; +} +void task_sleep_for(unsigned int time_ms) { + +} diff --git a/platform/legacy_coroutines.h b/platform/legacy_coroutines.h new file mode 100644 index 0000000..ff0940f --- /dev/null +++ b/platform/legacy_coroutines.h @@ -0,0 +1,68 @@ +#ifndef _FCS_TASKER_H_ +#define _FCS_TASKER_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#include + + +typedef void (*TaskerFunctionName)(va_list); + +//void tasker(EVENT_MSG *msg,void **data); +//int create_task(); +///start new task +/** + * @param stack stack size - ignored by some platforms + * @param fcname function to start + * @param ... arguments + * @return id of task + * + * @note task is started immediatelly. + * @note arguments are valid only until task is suspended + */ +int add_task(int stack,TaskerFunctionName fcname,...); +///terminate task +/** + * request to terminate given task. The task can check this flag by + * task_quitmsg() + + */ +void term_task(int id_num); +///returns true, if task is running +char is_running(int id_num); +//void suspend_task(int id_num,int msg); +//void shut_down_task(int id_num); +///resumes task waiting on given message event + +void unsuspend_task(EVENT_MSG *msg); + +///sleep current task and switch to another +void task_sleep(void); + +void task_sleep_for(unsigned int time_ms); +///sleep current task and wake up when given event is triggered +/** + * @param event_number waiting number + * @return received message, NULL if task_term called + */ +EVENT_MSG *task_wait_event(int32_t event_number); +///returns count of tasks +int q_any_task(); +///returns 1 if terminate is requested +char task_quitmsg(); +//char task_quitmsg_by_id(int id); +char q_is_mastertask(); +///returns id of current task +int q_current_task(); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/platform/sdl/CMakeLists.txt b/platform/sdl/CMakeLists.txt new file mode 100644 index 0000000..88c0516 --- /dev/null +++ b/platform/sdl/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(tests) diff --git a/platform/sdl/tests/CMakeLists.txt b/platform/sdl/tests/CMakeLists.txt new file mode 100644 index 0000000..89e1abb --- /dev/null +++ b/platform/sdl/tests/CMakeLists.txt @@ -0,0 +1,16 @@ +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/tests/) + +set(testFiles sdl_minimal_test.cpp sdl_surface_test.cpp + ) + +foreach (testFile ${testFiles}) + string(REGEX MATCH "([^\/]+$)" filename ${testFile}) + string(REGEX MATCH "[^.]*" executable_name test_${filename}) + add_executable(${executable_name} ${testFile}) + target_link_libraries(${executable_name} ${SDL2_LIBRARIES} ) + add_test(NAME ${executable_name} COMMAND ${executable_name}) +endforeach () + + +add_executable(sdl_fullscreen_window sdl_fullscreen_window.cpp) +target_link_libraries(sdl_fullscreen_window ${SDL2_LIBRARIES} ) \ No newline at end of file diff --git a/platform/sdl/tests/sdl_fullscreen_window.cpp b/platform/sdl/tests/sdl_fullscreen_window.cpp new file mode 100644 index 0000000..78dcd85 --- /dev/null +++ b/platform/sdl/tests/sdl_fullscreen_window.cpp @@ -0,0 +1,57 @@ +#include +#include + +int main(int argc, char* argv[]) { + if (SDL_Init(SDL_INIT_VIDEO) < 0) { + SDL_Log("Unable to initialize SDL: %s", SDL_GetError()); + return -1; + } + + SDL_Window* window = SDL_CreateWindow("Fullscreen Toggle with Aspect Ratio", + SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, + 640, 480, SDL_WINDOW_RESIZABLE); + + if (!window) { + SDL_Log("Unable to create window: %s", SDL_GetError()); + SDL_Quit(); + return -1; + } + + SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); + if (!renderer) { + SDL_Log("Unable to create renderer: %s", SDL_GetError()); + SDL_DestroyWindow(window); + SDL_Quit(); + return -1; + } + + int isFullscreen = 0; + int running = 1; + SDL_Event event; + + while (running) { + while (SDL_PollEvent(&event)) { + if (event.type == SDL_QUIT) { + running = 0; + } + if (event.type == SDL_KEYDOWN) { + if (event.key.keysym.sym == SDLK_RETURN && (event.key.keysym.mod & KMOD_ALT)) { + // Přepnutí mezi fullscreen a oknem + isFullscreen = !isFullscreen; + SDL_SetWindowFullscreen(window, isFullscreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0); + } + } + } + + // Renderování + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); + SDL_RenderClear(renderer); + SDL_RenderPresent(renderer); + } + + // Uklid zdrojů + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + return 0; +} diff --git a/platform/sdl/tests/sdl_minimal_test.cpp b/platform/sdl/tests/sdl_minimal_test.cpp new file mode 100644 index 0000000..102db69 --- /dev/null +++ b/platform/sdl/tests/sdl_minimal_test.cpp @@ -0,0 +1,27 @@ +#include +#include + +int main(int argc, char* argv[]) { + if (SDL_Init(SDL_INIT_VIDEO) != 0) { + std::cerr << "SDL Initialization Error: " << SDL_GetError() << std::endl; + return 1; + } + + SDL_Window* window = SDL_CreateWindow("SDL Window", + SDL_WINDOWPOS_CENTERED, + SDL_WINDOWPOS_CENTERED, + 800, 600, + SDL_WINDOW_SHOWN); + + if (!window) { + std::cerr << "Window Creation Error: " << SDL_GetError() << std::endl; + SDL_Quit(); + return 1; + } + + SDL_Delay(500); // Zobrazí okno na 3 sekundy + + SDL_DestroyWindow(window); + SDL_Quit(); + return 0; +} diff --git a/platform/sdl/tests/sdl_surface_test.cpp b/platform/sdl/tests/sdl_surface_test.cpp new file mode 100644 index 0000000..339748c --- /dev/null +++ b/platform/sdl/tests/sdl_surface_test.cpp @@ -0,0 +1,73 @@ +#include +#include +#include + +#define WIDTH 640 +#define HEIGHT 480 + + +int main(int argc, char *argv[]) { + // Inicializace SDL + if (SDL_Init(SDL_INIT_VIDEO) != 0) { + fprintf(stderr, "Chyba při inicializaci SDL: %s\n", SDL_GetError()); + return 1; + } + + // Vytvoření SDL okna + SDL_Window *window = SDL_CreateWindow("DOS Game Port", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WIDTH, HEIGHT, 0); + if (!window) { + fprintf(stderr, "Chyba při vytváření okna: %s\n", SDL_GetError()); + SDL_Quit(); + return 1; + } + + // Vytvoření rendereru (pouze pro zobrazení) + SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); + if (!renderer) { + fprintf(stderr, "Chyba při vytváření rendereru: %s\n", SDL_GetError()); + SDL_DestroyWindow(window); + SDL_Quit(); + return 1; + } + + // Vytvoření SDL Surface (backbuffer) + SDL_Texture *texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGB565,SDL_TEXTUREACCESS_STREAMING, WIDTH, HEIGHT); + if (!texture) { + fprintf(stderr, "Chyba při vytváření surface: %s\n", SDL_GetError()); + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + return 1; + } + + void *raw_pixels; + int pitch; + SDL_LockTexture(texture, NULL, &raw_pixels, &pitch); + // Přímý přístup do paměti surface + Uint16 *pixels = reinterpret_cast(raw_pixels); + printf("Adresa pixelů: %p, pitch: %d bajtů\n", (void *)pixels, pitch); + + // Software rendering - příklad kreslení do paměti + for (int y = 0; y < HEIGHT; y++) { + for (int x = 0; x < WIDTH; x++) { + Uint16 color = (x ^ y) & 0xFFFF; // Příklad barvy + pixels[y * (pitch / 2) + x] = color; // Zápis pixelu + } + } + + SDL_UnlockTexture(texture); + + SDL_RenderClear(renderer); + SDL_RenderCopy(renderer, texture, NULL, NULL); + SDL_RenderPresent(renderer); + + SDL_Delay(3000); // Zobrazení okna na 3 sekundy + + // Uvolnění zdrojů + SDL_DestroyTexture(texture); + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + + return 0; +}