Index: bindings.doc ================================================================== --- bindings.doc +++ bindings.doc @@ -64,10 +64,17 @@ Rewind to mark. '^>' Replay to mark. +'^-' + Delete one move. + +'^+' + Toggle insertion mode. Insertion mode is automatically reset when + restarting a level or when accessing a different level. + '^I' Toggle the inventory/move-list display. '^M' Set the replay mark position. Index: default.heromeshrc ================================================================== --- default.heromeshrc +++ default.heromeshrc @@ -131,10 +131,12 @@ ?.gameKey.tab: ^I ?.gameKey.alt.G: ^g ?.gameKey.alt.P: ^p ?.gameKey.alt.leftbracket: select 'rs',-5; ?.gameKey.alt.rightbracket: select 'rs',+5; +?.gameKey.delete: ^- +?.gameKey.insert: ^+ ! Editor key bindings ?.editKey.1: select 'mr',0; ?.editKey.2: select 'mr',1; ?.editKey.3: select 'mr',2; Index: game.c ================================================================== --- game.c +++ game.c @@ -30,10 +30,11 @@ static Uint8 side_mode=255; static Uint8 should_record_solution; static Uint8 replay_speed; static Uint8 replay_time; static Uint8 solved; +static Uint8 inserting,saved_inserting; static void record_solution(void); static void setup_game(void) { const char*v; @@ -137,11 +138,11 @@ for(y=44,x=replay_pos-(screen->h-68)/32;;x++) { y+=16; if(y+24>screen->h) break; if(x>=0 && xreplay_count-replay_pos) number=replay_count-replay_pos; if(number<=0) return prev; if(inputs_count+number>=inputs_size) { inputs=realloc(inputs,inputs_size+=number+1); @@ -706,10 +709,11 @@ } memcpy(inputs+inputs_count,replay_list+replay_pos,number); inputs_count+=number; return 0; case '- ': // Rewind + saved_inserting=inserting; number=replay_pos-number; if(number<0) number=0; //fallthru case '= ': restart: // Restart begin_level(level_id); @@ -727,10 +731,21 @@ goto restart; case '^>': // Replay to mark inputs_count=0; number=replay_mark-replay_pos; goto replay; + case '^-': // Delete move + inputs_count=0; + if(replay_pos==replay_count) return 0; + memmove(replay_list+replay_pos,replay_list+replay_pos+1,replay_count-replay_pos-1); + replay_count--; + if(replay_mark>replay_pos) replay_mark--; + return 0; + case '^+': // Insert moves + inputs_count=0; + inserting^=1; + return 0; case '^E': // Edit return main_options['r']?1:-2; case '^I': // Toggle inventory display side_mode^=1; return prev; @@ -830,10 +845,23 @@ screen_message(t); gameover=-1; return; } if(!key_ignored) { + if(inserting) { + if(replay_pos>=0xFFFE || replay_pos==replay_count) { + inserting=0; + } else { + if(replay_count>=0xFFFE) replay_count=0xFFFD; + if(replay_size<0xFFFF) { + replay_list=realloc(replay_list,replay_size=0xFFFF); + if(!replay_list) fatal("Allocation failed\n"); + } + memmove(replay_list+replay_pos+1,replay_list+replay_pos,replay_count-replay_pos); + replay_count++; + } + } if(replay_pos>=replay_size) { if(replay_size>0xFDFF) replay_size=0xFDFF; if(replay_size+0x200<=replay_pos) fatal("Confusion in input_move function\n"); replay_list=realloc(replay_list,replay_size+=0x200); if(!replay_list) fatal("Allocation failed\n"); @@ -946,10 +974,11 @@ } replay: if(inputs_count) { for(i=0;i