Free Hero Mesh

Check-in [5c766650a2]
Login
This is a mirror of the main repository for Free Hero Mesh. New tickets and changes will not be accepted at this mirror.
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: 5c766650a2805ab7b715894d4225a488a2f55e04
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
122

123
124
125
126





127
128
129
130
131
132
133
'^s'
  Toggle solution replay.

'^x'
  Cancel dead animation.

'lo' <location>
  Flash the specified location briefly.


'ls' <slot>
  Load save state slot (0 to 7).






'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.







|
>




>
>
>
>
>







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)