Free Hero Mesh

Check-in [1ed0e6ebf4]
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 the ,WinLevel instruction too set the score (currently not used by anything).
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: 1ed0e6ebf4f316ca25dcf1da14fdedb713efe7c3
User & Date: user on 2022-03-31 02:12:56
Other Links: manifest | tags
Context
2022-04-02
23:11
Add fileformat.doc check-in: 13c67423df user: user tags: trunk
2022-03-31
02:12
Implement the ,WinLevel instruction too set the score (currently not used by anything). check-in: 1ed0e6ebf4 user: user tags: trunk
2022-03-23
00:46
Some corrections of the logic of making up level tables from title strings containing data entry. check-in: 79b77f8924 user: user tags: trunk
Changes

Modified class.doc from [99fc2e3e3e] to [a0b21321f2].

2001
2002
2003
2004
2005
2006
2007





2008
2009
2010
2011
2012
2013
2014

WinLevel  ( -- )
  Ends all execution and accepts the input sequence that resulted in the
  current game state as a valid solution. (In other words, the goal of the
  game is to find a sequence of inputs that result in the execution of a
  WinLevel instruction, without causing any errors or executing LoseLevel.)






XDir  ( dir -- newx )
  Finds the X coordinate of the cell in the specified direction.

,XDir  ( obj dir -- newx )
  Finds the X coordinate of the cell in the specified direction of the
  specified object.








>
>
>
>
>







2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019

WinLevel  ( -- )
  Ends all execution and accepts the input sequence that resulted in the
  current game state as a valid solution. (In other words, the goal of the
  game is to find a sequence of inputs that result in the execution of a
  WinLevel instruction, without causing any errors or executing LoseLevel.)

,WinLevel  ( score -- )
  Same as WinLevel but you can set the score, which is treated as a signed
  number; lower numbers are considered to be a better score. (Currently,
  the score is not used by anything.)

XDir  ( dir -- newx )
  Finds the X coordinate of the cell in the specified direction.

,XDir  ( obj dir -- newx )
  Finds the X coordinate of the cell in the specified direction of the
  specified object.

Modified exec.c from [171c864429] to [01a454ca8b].

39
40
41
42
43
44
45

46
47
48
49
50
51
52
Uint16 nlevelstrings;
Value*array_data;
Uint16 ndeadanim;
DeadAnimation*deadanim;
Uint8 no_dead_anim;
Uint32 max_trigger;
Uint8 conn_option;


typedef struct {
  Uint16 msg;
  Uint32 from;
  Value arg1,arg2,arg3;
} MessageVars;








>







39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Uint16 nlevelstrings;
Value*array_data;
Uint16 ndeadanim;
DeadAnimation*deadanim;
Uint8 no_dead_anim;
Uint32 max_trigger;
Uint8 conn_option;
Sint32 gameover_score;

typedef struct {
  Uint16 msg;
  Uint32 from;
  Value arg1,arg2,arg3;
} MessageVars;

3187
3188
3189
3190
3191
3192
3193
3194

3195
3196
3197
3198
3199
3200
3201
    case OP_VOLUMEAT: StackReq(2,1); t2=Pop(); Numeric(t2); t1=Pop(); Numeric(t1); Push(NVALUE(volume_at(t1.u,t2.u))); break;
    case OP_WEIGHT: StackReq(0,1); Push(NVALUE(o->weight)); break;
    case OP_WEIGHT_C: StackReq(1,1); Push(GetVariableOrAttributeOf(weight,NVALUE)); break;
    case OP_WEIGHT_E: NoIgnore(); StackReq(1,0); t1=Pop(); Numeric(t1); o->weight=t1.u; break;
    case OP_WEIGHT_E16: NoIgnore(); StackReq(1,0); t1=Pop(); Numeric(t1); o->weight=t1.u&0xFFFF; break;
    case OP_WEIGHT_EC: NoIgnore(); StackReq(2,0); t1=Pop(); Numeric(t1); i=v_object(Pop()); if(i!=VOIDLINK) objects[i]->weight=t1.u; break;
    case OP_WEIGHT_EC16: NoIgnore(); StackReq(2,0); t1=Pop(); Numeric(t1); i=v_object(Pop()); if(i!=VOIDLINK) objects[i]->weight=t1.u&0xFFFF; break;
    case OP_WINLEVEL: key_ignored=0; gameover=1; Throw(0); break;

    case OP_XDIR: StackReq(1,1); t1=Pop(); Numeric(t1); Push(NVALUE(o->x+x_delta[resolve_dir(obj,t1.u)])); break;
    case OP_XDIR_C: StackReq(2,1); t1=Pop(); Numeric(t1); i=v_object(Pop()); if(i==VOIDLINK) Push(NVALUE(0)); else Push(NVALUE(objects[i]->x+x_delta[resolve_dir(i,t1.u)])); break;
    case OP_XLOC: StackReq(0,1); Push(NVALUE(o->x)); break;
    case OP_XLOC_C: StackReq(1,1); Push(GetVariableOf(x,NVALUE)); break;
    case OP_XSTEP: StackReq(1,1); t1=Pop(); Numeric(t1); Push(NVALUE(x_delta[resolve_dir(obj,t1.u)])); break;
    case OP_XSTEP_C: StackReq(2,1); t1=Pop(); Numeric(t1); i=v_object(Pop()); if(i==VOIDLINK) Push(NVALUE(0)); else Push(NVALUE(x_delta[resolve_dir(i,t1.u)])); break;
    case OP_XYDIR: StackReq(1,2); t1=Pop(); Numeric(t1); i=resolve_dir(obj,t1.u); Push(NVALUE(o->x+x_delta[i])); Push(NVALUE(o->y+y_delta[i])); break;







|
>







3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
    case OP_VOLUMEAT: StackReq(2,1); t2=Pop(); Numeric(t2); t1=Pop(); Numeric(t1); Push(NVALUE(volume_at(t1.u,t2.u))); break;
    case OP_WEIGHT: StackReq(0,1); Push(NVALUE(o->weight)); break;
    case OP_WEIGHT_C: StackReq(1,1); Push(GetVariableOrAttributeOf(weight,NVALUE)); break;
    case OP_WEIGHT_E: NoIgnore(); StackReq(1,0); t1=Pop(); Numeric(t1); o->weight=t1.u; break;
    case OP_WEIGHT_E16: NoIgnore(); StackReq(1,0); t1=Pop(); Numeric(t1); o->weight=t1.u&0xFFFF; break;
    case OP_WEIGHT_EC: NoIgnore(); StackReq(2,0); t1=Pop(); Numeric(t1); i=v_object(Pop()); if(i!=VOIDLINK) objects[i]->weight=t1.u; break;
    case OP_WEIGHT_EC16: NoIgnore(); StackReq(2,0); t1=Pop(); Numeric(t1); i=v_object(Pop()); if(i!=VOIDLINK) objects[i]->weight=t1.u&0xFFFF; break;
    case OP_WINLEVEL: key_ignored=0; gameover=1; gameover_score=move_number+1; Throw(0); break;
    case OP_WINLEVEL_C: StackReq(1,0); t1=Pop(); Numeric(t1); key_ignored=0; gameover=1; gameover_score=t1.s; Throw(0); break;
    case OP_XDIR: StackReq(1,1); t1=Pop(); Numeric(t1); Push(NVALUE(o->x+x_delta[resolve_dir(obj,t1.u)])); break;
    case OP_XDIR_C: StackReq(2,1); t1=Pop(); Numeric(t1); i=v_object(Pop()); if(i==VOIDLINK) Push(NVALUE(0)); else Push(NVALUE(objects[i]->x+x_delta[resolve_dir(i,t1.u)])); break;
    case OP_XLOC: StackReq(0,1); Push(NVALUE(o->x)); break;
    case OP_XLOC_C: StackReq(1,1); Push(GetVariableOf(x,NVALUE)); break;
    case OP_XSTEP: StackReq(1,1); t1=Pop(); Numeric(t1); Push(NVALUE(x_delta[resolve_dir(obj,t1.u)])); break;
    case OP_XSTEP_C: StackReq(2,1); t1=Pop(); Numeric(t1); i=v_object(Pop()); if(i==VOIDLINK) Push(NVALUE(0)); else Push(NVALUE(x_delta[resolve_dir(i,t1.u)])); break;
    case OP_XYDIR: StackReq(1,2); t1=Pop(); Numeric(t1); i=resolve_dir(obj,t1.u); Push(NVALUE(o->x+x_delta[i])); Push(NVALUE(o->y+y_delta[i])); break;

Modified heromesh.h from [5a98591922] to [1eb8371df6].

301
302
303
304
305
306
307

308
309
310
311
312
313
314
extern Uint16 nlevelstrings;
extern Value*array_data;
extern Uint16 ndeadanim;
extern DeadAnimation*deadanim;
extern Uint8 no_dead_anim;
extern Uint32 max_trigger;
extern Uint8 conn_option;


const unsigned char*value_string_ptr(Value v);
void pfunlink(Uint32 n);
void pflink(Uint32 n);
Uint32 objalloc(Uint16 c);
void objtrash(Uint32 n);
void annihilate(void);







>







301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
extern Uint16 nlevelstrings;
extern Value*array_data;
extern Uint16 ndeadanim;
extern DeadAnimation*deadanim;
extern Uint8 no_dead_anim;
extern Uint32 max_trigger;
extern Uint8 conn_option;
extern Sint32 gameover_score;

const unsigned char*value_string_ptr(Value v);
void pfunlink(Uint32 n);
void pflink(Uint32 n);
Uint32 objalloc(Uint16 c);
void objtrash(Uint32 n);
void annihilate(void);

Modified instruc from [9080651e62] to [916ec56ae6].

285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
Synchronize
,Target
Trace
,TraceStack
Trigger
TriggerAt
VolumeAt
WinLevel
,XDir
,XStep
XYDir
,YDir
,YStep

; Operations with marks







|







285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
Synchronize
,Target
Trace
,TraceStack
Trigger
TriggerAt
VolumeAt
,WinLevel
,XDir
,XStep
XYDir
,YDir
,YStep

; Operations with marks

Modified instruc.h from [67fc3e7eb1] to [d8eb492638].

427
428
429
430
431
432
433

434
435
436
437
438
439
440
#define OP_TRACE 32981
#define OP_TRACESTACK 32982
#define OP_TRACESTACK_C 35030
#define OP_TRIGGER 32983
#define OP_TRIGGERAT 32984
#define OP_VOLUMEAT 32985
#define OP_WINLEVEL 32986

#define OP_XDIR 32987
#define OP_XDIR_C 35035
#define OP_XSTEP 32988
#define OP_XSTEP_C 35036
#define OP_XYDIR 32989
#define OP_YDIR 32990
#define OP_YDIR_C 35038







>







427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
#define OP_TRACE 32981
#define OP_TRACESTACK 32982
#define OP_TRACESTACK_C 35030
#define OP_TRIGGER 32983
#define OP_TRIGGERAT 32984
#define OP_VOLUMEAT 32985
#define OP_WINLEVEL 32986
#define OP_WINLEVEL_C 35034
#define OP_XDIR 32987
#define OP_XDIR_C 35035
#define OP_XSTEP 32988
#define OP_XSTEP_C 35036
#define OP_XYDIR 32989
#define OP_YDIR 32990
#define OP_YDIR_C 35038
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
{"VisualOnly",8618099},
{"Volume",9142350},
{"VolumeAt",8421593},
{"W",9437188},
{"WAHOO",8389400},
{"WHACK",8389423},
{"Weight",9142352},
{"WinLevel",8421594},
{"XDir",8487131},
{"XStep",8487132},
{"XYDir",8421597},
{"Xloc",8486980},
{"YDir",8487134},
{"YEEHAW",8389401},
{"YStep",8487135},







|







740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
{"VisualOnly",8618099},
{"Volume",9142350},
{"VolumeAt",8421593},
{"W",9437188},
{"WAHOO",8389400},
{"WHACK",8389423},
{"Weight",9142352},
{"WinLevel",8487130},
{"XDir",8487131},
{"XStep",8487132},
{"XYDir",8421597},
{"Xloc",8486980},
{"YDir",8487134},
{"YEEHAW",8389401},
{"YStep",8487135},