Free Hero Mesh

Check-in [67bacbf22a]
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:More details figured out of the file format
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: 67bacbf22aabb77d442f65ba00b42ad2cbb93251
User & Date: user on 2018-03-16 01:51:05
Other Links: manifest | tags
Context
2018-03-17
06:10
Improve the converter program check-in: 6d36e2c377 user: user tags: trunk
2018-03-16
01:51
More details figured out of the file format check-in: 67bacbf22a user: user tags: trunk
2018-03-10
22:48
RLE compression of levels check-in: 06cd05742f user: user tags: trunk
Changes

Modified fileform1.txt from [a949aa6944] to [bbb40911a8].

226
227
228
229
230
231
232
233
234


235
236
237



238
239
240
241
242
243
244
245
246
247
248
249
250
251






252
253
254
255
256
257
258
226
227
228
229
230
231
232


233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267







-
-
+
+



+
+
+














+
+
+
+
+
+







19=Departures, 32=Busy, 33=Invisible, 34=UserSignal, 35=UserState,
36=KeyCleared, 37=IsPlayer, 38=Destroyed, 39=Stealthy, 40=VisualOnly,
48=Msg, 49=MsgFrom, 50=MsgArg1, 51=MsgArg2, 64=Density, 65=Volume,
66=Strength, 67=Weight, 68=Distance, 69=Height, 70=Climb, 72=HardE,
73=HardN, 74=HardW, 75=HardS, 76=SharpE, 77=SharpN, 78=SharpW, 79=SharpS,
80=ShapeE, 81=ShapeN, 82=ShapeW, 83=ShapeS, 84=Shovable

[2*] Retrieve local variable from other object. Local variable numbers are
the same as opcode 1.
[2/1*] Retrieve local variable from other object. Local variable numbers
are the same as opcode 1.

[3/1] Assignment to standard local variables of current object.

[4/2] Assignment to standard local variable of other object (the first
(top) value taken from the stack is the value, and second is the object).

[5*] User-defined local variable; the second byte is zero-based local
variable number.

[6/1] Assignment to user-defined variable; the second byte is the
zero-based local variable number to write to.

[7*] Short decimal constant; the second byte is the 8-bit value.

[8*] Long decimal constant. The next two words are the small-endian 32-bit
number that it represents.

[9*] Short class constant; the second byte is a zero-based class number
(the class number is one-based at runtime).

[11*] Message constant; the second byte is the message number.

[13*] String literal. Follow by one WORD giving number of bytes of string
(including null terminator, always even), and then null-terminated special
text. There may be two null terminators if needed to make it even.

[14*] Direction constant (0-7 for absolute, 8-15 for relative)

[16/1*] Unary operator: 0=negative, 1=bitwise NOT, 2=logical NOT

[17/2*] Binary operator: 0=multiply, 1=divide, 2=modulo

[18/2*] Binary operator: 0=add, 1=subtract, 2=AND, 3=OR, 4=XOR
266
267
268
269
270
271
272
273

274
275
276
277

278
279
280
281
282
283
284
275
276
277
278
279
280
281

282
283
284
285

286
287
288
289
290
291
292
293







-
+



-
+








[32] ObjDir

[34] ObjAbove

[36] ObjBelow

[38] 0=ObjTopAt, 1=ObjBottomAt, 2=VolumeAt, 3=HeightAt, 4=Delta
[38/2*] 0=ObjTopAt, 1=ObjBottomAt, 2=VolumeAt, 3=HeightAt, 4=Delta

[39*] Self

[40] ObjClassAt
[40/3*] ObjClassAt

[48*] Key

[49*] Animation constant: 0=STOP, 1=ONCE, 2=LOOP, 8=OSC

[50*] Keyboard constant: See section about key codes.

299
300
301
302
303
304
305








306



307
308


309












310

311


312

313
314

315
316


317
318



319
320

321
322
323
324
325
326
327
328



329
330
331
332

333
334
335
336
337

338
339
340
341
342
343
344
345
346
347
348
349
350
351

352


353

354
355
356
357
358
359
360
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322

323
324
325
326

327
328
329
330
331
332
333
334
335
336
337
338
339
340
341

342
343
344
345

346
347

348
349

350
351
352

353
354
355
356

357
358
359
360
361
362
363
364

365
366
367
368
369
370

371
372
373
374
375

376
377
378
379
380
381
382
383
384
385
386
387
388
389

390
391
392
393

394
395
396
397
398
399
400
401







+
+
+
+
+
+
+
+
-
+
+
+

-
+
+

+
+
+
+
+
+
+
+
+
+
+
+
-
+

+
+
-
+

-
+

-
+
+

-
+
+
+

-
+







-
+
+
+



-
+




-
+













-
+

+
+
-
+







[59*] Bit constant 0-31; the second byte is the number 0-31, and at
runtime it is replaced by the relevant 32-bit number.

[60*] Sound constant (see section about user sounds)

[61] 0=ClassCount/1* (I don't know what this does), 1=GetArray

[64/3*] SendMessage (to Self)

[65/4*] SendMessage

[66/3*] Broadcast; second byte is zero-based class number

[67/4*] Broadcast

[68/1*] Move(Self, ...); minor code is 255
[68/1*] Move(Self, ...); minor code is 255 to take the value from the
stack, or is another number for a direction constant (in this latter case
the same bug occurs as with opcode 84).

[69/2*] Move; minor code is 255
[69/2*] Move; minor code is same as opcode 68, but the bug with opcode 84
does not occur, regardless of the minor code.

[70/2*] JumpTo(Self, ...)

[71/3*] JumpTo

[72/5*] Create

[74*] Destroy(Self)

[75/1*] Destroy

[80/3] SendMessage(Self, ...)

[80] SendMessage
[81/4] SendMessage

[82/3] Broadcast; second byte is zero-based class number

[82] Broadcast
[83/4] Broadcast

[84-] Move(Self, dir). The second byte is the direction to move. Unlike
[84] Move(Self, dir). The second byte is the direction to move. Unlike
the normal Move() function, this one adds Strength to Inertia instead of
setting Inertia equal to Strength (this seems to be a bug).
setting Inertia equal to Strength (this seems to be a bug). If the minor
code is 255 then takes direction from stack and does not have this bug.

[85/2] Move; minor code is 255
[85] Move. The second byte is the same as for opcode 84; if 255 then it
takes from the stack (before taking the object to move). In this case the
bug mentioned above does not occur regardless of what the minor code is.

[88] Create
[88/5] Create

[96] Comment. Has one WORD giving length of the comment text (including
the null terminator), and then the plain text of the comment (with CRLF
line endings), null terminated.

[97] Popup setting. Second byte is 0 for PopupColor or 1 for PopupLoc.

[98] Destroy
[98] Destroy(Self)

[99/1] Destroy

[100] CallSub

[101] Goto
[101-] Goto; next WORD is address to branch to unconditionally

[102] Return. Second byte is 0 for implicit end of SUBS block, 1 for
return from a subroutine, 2 for the end of a message block.

[103] Return short constant. Second byte is return value.
[103-] Return short constant. Second byte is return value.

[104/1] Return

[105/1] If. Second byte is zero for block-if or one for inline-if. The
next word is the number of words to skip (including the count itself) if
the condition is false.

[106] Else

[107/3] ImageSeq (seems to do nothing?)

[108/3] ImageLoop (seems to do nothing?)

[109] PopUp
[109] PopUp. Values taken from the stack is one plus the minor code.

[110/2] JumpTo(Self, ...)

[110] JumpTo
[111/3] JumpTo

[112] Sound

[114] Array operations. Second byte: 0 = definition of an array, 1 =
SetArray, 2 = InitArray.

[126] Animate
377
378
379
380
381
382
383
384


385
386
387
388

389
390
391
392
393
394
395
418
419
420
421
422
423
424

425
426
427
428
429

430
431
432
433
434
435
436
437







-
+
+



-
+







[134] ForEachObjAt

[240] Trace


=== Levels ===

After all classes are the levels. Before the levels comes:
After all classes are the levels. Before the levels comes a header of four
bytes that consists of:

* Number of levels (WORD)

* Two null bytes (meaing unknown)
* Two null bytes with unknown meaning

Each level consists of:

* Zero-based level number (WORD)

* Level description length, including the null terminator (WORD)