|
|
|
@@ -24,6 +24,66 @@ extern nes_Audio_Stream sdl_audio; |
|
|
|
static nes sys = {0}; |
|
|
|
|
|
|
|
|
|
|
|
typedef struct { |
|
|
|
Overlay* overlay; |
|
|
|
int timer; |
|
|
|
int id; |
|
|
|
int mode; |
|
|
|
} loadsave_state; |
|
|
|
|
|
|
|
void loadsave_start(loadsave_state* loadsave, int mode) { |
|
|
|
if (0 != loadsave->mode) { |
|
|
|
// We can't do two things at once. |
|
|
|
overlay_clear_message(loadsave->overlay, loadsave->id); |
|
|
|
loadsave->mode = 0; |
|
|
|
|
|
|
|
} else { |
|
|
|
loadsave->mode = mode; |
|
|
|
loadsave->timer = 60 * 1; |
|
|
|
const char* op = NULL; |
|
|
|
if (input_Result_Load == mode) op = "Restoring"; |
|
|
|
else if (input_Result_Save == mode) op = "Saving"; |
|
|
|
if (NULL != op) { |
|
|
|
char msg[100]; |
|
|
|
snprintf(msg, sizeof(msg), "%s game state ...", op); |
|
|
|
loadsave->id = overlay_add_message( |
|
|
|
loadsave->overlay, msg, 60 * 1 |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
int loadsave_tick(loadsave_state* loadsave) { |
|
|
|
int action = 0; |
|
|
|
|
|
|
|
if (loadsave->mode != 0 && --loadsave->timer <= 0) { |
|
|
|
const char *op = NULL; |
|
|
|
|
|
|
|
if (input_Result_Load == loadsave->mode) { |
|
|
|
//load_state(&sys, cart_filename); |
|
|
|
op = "restored"; |
|
|
|
|
|
|
|
} else if (input_Result_Save == loadsave->mode) { |
|
|
|
//save_state(&sys, cart_filename); |
|
|
|
op = "saved"; |
|
|
|
} |
|
|
|
|
|
|
|
if (NULL != op) { |
|
|
|
char msg[100]; |
|
|
|
snprintf(msg, sizeof(msg), "Game state %s", op); |
|
|
|
overlay_add_message(loadsave->overlay, msg, 60 * 3); |
|
|
|
} |
|
|
|
|
|
|
|
overlay_clear_message(loadsave->overlay, loadsave->id); |
|
|
|
|
|
|
|
action = loadsave->mode; |
|
|
|
loadsave->mode = 0; |
|
|
|
} |
|
|
|
|
|
|
|
return action; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char* argv[]) { |
|
|
|
int status = 0; |
|
|
|
|
|
|
|
@@ -70,6 +130,10 @@ int main(int argc, char* argv[]) { |
|
|
|
} |
|
|
|
|
|
|
|
if (status == 0) { |
|
|
|
loadsave_state loadsave = { |
|
|
|
.overlay = &rend->overlay, |
|
|
|
}; |
|
|
|
|
|
|
|
nes_reset(&sys); |
|
|
|
|
|
|
|
nes_render(rend, &sys.ppu); |
|
|
|
@@ -88,6 +152,14 @@ int main(int argc, char* argv[]) { |
|
|
|
status = nes_render(rend, &sys.ppu); |
|
|
|
|
|
|
|
if (status > 0) { |
|
|
|
// Load/Save Operations |
|
|
|
int action = loadsave_tick(&loadsave); |
|
|
|
if (input_Result_Load == action) { |
|
|
|
load_state(&sys, cart_filename); |
|
|
|
} else if (input_Result_Save == action) { |
|
|
|
save_state(&sys, cart_filename); |
|
|
|
} |
|
|
|
|
|
|
|
// Sleep to catch up to master clock |
|
|
|
uint64_t elapsed_cycles = total_cycles - |
|
|
|
cycle_last_frame; |
|
|
|
@@ -111,15 +183,26 @@ int main(int argc, char* argv[]) { |
|
|
|
status = nes_input_update(input, &sys.input); |
|
|
|
|
|
|
|
if (input_Result_Reset == status) { |
|
|
|
overlay_add_message( |
|
|
|
&rend->overlay, |
|
|
|
"Game reset", |
|
|
|
60 * 3 |
|
|
|
); |
|
|
|
nes_reset(&sys); |
|
|
|
status = 0; |
|
|
|
|
|
|
|
} else if (input_Result_Load == status) { |
|
|
|
load_state(&sys, cart_filename); |
|
|
|
loadsave_start(&loadsave, status); |
|
|
|
status = 0; |
|
|
|
|
|
|
|
} else if (input_Result_Save == status) { |
|
|
|
save_state(&sys, cart_filename); |
|
|
|
loadsave_start(&loadsave, status); |
|
|
|
status = 0; |
|
|
|
|
|
|
|
} else if (input_Result_Cancel == status) { |
|
|
|
overlay_clear_message(loadsave.overlay, |
|
|
|
loadsave.id); |
|
|
|
loadsave.mode = 0; |
|
|
|
status = 0; |
|
|
|
} |
|
|
|
|
|
|
|
|