Overview
Comment: | Implement SHIFT+DELETE to delete moves up to the mark. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
5c766650a2805ab7b715894d4225a488 |
User & Date: | user on 2023-10-17 01:33:53 |
Other Links: | manifest | tags |
Context
2023-10-18
| ||
04:56 | Change colour of (X,Y) coordinates to make it easier to read. check-in: 1ca3a03298 user: user tags: trunk | |
2023-10-17
| ||
01:33 | Implement SHIFT+DELETE to delete moves up to the mark. check-in: 5c766650a2 user: user tags: trunk | |
2023-10-16
| ||
00:12 | Implement save state slots, including loading personal best solutions. check-in: cc0df8402f user: user tags: trunk | |
Changes
Modified bindings.doc from [be07d45d1e] to [84cdf61435].
︙ | ︙ | |||
115 116 117 118 119 120 121 | '^s' Toggle solution replay. '^x' Cancel dead animation. 'lo' <location> | | > > > > > > | 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | '^s' Toggle solution replay. '^x' Cancel dead animation. 'lo' <location> Flash the specified location briefly (same as the LocateMe instruction in the class codes). 'ls' <slot> Load save state slot (0 to 7). 'md' <number> Multiple deletion. No effect if the number is zero or negative. If the number is 1 then it is the same as the '^-' binding, while a sufficiently large number is the same as the '^D' binding. 'mi' <command> Import a move list. The argument is a operating system command, that when executed will write the move list to stdout, with one byte per move (the Hero Mesh key codes). 'ml' <blob> Load a move list from a SQL blob. |
︙ | ︙ |
Modified default.heromeshrc from [d8800e43cf] to [15c07e1dd4].
︙ | ︙ | |||
140 141 142 143 144 145 146 147 148 149 150 151 152 153 | ?.gameKey.alt.P: ^p ?.gameKey.alt.R: select 'go',id from levels where not solved order by random() limit 1; ?.gameKey.alt.X: ^x ?.gameKey.alt.leftbracket: select 'rs',-5; ?.gameKey.alt.rightbracket: select 'rs',+5; ?.gameKey.delete: ^- ?.gameKey.ctrl.delete: ^D ?.gameKey.insert: ^+ ?.gameKey.alt.kp_minus: select 'go',-ord from levels where ord<$level and not solved order by ord desc limit 1; ?.gameKey.alt.kp_plus: select 'go',-ord from levels where ord>$level and not solved order by ord asc limit 1; ?.gameKey.shift.1: select 'ss',0; ?.gameKey.shift.2: select 'ss',1; ?.gameKey.shift.3: select 'ss',2; ?.gameKey.shift.4: select 'ss',3; | > | 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | ?.gameKey.alt.P: ^p ?.gameKey.alt.R: select 'go',id from levels where not solved order by random() limit 1; ?.gameKey.alt.X: ^x ?.gameKey.alt.leftbracket: select 'rs',-5; ?.gameKey.alt.rightbracket: select 'rs',+5; ?.gameKey.delete: ^- ?.gameKey.ctrl.delete: ^D ?.gameKey.shift.delete: select 'md',mark()-movenumber(); ?.gameKey.insert: ^+ ?.gameKey.alt.kp_minus: select 'go',-ord from levels where ord<$level and not solved order by ord desc limit 1; ?.gameKey.alt.kp_plus: select 'go',-ord from levels where ord>$level and not solved order by ord asc limit 1; ?.gameKey.shift.1: select 'ss',0; ?.gameKey.shift.2: select 'ss',1; ?.gameKey.shift.3: select 'ss',2; ?.gameKey.shift.4: select 'ss',3; |
︙ | ︙ |
Modified function.c from [298c389de1] to [691117504c].
︙ | ︙ | |||
1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 | sqlite3_create_function(userdb,"LEVEL",0,SQLITE_UTF8,&level_ord,fn_level,0,0); sqlite3_create_function(userdb,"LEVEL_CACHEID",0,SQLITE_UTF8|SQLITE_DETERMINISTIC,ptr0,fn_cacheid,0,0); sqlite3_create_function(userdb,"LEVEL_CODE",0,SQLITE_UTF8,&level_code,fn_level,0,0); sqlite3_create_function(userdb,"LEVEL_ID",0,SQLITE_UTF8,&level_id,fn_level,0,0); sqlite3_create_function(userdb,"LEVEL_TITLE",0,SQLITE_UTF8,0,fn_level_title,0,0); sqlite3_create_function(userdb,"LEVEL_VERSION",0,SQLITE_UTF8,&level_version,fn_level,0,0); sqlite3_create_function(userdb,"LOAD_LEVEL",1,SQLITE_UTF8,0,fn_load_level,0,0); sqlite3_create_function(userdb,"MAX_LEVEL",0,SQLITE_UTF8,0,fn_max_level,0,0); sqlite3_create_function(userdb,"MODSTATE",0,SQLITE_UTF8,0,fn_modstate,0,0); sqlite3_create_function(userdb,"MOVE_LIST",0,SQLITE_UTF8,0,fn_move_list,0,0); sqlite3_create_function(userdb,"MOVENUMBER",0,SQLITE_UTF8,0,fn_movenumber,0,0); sqlite3_create_function(userdb,"MVALUE",1,SQLITE_UTF8|SQLITE_DETERMINISTIC,0,fn_mvalue,0,0); sqlite3_create_function(userdb,"NVALUE",1,SQLITE_UTF8|SQLITE_DETERMINISTIC,0,fn_zero_extend,0,0); sqlite3_create_function(userdb,"OVALUE",1,SQLITE_UTF8,0,fn_ovalue,0,0); sqlite3_create_function(userdb,"PFHEIGHT",0,SQLITE_UTF8,&pfheight,fn_pfsize,0,0); sqlite3_create_function(userdb,"PFWIDTH",0,SQLITE_UTF8,&pfwidth,fn_pfsize,0,0); sqlite3_create_function(userdb,"PICTURE_SIZE",0,SQLITE_UTF8|SQLITE_DETERMINISTIC,0,fn_picture_size,0,0); | > > | 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 | sqlite3_create_function(userdb,"LEVEL",0,SQLITE_UTF8,&level_ord,fn_level,0,0); sqlite3_create_function(userdb,"LEVEL_CACHEID",0,SQLITE_UTF8|SQLITE_DETERMINISTIC,ptr0,fn_cacheid,0,0); sqlite3_create_function(userdb,"LEVEL_CODE",0,SQLITE_UTF8,&level_code,fn_level,0,0); sqlite3_create_function(userdb,"LEVEL_ID",0,SQLITE_UTF8,&level_id,fn_level,0,0); sqlite3_create_function(userdb,"LEVEL_TITLE",0,SQLITE_UTF8,0,fn_level_title,0,0); sqlite3_create_function(userdb,"LEVEL_VERSION",0,SQLITE_UTF8,&level_version,fn_level,0,0); sqlite3_create_function(userdb,"LOAD_LEVEL",1,SQLITE_UTF8,0,fn_load_level,0,0); sqlite3_create_function(userdb,"MARK",0,SQLITE_UTF8,&replay_mark,fn_level,0,0); sqlite3_create_function(userdb,"MAX_LEVEL",0,SQLITE_UTF8,0,fn_max_level,0,0); sqlite3_create_function(userdb,"MODSTATE",0,SQLITE_UTF8,0,fn_modstate,0,0); sqlite3_create_function(userdb,"MOVE_LIST",0,SQLITE_UTF8,0,fn_move_list,0,0); sqlite3_create_function(userdb,"MOVECOUNT",0,SQLITE_UTF8,&replay_count,fn_level,0,0); sqlite3_create_function(userdb,"MOVENUMBER",0,SQLITE_UTF8,0,fn_movenumber,0,0); sqlite3_create_function(userdb,"MVALUE",1,SQLITE_UTF8|SQLITE_DETERMINISTIC,0,fn_mvalue,0,0); sqlite3_create_function(userdb,"NVALUE",1,SQLITE_UTF8|SQLITE_DETERMINISTIC,0,fn_zero_extend,0,0); sqlite3_create_function(userdb,"OVALUE",1,SQLITE_UTF8,0,fn_ovalue,0,0); sqlite3_create_function(userdb,"PFHEIGHT",0,SQLITE_UTF8,&pfheight,fn_pfsize,0,0); sqlite3_create_function(userdb,"PFWIDTH",0,SQLITE_UTF8,&pfwidth,fn_pfsize,0,0); sqlite3_create_function(userdb,"PICTURE_SIZE",0,SQLITE_UTF8|SQLITE_DETERMINISTIC,0,fn_picture_size,0,0); |
︙ | ︙ |
Modified game.c from [1d7efeafa0] to [db30238ae3].
︙ | ︙ | |||
1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 | if(solution_replay) { screen_message("You cannot load states during solution replay"); return -3; } number=exchange_state(number&7,'l'); if(number<0) return -3; goto restart; case 'mi': // Move list import if(argc<2 || solution_replay) break; if(replay_pos) begin_level(level_id); do_import_moves(sqlite3_column_text(args,1)); return 1; case 'ml': // Move list load if(argc<2 || solution_replay) break; | > > > > > > > > > > > > > > > | 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 | if(solution_replay) { screen_message("You cannot load states during solution replay"); return -3; } number=exchange_state(number&7,'l'); if(number<0) return -3; goto restart; case 'md': // Delete multiple moves inputs_count=0; if(solution_replay) { screen_message("You cannot delete moves during the solution replay"); return -3; } if(replay_pos==replay_count || number<=0) return 0; if(number>replay_count-replay_pos) number=replay_count-replay_pos; memmoveM(replay_list+replay_pos,replay_list+replay_pos+number,replay_count-replay_pos-number); replay_count-=number; if(replay_mark>replay_pos) { replay_mark-=number; if(replay_mark<replay_pos) replay_mark=replay_pos; } return 0; case 'mi': // Move list import if(argc<2 || solution_replay) break; if(replay_pos) begin_level(level_id); do_import_moves(sqlite3_column_text(args,1)); return 1; case 'ml': // Move list load if(argc<2 || solution_replay) break; |
︙ | ︙ |
Modified game.doc from [6b233e488f] to [a5b8aab4e8].
︙ | ︙ | |||
178 179 180 181 182 183 184 185 186 187 188 189 190 191 | ALT+P Begin slow replay ALT+R Select a unsolved level at random ALT+[ Increase slow replay speed ALT+] Decrease slow replay speed INS Toggle insertion mode DEL Delete a move CTRL+DEL Delete all moves forward SHIFT+num Save state 1 to 8 CTRL+num Load state 1 to 8 ALT+num Exchange state 1 to 8 Mouse (in grid): MIDDLE Describe topmost object | > | 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | ALT+P Begin slow replay ALT+R Select a unsolved level at random ALT+[ Increase slow replay speed ALT+] Decrease slow replay speed INS Toggle insertion mode DEL Delete a move CTRL+DEL Delete all moves forward SHIFT+DEL Delete moves up to mark SHIFT+num Save state 1 to 8 CTRL+num Load state 1 to 8 ALT+num Exchange state 1 to 8 Mouse (in grid): MIDDLE Describe topmost object |
︙ | ︙ |
Modified sql.doc from [6cfdf31851] to [2156835595].
︙ | ︙ | |||
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | LEVEL_VERSION() The version number of the current level. LOAD_LEVEL(level_id) Only valid when Free Hero Mesh is invoked with the -x switch. Loads the level with the specified ID number. MAX_LEVEL() The number of levels in this puzzle set (equal to the maximum valid level order number). MVALUE(number) Makes a game value of type 'message'. MODSTATE() The SDL keyboard modifier state. MOVE_LIST() Return the current move list as a blob. MOVENUMBER() Return the number of moves executed so far since the level restarted. NVALUE(number) Makes a game value of type 'number'. Same as ZERO_EXTEND. OVALUE(number) | > > > > > > | 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | LEVEL_VERSION() The version number of the current level. LOAD_LEVEL(level_id) Only valid when Free Hero Mesh is invoked with the -x switch. Loads the level with the specified ID number. MARK() The number of moves in the replay list before the mark. MAX_LEVEL() The number of levels in this puzzle set (equal to the maximum valid level order number). MVALUE(number) Makes a game value of type 'message'. MODSTATE() The SDL keyboard modifier state. MOVE_LIST() Return the current move list as a blob. MOVECOUNT() The total number of moves in the replay list. MOVENUMBER() Return the number of moves executed so far since the level restarted. NVALUE(number) Makes a game value of type 'number'. Same as ZERO_EXTEND. OVALUE(number) |
︙ | ︙ |