import sdl, some tests, nothing work yet

This commit is contained in:
Ondřej Novák 2025-01-26 15:03:44 +01:00
parent a7278bac40
commit 378b5586ab
37 changed files with 721 additions and 167 deletions

View file

@ -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)

View file

@ -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;
}
}

View file

@ -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)

View file

@ -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)

View file

@ -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;

View file

@ -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);

View file

@ -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);
}

View file

@ -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);

View file

@ -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)

View file

@ -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)

View file

@ -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();
}

View file

@ -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)
{

View file

@ -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();
}

View file

@ -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);

View file

@ -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()

View file

@ -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()
{

96
game/temp_storage.cpp Normal file
View file

@ -0,0 +1,96 @@
#include <map>
#include <string>
#include <string_view>
#include <vector>
extern "C" {
#include "temp_storage.h"
}
typedef struct _temp_storage_file_wr {
std::vector<uint8_t> *_data;
} TMPFILE_WR;
typedef struct _temp_storage_file_rd {
std::basic_string_view<uint8_t> _data;
} TMPFILE_RD;
using FileSystem = std::map<std::string, std::vector<uint8_t>, std::less<> >;
static FileSystem temp_fsystem;
void temp_storage_store(const char *name, const void *data, int32_t size) {
auto b = reinterpret_cast<const uint8_t *>(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<int32_t>(size, iter->second.size());
std::copy(iter->second.begin(), iter->second.end(), reinterpret_cast<uint8_t *>(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<uint8_t>(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<const uint8_t *>(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<uint8_t *>(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());
}

View file

@ -1,4 +1,4 @@
#include <stdint.h>
///store to temp storage
void temp_storage_store(const char *name, const void *data, int32_t size);