void z_restart (void) { static bool first_restart = TRUE; flush_buffer (); os_restart_game (RESTART_BEGIN); seed_random (0); if (!first_restart) { fseek (story_fp, blorb_ofs, SEEK_SET); if (fread (zmp, 1, h_dynamic_size, story_fp) != h_dynamic_size) os_fatal ("Story file read error"); } else first_restart = FALSE; restart_header (); restart_screen (); sp = fp = stack + STACK_SIZE; frame_count = 0; if (h_version != V6) { long pc = (long) h_start_pc; SET_PC (pc); } else call (h_start_pc, 0, NULL, 0); os_restart_game (RESTART_END); }/* z_restart */
void Processor::z_restart() { flush_buffer(); os_restart_game(RESTART_BEGIN); seed_random(0); if (!first_restart) { story_fp->seek(0); if (story_fp->read(zmp, h_dynamic_size) != h_dynamic_size) error("Story file read error"); } else { first_restart = false; } restart_header(); restart_screen(); _sp = _fp = _stack + STACK_SIZE; _frameCount = 0; if (h_version != V6 && h_version != V9) { long pc = (long)h_start_pc; SET_PC(pc); } else { call(h_start_pc, 0, nullptr, 0); } os_restart_game(RESTART_END); }
static int save_restore( const char *file_name, int flag ) { FILE *tfp = NULL; #if defined BUFFER_FILES char tfpbuffer[BUFSIZ]; #endif int scripting_flag = 0, status = 0; #if !defined(USE_QUETZAL) zword_t zw; int little_endian = 0; /* Find out if we are big-endian */ zw = 0x0001; if ( *( zbyte_t * ) & zw ) { /* We are little-endian, like an Intel 80x86 chip. */ little_endian = 1; } #endif /* Open the save file and disable scripting */ if ( flag == GAME_SAVE || flag == GAME_RESTORE ) { if ( ( tfp = fopen( file_name, ( flag == GAME_SAVE ) ? "wb" : "rb" ) ) == NULL ) { output_line( "Cannot open SAVE file" ); return ( 1 ); } #if defined BUFFER_FILES setbuf( tfp, tfpbuffer ); #endif scripting_flag = get_word( H_FLAGS ) & SCRIPTING_FLAG; set_word( H_FLAGS, get_word( H_FLAGS ) & ( ~SCRIPTING_FLAG ) ); } #if defined(USE_QUETZAL) if ( flag == GAME_SAVE ) { status = !save_quetzal( tfp, gfp ); } else if ( flag == GAME_RESTORE ) { status = !restore_quetzal( tfp, gfp ); } else { #endif /* defined(USE_QUETZAL) */ /* Push PC, FP, version and store SP in special location */ stack[--sp] = ( zword_t ) ( pc / PAGE_SIZE ); stack[--sp] = ( zword_t ) ( pc % PAGE_SIZE ); stack[--sp] = fp; stack[--sp] = h_version; stack[0] = sp; /* Save or restore stack */ #if !defined(USE_QUETZAL) if ( flag == GAME_SAVE ) { if ( little_endian ) swap_bytes( stack, sizeof ( stack ) ); if ( status == 0 && fwrite( stack, sizeof ( stack ), 1, tfp ) != 1 ) status = 1; if ( little_endian ) swap_bytes( stack, sizeof ( stack ) ); } else if ( flag == GAME_RESTORE ) { if ( little_endian ) swap_bytes( stack, sizeof ( stack ) ); if ( status == 0 && fread( stack, sizeof ( stack ), 1, tfp ) != 1 ) status = 1; if ( little_endian ) swap_bytes( stack, sizeof ( stack ) ); } else #endif /* !defined(USE_QUETZAL) */ { if ( flag == UNDO_SAVE ) { memmove( undo_stack, stack, sizeof ( stack ) ); } else /* if (flag == UNDO_RESTORE) */ { memmove( stack, undo_stack, sizeof ( stack ) ); } } /* Restore SP, check version, restore FP and PC */ sp = stack[0]; if ( stack[sp++] != h_version ) { fatal( "save_restore(): Wrong game or version" ); } fp = stack[sp++]; pc = stack[sp++]; pc += ( unsigned long ) stack[sp++] * PAGE_SIZE; /* Save or restore writeable game data area */ #if !defined(USE_QUETZAL) if ( flag == GAME_SAVE ) { if ( status == 0 && fwrite( datap, h_restart_size, 1, tfp ) != 1 ) status = 1; } else if ( flag == GAME_RESTORE ) { if ( status == 0 && fread( datap, h_restart_size, 1, tfp ) != 1 ) status = 1; } else #endif /* !defined(USE_QUETZAL) */ { if ( flag == UNDO_SAVE ) { memmove( undo_datap, datap, h_restart_size ); } else /* if (flag == UNDO_RESTORE) */ { memmove( datap, undo_datap, h_restart_size ); } } #if defined(USE_QUETZAL) } #endif /* defined(USE_QUETZAL) */ /* Close the save file and restore scripting */ if ( flag == GAME_SAVE ) { fclose( tfp ); if ( scripting_flag ) { set_word( H_FLAGS, get_word( H_FLAGS ) | SCRIPTING_FLAG ); } } else if ( flag == GAME_RESTORE ) { fclose( tfp ); restart_screen( ); restart_interp( scripting_flag ); } /* Handle read or write errors */ if ( status ) { if ( flag == GAME_SAVE ) { output_line( "Write to SAVE file failed" ); remove( file_name ); } else { fatal( "save_restore(): Read from SAVE file failed" ); } } return ( status ); } /* save_restore */