save slot's second id is related to UTC time to help sorting and cloud syncing.

This commit is contained in:
Ondrej Novak 2025-02-24 21:15:45 +01:00
parent 3c81b6ccf0
commit 1acb374068
2 changed files with 53 additions and 15 deletions

View file

@ -42,6 +42,8 @@ static TMPFILE_WR *story=NULL;
static char load_another; static char load_another;
static unsigned long current_campaign = 0; static unsigned long current_campaign = 0;
static long prev_game_time_save = -999; static long prev_game_time_save = -999;
static long play_time = 0; //current play time
static long load_game_time = 0; //time when game has been loaded (to calculate play_time)
char reset_mobiles=0; char reset_mobiles=0;
@ -768,7 +770,7 @@ static int load_global_events()
return 0; return 0;
} }
int save_game(int game_time,char *gamename) int save_game(long game_time,char *gamename)
{ {
char *gn; char *gn;
FILE *svf; FILE *svf;
@ -781,11 +783,10 @@ int save_game(int game_time,char *gamename)
} }
char str_buff[50]; char str_buff[50];
snprintf(str_buff,sizeof(str_buff),"sav.%08lx.%08X", current_campaign, game_time); snprintf(str_buff,sizeof(str_buff),"sav.%08lx.%08lx", current_campaign, game_time);
SEND_LOG("(SAVELOAD) Saving game slot %d",game_time); SEND_LOG("(SAVELOAD) Saving game slot %d",game_time);
save_map_state(); save_map_state();
const char *sn = build_pathname(2,gpathtable[SR_SAVES],str_buff); const char *sn = build_pathname(2,gpathtable[SR_SAVES],str_buff);
sn = local_strdup(sn); sn = local_strdup(sn);
create_directories(gpathtable[SR_SAVES]); create_directories(gpathtable[SR_SAVES]);
@ -795,6 +796,10 @@ int save_game(int game_time,char *gamename)
if ((r=save_basic_info())!=0) return r; if ((r=save_basic_info())!=0) return r;
save_book(); save_book();
save_global_events(); save_global_events();
long new_play_time = play_time + get_game_tick_count()/1000 - load_game_time;
temp_storage_store("playtime",&new_play_time, sizeof(new_play_time));
svf=fopen_icase(sn,"wb"); svf=fopen_icase(sn,"wb");
if (svf==NULL) if (svf==NULL)
{ {
@ -823,6 +828,7 @@ int load_game(const char *fname)
int r,t; int r,t;
sscanf(fname,"sav.%lx.%lx", &current_campaign, &prev_game_time_save); sscanf(fname,"sav.%lx.%lx", &current_campaign, &prev_game_time_save);
prev_game_time_save = get_game_tick_count()/1000;
SEND_LOG("(SAVELOAD) Loading file: %s",fname); SEND_LOG("(SAVELOAD) Loading file: %s",fname);
if (battle) konec_kola(); if (battle) konec_kola();
@ -845,6 +851,15 @@ int load_game(const char *fname)
load_global_events(); load_global_events();
if ((t=load_saved_shops())!=0) return t; if ((t=load_saved_shops())!=0) return t;
if ((t=load_basic_info())!=0) return t; if ((t=load_basic_info())!=0) return t;
if (temp_storage_find("playtime") == sizeof(long)) {
temp_storage_retrieve("playtime", &play_time, sizeof(play_time));
} else {
play_time = 0;
}
load_game_time = get_game_tick_count() / 1000;
running_battle=0; running_battle=0;
norefresh=0; norefresh=0;
if (!load_another) restore_current_map(); if (!load_another) restore_current_map();
@ -983,6 +998,22 @@ static int compare_strings (const void *a, const void *b) {
return strcmp(*(const char **)a, *(const char **)b); return strcmp(*(const char **)a, *(const char **)b);
} }
static int compare_strings_third_back (const void *a, const void *b) {
const char *sa = *(const char **)a;
const char *sb = *(const char **)b;
const char *ba = strrchr(sa,'.');
const char *bb = strrchr(sb,'.');
if (!ba) ba = sa;else ba++;
if (!bb) bb = sb;else bb++;
if (istrcmp(ba,"SAV") == 0) {
ba = concat2("0000",ba-3);
}
if (istrcmp(bb,"SAV") == 0) {
bb = concat2("0000",bb-3);
}
return -strcmp(ba,bb);
}
static int compare_by_time (const void *a, const void *b) { static int compare_by_time (const void *a, const void *b) {
const char *s1 = *(const char **)a; const char *s1 = *(const char **)a;
const char *s2 = *(const char **)b; const char *s2 = *(const char **)b;
@ -1081,7 +1112,7 @@ static TSAVEGAME_LIST get_all_savegames(unsigned long kampan) {
if (kampan == 0) { if (kampan == 0) {
st.count =dedup_strings_prefix(st.files, (int)st.count); st.count =dedup_strings_prefix(st.files, (int)st.count);
} }
qsort(st.files, st.count, sizeof(char *), compare_by_time); qsort(st.files, st.count, sizeof(char *), compare_strings_third_back);
TSTR_LIST names = create_list(st.count); TSTR_LIST names = create_list(st.count);
for (size_t i = 0; i < st.count; ++i) { for (size_t i = 0; i < st.count; ++i) {
@ -1795,23 +1826,30 @@ static void herni_cas_for_savegame(char *c) {
#define DEFAULT_GAME_NAME(extra) \ #define DEFAULT_GAME_NAME(extra) \
char game_name[100];\ char game_name[100];\
char hernicas[50];\ long cur_time = get_game_tick_count()/1000;\
herni_cas_for_savegame(hernicas);\ long game_time = play_time + get_game_tick_count()/1000 - load_game_time;\
snprintf(game_name, sizeof(game_name), "%s %s" extra, mglob.mapname, hernicas); if (game_time < 60) snprintf(game_name, sizeof(game_name), "%s" extra, mglob.mapname);\
else snprintf(game_name, sizeof(game_name), "%s %02lu:%02lu" extra, mglob.mapname, game_time/3600, (game_time/60)%60);
long get_save_game_slot_id() {
time_t tm;
time(&tm);
return tm-1700000000;
}
void do_autosave() { void do_autosave() {
DEFAULT_GAME_NAME(" (A)"); DEFAULT_GAME_NAME(" (A)");
if (game_time - prev_game_time_save<360) return; if (cur_time - prev_game_time_save<300) return; //autosave is no more often than each 5 minutes
prev_game_time_save = game_time; prev_game_time_save = cur_time;
save_game(game_time, game_name); save_game(get_save_game_slot_id(), game_name);
} }
void do_save_dialog() { void do_save_dialog() {
DEFAULT_GAME_NAME(""); DEFAULT_GAME_NAME("");
if (ask_save_dialog(game_name, sizeof(game_name))) { if (ask_save_dialog(game_name, sizeof(game_name))) {
prev_game_time_save = game_time; prev_game_time_save = cur_time;
save_game(game_time, game_name); save_game(get_save_game_slot_id(), game_name);
} }

View file

@ -1404,7 +1404,7 @@ int save_map_state(void); //uklada stav mapy pro savegame (neuklada aktualni poz
int load_map_state(void); //obnovuje stav mapy; nutno volat po zavolani load_map; int load_map_state(void); //obnovuje stav mapy; nutno volat po zavolani load_map;
void restore_current_map(void); //pouze obnovuje ulozeny stav aktualni mapy void restore_current_map(void); //pouze obnovuje ulozeny stav aktualni mapy
int load_game(const char *fname); int load_game(const char *fname);
int save_game(int game_time,char *gamename); int save_game(long game_time,char *gamename);
void wire_save_load(char save); void wire_save_load(char save);
void do_save_dialog(); void do_save_dialog();
char ask_save_dialog(char *name_buffer, size_t name_size); char ask_save_dialog(char *name_buffer, size_t name_size);