From 5058b6319eb69341996d6d421cf4a3392e0407c0 Mon Sep 17 00:00:00 2001 From: Filip Balyu Date: Tue, 27 Jan 2026 06:22:19 +0100 Subject: [PATCH] Integration of Level 9 dev tools recoded in C --- l9dev/LICENSE | 201 + l9dev/License.txt | 25 + l9dev/Makefile | 29 + l9dev/README.md | 171 + l9dev/acode.acd | Bin 0 -> 276 bytes l9dev/code.c | 698 +++ l9dev/code.h | 108 + l9dev/common.h | 114 + l9dev/comp.c | 2039 ++++++++ l9dev/comp.h | 243 + l9dev/compile.bat | 3 + l9dev/driver.c | 342 ++ l9dev/driver.h | 22 + l9dev/exit.txt | 550 ++ l9dev/finish.c | 492 ++ l9dev/finish.h | 49 + l9dev/l9asm2bin | 37 + l9dev/l9bin2tos | 45 + l9dev/l9comp | Bin 0 -> 81592 bytes l9dev/l9finish | Bin 0 -> 28384 bytes l9dev/l9gamegen | 54 + l9dev/l9squash | Bin 0 -> 52440 bytes l9dev/l9tablegen | 63 + l9dev/main.l9/gamedata.dat | Bin 0 -> 17381 bytes l9dev/main.l9/message.txt | 1861 +++++++ l9dev/main.l9/squash.dat | Bin 0 -> 16640 bytes l9dev/pccode.c | 627 +++ l9dev/regress/compile.bat | 3 + l9dev/regress/compile.log | 1968 +++++++ l9dev/regress/compileall | 210 + l9dev/regress/compileerrors | 9 + l9dev/regress/errors.log | 215 + l9dev/regress/errors.ref | 215 + l9dev/regress/errors.txt | 132 + l9dev/regress/games.l9/billy.l9/aaconst.txt | 829 +++ l9dev/regress/games.l9/billy.l9/aahead.txt | 434 ++ l9dev/regress/games.l9/billy.l9/aavars.txt | 295 ++ l9dev/regress/games.l9/billy.l9/amconst.txt | 10 + l9dev/regress/games.l9/billy.l9/arcade.txt | 275 + l9dev/regress/games.l9/billy.l9/box.fnt | Bin 0 -> 887 bytes l9dev/regress/games.l9/billy.l9/cache.txt | 185 + l9dev/regress/games.l9/billy.l9/comms.txt | 614 +++ l9dev/regress/games.l9/billy.l9/demo.txt | 2067 ++++++++ l9dev/regress/games.l9/billy.l9/display.txt | 2171 ++++++++ l9dev/regress/games.l9/billy.l9/duel.txt | 207 + l9dev/regress/games.l9/billy.l9/exit.txt | 583 +++ l9dev/regress/games.l9/billy.l9/fire.txt | 937 ++++ l9dev/regress/games.l9/billy.l9/firstvar.txt | 6 + l9dev/regress/games.l9/billy.l9/floors.txt | 120 + l9dev/regress/games.l9/billy.l9/fontbbc.txt | Bin 0 -> 1293 bytes l9dev/regress/games.l9/billy.l9/fx.txt | 243 + l9dev/regress/games.l9/billy.l9/goal.txt | 186 + l9dev/regress/games.l9/billy.l9/identiks.dat | Bin 0 -> 9510 bytes l9dev/regress/games.l9/billy.l9/intro.txt | 333 ++ l9dev/regress/games.l9/billy.l9/language.txt | 6 + l9dev/regress/games.l9/billy.l9/manual.txt | 648 +++ l9dev/regress/games.l9/billy.l9/menu.txt | 1295 +++++ l9dev/regress/games.l9/billy.l9/menudata.txt | 979 ++++ l9dev/regress/games.l9/billy.l9/message.txt | 1200 +++++ l9dev/regress/games.l9/billy.l9/movecurs.txt | 291 ++ l9dev/regress/games.l9/billy.l9/music.txt | 193 + .../regress/games.l9/billy.l9/pc.l9/acode.acd | Bin 0 -> 39143 bytes .../games.l9/billy.l9/pc.l9/compile.bat | 27 + .../regress/games.l9/billy.l9/pc.l9/exit.txt | 583 +++ .../games.l9/billy.l9/pc.l9/gamedata.dat | Bin 0 -> 19681 bytes .../games.l9/billy.l9/pc.l9/mconst.txt | 10 + .../games.l9/billy.l9/pc.l9/message.txt | 1200 +++++ .../games.l9/billy.l9/pc.l9/ref/acode.acd | Bin 0 -> 39143 bytes .../games.l9/billy.l9/pc.l9/ref/gamedata.dat | Bin 0 -> 19681 bytes .../games.l9/billy.l9/pc.l9/ref/message.txt | 1200 +++++ .../games.l9/billy.l9/pc.l9/ref/squash.dat | Bin 0 -> 14592 bytes .../games.l9/billy.l9/pc.l9/squash.dat | Bin 0 -> 14592 bytes .../regress/games.l9/billy.l9/pc.l9/table.dat | Bin 0 -> 4868 bytes .../regress/games.l9/billy.l9/pc.l9/table.txt | 2150 ++++++++ l9dev/regress/games.l9/billy.l9/pcconst.txt | 10 + l9dev/regress/games.l9/billy.l9/print.txt | 340 ++ l9dev/regress/games.l9/billy.l9/readfont.txt | 10 + l9dev/regress/games.l9/billy.l9/s.dat | Bin 0 -> 59942 bytes l9dev/regress/games.l9/billy.l9/spaniob.txt | 225 + l9dev/regress/games.l9/billy.l9/squash.dat | Bin 0 -> 14592 bytes .../regress/games.l9/billy.l9/st.l9/acode.acd | Bin 0 -> 40790 bytes .../games.l9/billy.l9/st.l9/compile.bat | 27 + .../regress/games.l9/billy.l9/st.l9/exit.txt | 583 +++ .../games.l9/billy.l9/st.l9/gamedata.dat | Bin 0 -> 19681 bytes .../games.l9/billy.l9/st.l9/mconst.txt | 10 + .../games.l9/billy.l9/st.l9/message.txt | 1200 +++++ .../games.l9/billy.l9/st.l9/ref/acode.acd | Bin 0 -> 40790 bytes .../games.l9/billy.l9/st.l9/ref/gamedata.dat | Bin 0 -> 19681 bytes .../games.l9/billy.l9/st.l9/ref/message.txt | 1200 +++++ .../games.l9/billy.l9/st.l9/ref/squash.dat | Bin 0 -> 14592 bytes .../games.l9/billy.l9/st.l9/squash.dat | Bin 0 -> 14592 bytes .../regress/games.l9/billy.l9/st.l9/table.dat | Bin 0 -> 4868 bytes .../regress/games.l9/billy.l9/st.l9/table.txt | 2150 ++++++++ l9dev/regress/games.l9/billy.l9/standard.txt | 403 ++ l9dev/regress/games.l9/billy.l9/status.dat | Bin 0 -> 2560 bytes l9dev/regress/games.l9/billy.l9/stconst.txt | 10 + l9dev/regress/games.l9/billy.l9/strategy.txt | 1760 +++++++ l9dev/regress/games.l9/billy.l9/table.bin | Bin 0 -> 4836 bytes l9dev/regress/games.l9/billy.l9/table.dat | Bin 0 -> 4868 bytes l9dev/regress/games.l9/billy.l9/table.txt | 2150 ++++++++ l9dev/regress/games.l9/billy.l9/vector.txt | 86 + l9dev/regress/games.l9/billy.l9/vectors.txt | 274 + l9dev/regress/games.l9/billy.l9/walkabou.txt | 1419 +++++ l9dev/regress/games.l9/billy.l9/western.fnt | Bin 0 -> 1579 bytes l9dev/regress/games.l9/colossal.l9/acode.acd | Bin 0 -> 8432 bytes l9dev/regress/games.l9/colossal.l9/aconst.txt | 38 + l9dev/regress/games.l9/colossal.l9/acore.txt | 408 ++ l9dev/regress/games.l9/colossal.l9/aparse.txt | 1476 ++++++ .../regress/games.l9/colossal.l9/apconst.txt | 168 + .../regress/games.l9/colossal.l9/aspecial.txt | 1957 +++++++ l9dev/regress/games.l9/colossal.l9/book.txt | 242 + l9dev/regress/games.l9/colossal.l9/chain.txt | 159 + .../regress/games.l9/colossal.l9/compile.bat | 10 + l9dev/regress/games.l9/colossal.l9/exit.txt | 670 +++ .../regress/games.l9/colossal.l9/license.txt | 2 + l9dev/regress/games.l9/colossal.l9/oops.txt | 216 + .../games.l9/colossal.l9/ref/table.dat | Bin 0 -> 133 bytes .../games.l9/colossal.l9/st.l9/gamedata.dat | Bin 0 -> 30453 bytes .../colossal.l9/st.l9/ref/gamedata.dat | Bin 0 -> 30453 bytes .../games.l9/colossal.l9/st.l9/ref/squash.dat | Bin 0 -> 22272 bytes .../games.l9/colossal.l9/st.l9/squash.dat | Bin 0 -> 22272 bytes l9dev/regress/games.l9/colossal.l9/table.dat | Bin 0 -> 133 bytes l9dev/regress/games.l9/colossal.l9/table.txt | 88 + l9dev/regress/games.l9/eden.l9/acode.acd | Bin 0 -> 10108 bytes l9dev/regress/games.l9/eden.l9/aconst.txt | 48 + l9dev/regress/games.l9/eden.l9/acore.txt | 407 ++ l9dev/regress/games.l9/eden.l9/aparse.txt | 1676 ++++++ l9dev/regress/games.l9/eden.l9/apconst.txt | 185 + l9dev/regress/games.l9/eden.l9/aspecial.txt | 2810 ++++++++++ l9dev/regress/games.l9/eden.l9/book.txt | 258 + l9dev/regress/games.l9/eden.l9/chain.txt | 163 + l9dev/regress/games.l9/eden.l9/compile.bat | 9 + l9dev/regress/games.l9/eden.l9/exit.txt | 750 +++ l9dev/regress/games.l9/eden.l9/license.txt | 2 + l9dev/regress/games.l9/eden.l9/oops.txt | 209 + l9dev/regress/games.l9/eden.l9/ref/table.dat | Bin 0 -> 245 bytes .../games.l9/eden.l9/st.l9/gamedata.dat | Bin 0 -> 32026 bytes .../games.l9/eden.l9/st.l9/ref/gamedata.dat | Bin 0 -> 32026 bytes .../games.l9/eden.l9/st.l9/ref/squash.dat | Bin 0 -> 21760 bytes .../regress/games.l9/eden.l9/st.l9/squash.dat | Bin 0 -> 21760 bytes l9dev/regress/games.l9/eden.l9/table.dat | Bin 0 -> 245 bytes l9dev/regress/games.l9/eden.l9/table.txt | 219 + .../games.l9/ghost.l9/part1.l9/acode.acd | Bin 0 -> 14616 bytes .../games.l9/ghost.l9/part1.l9/aconst.txt | 488 ++ .../games.l9/ghost.l9/part1.l9/acore.txt | 1572 ++++++ .../games.l9/ghost.l9/part1.l9/aparse.txt | 1615 ++++++ .../games.l9/ghost.l9/part1.l9/aspecial.txt | 1625 ++++++ .../games.l9/ghost.l9/part1.l9/averb.txt | 2322 +++++++++ .../games.l9/ghost.l9/part1.l9/book.txt | 235 + .../games.l9/ghost.l9/part1.l9/chain.txt | 333 ++ .../games.l9/ghost.l9/part1.l9/compile.bat | 15 + .../games.l9/ghost.l9/part1.l9/converse.txt | 340 ++ .../games.l9/ghost.l9/part1.l9/exit.txt | 564 ++ .../games.l9/ghost.l9/part1.l9/license.txt | 2 + .../ghost.l9/part1.l9/main.l9/gamedata.dat | Bin 0 -> 48789 bytes .../ghost.l9/part1.l9/main.l9/message.txt | 2804 ++++++++++ .../part1.l9/main.l9/ref/gamedata.dat | Bin 0 -> 48789 bytes .../ghost.l9/part1.l9/main.l9/ref/squash.dat | Bin 0 -> 31232 bytes .../ghost.l9/part1.l9/main.l9/squash.dat | Bin 0 -> 31232 bytes .../games.l9/ghost.l9/part1.l9/mconst.txt | 51 + .../games.l9/ghost.l9/part1.l9/mconsta2.txt | 51 + .../games.l9/ghost.l9/part1.l9/mconstad.txt | 51 + .../games.l9/ghost.l9/part1.l9/mconstat.txt | 50 + .../games.l9/ghost.l9/part1.l9/mconstbd.txt | 51 + .../games.l9/ghost.l9/part1.l9/mconstcd.txt | 50 + .../games.l9/ghost.l9/part1.l9/mconstct.txt | 51 + .../games.l9/ghost.l9/part1.l9/mconstgd.txt | 51 + .../games.l9/ghost.l9/part1.l9/mconstmd.txt | 51 + .../games.l9/ghost.l9/part1.l9/mconstmt.txt | 52 + .../games.l9/ghost.l9/part1.l9/mconsts1.txt | 50 + .../games.l9/ghost.l9/part1.l9/mconstsd.txt | 51 + .../games.l9/ghost.l9/part1.l9/mconstst.txt | 51 + .../games.l9/ghost.l9/part1.l9/mconstxd.txt | 50 + .../games.l9/ghost.l9/part1.l9/mconstxt.txt | 51 + .../games.l9/ghost.l9/part1.l9/npc.txt | 2323 +++++++++ .../games.l9/ghost.l9/part1.l9/oops.txt | 168 + .../games.l9/ghost.l9/part1.l9/pconst.txt | 15 + .../games.l9/ghost.l9/part1.l9/ref/table.dat | Bin 0 -> 2654 bytes .../games.l9/ghost.l9/part1.l9/sconst.txt | 327 ++ .../games.l9/ghost.l9/part1.l9/score.txt | 91 + .../games.l9/ghost.l9/part1.l9/table.dat | Bin 0 -> 2654 bytes .../games.l9/ghost.l9/part1.l9/table.txt | 1554 ++++++ .../games.l9/ghost.l9/part2.l9/acode.acd | Bin 0 -> 14993 bytes .../games.l9/ghost.l9/part2.l9/aconst.txt | 490 ++ .../games.l9/ghost.l9/part2.l9/acore.txt | 1562 ++++++ .../games.l9/ghost.l9/part2.l9/aparse.txt | 1555 ++++++ .../games.l9/ghost.l9/part2.l9/aspecial.txt | 1676 ++++++ .../games.l9/ghost.l9/part2.l9/averb.txt | 2185 ++++++++ .../games.l9/ghost.l9/part2.l9/compile.bat | 15 + .../games.l9/ghost.l9/part2.l9/converse.txt | 341 ++ .../games.l9/ghost.l9/part2.l9/exit.txt | 576 +++ .../games.l9/ghost.l9/part2.l9/license.txt | 2 + .../ghost.l9/part2.l9/main.l9/gamedata.dat | Bin 0 -> 39350 bytes .../ghost.l9/part2.l9/main.l9/message.txt | 2254 ++++++++ .../part2.l9/main.l9/ref/gamedata.dat | Bin 0 -> 39350 bytes .../ghost.l9/part2.l9/main.l9/ref/squash.dat | Bin 0 -> 23040 bytes .../ghost.l9/part2.l9/main.l9/squash.dat | Bin 0 -> 23040 bytes .../games.l9/ghost.l9/part2.l9/npc.txt | 2283 +++++++++ .../games.l9/ghost.l9/part2.l9/pconst.txt | 15 + .../games.l9/ghost.l9/part2.l9/ref/table.dat | Bin 0 -> 980 bytes .../games.l9/ghost.l9/part2.l9/sconst.txt | 293 ++ .../games.l9/ghost.l9/part2.l9/score.txt | 145 + .../games.l9/ghost.l9/part2.l9/table.dat | Bin 0 -> 980 bytes .../games.l9/ghost.l9/part2.l9/table.txt | 779 +++ .../games.l9/ghost.l9/part3.l9/acode.acd | Bin 0 -> 15858 bytes .../games.l9/ghost.l9/part3.l9/aconst.txt | 489 ++ .../games.l9/ghost.l9/part3.l9/acore.txt | 1634 ++++++ .../games.l9/ghost.l9/part3.l9/aparse.txt | 1577 ++++++ .../games.l9/ghost.l9/part3.l9/aspecial.txt | 2320 +++++++++ .../games.l9/ghost.l9/part3.l9/averb.txt | 1771 +++++++ .../games.l9/ghost.l9/part3.l9/compile.bat | 15 + .../games.l9/ghost.l9/part3.l9/converse.txt | 328 ++ .../games.l9/ghost.l9/part3.l9/exit.txt | 588 +++ .../games.l9/ghost.l9/part3.l9/license.txt | 2 + .../ghost.l9/part3.l9/main.l9/gamedata.dat | Bin 0 -> 48311 bytes .../ghost.l9/part3.l9/main.l9/message.txt | 2763 ++++++++++ .../part3.l9/main.l9/ref/gamedata.dat | Bin 0 -> 48311 bytes .../ghost.l9/part3.l9/main.l9/ref/squash.dat | Bin 0 -> 29952 bytes .../ghost.l9/part3.l9/main.l9/squash.dat | Bin 0 -> 29952 bytes .../games.l9/ghost.l9/part3.l9/npc.txt | 2260 ++++++++ .../games.l9/ghost.l9/part3.l9/pconst.txt | 15 + .../games.l9/ghost.l9/part3.l9/ref/table.dat | Bin 0 -> 2070 bytes .../games.l9/ghost.l9/part3.l9/sconst.txt | 294 ++ .../games.l9/ghost.l9/part3.l9/score.txt | 88 + .../games.l9/ghost.l9/part3.l9/table.dat | Bin 0 -> 2070 bytes .../games.l9/ghost.l9/part3.l9/table.txt | 1523 ++++++ l9dev/regress/games.l9/grange.l9/aaconst.txt | 406 ++ l9dev/regress/games.l9/grange.l9/aacore.txt | 4560 +++++++++++++++++ l9dev/regress/games.l9/grange.l9/aahead.txt | 184 + l9dev/regress/games.l9/grange.l9/aalogic.txt | 806 +++ l9dev/regress/games.l9/grange.l9/aanpc.txt | 1316 +++++ l9dev/regress/games.l9/grange.l9/aaprint.txt | 535 ++ l9dev/regress/games.l9/grange.l9/aaspec.txt | 17 + l9dev/regress/games.l9/grange.l9/aastand.txt | 409 ++ l9dev/regress/games.l9/grange.l9/aatable.txt | 2110 ++++++++ l9dev/regress/games.l9/grange.l9/aavars.txt | 180 + l9dev/regress/games.l9/grange.l9/aaverbs.txt | 677 +++ l9dev/regress/games.l9/grange.l9/aconst.txt | 552 ++ l9dev/regress/games.l9/grange.l9/amconst.txt | 8 + l9dev/regress/games.l9/grange.l9/aparse.txt | 1475 ++++++ l9dev/regress/games.l9/grange.l9/cache.txt | 159 + l9dev/regress/games.l9/grange.l9/display.txt | 1773 +++++++ l9dev/regress/games.l9/grange.l9/exit.txt | 315 ++ l9dev/regress/games.l9/grange.l9/floors.txt | 108 + l9dev/regress/games.l9/grange.l9/goal.txt | 1647 ++++++ l9dev/regress/games.l9/grange.l9/menu.txt | 2115 ++++++++ l9dev/regress/games.l9/grange.l9/newtext.txt | 116 + .../games.l9/grange.l9/pc.l9/acode.acd | Bin 0 -> 51353 bytes .../games.l9/grange.l9/pc.l9/compile.bat | 20 + .../regress/games.l9/grange.l9/pc.l9/exit.txt | 315 ++ .../games.l9/grange.l9/pc.l9/gamedata.dat | Bin 0 -> 19128 bytes .../games.l9/grange.l9/pc.l9/mconst.txt | 8 + .../games.l9/grange.l9/pc.l9/message.txt | 2270 ++++++++ .../games.l9/grange.l9/pc.l9/ref/acode.acd | Bin 0 -> 51353 bytes .../games.l9/grange.l9/pc.l9/ref/gamedata.dat | Bin 0 -> 19128 bytes .../games.l9/grange.l9/pc.l9/ref/message.txt | 2270 ++++++++ .../games.l9/grange.l9/pc.l9/ref/squash.dat | Bin 0 -> 18688 bytes .../games.l9/grange.l9/pc.l9/ref/table.dat | Bin 0 -> 332 bytes .../games.l9/grange.l9/pc.l9/squash.dat | Bin 0 -> 18688 bytes .../games.l9/grange.l9/pc.l9/table.dat | Bin 0 -> 332 bytes .../games.l9/grange.l9/pc.l9/table.txt | 234 + l9dev/regress/games.l9/grange.l9/pcconst.txt | 8 + l9dev/regress/games.l9/grange.l9/pconst.txt | 24 + l9dev/regress/games.l9/grange.l9/racetrac.txt | 4425 ++++++++++++++++ l9dev/regress/games.l9/grange.l9/sconst.txt | 213 + l9dev/regress/games.l9/grange.l9/squash.dat | Bin 0 -> 18688 bytes .../games.l9/grange.l9/st.l9/acode.acd | Bin 0 -> 53782 bytes .../games.l9/grange.l9/st.l9/compile.bat | 20 + .../regress/games.l9/grange.l9/st.l9/exit.txt | 315 ++ .../games.l9/grange.l9/st.l9/gamedata.dat | Bin 0 -> 19128 bytes .../games.l9/grange.l9/st.l9/mconst.txt | 8 + .../games.l9/grange.l9/st.l9/message.txt | 2270 ++++++++ .../games.l9/grange.l9/st.l9/ref/acode.acd | Bin 0 -> 53782 bytes .../games.l9/grange.l9/st.l9/ref/gamedata.dat | Bin 0 -> 19128 bytes .../games.l9/grange.l9/st.l9/ref/message.txt | 2270 ++++++++ .../games.l9/grange.l9/st.l9/ref/squash.dat | Bin 0 -> 18688 bytes .../games.l9/grange.l9/st.l9/ref/table.dat | Bin 0 -> 332 bytes .../games.l9/grange.l9/st.l9/squash.dat | Bin 0 -> 18688 bytes .../games.l9/grange.l9/st.l9/table.dat | Bin 0 -> 332 bytes .../games.l9/grange.l9/st.l9/table.txt | 234 + l9dev/regress/games.l9/grange.l9/stconst.txt | 8 + l9dev/regress/games.l9/grange.l9/table.dat | Bin 0 -> 332 bytes l9dev/regress/games.l9/grange.l9/table.txt | 234 + .../games.l9/ingrid.l9/ingrid1.l9/acode.acd | Bin 0 -> 14608 bytes .../games.l9/ingrid.l9/ingrid1.l9/aconst.txt | 515 ++ .../games.l9/ingrid.l9/ingrid1.l9/acore.txt | 1442 ++++++ .../games.l9/ingrid.l9/ingrid1.l9/aparse.txt | 1472 ++++++ .../ingrid.l9/ingrid1.l9/aspecial.txt | 1768 +++++++ .../games.l9/ingrid.l9/ingrid1.l9/averb.txt | 1900 +++++++ .../games.l9/ingrid.l9/ingrid1.l9/book.txt | 303 ++ .../games.l9/ingrid.l9/ingrid1.l9/chain.txt | 329 ++ .../games.l9/ingrid.l9/ingrid1.l9/compile.bat | 15 + .../ingrid.l9/ingrid1.l9/converse.txt | 330 ++ .../games.l9/ingrid.l9/ingrid1.l9/exit.txt | 620 +++ .../ingrid.l9/ingrid1.l9/main.l9/gamedata.dat | Bin 0 -> 53521 bytes .../ingrid.l9/ingrid1.l9/main.l9/message.txt | 2905 +++++++++++ .../ingrid1.l9/main.l9/ref/gamedata.dat | Bin 0 -> 53521 bytes .../ingrid1.l9/main.l9/ref/squash.dat | Bin 0 -> 35840 bytes .../ingrid.l9/ingrid1.l9/main.l9/squash.dat | Bin 0 -> 35840 bytes .../games.l9/ingrid.l9/ingrid1.l9/mconst.txt | 49 + .../ingrid.l9/ingrid1.l9/mconsta2.txt | 51 + .../ingrid.l9/ingrid1.l9/mconstad.txt | 50 + .../ingrid.l9/ingrid1.l9/mconstat.txt | 49 + .../ingrid.l9/ingrid1.l9/mconstbd.txt | 50 + .../ingrid.l9/ingrid1.l9/mconstcd.txt | 49 + .../ingrid.l9/ingrid1.l9/mconstct.txt | 50 + .../ingrid.l9/ingrid1.l9/mconstgd.txt | 50 + .../ingrid.l9/ingrid1.l9/mconstmd.txt | 50 + .../ingrid.l9/ingrid1.l9/mconstmt.txt | 51 + .../ingrid.l9/ingrid1.l9/mconsts1.txt | 49 + .../ingrid.l9/ingrid1.l9/mconstsd.txt | 50 + .../ingrid.l9/ingrid1.l9/mconstst.txt | 49 + .../ingrid.l9/ingrid1.l9/mconstxd.txt | 49 + .../ingrid.l9/ingrid1.l9/mconstxt.txt | 50 + .../games.l9/ingrid.l9/ingrid1.l9/npc.txt | 2288 +++++++++ .../games.l9/ingrid.l9/ingrid1.l9/oops.txt | 199 + .../games.l9/ingrid.l9/ingrid1.l9/pconst.txt | 18 + .../ingrid.l9/ingrid1.l9/ref/table.dat | Bin 0 -> 2668 bytes .../games.l9/ingrid.l9/ingrid1.l9/sconst.txt | 255 + .../games.l9/ingrid.l9/ingrid1.l9/score.txt | 68 + .../games.l9/ingrid.l9/ingrid1.l9/table.dat | Bin 0 -> 2668 bytes .../games.l9/ingrid.l9/ingrid1.l9/table.txt | 1315 +++++ .../games.l9/ingrid.l9/ingrid2.l9/acode.acd | Bin 0 -> 16447 bytes .../games.l9/ingrid.l9/ingrid2.l9/aconst.txt | 519 ++ .../games.l9/ingrid.l9/ingrid2.l9/acore.txt | 1504 ++++++ .../games.l9/ingrid.l9/ingrid2.l9/aparse.txt | 1540 ++++++ .../ingrid.l9/ingrid2.l9/aspecial.txt | 1953 +++++++ .../games.l9/ingrid.l9/ingrid2.l9/averb.txt | 2543 +++++++++ .../games.l9/ingrid.l9/ingrid2.l9/compile.bat | 15 + .../ingrid.l9/ingrid2.l9/converse.txt | 343 ++ .../games.l9/ingrid.l9/ingrid2.l9/exit.txt | 621 +++ .../ingrid.l9/ingrid2.l9/main.l9/gamedata.dat | Bin 0 -> 50518 bytes .../ingrid.l9/ingrid2.l9/main.l9/message.txt | 2739 ++++++++++ .../ingrid2.l9/main.l9/ref/gamedata.dat | Bin 0 -> 50518 bytes .../ingrid2.l9/main.l9/ref/squash.dat | Bin 0 -> 31488 bytes .../ingrid.l9/ingrid2.l9/main.l9/squash.dat | Bin 0 -> 31488 bytes .../games.l9/ingrid.l9/ingrid2.l9/npc.txt | 2267 ++++++++ .../games.l9/ingrid.l9/ingrid2.l9/pconst.txt | 18 + .../ingrid.l9/ingrid2.l9/ref/table.dat | Bin 0 -> 2048 bytes .../games.l9/ingrid.l9/ingrid2.l9/sconst.txt | 262 + .../games.l9/ingrid.l9/ingrid2.l9/score.txt | 84 + .../games.l9/ingrid.l9/ingrid2.l9/table.dat | Bin 0 -> 2048 bytes .../games.l9/ingrid.l9/ingrid2.l9/table.txt | 1183 +++++ .../games.l9/ingrid.l9/ingrid3.l9/acode.acd | Bin 0 -> 15285 bytes .../games.l9/ingrid.l9/ingrid3.l9/aconst.txt | 485 ++ .../games.l9/ingrid.l9/ingrid3.l9/acore.txt | 1534 ++++++ .../games.l9/ingrid.l9/ingrid3.l9/aparse.txt | 1547 ++++++ .../ingrid.l9/ingrid3.l9/aspecial.txt | 1774 +++++++ .../games.l9/ingrid.l9/ingrid3.l9/averb.txt | 2146 ++++++++ .../games.l9/ingrid.l9/ingrid3.l9/compile.bat | 15 + .../ingrid.l9/ingrid3.l9/converse.txt | 331 ++ .../games.l9/ingrid.l9/ingrid3.l9/exit.txt | 656 +++ .../ingrid.l9/ingrid3.l9/main.l9/gamedata.dat | Bin 0 -> 55114 bytes .../ingrid.l9/ingrid3.l9/main.l9/message.txt | 2878 +++++++++++ .../ingrid3.l9/main.l9/ref/gamedata.dat | Bin 0 -> 55114 bytes .../ingrid3.l9/main.l9/ref/squash.dat | Bin 0 -> 37376 bytes .../ingrid.l9/ingrid3.l9/main.l9/squash.dat | Bin 0 -> 37376 bytes .../games.l9/ingrid.l9/ingrid3.l9/npc.txt | 2298 +++++++++ .../games.l9/ingrid.l9/ingrid3.l9/pconst.txt | 18 + .../ingrid.l9/ingrid3.l9/ref/table.dat | Bin 0 -> 1878 bytes .../games.l9/ingrid.l9/ingrid3.l9/sconst.txt | 302 ++ .../games.l9/ingrid.l9/ingrid3.l9/score.txt | 98 + .../games.l9/ingrid.l9/ingrid3.l9/table.dat | Bin 0 -> 1878 bytes .../games.l9/ingrid.l9/ingrid3.l9/table.txt | 1103 ++++ l9dev/regress/games.l9/knight1.l9/acode.acd | Bin 0 -> 16364 bytes l9dev/regress/games.l9/knight1.l9/aconst.txt | 439 ++ l9dev/regress/games.l9/knight1.l9/acore.txt | 1640 ++++++ l9dev/regress/games.l9/knight1.l9/aparse.txt | 1504 ++++++ .../regress/games.l9/knight1.l9/aspecial.txt | 2728 ++++++++++ l9dev/regress/games.l9/knight1.l9/averb.txt | 2246 ++++++++ l9dev/regress/games.l9/knight1.l9/book.txt | 249 + l9dev/regress/games.l9/knight1.l9/c1.txt | 9 + l9dev/regress/games.l9/knight1.l9/compile.bat | 13 + .../regress/games.l9/knight1.l9/converse.txt | 348 ++ l9dev/regress/games.l9/knight1.l9/exit.txt | 114 + l9dev/regress/games.l9/knight1.l9/mconst.txt | 34 + .../regress/games.l9/knight1.l9/mconstad.txt | 39 + .../regress/games.l9/knight1.l9/mconstcc.txt | 33 + .../regress/games.l9/knight1.l9/mconstcd.txt | 34 + .../regress/games.l9/knight1.l9/mconstma.txt | 31 + .../regress/games.l9/knight1.l9/mconsts1.txt | 35 + .../regress/games.l9/knight1.l9/mconsts4.txt | 34 + .../regress/games.l9/knight1.l9/mconstxd.txt | 34 + l9dev/regress/games.l9/knight1.l9/npc.txt | 2054 ++++++++ l9dev/regress/games.l9/knight1.l9/oops.txt | 194 + .../regress/games.l9/knight1.l9/ref/table.dat | Bin 0 -> 1683 bytes l9dev/regress/games.l9/knight1.l9/sconst.txt | 264 + .../knight1.l9/spec48.l9/gamedata.dat | Bin 0 -> 34543 bytes .../games.l9/knight1.l9/spec48.l9/message.txt | 1861 +++++++ .../knight1.l9/spec48.l9/ref/gamedata.dat | Bin 0 -> 34543 bytes .../knight1.l9/spec48.l9/ref/squash.dat | Bin 0 -> 16640 bytes .../games.l9/knight1.l9/spec48.l9/squash.dat | Bin 0 -> 16640 bytes l9dev/regress/games.l9/knight1.l9/table.dat | Bin 0 -> 1683 bytes l9dev/regress/games.l9/knight1.l9/table.txt | 1215 +++++ l9dev/regress/games.l9/knight2.l9/acode.acd | Bin 0 -> 20366 bytes .../regress/games.l9/knight2.l9/aspecial.txt | 4283 ++++++++++++++++ l9dev/regress/games.l9/knight2.l9/averb.txt | 2666 ++++++++++ l9dev/regress/games.l9/knight2.l9/c2.txt | 9 + l9dev/regress/games.l9/knight2.l9/c2_16.txt | 9 + l9dev/regress/games.l9/knight2.l9/c2_8.txt | 9 + l9dev/regress/games.l9/knight2.l9/compile.bat | 14 + l9dev/regress/games.l9/knight2.l9/exit.txt | 173 + l9dev/regress/games.l9/knight2.l9/hpconst.txt | 6 + l9dev/regress/games.l9/knight2.l9/mpconst.txt | 6 + .../games.l9/knight2.l9/msx.l9/gamedata.dat | Bin 0 -> 44851 bytes .../games.l9/knight2.l9/msx.l9/message.txt | 2224 ++++++++ .../knight2.l9/msx.l9/ref/gamedata.dat | Bin 0 -> 44851 bytes .../games.l9/knight2.l9/msx.l9/ref/squash.dat | Bin 0 -> 22784 bytes .../games.l9/knight2.l9/msx.l9/squash.dat | Bin 0 -> 22784 bytes l9dev/regress/games.l9/knight2.l9/pconst.txt | 6 + .../regress/games.l9/knight2.l9/ref/table.dat | Bin 0 -> 1697 bytes l9dev/regress/games.l9/knight2.l9/sconst.txt | 318 ++ l9dev/regress/games.l9/knight2.l9/table.dat | Bin 0 -> 1697 bytes l9dev/regress/games.l9/knight2.l9/table.txt | 939 ++++ l9dev/regress/games.l9/knight3.l9/acode.acd | Bin 0 -> 20366 bytes .../regress/games.l9/knight3.l9/aspecial.txt | 4283 ++++++++++++++++ l9dev/regress/games.l9/knight3.l9/averb.txt | 2666 ++++++++++ l9dev/regress/games.l9/knight3.l9/c2.txt | 9 + l9dev/regress/games.l9/knight3.l9/c2_16.txt | 9 + l9dev/regress/games.l9/knight3.l9/c2_8.txt | 9 + l9dev/regress/games.l9/knight3.l9/compile.bat | 14 + l9dev/regress/games.l9/knight3.l9/exit.txt | 173 + l9dev/regress/games.l9/knight3.l9/hpconst.txt | 6 + l9dev/regress/games.l9/knight3.l9/mpconst.txt | 6 + .../games.l9/knight3.l9/msx.l9/gamedata.dat | Bin 0 -> 45569 bytes .../games.l9/knight3.l9/msx.l9/message.txt | 2209 ++++++++ .../knight3.l9/msx.l9/ref/gamedata.dat | Bin 0 -> 45569 bytes .../games.l9/knight3.l9/msx.l9/ref/squash.dat | Bin 0 -> 23552 bytes .../games.l9/knight3.l9/msx.l9/squash.dat | Bin 0 -> 23552 bytes l9dev/regress/games.l9/knight3.l9/pconst.txt | 6 + .../regress/games.l9/knight3.l9/ref/table.dat | Bin 0 -> 1697 bytes l9dev/regress/games.l9/knight3.l9/sconst.txt | 318 ++ l9dev/regress/games.l9/knight3.l9/table.dat | Bin 0 -> 1697 bytes l9dev/regress/games.l9/knight3.l9/table.txt | 939 ++++ l9dev/regress/games.l9/lancelt1.l9/acode.acd | Bin 0 -> 14163 bytes .../regress/games.l9/lancelt1.l9/aspecial.txt | 1616 ++++++ l9dev/regress/games.l9/lancelt1.l9/averb.txt | 1936 +++++++ .../regress/games.l9/lancelt1.l9/compile.bat | 15 + l9dev/regress/games.l9/lancelt1.l9/exit.txt | 469 ++ .../regress/games.l9/lancelt1.l9/license.txt | 2 + .../games.l9/lancelt1.l9/main.l9/gamedata.dat | Bin 0 -> 49358 bytes .../games.l9/lancelt1.l9/main.l9/message.txt | 2778 ++++++++++ .../lancelt1.l9/main.l9/ref/gamedata.dat | Bin 0 -> 49358 bytes .../lancelt1.l9/main.l9/ref/squash.dat | Bin 0 -> 32000 bytes .../games.l9/lancelt1.l9/main.l9/squash.dat | Bin 0 -> 32000 bytes l9dev/regress/games.l9/lancelt1.l9/mconst.txt | 35 + .../regress/games.l9/lancelt1.l9/mconsta2.txt | 34 + .../regress/games.l9/lancelt1.l9/mconstad.txt | 35 + .../regress/games.l9/lancelt1.l9/mconstat.txt | 34 + .../regress/games.l9/lancelt1.l9/mconstbd.txt | 35 + .../regress/games.l9/lancelt1.l9/mconstcd.txt | 34 + .../regress/games.l9/lancelt1.l9/mconstct.txt | 35 + .../regress/games.l9/lancelt1.l9/mconstmd.txt | 35 + .../regress/games.l9/lancelt1.l9/mconstmt.txt | 36 + .../regress/games.l9/lancelt1.l9/mconsts1.txt | 34 + .../regress/games.l9/lancelt1.l9/mconstsd.txt | 35 + .../regress/games.l9/lancelt1.l9/mconstst.txt | 34 + .../regress/games.l9/lancelt1.l9/mconstxd.txt | 34 + .../regress/games.l9/lancelt1.l9/mconstxt.txt | 35 + l9dev/regress/games.l9/lancelt1.l9/pconst.txt | 24 + .../games.l9/lancelt1.l9/ref/table.dat | Bin 0 -> 2792 bytes l9dev/regress/games.l9/lancelt1.l9/sconst.txt | 464 ++ l9dev/regress/games.l9/lancelt1.l9/table.dat | Bin 0 -> 2792 bytes l9dev/regress/games.l9/lancelt1.l9/table.txt | 1444 ++++++ l9dev/regress/games.l9/lancelt2.l9/acode.acd | Bin 0 -> 16375 bytes l9dev/regress/games.l9/lancelt2.l9/aconst.txt | 509 ++ l9dev/regress/games.l9/lancelt2.l9/acore.txt | 1723 +++++++ l9dev/regress/games.l9/lancelt2.l9/aparse.txt | 1530 ++++++ .../regress/games.l9/lancelt2.l9/aspecial.txt | 2501 +++++++++ l9dev/regress/games.l9/lancelt2.l9/averb.txt | 2212 ++++++++ l9dev/regress/games.l9/lancelt2.l9/book.txt | 253 + l9dev/regress/games.l9/lancelt2.l9/chain.txt | 340 ++ .../regress/games.l9/lancelt2.l9/compile.bat | 15 + .../regress/games.l9/lancelt2.l9/converse.txt | 333 ++ .../regress/games.l9/lancelt2.l9/license.txt | 2 + .../games.l9/lancelt2.l9/main.l9/gamedata.dat | Bin 0 -> 51542 bytes .../games.l9/lancelt2.l9/main.l9/message.txt | 3340 ++++++++++++ .../lancelt2.l9/main.l9/ref/gamedata.dat | Bin 0 -> 51542 bytes .../lancelt2.l9/main.l9/ref/squash.dat | Bin 0 -> 35328 bytes .../games.l9/lancelt2.l9/main.l9/squash.dat | Bin 0 -> 35328 bytes l9dev/regress/games.l9/lancelt2.l9/npc.txt | 2207 ++++++++ l9dev/regress/games.l9/lancelt2.l9/oops.txt | 195 + l9dev/regress/games.l9/lancelt2.l9/pconst.txt | 23 + l9dev/regress/games.l9/lancelt2.l9/score.txt | 105 + l9dev/regress/games.l9/lancelt3.l9/acode.acd | Bin 0 -> 14961 bytes l9dev/regress/games.l9/lancelt3.l9/acore.txt | 1674 ++++++ .../regress/games.l9/lancelt3.l9/aspecial.txt | 1942 +++++++ l9dev/regress/games.l9/lancelt3.l9/averb.txt | 2031 ++++++++ .../regress/games.l9/lancelt3.l9/compile.bat | 15 + l9dev/regress/games.l9/lancelt3.l9/exit.txt | 173 + .../regress/games.l9/lancelt3.l9/license.txt | 2 + .../games.l9/lancelt3.l9/main.l9/gamedata.dat | Bin 0 -> 48018 bytes .../games.l9/lancelt3.l9/main.l9/message.txt | 2985 +++++++++++ .../lancelt3.l9/main.l9/ref/gamedata.dat | Bin 0 -> 48018 bytes .../lancelt3.l9/main.l9/ref/squash.dat | Bin 0 -> 31744 bytes .../games.l9/lancelt3.l9/main.l9/squash.dat | Bin 0 -> 31744 bytes l9dev/regress/games.l9/lancelt3.l9/pconst.txt | 24 + .../games.l9/lancelt3.l9/ref/table.dat | Bin 0 -> 1406 bytes l9dev/regress/games.l9/lancelt3.l9/sconst.txt | 350 ++ l9dev/regress/games.l9/lancelt3.l9/table.dat | Bin 0 -> 1406 bytes l9dev/regress/games.l9/lancelt3.l9/table.txt | 956 ++++ l9dev/regress/games.l9/magik.l9/acode.acd | Bin 0 -> 13203 bytes l9dev/regress/games.l9/magik.l9/aconst.txt | 578 +++ l9dev/regress/games.l9/magik.l9/acore.txt | 657 +++ l9dev/regress/games.l9/magik.l9/aparse.txt | 1098 ++++ l9dev/regress/games.l9/magik.l9/aspecial.txt | 2376 +++++++++ l9dev/regress/games.l9/magik.l9/averb.txt | 2617 ++++++++++ l9dev/regress/games.l9/magik.l9/compile.bat | 11 + l9dev/regress/games.l9/magik.l9/exit.txt | 570 +++ l9dev/regress/games.l9/magik.l9/license.txt | 2 + .../games.l9/magik.l9/msx.l9/gamedata.dat | Bin 0 -> 46884 bytes .../games.l9/magik.l9/msx.l9/message.txt | 2189 ++++++++ .../games.l9/magik.l9/msx.l9/ref/gamedata.dat | Bin 0 -> 46884 bytes .../games.l9/magik.l9/msx.l9/ref/squash.dat | Bin 0 -> 32768 bytes .../games.l9/magik.l9/msx.l9/squash.dat | Bin 0 -> 32768 bytes l9dev/regress/games.l9/magik.l9/pconst.txt | 20 + l9dev/regress/games.l9/magik.l9/ref/table.dat | Bin 0 -> 465 bytes l9dev/regress/games.l9/magik.l9/table.dat | Bin 0 -> 465 bytes l9dev/regress/games.l9/red_moon.l9/acode.acd | Bin 0 -> 9155 bytes l9dev/regress/games.l9/red_moon.l9/aconst.txt | 48 + l9dev/regress/games.l9/red_moon.l9/acore.txt | 404 ++ l9dev/regress/games.l9/red_moon.l9/aparse.txt | 1467 ++++++ .../regress/games.l9/red_moon.l9/apconst.txt | 176 + .../regress/games.l9/red_moon.l9/aspecial.txt | 2614 ++++++++++ l9dev/regress/games.l9/red_moon.l9/book.txt | 235 + l9dev/regress/games.l9/red_moon.l9/chain.txt | 149 + l9dev/regress/games.l9/red_moon.l9/cheat.txt | 59 + .../regress/games.l9/red_moon.l9/compile.bat | 13 + l9dev/regress/games.l9/red_moon.l9/exit.txt | 522 ++ l9dev/regress/games.l9/red_moon.l9/hires.txt | 280 + .../regress/games.l9/red_moon.l9/license.txt | 2 + l9dev/regress/games.l9/red_moon.l9/oops.txt | 209 + l9dev/regress/games.l9/red_moon.l9/pconst.txt | 21 + .../games.l9/red_moon.l9/ref/table.dat | Bin 0 -> 305 bytes .../games.l9/red_moon.l9/st.l9/gamedata.dat | Bin 0 -> 35348 bytes .../games.l9/red_moon.l9/st.l9/message.txt | 1817 +++++++ .../red_moon.l9/st.l9/ref/gamedata.dat | Bin 0 -> 35348 bytes .../games.l9/red_moon.l9/st.l9/ref/squash.dat | Bin 0 -> 25344 bytes .../games.l9/red_moon.l9/st.l9/squash.dat | Bin 0 -> 25344 bytes l9dev/regress/games.l9/red_moon.l9/table.dat | Bin 0 -> 305 bytes l9dev/regress/games.l9/red_moon.l9/table.txt | 262 + l9dev/regress/games.l9/snowball.l9/acode.acd | Bin 0 -> 9840 bytes l9dev/regress/games.l9/snowball.l9/aconst.txt | 47 + l9dev/regress/games.l9/snowball.l9/acore.txt | 407 ++ l9dev/regress/games.l9/snowball.l9/aparse.txt | 1672 ++++++ .../regress/games.l9/snowball.l9/apconst.txt | 183 + .../regress/games.l9/snowball.l9/aspecial.txt | 2421 +++++++++ l9dev/regress/games.l9/snowball.l9/book.txt | 249 + l9dev/regress/games.l9/snowball.l9/chain.txt | 159 + .../regress/games.l9/snowball.l9/compile.bat | 9 + l9dev/regress/games.l9/snowball.l9/exit.txt | 582 +++ .../regress/games.l9/snowball.l9/license.txt | 2 + l9dev/regress/games.l9/snowball.l9/oops.txt | 210 + .../games.l9/snowball.l9/ref/table.dat | Bin 0 -> 223 bytes .../games.l9/snowball.l9/st.l9/gamedata.dat | Bin 0 -> 31538 bytes .../snowball.l9/st.l9/ref/gamedata.dat | Bin 0 -> 31538 bytes .../games.l9/snowball.l9/st.l9/ref/squash.dat | Bin 0 -> 21760 bytes .../games.l9/snowball.l9/st.l9/squash.dat | Bin 0 -> 21760 bytes l9dev/regress/games.l9/snowball.l9/table.dat | Bin 0 -> 223 bytes l9dev/regress/games.l9/snowball.l9/table.txt | 202 + l9dev/regress/games.l9/timelord.l9/acode.acd | Bin 0 -> 9494 bytes l9dev/regress/games.l9/timelord.l9/aconst.txt | 50 + .../regress/games.l9/timelord.l9/apconst.txt | 174 + .../regress/games.l9/timelord.l9/aspecial.txt | 2643 ++++++++++ .../regress/games.l9/timelord.l9/compile.bat | 14 + l9dev/regress/games.l9/timelord.l9/demo.txt | 88 + l9dev/regress/games.l9/timelord.l9/exit.txt | 612 +++ .../regress/games.l9/timelord.l9/license.txt | 2 + l9dev/regress/games.l9/timelord.l9/mconst.txt | 26 + .../regress/games.l9/timelord.l9/mconst16.txt | 32 + .../regress/games.l9/timelord.l9/mconstad.txt | 35 + .../regress/games.l9/timelord.l9/mconstcc.txt | 35 + .../regress/games.l9/timelord.l9/mconstcd.txt | 35 + .../regress/games.l9/timelord.l9/mconstma.txt | 32 + .../regress/games.l9/timelord.l9/mconstst.txt | 26 + l9dev/regress/games.l9/timelord.l9/pconst.txt | 21 + .../games.l9/timelord.l9/ref/table.dat | Bin 0 -> 381 bytes .../games.l9/timelord.l9/st.l9/gamedata.dat | Bin 0 -> 46455 bytes .../games.l9/timelord.l9/st.l9/log.bat | 63 + .../games.l9/timelord.l9/st.l9/message.txt | 2283 +++++++++ .../timelord.l9/st.l9/ref/gamedata.dat | Bin 0 -> 46455 bytes .../games.l9/timelord.l9/st.l9/ref/squash.dat | Bin 0 -> 36096 bytes .../games.l9/timelord.l9/st.l9/squash.dat | Bin 0 -> 36096 bytes l9dev/regress/games.l9/timelord.l9/table.dat | Bin 0 -> 381 bytes l9dev/regress/games.l9/timelord.l9/table.txt | 449 ++ l9dev/regress/games.l9/worm.l9/acode.acd | Bin 0 -> 11150 bytes l9dev/regress/games.l9/worm.l9/aconst.txt | 452 ++ l9dev/regress/games.l9/worm.l9/acore.txt | 372 ++ l9dev/regress/games.l9/worm.l9/aparse.txt | 817 +++ l9dev/regress/games.l9/worm.l9/aspecial.txt | 2563 +++++++++ l9dev/regress/games.l9/worm.l9/averb.txt | 1331 +++++ l9dev/regress/games.l9/worm.l9/book.txt | 253 + l9dev/regress/games.l9/worm.l9/chain.txt | 193 + l9dev/regress/games.l9/worm.l9/compile.bat | 9 + l9dev/regress/games.l9/worm.l9/exit.txt | 621 +++ l9dev/regress/games.l9/worm.l9/license.txt | 2 + l9dev/regress/games.l9/worm.l9/oops.txt | 183 + l9dev/regress/games.l9/worm.l9/ref/table.dat | Bin 0 -> 507 bytes .../games.l9/worm.l9/st.l9/gamedata.dat | Bin 0 -> 31141 bytes .../games.l9/worm.l9/st.l9/message.txt | 1428 ++++++ .../games.l9/worm.l9/st.l9/ref/gamedata.dat | Bin 0 -> 31141 bytes .../games.l9/worm.l9/st.l9/ref/squash.dat | Bin 0 -> 18944 bytes .../regress/games.l9/worm.l9/st.l9/squash.dat | Bin 0 -> 18944 bytes l9dev/regress/games.l9/worm.l9/table.dat | Bin 0 -> 507 bytes l9dev/regress/games.l9/worm.l9/table.txt | 298 ++ l9dev/squash.c | 2023 ++++++++ l9dev/squash.h | 152 + l9dev/stcode.c | 544 ++ l9dev/table.dat | Bin 0 -> 86 bytes l9dev/table.txt | 26 + l9dev/test.txt | 51 + 611 files changed, 296311 insertions(+) create mode 100644 l9dev/LICENSE create mode 100644 l9dev/License.txt create mode 100644 l9dev/Makefile create mode 100644 l9dev/README.md create mode 100644 l9dev/acode.acd create mode 100644 l9dev/code.c create mode 100644 l9dev/code.h create mode 100644 l9dev/common.h create mode 100644 l9dev/comp.c create mode 100644 l9dev/comp.h create mode 100644 l9dev/compile.bat create mode 100644 l9dev/driver.c create mode 100644 l9dev/driver.h create mode 100644 l9dev/exit.txt create mode 100644 l9dev/finish.c create mode 100644 l9dev/finish.h create mode 100755 l9dev/l9asm2bin create mode 100755 l9dev/l9bin2tos create mode 100755 l9dev/l9comp create mode 100755 l9dev/l9finish create mode 100755 l9dev/l9gamegen create mode 100755 l9dev/l9squash create mode 100755 l9dev/l9tablegen create mode 100644 l9dev/main.l9/gamedata.dat create mode 100644 l9dev/main.l9/message.txt create mode 100644 l9dev/main.l9/squash.dat create mode 100644 l9dev/pccode.c create mode 100644 l9dev/regress/compile.bat create mode 100644 l9dev/regress/compile.log create mode 100755 l9dev/regress/compileall create mode 100755 l9dev/regress/compileerrors create mode 100644 l9dev/regress/errors.log create mode 100644 l9dev/regress/errors.ref create mode 100644 l9dev/regress/errors.txt create mode 100644 l9dev/regress/games.l9/billy.l9/aaconst.txt create mode 100644 l9dev/regress/games.l9/billy.l9/aahead.txt create mode 100644 l9dev/regress/games.l9/billy.l9/aavars.txt create mode 100644 l9dev/regress/games.l9/billy.l9/amconst.txt create mode 100644 l9dev/regress/games.l9/billy.l9/arcade.txt create mode 100644 l9dev/regress/games.l9/billy.l9/box.fnt create mode 100644 l9dev/regress/games.l9/billy.l9/cache.txt create mode 100644 l9dev/regress/games.l9/billy.l9/comms.txt create mode 100644 l9dev/regress/games.l9/billy.l9/demo.txt create mode 100644 l9dev/regress/games.l9/billy.l9/display.txt create mode 100644 l9dev/regress/games.l9/billy.l9/duel.txt create mode 100644 l9dev/regress/games.l9/billy.l9/exit.txt create mode 100644 l9dev/regress/games.l9/billy.l9/fire.txt create mode 100644 l9dev/regress/games.l9/billy.l9/firstvar.txt create mode 100644 l9dev/regress/games.l9/billy.l9/floors.txt create mode 100644 l9dev/regress/games.l9/billy.l9/fontbbc.txt create mode 100644 l9dev/regress/games.l9/billy.l9/fx.txt create mode 100644 l9dev/regress/games.l9/billy.l9/goal.txt create mode 100644 l9dev/regress/games.l9/billy.l9/identiks.dat create mode 100644 l9dev/regress/games.l9/billy.l9/intro.txt create mode 100644 l9dev/regress/games.l9/billy.l9/language.txt create mode 100644 l9dev/regress/games.l9/billy.l9/manual.txt create mode 100644 l9dev/regress/games.l9/billy.l9/menu.txt create mode 100644 l9dev/regress/games.l9/billy.l9/menudata.txt create mode 100644 l9dev/regress/games.l9/billy.l9/message.txt create mode 100644 l9dev/regress/games.l9/billy.l9/movecurs.txt create mode 100644 l9dev/regress/games.l9/billy.l9/music.txt create mode 100644 l9dev/regress/games.l9/billy.l9/pc.l9/acode.acd create mode 100644 l9dev/regress/games.l9/billy.l9/pc.l9/compile.bat create mode 100644 l9dev/regress/games.l9/billy.l9/pc.l9/exit.txt create mode 100644 l9dev/regress/games.l9/billy.l9/pc.l9/gamedata.dat create mode 100644 l9dev/regress/games.l9/billy.l9/pc.l9/mconst.txt create mode 100644 l9dev/regress/games.l9/billy.l9/pc.l9/message.txt create mode 100644 l9dev/regress/games.l9/billy.l9/pc.l9/ref/acode.acd create mode 100644 l9dev/regress/games.l9/billy.l9/pc.l9/ref/gamedata.dat create mode 100644 l9dev/regress/games.l9/billy.l9/pc.l9/ref/message.txt create mode 100644 l9dev/regress/games.l9/billy.l9/pc.l9/ref/squash.dat create mode 100644 l9dev/regress/games.l9/billy.l9/pc.l9/squash.dat create mode 100644 l9dev/regress/games.l9/billy.l9/pc.l9/table.dat create mode 100644 l9dev/regress/games.l9/billy.l9/pc.l9/table.txt create mode 100644 l9dev/regress/games.l9/billy.l9/pcconst.txt create mode 100644 l9dev/regress/games.l9/billy.l9/print.txt create mode 100644 l9dev/regress/games.l9/billy.l9/readfont.txt create mode 100644 l9dev/regress/games.l9/billy.l9/s.dat create mode 100644 l9dev/regress/games.l9/billy.l9/spaniob.txt create mode 100644 l9dev/regress/games.l9/billy.l9/squash.dat create mode 100644 l9dev/regress/games.l9/billy.l9/st.l9/acode.acd create mode 100644 l9dev/regress/games.l9/billy.l9/st.l9/compile.bat create mode 100644 l9dev/regress/games.l9/billy.l9/st.l9/exit.txt create mode 100644 l9dev/regress/games.l9/billy.l9/st.l9/gamedata.dat create mode 100644 l9dev/regress/games.l9/billy.l9/st.l9/mconst.txt create mode 100644 l9dev/regress/games.l9/billy.l9/st.l9/message.txt create mode 100644 l9dev/regress/games.l9/billy.l9/st.l9/ref/acode.acd create mode 100644 l9dev/regress/games.l9/billy.l9/st.l9/ref/gamedata.dat create mode 100644 l9dev/regress/games.l9/billy.l9/st.l9/ref/message.txt create mode 100644 l9dev/regress/games.l9/billy.l9/st.l9/ref/squash.dat create mode 100644 l9dev/regress/games.l9/billy.l9/st.l9/squash.dat create mode 100644 l9dev/regress/games.l9/billy.l9/st.l9/table.dat create mode 100644 l9dev/regress/games.l9/billy.l9/st.l9/table.txt create mode 100644 l9dev/regress/games.l9/billy.l9/standard.txt create mode 100644 l9dev/regress/games.l9/billy.l9/status.dat create mode 100644 l9dev/regress/games.l9/billy.l9/stconst.txt create mode 100644 l9dev/regress/games.l9/billy.l9/strategy.txt create mode 100644 l9dev/regress/games.l9/billy.l9/table.bin create mode 100644 l9dev/regress/games.l9/billy.l9/table.dat create mode 100644 l9dev/regress/games.l9/billy.l9/table.txt create mode 100644 l9dev/regress/games.l9/billy.l9/vector.txt create mode 100644 l9dev/regress/games.l9/billy.l9/vectors.txt create mode 100644 l9dev/regress/games.l9/billy.l9/walkabou.txt create mode 100644 l9dev/regress/games.l9/billy.l9/western.fnt create mode 100644 l9dev/regress/games.l9/colossal.l9/acode.acd create mode 100644 l9dev/regress/games.l9/colossal.l9/aconst.txt create mode 100644 l9dev/regress/games.l9/colossal.l9/acore.txt create mode 100644 l9dev/regress/games.l9/colossal.l9/aparse.txt create mode 100644 l9dev/regress/games.l9/colossal.l9/apconst.txt create mode 100644 l9dev/regress/games.l9/colossal.l9/aspecial.txt create mode 100644 l9dev/regress/games.l9/colossal.l9/book.txt create mode 100644 l9dev/regress/games.l9/colossal.l9/chain.txt create mode 100644 l9dev/regress/games.l9/colossal.l9/compile.bat create mode 100644 l9dev/regress/games.l9/colossal.l9/exit.txt create mode 100644 l9dev/regress/games.l9/colossal.l9/license.txt create mode 100644 l9dev/regress/games.l9/colossal.l9/oops.txt create mode 100644 l9dev/regress/games.l9/colossal.l9/ref/table.dat create mode 100644 l9dev/regress/games.l9/colossal.l9/st.l9/gamedata.dat create mode 100644 l9dev/regress/games.l9/colossal.l9/st.l9/ref/gamedata.dat create mode 100644 l9dev/regress/games.l9/colossal.l9/st.l9/ref/squash.dat create mode 100644 l9dev/regress/games.l9/colossal.l9/st.l9/squash.dat create mode 100644 l9dev/regress/games.l9/colossal.l9/table.dat create mode 100644 l9dev/regress/games.l9/colossal.l9/table.txt create mode 100644 l9dev/regress/games.l9/eden.l9/acode.acd create mode 100644 l9dev/regress/games.l9/eden.l9/aconst.txt create mode 100644 l9dev/regress/games.l9/eden.l9/acore.txt create mode 100644 l9dev/regress/games.l9/eden.l9/aparse.txt create mode 100644 l9dev/regress/games.l9/eden.l9/apconst.txt create mode 100644 l9dev/regress/games.l9/eden.l9/aspecial.txt create mode 100644 l9dev/regress/games.l9/eden.l9/book.txt create mode 100644 l9dev/regress/games.l9/eden.l9/chain.txt create mode 100644 l9dev/regress/games.l9/eden.l9/compile.bat create mode 100644 l9dev/regress/games.l9/eden.l9/exit.txt create mode 100644 l9dev/regress/games.l9/eden.l9/license.txt create mode 100644 l9dev/regress/games.l9/eden.l9/oops.txt create mode 100644 l9dev/regress/games.l9/eden.l9/ref/table.dat create mode 100644 l9dev/regress/games.l9/eden.l9/st.l9/gamedata.dat create mode 100644 l9dev/regress/games.l9/eden.l9/st.l9/ref/gamedata.dat create mode 100644 l9dev/regress/games.l9/eden.l9/st.l9/ref/squash.dat create mode 100644 l9dev/regress/games.l9/eden.l9/st.l9/squash.dat create mode 100644 l9dev/regress/games.l9/eden.l9/table.dat create mode 100644 l9dev/regress/games.l9/eden.l9/table.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/acode.acd create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/aconst.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/acore.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/aparse.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/aspecial.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/averb.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/book.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/chain.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/compile.bat create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/converse.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/exit.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/license.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/main.l9/gamedata.dat create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/main.l9/message.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/main.l9/ref/gamedata.dat create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/main.l9/ref/squash.dat create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/main.l9/squash.dat create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/mconst.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/mconsta2.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/mconstad.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/mconstat.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/mconstbd.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/mconstcd.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/mconstct.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/mconstgd.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/mconstmd.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/mconstmt.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/mconsts1.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/mconstsd.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/mconstst.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/mconstxd.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/mconstxt.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/npc.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/oops.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/pconst.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/ref/table.dat create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/sconst.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/score.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/table.dat create mode 100644 l9dev/regress/games.l9/ghost.l9/part1.l9/table.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part2.l9/acode.acd create mode 100644 l9dev/regress/games.l9/ghost.l9/part2.l9/aconst.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part2.l9/acore.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part2.l9/aparse.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part2.l9/aspecial.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part2.l9/averb.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part2.l9/compile.bat create mode 100644 l9dev/regress/games.l9/ghost.l9/part2.l9/converse.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part2.l9/exit.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part2.l9/license.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part2.l9/main.l9/gamedata.dat create mode 100644 l9dev/regress/games.l9/ghost.l9/part2.l9/main.l9/message.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part2.l9/main.l9/ref/gamedata.dat create mode 100644 l9dev/regress/games.l9/ghost.l9/part2.l9/main.l9/ref/squash.dat create mode 100644 l9dev/regress/games.l9/ghost.l9/part2.l9/main.l9/squash.dat create mode 100644 l9dev/regress/games.l9/ghost.l9/part2.l9/npc.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part2.l9/pconst.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part2.l9/ref/table.dat create mode 100644 l9dev/regress/games.l9/ghost.l9/part2.l9/sconst.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part2.l9/score.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part2.l9/table.dat create mode 100644 l9dev/regress/games.l9/ghost.l9/part2.l9/table.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part3.l9/acode.acd create mode 100644 l9dev/regress/games.l9/ghost.l9/part3.l9/aconst.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part3.l9/acore.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part3.l9/aparse.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part3.l9/aspecial.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part3.l9/averb.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part3.l9/compile.bat create mode 100644 l9dev/regress/games.l9/ghost.l9/part3.l9/converse.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part3.l9/exit.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part3.l9/license.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part3.l9/main.l9/gamedata.dat create mode 100644 l9dev/regress/games.l9/ghost.l9/part3.l9/main.l9/message.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part3.l9/main.l9/ref/gamedata.dat create mode 100644 l9dev/regress/games.l9/ghost.l9/part3.l9/main.l9/ref/squash.dat create mode 100644 l9dev/regress/games.l9/ghost.l9/part3.l9/main.l9/squash.dat create mode 100644 l9dev/regress/games.l9/ghost.l9/part3.l9/npc.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part3.l9/pconst.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part3.l9/ref/table.dat create mode 100644 l9dev/regress/games.l9/ghost.l9/part3.l9/sconst.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part3.l9/score.txt create mode 100644 l9dev/regress/games.l9/ghost.l9/part3.l9/table.dat create mode 100644 l9dev/regress/games.l9/ghost.l9/part3.l9/table.txt create mode 100644 l9dev/regress/games.l9/grange.l9/aaconst.txt create mode 100644 l9dev/regress/games.l9/grange.l9/aacore.txt create mode 100644 l9dev/regress/games.l9/grange.l9/aahead.txt create mode 100644 l9dev/regress/games.l9/grange.l9/aalogic.txt create mode 100644 l9dev/regress/games.l9/grange.l9/aanpc.txt create mode 100644 l9dev/regress/games.l9/grange.l9/aaprint.txt create mode 100644 l9dev/regress/games.l9/grange.l9/aaspec.txt create mode 100644 l9dev/regress/games.l9/grange.l9/aastand.txt create mode 100644 l9dev/regress/games.l9/grange.l9/aatable.txt create mode 100644 l9dev/regress/games.l9/grange.l9/aavars.txt create mode 100644 l9dev/regress/games.l9/grange.l9/aaverbs.txt create mode 100644 l9dev/regress/games.l9/grange.l9/aconst.txt create mode 100644 l9dev/regress/games.l9/grange.l9/amconst.txt create mode 100644 l9dev/regress/games.l9/grange.l9/aparse.txt create mode 100644 l9dev/regress/games.l9/grange.l9/cache.txt create mode 100644 l9dev/regress/games.l9/grange.l9/display.txt create mode 100644 l9dev/regress/games.l9/grange.l9/exit.txt create mode 100644 l9dev/regress/games.l9/grange.l9/floors.txt create mode 100644 l9dev/regress/games.l9/grange.l9/goal.txt create mode 100644 l9dev/regress/games.l9/grange.l9/menu.txt create mode 100644 l9dev/regress/games.l9/grange.l9/newtext.txt create mode 100644 l9dev/regress/games.l9/grange.l9/pc.l9/acode.acd create mode 100644 l9dev/regress/games.l9/grange.l9/pc.l9/compile.bat create mode 100644 l9dev/regress/games.l9/grange.l9/pc.l9/exit.txt create mode 100644 l9dev/regress/games.l9/grange.l9/pc.l9/gamedata.dat create mode 100644 l9dev/regress/games.l9/grange.l9/pc.l9/mconst.txt create mode 100644 l9dev/regress/games.l9/grange.l9/pc.l9/message.txt create mode 100644 l9dev/regress/games.l9/grange.l9/pc.l9/ref/acode.acd create mode 100644 l9dev/regress/games.l9/grange.l9/pc.l9/ref/gamedata.dat create mode 100644 l9dev/regress/games.l9/grange.l9/pc.l9/ref/message.txt create mode 100644 l9dev/regress/games.l9/grange.l9/pc.l9/ref/squash.dat create mode 100644 l9dev/regress/games.l9/grange.l9/pc.l9/ref/table.dat create mode 100644 l9dev/regress/games.l9/grange.l9/pc.l9/squash.dat create mode 100644 l9dev/regress/games.l9/grange.l9/pc.l9/table.dat create mode 100644 l9dev/regress/games.l9/grange.l9/pc.l9/table.txt create mode 100644 l9dev/regress/games.l9/grange.l9/pcconst.txt create mode 100644 l9dev/regress/games.l9/grange.l9/pconst.txt create mode 100644 l9dev/regress/games.l9/grange.l9/racetrac.txt create mode 100644 l9dev/regress/games.l9/grange.l9/sconst.txt create mode 100644 l9dev/regress/games.l9/grange.l9/squash.dat create mode 100644 l9dev/regress/games.l9/grange.l9/st.l9/acode.acd create mode 100644 l9dev/regress/games.l9/grange.l9/st.l9/compile.bat create mode 100644 l9dev/regress/games.l9/grange.l9/st.l9/exit.txt create mode 100644 l9dev/regress/games.l9/grange.l9/st.l9/gamedata.dat create mode 100644 l9dev/regress/games.l9/grange.l9/st.l9/mconst.txt create mode 100644 l9dev/regress/games.l9/grange.l9/st.l9/message.txt create mode 100644 l9dev/regress/games.l9/grange.l9/st.l9/ref/acode.acd create mode 100644 l9dev/regress/games.l9/grange.l9/st.l9/ref/gamedata.dat create mode 100644 l9dev/regress/games.l9/grange.l9/st.l9/ref/message.txt create mode 100644 l9dev/regress/games.l9/grange.l9/st.l9/ref/squash.dat create mode 100644 l9dev/regress/games.l9/grange.l9/st.l9/ref/table.dat create mode 100644 l9dev/regress/games.l9/grange.l9/st.l9/squash.dat create mode 100644 l9dev/regress/games.l9/grange.l9/st.l9/table.dat create mode 100644 l9dev/regress/games.l9/grange.l9/st.l9/table.txt create mode 100644 l9dev/regress/games.l9/grange.l9/stconst.txt create mode 100644 l9dev/regress/games.l9/grange.l9/table.dat create mode 100644 l9dev/regress/games.l9/grange.l9/table.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/acode.acd create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/aconst.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/acore.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/aparse.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/aspecial.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/averb.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/book.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/chain.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/compile.bat create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/converse.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/exit.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/main.l9/gamedata.dat create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/main.l9/message.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/main.l9/ref/gamedata.dat create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/main.l9/ref/squash.dat create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/main.l9/squash.dat create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/mconst.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/mconsta2.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/mconstad.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/mconstat.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/mconstbd.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/mconstcd.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/mconstct.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/mconstgd.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/mconstmd.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/mconstmt.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/mconsts1.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/mconstsd.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/mconstst.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/mconstxd.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/mconstxt.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/npc.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/oops.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/pconst.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/ref/table.dat create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/sconst.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/score.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/table.dat create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid1.l9/table.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid2.l9/acode.acd create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid2.l9/aconst.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid2.l9/acore.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid2.l9/aparse.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid2.l9/aspecial.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid2.l9/averb.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid2.l9/compile.bat create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid2.l9/converse.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid2.l9/exit.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid2.l9/main.l9/gamedata.dat create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid2.l9/main.l9/message.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid2.l9/main.l9/ref/gamedata.dat create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid2.l9/main.l9/ref/squash.dat create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid2.l9/main.l9/squash.dat create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid2.l9/npc.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid2.l9/pconst.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid2.l9/ref/table.dat create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid2.l9/sconst.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid2.l9/score.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid2.l9/table.dat create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid2.l9/table.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid3.l9/acode.acd create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid3.l9/aconst.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid3.l9/acore.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid3.l9/aparse.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid3.l9/aspecial.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid3.l9/averb.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid3.l9/compile.bat create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid3.l9/converse.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid3.l9/exit.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid3.l9/main.l9/gamedata.dat create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid3.l9/main.l9/message.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid3.l9/main.l9/ref/gamedata.dat create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid3.l9/main.l9/ref/squash.dat create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid3.l9/main.l9/squash.dat create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid3.l9/npc.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid3.l9/pconst.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid3.l9/ref/table.dat create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid3.l9/sconst.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid3.l9/score.txt create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid3.l9/table.dat create mode 100644 l9dev/regress/games.l9/ingrid.l9/ingrid3.l9/table.txt create mode 100644 l9dev/regress/games.l9/knight1.l9/acode.acd create mode 100644 l9dev/regress/games.l9/knight1.l9/aconst.txt create mode 100644 l9dev/regress/games.l9/knight1.l9/acore.txt create mode 100644 l9dev/regress/games.l9/knight1.l9/aparse.txt create mode 100644 l9dev/regress/games.l9/knight1.l9/aspecial.txt create mode 100644 l9dev/regress/games.l9/knight1.l9/averb.txt create mode 100644 l9dev/regress/games.l9/knight1.l9/book.txt create mode 100644 l9dev/regress/games.l9/knight1.l9/c1.txt create mode 100644 l9dev/regress/games.l9/knight1.l9/compile.bat create mode 100644 l9dev/regress/games.l9/knight1.l9/converse.txt create mode 100644 l9dev/regress/games.l9/knight1.l9/exit.txt create mode 100644 l9dev/regress/games.l9/knight1.l9/mconst.txt create mode 100644 l9dev/regress/games.l9/knight1.l9/mconstad.txt create mode 100644 l9dev/regress/games.l9/knight1.l9/mconstcc.txt create mode 100644 l9dev/regress/games.l9/knight1.l9/mconstcd.txt create mode 100644 l9dev/regress/games.l9/knight1.l9/mconstma.txt create mode 100644 l9dev/regress/games.l9/knight1.l9/mconsts1.txt create mode 100644 l9dev/regress/games.l9/knight1.l9/mconsts4.txt create mode 100644 l9dev/regress/games.l9/knight1.l9/mconstxd.txt create mode 100644 l9dev/regress/games.l9/knight1.l9/npc.txt create mode 100644 l9dev/regress/games.l9/knight1.l9/oops.txt create mode 100644 l9dev/regress/games.l9/knight1.l9/ref/table.dat create mode 100644 l9dev/regress/games.l9/knight1.l9/sconst.txt create mode 100644 l9dev/regress/games.l9/knight1.l9/spec48.l9/gamedata.dat create mode 100644 l9dev/regress/games.l9/knight1.l9/spec48.l9/message.txt create mode 100644 l9dev/regress/games.l9/knight1.l9/spec48.l9/ref/gamedata.dat create mode 100644 l9dev/regress/games.l9/knight1.l9/spec48.l9/ref/squash.dat create mode 100644 l9dev/regress/games.l9/knight1.l9/spec48.l9/squash.dat create mode 100644 l9dev/regress/games.l9/knight1.l9/table.dat create mode 100644 l9dev/regress/games.l9/knight1.l9/table.txt create mode 100644 l9dev/regress/games.l9/knight2.l9/acode.acd create mode 100644 l9dev/regress/games.l9/knight2.l9/aspecial.txt create mode 100644 l9dev/regress/games.l9/knight2.l9/averb.txt create mode 100644 l9dev/regress/games.l9/knight2.l9/c2.txt create mode 100644 l9dev/regress/games.l9/knight2.l9/c2_16.txt create mode 100644 l9dev/regress/games.l9/knight2.l9/c2_8.txt create mode 100644 l9dev/regress/games.l9/knight2.l9/compile.bat create mode 100644 l9dev/regress/games.l9/knight2.l9/exit.txt create mode 100644 l9dev/regress/games.l9/knight2.l9/hpconst.txt create mode 100644 l9dev/regress/games.l9/knight2.l9/mpconst.txt create mode 100644 l9dev/regress/games.l9/knight2.l9/msx.l9/gamedata.dat create mode 100644 l9dev/regress/games.l9/knight2.l9/msx.l9/message.txt create mode 100644 l9dev/regress/games.l9/knight2.l9/msx.l9/ref/gamedata.dat create mode 100644 l9dev/regress/games.l9/knight2.l9/msx.l9/ref/squash.dat create mode 100644 l9dev/regress/games.l9/knight2.l9/msx.l9/squash.dat create mode 100644 l9dev/regress/games.l9/knight2.l9/pconst.txt create mode 100644 l9dev/regress/games.l9/knight2.l9/ref/table.dat create mode 100644 l9dev/regress/games.l9/knight2.l9/sconst.txt create mode 100644 l9dev/regress/games.l9/knight2.l9/table.dat create mode 100644 l9dev/regress/games.l9/knight2.l9/table.txt create mode 100644 l9dev/regress/games.l9/knight3.l9/acode.acd create mode 100644 l9dev/regress/games.l9/knight3.l9/aspecial.txt create mode 100644 l9dev/regress/games.l9/knight3.l9/averb.txt create mode 100644 l9dev/regress/games.l9/knight3.l9/c2.txt create mode 100644 l9dev/regress/games.l9/knight3.l9/c2_16.txt create mode 100644 l9dev/regress/games.l9/knight3.l9/c2_8.txt create mode 100644 l9dev/regress/games.l9/knight3.l9/compile.bat create mode 100644 l9dev/regress/games.l9/knight3.l9/exit.txt create mode 100644 l9dev/regress/games.l9/knight3.l9/hpconst.txt create mode 100644 l9dev/regress/games.l9/knight3.l9/mpconst.txt create mode 100644 l9dev/regress/games.l9/knight3.l9/msx.l9/gamedata.dat create mode 100644 l9dev/regress/games.l9/knight3.l9/msx.l9/message.txt create mode 100644 l9dev/regress/games.l9/knight3.l9/msx.l9/ref/gamedata.dat create mode 100644 l9dev/regress/games.l9/knight3.l9/msx.l9/ref/squash.dat create mode 100644 l9dev/regress/games.l9/knight3.l9/msx.l9/squash.dat create mode 100644 l9dev/regress/games.l9/knight3.l9/pconst.txt create mode 100644 l9dev/regress/games.l9/knight3.l9/ref/table.dat create mode 100644 l9dev/regress/games.l9/knight3.l9/sconst.txt create mode 100644 l9dev/regress/games.l9/knight3.l9/table.dat create mode 100644 l9dev/regress/games.l9/knight3.l9/table.txt create mode 100644 l9dev/regress/games.l9/lancelt1.l9/acode.acd create mode 100644 l9dev/regress/games.l9/lancelt1.l9/aspecial.txt create mode 100644 l9dev/regress/games.l9/lancelt1.l9/averb.txt create mode 100644 l9dev/regress/games.l9/lancelt1.l9/compile.bat create mode 100644 l9dev/regress/games.l9/lancelt1.l9/exit.txt create mode 100644 l9dev/regress/games.l9/lancelt1.l9/license.txt create mode 100644 l9dev/regress/games.l9/lancelt1.l9/main.l9/gamedata.dat create mode 100644 l9dev/regress/games.l9/lancelt1.l9/main.l9/message.txt create mode 100644 l9dev/regress/games.l9/lancelt1.l9/main.l9/ref/gamedata.dat create mode 100644 l9dev/regress/games.l9/lancelt1.l9/main.l9/ref/squash.dat create mode 100644 l9dev/regress/games.l9/lancelt1.l9/main.l9/squash.dat create mode 100644 l9dev/regress/games.l9/lancelt1.l9/mconst.txt create mode 100644 l9dev/regress/games.l9/lancelt1.l9/mconsta2.txt create mode 100644 l9dev/regress/games.l9/lancelt1.l9/mconstad.txt create mode 100644 l9dev/regress/games.l9/lancelt1.l9/mconstat.txt create mode 100644 l9dev/regress/games.l9/lancelt1.l9/mconstbd.txt create mode 100644 l9dev/regress/games.l9/lancelt1.l9/mconstcd.txt create mode 100644 l9dev/regress/games.l9/lancelt1.l9/mconstct.txt create mode 100644 l9dev/regress/games.l9/lancelt1.l9/mconstmd.txt create mode 100644 l9dev/regress/games.l9/lancelt1.l9/mconstmt.txt create mode 100644 l9dev/regress/games.l9/lancelt1.l9/mconsts1.txt create mode 100644 l9dev/regress/games.l9/lancelt1.l9/mconstsd.txt create mode 100644 l9dev/regress/games.l9/lancelt1.l9/mconstst.txt create mode 100644 l9dev/regress/games.l9/lancelt1.l9/mconstxd.txt create mode 100644 l9dev/regress/games.l9/lancelt1.l9/mconstxt.txt create mode 100644 l9dev/regress/games.l9/lancelt1.l9/pconst.txt create mode 100644 l9dev/regress/games.l9/lancelt1.l9/ref/table.dat create mode 100644 l9dev/regress/games.l9/lancelt1.l9/sconst.txt create mode 100644 l9dev/regress/games.l9/lancelt1.l9/table.dat create mode 100644 l9dev/regress/games.l9/lancelt1.l9/table.txt create mode 100644 l9dev/regress/games.l9/lancelt2.l9/acode.acd create mode 100644 l9dev/regress/games.l9/lancelt2.l9/aconst.txt create mode 100644 l9dev/regress/games.l9/lancelt2.l9/acore.txt create mode 100644 l9dev/regress/games.l9/lancelt2.l9/aparse.txt create mode 100644 l9dev/regress/games.l9/lancelt2.l9/aspecial.txt create mode 100644 l9dev/regress/games.l9/lancelt2.l9/averb.txt create mode 100644 l9dev/regress/games.l9/lancelt2.l9/book.txt create mode 100644 l9dev/regress/games.l9/lancelt2.l9/chain.txt create mode 100644 l9dev/regress/games.l9/lancelt2.l9/compile.bat create mode 100644 l9dev/regress/games.l9/lancelt2.l9/converse.txt create mode 100644 l9dev/regress/games.l9/lancelt2.l9/license.txt create mode 100644 l9dev/regress/games.l9/lancelt2.l9/main.l9/gamedata.dat create mode 100644 l9dev/regress/games.l9/lancelt2.l9/main.l9/message.txt create mode 100644 l9dev/regress/games.l9/lancelt2.l9/main.l9/ref/gamedata.dat create mode 100644 l9dev/regress/games.l9/lancelt2.l9/main.l9/ref/squash.dat create mode 100644 l9dev/regress/games.l9/lancelt2.l9/main.l9/squash.dat create mode 100644 l9dev/regress/games.l9/lancelt2.l9/npc.txt create mode 100644 l9dev/regress/games.l9/lancelt2.l9/oops.txt create mode 100644 l9dev/regress/games.l9/lancelt2.l9/pconst.txt create mode 100644 l9dev/regress/games.l9/lancelt2.l9/score.txt create mode 100644 l9dev/regress/games.l9/lancelt3.l9/acode.acd create mode 100644 l9dev/regress/games.l9/lancelt3.l9/acore.txt create mode 100644 l9dev/regress/games.l9/lancelt3.l9/aspecial.txt create mode 100644 l9dev/regress/games.l9/lancelt3.l9/averb.txt create mode 100644 l9dev/regress/games.l9/lancelt3.l9/compile.bat create mode 100644 l9dev/regress/games.l9/lancelt3.l9/exit.txt create mode 100644 l9dev/regress/games.l9/lancelt3.l9/license.txt create mode 100644 l9dev/regress/games.l9/lancelt3.l9/main.l9/gamedata.dat create mode 100644 l9dev/regress/games.l9/lancelt3.l9/main.l9/message.txt create mode 100644 l9dev/regress/games.l9/lancelt3.l9/main.l9/ref/gamedata.dat create mode 100644 l9dev/regress/games.l9/lancelt3.l9/main.l9/ref/squash.dat create mode 100644 l9dev/regress/games.l9/lancelt3.l9/main.l9/squash.dat create mode 100644 l9dev/regress/games.l9/lancelt3.l9/pconst.txt create mode 100644 l9dev/regress/games.l9/lancelt3.l9/ref/table.dat create mode 100644 l9dev/regress/games.l9/lancelt3.l9/sconst.txt create mode 100644 l9dev/regress/games.l9/lancelt3.l9/table.dat create mode 100644 l9dev/regress/games.l9/lancelt3.l9/table.txt create mode 100644 l9dev/regress/games.l9/magik.l9/acode.acd create mode 100644 l9dev/regress/games.l9/magik.l9/aconst.txt create mode 100644 l9dev/regress/games.l9/magik.l9/acore.txt create mode 100644 l9dev/regress/games.l9/magik.l9/aparse.txt create mode 100644 l9dev/regress/games.l9/magik.l9/aspecial.txt create mode 100644 l9dev/regress/games.l9/magik.l9/averb.txt create mode 100644 l9dev/regress/games.l9/magik.l9/compile.bat create mode 100644 l9dev/regress/games.l9/magik.l9/exit.txt create mode 100644 l9dev/regress/games.l9/magik.l9/license.txt create mode 100644 l9dev/regress/games.l9/magik.l9/msx.l9/gamedata.dat create mode 100644 l9dev/regress/games.l9/magik.l9/msx.l9/message.txt create mode 100644 l9dev/regress/games.l9/magik.l9/msx.l9/ref/gamedata.dat create mode 100644 l9dev/regress/games.l9/magik.l9/msx.l9/ref/squash.dat create mode 100644 l9dev/regress/games.l9/magik.l9/msx.l9/squash.dat create mode 100644 l9dev/regress/games.l9/magik.l9/pconst.txt create mode 100644 l9dev/regress/games.l9/magik.l9/ref/table.dat create mode 100644 l9dev/regress/games.l9/magik.l9/table.dat create mode 100644 l9dev/regress/games.l9/red_moon.l9/acode.acd create mode 100644 l9dev/regress/games.l9/red_moon.l9/aconst.txt create mode 100644 l9dev/regress/games.l9/red_moon.l9/acore.txt create mode 100644 l9dev/regress/games.l9/red_moon.l9/aparse.txt create mode 100644 l9dev/regress/games.l9/red_moon.l9/apconst.txt create mode 100644 l9dev/regress/games.l9/red_moon.l9/aspecial.txt create mode 100644 l9dev/regress/games.l9/red_moon.l9/book.txt create mode 100644 l9dev/regress/games.l9/red_moon.l9/chain.txt create mode 100644 l9dev/regress/games.l9/red_moon.l9/cheat.txt create mode 100644 l9dev/regress/games.l9/red_moon.l9/compile.bat create mode 100644 l9dev/regress/games.l9/red_moon.l9/exit.txt create mode 100644 l9dev/regress/games.l9/red_moon.l9/hires.txt create mode 100644 l9dev/regress/games.l9/red_moon.l9/license.txt create mode 100644 l9dev/regress/games.l9/red_moon.l9/oops.txt create mode 100644 l9dev/regress/games.l9/red_moon.l9/pconst.txt create mode 100644 l9dev/regress/games.l9/red_moon.l9/ref/table.dat create mode 100644 l9dev/regress/games.l9/red_moon.l9/st.l9/gamedata.dat create mode 100644 l9dev/regress/games.l9/red_moon.l9/st.l9/message.txt create mode 100644 l9dev/regress/games.l9/red_moon.l9/st.l9/ref/gamedata.dat create mode 100644 l9dev/regress/games.l9/red_moon.l9/st.l9/ref/squash.dat create mode 100644 l9dev/regress/games.l9/red_moon.l9/st.l9/squash.dat create mode 100644 l9dev/regress/games.l9/red_moon.l9/table.dat create mode 100644 l9dev/regress/games.l9/red_moon.l9/table.txt create mode 100644 l9dev/regress/games.l9/snowball.l9/acode.acd create mode 100644 l9dev/regress/games.l9/snowball.l9/aconst.txt create mode 100644 l9dev/regress/games.l9/snowball.l9/acore.txt create mode 100644 l9dev/regress/games.l9/snowball.l9/aparse.txt create mode 100644 l9dev/regress/games.l9/snowball.l9/apconst.txt create mode 100644 l9dev/regress/games.l9/snowball.l9/aspecial.txt create mode 100644 l9dev/regress/games.l9/snowball.l9/book.txt create mode 100644 l9dev/regress/games.l9/snowball.l9/chain.txt create mode 100644 l9dev/regress/games.l9/snowball.l9/compile.bat create mode 100644 l9dev/regress/games.l9/snowball.l9/exit.txt create mode 100644 l9dev/regress/games.l9/snowball.l9/license.txt create mode 100644 l9dev/regress/games.l9/snowball.l9/oops.txt create mode 100644 l9dev/regress/games.l9/snowball.l9/ref/table.dat create mode 100644 l9dev/regress/games.l9/snowball.l9/st.l9/gamedata.dat create mode 100644 l9dev/regress/games.l9/snowball.l9/st.l9/ref/gamedata.dat create mode 100644 l9dev/regress/games.l9/snowball.l9/st.l9/ref/squash.dat create mode 100644 l9dev/regress/games.l9/snowball.l9/st.l9/squash.dat create mode 100644 l9dev/regress/games.l9/snowball.l9/table.dat create mode 100644 l9dev/regress/games.l9/snowball.l9/table.txt create mode 100644 l9dev/regress/games.l9/timelord.l9/acode.acd create mode 100644 l9dev/regress/games.l9/timelord.l9/aconst.txt create mode 100644 l9dev/regress/games.l9/timelord.l9/apconst.txt create mode 100644 l9dev/regress/games.l9/timelord.l9/aspecial.txt create mode 100644 l9dev/regress/games.l9/timelord.l9/compile.bat create mode 100644 l9dev/regress/games.l9/timelord.l9/demo.txt create mode 100644 l9dev/regress/games.l9/timelord.l9/exit.txt create mode 100644 l9dev/regress/games.l9/timelord.l9/license.txt create mode 100644 l9dev/regress/games.l9/timelord.l9/mconst.txt create mode 100644 l9dev/regress/games.l9/timelord.l9/mconst16.txt create mode 100644 l9dev/regress/games.l9/timelord.l9/mconstad.txt create mode 100644 l9dev/regress/games.l9/timelord.l9/mconstcc.txt create mode 100644 l9dev/regress/games.l9/timelord.l9/mconstcd.txt create mode 100644 l9dev/regress/games.l9/timelord.l9/mconstma.txt create mode 100644 l9dev/regress/games.l9/timelord.l9/mconstst.txt create mode 100644 l9dev/regress/games.l9/timelord.l9/pconst.txt create mode 100644 l9dev/regress/games.l9/timelord.l9/ref/table.dat create mode 100644 l9dev/regress/games.l9/timelord.l9/st.l9/gamedata.dat create mode 100644 l9dev/regress/games.l9/timelord.l9/st.l9/log.bat create mode 100644 l9dev/regress/games.l9/timelord.l9/st.l9/message.txt create mode 100644 l9dev/regress/games.l9/timelord.l9/st.l9/ref/gamedata.dat create mode 100644 l9dev/regress/games.l9/timelord.l9/st.l9/ref/squash.dat create mode 100644 l9dev/regress/games.l9/timelord.l9/st.l9/squash.dat create mode 100644 l9dev/regress/games.l9/timelord.l9/table.dat create mode 100644 l9dev/regress/games.l9/timelord.l9/table.txt create mode 100644 l9dev/regress/games.l9/worm.l9/acode.acd create mode 100644 l9dev/regress/games.l9/worm.l9/aconst.txt create mode 100644 l9dev/regress/games.l9/worm.l9/acore.txt create mode 100644 l9dev/regress/games.l9/worm.l9/aparse.txt create mode 100644 l9dev/regress/games.l9/worm.l9/aspecial.txt create mode 100644 l9dev/regress/games.l9/worm.l9/averb.txt create mode 100644 l9dev/regress/games.l9/worm.l9/book.txt create mode 100644 l9dev/regress/games.l9/worm.l9/chain.txt create mode 100644 l9dev/regress/games.l9/worm.l9/compile.bat create mode 100644 l9dev/regress/games.l9/worm.l9/exit.txt create mode 100644 l9dev/regress/games.l9/worm.l9/license.txt create mode 100644 l9dev/regress/games.l9/worm.l9/oops.txt create mode 100644 l9dev/regress/games.l9/worm.l9/ref/table.dat create mode 100644 l9dev/regress/games.l9/worm.l9/st.l9/gamedata.dat create mode 100644 l9dev/regress/games.l9/worm.l9/st.l9/message.txt create mode 100644 l9dev/regress/games.l9/worm.l9/st.l9/ref/gamedata.dat create mode 100644 l9dev/regress/games.l9/worm.l9/st.l9/ref/squash.dat create mode 100644 l9dev/regress/games.l9/worm.l9/st.l9/squash.dat create mode 100644 l9dev/regress/games.l9/worm.l9/table.dat create mode 100644 l9dev/regress/games.l9/worm.l9/table.txt create mode 100644 l9dev/squash.c create mode 100644 l9dev/squash.h create mode 100644 l9dev/stcode.c create mode 100644 l9dev/table.dat create mode 100644 l9dev/table.txt create mode 100644 l9dev/test.txt diff --git a/l9dev/LICENSE b/l9dev/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/l9dev/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/l9dev/License.txt b/l9dev/License.txt new file mode 100644 index 0000000..f0c2c3d --- /dev/null +++ b/l9dev/License.txt @@ -0,0 +1,25 @@ +Copyright 2025 Level 9 Computing +Level 9 Computing is a partnership of Michael Austin and Peter Austin. + +This license applies to the specific implementation of the Level 9 Games, text +and code. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +This license does not apply to the game designs and any future +implementations of any of those designs, including but not limited to implementations for other media, +web, mobile app, TV, Film or Book. All rights in the game designs and such future implementations of those designs are reserved by Level 9 Computing. + + + + diff --git a/l9dev/Makefile b/l9dev/Makefile new file mode 100644 index 0000000..42e482e --- /dev/null +++ b/l9dev/Makefile @@ -0,0 +1,29 @@ +# 68000 Acode compiler, finish and squasher program (for Linux) +# common Makefile for l9comp, l9finish and l9squash +# Copyright (C) 1986-1988 Level 9 Computing + +CC=gcc +CFLAGS=-Wall + +execs = l9comp l9finish l9squash +scripts = l9gamegen l9tablegen l9asm2bin l9bin2tos + +all: $(execs) +debug: CFLAGS+=-g +debug: clean all +nodebug: clean all +clean: + rm -f $(execs) +install: $(execs) $(scripts) + cp $^ /usr/local/bin + +l9comp: CFLAGS+=-DEMBEDFINISH +l9comp: comp.c code.c stcode.c pccode.c finish.c driver.c +l9comp: comp.h code.h common.h finish.h driver.h +l9finish: finish.c driver.c +l9finish: finish.h driver.h common.h +l9squash: squash.c driver.c +l9squash: squash.h driver.h common.h + +$(execs): + $(CC) $(CFLAGS) -o $@ $(filter %.c,$^) diff --git a/l9dev/README.md b/l9dev/README.md new file mode 100644 index 0000000..1dd2490 --- /dev/null +++ b/l9dev/README.md @@ -0,0 +1,171 @@ +# l9dev +Level 9 dev tools recoded in C from Atari ST 68000 assembler + +Installation +============ +- make +- sudo make install + +Game Generation +=============== +Usage: l9gamegen [options] + +Options: +``` +--help: this usage message +--old: for strict binary compatibility with older games +--no-table: do not assemble table.txt into table.dat +--no-message: do not squash message.txt into squash.dat +--bugcomp: enable bugwards compatibility (e.g. for conditional compilation) +--oddacode: do not align acode in gamedata.dat +--i8086: generate MC code for PC +--splitdata: generate split acode and gamedata +``` + +- overall game generation script +- calls various components as described below + +Compiler +======== +Usage: l9comp [options] + +Options: +``` +--help: print this usage message +--bugcomp: enable bugwards compatibility (e.g. for conditional compilation) +--oddacode: do not align acode in gamedata.dat +--testcomp: limit sizes to test overflow errors +--i8086: generate MC code for i8086 +--splitdata: generate split acode and gamedata +``` + +Usage: l9finish [options] + +Options: +``` +--help: print this usage message +--oddacode: do not align acode in gamedata.dat +--splitdata: generate split acode and gamedata +``` + +- as before finish is the standalone finisher also incorporated in comp +- it can be used once the acode.acd is compiled to generate gamedata.dat for various platforms +- both stay close to the original with certain minor improvements and changes due to compiling on Linux +- the order of things has not been changed or split up drastically, hence the need for forward declarations in header files +- effort has been put into making error handling robust (see also regression) +- still some things will cause trouble (e.g. truncated statements, especially prs, but also game data overflow) +- as before, the compiler is driven by a menu or compile.bat file, but two cmdline options can be provided for backward compatibility +- menu option A (printer) can be used to append output to compile.log +- menu option 5 (run game) is not implemented +- all files and directories should be lower case but can have any line terminations (combinations of CR/LF) +- the finish executable can be compiled separately +- simply invoke make to compile for your Linux system (Ubuntu 24.04 executables are provided) +- some version 1.5 features have been integrated (mostly based on observed behaviour) +- this was needed to support games which split acode from gamedata (menu option B) +- this also makes it possible to compile the acode and gamedata of the unpublished last games +- Grange Murders and Billy the Kid acode and gamedata can be compiled in this way (--splitdata) +- MC is modularized so that in principle it should be possible to add another architecture + +Squasher +======== +Usage: l9squash [options] + +Options: +``` +--help: print this usage message +--oldgame: squash for old games e.g. Adrian Mole/Archers +--noisy: enable noisy messages +--debug: enable debug messages +``` + +- stays close to the original but streamlined to remove the Z80/M86k boilerplate +- again the need for forward declarations in header files +- code for driver and common declarations is shared with the compiler +- extra comments have been added to document some squasher behaviour +- all files and directories should be lower case but can have any line terminations (combinations of CR/LF) +- simply invoke make to compile for your Linux system (Ubuntu 24.04 executables are provided) + +l9tablegen +========== +Usage: l9tablegen [options] + +Options: +``` +--help: this usage message +--bin: use a binary table.bin as input iso table.txt +--old: for strict binary compatibility with older games +``` + +- generates table.dat from table.txt (or table.bin) +- older games (upto Knight Orc) need a slightly different result +- hence the --old option above +- if a binary table.bin is generated by other means, --bin can be used +- calls components below +- uses binutils-m68k-linux-gnu +- the assembler is not perfect: + - ORG directive is not supported + - case insensitive lables are not allowed + - spaces after comma's are not allowed + - the rep statement wants the repeated instructions word-aligned + - this last one only occurs once - don't use it for new work + - for all these limitations a workaround is in place + +l9asm2bin +========= +Usage: l9asm2bin [options] + +Options: +``` +--help: this usage message +``` + +- tablegen generates a table.s which can be assembled by l9asm2bin +- basically comes down to: + - m68k-linux-gnu-as -M -o .o .s + - m68k-linux-gnu-objcopy -O binary .o .bin + +l9bin2tos +========= +Usage: l9bin2tos [options] + +``` +Options: +--help: this usage message +--old: for strict binary compatibility with older games +``` + +- use the table.bin output from l9asm2bin +- generates Atari exec header and footer around the binary +- which results in .prg +- tablegen finally renames this result to table.dat + +Regression +========== +regress/compileall +- should give no reports of differences with the reference (and no git diffs) +- generates table.dat for all salvaged v3/v4 games to date (no v2 games available yet to test) +- squashes all salvaged v3/v4 games to date (no v2 games available yet to test) +- compiles all salvaged v3/v4 games to date (no v2 games available yet to test) +- have a look at the script to see which games need which compiler options +- some input files are missing: + - most of Jewels of Darkness' Dungeon Adventure and Adventure Quest (not included here) + - table.txt for The Price of Magik + - exit.txt and table.txt/dat for Lancelot part 2 (compiles without those) + - message.txt for Colossal Adventure (not needed for compilation as squash.dat is used as provided) + - message.txt for Snowball (not needed for compilation as squash.dat is used as provided) + - message.txt for Return to Eden (not needed for compilation as squash.dat is used as provided) + - Gnome Ranger is badly corrupted (not included here) +- the naming of the platform subdirs is not accurate, as some patchwork went into selecting uncorrupted files + +regress/compileerrors +- should give no report of differences with the reference (and no git diff) +- compiles a modified test.txt as errors.txt which triggers all compiler errors +- for this to succeed for all errors (e.g. including overflow errors) the --testcomp option is used +- is called from compileall + +TODO +==== +- support for pictures +- support for v2 games +- convert interpreter +- support for packaging (including loaders and interpreters for various platforms) diff --git a/l9dev/acode.acd b/l9dev/acode.acd new file mode 100644 index 0000000000000000000000000000000000000000..8a88218d2c4693d1c1a623dc06cfb4221e77a8c2 GIT binary patch literal 276 zcmXw!Jqp4=5QX3V7~>Cukj8Fnu`p!>5v(l4D@cg(2ZIr_mDqR$k6>@(1q6>^<2`I` zbS5O*e6#P(gL$5Cz9zHb!J2ew!YEzD1B0r|FX)SjP)&?_kii_f--CW8kj!(zd%;)1 z3(;($+X)oFlTQlePtef(=d^!=baQu{!0oJQw^n+j)H{0@Xs{BjDcvl+fc2I+{-)g% zfXD1j*GK8j#ygvFfn<|e> 8; +} + +uint8_t second(uint16_t val) { + if (i8086) return val >> 8; + else return val & 0xff; +} + +// +// Code generation for ALL instructions +// + +uint16_t TableNumberInReg = 0; // 1.5 optimization + +void MCPush() { + if (testcomp) { + compnotimp(); + return; + } + int var = compgetvar(); + if (!var) return; + MCPushPop(Data->Push, var); +} + +void MCPop() { + int var = compgetvar(); + if (!var) return; + MCPushPop(Data->Pop, var); +} + +void MCPushPop(uint8_t *data, int var) { + compsearch(); + + int arg1 = var * 2; + if (i8086) arg1 += PCvarsoffset; + Generate(data, arg1, 0, 0); // double var number +} + +void MCASR() { + int var = compgetvar(); + if (!var) return; + compsearch(); + + int arg1 = var * 2; + if (i8086) arg1 += PCvarsoffset; + Generate(Data->ASR, arg1, 0, 0); // double var number +} + +void MCAnd() { + MCAddSub(Data->AndVV); +} + +void MCOr() { + MCAddSub(Data->OrVV); +} + +void MCXor() { + MCAddSub(Data->XorVV); +} + +void MCData() { + char c = 0; + do { + opcodeaddress = jumpdummyopcode; + c = compsearch(); + if (c == '@') ptr++; // skip @ + if (!MCDataEntry()) return; + c = compsearch(); + ptr++; // skip over comma + } while (c == ','); + if (c == ';') compssskiptoeol(); +} + +bool MCDataEntry() { + if (!i8086) opcodeaddress = dummylongopcode; // In 1.5 + struct _symbol *sym = NULL; + int label = getlabel(&sym); + if (label < 0) return false; + if (!sym) return false; + + // try to ignore code state for data statements + if (false && sym->codestate && sym->codestate != CodeState) { + WrongCodeState(); + return false; + } + + // label is value of label relative to start of acode + code(first(label)); + code(second(label)); + + return true; +} + +void MCToAcode() { + // generate code to switch execution from machine code to ACODE + int var1 = 0; + int var2 = 0; + + // arg1 is acode pointer relative to start of acode + // allow for code generated: i.e. add 12 bytes for ST + // or add 9 bytes for PC + var1 = compacodeptr - startacode + (i8086 ? 9 : 12); + + // and second argument gives offset of the first + // byte of acode - i.e. the initial jump + // arg2 is offset of start of acode from current. + // subtract 2 to allow for it being relative to offset word + // not used for PC + var2 = i8086 ? 0 : (startacode - compacodeptr - 2); + + // to the start of the first acode instruction to be executed + Generate(Data->ToAcode, var1, var2, 0); +} + +void MCReturn() { + Generate(Data->Return, 0, 0, 0); +} + +void MCLetVC(int var, int con) { + int arg1 = var * 2; + if (i8086) arg1 += PCvarsoffset; + Generate(Data->LetVC, arg1, con, 0); // double var number +} + +void MCLetVV(int var1, int var2) { + int arg1 = var1 * 2; + int arg2 = var2 * 2; + if (i8086) arg1 += PCvarsoffset; + if (i8086) arg2 += PCvarsoffset; + Generate(Data->LetVV, arg1, arg2, 0); // double var numbers +} + +void MCAdd() { + MCAddSub(Data->AddVV); +} + +void MCSub() { + MCAddSub(Data->SubVV); +} + +void MCAddSub(uint8_t *data) { + // first var - operand + int var1 = compgetvar(); + if (!var1) return; + if (compsearch() != ',') { + commaexpected(); + return; + } + ptr++; // skip over comma + // second var - result of add + int var2 = compgetvar(); + if (!var2) return; + + int arg1 = var1 * 2; + int arg2 = var2 * 2; + if (i8086) arg1 += PCvarsoffset; + if (i8086) arg2 += PCvarsoffset; + Generate(data, arg1, arg2, 0); // double var numbers +} + +void MCAttVar(int table, int index) { + if (compsearch() != ')') { + bracketsexpected(); + return; + } + ptr++; // skip bracket + + if (compsearch() != '=') { + equalsexpected(); + return; + } + ptr++; // skip equals + + // and finally the var not inside the brackets + int var = compgetvar(); + if (!var) return; + + // quadruple table number to give ptr table offset + // double var numbers to give vartble offsets + int arg1 = table * 4; + int arg2 = index * 2; + int arg3 = var * 2; + if (i8086) arg1 += PCListVector; + if (i8086) arg2 += PCvarsoffset; + if (i8086) arg3 += PCvarsoffset; + TableGenerate(Data->AttVV, Data->AttVV16, arg1, arg2, arg3); +} + +void MCAttConst(int table, int index) { + if (compsearch() != ')') { + bracketsexpected(); + return; + } + ptr++; // skip bracket + + if (compsearch() != '=') { + equalsexpected(); + return; + } + ptr++; // skip equals + + // and finally the var not inside the brackets + int var = compgetvar(); + if (!var) return; + + // index - constant - no change + // double var to give vartbl offset + // quadruple table number to give ptr table offset + int arg1 = table * 4; + int arg2 = index; + int arg3 = var * 2; + if (i8086) arg1 += PCListVector; + if (i8086) arg3 += PCvarsoffset; + TableGenerate(Data->AttCV, Data->AttCV16, arg1, arg2, arg3); +} + +void MCAft(int var, int table) { // ttVar + // called as soon as the table reference has been parsed + int index = 0; + int arg1 = 0; + int arg2 = 0; + int arg3 = 0; + + if (compsearch() != '(') { + bracketsexpected(); + return; + } + ptr++; // skip bracket + + struct _symbol *sym3 = NULL; + bool found = findsymbol(&sym3); + if (!sym3) return; + if (found) { + int type = sym3->type & 0x7f; + sym3->type |= 0x80; + if (type == vartype) { + // a variable + index = sym3->value; // value of var + + if (compsearch() != ')') { + bracketsexpected(); + return; + } + ptr++; // skip bracket + + // now generate the code + arg1 = index * 2; // index - first arg + arg2 = table * 4; // table number - second arg + arg3 = var * 2; // var to assign to - third arg + if (i8086) arg1 += PCvarsoffset; + if (i8086) arg2 += PCListVector; + if (i8086) arg3 += PCvarsoffset; + TableGenerate(Data->AftVV, Data->AftVV16, arg1, arg2, arg3); + return; + } else if (type != constanttype) { + badindex(); + return; + } else { + // a manifest constant + index = sym3->value; // value of constant + } + } else { + // a numeric value? + index = getnumberconstant(); // will print an error message if not + if (index < 0) return; + } + + if (compsearch() != ')') { + bracketsexpected(); + return; + } + ptr++; // skip bracket + + // now generate the code + arg1 = var * 2; // double v1 + arg2 = table * 4; // quadruple table number + arg3 = index; // index + if (i8086) arg1 += PCvarsoffset; + if (i8086) arg2 += PCListVector; + TableGenerate(Data->AftVC, Data->AftVC16, arg1, arg2, arg3); +} + +void TableGenerate(uint8_t *data8, uint8_t *data16, int arg1, int arg2, int arg3) { + // avoid maintaining address register across call. + // this seems to be a way to disable the optimization + // however BTK uses list0 which still matches but + // if the register in the interpreter is actually kept zero + // then this should not be a problem as the occurrence + // is one that indeed has the table in arg1 + // also it is only in demo.txt which is not used by GM + // in this case Data->AttVV16 is used + TableNumberInReg = 0; // 1.5 optimization (partially disabled) + + // use data as generation table pointer in 8 bit table mode, + // or data16 in 16 bit mode + uint8_t *data = (SixteenFlag) ? data16 : data8; + + // table is not always linked to arg1 !? + // so this is a potential bug, but GM and BTK do not seem to need it + // to solve this issue, better name the arguments by role, e.g. + // TableGenerate(data8, data16, table, index, arg) + uint16_t table = arg1; // table is not always linked to arg1 !? + if (!i8086 && table == TableNumberInReg) { // not used for PC + // Don't load first part of table + uint8_t len = *data++; + data += 8; + len -= 4; + GenerateLen(data, len, arg1, arg2, arg3); + } else { + // Load full table but store (double of) tablenumber + TableNumberInReg = table; + Generate(data, arg1, arg2, arg3); + } +} + +void MCgoto() { + if (compsearch() != '@') + MCShortGoto(); + else { + ptr++; + MCLongGoto(); + } +} + +void MCLongGoto() { + Generate(Data->LongGoto, 0, 0, 0); + MCLongJump(); +} + +void MCShortGoto() { + if (forcedlongjumps) + MCLongGoto(); + else { + Generate(Data->ShortGoto, 0, 0, 0); + MCShortJump(); + } +} + +void MCgosub() { + // avoid maintaining address register across call. + // should be 0xffff (-1) to avoid matching list0 + // yet more cases need the reset? + // like goto, labels, etc, anything which is not atomic + TableNumberInReg = 0; // 1.5 optimization + + if (compsearch() != '@') + if (i8086) MCLongGosub(); + else MCShortGosub(); // PC does not have short gosub + else { + ptr++; + MCLongGosub(); + } +} + +void MCLongGosub() { + Generate(Data->LongGosub, 0, 0, 0); + MCLongJump(); +} + +void MCShortGosub() { + if (forcedlongjumps) + MCLongGosub(); + else { + Generate(Data->ShortGosub, 0, 0, 0); + MCShortJump(); + } +} + +void MCLongJump() { + opcodeaddress = dummylongopcode; + struct _symbol *sym = NULL; + int label = getlabel(&sym); + if (label < 0) return; + if (!sym) return; + + if (sym->codestate && sym->codestate != CodeState) { + WrongCodeState(); + return; + } + + // label is value of label relative to start of acode + // find current address relative to start + int delta = label - (compacodeptr - startacode); + // for PC: relative to instruction AFTER the current one + if (i8086) delta -= 2; // In 1.5 + if (i8086 || (delta < 32768 && delta >= -32768)) { + code(first(delta)); + code(second(delta)); + } else { + MCTooFar(); + return; + } +} + +void MCShortJump() { + if (forcedlongjumps) + MCLongJump(); + else { + opcodeaddress = dummyshortopcode; + struct _symbol *sym = NULL; + int label = getlabel(&sym); + if (label < 0) return; + if (!sym) return; + + if (sym->codestate && sym->codestate != CodeState) { + WrongCodeState(); + return; + } + + // label is value of label relative to start of acode + // find current address relative to start + // short relative is relative to start of next instruction + // how close are current and destination? + int delta = label - (compacodeptr - startacode + 1); + if (delta < 128 && delta >= -128) code(delta); + else { + reljumpoutofrange(); + return; + } + } +} + +void MCrfr(struct _symbol *sym, struct _forwardentry *entry) { + int label = compacodeptr - startacode; + char *ref = (char *)(startacode + entry->ref); + void *address = startacode + entry->opcode; + char opcode = *(char *)address; + bool longjump = false; + if (i8086) { + // for PC, DATA is relative to acode start, unlike everything else + // and counteract the correction (2) for instruction relativity + if (address == jumpdummyopcode) label += entry->ref + 2; + // is this PC specific, or can we do this in general? + if (address != dummyshortopcode) longjump = true; + } else longjump = !(opcode & relmask); + if (longjump) { // is this a long jump? + // poke back in address for a long jump + // make it relative to address of reference + int delta = label - entry->ref; + // for PC: relative to instruction AFTER the current one + if (i8086) delta -= 2; // In 1.5 + if (delta >= 32768) { + forwardoutofrange(sym, entry); // note special line number treatment + return; + } + // poke back two-byte reference + *ref++ = first(delta); // high byte + *ref = second(delta); // low byte + } else { // no! + // poke back in address for short jump + // make it relative to address of reference + // relative to start of next instruction after Bra.s + int delta = label - (entry->ref + 1); + if (delta >= 128) { // was 0x100! + forwardoutofrange(sym, entry); // note special line number treatment + return; + } + *ref = delta; // poke in single byte reference + } +} + +void MCIF() { + // handle if v = <> < > then label + opcodeaddress = compacodeptr; + int value = 0; + int arg1 = 0; + int arg2 = 0; + uint8_t **table = NULL; + + int v1 = compgetvar(); + if (!v1) return; + int op = evaloperator(); // op = operator type + if (op < 0) return; + struct _symbol *sym = NULL; + bool found = findsymbol(&sym); + if (!sym) return; + if (!found) { + // only other possibility is a number + value = getnumberconstant(); + if (value < 0) return; + arg1 = v1 * 2; + arg2 = value; + if (i8086) arg1 += PCvarsoffset; + table = MCIfVCTable; + } else { + int type = sym->type & 0x7f; + sym->type |= 0x80; // set "USED" bit + if (type == vartype) { + arg1 = v1 * 2; + arg2 = sym->value * 2; + if (i8086) arg1 += PCvarsoffset; + if (i8086) arg2 += PCvarsoffset; + table = MCIfVVTable; + } else if (type != constanttype) { + badtype(); + return; + } else { + arg1 = v1 * 2; + arg2 = sym->value; + if (i8086) arg1 += PCvarsoffset; + table = MCIfVCTable; + } + } + + // given arg1, arg2 as two args for the comparison stage, + // and table as basic IF V C/V Table + // and op as the comparator type, generate the code: + table = table + (op & 0xff); + + // skip over "THEN" if present, then evaluate jump address + compsearch(); + stringcompare("THEN"); + // stringcompare automatically skips string if matched + + // is this a short or a long jump? + char c = compsearch(); + if (c == '@') ptr++; // skip over '@' + if (c == '@' || forcedlongjumps) { + table += 4; // move to long if table section + Generate(*table, arg1, arg2, 0); + MCLongJump(); + } else { + Generate(*table, arg1, arg2, 0); + MCShortJump(); + } +} + +void MCPrint() { + NotAllowedInMC(); +} + +void MCMessage() { + // MCMessageC + NotAllowedInMC(); +} + +// void MCFunction() { +// NotAllowedInMC(); +// } + +void MCInput() { + NotAllowedInMC(); +} + +// void MCCHangeCode() { +// NotAllowedInMC(); +// } + +// void MCCall() { +// NotAllowedInMC(); +// } + +void MCExit() { + NotAllowedInMC(); +} + +void MCScreen() { + NotAllowedInMC(); +} + +void MCPicture() { + NotAllowedInMC(); +} + +void MCGetNext() { + NotAllowedInMC(); +} + +void MCPrintInput() { + NotAllowedInMC(); +} + +void MCDriverOpcode() { + NotAllowedInMC(); +} + +void MCRandom() { + NotAllowedInMC(); +} + +void MCSave() { + NotAllowedInMC(); +} + +void MCRestore() { + NotAllowedInMC(); +} + +void MCClear() { + NotAllowedInMC(); +} + +void MCStack() { + NotAllowedInMC(); +} + +// void MCPrs() { +// NotAllowedInMC(); +// } + +void MCCLS() { + NotAllowedInMC(); +} + +void MCJump() { + NotAllowedInMC(); +} + +void MCAcodePrs() { + NotAllowedInMC(); +} + +void MCBreakPt() { + Generate(Data->BreakPt, 0, 0, 0); +} + +void GenerateLen(uint8_t *data, uint8_t len, int arg1, int arg2, int arg3) { + // given data as the code data for the current instruction + // arg1 is first argument, arg2 is second argument, arg3 is third argument + + // check that code ptr is even. + if (!i8086 && (compacodeptr - startacode) & 1) { + EvenError(); // not done for PC in 1.5 + return; + } + + // 1.5 optimization where table number might be kept in register + // In that case the first part of the table is skipped + // And hence the length must be a parameter rather than *data + while (len--) { // end of code? + // fetch instruction + uint16_t ins = *data++ << 8; + ins |= *data++; + + // which argument do we want? + uint16_t val = 0; + if (ins & 0x4000) val = arg1; + else if (ins & 0x2000) val = arg2; + else if (ins & 0x1000) val = arg3; + // else don't use argument - use ins instead (i.e. low byte from table) + + // add anything to argument? + val += ins & 0xff; // low byte of ins is 8-bit offset + // use high/low byte of argument? + if (ins & 0x8000) val >>= 8; + + // write code + code(val); + } +} + +void Generate(uint8_t *data, int arg1, int arg2, int arg3) { + // 1.5 optimization where table number might be kept in a register + // This is the original call with the full table + uint8_t len = *data++; // length of this code fragment + GenerateLen(data, len, arg1, arg2, arg3); +} diff --git a/l9dev/code.h b/l9dev/code.h new file mode 100644 index 0000000..5e7d19f --- /dev/null +++ b/l9dev/code.h @@ -0,0 +1,108 @@ +// Code generation section specific to particular processors +// +// 68000 version (adapted for Linux). +// +// Copyright (C) 1988 Level 9 Computing + +#include "common.h" + +// For PC code generation (1.5 feature) +// See gamedata segment layout in pccode.c +#define PCListVector 4 +#define PCvarsoffset 144 + +// function declarations needed for forward references in code.c +void MCPushPop(uint8_t *, int); +void MCAddSub(uint8_t *); +bool MCDataEntry(); +void MCShortGoto(); +void MCLongGoto(); +void MCShortGosub(); +void MCLongGosub(); +void MCShortJump(); +void MCLongJump(); +void Generate(uint8_t *, int, int, int); +void GenerateLen(uint8_t *, uint8_t, int, int, int); +void TableGenerate(uint8_t *, uint8_t *, int, int, int); + +// defined in comp.c +extern bool testcomp; +extern bool i8086; +extern char *ptr; +extern void *compacodeptr; +extern void *startacode; +extern struct _forwardentry *startforward; +extern void *opcodeaddress; +extern void *jumpdummyopcode; +extern void *dummyshortopcode; +extern void *dummylongopcode; +extern bool forcedlongjumps; +extern bool SixteenFlag; +extern char CodeState; +extern void codew(uint16_t); +extern void code(uint8_t); +extern int compgetvar(); +extern int getlabel(struct _symbol **); +extern int evaloperator(); +extern bool findsymbol(struct _symbol **); +extern int getnumberconstant(); +extern int stringcompare(); +extern int compsearch(); +extern void compssskiptoeol(); +extern void EvenError(); +extern void commaexpected(); +extern void NotAllowedInMC(); +extern void WrongCodeState(); +extern void MCTooFar(); +extern void reljumpoutofrange(); +extern void badtype(); +extern void bracketsexpected(); +extern void badindex(); +extern void equalsexpected(); +extern void compnotimp(); +extern void forwardoutofrange(struct _symbol *, struct _forwardentry *); + +// code data table structure +struct _datatable { + uint8_t *ShortGoto; + uint8_t *LongGoto; + uint8_t *ShortGosub; + uint8_t *LongGosub; + uint8_t *Return; + uint8_t *ToAcode; + uint8_t *LetVC; + uint8_t *LetVV; + uint8_t *AddVV; + uint8_t *SubVV; + uint8_t *IfNEVCShort; + uint8_t *IfNEVCLong; + uint8_t *IfEQVCShort; + uint8_t *IfEQVCLong; + uint8_t *IfLTVCShort; + uint8_t *IfLTVCLong; + uint8_t *IfGTVCShort; + uint8_t *IfGTVCLong; + uint8_t *IfNEVVShort; + uint8_t *IfNEVVLong; + uint8_t *IfEQVVShort; + uint8_t *IfEQVVLong; + uint8_t *IfLTVVShort; + uint8_t *IfLTVVLong; + uint8_t *IfGTVVShort; + uint8_t *IfGTVVLong; + uint8_t *AttVV; + uint8_t *AttCV; + uint8_t *AftVV; + uint8_t *AftVC; + uint8_t *AttVV16; + uint8_t *AttCV16; + uint8_t *AftVV16; + uint8_t *AftVC16; + uint8_t *BreakPt; + uint8_t *Push; + uint8_t *Pop; + uint8_t *AndVV; + uint8_t *OrVV; + uint8_t *XorVV; + uint8_t *ASR; +}; diff --git a/l9dev/common.h b/l9dev/common.h new file mode 100644 index 0000000..38bd1ad --- /dev/null +++ b/l9dev/common.h @@ -0,0 +1,114 @@ +// 68000 Acode compiler, finish and squasher program (for Linux) +// common declarations needed for comp.c, finish.c and squash.c +// Copyright (C) 1986-1988 Level 9 Computing + +// finish version string +#define finish_version \ + "Acode finish 1.1 (for Linux)\n" \ + "Copyright (C) 1986-1988 Level 9 Computing\n\n" + +// all includes +#include +#include +#include +#include +#include +#include +#include +#include + +// useful characters +#define cr 13 +#define lf 10 +#define eof 26 + +// driver function codes +#define initdcode 0 +#define checksumdcode 1 +#define oswrchdcode 2 +#define osrdchdcode 3 +#define inputlinedcode 4 +#define savedcode 5 +#define loaddcode 6 +#define settextdcode 7 +#define taskinitdcode 8 +#define returntoosdcode 9 + +#define chainprogramdcode 11 +#define randomnumberdcode 12 + +#define getclockdcode 14 + +#define clgdcode 16 +#define linedcode 17 +#define filldcode 18 +#define chgcoldcode 19 +#define finishpicturedcode 20 + +#define ramsavedcode 22 +#define ramloaddcode 23 + +#define lenslokdisplaydcode 25 + +// used by both comp.c and finish.c +#define sizeofpointers 44 // overall gamedata pointers + +// used by both comp.c and code.c +#define smallmask 0x40 // if size bit (bit 6)=1, it is a 8 bit constant +#define relmask 0x20 // if relbit (bit 5)=1, it is a short jump + +// symbol table entry structure +#define symboltextlength 27 // including 0 terminator byte +struct _symbol { + char text[symboltextlength]; + char codestate; + char type; + struct _symbol *ptr; + uint16_t value; +}; +#define symbolsize sizeof(struct _symbol) +#define constanttype 1 +#define vartype 2 +#define tabletype 3 +#define labeltype 4 +#define undefinedlabeltype 5 + +// forward reference entry structure +struct _forwardentry { + // .. offset from start of table of next u/d reference to this symbol + struct _forwardentry *next; + // .. line number of reference + uint16_t linenumber; + // .. offset from start of code of the reference + uint16_t ref; + // .. offset from start of code of the opcode + uint16_t opcode; + // .. file number in which reference occured + char filenumber; + // .. CodeState + char codestate; +}; +#define forwardentrysize sizeof(struct _forwardentry) + +// definition of file control block +struct _fcb { + void *start; + void *end; + char filename[]; +}; + +// driver functions +extern bool isd0alphanumeric(char); +extern void printdecimald0(int); +extern void hexlonga0(uint32_t); +extern void driver(int, void*); +extern void openlogfile(char *); +extern void closelogfile(); +extern int OutputDevice; +extern void prs(char const *, ...); +extern char waitkey(); +extern int readdecimal(char **); +extern void hexbyted0(uint8_t); +extern void returntogem(); +extern void init1(); +extern bool init2(); diff --git a/l9dev/comp.c b/l9dev/comp.c new file mode 100644 index 0000000..f606363 --- /dev/null +++ b/l9dev/comp.c @@ -0,0 +1,2039 @@ +// 68000 Acode compiler (adapted for Linux) +// +// started 18:38 on Tuesday 29/7/86 +// last change: 2/6/88 +// +// started Linux version on Monday 8/12/25 +// first presentable version: 21/12/25 +// +// M.J.Austin. Copyright (C) 1988 Level 9 Computing +// + +#include "comp.h" + +// file control blocks +struct _fcb saveacodedriverblock = { + NULL, + NULL, + "acode.acd" +}; +//--- +struct _fcb loadcommandfile = { + NULL, + NULL, + "compile.bat" +}; +//-- +bool bugcomp = false; // if true, enable bugwards compatibility (can be set to true by providing --bugcomp) +bool oddacode = false; // if true, do not align acode (can be set to true by providing --oddacode) +bool testcomp = false; // if true, limit sizes to test overflow errors (can be set to true by providing --bugcomp) +bool i8086 = false; // if true, generate MC code for i8086 (can be set to true by providing --i8086) +bool splitdata = false; // if true, generate split acode and gamedata (can be set to true by providing --splitdata) +//--- +char batchfilebuffer[500]; +//--- +char compinstructiontable[][instructionlen] = { + "ADD", + "AND", + "ASR", // Arithmetic Shift Right (extra MC instruction introduced in 1.5) + "BREAK", + "CEND", // conditional assembly + "CIF", // conditional assembly + "CLEAR", + "CLS", + "CODE", // machine-code compilation + "DATA", + "DEBUG", + "DRIVER", + "EXIT", + "GETNEXT", + "GOSUB", + "GOTO", + "IF", + "INPUT", + "JUMP", + "MESSAGE", + "OR", + "PICTURE", + "POP", + "PRINT", + "PRINTINPUT", + "PRS", + "PUSH", + "RANDOM", + "RESTORE", + "RETURN", + "SAVE", + "SCREEN", + "STACK", + "SUB", + "XOR", + "XYZZY" // use this to trigger a compiler bug error in test mode +}; +//--- +void (*CompJumpTable[])() = { + NULL, // null entry because words numbered from 1 .. + COMPADD, + NotAllowedInAcode, // AND + NotAllowedInAcode, // ASR + COMPBREAKPT, + compcend, + compcif, + COMPCLEAR, + COMPCLS, + CompCode, + COMPDATA, + compdebuggingon, + COMPDRIVEROPCODE, + COMPEXIT, + COMPGETNEXT, + compgosub, + compgoto, + compif, + COMPINPUT, + COMPJUMP, + COMPMESSAGE, + NotAllowedInAcode, // OR + COMPPICTURE, + NotAllowedInAcode, // POP + COMPPRINT, + COMPPRINTINPUT, + COMPACODEPRS, + NotAllowedInAcode, // PUSH + COMPRANDOM, + COMPRESTORE, + COMPRETURN, + COMPSAVE, + COMPSCREEN, + COMPSTACK, + COMPSUB, + NotAllowedInAcode, // XOR + compilerbug +}; +//--- +void (*MCjumptable[])() = { // jump table for use in MC mode + NULL, // null entry because words numbered from 1 .. + MCAdd, + MCAnd, + MCASR, + MCBreakPt, + compcend, + compcif, + MCClear, + MCCLS, + CompCode, + MCData, + compdebuggingon, + MCDriverOpcode, + MCExit, + MCGetNext, + MCgosub, + MCgoto, + MCIF, + MCInput, + MCJump, + MCMessage, + MCOr, + MCPicture, + MCPop, + MCPrint, + MCPrintInput, + MCAcodePrs, + MCPush, + MCRandom, + MCRestore, + MCReturn, + MCSave, + MCScreen, + MCStack, + MCSub, + MCXor, + compilerbug +}; +//--- +// each entry is of length tsize +// with terminatori 0 included +// MUST BE ALPHABETICALLY SORTED +char controlwords[numcontrolwords][tsize] = { + "BEGIN", + "CONST", + "TABLE", + "VAR" +}; +//--- +// now some vectors to the real code (probably in driver.c).... +bool compisd0alphanumeric(char c) { return isd0alphanumeric(c); } +void compprintdecimald0(int n) { printdecimald0(n); } +void comphexlonga0(uint32_t n) { hexlonga0(n); } +void compdriver(int code, void *buffer) { driver(code, buffer); } +char compwaitkey() { return waitkey(); } +int compreaddecimal(char **s) { return readdecimal(s); } +void comphexbyted0(uint8_t n) { hexbyted0(n); } +void compreturntogem() { returntogem(); } +//--- +// workspace values +void *endcompiler = NULL; +void *opcodeaddress = NULL; +int currentvarnumber = 0; +int complinenumber = 0; +int TotalSourceLines = 0; +struct _symbol *startsymbols = NULL; // start of symbol table area +struct _symbol *endsymbols = NULL; // end of symbol table area +struct _symbol *freesymbol = NULL; // first free symbol address +void *startsource = NULL; // start of source area +void *endsource = NULL; // end of source area +int symboltablesize = 0; // size of symbol table area +void *compacodeptr = NULL; // pointer to code to be generated +void *savedacodeptr = NULL; +void *startacode = NULL; // start of acode area +void *endacode = NULL; // end of acode area +int errorstack = 0; // stack value for when errors occur +struct _forwardentry *startforward = NULL; +struct _forwardentry *freeforwardref = NULL; // pointer within forward ref table +struct _forwardentry *endforward = NULL; +int symboladdress = 0; +void *cbatchptr = 0; + +void (**CurrentJumpTable)() = NULL; // pointer to the current compiler jump table +//--- +char debugginginfoon = 0; +char compterminator = 0; +void *jumpdummyopcode = NULL; // absolute jump +void *dummyshortopcode = NULL; // must be startacode - 6 for code.c +void *dummylongopcode = NULL; // must be startacode - 5 for code.c +char forcedlongjumps = 0; // zero if off, 1 if on +char filenumber = 0; +char cexecutingcommandfile = 0; +char compilationerrors = 0; // set non-zero if any errors occur +char suppresscompilation = 0; // set to 1 for conditional assembly +bool acodeerror = false; // flag to signal acode overflow to the error subsystem +char CodeState = 0; // set to "+" to generate MC +char SixteenFlag = 0; // set to indicate 16 bit list operations +//--- +char compdriverbuffer[100]; +//--- +void compflush() { + // flush(); // is an interpreter routine, not needed for now + fflush(stdout); +} +//------------- +void clearsymbols() { + // acode area is immediately after comp + + // once-only init + endcompiler = malloc(512 * 1024); + + // acode area is first section + startacode = endcompiler + 2; // reserve space for acode length + compacodeptr = startacode; + endacode = startacode + (testcomp ? testsizeacodearea : + (splitdata ? splitsizeacodearea : sizeacodearea)); // 1.5 + + // allocate space for the dummy opcode addresses + jumpdummyopcode = endacode; + *(char *)jumpdummyopcode = 0; + dummyshortopcode = endacode + 2; + *(char *)dummyshortopcode = relmask; + dummylongopcode = endacode + 4; + *(char *)dummylongopcode = 0; + + // symbols sit between end of acode + // and source area + symboltablesize = (testcomp ? testsizesymbolarea : sizesymbolarea); + // set up pointer to start of symbol table + startsymbols = endacode + 8; // leave room for the dummies + + // and set up pointer to first free address in symbol table + // (immediately after the hash table) + freesymbol = startsymbols + hashentries; + + // clear space between startsymbols and startsymbols+symboltablesize + memset(startsymbols, 0, symboltablesize); + endsymbols = startsymbols + (testcomp ? testsymbolentries : symbolentries); + + // forward reference table is after symbol table + startforward = (struct _forwardentry *)endsymbols; + // zero offset from start of f/r table + freeforwardref = startforward; + endforward = (struct _forwardentry *)endsymbols + + (testcomp ? testforwardentries : forwardentries); + + // set up pointer at which source will be loaded + startsource = endforward; + // and some constants + currentvarnumber = 0; + + // complete.dat will eventually be formed at the end of everything + // to allow further compilation or symbol table actions after finishing + startcomplete = (char *)endforward; +} +//--- +void compsoftinit() { + // undo any potential finishing already done + *(char *)(startacode - 2) = 0; + *(char *)(startacode - 1) = 0; + savecompletedriverblock.start = NULL; + savecompletedriverblock.end = NULL; + + // start again with linenumber 1 + complinenumber = 1; +} +//--- +void compstart() { + init1(); + init2(); + clearsymbols(); + // wrapreset(); + + // set acode generation to start with + CodeState = '-'; + CurrentJumpTable = CompJumpTable; + + // with some 1.5 features hacked in + // to be able to support the AA games (GM and BTK) + compprs("\n"); + compprs("68000 Acode compiler 1.3 (for Linux)\n"); + compprs("Copyright (C) 1988 Level 9 Computing.\n"); + compprs("M.J.Austin 2/6/88\n"); + + // is there a command file in this directory on the disk? + compprs("\nLooking for compilation batch file - 'compile.bat'\n"); + loadcommandfile.start = &batchfilebuffer; // loading address + compdriver(loaddcode, &loadcommandfile); + if (*(char *)&loadcommandfile == 0) { + int r = loadcommandfile.end - (void *)batchfilebuffer; + if (r < 0) r = 0; + batchfilebuffer[r++] = cr; + batchfilebuffer[r++] = lf; + batchfilebuffer[r++] = eof; + batchfilebuffer[r++] = eof; + batchfilebuffer[r++] = 0; + cbatchptr = batchfilebuffer; + cexecutingcommandfile = 1; + } else return; // no, so get instructions from user + compprs("\nExecuting instructions in file 'compile.bat'\n"); + char c; + while ((c = *(char *)cbatchptr++) != eof) { + if (c == '1') { + if (!batchcompile()) break; + } else if (!dojumptable(c)) break; // for normal functions + } + // end of batch file, start prompting user +} + +bool batchcompile() { + // get a filename from batch file, then compile it + compsoftinit(); + compprs("Compiling file '"); + // copy file name into driverbuffer + struct _fcb *fcb = (struct _fcb *)&compdriverbuffer; + fcb->start = startsource; + char *f = fcb->filename; + char c; + while (c = *(char *)cbatchptr++, c != cr && c != lf) { + *f++ = c; + compprs("%c", c); + } + // end of filename, add 0 terminator + *f++ = 0; + compprs("'. "); + compflush(); + + compdriver(loaddcode, fcb); + if (*(char *)fcb) return false; // not found + abscompilefile(); + return true; +} + +//--- +void compmenu() { + cexecutingcommandfile = 0; + while (true) { + compprs("\n"); + compprs(" 0 .. Exit to TOS "); + compprs(" 1 .. Compile Source file\n"); + + compprs(" 2 .. Finish acode "); + compprs(" 3 .. Finish gamedata.dat\n"); + + compprs(" 4 .. Save Gamedata and acode "); + compprs(" 5 .. Run game\n"); + + compprs(" 6 .. Toggle debugging info\n"); + + compprs(" 7 .. Toggle forced long jumps "); + compprs(" 8 .. Print symbols\n"); + + compprs(" 9 .. Check for unused symbols "); + compprs(" A .. Toggle printing (to rs232) \n"); + if (splitdata) compprs(" B .. Finish gamedata without acode \n"); + compprs("\n"); + compprs("Your choice: "); + char c; + while (compdriver(osrdchdcode, &compdriverbuffer), (c = *compdriverbuffer) != lf) { + compprs("%c ", c); // echo character typed + dojumptable(c); + } + } +} +//--- +bool dojumptable(char c) { + // call compiler function by number + if (c < '0') return true; + switch (c) { + case '0': compreturntogem(); break; + case '1': return compilefile(); break; + case '2': finishacode(); break; + case '3': finishgamedatainmemory(); break; + case '4': savegamedata(); break; + case '5': rungame(); break; + case '6': toggledebugginginfo(); break; + case '7': toggleforcedlongjumps(); break; + case '8': printsymboltable(); break; + case '9': checkunusedsymbols(); break; + case 'A': ToggleRS232Printer(); break; + case 'B': if (splitdata) { finishwithoutacode(); break; } + default: return false; + } + return true; +} +//--- +void ToggleRS232Printer() { + if (OutputDevice == 2) { // currently to CON:? + SetRS232(); + } else { + OutputDevice = 2; // CON: + closelogfile(); + compprs("\nPrinting is now off. \n"); + } +} +//--- +void SetRS232() { + OutputDevice = 1; // AUX: + openlogfile("compile.log"); + compprs("\nPrinting is now on. \n"); +} +//--- +void finishgamedata(bool noacode) { + compprs("%s", finish_version); + // this program produces a complete.dat file in memory + // starting from acode.acd in memory and + // from the rest of the data on disk + finishedptr = startcomplete; + // (allows space for acode beneath gamedata.dat) + // now allow space for gamedata. Startsources is where + // the exits etc. are loaded in transiently + // in 1.5 with split data, gamedata can be big when still using combined + startsources = finishedptr + (splitdata ? splitsizegamedata : sizegamedata); + + finishedptr += sizeofpointers; + processexits(); + processtables(); + if (!splitdata) savedirectory(); // with split data no subdirs are used (1.5) + + if (!splitdata) selectdirectory(); // subdirectory for computer-specific text + processsquash(); + if (!splitdata) climb(); // and back to root for acode + + // set up ptr = start of acode + if (noacode) { // simulate zero-sized acode for split data (1.5) + ptr = finishedptr; + ptr[0] = 0; + ptr[1] = 0; + } else copyacode(); + processacodeptr(); + finishchecksum(); + + savecompletedriverblock.start = startcomplete; // start address to save + savecompletedriverblock.end = finishedptr; // end address to save +} +void finishwithoutacode() { + finishgamedata(true); // mimick observed behaviour +} +void finishgamedatainmemory() { + finishgamedata(false); +} +//--- +void copyacode() { + // work out length + int len = compacodeptr - startacode + 8; // allow plenty of space for length pointer + // make finishedptr even and zero out skip byte + if (!oddacode && (finishedptr - startcomplete) & 1) *finishedptr++ = 0; + // now copy it to current position in gamedata.dat i.e. at finishedptr + memcpy(finishedptr, startacode - 2, len); // backstep over pointer + ptr = finishedptr; // ptr = start of data in final position +} +//--- +void savegamedata() { + compprs("Saving acode.acd\n"); + saveacode(); + if (!splitdata) descend(); // with split data no subdirs are used (1.5) + compprs("Saving gamedata.dat\n"); + compdriver(savedcode, &savecompletedriverblock); + if (!splitdata) climb(); // leave us back where we started +} +//--- +void rungame() { // XXX + compprs("Running game... is not implemented...\n"); + compreturntogem(); + return; + + descend(); + // call_ebios _getrez + // addq.l 2,sp + // d0.b = 2 for hires + // cmp.b 2,d0 + int res = 0; + if (res != 2) { + // move.w 1,-(sp) // medium resolution + // move.l -1,-(sp) // retain physical base + // move.l -1,-(sp) // retain logical base + // call_ebios _setscreen + // add.l 12,sp + } + // dc.w 0xA00A // Line A function to hide mouse + // and set up palette - we want yellow text on black background + // setuppalette(); + + // lea initialstackpointer,a0 + // move.l sp,(a0) + // intinit1(); // first part of initialise + // move.l a6,-(sp) + // get end of gamedata file + // intinitloadpics(savecompletedriverblock->end); + // intstart2(); +} +//--- +void toggledebugginginfo() { + compprs("Debugging info is"); + debugginginfoon ^= 0xff; + togglereport(debugginginfoon); +} +//--- +void compdebuggingon() { +// as part of a program + debugginginfoon ^= 0xff; +} +//--- +void CompCode() { + // turn machine-code generation ON/OFF + char c = compsearch(); + if (c != '+' && c != '-') { + PlusOrMinusExpected(); + return; + } + + if (c == CodeState) { + AlreadyInState(); + return; + } + CodeState = c; + // c is new code state + if (c == '+') { + // change to MC + CurrentJumpTable = MCjumptable; + if (testcomp) { + if ((compacodeptr - startacode) & 1) + EvenError(); // for testing purposes simulate alignment error + else compskiptoeol(); + return; + } + compskiptoeol(); + code(opcchangecode); + // is current code ptr (relative to startacode) EVEN? + if (!i8086 && (compacodeptr - startacode) & 1) { + compacodeptr++; // not done for PC in 1.5 + } + } else { + // change to acode + CurrentJumpTable = CompJumpTable; + compskiptoeol(); + if (!testcomp) MCToAcode(); + } +} +//--- +void compcif() { + // start of a section of conditional assembly + struct _symbol *sym = NULL; + bool found = findsymbol(&sym); + if (!sym) return; + if (found) { + int type = sym->type & 0x7f; + sym->type |= 0x80; // set "USED" bit + if (type != constanttype) { + badtype(); + return; + } + if (suppresscompilation || !sym->value) { // always supress nested cif + // skip over conditional assembly code + suppresscompilation++; + } // non-zero, so allow it to be compiled. + } else { + // 'cif' as a variable is handled by caller + syntaxerror(); + return; + } +} +//--- +void compcend() { + // prevent it going negative + if (--suppresscompilation < 0) suppresscompilation = 0; +} +//--- +void toggleforcedlongjumps() { + compprs("Forced long jumps are"); + forcedlongjumps ^= 0xff; + togglereport(forcedlongjumps); +} +void togglereport(int t) { + if (t == 0) nowoff(); + else compprs(" now on\n"); +} +void nowoff() { + compprs(" now off\n"); +} +//--- +void finishacode() { + compprs("\nNumber of vars=%d", currentvarnumber); + compflush(); + compprs("\nNumber of source lines=%d", TotalSourceLines); + compflush(); + compprs("\n"); + + // check here for remaining forward references + int missing = 0; + struct _symbol *sym = startsymbols; + do { + if (*sym->text && (sym->type & 0x7f) == undefinedlabeltype) { + missing++; + struct _forwardentry *entry = startforward + sym->value; + do { + compilationerrors = 1; + compprs("\nMissing symbol '"); + absprintsymbol(sym); + + compprs("' which was referenced at line "); + compprintdecimald0(entry->linenumber); + compflush(); // print buffer contents + + compprs(" in file "); + compprintdecimald0(entry->filenumber); + compflush(); // print buffer contents + + entry = entry->next; + } while (entry); + } + sym++; + } while (sym < endsymbols); + compprs("\n"); + if (missing) compprs("Number of missing symbols: %d\n", missing); + + if (compilationerrors) { + compprs("Errors in compilation - code not saved\n"); + compprs("Press a key to return to gem\n"); + compwaitkey(); + compreturntogem(); + return; + } + // poke in length at start + int len = compacodeptr - startacode + 2; // give space for end pointer + *(char *)(startacode - 2) = len & 0xff; // allow space for length pointer + *(char *)(startacode - 1) = len >> 8; +} +//--- +void saveacode () { + saveacodedriverblock.start = startacode - 2; // allow space for length pointer + saveacodedriverblock.end = savedacodeptr; // end address + compdriver(savedcode, &saveacodedriverblock); +} +//--- + +bool compilefile() { + // load a file, with driver prompting for filename + compsoftinit(); // init on each and every compile + struct _fcb *fcb = (struct _fcb *)&compdriverbuffer; + fcb->start = startsource; + fcb->filename[0] = 0; // filename = null, so user must enter one + compdriver(loaddcode, fcb); + if (*(char *)fcb) return false; // not found + abscompilefile(); + return true; +} +void abscompilefile() { + char c; + filenumber++; + // ok, now compdriverbugger.start = start address + // and compdriverbugger.end = end address of file just loaded + struct _fcb *fcb = (struct _fcb *)&compdriverbuffer; + char *buf = (char *)fcb->end; + if (!buf) buf = startsource; + buf[0] = eof; // add terminators + buf[1] = eof; // (not necessarily word-aligned) + buf[2] = cr; + buf[3] = lf; + buf[4] = eof; + buf[5] = eof; + + // first find out what the terminator is + // it is assumed there will be one and only one of these per line + // other control codes are ignored completely by the compiler + ptr = startsource; + while (c = *ptr++, c != cr && c != lf); + compterminator = c; + + ptr = startsource; // remains as pointer throughout + + // now start compiling it! + displayline(); + + // start by looking for const/var definitions + c = checkforcontrolword(); + if (!c) { + syntaxerror(); + return; + } + while (true) { + switch (c) { + case 1: c = mainprogram(); break; + case 2: c = constantdefinitions(); break; + case 3: c = tabledefinitions(); break; + case 4: c = vardefinitions(); break; + case eof: endofcompfile(); return; break; + default: compilerbug(); return; + } + } +} + +//--- +void endofcompfile() { + savedacodeptr = compacodeptr; + compprs("End of source file.\n"); +} +//--- +int checkforcontrolword() { + if (compsupersearch() == eof) return eof; // skip spaces, comments etc. + return tablecompare(controlwords, numcontrolwords); +} +//--- +int constantdefinitions() { + if (debugginginfoon) { + compprs("\nStarting constant definitions segment at "); + compprintdecimald0(complinenumber); + compflush(); // print buffer contents + compprs("\n"); + } + while (true) { + char c = checkforcontrolword(); + if (c) return c; + struct _symbol *sym = addsymbol(constanttype, 0); // dummy value + // sym = address of symbol entry + if (!sym) continue; + if (*ptr++ != '=') { + equalsexpected(); + continue; + } + // now get a number + sym->value = compreaddecimal(&ptr); + } +} +//--- +int vardefinitions() { + if (debugginginfoon) { + compprs("\nStarting variable definitions at line "); + compprintdecimald0(complinenumber); + compflush(); // print buffer contents + compprs("\n"); + } + while (true) { + char c = checkforcontrolword(); + if (c) return c; + currentvarnumber++; + // In split data (1.5) vars can go higher than 256 + // for MC purposes but are flagged when + // used in non-MC sections + if (currentvarnumber >= (splitdata ? 65536 : 256)) { + TooManyVars(); + continue; + } + struct _symbol *sym = addsymbol(vartype, currentvarnumber); + if (!sym) continue; + } +} +int tabledefinitions() { + if (debugginginfoon) { + compprs("\nStarting table definitions at line "); + compprintdecimald0(complinenumber); + compflush(); // print buffer contents + compprs("\n"); + } + while (true) { + char c = checkforcontrolword(); + if (c) return c; + struct _symbol *sym = addsymbol(tabletype, 0); // dummy value + // sym = address of symbol entry + if (!sym) continue; + if (*ptr++ != '=') { + equalsexpected(); + continue; + } + // now get a number + sym->value = compreaddecimal(&ptr); + } +} +//--- +int mainprogram() { + if (debugginginfoon) { + compprs("\nStarting main program at line "); + compprintdecimald0(complinenumber); + compflush(); // print buffer contents + compprs("\n"); + } + while (true) { + char c = checkforcontrolword(); + if (c) return c; + // defining a label ? + if (*ptr == '.') { + if (suppresscompilation) { + compskiptoeol(); + continue; + } + ptr++; // move on to text of label + struct _symbol *sym = addsymbol(labeltype, compacodeptr - startacode); + if (!sym) continue; + sym->codestate = CodeState; + continue; + } + + int keyword = tablecompare(compinstructiontable, (testcomp ? numinstructions + 1 : numinstructions)); + if (keyword == 6 && *ptr == '=' ) { + // 'cif' here is being used as a variable, not a keyword + keyword = 0; + ptr -= 3; + } + if (suppresscompilation && keyword != (bugcomp ? 4 : 6) && keyword != 5) { + // only keyword numbers 5/6 [bug: was 3/4, adjusted for ASR to 4/5] + // (i.e. start/end conditional assembly) + // are assembled in the middle of conditional assembly + compskiptoeol(); // ignore instruction + continue; + } + + if (keyword) { // keyword number + CurrentJumpTable[keyword & 0x3f](); + continue; + } + + // only other possibility is that it is an assignment + // to a var or table + // check for 16 bit list access... + c = compsearch(); + if (c == '&') { + SixteenFlag = 1; + ptr++; + } else { + SixteenFlag = 0; + } + int index = 0; + int base = 0; + int n = -1; + struct _symbol *sym = NULL; + bool found = findsymbol(&sym); + if (!sym) continue; + if (!found) { + badinstruction(); + continue; + } + int type = sym->type & 0x7f; + sym->type |= 0x80; + if (type == vartype) { + if (compsearch() != '=') { + equalsexpected(); + continue; + } + ptr++; + compsearch(); + + struct _symbol *sym2 = NULL; + found = findsymbol(&sym2); + if (!sym2) continue; + if (found) { + type = sym2->type & 0x7f; + sym2->type |= 0x80; + if (type == constanttype) { + // assigning from a manifest constant + n = sym2->value; + } else if (type == tabletype) { + // var=table(c/v) + if (CodeState == '+') { + MCAft(sym->value, sym2->value); + continue; + } + + if (SixteenFlag) { + CantDo16(); + continue; + } + + if (compsearch() != '(') { + bracketsexpected(); + continue; + } + ptr++; // skip bracket + + struct _symbol *sym3 = NULL; + found = findsymbol(&sym3); + if (!sym3) continue; + if (found) { + type = sym3->type & 0x7f; + sym3->type |= 0x80; + if (type == vartype) { + // a variable + index = sym3->value; // value of var + base = 0xa0; // base value for var=table(v) + } else if (type != constanttype) { + badindex(); + continue; + } else { + // a manifest constant + index = sym3->value; // value of constant + base = 0xc0; // base value for var=table(c) + } + } else { + // a numeric value? + index = getnumberconstant(); // will print an error message if not + base = 0xc0; // base value for var=table(c) + if (index < 0) continue; + } + + if (compsearch() != ')') { + bracketsexpected(); + continue; + } + ptr++; // skip bracket + + // now generate the code + // first put in opcode - base value+table number + code(sym2->value | base); + + // and the index + if (index >= 0x100) { + badindex(); // single byte index only + continue; + } + code(index); + + // now thing not inside the brackets + code(sym->value); // i.e. var to assign to + continue; + } else if (type != vartype) { + varexpected(); + continue; + } else { + // var=var + if (CodeState == '+') { + MCLetVV(sym->value, sym2->value); // v1, v2 + } else { + code(opcletvv); // opc + code(sym2->value); // v2 + code(sym->value); // v1 + } + continue; + } + } else { + // assigning from constant? + n = getnumberconstant(); + if (n < 0) continue; + } + // n = constant to assign from + if (CodeState == '+') { + MCLetVC(sym->value, n); // var, constant + } else if (n < 0x100) { + code(opcletvcsmall); + code(n); // single byte constant only + code(sym->value); // var + } else { + code(opcletvcbig); + codew(n); // two byte constant + code(sym->value); // var + } + continue; + } else if (type == tabletype) { + // have found a table identifier at start of line + // i.e. want to do function of form @(V/C)=V + if (compsearch() != '(') { + bracketsexpected(); + continue; + } + ptr++; // skip bracket + + struct _symbol *sym2 = NULL; + found = findsymbol(&sym2); + if (!sym2) continue; + if (found) { + type = sym2->type & 0x7f; + sym2->type |= 0x80; + if (type == vartype) { + // table(var)=var + base = 0xe0; // base value for table(var)=var operations + index = sym2->value; + if (CodeState == '+') { + MCAttVar(sym->value, index); // table, index + continue; + } + } else if (type != constanttype) { + badindex(); + continue; + } else { + // a manifest constant index + index = sym2->value; // value of index + base = 0x80; // base for table(const)=var operations + } + } else { + // only remaining possibility is a numeric offset? + index = getnumberconstant(); // will print an error message if not + base = 0x80; // base for table(const)=var operations + if (index < 0) continue; + } + // have value of the constant index - generate code for table(c)=v + if (CodeState == '+') { + MCAttConst(sym->value, index); // table, index + continue; + } + + if (SixteenFlag) { + CantDo16(); + continue; + } + + if (compsearch() != ')') { + bracketsexpected(); + continue; + } + ptr++; // skip bracket + + if (compsearch() != '=') { + equalsexpected(); + continue; + } + ptr++; // skip equals + + // now generate the code + // first put in opcode - base value+table number + code(sym->value | base); + + // and the index + if (index >= 0x100) { + badindex(); // single byte index only + continue; + } + code(index); + + // and finally the var not inside the brackets + int v = compgetvar(); + if (v) code(v); + continue; + } else { + syntaxerror(); + continue; + } + } // back to mainprogloop +} +int getnumberconstant() { + // a real number + char c = compsearch(); + if (c < '0' || c > '9') { + syntaxerror(); + return -1; + } + // yup, so generate the code + return compreaddecimal(&ptr); // pointer immediately after number +} +//--- +void compif() { + // handle if v = <> < > then label + opcodeaddress = compacodeptr; + int value = 0; + int opcode = 0; + + int v1 = compgetvar(); + if (!v1) return; + int op = evaloperator(); // op = operator type + if (op < 0) return; + struct _symbol *sym = NULL; + bool found = findsymbol(&sym); + if (!sym) return; + if (!found) { + // only other possibility is a number + value = getnumberconstant(); + if (value < 0) return; + } else { + int type = sym->type & 0x7f; + sym->type |= 0x80; // set "USED" bit + if (type == vartype) { + code(op | 0x10); + code(v1); // first var number + code(sym->value); // second var number + thenjump(); + return; + } else if (type != constanttype) { + badtype(); + return; + } else { + value = sym->value; + } + } + + opcode = op | 0x18; + // now set up size bit + if (value < 0x100) { + opcode |= smallmask; // set sizebit - small constant + code(opcode); + code(v1); // first var number + code(value); // single byte constant + } else { + code(opcode); + code(v1); // first var number + codew(value); // double byte constant + } + thenjump(); +} +void thenjump() { + // skip over "THEN" if present, then evaluate jump address + compsearch(); + stringcompare("THEN"); + // stringcompare automatically skips string if matched + jumpstuff(); +} +int evaloperator() { + // return code corresponding to operator + char c = compsearch(); + ptr++; // skip operator + if (c == '=') return eqop; + if (c == '>') return gtop; + if (c != '<') { + badoperator(); + return -1; + } + c = *ptr; + if (c != '>') return ltop; + ptr++; // and skip > of <> + return neop; // must have been <> +} +//--- +void compgoto() { + opcodeaddress = compacodeptr; + code(opcgoto); + jumpstuff(); +} +void compgosub() { + opcodeaddress = compacodeptr; + code(opcgosub); + jumpstuff(); +} +bool jumpstuff() { + // insert code for a jump to the label (ptr) + // the address of the opcode for this jump is at opcodeaddress + char c = compsearch(); + if (c == '@') ptr++; // skip @ + else if (!forcedlongjumps) { + // relative jump, so set relbit in opcode + *(char *)opcodeaddress |= relmask; // set relbit + } + + struct _symbol *sym = NULL; + int label = getlabel(&sym); + if (label < 0) return false; + if (!sym) return false; + if (sym->codestate && sym->codestate != CodeState) { + WrongCodeState(); + return false; + } + + if (c == '@' || forcedlongjumps) { + // absolute jump + // getlabel gives value of label relative to start of acode + // which is just what we want! + codew(label); + } else { + // label is value of label relative to start of acode + // find current address relative to start + int delta = label - (compacodeptr - startacode); + if (delta < 128 && delta >= -128) code(delta); + else { + reljumpoutofrange(); + return false; + } + } + + return true; +} +//--- +int getlabel(struct _symbol **sym) { + // return value of label relative to start of acode area + // set up forward reference if label is not yet defined + struct _forwardentry *entry = NULL; + bool found = findsymbol(sym); + if (!*sym) return -1; + if (!found) { + // freeforwardref = value of symbol - offset of first entry in chain in f/r table + *sym = addsymbol(undefinedlabeltype, freeforwardref - startforward); + if (!*sym) return -1; + (*sym)->type |= 0x80; // set "USED" bit + } else { + int type = (*sym)->type & 0x7f; + (*sym)->type |= 0x80; // set "USED" bit + if (type == undefinedlabeltype) { + // add a forward reference to a label which already + // has some references to it, sym is entry in symbol table + // scan through existing list + // start with first forward reference entry + entry = startforward + (*sym)->value; + // then find end of list and link free entry + while (entry->next) entry = entry->next; + entry->next = freeforwardref; + } else if (type != labeltype) { + wronglabeltype(); + return -1; + } else return (*sym)->value; + } + + // and set up the new entry in the forward reference table + // structure is: + // .. offset from start of table of next u/d reference to this symbol + // .. line number of reference + // .. offset from start of code of the reference + // .. offset from start of code of the opcode + // .. file number in which reference occured + // .. CodeState + entry = freeforwardref; + entry->next = NULL; // offset of next entry + entry->linenumber = complinenumber; + entry->ref = compacodeptr - startacode; // current pos relative to start of acode + entry->opcode = opcodeaddress - startacode; + entry->filenumber = filenumber; + entry->codestate = CodeState; + + freeforwardref++; // and set up free space pointer + if (freeforwardref >= endforward) { + freeforwardref--; + forwardrefoverflow(); + return -1; + } + // returning offset relative to acode start of opcode. + // This is wrong for MC compilation because DummyOpcode used + // for MC, return current acode position + return (CodeState == '+') ? entry->ref : entry->opcode; +} +//--- +void resolveforwardref(struct _symbol *sym) { + // have just defined encountered ".label" which + // is in the symbol table as type undefinedlabeltype + // so zip through setting up all the jumps correctly + // symbol table entry is sym + // mark label as defined + sym->type = labeltype | 0x80; + struct _forwardentry *entry = startforward + sym->value; + + do { + if (entry->codestate != CodeState) { + ForwardWrongCodeState(sym, entry); + return; + } + + if (CodeState == '+') + MCrfr(sym, entry); + else { + int label = compacodeptr - startacode; + char *ref = (char *)(startacode + entry->ref); + char opcode = *(char *)(startacode + entry->opcode); + if (!(opcode & relmask)) { + // poke back in address for a long jump + // poke back two-byte reference + *ref++ = label & 0xff; // low byte + *ref = label >> 8; // high byte + } else { + // poke back in address for short jump + // make it relative to address of reference + int delta = label - entry->ref; + if (delta >= 128) { // >>was 0x100! + forwardoutofrange(sym, entry); // note special line number treatment + return; + } + *ref = delta; // poke in single byte reference + } + } + + // any more forward references? + // at present, no garbage collection on forward + // reference area. If this is needed (which I doubt) + // then the easiest way is probably to have a free-space + // linked list to which space is added. When space is + // needed, it can be taken off the start of this list + entry = entry->next; // next chained entry + } while (entry); +} +//--- +void addsub() { + int v1 = compgetvar(); + if (!v1) return; + if (compsearch() != ',') { + commaexpected(); + return; + } + ptr++; // skip over comma + int v2 = compgetvar(); + if (!v2) return; + code(v2); + code(v1); +} +void COMPADD() { + code(opcaddvv); + addsub(); +} +void COMPSUB() { + code(opcsubvv); + addsub(); +} +//--- +void COMPACODEPRS() { + // Compile a function call for acode prs - for acode debugging + if (compsearch() != '"') { + missingquote(); + return; + } + code(opcfunction); + code(fncprs); + ptr++; // skip over leading quote + + while (*ptr != '"') { + if (*(uint8_t *)ptr == 0x9c) { + poundsignnotallowed(); // pound sign is invisible + messes up capitalization + return; + } + code(*ptr++); + } + ptr++; // skip over closing quote + + code(0); // add 0 to terminate +} +//--- +void COMPCLEAR() { + code(opcfunction); + code(fncclear); +} +//--- +void COMPCLS() { + code(opcclear); + compsearch(); + char c = toupper(*ptr++); + if (c == 'T') { + code(0); + } else if (c == 'G') { + code(1); + } else { + badarg(); + } +} +//--- +void COMPDATA() { + char c = 0; + do { + // should it be reset to zero? + // since (in non-MC) '@' is always used + // in DATA, this is not a problem? + opcodeaddress = jumpdummyopcode; + if (!jumpstuff()) return; + c = compsearch(); + ptr++; // skip over comma + } while (c == ','); + if (c == ';') compssskiptoeol(); +} +//--- +void COMPDRIVEROPCODE() { + code(opcfunction); + code(fncacodedriver); +} +//--- +void fourargs(char c) { + code(c); + for (int i = 0; i < 4; i++) { + int v = compgetvar(); + if (!v) return; + code(v); + } +} +//--- +void COMPEXIT() { + fourargs(opcexit); +} +//--- +void COMPINPUT() { + fourargs(opcinput); +} +//--- +void COMPGETNEXT() { + code(opcgetnext); + for (int i = 0; i < 6; i++) { + int v = compgetvar(); + if (!v) return; + code(v); + } +} +//--- +void COMPJUMP() { + char longjumps = forcedlongjumps; + forcedlongjumps = 1; + + opcodeaddress = compacodeptr; + code(opccall); + if (jumpstuff()) { + int v = compgetvar(); + if (!v) return; + code(v); + } + + // and restore original value in forcedlongjumps + forcedlongjumps = longjumps; +} +//--- +void COMPMESSAGE() { + int message = 0; + struct _symbol *sym = NULL; + bool found = findsymbol(&sym); + if (!sym) return; + if (found) { + int type = sym->type & 0x7f; + sym->type |= 0x80; // set "USED" bit + if (type == constanttype) { + // manifest constant + message = sym->value; + } else if (type != vartype) { + badtype(); + return; + } else { + // message v + code(opcmessagev); // opcode + code(sym->value); // var number + return; + } + } else { + // numerical constant + message = getnumberconstant(); + if (message < 0) return; + } + // message c + if (message < 0x100) { + code(opcmessagecsmall); + code(message); // single byte constant + } else { + code(opcmessagecbig); + codew(message); // double byte constant + } +} +//--- +void COMPPICTURE() { + code(opcpicture); + int v = compgetvar(); + if (!v) return; + code(v); +} +//--- +void COMPPRINT() { + code(opcprint); + int v = compgetvar(); + if (!v) return; + code(v); +} +//--- +void COMPPRINTINPUT() { + code(opcprintinput); +} +//--- +void COMPBREAKPT() { + code(opcfunction); + code(fncbreakpt); +} +//--- +void COMPRANDOM() { + code(opcfunction); + code(fncrandom); + int v = compgetvar(); + if (!v) return; + code(v); +} +//--- +void COMPRESTORE() { + code(opcfunction); + code(fncrestore); +} +//--- +void COMPRETURN() { + code(opcreturn); +} +//--- +void COMPSAVE() { + code(opcfunction); + code(fncsave); +} +//--- +void COMPSCREEN() { + code(opcscreen); + compsearch(); + char c = toupper(*ptr++); + if (c == 'T') { + code(0); + } else if (c == 'G') { + code(1); + int v = compgetvar(); // dummy var for screeng g + if (!v) return; + code(v); + } else { + badarg(); + } +} +//--- +void COMPSTACK() { + code(opcfunction); + code(fncstack); +} +//--- +// now some general code generation subroutines +void codew(uint16_t w) { + code(w & 0xff); + code(w >> 8); +} +void code(uint8_t c) { + // add code to current position in code + *(uint8_t *)compacodeptr++ = c & 0xff; + if (compacodeptr == endacode) { + acodeoverflow(); + compacodeptr--; + } +} +//--- +int compgetvar() { + // return value of var (ptr) in sym + struct _symbol *sym = NULL; + bool found = findsymbol(&sym); + if (!sym) return 0; + if (!found) { + varnotdefined(); + return 0; + } + if ((sym->type & 0x7f) != vartype) { + varexpected(); + return 0; + } + sym->type |= 0x80; + return sym->value; +} +//--- +void checkunusedsymbols() { + compprs("Unused symbols... \n"); + + int unused = 0; + int total = 0; + struct _symbol *sym = startsymbols; + while (sym < endsymbols) { + if (*sym->text) { + total++; + if (!(sym->type & 0x80)) { + unused++; + printsymbol(sym); + } + } + sym++; + } + if (unused) compprs("Number of unused symbols: %d out of %d\n", unused, total); + compprs("\n"); +} +//--- +void printsymboltable() { + compprs("Symbol table...\n"); + // display all symbols + int total = 0; // total number of symbols + int hashed = 0; // symbols within hash table + compprs("\n"); + + struct _symbol *sym = startsymbols; + // end of hash table + struct _symbol *endhash = startsymbols + hashentries; + + while (sym < endsymbols) { + if (*sym->text) { + total++; // number of symbols + printsymbol(sym); + } + sym++; + + if (sym == endhash) { + compprs("-----------------\n"); + compprs("End of hash table\n"); + compprs("-----------------\n"); + hashed = total; // save number of symbols in hash table + } + } + compprs("Total number of symbols = "); + compprintdecimald0(total); + compflush(); // print buffer contents + compprs("\nOf which number in hash table = "); + compprintdecimald0(hashed); + compflush(); // print buffer contents + compprs("\n\n"); +} +//--- +void printsymbol(struct _symbol *sym) { + // print symbol (sym) + // first print value + compprintdecimald0(sym->value); + compflush(); // print buffer contents + compprs(" \t"); // tab + + absprintsymbol(sym); + compprs("\n"); +} +//--- +void absprintsymbol(struct _symbol *sym) { + // print symbol + compprs("%s", sym->text); +} +//--- + +struct _symbol *addsymbol(char type, int value) { + // add symbol (ptr) of alphanumeric characters + // with type and value + // return = address of symbol + struct _symbol *sym = NULL; + bool found = findsymbol(&sym); + if (!sym) return NULL; + if (found) { + // only one type of symbol can be redefined + // - where a "undefinedlabeltype" is to be replaced + // by a "labeltype" + if ((sym->type & 0x7f) != undefinedlabeltype || type != labeltype) { + cantredefinesymbol(); + return NULL; + } + resolveforwardref(sym); // ok! + } else { + // sym = address of last symbol in chain found + if (*sym->text) { // anything there? + // yes, find the first free address and add a symbol in it + // then chain on ptr at sym->ptr + sym->ptr = freesymbol; + sym = freesymbol; + // and adjust free symbol pointer accordingly + freesymbol++; + if (freesymbol == endsymbols) { + freesymbol--; + symboltableoverflow(); + return NULL; + } + // no, fall through - first entry with this hash value + } + // there is space to add a symbol so do so + int offset = 0; + do { + sym->text[offset++] = *ptr++; + } while (compisd0alphanumeric(*ptr) && offset < symboltextlength); + if (offset == symboltextlength) { + sym->text[offset - 1] = 0; + symboltoolong(); + return NULL; + } + } + // set up type, value + sym->type = (sym->type & 0x80) | type; + sym->value = value; + return sym; +} +//--- +bool findsymbol(struct _symbol **sym) { + // find symbol (ptr) of alphanumeric characters + // return: *sym = address of symbol if found and int = 0 + // else int <> 0 and *sym = address of last symbol in chain + + // first do hash calculation on the symbol + // to find the offset from the start of the symbol area + compsearch(); + // offset from start of symbol area + int hash = hashcalc(); + if (hash < 0) return false; + *sym = startsymbols + hash; + struct _symbol *current = *sym; + // is there an entry there already? + if (*current->text) { + while (stringcompare(current->text) != 0) { + // not found - any chained entries? + current = current->ptr; + if (!current) return false; + *sym = current; + } + // In split data (1.5) only checked when used in non-MC + if (splitdata && CodeState == '-' && + (*sym)->type == vartype && (*sym)->value >= 256) { + *sym = NULL; + TooManyVars(); + return false; + } + return true; + } else return false; +} +//--- +int hashcalc() { + // from symbol at (ptr), return the offset from the + // start of the hash table + uint8_t hash = 0; + int offset = 0; + if (!compisd0alphanumeric(*ptr)) { + badsymbol(); + return -1; + } + + do { + hash += toupper(*(ptr + offset)) - '0'; + offset++; + } while (compisd0alphanumeric(*(ptr + offset))); + + // modulo hashentries + return hash % hashentries; +} +//--- +void displayline() { + // display the line after the current pointer if debugging info is on + if (!debugginginfoon) return; + // display the previous 8 bytes + compprs("\n"); + // display address relative to start of acode + void *prev = compacodeptr - 8; + comphexlonga0(prev - startacode); + compprs(": "); + for ( ; prev < compacodeptr; prev++) { + comphexbyted0((prev < startacode) ? 0xff : *(char *)prev); + compprs(" "); + } + compprs(" - "); + // first give line number + compprintdecimald0(complinenumber); + compflush(); // print buffer contents + compprs(": "); + uint8_t *p = (uint8_t *)ptr; + while (*p >= 32) compprs("%c", *p++); + compflush(); // print buffer contents +} +//--- +int tablecompare(char table[][tsize], int nentries) { + // compare a word of alphanumerics at (ptr) + // with table starting at table, which has nentries entries + // each of length tsize + // return keyword number or 0 if not found + int lentry = -1; + int uentry = nentries; + while (true) { + // get mid-point between lower and nentries as next comparison string + int entry = (lentry + uentry) / 2; + // do a single string compare + int cmp = stringcompare(table[entry]); + // have we finished? + if (cmp == 0) return entry + 1; // found + else if (uentry - lentry <= 2) return 0; // not found + else if (cmp < 0) uentry = entry; + else lentry = entry; + } +} +//--- +int stringcompare(char *text) { + char *p = ptr; + while (compisd0alphanumeric(*p)) p++; + char orig = *p; // save original char + + *p = 0; // temporarily terminate string + int cmp = strcasecmp(ptr, text); + *p = orig; // restore original char + + if (cmp == 0) ptr = p; // advance ptr if match + return cmp; +} +//--- +void compssskiptoeol() { + compskiptoeol(); + compsupersearch(); // on new line as well! +} +void compskiptoeol() { + if (*ptr == eof) return; + while (*ptr++ != compterminator); + do { + TotalSourceLines++; + complinenumber++; + // skip control characters (including false eol) + uint8_t c = eof; + while (c = *ptr++, c < 32 && c != compterminator && c != eof); + ptr--; + displayline(); + } while (*ptr++ == compterminator); + ptr--; +} +int compsearch() { + // search, skipping spaces + while (*ptr == ' ') ptr++; + return *ptr; +} +int compsupersearch() { + // search, skipping over comments if present + while (true) { + uint8_t c = compsearch(); + if (c == eof) break; + if (c == '*' || c == ';' || c == compterminator || c < 32) { + compskiptoeol(); + } else break; + } + return *ptr; +} +//--- +void forwardoutofrange(struct _symbol *sym, struct _forwardentry *entry) { + compprs("\nForward reference to '"); + absprintsymbol(sym); + + compprs("' out of range at line "); + FROREnd(entry); +} +void FROREnd(struct _forwardentry *entry) { + // line number in which error occured + compprintdecimald0(entry->linenumber); + compflush(); // print buffer contents + compprs(" in file "); + // file number in which error occured + compprintdecimald0(entry->filenumber); + compflush(); // print buffer contents + compprs("\n"); + comperror1(); +} +//--- +void varexpected() { + compprs("\nVariable expected"); + comperror(); +} +//--- +void acodeoverflow() { + compprs("\nAcode overflow"); + acodeerror = true; + comperror(); + acodeerror = false; +} +//--- +void symboltableoverflow() { + compprs("\nSymbol table overflow"); + comperror(); +} +//--- +void symboltoolong() { + compprs("\nSymbol too long"); + comperror(); +} +//--- +void varnotdefined() { + compprs("\nVariable not defined"); + comperror(); +} +//--- +void compilerbug() { + compprs("\nFatal compiler bug"); + comperror(); +} +void comperror() { + compprs(" at line "); + compprintdecimald0(complinenumber); + compflush(); // print buffer contents + + compprs(" in file '"); + compprintfilename(); + compprs("'\n"); + comperror1(); +} +void comperror1() { + // all errors come here + compilationerrors = 1; // prevent saving of code + if (!acodeerror) compssskiptoeol(); +} +//--- +void compprintfilename() { + struct _fcb *fcb = (struct _fcb *)&compdriverbuffer; + compprs("%s", fcb->filename); +} +//--- +void chartoprinter(char c) { + // now send it to the printer +// move.l a0,-(sp) +// move.w d0,-(sp) // this is argument for routine as well as preservation +// call_bdos c_auxout // send to printer - call_bdos c_conout +// addq.l 2,sp // remove function call number etc. +// move.w (sp)+,d0 +// move.l (sp)+,a0 +// rts +} +//--- +void TooManyVars() { + compprs("\nToo many variables"); + comperror(); +} +//--- +void forwardrefoverflow() { + compprs("\nThe forward reference table overflowed"); + comperror(); +} +//--- +void cantredefinesymbol() { + compprs("\nCan't redefine symbol"); + comperror(); +} +//--- +void badsymbol() { + compprs("\nBad symbol"); + comperror(); +} +//--- +void equalsexpected() { + compprs("\nEquals expected"); + comperror(); +} +//--- +void commaexpected() { + compprs("\nComma expected"); + comperror(); +} +//--- +void bracketsexpected() { + compprs("\nBracket expected"); + comperror(); +} +//---- +void MCTooFar() { // Introduced in 1.5 + compprs("\nLong jump out of range"); + comperror(); +} +//---- +void reljumpoutofrange() { + compprs("\nRelative jump out of range"); + comperror(); +} +//--- +void badindex() { + compprs("\nBad table index"); + comperror(); +} +//--- +void badtype() { + compprs("\nBad type"); + comperror(); +} +//--- +void badoperator() { + compprs("\nBad operator"); + comperror(); +} +//--- +void poundsignnotallowed() { + compprs("\nPound sign is not allowed in prs"); + comperror(); +} +//--- +void missingquote() { + compprs("\nMissing quote"); + comperror(); +} +//--- +void badarg() { + compprs("\nBad argument"); + comperror(); +} +//--- +void badinstruction() { + compprs("\nInstruction not recognized"); + comperror(); +} +//--- +void wronglabeltype() { + compprs("\nSymbol redefined as different type"); + comperror(); +} +//--- +void compnotimp() { + compprs("\nSomething not implemented"); + comperror(); +} +//--- +void syntaxerror() { + compprs("\nSyntax error"); + comperror(); +} +//--- +void PlusOrMinusExpected() { + compprs("\nPlus or minus expected"); + comperror(); +} +//--- +void AlreadyInState() { + compprs("\nAlready in specified code state"); + comperror(); +} +//--- +void NotAllowedInAcode() { + compprs("\nInstruction not allowed in interpreted acode"); + comperror(); +} +//--- +void NotAllowedInMC() { + compprs("\nInstruction not allowed in machine code"); + comperror(); +} +//--- +void EvenError() { + compprs("\nMC must be even-aligned"); + comperror(); +} +//--- +void CantDo16() { + compprs("\nCan't do 16 bit tables in interpreted mode"); + comperror(); +} +//--- +void WrongCodeState() { + compprs("\nCan't jump into area of different code state"); + comperror(); +} +//--- +void ForwardWrongCodeState(struct _symbol *sym, struct _forwardentry *entry) { + compprs("\nForward reference to '"); + absprintsymbol(sym); + compprs("' changes code state at line "); + FROREnd(entry); +} +//--- +void usage(char *progname) { + printf("Usage: %s [options]\n\n", progname); + printf("Options:\n"); + printf("--help: print this usage message\n"); + printf("--bugcomp: enable bugwards compatibility (e.g. for conditional compilation)\n"); + printf("--oddacode: do not align acode in gamedata.dat\n"); + printf("--testcomp: limit sizes to test overflow errors\n"); + printf("--i8086: generate MC code for i8086\n"); + printf("--splitdata: generate split acode and gamedata\n"); + printf("\n"); + exit(0); +} +int main(int argc, char **argv) { + int arg = 0; + while (++arg < argc) { + if (strcmp(argv[arg], "--help") == 0) usage(argv[0]); + if (strcmp(argv[arg], "--bugcomp") == 0) { bugcomp = true; continue; } + if (strcmp(argv[arg], "--oddacode") == 0) { oddacode = true; continue; }; + if (strcmp(argv[arg], "--testcomp") == 0) { testcomp = true; continue; }; + if (strcmp(argv[arg], "--i8086") == 0) { i8086 = true; Mc8086(); continue; }; + if (strcmp(argv[arg], "--splitdata") == 0) { splitdata = true; continue; }; + printf("Unrecognized argument: '%s'\n\n", argv[arg]); + usage(argv[0]); + } + compstart(); + compmenu(); + return 0; +} diff --git a/l9dev/comp.h b/l9dev/comp.h new file mode 100644 index 0000000..08f449e --- /dev/null +++ b/l9dev/comp.h @@ -0,0 +1,243 @@ +// 68000 Acode compiler (for Linux) +// +// M.J.Austin. Copyright (C) 1988 Level 9 Computing +// + +#include "common.h" + +// comparison operators +#define eqop 0 // = +#define neop 1 // <> +#define ltop 2 // < +#define gtop 3 // > +//--- +// default sizes of various regions +#define hashentries 256 +#define symbolentries 3500 +#define testsymbolentries 464 +#define sizesymbolarea symbolentries*symbolsize +#define testsizesymbolarea testsymbolentries*symbolsize +#define sizeacodearea 24500 +#define splitsizeacodearea 60000 // for split data (1.5) +#define testsizeacodearea 0x1e8 +#define forwardentries 4000 +#define testforwardentries 4 +#define sizegamedata 50000 +#define splitsizegamedata 80000 // for split data (1.5) +//--- +// see controlwords +#define numinstructions 35 // 34 + 1 due to ASR in 1.5 +#define instructionlen 16 +//--- +#define opcgoto 0 +#define opcgosub 1 +#define opcreturn 2 +#define opcprint 3 +#define opcmessagev 4 +#define opcmessagec 5 +#define opcmessagecsmall opcmessagec+smallmask +#define opcmessagecbig opcmessagec +#define opcfunction 6 +#define opcinput 7 +#define opcletvcbig 8 +#define opcletvcsmall opcletvcbig+smallmask +#define opcletvv 9 +#define opcaddvv 10 +#define opcsubvv 11 +#define opcchangecode 12 // change code generation state +#define opccall 14 +#define opcexit 15 +#define opcscreen 20 +#define opcclear 21 +#define opcpicture 22 +#define opcgetnext 23 +#define opcprintinput 28 +// +// function codes +#define fncacodedriver 1 +#define fncrandom 2 +#define fncsave 3 +#define fncrestore 4 +#define fncclear 5 +#define fncstack 6 +#define fncbreakpt 7 +#define fncprs 250 +//--- +#define numcontrolwords 4 +#define tsize 16 +//--- +// function declarations needed for forward references in comp.c +#define compprs prs +void UNIMP(); +void NotAllowedInAcode(); +void COMPADD(); +void NotAllowedInAcode(); +void COMPBREAKPT(); +void compcend(); +void compcif(); +void COMPCLEAR(); +void COMPCLS(); +void CompCode(); +void COMPDATA(); +void compdebuggingon(); +void COMPDRIVEROPCODE(); +void COMPEXIT(); +void COMPGETNEXT(); +void compgosub(); +void compgoto(); +void compif(); +void COMPINPUT(); +void COMPJUMP(); +void COMPMESSAGE(); +void COMPPICTURE(); +void COMPPRINT(); +void COMPPRINTINPUT(); +void COMPACODEPRS(); +void COMPRANDOM(); +void COMPRESTORE(); +void COMPRETURN(); +void COMPSAVE(); +void COMPSCREEN(); +void COMPSTACK(); +void COMPSUB(); +void compdriver(int, void *); +bool dojumptable(char); +void ToggleRS232Printer(); +void SetRS232(); +void finishwithoutacode(); +void finishgamedatainmemory(); +void copyacode(); +void savegamedata(); +void rungame(); +void toggledebugginginfo(); +void toggleforcedlongjumps(); +void togglereport(int); +void nowoff(); +void finishacode(); +void saveacode (); +bool compilefile(); +bool batchcompile(); +void abscompilefile(); +void endofcompfile(); +int checkforcontrolword(); +int constantdefinitions(); +int vardefinitions(); +int tabledefinitions(); +int mainprogram(); +int getnumberconstant(); +void thenjump(); +int evaloperator(); +bool jumpstuff(); +int getlabel(struct _symbol **); +void codew(uint16_t); +void code(uint8_t); +int compgetvar(); +void checkunusedsymbols(); +void printsymboltable(); +void printsymbol(struct _symbol *); +void absprintsymbol(struct _symbol *); +struct _symbol *addsymbol(char, int); +bool findsymbol(struct _symbol **); +int hashcalc(); +void displayline(); +int tablecompare(char table[][tsize], int); +int stringcompare(char *); +void compssskiptoeol(); +void compskiptoeol(); +int compsearch(); +int compsupersearch(); +void forwardoutofrange(struct _symbol *, struct _forwardentry *); +void FROREnd(struct _forwardentry *); +void varexpected(); +void acodeoverflow(); +void symboltableoverflow(); +void symboltoolong(); +void varnotdefined(); +void compilerbug(); +void comperror(); +void comperror1(); +void compprintfilename(); +void TooManyVars(); +void forwardrefoverflow(); +void cantredefinesymbol(); +void badsymbol(); +void equalsexpected(); +void commaexpected(); +void bracketsexpected(); +void reljumpoutofrange(); +void badindex(); +void badtype(); +void badoperator(); +void poundsignnotallowed(); +void missingquote(); +void badarg(); +void badinstruction(); +void wronglabeltype(); +void compnotimp(); +void syntaxerror(); +void PlusOrMinusExpected(); +void AlreadyInState(); +void NotAllowedInAcode(); +void NotAllowedInMC(); +void EvenError(); +void CantDo16(); +void WrongCodeState(); +void ForwardWrongCodeState(struct _symbol *, struct _forwardentry *); +//--- +// defined in finish.c +extern char *ptr; +extern struct _fcb savecompletedriverblock; +extern char *startcomplete; +extern char *finishedptr; +extern void *startsources; +extern void processexits(); +extern void processtables(); +extern void savedirectory(); +extern void selectdirectory(); +extern void processsquash(); +extern void climb(); +extern void processacodeptr(); +extern void finishchecksum(); +extern void descend(); +//--- +// defined in code.c +extern void Mc8086(); +extern void MCPop(); +extern void MCPush(); +extern void MCToAcode(); +extern void MCReturn(); +extern void MCAdd(); +extern void MCAnd(); +extern void MCASR(); +extern void MCOr(); +extern void MCSub(); +extern void MCXor(); +extern void MCPrint(); +extern void MCMessage(); +extern void MCInput(); +extern void MCExit(); +extern void MCScreen(); +extern void MCPicture(); +extern void MCGetNext(); +extern void MCPrintInput(); +extern void MCDriverOpcode(); +extern void MCRandom(); +extern void MCSave(); +extern void MCRestore(); +extern void MCClear(); +extern void MCStack(); +extern void MCCLS(); +extern void MCJump(); +extern void MCAcodePrs(); +extern void MCBreakPt(); +extern void MCData(); +extern void MCgosub(); +extern void MCgoto(); +extern void MCIF(); +extern void MCLetVC(int, int); +extern void MCLetVV(int, int); +extern void MCAttVar(int, int); +extern void MCAttConst(int, int); +extern void MCAft(int, int); +extern void MCrfr(struct _symbol *, struct _forwardentry *); +//--- diff --git a/l9dev/compile.bat b/l9dev/compile.bat new file mode 100644 index 0000000..23aa5fd --- /dev/null +++ b/l9dev/compile.bat @@ -0,0 +1,3 @@ +6 +1test.txt +2340 diff --git a/l9dev/driver.c b/l9dev/driver.c new file mode 100644 index 0000000..29f1038 --- /dev/null +++ b/l9dev/driver.c @@ -0,0 +1,342 @@ +// Atari ST driver (minimal parts adapted for Linux) +// Copyright (C) 1986-1988 Level 9 Computing +// M.J.Austin 20/7/86 +// first presentable Linux version 21/12/25 + +// note - if 'graphics' is defined elsewhere (as anything), +// the appropriate code will be defined in here. +// To make this driver public domain, simply +// remove all the code assembled within the 'ifd' instruction + +// Some programs need to know which machine they are running +// on (e.g. to allow for different assemblers) +// this is catered for by the following constants +// THIS FACILITY SHOULD BE USED AS LITTLE AS POSSIBLE + +#include // for va_ macros + +#include "driver.h" + +char driverbuffer[40]; + +//////////////////////////////////////////// +// the Program Itself // +//////////////////////////////////////////// + +//--- +int OutputDevice = 2; // 2 = CON: 1 = AUX: +FILE *logfile = NULL; +void openlogfile(char *filename) { + logfile = fopen(filename, "a"); +} +void closelogfile() { + if (logfile) fclose(logfile); + logfile = NULL; +} +void prs(char const *fmt, ...) { + va_list ap; + va_start(ap, fmt); + vprintf(fmt, ap); + va_end(ap); + if (OutputDevice == 1 && logfile) { + va_start(ap, fmt); + vfprintf(logfile, fmt, ap); + va_end(ap); + } +} +char waitkey() { + while (driver(osrdchdcode, driverbuffer), !*(char *)driverbuffer); + return *(char *)driverbuffer; +} +//--- + +void driver(int code, void *buffer) { +// Standard entry point for all external routines + switch (code) { + case initdcode: + init(); break; + case checksumdcode: + calcchecksum(buffer); break; + case oswrchdcode: + driveroswrch(buffer); break; + case osrdchdcode: + driverosrdch(buffer); break; + case savedcode: + driversavefile(buffer); break; + case loaddcode: + driverloadfile(buffer); break; + case settextdcode: + settext(); break; + + case taskinitdcode: + resetginttask(); break; + case inputlinedcode: + driverinputline(buffer); break; + case returntoosdcode: + closedown(); break; + case randomnumberdcode: + randomnumber(buffer); break; + } +} + +//--- +int getclock() { + // return real time clock in list9(hi4,hi3,lo2,lo) + // approx 1/50 second per unit +// move.l realtimeclock,d0 +// move.l d0,(a6) + return 0; +} +//--- +void randomnumber(void *buffer) { + // return a random word + *(uint16_t *)buffer = (uint16_t)rand(); +} +//--- +void closedown() { + // exit gracefully + prs("\nDo you really want to leave the game? "); + char c; + do { + c = toupper(osrdch()); + } while (c != 'Y' && c != 'N'); + if (c == 'Y') { +// ifd graphics + killmultitasking(); + driver(settextdcode, NULL); +// endc // if graphics + returntogem(); + } +} +//--- +// ifd graphics +void killmultitasking() { +} +int getscreenaddress() { +// return address of screen start in a0.l and d0.l +// call_ebios _physbase +// addq.l 2,sp +// move.l d0,a0 + return 0; +} +void resetginttask() { +// lea gintstacktop(pc),a0 + +// lea gintstart(pc),a1 +// move.l a1,-(a0) +// move.w sr,-(a0) +// lea irqswaptaskend(pc),a1 +// move.l a1,-(a0) // return address from ist1 + +// movem.l d0-d7/a0-a6,-(a0) // dummy stack values +// lea taskstackptr,a1 +// move.l a0,(a1) +// rts +} +void init1() { + // cursorxpos = 0; + // cursorypos = 24; // bottom left is 0,24 here + + // cyclicwriteptr = cyclicib; + // cyclicbufferstart = cyclicib; + // cyclicbufferend = cyclicibtop; + // cycliccharsused = 0; +} +//--- +bool init2() { + // screenpointer = getscreenaddress(); + // now before doing anything, clear out the screen + // system("clear"); // not really necessary + // scrolledlines = 0; + // and what screen resolution are we in ? +// call_ebios _getrez * move.w #4,-(sp) +// addq.l #2,sp + // d0.b = 0 - low resolution, 1 = medium resolution, 2 = high res + // screenresolution = 1; + // if (screenresolution == 2) { + // screenheight = absscreenheight; + // } else { + // screenresolution = 0; // always low res for graphics nowadays + // } + // return screenresolution == 2; // hi-res ? + return false; +} +//--- +void init() { + // .initialise + // first, some general purpose initialisation --- + + // init1(); +// ifd graphics + // initialisetasks(); + // seterrorvectors(); // address error and bus error etc. +// endc // graphics + + // bool ishires = init2(); +// ifd graphics + // if (!ishires) initsplitscreen(); // no, so set up med-low res split screen +// endc + + // screenheight = absscreenheight * 2; // hi-res height +} +void calcchecksum(struct _fcb *area) { + // calculate checksum of area between area->start and area->end + int length = area->end - area->start + 1; + uint8_t checksum = 0; + uint8_t *checkptr = (uint8_t *)area->start; + while (length-- > 0) checksum += *checkptr++; + *(uint8_t *)area = checksum; +} + +//--- +void getfilename(struct _fcb *fcb) { + char *f = fcb->filename; + if (!*f) { + prs("\nFilename ? "); + scanf("%s", f); + } +} + +void driverloadfile(struct _fcb *fcb) { + getfilename(fcb); + FILE *fp = fopen(fcb->filename, "r"); + if (fp) { + int r = fread(fcb->start, 1, 0x30000, fp); + fclose(fp); + fcb->end = fcb->start + r; + *(char *)fcb = 0; // signify load ok + } else { + prs("Can't find file on disk.\n"); + *(char *)fcb = 1; // signify load error + } +} + +void driversavefile(struct _fcb *fcb) { + getfilename(fcb); + FILE *fp = fopen(fcb->filename, "w"); + if (fp) { + int size = fcb->end - fcb->start; + int written = fwrite(fcb->start, 1, fcb->end - fcb->start, fp); + fclose(fp); + if (written == size) { + *(char *)fcb = 0; // signify save ok + } else fp = NULL; + } + if (!fp) { + prs("Save error.\n"); + *(char *)fcb = 1; // signify save error + } +} +void hexlonga0(uint32_t n) { + prs("%08X", n); +} +void hexworda0(uint16_t n) { + prs("%04X", n); +} +void hexbyted0(uint8_t n) { + prs("%02X", n & 0xff); +} +void printhexdigit(uint8_t n) { + prs("%01X", n & 0xf); +} +void printdecimald0(int n) { + // print n as a decimal number, + // suppressing leading zeros + prs("%d", n); +} +int readdecimal(char **s) { + // given a decimal number as an ascii string at *s, return + // its value + // and *s = character after the number + return strtol(*s, s, 10); +} +//--- +bool isd0alphanumeric(char c) { + c = toupper(c); + return ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z')); +} +//--- +#ifdef __linux__ +#include +#include +struct termios saved_attributes; +#endif +void reset_input_mode() { +#ifdef __linux__ + if (!isatty(STDIN_FILENO)) return; + tcsetattr(STDIN_FILENO, TCSANOW, &saved_attributes); +#endif +} +void set_input_mode() { +#ifdef __linux__ + struct termios tattr; + if (!isatty(STDIN_FILENO)) return; + + tcgetattr(STDIN_FILENO, &saved_attributes); + atexit(reset_input_mode); + + tcgetattr(STDIN_FILENO, &tattr); + tattr.c_lflag &= ~(ICANON|ECHO); + tattr.c_cc[VMIN] = 1; + tattr.c_cc[VTIME] = 0; + tcsetattr(STDIN_FILENO, TCSAFLUSH, &tattr); +#endif +} +int osrdch() { + char c; + set_input_mode(); + c = getchar(); + reset_input_mode(); + if (c == EOF) c = 0; + return c; +} +void driveroswrch(char *c) { + oswrch(*c); +} +void oswrch(char c) { + prs("%c", c); +} +void driverinputline(char *buffer) { + scanf("%s\n", buffer); +} +void driverosrdch(char *c) { + *c = osrdch(); +} +void returntogem() { +// ifd graphics + killmultitasking(); + driver(settextdcode, NULL); +// endc // if graphics + prs("\n"); +// call_bdos p_term + exit(0); + +//---------- + +// ifnd graphics // only assembled if graphics has not been defined +// settext +// setgraphics +// driverclg +// driverchgcol +// line +// fill +// gintstart +// killmultitasking +// rts +// endc +} + +//--- + +// ifd graphics // only assembled if graphics has been defined + + +void settext() { + // clear top half of screen +// move.l screenpointer(pc),a0 +// move.w #$3bfe,d0 * length to clear +// ... + + // and kill the split screen, restore full screen scrolling etc. + // drivergraphicsmode = 0; +} diff --git a/l9dev/driver.h b/l9dev/driver.h new file mode 100644 index 0000000..9d00815 --- /dev/null +++ b/l9dev/driver.h @@ -0,0 +1,22 @@ +// Atari ST driver (minimal parts adapted for Linux) +// Copyright (C) 1986-1988 Level 9 Computing + +#include "common.h" + +// function declarations needed for forward references in driver.c +void randomnumber(); +void closedown(); +void killmultitasking(); +void resetginttask(); +void init1(); +bool init2(); +void init(); +void calcchecksum(struct _fcb *area); +void driverloadfile(struct _fcb *fcb); +void driversavefile(struct _fcb *fcb); +int osrdch(); +void driveroswrch(char *c); +void oswrch(char c); +void driverinputline(char *buffer); +void driverosrdch(char *c); +void settext(); diff --git a/l9dev/exit.txt b/l9dev/exit.txt new file mode 100644 index 0000000..492ebed --- /dev/null +++ b/l9dev/exit.txt @@ -0,0 +1,550 @@ +; Lancelot source, copyright (C) 1987 Level 9 Computing. +; +; EXIT.TXT, data for the game exits. The numeric values for the +; directions is as follows: +; +; 1 up=9 in=11 cross=13 climb=14 jump=15 +; 8 2 down=10 +; ! +; 7 --+-- 3 +; ! +; 6 5 <- note that 4&5 are reversed. You cannot change this. +; 4 +; +; Special notes for interface between static and synthesised rooms.. +; +; There must be an in/out connection between the static and the +; object number of the scenery object to which it connects. +; +; E.g If you have a location object "[480:^N castle]", then an exit +; from room 15: 1001 12 180 +; will set up an in/out connection to the room where object no. 180 +; is situated. This allows the exit table to be changed easily. + +;********* remember to take out the dummy end exits +;&******** when I've finished using COMP option 5 to run the game! + + +; +;Room number 1 +; room modifiers for forest in part1 +; +; CHANGE THESE IF YOU CHANGE THE SIZE OF THE GRID. +0000 1 4 ; North. ; = XMAX +0000 2 5 ; NE ; = N+1 +0000 3 1 ; E ; = always 1 +0000 4 252 ; SOUTH ; = 256-XMAX +0000 5 253 ; SE ; = SOUTH+1 +0000 6 251 ; SW ; = SOUTH-1 +0000 7 255 ; WEST ; = always 255 +1000 8 3 ; NW ; = North-1 +;Room number 2 +0000 1 2 ; North. ; = XMAX +0000 2 3 ; NE ; = N+1 +0000 3 1 ; E ; = always 1 +0000 4 254 ; SOUTH ; = 256-XMAX +0000 5 255 ; SE ; = SOUTH+1 +0000 6 252 ; SW ; = SOUTH-1 +0000 7 255 ; WEST ; = always 255 +1000 8 1 ; NW ; = North-1 +; Room number 3 +1000 0 0 ; no exit - must use lift. 1001 9 39 +; Room number 4 +1001 4 6 +; Room number 5 +0011 12 7 +1000 5 7 ; visible exit to se +; Room number 6 +1001 4 7 +; Room number 7 +0010 8 5 ; invisible exit to secret passage +0101 12 50 +1011 6 50 +; Room number 8 +0011 12 9 +1101 4 9 +; Room number 9 +0001 12 119 +1011 4 119 +; Room number 10 +0101 12 9 +1011 7 9 +; Room number 11 +1000 0 0 +; Room number 12 +0101 12 61 +1011 4 61 +; Room number 13 +0001 10 64 +1011 4 64 +; Room number 14 +0001 12 69 +0011 10 69 +1011 4 69 +; Room number 15 +1101 7 14 +; Room number 16 +0001 12 70 +1011 1 70 +; Room number 17 +1001 1 16 +; Room number 18 +0001 12 71 +1011 1 71 +; Room number 19 +0001 10 18 +1011 1 18 +; Room number 20 +1101 1 19 +; Room number 21 +1001 10 106 +; Room number 22 +1101 7 19 +; Room number 23 +0001 12 71 +1011 7 71 +; Room number 24 +0001 12 101 +1011 4 101 +; Room number 25 +0101 12 47 +1011 4 47 +; Room number 26 +0011 12 49 +1001 1 49 +; Room number 27 +0011 12 26 +1001 1 26 +; Room number 28 +0011 12 27 +1001 1 27 +; Room number 29 +1001 10 21 +; Room number 30 +1001 10 32 +; Room number 31 +1001 7 30 +; Room number 32 +1001 3 33 +; Room number 33 +1001 12 111 +; Room number 34 +1001 9 32 +; Room number 35 +1001 7 34 +; Room number 36 +0010 3 112 +0000 12 112 +1001 9 35 +; Room number 37 +1101 7 35 +; Room number 38 +1101 3 39 +; Room number 39 +1001 4 4 +; Room number 40 +1000 0 0 +; Room number 41 +1000 0 0 +; Room number 42 +1000 0 0 +; Room number 43 +1000 0 0 +; Room number 44 +1000 0 0 +; Room number 45 +1001 1 110 +; Room number 46 +1001 7 45 +; Room number 47 +1001 7 46 +; Room number 48 +1001 1 47 +; Room number 49 +1001 1 48 +; Room number 50 +1001 4 51 +; Room number 51 +1001 4 53 +; Room number 52 +1001 3 53 +; Room number 53 +1001 3 55 +; Room number 54 +0001 12 52 +1011 1 52 +; Room number 55 +1001 3 56 +; Room number 56 +1001 3 57 +; Room number 57 +1001 3 68 +; Room number 58 +0001 1 118 +1001 4 68 +; Room number 59 +0001 4 185 ; to camelot! 59 +1001 1 68 +; Room number 60 +1001 3 180 +; Room number 61 +1001 5 62 +; Room number 62 +0001 4 66 +1011 10 66 +; Room number 63 +0001 6 62 +1011 7 62 +; Room number 64 +1001 6 63 +; Room number 65 +1000 0 0 +; Room number 66 +0001 10 67 +1011 3 67 +; Room number 67 +1001 3 97 +; Room number 68 +1001 3 60 +; Room number 69 +0001 10 181 +1011 7 181 +; Room number 70 +1001 7 182 +; Room number 71 +1001 7 70 +; Room number 72 +0001 5 78 +0001 4 77 +1001 3 73 +; Room number 73 +0001 4 78 +1001 3 74 +; Room number 74 +0001 4 79 +1001 3 75 +; Room number 75 +0001 4 80 +1001 3 76 +; Room number 76 +1001 4 81 +; Room number 77 +0001 4 82 +1001 3 78 +; Room number 78 +0001 5 84 +0001 4 83 +1001 3 79 +; Room number 79 +0001 4 84 +1001 3 80 +; Room number 80 +0001 4 85 +1001 3 81 +; Room number 81 +1001 4 85 +; Room number 82 +0001 4 87 +1001 3 83 +; Room number 83 +0001 5 89 +1001 4 88 +; Room number 84 +1001 7 83 +; Room number 85 +1001 4 90 +; Room number 86 +0001 12 91 +1011 4 91 +; Room number 87 +0001 4 92 +1001 3 88 +; Room number 88 +0001 4 93 +0001 10 93 +0001 5 94 +1001 3 89 +; Room number 89 +1001 3 90 +; Room number 90 +1001 3 91 +; Room number 91 +1001 4 96 +; Room number 92 +1001 3 93 +; Room number 93 +0001 4 97 +1001 3 94 +; Room number 94 +1001 3 95 +; Room number 95 +1001 1 90 +; Room number 96 +1001 7 95 +; Room number 97 +1001 3 100 +; Room number 98 +1001 4 99 +; Room number 99 +1001 4 100 +; Room number 100 +1001 3 52 +; Room number 101 +1001 4 102 +; Room number 102 +1001 4 103 +; Room number 103 +1001 4 104 +; Room number 104 +1001 4 105 +; Room number 105 +1001 4 106 +; Room number 106 +1001 4 107 +; Room number 107 +1001 4 50 +; Room number 108 +1001 4 109 +; Room number 109 +1001 7 105 +; Room number 110 +1001 7 108 +; Room number 111 +1001 11 33 +; Room number 112 +1001 1 111 +; Room number 113 +1001 10 114 +; Room number 114 +1001 10 115 +; Room number 115 +1001 7 111 +; Room number 116 +1001 1 115 +; Room number 117 +1001 1 116 +; Room number 118 +1001 1 117 +; Room number 119 +1001 4 56 +; Room number 120 +1000 0 0 +; Room number 121 +1000 0 0 +; Room number 122 +1000 0 0 +; Room number 123 +1000 0 0 +; Room number 124 +1000 0 0 +; Room number 125 +1001 10 30 +; Room number 126 +1001 1 97 +; Room number 127 +0001 12 98 +1011 4 98 +; Room number 128 +1001 3 19 +; Room number 129 +1001 7 181 +; Room number 130 +0001 12 55 +1011 1 55 +; Room number 131 +1011 12 106 +; 132 +1000 0 0 +; 133 +1001 7 151 +; 134 +1001 12 173 +; 135 +1001 10 159 +; 136 +1001 9 161 +;137 +1000 0 0 +; 138 +1000 0 0 +; 139 +1000 0 0 +; 140 +1001 4 141 +; 141 +0011 4 143 +1001 10 143 +; 142 +1001 7 141 +; 143 +0001 12 169 +0011 10 169 +1011 4 169 +; 144 +0001 12 184 +1011 4 184 ; to mews object +; 145 +0001 12 171 +1011 4 171 +; 146 +0001 12 170 +1011 4 170 +; 147 +0011 12 172 +1101 4 172 +; 1001 1 151 +; 148 +1101 3 150 +; 149 +1101 7 150 +; 150 +1000 10 151 +; 151 +1001 4 147 +;0101 12 172 +;1011 4 172 +; 152 +1001 3 183 ; to west way object +; 153 +1001 1 172 +; 154 +1001 7 153 +; 155 +1101 1 187 ; to south way +; 156 +0001 10 178 +0011 14 178 +1011 12 178 +; 157 +1001 1 156 +; 158 +1001 3 159 +; 159 +1001 1 157 +; 160 +1011 12 161 +; 161 +0001 12 179 +0011 1 179 +1001 9 159 +; 162 +1000 0 0 +; 163 +1000 0 0 +; 164 +1001 3 165 +; 165 +1001 3 166 +; 166 +1001 3 167 +; 167 +1001 3 168 +; 168 +1001 3 152 +; 169 +1001 3 170 +; 170 +1001 3 171 +; 171 +1001 3 184 ; road +; 172 +1001 7 186 ; market square +; 173 +1001 7 172 +; 174 +1001 1 155 +; 175 +1001 1 174 +; 176 +1001 1 175 +; 177 +1001 1 176 +; 178 +1001 3 179 +; 179 +1001 1 177 +; 180 +1000 0 0 +; 181 +1000 0 0 +; 182 +1000 0 0 +; 183 +1000 0 0 +; 184 +1000 0 0 +; 185 +1000 0 0 +; 186 +1000 0 0 +; 187 +1000 0 0 +; 188 +1000 0 0 +; 189 +1000 0 0 +; 190 +1000 0 0 +; 191 +1000 0 0 +; 192 +1000 0 0 +; 193 +1000 0 0 +; 194 +1000 0 0 +; 195 +1000 0 0 +; 196 +1000 0 0 +; 197 +1000 0 0 +; 198 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 + +;207 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 + +;217 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 + +;227 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 +1000 0 0 + + +0000 0 0 diff --git a/l9dev/finish.c b/l9dev/finish.c new file mode 100644 index 0000000..06250df --- /dev/null +++ b/l9dev/finish.c @@ -0,0 +1,492 @@ +// finish program +// +// M.J.Austin started 5/8/86 +// last change: 3/11/86 +// +// started Linux version on Monday 8/12/25 +// first presentable version: 21/12/25 +// +// Copyright (C) 1986-1988 Level 9 Computing + +#include "finish.h" + +// for menu program to build up a list +// of possible games, from which the user chooses one +// this data is overwritten when the game is loaded + +char *ptr = NULL; // pointer to current pos in file +char *finishedptr = NULL; +void *endfinish = NULL; +char filenamelist[1000]; +char directorypathname[100]; // will contain the complete path name for use by climb +char subdirname[100]; +char directoryname[] = "*.l9"; +//--- +char finishdriverbuffer[40]; +struct _fcb loadexitsdriverblock = { + NULL, + NULL, + "exit.txt" +}; +struct _fcb loadtablesdriverblock = { + NULL, + NULL, + "table.dat" +}; +struct _fcb loadsquashdriverblock = { + NULL, + NULL, + "squash.dat" +}; +struct _fcb loadacodedriverblock = { + NULL, + NULL, + "acode.acd" +}; +struct _fcb savecompletedriverblock = { + NULL, + NULL, + "gamedata.dat" +}; +//--- +// and now some workspace +void *startsources = NULL; // where the exits, tables etc. are loaded +char *startcomplete = NULL; // start of complete.dat block in memory +int linenumber = 0; +int squashlength = 0; +// +char terminator = 0; +//--- +void finishstart() { + prs("%s", finish_version); + + // this program always produces a complete.dat + // file from the data on the disk + + // once-only init + endfinish = malloc(512 * 1024); + finishedptr = endfinish; + startsources = finishedptr; + finishedptr += 0x30008; // allow space for files to be loaded + startcomplete = finishedptr; // pointer to start of complete.dat block in memory + finishedptr += sizeofpointers; + + processexits(); + + processtables(); + + if (!splitdata) savedirectory(); // with split data no subdirs are used (1.5) + if (!splitdata) selectdirectory(); // subdirectory for computer-specific text + processsquash(); + if (!splitdata) climb(); // and back to root for acode + + processacode(); + + finishchecksum(); + + if (!splitdata) descend(); // with split data no subdirs are used (1.5) + prs("Saving gamedata.dat\n"); + + savecompletedriverblock.start = startcomplete; // start address to save + savecompletedriverblock.end = finishedptr; // end address to save + driver(savedcode, &savecompletedriverblock); + + if (!splitdata) climb(); // leave us back where we started + + returntogem(); +} +//--- +void softinit() { + // init for each stage of development + linenumber = 1; +} +//--- +void finisheven() { + // make ptr even and zero out skip byte + if ((ptr - startcomplete) & 1) *ptr++ = 0; +} +//--- +void processexits() { + softinit(); + prs("Loading exit.txt\n"); + + char c = eof; + int flags = 0; + int direction = 0; + int room = 0; + + char *exitptr = startcomplete + exitptroffset; + int offset = finishedptr - startcomplete; + *exitptr = offset & 0xff; // poke in rel. ptr to exits + *(exitptr + 1) = offset >> 8; + + loadexitsdriverblock.start = startsources; // start address + driver(loaddcode, &loadexitsdriverblock); + char *buf = (char *)loadexitsdriverblock.end; + if (!buf) buf = startsources; + buf[0] = eof; + buf[1] = lf; + buf[2] = eof; + + ptr = startsources; + while (c = *ptr++, c != cr && c != lf); + buf[1] = terminator = c; + ptr = startsources; // start of exit data + + do { + if (supersearch() == eof) { + // terminate exit table on eof (without explicit end of data marker) + *finishedptr++ = 0; + *finishedptr++ = 0; + break; + } + + // first get four binary digits + flags = getbin() << 3 | getbin() << 2 | getbin() << 1 | getbin(); + + // now get direction + direction = getdec(); + *finishedptr++ = direction | flags << 4; + + // finally get destination room + room = getdec(); + *finishedptr++ = room; + } while (flags | direction | room); // 0000 0 0 ? (=end of data) +} +//--- +int getdec() { + // return a decimal number + char c = search(); + if (c < '0' || c > '9') errorindata(); + return readdecimal(&ptr); +} +int getbin() { + // return a binary digit + char c = search(); + if (c != '0' && c != '1') errorindata(); + ptr++; + return c - '0'; +} +//--- +void processtables() { + prs("Loading table.dat\n"); + ptr = startsources; + loadtablesdriverblock.start = ptr; + driver(loaddcode, &loadtablesdriverblock); + if (*(char *)&loadtablesdriverblock) return; + + // set up pointers at start of complete.dat file + // at the start of the table.dat file are pointers (longs) + // to the tables. There are numtable of these + // and then a pointer to the end of the table file + // copy the table pointers + ptr += 0x1c; // skip reloc information + int ntables = 9 + 1; // number of tables + int tableptr = 0; + + // get start of tables relative to complete.dat + int starttables = finishedptr - startcomplete; + // ptr is start of table data (assembled by any assembler) + char *destptr = startcomplete + list1ptroffset; + destptr[-1] = 0; // zero out unused field + destptr[-2] = 0; // aka list0 + + do { + ptr += 2; // skip high word + tableptr = *(uint8_t *)ptr++ << 8; + tableptr |= *(uint8_t *)ptr++; + // tableptr is a table pointer + // is it a workspace reference ? (0x8000-0x9000) + if (tableptr < 0x8000 || tableptr >= 0x9000) { + // so convert it to make it point to the table data + // relative to the start of complete.dat + tableptr += starttables - (9 * 4 + 4); // 9 table pointers = 40 + } // between 8000 and 9000, so don't adjust + *destptr++ = tableptr & 0xff; + *destptr++ = tableptr >> 8; + } while (--ntables > 0); // number of tables to process + + // and copy data in to finished data area + int len = tableptr - starttables; + memcpy(startcomplete + starttables, ptr, len); + ptr += len; + finishedptr = startcomplete + tableptr; +} +//--- +void processsquash() { + // load in squash.dat at finishedptr + // and adjust all pointers + prs("Loading squash.dat\n"); + + // make finishedptr even and zero out skip byte + if ((finishedptr - startcomplete) & 1) *finishedptr++ = 0; + int offset = 0; + int val = 0; + + loadsquashdriverblock.start = finishedptr; + driver(loaddcode, &loadsquashdriverblock); + if (*(char *)&loadsquashdriverblock) return; + + ptr = finishedptr; + char *oldptr = ptr; + finishedptr = startcomplete; + + // offset to add to all squash pointers + offset = ptr - startcomplete; + val = z80load(); // length + squashlength = val; + z80write(val + offset); // startcomplete+0 + + val = z80load(); // message destriptor pointer + z80write(val + offset); + + val = z80load(); // length of descriptors + z80write(val); + + val = z80load(); // word dictionary pointer + z80write(val + offset); + + val = z80load(); // word dictionary length + z80write(val); + + val = z80load(); // word dictionary index table + int dict = val + offset; // preserve value + z80write(dict); + + val = z80load(); // number of segments + int segments = val; // preserve value + z80write(segments); + + val = z80load(); // common word dictionary + z80write(val + offset); + + z80load(); // version number - ignore + z80write(0); // zero out unused bytes explicitely + + z80load(); // not used - ignore + + // and adjust word dictionary pointers + // to make them relative to (startcomplete) + // offset is offset to add to pointer + // dict is offset of word dictionary pointer + // segments is number of segments + + // fist find end of index table + // clear high bits of dict + dict &= 0xffff; + + uint8_t *start = (uint8_t *)startcomplete + dict; + uint8_t *end = start + 4 * segments; + uint8_t *scan = start; + // start is start of table. end is end of table + // let scan be the offset used to scan the table + // offset is offset to add to pointers + while (scan < end) { + // calc address of index entry in val + val = scan[0] | scan[1] << 8; + val += offset; + scan[0] = val & 0xff; + scan[1] = val >> 8; + scan += 4; + } + ptr = oldptr + squashlength; + finishedptr = ptr; +} +//--- +int z80load() { + int val = 0; + val = *(uint8_t *)ptr++; + val |= *(uint8_t *)ptr++ << 8; + return val; +} +//--- +void z80write(int val) { + *finishedptr++ = val & 0xff; + *finishedptr++ = val >> 8; +} +//--- +void processacode() { + // load acode.acd at finishedptr + // and adjust all pointers + prs("Loading acode.acd\n"); + + ptr = finishedptr; + if (!oddacode) finisheven(); // make ptr even + + loadacodedriverblock.start = ptr; + driver(loaddcode, &loadacodedriverblock); + processacodeptr(); +} + +void processacodeptr() { + finishedptr = ptr; + // get length of acode + int acodelen = z80load(); + + // ptr = start of acode + // acodelen = length of acode + char *endcomplete = ptr + acodelen; // end of complete.dat file in memory + endcomplete++; // allow an extra byte for the checksum + finishedptr = endcomplete; + + int sizecomplete = endcomplete - startcomplete; // size of complete.dat file + sizecomplete--; // and another byte less for good measure + startcomplete[0] = sizecomplete & 0xff; + startcomplete[1] = sizecomplete >> 8; + + int acodeoffset = ptr - startcomplete; + startcomplete[40] = acodeoffset & 0xff; + startcomplete[41] = acodeoffset >> 8; + + // zero out unused bytes explicitly + startcomplete[42] = 0; + startcomplete[43] = 0; + // finishedptr is end of complete.dat file in memory +} +//--- +void finishchecksum() { + struct _fcb *fcb = (struct _fcb *)&finishdriverbuffer; + fcb->start = startcomplete; // start of block to checksum + fcb->end = finishedptr - 1; // disregard checksum byte at present + driver(checksumdcode, fcb); + + // address checksum done up to + // poke in checksum byte + *(uint8_t *)fcb->end = -*(uint8_t *)fcb; +} +//--- +void errorindata() { + prs("error in data at line "); + printdecimald0(linenumber); + prs(" \nPress a key to return to Gem\n"); + waitkey(); + returntogem(); +} +//--- +void ssskiptoeol() { + skiptoeol(); + supersearch(); // on new line as well! +} +void skiptoeol() { + if (*ptr == eof) return; + while (*ptr++ != terminator); + do { + linenumber++; + // skip control characters (including false eol) + uint8_t c = eof; + while (c = *ptr++, c < 32 && c != terminator && c != eof); + ptr--; + } while (*ptr++ == terminator); + ptr--; +} +int search() { + // search, skipping spaces + while (*ptr == ' ') ptr++; + return *ptr; +} +int supersearch() { + // search, skipping over comments if present + while (true) { + uint8_t c = search(); + if (c == eof) break; + if (c == '*' || c == ';' || c == terminator || c < 32) { + skiptoeol(); + } else break; + } + return *ptr; +} +//--- +// +// ++++++++++++++ Some ST specific code to scan +// for possible sub-directories +++++++++++++++++ +// look in current directory for interesting sub-directories - +// i.e. those which match with directoryname +void selectdirectory() { + if (splitdata) return; // with split data no subdirs are used (1.5) + int found = 0; // number of files found + int current = 0; + int selection = 0; + glob_t globbuf; + glob(directoryname, 0, NULL, &globbuf); + found = globbuf.gl_pathc; + while (current < found) { + prs(" "); + prs("%c .. %s\n", current + 'A', globbuf.gl_pathv[current]); + current++; + } + + if (!found) { + prs("No suitable files on disk\n"); + prs("Press a key to return to gem\n"); + waitkey(); + returntogem(); + return; + } else if (found == 1) { + prs("Only one sub-directory - proceeding with finish\n"); + } else { + prs("Enter the letter corresponding to your choice .. "); + char c; + do { + // now get a letter + driver(osrdchdcode, &finishdriverbuffer); + c = toupper(*finishdriverbuffer); + prs("%c\n", c); + selection = c - 'A'; + } while (selection < 0 || selection >= found); + } + strcpy(subdirname, globbuf.gl_pathv[selection]); + globfree(&globbuf); + chdir(subdirname); +} +//--- +void descend() { + // go back down to previously selected directory + if (splitdata) return; // with split data no subdirs are used (1.5) + chdir(subdirname); +} +//--- +void savedirectory() { + // save the current directory + // to be restored by climb + if (splitdata) return; // with split data no subdirs are used (1.5) + // getcwd(directorypathname, sizeof(directorypathname)); + strcpy(directorypathname, ".."); // should be ok on modern systems +} +//--- +void fileerror() { + prs("Can't get current directory name\n"); + prs("Press a key to return to gem\n"); + waitkey(); + returntogem(); +} +//--- +void climb() { + chdir(directorypathname); +} + +// For embedded compilation, define EMBEDFINISH +#ifndef EMBEDFINISH +bool oddacode = false; +bool splitdata = false; +void usage(char *progname) { + printf("Usage: %s [options]\n\n", progname); + printf("Options:\n"); + printf("--help: print this usage message\n"); + printf("--oddacode: do not align acode in gamedata.dat\n"); + printf("--splitdata: generate split acode and gamedata\n"); + printf("\n"); + exit(0); +} +int main(int argc, char **argv) { + int arg = 0; + while (++arg < argc) { + if (strcmp(argv[arg], "--help") == 0) usage(argv[0]); + if (strcmp(argv[arg], "--oddacode") == 0) { oddacode = true; continue; } + if (strcmp(argv[arg], "--splitdata") == 0) { splitdata = true; continue; }; + printf("Unrecognized argument: '%s'\n\n", argv[arg]); + usage(argv[0]); + } + finishstart(); + return 0; +} +#endif diff --git a/l9dev/finish.h b/l9dev/finish.h new file mode 100644 index 0000000..c2ca7ff --- /dev/null +++ b/l9dev/finish.h @@ -0,0 +1,49 @@ +// finish program (for Linux) +// +// Copyright (C) 1986-1988 Level 9 Computing + +#include "common.h" + +// constants +#define lengthpointeroffset 0 +#define mdptroffset 2 // message descriptor ptr +#define mdlengthoffset 4 +#define dictionaryptroffset 6 +#define dictionarylengthoffset 8 +#define indextableptroffset 10 +#define numbersegments 12 +#define numbercommonwordtable 14 +#define versionptroffset 16 +#define exitptroffset 18 +#define list1ptroffset 22 +#define list2ptroffset 24 +#define list9ptroffset 38 +#define acodeptroffset 40 +#define startofdataoffset 42 // first real data starts here + +// function declarations needed for forward references in finish.c +void finishstart(); +int getdec(); +int getbin(); +int z80load(); +void z80write(int val); +void processacode(); +void processacodeptr(); +void processexits(); +void processtables(); +void savedirectory(); +void selectdirectory(); +void processsquash(); +void climb(); +void processacodeptr(); +void finishchecksum(); +void descend(); +void errorindata(); +void ssskiptoeol(); +void skiptoeol(); +int search(); +int supersearch(); + +// defined in comp.c +extern bool oddacode; +extern bool splitdata; diff --git a/l9dev/l9asm2bin b/l9dev/l9asm2bin new file mode 100755 index 0000000..6d4da8c --- /dev/null +++ b/l9dev/l9asm2bin @@ -0,0 +1,37 @@ +#!/bin/bash + +usage() { + echo "Usage: $0 [options] " + echo + echo "Options:" + echo "--help: this usage message" + echo + exit 1 +} + +if ! type -P m68k-linux-gnu-as >/dev/null +then + echo "Please install binutils-m68k-linux-gnu ..." + echo "On Ubuntu Linux: sudo apt install binutils-m68k-linux-gnu" + echo "On Rocky Linux: sudo dnf install binutils-m68k-linux-gnu" + echo + usage +fi + +name="" +while [[ $# -gt 0 ]] +do + case $1 in + --help) usage ;; + --*) echo "Unrecognized option: $1"; usage ;; + *) name=$1 ;; + esac + shift +done +if [[ -z $name ]]; then usage; fi + +if [[ ! -f $name.s ]]; then echo "The file $name.s was not found."; exit 2; fi + +m68k-linux-gnu-as -M -o $name.o $name.s +m68k-linux-gnu-objcopy -O binary $name.o $name.bin +rm $name.o diff --git a/l9dev/l9bin2tos b/l9dev/l9bin2tos new file mode 100755 index 0000000..ab8f558 --- /dev/null +++ b/l9dev/l9bin2tos @@ -0,0 +1,45 @@ +#!/bin/bash + +usage() { + echo "Usage: $0 [options] " + echo + echo "Options:" + echo "--help: this usage message" + echo "--old: for strict binary compatibility with older games" + echo + exit 1 +} + +if ! type -P m68k-linux-gnu-as >/dev/null +then + echo "Please install binutils-m68k-linux-gnu ..." + echo "On Ubuntu Linux: sudo apt install binutils-m68k-linux-gnu" + echo "On Rocky Linux: sudo dnf install binutils-m68k-linux-gnu" + echo + usage +fi + +old="" +name="" +while [[ $# -gt 0 ]] +do + case $1 in + --help) usage ;; + --old) old=$1 ;; + --*) echo "Unrecognized option: $1"; usage ;; + *) name=$1 ;; + esac + shift +done +if [[ -z $name ]]; then usage; fi + +if [[ ! -f $name.bin ]]; then echo "The file $name.bin was not found."; exit 2; fi + +size=`stat -c "%s" $name.bin` +if [[ -n $old ]]; then rel='\xff\xff'; end='\x00'; pbt='\x00'; else rel='\x00\x00'; end='\x00\x00\x00\x00'; pbt='\x90'; fi +if ((size%2==1)); then pad=$pbt; ((size++)); else pad=''; fi +s0=`printf '\\\\x%02X' $(((size>>24)&0xff))` +s1=`printf '\\\\x%02X' $(((size>>16)&0xff))` +s2=`printf '\\\\x%02X' $(((size>>8)&0xff))` +s3=`printf '\\\\x%02X' $((size&0xff))` +(LANG=C echo -ne "\x60\x1A$s0$s1$s2$s3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$rel"; cat $name.bin; echo -ne "$pad$end") > $name.prg diff --git a/l9dev/l9comp b/l9dev/l9comp new file mode 100755 index 0000000000000000000000000000000000000000..469e70d08648183fd01d06bbd2b0c60d6935f1a4 GIT binary patch literal 81592 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 literal 0 HcmV?d00001 diff --git a/l9dev/l9finish b/l9dev/l9finish new file mode 100755 index 0000000000000000000000000000000000000000..f690ee92e510a98788ac69ea0498b7e70be2212a GIT binary patch literal 28384 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/dev/null +then + echo "Please install binutils-m68k-linux-gnu ..." + echo "On Ubuntu Linux: sudo apt install binutils-m68k-linux-gnu" + echo "On Rocky Linux: sudo dnf install binutils-m68k-linux-gnu" + echo + usage +fi + +old="" +bugcomp="" +oddacode="" +no_table="" +no_message="" +i8086="" +splitdata="" +while [[ $# -gt 0 ]] +do + case $1 in + --help) usage ;; + --old) old=$1 ;; + --bugcomp) bugcomp=$1 ;; + --oddacode) oddacode=$1 ;; + --no-table) no_table=$1 ;; + --no-message) no_message=$1 ;; + --i8086) i8086=$1 ;; + --splitdata) splitdata=$1 ;; + --*) echo "Unrecognized option: $1"; usage ;; + esac + shift +done + +path=`dirname $0` +if [[ -z $no_table ]]; then $path/l9tablegen $old; fi +if [[ -z $no_message ]]; then $path/l9squash; fi +$path/l9comp $bugcomp $oddacode $i8086 $splitdata diff --git a/l9dev/l9squash b/l9dev/l9squash new file mode 100755 index 0000000000000000000000000000000000000000..e9261cb4648dcf7cd85364d1c2e8b8f892b2b013 GIT binary patch literal 52440 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 P-{*C$Pl`ZF)%iaF2M?gv literal 0 HcmV?d00001 diff --git a/l9dev/l9tablegen b/l9dev/l9tablegen new file mode 100755 index 0000000..672833a --- /dev/null +++ b/l9dev/l9tablegen @@ -0,0 +1,63 @@ +#!/bin/bash + +usage() { + echo "Usage: $0 [options]" + echo + echo "Options:" + echo "--help: this usage message" + echo "--bin: use a binary table.bin as input iso table.txt" + echo "--old: for strict binary compatibility with older games" + echo "--i8086: for strict binary compatibility with older games" + echo + exit 1 +} + +if ! type -P m68k-linux-gnu-as >/dev/null +then + echo "Please install binutils-m68k-linux-gnu ..." + echo "On Ubuntu Linux: sudo apt install binutils-m68k-linux-gnu" + echo "On Rocky Linux: sudo dnf install binutils-m68k-linux-gnu" + echo + usage +fi + +bin="" +old="" +while [[ $# -gt 0 ]] +do + case $1 in + --help) usage ;; + --bin) bin=$1 ;; + --old) old=$1 ;; + esac + shift +done + +if [[ ! -f table.txt ]]; then echo "The file table.txt was not found."; exit 2; fi + +path=`dirname $0` +if [[ -z $bin ]] +then + # assembler does not support case insensitive names + cat table.txt | tr "[[:upper:]]" "[[:lower:]]" >table.s + # assembler does not support ORG directive + sed -i -e "s/^ org/;org/g" -e "/^ dc/s/, */,/g" table.s + # assembler wants to word-align every repeated instruction + exp="`echo -e ' rept\n dc.b 0\n endr'`" + act="`sed -ne '/rept/,/endr/{s/rept .*/rept/g;p}' table.s`" + if [[ -n "$act" && "$act" != "$exp" ]] + then + echo "Warning: unsupported rept statement." + else + # adjust observed case: start aligned and repeat "dc.b 0" + sed -i -e "s/^ rept \(.*\)/ rept (\1)\/2/g" table.s + sed -i -e "/^ endr/a\ even" table.s + fi + $path/l9asm2bin table 2>/dev/null + rm table.s +fi +$path/l9bin2tos table $old +if [[ -z $bin ]]; then rm table.bin; fi +mv table.prg table.dat +echo "Level 9 table.dat generation done." +echo diff --git a/l9dev/main.l9/gamedata.dat b/l9dev/main.l9/gamedata.dat new file mode 100644 index 0000000000000000000000000000000000000000..435ae2ba37b27f30235c1e89c7531fb9fbf89ee2 GIT binary patch literal 17381 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 literal 0 HcmV?d00001 diff --git a/l9dev/main.l9/message.txt b/l9dev/main.l9/message.txt new file mode 100644 index 0000000..a4023e6 --- /dev/null +++ b/l9dev/main.l9/message.txt @@ -0,0 +1,1861 @@ +; Knight Orc 1 Descriptions +; Copyright (C) 1987 Level 9 Computing +; +; The word type ^C is used when a word +; is not to be used as part of the normal parsing +; but is to be available for checking should it be needed +; This is so references to scenery may be checked for +; containing particular words. +; This word type replaces Proper Nouns in this game. +; +; +; Special ST notes: +; +; The vertical bar used to end the printable part +; of a message is found by shifting the backslash +; (next to the left hand shift key) + +; The ^ used for wordtypes is shift-6 +; +[1: ] +[2::] +[3:, ] +[4:.] ; dot with no space +[5:%] +[6:/and ] ; always starts with lower case a +[7:.%] +[8:?%] +[9:. ] +[10:exits lead ] +[11:an exit leads ] +[12: through a door] +[13: through an open door] +[14: and ] +[15:%We won't bother with "What now" from now on. ] +[16:%> ] ; replacement for 'What now' +[17:%What now? ] +[18:: ]; +[19:"] +; Messages for printing objects +; +[20:a ] +[21:the ] +[22:an ] +[23:some ] +; +[24:." ] +; +[101:^V north|^V n] +[102:^V northeast|^V ne] +[103:^V east|^V e] +[104:^V south|^V s] +[105:^V southeast|^V se] +[106:^V southwest|^V sw] +[107:^V west|^V w] +[108:^V northwest|^V nw] +[109:^V upwards|^V u ^V up] +[110:^V downwards|^V d ^V down] +[111:^V inside|^V in ^V into ^V enter] +[112:^V outside|^V o ^V out ^V leave] +[113:^V across|^V cross] +[114:with the ^V climb] +; as in 'you go by climbing and are in...' +[115:^V jump] +;; [116:^V plugh ^V xyzzy ^V sesame ^V plover ^V humakaat ^V satarh +;; ^V ollabin ^V obis] +; +; Intransitive verbs +; +[120:^V i] +[121:^V again ^V a] +[122:^V look|^V l] +[123:^V inventory ^V inv] +[124:^V quit ^V restart] +[125:^V restore ^V load] +[126:^V save] +[127:^V ramsave ^V ram] +[128:^V ramload] +[129:^V score] +[130:^V verbose] +[131:^V brief] +[132:^V wait|^V wa ^V pause ^V z] +;; [133:^V sleep ^V rest ^V dream] +[134:^V on] +[135:^V off] +[136:^V pictures ^V graphics] +[137:^V words ^V text] +[138:^V hello ^V welcome ^V hi] +[139:^V oops ^V undo] +[140:^V attack|^V hit ^V break] +;; [141:^V listen] +[142:^V search ^V explore] +[143:^V help ^V hint] +[144:^V sniff ^V smell] +[145:^V knock] +[146:^V stand] +[147:^V lie] +[148:^V sit] +[149:^V dig] +[150:^V say] ; used for output +;; [151:^V teleport] +;; [152:^V getme] +[153:^V think] +[154:^V run] +[155:^V yes ^V OK] +[156:^V no ^V n] +[157:^V board] +[158:^V go|^V goto ^V find ^V walk] +[159:^V stop] +[160:^V weather] +[161:^V treasure ^V money] +[162:^V exits] +[163:^V escape] +[164:^V want] +[165:^V what] +[166:^V why ^V y] +[167:^V where] +[168:^V how] +[169:^V whether] +; +; Rude words +[170:^V shit ^V cunt ^V jesus ^V christ ^V god ^V fucking +^V bugger ^V damn] ; leave in lower case to save space +; +; Table-driven commands +[171:^V intelligence] +[172:^V life] +[173:^V shout|^V yell] +[174:^V royalties] +[175:^V to] +[176:^V death] +[177:^V goodbye ^V bye] +[178:^V sorry] +[179:^V scream] +; +[180:^V have ] ; mainly for output +[181:^V has ] ; mainly for output +[182:^V am ] ; mainly for output +[183:^V are ] ; mainly for output +[184:^V is ] ; mainly for output +[185:^V phew] ; what a relief - prints 2411 +[186:^V dir ^V directory ^V catalog ^V cat] +;[187 is 'GO IN'] +;[188 is 'GO OUT'] +; 189 is 'wait for person' +; 190 is 'wait until time' +; 191 is 'wait for (length of time)' +; 192 is 'wait for single turn' +[193:^V fight ^V kill] +[194:^V time] +[195:^V dodge] +; 196 and 197 have text for debugging output only - do not mark +;; [196:gdgo] ; 196 - gdgo +;; [197:gdrun] ; 197 - gdrun +;; [198:^V obscure] +[199:^V buy] +; +; Transitive verbs +; +[200:^V examine|^V read] +[201:^V cut|^V chop] +;; [202:^V wake ^V rouse] +;; [203:^V cast] +[204:^V get] +[205:^V take|^V carry ^V steal] +[206:^V wear] +[207:^V drop] +[208:^V put|^V hide] +[209:^V remove] +[210:^V throw] +[211:^V give|^V offer] +[212:^V ask|^V question] +[213:^V follow|^V chase] +[214:^V open|^V unlock] +[215:^V light|^V burn] +[216:^V extinguish] +[217:^V push|^V press ^V touch] +[218:^V pull] +[219:^V fasten|^V tie] +[220:^V unfasten|^V untie] +;; [221:^V ring] +;; [222:^V fill] +[223:^V eat] +[224:^V rub|^V wave] +[225:^V bury] +[226:^V insert] +[227:^V pick|^V pluck] +;; [228:^V squeeze|^V squash ^V crush] +;; [229:^V dress] +[230:^V drink] +;; [231:^V play|^V blow] +;; [232:^V collect] ; goal-directed +;; [234:^V become] +[235:^V mount|^V ride] + +; 236 - 239 have text for debugging only +;; 236 is return object to initial position (for npcs) +;; 237 is take gold to pub +;; 238 is set up find +;; 239 is gdfind +; +[240:close|^V shut] +;; [241:^V breathe] +[242:^V tell] +;; [243:^V swim] +[244:struggle] ; output only +; +; now verbs specific to this game +; armed combat blows... +[270:^V scratch] +[271:^V pink] +[272:^V jab] +[273:^V stab] +[274:^V hack] +[275:^V batter] +[276:^V smite] +[277:^V cleave] +[278:^V pulverise] +[279:^V devastate] +; unarmed combat blows... +[280:^V slap] +[281:^V claw] +[282:^V bite] +[283:^V hit] ; must remain as hit, as it is used for output in THROW +[284:^V thump] +[285:^V belabour] +[286:^V crush] +[287:^V mangle] +[288:^V pulverise] +[289:^V demolish] +; +; Objects (300+N) +; +[301:you|^N player ^N me ^N myself ^N orc] ; do not mark "you" +[302:the ^N hunter] +[303:the ^N knight in ^A white ^N satin] +[304:^N Synonym the ^N wizard] ; adventurer +[305:^N Kris the ^N ant-warrior] ; adventurer +[306:^N Odin] ; adventurer +[307:the ^N prophet] ; adventurer +[308:the ^N gripper] ; adventurer +[309:the ^N innkeeper|^N bartender ^N barkeeper] +[310:^N Fungus the ^N boggit-man] ; adventurer +[311:^N Rapunzel] +[312:the ^N hermit] +[313:the ^A green ^N knight] +[314:a ^N knight in ^A shining ^N armour] +[315:the ^N valkyrie] +[316:Little ^N John] ; adventurer +[317:^N Denzyl] ; adventurer +[318:the ^N Phantom of the ^N Opera] ; adventurer +[319:the ^N Uruk] ; adventurer +[320:^A Mighty ^N Flynn] ; adventurer +[321:^N Genghis] ; adventurer +[322:^N Attila] ; adventurer +[323:^N Muscleman] ; adventurer +[324:the ^N Annihilator] ; adventurer +[325:^N Pope ^N Joan] ; adventurer +[326:^N Boadicea] ; adventurer +[327:^N Jeanie ^N II] ; adventurer +[328:^N Mrs ^N Wallop] ; adventurer +[329:^N Susan] ; adventurer +; +; now npcs who can't talk... +; +[330:^N goat] +[331:^A barrow ^N wight] +[332:^N wolf] +[333:^A swift ^N horse] ; orc hunter's horse +[334:^A green ^N horse] ; green knight's horse +[335:^N horse] ; user's horse at start +[336:the ^A huge ^N knight] +; NPCs end at 39 +; +; weapons... +; +[340:^N rapier] +[341:^N dagger] +[342:^N poignard] +[343:^A putty ^N knife] +[344:^A war ^N axe] +[345:^N lance] +[346:^N spear] ; used to throw through ring +; +; treasure (about 20)... +; first those which are scattered at random... +[350:gold ^N crest] +[351:gold ^N finch] +[352:gold ^N finger] +[353:gold ^N heart] +[354:gold ^N nugget] +[355:gold ^N plate] +[356:gold ^N shoulder] +[357:golden ^N ball] +[358:golden ^N fleece] +[359:golden ^N disk] +[360:golden ^N rod] +[361:golden ^N ruler] +; and the following bits which have definite starting positions... +[365:gold ^N brick] +[366:gold ^N comb] +[367:gold ^N ghost] +[368:gold ^N leaf] +[369:gold ^N standard] +[370:gold ^N sovereign] +[371:golden ^N apple] ; please leave as an apple! +; +; pieces of the rope... +[378:^N rope] ; ties you on the horse at the start +[379:^N coil of ^N rope] ; what you assemble from the pieces below.. +[380:^N piece of ^A plaitted ^N hair|^N rope] +[381:^A hessian ^N hawser|^N rope] +[382:^N lassoo|^N rope] +[383:^N belt|^N rope] +[384:^N reins|^N rope] +[385:^N noose|^N rope] +[386:^N halyard|^N rope] +[387:^N cord|^N rope] ; holds chest lid half-open +[388:^A washing ^N line|^N rope] +[389:^N tether|^N rope] +; +; clothes... +[390:^A hooded ^N cloak] +[391:^A saffron ^N robes] ; what the hermit wears +;; [392:^A green ^N suit] +; +; now some ordinary objects... +[400:^N cask] +; +[402:^N glass of ^N beer|^V pint ^V lager] +[403:^N empty ^N glass] +[404:^N bucket] +[405:^A welcome ^N mat] +[406:^N note] ; on drawbridge +[407:^A great ^N chest|^N lid] +;; [408:^N flag] +[409:^N key] +[410:^N head] ; horse's head! +; +; some static objects (150 onwards)... +[450:^N bar] ; in pub +[451:^N bar] ; in pub +[452:^N drawbridge] +[453:^A ominous ^A white ^N doorway] +[454:^A hardwood ^N roller] +[455:^N pile of ^N garbage|^A rubbish ^N heap] +[456:^A trophy ^N cabinet] +[457:^N flagpole|^N pole] +[458:^N signposts|^N posts] ; used in "you can see some (458)" +; +; some invisible objects... +[470:^N eyes|^N eye] +[471:Rapunzel's ^N hair hanging down from above] +[472:^N ring] ; through the orc's nose +[473:^N ivy climbing up the castle] ; mark nothing except IVY +[474:^A thorn ^N hedge|^N thorns] +[475:^A garbage ^N heap|^N rubbish ^N pile] +[476:^N head] ; orc's head +; +; Location objects... +; (These are used for seeing from a distance, +; and for input (for examine and for 'go castle') +; (note that 'go scenery' also works, so the only unique +; functions of these objects is for remote viewing, +; and for examine) +; +; 479+N +[480:^N gibbet] +[481:^N castle] +[482:^N clearing] +[483:^N crossroads] +[484:^N fairground|^N dismal] +[485:^A forest ^N lawn] +[486:^N cave] +[487:^A royal ^N oak] +[488:^N tower] +[489:^N viaduct] +[490:^N well] +[491:^N gate] +; +; collective nouns... +[534:^N everything ^N all ^N every] +[535:^N treasure] ; collective noun +[536:^N weapons] ; collective noun +[537:^N people ^N everyone ^N everybody] ; collective noun +[538:^N clothes] +; +; (more) omni-present objects: +[539:the ^N door] ; normal door - never described by printobject, +; so we can put in the article for the benefit of DESCRIBEACTIONACTOR +[540:^N vodka ^N whisky] ; drinks pub doesn't sell +[541:^N water] +[542:^N be] +[543:^N ground|^N floor] +[544:^N wall|^N walls] +[545:^N sky|^N sun] +[546:^N beer] +; and finally some miscellaneous nouns which are used +; for various purposes. +[547:^N except ^N but] +[548:^N it|^N that ^N them ^N him ^N her] +[549:^N minute|^N minutes] +; +[551:^J then ^J next] +[552:^J therefore ^J so] +[553:^N you ^N yourself] +; +; Pronouns... +[560:it] ; ita +[561:it] ; itan +[562:some] +[563:he] +[564:she] +[565:they] +[566:you] +; +[570:it] ; ita +[571:it] ; itan +[572:them] +[573:him] +[574:her] +[575:them] +[576:you] +; +; and some misc output messages +; plural endings and other odd verb declension... +[579:~] ; cause previous word to be printed +[580:s] +[581:es] +[582:is] ; used in examine +[583:buries] +; +; and directions for output +; in the form 'The orc enters from the outside' +; (as opposed to 'The orc goes out' - the normal verb table) +; Note that these are reversed so the offset into +; the table is the direction of the moving npc, not the observer +; +[585:from the south] ; north +[586:from the southwest] ; northeast +[587:from the west] ; east +[588:from the north] ; south +[589:from the northwest] ; southeast +[590:from the northeast] ; southwest +[591:from the east] ; west +[592:from the southeast] ; northwest +[593:from below] ; above +[594:from above] ; below +[595:from outside] ; inside +[596:from inside] ; outside +[597:from across the way]; across +[598:by climbing] ; climb +[599:with a jump] ; jump +; +; Examine messages (600+N). NO full stops at end please. +; +[601:an orc] +[602:dressed in hunting pink] ; the hunter +[603:like a frozen elf] ; knight in white +[604:a splendid figure] ; Synonym the Wizard +[605:a muscle-bound champion] ; Kris the Ant Warrior +[606:a one-eyed being of great power] ; Odin +[607:an unusual human] ; Prophet +[608:a rat-like youth] ; the Gripper +[609:dressed in garish clothes] ; the Innkeeper +[610:twitchy-fingered] ; Fungus, boggit-man +[611:a young woman with long, silky hair] ; Rapunzel +[612:sitting in lotus position] ; the Hermit +[613:a handsome, parfait knight] ; Green Knight +[614:a canned fool] ; Knight in shining armour +[615:a winged Amazon] ; Valkyrie +[616:a trollish oaf] ; Little John +[617:stupid] ; Denzyl +[618:a pointy-headed greaseball] ; Phantom of the Opera +[619:a trollish creature of great pungency] ; Uruk +[620:an tree-like man] ; Flynn +[621:a fur-clad warrior] ; Genghis +[622:a barbarian warrior] ; Attila +[623:like a Butcher's shop on two legs] ; Muscleman +[624:a golem-like figure] ; the Annihilator +[625:an impressive woman] ; Pope Joan +[626:a killer queen] ; Boadicea +[627:clad in hareem silks] ; Jeanie II +[628:the toughest woman ever seen] ; Mrs Wallop +[629:confused] ; Susan +; +[630:an obnoxious brute] ; goat +[631:very handsome] ; barrow wight +[632:a shaggy brute with sharp teeth] ; wolf +[633:an expensive nag] ; orc hunter's horse +[634:unbearably smug] ; green knight's horse +[635:like a flatulent barrel.] ; your horse +[636:encased in steel armour] ; huge knight + ; +[640:a fine weapon] ; rapier +[641:a long knife] ; dagger +[642:a funny-looking knife. It's quite sharp] ; poignard +[643:rusty and blunt] ; knife +[644:a lethal looking weapon] ; axe +[645:a sharpened fence-post]; spear +[646:a dirty great needle] ; spear +; +[650:a treasure] ; gold crest +[651:an ugly statue] ; gold finch +[652:a bit of vandalized statue] ; gold finger +[653:a treasure] ; gold heart +[654:gold dragon dung] ; gold nugget +[655:what pansy humans use] ; gold plate +[656:another treasure] ; gold shoulder +[657:part of some long-destroyed statue] ; golden ball +[658:metal wool] ; golden fleece +[659:valuable] ; golden disk +[660:a golden pole] ; golden rod +[661:covered with markings] ; golden ruler +; and the following bits which have definite starting positions... +[665:good and heavy] ; gold brick +[666:not much good] ; gold comb +[667:a flimsy little thing] ; gold ghost +[668:probably for making gold compost] ; gold leaf +[669:a silly little model flag] ; gold standard +[670:a thick little coin] ; gold sovereign +[671:the opposite of delicious] ; golden apple +; +; pieces of the rope... +[678:looped under the horse to hold you on] ; rope - tying you on horse +[679:tied together from several parts] ; what you assemble from... +[680:a strong pig-tail] ; hair +[681:green-slimed hessian] ; hessian rope +[682:hemp rope] ; lassoo +[683:strong cloth] ; belt +[684:decorated leather] ; reins +[685:a hempen rope] ; noose +[686:a silken cord] ; halyard for flag +[687:a tie-string] ; holds chest lid to 120 degrees when open +[688:smooth hemp] ; washing line +[689:tattered and chewed] ; tether +; +; clothes... +[690:a deep-shadowed cape] ; hooded cloak +[691:neat and simple] ; what the hermit wears +; +; now some ordinary objects... +[700:a rusty barrel of "lager beer". Others have a better name +for it] ; cask +; +[702:the best beer, made from potatoes etc] ; glass of beer +[703:not as good as a Hobbit-skull mug] ; empty glass +[704:perished leather] ; bucket +[705:decorated with: %"Welcome to the Orc's Head Inn. +No orcs allowed"] ; welcome mat +[706:printed with "Knock very carefully" in many languages, including +cartoons for Yellow Eye Readers] ; note +[707:iron-bound] ; great chest +; +[709:an old friend] ; key +[710:messily severed at the neck] +; +; some static objects (150 onwards)... +[750:horribly clean] ; bar in pub +[751:reeking of greasy polish] ; bar in pub +[752:a moving bridge] ; drawbridge +[753:a draughty archway] ; white door +[754:a kind of reel] ; well roller +[755:a delicious pile of fish-heads, brown cabbage and +furry bread] ; pile of garbage +[756:a stupid cupboard] ; trophy cabinet +[757:an ugly white post] ; flagpole +[758:two signposts, set at opposite corners of the crossroads.] ; signposts +; +; some invisible objects... +[770:deep, bloodshot and slightly crossed] ; eyes +[771:smooth, silky and golden. Yeuch] ; Rapunzel's hair +[772:a great iron hoop, far above, fixed through the orc statue's +nose which overhangs the gap in the broken viaduct] ; ring +[773:growing up the stone wall of the castle] ; ivy +[774:a sword's-length wide. Its thorns are long, sharp and inedible, +so there is no way through] ; thorn hedge +[775:enough to feed an army of orcs] ; garbage heap +[776:a huge orc's head carved out of the rock on the far side of +the broken viaduct. Its mouth leads to the orc lair, where you want +to be] ; head +; +[780:a homely construction, used for executions] +[781:a carbuncular castle designed by mad dwarfs. Ivy now hides the +vile stone walls] +[782:an open area of rabbit-mown grass] +[783:the junction of hard east-west and north-south roads] +[784:a trampled field with fair pavilions] +[785:a horrid field, sometimes used for bowling] +[786:horribly clean and dry. The air is polluted by the stink of +dried flowers and there are no worms to eat] +[787:a dirty great hollow tree] +[788:a vertical spire of burnt rock] +[789:the bridge back to your base in Orc Mountain. Unfortunately, +some overzealous idiot has smashed a wide gap in the middle] +[790:a deep hole] +[791:a magnificent glowing portal] +; +;------------------------------- +; +; if you change any of the tree types, must change code +; in .DRSYNTHESISED which chooses 'a' or 'an' +[901:^N alder|^N trees] +[902:^N beech|^N trees] +[903:^N blackthorn|^N trees] +[904:^N cedar|^N trees] +[905:^N elder|^N trees] +[906:^N elm|^N trees] +[907:^N hawthorn|^N trees] +[908:^N hazel|^N trees] +[909:^N holly|^N trees] +[910:^N hornbeam|^N trees] +[911:^N juniper|^N trees] +[912:^N larch|^N trees] +[913:^N oak|^N trees] +[914:^N pine|^N trees] +[915:^N rowan|^N trees] +[916:^N whitebeam|^N trees] +; +[920:^N clump] +[921:^N coppice] +[922:^N deadwood] +[923:^N edgewood] +[924:^N forest] +[925:^N ghostwood] +[926:^N glade] +[927:^N grove] +[928:^N heartwood] +[929:^N scrubland] +[930:^N spinney] +[931:^N tangle] +[932:^N thicket] +[933:^N underbrush] +[934:^N wildwood] +[935:^N woodland] +; +; examine messages for trees.. +[941:Alnus Glutinosa, the common black alder.The wood is used +for swamp poles and Elvish Cuckoo Clocks] + +[942:Fagus Sylvatica, the common beech. In times past, many +trees were grotesquely pollarded for firewood, their mutilated +stumps rotting into ghost-shapes, but this skill has been lost] + +[943:blackthorn, Prunus Spinosa, a very aggressive little tree, +armed with evil black thorns] + +[944:Cedrus Libani, the cedar, which lives a long time +unless something is done about it] + +[945:the elder, an ugly weed which lives wherever there is +rubbish] + +[946:Ulmus Procera, the elm, a big fuzzy-looking tree used +for coffins] + +[947:Crataegus Monogyna, the hawthorn. Its red berries +attract a lot of edible vermin] + +[948:Corylus Avellana, the Common Hazel from the east +hemisquare of Middle Earth] + +[949:holly, Ilex Aquifolium, a spiky evergreen tree from +middle Middle Earth. Its main use is in producing bird lime] + +[950:hornbeam, Carpinus Betulus, a birch-like tree from +left-of-centre Middle Earth. The dirty white timber burns well +and is very hard and tough; well suited for slave-yokes, +treadmills and butchers' blocks] + +[951:Juniper Communis, the left-wing Juniper] + +[952:Larix Laricina, the West Middle Earth larch, which clogs +up good marsh land all over the place] + +[953:oak, Quercus robur, a big beggar] + +[954:a marvelously attractive tree, almost as nice as the Leylandii +Cyprus] + +[955:rowan, Sorbus Aucuparia, a silly little tree. The main thing +to remember about rowan is to only park a cart below one in Autumn +if the owner is smaller than you] + +[956:whitebeam, Sorbus Aria, which infests middle Middle Earth] +; +[960:a tight cluster of trees] ; clump +[961:a small wood of young trees] ; coppice +[962:a fine region of dying trees] ; deadwoods +[963:an area of small trees] ; edgewoods +[964:a large tract of trees] ; forest +[965:a gloomy place] ; ghostwood +[966:an open space] ; glade +[967:a small tract of woodland] ; grove +[968:a dense maze of close-packed trees] ; heartwood +[969:a mess of brushwood and stunted trees] ; scrubland +[970:a small wood] ; spinney +[971:just a confused mass of twisty trees] ; tangle +[972:a tangle of shrubs and trees] ; thicket +[973:a region of clinging plants beneath the trees] ; underbrush +[974:a chaotic remnant of primal forest] ; wildwood +[975:an ordinary bit of forest] ; woodland +; +; Short-Form room Descriptions (1000+N). NO full stops at end please. +; +; in Knight Orc, these are the brief descriptions when +; in the same location. +; e.g. 'You are <1010> in an alder forest' +; +; room 1 is used as exit modifier for synthesised rooms +; +; rooms 2..20 are those with static connections - +; i.e. not on the synthesised grid of forest locations + +[1002:in a ^N cobbled ^N castle ^N courtyard] + +[1003:in the single, large ^N entrance ^N hall at the ^N base of +the ^N keep] + +[1004:on the ^N dangerously ^N rounded ^N steps of a ^N narrow +stone ^N staircase] + +[1005:on a ^N lead ^N rooftop. From this ^N high ^N lookout, +there is a ^N dizzying ^N view across the whole forest|^N ivy] + +[1006:in the ^N hermit's ^N horrid little ^N cave] + +[1007:inside the ^N rotten ^N trunk of the ^N royal oak] + +[1008:in the ^N public ^N bar of the ^N Orc's Head ^N Inn|^N pub ^N head] + +[1009:in the "^N Headhunters" ^N saloon ^N bar of the +^N Orc's Head ^N Inn|^N head] + +[1010:in a ^N damp ^N cellar] + +[1011:in the ^N market ^N field] + +[1012:on the ^N fairground] + +[1013:in a ^N dingy ^N stable] + +[1014:on a ^N jousting ^N field] + +[1015:on a ^N trampled ^N field] + +[1016:in the ^N grandstand: a ^N long ^N tent] + +[1018:standing on the ^N viaduct, just north of a ^A huge ^N gap +where the ^N southern ^N end of the ^N viaduct has been washed +away. To the south, across the ^N chasm, is a ^A huge ^N orc's +^N head, carved from the ^N rock. Its ^N nose seems to have been +damaged, but enough remains to hold a large metal ring] + +[1019:at the ^N bottom of the ^N well] + +[1020:standing on the ^N drawbridge] + +[1021:at the east ^N end of a forest ^N road] + +[1022:at the northern ^N end of a forest ^N road] + +[1023:at the west ^N end of a forest ^N road] + +[1025:at the ^N base of the ^N tower] + +[1026:in a ^N vast ^N hall of ^N bright ^N cloud] ; lab in Paradise + +[1029:in a huge pile of garbage] ; invisible object here I think +; +; long descriptions of location objects (do not mark)... +; +[1200:beside a gibbet] +[1201:outside an ugly castle] +[1202:in a clearing] +[1203:at a crossroads] +[1204:on a dismal fairground] +[1205:on a forest lawn] +[1206:outside a cave] +[1207:beside the royal oak] +[1208:a little way south of a tower, separated from it by a thorn +hedge] +[1209:just north of a broken viaduct] +[1210:beside a quaint little well] +[1211:beside Paradise Gate] +; +; Now long additions to location descriptions (1300+n) +; these are printed immediately after the short description +; without any intervening punctuation (you may start this message +; with either punctuation or just text) +; +[1302:, surrounded by ^N untidy ^N ranks of ^N wooden ^N sheds which +sprawl crookedly against the ^N outer stone ^N walls] + +;; [1303:. Its soft ^N mudrock ^N floor has been polished smooth +;; by use and the route from the ^N entrance door to the back +;; of the ^N hall has ^N worn into a ^N ditch. The ^N rounded ^N treads of +;; a ^N spiral ^N staircase emerge from the end of this ^N furrow +;; and coil upwards into the wall] + +[1304:, within the keep wall] + +;; [1305: though you can't quite make out the orc lair beyond the +;; viaduct] + +;; [1306:, decorated with ^N cartoons and ^N Christmas ^N cracker ^N mottos] + +;; [1307:, in a wide ^N chamber lined with ^N leaves and ^N cobwebs. +;; Just enough light seeps in from outside for you to be +;; able to see the ridged and knotted ^N wood all around] + +;; [1308:, squashed between serried ranks of ^N shove-halfpenny +;; ^N games and the ^N lacquered ^N bar ^N top with its ^N sticky +;; ^N puddles and ^N rows of ^N imitation ^N kegs. Magic +;; ^N wall-trumpets whine with Hobbit and Westron music and the +;; mood is one of gloom and depression. It all makes you quite homesick] + +;; [1309:, wading through the ^N thick ^N carpet. This +;; ^N high-class room is furnished with ^N luxurious ^N orc-skin +;; ^N armchairs and decorated with ^N paintings of ^N famous +;; ^N sportsmen and their ^N trophies] + +;; [1310:, reeking pleasantly of stale ale] + +;; [1311:. The ground has been churned into a ^N sea of ^N mud, +;; upon which the ^N bright ^N wood and ^N canvas ^N market ^N stalls +;; float like ^N trapped ^N butterflies] + +;; [1312:, a ^N shabby ^N collection of ^N damp ^N tents and +;; ^N muddy ^N signboards] + +[1313:, a ^N temporary ^N building with ^N canvas ^N walls and +^N lots of ^N straw] + +[1314:; an ^N acre of ^N firm ^N meadow, ^N divided by a ^N fence which +^N guides and ^N separates the ^N contestants. The ^N grass is surrounded +by ^N garish ^N pavilions and a ^N tented ^N grandstand, big enough for +hundreds of people to watch the fight] + +[1315:, pock-marked by the feet of humans and their horses] + +[1316: with one side missing, containing raised +^N wooden ^N benches for the spectators] + +[1318: over the ^N gap in the ^N viaduct] + +;; [1319:, standing ankle-deep in ^N mud] + +[1320: which leads into the ^N castle] + +;; [1321: which winds, narrows and fades away into the trees] + +;; [1322:, where it ends abruptly] + +;; [1323: to nowhere] + +;; [1324: through the ^N claustrophobic ^N undergrowth] + +[1325: where Rapunzel lives. It is a ^N peculiarly ^N spiky ^N building +with no way in] + +[1326:, lit from above by ^N painful ^N beams of ^N white ^N light. Sickly +^N perfume oozes from some hidden vent and ^N tinkly ^N music jars the +nerves] + +;; [1327: of ^N pink ^N mist, billowing about like a ^N salamander trapped +;; in a ^N thunderstorm (but without the noise)] + +;; [1328:] + +[1329:, with the other rubbish thrown away after the tournament] +; +; Message pairs for use in describing containment positions +; also used for preposition table +; +; part printed before container +; +[1600:can see] ; 0 - you can see +[1601:^P on |^P onto] ; 1 - on +[1602:^P underneath|^P below ^P under] ; 2 - under +[1603:^P behind] ; 3 - behind +[1604:] ; 4 - carrying +[1605:] ; 5 - wearing +[1606:|^P at] ; 6 - (person) is riding (horse) +[1607:^P inside|^P into ^P in] ; 7 - in +[1608:hanging from] ; 8 +[1609:] ; 9 - tied up with +[1610:^P between] ; tied between is tied a rope +;; [1611:] ; 11 - for ring of knucklebone +[1612:lying on] ; 12 +[1613:sitting on] ; 13 +[1614:fastened to] ; 14 +[1615:tied to] ; 15 +; 15 tied to (the chest) and holding the lid open is (a strap) +[1616:^P with|^P using] +[1617:^P from] +; +; part printed between container and contained. +; +[1640:] ; 0 +[1641:is] ; 1 - on +[1642:is] ; 2 - under +[1643:is] ; 3 - behind +[1644:is carrying] ; 4 +[1645:is wearing] ; 5 +[1646:is riding] ; 6 - is riding +[1647:is] ; 7 - in +[1648:is] ; 8 +[1649:is tied up with] ; 9 - ; tied up with - mainly for goat +[1650:is tied] ; 10 - +[1651:] ; 11 - from +[1652:] ; 12 +[1653:] ; 13 +[1654:is] ; 14 - fastened to +[1655:and holding the lid open is] ; 15 tied to the (chest) is a (strap) +; +; 1700: is base for prepositions to use with 'you' +; +; 1700+N is part printed before 'you' +;; [1714:tied up with] +[1715:tied to] +; +; 1740+N is part printed between you and object(s) +[1741:are on] ; 1 - on +; 1742 is 2 ; +; 1743 is 3 ; +[1744:own] ; 4 - own +[1745:are wearing] ; 5 +[1746:are riding] ; 6 +[1747:are in] ; 7 +[1752:are lying on] ; 12 +[1753:are sitting on] ; 13 +[1754:are tied up with] ; 14 +[1755:is] ; tied to you is 15 +; +; +[1800:^P off] +[1801:^P up] +[1802:^P down] +[1803:^P to] +[1804:^P out] +[1805:^P from the ] ; used for npc motion +[1806:^P for] +[1807:^P until] +[1808:^P debug] +[1809:^P through] +[1810:^P about] +; +; Parser messages +; +[2000:you don't need to use "] ; paired with 2001 +[2001:" in this part of the game. ] +; +[2003:I don't understand "] +[2004:" when used like that. ] +; +[2006:you are ] +[2007:in a ] ; as in 'You are in an alder forest' +[2008:in an ] +[2009:exits lead in all directions] +; +; general error message when parsing has broken down. +[2010:I don't understand. ] +[2011:you can't see] +[2012:you don't have] +[2013:you already have] +[2014:(please stop blathering and get on with the game). ] +[2015:it's too far away. ] ; examine, take etc. scenery objects +[2016:I can't find a verb in that sentence! ] +[2017:it's not there. ] +[2018:there were too many nouns in that sentence! ] +[2019:that's too heavy] +; +[2020:don't be silly] ; group.. +;; [2021:strange concept] +;; [2022:what a peculiar idea] +; +; group for things which people may +; try which might work, but don't +[2023:nice try] ; group... +;; [2024:a valiant attempt] +;; [2025:nice try] +; +[2030:that's scenery. ] ; that's just scenery group... +;; [2031:I suggest that you forget it. ] +;; [2032:that's probably not important. ] +; +; now must supply an object group +[2033:please say more. ] ; group... +;; [2034:what? I couldn't find an object in that. ] +;; [2035:could you elaborate? ] + +[2036:absolutely nothing happens. ] +; ^ verb in keyword table but not in CALLVERB routine +[2037:there doesn't seem to be anything suitable. ] +; +[2039:what a mouthful! ] +; +[2044:you can't ] +[2045:that. ] +[2046:that] +[2047:here] +[2048:I can't find ] +; +; again used following a command referring to scenery +[2050:you can't repeat that. ] +;; [2051:you can't repeat that. ] +;; [2052:it wouldn't help to try that again. ] +; +[2053:it's not clear to what ] +[2054: is referring. ] +; +[2055:(removing] ; E.g '(Removing the bat from the cage first).' +[2056:from the] ; to avoid containers inside themselves. +[2057:first). ] +; +; error messages for NPC's +[2060:talking to yourself again?] +[2061:you can't talk to several people at once. ] +; +[2062:stops, looking confused] ; group... +;; [2063:looks puzzled] +;; [2064:seems uncertain of what to do now] +; +;; [2065:looks around, as if searching for something. ] +; +[2065:for] ; as in 'looks for the cask' +[2066:but can't find] +; +; messages when the player tries to take stuff from others... +[2071:won't let you] +;; [2072:slaps your paw away] +;; [2073:stops you] +; +; and same for npcs... +[2074:won't let] +[2075:take it. ] +; +; Standard Adventure output messages +; +[2100:%Welcome to Knight Orc, copyright (c) 1987 from +^N Level 9 ^N Computing and Rainbird. ] +[2101:you can't see] +[2102:you don't have] +[2103:you already have] +[2104:you can't see that here. ] +[2105:in the distance is ] ; for scenery seen from afar +[2106:you own nothing at all! ] +[2108:it is dark. ] +; +[2109:nothing happens] ; Nothing happens group... +;; [2110:that doesn't work] +;; [2111:there is no effect] +; +; examining something greater than maxobject: (but not scenery) +; rare occurrence - mostly for omnipresent objects, numbers, spells +[2112:it looks exactly as you would expect] +[2113: nothing. ] +[2114:you can't go that way. ] +[2115:through the door] +; +[2117:it's already open. ] +; +[2119:you find] +; +; the following are printed after the object name... +; tried to take (move) fixed object +; only 2120 needs to be suitable for 'you' as well as 'object' +; before the message is printed +[2120:won't move] ; group... +;; [2121:doesn't budge] ; (person) group +;; [2122:refuses to be moved] +; +[2123:you can't put ] ; paired with 2123 +[2124:there. ] +; +[2125:you can't go there! ] +[2126:you'll have to drop it first. ] +; +[2127:you can't climb that. ] +[2128:%(This game provides commands for rapid movement. For +example, "GO TO CASTLE" or "FOLLOW THE VALKYRIE". ] +;; [2128:you can't drop that. ] +[2129:whee! That was fun. ] ; jump to no effect +; +; 2130 is used when player refers to scenery which is not nearby +[2130:I can't find a reference to "] +[2131:you're on it! ] +[2132:what? ] +[2133:I don't know where that could be! ] +[2134:you're wearing ] +[2135:please try again, saying what with? ] +[2136:which one? ] +[2137:at what? ] +; +[2139:is full. ] +[2140:" here. ] +; +[2142:you can't wear ] +[2143:you can't reach it from here. ] +; +[2144:that's pointless] ; don't bother group... +;; [2145:that would be a waste of time] +;; [2146:that's pointless] +; +[2147:you're already wearing that. ] +[2148:you don't need to do that. ] +; +; Confirmation messages +; +[2152:worn. ] +[2153:OK. ] +[2154:yeuch! ] ; don't want to eat it +[2155:time passes. ] +[2156:said. ] +[2157:most refreshing. ] ; water / other pleasant liquids +[2158:you'll have to untie it first] +; +[2160:YES or NO, please.%] +; +[2176:nothing happened. ] +; +[2190:(] +[2191:). ] +; +; Death, scoring, game control etc. +; +[2200:really restart? ] +; [2201:%press space to play again. ] +[2202:really restore? ] +[2203:%YES or NO, please] +[2204:you score ] +[2205: out of 1000. ] +[2207:do you want to continue? ] +[2209:% %Thy adventure is over. Type RESTART, RESTORE, OOPS or RAM +RESTORE. ] +[2210:you vandalize the place a bit. ] +[2211:what, again? ] +[2212:why don't you go and mangle a paper clip instead? ] +[2213:vandals seem to have been at work here. ] +[2214:% %do you want to continue? ] +[2215:that's too long to wait. ] ; won't wait +[2216:have you considered, eg "WAIT FOR VALKYRIE" or "WAIT FOR +25 MINUTES"? ] +[2217:the time is ] +[2218:you can't light it. ] +[2219:you have no source of fire. ] +; +; Help messages +[2270:please contact Rainbird if you are really stuck. ] +; +[2300:oops and ram save/restore don't work in this version. ] +;; [2301:remove the Knight Orc disk, insert your formatted save position +;; disk and press a key. ] ; disk *** +;; [2302:now pull your save position disk out and stuff the Knight Orc disk +;; back in.% %] ; disk *** +; +[2308:I can't use OOPS to go back further than this. ] +[2309:(this version allows you to use RAM SAVE and RAM RESTORE +to save a position in memory, and OOPS to take back bad moves). ] +[2310:I can't find that saved position in memory. ] +; +[2311:you're about to load another part of the game. Do you +want to save your position first? ] ; tape *** +[2312:that data was probably not saved from Knight Orc. ] +[2313:play the tape of "] ; tape *** +; +[2315:A Kind of Magic". ] ; part 2 (hitech) ; tape *** +[2316:Hordes of the Mountain King". ] ; part 3 (magic) ; tape *** +[2317:are you sure you want to enter "Hitech" mode? ] +[2318:as the visor lifts away from your eyes, the countryside seems +to twist and change. What you had previously seen as the "real" world +was only an image! ] +; +;--------- +; +; table driven responses.. +; all have a dot added automatically +[2401:ouch!] ; attack me +[2402:Mary Whitehouse slaps your legs] ; rude word +;; [2403:you hear nothing else] +[2404:you succeed in smelling even worse] +[2405:you find nothing special] +[2406:you smell great] ; smell player +[2407:go stuff yourself, orc scum] +[2408:why not] +[2409:Oh, I see] ; no +[2410:you sound strangely positive] ; yes +[2411:that was close] ; phew +[2412:you are very intelligent indeed, considering] +[2413:life is too good for most people] +[2414:yes please] ; treasure +[2415:send your cheques to Level 9] ; royalties +[2416:to be, or not to be, that is the cliche] +[2417:very nasty the time of year] ; weather +[2418:how greedy] ; want +[2419:how should I know] ; what,why etc. +[2420:what a nice thought] ; death +[2421:what, going so soon? Don't forget to SAVE first] ; bye +[2422:I should think so too] ; sorry +[2423:aargh..] ; scream +[2424:oi! Behave yourself] ; 'rude word' npc +[2425:sorry, can't do that] ; full stop added by acode. +; +;----------- +; +; 'Game play' messages +[2503:the drawbridge slowly starts to close. ] +[2504:the drawbridge clunks shut. ] +[2505:the drawbridge is closed. ] +; +[2507:the drawbridge is wide open. ] +[2508:the drawbridge is closing. ] +[2509:the drawbridge is closing. ] +[2510:the drawbridge is closing. ] +[2511:your weight pushes the drawbridge down. ] +; +[2513:the chest is locked - you will need a key] ; you have no key +[2514:the lock opens with a little click] +[2515:the chest lid swings open and is held by a cord] +[2516:the heavy lid strikes the ground with a crash] +; +[2518:it won't open. ] ; trying to open it +[2519:the drawbridge is half-shut] +[2520:you bump into the closed drawbridge. ] +[2521:WHOOMPH! You are crushed as the drawbridge falls open. ] +[2522:hits the drawbridge, which falls open. ] +[2523:the chest opens] ; no strap or other stuff +;; [2524:it is already open] +[2525:it is closed] ; examine message when locked +[2526:it is closed] ; examine message when unlocked but closed +[2527:it is open] ; examine message when open +[2528:the pallid knight leaps up in a rage. ] +[2529:the hunter is too far away. ] +[2530:the ropes join magically] +[2531:a horn blatts in the distance. ] +[2532:a mounted hunter bursts through the trees and spurs his +nag towards you. The fool is waving a lassoo and clinging on for +dear life. ] +[2533:the hunter rides over you. ] +[2534:the stupid hunter doesn't see your rope! He is caught mid-chest +and hurled, stunned, to the ground. ] +[2535:the hunter strikes out wildly with his whip. ] + +[2536:%the green knight puffs himself up and stares down +scornfully from the back of his overgrown pony, +%"If thee be brave, not coward base, +%Then thee must now my challenge face. +%With this, my axe, strike blow for blow. +%I'll let thee strike first. Have a go!" +%He indicates his mighty axe. +% +%] + +[2537:%the green knight sneers and, barely moving his lips, +spits out another gem of the poet's art, +%"Spineless weakling, scared of fate, +%I know not why you hesitate. +%If thou wouldst win thyself renown, +%Take up my axe and strike me down!" +% +%] + +[2538:to your complete amazement, with one mighty swing of the +axe, you chop off the giant knight's head! For one glorious +moment, his mighty body totters as his head curves through the +air. +% +%Then, suddenly, a green hand reaches out and catches the falling +noggin by its leafy tresses. With practiced ease, the knight +replaces his green dome back on his neck and smiles horribly. +Then he laughs, "Thought you, an orc, a knight to beat? I'll +never lose while I can cheat!" He wrests the axe rudely from +your grasp and swings it. The last thing you hear is the knight's +dreadful laughter, "Ho! Ho! Ho!"] + +[2539:with a surprisingly dextrous stroke you behead the horse. +The green knight shouts in surprise but, before he can retaliate, +the massive steed has fallen on him! He is trapped, but only for +the time being. ] +[2540:the green knight looks dazed. ] +[2541:the green knight struggles on the ground. ] +[2542:with a massive effort, the green knight clambers to his +feet. ] + +[2543:the green knight reattaches the head +to the horse's body. The horse comes back to life! ] +; +[2545:%His verdant war-horse stepping high slow, +%The green gallant prepares to hew. +%Heaves up his axe and, shouting thrice "Ho", +%Brings down his axe and beheads you. +% +%] + +[2546:you can't ride that! ] +[2547:it's already being ridden! ] + +[2548:the hermit turns his back on you and walks over to his +trophy cabinet. His shoulders are shaking with mirth. ] +[2549:the hermit walks back to you and sits down, cross-legged, +in the centre of the cave. He is chuckling more than ever. ] +[2550:the hermit wakes up, rubs his bald head and scowls. ] +[2551:the hermit examines it and bursts out laughing. ] +; +; trio of messages printed immediately after +; 'You (npc) attack(s) the hermit but he dodges' +[2552:the hermit roars with laughter as you miss hopelessly +and sprawl on the ground] ; group... +;; [2553:the hermit sits down again and blows you a kiss] +;; [2554:the hermit sways about, giggling. He seems to see every +;; blow before you make it] +; +[2555:while the hermit isn't looking, you clobber the old fool +on the back of his head and knock him out cold] +[2556:Rapunzel is looking out of an upper window of the tower, +pouting sexily and letting down her incredibly long hair] +[2557:the thorns drive you back] +[2558:that won't protect you from the thorns] ; trying to put +; anything but welcome mat on hedge +[2559:that wouldn't help you to cross the hedge] +[2560:you clamber over the hedge] +[2561:the hair is in reach] ; south of tower base +[2562:Rapunzel shrieks in angry protest] +[2563:the hair descends again] +[2564:you carefully climb up the hair and, just as carefully, +Rapunzel knocks you down with a large mallet] +[2565:you cut off a good length of Rapunzel's hair. She shouts +angrily and disappears into the tower. You hear loud +cursing and threats of vengeance against orcs] +; +[2567:it hangs down into the depths of the well] +[2568:you climb the rope..] +[2569:you can't climb down without rope] +[2570:the innkeeper pulls a fresh pint] +[2571:the innkeeper looks for the empty glass. ] +[2572:the innkeeper laughs at you, "Finish your last one first!" ] +[2573:the innkeeper says, "I'm busy." ] +[2574:the innkeeper says, "We don't serve orcs." ] +[2575:the innkeeper isn't here! ] +[2576:you don't have any] ; beer +[2577:she is too far away] ; acting on Rapunzel +[2578:% %You lie still for a while, unable to even twitch +until the valkyrie swoops down, picks up your body and flies steadily +southwards, eventually swinging low through Paradise Gate. +% +%There's a faint click and an awesomely feminine voice breathes huskily +at about a hundred decibels, "Good Morning! Welcome to Paradise. Our +nymphs are busy right now, but they will attend you in just a few +moments; remember that patience is a virtue." She pauses briefly, +then chirps, "Putting you on hold" and ends with another click. +Somewhere, out of sight, harp music jangles irritatingly into life. +% +%] +[2579:the innkeeper thanks ] +[2580:, pours a pint and ] +[2581:you have nothing to dig with. ] +[2582:drinks it. ] +[2583:with a fanfare of trumpets, two nymphs float majestically +forward, turn up their noses in disgust and throw you out..%] +[2584:and drinks it down. The innkeeper retrieves +the empty glass. ] +[2585:Rapunzel has gone away and you can't climb up without her +hair] +[2586:two nymphs float in and examine] +[2587:. They murmur a few words and then take] +[2588:out. ] +[2589:% +%Grindleguts struggled awake, groaning piteously. The world bucked +and swayed, his headache was agony and he ached in every limb. +Grindleguts' mouth tasted like a Hobbit's armpit and he seemed to +have lost another tooth - he could not quite remember what had +happened after they captured the Inn, yesternight, but he was sure +it must have been fun! He moaned again and prepared to wallow in +his hangover. +% +%A sharp object stabbed at Grindleguts' ribs again, interrupting +his enjoyment of his misery. Grindleguts risked ungluing one +bloodshot eye and squinted at the world. A shaft of sunlight +stabbed back. It was still light. It was very light! Some idiot +had woken him in the middle of the day! +% +%] + +[2590:%you, Grindleguts, leap furiously at the jabbing figure +beside you - and discover, to your horror, that your legs are +fastened to some huge animal! +% +%One of the robed figures hauls you back upright, jeering "Go on, +Sir Orc, you're next" and gives your horse a prod with his spear, +laughing as the frightened beast rears and bolts. +% +%] +[2591:%you find yourself in a large open arena. All around are +crowds of people in mediaeval costume, obviously enjoying themselves. +% +%A chorus of boos started when you emerged from the tent, in +contrast to the cheers at the east end of the arena, where the +huge knight is consulting with his seconds. +% +%] +[2592:%the knight turns his horse to face you and levels his lance. +As he starts to charge, a great yell rises up from the crowd! +% +%] +[2593:%the knight takes aim and, WHOOMPH, his lance meets your +chest and the crowd roar as you fall, stunned, to the hard ground. +% +%Some time later, you awake. Bruised and battered, but you must +still be alive!% +%] +[2594:the horse refuses to move. ] +[2595:you are tied to the horse. ] +[2596:the knots are too tight. ] +[2597:you charge a group of spectators. They scream and flee in +panic. The horse shies up and stops dead. ] +[2598:you bravely charge the knight. ] +[2599:it is ] ; first part of rope length report +[2600: feet long. ] ; second part of length report. +[2601:it is very valuable! ] ; after examine message +[2602:the valkyrie seems annoyed to find that]; followed by name +[2603:is alive! ] +[2604:if you did that, the spear would fall into the chasm and be +lost forever. ] ; throwing spear without rope +[2605:the rope is too short - the spear is jerked back and +you catch it. ] +[2606:the spear sails through the air and neatly slips through the +ring! You escape, swinging in a graceful arc through the air... +% +%And crunch into the far wall of the chasm. Not many bones are +broken but, patting at your head, you discover with a shock that +you are wearing some kind of visor - and presumably have been +doing so all along! It seems to have been knocked loose and can +be raised at any time from now on. +% +%Do you want to follow my advice and leave the visor alone? ] +; +[2607:What about some service here?] ; group... +;; [2608:Any danger of some service in here?] +;; [2609:How about a beer, bartender?] +; +[2612:Did someone want a beer?] ; group... +;; [2613:OK, OK, who was dying of thirst here?] +;; [2614:Who's dying of thirst?] +; +[2617:the green knight grabs back the reins shouting, "Not so fast, +varlet." ] +[2618:ouch! That nearly broke a tooth! ] ; bite any treasure +; (intended for "bite golden apple") +[2619:it's out of stock.] +[2620:he is unconscious] +[2621:a key falls from under the mat] +[2622:the hermit stops ]; person +[2623:and says, "Oi! Keep your thieving hands off! ] +[2624:the Green Knight pushes him roughly to one side. ] +; +; messages used for "I've just stolen ... from a vile orc!" +[2625:a filthy orc] ; group... +;; [2626:a vile orc] +;; [2627:a treacherous orc] +; +; rapunzel, hello... +[2630:Rapunzel flutters her eyelashes, "Why, +hello little orc. Why dontcha come up and see me..." ] +; hermit, hello... +[2631:the hermit laughs at your accent. ] +[2632:suddenly, the gate opens. Two nymphs emerge, throw +out ] +[2633:, and dance back in. ] +[2634:the rope makes an effective trip-wire] +[2635:you will need to fix something to the rope and throw that] +; +; response for most people to "tell me about you" +[2636:I am perfect in every way] ; group... +;; [2637:I am totally perfect] +;; [2638:I am without flaw] +; +[2641:You look orcish to me] ; group... +;; [2642:You evil monster] +;; [2643:Something smells around here] +; +[2646:nothing special] +; +[3508:the body of ] ; this is needed! +[3509:oi! Let the dead rest in peace] +[3517:, but ] ; as in 'but he dodges' +; +[3520:enter] ; as in 'enters from the north' +; +; health reports +[3560:dead] +[3561:at death's door] +[3562:a wreck] +[3563:badly injured] +[3564:wounded] +[3565:injured] +[3566:hurt] +[3567:almost uninjured] +[3568:in good shape] +[3569:unhurt] +[3570:uninjured] ; and probably cheating! +; +; groupsay messages for hello responses... +[3580:says, "Hello there." ] ; group... +;; [3581:says, "Greetings." ] +;; [3582:says, "Hello to you." ] +; +[3585:nods. ] ; group... +;; [3586:flickers an eyelid. ] +;; [3587:snorts softly. ] +; +; groupsay messages for people recovering things that they +; need for racetracks etc. +[3590:says, "That's mine!" ] ; group... +;; [3591:says, "Give that to me." ] +;; [3592:says, "That's mine!" ] +; +[3595:snarls angrily. ] ; group... +;; [3596:snarls. ] +;; [3597:stops dead. ] +; +[3600:a voice in the distance shouts, "] +[3601:." ] +[3602:Wow! A stack overflow] ; a stack overflow! +[3603:Don't panic!] ; a panic +[3604:I can't go there from here. ] +[3605:you'll have to find the way yourself. ] +; +; some grouped responses for npcs +; two groups - those who can talk and those who can't +; first - npc refuses an order +[3610:refuses. ] ; group... +;; [3611:says, "Don't try to order ME around!" ] +;; [3612:says, "No way!" ] +; +[3615:curls its upper lip. ] ; group... +;; [3616:sneers at your request. ] +;; [3617:laughs hoarsely. ] +; +; now, npc accepts an order +[3620:says, "Sure." ] ; group... +;; [3621:says, "OK." ] +;; [3622:says, "Right." ] +; +[3625:nods slowly. ] ; group... +;; [3626:nods in agreement. ] +;; [3627:agrees. ] +; +; now response to questions when not obedient... +[3630:ignores your question. ] ; group... +;; [3631:says, "You'll have to find that out for yourself." ] +;; [3632:says, "You won't get any help from me." ] +; +[3635:makes a rude gesture. ] ; group... +;; [3636:pretends to ignore you. ] +;; [3637:snarls threateningly. ] +; +; response to requests to give anything(s) to anyone +[3640:says, "You'll have to fight me for that." ] ; group... +;; [3641:says, "I'd rather die." ] +;; [3642:says, "I'm not about to give anything away." ] +; +[3645:clutches his possessions angrily. ] ; group... +;; [3646:makes a rude gesture. ] +;; [3647:waves it at you defiantly. ] +; +; now responses when npc wants to obey orders just given, +; but can't understand any of them! +[3650:says, "Speak properly, orc." ] ; group... +;; [3651:says, "It must be your accent; I can't understand what +;; you're saying." ] +;; [3652:says, "Pardon?" ] +; +[3655:doesn't seem to understand. ] ; group... +;; [3656:shrugs in non-comprehension. ] +;; [3657:makes a questioning noise. ] +; +; message group when people are attacked by other people (probably player) +[3660:yells angrily. ] ; group... +;; [3661:says, "What's your game, buster?" ] +;; [3662:says, "OK, so that's the way you want it." ] +; +[3665:growls in fury. ] ; group... +;; [3666:growls viciously. ] +;; [3667:whirls around, ready to fight. ] +; +; now messages when people launch unprovoked attacks on the user +; these are followed by "and attacks you" +[3670:shouts, "An orc! Let's kill it!" ] ; group... +;; [3671:shouts, "Kill the orc!" ] +;; [3672:shouts, "I'm going to kill you, vile orc." ] +; +[3675:growls menacingly] ; group... +;; [3676:stares at you with obvious distaste] +;; [3677:leaps towards you] +; +; messages when npc can't find the way to its destination +[3680:says, "Where can it be?" ] ; group... +;; [3681:says, "I can't find it anywhere." ] +;; [3682:says, "I'm lost." ] +; +[3685:seems lost. ] ; group... +;; [3686:seems to give up. ] +;; [3687:looks around, then snorts in disgust. ] +; +[3690:says, "No way!" ] ; group... +;; [3691:says, "Nope, I won't do it." ] +;; [3692:says, "No chance." ] +; +[3695:laughs hoarsely. ] ; group... +;; [3696:sniggers a bit. ] +;; [3697:sighs heavily. ] +; +; now group say for people peering at you suspiciously +[3700:peers at you suspiciously. ] ; group... +;; [3701:looks at you curiously. ] +;; [3702:gives you a long stare. ] +; +[3705:peers at you suspiciously. ] ; group... +;; [3706:looks at you curiously. ] +;; [3707:gives you a long stare. ] +; +; Responses to player shouting... +[3715:Shut up, you stinking orc!] ; group... +;; [3716:Come to the crossroads and say that, orc.] +;; [3717:That sounds like an orc! Who wants to help me kill it?] +; +; 16 things which people shout at random... +[3720:Hey! Give that back!] +[3721:Stop attacking me!] +[3722:How do I get a drink from the Innkeeper?] +[3723:How do I get through the Paradise Gate?] +[3724:Does anyone have any treasure to spare?] +[3725:Can someone tell me about the well?] +[3726:Goodbye folks, I'm leaving.] +[3727:Help!] +[3728:Can anyone hear me?] +[3729:Are there any orcs listening?] +[3730:Right, you asked for it!] +[3731:I want some gold.] +[3732:Where is the gold?] +[3733:Who's stolen all the treasure?] +[3734:Anyone seen the orc? I want to kill it.] +[3735:Someone find me an orc to butcher.] +; 'a male voice shouts' type messages +[3736:a voice in the distance shouts, "] ; ita +[3737:a distant voice shouts, "] ; itan +[3738:a voice in the distance shouts, "] +[3739:a male voice in the distance shouts, "] ; he +[3740:a female voice in the distance shouts, "] ; she +[3741:a strained voice in the distance shouts, "] ; they +[3742:a distant voice shouts, "] ; you +; message group when people are fighting player... +[3743:I'm fighting a vile orc!] ; group... +;; [3744:I'm fighting an orc!] +;; [3745:I'm killing an orc!] +[3746:a voice in the dark says ] +;--- +; singing of gold messages... +[3750:yawns. ] +[3751:scratches himself. ] +[3752:looks around. ] +; +; default male gold singing... +[3753:mumbles quietly. ] +[3754:scratches himself. ] +[3755:whistles a happy tune. ] +; +; gold-singing for hermit +[3756:looks smugly at his trophy cabinet and laughs at you. ] +[3757:shakes with laughter at your curious appearance, "Would you +happen to have any interesting curios to spare?" he chuckles and +bursts out laughing again. ] +[3758:falls about laughing at you. ] +; +; female default gold singing.... +[3759:rearranges her clothing. ] +[3760:gives you a dirty look. ] +[3761:hums a little tune. ] +; +; default gold singing for animals +[3762:paws the ground. ] +[3763:stares at you. ] +[3764:paces up and down. ] +; +; people attack you at random - or when they realize you're an orc.. +[3862:shouts, "Kill the orc!" ] ; group... +;; [3861:shouts, "An orc - kill it!" ] +;; [3862:shouts, "Get that wretched orc!" ] +; +; when someone attacks someone else in an unprovoked way.. +[3863:screams and turns on you angrily. ] ; group... +;; [3864:says, "What's your game, buster?" ] +;; [3865:says, "OK, so that's the way you want it." ] +; +; messages when people suspect you're an orc.. +[3866:peers at you suspiciously. ] ; group... +;; [3867:seems to be eyeing you strangely. ] +;; [3868:comes up close and looks at you intently. ] +; +; when you give people presents of treasure... +; this will probably make them like you a bit. +[3872:bites it to test its value. ] ; group... +;; [3873:says, "Ooo.. thank you. What's wrong with it?" ] +;; [3874:examines it closely. ] +; +; when someone steals something from an NPC +[3875:is very annoyed. ] ; group... +;; [3876:shouts in surprise. ] +;; [3877:snarls menacingly. ] +; +; group shouting messages... +[3880:I've just stolen some treasure from ] ; group... +;; [3881:I've just ripped off ] +;; [3882:I've just stolen something from ] +; +[3885:I've just found a valuable ] ; group... +;; [3886:I've just picked up a valuable ] +;; [3887:I've got a valuable ] +; +[3890:I'm back in the game!] ; group... +;; [3891:I'm now back in the game!] +;; [3892:I'm back!] +; +; now some racetrack messages +[3900:the innkeeper polishes the bar. ] ; innkeeper +[3901:the innkeeper hums a little tune. ] ; innkeeper +; +; '^C' word types - see comment at start of descriptions +; +; Garbage words +; +[4000:^N the ^N this ^N these ^N that ^N some ^N a ^N and +^N good ^N of ^N there] +[4001:^N therefore ^N am ^N my ^N your ^N try ^N following +^N gold ^N golden ^N body ^N little ^N stone] +;------------------------------------------- +; +; Book protection code... +; +[4200:%A funny little gnome with a book appears on the horizon +and sprints towards you, yelling "Stop! To prove that you are +allowed to do that, look in this copy of The Sign of the Orc. ] +[4201:page ] +[4202:, line ] +[4203:, word ] +[4204:?"%] +[4205:The gnome grins nastily, "Guess again, orc! ] +[4206:The gnome runs away again.%] +[4207:What is the word at ] +[4208:"Wrong!" The gnome flattens you with the book. You scored a mere ] +; +[4301:^C a ^C wurden] +[4302:^C till ^C beide] +;; [4303:] +[4304:^C against ^C traute] +[4305:^C used ^C auf] +[4306:^C muttered ^C kehrt] +[4307:^C to ^C konnte] +[4308:^C ravine ^C in] +[4309:^C on ^C du] +;; [4310:] +; +[4311:^C in ^C das] +;; [4312:] +[4313:^C off ^C hilfe] +[4314:^C Orc's ^C Orcs ^C waren] +;; [4315:] +[4316:^C with ^C rannten] +;; [4317:] +;; [4318:] +[4319:^C have ^C blieb] +[4320:^C one ^N steal ^C ansonsten] +; +[4321:^C Sir ^C wohl] +[4322:^C to ^C leid] +;; [4323:] +[4324:^C had ^C drache] +;; [4325:] +;; [4326:] +;; [4327:] +;; [4328:] +[4329:^C terrible ^C ins] +[4330:^C tower ^C bist ^C du] +; +[4331:^C occasionally ^C seine] +[4332:^C she ^C Grok] +;; [4333:] +[4334:^C got ^C mit ^C du] +;; [4335:] +[4336:^C do ^C dich] +;; [4337:] +[4338:^C Grok ^N Grok-grok ^C Ork] +[4339:^C butter ^C der] +[4340:^C something ^C Barney] +; +[4341:^C idea ^C rief] +[4342:^C pachi ^C dort] +[4343:^C dark ^C dann] +;; [4344:] +[4345:^C noticed ^C am] +[4346:^C anybody ^C sich] +[4347:^C the ^C damit's ^N damits] +[4348:^C terrible ^C gute] +[4349:^C paused ^C gewesen] +[4350:^C he ^C Oink] +; +;; [4351:] +[4352:^C bowls ^C die] +[4353:^C weapons ^C da] +[4354:^C understand ^C oder] +;; [4355:] +[4356:^C just ^C lachte] +[4357:^C had ^C einer] +;; [4358:] +[4359:^C plucking ^C im] +;; [4360:] +; +;; [4361:] +[4362:^C jaws ^C der] +;; [4363:] +[4364:^C the ^C krachen] +[4365:^C frowned ^C gold] +[4366:^C slid ^C anderen] +[4367:^C out ^C verstaubten] +[4368:^C gold ^C Brandon] +;; [4369:] +[4370:^C furniture ^C zu] +; +[4371:^C it ^C so] +[4372:^C strewth ^C mit] +[4373:^C was ^C erst] +[4374:^C grow ^C gutes] +;; [4375:] +[4376:^C it ^C seinem] +[4377:^C cider ^C nie] +[4378:^C a ^C dann] +[4379:^C to ^C schier] +[4380:^C Grok ^C glaubt] +; +[4381:^C else ^C woher] +;; [4382:] +;; [4383:] +[4384:^C tavern ^C gelassen] +;; [4385:] +[4386:^C remarkably ^C was] +[4387:^C own ^C Jack] +[4388:^C right ^C Oh] +[4389:^C and ^C am] +;; [4390:] +; +[4391:^C of ^C so] +[4392:^C toss ^C und] +;; [4393:] +[4394:^C about ^C inzwischen] +[4395:^C sat ^C er] +;; [4396:] +[4397:^C Brandon ^C geist] +[4398:^C rather ^C hielt] +;; [4399:] +[4400:^C discovered ^C einmal] +; ------------------------------------------------------------------- diff --git a/l9dev/main.l9/squash.dat b/l9dev/main.l9/squash.dat new file mode 100644 index 0000000000000000000000000000000000000000..86dc108b9769341899a4874f91a35311b787c683 GIT binary patch literal 16640 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 Yy~sVR_m7^Q__X+x0Q^4Z|IL5@3rm->hX4Qo literal 0 HcmV?d00001 diff --git a/l9dev/pccode.c b/l9dev/pccode.c new file mode 100644 index 0000000..28dc1c7 --- /dev/null +++ b/l9dev/pccode.c @@ -0,0 +1,627 @@ +// Code generation section specific to particular processors +// +// 8086 version. N.W.Austin 18/7/88 +// +// Copyright (C) 1988-1989 Level 9 Computing +// +// last change 18/7/88 +// +// Linux adaptation in sync with: +// 68000 Acode to 8086 cross-compiler 1.53 +// Copyright (C) 1989 Level 9 Computing +// Mike Austin 14/11/89 +// Nick Austin 15/2/89 +// (complete source still missing) +// + +#include "code.h" + +// gamedata segment (in 1.5) contains: +// 0,1 PC for return to acode +// 2,3 Acode INT segment +// 4,5 Address of start of table 0 +// 6,7 Segment paragraph containing table 0 +// 8-35 Addresses of lists 1 thru 9 +// 36-141 Addresses of lists 10 thru 31 +// 142 RET instrction +// 143 Not used +// 144-2191 Vars and temp lists +// 2192+ Gamedata (includes acode and permanent tables) + +// +// data tables for ALL instructions +// one word per byte which goes into code. +// If the high byte of the word is zero, the low byte +// is used immediately as code. +// if the high byte is non-zero, it codes information as follows: +// bit 15 set: use high byte of argument as byte of code +// bit 14 set: substitute argument 1 for the current byte +// bit 13 set: substitute argument 2 for the current byte +// convention: arguments are given in the same order as in +// the acode source. +// + +uint8_t i8086DataShortGoto[] = { + // jmp short + 1, + 0x00, 0xEB, +}; + +uint8_t i8086DataLongGoto[] = { + // jmp near + 1, + 0x00, 0xE9, +}; + +uint8_t i8086DataShortGosub[] = { + // 8086 does not have short gosub + 0, +}; + +uint8_t i8086DataLongGosub[] = { + // call near + 1, + 0x00, 0xE8, +}; + +uint8_t i8086DataReturn[] = { + // ret near + 1, + 0x00, 0xC3, +}; + +uint8_t i8086DataToAcode[] = { + // mov bx,offset label + // mov di,0 + // jmp far cs:[di] + // label: + 9, // length also used in 'MCToAcode' + 0x00, 0xBB, + 0x40, 0x00, 0xC0, 0x00, // D4.w + 0x00, 0xBF, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x2E, + 0x00, 0xFF, + 0x00, 0x2D, +}; + +uint8_t i8086DataLetVC[] = { // i.e. Let V1=CCCC + // mov ds:V1,C1 + 6, + 0x00, 0xC7, + 0x00, 0x06, + 0x40, 0x00, 0xC0, 0x00, // V1 + 0x20, 0x00, 0xA0, 0x00, // C1 +}; + +uint8_t i8086DataLetVV[] = { // i.e. Let V1=V2 + // mov ax,ds:[V2] + // mov ds:[V1],ax + 6, + 0x00, 0xA1, + 0x20, 0x00, 0xA0, 0x00, // V2 + 0x00, 0xA3, + 0x40, 0x00, 0xC0, 0x00, // V1 +}; + +uint8_t i8086DataAddVV[] = { // i.e. ADD V1,V2: V1:=V1+V2 + // mov ax,ds:V2 + // add ds:V1,ax + 7, + 0x00, 0xA1, + 0x20, 0x00, 0xA0, 0x00, // V2 + 0x00, 0x01, + 0x00, 0x06, + 0x40, 0x00, 0xC0, 0x00, // V1 +}; + +uint8_t i8086DataSubVV[] = { // i.e. SUB V1,V2: V1:=V1-V2 + // mov ax,ds:V2 + // sub ds:V1,ax + 7, + 0x00, 0xA1, + 0x20, 0x00, 0xa0, 0x00, // V2 + 0x00, 0x29, + 0x00, 0x06, + 0x40, 0x00, 0xC0, 0x00, // V1 +}; + +uint8_t i8086DataIfNEVCShort[] = { // i.e. IF V<>C THEN label + // cmp ds:V,C + // jnz + 7, + 0x00, 0x81, + 0x00, 0x3E, + 0x40, 0x00, 0xC0, 0x00, // V1 + 0x20, 0x00, 0xA0, 0x00, // C1 + 0x00, 0x75, +}; + +uint8_t i8086DataIfNEVCLong[] = { // i.e. IF V<>C THEN @label + // cmp ds:V1,C1 + // jz+3 + // jmp + 9, + 0x00, 0x81, + 0x00, 0x3E, + 0x40, 0x00, 0xC0, 0x00, // V1 + 0x20, 0x00, 0xA0, 0x00, // C1 + 0x00, 0x74, + 0x00, 0x03, + 0x00, 0xE9, // jmp +}; + +uint8_t i8086DataIfEQVCShort[] = { // i.e. IF V=C THEN label + // cmp ds:V1,C1 + // jz + 7, + 0x00, 0x81, + 0x00, 0x3E, + 0x40, 0x00, 0xC0, 0x00, // V1 + 0x20, 0x00, 0xA0, 0x00, // C1 + 0x00, 0x74, +}; + +uint8_t i8086DataIfEQVCLong[] = { // i.e. IF V=C THEN @label + // cmp ds:V1,C1 + // jnz+3 + // jmp + 9, + 0x00, 0x81, + 0x00, 0x3E, + 0x40, 0x00, 0xC0, 0x00, // V1 + 0x20, 0x00, 0xA0, 0x00, // C1 + 0x00, 0x75, + 0x00, 0x03, + 0x00, 0xE9, // jmp +}; + +uint8_t i8086DataIfLTVCShort[] = { // i.e. IF VNICK 23/11/88 // jl + 7, + 0x00, 0x81, + 0x00, 0x3E, + 0x40, 0x00, 0xC0, 0x00, // V1 + 0x20, 0x00, 0xA0, 0x00, // C1 + 0x00, 0x72, // >NICK 23/11/88 0x00, 0x7C, +}; + +uint8_t i8086DataIfLTVCLong[] = { // i.e. IF VNICK 23/11/88 // jge+3 + // jmp + 9, + 0x00, 0x81, + 0x00, 0x3E, + 0x40, 0x00, 0xC0, 0x00, // V1 + 0x20, 0x00, 0xA0, 0x00, // C1 + 0x00, 0x73, // >NICK 23/11/88 0x00, 0x7D, + 0x00, 0x03, + 0x00, 0xE9, // jmp +}; + +uint8_t i8086DataIfGTVCShort[] = { // i.e. IF V>C THEN label + // cmp ds:V1,C1 + // ja // >NICK 23/11/88 // jg + 7, + 0x00, 0x81, + 0x00, 0x3E, + 0x40, 0x00, 0xC0, 0x00, // V1 + 0x20, 0x00, 0xA0, 0x00, // C1 + 0x00, 0x77, // >NICK 23/11/88 0x00, 0x7F, +}; + +uint8_t i8086DataIfGTVCLong[] = { // i.e. IF V>C THEN @label + // cmp ds:V1,C1 + // jbe +3 // >NICK 23/11/88 // jle +3 + // jmp + 9, + 0x00, 0x81, + 0x00, 0x3E, + 0x40, 0x00, 0xC0, 0x00, // V1 + 0x20, 0x00, 0xA0, 0x00, // C1 + 0x00, 0x76, // >NICK 23/11/88 0x00, 0x7E, + 0x00, 0x03, + 0x00, 0xE9, // jmp +}; + +uint8_t i8086DataIfNEVVShort[] = { // i.e. IF V<>V1 THEN label + // mov ax,ds:V + // cmp ax,ds:V1 + // jnz + 8, + 0x00, 0xA1, + 0x40, 0x00, 0xC0, 0x00, // V + 0x00, 0x3B, + 0x00, 0x06, + 0x20, 0x00, 0xA0, 0x00, // V1 + 0x00, 0x75, +}; + +uint8_t i8086DataIfNEVVLong[] = { // i.e. IF V<>V1 THEN @label + // mov ax,ds:V + // cmp ax,ds:V1 + // jz +3 + // jmp + 10, + 0x00, 0xA1, + 0x40, 0x00, 0xC0, 0x00, // V + 0x00, 0x3B, + 0x00, 0x06, + 0x20, 0x00, 0xA0, 0x00, // V1 + 0x00, 0x74, + 0x00, 0x03, + 0x00, 0xE9, // jmp +}; + +uint8_t i8086DataIfEQVVShort[] = { // i.e. IF V=V1 THEN label + // mov ax,ds:V + // cmp ax,ds:V1 + // jz + 8, + 0x00, 0xA1, + 0x40, 0x00, 0xC0, 0x00, + 0x00, 0x3B, + 0x00, 0x06, + 0x20, 0x00, 0xA0, 0x00, + 0x00, 0x74, +}; + +uint8_t i8086DataIfEQVVLong[] = { // i.e. IF V=V1 THEN @label + // mov ax,ds:V + // cmp ax,ds:V1 + // jnz +3 + // jmp + 10, + 0x00, 0xA1, + 0x40, 0x00, 0xC0, 0x00, // V + 0x00, 0x3B, + 0x00, 0x06, + 0x20, 0x00, 0xA0, 0x00, // V1 + 0x00, 0x75, + 0x00, 0x03, + 0x00, 0xE9, // jmp +}; + +uint8_t i8086DataIfLTVVShort[] = { // i.e. IF VNICK 23/11/88 // jl + 8, + 0x00, 0xA1, + 0x40, 0x00, 0xC0, 0x00, // V + 0x00, 0x3B, + 0x00, 0x06, + 0x20, 0x00, 0xA0, 0x00, // V1 + 0x00, 0x72, // >NICK 23/11/88 0x00, 0x7C, +}; + +uint8_t i8086DataIfLTVVLong[] = { // i.e. IF VNICK 23/11/88 // jge +3 + // jmp + 10, + 0x00, 0xA1, + 0x40, 0x00, 0xC0, 0x00, // V + 0x00, 0x3B, + 0x00, 0x06, + 0x20, 0x00, 0xA0, 0x00, // V1 + 0x00, 0x73, // >NICK 23/11/88 0x00, 0x7D, + 0x00, 0x03, + 0x00, 0xE9, // jmp +}; + +uint8_t i8086DataIfGTVVShort[] = { // i.e. IF V>V1 THEN label + // mov ax,ds:V + // cmp ax,ds:V1 + // ja // >NICK 23/11/88 // jg + 8, + 0x00, 0xA1, + 0x40, 0x00, 0xC0, 0x00, // V + 0x00, 0x3B, + 0x00, 0x06, + 0x20, 0x00, 0xA0, 0x00, // V1 + 0x00, 0x77, // >NICK 22/11/88 0x00, 0x7F, +}; + +uint8_t i8086DataIfGTVVLong[] = { // i.e. IF V>V1 THEN @label + // mov ax,ds:V + // cmp ax,ds:V1 + // jbe +3 // >NICK 23/11/88 // jle +3 + // jmp + 10, + 0x00, 0xA1, + 0x40, 0x00, 0xC0, 0x00, // V + 0x00, 0x3B, + 0x00, 0x06, + 0x20, 0x00, 0xA0, 0x00, // V1 + 0x00, 0x76, // >NICK 23/11/88 0x00, 0x7E, + 0x00, 0x03, + 0x00, 0xE9, // jmp +}; + +uint8_t *i8086MCIfVVTable[8] = { + // first the short branch versions... + i8086DataIfEQVVShort, + i8086DataIfNEVVShort, + i8086DataIfLTVVShort, + i8086DataIfGTVVShort, + + i8086DataIfEQVVLong, + i8086DataIfNEVVLong, + i8086DataIfLTVVLong, + i8086DataIfGTVVLong, +}; + +uint8_t *i8086MCIfVCTable[8] = { + i8086DataIfEQVCShort, + i8086DataIfNEVCShort, + i8086DataIfLTVCShort, + i8086DataIfGTVCShort, + + i8086DataIfEQVCLong, + i8086DataIfNEVCLong, + i8086DataIfLTVCLong, + i8086DataIfGTVCLong, +}; + +uint8_t i8086DataAttVV[] = { // i.e. TableN(V1)=V2 + // les di,ds:N + // add di,ds:V1 + // mov al,ds:V2 + // stosb + 12, + 0x00, 0xC4, + 0x00, 0x3E, + 0x40, 0x00, 0xC0, 0x00, // N + 0x00, 0x03, + 0x00, 0x3E, + 0x20, 0x00, 0xA0, 0x00, // V1 + 0x00, 0xA0, + 0x10, 0x00, 0x90, 0x00, // V2 + 0x00, 0xAA, +}; + +uint8_t i8086DataAttCV[] = { // i.e. TableN(C)=V + // les ds:N + // mov al,ds:V + // mov es:C[si],al + 12, + 0x00, 0xC4, + 0x00, 0x36, + 0x40, 0x00, 0xC0, 0x00, // N + 0x00, 0xA0, + 0x10, 0x00, 0x90, 0x00, // V + 0x00, 0x26, + 0x00, 0x88, + 0x00, 0x84, // Short constant is available + 0x20, 0x00, 0xA0, 0x00, // C +}; + +uint8_t i8086DataAftVV[] = { // i.e. V2=TableN(V1) + // les ds:N + // mov bx,ds:V1 + // mov dl,es:[si+bx] + // mov ds:V2,dx // DH is always zero in m/c + 15, + 0x00, 0xC4, + 0x00, 0x36, + 0x20, 0x00, 0xA0, 0x00, // N + 0x00, 0x8B, + 0x00, 0x1E, + 0x40, 0x00, 0xC0, 0x00, // V1 + 0x00, 0x26, + 0x00, 0x8A, + 0x00, 0x10, + 0x00, 0x89, + 0x00, 0x16, + 0x10, 0x00, 0x90, 0x00, // V2 +}; + +uint8_t i8086DataAftVC[] = { // i.e. V=TableN(C) + // les ds:N + // mov dl,es:C[si] + // mov ds:V,dx + 13, + 0x00, 0xC4, + 0x00, 0x36, + 0x20, 0x00, 0xA0, 0x00, // N + 0x00, 0x26, + 0x00, 0x8A, // Can be optimised for CC<256 + 0x00, 0x94, + 0x10, 0x00, 0x90, 0x00, // C + 0x00, 0x89, + 0x00, 0x16, + 0x40, 0x00, 0xC0, 0x00, // V +}; + +uint8_t i8086DataAttVV16[] = { // i.e. &TableN(V1)=V2 + // les di,ds:N + // add di,ds:V1 + // mov ax,ds:V2 + // xchg ah,al + // stosw + 14, + 0x00, 0xC4, + 0x00, 0x3E, + 0x40, 0x00, 0xC0, 0x00, // N + 0x00, 0x03, + 0x00, 0x3E, + 0x20, 0x00, 0xA0, 0x00, // V1 + 0x00, 0xA1, + 0x10, 0x00, 0x90, 0x00, // V2 + 0x00, 0x86, + 0x00, 0xE0, + 0x00, 0xAB, +}; + +uint8_t i8086DataAttCV16[] = { // i.e. &TableN(C)=V + // les ds:N + // mov ax,ds:V + // xchg ah,al + // mov es:C[si],ax + 14, + 0x00, 0xC4, + 0x00, 0x36, + 0x40, 0x00, 0xC0, 0x00, // N + 0x00, 0xA1, + 0x10, 0x00, 0x90, 0x00, // V + 0x00, 0x86, + 0x00, 0xE0, + 0x00, 0x26, + 0x00, 0x89, // Optimise for CC<256 + 0x00, 0x84, + 0x20, 0x00, 0xA0, 0x00, // C +}; + +uint8_t i8086DataAftVV16[] = { // i.e. &V2=TableN(V1) + // les si,ds:N + // add si,ds:V1 + // lods es:[si] + // xchg ah,al + // mov ds:V2,ax + 15, + 0x00, 0xC4, + 0x00, 0x36, + 0x20, 0x00, 0xA0, 0x00, // N + 0x00, 0x03, + 0x00, 0x36, + 0x40, 0x00, 0xC0, 0x00, // V1 + 0x00, 0x26, + 0x00, 0xAD, + 0x00, 0x86, + 0x00, 0xE0, + 0x00, 0xA3, + 0x10, 0x00, 0x90, 0x00, // V2 +}; + +uint8_t i8086DataAftVC16[] = { // i.e. &V=TableN(C) + // les si,ds:[n] + // mov ax,es:[si+C] + // xchg ah,al + // mov ds:V,ax + 14, + 0x00, 0xC4, + 0x00, 0x36, + 0x20, 0x00, 0xA0, 0x00, // N + 0x00, 0x26, + 0x00, 0x8B, // Optimise for CC<256 + 0x00, 0x84, + 0x10, 0x00, 0x90, 0x00, // C + 0x00, 0x86, + 0x00, 0xE0, + 0x00, 0xA3, + 0x40, 0x00, 0xC0, 0x00, +}; + +uint8_t i8086DataBreakPt[] = { + 1, + 0x00, 0xCC, +}; + +uint8_t i8086DataPush[] = { + // mov ax,ds:V + // push ax + 4, + 0x00, 0xA1, + 0x40, 0x00, 0xC0, 0x00, // V + 0x00, 0x50, +}; + +uint8_t i8086DataPop[] = { + // pop ax + // mov ds:V,ax + 4, + 0x00, 0x58, + 0x00, 0xA3, + 0x40, 0x00, 0xC0, 0x00, // V +}; + +uint8_t i8086DataAndVV[] = { + // mov ax,ds:V2 + // and ds:V1,ax + 7, + 0x00, 0xA1, + 0x20, 0x00, 0xA0, 0x00, // V2 + 0x00, 0x21, + 0x00, 0x06, + 0x40, 0x00, 0xC0, 0x00, // V1 +}; + +uint8_t i8086DataOrVV[] = { + // mov ax,ds:V2 + // or ds:V1,ax + 7, + 0x00, 0xA1, + 0x20, 0x00, 0xA0, 0x00, // V2 + 0x00, 0x09, + 0x00, 0x06, + 0x40, 0x00, 0xC0, 0x00, // V1 +}; + +uint8_t i8086DataXorVV[] = { + // mov ax,ds:V2 + // xor ds:V1,ax + 7, + 0x00, 0xA1, + 0x20, 0x00, 0xA0, 0x00, // V2 + 0x00, 0x31, + 0x00, 0x06, + 0x40, 0x00, 0xC0, 0x00, // V1 +}; + +uint8_t i8086DataASR[] = { + // sar ds:V1,1 + 4, + 0x00, 0xD1, + 0x00, 0x3E, + 0x40, 0x00, 0xC0, 0x00, // V1 +}; + +// i8086 code data table +struct _datatable i8086DataTable = { + i8086DataShortGoto, + i8086DataLongGoto, + i8086DataShortGosub, + i8086DataLongGosub, + i8086DataReturn, + i8086DataToAcode, + i8086DataLetVC, + i8086DataLetVV, + i8086DataAddVV, + i8086DataSubVV, + i8086DataIfNEVCShort, + i8086DataIfNEVCLong, + i8086DataIfEQVCShort, + i8086DataIfEQVCLong, + i8086DataIfLTVCShort, + i8086DataIfLTVCLong, + i8086DataIfGTVCShort, + i8086DataIfGTVCLong, + i8086DataIfNEVVShort, + i8086DataIfNEVVLong, + i8086DataIfEQVVShort, + i8086DataIfEQVVLong, + i8086DataIfLTVVShort, + i8086DataIfLTVVLong, + i8086DataIfGTVVShort, + i8086DataIfGTVVLong, + i8086DataAttVV, + i8086DataAttCV, + i8086DataAftVV, + i8086DataAftVC, + i8086DataAttVV16, + i8086DataAttCV16, + i8086DataAftVV16, + i8086DataAftVC16, + i8086DataBreakPt, + i8086DataPush, + i8086DataPop, + i8086DataAndVV, + i8086DataOrVV, + i8086DataXorVV, + i8086DataASR, +}; diff --git a/l9dev/regress/compile.bat b/l9dev/regress/compile.bat new file mode 100644 index 0000000..e9ff9c1 --- /dev/null +++ b/l9dev/regress/compile.bat @@ -0,0 +1,3 @@ +6 +1errors.txt +0 diff --git a/l9dev/regress/compile.log b/l9dev/regress/compile.log new file mode 100644 index 0000000..b1844e0 --- /dev/null +++ b/l9dev/regress/compile.log @@ -0,0 +1,1968 @@ +Compiling Knight Orc part 1 +Level 9 table.dat generation done. + + +COMPACT 2.3 +7th September 1987 +Available memory = 1048576 bytes + +Options: N N 128 + + + + + Level 9 Adventures + + Copyright (C) 1986-1988 Level 9 Computing + + + + + A .. spec48.l9 +Only one sub-directory - proceeding with squash + +Phase 1 - Clear memory +Phase 2 - Sort into message number order + +Squashing. Please wait. + +Length of SMT = 34264 bytes. +Number of modifications = 95. +Number of text characters = 26519. + +Phase 3 - Construct 'Frequency Table' + +Line number = 55. Line number = 95. Line number = 135. Line number = 184. Line number = 237. Line number = 276. Line number = 314. Line number = 357. Line number = 408. Line number = 451. Line number = 487. Line number = 524. Line number = 570. Line number = 615. Line number = 678. Line number = 744. Line number = 863. Line number = 928. Line number = 969. Line number = 1044. Line number = 1101. Line number = 1151. Line number = 1200. Line number = 1252. Line number = 1336. Line number = 1423. Line number = 1495. Line number = 1605. Line number = 1661. Line number = 1749. Line number = 1801. Line number = 1848. + +Number of 'words' = 1791. +Length of 'Frequency Table' = 15713 bytes. + +Phase 4 - (Optional) Display 'Frequency Table' +Phase 5 - Construct 'Common Word Dictionary' +Phase 6 - Construct 'Message Descriptors' + +Line number = 55. Line number = 95. Line number = 135. Line number = 184. Line number = 237. Line number = 276. Line number = 314. Line number = 357. Line number = 408. Line number = 451. Line number = 487. Line number = 524. Line number = 570. Line number = 615. Line number = 678. Line number = 744. Line number = 863. Line number = 928. Line number = 969. Line number = 1044. Line number = 1101. Line number = 1151. Line number = 1200. Line number = 1252. Line number = 1336. Line number = 1423. Line number = 1495. Line number = 1605. Line number = 1661. Line number = 1749. Line number = 1801. Line number = 1848. + +Longest compressed message = 224 bytes. +Length compressed Message Desriptors = 9859 bytes. + +Phase 7 - Construct 'Word Dictionary' +Phase 8 - Construct 'Word Dictionary Index' +Phase 9 - Build Squash File + +Writing squash.dat ... + +File 'message.txt' length = 56410 bytes. +Number of characters = 26519. Number of words = 1791. + +File 'squash.dat' length = 16423 bytes. +Compressed size of message descriptors = 9859 bytes. +Compressed size of word dictionary = 5875 bytes. +Compression = 61% of filesize = 39% saved space. + + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Compiling file 'aconst.txt'. End of source file. +Compiling file 'mconst.txt'. End of source file. +Compiling file 'sconst.txt'. End of source file. +Compiling file 'c1.txt'. End of source file. +Compiling file 'aparse.txt'. End of source file. +Compiling file 'averb.txt'. End of source file. +Compiling file 'acore.txt'. End of source file. +Compiling file 'aspecial.txt'. End of source file. +Compiling file 'converse.txt'. End of source file. +Compiling file 'npc.txt'. End of source file. +Compiling file 'oops.txt'. End of source file. +Compiling file 'book.txt'. End of source file. + +Number of vars=230 +Number of source lines=11709 + +Acode finish 1.1 (for Linux) +Copyright (C) 1986-1988 Level 9 Computing + +Loading exit.txt +Loading table.dat + A .. spec48.l9 +Only one sub-directory - proceeding with finish +Loading squash.dat +Saving acode.acd +Saving gamedata.dat + +Compiling Knight Orc part 2 +Level 9 table.dat generation done. + + +COMPACT 2.3 +7th September 1987 +Available memory = 1048576 bytes + +Options: N N 128 + + + + + Level 9 Adventures + + Copyright (C) 1986-1988 Level 9 Computing + + + + + A .. msx.l9 +Only one sub-directory - proceeding with squash + +Phase 1 - Clear memory +Phase 2 - Sort into message number order + +Squashing. Please wait. + +Length of SMT = 51022 bytes. +Number of modifications = 138. +Number of text characters = 40739. + +Phase 3 - Construct 'Frequency Table' + +Line number = 65. Line number = 102. Line number = 135. Line number = 181. Line number = 228. Line number = 265. Line number = 304. Line number = 341. Line number = 375. Line number = 422. Line number = 466. Line number = 514. Line number = 564. Line number = 605. Line number = 657. Line number = 700. Line number = 752. Line number = 792. Line number = 886. Line number = 942. Line number = 982. Line number = 1031. Line number = 1083. Line number = 1131. Line number = 1191. Line number = 1238. Line number = 1299. Line number = 1361. Line number = 1412. Line number = 1456. Line number = 1511. Line number = 1567. Line number = 1617. Line number = 1667. Line number = 1715. Line number = 1777. Line number = 1831. Line number = 1874. Line number = 1927. Line number = 1976. Line number = 2018. Line number = 2073. Line number = 2124. Line number = 2177. + +Number of 'words' = 2246. +Length of 'Frequency Table' = 20134 bytes. + +Phase 4 - (Optional) Display 'Frequency Table' +Phase 5 - Construct 'Common Word Dictionary' +Phase 6 - Construct 'Message Descriptors' + +Line number = 65. Line number = 102. Line number = 135. Line number = 181. Line number = 228. Line number = 265. Line number = 304. Line number = 341. Line number = 375. Line number = 422. Line number = 466. Line number = 514. Line number = 564. Line number = 605. Line number = 657. Line number = 700. Line number = 752. Line number = 792. Line number = 886. Line number = 942. Line number = 982. Line number = 1031. Line number = 1083. Line number = 1131. Line number = 1191. Line number = 1238. Line number = 1299. Line number = 1361. Line number = 1412. Line number = 1456. Line number = 1511. Line number = 1567. Line number = 1617. Line number = 1667. Line number = 1715. Line number = 1777. Line number = 1831. Line number = 1874. Line number = 1927. Line number = 1976. Line number = 2018. Line number = 2073. Line number = 2124. Line number = 2177. + +Longest compressed message = 146 bytes. +Length compressed Message Desriptors = 14638 bytes. + +Phase 7 - Construct 'Word Dictionary' +Phase 8 - Construct 'Word Dictionary Index' +Phase 9 - Build Squash File + +Writing squash.dat ... + +File 'message.txt' length = 76456 bytes. +Number of characters = 40739. Number of words = 2246. + +File 'squash.dat' length = 22661 bytes. +Compressed size of message descriptors = 14638 bytes. +Compressed size of word dictionary = 7334 bytes. +Compression = 55% of filesize = 45% saved space. + + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Compiling file '../knight1.l9/aconst.txt'. End of source file. +Compiling file '../knight1.l9/mconst.txt'. End of source file. +Compiling file 'sconst.txt'. End of source file. +Compiling file 'pconst.txt'. End of source file. +Compiling file 'c2.txt'. End of source file. +Compiling file '../knight1.l9/aparse.txt'. End of source file. +Compiling file '../knight1.l9/acore.txt'. End of source file. +Compiling file '../knight1.l9/converse.txt'. End of source file. +Compiling file '../knight1.l9/npc.txt'. End of source file. +Compiling file '../knight1.l9/oops.txt'. End of source file. +Compiling file '../knight1.l9/book.txt'. End of source file. +Compiling file 'averb.txt'. End of source file. +Compiling file 'aspecial.txt'. End of source file. + +Number of vars=254 +Number of source lines=13744 + +Acode finish 1.1 (for Linux) +Copyright (C) 1986-1988 Level 9 Computing + +Loading exit.txt +Loading table.dat + A .. msx.l9 +Only one sub-directory - proceeding with finish +Loading squash.dat +Saving acode.acd +Saving gamedata.dat + +Compiling Knight Orc part 3 +Level 9 table.dat generation done. + + +COMPACT 2.3 +7th September 1987 +Available memory = 1048576 bytes + +Options: N N 128 + + + + + Level 9 Adventures + + Copyright (C) 1986-1988 Level 9 Computing + + + + + A .. msx.l9 +Only one sub-directory - proceeding with squash + +Phase 1 - Clear memory +Phase 2 - Sort into message number order + +Squashing. Please wait. + +Length of SMT = 52658 bytes. +Number of modifications = 159. +Number of text characters = 42521. + +Phase 3 - Construct 'Frequency Table' + +Line number = 64. Line number = 101. Line number = 133. Line number = 178. Line number = 223. Line number = 260. Line number = 299. Line number = 337. Line number = 371. Line number = 416. Line number = 459. Line number = 505. Line number = 555. Line number = 602. Line number = 662. Line number = 711. Line number = 762. Line number = 797. Line number = 888. Line number = 948. Line number = 988. Line number = 1036. Line number = 1086. Line number = 1130. Line number = 1185. Line number = 1237. Line number = 1302. Line number = 1369. Line number = 1427. Line number = 1470. Line number = 1515. Line number = 1563. Line number = 1611. Line number = 1665. Line number = 1706. Line number = 1767. Line number = 1822. Line number = 1867. Line number = 1916. Line number = 1967. Line number = 2008. Line number = 2063. Line number = 2119. Line number = 2171. + +Number of 'words' = 2270. +Length of 'Frequency Table' = 20268 bytes. + +Phase 4 - (Optional) Display 'Frequency Table' +Phase 5 - Construct 'Common Word Dictionary' +Phase 6 - Construct 'Message Descriptors' + +Line number = 64. Line number = 101. Line number = 133. Line number = 178. Line number = 223. Line number = 260. Line number = 299. Line number = 337. Line number = 371. Line number = 416. Line number = 459. Line number = 505. Line number = 555. Line number = 602. Line number = 662. Line number = 711. Line number = 762. Line number = 797. Line number = 888. Line number = 948. Line number = 988. Line number = 1036. Line number = 1086. Line number = 1130. Line number = 1185. Line number = 1237. Line number = 1302. Line number = 1369. Line number = 1427. Line number = 1470. Line number = 1515. Line number = 1563. Line number = 1611. Line number = 1665. Line number = 1706. Line number = 1767. Line number = 1822. Line number = 1867. Line number = 1916. Line number = 1967. Line number = 2008. Line number = 2063. Line number = 2119. Line number = 2171. + +Longest compressed message = 257 bytes. +Length compressed Message Desriptors = 15207 bytes. + +Phase 7 - Construct 'Word Dictionary' +Phase 8 - Construct 'Word Dictionary Index' +Phase 9 - Build Squash File + +Writing squash.dat ... + +File 'message.txt' length = 73445 bytes. +Number of characters = 42521. Number of words = 2270. + +File 'squash.dat' length = 23379 bytes. +Compressed size of message descriptors = 15207 bytes. +Compressed size of word dictionary = 7483 bytes. +Compression = 54% of filesize = 46% saved space. + + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Compiling file '../knight1.l9/aconst.txt'. End of source file. +Compiling file '../knight1.l9/mconst.txt'. End of source file. +Compiling file 'sconst.txt'. End of source file. +Compiling file 'pconst.txt'. End of source file. +Compiling file 'c2.txt'. End of source file. +Compiling file '../knight1.l9/aparse.txt'. End of source file. +Compiling file '../knight1.l9/acore.txt'. End of source file. +Compiling file '../knight1.l9/converse.txt'. End of source file. +Compiling file '../knight1.l9/npc.txt'. End of source file. +Compiling file '../knight1.l9/oops.txt'. End of source file. +Compiling file '../knight1.l9/book.txt'. End of source file. +Compiling file 'averb.txt'. End of source file. +Compiling file 'aspecial.txt'. End of source file. + +Number of vars=254 +Number of source lines=13744 + +Acode finish 1.1 (for Linux) +Copyright (C) 1986-1988 Level 9 Computing + +Loading exit.txt +Loading table.dat + A .. msx.l9 +Only one sub-directory - proceeding with finish +Loading squash.dat +Saving acode.acd +Saving gamedata.dat + +Compiling Lancelot part 1 +Level 9 table.dat generation done. + + +COMPACT 2.3 +7th September 1987 +Available memory = 1048576 bytes + +Options: N N 128 + + + + + Level 9 Adventures + + Copyright (C) 1986-1988 Level 9 Computing + + + + + A .. main.l9 +Only one sub-directory - proceeding with squash + +Phase 1 - Clear memory +Phase 2 - Sort into message number order + +Squashing. Please wait. + +Length of SMT = 75714 bytes. +Number of modifications = 307. +Number of text characters = 65784. + +Phase 3 - Construct 'Frequency Table' + +Line number = 67. Line number = 108. Line number = 163. Line number = 225. Line number = 284. Line number = 327. Line number = 380. Line number = 429. Line number = 498. Line number = 633. Line number = 771. Line number = 824. Line number = 964. Line number = 1110. Line number = 1252. Line number = 1296. Line number = 1344. Line number = 1386. Line number = 1468. Line number = 1580. Line number = 1669. Line number = 1718. Line number = 1793. Line number = 1847. Line number = 1961. Line number = 2060. Line number = 2136. Line number = 2174. Line number = 2215. Line number = 2253. Line number = 2304. Line number = 2366. Line number = 2418. Line number = 2458. Line number = 2497. Line number = 2566. Line number = 2626. Line number = 2686. Line number = 2724. Line number = 2762. + +Number of 'words' = 3022. +Length of 'Frequency Table' = 27601 bytes. + +Phase 4 - (Optional) Display 'Frequency Table' +Phase 5 - Construct 'Common Word Dictionary' +Phase 6 - Construct 'Message Descriptors' + +Line number = 67. Line number = 108. Line number = 163. Line number = 225. Line number = 284. Line number = 327. Line number = 380. Line number = 429. Line number = 498. Line number = 633. Line number = 771. Line number = 824. Line number = 964. Line number = 1110. Line number = 1252. Line number = 1296. Line number = 1344. Line number = 1386. Line number = 1468. Line number = 1580. Line number = 1669. Line number = 1718. Line number = 1793. Line number = 1847. Line number = 1961. Line number = 2060. Line number = 2136. Line number = 2174. Line number = 2215. Line number = 2253. Line number = 2304. Line number = 2366. Line number = 2418. Line number = 2458. Line number = 2497. Line number = 2566. Line number = 2626. Line number = 2686. Line number = 2724. Line number = 2762. + +Longest compressed message = 376 bytes. +Length compressed Message Desriptors = 21102 bytes. + +Phase 7 - Construct 'Word Dictionary' +Phase 8 - Construct 'Word Dictionary Index' +Phase 9 - Build Squash File + +Writing squash.dat ... + +File 'message.txt' length = 107885 bytes. +Number of characters = 65784. Number of words = 3022. + +File 'squash.dat' length = 31924 bytes. +Compressed size of message descriptors = 21102 bytes. +Compressed size of word dictionary = 10141 bytes. +Compression = 48% of filesize = 52% saved space. + + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Compiling file '../lancelt2.l9/aconst.txt'. End of source file. +Compiling file 'mconst.txt'. End of source file. +Compiling file 'sconst.txt'. End of source file. +Compiling file 'pconst.txt'. End of source file. +Compiling file '../lancelt2.l9/chain.txt'. End of source file. +Compiling file '../lancelt2.l9/aparse.txt'. End of source file. +Compiling file '../lancelt2.l9/acore.txt'. End of source file. +Compiling file '../lancelt2.l9/converse.txt'. End of source file. +Compiling file '../lancelt2.l9/npc.txt'. End of source file. +Compiling file '../lancelt2.l9/oops.txt'. End of source file. +Compiling file 'averb.txt'. End of source file. +Compiling file 'aspecial.txt'. End of source file. +Compiling file '../lancelt2.l9/score.txt'. End of source file. +Compiling file '../lancelt2.l9/book.txt'. End of source file. + +Number of vars=255 +Number of source lines=11270 + +Acode finish 1.1 (for Linux) +Copyright (C) 1986-1988 Level 9 Computing + +Loading exit.txt +Loading table.dat + A .. main.l9 +Only one sub-directory - proceeding with finish +Loading squash.dat +Saving acode.acd +Saving gamedata.dat + +Compiling Lancelot part 2 + +COMPACT 2.3 +7th September 1987 +Available memory = 1048576 bytes + +Options: N N 128 + + + + + Level 9 Adventures + + Copyright (C) 1986-1988 Level 9 Computing + + + + + A .. main.l9 +Only one sub-directory - proceeding with squash + +Phase 1 - Clear memory +Phase 2 - Sort into message number order + +Squashing. Please wait. + +Length of SMT = 85598 bytes. +Number of modifications = 336. +Number of text characters = 73950. + +Phase 3 - Construct 'Frequency Table' + +Line number = 45. Line number = 86. Line number = 140. Line number = 201. Line number = 261. Line number = 302. Line number = 339. Line number = 390. Line number = 437. Line number = 504. Line number = 626. Line number = 730. Line number = 834. Line number = 904. Line number = 968. Line number = 1036. Line number = 1161. Line number = 1313. Line number = 1488. Line number = 1657. Line number = 1813. Line number = 1964. Line number = 2018. Line number = 2062. Line number = 2141. Line number = 2213. Line number = 2286. Line number = 2342. Line number = 2424. Line number = 2487. Line number = 2553. Line number = 2601. Line number = 2687. Line number = 2753. Line number = 2791. Line number = 2873. Line number = 2970. Line number = 3016. Line number = 3089. Line number = 3168. Line number = 3234. Line number = 3271. Line number = 3307. + +Number of 'words' = 3207. +Length of 'Frequency Table' = 29134 bytes. + +Phase 4 - (Optional) Display 'Frequency Table' +Phase 5 - Construct 'Common Word Dictionary' +Phase 6 - Construct 'Message Descriptors' + +Line number = 45. Line number = 86. Line number = 140. Line number = 201. Line number = 261. Line number = 302. Line number = 339. Line number = 390. Line number = 437. Line number = 504. Line number = 626. Line number = 730. Line number = 834. Line number = 904. Line number = 968. Line number = 1036. Line number = 1161. Line number = 1313. Line number = 1488. Line number = 1657. Line number = 1813. Line number = 1964. Line number = 2018. Line number = 2062. Line number = 2141. Line number = 2213. Line number = 2286. Line number = 2342. Line number = 2424. Line number = 2487. Line number = 2553. Line number = 2601. Line number = 2687. Line number = 2753. Line number = 2791. Line number = 2873. Line number = 2970. Line number = 3016. Line number = 3089. Line number = 3168. Line number = 3234. Line number = 3271. Line number = 3307. + +Longest compressed message = 227 bytes. +Length compressed Message Desriptors = 23823 bytes. + +Phase 7 - Construct 'Word Dictionary' +Phase 8 - Construct 'Word Dictionary Index' +Phase 9 - Build Squash File + +Writing squash.dat ... + +File 'message.txt' length = 122326 bytes. +Number of characters = 73950. Number of words = 3207. + +File 'squash.dat' length = 35117 bytes. +Compressed size of message descriptors = 23823 bytes. +Compressed size of word dictionary = 10613 bytes. +Compression = 47% of filesize = 53% saved space. + + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Compiling file 'aconst.txt'. End of source file. +Compiling file '../lancelt1.l9/mconst.txt'. End of source file. +Compiling file '../lancelt1.l9/sconst.txt'. End of source file. +Compiling file 'pconst.txt'. End of source file. +Compiling file 'chain.txt'. End of source file. +Compiling file 'aparse.txt'. End of source file. +Compiling file 'acore.txt'. End of source file. +Compiling file 'converse.txt'. End of source file. +Compiling file 'npc.txt'. End of source file. +Compiling file 'oops.txt'. End of source file. +Compiling file 'averb.txt'. End of source file. +Compiling file 'aspecial.txt'. End of source file. +Compiling file 'book.txt'. End of source file. +Compiling file 'score.txt'. End of source file. + +Number of vars=255 +Number of source lines=12430 + +Acode finish 1.1 (for Linux) +Copyright (C) 1986-1988 Level 9 Computing + +Loading exit.txt +Can't find file on disk. +Loading table.dat +Can't find file on disk. + A .. main.l9 +Only one sub-directory - proceeding with finish +Loading squash.dat +Saving acode.acd +Saving gamedata.dat + +Compiling Lancelot part 3 +Level 9 table.dat generation done. + + +COMPACT 2.3 +7th September 1987 +Available memory = 1048576 bytes + +Options: N N 128 + + + + + Level 9 Adventures + + Copyright (C) 1986-1988 Level 9 Computing + + + + + A .. main.l9 +Only one sub-directory - proceeding with squash + +Phase 1 - Clear memory +Phase 2 - Sort into message number order + +Squashing. Please wait. + +Length of SMT = 75634 bytes. +Number of modifications = 251. +Number of text characters = 64964. + +Phase 3 - Construct 'Frequency Table' + +Line number = 64. Line number = 103. Line number = 155. Line number = 213. Line number = 272. Line number = 335. Line number = 396. Line number = 442. Line number = 526. Line number = 681. Line number = 792. Line number = 831. Line number = 972. Line number = 1113. Line number = 1301. Line number = 1447. Line number = 1495. Line number = 1546. Line number = 1596. Line number = 1683. Line number = 1792. Line number = 1878. Line number = 1949. Line number = 2035. Line number = 2100. Line number = 2154. Line number = 2210. Line number = 2253. Line number = 2317. Line number = 2384. Line number = 2443. Line number = 2484. Line number = 2523. Line number = 2573. Line number = 2656. Line number = 2699. Line number = 2737. Line number = 2775. Line number = 2825. Line number = 2869. Line number = 2910. Line number = 2947. + +Number of 'words' = 2905. +Length of 'Frequency Table' = 26421 bytes. + +Phase 4 - (Optional) Display 'Frequency Table' +Phase 5 - Construct 'Common Word Dictionary' +Phase 6 - Construct 'Message Descriptors' + +Line number = 64. Line number = 103. Line number = 155. Line number = 213. Line number = 272. Line number = 335. Line number = 396. Line number = 442. Line number = 526. Line number = 681. Line number = 792. Line number = 831. Line number = 972. Line number = 1113. Line number = 1301. Line number = 1447. Line number = 1495. Line number = 1546. Line number = 1596. Line number = 1683. Line number = 1792. Line number = 1878. Line number = 1949. Line number = 2035. Line number = 2100. Line number = 2154. Line number = 2210. Line number = 2253. Line number = 2317. Line number = 2384. Line number = 2443. Line number = 2484. Line number = 2523. Line number = 2573. Line number = 2656. Line number = 2699. Line number = 2737. Line number = 2775. Line number = 2825. Line number = 2869. Line number = 2910. Line number = 2947. + +Longest compressed message = 193 bytes. +Length compressed Message Desriptors = 21243 bytes. + +Phase 7 - Construct 'Word Dictionary' +Phase 8 - Construct 'Word Dictionary Index' +Phase 9 - Build Squash File + +Writing squash.dat ... + +File 'message.txt' length = 108702 bytes. +Number of characters = 64964. Number of words = 2905. + +File 'squash.dat' length = 31513 bytes. +Compressed size of message descriptors = 21243 bytes. +Compressed size of word dictionary = 9585 bytes. +Compression = 48% of filesize = 52% saved space. + + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Compiling file '../lancelt2.l9/aconst.txt'. End of source file. +Compiling file '../lancelt1.l9/mconst.txt'. End of source file. +Compiling file 'sconst.txt'. End of source file. +Compiling file 'pconst.txt'. End of source file. +Compiling file '../lancelt2.l9/chain.txt'. End of source file. +Compiling file '../lancelt2.l9/aparse.txt'. End of source file. +Compiling file 'acore.txt'. End of source file. +Compiling file '../lancelt2.l9/converse.txt'. End of source file. +Compiling file '../lancelt2.l9/npc.txt'. End of source file. +Compiling file '../lancelt2.l9/oops.txt'. End of source file. +Compiling file 'averb.txt'. End of source file. +Compiling file 'aspecial.txt'. End of source file. +Compiling file '../lancelt2.l9/score.txt'. End of source file. +Compiling file '../lancelt2.l9/book.txt'. End of source file. + +Number of vars=226 +Number of source lines=11528 + +Acode finish 1.1 (for Linux) +Copyright (C) 1986-1988 Level 9 Computing + +Loading exit.txt +Loading table.dat + A .. main.l9 +Only one sub-directory - proceeding with finish +Loading squash.dat +Saving acode.acd +Saving gamedata.dat + +Compiling Ingrid's Back part 1 +Level 9 table.dat generation done. + + +COMPACT 2.3 +7th September 1987 +Available memory = 1048576 bytes + +Options: N N 128 + + + + + Level 9 Adventures + + Copyright (C) 1986-1988 Level 9 Computing + + + + + A .. main.l9 +Only one sub-directory - proceeding with squash + +Phase 1 - Clear memory +Phase 2 - Sort into message number order + +Squashing. Please wait. + +Length of SMT = 86946 bytes. +Number of modifications = 440. +Number of text characters = 77370. + +Phase 3 - Construct 'Frequency Table' + +Line number = 70. Line number = 107. Line number = 159. Line number = 216. Line number = 284. Line number = 335. Line number = 378. Line number = 421. Line number = 469. Line number = 558. Line number = 723. Line number = 891. Line number = 927. Line number = 1057. Line number = 1204. Line number = 1352. Line number = 1399. Line number = 1443. Line number = 1512. Line number = 1579. Line number = 1633. Line number = 1705. Line number = 1811. Line number = 1856. Line number = 1909. Line number = 1954. Line number = 2005. Line number = 2072. Line number = 2142. Line number = 2189. Line number = 2243. Line number = 2310. Line number = 2355. Line number = 2404. Line number = 2501. Line number = 2603. Line number = 2736. Line number = 2819. Line number = 2901. + +Number of 'words' = 3022. +Length of 'Frequency Table' = 27642 bytes. + +Phase 4 - (Optional) Display 'Frequency Table' +Phase 5 - Construct 'Common Word Dictionary' +Phase 6 - Construct 'Message Descriptors' + +Line number = 70. Line number = 107. Line number = 159. Line number = 216. Line number = 284. Line number = 335. Line number = 378. Line number = 421. Line number = 469. Line number = 558. Line number = 723. Line number = 891. Line number = 927. Line number = 1057. Line number = 1204. Line number = 1352. Line number = 1399. Line number = 1443. Line number = 1512. Line number = 1579. Line number = 1633. Line number = 1705. Line number = 1811. Line number = 1856. Line number = 1909. Line number = 1954. Line number = 2005. Line number = 2072. Line number = 2142. Line number = 2189. Line number = 2243. Line number = 2310. Line number = 2355. Line number = 2404. Line number = 2501. Line number = 2603. Line number = 2736. Line number = 2819. Line number = 2901. + +Longest compressed message = 323 bytes. +Length compressed Message Desriptors = 24832 bytes. + +Phase 7 - Construct 'Word Dictionary' +Phase 8 - Construct 'Word Dictionary Index' +Phase 9 - Build Squash File + +Writing squash.dat ... + +File 'message.txt' length = 116718 bytes. +Number of characters = 77370. Number of words = 3022. + +File 'squash.dat' length = 35595 bytes. +Compressed size of message descriptors = 24832 bytes. +Compressed size of word dictionary = 10082 bytes. +Compression = 46% of filesize = 54% saved space. + + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Compiling file 'aconst.txt'. End of source file. +Compiling file '../ingrid1.l9/mconst.txt'. End of source file. +Compiling file 'sconst.txt'. End of source file. +Compiling file 'pconst.txt'. End of source file. +Compiling file '../ingrid1.l9/chain.txt'. End of source file. +Compiling file 'aparse.txt'. End of source file. +Compiling file 'acore.txt'. End of source file. +Compiling file 'converse.txt'. End of source file. +Compiling file 'npc.txt'. End of source file. +Compiling file '../ingrid1.l9/oops.txt'. End of source file. +Compiling file 'averb.txt'. End of source file. +Compiling file 'aspecial.txt'. End of source file. +Compiling file 'score.txt'. End of source file. +Compiling file '../ingrid1.l9/book.txt'. End of source file. + +Number of vars=219 +Number of source lines=10936 + +Acode finish 1.1 (for Linux) +Copyright (C) 1986-1988 Level 9 Computing + +Loading exit.txt +Loading table.dat + A .. main.l9 +Only one sub-directory - proceeding with finish +Loading squash.dat +Saving acode.acd +Saving gamedata.dat + +Compiling Ingrid's Back part 2 +Level 9 table.dat generation done. + + +COMPACT 2.3 +7th September 1987 +Available memory = 1048576 bytes + +Options: N N 128 + + + + + Level 9 Adventures + + Copyright (C) 1986-1988 Level 9 Computing + + + + + A .. main.l9 +Only one sub-directory - proceeding with squash + +Phase 1 - Clear memory +Phase 2 - Sort into message number order + +Squashing. Please wait. + +Length of SMT = 75319 bytes. +Number of modifications = 317. +Number of text characters = 66491. + +Phase 3 - Construct 'Frequency Table' + +Line number = 70. Line number = 108. Line number = 159. Line number = 212. Line number = 277. Line number = 334. Line number = 378. Line number = 439. Line number = 483. Line number = 627. Line number = 763. Line number = 849. Line number = 927. Line number = 1057. Line number = 1187. Line number = 1228. Line number = 1274. Line number = 1317. Line number = 1410. Line number = 1476. Line number = 1539. Line number = 1639. Line number = 1721. Line number = 1786. Line number = 1868. Line number = 1985. Line number = 2034. Line number = 2086. Line number = 2130. Line number = 2195. Line number = 2258. Line number = 2311. Line number = 2393. Line number = 2438. Line number = 2492. Line number = 2607. Line number = 2710. + +Number of 'words' = 2688. +Length of 'Frequency Table' = 24387 bytes. + +Phase 4 - (Optional) Display 'Frequency Table' +Phase 5 - Construct 'Common Word Dictionary' +Phase 6 - Construct 'Message Descriptors' + +Line number = 70. Line number = 108. Line number = 159. Line number = 212. Line number = 277. Line number = 334. Line number = 378. Line number = 439. Line number = 483. Line number = 627. Line number = 763. Line number = 849. Line number = 927. Line number = 1057. Line number = 1187. Line number = 1228. Line number = 1274. Line number = 1317. Line number = 1410. Line number = 1476. Line number = 1539. Line number = 1639. Line number = 1721. Line number = 1786. Line number = 1868. Line number = 1985. Line number = 2034. Line number = 2086. Line number = 2130. Line number = 2195. Line number = 2258. Line number = 2311. Line number = 2393. Line number = 2438. Line number = 2492. Line number = 2607. Line number = 2710. + +Longest compressed message = 389 bytes. +Length compressed Message Desriptors = 21691 bytes. + +Phase 7 - Construct 'Word Dictionary' +Phase 8 - Construct 'Word Dictionary Index' +Phase 9 - Build Squash File + +Writing squash.dat ... + +File 'message.txt' length = 104712 bytes. +Number of characters = 66491. Number of words = 2688. + +File 'squash.dat' length = 31371 bytes. +Compressed size of message descriptors = 21691 bytes. +Compressed size of word dictionary = 8999 bytes. +Compression = 47% of filesize = 53% saved space. + + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Compiling file 'aconst.txt'. End of source file. +Compiling file '../ingrid1.l9/mconst.txt'. End of source file. +Compiling file 'sconst.txt'. End of source file. +Compiling file 'pconst.txt'. End of source file. +Compiling file '../ingrid1.l9/chain.txt'. End of source file. +Compiling file 'aparse.txt'. End of source file. +Compiling file 'acore.txt'. End of source file. +Compiling file 'converse.txt'. End of source file. +Compiling file 'npc.txt'. End of source file. +Compiling file '../ingrid1.l9/oops.txt'. End of source file. +Compiling file 'averb.txt'. End of source file. +Compiling file 'aspecial.txt'. End of source file. +Compiling file 'score.txt'. End of source file. +Compiling file '../ingrid1.l9/book.txt'. End of source file. + +Number of vars=229 +Number of source lines=11913 + +Acode finish 1.1 (for Linux) +Copyright (C) 1986-1988 Level 9 Computing + +Loading exit.txt +Loading table.dat + A .. main.l9 +Only one sub-directory - proceeding with finish +Loading squash.dat +Saving acode.acd +Saving gamedata.dat + +Compiling Ingrid's Back part 3 +Level 9 table.dat generation done. + + +COMPACT 2.3 +7th September 1987 +Available memory = 1048576 bytes + +Options: N N 128 + + + + + Level 9 Adventures + + Copyright (C) 1986-1988 Level 9 Computing + + + + + A .. main.l9 +Only one sub-directory - proceeding with squash + +Phase 1 - Clear memory +Phase 2 - Sort into message number order + +Squashing. Please wait. + +Length of SMT = 88079 bytes. +Number of modifications = 548. +Number of text characters = 78959. + +Phase 3 - Construct 'Frequency Table' + +Line number = 71. Line number = 108. Line number = 161. Line number = 202. Line number = 276. Line number = 320. Line number = 355. Line number = 406. Line number = 451. Line number = 562. Line number = 691. Line number = 796. Line number = 857. Line number = 900. Line number = 1031. Line number = 1160. Line number = 1292. Line number = 1370. Line number = 1411. Line number = 1453. Line number = 1515. Line number = 1563. Line number = 1613. Line number = 1714. Line number = 1842. Line number = 1968. Line number = 2170. Line number = 2222. Line number = 2270. Line number = 2329. Line number = 2387. Line number = 2444. Line number = 2495. Line number = 2540. Line number = 2601. Line number = 2697. Line number = 2793. + +Number of 'words' = 3103. +Length of 'Frequency Table' = 28379 bytes. + +Phase 4 - (Optional) Display 'Frequency Table' +Phase 5 - Construct 'Common Word Dictionary' +Phase 6 - Construct 'Message Descriptors' + +Line number = 71. Line number = 108. Line number = 161. Line number = 202. Line number = 276. Line number = 320. Line number = 355. Line number = 406. Line number = 451. Line number = 562. Line number = 691. Line number = 796. Line number = 857. Line number = 900. Line number = 1031. Line number = 1160. Line number = 1292. Line number = 1370. Line number = 1411. Line number = 1453. Line number = 1515. Line number = 1563. Line number = 1613. Line number = 1714. Line number = 1842. Line number = 1968. Line number = 2170. Line number = 2222. Line number = 2270. Line number = 2329. Line number = 2387. Line number = 2444. Line number = 2495. Line number = 2540. Line number = 2601. Line number = 2697. Line number = 2793. + +Longest compressed message = 373 bytes. +Length compressed Message Desriptors = 25848 bytes. + +Phase 7 - Construct 'Word Dictionary' +Phase 8 - Construct 'Word Dictionary Index' +Phase 9 - Build Squash File + +Writing squash.dat ... + +File 'message.txt' length = 111962 bytes. +Number of characters = 78959. Number of words = 3103. + +File 'squash.dat' length = 37233 bytes. +Compressed size of message descriptors = 25848 bytes. +Compressed size of word dictionary = 10704 bytes. +Compression = 47% of filesize = 53% saved space. + + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Compiling file 'aconst.txt'. End of source file. +Compiling file '../ingrid1.l9/mconst.txt'. End of source file. +Compiling file 'sconst.txt'. End of source file. +Compiling file 'pconst.txt'. End of source file. +Compiling file '../ingrid1.l9/chain.txt'. End of source file. +Compiling file 'aparse.txt'. End of source file. +Compiling file 'acore.txt'. End of source file. +Compiling file 'converse.txt'. End of source file. +Compiling file 'npc.txt'. End of source file. +Compiling file '../ingrid1.l9/oops.txt'. End of source file. +Compiling file 'averb.txt'. End of source file. +Compiling file 'aspecial.txt'. End of source file. +Compiling file 'score.txt'. End of source file. +Compiling file '../ingrid1.l9/book.txt'. End of source file. + +Number of vars=230 +Number of source lines=11413 + +Acode finish 1.1 (for Linux) +Copyright (C) 1986-1988 Level 9 Computing + +Loading exit.txt +Loading table.dat + A .. main.l9 +Only one sub-directory - proceeding with finish +Loading squash.dat +Saving acode.acd +Saving gamedata.dat + +Compiling Scapeghost part 1 +Level 9 table.dat generation done. + + +COMPACT 2.3 +7th September 1987 +Available memory = 1048576 bytes + +Options: N N 128 + + + + + Level 9 Adventures + + Copyright (C) 1986-1988 Level 9 Computing + + + + + A .. main.l9 +Only one sub-directory - proceeding with squash + +Phase 1 - Clear memory +Phase 2 - Sort into message number order + +Squashing. Please wait. + +Length of SMT = 72878 bytes. +Number of modifications = 376. +Number of text characters = 64026. + +Phase 3 - Construct 'Frequency Table' + +Line number = 77. Line number = 113. Line number = 170. Line number = 238. Line number = 310. Line number = 353. Line number = 397. Line number = 463. Line number = 509. Line number = 615. Line number = 721. Line number = 814. Line number = 904. Line number = 995. Line number = 1106. Line number = 1228. Line number = 1310. Line number = 1352. Line number = 1423. Line number = 1473. Line number = 1528. Line number = 1572. Line number = 1646. Line number = 1733. Line number = 1841. Line number = 1940. Line number = 1992. Line number = 2036. Line number = 2087. Line number = 2131. Line number = 2247. Line number = 2396. Line number = 2521. Line number = 2630. Line number = 2739. + +Number of 'words' = 2685. +Length of 'Frequency Table' = 24170 bytes. + +Phase 4 - (Optional) Display 'Frequency Table' +Phase 5 - Construct 'Common Word Dictionary' +Phase 6 - Construct 'Message Descriptors' + +Line number = 77. Line number = 113. Line number = 170. Line number = 238. Line number = 310. Line number = 353. Line number = 397. Line number = 463. Line number = 509. Line number = 615. Line number = 721. Line number = 814. Line number = 904. Line number = 995. Line number = 1106. Line number = 1228. Line number = 1310. Line number = 1352. Line number = 1423. Line number = 1473. Line number = 1528. Line number = 1572. Line number = 1646. Line number = 1733. Line number = 1841. Line number = 1940. Line number = 1992. Line number = 2036. Line number = 2087. Line number = 2131. Line number = 2247. Line number = 2396. Line number = 2521. Line number = 2630. Line number = 2739. + +Longest compressed message = 333 bytes. +Length compressed Message Desriptors = 21695 bytes. + +Phase 7 - Construct 'Word Dictionary' +Phase 8 - Construct 'Word Dictionary Index' +Phase 9 - Build Squash File + +Writing squash.dat ... + +File 'message.txt' length = 103065 bytes. +Number of characters = 64026. Number of words = 2685. + +File 'squash.dat' length = 30984 bytes. +Compressed size of message descriptors = 21695 bytes. +Compressed size of word dictionary = 8608 bytes. +Compression = 48% of filesize = 52% saved space. + + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Compiling file 'aconst.txt'. End of source file. +Compiling file 'mconst.txt'. End of source file. +Compiling file 'sconst.txt'. End of source file. +Compiling file 'pconst.txt'. End of source file. +Compiling file 'chain.txt'. End of source file. +Compiling file 'aparse.txt'. End of source file. +Compiling file 'acore.txt'. End of source file. +Compiling file 'converse.txt'. End of source file. +Compiling file 'npc.txt'. End of source file. +Compiling file 'oops.txt'. End of source file. +Compiling file 'averb.txt'. End of source file. +Compiling file 'aspecial.txt'. End of source file. +Compiling file 'score.txt'. End of source file. +Compiling file 'book.txt'. End of source file. + +Number of vars=217 +Number of source lines=11505 + +Acode finish 1.1 (for Linux) +Copyright (C) 1986-1988 Level 9 Computing + +Loading exit.txt +Loading table.dat + A .. main.l9 +Only one sub-directory - proceeding with finish +Loading squash.dat +Saving acode.acd +Saving gamedata.dat + +Compiling Scapeghost part 2 +Level 9 table.dat generation done. + + +COMPACT 2.3 +7th September 1987 +Available memory = 1048576 bytes + +Options: N N 128 + + + + + Level 9 Adventures + + Copyright (C) 1986-1988 Level 9 Computing + + + + + A .. main.l9 +Only one sub-directory - proceeding with squash + +Phase 1 - Clear memory +Phase 2 - Sort into message number order + +Squashing. Please wait. + +Length of SMT = 54176 bytes. +Number of modifications = 231. +Number of text characters = 47076. + +Phase 3 - Construct 'Frequency Table' + +Line number = 78. Line number = 116. Line number = 174. Line number = 228. Line number = 298. Line number = 344. Line number = 416. Line number = 460. Line number = 621. Line number = 754. Line number = 877. Line number = 1030. Line number = 1110. Line number = 1156. Line number = 1219. Line number = 1266. Line number = 1327. Line number = 1441. Line number = 1517. Line number = 1623. Line number = 1718. Line number = 1805. Line number = 1849. Line number = 1901. Line number = 1989. Line number = 2155. + +Number of 'words' = 2121. +Length of 'Frequency Table' = 19177 bytes. + +Phase 4 - (Optional) Display 'Frequency Table' +Phase 5 - Construct 'Common Word Dictionary' +Phase 6 - Construct 'Message Descriptors' + +Line number = 78. Line number = 116. Line number = 174. Line number = 228. Line number = 298. Line number = 344. Line number = 416. Line number = 460. Line number = 621. Line number = 754. Line number = 877. Line number = 1030. Line number = 1110. Line number = 1156. Line number = 1219. Line number = 1266. Line number = 1327. Line number = 1441. Line number = 1517. Line number = 1623. Line number = 1718. Line number = 1805. Line number = 1849. Line number = 1901. Line number = 1989. Line number = 2155. + +Longest compressed message = 177 bytes. +Length compressed Message Desriptors = 15288 bytes. + +Phase 7 - Construct 'Word Dictionary' +Phase 8 - Construct 'Word Dictionary Index' +Phase 9 - Build Squash File + +Writing squash.dat ... + +File 'message.txt' length = 82287 bytes. +Number of characters = 47076. Number of words = 2121. + +File 'squash.dat' length = 22815 bytes. +Compressed size of message descriptors = 15288 bytes. +Compressed size of word dictionary = 6846 bytes. +Compression = 48% of filesize = 52% saved space. + + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Compiling file 'aconst.txt'. End of source file. +Compiling file '../part1.l9/mconst.txt'. End of source file. +Compiling file 'sconst.txt'. End of source file. +Compiling file 'pconst.txt'. End of source file. +Compiling file '../part1.l9/chain.txt'. End of source file. +Compiling file 'aparse.txt'. End of source file. +Compiling file 'acore.txt'. End of source file. +Compiling file 'converse.txt'. End of source file. +Compiling file 'npc.txt'. End of source file. +Compiling file '../part1.l9/oops.txt'. End of source file. +Compiling file 'averb.txt'. End of source file. +Compiling file 'aspecial.txt'. End of source file. +Compiling file 'score.txt'. End of source file. +Compiling file '../part1.l9/book.txt'. End of source file. + +Number of vars=204 +Number of source lines=11332 + +Acode finish 1.1 (for Linux) +Copyright (C) 1986-1988 Level 9 Computing + +Loading exit.txt +Loading table.dat + A .. main.l9 +Only one sub-directory - proceeding with finish +Loading squash.dat +Saving acode.acd +Saving gamedata.dat + +Compiling Scapeghost part 3 +Level 9 table.dat generation done. + + +COMPACT 2.3 +7th September 1987 +Available memory = 1048576 bytes + +Options: N N 128 + + + + + Level 9 Adventures + + Copyright (C) 1986-1988 Level 9 Computing + + + + + A .. main.l9 +Only one sub-directory - proceeding with squash + +Phase 1 - Clear memory +Phase 2 - Sort into message number order + +Squashing. Please wait. + +Length of SMT = 71930 bytes. +Number of modifications = 352. +Number of text characters = 64242. + +Phase 3 - Construct 'Frequency Table' + +Line number = 78. Line number = 115. Line number = 170. Line number = 217. Line number = 300. Line number = 342. Line number = 412. Line number = 456. Line number = 606. Line number = 752. Line number = 861. Line number = 1056. Line number = 1166. Line number = 1224. Line number = 1287. Line number = 1337. Line number = 1386. Line number = 1468. Line number = 1549. Line number = 1658. Line number = 1747. Line number = 1866. Line number = 1939. Line number = 1983. Line number = 2036. Line number = 2080. Line number = 2194. Line number = 2328. Line number = 2480. Line number = 2639. Line number = 2754. + +Number of 'words' = 2547. +Length of 'Frequency Table' = 23115 bytes. + +Phase 4 - (Optional) Display 'Frequency Table' +Phase 5 - Construct 'Common Word Dictionary' +Phase 6 - Construct 'Message Descriptors' + +Line number = 78. Line number = 115. Line number = 170. Line number = 217. Line number = 300. Line number = 342. Line number = 412. Line number = 456. Line number = 606. Line number = 752. Line number = 861. Line number = 1056. Line number = 1166. Line number = 1224. Line number = 1287. Line number = 1337. Line number = 1386. Line number = 1468. Line number = 1549. Line number = 1658. Line number = 1747. Line number = 1866. Line number = 1939. Line number = 1983. Line number = 2036. Line number = 2080. Line number = 2194. Line number = 2328. Line number = 2480. Line number = 2639. Line number = 2754. + +Longest compressed message = 190 bytes. +Length compressed Message Desriptors = 20866 bytes. + +Phase 7 - Construct 'Word Dictionary' +Phase 8 - Construct 'Word Dictionary Index' +Phase 9 - Build Squash File + +Writing squash.dat ... + +File 'message.txt' length = 105496 bytes. +Number of characters = 64242. Number of words = 2547. + +File 'squash.dat' length = 29798 bytes. +Compressed size of message descriptors = 20866 bytes. +Compressed size of word dictionary = 8251 bytes. +Compression = 46% of filesize = 54% saved space. + + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Compiling file 'aconst.txt'. End of source file. +Compiling file '../part1.l9/mconst.txt'. End of source file. +Compiling file 'sconst.txt'. End of source file. +Compiling file 'pconst.txt'. End of source file. +Compiling file '../part1.l9/chain.txt'. End of source file. +Compiling file 'aparse.txt'. End of source file. +Compiling file 'acore.txt'. End of source file. +Compiling file 'converse.txt'. End of source file. +Compiling file 'npc.txt'. End of source file. +Compiling file '../part1.l9/oops.txt'. End of source file. +Compiling file 'averb.txt'. End of source file. +Compiling file 'aspecial.txt'. End of source file. +Compiling file 'score.txt'. End of source file. +Compiling file '../part1.l9/book.txt'. End of source file. + +Number of vars=215 +Number of source lines=11563 + +Acode finish 1.1 (for Linux) +Copyright (C) 1986-1988 Level 9 Computing + +Loading exit.txt +Loading table.dat + A .. main.l9 +Only one sub-directory - proceeding with finish +Loading squash.dat +Saving acode.acd +Saving gamedata.dat + +Compiling Lords of Time +Level 9 table.dat generation done. + + +COMPACT 2.3 +7th September 1987 +Available memory = 1048576 bytes + +Options: N N 128 + + + + + Level 9 Adventures + + Copyright (C) 1986-1988 Level 9 Computing + + + + + A .. st.l9 +Only one sub-directory - proceeding with squash + +Phase 1 - Clear memory +Phase 2 - Sort into message number order + +Squashing. Please wait. + +Length of SMT = 82450 bytes. +Number of modifications = 304. +Number of text characters = 70741. + +Phase 3 - Construct 'Frequency Table' + +Line number = 47. Line number = 84. Line number = 120. Line number = 155. Line number = 192. Line number = 247. Line number = 297. Line number = 358. Line number = 404. Line number = 455. Line number = 526. Line number = 562. Line number = 601. Line number = 636. Line number = 669. Line number = 705. Line number = 737. Line number = 769. Line number = 805. Line number = 939. Line number = 1079. Line number = 1215. Line number = 1254. Line number = 1306. Line number = 1347. Line number = 1383. Line number = 1418. Line number = 1486. Line number = 1569. Line number = 1614. Line number = 1690. Line number = 1751. Line number = 1833. Line number = 1901. Line number = 1976. Line number = 2043. Line number = 2113. Line number = 2181. Line number = 2217. Line number = 2253. + +Number of 'words' = 3557. +Length of 'Frequency Table' = 33437 bytes. + +Phase 4 - (Optional) Display 'Frequency Table' +Phase 5 - Construct 'Common Word Dictionary' +Phase 6 - Construct 'Message Descriptors' + +Line number = 47. Line number = 84. Line number = 120. Line number = 155. Line number = 192. Line number = 247. Line number = 297. Line number = 358. Line number = 404. Line number = 455. Line number = 526. Line number = 562. Line number = 601. Line number = 636. Line number = 669. Line number = 705. Line number = 737. Line number = 769. Line number = 805. Line number = 939. Line number = 1079. Line number = 1215. Line number = 1254. Line number = 1306. Line number = 1347. Line number = 1383. Line number = 1418. Line number = 1486. Line number = 1569. Line number = 1614. Line number = 1690. Line number = 1751. Line number = 1833. Line number = 1901. Line number = 1976. Line number = 2043. Line number = 2113. Line number = 2181. Line number = 2217. Line number = 2253. + +Longest compressed message = 428 bytes. +Length compressed Message Desriptors = 23120 bytes. + +Phase 7 - Construct 'Word Dictionary' +Phase 8 - Construct 'Word Dictionary Index' +Phase 9 - Build Squash File + +Writing squash.dat ... + +File 'message.txt' length = 93695 bytes. +Number of characters = 70741. Number of words = 3557. + +File 'squash.dat' length = 35908 bytes. +Compressed size of message descriptors = 23120 bytes. +Compressed size of word dictionary = 12103 bytes. +Compression = 50% of filesize = 50% saved space. + + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Compiling file 'mconst.txt'. End of source file. +Compiling file 'pconst.txt'. End of source file. +Compiling file 'aconst.txt'. End of source file. +Compiling file 'apconst.txt'. End of source file. +Compiling file '../red_moon.l9/acore.txt'. End of source file. +Compiling file '../red_moon.l9/aparse.txt'. End of source file. +Compiling file '../red_moon.l9/hires.txt'. End of source file. +Compiling file 'demo.txt'. End of source file. +Compiling file 'aspecial.txt'. End of source file. +Compiling file '../red_moon.l9/oops.txt'. End of source file. +Compiling file '../red_moon.l9/chain.txt'. End of source file. +Compiling file '../red_moon.l9/book.txt'. End of source file. +Compiling file '../red_moon.l9/cheat.txt'. End of source file. + +Number of vars=192 +Number of source lines=5804 + +Acode finish 1.1 (for Linux) +Copyright (C) 1986-1988 Level 9 Computing + +Loading exit.txt +Loading table.dat + A .. st.l9 +Only one sub-directory - proceeding with finish +Loading squash.dat +Saving acode.acd +Saving gamedata.dat + +Compiling Red Moon +Level 9 table.dat generation done. + + +COMPACT 2.3 +7th September 1987 +Available memory = 1048576 bytes + +Options: N N 128 + + + + + Level 9 Adventures + + Copyright (C) 1986-1988 Level 9 Computing + + + + + A .. st.l9 +Only one sub-directory - proceeding with squash + +Phase 1 - Clear memory +Phase 2 - Sort into message number order + +Squashing. Please wait. + +Length of SMT = 55115 bytes. +Number of modifications = 171. +Number of text characters = 46309. + +Phase 3 - Construct 'Frequency Table' + +Line number = 48. Line number = 83. Line number = 117. Line number = 155. Line number = 191. Line number = 253. Line number = 300. Line number = 338. Line number = 384. Line number = 436. Line number = 500. Line number = 532. Line number = 565. Line number = 597. Line number = 630. Line number = 662. Line number = 694. Line number = 804. Line number = 935. Line number = 1034. Line number = 1143. Line number = 1250. Line number = 1349. Line number = 1447. Line number = 1534. Line number = 1588. Line number = 1630. Line number = 1674. Line number = 1723. Line number = 1797. + +Number of 'words' = 2681. +Length of 'Frequency Table' = 24787 bytes. + +Phase 4 - (Optional) Display 'Frequency Table' +Phase 5 - Construct 'Common Word Dictionary' +Phase 6 - Construct 'Message Descriptors' + +Line number = 48. Line number = 83. Line number = 117. Line number = 155. Line number = 191. Line number = 253. Line number = 300. Line number = 338. Line number = 384. Line number = 436. Line number = 500. Line number = 532. Line number = 565. Line number = 597. Line number = 630. Line number = 662. Line number = 694. Line number = 804. Line number = 935. Line number = 1034. Line number = 1143. Line number = 1250. Line number = 1349. Line number = 1447. Line number = 1534. Line number = 1588. Line number = 1630. Line number = 1674. Line number = 1723. Line number = 1797. + +Longest compressed message = 319 bytes. +Length compressed Message Desriptors = 15355 bytes. + +Phase 7 - Construct 'Word Dictionary' +Phase 8 - Construct 'Word Dictionary Index' +Phase 9 - Build Squash File + +Writing squash.dat ... + +File 'message.txt' length = 63819 bytes. +Number of characters = 46309. Number of words = 2681. + +File 'squash.dat' length = 25304 bytes. +Compressed size of message descriptors = 15355 bytes. +Compressed size of word dictionary = 9256 bytes. +Compression = 54% of filesize = 46% saved space. + + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Compiling file '../timelord.l9/mconst.txt'. End of source file. +Compiling file 'pconst.txt'. End of source file. +Compiling file 'aconst.txt'. End of source file. +Compiling file 'apconst.txt'. End of source file. +Compiling file 'acore.txt'. End of source file. +Compiling file 'aparse.txt'. End of source file. +Compiling file 'hires.txt'. End of source file. +Compiling file 'aspecial.txt'. End of source file. +Compiling file 'oops.txt'. End of source file. +Compiling file 'chain.txt'. End of source file. +Compiling file 'book.txt'. End of source file. +Compiling file 'cheat.txt'. End of source file. + +Number of vars=191 +Number of source lines=5687 + +Acode finish 1.1 (for Linux) +Copyright (C) 1986-1988 Level 9 Computing + +Loading exit.txt +Loading table.dat + A .. st.l9 +Only one sub-directory - proceeding with finish +Loading squash.dat +Saving acode.acd +Saving gamedata.dat + +Compiling The Price of Magik + +COMPACT 2.3 +7th September 1987 +Available memory = 1048576 bytes + +Options: N N 128 + + + + + Level 9 Adventures + + Copyright (C) 1986-1988 Level 9 Computing + + + + + A .. msx.l9 +Only one sub-directory - proceeding with squash + +Phase 1 - Clear memory +Phase 2 - Sort into message number order + +Squashing. Please wait. + +Length of SMT = 73002 bytes. +Number of modifications = 254. +Number of text characters = 62732. + +Phase 3 - Construct 'Frequency Table' + +Line number = 46. Line number = 81. Line number = 115. Line number = 153. Line number = 189. Line number = 246. Line number = 295. Line number = 335. Line number = 385. Line number = 437. Line number = 501. Line number = 533. Line number = 566. Line number = 598. Line number = 631. Line number = 663. Line number = 695. Line number = 843. Line number = 1005. Line number = 1106. Line number = 1231. Line number = 1351. Line number = 1473. Line number = 1631. Line number = 1729. Line number = 1815. Line number = 1861. Line number = 1901. Line number = 1945. Line number = 2019. Line number = 2078. Line number = 2118. Line number = 2153. + +Number of 'words' = 3334. +Length of 'Frequency Table' = 31066 bytes. + +Phase 4 - (Optional) Display 'Frequency Table' +Phase 5 - Construct 'Common Word Dictionary' +Phase 6 - Construct 'Message Descriptors' + +Line number = 46. Line number = 81. Line number = 115. Line number = 153. Line number = 189. Line number = 246. Line number = 295. Line number = 335. Line number = 385. Line number = 437. Line number = 501. Line number = 533. Line number = 566. Line number = 598. Line number = 631. Line number = 663. Line number = 695. Line number = 843. Line number = 1005. Line number = 1106. Line number = 1231. Line number = 1351. Line number = 1473. Line number = 1631. Line number = 1729. Line number = 1815. Line number = 1861. Line number = 1901. Line number = 1945. Line number = 2019. Line number = 2078. Line number = 2118. Line number = 2153. + +Longest compressed message = 353 bytes. +Length compressed Message Desriptors = 20498 bytes. + +Phase 7 - Construct 'Word Dictionary' +Phase 8 - Construct 'Word Dictionary Index' +Phase 9 - Build Squash File + +Writing squash.dat ... + +File 'message.txt' length = 82437 bytes. +Number of characters = 62732. Number of words = 3334. + +File 'squash.dat' length = 32642 bytes. +Compressed size of message descriptors = 20498 bytes. +Compressed size of word dictionary = 11451 bytes. +Compression = 52% of filesize = 48% saved space. + + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Compiling file '../timelord.l9/mconst.txt'. End of source file. +Compiling file 'pconst.txt'. End of source file. +Compiling file 'aconst.txt'. End of source file. +Compiling file 'acore.txt'. End of source file. +Compiling file 'aparse.txt'. End of source file. +Compiling file '../red_moon.l9/hires.txt'. End of source file. +Compiling file 'averb.txt'. End of source file. +Compiling file 'aspecial.txt'. End of source file. +Compiling file '../red_moon.l9/book.txt'. End of source file. +Compiling file '../red_moon.l9/cheat.txt'. End of source file. + +Number of vars=158 +Number of source lines=7946 + +Acode finish 1.1 (for Linux) +Copyright (C) 1986-1988 Level 9 Computing + +Loading exit.txt +Loading table.dat + A .. msx.l9 +Only one sub-directory - proceeding with finish +Loading squash.dat +Saving acode.acd +Saving gamedata.dat + +Compiling Snowball +Level 9 table.dat generation done. + + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Compiling file 'aconst.txt'. End of source file. +Compiling file 'apconst.txt'. End of source file. +Compiling file 'acore.txt'. End of source file. +Compiling file 'aparse.txt'. End of source file. +Compiling file 'aspecial.txt'. End of source file. +Compiling file 'chain.txt'. End of source file. +Compiling file 'oops.txt'. End of source file. +Compiling file 'book.txt'. End of source file. + +Number of vars=196 +Number of source lines=5334 + +Acode finish 1.1 (for Linux) +Copyright (C) 1986-1988 Level 9 Computing + +Loading exit.txt +Loading table.dat + A .. st.l9 +Only one sub-directory - proceeding with finish +Loading squash.dat +Saving acode.acd +Saving gamedata.dat + +Compiling Return to Eden +Level 9 table.dat generation done. + + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Compiling file 'aconst.txt'. End of source file. +Compiling file 'apconst.txt'. End of source file. +Compiling file 'acore.txt'. End of source file. +Compiling file 'aparse.txt'. End of source file. +Compiling file 'aspecial.txt'. End of source file. +Compiling file 'chain.txt'. End of source file. +Compiling file 'oops.txt'. End of source file. +Compiling file 'book.txt'. End of source file. + +Number of vars=193 +Number of source lines=5756 + +Acode finish 1.1 (for Linux) +Copyright (C) 1986-1988 Level 9 Computing + +Loading exit.txt +Loading table.dat + A .. st.l9 +Only one sub-directory - proceeding with finish +Loading squash.dat +Saving acode.acd +Saving gamedata.dat + +Compiling The Worm in Paradise +Level 9 table.dat generation done. + + +COMPACT 2.3 +7th September 1987 +Available memory = 1048576 bytes + +Options: N N 128 + + + + + Level 9 Adventures + + Copyright (C) 1986-1988 Level 9 Computing + + + + + A .. st.l9 +Only one sub-directory - proceeding with squash + +Phase 1 - Clear memory +Phase 2 - Sort into message number order + +Squashing. Please wait. + +Length of SMT = 43279 bytes. +Number of modifications = 173. +Number of text characters = 35995. + +Phase 3 - Construct 'Frequency Table' + +Line number = 46. Line number = 97. Line number = 139. Line number = 180. Line number = 214. Line number = 253. Line number = 289. Line number = 333. Line number = 366. Line number = 407. Line number = 450. Line number = 487. Line number = 541. Line number = 585. Line number = 625. Line number = 666. Line number = 713. Line number = 759. Line number = 803. Line number = 851. Line number = 901. Line number = 936. Line number = 1003. Line number = 1051. Line number = 1110. Line number = 1176. Line number = 1234. Line number = 1284. Line number = 1351. Line number = 1423. + +Number of 'words' = 1833. +Length of 'Frequency Table' = 16500 bytes. + +Phase 4 - (Optional) Display 'Frequency Table' +Phase 5 - Construct 'Common Word Dictionary' +Phase 6 - Construct 'Message Descriptors' + +Line number = 46. Line number = 97. Line number = 139. Line number = 180. Line number = 214. Line number = 253. Line number = 289. Line number = 333. Line number = 366. Line number = 407. Line number = 450. Line number = 487. Line number = 541. Line number = 585. Line number = 625. Line number = 666. Line number = 713. Line number = 759. Line number = 803. Line number = 851. Line number = 901. Line number = 936. Line number = 1003. Line number = 1051. Line number = 1110. Line number = 1176. Line number = 1234. Line number = 1284. Line number = 1351. Line number = 1423. + +Longest compressed message = 267 bytes. +Length compressed Message Desriptors = 12133 bytes. + +Phase 7 - Construct 'Word Dictionary' +Phase 8 - Construct 'Word Dictionary Index' +Phase 9 - Build Squash File + +Writing squash.dat ... + +File 'message.txt' length = 48473 bytes. +Number of characters = 35995. Number of words = 1833. + +File 'squash.dat' length = 18790 bytes. +Compressed size of message descriptors = 12133 bytes. +Compressed size of word dictionary = 5972 bytes. +Compression = 52% of filesize = 48% saved space. + + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Compiling file 'aconst.txt'. End of source file. +Compiling file 'acore.txt'. End of source file. +Compiling file 'aparse.txt'. End of source file. +Compiling file 'averb.txt'. End of source file. +Compiling file 'aspecial.txt'. End of source file. +Compiling file 'chain.txt'. End of source file. +Compiling file 'oops.txt'. End of source file. +Compiling file 'book.txt'. End of source file. + +Number of vars=149 +Number of source lines=6164 + +Acode finish 1.1 (for Linux) +Copyright (C) 1986-1988 Level 9 Computing + +Loading exit.txt +Loading table.dat + A .. st.l9 +Only one sub-directory - proceeding with finish +Loading squash.dat +Saving acode.acd +Saving gamedata.dat + +Compiling Colossal Adventure +Level 9 table.dat generation done. + + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Forced long jumps are now on +Compiling file 'aconst.txt'. End of source file. +Compiling file 'apconst.txt'. End of source file. +Compiling file 'acore.txt'. End of source file. +Compiling file 'aparse.txt'. End of source file. +Compiling file 'aspecial.txt'. End of source file. +Compiling file 'chain.txt'. End of source file. +Compiling file 'oops.txt'. End of source file. +Compiling file 'book.txt'. End of source file. + +Number of vars=138 +Number of source lines=4664 + +Acode finish 1.1 (for Linux) +Copyright (C) 1986-1988 Level 9 Computing + +Loading exit.txt +Loading table.dat + A .. st.l9 +Only one sub-directory - proceeding with finish +Loading squash.dat +Saving acode.acd +Saving gamedata.dat + +Compiling Grange Mudrders for ST +Level 9 table.dat generation done. + + +COMPACT 2.3 +7th September 1987 +Available memory = 1048576 bytes + +Options: N N 128 + + + + + Level 9 Adventures + + Copyright (C) 1986-1988 Level 9 Computing + + + + + +No suitable sub-directories available - searching current. + +Phase 1 - Clear memory +Phase 2 - Sort into message number order + +Squashing. Please wait. + +Length of SMT = 40849 bytes. +Number of modifications = 131. +Number of text characters = 34373. + +Phase 3 - Construct 'Frequency Table' + +Line number = 144. Line number = 277. Line number = 345. Line number = 420. Line number = 468. Line number = 502. Line number = 597. Line number = 831. Line number = 875. Line number = 916. Line number = 952. Line number = 1186. Line number = 1237. Line number = 1286. Line number = 1345. Line number = 1393. Line number = 1448. Line number = 1487. Line number = 1534. Line number = 1574. Line number = 1619. Line number = 1661. Line number = 1716. Line number = 1758. Line number = 1808. Line number = 1877. Line number = 1932. Line number = 1984. Line number = 2023. Line number = 2078. Line number = 2127. Line number = 2209. + +Number of 'words' = 1494. +Length of 'Frequency Table' = 13060 bytes. + +Phase 4 - (Optional) Display 'Frequency Table' +Phase 5 - Construct 'Common Word Dictionary' +Phase 6 - Construct 'Message Descriptors' + +Line number = 144. Line number = 277. Line number = 345. Line number = 420. Line number = 468. Line number = 502. Line number = 597. Line number = 831. Line number = 875. Line number = 916. Line number = 952. Line number = 1186. Line number = 1237. Line number = 1286. Line number = 1345. Line number = 1393. Line number = 1448. Line number = 1487. Line number = 1534. Line number = 1574. Line number = 1619. Line number = 1661. Line number = 1716. Line number = 1758. Line number = 1808. Line number = 1877. Line number = 1932. Line number = 1984. Line number = 2023. Line number = 2078. Line number = 2127. Line number = 2209. + +Longest compressed message = 57 bytes. +Length compressed Message Desriptors = 12546 bytes. + +Phase 7 - Construct 'Word Dictionary' +Phase 8 - Construct 'Word Dictionary Index' +Phase 9 - Build Squash File + +Writing squash.dat ... + +File 'message.txt' length = 84214 bytes. +Number of characters = 34373. Number of words = 1494. + +File 'squash.dat' length = 18459 bytes. +Compressed size of message descriptors = 12546 bytes. +Compressed size of word dictionary = 5244 bytes. +Compression = 53% of filesize = 47% saved space. + + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Compiling file 'mconst.txt'. End of source file. +Compiling file '../aahead.txt'. End of source file. +Compiling file '../aconst.txt'. End of source file. +Compiling file '../sconst.txt'. End of source file. +Compiling file '../pconst.txt'. End of source file. +Compiling file '../aaconst.txt'. End of source file. +Compiling file '../aavars.txt'. End of source file. +Compiling file '../aacore.txt'. End of source file. +Compiling file '../display.txt'. End of source file. +Compiling file '../aaprint.txt'. End of source file. +Compiling file '../aaspec.txt'. End of source file. +Compiling file '../aastand.txt'. End of source file. +Compiling file '../aaverbs.txt'. End of source file. +Compiling file '../aalogic.txt'. End of source file. +Compiling file '../aanpc.txt'. End of source file. +Compiling file '../menu.txt'. End of source file. +Compiling file '../floors.txt'. End of source file. +Compiling file '../goal.txt'. End of source file. +Compiling file '../cache.txt'. End of source file. + +Number of vars=358 +Number of source lines=15689 + +Acode finish 1.1 (for Linux) +Copyright (C) 1986-1988 Level 9 Computing + +Loading exit.txt +Loading table.dat +Loading squash.dat +Saving acode.acd +Saving gamedata.dat + +Compiling Grange Mudrders for PC +Level 9 table.dat generation done. + + +COMPACT 2.3 +7th September 1987 +Available memory = 1048576 bytes + +Options: N N 128 + + + + + Level 9 Adventures + + Copyright (C) 1986-1988 Level 9 Computing + + + + + +No suitable sub-directories available - searching current. + +Phase 1 - Clear memory +Phase 2 - Sort into message number order + +Squashing. Please wait. + +Length of SMT = 40849 bytes. +Number of modifications = 131. +Number of text characters = 34373. + +Phase 3 - Construct 'Frequency Table' + +Line number = 144. Line number = 277. Line number = 345. Line number = 420. Line number = 468. Line number = 502. Line number = 597. Line number = 831. Line number = 875. Line number = 916. Line number = 952. Line number = 1186. Line number = 1237. Line number = 1286. Line number = 1345. Line number = 1393. Line number = 1448. Line number = 1487. Line number = 1534. Line number = 1574. Line number = 1619. Line number = 1661. Line number = 1716. Line number = 1758. Line number = 1808. Line number = 1877. Line number = 1932. Line number = 1984. Line number = 2023. Line number = 2078. Line number = 2127. Line number = 2209. + +Number of 'words' = 1494. +Length of 'Frequency Table' = 13060 bytes. + +Phase 4 - (Optional) Display 'Frequency Table' +Phase 5 - Construct 'Common Word Dictionary' +Phase 6 - Construct 'Message Descriptors' + +Line number = 144. Line number = 277. Line number = 345. Line number = 420. Line number = 468. Line number = 502. Line number = 597. Line number = 831. Line number = 875. Line number = 916. Line number = 952. Line number = 1186. Line number = 1237. Line number = 1286. Line number = 1345. Line number = 1393. Line number = 1448. Line number = 1487. Line number = 1534. Line number = 1574. Line number = 1619. Line number = 1661. Line number = 1716. Line number = 1758. Line number = 1808. Line number = 1877. Line number = 1932. Line number = 1984. Line number = 2023. Line number = 2078. Line number = 2127. Line number = 2209. + +Longest compressed message = 57 bytes. +Length compressed Message Desriptors = 12546 bytes. + +Phase 7 - Construct 'Word Dictionary' +Phase 8 - Construct 'Word Dictionary Index' +Phase 9 - Build Squash File + +Writing squash.dat ... + +File 'message.txt' length = 84214 bytes. +Number of characters = 34373. Number of words = 1494. + +File 'squash.dat' length = 18459 bytes. +Compressed size of message descriptors = 12546 bytes. +Compressed size of word dictionary = 5244 bytes. +Compression = 53% of filesize = 47% saved space. + + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Compiling file 'mconst.txt'. End of source file. +Compiling file '../aahead.txt'. End of source file. +Compiling file '../aconst.txt'. End of source file. +Compiling file '../sconst.txt'. End of source file. +Compiling file '../pconst.txt'. End of source file. +Compiling file '../aaconst.txt'. End of source file. +Compiling file '../aavars.txt'. End of source file. +Compiling file '../aacore.txt'. End of source file. +Compiling file '../display.txt'. End of source file. +Compiling file '../aaprint.txt'. End of source file. +Compiling file '../aaspec.txt'. End of source file. +Compiling file '../aastand.txt'. End of source file. +Compiling file '../aaverbs.txt'. End of source file. +Compiling file '../aalogic.txt'. End of source file. +Compiling file '../aanpc.txt'. End of source file. +Compiling file '../menu.txt'. End of source file. +Compiling file '../floors.txt'. End of source file. +Compiling file '../goal.txt'. End of source file. +Compiling file '../cache.txt'. End of source file. + +Number of vars=358 +Number of source lines=15689 + +Acode finish 1.1 (for Linux) +Copyright (C) 1986-1988 Level 9 Computing + +Loading exit.txt +Loading table.dat +Loading squash.dat +Saving acode.acd +Saving gamedata.dat + +Compiling Billy the Kid for ST + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Compiling file '../firstvar.txt'. End of source file. +Compiling file 'mconst.txt'. End of source file. +Compiling file '../aahead.txt'. End of source file. +Compiling file '../language.txt'. End of source file. +Compiling file '../aaconst.txt'. End of source file. +Compiling file '../aavars.txt'. End of source file. +Compiling file '../demo.txt'. End of source file. +Compiling file '../standard.txt'. End of source file. +Compiling file '../menu.txt'. End of source file. +Compiling file '../walkabou.txt'. End of source file. +Compiling file '../fx.txt'. End of source file. +Compiling file '../arcade.txt'. End of source file. +Compiling file '../vectors.txt'. End of source file. +Compiling file '../strategy.txt'. End of source file. +Compiling file '../comms.txt'. End of source file. +Compiling file '../floors.txt'. End of source file. +Compiling file '../goal.txt'. End of source file. +Compiling file '../cache.txt'. End of source file. +Compiling file '../duel.txt'. End of source file. +Compiling file '../fire.txt'. End of source file. +Compiling file '../movecurs.txt'. End of source file. +Compiling file '../spaniob.txt'. End of source file. +Compiling file '../music.txt'. End of source file. +Compiling file '../display.txt'. End of source file. +Compiling file '../print.txt'. End of source file. +Compiling file '../intro.txt'. End of source file. + +Number of vars=252 +Number of source lines=15109 + +Acode finish 1.1 (for Linux) +Copyright (C) 1986-1988 Level 9 Computing + +Loading exit.txt +Loading table.dat +Loading squash.dat +Saving acode.acd +Saving gamedata.dat + +Compiling Billy the Kid for PC + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Compiling file '../firstvar.txt'. End of source file. +Compiling file 'mconst.txt'. End of source file. +Compiling file '../aahead.txt'. End of source file. +Compiling file '../language.txt'. End of source file. +Compiling file '../aaconst.txt'. End of source file. +Compiling file '../aavars.txt'. End of source file. +Compiling file '../demo.txt'. End of source file. +Compiling file '../standard.txt'. End of source file. +Compiling file '../menu.txt'. End of source file. +Compiling file '../walkabou.txt'. End of source file. +Compiling file '../fx.txt'. End of source file. +Compiling file '../arcade.txt'. End of source file. +Compiling file '../vectors.txt'. End of source file. +Compiling file '../strategy.txt'. End of source file. +Compiling file '../comms.txt'. End of source file. +Compiling file '../floors.txt'. End of source file. +Compiling file '../goal.txt'. End of source file. +Compiling file '../cache.txt'. End of source file. +Compiling file '../duel.txt'. End of source file. +Compiling file '../fire.txt'. End of source file. +Compiling file '../movecurs.txt'. End of source file. +Compiling file '../spaniob.txt'. End of source file. +Compiling file '../music.txt'. End of source file. +Compiling file '../display.txt'. End of source file. +Compiling file '../print.txt'. End of source file. +Compiling file '../intro.txt'. End of source file. + +Number of vars=252 +Number of source lines=15109 + +Acode finish 1.1 (for Linux) +Copyright (C) 1986-1988 Level 9 Computing + +Loading exit.txt +Loading table.dat +Loading squash.dat +Saving acode.acd +Saving gamedata.dat + diff --git a/l9dev/regress/compileall b/l9dev/regress/compileall new file mode 100755 index 0000000..803e67d --- /dev/null +++ b/l9dev/regress/compileall @@ -0,0 +1,210 @@ +#!/bin/bash + +cd ${0%/*} +rm -f compile.log + +echo "Compiling Knight Orc part 1" >>compile.log +cd games.l9/knight1.l9 +pwd +../../../l9gamegen --old --bugcomp >>../../compile.log +cmp ref/table.dat table.dat +cmp spec48.l9/ref/squash.dat spec48.l9/squash.dat +cmp spec48.l9/ref/gamedata.dat spec48.l9/gamedata.dat +cd ../.. + +echo "Compiling Knight Orc part 2" >>compile.log +cd games.l9/knight2.l9 +pwd +../../../l9gamegen --old --bugcomp >>../../compile.log +cmp ref/table.dat table.dat +cmp msx.l9/ref/squash.dat msx.l9/squash.dat +cmp msx.l9/ref/gamedata.dat msx.l9/gamedata.dat +cd ../.. + +echo "Compiling Knight Orc part 3" >>compile.log +cd games.l9/knight3.l9 +pwd +../../../l9gamegen --old --bugcomp >>../../compile.log +cmp ref/table.dat table.dat +cmp msx.l9/ref/squash.dat msx.l9/squash.dat +cmp msx.l9/ref/gamedata.dat msx.l9/gamedata.dat +cd ../.. + +echo "Compiling Lancelot part 1" >>compile.log +cd games.l9/lancelt1.l9 +pwd +../../../l9gamegen >>../../compile.log +cmp ref/table.dat table.dat +cmp main.l9/ref/squash.dat main.l9/squash.dat +cmp main.l9/ref/gamedata.dat main.l9/gamedata.dat +cd ../.. + +echo "Compiling Lancelot part 2" >>compile.log +cd games.l9/lancelt2.l9 +pwd +../../../l9gamegen --no-table >>../../compile.log +cmp main.l9/ref/squash.dat main.l9/squash.dat +cmp main.l9/ref/gamedata.dat main.l9/gamedata.dat +cd ../.. + +echo "Compiling Lancelot part 3" >>compile.log +cd games.l9/lancelt3.l9 +pwd +../../../l9gamegen >>../../compile.log +cmp ref/table.dat table.dat +cmp main.l9/ref/squash.dat main.l9/squash.dat +cmp main.l9/ref/gamedata.dat main.l9/gamedata.dat +cd ../.. + +echo "Compiling Ingrid's Back part 1" >>compile.log +cd games.l9/ingrid.l9/ingrid1.l9 +pwd +../../../../l9gamegen --bugcomp >>../../../compile.log +cmp ref/table.dat table.dat +cmp main.l9/ref/squash.dat main.l9/squash.dat +cmp main.l9/ref/gamedata.dat main.l9/gamedata.dat +cd ../../.. + +echo "Compiling Ingrid's Back part 2" >>compile.log +cd games.l9/ingrid.l9/ingrid2.l9 +pwd +../../../../l9gamegen --bugcomp >>../../../compile.log +cmp ref/table.dat table.dat +cmp main.l9/ref/squash.dat main.l9/squash.dat +cmp main.l9/ref/gamedata.dat main.l9/gamedata.dat +cd ../../.. + +echo "Compiling Ingrid's Back part 3" >>compile.log +cd games.l9/ingrid.l9/ingrid3.l9 +pwd +../../../../l9gamegen --bugcomp >>../../../compile.log +cmp ref/table.dat table.dat +cmp main.l9/ref/squash.dat main.l9/squash.dat +cmp main.l9/ref/gamedata.dat main.l9/gamedata.dat +cd ../../.. + +echo "Compiling Scapeghost part 1" >>compile.log +cd games.l9/ghost.l9/part1.l9 +pwd +../../../../l9gamegen >>../../../compile.log +cmp ref/table.dat table.dat +cmp main.l9/ref/squash.dat main.l9/squash.dat +cmp main.l9/ref/gamedata.dat main.l9/gamedata.dat +cd ../../.. + +echo "Compiling Scapeghost part 2" >>compile.log +cd games.l9/ghost.l9/part2.l9 +pwd +../../../../l9gamegen >>../../../compile.log +cmp ref/table.dat table.dat +cmp main.l9/ref/squash.dat main.l9/squash.dat +cmp main.l9/ref/gamedata.dat main.l9/gamedata.dat +cd ../../.. + +echo "Compiling Scapeghost part 3" >>compile.log +cd games.l9/ghost.l9/part3.l9 +pwd +../../../../l9gamegen >>../../../compile.log +cmp ref/table.dat table.dat +cmp main.l9/ref/squash.dat main.l9/squash.dat +cmp main.l9/ref/gamedata.dat main.l9/gamedata.dat +cd ../../.. + +echo "Compiling Lords of Time" >>compile.log +cd games.l9/timelord.l9 +pwd +../../../l9gamegen --old >>../../compile.log +cmp ref/table.dat table.dat +cmp st.l9/ref/squash.dat st.l9/squash.dat +cmp st.l9/ref/gamedata.dat st.l9/gamedata.dat +cd ../.. + +echo "Compiling Red Moon" >>compile.log +cd games.l9/red_moon.l9 +pwd +../../../l9gamegen --old --oddacode >>../../compile.log +cmp ref/table.dat table.dat +cmp st.l9/ref/squash.dat st.l9/squash.dat +cmp st.l9/ref/gamedata.dat st.l9/gamedata.dat +cd ../.. + +echo "Compiling The Price of Magik" >>compile.log +cd games.l9/magik.l9 +pwd +../../../l9gamegen --no-table --bugcomp >>../../compile.log +cmp msx.l9/ref/squash.dat msx.l9/squash.dat +cmp msx.l9/ref/gamedata.dat msx.l9/gamedata.dat +cd ../.. + +echo "Compiling Snowball" >>compile.log +cd games.l9/snowball.l9 +pwd +../../../l9gamegen --old --no-message --oddacode >>../../compile.log +cmp ref/table.dat table.dat +cmp st.l9/ref/gamedata.dat st.l9/gamedata.dat +cd ../.. + +echo "Compiling Return to Eden" >>compile.log +cd games.l9/eden.l9 +pwd +../../../l9gamegen --old --no-message --oddacode >>../../compile.log +cmp ref/table.dat table.dat +cmp st.l9/ref/gamedata.dat st.l9/gamedata.dat +cd ../.. + +echo "Compiling The Worm in Paradise" >>compile.log +cd games.l9/worm.l9 +pwd +../../../l9gamegen --old --oddacode >>../../compile.log +cmp ref/table.dat table.dat +cmp st.l9/ref/squash.dat st.l9/squash.dat +cmp st.l9/ref/gamedata.dat st.l9/gamedata.dat +cd ../.. + +echo "Compiling Colossal Adventure" >>compile.log +cd games.l9/colossal.l9 +pwd +../../../l9gamegen --old --no-message >>../../compile.log +cmp ref/table.dat table.dat +cmp st.l9/ref/gamedata.dat st.l9/gamedata.dat +cd ../.. + +echo "Compiling Grange Mudrders for ST" >>compile.log +cd games.l9/grange.l9/st.l9 +pwd +../../../../l9gamegen --splitdata >>../../../compile.log +cmp ref/table.dat table.dat +cmp ref/squash.dat squash.dat +cmp ref/acode.acd acode.acd +cmp ref/gamedata.dat gamedata.dat +cd ../../.. + +echo "Compiling Grange Mudrders for PC" >>compile.log +cd games.l9/grange.l9/pc.l9 +pwd +../../../../l9gamegen --splitdata --i8086 >>../../../compile.log +cmp ref/table.dat table.dat +cmp ref/squash.dat squash.dat +cmp ref/acode.acd acode.acd +cmp ref/gamedata.dat gamedata.dat +cd ../../.. + +echo "Compiling Billy the Kid for ST" >>compile.log +cd games.l9/billy.l9/st.l9 +pwd +../../../../l9gamegen --no-table --no-message --splitdata >>../../../compile.log +cmp ref/acode.acd acode.acd +cmp ref/gamedata.dat gamedata.dat +cd ../../.. + +echo "Compiling Billy the Kid for PC" >>compile.log +cd games.l9/billy.l9/pc.l9 +pwd +../../../../l9gamegen --no-table --no-message --splitdata --i8086 >>../../../compile.log +cmp ref/acode.acd acode.acd +cmp ref/gamedata.dat gamedata.dat +cd ../../.. + +grep -e " in line " -e " at line " compile.log + +./compileerrors diff --git a/l9dev/regress/compileerrors b/l9dev/regress/compileerrors new file mode 100755 index 0000000..5e4f486 --- /dev/null +++ b/l9dev/regress/compileerrors @@ -0,0 +1,9 @@ +#!/bin/bash + +cd ${0%/*} +rm -f errors.log + +echo "Compiling errors.txt" >>errors.log +echo "$PWD/errors.txt" +../l9comp --testcomp >>errors.log +cmp errors.ref errors.log diff --git a/l9dev/regress/errors.log b/l9dev/regress/errors.log new file mode 100644 index 0000000..a3f515f --- /dev/null +++ b/l9dev/regress/errors.log @@ -0,0 +1,215 @@ +Compiling errors.txt + +68000 Acode compiler 1.3 (for Linux) +Copyright (C) 1988 Level 9 Computing. +M.J.Austin 2/6/88 + +Looking for compilation batch file - 'compile.bat' + +Executing instructions in file 'compile.bat' +Debugging info is now on +Compiling file 'errors.txt'. +FFFFFFF8: FF FF FF FF FF FF FF FF - 1: * Modified test.txt to cover as many errors as possible +FFFFFFF8: FF FF FF FF FF FF FF FF - 2: * To catch all errors use --testcomp +FFFFFFF8: FF FF FF FF FF FF FF FF - 3: +FFFFFFF8: FF FF FF FF FF FF FF FF - 4: table +Starting table definitions at line 4 + +FFFFFFF8: FF FF FF FF FF FF FF FF - 5: list1=1 +FFFFFFF8: FF FF FF FF FF FF FF FF - 6: +FFFFFFF8: FF FF FF FF FF FF FF FF - 7: var +Starting variable definitions at line 7 + +FFFFFFF8: FF FF FF FF FF FF FF FF - 8: a b c d e f g x1 +FFFFFFF8: FF FF FF FF FF FF FF FF - 9: a1 b1 c1 d1 e1 f1 g1 +FFFFFFF8: FF FF FF FF FF FF FF FF - 10: a2 b2 c2 d2 e2 f2 g2 +FFFFFFF8: FF FF FF FF FF FF FF FF - 11: a3 b3 c3 d3 e3 f3 g3 +FFFFFFF8: FF FF FF FF FF FF FF FF - 12: a4 b4 c4 d4 e4 f4 g4 +FFFFFFF8: FF FF FF FF FF FF FF FF - 13: a5 b5 c5 d5 e5 f5 g5 +FFFFFFF8: FF FF FF FF FF FF FF FF - 14: a6 b6 c6 d6 e6 f6 g6 +FFFFFFF8: FF FF FF FF FF FF FF FF - 15: a7 b7 c7 d7 e7 f7 g7 +FFFFFFF8: FF FF FF FF FF FF FF FF - 16: a8 b8 c8 d8 e8 f8 g8 +FFFFFFF8: FF FF FF FF FF FF FF FF - 17: a9 b9 c9 d9 e9 f9 g9 +FFFFFFF8: FF FF FF FF FF FF FF FF - 18: aa ba ca da ea fa ga +FFFFFFF8: FF FF FF FF FF FF FF FF - 19: ab bb cb db eb fb gb +FFFFFFF8: FF FF FF FF FF FF FF FF - 20: ac bc cc dc ec fc gc +FFFFFFF8: FF FF FF FF FF FF FF FF - 21: ad bd cd dd ed fd gd +FFFFFFF8: FF FF FF FF FF FF FF FF - 22: ae be ce de ee fe ge +FFFFFFF8: FF FF FF FF FF FF FF FF - 23: af bf cf df ef ff gf +FFFFFFF8: FF FF FF FF FF FF FF FF - 24: ag bg cg dg eg fg gg +FFFFFFF8: FF FF FF FF FF FF FF FF - 25: ah bh ch dh eh fh gh +FFFFFFF8: FF FF FF FF FF FF FF FF - 26: ai bi ci di ei fi gi +FFFFFFF8: FF FF FF FF FF FF FF FF - 27: aj bj cj dj ej fj gj +FFFFFFF8: FF FF FF FF FF FF FF FF - 28: ak bk ck dk ek fk gk +FFFFFFF8: FF FF FF FF FF FF FF FF - 29: al bl cl dl el fl gl +FFFFFFF8: FF FF FF FF FF FF FF FF - 30: am bm cm dm em fm gm +FFFFFFF8: FF FF FF FF FF FF FF FF - 31: an bn cn dn en fn gn +FFFFFFF8: FF FF FF FF FF FF FF FF - 32: ao bo co do eo fo go +FFFFFFF8: FF FF FF FF FF FF FF FF - 33: ap bp cp dp ep fp gp +FFFFFFF8: FF FF FF FF FF FF FF FF - 34: aq bq cq dq eq fq gq +FFFFFFF8: FF FF FF FF FF FF FF FF - 35: ar br cr dr er fr gr +FFFFFFF8: FF FF FF FF FF FF FF FF - 36: as bs cs ds es fs gs +FFFFFFF8: FF FF FF FF FF FF FF FF - 37: at bt ct dt et ft gt +FFFFFFF8: FF FF FF FF FF FF FF FF - 38: au bu cu du eu fu gu +FFFFFFF8: FF FF FF FF FF FF FF FF - 39: av bv cv dv ev fv gv +FFFFFFF8: FF FF FF FF FF FF FF FF - 40: aw bw cw dw ew fw gw +FFFFFFF8: FF FF FF FF FF FF FF FF - 41: ax bx cx dx ex fx gx +FFFFFFF8: FF FF FF FF FF FF FF FF - 42: ay by cy dy ey fy gy +FFFFFFF8: FF FF FF FF FF FF FF FF - 43: az bz cz dz ez fz gz +FFFFFFF8: FF FF FF FF FF FF FF FF - 44: a0 b0 c0 ; ERROR: Too many variables +Too many variables at line 44 in file 'errors.txt' + +FFFFFFF8: FF FF FF FF FF FF FF FF - 45: +FFFFFFF8: FF FF FF FF FF FF FF FF - 46: begin +Starting main program at line 46 + +FFFFFFF8: FF FF FF FF FF FF FF FF - 47: .Start +FFFFFFF8: FF FF FF FF FF FF FF FF - 48: cls x ; ERROR: Bad argument +Bad argument at line 48 in file 'errors.txt' + +FFFFFFF9: FF FF FF FF FF FF FF 15 - 49: prs " start of acode: " +0000000D: 61 63 6F 64 65 3A 20 00 - 50: input x1 x1 x1 x1 +00000012: 3A 20 00 07 08 08 08 08 - 51: a=Start ; ERROR: Variable expected +Variable expected at line 51 in file 'errors.txt' + +00000012: 3A 20 00 07 08 08 08 08 - 52: a=12345 +00000016: 08 08 08 08 08 39 30 01 - 53: h=a ; ERROR: Instruction not recognized +Instruction not recognized at line 53 in file 'errors.txt' + +00000016: 08 08 08 08 08 39 30 01 - 54: c=1 +00000019: 08 08 39 30 01 48 01 03 - 55: a=h ; ERROR: Syntax error +Syntax error at line 55 in file 'errors.txt' + +00000019: 08 08 39 30 01 48 01 03 - 56: +00000019: 08 08 39 30 01 48 01 03 - 57: ;code + +00000019: 08 08 39 30 01 48 01 03 - 58: +00000019: 08 08 39 30 01 48 01 03 - 59: push a ; ERROR: Instruction not allowed in interpreted acode +Instruction not allowed in interpreted acode at line 59 in file 'errors.txt' + +00000019: 08 08 39 30 01 48 01 03 - 60: code : ; ERROR: Plus or minus expected +Plus or minus expected at line 60 in file 'errors.txt' + +00000019: 08 08 39 30 01 48 01 03 - 61: ;pop b +00000019: 08 08 39 30 01 48 01 03 - 62: ;and a,b +00000019: 08 08 39 30 01 48 01 03 - 63: ;or a,b +00000019: 08 08 39 30 01 48 01 03 - 64: ;xor a,b +00000019: 08 08 39 30 01 48 01 03 - 65: add a,b +0000001C: 30 01 48 01 03 0A 02 01 - 66: sub a,b +0000001F: 01 03 0A 02 01 0B 02 01 - 67: sub a-b ; ERROR: Comma expected +Comma expected at line 67 in file 'errors.txt' + +00000020: 03 0A 02 01 0B 02 01 0B - 68: list1(0)=a +00000023: 01 0B 02 01 0B 81 00 01 - 69: list1(0)>a ; ERROR: Equals expected +Equals expected at line 69 in file 'errors.txt' + +00000023: 01 0B 02 01 0B 81 00 01 - 70: ;&list1(2)=a +00000023: 01 0B 02 01 0B 81 00 01 - 71: b=4 +00000026: 01 0B 81 00 01 48 04 02 - 72: &list1(b)=a ; ERROR: Can't do 16 bit tables in interpreted mode +Can't do 16 bit tables in interpreted mode at line 72 in file 'errors.txt' + +00000026: 01 0B 81 00 01 48 04 02 - 73: d=list1(3) +00000029: 00 01 48 04 02 C1 03 04 - 74: e=list1(b) +0000002C: 04 02 C1 03 04 A1 02 05 - 75: ;&f=list1(2) +0000002C: 04 02 C1 03 04 A1 02 05 - 76: ;&g=list1(b) +0000002C: 04 02 C1 03 04 A1 02 05 - 77: ;code - +0000002C: 04 02 C1 03 04 A1 02 05 - 78: code + +0000002C: 04 02 C1 03 04 A1 02 05 - 79: code + ; ERROR: Already in specified code state +Already in specified code state at line 79 in file 'errors.txt' + +0000002C: 04 02 C1 03 04 A1 02 05 - 80: push a ; ERROR: Something not implemented +Something not implemented at line 80 in file 'errors.txt' + +0000002C: 04 02 C1 03 04 A1 02 05 - 81: +0000002C: 04 02 C1 03 04 A1 02 05 - 82: .transcode +0000002C: 04 02 C1 03 04 A1 02 05 - 83: prs " Not allowed in MC ..." ; ERROR: Instruction not allowed in machine code +Instruction not allowed in machine code at line 83 in file 'errors.txt' + +0000002C: 04 02 C1 03 04 A1 02 05 - 84: code - +0000002C: 04 02 C1 03 04 A1 02 05 - 85: jump transcode x1; ERROR: Can't jump into area of different code state +Can't jump into area of different code state at line 85 in file 'errors.txt' + +0000002D: 02 C1 03 04 A1 02 05 0E - 86: code + ; ERROR: MC must be even-aligned (not if code is properly implemented) +MC must be even-aligned at line 86 in file 'errors.txt' + +0000002D: 02 C1 03 04 A1 02 05 0E - 87: code - +0000002D: 02 C1 03 04 A1 02 05 0E - 88: +0000002D: 02 C1 03 04 A1 02 05 0E - 89: prs " contents of list 1 are: " +00000049: 31 20 61 72 65 3A 20 00 - 90: prs ' contents of list 1 are: ' ; ERROR: Missing quote +Missing quote at line 90 in file 'errors.txt' + +00000049: 31 20 61 72 65 3A 20 00 - 91: a=0 +0000004C: 72 65 3A 20 00 48 00 01 - 92: .Tloop2 +0000004C: 72 65 3A 20 00 48 00 01 - 93: b=list1(a) +0000004F: 20 00 48 00 01 A1 01 02 - 94: b=list1[a]; ERROR: Bracket expected +Bracket expected at line 94 in file 'errors.txt' + +0000004F: 20 00 48 00 01 A1 01 02 - 95: print b +00000051: 48 00 01 A1 01 02 03 02 - 96: prs " " +00000055: 01 02 03 02 06 FA 20 00 - 97: b=list1(Start) ; ERROR: Bad table index +Bad table index at line 97 in file 'errors.txt' + +00000055: 01 02 03 02 06 FA 20 00 - 98: add a,c +00000058: 02 06 FA 20 00 0A 03 01 - 99: if 8<20 then Tloop2 ; ERROR: Variable not defined +Variable not defined at line 99 in file 'errors.txt' + +00000058: 02 06 FA 20 00 0A 03 01 - 100: if a<20 then Tloop2 +0000005C: 00 0A 03 01 7A 01 14 F1 - 101: if !<20 then Tloop2 ; ERROR: Bad symbol +Bad symbol at line 101 in file 'errors.txt' + +0000005C: 00 0A 03 01 7A 01 14 F1 - 102: prs " d=" +00000062: 14 F1 06 FA 20 64 3D 00 - 103: print d +00000064: 06 FA 20 64 3D 00 03 04 - 104: if a<20 then OoR +00000068: 3D 00 03 04 7A 01 14 FD - 105: prs " This is a very long string to produce out of range error " +000000A5: 20 65 72 72 6F 72 20 00 - 106: prs " This is another very long string to produce out of range error " +000000E8: 20 65 72 72 6F 72 20 00 - 107: prs " This is again a very long string to produce out of range error " +0000012B: 20 65 72 72 6F 72 20 00 - 108: .OoR ; ERROR: Forward reference to '%s' out of range +Forward reference to 'OoR' out of range at line 104 in file 1 + +0000012B: 20 65 72 72 6F 72 20 00 - 109: prs " This is a final very long string to produce out of range error " +0000016E: 20 65 72 72 6F 72 20 00 - 110: if a<20 then Tloop2 ; ERROR: Relative jump out of range +Relative jump out of range at line 110 in file 'errors.txt' + +00000171: 72 6F 72 20 00 7A 01 14 - 111: prs " e=" +00000177: 01 14 06 FA 20 65 3D 00 - 112: if a<20 then x1 ; ERROR: Symbol redefined as different type +Symbol redefined as different type at line 112 in file 'errors.txt' + +0000017A: FA 20 65 3D 00 7A 01 14 - 113: print e +0000017C: 65 3D 00 7A 01 14 03 05 - 114: if a!=20 then Tloop2 ; ERROR: Bad operator +Bad operator at line 114 in file 'errors.txt' + +0000017C: 65 3D 00 7A 01 14 03 05 - 115: prs " f=" +00000182: 03 05 06 FA 20 66 3D 00 - 116: prs " This is not allowed: œ ..." ; ERROR: Pound sign is not allowed in prs +Pound sign is not allowed in prs at line 116 in file 'errors.txt' + +0000019A: 6C 6C 6F 77 65 64 3A 20 - 117: print f +0000019C: 6F 77 65 64 3A 20 03 06 - 118: .x1 ; ERROR: Can't redefine symbol +Can't redefine symbol at line 118 in file 'errors.txt' + +0000019C: 6F 77 65 64 3A 20 03 06 - 119: prs " g=" +000001A2: 03 06 06 FA 20 67 3D 00 - 120: if aa ; ERROR: Equals expected +Equals expected at line 69 in file 'errors.txt' + +00000023: 01 0B 02 01 0B 81 00 01 - 70: ;&list1(2)=a +00000023: 01 0B 02 01 0B 81 00 01 - 71: b=4 +00000026: 01 0B 81 00 01 48 04 02 - 72: &list1(b)=a ; ERROR: Can't do 16 bit tables in interpreted mode +Can't do 16 bit tables in interpreted mode at line 72 in file 'errors.txt' + +00000026: 01 0B 81 00 01 48 04 02 - 73: d=list1(3) +00000029: 00 01 48 04 02 C1 03 04 - 74: e=list1(b) +0000002C: 04 02 C1 03 04 A1 02 05 - 75: ;&f=list1(2) +0000002C: 04 02 C1 03 04 A1 02 05 - 76: ;&g=list1(b) +0000002C: 04 02 C1 03 04 A1 02 05 - 77: ;code - +0000002C: 04 02 C1 03 04 A1 02 05 - 78: code + +0000002C: 04 02 C1 03 04 A1 02 05 - 79: code + ; ERROR: Already in specified code state +Already in specified code state at line 79 in file 'errors.txt' + +0000002C: 04 02 C1 03 04 A1 02 05 - 80: push a ; ERROR: Something not implemented +Something not implemented at line 80 in file 'errors.txt' + +0000002C: 04 02 C1 03 04 A1 02 05 - 81: +0000002C: 04 02 C1 03 04 A1 02 05 - 82: .transcode +0000002C: 04 02 C1 03 04 A1 02 05 - 83: prs " Not allowed in MC ..." ; ERROR: Instruction not allowed in machine code +Instruction not allowed in machine code at line 83 in file 'errors.txt' + +0000002C: 04 02 C1 03 04 A1 02 05 - 84: code - +0000002C: 04 02 C1 03 04 A1 02 05 - 85: jump transcode x1; ERROR: Can't jump into area of different code state +Can't jump into area of different code state at line 85 in file 'errors.txt' + +0000002D: 02 C1 03 04 A1 02 05 0E - 86: code + ; ERROR: MC must be even-aligned (not if code is properly implemented) +MC must be even-aligned at line 86 in file 'errors.txt' + +0000002D: 02 C1 03 04 A1 02 05 0E - 87: code - +0000002D: 02 C1 03 04 A1 02 05 0E - 88: +0000002D: 02 C1 03 04 A1 02 05 0E - 89: prs " contents of list 1 are: " +00000049: 31 20 61 72 65 3A 20 00 - 90: prs ' contents of list 1 are: ' ; ERROR: Missing quote +Missing quote at line 90 in file 'errors.txt' + +00000049: 31 20 61 72 65 3A 20 00 - 91: a=0 +0000004C: 72 65 3A 20 00 48 00 01 - 92: .Tloop2 +0000004C: 72 65 3A 20 00 48 00 01 - 93: b=list1(a) +0000004F: 20 00 48 00 01 A1 01 02 - 94: b=list1[a]; ERROR: Bracket expected +Bracket expected at line 94 in file 'errors.txt' + +0000004F: 20 00 48 00 01 A1 01 02 - 95: print b +00000051: 48 00 01 A1 01 02 03 02 - 96: prs " " +00000055: 01 02 03 02 06 FA 20 00 - 97: b=list1(Start) ; ERROR: Bad table index +Bad table index at line 97 in file 'errors.txt' + +00000055: 01 02 03 02 06 FA 20 00 - 98: add a,c +00000058: 02 06 FA 20 00 0A 03 01 - 99: if 8<20 then Tloop2 ; ERROR: Variable not defined +Variable not defined at line 99 in file 'errors.txt' + +00000058: 02 06 FA 20 00 0A 03 01 - 100: if a<20 then Tloop2 +0000005C: 00 0A 03 01 7A 01 14 F1 - 101: if !<20 then Tloop2 ; ERROR: Bad symbol +Bad symbol at line 101 in file 'errors.txt' + +0000005C: 00 0A 03 01 7A 01 14 F1 - 102: prs " d=" +00000062: 14 F1 06 FA 20 64 3D 00 - 103: print d +00000064: 06 FA 20 64 3D 00 03 04 - 104: if a<20 then OoR +00000068: 3D 00 03 04 7A 01 14 FD - 105: prs " This is a very long string to produce out of range error " +000000A5: 20 65 72 72 6F 72 20 00 - 106: prs " This is another very long string to produce out of range error " +000000E8: 20 65 72 72 6F 72 20 00 - 107: prs " This is again a very long string to produce out of range error " +0000012B: 20 65 72 72 6F 72 20 00 - 108: .OoR ; ERROR: Forward reference to '%s' out of range +Forward reference to 'OoR' out of range at line 104 in file 1 + +0000012B: 20 65 72 72 6F 72 20 00 - 109: prs " This is a final very long string to produce out of range error " +0000016E: 20 65 72 72 6F 72 20 00 - 110: if a<20 then Tloop2 ; ERROR: Relative jump out of range +Relative jump out of range at line 110 in file 'errors.txt' + +00000171: 72 6F 72 20 00 7A 01 14 - 111: prs " e=" +00000177: 01 14 06 FA 20 65 3D 00 - 112: if a<20 then x1 ; ERROR: Symbol redefined as different type +Symbol redefined as different type at line 112 in file 'errors.txt' + +0000017A: FA 20 65 3D 00 7A 01 14 - 113: print e +0000017C: 65 3D 00 7A 01 14 03 05 - 114: if a!=20 then Tloop2 ; ERROR: Bad operator +Bad operator at line 114 in file 'errors.txt' + +0000017C: 65 3D 00 7A 01 14 03 05 - 115: prs " f=" +00000182: 03 05 06 FA 20 66 3D 00 - 116: prs " This is not allowed: œ ..." ; ERROR: Pound sign is not allowed in prs +Pound sign is not allowed in prs at line 116 in file 'errors.txt' + +0000019A: 6C 6C 6F 77 65 64 3A 20 - 117: print f +0000019C: 6F 77 65 64 3A 20 03 06 - 118: .x1 ; ERROR: Can't redefine symbol +Can't redefine symbol at line 118 in file 'errors.txt' + +0000019C: 6F 77 65 64 3A 20 03 06 - 119: prs " g=" +000001A2: 03 06 06 FA 20 67 3D 00 - 120: if aa ; ERROR: Equals expected +;&list1(2)=a + b=4 +&list1(b)=a ; ERROR: Can't do 16 bit tables in interpreted mode + d=list1(3) + e=list1(b) +;&f=list1(2) +;&g=list1(b) +;code - +code + +code + ; ERROR: Already in specified code state + push a ; ERROR: Something not implemented + +.transcode + prs " Not allowed in MC ..." ; ERROR: Instruction not allowed in machine code +code - + jump transcode x1; ERROR: Can't jump into area of different code state +code + ; ERROR: MC must be even-aligned (not if code is properly implemented) +code - + + prs " contents of list 1 are: " + prs ' contents of list 1 are: ' ; ERROR: Missing quote + a=0 +.Tloop2 + b=list1(a) + b=list1[a]; ERROR: Bracket expected + print b + prs " " + b=list1(Start) ; ERROR: Bad table index + add a,c + if 8<20 then Tloop2 ; ERROR: Variable not defined + if a<20 then Tloop2 + if !<20 then Tloop2 ; ERROR: Bad symbol + prs " d=" + print d + if a<20 then OoR + prs " This is a very long string to produce out of range error " + prs " This is another very long string to produce out of range error " + prs " This is again a very long string to produce out of range error " +.OoR ; ERROR: Forward reference to '%s' out of range + prs " This is a final very long string to produce out of range error " + if a<20 then Tloop2 ; ERROR: Relative jump out of range + prs " e=" + if a<20 then x1 ; ERROR: Symbol redefined as different type + print e + if a!=20 then Tloop2 ; ERROR: Bad operator + prs " f=" + prs " This is not allowed: œ ..." ; ERROR: Pound sign is not allowed in prs + print f +.x1 ; ERROR: Can't redefine symbol + prs " g=" + if a0 + Samples=25 ; Can be changed - See FX.TXT. +; list25=25 ; sound samples(?) +; list26 is used to hold font + FloorMap=27 ; see FloorMapList. Specific to Billy. + + SpriteTable=28 ; was used for adept, now available. + LongWS=29 ; Shared workspace with machine code + WordWS=30 ; Shared workspace with machine code + ByteWS=31 ; Shared workspace with machine code + +;------------------- + +const + DebugSubplots=0 ; ****** Must be zero for RELEASE GAME. See fire.txt + + + + + Editor=0 ; conditional assembly - disable clipping etc. + NotEditor=1 + + IBMClipPosition=159 ;(IBMTopOfText-1) + IBMTopOfText=160 + IBMTextHeight=40 + IBMTextLimit=33 ;(IBMTextHeight-7) + +; draw flags are... + dRemoveRedraw=65535 ; -1 Remove and redraw + dInsert=0 ; 0 insert + dPlot=1 ; 1 plot as sprite + dInsertRedraw=2 ; 2 insert and redraw + dMarkPreload=3 ; 3 mark to preload + MarkPreload=3 ; 3 mark to preload + dSetProtect=4 ; 4 set protection mark + dUnsetProtect=5 ; 5 unsert protection mark + dPurgeObject=6 ; purge the object + +; offsets in List4... + EnterFromOffset=64 ;;32 + DoorOpenOffset=128 ;;64 + ThroughDoorOffset=256 ;;128 + +; animation constants... +;; GMJ 25/8/89 Now a Var ;; ACBStart=0 ; start within ACBList + ConstACBStart=0 +;; ConstACBSearchStartMinus1=63 ; 767 + ConstACBSearchStart=64 ; 768 ; NuMNPC*ACBSize + ConstACBEnd=4500 ; end within ACBList + + ConstTTPACBStart=4544 ; start for talking to people acbs + ConstTTPACBEnd=7488 ;***5500 ; end within ACBList + + ACBSortStart=7570 ;***5570 ; =ACBEnd. Table used for priortization of sprites + ACBListSize=8500 ; 8 Jan 1991. was 8500 + ACBSize=64 ; at least 42=ACBStackStart+AcbEntries*4. size of ACB entry in bytes + ACBEntries=5 ; 6 ; ACB is 5 word header, followed by double-word entries. + ACBStackStart=32 ; offset within ACB of first entry in stack + ACBStackStartMinus1=31 + ACBStackEnd=64 ;AcbStackStart+ACBEntries*6 + + ACBXOffset=4 + ACBZOffset=6 + ACBHOffset=8 + ACBRasterOffset=10 ; amount to add on to raster objects +; used within this acb. + + ACBDestX=12 + ACBDestZ=14 + ACBDestH=16 + ACBFinePosOffset=18 +; ACBTimeInRoom=19 + ACBLastHeightAdjust=20 ; byte + ACBStuckOnAnother=20 ; byte: timer to release irretrievable stuck sprites. +; (for scrolling games) + ACBCumulativeShift=22 ; word - for Walkabout: keeps track +; of how far we've shifted vertically - to allow the up/down +; movement as we walk to be cancelled when change animation. + +; ACBOwnerOffset=21 ; scrolling games mainly +; ACBAngleFromIntended=22 +; ACBIntendedDirection=23 +; ACBStepsInCurrentDir=24 + ACBCurrentSpeed=24 ; word is used + + +; ACBObjectOffset=26 ; the object number this acb corresponds to +; ACBSearchTime=28 +; ACBPreviousDistance=30 + +; values set in acbstatus +; All low values (<128) mean that the npc +; is under the sole control of the graphics task. + +; ACBToDoor=1 ; game uses direction 1..8 instead nowadays. Indicates +; that npc is doing a local gd to go through a door. + ACBGeneralGD=16 ;;10 ; a non-specific local gd is underway. + ACBFindNPC=17 ;;11 ; same as generalgd, but trying to find a person + ACBAscending=20 ; actor is ascending stairs + ACBDescending=21 ; actor is descending stairs + +; All higher values (>128) indicate that the npc +; may be controlled by either strategy or graphics +; tasks. + ACBStuck=252 ; an NPC couldn't get to its destination. + ACBArrived=253 ; ACBStatus set to this when a local gd has finished. Cleared +; by strategy task when appropriate action has been taken. + ACBInterruptibleGD=254 ; person is moving, but +; can be stopped or a new sequence started without +; any problems. + ACBIdle=0 ; ACBStatus set to this when no local gd is in place. +; - i.e. person is not moving (or is under user control) + +; no sprite is ever ENTIRELY controlled by the strategy +; task (whilst it is on-screen) +;---- + + MaxTicks=5 +;------- +; co-ordinate ranges for use by mouse handler code. + MinXUpperDisplayArea=16 + MaxXUpperDisplayArea=200 + MinYUpperDisplayArea=0 + MaxYUpperDisplayArea=200 + + MinXLowerDisplayArea=16 + MaxXLowerDisplayArea=200 + MinYLowerDisplayArea=100 + MaxYLowerDisplayArea=200 + + MinXColourBar=304 + MinYColourBar=32 + MaxYColourBar=160 + SizeColourBarElement=8 + +;- + RasterType=1 + XZHType=2 + AnimationType=3 + CompressedType=4 + CellType=5 + NeoType=6 + + NeoObjectNumber=0 + MagnifyObjectNumber=65535 + MagnifyXSize=8 + MagnifyYSize=8 + HalfMagnifyXSize=4 + HalfMagnifyYSize=4 + + + NumCells=1000 + + UpperContextType=1 + LowerContextType=2 + +Blocks=0 ; default editing mode - i.e. EditMode +Pixels=1 ; an editing mode +;- +; ObjectBufferSize=800 ; in bytes = (ObjectXSize+ObjectYSize)*2 +; ObjectXSize=20 ; horizontal size in 16x16 blocks +; ObjectXSizeMinus1=19 +; ObjectYSize=20 +; ObjectYSizeMinus1=19 +; sizes for nearly full screen... + ScreenXSize=15 + ScreenYSize=5 + ScreenXSizePixels=241 ; pixels: =ScreenXSize*16+1 + ScreenYSizePixels=161 ; pixels: =ScreenYSize*16+1 + +; reduced screen size for testing: +; ScreenXSize=10 +; ScreenYSize=7 +; ScreenXSizePixels=161 ; pixels: =ScreenXSize*16+1 +; ScreenYSizePixels=113 ; pixels: =ScreenYSize*16+1 +;--- +; false=0 +; true=1 +;---- + NeoScreenOffset=0 ; within list18 + EditorNeoOffset=32768 ; within list18 +; (remember that List operations won't find this data +; due to them being treated as signed offsets) +;---- + ScreenXBlocks=50 + ScreenXBlocksTimes2=100 + ScreenYBlocks=50 + MapSize=5000 ; ScreenXBlocks*ScreenYBlocks*2 (word based map table) + + UpMapStep=65546 ; -ScreenXBlocks*2 + RightMapStep=2 ; word-based map + DownMapStep=100 ; ScreenXBlocks*2 + LeftMapStep=65534 ; word-based map + + SpriteTableSize=3600 ; MaxMovingSprites*48 +; +; output buffer offsets (i.e. list 2 offsets) + StartOutputBuffer=0 +;; EndOutputBuffer=255 + EndOutputBufferPlus1=256 ; offset of first byte after used area of buffer + SizeOutputBuffer=256 ; EndOutputBufferPlus1-StartOutputBuffer + StartScreenLineBuffer=256 + EndScreenLineBuffer=296 +;-------- +; message manifest constants... +; space=197 +; cr=198 +; dot=199 +;--- +; offsets within LongWs + HiLongRandomSeed=8 ; long value + LoLongRandomSeed=10 ; long value +HiLongLogicalBase=12 +LoLongLogicalBase=14 +; holds address 8 less than the real physical base +; to allow the leftmost 16 pels to be clipped in an elegant fashion + +LongPhysicalBase=16 +HiLongPhysicalBase=16 +LoLongPhysicalBase=18 +; holds address of currently displayed screen +; holds address of currently displayed screen + +LongOSScreenAddress=20 +; screen address when game started + +HiLongTextScreenBase=24 +LoLongTextScreenBase=26 +; base address for writing text to. + + HiLongCurrentTaskMTCB=28 + LoLongCurrentTaskMTCB=30 + HiLongNextTaskMTCB=32 + LoLongNextTaskMTCB=34 + + HiLongSpriteDataPtr=108 + LoLongSpriteDataPtr=110 + + HiLongFreeWorkSpace=124 + LoLongFreeWorkSpace=126 + + LongGraphicsScreenBase=160 ; where MC thinks the screen on +; which to write graphics is. cf. TextScreenBase + HiLongGraphicsScreenBase=160 + LoLongGraphicsScreenBase=162 +;------ +; offsets within WordWs + WordCursorXPos=0 + WordCursorYPos=2 + WordFrameTime=4 + WordPlayer1SpriteOffset=6 + + WordScreenXPos=8 + WordScreenYPos=10 + WordScreenXMax=12 + WordScreenYMax=14 + WordPlayerXMax=16 + WordPlayerYMax=18 + + WordScreenXBlocks=20 + WordScreenYBlocks=22 + WordXPosSave=24 + WordYPosSave=26 + WordTextBufferOffset=28 + WordFreeSprites=30 + WordMouseXDistance=32 + WordMouseYDistance=34 + WordSuspendTaskSwap=36 + WordUseVM=38 + WordVBLDisabled=40 + + WordRasterOffset=56 + WordErrorNumber=66 +;-------- +; offsets within ByteWs + ByteJoystickStatus=0 + ByteLastKeyPressed=1 +; ByteFrameReadyFlag=2 + ByteInvertFlag=3 + ByteBreakPointArmed=4 + ByteScrollStep=5 + ByteCurrentWeapon=6 + + ByteFrameReadyFlag=9 + ByteStarPhase=10 + ByteWordWrapWidth=11 + +; offsets within permament sprite data block + StationaryAnimationOffset=14 + MovingAnimationOffset=16 + FightAnimationOffset=18 + ThrowAnimationOffset=20 + InitialHitPointOffset=22 + InitialBlowStrengthOffset=24 + ByteOutputDevice=25 + TimeBetweenBlowsOffset=26 + NumAnimationOffset=27 + TypeOffset=28 + SpeedOffset=29 + NullMovesOffset=30 + DistanceOffset=35 + AddDirOffset=37 + +;CDWithPlayer equ 0 * bit 0 +;CDWithMissiles equ 1 +;CDWithMonsters equ 2 +;CDWithBG equ 3 * bit 3 +;CDWithObject equ 4 +;CDWithInvisibles equ 5 +;CDWithMonsterMissile equ 6 + +; PlayerMask=1 +; MissileMask=2 +; MonsterMask=4 +; BGMask=8 +; ObjectMask=16 +; InvisibleMask=32 +; MonsterMissileMask=64 + +; PlayerType=1 +; MissileType=2 +; MonsterType=4 +; BGType=8 +; ObjectType=16 +; InvisibleType=32 +; MonsterMissileType=64 + +;; offsets within temporary sprite data block +; xspeedOffset=4 +; YSpeedOffset=6 +; XPosOffset=8 +; YPosOffset=10 +; DataPtrOffset=12 ; LONG +; LoDataPtrOffset=14 +; NameOffset=24 +; HitPointOffset=26 +; BlowStrengthOffset=28 +; TimeToNextBlowOffset=30 +; ViewOffset=31 +; StageOffset=32 ; animation stage +; LifeCounterOffset=36 +; AnimationOffset=38 + +; offsets of linked list pointers within LL list. +; note that many of these are referenced by MenuTable + LLPlayerInv=0 ; ll showing player's inventory + LLRangedWeapons=2 ; ll giving available ranged weapons + LLEntrySize=10 + LLTableSize=250 + +; offsets of entries in LL table. + InvNameOffset=2 ; contains a word giving the "name" of the + RWNameOffset=2 ; holds word value + RWTypeOffset=4 ; holds byte value +; object held. This will usually by the same as the number +; of the sprite data. + +MenuDelay=1000 ; slow down menu to prevent flickering display + +; offsets within RoomData +; ExitOffsetBase=4 +; North=2 +; East=4 +; South=6 +; West=8 + +; +; offsets within Workspace List + RoomTableOffset=0 ; gives number of exits used from each + RoomTableEntrySize=8 ; room - used in maze drawing + +; offsets within list7 + NextAddDirTableOffset=10 + ConvertViewToXY=38 ; 18+20 because index into table is -5..+5 + ConvertViewToView=67 ; 62+5 """ "" "" "" "" "" + +;------- +;; sprite data numbers... +;; i.e. NAMES of OBJECTS (objects) +; user=256 +; Bottle=14 +; Sword=15 +; Shield=16 +; Ring=17 +; Wand=18 +; Scroll=19 +; Gold=20 +; Club=21 + StructureBufferList=15 + +;--------- + FloorMapList=27 + EndCache2=6650 ; 4800 ;see 'const' in CACHE.TXT Size of two +; floormap files+220 bytes. + PlayerHeight=64 + + OverlayEntryOffset=12 ; see goto @OverlayEntryPoint in AAHEAD + +;------------- + true=1 + false=0 + ForceCR=3 + cr=5 + FlushBuffer=6 + dot=7 + space=8 + minusone=65535 + + ForceUpperCase=0 ; set non-zero if all text needs to be +; converted to upper case + + DefaultTextWidth=150 ; width of normal text box (10x10 at present) + StartStructureBuffer=32 + + +; Printing Constants... + RasterTop=0 + RasterLeftMargin=0 + + + + ACBOwnerOffset=22 + OwnedByPat=2 + OwnedByBilly=3 + ACBObjectTypeOffset=23 + MinHumanType=220 + ManType=221 + + LinkNextOffset=26 ; before stack in acb +; within acbs, this word gives the acb offset +; of any acb linked to this one. If this acb moves, move the other +; acb as well. If this acb is killed, kill the other acb as well + +; Menu Result codes... +DoNothing=0 + + +; values for Game variable... + EscapeGame=21 + PositionPeopleGame=25 + PatWalkGame=30 ; drop into pat walking around shooting section. + MinTrackingGame=127 ; lowest number a game using the +; tracking maps/cd tables can have + TrackingGame=128 + RustlingGame=140 + +; entry parameters for OverlayEntryPoint and CurrentScreen variable + SelectPlayerScreen=1 + CodeBackToWalkabout=2 ; (Not CurrentScreen variable) + CodeRestartGame=31000 + duelback=429 ; entry code for OverlayEntryPoint + GameMap=600 + BankGame=601 + IntroScreen=602 + CardGameScreen=12 ; arcadeb.se + BrawlScreen=560 ; arcadeb.se + + + TownAcode=69 ; 'e' + ScrollingAcode=50 ; '2' + ArcadeAcode=51 ; '3' + + NumberOfPeople=110 + NumberOfTowns=6 + TownFixedDataList=6 + TownVarDataList=7 + TownVarDataSize=10000 ; space allocated for it: must be at least +; NumberOfPeople*16+NumberOfTowns*16 + NumberOfPeople*32 (identikits) +; + Space for sub-plots + ObjectsInformation (about 400 bytes) + WorkListSize=6000 ; space allocated for WorkList(surprise, surprise) + WorkListNum=16 +;--------- + Pat=1 ; values for PlayersName + Billy=2 + + +; values for StructureFile variable + TownStructures=69 ;'acodE.acd', s.dat + IdentikitStructures=2 ; no particular acode, 'identiks.dat' + LinkingStructures=3 ; no particular acode, linkings.dat + BrawlStructures=49 ; s1.dat + ScrollingStructures=50 ; s2.dat + ArcadeStructures=51 ; 'acod3.acd', s3.dat + IntroStructures=999 + + DemoVersion=0 + NotDemoVersion=1 ; set to 0 for demo versions, 1 for normal game. + + ML=200 ; base for values in LOCATION variable +; of places accessed from map - e.g. ranches. +; i.e. LOCATION = TOWN + ML. Within town, LOCATION is +; the room number: 30..170. This gives a non-overlapping +; set of location numbers, for use in e.g. PeopleData +; location positions. + +; MinTown=430 +; MaxTown=590 + +;---------------------------- +; Strategy game constants... +; We keep the following table for people in the +; game: +; There are 60+ people, each has like the following: +; (16 bytes in all) +; .b: Bit 0 set if has met Pat +; : Bit 1 set if has met Billy +; .b Opinion of Billy. 0=hatred, 255=infatuation. +; .b Opinion of Pat. +; .b Time till prepared to do next robbery. +; .b Time till prepared to help Pat again. +; .b (Identikit stuff) +; .b + TVDPeopleNameOffset=6 +; .b +; PeopleBillyMenuOffset=8 +; .w Current Menu number for talking to Billy + PeoplePatMenuoffset=10 +; .w Current Menu number for talking to Pat +; .w +; .b,.w +; These people have their initial opinions and identikits +; randomly assigned. The position in the list corresponds +; to TownFixedData(ptr is offset 0) which contains a room number and an XZH +; number for the person (620..650) as they appear small. +; If the xzh number is zero, there is assumed to be one +; person only in the room (e.g. inside shops, where there +; is no small person shown). +; i.e. the format of this fixed table is: +; (8 bytes per person) + +; .b room number +; .b xzh number +TFDMenuOffset=2 +; .b initial menu number (half menu offset) +; .b +; .w +; .b +TFDPersonTypeOffset=7 +; .b + +; example is... +; dc.b NoPerson ; room number in which person appears =255 for end of this table. +; dc.b 0 ; xzh number used to represent person (0 if none, or any +;; xzh within range 620..650) +; dc.b DefaultMenu ; Current menu to use in conversations / 2 +; dc.b 1 ; identikit type prototype to use +; dc.b Default2ndMenu,NoName,0,YAM + + + + +; And there is a fixed table in TownFixedData(ptr is offset 2) +; which has the following entries (16 bytes per town) +; .w Increase in gold per time unit +; .w Maximum level of gold in bank. +; .w +; .w +; .w +; .w +; .w +; .w + +; There is a table containing all the bits of information +; people may want to know about: in TownVarData. +; This is initialised from a table of identical format +; in TownFixedData (except that offsets are relative to the +; start of this little table, wheras in TownVarData they +; are relative to TownVarData). The copy routine makes the +; appropriate conversion. +; +; .w Offset of "Money Location" information. +; .w Offset of "Deputies Location" information. +; .w Offset of "Gang Location" information +; .w Offset of "Recent robbery" information +; .w Offset of sub-plot table. + +; .w,.w Gold in Bank at town 0 +; .w,.w Gold in Bank at town 1 +; .w,.w Gold in Bank at town 2 +; .w,.w Gold in Bank at town 3 +; .w,.w Gold in Bank at town 4 +; .w,.w Gold in Bank at town 5 +; -1.w,-1.w + +; .w,.w Number of deputies in town 0 +; .w,.w Number of deputies in town 1 +; .w,.w Number of deputies in town 2 +; .w,.w Number of deputies in town 3 +; .w,.w Number of deputies in town 4 +; .w,.w Number of deputies in town 5 +; .w,.w Number of deputies in town 6 +; .w,.w Number of deputies in town 7 +; -1.w,-1.w +; .w,.w Gang location 0 +; .w,.w Gang location 1 +; .w,.w Gang location 2 +; .w,.w Gang location 3 +; .w,.w Gang location 4 +; .w,.w Gang location 5 +; .w,.w Gang location 6 +; .w,.w Gang location 7 +; -1.w,-1.w +; .w,.w Recent Robbery at ?, Gang/Billy involved? +; .w,.w Cattle rustled from ?, Gang/Billy involved? +; -1.w,-1.w +; .w,.w Sub-plot? +; -1.w,-1.w + +; offsets relative to TVD(SubPlotFlags) +; All are named in form SPFxxxx. +; When "Player" is specified in the comment, this +; usually means that the field has value 0, Pat, Billy. +; (Byte value). This leaves an extra byte spare in case it's needed. + +; 0 peasant being run off land +; 2 not used + SPFCowboysMet=4 ; (Mexican). Cowboys to ambush player in town? + SPFSickManOnHorse=6 ; sick man riding with Player? +; 8 peasant needs help nursing family +; 10 + SPFTexanPosseeAvailable=12 ; number of members (word) + SPFTrackingBarneysOutlaw=14 ; tracking outlaw suggested by +; Barney Mason + + SPFAccountsRequested=16 ; player been asked to fetch accounts? + SPFAccountsGot=18 ; player got accounts from store? + SPFGangToGrassOnBilly=20 ; gang name which has promised +; to grass on Billy + SPFFreeDeputies=22 ; number of deputies unallocated (word) + SPFBeefWanted=24 ; beef asked for by Indian Chief? + SPFUprisingOffered=26 ; number of uprisings available (word) + SPFMeetBountyHunter=28 ; meet bounter hunter referred +; to in 1634. Name of town: word + SPFAmbushDecision=30 ; cleared whenever go into new town, +; set when program has made a decision about whether Billy +; is to be ambushed here, or not. + SPFCounterfeitOffered=32 ; set when Billy has been offered +; counterfeit money as his share in a robbery. + SPFMcSweenStage=34 ; set to the following values: +; 0=startup - Mrs McSween running Tunstall ranch, happy. +; 1=Billy has been offered chance to save McSween's cows. +; 2=Sheriff Brady has gone to attack McSween. This is set when +; Billy has been told of this. If player does nothing, then +; we go on to 3. Otherwise 2 is the final state. +; 3=McSween is dead, ranch stays deserted + SPFJoeGrantMet=36 ; met Joe Grant? Set to 1 if yes but his +; gun unmolested, set to 2 if gun turned to empty chamber. +; Set to FF if duel fought. + SPFMeetBounterHunter=38 + SPFSevenRiversAmbush=40 ; ambushed by them in town? Byte + SPFJesseEvans=42 ; ambushed by them in town? Byte + SPFBuckShotRoberts=44 ; Billy ambushed by Buckshot? + SPFJoseMcSween=46 ; has player gone to help McSween at ranch? + +SantaFe=10 +WhiteOaks=11 +LincolnCity=12 +Mesilla=13 +Roswell=14 +ElPaso=15 +FortStanton=19 +FortSumner=20 +FritzRanch=25 +ChisumRanch=26 +DedrickRanch=27 +BeckwithRanch=28 +TunstallRanch=29 +ReedRanch=30 +MescaleroApache=35 +Train=39 +WagonTrain=40 +CooperGang=41 +RegulatorsGang=42 +SevenRiversGang=43 +DonaAnaBunchGang=44 +JesseEvansGang=45 +FugitivesGang=46 + +;------------ End Strategy game constants +ConstTillMDGoesBust=350 ; Amount of gold +; billy needs to steal to make each MD ranch to go bust. + + +; Strategy game constants... +; offsets of pointers relative to TownVarData(SubPlotsOffset) + SPMoneyOffset=0 + SPDeputiesOffset=2 + SPGangsOffset=4 + SPRobberyOffset=6 + SPSubPlotsOffset=8 + SPHiddenOffset=10 + SPCommsInfoOffset=12 + +; entries within CommsInfo... +CommsOtherPlayerLocation=0 ; byte + + +LawFulOffset=0 +HappinessOffset=1 +DeputiesOffset=2 +; Each town has the following variable table +; which is part of ObjectsInformation: 8 bytes each +; (i.e. 8 bytes per object, including e.g. cows, gangs) +; TVD(x1+LawfulOffset=0) .b 0 if lawless, 1 if lawful +; TVD(x1+HappinessOffset=1) .b How happy the town is: starts at 128 (moderately happy) +; to 0 (completely unhappy) and up to 255 (ecstatic) +; TVD(x1+DeputiesOffset=2) .b Number of deputies stationed + + AshUpton=168 + + barneyMason=960 ; 60*16 + TomOFoliard=1600 ; 100*16 + + +;------------------- +;MUSIC + ambushMusic=100 + BankJobMusic=102 + BarBrawlMusic=104 + CardMusic=106 + ChaseMusic=108 + DuelMusic=110 + Generic1Music=112 + Generic2Music=114 + Generic3Music=116 + Generic4Music=118 + Generic5Music=120 + GetawayMusic=122 + HoeDown1Music=124 + HoeDown2Music=126 + HonkyMusic=128 + Rag3Music=130 + RagTimeMusic=132 + ShockMusic=134 + ShootOutMusic=136 + ThemeMusic=138 + TrainMusic=140 + +; SOUND SAMPLES - offsets of filename pointers in IntroTables + UghSample=150 + Colt45Sample=152 + +; Sample list offsets + ShootoutSamples=180 + DuelSamples=182 + RustlingSamples=184 + TrackingSamples=186 + EscapeSamples=188 + BankJobSamples=190 + CardSamples=192 + BrawlSamples=194 + TrainSamples=196 + IntroSamples=196 + +; MENU NUMBERS + ClearOffMenu=4 ; clear off buster, I don't associate with your kind + + LoseRepMessage=907 ; message checked for to reduce player's +; reputation by a bit (When no specific message is printed) + + HourglassObject=94 ; xzh object containing hourglass symbol, +; in all parts. + + + + JoyU=1 ; Bit set for Joystick Up + JoyD=2 ; " " " " Down + JoyL=4 ; " " " " Left + JoyR=8 ; " " " " Right + JoyF=192 ; " " " Joystick/Mouse buttons (fire is bit6) +; + + SamplesOffset=0 ; AdlibSpace + SamplesSpace=10000 + MidiOffset=10000 ; SamplesOffset+SamplesSpace + MidiSpace=17050 ; space for largest midi score. + AllSoundSpace=27500 ; SamplesOffset+SamplesSpace (does not include +; adlib file) + AdlibOffset=27500 ; offset of adlib file within list19. + AdlibSpace=1350 ; space for adlib file (PC only) + MidiList=19 + SamplesListNumber=25 + + + ReleaseGame=1 ; set to 1 for release game. (e.g. disables certain errors) + + CDListNum=2 + + English=1 ; 0 will also default to english, but is used +; to indicate that user hasn't yet chosen. + German=2 + French=3 + + CommsByteUpdate=36 + CommsWordUpdate=37 + CommsWantFinalDuel=38 + CommsAcceptFinalDuel=39 + CommsOtherPlayerHasLost=40 + CommsOtherPlayerHasWon=41 + CommsIveDrawn=42 + CommsIveShotYou=43 + CommsRedisplayMap=44 + CommsDuelReady=45 ; figures set up, ready to go. \ No newline at end of file diff --git a/l9dev/regress/games.l9/billy.l9/aahead.txt b/l9dev/regress/games.l9/billy.l9/aahead.txt new file mode 100644 index 0000000..63db554 --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/aahead.txt @@ -0,0 +1,434 @@ +; AAHead.txt +; +; M.J.Austin Nov 1988 +; +; Copyright (C) 1988 Level 9 Computing +; +;---- +; tables shared between strategy task and AA stuff... +table +; CurrentX=12 +; CurrentZ=13 +; CurrentH=25 + Hires=12 + + begin + data @Start,@Start ; Dummy - overwritten by "ToMCEnd" vector +.Start + code + + data @AcodeFns,@MCFns ; pointers to the major jump blocks + + +.AcodeFns +; jump table for acode functions called from MC + goto @AcodeStart + goto @FGSpecials + goto @FGSpecialsMovedSprite + goto @BGSpecials + goto @Dummy ; SpecialCollision + goto @DAMSSpecials + goto @IRQScheduler + goto @VBL + goto @HandleCR + goto @ExtraTask + goto @StrategyTask + goto @ErrorHandler + goto @OverlayEntryPoint ; OverlayEntryOffset = 12 + +.MCFns +; jump table for MC functions called from Acode +; reserve 6 bytes per jump - absolute, long jumps +; poked in by MC +.vMCHeroOnceOnlyInit data @Dummy,@Dummy,@Dummy ;0 +.vMCHeroInit data @Dummy,@Dummy,@Dummy ;1 +.vMCClearScreen data @Dummy,@Dummy,@Dummy ;2 + +.vMCMoveScreen data @Dummy,@Dummy,@Dummy ;3 +.vMCSpecials data @Dummy,@Dummy,@Dummy ;4 +.vMCBuildBackground data @Dummy,@Dummy,@Dummy ;5 +.vMCDisplayDestroyedWalls data @Dummy,@Dummy,@Dummy ;6 +.vMCMoveAllSprites data @Dummy,@Dummy,@Dummy ;7 +.vMCDisplayAllSprites data @Dummy,@Dummy,@Dummy ;8 +.vMCTrimEdges data @Dummy,@Dummy,@Dummy ;9 +.vMCDisplayTextLine data @Dummy,@Dummy,@Dummy ;a +.vMCDisplayUpperTextLine data @Dummy,@Dummy,@Dummy ;b +.vMCDoAllTimers data @Dummy,@Dummy,@Dummy ;c +.vMCCalculateMemoryFree data @Dummy,@Dummy,@Dummy ;d +.vMCHeroInput data @dummy,@Dummy,@Dummy ;e +.vMCOswrchV1 data @Dummy,@Dummy,@Dummy ;f +.vMCInvertedOswrchV1 data @Dummy,@Dummy,@Dummy ;10 +.vMCDestroyTempMoved data @Dummy,@Dummy,@Dummy ;11 +.vMCDestroyTempFixed data @Dummy,@Dummy,@Dummy ;12 +.vMCCloseDown data @Dummy,@Dummy,@Dummy ;13 +.vMCFindSprite data @Dummy,@Dummy,@Dummy ;14 +.vMCSetUpNewSprite data @Dummy,@Dummy,@Dummy ;15 +.vMCSprite data @Dummy,@Dummy,@Dummy ;16 +.vMCHandlePlayerInput data @Dummy,@Dummy,@Dummy ;17 +.vMCReturnFrameTime data @Dummy,@Dummy,@Dummy ;18 +.vMCUpdateFrameTime data @Dummy,@Dummy,@Dummy ;19 +.vMCClearRectangle data @Dummy,@Dummy,@Dummy ;1d +.vMCMapBuildBackground data @Dummy,@Dummy,@Dummy ;1a +.vMCPreScrollMap data @Dummy,@Dummy,@Dummy ;1b +.vMCSpecialCheck data @Dummy,@Dummy,@Dummy ;1c +.vMCStartBigExplosion data @Dummy,@Dummy,@Dummy ;1d +.vMCScrollTextLine data @Dummy,@Dummy,@Dummy ;1e +.vMCReCalcSpriteGraphics data @Dummy,@Dummy,@Dummy ;1f +.vMCOsrdch data @Dummy,@Dummy,@Dummy ;20 +.vMCChecksum data @Dummy,@Dummy,@Dummy ;21 +.vMCEmptyRoom +.vMCInit3D data @Dummy,@Dummy,@Dummy ;22 +.vMCDrawObjectV1 data @Dummy,@Dummy,@Dummy ;23 +.vMCBuildRoom +.vMCBuildViewMap data @Dummy,@Dummy,@Dummy ;24 +.vMCDisplayRoom +.vMCDisplayViewMap data @Dummy,@Dummy,@Dummy ;25 +.vMCInitBootPrg data @Dummy,@Dummy,@Dummy ;26 +.vMCReturnSpriteAddress data @Dummy,@Dummy,@Dummy ;27 +.vMCNoClipSprite data @Dummy,@Dummy,@Dummy ;28 +.vMCCalcScreenAddress data @Dummy,@Dummy,@Dummy ;29 +.vMCSaveFile data @Dummy,@Dummy,@Dummy ;2a +.vMCLoadFile data @Dummy,@Dummy,@Dummy ;2b +.vMCCopy data @Dummy,@Dummy,@Dummy ;2c +.vMCAbsChangeListPtr data @Dummy,@Dummy,@Dummy ;2d +.vMCLoadCells data @Dummy,@Dummy,@Dummy ;2e +.vMCSetUpPtrs data @Dummy,@Dummy,@Dummy ;2f +.vMCParseInputWord data @Dummy,@Dummy,@Dummy ;30 +.vMCInitTask data @Dummy,@Dummy,@Dummy ;31 +.vMCSnooze data @Dummy,@Dummy,@Dummy ;32 +.vMCAddToListPtr data @Dummy,@Dummy,@Dummy ;33 +.vMCReserveMemory data @Dummy,@Dummy,@Dummy ;34 +.vMCSetUpVariablePtrs data @Dummy,@Dummy,@Dummy ;35 +.vMCPreLoadCells data @Dummy,@Dummy,@Dummy ;36 +.vMCPlotLogicalScreen data @Dummy,@Dummy,@Dummy ;37 +.vMCPlotPhysicalScreen data @Dummy,@Dummy,@Dummy ;38 +.vMCUpdateScreen data @Dummy,@Dummy,@Dummy ;39 +.vMCUnPlotScreen data @Dummy,@Dummy,@Dummy ;3a +; returns v1=actual frame time in ms +.vMCSetPalette data @Dummy,@Dummy,@Dummy ;3b +.vMCSetTextWIndow data @Dummy,@Dummy,@Dummy ;3c +.vMCSetGraphicsWindow data @Dummy,@Dummy,@Dummy ;3d +.vMCClearChangeMaps data @Dummy,@Dummy,@Dummy ;3e +.vMCClearTextBuffer data @Dummy,@Dummy,@Dummy ;3f +.vMCCopyTextBuffer data @Dummy,@Dummy,@Dummy ;40 +.vMCEnableTextBuffer data @Dummy,@Dummy,@Dummy ;41 +.vMCInitSound data @Dummy,@Dummy,@Dummy ;42 +.vMCStartSound data @Dummy,@Dummy,@Dummy ;43 +.vMCFindObj data @Dummy,@Dummy,@Dummy ;44 +.vMCInitGraphics data @Dummy,@Dummy,@Dummy ;45 +.vMCCalcMatrix data @Dummy,@Dummy,@Dummy ;46 +.vMCDrawVector data @Dummy,@Dummy,@Dummy ;47 +.vMCKeyDown data @Dummy,@Dummy,@Dummy ;48 +.vMCInitJoystick data @Dummy,@Dummy,@Dummy ;49 +.vMCReserveChip data @Dummy,@Dummy,@Dummy ;4a +.vMCSaveProtect data @Dummy,@Dummy,@Dummy ;49 +.vMCInitScrolling data @Dummy,@Dummy,@Dummy ;47 +.vMCScrollDirection data @Dummy,@Dummy,@Dummy ;48 +.vMCPurgeAllCells data @Dummy,@Dummy,@Dummy ;49 +; MCSetTextWindow = Allocate memory for text buffer +; v1=top screen line +; v2=number of screen lines +; MCSetGraphicsWindow = Set graphics clipping +; v1=Left X +; v2=Right X +; v3=Top Y +; v4=Bottom Y +; MCClearChangeMaps = (Rebuild physical screen from Buffer2) +; MCClearTextBuffer = Clear one character row of text buffer +; v1=buffer Y to clear +; MCCopyTextBuffer = Copy text buffer to physical screen +; v1=Buffer Y to top of text window +; MCEnableTextBuffer = Select character output +; v1=0, write to TextScreenBase +; v1=mask: 1=buffers, 2=Logical, 4=Physical + +.vMCSetMaxFrameRate + data @Dummy,@Dummy,@Dummy ; 80 +; Paramters: +; V1 = 84; Time in milliseconds + +.vMCSetPreloadPalette + data @Dummy,@Dummy,@Dummy ; 81 + +.vMCCopyScreenToBuffer + data @Dummy,@Dummy,@Dummy ; 82 +; Copies the logical screen back to the buffer screen, thus adding +; any sprites on a semi-permament basis. Note though, that any +; insert/remove activity will corrupt these added sprites. Also +; these added sprites do not obey the 3D rules, so may give +; peculiar effects + +.vMCRasterHandler + data @Dummy,@Dummy,@Dummy ; 83 */ +; /* Parameters: +; V1 = destination raster +; V2 = source raster or clear color +; V5 = 2; /+ copy raster +/ 0=clear to color + +.vMCSetPrintRaster + data @Dummy,@Dummy,@Dummy ; 84 +; Parameter: V1=raster to print onto from now on. Must be in memory. + + +.vMCSetPrintFont + data @Dummy,@Dummy,@Dummy ; 85 +; v1=list number, v2=offset, v3=CGA palette code (mono machines only) + + +.vMCRasterPrintCharacter + data @Dummy,@Dummy,@Dummy ; 86 */ + +.vMCPasteCell + data @Dummy,@Dummy,@Dummy ; 87 + +.vMCMobilityAbility + data @Dummy,@Dummy,@Dummy ; 88 + +.vMCLoadCellDataDirect + data @Dummy,@Dummy,@Dummy ; 89 +; /* V1=list #, v2=offset, v3=cell # */ + +.vMCTransferParkedSprites + data @Dummy,@Dummy,@Dummy ; 90 + +.vMCDigitise + data @Dummy,@Dummy,@Dummy ; 91 +; /* Paramters: +; V5=0 Initialise +; V5=1 Terminate System +; V5=2 FindState Audio (returns V1=0 or 0FFFF) +; V5=3 Wait For Audio +; V5=4 Volume Control (V5=Volume) +; V5=5 Translate Sample (V1,V2 = sample, V6 = length, +; V3=Frequncy, V4=Volume) +; V5=6 Play Sample (V1,V2 = sample, V3=Frequency, +; V4=loop count, V6=Repeat flag) +; V5=7 Terminate Sample +; */ + +.vMCOnceOnlyMusicInit + data @Dummy,@Dummy,@Dummy ; 92 +; /* Returns V1,V2 = (driver) InfoWord +; V6 = 00000ABC +; A=1 Adlib sound driver +; B=1 Roland sound driver +; C=1 ReelTalk +; (Note: Adlib/Soundblaster requires a resident driver to be +; loaded before the game. If the driver is absent an +; error handler call occurs before V6 is returned) +; (Note: This is one of the few cases where error handlers +; could occur before SetUpVariablePtrs, so take care +; not to PRINT to the buffer screens) +; */ + +.vMCInitialiseScore + data @Dummy,@Dummy,@Dummy ; 93 +; /* Paramters: +; V1 list V2 offset Music Score +; V3 list V4 offset Adlib Instrument File +; V5 Score number (0-3) +; */ + +.vMCPlayScore + data @Dummy,@Dummy,@Dummy ; 94 +; /* Paramters: +; V1 Score number (0-3) +; V2 Repeat Flag (255=forever, 0=once, #=number of times) +; V3 Operation (0=restart, 1=resume, 2=stop) +; */ + +.vMCMusicCloseDown + data @Dummy,@Dummy,@Dummy ; 95 + +.vMCOpenSpriteFile + data @Dummy,@Dummy,@Dummy ; 96 +; /* Paramters: +; V1 list V2 offset = first 7 chars of sprites file name +; */ + +.vMCstopWithMessage + data @Dummy,@Dummy,@Dummy ; 97 +; /* Parameters: +; V1 list V2 offset = 80 character error message +; As MCCloseDown but also prints message +; */ + +.vMCJumpOverlay + data @Dummy,@Dummy,@Dummy ; 98 +; v1 is ascii code: e.g. acode1.acd, gamedat1.dat +; v2 is offset starting from 0 of routine within overlay + +.vMCCallOverlay + data @Dummy,@Dummy,@Dummy ; 99 +; v1 is ascii code: e.g. acode1.acd, gamedat1.dat +; v2 is offset starting from 0 of routine within overlay +; Do a return when you've finished in the overlay to +; reload the caller + +.vMCLoadGamedata + data @Dummy,@Dummy,@Dummy ; 100 +; v1 is ascii code: e.g. gamedat1.dat +; Loads in gamedata but does not affect acode file. +; Remember that list1..9 pointers will be changed, +; with the exception that any pointers equal to 0 in the new +; table.txt/dat will not change the existing pointers + +.MCloadEXE ; 101 + data @Dummy,@Dummy,@Dummy +; Description: Loads a file containing a DOS-style relocation table +; Args: V1 = list, V2=offset; of file name +; V3 = list, V4=offset; load address +; Returns: V1,V2 = size of file loaded +; +.MCSqueak ; 102 + data @Dummy,@Dummy,@Dummy +; Description: clicks internal speaker +; Args: none +; Returns: none +; +.MCinitSerial ; 103 + data @Dummy,@Dummy,@Dummy +; Description: Initialise serial comms/Clear RX and TX buffers +; Args: none +; Returns: V1=0 success +; V1=FFFF no serial port (not installed) +; + +.MCreadSerial ; 104 + data @Dummy,@Dummy,@Dummy +; Description: Read Serial port (buffered) +; (V2/V3 are status only. Error conditions are always in V1) +; Args: none +; Returns: V1 = FFFF (nothing read) +; V1 = 0 thru 00FF (byte received) +; V2 = bytes remaining in RX buffer (normally 0) +; V3 = bytes remaining in TX buffer (normally 0) +; + +.MCwriteSerial ; 105 + data @Dummy,@Dummy,@Dummy +; Description: Writes serial port (buffered) +; (V2/V3 are status only. Error conditions are always in V1) +; Args: V1 (lo byte only) byte to send +; Returns: V1 = 0 byte sent (or put in TX buffer) +; V1 = FFFF Buffer full +; V2 = bytes remaining in RX buffer (normally 0) +; V3 = bytes remaining in TX buffer (normally 0) +; + +.MCdecodeFile ; 106 +; Description: Decompress LZH file. (Presumably the file is loaded +; with the flag ByteWS[DisableLZH] set.) +; +; Args: V1=list, V2=offset Compressed file +; V3=list, V4=offset Decompress file +; Returns: V1=(decompressed) file length +; V1=FFFF file not LZH format +; + +.MCChooseVGAcard ; 107 + data @Dummy,@Dummy,@Dummy +; Description: See M Bryant +; Args: V1=Card number +; Returns: none +; + +.MCCopyVGAtoVGA ; 108 + data @Dummy,@Dummy,@Dummy +; Description: See M Bryant +; Args: V1=Source card number +; Returns: none +; + +.MCvalidateSoftInterrupt ; 109 + data @Dummy,@Dummy,@Dummy +; Description: Check software interrupt is initialised +; Args: V1=list +; V2=offset +; V3=interrupt number +; If not initialised exits to MCstopWithError +; (Displays error message in list V1) +; V1=FFFF +; V3=interrupt number +; Returns: V1=0 not initialised +; V1=segment, initialise +; + +.MCcallSoftInterrupt ; 110 + data @Dummy,@Dummy,@Dummy +; Description: execute INT instruction +; Args: V1 = interrupt number +; V2 = List address for DS:SI +; V3 = List address for ES:DI +; V4 = List containing 5 words, for registers ax,bx,cx,dx,bp +; Word at offset 0: AX +; Word at offset 2: BX +; Word at offset 4: CX +; Word at offset 6: DX +; Word at offset 8: BP +; Returns List V2 redirected to returned DS:SI +; List V3 redirected to returned ES:DI +; List V4 contents altered to returned ax,bx,cx,dx,bp + + + + + + data @Dummy,@Dummy,@Dummy ;50 + data @Dummy,@Dummy,@Dummy ;50 + data @Dummy,@Dummy,@Dummy ;50 + data @Dummy,@Dummy,@Dummy ;50 + data @Dummy,@Dummy,@Dummy ;50 + data @Dummy,@Dummy,@Dummy ;50 + data @Dummy,@Dummy,@Dummy ;50 + data @Dummy,@Dummy,@Dummy ;50 + data @Dummy,@Dummy,@Dummy ;50 + data @Dummy,@Dummy,@Dummy ;50 + data @Dummy,@Dummy,@Dummy ;50 + data @Dummy,@Dummy,@Dummy ;50 + data @Dummy,@Dummy,@Dummy ;50 + data @Dummy,@Dummy,@Dummy ;50 + data @Dummy,@Dummy,@Dummy ;50 + + + +.Dummy + code - + prs " bug!" + + code + +.AcodeDelay +; gosub @Delay +; goto @HeroLoop + +.AcodeStart + goto @Start3D + +.HandleCR +; MCOSWRCH has requested a cr. + gosub @DoCR + return + + +code - +; +; +; Args for MCDrawObjectV1: +; V1: object number +; V2: x coord in pixels +; V3: z " +; V4: h " +; V5: flag = -1 for remove object from structure +; 0 for insert object into structure +; +ve draw to screen directly (as a sprite) + +; Args for MCSetPalette: +; V1=list number +; V2=offset within list +; +; list: db x ) 16 times +; db y ) +; where yyyy yyyy xxxx xxxx +; red. green blue RGBI +; 0..7 (VGA) (EGA) + + diff --git a/l9dev/regress/games.l9/billy.l9/aavars.txt b/l9dev/regress/games.l9/billy.l9/aavars.txt new file mode 100644 index 0000000..328a0e2 --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/aavars.txt @@ -0,0 +1,295 @@ +; AAVars.txt +; +; M.J.Austin Nov 1988 +; +; Copyright (C) 1988 Level 9 Computing +; + var +; LoopCounter1 LoopCounter2 + c4 + PrintX PrintY + LeftMargin ; margin for printing code. + TopMargin +; RepeatCount +; SelectedLine +; FirstLine + xsize ysize zsize + size + ObjectNumber + Header + ObjectNumberType + MinXZH MinCompressed MinAnimation MinCell + MinRaster + byte1 Byte2 Byte3 + CurrentAnimationY +; ObjectSizeIncrease ItemSizeIncrease +; HighlightedX HighlightedY CurrentArg HighlightedArg +; AniViewMode ; 0 for script/1 for preview +; PixelCursorH PixelCursorX +; XZHFlashCounter2 + AA CC EE ; ACB words + opcode num SP z h ACBHeader +; PixelCursorY + +; px1 + +; TextAreaSaved +; SchedulerX1 +; SX1 +; bx1 ; used in save/display backdrop ONLY +; tx1 + ViewMapBuilt +; PlayerPixelX PlayerPixelZ PlayerPixelH +; FlashCount CursorIsOn + +; PlayerPixelXSpeed +; crx1 crx2 ; for use in DoCr only. + MaxX + dx1 dx2 dx3 dx4 dx5 dx6 dx7 +; ix1 ix2 ix3 ix4 + dresult +; ACBsOnly XZHCursorX XZHCursorZ XZHCursorH +; UseMC +; vblx1 vblx2 vblx3 + CursorACB + dv1 dv2 dv3 dv4 dv5 dv6 + ACBPtr + CurrentStore ; for z-sorting sprites on output +; ACBLoopBreaker +; EntryV1 ; really only needed for editor + ExitOffsets + PlayerACB + RasterOffset + RoomCDWidth + +; shared between user interface task and graphics task... +; KeyPadDirection LastRequestedDirection + c16 c32 + +; ClimbingStairs ; npc currently climbing stairs +; StairsZ ; Z pos of stairs +; StairsX ; X pos of stairs +; ExecutingCommand ; set when player is executing a menu command +; ExecutingRacetrack ; set when player executing a racetrack (e.g. +; an involuntary distraction) +; JustArrived ; flag set when npc just arrived at a destination pos +; MenuText MenuData +; +; WantMenu ; set in user interface task, checked by strategy +; GameLoopTimer ; incremented every game loop +; NpcLoopTimer ; incremented every npc activations loop +; UserDisabled ; set when manual control disabled +; FastMode ; set when game runs without display +; TestHiresCoords ; flag set when hires co-ords should be tested +; when doing people collision, as an oppose to using on-screen co-ords + + ReturnCode CurrentSquare + PointOnMap + + ACBStart ; now a variable so that BuildAndDisplayFrame can +; be used for room animation only + +; GoalNowX GoalNowZ ;coords right now + + FireKey FireKeyChange LastFireKey + LeftKey RightKey UpKey DownKey XSpeed YSpeed + + m1 m2 + TextBoxDisplayed TextBoxWidth + PlayerDirection + PlayerX PlayerZ + + PleaseStopPlayer ; set to non-zero if something wants +; the player to stop walking. + result + + + + C0 C1 C2 C3 ; + C5 C7 C9 ; + C6 C8 C10 ; "Constants" with corresponding values + x y + +; gunfight stuff: + length height positionx positiony; variables for gunfight + Hit ; flag for hit in gunfight + arraycount + +; WaitingForInput ; interlock for continous npc actions +; InputX1 InputX2 ; for use by input routine +; CSx1 ; CalcScreenAddress + object +; IBMScrollOffset +; Joystick joystickInUse +; Debug1 Debug2 Debug3 Debug4 ;! + +; graphics task vars... +; gxdirection gydirection +; g1 g2 g3 g4 + +;framelimiting variables: +;; framelimiting + FrameCount DisplayedFrameCount + +; LastKey ;Joystick value + +; PRINT.TXT variables needing common access across overlays... + PrintRasterNum + FirstAsciiInFont + FontHeight ; character height, in pixels + + + + + Won + GameOver + + RepeatScroll ; countdown timer for TriggerScroll + + +; text printing vars... + ForegroundColour + BackgroundColour ; (0-16), + RasterPrintWidth ; = width of text, +; RasterPrintRaster + RasterPrintX + RasterPrintY + CurrentDO + CurrentPrintRaster + + + + UpdateACBs ; false if acbs are to be frozen for a while, +; e.g. whilst displaying menu + +; MeetingPerson ; set to Identikit number of person to meet, +; if we're due to meet them. + Town ; contains number of town/map location being visited + Location ; contains number of location (e.g. within town) +; being visited by player. + + NextMusic ; contains next music + + ScrollXDir ScrollYDir + ScreenX ScreenY + + TellOtherPlayer ; set to 1 if TownUpdateRoutine is to +; pass on the change to the other player. + PeopleVarData ; offset within TownVarData() + + AccostCounter ; time till someone in the room +; thinks about accosting Billy - presumably with some +; interesting other or other. + + PosRange NegRange ; size of CD for HiresCD + + TwoPlayerMode + + IdentikitTableBase ; offset within TVD. + + + + + + + + WantedDirection ; mainly for compatability with walkabout code. + + + CurrentScreen + + CurrentRoom RoomNum + MapNumber + + MenuDisplayed + MenuOffset ; offset of menu tables within IntroTables + MenuNumber ; menu we want to display + + PlayersName ; contains 2 is Billy, 3 if Pat. Corresponds to +; message number in all parts. + + cursory + CursorX CursorZ CursorH ; position of people + CursorSpeed TimeHeld + KeyHeld MaxCursorSpeed CrossHairACB + + StructureFile ; set to either TownStructures or IdentikitStructures + + lastTunePlayed + PersonDisplayed ; set to true when there is + SubPlotsOffset ; offset of ptrs within TownVarData + + ThisPersonVarData ; TownVarData(PersonVarData) is for NPC we're talking to. + + SubPlotFlags ; offset in TVD of flags and counters etc. +; used in subplots - see arbitrary offsets (SPFxxxxx) defined +; in AACONST.TXT + + GameOverTimer + ACBEnd + ACBSearchStart + + PlayerReputation + PlayerGold + ObjectsInformation ; used in Strategy.txt as an offset into TVD + +;; LastMapX LastMapY + TicksSinceLawful + RobberyTillMDGoesBust ; amount of money that Billy still +; needs to steal before the next Murphy-Dolan ranch goes bust. + + PlayerIncome ; amount of gold earned by player since last +; screen - used mainly for Billy robbing things, to determine +; when another Murphy Dolan ranch goes out of business. + ExtraNewsStory ; message number of extra news stories... e.g. +; ranches going out of business etc. Commonly in range +; 400+Location number. + +;; BillysCash ; Billy's global cash, used in card game + + Round ; game round, passed from main game + RoundsToPlay ; number of game rounds to win the brawl + + NextMeetingMenu ; message printed next time we leave the +; map to visit somewhere: like the random meetings, but can +; be easily programmed by other code. Used for when +; the law enforcement budget runs out and we have to +; fire deputies. Also when a town rebels. +; NextMeetingMessage ; like NextMeetingMenu, but just a quick message +; always from the player's second in command + + PatWarnings ; number of warnings player has had about imminent loss of game + TexanDeputies ; number of free deputies from Texas + + PlayerGang ; set to LOCATION of gang which has been recruited + + HourglassState ; =0 -> not displayed +; =1 -> want it displaying +; =2 -> currently displayed + + Difficulty ; current difficulty of arcade game. Standard +; is 256, will usually get harder as game progresses. +; If it doubles, the game should be twice as hard. + + BillyLives ; number of lives remaining (number of times +; he can get nursed) + + TotalGoldStolen ; total amount of gold stolen in game + + SoundOn ; 0 if sound is disabled, 1 if sound FX are on + MusicOn ; 0 if music is disabled, 1 if music is on + + SmoothScroller ; 0 for jump scrolling, non-zero for smoothy + + CopyProtectChecked ; 0 until it's been checked. + + ScrollDirectionDone ; set when ScrollDirection has been +; done in a particular frame - reset at the end of DisplayEverything + PlotLogicalDone ; set when ScrollDirection has been +; done in a particular frame - reset at the end of DisplayEverything + + + Language + EnemyName ; name for duel: Pat, Billy or $ff for other. + + CGAMode ; set to non-zero for CGA2/4. 0 for EGA/VGA etc. \ No newline at end of file diff --git a/l9dev/regress/games.l9/billy.l9/amconst.txt b/l9dev/regress/games.l9/billy.l9/amconst.txt new file mode 100644 index 0000000..752767b --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/amconst.txt @@ -0,0 +1,10 @@ +; Machine constants +; MCONST.TXT +const + st=1 ; conditional assembly + ReallyST=0 + Amiga=1 + pc=0 + notPc=1 + Scrolling=1 + AllowMusic=1 diff --git a/l9dev/regress/games.l9/billy.l9/arcade.txt b/l9dev/regress/games.l9/billy.l9/arcade.txt new file mode 100644 index 0000000..56ed434 --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/arcade.txt @@ -0,0 +1,275 @@ +; ARCADE.TXT +; +; Minor 'arcade' games for Billy, called from within town. +; e.g. Bank Robbery, card game. +; +; Mike Austin September 1990. +; +; Copyright (C) 1990 Level 9 Computing Ltd. +; +; + var + StickMoving ; timer until stick arrives. + MovingToLeft ; set to true if stick is moving that way. + + begin + +.BankRobbery + gosub @CheckPlayerGang ; in two player mode, gang +; can be wiped out whilst Billy's walking in town. + if PlayerGang<>0 then BankRobWithGang + m1=858 ; Billy did not have a gang for bank job + gosub @DisplayInstructions ; gosub, return + goto @BackToWalkabout + +.BankRobWithGang + CurrentScreen=BankGame + NextMusic=Generic5Music ; BankJobMusic + + v4=BankJobSamples + gosub @LoadSamplesForGame + +; set DuelStatus as how many locks/hinges will be on this safe +; (there are originally six on the picture, we want to get +; rid of between 0 and 4 of them. i.e. we want 2..6) + code - + x2=5 + gosub @iRandomLimitX2 +; get x3 as a random number less than x2 +; i.e. there will be x2 possible values. + add x3,c2 ; between 2 and 6 + code + +; initialise various variables for this game + DuelStatus=x3 + StickMoving=0 + MovingToLeft=0 + + v4=7 ; in bank, positioning dynamite + gosub @DisplayLinkingPicture ; load linking structure file, +; open sprites file, and build the picture we've asked for(v4). +; preload the most graphics-intensive outcome scenes now... + dv1=9 ; too much picture + dv5=dMarkPreload + gosub @MCDrawObjectDV1 + dv1=11 ; too little picture + gosub @MCDrawObjectDV1 + gosub @MCPreloadCells + gosub @MenuWait ; wait for fire to be released + + RasterOffset=0 + ObjectNumber=20 ; 6 sticks of dynamite on left + dv2=228 ; x + dv3=58 ; z + dv4=65439 ; h + gosub @StartFreeACB + x5=dx4 ; save off acb for Left Hand Pile + push x5 + ObjectNumber=26 ; 0 sticks of dynamite on left + dv2=258 ; x + gosub @StartFreeACB + pop x5 + x6=dx4 ; save off acb for left hand pile + +.BankLoop + push x5 + push x6 + gosub @PlayTuneForScene + gosub @DisplayEverything + gosub @sGetControls + pop x6 + pop x5 + gosub @BankControls + if FireKey=0 then BankLoop + if FireKeyChange=0 then BankLoop + +; have pressed fire to leave the dynamite. What happens? + &dx1=ACBList(x5) ; how many sticks at left? + dx2=20 + sub dx1,dx2 ; dx1 = 6-number of sticks at left, Therefore +; dx1=number of sticks at right. + dv1=9 ; 9=too much dynamite. 10=safe open. 11=too little. + Won=false + if dx1>DuelStatus then BankOutcome + dv1=10 ; right amount + Won=true + if dx1=DuelStatus then BankOutcome + dv1=11 ; too little +.BankOutcome + push dv1 + gosub @MCEmptyRoom + gosub @InitACBs + v1=0 + v2=0 + gosub @MCBuildRoom + gosub @DisplayEverything ; display black screen + FrameCount=0 ; leave screen black for at least a second. + pop dv1 ; 9=too much dynamite. 10=safe open. 11=too little. + push dv1 + gosub @PreLoadAndInsertDV1 + pop dv1 +; now everything for the "outcome" should be in memory. +; If it's happened too fast (e.g. on a fast PC), wait a while + +.BRWait + if FrameCount<10 then BRWait + + push dv1 + gosub @MenuWait ; wait for fire to be released + +; now display the outcome screen.... + v1=0 + v2=0 + gosub @MCBuildRoom + + x1=Town ; 10..15 +; go to 31..36 for bank clerk number + x2=21 + add x1,x2 + MenuNumber=32 ; "we've been robbed" menu + gosub @NewMenuForPerson +; next time Player talks to person x1, use menu MenuNumber + + x2=Town + gosub @GetMoneyInBank +; return x2=TVD(x5) as amount of money in bank at town x2 (10..) + gosub @SetPrintMenu + pop dv1 ; outcome: dv1=10 = safe open + if dv1<>10 then BREnd5 ; only display amount of gold if safe open + if x2>10 then BREnd2 + x2=10 + +.BREnd2 + x1=x2 + add PlayerIncome,x1 ; paramter for BuildNewScreen entry point + asr x1 + asr x1 + asr x1 + asr x1 + add PlayerReputation,x1 ; gain more reputation for big robberies + add PlayerReputation,c4 ; always gain some reputation + code - + gosub @iStartPrinting + message 868 ; the safe contained + print x2 + message 869 ; dollars worth of gold + gosub @iEndPrinting + code + + TextBoxDisplayed=CurrentDO + +.BREnd5 + gosub WaitFireDisplay + goto @ToEscapeGame +;------------ +.WaitFireDisplay +.BRLoop + gosub @DisplayEverything + gosub @sGetControls + if FireKey=0 then BRLoop + if FireKeyChange=0 then BRLoop + return +;--------- +.BankControls +; have called GetControls. +; acb for LH pile of dynamite is at x5, +; acb of RH pile dynamite is at x6. +; shovel between the two, and start animation sequences +; to make the arm move. + &dv1=ACBList(PlayerACB) ; where is arm? + + if StickMoving=0 then @BCNotMoving + sub StickMoving,c1 + if StickMoving=4 then BC2 + if StickMoving<>0 then @BCRet +.BC2 +; stick arrives - but where? +; if dv1=842 then PlaceAtRight +; if dv1=845 then PlaceAtRight +; if dv1=841 then PlaceAtRight + if MovingToLeft=false then PlaceAtRight +; place at left + if StickMoving<>0 then TakeFromRight + dx4=x5 ; acb for left pile + &ObjectNumber=ACBList(dx4) + sub ObjectNUmber,c1 ; add a stick to pile + if ObjectNumber<20 then @BCRet ; too many sticks + goto @BCChangeACBDX4 ; gosub, return + +.TakeFromRight + dx4=x6 ; acb for right pile + &ObjectNumber=ACBList(dx4) + add ObjectNUmber,c1 ; take a stick from pile + goto @BCChangeACBDX4 ; gosub, return + +.PlaceAtRight + if StickMoving<>0 then TakeFromLeft + dx4=x6 ; acb for right pile + &ObjectNumber=ACBList(dx4) + sub ObjectNUmber,c1 ; add a stick to pile + goto @BCChangeACBDX4 ; gosub, return + +.TakeFromLeft + dx4=x5 ; acb for left pile + &ObjectNumber=ACBList(dx4) + add ObjectNUmber,c1 ; take a stick from pile + goto @BCChangeACBDX4 ; gosub, return + + +.BCNotMoving + dx4=PlayerACB + &dx1=ACBList(x5) ; how many sticks at left? + dx2=20 + sub dx1,dx2 ; dx1 = 6-number of sticks at left, Therefore +; dx1=number of sticks at right. + if dv1=840 then @BCArmAtLeft + if dv1=846 then @BCArmAtLeft ; initial acb to position arm + if dv1=841 then @BCArmAtRight +; arm is moving + +.BCRet + return ; can't control when moving. + +.BCArmAtLeft + if RightKey=0 then BCNotMoveToRight + if dx1=6 then BCRet ; all sticks already at right + MovingToLeft=false + ObjectNumber=842 ; move right with dynamite, then return empty. + gosub @BCChangeACBDx4 + StickMoving=4 + goto @TakeFromLeft ; make stick disappear at once + +.BCNotMoveToRight + if LeftKey=0 then BCRet + if dx1=0 then BCRet ; no sticks at right + MovingToLeft=true + ObjectNumber=843 ; move right empty, then return with dynamite. + gosub @BCChangeACBDx4 + StickMoving=8 + return +;--- +.BCArmAtRight + if LeftKey=0 then BCNotMoveToLeft + if dx1=0 then @BCRet ; no sticks at right + MovingToLeft=true + ObjectNumber=844 ; move left with dynamite, then return empty. + gosub @BCChangeACBDx4 + StickMoving=4 + goto @TakeFromRight ; make stick disappear at once. + +.BCNotMoveToLeft + if RightKey=0 then @BCRet + if dx1=6 then @BCRet ; no sticks at right + MovingToLeft=false + ObjectNumber=845 ; move left empty, then return with dynamite. + gosub @BCChangeACBDx4 + StickMoving=8 + return + +.BCChangeACBDX4 + push x5 + push x6 + gosub @ChangeACBDX4 + pop x6 + pop x5 + return + +;---------- diff --git a/l9dev/regress/games.l9/billy.l9/box.fnt b/l9dev/regress/games.l9/billy.l9/box.fnt new file mode 100644 index 0000000000000000000000000000000000000000..cc8fc236a016b80f65651fc457fbb7f3b3292ea8 GIT binary patch literal 887 zcmcIiv5MnB4Ali=Tm<7%g;}=T(p8vajWNa?DXz>13@l8uA(zsHm>9Ecam9UBz9Usi z*C__)p6syP51bf~-?OAAX@)X-rW5^R&pt`Mec|N)+Lw-j5zaV{Gw1FOhq$t3EKKC~ zT(}>UZ*ud?y%I5lgrzxio)R4mvpFKJyq69Vx7g^tX@D0Y~d3&q=01hDpGGNCX~YdLF(|8D7W0 zkjJq=5GE?!8iDE$2U`&tX{E*NVQQp-PUZW)_Z8g&`U^Mc)yEor&Hi$MZvRJhwLi@> zX6Zjoqo@_#cIL^QPVcIW z@(w)eIfr<~V(p_I8Wjg&@bkk%T|6Vk`yx%#J~U1B-`-EvMsdmWgVWz@4CrycewhpX RsJa^YP7W@ngiU8Sp}+b~+HwE@ literal 0 HcmV?d00001 diff --git a/l9dev/regress/games.l9/billy.l9/cache.txt b/l9dev/regress/games.l9/billy.l9/cache.txt new file mode 100644 index 0000000..fc91816 --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/cache.txt @@ -0,0 +1,185 @@ +; Cache.TXT Copyright (C) 1989 Level 9 Computing. +; +; for Floor Map Loader/Cache. +; +; N.W.Austin 13/7/89 +; +;----- + +;CACHE.TXT: handle simple floormap cache +;Two entry points: +; FCInitFloorCache +; FCloadFloor + +;----- + +; draw flags are... +; dRemoveRedraw=65535 -1 Remove and redraw +; dInsert=0 insert +; dPlot=1 plot as sprite +; dInsertRedraw=2 insert and redraw +; dMarkPreload=3 mark to preload +; dSetProtect=4 set protection mark +; dUnsetProtect=5 unset protection mark +const +;Floor map directory must be 4*number of rooms (24 rooms = 220 bytes) +;Max floor map was 2290 bytes (=length), now=3200 + StartCache1=220 + StartCache2=3420 ; 2510 ;StartCache1+length + +begin + +;code + +.FCInitFloorCache ;v1=cache size +code - + CurrentCache=StartCache1 + Cache1=0 + Cache2=0 + + v2=0 ;table + MapNumber=49 ;'1' + +.fci1 +code + + push v1 + push v2 +code - + gosub @LoadMap +code + + pop v2 + pop v1 +code - + + v3=CurrentCache +.fci2 +code + + &v4=FloorMap(v3) ;room number +code - + if v4=0 then FCnextMap + + add v2,c4 + if v2>v1 then @FCtableFull + sub v2,c4 + +code + + if v2>4000 then @FMBug + &FloorMap(v2)=v4 ;room number + add v2,c2 + &FloorMap(v2)=MapNumber ;file + add v2,c2 + + add v3,c2 + &v4=FloorMap(v3) ;length-2 +code - + add v3,v4 + goto @fci2 + +.FCnextMap + if MapNumber=57 then fci3 ;'9' + if MapNumber=72 then fci4 ; 'H' was: 90 then fci4 ;'Z' + add MapNumber,c1 + goto @fci1 +.fci3 + MapNumber=65 ;'A' + goto @fci1 + +.fci4 + add v2,c4 + if v23 then fci5 + v2=4 +.fci5 + sub v2,c4 +code + + if v2>4000 then @FMBug + &FloorMap(v2)=c0 + add v2,c2 + &FloorMap(v2)=c0 + + CurrentCache=StartCache2 + if CurrentCache>4000 then @FMBug + &FloorMap(CurrentCache)=c0 ;Clear cache2 + CurrentCache=StartCache1 + if CurrentCache>4000 then @FMBug + &FloorMap(CurrentCache)=c0 ;Clear and select cache1 + MapNumber=0 + return + +.FMBug + break ;****** + return ;******** +;----- + +.FCnewRoomDv1 +code - + RoomNum=dv1 + if RoomNum=0 then @FCnoRoom + + v1=0 ;cache table +.fcl1 +code + + &v2=FloorMap(v1) +code - + if v2=0 then @FCnoRoom + if v2=RoomNum then fcl2 + add v1,c4 + goto fcl1 + +.fcl2 + add v1,c2 +code + + &MapNumber=FloorMap(v1) +code - + + if cache1=MapNumber then FCinCache1 + if cache2=MapNumber then FCinCache2 + + if CurrentCache=StartCache1 then FCswitchCache + CurrentCache=StartCache1 + Cache1=MapNumber + goto fcl3 +.FCswitchCache + CurrentCache=StartCache2 + Cache2=MapNumber +.fcl3 + gosub @LoadMap + gosub @FindRoom + code + +; if RoomNum<>0 then fcl4ok +;; try reloading floor cache +; push cache2 +; push CurrentCache +; push mapnumber +; gosub @InitFloors +; gosub @FCInitFloorCache +; pop MapNumber +; pop CurrentCache +; pop Cache2 +; code - +; goto @SevenRiversAmbush ; chuck player into ambush to hide the +;; little problems that might occur with this. +; code + + +.fcl4ok + return +code - + +.FCinCache1 + CurrentCache=StartCache1 + gosub @FindRoom +code + + return +code - + +.FCinCache2 + CurrentCache=StartCache2 + +.FCnoRoom ;Set RoomNum=0 + + gosub @FindRoom +code + + return + +;----- diff --git a/l9dev/regress/games.l9/billy.l9/comms.txt b/l9dev/regress/games.l9/billy.l9/comms.txt new file mode 100644 index 0000000..62e2c4f --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/comms.txt @@ -0,0 +1,614 @@ +; COMMS.TXT +; +; Billy The Kid +; +; Copyright (C) 1990 Level 9 Computing Ltd. +; +; +const +; operations codes to pass down serial link... + NameFlag=128 ; 64 + NameMask=127 ; 63 + + begin + code - +.iUpdateVarDataByte + code + + gosub @UpdateVarDataByte + code - + return +;------------ + code + + + +;-------------- +.UpdateVarDataWordInc + gosub UpdateVarDataWord + add v1,c2 ; next word entry + return +;------------- + +.UpdateVarDataWord +; general update routine for the TownVarData list: +; this is used for both people and town parameters, +; plus anything else for the strategy game. +; This routine (WILL) handle the communication of some +; of this information to the other computer in a 2-machine +; game. +; Parameters: +; v1=offset within list to modifiy +; v2=value. +; Not Supported: v3=mode: 0=update, 1=add, 2=subtract (limited to 0/FFFF respectively) +; TellOtherPlayer=0 if not, =1 if please do. +; May Corrupt x1, x2. +; No Return value. +; if v2<>0 then UVDW2 + if v1>TownVarDataSize then @cUpdateBug + &TownVarData(v1)=v2 + + if TwoPlayerMode=false then UVDWRet + push v2 + push v1 + v1=CommsWordUpdate + gosub @WriteSerial ; send v1, waiting if necessary + pop v1 ; address to write to + gosub @WriteSerialWord ; send v1 word, waiting if necessary + pop v1 ; word to write there + goto @WriteSerialWord ; send v1 word, waiting if necessary + +;.UVDW2 +; + + +; if v2<>1 then UVDW3 +;; add to existing value, limit to FFFF +; &x1=TownVarData(v1) +; x2=x1 ; keep original sign +; add x1,v3 +; xor x2,x1 ; sign changed? +; if x2<32768 then UVDWNoUpperLimit +; if x1>32767 then UVDWNoUpperLimit ; now negative +; x1=65535 ; sign changed to positive when added, so wrapped. +; +;.UVDWNoUpperLimit +; &TownVarData(v1)=x1 +; return +; +;.UVDW3 +;; take off existing value, limit to 0 +; &x1=TownVarData(v1) +; x2=x1 ; keep original sign +; add x1,v3 +; xor x2,x1 ; sign changed? +; if x2<32768 then UVDWNoUpperLimit +; if x1>32767 then UVDWNoUpperLimit ; now negative +; x1=65535 ; sign changed to positive when added, so wrapped. +; +;.UVDWNoUpperLimit +; &TownVarData(v1)=x1 +; return +; +;-------------- +.UpdateVarDataByteInc + gosub UpdateVarDataByte + add v1,c1 +.UVDWRet + return +;--------- +.cUpdateBug + cif NotPC + break ;******** + cend +.UVDBRet + return +;--------------- +.UpdateVarDataByte +; general update routine for the TownVarData list: +; this is used for both people and town parameters, +; plus anything else for the strategy game. +; This routine (WILL) handle the communication of some +; of this information to the other computer in a 2-machine +; game. +; Parameters: +; v1=offset within list to modifiy +; v2=value. +; TellOtherPlayer=0 if not, =1 if please do. +; May Corrupt x1, x2. +; No Return value. + if v1>TownVarDataSize then @cUpdateBug + TownVarData(v1)=v2 + + if TwoPlayerMode=false then UVDBRet + push v2 + push v1 + v1=CommsByteUpdate + gosub UVDBWriteSerial ; send v1, waiting if necessary + pop v1 ; address to write to + gosub @WriteSerialWord ; send v1 word, waiting if necessary + pop v1 ; word to write there +.UVDBWriteSerial + goto @WriteSerial ; send v1 byte, waiting if necessary +;------------------- +.TrySerial +; at initialisation - try to make connection with +; another computer playing Billy, then return. +; Space should interrupt and go back to menu, +; otherwise should keep trying forever. + &WordWS(WordCursorXPos)=c0 + &WordWS(WordCursorYPos)=c0 + TwoPlayerMode=true ; permit WriteSerial to send stuff... + + cif TownOverlay + m1=975 ; 'trying serial connection...' + gosub @DisplayTextNoWait + + gosub @MCinitSerial ; 103 +; Description: Initialise serial comms/Clear RX and TX buffers +; Args: none +; Returns: V1=0 success +; V1=FFFF no serial port (not installed) +; + if v1=65535 then @SelectPlayer ; no serial port + gosub @ClearReadBuffer ; returns v1 as last non-zero character. +; Each computer starts by listening to the line. If we hear +; another computer shouting its name, we answer with the alternate +; name and start the game. +; If we hear nothing useful, start shouting a name and listen +; for someone shouting back the other name. +; +; V1 is the last non-zero character we heard +;; if v1<>0 then CBN2 + x1=50000 ; check input buffer this many times before starting to squawk + +.CheckBufferedName + gosub @ReadSerialNoWait +; Returns: V1 = FFFF (nothing read) +; V1 = 0 thru 00FF (byte received) +; V2 = bytes remaining in RX buffer (normally 0) +; V3 = bytes remaining in TX buffer (normally 0) +;; if v1=65535 then NothingHeard +.CBN2 + v2=NameMask + and v1,v2 + PlayersName=Pat + if v1=Billy then @HeardName + PlayersName=Billy + if v1=Pat then @HeardName + sub x1,c1 ; number of times to check serial inputs + if x1>0 then CheckBufferedName ; keep checking many times + +.NothingHeard +; assume we're gonna be Billy, and send stuff on this basis... + PlayersName=Billy + gosub @SendName + +.JustListen +; check for both trying to be same person +; gosub @MCOsrdch ;****** +; if v1<>49 then JL2 ;****** +; PlayersName=Pat +; v1=Billy +; goto @HeardName + +.JL2 + gosub @readSerialNoWait ; 104 + +; push v1 ;********** +; v1=6 ; physical, logical +; gosub @MCEnableTextBuffer +; v1=49 ; '1' +; gosub @MCOswrchV1 +; pop v1 +; push v1 +; gosub @MCOswrchV1 +; pop v1 + + x1=65000 +.CommsDelay + sub x1,c1 + if x1>0 then CommsDelay + + + v2=NameMask + and v1,v2 + PlayersName=Pat + if v1=Billy then HeardName + PlayersName=Billy + if v1=Pat then HeardName + if v3>10 then @JustListen ; TX buffer is filling up. + goto @NothingHeard +; Description: Read Serial port (buffered) +; (V2/V3 are status only. Error conditions are always in V1) +; Args: none +; Returns: V1 = FFFF (nothing read) +; V1 = 0 thru 00FF (byte received) +; V2 = bytes remaining in RX buffer (normally 0) +; V3 = bytes remaining in TX buffer (normally 0) + +.HeardName +; check name twice more, just to be certain the other machine +; is trying to start up. + push v1 + gosub @SendName + gosub @readSerial ; wait if necessary + v2=NameMask + and v1,v2 + pop v2 + if v1<>v2 then @JustListen + push v1 + gosub @SendName + gosub @readSerial ; wait if necessary + v2=NameMask + and v1,v2 + pop v2 + if v1<>v2 then @JustListen + + +; v1=PlayersName of other machine. + if v1=PlayersName then @SelectPlayer ; both trying to play the same. +; Other player is playing the alternate person, so +; we're in business! + gosub @SendName ; tell other computer our name + TwoPlayerMode=true + + m1=954 + add m1,PlayersName +;[955:Pat, you must track all the outlaw gangs to +;their hideouts. Talk to people to get information. ] ;||| +;[956:Billy, rob banks and steal cows from the Murphy-Dolans. ] ;||| + goto @DisplayInstructions ; gosub, return +;------ +.SendName + v1=PlayersName + v2=NameFlag + or v1,v2 + gosub WSWWriteSerial ; send name to other computer , with top bit set. + v1=PlayersName + v2=NameFlag + or v1,v2 + gosub WSWWriteSerial ; send name to other computer , with top bit set. + v1=PlayersName + v2=NameFlag + or v1,v2 + goto WSWWriteSerial ; send name to other computer , with top bit set. +; Description: Writes serial port (buffered) +; (V2/V3 are status only. Error conditions are always in V1) +; Args: V1 (lo byte only) byte to send +; Returns: V1 = 0 byte sent (or put in TX buffer) +; V1 = FFFF Buffer full +; V2 = bytes remaining in RX buffer (normally 0) +; V3 = bytes remaining in TX buffer (normally 0) + + + cend ; TownOverlay +;------------ +.WriteSerialWord +; write v1 as a word + &WorkList(0)=v1 + v1=WorkList(0) + gosub WSWWriteSerial + v1=WorkList(1) +.WSWWriteSerial + goto @WriteSerial +;----------- +.ClearReadBuffer + v4=0 ; last non-zero character +.CRB0 + push v4 + gosub @readSerialNoWait ; 104 + pop v4 +; Description: Read Serial port (buffered) +; (V2/V3 are status only. Error conditions are always in V1) +; Args: v1=0 to read char, FFFF to check status +; Returns: V1 = FFFF (nothing read) +; V1 = 0 thru 00FF (byte received) +; V2 = bytes remaining in RX buffer (normally 0) +; V3 = bytes remaining in TX buffer (normally 0) +; +; if v1=65535 then CRBEnd + if v2=0 then CRBEnd ; RX buffer empty + v4=v1 ; last valid character +; if v4=129 then CRBEnd ; got notification of other player's name +; if v4=130 then CRBEnd + goto CRB0 + +.CRBEnd + v1=v4 ; last valid character received, or zero if none. + return +;---------- +.WriteSerialWait + v1=v5 ; retrieve byte to send + +.WriteSerial +; write v1 as a byte + if TwoPlayerMode=false then WriteSerialRet + v5=v1 ; save byte to send + gosub @MCWriteSerial +; Description: Writes serial port (buffered) +; (V2/V3 are status only. Error conditions are always in V1) +; Args: V1 (lo byte only) byte to send +; Returns: V1 = 0 byte sent (or put in TX buffer) +; V1 = FFFF Buffer full +; V2 = bytes remaining in RX buffer (normally 0) +; V3 = bytes remaining in TX buffer (normally 0) + if v1<>0 then WriteSerialWait ; sent ok? + + push x1 + x1=5000 +.WriteSerialDelay + sub x1,c1 + if x1>0 then WriteSerialDelay + pop x1 +.WriteSerialRet + return +;----------- +.CheckPositions +; pass on our location to the other player, and check where +; they are. If in the same place, call for a duel. + +;;************ +; v1=6 ; physical, logical +; gosub @MCEnableTextBuffer +; code - +; message cr ; flush buffer +; code + +; &WordWS(WordCursorXPos)=c0 +; &WordWS(WordCursorYPos)=c0 +; code - +; print location +; message dot +; code + +; v1=32 +; gosub @MCOswrchV1 +; TwoPlayerMode=true ;******** +;;********* + + +; send our location only occasionally, to avoid slowing down +; slow machines too much. + code - + random v1 + code + + if v1<240 then DontSendPosition + + &v1=TownVarData(SPCommsInfoOffset) +; within CommsInfo, offsets Billy/Pat are location of each player + add v1,PlayersName + v2=location + gosub @UpdateVarDataByte ; pass our location to other person + +.DontSendPosition + +; where is other player? + v1=3 + sub v1,PlayersName ; (3-1 or 2 => 2 or 1) + &v2=TownVarData(SPCommsInfoOffset) + add v1,v2 + v2=TownVarData(v1) +; other player is at v2, if we're also there, then maybe +; we want a final duel + +; code - ;****** +; print v2 ;****** +; message dot ;****** +; code + ;****** +; v1=65535 ; check status ;****** +; gosub @MCReadSerial ;********* +; code - ;****** +; print v2 ; bytes in read buffer ;****** +; message dot ;****** +; print v3 ; bytes in write buffer ;****** +; message dot ;****** +; code + ;****** + + cif TownOverlay + if PlayingDuel<>0 then NotTriggerFinalDuel + if CurrentScreen<430 then NotTriggerFinalDuel ; MinTown(430)-400 + if CurrentScreen>599 then NotTriggerFinalDuel ; MaxTown(599)-400 + if v2<>location then NotTriggerFinalDuel + MenuNumber=216 ; hello, want final duel? +; Menu216 dc.w 1867-MM,MMenu+218,0 ; approached each other, gonna fight? + gosub @PrettyMenu + if result=1268 then @InitTwoPlayerDuel ;1868-MM + goto @ReturnToMap +.NotTriggerFinalDuel + cend + +.LTSRet + return +;---------- +.ListenToSerial +; called every frame - pulls in strings of characters +; from serial buffer and makes appropriate updates to +; our local database + if TwoPlayerMode=false then LTSRet + cif TownOverlay + gosub @CheckPositions ; check where the other player is + cend + + v3=10 ; timeout value to avoid locking the machine +.LTSLoop + v1=65535 ; check status + push v3 ; timeout count + gosub @MCReadSerial + pop v3 + if v2<4 then LTSRet ; not a full command string in buffer yet. +; Description: Read Serial port (buffered) +; (V2/V3 are status only. Error conditions are always in V1) +; Args: v1=0 to read+check status +; FFFF to just check status +; Returns: V1 = FFFF (nothing read) +; V1 = 0 thru 00FF (byte received) +; V2 = bytes remaining in RX buffer (normally 0) +; V3 = bytes remaining in TX buffer (normally 0) + push v3 ; timeout count + gosub ReadAndProcessSerial + pop v3 + sub v3,c1 + if v3>0 then LTSLoop ; carry on till read buffer is nearly empty + return ; give up, to avoid locking the machine completely +;---------- +.ReadAndProcessSerial + gosub @ReadSerial ; read, waiting if necessary +; code - +; message Billy ; indicate receipt +; print v1 +; code + + if v1=CommsByteUpdate then @LTSByteUpdate + if v1=CommsWordUpdate then @LTSWordUpdate + + cif TownOverlay + if PlayingDuel<>0 then LTS3 + cend + if v1=CommsWantFinalDuel then @AcceptFinalDuel + if v1=CommsAcceptFinalDuel then @AcceptFinalDuel +.LTS3 + cif TownOverlay + if v1=CommsIveDrawn then @OtherHasDrawn + if v1=CommsIveShotYou then @OtherHasShotMe + if v1=CommsRedisplayMap then @RedisplayMap + cend + if v1=CommsOtherPlayerHasLost then @WinGame + if v1=CommsOtherPlayerHasWon then @LoseGame + return +;------------- + cif TownOverlay +.RedisplayMap + if CurrentScreen=GameMap then @ReturnToMap + return + +.OtherHasDrawn + duelstatus = 3 + dx4 = enemyacb + ObjectNumber=5 ; animation object for draw but don't fire (small figure) + add ObjectNumber,DuelOpponentBase + goto @changeacbdx4 ; gosub, return. +;------------- +.OtherHasShotMe + v1=0 ; colt45 sample + gosub @PlaySample + duelstatus = 7 ; player is dying + return + cend ; TownOverlay +;------------- +.LTSByteUpdate + gosub @ReadSerialWord ; get address of update + push v1 + gosub @ReadSerial ; read, waiting if necessary + pop v2 ; address + if v2>TownVarDataSize then @c2UpdateBug ;***** + TownVarData(v2)=v1 +; code - +; if v2<50 then LTSBU2 +; print v2 ;******* +; message dot ;*********** +; print v1 ;******** +; message dot ;****** +;.LTSBU2 +; code + + return + +.LTSWordUpdate + gosub @ReadSerialWord ; get address of update + push v1 + gosub @ReadSerialWord ; get word to write there + pop v2 ; address + if v2>TownVarDataSize then @c2UpdateBug ;***** + &TownVarData(v2)=v1 + return + +.c2UpdateBug + break ;***** + return ;****** +;-------------- +.ReadSerialWord +; assumes characters are available in buffer + gosub ReadSerial + WorkList(0)=v1 + gosub ReadSerial + WorkList(1)=v1 + &v1=WorkList(0) + return +;------------- +.ReadSerial ; read, waiting if necessary + gosub @ReadSerialNoWait + if v1=65535 then ReadSerial ; nothing read, so wait for it! +; Description: Read Serial port (buffered) +; (V2/V3 are status only. Error conditions are always in V1) +; Args: v1=0 to read+check status +; FFFF to just check status +; Returns: V1 = FFFF (nothing read) +; V1 = 0 thru 00FF (byte received) +; V2 = bytes remaining in RX buffer (normally 0) +; V3 = bytes remaining in TX buffer (normally 0) + return +;------------- +.InitTwoPlayerDuel + cif TownOverlay +.ITPD1 + v1=CommsWantFinalDuel + gosub @SendPadding ; send several v1s to evade receiver buffering + gosub @ReadSerial +; if v1=CommsWantFinalDuel then ITPD2 +; if v1<>CommsAcceptFinalDuel then ITPD1 +;.ITPD2 +; gosub @ReadSerial +; if v1=CommsWantFinalDuel then ITPD3 +; if v1<>CommsAcceptFinalDuel then ITPD1 +;.ITPD3 + cend ; TownOverlay + +.SetEnemyName +; set EnemyName so this duel is the final one. + EnemyName=Pat + if PlayersName=Billy then FinalConflict + EnemyName=Billy + +.FinalConflict +.NotFinalConflict + cif TownOverlay + goto @OEPFinalDuel + cend + v4=DuelBack +; EnemyName already set + goto @ToTownOverlayV4 +; call town overlay with parameter v4 +;----------- +.AcceptFinalDuel + v1=CommsAcceptFinalDuel + gosub @WriteSerial + v1=CommsAcceptFinalDuel + gosub @WriteSerial + v1=CommsAcceptFinalDuel + gosub @WriteSerial + v1=CommsAcceptFinalDuel + gosub @WriteSerial + v1=CommsAcceptFinalDuel + gosub @WriteSerial + goto @SetEnemyName ; goto @OEPNotFinalDuel + return ; for other overlays +;--------- +.AnnounceLoss + v1=CommsOtherPlayerHasLost + goto @SendPadding ; send several v1s to evade receiver buffering +;-------- +.AnnounceWin + v1=CommsOtherPlayerHasWon +; drop through to SendPadding +;---------- +.SendPadding ; pad out with v1s to evade receiver buffering + gosub SPWriteSerial + gosub SPWriteSerial + gosub SPWriteSerial +.SPWriteSerial + push v1 + gosub @WriteSerial + pop v1 + return +;---------- +.ReadSerialNoWait + v1=0 ; request read + goto @MCReadSerial +;----------- + + diff --git a/l9dev/regress/games.l9/billy.l9/demo.txt b/l9dev/regress/games.l9/billy.l9/demo.txt new file mode 100644 index 0000000..fc67ae6 --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/demo.txt @@ -0,0 +1,2067 @@ +; Demo.TXT Copyright (C) 1989 Level 9 Computing. +; for Billy The Kid +; +; Mike Austin October 1990 + + +;**Will palette setting at start work without structure file? + + +; draw flags are... +; dRemoveRedraw=65535 ; -1 Remove and redraw +; dInsert=0 ; 0 insert +; dPlot=1 ; 1 plot as sprite +; dInsertRedraw=2 ; 2 insert and redraw +; dMarkPreload=3 ; 3 mark to preload +; dSetProtect=4 ; 4 set protection mark +; dUnsetProtect=5 ; 5 unset protection mark + + +const + CurrentAcode=69 ; 'e' - acodE.acd + CurrentGamedata=65 ; 'a' - gamedatA.dat + Overlay=1 ; town game. (1=map/town, 2=scrolling, 3=shootouts) + TownOverlay=1 + ScrollingOverlay=0 + ArcadesOverlay=0 + + + + +; game constants: + MapCursor=2719 ; raster showing little binoculars. + +;Scrolling constants: + MapTopBorder=7 + MapBottomBorder=369 + MapleftBorder=7 + MapRightBorder=615 ; 8 Jan 1991. was 625 + Scrollconst=1 + +;Duel Constants: + OpponentX=176 + OpponentZ=160 ; 153 + OpponentH=64 + + StartPlayerX=36 + StartPlayerZ=192 ;208 + StartPlayerH=102 ; 128 + Crosshairani=3941 + Bellani=3940 + BellRaster=2457 + + StartCrossX=160 ; 80 + StartCrossZ=500 ; 400; 300 ; 250 ; + StartCrossH=370 ; 270; 170 ; 120 ; + + BillDrawn=2384 + + SizeHiresTable=1760 ; 16 times the number of entries in ObjectTable +; (Which is used for CD with map objects, and for CD with +; people in town.) + ArcBigWindowRaster=3360 ; big text window print raster + ArcBigWindowDO=202 ; 3360 ; big text window display object + MinTown=430 ; min xzh town background + MaxTown=599 ; 560 ; max xzh town background. (600 is map) + MaxOutside=549 + TownRoomBase=400 ; this number is subtracted from CurrentScreen +; in the towns to get the "room number": mainly used for +; the exit table. + PlayerInitialY=120 + IntroTablesList=9 + +table + ObjectTable=1 + HiresTable=2 ; 16 bytes per object listed in ObjectTable + list4=4 + list7=7 + IntroTables=9 + + +var + cache1 cache2 ; floormap variables + MarginZ + FSizeZ + MarginX + FSizeX + CurrentCache + + + +; duel variables + enemyacb + fighteracb + duelstatus ; also used for number of locks wanted on safe. + enemystatus + playergundrawn + + lastNonZeroScrollXDir + +;cursor stuff: + + HandObject + + NewScreen ; set to number of new screen when we want a change. +; otherwise 0 + + +;Scrolling stuff +; ScrollXDir ScrollYDir + ScrollSpeed ; BillACB + ScrollDiff +; screenx screeny + screencursorx screencursory + Borderleft BorderRight BorderTop BorderBottom + +;; MikeTemp + + CurrentObjectTable ; offset of start of table for current screen +; in ObjectTable() + AnimationCount + + PlaceCursorX PlaceCursorY + BuildingRoom + +; MenuDisplayed +; MenuOffset ; offset of menu tables within IntroTables +; MenuNumber ; menu we want to display +; WantedDirection ; not really needed, for compatability with Scroll +; UpdateACBs ; false if acbs are to be frozen for a while, +; e.g. whilst displaying menu + + PersonNumber ; set to person number that we are talking to. + + MovingPersonHires ; offset in Hires() of moving scenery person - +; e.g. hostess in saloon, ladies in street. Max one per scene. + WantCSTB ; set to true when want to do a COpyScreenToBuffer + PlayingDuel ; set to 1 when we want a duel on the next +; street scene. +; DuelStatus<>0 when we've actually started the duel itself + TimeInRoom + HorseScreen ; screen where player left his horse! +; 0 if not yet left + HorseX HorseZ HorseH + PlayerWalking ; set as a boolean, false or true - allows +; you to continue walking from stopped, in the same direction +; (i.e. it removes the debouncing on setting up the walk animation). + + DuelPlayerBase DuelOpponentBase + Newspaper ; flag: false/true + +;=========================================================== +;main loop begin +;=========================================================== +begin +code + ;;;;;;; Initial setup begins ;;;;;;;;;;; +.Start3D + gosub @AAEssentialInit + gosub @MCHeroOnceOnlyInit + cif NotPC + SmoothScroller=1 ; ST/AMiga are always smooth scrolling + cend + cif pc + SmoothScroller=v3 ; 0 for jump scrolling, non-zero for smooth scrolling + cend + CGAMode=v2 + v1=240 ; $00F0 + and CGAMode,v1 ; =0 if EGA/VGA, <>0 for CGA2/4. + Language=0 ; not yet chosen - choose in intro. + gosub @MCOnceOnlyMusicInit + v5=0 ; initialise sound system + gosub @MCDigitise + gosub @Initialise + +.PlayAgain +.RestartGame + + push FirstAsciiInFont + push FontHeight + push SmoothScroller + push Language + push CGAMode + + v1=6 ; pointer to variables +.ClearAllVars1 + v2=0 + &list0(v1)=v2 + v2=2 + add v1,v2 + if v1<600 then ClearAllVars1 + gosub @AAEssentialInit + pop CGAMode + pop Language + pop SmoothScroller + pop FontHeight + pop FirstAsciiInFont + + + MusicOn=1 ; default to playing + SoundOn=1 ; default to playing sound FX + CopyProtectChecked=0 + PlotLogicalDone=0 + ScrollDirectionDone=0 + cif pc + gosub @MCInitJoystick + cend + + + TwoPlayerMode=false + + + + UpdateACBs=true ; not menu mode + push v4 ; parameter + gosub @AAEssentialInit + v1=65 ; 'A' as in gamedatA.dat ;*******why necessary?3jan90 + gosub @LoadGamedata + pop v4 + goto @DoWholeIntro ; comment out this line to remove intro from start +.vAfterIntroStart + +; gosub @MCEmptyRoom + + + + + gosub @InitFloors + gosub @FCInitFloorCache + + TwoPlayerMode=0 ; when restart after two-player game, important +; NOT to send the updates of all vars to the other computer, +; cause it's VERY slow! + gosub @InitStrategy ; initialise strategy tables, +; set up people identikits for this game, etc. etc. + PlayerGang=0 ; no gang to start with + TicksSinceLawful=3 ; 8-this number is time before first town +; becomes lawful + TotalGoldStolen=0 + PlayerGold=50 ; amount of gold owned. + PlayerIncome=0 ; income next time back to map + PlayerReputation=200 ; reward for capture, in Dollars. + RobberyTillMDGoesBust=ConstTillMDGoesBust ; make a ranch go bust immediately + PatWarnings=0 ; number of warnings about doing a bad job + BillyLives=4 ; lives remaining. + Newspaper=false + EnemyName=255 ; default to fighting generic outlaw + + v4=SelectPlayerScreen ; GameMap + goto AfterIntroStart2 ; AfterOverlayEntry + + +.OverlayEntryPoint + break ;********** + push v4 ; parameter + gosub @AAEssentialInit + v1=65 ; 'A' as in gamedatA.dat + gosub @LoadGamedata + pop v4 +; gosub @InitFloors +; gosub @FCInitFloorCache + +.AfterIntroStart2 + push v4 + gosub @vSetDefaultPalettes + BuildingRoom=false + PlayingDuel=false + DuelStatus=0 + v1=0 ; purge + gosub @MCPurgeAllCells + StructureFile=0 ; void structure to force loading + gosub @OpenTownStructures + pop v4 ; parameter + +; re-initialise variables that may have been corrupted by +; overlay code... + PlayerDirection=3 + +; now choose whether to go back to town, or back to the map. +; (or even into a duel, I guess) + if v4=CodeRestartGame then @PlayAgain ; restart game + if v4=CodeBackToWalkabout then @BackToWalkabout + if v4=GameMap then OverlayRestart + + if v4<>DuelBack then OEPNotDuel +; if BillyLives<>0 then OEPNotFinalDuel +; if TwoPlayerMode=false then OEPNotFinalDuel +; gosub @InitTwoPlayerDuel +; +.OEPFinalDuel + PlayingDuel=true + v4=CurrentScreen + if v4<430 then OEPDuel2 + if v4GameMap then NotInitGameMap + &CurrentObjectTable=ObjectTable(0) + NextMusic=ThemeMusic ; game map music + gosub @ClockTick +; v4=DuelSamples +; gosub @LoadSamplesForGame + +.NotInitGameMap + RasterOffset = 0 + BuildingRoom=true + if CurrentScreen=IntroScreen then @DoWholeIntro + + +; cif NotPC ;****** + gosub @ClearHiresTable ; for CD in map and walkabout stuff. +; cend ;****** + ACBSearchStart=ConstACBStart + ACBStart=ConstACBStart + ACBEnd=ConstACBEnd + + if CurrentScreen=SelectPlayerScreen then @NoInsertScreen + PersonDisplayed=0 + dv1 = CurrentScreen + gosub @PreLoadAndInsertdv1 ; does InitACBs as well + gosub @ccDoCross ; setup cursor if needed + cursory = cursorz + sub cursory,cursorh + + ScrollXDir=0 + ScrollYDir=0 + LastNonZeroScrollXDir=0 + screenx = 0 + screeny = 0 + screencursorx = cursorx + screencursory = cursory + v1=0 ; x position in pixels + v2=0 ; y position in pixels +; if CurrentScreen<>GameMap then SB2 +; V1=LastMapX +; v2=LastMapY +; +;.SB2 + gosub @BuildRoom ; ViewMap + gosub @ClearKBD + + arraycount = 0 + Timeheld = 0 + MaxCursorSpeed = 16 + KeyHeld = 0 + + + gosub @PreloadSprites + gosub @InitTown + +.NoInsertScreen +; LastTunePlayed=0 + HourglassState=false ; don't do hourglass until requested +; by code in this part of the game. + if CurrentScreen<>SelectPlayerScreen then @NotInitSelect +; gosub @AnnounceLoss ; if two-player game is still running +; on other screen, tell them to stop. + +; NewScreen=430 ;******SelectPlayerScreen ; GameMap +; PlayingDuel=true ;******* +; goto @BuildNewScreen ;****** +.SelectPlayer + MenuNumber=164 ; Billy, Pat, restore + gosub @prettyMenu +;; dc.w 953-MM,MDoIt+953-MM * Billy +;; dc.w 952-MM,MDoIt+952-MM * Pat +;[955:Pat, you must track all the outlaw gangs to +;their hideouts. Talk to people to get information. ] ;||| +;[956:Billy, rob banks and steal cows from the Murphy-Dolans. ] ;||| +;[974:2-PLAYER GAME ] ;œœœ +;[975:Trying serial connection (press FIRE to abandon) ] + if result=375 then InitTwoPlayerGame + PlayersName=Pat + if result=355 then InitSelectEnd + PlayersName=Billy + +.InitSelectEnd + HourglassState=0 ; ensure hourglass is redisplayed + goto @ReturnToMap + +.InitTwoPlayerGame + gosub @TrySerial ; also chooses who we're gonna play + goto InitSelectEnd ; to map etc. +;----------------- + +.NotInitSelect + GameOverTimer=0 ; not ending + GameOver=0 + Won=false + TimeInRoom=0 + gosub @PlayerNewScreen + +;;;;;;;;; Main loop for any one screen once it is set up ;;;;;; +.CarryOnLoop + BuildingRoom=false + gosub @OpenTownStructures ; in case corrupted somewhere + gosub @ListenToSerial + + Difficulty=PlayerReputation ; at the moment, make all the +; arcade games relate directly to reputation + add Difficulty,Difficulty ; PlayerReputation starts at 100, +; so doubled gives approx the standard difficulty of arcade games. + + if NewScreen<>0 then @BuildNewScreen + v2 = 0 + + +; in street scene? + if currentscreen <400 then notduel + if CurrentScreen>MaxOutside then NotDuel ; outside + if DuelStatus<>0 then DoDuel0 + if PlayingDuel=false then NotDuel +.DoDuel0 + NextMusic=Generic1Music ; DuelMusic +; If we want to shoot the generic cowboy, +; set variables here as if shooting Billy because his +; animation sequence fits better onto generic opponent. +;; DuelOpponentBase=3680 ; Billy as a small person + +; now big person... + DuelPlayerBase=3730 ; Billy player animations base + if PlayersName=Billy then DoDuel1 + DuelPlayerBase=3750 ; Pat player animations base + +.DoDuel1 + DuelOpponentBase=3680 ;3691 ; Billy as a small person +; (changed by SPaniob into generic person, if appropriate) +;; if EnemyName=255 then DuelGotOpponent ; =Pat, Billy or $ff for other + if EnemyName=255 then DoDuelGeneric +; EnemyName=Pat or Billy. Now ignore it, +; and choose the opposite to player to ensure we can never +; shoot ourselves! + if PlayersName=Pat then DuelGotOpponent ; if EnemyName=Billy then DuelGotOpponent + +.DoDuelGeneric + DuelOpponentBase=3700 ;3711 ; Pat as a small person + +.DuelGotOpponent + gosub @theduel + +.notduel + + + + cif ST + if CurrentScreen<>GameMap then NoSpeedUpST2 + if ScrollXDir<>0 then NoSpeedUpST + dx1=ScreenX + dx2=15 + and dx1,dx2 + if dx1<8 then NoSpeedUpST2 +; on ST, unless scrollxpos mod 15 is >8, DISPLAYROOM is much slower. + ScrollXDir=8 + if LastNonZeroScrollXDir<200 then NoSpeedUpST + ScrollXDir=65528 ; -8 + +.NoSpeedUpST + LastNonZeroScrollXDir=ScrollXDir + +.NoSpeedUpST2 + cend ; ST + + gosub @DisplayEverything + + + + if CurrentScreen<>GameMap then COLNotMap +; LastMapX=ScreenX +; LastMapY=ScreenY + DuelStatus=0 + gosub @MapControls ;check for map scrolling + +; Jose interrupts player looking at Map? + if PlayerReputation<400 then MapNotInterrupt + code - + random x1 + code + + if x1>20 then MapNotInterrupt + v1=SPFJoseMcSween ; has player gone to help McSween at ranch? + add v1,SubPlotsOffset + v2=TownVarData(v1) + if v2<>0 then MapNotInterrupt + v2=1 + gosub @UpdateVarDataByte + MenuNumber=124 + x1=0 ; 1360 ; number for jose (person number 85) + m1=1670 + gosub @MapInterruption ; come here with x1=person number*16, +; m1=interruption message (e.g. "stopped on the way") +; and MenuNumber=menu to use, if not their default +;; goto @ReturnToMap + +.MapNotInterrupt + + +.COLNotMap ; check for keypress for new screen in demo + + + cif ST + if ScrollXDir<>0 then COLNotSpeedST + if RepeatScroll=0 then COLNotSpeedST + if RepeatScroll>200 then COLNotSpeedST + sub RepeatScroll,c1 + ScrollXDir=LastNonZeroScrollXDir + gosub @MoveTheACB + +.COLNotSpeedST + cend + if currentScreenMaxTown then COLNotTown + if PlayerACB=0 then COLNotTown ; e.g. riding into town + if DuelStatus<>0 then COLNotTown + gosub @TownControls + +.COLNotTown + goto @CarryOnLoop + +;.GoTown +; if x1 > 371 then GoInside +; currentscreen = 360 +;; if x1 = TrainScreen then BuildNewScreen2 +; add x1,c1 +; currentscreen = x1 +; goto BuildNewScreen2 +;.GoInside +; if x1 > 619 then GoGunFight +; currentscreen = 605 +; if x1 = 372 then BuildNewScreen2 +; currentscreen = 607 +; if x1 = 605 then BuildNewScreen2 +; currentscreen = 620 +; if x1 = 607 then BuildNewScreen2 +;.GoGunFight +; add x1,c1 +; currentscreen = x1 +; +;.BuildNewScreen2 +; goto @BuildNewScreen + +;;;;;;;;;;; end of main loop for any one demo screen ;;;;;; + + +;==================================================== +; end of main bit!!!! +;==================================================== + +.mapcontrols + ScrollXDir=0 + ScrollYDir=0 + gosub @CheckKeys + + if KeyHeld=0 then MC3 + if PlaceCursorX=0 then MC3 ; no map window open +; have we moved cursor far enough to close this window? + x1=cursorx + sub x1,PlaceCursorX + gosub @AbsX1 + if x1>32 then MC2 ; close it! + x1=cursory + sub x1,PlaceCursorY + gosub @AbsX1 + if x1<32 then MC3 +.MC2 +; close down the magnified view + TextBoxDisplayed=0 + PlaceCursorX=0 + +.MC3 +; check key presses for change or start of scrolling + +; Now check whether we want to scroll the screen, +; so convert the map-based coordinates into screen-based +; coordinates. +; cursory is the y coord relative to the map +; ScreenCursorY is the y coordinate relative to the screen + +; First check for Map borders + if cursory > MapTopBorder then scheckMapBottom + ScrollYdir = 0 + goto @sCheckMapleft +.sCheckMapBottom + if cursory < MapBottomBorder then scheckScreenTop + scrollydir = 0 + goto @sCheckMapleft + +.scheckscreentop + ScreenCursorY = Cursory + sub ScreenCursorY,screeny + if screencursory < 10000 then sNotnegative + screencursory = 16 +.sNotNegative + if ScreenCursorY > 10 then sCheckScreenbottom ;checkborder + ScreenCursory = 16 ;reset cursor + ScrollYdir = 0 + sub ScrollYDir,ScrollSpeed ;set scrolling direction +; sub screeny,scrollspeed + goto scheckMapleft + +.sCheckScreenBottom + if ScreenCursorY < 170 then sCheckMapLeft + if ScreenY>192 then sCheckMapLeft ; limit how far down we can scroll + Screencursory = 169 + scrollydir = scrollspeed +; add screeny,scrollspeed + +.sCheckMapleft + if cursorx>32000 then scheckscreenleft + if cursorx > MapLeftBorder then scheckMapright + scrollxdir = 0 + goto @MoveTheACB +.scheckmapright + if cursorx < MapRightBorder then sCheckScreenLeft + scrollxdir = 0 + goto @MoveTheAcb + +.scheckscreenleft + ScreenCursorX = cursorx + sub ScreenCursorX,screenx + if ScreenCursorX < 10000 then snotoffscreen + screencursorx = 16 +.snotoffscreen + if ScreenCursorX > 10 then scheckScreenright + Screencursorx = 16 + sub scrollxdir,scrollspeed + cif ST + ScrollXDir=65520 ; -16 - scrolls faster on ST! + if RepeatScroll<>0 then MoveTheACB + RepeatScroll=4 ; do several scrolls at once + cend + goto movetheacb + +.sCheckScreenRight + if ScreenCursorX < 300 then movetheacb + if ScreenX>292 then MoveTheACB ; limit how far right we can scroll + Screencursorx = 299 + scrollxdir = scrollspeed + cif ST + ScrollXDir=16 ; scroll much faster on ST. + if RepeatScroll<>0 then MoveTheACB + RepeatScroll=4 ; do several scrolls at once + cend + + +.movetheacb +; calculate coordinates relative to map and reposition cursor + cursorx = screencursorx + add cursorx,screenx + cursory = screencursory + add cursory,screeny + + dx4 = crosshairacb + gosub @readacbdx4 + cif TownOverlay + if CurrentScreen<>GameMap then MTA2 + if dv1=0 then @ReturnToMap + +.MTA2 + cend + dv2 = cursorx + dv3 = cursorz + dv4 = cursorz + sub dv4,cursory + gosub @moveacbdx4 + gosub @CheckCursorSpeed + return + +;------------------------- end of cursor movement checks----------; +.moveACBdx4 + if dx4>ACBListSize then MABug ;**** + push dx4 + add dx4,c4 + &ACBList(dx4) = dv2 + add dx4,c2 + &ACBList(dx4) = dv3 + add dx4,c2 + &ACBlist(dx4) = dv4 + pop dx4 + return + +.MABug + break ;******* + break + break + return +;---------------- +.ReadACBdx4 + if dx4>ACBListSize then MABug ;**** + push dx4 + &dv1 = ACBList(dx4) + add dx4,c4 + &dv2 = ACBList(dx4) + add dx4,c2 + &dv3 = ACBList(dx4) + add dx4,c2 + &dv4 = ACBlist(dx4) + pop dx4 + return +;--------- +.Escape +.vCloseDown ; .CloseDown + cif ST + v1=IntroTablesList ; IntroTables + &v2=IntroTables(0) ; system palette + v3=16 + v4=0 ; mode + gosub @MCSetPalette + gosub @DisplayFrame ; make sure palette has been updated + gosub @WaitForFrame + cend + + + v1=0 ; score 0 + v2=0 ; play + v3=2 ; stop + cif AllowMusic +;; gosub @MCPlayScore + gosub @MCMusicCloseDown + cend + + gosub @MCCloseDown +;----- +;----- +.ErrorHandler + push dv1 + &dv1=WordWS(66) ;WordErrorNumber +; cif ReleaseGame +; if dv1=512 then EHAbandon +; if dv1<>259 then EH1 +; cend +.EHAbandon + pop dv1 + return + +.EH1 + pop dv1 + + + gosub @SetUpPhysicalTextPtr + &WordWS(WordCursorXpos)=c0 + &WordWS(WordCursorYpos)=c0 + push v1 + push v2 + v1=320 + v2=16 + gosub @MCClearRectangle + pop v2 + pop v1 + push dv1 + &dv1=WordWS(66) ;WordErrorNumber + code- + prs "Error Handler (" + print dv1 + message cr ;'DoCr' ignores newlines; this is 'flush' + prs ")" + code+ + pop dv1 + +.WaitKey + gosub @KeyScan ; allows for escape/pause as well + if v2=0 then WaitKey + return + +;========== + +; upper limits... +; 50 Hz 12.5 fps +; 60 Hz 16 fps + +.vDisplayEverything ;.DisplayEverything + BuildingRoom=false + &WordWS(WordMouseXDistance)=c0 + &WordWS(WordMouseYDistance)=c0 + + gosub @PlayTuneForScene + + +; cif NotPC +; ByteWS(ByteOutputDevice)=c1 ; to rs232 +; code - +; prs "D " +; code + +; ByteWS(ByteOutputDevice)=c2 ; to screen +; cend + + + +;; if framelimiting = false then slowmachine +; cif NotPC +;REMOVED FOR SELF-RUNNING DEMO if FrameCount < 3 then DisplayEverything +; cend +; FrameCount = 0 +;.WaitFrame +; cif Amiga +; gosub @MCClearScreen ; force screen to be displayed &****Temp. +; goto SlowMachine +; cend +; if FrameCount<4 then WaitFrame + +;.SlowMachine +;cif Amiga +; x1=800 +;.AmiDelay +; sub x1,c1 +; if x1>0 then AmiDelay ;****************************** +;cend + + + + FrameCount=c0 + + gosub @SafePlotLogical + gosub @MCDisplayRoom ;ViewMap + + + gosub @DisplayEverythingSprites + + + + if WantCSTB=false then BANoCSTB + WantCSTB=false + gosub @MCCopyScreenToBuffer + +.BANoCSTB + gosub @DisplayHourglass + + gosub @MCUpdateScreen + gosub @DisplayFrame + cif NotPC + gosub @WaitForFrame + cend + cif pc + gosub @MCUnplotScreen + cend + + if ScreenX<32000 then NotLimitLeft + ScrollXDir=8 ; bring back on! + +.NotLimitLeft + if ScreenY<32000 then NotLimitTop + ScrollYDir=8 ; bring back on! + +.NotLimitTop + gosub @ConvertScrollToJump + + if ScreenX>8 then NotLimitLeft2 + if ScrollXDir<200 then NotLimitLeft2 +; near left, trying to go left - disable + ScrollXDir=0 + +.NotLimitLeft2 + if ScreenX<300 then NotLimitRight + if ScrollXDir>200 then NotLimitRight +; near right, trying to go right - disable + ScrollXDir=0 + +.NotLimitRight + if ScreenY>8 then NotLimitTop2 + if ScrollYDir<200 then NotLimitTop2 +; near top, trying to go up - disable + ScrollYDir=0 + +.NotLimitTop2 + if ScreenY<192 then NotLimitBottom + if ScrollYDir>200 then NotLimitBottom +; near bottom, trying to go down - disable + ScrollYDir=0 + +.NotLimitBottom + push v1 + push v2 + v1 = ScrollXDir ; 65532 ; x step=-4 + v2 = ScrollYDir ; 0 ; y step + if SmoothScroller=false then @MaybeJump + + gosub @SafeScrollDirection ; returns 0,0 if couldn't do it. + if v1=32768 then SDErr1 + add screenx,v1 ; Scrollxdir +.SDErr1 + if v2=32768 then SDErr2 + add screeny,v2 ; Scrollydir +.SDErr2 + pop v2 + pop v1 + + ScrollDirectionDone=0 + PlotLogicalDone=0 + +; if TextBoxDisplayed=0 then DENoWait +; TextBoxDisplayed=0 +;.DEWait +; gosub @WaitKey +; if v1<>13 then DEWait +; +;.DENoWait + return +;----------------------------------- + +.DisplayEverythingSprites + if CurrentScreen<>GameMap then DE1 + add AnimationCount,c1 + if AnimationCount=2 then DE2 ; only recalculate animation every other frame + AnimationCount=0 + +.DE1 + if UpdateACBs=false then DE2 + + gosub @DisplayACBS + HourglassState=0 ; have started to animate, so kill the hourglass + +.DE2 + gosub @SortAndDisplayObjects + +;; display hand on top +; v1=HandObject ; hand +; v2=cursorx +; v3=cursorz +; v4=cursorh +; v5=1 ; sprite +; v6=0 ; non-reversed +; gosub @MCDrawObjectV1 + + + if TextBoxDisplayed=0 then BANoBox ;*****MIKE + gosub @MenuSprites + if TextBoxDisplayed>2379 then BANoBox ; kludge to remove gunfighter + dv1=TextBoxDisplayed + dv2=screenx + dv3=screeny ; z + dv4=150 ; h + add dv3,dv4 ; bring to higher z coord, so it's in front of intro stuff + dv5=1 ; plot + dv6=0 ; non-reflected + gosub @MCDrawObjectDv1 + +.BANoBox + + cif ReallyST + &WordWS(WordCursorXPos)=c0 + x1=192 + &WordWS(WordCursorYPos)=x1 + v1=320 ; pixels wide + v2=8 ; pixels high + gosub @MCClearRectangle + cend + return +;------------- +.Initialise +; VBLInitialised=false ; will prevent any task swaps during init. + gosub @MCHeroInit + + cif NotPC + &x1=LongWS(HiLongLogicalBase) + &LongWS(HiLongGraphicsScreenBase)=x1 + &x1=LongWS(LoLongLogicalBase) + &LongWS(LoLongGraphicsScreenBase)=x1 + cend + + gosub @AllocateWorkspaceLists +; x1=0 +; &LongWS(HiLongRandomSeed)=x1 +; &LongWS(LoLongRandomSeed)=x1 + &WordWS(WordSuspendTaskSwap)=c1 ; suspended during init + + gosub @AAEssentialInit + LeftMargin=0 + + gosub @SetUpTextPtr + x1=39 + ByteWS(ByteWordWrapWidth)=x1 + +; initialise 3D. + v1=12500 ; number of cells used. (will crash if too small) + v2=2400 ; 7 jan 91 - increased for PC. was 2400 ; number of map links + v3=200 ; no. of heap entries (only used on PC) + cif ST + v4=1800 ; unusued + cend + cif PC + v4=800 ;no. of cumulative transparency masks + cend + v5=5800 ; size of ground map=width*height in cells. + gosub @MCSetUpVariablePtrs + + v1=640 ;1280 ; 4 screens, 20 wide each, in pixels + v2=384 ; 2 screens, 12 high each, in pixels + v3=1 ; game mode: 0=non-scrolling, 1=scrolling, 2=jumps + gosub @InitScrolling + + + gosub @MCEmptyRoom + cif pc + gosub @BuildRoom ; have to do a buildroom before any plotting, +; on PC only. + cend + + &WordWS(WordRasterOffset)=c0 + +;; WaitingForInput=false +; VBLInitialised=true + &WordWS(WordSuspendTaskSwap)=c0 ; start swapping! +cif pc + x1=IBMTopOfText + &WordWS(WordCursorYPos)=x1 +cend + &WordWS(WordVBLDisabled)=c0 ; enable vbl + gosub @SafePlotLogical ; tell the PC about the meaning of life. + + v1=100 ; minimum number of milliseconds per frame + gosub @MCSetMaxFrameRate + return +;--- +.VBL + add FrameCount,c1 + return +;--- +.vSpecialAniShift +; caller does: +; gosub @SpecialAniShift ; moving dv1 from dv2,dv3,dv4 by dx2,dx3,dx4 +; you can change any of these if necessary. +; This is for the acb at ACBList(ACBHeader) + if StructureFile<>TownStructures then SASNotTown + if CurrentScreenMaxTown then SASNotTown + if PersonDisplayed<>0 then SASNotTown + goto @SpecialAniShiftTown + +.SASNotTown + return +;------ + +.SpecialSetupAniObject + if CurrentScreenMaxTown then SSUAONotTown + if PersonDisplayed<>0 then SSUAONotTown + gosub @ScanObjectTables + +.SSUAONotTown + +.SSAONotBank +; DyingGreenLaw=3711 +; DyingOneLaw=3710 +; DyingWhiteLaw=3712 +; DyingBlueLaw=3713 +; DyingSmallLaw=3715 +; DyingBrownLaw=3714 +; +; DyingBlueOut=3735 +; DyingWaistOut=3736 +; DyingWhiteout=3737 +; DyingCoatOut=3738 +; DyingTinyOut=3740 +; DyingMexican=3739 + +; if dv1 < DyingoneLaw then ssaoEnd +; if dv1 > DyingSmallTown then ssaoCheckBandits +; goto ssaoWritelist +;.ssaoCheckBandits +; if dv1 < DyingBlueOut then ssaoEnd +; if dv1 > DyingTinyOut then ssaoEnd +;.ssaoWriteList +; &worklist(arraycount) = dv1 +; add arraycount,c2 +; &worklist(arraycount) = dv2 +; add arraycount,c2 +; &worklist(arraycount) = dv3 +; add arraycount,c2 +; &worklist(arraycount) = dv4 +; add arraycount,c2 +; dv1 = 0 +.ssaoEnd +return + +.StrategyTask +.DoCr +.BGSpecial +.TextDisplayAnimation +.FGSpecials +.ExtraTask +.DamsSpecials +.FGSpecialsMovedSprite +;.ErrorHandler +.IRQScheduler +.BGSpecials +;.SpecialACBkilled ;ACBList(ACBHeader) or dv1 + return +;--- +.SpecialXZHObject +; for map, hide some things until the player knows about them... + if CurrentScreen<>BankGame then @SXONotBankGame + if dv1<27 then SXONotHinge + if dv1>32 then SXONotHinge +; DuelStatus is how many hinges/locks are wanted + dx1=dv1 + dx2=26 ; first lock(27) -1 + sub dx1,dx2 +; dx1=how many locks using this one would make it. + if dx1GameMap then @SXONotMap9 +; if dv1<290 then @SRONotClickable +; if dv1>350 then @SRONotClickable +;; in "hidden" table? +; dx1=SPHiddenOffset +; add dx1,SubplotsOffset +; &dx1=TownVarData(dx1) +; add dx1,dv1 +; dx2=290 +; sub dx1,dx2 +; dx2=TownVarData(dx1) +; if dx2=0 then SRONotClickable +; dv1=0 ; delete object +; return +; +;.SRONotClickable + if PlayersName<>Pat then SXOMapNotPat + if dv1<>4040 then SXONotPat ; hide train from Pat so + dv1=0 ; he isn't tempted to rob it. + +.SXOMapNotPat +.SXONotPat + if dv1<331 then @SXONotHideout + if dv1>336 then @SXONotHideout +; which gang is this, and have they been discovered? + dx1=dv1 + dx2=331 ; first gang + sub dx1,dx2 + add dx1,dx1 ; multiply by 16 - bytes per subplot entry in TVD + add dx1,dx1 ; multiply by 16 + add dx1,dx1 ; multiply by 16 + add dx1,dx1 ; multiply by 16 + dx2=SPGangsOffset + add dx2,SubPlotsOffset + &dx2=TownVarData(dx2) ; get start of gangs sub-plot information. + add dx1,dx2 + &dx1=TownVarData(dx1) + if dx1<250 then SXONotMap9 ; hidden from map + dv1=0 ; don't add it. + return ; discovered + +.SXONotHideout +.SXONotMap9 + if StructureFile=ArcadeStructures then SXONotTown ; ranch pic etc. +;; if PlayingDuel<>0 then SXONotTown + gosub @ScanObjectTables +.SXONotTown + return +;--- +.SpecialRasterObject + gosub @ScanObjectTables + return +;--- +.ClearHiresTable +; clear table giving coordinates of objects on current screen + x1=0 +.CHT1 + HiresTable(x1)=c0 + add x1,c1 + if x1GameMap then @ScanForWalkabout + x1=CurrentObjectTable +.SOT1 + &x2=ObjectTable(x1) + if x2=65535 then @SOTEnd + if x2<>dv1 then SOT2 +; got a match - record coordinates + sub x1,CurrentObjectTable + x2=65534 ; mask off bottom bit + and x1,x2 + add x1,x1 ; now index into 16-byte-per-entry table: i.e. times 8 + add x1,x1 + add x1,x1 + +.RecordCoordinates +; x1=number of object times 16 + if x1>SizeHiresTable then SOTBug ; 19 Jan 1991. + &HiresTable(x1)=dv2 ; x coord + add x1,c2 + x2=dv3 ; z + sub x2,dv4 ; y=z-h + &HiresTable(x1)=x2 ; y coord +.SOTEnd + return + +.SOTBug + break ;**** + return ;*(***** + break ;****** + +.SOT2 + add x1,c2 + goto @SOT1 +;--------- +.ScanForWalkabout +; Object dv1..dv4 being plotted +; look through TownFixedData(PeopleTableBase...) +; (numberOfPeople worth of 16-byte entries) +; First byte is room number person can occur in, +; second byte is object number they use (0 if any in range) +; Record any people in HiresTable() for checking with HiresCD +; This is the same CD routine as used for pointing +; at things on the game map. + if PlayingDuel=0 then SFWNotDuel + if CurrentScreen>MaxOutside then SFWNotDuel ; outside + if dv3>32019 then SFWNotDuel ; negative - include object + if dv6=dPlot then SFWNotDuel ; include all sprites + if dv3>160 then @SFWPersonDead ; remove foreground scenery + +.SFWNotDuel + + x3=84 ; gambler + x1=1344 ; x3*16 + if dv1=2658 then @SFWPersonX1Time16 ; gamblers in all saloons + if dv1<620 then @SFWRet ;******* + if dv1>650 then @SFWRet ;******* +.ScanForWalkabout2 + &x4=TownFixedData(0) ; offset in TownFixedData() + x3=0 ; number of person being examined +.SFWLoop + x1=TownFixedData(x4) ; room number +; people not specifically named, and for objects e.g. wanted poster + add x4,c1 + if x1=0 then SFW1 ; not fussy about which room it's in - e.g. + if x1<>Location then @SFW3 +.SFW1 + x1=TownFixedData(x4) ; graphics object number used. + x2=620 ; base for graphics number + add x2,x1 + if x2=dv1 then SFW2 ; a match! +; not a match, but... + if x1<>0 then @SFW3 ; not "anything vaguely like a person" flag. + if dv1<620 then @SFW3 ; lowest graphics number for person + if dv2>650 then @SFW3 ; highest graphics number for person +.SFW2 +; got a match - record it etc. + x1=x4 + &x2=TownFixedData(0) + sub x1,x2 * take off start of this table. + add x1,x1 ; get number times 16 from number times 8. + x2=65520 ; $fff0 ; remove bottom 4 bits. + and x1,x2 + +; person number x1/16 +; are they alive? + x2=PeopleVarData + add x2,x1 + x3=TVDPeopleNameOffset + add x2,x3 + x3=TownVarData(x2) + if x3=0 then SFWPersonDead + + if PlayingDuel<>0 then SFWPersonDead + +.SFWPersonX1Time16 + if dv1<639 then VRecordCoordinates + if dv1>645 then VRecordCoordinates +; this is a moving person - make a separate record of the offset + MovingPersonHires=x1 +.VRecordCoordinates + goto @RecordCoordinates ; gosub, return + +.SFW3 + x1=7 ; 8 bytes per entry + add x4,x1 + add x3,c1 ; number of person being examined + if x30 then SSEnd +; pop v1 +; goto @MCStartSound +; +;.SSEnd +; pop v1 +; return +;--- + +.ReadObjectAreas + MinXZH=1 + &MinRaster=StructureBuffer(4) + add MinRaster,c1 + &MinAnimation=StructureBuffer(10) + add MinAnimation,c1 + &MinCompressed=StructureBuffer(16) + add MinCompressed,c1 + &MinCell=StructureBUffer(28) +.ADRRet +.SuspendTaskSwap +.ResumeTaskSwap + return +;--- +.SetUpTextPtr +; &x1=list11(72) ; list 18's ptr +; &LongWS(HiLongTextScreenBase)=x1 +; &x1=list11(74) +; &LongWS(LoLongTextScreenBase)=x1 + return +;----- +;--- +.SetUpLogicalTextPtr +; &x1=LongWS(HiLongLogicalBase) +; &LongWS(HiLongTextScreenBase)=x1 +; &x1=LongWS(LoLongLogicalBase) +; &LongWS(LoLongTextScreenBase)=x1 + return +;--- +.SetUpPhysicalTextPtr +cif PC + v1=7 + gosub @MCEnableTextBuffer +cend ;PC + cif NotPC + &x1=LongWS(HiLongPhysicalBase) + &LongWS(HiLongTextScreenBase)=x1 + + &x1=LongWS(LoLongPhysicalBase) + &LongWS(LoLongTextScreenBase)=x1 + cend + return + +;--- +.LoadStructures + StructureFile=TownStructures + &v1=IntroTables(12) ; 's.dat' +.vLoadStructuresV1 ; .LoadStructuresV1 + + gosub @CopyFilename + v1=15 ; load list 15 (structureBuffer onwards) + v2=0 ; offset within list15 + v3=0 + gosub @MCLoadFile ; filename is list17(8...) + + v1=15 ; use list15, please + gosub @MCSetUpPtrs ; tell MC about ptrs + gosub @ReadObjectAreas ; read mincell, minraster, mincompressed +;; StartStructureBuffer=32 + StructureFile=TownStructures + return +;----------- +.AllocateStructures +; set up ACBList (14) + &x1=longws(HiLongFreeWorkspace) + &list11(56)=x1 ; set up list14 + &x1=longws(LOLongFreeWorkspace) + &list11(58)=x1 ; set up list14 + v1=ACBListSize ; probably excessive + gosub @MCReserveMemory + +; structure file... + &x1=longws(HiLongFreeWorkspace) + &list11(60)=x1 ; set up list15 + &x1=longws(LOLongFreeWorkspace) + &list11(62)=x1 ; set up list15 + + v1=60000 + gosub @MCReserveMemory + +; drop through to AAEssentialInit... + +.AAEssentialInit +; things which must be initialised after clear etc. + c0=0 ;****! + c1=1 + c2=2 + c3=3 + c4=4 + c5=5 + c6=6 + c7=7 + c8=8 + c9=9 + c16=16 + c32=32 + return + +;============ +.DisplayFrame + gosub @SetUpTextPtr + cif NotPC + ByteWS(ByteFrameReadyFlag)=c1 + cend + return +;------ +; wait for frame to be displayed +.WaitForFrame +cif NotPc ; don't wait on pc. + x1=ByteWS(ByteFrameReadyFlag) + if x1<>0 then WaitForFrame +cend + return +;---- +;---- +.WP1 +.EBRet + return +;---- +.DivX1X2 +; x1:=x1/x2 + x3=minusone ; result = 0 if x2>x1 +.DivLoop + add x3,c1 + sub x1,x2 + if x1<50000 then DivLoop + x1=x3 + return +;--- +;.ModX1X2 +;; x1:=x1 mod x2 +;.ModLoop +; x3=x1 ; trial result +; sub x1,x2 +; if x1<50000 then ModLoop +; x1=x3 +; return +;-------------- +.AllocateWorkspaceLists + cif NotPC +; PC allocates 2.5K for vars/table.txt var lists, +; ST allocates 0.5K total, but can allocate more here... + v1=512 ; space for extra vars + gosub @MCreserveMemory + cend + + &x1=longws(HiLongFreeWorkspace) + &list11(68)=x1 ; set up list17 + &x1=longws(LOLongFreeWorkspace) + &list11(70)=x1 ; set up list17 + v1=100 ; reserve space for list 17 (filename buffer) + gosub @MCReserveMemory + + &x1=longws(HiLongFreeWorkspace) + &list11(28)=x1 ; set up list7 + &x1=longws(LOLongFreeWorkspace) + &list11(30)=x1 ; set up list7 + + cif pc + v1=7 ; load into list 7 (acode doesn't need to +; access the exponent table again, so this subroutine just +; allocates some space for it, and we re-set up list7 +; afterward it's been called - thus leaving the data in memory) + gosub @LoadExponentTable + + &x1=longws(HiLongFreeWorkspace) + &list11(28)=x1 ; set up list7 + &x1=longws(LOLongFreeWorkspace) + &list11(30)=x1 ; set up list7 + cend + + + v1=TownVarDataSize ; reserve space for list 7 (TownTempData) + gosub @MCReserveMemory + +; This is the end of the area saved by the SAVE GAME option + + &x1=longws(HiLongFreeWorkspace) + &list11(64)=x1 ; set up list16 + &x1=longws(LOLongFreeWorkspace) + &list11(66)=x1 ; set up list16 + v1=WorkListSize ; reserve space for list 16 + gosub @MCReserveMemory +; if this overspills (as seems to happen in the scrolling games**** +; it will corrupt the thing afterwards + + +; v1=3000 ; attempt to fix bug which manifests in the scrolling +;; game maps (espec Escape) +; gosub @MCreserveMemory + +; list 2 is used by scrolling games for CD maps etc. +; It needs a total of 2400 bytes. Now, SizeHiresTable is normally +; 1440, so they need an extra 1000 bytes - unless you do some +; re-arrangement. +; See CDListNum and CDList in AACONST.TXT + + &x1=longws(HiLongFreeWorkspace) + &list11(8)=x1 ; set up list2 + &x1=longws(LOLongFreeWorkspace) + &list11(10)=x1 ; set up list2 + v1=SizeHiresTable ; reserve space for list 2(HiresTable) + add v1,c16 + gosub @MCReserveMemory + v1=700 + gosub @MCReserveMemory ; extra space used by scrolling games + + + gosub @AllocateStructures + + + gosub @AllocateAndLoadFont ; in list 26 + + gosub @AllocateSamplesAndMusic + + + + + &x1=longws(HiLongFreeWorkspace) ; allocate FloorMap + &list11(108)=x1 ; set up list27 ( for floormaps: Walkabout code ) + &x1=longws(LOLongFreeWorkspace) + &list11(110)=x1 ; set up list27 + v1=EndCache2 ; space for floor map cache. + goto @MCReserveMemory ; gosub ,return +; v1=8000 ;*********** Amstrad still crashes with this present. +; gosub @MCReserveMemory ; (it actually crashed +; whilst apparently within the driver 'open' function +; Possibly whilst scanning the floor maps before the game +; proper starts). + +;cif amiga +; v1=16000 +; v2=2 ; type of memory +; v3=25 ; return address in list 25 ptr +; gosub @MCReserveChip +; goto InitSamples2 +;cend +; +; return +;--- +.vPreLoadAndInsertdv1 ;.PreLoadAndInsertdv1 + push BuildingRoom +; make sure these system flags are cleared, in case an +; overlay terminated 'abnormally' + ScrollDirectionDone=0 + PlotLogicalDone=0 + BuildingRoom=true + push dv1 + gosub @InitACBs + + RasterOffset=0 + dv2=0 + dv3=0 + dv4=0 + dv5=dMarkPreload + dv6=0 ; non-reversed + gosub @DrawObjectdv1 + pop dv1 + + if CurrentScreen=GameMap then PLAI2 +; preload the first bit of any animation sequences, doing +; repeats once and once only... + x1=8 ; countdown counter + push dv1 +.PLAI1 + push x1 + gosub @DisplayACBsDV5 + gosub @SortAndDisplayObjects + pop x1 + sub x1,c1 + if x1>0 then PLAI1 + pop dv1 + dv2=0 + dv3=0 + dv4=0 + dv6=0 + +.PLAI2 + gosub @MCPreLoadCells + dv5=dInsert ; insert into structure. +;;;; if CurrentScreen=GameMap then @MCDrawObjectDV1 ; gosub, return + push dv1 + gosub @InitACBs + pop dv1 + gosub @DrawObjectdv1 ; gosub, return. + pop buildingRoom + return +;----- +.StartFreeACB0 +; ani sequence ObjectNumber, started at coords 0 +; returns dx4 as acb offset + dv2=0; x + dv3=0 ; z + dv4=0 ; h + +.StartFreeACB ;ObjectNumber, dv2, dv3, dv4; returns dx4 + dv1=ObjectNumber + dv5=dPlot + dv6=0 ; no reflection + gosub @FindObjectNumber + goto @SetupACB00 ; set up acb, without stepping on other animation. + +;----- +;---------- + + +;---- +;.SetUpACBdx4 +; push dx4 +; gosub @FindObjectNumber +; gosub @DecodeHeader +; pop dx4 +; dv1=ObjectNumber +; gosub @SUAGotBlankACB +; return +;--- +.ChangeACBdx4 +; change acb dx4 to use ani object ObjectNumber + push ACBHeader + push dx4 + ACBHeader=dx4 + push ObjectNumber + gosub @KillACBHeader + pop ObjectNumber + gosub @FindObjectNumber + gosub @DecodeHeader + pop dx4 + pop ACBHeader + dv1=ObjectNumber + dv6=0 ; reset reflection + goto @SUAChangeACB +;--- +; gosub @MCInitSound +; &WordwS(58)=c0 ; set length of sound to play to zilch. + + +;.[SpecialAniObject +;****** Now separate file****;KYC +;; object num has been requested by an animation sequence. +;; Do any intercepts, and change dv1-6 if you really +;; want to. + +;.StartSound +;; start sound if nothing already playing. +;; (priorities?) +; push v1 +; &v1=WordWS(58) ; snd_len - i.e. samples yet to play. +; if v1>0 then SSEnd +; pop v1 +; goto @MCStartSound +; +;.SSEnd +; pop v1 +; return +;--- + + +;--- +;code - +;code + +;.MCDrawObjectV1Vec +; goto @MCDrawObjectV1 +; +;.MCNoClipSpriteVec +; goto @MCNoClipSprite +; +;.MCFindObjVec +; goto @MCFindOBj +; + +;------ + +;---------- +.AbsX1 +; return absolute value of x1, in x1 + if x1<32768 then AbsX1Ret + push x2 + x2=x1 + x1=0 + sub x1,x2 + pop x2 +.AbsX1Ret +.SpecialSetUpFork ; with ACB dx4, coords dv2..dv4 +.SpecialSetUpACB + return +;-------- +.MultdX1dx2 +; dx1=dx1*dx2 + dx3=dx1 + if dx2=0 then Multdx1dx2Zero + if dx2=1 then Multdx1dx2Ret +.Multdx1dx2Loop + add dx1,dx3 + sub dx2,c1 + if dx2>1 then Multdx1dx2Loop +.Multdx1dx2Ret + return +.Multdx1dx2Zero + dx1=0 + return +;---------- +.PreloadSprites +; preload sprites for e.g. walkabout, or duel. + if CurrentScreen<400 then NotPreloadWalkabout + if CurrentScreen>549 then NotPreloadWalkabout + + dv5=dMarkPreload + dv1=49 ; person preload screen + x1=100 ; 0 for another, 100 for Billy, 200 for Pat. + if PlayersName=Billy then NIGM2 + x1=200 ; pat +.NIGM2 + &WordWS(WordRasterOffset)=x1 + gosub @MCDrawObjectDV1 + &WordWS(WordRasterOffset)=c0 + if HorseScreen=0 then PreloadHorse ; riding into town + if CurrentScreen<>HorseScreen then PreloadNotHorse +.PreloadHorse + dv1=48 ; horse preload screen + gosub @MCDrawObjectDV1 + +.PreloadNotHorse +.NotPreloadWalkabout + if PlayingDuel=false then @NotPreloadDuel ; if CurrentScreen<>DuelBack then NotPreloadDuel +; preload foreground person + if CurrentScreen<400 then @NotPreloadDuel ; not in town (kkludge) + if CurrentScreen>599 then @NotPreloadDuel + &WordWS(WordRasterOffset)=c0 + x1=20 ; number of objects to preload + dv1=2380 ; big Billy Draw + if PlayersName=Billy then PLDuel2 + dv1=2400 ; big Pat draw +.PLDuel2 + gosub @MCDrawObjectDV1 + add dv1,c1 + sub x1,c1 + if x1>0 then PLDuel2 + + x1=25 ; number of objects to preload + dv1=20 ; first frame of generic small person drawing + if EnemyName=255 then PLDuel3 ; =Pat, Billy or $ff for other + dv1=2530 ; small Billy Draw + if EnemyName=Billy then PLDuel3 ; =Pat, Billy or $ff for other + dv1=2420 ; small Pat draw +.PLDuel3 + gosub @MCDrawObjectDV1 + add dv1,c1 + sub x1,c1 + if x1>0 then PLDuel3 + + +.NotPreloadDuel + goto @MCpreloadCells ;' gosub, return +;----------------- +.DITBug ;**** + break ;****** + return +;------- +.InitTown + if CurrentScreenMaxTown then @NotInitTown + NextMusic=RagTimeMusic ; walkabout music (inside) + + if CurrentScreen>MaxOutside then DoInitTown ; Inside where duels can't happen? + NextMusic=ThemeMusic ; outside walkabout + + if PlayingDuel<> 0 then @NotInitTown +.DoInitTown + if HorseScreen<>0 then DIT2 + HorseScreen=CurrentScreen + PlayerACB=0 ; prevent anything resetting height when on horse + ObjectNumber=3630 ; Billy rides into town + if PlayersName=Billy then RideIn2 + ObjectNumber=3640 ; Pat rides into town + +.RideIn2 + dv2=0 ; x + dv3=0 ; z + dv4=0 ; h + RasterOffset=0 + gosub @StartFreeACB + goto @DIT3 + +.DIT2 + ObjectNumber=3400 + if PlayerWalking=true then DIT2a + ObjectNumber=3410 ; Player stopped in direction + +.DIT2a + add ObjectNumber,PlayerDirection + dv2=PlayerX ; 32 + dv3=PlayerZ + dv4=PlayerHeight ; h +;; add dv3,dv4 ; z=y+h + RasterOffset=100 ; 0 for another, 100 for Billy, 200 for Pat. + if PlayersName=Billy then DIT2b + RasterOffset=200 ; Pat + +.DIT2b + gosub @StartFreeACB + PlayerACB=dx4 + dx1=ACBCumulativeShift ; word - for Walkabout: keeps track +; of how far we've shifted vertically - to allow the up/down +; movement as we walk to be cancelled when change animation. + add dx1,PlayerACB + if dx1>ACBlistSize then @DITBug + &ACBList(dx1)=c0 ; reset cumulative H shift. + + if CurrentScreen<>HorseScreen then NotAddHorse +; if in room where we left the horse, put it back! + if horseX<150 then NotAddHorse ; horse has gone wrong somehow! + if HorseZ<120 then NotAddHorse ; horse has gone wrong somehow + ObjectNumber=3624 ; horse standing + dv2=HorseX ; x + dv3=HorseZ ; z + dv4=HorseH ; h + sub dv4,c8 ; h coord is slightly wrong as recorded because the +; raster for the horse's hindquarters is trapped + RasterOffset=0 + gosub @StartFreeACB +;; gosub @TCSetUpPlayer + +.NotAddHorse +.DIT3 + dv1=CurrentScreen + gosub @FCNewRoomDv1 ; load floor maps in. + + gosub @MoveOffBlockedSquares ; make sure Player isn't standing on +; something blocked (doesn't matter for horse) + + +.NotInitTown + return +;------------------------- +;---------------- + +.vSetDefaultPalettes + v1=4 ; list4 +cif notpc + &v2=list4(16) ; palette +cend + v3=16 +cif pc + &v2=list4(14) ; palette +cend + gosub @MCSetPalette + cif pc + gosub @SetCGAPalettes + cend + return +;-------------- +.SafePlotLogical + cif pc + if PlotLogicalDone=true then DEPL2 + gosub @MCPlotLogicalScreen + PlotLogicalDone=true + +.DEPL2 + cend + return +;--------------- +.SafeScrollDirection + cif pc + if ScrollDirectionDone=true then SSD4 + ScrollDirectionDone=true + gosub @MCScrollDirection +; convert error codes to a sane value which can safely be ignored + if v1<>32768 then SSD2 + v1=0 +.SSD2 + if v2<>32768 then SSD3 + v2=0 +.SSD3 +.SSD4 + cend + return +;----------------- +.vSelectLanguage + if Language<>0 then DontReload ; have already chosen + Language=German ;***** +; MenuNumber=6 ; choose language menu +; gosub @PrettyMenu +; Language=result + if language=English then DontReload + v1=65 ; 'a' + gosub @LoadGameData ; reload appropriate town gamedata. + &MenuOffset=IntroTables(32) ; offset of menu data. + +.DontReload + return +;---------- +.vBuildRoom + BuildingRoom=false ; a flag to Acode only, ignored by machine +; code. Logically it should go after this call, but that +; would waste a return instruction. + goto @MCBuildRoom +;---------- +.SetCGAPalettes + cif pc +; dc.b $0,$F,$F,$F,$F,$F,$0,$0,$F,$0,$9,$F,$F,$F,$0,$F ; 2 colour text printing +; dc.b $0,$F,$F,$F,$F,$F,$0,$0,$F,$0,$9,$F,$F,$F,$0,$F ; 2 color map +; dc.b $0,$F,$F,$1,$F,$F,$1,$1,$7,$0,$F,$0,$F,$F,$9,$0 ; 2 Pat, Billy & Barbrawl +; dc.b $0,$F,$7,$1,$F,$9,$1,$0,$7,$0,$F,$F,$F,$F,$A,$F ; 2 Outside Buildings +; dc.b $0,$F,$9,$0,$0,$0,$F,$0,$A,$A,$F,$F,$F,$F,$7,$F ; 2 Saloons + v1=4 ; list 4 + &v2=list4(20) ; CGA2 palette + v3=2 ; 2-color palette + v4=255 ; 255 is text printing palette + gosub @MCSetPalette + + add v2,c16 ; skip on to default palette (map) + v4=0 ; default palette + gosub @MCSetPalette + + add v2,c16 ; skip on to people palette + v4=1 ; palette 1 - people + gosub @MCSetPalette + + + v1=4 ; res-set up list just in case + &v2=list4(22) ; CGA4 palette + v3=4 ; 4-color palette + v4=255 ; 255 is text printing palette + gosub @MCSetPalette + + add v2,c16 ; skip on to default palette (map) + v4=0 ; default palette + gosub @MCSetPalette + + add v2,c16 ; skip on to people palette + v4=1 ; palette 1 - people + gosub @MCSetPalette +cend + + cif TownOverlay + x1=800 ; first object used for people + x2=999 ; last object used for people + x3=1 ; palette to set to + gosub @SetPreLoadPalettes + cend + + return +;-------------- +.SetPreLoadPalettes + cif pc +; set objects x1..x2 to use cga palette x3 + v1=x3 + gosub @MCSetPreloadPalette + + v1=x1 + v5=7 ; dSetPreloadPalette +.SPLP1 + gosub @MCDrawObjectV1 + add v1,c1 + if v1>Mike 30/3/89 - optimization in FindObjectNumber added +; +; changes 20/12/89 - fix reversal propogation in DisplayACBs +;>>Mike 18 June 1990 - Linked forks now kill existing links + +;>> 6 August 1990 - FindObjectNumber acode version +; removed for release game - makes a huge improvement +; in speed, because ObjectNumber=0 was being displayed +; for some reason by ACBs, and this was causing the entire +; structure file to be scanned. + +;31 August 1990 - fix to allow static acbs to have +; a raster offset (0 lines added) +; 10 October - SpecialInitACBs added, InitACBs changed +; to clear whole ACBList, including Sorting area. + +; 8 Jan 1991 - change to MCDrawObjectDV1 to stop +; plotting (caused by SetupACB calling DisplayACBs) whilst +; building a room. + +;; 19 Jan 1991 - important changes to SETUPACB - +; no longer returns negative (large positive) error return +; as this might cause corruption of later stuff if acbs overflow. +; Also, SetupACB0 changed to range-check acb requested, and +; abandon if too large. + + const +; LinkNextOffset=26 ; before stack in acb +; within acbs, this word gives the acb offset +; of any acb linked to this one. If this acb moves, move the other +; acb as well. If this acb is killed, kill the other acb as well + LinkedForks=1 ; set to 1 to allow, 0 to disable +;; LinkNextOffset=26 ; before stack in acb ; >>>>>>> RAJ + BloodRelations=0 ; set to 1 for blood relations only + +var + LinkNext LinkNextShift +;; X Y Z H ;>>>>>>>>>>>>added so new version works with RAJ. 4/8/90 + ACBLoopBreaker ;&*********** + + +begin + +;---- + +.MCDrawObjectdv1 + gosub @SuspendTaskSwap + push v1 + push v2 + push v3 + push v4 + push v5 + push v6 + if buildingRoom=false then MDO2 ; 8 Jan 1991 +; when building room, on PC mustn't do a plot because +; it screws everything up. + if dv5=dPlot then MDOEnd + +.MDO2 + v1=dv1 + v2=dv2 + v3=dv3 + v4=dv4 + v5=dv5 + v6=dv6 + gosub @MCDrawObjectv1 +.MDOEnd + pop v6 + pop v5 + pop v4 + pop v3 + pop v2 + pop v1 + gosub @ResumeTaskSwap + return +;----- +.InitACBs + gosub @SpecialInitACBs + + &ACBList(ACBSortStart)=c0 ; kill displayed acbs + dx1=8 + dx2=ACBSortStart + add dx1,dx2 + if dx1>ACBListSize then IABug ;******* + &ACBList(dx1)=c0 ; zero object to display + dx1=ACBStart +.IACBLoop + &ACBList(dx1)=c0 +; ix1=ACBSize + add dx1,c2 ; ix1 + if dx132767 then DisplayCell1 ; off screen +; calculate the maximum x used (for xsize of xzh objects) + MaxX=dv2 + +.DisplayCell1 + if dv2>MinX then DisplayCell2 + MinX=dv2 + +.DisplayCell2 +;cif Editor +; sub dv3,YBase +; and dv3,DisplayZMask +; add dv3,YBAse +;cend + + if dv2xclipMax then @DCRet + dx1=dv3 + sub dx1,dv4 + if dx1yclipMax then @DCRet +cend + +push dv3 + cif Editor + if UseMC=true then DCMC + if dv5=1 then @DCDraw + cend +.DCMC +; use MC to do plotting + if dv2>320 then DCMCDrawEnd ; x too big, or negative +;; if dv2<16 then DCMCDrawEnd ; x wrapped round to rhs of screen + + dx1=dv3 + sub dx1,dv4 + if dx1>200 then DCMCDrawEnd ; y too big, or negative + gosub @MCDrawObjectdv1 + +.DCMCDrawEnd +pop dv3 +.DCRet + return + +.DCDraw +; Use my draw cause it doesn't do vm +; calc y coord = z-h + if dv2>320 then DCDrawEnd ; x too big, or negative + sub dv3,dv4 + if dv3>200 then DCDrawEnd ; y too big, or negative + sub dv1,MinCell +; only used from structure editor, so no conflict over +; use of v1-3 with other tasks. + v1=dv1 + v2=dv2 + v3=dv3 + gosub @MCNoClipSprite ; displays at x=v2, y=v3 +.DCDrawEnd +pop dv3 + return +;--- +.DONNeo +; display the Neochrome screen +; which starts at List18(NeoScreenOffset) +; first 128 bytes are palette info. +; subsequent are groups of 4 words, 16 pel per word + +; Find starting address (i.e. ScrollX,ScrollY 16x16 blocks +; of PixelScrollX,PixelScrollY pixels) + +cif Editor + dx1=PixelScrollY ; *160 + dx2=160 + gosub @Multdx1dx2 + dx2=ScrollX + add dx2,dx2 + add dx2,dx2 + add dx2,dx2 ; *8 + add dx1,dx2 + dx2=NeoScreenOffset + add dx1,dx2 + dx2=128 ; skip palette info + add dx1,dx2 +; dx1 is now offset within List18 of the Neo screen +; to use for Import/export functions +; display it! +; copy neo picture to screen... +;code - +;code + + &WordWS(WordCursorXPos)=c0 + &WordWS(WordCursorYPos)=c0 + v1=19 ; logical base in list 19 + v2=20 ; physical base in list 20 + gosub @MCCalcScreenAddressVec ; get List19 as start of screen + v1=18 ; source for copy is list18 + v2=dx1 ; offset within source list + v3=19 ; destination is list19 + v4=0 ; offset within dest list + v5=8000 ; no. of words to copy + if SingleScreen=false then @MCCopyVec + v5=16000 ; copy a full screen + goto @MCCopyVec ; gosub, return +cend + return + +;--- +cif editor +.ADXAniCursor +; display xzh cursor (which is an animation object) + push ObjectNumber + ObjectNumber=CursorObject + dv1=CursorObject + gosub @FindObjectNumber + gosub @SetUPAcb + pop ObjectNumber + return +cend ; editor +;-------- +.DisplayXZHCursor + cif Editor +; if dv3xzhCursorZ then AbsDisplayXZHCursor +;code - +; random dx1 +;code + +; if dx1>128 then @DXZHNotCursorYet + return ; always display cursor on top nowadays. + cend + +.AbsDisplayXZHCursor +cif Editor + if WantToDisplayCursor=false then @DXZHNotCursorYet + WantToDisplayCursor=false + if CursorObject20 then @DONRet + Entryv1=dv1 +cend + gosub @SpecialXZHObject + if dv1=0 then DONRet + +push ObjectNumber + ObjectNumber=dv1 + gosub @FindAndDecode ; returns header as start of header +pop ObjectNumber +; now Header=start of header for this object + if size=4 then DONRet ; @AbsDisplayXZHCursor ; null object - don't bother + dx4=4 + add dx4,Header + if dv6=0 then dxzhLoop +; add on width to get the right-hand side as a base +; (because all the offsets specified in xzh objects are relative +; to what would be the lhs if it was displayed normal-way-round) + dx1=xsize + add dx1,dx1 + add dx1,dx1 + add dx1,dx1 + add dx1,dx1 + add dv2,dx1 + +.DXZHLoop + push dx4 ; save start of object call + push dv1 ; current object we're interpreting + push dv2 ; base x coord + push dv3 ; base z coord + push dv4 ; base h coord + push dv6 ; save reflection flag + cif Editor + push EntryV1 + cend + push xsize + push size + push header + push ObjectNumber + dx1=StructureBuffer(dx4) ; x coord + gosub @SignExtenddx1 + add dx1,dx1 + add dx1,dx1 + add dv2,dx1 + if dv6=0 then DXZHNotReflected + sub dv2,dx1 ; double subtract (because we've already added it on) + sub dv2,dx1 + +.DXZHNotReflected + add dx4,c1 + dx1=StructureBuffer(dx4) ; z coord + gosub @SignExtenddx1 + add dx1,dx1 + add dx1,dx1 + add dv3,dx1 + add dx4,c1 + dx1=StructureBuffer(dx4) ; h coord + gosub @SignExtenddx1 + add dx1,dx1 + add dx1,dx1 + add dv4,dx1 + add dx4,c1 + dx5=header + add dx5,size + if dx4>dx5 then @DXZHNull ; off end of buffer + +; sixteen bit non word-aligned read... + dx1=StructureBuffer(dx4) + add dx1,dx1 + add dx1,dx1 + add dx1,dx1 + add dx1,dx1 + add dx1,dx1 + add dx1,dx1 + add dx1,dx1 + add dx1,dx1 + add dx4,c1 + dv1=StructureBuffer(dx4) + add dv1,dx1 ; merge in high byte + +; was the current xzh object reversed? +; the xzh coords we've calculated above give the RHS +; of the object to call (because offsets are relative +; to this: when non-reflected, it's the LHS), +; but we need to calculate the LHS +; for the benefit of the object we call. +; So take off the x size of the object we're calling. + if dv6=0 then dxzh5 +; i.e. calculate lhs of object before calling it. + ObjectNumber=dv1 + dx1=32767 + and ObjectNumber,dx1 + push dx4 + gosub @FindAndDecode + pop dx4 + dx1=xsize + add dx1,dx1 + add dx1,dx1 + add dx1,dx1 + add dx1,dx1 + sub dv2,dx1 ; calc lhs of the current object for the benefit +; of the called routine + +.dxzh5 + if dv1<32768 then DXNotSetReflect + dx1=65535 ; toggle all bits + xor dv6,dx1 ; toggle reflection on/off + +.DXNotSetReflect + dx1=32767 + and dv1,dx1 ; remove x reflection bit + cif Editor + gosub @EditorCursorStuff + cend + if dv1=0 then @DXZHNull ;*** + gosub @DrawObjectdv1 ; beware - recursive!!! + +.DXZHNull + pop ObjectNumber + pop header + pop size + pop xsize + cif Editor + pop EntryV1 + cend + pop dv6 ; reflection flag + pop dv4 + pop dv3 + pop dv2 + pop dv1 + pop dx4 + dx1=5 + add dx4,dx1 + dx5=header + add dx5,size + if dx432008 then DXZHNotUp + sub NestingDepth,c1 + cend +.DXZHNotUp + return +;-------- +cif editor +.EditorCursorStuff + if Entryv1<>XZHbaseObjectNumber then DXZHNotBase +; flash current object ( selected by TAB) + add XZHSequenceNumber,c1 + if XZHSequenceNumber<>XZHCurrentItem then DXZHNotBase + if ybase<>CurrentYbase then dxzhNotBase + CurrentCellNumber=dv1 ; value of current item - for display on editor screen + CurrentX=dv2 + add CurrentX,PixelScrollX + CurrentZ=dv3 + CurrentH=dv4 + sub CurrentH,PixelScrollY + CurrentItemAddress=dx4 + sub CurrentItemAddress,c4 ; because dx4 was last byte of item. + + add XZHFlashCounter,c1 + if XZHFlashCounter=1 then DXZHNotBase + XZHFlashCounter=0 + dv1=0 ; prevent it displaying current item. + return + +.DXZHNotBase +; push MaxX +; push MinX +; push dv6 +; push XZHSequenceNumber +; XZHSequenceNumber=32000 ; prevent flashing things if CursorObject=ObjectNumber +; gosub @DisplayXZHCursor +; pop XZHSequenceNumber +; pop dv6 +; pop MinX +; pop MaxX + return +cend +;------ +.DrawObjectdv1 +; display dv1 directly from StructureBuffer +; starting from ScrollX,ScrollY blocks within the object (measured +; from the top left, as always) +; and dv6=0 for normal, -1 for LR reversed. + if dv1=NeoObjectNumber then @DONNeo + if dv132768 then DONNull ; -ve scroll + if y>32768 then DONNull ; -ve scroll + &dv1=StructureBuffer(dx4) + if dv1=0 then DONNull ;* + if dv1=32768 then DONNull + push dv2 ; x + push dv3 ; z + push dv4 ; h + push dv6 ; reflection flag + push dx4 + if dv1<32768 then DONRasterNotReflect + dx1=32768 + xor dv6,dx1 ; invert reflection flag + sub dv1,dx1 ; strip off reflection flag +.DONRasterNotReflect + gosub @DrawObjectdv1 ; display object dv1. MCNoClipSprite + pop dx4 + pop dv6 + pop dv4 + pop dv3 + pop dv2 +.DONNull + add dx4,c2 + dx1=16 + add dv2,dx1 ; x coord + if dv6=0 then DONNoReflect + sub dv2,dx1 ; x coords decrease in x reflection mode + sub dv2,dx1 + +.DONNoReflect + add x,c1 + if x>32768 then @DONXloop + if x32768 then @DONYLoop + if y32768 then @DONMapXloop + if x32768 then @DONMapYLoop + if yyclipMax then DONRMRet ; off window, or negative + &WordWS(WordCursorYPos)=dv3 ;x1 + v1=19 ; logical base in list 19 + v2=20 ; physical base in list 20 + gosub @MCCalcScreenAddressVec ; get List19 as current address +; plot an 8x4 pixel square + dx1=136 ; $10001000 + if ysize<3 then DON3 + dx1=170 ; $10101010 + if ysize<5 then DON3 + dx1=255 ; $11111111 +.DON3 + push dx1 + dx1=dv3 ; y coord in pixels (8x4 pels per block). + dx2=YRoomOffset + asr dx2 + asr dx2 + sub dx1,dx2 ; reduce y by offset used when it's displayed + if dx1>MapYPixels then DONOffCDMap + dx2=10 ; Multiply by 10 to give 20 words per line + gosub @MultDx1Dx2 + dx2=dv2 ; x coord in pixels + dx3=XRoomOffset + asr dx3 + sub dx2,dx3 ; reduce x by offset used when it's displayed + if dx2>MapXPixels then DONOffCDMap + asr dx2 ; /4 -> 0..160 (8x4s) => 0..40 per line (8x4 pels per block) + asr dx2 + add dx1,dx2 ; add on x blocks + dx2=65534 ; remove bottom bit + and dx1,dx2 + &Map(dx1)=ysize +.DONOffCDMap + pop dx1 + + list19(0)=dx1 + list19(160)=dx1 + if zsize=0 then @DON4Ret ; draw a thinner bar if 0 size. + list19(320)=dx1 + list19(480)=dx1 +; list19(640)=dx1 +; list19(800)=dx1 +; list19(960)=dx1 +; list19(1120)=dx1 + list20(0)=dx1 + list20(160)=dx1 + list20(320)=dx1 + list20(480)=dx1 +; list20(640)=dx1 +; list20(800)=dx1 +; list20(960)=dx1 +; list20(1120)=dx1 +.DON4Ret + return + + +cend + +;--- +;.DisplayAnimationFromMC +;; &dv1=longWs(Longdv1) +;; &dv2=longWs(Longdv2) +;; &dv3=longWs(Longdv3) +;; &dv4=longWs(Longdv4) +;; &dv5=longWs(Longdv5) +;; &dv6=longWs(Longdv6) +; &header=WordWS(WordAniHeader) +; &dv2=WordWS(WordX) +; &dv3=WordWS(WordZ) +; &dv4=WordWS(WordH) +; gosub @SetUpACB +; return +;--- +.DisplayAnimation +; display animation Object dv1 in text-form from +; start of current edit window (ScrollY) +; with the current edit line (CurrentAnimationY) highlighted. + cif Editor + if ACBSOnly=true then DARet ; ignore Ani objects + cend + gosub @SpecialSetUpAniObject + if dv1=0 then DARet + ObjectNumber=dv1 + gosub @FindAndDecode + cif Editor + if AniViewMode=0 then @TextDisplayAnimation + cend + gosub @SetUpACB ; PreviewAnimation + +.DARet + return +;------- +.DABug ;**** + break ;***** + return ;****** +;------- +.DisplayACBs +; display all Animation Control Blocks. + dv5=1 ; display as sprite. +.DisplayACBsdv5 + CurrentStore=ACBSortStart + if CurrentStore>ACBListSize then DABug ;**** + &ACBList(CurrentStore)=c0 ; indicate end of sorting list + +.DisplayACBs2 + gosub @PurgeACBs ; get rid of any acbs killed by other code - +; e.g. when people's animation sequence is changed, and the links +; have 7fff written to them by KillACBHeader. + +; GMJ 1/9/89 +cif BloodRelations +; display still people while in menu mode + if ACBStart<>ACBSearchStart then DisplayACBs3 + gosub @DisplayStillPeople +.DisplayACBs3 +cend + + + ACBHeader=ACBStart +.DisplayACBsLoop +;** cif Editor + ACBLoopBreaker=0 +;** cend + dv6=0 ; non-reversed ;20/12/89 + + cif LinkedForks + LinkNext=0 ; 11/May/90 + LinkNextShift=1 ; if a shift is done, link any linked forks to it + cend + + gosub @DisplayACB + dx1=ACBSize + add ACBHeader,dx1 + if ACBHeader32767 then CACL2 ; flag set up by KillACB + &ACBList(ACBHeader)=c0 + dx2=2 + add dx2,ACBHeader + if dx2>ACBlistSize then @DABug ;****** + &ACBList(dx2)=c0 ; kill SP as well, just in case acb is reanimated + +.CACL2 + + +; additions 28 august 1990 to try to fix "following arms" bug + dx2=LinkNextOffset + add dx2,ACBHeader + &dx3=ACBList(dx2) ; what is child? + &dx3=ACBList(dx3) ; is child alive? + if dx3=0 then CACL3 ; no - remove link to it + if dx3<>32767 then CACL4 +.CACL3 + if dx2>ACBListSize then @DABug ;****** + &ACBList(dx2)=c0 + +.CACL4 +; end of 28 august 1990 additions. + + + add ACBHeader,dx1 ; dx1 is still ACBSize + if ACBHeaderACBlistSize then @DABug ;***** + &ACBList(CurrentStore)=c0 ; indicate end of sorting list + + dv6=0 ; non-reversed + ACBHeader=ACBSize +.DisplaySPLoop +;; ACBLoopBreaker=0 + gosub @DisplayStillPerson + dx1=ACBSize + add ACBHeader,dx1 + if ACBHeader32010 then @DisplayStaticACB + add SP,ACBHeader ; make absolute + +.DisplayACB1 +;** cif Editor + add ACBLoopBreaker,c1 + if ACBLoopBreaker>20 then @RDARet +;** cend + + dx1=1 + and dx1,sp + if dx1<>0 then @RDAEmergencyKill ;***** why is this necessary? + + dx1=SP + &AA=ACBList(dx1) ; find AA at current stack position + add dx1,c2 + &CC=ACBList(dx1) ; find CC at current stack position + add dx1,c2 + &EE=ACBList(dx1) ; find EE at current stack position + + dv6=cc ; extract reversal status (top bit of count) >>Mike 23/9/89 + dx1=32767 ; $7fff + and cc,dx1 + dx1=32768 + and dv6,dx1 ; keep top bit only + + if AAACBStackStartMinus1 then RDAPop2 +; Nothing else to pop: terminate this ACB +.RDAKill + gosub @KillACBHeader + return + +.RDARet +; break ;**** +; dx1=StructureBuffer(AA) ;**** +; &dx1=ACBList(SP) ;*********** +.RDANull + return + +.RDAPopKill + pop dx1 + goto RDAKill + +.RDAEmergencyKill +; break ;********* leave in, but comment out please. + goto RDAKill + +.RDAPop2 + dx4=2 + add dx4,ACBHeader +; dx1=sp + sub sp,ACBHeader ; make it relative + if dx4>ACBListSize then @RDABug1 ;***** + &ACBList(dx4)=sp + add sp,ACBHeader ; make it absolute again + goto @DisplayACB1 ; try again - with the caller of this routine +;--- +.RDABUg1 ;******** + break ;******** + return ;********* +.RDABUg2 ;******** + break ;******** + return ;********* +.RDABUg3 ;******** + break ;******** + return ;********* +.RDABUg4 ;******** + break ;******** + return ;********* +.RDABUg5 ;******** + break ;******** + return ;********* +.RDABUg6 ;******** + break ;******** + return ;********* +.RDABUg7 ;******** + break ;******** + return ;********* +.RDABUg8 ;******** + break ;******** + return ;********* +.RDABUg9 ;******** + break ;******** + return ;********* +.RDABUg10 ;******** + break ;******** + return ;********* +.RDABUg11 ;******** + break ;******** + return ;********* +.RDABUg12 ;******** + break ;******** + return ;********* +.RDABUg13 ;******** + break ;******** + return ;********* +.RDABUg14 ;******** + break ;******** + return ;********* +.RDABUg15 ;******** + break ;******** + return ;********* +.RDABUg16 ;******** + break ;******** + return ;********* +.RDABUg17 ;******** + break ;******** + return ;********* +.RDABUg18 ;******** + break ;******** + return ;********* +;------- +.RDAOk + gosub @DecodeInstruction +; -> dx4=start of next instruction +; -> Opcode, x,z,h,num as the instruction to execute + if dx4>EE then @RDAReturn ; padding instruction at end. + if cc=24373 then SkipInstruction + if opcode=128 then NextInstruction ; repeating a repeat instruction + if cc<>0 then RDARepeat +.NextInstruction +; execute instruction once, then skip onto next. +; (In fact, let's skip onto next now) + if sp>ACBListSize then @RDABug2 ;******* + &ACBList(sp)=dx4 ; set up new pc + goto @DANoRepeat + +.SkipInstruction +;;break ;******* + if sp>ACBlistSize then @RDABug3 ;******* + &ACBList(sp)=dx4 ; set up new pc + dx1=2 + add dx1,sp + if dx1>ACBListSize then @RDABug4 ;****** + &ACBList(dx1)=dv6 ; zero repeat count so future instructions are done + goto @DisplayACB ; repeat it no times at all. + +.RDARepeat +; decrement repeat count + if cc=32767 then DANoRepeat ; repeat forever + dx1=2 + add dx1,sp + sub cc,c1 + dx2=cc ;>>Mike 23/9/89 + or dx2,dv6 + if dx1>ACBListSize then @RDABUg5 ;****** + &ACBList(dx1)=dx2 ; cc + +.DANoRepeat +; execute instruction @ StructureBuffer(AA). +;; gosub @DecodeInstruction + if Opcode<>192 then @RDANotFork + if num=0 then @RDANull + ObjectNumber=num + gosub @GetObjectType + if ObjectNumberType<>AnimationType then @RDANotFork2 + + + gosub @FindAndDecode + dx4=32000 ; dummy dx4, just in case it's a static acb +; (To stop the instant display code below doing anything nasty ) + + gosub @SetUpACB0 ; just display it, don't step on ani or anything. + +cif LinkedForks + if LinkNext=0 then DAForkNoLink ; 11may1990 + LinkNext=dx4 ; acb we just set up + + dx1=LinkNextOffset + add dx1,ACBHeader + if dx1>ACBListSize then @RDABUg6 ;******** + &ACBList(dx1)=LinkNext ; either 0, or the acb we're linking to this +; one. + LinkNext=0 ;11may 1990 +.DAForkNoLink +cend ; LinkedForks + +; we have just set up acb dx4. If we're not going to do so this +; turn, do it now. + gosub @SpecialSetUpFork ; setting up animation object OBJECTNUMBER +; in ACB dx4, coords dv2..dv4 +; requested by ACB ACBHeader + + if dx4>ACBHeader then NotInstantDisplay + push ACBHeader + ACBHeader=dx4 + gosub @DisplayACB + pop ACBHeader + +.NotInstantDisplay + + goto @DisplayACB ; display next frame of parent as well + +.RDANotFork2 + return +;--- +.RDANotFork + if Opcode<>0 then @RDANotDisplay + if num=0 then @RDANull + if num<>16383 then RDANotFlip +; flip xreflection + dx2=32768 + xor dx2,dv6 + dx1=2 + add dx1,sp + if dx1>ACBListSize then @RDABug7 ;******* + &ACBList(dx1)=dx2 ; dv6 + goto @DisplayACB +;--- +.RDANotFlip + +cif LinkedForks + if num<>16381 then RDANotUnlinkedShift +; next shift will not affect links + LinkNextShift=0 + goto RDALNextACB + +.RDANotUnlinkedShift + if num<>16382 then RDANotLinkNext +; kill any pre-existing linked fork + push ACBHeader + dx1=LinkNextOffset + add dx1,ACBHeader + &ACBHeader=ACBList(dx1) ; either 0, or the acb we're linking to this + if ACBHeader=0 then RDALinkIt + gosub @KillACBHeader +.RDALinkIt + pop ACBHeader + + LinkNext=1 ; if next instruction is a fork, make it linked +.RDALNextACB + goto @DisplayACB + +.RDANotLinkNext +cend + + + ObjectNumber=num + gosub @GetObjectType + if ObjectNumberType<>AnimationType then @RDANotAni +; if numACBStackStart then RDANoBug2 ;**** +; gosub @SuspendTaskSwap ;**** +; break ;**** +; gosub @ResumeTaskSwap ;***** +; +;.RDANoBug2 +push sp + dx2=2 + add dx2,ACBHeader + dx1=sp + sub dx1,ACBHeader ; make sp relative + if dx1>ACBStackEnd then @RDAPopKill + if dx2>ACBlistSize then @RDABug8 ;******* + &ACBList(dx2)=dx1 ; set up new sp + gosub @FindObjectNumber +; AA CC EE Stack entries + dx2=4 + add dx2,header ; skip over header + if sp>ACBListSize then @RDABUg9 ;******* + &ACBList(sp)=dx2 + add sp,c2 + &ACBList(sp)=dv6 ; zero count, including reversal flag. c0 ; single execution of next instruction + add sp,c2 + &dx1=StructureBuffer(header) + add dx1,header + &ACBList(sp)=dx1 ; end of object +pop sp ; new sp + goto @DisplayACB1 ; display it immediately + +.RDANotAni +; Store request to draw object num at coords dv2,dv3,dv4 +; dx1=ACBRasterOffset +; add dx1,ACBHeader +; &dx1=ACBList(dx1) + push dv1 + gosub @SpecialAniObject + pop dv1 + if num=0 then @SADORet + +.StoreNum + dx1=62 + add dx1,ACBHeader + &ACBlist(dx1)=num ; store frame being used. + + dx1=ACBRasterOffset + add dx1,ACBHeader + &dx1=ACBList(dx1) + + add CurrentStore,c2 ; skip link ptr + if CurrentStore>ACBListSize then @RDABug10 ;******* + &ACBList(CurrentStore)=dv3 ; store z coord first, for easy sorting + add CurrentStore,c2 + &ACBList(CurrentStore)=dv2 ; x coord + add CurrentStore,c2 + &ACBList(CurrentStore)=dv4 ; h coord + add CurrentStore,c2 + &ACBList(CurrentStore)=num ; object to draw + add CurrentStore,c2 + &ACBList(CurrentStore)=dv6 ; reversal flag + add CurrentStore,c2 + &ACBList(CurrentStore)=dx1 ; raster offset + add CurrentStore,c2 + &ACBList(CurrentStore)=c0 ; zero to indicate new end of list +.SADORet + return + +.SortAndDisplayObjects +; given the complete list, ACBList(ACBSortStart..CurrentStore), +; sort it and display from the back, working forwards. +; Format of each entry is: +; ACBList(CurrentStore+0)=link ptr for sort. +; ACBList(CurrentStore+2)=z coord +; ACBList(CurrentStore+4)=x coord +; ACBList(CurrentStore+6)=h coord +; ACBList(CurrentStore+8)=number of object to plot. +; ACBList(CurrentStore+10)=reflection flag to be used +; ACBList(CurrentStore+12)=RasterOffset + dv5=1 ; only every display as sprites... + +.SortAndDisplaydV5 +; A linked list sort... + dx6=ACBSortStart ; start of current linked list. + dx5=14 ; size of each entry + dx4=ACBSortStart; current entry we're examining + if CurrentStore=dx4 then SADORet ; nothing to display +.LLSort1 + add dx4,c2 + &dx1=ACBList(dx4) ; dx1:=z coord + sub dx4,c2 + gosub @AddToLL + add dx4,dx5 + if dx40 then @LLDisplayLoop + return + +.AddToLL +; find where in current linked list: ACBList(dx6) we +; should add the object ACBList(dx4), which has z coord dx1, +; and do it. + dx3=dx6 + add dx3,c2 ; move on to z coord + &dx2=ACBList(dx3) ; get z coord of first item in linked list. + if dx1ACBListSize then SortBug ;****** + &ACBList(dx4)=dx3 ; entry in list which follows this one + if dx6>ACBListSize then SortBug ;****** + &ACBList(dx6)=dx4 ; entry in list which preceeds this one +.AddInEnd + pop dx6 ; get back the start of the Linked list + return + +.SortBug ;**** + break ;****** + return ;****** +;--- +.AddToStart + dx1=dx6 ; old start of linked list + dx6=dx4 + if dx6=dx1 then ATS1 ; first entry to be put in an empty LL will +; always go wrong unless we do this. + if dx6>ACBListSize then SortBug ;****** + &ACBList(dx6)=dx1 ; point to old start of linked list. +.ATS1 + return +;--- +.RDANotDisplay + if Opcode<>64 then @RDANotShift +; 01HHHHHH XXXXXXXX ZZZZZZZZ = shift base for current object. (pixels) +; x,z,h are treated as signed bytes + dx1=x + gosub @SignExtenddx1 + push dx1 ; push x + dx1=z + gosub @SignExtenddx1 + push dx1 ; push z + dx1=h + gosub @SignExtend6Bitdx1 + dx4=dx1 ; h speed + pop dx3 ; z speed + pop dx2 ; x speed + gosub @DoShift + + goto @DisplayACB + +.RDANotShift + if Opcode<>128 then @RDANotRepeat +; 10RNNNNN = If R=0, repeat next instruction N times +; R=1, repeat next until 5bit random>N +; change ACBList(SP+2) to reflect desired count + if dv5=MarkPreload then @RDANotRepeat ; preload - do once only. + + dx1=2 + add dx1,sp + dx2=32767 ; signify repeat forever + if num=0 then @DARepeatDx2 + + add num,c1 ; repeat goes 2..16, not 1..15 (0=forever) + if num<17 then RDANotRandom +; 17 is lowest value that comes here for random. +; -> we want that to translate to "do never" + dx2=18 + sub num,dx2 ; makes num negative for 17 +code - + random x2 +code + + asr x2 + asr x2 + asr x2 + asr x2 +; have random 0..15 + sub num,x2 + if num<32000 then GotRandomRepeat +; skip next instruction... + dx2=24373 ; skip next instruction + goto DARepeatDX2 + +.GotRandomRepeat +.RDANotRandom +; add on to existing count + &dx2=ACBList(dx1) + add dx2,num +.DARepeatDx2 + or dx2,dv6 + if dx1>ACBListSize then @RDABug11 ;***** + &ACBList(dx1)=dx2 ; num + goto @DisplayACB ; execute the instruction to be repeated + +.RDANotRepeat + return +;---- +.DecodeInstruction +; For instruction StructureBuffer(AA), return +; dx4=address of next instruction +; and opcode, x, z, h, num as the instruction + dx4=AA + opcode=StructureBuffer(AA) + dx1=opcode ; save number + dx2=192 + and opcode,dx2 +; now opcode=one of: +; 00NNNNNN NNNNNNNN = DISPLAY object N +; 01HHHHHH XXXXXXXX ZZZZZZZZ = shift base for current object. (pixels) +; 10RNNNNN = If R=0, repeat next instruction N times +; R=1, repeat next until 5bit random>N +; 11NNNNNN = fork (start new animation object +; in addition to existing one) + + if opcode=192 then DIDisplay + if opcode<>0 then @DINotDisplay +.DIDisplay +; dx2=256 +; gosub @Multdx1dx2 ; high byte of num + add dx1,dx1 + add dx1,dx1 + add dx1,dx1 + add dx1,dx1 + add dx1,dx1 + add dx1,dx1 + add dx1,dx1 + add dx1,dx1 + + num=dx1 + add dx4,c1 + dx1=StructureBuffer(dx4) + add num,dx1 + add dx4,c1 +push dx1 ; I'm not sure if this is necessary or not. + dx1=16383 ; $3fff + and num,dx1 ; remove opcode (for Fork opcode) +pop dx1 +; dx1=StructureBuffer(dx4) +; h=15 +; and h,dx1 +; dx2=16 +; gosub @Divdx1dx2 +; x=dx1 +; add dx4,c1 ; skip on to next instruction +; z=0 ; no z offset generated by this instruction + return +; +.DINotDisplay + if opcode<>64 then DINotShift +; 01HHHHHH XXXXXXXX ZZZZZZZZ = shift base for current object. (pixels) + h=63 + and h,dx1 + add dx4,c1 + x=StructureBuffer(dx4) + add dx4,c1 + z=StructureBuffer(dx4) + add dx4,c1 + return +; +.DINotShift + if opcode<>128 then DINotRepeat +; 10RNNNNN = If R=0, repeat next instruction N times +; R=1, repeat next until 5bit random>N + num=63 + and num,dx1 + add dx4,c1 + return +; +;code - +; prs " bad instruction: " ;******* +;code + +.DINotRepeat +;;break ; test code + add dx4,c1 ; prevent loops and sim if we get a bad instruction. + return + +;-------- +.NewACB +.SetUpACBdv1 + ObjectNumber=dv1 + gosub @FindAndDecode + +.SetUpACB +; Given dv1=Object, dv2=x, dv3=z, dv4=h, dv5=placement type: +; and header as start of Object +; Set up an ACB of the form: +; ** dv1 (object number) +; ** SP ------------------------- (relative to itself) +; ** x (pixels) } | +; ** z (pixels) } current base coords for this ani object. +; ** h (pixels) } | +; (Other stuff, depending on value of ACBStackStart in +; the rest of the program) | +; | +; AA CC EE Stack entries | +; AA CC EE | +; AA CC EE <---- +; AA: AA= address of opcode to execute next, +; And CC=Repeat Count for current repeat operation +; Each time executed, decrements+does instruction. +; If (after decrement) CC=0, we +; move AA on to next instruction: i.e. treated as a PC. +; Then execute the instruction at the original value of AA. +; Essentially, CC is the number of EXTRA times to +; repeat the next instruction: i.e. to execute it once, CC=0 +; to execute it twice, CC=1 etc. +; EE: is address of first byte after current object. +; Also, return ACBList(dx4) as the ACB set up. +; if dv1ACBListSize then SGBARet ;19 Jan 1991 +; change 28 August 1990 to try to fix "Flashing body" bug + push dx4 + push acbheader + ACBHeader=dx4 + gosub @KillACBHeader + pop ACBHeader + pop dx4 +; end of 28 August 1990. + gosub @SpecialSetUpACB +push dx4 + add dx4,c4 ; skip over sp + if dx4>ACBListSize then @RDABug12 ;***** + &ACBList(dx4)=dv2 ; x + add dx4,c2 + &ACBList(dx4)=dv3 ; z + add dx4,c2 + &ACBList(dx4)=dv4 ; h + add dx4,c2 + &ACBList(dx4)=RasterOffset ; ACBList(ACBRasterOffset) +pop dx4 + +cif LinkedForks + dx1=LinkNextOffset + add dx1,dx4 + if dx1>ACBlistSize then @RDABug13 ;****** + &ACBList(dx1)=c0 ; no links from this acb +cend + +.SUAChangeACB +; change acb dx4 without altering coordinates etc. +; DOES NOT CHANGE RASTER OFFSET EITHER + if dx4>ACBlistSize then @RDABug14 ;******* + &ACBList(dx4)=dv1 ; poke in object number + add dx4,c2 + dx1=ACBStackStart + &ACBList(dx4)=dx1 ; ptr to "sp" + sub dx4,c2 + +;;&*&*& Change requested by Graham: 19/7/89 +; cif NotEditor +; object=dx4 +; asr object +; asr object +; asr object +; asr object +; asr object +; asr object +; dx1=ACBObjectOffset +; add dx1,dx4 +; &ACBList(dx1)=object +; cend +;;&*&*& + + +push dx4 + dx1=ACBStackStart + add dx4,dx1 ; x4:=start of stack area. + dx1=4 + add dx1,header + if dx4>ACBlistSize then @RDABUg15 ;******* + &ACBList(dx4)=dx1 ; PC within ani object + add dx4,c2 + dx1=32768 ; only keep reversal flag + and dv6,dx1 + if dx4>ACBlistSize then @RDABUg16 ;******* + &ACBList(dx4)=dv6 ; zero count - top bit is reversal status. >>Mike 23/9/89 + add dx4,c2 + &dx1=StructureBuffer(header) + add dx1,header + if dx4>ACBlistSize then @RDABUg17 ;******* + &ACBList(dx4)=dx1 ; first byte outside current object +pop dx4 + + if dv1MinCell then SUS1 ; static acb + +.SetUpACb1Ret + return +;--- +.SetUpStaticACBdx4 + gosub @SUAGotBlankACB +; goto @SUS1 +; +;.SetUpStaticACB +;; set up an ACB for a non-animation object - i.e. +;; an object which will remain still, such as a person. +;; (Though it may be moved around by special-case code). +;; Thus it is effectively used as a sprite control block. +;push dv1 +; gosub @SetUpACB1 +;pop dv1 +.SUS1 +push dx4 + if dx4>ACBlistSize then @RDABUg18 ;******* + &ACBList(dx4)=dv1 + add dx4,c2 + dx1=34000 ; make sure SP=ACBHeader+dx1 is negative. + &ACBList(dx4)=dx1 ; flags it as negative + dx1=ACBRasterOffset + add dx1,dx4 + &ACBList(dx1)=RasterOffset +pop dx4 +.DSBRet + return +;--- +;------- +.DisplayStaticACB +; have an ACB to display some object at coords dv2,dv3,dv4 +; &v1=ACBList(ACBHeader) ; dx4) +; v2=dv2 +; v3=dv3 +; v4=dv4 +; v5=dv5 +; v6=dv6 +; goto @MCDrawObjectv1 + &num=ACBList(ACBHeader) + if num=32767 then DSBRet ; ACB has been flagged for execution +; at the end of this DisplayACBs cycle. +; dx1=0 ; raster offset=0 + goto @StoreNum +;------ + +;-- +cif editor +code - + prs " FindObjectNumber. " +code + +cend +;--- +.FindAndDecode + gosub @FindObjectNumber + goto @DecodeHeader +;--- +.FindObjectNumber +; return Header=offset of ObjectNumber within StructureBuffer +; goto @FON6 +; + gosub @GetObjectType + dx1=32767 ; strip off reflection flag + and ObjectNumber,dx1 + if ObjectNumber=0 then @FON6 + if ObjectNumber>MinCompressed then @FON6 +;;; goto @FON6 ;*************** +cif Editor + if StructuresChanged=true then @FON6 + if SafeMode<>false then @FON6 +cend + push v1 + push v2 + push v3 + v1=ObjectNumber ; object to find + v2=StructureBufferList ; list containing structure buffer + gosub @MCFindObj +; v3 is offset within structure buffer + header=v3 + dresult=true + pop v3 + pop v2 + pop v1 + return +;--- +.FON6 +cif Editor + if ObjectNumber>MinCell then @FONEndOfBuffer + LastHeader=65535 ; dummy value for error-trapping +;; StartStructureBuffer=32 + if ObjectNumber=0 then @FONEndOfBuffer ; not found +cend + + Header=StartStructureBuffer + return ; must not have this code for release game! +; because it causes a major slowdown if ObjectNUmber 0 is plotted - +; and it seems to be from time to time! + + +cif Editor + dx2=1 ; current object number + +.FON1 + push dx1 + push dx4 + dx1=1 ;test code + and dx1,header + if dx1=0 then @FONHeaderOk + dx1=65534 + and header,dx1 ; make it even + goto @FONError + +.FONHeaderOk + pop dx4 + pop dx1 +;;cend + + &dx1=StructureBuffer(Header) + +;; cif Editor +; check validity of pointer + push dx1 + push dx4 + if AniViewMode=1 then @fonOk ; skip checking in preview mode. + if SafeMode=false then @fonOk ; skip checking +; if dx1<4 then fonError + if dx1>32000 then fonError ; don't allow backwards pointers. + dx4=1 ;test code + and dx4,dx1 + if dx4=0 then @FONOk +.fonError + if IgnoreErrors>5000 then fonE2 + sub IgnoreErrors,c1 + goto @FONExit + +.fonE2 +push dx1 +push dx4 + gosub @SetUpPhysicalTextPtr + &WordWS(WordCursorYPos)=c0 + RealCr=true + dx4=LastHeader +code - + prs " A major error has been detected at " + message cr + prs " offset " + print header + prs " ptr=" + print dx1 + prs " Last header=" + print dx4 ; = LastHeader + message cr + prs " within the structure file. " + message cr + prs " The system may possibly crash. " + message cr + prs " Hit panic or any key. " + message cr + prs " Press esc to truncate structure file." + message cr + prs " Press '1' to ignore next 100 errors. " + message cr + prs " Press '2' to ignore next 5000 errors. " + message cr + prs " Press '3' to break. " +code + + pop dx4 + pop dx1 + RealCr=false + gosub @WaitKey + if v2=1 then @FONTruncate + if v2<>2 then fonNotIgnore ;'1' + IgnoreErrors=100 + goto @FONExit + +.fonNotIgnore + if v2<>3 then fonNotIgnore2 ;'2' + IgnoreErrors=4999 + goto @FONExit + +.fonNotIgnore2 + if v2<>4 then fonNotBreak ;'3' + break ; leave in, please + push LastHeader + pop LastHeader + push header + pop header + goto @FONExit + +.fonNotBreak + &dx1=StructureBuffer(Header) + dx4=65534 ; remove bottom bit + and dx1,dx4 ; attempt to correct tree + if dx1>3 then FONNotTooSmall + dx1=4 + +.FONNotTooSmall + &StructureBuffer(header)=dx1 + pop dx4 + pop dx1 + goto @fonEndOfBuffer ; and recover gracefully + +.FONTruncate + dx1=1024 + + push header +.FONT1 + dx4=65534 + and header,dx4 + &StructureBuffer(header)=c0 + add header,c2 + and dx1,dx4 + if dx1>0 then FONT1 + pop header + +.FONExit +;;cif editor + LastHeader=header +;;cend + dx1=65534 + and header,dx1 + pop dx4 + pop dx1 + goto fonEndOfBuffer ; and recover gracefully + +.fonOk + pop dx4 + pop dx1 +;; cend + + if dx1=0 then FONEndOfBuffer + if dx2=ObjectNumber then FONFound + add dx2,c1 ; increment object number + add Header,dx1 + goto @FON1 + +.FONFound + dresult=true + return + +.FONEndOfBuffer + dresult=false ; not found + return + + + cend ;Editor - FON code not needed. +;--- +;-- +.DecodeHeader +; decode header at Header + dx4=Header + &Size=StructureBuffer(dx4) + add dx4,c2 + xsize=StructureBuffer(dx4) + add dx4,c1 + zsize=StructureBuffer(dx4) +; now calculate ysize (only valid for raster objects) + dx1=size + sub dx1,c4 +; halve size (word-based table), then divide it by xsize to give ysize + if size=0 then dhNullObject + dx2=xsize + add dx2,dx2 + gosub @Divdx1dx2 + ysize=dx1 + return + +.dhNullObject +; blank object + ysize=0 + return +;--- + cif editor +.MultdX1dx2 +; dx1=dx1*dx2 + dx3=dx1 + if dx2=0 then Multdx1dx2Zero + if dx2=1 then Multdx1dx2Ret +.Multdx1dx2Loop + add dx1,dx3 + sub dx2,c1 + if dx2>1 then Multdx1dx2Loop +.Multdx1dx2Ret + return +.Multdx1dx2Zero + dx1=0 + return + cend +;--- +.SignExtenddX1 +; dX1 contains a byte: sign-extend to a full word + dx2=255 + and dx1,dx2 + if dx1<128 then SignExtenddRet + dx2=65280 ; 65536-256 + add dx1,dx2 +.SignExtenddRet + return +;--- +;--- +.SignExtend6Bitdx1 +; dx1 contains a 6-bit number: sign-extend to a full word + dx2=63 + and dx1,dx2 + if dx1<32 then SignExtendd6Ret + dx2=65472 ; 65536-64 + add dx1,dx2 +.SignExtendd6Ret + return +;---- +;.Divdx1dx2 +;; dx1:=dx1/dx2 +; dx3=65535 ; result = 0 if dx2>dx1 +;.DivdLoop +; add dx3,c1 +; sub dx1,dx2 +; if dx1<50000 then DivdLoop +; dx1=dx3 +; return +;;--- + +.DivdX1dX2 +; dx1:=dx1 div dx2 + dx3=0 ; result + if dx2=0 then DivdX1dX2End +.DivdX1dX2a + sub dx1,dx2 + if dx1>32011 then DivdX1dX2End + add dx3,c1 + goto DivdX1dX2a + +.DivdX1dX2End + dx1=dx3 + return +;---- + cif Editor +.ExtractMap +; extract map from the "generated" raster object dv1 +push ObjectNumber + ObjectNUmber=dv1 + gosub @FindAndDecode +pop ObjectNumber + + dv1=4 + add dv1,header ; read ptr within StructureBuffer() + dv3=size + add dv3,header ; dv3=end ptr within StructureBuffer() + dv2=0 ; write ptr within Map() +.EMLoop + &dx1=StructureBuffer(dv1) + dx6=15 + dx5=15 + dx4=15 + dx3=15 + and dx6,dx1 + asr dx1 + asr dx1 + asr dx1 + asr dx1 + and dx5,dx1 + asr dx1 + asr dx1 + asr dx1 + asr dx1 + and dx4,dx1 + asr dx1 + asr dx1 + asr dx1 + asr dx1 + and dx3,dx1 +; now dx3,dx4,dx5,dx6 are leftmost..rightmost cells within +; this block + if dv2>1000 then @EMExit + &Map(dv2)=dx3 + add dv2,c2 + &Map(dv2)=dx4 + add dv2,c2 + &Map(dv2)=dx5 + add dv2,c2 + &Map(dv2)=dx6 + add dv2,c2 + add dv1,c2 + if dv1ACBlistSize then @SASBug ;****** + &ACBList(dx1)=dv3 + add dx1,c2 + &ACBList(dx1)=dv4 + +cif LinkedForks + dx1=LinkNextOffset + add dx1,ACBHeader + &dx1=ACBList(dx1) ; either 0, or the acb we're linking to this + if dx1=0 then @ShiftNotLinked + if LinkNextShift=0 then @ShiftNotLinked ; object 16381 done recently +; a linked object - do the shift for that as well + push ACBHeader +; don't need to save dv2-dv4 as we jump back to DisplayACB +; after this. + ACBHeader=dx1 + add dx1,c4 ; skip parent num+SP + &dv2=ACBList(dx1) + add dx1,c2 + &dv3=ACBList(dx1) + add dx1,c2 + &dv4=ACBList(dx1) + add dx1,c2 + gosub @DoShift1 ; recurse + pop ACBHeader +.ShiftNotLinked + LinkNextShift=1 ; next shift will be linked +cend ; LinkedForks + + return +;----- +.vKillACBHeader + push ACBHeader + gosub @SpecialACBKilled + dx1=32767 ; mark this acb as being killed, but not yet available + + &ACBList(ACBHeader)=dx1 +; dx1=2 +; add dx1,ACBHeader +; &ACBList(dx1)=c0 ; kill SP as well, just in case acb is reanimated + +cif LinkedForks + dx1=LinkNextOffset + add dx1,ACBHeader + &ACBHeader=ACBList(dx1) ; either 0, or the acb we're linking to this + if dx1>ACBListSize then @SASBug ;******* + &ACBList(dx1)=c0 ; kill pointer to child + if ACBHeader=0 then KACH1 + gosub @KillACBHeader ; recurse +cend + +.KACH1 + pop ACBHeader + return +;----- diff --git a/l9dev/regress/games.l9/billy.l9/duel.txt b/l9dev/regress/games.l9/billy.l9/duel.txt new file mode 100644 index 0000000..ada237b --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/duel.txt @@ -0,0 +1,207 @@ +;--------------------------Duel Code -----------------------------; + begin + +.Duel +.Theduel + if GameOverTimer=0 then DuelNotEnding + sub GameOverTimer,c1 + if GameOverTimer=0 then @DuelGameOver + +.DuelNotEnding +; in case the initialisation wait went wrong, keep sending +; signal that the duel has started + v1=CommsDuelReady + gosub @SendPadding ; send v1 several times because receiver waits till +; several bytes have been received before processing them + + gosub @sGetControls + if duelstatus<4 then notfourthstage ;<> Mike 19 dec 90 + if duelStatus>6 then NotFourthStage ; started to die. +;duelstatus=4 is in process of draw + gosub @fourthstage +;; goto duelend + +.NotFourthStage + if duelstatus<>7 then notdying + dx4=fighteracb + if playergundrawn<>0 then gunfall + v1=0 + gosub @PlaySample + objectnumber=6 + add ObjectNumber,DuelPlayerBase ; 3756 + goto setupdyingplayer +.GunFall + objectnumber=4 + add ObjectNumber,DuelPlayerBase ; 3754 +.SetupDyingPLayer + Won=false + gosub @changeacbdx4 + GameOverTimer=20 ; time till we terminate + duelstatus=8 + +.NotDying + if duelstatus<>3 then notthirdstage + gosub @thirdstage + goto duelend + +;duelstatus=2 is waiting for bell + +.NotThirdStage +; if duelstatus<>1 then notsecondstage +; gosub @secondstage ; press fire to set up bell +; goto duelend +; +;.NotSecondStage ; look for draw (up key) + if duelstatus<>0 then notfirststage + gosub @setupfigures ; set up duel figures + gosub @SecondStage ; set up delayed bell + v4=DuelSamples + gosub @LoadSamplesForGame +; if TwoPlayerMode=false then NotInitTwoPlayerDuel +; if EnemyName>2 then NotInitTwoPlayerDuel +; if EnemyName<1 then NotInitTwoPlayerDuel +; gosub @InitTwoPlayerDuel + + +.NotInitTwoPlayerDuel +.NotFirststage +.duelend + return +;---------------- +.DuelGameOver + if Won=false then LoseDuel + + if EnemyName<>255 then @WinGame ; won final conflict + + m1=PlayersName + m2=101 ; win duel + gosub @DisplayInstructionsM1M2 + add PlayerReputation,c16 + PlayingDuel=0 + DuelStatus=0 + goto @BackToWalkabout ; ReturnToMap + +.LoseDuel + if EnemyName<>255 then @LoseGame ; lose final conflict + m1=PlayersName + m2=102 ; lose duel + gosub @DisplayInstructionsM1M2 + gosub @DisplayNursingPicture + PlayingDuel=0 + DuelStatus=0 + goto @ReturnToMap + +;--------------- +.SetupFigures + objectnumber=0 + add ObjectNumber,DuelOpponentBase ; 3700 + dv2=opponentx + dv3=opponentz + dv4=opponenth + dv5=1 + dv6=0 + gosub @StartFreeACB + enemyacb=dx4 + + objectnumber=0 + add ObjectNumber,DuelPlayerBase ; 3750 + dv2=Startplayerx + dv3=Startplayerz + dv4=startplayerh + dv5=1 + dv6=0 + gosub @StartFreeACB + fighteracb=dx4 + duelstatus=1 + CrossHairACB=0 ; ensure cross hair is not visible + EnemyStatus=0 ; enemy not killed yet + + if TwoPlayerMode=false then SUFigRet + if EnemyName=Billy then SUFWait + if EnemyName<>Pat then SUFigRet +; two-player mode, final duel. Wait for other computer +; to be ready. +.SUFWait + v2=3 ; send ready byte this many times + +.SUFWait2 + v1=CommsDuelReady + gosub @SendPadding ; send v1 several times because receiver waits till +; several bytes have been received before processing them + if v1<>CommsDuelReady then SUFWait +; read again, to make sure it's not just a stray byte... + gosub @ReadSerial + if v1<>CommsDuelReady then SUFWait + +.SUFigRet + return +;------------ +.secondstage +;;if fire key pressed, then setup bell ring +; if FireKey=0 then NoStart +; if FireKeyChange=0 then NoStart +; then setup bell to ring after a delay + x1=32 + objectnumber=bellani + dv1=objectnumber + dv2=Startplayerx + dv3=Startplayerz + dv4=startplayerh + add dv4,x1 + x1=16 + add dv4,x1 + add dv2,x1 + dv5=1 + dv6=0 + gosub @StartFreeACB + duelstatus=2 + +.NoStart + return +;---------- +.ThirdStage + if UpKey<>0 then ThirdS2 + if FireKey=0 then @nodraw + if FireKeyChange=0 then @NoDraw + v1=0 + gosub @PlaySample + +.ThirdS2 + if EnemyName=255 then TSDontNotify + v1=CommsIveDrawn + gosub @SendPadding ; send v1 several times because receiver waits till +; several bytes have been received before processing them + +.TSDontNotify + duelstatus=4 + if CrossHairACB<>0 then NoDraw + ObjectNumber=1 + add ObjectNumber,DuelPlayerBase ; 3751 ;draw + dx4=fighterACB + gosub @ChangeACBdx4 + playergundrawn=1 + Rasteroffset=0 + objectnumber=crosshairani + dv1=objectnumber + dv2=startcrossx + dv3=startcrossz + dv4=startcrossh + dv5=1 + dv6=0 + gosub @startfreeacb + crosshairacb=dx4 + +.Nodraw + return +;------------ +.FourthStage + dx4=crosshairacb + gosub @readacbdx4 + cursorx=dv2 + cursory=dv3 + sub cursory,dv4 + + gosub @checkcursor + return + +;---------------------------end duel code -------------------------; diff --git a/l9dev/regress/games.l9/billy.l9/exit.txt b/l9dev/regress/games.l9/billy.l9/exit.txt new file mode 100644 index 0000000..8463fd1 --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/exit.txt @@ -0,0 +1,583 @@ +; Dummy Exits File for Hero +; +; EXIT.TXT, data for the game exits. The numeric values for the +; directions is as follows: +; +; 1 up=9 in=11 cross=13 climb=14 jump=15 +; 8 2 down=10 +; ! +; 7 --+-- 3 +; ! +; 6 4 +; 5 +; +; Room 1 - Santa Fe Undertaker +1000 0 0 + +; Room 2 - bank +1000 0 0 + +; Room 3 - bank +1000 0 0 + +; Room 4 - bank +1000 0 0 + +; Room 5 - Santa Fe Wire Office +1000 0 0 + +; Room 6 - bank +1000 0 0 + +; Room 7 +1000 0 0 + +; Room 8 - Santa Fe News Office +1000 0 0 + +; Room 9 +1000 0 0 + +; Room 10 +1000 0 0 + +; Room 11 +1000 0 0 + +; Room 12 - Santa Fe Bank +1000 0 0 + +; Room 13 +1000 0 0 + +; Room 14 +1000 0 0 + +; Room 15 +1000 0 0 + +; Room 16 +1000 0 0 + +; Room 17 +1000 0 0 + +; Room 18 +1000 0 0 + +; Room 19 +1000 0 0 + +; Room 20 +1000 0 0 + +; Room 21 +1000 0 0 + +; Room 22 +1000 0 0 + +; Room 23 +1000 0 0 + +; Room 24 +1000 0 0 + +; Room 25 +1000 0 0 + +; Room 26 +1000 0 0 + +; Room 27 +1000 0 0 + +; Room 28 +1000 0 0 + +; Room 29 +1000 0 0 + +; room 30 - Santa Fe +0001 1 1 ; to undertaker +0001 2 5 ; to wire +1001 3 31 ; to street + +; room 31 - Santa Fe +0001 5 36 ; to other street +0001 1 8 ; to news +0001 2 64 ; to store +1001 3 32 ; to street + +; room 32 - Santa Fe +0001 1 12 ; to bank +1001 3 33 ; to street + +; room 33 - Santa Fe +0001 1 160 ; to saloon +0001 2 0 ; to train station +1001 3 34 ; to street + +; room 34 - Santa Fe +0001 1 80 ; to jail Sheriff's office +0000 5 38 ; south to other street +1001 2 65 ; to store + +; room 35 - Santa Fe (Street 2) +0001 1 171 ; to saloon +1001 3 36 ; to street + +; room 36 - Santa Fe +0001 2 190 ; to courthouse CLOSED +1001 3 37 ; to street + +; room 37 - Santa Fe +0001 1 190 ; CLOSED +0001 2 190 ; CLOSED +1001 3 38 ; to street + +; room 38 - Santa Fe +0001 1 190 ; to other street +0001 2 34 ; to other street +1001 3 39 ; to street + +; room 39 - Santa Fe +1001 1 19 ; to livery stables + +; 40 +1000 0 0 + +; 41 +1000 0 0 +; 42 +1000 0 0 +; 43 +1000 0 0 +; 44 +1000 0 0 +; 45 +1000 0 0 +; 46 +1000 0 0 +; 47 +1000 0 0 +; 48 +1000 0 0 +; 49 +1000 0 0 + +; 50 - El Paso +0001 3 51 +0001 1 168 ; to saloon +1001 2 24 ; to doctors + +; 51 +0001 3 52 +0000 2 55 ; NE goes to other street +1001 1 66 ; to hotel + +; 52 +0001 3 53 +1001 1 13 ; to bank + +; 53 +0001 3 54 +0001 1 6 ; to telegraph office +1001 2 56 ; to other street + +; 54 +1001 1 20 ; to stable + +; 55 El Paso second street. +0001 3 56 +0000 5 51 ; south goes back to southern street +0001 1 167 ; to saloon +1001 2 60 ; to store + +; 56 +0001 3 57 +0001 2 81 ; to sheriff's office +0001 7 55 ; west to saloon/store +0000 5 53 ; south goes back to southern street +1001 1 9 ; to El Paso Sun + +; 57 +1001 1 2 ; to Undertakers + +; 58 +1000 0 0 + +; 59 unused +1000 0 0 + +; 60 store +1000 0 0 + +; 61 +1000 0 0 + +; 62 +1000 0 0 + +; 63 +1000 0 0 + +; 64 Store +1000 0 0 + +; 65 store Zang's (Santa Fe) +1000 0 0 + +; 66 hotel +1000 0 0 + +; 67 Not USED +1000 0 0 + +; 68 +1000 0 0 + +; 69 +1000 0 0 + +; 70 Roswell. +0001 3 71 +1001 1 82 ; to Sheriff's office + +; 71 +0001 3 72 +1001 1 3 ; to undertakers + +; 72 +0001 3 73 +0001 2 61 ; to hardware store +1001 1 173 ; 67 ; to hotel + +; 73 +0001 1 190 ; CLOSED. to post office +1000 0 0 + +; 74 +1000 0 0 + +; 75 +1000 0 0 + +; 76 +1000 0 0 + +; 77 +1000 0 0 + +; 78 +1000 0 0 + +; 79 +1000 0 0 + +; 80 Sheriff's Office (Santa Fe) +1000 0 0 + +; 81 Sheriff's Office (El Paso) +1000 0 0 + +; 82 Sheriff's Office (Roswell) +1000 0 0 + +; 83 Sheriff's Office (Lincoln City) +1000 0 0 + +; 84 Sheriff's Office (Mesilla) +1000 0 0 + +; 85 Sheriff's Office (White Oaks) +1000 0 0 + +; 86 +1000 0 0 + +; 87 +1000 0 0 + +; 88 +1000 0 0 + +; 89 +1000 0 0 + +; 90 +1000 0 0 + +; 91 +1000 0 0 + +; 92 +1000 0 0 + +; 93 +1000 0 0 + +; 94 +1000 0 0 + +; 95 +1000 0 0 + +; 96 +1000 0 0 + +; 97 +1000 0 0 + +; 98 +1000 0 0 + +; 99 +1000 0 0 + +; 100 Lincoln City +0001 7 21 ; to corral / Torreon? +0001 3 101 +1001 1 165 ; to saloon + +; 101 +0001 3 102 +1001 1 62 ; to store + +; 102 +0001 3 103 ; east along street +1001 1 83 ; to sheriff's office + +; 103 +0001 3 104 +1001 1 15 ; to bank + +; 104 +0001 3 105 +1001 1 69 ; to house + +; 105 +1000 1 190 ; CLOSED to courts/jail + +; 106 +1000 0 0 + +; 107 +1000 0 0 + +; 108 +1000 0 0 + +; 109 +1000 0 0 + +; 110 +1000 0 0 + +; 111 +1000 0 0 + +; 112 +1000 0 0 + +; 113 +1000 0 0 + +; 114 +1000 0 0 + +; 115 +1000 0 0 + +; 116 +1000 0 0 + +; 117 +1000 0 0 + +; 118 +1000 0 0 + +; 119 +1000 0 0 + +; 120 +1000 0 0 + +; 121 Mesilla +;; 0001 7 120 ; west to empty desert +0001 3 122 +1001 1 25 ; doctor's + +; 122 +0001 3 123 +1001 1 16 ; to bank + +; 123 +0001 3 124 +0000 2 191 ; NE goes to nowhere +1001 1 169 ; saloon + +; 124 +0000 2 191 ; goes nowhere +1001 1 190 ; CLOSED + +; 125 +1000 0 0 + +; 126 +1000 0 0 + +; 127 +1000 0 0 + +; 128 +1000 0 0 + +; 129 +1000 0 0 + +; 130 +1000 0 0 + +; 131 +1000 0 0 + +; 132 +1000 0 0 + +; 133 +1000 0 0 + +; 134 +1000 0 0 + +; 135 +1000 0 0 + +; 136 +1000 0 0 + +; 137 +1000 0 0 + +; 138 +1000 0 0 + +; 139 +1000 0 0 + +; 140 White Oaks +0001 3 141 +0001 5 142 ; to other street +1001 1 63 ; to store + +; 141 +1001 1 17 ; to bank + +; 142 +0001 3 143 +0000 2 140 ; NE to other street +1001 1 172 ; to saloon + +; 143 +0001 3 144 +1001 1 10 ; to news office + +; 144 +1001 1 22 ; to livery stables + +; 145 +1000 0 0 + +; 146 +1000 0 0 + +; 147 +1000 0 0 + +; 148 +1000 0 0 + +; 149 +1000 0 0 + +; 150 +1000 0 0 + +; 151 +1000 0 0 + +; 152 +1000 0 0 + +; 153 +1000 0 0 + +; 154 +1000 0 0 + +; 155 +1000 0 0 + +; 156 +1000 0 0 + +; 157 +1000 0 0 + +; 158 +1000 0 0 + +; 159 +1000 0 0 + +; 160 ; saloon right (Santa Fe 1) +1001 7 162 + +; 161 +1000 0 0 + +; 162 ; saloon left (Santa Fe 1) +1000 5 33 ; south back to street + +; 163 +1000 0 0 + +; 164 +1000 0 0 + +; 165 ; big single saloon in Lincoln City +1000 0 0 + +; 166 ; left El Paso 1 +1000 5 55 ; south back to street + +; 167 ; right El Paso 1 +1001 7 166 + +; 168 ; single El Paso 2 +1000 0 0 + +; 169 ; single Mesilla +1000 0 0 + +; 170 Left Santa Fe 2 +1000 5 35 ; south back to street + +; 171 Right Santa Fe 2 +1001 7 170 + +; 172 Single White Oaks +1000 0 0 + +; 173 Left Roswell +1001 5 72 ; south back to street + +; 174 Right Roswell +1001 7 173 + +1000 0 0 +0000 0 0 + + diff --git a/l9dev/regress/games.l9/billy.l9/fire.txt b/l9dev/regress/games.l9/billy.l9/fire.txt new file mode 100644 index 0000000..8c578df --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/fire.txt @@ -0,0 +1,937 @@ +begin +;-------------------------------------------------------- +; subroutines to fire gun and check for hits +;-------------------------------------------------------- +.Fire + if CurrentScreen<>GameMap then @FireNotGameMap +; v1=0 ; sample number in current game +; gosub @PlaySample +; if FireKeyChange=0 then @FireNotGameMap + + HorseScreen=0 ; will want to ride into town, if we visit there. +; pointing at a town/ranch etc. ? + gosub @HiresCD + if result=false then @GMNoFire ; no collision +; got it: at HiresTable(x1) ! + asr x1 + asr x1 + asr x1 + asr x1 + if x1=49 then @DisplaySystemMenu + Town=x1 ; standard location number of place to visit +; This will be used by several of the overlays - e.g. +; the scrolling games use it to decide which map number +; to use. + m1=500 + add m1,x1 + + if FireKeyChange=false then @FireNoChangeScreen + if TextBoxDisplayed=false then @FireNoChangeScreen +; Text box is already displayed, so must have pressed fire key again. + + push x1 ; place to visit + gosub @MaybeRandomMeeting + gosub @PutUpHourglass + pop x1 ; place to visit + + NextMeetingMenu=0 +; NextMeetingMessage=0 ; quick messages from player's second (Tom O'Foliard +;; or Barney Mason for Pat) + + MenuNumber=0 ; no 'forced' menu entry + m1=0 ; no 'forced' message - comes before first menu + gosub @CheckSubPlotVisits ; check any events which happen +; when visiting a place: returns m1 and menunumber +; non-zero if either is to be used. + if m1=0 then VisitNoText + push x1 + gosub @DisplayInstructions + m1=0 + pop x1 + +.VisitNoText +; This is the request to 'visit' the town whose box is displayed. +; Work out what screen change this requires, if any + &x2=ObjectTable(10) ; table giving screen numbers + add x2,x1 ; double byte-based table + add x2,x1 + v1=ObjectTable(x2) ; overlay letter to switch to. + add x2,c1 + v4=ObjectTable(x2) ; screen number within overlay. + + + if x1<10 then @FireStealCows ; cows + if x1<19 then @FireVisitPlace ; town + +; hide certain places when you visit them - because they have +; one-shot subplots. Mark in "hidden" table + if x1<31 then FVPNotHide + if x1>33 then FVPNotHide + dx1=SPHiddenOffset + add dx1,SubplotsOffset + &dx1=TownVarData(dx1) + add dx1,x1 + if dx1>TownVarDataSize then @TVD2Bug ;****** + TownVarData(dx1)=c1 + +.FVPNotHide + + Location=x1 + x2=ML ;=200 + add Location,x2 ; set up location to be 200+TOWN - this +; is the same format as used in "PeopleData" and elsewhere. +; (within town, location is the room number) + if x1<24 then @FireVisitPlace ; Fort + if x1<35 then @VisitRanch + if x1<39 then @FireVisitApache + if x1=39 then @TrainCheckGang ; @FireVisitPlace ; FireGotMenuNumber ; train + if x1=40 then @FireVisitPlace ; wagon train + if x1=48 then @FireVisitPlace ; prospector +; visit a gang + + if PlayersName=Pat then @FireVisitPlace ; FireGotMenuNumber +; Billy can go straight there - linking overlay, scene 14 + gosub @MarkGangAsKnown + + MenuNumber=150 ; visit again message: prints message 1858, quits + if x2=0 then FVG2 + MenuNumber=146 +.FVG2 + v4=14 ; cowboy picture (round campfire) + goto @CallLinkingOverlay + +.FireStealCows +; offer player choice of stealing them, or of +; taking them to the indians (If we've started that subplot) + x4=SPFBeefWanted + add x4,SubPlotFlags + x4=TownVarData(x4) + if x4=0 then @FireVisitPlace + if x4>200 then @FireVisitPlace + MenuNumber=138 ; take cows to indians? + +.FireGotMenuNumber + push x1 ; town to visit + push v1 ; overlay that will be needed + push v4 ; scene within overlay + gosub @PrettyMenu + pop v4 + pop v1 + pop x1 + if result=DoNothing then @GMNoFire ; 'do nothing' selected + if result=760 then @FireVisitPlace ; steal cows + if result<>164 then @FireNotTakeCowsToIndians + push v1 + v1=SPFBeefWanted + add v1,SubPlotFlags + v2=10 ; flag for taking cows to indians (read by SCROLL.TXT) + gosub @UpdateVarDataByte + pop v1 + goto @FireVisitPlace +;---------------- +.TVD2Bug ;****** + break ;****** + return ;******* +.FireVisitApache +; get Buckshot Roberts encounter? + if PlayersName<>Billy then @FireVisitPlace + x1=SPFBuckShotRoberts ; Billy ambushed by Buckshot? + add x1,SubPlotFlags + v2=TownVarData(x1) + if v2<>0 then @FireVisitPlace ; already happened + v1=x1 + v2=1 + gosub @UpdateVarDataByte ; being ambushed right now! + M1=1640 ; Buckshot roberts ambush + gosub @DisplayInstructions + Location=260 ; special code for Buckshot ambush + goto @SubPlotShootout + +; +;--------------- +.FireVisitPlaceM1M2 + push v1 + push v4 + gosub @DisplayInstructionsM1M2 + pop v4 + pop v1 + +.FireNotTakeCowsToIndians +.FireVisitPlace + PlayingDuel=false ; reset when ride into town, just in case. + if v4=0 then @FireNoChangeScreen + if v1<>CurrentAcode then NewScreenDifferentAcode ;'e' - town overlay + NewScreen=v4 + x1=400 ; base for rooms + add NewScreen,x1 + gosub @OpenTownStructures ; in case random sequence removed them. + return ; back to caller - will switch screen to visit town. + +.NewScreenDifferentAcode + if v1=52 then @FireGotoLinking ; to intermission screen + gosub @CallOverlayV1 ; call overlay, clearing sprites etc. as necessary. +.NSDARet + return +;---------------- +.TrainCheckGang + m1=0 + m2=26 ; instructions for Pat (do not mention robbery) + if PlayersName<>Billy then @FireVisitPlaceM1M2 + m1=25 ; train instructions +; gosub @CheckPlayerGang + if PlayerGang<>0 then @FireVisitPlaceM1M2 + m1=859 ; Billy did not have a gang + gosub @DisplayInstructions ; gosub, return + goto @ReturnToMap +;-=--------- +.CallLinkingOverlay +; goto a linking screen - involves a structure and sprites file +; switch +; dc.w LinkingSprites-IntroTables ; offset 70 +; dc.w LinkingStructures-IntroTables ; offset 72 +; dc.w IntroSprites-IntroTables ; offset 74 +; dc.w IntroStructures-IntroTables ; offset 76 +; Screen we want in linking screen is number v4 + PersonNumber=0 ; remove any person we may have been talking +; to beforehand +; Location=0 + +.FireGotoLinking + if v4>19 then FGL2 + if v4>15 then @LinkingPictureWait ; 16..19 are bordello etc., +; so do not have menus +.FGL2 + gosub @MCPurgeAllCells + gosub @OpenLinkingStructures + dv1=v4 ; 1=bank, 2=grave, 3=prospector, 6=fort. + goto @DisplayPlaceAndTalk +;------------ +.CheckSubPlotVisits +; visiting place x1 - should any subplot events happen +; immediately? + code - + v1=SPFAmbushDecision ; cleared whenever go into new town, + add v1,SubPlotFlags + v2=0 + gosub @iUpdateVarDataByte ; clear ambush decision flag + + + v1=SPFSickManOnHorse + add v1,SubPlotFlags + x3=TownVarData(v1) + if x3=0 then CSPV2 + if x3=255 then CSPV2 + v2=255 ; don't do this subplot again + gosub @iUpdateVarDataByte +; sick man is on horse - if going to Santa Fe, get a bonus + m1=1684 ; thanks! + if x1=SantaFe then @CSPVPrint + m1=1685 ; F you + goto @CSPVPrint + +.CSPV2 + + if x1<>Fortsumner then CSPV3 + x2=SPFAccountsRequested ; player been asked to fetch accounts? + add x2,SubPlotFlags + x3=TownVarData(x2) + if x2<>PlayersName then CSPV3 + v1=SPFAccountsGot ; player got accounts from store? + add v1,SubPlotFlags + v2=255 ; have got accounts now - and presented them. So subplot over + gosub @iUpdateVarDataByte ; TVD(V1)=v2 + M1=1516 ; showed the accounts to Colonel Baxter + goto @CSPVPrint + +.CSPV3 +; SPFGangToGrassOnBilly=8 ; gang name which has promised +; to grass on Billy +; SPFTexanPosseeAvailable=10 ; number of members (word) +; SPFFreeDeputies=12 ; number of deputies unallocated (word) +; SPFTrackingBarneysOutlaw=14 ; tracking outlaw suggested by +; Barney Mason +; SPFBeefWanted=16 ; beef asked for by Indian Chief? +; SPFUprisingOffered=18 ; number of uprisings available (word) +; SPFMeetBountyHunter=20 ; meet bounter hunter referred +; to in 1634. Name of town: word + +; SPFCounterfeitOffered=24 ; set when Billy has been offered +; counterfeit money as his share in a robbery. +; SPFMcSweenStage=26 +; SPFJoeGrantMet=28 ; met Joe Grant? + + + +.CSPVPrint ; m1=forced message to print on arrival + code + + return + + +;------------- + code - +;--- +.iDuel + code + + goto @Duel +;----------- + code - +.iSubPlotShootoutNoM1 + m1=0 + m2=0 + +.iSubPlotShootout + code + +.SubPlotShootout +;[110:the homesteader ] ; followed by 115 +;[111:the prospector ] ; followed by 115 +;[112:Mrs McSween ] ; ; followed by 116 +;[115:came up and said "thanks pard, you've +;done me a right big favour and I'll be sure to tell everyone +;about you". ] ;œœœ +;[116:came up and said "thanks old friend. That's +;stopped to the Murphy Dolans, at least for a while". ] + +; if m1=0 then SPS2 +; WantCSTB=true ; preserve last frame of animation +; gosub @DisplayInstructions ; TextBigBox +;.SPS2 + v1=ArcadeAcode + +; 0: facing barn +; 1: facing farmhouse +; 2: facing rocks +; 3: facing chasm +; 4: facing bank/wagon - looking down main road. +; 5: facing grain store + code - + v4=6 ; buckshot roberts + if Location>255 then sps4 ; buckshot special + v4=0 ; shootout 1 - facing farmhouse + if Location>223 then sps3 ; ranches + v4=2 ; shootout facing rocks + if location>199 then sps4 ; only one outside scene + v4=4 ; shootout in town + +.sps3 + random x1 + if x1>127 then sps4 + add v4,c1 ; randomly use 1 of the two shootouts +.sps4 + code + +.sps5 + push v1 + push v4 + gosub @PutUpHourglass + pop v4 + pop v1 + goto @CallOverlayV1 +;------------ +.FireNoChangeScreen + CurrentPrintRaster=3361 ; 3361 is 10x2 print raster + CurrentDO=270 ; also shows 3361: 20x2 print raster + add CurrentDO,x1 ; use display object containing enlarged +; binoculars graphic suitable for this place, plus the text +; box below it. + TextBoxWidth=124 ; 140 + + if x1>16 then FVP1 ; not a town! + if x1<10 then FVP1 ; not a town! + x4=Town + gosub @IsTownLawful ; x2=TVD(x1) non-zero if lawful + m2=0 ; no comment for lawless towns + if x2=0 then FVP1 + m2=1881 ; (lawful) + +.FVP1 + + + + gosub @DisplayTextFunnyBox ; display M1 in CurrentPrintRaster/CurrentDO + m2=0 ; m2 must remain 0 except where it's needed. + PlaceCursorX=Cursorx + PlaceCursorY=CursorY +.GMNoFire + return +;----------- +.CheckPlayerGang +; modify PlayerGang variable if they've been wiped out +; (only matters in two player mode - in single player mode, +; the meeting message handles it) + push x1 + if PlayerGang=0 then CPGEnd + x4=PlayerGang + gosub @IsTownLawful ; x2=TVD(x1) non-zero if lawful + if x2=0 then CPGEnd + x4=PlayerGang + gosub @bringLawToTown +; town x4 has become lawful - so remove it from the map etc. +.CPGEnd + pop x1 + return + +;---------- +.MaybeRandomMeeting +; about 1/3 of the time player goes somewhere, make them meet +; someone at random. The type of information they give will +; normally be the same as from meeting someone in town, +; but occasionally the player will get the intro to a sub-plot. + MenuNumber=NextMeetingMenu + if NextMeetingMenu=0 then MRM1 +.MRM0 +; forced meeting with someone. + NextMeetingMenu=0 + x1=TomOFoliard + if PlayersName=Billy then @MRM4 + x1=BarneyMason + goto @MRM4 + +.MRM1 + code - + random x1 + code + + if x1<230 then MRMNotStatusReport +; Tom O'Foliard tells Billy how he's doing + if Playersname<>Billy then MRMNotStatusReport + gosub @BillyStatusReport + goto @MRMRet + +.MRMNotStatusReport + if x1<200 then @MRMRet + code - + x3=190 ; room number for random meetings + x2=7 ; determines how many people can be met in the wilds + random x1 + code + + + and x1,x2 +.DoSubplotX1 +; is this subplot still available? + v1=x1 + add v1,v1 + add v1,SubPlotFlags + x4=TownVarData(v1) + if x4>0 then @MRMRET ; non-zero means it's in progress, or finished. + +; do we want to forget about this one this time? + code - + random x4 + code + + if x4>80 then @MRMRet + + v2=PlayersName + gosub @UpdateVarDataByte ; make non-available by setting up to +; equal the players name - maybe overwritten later. + + add x3,x1 ; choice of 8 people to meet in the wilds + gosub @WhoIsAtX3 +; gets x1 as person number * 16 for room x3. + if x1=0 then @MRMRet ; no-body there: e.g. that subplot has finished + if x1<912 then MRM4 ; pat or Billy can meet this person 57 + if PlayersName<>Billy then MRM3 + if x1>928 then MRMRet ; 57/58 are Billy Only, others are Pat Only +.MRM3 + if PlayersName<>Pat then MRM4 + if x1<944 then MRMRet ; 59/60 are pat Only, others are Billy only + +.MRM4 + m1=1854 ;[1854:was stopped on the way. He pulled up his horse + push x1 + gosub @ActorM1NoWait + + code - + random x1 + code + +;*** dv1=690 ; gen desert 1(road) in town structure/sprites +;**** if x1>128 then MRM2 + dv1=691 ; gen desert 2(stream) in town structure/sprites +;.MRM2 +; gosub @PreloadAndInsertDV1 +; v1=0 +; v2=0 +; gosub @MCBuildRoom + gosub @BuildPicture ; build picture dv1 + pop x1 + +.MapInterruption +; come here with x1=person number*16, +; and MenuNumber=menu to use, if not their default + push x1 + gosub @OpenIdentikitStructures ; load structure file for identikits + pop x1 ; person offset (Number*16) + + gosub @MaybeForceTalkToPerson ; MenuNumber=menu to force them to have +; (mostly used for talking to Second-In-Command - Foliard or Mason) + if result<1100 then MRMNotBackToMap + if Result<1130 then @ReturnToMap ; sick man in desert etc - +; back to map to give player option of going to a town next + +.MRMNotBackToMap +.MRMRet + return +;------------ +;.DisplayLinkingPicture ;****used? +; gosub @MCPurgeAllCells +; gosub @OpenLinkingStructures +;; gosub @MCEmptyRoom +; dv1=v4 ; 1=bank, 2=grave, 3=prospector, 6=fort. +;; gosub @PreloadAndInsertDV1 +;; gosub @MCBuildRoom +; gosub @BuildPicture +; return +;------------- +;------------- +.HiresCD +; check HiresTable(0..SizeHiresTable) +; for collision with thing at coordinates cursorx,cursory +; Return result=true if found +; and x1=offset in HiresTable + +.HiresCDRange + x1=0 +.FireLoop + PosRange=24 ; was 32 + NegRange=65512 ; -24 was -36 + + &x2=HiresTable(x1) + sub x2,cursorx + gosub AdjustCDSizes + if x2192 then ACS2 ; reduce size of Lincoln City Cd +.ACS1 + PosRange=16 ; normally 24 + NegRange=65520 ; -16 normally -24 + +.ACS2 + if x1<>1344 then ACS3 ; gamblers in saloon? + PosRange=80 + NegRange=65456 ;65504 + +.ACS3 + return +;--------------------------- + + + +.FireNotGameMap + if PlayingDuel=0 then @FireNotDuel + if DuelStatus=0 then @FireNotDuel + if DuelStatus=7 then @FireNotDuel ; player is dying + gosub @farcadeshoot ; gun shot sequence + gosub @fHit ; who got shot sequence + +; move cursor randomly after shot, as if gun jerks back +code - + random x1 +code + + asr x1 + asr x1 + asr x1 + cursorspeed=x1 + dx4=CrossHairACB + gosub @readACBdx4 + add dv4,x1 + if dv4< 201 then fNotOffTop + dv4=200 + +; make sure cursor stays on screen +.fNotOffTop + asr x1 + add dv2,x1 + if dv2<306 then fNotOffSide + dv2=305 +.fNotOffSide + gosub @moveACBdx4 + dx4=0 + +.FireNotDuel + return +;------------ end of main fire calls--------------------- + +;-------------------------------------------------------- +; gun fire sequence +; parameter: currentgun +;-------------------------------------------------------- +.farcadeshoot + dv1=3732 ; fire for Billy in foregroung + if PlayersName=Billy then fas2 + dv1=3752 ;fire +.fas2 + objectnumber=dv1 + dx4=fighteracb + gosub @ChangeACBdx4 + return +;------------------------- end of gunfire sequence-------- + +;--------------------------------------------------------- +; subroutine checks if anyone or anything hit +; parameters: crosshairacb +;--------------------------------------------------------- +.fCheckHit + gosub @fquartercalculation + dx4=CrossHairACB + push dx4 + gosub @ReadACBdx4 + sub dv3,dv4 + add dv3,c8 + add dv2,c8 + if dv2PositionX then fMiss + if dv3>PositionY then fMiss + sub dv3,c8 + sub dv2,c8 + add dv3,dv4 + pop dx4 + Hit=1 + dx4=0 + Return + +.fMiss ; didn't hit anything + sub dv3,c8 + sub dv2,c8 + add dv3,dv4 + pop dx4 + Hit=0 + dx4=0 + return +;-----------------------end of hit checking--------- + + +;--------------------------------------------------- +;calculate 3/4 of the area of the sprite hit, as 'HIT ZONE' +;--------------------------------------------------- +.fThreeQuarterCalc + add Length,Length; 1/2 in. + add PositionX,Length; 3/4 in + add Height,Height ; + add PositionY,Height; + return + +.fQuarterCalculation; + add Height,Height;1/8 height + add Height,Height; 1/4 height + push Height + add length,length; 1/8 length + add length,length; 1/4 length + push length + add PositionX,length + add PositionY,Height + pop Length + pop Height + return +;------------------end of two routines for area calculation + + +;---------------------------------------------------------- +; Okay, so who got hit ??? +;---------------------------------------------------------- +.fHit +; hit opponent in Duel? + Hit=0 + if enemystatus=2 then @fnotpat + dx4 =enemyacb + ACBHeader=dx4 + push dx4 + gosub @fFindPosition + pop dx4 + If Hit=0 then @fNotpat + dv1=3707 ; dying unnamed bandit + if EnemyName=255 then InsertDead ; =Pat, Billy or $ff for other + + + if PlayersName=Pat then otherDead ; if enemystatus<>0 then otherdead + dv1=3701 ;dying pat + goto insertdead +.otherdead ; Billy dies + dv1=3681 ; animation sequence for small Billy dying +.insertdead + objectnumber=dv1 +; gosub @changeacbdx4 + dx4=EnemyACB + gosub @ReadACBDx4 + push ObjectNumber + ACBHeader=EnemyACB + gosub @KillACBHeader + pop ObjectNumber + gosub @StartFreeACB + EnemyACB=dx4 + if EnemyName=255 then DontNotifyTwoPlayer + v1=CommsIveShotYou + gosub @WriteSerial + +.DontNotifyTwoPlayer +;** dv2=opponentx +;** dv3=opponentz +;** dv4=opponenth +;** gosub @moveacbdx4 + enemystatus=2 + Won=true + GameOverTimer=20 ; time till game terminates +.fnotpat +return + +;------------- end of people hit routines + +;------------------- nobody hit + +; parameters: acbheader,dv1 +.fFindPosition + dx4=ACBHeader + gosub @ReadACBdx4 + PositionX=dv2 + PositionY=dv3 + sub PositionY,dv4 + x1=62 + add x1,dx4 + &dv1=ACBList(x1) + xsize=2 ; cells wide + ysize=4 ; cells high + if dv1<50 then ffindGotSize ; xzh object: little outlaw for dueel + objectnumber= dv1 + gosub @FindAndDecode +.ffindGotSize + Height=ysize + Length=xsize + gosub @fCheckHit + return +;----------------------------------------- + + +;-------------------------------------------- +; find x and y coordinates for an object +.fGetCoords + dx4=ACBHeader + gosub @ReadACBdx4 + PositionX=dv2 + PositionY=dv3 + sub PositionY,dv4 +.OTSSRet + return +;-------------------------------------------- +.OpenTownStructures + BackgroundColour=1 ; white (changed in some strange places, +; like card game) + if StructureFile=TownStructures then OTSSRet + gosub @LoadStructures + + cif pc + gosub @SetCGAPalettes + gosub @SetPreloadPalettes + cend + + + if StructureFile=IdentikitStructures then OTS2 +; identikits, town structure file share the same sprites file + v1=IntroTablesList + &v2=IntroTables(34) ; map/town sprites filename + v3=1 ; 0=purge, 1=don't purge + gosub @MCOpenSpriteFile + gosub @MCPurgeAllCells + +.OTS2 + StructureFile=TownStructures + goto @InitACBs ; gosub, return +;--------- +.VisitRanch +; visit a ranch x1 (24..30) - will a shootout happen here, or +; do we just talk to someone? + + push x1 +; Has town gone bust, If it's a Murphy Dolan one? + x4=x1 ; object number for ranch (24..30, 29=Tunstall Ranch(McSween)) + gosub @GetLocationData ; returns x2=TVD(x1) where x1=position in ObjectsInfo +; x2=0 if not gone bust... yet! + pop x1 ; number of ranch to visit (24..30) + + push x2 ; decision on bust or not + gosub @OpenArcadeStructures + code - + random x1 + code + + CurrentScreen=0 ; disable scroll decision code, etc. + dv1=630 ; ranch picture, no outlaws + if x1<128 then VR2 + dv1=631 ; alternate ranch picture, no outlaws +.VR2 + pop x2 ; decision on bust or not + if x2=0 then VR3 ; not gone bust yet - get to see Murphy Dolan, +; or Mrs McSween, if there... + +; Has gone bust, so display picture and "Mysteriously deserted message" + + + gosub @BuildPicture + m1=1882 ; mysteriously deserted + gosub @DisplayInstructions + goto @ReturnToMap + + +.VR3 +.DisplayPlaceAndTalk +; display place dv1, talk to person at LOCATION + gosub @BuildPicture + x3=Location ; place we're visiting + gosub @WhoIsAtX3 +; gets x1 as person number * 16 for room x3. + if x1=0 then DPAT2 ; nobody there, so do animation. + push x1 ; person number + WantCSTB=true ; do one frame of animation (to put up e.g. +; sails on windmill + gosub @DisplayEverything + gosub @OpenIdentikitStructures ; load structure file for identikits + pop x1 + +.DPAT2 + push MenuNumber + gosub @MaybeForceTalkToPerson ; changed to this for Gang visits. + pop MenuNumber + if MenuNumber<>150 then DPATNotStatusReport + gosub @BillyStatusReport + +.DPATNotStatusReport + goto @ReturnToMap +;-------------- +.MarkGangAsKnown +; gang x1 (41..46) have been visited by player - so +; make people tell player about another gang next time +; he pumps them for information +; Returns x2 as zero if had already visited this gang + x2=41 ; 41=first gang + sub x1,x2 ; x1=gang number 0..5 + add x1,x1 ; get offset from SubPlot tables in TownVarData + add x1,x1 + add x1,x1 + add x1,x1 ; 8 words per entry in TVD + + x4=4 ; offset of gangs + add x4,SubPlotsOffset + &x4=TownVarData(x4) ; x4 is now start of subplot data word pairs + add x4,x1 ; add on gang + &x2=TownVarData(x4) ; returns zero if already known about + &TownVarData(x4)=c0 ; nothing more to know about this gang now. + return +;---------- +.ToCardGame +; Location=PlayersName ; do not acknowledge requests for Duel +;; in two-player game + gosub @PutUpHourglass + NextMusic=CardMusic + v1=ArcadeAcode + v4=CardGameScreen + goto @FireVisitPlace +;------------ +.ToBrawlGame +; Location=PlayersName ; do not acknowledge requests for Duel +;; in two-player game + gosub @FreezeAndPutUpHourglass + + v4=BrawlScreen + v1=ArcadeAcode ; '3' + gosub @FireVisitPlace + goto @BackToWalkabout ; in case we get back here, which is unlikely +;---------------- +.ToTrackingGame + gosub @PutUpHourglass + + NextMusic=102 ; getaway music + gosub @PlayTuneForScene + v4=TrackingGame + goto @CallScrollingOverlay ; to getaway game. Was goto @BackToWalkabout +;------------ +.ToRustlingGame + gosub @PutUpHourglass + + gosub @PlayTuneForScene + v4=RustlingGame + goto @CallScrollingOverlay ; to getaway game. Was goto @BackToWalkabout +;------------ +.ToEscapeGame + gosub @PutUpHourglass + + + NextMusic=102 ; getaway music + gosub @PlayTuneForScene + + gosub @MCPurgeAllCells ; purge cells from linking picture. + v4=EscapeGame + goto @CallScrollingOverlay ; to getaway game. Was goto @BackToWalkabout +;--------------- +.DisplaySystemMenu +; come here when select system icon on map + MenuNumber=274 ; system menu + gosub @PrettyMenu + if result=68 then SaveGame ; 668-MM,MDoIt+668-MM * save game + if result=69 then RestoreGame ; dc.w 669-MM,MDoIt+669-MM * restore + if result=70 then @RestartGame ; dc.w 670-MM,MDoIt+670-MM * restart + return +;-------- +.SaveGame + gosub @PutUpHourglass + + &v1=IntroTables(2) ; offset of filename within IntroTables +; from IntroTables(v1) to list17(8) + gosub @CopyFilename + + v1=0 ; (list0 is var table start). TownVarDataList ;=7 (list to save) + v2=0 ; offset within list + v5=0 ; high length + v6=1024 ; save variables (up to 512 of them) + gosub @MCSaveFile ; address: ListV1(V2), length is v5(hi),v6(lo), + + + x1=66 ; 'Billy.sav' -> 'Billy.SAB' + list17(16)=x1 + v1=17 ; save list 17 onwards + v6=18000 ; Various things... including... +; TownVarDataSize=10000 ; space allocated for it + gosub @MCSaveFile ; address: ListV1(V2), length is v5(hi),v6(lo), + return +;------- +.RestoreGame + gosub @PutUpHourglass + &v1=IntroTables(2) ; offset of filename within IntroTables +; from IntroTables(v1) to list17(8) + gosub @CopyFilename + + push SmoothScroller ; system option, nothing to do with save file. + v1=0 ; (list0 is var table start). TownVarDataList ;=7 (list to save) + v2=0 ; offset within list + gosub @MCLoadFile ; address: ListV1(V2), + + x1=66 ; 'Billy.sav' -> 'Billy.SAB' + list17(16)=x1 + v1=17 ; list17 is where most of the data is + v2=0 ; offset within list + gosub @MCLoadFile ; address: ListV1(V2), + pop SmoothScroller + +; re-initialise the floor maps which appear to get trashed by +; restore. + gosub @InitFloors + gosub @FCInitFloorCache + goto @ReturnToMap ; build map etc. return +;------- diff --git a/l9dev/regress/games.l9/billy.l9/firstvar.txt b/l9dev/regress/games.l9/billy.l9/firstvar.txt new file mode 100644 index 0000000..a5786f2 --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/firstvar.txt @@ -0,0 +1,6 @@ +var + V1 ; must be first var + V2 ; must be second var + v3 v4 v5 v6 v7 ; etc.. +;; v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 + x1 x2 x3 x4 x5 x6 x7 x8 diff --git a/l9dev/regress/games.l9/billy.l9/floors.txt b/l9dev/regress/games.l9/billy.l9/floors.txt new file mode 100644 index 0000000..ea2e228 --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/floors.txt @@ -0,0 +1,120 @@ +; FloorMap interface code... +; +const + BadRoomOK=1 ;must be 1 for game + +;;table +;; FloorMap=16 ;transient stuff for init + +begin +.InitFloors +code - + MarginZ=0 + FSizeZ=0 + MarginX=0 + FSizeX=0 + RoomNum=0 + CursorZ=64 + CursorX=0 + CursorH=64 + CurrentCache=0 + MapNumber=0 + v1=220 ; table size +code + + return ; *********** goto @FCinitFloorCache + +.LMBug ;****** + break ;****** + return ;****** +;--- +;.ChangeACBdx4 +; goto @AlterACB +; dv5=1 ; display as a sprite. +; dv6=1 ; 0=non-reversed, 1=LR reversed +; push dx4 +; gosub @FindObjectNumber +; gosub @DecodeHeader +; pop dx4 +; dv1=ObjectNumber +; gosub @KillACBHeaderVEC +; object=actor +; gosub @CalcRasterOffsetObjectV +; goto @SUAChangeACB +;--- +code - +.LoadMap + gosub @SetFileName +code + + if CurrentCache>4000 then @LMBug ;********** + &FloorMap(CurrentCache)=c0 +code - + v1=FloorMapList + v2=CurrentCache ;offset +code + + if v2>4000 then @LMBug ;********** + gosub @MCloadFile +code - +; GMJ 06/07/90 Modified=0 + return +;--- +.SetFileName + v1=70 ;'f' + list17(8)=v1 + v1=76 ;'l' + list17(9)=v1 + v1=79 ;'o' + list17(10)=v1 + v1=79 ;'o' + list17(11)=v1 + v1=82 ;'r' + list17(12)=v1 + list17(13)=MapNumber + v1=46 ;'.' + list17(14)=v1 + v1=68 ;'d' + list17(15)=v1 + v1=65 ;'a' + list17(16)=v1 + v1=84 ;'t' + list17(17)=v1 + list17(18)=c0 ; put a terminator on, for benefit of Amiga etc. + return +;--- +;RoomNum is XZH number of room +;returns RoomNum=0, CurrentRoom=terminator word if no floor map +; CurrentRoom=FloorData +; +.FindRoom + CurrentRoom=CurrentCache +.FR1 +code + + &v1=FloorMap(CurrentRoom) +code - + if v1=RoomNum then Found + if v1=0 then @EOF + add CurrentRoom,c2 +code + + &v2=FloorMap(CurrentRoom) ;Structure length-2 +code - + add CurrentRoom,v2 + goto FR1 +; +.Found + add CurrentRoom,c4 +code + + &MarginX=FloorMap(CurrentRoom) + add CurrentRoom,c2 + &MarginZ=FloorMap(CurrentRoom) + add CurrentRoom,c2 + &FSizeX=FloorMap(CurrentRoom) + add CurrentRoom,c2 + &FSizeZ=FloorMap(CurrentRoom) +code - + add CurrentRoom,c2 + return +; +.EOF + RoomNum=0 + return +code + +;--- diff --git a/l9dev/regress/games.l9/billy.l9/fontbbc.txt b/l9dev/regress/games.l9/billy.l9/fontbbc.txt new file mode 100644 index 0000000000000000000000000000000000000000..1a150d0772b6da6edcaf40aff4b63bda2fd2a0bc GIT binary patch literal 1293 zcmZ8gJ!lhQ7`{8Lv9@obHcdN-eobn*Yf`+s)|f^=XmV-9O3q?alXeiIIc*@lKzjax zLsbxw`ZI__2XW{i4i4gwK^z>!K~Mw*MMd$aA}A^y#6f+(Ywy}R<$Iny_q_itYq-xr zy?+l$m&%4&7&l08d%7JO{9K-16w~bzv~T2Q^He5N<~-3WLgz6 zZj4u|CxQ?-&b=X-&0q(^YPcXjP+N8JJL^XjGx?Iwq5=mMoSGYtTGTFqvX$ z;$RSbH@Tm=V<<301#|G-abdTLUAwmghLc?h3=C@@azB$;R9RHyh%ABkDdKqxhF&d0 zpInr{|Gv8@iRibBG<03bJ1(g%jNds8e}g~iS^?B_F7j_Xv0`Y~Rk+LjnJR(Up; z1gRy#dlKJ6RIZU!mkQpqh=v)`x)j)WnST}&w1P-T#p>ozvXqRhZSi4 z!p{<&_T$-L1@R2cAnBPyeHPmO{8zZW=@W~k*RK{HheqfCG_DuidSQdWYO*7Nr$b;) zt7YK@3CU0w7v6#|CA@ZaX%t7M+xk&*3bz})`2}=_p}GUYJMfiJzpyw=e{`8*5*2ID zGle~9J%W-AS1_G@RH^B4mWnt^n45&lzYprJ;RlU3gx7Y@Q0%`g%o3DL5yc;=AllSoundSpace then @LSFBug ;*** + &samples(v5)=c0 ; null pointer if not loaded + if v1=0 then @LSFGRet ; not loaded. + +; for PC and Amiga, do a translate stage on the sample + push v1 + push v4 + push v5 + push v6 + v6=v1 ; length + v1=SamplesListNumber + v3=7500 ; frequency in hertz + v4=255 ; volume + v5=5 ; translate + gosub @MCDigitise +; V5=5 Translate Sample (V1,V2 = sample, V6 = length, +; V3=Frequncy, V4=Volume) + pop v6 + pop v5 + pop v4 + pop v1 + + if v5>AllSoundSpace then LSFBug ;*** + &Samples(v5)=v6 ; offset pointer + add v5,c2 + &Samples(v5)=v1 ; length + add v5,c2 + &Samples(v5)=c0 + add v5,c2 + &Samples(v5)=c0 + add v5,c2 + add v6,v1 + goto @LSFG1 + +.LSFGRet + return + +.LSFBug + break ;******* + return +;--------------------- +.IsSamplePlaying +; return v2<>0 if a sample is still playing + push v1 + v5=2 + gosub @MCDigitise + v2=v1 ; function return: FindState Audio (returns V1=0 or 0FFFF) + pop v1 +.PlaySampleRet + return +;--------- +.PlaySample +; play sample number v1, in Samples() + gosub IsSamplePlaying + if v2<>0 then @PlaySampleRet ; something already playing + +.HiPriPlaySample ; play high priority sample + if SoundOn=false then PlaySampleRet + add v1,v1 + add v1,v1 ; get offset into 4-word table at start + add v1,v1 + +; MCDigitise ; 91 +; /* Paramters: +; V5=0 Initialise +; V5=1 Terminate System +; V5=2 FindState Audio (returns V1=0 or 0FFFF) +; V5=3 Wait For Audio +; V5=4 Volume Control (V5=Volume) +; V5=5 Translate Sample (V1,V2 = sample, V6 = length, +; V3=Frequncy, V4=Volume) +; V5=6 Play Sample (V1,V2 = sample, V3=Frequency, +; V4(hi)=loop count, (lo)=Repeat count +; V6=length +; V5=7 Terminate Sample +; V5=8 Set exponent v1,v2=exponent table. +; v5=-1 Change MCDigitiseHandler vector + + + &v2=Samples(v1) ; offset in list + if v2=0 then @PlaySampleRet ; not available + add v1,c2 + &v6=Samples(v1) ; length of sample + v3=7500 ; frequency + v4=0 ; loop flag + v5=6 ; function: play sample + v1=SamplesListNumber + goto @MCDigitise +;--------------- +;;LoadSamples +;cif Amiga +;; Amiga expects samples to be -128..127, not +;; the 0..255 used by the ST. +;; on ST/AMiga, mcloadfile returns v1 as the +;; length of file loaded +; v3=v2 +; add v3,v1 +;; v2=start, v3=end of sample +; x2=128 +;.ModifySampleLoop +; x1=list25(v2) +; sub x1,x2 +; list25(v2)=x1 +; add v2,c1 +; if v2v1 then GPM1 + if CursorX=v1 then GPM1 ;* + if CursorZ0 then GQM1 + v1=1 ;0001 + if v3=0 then GQM2 + v1=2 ;0010 + goto GQM2 +.GQM1 + v1=4 ;0100 + if v3=0 then GQM2 + v1=8 ;1000 +.GQM2 + return + +;----- + +.GDreadSquare + if CurrentRoom=0 then NoData ;* + gosub GDsquareAddr + CurrentSquare=FloorMap(v1) + return +.NoData ;* + CurrentSquare=48 ;00110000 height=0 + return + +.GDsquareAddr + v3=CursorZ + sub v3,MarginZ + asr v3 ;each byte represents an 8x8 area + asr v3 + asr v3 +; (320-32)/4=72 + v2=FSizeX + asr v2 + asr v2 + asr v2 + v1=0 +.gds1 + if v2=0 then gds2 + add v1,v3 + sub v2,c1 + if v2>0 then gds1 + +.gds2 + v2=CursorX + sub v2,MarginX + asr v2 + asr v2 + asr v2 + add v1,v2 + add v1,CurrentRoom + return +;---------- +.CheckCollision +; CursorX=PlayerX +; CursorZ=PlayerY +; x1=PlayerHeight +; add CursorZ,x1 + gosub @GDpointOnMap + CurrentSquare=48 ;00110000 height=0 + if ReturnCode=0 then GTL1 + gosub @GDreadSquare ;current square=collision byte + gosub @GDquadMask ;v1=mask +.GTL1 + and v1,CurrentSquare + if v1=0 then GTL3 +.GTL2 + ReturnCode=0 ;blocked + return +.GTL3 + ReturnCode=1 ; not blocked + return +;--------- +;; Check map square at dv2+dx2,dv3+dx3 +;; V1=0 if square is vacant... +;.CheckMap +; push CursorX +; push CursorZ +; CursorX=dv2 +; CursorZ=dv3 +; add CursorX,dx2 +; add CursorZ,dx3 +; gosub @GDpointOnMapVec +; CurrentSquare=48 +; PointOnMap=false +; if ReturnCode=0 then FVPMap +; PointOnMap=true +; gosub @GDreadSquareVec ;current square=collision byte +; gosub @GDquadMaskVec ;v1=mask +;.FVPMap +; pop CursorZ +; pop CursorX +; and v1,CurrentSquare +; return +;;--- +; Adjust person's height to that of the terrain... +; on entry: CurrentSquare=value of walkable square +; on exit: x1=height adjustment x2=peopleheight+x1 +.AdjustPersonHeight + x2=15 + and x2,currentsquare + if x2<>0 then DefaultPersonH ; not walkable! + x1=240 + and x1,CurrentSquare ; x1=height*16 + asr x1 + asr x1 + asr x1 ;/16 then *2 (for words) + x2=65534 ; remove bottom bit +++Mike 17Oct90 + and x1,x2 ;+++Mike 17Oct90 +; limit height range that can be chosen + if x1>24 then DefaultPersonH ; some error or other +++Mike 17Oct90 was >12 + &x2=List4(36) ;HeightTable + add x1,x2 + &x1=List4(x1) + + x2=PlayerHeight + add x2,x1 + result=true ; ok + return + +.DefaultPersonH + result=false ; height information faulty/not available +; x1=0 +; x2=PlayerHeight +; add x2,x1 + return +;--- diff --git a/l9dev/regress/games.l9/billy.l9/identiks.dat b/l9dev/regress/games.l9/billy.l9/identiks.dat new file mode 100644 index 0000000000000000000000000000000000000000..49a5c5d50c6b44a27c1553bd52c666f21a9e9827 GIT binary patch literal 9510 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 Nr^oYi;Q!wk{tpWESTz6u literal 0 HcmV?d00001 diff --git a/l9dev/regress/games.l9/billy.l9/intro.txt b/l9dev/regress/games.l9/billy.l9/intro.txt new file mode 100644 index 0000000..cb7b91d --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/intro.txt @@ -0,0 +1,333 @@ +; INTRO.TXT - intro sequence control for Billy the Kid +; +; Copyright (C) 1990 Level 9 Computing Ltd. +; +; Mike Austin 4 September 1990. +; +; +var + CurrentScreenTableOffset + CurrentScreenTimer + TextBoxAfter + TextBoxTime + SceneTimer + +begin + +.vDoWholeIntro + gosub @InitIntro + gosub @SetDefaultPalettes + + StructureFile=IntroStructures + CurrentPrintRaster=2310 + v1=CurrentPrintRaster + code - + gosub @iStartPrinting ; make sure SetPrintRaster etc. is done. + v1=CurrentPrintRaster + code + + gosub @SetupPrintRaster + + + +.RestartIntro + CurrentScreenTableOffset=0 +.NextScreen +; this bit initalises each screen + TextBoxWidth=220 + SceneTimer=0 + gosub @ChooseCurrentScreen ; which screen? + +; 7 jan 1991 - size reduced to prevent PC coming up +; with a 'no links' error after 2 people in front of mirror scene. + v1=1060 + v2=400 ; (320 shows clipping bug on title screen) + v3=1 ; game mode: 0=non-scrolling, 1=scrolling, 2=jumps + gosub @MCInitScrolling + + cif Amiga +; do another initscrolling to try to fix this +; peculiar 8-pixel-non-alignment bug (partic on Amiga) + v1=1060 ; 640 + v2=640 ; 1280 (320 shows clipping bug on title screen) + v3=1 ; game mode: 0=non-scrolling, 1=scrolling, 2=jumps + gosub @MCInitScrolling + cend + + cif pc +; need to do SetGraphicsWindow for PC, even though game is scrolling + v1=0 ; X1 + v2=319 ; X2 + v3=0 ; Y1 + v4=191 ; Y2 + gosub @MCSetGraphicsWindow + cend + + ScreenX=0 + ScreenY=0 + gosub @MCEmptyRoom + gosub @InitACBs + RasterOffset=0 + + BuildingRoom=1 + dv1=CurrentScreen + gosub @PreLoadAndInsertdv1 + + + + gosub @HandleText ; insert any initial text box + + v1=0 ; x position in pixels (scrolling) + v2=0 ; y position in pixels (scrolling) + gosub @BuildRoom + + gosub @ClearKBD ; prevent quitting intro immediately - we need +; to randomize the random number seed a bit, according to how +; long the user waits before pressing a key. + + BuildingRoom=0 + cif NotPC + v1=0 ; x step + cend + + cif amiga + v1=65520 ; x=-16 +.KludgePossee + cend + + cif notpc + v2=0 ; y step + ScreenX=v1 + ScreenY=0 + gosub @MCScrollDirection + cend + + ScrollXDir=0 +.IntroLoop + gosub @PlayTuneForScene + gosub @HandleText ; do any text box changes + PlotLogicalDone=0 + gosub @DisplayEverything + code - + random x1 + code + + + gosub @SelectLanguage + + + gosub @sGetControls ; also does KeyScan + ScrollXDir=0 + cif ReleaseGame + goto introNotRightKey + cend + if RightKey<>0 then @NextScreen ; DEBUGGING FEATURE TO SKIP SCREEN ****************** + +.IntroNotRightKey + cif NotDemoVersion + if FireKey<>0 then @EndIntro + cend + + cif Amiga + goto NotScrollMainStreet ; does disk access on Amiga/ST at present... + cend + if CurrentScreen<>102 then NotScrollMainStreet + if SceneTimer<70 then NotScrollMainStreet + if SceneTimer>100 then NotScrollMainStreet + ScrollXDir=8 + +.NotScrollMainStreet + if CurrentScreen<>107 then NotScrollBuggy + if CurrentScreenTimer>50 then NotScrollBuggy + if CurrentScreenTimer<32 then NotScrollBuggy + ScrollXDir=8 ; (20 frames of scroll seems ABOUT right) +.NotScrollBuggy + + + add SceneTimer,c1 ; count-up timer + sub CurrentScreenTimer,c1 + if CurrentScreenTimer>0 then @IntroLoop + goto @NextScreen +;---------------- +.InitIntro + LeftMargin=0 + TopMargin=0 + v4=IntroSamples + gosub @LoadSamplesForGame + + v1=IntroTablesList + &v2=IntroTables(74) ; intro sprites filename + gosub @MCOpenSpriteFile + &v1=IntroTables(76) ; intro structures + gosub @LoadStructuresV1 + goto @SetDefaultPalettes +;---------------------- +.ChooseCurrentScreen +; which screen? + &x1=IntroTables(90) ; start of ScreenInfo table + add x1,CurrentScreenTableOffset +; called, we'll get the next picture. + &CurrentScreen=IntroTables(x1) + if CurrentScreen<500 then CCS1 + if CurrentScreen>2100 then CCS1 + SceneTimer=65535 ; pretend to have been on this scene a LONG time + gosub @HandleText ; discard erroneous text message - +; only get here if user has skipped a scene (or if there's +; a bug in the script!) + SceneTimer=0 + goto ChooseCurrentScreen + +.CCS1 + add CurrentScreenTableOffset,c8 ; next time this routine is + if CurrentScreen>32767 then EndIntro ; end of intro + add x1,c2 + &CurrentScreenTimer=IntroTables(x1) + add x1,c2 + NextMusic=x1 ; offset of filename in IntroTables + add x1,c2 + &MusicRepeatCount=IntroTables(x1) + return + +.EndIntro +; freeze screen for menu to select pat/billy + WantCSTB=true + gosub @DisplayEverything + gosub @InitACBs + gosub @PutUpHourglass + + cif DemoVersion + goto @RestartIntro ; never leave for demo! + cend + + v4=GameMap ; paramter for OverlayEntryPoint + goto @AfterIntroStart +;--------- +.vHandleText +; format of table entry in IntroTables(ScreenInfo) +; dc.w 2001, NoDelay, DefaultX,DefaultY,dInsert + &x1=IntroTables(90) ; start of ScreenInfo table + add x1,CurrentScreenTableOffset + &m1=IntroTables(x1) ; is there a queue message waiting? + if m1<500 then @HTRet ; not a message - must be next piccy + if m1>2100 then @HTRet + add x1,c2 + &x2=IntroTables(x1) + if x2>SceneTimer then @HTRet ; not time yet + add x1,c2 + + BackgroundColour=0 ; don't affect existing text + CurrentPrintRaster=2310 + CurrentDO=2310 +; gosub @DoTextWindow + push x1 ; position in IntroTables + code- +; instead of @iStartPrinting, do the following... + PrintX=LeftMargin + PrintY=TopMargin + v1=CurrentPrintRaster ;=1725 (use 431 to display) + code + + gosub @SetupPrintRaster2 ; don't do SetPrintRaster per se +; because it's slow, and we've already done it once. + code - + gosub @iStartPrintToBuffer + + message m1 +; code to finish up, and display the text with an outline... + message cr ; ensure buffer is flushed etc. + gosub @iEndPrintToBuffer +; text has been printed between TextBuffer(2..v7) + code + + ForeGroundColour=7 ; foreground colour=black + gosub @OutputText ; my routine which saves start coords + + add PrintX,c2 + add LeftMargin,c2 + add TextBoxWidth,c2 ; more like right margin + gosub @OutputText ; my routine which saves start coords + + add PrintY,c2 + gosub @OutputText ; my routine which saves start coords + + sub PrintX,c2 + sub LeftMargin,c2 + sub TextBoxWidth,c2 ; more like right margin + gosub @OutputText ; my routine which saves start coords + + ForeGroundColour=12 ;yellow=12 + add PrintX,c1 + add LeftMargin,c1 + add TextBoxWidth,c1 ; more like right margin + sub PrintY,c1 + gosub @OutputText ; my routine which saves start coords + + LeftMargin=0 + pop x1 + &v2=IntroTables(x1) + add x1,c2 + &x2=IntroTables(x1) ; y + add x1,c2 + v3=400 ; z + v4=v3 ; h + sub v4,x2 ; y=z-h so h=z-y + &v5=IntroTables(x1) ; draw flag + add x1,c2 + x1=10 ; skip onto next entry in table + add CurrentScreenTableOffset,x1 + + v1=TextBoxDisplayed + v6=0 ; non-reflected + + if SceneTimer>32000 then AfterTB ; skipping this text box + x1=v5 + if v5<>65535 then HT3a + cif pc + gosub @SafePlotLogical + gosub @MCDrawObjectV1 ; remove the previous text box + gosub @SortAndDisplayObjects + gosub @MCUpdateScreen + gosub @MCUnplotScreen + v1=0 + v2=0 + gosub @SafeScrollDirection + goto HT4 + cend + goto HT3 + +.HT3a + v5=0 ; insert + +.HT3 + gosub @MCDrawObjectV1 + v1=ScreenX + v2=ScreenY + gosub @BuildRoom ; correct for mistakes made by InsRebuild on scrolling screens +.HT4 + TextBoxDisplayed=0 ; don't display text as a sprite as well + +.AfterTB +.HTRet + return + +;------------- + +.OutputText + push PrintX + push PrintY + push v7 + code - + gosub @iDisplayBufferedText + code + + pop v7 + pop PrintY + pop PrintX + return + +;----------------- +; dc.w IntroSprites-IntroTables ; offset 74 +; dc.w IntroStructures-IntroTables ; offset 76 +; dc.w 0 ; IdentikitSprites-IntroTables ; offset 78 +; dc.w IdentikitStructures-IntroTables ; offset 80 +; dc.w 0 ; 82 +; dc.w 0 ; 84 +; dc.w 0 +; dc.w 0 +; dc.w ScreenInfo-IntroTables ; offset 90 +;-------------------------- diff --git a/l9dev/regress/games.l9/billy.l9/language.txt b/l9dev/regress/games.l9/billy.l9/language.txt new file mode 100644 index 0000000..66dbac4 --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/language.txt @@ -0,0 +1,6 @@ +const +; english=0 +; german=1 +; french=0 +; TranslateExtraChars=1 ; set to 1 to permit funny characters +; like accents etc. diff --git a/l9dev/regress/games.l9/billy.l9/manual.txt b/l9dev/regress/games.l9/billy.l9/manual.txt new file mode 100644 index 0000000..600ee96 --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/manual.txt @@ -0,0 +1,648 @@ +Graphics Structure Editor. Copyright (C) 1989 Level 9 Computing Ltd +------------------------------------------------------------------- + +This editor is not for drawing pictures, but to let you take +Neochrome format graphics (eg from Art Studio) and combine them +into space-efficient 3D rooms, animation sequences etc. + +It handles four types of objects (graphics data)... + +* Cell: a 16x16 pixel square, in 16 colours (with colour 0 meaning + transparent). This is the way in which real pixels are stored: + the other objects are basically collections of cells. + +* Raster: a rectangle of cells, any number of cells wide by any + number high. Any cell can be used anywhere within a raster, and + the same cell can be used many times (to save space). + +* XZH object. These are built from any number of any of the four + types of objects, each at its own 3D position. Objects within an + XZH object are also known as "items". + + The co-ordinate system is: + + ^ H (H is the height above the "floor") + | + | + +-----> X (X is the left/right position) + \ + \ + Z (bigger Z means it's nearer to the viewer) + + XZH objects can be used for a picture on a wall (i.e slightly + in front of it), an animated bird in a gilded cage (i.e slightly + behind the bars), or a 3D room made up from dozens of objects. + +* Animation sequence. This is a list of animation instructions: + object (display any of the four types of objects), shift (move), + repeat next instruction, and fork (start another animation + sequence, to run simulteneously). These instructions are processed + one-at-a-time in order. + + EDITING + ------- + +The screen normally displays two windows, one at the top and one at +the bottom, and each shows one object. + +To the right of each window is a column of status information +for the corresponding object. For example: + +20 Current object number. +4110 Current item (only used when editing an XZH object). +0 0 64 3D position (X Z H) of current item (ditto). +xzh Type of object. +x 144 X position of cursor object. +z 16 Z position of cursor object. +h 64 H position of cursor object. +4x0x0 X, H, "unused" sizes of current object, if raster. +Scr0,0 How far window is scrolled (X,Y). Use for big XZH objects. +OqfHR Status display (capital=on, lower case=off): + O=raster Offset (only affects preview mode), + Q=Quick mode (use when editing very big XZH objects), + F=Fast mode (do not use), + H=auto Height mode (for placing rasters on XZH floor), + R=Reflect. + +The cursor is a twinkling dot, which you can move anywhere with the +mouse. Normally, when it is in one window (half of the screen), a +copy of the object from the other window follows it about and can +be placed at its current position by pressing the left mouse button +or space - this is the usual way of building objects. + +Only XZH objects have truly 3D cursor movement. For these, the mouse +controls movement along the ground (changing X and Z). And, provided +you're not in auto height mode (toggled on/off by "H"), you press +keyboard "-" and "+" (with or without shift), or move the mouse with +its right button pressed, to change the height H above the ground. + + + DISPLAYING ANOTHER OBJECT + ------------------------- + +To change which object is displayed in the current window.. + +7/9 Numeric keypad 7 or 9 display the previous or next object. This + is not intended for moving from object 1 to 500, but is ideal if + e.g animation frames of a person running are stored in adjacent + objects, because you can step through them quickly for a check. + +. Dot makes the editor ask you for a new object number. Type a + number, press return and the chosen object is displayed. + +1/3 Numeric keypad 1 or 3 display the previous or next object in the + other window. (The other window doesn't visibly alter, because + it is not being redisplayed, but the object number and therefore + the object following the cursor are changed). This is useful if, + e.g, you are copying adjacent cells into a raster. + + + EDITING + ------- + +* CELL EDITING. Cells cannot be edited or copied, except by saving +them in a Neochrome file (S) and importing (I) them later. Normally +pressing the left mouse button means "copy the object in the other +window to here". But because you can't copy onto a cell, moving the +cursor onto a cell and pressing the left button has been reused as +a quick way to select that cell as the current one. + + +* RASTER EDITING. To create a raster, choose an object number in the +range allowed for rasters (press "Help", "N" and "N" for information) +and display it, e.g by pressing keypad "." and entering the number. + +Initialise the raster using the "R" (raster) command, e.g: + R4 (return) set the width to 4 cells + 3 (return) set the height to 3 cells + (return) initially use some blank cells. +This raster is now 12 cells big; you can see the numbers of the +(blank) cells it contains by moving the mouse dot over the raster +space, near the top left of the window. + +To copy cells into the raster, display the raster in the upper window +and choose a cell object in the lower window. Move the cursor onto the +raster (followed by the image of the chosen cell) and press space or +the left mouse button to place it. Repeat until the raster is full. + +To copy a raster into a raster, display the destination in the upper +window and the source in the lower. Move the cursor across the upper +raster (followed by the image of the source raster) and press space +or the left mouse button to place it. All cells which overlap the +target raster are copied. + +(Note however that no cells or pixels are really changed or copied +by any of the above, as rasters really just contain cell numbers. +Much the same applies to XZH and animation objects too.) + +Arrow keys change the size of an existing raster: press up/down to +increase/decrease height, or left/right to increase/decrease width. + + +* XZH EDITING. You do not create XZH objects as such (only Rasters +need initialising); just pick a number in the range allowed. + +Any kind of object can be copied into an XZH object. It is better +to have the destination in the upper window, so display the XZH +object there, and the source object in the lower window. + +Now move the cursor around the destination XZH, and it is followed +by the object you are copying. Note that this copy does not follow +smoothly, but moves in jumps - this is because it can usually only +be positioned on a cell boundary (every 16th pixel). + +The mouse controls movement along the ground, changing X and Z. If +auto height mode is set (toggle it on/off by pressing "H"), the copy +automatically sits with its lowest pixels at height H=0. If not in +this mode, you can change the height H by keyboard "-" and "+" (with +or without shift), or moving the mouse with its right button pressed. + +Press the left mouse button, or space to copy the object into the +XZH object. Space is better, as it is easier to get a single press. + +Accurate positioning. Normally, objects can only be positioned on a +16x16x16 boundaries within XZH objects. Press keypad "*" to toggle +"four pixel mode", in which you can position them accurate to 4x4x4, +though positions are still rounded to 16 pixels on display. This +allows several layers of objects to be placed at what the game will +think is the same Z coordinate (when rounded to 16x16x16), allowing +for things such as a picture on a wall or an expression on a face. + +Preview mode. Enter preview mode by pressing "P" and leave by "Esc". +This mode shows the current window as it will appear in a finished +game, and therefore an XZH object is shown in 3D. It allows you to +check, for example, that a midground object really is between fore- +and background objects as you copy it into place. Preview mode also +shows animation objects (if rapid animation makes editing difficult, +press "S" in preview mode for single step mode.. thereafter, press +any key to step on the animation). See later for more information. +Note: space is NOT the same as left mouse button in preview mode. + +To edit an existing XZH object, e.g to delete one of the objects +it contains (items), press: + Esc to go to the start of the current XZH object, + Tab to step on to the next item (the current item flashes), + D to delete the current item, + Delete to delete the XZH object and all its contents. +You will notice that items are stored in order of their Z positions: +background objects first and working towards the foreground. + + +* ANIMATION SEQUENCE EDITING. Animation sequences are just lists of +instructions; use preview mode (see just above) to reveal what the +animation looks like. + +To enter new instructions, press: + F Fork (start another animation sequence AND continue) + O display Object + R Repeat next instruction: 0,1=forever, 2-16=2-16 times, 17+=pick + a random number 16-31 and do-the-next-instruction-and-repeat + unless it exceeds yours. "Repeat m, repeat n, object o" means + "Repeat m+n, object o"; this allows for bigger repeat numbers. + S Shift (move) +To change a number in an instruction: move the cursor onto it; the +old number is highlit; type the new number and press return. + +To delete an instruction: move the cursor on to its name, and when +this is highlit, press "D". To delete the sequence, press Delete. + +To copy an animation sequence into another, display the source one in +the lower window, move the cursor on to the destination sequence in +the upper window and press the left mouse button, or space. Normally +the animation instructions are copied before those in the destination +sequence; to copy them after an instruction in the middle, first move +the cursor on to its name so that this is highlit. + +The other types of objects can be copied into an animation sequence +in the same way, resulting in an appended or inserted Object command. + +Example animation sequences for a man walking from left to right.. + +2500: + Repeat ! ! is displayed for 0: repeat forever. + Object # 2501 Display object 2501 (two strides). + End. + +2501: + Object #100 Display object 100 (start of movement). + Shift x 4 z 0 h -1 Shift 4 pixels to the right and 1 down. + Object #101 + Shift x 4 z 0 h -1 + Object #102 Varying the height H for the "bobbing" + Shift x 4 z 0 h 1 action as the man walks along means + Object #103 that, in the objects for the individual + Shift x 4 z 0 h 1 frames, we can keep his head and torso + Object #104 in a constant position. This will make + Shift x 4 z 0 h -1 it easier for the game to super-impose + Object #105 facial expressions and possessions as + Shift x 4 z 0 h -1 play continues. + Object #106 + Shift x 4 z 0 h 1 + Object #107 Display object 107 (end of movement). + Shift x 4 z 0 h 1 Shift 4 pixels to the right and 1 up. + End. + + + IMPORT AND EXPORT OF NEOCHROME PICTURES + --------------------------------------- + +Graphics for the Structure Editor are drawn using an arts package, +such as Neochrome or Art Studio, and must be imported. + +* IMPORTING. To import a Neochrome picture file, move the cursor to +the upper window and press "I". Then type the picture filename, e.g: +MYPIC.NEO and press return. The picture is loaded into a temporary +area of memory known as "the Neochrome screen" and is displayed. (You +can see the Neochrome screen at other times by displaying object 0). + + +* GRABBING A RASTER. After importing, move to the lower window and +choose a raster (presumably an unused one, which means you must +dimension it with "R") which is the right size for one of the things +drawn on the Neochrome screen. + +Now move the cursor to the upper window, where you will see two +parallel lines, indicating the size of the raster. Position this +"box" around the thing you want to grab, e.g the picture of a table. +Then press the mouse button to grab the graphics in the "box" and +swap them with the contents of the raster. + +(Unlike normal "copy" operations, which leave cells and pixels +unchanged, grabbing data from the Neochrome screen in this way +actually changes the pixels in all of the cells used by the raster.) + + +* AUTO-IMPORTING is a faster method when you want to grab all the +graphics from the Neochrome screen which you have just imported. + +Press "A" and the system asks for the number of the starting cell. +It will copy all the non-blank 16x16 pixels on the Neochrome screen +into cells, starting with your number and working upwards, so enter +a number which is clear of any already-used cells. (Because blank, +i.e all colour 0, parts of the picture are ignored, you should space +out things in a format easy to draw and not cram them together.) + +The request "Blank cells only?" is now redundant, no blank cells are +imported. You will presumably then go and copy the cells into rasters + yourself. + + + MISCELLANEOUS FEATURES + ---------------------- + +* SCROLLING THE WINDOW. Because lots of objects are too big to fit +into their window, the numeric keypad can be used to scroll them +around so that you can edit different parts: + + 8 Use the keypad to scroll the window across the object. + | Press 8 to move the window up, 2 down, 4 left, 6 right. + 4--+--6 And 5 to centre it again. Because the window starts at + | the top left of the object, scrolling down and right + 2 are speeded up: 2 and 6 scroll in four-cell jumps. + + +* SAVE. Press "S" to save a Neochrome image of the entire screen on +disk. You are asked for a file name. + + +* PREVIEW MODE shows you the object in the current window as it will +appear in the game: an XZH object is shown in 3D, and an animation +sequence is animated. The other window is not shown, but the object +from it slowly follows the cursor as a sprite. + +With an XZH object, you can move the cursor (and cursor object) +about through the 3D scene. If you press "P" again in preview mode, +the cursor object is positioned on the nearest 16x16 boundary to +the cursor. If you waggle the cursor dot, away from the cursor, the +cursor object slides towards it one pixel at a time. To change the +height H, press the mouse button and move the mouse as usual. + +To copy the cursor object into an XZH object, just press the left +mouse button as normal. Because you can see the real appearance of +objects, this may be the best way of editing 3D scenes. + +When an animation sequence is displayed in preview mode, the left +mouse button's function changes. Press it to restart the animation. + +You can slow or speed animation by pressing keyboard "-" or "+". +Press "S" in preview mode for single step mode.. thereafter, press +any key to step on the animation. See below for more information. +Note: space is NOT the same as left mouse button in preview mode. + +Screens in preview mode can be saved to a neochrome file by pressing +W (Write). The system requests a file name and saves the current +frame being previewed. This utility is useful for demos. + +Finally, press "Esc" to leave preview mode. + + +* HELP. Press "Help" for details of common commands. The help screen +ends with, "Leave Editor?": press "Y" (yes) to quit (you are warned +and can change your mind if if this could lose data), or "N" (no) +to display the next help screen, showing object information. This +tells you the ranges of numbers allowed for the various types of +objects, and ends by asking if you want the 'special functions' +menu: press "Y" to see this menu, or "N" to return to editing. + + +* PANIC PIXEL. Move the cursor to the extreme top right of the screen +and press the left mouse button to hit the panic button. This is an +extreme form of "Esc"; it should stop everything and restart the +editor with object 0 in both windows. The panic pixel also works +as an UNDO of the last change made. + + +* REFLECTION. Press "Return" to toggle reflection on/off. When an +object is copied into a graphical object (a cell into a raster, +or anything cell/raster/XZH into an XZH), the current reflection +status is stored along with it. Thus, to set up an XZH object for +something symmetrical, you would set reflection off, copy in one +half, set reflection on and copy in the same half, now reflected). + + +* RASTER OFFSET. This is a constant, added to the object numbers of +all rasters displayed in preview mode, or by the game. It is set by +pressing "O", for Offset, (but note: "O" means something different +while editing an animation sequence, and in preview mode itself (!)). +This allows several groups of graphics to be displayed using the +same animation sequences and/or game logic - e.g a dozen game people +who all have the same range of actions. + + +* SPECIAL FUNCTIONS are on a menu accessed via "Help" - see above. +As the menu warns, the potential for disaster is quite great, so +make a backup copy of your disk first. + +1..add new objects. Add some unused/blank objects and shuffle all +the higher objects up. It asks you where to add the new objects, +which are all the same type as the one before; the idea is to make +room for you to e.g set up more rasters. The range of numbers used +for object types change, but that for cells is NOT changed by this +command. So the starting position for cells MUST be changed first, +by "6", if there is any danger of existing objects overlapping them. +Addition takes several minutes; use "Help" to see what the ranges +of object types are afterwards. + +2..remove objects. Deletes some objects (blank and otherwise) and +shuffles all the higher objects down. It asks you which objects to +delete; please make sure they are all of the same type. The range +used for cells remains the same, but the range of numbers for other +object types are changed. Remove takes several minutes; "Help" +shows the ranges of object types afterwards. + +3..find and delete unused objects (not just cells). It asks you +which objects to check; please make sure they are all of the same +type. Object type ranges, and numbers of remaining objects are +unchanged. It takes several minutes. + +4..scrunch objects together. This renumbers objects, and changes +object ranges - sliding them all down to fill in any gaps and make +the numbers as small as possible. Numbers of objects, and object +type ranges, are all changed (even cells). It takes a long time. + +5..make maps. No longer used. Generates a set of rasters as a basis +for the floor plan map used for collision detection in the game (i.e +showing where people can walk). The rasters can then be modified in +map mode (press "t" while over a suitable raster) and the keypad used +to change entries to add floorpointers and add/delete free squares. + +6..move cells. Change the starting number of the cells and +renumber all references to them. It takes several minutes. Use +this to make room for other objects, or to avoid clashes when e.g +preparing to import structures which use overlapping numbers. + +7..set number of cells. Sets the finishing number of the cells, so +determining how much memory is saved/loaded by the editor. Do not +set this too high, as even "empty" cells take 128 bytes each. + +8..print structures. Print objects in a text form to RS232, +Centronics, a file, or to the screen. It is useful for, e.g debugging +if funny things happen with an XZH object (perhaps it gets very slow +to edit), and to keep a paper record. + +9..set auto cell range. When "R" is pressed to dimension a raster, +if you just press return the program automatically chooses blank +cells for the raster. This function sets the upper and lower limits +of the range of cells chosen from, though the highest cell of the +range may be overshot. + +0..change misc settings. Display a further menu to: + 1..toggle safe mode. When safe mode is set, the editor protects + itself slightly more against corrupted structure files, but + runs slower. (Safe mode is also set by pressing "S" after the + editor loads). Leave it off unless you have problems. + 2..enable Neochrome screen. This does NOT refer to the memory + used when grabbing cells, but to some cosmetic graphics which + show the border between screens, panic "button" etc. These + graphics are only loaded when the program is, so after using + this option, you need to save the data (with "Undo"), quit + from the editor (from "Help") and run the program again. + 3..disable Neochrome screen. See just above. + 4..toggle information. Switch the information at the right of + the screen on/off (the object number, status display etc). + You will almost always want the information shown, but it can + be a pain when editing wide objects, and switching it off + slightly speeds the editor. + Esc..return to editor screen (as usual). + +-..set x size for implied raster. When the object displayed in a + window is a cell, it is not displayed alone, but in a rectangle + of perhaps eighty adjacent cells. The width of the rectangle is + initially 13 cells, but you can change it with the "-" function. + For example, if you have imported cells which matched up + vertically on a Neochrome screen, setting the width to 20 will + mean that they match up in the window displaying cells, as well. + +q..export objects. Write out a range of objects to a file. Only + select one type of object: if you want to export several types, + export each to a seperate file. Export/Import can be used to copy + objects from one structure file to another, but you may need to + do some renumbering (e.g by 1..add new objects) before exporting, + or perhaps before importing, to avoid overwriting necessary + objects in the destination file. Take care and full backups. + +w..import objects. Read a file previously created by export. It asks + what range of objects you want to overwrite with the objects from + the disk file. Enter two numbers, which must be the same as those + used for the export. Bear in mind that references within the + imported objects may not work, because the objects they use have + been deleted or replaced by objects with different functions. + +e..truncate structures. Delete all objects above a specified number. + This is a debugging command, for amputating the end of the object + data if it has become corrupted. + +r..delete objects. Like "2..remove objects", but does not shuffle + later objects down and so does no renumber. It is a bit faster + than removing, but not much. + +t..read text-form structures from disk. The format is the same as + for "8..print structures", and it can read files produced by this. + + + + € WHAT ALL THE KEYS DO + -------------------- +KEYBOARD... + +A = Auto-import graphics after "I" +B +C +D = Delete current raster or animation item +E +F = toggle Fast mode (refreshes less screen) +G +H = toggle auto Height mode +I = Import neochrome screen +J +K +L +M = toggle Magnify window (disabled) +N +O = display Object in animation sequence +P = select Preview mode (Esc leaves it) +Q = toggle Quick mode (experts only) +R = dimension Raster / Repeat animation +S = save screen in Neochrome file / Shift animation +T = toggle map mode (not worth using) +W = save a previewed screen to a neochrome file + +U, V, X, Y, Z = nothing + +- = slow animation in preview mode / decrease H in XZH ++ = speed animation in preview mode / increase H in XZH + +Up arrow = Increase height of raster +Down arrow = Decrease height of raster +Left arrow = Increase width of raster +Right arrow = Decrease width of raster + +0 = toggle single window mode +Esc = to start of current XZH / cancel input, preview etc. +Tab = step on to next item of current XZH +Delete = Delete items in current raster or animation + +Space = place object (acts as left mouse button) +Return = toggle reflection +Help = help and status information +Undo = save all the structure data + +left mouse = place object +right mouse = press and move mouse to adjust H in XZH object + + +NUMERIC KEYPAD... + +* toggle 4-pixel mode. +- decrease Z size for raster objects (not worth using) ++ increase Z size for raster objects (not worth using) + +7 current object -1. 8 scroll window up. 9 current object +1 +4 scroll window left. 5 centralise scroll. 6 scroll window right +1 other object -1. 2 scroll window down. 3 other object +1 + +. (dot) ask for object number and change to displaying that object + + + € HINTS & TIPS + ------------ + +Save your work, using "Undo", about every 5 minutes of active work. +Backup your disk several times a day. And don't say I didn't warn you. + +If funny things happen, first check the options on the status line. + +You are advised not to try and recover from errors in the structure +file. Go back to an earlier version. + +Efficient animation. Graphics that move, e.g anything displayed by +an animation sequence, are called "sprites" and take much more +processing power to display than static objects. Please bear this +in mind when designing objects which sometimes move, or where only +part moves. For example: +* A wall lamp with a flickering flame is more efficient if set up + as an XZH object, which contains an animation structure for just + the flame. Likewise a clock with a pendulum, a spectator who + constantly waves a flag, etc. +* A man who occasionally cheers is more efficiently shown with his + resting expression on his face - this can be overlayed when he + cheers. Linewise a candle which flickers only very occasionally. + +Efficient objects. XZH objects use 5 bytes per item, while Rasters +use 2 bytes per cell. Both have a 2 byte overhead. Thus it is +clearly more efficient to use a Raster if possible. However, a +full-screen raster would still take 484 bytes, and it would almost +certainly be better to use an XZH object made up from several +standard rasters for large areas, such as the back wall. Don't +forget reflection either (all objects can be reflected, even cells). + +Object 0 is special. If you display object 0 in the editor, e.g via +the dot command, this is taken to mean the Neochrome screen used for +importing sprites. In structures, however, object 0 has another +meaning and it displays nothing: the effect is as though a blank cell +had been displayed, but NO processing power is wasted. + +Always dimension a Raster (using "R") to a group of non-blank cells; +either with cells off the end of the file (greater than MaxCell), or +as a specific group of cells containing something recognisable for +this purpose. If you let the "R" (Raster) command pick a lot of blank +cells for you, you can be sure that sometime later you will forget +which cells it chose, use the once-blank cells for storing graphics +and not notice until bugs are reported in the pictures. + +The 3D system assumes that each thing displayed is at one distance +from the observer, and this works pretty well for flat, rectangular +or small objects, where you are always looking at the front face. +But it does not work at all for big irregular objects, or objects +at an angle such as the diagonal side walls of a stage set, where +the surface that you can see is at a wide range of distances. E.g +a diagonal wall should be set up as an XZH object, like a Venetian +blind with vertical slats, each one cell wide: + -- A diagonal wall appears on the screen as a continuous + -- diagonal surface, but its internal structure is an XZH + -- object, built up from vertical 1-cell-thick slats. + +To create an empty structure file, use special functions to truncate +it at object 1; set 0 cells; and then add new objects. (This has not +been tested). + +When editing animation sequences, remember that some of the useful +keys, e.g "O", change their meanings. + +For animations, assume the game will run at about 8 frames per sec. + + + FEATURES + -------- + +3D graphics (in preview mode and the game), need a background in +order to be shown properly. Without one, they are displayed all +right but the 3D impression is not perfect. In a game, make sure +that moving objects always have something to move in front of. + +You should theoretically be able to edit anything in either window, +but it is a great deal safer to only edit the object in the top one. + + + BUGS + ---- + +Special function 4, "scrunch", does not work. + +Special function t, "read text structures", is not yet quite +compatible with files produced by s.f 8, "print structures". + +Object numbers can not be greater than 8000. + +Rasters are not displayed correctly when scrolling is set, but you +can edit them, and the numbers on the right are correct, except for +item (cell) numbers. + +Animation objects cannot yet be reflected. + +A raster's size can sometimes get corrupted while working on it. (The +size is shown as, e.g 4x3x0 on the right). If the first two numbers +change to silly values, it may be best to delete the raster (use the +"Delete" key) and start again. + +Auto import ignores "Y" after "Blank cells only?", treating it as "N". diff --git a/l9dev/regress/games.l9/billy.l9/menu.txt b/l9dev/regress/games.l9/billy.l9/menu.txt new file mode 100644 index 0000000..150d24a --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/menu.txt @@ -0,0 +1,1295 @@ +; MENU.TXT for Billy The Kid +; +; Mike Austin July 1990 +; +; Copyright (C) 1990 Level 9 Computing Ltd. +; +; +;********** Debug code in WaitFire. +; +; + + +var + PrettyMenuDisplayed ; false/true + HighlightY + HighlightEntry ; offset of highlight, i.e. number of entry 0.. + MaxHighlightEntry + +const + MM=600 ; message base for menu messages +MDoIt=0 ; equ $0000 +MPrintM1=4096 ; equ $1000 +MActorM1=8192 ; equ $2000 +MMenu=12288 ; equ $3000 +MPrintDOM1=16384 ; equ $4000 +MActorDOM1=20480 ; equ $5000 + + begin + + code + +;.Menu +; m1=10 +; gosub @DoTextWindow +; gosub @DisplayEverything +; TextBoxDisplayed=0 +; +; gosub @MenuWait +; +;.MenuLoop +; gosub @WaitFire +; push v1 +; x1=48 +; x2=v1 +; sub x2,x1 +; m1=20 +; add m1,x2 +; gosub @DoTextWindow +; gosub @DisplayEverything +; pop v1 +; gosub @GotoGameV1 +; goto @MenuLoop +; +;----------------------- + + + + + cif TownOverlay +.MenuGotScreen +; want to change to screen number x1 within this overlay + NewScreen=x1 + goto @OverlayRestart ; return + cend + +;------ +.OpenArcadeStructures +; e.g. for visiting ranches etc. + push v4 + TextBoxDisplayed=0 + PlayerACB=0 + gosub @MCPurgeAllCells + v1=IntroTablesList + &v2=IntroTables(38) ; arcade sprites filename + v3=1 ; 0=purge, 1=don't purge + gosub @OpenSpriteFile + &v1=IntroTables(44) ; arcade structures filename + if StructureFile=LinkingStructures then OAS1 + gosub @LoadStructuresV1 + StructureFile=ArcadeStructures +.OAS1 + gosub @InitACBs + pop v4 + return +;---------- +.WaitFireRelease +.MenuWait +; menu has been displayed - handle selections + push x1 + gosub @sgetControls + pop x1 + if FireKey<>0 then MenuWait ; wait for fire to be released +.MenuClearKbd + goto @ClearKBD +;--------- +.WaitFire + cif ST + gosub @MCDisplayRoom ; ******************** re-hook kbd vector ****************** +;**************DEBUG VERSION ONLY ******************* + cend + gosub @ClearKBD + gosub @WaitFireRelease + +.WaitFireLoop + gosub @sGetControls ; also does keyscan + if FireKey=0 then WaitFireLoop + if FireKeyChange=0 then WaitFireLoop + gosub @WaitFireRelease +.WFRet + return +;------------ +.WaitFireAndDisplay + gosub @DisplayEverything + gosub @sGetControls ; also does keyscan + if FireKey=0 then WaitFireAndDisplay + if FireKeyChange=0 then WaitFireAndDisplay + gosub @WaitFireRelease + return + +;-------- +.RealMenu + code - + gosub @iStartPrinting + message 200 + gosub @iEndPrinting + code + + gosub @DisplayEveryThing + gosub @MenuWait +.RM1 + gosub @MCOsrdch + if v1<48 then RM1 + if v1>58 then RM1 + TextBoxDisplayed=0 + return +;---------------------------------- +.PutUpMenu + + gosub @SetPrintMenu + gosub @MenuWait ; wait for fire to be released, etc. + + +; park the black box which goes behind the menu to +; make it run good and fast... + gosub @MCDisplayRoom +;; dv1=206 ; black box behind menu +;; if StructureFile=TownStructures then MS1 +; dv1=97 ; black box behind structures +;.MS1 +; dv2=screenx +; dv3=screeny ; z +; dv4=0 +; dv5=dPlot +; dv6=0 ; non-reflected +; gosub @MCDrawObjectDv1 +; gosub @MCCopyScreenToBuffer + + +.PutUpMenuAgain +; push CurrentPrintRaster +; push CurrentDO + if MenuNumber<>100 then PMNotWidowWoman +; can only get widow woman message when have enough money + if PlayerGold>999 then PMNotWidowWoman + MenuNumber=16 ; Standard menu + +.PMNotWidowWoman + push ForegroundColour + push BackgroundColour + push TextBoxWidth + ForegroundColour=16 ; foreground color (7). 16=Print transparent. + BackGroundColour=1 ; background color (1). 0=Don't change current. +; 1=white. The background is also cleared to this colour +; IntroTables(MenuOffset) is start of menus + x4=MenuOffset + add x4,MenuNumber ; add on offset of menu we want + &x4=IntroTables(x4) +; now IntroTables(x4) is the menu requested + push x4 + gosub @PrintMenu + pop x4 + HighlightY=TopMargin ; start with top entry highlit. + HighlightEntry=0 ; likewise entry number + pop TextBoxWidth + pop BackgroundColour + pop ForegroundColour +; pop CurrentDO +; pop CurrentPrintRaster + + return +;------------------- +code - +.iPrettyMenu + code + + gosub @PrettyMenu + code - + return +code + +.PrettyMenu +; menu offset MenuNumber has been requested +; code to handle MenuStructures(). +; Returns result=0 or result=message number offset from MM +; (See Menudata.txt) + &MenuOffset=IntroTables(32) ; offset of menu data. + gosub @PutUpMenu + +.SelectPrettyMenu +; select from menu already displayed: x4 +; push CurrentPrintRaster +; push CurrentDO + push ForegroundColour + push BackgroundColour + push TextBoxWidth + +.PrettyMenuLoop +.PMDisplayLoop +.PMInputLoop + gosub @DisplayNewMenu + + push x4 + gosub @sGetControls + pop x4 + if FireKeyChange=0 then @PMNoFire + if FireKey=0 then @PMNoFire +; fire pressed. + push x4 + gosub @WaitFireRelease + pop x4 + goto @PMEnd + +.PMNoFire +; up/down on highlight bar? + if UpKey=false then PMNoUp + sub HighlightEntry,c1 ; entry number 0.. + sub HighlightY,c8 + if HighlightEntry<200 then @PMDisplayLoop ; redisplay in new position + HighlightY=TopMargin ; limit to top of menu + HighlightEntry=0 + +.PMNoUp + if DownKey=false then PMNoDown + add HighlightEntry,c1 + if HighlightEntryMPrintM1 then PMNotPrintM1 +.PMPrintM1 + MaxHighlightEntry=1 ; HighLightY=65535 ; remove hightlight bar. + push x1 ; operation code. + push m1 + code - + gosub @iStartPrinting +; messages to go to text box go here... + if m1<3000 then PMP2 + x1=61440 ; $f000 ;negative numbers -> 3 hex digits. + add m1,x1 +.PMP2 + message m1 + gosub @iEndPrinting + code + + pop m1 + gosub @DisplayNewMenu + gosub @WaitFire ; wait for user to press fire button + pop x1 ; operation code + if x1=MPrintDOM1 then @PMReturnCode ; return message offset as operation code + result=0 ; do nothing code + goto PMReturnCode + +.PMNotPrintM1 + if x1=MActorDOM1 then PMActorM1 + if x1<>MActorM1 then PMNotActorM1 +.PMActorM1 + MaxHighlightEntry=1 ; HighLightY=65535 ; remove hightlight bar. + push x1 ; operation code + code - + gosub @iStartPrinting +; messages to go to text box go here... + message PlayersName + message m1 + gosub @iEndPrinting + code + + gosub @DisplayNewMenu + gosub @WaitFire ; wait for user to press fire button + pop x1 ; operation code +; result=m1 + if x1=MActorDOM1 then @PMReturnCode ; return offset as operation code + result=0 ; do nothing code + goto PMReturnCode + +.PMNotActorM1 + if x1<>MMenu then PMNotMMenu + MenuNumber=result + +; make menus 0..8 latch when we switch to them. This allows +; for the equivalent of "first meeting" messages + cif TownOverlay + if MenuNumber>8 then PMNotLatch + x1=PersonNumber + gosub @NewMenuForPerson ; person x1 + +.PMNotLatch + cend + gosub @PutUpMenuAgain ; get new menu, print it to raster... + goto @PrettyMenuLoop + +.PMNotMMenu + + + +.PMReturnCode +; result is operation code to return to caller. +; 0=by default do nothing. + TextBoxDisplayed=false ; kill any other text box that +; may have been displayed before + pop TextBoxWidth + pop BackgroundColour + pop ForegroundColour +; pop CurrentDO +; pop CurrentPrintRaster + return +;------------- +.SetPrintMenu + LeftMargin=10 ; allow for area hidden by border + TopMargin=9 + TextBoxWidth=144 ; 160 - 16 to allow for area hidden by border + + CurrentDO=95 ; 207 ; display object for menu box (white bit which +; gets printed onto) + CurrentPrintRaster=2743 ; menu print raster + if StructureFile=TownStructures then SPMRet + if StructureFile=BrawlStructures then SPMRet + if StructureFile=ArcadeStructures then SPMRet + CurrentPrintRaster=2311 + if StructureFile=IntroStructures then SPMRet + + CurrentPrintRaster=599 ; was 196 ; menu box + if StructureFile<>ScrollingStructures then SPMRet + CurrentPrintRaster=1000 ; menu print raster + +.SPMRet + return + +;------------- +; EXAMPLE OF MENU STRUCTURES... +; menu data for game. Each entry contains two words: +; .w Message number of appear on menu, relative to MM (0 if +; end of this menu) +; .w (1) MDoIt + Operation code. +; (2) MPrintM1 + Message number to print in response, relative to MM +; A further click returns to the previous menu +; (3) MActorM1 + Message number. As MResp, but puts +; (Billy/Pat) at start of message. +; (4) MMenu + Offset of menu to go to if item selected. 0 to +; quit menus +; (5) MPrintDOM1 + Message number to print in response, relative to MM +; the offset from MM is then return as a return code. +; (6) MActorDOM1 + Message number. As MResp, but puts +; (Billy/Pat) at start of message. +; the offset from MM is then return as a return code. + +;MDoIt equ $0000 +;MPrintM1 equ $1000 +;MActorM1 equ $2000 +;MMenu equ $3000 +;MPrintDOM1 equ $4000 +;MActorDOM1 equ $5000 + + +; dc.w Menu0-IntroTables +; +;Menu0 +; dc.w 1,MDoIt+0 * do nothing +; dc.w 2,MActorM1+3 ; visit town/ride into town +; dc.w 0,0 * end of table + + +;------------- +.PrintMenu +; print menu with data starting at IntroTables(x4) + MaxHighlightEntry=0 + code - + + gosub @iStartPrinting + x6=0 ; set if any of messages printed involve spending money + code + +; messages to go to text box go here... +.PrintMenuLoop + &m1=IntroTables(x4) + if m1=0 then PrintMenuDone + if m1>49 then PML2 + x6=1 ; a message involves spending money +.PML2 + x1=MM + add m1,x1 + push x4 + gosub @SpecialPrintMenu + pop x4 + if m1=0 then PML3 + code - + message m1 + code + + add MaxHighlightEntry,c1 +.PML3 + add x4,c4 + goto PrintMenuLoop + +.PrintMenuDone + code - + if x6=0 then PMD2 ; no menu options involved spending money + message PlayersName + message 872 ; Billy had $ + print PlayerGold + message 873 ;. +.PMD2 + + cif TownOverlay + if MenuNumber<>174 then pmdNotBudget2 + message 464 ; [464:funds remaining: $] +; and Income in x5 + print PlayerGold ; gold remaining out of budget +;[465:income: $] +;[466:costs: $] + message 465 ; income + x1=200 + print x1 ; 200$/month at present + message 466 ; costs... + gosub @iCalcCostOfDeputies ; gets running cost in x3 + print x3 ; cost + + x1=SPFTexanPosseeAvailable ; number of members (byte) + x2=SubPlotFlags + add x1,x2 + x2=TownVarData(x1) ; number of deputies working for nothing + if x2=0 then pmdNotBudget2 + message 467 ; (including + print x2 + message 468 ; texan deputies) + +.pmdNotBudget2 + cend + HighlightY=0 ; so that EndPrinting will print transparent + if MaxHighlightEntry>1 then pmdEnd2 + HighlightY=65535 ; no highlight + +.pmdEnd2 + gosub @iEndPrinting + code + + return +;-------------- + + +;------------ +.MenuSprites +; called from display everything before the text box +; is displayed. +; Is a pretty menu displayed? + if PrettyMenuDisplayed<>true then @MSRet + + &WordWS(WordRasterOffset)=c0 +; if HighlightY>32000 then MSRet ; bar removed - e.g. for result message + if MaxHighlightEntry<2 then @MSRet ; bar removed - e.g. for result message +; if MaxHighlightEntry<2 then MSRet ; only one option - don't bother +;; with highlight. + + dv1=206 ; black box behind menu + if StructureFile=TownStructures then MS1 + dv1=97 ; black box behind structures +.MS1 + dv2=screenx + dv3=screeny ; z + dv4=0 + dv5=dPlot + dv6=0 ; non-reflected + + cif TownOverlay + if TextBoxDisplayed=99 then MSBigBox + if CurrentDO=99 then MSBigBox + if CurrentPrintRaster=2744 then MSBigBox ; for deputy's challenge + if CurrentPrintRaster<>594 then HighlightNotBigBox ; 12x7 +.MSBigBox +; unusual case - we need the hightlight/black box +; behind the big text box. It needs to be positioned slightly +; differently... + add dv2,c16 + if StructureFile=ArcadeStructures then MSBigBox2 + if StructureFile=IdentikitStructures then MSBigBox2 + if StructureFile=LinkingStructures then MSBigBox2 + add dv2,c16 ; intro, town structures need a greater move of highlight. +.MSBigBox2 + add dv4,c32 + if StructureFile=TownStructures then hBB2 + if StructureFile<>IdentikitStructures then HighlightNotBigBox +.hbb2 + sub dv2,c32 + sub dv2,c16 + add dv4,c16 + +.highlightNotBigBox + cend + + gosub @MCDrawObjectDv1 + + dv5=dPlot + dv6=0 ; non-reflected + sub dv4,HighlightY ; h=0-y in this unusual case. +; dv1=205 ; highlight bar. +; if StructureFile=TownStructures then MS2 + dv1=96 ; was98. ; highlight bar in Identikit structure file. + +.MS2 + gosub @MCDrawObjectDv1 + +.MSRet + return +;------------- +.DisplayNewMenu +; refresh screen to show the changes to the menu + PrettyMenuDisplayed=true +.DisplayNewTextBox + if PersonDisplayed=true then DNTB2 + UpdateACBs=false ; when on map etc. don't change acbs +.DNTB2 + push x4 + gosub @DisplayEverything ; make it visible + pop x4 + UpdateACBs=true ; back to normal mode again + PrettyMenuDisplayed=false + return +;------------- +.DisplayInstructions + m2=0 +.DisplayInstructionsM1M2 + gosub DisplayTextNoWait + gosub @WaitFireRelease ; wait for fire to be released, etc. + gosub @WaitFire +; fire pressed. + TextBoxDisplayed=0 + return +;--------------- +.DisplayTextNoWait + gosub @SetPrintMenu +.DisplayTextFunnyBox + MaxHighlightEntry=1 ; HighlightY=65535 ; remove highlight + code - + gosub @iStartPrinting +.DTFB2 + message m1 + message m2 +.DTFB3 + gosub @iEndPrinting + code + +.DisplayInstructions2 + gosub @DisplayNewTextBox + return +;------------ +.ActorM1NoWait + gosub @SetPrintMenu + code - + gosub @iStartPrinting + message PlayersName + goto DTFB2 ; display M1, finish up. + code + +;------------ +.DisplayTextBigBox + gosub SetBigBox + goto @DisplayTextFunnyBox ; display M1 in CurrentPrintRaster/CurrentDO +;--------------- +.SetBigBox + cif TownOverlay + if Newspaper=true then DTB2 + if StructureFile=IntroStructures then DTB2 ; don't change in intro! + cend + TextBoxWidth=170 + CurrentPrintRaster=2744 ; 12x7 + CurrentDO=99 ; was208 + if StructureFile=TownStructures then DTB2 + if StructureFile=BrawlStructures then DTB2 + if StructureFile=ArcadeStructures then DTB2 + CurrentPrintRaster=594 ; 12x7 + if StructureFile<>ScrollingStructures then DTB2 + CurrentPrintRaster=1001 ; big print raster + +.DTB2 + return +;--------------- +.ToFinalDuel + BillyLives=0 ; signal it's the final conflict + EnemyName=Pat + if PlayersName=Billy then ToDuel + EnemyName=Billy + +.ToDuel + v4=DuelBack + cif TownOverlay + PlayingDuel=true + goto @OverlayEntryPoint + cend + goto ToTownOverlayV4 +;-------------- +.GotoGameV1 +; v1=49 = '1' - map +; 50 = '2' - scrolling game +; 51 = '3' - bank robbery escape +; 52 = '4' - arcade game +; 53 = '5' - train game + + if v1<>49 then @MenuNotTown +.ReturnToMap + v4=GameMap ; parameter + +.ToTownOverlayV4 +; call town overlay with parameter v4 + push v4 + gosub @PutUpHourglass + cif TownOverlay + PlayingDuel=false + gosub @OpenTownStructures + x1=GameMap + v4=GameMap + goto @MenuGotScreen ; '1' - map + cend + break ;******* + v1=69 ; 'E' as in acodE.acd + pop v4 ; parameter to town overlay + +.CallOverlayV1 + push v4 ; corrupted on pC? + push v1 + gosub ClearKBD + pop v1 + gosub @MCPurgeAllCells + &WordWS(WordVBLDisabled)=c1 ; disable vbls during chain + push v1 + gosub @ClearKBD + pop v1 + pop v4 + v2=OverlayEntryOffset + gosub @MCCallOverlay + return +;------------------ +.ClearKBD + x1=100 ; countdown timer +.ClearKBD1 + sub x1,c1 + if x1=0 then ClearKBD2 + gosub @MCOsrdch + if v1<>0 then ClearKBD1 +.ClearKBD2 + FireKey=0 + return +;------------------ +.MenuNotTown + if v1=51 then MenuScrolling ; '3' - bank robbery escape + if v1<>50 then MenuNotScrolling ; '2' - scrolling game +.MenuScrolling + cif ScrollingOverlay + goto @OverlayRestart + cend + gosub @MCPurgeAllCells +.CallScrollingOverlay + v1=50 ; '2' + v2=OverlayEntryOffset +; v4 is parameter to overlay being called + gosub @MCCallOverlay +.MenuRet + return +;- +.MenuNotScrolling + if v1=53 then MenuArcades ; '5' - train game + if v1<>52 then MenuNotArcades ; '4' - arcade game +.MenuArcades + v4=v1 + cif ArcadesOverlay + goto @OverlayRestart + cend + gosub @MCPurgeAllCells + v1=51 ; '3' + v2=OverlayEntryOffset +; v4 is parameter to overlay being called + gosub @MCCallOverlay + return +;- +.MenuNotArcades + return +;------------- +.BuildPicture +; build picture dv1 in non-scrolling mode. + push dv1 + if CurrentScreen=BankGame then BP2 + if CurrentScreen<400 then BP1 ; not in town + if CurrentScreen<599 then BP2 ; in town - don't change currentScreen +.BP1 + prettyMenuDisplayed=false ; disable all MenuSprites + cif ArcadesOverlay + if CurrentScreen<620 then BPnotShootout + if CurrentScreen<628 then BP3 ; a shootout scene - try to +; get rid of this goddam stray text box. + +.BPNotShootout + cend ; ArcadesOverlay + + CurrentScreen=dv1 + +.BP2 +; TextBoxDisplayed=0 + gosub @PutUpHourglass +.BP3 + v1 = 640 ; 640 + v2 = 1240 ; 384 + v3=0 ; game mode: 0=non-scrolling, 1=scrolling, 2=jumps + gosub @InitScrolling + ScreenX=0 + ScreenY=0 + gosub @MCEmptyRoom + gosub @MCBuildRoom + gosub @MCEmptyRoom + gosub @InitACBs + ScrollXDir=0 + ScrollYDir=0 + pop dv1 + gosub @PreloadAndInsertDV1 + v1=0 + v2=0 + goto @MCBuildRoom ; gosub, return. +;--------- +.OpenLinkingStructures + push v4 + if StructureFile=LinkingStructures then OLO1 + TextBoxDisplayed=0 + PlayerACB=0 + v1=IntroTablesList + &v2=IntroTables(70) ; linking sprites filename + v3=1 ; 0=purge, 1=don't purge + gosub @OpenSpriteFile + &v1=IntroTables(72) ; linking structures filename + gosub @LoadStructuresV1 + StructureFile=LinkingStructures +.OLO1 + gosub @InitACBs + pop v4 + return +;---------- +.OpenIdentikitStructures + push v4 + if StructureFile=IdentikitStructures then OIO2 + if StructureFile=TownStructures then OIO1 ; same sprites file + PlayerACB=0 + gosub @MCPurgeAllCells + v1=IntroTablesList + &v2=IntroTables(34) ; map/town sprites filename + v3=1 ; 0=purge, 1=don't purge + gosub @OpenSpriteFile +.OIO1 + &v1=IntroTables(80) ; identikit structures filename + gosub @LoadStructuresV1 + StructureFile=IdentikitStructures + +.OIO2 + gosub @InitACBs + pop v4 + return +;------------------- +.DLPNoHourglass + push v4 + goto DLP2 +;------- +.DisplayLinkingPicture +; number v4, without menu +; This is unfortunate for pictures such as the nursing pic +; which has a bed in the foreground! + push v4 + gosub @PutUpHourglass + +.DLP2 + cif TownOverlay + PlayingDuel=false ; in duel, foreground graphics are disabled. + cend + TextBoxDisplayed=0 + PrettyMenuDisplayed=0 + gosub @MCPurgeAllCells + gosub @OpenLinkingStructures + pop v4 + dv1=v4 ; 1=bank, 2=grave, 3=prospector, 6=fort. + gosub @BuildPicture + gosub @DisplayEverything + gosub @PutUpHourglass + return +;---------- +.LinkingPictureWait + gosub @DisplayLinkingPicture + goto @WaitFireAndDisplay ; gosub, return +;------------- +.SpecialInitACBs +; select between normal acb area and +; the high area used for talking to people (e.g. whilst +; walking around) + UpdateACBs=true + ACBStart=0 ; ConstACBSearchStart + ACBSearchStart=ConstACBSearchStart + ACBEnd=ConstACBEnd ; end within ACBList + cif TownOverlay + if StructureFile<>IdentikitStructures then SIA2 + ACBSearchStart=ConstTTPACBStart + ACBStart=ConstTTPACBStart + ACBEnd=ConstTTPACBEnd + +.SIA2 + cend + return +;------------- +.NewMenuForPerson +; next time Player talks to person x1, use menu MenuNumber + add x1,x1 + add x1,x1 + add x1,x1 + add x1,x1 + add x1,PeopleVarData ; get offset in TVD +.NewMenuForPersonTVDx1 + v1=x1 + x1=PeoplePatMenuOffset +; if PlayersName=Pat then NMFP2 +; x1=PeopleBillyMenuOffset +.NMFP2 + add v1,x1 + v2=MenuNumber + goto @UpdateVarDataWord ; gosub, return +;---------- +.KillGangAtTownX4 +.bringLawToTown +; town x4 has become lawful - so remove it from the map etc. + +; was Billy's gang there? + if x4<>playerGang then BLTT2 + PlayerGang=0 + +.BLTT2 + gosub @IsTownLawful + v2=c1 ; lawful + v1=x1 + gosub @UpdateVarDataByte ; TownVarData(x1)=c1 ; lawful + ExtraNewsStory=400 + add ExtraNewsStory,x4 ; story about town becoming lawful + cif TownOverlay + if x4<16 then PI2 + if PlayersName=Billy then @LoseGame + if PlayersName=Pat then @ToFinalDuel ; WinGame + cend + +.PI2 + x1=SPGangsOffset + add x1,SubPlotsOffset + &x1=TownVarData(x1) ; x4 is now start of subplot data word pairs + x2=x4 + x3=SantaFe + sub x2,x3 ; take off first town to get gang (0..5) + + NextMeetingMenu=260 ; menu for first gang + x3=x2 + add x3,x3 ; twice gang number (0..5) to get offset into menus + add nextMeetingMenu,x3 + +; 8 words per enty in subplot data, so times 16 + add x2,x2 + add x2,x2 + add x2,x2 + add x2,x2 + add x1,x2 +; &TVD(x1) is now visible/invisible flag for this town + v2=254 ; invisible/unobtainable + v1=x1 + gosub @UpdateVarDataWord ; &TownVarData(x1)=v2 + v1=CommsRedisplayMap + goto @WriteSerial ; request other machine to redisplay +; the map if it's currently displayed +;----------- +.IsTownLawful +.GetLocationData +; is town object x4 (10..15) lawful? +; Return x2=TVD(x1) as flag: 0 if lawless, 1 if lawful +; (This routine also used to find objectsInformation offset:x1 +; for other objects: e.g. ranches) +; Each town has the following variable table +; which is part of ObjectsInformation: 8 bytes each +; (i.e. 8 bytes per object, including e.g. cows, gangs) +;LawfulOffset equ 0 +; .b 0 if lawless, 1 if lawful +; Happiness offset equ 1 +; .b How happy the town is: starts at 128 (moderately happy) +; to 0 (completely unhappy) and up to 255 (ecstatic) + x1=x4 + add x1,x1 + add x1,x1 + add x1,x1 ; times 8 + add x1,ObjectsInformation +; +(LawfulOffset=0) + x2=TownVarData(x1) + return +;--------------- +.DisplayNursingPicture +; (Called from all parts) +; take away part of the player's reputation + sub PlayerReputation,c16 + + HourglassState=0 + PrettyMenuDisplayed=0 + TextBoxDisplayed=0 + v4=17 ; nursing picture + gosub @DLPNoHourglass + m1=PlayersName + m2=1864 ; nursing message + gosub @DisplayInstructionsM1M2 + + if PlayersName<>Billy then NotBillyLoseLife + sub BillyLives,c1 + if BillyLives>0 then NotBillyLoseLife + m1=1865 ; Pat burst in + m2=1866 ; Billy, we gotta finish it right now... + gosub @DisplayInstructionsM1M2 + CurrentScreen=430 ; force it to Santa Fe, regardless of where we were + EnemyName=Pat ; make it the final duel + goto @ToDuel + +.NotBillyLoseLife + HourglassState=0 ; ensure hourglass is redisplayed + gosub @PutUpHourglass + return +;---------- +.FreezeAndPutUpHourglass + WantCSTB=true + HourglassState=0 + UpdateACBs=false ;18 Jan 1991 + gosub @DisplayEverything ; freeze people in saloon + gosub @InitACBs + TextBoxDisplayed=0 + +.PutUpHourglass + if HourglassState=2 then PUHRet ; already displayed? +;; if CurrentScreen=SelectPlayerScreen then PUHRet + if CurrentScreen=0 then PUHRet + HourglassState=1 ; we want to display it + push UpdateACBs + push dv1 + UpdateACBs=false ; don't change any sprites + gosub @DisplayEverything + pop dv1 + pop UpdateACBs + +.PUHRet + return +;------------------ +.DisplayHourglass + if StructureFile=BrawlStructures then DHRet ; no hourglass in +; brawl structure file. + if WantCSTB=true then DHRet ; don't freeze hourglass + if HourglassState=false then BANoHourglass + if TextBoxDisplayed<>0 then BANoHourglass ; don't do hourglass when +; text box is going to be displayed +;;; if CurrentScreen=SelectPlayerScreen then BANoHourglass + if CurrentScreen=0 then BANoHourglass + dv1=HourglassObject + dv2=ScreenX ; x + dv3=ScreenY ; z + dx1=120 ; move hourglass up to top left. + sub dv2,dx1 + dx1=80 ; increase z coord + add dv3,dx1 + dv4=160 ; h =z+80m to move hourglass to top left. + + &WordWS(WordRasterOffset)=c0 + dv5=dPlot + dv6=0 ; reflect + gosub @MCDrawObjectDV1 + HourglassState=2 ; now displayed +.BANoHourglass +.DHRet + return +;----------------- +.AdjustDifficulty +; return x1 and x2 such that IF X1>X2 then PlayerInTrouble +code- + random x1 +code+ + x3=Difficulty ; standard is 256 + asr x3 + asr x3 + asr x3 ; x3 is related to dificulty, standard difficulty gives 32. + x2=190 + sub x2,x3 ; -> x2=150 at standard difficulty, decreases progressively + if x2>40 then mef2 + x2=40 ; limit difficulty +.mef2 + return +;---------- +.WinGame + x1=100 ; bonus for winning final duel + add PlayerReputation,x1 + if PlayerReputation<600 then LoseGame + if TwoPlayerMode=false then WinGame1 + gosub @AnnounceWin +.WinGame1 + v4=19 ; Pat/girl + if PlayersName=Pat then WinGame2 + v4=18 ; Billy/Girl +.WinGame2 + HourglassState=0 + gosub @DisplayLinkingPicture ; load linking structure file, +; open sprites file, and build the picture we've asked for(v4). + m1=1811 ; Pat win + if PlayersName=Pat then LoseGame2 + m1=1850 ; Billy win + goto LoseGame2 +;---------- +.LoseGame + if TwoPlayerMode=false then LoseGame1 + gosub @AnnounceLoss +.LoseGame1 + v4=2 ; grave piccy + HourglassState=0 + gosub @DisplayLinkingPicture ; load linking structure file, +; open sprites file, and build the picture we've asked for(v4). + m1=1812 ; Pat lose + if PlayersName=Pat then LoseGame2 + m1=1851 ; Billy lose +.LoseGame2 +; gosub @WaitFireRelease +; gosub @WaitFire +; gosub @WaitFireRelease + gosub @WaitTimeOrFire + + ScreenX=16 ; move text box right a bit, to avoid hiding the lovers/grave + gosub @DisplayInstructions + + +; display rating +;[1920:Billy's final reward was $] +;[1921:out of a maximum of about $5000, and he will ] ;^^^^ +; +;[1922:not be remembered. ] +;[1923:be a dim memory. ] +;[1924:be a figure of fun. ] +;[1925:be remembered by many. ] +;[1926:be remembered by most. ] +;[1927:be a minor hero. ] +;[1928:be a popular hero. ] +;[1929:be a household name till the end of time. ] +; +;[1930:Pat's final popularity was ] +;[1931:out of a maximum of about 5000, and he will ] ;^^^^ + code - + gosub @iStartPrinting + m1=1920 ; final reward + if PlayersName=Billy then DisRat2 + m1=1930 ; final popularity +.DisRat2 + message m1 + gosub @iValidateReputation ; check it's in range + print PlayerReputation + add m1,c1 + message m1 + m1=1922 + if PlayerReputation<200 then DisRat3 + m1=1923 + if PlayerReputation<250 then DisRat3 + m1=1924 + if PlayerReputation<400 then DisRat3 + m1=1925 ; first reasonable-sounding rating. + if PlayerReputation<600 then DisRat3 + m1=1926 + if PlayerReputation<900 then DisRat3 + m1=1927 + if PlayerReputation<1400 then DisRat3 + m1=1928 + if PlayerReputation<2500 then DisRat3 + m1=1929 +.DisRat3 + message m1 + gosub @iEndPrinting + code + + gosub @DisplayNewTextBox + gosub @WaitFire + + cif TownOverlay + goto @PlayAgain + cend + v4=CodeRestartGame + goto @ToTownOverlayV4 +;------------ +;---------- +.WaitTimeOrFire + gosub @WaitFireRelease + FrameCount=0 +.WTOF1 + gosub @sGetControls + if FireKey<>0 then WTOF2 + if FrameCount<100 then WTOF1 +.WTOF2 + gosub @WaitFireRelease + return +;------------ +.ConvertScrollToJump +; Convert ScrollXDir, ScrollYDir to suitable jump sizes +; if this is a jump-scrolling driver (PC only) + if SmoothScroller<>0 then CSTJRet + push v1 + push v2 + push v3 + push v4 + if ScrollXDir=0 then CSTJ2 + v3=64 ; positive step size + v4=65472 ; negative step size + cif ScrollingOverlay +; tracking game etc. uses smaller jump size, to avoid +; oscillation. + v3=40 + v4=65496 ; negative step size + cend + cif ArcadesOverlay +; train game etc. uses smaller jump size, to avoid +; oscillation. + v3=40 + v4=65496 ; negative step size + cend + + v1=v3 + if ScrollXDir<32000 then CSTJ1 + v1=v4 + +.CSTJ1 + ScrollXDir=v1 + +.CSTJ2 + if ScrollYDir=0 then CSTJ4 + v2=v3 + if ScrollYDir<32000 then CSTJ3 + v2=v4 + +.CSTJ3 + ScrollYDir=v2 +.CSTJ4 + pop v4 + pop v3 + pop v2 + pop v1 + +.CSTJRet + return +;--------- +.MaybeJump +; we've done COnvertScrollToJump, come here +; with v1,v2=direction of scroll asked for. Do a suitable rebuild. +; old v1,v2 are on stack. + ScrollDirectionDone=0 + PlotLogicalDone=0 + + IF V1<>0 then MJ2 + if v2=0 then MJEnd +.MJ2 + add ScreenX,v1 + add ScreenY,v2 + v1=ScreenX + v2=ScreenY + gosub @MCBuildRoom +.MJEnd + cif pc + v1=0 + v2=0 + gosub @MCScrollDirection ; to keep the flow checker happy + cend + pop v2 ; ;remove values pushed in DisplayEverythin + pop v1 + return +;------- +.InitScrolling + gosub @MCInitScrolling + cif pc +; need to do SetGraphicsWindow for PC, even though game is scrolling + v1=0 ; X1 + v2=319 ; X2 + v3=0 ; Y1 + v4=191 ; Y2 + gosub @MCSetGraphicsWindow + cend + ScrollXDir=0 + ScrollYDir=0 + return +;---------- +.EmptyRoomEtc + cif TownOverlay + if CurrentScreen=SelectPlayerScreen then @NoClearScreen ; display selection +; window on top of the relevant bit of the intro + cend + v1 = 800 ; 640 + v2 = 1240 ; 384 + v3=1 ; game mode: 0=non-scrolling, 1=scrolling, 2=jumps + cif TownOverlay + if CurrentScreen=GameMap then IS1 + if CurrentScreen=IntroScreen then IS1 + v3=0 ; non-scrolling for all others + cend +.IS1 + gosub @InitScrolling + gosub @MCEmptyRoom + +.NoClearScreen + return +;------------------ +.LoadGameData +; v1=65 (town), 50('2'=scrolling) or 51('3'=arcades) +; Convert to correct number for language. + x1=v1 + if Language=German then LGDGerman + if Language=French then LGDFrench + +.LGDMC + goto @MCLoadGameData + + +.LGDGerman +; Convert to... +; v1=52 ('4'town), 53('5'=scrolling) or 54('6'=arcades) + v1=53 + if x1=50 then LGDMC + v1=54 + if x1=51 then LGDMC + v1=52 ; default to town + goto LGDMC + +.LGDFrench +; Convert to... +; v1=55 ('7'town), 56('8'=scrolling) or 57('9'=arcades) + v1=56 + if x1=50 then LGDMC + v1=57 + if x1=51 then LGDMC + v1=55 ; default to town + goto LGDMC + +;----------- + code - +.iValidateReputation ; check it's in range + if PlayerReputation<32000 then iVRRet + PlayerReputation=2 + +.iVRRet + return + code + +;------- +.OpenSpriteFile + gosub @MCOpenSpriteFile + goto @SetCGAPalettes ; cleared by MCOpenSpritesFile +;------------ diff --git a/l9dev/regress/games.l9/billy.l9/menudata.txt b/l9dev/regress/games.l9/billy.l9/menudata.txt new file mode 100644 index 0000000..04a3e82 --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/menudata.txt @@ -0,0 +1,979 @@ +; MENUDATA.TXT +; +; included from table.txt in all parts of game. +; +; Mike Austin August 1990. +; +; Copyright (C) 1990 Level 9 Computing Ltd. +; +; +MenuStructures +; menu data for game. Each entry contains two words: +; .w Message number of appear on menu, relative to MM (0 if +; end of this menu) +; .w (1) MDoIt + return code. +; (2) MMenu + Offset of menu to go to if item selected. 0 to +; quit menus +; (3) MPrintM1 + Message number to print in response, relative to MM +; A further click returns to the previous menu +; (4) MActorM1 + Message number. As MResp, but puts +; (Billy/Pat) at start of message. +; (5) MPrintDOM1 + Message number to print in response, relative to MM +; the offset from MM is then return as a return code. +; (6) MActorDOM1 + Message number. As MResp, but puts +; (Billy/Pat) at start of message. +; the offset from MM is then return as a return code. + +LoseRepMessage equ 907 ; message checked for to reduce player's +; reputation by a bit (When no specific message is printed) + +MDoIt equ $0000 +MPrintM1 equ $1000 +MActorM1 equ $2000 +MMenu equ $3000 +MPrintDOM1 equ $4000 +MActorDOM1 equ $5000 +MSpecial equ $6000 * used for e.g. die. Bottom bits are parameter: +Die equ 1 +FFF equ $0fff + +MM equ 600 ; first message number used in menu data + dc.w Menu0-IntroTables ; click on town main menu + dc.w Menu2-IntroTables ; click on town sub-menu (debug) + dc.w Menu4-IntroTables ; click on town sub-menu (debug) + DC.W Menu6-IntroTables ; click on train + DC.W Menu8-IntroTables ; click on wagon train + DC.W Menu10-IntroTables ; click on apache + dc.w Menu12-IntroTables ; click at bar + dc.w Menu14-IntroTables ; click at call girl + dc.w Menu16-IntroTables ; player meets someone + dc.w Menu18-IntroTables ; general yes/no question. Returns 0 if no + dc.w Menu20-IntroTables ; debugging menu for Billy + dc.w Menu22-IntroTables ; debugging menu for Pat + dc.w Menu24-IntroTables ; + dc.w Menu26-IntroTables ; rob bank menu for Billy + dc.w Menu28-IntroTables ; Hello stranger (Billy) + dc.w Menu30-IntroTables ; Hello stranger (Pat) + dc.w Menu32-IntroTables ; "we've been robbed" + dc.w Menu34-IntroTables ; "we've been robbed by someone not Billy" + dc.w Menu36-IntroTables ; Hello again + dc.w 0 ;Menu38-IntroTables ; + dc.w 0 ;Menu40-IntroTables ; + dc.w 0 ;Menu42-IntroTables ; + dc.w 0 ;Menu44-IntroTables ; + dc.w 0 ;Menu46-IntroTables ; + dc.w 0 ;Menu48-IntroTables ; + dc.w Menu50-IntroTables ; + dc.w Menu52-IntroTables ; + dc.w Menu54-IntroTables ; + dc.w Menu56-IntroTables ; + dc.w Menu58-IntroTables ; + dc.w Menu60-IntroTables ; + dc.w Menu62-IntroTables ; + dc.w Menu64-IntroTables ; + dc.w Menu66-IntroTables ; + dc.w Menu68-IntroTables ; + dc.w Menu70-IntroTables ; + dc.w Menu72-IntroTables ; + dc.w Menu74-IntroTables ; + dc.w Menu76-IntroTables ; + dc.w Menu78-IntroTables ; + dc.w Menu80-IntroTables ; + dc.w Menu82-IntroTables ; + dc.w Menu84-IntroTables ; + dc.w Menu86-IntroTables ; + dc.w Menu88-IntroTables ; + dc.w Menu90-IntroTables ; + dc.w Menu92-IntroTables ; + dc.w Menu94-IntroTables ; + dc.w Menu96-IntroTables ; + dc.w Menu98-IntroTables ; + dc.w Menu100-IntroTables ; + dc.w Menu102-IntroTables ; + dc.w Menu104-IntroTables ; + dc.w Menu106-IntroTables ; + dc.w Menu108-IntroTables ; + dc.w Menu110-IntroTables ; + dc.w Menu112-IntroTables ; + dc.w Menu114-IntroTables ; + dc.w Menu116-IntroTables ; + dc.w Menu118-IntroTables ; + dc.w Menu120-IntroTables ; + dc.w Menu122-IntroTables ; + dc.w Menu124-IntroTables ; + dc.w Menu126-IntroTables ; + dc.w Menu128-IntroTables ; + dc.w Menu130-IntroTables ; + dc.w Menu132-IntroTables ; + dc.w Menu134-IntroTables ; + dc.w Menu136-IntroTables ; + dc.w Menu138-IntroTables ; + dc.w Menu140-IntroTables ; + dc.w Menu142-IntroTables ; + dc.w Menu144-IntroTables ; + dc.w Menu146-IntroTables ; + dc.w Menu148-IntroTables ; + dc.w Menu150-IntroTables ; + dc.w Menu152-IntroTables ; + dc.w Menu154-IntroTables ; + dc.w Menu156-IntroTables ; + dc.w Menu158-IntroTables ; + dc.w Menu160-IntroTables ; + dc.w Menu162-IntroTables ; + dc.w Menu164-IntroTables ; + dc.w Menu166-IntroTables ; + dc.w Menu168-IntroTables ; + dc.w Menu170-IntroTables ; + dc.w Menu172-IntroTables ; + dc.w Menu174-IntroTables ; + dc.w Menu176-IntroTables ; + dc.w Menu178-IntroTables ; + dc.w Menu180-IntroTables ; + dc.w Menu182-IntroTables ; + dc.w Menu184-IntroTables ; + dc.w Menu186-IntroTables ; + dc.w Menu188-IntroTables ; + dc.w Menu190-IntroTables ; + dc.w Menu192-IntroTables ; + dc.w Menu194-IntroTables ; + dc.w Menu196-IntroTables ; + dc.w Menu198-IntroTables ; + dc.w Menu200-IntroTables ; + dc.w Menu202-IntroTables ; + dc.w Menu204-IntroTables ; + dc.w Menu206-IntroTables ; + dc.w Menu208-IntroTables ; + dc.w Menu210-IntroTables ; + dc.w Menu212-IntroTables ; + dc.w Menu214-IntroTables ; + dc.w Menu216-IntroTables ; + dc.w Menu218-IntroTables ; + dc.w Menu220-IntroTables ; + dc.w Menu222-IntroTables ; + dc.w Menu224-IntroTables ; + dc.w Menu226-IntroTables ; + dc.w Menu228-IntroTables ; + dc.w Menu230-IntroTables ; + dc.w Menu232-IntroTables ; + dc.w Menu234-IntroTables ; + dc.w Menu236-IntroTables ; + dc.w Menu238-IntroTables ; + dc.w Menu240-IntroTables ; + dc.w Menu242-IntroTables ; + dc.w Menu244-IntroTables ; + dc.w Menu246-IntroTables ; + dc.w Menu248-IntroTables ; + dc.w Menu250-IntroTables ; + dc.w Menu252-IntroTables ; + dc.w Menu254-IntroTables ; + dc.w Menu256-IntroTables ; + dc.w Menu258-IntroTables ; + dc.w Menu260-IntroTables ; + dc.w Menu262-IntroTables ; + dc.w Menu264-IntroTables ; + dc.w Menu266-IntroTables ; + dc.w Menu268-IntroTables ; + dc.w Menu270-IntroTables ; + dc.w Menu272-IntroTables ; + dc.w Menu274-IntroTables ; system menu + dc.w Menu276-IntroTables ; player selection for two-player game. + + +; general message ranges: +; MM+1..MM+49: involve spending money +; MM+50..MM+99: are the menu options themselves +; MM+100..MM+149: involve chaining to a new overlay + +; if a person gets to menu 0..8, this becomes their default menu + +Menu0 + dc.w 51,MDoIt+0 * do nothing + dc.w 50,MDoIt+1 * back to map + dc.w 0 * end of table + +Menu2 +; normal 'second time meeting' menu. Same as first time meeting, +; but get "Oh, it's you again" type message at the start. + dc.w 957-MM,MMenu+16 * drop into normal conversation +;[957:Oh, it's you again. ] ; ||| meet someone again that you +; haven't been introduced to. + dc.w 0 + +Menu4 +ClearOffMenu equ 4 + dc.w 958-MM,MDoIt+0 * back to walkabout/map +;[958:Clear off buster, I don't associate with your kind. ] ;||| +; meet someone again who we didn't get on with last time! + dc.w 0 + +Menu6 +;[671:English `] ; menu option +;[672:Deutsch `] ; menu option +;[673:Fran‡ais `] ; menu option + dc.w 671-MM,MDoIt+1 + dc.w 672-MM,MDoIt+2 + dc.w 673-MM,MDoIt+3 + dc.w 0 + +Menu8 + +Menu10 +* used when player is talking to someone, and has bribed them already +* then we get this menu. +* See also Menu16, 24 + dc.w 62,MDoIt+0 * move on + dc.w 60,MDoIt+60 ; talk + dc.w 61,MDoIt+61 ; threaten + dc.w 0 + +Menu12 +* used when click at bar + dc.w 62,MDoIt+0 * move on + dc.w 50,MDoIt+1 * back to map +;; dc.w 6,MDoIt+0 * beer + dc.w 656-MM,657-MM ; [656:RAISE HELL. `], [657:Yeehaa... ] + dc.w 1,MActorDoM1+253 * buy round of drinks + dc.w 0 + +Menu14 +* used when click at call girl + dc.w 62,MDoIt+0 * move on + dc.w 2,MActorDoM1+254 * go upstairs with the girl + dc.w 0 + +Menu16 +* used when player meets someone for the first time. A greeting message, +* probably chosen from 951 to 957 is printed, +* then we get this menu. +* See also Menu24 + dc.w 62,MDoIt+0 * move on + dc.w 59,MDoIt+59 ; hello + dc.w 60,MDoIt+60 ; talk + dc.w 61,MDoIt+61 ; threaten + dc.w 3,MActorDoM1+255 * offer bribe + dc.w 0 + +Menu18 +* General yes/no: used e.g. when +* someone has offered Billy a part in some sort of robbery. + dc.w 54,MDoIt+54 * yes + dc.w 55,MDoIt+0 * no: return 0 + dc.w 0 + +Menu20 + +Menu22 +* menu when challenged to a duel. + dc.w 63,MPrintDOM1+904-MM * accept + dc.w 64,MPrintDoM1+905-MM * climb down + dc.w 0 + +Menu24 +* used when player meets someone again. A greeting message, +* probably chosen from 920 to 960 is printed, +* then we get this menu. +* See also Menu16 + dc.w 62,MDoIt+0 * move on + dc.w 60,MDoIt+60 ; talk + dc.w 61,MDoIt+61 ; threaten + dc.w 3,MActorDoM1+255 * offer bribe + dc.w 0 + +Menu26 +* used when Billy goes into a bank. +* + dc.w 62,MDoIt+0 * move on + dc.w 59,MDoIt+59 ; hello + dc.w 60,MDoIt+60 ; talk + dc.w 65,MDoIt+257 ; MPrintDoM1+257 ; Rob the Bank + dc.w 0 + + +Menu28 +* hello stranger (Billy) + dc.w 920-MM,MMenu+16 * intro message (modified by code depending +* on alignment of person) + dc.w 0 + +Menu30 +* hello stranger (Pat) + dc.w 920-MM,MMenu+16 * intro message (modified by code depending +* on alignment of person) + dc.w 0 + +Menu32 +* We've been robbed (by Billy) + dc.w 870-MM,MMenu+26 * intro message (modified by code depending +* on alignment of person) + dc.w 0 + +Menu34 +* We've been robbed (by another gang, not involving Billy) + dc.w 871-MM,MMenu+26 * intro message (modified by code depending +* on alignment of person) + dc.w 0 + +Menu36 +* hello again (actual message printed is changed by code +* in SpecialPrintMenu) + dc.w 920-MM,MMenu+24 * intro message (modified by code) + dc.w 0 + +Menu50 +* first sub-plot menu: Mexican peasant being run off his +* land by Anglo ranchers... + dc.w 1500-MM,MMenu+52 * help! + dc.w 0 + +Menu52 +* options: yes/no + dc.w 54,MPrintDoM1+1540-MM * start gunfight: message number +* group: intro/win/lose + dc.w 55,MPrintDoM1+1501-MM * a thousand curses! + dc.w 0 + +Menu54 +* lady in saloon being pestered by gunslinger... + dc.w 1503-MM,MMenu+56 * help! + dc.w 0 + +Menu56 +* Will you challenge him? (From 54) + dc.w 54,MPrintDoM1+1570-MM * start duel: message number +* group: intro/win/lose + dc.w 55,MPrintDoM1+1504-MM * a thousand curses! + dc.w 0 + +Menu58 +* mexican picked on by cowboys... + dc.w 1506-MM,MMenu+60 * help! + dc.w 0 + +Menu60 +* options: yes/no + dc.w 54,MPrintDoM1+1508-MM * we'll get you for this... + dc.w 55,MPrintDoM1+1507-MM * disappointed + dc.w 0 + +Menu62 +* sick man in desert... + dc.w 1509-MM,MMenu+64 * help! + dc.w 0 + +Menu64 + * options: yes/no + dc.w 54,MPrintDoM1+1700-MM * man got on (take to santa fe for bonus) + dc.w 55,MPrintDoM1+1510-MM * man collapsed again + dc.w 0 + + + + +Menu66 +* soldier at Fort Sumner - army are being cheated on meat contract + dc.w 1512-MM,MMenu+68 * army are being cheated. + dc.w 0 + +Menu68 +* we need proof (stays in this state until get proof) + dc.w 1517-MM,MDoIt+1517-MM + dc.w 0 + + +Menu70 +; Pat is about to defeat a gang in a shootout, +; their leader calls a truce and barters their escape + dc.w 1520-MM,MMenu+72 * gang leader calles out: + dc.w 0 + +Menu72 +;[1521:"Pat - let us go and we'll tell you if Billy leads +;us on a robbery". ] +;[1522:"Pat - let us go and we'll leave the territory". ] +;[1523:"Pat - let us go and we'll tell you where there is a stash of +;buried gold". ] + dc.w 1521-MM,MMenu+74 * offer (modified by code) + dc.w 0 + +Menu74 +* options: yes/no +; and responses to 1521..1523 if Pat accepts the offer... +;[1524:"thanks Pat - we'll be in touch". They rode off. ] +;[1525:"buenos dias Senor - we'll head for Mexico". ] +;[1526:"It's on the east side of the Pecos, at a deserted prospector's +;site". They rode off. ] + dc.w 54,MPrintDoM1+1524 * yes - response (choice of 3) + dc.w 55,MPrintDoM1+1501-MM * no + dc.w 0 + +Menu76 +; Pat meets Texan possee in desert. Player can choose to +; lie that Billy has stolen Texan cattle. +;[1529:Pat met a Texan possee looking for cattle thieves. What did +;he tell them about Billy? ] ; intro message + dc.w 1529-MM,MMenu+78 + dc.w 0 + +Menu78 +;[1530:Billy steals Texan Cattle. `] +;[1531:Billy is an outlaw. ] ; menu options - keep short. +;[1532:the possee offered their services as deputies - at least +;for a while. ] ; Pat lies about Billy stealing Texan cattle +;[1533:the possee offered Pat good fortune, but unfortunately +;they could not help. ] ; Pat says Billy is an outlaw only. + dc.w 1531-MM,MPrintDoM1+1533-MM * Billy is an outlaw + dc.w 1530-MM,MPrintDoM1+1532-MM * Billy steals + dc.w 0 + +;[1534:"that Texan Possee got a telegram and had to leave in +;a hurry". ] ; comment from deputy at sheriff's office. + +Menu80 +; Barney Mason reports the escape of an outlaw +; from Santa Fe - Pat can track him unaided for a reward. +;[1535:Barney Mason rode up. "Pat - an outlaw has just escaped from Santa +;Fe. Come with me now, and I'll put you on his trail. "] +;[1536:Barney rode off. ] ; no to 1535 +;[1537:Barney lead Pat at high speed to the head of a winding +;valley, then left him to track the escapee on his own. ] ; yes to 1535 + dc.w 1535-MM,MMenu+82 + dc.w 0 + +Menu82 + dc.w 54,MPrintDoM1+1537-MM * yes + dc.w 55,MPrintDoM1+1536-MM * no + dc.w 0 +;[1538:Pat took in the outlaw and claimed the $100 reward. ] ; get +; the outlaw. + +; Mayor accosts Pat... +Menu84 + dc.w 1600-MM,MMenu+86 + dc.w 0 + +Menu86 + dc.w 54,MPrintDoM1+1601-MM * yes + dc.w 55,MPrintDoM1+1602-MM * no + dc.w 0 + +; Mayor accosts Pat... +Menu88 + dc.w 1605-MM,MMenu+90 + dc.w 0 + +Menu90 + dc.w 54,MPrintDoM1+1606-MM * yes + dc.w 55,MPrintDoM1+1607-MM * no + dc.w 0 + + +; BILLY ONLY ENCOUNTERS +; meet Indian - where's the beef? +Menu92 + dc.w 1610-MM,MDoIt+1610-MM + dc.w 0 + +Menu94 + dc.w 1612-MM,MMenu+96 *thanks Billy - we'll fake an uprising for you + dc.w 0 + +Menu96 + dc.w 50,MDoIt+1 * back to map + dc.w 1613-MM,MPrintDoM1+1614-MM * yes Billy - we fake uprising + dc.w 0 + +; normal menu for Indian +Menu98 + dc.w 50,MDoIt+1 * back to map + dc.w 0 + + + +; Meet WIdow Woman +Menu100 +WidowWomanMenu equ 100 + dc.w 1620-MM,MMenu+102 * I want all your money, and I want it now + dc.w 0 + +Menu102 + dc.w 54,MPrintDoM1+1622-MM * yes + dc.w 55,MPrintDoM1+1623-MM * no + dc.w 0 + +; peasant meets Billy and asks him to nurse family +Menu104 + dc.w 1630-MM,MMenu+106 * help me! + dc.w 0 + +Menu106 + dc.w 54,MMenu+108 * yes + dc.w 55,MPrintDoM1+1632-MM * no + dc.w 0 + +Menu108 + dc.w 1631-MM,MPrintDoM1+1701-MM * Billy rode off with peasant, helped. + dc.w 0 + +; Cooper offers Billy counterfeit money as his share in a robbery +Menu110 + dc.w 1650,MMenu+112 *want money? + dc.w 0 + +Menu112 + dc.w 54,MMenu+114 * yes + dc.w 55,MPrintDoM1+1654-MM * no + dc.w 0 + +Menu114 + dc.w 1651-MM,MMenu+116 * how to spend the money? + dc.w 0 + +Menu116 + dc.w 1653-MM,MDoIt+1653-MM * spend it normally + dc.w 1652-MM,MDoIt+1652-MM * buy cattle with it -> rustling game + dc.w 0 + +; in saloon, hear some conversation about Brady going +; to murder McSween +Menu118 + dc.w 1660-MM,MMenu+120 ; overhears conversation + dc.w 0 + +Menu120 + dc.w 1661-MM,MMenu+122 ; what to do? + dc.w 0 + +Menu122 + dc.w 1662-MM,MDoIt+1662-MM ; nothing + dc.w 1663-MM,MPrintDoM1+1664-MM ; stop Brady + dc.w 0 + +; Jose interrupts player looking at Map +Menu124 + dc.w 1670-MM,MMenu+126 ; hi - will you help McSween + dc.w 0 + +Menu126 ; McSween-specific + dc.w 1662-MM,MDoIt+1662-MM ; nothing + dc.w 1671-MM,MPrintDoM1+1672-MM * go there + dc.w 0 + +; meet Joe Grant, Drunk, in a saloon. +Menu128 + dc.w 1674-MM,MMenu+152 ; examine this pistol, Billy + dc.w 0 + +Menu130 + dc.w 1662-MM,MDoIt+0 ; nothing + dc.w 1676-MM,MPrintDoM1+1677-MM * turned barrel to empty chamber + dc.w 0 + +; meet hostile soldier (changed by SpecialPrintMenu for Pat) +Menu132 + dc.w 1680-MM,MDoIt+0 * buzz off + dc.w 0 + +Menu134 +; meet Mrs McSween + dc.w 1681-MM,MPrintDoM1+1682-MM ; hello Billy/gotta rush + dc.w 0 + +Menu136 +; meet prospector + dc.w 1683-MM,MMenu+16 * why have you stopped me panning? + dc.w 0 + +Menu138 +; do you want to take cows to Indians? + dc.w 1611-MM,MMenu+140 + dc.w 0 + +Menu140 + dc.w 666-MM,MPrintDoM1+760-MM ; steal cows + dc.w 667-MM,MActorDoM1+764-MM ; take cows to Apaches + dc.w 0 + +Menu142 + dc.w 802-MM,MDoIt+0 ; in bordello + dc.w 0 + +;[1855:Hey Billy, come share some coffee with us... ] ;||| then 1856 +;[1856:Billy sat down with gang and talked of daring deeds +;and famous crimes. Then he asked the crucial question... +;"I've got a real sweet job planned. You want in?". The gang +;looked at Billy. Should they trust this young hotblood? ] ;||| +;; 1856, gang leader's name, 1857 ||| +;[1857:spoke "Sure, but we'll want a good big cut. Now get out of +;here before I change my mind". ] ;||| +;; gang names to go between 1856 and 1847 +;[1858:Cooper ] ; 41 Santa Fe |||| +;[1859:The Regulators' leader ] ; 42 White Oaks |||| +;[1860:The Seven Rivers Gang leader ] ; 43 Lincoln City |||| +;[1861:Dona Ana ] ; 44 Mesilla ||| +;[1862:Jesse Evans ] ; 45 Roswell ||| +;[1863:The fugitives' leader ] ; 46 El Paso ||| + +Menu144 + dc.w 1855-MM,MMenu+146 ; meet gang + dc.w 0 + +Menu146 + dc.w 1856-MM,MMenu+148 + dc.w 0 + +Menu148 + dc.w 1857-MM,MDoIt+1857-MM * sure, but we'll want a big cut. + dc.w 0 + +Menu150 +; visit gang again message: prints message 1858, quits + dc.w 1858-MM,MDoIt+0 * hello again billy + dc.w 0 + + +; meet Joe Grant, Drunk, in a saloon. CONTINUED +Menu152 + dc.w 1675-MM,MMenu+130 ; examine this pistol, Billy + dc.w 0 + + +;Menus for Ash Upton at store in Roswell. +AshUptonMenu equ 154 +Menu154 + dc.w 1511-MM,MMenu+24 ; Hi, drop into normal menu + dc.w 0 + +;[1511:Howdoo pardner. I'm Ash Upton. How can I be of service? ] ;||| Store +;; in Mesilla + +Menu156 + dc.w 1519-MM,MMenu+158 * the store was deserted... + dc.w 0 + +Menu158 +; when Murphy-Dolans are away the mice can play... + dc.w 62,MDoIt+0 * move on + dc.w 1518-MM,MPrintDoM1+1515-MM * get books + dc.w 0 + +; menus used when Billy gets seen by a deputy in a lawful town... +;[1859:down the street, a deputy called out "Billy The Kid - hold it +;right there. You gonna come quietly?" ] ;||| +;[1860:run away.` ] ; ||| menu option +;[1861:ignore him.` ] ; ||| menu option +;[1862:Billy fled the town. ] ; run away ||| +;[1863:"go for your gun, outlaw." ] ;||| +Menu160 + dc.w 1859-MM,MMenu+162 + dc.w 0 + +Menu162 + dc.w 1860-MM,MPrintDoM1+1862-MM ; run away + dc.w 1861-MM,MPrintDoM1+1863-MM ; ignore him + dc.w 0 + +Menu164 +; menu at start of game: Which person: Billy or Pat? +;[954:who do you want to play? ] ; |||opening question. + dc.w 954-MM,MMenu+166 + dc.w 0 + + +Menu166 +;[952:Pat ] ; copy of message 1||| +;[953:Billy ] ; copy of message 2||| + +;[955:Pat, you must track all the outlaw gangs to +;their hideouts. Talk to people to get information. ] ;||| +;[956:Billy, rob banks and steal cows from the Murphy-Dolans. ] ;||| +;[974:2-PLAYER GAME ] ;œœœ +;[975:Trying serial connection (press FIRE to abandon) ] + dc.w 953-MM,MPrintDoM1+956-MM * Billy + dc.w 952-MM,MPrintDoM1+955-MM * Pat + dc.w 974-MM,MDoIt+975-MM * two-player + dc.w 0 + + +Menu168 +;; person 68 soldier at Fort Sumner +;[1516:showed the books to Colonel Baxter. He was livid and vowed to +;prosecute the Murphy-Dolan's with the full force of the law. ] +;; go to Fort Sumner with books. + dc.w 1516-MM,MMenu+24 * back to default menu + dc.w 0 + +Menu170 +CardGameMenu equ 170 +;[900:we're playing Monte. D'you want to sit in? ] +;[901:some other time, pard. ] ; refuse to play monte. + dc.w 900-MM,MMenu+172 + dc.w 0 + +Menu172 + dc.w 54,MDoIt+900-MM * yes + dc.w 55,MPrintDoM1+901-MM * no: return 0 + dc.w 0 + + + +; MENUS FOR PAT IN SHERIFF'S OFFICE +; text for Pat to control deputies etc. +;[450:WHERE ARE DEPUTIES `] ;|||menu option +;[451:HIRE DEPUTY `] ; |||menu option +;[452:FIRE DEPUTY `] ; |||menu option +;[453:deputy ] ; for reporting number +;[454:deputies ] +;[455:people are ] ; followed by happiness: 456..464 +;[456:rebelling. `] +;[457:furious. `] +;[458:angry. `] +;[459:displeased. `] +;[460:restless. `] +;[461:content. `] +;[462:happy. `] +;[463:ecstatic. `] +;[464:funds remaining: $] +;[510:Santa Fe ] ; dc.w 3345 ; Santa Fe 10 +;[511:White Oaks ] ; dc.w 3346 ; Albe'que 11 +;[512:Lincoln City ] ; dc.w 3347 ; Lincoln City 12 +;[513:Mesilla ] ; dc.w 588 ; Las Cruces 13 +;[514:Roswell ] ; dc.w 589 ; Roswell 14 +;[515:El Paso ] ; dc.w 0 ; spare town 15 +;[516:Frontier Town ] ; dc.w 0 ; spare town 16 +Menu174 +; used when walk into Sheriff's office (As Pat) + dc.w 62,MDoIt+0 * move on + dc.w 450-MM,MDoIt+450-MM ; where are deputies? + dc.w 451-MM,MDoIt+451-MM ; hire deputy + dc.w 452-MM,MDoIt+452-MM ; fire deputy + dc.w 0 + + +Menu176 +; ask "Where from" question for Hire Deputy/Fire Deputy options... + dc.w 470-MM,10 + dc.w 471-MM,11 + dc.w 472-MM,12 + dc.w 473-MM,13 + dc.w 474-MM,14 + dc.w 475-MM,15 + dc.w 0 + +Menu178 +; meet Barney Mason when budget has run out + dc.w 1813-MM,MDoIt+0 + dc.w 0 + +Menu180 +; meet Barney Mason when a town has started to revolt + dc.w 1814-MM,MDoIt+0 + dc.w 0 + +Menu182 +; Barney Mason tells Pat he's fired + dc.w 1815-MM,MDoIt+1815-MM + dc.w 0 + + +Menu184 +; every fourth member of Texan possee who drifts off +; gives this message... + dc.w 1534-MM,MDoIt+0 + dc.w 0 +; [1534:Barney Mason rode up and said "Pat, another man from that Texan +; Possee had to high-tail it outa town. You'd better get into +; town and check the budget". ] ; |||now mentions Barney Mason, budget + +; Menus 186 to 256 reserved for extra people menus (in case +; we need to radically expand the differences between people +; in different places) + +Menu186 +LauraPicketMenu equ 186 + dc.w 330-MM,MMenu+188 + dc.w 0 + +Menu188 + dc.w 54,MDoIt+1330-MM * yes + dc.w 55,MDoIt+LoseRepMessage * no: return 0 + dc.w 0 + + +Menu190 +WilmaKatzMenu equ 190 +LonelyFarmhouseMenu equ 190 + dc.w 331-MM,MMenu+192 + dc.w 0 + +Menu192 +* wanna fight shootout? Used by prospector etc. + dc.w 54,MPrintDoM1+1540-MM * 1331-MM * yes + dc.w 55,MDoIt+LoseRepMessage * no + dc.w 0 + +Menu194 +RickRiderMenu equ 194 + dc.w 332-MM,MMenu+22 * go to challenge to duel menu + dc.w 0 + +Menu196 +ProspectorMenu equ 196 + dc.w 333-MM,MMenu+192 * wanna help me fight shootout? + dc.w 0 + +Menu198 +NedParkinMenu equ 198 * spill drink menu for Ned Parkin only +SpillDrinkMenu equ 198 * general spill drink menu for unnnamed people + dc.w 302-MM,MMenu+BuyBeerOrElseMenu * jogged elbow + dc.w 0 + +Menu200 +JackShoeMenu equ 200 + dc.w 303-MM,MMenu+BuyBeerOrElseMenu * jogged elbow + dc.w 0 + +Menu202 +BenDavisMenu equ 202 + dc.w 304-MM,MMenu+BuyBeerOrElseMenu * jogged elbow + dc.w 0 + +Menu204 +LaviniaStrumpetMenu equ 204 + dc.w 305-MM,MPrintDoM1+((300-MM)&fff) + dc.w 0 + +Menu206 +GirlFriendMenu equ 206 + dc.w 334-MM,MDoIt+0 + dc.w 0 + +Menu208 +BuyBeerOrElseMenu equ 208 +* buy person a beer? + dc.w 6,MDoIt+6 * beer + dc.w 55,MPrintDoM1+((300-MM)&FFF) * no: go into bar room brawl + dc.w 0 + +Menu210 +SomeoneNeedsHelpMenu equ 210 + dc.w 342-MM,MDoIt+0 + dc.w 0 + +Menu212 +SomeoneWasLookingMenu equ 212 + dc.w 362-MM,MDoIt+0 + dc.w 0 + + +;----- +; section to do with final duel +;[1865:Suddenly, Pat Garrett burst in. ] ;&&& +;[1866:"Billy, you know I can't +;take you in. They'd hang ya like a dog, and I can't stand by and let that +;happen. We'll have to settle this now, gun-to-gun. Draw, +;outlaw". ] ;&&& +;[1867:Billy and Pat approached other and exchanged glances. +;Both knew that they were sworn enemies, but also old friends. +;Was this to be the end for one of them? ] ;&&& +;[1868:CHALLENGE TO DUEL. `] ; menu option &&& +;[1869:AVOID CONFLICT. `] ; menu option &&& +Menu214 dc.w 1865-MM,MPrintDoM1+1866-MM,0 ; Pat Garret Burst in, ... +Menu216 dc.w 1867-MM,MMenu+218,0 ; approached each other, gonna fight? +Menu218 + dc.w 1868-MM,MDoIt+1868-MM * challenge + dc.w 1869-MM,MDoIt+1869-MM * avoid conflict + dc.w 0 + +Menu220 +Menu222 +Menu224 +Menu226 +Menu228 +Menu230 +Menu232 +Menu234 +Menu236 +Menu238 +Menu240 +Menu242 +Menu244 +Menu246 +Menu248 +Menu250 +Menu252 +Menu254 +Menu256 + + +; usable for normal menus + +Menu258 +; UNUSED + + +; MENUS WHICH DISPLAY TOM O'Foliard + +Menu260 +;; messages Billy gets when gangs go out of business +;[1890:Tom O'Foliard rode up and said "Billy, ] ;||| +;[1891:the Cooper Gang have been raided". ] ;||| +;[1892:the Socorro Varueros gang has been raided". ] +;[1893:the Seven Rivers Gang gang has been raided". ] +;[1894:the Dona Ana Bunch gang has been raided". ] +;[1895:the Jesse Evans gang has been raided". ] +;[1896:the fugitives' gang has been raided". ] +;[1897:the regulators' gang has been raided". ] + dc.w 1891-MM,MDoIt+0 + dc.w 0 + +Menu262 + dc.w 1892-MM,MDoIt+0 + dc.w 0 + +Menu264 + dc.w 1893-MM,MDoIt+0 + dc.w 0 + +Menu266 + dc.w 1894-MM,MDoIt+0 + dc.w 0 + +Menu268 + dc.w 1895-MM,MDoIt+0 + dc.w 0 + +Menu270 + dc.w 1896-MM,MDoIt+0 + dc.w 0 + +Menu272 + dc.w 1897-MM,MDoIt+0 + dc.w 0 + +Menu274 +; system menu + dc.w 651-MM,MDoIt+0 ; do nothing + dc.w 668-MM,MDoIt+668-MM * save game + dc.w 669-MM,MDoIt+669-MM * restore + dc.w 670-MM,MDoIt+670-MM * restart + dc.w 0 +;[651:DO NOTHING. `] ; menu option +;[662:MOVE ON. `] +;[668:SAVE GAME `] ;||| +;[669:RESTORE `] ;||| +;[670:RESTART `] ;||| + +Menu276 +; menu to select which player you're going to be in +; a two-player game +;[952:Pat ] ; copy of message 1||| +;[953:Billy ] ; copy of message 2||| + +;[955:Pat, you must track all the outlaw gangs to +;their hideouts. Talk to people to get information. ] ;||| +;[956:Billy, rob banks and steal cows from the Murphy-Dolans. ] ;||| +;[974:2-PLAYER GAME ] ;œœœ +;[975:Trying serial connection (press FIRE to abandon) ] + dc.w 953-MM,MPrintDoM1+956-MM * Billy + dc.w 952-MM,MPrintDoM1+955-MM * Pat + dc.w 0 diff --git a/l9dev/regress/games.l9/billy.l9/message.txt b/l9dev/regress/games.l9/billy.l9/message.txt new file mode 100644 index 0000000..0e2508e --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/message.txt @@ -0,0 +1,1200 @@ +; MESSAGE.TXT +; +; Messages for Billy The Kid Map/Strategy Games +; +; Copyright (C) 1991 Level 9 Computing Ltd. +; +; +; ||| are changes since initial text sent to Ocean for translation +; œœœ are changes since final text sent to Ocean for translation 8 Dec 90 +; (Corrections of obvious spelling and punctuation errors are not +; marked - but additions to punctuations are). +; &&& are additional things +; ^^^ are changes from 1991 onwards. +;l *********** what about copyright message???? +; +[1:Pat ] +[2:Billy ] ; names for "PLAYERSNAME" variable. +[3:`] +[5:%] +[6:% %] +[7:. ] ; dot +[8: ] ; space ; ^^^^ + +[11:Sheriff Pat Garrett ] ; full name for Pat, e.g. for +; when introduced to people. +[12:Billy The Kid ] ; full name for Billy, e.g. for +; when introduced to people. + + + +;||| messages 21..102 moved to other parts of the game... +;[21:Billy spread the map and figured on it a while. He'd gotta +;make a move and he'd gotta make it right... ] +;[22:Billy drove off the herd and started the long drive to Mexico... ] +;[23:Outside, a man shouted, "Come on out with your hands in the air, +;fella. We've gotcha surrounded!" ] +;[24:The Kid was trapped! The law was all over the place, and he hadn't +;got nuthin' but his ol' 6-gun. ] +[25:The plan was perfect. The train'd have to slow when it hit the +incline. And that'd be the chance to catch onto it. ] + +[26:Run alongside, jump over the rocks, then climb up the ladder +and jump onto the fuel wagon. Stop that train! ] ; œœœinstructions +; added. Also "Billy" replaced with "the" + +; +; Duel messages. Both follow Player's name ||| +[101:had won by a whisker. His opponent collapsed to the floor. ] ;^^^ +;It seemed best to hightail it outa there before anyone started +;to ask awkward questions about who fired first. ] ;||| +[102:went down in agony. The last thing he remembered +was friendly hands dragging him onto a horse... ] ;||| + + +; Brawl messages ||| +[300:A group of thugs entered the bar and said, "Hombre, we're +gonna cream you good". He knew that he would +have to fight his way to the door if he wanted to escape in one +piece. ] ;Billy is on the right. ] ; Billy ||| œœœ(mentions group of thugs) +[301:A group of thugs entered the bar and said, "Hombre, we're +gonna cream you good". He knew he'd +have to fight his way to the door if he wanted to escape in one +piece. You are on the right. ] ; Pat |||œœœ(mentions group of thugs) +[302:"I reckon you jogged ma +elbow and spilled my beer there Mister. Get me another drink, +if you know what's good for you". ] ;||| Ned Parkin +[303:"I don't like +the way you're looking at me, son. Reckon you'd best take +you're liquor elsewhere". ] ;||| Jack Shoe +[304:"We don't like your sort in this bar, Mister. +Maybe you'd better find another place to drink your sasparilla!" ] ;||| Ben Davis +[305:"Hey Mister, some guys other there +were talking about jumping you. You gonna stand there and take +that?" ] ;||| Lavinia Strumpet + + +; invitations to card game in saloon +[320:"They say +you're pretty good with a deck, Mister. But how about a game +with the grown-ups?" ] ;||| Rick Sands +[321:"Sorry Mister, I must have mistaken you for a man!" ] ;||| + +; encounters elsewhere in town, or others +[330:"You look the type who might aid an honest godfearing woman, +Sir. My respectable boarding house has been taken over by ruffians. Can +you drive them off for me?" ] ;||| Laura Picket +[331:"Hey mister. Some drifter friends of +the local Judge have taken over my homestead. You've got an honest +face - can't you help me?" ] ;||| œœœno longer mentions name. +[332:"I guess you think you can strut around this town like you +own the place, Stranger. Well there's only room for one tough +guy in this town. Draw or git!" ] ; Rick "Two Fingers" Rider. ;||| +[333:"Hey mister, they say you're pretty good with those shootin' +irons of yours. Won'cha help me out - some of Murphy's mob have +taken over my claim. Move 'em out and I'll cut you in for a share!" ] ;||| +[334:"Why hello again, dear. I'd love to talk to ya some more, +but I've just gotta wash my hair..." ] ;||| visit girlfriend! œœœpunc + + + +; references to people elsewhere who need help. +[340:"Hey mister, a friend of mine needs help... ] ; before 342..349 ;||| +[341:Might be able to help ya in return, too! ] ; after 342..349 ;||| +[342:It's Whiskey Pete the prospector out at his claim. ] ;||| +[343:Laura Picket at the El Paso hotel has got big trouble. ] ;||| +; ^^^ now at El Paso + +[344:Wilma Dunn out at the Dunn ranch. ] ;||| +[345:Joe Dunn out at his ranch. ] ;||| +[346:lil' ol' Miss Rose, out at her old place. ] ;||| + + + +[360:"Hey mister, someone was looking for you... ] ; before 362..369 +[361:why not get over there and look 'em up?" ] ; after 362..369 +[362:Joe Grant was the name. He was hanging out in the Santa +Fe Saloon. ] +[363:Karl Bekkert was the name. He was hanging out in the Santa Fe +Saloon. ] +[364:Jack Shoe was his name. Saw him in the El Paso Saloon. ] +[365:Ben Davis, I think. Saw him in the Santa Fe Saloon. ] +[366:Warren Oaks, I think. He hangs out in the Mesilla saloon. ] +[367:lil' ol' Miss Rose, out at her old place. ] ;||| +;[367:Wayne Rogers, so I'm told. He hangs out in the +;White Oaks saloon. ] ;||| + + + +; 400+location number is press stories about the most common events +; that happen at places... ||| +[410:Pat Garrett has been made Sheriff of Santa Fe ] +[411:Pat Garrett has been made Sheriff of White Oaks ] +[412:Pat Garrett has been made Sheriff of Lincoln City ] +[413:Pat Garrett has been made Sheriff of Mesilla ] +[414:Pat Garrett has been made Sheriff of Roswell ] +[415:Pat Garrett has been made Sheriff of El Paso ] + +[424:the Bitter Lake Ranch, of the Murphy-Dolan's, has gone out of +business. ] ;||| œœœ +[425:the Fritz Ranch, of the Murphy-Dolan's, has gone broke. ] ;||| œœœ +[426:the Chisum Ranch has gone out of business. ] ;||| œœœ +[427:the Dedrick Ranch, of the Murphy-Dolan's, has closed down. ] ;||| œœœ +[428:the Beckwiths, associates of Murphy and Dolan, have closed their +ranch and left the state. ] ;||| œœœ +[429:the Tunstall Ranch has gone out of business. ] ;||| +[430:the Reed Ranch, of the Murphy-Dolan's, has gone out of +business. ] ;||| œœœ + +[431:only another ] ;œœœ (Followed by number of ranches left, then 432) +[432: of those Murphy-Dolan swine to get. Keep at it, Billy] ;œœœ + +; text for Pat to control deputies etc.;||| +[450:WHERE ARE DEPUTIES `] ;|||menu option ;||| +[451:HIRE DEPUTY `] ; |||menu option +[452:FIRE DEPUTY `] ; |||menu option +[453:deputy ] ; for reporting number +[454:deputies ] +[455:people are ] ; followed by happiness: 456..464 +[456:rioting. ] +[457:very angry. ] +[458:angry. ] +[459:displeased. ] +[460:restless. ] +[461:content. ] +[462:happy. ] +[463:ecstatic. ] +[464:money: $] ;||| +[465:`income next month: $] ;||| +[466:`costs next month: $] ;||| +[467:`(] ; 467, number, 468 || +[468: Texan Deputies working for nothing). ] ||| + +; menu option versions of town names... +[470:Santa Fe `] +[471:White Oaks `] +[472:Lincoln City `] +[473:Mesilla `] +[474:Roswell `] +[475:El Paso `] + + +;||| Full stops removed from messages 500..548 +[501:a herd of longhorns ] ; 0 +[502:a herd of longhorns ] ; 0 +[503:a herd of longhorns ] ; 0 +[504:a herd of longhorns ] ; 0 +[505:a herd of longhorns ] ; 0 + +[510:Santa Fe ] ; dc.w 3345 ; Santa Fe 10 +[511:White Oaks ] ; dc.w 3346 ; Albe'que 11 +[512:Lincoln City ] ; dc.w 3347 ; Lincoln City 12 +[513:Mesilla ] ; dc.w 588 ; Las Cruces 13 +[514:Roswell ] ; dc.w 589 ; Roswell 14 +[515:El Paso ] ; dc.w 0 ; spare town 15 +[516:Frontier Town ] ; dc.w 0 ; spare town 16 +[517:Frontier Town ] ; dc.w 0 ; spare town 17 +[518:Frontier Town ] ; dc.w 0 ; spare town 18 +[519:Fort Stanton ] ; dc.w 3351 ; Fort Stanton 19 +[520:Fort Sumner ] ; dc.w 3352 ; Fort Sumner 20 +[521:A New Fort ] ; dc.w 0 ; spare fort 21 +[522:A New Fort ] ; dc.w 0 ; spare fort 22 +[523:A New Fort ] ; dc.w 0 ; spare fort 23 +[524:Bitter Lake ] ; dc.w 581 ; +[525:the Fritz Ranch ] ; dc.w 582 ; +[526:the Chisum Ranch ] ; dc.w 583 ; +[527:the Dedrick Ranch ] ; dc.w 584 +[528:the Beckwith Ranch ] ; dc.w 585 +[529:the Tunstall Ranch ] ; dc.w 586 ; +[530:the Reed Ranch ] ; dc.w 587 + + + + + + + + + + + + + +; one of these should be Blazer's Mill, nr Mescalero Apache... +; See P.10 design +[531:the Dunn farmhouse ] ; 31 +[532:the Dunn farmhouse ] ; 32 +[533:the Rose homestead ] ; 33 +[534:a farmhouse ] ; 34 + + +[535:Mescalero Apache Reservation ] ; dc.w 3356 ; Mescalero Apache +settlement 35 +[536:Wild Apache Settlement ] ; dc.w 0 ; spare indians 36 +[537:Wild Apache Settlement ] ; dc.w 0 ; spare indians 37 +[538:Wild Apache Settlement ] ; dc.w 0 ; spare indians 38 +[539:the Santa Fe express ] ; 39 +[540:a wagon train ] ; 40 +; outlaw hideout names... +[541:The Cooper Gang hideout ] ; 41 Santa Fe +[542:Socorro Vaqueros ] ; 42 White Oaks Run by Pete Stewart ||| +[543:The Seven Rivers Gang hideout ] ; 43 Lincoln City +[544:The Dona Ana Bunch hideout ] ; 44 Mesilla +[545:The Jesse Evans gang hideout ] ; 45 Roswell +[546:The fugitives' hideout ] ; 46 El Paso +[547:The regulators' hideout ] ; 47 ; Los Portales, NE of Fort Sumner. ||| +[548:a prospector ] ; 48 + +;|||[598:Billy ] +;|||[599:Pat ] +; Menu messages start at 600... +; general message ranges: +; MM+1..MM+49: involve spending money +; MM+50..MM+99: are the menu options themselves +; MM+100..MM+149: involve chaining to a new overlay + +; menu options involving spending money... +[601:BUY ROUND OF DRINKS ($5) `] +[602:GO UPSTAIRS WITH THE GIRL ($25) `] +[603:OFFER A BRIBE ($15) `] +[604:GIVE $20 `] +; drinks on offer at bar... +[605:NOTHING `] +[606:RED-EYE ($1) `] +[607:BEER ($1) `] + +; menu options not involving spending money... +[650:LEAVE TOWN. `] +[651:DO NOTHING. `] ; menu option +[652:GO THERE. `] ; menu option +;; [653:think about it. `] ; menu option ****** +[654:YES. `] +[655:NO. `] +[656:RAISE HELL. `] ; option in bar ||| +[657:Yeehaa... ] ; response to 656. ||| + +;[656:ROB THE TRAIN. `] ; option when click on train. +;[657:meet the wagon train. `] ; option when click on wagons +;[658:go visit the Apaches. `] ; option when click on apache ; +;settlement. +; standard menu for talking to people. +[659:GREET. `] ; ||| HULLO. `] +[660:TALK. `] +[661:THREATEN. `] +[662:MOVE ON. `] +; menu for when challenged to a duel... +[663:ACCEPT. `] +[664:BACK DOWN. `] ; try to pacify person. +[665:ROB THE BANK. `] +[666:STEAL COWS. `] +[667:TAKE COWS TO APACHES. `] + +; SYSTEM menu options... +[668:SAVE GAME `] ;||| +[669:RESTORE `] ;||| +[670:RESTART `] ;||| + +[671:English `] ; menu option +[672:Deutsch `] ; menu option +[673:Fran‡ais `] ; menu option + + +;600+100..129: arcades overlay games +;600+130..159: intermission overlay games +;600+160..189: scrolling overlay games +;[700:rode off to intercept the train. ] +;[701:rode off to the ranch... ] +;[702:rode off to the ranch... ] +;[703:rode off to the ranch... ] +;[704:rode off to the ranch... ] +;[705:rode off to the ranch... ] +;[706:rode off to the ranch... ] + +;[730:rode off to meet the wagon train. ] +;[731:rode off to visit the Apache settlement. ] + +[760:set off to steal the steers. ] +[761:Get behind them longhorns +and drive 'em south. Press fire to switch between the +members of your gang. ] ; rustling game. œœœinstructions added. +[762:track the gang southwards. Press fire when near a clue +to see what it means. Don't take too long! ] ;œœœadded. +[763:when the bell goes, push forwards to draw, and then steer +the gunsight onto the other guy. Press FIRE to shoot him. ] ;œœœ +;[761:set off to hunt down the gang. ] ; tracking game +;[762:escaped from the bank. ] ; Billy bank escape +;[763:set off to ambush Billy. ] ; prevent Bank robbery game. +[764:set off to take the cows to the Indians. ] ;|||| +[765:Press fire and down to duck, fire and up to raise your +head above the barricade. Shoot as many of the bad guys as +you can. You can't shoot or be shot so long as you keep your +head down. ] ;œœœ +[766:Press right//left to move sticks of dynamite, and press +FIRE to light the fuse. But how many do you need? ] ;œœœ + +; responses... +;[851:rode off. Press fire. ] ; result of 652 +;[852:had finally come to a decision, and rode into town. ] +;; result of 652 under other circumstances (***debugging) +[853:called for drinks on the house. That sure made him popular. ] +[854:went upstairs with the saloon girl... ] +[855:offered the bribe. ] +[856:handed over some money. ] +[857:Billy headed back to the hideout to round up the gang, +and burst into the bank in force... ] +[858:Billy started to draw his gun, but realised that without +a gang to back him up he hadn't a hope. ] ;||| try to rob bank +; without having contacted a gang first. +[859:Billy started to ride off, but realised that without +a gang free to back him up he hadn't a hope. ] ;||| try to rob train +; without having contacted a gang first. + + +; invitation to train robbery (less common, so one only)... +[867:"There's gonna be a whole heap of gold on that train tomorrow. +Why, if a body had a mind to, he could catch it real easy at the +gradient". ] ; œœœ punc +[868:the safe contained ] ; followed by amount of gold, 869. +[869: dollars in gold. ] +[870:"We've been robbed by Billy The Kid - so don't ask to make +a big withdrawal! "] +; when Billy goes into a bank he's recently robbed. +[871:"We've been robbed. I hope you've come to make a deposit". ] ; œœœ punc +; when Billy goes into a bank another gang has recently robbed + +; GENERAL MESSAGES ||| +[872:owned $] ;preceded by PlayersName, followed by amount, 873 ||| +[873:. ] ; after 872/amount. ||| +[874:A voice called out "Get outa here - we're closed!" ] ;||| +; try to go into buildings which are just scenery. +[875:Billy decided not to go into the Sheriffs office, just +to be on the safe side. ] ; ||| +[876:"You deaf or something, boy?" ] ; œœœ ask same person a second +; question ; œœœ punc +[877:"I said, YOU DEAF OR SOMETHING, BOY?" ] ; œœœ ask same person a second +; question ; œœœ punc +[878:"Can't stand around jawing all day. Be seeing ya". ] ;œœœ ; œœœ punc + + + + + + +; Saloon bits and pieces... +[899:"Prepare to draw, varmit". ] ;||| challenged to duel whilst outside. ; œœœ punc +[900:"I hear you play Monte. D'you want to deal?" ] ; œœœ reworded +[901:"Some other time, pard." ] ; refuse to play monte. ; œœœ punc +[902:Accuse the varmit of cheating. ] ; Monte +[903:Forget it. ] ; After Monte game +[904:"I'll meet you on the street". ] ; what Billy says if he decides +; to fight the duel. +[905:"OK, Yellabelly. Just crawl outa here fast, or I'll plug you". ] ; œœœ punc +; climb down instead of fighting duel. +[906:"Yeh, well... I guess I'll help ya... ] ;|||trailing quote removed +; threaten, agrees to give info. ; œœœ punc +[907:"Gee, I'd surely like to help ya, but I don't know nuthin'!" ] ; œœœ punc +; threaten, but doesn't know anything. +[908:"You trying to push me around, you saddle bum? Let's settle this +right now, gun-to-gun". ] ; |||no longer mentions outside ; œœœ punc +[909:"What'll it be, friend?" ] ; barman offers drinks ; œœœ punc +[910:"Wanna place a bet, friend?" ] ; roulette ; œœœ punc +[911:put his money on the table. The wheel span, and as it stopped +the ball sprang sideways into 00. That table surely was crooked! ] +[912:Accuse the croupier of cheating. ] ; roulette table. +[913:Forget it. ] ; roulette table. +;|||[914:I'll see you outside. ] ; what Billy says if he decides +;; to challenge +[915:"I'm ] ; then player's full name +[916:", the reply came back: "I'm ] ; name chosen from 1000... +[917:". ] ; after 916, name. +[918:"Nobody tells me nuthin'." ] ; unthreatened, just knows nothing +[919:"I ain't telling you nuthin' about anythin', bud!" ] ; refuses +; to tell Player, in response to "talk" option on menu + +; MESSAGES FOR FIRST MEETING VARIOUS TYPE OF PEOPLE... +; a group of 10 messages from a cowardly person... +; a group of 10 messages from a greedy person... +; a group of 10 messages from anyone else... +; +; cowardly meeting... +[920:"Why, hello stranger". ] ; œœœ punc +[921:"Well, howdy mister". ] ; œœœ punc +[922:"Welcome, stranger". ] ; œœœ punc +[923:"Er, greetings stranger". ] ; œœœ punc +[924:"Er, howdoo young fella". ] ; œœœ punc +[925:"Er, hello pardner". ] ; œœœ punc +[926:"Er, howdoo stranger". ] ; œœœ punc +[927:"Er, good day to you, pardner". ] ; œœœ punc +[928:"Er, howdoo stranger". ] ; œœœ punc +[929:"Er, hello young Sir". ] ; œœœ punc + +; greedy meeting... +[930:"Hello stranger". ] ; œœœ punc +[931:"Howdoo stranger". ] ; œœœ punc +[932:"Hi there, stranger". ] ; œœœ punc +[933:"Good day, pardner". ] ; œœœ punc +[934:"Hello stranger". ] ; œœœ punc +[935:"Hello friend. You new around here?" ] ; œœœ punc +[936:"Hello there, boy. You want anything from me?" ] ; œœœ punc +[937:"Greetings stranger. You wanting something?" ] ; œœœ punc +[938:"Hello stranger. Can I help you some?" ] ; œœœ punc +[939:"Howdy pardner. You needing some help?" ] ; œœœ punc +; +; normal, well-balanced people... +[940:"Hello pardner". ] ; œœœ punc +[941:"Howdoo stranger". ] ; œœœ punc +[942:"Hi stranger". ] ; œœœ punc +[943:"Greetings stranger". ] ; œœœ punc +[944:"Howdoo stranger". ] ; œœœ punc +[945:"Hello pardner". ] ; œœœ punc +[946:"Howdy stranger". ] ; œœœ punc +[947:"Goodday stranger". ] ; œœœ punc +[948:"Howdoo friend". ] ; œœœ punc +[949:"Hello stranger". ] ; œœœ punc + +[950:"Howdy Pat". ] ; œœœ punc +[951:"Howdy Billy". ] ; meet someone again. ; œœœ punc +[952:Sheriff Pat Garrett`] ;œœœ last bit moved to 975ish + +[953:Billy The Kid`] ; copy of message 2||| MENU OPTION +[954:Who do you want to play?` `(Press FIRE or SPACE). ] ; |||opening question. œœœ reworded +[955:Pat, you must track down and capture all the outlaw gangs. Talk +to people for information. And when in a sheriffs office, check your +deputies are where they're wanted.` `(Press FIRE or SPACE). ] ;||| œœœ reworded +[956:Billy, you must try to bankrupt the Murphy-Dolan gang. Rob +their banks and steal their cows. Talk to people for information. +And try to steer clear of the law.` `(Press FIRE or SPACE). ] +;||| œœœ reworded +[957:"Oh, it's you again". ] ; ||| meet someone again that you +; haven't been introduced to. ; œœœ punc +[958:"Clear off buster, I don't associate with your kind". ] ;||| +; meet someone again who we didn't get on with last time! + + +;[951:"I don't deal with your kind, lawman". ] ; Pat tries to talk to +;; someone he is very unpopular with. +;[952:"I don't have nothing to do with outlaws". ] +; likewise Billy. +; +;[953:"What can I do for you, stranger. ] ; either player +;; talks to someone for the first time, when they are not +;; very well known (i.e. at the start of the game). + +;[954:Ain't you Billy the Kid? Anything I can do to oblige you? ] +;; meet's someone for the first time when better known +;[955:well, if it isn't Sheriff Garrett. What can I do for you, sir? ] +;; meet's someone for the first time when better known + +;; meet someone who is inclined towards/neutral towards player + + +[960:] ; header for 960..990 messages. |||quote removed +[961:." ] ; terminator for 960..990 messages. +[962:I hear ] ; always followed by gang name. +[963:just robbed the bank in ] ; followed by town name +[964:just rustled some cows from ] ; followed by ranch name +[965:hideout is right near ] ; preceded by gang name, followed by town +; name. +[966:Folks tell me there's a pile of money at the bank in ] +;|||moved to 972. [967:I hear say there are x deputies stationed at ] +[968:"There's a widow woman over at ] ; œœœ punc +[969:who needs help". ] ; œœœ punc +[970:"I'm being run off my land by Murphy. I need help!" ] ; œœœ punc +[971:"That gunslinger over there is threatening me and my folks. +Kill him, won't ya?" ] ; œœœ punc +[972:there are ] ; followed by number, 973||| +[973: deputies stationed at ] ; after 972/number, before town name.||| +[974:2-PLAYER GAME (Use UP//DOWN to select, +then press FIRE or SPACE). ] ; œœœcopy of message 1||| MENU OPTION AT START OF GAME +[975:Trying serial connection. ];^^^ (press FIRE to give up). ] ;œœœ œœœ punc + + + +; 1000+Location number for various places that people can +; mention things happening. Events can include train + +; contents, contents of banks, number of deputies in +; various towns, gang locations, recent robberies, +; subplot hints: e.g. Widow women needing help(!) +[1010:Santa Fe. ] ; Santa Fe 10 +[1011:White Oaks. ] ; Albe'que 11 +[1012:Lincoln City. ] ; Lincoln City 12 +[1013:Mesilla. ] ; Las Cruces 13 +[1014:Roswell. ] ; Roswell 14 +[1015:El Paso. ] ; 15 + +[1039:the express train. ] ; 39 +[1040:the wagon train. ] ; 40 + +; messages where someone tells one of the players +; about various robberies, train/bank, that are +; planned during the next little while. +[1041:the Cooper Gang] ; 41 Santa Fe ; œœœ punc +[1042:Socorro Vaqueros] ; 42 White Oaks ||| ; œœœ punc +[1043:the Seven Rivers Gang] ; 43 Lincoln City ; œœœ punc +[1044:the Dona Ana Bunch] ; 44 Mesilla ; œœœ punc +[1045:the Jesse Evans gang] ; 45 Roswell ; œœœ punc +[1046:the fugitives] ; 46 El Paso ; œœœ punc +[1047:the Regulators] ; 47 Near Fort Sumner ||| ; œœœ punc +; +; names for white American Males (young/old)... +; other possible formula names are... +; ... the rat + +[1100:honest Jake] ; œœœ punc +[1101:cookhouse Charlie] ; œœœ punc +[1102:Jericho Jake] ; œœœ punc +[1103:little Joe] ; œœœ punc +[1104:Black Jake] ; œœœ punc +[1105:Trapper John] ; œœœ punc +[1106:Prairie John] ; œœœ punc +[1107:long tall John] ; œœœ punc +[1108:Johnny Reb] ; œœœ punc +[1109:Omaha John] ; œœœ punc + +[1110:Sam Peckinpaw] ; œœœ punc +; ** also name on a grave in Fistful of Dollars ** +[1111:Cornish Sam] ; œœœ punc +[1112:snake-eyes Sam] ; œœœ punc +[1113:Yosemite Sam] ; œœœ punc +[1114:slippery Sam] ; œœœ punc +[1115:Ledger Bill] ; œœœ punc +[1116:Arkansas Will] ; œœœ punc +[1117:Hotel Bill] ; œœœ punc +[1118:Bronco Bill] ; œœœ punc +[1119:Tom Destry] ; œœœ punc +; ** as in Destry Rides Again + +[1120:Rowdy Yates] ; œœœ punc +; ** Clint Eastwood's role in Rawhide + +[1121:mad Mike] ; œœœ punc +[1122:Texas Mike] ; œœœ punc +[1123:mustang Mike] ; œœœ punc +[1124:Howard Johnson] ; œœœ punc +; ** as in Blazing Saddles +[1125:mule-skinner Jim] ; œœœ punc +[1126:Louis L'Amour] ; œœœ punc +; ** Western novelist +[1127:cool-hand Jim] ; œœœ punc +[1128:the Swede] ; œœœ punc +[1129:Bernardo O'Riley] ; œœœ punc +; ** Bronson's role in the Magnificent Seven +; +[1130:Slim Pickins] ; œœœ punc +[1131:Mexico Pete] ; œœœ punc +[1132:Two-gun Pete] ; œœœ punc +[1133:Billy-Joe Bob] ; œœœ punc +; ** character in Fresno +[1134:Teacher Pete] ; œœœ punc +[1135:Red River Nick] ; œœœ punc +[1136:Nebraska Nick] ; œœœ punc +[1137:tricky Nick] ; œœœ punc +[1138:lucky Luke] ; œœœ punc +; ** Goscinny & Uderzo hero +[1139:Navaho Nick] ; œœœ punc +; +[1140:honest Dave] ; œœœ punc +[1141:dead-eye Dick] ; œœœ punc +[1142:Kansas Dave] ; œœœ punc +[1143:dainty Dave] ; œœœ punc +[1144:dynamite Dave] ; œœœ punc +[1145:red-eye Bert] ; œœœ punc +[1146:bull-whip Bert] ; œœœ punc +[1147:slick Bert] ; œœœ punc +[1148:Frenchie Dupont] ; œœœ punc +[1149:Duke Wayne] ; œœœ punc +; ** John Wayne nicknamed Duke +; + +; new names for extra subplots... +[1160:Whiskey Pete] ;||| ; œœœ punc +[1161:Joe Dunn] ;||| ; œœœ punc +[1162:Joe Grant] ;||| ; œœœ punc +[1163:Karl Bekkert] ;||| ; œœœ punc +[1164:Jack Shoe] ;||| ; œœœ punc +[1165:Ben Davis] ;||| ; œœœ punc +[1166:Warren Oaks] ;||| ; œœœ punc +[1167:Wayne Rodgers] ;||| ; œœœ punc +[1168:Ash Upton] ;||| ; œœœ punc +[1169:Chief How] ;********* at Mescalero Apache ;||| +[1170:Rick Sands] ;||| ; œœœ punc +[1171:Rick "Two Fingers" Rider] ;||| œœœ ; œœœ punc +; +; names for American Females... +; call girls (10)... +[1200:Honey Bun] ; œœœ punc +[1201:Sarah Jane] ; œœœ punc +[1202:Fast Sally] ; œœœ punc +[1203:Long tall Kerri] ; œœœ punc +[1204:Saucy Miss Cockwell] ; original wording at Kerri's request! +[1205:Sweet Charity] ; œœœ punc +[1206:li'l Mabel] ; œœœ punc +[1207:Nice Nelly] ; American slang for excessive propriety +[1208:Annabel Lee] ; œœœ punc +[1209:Dizzy Lizzie] ; œœœ punc +; + +[1210:Laura Picket] ;||| ; œœœ punc +[1211:Wilma Dunn] ;||| ; œœœ punc +[1212:Miss Rosy] ;||| ; œœœ punc +[1213:Lavinia Strumpet] ;||| ; œœœ punc +[1214:Mrs McSween] ;||| ; œœœ punc +[1215:Paulita Maxwell] ; Billy/Pat's girlfriend. +;------------ +; subplot messages + +[1490:Barney Mason rode up and said, "] +[1491:Pat, it's the end of the month, and the wages just arrived. +We've doling them out now, but you can change the budget for +next month if you like. Just come into the sheriff's office in +Lincoln and see how we're spending the money". ] ;œœœ + + +; Mexican peasant going to be run off his land by Anglo ranchers +[1500:"The Greengo ranchers, they try to drive me off my farm! Help me +fight them!" ] +[1501:"May the Blessed Virgin bring a thousand curses upon you". ] ; no to 1500 + +; lady in saloon being pestered by notorious gunslinger +[1503:"There's a gunslinger over there who don't know how to treat +a lady right. Teach him a lesson, Big Boy and I could show you +a good time". ] ;œœœ reworded from... ; œœœ punc +;; "This gunslinger don't know how to treat a lady right. Will you teach him +;; a lesson, Big Boy?" ] + +[1504:the lady looked disappointed. ] ; no to 1503 + + + + + + + + + + + + + +; Mexican picked on by cowboys... +[1506:"These cowboys, they picking on me. You make them stop, Senor?" ] +[1507:The Mexican looked disappointed. ] ; no to 1506 +[1508:The cowboys walked off, saying, "We're gonna get you for this" ] +; yes to 1506 ; œœœ punc + +; sick man in desert... +[1509:"Help me - my horse is dead, I'm out of water and plumb near dead". ] +;|||mentions reason for being in trouble. ; œœœ punc + +[1510:The man collapsed in despair. ] ; no to 1509 +;|||1511 moved to 1700 ; œœœ punc + + +; army being cheated by MD's subplot +[1511:"Howdoo pardner. I'm Ash Upton. How can I be of service?" ] ;||| Store +; in Lincoln ; œœœ punc +; Soldier at Fort Sumner - army are being cheated by Murphy- +; Dolan's +[1512:"The army are being cheated by the Murphy-Dolans on the meat +contract". ] ; œœœ punc +[1513:"What the heck brung you here? Draw, you son of a bitch". ] ; œœœ punc +; Billy goes into store whilst MDs present +[1514:"Get out of here, lawman. You ain't welcome". ] ; ; œœœ punc +; Pat goes into store whilst MDs present. +[1515:hunted through some papers and came up with the real account +books for the Murphy-Dolans. Now to show them to Colonel Baxter... ] +; pat/billy goes into the MD store whilst they're away. +[1516:showed the books to Colonel Baxter. He was livid and vowed to +prosecute the Murphy-Dolan's with the full force of the law. ] +; go to Fort Sumner with books. +[1517:"I can't go to the Colonel until I got proof - maybe you could +get hold of their books from the store in Lincoln?" ] +[1518:SEARCH FOR BOOKS. `] ; menu option in MD store +;;||| [1519:found the books and hid them in his jacket. ] ; find books in store +[1519:The store was deserted. ] ;||| go there when MD's / Ash not there + +; Pat is about to defeat a gang in a shootout, +; their leader calls a truce and barters their escape +[1520:The gang leader waved a white flag and called out: ] ; +; followed by one of 1521..1523 +[1521:"Pat - let us go and we'll tell you when Billy's planning the +next robbery". ] +[1522:"Pat - let us go and we'll leave the territory". ] +[1523:"Pat - let us go and we'll tell you where there is a stash of +gold buried". ] +; and responses to 1521..1523 if Pat accepts the offer... +[1524:"Thanks Pat - we'll be seeing you". They rode off. ] ; œœœ punc +[1525:"Buenos dias Senor. Now we head for Mexico". ] ; œœœ punc +[1526:"It's on the east side of the Pecos, at a deserted prospector's +camp". They rode off. ] +[1527:"Then we fight to the death". ] ; œœœ punc + +; Pat meets Texan posse in desert. Player can choose to +; lie that Billy has stolen Texan cattle. +[1529:Pat met a Texan posse looking for rustlers. What did he tell +them about Billy? ] ; intro message +[1530:HE STEALS TEXAN CATTLE `] ; menu option|||upper case +[1531:HE IS AN OUTLAW `] ; menu options - keep short. |||upper case +[1532:the posse offered to ride along as deputies, for the time +being. ] ; Pat lies about Billy stealing Texan cattle + + +[1533:The posse wished Pat good luck, and were right sorry +they couldn't help. ] ; Pat says Billy is an outlaw only. +[1534:Barney Mason rode up and said, "Pat, another man from that Texan +posse had to high-tail it outa town. You'd better get into +town and check the budget". ] ; |||now mentions Barney Mason, budget + +; Barney Mason reports the escape of an outlaw +; from Santa Fe - Pat can track him unaided for a reward. +[1535:Barney Mason rode up. "Pat - an outlaw's just busted out from +Santa Fe. Ride with me now, and I'll put you on his trail. "] +[1536:Barney rode off. ] ; no to 1535 +[1537:Barney lead Pat at a gallop to the head of a winding valley, +then left him to track the fugitive on his own. ] ; yes to 1535 +[1538:Pat took the outlaw in and claimed the $100 reward. ] +; get the outlaw. + + +; shootout message groups: intro/win/lose 1540..1569 +[1540:"Hurry! We must fight them!" ] ; yes to 1500 +[1541:"Muchos gracias, Senor. Now my farm is safe". ] ; œœœ punc +[1542:The peasant had been hit by a bullet. He died without saying a +word. ] ; œœœ punc + + + + +; duel message groups: intro/win/lose 1570..1599 + +; gunslinger bothering lady (1503) +[1570:The gunslinger slowly turned around and started to head for the +door... ] ; yes to 1503 +[1571:The gunslinger slumped to the floor... ] +[1572:the bullet struck home, bringing merciful blackness. ] +; invitations to duel in saloon + +[1573:"So you're the guy that drilled my +kid brother in the back, Mister Big Shot. Wanna settle this +outside?" ] ;||| Warren Oaks +[1574:"They say you're pretty fancy with +that six-gun of yours, Mister. But I reckon you ain't. Wanna take +me on outside?" ] ;||| Wayne Rodgers +[1575:"I seeze you undressin' my Mary-Jane +with your eyes, buster! Wanna settle this like a Man?" ] ;||| Karl Bekkert + + +; +; Pat is accosted by a local mayor with request for more protection +[1600:a pompous mayor walked up and shouted, "Sheriff Garrett, +this town's gotta have more protection. I want at least one more +deputy here before you leave us.] ;||| now mentions appearance ; œœœ punc +[1601:"OK, I guess that'll have to do". ] ; œœœ punc +[1602:"The people of this town ain't gonna be happy about this". ] ; œœœ punc + +; The same mayor asks Pat to run a vagrant out of town +; to enforce a bogus claim against the prospector (?) +[1605:A pompous mayor walked up and shouted, "Sheriff Garrett, there's +a vagrant I want run outa town. The varmit says he owns a claim +that one of my friends has a mind to". ] ; œœœ punc +[1606:Pat helped the mayor, and drove the vagrant out of town. But he +surely didn't feel good about doing it. ] +[1607:Pat refused, saying that even a vagrant has his rights. ] + +; Pat encounters an outlaw whilst tracking +; ++ In scrolling game ++ + +; At Siege, Carlyle runs in. +; ++ In arcades game ++ + +; Pat meets outlaw gang in an old Building. +; ++ In arcades game ++ + + + + + + + + + + + + + +; Billy Only encounters... +[1610:"Paleface, we greet you. Beef promised us by treaty, +Murphy-Dolans send us scraps. My people starve". ] ;|||no longer mentions Billy +; comment from Indian chief. +[1611:do you want to try to take these cows to the Indian Reservation? ] ; +; when double-click on Longhorns, after seeing 1610. +;[1612:the Indian chief rode up: "How, red man's friend?". He thanked +;Billy for the beef and offered to fake an uprising, if needed, to +;distract Pat in the future. ] ; +++ Moved to scrolling games |||| +[1613:FAKE UPRISING. `] ; extra MENU option. +[1614:"Yes paleface, for you we make lawman think we on warpath". ] ; œœœ punc + ;^^^ Billy->paleface + +; meet Widow Woman who wants ALL BILLY'S MONEY (quel surprise) +[1620:"Oh Sir, I'm jest a poor widow woman. If I can't pay the bank, +I'll be thrown off my little farm and have to go a-begging in the +streets. It ain't no more than $1000] ; followed by amount of gold +[1621:; that surely ain't nothing to a rich man like you". ] +[1622:"O thank you sir. I'll always be a-thinking on you". ] +; yes to 1620 +[1623:"O no! My last hope is gone - I'll be in the poorhouse till the +end of my days". ] ; no to 1620 + +; Desert peasant meets Billy and entices him to his house +; with story that family is sick. While Billy stays there, +; an outlaw arrives wit news of a gold consignment at +; the local bank, but it's a bluff - if Billy leaves to +; travel there, he gets challenged in the street by a bounty +; hunter. (Note: there may or may not be gold in then bank) +[1630:A peasant rode up: "Senor Billy, my family are sick. I no can +make them better. Please, you come try and help them". ] +[1631:he rode off with the peasant and stayed at his farmhouse; +fetching and boiling water and cooking for the family. +After a few days, they were recovering and was +about to leave when there come a knocking at the door... ] +; yes to 1630 (|This is Followed by 1633) +[1632:"Oh pity me, my family will surely die". ] ; no to 1630 +; 1633 moved to 1701||| +[1634:a bounty hunter was lying in wait. "Gotcha! you dumb +saddlebum - you've been set up! I'm gonna take you in, +dead or alive! Draw! ] +; meet Bounty hunter in town, after 1630/1631/1633 + + + + +; ambush by Buckshot Roberts +[1640:As he rode near a farmhouse, a huge man stepped out from +behind a rock: "There's folks as wants to talk to ya. I'm takin' you +in. The name's Roberts - +Buckshot Roberts. I'm a bounty hunter - an' I've taken in fifty scum +like you already, and you're gonna make it fifty-one. ] +;||| removed: You coming quiet? ] + +;|||moved to arcades.[1641:although Buckshot Roberts must have stopped half a dozen +;|||bullets, he still found strength to climb onto a horse and ride off. ] + + + + + + + + + + + + +; win gunfight +++ Move to arcades? + + +; Seven Rivers gang ambushes Billy/Pat in town. +[1645:Suddenly shots started to ring out. He dove for cover. On the +other side of the street, gunslingers hired by the Murphy-Dolan gang were +shooting at him! ] ; |||no longer mentions Billy ^^^now murphy-dolan, +; not seven-rivers + +; Jesse Evans gang ambushes Billy in town. +[1646:Suddenly the air rang to the crack of gunshot. He leapt for +cover. Across the street, he could see some badmen +throwing lead at him! ] ;|||no longer mentions Billy ^^^no longer +; mentions Jesse Evans Gang + +; Tom Cooper offers Billy lots of counterfeit money +; instead of his share in a robbery. +[1650:Tom Cooper said, "Billy, how'd you like 5 times your share of +this robbery - in counterfeit bills. There's a tenderfoot called +Duncan, spreading it around. It's a good looking paper. Won't give you +no problems if you spend it careful. What d'you say". ] +[1651:Cooper smiled: "Say, that's great. Here's the sack of money". +Billy pondered on it. How could he use it most easily? ] +[1652:BUY CATTLE WITH IT. `] ; menu option after 1651 +[1653:SPEND IT NORMALLY. `] ; menu option after 1651 +[1654:Cooper counted out Billy's share and rode off. ] ; no to 1650 + +; when Billy is in Lincoln City Saloon, he overhears that Sheriff +; Brady is on his way to ambush McSween. +[1660:he heard something that made him prick up his ears."You +know that no-good sheriff Brady's gonna run Mrs McSween off her ranch. +Ain't that the devil! But what can we do?" ] +[1661:Good Mrs McSween! An old friend, and a friend of the late +lamented Tunstall! One of the last alive to stand against the Murphy- +Dolans! What now? ] ; after 1660 ;œœœ no longer mentions Billy +[1662:DO NOTHING. `] ; menu option. +[1663:STOP BRADY. ] ; menu option. ->1664 + +[1664:he ran from the saloon and found Brady heading out of town. +He caught up with him and pulled him from his horse. Brady got up, +shaking with anger. It was obvious he was going to draw. ] +; stop brady from 1663 + +; Jose Miguel Sedillo, a friend of Billy's from way back, tells +; him of an attempted horse-robbery on Tunstall Ranch, +; while this is being run by Mrs McSween. +[1670:Jose Miguel Sedillo - an old and +trusted friend - rode up. "You must go help Mrs McSween - the +Murphy-Dolan's are there right now. They try to steal her cattle".] +;||| wording changed to make non-Billy specific + +; do nothing or... +[1671:GO THERE. `] +[1672:they rode off and got ready to fight... ] ; selects 1671: +;goes into shootout. + +; meet Joe Grant,. drunk in a saloon. + + + + + + + + + + + + + +[1674:Joe Grant staggered out of a back room, plainly drunk. "Hey Kid! +You know I'm the fastest gun in the West now. Lookee here at this +pearl-handled pistol I just - er - got gived". ] +[1675:He handed over the +pistol. It surely was pretty, but wouldn't be powerful enough to stop +a mosquito. Only three chambers were loaded. What did he do? ] +; nothing or... +[1676:ROTATE THE BARREL TO AN EMPTY CHAMBER. `] ; menu option +[1677:he turned the barrel and handed the gun back. ] +[1678:Joe Grant was waiting outside. He seemed to have gotten sober +real quick. He snarled "Draw, you prairie dog". ] +[1679:he handed the gun back. ] ; don't play with chambers + +[1680:"Beat it, we don't want none of Tunstall's men hereabouts". ] +; Billy meets hostile soldier + +; meet Mrs McSween +[1681:"Why hello old friend - how're you keeping". ] ;|||no longer mentions billy +[1682:"Gotta get going. This place keeps a body busy". ] +; follows 1681 + +; meet prospector +[1683:"What do you want, stranger? You another claim jumper?" ] + +; take sick man to santa fe +[1684:when they arrived with the sick man clinging to the horse, +he said "thanks for the ride Pard" and staggered off. ] |||^^^no longer +; mentions Billy + +; take sick man somewhere other than Santa Fe + +[1685:when they arrived with the sick man clinging to his horse, +the sick man cursed him for not going to Santa Fe and +staggered off on his own. ] ||| + +[1686:"Sheriff, can you come back later. We're real busy right now". ] +; Pat meets hostile soldier/rancher. ||| copied, slightly changed from 1680 + + + +; messages which result in player being thrown back to map... 1700..1729 +[1700:the man struggled onto the horse, and clung on weakly. He +gasped "Take me to Santa Fe, Mister. I got folks there". ] ; |||now mentions Santa Fe. +; yes to 1509 +; if visit Santa Fe next, get 1684, otherwise get 1685. +[1701:An outlaw burst through the door, brandishing a gun! He saw +Billy and dropped it in terror. "Billy the Kid! Don't kill me please, +I didn't mean ya no harm. Look, I'll help ya. The bank at White Oaks +just had a big payroll for a ranch thereabouts. Git +down there now, ya can pick up a whole load of money". ] ; follows +; 1631 ;||| moved from 1633 + + + +; Pat's strategy game messages... +; Go into sheriff's office... +;|||[1800:the deputy looked up and said, "Howdy Sheriff Garrett. What +;|||can I do for you?" ] +;|||[1801:move deputy to reserve. `] ; take deputy away from town +;|||[1802:move deputy to town. `] ; station deputy in this town. +;|||[1803:ok. ] +;|||[1804:there are ] ; followed by number of deputies +;|||[1805: deputies in town. ] ; follows 1804/digit +;|||[1806: deputies in reserve. ] ; follows 1804/digit +;|||[1807:Pat got a reward of ] ; followed by number: amount of dollars +;|||[1808: dollars. ] ; follows number. +;|||[1809:the deputy looked up and said, "Howdy Sheriff Garrett. What +;|||are you going to do to calm down the people in this here town?" ] +; people are upset about level of crime. +[1810:"the people sure are not gonna be happy about this." ] +[1811:And so the west was won. Pat had brought Law to +his domain, and was respected throughout the land. ] ; win message +[1812:And so Pat died in obscurity - known only by a few +historians who read dusty books about the Wild West. ] ; lose message + +[1813:Barney Mason rode up: "Pat, the county has run out of money. +I took temporary charge while you were away, but I had to fire +some deputies. You'd better get into town real quick and sort +it out". He rode off again. ] ; ||| +[1814:Barney Mason rode up: "Pat, there's trouble brewing. +People are saying you're doing no good as sheriff. You'd +better get into the office and do something". ] ;||| +[1815:Barney Mason rode up: "Pat, you finally got it wrong. You've +lost the election. Sorry old friend, you're no longer Sheriff". ] ; ||| + +;Billy strategy messages + +[1850:And so Billy became a legend. His reputation was known +throughout the world, and his story was oft repeated +by people of all countries. ] ; win message +[1851:And so Billy died in obscurity - known only by a few +historians who read dusty books about the wild west. ] ; lose message + +[1852:WANTED! Billy The Kid, Dead or Alive. Reward $]|||| +[1853:. ] ; after 1852/number||| +[1854:was stopped on the way. He pulled up his horse +and dismounted... ] ; Actors name, 1854. Used when +; get a random event whilst trying to go somewhere from map. |||| +; messages to do with meeting a gang... + +[1855:"Hey Billy, come share some coffee"... ] ;||| then 1856 ; œœœ punc +[1856:Billy sat down with the gang and talked of daring deeds +and famous crimes. Then he asked the crucial question... +"I've got a real sweet job planned. You want in?". The gang +looked at Billy. Should they trust this young hotblood? ] ;||| +; 1856, 1857 ||| +[1857:their leader spoke "Sure, but we'll want a good big cut. Now get out of +here before I change my mind". ] ;||| +[1858:Billy and the gang went over and over the targets they +could hit, but they couldn't agree which should be next... ] ; ||| visit gang again +;œœœ made "meaner" + + +; get spotted by a deputy in a lawful town... +[1859:down the street, a deputy called out, "Billy The Kid - hold it +right there. You gonna come quietly?" ] ;||| ; œœœ punc +[1860:RUN AWAY `] ; ||| menu option +[1861:IGNORE HIM `] ; ||| menu option +[1862:Billy fled the town. ] ; run away ||| +[1863:"Go for your gun, outlaw." ] ;||| + +[1864:woke to see his ex-girlfriend Paulita Maxwell tending +his injuries. "You should take more care, my love. Next time +could be your last". With her loving care, he was soon ready to go +again. ] ;&&& note either Billy/Pat. Preceded by Players Name +[1865:Suddenly, Pat Garrett burst in. ] ;&&& +[1866:"Billy, you know I can't +take you in. They'd hang ya like a dog, and I can't stand by and let that +happen. We'll have to settle this now, gun-to-gun. Draw, +outlaw". ] ;&&& +[1867:Billy and Pat approached other and exchanged glances. +Both knew that they were sworn enemies, but also old friends. +Was this to be the end for one of them? ] ;&&& +[1868:CHALLENGE TO DUEL. `] ; menu option &&& +[1869:AVOID CONFLICT. `] ; menu option &&& + + +; messages which occasionally replace the standard greetings +[1870:"Hey, it's Pat Garrett. I hear you polled ] ;||| for Pat ; œœœ punc +[1871:"Hey, it's Billy the Kid. I hear your reward is now $] ; |||| ; œœœ punc +[1872: votes". ] ;||| follows 1870 ; œœœ punc +[1873:". ] ; ||| follows 1871/amount of money ; œœœ punc + +[1880:"Hey, It's Billy The Kid! Get him boys!" ] ; occasionally +; when you go into a bank, or other law-abiding place +; in town. Leads to escape game. ||| +[1881:(lawful) ] ; added to town name on map +[1882:the place was completely deserted. ] ; ||| visit a ranch +; etc. which has gone bust, or similar. + + +; messages Billy gets when gangs go out of business +[1890:Tom O'Foliard rode up and said, "hello old friend, ] ;||| ^^^ +; now now longer mentions Billy + +[1891:the Cooper Gang have been brought to justice". ] ;||| +[1892:the Socorro Vaqueros gang has been brought to justice". ] +[1893:the Seven Rivers Gang gang has been brought to justice". ] +[1894:the Dona Ana Bunch gang has been brought to justice". ] +[1895:the Jesse Evans gang has been brought to justice". ] +[1896:the fugitives' gang has been brought to justice". ] +[1897:the regulators' gang has been brought to justice". ] + +[1900:"Ain't nuthin going on around here". ] ; knows of no ||| +; relevant events in this town. +; Tom O'Foliard's comments on Billy's progress. +[1901:you've gotta hurry up. The Murphy-Dolans are taking over +the county, and you've gotta stop 'em". ] ; œœœ punc +[1902:you've got the Murphy-Dolans on the run. Keep going +ol' buddy". ] ; œœœ punc +[1903:you've almost nailed the Murphy-Dolans, my friend. But +Pat's almost got the territory cleaned up, so you'd better pull +off some pretty big heists to finish 'em off". ] ; œœœ punc +[1904:Billy, you've stolen a total of $] ;^^^Billy added at start (not +; an important change) +[1905: which has bankrupted ] +[1906:of their ranches, but ] +[1907:of the 6 important gangs have been wiped out". ] ; œœœ punc + +; ratings added ^^^^ +[1920:Billy's final reward was $] +[1921: out of a maximum of about $15000, and he will ] ;^^^^ + +[1922:not be remembered. ] +[1923:be a dim memory. ] +[1924:be a figure of fun. ] +[1925:be remembered by many. ] +[1926:be remembered by most. ] +[1927:be a minor hero. ] +[1928:be a popular hero. ] +[1929:be a household name till the end of time. ] + +; ratings added ^^^^ +[1930:Pat's final popularity was ] +[1931: votes out of a maximum of about 4000, and he will ] ;^^^^ + + +;------------------ +;; [2000:Billy The Kid Intro screens. ] +[2001:"Well if it ain't momma's boy Billy! Let's see how good you are +now. Draw, Kid!" ] +[2002:Tunstall Ranch in Lincoln County, across the state line. ] +[2003:"...Murphy and Dolan are dangerous men, Mr Tunstall." ] +[2004:"I ain't gonna let their threats worry me, Sheriff Garrett. I'm +too riled up about the way they're cheating honest farmers." ] +[2005:"Hey now! Here's someone who might be a help. Where've you +been these past years, Billy? John Tunstall, meet the Kid, an old +friend of mine and a good man in a fight." ] +[2006:"I'd like you to join my men, Billy. Here's my lucky Silver +Dollar on account. Keep it safe." ] +[2007:"Pat, Billy, there goes dinner!" ] +[2008:"Another good man dead! I swear I'll bring order to Lincoln +County and hunt down every last outlaw in it." ] +[2009:"You're wrong, Pat, you can't play it by their rules. If you +mean what you said, you'll be hunting me too. Because I vow to do +whatever I must to avenge this murder, inside or outside the law." ] +[2010:"The Legend of Billy The Kid" is an authentic Western for +one or two players. ] +[2011:As Billy, you might tie up your horse on Main Street, +swagger into the saloon, meet an outlaw gang at cards, and go +on to rob the bank... ] +[2012:...or raise money to help a poor widow by rustling a herd +of cows and driving them to Mexico. ] +[2013:As Pat you might learn of a planned train robbery from +the local drunk... ] +[2014:...and lead a posse after the outlaws, track them to their lair, +and shoot it out with the gang. ] + + + + + + + + +-------- + diff --git a/l9dev/regress/games.l9/billy.l9/movecurs.txt b/l9dev/regress/games.l9/billy.l9/movecurs.txt new file mode 100644 index 0000000..be6281f --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/movecurs.txt @@ -0,0 +1,291 @@ + begin + +;;--------------------------------------------------- +; check cursor checks for keypresses associated with +; crosshair movement in the shootup scenes. + +.CheckCursor + gosub @CheckKeys + +.ccNext2 +; check position of cursor on screen +.cursormove + if cursory > 10000 then toohigh + if cursorY > 200 then toolow + if cursorx > 10000 then tooleft + if cursorx > 316 then tooright + goto movethecursor +.toohigh + cursory = 8 + goto movethecursor +.toolow + cursory = 192 + goto movethecursor +.tooleft + cursorx = 8 + goto movethecursor +.tooright + cursorx = 316 + +.movethecursor + dx4 = crosshairacb + gosub @readacbdx4 + dv2 = cursorx + dv3 = cursorz + dv4 = cursorz + sub dv4,cursory + gosub @moveacbdx4 + gosub @CheckCursorSpeed + return + +;------------------------- end of cursor movement checks----------; + +;------------------------- cursor speed routines ---------------- +.CheckCursorSpeed + add TimeHeld,KeyHeld ; count for key kept pressed + if KeyHeld<>0 then sNotDecrease + goto sNotIncrease + +.sNotDecrease + if TimeHeld<2 then sNotIncrease ; key not held long, do + ; not increase cursor speed + add CursorSpeed,c2 ; increase cursor speed + TimeHeld = 0 ; reset check for key hold + +; then check to see if cursor speed exceeds its maximum + if CursorSpeed>MaxCursorSpeed then sLimit + if CursorSpeed=MaxCursorSpeed then sNotIncrease + if CursorSpeed0 then scursorend + TimeHeld = 0 + CursorSpeed = 4 + +.scursorend + keyheld = 0 + return +;---------------------------------------------------------------; + +;------------------------- key check routines---------------------; +.CheckKeys + gosub @sGetControls +; look at kbd/joystick/mouse and return +; dir as new movement direction in standard adventure format +; and FireKey=0 if not pressed, 1 if pressed. +; and FireKeyChange=1 if pressed/released this turn + +; and for directions, returns: +; x1 +; x4 x2 +; x3 +; Non-zero means trying to move in that direction +; and x5=x offset (single pixel movement), signed +; x6=y offset (single pixel movement), signed +; x7=direction number in standard adventure format +; i.e. 1 +; 8 2 +; 7 3 +; 6 4 +; 5 + XSpeed=x5 + YSpeed=x6 + + if FireKey=0 then ccNext1 ; if v2 <> 107 then ccNext1 + gosub @fire + +.ccNext1 + + + +;cif pc +; v1=104 ; keypad 8 +; gosub @MCkeyDown +; if v1<>0 then smoveup +; v1=71;103; keypad 7 +; gosub @MCkeyDown +; if v1<>0 then smoveup +; v1=72 ; cursor up +; gosub @MCkeyDown +; if v1<>0 then smoveup +; v1=73;105 ; keypad 9 +; gosub @MCkeyDown +; if v1=0 then sCursorNotUp +;.smoveup + + + &X1=WordWS(WordMouseXDistance) ; signed distance mouse has moved l/r + &X2=WordWS(WordMouseYDistance) ; signed distance mouse has moved u/d + &WordWS(WordMouseXDistance)=c0 + &WordWS(WordMouseYDistance)=c0 + add CursorX,X1 + add CursorY,X2 +;; or x1,x2 ; did mouse move in either direction? +;; if x1>0 then @mgcRepositionCursor + + + + if UpKey=0 then sCursorNotUp + keyheld = 1 + sub cursory,cursorspeed + +.sCursorNotUp +; v1=73;105 ;keypad 9 +; gosub @MCkeyDown +; if v1<>0 then smoveright +; v1=108 ; keypad 6 +; gosub @MCkeyDown +; if v1<>0 then smoveright +; v1=81;111 ; keypad 3 +; gosub @MCkeyDown +; if v1<>0 then smoveright +; v1=77 ; cursor right +; gosub @MCkeyDown +; if v1=0 then scursornotright +;.smoveright + if RightKey=0 then sCursorNotRight + keyheld = 1 + add cursorx,cursorspeed + +.sCursorNotRight +; v1=110 ; keypad 2 +; gosub @MCkeyDown +; if v1 <> 0 then smovedown +; v1=79;109 ; keypad 1 +; gosub @MCkeyDown +; if v1 <> 0 then smovedown +; v1=81;111 ; keypad 3 +; gosub @MCkeyDown +; if v1 <> 0 then smovedown +; v1=80 ; cursor down +; gosub @MCkeyDown +; if v1 = 0 then sCursorNotDown +;.smovedown + if DownKey=0 then sCursorNotDown + keyheld = 1 + add cursory,CursorSpeed + +.sCursorNotDown +; v1=71;103 ; keypad 7 +; gosub @MCkeyDown +; if v1 <> 0 then @smoveleft +; v1=106 ; keypad 4 +; gosub @MCkeyDown +; if v1 <> 0 then @smoveleft +; v1=79;109 ; keypad 1 +; gosub @MCkeyDown +; if v1 <> 0 then @smoveleft +; v1=75 ; cursor left +; gosub @MCkeyDown +; if v1 = 0 then @sCursormove +;.smoveleft +; if v1=0 then @sCursormove + if LeftKey=0 then sCursorNotLeft + keyheld = 1 + sub cursorx,CursorSpeed +.sCursorNotLeft +;cend + + +;cif st +; v1=104 ; keypad 8 +; gosub @MCkeyDown +; if v1<>0 then smoveup +; v1=103; keypad 7 +; gosub @MCkeyDown +; if v1<>0 then smoveup +; v1=72 ; cursor up +; gosub @MCkeyDown +; if v1<>0 then smoveup +; v1=105 ; keypad 9 +; gosub @MCkeyDown +; if v1=0 then sCursorNotUp +;.smoveup +; keyheld = 1 +; sub cursory,cursorspeed +; +;.sCursorNotUp +; v1=105 ;keypad 9 +; gosub @MCkeyDown +; if v1<>0 then smoveright +; v1=108 ; keypad 6 +; gosub @MCkeyDown +; if v1<>0 then smoveright +; v1=111 ; keypad 3 +; gosub @MCkeyDown +; if v1<>0 then smoveright +; v1=77 ; cursor right +; gosub @MCkeyDown +; if v1=0 then scursornotright +;.smoveright +; keyheld = 1 +; add cursorx,cursorspeed +; +;.sCursorNotRight +; v1=110 ; keypad 2 +; gosub @MCkeyDown +; if v1 <> 0 then smovedown +; v1=109 ; keypad 1 +; gosub @MCkeyDown +; if v1 <> 0 then smovedown +; v1=111 ; keypad 3 +; gosub @MCkeyDown +; if v1 <> 0 then smovedown +; v1=80 ; cursor down +; gosub @MCkeyDown +; if v1 = 0 then sCursorNotDown +;.smovedown +; keyheld = 1 +; add cursory,CursorSpeed +; +;.sCursorNotDown +; v1=103 ; keypad 7 +; gosub @MCkeyDown +; if v1 <> 0 then @smoveleft +; v1=106 ; keypad 4 +; gosub @MCkeyDown +; if v1 <> 0 then @smoveleft +; v1=109 ; keypad 1 +; gosub @MCkeyDown +; if v1 <> 0 then @smoveleft +; v1=75 ; cursor left +; gosub @MCkeyDown +; if v1 = 0 then @sCursormove +;.smoveleft +; if v1=0 then @sCursormove +; keyheld = 1 +; sub cursorx,CursorSpeed +;cend +.scursormove + return +;-------------------------------------------------------------- + +;------------------------ +; set up cursors and man in gunfight +;------------------------------------ +.ccDoCross + if currentscreen <> GameMap then @ccendcross + Objectnumber=MapCursor + dv3 = 384 ; z + dv4 = 300 ; h +; fall through to insertcursor + +.insertcursor + dv2 = 150 + dv5 = 0 + dv6 = 0 + cursorx = dv2 + cursorz = dv3 + cursorh = dv4 + gosub @StartFreeACB ; Starts ACB with ObjectNumber. SetupACB + CrossHairACB = dx4 +.ccendCross + return +;------------------------------------------- + + diff --git a/l9dev/regress/games.l9/billy.l9/music.txt b/l9dev/regress/games.l9/billy.l9/music.txt new file mode 100644 index 0000000..50cd0c7 --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/music.txt @@ -0,0 +1,193 @@ +; MUSIC.TXT +; +; Mike Austin May 1990 +; +; Copyright (C) 1990 Level 9 Computing Ltd +; +var +;; NextMusic ; contains next music +; LastTunePlayed ; set to the value of NextMusic for the +; last tune we've actually asked the driver for. + HaveDoneStop ; set to 1 when we've asked for the current tune +; to stop - i.e. at the next frame build, the driver should be +; ready to play the next tune. + MusicRepeatCount + +const + MusicDebug=0 + +begin +;--------- +.CopyFilename +; from IntroTables(v1) to list17(8) + v2=8 +.CF2 + v3=IntroTables(v1) + if v2>30 then CFBug + list17(v2)=v3 + add v1,c1 + add v2,c1 + if v3<>0 then CF2 +.PTFSRet + return + +.CFBug + break ;****** + break ;****** + return +;---- +.PlayTuneForScene +; NextMusic is offset in IntroTables of tune to play + if MusicOn=0 then PTFSRet + cif AllowMusic + if NextMusic<>0 then PTFSTune ; no new tune + cend +.PTFSRet2 + return + +.PTFSTune + if LastTunePlayed=NextMusic then PTFSRet2 +;; return ; we've just asked for this tune - don't ask again + +;;.PTFST2 + cif AllowMusic + LastTunePlayed=NextMusic ; write it down as having requested this one +;; if HaveDoneStop=1 then PTFSTune2 + +; cif MusicDebug +; v1=7 +; gosub @MCEnableTextBuffer +; code - +; prs " Stop: " +; message cr +; code + +; gosub @WaitKey +; cend ; MusicDebug + + + + v1=0 ; score 0 for everything at the moment. +; v2 not needed + v3=2 ; stop + gosub @MCPlayScore +;; HaveDoneStop=1 +;; return + +.PTFSTune2 +;; HaveDoneStop=0 ; reset the flag so the next tune will do a stop first + + + &v1=IntroTables(NextMusic) + gosub @CopyFilename + + cif MusicDebug + push v1 + push v2 + v1=7 + gosub @MCEnableTextBuffer + code - + prs " Load: " + code + + v1=list17(8) + gosub @MCOswrchV1 + v1=list17(9) + gosub @MCOswrchV1 + v1=list17(10) + gosub @MCOswrchV1 + v1=list17(11) + gosub @MCOswrchV1 + v1=list17(12) + gosub @MCOswrchV1 + v1=list17(13) + gosub @MCOswrchV1 + v1=list17(14) + gosub @MCOswrchV1 + v1=list17(15) + gosub @MCOswrchV1 + v1=list17(16) + gosub @MCOswrchV1 + v1=list17(17) + gosub @MCOswrchV1 + v1=list17(18) + code - + prs " " + print v1 ; print out ascii code. + prs " " + code + + v1=13 + gosub @MCOswrchV1 + gosub @WaitKey + pop v2 + pop v1 + cend ; MusicDebug + + + v1=19 ; list to load into + v2=MidiOffset + v3=0 + gosub @MCLoadFile ; filename is list17(8...) + + + + cif MusicDebug + &v1=list17(0) ; return code + &v2=list17(2) ; return code + &v3=list17(4) ; return code + &v4=list17(6) ; return code +; code - +; print v1 +; prs " " +; print v2 +; prs " " +; message cr +; print v3 +; prs " " +; print v4 +; prs " " +; code + + v1=7 + gosub @MCEnableTextBuffer + code - + prs " Init: " + code + + gosub @WaitKey + cend ; MusicDebug + + + + + v1=19 ; list + v2=MidiOffset + v3=19 ; adlib instrument file? + v4=AdlibOffset + v5=0 ; score number + gosub @MCInitialiseScore +; /* Paramters: +; V1 list V2 offset Music Score +; V3 list V4 offset Adlib Instrument File +; V5 Score number (0-3) + + + cif MusicDebug + v1=7 + gosub @MCEnableTextBuffer + code - + prs " Play: " + code + + gosub @WaitKey + cend ; MusicDebug + + + v1=0 ; score number + v2=255 ; MusicRepeatCount ; 0=1 play, 1=twice etc. + v3=0 ; restart + gosub @MCPlayScore + +; /* Paramters: +; V1 Score number (0-3) +; V2 Repeat Flag (255=forever, 0=once, #=number of times) +; V3 Operation (0=restart, 1=resume, 2=stop) +; */ + cend ; AllowMusic + return +;-------- diff --git a/l9dev/regress/games.l9/billy.l9/pc.l9/acode.acd b/l9dev/regress/games.l9/billy.l9/pc.l9/acode.acd new file mode 100644 index 0000000000000000000000000000000000000000..aa113476f9d81121a4a699760f0a5d3da60231af GIT binary patch literal 39143 zcmeIbe|%KM)jvLSceB~u1c-o${4zmAK%|I>fzXH)a8<-OVOOp3nF7{qy@# zviIJ(XJ*cvIdjgLGiT<0Tpv_Hl^ao`l{X~d<#+c6cK7;q_d)@$cX#iw?%oUCydD8B z+}+FS?!6xMCI$xu{_p?)mjeHPp@4gA;CZD+wH+VYpMQD9RRt>7>#oc<(I$72|037S z>|y?MYO+o>gq>uqYUu4WhicSrm8?+(AwJ|eN}2a3H-}az-28L0`BNl$gDy!{;V6w3SMjz^j1@LmI?8p&l&`M=Bu-OEr{SwkNF!uYGw zWeqpz=1|DdC?zPrQB>U=>Mp;zL}Lihcvv&>F0ECvUX_^Nb!W||Ds%6#WexSpJ8!a? zHOp+e!~&X=f6^SJmRDOraZw(2y^wj3iYbe(I`dZ@G9GV0?s*CGY-$fMx zZ~Z~uItsT_NAb4Ii5KzuxULx794ZAFl4~{cF>S3b5A%AAQywBtYc(ow7~?Qat9XB} z7R8To%Ft;Or6DWiccuI;)!BG^E68Sv*Br7)ju2Ew;w~V_{CC|{m z+%fdmw+&NU#tli{}N&}6gR zZ?k-!4&^q75}+|Nkm;s?=@JSV!F0(PTH|Fk62_?V4@}W9&7pq?#^*{&o8f*J!%&9nH%eXMxs@T>kXiTkMrp)k3&7nR5Ivouq=u8Jaw(Au0c(^&VL*5LL-*twSWZC*LW{QA1&X5H|dPHxe|L(ie5b&{)Ien$yn?R}Qqq#FvIcUEJR&2cV88b@Fp@I;sI<~Z^0=ADbpb;T?beKyasviSvC)56Lwa0i8b7IDJ4 zWP#qQaxzIcN+sU}o;6_Ue09g58Z~rT-mm-AA|u6C#USFWl{xCaNUj@!Rzj#=sDBwU zhs|Yu7=!(Jy}+sLRbAX0M2YA4Z3>uWM|(Tb?)FYKAIz^VX0ODjfYNO6MD{9}H0BIP z;pTv#m#-@OvY(NDhE4y_PcH|HPZY{CcXjb|7{!$l41T0}S4zUqba^VFR9S9Gt^|8c zfLxg1{fh%AqI8jx3xP7ukB*&tPn(JS)2z2nCkvg1O***(9fr#UhvQ}?9&mX@H|$g9S146D06lEOW~^6gF<38u~aSh@(?gWTpZ=N+;BjnF@5fNDV_RqL$3@4{}3e zmgvuVWBpE%r*Zr-gxL!O6WMaidS>`1oQg==G*b++mQKsJo!Z3M3%18 zVSujmpX%{sE+53#VO0sKQ3tJV!8mMIXfTCy3&WO_hC7x>;NDvQwht|6tR+Z zP*AWtG^kWv90q>ixjBPO4u&fP^wM}XAa!U3#tZ}sA8GZhM5kD)Hiu}&Sd#`^Bg}hv zaypn{8pg{s7$@-~nsHA&?n1rsh`INAE0s-s3`ng z=Zg)>V12*{-mQvYCzbc`Z>WDL zY5cxJF)L9FHB$vR#?deKsPG~9bf&&O;4P7QO7sl@Zy`sOU&Wcay$Wq>`u>Hu1g*;2 z1M1{Mu~AIKWuMUy-H4Tppj@01;&9JD9=^_aFuFn1EH^>p;ZKGR9p!_Dl?j42iuTZ zfQMuP=ykr>S}IRSA&?<(0UFXMAB;O3<)k6Rm}}bFwADB0yajE(>2Ngr9wr5NA*6fV zM0K1?69K#s(g_86p9_X;RHedeld{+&mq&rQgVE{e`3^egM{>K&0q_vLW!!+Y>9-o0 z8c8ao-7#pjwG)6Nhw5sf76xK28d(Gz6>QMl8Ir`9?+6vpC`+k$0SSPN0q?gc!^h!H z+y=GaP_2@ymC(E$6Uj~TN?Df5yW6QOG$XB73C1CnY?KFU;HhYTI0!d4U4Cb{_->k^h@REhr8TFJioJ88?Y^ z3sV2QX7jw3N{ljbt4-XRO3Y&-YrGUI+jdKVLCLIEU$%4VcBg|h;_+bpfhbSN_1?&hV`++UNXNyiC zO*T4a;R$B_0dwRSGxHE_n}3Ls7f8wbkMxF~kep6WNxKn10|`@S7+YrI+|(p9C_EFA z-?02fg=a*IH(pI6%i0d{pK!Q_B|liZ#LWMx*;`%)J^+uTm_w<`510i`mG6}+CDuW` zNAXIqc=}4Q;fhhqbO!^lbDrd8C1qvU6_+jY_TG@(1#^-n^*+_GO986H>>gd#uvwYO zi%fD6jo32#Lb9`B@3~5mhfB-*gO^Jvf+)li7|%X$mm#4Es<&Y;*nAJt<45rdA>Svt z7h(pZ?&r21%!74Otcs#f|vO!;zBl1yg&K`sbLOsq~@9l*fe6Pq-BHo$()X+ zOLcJ>OtN?c6ZxVLW}L8u96ef@{&ReJ8t~|$;Y=4&@;7pO0hP+Fwq)OvQYdxz#;>EN zN7^xP^raE=>J>7sVa#>tx{pbaBPC03lq-|r-YlR61@xrBC0PpEhoS|^) z3gnI#))C|egC%P9ZGtWI=wW2h;^$jz7&j3WH+mGyCo-KjBQrQ$zr!oN!hKF0Nh7sc1|A{;bz$Z za#e4jyIb{9$==9oEuFCipm9N)oxgz@NasgWom5y|JkzOD<)f>MXE{}>d>E@9);&4X zp{+d2;rwv6(}4NmOqn10I1fC)=3@Hv&UBOC9}HC^lDZDlqb=ilQ=fEK&?mL9r;j&P zWVP;WSj3!rJneeTlw793;l!)C@pwBopk+uWj-49tiTVrBbg)(cIuE_cC*;K>Kzy3d z_w49<13H{gd5@2@c=;Ihwirf{>LFb-__7#b80B_C4_k7?7O zOhTFeMz#KomXfeJG*p8M+L;^6Ngt zx>jwX*SY{ueg2NOT{PidcBHIAoLg& zKa0<2srXc0uT}9M^V*GBt6(M9sC?dDE4L@{_VP9`5R65X8>B!3vI&rq%?eW3zb-Vh z03iavSwsNaQI@^T_7Q{+5xy2^+@*%SnniD%+>sbR(6$*@9opFDTy^o-<*mW8AXWRQI3W{Buaetb<&p}bK ztJ?43=1(&`eeCt%3@ii{;06l|c7)W^yvRtShUS7rW?G}9VWOG=w_3Rk11%XH&XcfA z;a&DI7fVtOO==T!Iizw8)&hJnH?&;}L6n@--A^9LWUd{(1}zRzdoyxzVr#+|b4{fQ z<(D9lv&Vn4%dBr}axWU> zb6kDR)E9N4Cf5XqncuaUk;igOjaKC-s76gtl@MTb$TXQ-9J8d&^vC-R7!h;@?9?9z z=sen>^Hg#vR?2S0U$I8xmm84VYtXfI3?(1PF}7M3d8Oq^?Gbs$FSHX`1g0SdRe@4ofpD30=rehn6Zt`DFVwkR((c=nHmkp%#|PInnZ*K=*Q+{6d4Jxxy|B9C4Pf zR;>@Z@A>blx~ZICUDmunU`^K5fkpSN9hC(cuqJDpj=dNTgtK1PI=3Vcjpc?T4@IJp z@bAMB=z~bs8#)ll`iG9GPnY~hXF=qD%C3Zxo=5X4;B6N*lUm{|1cNMq^#yir0^W{( z1qpOLSmXLK)!D&HmDoN5qBHgi74KVJyo}ep>f$@~vr#g{o%&p-;#^UNL6Awvjup7q zxXcAFxrnoD|8;TzxHc?Ms2G_ERdG0yhr_-GkbfbNNnVhNK=K+m;KCRem`Nz}iwn?g zY$u(fXf67KzGUfw2}iRFQY*mo(6@l)`lsop%rpDV%llI@?a>34kKJpIPWOGVG z8I~vQJ8#}MTd91eVkn8iD}j|)Vn*Q+#_LN3G6nR#NTrXs=($TzDn;!>QiFMDv1u}@QEDH?L zzRGMa$~Uv~&3XC8Jr4lD739IMxB>c0-Av+K#T%DTg0i=uh9_kz@(x;jS_dtD9hRX) zA;qi~H=FXQy#rYKInQcuzf6n?7_u_#hT6%d`3XQX%mc9rIirzfhCZo+OZOC$5)QD#(|-}#*J{r;fomv16YlXbI-cIZjS zXV>>-WcK9B|0c|uhsf`{deT4|BAr!PhGN6`wknLXiv$F=fMa&Cf$K@$#bYrledp;4t)k61Hd$Hs*6`+Qd-`}PR5}}?!eHIwTOWC(s!%@CfS=( zsa+*VSnC2fV3tKgu8}x2!i~s>y&6&m6R$?=LiR6vnMUvO4_^|`3J~ z<5*8d`#aF)qcmc73<6?Yho`fLVy;Eo$)N3~6r0tn!<0GhU~(g(A^6AQ}RvV-;kAJ|o)<{+2N-YmtdE#B0XmcO>so6n^I-DODZCq&Z@cdGcIa zX?5{;l+>{6*5Xb4D8j*PxC^!%MxYg|=Hr1JDrF6K+0`k?p9(HvLIPgP{K$8uUAU{b z*e?g;%+a$uDV5!-ipxzD^7M0*@WC$Og*Bbm?EyJ-Beg3ZQ-^2_qS@s39&ROd2vHA+ z$3RbRgWEs##}x@MlR#FYOMn*Y3E8cq(z%n8o6=f{ex1PgPQjzFLS2+?eu?)hU>ck2zHztv z?a=i#;icK7Rdr5Qcv&{hvB=24BhlHo3*VYuy7-Y7Cxm~_>;5s}+p`PUcTsQ+P;`Y!Tb`Nll;MRSOu zO=c8Ct4vxUS{K5sFaOlkeE}gYtG)}VE4X})IZufdiWHr32(CIsK~b+Zwc(x2TJQ!- z)_}qjg?b%GOc5LJM~GU`6;D0{20McA>cLOYUk!Em^Zg5%USnUk05OW?_&^lOMQ7yX zVl#~uRD{)FIH`W#j}nw3kD%s1{n7=R9T~4q0n<@A5b@`gsmH5!Re(nO5ly220Jj3P zO0BZ`gjNQZvE!KZFf5APAzJ3aHlzE|CnJ+G`nKrr$aA1Mj`h|^)h8h@!?WW5VX5Qf z2|Dt9K8;na=#&~o(@bFg#;5Tqm_PIBWYzjdH!{*P{e(xZ*q$q9_v7xLc5ia&A&z(s!VvDbtt3g741cTO~k8s*i$s`(Py~d ztWEXU>f%8lE1(_|sMH%-zsCdDF*a*NEtMcb%gyOn6RFty#INd z%dpd+RTzRmrr0aL`|!&*30$j-Cqrsg!ib;D=o(1NNq}c4*CZX35V8dPoe0ClFJX`- z??Q@3Dp#5LE*tNr=*_AeBZ2wK2lEk*E3S?v@XP!NPlIfsQA0^{43}5_qTKLk zJN#o+k;1#5&@(68{RbVIaQ8F1WWwD|yn8`U;}7m$))Ncw{vUmE;oW=nn8Lfi(#IFx z{f!72ds8=f>)g@}v&NmPc|i2Uq?r^OY#TCL%lM-h^3Tj=m7Ex{cNCHj?PCLR3> zAKJ%$^LpfjBT)nyH9|TA_-N#7gf@>K=P&FBypyFU%oxKY62g_i?j)9d&Qh&^@UsLw z#swAXYXT;)$9om`V;tC&3>z2&E4d!_03mZZ8{PqQ=oMr_FDASy2^L}y6P}ZI6IJaTf7q_ zzj?N&aeJEnF|(wX*%~!twbxg<&WV=ua}B(IJ^Tj;Ji>WS1u#YMG%?+~+w}d?1|plR zQ>?Z|o8H;Yb*?dv`O7X_nPJEQo9&(Tx_gOV-jWL=!C3Ud2^Wro7iFxzaLLTy1Y-}) zTs-s7!Pv7ibDPXR5Nxpu{m#imP!{wyiMoPF`r|{6>M|3_QmRl5dGp zqgM_D?qTOtzQ=ZhHYa~>zVv+9KA8EGn5xeRyOJjKBLnDnVWSOKgXV+g8+2al&+_{me)EGmS_oc>={o|bY72TI zri+MVv!FGRw^Lz2#PpAO`*jv?wZ`r5!Fn-0nzySY+eqHN1u>aW4}(ug5kf3y!GGV) z+xvLCS#CX=FXu}>orT-av8EN%&olM0FL*nQx2FrhUf#a;B`js|CgZcCbpMEMe{G&T=&y?GL@^+Hkj%V9WLa~MVI-ov5Uyo91 z^w&&|$W&*66#Ezp`uZf6iN1p!R-->wp_qO-z&tTHUXkZYR9L7NO0{vxHJWXzIf=TM!DE zcM?2VAXE)BJLJG8pTHW|4VES!b07?dmjMFMZgCMO+Fvj=-T*CZJnj)vUm@SXLMdTUE34#Hv{b3h^R#WVmXUGpcIV!4X&utC|%$x@uPTQDGAZ z7tZ=F&?nYA9LoZHFt>1)(%CV^!g8Aghn+xirys_PD;*6qQ;Ve`ZKQM=JXiH_br83^ zB>5nuxq1IY@33#1+-PCOa6iI-kToYenZ7#d7o8fccG#L(I&hei4YxC(9#_k0J}vl(O5w4+f;Kr%=}+&nmT) zHH<-otxy$6$h-joq!2i8F0suI^|Wnp^t?gQg(pM;#qlE^en%fgEgue~S?ODYgvv`S@Fg`Is|7EF1>R(0vAqCLx?S6|2` zP-g;;CJwNKjY1tHN$~h!I3>U$QY2Oonz=XwNo&_=n#>obHEc$Bkhg`orWAsWQ>}P< z-LJ_lnP4$y=Pe6lZ3^VNSNKV>a5PsGSrICeFylP;7XRJUz|`>6EUXbVD)(MLEqY0G zaWwDmRZxprf3f|1M_Us#f(DD(1~sNUaaP)+SD%)KV28vMtb9qhC*kS%ApsI8c=v0+ z5)7@#;&8Ov;&5K>;_&dS#o^IV)L|@v1jAhC5c*8>E0x8xF6)l^hA6ch^$r(rXg#`@ z7Fl`(q%>(Yv~WUg4#acaoBWro%8CjrHq60Y=AS635!1u+KH|%3l<^FA1ZLWBNBk8& zG<5$DFlL%1Tj3<)a1?%OloHWh0q+fQ9^Dx*rz0+EgYKiuVINT5iMF9js!;!02E!!E zjSCMnVF17vLU%0)4$Xrw}YpabbD3T(xEwW`xA^mw6uEP#c4VOY{uv?Lz&> z0DQAt>}zr#_;G6dhhcZELbR?g8OTBrRr#)rQ$Ti(xn^mdW3Cxw-KZ)?gPDO`W)4UV z8wBf15>}OtjRwIaHjt*ZpPB&Or(ha#8f zc7U9L!fVw0pRx+hJ>ks&N@mFfX6YqZF{3#0&JTf--22-c zTB(+z3heh8S8oMUy*%DA2#@4p3>?OE*MrQm_yr?Li*J$}?wAc5?ik+yIIQ`YTaAk7DE<6QyCV|sW@Jkc!UT^kvI9P$5M} z(udg~>o&9rz9e)80LhRd06TDnY|*X(CwRG8h>NQ(-Vc#efiYUBX9mm{?|aXGPP_C% zSRu8TW0P>tDRc0EyYN&yqG87Ai_U9^Z#`@d^P8Pq-{5SLLAPcf zwg@>oN10Cx&2d36ud+2C%G%#MIvH{fEBK)n~> zE!Pg9WWScA^ZzZPB9-f7C%N33kgL?;6lIh^)HwOdtp9-TR$)v=P5!&KBw|%@0Yw<> z1R%sKazQA{i2g)xgLKXOljIh=2eC!FV}H_aKJWhv@5XT1VdQw57Z~6cyv*xb9c=f+#3_)#O?^- z=ja){&6V5Jd3!cvcSnJ5;`wwwhh!PU4uj3=4ETT0l_ZK+fe}5DaIX>$R~V;pIF8BO zX9mn{feW)VfjZhkp@s*bqf&s=(J!e2-^HN;tQa6mP&Vtv?LvXJ1M94Sp?kI5L9ywf za?xw4LDJ-XwZYrJ!8@?QLx5$#^+K)}alKsE>*0DmUGH$$>x;lk*Bj(|1+F*5^^SGD z5w3T<>y3836J2kd>y3B4iLQ5w>rHmOsje4uy)#{JhU=Z;$J>#cRYCtYv7>pkOo8(i$lMxxY5hs=pDV$d-TuVlo{UWzczW-mw4q{yhVTW;?3R(uXqby_qK2I z`kd*V{JJ;(4e#+YOuuXsg)`(~=^t}WFL%u}JL)h48kcLTF?U%FH3XG*%scK2{yPLQ z(>@MIfWZLFzj7fn3Lt6RDSn$y_X0nO?y?8a1RjjR z-%sTCGx=>_PNaVf((nFWrmmN{x0hMo%lxL7S=P(^s+YN~m)HWUF<@4MLCgP#`Yr)~ z2c2n|MjTzV zSV$6Rh9frVcLzzMHQIg0M>VG2(|4T_o&Da-_ZIAkA?!}J1a%*s0EBDi_{Fqm3JD7*Y! zBJdG9lgM+qmNai*S(b(p3-gyI_sBCWC&aSD(VXz=a5&~*?S{;-O1b0wmy04Q3RYR- zoUlK?yWB+f$L1h_(7{l;$Oj5J(J|4;$R!b#6;n}olsMPG43TSUSO;RvDR1H*yT9>s zI5s%4ee)*f9TK~V`pHY3E|$TPC1^n>K1+l8T^^!=j>1?Bog(a-bgZzOd!}vj>KrHH zWJPD^R5@yH^pb9?a}X7uQx(zKG}+JsGa=6%-wuqIX^^1+smgM?Ey~h;tD?@Hs%X|{ z^i@T(@XP;rMG0T`aF_TcsN6H*NLizf!eXDfuZOVS8rAxVyV3^$F`JSfG02(hF&ub* z&zS>lc$zpXZmB#aZP3`AYrg;K7+B!+xk>A3mfJxi{cgGSN2>fG8rQH#Il+Dy2tnsD zs0lq*Vhtpg-ND2ftjsxYa{X&3sL(7lc6*+c?3uOiNty*T~^cw}c_w2!b4)9PdU(oE8ctt_vx z&|u1_?BGSRUWhrwfkYztr9$_hZ8FN0UDw{d2sKXECe-8<8ZR?0w&XXhWe8&NB`y?0 z5BnYNTUUtgvO^q#wS;qd(Efook@7^sr~5b`2`LKQ&1DnwG(thd;lieM@_JxEQlQDW z6bBAmAV2uTRhc6&Pe89_$_;e=)!Z5bsrdYr%hBxn0464y zT9xF4X22w3uYTHAvkz>w4-0Fw+4t)806}g|g|iydQgWZrzvzIa|0DD&`*;{MbB+RNuB@P;b+@YqO%bk9SuaMW={=-Uqo4v z(yV43ES(yF7?_!p2fLdAQSZyj)LI-a^C4#<>#$MmRYs$u7e>Ez$X*~pIUxPkT>D+R zHH~Ub>mzY!g8x2aEEnB9R5g=yiyE%nPm5P3Ax>0d6Wv^Xbkb%uR4I@bGyTyx1^-8=n!IisT! zqKraUK18U_FOG^oQ`Bg?R)^8)lFzZN z8T?6SfVp(9@DiOM@Er^;{|sk@{0pU&n5+IlU!dGF=mc)T4wKiu%~)46$L{6IGDgiB z*~@YWWoM-lic2d(s)eA=$8Si_gChY)-QbrygV|dC(tki{fgN`u2R=b;Ug{0c9U%8Z z4bt`GaNn#|jv1-IKb4C3$@B(a+%@#E8AA4g=_1y9MKXmDi4(>we<6ZFLvV) zKi1O+yQO(WWE~7sM<1>#`ta@kRD`Jnnuc|2Io}RbRZNoQX2?< zh4#VP4R$DNSOx^{l>BhJ&UrHF z7tXy|+@r-xo{?P&w*#mcF(llpg*nbipPRzZP5n@JQF{$p6SMW&(ySk6ix@a~)CE#SR=ikJ$>6(L^ znyVZmHG_^~`gmP|&>}v!uSYO7wG<;OfBqbA*m;&96H3q5M;4V{rF$<9X9aWe!dazS zwm5~))1?ziui?uje0i$8oaev1T9=M5{ZAG|+N$xTpJWXP*2SiTV|n-GnqJ%7+x)U) zbFf?Lk@2OUWsTz7hwsZpM0<(({57_2Bq+#TaHa+BhYi~OQ!0~M6?-vKSUNWliA{`* zFTE-d)Cp}po51@&w0=*-R;av0VN9M?n-KpnW z;=qh8)VBw?aZiqvfo3k$KM%N9rrtNX3;kQvF%jsT7>j$@b#}9O$@LxN*?gsz1|F&bC*%tuzqHxLV3u0|fY>S0EdS7@4)(kOmEHT$@x2qtGJ8)k~RpK~>vrY;I zW1593=S1}7U?FF;KQ6Jd`<8@n3C2pne|?+XU|G8R{D8m{A@O8|F5nGQbfCg)Sp>J+ zDyS1~s^6d!%Dnpm2hnE?rg-ab-obYnA(4=6TQ&M2yZ?s4hJD>Re)*^w9DxTQgd7lq}ep1E2;4v4*1{17s)~Mh~ zu>h_^g88u_HtFQxQJC|Rj)DBcqf;Nr&&$D24u3+iwn%<3QWuFlgaNK2nD3gQPE+y| zXcfni%TA5UaJYS})2F%^4xpQ$?C8$4hor7neU&--6`!isnXwv#UyVsj`A6Q2mw7vo z8WG1Wa*HK2IQ906)}?|FsPImt!|<|-l{WJ#b%u)nF+CL-y(cvlNle#kI_!FZB$N;h z1|#c`fe18+#w;J+jCdVUK|FDUHuponq(IKpa8^0ee$wWClbLqC zs2*?Rdv4xE{#Y=VD|ev(fZh$;xmXP~NR6FmO!8;cFb?H>UVo>?a4x%XXwu9(Mwy>r z_c7K4cR-QVAR<^JK2QjSqT0*a>rYZ^RH9a`@k`o~SrTGna?sHzsm_+v3ZGT`W)=lA zuKkJYln=u)qWpa|U=}r-XIB$%IdQD$QBy4nv!ux^L`YCAjbD2{L+UWo8YM^Ra^Z?% zfLSF#`zoSt-3keag39OZd$U=Yp(qJL;Xp?Ktb+YO@$mtfWz(dp1Gm7kUfU8PRyDz){vE#syTIWgMU9aCUY!>7mPTUv} zQ3Re^KZJh}_%zX%%UJ~-;qg&?319BMMs^9N$L~`xknp$DO`Op)pUX_ceeYt+&RBGV z=;e9T<%4MN<6sE?959JB;IgP}bGh~axfZj9jVO$ZpzWZ(&(bm}cnkC2O;i^WYq&^ztN#k-mo|N6%CO?X&S%v)mJ2(9Opiux+VMTg z|CFTO;Ql(xe|*C=^~%3DnF2_z8a0F~H}@l%Lk_oe4hUK>*)h*!(r5uZmbb^q?Fim- zCrphxj<;vX?MU8orK$!2+_*gsVz>rQH{4$TGH{l&CIj9_TOj|2A+#(x#KHO(=MRX+ znS-O7v1m5_X*4Jvm$%%!@Id0GG4rMcAwl zWGrR8QLEe~ms;M8slUe53o+FkQ!mEUJ+Vpm$5ef6(u$aRDW+;-+jTA)>^|Z{>(4F) zCl7WKJs>MSg4kRL@8V#`dKcYSQ)Twok(U_64aySm&u!+-o$japTPHS6-xJoc>H40C zj-9P>VhDe8bnIMxPp-bFTTN_~zNfp6P0{!C(6LkXJ$X7-s_!{W-_!GAC-TyAEFqxU zaqFzRu12}1U1r-dTHkYQnO1LH7QLhsP_1(3`#@1=dH!?JyiNdv9GMrdgILcfyI+^7 z`CX^brc+D`_~x=@h%Dt!mh;RAP3!%%m>Hf!qgg7In2L_AB9ac zMWKEUqt66xfQ4gfjhu_gNOW}OAZVE;08=opQ(OjO5IM#vAM6N*n8Fm88pMuTN`5Ms zR!qKlD3qUy$wG~iH3 zMvrB0@LwVo&d7|=N(taguXJX}rrUCbKg_mcI5ox8mY8y4Cm>t_gAy$)aRYNKfPUms z1Yp`w8n>^X7MFGv4rPEKCNXfqI49F`zqecC@?+n%_d z0kFdDfS`-JPP#fUuDycudxT=@7 zM`GJwiqtgahr_eF;bsf^NgsC^rj#3fSiH9hfA>=fE;Sp~M>Z{}i;rH$nlGXYhMl-8#L)UM1xJAtx8dM~gF z>++7cd5@9cufU)AitO9{ED6V^zX!B^-!3*hSThV$02f+=hbx+QWaEq=e^D?qc8m8E zr6;gmfgF&eVL56o1O`H$LW~N()y)C_fPsLw(Z=yk44TQ$(~{1Vm;p^0Ad`UD7T|Y+F`h*Ljkt~wP{8S#|BOPzlvHB zy|h7da#fGG4s6k+djXUEw}H9cn~+|AunrLE$2XCCHM|`#-~J|~Uq({O)Ea7~#LQlw z3OpsvIk}K*v(PUw{WZ7rP{+q~Bj<|079*5Q?AL3jdI*$Qyjv#b^Au0_^qpQ8p+34? z1w-~{#`<8&a6qABi4d$P4q>>_NAD&J%nO+>oKFSPJw> zhOC=1in9RwS4G>7@Lij=q0+K&bng7{eeiM4oxdpDyC9Yqi9Up-x#$Uzy56y#%;y7t zl0_IOt)KZdNXr#h|7C9F$b6C?y+D{9GSNS zqqBq7h#`4@=cdT(EdllK)CJH=%XD{3$YtQTVtj~%?3|}6kKq;3qyv4|<^vn-ZvA#{ zouDtwHd8T;n*egsK#a);WX^z(4=m_YxnFX>ct$VT;Af2Z2{->qX5Y!Z_Vh7|j(C1b zge26YknJ~g={v$`n*!cHlzYdumi8$(=|_s^inD{UN$b;3yl(`3IV|oo<^IWsjy)HR zWk;9?1DOlwmLt(^h8V~0+nTah6s@7b%F92nX)*WBr|>f=*~}9#oY{!{)1y~e43OJ zfKxC)63RUESB}}~LA!(RnjmD);y;Q8B-1xyvnPayHf>wR;qd*G1q>m(2^J0_Ar?`d zVV{F8Cq1x3obf1US}T(Sxnm}~Mab{Hq4I$flyOp5WiSp@>}s(=tWMbxLg80qq*3%> zoF>#lhf7NdwMl}(8?jzPYy4i8+-bN)JI%4uaKS!Lz;y3OA^|}qX-BuFM@ax)MF%EBB)QmnN}e?>A3a))^2FVEJI3syLTm>tg5nB$J$WN>s3TQvCoWvHEB6u1@bLbjykB`+Mp~wn?d-8JRzFf;?u1?Ou z(;R!52P-1uQBq4X!6lbX@pI0DWA$?U&EZV*8gyxO@d#K-;CSe1ar4kT*(JwFn5FR1 z&@v{Rj0uu)3CJksk{l+5m1(F!eA%IUD-@ukFH4bC$})NP%W^gzcEPv%PdViK;|6PT zW?EgxDbvvE zL9wWfGWT|{XBy{9%8I*rYd~_NLi>{&6ewZB2UC^I>8cV?=~kfQpEdTm`R#+|iPa|d zdnVwRntW>82x^y8%Q~Jp_Td}mi8t)$1-v`L9RFnI)!0??M-d1JI5S5+>ON53&iUL= z!G3r24bbojwN!ZA(UtI?t^yKbX!I~6o}$p1nQa!V^GYb?8#F_+w8!$(i+V%7gzsPHZ*kDaKf*?Usmoq73bn z3Y)LkkH?egXp?zsJ?sd54VuU!?r1CJ!X5XOS%vg^H5!Hi)6Mf=d6z$L9u;6ra?S;7 z)q@z`SL;mOdh-)`yi<8*o%vM?W>m+G zllkTkoeDfJi{CxWEYyrSL_u`nn8UX5D~D!ts~P$q@A4w(~y+amVW> z|9O+1s4M%m;taFru(H((AJlXBCRZztS>MEG5Q-4~RO9FOQOiSy!IcGphF?sd{10CB zy3f$b^)iIZi(rqJIpUqxan;2yg3ZfEi3j5a467IMBKZPD-&S4O)4##0m`%aKRa-U0 zwVxlFfZ)xc7qCs-esQkJ1hyd{v0-fbd~Vr25-@pRaBU}bvNOlCJjsaS)S-RdC%?nf zV9R)$?9p>Pyh%==g<*uI5K|t5jhe^Th*{d6@Ot2%w5nCBi2&I;I8U z0g*rO7f?u+HMHO_6;c$0z;=LJi#j~aNbweRC3vDmwM5GEc-F5XV^oEjYg` zemt++gK=1tE$Z1od?2qY0u_VY3oF}27bVXi`Q97{kh$_DLTNGYP#@wMDaw2Mjezmq zsB8ky5url76f;~BxBb9>d#=^C|L*FDEQ%~l3wd;um5Xv()C|ZQob&`SiC`nR-w1_f zc7hs~hDzY0MkGZa3j?l`?64-RxZ-T7MZFrS=*cdf>99*@G4`rqHpDZxzEzYG;&fec zOsX}jR4jmnaC^YipW(YFLeQrYCQIPyy5cAzc6vKl-S@y`1?DFNFV*D*yv~*ndbTK& zTXC2$Pm3HMv$!tB8f&8EIMlR7t&8%be~w-gH5b>R0kT9C@E!)o`1aR-%Po{Xj(TcQ z_eW&vNS8+dFSw){U(&wfgMDn)kz`I=*?I*tv_`m#sRer(c#Lfem+yrO^CcdlMcowP zffd39=V1F1Ej=0;5Gb%5TGZkQS$G6|CqxK`4oPZ>qz-ek$d24X9_LtTQN6QltEOh* zY~vC++j!@FP|CG%qf^$VUFV#K*OCK|-clSBzigro=PuCo;CmoAspX1VMKeCchr&ZZ zDZUrEP+Ns=O1=)MR;%OtlC`?wbqs5(2;}>Dy|=Qiz_{AfVu-mB7IA9(YaW8iSg^U^ zZ=DmlKek>r*2=b(mjr-}UMrhSCD${5YcePPRwmIIhXkf}sPf=2;0cSH4zBpIv|`X8 z@MEof1`CS>;KzEEjB2c!CUZ45teU4^?znHY{cJ$Nw@&6E{3cnaG&;Af7iMfh`3Lwmg{~P0r!mAn{HNTl2lOZN z$>FzNibAj9J8FD{c;@3)RX&7|SZ3to%c}fvKElr6<11nTy?}+sCX7DJN`rcm#uqR# z5`h#gbXzslV!%9ubI3#F8v!~_UWXuZLe!cAlCMDaIoxpBiGZf=CCS&+WO8a4&`7>O z?F_?&EH;ZVcg@PF3`O^o{iC+nX*3@&l`}w z34dGghpM-Xn*`p*ry&`zx*OYSdv;NH5N(tCyW^!yH2e#>p4%Nema(C$GGGXF4Si=< z&@dP*H1KTr8Z%Nf7?*wMsjoSy{-ATEU0{7E0=2*E0x9$z2~15Wtv=2654pGP7Q8Be z`XGJHmwBAG{2%oRsU}^%v>Zww1+}4|6GFKd|LIa$A(;YJBbIv4_7(INTsPrw1O9TM zpgSsSJJ;LI1#{vIY`P#AX4an_0K58y-+TZKk^zw`H!ssE`4Aaa28~U`fau|U@f~@@ zoQ>t?%~-TMd%3sq+YE;NvPV0^0_kJ1g3Xzv&$G#O7NHauf?_^F$Ne9X%(~m*b7j*k z{bp;mv~mH?zT|Z-`7YzLrv8Y+@+{i9G=AFmSYHs}yYk+ox?1XYffVoH>pB?L{3KLI zDvL?V3AK+2(K^I%n2nc26HGdzEjb$`-9YkA#-YwE+nQKtzx0*8q>E;lwebC=D1>c9 zAV~wD1u}z0YP^wHB5a~vMd@~qTL9JoQ1LD5uXGu{gMUq`;Bi79Q#&Tf! zi%E zsbOuN3jQE|r~V({hhg0BU{^)|zeA&|68eCtcdF=3p!=#EVThe}$>wGlxi>q#Dc2tr znnPpngp{=!7c}EZv`C>zka@!D+m>FPQnz=R`mRcDR~Xr(zAwbLOI;!b3LuD+Zf<7dtW+V;*zSav|F;Re2aX#Qy}K+4&tm_~*Uz9hBh? zjz*jm7EB{F3TGI!sJ2ro#>ok@OVOwk(5SA-bXI%4(n9a{@0k0*Dco{>BT#6S`R&0| zDhi1}2jn|&@h(tgm*8T~-9+@@n1n3$3cpKQ@(lbkO&)Hp;n4~r+JrMvaE5&S9;;3w z+gyMS^kwAz*w5$7$ldH0QwVJ3gTAygDWH8mD)#|Vi8N0J^iH3ZktnQ@N)$c3#R_Qj z1B*&o?*NsG${N7(dEY^2m6*%_lbTBkAN*4q)h-eRK@`(M1litbm(mgtlz@4VDpYo8 z=O*mJW8)yr+dq(=hs9byvHer(8Hw`MbibrDq*UEGvAxL|*`;xvA?>U_6)LbFvz=y` zt=-YieVqB^L7(qa@pmO#Cp{sp8jjcIO_lr_goN0j)tjfwUrX)>BeTu>eL1+_lHAt? zol<>)-6<6YMi(W(;_V_8GO>$Pid%Te*l@d}>XFYg-DZU_ayr$yA8fVXj2`<_e%pEvW$;Uit;PBL$k!DXfaQWyr<(SnCRzuOF4McL0u|dTu%yMCy{xNe zM{@30-kn$yqmK6pj9mKxj6Q?lrC6^VZdnDLv)78Z{Y=GCjAXU_zU(C-AmG_xbSq>S zUa*|qvinVPyr0e?j3i=d62;QV3brG%nQOCvXi4%TmSHZn4@Mqt;DZ>IdqML(_*PDq z7eJtkXoi6I6llTCilD{sWrU?AH%ENiEoreg*J|Mwz_-B7Tz)Fw_q3-GwJ7(^Whv)d z1S@78ck_xb-)6*tmLf_{x}>#F2lH_Ei&6dsCIo@^( z?h4@Er2hB2tO8Us>J(N{fSaz0o1L1|c9<`Jl!BFlmg4J5^t<{6rK`3do5vyRzR|zL z!3PZCijnWzn!sK=xrlPHjp{GCqx~QuG=`CLX=4gLd@Ss%yh1-_FPg0n~zp-$_{bW&ECJFDuXz4 z{~*y$=luJZ>85pV^=r4KUrC`v7@F16Gfl)axjW7x>==g)XuNa2=CNFt80Y*5K#B~&Px@;4&h&PMq3K$O|j$vV}r1%x{Y7hR|CiflnIG|`ojqLt6Z z5CBw3HZ|?H+K?JU9Y)r3bQ^*1lk0rTeG^5+5tw^JSc>}*GP9JO-LR1p+l_dQ3uL2} zGM3A*Gzy2!9;MnO3kE!&Fg_`WEJ(f&vMB?ET8LH`YU~Tp)YKv8Cb*aBa@wm}4Ri+u z2zDS$dD{0VLpsd8})<%YA|18`obV#BJB1K1P2j^v(|*V|h8y zLqxq}zQW3@0Nn_^-++~zjB_v%D*b~6Tq6aTuz5PQbUT0rU@dsX$1IvB3f6*K%#uH3 zKKc&-_mOFSdK*f@4gyv_AI{r^)sr{q^r<}=sZ}`nw7$k_aFtW5b82zCMwXsd8|ige zF29nw9;9Q07vpK30s_sU_4rNV`=Hgu52#C2dBFT-IX^{+Z<%8~WhuTzfDP(Ie3^Fl z_$3$QA=-VZcAa}|O^jcE06t0PmPv7Ex>VK{Zk4r# z^>X6YQXlg__4mK{{*-w2Y%? z<&KVp5hzLAxogcn9|FrlV9C&Mm@I4Lc5E0Vda%oiR@pGY+xZ2Z zn^F+=mbL&*>UCJ8cTeHWz6ac!{M2>{2Z2UuWk%WZFg|HIJZ&$< z+VrvM>#@|$yWtRjauJB(;Bm7TT)I@}+TO-nDsH^xrI^P2aL7u-&(E;K8T!si$2CBC)QTE{CbSJN92TXsLajBD>Xm{4GM2%!zeC=okx3wnlw1Rt* z2OG8240_xw{g0XXIR3Q{M2wQJZfWhuU>#W`{^qd`UuAm%pp?~3$)}*=*W>R25c?nX Ume@LQFGTzUXytnRJ*ArdAJr@k9RL6T literal 0 HcmV?d00001 diff --git a/l9dev/regress/games.l9/billy.l9/pc.l9/compile.bat b/l9dev/regress/games.l9/billy.l9/pc.l9/compile.bat new file mode 100644 index 0000000..4bca291 --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/pc.l9/compile.bat @@ -0,0 +1,27 @@ +1../firstvar.txt +1mconst.txt +1../aahead.txt +1../language.txt +1../aaconst.txt +1../aavars.txt +1../demo.txt +1../standard.txt +1../menu.txt +1../walkabou.txt +1../fx.txt +1../arcade.txt +1../vectors.txt +1../strategy.txt +1../comms.txt +1../floors.txt +1../goal.txt +1../cache.txt +1../duel.txt +1../fire.txt +1../movecurs.txt +1../spaniob.txt +1../music.txt +1../display.txt +1../print.txt +1../intro.txt +2B40 diff --git a/l9dev/regress/games.l9/billy.l9/pc.l9/exit.txt b/l9dev/regress/games.l9/billy.l9/pc.l9/exit.txt new file mode 100644 index 0000000..8463fd1 --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/pc.l9/exit.txt @@ -0,0 +1,583 @@ +; Dummy Exits File for Hero +; +; EXIT.TXT, data for the game exits. The numeric values for the +; directions is as follows: +; +; 1 up=9 in=11 cross=13 climb=14 jump=15 +; 8 2 down=10 +; ! +; 7 --+-- 3 +; ! +; 6 4 +; 5 +; +; Room 1 - Santa Fe Undertaker +1000 0 0 + +; Room 2 - bank +1000 0 0 + +; Room 3 - bank +1000 0 0 + +; Room 4 - bank +1000 0 0 + +; Room 5 - Santa Fe Wire Office +1000 0 0 + +; Room 6 - bank +1000 0 0 + +; Room 7 +1000 0 0 + +; Room 8 - Santa Fe News Office +1000 0 0 + +; Room 9 +1000 0 0 + +; Room 10 +1000 0 0 + +; Room 11 +1000 0 0 + +; Room 12 - Santa Fe Bank +1000 0 0 + +; Room 13 +1000 0 0 + +; Room 14 +1000 0 0 + +; Room 15 +1000 0 0 + +; Room 16 +1000 0 0 + +; Room 17 +1000 0 0 + +; Room 18 +1000 0 0 + +; Room 19 +1000 0 0 + +; Room 20 +1000 0 0 + +; Room 21 +1000 0 0 + +; Room 22 +1000 0 0 + +; Room 23 +1000 0 0 + +; Room 24 +1000 0 0 + +; Room 25 +1000 0 0 + +; Room 26 +1000 0 0 + +; Room 27 +1000 0 0 + +; Room 28 +1000 0 0 + +; Room 29 +1000 0 0 + +; room 30 - Santa Fe +0001 1 1 ; to undertaker +0001 2 5 ; to wire +1001 3 31 ; to street + +; room 31 - Santa Fe +0001 5 36 ; to other street +0001 1 8 ; to news +0001 2 64 ; to store +1001 3 32 ; to street + +; room 32 - Santa Fe +0001 1 12 ; to bank +1001 3 33 ; to street + +; room 33 - Santa Fe +0001 1 160 ; to saloon +0001 2 0 ; to train station +1001 3 34 ; to street + +; room 34 - Santa Fe +0001 1 80 ; to jail Sheriff's office +0000 5 38 ; south to other street +1001 2 65 ; to store + +; room 35 - Santa Fe (Street 2) +0001 1 171 ; to saloon +1001 3 36 ; to street + +; room 36 - Santa Fe +0001 2 190 ; to courthouse CLOSED +1001 3 37 ; to street + +; room 37 - Santa Fe +0001 1 190 ; CLOSED +0001 2 190 ; CLOSED +1001 3 38 ; to street + +; room 38 - Santa Fe +0001 1 190 ; to other street +0001 2 34 ; to other street +1001 3 39 ; to street + +; room 39 - Santa Fe +1001 1 19 ; to livery stables + +; 40 +1000 0 0 + +; 41 +1000 0 0 +; 42 +1000 0 0 +; 43 +1000 0 0 +; 44 +1000 0 0 +; 45 +1000 0 0 +; 46 +1000 0 0 +; 47 +1000 0 0 +; 48 +1000 0 0 +; 49 +1000 0 0 + +; 50 - El Paso +0001 3 51 +0001 1 168 ; to saloon +1001 2 24 ; to doctors + +; 51 +0001 3 52 +0000 2 55 ; NE goes to other street +1001 1 66 ; to hotel + +; 52 +0001 3 53 +1001 1 13 ; to bank + +; 53 +0001 3 54 +0001 1 6 ; to telegraph office +1001 2 56 ; to other street + +; 54 +1001 1 20 ; to stable + +; 55 El Paso second street. +0001 3 56 +0000 5 51 ; south goes back to southern street +0001 1 167 ; to saloon +1001 2 60 ; to store + +; 56 +0001 3 57 +0001 2 81 ; to sheriff's office +0001 7 55 ; west to saloon/store +0000 5 53 ; south goes back to southern street +1001 1 9 ; to El Paso Sun + +; 57 +1001 1 2 ; to Undertakers + +; 58 +1000 0 0 + +; 59 unused +1000 0 0 + +; 60 store +1000 0 0 + +; 61 +1000 0 0 + +; 62 +1000 0 0 + +; 63 +1000 0 0 + +; 64 Store +1000 0 0 + +; 65 store Zang's (Santa Fe) +1000 0 0 + +; 66 hotel +1000 0 0 + +; 67 Not USED +1000 0 0 + +; 68 +1000 0 0 + +; 69 +1000 0 0 + +; 70 Roswell. +0001 3 71 +1001 1 82 ; to Sheriff's office + +; 71 +0001 3 72 +1001 1 3 ; to undertakers + +; 72 +0001 3 73 +0001 2 61 ; to hardware store +1001 1 173 ; 67 ; to hotel + +; 73 +0001 1 190 ; CLOSED. to post office +1000 0 0 + +; 74 +1000 0 0 + +; 75 +1000 0 0 + +; 76 +1000 0 0 + +; 77 +1000 0 0 + +; 78 +1000 0 0 + +; 79 +1000 0 0 + +; 80 Sheriff's Office (Santa Fe) +1000 0 0 + +; 81 Sheriff's Office (El Paso) +1000 0 0 + +; 82 Sheriff's Office (Roswell) +1000 0 0 + +; 83 Sheriff's Office (Lincoln City) +1000 0 0 + +; 84 Sheriff's Office (Mesilla) +1000 0 0 + +; 85 Sheriff's Office (White Oaks) +1000 0 0 + +; 86 +1000 0 0 + +; 87 +1000 0 0 + +; 88 +1000 0 0 + +; 89 +1000 0 0 + +; 90 +1000 0 0 + +; 91 +1000 0 0 + +; 92 +1000 0 0 + +; 93 +1000 0 0 + +; 94 +1000 0 0 + +; 95 +1000 0 0 + +; 96 +1000 0 0 + +; 97 +1000 0 0 + +; 98 +1000 0 0 + +; 99 +1000 0 0 + +; 100 Lincoln City +0001 7 21 ; to corral / Torreon? +0001 3 101 +1001 1 165 ; to saloon + +; 101 +0001 3 102 +1001 1 62 ; to store + +; 102 +0001 3 103 ; east along street +1001 1 83 ; to sheriff's office + +; 103 +0001 3 104 +1001 1 15 ; to bank + +; 104 +0001 3 105 +1001 1 69 ; to house + +; 105 +1000 1 190 ; CLOSED to courts/jail + +; 106 +1000 0 0 + +; 107 +1000 0 0 + +; 108 +1000 0 0 + +; 109 +1000 0 0 + +; 110 +1000 0 0 + +; 111 +1000 0 0 + +; 112 +1000 0 0 + +; 113 +1000 0 0 + +; 114 +1000 0 0 + +; 115 +1000 0 0 + +; 116 +1000 0 0 + +; 117 +1000 0 0 + +; 118 +1000 0 0 + +; 119 +1000 0 0 + +; 120 +1000 0 0 + +; 121 Mesilla +;; 0001 7 120 ; west to empty desert +0001 3 122 +1001 1 25 ; doctor's + +; 122 +0001 3 123 +1001 1 16 ; to bank + +; 123 +0001 3 124 +0000 2 191 ; NE goes to nowhere +1001 1 169 ; saloon + +; 124 +0000 2 191 ; goes nowhere +1001 1 190 ; CLOSED + +; 125 +1000 0 0 + +; 126 +1000 0 0 + +; 127 +1000 0 0 + +; 128 +1000 0 0 + +; 129 +1000 0 0 + +; 130 +1000 0 0 + +; 131 +1000 0 0 + +; 132 +1000 0 0 + +; 133 +1000 0 0 + +; 134 +1000 0 0 + +; 135 +1000 0 0 + +; 136 +1000 0 0 + +; 137 +1000 0 0 + +; 138 +1000 0 0 + +; 139 +1000 0 0 + +; 140 White Oaks +0001 3 141 +0001 5 142 ; to other street +1001 1 63 ; to store + +; 141 +1001 1 17 ; to bank + +; 142 +0001 3 143 +0000 2 140 ; NE to other street +1001 1 172 ; to saloon + +; 143 +0001 3 144 +1001 1 10 ; to news office + +; 144 +1001 1 22 ; to livery stables + +; 145 +1000 0 0 + +; 146 +1000 0 0 + +; 147 +1000 0 0 + +; 148 +1000 0 0 + +; 149 +1000 0 0 + +; 150 +1000 0 0 + +; 151 +1000 0 0 + +; 152 +1000 0 0 + +; 153 +1000 0 0 + +; 154 +1000 0 0 + +; 155 +1000 0 0 + +; 156 +1000 0 0 + +; 157 +1000 0 0 + +; 158 +1000 0 0 + +; 159 +1000 0 0 + +; 160 ; saloon right (Santa Fe 1) +1001 7 162 + +; 161 +1000 0 0 + +; 162 ; saloon left (Santa Fe 1) +1000 5 33 ; south back to street + +; 163 +1000 0 0 + +; 164 +1000 0 0 + +; 165 ; big single saloon in Lincoln City +1000 0 0 + +; 166 ; left El Paso 1 +1000 5 55 ; south back to street + +; 167 ; right El Paso 1 +1001 7 166 + +; 168 ; single El Paso 2 +1000 0 0 + +; 169 ; single Mesilla +1000 0 0 + +; 170 Left Santa Fe 2 +1000 5 35 ; south back to street + +; 171 Right Santa Fe 2 +1001 7 170 + +; 172 Single White Oaks +1000 0 0 + +; 173 Left Roswell +1001 5 72 ; south back to street + +; 174 Right Roswell +1001 7 173 + +1000 0 0 +0000 0 0 + + diff --git a/l9dev/regress/games.l9/billy.l9/pc.l9/gamedata.dat b/l9dev/regress/games.l9/billy.l9/pc.l9/gamedata.dat new file mode 100644 index 0000000000000000000000000000000000000000..48dfe615d75e8712649b2e0dbf608bb5727d25e2 GIT binary patch literal 19681 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⁡lTApy;*tY>7ShvFX$gc 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 + +; meet Widow Woman who wants ALL BILLY'S MONEY (quel surprise) +[1620:"Oh Sir, I'm jest a poor widow woman. If I can't pay the bank, +I'll be thrown off my little farm and have to go a-begging in the +streets. It ain't no more than $1000] ; followed by amount of gold +[1621:; that surely ain't nothing to a rich man like you". ] +[1622:"O thank you sir. I'll always be a-thinking on you". ] +; yes to 1620 +[1623:"O no! My last hope is gone - I'll be in the poorhouse till the +end of my days". ] ; no to 1620 + +; Desert peasant meets Billy and entices him to his house +; with story that family is sick. While Billy stays there, +; an outlaw arrives wit news of a gold consignment at +; the local bank, but it's a bluff - if Billy leaves to +; travel there, he gets challenged in the street by a bounty +; hunter. (Note: there may or may not be gold in then bank) +[1630:A peasant rode up: "Senor Billy, my family are sick. I no can +make them better. Please, you come try and help them". ] +[1631:he rode off with the peasant and stayed at his farmhouse; +fetching and boiling water and cooking for the family. +After a few days, they were recovering and was +about to leave when there come a knocking at the door... ] +; yes to 1630 (|This is Followed by 1633) +[1632:"Oh pity me, my family will surely die". ] ; no to 1630 +; 1633 moved to 1701||| +[1634:a bounty hunter was lying in wait. "Gotcha! you dumb +saddlebum - you've been set up! I'm gonna take you in, +dead or alive! Draw! ] +; meet Bounty hunter in town, after 1630/1631/1633 + + + + +; ambush by Buckshot Roberts +[1640:As he rode near a farmhouse, a huge man stepped out from +behind a rock: "There's folks as wants to talk to ya. I'm takin' you +in. The name's Roberts - +Buckshot Roberts. I'm a bounty hunter - an' I've taken in fifty scum +like you already, and you're gonna make it fifty-one. ] +;||| removed: You coming quiet? ] + +;|||moved to arcades.[1641:although Buckshot Roberts must have stopped half a dozen +;|||bullets, he still found strength to climb onto a horse and ride off. ] + + + + + + + + + + + + +; win gunfight +++ Move to arcades? + + +; Seven Rivers gang ambushes Billy/Pat in town. +[1645:Suddenly shots started to ring out. He dove for cover. On the +other side of the street, gunslingers hired by the Murphy-Dolan gang were +shooting at him! ] ; |||no longer mentions Billy ^^^now murphy-dolan, +; not seven-rivers + +; Jesse Evans gang ambushes Billy in town. +[1646:Suddenly the air rang to the crack of gunshot. He leapt for +cover. Across the street, he could see some badmen +throwing lead at him! ] ;|||no longer mentions Billy ^^^no longer +; mentions Jesse Evans Gang + +; Tom Cooper offers Billy lots of counterfeit money +; instead of his share in a robbery. +[1650:Tom Cooper said, "Billy, how'd you like 5 times your share of +this robbery - in counterfeit bills. There's a tenderfoot called +Duncan, spreading it around. It's a good looking paper. Won't give you +no problems if you spend it careful. What d'you say". ] +[1651:Cooper smiled: "Say, that's great. Here's the sack of money". +Billy pondered on it. How could he use it most easily? ] +[1652:BUY CATTLE WITH IT. `] ; menu option after 1651 +[1653:SPEND IT NORMALLY. `] ; menu option after 1651 +[1654:Cooper counted out Billy's share and rode off. ] ; no to 1650 + +; when Billy is in Lincoln City Saloon, he overhears that Sheriff +; Brady is on his way to ambush McSween. +[1660:he heard something that made him prick up his ears."You +know that no-good sheriff Brady's gonna run Mrs McSween off her ranch. +Ain't that the devil! But what can we do?" ] +[1661:Good Mrs McSween! An old friend, and a friend of the late +lamented Tunstall! One of the last alive to stand against the Murphy- +Dolans! What now? ] ; after 1660 ;œœœ no longer mentions Billy +[1662:DO NOTHING. `] ; menu option. +[1663:STOP BRADY. ] ; menu option. ->1664 + +[1664:he ran from the saloon and found Brady heading out of town. +He caught up with him and pulled him from his horse. Brady got up, +shaking with anger. It was obvious he was going to draw. ] +; stop brady from 1663 + +; Jose Miguel Sedillo, a friend of Billy's from way back, tells +; him of an attempted horse-robbery on Tunstall Ranch, +; while this is being run by Mrs McSween. +[1670:Jose Miguel Sedillo - an old and +trusted friend - rode up. "You must go help Mrs McSween - the +Murphy-Dolan's are there right now. They try to steal her cattle".] +;||| wording changed to make non-Billy specific + +; do nothing or... +[1671:GO THERE. `] +[1672:they rode off and got ready to fight... ] ; selects 1671: +;goes into shootout. + +; meet Joe Grant,. drunk in a saloon. + + + + + + + + + + + + + +[1674:Joe Grant staggered out of a back room, plainly drunk. "Hey Kid! +You know I'm the fastest gun in the West now. Lookee here at this +pearl-handled pistol I just - er - got gived". ] +[1675:He handed over the +pistol. It surely was pretty, but wouldn't be powerful enough to stop +a mosquito. Only three chambers were loaded. What did he do? ] +; nothing or... +[1676:ROTATE THE BARREL TO AN EMPTY CHAMBER. `] ; menu option +[1677:he turned the barrel and handed the gun back. ] +[1678:Joe Grant was waiting outside. He seemed to have gotten sober +real quick. He snarled "Draw, you prairie dog". ] +[1679:he handed the gun back. ] ; don't play with chambers + +[1680:"Beat it, we don't want none of Tunstall's men hereabouts". ] +; Billy meets hostile soldier + +; meet Mrs McSween +[1681:"Why hello old friend - how're you keeping". ] ;|||no longer mentions billy +[1682:"Gotta get going. This place keeps a body busy". ] +; follows 1681 + +; meet prospector +[1683:"What do you want, stranger? You another claim jumper?" ] + +; take sick man to santa fe +[1684:when they arrived with the sick man clinging to the horse, +he said "thanks for the ride Pard" and staggered off. ] |||^^^no longer +; mentions Billy + +; take sick man somewhere other than Santa Fe + +[1685:when they arrived with the sick man clinging to his horse, +the sick man cursed him for not going to Santa Fe and +staggered off on his own. ] ||| + +[1686:"Sheriff, can you come back later. We're real busy right now". ] +; Pat meets hostile soldier/rancher. ||| copied, slightly changed from 1680 + + + +; messages which result in player being thrown back to map... 1700..1729 +[1700:the man struggled onto the horse, and clung on weakly. He +gasped "Take me to Santa Fe, Mister. I got folks there". ] ; |||now mentions Santa Fe. +; yes to 1509 +; if visit Santa Fe next, get 1684, otherwise get 1685. +[1701:An outlaw burst through the door, brandishing a gun! He saw +Billy and dropped it in terror. "Billy the Kid! Don't kill me please, +I didn't mean ya no harm. Look, I'll help ya. The bank at White Oaks +just had a big payroll for a ranch thereabouts. Git +down there now, ya can pick up a whole load of money". ] ; follows +; 1631 ;||| moved from 1633 + + + +; Pat's strategy game messages... +; Go into sheriff's office... +;|||[1800:the deputy looked up and said, "Howdy Sheriff Garrett. What +;|||can I do for you?" ] +;|||[1801:move deputy to reserve. `] ; take deputy away from town +;|||[1802:move deputy to town. `] ; station deputy in this town. +;|||[1803:ok. ] +;|||[1804:there are ] ; followed by number of deputies +;|||[1805: deputies in town. ] ; follows 1804/digit +;|||[1806: deputies in reserve. ] ; follows 1804/digit +;|||[1807:Pat got a reward of ] ; followed by number: amount of dollars +;|||[1808: dollars. ] ; follows number. +;|||[1809:the deputy looked up and said, "Howdy Sheriff Garrett. What +;|||are you going to do to calm down the people in this here town?" ] +; people are upset about level of crime. +[1810:"the people sure are not gonna be happy about this." ] +[1811:And so the west was won. Pat had brought Law to +his domain, and was respected throughout the land. ] ; win message +[1812:And so Pat died in obscurity - known only by a few +historians who read dusty books about the Wild West. ] ; lose message + +[1813:Barney Mason rode up: "Pat, the county has run out of money. +I took temporary charge while you were away, but I had to fire +some deputies. You'd better get into town real quick and sort +it out". He rode off again. ] ; ||| +[1814:Barney Mason rode up: "Pat, there's trouble brewing. +People are saying you're doing no good as sheriff. You'd +better get into the office and do something". ] ;||| +[1815:Barney Mason rode up: "Pat, you finally got it wrong. You've +lost the election. Sorry old friend, you're no longer Sheriff". ] ; ||| + +;Billy strategy messages + +[1850:And so Billy became a legend. His reputation was known +throughout the world, and his story was oft repeated +by people of all countries. ] ; win message +[1851:And so Billy died in obscurity - known only by a few +historians who read dusty books about the wild west. ] ; lose message + +[1852:WANTED! Billy The Kid, Dead or Alive. Reward $]|||| +[1853:. ] ; after 1852/number||| +[1854:was stopped on the way. He pulled up his horse +and dismounted... ] ; Actors name, 1854. Used when +; get a random event whilst trying to go somewhere from map. |||| +; messages to do with meeting a gang... + +[1855:"Hey Billy, come share some coffee"... ] ;||| then 1856 ; œœœ punc +[1856:Billy sat down with the gang and talked of daring deeds +and famous crimes. Then he asked the crucial question... +"I've got a real sweet job planned. You want in?". The gang +looked at Billy. Should they trust this young hotblood? ] ;||| +; 1856, 1857 ||| +[1857:their leader spoke "Sure, but we'll want a good big cut. Now get out of +here before I change my mind". ] ;||| +[1858:Billy and the gang went over and over the targets they +could hit, but they couldn't agree which should be next... ] ; ||| visit gang again +;œœœ made "meaner" + + +; get spotted by a deputy in a lawful town... +[1859:down the street, a deputy called out, "Billy The Kid - hold it +right there. You gonna come quietly?" ] ;||| ; œœœ punc +[1860:RUN AWAY `] ; ||| menu option +[1861:IGNORE HIM `] ; ||| menu option +[1862:Billy fled the town. ] ; run away ||| +[1863:"Go for your gun, outlaw." ] ;||| + +[1864:woke to see his ex-girlfriend Paulita Maxwell tending +his injuries. "You should take more care, my love. Next time +could be your last". With her loving care, he was soon ready to go +again. ] ;&&& note either Billy/Pat. Preceded by Players Name +[1865:Suddenly, Pat Garrett burst in. ] ;&&& +[1866:"Billy, you know I can't +take you in. They'd hang ya like a dog, and I can't stand by and let that +happen. We'll have to settle this now, gun-to-gun. Draw, +outlaw". ] ;&&& +[1867:Billy and Pat approached other and exchanged glances. +Both knew that they were sworn enemies, but also old friends. +Was this to be the end for one of them? ] ;&&& +[1868:CHALLENGE TO DUEL. `] ; menu option &&& +[1869:AVOID CONFLICT. `] ; menu option &&& + + +; messages which occasionally replace the standard greetings +[1870:"Hey, it's Pat Garrett. I hear you polled ] ;||| for Pat ; œœœ punc +[1871:"Hey, it's Billy the Kid. I hear your reward is now $] ; |||| ; œœœ punc +[1872: votes". ] ;||| follows 1870 ; œœœ punc +[1873:". ] ; ||| follows 1871/amount of money ; œœœ punc + +[1880:"Hey, It's Billy The Kid! Get him boys!" ] ; occasionally +; when you go into a bank, or other law-abiding place +; in town. Leads to escape game. ||| +[1881:(lawful) ] ; added to town name on map +[1882:the place was completely deserted. ] ; ||| visit a ranch +; etc. which has gone bust, or similar. + + +; messages Billy gets when gangs go out of business +[1890:Tom O'Foliard rode up and said, "hello old friend, ] ;||| ^^^ +; now now longer mentions Billy + +[1891:the Cooper Gang have been brought to justice". ] ;||| +[1892:the Socorro Vaqueros gang has been brought to justice". ] +[1893:the Seven Rivers Gang gang has been brought to justice". ] +[1894:the Dona Ana Bunch gang has been brought to justice". ] +[1895:the Jesse Evans gang has been brought to justice". ] +[1896:the fugitives' gang has been brought to justice". ] +[1897:the regulators' gang has been brought to justice". ] + +[1900:"Ain't nuthin going on around here". ] ; knows of no ||| +; relevant events in this town. +; Tom O'Foliard's comments on Billy's progress. +[1901:you've gotta hurry up. The Murphy-Dolans are taking over +the county, and you've gotta stop 'em". ] ; œœœ punc +[1902:you've got the Murphy-Dolans on the run. Keep going +ol' buddy". ] ; œœœ punc +[1903:you've almost nailed the Murphy-Dolans, my friend. But +Pat's almost got the territory cleaned up, so you'd better pull +off some pretty big heists to finish 'em off". ] ; œœœ punc +[1904:Billy, you've stolen a total of $] ;^^^Billy added at start (not +; an important change) +[1905: which has bankrupted ] +[1906:of their ranches, but ] +[1907:of the 6 important gangs have been wiped out". ] ; œœœ punc + +; ratings added ^^^^ +[1920:Billy's final reward was $] +[1921: out of a maximum of about $15000, and he will ] ;^^^^ + +[1922:not be remembered. ] +[1923:be a dim memory. ] +[1924:be a figure of fun. ] +[1925:be remembered by many. ] +[1926:be remembered by most. ] +[1927:be a minor hero. ] +[1928:be a popular hero. ] +[1929:be a household name till the end of time. ] + +; ratings added ^^^^ +[1930:Pat's final popularity was ] +[1931: votes out of a maximum of about 4000, and he will ] ;^^^^ + + +;------------------ +;; [2000:Billy The Kid Intro screens. ] +[2001:"Well if it ain't momma's boy Billy! Let's see how good you are +now. Draw, Kid!" ] +[2002:Tunstall Ranch in Lincoln County, across the state line. ] +[2003:"...Murphy and Dolan are dangerous men, Mr Tunstall." ] +[2004:"I ain't gonna let their threats worry me, Sheriff Garrett. I'm +too riled up about the way they're cheating honest farmers." ] +[2005:"Hey now! Here's someone who might be a help. Where've you +been these past years, Billy? John Tunstall, meet the Kid, an old +friend of mine and a good man in a fight." ] +[2006:"I'd like you to join my men, Billy. Here's my lucky Silver +Dollar on account. Keep it safe." ] +[2007:"Pat, Billy, there goes dinner!" ] +[2008:"Another good man dead! I swear I'll bring order to Lincoln +County and hunt down every last outlaw in it." ] +[2009:"You're wrong, Pat, you can't play it by their rules. If you +mean what you said, you'll be hunting me too. Because I vow to do +whatever I must to avenge this murder, inside or outside the law." ] +[2010:"The Legend of Billy The Kid" is an authentic Western for +one or two players. ] +[2011:As Billy, you might tie up your horse on Main Street, +swagger into the saloon, meet an outlaw gang at cards, and go +on to rob the bank... ] +[2012:...or raise money to help a poor widow by rustling a herd +of cows and driving them to Mexico. ] +[2013:As Pat you might learn of a planned train robbery from +the local drunk... ] +[2014:...and lead a posse after the outlaws, track them to their lair, +and shoot it out with the gang. ] + + + + + + + + +-------- + diff --git a/l9dev/regress/games.l9/billy.l9/pc.l9/ref/acode.acd b/l9dev/regress/games.l9/billy.l9/pc.l9/ref/acode.acd new file mode 100644 index 0000000000000000000000000000000000000000..aa113476f9d81121a4a699760f0a5d3da60231af GIT binary patch literal 39143 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 Ume@LQFGTzUXytnRJ*ArdAJr@k9RL6T literal 0 HcmV?d00001 diff --git a/l9dev/regress/games.l9/billy.l9/pc.l9/ref/gamedata.dat b/l9dev/regress/games.l9/billy.l9/pc.l9/ref/gamedata.dat new file mode 100644 index 0000000000000000000000000000000000000000..48dfe615d75e8712649b2e0dbf608bb5727d25e2 GIT binary patch literal 19681 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⁡lTApy;*tY>7ShvFX$gc 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 + +; meet Widow Woman who wants ALL BILLY'S MONEY (quel surprise) +[1620:"Oh Sir, I'm jest a poor widow woman. If I can't pay the bank, +I'll be thrown off my little farm and have to go a-begging in the +streets. It ain't no more than $1000] ; followed by amount of gold +[1621:; that surely ain't nothing to a rich man like you". ] +[1622:"O thank you sir. I'll always be a-thinking on you". ] +; yes to 1620 +[1623:"O no! My last hope is gone - I'll be in the poorhouse till the +end of my days". ] ; no to 1620 + +; Desert peasant meets Billy and entices him to his house +; with story that family is sick. While Billy stays there, +; an outlaw arrives wit news of a gold consignment at +; the local bank, but it's a bluff - if Billy leaves to +; travel there, he gets challenged in the street by a bounty +; hunter. (Note: there may or may not be gold in then bank) +[1630:A peasant rode up: "Senor Billy, my family are sick. I no can +make them better. Please, you come try and help them". ] +[1631:he rode off with the peasant and stayed at his farmhouse; +fetching and boiling water and cooking for the family. +After a few days, they were recovering and was +about to leave when there come a knocking at the door... ] +; yes to 1630 (|This is Followed by 1633) +[1632:"Oh pity me, my family will surely die". ] ; no to 1630 +; 1633 moved to 1701||| +[1634:a bounty hunter was lying in wait. "Gotcha! you dumb +saddlebum - you've been set up! I'm gonna take you in, +dead or alive! Draw! ] +; meet Bounty hunter in town, after 1630/1631/1633 + + + + +; ambush by Buckshot Roberts +[1640:As he rode near a farmhouse, a huge man stepped out from +behind a rock: "There's folks as wants to talk to ya. I'm takin' you +in. The name's Roberts - +Buckshot Roberts. I'm a bounty hunter - an' I've taken in fifty scum +like you already, and you're gonna make it fifty-one. ] +;||| removed: You coming quiet? ] + +;|||moved to arcades.[1641:although Buckshot Roberts must have stopped half a dozen +;|||bullets, he still found strength to climb onto a horse and ride off. ] + + + + + + + + + + + + +; win gunfight +++ Move to arcades? + + +; Seven Rivers gang ambushes Billy/Pat in town. +[1645:Suddenly shots started to ring out. He dove for cover. On the +other side of the street, gunslingers hired by the Murphy-Dolan gang were +shooting at him! ] ; |||no longer mentions Billy ^^^now murphy-dolan, +; not seven-rivers + +; Jesse Evans gang ambushes Billy in town. +[1646:Suddenly the air rang to the crack of gunshot. He leapt for +cover. Across the street, he could see some badmen +throwing lead at him! ] ;|||no longer mentions Billy ^^^no longer +; mentions Jesse Evans Gang + +; Tom Cooper offers Billy lots of counterfeit money +; instead of his share in a robbery. +[1650:Tom Cooper said, "Billy, how'd you like 5 times your share of +this robbery - in counterfeit bills. There's a tenderfoot called +Duncan, spreading it around. It's a good looking paper. Won't give you +no problems if you spend it careful. What d'you say". ] +[1651:Cooper smiled: "Say, that's great. Here's the sack of money". +Billy pondered on it. How could he use it most easily? ] +[1652:BUY CATTLE WITH IT. `] ; menu option after 1651 +[1653:SPEND IT NORMALLY. `] ; menu option after 1651 +[1654:Cooper counted out Billy's share and rode off. ] ; no to 1650 + +; when Billy is in Lincoln City Saloon, he overhears that Sheriff +; Brady is on his way to ambush McSween. +[1660:he heard something that made him prick up his ears."You +know that no-good sheriff Brady's gonna run Mrs McSween off her ranch. +Ain't that the devil! But what can we do?" ] +[1661:Good Mrs McSween! An old friend, and a friend of the late +lamented Tunstall! One of the last alive to stand against the Murphy- +Dolans! What now? ] ; after 1660 ;œœœ no longer mentions Billy +[1662:DO NOTHING. `] ; menu option. +[1663:STOP BRADY. ] ; menu option. ->1664 + +[1664:he ran from the saloon and found Brady heading out of town. +He caught up with him and pulled him from his horse. Brady got up, +shaking with anger. It was obvious he was going to draw. ] +; stop brady from 1663 + +; Jose Miguel Sedillo, a friend of Billy's from way back, tells +; him of an attempted horse-robbery on Tunstall Ranch, +; while this is being run by Mrs McSween. +[1670:Jose Miguel Sedillo - an old and +trusted friend - rode up. "You must go help Mrs McSween - the +Murphy-Dolan's are there right now. They try to steal her cattle".] +;||| wording changed to make non-Billy specific + +; do nothing or... +[1671:GO THERE. `] +[1672:they rode off and got ready to fight... ] ; selects 1671: +;goes into shootout. + +; meet Joe Grant,. drunk in a saloon. + + + + + + + + + + + + + +[1674:Joe Grant staggered out of a back room, plainly drunk. "Hey Kid! +You know I'm the fastest gun in the West now. Lookee here at this +pearl-handled pistol I just - er - got gived". ] +[1675:He handed over the +pistol. It surely was pretty, but wouldn't be powerful enough to stop +a mosquito. Only three chambers were loaded. What did he do? ] +; nothing or... +[1676:ROTATE THE BARREL TO AN EMPTY CHAMBER. `] ; menu option +[1677:he turned the barrel and handed the gun back. ] +[1678:Joe Grant was waiting outside. He seemed to have gotten sober +real quick. He snarled "Draw, you prairie dog". ] +[1679:he handed the gun back. ] ; don't play with chambers + +[1680:"Beat it, we don't want none of Tunstall's men hereabouts". ] +; Billy meets hostile soldier + +; meet Mrs McSween +[1681:"Why hello old friend - how're you keeping". ] ;|||no longer mentions billy +[1682:"Gotta get going. This place keeps a body busy". ] +; follows 1681 + +; meet prospector +[1683:"What do you want, stranger? You another claim jumper?" ] + +; take sick man to santa fe +[1684:when they arrived with the sick man clinging to the horse, +he said "thanks for the ride Pard" and staggered off. ] |||^^^no longer +; mentions Billy + +; take sick man somewhere other than Santa Fe + +[1685:when they arrived with the sick man clinging to his horse, +the sick man cursed him for not going to Santa Fe and +staggered off on his own. ] ||| + +[1686:"Sheriff, can you come back later. We're real busy right now". ] +; Pat meets hostile soldier/rancher. ||| copied, slightly changed from 1680 + + + +; messages which result in player being thrown back to map... 1700..1729 +[1700:the man struggled onto the horse, and clung on weakly. He +gasped "Take me to Santa Fe, Mister. I got folks there". ] ; |||now mentions Santa Fe. +; yes to 1509 +; if visit Santa Fe next, get 1684, otherwise get 1685. +[1701:An outlaw burst through the door, brandishing a gun! He saw +Billy and dropped it in terror. "Billy the Kid! Don't kill me please, +I didn't mean ya no harm. Look, I'll help ya. The bank at White Oaks +just had a big payroll for a ranch thereabouts. Git +down there now, ya can pick up a whole load of money". ] ; follows +; 1631 ;||| moved from 1633 + + + +; Pat's strategy game messages... +; Go into sheriff's office... +;|||[1800:the deputy looked up and said, "Howdy Sheriff Garrett. What +;|||can I do for you?" ] +;|||[1801:move deputy to reserve. `] ; take deputy away from town +;|||[1802:move deputy to town. `] ; station deputy in this town. +;|||[1803:ok. ] +;|||[1804:there are ] ; followed by number of deputies +;|||[1805: deputies in town. ] ; follows 1804/digit +;|||[1806: deputies in reserve. ] ; follows 1804/digit +;|||[1807:Pat got a reward of ] ; followed by number: amount of dollars +;|||[1808: dollars. ] ; follows number. +;|||[1809:the deputy looked up and said, "Howdy Sheriff Garrett. What +;|||are you going to do to calm down the people in this here town?" ] +; people are upset about level of crime. +[1810:"the people sure are not gonna be happy about this." ] +[1811:And so the west was won. Pat had brought Law to +his domain, and was respected throughout the land. ] ; win message +[1812:And so Pat died in obscurity - known only by a few +historians who read dusty books about the Wild West. ] ; lose message + +[1813:Barney Mason rode up: "Pat, the county has run out of money. +I took temporary charge while you were away, but I had to fire +some deputies. You'd better get into town real quick and sort +it out". He rode off again. ] ; ||| +[1814:Barney Mason rode up: "Pat, there's trouble brewing. +People are saying you're doing no good as sheriff. You'd +better get into the office and do something". ] ;||| +[1815:Barney Mason rode up: "Pat, you finally got it wrong. You've +lost the election. Sorry old friend, you're no longer Sheriff". ] ; ||| + +;Billy strategy messages + +[1850:And so Billy became a legend. His reputation was known +throughout the world, and his story was oft repeated +by people of all countries. ] ; win message +[1851:And so Billy died in obscurity - known only by a few +historians who read dusty books about the wild west. ] ; lose message + +[1852:WANTED! Billy The Kid, Dead or Alive. Reward $]|||| +[1853:. ] ; after 1852/number||| +[1854:was stopped on the way. He pulled up his horse +and dismounted... ] ; Actors name, 1854. Used when +; get a random event whilst trying to go somewhere from map. |||| +; messages to do with meeting a gang... + +[1855:"Hey Billy, come share some coffee"... ] ;||| then 1856 ; œœœ punc +[1856:Billy sat down with the gang and talked of daring deeds +and famous crimes. Then he asked the crucial question... +"I've got a real sweet job planned. You want in?". The gang +looked at Billy. Should they trust this young hotblood? ] ;||| +; 1856, 1857 ||| +[1857:their leader spoke "Sure, but we'll want a good big cut. Now get out of +here before I change my mind". ] ;||| +[1858:Billy and the gang went over and over the targets they +could hit, but they couldn't agree which should be next... ] ; ||| visit gang again +;œœœ made "meaner" + + +; get spotted by a deputy in a lawful town... +[1859:down the street, a deputy called out, "Billy The Kid - hold it +right there. You gonna come quietly?" ] ;||| ; œœœ punc +[1860:RUN AWAY `] ; ||| menu option +[1861:IGNORE HIM `] ; ||| menu option +[1862:Billy fled the town. ] ; run away ||| +[1863:"Go for your gun, outlaw." ] ;||| + +[1864:woke to see his ex-girlfriend Paulita Maxwell tending +his injuries. "You should take more care, my love. Next time +could be your last". With her loving care, he was soon ready to go +again. ] ;&&& note either Billy/Pat. Preceded by Players Name +[1865:Suddenly, Pat Garrett burst in. ] ;&&& +[1866:"Billy, you know I can't +take you in. They'd hang ya like a dog, and I can't stand by and let that +happen. We'll have to settle this now, gun-to-gun. Draw, +outlaw". ] ;&&& +[1867:Billy and Pat approached other and exchanged glances. +Both knew that they were sworn enemies, but also old friends. +Was this to be the end for one of them? ] ;&&& +[1868:CHALLENGE TO DUEL. `] ; menu option &&& +[1869:AVOID CONFLICT. `] ; menu option &&& + + +; messages which occasionally replace the standard greetings +[1870:"Hey, it's Pat Garrett. I hear you polled ] ;||| for Pat ; œœœ punc +[1871:"Hey, it's Billy the Kid. I hear your reward is now $] ; |||| ; œœœ punc +[1872: votes". ] ;||| follows 1870 ; œœœ punc +[1873:". ] ; ||| follows 1871/amount of money ; œœœ punc + +[1880:"Hey, It's Billy The Kid! Get him boys!" ] ; occasionally +; when you go into a bank, or other law-abiding place +; in town. Leads to escape game. ||| +[1881:(lawful) ] ; added to town name on map +[1882:the place was completely deserted. ] ; ||| visit a ranch +; etc. which has gone bust, or similar. + + +; messages Billy gets when gangs go out of business +[1890:Tom O'Foliard rode up and said, "hello old friend, ] ;||| ^^^ +; now now longer mentions Billy + +[1891:the Cooper Gang have been brought to justice". ] ;||| +[1892:the Socorro Vaqueros gang has been brought to justice". ] +[1893:the Seven Rivers Gang gang has been brought to justice". ] +[1894:the Dona Ana Bunch gang has been brought to justice". ] +[1895:the Jesse Evans gang has been brought to justice". ] +[1896:the fugitives' gang has been brought to justice". ] +[1897:the regulators' gang has been brought to justice". ] + +[1900:"Ain't nuthin going on around here". ] ; knows of no ||| +; relevant events in this town. +; Tom O'Foliard's comments on Billy's progress. +[1901:you've gotta hurry up. The Murphy-Dolans are taking over +the county, and you've gotta stop 'em". ] ; œœœ punc +[1902:you've got the Murphy-Dolans on the run. Keep going +ol' buddy". ] ; œœœ punc +[1903:you've almost nailed the Murphy-Dolans, my friend. But +Pat's almost got the territory cleaned up, so you'd better pull +off some pretty big heists to finish 'em off". ] ; œœœ punc +[1904:Billy, you've stolen a total of $] ;^^^Billy added at start (not +; an important change) +[1905: which has bankrupted ] +[1906:of their ranches, but ] +[1907:of the 6 important gangs have been wiped out". ] ; œœœ punc + +; ratings added ^^^^ +[1920:Billy's final reward was $] +[1921: out of a maximum of about $15000, and he will ] ;^^^^ + +[1922:not be remembered. ] +[1923:be a dim memory. ] +[1924:be a figure of fun. ] +[1925:be remembered by many. ] +[1926:be remembered by most. ] +[1927:be a minor hero. ] +[1928:be a popular hero. ] +[1929:be a household name till the end of time. ] + +; ratings added ^^^^ +[1930:Pat's final popularity was ] +[1931: votes out of a maximum of about 4000, and he will ] ;^^^^ + + +;------------------ +;; [2000:Billy The Kid Intro screens. ] +[2001:"Well if it ain't momma's boy Billy! Let's see how good you are +now. Draw, Kid!" ] +[2002:Tunstall Ranch in Lincoln County, across the state line. ] +[2003:"...Murphy and Dolan are dangerous men, Mr Tunstall." ] +[2004:"I ain't gonna let their threats worry me, Sheriff Garrett. I'm +too riled up about the way they're cheating honest farmers." ] +[2005:"Hey now! Here's someone who might be a help. Where've you +been these past years, Billy? John Tunstall, meet the Kid, an old +friend of mine and a good man in a fight." ] +[2006:"I'd like you to join my men, Billy. Here's my lucky Silver +Dollar on account. Keep it safe." ] +[2007:"Pat, Billy, there goes dinner!" ] +[2008:"Another good man dead! I swear I'll bring order to Lincoln +County and hunt down every last outlaw in it." ] +[2009:"You're wrong, Pat, you can't play it by their rules. If you +mean what you said, you'll be hunting me too. Because I vow to do +whatever I must to avenge this murder, inside or outside the law." ] +[2010:"The Legend of Billy The Kid" is an authentic Western for +one or two players. ] +[2011:As Billy, you might tie up your horse on Main Street, +swagger into the saloon, meet an outlaw gang at cards, and go +on to rob the bank... ] +[2012:...or raise money to help a poor widow by rustling a herd +of cows and driving them to Mexico. ] +[2013:As Pat you might learn of a planned train robbery from +the local drunk... ] +[2014:...and lead a posse after the outlaws, track them to their lair, +and shoot it out with the gang. ] + + + + + + + + +-------- + diff --git a/l9dev/regress/games.l9/billy.l9/pc.l9/ref/squash.dat b/l9dev/regress/games.l9/billy.l9/pc.l9/ref/squash.dat new file mode 100644 index 0000000000000000000000000000000000000000..aa922ece6a5e82ac2c29f485e40e63a293cc46b2 GIT binary patch literal 14592 zcmdsdcU)9g*Y3=mJ?AiuGD8RHRRu%_5k-&@DHc#P_7=rBb`*?a6n7hI6cJyISjIu3 zF^QT)jnNp<#8_fbEHPC@#Sv4CEr}S^yACmV-|xHMz4!mi?|1g>Ue{jhSSrzUuz`7P%!^)yb=2&iB93O+}I+2Qc1ohUE-OCcD7oL zo*(aKC8rF$oQ#z4F#Rw=q-ud*u;7QfWD&X1u`zBoZ5Iuh7tX(g{yL9x8M{MPA1)jQ9AlEzmXiM6H&0} zJ)w`pzkG?V3yl=G03ww5umrVN6_=(OKsAZR-k64jEAa}8^ zKs1O(&B;**` zGJ!9#JKSj+|Cx1_*jQ6&IE?2>r?YOM5*f(aQ`eBbcn)8W47`QpnjkZmO-DMKBPYTk z>P2n#9ZU=J|D0_VOrhk#i23Ms_qH+FQ-8WHPzOVr_(S@8zqCX>t&*4G3;X5`eH`oebPhh!~c1TJ9S8usko_hDeha}>uljcuhTW6!>F$4*x=Y0HcPYLw9tB8vf`D@j^cy{C zFLc2dhOp^+x{|uLNBjhaSofMLl{zR7lw;xeH z9)&0$2!wD7a@^1sA1{ZnzYxO4DkP9?GX38_Y%7%%YAs~B(1W-uV+t4k8~k4U-+m>K zT~efwwESaUsc;FvH;KJOA+jg@1BEt#U1I-|)7k)%h~w~^B??Ud?M22$l|WVUhJA

^$WmQHWi^ z7Ppj#g1&7m$|SN; zHcxa%k&fQB*L`Kedjd(1Ac?x67~XkCJR5*q`FH%C_7eM$yak&sF|~x(B8gm1OC5;< zJ;|+!8mUCX-t?8C1U=p{OTvSVWGU2a=gCc)m&3^!p%W{Ou_?4snu+ngZsd}dYEh6} z$W})DQ$|+(N9p1uky|Z(T7IA0HjsTmfJXRY#2*Tyw3v~LTKcI*aKlb~(1(?f0#Nuz zMI=e=1AIl{q9E}`vJVA{{9-hFBMCrJ-LA3;I7>rowO}Ql+a03!Uu9?@)egqr$_2zt zL~0hgr&fi$t^7m0$D|~0GQTl(yZ8ls0Zf^nC(+U0HDhN<>^mk312ld?Fdl10ZeY2I z)RR3I@QOC$?mbMf`4EwLvS$Kb23cMr-pf632F=9bM2Y;^=^PPN=|naJM1b!VktbN^ zW*y6>Un2ZxzJ|C!BUh3A$$U5wSPa-lE%uW5UIRXX)MS|t(u(y4>*AoO9 zyaHF*D{%GUzZU88H7wi1-sqYQ+GJ5rF7-y~UV@HZ`$XItxP4Sq?Y-$x;~eh40_=l(W z1Q4VEk&htf(h`gL+(>;eu^~D-Ua+Zi;2=<9FIkNkxlgDf2#a7P-r~FY_KH2ktYKe* zza;C%eFi@k&rovgt)&;KB5&Wy9+t z{bhGuq`$1LB(>RGP_A!)o?WO0l4JKEp!4yoYTSeWp{52o_67vpMtsz4yA7FaE9?pQ0XW_B#7W&t6yZtz@CShOOGD zrW#zUW`}4`HJQQoNwfksYlOr;p`YWg)I0@$rlyo`RnxolM>S5Ouc=8SU7?m;3$^S^ zsKH^VQPUYbPE9Y-J!+Of-+BJLQu`|18RskewhGA$gjga&LBQ(;y~GaAqcI9CLI}3sjnD1~~6|Vq% zmmi4`*r$TX&s+NG0z24i0!8v`WZkad*~J72G}>g~U+7sMdW#_FJRlE$Z6w}cj;Qx* zh{ni=f~awjx1WJEK-b=408a0Pr{K?%Bzgt##a?_(HeURiM1I5@bz|&xFAF-ZFlg}t z5qXH@O_O1aKxZS}B>uICqG%wWpUR^2_&r~MA|==pFAju`P-hLh)m4MP!K1;zMKGs? z7q_LrVWZ3S{Gf)70jCE%?+s+Btb}Bi0Ph>Ck?=SCP4B*JblonxONX8PC^8Jei^oYk z!Z=gj3U-1l#x~^Y62K$;i5Kz+h@z$ZjF#UeL=X5t6)1W^Tg-Qj)$<14S2r2YXT2r* z3)>)D^#3TMWfC7KqM-lGgZlh-VzHKc0ldN6WpmAkK^xux@BmKN92X&L#jV7jokg9e zkfuQTiHO>XG%ZLX`K;L>v1B1sOT5@P{Qh6n!7>+3A@hJ!(SmgNd(n@zd@w5n=a%h4 zb4j2Z@7p!Q(_W_|jXZ!4!r=Tsly=4Kng5*I8PlD)+D5kA85?Nf` zu2)##0KC&Q4zwj(**>zfpdZa9>Vm@gY9y*(g*8XKN=v+8U7KJTO$IH0!rupdOBcjz z09%vwLE$U}8NK*YX@OCXzm&kCP_g9*yNNW|?wCTa{&itYBK?ZgflQ;$aFL4H2O{zd zU`ga+GzB&b*C00%Y*VmLwKfq|`vj14>;bpq3_U0k72(6aUwH8 zGDS5BY7LDHYO56nq}3T6ueI+8rf;=RArl4sw%yUzOCK$L6Z%=7pk@8&Zhpj9&zc0W zTMwZFUqwFYLeH|7(ZKvrI(Hg9OFYM5tB#iOU1~QO5CYx9M|aT_iO5|Hm}=-yFv;Ra ze#qzmmbHuZzjX&Dl)vYl&)$&_4`3$y%#DR<@tK%uhG4QLLLP}WgU&+2*=j_>MHVhhA)o6IE@Gqjt|b01fnH(t zd>1>8f~RsoC|)uu0hKqDPiyma5*f4CVTnxQJCUomX!B$dLZEI6t);X1>?uL~got<# z01oUYP(U(?GfY$%pFL&xl6hSU>C*1esxwS#Ea((B9Jr-qx}c^0c|6E84g-4Hr~*SmY}mp-Z{z1cdGk#B4xJGg-kYo%NW@L78Zz5P zgewdzS}gBrB(Jj1`{;1Apnu6iYkkOE#Nv4ZyCJ)EYfNy%k^=EB2%IDzSzGZ~fizGB z=>G4c=CNy`@peZXPmpjhD+X13-$3et8lEG!z}|9YaPHWtR6LL`pe1r;sxWdJz6loB zQ=leYAFSmxgoXo8Sx!F7s+B=fcKCbfxG$O3`Bcqlj%AZiEL`}j;@@I9Hrx0 zAN&!Ti~nTDL==Z_vPW=!M+H8He2U0#65C?{Ta3$C{~#Z*UD)Zy_xR8T(jSy2-h~hG zr?eYT3S2|G(ch4(E53=FO`!EJ>p^qz6gP5*J&ysGd4z8`>8BQfa*m-7*f)5!g}o!g zhY0cj$jC`C67jP;I?Ww4r3kKf5;-83*&VNpNEh_LfJ$^Kwern&$25pe!C@Nk9sMNw zjeQsCV0X;zY_EI4j)*)IuS6+sZ0b00&h_MVyoxyGo9TuR`?inQvkCFz!e=8~(brdC zU$w`H$j6^4fXLjdc^Ppt&8J7%NjT6EdcGmOZdaTyf+=4en;=i8ZWmb1UWvmyBN>r! zfARo-EUI7dF|J^p^nKZEAn`#w!LbE&#@$T@?L=l5n1xtCB3m-;4%h%1EsgLAn5+121mnCv$B8ryh9VhXV(J-;p&3zXtkCh?T`78K0p8;W)!4n{iLL?YHyrd5tt%a2uxN!viI@ zl11BV^xQoH#r$WD@Y&!2L*2*mf%JDcnB4wyoi;P)Ep`(Iff|`ery+g;AkRC)JB#S` zNGXqZ1j1-Gc-xnP_*Zb#wkdgfBs2y4GO#bPC4$b0#T^#l9eh4$5CKmb-@IrhF;QQ{o{K2*pCNVRwZ1+!JsM2cOJoq@0^H4)%4uac5jkRD`kr{4mX^b# z81<*)VO2KZKEipVKa&_vnrgt|_{X+odj8**`8&UYJo%?~2QCZ96o}9hha$FIrl7q1 zc{tE2UxLI=@C~1>C*d*%5eq#9{4KkjiZ6?hR_Hw0;qmRIC_V3Oz|V-Qo=nD%5TEFV zdrSBa_6pPyY5TrfR>Hf|Y?cL-gwX@Yfhf8*)Dy9rX8uM8TQJqz>mr5#v^6MsqR@#q zf*bcH(}(x6_W~Dg1a6Diz3F&7Qy%pa~a%^eB`z zC9tO9WW4Na@d4q~3~Gtp97@mP141y}faouPOr3rybc%@DlLxdK^4Cc4ne0{9;B zo_a6bjrr)w1hNa^CGcWtp2xeBVL~SyGlHx^{v9-afCB=j8M@l*H24$FNR~`E_r>2M zS2!hb2)%j$>jsowUxjB|+EdDuGg8>{;?8?&MFl?~BA~l$M!7T%cFOMP7mr^DUr)@Y zv+O%H(tLmX9e5p!-MNjn{^e`R`UswIWcHv-^c>A1Ah9HwMTiRdE9L%zP55{EFIM62 zH1OjxqyM5dkn2F}|2rj<`+uj1tBBjtCuDCBa9Z$UI+%PyLwo@bTcC}J!J7P znFj}gWpLj%myW#y4?AS9{LY5Ah$v|=j-c0}L(v?LC=-s-1Dv6Fra4`{vcQ+hz47x`uodGJUlStuUD z=h-xoLbo0=09(Q;eL)j`$&2v`c*>my)w+v?o$U_t8+$6h5&LNq5O3B+^J%Pu%}oHm zj`rc31-ehl6aY!UJE~rroM+U6iMH27h%~&9PDA?#!>FDBb%N<8_9KZ4!k%zsKI{Xi z;|faBQ%EEqkWiR=gow?_c?8)V19|dj{4eIMftBcKzF8y7g}2jn^C*p-o4KUa|6%5KsO+y#-THO4;ee9|35Rr+UVes@?WM`NlMi`S zovnRdSYmPIJzVB{l*U*GH=^i)d!5`vyCzx@bExpnE4h!3_9|ceMS01r=G7Y;-P5g^ zy-H2zupFF!bkL!;?(C|rseRCTvQK$Q|KF=~{dyP`^B!&fNiaHjJI$4uimTR4YpTPx z&B?thu(fr3&i#|-ko{XVKDYZdRVcoO;Qb^=-G+vXB^KS$@Tx&+pjTG78AxLqh-t*N?e zRCeyW_m`;IU93J+vftR$z#Jnj<$SZt=7v2E$#PCPZo+sck8|nf{wVTZi1Bd7dn+G& zUGFl&y)@d|x3T9}3kPny{abd$2I;rH=bb#HckRj2kmkaMH(@@LR4&I?vRqzXW21{c`dFT++I?x{a8t%tMg1N$=31T}Zm>a%cw0Q;70a8ePWH-aGXK!P zd&gATRlWB>H&$iaJ*t7*_5^CZ50_Ys z-iNKx>%U&9K4jdKuQqwKI5egW;a}lCjYE{NwQHe8(b}cy>Z42LEi|#CAI*E9 zZ$;+bwF{Z8^IDdrTP+U%JH_S^kG#KWUUWIHWmAJKyEUhAvZwo^wNE3=Yt}n6pA}Wy zzw^-IZ5yrY-Z<-%M!bJ@`OE3gQ>xvMUO^8VF$529=T@B$JW{ZF-`MTp4=q7({?%UQ zC~NOVlKSozM@70-mJkVKz24=JXIc+jD54qenf$?D|hfRq(!+z|0z8B0L?@V7-JnrPJdKa#E z+*z?Gh+Y`CsbLuirYoPJ#|d9Qem3de>dtOII=RI)#`sZZ_t_7xL=;qen8TU}G`!;& zWXb2FwF|@Vn2n?Sg7dbnaq|8ya6#KQ4{q3dtn$&89%0!+~m+D=rJ@-X4=gWc*#&~CW?b87l%g&WaPpU3W`8cx!tgU@> z?}iQE#cXQl8)VJemL)zt^4i99*EL&G8t*kEnxgJqSNhG*9g~r9vu5ovvksKSOZQgj zcHPigOBRL=Yg*RrthIN;Mo_fdZCgCH-S>q<^B6I)Cg-~UkG{_~gk{1-9(J$tXD(G$ zdrT3}@SOpVZysnEQPg|la+mXubA*1GE%zhdeE)iT~Pepf^@6-gx<&>jQ@0e0YL>ZQhc2 z`$^UotIxf-d5>Eheul*GcrQa%MZL>+#?n}8@9P7NbH=4C%}51JHYu*~`l$UdS5OOu z*GC60-PG`U^BYyIkB4R-U3%+B^J`9ET@H85&9`PR^AF#;spEj`iYDvV6_wl8o5OpX z&gp!Tsy%9)^{4{$!HKN%g$qr+^Ah69XV&)Lbsg_N*xFD57jgz4CQ@YP%F`aIa3g_>@j`=W|ZEq|JB%>n%~(vqNGUey#lL|h62wovnQ zuKrhjEgEof-kJygGdq?~PH!l&bl;TjcNRK1_?d6wXWbTg9IJP^yXn|x-AW{9_TB3> z$`Iq@hU|0I9yi2ui(<7F-vyC3r07Y2vD^Rp}tTX>vT`%f-D9~!l|dd!^QKT|TN z2gf(8S-qj#VWTv$)ZP^y`EOo)P&i*s2 z$GmpxT3yhJ9tj|hV5MrWpZ*2iyeHjXy~y8xX5IbPoa-G8)GFhNynbA3N6^VG2x5+~?%HxY@5=-s6)EBRhpIfPSMb zGhG*#ShD$M+47ZUu}5_&y%p0wNk2Hj$(M9WjCOUJn%16Dw$!d|afH@Kb)B2G<@IHE zY%_`>c`@wq+!Z9N5ss8zNhy~6{GAH6>7u#;~IuQryNDwa0nr(5$H^7r5O*IYg#$Igal zc29LgXZFZDZjIjAZ4Bg9fFdln#kqWZ!}pKuanqh$(^w~`J5ANb5oTpw&w%*QH%o_U z9Q6+-dm6{A5exc%eE4_a=sc2ic1BWk|p*71VOGyp1FHDd;*U6>W}0qBE1 z5d*?MzEIh9O&<`_+N5R0Wscb6H%3ixU(m4j=7D9izOUEhcOO~tVg5{GQ%bdQbJ$EL ze_Mb2hV|srri!bJH(sziiD|ZzzX#Bv=12@*1bM%%H%G2X%zotL``niIY~A0o?Weq% zUHkOv|7Usq_fB4qp12SDF=vJ1MDFvTtTIO@ZM3)Ou{Wgk{F6bCPCv-0HYs!2SG@+f zja;EVG9uw;VSZ1yn-S$L&*EBl)N86e05c3}Sn>I4uV{0W`zsL(@;ln>5Ib&t{DJSv z;5VaFEAx+`r?fO+7q+9z(HiV=! zn?7{%OTG_px=%P)Z5lAeqkLf3!G zjG3HRuh~8A^oi8H88rocJhQH}JOu6WRQsLBypw}BI{7zGMsHnpXV%)`X7AIvQ}cqe ziYm-e7ZTFDe$o3j%pYQA)0tn>&ECyfvyWao{1}$waYiWpciy+N)~oKYHNgjf17R{ypIUm-^B^lE206X0QJD&p>kj&C56QW{v?7YjUve<;eX*fMCwuOkb!_!c&w`-0+vSx28lBPgNP;=KIlEyc*y8npg=->$8^Y!< zXxOswiIYFoESTMzZY>z+>e`%tbK{M&d5^Aq{YicJqyx^yj~~Jvi|>~17yj+0%3q@I zL1(tn+G-PE=Ak!tCev%f;y||yi%U2yL{G{6y}m_inc=i4I@%P=PLiS+RFGEL5*}|I zfO1aK@W8dVnfTh;kkb-Hyx#OWh98zM_A6x9?|^jr&|)6+dN^n;rXnWi(*Z>A(%JUK*Z zYMyfc_our;o?Uiqf0jYB$Am-_47fIK{;hY}!=NAg*87EJww!Ox|1o#VLT{I6E6~8S z`GwK%=B`_D&1rKX9+_PqLy+pQM9d2-_+r$8yx8)RldB`kjt%!qc;6WE?8dV!uc(64 zO`cbR<)9sU(0U3W*e~97@3Kb~cYbb)$?NYrb9Ll`sxe)hpq;vb!fEc^)N`4s-f0Ul z=QQ;^AABP`^N=owXL0F8kAC>a*^Eptj3++GC+(sO43j-}{oa#gPYApvhXe z)v$gY2wyXC9mux(( zoKaHd=%;^}lkjEGQn%Bp0yJPhyXdra8ZhiG4D+2wS;)w0&tt1{eV_QxJX5nYIAP$X zh8;2lh0~aC?3U@6Iyb_y(2(*?=JSXLr(#>SIc=Sj&o?deR4#fO6%;%ip6cjVRekEy zF6BD|P6ujx^?zJd?RhqL>zhrhAZQ&>*c`py9J{G9vu}KE({kOYb+Wj+|H2(ox^H+Oy%%n)Hf@rB9yd`e*-U1@EB0 zbyCE>9!;y#ekwn6@~xAr7moMN{B7$%vv(C*f8ztUYR@aDyB~`vbM*hTbo{TKHdVb* zP+1R011GQ%7PXzP)N})f?yN&34*)X#L$w zLqU?Zhz~7WYzEnd37cIIp7Z-kL&|FKhGs8oCfi#SX7l$=+XdgskZ0!~S~ea1_Tb^Q z$NW|=TA9}p{4m}4KwjgH!I^xFPW4Q~}E z7dD+0-0jD>ublUpMundrK z)7e~@q-$48hNoj>dUL&ICn*)t|=^BH;e$tRr>E+w{rk5z74sJSv{HOC>%$$D+2a5eYAtdQt?1wlRkRnd(M?~zyVV1x8?iKVu9@y4oE?jYcA2E>x7 zt#BV$Tv<#R6*E z0Z8*zzNk%%Bul<6PP<^+txjQ`owlL%^;d62)@whAjt!e}tEZLheQ>#7iRHaeOYaM} zGQGnVM$G!qX)DS)HM4z_%a#q1KP_P2-ooSi-kn*QQEy0DSL0Ugb@Vb@Cya1ASMBvE z1bi}CQlmSHUowE1<+C4+(b%iKj`>y|elPOjlcI{ZGye>1*sV8jj_z1sjULhB7*(yg zkv~ihtV5&d{Hk?waJ2A#y|!uCrcY-dhoHoA(EG@+6=OGMWNm8Loma3fVh5D2J?;Id z(cZDRpxW!KrWv}LKml2{tf{S7+8daeJ#c>UpnVR%f7)0MXJ1&R%D7x`I;+CmVY6{y zVoTM!Zc#8~_k$BY{wdnr!5;Yj{f}?0P8nJ4)$sm#_&-aywrIEYR7m^yt{LKNjpBn07R!{u!MW7~D{hk+rDMf9AW3R`uvz@lybJ z##3+AI5$ppD(iJ28zR4S_gHW4xO#~qZBg7fjrZZXFvavWBb~POxvyuPu6K*yVeSY@ z=AEwxy)h?a>!wA3#vfYF?36KmyZ-2Y^dr+H`{cUd6C*zj)hmRsK*jv9?uswM^4q?# z;iZcD@Rf?e5xW&bBlalHMSP*ak@pq$$Uob@*eHKxMN}8%^{Bqe=BR$kKcWUIW1>eX z^P?v!3!`6AE{}dyc`bUS(m!TX+m{`)Ls=bDr+gH1vF#ff`$YL&tiS4hY-rmT(>_i$ zpnZyJYWwuIkGJowdZ&GXs;>P@ZQobzN2-2oKjELRume@qbl9kRx5F0I`yK46z>Y^$ z(>h*M9q8DoI@IyH>UPJws;Iapst$2~wtcU}X#^T)5ee{&L62#pClgy#u++P*J3-4;p{-BEPsw6-rfX%U)~RDlj8Z9^X?)wX>PlXjuj zr1#oBlX*W1Hy`@vduo1!3X}Efp~;5-@tc$ErFPqzP!oJ8_}$>$ZoA!T(93S`BKUVQ zwV$GspmJ+e-f(lc)v4kIU&TD3qbgL@9qmwzL8s6-91l4=W zt%`|gB#K7QP>EZuuvz&`c~9{!nxtw`>_#(`A1SY?L(l}FRrp$%CIl;Ml&cjUf|qKf z@z`6;~coZdcAi$IwdEAXS+1vEl=Dkh&cjk1~Y4LWQ7Hol$jA zMJgXD-&3wtc2y=TJ1L_T1&WS}AcY>?Lg$1of}853sz$X~m8$BZ(kcH`{-UT>3`dRV Yd*QK=DZ~l^s%NVEs=?b7|DXN+FOrvhJOBUy literal 0 HcmV?d00001 diff --git a/l9dev/regress/games.l9/billy.l9/pc.l9/squash.dat b/l9dev/regress/games.l9/billy.l9/pc.l9/squash.dat new file mode 100644 index 0000000000000000000000000000000000000000..aa922ece6a5e82ac2c29f485e40e63a293cc46b2 GIT binary patch literal 14592 zcmdsdcU)9g*Y3=mJ?AiuGD8RHRRu%_5k-&@DHc#P_7=rBb`*?a6n7hI6cJyISjIu3 zF^QT)jnNp<#8_fbEHPC@#Sv4CEr}S^yACmV-|xHMz4!mi?|1g>Ue{jhSSrzUuz`7P%!^)yb=2&iB93O+}I+2Qc1ohUE-OCcD7oL zo*(aKC8rF$oQ#z4F#Rw=q-ud*u;7QfWD&X1u`zBoZ5Iuh7tX(g{yL9x8M{MPA1)jQ9AlEzmXiM6H&0} zJ)w`pzkG?V3yl=G03ww5umrVN6_=(OKsAZR-k64jEAa}8^ zKs1O(&B;**` zGJ!9#JKSj+|Cx1_*jQ6&IE?2>r?YOM5*f(aQ`eBbcn)8W47`QpnjkZmO-DMKBPYTk z>P2n#9ZU=J|D0_VOrhk#i23Ms_qH+FQ-8WHPzOVr_(S@8zqCX>t&*4G3;X5`eH`oebPhh!~c1TJ9S8usko_hDeha}>uljcuhTW6!>F$4*x=Y0HcPYLw9tB8vf`D@j^cy{C zFLc2dhOp^+x{|uLNBjhaSofMLl{zR7lw;xeH z9)&0$2!wD7a@^1sA1{ZnzYxO4DkP9?GX38_Y%7%%YAs~B(1W-uV+t4k8~k4U-+m>K zT~efwwESaUsc;FvH;KJOA+jg@1BEt#U1I-|)7k)%h~w~^B??Ud?M22$l|WVUhJA

^$WmQHWi^ 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 Yd*QK=DZ~l^s%NVEs=?b7|DXN+FOrvhJOBUy literal 0 HcmV?d00001 diff --git a/l9dev/regress/games.l9/billy.l9/pc.l9/table.dat b/l9dev/regress/games.l9/billy.l9/pc.l9/table.dat new file mode 100644 index 0000000000000000000000000000000000000000..9e00cfd55c114efa509a56c9475107e431aa1968 GIT binary patch literal 4868 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 literal 0 HcmV?d00001 diff --git a/l9dev/regress/games.l9/billy.l9/pc.l9/table.txt b/l9dev/regress/games.l9/billy.l9/pc.l9/table.txt new file mode 100644 index 0000000..e6b93ff --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/pc.l9/table.txt @@ -0,0 +1,2150 @@ +;;;LaviniaStrumpetMenu equ 204 + +; Billy The Kid source, copyright (C) 1990 Level 9 Computing. +; +; TABLE.TXT, assembler format data for tables, a.k.a lists/arrays. +; (Save the assembled data as TABLE.DAT). +; +; You must start all DEFWs on EVEN boundaries, else subsequent code +; seems to be padded to make it even (according to the GENST listing, +; anyway). The EVEN directive inserts a padding byte if appropriate. +; + ORG 0 +starttables + dc.l ObjectTable-starttables ; object positions etc. + dc.l $FFFF ; HiresTable() Set up in AllocateWorkspaceLists + dc.l $FFFF ; + dc.l LIST4-starttables + dc.l NPCINITIAL-starttables ; npc initial and 'floor pointers' + dc.l TownFixedData-startTables ; + dc.l $FFFF ; 7: TownVarData: variable town stuff (AllocateWorkspaceLists) + dc.l list8-starttables ; 8 - assorted fixed system tables + dc.l IntroTables-startTables ; 9 - input table,object table + dc.l ENDTABLE-starttables +;--- +; +;--- +ObjectTable +; list giving the graphics objects which are important +; to the game. This is divided up by section: i.e. +; the map is separate from the various Sierra-style rooms, +; this separation being handled by the table at the start. + dc.w MapObjects-ObjectTable + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w MapToNewScreen-ObjectTable ; 10 + +; now the object tables themselves. These objects can +; be either xzh or rasters, and their order is critically +; important to the program. If you want to add new objects, +; just add them on the end. If you need to delete an object, +; replace it with a 0 or some new number. DON'T DELETE IT. +; The table ends with -1 + +MapObjects + dc.w 0 ; 0 + dc.w 340 ; 1 cows + dc.w 341 ; 2 cows + dc.w 342 ; 3 cows + dc.w 343 ; 4 cows + dc.w 344 ; 5 cows + dc.w 0 ; 6 + dc.w 0 ; 7 + dc.w 0 ; 8 + dc.w 0 ; 9 + dc.w 3345 ; Santa Fe 10 + dc.w 3346 ; White Oaks 11 + dc.w 592 ; Lincoln City 12 was 3347 + dc.w 588 ; Mesilla 13 + dc.w 589 ; Roswell 14 + dc.w 591 ; 3349 ; El Paso 15 + dc.w 0 ; spare town 16 + dc.w 0 ; spare town 17 + dc.w 0 ; spare town 18 + dc.w 3351 ; Fort Stanton 19 + dc.w 3352 ; Fot Sumner 20 + dc.w 0 ; spare fort 21 + dc.w 0 ; spare fort 22 + dc.w 0 ; spare fort 23 + dc.w 581 ; Unknown ranch near Bitter Lake 24 + dc.w 582 ; Fritz Ranch 25 + dc.w 583 ; Chisum Ranch 26 + dc.w 584 ; Dedrick Ranch 27 + dc.w 585 ; Beckwith Ranch 28 + dc.w 586 ; Reed ranch 29 + dc.w 587 ; unknown ranch 30 + dc.w 576 ; Katz farmhouse 31 + dc.w 577 ; Dunn farmhouse 32 + dc.w 578 ; Rose farmhouse 33 + dc.w 0 ; farmhouse 34 + dc.w 330 ; Mescalero Apache settlement 35 + dc.w 0 ; spare indians 36 (3356 might work) + dc.w 0 ; spare indians 37 + dc.w 0 ; spare indians 38 + dc.w 3304 ; train 39 + dc.w 2730 ; wagon train 40 + dc.w 331; outlaw hideout 41 + dc.w 332 ; outlaw hideout 42 + dc.w 333 ; outlaw hideout 43 + dc.w 334 ; outlaw hideout 44 + dc.w 335 ; outlaw hideout 45 + dc.w 336 ; outlaw hideout 46 + dc.w 0 ; outlaw hideout 47 + dc.w 337 ; prospector's camp 48 + dc.w 329 ; system + dc.w -1 ; end of table + + + + +MapToNewScreen +; for each object picked up in map, this table +; gives the corresponding screen number that it will +; invoke, or 0 if none. + + +; First byte: overlay letter to call. +; Second byte: screen number within that overlay. +; (for map, addition to 400, unsigned) +; (for scrolling games, = map number) +MO equ 69 * 'E' map overlay +SO equ 50 * '2' scrolling overlay +AO equ 51 * '3' arcade overlay, train +IO equ 52 * '4' intermission overlay - separate structure file, +* at least. + +; values for Game variable... +EscapeGame equ 21 +PositionPeopleGame equ 25 +PatWalkGame equ 30 ; drop into pat walking around shooting section. +MinTrackingGame equ 127 ; lowest number a game using the +; tracking maps/cd tables can have +TrackingGame equ 128 +RustlingGame equ 140 + + dc.b MO,0 ; 0 + dc.b SO+0,RustlingGame ; 1 - cows + dc.b SO+0,RustlingGame ; 2 + dc.b SO+0,RustlingGame ; 3 + dc.b SO+0,RustlingGame ; 4 + dc.b SO+0,RustlingGame ; 5 + dc.b SO+0,RustlingGame ; 6 + dc.b MO,0 ; 7 + dc.b MO,0 ; 8 + dc.b MO,0 ; 9 + dc.b MO,430-400 ; Santa Fe 10 + dc.b MO,540-400 ; White Oaks 11 + dc.b MO,500-400 ; Lincoln City 12 + dc.b MO,521-400 ; Mesilla 13 + dc.b MO,470-400 ; Roswell 14 + dc.b MO,450-400 ; El Paso 15 + dc.b MO,0 ; spare town 16 + dc.b MO,0 ; spare town 17 + dc.b MO,0 ; spare town 18 + dc.b IO+0,6 ; Fort Stanton 19 + dc.b IO+0,6 ; Fot Sumner 20 + dc.b IO+0,6 ; spare fort 21 + dc.b IO+0,6 ; spare fort 22 + dc.b IO+0,6 ; spare fort 23 + dc.b AO+0,1 ; Unknown ranch near Bitter Lake 24 + dc.b AO+0,1 ; Fritz Ranch25 + dc.b AO+0,1 ; Chisum Ranch 26 + dc.b AO+0,1 ; Dedrick Ranch 27 + dc.b AO+0,1 ; Beckwith Ranch 28 + dc.b AO+0,1 ; Reed ranch 29 + dc.b AO+0,1 ; unknown ranch 30 + dc.b AO+0,1 ; spare ranch 31 + dc.b AO+0,1 ; spare ranch 32 + dc.b AO+0,1 ; spare ranch 33 + dc.b AO+0,1 ; spare ranch 34 + dc.b IO+0,15 ; Mescalero Apache settlement 35 + dc.b IO+0,15 ; spare indians 36 + dc.b IO+0,15 ; spare indians 37 + dc.b IO+0,15 ; spare indians 38 + dc.b AO+0,21 ; train 39 + dc.b IO+0,5 ; wagon train 40 + dc.b SO+0,TrackingGame ; gang hideout: near santa fe 41 + dc.b SO+0,TrackingGame ; gang hideout: nr White Oaks 42 + dc.b SO+0,TrackingGame ; gang hideout: nr Lincoln Cit#y 43 + dc.b SO+0,TrackingGame ; gang hideout: nr Mesilla 44 + dc.b SO+0,TrackingGame ; gang hideout: nr Roswell 45 + dc.b SO+0,TrackingGame ; gang hideout: nr El Paso 46 + dc.b 0,0 ; 47 + dc.b IO+0,3 ; Prospector 48 + dc.b MO+0,0 ; 48 + dc.b MO+0,0 ; 49 + + + + +;--- + even +ENDOBJECTS +;terraintable +list8 +; +;--------- + even +NPCINITIAL +list5 +LIST4 +; new stuff added for AA + +; Menu text, etc. +; First, ptrs for all uses... + dc.w 0 ;MenuText-List4 0 + dc.w 0 ;MenuData-list4 2 + dc.w 0 ;HiresCoords-list4 4 + dc.w 0 ;ExitOffsets-list4 6 + dc.w 0 ;ObjectGraphics-list4 8 + dc.w 0 ;IntroText-list4 10 + dc.w 0 ;NounVerbTable-list4 12 + dc.w PCpalette-list4 14 + dc.w STpalette-list4 16 + dc.w 0 ;kerri-list4 18 + dc.w CGA2Palettes-list4 20 + dc.w CGA4Palettes-list4 ; 22 + dc.w 0 ; 24 + dc.w 0 ; 26 + dc.w 0 ; 28 + dc.w 0 ; 30 + dc.w 0 ; 32 + dc.w 0 ; 34 + dc.w HeightTable-list4 ; 36 + +CGA2Palettes + dc.b $0,$f,$2,$3,$4,$5,$6,$0,$8,$9,$a,$b,$c,$d,$e,$a ; 2 colour text printing + +; All these palettes have had to be modified because +; colour 6 is used for the highlight bar, so cannot be black. +; dc.b $0,$F,$F,$F,$F,$F,$0,$0,$F,$0,$9,$F,$F,$F,$0,$F ; 2 color map + dc.b $0,$F,$F,$F,$F,$F,$3,$0,$F,$0,$9,$F,$F,$F,$0,$F ; 2 color map + +; dc.b $0,$F,$F,$1,$F,$F,$1,$1,$7,$0,$F,$0,$F,$F,$9,$0 ; 2 Pat, Billy & Barbrawl + dc.b $0,$F,$F,$1,$F,$F,$1,$1,$7,$0,$F,$0,$F,$F,$9,$0 ; 2 Pat, Billy & Barbrawl + +; dc.b $0,$F,$7,$1,$F,$9,$1,$0,$7,$0,$F,$F,$F,$F,$A,$F ; 2 Outside Buildings + dc.b $0,$F,$7,$1,$F,$9,$1,$0,$7,$0,$F,$F,$F,$F,$A,$F ; 2 Outside Buildings + + dc.b $0,$F,$9,$0,$0,$0,$F,$0,$A,$A,$F,$F,$F,$F,$7,$F ; 2 Saloons + + +CGA4Palettes + dc.b $0,$F,$2,$3,$4,$5,$7,$0,$8,$9,$a,$b,$c,$d,$e,$a ; 4 colour text printing + dc.b $0,$F,$0,$F,$A,$5,$2,$0,$F,$5,$7,$0,$A,$F,$A,$A ; 4 color map + dc.b $0,$F,$F,$0,$F,$0,$0,$0,$A,$0,$5,$0,$F,$F,$5,$0 ; 4 Pat, Billy & Barbrawl + dc.b $0,$F,$A,$1,$A,$0,$F,$0,$A,$5,$5,$F,$F,$F,$A,$D ; 4 Outside Buildings + dc.b $0,$D,$A,$0,$A,$1,$F,$0,$A,$5,$5,$0,$F,$F,$D,$7 ; 4 Saloons + + +HeightTable +; used in walkabout code to go from the floor map "height adjust" +; packed byte to a value in pixels: kindof an exponential table. + dc.w -12 ;0 + dc.w -8 + dc.w -4 + dc.w 0 + dc.w 4 ;4 + dc.w 8 + dc.w 12 + dc.w 16 + dc.w 20 ;8 + dc.w 24 + dc.w 28 + dc.w 32 + dc.w 36 ;12 + dc.w 40 + dc.w 44 + dc.w 48 + + + + + + +; dc.b 0,$f,$e,$7,$f,$0,$7,$0,$8,$0,$f,$f,$f,$a,$8,$f ; town +; dc.b 0,$f,$f,$f,$0,$0,$a,$0,$8,$a,$8,$0,$0,$9,$0,$f ; people +; dc.b 0,$f,$0,$f,$0,$0,$7,$0,$a,$8,$f,$0,$e,$f,$7,$7 ; train + + +STpalette; also used for VGA +;commonm colours... +transparent equ $0000 ; ok +white equ $666F ; ok +flesh equ $6339 ;light red +Cyan equ $0346 ; ok +Violet equ $203a ; ok +Iblue equ $0263 ;light blue ok +black equ $0000 ;ok +Red equ $2008 ;dark brown ok +Blue equ $0042 ;dark blue ok +Brown equ $320C ;light brown ok +yellow equ $762D ;ok +Lgrey equ $444e; +Dgrey equ $2221 ;ok +Green equ $0304 ;dark green ok +Lgreen equ $1735; +pink equ $526c;orange 520C ;770a +Lcyan equ $0677; Pete 11/9/90 + + +;additional colours, for 'variable colours' only... + +PaleBlue1 equ $2254 +Vyellow equ $770a +;These colours must have IBM equivalents... +BlueGrey equ $223d ;(Mgrey?) +PaleBlue2 equ $3454 +PaleWhite equ $5671 + + + +PcPalette + + dc.w transparent,white,flesh,cyan + dc.w lgreen + dc.w Dgrey ; is Purple in other games. + dc.w iblue,black,Red,Blue,Brown + dc.w lcyan ; >> Pete 11/9/90 + dc.w yellow,Lgrey,Dgrey,Green + + + + + +IntroTables +; filenames for music, and other random stuff. Not necessarily +; just to do with the intro, but called that for compatability +; with the Grange intro sequence + dc.w SystemPalette-IntroTables ; 0 MapMusic-IntroTables ; 0 + dc.w SaveFilename-IntroTables ; 2 + dc.w 0 ; GunfightMusic-IntroTables ; 4 + dc.w 0 ; TrainMusic-IntroTables ; 6 + dc.w 0 ; MapMusic-IntroTables ; 8 + dc.w 0 ; 10 + dc.w StructureFilename-IntroTables ; 12 + dc.w 0 ; 14 + dc.w 0 ; 16 + dc.w AdlibFilename-IntroTables ; 18 + dc.w ExponentTableName-IntroTables ; 20 + dc.w 0 ; 22 + dc.w 0 ; 24 + dc.w 0 ; 26 + dc.w FontFilename-IntroTables ; 28 Font filename + dc.w 0 ; 30 + dc.w MenuStructures-IntroTables ; 32 + dc.w TownSpritesFilename-IntroTables ; map/town sprites filename 34 + dc.w 0 ; ScrollingSpritesFilename-IntroTables ; offset 36 + dc.w ArcadeSpritesFilename-IntroTables ; arcade games sprites filename offset 38 + dc.w 0 ; reserved for fourth sprites filename offset 40 + dc.w 0 ; MenuStructures-IntroTables ; offset 42 + dc.w ArcadeStructureFIlename-IntroTables ; 44 + dc.w 0 ; 46 + dc.w 0 ; 48 + dc.w 0 ; 50 + dc.w 0 ; 52 + dc.w 0 ; 54 + dc.w 0 ; 56 + dc.w 0 ; 58 + dc.w 0 ; 60 + dc.w 0 ; 62 + dc.w 0 ; 64 + dc.w 0 ; 66 + dc.w 0 ; 68 + dc.w LinkingSprites-IntroTables ; offset 70 + dc.w LinkingStructures-IntroTables ; offset 72 + dc.w IntroSprites-IntroTables ; offset 74 + dc.w IntroStructures-IntroTables ; offset 76 + dc.w 0 ; IdentikitSprites-IntroTables ; offset 78 + dc.w IdentikitStructures-IntroTables ; offset 80 + dc.w 0 ; 82 + dc.w 0 ; 84 + dc.w 0 + dc.w 0 + dc.w ScreenInfo-IntroTables ; offset 90 + dc.w 0 ; 92 + dc.w 0 ; 94 + dc.w 0 ; 96 + dc.w 0 ; 98 + dc.w ambushMusic-IntroTables ; 100 + dc.w BankJobMusic-IntroTables ; 102 + dc.w BarBrawlMusic-IntroTables ; 104 + dc.w CardMusic-IntroTables ; 106 + dc.w ChaseMusic-IntroTables ; 108 + dc.w DuelMusic-IntroTables ; 110 + dc.w Generic1Music-IntroTables ; 112 + dc.w Generic2Music-IntroTables ; 114 + dc.w Generic3Music-IntroTables ; 116 + dc.w Generic4Music-IntroTables ; 118 + dc.w Generic5Music-IntroTables ; 120 + dc.w GetawayMusic-IntroTables ; 122 + dc.w HoeDown1Music-IntroTables ; 124 + dc.w HoeDown2Music-IntroTables ; 126 + dc.w 0 ; HonkyMusic-IntroTables ; 128 + dc.w 0 ; Rag3Music-IntroTables ; 130 + dc.w RagTimeMusic-IntroTables ; 132 + dc.w ShockMusic-IntroTables ; 134 + dc.w ShootOutMusic-IntroTables ; 136 + dc.w ThemeMusic-IntroTables ; 138 + dc.w TrainMusic-IntroTables ; 140 + dc.w ShootOut2Music-IntroTables ; 142 + dc.w ShootOut3Music-IntroTables ; 144 + dc.w 0 ; 146 + dc.w 0 ; 148 +UghSampleNum equ 150 + dc.w UghSample-IntroTables ; 150 +Colt45SampleNum equ 152 + dc.w Colt45Sample-IntroTables ; 152 + dc.w 0 ; 154 + dc.w 0 ; 156 + dc.w 0 ; 158 + dc.w 0 ; 160 + dc.w 0 ; 162 + dc.w 0 ; 164 + dc.w 0 ; 166 + dc.w 0 ; 168 + dc.w 0 ; 170 + dc.w 0 ; 172 + dc.w 0 ; 174 + dc.w 0 ; 176 + dc.w 0 ; 178 + dc.w ShootoutSamples-IntroTables ; 180 + dc.w DuelSamples-IntroTables ; 182 + dc.w RustlingSamples-IntroTables ; 184 + dc.w TrackingSamples-IntroTables ; 186 + dc.w EscapeSamples-IntroTables ; 188 + dc.w BankJobSamples-IntroTables ; 190 + dc.w CardSamples-IntroTables ; 192 + dc.w BrawlSamples-IntroTables ; 194 + dc.w IntroSamples-IntroTables ; 196 + +ExponentTableName + dc.b 'exponent.025',0 + even + + +IntroSamples + dc.b Colt45SampleNum/2 + dc.b 0 + +ShootOutSamples +; list of sample pointers needed for shootout + dc.b Colt45SampleNum/2 + dc.b 0 + +DuelSamples + dc.b Colt45SampleNum/2 + dc.b 0 * 182 +RustlingSamples + dc.b 0 *184 +TrackingSamples + dc.b 0 ; 186 +EscapeSamples + dc.b Colt45SampleNum/2 + dc.b 0 ; 188 +BankJobSamples + dc.b 0 ; 190 +CardSamples + dc.b 0 ; 192 +BrawlSamples + dc.b UghSampleNum/2 + dc.b 0 ; 180 + +Colt45Sample dc.b 'colt45.spl',0 + even +UghSample dc.b 'ugh.spl',0 + even + + +SaveFilename dc.b 'billy.sav',0 + even + +ambushMusic dc.b 'ambushv2.mid',0 + even +BarBrawlMusic dc.b 'barbrawl.mid',0 + even +CardMusic dc.b 'cardv2.mid',0 + even +ChaseMusic dc.b 'Chasev2.mid',0 + even +DuelMusic dc.b 'duel.mid',0 + even +Generic1Music dc.b 'generic.mid',0 + even +Generic2Music dc.b 'gen2v3.mid',0 + even +Generic3Music dc.b 'generic3.mid',0 + even +Generic4Music dc.b 'generic4.mid',0 + even +Generic5Music dc.b 'generic5.mid',0 + even +HoeDown1Music dc.b 'hoedown1.mid',0 + even +HoeDown2Music dc.b 'hoedown2.mid',0 + even +;;HonkyMusic dc.b 'honky1v2.mid',0 + even +;Rag3Music dc.b 'rag3.mid',0 +; even +RagTimeMusic dc.b 'ragtime.mid',0 + even +ShockMusic dc.b 'shockv2.mid',0 + even +ShootOutMusic dc.b 'shootout.mid',0 + even +ShootOut2Music dc.b 'shootut2.mid',0 + even +ShootOut3Music dc.b 'shootut3.mid',0 + even +ThemeMusic dc.b 'map.mid',0 + even +GetawayMusic dc.b 'Getwayv3.mid',0 + even +BankJobMusic dc.b 'BankJbV2.mid',0 + even +TrainMusic dc.b 'train.mid',0 + even + + + +ArcadeSpritesFilename + dc.b 'arcades1.cmp',0 + even + +ArcadeStructureFilename + dc.b 's3.dat',0 * 'desert7.fnt',0 + even + + + +IntroSprites + dc.b 'introsp1.cmp',0 + even +IntroStructures + dc.b 'intros.dat',0 + even + +NoDelay equ 2 +LongTime equ 3000 +DefaultX equ 32 +DefaultY equ 32 +LowY equ 112 +dInsert equ 0 +dInsertR equ 2 +dRemove equ -1 +ScreenInfo +; for intro sequence: contains which picture to display, +; and for how many frames. +; parameters are: +; pic num, frames, soundtrack, repeat count for music + dc.w 99,100,HoeDown2Music-IntroTables,0 * title picture + dc.w 100, 230, RagTimeMusic-IntroTables, 0 ; street scene outside dance hall + dc.w 101, 50, music1, 0 ; blacksmith + dc.w 2001, NoDelay, DefaultX,DefaultY,dInsert + dc.w 102, 200, ChaseMusic-IntroTables, 0 ; street scene, scrolls after half time + dc.w 103, 210, music1, 0 ; possee in valley + + dc.w 104, 110, HoeDown1Music-IntroTables, 0 ; hoe down scene, dancers + dc.w 2002, NoDelay, DefaultX,DefaultY,dInsert + + dc.w 105, 300, 0, 0 ; talk 1 (inside) + dc.w 2003, NoDelay, DefaultX+16,LowY,dInsert + dc.w 2003, 79, DefaultX+16,LowY,dRemove + dc.w 2004, 100, DefaultX-16,LowY,dInsertR + dc.w 2004, 190, DefaultX-16,LowY,dRemove + dc.w 2005, 220, DefaultX+16,LowY,dInsertR + + dc.w 106, 95, HoeDown2Music-IntroTables, 0 ; talk outside + dc.w 2006, NoDelay, DefaultX+48,LowY+32,dInsert + + dc.w 107, 150, 0, 0 ; buggy from distance, scrolls. + dc.w 2007, 90, DefaultX,DefaultY,dInsertR + dc.w 2007, 100,DefaultX,DefaultY,dRemove + + dc.w 108, 70, ShootOutMusic-IntroTables, 0 ; buggy, bandit in F/G + + dc.w 109, 250, 0, 0 ; Tunstall propped on wheel + dc.w 2008, NoDelay, DefaultX,LowY,dInsert + dc.w 2008, 80, DefaultX,LowY,dRemove + dc.w 2009, 100, DefaultX,LowY,dInsertR + +; dc.w 2300, 50, RagTimeMusic-IntroTables,0 ; town scene walkabout in front of bank +; dc.w 2010, NoDelay, DefaultX,DefaultY,dInsert ; Generic text +; dc.w 2304, 50, RagTimeMusic-IntroTables,0 ; dancers +; dc.w 2011, NoDelay, DefaultX,DefaultY+16,dInsert ; Billy text +; +; dc.w 2303, 50, RagTimeMusic-IntroTables,0 ; shootout1 +; dc.w 2012, NoDelay, DefaultX,DefaultY,dInsert ; Billy Text 2 +; +; dc.w 2301, 50, RagTimeMusic-IntroTables,0 ; shop +; dc.w 2013, NoDelay, DefaultX,DefaultY,dInsert ; Pat Text 1 +; dc.w 2302, 50, RagTimeMusic-IntroTables,0 ; shootout2 +; dc.w 2014, NoDelay, DefaultX,DefaultY,dInsert ; Pat Text 2 + dc.w -1,-1,-1 + +music1 equ 0 * no music at present + + +IdentikitStructures + dc.b 'identiks.dat',0 + even + +LinkingSprites + dc.b 'linking1.cmp',0 + even + +LinkingStructures + dc.b 'linkings.dat',0 + even + + +SystemPalette +; palette for returning to system on ST ONLY +; to the ega colors. + dc.w $777f ; 0000 ; transparent/black + dc.w $0000 ; 777f ; white + dc.w $3330 ; + dc.w $0000 ; 777f ; + dc.w $0004 ; + dc.w $777a ; + dc.w $3333 ; + dc.w $7770 ; + dc.w $0008 ; + dc.w $7772 ; + dc.w $333c ; + dc.w $7776 ; + dc.w $000d ; yellow + dc.w $777e ; lgrey + dc.w $3331 ; dgrey + dc.w $7774 ; green + +;----------------------------------------- + +AdlibFilename + dc.b 'all.adl',0 + even + +TownSpritesFilename + dc.b 'sprites1.cmp',0 + even + +FontFilename + dc.b 'western.fnt',0 + even + +StructureFilename + dc.b 's.dat',0 + even + + + include 'MENUDATA.TXT',0 + + +;------------------ +TownFixedData ; a list on its own + dc.w TownPeopleData-TownFixedData ; 0 + dc.w TownData-TownFixedData ; 2 + dc.w SubPlotData-TownFixedData ; 4 + dc.w IdentikitPrototypes-TownFixedData ; 6 + + +IdentikitPrototypes +; For each person type we have a list of entries of the following +; form: +; .b First XZH (0 terminates person) +; .b Number of XZHs possible (1 upwards) +; .b First RasterOffset +; .b Number of Raster Offsets to choose from (0 upwards) + dc.w BlankPerson-TownFixedData * type 0 person + dc.w Type1Person-TownFixedData * tough cowboy + dc.w Type2Person-TownFixedData * mexican + dc.w Type3Person-TownFixedData + dc.w Type4Person-TownFixedData + dc.w Type5Person-TownFixedData + dc.w Type6Person-TownFixedData + dc.w Type7Person-TownFixedData + dc.w Type8Person-TownFixedData + dc.w Type9Person-TownFixedData + dc.w Type10Person-TownFixedData + dc.w Type11Person-TownFixedData + dc.w Type12Person-TownFixedData + dc.w Type13Person-TownFixedData + dc.w Type14Person-TownFixedData + dc.w Type15Person-TownFixedData + dc.w Type16Person-TownFixedData + dc.w Type17Person-TownFixedData + dc.w Type18Person-TownFixedData ; sick man etc. + dc.w Type19Person-TownFixedData ; mex peasant. + dc.w Type20Person-TownFixedData ; soldier + dc.w Type21Person-TownFixedData ; Clint, with cape. + +BlankPerson +* used for people like Indian chief, prospector who +* are already shown in the picture, so don't need to be +* shown separately + dc.b 0,0,0,0 + +Type1Person +* Cowboy, jerkin, black hat, moustache +* As used in room 430 (Santa Fe) + dc.b 24,1,0,1 ; neck: closed, for string tie + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,8 ; hair: not greying +; no sideburns +; no waistcoat + dc.b 27,1,3,1 ; trouser: blue jeans + dc.b 29,1,0,1 ; gunbelt + + dc.b 25,1,0,1 ; shirt + + dc.b 33,1,0,0 ; string tie +; dealer's armbands not used. + dc.b 35,1,0,1 ; jacket + dc.b 38,1,0,1 ; hands + dc.b 42,1,1,1 ; hat: always the same. + dc.b 0,0,0,0 + +Type2Person +* Mexican cross-breed, as used in 431 (Santa Fe) + dc.b 23,1,0,1 ; neck - open + dc.b 19,1,0,1 ; mexican neck overlay + dc.b 1,1,0,18 ; face + dc.b 20,1,4,1 ; top of head + dc.b 21,1,0,4 ; hair +;; dc.b 22,1,0,2 ; sideburn + dc.b 27,1,2,1 ; trousers: brown + dc.b 28,2,0,1 ; belt/gunbelt + dc.b 25,1,0,1 ; shirt +; no tie +; dealer's armbands not used. + dc.b 47,1,0,1 ; bandolero +;; dc.b 35,2,0,1 ; jacket + dc.b 45,1,0,1 ; Mexican hands + dc.b 42,1,1,2 ; hat, one of two brown ones. + dc.b 0,0,0,0 + +Type3Person +* Old male American, as used in 433 Santa Fe. + dc.b 23,1,0,1 ; neck - open collar + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,9,1 ; hair - white beard +; no sideburn + dc.b 27,1,2,1 ; trouser +; no belt + dc.b 25,1,0,1 ; shirt +; no braces + dc.b 26,1,0,1 ; brown waistcoat +; no tie +; no jacket + dc.b 38,1,0,1 ; hands + dc.b 42,1,2,1 ; hat: brown felt + dc.b 0,0,0,0 + +Type4Person +* Old male in dungarees + dc.b 23,1,0,1 ; neck - open + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,8,8 ; hair - greying + dc.b 25,1,0,1 ; shirt + dc.b 31,1,0,1 ; Dungarees + dc.b 38,1,0,1 ; hands +; no hat + dc.b 0,0,0,0 + +Type5Person +* General tough guy - used for cowboys around town, where +* I haven't put in a specific prototype for them. + dc.b 23,1,0,1 ; neck - open + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,8 ; hair: any not greying. + dc.b 22,1,0,2 ; sideburn + dc.b 27,1,0,4 ; trousers: any + dc.b 28,2,0,1 ; belt/gunbelt + dc.b 25,1,0,1 ; shirt +; no tie +; dealer's armbands not used. + dc.b 35,3,0,1 ; jacket: brown or grey. + dc.b 38,1,0,1 ; hands + dc.b 42,1,0,3 ; hat, any. + dc.b 0,0,0,0 + +Type6Person +* tough guy for 434 Santa Fe + dc.b 23,1,0,1 ; neck - open + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,8 ; hair: any not greying. +; no sideburns + dc.b 27,1,0,4 ; trousers: any + dc.b 28,2,0,1 ; belt/gunbelt + dc.b 25,1,0,1 ; shirt +; no tie +; dealer's armbands not used. + dc.b 37,1,0,1 ; jacket: grey. + dc.b 38,1,0,1 ; hands + dc.b 42,1,2,1 ; hat: brown felt + dc.b 0,0,0,0 + +Type7Person +; hostess for santa fe + dc.b 52,1,1,1 * body - yellow + dc.b 2,1,0,3 * face - reduced from choice of 7 to ensure youth! +;; dc.b 53,1,0,1 * skirt +; dc.b 54,1,0,1 * belt + dc.b 61,1,0,1 * hand with tray. + dc.b 51,1,0,1 * hair - yellow + dc.b 0,0,0,0 + +Type8Person +; older woman +; dc.b 57,1,0,2 * blouse + dc.b 52,1,0,1 * body - blue + dc.b 2,1,0,7 * face +; dc.b 56,1,0,1 * skirt +; dc.b 54,1,0,1 * belt + dc.b 63,1,0,1 * both hands - for 57 blouse + dc.b 51,1,2,1 * hair - greying + dc.b 0,0,0,0 + +Type9Person +; woman in green + dc.b 52,0,2,1 * body +; dc.b 58,1,0,1 * blouse - fits over body + dc.b 2,1,0,3 * face * reduced from 7 to reduce age +;; dc.b 59,1,0,1 * skirt + dc.b 60,1,0,1 * both hands + dc.b 51,1,0,4 * hair - any + dc.b 0,0,0,0 + +Type10Person +; Mexican with big Sombrero + dc.b 24,1,0,1 ; neck - buttoned (so can't see pink skin underneath) +;; dc.b 23,1,0,1 ; neck - open + dc.b 19,1,0,1 ; mexican neck overlay + dc.b 1,1,180,1 ; face - Mexican + dc.b 20,1,4,1 ; top of head + dc.b 21,1,0,8 ; hair: any not greying. +; dc.b 22,1,0,2 ; sideburn + dc.b 27,1,0,4 ; trousers: any + dc.b 28,2,0,1 ; belt/gunbelt + + dc.b 25,1,0,1 ; shirt +; no tie +; dealer's armbands not used. + dc.b 46,1,0,1 ; Neckerchief or similar. 1 only, else can see +; the pink skin underneath! + dc.b 35,3,0,1 ; jacket: brown or grey. + dc.b 45,1,0,1 ; Mexican hands + dc.b 41,1,0,1 ; big Sombrero + dc.b 0,0,0,0 + +Type11Person +; Shop man, soberly dressed. + dc.b 24,1,0,1 ; neck - buttoned + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,16 ; hair: any + dc.b 22,1,0,2 ; sideburn + dc.b 27,1,0,2 ; trousers: grey/dark + dc.b 28,1,0,1 ; belt + dc.b 25,1,0,1 ; shirt + dc.b 32,1,0,2 ; tie +; dealer's armbands not used. + dc.b 37,1,0,1 ; jacket: suit + dc.b 38,1,0,1 ; hands +; no hat + dc.b 0,0,0,0 + +Type12Person +; shop man, randomly dressed. + dc.b 24,1,0,1 ; neck - buttoned + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,16 ; hair: any + dc.b 22,1,0,2 ; sideburn + dc.b 27,1,0,2 ; trousers: grey/dark + dc.b 28,1,0,1 ; belt + dc.b 25,1,0,1 ; shirt + dc.b 32,2,0,2 ; tie + dc.b 26,1,0,2 ; waistcoat + +; dealer's armbands not used. + dc.b 38,1,0,1 ; hands +; no hat + dc.b 0,0,0,0 + +Type13Person +; clerk with visor, for wire/bank + dc.b 24,1,0,1 ; neck - buttoned + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,16 ; hair: any + dc.b 22,1,0,2 ; sideburn + dc.b 27,1,0,2 ; trousers: grey/dark + dc.b 28,1,0,1 ; belt + dc.b 25,1,0,1 ; shirt + dc.b 32,1,0,2 ; tie + dc.b 26,1,0,2 ; waistcoat +; dealer's armbands not used. + dc.b 38,1,0,1 ; hands + dc.b 40,1,0,1 ; visor +; no hat + dc.b 0,0,0,0 + +Type14Person +; lady in green skirt, as walking all over the place. + dc.b 52,1,2,1 * body +; dc.b 58,1,0,1 * green blouse - fits over body + dc.b 2,1,0,7 * face +;; dc.b 59,1,0,1 * skirt + dc.b 60,1,0,1 * both hands + dc.b 51,1,0,4 * hair - any + dc.b 0,0,0,0 + +Type15Person +; lady in blue skirt, as walking all over the place. + dc.b 52,1,0,1 * body + dc.b 58,1,0,1 * blouse - fits over body + dc.b 2,1,0,7 * face +;; dc.b 59,1,0,1 * skirt + dc.b 60,1,0,1 * both hands + dc.b 51,1,0,4 * hair - any + dc.b 0,0,0,0 + +Type16Person +; barman (e.g. Santa Fe) + dc.b 24,1,0,1 ; neck - buttoned + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,8 ; hair: any non-greying + dc.b 22,1,0,2 ; sideburn + dc.b 27,1,0,2 ; trousers: grey/dark + dc.b 25,1,0,1 ; shirt + dc.b 30,1,0,1 ; braces + dc.b 32,2,0,2 ; tie + dc.b 34,1,0,1 ; dealer's armbands (around elbow). Must be before waistcoat + dc.b 26,1,0,1 ; waistcoat: brown + dc.b 38,1,0,1 ; hands +; no hat + dc.b 0,0,0,0 + + +Type17Person +* tough guy in saloon for 560 Santa Fe + dc.b 23,1,0,1 ; neck - open + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,8 ; hair: any not greying. +; no sideburns + dc.b 27,1,0,4 ; trousers: any + dc.b 28,2,0,1 ; belt/gunbelt + dc.b 25,1,0,1 ; shirt +; no tie +; dealer's armbands not used. + dc.b 37,1,0,1 ; jacket: grey. + dc.b 38,1,0,1 ; hands +; no hat + dc.b 0,0,0,0 + +Type18Person +* sick man or poor peasant - e.g. in desert + dc.b 23,1,0,1 ; neck - open + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,8,7 ; hair: any greying. + dc.b 22,1,0,2 ; sideburn + dc.b 27,1,2,2 ; trousers: brown/blue + dc.b 25,1,0,1 ; shirt +; no tie +; dealer's armbands not used. + dc.b 35,1,0,1 ; jacket: jerkin + dc.b 38,1,0,1 ; hands +; no hat + dc.b 0,0,0,0 + +Type19Person +* mexican peasant - e.g. in desert. + dc.b 24,1,0,1 ; neck - buttoned (so can't see pink skin underneath) + dc.b 19,1,0,1 ; mexican neck overlay + dc.b 1,1,180,1 ; face + dc.b 20,1,4,1 ; top of head + dc.b 21,1,0,7 ; hair: any not greying. +; no sideburns + dc.b 27,1,2,2 ; trousers: brown/blue + dc.b 25,1,0,1 ; shirt + dc.b 45,1,0,1 ; Mexican's hands + dc.b 46,1,0,1 ; Neckerchief or similar. 1 only, else can see +; the pink skin underneath! +; dealer's armbands not used. + dc.b 35,1,0,1 ; jacket: jerkin + dc.b 45,1,0,1 ; Mexican hands + dc.b 41,1,0,1 ; big Sombrero + dc.b 0,0,0,0 + +Type20Person +; Soldier for forts + dc.b 44,1,0,1 ; complete corporal except face + dc.b 1,1,0,18 ; face + dc.b 0,0,0,0 + +Type21Person +* Clint Eastwood look alike - with cape. e.g. 436 Santa Fe. + dc.b 23,1,0,1 ; neck - open + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,8 ; hair: any not greying. +; no sideburns + dc.b 27,1,0,4 ; trousers: any + dc.b 28,2,0,1 ; belt/gunbelt + dc.b 25,1,0,1 ; shirt + dc.b 49,1,0,1 ; cape + dc.b 38,1,0,1 ; hands + dc.b 42,1,2,1 ; hat: brown felt + dc.b 0,0,0,0 + + + +; + dc.b 0,0,0,0 + + +; people type is only currently used to give people +; a name of the right sex. + +YAM equ 0 ; young american male +OAM equ 1 ; old american male +YAF equ 2 ; young american female +OAF equ 3 ; old american female + +YMM equ 4 ; young Mexican male +OMM equ 5 ; old Mexican male +YMF equ 6 ; young Mexican female +OMF equ 7 ; old Mexican female + +YIM equ 8 ; young Indian male +OIM equ 9 ; old Indian male +YIF equ 10 ; young Indian female +OIF equ 11 ; old Indian female + +TownPeopleData +; 8 bytes per person: initial data for all people. +; Because people who have small versions need to go +; into Hires() at run-time: it is important to fit +; all these people into the first 50-or-so objects. +; Otherwise the amount of memory required for ObjectTable() is going +; to increase. + +ML equ 200 +; Room number is either: +; - room number in walkabout section - e.g. 30..50 for Santa Fe +; - or for map locations: ML+"LOCATION". These are mutually exclusive + + +PB equ 620 * base for people's xzh objects +DefaultMenu equ 0 * menu number divided by 2 +Default2ndMenu equ 0 * menu number divided by 2: this is +* the menu it goes to if we get back to the default menu +NoPerson equ 254 ; room number for a person which doesn't exist + +; Names - at message 1000+number specified +WhiskeyPete equ 160 +JoeDunn equ 161 +NedParkin equ 162 +KarlBekkert equ 163 +JackShoe equ 164 +BenDavis equ 165 +WarrenOaks equ 166 +WayneRodgers equ 167 +AshUpton equ 168 +ChiefHow equ 169 +RickSands equ 170 +RickRider equ 171 + +LauraPicket equ 210 +WilmaKatz equ 211 +MissRosy equ 212 +LaviniaStrumpet equ 213 ;**** not present. +MrsMcSween equ 214 +girlfriend equ 215 + +NoName equ 0 + +; person 0 (not used...) + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations / 2 + dc.b 1 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 1 430 Santa Fe: Jerkin guy leaning S. + dc.b 30 ; room number in which person appears =255 for end of this table. + dc.b 620-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations / 2 + dc.b 1 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 2 431 Santa Fe: Waistcoat guy sitting S + dc.b 31 ; room number in which person appears =255 for end of this table. + dc.b 621-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneNeedsHelpMenu/2 ; Current menu to use in conversations + dc.b 2 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 3 433 Santa Fe: Old guy Waistcoat, sitting S. + dc.b 33 ; room number in which person appears =255 for end of this table. + dc.b 622-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 3 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 4 434 Santa Fe Guy Leaning S, flipping coin. + dc.b 34 ; room number in which person appears =255 for end of this table. + dc.b 623-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneNeedsHelpMenu/2 ; Current menu to use in conversations + dc.b 6 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 5 - 435 Santa Fe: Mexican sitting S + dc.b 35 ; room number in which person appears =255 for end of this table. + dc.b 628-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 10 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 6 436 Santa Fe: Clint, leaning E + dc.b 36 ; room number in which person appears =255 for end of this table. + dc.b 623-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 21 ; identikit type prototype to use - caped! + dc.b Default2ndMenu,NoName,0,YAM + +; person 7 437 Santa Fe: Guy sitting E. + dc.b 37 ; room number in which person appears =255 for end of this table. + dc.b 622-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 8: 432 Santa Fe: lady green skirt + dc.b 32 ; room number in which person appears =255 for end of this table. + dc.b 640-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneNeedsHelpMenu/2 ; Current menu to use in conversations + dc.b 14 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAF + +; person 9: 450 El Paso: Lady standing S. + dc.b 50 ; room number in which person appears =255 for end of this table. + dc.b 638-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneNeedsHelpMenu/2 ; Current menu to use in conversations + dc.b 8 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,OAF + +; person 10: 451 El Paso: Rocker + dc.b 51 ; room number in which person appears =255 for end of this table. + dc.b 635-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 4 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,OAM + +; person 11: 453 El Paso: Mexican Sitting S + dc.b 53 ; room number in which person appears =255 for end of this table. + dc.b 628-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 10 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 12: 455 El Paso: Mexican Sitting S + dc.b 55 ; room number in which person appears =255 for end of this table. + dc.b 628-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 10 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 13: 470 Roswell: Guy sitting E + dc.b 70 ; room number in which person appears =255 for end of this table. + dc.b 632-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 14: 472 Roswell: Lady green Skirt. + dc.b 72 ; room number in which person appears =255 for end of this table. + dc.b 640-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneNeedsHelpMenu/2 ; Current menu to use in conversations + dc.b 14 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAF + +; person 15: 473 Roswell: Lady standing S. + dc.b 73 ; room number in which person appears =255 for end of this table. + dc.b 638-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneNeedsHelpMenu/2 ; Current menu to use in conversations + dc.b 8 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,OAF + +; person 16: 501 Lincoln City: Lady standing S. + dc.b 101 ; room number in which person appears =255 for end of this table. + dc.b 638-PB ; xzh number used to represent person (0 if none, or any +; xzh + dc.b SomeoneNeedsHelpMenu/2 ; Current menu to use in conversations + dc.b 8 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,OAF + +; person 17: 502 Lincoln City: Rocker + dc.b 102 ; room number in which person appears =255 for end of this table. + dc.b 15 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 4 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,OAM + +; person 18: 504 Lincoln City: Lady Blue Skirt + dc.b 104 ; room number in which person appears =255 for end of this table. + dc.b 641-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b WidowWomanMenu/2 ; Current menu to use in conversations + dc.b 15 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAF + +; person 19: 504 Lincoln City: rocker + dc.b 104 ; room number in which person appears =255 for end of this table. + dc.b 636-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 4 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,OAM + +; person 20: 522 Mesilla: Lady Green Skirt + dc.b 122 ; room number in which person appears =255 for end of this table. + dc.b 640-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b WidowWomanMenu/2 ; Current menu to use in conversations + dc.b 14 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAF + +; person 21: 523 Mesilla: Guy leaning S, flipping a coin. + dc.b 4 ; room number in which person appears =255 for end of this table. + dc.b 624-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 6 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 22: 540 White Oaks: Rocker + dc.b 140 ; room number in which person appears =255 for end of this table. + dc.b 635-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 3 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,OAM + +; person 23: Undertaker Santa Fe + dc.b 1 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 11 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 24: Undertaker El Paso + dc.b 2 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 11 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 25: Undertaker Roswell + dc.b 3 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 26: Wire office man Santa Fe + dc.b 5 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 27: Wire Office man El Paso + dc.b 6 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 28: News office man Santa Fe + dc.b 8 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 29: News office man El Paso + dc.b 9 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 30: News office man White oaks + dc.b 10 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 31: bank Santa Fe + dc.b 12 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 26/2 ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 32: bank El Paso + dc.b 13 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 33: bank Roswll + dc.b 14 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 26/2 ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 34: bank Lincoln City + dc.b 15 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 26/2 ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 35: bank Mesilla + dc.b 16 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 26/2 ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 36: bank White Oaks + dc.b 17 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 26/2 ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 37: Livery person Santa Fe + dc.b 19 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 4 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 38: Livery person El Paso + dc.b 20 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 4 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 39: Livery person Licoln City + dc.b 21 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 4 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 40: Livery person White Oaks + dc.b 22 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 4 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 41: Doctors El Paso + dc.b 24 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 11 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 42: Doctors Mesilla + dc.b 25 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 11 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 43: Store man El Paso + dc.b 60 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 44: Murphy Dolan Man in Lincoln + dc.b 62 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 156/2 ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 45: Store Man Roswell - Ash Upton + dc.b 61 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b AshUptonMenu/2 ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,AshUpton,0,YAM + +; person 46: Store man White Oaks + dc.b 63 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 47: unused + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 48: Laura Picket at Hotel in El Paso + dc.b 66 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b LauraPicketMenu/2 ; Current menu to use in conversations + dc.b 9 ; identikit type prototype to use + dc.b Default2ndMenu,LauraPicket,0,YAM + +; person 49: girl in house/Lincoln City + dc.b 69 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b GirlFriendMenu/2 ; Current menu to use in conversations + dc.b 9 ; identikit type prototype to use + dc.b Default2ndMenu,Girlfriend,0,YAF + +; person 50: hostess in Santa Fe Saloon (560) + dc.b 160 ; room number in which person appears =255 for end of this table. + dc.b 639-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 14/2 ; Current menu to use in conversations + dc.b 7 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAF + + +; person 51: Store man Santa Fe + dc.b 64 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + + +; person 52: barman in Santa Fe. + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 12/2 ; Current menu to use in conversations + dc.b 16 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + + + + + +; people to meet at random in desert have room numbers 190..197 + + + + +; people that either Pat or Billy can meet... +; person 53: person to meet at random in desert by Anglo farmers. +; peasant being run off land + dc.b 190 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 50/2 ; Current menu to use in conversations + dc.b 19 ; identikit type prototype to use (Mexican peasant) + dc.b Default2ndMenu,NoName,0,YAM + +; person 54: person to meet at random in desert. +; mexican being picked on. + dc.b 191 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 58/2 ; Current menu to use in conversations + dc.b 19 ; identikit type prototype to use (peasant) + dc.b Default2ndMenu,NoName,0,YAM + +; person 55: person to meet at random in desert. +; sick man + dc.b 192 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 58/2 ; Current menu to use in conversations + dc.b 19 ; identikit type prototype to use (Mexican) + dc.b Default2ndMenu,NoName,0,YAM + +; person 56: person to meet at random in desert. + dc.b 193 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 62/2 ; Current menu to use in conversations + dc.b 18 ; identikit type prototype to use (sick man) + dc.b Default2ndMenu,NoName,0,YAM + + + + + +; people that only Billy can meet... +; person 57: person to meet at random in desert. +; peasant wants help nursing his family + dc.b 194 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 104/2 ; Current menu to use in conversations + dc.b 19 ; identikit type prototype to use (peasant with sick family) + dc.b Default2ndMenu,NoName,0,YAM + + + +; person 58: person to meet at random in desert. +++UNUSED+++ + dc.b NoPerson ; 195 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; people that only Pat can meet... +; person 59: person to meet at random in desert. +; Texan possee + dc.b 196 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 76/2 ; Current menu to use in conversations + dc.b 6 ; identikit type prototype to use (Possee representative) + dc.b Default2ndMenu,NoName,0,YAM + +; person 60: person to meet at random in desert. +; Barney Mason + dc.b 197 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 80/2 ; Current menu to use in conversations + dc.b 5 ; identikit type prototype to use (Barney Mason) + dc.b Default2ndMenu,NoName,0,YAM + +; person 61: person to meet at random in desert. +++UNUSED+++ + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 62: person to meet at random in desert. +++UNUSED+++ + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 63: woman being bothered by a gunslinger in saloon. El Paso 2 + dc.b 168 ; room number in which person appears =255 for end of this table. + dc.b 637-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 54/2 ; Current menu to use in conversations + dc.b 9 ; identikit type prototype to use (young Woman Green Skirt) + dc.b Default2ndMenu,NoName,0,YAF + +; person 64 560 Santa Fe (Saloon): guy drinking at bar. Shirt/brown trousers +; Ned Parkin + dc.b 160 ; room number in which person appears =255 for end of this table. + dc.b 630-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b NedParkinMenu/2 ; Current menu to use in conversations / 2 + dc.b 1 ; identikit type prototype to use + dc.b Default2ndMenu,NedParkin,0,YAM + +; person 65 560 Santa Fe (Saloon): guy at table. Grey jack/jeans + dc.b 160 ; room number in which person appears =255 for end of this table. + dc.b 629-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b BenDavisMenu/2 ; Current menu to use in conversations / 2 + dc.b 17 ; identikit type prototype to use + dc.b Default2ndMenu,BenDavis,0,YAM + +; person 66 562 Santa Fe (Saloon): guy at table. Grey jack/brown trousers + dc.b 160 ; room number in which person appears =255 for end of this table. + dc.b 627-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b CardGameMenu/2 ; Current menu to use in conversations / 2 + dc.b 17 ; identikit type prototype to use + dc.b Default2ndMenu,KarlBekkert,0,YAM + +; person 67 soldier at Fort Stanton + dc.b ML+19 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 132/2 ; Current menu to use in conversations: get lost + dc.b 20 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 68 soldier at Fort Sumner + dc.b ML+20 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 66/2 ; Current menu to use in conversations: army being cheated + dc.b 20 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 69 - at Bitter lake ranch + dc.b ML+24 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 132/2 ; Current menu to use in conversations: get lost + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 70 - at Fritz Ranch + dc.b ML+25 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 132/2 ; Current menu to use in conversations: get lost + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 71 - at Chisum Ranch + dc.b ML+26 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 132/2 ; Current menu to use in conversations: get lost + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 72 - Dedrick Ranch + dc.b ML+27 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations - Indians not getting beef + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 73 - at Beckwith Ranch + dc.b ML+28 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 132/2 ; Current menu to use in conversations: get lost + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 74 - Mrs McSween - at Tunstall Ranch + dc.b ML+29 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 134/2 ; Current menu to use in conversations - Indians not getting beef + dc.b 15 ; identikit type prototype to use + dc.b Default2ndMenu,MrsMcSween,0,OAF + + +; person 75 - at Reed Ranch + dc.b ML+30 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 132/2 ; Current menu to use in conversations: get lost + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + + +; person 76 - Indian chief at Mescalero + dc.b ML+35 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 92/2 ; Current menu to use in conversations - Indians not getting beef + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,ChiefHow,0,OIM + + +; person 77 - prospector + dc.b ML+48 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b ProspectorMenu/2 ; Current menu to use in conversations - prospector + dc.b 0 ; identikit type prototype to use + dc.b 136/2,WhiskeyPete,0,YAM + +; person 78 - Joe Grant. +; appears in saloon in Santa Fe (triggered by WALKABOUT.TXT) + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 128/2 ; Current menu to use in conversations - Indians not getting beef + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; A few special objects which you can select in town - e.g. +; the wanted posters. +; person - 79 - wanted poster. Not Very talkative! + dc.b 0 ; room number in which person appears =255 for end of this table. + dc.b 642-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations - Indians not getting beef + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,0 + +; person - 80 - object + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations - Indians not getting beef + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,0 + +; person - 81 - object + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations - Indians not getting beef + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,0 + +; person - 82 - object + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations - Indians not getting beef + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,0 + +; person - 83 - object + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations - Indians not getting beef + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,0 + +; person 84 - gambler + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 1 ; object number used to represent person (should be 2658) + dc.b CardGameMenu/2 ; Current menu to use in conversations + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,0,0,OAF + + + +; person 85 - Jose Miguel thingy +; interrupts player looking at map + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; default menu to use in conversations + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 86 - guy at bar in Santa Fe 2 (LHS): +; grey jacket, blue jeans, brown hat, blue neckerchief + dc.b 170 ; room number in which person appears =255 for end of this table. + dc.b 631-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SpillDrinkMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 87 - guy at bar in Santa Fe 2 (LHS): +; Grey jacket, brown waistcoat, grey jacket. Cigarette in mouth +;' grey hat + dc.b 170 ; room number in which person appears =255 for end of this table. + dc.b 633-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; default menu to use in conversations + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + + +; person 88 - guy at bar in El Paso 1 (LHS): +; Grey jacket, blue jeans, blue neckerchief, brown hat + dc.b 166 ; room number in which person appears =255 for end of this table. + dc.b 631-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b JackShoeMenu/2 ; default menu to use in conversations + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,JackShoe,0,YAM + + +; person 89 - guy at bar in El Paso 1 (LHS): +; Grey jacket, brown waistcoat, grey jacket. Cigarette in mouth +;' grey hat + dc.b 166 ; room number in which person appears =255 for end of this table. + dc.b 633-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b CardGameMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + + +; person 90 566 El Paso (Saloon): guy at table. Grey jack/blue trousers + dc.b 166 ; room number in which person appears =255 for end of this table. + dc.b 629-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SpillDrinkMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 91 568 El Paso (Saloon 2): guy at table. Grey jack/brown trousers + dc.b 168 ; room number in which person appears =255 for end of this table. + dc.b 627-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,RickSands,0,YAM + + +; person 92 574 Roswell (Saloon): guy at bar. Brown jacket, grey +; trousers, white neckerchief, brown hat. + dc.b 174 ; room number in which person appears =255 for end of this table. + dc.b 630-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b BenDavisMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 93 574 Roswell (Saloon): guy at table +; trousers, white neckerchief, brown hat. + dc.b 174 ; room number in which person appears =255 for end of this table. + dc.b 627-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b CardGameMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 94 573 Roswell (Saloon): guy at table +; tbrown trousers, grey jacket, blue neckerchief, brown hat + dc.b 173 ; room number in which person appears =255 for end of this table. + dc.b 627-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b RickRiderMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,RickRider,0,YAM + +; person 95 573 Roswell (Saloon): guy at table +; grey trousers, grey jacket, brown waistcoat, grey hat + dc.b 173 ; room number in which person appears =255 for end of this table. + dc.b 633-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 95 565 Lincoln city (Saloon): guy at table +; blue trousers, grey jacket, grey hat + dc.b 165 ; room number in which person appears =255 for end of this table. + dc.b 629-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b CardGameMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 96 565 Lincoln city (Saloon): guy at table +; grey trousers, grey jacket, brown waistcoat, grey hat + dc.b 165 ; room number in which person appears =255 for end of this table. + dc.b 633-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 97 565 Lincoln city (Saloon): guy at bar +; grey trousers, brown jacket, brown hat + dc.b 165 ; room number in which person appears =255 for end of this table. + dc.b 630-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SpillDrinkMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + + +; person 98 569 Mesilla (Saloon): guy at table +; blue trousers, grey jacket, grey hat + dc.b 169 ; room number in which person appears =255 for end of this table. + dc.b 629-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b CardGameMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,WarrenOaks,0,YAM + + +; person 99 572 White Oaks (Saloon): guy at table +; grey trousers, brown jacket, brown hat +; Slightly Mexican appearance, with big black moustache + dc.b 172 ; room number in which person appears =255 for end of this table. + dc.b 634-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,WayneRodgers,0,YAM + + +; person 100 Tom O'Foliard +; grey trousers, grey jacket, brown waistcoat, grey hat + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + + + +; person 101 - Wilma Katz - at Katz farmhouse (31) + dc.b ML+31 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b WilmaKatzMenu/2 ; Current menu to use in conversations + dc.b 15 ; identikit type prototype to use + dc.b Default2ndMenu,WilmaKatz,0,OAF + +; person 102 - at Dunn Farmhouse (32) + dc.b ML+32 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b LonelyFarmhouseMenu/2 ; Current menu to use in conversations + dc.b 15 ; identikit type prototype to use + dc.b Default2ndMenu,MrsMcSween,0,OAF + +; person 103 - at Rose Farmhosue (33) + dc.b ML+33 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b LonelyFarmhouseMenu/2 ; Current menu to use in conversations + dc.b 15 ; identikit type prototype to use + dc.b Default2ndMenu,MissRosy,0,OAF + + + dc.b 255 ; end of table. + + + +TownData +; 16 bytes per town +; town 10: Santa Fe + dc.w 10 ; increase in gold per time unit. + dc.w 200 ; maximum level of gold in the bank. + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + +; town 11: White Oaks + dc.w 3 ; increase in gold per time unit. + dc.w 50 ; maximum level of gold in the bank. + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + +; town 12: Lincoln City + dc.w 3 ; increase in gold per time unit. + dc.w 50 ; maximum level of gold in the bank. + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + +; town 13: Mesilla + dc.w 3 ; increase in gold per time unit. + dc.w 50 ; maximum level of gold in the bank. + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + +; town 14: Roswll + dc.w 3 ; increase in gold per time unit. + dc.w 50 ; maximum level of gold in the bank. + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + +; town 15: El Paso + dc.w 8 ; increase in gold per time unit. + dc.w 150 ; maximum level of gold in the bank. + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + + +SubPlotData +; There is a table containing all the bits of information +; people may want to know about: in TownVarData. +; This is initialised from a table of identical format +; in TownFixedData (except that offsets are relative to the +; start of this little table, wheras in TownVarData they +; are relative to TownVarData). The copy routine makes the +; appropriate conversion. +; +; 10 pointers at start... + dc.w EndSubPlotData-SubPlotData + dc.w SPMoney-SubPlotData ; .w Offset of "Money Location" information. + dc.w SPDeputies-SubPlotData ; .w Offset of "Deputies Location" information. + dc.w SPGangs-SubPlotData ; .w Offset of "Gang Location" information + dc.w SPRobbery-SubPlotData ; .w Offset of "Recent robbery" information + dc.w SPSubPlots-SubPlotData ; .w Offset of sub-plot table. + dc.w SPHidden-SubPlotData ; .w Offset of "Hidden things" table for map + dc.w CommsInfo-SubPlotData ; .w offset of "things the other computer wants +; to know about. + dc.w 0 + dc.w 0 + dc.w 0 + +CommsInfo + dc.b 0 * not used + dc.b 0 * LOCATION of pat + dc.b 0 * LOCATION of Billy + + even + +SPHidden +; table for map containing one byte for every object on map. +; If zero, it will be displayed (unless overridden elsewhere) +; If one, it will be hidden. This is used for making e.g. +; farmhouses disappear after we've used their subplots + dc.b 0,0,0,0,0,0,0,0 ; 0..7 + dc.b 0,0,0,0,0,0,0,0 ; 8..15 + dc.b 0,0,0,0,0,0,0,0 ; 16..23 + dc.b 0,0,0,0,0,0,0,0 ; 24..31 + dc.b 0,0,0,0,0,0,0,0 ; 32..39 + dc.b 0,0,0,0,0,0,0,0 ; 40..47 + dc.b 0,0,0,0,0,0,0,0 ; 48..55 + + +; First word in every entry is 0 if nothing to know. +; 255. if hidden (doesn't appear on map) but can be told to player, +; 254. if hidden (doesn't appear on map) and cannot be told to player. +; non-zero if there is some piece +; of information that may be required. +; Second word is a numerical parameter for several of the +; items. These are coded specially. +; Third and fourth words unused presently. +; fourth to seventh words are four message numbers to print, +; in order. If =FFFF print the numeric parameter. +; If <10, print the appropriate paramter, numbered from +; 2 in steps of 2. - it will be a location name, to choose the message +; from 1000... + +SPMoney + dc.w 1,1000,0,0,966,1010,0,0 ; .w,.w Gold in Bank at town 0 + dc.w 1,400,0,0,966,1011,0,0 ; .w,.w Gold in Bank at town 1 + dc.w 1,400,0,0,966,1012,0,0 ; .w,.w Gold in Bank at town 2 + dc.w 1,400,0,0,966,1013,0,0 ; .w,.w Gold in Bank at town 3 + dc.w 1,400,0,0,966,1014,0,0 ; .w,.w Gold in Bank at town 4 + dc.w 1,400,0,0,966,1015,0,0 ; .w,.w Gold in Bank at town 5 + dc.w -1,-1 + +SPDeputies + dc.w 1,2,0,0,972,$ffff,973,1010 ; .w,.w Number of deputies in town 0 + dc.w 1,0,0,0,972,$ffff,973,1011 ; .w,.w Number of deputies in town 1 + dc.w 1,0,0,0,972,$ffff,973,1012 ; .w,.w Number of deputies in town 2 + dc.w 1,0,0,0,972,$ffff,973,1013 ; .w,.w Number of deputies in town 3 + dc.w 1,0,0,0,972,$ffff,973,1014 ; .w,.w Number of deputies in town 4 + dc.w 1,0,0,0,972,$ffff,973,1015 ; .w,.w Number of deputies in town 5 + dc.w -1,-1 + +SPGangs + dc.w 1,0,0,0,962,1041,965,1010 ; .w,.w Gang location 0 + dc.w 255,1,0,0,962,1042,965,1011 ; .w,.w Gang location 1 + dc.w 255,2,0,0,962,1043,965,1012 ; .w,.w Gang location 2 + dc.w 255,3,0,0,962,1044,965,1013 ; .w,.w Gang location 3 + dc.w 255,4,0,0,962,1045,965,1014 ; .w,.w Gang location 4 + dc.w 255,5,0,0,962,1046,965,1015 ; .w,.w Gang location 5 + dc.w -1,-1 + +SPRobbery + dc.w 41,10,0,0,962,2,963,4 ; default - cooper gang/Santa Fe. + dc.w -1,-1 + +SPSubPlots +; .w,.w Sub-plot? + dc.w 0,0,0,0,0,0,0,0 + dc.w -1,-1 + + +EndSubPlotData + +;----------------- + +ENDTABLE +;--------- + END + diff --git a/l9dev/regress/games.l9/billy.l9/pcconst.txt b/l9dev/regress/games.l9/billy.l9/pcconst.txt new file mode 100644 index 0000000..39edd72 --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/pcconst.txt @@ -0,0 +1,10 @@ +; Machine constants +; MCONST.TXT +const + st=0 ; conditional assembly + ReallyST=0 + Amiga=0 + pc=1 + notPc=0 + Scrolling=1 + AllowMusic=1 diff --git a/l9dev/regress/games.l9/billy.l9/print.txt b/l9dev/regress/games.l9/billy.l9/print.txt new file mode 100644 index 0000000..7b881db --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/print.txt @@ -0,0 +1,340 @@ +; PRINT.TXT for Billy The Kid +; +; Mike Austin July 1990 +; +; Copyright (C) 1990 Level 9 Computing Ltd +; +; +const + TextBufferNumber=24 ; where characters are put by MESSAGE commands + FontListNumber=26 +; LoLongTextBufferOffset=166 +; ArcBigWindowRaster=840 +; ArcBigWindowDO=50 + +table +;; TextBuffer=24 + FontList=26 + +var +; PrintRasterNum +; FirstAsciiInFont +; FontHeight ; character height, in pixels +; PrintX PrintY + +begin + +;------------ +;.CopyFilename +;; from IntroTables(v1) to list17(8) +; v2=8 +;.CF2 +; v3=IntroTables(v1) +; list17(v2)=v3 +; add v1,c1 +; add v2,c1 +; if v3<>0 then CF2 +; return +;---- +.vAllocateAndLoadFont + &x1=longws(HiLongFreeWorkspace) + &list11(96)=x1 ; set up list24 - used for text print buffer + &x1=longws(LOLongFreeWorkspace) + &list11(98)=x1 ; set up list24 + v1=520 ; reserve space for list 24 - used for text print buffer +; Big enough for 6.5 lines 80 characters across + gosub @MCReserveMemory + + + &x1=longws(HiLongFreeWorkspace) + &list11(104)=x1 ; set up list26 + &x1=longws(LOLongFreeWorkspace) + &list11(106)=x1 ; set up list26 + v1=2280 ; reserve space for list 26 - used for font file + gosub @MCReserveMemory + &v1=IntroTables(28) ; offset of filename within IntroTables +; from IntroTables(v1) to list17(8) + gosub @CopyFilename + v1=FontListNumber + v2=0 + gosub @MCLoadFile ; at v2 bytes into listv1() + v1=FontListNumber + v2=0 + v3=0 + gosub @MCSetPrintFont +; v1=list number, v2=offset, v3=CGA palette code (mono machines only) + +; Format of font header (same as PC, of course) is: +;0 .w Offset of "Information" +;2 .w Offset of "width table" +;4 .w offset of "font definition" +; +; "Information" table contains: +; .b Version. Ignored at present +; .b SystemWorkspace (0) To allow us to tell if we've done initialise +; .b First Ascii char +; .b Last Ascii char +; .b character width(pixels) divided down to give bytes +; .b character height (pixels) +; .b Number of bit-planes. Normally 1 +; .b Non-zero if compressed (?) + &x1=FontList(0) + add x1,c2 + FirstAsciiInFont=FontList(x1) + add x1,c3 + FontHeight=FontList(x1) + return +;-------------- +;.DoNotePadMessage +; v1=NotepadRaster ; =1726 (use 430 to display) +;; flag display system to show this box +; TextBoxDisplayed=430 ; reset flag to indicate no text printed + +;.DoTextWindow +;; text raster is number 1725 +; v1=CurrentPrintRaster ; =1725 (use 431 to display) +;; flag display system to show this box +;; TextBoxDisplayed=ArcBigWindowDO +; TextBoxWidth=DefaultTextWidth ; 224in Grange Arcades. ; width of main window box +; +;.BoxMessageM1 +;; print message m1 into text raster v1, clearing it to white first +; gosub @SetupPrintRaster +; PrintX=LeftMargin +; PrintY=TopMargin +; code - +; gosub @iMessageM1 +; code + +; return +;---------- + code - +.iStartPrinting +; CALL THIS BEFORE DOING A SERIES OF MESSAGE COMMANDS + goto @iStartPrintToBuffer +;-------------- +.iMessageM1 +; print Message M1 at current cursor pos + gosub @iStartPrintToBuffer + message m1 +; drop through to iEndPrinting... + +;--- +.iEndPrinting +; CALL THIS AFTER DOING A SERIES OF MESSAGE COMMANDS + message cr ; ensure buffer is flushed etc. + + gosub @iEndPrintToBuffer +; text has been printed between TextBuffer(2..v7) + + PrintX=LeftMargin + code + + PrintY=TopMargin + + if CurrentPrintRaster<>3361 then NotMapRaster ; 3361 is 10x2 print raster + PrintX=0 ; for Binoculars raster, print at top left. + PrintY=0 + +.NotMapRaster + + +;; push CurrentPrintRaster +;; push CurrentDO + push ForegroundColour + if v7<95 then iEPCurrentBox ; was 80 for a while + gosub @SetBigBox +; ForeGroundColour=7 ; black ; black text for big box (not +;; transparent), cause there's no black box behind it. + + +.iEPCurrentBox + if MaxHighlightEntry>1 then iEPNotBlack +; bar removed - e.g. for result message +; if HighlightY<32000 then iEPNotBlack ; bar removed - e.g. for result message +;; if MaxHighlightEntry>1 then iepNotBlack +; only one option - don't bother with highlight. +.iepBlack + ForeGroundColour=7 ; black ; black text for big box (not +; transparent), cause there's no black box behind it. + +.iepNotBlack + + v1=CurrentPrintRaster ; =1725 (use 431 to display) + gosub @SetupPrintRaster + code - + gosub iDisplayBufferedText ; copy from buffer onto raster. + code + + pop ForegroundColour +;; pop CurrentDO +;; pop CurrentPrintRaster + code - + return +;------------ +.iDisplayBufferedText +; called from menu etc. where several messages are to be put +; into one text box +code + + if v7>5 then iBoxV1SomeText ; slightly higher than ideal (2) +; because stray spaces, carriage returns etc. tend to get shoved +; out from time to time. + +; nothing printed - flag display system to not show this box + TextBoxDisplayed=0 ; reset flag to indicate no text printed + +.iBoxV1SomeText + v6=FontHeight ;copy into a variable int mode can access + &x6=FontList(2) ; get offset of width table + sub x6,FirstAsciiInFont ; so FontList(x6+v3) is width for char v3 + + x1=2 ; position in buffer + v4=ForegroundColour ; foreground color (7) + v5=BackGroundColour ; background color (1) + v2=PrintY ; y pos + v1=PrintX ; x pos +code - + goto RasterPrintXLoop + +.RasterPrintYLoop + v1=LeftMargin ; x position ; left margin + +.RasterPrintXLoop + x3=TextBuffer(x1) ; ascii code + gosub TranslateX3 + v3=x3 + add x1,c1 ; step on to next character in buffer + if v3=96 then @NeedCR ;'`' (next to BS) + if v3=32 then RPLCheckWordWrap + if v3<>13 then RPL1 +.RPLCheckWordWrap +; check if next word to be printed will fit on this line + v3=32 ; convert cr, control codes to spaces + x2=x1 + x4=0 ; cumulative width so far +.CWW1 + x3=TextBuffer(x2) + gosub TranslateX3 + if x3<33 then CWW2 ; space,cr,end of message + if x3=96 then CWW2 ; "`" + add x3,x6 ; offset of width table + x3=FontList(x3) + add x4,x3 ; add on width + add x2,c1 ; next char + goto CWW1 +;-- +.TranslateX3 +; translate ascii code x3 to allow for peculiar things in the +; font - e.g. foreign character symbols +; x5 is available as workspace + if x3=225 then TranslateBeta +; cif TranslateExtraChars + if x3>31 then NoShiftedHighChar + if x3=13 then NoShiftedHighChar ; carriage return +; chars 128.. in the original text get inserted here as chars +; 0.., so add on 128 to them + x5=128 + add x3,x5 + +.NoShiftedHighChar +; cend + + return + +.TranslateBeta + x3=158 + return +;-- +.CWW2 +; x4 is cumulative width in pixels of next word to be printed + add x4,v1 ; add on to current x position + if x4122 then RPL1a ; 'z' + x4=32 + sub v3,x4 ; convert it to upper case + +.RPL1a +cend + + +code + + push v4 ; save foreground colour + if v4<>16 then RPLNotTransparent +; printing transparent - in Billy, printing transparent +; onto big text box gives problem cause black background is +; only 10 cells wide. + if v1<160 then RPLNotTransparent + v4=7 ; turn to black beyond this point + +.RPLNotTransparent + gosub @MCRasterPrintCharacter + + pop v4 ; foreground colour +code - +; v1=x pos v2=y pos, v3=ascii code, v4=foreground colour (0..16) +; v5=background colour (0..16) +; returns v1=x,v2=y position after print + if x12 indicates that something has been +; printed. + message cr ; ensure buffer is flushed + code + + &v7=WordWS(WordTextBufferOffset) + &WordWS(WordTextBufferOffset)=c0 +; all future text printing +; to this offset within list TextBuffer(), please + code - + sub v7,c1 ;********** + return +;------------------- + code + +.SetUpPrintRaster +; prepare to print message m1 into text raster v1, clearing it to white first + &WordWS(WordRasterOffset)=c0 + push v1 ; changed by MCSetPrintRaster? + gosub @MCSetPrintRaster + pop v1 +.SetUpPrintRaster2 +; clear raster before printing onto it +;; v1=destination raster + &WordWS(WordRasterOffset)=c0 + v2=BackgroundColour ; clear color. 1=white + v3=0 ; use default palette. + v5=0 ; clear to color + goto @MCRasterHandler + +;---------------- diff --git a/l9dev/regress/games.l9/billy.l9/readfont.txt b/l9dev/regress/games.l9/billy.l9/readfont.txt new file mode 100644 index 0000000..6931a0b --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/readfont.txt @@ -0,0 +1,10 @@ +Parameters for FONT.BBC are + +Neo Filename: WESTERN.NEO +Fnt Filename: WESTERN.FNT +ASCII Start : 32 +ASCII End : 163 +X Pixels : 16 +Y Pixels : 9 +Column : 16 + diff --git a/l9dev/regress/games.l9/billy.l9/s.dat b/l9dev/regress/games.l9/billy.l9/s.dat new file mode 100644 index 0000000000000000000000000000000000000000..bfe33fec27b3fbe3db8dffe4f9e344ae7f0bf7ed GIT binary patch literal 59942 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ïKJ7E^u{_lx1tr{G;IS`r;irAPZk`$vZ@9~ON& z`V1r9gb$Hi_)r;qh(*hz74+8*(VFO@=n{_2jV_KZr|kMy9z-iqxmdnX zzDT}U?kZm*Un*ZFcatxduaK{lyUSO}J>;w9p7J&FweofH_3{n!jq*+M&GIest@3U1 z?eZP+o$_7s-SR#1z4CqX{qh6ygYrXiFZp5l5&2R1G5K-1x7-KuzH&dgKf(dP1|oby zeo`JJ50;0>L*-%eaCwA0QXVBgB|j}cBbUgdJBLB)=@bBF~ZM%Jby;@&fr) zd7=E8{JOkIUMw$>m&(iJChw6y|G)drC`KFam%ov}mA{h@ z$Oq-``A_*Txj{ZA{|)N# zw3LGiQ!|iv(os20(JQAb zos?WfPz>@x#i*DRF^w-zF)J3us@N2};!vE5OUYLX6t~hDyj>KJ;#GW#UpYf5RL)ca zN)Vx>gp{xnQ35Lql_(xrQIxZkBIRu59OYak_Rns7Va}AU$|W?8G{2NfmCKZF%H_%x z%9ToYa0KQ-&)el#$9P zIcBlvzrRGFz!#SrfmNnw3+O7nPTkmz7tPIm%pRo-$uqpuDOqR9*vTjZ&+; z29C+Z&2zu5EK(LLOO&O`GG#d?xRt4A7U!7)zRAkOm9HtQl-0@_Wo>i2{V&H)HdFmS zL&qt>|1)(#YyVHG3)UV5x`Gaj733BO1%?7gffKl|zz;h#rWp%NNOKkBBkhcW!X{~A zK_1cy3fxFLvmnqU&0JtXTIYf;NDCH7P139dHl%q9yhsZ*E6-eDPvr|2M4IG_7Ragc zE-k>Cu8E!s(qaYYL1wpt%M)oG3*evyEz9g!fDd3=NW*HX;M#)g3T`a8so?g4I|?2v zc$`)`oOUy4cNW}L(7T{dibi~Q7u-|Ox1e8&b_;0t7Tj0RzhD5TU0-lR!L0?i72IF& zK*7L*Cz{Y6EO@Bk$$~*mXuS#^E*M;Zzq&`c$-IvgJX$ccVA%gCAN`-yAOBO=|5@Yj zf7<&$?foAg_>T|##|Qp5_yCr9vDVDe`@eoOO$N)|misObKgr$4!|!r`~R88N`p|*7NW3i4W;J za^L6SXSrYT@L(?9_E35*-sT{EXD;3@A>5PuH4nef#akbq{wI&`&c$0Nr0>ne+aiQN z1wP_ZWpjE1@k9Rf({*pyly4iMYB9e>K;N z38x8q;q=sROW9j7gR9(K?lNG9P@dle7JyQ~h{I#>mV26{#ku1g*33DEc82zbjs~6K zv?fmn0~(g$vqi({hE9fD1HK$J7z{=O-rpERL!JR24I9zXSFIsNa+kegN<%aQ*=JJ->+)cv&))=SA!%;YU2*aVZDEd5H5- z-tR&GK_FT@FL8atpYH+VQb{J)pp44-0g%E2aT>615hqQFN_<@RvY){BJtW6#LgoK} zw4Xrv0kn9HD2Rd+|r{C-G4`&1KP>(t{wDs4haklWuM>}?;>4At68(3?4s)L0#XrP)PNBT5BNJ$>bR6& zh^O-R%0I-T;-BKt%K8LG9K=IhB$uT9F8&1`!u}8&=mGc9%0Dars%$_`z{+Ew9Rc2e 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 then SAORet + push dv1 + push dv2 + push dv3 + push dv4 + push num + push objectnumber + gosub myaniobject + pop objectnumber + pop num + pop dv4 + pop dv3 + pop dv2 + pop dv1 + + if Num<>2069 then SAORet +; 2069 is an invisible frame at end of dismount - used +; to trigger some code in the main SAO routine. Replace +; it with the last visible frame... + num=101 ; display Billy standing. Raster offset is set up. + +.SAORet + if num<2530 then MAONotSmallBilly + if num>2554 then MAONotSmallBilly + x1=2530 + goto MAOToGeneric + +.MAONotSmallBilly + if num<2420 then MAONotSmallPat + if num>2447 then MAONotSmallPat + x1=2420 +.MAOToGeneric +; turn small draw figure into generic outlaw - unless we're +; involved in the final duel + if EnemyName<>255 then MAONotSmallPat ; =Pat, Billy or $ff for other + + sub num,x1 ; get offset of small draw figure from base, + x1=20 ; base of generic gunfighter + add num,x1 + +.MAONotSmallPat + return +;------------------------------------------------------------- + +;------------------------------------------------------------- +.myaniobject +; x2,x3,x4 can be used as workspace... + + + if StructureFile<>IntroStructures then maoNotIntro + if num=1144 then introShot ; being pursued out of town + if num=798 then IntroShot ; guy shooting from window (In town) + if num=800 then IntroShot ; guy shooting beside window (In town) +;; if num=921 then IntroShot ; lightning in Canyon - gives intermittent gun shot + if num=1244 then IntroShot ; pigeon-shooting scene + if num=952 then IntroShot ; shoot blacksmith, and assinate Tunstall + if num<>922 then maoNotGunFlash ; frame of horseman in canyon + code - + random x1 + code + + if x1>30 then maoNotGunFlash ; only occasionally in canyon + +.IntroShot + v1=0 ; colt45 sample + gosub @HiPriPlaySample + +.maoNotGunFlash +.maoNotIntro + if num<1 then MAONotWalkabout + if num>199 then MAONotWalkabout +; reset playerAcb record, cause sometimes it +; gets lost when playing as Pat. + PlayerACB=ACBHeader + +.MAONotWalkabout + if num<>2069 then @MAONotDismount ; last frame of dismount + PlayerACB=ACBHeader + PlayerDirection=1 + PlayerWalking=false + ObjectNumber=3410 ; stand in direction + add ObjectNumber,PlayerDirection + dx4=PlayerACB + gosub @ChangeACBDx4 + + Rasteroffset=100 ; Billy + if PlayersName=Billy then MAODismount2 + RasterOffset=200 ; Pat +.MAODismount2 + x2=ACBRasterOffset + add x2,PlayerACB + if x2>ACBListSize then @MAOBug ;****** + &ACBList(x2)=RasterOffset ; ACBList(ACBRasterOffset) + x2=ACBLastHeightAdjust + add x2,PlayerACB + if x2>ACBListSize then @MAOBug ;****** + ACBList(x2)=c0 ; reset last adjustment + x1=ACBCumulativeShift ; word - for Walkabout: keeps track +; of how far we've shifted vertically - to allow the up/down +; movement as we walk to be cancelled when change animation. + add x1,PlayerACB + &ACBList(x1)=c0 ; reset continuous height shift + + + return + +.MAOBug ;****** + break ;******* + return ;******* + +.MAONotDismount + if num<>2511 then MAONotHorse +; a frame of standing horse + HorseX=dv2 + HorseZ=dv3 + HorseH=dv4 + +.MAONotHorse + if CurrentScreen<>BankGame then SAONotBank + if num<>329 then SAOBankNotPlayerLeft ; arm at left - initial condition. + PlayerACB=ACBHeader + x2=840 ; ani sequence for arm at left - for ARCADE.TXT checking + if ACBHeader>ACBListSize then @MAOBug ;****** + &ACBList(ACBHeader)=x2 + +.SAOBankNotPlayerLeft + if num<>332 then SAOBankNotPlayerRight ; arm at right + x2=841 ; ani sequence for arm at right - for ARCADE.TXT checking + if ACBHeader>ACBListSize then @MAOBug ;****** + &ACBList(ACBHeader)=x2 + +.SAOBankNotPlayerRight +.SAONotBank + + if CurrentScreen<>GameMap then MAONotGameMap + if num<340 then MAONotCows + if num<350 then MAOCows + if num<>3304 then MAOMapNotTrain ; one frame of the train +.MAOCows +; record the current coords for firing at. + push dv1 + dv1=num + gosub @ScanObjectTables + pop dv1 + +.MAOMapNotTrain +.maoNotCows + if num<2730 then MAOMapNotWagon + if num>2736 then MAOMapNotWagon +; record the current coords for firing at. + dv1=2730 ; first wagon + gosub @ScanObjectTables + +.MAOMapNotWagon + return +;-------------------------- +.MAONotGameMap + if PlayingDuel=0 then @MAONotDuel + if DuelStatus=0 then @MAONotDuel + +if duelstatus <> 2 then maonextstatus + if num <> bellraster then @maoDuel2 + duelstatus = 3 ; allow player to draw. + if TwoPlayerMode=true then maoDuel2 ; in two player mode, +; the opponent draws when we receive the message from the other +; computer + dx4 = enemyacb + ObjectNumber=11 + add ObjectNumber,DuelOpponentBase + +.maoDraw1 + gosub @changeacbdx4 + goto maoDuel2 ; theend +.maonextstatus + if num=2539 then ShootPlayer ;15Jan1991 + if num=28 then ShootPlayer ;15Jan1991 + if num=29 then ShootPlayer ;15Jan1991 + if num=32 then ShootPlayer ;15Jan1991 + if num <> 2429 then notenemyfire +.ShootPlayer +;code- +; random x1 +;code+ +; if x1 >50 then notenemyfire + v1=0 ; colt45 sample + gosub @PlaySample + duelstatus = 7 ; player is dying +.NotEnemyfire + if EnemyStatus<>0 then NotEnemyDraw ; to fix two player mode + if num <> 2426 then notenemydraw + enemystatus = 1 +.NotEnemyDraw +if duelstatus <> 4 then maoDuel2 + if num <> BillDrawn then maoDuel2 + duelstatus = 5 + +.maoDuel2 + + + +;-------------- +.maoTheEnd + return +;--------------------- +.MAONotDuel + if PersonDisplayed=false then maoNotPerson + return ; no sao stuff is relevant + + +.maoNotPerson + if num<1300 then MAONotMovingPerson + if num>1349 then MAONotMovingPerson + x1=MovingPersonHires + gosub @RecordCoordinates ; at Hires(x1) + +.MAONotMovingPerson + return +;--------------- diff --git a/l9dev/regress/games.l9/billy.l9/squash.dat b/l9dev/regress/games.l9/billy.l9/squash.dat new file mode 100644 index 0000000000000000000000000000000000000000..aa922ece6a5e82ac2c29f485e40e63a293cc46b2 GIT binary patch literal 14592 zcmdsdcU)9g*Y3=mJ?AiuGD8RHRRu%_5k-&@DHc#P_7=rBb`*?a6n7hI6cJyISjIu3 zF^QT)jnNp<#8_fbEHPC@#Sv4CEr}S^yACmV-|xHMz4!mi?|1g>Ue{jhSSrzUuz`7P%!^)yb=2&iB93O+}I+2Qc1ohUE-OCcD7oL zo*(aKC8rF$oQ#z4F#Rw=q-ud*u;7QfWD&X1u`zBoZ5Iuh7tX(g{yL9x8M{MPA1)jQ9AlEzmXiM6H&0} zJ)w`pzkG?V3yl=G03ww5umrVN6_=(OKsAZR-k64jEAa}8^ zKs1O(&B;**` zGJ!9#JKSj+|Cx1_*jQ6&IE?2>r?YOM5*f(aQ`eBbcn)8W47`QpnjkZmO-DMKBPYTk z>P2n#9ZU=J|D0_VOrhk#i23Ms_qH+FQ-8WHPzOVr_(S@8zqCX>t&*4G3;X5`eH`oebPhh!~c1TJ9S8usko_hDeha}>uljcuhTW6!>F$4*x=Y0HcPYLw9tB8vf`D@j^cy{C zFLc2dhOp^+x{|uLNBjhaSofMLl{zR7lw;xeH z9)&0$2!wD7a@^1sA1{ZnzYxO4DkP9?GX38_Y%7%%YAs~B(1W-uV+t4k8~k4U-+m>K zT~efwwESaUsc;FvH;KJOA+jg@1BEt#U1I-|)7k)%h~w~^B??Ud?M22$l|WVUhJA

^$WmQHWi^ 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 Yd*QK=DZ~l^s%NVEs=?b7|DXN+FOrvhJOBUy literal 0 HcmV?d00001 diff --git a/l9dev/regress/games.l9/billy.l9/st.l9/acode.acd b/l9dev/regress/games.l9/billy.l9/st.l9/acode.acd new file mode 100644 index 0000000000000000000000000000000000000000..caaf7ab88fffed11dcfc99c4a4784e6958b14e8e GIT binary patch literal 40790 zcmb`w4}6rzb?-g%XeI5gWGu@vl`+N(p#)PxWrY&JT%!15-VGrtr7FRyUc9@Nb_r1k zQ3;i0#i1_cy3`i~wJD*#l<*RY389owid{-6ri5^*OI(-B>r#ifzJzcorPOsDiqZZ4 z&hzX_!gA94eqO=zJoC(-GiT16IdkUBnP(ULe$2&Owc|D=hU(U6RtCRN{p6y&2 zu3@~7;Mu}8FXO7-$hg?N;7V{gxD;FrE(C7{ZwBXsH-dA)>%rOJOz>LpYH&JuB{&tF z3{C{cgJZ$b;7D*dI261T91IQw`-6SK-e6C#JJ=QM40Z(DgKfdqU`z0PusPTiYz&?a zHU#T}wZYTDn&7Emb+9UUGFTZr5%dN0ov+D|jeq3T6f~g6YB3U`jAKXbc*HNx{TmLNGoU7mN+Y z1gT(DFftes)Ca?Zx}Y|w35EsLK{AL36+tWr0_Sh~8~(a~*T3W6_SgJXf5l(+m;6P4 z!N29-^ymE>{+xf^pY><_YyMS#+P~sY`IG*HKkkqDqyC6L><{^u{6T-f@Av!sUcblh z_PhK}zr%0$+x%9)#Xs*i`%QkMf7WmC>-<{(v|r<&@~izS|D<2(pYXlD$9MY`e!1`R z%luN`>6iG$KJVLo&S(50-{xEWLchSb`1yXGZ}xNj9G~{H{Ve~GZ}Kz!3_smZ^;7(0 z-{>3sBtOwl@Z&dxUcXrA9&|(x*P7gd)K|= z-gejARd>Z*c9+~mcfq~o-gM{P8}6KY-JNx3+-vStciO$;PPvorggfqzxufogJM0d* zm)t>j!0mVY++MfG?RLA|PPfBtciY@nx5Yj0HoHx3qkGnEaO>P!_q1E%o^q?*D)*#Y z>7H=CuE%w|6>hofa?9LO*XfqH#V+sKUCw3PBG=|x-9op(wYd3io@;h<-5i&8v)wHB zkZW=?-3&L~O?6Y;WY_2#+$1;AO>pDgI5*afaVa;-jdUYiy&LZ8T&=5d!x$V%7k3qm zkRa7_Sy!_+>;ChmX}!+- z?rEJa=2sEE>Vk%eF8GU1dvkte*3Ej0c;}LY&SYKk&5uuX7q~8de4_8>TFIr76)v!R zF_nK{w~NIc?}5{M?7N*VsO}6Fx}f8AYMwIfQOZ2(S8{bvd(>Uzx*rjL>g^^bthZYAhOu=Qt;`|2AG5n? z>xAEbUTW`6S=V)3C3q`yd#gJit9S8&yGaN-5&GF)qfxvtqq@_7)5Y^+$m#vDX`OzQ zixaoU#XEQgKh3iOta+#B;(i+tz_Bor-d;DYH(2PmS>3y>-lW~DxmP;T%)4uLziIJ? zrQdAf=Yieow-sVpciWZJ=Un##os5U^gvL%=>{5Qb3B2i z#u@H@mcct}_XfL9vhuq`e?KZ;2b>r!c3!Pmr?c4gfs;Qr;8cx&{NpxIU@$2%ab0m7K=Hq4k~a3OH`@6 zkhn@eDHrl864)&PvoHEd9sMy21` zV6Zd7fHyGMnHy^uD39tEPh2$)p&#-ZGck81(?HuMQgS@cu|AojKmE_x*xYV3t|^sJ z>nK6JJAH%d{Vo{rw#!C+HE)x6o9Xg!*Rv77CBekGu7bP!qVRRgxi`8McJBtpB>JJ7 z{EX@^Y-s*cb?4~GE}xsr?30H-Qs3=#c{pz>;XKlBc}e;Wj9oEgY&SFYqb}e4r8(F2 zuLS$5U>9Ld6DN1wT9d^tCsuNHaNZR|#%i{wCg_u}k)nBpu_5X^QO(--;I*uaBYEPB zEk<)dm?v;>|AP(S)dgPNlzqr`0kI2++_SE7nBpJMtmR6ffc(0s#W$J!tkEcZFh&_& zN*e$#)$=cFG|H=2N{@QDtLqD0sdRQ}duK;iYP>6(_HcQ{_50DR!WxIovwn*e-nLdb zf2dS%suUW-%zuHI`XzTBU5q(k`ayc~ZI$##3*lHf3P$s@ZX_~jI+C=K_E#=8E>9Y- zn#6+VtD`sgVAK;ph{K7)c%JYTmcn>9K23H+u{oow@n)P+6vmqVK<#l#GPa_;@hGo! znvi0Q1t`X7bjWV~Xvq5`AU1@JT6%X`e;(e}JFBcrYQ&iC5=32~N5 z>EV<*M6LtC4E%vYy`}379ln63**(%?IGFTUwT?yW5KgtUbtt|oe~5jR9UK?}2P>ec2iabHdPa=5G7 zaxRCTYTVW+ZrFghZCO_li(nmcW3#Tj&FUPNb+MI%K5Th=@91=QxT%bM8^32 zg!sKOE^To5PHERu-$HX+X&9}v9A4ahZ!0NJM0LF6rj|luOQG>-<*TW!-33`Ut)lr$ zA$8q((c3-joAO9fn=g>0HeZDE#H@TQKf_^Mlt2K894`~G$ZFsS{V$LiDEMrE8XBax&gfb z&lsleqrOR+uxk)cxC!C-wjLGN*W9t&{i(@QI9WPo#d+zN1KPL){@ic*wFauOdTOgX z`}$lhnxUj-?OxiJUk0B0*8_uD=Vqw+qOFK}HG+KWGps2$8T<{8LDIekYOOFB-9VH+ zT+D+$ED5g*h^7~3TwgowmgY4E&X7ii&hh0t-HIG|qO0^4G%Ic8-P!u6#nnygEpJk5 zlR3>*k{W8>kIcQR%r{?&6YSULW z{dItMg{z~+I@Jh9;-6aZuQUAbvYP7(v-I@G@-wLQD^LM$4t^6FpiQFP96u02Hr;%C^ES$7K*5-;W<;qba8OLr%>Wa{%!p!Y-1I1BdK5F# z&D5x6#UDzs8lyre#pXIYF>_k)rHqw0YB;>a z-Md5F19zBvnLENg=2G0to$^$;6WlA^G4649l6%4(=U(I1a8J3XHJWd}NnMi5f94W~ zeXsH6V)EV*an&VJ5FY6>J`lyl53EVW{V&gBtfQw%|5vVnxsX>$p5V%;me1VntuN@(W#=Ex0geIg{5eCwUD9xq{?sJH4e@SFO&4 z@wtl;?iriiwdQVva+2_(c1YC+tR3w}sc5Cmdb3|QnwoWsXVb5tK8<{*|4tN=%vPh2 z)hF`OTN^~J#VJcW#;mrPd0Vw%hoU~MP3hTw7?fbdpaacSPZrnrXhc9MyskFT7OgS{ z_8@wZyIZ9wt5UK6)B)qo2*#7rFA`W>fwA#}U}W6SJ{7KQOcQb*9VW!jtR1U7`mNDN z^tRo4Wb%FQ{YZNUX?w;pf>$Y%5Bj;Y{wsEg_+qsW$ zJ5;+H33WT&NRPa7`?&US?P~rKqs!JbJk`g}ZRGwrNw<$2Ab()7)9if*G-Op{F>@{E z*liEA+De{!DwsKcrS9`E?NejD2F^N-z?q;3koYLkg&YdQ7A8~1(zer3I&tK)K z5!*=oT%MoiUE0d$d7`bj+jzRZUP37gXwc!k!m&b8qHSU(nnEvV^`COdC^W`Zr+WUu_CH3l|KVRAnReA_$A}w-c_W$j z@#Lc0(tcQX!rhtniR7Z{?qRMX9Slpw(q+TClZs7NExOHOV~Q;w)?MZ5;(dKpRZ->& zMOO}c>^7g6R^8VZOUH**qf=9FtLz0M_lEl_KeL#aw8b24J`3M$i&ZJL1 zNWpkdh0>DgC4Tg?315}|lpp&K=>EJZ~|cIFANC( zd>BpwDE;{X;r}ZPR{<(r=nq#%W1zyuK&A15Rv8tH0X^f<$YE`JORVNKb~?@pU{NbDD|p6Hx(|Dx>Nk|{pr?@)9~fxO%I>&Z*S86+x^&p`krFI_pJ`O8oi+Be3!*+ zQh!8rMUI2v!hv{T`=|@+xL-E1aE-SKIW^MgvXM}2n0|AO(laj7YPJ@}fh9A)KgW}K z$Vz(q3nci@!i0vxh%dlsWHv zYF&nGx`k3E^E7YY99^(Ozs-2fJA#Da8> z2Y3p$EGuKs*(#L^KQ~E32tH$Z8?jfR9hF^lH=^0*ja1LyzpECFskIg%)~nqho(?I$ zvoK$ExScjSyc=P?Q(W)w40-P7UIO=!CwCU=fxN{acQ&7iwN#@q8ArXrQx^5%nN8&A zwH#}k&vf7Bs$v_<7nhaoD*tTRW6$lGRDRkM{;p4-h?m97U-f>>FP0_K)$zpF6UjvU z58?^tn?(8F__9R#Yd-D%@$rB1+cJ38u_=;(`q8=1M zWOUIV11+B68mY7rq4mGwb{8~z{))R^fNPQm-3@VJFyGzCFQipk*)5NHK=}e-lg}ih z&d)6Sq6My%X`ep36kjqF{8Nei>jx7A0+cD4t|>815$evy|`hSd_|^((aWiA3NJ`b*fkZJm~asOatFJ5D|z0Cj#p)J((? zK|85%gznL9>siW-WwxDcy^DlaTW@YB7J39&>Pdsk{;i8L(O7aCElu)Gh`bUsj?u#I zIAU=}lzwlMZ#L~5ZTx*RV^MnY^p;Lf)fi=yrM%i7njkuVERAFs&P=={wCDRJ=<+8i zaR?e%xvcvboDK&pQcmXQMNqHC4YxgBjT;vnBSw4s?#3=~kEs^3;>#{El2V}^U32qr zTPr5R*%*04yYK^RC#5!wqdhiLQ%^f3Yk4;-@Q-;iqvJ(Z!gh+rCF3pQre3oe2hhW; z(F5N70^pXgWQ|yBw&FXDw#Z8_EkNs7-OuW7{d$MS%}rLU9?gIqp)_*O{X2Vjk|X&B z@RmljjCbdkY0tUxla_Ce@?C#}Hsc8ZH1D6xxPM<4)&bqeMl$zk7-RL_%)0v?!vEk+ zd)sYwbQZ=N>`?{TP`&SDtVlA8i`b2$gjTQGWxZ+RUh+^gh-c@r(@J(0+Vyn1^KB8N z7RoMq-)z+#?hUPH1|fZ3_y)~HycJ(r+0wl+D37nHly+GEk+K((iwMP^tZeCd;l%X#Z|HfwF}|v@ zW%>*2{QdFYRA6C{imz5+RoPF)|BC|M<-_7nDR3-N9{()^h8B`_?}FFA)Mwn;@zZ+c zk;a@u%(W}RS^L%ZPFH(ajZ5OSyYn5FNj+`6zXW{>Khh1iKT-WXNT z4o@rdn3a*;tM8?(8}SC5L~CsAh}FydaLRa&&$xSz1D&}N*!Z9oMAa$w_EFx>^Tzy{ zku;cE%5#!8>`;_Y9@))5MxOnto>#AlFFsP=d}jI!?#r=s@IpZU-Gk5bd7!6jj zEBBgO;tsGEht(4KDoa^tH4E)!p&hMcHKPV+I=^gZ&4Pl3QWPACZE9~}2Bk-uCm)u} z(27agUPdk!L_A;flpn%Y>E~r!Ai1kG+Hs)H_Q&O!^pQ~eK7bCi%`j#~DBnLp%DTT_ zMQERI;J#npGLC&rKM7CH9hUc?tXJht&}Bq*XY4AwFpOzE3-10_c1G6`GXgG@97jUY zH=0|~BP-{yo@X8}qb!iN`k-JkIP$_m^1?qz)PFW>AX=JIkbyNt)nNq;W>BTg3%%KEM}FL56NVxg zr}@F}(Cq$$Em?O?dO>LW%>y+P!3uY=7Z)wT_dQvRFIs}#V(>>(|GN|6$aSj<8tW{VB#mivPAe;K zxMD3P{Ciq?`@ckf*74SEZwDf2y35ARKHvygEgv^=|j65j32OD1W} zF3pPb2fUdd6sh=Nn>L=Zb$>Z;v=G`4%u^ZW@%3(b*8Pti=qX6tar-p3uA}vlpV=gY zr5O+&-D@)-(0IdBqToKXf)EDtoc1azdAbjUT4B79XVk*sYEfQxTwAyN^W_Y4!N1fY zov{{r>7ILv9l&rgRKG%Y* z`xKgM9nUJ(NWPi$RI2B{+xdsd;rWMQyl)f#OkON|CUwb^L)d@Y2RU~&mvwJT`$IP3 z!4EFB@9eJ55ij~}S@*+JVcppzPcX^2@74jc* zzsAyEZ|!OQvsn6It9A~urzsh;RZI-en*MnYDQGrQcEK9X3p2M?oceqByS1WPW4oxv z#oVX3P=hCrWHPH9lcwU=M#>)ajX5~aKj<4ecJh9LamqZ{cSH4ZuY;>r)20T=ZQtnj zOV2*}lv?p~Pnzu)N}cSs_YG!=7fmLBZH+(7+U&4&@Bcukw0iVuqw0Ba1)*eUjq`^K zV}O>H+*XTa>qatb#b{`Z{G;0Ryq_R#eN-znk^LjuJ*1Bo zQ$xLTh3>!+-1 zJ`;blFJ9mF+hzYSrFdU!;iv5Wn|ANBdpxE*_u73N_l0d+6>-@j{><)&xu;@&&9rJ} z(6ZlFZGJacJ*ZG1jcJBLW%CIACxt4e(2riBsx5>X6!IGgVSnZUcuWS!fiR(hsdn8Xd~ueBugmf3CQHnM-KAr8W_ITcLlXY;2@LpV*HT{QH_=V)yDj zh#`?KT3zrHHQcn4PhrhNXDWNa$}Fz#9QK-pW)u2b3!%NC+X^B&w)=usvg}pvBKBQ0 zGB@o>-j`~9RJL2Wrgf3R-g$vK+z))vq49Z%r<=x}gPjifz7NQK(jCk*!}z1N7XG+t zd^f^)l>yg-$ZKh;%dF1jsxxL3oF;krMb#O+t~#gQ3~TQI9(4;Bpm(^b7tlqhiyaB% z!{vvh^K-Jj5iTvZnrgAx)cF=hEM8wo&NOZ4Q%hrez^%qsr)y3B zrx)|c*^kZ6xa+nDbbO^SowlYZ2aenMhiROD2+U^>88hGXotmhY;v3_wj}=uof_=K* z8bXci?t?*bJspJW_Fo4(^UP1@T-~u^Idrl+(U3c_ovSy-N(%hr6RDoRyePb;kFgbU z`R|malZoWUL@ZJMY+1S@k=&m6gG3@eHj_HQpH=9(oRf<4fGj| z>_C*>Xec1ud{MN=flg3HNu@oi?R>>{gAX$_a?Z{;Q11H1Aji} ze#ETy?-Qu?E5?1b+K)>09D7BSd2og-B#Flpvsop^AKU2TkHyi|%Hof0bLHLf;GL-V zpem&d>)A-&lJzRwDJKFy_{3?KOWFz&G^d`a2}gjWcjg4|P$$xdc_Ovr znI!jzB!{bya3NnQyRmT9p6r!s);U&dxW60r>YB3hBW3LBzkEZnGlnr*;>l{w8d;;8 zpT#+?o|oUS)QQb!9xi)0{&2bZZ*#Hozlb=Y?+F_vSRl>LSKR1FT%awK=Wy2qg0rlE=;u+Dn!e~luN3W>1|1`4sOj!g|8j9>6 zWk=~1|zFZ(SU3r&(k@5#4XV;qZ% ztUy4+c4KeYbin5!fdgsV-j@b{Fk@)@8Et{2%ye8x`aIk_MF{9^%}~9WuS*C~$S!N8Y)z)1o0+9im0ChU(I}Gx=*3V}l`MU;0V0 z5e=&GMtCJW(IA|`Cop_ulN8OtgqcT@4jGbneQzs-Kij1u4R3u$n1wWjQYwd!+#&Kw zN{i;gJWPio5iMkglGIY4LZgf;-oVDks!f9xvHE6x@Wd^u){bzP~3vqT%ePCyV zv=U{O?c(nHV@+Pu9%`mdWh<#YY>#@`W`r{EjCI?a`FDpoW4++j1ujW;Dc%j^ULR+< z`b$n{>?0$Hy(^Sr^sU}fnxo#lZmG4{4WQ!Rk1xUN%FDiyM5c@Xc|sqwY1*Nkqc%OY z4h~~}d`LPo`SCCD^HV*4I!Zl1>vE{`w3p#2(qT#pS}!``Zh0(BPD6z?TzeyW57e4M zimx(?tL<4lyH<5xR%tnNN%Y0=Nqm_L9EoV0y!_wxh4F905;+g3e zkaNUPIiX-9>8wtzj?@R`TOZ~d_CYm|u+Wr!(n1R& z3-=cDlCN+X+jViC@l!TO-uUim`VgvM`B1NNeyDKDo|(ciQoQB-l;zCv9`|;t%kqtl z^0_|7a+Gtf<(yiCdGmG4vjy4FO-S{-zNMsw7<}4tOIjFQxHKAJf34FCHnN((lyNW4 z;$j{4Vw#J+ix=l|q4B@SuF8w^x!Co2aRJvtu2!x#u0>oKt{hi8SDtGz*AlKyuBBYd zxVpHObFJWFP4r?97uL=f@$huIjFTI?Q#1>nPVTuH#%MxK47N z;(CSaG}o(KuW_B>I?MGs*Ey~?xXyFE$@Lc31+I%+m$)u-UE#XQb&cz7u6MZJ<+{#w zgX?C7Bf4AxSB$HIE6$bVs?NASrCsy8GwxWudZ-1AU!IzAC&A?Sri}ZmkyrpHW!!17 z`1yG}f&SfxGOqbecAs`2IZayndhLO+!tME!u^Rd53(aR(pG}uXXx%mVrCjU3zuQB4 zOzEGjKr)Q^#j0d=vU=C_UGB>@Ec2^&#r>gQOz+!=v%q5;gA{Aq@$XPxV>>LrG}Uw9 zn3bPR`GudvDnN|cKR=26^A;DihN?x0d*U@8-t@^I#1mkXVx_1RVzj0_VEW%D(f=M} zS2lfcUr_DlTnApxYS>w_3NqWl<*jyav-=|5ZFWX(TNs<&UD)UDLQlO5yzgQ@y9ULdjOK>fvaqx9e!^t1b|!|oSO&S~ zCiAX&r&{>jd4@|XG@A+UJi*&BAju9PsgKvI(Qc_f%=yCeM!gZKp8W^Z#!t1-_wIZC z{!b?teXsRqT6@g4DaI!KrYX^mD>*;npL>Wg0YlP*z zD*j70CKHX1CtP{jCC$cGE9%iI?OWF7t`tLsw^BX(Z2#-i?0*GCpV;E)Fl!@u&FVhH z(>Rj&BTzuAn<8iSpU<_DN`W^jY;R66+EZ2D$d?=(776!H?`}S`qbf)Q<;g`=-GTc; z^3mINRB_CrsypE;rO?tCM))0^jo3HQO1xnu$Wh8Sj(pwa!EKL~`}*!=aIHI8enl3% zWI1>J=_!wgJI17X{^)|BG>>gQ<92_#nm)VFjmQnlx|)MvCypJFxkRobmTQhAl7|6486H^$Ii;{sX=uX zp}p@Jmh-a>y7*S~(o-B#A3+UQE1@?S5`rGmoPu{DHtfyh)qGOwgPZyqmguEE02g`- znesn0r4Vza6?bVyl>Bjhi~8+V@2hY4-Lf70 z6lLUfLK(Pdct;cX;TsGD>{Izh-ta+yGxEr)i1+d0?R5vtQvaNvj9oO^FXM2*@zcDtX_7Y0&2d**7){lZ~e(WDWLZ~K;H6&`Dh+%t!wwv?=> z{W}As)Y{6)dhtIJO7(p6yy}`i0W0q!-0hQP$%iW+E{mU_#zaf`w|%VT;W9)_YgNs$ zUkLXAez=NOveTS#|8RxSUX8iGnoNHm6ur-g20y7Eqmdp`;6{;)M1i~DO|8WZ>Zv!1 zQ2+M$Pl5`qv753^Xcv9NCq)YX`@sPe7JS#&lQkt!rF*GjTOlx%U&^H7ntxfrV(XtTdb}3hf)xBH<10*m@$V zpgnH5_1b|_8ve2oO=M^7vflpHs2!TKZO$U4e||TKLW+EDYxpjl?yI8`@(odXH}%?Y6> z^7+^h`E=G`d9h7AR|Bu)%^cBtwVTR{?Nao{SAD>0^#Ck6XL~D@tow82cz>=Ntg!dYqz0>n=N_(W;kho_|CH6%Zs)z6yOwqT^cvS$>Rd@prvH8h{g+dZ|DkX)(dcfyh>bb_HbB9)E#(ncNCC&eNA^y*gzYxgHwG2mB*~50~{2e31#uglL zFze3mqo?%kn3fLB8x|_aBFoObxX^qfu%P>ou(!=9(mOpE?FuP29IceF-P_`t_YYQ! zP77DzYumEG-~C`q!PoV~%VSkF@$wdLC-vgL?<3QPOQopGZt?$(JS4GZNEU3S}|>)*~ZYHkD-_xu@k%xMLis zB#BsdZXS<+s3!jD%9i9tIg-1D$wxu|S1RisZ24^E?X3D^<*$}gAXc8Mjm5oSjXJ;|%{^w+_=fTM2|0Br%YI(9e<#y_vs`( zop{_~^8XR!f4Jt^VeNl}_EY7lvmF2#MRL|FK|F@O>U(TfVeEqbQnBIKmp6~v2@Pk&${BnHW4_ecGL3)%=e%=3p zk3SN3KWO!57Ny5U5zIqzzI@i=7Jkw4k0<~5C=G+hz2uF5zM@4f{toMxuXkDWi8yV*Z}8T*HNI`TH15{@Tq%M%$(Xo*>O>NVoDn<#0zRowgXY5Z-jXt(z} zSk%s)BV9h&(mlVNsf2U)(Vm)2< zH*M((0&`=3(^lWMw(OO*bPcc1DZZA#?<#9Y_w&%;vw4uSI>Jd6x4C__Dg zYYL2z2Tpz4zbJKNJbfGCXB1A6VT4t2Z|qoGdW^D7ZJQMPxpW!Nv9VNoY#8;i*nKEC zB5GOcuH?fnq-v_TRq0ld?n|U%iH(WG*O3uE!SWx=64q*Tn>IA=uISmK=laf~9nHLW zT06`WCHhV=Ux3cK|Go^`h{i>IMKjrb=;&BJzpdHoUN@XR(Htv%MfwGn5@e)#J+RlY z(B}MFI72hJdSVXH_7zuM|2#9&8}y~KKa-#Oz;j#S46nUzAfhYyg_Mu`h5EJ#^T|T) zW^Flnl6Yb1zVlX?v$T%Es$R;qJ<27?Zkh@2TI*TbaQTKBjf41U!%NIVM`uPvf{zB(xvt8|}N&GoPU;Oi&r>QEt zExuIG^78l>bX2B%S!LOaj=J71e@X=lur$~i2wUmIgF7bUy0MN1pImevFKm^sdF~718v`JY1(No21y8zw z;Js7QRCMk-Jf#&%6UKMhUu%E!SU&5vT{jOGcB=niGo{x}>(zI%*r|IKOurKPb)cPx zCFRQzXjj`kK`Qex@7~^*3U_*29LY{y?r@lnPInqu>1n<1;dyvVo~u8m23ymW;7iX- zx(aBqpS9Eu(Gkci*j;P61qS=&qCIvu?H{j>a?T~Eczj@c2Ip)GOEEUwjt#(;SBm$d z)Jy$-73>{wY8Guo)WH5onHX!8Alouz?98EJGqOcAJwPd^erZC#kG@NjmG5lv-Mg|3 za)5eRvCs;vtz`i{8~PRS%}(S1XVfxp@#I_n@G=V zuRY9ZbWu*lh_1A8z*m*=*lt9()3=Z(FdylAQ)5I)^ufS1`LmjP{;Y+$$2?m76B&2( zDU)5|`*#@4>UH>meepi?d|;1ztMu^-u$DdlRa#q-m4vJSviMRdd<`#mO0vb{Rm<1; z#mAcnF&+s?!<093!<26Tq*h1p-36^Urp`WqPTtc*slJ$hfEA(yIU+%XMe)zOa zUp;ewL7k!$egU2SS@St8*H@(cYtX1M?gyB%H|p-jn+p?uRFI$_|lT4RP`uMoY=u8%>4 zDxz%keO#yk^kvZf0{C%el~$HKwEUA9_civAbY?!|jwlB-gF9FYMxoA9C|3$;t_kxs zGoty@6YtOvo{tlPhS^vaC}GRqn?TFN;~EX**)liP^Lw`c)6V`++WlqP9Z$P&r`?IP zTc2+FYT9i|H*HS4@1)&^^f`~FCV5Jkyg0mlJM+muwZq}JZ}l6HDR0sGPWod5lzJ)d z$T!pSodWhfKJgvaG0H3Y_py3;lao5XH_~!kkrjWoUmy4Bxqf}Zr+?nBPuji8r|0|i z)qeeL8`6{f`e8mj%dfxPr$6D>*Z6dcUw?;RU;BRtiSMkFN0DkznY}Ye^=vl#cL(4^NF4P)dXx3Gw`V6O93)dx%tKfve1nZ@y@jJXmY1HyJS2QvMZx9{_=J@s z(x4ctv1O7n!g_dCvJHxwd|GGLm-SX_gImW_wIV&dd@UtKD$Ke$WQe@$!r8#`nEbmn zWUUHuiP;wbE5cTrbYgsic`V1yAFZRjUrVh+!U2<5KkSHdDLplE?d$R2Z}8R@m^J#a zA>7m+<2vXS){o|H*bJm`(LYeRu$zNTZN8gaoYIWS>RDqo4;exh5BLr)5YXpxQ=qWE zIXAXswUiCn${V+9o!n$;vbxpsHpmA#)$_ai#eItxFcQx(nqN-4V`&$pAJ`zDVmrZ1 zo^_U|hf%$~U0RU&kr8j_Ulw!zCGj16lEc2PuzKU9+WL1f>)-B}`&_anxHIt6K3i3z zQ$^uecUPh^lAwI+hxRj?T&zFVkL{0*QY&t)XX7JPpr&6x43)5w5sk6>D!Wv zHn@((=}+iR?TvwtKOXR%uvjn%hb8^BNjAM72gPy*wM}PALV4yybxDdyos@Y1+W8{wA}_mC&qniq`YirW3j?w=1nVo3H9mDV z`RL%her&4eIcxtC+TZZw!-G?w{qL6VQr3OrD4{w( zmwVhZXKIemql@@0nGptaQ=ZW$Z$B?h?trwozvZl!(%hv2T9CernRkD#Uly2XXIwgT zp84P*+JrsT&sR<1_e4D2D&LWI9hR71Dv`GmYtWdQ2j_lKS`s=WoM4&;Z+p$7kZ(g1 z=6o#ol9e;-cD;_)nD@_?N?F@^8*8PGSgHK`N^Q4N8wCpuNBGXP`(~p+y-w|-Ej($~ z0(1xSm?$%AzxC0((w+$AFJ|4pt&YOyOb(}{vEJT}7EB+Qzu_&IKqbiywWI$mgDlUA zT`r7@UpLCS7i1d^q+1Cuw>2*vP^TG~Yb>;hkoK931OB#`IDNBJz7uGE;I@nqe5Aa7 zW_}@WegH=pA5qI*#rx;EnXdt%H7 z;V!+&{HV92t!lp0_qqprQV&dt+bo>`zD`>>CyUjc3i($F-A8B^&(X|0GpLi_l7aVU z)0Pa-r8P(2jgRWgm{!dc!%cZ@mh)@e6RY`JsNSzjd^PwRq~7;mxmX`A$N7PYW3>i`6#Dt_$@D`eqxx zdSh%{^IZ;F_E6UCf7&Dn`w7%M!p18vL+i?Z&Im#TKxm2s5|Qa#U@|MxQaf18;a#YC3giqQC*n_)%$LiR$L7Pe=KuFa z{Qs)4N&N_W`P!|T3%|I8dRjJ-ay?Z0uV(-2!v2>&oJ?0Hpi#9(J(_Unf5@l^PjD1RM>HyB*BCS^8H@XX z=Y+wpCWS$jYMN)GRI7h<_pG}-KB6ifa;KhB%OoZA?TRvZ+V(2Nt8w19LhVK5kpG9? z_ma*mUpcdQYG^N3(x*-T{Z;f|Va{ILx8#ApuSxWyf05VUviB8{s396BlH~Qi4lVwom(-DkIQsPqTHUZ7?L7O0sKVNHef@Cz)~;=hZ`fi;agkg@xo=2Bn~bqqq4gf%e#h z@l}r%y}T)kn`d!*JyvAVmfy*+-{^BYc5mFbvwW9E(?@TP|N5|A0i*JzdUGHb@ z1cbPm^kF;Eb!`8gTF_3j?rW`Pl{p#KN}m$9QL8940^3DDNe$Xf*K;|~<*cO7bj&5R zg3#FxB%)hVjL%Ij#^)vwI$4ClQ)R>7;?Y;{)g!MLvHS@+`L^|doYEX$rG%bmcuN0# zEqb1{lU@U3WA0^v+mMr+7C8HwM*Pt7f5=A-@SP@M`$@SHT~qy(pL4{S#r&^Su78IG=4NT!co^H zXihp+%uZ0E|MKf-#ua?s>nI^;#(jc&6rC0=7?c^vx8OMQ?~#2YtjB6W%PBZ z-e84Md?n);3J1RiU)%RDOwv>Go9M}vcGBt_$1-mBc4F2*ea=f}!`(2)cpq-{N~=B! zKKNklk);>OW>#XpscEwV8kKzX|K|zdv{C>4q2>ma&DtRPinc>NjmFZrq$!p(F0&I5 zYh?z<7A>ptCuQ}mvAK5%P?p&Fu;Q0A(dPbb1}P1+yuqxRq_B<{&zXcY@lz?0_uyP1 zoo}VIzuoLp>`f7~l$fV2W;!uieTF#~u*WWK?=DM&!u+D{1bSdReK`xQu1@{SvyJC$ zo^DNC*!|%tcxx zKVk5C2f^#2FSG_L!356s4}wE3+Wc3m=(lc04gGm#M8@sf$%s8GeVkt=)Y|z(_~gAo z@BGFv&x}?(aX%?DoaYgqqDSGZdzyKNX66Y`;N;8_dKlMKdIo%>~6Ocyrm zi?Le<#*(+e@@~5&HiYo}z*r!l4TQTEXzmZ;G4%V$zh1x6R;Ay$j2&@)*8OFRwRgUK1L@n~18*SxS4C~%JYM)tesAAEa`t7u!M`YC-_!f5q{;if z&PQChZeE3)s;1bOnwMe7YvIWY2o%g}H^!r|xixn=vfJQFPa7VdHGfz>T zg=@XUU(@PZa9-}wJm}$5+`IiNaEN|c4*K~|l4ESKRb}Z2t5)_&bm~X-wE`25Yx2$| zFXOlDlLK;Xx;2+}%<{9z&2Me%%UXUBPc**ji^4^GL~Zk>-)_)(`7XYey^9=BBe@rf z(-*ue)i{~4DD7`I{Ss<_+X!I;(*9%Ot3WjW3|Z~ebL=fX!DtS5=&JhdW?A>UuV>mR z@xMZD;JnX#`(F3GJjHF|8gNW}8HkdX#tkn|CxoVHb#In$RicM$`JIkQAtO@d4sNm8*w4E=v zHXSleobg>4PoH!#N5Cm)57KbN`Q6NUo&2)8v=&Z5F{3Y|$7G)`o;ug6#BBA{g*;{+ zyCHsffZyD_cLQ|7ahem`8^Y7bV4jJ-lqjhw-im%P2l&sLg=at z&X?ds18h&G<$(ih&5Z2MH?_`Qp}w_zkxkE0jvOm;qbMKpW+y|5P!sMg$fh`<2bb2ZWo_Y9SF>>|h`?2@{SRX{aq2h1FwBPGnZ9|?J zWtzhtoz}~_CWC@4q7gc??z`hSeXNzvf3O!tU;C{xe(BKsB@EslF(wB=4{O%xY&3uT zN5gq}GS3Ds?Z3+sIB1UMJ#XA!Y^Sgqf|ecbJ*++vzq)j2;IyB4!#rU3Q3d#=T z;^J7C@gJum5U|~2{j#=}X!=TSnbG!iZgG)YY~4_#=KPTIg*o6m(7#;c2P{@Hf+bOS z8eH`X_-ZULhuwU|D0~a$Nta|3p5F#~d%=fp#^`V`HGgU+*ck@_OCZdw)VN_{y*d*|`8iF3~ z*$(UhQMs_?MSkQrG@%P$;-zlmq9|A1Fqi(y*e~ROI@74EwrcOhW>(8Hf5?)O;O~bg z$^8CUR(-K6ABf*W{{j5?Rm&kE{~uv7B!t!Y?IvAI&Q;GQU9E57iOlv_piP~>!o08# z>Ug703sPCLJEIp(avPYp+(IplHc?mf2?Hw+*_pb+I#$|)DUlcb@Ae8Lz)O*Dhv-pNKQbwb3 zU@UwxAa(}f$<`*dR9Z!`rGh|Rw5|oMTOD()sS_@a^+>NbK3pE$4C}FsAK!MOwPs*mY9AuDzvTn-(#9e3n(dR; z6=!x?ErvNP#?11PE-T^HeBoSFQd+%9ml7opuP2>Z>{W6srll$){$AN}3Q8`C%E<#t z<(62v;+!%#wkY`r$94}1p=-!k$yQN&FoX zx4^OQjtSym?Lhp@SF~IX8UBh|3C)~&A-=zMoN6-ZiH|(Ln3lmReGY1<`~rIuZS=O#-YyWzpz}V8=fR^chlQMP z_WavnD8a0Olzr9YNDnkQ0X+xEbX(&v@}Zc<;%Zu{6&QLsR_*y6i^yGTvOWi$`Lfp+ z%>Qj2{%?GV)pj|}kEWJ#KjECa%G+0Uu~$v&Wmd~&v}+)mhvQkjIiI@q95l1ME9<=F zgE}U2-wF3~=9E^#b68i;yIbD~_ys624~Y5=TS3a97tEtI%thh%!i*kkR4a8!Uj2W1 z8olRJTGSe1Js!a=<*?rBWuCDb!ATa~OsSvIW8BBxLX{#-&s*WXVy*k@AyO7t%4dox z22;IWZ!m>{V3shk-9>|LE~HH)eoUI zj0OSMWb~Vd1J)dojAG64s{O_r^Sar7@_bPqnBiE6M$p@;jjJ?M|FL$>T9q&Be&a2r zQd>$Cj!L+9iu%4rUB5Ih$xdSXCI7(Kei=V7cD0RAtrf#rIxn8Ex|loPX&bO1>n3GGTo*ht%Iz(?Ehc*X%Orr42T!rijH>GQo=>M-pn!K;=t4`nA zc3K$D-A2`@PT3?Qs^7B4K{}vy&M#a67XCt1qRQd5KVQi?tg$45g!*3Jo`ECL>~*)1X_<0ghd9<%%R7(8FBJenzESVFbA5LR`LFg+7>!aBt6O#%Nc5ty-W`t(EAt zUr17k<(at30#mv}J5OmA>dEdB=MGx^(y#sFu{4JIwhid_{*fuYp(xQAnLzv?EjgrO zhW=hG4E<$7i|B31jEva^Bp*ufrfCi+YCD5ti<;5k*lt>-e$K$@H{py>3%_hKi?zev z%OUqg_-eOCBj$tgMXP6QB0UDKQnU+h^fhgNuYCAgjr(u?60dMm+`#YevJwe6m%%Qz z#_g>oWLLYj1UggvqLs*zs(tN|db@DR@D8}!9`hfj2EJQt1-0y<%wo#mTM*Gk`(LvB z>ML&-jMIO>+YzWXFy*49{E&9_6wLp96aMdR*=E0NGheJJ_utr@xbqJC;=y?Rmd$PW z(1rWKPBRFnv*^{UQ0Y-Otb=j;+YN-hf5X1jQ;82-r@Nt6_>HNa{9*YceRXd0nbCDX zB^Yf|5csbz&3{UGOqnEx0N$L72s-L$=y>&YdM|KaY(prZf-tP8?XG6 zuU6BF06J=C18L$R{gBDV2$Lf75r+TOa4(#=W4glp8T<>uV+*UHDHhtuZ#1z| z$L29A&zgW=m3!BA$=m(A#>H{_O~KDasg3?xPMneQ*Nihrg{PU5{JVPMr*KVB$>sX; zSf^gK7L2p|c<#sK)4E+cXTM+59L<&A&^ko&Vy^n|8+<`@cSRJ_Drw-aMq_>~^_U-) zPKx@sIjK5=UHr+MRISw>ihAW6`&FNRH>0yv_}zKN_E-AIA?$zSL7uFiCyKN301C=#1@U4N&35}@Ve+YVJ Ok$B7#Tw}TLZU5g2Wc>61 literal 0 HcmV?d00001 diff --git a/l9dev/regress/games.l9/billy.l9/st.l9/compile.bat b/l9dev/regress/games.l9/billy.l9/st.l9/compile.bat new file mode 100644 index 0000000..4bca291 --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/st.l9/compile.bat @@ -0,0 +1,27 @@ +1../firstvar.txt +1mconst.txt +1../aahead.txt +1../language.txt +1../aaconst.txt +1../aavars.txt +1../demo.txt +1../standard.txt +1../menu.txt +1../walkabou.txt +1../fx.txt +1../arcade.txt +1../vectors.txt +1../strategy.txt +1../comms.txt +1../floors.txt +1../goal.txt +1../cache.txt +1../duel.txt +1../fire.txt +1../movecurs.txt +1../spaniob.txt +1../music.txt +1../display.txt +1../print.txt +1../intro.txt +2B40 diff --git a/l9dev/regress/games.l9/billy.l9/st.l9/exit.txt b/l9dev/regress/games.l9/billy.l9/st.l9/exit.txt new file mode 100644 index 0000000..8463fd1 --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/st.l9/exit.txt @@ -0,0 +1,583 @@ +; Dummy Exits File for Hero +; +; EXIT.TXT, data for the game exits. The numeric values for the +; directions is as follows: +; +; 1 up=9 in=11 cross=13 climb=14 jump=15 +; 8 2 down=10 +; ! +; 7 --+-- 3 +; ! +; 6 4 +; 5 +; +; Room 1 - Santa Fe Undertaker +1000 0 0 + +; Room 2 - bank +1000 0 0 + +; Room 3 - bank +1000 0 0 + +; Room 4 - bank +1000 0 0 + +; Room 5 - Santa Fe Wire Office +1000 0 0 + +; Room 6 - bank +1000 0 0 + +; Room 7 +1000 0 0 + +; Room 8 - Santa Fe News Office +1000 0 0 + +; Room 9 +1000 0 0 + +; Room 10 +1000 0 0 + +; Room 11 +1000 0 0 + +; Room 12 - Santa Fe Bank +1000 0 0 + +; Room 13 +1000 0 0 + +; Room 14 +1000 0 0 + +; Room 15 +1000 0 0 + +; Room 16 +1000 0 0 + +; Room 17 +1000 0 0 + +; Room 18 +1000 0 0 + +; Room 19 +1000 0 0 + +; Room 20 +1000 0 0 + +; Room 21 +1000 0 0 + +; Room 22 +1000 0 0 + +; Room 23 +1000 0 0 + +; Room 24 +1000 0 0 + +; Room 25 +1000 0 0 + +; Room 26 +1000 0 0 + +; Room 27 +1000 0 0 + +; Room 28 +1000 0 0 + +; Room 29 +1000 0 0 + +; room 30 - Santa Fe +0001 1 1 ; to undertaker +0001 2 5 ; to wire +1001 3 31 ; to street + +; room 31 - Santa Fe +0001 5 36 ; to other street +0001 1 8 ; to news +0001 2 64 ; to store +1001 3 32 ; to street + +; room 32 - Santa Fe +0001 1 12 ; to bank +1001 3 33 ; to street + +; room 33 - Santa Fe +0001 1 160 ; to saloon +0001 2 0 ; to train station +1001 3 34 ; to street + +; room 34 - Santa Fe +0001 1 80 ; to jail Sheriff's office +0000 5 38 ; south to other street +1001 2 65 ; to store + +; room 35 - Santa Fe (Street 2) +0001 1 171 ; to saloon +1001 3 36 ; to street + +; room 36 - Santa Fe +0001 2 190 ; to courthouse CLOSED +1001 3 37 ; to street + +; room 37 - Santa Fe +0001 1 190 ; CLOSED +0001 2 190 ; CLOSED +1001 3 38 ; to street + +; room 38 - Santa Fe +0001 1 190 ; to other street +0001 2 34 ; to other street +1001 3 39 ; to street + +; room 39 - Santa Fe +1001 1 19 ; to livery stables + +; 40 +1000 0 0 + +; 41 +1000 0 0 +; 42 +1000 0 0 +; 43 +1000 0 0 +; 44 +1000 0 0 +; 45 +1000 0 0 +; 46 +1000 0 0 +; 47 +1000 0 0 +; 48 +1000 0 0 +; 49 +1000 0 0 + +; 50 - El Paso +0001 3 51 +0001 1 168 ; to saloon +1001 2 24 ; to doctors + +; 51 +0001 3 52 +0000 2 55 ; NE goes to other street +1001 1 66 ; to hotel + +; 52 +0001 3 53 +1001 1 13 ; to bank + +; 53 +0001 3 54 +0001 1 6 ; to telegraph office +1001 2 56 ; to other street + +; 54 +1001 1 20 ; to stable + +; 55 El Paso second street. +0001 3 56 +0000 5 51 ; south goes back to southern street +0001 1 167 ; to saloon +1001 2 60 ; to store + +; 56 +0001 3 57 +0001 2 81 ; to sheriff's office +0001 7 55 ; west to saloon/store +0000 5 53 ; south goes back to southern street +1001 1 9 ; to El Paso Sun + +; 57 +1001 1 2 ; to Undertakers + +; 58 +1000 0 0 + +; 59 unused +1000 0 0 + +; 60 store +1000 0 0 + +; 61 +1000 0 0 + +; 62 +1000 0 0 + +; 63 +1000 0 0 + +; 64 Store +1000 0 0 + +; 65 store Zang's (Santa Fe) +1000 0 0 + +; 66 hotel +1000 0 0 + +; 67 Not USED +1000 0 0 + +; 68 +1000 0 0 + +; 69 +1000 0 0 + +; 70 Roswell. +0001 3 71 +1001 1 82 ; to Sheriff's office + +; 71 +0001 3 72 +1001 1 3 ; to undertakers + +; 72 +0001 3 73 +0001 2 61 ; to hardware store +1001 1 173 ; 67 ; to hotel + +; 73 +0001 1 190 ; CLOSED. to post office +1000 0 0 + +; 74 +1000 0 0 + +; 75 +1000 0 0 + +; 76 +1000 0 0 + +; 77 +1000 0 0 + +; 78 +1000 0 0 + +; 79 +1000 0 0 + +; 80 Sheriff's Office (Santa Fe) +1000 0 0 + +; 81 Sheriff's Office (El Paso) +1000 0 0 + +; 82 Sheriff's Office (Roswell) +1000 0 0 + +; 83 Sheriff's Office (Lincoln City) +1000 0 0 + +; 84 Sheriff's Office (Mesilla) +1000 0 0 + +; 85 Sheriff's Office (White Oaks) +1000 0 0 + +; 86 +1000 0 0 + +; 87 +1000 0 0 + +; 88 +1000 0 0 + +; 89 +1000 0 0 + +; 90 +1000 0 0 + +; 91 +1000 0 0 + +; 92 +1000 0 0 + +; 93 +1000 0 0 + +; 94 +1000 0 0 + +; 95 +1000 0 0 + +; 96 +1000 0 0 + +; 97 +1000 0 0 + +; 98 +1000 0 0 + +; 99 +1000 0 0 + +; 100 Lincoln City +0001 7 21 ; to corral / Torreon? +0001 3 101 +1001 1 165 ; to saloon + +; 101 +0001 3 102 +1001 1 62 ; to store + +; 102 +0001 3 103 ; east along street +1001 1 83 ; to sheriff's office + +; 103 +0001 3 104 +1001 1 15 ; to bank + +; 104 +0001 3 105 +1001 1 69 ; to house + +; 105 +1000 1 190 ; CLOSED to courts/jail + +; 106 +1000 0 0 + +; 107 +1000 0 0 + +; 108 +1000 0 0 + +; 109 +1000 0 0 + +; 110 +1000 0 0 + +; 111 +1000 0 0 + +; 112 +1000 0 0 + +; 113 +1000 0 0 + +; 114 +1000 0 0 + +; 115 +1000 0 0 + +; 116 +1000 0 0 + +; 117 +1000 0 0 + +; 118 +1000 0 0 + +; 119 +1000 0 0 + +; 120 +1000 0 0 + +; 121 Mesilla +;; 0001 7 120 ; west to empty desert +0001 3 122 +1001 1 25 ; doctor's + +; 122 +0001 3 123 +1001 1 16 ; to bank + +; 123 +0001 3 124 +0000 2 191 ; NE goes to nowhere +1001 1 169 ; saloon + +; 124 +0000 2 191 ; goes nowhere +1001 1 190 ; CLOSED + +; 125 +1000 0 0 + +; 126 +1000 0 0 + +; 127 +1000 0 0 + +; 128 +1000 0 0 + +; 129 +1000 0 0 + +; 130 +1000 0 0 + +; 131 +1000 0 0 + +; 132 +1000 0 0 + +; 133 +1000 0 0 + +; 134 +1000 0 0 + +; 135 +1000 0 0 + +; 136 +1000 0 0 + +; 137 +1000 0 0 + +; 138 +1000 0 0 + +; 139 +1000 0 0 + +; 140 White Oaks +0001 3 141 +0001 5 142 ; to other street +1001 1 63 ; to store + +; 141 +1001 1 17 ; to bank + +; 142 +0001 3 143 +0000 2 140 ; NE to other street +1001 1 172 ; to saloon + +; 143 +0001 3 144 +1001 1 10 ; to news office + +; 144 +1001 1 22 ; to livery stables + +; 145 +1000 0 0 + +; 146 +1000 0 0 + +; 147 +1000 0 0 + +; 148 +1000 0 0 + +; 149 +1000 0 0 + +; 150 +1000 0 0 + +; 151 +1000 0 0 + +; 152 +1000 0 0 + +; 153 +1000 0 0 + +; 154 +1000 0 0 + +; 155 +1000 0 0 + +; 156 +1000 0 0 + +; 157 +1000 0 0 + +; 158 +1000 0 0 + +; 159 +1000 0 0 + +; 160 ; saloon right (Santa Fe 1) +1001 7 162 + +; 161 +1000 0 0 + +; 162 ; saloon left (Santa Fe 1) +1000 5 33 ; south back to street + +; 163 +1000 0 0 + +; 164 +1000 0 0 + +; 165 ; big single saloon in Lincoln City +1000 0 0 + +; 166 ; left El Paso 1 +1000 5 55 ; south back to street + +; 167 ; right El Paso 1 +1001 7 166 + +; 168 ; single El Paso 2 +1000 0 0 + +; 169 ; single Mesilla +1000 0 0 + +; 170 Left Santa Fe 2 +1000 5 35 ; south back to street + +; 171 Right Santa Fe 2 +1001 7 170 + +; 172 Single White Oaks +1000 0 0 + +; 173 Left Roswell +1001 5 72 ; south back to street + +; 174 Right Roswell +1001 7 173 + +1000 0 0 +0000 0 0 + + diff --git a/l9dev/regress/games.l9/billy.l9/st.l9/gamedata.dat b/l9dev/regress/games.l9/billy.l9/st.l9/gamedata.dat new file mode 100644 index 0000000000000000000000000000000000000000..48dfe615d75e8712649b2e0dbf608bb5727d25e2 GIT binary patch literal 19681 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⁡lTApy;*tY>7ShvFX$gc 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 + +; meet Widow Woman who wants ALL BILLY'S MONEY (quel surprise) +[1620:"Oh Sir, I'm jest a poor widow woman. If I can't pay the bank, +I'll be thrown off my little farm and have to go a-begging in the +streets. It ain't no more than $1000] ; followed by amount of gold +[1621:; that surely ain't nothing to a rich man like you". ] +[1622:"O thank you sir. I'll always be a-thinking on you". ] +; yes to 1620 +[1623:"O no! My last hope is gone - I'll be in the poorhouse till the +end of my days". ] ; no to 1620 + +; Desert peasant meets Billy and entices him to his house +; with story that family is sick. While Billy stays there, +; an outlaw arrives wit news of a gold consignment at +; the local bank, but it's a bluff - if Billy leaves to +; travel there, he gets challenged in the street by a bounty +; hunter. (Note: there may or may not be gold in then bank) +[1630:A peasant rode up: "Senor Billy, my family are sick. I no can +make them better. Please, you come try and help them". ] +[1631:he rode off with the peasant and stayed at his farmhouse; +fetching and boiling water and cooking for the family. +After a few days, they were recovering and was +about to leave when there come a knocking at the door... ] +; yes to 1630 (|This is Followed by 1633) +[1632:"Oh pity me, my family will surely die". ] ; no to 1630 +; 1633 moved to 1701||| +[1634:a bounty hunter was lying in wait. "Gotcha! you dumb +saddlebum - you've been set up! I'm gonna take you in, +dead or alive! Draw! ] +; meet Bounty hunter in town, after 1630/1631/1633 + + + + +; ambush by Buckshot Roberts +[1640:As he rode near a farmhouse, a huge man stepped out from +behind a rock: "There's folks as wants to talk to ya. I'm takin' you +in. The name's Roberts - +Buckshot Roberts. I'm a bounty hunter - an' I've taken in fifty scum +like you already, and you're gonna make it fifty-one. ] +;||| removed: You coming quiet? ] + +;|||moved to arcades.[1641:although Buckshot Roberts must have stopped half a dozen +;|||bullets, he still found strength to climb onto a horse and ride off. ] + + + + + + + + + + + + +; win gunfight +++ Move to arcades? + + +; Seven Rivers gang ambushes Billy/Pat in town. +[1645:Suddenly shots started to ring out. He dove for cover. On the +other side of the street, gunslingers hired by the Murphy-Dolan gang were +shooting at him! ] ; |||no longer mentions Billy ^^^now murphy-dolan, +; not seven-rivers + +; Jesse Evans gang ambushes Billy in town. +[1646:Suddenly the air rang to the crack of gunshot. He leapt for +cover. Across the street, he could see some badmen +throwing lead at him! ] ;|||no longer mentions Billy ^^^no longer +; mentions Jesse Evans Gang + +; Tom Cooper offers Billy lots of counterfeit money +; instead of his share in a robbery. +[1650:Tom Cooper said, "Billy, how'd you like 5 times your share of +this robbery - in counterfeit bills. There's a tenderfoot called +Duncan, spreading it around. It's a good looking paper. Won't give you +no problems if you spend it careful. What d'you say". ] +[1651:Cooper smiled: "Say, that's great. Here's the sack of money". +Billy pondered on it. How could he use it most easily? ] +[1652:BUY CATTLE WITH IT. `] ; menu option after 1651 +[1653:SPEND IT NORMALLY. `] ; menu option after 1651 +[1654:Cooper counted out Billy's share and rode off. ] ; no to 1650 + +; when Billy is in Lincoln City Saloon, he overhears that Sheriff +; Brady is on his way to ambush McSween. +[1660:he heard something that made him prick up his ears."You +know that no-good sheriff Brady's gonna run Mrs McSween off her ranch. +Ain't that the devil! But what can we do?" ] +[1661:Good Mrs McSween! An old friend, and a friend of the late +lamented Tunstall! One of the last alive to stand against the Murphy- +Dolans! What now? ] ; after 1660 ;œœœ no longer mentions Billy +[1662:DO NOTHING. `] ; menu option. +[1663:STOP BRADY. ] ; menu option. ->1664 + +[1664:he ran from the saloon and found Brady heading out of town. +He caught up with him and pulled him from his horse. Brady got up, +shaking with anger. It was obvious he was going to draw. ] +; stop brady from 1663 + +; Jose Miguel Sedillo, a friend of Billy's from way back, tells +; him of an attempted horse-robbery on Tunstall Ranch, +; while this is being run by Mrs McSween. +[1670:Jose Miguel Sedillo - an old and +trusted friend - rode up. "You must go help Mrs McSween - the +Murphy-Dolan's are there right now. They try to steal her cattle".] +;||| wording changed to make non-Billy specific + +; do nothing or... +[1671:GO THERE. `] +[1672:they rode off and got ready to fight... ] ; selects 1671: +;goes into shootout. + +; meet Joe Grant,. drunk in a saloon. + + + + + + + + + + + + + +[1674:Joe Grant staggered out of a back room, plainly drunk. "Hey Kid! +You know I'm the fastest gun in the West now. Lookee here at this +pearl-handled pistol I just - er - got gived". ] +[1675:He handed over the +pistol. It surely was pretty, but wouldn't be powerful enough to stop +a mosquito. Only three chambers were loaded. What did he do? ] +; nothing or... +[1676:ROTATE THE BARREL TO AN EMPTY CHAMBER. `] ; menu option +[1677:he turned the barrel and handed the gun back. ] +[1678:Joe Grant was waiting outside. He seemed to have gotten sober +real quick. He snarled "Draw, you prairie dog". ] +[1679:he handed the gun back. ] ; don't play with chambers + +[1680:"Beat it, we don't want none of Tunstall's men hereabouts". ] +; Billy meets hostile soldier + +; meet Mrs McSween +[1681:"Why hello old friend - how're you keeping". ] ;|||no longer mentions billy +[1682:"Gotta get going. This place keeps a body busy". ] +; follows 1681 + +; meet prospector +[1683:"What do you want, stranger? You another claim jumper?" ] + +; take sick man to santa fe +[1684:when they arrived with the sick man clinging to the horse, +he said "thanks for the ride Pard" and staggered off. ] |||^^^no longer +; mentions Billy + +; take sick man somewhere other than Santa Fe + +[1685:when they arrived with the sick man clinging to his horse, +the sick man cursed him for not going to Santa Fe and +staggered off on his own. ] ||| + +[1686:"Sheriff, can you come back later. We're real busy right now". ] +; Pat meets hostile soldier/rancher. ||| copied, slightly changed from 1680 + + + +; messages which result in player being thrown back to map... 1700..1729 +[1700:the man struggled onto the horse, and clung on weakly. He +gasped "Take me to Santa Fe, Mister. I got folks there". ] ; |||now mentions Santa Fe. +; yes to 1509 +; if visit Santa Fe next, get 1684, otherwise get 1685. +[1701:An outlaw burst through the door, brandishing a gun! He saw +Billy and dropped it in terror. "Billy the Kid! Don't kill me please, +I didn't mean ya no harm. Look, I'll help ya. The bank at White Oaks +just had a big payroll for a ranch thereabouts. Git +down there now, ya can pick up a whole load of money". ] ; follows +; 1631 ;||| moved from 1633 + + + +; Pat's strategy game messages... +; Go into sheriff's office... +;|||[1800:the deputy looked up and said, "Howdy Sheriff Garrett. What +;|||can I do for you?" ] +;|||[1801:move deputy to reserve. `] ; take deputy away from town +;|||[1802:move deputy to town. `] ; station deputy in this town. +;|||[1803:ok. ] +;|||[1804:there are ] ; followed by number of deputies +;|||[1805: deputies in town. ] ; follows 1804/digit +;|||[1806: deputies in reserve. ] ; follows 1804/digit +;|||[1807:Pat got a reward of ] ; followed by number: amount of dollars +;|||[1808: dollars. ] ; follows number. +;|||[1809:the deputy looked up and said, "Howdy Sheriff Garrett. What +;|||are you going to do to calm down the people in this here town?" ] +; people are upset about level of crime. +[1810:"the people sure are not gonna be happy about this." ] +[1811:And so the west was won. Pat had brought Law to +his domain, and was respected throughout the land. ] ; win message +[1812:And so Pat died in obscurity - known only by a few +historians who read dusty books about the Wild West. ] ; lose message + +[1813:Barney Mason rode up: "Pat, the county has run out of money. +I took temporary charge while you were away, but I had to fire +some deputies. You'd better get into town real quick and sort +it out". He rode off again. ] ; ||| +[1814:Barney Mason rode up: "Pat, there's trouble brewing. +People are saying you're doing no good as sheriff. You'd +better get into the office and do something". ] ;||| +[1815:Barney Mason rode up: "Pat, you finally got it wrong. You've +lost the election. Sorry old friend, you're no longer Sheriff". ] ; ||| + +;Billy strategy messages + +[1850:And so Billy became a legend. His reputation was known +throughout the world, and his story was oft repeated +by people of all countries. ] ; win message +[1851:And so Billy died in obscurity - known only by a few +historians who read dusty books about the wild west. ] ; lose message + +[1852:WANTED! Billy The Kid, Dead or Alive. Reward $]|||| +[1853:. ] ; after 1852/number||| +[1854:was stopped on the way. He pulled up his horse +and dismounted... ] ; Actors name, 1854. Used when +; get a random event whilst trying to go somewhere from map. |||| +; messages to do with meeting a gang... + +[1855:"Hey Billy, come share some coffee"... ] ;||| then 1856 ; œœœ punc +[1856:Billy sat down with the gang and talked of daring deeds +and famous crimes. Then he asked the crucial question... +"I've got a real sweet job planned. You want in?". The gang +looked at Billy. Should they trust this young hotblood? ] ;||| +; 1856, 1857 ||| +[1857:their leader spoke "Sure, but we'll want a good big cut. Now get out of +here before I change my mind". ] ;||| +[1858:Billy and the gang went over and over the targets they +could hit, but they couldn't agree which should be next... ] ; ||| visit gang again +;œœœ made "meaner" + + +; get spotted by a deputy in a lawful town... +[1859:down the street, a deputy called out, "Billy The Kid - hold it +right there. You gonna come quietly?" ] ;||| ; œœœ punc +[1860:RUN AWAY `] ; ||| menu option +[1861:IGNORE HIM `] ; ||| menu option +[1862:Billy fled the town. ] ; run away ||| +[1863:"Go for your gun, outlaw." ] ;||| + +[1864:woke to see his ex-girlfriend Paulita Maxwell tending +his injuries. "You should take more care, my love. Next time +could be your last". With her loving care, he was soon ready to go +again. ] ;&&& note either Billy/Pat. Preceded by Players Name +[1865:Suddenly, Pat Garrett burst in. ] ;&&& +[1866:"Billy, you know I can't +take you in. They'd hang ya like a dog, and I can't stand by and let that +happen. We'll have to settle this now, gun-to-gun. Draw, +outlaw". ] ;&&& +[1867:Billy and Pat approached other and exchanged glances. +Both knew that they were sworn enemies, but also old friends. +Was this to be the end for one of them? ] ;&&& +[1868:CHALLENGE TO DUEL. `] ; menu option &&& +[1869:AVOID CONFLICT. `] ; menu option &&& + + +; messages which occasionally replace the standard greetings +[1870:"Hey, it's Pat Garrett. I hear you polled ] ;||| for Pat ; œœœ punc +[1871:"Hey, it's Billy the Kid. I hear your reward is now $] ; |||| ; œœœ punc +[1872: votes". ] ;||| follows 1870 ; œœœ punc +[1873:". ] ; ||| follows 1871/amount of money ; œœœ punc + +[1880:"Hey, It's Billy The Kid! Get him boys!" ] ; occasionally +; when you go into a bank, or other law-abiding place +; in town. Leads to escape game. ||| +[1881:(lawful) ] ; added to town name on map +[1882:the place was completely deserted. ] ; ||| visit a ranch +; etc. which has gone bust, or similar. + + +; messages Billy gets when gangs go out of business +[1890:Tom O'Foliard rode up and said, "hello old friend, ] ;||| ^^^ +; now now longer mentions Billy + +[1891:the Cooper Gang have been brought to justice". ] ;||| +[1892:the Socorro Vaqueros gang has been brought to justice". ] +[1893:the Seven Rivers Gang gang has been brought to justice". ] +[1894:the Dona Ana Bunch gang has been brought to justice". ] +[1895:the Jesse Evans gang has been brought to justice". ] +[1896:the fugitives' gang has been brought to justice". ] +[1897:the regulators' gang has been brought to justice". ] + +[1900:"Ain't nuthin going on around here". ] ; knows of no ||| +; relevant events in this town. +; Tom O'Foliard's comments on Billy's progress. +[1901:you've gotta hurry up. The Murphy-Dolans are taking over +the county, and you've gotta stop 'em". ] ; œœœ punc +[1902:you've got the Murphy-Dolans on the run. Keep going +ol' buddy". ] ; œœœ punc +[1903:you've almost nailed the Murphy-Dolans, my friend. But +Pat's almost got the territory cleaned up, so you'd better pull +off some pretty big heists to finish 'em off". ] ; œœœ punc +[1904:Billy, you've stolen a total of $] ;^^^Billy added at start (not +; an important change) +[1905: which has bankrupted ] +[1906:of their ranches, but ] +[1907:of the 6 important gangs have been wiped out". ] ; œœœ punc + +; ratings added ^^^^ +[1920:Billy's final reward was $] +[1921: out of a maximum of about $15000, and he will ] ;^^^^ + +[1922:not be remembered. ] +[1923:be a dim memory. ] +[1924:be a figure of fun. ] +[1925:be remembered by many. ] +[1926:be remembered by most. ] +[1927:be a minor hero. ] +[1928:be a popular hero. ] +[1929:be a household name till the end of time. ] + +; ratings added ^^^^ +[1930:Pat's final popularity was ] +[1931: votes out of a maximum of about 4000, and he will ] ;^^^^ + + +;------------------ +;; [2000:Billy The Kid Intro screens. ] +[2001:"Well if it ain't momma's boy Billy! Let's see how good you are +now. Draw, Kid!" ] +[2002:Tunstall Ranch in Lincoln County, across the state line. ] +[2003:"...Murphy and Dolan are dangerous men, Mr Tunstall." ] +[2004:"I ain't gonna let their threats worry me, Sheriff Garrett. I'm +too riled up about the way they're cheating honest farmers." ] +[2005:"Hey now! Here's someone who might be a help. Where've you +been these past years, Billy? John Tunstall, meet the Kid, an old +friend of mine and a good man in a fight." ] +[2006:"I'd like you to join my men, Billy. Here's my lucky Silver +Dollar on account. Keep it safe." ] +[2007:"Pat, Billy, there goes dinner!" ] +[2008:"Another good man dead! I swear I'll bring order to Lincoln +County and hunt down every last outlaw in it." ] +[2009:"You're wrong, Pat, you can't play it by their rules. If you +mean what you said, you'll be hunting me too. Because I vow to do +whatever I must to avenge this murder, inside or outside the law." ] +[2010:"The Legend of Billy The Kid" is an authentic Western for +one or two players. ] +[2011:As Billy, you might tie up your horse on Main Street, +swagger into the saloon, meet an outlaw gang at cards, and go +on to rob the bank... ] +[2012:...or raise money to help a poor widow by rustling a herd +of cows and driving them to Mexico. ] +[2013:As Pat you might learn of a planned train robbery from +the local drunk... ] +[2014:...and lead a posse after the outlaws, track them to their lair, +and shoot it out with the gang. ] + + + + + + + + +-------- + diff --git a/l9dev/regress/games.l9/billy.l9/st.l9/ref/acode.acd b/l9dev/regress/games.l9/billy.l9/st.l9/ref/acode.acd new file mode 100644 index 0000000000000000000000000000000000000000..caaf7ab88fffed11dcfc99c4a4784e6958b14e8e GIT binary patch literal 40790 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 Ok$B7#Tw}TLZU5g2Wc>61 literal 0 HcmV?d00001 diff --git a/l9dev/regress/games.l9/billy.l9/st.l9/ref/gamedata.dat b/l9dev/regress/games.l9/billy.l9/st.l9/ref/gamedata.dat new file mode 100644 index 0000000000000000000000000000000000000000..48dfe615d75e8712649b2e0dbf608bb5727d25e2 GIT binary patch literal 19681 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⁡lTApy;*tY>7ShvFX$gc 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 + +; meet Widow Woman who wants ALL BILLY'S MONEY (quel surprise) +[1620:"Oh Sir, I'm jest a poor widow woman. If I can't pay the bank, +I'll be thrown off my little farm and have to go a-begging in the +streets. It ain't no more than $1000] ; followed by amount of gold +[1621:; that surely ain't nothing to a rich man like you". ] +[1622:"O thank you sir. I'll always be a-thinking on you". ] +; yes to 1620 +[1623:"O no! My last hope is gone - I'll be in the poorhouse till the +end of my days". ] ; no to 1620 + +; Desert peasant meets Billy and entices him to his house +; with story that family is sick. While Billy stays there, +; an outlaw arrives wit news of a gold consignment at +; the local bank, but it's a bluff - if Billy leaves to +; travel there, he gets challenged in the street by a bounty +; hunter. (Note: there may or may not be gold in then bank) +[1630:A peasant rode up: "Senor Billy, my family are sick. I no can +make them better. Please, you come try and help them". ] +[1631:he rode off with the peasant and stayed at his farmhouse; +fetching and boiling water and cooking for the family. +After a few days, they were recovering and was +about to leave when there come a knocking at the door... ] +; yes to 1630 (|This is Followed by 1633) +[1632:"Oh pity me, my family will surely die". ] ; no to 1630 +; 1633 moved to 1701||| +[1634:a bounty hunter was lying in wait. "Gotcha! you dumb +saddlebum - you've been set up! I'm gonna take you in, +dead or alive! Draw! ] +; meet Bounty hunter in town, after 1630/1631/1633 + + + + +; ambush by Buckshot Roberts +[1640:As he rode near a farmhouse, a huge man stepped out from +behind a rock: "There's folks as wants to talk to ya. I'm takin' you +in. The name's Roberts - +Buckshot Roberts. I'm a bounty hunter - an' I've taken in fifty scum +like you already, and you're gonna make it fifty-one. ] +;||| removed: You coming quiet? ] + +;|||moved to arcades.[1641:although Buckshot Roberts must have stopped half a dozen +;|||bullets, he still found strength to climb onto a horse and ride off. ] + + + + + + + + + + + + +; win gunfight +++ Move to arcades? + + +; Seven Rivers gang ambushes Billy/Pat in town. +[1645:Suddenly shots started to ring out. He dove for cover. On the +other side of the street, gunslingers hired by the Murphy-Dolan gang were +shooting at him! ] ; |||no longer mentions Billy ^^^now murphy-dolan, +; not seven-rivers + +; Jesse Evans gang ambushes Billy in town. +[1646:Suddenly the air rang to the crack of gunshot. He leapt for +cover. Across the street, he could see some badmen +throwing lead at him! ] ;|||no longer mentions Billy ^^^no longer +; mentions Jesse Evans Gang + +; Tom Cooper offers Billy lots of counterfeit money +; instead of his share in a robbery. +[1650:Tom Cooper said, "Billy, how'd you like 5 times your share of +this robbery - in counterfeit bills. There's a tenderfoot called +Duncan, spreading it around. It's a good looking paper. Won't give you +no problems if you spend it careful. What d'you say". ] +[1651:Cooper smiled: "Say, that's great. Here's the sack of money". +Billy pondered on it. How could he use it most easily? ] +[1652:BUY CATTLE WITH IT. `] ; menu option after 1651 +[1653:SPEND IT NORMALLY. `] ; menu option after 1651 +[1654:Cooper counted out Billy's share and rode off. ] ; no to 1650 + +; when Billy is in Lincoln City Saloon, he overhears that Sheriff +; Brady is on his way to ambush McSween. +[1660:he heard something that made him prick up his ears."You +know that no-good sheriff Brady's gonna run Mrs McSween off her ranch. +Ain't that the devil! But what can we do?" ] +[1661:Good Mrs McSween! An old friend, and a friend of the late +lamented Tunstall! One of the last alive to stand against the Murphy- +Dolans! What now? ] ; after 1660 ;œœœ no longer mentions Billy +[1662:DO NOTHING. `] ; menu option. +[1663:STOP BRADY. ] ; menu option. ->1664 + +[1664:he ran from the saloon and found Brady heading out of town. +He caught up with him and pulled him from his horse. Brady got up, +shaking with anger. It was obvious he was going to draw. ] +; stop brady from 1663 + +; Jose Miguel Sedillo, a friend of Billy's from way back, tells +; him of an attempted horse-robbery on Tunstall Ranch, +; while this is being run by Mrs McSween. +[1670:Jose Miguel Sedillo - an old and +trusted friend - rode up. "You must go help Mrs McSween - the +Murphy-Dolan's are there right now. They try to steal her cattle".] +;||| wording changed to make non-Billy specific + +; do nothing or... +[1671:GO THERE. `] +[1672:they rode off and got ready to fight... ] ; selects 1671: +;goes into shootout. + +; meet Joe Grant,. drunk in a saloon. + + + + + + + + + + + + + +[1674:Joe Grant staggered out of a back room, plainly drunk. "Hey Kid! +You know I'm the fastest gun in the West now. Lookee here at this +pearl-handled pistol I just - er - got gived". ] +[1675:He handed over the +pistol. It surely was pretty, but wouldn't be powerful enough to stop +a mosquito. Only three chambers were loaded. What did he do? ] +; nothing or... +[1676:ROTATE THE BARREL TO AN EMPTY CHAMBER. `] ; menu option +[1677:he turned the barrel and handed the gun back. ] +[1678:Joe Grant was waiting outside. He seemed to have gotten sober +real quick. He snarled "Draw, you prairie dog". ] +[1679:he handed the gun back. ] ; don't play with chambers + +[1680:"Beat it, we don't want none of Tunstall's men hereabouts". ] +; Billy meets hostile soldier + +; meet Mrs McSween +[1681:"Why hello old friend - how're you keeping". ] ;|||no longer mentions billy +[1682:"Gotta get going. This place keeps a body busy". ] +; follows 1681 + +; meet prospector +[1683:"What do you want, stranger? You another claim jumper?" ] + +; take sick man to santa fe +[1684:when they arrived with the sick man clinging to the horse, +he said "thanks for the ride Pard" and staggered off. ] |||^^^no longer +; mentions Billy + +; take sick man somewhere other than Santa Fe + +[1685:when they arrived with the sick man clinging to his horse, +the sick man cursed him for not going to Santa Fe and +staggered off on his own. ] ||| + +[1686:"Sheriff, can you come back later. We're real busy right now". ] +; Pat meets hostile soldier/rancher. ||| copied, slightly changed from 1680 + + + +; messages which result in player being thrown back to map... 1700..1729 +[1700:the man struggled onto the horse, and clung on weakly. He +gasped "Take me to Santa Fe, Mister. I got folks there". ] ; |||now mentions Santa Fe. +; yes to 1509 +; if visit Santa Fe next, get 1684, otherwise get 1685. +[1701:An outlaw burst through the door, brandishing a gun! He saw +Billy and dropped it in terror. "Billy the Kid! Don't kill me please, +I didn't mean ya no harm. Look, I'll help ya. The bank at White Oaks +just had a big payroll for a ranch thereabouts. Git +down there now, ya can pick up a whole load of money". ] ; follows +; 1631 ;||| moved from 1633 + + + +; Pat's strategy game messages... +; Go into sheriff's office... +;|||[1800:the deputy looked up and said, "Howdy Sheriff Garrett. What +;|||can I do for you?" ] +;|||[1801:move deputy to reserve. `] ; take deputy away from town +;|||[1802:move deputy to town. `] ; station deputy in this town. +;|||[1803:ok. ] +;|||[1804:there are ] ; followed by number of deputies +;|||[1805: deputies in town. ] ; follows 1804/digit +;|||[1806: deputies in reserve. ] ; follows 1804/digit +;|||[1807:Pat got a reward of ] ; followed by number: amount of dollars +;|||[1808: dollars. ] ; follows number. +;|||[1809:the deputy looked up and said, "Howdy Sheriff Garrett. What +;|||are you going to do to calm down the people in this here town?" ] +; people are upset about level of crime. +[1810:"the people sure are not gonna be happy about this." ] +[1811:And so the west was won. Pat had brought Law to +his domain, and was respected throughout the land. ] ; win message +[1812:And so Pat died in obscurity - known only by a few +historians who read dusty books about the Wild West. ] ; lose message + +[1813:Barney Mason rode up: "Pat, the county has run out of money. +I took temporary charge while you were away, but I had to fire +some deputies. You'd better get into town real quick and sort +it out". He rode off again. ] ; ||| +[1814:Barney Mason rode up: "Pat, there's trouble brewing. +People are saying you're doing no good as sheriff. You'd +better get into the office and do something". ] ;||| +[1815:Barney Mason rode up: "Pat, you finally got it wrong. You've +lost the election. Sorry old friend, you're no longer Sheriff". ] ; ||| + +;Billy strategy messages + +[1850:And so Billy became a legend. His reputation was known +throughout the world, and his story was oft repeated +by people of all countries. ] ; win message +[1851:And so Billy died in obscurity - known only by a few +historians who read dusty books about the wild west. ] ; lose message + +[1852:WANTED! Billy The Kid, Dead or Alive. Reward $]|||| +[1853:. ] ; after 1852/number||| +[1854:was stopped on the way. He pulled up his horse +and dismounted... ] ; Actors name, 1854. Used when +; get a random event whilst trying to go somewhere from map. |||| +; messages to do with meeting a gang... + +[1855:"Hey Billy, come share some coffee"... ] ;||| then 1856 ; œœœ punc +[1856:Billy sat down with the gang and talked of daring deeds +and famous crimes. Then he asked the crucial question... +"I've got a real sweet job planned. You want in?". The gang +looked at Billy. Should they trust this young hotblood? ] ;||| +; 1856, 1857 ||| +[1857:their leader spoke "Sure, but we'll want a good big cut. Now get out of +here before I change my mind". ] ;||| +[1858:Billy and the gang went over and over the targets they +could hit, but they couldn't agree which should be next... ] ; ||| visit gang again +;œœœ made "meaner" + + +; get spotted by a deputy in a lawful town... +[1859:down the street, a deputy called out, "Billy The Kid - hold it +right there. You gonna come quietly?" ] ;||| ; œœœ punc +[1860:RUN AWAY `] ; ||| menu option +[1861:IGNORE HIM `] ; ||| menu option +[1862:Billy fled the town. ] ; run away ||| +[1863:"Go for your gun, outlaw." ] ;||| + +[1864:woke to see his ex-girlfriend Paulita Maxwell tending +his injuries. "You should take more care, my love. Next time +could be your last". With her loving care, he was soon ready to go +again. ] ;&&& note either Billy/Pat. Preceded by Players Name +[1865:Suddenly, Pat Garrett burst in. ] ;&&& +[1866:"Billy, you know I can't +take you in. They'd hang ya like a dog, and I can't stand by and let that +happen. We'll have to settle this now, gun-to-gun. Draw, +outlaw". ] ;&&& +[1867:Billy and Pat approached other and exchanged glances. +Both knew that they were sworn enemies, but also old friends. +Was this to be the end for one of them? ] ;&&& +[1868:CHALLENGE TO DUEL. `] ; menu option &&& +[1869:AVOID CONFLICT. `] ; menu option &&& + + +; messages which occasionally replace the standard greetings +[1870:"Hey, it's Pat Garrett. I hear you polled ] ;||| for Pat ; œœœ punc +[1871:"Hey, it's Billy the Kid. I hear your reward is now $] ; |||| ; œœœ punc +[1872: votes". ] ;||| follows 1870 ; œœœ punc +[1873:". ] ; ||| follows 1871/amount of money ; œœœ punc + +[1880:"Hey, It's Billy The Kid! Get him boys!" ] ; occasionally +; when you go into a bank, or other law-abiding place +; in town. Leads to escape game. ||| +[1881:(lawful) ] ; added to town name on map +[1882:the place was completely deserted. ] ; ||| visit a ranch +; etc. which has gone bust, or similar. + + +; messages Billy gets when gangs go out of business +[1890:Tom O'Foliard rode up and said, "hello old friend, ] ;||| ^^^ +; now now longer mentions Billy + +[1891:the Cooper Gang have been brought to justice". ] ;||| +[1892:the Socorro Vaqueros gang has been brought to justice". ] +[1893:the Seven Rivers Gang gang has been brought to justice". ] +[1894:the Dona Ana Bunch gang has been brought to justice". ] +[1895:the Jesse Evans gang has been brought to justice". ] +[1896:the fugitives' gang has been brought to justice". ] +[1897:the regulators' gang has been brought to justice". ] + +[1900:"Ain't nuthin going on around here". ] ; knows of no ||| +; relevant events in this town. +; Tom O'Foliard's comments on Billy's progress. +[1901:you've gotta hurry up. The Murphy-Dolans are taking over +the county, and you've gotta stop 'em". ] ; œœœ punc +[1902:you've got the Murphy-Dolans on the run. Keep going +ol' buddy". ] ; œœœ punc +[1903:you've almost nailed the Murphy-Dolans, my friend. But +Pat's almost got the territory cleaned up, so you'd better pull +off some pretty big heists to finish 'em off". ] ; œœœ punc +[1904:Billy, you've stolen a total of $] ;^^^Billy added at start (not +; an important change) +[1905: which has bankrupted ] +[1906:of their ranches, but ] +[1907:of the 6 important gangs have been wiped out". ] ; œœœ punc + +; ratings added ^^^^ +[1920:Billy's final reward was $] +[1921: out of a maximum of about $15000, and he will ] ;^^^^ + +[1922:not be remembered. ] +[1923:be a dim memory. ] +[1924:be a figure of fun. ] +[1925:be remembered by many. ] +[1926:be remembered by most. ] +[1927:be a minor hero. ] +[1928:be a popular hero. ] +[1929:be a household name till the end of time. ] + +; ratings added ^^^^ +[1930:Pat's final popularity was ] +[1931: votes out of a maximum of about 4000, and he will ] ;^^^^ + + +;------------------ +;; [2000:Billy The Kid Intro screens. ] +[2001:"Well if it ain't momma's boy Billy! Let's see how good you are +now. Draw, Kid!" ] +[2002:Tunstall Ranch in Lincoln County, across the state line. ] +[2003:"...Murphy and Dolan are dangerous men, Mr Tunstall." ] +[2004:"I ain't gonna let their threats worry me, Sheriff Garrett. I'm +too riled up about the way they're cheating honest farmers." ] +[2005:"Hey now! Here's someone who might be a help. Where've you +been these past years, Billy? John Tunstall, meet the Kid, an old +friend of mine and a good man in a fight." ] +[2006:"I'd like you to join my men, Billy. Here's my lucky Silver +Dollar on account. Keep it safe." ] +[2007:"Pat, Billy, there goes dinner!" ] +[2008:"Another good man dead! I swear I'll bring order to Lincoln +County and hunt down every last outlaw in it." ] +[2009:"You're wrong, Pat, you can't play it by their rules. If you +mean what you said, you'll be hunting me too. Because I vow to do +whatever I must to avenge this murder, inside or outside the law." ] +[2010:"The Legend of Billy The Kid" is an authentic Western for +one or two players. ] +[2011:As Billy, you might tie up your horse on Main Street, +swagger into the saloon, meet an outlaw gang at cards, and go +on to rob the bank... ] +[2012:...or raise money to help a poor widow by rustling a herd +of cows and driving them to Mexico. ] +[2013:As Pat you might learn of a planned train robbery from +the local drunk... ] +[2014:...and lead a posse after the outlaws, track them to their lair, +and shoot it out with the gang. ] + + + + + + + + +-------- + diff --git a/l9dev/regress/games.l9/billy.l9/st.l9/ref/squash.dat b/l9dev/regress/games.l9/billy.l9/st.l9/ref/squash.dat new file mode 100644 index 0000000000000000000000000000000000000000..aa922ece6a5e82ac2c29f485e40e63a293cc46b2 GIT binary patch literal 14592 zcmdsdcU)9g*Y3=mJ?AiuGD8RHRRu%_5k-&@DHc#P_7=rBb`*?a6n7hI6cJyISjIu3 zF^QT)jnNp<#8_fbEHPC@#Sv4CEr}S^yACmV-|xHMz4!mi?|1g>Ue{jhSSrzUuz`7P%!^)yb=2&iB93O+}I+2Qc1ohUE-OCcD7oL zo*(aKC8rF$oQ#z4F#Rw=q-ud*u;7QfWD&X1u`zBoZ5Iuh7tX(g{yL9x8M{MPA1)jQ9AlEzmXiM6H&0} zJ)w`pzkG?V3yl=G03ww5umrVN6_=(OKsAZR-k64jEAa}8^ zKs1O(&B;**` zGJ!9#JKSj+|Cx1_*jQ6&IE?2>r?YOM5*f(aQ`eBbcn)8W47`QpnjkZmO-DMKBPYTk z>P2n#9ZU=J|D0_VOrhk#i23Ms_qH+FQ-8WHPzOVr_(S@8zqCX>t&*4G3;X5`eH`oebPhh!~c1TJ9S8usko_hDeha}>uljcuhTW6!>F$4*x=Y0HcPYLw9tB8vf`D@j^cy{C zFLc2dhOp^+x{|uLNBjhaSofMLl{zR7lw;xeH z9)&0$2!wD7a@^1sA1{ZnzYxO4DkP9?GX38_Y%7%%YAs~B(1W-uV+t4k8~k4U-+m>K zT~efwwESaUsc;FvH;KJOA+jg@1BEt#U1I-|)7k)%h~w~^B??Ud?M22$l|WVUhJA

^$WmQHWi^ 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 Yd*QK=DZ~l^s%NVEs=?b7|DXN+FOrvhJOBUy literal 0 HcmV?d00001 diff --git a/l9dev/regress/games.l9/billy.l9/st.l9/squash.dat b/l9dev/regress/games.l9/billy.l9/st.l9/squash.dat new file mode 100644 index 0000000000000000000000000000000000000000..aa922ece6a5e82ac2c29f485e40e63a293cc46b2 GIT binary patch literal 14592 zcmdsdcU)9g*Y3=mJ?AiuGD8RHRRu%_5k-&@DHc#P_7=rBb`*?a6n7hI6cJyISjIu3 zF^QT)jnNp<#8_fbEHPC@#Sv4CEr}S^yACmV-|xHMz4!mi?|1g>Ue{jhSSrzUuz`7P%!^)yb=2&iB93O+}I+2Qc1ohUE-OCcD7oL zo*(aKC8rF$oQ#z4F#Rw=q-ud*u;7QfWD&X1u`zBoZ5Iuh7tX(g{yL9x8M{MPA1)jQ9AlEzmXiM6H&0} zJ)w`pzkG?V3yl=G03ww5umrVN6_=(OKsAZR-k64jEAa}8^ zKs1O(&B;**` zGJ!9#JKSj+|Cx1_*jQ6&IE?2>r?YOM5*f(aQ`eBbcn)8W47`QpnjkZmO-DMKBPYTk z>P2n#9ZU=J|D0_VOrhk#i23Ms_qH+FQ-8WHPzOVr_(S@8zqCX>t&*4G3;X5`eH`oebPhh!~c1TJ9S8usko_hDeha}>uljcuhTW6!>F$4*x=Y0HcPYLw9tB8vf`D@j^cy{C zFLc2dhOp^+x{|uLNBjhaSofMLl{zR7lw;xeH z9)&0$2!wD7a@^1sA1{ZnzYxO4DkP9?GX38_Y%7%%YAs~B(1W-uV+t4k8~k4U-+m>K zT~efwwESaUsc;FvH;KJOA+jg@1BEt#U1I-|)7k)%h~w~^B??Ud?M22$l|WVUhJA

^$WmQHWi^ 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 Yd*QK=DZ~l^s%NVEs=?b7|DXN+FOrvhJOBUy literal 0 HcmV?d00001 diff --git a/l9dev/regress/games.l9/billy.l9/st.l9/table.dat b/l9dev/regress/games.l9/billy.l9/st.l9/table.dat new file mode 100644 index 0000000000000000000000000000000000000000..9e00cfd55c114efa509a56c9475107e431aa1968 GIT binary patch literal 4868 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 literal 0 HcmV?d00001 diff --git a/l9dev/regress/games.l9/billy.l9/st.l9/table.txt b/l9dev/regress/games.l9/billy.l9/st.l9/table.txt new file mode 100644 index 0000000..e6b93ff --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/st.l9/table.txt @@ -0,0 +1,2150 @@ +;;;LaviniaStrumpetMenu equ 204 + +; Billy The Kid source, copyright (C) 1990 Level 9 Computing. +; +; TABLE.TXT, assembler format data for tables, a.k.a lists/arrays. +; (Save the assembled data as TABLE.DAT). +; +; You must start all DEFWs on EVEN boundaries, else subsequent code +; seems to be padded to make it even (according to the GENST listing, +; anyway). The EVEN directive inserts a padding byte if appropriate. +; + ORG 0 +starttables + dc.l ObjectTable-starttables ; object positions etc. + dc.l $FFFF ; HiresTable() Set up in AllocateWorkspaceLists + dc.l $FFFF ; + dc.l LIST4-starttables + dc.l NPCINITIAL-starttables ; npc initial and 'floor pointers' + dc.l TownFixedData-startTables ; + dc.l $FFFF ; 7: TownVarData: variable town stuff (AllocateWorkspaceLists) + dc.l list8-starttables ; 8 - assorted fixed system tables + dc.l IntroTables-startTables ; 9 - input table,object table + dc.l ENDTABLE-starttables +;--- +; +;--- +ObjectTable +; list giving the graphics objects which are important +; to the game. This is divided up by section: i.e. +; the map is separate from the various Sierra-style rooms, +; this separation being handled by the table at the start. + dc.w MapObjects-ObjectTable + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w MapToNewScreen-ObjectTable ; 10 + +; now the object tables themselves. These objects can +; be either xzh or rasters, and their order is critically +; important to the program. If you want to add new objects, +; just add them on the end. If you need to delete an object, +; replace it with a 0 or some new number. DON'T DELETE IT. +; The table ends with -1 + +MapObjects + dc.w 0 ; 0 + dc.w 340 ; 1 cows + dc.w 341 ; 2 cows + dc.w 342 ; 3 cows + dc.w 343 ; 4 cows + dc.w 344 ; 5 cows + dc.w 0 ; 6 + dc.w 0 ; 7 + dc.w 0 ; 8 + dc.w 0 ; 9 + dc.w 3345 ; Santa Fe 10 + dc.w 3346 ; White Oaks 11 + dc.w 592 ; Lincoln City 12 was 3347 + dc.w 588 ; Mesilla 13 + dc.w 589 ; Roswell 14 + dc.w 591 ; 3349 ; El Paso 15 + dc.w 0 ; spare town 16 + dc.w 0 ; spare town 17 + dc.w 0 ; spare town 18 + dc.w 3351 ; Fort Stanton 19 + dc.w 3352 ; Fot Sumner 20 + dc.w 0 ; spare fort 21 + dc.w 0 ; spare fort 22 + dc.w 0 ; spare fort 23 + dc.w 581 ; Unknown ranch near Bitter Lake 24 + dc.w 582 ; Fritz Ranch 25 + dc.w 583 ; Chisum Ranch 26 + dc.w 584 ; Dedrick Ranch 27 + dc.w 585 ; Beckwith Ranch 28 + dc.w 586 ; Reed ranch 29 + dc.w 587 ; unknown ranch 30 + dc.w 576 ; Katz farmhouse 31 + dc.w 577 ; Dunn farmhouse 32 + dc.w 578 ; Rose farmhouse 33 + dc.w 0 ; farmhouse 34 + dc.w 330 ; Mescalero Apache settlement 35 + dc.w 0 ; spare indians 36 (3356 might work) + dc.w 0 ; spare indians 37 + dc.w 0 ; spare indians 38 + dc.w 3304 ; train 39 + dc.w 2730 ; wagon train 40 + dc.w 331; outlaw hideout 41 + dc.w 332 ; outlaw hideout 42 + dc.w 333 ; outlaw hideout 43 + dc.w 334 ; outlaw hideout 44 + dc.w 335 ; outlaw hideout 45 + dc.w 336 ; outlaw hideout 46 + dc.w 0 ; outlaw hideout 47 + dc.w 337 ; prospector's camp 48 + dc.w 329 ; system + dc.w -1 ; end of table + + + + +MapToNewScreen +; for each object picked up in map, this table +; gives the corresponding screen number that it will +; invoke, or 0 if none. + + +; First byte: overlay letter to call. +; Second byte: screen number within that overlay. +; (for map, addition to 400, unsigned) +; (for scrolling games, = map number) +MO equ 69 * 'E' map overlay +SO equ 50 * '2' scrolling overlay +AO equ 51 * '3' arcade overlay, train +IO equ 52 * '4' intermission overlay - separate structure file, +* at least. + +; values for Game variable... +EscapeGame equ 21 +PositionPeopleGame equ 25 +PatWalkGame equ 30 ; drop into pat walking around shooting section. +MinTrackingGame equ 127 ; lowest number a game using the +; tracking maps/cd tables can have +TrackingGame equ 128 +RustlingGame equ 140 + + dc.b MO,0 ; 0 + dc.b SO+0,RustlingGame ; 1 - cows + dc.b SO+0,RustlingGame ; 2 + dc.b SO+0,RustlingGame ; 3 + dc.b SO+0,RustlingGame ; 4 + dc.b SO+0,RustlingGame ; 5 + dc.b SO+0,RustlingGame ; 6 + dc.b MO,0 ; 7 + dc.b MO,0 ; 8 + dc.b MO,0 ; 9 + dc.b MO,430-400 ; Santa Fe 10 + dc.b MO,540-400 ; White Oaks 11 + dc.b MO,500-400 ; Lincoln City 12 + dc.b MO,521-400 ; Mesilla 13 + dc.b MO,470-400 ; Roswell 14 + dc.b MO,450-400 ; El Paso 15 + dc.b MO,0 ; spare town 16 + dc.b MO,0 ; spare town 17 + dc.b MO,0 ; spare town 18 + dc.b IO+0,6 ; Fort Stanton 19 + dc.b IO+0,6 ; Fot Sumner 20 + dc.b IO+0,6 ; spare fort 21 + dc.b IO+0,6 ; spare fort 22 + dc.b IO+0,6 ; spare fort 23 + dc.b AO+0,1 ; Unknown ranch near Bitter Lake 24 + dc.b AO+0,1 ; Fritz Ranch25 + dc.b AO+0,1 ; Chisum Ranch 26 + dc.b AO+0,1 ; Dedrick Ranch 27 + dc.b AO+0,1 ; Beckwith Ranch 28 + dc.b AO+0,1 ; Reed ranch 29 + dc.b AO+0,1 ; unknown ranch 30 + dc.b AO+0,1 ; spare ranch 31 + dc.b AO+0,1 ; spare ranch 32 + dc.b AO+0,1 ; spare ranch 33 + dc.b AO+0,1 ; spare ranch 34 + dc.b IO+0,15 ; Mescalero Apache settlement 35 + dc.b IO+0,15 ; spare indians 36 + dc.b IO+0,15 ; spare indians 37 + dc.b IO+0,15 ; spare indians 38 + dc.b AO+0,21 ; train 39 + dc.b IO+0,5 ; wagon train 40 + dc.b SO+0,TrackingGame ; gang hideout: near santa fe 41 + dc.b SO+0,TrackingGame ; gang hideout: nr White Oaks 42 + dc.b SO+0,TrackingGame ; gang hideout: nr Lincoln Cit#y 43 + dc.b SO+0,TrackingGame ; gang hideout: nr Mesilla 44 + dc.b SO+0,TrackingGame ; gang hideout: nr Roswell 45 + dc.b SO+0,TrackingGame ; gang hideout: nr El Paso 46 + dc.b 0,0 ; 47 + dc.b IO+0,3 ; Prospector 48 + dc.b MO+0,0 ; 48 + dc.b MO+0,0 ; 49 + + + + +;--- + even +ENDOBJECTS +;terraintable +list8 +; +;--------- + even +NPCINITIAL +list5 +LIST4 +; new stuff added for AA + +; Menu text, etc. +; First, ptrs for all uses... + dc.w 0 ;MenuText-List4 0 + dc.w 0 ;MenuData-list4 2 + dc.w 0 ;HiresCoords-list4 4 + dc.w 0 ;ExitOffsets-list4 6 + dc.w 0 ;ObjectGraphics-list4 8 + dc.w 0 ;IntroText-list4 10 + dc.w 0 ;NounVerbTable-list4 12 + dc.w PCpalette-list4 14 + dc.w STpalette-list4 16 + dc.w 0 ;kerri-list4 18 + dc.w CGA2Palettes-list4 20 + dc.w CGA4Palettes-list4 ; 22 + dc.w 0 ; 24 + dc.w 0 ; 26 + dc.w 0 ; 28 + dc.w 0 ; 30 + dc.w 0 ; 32 + dc.w 0 ; 34 + dc.w HeightTable-list4 ; 36 + +CGA2Palettes + dc.b $0,$f,$2,$3,$4,$5,$6,$0,$8,$9,$a,$b,$c,$d,$e,$a ; 2 colour text printing + +; All these palettes have had to be modified because +; colour 6 is used for the highlight bar, so cannot be black. +; dc.b $0,$F,$F,$F,$F,$F,$0,$0,$F,$0,$9,$F,$F,$F,$0,$F ; 2 color map + dc.b $0,$F,$F,$F,$F,$F,$3,$0,$F,$0,$9,$F,$F,$F,$0,$F ; 2 color map + +; dc.b $0,$F,$F,$1,$F,$F,$1,$1,$7,$0,$F,$0,$F,$F,$9,$0 ; 2 Pat, Billy & Barbrawl + dc.b $0,$F,$F,$1,$F,$F,$1,$1,$7,$0,$F,$0,$F,$F,$9,$0 ; 2 Pat, Billy & Barbrawl + +; dc.b $0,$F,$7,$1,$F,$9,$1,$0,$7,$0,$F,$F,$F,$F,$A,$F ; 2 Outside Buildings + dc.b $0,$F,$7,$1,$F,$9,$1,$0,$7,$0,$F,$F,$F,$F,$A,$F ; 2 Outside Buildings + + dc.b $0,$F,$9,$0,$0,$0,$F,$0,$A,$A,$F,$F,$F,$F,$7,$F ; 2 Saloons + + +CGA4Palettes + dc.b $0,$F,$2,$3,$4,$5,$7,$0,$8,$9,$a,$b,$c,$d,$e,$a ; 4 colour text printing + dc.b $0,$F,$0,$F,$A,$5,$2,$0,$F,$5,$7,$0,$A,$F,$A,$A ; 4 color map + dc.b $0,$F,$F,$0,$F,$0,$0,$0,$A,$0,$5,$0,$F,$F,$5,$0 ; 4 Pat, Billy & Barbrawl + dc.b $0,$F,$A,$1,$A,$0,$F,$0,$A,$5,$5,$F,$F,$F,$A,$D ; 4 Outside Buildings + dc.b $0,$D,$A,$0,$A,$1,$F,$0,$A,$5,$5,$0,$F,$F,$D,$7 ; 4 Saloons + + +HeightTable +; used in walkabout code to go from the floor map "height adjust" +; packed byte to a value in pixels: kindof an exponential table. + dc.w -12 ;0 + dc.w -8 + dc.w -4 + dc.w 0 + dc.w 4 ;4 + dc.w 8 + dc.w 12 + dc.w 16 + dc.w 20 ;8 + dc.w 24 + dc.w 28 + dc.w 32 + dc.w 36 ;12 + dc.w 40 + dc.w 44 + dc.w 48 + + + + + + +; dc.b 0,$f,$e,$7,$f,$0,$7,$0,$8,$0,$f,$f,$f,$a,$8,$f ; town +; dc.b 0,$f,$f,$f,$0,$0,$a,$0,$8,$a,$8,$0,$0,$9,$0,$f ; people +; dc.b 0,$f,$0,$f,$0,$0,$7,$0,$a,$8,$f,$0,$e,$f,$7,$7 ; train + + +STpalette; also used for VGA +;commonm colours... +transparent equ $0000 ; ok +white equ $666F ; ok +flesh equ $6339 ;light red +Cyan equ $0346 ; ok +Violet equ $203a ; ok +Iblue equ $0263 ;light blue ok +black equ $0000 ;ok +Red equ $2008 ;dark brown ok +Blue equ $0042 ;dark blue ok +Brown equ $320C ;light brown ok +yellow equ $762D ;ok +Lgrey equ $444e; +Dgrey equ $2221 ;ok +Green equ $0304 ;dark green ok +Lgreen equ $1735; +pink equ $526c;orange 520C ;770a +Lcyan equ $0677; Pete 11/9/90 + + +;additional colours, for 'variable colours' only... + +PaleBlue1 equ $2254 +Vyellow equ $770a +;These colours must have IBM equivalents... +BlueGrey equ $223d ;(Mgrey?) +PaleBlue2 equ $3454 +PaleWhite equ $5671 + + + +PcPalette + + dc.w transparent,white,flesh,cyan + dc.w lgreen + dc.w Dgrey ; is Purple in other games. + dc.w iblue,black,Red,Blue,Brown + dc.w lcyan ; >> Pete 11/9/90 + dc.w yellow,Lgrey,Dgrey,Green + + + + + +IntroTables +; filenames for music, and other random stuff. Not necessarily +; just to do with the intro, but called that for compatability +; with the Grange intro sequence + dc.w SystemPalette-IntroTables ; 0 MapMusic-IntroTables ; 0 + dc.w SaveFilename-IntroTables ; 2 + dc.w 0 ; GunfightMusic-IntroTables ; 4 + dc.w 0 ; TrainMusic-IntroTables ; 6 + dc.w 0 ; MapMusic-IntroTables ; 8 + dc.w 0 ; 10 + dc.w StructureFilename-IntroTables ; 12 + dc.w 0 ; 14 + dc.w 0 ; 16 + dc.w AdlibFilename-IntroTables ; 18 + dc.w ExponentTableName-IntroTables ; 20 + dc.w 0 ; 22 + dc.w 0 ; 24 + dc.w 0 ; 26 + dc.w FontFilename-IntroTables ; 28 Font filename + dc.w 0 ; 30 + dc.w MenuStructures-IntroTables ; 32 + dc.w TownSpritesFilename-IntroTables ; map/town sprites filename 34 + dc.w 0 ; ScrollingSpritesFilename-IntroTables ; offset 36 + dc.w ArcadeSpritesFilename-IntroTables ; arcade games sprites filename offset 38 + dc.w 0 ; reserved for fourth sprites filename offset 40 + dc.w 0 ; MenuStructures-IntroTables ; offset 42 + dc.w ArcadeStructureFIlename-IntroTables ; 44 + dc.w 0 ; 46 + dc.w 0 ; 48 + dc.w 0 ; 50 + dc.w 0 ; 52 + dc.w 0 ; 54 + dc.w 0 ; 56 + dc.w 0 ; 58 + dc.w 0 ; 60 + dc.w 0 ; 62 + dc.w 0 ; 64 + dc.w 0 ; 66 + dc.w 0 ; 68 + dc.w LinkingSprites-IntroTables ; offset 70 + dc.w LinkingStructures-IntroTables ; offset 72 + dc.w IntroSprites-IntroTables ; offset 74 + dc.w IntroStructures-IntroTables ; offset 76 + dc.w 0 ; IdentikitSprites-IntroTables ; offset 78 + dc.w IdentikitStructures-IntroTables ; offset 80 + dc.w 0 ; 82 + dc.w 0 ; 84 + dc.w 0 + dc.w 0 + dc.w ScreenInfo-IntroTables ; offset 90 + dc.w 0 ; 92 + dc.w 0 ; 94 + dc.w 0 ; 96 + dc.w 0 ; 98 + dc.w ambushMusic-IntroTables ; 100 + dc.w BankJobMusic-IntroTables ; 102 + dc.w BarBrawlMusic-IntroTables ; 104 + dc.w CardMusic-IntroTables ; 106 + dc.w ChaseMusic-IntroTables ; 108 + dc.w DuelMusic-IntroTables ; 110 + dc.w Generic1Music-IntroTables ; 112 + dc.w Generic2Music-IntroTables ; 114 + dc.w Generic3Music-IntroTables ; 116 + dc.w Generic4Music-IntroTables ; 118 + dc.w Generic5Music-IntroTables ; 120 + dc.w GetawayMusic-IntroTables ; 122 + dc.w HoeDown1Music-IntroTables ; 124 + dc.w HoeDown2Music-IntroTables ; 126 + dc.w 0 ; HonkyMusic-IntroTables ; 128 + dc.w 0 ; Rag3Music-IntroTables ; 130 + dc.w RagTimeMusic-IntroTables ; 132 + dc.w ShockMusic-IntroTables ; 134 + dc.w ShootOutMusic-IntroTables ; 136 + dc.w ThemeMusic-IntroTables ; 138 + dc.w TrainMusic-IntroTables ; 140 + dc.w ShootOut2Music-IntroTables ; 142 + dc.w ShootOut3Music-IntroTables ; 144 + dc.w 0 ; 146 + dc.w 0 ; 148 +UghSampleNum equ 150 + dc.w UghSample-IntroTables ; 150 +Colt45SampleNum equ 152 + dc.w Colt45Sample-IntroTables ; 152 + dc.w 0 ; 154 + dc.w 0 ; 156 + dc.w 0 ; 158 + dc.w 0 ; 160 + dc.w 0 ; 162 + dc.w 0 ; 164 + dc.w 0 ; 166 + dc.w 0 ; 168 + dc.w 0 ; 170 + dc.w 0 ; 172 + dc.w 0 ; 174 + dc.w 0 ; 176 + dc.w 0 ; 178 + dc.w ShootoutSamples-IntroTables ; 180 + dc.w DuelSamples-IntroTables ; 182 + dc.w RustlingSamples-IntroTables ; 184 + dc.w TrackingSamples-IntroTables ; 186 + dc.w EscapeSamples-IntroTables ; 188 + dc.w BankJobSamples-IntroTables ; 190 + dc.w CardSamples-IntroTables ; 192 + dc.w BrawlSamples-IntroTables ; 194 + dc.w IntroSamples-IntroTables ; 196 + +ExponentTableName + dc.b 'exponent.025',0 + even + + +IntroSamples + dc.b Colt45SampleNum/2 + dc.b 0 + +ShootOutSamples +; list of sample pointers needed for shootout + dc.b Colt45SampleNum/2 + dc.b 0 + +DuelSamples + dc.b Colt45SampleNum/2 + dc.b 0 * 182 +RustlingSamples + dc.b 0 *184 +TrackingSamples + dc.b 0 ; 186 +EscapeSamples + dc.b Colt45SampleNum/2 + dc.b 0 ; 188 +BankJobSamples + dc.b 0 ; 190 +CardSamples + dc.b 0 ; 192 +BrawlSamples + dc.b UghSampleNum/2 + dc.b 0 ; 180 + +Colt45Sample dc.b 'colt45.spl',0 + even +UghSample dc.b 'ugh.spl',0 + even + + +SaveFilename dc.b 'billy.sav',0 + even + +ambushMusic dc.b 'ambushv2.mid',0 + even +BarBrawlMusic dc.b 'barbrawl.mid',0 + even +CardMusic dc.b 'cardv2.mid',0 + even +ChaseMusic dc.b 'Chasev2.mid',0 + even +DuelMusic dc.b 'duel.mid',0 + even +Generic1Music dc.b 'generic.mid',0 + even +Generic2Music dc.b 'gen2v3.mid',0 + even +Generic3Music dc.b 'generic3.mid',0 + even +Generic4Music dc.b 'generic4.mid',0 + even +Generic5Music dc.b 'generic5.mid',0 + even +HoeDown1Music dc.b 'hoedown1.mid',0 + even +HoeDown2Music dc.b 'hoedown2.mid',0 + even +;;HonkyMusic dc.b 'honky1v2.mid',0 + even +;Rag3Music dc.b 'rag3.mid',0 +; even +RagTimeMusic dc.b 'ragtime.mid',0 + even +ShockMusic dc.b 'shockv2.mid',0 + even +ShootOutMusic dc.b 'shootout.mid',0 + even +ShootOut2Music dc.b 'shootut2.mid',0 + even +ShootOut3Music dc.b 'shootut3.mid',0 + even +ThemeMusic dc.b 'map.mid',0 + even +GetawayMusic dc.b 'Getwayv3.mid',0 + even +BankJobMusic dc.b 'BankJbV2.mid',0 + even +TrainMusic dc.b 'train.mid',0 + even + + + +ArcadeSpritesFilename + dc.b 'arcades1.cmp',0 + even + +ArcadeStructureFilename + dc.b 's3.dat',0 * 'desert7.fnt',0 + even + + + +IntroSprites + dc.b 'introsp1.cmp',0 + even +IntroStructures + dc.b 'intros.dat',0 + even + +NoDelay equ 2 +LongTime equ 3000 +DefaultX equ 32 +DefaultY equ 32 +LowY equ 112 +dInsert equ 0 +dInsertR equ 2 +dRemove equ -1 +ScreenInfo +; for intro sequence: contains which picture to display, +; and for how many frames. +; parameters are: +; pic num, frames, soundtrack, repeat count for music + dc.w 99,100,HoeDown2Music-IntroTables,0 * title picture + dc.w 100, 230, RagTimeMusic-IntroTables, 0 ; street scene outside dance hall + dc.w 101, 50, music1, 0 ; blacksmith + dc.w 2001, NoDelay, DefaultX,DefaultY,dInsert + dc.w 102, 200, ChaseMusic-IntroTables, 0 ; street scene, scrolls after half time + dc.w 103, 210, music1, 0 ; possee in valley + + dc.w 104, 110, HoeDown1Music-IntroTables, 0 ; hoe down scene, dancers + dc.w 2002, NoDelay, DefaultX,DefaultY,dInsert + + dc.w 105, 300, 0, 0 ; talk 1 (inside) + dc.w 2003, NoDelay, DefaultX+16,LowY,dInsert + dc.w 2003, 79, DefaultX+16,LowY,dRemove + dc.w 2004, 100, DefaultX-16,LowY,dInsertR + dc.w 2004, 190, DefaultX-16,LowY,dRemove + dc.w 2005, 220, DefaultX+16,LowY,dInsertR + + dc.w 106, 95, HoeDown2Music-IntroTables, 0 ; talk outside + dc.w 2006, NoDelay, DefaultX+48,LowY+32,dInsert + + dc.w 107, 150, 0, 0 ; buggy from distance, scrolls. + dc.w 2007, 90, DefaultX,DefaultY,dInsertR + dc.w 2007, 100,DefaultX,DefaultY,dRemove + + dc.w 108, 70, ShootOutMusic-IntroTables, 0 ; buggy, bandit in F/G + + dc.w 109, 250, 0, 0 ; Tunstall propped on wheel + dc.w 2008, NoDelay, DefaultX,LowY,dInsert + dc.w 2008, 80, DefaultX,LowY,dRemove + dc.w 2009, 100, DefaultX,LowY,dInsertR + +; dc.w 2300, 50, RagTimeMusic-IntroTables,0 ; town scene walkabout in front of bank +; dc.w 2010, NoDelay, DefaultX,DefaultY,dInsert ; Generic text +; dc.w 2304, 50, RagTimeMusic-IntroTables,0 ; dancers +; dc.w 2011, NoDelay, DefaultX,DefaultY+16,dInsert ; Billy text +; +; dc.w 2303, 50, RagTimeMusic-IntroTables,0 ; shootout1 +; dc.w 2012, NoDelay, DefaultX,DefaultY,dInsert ; Billy Text 2 +; +; dc.w 2301, 50, RagTimeMusic-IntroTables,0 ; shop +; dc.w 2013, NoDelay, DefaultX,DefaultY,dInsert ; Pat Text 1 +; dc.w 2302, 50, RagTimeMusic-IntroTables,0 ; shootout2 +; dc.w 2014, NoDelay, DefaultX,DefaultY,dInsert ; Pat Text 2 + dc.w -1,-1,-1 + +music1 equ 0 * no music at present + + +IdentikitStructures + dc.b 'identiks.dat',0 + even + +LinkingSprites + dc.b 'linking1.cmp',0 + even + +LinkingStructures + dc.b 'linkings.dat',0 + even + + +SystemPalette +; palette for returning to system on ST ONLY +; to the ega colors. + dc.w $777f ; 0000 ; transparent/black + dc.w $0000 ; 777f ; white + dc.w $3330 ; + dc.w $0000 ; 777f ; + dc.w $0004 ; + dc.w $777a ; + dc.w $3333 ; + dc.w $7770 ; + dc.w $0008 ; + dc.w $7772 ; + dc.w $333c ; + dc.w $7776 ; + dc.w $000d ; yellow + dc.w $777e ; lgrey + dc.w $3331 ; dgrey + dc.w $7774 ; green + +;----------------------------------------- + +AdlibFilename + dc.b 'all.adl',0 + even + +TownSpritesFilename + dc.b 'sprites1.cmp',0 + even + +FontFilename + dc.b 'western.fnt',0 + even + +StructureFilename + dc.b 's.dat',0 + even + + + include 'MENUDATA.TXT',0 + + +;------------------ +TownFixedData ; a list on its own + dc.w TownPeopleData-TownFixedData ; 0 + dc.w TownData-TownFixedData ; 2 + dc.w SubPlotData-TownFixedData ; 4 + dc.w IdentikitPrototypes-TownFixedData ; 6 + + +IdentikitPrototypes +; For each person type we have a list of entries of the following +; form: +; .b First XZH (0 terminates person) +; .b Number of XZHs possible (1 upwards) +; .b First RasterOffset +; .b Number of Raster Offsets to choose from (0 upwards) + dc.w BlankPerson-TownFixedData * type 0 person + dc.w Type1Person-TownFixedData * tough cowboy + dc.w Type2Person-TownFixedData * mexican + dc.w Type3Person-TownFixedData + dc.w Type4Person-TownFixedData + dc.w Type5Person-TownFixedData + dc.w Type6Person-TownFixedData + dc.w Type7Person-TownFixedData + dc.w Type8Person-TownFixedData + dc.w Type9Person-TownFixedData + dc.w Type10Person-TownFixedData + dc.w Type11Person-TownFixedData + dc.w Type12Person-TownFixedData + dc.w Type13Person-TownFixedData + dc.w Type14Person-TownFixedData + dc.w Type15Person-TownFixedData + dc.w Type16Person-TownFixedData + dc.w Type17Person-TownFixedData + dc.w Type18Person-TownFixedData ; sick man etc. + dc.w Type19Person-TownFixedData ; mex peasant. + dc.w Type20Person-TownFixedData ; soldier + dc.w Type21Person-TownFixedData ; Clint, with cape. + +BlankPerson +* used for people like Indian chief, prospector who +* are already shown in the picture, so don't need to be +* shown separately + dc.b 0,0,0,0 + +Type1Person +* Cowboy, jerkin, black hat, moustache +* As used in room 430 (Santa Fe) + dc.b 24,1,0,1 ; neck: closed, for string tie + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,8 ; hair: not greying +; no sideburns +; no waistcoat + dc.b 27,1,3,1 ; trouser: blue jeans + dc.b 29,1,0,1 ; gunbelt + + dc.b 25,1,0,1 ; shirt + + dc.b 33,1,0,0 ; string tie +; dealer's armbands not used. + dc.b 35,1,0,1 ; jacket + dc.b 38,1,0,1 ; hands + dc.b 42,1,1,1 ; hat: always the same. + dc.b 0,0,0,0 + +Type2Person +* Mexican cross-breed, as used in 431 (Santa Fe) + dc.b 23,1,0,1 ; neck - open + dc.b 19,1,0,1 ; mexican neck overlay + dc.b 1,1,0,18 ; face + dc.b 20,1,4,1 ; top of head + dc.b 21,1,0,4 ; hair +;; dc.b 22,1,0,2 ; sideburn + dc.b 27,1,2,1 ; trousers: brown + dc.b 28,2,0,1 ; belt/gunbelt + dc.b 25,1,0,1 ; shirt +; no tie +; dealer's armbands not used. + dc.b 47,1,0,1 ; bandolero +;; dc.b 35,2,0,1 ; jacket + dc.b 45,1,0,1 ; Mexican hands + dc.b 42,1,1,2 ; hat, one of two brown ones. + dc.b 0,0,0,0 + +Type3Person +* Old male American, as used in 433 Santa Fe. + dc.b 23,1,0,1 ; neck - open collar + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,9,1 ; hair - white beard +; no sideburn + dc.b 27,1,2,1 ; trouser +; no belt + dc.b 25,1,0,1 ; shirt +; no braces + dc.b 26,1,0,1 ; brown waistcoat +; no tie +; no jacket + dc.b 38,1,0,1 ; hands + dc.b 42,1,2,1 ; hat: brown felt + dc.b 0,0,0,0 + +Type4Person +* Old male in dungarees + dc.b 23,1,0,1 ; neck - open + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,8,8 ; hair - greying + dc.b 25,1,0,1 ; shirt + dc.b 31,1,0,1 ; Dungarees + dc.b 38,1,0,1 ; hands +; no hat + dc.b 0,0,0,0 + +Type5Person +* General tough guy - used for cowboys around town, where +* I haven't put in a specific prototype for them. + dc.b 23,1,0,1 ; neck - open + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,8 ; hair: any not greying. + dc.b 22,1,0,2 ; sideburn + dc.b 27,1,0,4 ; trousers: any + dc.b 28,2,0,1 ; belt/gunbelt + dc.b 25,1,0,1 ; shirt +; no tie +; dealer's armbands not used. + dc.b 35,3,0,1 ; jacket: brown or grey. + dc.b 38,1,0,1 ; hands + dc.b 42,1,0,3 ; hat, any. + dc.b 0,0,0,0 + +Type6Person +* tough guy for 434 Santa Fe + dc.b 23,1,0,1 ; neck - open + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,8 ; hair: any not greying. +; no sideburns + dc.b 27,1,0,4 ; trousers: any + dc.b 28,2,0,1 ; belt/gunbelt + dc.b 25,1,0,1 ; shirt +; no tie +; dealer's armbands not used. + dc.b 37,1,0,1 ; jacket: grey. + dc.b 38,1,0,1 ; hands + dc.b 42,1,2,1 ; hat: brown felt + dc.b 0,0,0,0 + +Type7Person +; hostess for santa fe + dc.b 52,1,1,1 * body - yellow + dc.b 2,1,0,3 * face - reduced from choice of 7 to ensure youth! +;; dc.b 53,1,0,1 * skirt +; dc.b 54,1,0,1 * belt + dc.b 61,1,0,1 * hand with tray. + dc.b 51,1,0,1 * hair - yellow + dc.b 0,0,0,0 + +Type8Person +; older woman +; dc.b 57,1,0,2 * blouse + dc.b 52,1,0,1 * body - blue + dc.b 2,1,0,7 * face +; dc.b 56,1,0,1 * skirt +; dc.b 54,1,0,1 * belt + dc.b 63,1,0,1 * both hands - for 57 blouse + dc.b 51,1,2,1 * hair - greying + dc.b 0,0,0,0 + +Type9Person +; woman in green + dc.b 52,0,2,1 * body +; dc.b 58,1,0,1 * blouse - fits over body + dc.b 2,1,0,3 * face * reduced from 7 to reduce age +;; dc.b 59,1,0,1 * skirt + dc.b 60,1,0,1 * both hands + dc.b 51,1,0,4 * hair - any + dc.b 0,0,0,0 + +Type10Person +; Mexican with big Sombrero + dc.b 24,1,0,1 ; neck - buttoned (so can't see pink skin underneath) +;; dc.b 23,1,0,1 ; neck - open + dc.b 19,1,0,1 ; mexican neck overlay + dc.b 1,1,180,1 ; face - Mexican + dc.b 20,1,4,1 ; top of head + dc.b 21,1,0,8 ; hair: any not greying. +; dc.b 22,1,0,2 ; sideburn + dc.b 27,1,0,4 ; trousers: any + dc.b 28,2,0,1 ; belt/gunbelt + + dc.b 25,1,0,1 ; shirt +; no tie +; dealer's armbands not used. + dc.b 46,1,0,1 ; Neckerchief or similar. 1 only, else can see +; the pink skin underneath! + dc.b 35,3,0,1 ; jacket: brown or grey. + dc.b 45,1,0,1 ; Mexican hands + dc.b 41,1,0,1 ; big Sombrero + dc.b 0,0,0,0 + +Type11Person +; Shop man, soberly dressed. + dc.b 24,1,0,1 ; neck - buttoned + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,16 ; hair: any + dc.b 22,1,0,2 ; sideburn + dc.b 27,1,0,2 ; trousers: grey/dark + dc.b 28,1,0,1 ; belt + dc.b 25,1,0,1 ; shirt + dc.b 32,1,0,2 ; tie +; dealer's armbands not used. + dc.b 37,1,0,1 ; jacket: suit + dc.b 38,1,0,1 ; hands +; no hat + dc.b 0,0,0,0 + +Type12Person +; shop man, randomly dressed. + dc.b 24,1,0,1 ; neck - buttoned + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,16 ; hair: any + dc.b 22,1,0,2 ; sideburn + dc.b 27,1,0,2 ; trousers: grey/dark + dc.b 28,1,0,1 ; belt + dc.b 25,1,0,1 ; shirt + dc.b 32,2,0,2 ; tie + dc.b 26,1,0,2 ; waistcoat + +; dealer's armbands not used. + dc.b 38,1,0,1 ; hands +; no hat + dc.b 0,0,0,0 + +Type13Person +; clerk with visor, for wire/bank + dc.b 24,1,0,1 ; neck - buttoned + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,16 ; hair: any + dc.b 22,1,0,2 ; sideburn + dc.b 27,1,0,2 ; trousers: grey/dark + dc.b 28,1,0,1 ; belt + dc.b 25,1,0,1 ; shirt + dc.b 32,1,0,2 ; tie + dc.b 26,1,0,2 ; waistcoat +; dealer's armbands not used. + dc.b 38,1,0,1 ; hands + dc.b 40,1,0,1 ; visor +; no hat + dc.b 0,0,0,0 + +Type14Person +; lady in green skirt, as walking all over the place. + dc.b 52,1,2,1 * body +; dc.b 58,1,0,1 * green blouse - fits over body + dc.b 2,1,0,7 * face +;; dc.b 59,1,0,1 * skirt + dc.b 60,1,0,1 * both hands + dc.b 51,1,0,4 * hair - any + dc.b 0,0,0,0 + +Type15Person +; lady in blue skirt, as walking all over the place. + dc.b 52,1,0,1 * body + dc.b 58,1,0,1 * blouse - fits over body + dc.b 2,1,0,7 * face +;; dc.b 59,1,0,1 * skirt + dc.b 60,1,0,1 * both hands + dc.b 51,1,0,4 * hair - any + dc.b 0,0,0,0 + +Type16Person +; barman (e.g. Santa Fe) + dc.b 24,1,0,1 ; neck - buttoned + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,8 ; hair: any non-greying + dc.b 22,1,0,2 ; sideburn + dc.b 27,1,0,2 ; trousers: grey/dark + dc.b 25,1,0,1 ; shirt + dc.b 30,1,0,1 ; braces + dc.b 32,2,0,2 ; tie + dc.b 34,1,0,1 ; dealer's armbands (around elbow). Must be before waistcoat + dc.b 26,1,0,1 ; waistcoat: brown + dc.b 38,1,0,1 ; hands +; no hat + dc.b 0,0,0,0 + + +Type17Person +* tough guy in saloon for 560 Santa Fe + dc.b 23,1,0,1 ; neck - open + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,8 ; hair: any not greying. +; no sideburns + dc.b 27,1,0,4 ; trousers: any + dc.b 28,2,0,1 ; belt/gunbelt + dc.b 25,1,0,1 ; shirt +; no tie +; dealer's armbands not used. + dc.b 37,1,0,1 ; jacket: grey. + dc.b 38,1,0,1 ; hands +; no hat + dc.b 0,0,0,0 + +Type18Person +* sick man or poor peasant - e.g. in desert + dc.b 23,1,0,1 ; neck - open + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,8,7 ; hair: any greying. + dc.b 22,1,0,2 ; sideburn + dc.b 27,1,2,2 ; trousers: brown/blue + dc.b 25,1,0,1 ; shirt +; no tie +; dealer's armbands not used. + dc.b 35,1,0,1 ; jacket: jerkin + dc.b 38,1,0,1 ; hands +; no hat + dc.b 0,0,0,0 + +Type19Person +* mexican peasant - e.g. in desert. + dc.b 24,1,0,1 ; neck - buttoned (so can't see pink skin underneath) + dc.b 19,1,0,1 ; mexican neck overlay + dc.b 1,1,180,1 ; face + dc.b 20,1,4,1 ; top of head + dc.b 21,1,0,7 ; hair: any not greying. +; no sideburns + dc.b 27,1,2,2 ; trousers: brown/blue + dc.b 25,1,0,1 ; shirt + dc.b 45,1,0,1 ; Mexican's hands + dc.b 46,1,0,1 ; Neckerchief or similar. 1 only, else can see +; the pink skin underneath! +; dealer's armbands not used. + dc.b 35,1,0,1 ; jacket: jerkin + dc.b 45,1,0,1 ; Mexican hands + dc.b 41,1,0,1 ; big Sombrero + dc.b 0,0,0,0 + +Type20Person +; Soldier for forts + dc.b 44,1,0,1 ; complete corporal except face + dc.b 1,1,0,18 ; face + dc.b 0,0,0,0 + +Type21Person +* Clint Eastwood look alike - with cape. e.g. 436 Santa Fe. + dc.b 23,1,0,1 ; neck - open + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,8 ; hair: any not greying. +; no sideburns + dc.b 27,1,0,4 ; trousers: any + dc.b 28,2,0,1 ; belt/gunbelt + dc.b 25,1,0,1 ; shirt + dc.b 49,1,0,1 ; cape + dc.b 38,1,0,1 ; hands + dc.b 42,1,2,1 ; hat: brown felt + dc.b 0,0,0,0 + + + +; + dc.b 0,0,0,0 + + +; people type is only currently used to give people +; a name of the right sex. + +YAM equ 0 ; young american male +OAM equ 1 ; old american male +YAF equ 2 ; young american female +OAF equ 3 ; old american female + +YMM equ 4 ; young Mexican male +OMM equ 5 ; old Mexican male +YMF equ 6 ; young Mexican female +OMF equ 7 ; old Mexican female + +YIM equ 8 ; young Indian male +OIM equ 9 ; old Indian male +YIF equ 10 ; young Indian female +OIF equ 11 ; old Indian female + +TownPeopleData +; 8 bytes per person: initial data for all people. +; Because people who have small versions need to go +; into Hires() at run-time: it is important to fit +; all these people into the first 50-or-so objects. +; Otherwise the amount of memory required for ObjectTable() is going +; to increase. + +ML equ 200 +; Room number is either: +; - room number in walkabout section - e.g. 30..50 for Santa Fe +; - or for map locations: ML+"LOCATION". These are mutually exclusive + + +PB equ 620 * base for people's xzh objects +DefaultMenu equ 0 * menu number divided by 2 +Default2ndMenu equ 0 * menu number divided by 2: this is +* the menu it goes to if we get back to the default menu +NoPerson equ 254 ; room number for a person which doesn't exist + +; Names - at message 1000+number specified +WhiskeyPete equ 160 +JoeDunn equ 161 +NedParkin equ 162 +KarlBekkert equ 163 +JackShoe equ 164 +BenDavis equ 165 +WarrenOaks equ 166 +WayneRodgers equ 167 +AshUpton equ 168 +ChiefHow equ 169 +RickSands equ 170 +RickRider equ 171 + +LauraPicket equ 210 +WilmaKatz equ 211 +MissRosy equ 212 +LaviniaStrumpet equ 213 ;**** not present. +MrsMcSween equ 214 +girlfriend equ 215 + +NoName equ 0 + +; person 0 (not used...) + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations / 2 + dc.b 1 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 1 430 Santa Fe: Jerkin guy leaning S. + dc.b 30 ; room number in which person appears =255 for end of this table. + dc.b 620-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations / 2 + dc.b 1 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 2 431 Santa Fe: Waistcoat guy sitting S + dc.b 31 ; room number in which person appears =255 for end of this table. + dc.b 621-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneNeedsHelpMenu/2 ; Current menu to use in conversations + dc.b 2 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 3 433 Santa Fe: Old guy Waistcoat, sitting S. + dc.b 33 ; room number in which person appears =255 for end of this table. + dc.b 622-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 3 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 4 434 Santa Fe Guy Leaning S, flipping coin. + dc.b 34 ; room number in which person appears =255 for end of this table. + dc.b 623-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneNeedsHelpMenu/2 ; Current menu to use in conversations + dc.b 6 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 5 - 435 Santa Fe: Mexican sitting S + dc.b 35 ; room number in which person appears =255 for end of this table. + dc.b 628-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 10 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 6 436 Santa Fe: Clint, leaning E + dc.b 36 ; room number in which person appears =255 for end of this table. + dc.b 623-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 21 ; identikit type prototype to use - caped! + dc.b Default2ndMenu,NoName,0,YAM + +; person 7 437 Santa Fe: Guy sitting E. + dc.b 37 ; room number in which person appears =255 for end of this table. + dc.b 622-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 8: 432 Santa Fe: lady green skirt + dc.b 32 ; room number in which person appears =255 for end of this table. + dc.b 640-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneNeedsHelpMenu/2 ; Current menu to use in conversations + dc.b 14 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAF + +; person 9: 450 El Paso: Lady standing S. + dc.b 50 ; room number in which person appears =255 for end of this table. + dc.b 638-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneNeedsHelpMenu/2 ; Current menu to use in conversations + dc.b 8 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,OAF + +; person 10: 451 El Paso: Rocker + dc.b 51 ; room number in which person appears =255 for end of this table. + dc.b 635-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 4 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,OAM + +; person 11: 453 El Paso: Mexican Sitting S + dc.b 53 ; room number in which person appears =255 for end of this table. + dc.b 628-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 10 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 12: 455 El Paso: Mexican Sitting S + dc.b 55 ; room number in which person appears =255 for end of this table. + dc.b 628-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 10 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 13: 470 Roswell: Guy sitting E + dc.b 70 ; room number in which person appears =255 for end of this table. + dc.b 632-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 14: 472 Roswell: Lady green Skirt. + dc.b 72 ; room number in which person appears =255 for end of this table. + dc.b 640-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneNeedsHelpMenu/2 ; Current menu to use in conversations + dc.b 14 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAF + +; person 15: 473 Roswell: Lady standing S. + dc.b 73 ; room number in which person appears =255 for end of this table. + dc.b 638-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneNeedsHelpMenu/2 ; Current menu to use in conversations + dc.b 8 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,OAF + +; person 16: 501 Lincoln City: Lady standing S. + dc.b 101 ; room number in which person appears =255 for end of this table. + dc.b 638-PB ; xzh number used to represent person (0 if none, or any +; xzh + dc.b SomeoneNeedsHelpMenu/2 ; Current menu to use in conversations + dc.b 8 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,OAF + +; person 17: 502 Lincoln City: Rocker + dc.b 102 ; room number in which person appears =255 for end of this table. + dc.b 15 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 4 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,OAM + +; person 18: 504 Lincoln City: Lady Blue Skirt + dc.b 104 ; room number in which person appears =255 for end of this table. + dc.b 641-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b WidowWomanMenu/2 ; Current menu to use in conversations + dc.b 15 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAF + +; person 19: 504 Lincoln City: rocker + dc.b 104 ; room number in which person appears =255 for end of this table. + dc.b 636-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 4 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,OAM + +; person 20: 522 Mesilla: Lady Green Skirt + dc.b 122 ; room number in which person appears =255 for end of this table. + dc.b 640-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b WidowWomanMenu/2 ; Current menu to use in conversations + dc.b 14 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAF + +; person 21: 523 Mesilla: Guy leaning S, flipping a coin. + dc.b 4 ; room number in which person appears =255 for end of this table. + dc.b 624-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 6 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 22: 540 White Oaks: Rocker + dc.b 140 ; room number in which person appears =255 for end of this table. + dc.b 635-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 3 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,OAM + +; person 23: Undertaker Santa Fe + dc.b 1 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 11 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 24: Undertaker El Paso + dc.b 2 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 11 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 25: Undertaker Roswell + dc.b 3 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 26: Wire office man Santa Fe + dc.b 5 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 27: Wire Office man El Paso + dc.b 6 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 28: News office man Santa Fe + dc.b 8 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 29: News office man El Paso + dc.b 9 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 30: News office man White oaks + dc.b 10 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 31: bank Santa Fe + dc.b 12 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 26/2 ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 32: bank El Paso + dc.b 13 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 33: bank Roswll + dc.b 14 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 26/2 ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 34: bank Lincoln City + dc.b 15 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 26/2 ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 35: bank Mesilla + dc.b 16 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 26/2 ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 36: bank White Oaks + dc.b 17 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 26/2 ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 37: Livery person Santa Fe + dc.b 19 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 4 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 38: Livery person El Paso + dc.b 20 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 4 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 39: Livery person Licoln City + dc.b 21 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 4 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 40: Livery person White Oaks + dc.b 22 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 4 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 41: Doctors El Paso + dc.b 24 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 11 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 42: Doctors Mesilla + dc.b 25 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 11 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 43: Store man El Paso + dc.b 60 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 44: Murphy Dolan Man in Lincoln + dc.b 62 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 156/2 ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 45: Store Man Roswell - Ash Upton + dc.b 61 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b AshUptonMenu/2 ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,AshUpton,0,YAM + +; person 46: Store man White Oaks + dc.b 63 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 47: unused + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 48: Laura Picket at Hotel in El Paso + dc.b 66 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b LauraPicketMenu/2 ; Current menu to use in conversations + dc.b 9 ; identikit type prototype to use + dc.b Default2ndMenu,LauraPicket,0,YAM + +; person 49: girl in house/Lincoln City + dc.b 69 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b GirlFriendMenu/2 ; Current menu to use in conversations + dc.b 9 ; identikit type prototype to use + dc.b Default2ndMenu,Girlfriend,0,YAF + +; person 50: hostess in Santa Fe Saloon (560) + dc.b 160 ; room number in which person appears =255 for end of this table. + dc.b 639-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 14/2 ; Current menu to use in conversations + dc.b 7 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAF + + +; person 51: Store man Santa Fe + dc.b 64 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + + +; person 52: barman in Santa Fe. + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 12/2 ; Current menu to use in conversations + dc.b 16 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + + + + + +; people to meet at random in desert have room numbers 190..197 + + + + +; people that either Pat or Billy can meet... +; person 53: person to meet at random in desert by Anglo farmers. +; peasant being run off land + dc.b 190 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 50/2 ; Current menu to use in conversations + dc.b 19 ; identikit type prototype to use (Mexican peasant) + dc.b Default2ndMenu,NoName,0,YAM + +; person 54: person to meet at random in desert. +; mexican being picked on. + dc.b 191 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 58/2 ; Current menu to use in conversations + dc.b 19 ; identikit type prototype to use (peasant) + dc.b Default2ndMenu,NoName,0,YAM + +; person 55: person to meet at random in desert. +; sick man + dc.b 192 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 58/2 ; Current menu to use in conversations + dc.b 19 ; identikit type prototype to use (Mexican) + dc.b Default2ndMenu,NoName,0,YAM + +; person 56: person to meet at random in desert. + dc.b 193 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 62/2 ; Current menu to use in conversations + dc.b 18 ; identikit type prototype to use (sick man) + dc.b Default2ndMenu,NoName,0,YAM + + + + + +; people that only Billy can meet... +; person 57: person to meet at random in desert. +; peasant wants help nursing his family + dc.b 194 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 104/2 ; Current menu to use in conversations + dc.b 19 ; identikit type prototype to use (peasant with sick family) + dc.b Default2ndMenu,NoName,0,YAM + + + +; person 58: person to meet at random in desert. +++UNUSED+++ + dc.b NoPerson ; 195 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; people that only Pat can meet... +; person 59: person to meet at random in desert. +; Texan possee + dc.b 196 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 76/2 ; Current menu to use in conversations + dc.b 6 ; identikit type prototype to use (Possee representative) + dc.b Default2ndMenu,NoName,0,YAM + +; person 60: person to meet at random in desert. +; Barney Mason + dc.b 197 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 80/2 ; Current menu to use in conversations + dc.b 5 ; identikit type prototype to use (Barney Mason) + dc.b Default2ndMenu,NoName,0,YAM + +; person 61: person to meet at random in desert. +++UNUSED+++ + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 62: person to meet at random in desert. +++UNUSED+++ + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 63: woman being bothered by a gunslinger in saloon. El Paso 2 + dc.b 168 ; room number in which person appears =255 for end of this table. + dc.b 637-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 54/2 ; Current menu to use in conversations + dc.b 9 ; identikit type prototype to use (young Woman Green Skirt) + dc.b Default2ndMenu,NoName,0,YAF + +; person 64 560 Santa Fe (Saloon): guy drinking at bar. Shirt/brown trousers +; Ned Parkin + dc.b 160 ; room number in which person appears =255 for end of this table. + dc.b 630-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b NedParkinMenu/2 ; Current menu to use in conversations / 2 + dc.b 1 ; identikit type prototype to use + dc.b Default2ndMenu,NedParkin,0,YAM + +; person 65 560 Santa Fe (Saloon): guy at table. Grey jack/jeans + dc.b 160 ; room number in which person appears =255 for end of this table. + dc.b 629-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b BenDavisMenu/2 ; Current menu to use in conversations / 2 + dc.b 17 ; identikit type prototype to use + dc.b Default2ndMenu,BenDavis,0,YAM + +; person 66 562 Santa Fe (Saloon): guy at table. Grey jack/brown trousers + dc.b 160 ; room number in which person appears =255 for end of this table. + dc.b 627-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b CardGameMenu/2 ; Current menu to use in conversations / 2 + dc.b 17 ; identikit type prototype to use + dc.b Default2ndMenu,KarlBekkert,0,YAM + +; person 67 soldier at Fort Stanton + dc.b ML+19 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 132/2 ; Current menu to use in conversations: get lost + dc.b 20 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 68 soldier at Fort Sumner + dc.b ML+20 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 66/2 ; Current menu to use in conversations: army being cheated + dc.b 20 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 69 - at Bitter lake ranch + dc.b ML+24 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 132/2 ; Current menu to use in conversations: get lost + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 70 - at Fritz Ranch + dc.b ML+25 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 132/2 ; Current menu to use in conversations: get lost + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 71 - at Chisum Ranch + dc.b ML+26 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 132/2 ; Current menu to use in conversations: get lost + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 72 - Dedrick Ranch + dc.b ML+27 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations - Indians not getting beef + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 73 - at Beckwith Ranch + dc.b ML+28 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 132/2 ; Current menu to use in conversations: get lost + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 74 - Mrs McSween - at Tunstall Ranch + dc.b ML+29 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 134/2 ; Current menu to use in conversations - Indians not getting beef + dc.b 15 ; identikit type prototype to use + dc.b Default2ndMenu,MrsMcSween,0,OAF + + +; person 75 - at Reed Ranch + dc.b ML+30 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 132/2 ; Current menu to use in conversations: get lost + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + + +; person 76 - Indian chief at Mescalero + dc.b ML+35 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 92/2 ; Current menu to use in conversations - Indians not getting beef + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,ChiefHow,0,OIM + + +; person 77 - prospector + dc.b ML+48 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b ProspectorMenu/2 ; Current menu to use in conversations - prospector + dc.b 0 ; identikit type prototype to use + dc.b 136/2,WhiskeyPete,0,YAM + +; person 78 - Joe Grant. +; appears in saloon in Santa Fe (triggered by WALKABOUT.TXT) + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 128/2 ; Current menu to use in conversations - Indians not getting beef + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; A few special objects which you can select in town - e.g. +; the wanted posters. +; person - 79 - wanted poster. Not Very talkative! + dc.b 0 ; room number in which person appears =255 for end of this table. + dc.b 642-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations - Indians not getting beef + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,0 + +; person - 80 - object + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations - Indians not getting beef + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,0 + +; person - 81 - object + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations - Indians not getting beef + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,0 + +; person - 82 - object + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations - Indians not getting beef + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,0 + +; person - 83 - object + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations - Indians not getting beef + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,0 + +; person 84 - gambler + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 1 ; object number used to represent person (should be 2658) + dc.b CardGameMenu/2 ; Current menu to use in conversations + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,0,0,OAF + + + +; person 85 - Jose Miguel thingy +; interrupts player looking at map + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; default menu to use in conversations + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 86 - guy at bar in Santa Fe 2 (LHS): +; grey jacket, blue jeans, brown hat, blue neckerchief + dc.b 170 ; room number in which person appears =255 for end of this table. + dc.b 631-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SpillDrinkMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 87 - guy at bar in Santa Fe 2 (LHS): +; Grey jacket, brown waistcoat, grey jacket. Cigarette in mouth +;' grey hat + dc.b 170 ; room number in which person appears =255 for end of this table. + dc.b 633-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; default menu to use in conversations + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + + +; person 88 - guy at bar in El Paso 1 (LHS): +; Grey jacket, blue jeans, blue neckerchief, brown hat + dc.b 166 ; room number in which person appears =255 for end of this table. + dc.b 631-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b JackShoeMenu/2 ; default menu to use in conversations + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,JackShoe,0,YAM + + +; person 89 - guy at bar in El Paso 1 (LHS): +; Grey jacket, brown waistcoat, grey jacket. Cigarette in mouth +;' grey hat + dc.b 166 ; room number in which person appears =255 for end of this table. + dc.b 633-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b CardGameMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + + +; person 90 566 El Paso (Saloon): guy at table. Grey jack/blue trousers + dc.b 166 ; room number in which person appears =255 for end of this table. + dc.b 629-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SpillDrinkMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 91 568 El Paso (Saloon 2): guy at table. Grey jack/brown trousers + dc.b 168 ; room number in which person appears =255 for end of this table. + dc.b 627-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,RickSands,0,YAM + + +; person 92 574 Roswell (Saloon): guy at bar. Brown jacket, grey +; trousers, white neckerchief, brown hat. + dc.b 174 ; room number in which person appears =255 for end of this table. + dc.b 630-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b BenDavisMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 93 574 Roswell (Saloon): guy at table +; trousers, white neckerchief, brown hat. + dc.b 174 ; room number in which person appears =255 for end of this table. + dc.b 627-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b CardGameMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 94 573 Roswell (Saloon): guy at table +; tbrown trousers, grey jacket, blue neckerchief, brown hat + dc.b 173 ; room number in which person appears =255 for end of this table. + dc.b 627-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b RickRiderMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,RickRider,0,YAM + +; person 95 573 Roswell (Saloon): guy at table +; grey trousers, grey jacket, brown waistcoat, grey hat + dc.b 173 ; room number in which person appears =255 for end of this table. + dc.b 633-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 95 565 Lincoln city (Saloon): guy at table +; blue trousers, grey jacket, grey hat + dc.b 165 ; room number in which person appears =255 for end of this table. + dc.b 629-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b CardGameMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 96 565 Lincoln city (Saloon): guy at table +; grey trousers, grey jacket, brown waistcoat, grey hat + dc.b 165 ; room number in which person appears =255 for end of this table. + dc.b 633-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 97 565 Lincoln city (Saloon): guy at bar +; grey trousers, brown jacket, brown hat + dc.b 165 ; room number in which person appears =255 for end of this table. + dc.b 630-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SpillDrinkMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + + +; person 98 569 Mesilla (Saloon): guy at table +; blue trousers, grey jacket, grey hat + dc.b 169 ; room number in which person appears =255 for end of this table. + dc.b 629-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b CardGameMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,WarrenOaks,0,YAM + + +; person 99 572 White Oaks (Saloon): guy at table +; grey trousers, brown jacket, brown hat +; Slightly Mexican appearance, with big black moustache + dc.b 172 ; room number in which person appears =255 for end of this table. + dc.b 634-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,WayneRodgers,0,YAM + + +; person 100 Tom O'Foliard +; grey trousers, grey jacket, brown waistcoat, grey hat + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + + + +; person 101 - Wilma Katz - at Katz farmhouse (31) + dc.b ML+31 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b WilmaKatzMenu/2 ; Current menu to use in conversations + dc.b 15 ; identikit type prototype to use + dc.b Default2ndMenu,WilmaKatz,0,OAF + +; person 102 - at Dunn Farmhouse (32) + dc.b ML+32 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b LonelyFarmhouseMenu/2 ; Current menu to use in conversations + dc.b 15 ; identikit type prototype to use + dc.b Default2ndMenu,MrsMcSween,0,OAF + +; person 103 - at Rose Farmhosue (33) + dc.b ML+33 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b LonelyFarmhouseMenu/2 ; Current menu to use in conversations + dc.b 15 ; identikit type prototype to use + dc.b Default2ndMenu,MissRosy,0,OAF + + + dc.b 255 ; end of table. + + + +TownData +; 16 bytes per town +; town 10: Santa Fe + dc.w 10 ; increase in gold per time unit. + dc.w 200 ; maximum level of gold in the bank. + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + +; town 11: White Oaks + dc.w 3 ; increase in gold per time unit. + dc.w 50 ; maximum level of gold in the bank. + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + +; town 12: Lincoln City + dc.w 3 ; increase in gold per time unit. + dc.w 50 ; maximum level of gold in the bank. + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + +; town 13: Mesilla + dc.w 3 ; increase in gold per time unit. + dc.w 50 ; maximum level of gold in the bank. + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + +; town 14: Roswll + dc.w 3 ; increase in gold per time unit. + dc.w 50 ; maximum level of gold in the bank. + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + +; town 15: El Paso + dc.w 8 ; increase in gold per time unit. + dc.w 150 ; maximum level of gold in the bank. + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + + +SubPlotData +; There is a table containing all the bits of information +; people may want to know about: in TownVarData. +; This is initialised from a table of identical format +; in TownFixedData (except that offsets are relative to the +; start of this little table, wheras in TownVarData they +; are relative to TownVarData). The copy routine makes the +; appropriate conversion. +; +; 10 pointers at start... + dc.w EndSubPlotData-SubPlotData + dc.w SPMoney-SubPlotData ; .w Offset of "Money Location" information. + dc.w SPDeputies-SubPlotData ; .w Offset of "Deputies Location" information. + dc.w SPGangs-SubPlotData ; .w Offset of "Gang Location" information + dc.w SPRobbery-SubPlotData ; .w Offset of "Recent robbery" information + dc.w SPSubPlots-SubPlotData ; .w Offset of sub-plot table. + dc.w SPHidden-SubPlotData ; .w Offset of "Hidden things" table for map + dc.w CommsInfo-SubPlotData ; .w offset of "things the other computer wants +; to know about. + dc.w 0 + dc.w 0 + dc.w 0 + +CommsInfo + dc.b 0 * not used + dc.b 0 * LOCATION of pat + dc.b 0 * LOCATION of Billy + + even + +SPHidden +; table for map containing one byte for every object on map. +; If zero, it will be displayed (unless overridden elsewhere) +; If one, it will be hidden. This is used for making e.g. +; farmhouses disappear after we've used their subplots + dc.b 0,0,0,0,0,0,0,0 ; 0..7 + dc.b 0,0,0,0,0,0,0,0 ; 8..15 + dc.b 0,0,0,0,0,0,0,0 ; 16..23 + dc.b 0,0,0,0,0,0,0,0 ; 24..31 + dc.b 0,0,0,0,0,0,0,0 ; 32..39 + dc.b 0,0,0,0,0,0,0,0 ; 40..47 + dc.b 0,0,0,0,0,0,0,0 ; 48..55 + + +; First word in every entry is 0 if nothing to know. +; 255. if hidden (doesn't appear on map) but can be told to player, +; 254. if hidden (doesn't appear on map) and cannot be told to player. +; non-zero if there is some piece +; of information that may be required. +; Second word is a numerical parameter for several of the +; items. These are coded specially. +; Third and fourth words unused presently. +; fourth to seventh words are four message numbers to print, +; in order. If =FFFF print the numeric parameter. +; If <10, print the appropriate paramter, numbered from +; 2 in steps of 2. - it will be a location name, to choose the message +; from 1000... + +SPMoney + dc.w 1,1000,0,0,966,1010,0,0 ; .w,.w Gold in Bank at town 0 + dc.w 1,400,0,0,966,1011,0,0 ; .w,.w Gold in Bank at town 1 + dc.w 1,400,0,0,966,1012,0,0 ; .w,.w Gold in Bank at town 2 + dc.w 1,400,0,0,966,1013,0,0 ; .w,.w Gold in Bank at town 3 + dc.w 1,400,0,0,966,1014,0,0 ; .w,.w Gold in Bank at town 4 + dc.w 1,400,0,0,966,1015,0,0 ; .w,.w Gold in Bank at town 5 + dc.w -1,-1 + +SPDeputies + dc.w 1,2,0,0,972,$ffff,973,1010 ; .w,.w Number of deputies in town 0 + dc.w 1,0,0,0,972,$ffff,973,1011 ; .w,.w Number of deputies in town 1 + dc.w 1,0,0,0,972,$ffff,973,1012 ; .w,.w Number of deputies in town 2 + dc.w 1,0,0,0,972,$ffff,973,1013 ; .w,.w Number of deputies in town 3 + dc.w 1,0,0,0,972,$ffff,973,1014 ; .w,.w Number of deputies in town 4 + dc.w 1,0,0,0,972,$ffff,973,1015 ; .w,.w Number of deputies in town 5 + dc.w -1,-1 + +SPGangs + dc.w 1,0,0,0,962,1041,965,1010 ; .w,.w Gang location 0 + dc.w 255,1,0,0,962,1042,965,1011 ; .w,.w Gang location 1 + dc.w 255,2,0,0,962,1043,965,1012 ; .w,.w Gang location 2 + dc.w 255,3,0,0,962,1044,965,1013 ; .w,.w Gang location 3 + dc.w 255,4,0,0,962,1045,965,1014 ; .w,.w Gang location 4 + dc.w 255,5,0,0,962,1046,965,1015 ; .w,.w Gang location 5 + dc.w -1,-1 + +SPRobbery + dc.w 41,10,0,0,962,2,963,4 ; default - cooper gang/Santa Fe. + dc.w -1,-1 + +SPSubPlots +; .w,.w Sub-plot? + dc.w 0,0,0,0,0,0,0,0 + dc.w -1,-1 + + +EndSubPlotData + +;----------------- + +ENDTABLE +;--------- + END + diff --git a/l9dev/regress/games.l9/billy.l9/standard.txt b/l9dev/regress/games.l9/billy.l9/standard.txt new file mode 100644 index 0000000..e57ad6e --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/standard.txt @@ -0,0 +1,403 @@ +; STANDARD.TXT +; +; Some useful routines for animated games - mostly input handling +; +; Mike Austin. 3rd May 1990 +; +; There is a sample mouse-based cursor movement routine at +; the end of this file. +; +const + SmallMouse=3 ; minimum mouse movement emulated as a joystick response + NegSmallMouse=65533 ; minimum mouse movement emulated as a joystick response + +var +; FireKey +;; FireKeyChange LastFireKey + +begin +;------------------- +.vsGetControls + gosub @GetControls + HourglassState=0 ; kill hourglass + LeftKey=x4 + RightKey=x2 + UpKey=x1 + DownKey=x3 + XSpeed=x5 + YSpeed=x6 + if x7=0 then NoWantedDir + WantedDirection=x7 + +.NoWantedDir +; v1=77 ; cursor right ;*** +; gosub @MCKeyDown ;***8 +; if v1=0 then NoBug5 +; if RightKey<>0 then NoBug5 ;**** +; break ;******* +; +;.NoBug5 + + + +; PlayerSX=x5*2,PlayerSY=x6*2 +; and for directions, returns: +; x1 +; x4 x2 +; x3 +; Non-zero means trying to move in that direction +; and x5=x offset (single pixel movement), signed +; x6=y offset (single pixel movement), signed +; x7=direction number in standard adventure format + gosub @KeyScan ; check for key 'press' from keyboard buffer, +; returns in v1/v2 in same format as MCOsrdch: +; i.e. v1 is ascii code, v2 is scan code. + gosub @KeyScan ; check for key 'press' from keyboard buffer, +; returns in v1/v2 in same format as MCOsrdch: +; i.e. v1 is ascii code, v2 is scan code. + gosub @KeyScan ; check for key 'press' from keyboard buffer, +; returns in v1/v2 in same format as MCOsrdch: +; i.e. v1 is ascii code, v2 is scan code. + return +;---------- + + +;----------------- +.CheckFireKey +; may be called from VBL - so save everything carefully! +; FireKeyChange is reset when GetControls is called, +; or may be reset elsewhere in the user program, if required. + push v1 + push v2 + push x1 + FireKey=0 + v1=107 ; check for fire (5) + gosub @MCKeyDown + x1=v1 + v1=57 ; check for fire (space) + gosub @MCKeyDown + add x1,v1 + v1=76 ; check for fire on some PC keyboards + gosub @MCKeyDown + add x1,v1 + + v1=ByteWS(ByteJoystickStatus) + v2=JoyF ; " " " Joystick/Mouse buttons (fire is bit6) + and v1,v2 + add x1,v1 + + FireKey=x1 + gosub GDFireKey + LastFireKey=FireKey + pop x1 + pop v2 + pop v1 + return +;------------ +.GDFireKey + if FireKey<2 then GDGotFireKey +.RegisterFireKey + FireKey=1 +.GDGotFireKey + if FireKey=LastFireKey then GDNoFireChange + FireKeyChange=1 + +.GDNoFireChange + return +;---------- +.KeyScan + gosub @MCOsrdch + if v1=3 then @Escape ; control-C + if PlayersName=0 then KS1 + if v1=27 then @ReturnToMap ; escape - abandons current game +.KS1 +; cif TownOverlay +; if v1=68 then @ToCardGame +; if v1=69 then @SubPlotShootout ;******* +; cend +; if v1=65 then Cheat ;************ +; if v1=66 then FirstTune ; ********* +; if v1=67 then NextTune ; ********* + if v2=25 then @KSPauseLoop ; 'p' or 'P' + if v1=80 then @KSPauseLoop ; 'P' + + if v2=31 then ToggleSound ;'s' or 'S' + if v1=83 then ToggleSound ; 'S' + if v1=115 then ToggleSound ; 'S' + + if v2=50 then ToggleMusic ; 'm' or 'M' + if v1=77 then ToggleMusic ; 'M' + if v1=109 then ToggleMusic ; 'M' + + if v1=13 then @RegisterFireKey ; CR + if v1=32 then @RegisterFireKey + if v1=53 then @RegisterFireKey + return +;--------------- +.ToggleSound + x1=1 + if SoundOn=0 then TogS2 + x1=0 + +.TogS2 + SoundOn=x1 + return +;------------- +.ToggleMusic + LastTunePlayed=0 ; ensure that next 'toggle on' re-starts the tune + x1=1 + if MusicOn=0 then TogM2 + x1=0 + v1=0 ; score 0 for everything at the moment. +; v2 not needed + v3=2 ; stop + gosub @MCPlayScore + +.TogM2 + MusicOn=x1 + return +;---------- +.FirstTune + NextMusic=100 + return +;----- +.NextTune + add NextMusic,c2 + return +;------ +.Cheat + x1=100 + add PlayerIncome,x1 + add TicksSinceLawful,c16 ; make another town lawful as well + cif TownOverlay + gosub @PatIntelligence ; necessary for cheat to work in two player mode + cend + goto @ReturnToMap +;------------- +.KSPauseLoop +; wait for user to press a key, or joystick fire button. + gosub @GetControls + if FireKey<>0 then KSPL2 + gosub @MCOsrdch + if v2=0 then KSPauseLoop +.KSPL2 + return +;-------- +.GetControls +; look at kbd/joystick/mouse and return +; dir as new movement direction in standard adventure format +; and FireKey=0 if not pressed, 1 if pressed. +; and FireKeyChange=1 if pressed/released this turn + +; and for directions, returns: +; x1 +; x4 x2 +; x3 +; Non-zero means trying to move in that direction +; and x5=x offset (single pixel movement), signed +; x6=y offset (single pixel movement), signed +; x7=direction number in standard adventure format +; i.e. 1 +; 8 2 +; 7 3 +; 6 4 +; 5 + FireKeyChange=0 + gosub @CheckFireKey + &v5=WordWS(WordMouseXDistance) + &v6=WordWS(WordMouseYDistance) + + code - + gosub @GDDirections + x5=0 ; sx + x6=0 ; sh + x7=0 ; direction + if x1=0 then GDNoUp + x1=1 + add x6,c1 ; sh+=1 + x7=1 ; north(1) +.GDNoUp + if x2=0 then GDNoRight + x2=1 + add x5,c1 ; sx+=1 + if x7=0 then GDNotNE + x7=2 ; NE + goto GDNoRight + +.GDNotNE + x7=3 ; E + +.GDNoRight + if x3=0 then GDNoDown + x3=1 ; -1 + sub x6,c1 ; sh-=1 + if x7=0 then GDNotSE + x7=4 ; SE + goto GDNoDown + +.GDNotSE + x7=5 ; S=5 + +.GDNoDown + if x4=0 then GDNoLeft + x4=65535 ; -1 + sub x5,c1 ; sx-=1 + if x7=0 then GDNoSW + x7=6 ; SW + goto GDNoLeft +.GDNoSW + x7=7 ; W + +.GDNoLeft + if x6<>1 then GDNoNW ; up? + if x5<>65535 then GDNoNW ; left? + x7=8 ; NW + +.GDNoNW + + + code + +; returns: +; x1 +; x4 x2 +; x3 +; Non-zero means trying to move in that direction +; and x5=x offset (single pixel movement), signed +; x6=y offset (single pixel movement), signed + return +;----------- + code - +.GDKeyDown +; INT MODE + code + + gosub @MCKeyDown + code - + return +;------ +.GDDirections +; INT MODE. Entry: &v5=WordWS(MouseX), &v6=WordWS(MouseY) +; produce x1=up key state, x2=right key state, x3=down key state +; x4=left key state. +; 0=not-pressed, non-zero means pressed + +; up? + v1=104 ; keypad 8 + gosub GDKeyDown + x1=v1 ; if v1<>0, key is pressed + v1=72 ; cursor up (PC) + gosub GDKeyDown + add x1,v1 ; if v1<>0, key is pressed + if v6<32767 then gddMouseY1 ; positive mouse? + if v6>NegSmallMouse then gddMouseY1 + x1=1 +.gddMouseY1 + + +; right? + v1=77 ; cursor right + gosub GDKeyDown + x2=v1 ; if v1<>0, key is pressed + v1=108 ; keypad 6 + gosub GDKeyDown + add x2,v1 ; if v1<>0, key is pressed + if v5>32767 then gddMouseX1 + if v50, key is pressed + v1=80 ; cursor down + gosub GDKeyDown + add x3,v1 ; if v1<>0, key is pressed + if v6>32767 then gddMouseY2 + if v60, key is pressed + v1=75 ; cursor left + gosub GDKeyDown + add x4,v1 ; if v1<>0, key is pressed + if v5<32767 then gddMouseX2 + if v5>NegSmallMouse then gddMouseX2 + x4=1 +.gddMouseX2 + +; now tests for diagonal keys + + v1=73 ; keypad 9 + gosub @GDKeyDown + add x1,v1 ; up state + add x2,v1 ; right state + v1=105 ; keypad 9 + gosub @GDKeyDown + add x1,v1 ; up state + add x2,v1 ; right state + + v1=81 ; keypad 3 + gosub @GDKeyDown + add x2,v1 ; right state + add x3,v1 ; down state + v1=111 ; keypad 3 + gosub @GDKeyDown + add x2,v1 ; right state + add x3,v1 ; down state + + v1=79 ; keypad 1 + gosub @GDKeyDown + add x3,v1 ; down state + add x4,v1 ; left state + v1=109 ; keypad 1 + gosub @GDKeyDown + add x3,v1 ; down state + add x4,v1 ; left state + + v1=71 ; keypad 7 + gosub @GDKeyDown + add x4,v1 ; left state + add x1,v1 ; up state + v1=103 ; keypad 7 + gosub @GDKeyDown + add x4,v1 ; left state + add x1,v1 ; up state + + + code + + v3=ByteWS(ByteJoystickStatus) + v4=JoyU + and v4,v3 + add x1,v4 + v4=JoyR + and v4,v3 + add x2,v4 + v4=JoyD + and v4,v3 + add x3,v4 + v4=JoyL + and v4,v3 + add x4,v4 + code - + + return +;------- +; &X1=WordWS(WordMouseXDistance) ; signed distance mouse has moved l/r +; &X2=WordWS(WordMouseYDistance) ; signed distance mouse has moved u/d +; &WordWS(WordMouseXDistance)=c0 +; &WordWS(WordMouseYDistance)=c0 +; add CursorX,X1 +; sub CursorH,X2 +; or x1,x2 ; did mouse move in either direction? +; if x1>0 then @mgcRepositionCursor +;; +; +; +; JoyL=4 ; " " " " Left +; JoyR=8 ; " " " " Right +; JoyF=192 ; " " " Joystick/Mouse buttons (fire is bit6) +; diff --git a/l9dev/regress/games.l9/billy.l9/status.dat b/l9dev/regress/games.l9/billy.l9/status.dat new file mode 100644 index 0000000000000000000000000000000000000000..9f25aa7b89750402dd0cd13cada32e9e95b40945 GIT binary patch literal 2560 zcmdT_ZD?Cn7=F%8YGa*E)&|-Ybirn!g)~HOtVO2H^fujexWb|itTI{F4c#z)(m&d& zMfRh(Fbm2UQbsoh9pbOrAEQZK5kc6>ia4-83d)!=RCHsVrM*7yxi=x*QgMPmJco1c z`@HXS-jDN<*fS`#nv!%|!n3G{51zTVjOW~S3I;sz-iDWIa+S-MmE~*yWm*XRbkd)h zJK%bKk>3D^2de(i-CG;7{ynZmJ^^h5-i6KnPRB5k*g?IUhf1OVqkdiD5+oai?_`m2 zMsoINv_=%gX0ZOG22xW}@i{~(i4LB*5X6j0<;7D_?ARr5>G^()foz1vSI7J(raT351087^&mU! z-<-~k8g5Kb8)8SZMG0t;so}amoJCWV^qKTZ= z*_3HC??0c6T|=|1yT5Xv#5|CgH_zL)dBOaiRm__Yaqb|y>BbNy)N8UXG0pL1IVM}ksHlC$QmXqRhiZOjcs?I z6V_6IEIIiKd12PQ*G)?!WHqh9N;2Yc+L}}|7LnDgX8H@S&OS23vn2}|WbNyk)lOEs z*~%KD=7X%UJ@SKXM=sG8RFBh_zBh@DFz8F$&23~oA)JWR7}UO2w6Cc6N^ItwbXbwE zBC=<~THt*Rh#2p*?f7Hyt(0Df9tEPGidHva75)LMUxgi3Y_Dy{_Q!b3V|tg1j`$5K ztHe4;RyMYstlis~gABI?(V^mwuQu*MTeOXaw(!j?L4!BI~@{)UQD5YU*25r+zNk9U+Judt5;3EXS-x+0wqtm_hVl zRA=AV{WfpYptX$Zt}=oagN&9#h;pa(q-|SISr!cImi@wqrR;f=x+YUO#vLg+JI_}q z+4s;}K(ubeMRFaIFt+oQE7w@d8owsP!ZCDu-Xp74*BFw;sWUKGBVV00$p}S;n84fI z;|Q3zG32~o{x`NwlNHHAND$cXn`o>qCz?1E$pZ5e#fT5 z$|5pd6h{Y9YY{0Q(Ic*x6Fia4o<{|F>$vMZ2zWLL(zz@kX&e^BmSw!Pkldrtx?-NA z^dCUg%Q;lNncJD(l74z;%-WJhnqG2@5i(xY9{)#E?eF?-hges|Hq`)3-CNP5mHrw; zSB|Z<8pwYzVCN6zbJ&nSGIbbg>d0ze{*8$8%tB~ftuLa&l>xi(OW_Zw>EQG|!1StI g?tEXzAOD;9AH$zNnjgjb{PFxa^EqAgEML|87ekhEn*aa+ literal 0 HcmV?d00001 diff --git a/l9dev/regress/games.l9/billy.l9/stconst.txt b/l9dev/regress/games.l9/billy.l9/stconst.txt new file mode 100644 index 0000000..56fddcf --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/stconst.txt @@ -0,0 +1,10 @@ +; Machine constants +; MCONST.TXT +const + st=1 ; conditional assembly + ReallyST=1 + Amiga=0 + pc=0 + notPc=1 + Scrolling=1 + AllowMusic=0 diff --git a/l9dev/regress/games.l9/billy.l9/strategy.txt b/l9dev/regress/games.l9/billy.l9/strategy.txt new file mode 100644 index 0000000..3e9db0d --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/strategy.txt @@ -0,0 +1,1760 @@ +; STRATEGY.TXT for Billy The Kid +; +; Mike Austin August 1990. +; +; Copyright (C) 1990 Level 9 Computing Ltd. +; +; +const + CostDeputy=20 ; cost per month + +begin + +.ClockTick +; called every time the player goes back to the map. +; Handle the game's sense of time here... + gosub @TownIntelligence + gosub @GangIntelligence + if TwoPlayerMode<>false then CT3 + gosub @PatIntelligence +.CT2 +.CT3 + code - + if PlayersName<>Pat then CTNotPat + code + + gosub @CountLawfulTowns +; return x4 as number of lawful towns. x1..x5 corrupted, at least + if x4>5 then @ToFinalDuel ;***WinGame + code - + +; increase Pat's wealth due to the law enforcement budget + gosub @iCalcCostOfDeputies ; gets running cost in x3 +; and gets income in x5 + sub x5,x3 + add PlayerGold,x5 + if PlayerGold<32000 then CTPat2 + x1=0 + sub x1,PlayerGold + gosub @iBudgetShortfallX1 + NextMeetingMenu=178 ; Pat - we've run out of money + PlayerGold=0 + +.CTPat2 + +.CTNotPat + if PlayersName<>Billy then CTNotBilly + code + + gosub @CheckPlayerGang ; see if gang has been wiped out. + gosub @CountBustRanches +; return x4 as number of lawful towns. x1..x5 corrupted, at least + if x4>5 then @ToFinalDuel ;****WinGame + code - + +.CTNotBilly + gosub @iSubPlotTimeOuts + + code + + + return +;---------- + code - +.iSubPlotTimeOuts +; handle subplots timing out + x1=SPFTexanPosseeAvailable ; number of members (byte) + x2=SubPlotFlags + add x1,x2 + x2=TownVarData(x1) ; number of deputies working for nothing + if x2=0 then iSPT2 + sub x2,c1 + if x1>TownVarDataSize then @iStratBug ;****** + TownVarData(x1)=x2 +; every 4th possee member who leaves triggers a warning message + if PlayersName<>Pat then iSPT2 + x1=3 + code + + and x1,x2 + code - + if x1<>0 then iSPT2 + NextMeetingMenu=184 ; Pat - another of that possee left + +.iSPT2 + return + +.iStratBug + code + ;******* + break ;******** + code - ;**** + return ;********* + + code + + +;--------- +.InitStrategy +; set up strategy game tables: +; for town, people. + TellOtherPlayer=0 + RobberyTillMDGoesBust=0 ; amount of money that Billy still +; needs to steal before the next Murphy-Dolan ranch goes bust. + + PlayerIncome=0 ; amount of gold earned by player since last +; screen - used mainly for Billy robbing things, to determine +; when another Murphy Dolan ranch goes out of business. + ExtraNewsStory=0 ; message number of extra news stories... e.g. +; ranches going out of business etc. Commonly in range + +; set up town table (16 bytes per town) + v1=0 ; offset to update + v2=0 ; value to write in. + x4=0 ; town number being written + +.InitStrategyLoop + gosub @UpdateVarDataWordInc ; lawless, no time since last robbed + gosub @UpdateVarDataWordInc ; + gosub @UpdateVarDataWordInc ; + gosub @UpdateVarDataWordInc ; + gosub @UpdateVarDataWordInc ; + gosub @UpdateVarDataWordInc ; + gosub @UpdateVarDataWordInc ; + gosub @UpdateVarDataWordInc ; + add x4,c1 + if x4=128 if bad guy +; bit 0 set if cowardly, bit 1 set if greedy. +; what name shall we give this person? + gosub @ChooseName + gosub @UpdateVarDataByteInc ; 6 name + + code - + random v2 + code + + x1=7 + and v2,x1 ; 4 types of information. Top bit is set +; if person knows about latest event of appropriate type. + if v2<4 then TVDInfo2 + v2=2 ; half the people know about gang locations + +.TVDInfo2 + gosub @UpdateVarDataByteInc ; 7 Information type this person finds out about +; .w Offset of "Money Location" information. (type 0) +; .w Offset of "Deputies Location" information. (type 1) +; .w Offset of "Gang Location" information (type 2) +; .w Offset of "Recent robbery" information (type 3) + + + x1=TFDMenuoffset ; offset of menu number in TFD + add x1,x4 ; get initial menu (particularly for people with subplots) + v2=TownFixedData(x1) + add v2,v2 ; double to get menu offset + if v2<>0 then ISGotMenu + v2=28 ; meet Billy for the first time menu. + +;7 jan 91 removed to allow the appropriate bank intro to come +; through +; if PersonNumber<31 then ISNotBank +; if PersonNumber>36 then ISNotBank +; v2=26 ; bank menu +; goto ISGotMenu + +.ISNotBank + if PersonNumber<>50 then ISNotHostess + v2=14 ; hostess/call girl menu + goto ISGotMenu + +.ISNotHostess + if PersonNumber<>52 then ISNotBarman + v2=12 ; barman menu + +.ISNotBarman +.ISGotMenu +; v2=menu to use when meet Billy + gosub @UpdateVarDataWordInc ; 8 Current Menu offset for talking to Billy +; v2=menu to use when meet Pat + gosub @UpdateVarDataWordInc ; 10 Current Menu offset for talking to Pat + v2=0 + gosub @UpdateVarDataWordInc ; 12 + gosub @UpdateVarDataWordInc ; 14 + add PersonNumber,c1 + add x4,c8 ; offset in TFD + if PersonNumber0 then InitSubPlotsLoop1 + +.InitSubPlotsLoop2 + &v2=TownFixedData(v4) ; pointer, relative to v4 in TFD + add v4,c2 + gosub @UpdateVarDataWordInc ; write into TVD + if v40 then InitSubPlotsLoop3 + +; set up the flags used by the subplots +; These are referenced by arbitrary offsets defined in AACONST + v2=0 ; clear the table! + x3=200 + SubPlotFlags=v1 +.InitSubPlotsLoop4 + gosub @UpdateVarDataByteInc + sub x3,c1 + if x3>0 then InitSubPlotsLoop4 + + gosub @InitTowns + gosub @SetPeoplesKnowledge ; - randomly set about half the +; people to know something (of the type they are likely +; to know anything about). + return +;-------------- +.InitTowns +; Each town has the following variable table +; which is part of ObjectsInformation: 8 bytes each +; (i.e. 8 bytes per object, including e.g. cows, gangs) +; TVD(x1+LawfulOffset=0) .b 0 if lawless, 1 if lawful +; TVD(x1+HappinessOffset=1) .b How happy the town is: starts at 128 (moderately happy) +; to 0 (completely unhappy) and up to 255 (ecstatic) +; TVD(x1+DeputiesOffset=2) .b Number of deputies stationed + x4=SantaFe; (10) +.InitTownsLoop + gosub @GetLocationData ; is town object x4 (10..15) lawful? +; x2=TVD(x1) + v1=x1 + add v1,c1 ; on to happiness offset + v2=128 ; happiness + gosub @UpdateVarDataByteInc + v2=2 ; default number of deputies + if x4<13 then ITL2 + v2=1 ; reduced number for later towns + +.ITL2 + gosub @UpdateVarDataByte + add x4,c1 + if x4<16 then InitTownsLoop + return +;------------- +.ChooseName + code - + x1=TFDPersonTypeOffset ; offset of person type in TownFixedData() + add x1,x4 ; add to base in TFD + x1=TownFixedData(x1) +; bit 1 will be clear if male + x2=2 + code + + + and x2,x1 + code - + + if x2<>0 then ChooseFemaleName +.ChooseMale2 + random v2 + if v2>49 then ChooseMale2 ; numbmer of male names available + goto GotName + +.ChooseFemaleName + random v2 + if v2>9 then ChooseFemaleName + + x2=100 + add v2,x2 ; female names are 100.109 +.GotName + code + + return +;------------- +code - +.iRandomLimitX2 +; get x3 as a random number less than x2 +; i.e. there will be x2 possible values. + random x3 + if x30 then iRL0 ; in case we're asked for zero options. + x3=0 + return + +.iRL0 + code + ; compile it for speed. +.iRL1 + sub x3,x2 + if x3>x2 then iRL1 + if x3=x2 then iRL1 + code - + +.iRLEnd + return +;---------- +.iDesignPerson +; person number PersonNumber + x6=0 ; offset within this person's 32-byte "components" table. +; that we are going to assemble... + code + + &x4=TownFixedData(0) ; offset of fixed people data + x1=PersonNumber ; person number being designed + add x1,x1 ; times 8 - 8 bytes per person in TownFixedData(*0) + add x1,x1 + add x1,x1 + add x1,x4 + add x1,c3 ; get identikit prototype number to use. + x1=TownFixedData(x1) + add x1,x1 ; double to get offset in tables. + &x4=TownFixedData(6) ; pointer table to identikit people prototypes + add x4,x1 ; get identikit appropriate prototype + &x4=TownFixedData(x4) ; get offset of identikit itself. + code - + +.iDPLoop + v2=TownFixedData(x4) ; first XZH + v5=v2 ; save xzh number + add x4,c1 + if v2=0 then iDPEnd + add x6,c2 ; increase number of 2-byte entries we've written +; into TVD. + x2=TownFixedData(x4) ; number of XZHs to choose from + add x4,c1 + if x2=1 then IDPSingleXZH + gosub @iRandomLimitx2 ; gets x3 as a random number + add v2,x3 ; vary xzh number. + +.IDPSingleXZH + code + + gosub @UpdateVarDataByteInc ; 0: xzh number for component. + code - + + v2=TownFixedData(x4) ; first raster offset + add x4,c1 + x2=TownFixedData(x4) ; number of raster offsets to choose from + add x4,c1 + if x2=1 then IDPSingleRO +.idpChooseRO + gosub @iRandomLimitx2 ; gets x3 as a random number + + if v5=2 then idpFemaleFace + if v5<>1 then idpNotFace ; what was xzh number? +; faces have much bigger raster offsets - 10 between each. +; Also, for Men, offsets 20 and 50 don't work - and I haven't +; time to fix them. So just prevent them happening. + if x3=2 then idpChooseRO + if x3=5 then idpChooseRO +.idpFemaleFace +; multiply x3 by 10 + add x3,x3 ; times 2 + v5=x3 ; save times 2 + add x3,x3 ; times 4 + add x3,x3 ; times 8 + add x3,v5 ; plus times 2-> times 10. + +.idpNotFace + + add v2,x3 ; vary RO. + +.IDPSingleRO + code + + gosub @UpdateVarDataByteInc ; 1: raster offset for component. + code - + goto @iDPLoop + +.iDPEnd + code + +.iDPEnd1 + if x6>31 then iDPEnd2 + gosub @UpdateVarDataWordInc + add x6,c2 + goto iDPEnd1 + +.iDPEnd2 + code - + return + code + +;------------- +.GenerateEvent +; of type x4: come up with a new event of one type +; or another. Possible types are: +; 1 + Contents of banks +; 2 + Number of deputies in a particular town +; 3 + Contents of train +; 4 + Locations of gangs +; 5 + Recent Robberies +; 6 + Sub-plot hint. + + return +;---------- +.MoveMoneyAround +; increase the amount of money in all the banks except Santa Fe. +; This is special because the bank gets filled when the train +; arrives from the east. + + return +;--------- +.GangIntelligence +; Process all the gangs: if they're overripe for a new +; robbery, make them take out the most lucrative target +; without Billy's help... +; If Pat is playing single-player, randomly allocate Billy +; to one of the robberies... + x4=ObjectsInformation + x3=41 ; gang number we're processing: go from 41 to 46 +; TownVarData(x4) contains an 8-byte workspace area for +; this gang. Its format is determined mostly by this routine. +; It is initialised entirely to 0 at the start of the game. +; .w Amount of money possessed by gang. +; .w +; .w +; .w +.GILoop + &x1=TownVarData(x4) ; got any money? + if x1=0 then GIDoRobbery + if x1>32767 then GIDoRobbery ; got an overdraft. + x2=10 ; rate at which gang spends money + sub x1,x2 + if x4>TownVarDataSize then @StratBug ;****** + &TownVarData(x4)=x1 +.GINext + add x4,c8 ; next gang + add x3,c1 + if x3<47 then GILoop + return + +.StratBug ;******** + break ;******** + return ;****** + +.GIDoRobbery +; the gang will rob the local bank, if it has +; a noticeable amount of money. Otherwise they may +; rob the train. + x2=x3 ; gang object + x5=31 ; convert from gang (41..) into town (10..) + sub x2,x5 ; x2 is now town number + + push x2 + x1=x2 ; 10..15 +; go to 31..36 for bank clerk number + x2=21 + add x1,x2 + MenuNumber=34 ; "we've been robbed by someone other than Billy" menu + gosub @NewMenuForPerson +; next time Player talks to person x1, use menu MenuNumber + pop x2 + + gosub @GetMoneyInBank + if x2<500 then @GIAfterRobbery + if x5>TownVarDAtaSize then @StratBug ;***** + &TownVarData(x5)=c0 ; clear out the bank! +; x1 was amount of money owned by the gang + add x1,x2 + if x4>TownVarDAtaSize then @StratBug ;***** + &TownVarData(x4)=x1 ; give the gang some money! +; and now update the "last robbery" information... + x1=SPRobberyOffset + add x1,SubPlotsoffset ; pointer to this subplot area + &x1=TownVarData(x1) ; get this subplot area itself + if x1>TownVarDAtaSize then @StratBug ;***** + &TownVarData(x1)=x3 ; save gang name involved. + add x1,c2 +; convert from gang name (41.. to town name 10..) + x2=31 + sub x3,x2 + if x3>TownVarDAtaSize then @StratBug ;***** + &TownVarData(x1)=x3 ; write in town that was hit. + +; make town annoyed at Pat + x1=x3 ; x1:=town robbed. + x5=10 + sub x1,x5 ; go from town name 10.. to TVD offset 0.. + add x1,x1 + add x1,x1 + add x1,x1 + add x1,x1 ; 16 bytes per town at start of TVD + x2=4 ; opinion of Pat offset + add x1,x2 + &x2=TownVarData(x1) ; current opinion + x3=100 ; change in opinion caused by robbery + sub x2,x3 + if x1>TownVarDAtaSize then @StratBug ;***** + &TownVarData(x1)=x2 + +.GIAfterRobbery + goto @GINext +;-------------- +.GetMoneyInBank +; return x2=TVD(x5) as amount of money in bank at town x2 (10..) + x5=10 + sub x2,x5 ; go from location (10..) to entry in TVD (0..) + add x2,x2 + add x2,x2 + add x2,x2 ; times 8: bytes per entry in SPD table. + &x5=TownVarData(SubPlotsOffset) ; "money location" table. + add x5,x2 + add x5,c2 +; &TVD(x5) is amount of money in local bank + &x2=TownVarData(x5) + return +;------------- +;.GetBestTarget +; return TVD(x1) as the SubPlotData entry for the +; most tempting robbery target. This should be the bank +; with the most money that is unguarded, or guarded +; by less than 5 deputies. +; Or the train, if it has loads of cash. +; &x1=TownVarData(SubPlotsOffset) ; "money location" table. +; x2=SPDeputiesOffset +; add x2,SubPlotsOffset +; &x2=TownVarData(x2) ; "deputies" information. + +;------------- +.TownIntelligence +; The towns need to decide if they are unhappy with the +; way Pat is running things. I think this can work by just +; setting a flag when a robbery is attempted. When Pat positions +; some deputies, this flag is reduced by the number of deputes +; there each time interval. When the number reaches 0, the +; town is happy. +; Every town that has been made law-abiding is happier: and +; so makes a positive contribution to Pat's number of votes. +; (Wealth of town? - would make it well worth while protecting +; a big pot of gold in one town) + x4=10 ; town being considered (as TOWN variable) +.TownIntelligence1 + push x4 + x2=x4 + gosub @GetMoneyInBank +; (returns x2=TVD(x5) as amount of money in bank at town x2 (10..)) + add x2,c32 ; make Banks get rich much quicker... + if x5>TownVarDAtaSize then @StratBug ;***** + &TownVarData(x5)=x2 + pop x4 + + + gosub @GetLocationData ; is town object x4 (10..15) lawful? +; Each town has the following variable table +; which is part of ObjectsInformation: 8 bytes each +; (i.e. 8 bytes per object, including e.g. cows, gangs) +; TVD(x1+LawfulOffset=0) .b 0 if lawless, 1 if lawful +; TVD(x1+HappinessOffset=1) .b How happy the town is: starts at 128 (moderately happy) +; to 0 (completely unhappy) and up to 255 (ecstatic) +; TVD(x1+DeputiesOffset=2) .b Number of deputies stationed + x2=DeputiesOffset + add x2,x1 + x3=TownVarData(x2) ; number of deputies + sub x3,c2 ; if >2 deputies, get happier each turn. Else get less happy + add x3,x3 + add x3,x3 + add x3,x3 + add x3,x3 + add x3,x3 ; times 32, so 0 deputies means happiness goes down a full +; division every month + push x4 + gosub @ChangeHappiness + pop x4 + + add x4,c1 + if x4<16 then @TownIntelligence1 + + return +;------------- +.ChangeHappiness +; change happiness for town with data TVD(x1) +; by x3: signed word + x2=HappinessOffset + add x2,x1 + x4=TownVarData(x2) + add x4,x3 ; add on change in happiness + if x4<500 then TINotBottomLimit + x4=0 + if PlayersName<>Pat then TINotBottomLimit + x1=3 + and x1,PatWarnings + if x1<>0 then TINotBottomLimit ; get warning every 4th time into town + NextMeetingMenu=182 ; Barney said "sorry, old chum. You;re out" (1815) +; (See this next time we leave the map) + add PatWarnings,c1 + if PatWarnings>5 then TINotBottomLimit + NextMeetingMenu=180 ; Pat - people are revolting! + +.TINotBottomLimit + if x4<256 then TINotTopLimit + x4=255 + +.TINotTopLimit + if x2>TownVarDAtaSize then @StratBug ;***** + TownVarData(x2)=x4 ; write back happiness + return +;------------- +; menu options for sheriff's office +; when finished, Jump back to MeetDoMenu with MenuNUmber set +; or jump to BackToWalkabout if don't want anything else. +.WhereAreDeputies + code - + gosub @iStartPrinting + x4=10 ; town being considered +.WhereADLoop + m1=500 ; base for names + add m1,x4 + message m1 ; print town name. + code + + gosub @GetLocationData ; is town object x4 (10..15) lawful? +; Each town has the following variable table +; which is part of ObjectsInformation: 8 bytes each +; (i.e. 8 bytes per object, including e.g. cows, gangs) +; TVD(x1+LawfulOffset=0) .b 0 if lawless, 1 if lawful +; TVD(x1+HappinessOffset=1) .b How happy the town is: starts at 128 (moderately happy) +; to 0 (completely unhappy) and up to 255 (ecstatic) +; TVD(x1+DeputiesOffset=2) .b Number of deputies stationed + add x1,c1 + x2=TownVarData(x1) ; get happiness + asr x2 + asr x2 + asr x2 + asr x2 + asr x2 ; divide by 32 to give 0..7 as happiness rating + code - + add x1,c1 + x3=TownVarData(x1) ; x3=number of deputies + print x3 + message dot + message ForceCR + m1=456 ; base for happiness messages + add m1,x2 + message 455 ; people are + message m1 ; rebelling->ecstatic + message ForceCR + add x4,c1 + if x4<16 then @WhereADLoop ; next town + gosub @iEndPrinting + code + + gosub @TTPDI2 ; DisplayInstructions2 ; using text on raster already +.SheriffMenu + MenuNumber=174 ; what now? + goto @MeetDoMenu + +.HireDeputy + MenuNumber=176 ; get town number + gosub @PrettyMenu +; result=town number (10..15) + x4=result + gosub @GetLocationData + x2=DeputiesOffset + add x2,x1 + x3=TownVarData(x2) + add x3,c1 + if x2>TownVarDAtaSize then @StratBug ;***** + TownVarData(x2)=x3 + goto SheriffMenu + +.FireDeputy + MenuNumber=176 ; get town number + gosub @PrettyMenu +; result=town number (10..15) + x4=result + gosub @GetLocationData + x2=DeputiesOffset + add x2,x1 + x3=TownVarData(x2) + if x3=0 then @SheriffMenu + sub x3,c1 + if x2>TownVarDAtaSize then @StratBug ;***** + TownVarData(x2)=x3 + goto @SheriffMenu + + + + +;------------------ + code - +.iCalcCostOfDeputies ; gets running cost in x3 +; and gets income in x5 + x4=10 ; town being considered + x3=0 ; cost so far + x5=200 ; income so far +.iCCOD1 + code + + gosub @GetLocationData ; is town object x4 (10..15) lawful? +; Each town has the following variable table +; which is part of ObjectsInformation: 8 bytes each +; (i.e. 8 bytes per object, including e.g. cows, gangs) +; TVD(x1+LawfulOffset=0) .b 0 if lawless, 1 if lawful +; TVD(x1+HappinessOffset=1) .b How happy the town is: starts at 128 (moderately happy) +; to 0 (completely unhappy) and up to 255 (ecstatic) +; TVD(x1+DeputiesOffset=2) .b Number of deputies stationed + x2=DeputiesOffset + add x2,x1 + dx2=TownVarData(x2) + dx1=CostDeputy + gosub @Multdx1dx2 + x2=dx1 ; cost per month + add x3,x2 ; add on to running cost + code - + x2=TownVarData(x1) ; LawfulOffset + add x2,x2 + add x2,x2 + add x2,x2 + add x2,x2 + add x2,x2 ; each lawful town brings income of 32 + add x5,x2 ; add on to income + + add x4,c1 + if x4<16 then ICCOD1 + + x1=SPFTexanPosseeAvailable ; number of members (byte) + x2=SubPlotFlags + add x1,x2 + dx1=TownVarData(x1) ; number of deputies working for nothing + dx2=CostDeputy +code + + gosub @MultDX1DX2 +code - + sub x3,dx1 + if x3<32000 then ICCOD2 + x3=0 ; cost has gone negative, so limit to zero + +.ICCOD2 + return +;-------------- +.iBudgetShortfallX1 +; oh dear - Pat is trying to spend x1 gold more than +; he's got + x4=15 ; town being considered + x3=x1 ; cost still to save +.iBS1 + code + + gosub @GetLocationData ; get TVD(x1) for x4 +; Each town has the following variable table +; which is part of ObjectsInformation: 8 bytes each +; (i.e. 8 bytes per object, including e.g. cows, gangs) +; TVD(x1+LawfulOffset=0) .b 0 if lawless, 1 if lawful +; TVD(x1+HappinessOffset=1) .b How happy the town is: starts at 128 (moderately happy) +; to 0 (completely unhappy) and up to 255 (ecstatic) +; TVD(x1+DeputiesOffset=2) .b Number of deputies stationed + code - + x2=DeputiesOffset + add x2,x1 +.iBS2 + x1=TownVarData(x2) +; x1 deputies currently at this town. Take them away! + if x1=0 then iBS3 + sub x1,c1 + if x2>TownVarDAtaSize then @iStratBug ;***** + TownVarData(x2)=x1 + x5=CostDeputy + sub x3,x5 ; take off from shortfall + if x3>32000 then iBSEnd ; have saved enough money + goto iBS2 + +.iBS3 + sub x4,c1 + if x4>9 then iBS1 +.iBSEnd + return + + code + +;-------------- +.SetPeoplesKnowledge +; go through people tables and randomly make people +; know things (as and when there is information of +; the right type for them to know). + v1=TVDInfoByte + add v1,PeopleVarData + x3=NumberOfPeople ; countdown +.SPKLoop + v2=TownVarData(v1) + x1=127 ; mask off top bit + and v2,x1 +; code - +; random x1 +; code + +; if x1>127 then SPKKnowNothing + x1=128 + or v2,x1 ; know something! + +.SPKKnowNothing + gosub @UpdateVarDataByte ; write v2 into TVD(v1) + add v1,c16 ; size of peopleData entries in TVD + sub x3,c1 ; reduce number + if x3>0 then @SPKLoop + return +;-------- +.PurgeIdentikitCells +; purge cells that will be used by identikits (7500..8900) + v1=7100 + v5=dPurgeObject +.DClear1 + gosub @MCDrawObjectV1 + add v1,c1 + if v1<8900 then DClear1 + return + +;--------- +.FullDisplayPerson +; display person with data at TVD(ThisPersonVarData) +; who is person number PersonNumber +; DO AN INITACBS BEFORE calling this routine. + gosub @PutUpHourglass + push x1 + gosub @OpenIdentikitStructures + pop x1 +; gosub @PurgeIdentikitCells ; purge cells common to identikits +; and town sprites file. + +.FDP1 + push x1 + gosub @DisplayPerson + pop x1 + return + +;--------- +.DisplayPerson +; display person with data TVD(ThisPersonVarData) +; who is number PersonNumber + cif pc + v1=0 + v2=0 + gosub @SafeScrollDirection + gosub @SafePlotLogical + cend + gosub @MCDisplayRoom +;; gosub @DisplayEverythingSprites ; display acbs, text box etc. + PersonDisplayed=true ; stop SpecialAniObj problems with funny acbs +; set up for the person conflicting with e.g. what SAO thinks +; is the player's acb in the walkabout code. + x4=IdentikitTableBase ; 32 bytes per person. + x1=PersonNumber + add x1,x1 + add x1,x1 + add x1,x1 + add x1,x1 + add x1,x1 ; x1=PersonNumber*32 + add x4,x1 + + dv2=32 ; x + dv3=616 ; z + dv4=600 ; h + dv6=0 ; non-reversed. + x3=0 ; offset within table. + + dv5=dMarkPreload + push x4 + gosub @DPLoop + pop x4 + gosub @MCPreloadCells + + x3=0 ; offset within table. + dv5=1 ; draw type + +.DPLoop +; sixteen two-byte entries: first byte is xzh, +; second byte is Raster Offset + dv1=TownVarData(x4) + add x4,c1 + x1=TownVarData(x4) + add x4,c1 + &WordWS(WordRasterOffset)=x1 + RasterOffset=x1 ; for setting up acbs + add dv3,c1 ; make each plane by one higher than the last, + add dv4,c1 ; to make sure the acb handler gets them in the right order. + push x3 + push x4 + push dv3 + push dv4 + gosub DPDO + pop dv4 + pop dv3 + pop x4 + pop x3 + add x3,c2 + if x3<32 then @DPLoop + gosub @MCCopyScreenToBuffer +; cif pc +; gosub @MCUpdateScreen +; gosub @MCUnplotScreen +; cend + +.DPDORet + return +;------------ +.DPDO + if dv5<>1 then @MCDrawObjectDV1 ; preload + ObjectNumber=dv1 + + if dv1>2 then @DPDONotFace + if dv1=0 then DPDORet +; for face, set up animation directly. + push ObjectNumber + push dv1 + push dv3 + push dv4 + if dv1=1 then DPDOMaleFace + add dv3,c16 + ObjectNumber=710 + push dv4 + sub dv4,c32 ; move mouth down + gosub @DPSFA2 + pop dv4 + ObjectNumber=712 + gosub @DPSFA2 + goto DPDOAfterFace + +.DPDOMaleFace + add dv3,c32 + add dv4,c32 + ObjectNumber=700 + gosub @DPSFA2 + ObjectNumber=703 + gosub @DPSFA2 + +.DPDOAfterFace + pop dv4 + pop dv3 + pop dv1 + pop ObjectNumber + +.DPDONotFace + dx1=240 ; make hair be much further forward, so + if dv1=22 then DPDOSideBurn ; men's sideburns. + if dv1=51 then DPDOSideBurn ; women's hair + if dv1<>21 then DPDONotHair + dx1=250 ; make hair be much further forward, so +.DPDOSideBurn +; mouth animates behind it. + add dv3,dx1 + add dv4,dx1 + goto DPSFA2 ; do as acb, so it appears in front of mouth + +.DPDONotHair + if dv1<40 then DPDONotHat + if dv1>42 then DPDONotHat + dx1=260 ; make hat be in front of hair/beard + add dv3,dx1 + add dv4,dx1 + goto DPSFA2 ; do as acb, so it appears in front of mouth + +.DPDONotHat +; drop through to DPSFA + +.DPSFA +; draw objectNumber (will be CopyScreenToBuffered) + push dv2 + push dv3 + push dv4 + push RasterOffset ; zeroed by StartFreeACB + dv5=dPlot + dv6=0 ; reversal + &WordWS(WordRasterOffset)=RasterOffset + gosub @MCDrawObjectDV1 + &WordWS(WordRasterOffset)=c0 + pop RasterOffset + pop dv4 + pop dv3 + pop dv2 + return + +.DPSFA2 +; start ObjectNumber as an ACB + push dv2 + push dv3 + push dv4 + push RasterOffset ; zeroed by StartFreeACB + gosub @StartFreeACB + pop RasterOffset + pop dv4 + pop dv3 + pop dv2 + return +;-------- +.NewsOffice +; display newspaper headlines - called from walkabout when +; go into the news room. +; No need to swap overlay, cause we don't show a person here. + push CurrentPrintRaster + push CurrentDo + CurrentPrintRaster=2744 ; newspaper print raster. + CurrentDO=391 ; 391:epitath newspaper with Billy's photo (390 is without) + Newspaper=true + gosub @MCEmptyRoom + gosub @MCBuildROom + gosub @InitACBs + x2=3 +; .w Offset of "Money Location" information. (type 0) +; .w Offset of "Deputies Location" information. (type 1) +; .w Offset of "Gang Location" information (type 2) +; .w Offset of "Recent robbery" information (type 3) +; .w Offset of sub-plot table. + gosub @TTPScanInformation +; what information of type x2 is known? +; Return: information is at TownVarData(x4). Or if result=false, +; no information on this topic is available + code - + gosub @iStartPrinting + message ExtraNewsStory ; e.g. ranch going out of business + message cr + code + + PersonDisplayed=0 ; flag which also determines if "I hear.." printed at start + gosub @AddSPEntries ; also displays the text box +; code - +; gosub @iEndPrinting +; code + + NewScreen=CurrentScreen + pop CurrentDO + pop CurrentPrintRaster + Newspaper=false + goto @BuildNewScreen ; re-enter current outside room. +;---------- +.WantedPoster +; display newspaper headlines - called from walkabout when +; go into the news room. +; No need to swap overlay, cause we don't show a person here. + push CurrentPrintRaster + push CurrentDo + push TextBoxWidth + push BackgroundColour + CurrentPrintRaster=2743 ; newspaper print raster. + CurrentDO=392 ; 392:wanted poster + TextBoxWidth=100 + BackgroundColour=0 ; transparent + gosub @MCEmptyRoom + gosub @MCBuildROom + gosub @InitACBs + code - + gosub @iStartPrinting + message 1852 ; reward for Billy is +; x1=500 ; amount of gold in reward is $ + gosub @iPrintReputation + message 1853 ; . + gosub @iEndPrinting + code + + NewScreen=CurrentScreen + gosub @TTPDI2 ; DisplayInstructions2 ; using text on raster already + pop BackgroundColour + pop TextBoxWidth + pop CurrentDO + pop CurrentPrintRaster + goto @BuildNewScreen ; re-enter current outside room. +;---------------- +code - +.iPrintReputation + if PlayerReputation>2 then PrintRep2 + PlayerReputation=2 + +.PrintRep2 + print PlayerReputation + return +code + + +;------------ +.SpecialPrintMenu +; If talking to a person, they are described by TownVarData(ThisPersonVarData) +; M1 is message requested by menu code. +; Can also clear PersonDisplayed to false if want to get rid +; of the person from the location + result=m1 + x1=600 ; MM + sub result,x1 + gosub @GetCost +; get cost in x1, increase in reputation x2 +; from printing message MM(600)+result + if x1301 then SPMNotBrawl ; refuse to buy someone a drink +.SPMBrawl + result=300 ; Billy, we're gonna cream ya + if PlayersName=Billy then SPMNotBrawl + result=301 ; Pat, we're gonna cream ya + + +.SPMNotBrawl + x1=PersonNumber + x2=7 + and x1,x2 ; get variation between different people in town + code - + if m1<342 then SPMNotNeedsHelp + if m1>359 then SPMNotNeedsHelp ; first message available is 342, + if x1<5 then SPMNeedsHelp2 ; last message available is 346: minus 342 -> 4 + sub x1,c4 ; bring into range +.SPMNeedsHelp2 + message 340 ; a friend of mine needs help... + add m1,x1 + message m1 + m1=341 ; might be able to help ya too! + +.SPMNotNeedsHelp + if m1<362 then SPMNotLooking + if m1>379 then SPMNotLooking ; first message available is 362, + if x1<65 then SPMLooking2 ; last message available is 367: minus 362 -> 5 + sub x1,c4 +.SPMLooking2 + message 360 ; hey mister, someone was looking for ya + add m1,x1 + message m1 ; e.g. over in Santa Fe + m1=361 ; why not get over there and look em up + +.SPMNotLooking + if m1<>1519 then SPMNotAshUpton +;;; dc.w 1519-MM,MMenu+158 * the store was deserted... +; MD person has buggered off somewhere, to let player +; get hold of the forged accounts. + PersonDisplayed=0 + +.SPMNotAshUpton + if m1<>1516 then SPMNotDeliverBooks + message Playersname ; before 'showed the books to colonel...' + x1=68 ; soldier at fort Sumner + MenuNumber=16 ; default meeting menu + code + + gosub @NewMenuForPerson + code - + x1=100 + add PlayerReputation,x1 + +.SPMNotDeliverBooks + if m1<>1518 then SPMNotGotBooks +;;; dc.w 1518-MM,MPrintDoM1+1515-MM * get books + x1=68 ; soldier at fort Sumner + MenuNumber=168 ; menu to trigger player showed books to Colonel Mustard, etc. + code + + push MenuNumber + gosub @NewMenuForPerson + x1=44 ; Murphy Dolan guy at store + MenuNumber=16 ; back to default menu + gosub @NewMenuForPerson + pop MenuNumber + code - + PersonDisplayed=0 ; don't display person in store +; next time Player talks to person x1, use menu MenuNumber + +.SPMNotGotBooks +;[870:"we've been robbed by Billy The Kid - so don't ask to make +;a big withdrawal! "] +;; when Billy goes into a bank he's recently robbed. +;[871:"we've been robbed. I hope you've come to make a deposit. "] +;; when Billy goes into a bank another gang has recently robbed + x2=200 ; unlikely they won't recognize Billy! + if m1=870 then SPMRecognize ; recently robbed by Billy + x2=60 ; normal probability they'll recognize Billy + if m1<>871 then SPMDontRecognize +.SPMRecognize + gosub @iCheckRecognizeBilly + +.SPMDontRecognize + if m1<920 then @PMNotHello + if m1>951 then @PMNotHello +; person is just saying hello + if PlayersName<>Billy then SPMNotRecognize +; if in a lawful town, will Billy be recognized? + x2=60 ; normal probability they'll recognize Billy + gosub @iCheckRecognizeBilly + +.SPMNotRecognize + +; - occasionally add on the amount of reward, +; or the number of votes that Pat got +;[1870:Hey, I hear your reward is now $] ; |||| +;[1871:Hey, I hear you polled ] ;||| for Pat +;[1872:. ] ; ||| follows 1870/amount of money +;[1873:votes. ] ;||| follows 1871 + random x1 + if x1>35 then PMNotMentionReward + m1=1869 + add m1,PlayersName ; +1(Pat) or 2 (Billy) + message m1 + gosub @iPrintReputation ; print PlayerReputation + add m1,c2 +; m1 replaces normal greeting + +.PMNotMentionReward +.PMNothello + if m1<1891 then SPMNotGangBust + if m1>1897 then SPMNotGangBust +;[1890:Tom O'Foliard rode up and said "Billy, ] ;||| +;[1891:the Cooper Gang have been raided". ] ;||| +;[1892:the Socorro Varueros gang has been raided". ] +;[1893:the Seven Rivers Gang gang has been raided". ] +;[1894:the Dona Ana Bunch gang has been raided". ] +;[1895:the Jesse Evans gang has been raided". ] +;[1896:the fugitives' gang has been raided". ] +;[1897:the regulators' gang has been raided". ] + if PlayersName<>Pat then SPMNotBustPat + message 1490 ; [1490:Barney Mason rode up and said, "] + +.SPMNotBustPat + if PlayersName<>Billy then SPMNotGangBust + message 1890 ; add on header "Tom O'Foliard rode up and said" + +.SPMNotGangBust + + if PlayersName<>Pat then SPMNotPat +; SPECIALS FOR PAT GARRETT. + + if m1<>665 then SPMNotMenuRobBank +; menu option "ROB BANK" + m1=0 ; Pat can't rob the bank! + +.SPMNotMenuRobBank + if m1<>1680 then SPMNotBuzzOff +; soldier/rancher tells Billy to Buzz off. Slightly more polite to Pat + m1=1686 + +.SPMNotBuzzOff + +.SPMNotPat + if m1<920 then SPMNotGreeting + if m1>930 then SPMNotGreeting + x1=ThisPersonVarData + code + + gosub @GetGreetingMessage + gosub @GetPersonalGreeting + code - +; for person TownVarData(x1) +; return m1=personal greeting, if we've already met them. +; or leave m1 unchanged if we haven't met them. +; Also return x2=0 if they are strangers. +; person's data is at TownVarData(ThisPersonVarData) + +.SPMNotGreeting + + +code + + if m1<>904 then SPMNotDuel +; "I'll see you outside" -> "Draw, varmit" if already outside + if CurrentScreen>MaxOutside then SPMNotDuel + m1=899 ; "Draw, varmit" + +.SPMNotDuel + code - + + + +.SPMEnd + code + + return +;-------------------- + code - +.iCheckRecognizeBilly +; are just about to print message M1, usually whilst +; talking to the bank teller. If this is a lawful town, +; or if Billy has hit this bank before, he may get an +; escape game for his pains... +; x2 is prob. threshold of being recognized. + if PlayersName<>Billy then CRBNotRecognize + random x1 + if x1>x2 then CRB1 +; most of the time in a lawless time, Billy can rob the same +; bank again, but sometime they'll recognize him and chase him off... + if m1=870 then CRB2 ; just been robbed by Billy, so recognize him! + +.CRB1 +; in lawful towns, usually recognize him... + x4=town + code + + gosub @IsTownLawful ; x2=TVD(x1) is non-zero if lawful + code - + if x2=0 then CRBNotRecognize ; still lawless when 0 + random x1 + if x1>160 then CRBNotRecognize + +.CRB2 + m1=1880 ;[1880:hey, It's Billy The Kid! Get him boys! ] + code + + gosub @DisplayInstructions + goto @ToEscapeGame + code - +; +.CRBNotRecognize + return + code + +;------------- +.NewRoomSubPlotEncounters +; Player is going into a new room in the +; walkabout section. Is he going to meet anyone? +; (Moving from CurrentScreen->NewScreen + code - + if NewScreen>MaxOutside then @SPEEnd ; don't get shootouts when +; goin into saloon, etc. + + random x1 + if x1>80 then @SPEEnd ; make a decision one third of the +; times we leave first room. If decision made, that's it. +; Otherwise same probability on leaving each room until +; the decision HAS been made. + + + v2=255 ; default value to update flags (UpdateVarDataByte) + v1=SPFAmbushDecision + add v1,SubPlotFlags + x1=TownVarData(v1) + if x1<>0 then @SPEEnd ; decision already made in this town + gosub @iUpdateVarDataByte ; have now made decision + v1=SPFMeetBounterHunter + add v1,SubPlotFlags + x1=TownVarData(v1) ; due to meet bounty hunter? + if x1=0 then SPENotBountyHunter + m1=1634 ; bounty hunter waiting + goto @iDuel + +.SPENotBountyHunter + random x1 + if x1>40 then @SPEEnd ; proportion of towns -> encounter + + + v1=SPFSevenRiversAmbush + add v1,SubPlotFlags + x1=TownVarData(v1) + if x1<>0 then SPENotSevenRivers + gosub @iUpdateVarDataByte +.SevenRiversAmbush + m1=1645 ; seven rivers ambush + code + + gosub @DisplayInstructions + code - + goto @iSubPlotShootoutNoM1 + +.SPENotSevenRivers + v1=SPFJesseEvans + add v1,SubPlotFlags + x1=TownVarData(v1) + if x1<>0 then SPENotJesseEvans + gosub @iUpdateVarDataByte + m1=1646 ; Jesse Evans gang ambush + code + + gosub @DisplayInstructions + code - + goto @iSubPlotShootoutNoM1 + +.SPENotJesseEvans + v1=SPFJoeGrantMet + add v1,SubPlotFlags + x1=TownVarData(v1) + if x1=0 then SPENotJoeGrant + if x1>2 then SPENotJoeGrant + v2=255 ; duel fought + gosub @iUpdateVarDataByte +; x1=2 if Joe's gun won't fire + m1=1678 ; Joe Grant was waiting outside the saloon + goto @iDuel + +.SPENotJoeGrant +.SPEEnd + code + + return + + +.WalkingSubPlotEncounters +; Player is walking around. +; Is he going to meet anyone? + code - + v2=255 ; default value to update flags (UpdateVarDataByte) + if Town<>LincolnCity then wspNotMcSween + if Location<>165 then wspNotMcSween ; in saloon? + v1=SPFMcSweenStage + add v1,SubPlotFlags + x1=TownVarData(v1) + if x1<>1 then wSPNotMcSween ; Brady not waiting to murder McSween + v2=2 ; has done now + gosub @iUpdateVarDataByte ; have now made decision + MenuNumber=118 + gosub @iprettyMenu + if result=1064 then @isubPlotShootoutNoM1 ; 1664-MM + +.wspNotMcSween + if Town<>SantaFe then wspNotSantaFe + if Location<>160 then wspNotSantaFe ; in Santa Fe saloon? + if PlayersName<>Billy then wspNotSantaFe ; Billy-only subplot + v1=SPFJoeGrantMet + add v1,SubPlotFlags + x1=TownVarData(v1) + if x1<>0 then wSPNotJoeGrant ; have we met Joe Grant? + MenuNumber=128 ; come here Big Boy and look at my pistol. + x1=1248 ; 78*16 - i.e. Joe Grant person + code + + push v1 + gosub @TalkToPerson ; come here Big Boy and look at my pistol. + pop v1 + PlayingDuel=true ; have a duel when we leave saloon + code - + v2=2 ; turned gun to empty chamber + if result=1077 then joeGrantLeaves + v2=1 ; has done now - gun unmolested +.JoeGrantLeaves + gosub @iUpdateVarDataByte ; have now made decision + goto @iBackToWalkabout + +.wspNotJoeGrant +.wspNotSantaFe + + +; PAT'S ENCOUNTERS... +; Mayor accosts Pat... +;Menu84 +;Menu86 +;; Mayor accosts Pat... +;Menu88 +;Menu90 + if PlayersName<>Pat then wspNotPat + random x1 + if x1>10 then wspNotMayor + random x1 + MenuNumber=88 ; Mayor accosts Pat (2) + if x1>127 then wspMayor2 + MenuNumber=84 ; Mayor accosts Pat (1) +.wspMayor2 + code + + gosub @PrettyMenu + code - + +.wspNotMayor +.wspNotPat + + + code + + +; Billy gets challenged after a while in each room of a +; lawful town... + if CurrentScreen>MaxOutside then @wspNotLawful + if PlayersName<>Billy then @wspNotLawful + x4=town + gosub @IsTownLawful ; returns x2=TVD(x1) non-zero if lawful + if x2=0 then wspNotLawful +;[1859:down the street, a deputy called out "Billy The Kid - hold it +;right there. You gonna come quietly?" ] ;||| +;[1860:run away.` ] ; ||| menu option +;[1861:ignore him.` ] ; ||| menu option +;[1862:Billy fled the town. ] ; run away ||| +;[1863:"go for your gun, outlaw." ] ;||| + MenuNumber=160 ; you gonna come quietly? + gosub @PrettyMenu + if result=1262 then @ReturnToMap ; 1860-MM + goto @FightDuel ; 1863-MM + +.wspNotLawful + if location=160 then wspSaloon + if Location=165 then wspSaloon + if Location<170 then wspNotSaloon +.wspSaloon + code - + random x1 + code + + if x1>70 then wspNotSaloon + goto @ToBrawlGame +;.ToBrawl +; v4=BrawlScreen +; v1=ArcadeAcode ; '3' +; gosub @FireVisitPlace +; goto @BackToWalkabout ; in case we get back here, which is unlikely + +.wspNotSaloon + return +;----------- +.SetSubPlotFlags + code - + x1=SPFCowboysMet ; ; cowboys to ambush player in town? + if result=908 then @SPSetFlagToPlayer + x1=SPFSickManOnHorse ; sick man riding with Player? + if result=1100 then @SPSetFlagToPlayer + if result=910 then @SPSetFlagToFinished ; refuse to help + + x1=SPFAccountsRequested ; player been asked to fetch accounts? + if result=917 then @SPSetFlagToPlayer + x1=SPFAccountsGot ; player got accounts from store? + if result=919 then @SPSetFlagToPlayer + x1=SPFGangToGrassOnBilly ; gang name which has promised +; to grass on Billy + x2=41 ; gang name + if result=924 then @SPSetFlagTox2 ; name of person talking to (gang) + + x1=SPFTexanPosseeAvailable ; number of members (byte) + x2=8 ; number of deputies available + if result=932 then @SPSetFlagTox2 +; x1=SPFFreeDeputies ; number of deputies unallocated (byte) + + x1=SPFTrackingBarneysOutlaw ; tracking outlaw suggested by +; Barney Mason + if result=937 then @SPSetFlagToPlayer + x1=SPFBeefWanted ; beef asked for by Indian Chief? + if result=1010 then @SPSetFlagToPlayer + x1=SPFUprisingOffered ; number of uprisings available (byte) + x2=1 ; 1 uprising available + if result=1011 then @SPSetFlagTox2 + + x1=SPFMeetBountyHunter ; meet bounter hunter referred +; to in 1634. Name of town: byte + x2=13 ; Mesilla + if result=911 then @SPSetFlagTox2 + +; x1=SPFAmbushDecision ; cleared whenever go into new town, +;; set when program has made a decision about whether Billy +;; is to be ambushed here, or not. + + x1=SPFCounterfeitOffered ; set when Billy has been offered +; counterfeit money as his share in a robbery. + if result=1050 then @SPSetFlagToPlayer + if result=1053 then @SPsetFlagToPlayerLose ; spend counterfeit normally + + x1=SPFMcSweenStage ; set to the following values: +; 0=startup - Mrs McSween running Tunstall ranch, happy. +; 1=Billy has been offered chance to save McSween's cows. +; 2=Sheriff Brady has gone to attack McSween. This is set when +; Billy has been told of this. If player does nothing, then +; we go on to 3. Otherwise 2 is the final state. i.e. she is ok +; 3=McSween is dead, ranch stays deserted + x2=1 ; offered chance to save cows + if result=1070 then SPSetFlagToX2 + x2=3 ; McSween is dead, unless overridden by gunfight + if result=1060 then SPSetFlagTox2Lose + + x1=SPFJoeGrantMet ; met Joe Grant? Set to 1 if yes but his +; gun unmolested, set to 2 if gun turned to empty chamber. +; Set to FF if duel fought. + x2=1 + if result=1079 then SPSetFlagToPlayer + x2=2 + if result=1077 then SPSetFlagToPlayerGain + goto SPSetFlagToPlayer + +.SPSetFlagToPlayerGain + add PlayerReputation,c16 + goto SPSetFlagToPlayer + +.SPSetFlagToPlayerLose + sub PlayerReputation,c16 + goto SPSetFlagToPlayer + +.SPSetFlagTox2Lose + sub PlayerReputation,c16 + goto SPSetFlagToPlayer + +.SPSetFlagToFinished + x2=255 ; subplot is over + goto SPSetFlagToX2 + +.SPSetFlagToPlayer + x2=PlayersName +.SPSetFlagToX2 + v1=SubPlotFlags + add v1,x1 + v2=x2 + code + + gosub @UpdateVarDataByteInc ; TVD(V1)=V2 + return +;------------- +.PlayerNewScreen +; call this routine every time we switch to a new screen. +; Do various housekeeping tasks here, like adding the amount +; of gold stolen in robberies. + add TotalGoldStolen,PlayerIncome + add PlayerGold,PlayerIncome + sub RobberyTillMDGoesBust,PlayerIncome ; amount of money that Billy still +; needs to steal before the next Murphy-Dolan ranch goes bust. + PlayerIncome=0 + + if RobberyTillMDGoesBust<32000 then @PNS2 +; another Murphy-Dolan ranch goes bust... + RobberyTillMDGoesBust=ConstTillMDGoesBust + x4=24 ; object number for ranch (24..30, 29=Tunstall Ranch(McSween)) +.BustRanch1 + gosub @GetLocationData ; returns x2=TVD(x1) where x1=position in ObjectsInfo + if x2=0 then BustRanch2 +.BustRanchNext + add x4,c1 ; next ranch + if x4<31 then BustRanch1 +; all ranches are broke... Billy wins! + goto @ToFinalDuel ;****WinGame +; gosub @AnnounceWin ; tell other player +; m1=1850 ; And so the west was won, Billy was a legend... +; gosub @DisplayInstructions +; v1=19 ; linking picture : Billy/Girl +; gosub @DisplayLinkingPicture +; return + +.BustRanch2 + + if x4<>29 then @BustRanch3 +; Tunstall Ranch: is McSween still there? If so, she's +; still in charge, and therefore will not go bust... + push x1 ; + push x4 ; ranch number + x3=ML ; =400: base for LOCATION variable. + add x3,x4 + gosub @WhoIsAtX3 +; gets x1 as person number * 16 for room x3. + x2=x1 ; copy into x2 (x1 popped in a tick) + pop x4 + pop x1 + if x2=74 then BustRanchNext ; person 74 - Mrs McSween - at Tunstall Ranch + + +.BustRanch3 + if x1>TownVarDAtaSize then @StratBug ;***** + TownVarData(x1)=c1 ; this ranch is broke! + ExtraNewsStory=400 ; extra news story=Ranch goes bust + add ExtraNewsStory,x4 ; ranch which has gone broke +; if Playersname<>Billy then PNS2 +; NextMeetingMenu=254 ; ssage=ExtraNewsStory ; make Tom O'Foliard come +;; up and tell ya as well +; +.PNS2 + return +;--------- +.PatIntelligence +; For Billy single-player, Pat has to decide where +; to position his deputies. I suggest we do this by assigning +; 5 to either the most tempting robbery target, or the second +; most tempting, at random. +; Do we need to consider political problems? e.g. town +; demanding protection to pacify them? + +; ACTUALLY, we're just going to make another town +; lawful every N clock ticks... + if PlayersName=Pat then PI0a + add TicksSinceLawful,c1 +.PI0a + if TicksSinceLawful<8 then PIRet ;****15 + TicksSinceLawful=0 + +;SantaFe=10 +;WhiteOaks=11 +;LincolnCity=12 +;Mesilla=13 +;Roswell=14 +;ElPaso=15 + x4=10 ; SantaFe +.PI1 + gosub @IsTownLawful + if x2=0 then @BringLawToTown + add x4,c1 + if x4<16 then PI1 ; ElPaso+1 + +.PIRet + return +;------------ +.CountLawfulTowns +; return x4 as number of lawful towns. x1..x5 corrupted, at least + x4=10 ; SantaFe +.CLT1 + gosub @IsTownLawful + if x2=0 then CLTDone + add x4,c1 + if x4<16 then CLT1 ; ElPaso+1 +.CLTDone +; x4 is first lawless town + x1=10 + sub x4,x1 +; x4 is number of lawful towns + return +;--------- +.CountBustRanches +; return x4 as number of bust ranches, corrupts x1..x6 + x4=24 ; object number for ranch (24..30, 29=Tunstall Ranch(McSween)) +.CBR1 + gosub @GetLocationData ; returns x2=TVD(x1) where x1=position in ObjectsInfo + if x2=0 then BustRanchDone + add x4,c1 ; next ranch + if x4<31 then CBR1 +.BustRanchDone +; x4 is first operating ranch + x1=24 + sub x4,x1 +; x4 is number of bust ranches + return +;--------- +.BillyStatusReport + gosub @CountBustRanches ; x4 is number of bust ranches towns + code - + gosub @iStartPrinting + if MenuNumber=150 then BSR2 ; visiting gang - get status report anyway +; code + +; break ;**** +; code - + prs "Tom O'Foliard ...." +; prs "Tom's name here..." ;******** + message 1890 ; [1890:Tom O'Foliard rode up and said, "hello old friend, ] + m1=1901 ; [1901:you've gotta hurry up. The Murphy-Dolans are taking over + if x4<3 then BSR1 + m1=1902 ; [1902:you've got the Murphy-Dolans on the run. Keep going + if x4<5 then BSR1 + m1=1903 ; [1903:you've almost nailed the Murphy-Dolans, my friend. But +.BSR1 + message m1 +.BSR2 + message 1904 ; [1904:you've stolen a total of $] + print TotalGoldStolen + message 1905 ; [1905: which has bankrupted ] + code + + gosub @CountBustRanches + code - + print x4 + message space + message 1906 ; [1906:of their ranches, but ] + code + + gosub @CountLawfulTowns + code - + print x4 + message space + message 1907 ; [1907:of the 6 important gangs have been wiped out". ] ; œœœ punc + gosub @iEndPrinting + code + + goto @TTPDI2 ; DisplayInstructions2 ; using text on raster already +;--------------- diff --git a/l9dev/regress/games.l9/billy.l9/table.bin b/l9dev/regress/games.l9/billy.l9/table.bin new file mode 100644 index 0000000000000000000000000000000000000000..43e93357ae536045ff1d6d5114be41bd98a38985 GIT binary patch literal 4836 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 literal 0 HcmV?d00001 diff --git a/l9dev/regress/games.l9/billy.l9/table.dat b/l9dev/regress/games.l9/billy.l9/table.dat new file mode 100644 index 0000000000000000000000000000000000000000..9e00cfd55c114efa509a56c9475107e431aa1968 GIT binary patch literal 4868 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 literal 0 HcmV?d00001 diff --git a/l9dev/regress/games.l9/billy.l9/table.txt b/l9dev/regress/games.l9/billy.l9/table.txt new file mode 100644 index 0000000..e6b93ff --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/table.txt @@ -0,0 +1,2150 @@ +;;;LaviniaStrumpetMenu equ 204 + +; Billy The Kid source, copyright (C) 1990 Level 9 Computing. +; +; TABLE.TXT, assembler format data for tables, a.k.a lists/arrays. +; (Save the assembled data as TABLE.DAT). +; +; You must start all DEFWs on EVEN boundaries, else subsequent code +; seems to be padded to make it even (according to the GENST listing, +; anyway). The EVEN directive inserts a padding byte if appropriate. +; + ORG 0 +starttables + dc.l ObjectTable-starttables ; object positions etc. + dc.l $FFFF ; HiresTable() Set up in AllocateWorkspaceLists + dc.l $FFFF ; + dc.l LIST4-starttables + dc.l NPCINITIAL-starttables ; npc initial and 'floor pointers' + dc.l TownFixedData-startTables ; + dc.l $FFFF ; 7: TownVarData: variable town stuff (AllocateWorkspaceLists) + dc.l list8-starttables ; 8 - assorted fixed system tables + dc.l IntroTables-startTables ; 9 - input table,object table + dc.l ENDTABLE-starttables +;--- +; +;--- +ObjectTable +; list giving the graphics objects which are important +; to the game. This is divided up by section: i.e. +; the map is separate from the various Sierra-style rooms, +; this separation being handled by the table at the start. + dc.w MapObjects-ObjectTable + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w MapToNewScreen-ObjectTable ; 10 + +; now the object tables themselves. These objects can +; be either xzh or rasters, and their order is critically +; important to the program. If you want to add new objects, +; just add them on the end. If you need to delete an object, +; replace it with a 0 or some new number. DON'T DELETE IT. +; The table ends with -1 + +MapObjects + dc.w 0 ; 0 + dc.w 340 ; 1 cows + dc.w 341 ; 2 cows + dc.w 342 ; 3 cows + dc.w 343 ; 4 cows + dc.w 344 ; 5 cows + dc.w 0 ; 6 + dc.w 0 ; 7 + dc.w 0 ; 8 + dc.w 0 ; 9 + dc.w 3345 ; Santa Fe 10 + dc.w 3346 ; White Oaks 11 + dc.w 592 ; Lincoln City 12 was 3347 + dc.w 588 ; Mesilla 13 + dc.w 589 ; Roswell 14 + dc.w 591 ; 3349 ; El Paso 15 + dc.w 0 ; spare town 16 + dc.w 0 ; spare town 17 + dc.w 0 ; spare town 18 + dc.w 3351 ; Fort Stanton 19 + dc.w 3352 ; Fot Sumner 20 + dc.w 0 ; spare fort 21 + dc.w 0 ; spare fort 22 + dc.w 0 ; spare fort 23 + dc.w 581 ; Unknown ranch near Bitter Lake 24 + dc.w 582 ; Fritz Ranch 25 + dc.w 583 ; Chisum Ranch 26 + dc.w 584 ; Dedrick Ranch 27 + dc.w 585 ; Beckwith Ranch 28 + dc.w 586 ; Reed ranch 29 + dc.w 587 ; unknown ranch 30 + dc.w 576 ; Katz farmhouse 31 + dc.w 577 ; Dunn farmhouse 32 + dc.w 578 ; Rose farmhouse 33 + dc.w 0 ; farmhouse 34 + dc.w 330 ; Mescalero Apache settlement 35 + dc.w 0 ; spare indians 36 (3356 might work) + dc.w 0 ; spare indians 37 + dc.w 0 ; spare indians 38 + dc.w 3304 ; train 39 + dc.w 2730 ; wagon train 40 + dc.w 331; outlaw hideout 41 + dc.w 332 ; outlaw hideout 42 + dc.w 333 ; outlaw hideout 43 + dc.w 334 ; outlaw hideout 44 + dc.w 335 ; outlaw hideout 45 + dc.w 336 ; outlaw hideout 46 + dc.w 0 ; outlaw hideout 47 + dc.w 337 ; prospector's camp 48 + dc.w 329 ; system + dc.w -1 ; end of table + + + + +MapToNewScreen +; for each object picked up in map, this table +; gives the corresponding screen number that it will +; invoke, or 0 if none. + + +; First byte: overlay letter to call. +; Second byte: screen number within that overlay. +; (for map, addition to 400, unsigned) +; (for scrolling games, = map number) +MO equ 69 * 'E' map overlay +SO equ 50 * '2' scrolling overlay +AO equ 51 * '3' arcade overlay, train +IO equ 52 * '4' intermission overlay - separate structure file, +* at least. + +; values for Game variable... +EscapeGame equ 21 +PositionPeopleGame equ 25 +PatWalkGame equ 30 ; drop into pat walking around shooting section. +MinTrackingGame equ 127 ; lowest number a game using the +; tracking maps/cd tables can have +TrackingGame equ 128 +RustlingGame equ 140 + + dc.b MO,0 ; 0 + dc.b SO+0,RustlingGame ; 1 - cows + dc.b SO+0,RustlingGame ; 2 + dc.b SO+0,RustlingGame ; 3 + dc.b SO+0,RustlingGame ; 4 + dc.b SO+0,RustlingGame ; 5 + dc.b SO+0,RustlingGame ; 6 + dc.b MO,0 ; 7 + dc.b MO,0 ; 8 + dc.b MO,0 ; 9 + dc.b MO,430-400 ; Santa Fe 10 + dc.b MO,540-400 ; White Oaks 11 + dc.b MO,500-400 ; Lincoln City 12 + dc.b MO,521-400 ; Mesilla 13 + dc.b MO,470-400 ; Roswell 14 + dc.b MO,450-400 ; El Paso 15 + dc.b MO,0 ; spare town 16 + dc.b MO,0 ; spare town 17 + dc.b MO,0 ; spare town 18 + dc.b IO+0,6 ; Fort Stanton 19 + dc.b IO+0,6 ; Fot Sumner 20 + dc.b IO+0,6 ; spare fort 21 + dc.b IO+0,6 ; spare fort 22 + dc.b IO+0,6 ; spare fort 23 + dc.b AO+0,1 ; Unknown ranch near Bitter Lake 24 + dc.b AO+0,1 ; Fritz Ranch25 + dc.b AO+0,1 ; Chisum Ranch 26 + dc.b AO+0,1 ; Dedrick Ranch 27 + dc.b AO+0,1 ; Beckwith Ranch 28 + dc.b AO+0,1 ; Reed ranch 29 + dc.b AO+0,1 ; unknown ranch 30 + dc.b AO+0,1 ; spare ranch 31 + dc.b AO+0,1 ; spare ranch 32 + dc.b AO+0,1 ; spare ranch 33 + dc.b AO+0,1 ; spare ranch 34 + dc.b IO+0,15 ; Mescalero Apache settlement 35 + dc.b IO+0,15 ; spare indians 36 + dc.b IO+0,15 ; spare indians 37 + dc.b IO+0,15 ; spare indians 38 + dc.b AO+0,21 ; train 39 + dc.b IO+0,5 ; wagon train 40 + dc.b SO+0,TrackingGame ; gang hideout: near santa fe 41 + dc.b SO+0,TrackingGame ; gang hideout: nr White Oaks 42 + dc.b SO+0,TrackingGame ; gang hideout: nr Lincoln Cit#y 43 + dc.b SO+0,TrackingGame ; gang hideout: nr Mesilla 44 + dc.b SO+0,TrackingGame ; gang hideout: nr Roswell 45 + dc.b SO+0,TrackingGame ; gang hideout: nr El Paso 46 + dc.b 0,0 ; 47 + dc.b IO+0,3 ; Prospector 48 + dc.b MO+0,0 ; 48 + dc.b MO+0,0 ; 49 + + + + +;--- + even +ENDOBJECTS +;terraintable +list8 +; +;--------- + even +NPCINITIAL +list5 +LIST4 +; new stuff added for AA + +; Menu text, etc. +; First, ptrs for all uses... + dc.w 0 ;MenuText-List4 0 + dc.w 0 ;MenuData-list4 2 + dc.w 0 ;HiresCoords-list4 4 + dc.w 0 ;ExitOffsets-list4 6 + dc.w 0 ;ObjectGraphics-list4 8 + dc.w 0 ;IntroText-list4 10 + dc.w 0 ;NounVerbTable-list4 12 + dc.w PCpalette-list4 14 + dc.w STpalette-list4 16 + dc.w 0 ;kerri-list4 18 + dc.w CGA2Palettes-list4 20 + dc.w CGA4Palettes-list4 ; 22 + dc.w 0 ; 24 + dc.w 0 ; 26 + dc.w 0 ; 28 + dc.w 0 ; 30 + dc.w 0 ; 32 + dc.w 0 ; 34 + dc.w HeightTable-list4 ; 36 + +CGA2Palettes + dc.b $0,$f,$2,$3,$4,$5,$6,$0,$8,$9,$a,$b,$c,$d,$e,$a ; 2 colour text printing + +; All these palettes have had to be modified because +; colour 6 is used for the highlight bar, so cannot be black. +; dc.b $0,$F,$F,$F,$F,$F,$0,$0,$F,$0,$9,$F,$F,$F,$0,$F ; 2 color map + dc.b $0,$F,$F,$F,$F,$F,$3,$0,$F,$0,$9,$F,$F,$F,$0,$F ; 2 color map + +; dc.b $0,$F,$F,$1,$F,$F,$1,$1,$7,$0,$F,$0,$F,$F,$9,$0 ; 2 Pat, Billy & Barbrawl + dc.b $0,$F,$F,$1,$F,$F,$1,$1,$7,$0,$F,$0,$F,$F,$9,$0 ; 2 Pat, Billy & Barbrawl + +; dc.b $0,$F,$7,$1,$F,$9,$1,$0,$7,$0,$F,$F,$F,$F,$A,$F ; 2 Outside Buildings + dc.b $0,$F,$7,$1,$F,$9,$1,$0,$7,$0,$F,$F,$F,$F,$A,$F ; 2 Outside Buildings + + dc.b $0,$F,$9,$0,$0,$0,$F,$0,$A,$A,$F,$F,$F,$F,$7,$F ; 2 Saloons + + +CGA4Palettes + dc.b $0,$F,$2,$3,$4,$5,$7,$0,$8,$9,$a,$b,$c,$d,$e,$a ; 4 colour text printing + dc.b $0,$F,$0,$F,$A,$5,$2,$0,$F,$5,$7,$0,$A,$F,$A,$A ; 4 color map + dc.b $0,$F,$F,$0,$F,$0,$0,$0,$A,$0,$5,$0,$F,$F,$5,$0 ; 4 Pat, Billy & Barbrawl + dc.b $0,$F,$A,$1,$A,$0,$F,$0,$A,$5,$5,$F,$F,$F,$A,$D ; 4 Outside Buildings + dc.b $0,$D,$A,$0,$A,$1,$F,$0,$A,$5,$5,$0,$F,$F,$D,$7 ; 4 Saloons + + +HeightTable +; used in walkabout code to go from the floor map "height adjust" +; packed byte to a value in pixels: kindof an exponential table. + dc.w -12 ;0 + dc.w -8 + dc.w -4 + dc.w 0 + dc.w 4 ;4 + dc.w 8 + dc.w 12 + dc.w 16 + dc.w 20 ;8 + dc.w 24 + dc.w 28 + dc.w 32 + dc.w 36 ;12 + dc.w 40 + dc.w 44 + dc.w 48 + + + + + + +; dc.b 0,$f,$e,$7,$f,$0,$7,$0,$8,$0,$f,$f,$f,$a,$8,$f ; town +; dc.b 0,$f,$f,$f,$0,$0,$a,$0,$8,$a,$8,$0,$0,$9,$0,$f ; people +; dc.b 0,$f,$0,$f,$0,$0,$7,$0,$a,$8,$f,$0,$e,$f,$7,$7 ; train + + +STpalette; also used for VGA +;commonm colours... +transparent equ $0000 ; ok +white equ $666F ; ok +flesh equ $6339 ;light red +Cyan equ $0346 ; ok +Violet equ $203a ; ok +Iblue equ $0263 ;light blue ok +black equ $0000 ;ok +Red equ $2008 ;dark brown ok +Blue equ $0042 ;dark blue ok +Brown equ $320C ;light brown ok +yellow equ $762D ;ok +Lgrey equ $444e; +Dgrey equ $2221 ;ok +Green equ $0304 ;dark green ok +Lgreen equ $1735; +pink equ $526c;orange 520C ;770a +Lcyan equ $0677; Pete 11/9/90 + + +;additional colours, for 'variable colours' only... + +PaleBlue1 equ $2254 +Vyellow equ $770a +;These colours must have IBM equivalents... +BlueGrey equ $223d ;(Mgrey?) +PaleBlue2 equ $3454 +PaleWhite equ $5671 + + + +PcPalette + + dc.w transparent,white,flesh,cyan + dc.w lgreen + dc.w Dgrey ; is Purple in other games. + dc.w iblue,black,Red,Blue,Brown + dc.w lcyan ; >> Pete 11/9/90 + dc.w yellow,Lgrey,Dgrey,Green + + + + + +IntroTables +; filenames for music, and other random stuff. Not necessarily +; just to do with the intro, but called that for compatability +; with the Grange intro sequence + dc.w SystemPalette-IntroTables ; 0 MapMusic-IntroTables ; 0 + dc.w SaveFilename-IntroTables ; 2 + dc.w 0 ; GunfightMusic-IntroTables ; 4 + dc.w 0 ; TrainMusic-IntroTables ; 6 + dc.w 0 ; MapMusic-IntroTables ; 8 + dc.w 0 ; 10 + dc.w StructureFilename-IntroTables ; 12 + dc.w 0 ; 14 + dc.w 0 ; 16 + dc.w AdlibFilename-IntroTables ; 18 + dc.w ExponentTableName-IntroTables ; 20 + dc.w 0 ; 22 + dc.w 0 ; 24 + dc.w 0 ; 26 + dc.w FontFilename-IntroTables ; 28 Font filename + dc.w 0 ; 30 + dc.w MenuStructures-IntroTables ; 32 + dc.w TownSpritesFilename-IntroTables ; map/town sprites filename 34 + dc.w 0 ; ScrollingSpritesFilename-IntroTables ; offset 36 + dc.w ArcadeSpritesFilename-IntroTables ; arcade games sprites filename offset 38 + dc.w 0 ; reserved for fourth sprites filename offset 40 + dc.w 0 ; MenuStructures-IntroTables ; offset 42 + dc.w ArcadeStructureFIlename-IntroTables ; 44 + dc.w 0 ; 46 + dc.w 0 ; 48 + dc.w 0 ; 50 + dc.w 0 ; 52 + dc.w 0 ; 54 + dc.w 0 ; 56 + dc.w 0 ; 58 + dc.w 0 ; 60 + dc.w 0 ; 62 + dc.w 0 ; 64 + dc.w 0 ; 66 + dc.w 0 ; 68 + dc.w LinkingSprites-IntroTables ; offset 70 + dc.w LinkingStructures-IntroTables ; offset 72 + dc.w IntroSprites-IntroTables ; offset 74 + dc.w IntroStructures-IntroTables ; offset 76 + dc.w 0 ; IdentikitSprites-IntroTables ; offset 78 + dc.w IdentikitStructures-IntroTables ; offset 80 + dc.w 0 ; 82 + dc.w 0 ; 84 + dc.w 0 + dc.w 0 + dc.w ScreenInfo-IntroTables ; offset 90 + dc.w 0 ; 92 + dc.w 0 ; 94 + dc.w 0 ; 96 + dc.w 0 ; 98 + dc.w ambushMusic-IntroTables ; 100 + dc.w BankJobMusic-IntroTables ; 102 + dc.w BarBrawlMusic-IntroTables ; 104 + dc.w CardMusic-IntroTables ; 106 + dc.w ChaseMusic-IntroTables ; 108 + dc.w DuelMusic-IntroTables ; 110 + dc.w Generic1Music-IntroTables ; 112 + dc.w Generic2Music-IntroTables ; 114 + dc.w Generic3Music-IntroTables ; 116 + dc.w Generic4Music-IntroTables ; 118 + dc.w Generic5Music-IntroTables ; 120 + dc.w GetawayMusic-IntroTables ; 122 + dc.w HoeDown1Music-IntroTables ; 124 + dc.w HoeDown2Music-IntroTables ; 126 + dc.w 0 ; HonkyMusic-IntroTables ; 128 + dc.w 0 ; Rag3Music-IntroTables ; 130 + dc.w RagTimeMusic-IntroTables ; 132 + dc.w ShockMusic-IntroTables ; 134 + dc.w ShootOutMusic-IntroTables ; 136 + dc.w ThemeMusic-IntroTables ; 138 + dc.w TrainMusic-IntroTables ; 140 + dc.w ShootOut2Music-IntroTables ; 142 + dc.w ShootOut3Music-IntroTables ; 144 + dc.w 0 ; 146 + dc.w 0 ; 148 +UghSampleNum equ 150 + dc.w UghSample-IntroTables ; 150 +Colt45SampleNum equ 152 + dc.w Colt45Sample-IntroTables ; 152 + dc.w 0 ; 154 + dc.w 0 ; 156 + dc.w 0 ; 158 + dc.w 0 ; 160 + dc.w 0 ; 162 + dc.w 0 ; 164 + dc.w 0 ; 166 + dc.w 0 ; 168 + dc.w 0 ; 170 + dc.w 0 ; 172 + dc.w 0 ; 174 + dc.w 0 ; 176 + dc.w 0 ; 178 + dc.w ShootoutSamples-IntroTables ; 180 + dc.w DuelSamples-IntroTables ; 182 + dc.w RustlingSamples-IntroTables ; 184 + dc.w TrackingSamples-IntroTables ; 186 + dc.w EscapeSamples-IntroTables ; 188 + dc.w BankJobSamples-IntroTables ; 190 + dc.w CardSamples-IntroTables ; 192 + dc.w BrawlSamples-IntroTables ; 194 + dc.w IntroSamples-IntroTables ; 196 + +ExponentTableName + dc.b 'exponent.025',0 + even + + +IntroSamples + dc.b Colt45SampleNum/2 + dc.b 0 + +ShootOutSamples +; list of sample pointers needed for shootout + dc.b Colt45SampleNum/2 + dc.b 0 + +DuelSamples + dc.b Colt45SampleNum/2 + dc.b 0 * 182 +RustlingSamples + dc.b 0 *184 +TrackingSamples + dc.b 0 ; 186 +EscapeSamples + dc.b Colt45SampleNum/2 + dc.b 0 ; 188 +BankJobSamples + dc.b 0 ; 190 +CardSamples + dc.b 0 ; 192 +BrawlSamples + dc.b UghSampleNum/2 + dc.b 0 ; 180 + +Colt45Sample dc.b 'colt45.spl',0 + even +UghSample dc.b 'ugh.spl',0 + even + + +SaveFilename dc.b 'billy.sav',0 + even + +ambushMusic dc.b 'ambushv2.mid',0 + even +BarBrawlMusic dc.b 'barbrawl.mid',0 + even +CardMusic dc.b 'cardv2.mid',0 + even +ChaseMusic dc.b 'Chasev2.mid',0 + even +DuelMusic dc.b 'duel.mid',0 + even +Generic1Music dc.b 'generic.mid',0 + even +Generic2Music dc.b 'gen2v3.mid',0 + even +Generic3Music dc.b 'generic3.mid',0 + even +Generic4Music dc.b 'generic4.mid',0 + even +Generic5Music dc.b 'generic5.mid',0 + even +HoeDown1Music dc.b 'hoedown1.mid',0 + even +HoeDown2Music dc.b 'hoedown2.mid',0 + even +;;HonkyMusic dc.b 'honky1v2.mid',0 + even +;Rag3Music dc.b 'rag3.mid',0 +; even +RagTimeMusic dc.b 'ragtime.mid',0 + even +ShockMusic dc.b 'shockv2.mid',0 + even +ShootOutMusic dc.b 'shootout.mid',0 + even +ShootOut2Music dc.b 'shootut2.mid',0 + even +ShootOut3Music dc.b 'shootut3.mid',0 + even +ThemeMusic dc.b 'map.mid',0 + even +GetawayMusic dc.b 'Getwayv3.mid',0 + even +BankJobMusic dc.b 'BankJbV2.mid',0 + even +TrainMusic dc.b 'train.mid',0 + even + + + +ArcadeSpritesFilename + dc.b 'arcades1.cmp',0 + even + +ArcadeStructureFilename + dc.b 's3.dat',0 * 'desert7.fnt',0 + even + + + +IntroSprites + dc.b 'introsp1.cmp',0 + even +IntroStructures + dc.b 'intros.dat',0 + even + +NoDelay equ 2 +LongTime equ 3000 +DefaultX equ 32 +DefaultY equ 32 +LowY equ 112 +dInsert equ 0 +dInsertR equ 2 +dRemove equ -1 +ScreenInfo +; for intro sequence: contains which picture to display, +; and for how many frames. +; parameters are: +; pic num, frames, soundtrack, repeat count for music + dc.w 99,100,HoeDown2Music-IntroTables,0 * title picture + dc.w 100, 230, RagTimeMusic-IntroTables, 0 ; street scene outside dance hall + dc.w 101, 50, music1, 0 ; blacksmith + dc.w 2001, NoDelay, DefaultX,DefaultY,dInsert + dc.w 102, 200, ChaseMusic-IntroTables, 0 ; street scene, scrolls after half time + dc.w 103, 210, music1, 0 ; possee in valley + + dc.w 104, 110, HoeDown1Music-IntroTables, 0 ; hoe down scene, dancers + dc.w 2002, NoDelay, DefaultX,DefaultY,dInsert + + dc.w 105, 300, 0, 0 ; talk 1 (inside) + dc.w 2003, NoDelay, DefaultX+16,LowY,dInsert + dc.w 2003, 79, DefaultX+16,LowY,dRemove + dc.w 2004, 100, DefaultX-16,LowY,dInsertR + dc.w 2004, 190, DefaultX-16,LowY,dRemove + dc.w 2005, 220, DefaultX+16,LowY,dInsertR + + dc.w 106, 95, HoeDown2Music-IntroTables, 0 ; talk outside + dc.w 2006, NoDelay, DefaultX+48,LowY+32,dInsert + + dc.w 107, 150, 0, 0 ; buggy from distance, scrolls. + dc.w 2007, 90, DefaultX,DefaultY,dInsertR + dc.w 2007, 100,DefaultX,DefaultY,dRemove + + dc.w 108, 70, ShootOutMusic-IntroTables, 0 ; buggy, bandit in F/G + + dc.w 109, 250, 0, 0 ; Tunstall propped on wheel + dc.w 2008, NoDelay, DefaultX,LowY,dInsert + dc.w 2008, 80, DefaultX,LowY,dRemove + dc.w 2009, 100, DefaultX,LowY,dInsertR + +; dc.w 2300, 50, RagTimeMusic-IntroTables,0 ; town scene walkabout in front of bank +; dc.w 2010, NoDelay, DefaultX,DefaultY,dInsert ; Generic text +; dc.w 2304, 50, RagTimeMusic-IntroTables,0 ; dancers +; dc.w 2011, NoDelay, DefaultX,DefaultY+16,dInsert ; Billy text +; +; dc.w 2303, 50, RagTimeMusic-IntroTables,0 ; shootout1 +; dc.w 2012, NoDelay, DefaultX,DefaultY,dInsert ; Billy Text 2 +; +; dc.w 2301, 50, RagTimeMusic-IntroTables,0 ; shop +; dc.w 2013, NoDelay, DefaultX,DefaultY,dInsert ; Pat Text 1 +; dc.w 2302, 50, RagTimeMusic-IntroTables,0 ; shootout2 +; dc.w 2014, NoDelay, DefaultX,DefaultY,dInsert ; Pat Text 2 + dc.w -1,-1,-1 + +music1 equ 0 * no music at present + + +IdentikitStructures + dc.b 'identiks.dat',0 + even + +LinkingSprites + dc.b 'linking1.cmp',0 + even + +LinkingStructures + dc.b 'linkings.dat',0 + even + + +SystemPalette +; palette for returning to system on ST ONLY +; to the ega colors. + dc.w $777f ; 0000 ; transparent/black + dc.w $0000 ; 777f ; white + dc.w $3330 ; + dc.w $0000 ; 777f ; + dc.w $0004 ; + dc.w $777a ; + dc.w $3333 ; + dc.w $7770 ; + dc.w $0008 ; + dc.w $7772 ; + dc.w $333c ; + dc.w $7776 ; + dc.w $000d ; yellow + dc.w $777e ; lgrey + dc.w $3331 ; dgrey + dc.w $7774 ; green + +;----------------------------------------- + +AdlibFilename + dc.b 'all.adl',0 + even + +TownSpritesFilename + dc.b 'sprites1.cmp',0 + even + +FontFilename + dc.b 'western.fnt',0 + even + +StructureFilename + dc.b 's.dat',0 + even + + + include 'MENUDATA.TXT',0 + + +;------------------ +TownFixedData ; a list on its own + dc.w TownPeopleData-TownFixedData ; 0 + dc.w TownData-TownFixedData ; 2 + dc.w SubPlotData-TownFixedData ; 4 + dc.w IdentikitPrototypes-TownFixedData ; 6 + + +IdentikitPrototypes +; For each person type we have a list of entries of the following +; form: +; .b First XZH (0 terminates person) +; .b Number of XZHs possible (1 upwards) +; .b First RasterOffset +; .b Number of Raster Offsets to choose from (0 upwards) + dc.w BlankPerson-TownFixedData * type 0 person + dc.w Type1Person-TownFixedData * tough cowboy + dc.w Type2Person-TownFixedData * mexican + dc.w Type3Person-TownFixedData + dc.w Type4Person-TownFixedData + dc.w Type5Person-TownFixedData + dc.w Type6Person-TownFixedData + dc.w Type7Person-TownFixedData + dc.w Type8Person-TownFixedData + dc.w Type9Person-TownFixedData + dc.w Type10Person-TownFixedData + dc.w Type11Person-TownFixedData + dc.w Type12Person-TownFixedData + dc.w Type13Person-TownFixedData + dc.w Type14Person-TownFixedData + dc.w Type15Person-TownFixedData + dc.w Type16Person-TownFixedData + dc.w Type17Person-TownFixedData + dc.w Type18Person-TownFixedData ; sick man etc. + dc.w Type19Person-TownFixedData ; mex peasant. + dc.w Type20Person-TownFixedData ; soldier + dc.w Type21Person-TownFixedData ; Clint, with cape. + +BlankPerson +* used for people like Indian chief, prospector who +* are already shown in the picture, so don't need to be +* shown separately + dc.b 0,0,0,0 + +Type1Person +* Cowboy, jerkin, black hat, moustache +* As used in room 430 (Santa Fe) + dc.b 24,1,0,1 ; neck: closed, for string tie + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,8 ; hair: not greying +; no sideburns +; no waistcoat + dc.b 27,1,3,1 ; trouser: blue jeans + dc.b 29,1,0,1 ; gunbelt + + dc.b 25,1,0,1 ; shirt + + dc.b 33,1,0,0 ; string tie +; dealer's armbands not used. + dc.b 35,1,0,1 ; jacket + dc.b 38,1,0,1 ; hands + dc.b 42,1,1,1 ; hat: always the same. + dc.b 0,0,0,0 + +Type2Person +* Mexican cross-breed, as used in 431 (Santa Fe) + dc.b 23,1,0,1 ; neck - open + dc.b 19,1,0,1 ; mexican neck overlay + dc.b 1,1,0,18 ; face + dc.b 20,1,4,1 ; top of head + dc.b 21,1,0,4 ; hair +;; dc.b 22,1,0,2 ; sideburn + dc.b 27,1,2,1 ; trousers: brown + dc.b 28,2,0,1 ; belt/gunbelt + dc.b 25,1,0,1 ; shirt +; no tie +; dealer's armbands not used. + dc.b 47,1,0,1 ; bandolero +;; dc.b 35,2,0,1 ; jacket + dc.b 45,1,0,1 ; Mexican hands + dc.b 42,1,1,2 ; hat, one of two brown ones. + dc.b 0,0,0,0 + +Type3Person +* Old male American, as used in 433 Santa Fe. + dc.b 23,1,0,1 ; neck - open collar + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,9,1 ; hair - white beard +; no sideburn + dc.b 27,1,2,1 ; trouser +; no belt + dc.b 25,1,0,1 ; shirt +; no braces + dc.b 26,1,0,1 ; brown waistcoat +; no tie +; no jacket + dc.b 38,1,0,1 ; hands + dc.b 42,1,2,1 ; hat: brown felt + dc.b 0,0,0,0 + +Type4Person +* Old male in dungarees + dc.b 23,1,0,1 ; neck - open + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,8,8 ; hair - greying + dc.b 25,1,0,1 ; shirt + dc.b 31,1,0,1 ; Dungarees + dc.b 38,1,0,1 ; hands +; no hat + dc.b 0,0,0,0 + +Type5Person +* General tough guy - used for cowboys around town, where +* I haven't put in a specific prototype for them. + dc.b 23,1,0,1 ; neck - open + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,8 ; hair: any not greying. + dc.b 22,1,0,2 ; sideburn + dc.b 27,1,0,4 ; trousers: any + dc.b 28,2,0,1 ; belt/gunbelt + dc.b 25,1,0,1 ; shirt +; no tie +; dealer's armbands not used. + dc.b 35,3,0,1 ; jacket: brown or grey. + dc.b 38,1,0,1 ; hands + dc.b 42,1,0,3 ; hat, any. + dc.b 0,0,0,0 + +Type6Person +* tough guy for 434 Santa Fe + dc.b 23,1,0,1 ; neck - open + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,8 ; hair: any not greying. +; no sideburns + dc.b 27,1,0,4 ; trousers: any + dc.b 28,2,0,1 ; belt/gunbelt + dc.b 25,1,0,1 ; shirt +; no tie +; dealer's armbands not used. + dc.b 37,1,0,1 ; jacket: grey. + dc.b 38,1,0,1 ; hands + dc.b 42,1,2,1 ; hat: brown felt + dc.b 0,0,0,0 + +Type7Person +; hostess for santa fe + dc.b 52,1,1,1 * body - yellow + dc.b 2,1,0,3 * face - reduced from choice of 7 to ensure youth! +;; dc.b 53,1,0,1 * skirt +; dc.b 54,1,0,1 * belt + dc.b 61,1,0,1 * hand with tray. + dc.b 51,1,0,1 * hair - yellow + dc.b 0,0,0,0 + +Type8Person +; older woman +; dc.b 57,1,0,2 * blouse + dc.b 52,1,0,1 * body - blue + dc.b 2,1,0,7 * face +; dc.b 56,1,0,1 * skirt +; dc.b 54,1,0,1 * belt + dc.b 63,1,0,1 * both hands - for 57 blouse + dc.b 51,1,2,1 * hair - greying + dc.b 0,0,0,0 + +Type9Person +; woman in green + dc.b 52,0,2,1 * body +; dc.b 58,1,0,1 * blouse - fits over body + dc.b 2,1,0,3 * face * reduced from 7 to reduce age +;; dc.b 59,1,0,1 * skirt + dc.b 60,1,0,1 * both hands + dc.b 51,1,0,4 * hair - any + dc.b 0,0,0,0 + +Type10Person +; Mexican with big Sombrero + dc.b 24,1,0,1 ; neck - buttoned (so can't see pink skin underneath) +;; dc.b 23,1,0,1 ; neck - open + dc.b 19,1,0,1 ; mexican neck overlay + dc.b 1,1,180,1 ; face - Mexican + dc.b 20,1,4,1 ; top of head + dc.b 21,1,0,8 ; hair: any not greying. +; dc.b 22,1,0,2 ; sideburn + dc.b 27,1,0,4 ; trousers: any + dc.b 28,2,0,1 ; belt/gunbelt + + dc.b 25,1,0,1 ; shirt +; no tie +; dealer's armbands not used. + dc.b 46,1,0,1 ; Neckerchief or similar. 1 only, else can see +; the pink skin underneath! + dc.b 35,3,0,1 ; jacket: brown or grey. + dc.b 45,1,0,1 ; Mexican hands + dc.b 41,1,0,1 ; big Sombrero + dc.b 0,0,0,0 + +Type11Person +; Shop man, soberly dressed. + dc.b 24,1,0,1 ; neck - buttoned + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,16 ; hair: any + dc.b 22,1,0,2 ; sideburn + dc.b 27,1,0,2 ; trousers: grey/dark + dc.b 28,1,0,1 ; belt + dc.b 25,1,0,1 ; shirt + dc.b 32,1,0,2 ; tie +; dealer's armbands not used. + dc.b 37,1,0,1 ; jacket: suit + dc.b 38,1,0,1 ; hands +; no hat + dc.b 0,0,0,0 + +Type12Person +; shop man, randomly dressed. + dc.b 24,1,0,1 ; neck - buttoned + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,16 ; hair: any + dc.b 22,1,0,2 ; sideburn + dc.b 27,1,0,2 ; trousers: grey/dark + dc.b 28,1,0,1 ; belt + dc.b 25,1,0,1 ; shirt + dc.b 32,2,0,2 ; tie + dc.b 26,1,0,2 ; waistcoat + +; dealer's armbands not used. + dc.b 38,1,0,1 ; hands +; no hat + dc.b 0,0,0,0 + +Type13Person +; clerk with visor, for wire/bank + dc.b 24,1,0,1 ; neck - buttoned + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,16 ; hair: any + dc.b 22,1,0,2 ; sideburn + dc.b 27,1,0,2 ; trousers: grey/dark + dc.b 28,1,0,1 ; belt + dc.b 25,1,0,1 ; shirt + dc.b 32,1,0,2 ; tie + dc.b 26,1,0,2 ; waistcoat +; dealer's armbands not used. + dc.b 38,1,0,1 ; hands + dc.b 40,1,0,1 ; visor +; no hat + dc.b 0,0,0,0 + +Type14Person +; lady in green skirt, as walking all over the place. + dc.b 52,1,2,1 * body +; dc.b 58,1,0,1 * green blouse - fits over body + dc.b 2,1,0,7 * face +;; dc.b 59,1,0,1 * skirt + dc.b 60,1,0,1 * both hands + dc.b 51,1,0,4 * hair - any + dc.b 0,0,0,0 + +Type15Person +; lady in blue skirt, as walking all over the place. + dc.b 52,1,0,1 * body + dc.b 58,1,0,1 * blouse - fits over body + dc.b 2,1,0,7 * face +;; dc.b 59,1,0,1 * skirt + dc.b 60,1,0,1 * both hands + dc.b 51,1,0,4 * hair - any + dc.b 0,0,0,0 + +Type16Person +; barman (e.g. Santa Fe) + dc.b 24,1,0,1 ; neck - buttoned + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,8 ; hair: any non-greying + dc.b 22,1,0,2 ; sideburn + dc.b 27,1,0,2 ; trousers: grey/dark + dc.b 25,1,0,1 ; shirt + dc.b 30,1,0,1 ; braces + dc.b 32,2,0,2 ; tie + dc.b 34,1,0,1 ; dealer's armbands (around elbow). Must be before waistcoat + dc.b 26,1,0,1 ; waistcoat: brown + dc.b 38,1,0,1 ; hands +; no hat + dc.b 0,0,0,0 + + +Type17Person +* tough guy in saloon for 560 Santa Fe + dc.b 23,1,0,1 ; neck - open + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,8 ; hair: any not greying. +; no sideburns + dc.b 27,1,0,4 ; trousers: any + dc.b 28,2,0,1 ; belt/gunbelt + dc.b 25,1,0,1 ; shirt +; no tie +; dealer's armbands not used. + dc.b 37,1,0,1 ; jacket: grey. + dc.b 38,1,0,1 ; hands +; no hat + dc.b 0,0,0,0 + +Type18Person +* sick man or poor peasant - e.g. in desert + dc.b 23,1,0,1 ; neck - open + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,8,7 ; hair: any greying. + dc.b 22,1,0,2 ; sideburn + dc.b 27,1,2,2 ; trousers: brown/blue + dc.b 25,1,0,1 ; shirt +; no tie +; dealer's armbands not used. + dc.b 35,1,0,1 ; jacket: jerkin + dc.b 38,1,0,1 ; hands +; no hat + dc.b 0,0,0,0 + +Type19Person +* mexican peasant - e.g. in desert. + dc.b 24,1,0,1 ; neck - buttoned (so can't see pink skin underneath) + dc.b 19,1,0,1 ; mexican neck overlay + dc.b 1,1,180,1 ; face + dc.b 20,1,4,1 ; top of head + dc.b 21,1,0,7 ; hair: any not greying. +; no sideburns + dc.b 27,1,2,2 ; trousers: brown/blue + dc.b 25,1,0,1 ; shirt + dc.b 45,1,0,1 ; Mexican's hands + dc.b 46,1,0,1 ; Neckerchief or similar. 1 only, else can see +; the pink skin underneath! +; dealer's armbands not used. + dc.b 35,1,0,1 ; jacket: jerkin + dc.b 45,1,0,1 ; Mexican hands + dc.b 41,1,0,1 ; big Sombrero + dc.b 0,0,0,0 + +Type20Person +; Soldier for forts + dc.b 44,1,0,1 ; complete corporal except face + dc.b 1,1,0,18 ; face + dc.b 0,0,0,0 + +Type21Person +* Clint Eastwood look alike - with cape. e.g. 436 Santa Fe. + dc.b 23,1,0,1 ; neck - open + dc.b 1,1,0,18 ; face + dc.b 20,1,0,4 ; top of head + dc.b 21,1,0,8 ; hair: any not greying. +; no sideburns + dc.b 27,1,0,4 ; trousers: any + dc.b 28,2,0,1 ; belt/gunbelt + dc.b 25,1,0,1 ; shirt + dc.b 49,1,0,1 ; cape + dc.b 38,1,0,1 ; hands + dc.b 42,1,2,1 ; hat: brown felt + dc.b 0,0,0,0 + + + +; + dc.b 0,0,0,0 + + +; people type is only currently used to give people +; a name of the right sex. + +YAM equ 0 ; young american male +OAM equ 1 ; old american male +YAF equ 2 ; young american female +OAF equ 3 ; old american female + +YMM equ 4 ; young Mexican male +OMM equ 5 ; old Mexican male +YMF equ 6 ; young Mexican female +OMF equ 7 ; old Mexican female + +YIM equ 8 ; young Indian male +OIM equ 9 ; old Indian male +YIF equ 10 ; young Indian female +OIF equ 11 ; old Indian female + +TownPeopleData +; 8 bytes per person: initial data for all people. +; Because people who have small versions need to go +; into Hires() at run-time: it is important to fit +; all these people into the first 50-or-so objects. +; Otherwise the amount of memory required for ObjectTable() is going +; to increase. + +ML equ 200 +; Room number is either: +; - room number in walkabout section - e.g. 30..50 for Santa Fe +; - or for map locations: ML+"LOCATION". These are mutually exclusive + + +PB equ 620 * base for people's xzh objects +DefaultMenu equ 0 * menu number divided by 2 +Default2ndMenu equ 0 * menu number divided by 2: this is +* the menu it goes to if we get back to the default menu +NoPerson equ 254 ; room number for a person which doesn't exist + +; Names - at message 1000+number specified +WhiskeyPete equ 160 +JoeDunn equ 161 +NedParkin equ 162 +KarlBekkert equ 163 +JackShoe equ 164 +BenDavis equ 165 +WarrenOaks equ 166 +WayneRodgers equ 167 +AshUpton equ 168 +ChiefHow equ 169 +RickSands equ 170 +RickRider equ 171 + +LauraPicket equ 210 +WilmaKatz equ 211 +MissRosy equ 212 +LaviniaStrumpet equ 213 ;**** not present. +MrsMcSween equ 214 +girlfriend equ 215 + +NoName equ 0 + +; person 0 (not used...) + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations / 2 + dc.b 1 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 1 430 Santa Fe: Jerkin guy leaning S. + dc.b 30 ; room number in which person appears =255 for end of this table. + dc.b 620-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations / 2 + dc.b 1 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 2 431 Santa Fe: Waistcoat guy sitting S + dc.b 31 ; room number in which person appears =255 for end of this table. + dc.b 621-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneNeedsHelpMenu/2 ; Current menu to use in conversations + dc.b 2 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 3 433 Santa Fe: Old guy Waistcoat, sitting S. + dc.b 33 ; room number in which person appears =255 for end of this table. + dc.b 622-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 3 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 4 434 Santa Fe Guy Leaning S, flipping coin. + dc.b 34 ; room number in which person appears =255 for end of this table. + dc.b 623-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneNeedsHelpMenu/2 ; Current menu to use in conversations + dc.b 6 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 5 - 435 Santa Fe: Mexican sitting S + dc.b 35 ; room number in which person appears =255 for end of this table. + dc.b 628-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 10 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 6 436 Santa Fe: Clint, leaning E + dc.b 36 ; room number in which person appears =255 for end of this table. + dc.b 623-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 21 ; identikit type prototype to use - caped! + dc.b Default2ndMenu,NoName,0,YAM + +; person 7 437 Santa Fe: Guy sitting E. + dc.b 37 ; room number in which person appears =255 for end of this table. + dc.b 622-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 8: 432 Santa Fe: lady green skirt + dc.b 32 ; room number in which person appears =255 for end of this table. + dc.b 640-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneNeedsHelpMenu/2 ; Current menu to use in conversations + dc.b 14 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAF + +; person 9: 450 El Paso: Lady standing S. + dc.b 50 ; room number in which person appears =255 for end of this table. + dc.b 638-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneNeedsHelpMenu/2 ; Current menu to use in conversations + dc.b 8 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,OAF + +; person 10: 451 El Paso: Rocker + dc.b 51 ; room number in which person appears =255 for end of this table. + dc.b 635-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 4 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,OAM + +; person 11: 453 El Paso: Mexican Sitting S + dc.b 53 ; room number in which person appears =255 for end of this table. + dc.b 628-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 10 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 12: 455 El Paso: Mexican Sitting S + dc.b 55 ; room number in which person appears =255 for end of this table. + dc.b 628-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 10 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 13: 470 Roswell: Guy sitting E + dc.b 70 ; room number in which person appears =255 for end of this table. + dc.b 632-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 14: 472 Roswell: Lady green Skirt. + dc.b 72 ; room number in which person appears =255 for end of this table. + dc.b 640-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneNeedsHelpMenu/2 ; Current menu to use in conversations + dc.b 14 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAF + +; person 15: 473 Roswell: Lady standing S. + dc.b 73 ; room number in which person appears =255 for end of this table. + dc.b 638-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneNeedsHelpMenu/2 ; Current menu to use in conversations + dc.b 8 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,OAF + +; person 16: 501 Lincoln City: Lady standing S. + dc.b 101 ; room number in which person appears =255 for end of this table. + dc.b 638-PB ; xzh number used to represent person (0 if none, or any +; xzh + dc.b SomeoneNeedsHelpMenu/2 ; Current menu to use in conversations + dc.b 8 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,OAF + +; person 17: 502 Lincoln City: Rocker + dc.b 102 ; room number in which person appears =255 for end of this table. + dc.b 15 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 4 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,OAM + +; person 18: 504 Lincoln City: Lady Blue Skirt + dc.b 104 ; room number in which person appears =255 for end of this table. + dc.b 641-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b WidowWomanMenu/2 ; Current menu to use in conversations + dc.b 15 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAF + +; person 19: 504 Lincoln City: rocker + dc.b 104 ; room number in which person appears =255 for end of this table. + dc.b 636-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 4 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,OAM + +; person 20: 522 Mesilla: Lady Green Skirt + dc.b 122 ; room number in which person appears =255 for end of this table. + dc.b 640-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b WidowWomanMenu/2 ; Current menu to use in conversations + dc.b 14 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAF + +; person 21: 523 Mesilla: Guy leaning S, flipping a coin. + dc.b 4 ; room number in which person appears =255 for end of this table. + dc.b 624-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 6 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 22: 540 White Oaks: Rocker + dc.b 140 ; room number in which person appears =255 for end of this table. + dc.b 635-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 3 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,OAM + +; person 23: Undertaker Santa Fe + dc.b 1 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 11 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 24: Undertaker El Paso + dc.b 2 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 11 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 25: Undertaker Roswell + dc.b 3 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 26: Wire office man Santa Fe + dc.b 5 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 27: Wire Office man El Paso + dc.b 6 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 28: News office man Santa Fe + dc.b 8 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 29: News office man El Paso + dc.b 9 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 30: News office man White oaks + dc.b 10 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 31: bank Santa Fe + dc.b 12 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 26/2 ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 32: bank El Paso + dc.b 13 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 33: bank Roswll + dc.b 14 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 26/2 ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 34: bank Lincoln City + dc.b 15 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 26/2 ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 35: bank Mesilla + dc.b 16 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 26/2 ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 36: bank White Oaks + dc.b 17 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 26/2 ; Current menu to use in conversations + dc.b 13 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 37: Livery person Santa Fe + dc.b 19 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 4 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 38: Livery person El Paso + dc.b 20 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 4 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 39: Livery person Licoln City + dc.b 21 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 4 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 40: Livery person White Oaks + dc.b 22 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SomeoneWasLookingMenu/2 ; Current menu to use in conversations + dc.b 4 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 41: Doctors El Paso + dc.b 24 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 11 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 42: Doctors Mesilla + dc.b 25 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 11 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 43: Store man El Paso + dc.b 60 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 44: Murphy Dolan Man in Lincoln + dc.b 62 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 156/2 ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 45: Store Man Roswell - Ash Upton + dc.b 61 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b AshUptonMenu/2 ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,AshUpton,0,YAM + +; person 46: Store man White Oaks + dc.b 63 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 47: unused + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 48: Laura Picket at Hotel in El Paso + dc.b 66 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b LauraPicketMenu/2 ; Current menu to use in conversations + dc.b 9 ; identikit type prototype to use + dc.b Default2ndMenu,LauraPicket,0,YAM + +; person 49: girl in house/Lincoln City + dc.b 69 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b GirlFriendMenu/2 ; Current menu to use in conversations + dc.b 9 ; identikit type prototype to use + dc.b Default2ndMenu,Girlfriend,0,YAF + +; person 50: hostess in Santa Fe Saloon (560) + dc.b 160 ; room number in which person appears =255 for end of this table. + dc.b 639-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 14/2 ; Current menu to use in conversations + dc.b 7 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAF + + +; person 51: Store man Santa Fe + dc.b 64 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations + dc.b 12 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + + +; person 52: barman in Santa Fe. + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 12/2 ; Current menu to use in conversations + dc.b 16 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + + + + + +; people to meet at random in desert have room numbers 190..197 + + + + +; people that either Pat or Billy can meet... +; person 53: person to meet at random in desert by Anglo farmers. +; peasant being run off land + dc.b 190 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 50/2 ; Current menu to use in conversations + dc.b 19 ; identikit type prototype to use (Mexican peasant) + dc.b Default2ndMenu,NoName,0,YAM + +; person 54: person to meet at random in desert. +; mexican being picked on. + dc.b 191 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 58/2 ; Current menu to use in conversations + dc.b 19 ; identikit type prototype to use (peasant) + dc.b Default2ndMenu,NoName,0,YAM + +; person 55: person to meet at random in desert. +; sick man + dc.b 192 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 58/2 ; Current menu to use in conversations + dc.b 19 ; identikit type prototype to use (Mexican) + dc.b Default2ndMenu,NoName,0,YAM + +; person 56: person to meet at random in desert. + dc.b 193 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 62/2 ; Current menu to use in conversations + dc.b 18 ; identikit type prototype to use (sick man) + dc.b Default2ndMenu,NoName,0,YAM + + + + + +; people that only Billy can meet... +; person 57: person to meet at random in desert. +; peasant wants help nursing his family + dc.b 194 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 104/2 ; Current menu to use in conversations + dc.b 19 ; identikit type prototype to use (peasant with sick family) + dc.b Default2ndMenu,NoName,0,YAM + + + +; person 58: person to meet at random in desert. +++UNUSED+++ + dc.b NoPerson ; 195 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; people that only Pat can meet... +; person 59: person to meet at random in desert. +; Texan possee + dc.b 196 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 76/2 ; Current menu to use in conversations + dc.b 6 ; identikit type prototype to use (Possee representative) + dc.b Default2ndMenu,NoName,0,YAM + +; person 60: person to meet at random in desert. +; Barney Mason + dc.b 197 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 80/2 ; Current menu to use in conversations + dc.b 5 ; identikit type prototype to use (Barney Mason) + dc.b Default2ndMenu,NoName,0,YAM + +; person 61: person to meet at random in desert. +++UNUSED+++ + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 62: person to meet at random in desert. +++UNUSED+++ + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 63: woman being bothered by a gunslinger in saloon. El Paso 2 + dc.b 168 ; room number in which person appears =255 for end of this table. + dc.b 637-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 54/2 ; Current menu to use in conversations + dc.b 9 ; identikit type prototype to use (young Woman Green Skirt) + dc.b Default2ndMenu,NoName,0,YAF + +; person 64 560 Santa Fe (Saloon): guy drinking at bar. Shirt/brown trousers +; Ned Parkin + dc.b 160 ; room number in which person appears =255 for end of this table. + dc.b 630-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b NedParkinMenu/2 ; Current menu to use in conversations / 2 + dc.b 1 ; identikit type prototype to use + dc.b Default2ndMenu,NedParkin,0,YAM + +; person 65 560 Santa Fe (Saloon): guy at table. Grey jack/jeans + dc.b 160 ; room number in which person appears =255 for end of this table. + dc.b 629-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b BenDavisMenu/2 ; Current menu to use in conversations / 2 + dc.b 17 ; identikit type prototype to use + dc.b Default2ndMenu,BenDavis,0,YAM + +; person 66 562 Santa Fe (Saloon): guy at table. Grey jack/brown trousers + dc.b 160 ; room number in which person appears =255 for end of this table. + dc.b 627-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b CardGameMenu/2 ; Current menu to use in conversations / 2 + dc.b 17 ; identikit type prototype to use + dc.b Default2ndMenu,KarlBekkert,0,YAM + +; person 67 soldier at Fort Stanton + dc.b ML+19 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 132/2 ; Current menu to use in conversations: get lost + dc.b 20 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 68 soldier at Fort Sumner + dc.b ML+20 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 66/2 ; Current menu to use in conversations: army being cheated + dc.b 20 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 69 - at Bitter lake ranch + dc.b ML+24 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 132/2 ; Current menu to use in conversations: get lost + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 70 - at Fritz Ranch + dc.b ML+25 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 132/2 ; Current menu to use in conversations: get lost + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 71 - at Chisum Ranch + dc.b ML+26 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 132/2 ; Current menu to use in conversations: get lost + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 72 - Dedrick Ranch + dc.b ML+27 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b DefaultMenu ; Current menu to use in conversations - Indians not getting beef + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 73 - at Beckwith Ranch + dc.b ML+28 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 132/2 ; Current menu to use in conversations: get lost + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 74 - Mrs McSween - at Tunstall Ranch + dc.b ML+29 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 134/2 ; Current menu to use in conversations - Indians not getting beef + dc.b 15 ; identikit type prototype to use + dc.b Default2ndMenu,MrsMcSween,0,OAF + + +; person 75 - at Reed Ranch + dc.b ML+30 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 132/2 ; Current menu to use in conversations: get lost + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + + +; person 76 - Indian chief at Mescalero + dc.b ML+35 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 92/2 ; Current menu to use in conversations - Indians not getting beef + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,ChiefHow,0,OIM + + +; person 77 - prospector + dc.b ML+48 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b ProspectorMenu/2 ; Current menu to use in conversations - prospector + dc.b 0 ; identikit type prototype to use + dc.b 136/2,WhiskeyPete,0,YAM + +; person 78 - Joe Grant. +; appears in saloon in Santa Fe (triggered by WALKABOUT.TXT) + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 128/2 ; Current menu to use in conversations - Indians not getting beef + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; A few special objects which you can select in town - e.g. +; the wanted posters. +; person - 79 - wanted poster. Not Very talkative! + dc.b 0 ; room number in which person appears =255 for end of this table. + dc.b 642-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations - Indians not getting beef + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,0 + +; person - 80 - object + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations - Indians not getting beef + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,0 + +; person - 81 - object + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations - Indians not getting beef + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,0 + +; person - 82 - object + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations - Indians not getting beef + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,0 + +; person - 83 - object + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations - Indians not getting beef + dc.b 0 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,0 + +; person 84 - gambler + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 1 ; object number used to represent person (should be 2658) + dc.b CardGameMenu/2 ; Current menu to use in conversations + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,0,0,OAF + + + +; person 85 - Jose Miguel thingy +; interrupts player looking at map + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; default menu to use in conversations + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 86 - guy at bar in Santa Fe 2 (LHS): +; grey jacket, blue jeans, brown hat, blue neckerchief + dc.b 170 ; room number in which person appears =255 for end of this table. + dc.b 631-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SpillDrinkMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 87 - guy at bar in Santa Fe 2 (LHS): +; Grey jacket, brown waistcoat, grey jacket. Cigarette in mouth +;' grey hat + dc.b 170 ; room number in which person appears =255 for end of this table. + dc.b 633-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; default menu to use in conversations + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + + +; person 88 - guy at bar in El Paso 1 (LHS): +; Grey jacket, blue jeans, blue neckerchief, brown hat + dc.b 166 ; room number in which person appears =255 for end of this table. + dc.b 631-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b JackShoeMenu/2 ; default menu to use in conversations + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,JackShoe,0,YAM + + +; person 89 - guy at bar in El Paso 1 (LHS): +; Grey jacket, brown waistcoat, grey jacket. Cigarette in mouth +;' grey hat + dc.b 166 ; room number in which person appears =255 for end of this table. + dc.b 633-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b CardGameMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + + +; person 90 566 El Paso (Saloon): guy at table. Grey jack/blue trousers + dc.b 166 ; room number in which person appears =255 for end of this table. + dc.b 629-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SpillDrinkMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 91 568 El Paso (Saloon 2): guy at table. Grey jack/brown trousers + dc.b 168 ; room number in which person appears =255 for end of this table. + dc.b 627-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,RickSands,0,YAM + + +; person 92 574 Roswell (Saloon): guy at bar. Brown jacket, grey +; trousers, white neckerchief, brown hat. + dc.b 174 ; room number in which person appears =255 for end of this table. + dc.b 630-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b BenDavisMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 93 574 Roswell (Saloon): guy at table +; trousers, white neckerchief, brown hat. + dc.b 174 ; room number in which person appears =255 for end of this table. + dc.b 627-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b CardGameMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 94 573 Roswell (Saloon): guy at table +; tbrown trousers, grey jacket, blue neckerchief, brown hat + dc.b 173 ; room number in which person appears =255 for end of this table. + dc.b 627-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b RickRiderMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,RickRider,0,YAM + +; person 95 573 Roswell (Saloon): guy at table +; grey trousers, grey jacket, brown waistcoat, grey hat + dc.b 173 ; room number in which person appears =255 for end of this table. + dc.b 633-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 95 565 Lincoln city (Saloon): guy at table +; blue trousers, grey jacket, grey hat + dc.b 165 ; room number in which person appears =255 for end of this table. + dc.b 629-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b CardGameMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 96 565 Lincoln city (Saloon): guy at table +; grey trousers, grey jacket, brown waistcoat, grey hat + dc.b 165 ; room number in which person appears =255 for end of this table. + dc.b 633-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + +; person 97 565 Lincoln city (Saloon): guy at bar +; grey trousers, brown jacket, brown hat + dc.b 165 ; room number in which person appears =255 for end of this table. + dc.b 630-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b SpillDrinkMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + + +; person 98 569 Mesilla (Saloon): guy at table +; blue trousers, grey jacket, grey hat + dc.b 169 ; room number in which person appears =255 for end of this table. + dc.b 629-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b CardGameMenu/2 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,WarrenOaks,0,YAM + + +; person 99 572 White Oaks (Saloon): guy at table +; grey trousers, brown jacket, brown hat +; Slightly Mexican appearance, with big black moustache + dc.b 172 ; room number in which person appears =255 for end of this table. + dc.b 634-PB ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,WayneRodgers,0,YAM + + +; person 100 Tom O'Foliard +; grey trousers, grey jacket, brown waistcoat, grey hat + dc.b NoPerson ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b 0 ; Current menu to use in conversations / 2 + dc.b 5 ; identikit type prototype to use + dc.b Default2ndMenu,NoName,0,YAM + + + +; person 101 - Wilma Katz - at Katz farmhouse (31) + dc.b ML+31 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b WilmaKatzMenu/2 ; Current menu to use in conversations + dc.b 15 ; identikit type prototype to use + dc.b Default2ndMenu,WilmaKatz,0,OAF + +; person 102 - at Dunn Farmhouse (32) + dc.b ML+32 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b LonelyFarmhouseMenu/2 ; Current menu to use in conversations + dc.b 15 ; identikit type prototype to use + dc.b Default2ndMenu,MrsMcSween,0,OAF + +; person 103 - at Rose Farmhosue (33) + dc.b ML+33 ; room number in which person appears =255 for end of this table. + dc.b 0 ; xzh number used to represent person (0 if none, or any +; xzh within range 620..650) + dc.b LonelyFarmhouseMenu/2 ; Current menu to use in conversations + dc.b 15 ; identikit type prototype to use + dc.b Default2ndMenu,MissRosy,0,OAF + + + dc.b 255 ; end of table. + + + +TownData +; 16 bytes per town +; town 10: Santa Fe + dc.w 10 ; increase in gold per time unit. + dc.w 200 ; maximum level of gold in the bank. + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + +; town 11: White Oaks + dc.w 3 ; increase in gold per time unit. + dc.w 50 ; maximum level of gold in the bank. + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + +; town 12: Lincoln City + dc.w 3 ; increase in gold per time unit. + dc.w 50 ; maximum level of gold in the bank. + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + +; town 13: Mesilla + dc.w 3 ; increase in gold per time unit. + dc.w 50 ; maximum level of gold in the bank. + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + +; town 14: Roswll + dc.w 3 ; increase in gold per time unit. + dc.w 50 ; maximum level of gold in the bank. + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + +; town 15: El Paso + dc.w 8 ; increase in gold per time unit. + dc.w 150 ; maximum level of gold in the bank. + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + dc.w 0 + + +SubPlotData +; There is a table containing all the bits of information +; people may want to know about: in TownVarData. +; This is initialised from a table of identical format +; in TownFixedData (except that offsets are relative to the +; start of this little table, wheras in TownVarData they +; are relative to TownVarData). The copy routine makes the +; appropriate conversion. +; +; 10 pointers at start... + dc.w EndSubPlotData-SubPlotData + dc.w SPMoney-SubPlotData ; .w Offset of "Money Location" information. + dc.w SPDeputies-SubPlotData ; .w Offset of "Deputies Location" information. + dc.w SPGangs-SubPlotData ; .w Offset of "Gang Location" information + dc.w SPRobbery-SubPlotData ; .w Offset of "Recent robbery" information + dc.w SPSubPlots-SubPlotData ; .w Offset of sub-plot table. + dc.w SPHidden-SubPlotData ; .w Offset of "Hidden things" table for map + dc.w CommsInfo-SubPlotData ; .w offset of "things the other computer wants +; to know about. + dc.w 0 + dc.w 0 + dc.w 0 + +CommsInfo + dc.b 0 * not used + dc.b 0 * LOCATION of pat + dc.b 0 * LOCATION of Billy + + even + +SPHidden +; table for map containing one byte for every object on map. +; If zero, it will be displayed (unless overridden elsewhere) +; If one, it will be hidden. This is used for making e.g. +; farmhouses disappear after we've used their subplots + dc.b 0,0,0,0,0,0,0,0 ; 0..7 + dc.b 0,0,0,0,0,0,0,0 ; 8..15 + dc.b 0,0,0,0,0,0,0,0 ; 16..23 + dc.b 0,0,0,0,0,0,0,0 ; 24..31 + dc.b 0,0,0,0,0,0,0,0 ; 32..39 + dc.b 0,0,0,0,0,0,0,0 ; 40..47 + dc.b 0,0,0,0,0,0,0,0 ; 48..55 + + +; First word in every entry is 0 if nothing to know. +; 255. if hidden (doesn't appear on map) but can be told to player, +; 254. if hidden (doesn't appear on map) and cannot be told to player. +; non-zero if there is some piece +; of information that may be required. +; Second word is a numerical parameter for several of the +; items. These are coded specially. +; Third and fourth words unused presently. +; fourth to seventh words are four message numbers to print, +; in order. If =FFFF print the numeric parameter. +; If <10, print the appropriate paramter, numbered from +; 2 in steps of 2. - it will be a location name, to choose the message +; from 1000... + +SPMoney + dc.w 1,1000,0,0,966,1010,0,0 ; .w,.w Gold in Bank at town 0 + dc.w 1,400,0,0,966,1011,0,0 ; .w,.w Gold in Bank at town 1 + dc.w 1,400,0,0,966,1012,0,0 ; .w,.w Gold in Bank at town 2 + dc.w 1,400,0,0,966,1013,0,0 ; .w,.w Gold in Bank at town 3 + dc.w 1,400,0,0,966,1014,0,0 ; .w,.w Gold in Bank at town 4 + dc.w 1,400,0,0,966,1015,0,0 ; .w,.w Gold in Bank at town 5 + dc.w -1,-1 + +SPDeputies + dc.w 1,2,0,0,972,$ffff,973,1010 ; .w,.w Number of deputies in town 0 + dc.w 1,0,0,0,972,$ffff,973,1011 ; .w,.w Number of deputies in town 1 + dc.w 1,0,0,0,972,$ffff,973,1012 ; .w,.w Number of deputies in town 2 + dc.w 1,0,0,0,972,$ffff,973,1013 ; .w,.w Number of deputies in town 3 + dc.w 1,0,0,0,972,$ffff,973,1014 ; .w,.w Number of deputies in town 4 + dc.w 1,0,0,0,972,$ffff,973,1015 ; .w,.w Number of deputies in town 5 + dc.w -1,-1 + +SPGangs + dc.w 1,0,0,0,962,1041,965,1010 ; .w,.w Gang location 0 + dc.w 255,1,0,0,962,1042,965,1011 ; .w,.w Gang location 1 + dc.w 255,2,0,0,962,1043,965,1012 ; .w,.w Gang location 2 + dc.w 255,3,0,0,962,1044,965,1013 ; .w,.w Gang location 3 + dc.w 255,4,0,0,962,1045,965,1014 ; .w,.w Gang location 4 + dc.w 255,5,0,0,962,1046,965,1015 ; .w,.w Gang location 5 + dc.w -1,-1 + +SPRobbery + dc.w 41,10,0,0,962,2,963,4 ; default - cooper gang/Santa Fe. + dc.w -1,-1 + +SPSubPlots +; .w,.w Sub-plot? + dc.w 0,0,0,0,0,0,0,0 + dc.w -1,-1 + + +EndSubPlotData + +;----------------- + +ENDTABLE +;--------- + END + diff --git a/l9dev/regress/games.l9/billy.l9/vector.txt b/l9dev/regress/games.l9/billy.l9/vector.txt new file mode 100644 index 0000000..760608d --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/vector.txt @@ -0,0 +1,86 @@ +;.MCInitGraphics data @Dummy,@Dummy,@Dummy ;45 +;.MCCalcMatrix data @Dummy,@Dummy,@Dummy ;46 +;.MCDrawVector data @Dummy,@Dummy,@Dummy ;47 + +const + WordVectorX=62 + WordVectorY=64 + WordVectorZ=60 + +var + VectorZSpeed VectorYSpeed VectorXSpeed + +begin + + +cif ST ;***** + +;--- +.VectorDemo + gosub @MCInitGraphics + VectorZSpeed=8 ;* 1 ; speed + VectorYSpeed=32 ;* 1 ; speed + VectorXSpeed=64 ;* 1 ; speed +.MikeLoop + gosub @DisplayEverything ;***** @BuildAndDisplayFrame ;***** + + &dx1=WordWS(WordVectorX) + add dx1,VectorXSpeed + &WordWS(WordVectorX)=dx1 + &dx1=WordWS(WordVectorZ) + add dx1,VectorZSpeed + &WordWS(WordVectorZ)=dx1 + &dx1=WordWS(WordVectorY) + add dx1,VectorYSpeed + &WordWS(WordVectorY)=dx1 + + gosub @MCOsrdch + if v2<>2 then NotIncreaseX + add VectorXSpeed,VectorXSpeed +.NotIncreaseX + if v2<>3 then NotIncreaseZ + add VectorZSpeed,VectorZSpeed +.NotIncreaseZ + if v2<>4 then NotIncreaseY + add VectorYSpeed,VectorYSpeed +.NotIncreaseY + if v2<>5 then NotResetSpeed + VectorXSpeed=1 + VectorZSpeed=1 + VectorYSpeed=1 + +.NotResetSpeed + +;*Joystick... + c8=8 + v1=ByteWS(BytejoystickStatus) + if v1<>4 then NotJLeft +; if VectorXspeed=c0 then NotJLeft + VectorXspeed=0 ; sub VectorXSpeed,c8 +.NotJLeft + if v1<>8 then NotJRight + VectorXSpeed=500 ; add VectorXSpeed,c8 +.NotJRight + + if v1<>2 then NotDown +; if VectorYspeed=c0 then NotDown + VectorYSpeed=0 ; sub VectorYSpeed,c8 +.NotDown + if v1<>1 then NotJUp + VectorYspeed=500 ; add VectorYSpeed,c8 +.NotJUp + + if v1<>130 then NotFireDown +; if VectorZspeed=c0 then NotFireDown + VectorZspeed=0 ; sub VectorZSpeed,c8 +.NotFireDown + if v1<>129 then NotFireUp + VectorZspeed=500 ; add VectorZSpeed,c8 +.NotFireUp + +; v2=hikey + if v2=1 then @Menu ;*** @MCCloseDown + if v2=0 then @MikeLoop + goto @MikeLoop + +cend ;***** \ No newline at end of file diff --git a/l9dev/regress/games.l9/billy.l9/vectors.txt b/l9dev/regress/games.l9/billy.l9/vectors.txt new file mode 100644 index 0000000..c38c002 --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/vectors.txt @@ -0,0 +1,274 @@ +; VECTORS.TXT +; +; vectors to get over long-jump limitations. Compile +; as near to the middle of your program (by code size) +; as possible + begin +.MCHeroOnceOnlyInit goto @vMCHeroOnceOnlyInit +.MCHeroInit goto @vMCHeroInit +.MCClearScreen goto @vMCClearScreen + +.MCMoveScreen goto @vMCMoveScreen +.MCSpecials goto @vMCSpecials +.MCBuildBackground goto @vMCBuildBackground +.MCDisplayDestroyedWalls goto @vMCDisplayDestroyedWalls +.MCMoveAllSprites goto @vMCMoveAllSprites +.MCDisplayAllSprites goto @vMCDisplayAllSprites +.MCTrimEdges goto @vMCTrimEdges +.MCDisplayTextLine goto @vMCDisplayTextLine +.MCDisplayUpperTextLine goto @vMCDisplayUpperTextLine +.MCDoAllTimers goto @vMCDoAllTimers +.MCCalculateMemoryFree goto @vMCCalculateMemoryFree +.MCHeroInput goto @vMCHeroInput +.MCOswrchV1 goto @vMCOswrchV1 +.MCInvertedOswrchV1 goto @vMCInvertedOswrchV1 +.MCDestroyTempMoved goto @vMCDestroyTempMoved +.MCDestroyTempFixed goto @vMCDestroyTempFixed +.MCCloseDown goto @vMCCloseDown +.MCFindSprite goto @vMCFindSprite +.MCSetUpNewSprite goto @vMCSetUpNewSprite +.MCSprite goto @vMCSprite +.MCHandlePlayerInput goto @vMCHandlePlayerInput +.MCReturnFrameTime goto @vMCReturnFrameTime +.MCUpdateFrameTime goto @vMCUpdateFrameTime +.MCClearRectangle goto @vMCClearRectangle +.MCMapBuildBackground goto @vMCMapBuildBackground +.MCPreScrollMap goto @vMCPreScrollMap +.MCSpecialCheck goto @vMCSpecialCheck +.MCStartBigExplosion goto @vMCStartBigExplosion +.MCScrollTextLine goto @vMCScrollTextLine +.MCReCalcSpriteGraphics goto @vMCReCalcSpriteGraphics +.MCOsrdch goto @vMCOsrdch +.MCChecksum goto @vMCChecksum +.MCEmptyRoom +.MCInit3D goto @vMCEmptyRoom +.MCDrawObjectV1 goto @vMCDrawObjectV1 +.MCBuildRoom +.MCBuildViewMap goto @vMCBuildRoom + +.MCDisplayRoom +.MCDisplayViewMap goto @vMCDisplayRoom + +.MCInitBootPrg goto @vMCInitBootPrg +.MCReturnSpriteAddress goto @vMCReturnSpriteAddress +.MCNoClipSprite goto @vMCNoClipSprite +.MCCalcScreenAddress goto @vMCCalcScreenAddress +.MCSaveFile goto @vMCSaveFile +.MCLoadFile goto @vMCLoadFile +.MCCopy goto @vMCCopy +.MCAbsChangeListPtr goto @vMCAbsChangeListPtr +.MCLoadCells goto @vMCLoadCells +.MCSetUpPtrs goto @vMCSetUpPtrs +.MCParseInputWord goto @vMCParseInputWord +.MCInitTask goto @vMCInitTask +.MCSnooze goto @vMCSnooze +.MCAddToListPtr goto @vMCAddToListPtr +.MCReserveMemory goto @vMCReserveMemory +.MCSetUpVariablePtrs goto @vMCSetUpVariablePtrs +.MCPreLoadCells goto @vMCPreLoadCells +.MCPlotLogicalScreen goto @vMCPlotLogicalScreen +.MCPlotPhysicalScreen goto @vMCPlotPhysicalScreen +.MCUpdateScreen goto @vMCUpdateScreen +.MCUnPlotScreen goto @vMCUnPlotScreen +; returns v1=actual frame time in ms +.MCSetPalette goto @vMCSetPalette +.MCSetTextWIndow goto @vMCSetTextWIndow +.MCSetGraphicsWindow goto @vMCSetGraphicsWindow +.MCClearChangeMaps goto @vMCClearChangeMaps +.MCClearTextBuffer goto @vMCClearTextBuffer +.MCCopyTextBuffer goto @vMCCopyTextBuffer +.MCEnableTextBuffer goto @vMCEnableTextBuffer +.MCInitSound goto @vMCInitSound +.MCStartSound goto @vMCStartSound +.MCFindObj goto @vMCFindObj +.MCInitGraphics goto @vMCInitGraphics +.MCCalcMatrix goto @vMCCalcMatrix +.MCDrawVector goto @vMCDrawVector +.MCKeyDown goto @vMCKeyDown +.MCInitJoystick goto @vMCInitJoystick +.MCReserveChip goto @vMCReserveChip +.MCSaveProtect goto @vMCSaveProtect +.MCInitScrolling goto @vMCInitScrolling +.MCScrollDirection goto @vMCScrollDirection +.MCPurgeAllCells goto @vMCPurgeAllCells +; MCSetTextWindow = Allocate memory for text buffer +; v1=top screen line +; v2=number of screen lines +; MCSetGraphicsWindow = Set graphics clipping +; v1=Left X +; v2=Right X +; v3=Top Y +; v4=Bottom Y +; MCClearChangeMaps = (Rebuild physical screen from Buffer2) +; MCClearTextBuffer = Clear one character row of text buffer +; v1=buffer Y to clear +; MCCopyTextBuffer = Copy text buffer to physical screen +; v1=Buffer Y to top of text window +; MCEnableTextBuffer = Select character output +; v1=0, write to TextScreenBase +; v1=mask: 1=buffers, 2=Logical, 4=Physical + +.MCSetMaxFrameRate + goto @vMCSetMaxFrameRate + +; Paramters: +; V1 = 84; Time in milliseconds + +.MCSetPreloadPalette + goto @vMCSetPreloadPalette + + +.MCCopyScreenToBuffer + goto @vMCCopyScreenToBuffer + +; Copies the logical screen back to the buffer screen, thus adding +; any sprites on a semi-permament basis. goto @v +; insert/remove activity will corrupt these added sprites. goto @v +; these added sprites do not obey the 3D rules, so may give +; peculiar effects + +.MCRasterHandler + goto @vMCRasterHandler + +; /* Parameters: +; V1 = destination raster +; V2 = source raster or clear color +; V5 = 2; /+ copy raster +/ 0=clear to color + +.MCSetPrintRaster + goto @vMCSetPrintRaster + +; Parameter: V1=raster to print onto from now on. goto @v + + +.MCSetPrintFont + goto @vMCSetPrintFont + +; v1=list number, v2=offset, v3=CGA palette code (mono machines only) + + +.MCRasterPrintCharacter + goto @vMCRasterPrintCharacter + + +.MCPasteCell + goto @vMCPasteCell + + +.MCMobilityAbility + goto @vMCMobilityAbility + + +.MCLoadCellDataDirect + goto @vMCLoadCellDataDirect + +; /* V1=list #, v2=offset, v3=cell # */ + +.MCTransferParkedSprites + goto @vMCTransferParkedSprites + + +.MCDigitise + goto @vMCDigitise + +; /* Paramters: +; V5=0 Initialise +; V5=1 Terminate System +; V5=2 FindState Audio (returns V1=0 or 0FFFF) +; V5=3 Wait For Audio +; V5=4 Volume Control (V5=Volume) +; V5=5 Translate Sample (V1,V2 = sample, V6 = length, +; V3=Frequncy, V4=Volume) +; V5=6 Play Sample (V1,V2 = sample, V3=Frequency, +; V4=loop count, V6=Repeat count) +; V5=7 Terminate Sample +; */ + +.MCOnceOnlyMusicInit + goto @vMCOnceOnlyMusicInit + +; /* Returns V1,V2 = (driver) InfoWord +; V6 = 00000ABC +; A=1 Adlib sound driver +; B=1 Roland sound driver +; C=1 ReelTalk +; (Note: Adlib/Soundblaster requires a resident driver to be +; loaded before the game. goto @v +; error handler call occurs before V6 is returned) +; (Note: This is one of the few cases where error handlers +; could occur before SetUpVariablePtrs, so take care +; not to PRINT to the buffer screens) +; */ + +.MCInitialiseScore + goto @vMCInitialiseScore + +; /* Paramters: +; V1 list V2 offset Music Score +; V3 list V4 offset Adlib Instrument File +; V5 Score number (0-3) +; */ + +.MCPlayScore + goto @vMCPlayScore + +; /* Paramters: +; V1 Score number (0-3) +; V2 Repeat Flag (255=forever, 0=once, #=number of times) +; V3 Operation (0=restart, 1=resume, 2=stop) +; */ + +.MCMusicCloseDown + goto @vMCMusicCloseDown + + +.MCOpenSpriteFile + goto @vMCOpenSpriteFile + +; /* Paramters: +; V1 list V2 offset = first 7 chars of sprites file name +; */ + +.MCstopWithMessage + goto @vMCstopWithMessage + +; /* Parameters: +; V1 list V2 offset = 80 character error message +; As MCCloseDown but also prints message +; */ + +.MCJumpOverlay + goto @vMCJumpOverlay + +; v1 is ascii code: e.g. goto @vg. +; v2 is offset starting from 0 of routine within overlay + +.MCCallOverlay + goto @vMCCallOverlay + +.MCLoadGamedata goto @vMCLoadGamedata +; v1 is ascii code: e.g. gamedat1.dat +; Loads in gamedata but does not affect acode file. +; Remember that list1..9 pointers will be changed, +; with the exception that any pointers equal to 0 in the new +; table.txt/dat will not change the existing pointers + + +;---------------------- + cif TownOverlay +.AfterIntroStart goto @vAfterIntroStart +.DoWholeIntro goto @vDoWholeIntro +.DisplayEverything goto @vDisplayEverything +.SpecialACBKilled return +.HandleText goto @vHandleText +.CloseDown goto @vCloseDown +.LoadStructuresV1 goto @vLoadStructuresV1 +.SpecialAniShift goto @vSpecialAniShift +.PreloadAndInsertDV1 goto @vPreloadAndInsertDV1 +.BuildRoom goto @vBuildRoom +.setDefaultPalettes goto @vSetDefaultPalettes +.AllocateAndLoadFont goto @vAllocateAndLoadFont +.SelectLanguage goto @vSelectLanguage + cend +.sGetControls goto @vsGetControls +.KillACBHeader goto @vKillACBHeader diff --git a/l9dev/regress/games.l9/billy.l9/walkabou.txt b/l9dev/regress/games.l9/billy.l9/walkabou.txt new file mode 100644 index 0000000..8847df2 --- /dev/null +++ b/l9dev/regress/games.l9/billy.l9/walkabou.txt @@ -0,0 +1,1419 @@ +; WALKABOU.TXT +; +; Walkabout code for Billy The Kid +; +; Mike Austin July 1990 +; +var + InfoAlready ; local variable to TalkToPerson + +const + TVDOpinionBillyOffset=1 + TVDOpinionPatOffset=2 + TVDAlignmentByte=5 ; <128 if good, >=128 if bad + TVDNameOffset=6 ; information type this person will ever know about. +; Top bit set if they know about the current event of this type. + TVDInfoByte=7 + + begin + +; Check map square at dv2+dx2,dv3+dx3 +; V1=0 if square is vacant... +;--- +.TownControls + gosub @sGetControls ; still scan escape whilst riding + if PlayerACB=0 then @TCRet ; riding into town? + if PleaseSTopPlayer>1 then @TCStop +; look at kbd/joystick/mouse and return +; dir as new movement direction in standard adventure format +; and FireKey=0 if not pressed, 1 if pressed. +; and FireKeyChange=1 if pressed/released this turn + +; and for directions, returns: +; x1 +; x4 x2 +; x3 +; Non-zero means trying to move in that direction +; and x5=x offset (single pixel movement), signed +; x6=y offset (single pixel movement), signed +; x7=direction number in standard adventure format +; i.e. 1 +; 8 2 +; 7 3 +; 6 4 +; 5 + UpKey=x1 + RightKey=x2 + DownKey=x3 + LeftKey=x4 + XSpeed=x5 + YSpeed=x6 + MenuNumber=0 ; in case not changed elsewhere + if x7=0 then TCNoChangeDir + if PlayerWalking=false then TCCD1 + if x7=PlayerDirection then TCNoChangeDir +.TCCD1 + PlayerDirection=x7 +.TCSetUpPlayer + PlayerWalking=true + ObjectNumber=3400 ; walk in direction +.TCSetUpPlayer2 + add ObjectNumber,PlayerDirection ; walk in new direction + dx4=PlayerACB + RasterOffset=100 ; Billy + if PlayersName=Billy then TCSUP2 + RasterOffset=200 ; Pat +.TCSUP2 + gosub @ChangePersonACBdx4 + goto @ResetPlayerHeight + +.TCNoChangeDir + add TimeInRoom,c1 +; after a while in each room, check if anybody wants to +; talk to the player... +; (The time is set so as to JUST allow the player to +; walk across the screen, provided they don't stop on +; the way.) + if TimeInRoom<>70 then TCNotEncounters + gosub @WalkingSubPlotEncounters +.TCNotEncounters + + + + +; sub AccostCounter,c1 +; if AccostCounter>0 then TCNoAccost +; PosRange=4000 +; NegRange=60000 ; -20 +; cursorx=PlayerX +; cursory=PlayerY +; gosub @HiresCDRange ; anyone in room? +;; Returns result=true if found +;; and x1=offset in HiresTable +; if result=0 then TCNoAccost +; +;; an object - e.g. wanted poster? +; if x1<1264 then TCAccost2 ; 79*16 +; if x1<1345 then TCNoAccost ; 84*16+1 +; +;.TCAccost2 +;;;; add x1,PeopleVarData ; get offset in TVD +; break ;********* +; push x1 ;****** +; pop x1 ;********* +; goto @TalkToPerson ; use 'current' menu +;; gosub @GetGreetingMessage +;; gosub @GetPersonalGreeting ; also sets ThisPersonVarData=x1 +;; +;; gosub @TTPDisplayInstructions +;; fire pressed. +;; TextBoxDisplayed=0 +; +;; MenuNumber=16 ; hello, talk, threaten, bribe menu. +;; gosub @PrettyMenu +;;;; if result=DoNothing then @TCStop ; 'do nothing' selected +;; goto @TCStop ; after menu selection +; goto @MeetDoMenu ; gosub, return + +.TCNoAccost + if PleaseStopPlayer<>false then @TCStop + if FireKey=0 then @TCNoStop +; bring up menu + +; is player near to a person? + dx4=PlayerACB + gosub @ReadACBDX4 + cursorx=PlayerX + cursory=PlayerZ ; y=z-h + sub cursory,dv4 ; PlayerH + gosub @HiresCD ; check HiresTable(0..SizeHiresTable) +; for collision with thing at coordinates cursorx,cursory +; Returns result=true if found +; and x1=offset in HiresTable + if result=false then TCNotTalkPerson + +; an object - e.g. wanted poster? + if x1=1344 then TCTalk ; card table crew + if x1<1264 then TCTalk ; 79*16 + if x1=1264 then @WantedPoster + if x1<1680 then TCNotTalkPerson ; 84*16+1 20 dec90 was 1345 + +.TCTalk + push x1 ; x1 is person's offset in HiresTable() + WantCSTB=true ; set to true when want to do a COpyScreenToBuffer + gosub @DisplayEverything + pop x1 + gosub @TalkToPerson ; x1 is person offset in HiresTable:16 times +; person number + goto @BackToWalkabout ; TCStop ; after talk. + +.TCNotTalkPerson + x1=832 ; barman(52) times 16 + if Location=160 then TCTalk ; talk to barman + MenuNumber=0 ; move on/leave town menu + m1=0 + m2=0 + gosub @PrettyMenu + if result=DoNothing then TCDoNothing ; 'do nothing' selected + goto @ReturnToMap + + +.TCDoNothing +; v1=0 +; v2=0 +; gosub @MCBuildRoom ; remove black box CSTB'd onto screen + +.TCStop + if PleaseStopPlayer=0 then TCStop2 + sub PleaseStopPlayer,c1 +.TCStop2 + x4=ACBLastHeightAdjust + add x4,PlayerACB + x3=ACBList(x4) + x4=ACBHOffset + add x4,PlayerACB + x1=64 ; default player height + add x1,x3 ; add on last terrain height we noted + if x4>ACBListSize then @StratBug ;***** + &ACBList(x4)=x1 ; reset player height the hard way! + + + PlayerWalking=false + gosub @ResetPlayerHeight + ObjectNumber=3410 ; stop in direction + add ObjectNumber,PlayerDirection ; walk in new direction + dx4=PlayerACB + goto @ChangePersonACBdx4 ; gosub, return + +.TCNoStop +; going off walkable area in any direction? + gosub @CheckNewRoom +.TCRet + return +;--------- +.ChangePersonACBdx4 + gosub @ChangeACBDX4 + gosub @ReadACBDx4 ; get current coords + dx1=ACBCumulativeShift ; word - for Walkabout: keeps track +; of how far we've shifted vertically - to allow the up/down +; movement as we walk to be cancelled when change animation. + add dx1,dx4 + &dx5=ACBList(dx1) + if dx1>ACBListSize then @StratBug ;***** + &ACBList(dx1)=c0 + sub dv4,dx5 ; remove cumulative h shift from h coord + gosub @MoveACBdx4 +.SASTRet + return +;------- +.SpecialAniShiftTown +; acb ACBheader is moving from dv2,dv3,dv4 by dx2,dx3,dx4 pixels + if PlayerACB=0 then SASTRet ; e.g. riding into town + if ACBHeader<>PlayerACB then @SASTNotPlayer + dx1=ACBCumulativeShift ; word - for Walkabout: keeps track +; of how far we've shifted vertically - to allow the up/down +; movement as we walk to be cancelled when change animation. + add dx1,ACBHeader + &dx5=ACBList(dx1) + add dx5,dx4 + if dx1>ACBListSize then @StratBug ;***** + &ACBList(dx1)=dx5 + +.SetUpPlayerCoords + if BuildingRoom=true then @SUPCRet + PlayerX=dv2 + PlayerZ=dv3 +;; sub PlayerY,dv4 ; y=z-h + + CursorX=dv2 + CursorZ=dv3 + gosub @CheckCollision + if ReturnCode=0 then @SUPCRet ; currently standing on a non-walkable square + + CursorX=dv2 + CursorZ=dv3 + add CursorX,dx2 + add CursorZ,dx3 + push CursorX + push CursorZ + gosub @CheckCollision + pop CursorZ + pop CursorX + if ReturnCode=0 then @SUPCBlock +; walkable if non-zero +; add CursorX,c8 ; reflects width of player +; gosub @CheckCollision +; if ReturnCode=0 then SUPCBlock + push dx4 + dx4=ACBHeader + gosub @ResetPlayerHeight + pop dx4 + return +;----- +.ResetPlayerHeight +; player has ACB at dx4 + gosub @AdjustPersonHeight + if result=false then SASTNoAdjustHeight ; height not available, +; so leave it alone. +;***! if PlayerWalking=false then RPH2 + x4=ACBLastHeightAdjust + add x4,dx4 + x3=ACBList(x4) + if x3=x1 then SASTNoAdjustHeight ; height adjust? +.RPH2 + if x4>ACBListSize then @StratBug ;***** + ACBList(x4)=x1 + gosub @ReadACBdx4 + dv4=x2 ; height for this bit of terrain + if dv4<200 then SASTAH2 +; negative - clearly silly + dv4=64 ; default height + +.SASTAH2 + goto @MoveACBdx4 ; gosub, return + +.SASTNoAdjustHeight + return + +.SUPCRet + return + +.SUPCBlock +; PleaseStopPlayer=true + +;; get collision, height stuff for CURRENT position, not +;; where we were trying to move to. This is so ResetPlayerheight +;; can find the correct terrain height +; CursorX=dv2 +; CursorZ=dv3 +; gosub @CheckCollision + + PleaseStopPlayer=2 ; freeze player for 2 frames, to give +; system a change to realise we've stopped, and thus +; reset the height + + + dx2=0 + dx3=0 + dx4=0 + return +;------ +.SASTNotPlayer + return +;----------- +.CheckNewRoom + x1=0 ; direction to go in + if PlayerX>32000 then CNRNotGoRight ; slightly off LHS + if PlayerX<300 then CNRNotGoRight ;until 5 jan 91, was 316 + if PlayerDirection<2 then CNRNotGoRight + if PlayerDirection>4 then CNRNotGoRight +; leave this room, going east + x1=3 ; new direction + x5=3 ; direction we'll enter new room in + +.CNRNotGoRight + if PlayerX>4 then CNRNotGoLeft + if playerDirection<6 then CNRNotGoLeft + x1=7 ; new direction + x5=7 ; direction we'll enter new room in. + +.CNRNotGoLeft + if PlayerZ<194 then CNRNotGoSouth ; y=130 + if PlayerDirection<4 then CNRNotGoSouth + if PlayerDirection>6 then CNRNotGoSouth + x5=5 ; direction we'll enter new room in. + x1=5 ; new direction + if PlayerX<170 then CNRNotGoSouth + x1=4 ; SE: for door at RHS of screen + +.CNRNotGoSouth + if CurrentScreen>MaxOutside then @CNRNotGoNorth ; no north doors +; from inside rooms (Because they have a bigger walkable area) + code - + x2=120 ; z limit for a few strange rooms + if CurrentScreen=431 then CNRFarBack ; news office, Santa Fe + if CurrentScreen<435 then CNRFB1 ; 435-438 + if CurrentScreen<439 then CNRFarBack ; +.CNRFB1 + if CurrentScreen<451 then CNRFB1a + if CurrentScreen<454 then CNRFarBack +.CNRFB1a + if CurrentScreen<454 then CNRFB2 ; + if CurrentScreen<458 then CNRFarBack ; +.CNRFB2 +;; if CurrentScreen=472 then CNRFarBack ; Outside Roswell hotel + if CurrentScreen=473 then CNRFarBack ; + if CurrentScreen=500 then CNRFarBack ;Lincoln City Saloon + if CurrentScreen=503 then CNRFarBack ;Lincoln Bank + if CurrentScreen=505 then CNRFarBack ; Lincoln City + if CurrentScreen<543 then CNRFB3 ; + if CurrentScreen<545 then CNRFarBack ; + +.CNRFB3 + x2=138 ; z limit for 542 White Oaks + if CurrentScreen=542 then CNRFarBack + if CurrentScreen=472 then CNRFarBack ; Outside Roswell hotel + if CurrentScreen=430 then CNRFarBack ; Santa Fe first room + x2=150 ; z limit for outside Santa Fe Saloon + if CurrentScreen=433 then CNRFarBack + x2=144 ; z limit for most rooms + + + +.CNRFarBack + code + + + if PlayerZ>x2 then CNRNotGoNorth + if PlayerDirection=8 then CNRNorth + if PlayerDirection>2 then CNRNotGoNorth +.CNRNorth + x5=1 ; direction we'll enter new room in. + x1=1 ; new direction + x4=155 ; x limit for a few rooms where NE is near to centre + if CurrentScreen=453 then CNRFunnyNE + x4=100 + if CurrentScreen=438 then CNRFunnyNE + x4=170 ; x limit for most rooms +.CNRFunnyNE + if PlayerX0 then @CNRLeave +; no exit defined - we got a problem! +; our two "alternate" directions: NE and SE, map them +; back onto N and S in case there was only one exit in that direction + if x1<>2 then CNRNotNE + x1=1 + goto CNRCheck +.CNRNotNE + if x1<>4 then CNRReallyClosed ; @CNRNoLeave + x1=5 + goto CNRCheck + +.CNRReallyClosed +.CNRClosed + if x3<>190 then @CNRNoLeave +; shop is closed - print a message, put player back on the street + m1=874 ; get outa here! +.BTWM1 + gosub @DisplayInstructions + goto @BackToWalkabout + +.CNRLeave + NewScreen=TownRoomBase + add NewScreen,x3 + + + v4=40 ; plain shop + if x3<12 then @PersonInShop + v4=1 ; bank teller + if x3<19 then @PersonInShop ; display bank picture + v4=40 ; plain shop + if x3<30 then @PersonInShop + if x3<60 then CNRNewWalkabout + v4=4 ; pretty store + if x3<66 then @PersonInShop ; display store picture + v4=40 ; plain shop + if x3<70 then @PersonInShop + if x3<80 then NotSheriffsOffice + if x3>85 then NotSheriffsOffice + v4=561 ; display Sheriff's office from Town Structures + if PlayersName=Pat then @PersonInShop ;SheriffsOffice ;****** + m1=875 ; Billy decided not to go into Sheriffs Office + goto @BTWM1 ; print message, back to walkabout + + +.NotSheriffsOffice +.CNRNewWalkabout +; enter new room in direction x5 + PlayerDirection=x5 + dx4=PlayerACB + gosub @ReadACBdx4 + if PlayerDirection<>1 then PPNotN + add dv2,c32 ; TEMP for Santa Fe Saloon!!! *************** + dv3=PlayerInitialY ; z position + add dv3,dv4 ; z=y+h + +.PPNotN + if PlayerDirection<>3 then PPNotE + dv2=32 ; x position + +.PPNotE + if PlayerDirection<>5 then PPNotS + dv3=100 ; z position + add dv3,dv4 ; z=y+h + +.PPNotS + if PlayerDirection<>7 then PPNotW + dv2=280 ; x position + +.PPNotW + gosub @MoveACBDx4 + gosub @SetUpPlayerCoords ; copy into PlayerX,Y vars in case +; specialAniShift is not done before we next display a frame. + + gosub @NewRoomSubplotEncounters + +.CNRDontWantLeave + return + +.CNRNoLeave +; can't leave + gosub @TCStop + return +;---------- +.PersonInShop +; x3=room number of shop to briefly visit. +; Don't actually change LOCATION, as we are going +; straight back outside after we finish chatting. +; re-entering this shop. See correction in CNRNewWalkabout. + PleaseStopPlayer=true ; stop player ASAP, to avoid walking into +; shops or similar funnies. + if PlayerDirection=3 then DontTurn + if PlayerDirection=7 then DontTurn + PlayerDirection=5 + +.DontTurn +; gosub @MCCopyScreenToBuffer ; freeze the street scene, +;; for when we overlay it. + if x3=6 then @NewsOffice + if x3>11 then PISNotNews + if x3>7 then @NewsOffice + +.PISNotNews + if v4=0 then NoLinkingBackdrop ; a linking picture? + + push x3 + if v4<>561 then PISPic1 ; display Sheriff's office from Town Structures + dv1=v4 + gosub @BuildPicture ; + goto PISPic2 +.PISPic1 + gosub @DisplayLinkingPicture ; load linking structure file, + +.PISPic2 +; open sprites file, and build the picture we've asked for(v4). + pop x3 + push CurrentRoom + MenuNumber=174 ; Sheriff menu + x1=0 ; no person in Sheriff's office + if x3<80 then PISNotSheriff + if x3>84 then PISNotSheriff + gosub @MaybeForceTalkToPerson ; use MenuNumber + goto PIS3 + + +.PISNotSheriff +;Menu156 dc.w 1519-MM,MMenu+158 * the store was deserted... +; MenuNumber=156 ; menu to allow us to get books. + gosub @WhoIsAtX3 +; gets x1 as person number * 16 for room x3. +.PIS2 + gosub @TalkToPerson +.PIS3 + gosub @MCPurgeAllCells ; purge cells from linking picture. + +; break ;***** +; push PlayerX ;***** +; pop PlayerX ;******* +; x5=5 ; south +; gosub @CNRNewWalkabout ; make player appear at a sensible +; position in street, when we enter new room in direction x5 + gosub @LimitPlayerCoords + PlayerDirection=5 ; going south againd + PlayerWalking=true + goto @BackToWalkabout +;--------- + +.NoLinkingBackdrop + push CurrentRoom + gosub @MCEmptyRoom + gosub @MCBuildRoom + gosub @InitACBs + gosub @DisplayEverything ; display black quickly + gosub @WhoIsAtX3 + gosub @TalkToPerson + goto @BackToWalkabout +;------------------ +code - +.iBackToWalkabout + code + + gosub BackToWalkabout + code - + return +;------- +code + +.BackToWalkabout + if PlayingDuel<>0 then BTW1 ; about to fight duel (e.g. +; lady being bothered by gunslinger -> duel, immediately after talking to her) + if Location>199 then @ReturnToMap ; at Fort Sumner +; or somewhere, talking to person +.BTW1 + gosub @FreezeAndPutUpHourglass + PersonDisplayed=false +; back to map, or out onto street again. + gosub @OpenTownStructures ; load town structure again, if needed. +; v4=GameMap ; map + if CurrentScreen=GameMap then @ReturnToMap ; OverlayEntryPoint ; map + NewScreen=CurrentScreen + gosub @WaitFireRelease + + PlayerWalking=true ; false ; start Billy stationary + gosub LimitPlayerCoords + PlayerDirection=5 ; turn round to face south + goto @BuildNewScreen +;----------- +.LimitPlayerCoords + code - + if PlayerX>9 then BTW2 + PlayerX=10 ; limit X + +.BTW2 + if PlayerX<310 then BTW3 + PlayerX=308 ; limit x + +.BTW3 + if PlayerZ>141 then BTW4 ; y=71 then BTW4 + PlayerZ=165 ; limit y y=95 + +.BTW4 + If PlayerZ<189 then BTW5 ; y=125 + PlayerZ=184 ; limit y ; y=120 + +.BTW5 + code + + return +;-------------- +.MoveOffBlockedSquares + gosub LimitPlayerCoords + x2=4 ; x shift to try to get off + x3=4 ; z shift to try to get off + +.MOBS1 + CursorX=PlayerX + CursorZ=PlayerZ ; y=z-h, so z=y+h +; x1=64 +; add CursorZ,x1 + +.MOBSLoop + push x2 + push x3 + gosub @GDpointOnMap + if ReturnCode<>0 then NotOffMap + returnCode=39721 ; off map + goto OffMap1 + +.NotOffMap + gosub @CheckCollision + +.OffMap1 + pop x3 + pop x2 +; returnCode=0 if non-walkable + if ReturnCode=39721 then MOBSTryNewDir ; off map, so try new direction + if ReturnCode<>0 then MOBSGotIt +; currently standing on a non-walkable square + add CursorX,x2 + add CursorZ,x3 + if CursorZ>184 then MOBSTryNewDir + if CursorX<315 then MOBSLoop + +.MOBSTryNewDir + if x2>200 then MOBSGiveUp ; can't find anywhere + x2=65532 ; -4: x shift + x3=65532 ; -4: z shift + goto @MOBS1 ; start from original position, search in new direction + +.MOBSGotIt +; got position CursorX,Z which is unblocked + PlayerX=CursorX + PlayerZ=CursorZ ; y=z-h +; x1=64 ; h +; sub PlayerY,x1 + +.MOBSGiveUp + return + +;------------------ + code - +.iTalkToPerson + code + + gosub TalkToPerson + code - + return + code + +;------------ +.TalkToPerson +; handle conversation with person x1/16. +; Either return, to go back to walkabout, or +; jump off somewhere depending on the result of +; the conversation. + MenuNumber=0 ; don't force a menu (default) + +.MaybeForceTalkToPerson +; MenuNumber=forced menu for person + + PersonNumber=x1 + asr PersonNumber + asr PersonNumber + asr PersonNumber + asr PersonNumber + add x1,PeopleVarData ; get offset in TVD + ThisPersonVarData=x1 + InfoAlready=false ; haven't selected "talk" or "threaten" before + + push x3 ; location we're visiting.... + x4=PeoplePatMenuOffset +; if PlayersName=Pat then TTP1 +; x4=PeopleBillyMenuoffset +;.TTP1 + if PersonNumber=0 then TTP1b ; no person displayed. + add x4,ThisPersonVarData + if MenuNumber<>0 then ForcedMenu + &MenuNumber=TownVarData(x4) ; get current menu number in subplot +; for this person. +.ForcedMenu + gosub @OpenIdentikitStructures + +.TTP1b + gosub @PutUpMenu + if PersonNumber=0 then TTP2 ; no person shown in identikit form + push x4 + gosub @DisplayNewMenu ; display it to give an immediate response. + if MenuNumber=156 then TTP1c ; Menu156 is 'search for books' menu +; in Lincoln City store + gosub @FullDisplayPerson ; display identikit picture. + +.TTP1c + pop x4 +.TTP2 + pop x3 + +; identikit text print raster set up in menu print code. + gosub @TTPSub + return +;------------- + +.TTPSub +; visiting location x3, talking to person PersonNumber +; and x1=PersonNumber*16 and TownVarData(ThisPersonVarData) + gosub @SelectPrettyMenu ; like "PrettyMenu", but when already displayed + MenuNumber=24 ; excludes talk option - default menu to use from +; now on in conversation, unless changed by e.g. offering a bribe + goto MeetDoMenuDisplayed ; MenuNumber=current menu + +.TTPMainMenu + +.MeetDoMenu + gosub @PrettyMenu + +.MeetDoMenuDisplayed + if result=50 then @ReturnToMap ; 'leave town' + gosub @GetCost + if x1<>0 then @SpendMoney + + +; dc.w 450-MM,MDoIt+450-MM ; where are deputies? +; dc.w 451-MM,MDoIt+451-MM ; hire deputy +; dc.w 452-MM,MDoIt+452-MM ; fire deputy + if result=3946 then @WhereAreDeputies ; FF6A&0FFF => 0F6A + if result=3947 then @HireDeputy + if result=3948 then @FireDeputy + + code - + x1=65506 ; -30 + if result=LoseRepMessage then @iTTPAddX1ToReputation + if result=907 then @iTTPAddX1ToReputation + if result=910 then @iTTPAddX1ToReputation + if result=904 then @iTTPAddX1ToReputation + if result=901 then @iTTPAddX1ToReputation + if result=1023 then @iTTPAddX1ToReputation + if result=1032 then @iTTPAddX1ToReputation + if result=1053 then @iTTPAddX1ToReputation + if result=1062 then @iTTPAddX1ToReputation + if result=160 then @iTTPAddX1ToReputation + if result=1260 then @iTTPAddX1ToReputation + if result=1213 then @iTTPAddX1ToReputation + if result=1214 then @iTTPAddX1ToReputation + goto iTTPNoRep + +.iTTPAddX1ToReputation + gosub @iAddX1ToReputation + +.iTTPNoRep + code + + if result=907 then @MDMRet ; lose reputation message + if result=59 then @TTPIntroduce ; 'hello' + if result=60 then @TTPTalk ; 'talk' + if result=61 then @TTPThreaten ; 'threaten' + if result=257 then @BankRobbery ; 'rob' + if result=304 then @WantDuelSoon ; "let's settle this outside" + if result=300 then @ToCardGame +; x1=704 ; ThisPersonVarData +; add x1,PeopleVarData ; get offset in TVD + x1=AshUpton + MenuNumber=156 ; store was mysteriously deserted + if result=912 then @NewMenuForPerson ;TVDx1 ;[1512:"the army are being cheated by the Murphy-Dolans on the meat + if result=917 then @NewMenuForPerson ;TVDx1 ;[1512:"the army are being cheated by the Murphy-Dolans on the meat + if result=1257 then @GangRecruited ; "ok, we'll do a robbery with you" + if result=1281 then @ToEscapeGame ; "It's Billy, get him boys!" + +;[602:go upstairs with the girl ($25) `] +;[603:offer a bribe `] +;[604:give $20 `] +;; drinks on offer at bar... +;[605:nothing `] +;[606:red-eye ($1) `] +;[607:beer ($1) `] + if result=1215 then @LoseGame ; Barney Mason has told Pat he's out. + if result=1064 then @WantDuelSoon ; Stop Brady + if result=1268 then @ToFinalDuel ; to final duel + + if result=1052 then @ToRustlingGame ; steal cows + + x1=4065 ; -30&0fff: reputation + if result=1053 then @AddX1ToReputation ; spend counterfeit money normally + x1=1000 ; amount of gold + x2=200 ; increase in reputation + if result=1022 then @SpendMoney ; give money to widow woman + + gosub @SetSubPlotFlags + +;[1537:Barney lead Pat at high speed to the head of a winding +;valley, then left him to track the escapee on his own. ] ; yes to 1535 + if result=937 then @ToTrackingGame + + if result=3796 then @ToBrawlGame ; (300-600)&0fff + if result=3797 then @ToBrawlGame ; (301-600)&0fff + if result=57 then @ToBrawlGame ; 657-MM 'RAISE HELL' reply + + m1=111 ;[111:the prospector ] ; followed by 115 + m2=115 ;[115:came up and said "thanks pard, you've + if location=248 then @SubPlotShootout ; at prospector's place. + + m1=110 ;[110:the homesteader ] ; followed by 115 +;done me a right big favour and I'll be sure to tell everyone about you". ] ;œœœ + if result=940 then @SubPlotShootout ; mexican peasant etc. +;; [1540:"Hurry! We must fight them!" ] ; yes to 1500 + if result=0 then MDMNotHomestead ; 'do nothing' or 'clear off' + if Location<231 then MDMNotHomestead + if Location<234 then @SubPlotShootout ; help homesteader + +.MDMNotHomestead + push Location + Location=225 ; ranch + + if result<>970 then MDMNotTart +; tart/lady being bothered by gunslinger in saloon + CurrentScreen=450 ; move player outside so duel happens immediately +; MenuNumber=14 ; click on tart menu used from now on. +; x1=PersonNumber +; push result +; gosub @NewMenuForPerson ; gosub, return +; pop result + +; kill her... + x1=63 ; lady + gosub @KillPersonX1 + +.MDMNotTart + if result<970 then MDMNotDuel + if result<1000 then @WantDuelSoon + +.MDMNotDuel + m1=112 ;[112:Mrs McSween ] ; ; followed by 116 + m2=116 ;[116:came up and said "thanks old friend. That's +;stopped to the Murphy Dolans, at least for a while". ] + if result=1072 then @SubPlotShootout ; go to help McSween + + m1=113 ; Laura Picket, same m2 + if result=730 then @SubPlotShootout ; help Laura Picket + if result<940 then MDMNotShootout ; various subplots -> shootout + m1=0 ; no special result message + if result<970 then @SubPlotShootout + +.MDMNotShootout + pop Location +; 970..999 are duel subplots. + if Location>200 then @ReturnToMap ; do nothing/clear off etc. +; when e.g. visiting a ranch. +.MDMRet + return +;------------- +.GangRecruited + PlayerGang=Location + x1=231 ; base for locations - 10 (first town) + sub PlayerGang,x1 ; PlayerGang has values 10..15 + return +;-------- +.FightDuel +.WantDuelSoon +; gosub @SetToClearOffMenu + EnemyName=255 ; Pat, Billy or $ff for other + + PlayingDuel=true ; get duel next time we're outside + goto @BackToWalkabout +; if CurrentScreen254 then SpendMoney3 + gosub @CallLinkingOverlay ; 'went upstairs with the girl' + goto @BackToWalkabout + +.SpendMoney3 + return +;--------- + code - +.iAddX1ToReputation + code + + gosub AddX1ToReputation + code - + return + code + +;------- +.AddX1ToReputation + add PlayerReputation,x1 + if x1<32000 then ATR2 + PlayerReputation=0 +.ATR2 + if x1<32000 then ATR3 +; reduced reputation, so make person dislike you + gosub @SetToClearOffMenu +.ATR3 + return +;--------- +;----------- +.TTPIntroduce +; 'ello' to NPC: introduce player, maybe get some reaction. + x2=TownVarData(ThisPersonVarData) ; been introduced to Pat / Billy? + x3=1 ; Pat flag + if PlayersName=Pat then TTPI2 + x3=2 ; Billy flag +.TTPI2 + or x2,x3 + if ThisPersonVarData>TownVarDAtaSize then @StratBug ;***** + TownVarData(ThisPersonVarData)=x2 + + x1=ThisPersonVarData + MenuNumber=36 ; hello again (after hello Billy intro - coded) + gosub @NewMenuForPersonTVDx1 +; next time Player talks to person x1, use menu MenuNumber + + code - + gosub @iStartPrinting + message 915 ; I'm + x2=10 + add x2,PlayersName ; player's full name: e.g. Sheriff Pat Garrett + message x2 ; Billy The Kid + message 916 ; (other person's name is...) + x2=TVDNameOffset ; offset of NPC's name + add x2,ThisPersonVarData + x2=TownVarData(x2) ; get offset of NPC's name + x3=1100 ; base for NPC names + add x2,x3 + message x2 + message 917 ; ". etc. + gosub @iEndPrinting + code + + gosub @TTPDisplayInstructions2 ; using text on raster already + goto @TTPMainMenu + +.TTPMaybeInformation +.TTPTalk +; choose whether to give player information, false +; information, or refuse to talk. + if InfoAlready=0 then TTPTalkInfo2 + add InfoAlready,c1 + m1=876 ; you deaf or something, boy? + if InfoAlready<3 then @TTPGotReply + m1=878 ; Can't stand gibbering all day + if InfoAlready=3 then @TTPGotReply + m1=877 ; I said "YOU DEAF OR SOMETHING" + goto @TTPGotReply + +.TTPTalkInfo2 + m1=919 ; won't tell player, regardless of whether anything known. + gosub @GetOpinions ; doesn't corrupt ThisPersonVarData. + if result=true then TTPTalkInfo3 + add InfoAlready,c1 + goto @TTPGotReply + +.TTPTalkInfo3 +; likes player enough to tell them something, if known. + x2=TVDInfoByte ; offset of information to give byte + add x2,ThisPersonVarData + x2=TownVarData(x2) + m1=918 ; genuinely nothing known + if x2<128 then @TTPGotReply ; no information to give. + gosub @TTPScanInformation +; information is at TownVarData(x4). Or if result=false, +; no information on this topic is available + if result=false then TTPGotReply ; m1 set to not known message. + if x1<250 then TTPScan5 +; was hidden - make it appear on map etc. + if x4>TownVarDAtaSize then @StratBug ;***** + &TownVarData(x4)=c1 ; don't use UpdateVarData, cause this is private info +.TTPScan5 + gosub @PrintSPEntries + goto @TTPMainMenu + +.TTPGotReply +; message m1 is the reply to the player's conversation: +; drop's back to walkabout after printing this... + gosub @TTPDisplayInstructions + if InfoAlready>2 then @BackToWalkabout ; person is fed up with telling you + goto @TTPMainMenu + +;---------- +.TTPScanInformation +; what information of type x2 is known? +; Return: information is at TownVarData(x4). Or if result=false, +; no information on this topic is available + x1=127 ; mask off top bit + and x1,x2 + +; .w Offset of "Money Location" information. (type 0) +; .w Offset of "Deputies Location" information. (type 1) +; .w Offset of "Gang Location" information (type 2) +; .w Offset of "Recent robbery" information (type 3) + code - + random x2 + if x2>70 then TSI2 +; one third of the time you talk to a cooperative person, they'll +; tell you where a gang is. + x1=2 ; type of information - force to be about gangs!!! +.TSI2 + if PlayersName<>Pat then TSINotPat + if x1<>1 then TSIPat2 ; don't tell Pat about number of deputies, +; cause the information is often WRONG +.TSIRecentRobbery + x1=3 ; recent robbery info + +.TSIPat2 +.TSINotPat + if PersonDisplayed<>0 then TSINotNewspaper + if x1=2 then TSIRecentRobbery ; don't publish gang locations! + +.TSINotNewspaper + code + + + + add x1,x1 ; get offset from SubPlot tables in TownVarData + x2=x1 ; save offset used + add x1,SubPlotsOffset + &x4=TownVarData(x1) ; x4 is now start of subplot data word pairs +; that this NPC may have some knowledge about. +; Scan the words for a non-zero location/event that is +; not flagged as being hidden +; if x2=SPMoneyOffset then TTPSThisTownOnly +; if x2<>SPGangsOffset then @TTPScan2 +;.TTPSThisTownOnly +;; only report something which is in current town +; x1=Town +; x2=SantaFe +; sub x1,x2 +; add x1,x1 ; 8 words per entry, so times 8 +; add x1,x1 +; add x1,x1 +; add x1,x1 +; add x4,x1 +; &x1=TownVarData(x4) +; if x1=254 then TTPTTO1 ; hidden, and cannot be told to player. +; if x1>0 then TTPScan4 +;.TTPTTO1 +; m1=1900 ; sorry, nothing going on round here. +; goto @TTPNoInfo ; end of table - know nothing +;;------------ +.TTPScan2 + &x1=TownVarData(x4) ; event? + if x1=254 then TTPScan3 ; hidden, and cannot be told to player. + if x1=65535 then @TTPNoInfo ; end of table - know nothing + if x1>0 then TTPScan4 +; 0 - nothing of interest. + +.TTPScan3 + x1=16 ; 8 words per entry in SubPlots. + add x4,x1 + goto TTPScan2 + +.TTPScan4 +; information is at TownVarData(x4). Or if result=false, +; no information on this topic is available + result=true ; information ok! + return + +.TTPNoInfo + result=false + return + +;------- +.TTPDisplayInstructions2 +; using text already on raster + gosub @DisplayNewTextBox + goto TTPDI2 + +.TTPDisplayInstructions + gosub @DisplayTextNoWait + goto TTPDI2 ; scan keys before displaying frame again + +.TTPDI1 + gosub @DisplayEverything + +.TTPDI2 + gosub @sGetControls + if FireKey=0 then TTPDI1 + if FireKeyChange=0 then TTPDI1 + return +;---------- +.PrintSPEntries +; information is at TownVarData(x4) + code - + gosub @iStartPrinting + message 906 ; er, Ok I'll help ya + message 960 ; header... + code + + +.AddSPEntries ; to a text box already started (but not displayed) + code - + x3=8 ; offset from TownVarData(x4) of current item to print. +.PrintSPELoop + code + + push x3 + gosub PrintSPEntry + if PersonDisplayed<>0 then PSL2 + code - + message ForceCr ; in news office + message space + message cr + code + + +.PSL2 + pop x3 + code - + add x3,c2 + if x3<16 then PrintSPELoop + if PersonDisplayed=0 then PrintSPE2 ; news office? + message 961 ; ". etc. +.PrintSPE2 + gosub @iEndPrinting + code + + gosub @TTPDI2 ; DisplayInstructions2 ; using text on raster already + return +;------ +.PrintSPEntry +; information is at TownVarData(x4) +; x3 is offset from TownVarData(x4) of current item to print. + add x3,x4 + &x1=TownVarData(x3) + if x1=0 then @PSEDontPrint + if x1>10 then PSENotPrintArgument +; print TownVarData(x4+x1-2) + sub x1,c2 + add x1,x4 + &x1=TownVarData(x1) + code - + x2=1000 ; location /gang name. + IF X1<10 then PSPELimit + if x1<16 then PSPEOk1 + if x1<41 then PSPELimit + if x1<48 then PSPEOk1 +.PSPELimit + x1=10 ; limit to within range. + +.PSPEOk1 + add x1,x2 + message x1 + code + + return + +.PSENotPrintArgument + if x1<>65535 then PSENotPrintNumber +; print the number at TownVarData(x4+x3+2).w + add x3,x4 + add x3,c2 + &x1=TownVarData(x3) + if x1<10 then PSENP2 + x1=10 ; limit e.g. number of deputies + +.PSENP2 + if x1>0 then PSENP3 + x1=1 ; lower limit - e.g. minimum number of deputies is 1 +; (cause in lawful towns, a deputy challenges you, regardless +; of whether there's actually one there ) + +.PSENP3 + code - + print x1 + code + + return + +.PSENotPrintNumber + if PersonDisplayed<>false then PSENotNewspaper + if x1=962 then PSEDontPrint ; "I hear... " + +.PSENotNewspaper + code - + message x1 + code + +.PSEDontPrint + return + +;--------- +.TTPThreaten +; decide whether this NPC is going to: +; + Give Information +; + Give False Information +; + Challenge player to a duel + x1=PersonNumber + MenuNumber=ClearOffMenu ; clear off buster + gosub @NewMenuForPerson + + gosub @GetOpinionOfPlayer + if x3<20 then TTPT2 + sub x3,c16 ; reduce opinion + v1=x2 ; TownVarData(x2)=x3 + v2=x3 + gosub @UpdateVarDataByte + + + + +.TTPT2 + x2=TVDAlignmentByte ; offset of good guy / bad guy flag + add x2,ThisPersonVarData + x2=TownVarData(x2) ; good guy? + if x2<128 then @TTPTalk ; good guys don't fight. + x3=1 + and x3,x2 ; cowardly? + if x3<>0 then @TTPTalk ; cowards don't fight. + m1=908 ; let's settle this outside... + gosub @DisplayInstructions ; @TTPDI2 ; DisplayInstructions + MenuNumber=22 ; accept/climb down/try to fight + gosub @PrettyMenu + if result=304 then @ThreatenFightDuel ; "We'll settle this outside" + m1=905 ; lilly livered etc. + if result=64 then @TTPGotReply ; back to walkabout +; no other response should be possible - just exit + return + +.ThreatenFightDuel +; kill person - because we're fighting a duel with them, +; don't want to see them ever again. + v1=ThisPersonVarData + v2=TVDPeopleNameOffset + add v1,v2 + v2=0 ; code for missing person + gosub @UpdateVarDataByte + goto @FightDuel + +;---------- +.TTPBribe + gosub @GetOpinionOfPlayer + if x3>230 then TTPB3 + add x3,c16 ; add on some opinion, careful it doesn't wrap +; TownVarData(x2)=x3 + v1=x2 + v2=x3 + gosub @UpdateVarDataByte + +.TTPB3 + MenuNumber=10 ; to standard menu, without bribe option + goto @TTPMaybeInformation ; maybe give some information now. +;---------- +.GetOpinionOfPlayer +; get x3=TownVarData(x2) as opinion of +; npc TownVarData(ThisPersonVarData) of the player + x2=TVDOpinionBillyOffset + if PlayersName=Billy then TTPB2 + x2=TVDOpinionPatOffset +.TTPB2 + add x2,ThisPersonVarData + x3=TownVarData(x2) + return +;--------- +.GetOpinions +; get x2 as opinion of Billy, x3 as opinion of Pat +; for NPC with table at TownVarData(ThisPersonVarData) +; and set result=true if likes player more than opponent + x2=TVDOpinionBillyOffset + add x2,ThisPersonVarData + x2=TownVarData(x2) ; opinion of Billy + x3=TVDOpinionPatOffset + add x3,ThisPersonVarData + x3=TownVarData(x3) ; opinion of Pat + result=false + if PlayersName=Pat then GOPat +; Billy playing +;; if x2>x3 then GOTrue + if x2>60 then GOTrue ; return + +.GOPat + if x3>60 then GOTrue ; if x20 then GGMGot + x3=2 ; greedy? + m1=930 ; greedy greeting base + and x3,x2 + if x3<>0 then GGMGot + m1=940 ; other person greeting base + +.GGMGot + push x1 + gosub @GetVaryM1 + pop x1 + return +;-------- +.GetPersonalGreeting +; for person TownVarData(x1) +; return m1=personal greeting, if we've already met them. +; or leave m1 unchanged if we haven't met them. +; Also return x2=0 if they are strangers. +; person's data is at TownVarData(ThisPersonVarData) + x2=TownVarData(ThisPersonVarData) ; been introduced to Pat / Billy + x3=1 ; Pat flag + if PlayersName=Pat then GPG1 + x3=2 ; Billy flag +.GPG1 + and x2,x3 +;; m1=953 ; hello stranger + if x2=0 then GPG3 + m1=949 ; hello: 950/951 are messages for each player + add m1,PlayersName +.GPG3 + return +;------- +.GetVaryM1 +; get M1 as a choice of 10 messages, based on M1 + code - + random x1 + code + + x2=15 + and x1,x2 + if x1>9 then GetVaryM1 + add m1,x1 + return +;--------- +.WhoIsAtX3 +; who is at room x3? +; return x1 as the person number * 16 + &x4=TownFixedData(0) ; offset in TownFixedData() of peopleData. + x2=0 ; number of person being examined +.WIALoop + x1=TownFixedData(x4) ; room number + if x1<>x3 then WIA3 +; got a match - record it etc. + x1=x4 + &x2=TownFixedData(0) + sub x1,x2 * take off start of this table. + add x1,x1 ; get number times 16 from number times 8. + x2=65520 ; $fff0 ; remove bottom 4 bits. + and x1,x2 + return ; x1=person number times 16 + +.WIA3 + x1=8 ; 8 bytes per entry + add x4,x1 + add x2,c1 ; number of person being examined + if x2qA5iPhw+&Ws0!p_swMYR&gf#-preC=jYp?gMGY0jrL!5!i`FAL~%2YL)2(A z1xX~O!WOmx3TXEDPRt5t2UKOJfrf`Ps&mpeU z3|E+uwE|rv$gn^g8_J>_=ai=0kIb`NuWqkcra^ev>5tU8?&C(^!0*16LReMakB zJe_pOTU&Pk+vFpw4z`t43bKpZ^sW3dq|_GlbZWe%3=DWaFuuSA^$qO-9pblS*CXZ@ zQQJ`eMIQ6bfV*TEDy5~gCp?jU%3c2DB`|{yeW+fKzo_i4C)N9eF!r=s|JF0AWi?Y) zwI?$pT(4j~ZtHLhbYW%pK@xPa3bE1A+1AN z)eqG-;N%7-)phTu;-|bBWj_?99#5!x|J9`q`2&7i7la?v|Cqb-yT}8S?&?=TR(|C? zy`GWPr1>g~dw7I9yZa%1!u*cS0{kRD-RYeCuKIl3*HK+oc|%+T|GK+e4pQlXIL=T4l~sJ{{Xg4E_VO` literal 0 HcmV?d00001 diff --git a/l9dev/regress/games.l9/colossal.l9/acode.acd b/l9dev/regress/games.l9/colossal.l9/acode.acd new file mode 100644 index 0000000000000000000000000000000000000000..dc395b26aeb79828c3a72a536edce9aa45af7ea9 GIT binary patch literal 8432 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 be first variable + GAMESOLVED ;>>Must be second variable + B1 + C0 C1 C2 C3 ;Fixed constants + C4 C8 C9 + D1 D2 D3 D4 + E1 E2 E3 E4 E5 E6 + F1 F2 F3 F4 F6 F7 + I1 I2 I3 I4 + L1 L2 L3 L4 L6 + N3 N4 N5 + O1 O2 + R1 R2 R3 R4 + S1 S2 S3 S4 S5 S6 S7 + T1 T2 + W1 W2 W3 W4 W5 + X1 X2 X3 X4 + Y1 + PARSEX5 PARSEX6 ;>> Temporary variables + OOPSPOS OOPSPOSEND ;>> + +TABLE + LIST1=1 + LIST2=2 + LIST3=3 + LIST4=4 + LIST5=5 + LIST6=6 + LIST7=7 + LIST8=8 + LIST9=9 +;------------------------------------- +;---------------- diff --git a/l9dev/regress/games.l9/colossal.l9/acore.txt b/l9dev/regress/games.l9/colossal.l9/acore.txt new file mode 100644 index 0000000..7ffaa18 --- /dev/null +++ b/l9dev/regress/games.l9/colossal.l9/acore.txt @@ -0,0 +1,408 @@ +;Parser for Triligy Conversions + +;Copyright (C) 1986 Level 9 Computing + +;B:ACORE.TXT + +VAR + DESCRIPTIONMODE WHEELFOUND + +BEGIN + GOTO @STARTGAME +;--- +;.DESCRIBEROOM +; LASTWORDPRINTED=DISABLEIT ; prevent printing of 'it' +; GOSUB @POSITIONSHADOWS +; GOSUB @CHECKIFLIGHT +; IF RESULT=TRUE THEN DESCROOPARSEM1 +; MESSAGE 2108 ; It's dark +; LASTPICTURE=0 +; CLS G ; clear graphics window +; +; RETURN +; +;.DESCROOPARSEM1 +; +; GOSUB @SPECIALPLAYER +; GOSUB @SETUPROOM +; SEARCHPOS=ROOM +; HISEARCHPOS=0 +; +; PARSEX1=500 ; base for pictures +; ADD PARSEX1,ROOM +; IF PARSEX1=LASTPICTURE THEN DESCROOM2 +; CLS G +; PICTURE PARSEX1 +; LASTPICTURE=PARSEX1 +; +;.DESCROOM2 +; PARSEX1=SHORTROOMDESCS +; ADD PARSEX1,ROOM +; MESSAGE PARSEX1 +; IF DESCRIPTIONMODE=IBRIEF THEN DESCROOM3 +; PARSEX1=LONGROOMDESCS +; ADD PARSEX1,ROOM +; MESSAGE PARSEX1 +;.DESCROOM3 +; MESSAGE DOT +; GOSUB PRINTEXITS +; SEARCHPOS=ROOM +; HISEARCHPOS=0 +; IF WHEELFOUND=TRUE THEN DESCROOM4A ; SPECIAL +; IF ROOM=66 THEN DESCROOM4 ; SPECIAL to Price of Magik +;.DESCROOM4A ; SPECIAL +; GOSUB @PRINTOBJECTS +;.DESCROOM4 ; SPECIAL to Price of Magik +; +; GOSUB DESCPLAYER +; GOSUB @SPECIALDESC +;.DESCROOMRET +; RETURN +;;--- +;.DESCPLAYER +;; Print any special messages for player +;; e.g. 'You are standing on the object' +; PARSEX1=HICURRENTPOS(PLAYER) +; IF PARSEX1=LIEON THEN DESCPLAY0 +; IF PARSEX1=SITON THEN DESCPLAY0 +; IF PARSEX1<>ON THEN DESCPLAY1 +;.DESCPLAY0 +; MESSAGE 370 ; you +; PARSEX2=76 +; ADD PARSEX1,PARSEX2 +; MESSAGE PARSEX1 ; are standing on / sitting on / lying on etc. +; GOTO DESCPLAY5 +;.DESCPLAY1 +; RETURN +;.DESCPLAY5 +; PARSEX1=CURRENTPOS(PLAYER) +; GOSUB @DESCTHEOBJPARSEX1 +; MESSAGE DOT +; RETURN +;;--- +.PRINTEXITS +; OWTYPE=OWEXITS + GOSUB @SETUPROOM ;>> + NUMEXITS=0 + DIR=1 ; current direction + OUTPUTWORD=0 ;>> +.PELOOP +; PRINT AN EXIT (IF VISIBLE) + FROM=ROOM + GOSUB @CHECKEXIT + WORD1=0 + WORD2=0 + WORD3=0 + WORD4=0 + IF EXITVISIBLE=FALSE THEN PENEXTDIR + WORD1=VERBOFFSET ;> EXITDESCBASE + ADD WORD1,DIR +; IF DOOR=0 THEN PENODOOR +; WORD2= ; base for door messages +; ADD WORD2,DOOROPEN +;.PENODOOR + ADD NUMEXITS,C1 + IF NUMEXITS<>2 THEN PE2 + MESSAGE 3020 ; EXITS ARE +.PE2 +; IF WORD2<>0 THEN PEDESC ; through a door, so don't describe destination +; WORD2=* ; to +; WORD3=SHORTROOMDESCS +; ADD WORD3,DEST + +;.PEDESC + GOSUB OUTWORD12 ;>> 34 +.PENEXTDIR + ADD DIR,C1 + IF DIR 14 +.PERET1 + IF NUMEXITS>1 THEN PERET2 + IF NUMEXITS=0 THEN PERET + MESSAGE 3021 ; ONLY EXIT IS +.PERET2 + WORD1=0 + WORD2=0 + GOSUB @OUTWORD12 +.PERET + GOTO @RESETSTACK ;>> RETURN +;--- +;.CHECKIFOBVIOUS +;; see if 'OBJECT' is immediately obvious +; OBVIOUS=TRUE +; PARSEX1=HICURRENTPOS(OBJECT) +; IF PARSEX1=0 THEN CIORET ; things on ground are always obvious +; PARSEX1=CURRENTPOS(OBJECT) +; IF PARSEX1=PLAYER THEN CIORET ; player's contents are obvious +; ADD PARSEX1,PARSEX1 +; ADD PARSEX1,C1 ; look at hi initial position of container +; PARSEX2=OBJECTSTART(PARSEX1) +; IF PARSEX2>127 THEN CIORET ; 'obvious' bit set +; IF SEARCHDEPTH=0 THEN CIORET +; OBVIOUS=FALSE +;; +;.CIORET +; RETURN +;;--- +;.PRINTOBJECTS +;; GO THROUGH CURRENT OBJECT POSITION LIST, +;; AND DISPLAY ALL THE OBJECTS AT (HISEARCHPOS,SEARCHPOS) +; OWTYPE=OWOBJECTS +; GOSUB @INITGETOBJ +; LASTWORDPRINTED=0 +; TOTALOBJECTFOUND=0 +;.PO1 +; GOSUB GETNEXTOBJECT +; IF OBJECT=0 THEN PO1A +; GOSUB CHECKIFOBVIOUS +; IF OBVIOUS=FALSE THEN PO3 +;; +; IF OBJECT>MAXOBJECTVISIBLE THEN PO3 +; IF OBJECT=PLAYER THEN PO3 +; +;.PO1A +; IF NUMOBJECTFOUND<>1 THEN PO2 +; ADD TOTALOBJECTFOUND,C1 +; WORD1=0 +; WORD2=0 +; GOSUB @OUTWORD12 ; output any buffered words +; GOSUB @PRINTCONTAINMENT ; PRINT CONTAINER ON FIRST OBJECT FOUND ONLY +;.PO2 +; WORD1=OBJECT +; WORD2=0 +; GOSUB @OUTWORD12 ; Output object name (delayed effect) +;.PO3 +; IF OBJECT<>0 THEN PO1 +; LASTWORDPRINTED=DISABLEIT +; RETURN +;;--- +;.GETNEXTOBJECT +;; RETURN OBJECT=OBJECT FOUND +;; SEARCHPOS=ROOM OR CONTAINER WHERE FOUND +;; HISEARCHPOS=TYPE OF CONTAINMENT (=0 FOR ROOMS) +;; +;; BEFORE FIRST CALL, MUST SP=0, GOSUB INITGETOBJ AND SETUP HI,SEARCHPOS +;; AT END OF SEARCH, ALL ZEROS ARE RETURNED +;; RETURN NUMOBJECTFOUND=NUMBER OF OBJECT FOUND IN THIS PASS +;; +;; ALSO ADD ON WEIGHT OF THIS OBJECT TO 'WEIGHT' +; PARSEX1=MAXOBJECTVISIBLE ;MAXOBJECT ?? +;.GETNEXTOBJPARSEX1 +; GETNEXT PARSEX1 HISEARCHPOS SEARCHPOS OBJECT NUMOBJECTFOUND SEARCHDEPTH +; IF OBJECT>PARSEX1 THEN GNOERR +;.GNORET +; RETURN +;.GNOERR +; OBJECT=0 +; NUMOBJECTFOUND=0 ; ?? +; RETURN +;;--- +; +;.INITGETOBJ +; SEARCHDEPTH=1 +; PARSEX1=0 +; GETNEXT PARSEX1 PARSEX1 PARSEX1 PARSEX1 PARSEX1 PARSEX1 +; RETURN +;;--- +;.PRINTCONTAINMENT +; PARSEX3=24 ; BASE FOR CONTAINMENT MESSAGES +; IF HISEARCHPOS=NONSPECIFIC THEN PCRET +; IF SEARCHPOS<>PLAYER THEN PPARSEC1 +; PARSEX3=60 ; BASE for 'You are wearing' and 'You are carrying' +;.PPARSEC1 +; ADD PARSEX3,HISEARCHPOS +; MESSAGE PARSEX3 +; IF HISEARCHPOS=0 THEN PCRET ; DON'T PRINT 'THE object' FOR 'YOU CAN SEE' +; PARSEX1=SEARCHPOS ; CONTAINER OBJECT NUMBER +; GOSUB @DESCTHEOBJPARSEX1 +; PARSEX1=16 +; ADD PARSEX3,PARSEX1 ; print second half of containment messages +; MESSAGE PARSEX3 +;.PCRET +; RETURN +;;--- +.OUTWORD12 + WORD3=0 + WORD4=0 +.OUTWORD1234 +; WE ARE OUTPUTING A LIST OF WORDS, SEPARATED BY COMMAS +; ETC. THIS ROUTINE TAKES A SERIES OF WORDS ONE AT A TIME +; AND OUTPUTS THEM. BEFORE CALLING, SET OUTPUTWORD=0 +; AT THE END OF THE LIST, CALL THIS ROUTINE WITH PARSEX1=0 AND THE LIST +; WILL BE FINISHED OFF WITH A FULL STOP ETC. + IF WORD1=0 THEN OWEND +; FIRST OR SECOND WORD - JUST ADD TO BUFFER + PARSEX4=OUTPUTWORD + VALUE=WORD1 + GOSUB WRITEOUTBUFFER + VALUE=WORD2 + GOSUB WRITEOUTBUFFER + VALUE=WORD3 + GOSUB WRITEOUTBUFFER + VALUE=WORD4 + GOSUB WRITEOUTBUFFER + OUTPUTWORD=PARSEX4 + IF OUTPUTWORD<>24 THEN OWRET +; +.OW1 +; THIRD TO SUBSEQUENT WORDS - print out oldest word +; in buffer, and shift the other two down + PARSEX4=0 ; index into OUTPUTBUFFER + GOSUB OWPRINT + PARSEX1=0 + PARSEX2=8 +.OW2 + PARSEX3=OUTPUTBUFFER(PARSEX2) + OUTPUTBUFFER(PARSEX1)=PARSEX3 + ADD PARSEX1,C1 + ADD PARSEX2,C1 + IF PARSEX1<16 THEN OW2 + MESSAGE COMMA + OUTPUTWORD=16 +.OWRET + RETURN + +.OWEND +; HAVE RECEIVED THE TERMINATOR + IF OUTPUTWORD=0 THEN OWRET ; NO WORDS OUTPUT AT ALL +; THERE MUST BE AT LEAST ONE WORD REMAINING IN BUFFER - SO OUTPUT IT + PARSEX4=0 ; index into OUTPUTBUFFER + GOSUB OWPRINT + IF OUTPUTWORD=8 THEN OWSTOP ; ONLY ONE WORD OUTPUT - SO THATS IT ! +; MUST HAVE OUTPUTWORD=2, SO 2 OR MORE WORDS OUTPUT. +; THEREFORE WANT TO FINISH OFF WITH "AND" + MESSAGE AND + PARSEX4=8 ; index into OUTPUTBUFFER + GOSUB OWPRINT +.OWSTOP + OUTPUTWORD=0 + MESSAGE DOT + RETURN +;--- +.OWPRINT +; Print words by message number starting at outputbuffer(PARSEX4) + PARSEX3=3 ; words to print +.OWPRINT1 + GOSUB READOUTBUFFER + PARSEX1=VALUE +;> IF OWTYPE=OWOBJECTS THEN DESCANOBJPARSEX1 + MESSAGE VALUE + SUB PARSEX3,C1 + IF PARSEX3>.DESCTHEOBJX1 +;>>; PRINT OUT 'THE ' +;>>; First check if can print 'it' +;>> IF PARSEX1<>LASTWORDPRINTED THEN DTOPARSEX2 +;>> MESSAGE 2002 ; 'it' +;>> RETURN +; +;>>.DTOPARSEX2 +;>> IF PARSEX1=USER THEN DTOXNOTHE ; PREVENT 'the you ...' +;>>; IF PARSEX1=MYGLAR THEN DTOXNOTHE +;>> MESSAGE THE +;>>.DTOXNOTHE +;>> GOTO DESCOBJPARSEX1 +;;--- +;.DOSOME +; MESSAGE 23 ; SOME +; GOTO DESCOBJPARSEX1 +;.DOAN +; MESSAGE 22 ; AN +;;--- +.DESCOBJPARSEX1 + LASTWORDPRINTED=PARSEX1 +;>>.DOPARSEX1A2 +;???* IF PARSEX1>MAXVISIBLEOBJECT THEN DESCOBJRET + IF PARSEX1>67 THEN DESCOBJCOLOSSAL + PARSEX2=OBJECTDESCBASE + ADD PARSEX2,PARSEX1 + MESSAGE PARSEX2 +.DESCOBJRET + RETURN +.DESCOBJCOLOSSAL ;>>MIKE 26/8/86 + IF PARSEX1>MAXOBJECT THEN DESCOBJRET + PARSEX2=1000 + ADD PARSEX2,PARSEX1 + MESSAGE PARSEX2 + RETURN +;;--- +.CHECKEXIT +; GOSUB ABSCHECKEXIT +; GOTO @SPECIALEXITS ; Exits conditional on game +;;--- +.ABSCHECKEXIT +; EXIT (From FROM diection DIR ) +; return DEST, DOOR, EXITVISIBLE + DOOR=FALSE + EXITVISIBLE=FALSE + EXIT FROM DIR STATUS DEST + IF DEST=0 THEN CERET +.CHECKEXITSTATUS + PARSEX1=STATUS + IF PARSEX1<4 THEN CE2 + DOOR=TRUE +;> CURRENTPOS(GENERALDOOR)=ROOM + SUB PARSEX1,C4 +.CE2 + IF PARSEX1>1 THEN CERET + EXITVISIBLE=TRUE +.CERET + RETURN +;;--- +;.CALCDIRECTION +;; given 'FROM', 'TO' as adjacent locations, +;; return 'DIR'=direction going from 'FROM' to 'TO' +; DIR=15 +;.CALCDIR1 +; SUB DIR,C1 +; GOSUB ABSCHECKEXIT +; IF DIR=0 THEN CALCDIRRET +; IF DEST<>TO THEN CALCDIR1 +;.CALCDIRRET +; RETURN +;;--- +.CRVARYMESSAGE + MESSAGE CR +.VARYMESSAGE +;; OUTPUT ONE OF THREE MESSAGES AT 'PARSEM1' +;; GOSUB RAND3 +;; ADD PARSEM1,NUMBER +; MESSAGE PARSEM1 +; RETURN + ADD CURRENTMESSAGE,C1 + IF CURRENTMESSAGE<3 THEN VMOK + CURRENTMESSAGE=0 +.VMOK + PARSEX1=PARSEM1 + ADD PARSEX1,CURRENTMESSAGE + MESSAGE PARSEX1 + RETURN +;--- +;------------------------------------- +;------------------------------------- +;--------------------------------- diff --git a/l9dev/regress/games.l9/colossal.l9/aparse.txt b/l9dev/regress/games.l9/colossal.l9/aparse.txt new file mode 100644 index 0000000..d11ec26 --- /dev/null +++ b/l9dev/regress/games.l9/colossal.l9/aparse.txt @@ -0,0 +1,1476 @@ +;Parser for Converted Trilogies + +;B:APARSE.TXT + +;Copyright (C) 1986 Level 9 Computing + +;Mike Austin 23/6/86 9:15 + +;Created from Dungeon version, which in turn came +;from the Quest version. All these three versions are identical except +;for the following: +; code to prevent invisible key/compass in dungeon/quest +; various jumps for funnies (particularly in quest) +; TEMPLISTBASE value + +;B:APARSE.TXT + +CONST + SIGNIFICANT=244 + +VAR + CSAVEHISEARCHPOS EVENTUALPREP + WANTWHATNOW + +TABLE ;>> + TEMPLISTBASE=1 ;2 for Quest and Dungeon ;>> + +BEGIN +.CANCELINPUT +; something of great importance has happened - remove +; rest of input from line + GOSUB @CLEARINPUT + NOUN1=NULLOBJECT ;>> + EVERYTHING=FALSE ;>> + CURRENTOBJECT=NULLOBJECT ;>> + GOTO @RESETSTACK +; +;--- +.PRESENTMULTIPLE +; GIVEN VERB,PREP,NOUN2 AND OBJECTTABLE, +; CALL VERB ONCE FOR EACH OBJECT SPECIFIED BY OBJECTTABLE +; EVERYTHING, IT ETC. ARE HANDLED HERE +; Work down from top so static objects, containers come first + MESSAGE CR + DIR=C0 ; prevent some SPECIALMOVES being triggered +; GOSUB @CONVERTVERB + + IF VERB=C0 THEN NOAGAIN1 + AGAINVERB=VERB +.NOAGAIN1 + + GOSUB @SELECTOBJECTPOS +; +;; ??? as a kludge - test here to see if NOUN2 is present +; IF NOUN2=NULLOBJECT THEN PM1 +; OBJECT=NOUN2 +; GOSUB CHECKIFPRESENT +; IF RESULT=FALSE THEN CANTSEEIT + +;>>.PM1 + IF EVERYTHING=TRUE THEN PMEVERYTHING +; handle individual objects + CURRENTOBJECT=C1 ; pointer into OBJECTTABLE +.PMSINGLE1 + OBJECT=OBJECTTABLE(CURRENTOBJECT) + IF OBJECT=C0 THEN PMSINGLEEND + +; GOSUB @CHECKIFACCESSIBLE +; IF RESULT=TRUE THEN PMSINGLE2 +; GOSUB @OBJECTNOTHERE +; HAVECALLEDVERB=TRUE +; GOTO PMSINGLENEXT +;.PMSINGLE2 + NOUN1=OBJECT + HAVECALLEDVERB=TRUE + GOTO CALLVERB ;>> was GOSUB + +.PMSINGLENEXT + ADD CURRENTOBJECT,C1 + GOTO PMSINGLE1 + +.PMSINGLEEND + IF HAVECALLEDVERB=TRUE THEN @GETNEWINPUT ;>> was PMSINGLERET + NOUN1=NULLOBJECT + GOTO CALLVERB ;>> was GOSUB + +;--- +.PMEVERYTHING + CURRENTOBJECT=MAXOBJECTVISIBLE + NOUN1=NULLOBJECT +.PMEV1 +; +; check if object if forbidden +; + OBJECT=CURRENTOBJECT + +;>>> IF OBJECT=153 THEN PMEV3 ;>> For Dungeon. Exclude 'KEY' from 'ALL' +;>>> IF OBJECT=61 THEN PMEV3 ;>>For Quest. Exclude 'COMPASS' from 'ALL' + + GOSUB @CHECKIFACCESSIBLE + + IF RESULT=FALSE THEN PMEV3 + +; SEARCHDEPTH=1 +; GOSUB @CHECKIFOBVIOUS +; IF OBVIOUS=FALSE THEN PMEV3 + + GOSUB @CHECKIFFORBIDDEN + IF RESULT=TRUE THEN PMEV3 + + NOUN1=CURRENTOBJECT + HAVECALLEDVERB=TRUE + GOTO CALLVERB ;>> was GOSUB + +.PMEV3 + SUB CURRENTOBJECT,C1 + IF CURRENTOBJECT>MINOBJECT THEN PMEV1 + NOUN1=NULLOBJECT ;>> added + IF HAVECALLEDVERB=TRUE THEN @GETNEWINPUT ;>>was PMRET + GOTO CALLVERB ;>> was GOSUB + +;--- +.CALLVERB +; GIVEN VERB,PREP,NOUN1,NOUN2, +; DO THE JUMP-TABLE INDEXING ON THE VERB + + MESSAGE CR +; CSAVEHISEARCH=HISEARCHPOS + + IF NOUN1=NULLOBJECT THEN CALLVERBNODESC + IF EVERYTHING=TRUE THEN CALLVERBDESC + IF VERBSTOCALLUSER THEN CALLVERBNODESC + + IF EVERYTHING=FALSE THEN NOXXX ;>>> + ITWORD=NOUN1 ;>>> +.NOXXX ;>>> + + IF NOUN1=SIGNIFICANT THEN CALLVERBNODESC ;>> + PARSEX1=NOUN1 + GOSUB @DESCOBJPARSEX1 + MESSAGE COLON + +.CALLVERBNODESC + GOTO @GETEND1 ;>> was GOSUB ABSCALLVERB + +; HISEARCHPOS=CSAVEHISEARCH +; RETURN +;;--- +.CHECKIFACCESSIBLE +; return RESULT=TRUE if OBJECT is accessible to VERB +; objects must be present in way HISEARCHPOS + IF OBJECTHINUMBEROFFSET THEN CIANOTNUMBER + PARSEX1=NUMBEROFFSET +; OBJECT=BUTTONS + +.CIANOTNUMBER + IF OBJECT>MAXOBJECT THEN @CHECKIFSCENERYHERE +; + IF HISEARCHPOS<>NONSPECIFIC THEN CIANOTNS + GOSUB @ISOBJECTHERE + IF RESULT=TRUE THEN CIAHAVECHECKED + GOTO CIAISITOWNED + +.CIANOTNS + IF HISEARCHPOS<>NOUNCARRIED THEN CIANOTCARRIED +.CIAISITOWNED + GOSUB @ISOBJECTCARRIED + GOTO CIAHAVECHECKED + +.CIANOTCARRIED + GOSUB @ISOBJECTHERE +; +.CIAHAVECHECKED + RETURN +;--- +.PRINTINPUTWORD + MESSAGE QUOTE + PRINTINPUT + MESSAGE QUOTE + RETURN +;--- +.PARSENOTKNOWN ; WORD NOT RECOGNIZED + MESSAGE 2005 ; I don't know the word + GOSUB PRINTINPUTWORD + PARSEM1=C0 + GOTO PARSEERROR +;--- +.SECONDPREP +.PARSENOVERB +.CANTUSEHERE +; IF PLAYER<>USER THEN NPCNOTUNDERSTOOD + MESSAGE 2003 + GOSUB PRINTINPUTWORD + PARSEM1=2004 + GOTO PARSEERROR +;--- +.NOTCLEAR +; User has referred to a piece of scenery which is not nearby +; IF PLAYER<>USER THEN NPCNOTUNDERSTOOD + PROCESSED=TRUE ;>> MIKE 21/6/86 + ITWORD=NULLOBJECT + OBJECT=C0 + HAVECALLEDVERB=TRUE +; >>MIKE 9/9/86 - "I can't see a mention of .." code +; PRINTINPUT +; MESSAGE COLON + MESSAGE 2020 ; I can't see a mention of " + PRINTINPUT + MESSAGE 2021 ; " here. + RETURN +;--- +.DONTUNDERSTAND +; general error message when the parsing has borken +; down for some reason + PARSEM1=2010 +; drop through to PARSEERROR +;- +.PARSEERROR +; IF PLAYER<>USER THEN NPCNOTUNDERSTOOD + MESSAGE PARSEM1 + MESSAGE DOTCR + GOTO @CANCELINPUT +;--- +.PARSEINPUT +; CONVERT INPUT TO VERB, PREP, OBJECT FORM FOR +; EASY UNDERSTANDING BY THE REST OF THE PROGRAM + + HAVECALLEDVERB=FALSE + GOSUB @GETNEXTWORD + VERB=C0 + IF EOL=TRUE THEN @PIEND; NOTHING ENTERED ! +; +;; is player trying to talk to someone ? +; SEARCHTYPE=NOUNTYPE +; GOSUB @CHECKTYPE +; IF VALUENPCMAX THEN PINOTNPC +;; yes, so is the target here ? +; OBJECT=VALUE +; GOSUB CHECKIFPRESENT +; IF RESULT=TRUE THEN PINPC +; MESSAGE 2060 ; talking to yourself ? +; GOTO CLEARINPUT +; +;>>.PINOTNPC + SEARCHTYPE=VERBTYPE + GOSUB @CHECKTYPE + IF VALUE<>C0 THEN PI0 + + SEARCHTYPE=NOUNTYPE + GOSUB @CHECKTYPE + IF VALUE>NEGATIVE THEN @PARSENOVERB ;>> + IF VALUE>IGARBAGE THEN PARSEINPUT ; CONJUNCTION ENTERED, SO TRY AGAIN + GOTO @PARSENOVERB ; Wrong type of word found + +.PI0 + IF VALUE<>IAGAIN THEN PI0A + + VERB=AGAINVERB + GOTO @PIEND ;>> IF LASTVERBVALID=TRUE THEN @PIEND + +;>>.LASTVERBINVALID +; IF PLAYER<>USER THEN NPCNOTUNDERSTAND +;>> PARSEM1=2050 ; last verb not valid +;>> GOSUB @VARYMESSAGE +;>> GOTO @CANCELINPUT + +.PI0A + VERB=VALUE + + IF VERB=C0 THEN NOAGAIN2 + AGAINVERB=VERB +.NOAGAIN2 + +;>>.VERBPLUS + OBJECTTABLE(C0)=C0 + OBJECTTABLE(C1)=C0 + EVERYTHING=FALSE ; EVERYTHING NOT DETECTED YET + EXCEPT=FALSE ; EXCEPT NOT DETECTED YET + PREP=C0 + EVENTUALPREP=C0 + NOUN1=NULLOBJECT ; NEEDED ? + NOUN2=NULLOBJECT + VERBSTOCALL=C0 + LASTVERBVALID=FALSE + +; IF VERB=IGETME THEN @GETME ;*** + IF VERB<9 THEN PIEND ; directions have no objects, but +; things like IN, CLIMB CAN have objects e.g. ON TABLE + +; VERB MAY BE FOLLOWED BY SOMETHING ELSE +; GOSUB @CONVERTVERB + GOSUB @SELECTOBJECTPOS + +.PINEXT +;>>.PIANOTHERNOUN + GOSUB @GETNEXTWORD + + IF SEPARATOR=TRUE THEN PINEXT + IF EOL=TRUE THEN PIEND +;>>.PINEXT1 + +; IF VERB=ISAY THEN @SAY +; IF VERB=IDROP THEN PINOTPREP ; DROP BENCH AND ON + + SEARCHTYPE=PREPTYPE + GOSUB @CHECKTYPE + +;"LOOK AT" = "EXAMINE" + IF VALUE=C0 THEN PINOTPREP ;>> + IF VERB<>ILOOK THEN PIPREP ;>> + VERB=IEXAMINE ;>> + VALUE=C0 ;>> +;>> IF VALUE<>C0 THEN PIPREP + +.PINOTPREP + OBJECT=VALUE + GOSUB @CHECKNOUN + + IF OBJECT<>C0 THEN PIEXAMINENOUN + IF PROCESSED=TRUE THEN PINEXT + + SEARCHTYPE=ASCITYPE + GOSUB @CHECKTYPE + IF VALUE=ICOMMA THEN PINEXT + IF VALUE<>C0 THEN PINEXT + + SEARCHTYPE=NUMBTYPE + GOSUB @CHECKTYPE + IF VALUE=C0 THEN PINOTNUMBER + +; OBJECT=BUTTONS + ADD VERBSTOCALL,C1 + GOTO PINEXT + +.PINOTNUMBER +; ANYTHING ELSE (CONJ, VERBS ETC.) TERMINATE THIS SENTENCE + GOSUB @GOBACK ; STORE (VERB?) FOR FUTURE ANALYSIS + +.PIEND + IF EVENTUALPREP=C0 THEN PIRET + PREP=EVENTUALPREP +.PIRET + RETURN + +.PIPREP + IF PREP<>C0 THEN @SECONDPREP ; GOT A SECOND PREP + PREP=VALUE +; GOSUB @CONVERTVERB + GOSUB @SELECTOBJECTPOS + GOTO PINEXT + +.PIEXAMINENOUN + IF OBJECT<>IIT THEN PINOTIT + OBJECT=ITWORD + IF OBJECTUSER THEN NPCNOTUNDERSTAND + MESSAGE 2053 ; it's not clear what IT refers to here + GOTO @CANCELINPUT + +.PINOTIT + IF PREP<>C0 THEN @PINOUN2 + IF OBJECT=IEVERYTHING THEN PIEVERYTHING + IF OBJECT=IEXCEPT THEN @PIEXCEPT +; GOT AN ORDINARY NOUN SPECIFIED + ITWORD=OBJECT + IF OBJECTHINUMBEROFFSET THEN PION0 + + NOUN2=OBJECT ;>>Dungeon wants I3 as the number keyword + + GOTO @PINEXT +; +.PION0 + PARSEX1=NOUNFORBIDDEN ; mark noun as forbidden + IF EXCEPT=TRUE THEN PIMARK ; DON'T CHECK IT'S HERE (YET) +; mark ordinary noun + PARSEX1=NOUNSPECIFIED +.PIMARK + NOUN1=OBJECT + GOSUB MARKOBJECT ; MARK NOUN AS SPECIFICALLY REQUESTED + GOTO @PINEXT +; +.PIEVERYTHING + EVERYTHING=TRUE + GOTO @PINEXT + +;--- +.STRIPX1 +; STRIP OFF TOP TWO BITS OF PARSEX1. + IF PARSEX1<64 THEN STRIPX1RET + PARSEX2=64 + SUB PARSEX1,PARSEX2 + GOTO STRIPX1 +.STRIPX1RET + RETURN +;--- +.CHECKIFSCENERYHERE +; given OBJECT as a noun requested by user (relative to NOUNOFFSET) +; see if it is part of a room description, and +; if so, return RESULT=TRUE if in current room +;> PARSEX1=NOUNOFFSET +;> ADD PARSEX1,OBJECT +;> IF OBJECT>1999 THEN RETURNTRUE ;>2000, so a random output message + GOSUB @SETUPROOM ;>> only needed for early games + PARSEX1=OBJECT ;>> only needed when room descs are before objects + PARSEX2=SHORTROOMDESCS + SUB PARSEX1,PARSEX2 + IF PARSEX1=ROOM THEN RETURNTRUE +; PARSEX2=300 ; LONGROOMDESCS-SHORTROOMDESCS ;>> +; SUB PARSEX1,PARSEX2 ;>> +; IF PARSEX1<>ROOM THEN RETURNFALSE ;>> + GOTO RETURNFALSE ;>> +; drop through to return TRUE +.RETURNTRUE + RESULT=TRUE + RETURN +.RETURNFALSE + RESULT=FALSE + RETURN +;--- +.MARKOBJECT +; mark object as PARSEX1 + PARSEX2=OBJECTTABLE(C0) + IF PARSEX2=C0 THEN MARKOBJ1 + IF PARSEX1<>PARSEX2 THEN @DONTUNDERSTAND ; have had both mark and prevent types +.MARKOBJ1 + PARSEX2=C1 +.MARKOBJ2 + PARSEX3=OBJECTTABLE(PARSEX2) + IF PARSEX3=OBJECT THEN MARKOBJRET ; already marked + IF PARSEX3=C0 THEN MARKOBJ3 + ADD PARSEX2,C1 + GOTO MARKOBJ2 + +.MARKOBJ3 + IF PARSEX2>60 THEN @DONTUNDERSTAND ; OBJECTTABLE OVERFLOW + ADD VERBSTOCALL,C1 + OBJECTTABLE(C0)=PARSEX1 + OBJECTTABLE(PARSEX2)=OBJECT + ADD PARSEX2,C1 + OBJECTTABLE(PARSEX2)=C0 +.MARKOBJRET + RETURN +;--- +.CHECKIFFORBIDDEN + RESULT=FALSE + PARSEX1=OBJECTTABLE(C0) + IF PARSEX1<>NOUNFORBIDDEN THEN CIFRET + PARSEX2=C1 +.CIF1 + PARSEX1=OBJECTTABLE(PARSEX2) + ADD PARSEX2,C1 + IF PARSEX1=C0 THEN CIFRET + IF PARSEX1<>OBJECT THEN CIF1 + RESULT=TRUE +.CIFRET + RETURN +;--- +.SCENERY +; Have got a noun which is in a room description or similar, +; so it is just scenery. Print an appropriate message. +; IF PLAYER<>USER THEN NPCNOTUNDERSTAND +; + PROCESSED=FALSE +; +; +;>> this section of code is the most incredible kludge +;>> ever seen in one of our adventure games. Frankly, it is +;>> amazing to me that it works as well as it does. However, +;>> it appears to be the only way of allowing scenery objects +;>> to be interacted with without actually adding them +;>> as specific objects (which is difficult where the same +;>> thing occurs in several places - e.g. piles of rocks etc. + GOSUB @SETUPROOM + IF VERB=27 THEN SCEN1 ;>>MIKE 18/8/86 - READ(27):=EXAMINE for colossal + IF VERB<>IEXAMINE THEN FUNNIES ; always allow them to happen +.SCEN1 +; but examine usually wants to sometimes tell player it is 'just scenery' +; where the scenery is important, and 'scenery' would be out of place, +; put in a jump to FUNNIES. +;>QUEST ONLY IF ROOM=60 THEN FUNNIES ; pile of rocks +;>QUEST ONLY IF ROOM=41 THEN FUNNIES ; examining stone slab +;>QUEST ONLY IF ROOM=7 THEN FUNNIES ; >> appalling kludge - MIKE 21/6/86 +;>QUEST ONLY IF ROOM=8 THEN FUNNIES ; >> " +;>QUEST ONLY IF ROOM=44 THEN FUNNIES +;>QUEST ONLY IF ROOM<82 THEN FUN3 ; underwater range +;>QUEST ONLY IF ROOM<98 THEN FUNNIES ; underwater range +;>QUEST ONLY.FUN3 +; +; +; + PROCESSED=TRUE ;>> MIKE 21/6/86 + ITWORD=NULLOBJECT + HAVECALLEDVERB=TRUE +;>>MIKE 9/9/86 PRINTINPUT +;>>MIKE 9/9/86 MESSAGE COLON + + OBJECT=C0 + + PARSEM1=2030 ; just scenery group + GOSUB @VARYMESSAGE + RETURN +;--- +.FUNNIES +;>> MIKE 21/6/86 +; if player is referring to scenery in a room +; where the scenery may be useful +; e.g. water, oil, piles of rocks etc. + OBJECT=SIGNIFICANT + PROCESSED=TRUE +;>> HAVECALLEDVERB=TRUE + RETURN +;--- + +.PIEXCEPT + EXCEPT=TRUE + GOTO @PINEXT + +.PINOUN2 +; another noun in input, not part of any multiple noun + IF NOUN2<>NULLOBJECT THEN @DONTUNDERSTAND +; + NOUN2=OBJECT + GOTO @PINEXT +;--- + +.CHECKTYPE +; SEE IF THERE IS A WORD OF WORDTYPE 'SEARCHTYPE' IN CURRENT WORD +; IF NOT, RETURN VALUE=0 +; IF THERE IS RETURN ITS WORD NUMBER IN VALUE + INDEX=0 + +.CHECKTYPEMORE + + GOSUB @READINPUTLIST + IF VALUE=0 THEN CHECKTYPERET ;>>MIKE 18/6/86 + IF WORDTYPE<>NUMBTYPE THEN CTNOTNUMBER + ADD INDEX,C2 ; numbers are 4 byte values + +.CTNOTNUMBER + ADD INDEX,C2 +;>>MIKE 18/6/86 IF VALUE=C0 THEN CHECKTYPERET + SOMETHINGPROCESSED=TRUE +; IF VALUE=IRUDE THEN @RUDEWORD + IF WORDTYPE<>SEARCHTYPE THEN CHECKTYPEMORE +; should maybe re-enable this IF WORDTYPE<>NOUNTYPE THEN CHECKTYPERET +; IF VALUE<470 THEN CHECKTYPERET +; IF VALUE>699 THEN CHECKTYPERET +; an examine message +; PARSEX1=470 +; SUB VALUE,PARSEX1 + +.CHECKTYPERET + RETURN +;--- + +.CHECKNOUN +;Check if noun if present in list 9. + +;Alternatives are checked in priority. It is very dangerous to do all +;checking in combined tests (this may not work for all conversions) +;so each alternative is isolated. Order of checks is: +; if not defined anywhere as "^N xxx" then return as 'not found' +; if it's 'noise' (4000-4001) +; if it's a keyword not originally in the game but which might have +; been added in anywhere (such as 'IT' 'ALL' and 'BUT') +; if it's a keyword for an object in the current room or worn/carried +; if it's scenery in the current room +; if it's a keyword for an object elsewhere +; if it's scenery elsewhere. + + IF PREP=C0 THEN CHECKNOUN1 + HISEARCHPOS=NONSPECIFIC +.CHECKNOUN1 + + GOSUB @CHECKNOUNDEFINED ;Check if any noun(s) exist in LIST 9. + IF RESULT=TRUE THEN CHECKNOUN2 +;Not defined anywhere as noun + PROCESSED=FALSE ;>> (Otherwise doesn't do TAKE xxx DROP xxx.) + OBJECT=C0 + RETURN + +.CHECKNOUN2 + GOSUB CHECKNOUNGARBAGE + IF RESULT=FALSE THEN CHECKNOUN3 +;Garbage word + PROCESSED=TRUE + OBJECT=C0 + RETURN + +.CHECKNOUN3 + GOSUB CHECKNOUNANYWHERE + IF RESULT=FALSE THEN CHECKNOUN4 +;Word like IT ALL BUT THEN.. + PROCESSED=FALSE + OBJECT=VALUE + RETURN + +.CHECKNOUN4 +;Must either be scenery (in a room description) or a keyword + + GOSUB @CHECKNOUNKEYWORD +; returns RESULT=TRUE if an actual object is referred to and present +; and OBJECT = value + IF RESULT=FALSE THEN CHECKNOUN5 +;Object +;>>MIKE 21/6/86 PROCESSED=TRUE +;>>MIKE 21/6/86 OBJECT=VALUE + RETURN + +;Must be scenery.. +.CHECKNOUN5 +;>; first check if it is a word that is always present +;> INDEX=0 +;>.CHECKNOUN5A +;> GOSUB CHECKTYPEMORE +;> IF VALUE=0 THEN CHECKNOUN5B +;> IF VALUE<850 THEN CHECKNOUN5A +;> IF VALUE>870 THEN CHECKNOUN5A +;> PROCESSED=FALSE +;> OBJECT=0 +;> RETURN ; something which is always present + +;.CHECKNOUN5B +; must be some type of scenery +; + GOSUB @CHECKNOUNROOM ; >> MOVED FROM BELOW + IF RESULT=TRUE THEN @SCENERY +; + GOSUB @CHECKNOUNSTATUS + IF RESULT=FALSE THEN CHECKNOUN6 +;Status noun + GOTO @SCENERY ;>> + +.CHECKNOUN6 + IF OBJECT>255 THEN @NOTCLEAR ;>>MIKE 8/7/86 +; + RETURN ;>> not found, so let the game itself decide + GOTO @NOTCLEAR ;Scenery elsewhere + +;>> MIKE 21/6/86.CHECKNOUN4A ;>> +;;Keyword not around and/or scenery not around, return keyword +; PROCESSED=TRUE ;>> +; OBJECT=VALUE ;>> +; RETURN ;>> +; +;----- +; +.CHECKNOUNGARBAGE +;Check if one of the possible nouns in LIST 9 is a garbage word. + SEARCHTYPE=NOUNTYPE + INDEX=C0 + GOSUB CHECKTYPE + OBJECT=C0 + +.CHECKGAR1 + IF VALUE=C0 THEN CHECKGAR2 + + IF VALUE<3000 THEN CHECKGAR2A ;>> NICK 22/07/86 + IF VALUE> NICK 22/07/86 +;>> NICK 22/07/86 IF VALUE=3000 THEN CHECKGAR3 +;>> NICK 22/07/86 IF VALUE=3001 THEN CHECKGAR3 + +.CHECKGAR2A ;>> NICK 22/07/86 + GOSUB @CHECKTYPEMORE + GOTO CHECKGAR1 + +.CHECKGAR2 + RESULT=FALSE + RETURN + +.CHECKGAR3 + RESULT=TRUE + RETURN + +;----- + +.CHECKNOUNANYWHERE +;Check if one of the possible nouns if LIST 9 is one of a +;group of keyword nouns which could be anywhere in the message file. +;(Because of possible clashes with other messages in the converted +;game these nouns may violate the rules on keyword numbering.) + + SEARCHTYPE=NOUNTYPE + INDEX=C0 + GOSUB @CHECKTYPE + OBJECT=C0 +.CHECKSPEC1 + + IF VALUE=C0 THEN CHECKSPEC1A + + IF VALUE=IIT THEN CHECKSPEC2 +;>> IF VALUE=ITHEN THEN CHECKSPEC2 + IF VALUE=IEXCEPT THEN CHECKSPEC2 + IF VALUE=IEVERYTHING THEN CHECKSPEC2 + IF VALUE=ISAVE THEN CHECKSPEC2 ;>> + IF VALUE=IRESTORE THEN CHECKSPEC2 ;>> + + SEARCHTYPE=NOUNTYPE + GOSUB @CHECKTYPEMORE + + GOTO CHECKSPEC1 + +.CHECKSPEC1A + OBJECT=C0 + RESULT=FALSE + RETURN + +.CHECKSPEC2 + OBJECT=VALUE + RESULT=TRUE + RETURN + +;----- + +.CHECKNOUNKEYWORD +;Check if there is a noun in LIST 9 which is in the range +;MINOBJECT thru MAXOBJECT. + + RESULT=TRUE + SEARCHTYPE=NOUNTYPE + INDEX=C0 +;>> MIKE 21/6/86 GOSUB CHECKTYPE + OBJECT=C0 + +.CHECKKEY1 + GOSUB @CHECKTYPEMORE ;>> MIKE 21/6/86 + IF VALUE=0 THEN CHECKKEYFALSE + +;Value will already have been 'adjusted' if it +;lies in the range MINADJUST..MAXADJUST + + IF VALUE>MAXOBJECT THEN CHECKKEY1 ;>> MIKE 21/6/86 + IF VALUE> MIKE 21/6/86 + + OBJECT=VALUE + GOSUB @CHECKIFACCESSIBLE ;>> MIKE 21/6/86 + IF RESULT=FALSE THEN CHECKKEY1 ;>> MIKE 21/6/86 +;>> MIKE 21/6/86 RESULT=TRUE + RETURN + +;>>MIKE 21/6/86.CHECKKEY2 +;>> GOSUB CHECKTYPEMORE +;>> GOTO CHECKKEY1 + +.CHECKKEYFALSE + RESULT=FALSE + RETURN + +;----- + +.CHECKNOUNSTATUS ;>> +;Check if nount in LIST 9 is present in a status message. + + SEARCHTYPE=NOUNTYPE + GOSUB @CHECKTYPE + + GOSUB @SETUPROOM + +.CHECKSTAT1 + IF VALUE=C0 THEN CHECKSTAT3 + + PARSEX1=VALUE + PARSEX2=NOUNOFFSET + ADD PARSEX1,PARSEX2 + IF PARSEX1MAXSTATUS THEN CHECKSTAT2 + RESULT=TRUE + RETURN + +.CHECKSTAT2 + GOSUB @CHECKTYPEMORE + GOTO CHECKSTAT1 + +.CHECKSTAT3 + RESULT=FALSE + RETURN + +;----- + +.CHECKNOUNROOM +;Check if noun is present in list 9. +;which corresponds to scenery of the current room location. + + SEARCHTYPE=NOUNTYPE + INDEX=C0 +;>>MKE21/6/86 GOSUB CHECKTYPE + + GOSUB @SETUPROOM ;Set ROOM=R1 + +.CHECKROOM1 + GOSUB @CHECKTYPEMORE ;>>MIKE 21/6/86 + IF VALUE=C0 THEN CHECKROOM2 + + PARSEX1=VALUE + PARSEX2=SHORTROOMDESCS + SUB PARSEX1,PARSEX2 + OBJECT=VALUE + RESULT=TRUE + IF PARSEX1=ROOM THEN CHECKROOM3 + GOTO CHECKROOM1 ;>>MIKE 21/6/86 +;>>MIKE 21/6/86 GOSUB CHECKTYPEMORE +;>>MIKE 21/6/86 IF VALUE<>C0 THEN CHECKROOM1 + +.CHECKROOM2 + RESULT=FALSE + +.CHECKROOM3 + RETURN + +;----- + +.CHECKNOUNDEFINED +;Check if there is a noun in LIST 9. + + SEARCHTYPE=NOUNTYPE +;>> INDEX=C0 + GOSUB @CHECKTYPE + + IF VALUE<>0 THEN CHECKSCENE1 + + OBJECT=VALUE + RESULT=FALSE + RETURN + +.CHECKSCENE1 + RESULT=TRUE + RETURN + +;----- + +.CLEARINPUT +; called after any errors - remove rest of input from line + IF NOMOREINPUT=TRUE THEN CLEARINPEND ;>> + INDEX=C0 + GOSUB READINPUTLIST + IF VALUE=C0 THEN CLEARINPEND + SUPRESSCHECKING=TRUE ; don't check words for validity + GOSUB GETNEXTWORD + GOTO CLEARINPUT +.CLEARINPEND + SUPRESSCHECKING=FALSE + RETURN + +;----- + +.GETNEXTWORD +; GET NEXT WORD IN LINPUT +; set EOL=TRUE if get ".", eol, etc. +; Set SEPARATOR=TRUE if get "." "," + IF NOMOREINPUT=TRUE THEN GNWEND + IF WORDNOTPROCESSED=TRUE THEN GNWEND ; HAVE USED GOBACK TO RETRIEVE + +; PARSEX1=C0 ;>> +;.CLEARLIST9 ;>> +; IF PARSEX1>33 THEN ENDCLEAR ;>> +; LIST9(PARSEX1)=C0 ;>> +; ADD PARSEX1,C1 ;>> +; GOTO CLEARLIST9 ;>> +;.ENDCLEAR ;>> + + INPUT PARSEX1 PARSEX1 PARSEX1 PARSEX1 + SEARCHTYPE=ASCITYPE + GOSUB @CHECKTYPE + IF VALUE<33 THEN GNW1 + IF VALUE<38 THEN GETNEXTWORD +.GNW1 + GOSUB CHECKEOL ; CHECK FOR "." "THEN" etc. +.GNWEND + WORDNOTPROCESSED=FALSE +.CIGRET + RETURN + +;----- + +.CHECKEOL + INDEX=C0 + GOSUB READINPUTLIST + SEPARATOR=FALSE + EOL=FALSE + IF VALUE=C0 THEN SETNOTHINGMORE + SEARCHTYPE=CONJTYPE + GOSUB @CHECKTYPE + IF VALUE=ITHEN THEN SETEOL + SEARCHTYPE=ASCITYPE + GOSUB @CHECKTYPE + IF SUPRESSCHECKING=TRUE THEN CHECKEOL1 + IF VALUE=128 THEN @PARSENOTKNOWN ; WORD NOT UNDERSTOOD +.CHECKEOL1 + IF VALUE=ICOMMA THEN SETSEPARATOR + IF VALUE=IDOT THEN SETEOL + RETURN +.SETSEPARATOR + SEPARATOR=TRUE + GOTO SETEOL + +.SETNOTHINGMORE +; There is no more input to come on this line + NOMOREINPUT=TRUE +.SETEOL + EOL=TRUE + RETURN +;--- +.GOBACK +; MARK CURRENT WORD AS UNPROCESSED, SO A SUBSEQUENT INPUT ROUTINE +; CAN GET A CHANCE AT READING IT + INDEX=C0 + GOSUB READINPUTLIST + IF VALUE=C0 THEN GOBACKRET + WORDNOTPROCESSED=TRUE +.GOBACKRET + RETURN +;--- +.READINPUTLIST + ; VALUE:=@INPUT(INDEX) 16 BIT. PARSEX1,PARSEX2 corrupted + VALUE=LINPUT(INDEX) + IF VALUE<>C1 THEN RILNOTNUMBER + WORDTYPE=NUMBTYPE + PARSEX1=INDEX + ADD PARSEX1,C1 + VALUE=LINPUT(PARSEX1) ; returns low order of number + RETURN + +.RILNOTNUMBER + WORDTYPE=VALUE +; STRIP OFF TOP THREE ( WORDTYPE ) BITS + PARSEX1=32 +.RIL1 + IF VALUE<32 THEN RIL2 + SUB VALUE,PARSEX1 + GOTO RIL1 +.RIL2 + GOSUB VALUETIMES256 + PARSEX1=C1 + ADD PARSEX1,INDEX + PARSEX2=LINPUT(PARSEX1) + ADD VALUE,PARSEX2 +; Separate out WORDTYPE = top three bits + PARSEX2=WORDTYPE + WORDTYPE=ASCITYPE + PARSEX1=ASCIOFFSET + IF PARSEX2<32 THEN RILRET + WORDTYPE=VERBTYPE + PARSEX1=VERBOFFSET + IF PARSEX2<64 THEN RILRET + WORDTYPE=CONJTYPE + PARSEX1=CONJOFFSET + IF PARSEX2<96 THEN RILRET + WORDTYPE=PREPTYPE + PARSEX1=PREPOFFSET + IF PARSEX2<128 THEN RILRET + WORDTYPE=NOUNTYPE + PARSEX1=NOUNOFFSET + IF PARSEX2<160 THEN RILRET + WORDTYPE=ADJETYPE + PARSEX1=ADJEOFFSET + IF PARSEX2<192 THEN RILRET + WORDTYPE=MATCHTYPE + PARSEX1=MATCHOFFSET + IF PARSEX2<224 THEN RILRET + WORDTYPE=7 + PARSEX1=C0 +.RILRET + IF WORDTYPE<>NOUNTYPE THEN NOADJUST ;>> + IF VALUE> + IF VALUE>MAXNOUNADJUST THEN NOADJUST ;>> + PARSEX1=ADJUSTOFFSET ;>> +.NOADJUST ;>> + SUB VALUE,PARSEX1 ; SUBTRACT OFFSET +;>>> IF VALUE>60000 THEN RILRET1 + RETURN +;>>.RILRET1 +;>> VALUE=C0 +;>> RETURN +;--- +.VALUETIMES256 + ADD VALUE,VALUE + ADD VALUE,VALUE + ADD VALUE,VALUE + ADD VALUE,VALUE + ADD VALUE,VALUE + ADD VALUE,VALUE + ADD VALUE,VALUE + ADD VALUE,VALUE + RETURN +;--- +.VALUEDIV256 +; divide VALUE by 256 +; must preserve PARSEX4 + PARSEX1=C0 + PARSEX2=256 +.VD256 + SUB VALUE,PARSEX2 + IF VALUE>NEGATIVE THEN VDEND + ADD PARSEX1,C1 + GOTO VD256 + +.VDEND + VALUE=PARSEX1 + RETURN +;--- + +.GETCOMMAND + I1=C0 ;>> + I2=C0 ;>> + I3=C0 ;>> + I4=C0 ;>> + WANTWHATNOW=TRUE + GOTO GI0 + +;--- + +.GETI1I2I3I4 ;>> +;Request input and return first two verbs in I1 and I2 + I1=C0 + I2=C0 + I3=C0 + I4=C0 + +.GETI1 + NOMOREINPUT=FALSE + WORDNOTPROCESSED=FALSE + SUPRESSCHECKING=TRUE + + GOSUB @GETNEXTWORD + + INDEX=C0 + GOSUB @READINPUTLIST + IF VALUE=C0 THEN GETI2 + IF I4>C1 THEN GETI1 ;Already found two verbs ? + + SEARCHTYPE=VERBTYPE ; Check if it's a verb + GOSUB @CHECKTYPE + IF VALUE=C0 THEN GETI1 + + ADD I4,C1 ;Number of verbs found + IF I4=C1 THEN GETI3 + I2=VALUE ;Save second verb + GOTO GETI1 +.GETI3 + I1=VALUE ;Save first verb + GOTO GETI1 + +.GETI2 + IF I4=C0 THEN GETI1I2I3I4 + SUPRESSCHECKING=FALSE + RETURN + +;----- + +;>> WANTWHATNOW=FALSE +;>> SUPRESSCHECKING=TRUE ; prevent bombing out on garbage input +;>> GOSUB GI0 ; get input +;>> IF VERB=C0 THEN GETI1I2I3I4 +;>> RETURN + +.GI0 + I1=C0 + I2=C0 + I3=C0 + IF NOUN1=NULLOBJECT THEN GETNEWINPUT +; in middle of presentmultiple + IF EVERYTHING=TRUE THEN @PMEV3 + GOTO @PMSINGLENEXT + +.GETNEWINPUT +;>> VERB=C0 ;>> 24/5/86 to fix 'TAKE ALL (cr) (cr)' problem + + NOUN1=NULLOBJECT + IF NOMOREINPUT=FALSE THEN GNI1 + NOMOREINPUT=FALSE + IF SOMETHINGPROCESSED=FALSE THEN GNI1 ; prevent CR giving WHAT NOW + SOMETHINGPROCESSED=FALSE + + IF WANTWHATNOW=FALSE THEN GNI1 + MESSAGE WHATNOW + +.GNI1 + EVERYTHING=FALSE ;?? + NOUN1=FALSE ;>>> + GOSUB @PARSEINPUT + if verb=0 then getnewinput ;>>mike 22/9/86 + GOTO @PRESENTMULTIPLE + +.GETEND1 + IF VERB=IEXITS THEN @PRINTEXITS + I1=VERB + IF VERB=C0 THEN GETEND5 ;>> +;>> IF PREP=C0 THEN GETEND2 + I2=PREP +.GETEND2 + IF NOUN1=NULLOBJECT THEN GETEND3 + I2=NOUN1 +.GETEND3 + IF NOUN2=NULLOBJECT THEN GETEND4 + I3=NOUN2 +.GETEND4 + I4=C3 + IF I3<>C0 THEN GOTIT + I4=C2 + IF I2<>C0 THEN GOTIT + I4=C1 + IF I1<>C0 THEN GOTIT +.GETEND5 ;>> + I4=C0 +.GOTIT +; MESSAGE CR ;*** +; PRINT I1 ;*** +; MESSAGE SPACE ;*** +; PRINT I2 ;*** +; MESSAGE SPACE ;*** +; PRINT I3 ;*** +; MESSAGE SPACE ;*** +; PRINT I4 ;*** +; MESSAGE DOTCR ;** + RETURN +;--- +.GETVALUE + GOSUB @GETNEXTWORD + SEARCHTYPE=VERBTYPE + GOSUB @CHECKTYPE + IF VALUE<>C0 THEN GOTIT + SEARCHTYPE=NOUNTYPE + GOSUB @CHECKTYPE + RETURN +;--- +.INITPARSER + CURRENTOBJECT=NULLOBJECT + NOUN1=NULLOBJECT + NOUN2=NULLOBJECT + NOMOREINPUT=TRUE + SOMETHINGPROCESSED=TRUE ; allow WHAT NOW to be printed + ITWORD=NULLOBJECT ;>> +; and clear out OBJECTTABLE + PARSEX1=C0 +.IP1 +;>> OBJECTTABLE(PARSEX1)=C0 + TEMPLISTBASE(PARSEX1)=C0 ;>> + ADD PARSEX1,C1 + IF PARSEX1<512 THEN IP1 ;>> +;>> IF PARSEX1<60 THEN IP1 + RETURN +;--- +.SELECTOBJECTPOS ;Is this code complete? + HISEARCHPOS=NOUNCARRIED + IF VERB=IDROP THEN SOPRET +;>>MIKE22/6/86 IF VERB=ITHROW THEN SOPRET + HISEARCHPOS=NOUNONGROUND + IF VERB=ITAKE THEN SOPRET + HISEARCHPOS=NONSPECIFIC +.SOPRET + RETURN + +;--- + +;.GETCOMMAND +; GOSUB @TICKCLOCK +;.GPARSEC0 +; STACK +;.GPARSEC1 +;; before printing What now?, check if any more commands waiting +; IF NOMOREINPUT=FALSE THEN GPARSEC3 ; still something left on line +; NOMOREINPUT=FALSE ; disable flag which is set on getting 0 from input +; IF SOMETHINGPROCESSED=FALSE THEN GPARSEC3 ; prevent CR producing 'WHAT NOW' +; MESSAGE 17 ; WHAT NOW ?% +; RANDOM PARSEX1 ; kick random number generator +; SOMETHINGPROCESSED=FALSE +; PLAYER=USER +; GOSUB SETUPROOM +;.GPARSEC3 +; GOSUB @PARSEINPUT +; IF VERB<>0 THEN GPARSEC4 +; GOTO GPARSEC0 +; +;.GPARSEC4 +; GOSUB @PRECOMMAND +; GOSUB PRESENTMULTIPLE ; HANDLE MULTIPLE OBJECTS, CALLING VERB REPEATEDLY +; GOTO @POSTCOMMAND +;--- +;>>.PMSINGLERET +;>> GOTO GETNEWINPUT ;>> was RETURN +;--- +;.PMRET +; GOTO GETNEWINPUT ;>> was RETURN +;--- +;.ABSCALLVERB +; +;; Come here to call verb without printing desc first +; LASTVERBVALID=TRUE +; OBJECT=NOUN1 +; HISEARCHPOS=NONSPECIFIC +; RESULT=TRUE +; GOSUB @FUNNIES +; IF RESULT=TRUE THEN @CVRET +; OBJECT=NOUN2 +; GOSUB @OBJECTTRIGGER +; IF RESULT=TRUE THEN @CVRET +; OBJECT=NOUN1 +; GOSUB @OBJECTTRIGGER ; TRIGGERS FOR ANY VERB ON OBJECT +; IF RESULT=TRUE THEN @CVRET ; FLAG NOT RESET, SO COMMAND PROCESSED +; +;; Do jump-table type indexing +;; Flow will return to PRESENTMULTIPLE when the verb has finished +; +;; IF VERB=ICLIMB THEN @CLIMB +;; IF VERB=IJUMP THEN @JUMP +;; IF VERB<16 THEN @MOVE +;; IF VERB=22 THEN @INVENTORY +;; IF VERB=IRESTORE THEN @RESTORE +;; IF VERB=ISAVE THEN @SAVE +;; IF VERB=IQUIT THEN @QUIT +; IF VERB=ILOOK THEN @DESCRIBEROOM +;; IF VERB=ILISTEN THEN @HEAR +;; IF VERB=ISMELL THEN @SMELL +;IF VERB=IWAIT THEN @WAIT +; IF VERB=ISLEEP THEN @SLEEP +; IF VERB=IVHELLO THEN @HELLO +; IF VERB=IKNOCK THEN @KNOCK +; +; IF VERB=IPICTURE THEN @PICTURE +; IF VERB=IWORDS THEN @WORDS +; IF VERB=ISTAND THEN @STAND +; IF VERB=ILIE THEN @LIE +; IF VERB=ISIT THEN @SIT +; IF VERB=ISCORE THEN @SCORE +; IF VERB=IVERBOSE THEN @VERBOSE +; IF VERB=IBRIEF THEN @BRIEF +; +; IF VERB=IGOTO THEN @GOTO ; ****** +; IF NOUN1<>NULLOBJECT THEN CVGOTNOUN +; IF PLAYER<>USER THEN NPCNOTUNDERSTAND +; M1=2033 ; must supply an object group +; GOTO @VARYMESSAGE + +;.CVGOTNOUN +; IF VERB<41 THEN TOOCOMPLEX +; IF VERB=IOPEN THEN @OPEN +; IF VERB=ITAKE THEN @TAKE +; IF VERB=IPICK THEN @TAKE +; IF VERB=IWEAR THEN @WEAR +; IF VERB=IDROP THEN @DROP +; IF VERB=IPUT THEN @PUT +; IF VERB=IEXAMINE THEN @EXAMINE +; IF VERB=IATTACK THEN @ATTACK +; IF VERB=ICUT THEN @CUT +; IF VERB=IREMOVE THEN @REMOVE +; IF VERB=ITHROW THEN @THROW +; IF VERB=IEAT THEN @EAT +; IF VERB=IPUSH THEN @PUSH +; IF VERB=IPULL THEN @PULL +; IF VERB=IRING THEN @VRING +; IF VERB=IGIVE THEN @GIVE +; IF VERB=IWAKE THEN @WAKE +; IF VERB=ISQUEEZE THEN @SQUEEZE +; IF VERB=ICAST THEN @CAST +; IF VERB=IFASTEN THEN @FASTEN +; IF VERB=IRUB THEN @RUB +;IF VERB=ILIGHT THEN @LIGHT +;IF VERB=IEXTINGUISH THEN @EXTINGUISH +; MESSAGE 2036 ; don't understand verb +;.CVRET +; RETURN +;;--- +;.TOOCOMPLEX +; MESSAGE 2039 ; sentence is too complex +; RETURN +;;--- +;>>.PARSETOOMUCH ; TOO MUCH ENTERED +;>> PARSEM1=2001 +;>> GOTO PARSEERROR +;--- +;>>.PARSENOOBJECT +;>> PARSEM1=2002 +;>> GOTO PARSEERROR +;--- +;.NPCLOOKSFORSOMETHING +; GOSUB ISNPCVISIBLE +; IF RESULT=FALSE THEN NPCLFSRET +; PARSEX1=PLAYER +; GOSUB @DESCTHEOBJPARSEX1 +; MESSAGE 2065 ; looks around as if looking for something +;.NPCLFSRET +; RETURN +;;--- +;.NPCNOTUNDERSTOOD +; an NPC (variable PLAYER) is trying to do something which it can't +;; PARSEX1=CURRENTPOS(USER) +;; PARSEX2=CURRENTPOS(PLAYER) +;; IF PARSEX1<>PARSEX2 THEN NCRET +; GOSUB ISNPCVISIBLE +; IF RESULT=FALSE THEN NPCLFSRET +; PARSEX1=PLAYER +; GOSUB DESCTHEOBJPARSEX1 +; M1=2062 ; looks puzzled +; GOSUB VARYMESSAGE +; GOTO CANCELINPUT +;--- +;.NPCCONFUSED +;; NPC has been instructed to do something which it can't +;; but, don't want to stop, so print a message like +;; 'the frak looks around, as if searching for something' +;; and then carry on with processing the rest of the command (if any) +; M1=2065 ; NPC is confused +; GOTO PRINTM1 +;--- +;.OBJECTNOTHERE +; THE OBJECT IS NOT AVAILBALE TO THE COMMAND +; THIS ERROR RETURNS AS IT IS USED IN PRESENTMULTIPLE +; IF OBJECT=C0 THEN ONTRET +; IF PLAYER<>USER THEN NPCLOOKSFORSOMETHING +; IF HISEARCHPOS=NOUNONGROUND THEN ONT1 +; IF HISEARCHPOS=NONSPECIFIC THEN CANTSEEIT +; MESSAGE 2012 ; don't have.. +;.ONTERROR +; MESSAGE THE +; PARSEX1=OBJECT +; GOSUB @DESCTHEOBJX1 +; MESSAGE DOT +; GOTO @CANCELINPUT + +;.ONT1 +; POS=PLAYER +; HIPOS=NONSPECIFIC +; GOSUB @CHECKOBJECTPOS +;>> GOSUB ISOBJECTCARRIED +;>> IF RESULT=TRUE THEN ONT2 +;>>.CANTSEEIT +;>> IF OBJECT=IEVERYTHING THEN CANTUSEHERE ; EVERYTHING as NOUN2 +;>> GOSUB ISOBJECTCARRIED +; POS=PLAYER +; HIPOS=NONSPECIFIC +; GOSUB @CHECKOBJECTPOS +;>> IF RESULT=TRUE THEN ONT2 +;>> MESSAGE 2011 ; Can't see .. +;>> GOTO ONTERROR +;>>.ONT2 +;>> IF VERB=ISTAND THEN ONTDROPFIRST +;>> MESSAGE 2013 ; Already have .. +;>> GOTO ONTERROR + +;>>.ONTDROPFIRST +;>> MESSAGE 2014 ; have to drop it first +;>>.ONTRET +;>> RETURN +;---- +;>>.ITSNOTTHERE +; user asked for NOUN1 in NOUN2 or similar +; but NOUN1 is not contained by NOUN2 +;>> MESSAGE 2017 ; it's not there +;>> RETURN +;--- +;.PARSEINPUT +; CONVERT INPUT TO VERB, PREP, OBJECT FORM FOR +; EASY UNDERSTANDING BY THE REST OF THE PROGRAM +; HAVECALLEDVERB=FALSE +; GOSUB @GETNEXTWORD +; VERB=C0 +; IF EOL=TRUE THEN @PIEND; NOTHING ENTERED ! +; +;; is player trying to talk to someone ? +; SEARCHTYPE=NOUNTYPE +; GOSUB @CHECKTYPE +; IF VALUENPCMAX THEN PINOTNPC +;; yes, so is the target here ? +; OBJECT=VALUE +; GOSUB CHECKIFPRESENT +; IF RESULT=TRUE THEN PINPC +; MESSAGE 2060 ; talking to yourself ? +; GOTO CLEARINPUT +; +;.CANTTALKTOSEVERAL +;; can't talk to more than one person +; MESSAGE 2061 +; GOTO CLEARINPUT +; +;.PINPC +;; set up conversation target as player +; IF PLAYER<>USER THEN CANTTALKTOSEVERAL +; PLAYER=VALUE +; GOSUB SETUPROOM +; GOSUB GETNEXTWORD ; first word of what's said +; GOTO SAY +; +;>>.LASTVERBINVALID +; IF PLAYER<>USER THEN NPCNOTUNDERSTAND +;>> PARSEM1=2050 ; last verb not valid +;>> GOSUB @VARYMESSAGE +;>> GOTO @CANCELINPUT + +;.PI0A +;>> IF VALUE<>IRAM THEN PI0B ;>> +;>> GOSUB @GETNEXTWORD ;>> +;>> I2=VALUE ;>> +;>> GOTO @RAMCOMMAND ;>> + +; +;.PION0 +; IF OBJECTSPELLMAXPLUSONE THEN PION1 +; SPELL=OBJECT +; GOTO PINEXT + +;.PION1 +;; hold on a moment. There are certain constructs where +;; the first noun can be the destination +;; e.g. "GIVE ME THE MANDRAKE" +; IF VERB<>IGIVE THEN PION2 +; IF OBJECT=USER THEN PIGIVE +; IF OBJECT>NPCMAX THEN PION2 +; IF OBJECT>NPCBASE THEN PIGIVE +; +;>>.PIGIVE +;>> IF PREP<>C0 THEN DONTUNDERSTAND +;>> NOUN2=OBJECT +;>> EVENTUALPREP=ITO +;>> GOTO @PINEXT +;--- +;>>.CNNOTCLEAR1 +;>>; OBJECT>MAXOBJECT, see if it is valid +;>> IF OBJECT=IEVERYTHING THEN CHECKNNORMAL +;>> IF OBJECT=IIT THEN CHECKNNORMAL +;>> IF OBJECT=IEXCEPT THEN CHECKNNORMAL +;>> GOTO @NOTCLEAR +; +;.CHECKNOUNEND +; IF OBJECTSPELLMAXPLUSONE THEN CNENSPELL +; GOTO CHECKNNORMAL +;--- +; .CHECKOBJECTPOS +; Return RESULT=TRUE if 'OBJECT' is +; at 'HIPOS', 'POS' +; if POS=0, it is treated as NONSPECIFIC +; likewise, HIPOS=NONSPECIFIC is handled +; return PARSEX4=lo position of object (or object if on ground) +; PARSEX4=OBJECT +;.COP1 +; IF POS=C0 THEN COPHI +; PARSEX1=CURRENTPOS(PARSEX4) +; IF PARSEX1<>POS THEN @COPNOTYET +;.COPHI +; lo address is same, now check hi address +; PARSEX1=HICURRENTPOS(PARSEX4) +; IF PARSEX1=C0 THEN COPHI1 +; IF HIPOS=NONSPECIFIC THEN COPFOUND ; provided object is contained +;.COPHI1 +; IF PARSEX1<>HIPOS THEN COPNOTYET +;.COPFOUND +; RESULT=TRUE +; RETURN +;.COPNOTFOUND +; RESULT=FALSE; +; RETURN +; +;.COPNOTYET +; PARSEX1=HICURRENTPOS(PARSEX4) +; IF PARSEX1=C0 THEN COPNOTFOUND +; PARSEX4=CURRENTPOS(PARSEX4) +; GOTO COP1 +;--- +;.CHECKIFPRESENT +;; is OBJECT in same room as player ? +; SAVEHISEARCHPOS=HISEARCHPOS +; HISEARCHPOS=NONSPECIFIC +; GOSUB CHECKIFACCESSIBLE +; HISEARCHPOS=SAVEHISEARCHPOS +; RETURN + +;----- +;------------------------------------- +;------------------------------ diff --git a/l9dev/regress/games.l9/colossal.l9/apconst.txt b/l9dev/regress/games.l9/colossal.l9/apconst.txt new file mode 100644 index 0000000..90b8bb5 --- /dev/null +++ b/l9dev/regress/games.l9/colossal.l9/apconst.txt @@ -0,0 +1,168 @@ +;Parser constants, variables and lists for Converted Trilogies + +;Copyright (C) 1986 Level 9 Computing + +;B:APCONST.TXT + +;----- + +; Most constants are game-specific. + +CONST + +;Values allowed in 'VERSION': + GAMECODE=1 ;Unique game number + PREVIOUSGAMECODE=0 ;Only required for second/final part + +;Values allowed in 'GAMESOLVED': + JUSTPLAYING=0 ;Not solved previous part(s), Not an end position + ENDPOSITION=1 ;End position for game. + SOLVING=2 ;Solved previous part(s), Not an end position + + FIRSTPART=1 ;If non-zero prevents RESTORE from chaining + FINALPART=0 ;If non-zero at end of game does not SAVE + + WHATNOW=13 + +;----- + +; NOW CONSTANTS FOR COMMON MESSAGES + + OK=2006 ;>>MIKE 23/6/86 + + SPACE=3011 + COMMA=3000 + CR=3003 + AND=3010 + DOTCR=3004 + DOT=3001 +; THE=3009 + COLON=3002 + QUOTE=3008 + + NONSPECIFIC=31 ; USE IN POSITION SEARCH WHERE TYPE UNKNOWN + +; Bases for text blocks + + OBJECTDESCBASE=515 ;Same as ADJUSTOFFSET + SHORTROOMDESCS=64636 ;65536-(NOUNOFFSET-100) Start of room descriptions + + MAXOBJECTVISIBLE=70 ;>>MIKE 23/6/86 + MINOBJECT=34 ;actually MINOBJECT-1 + MAXOBJECT=104 ;>> 100 + + MINSTATUS=1 ; change to 100 to fix bug in squasher which + MAXSTATUS=2 ; 328 prevents all nouns being reported + + NUMDIRECTIONS=16 ;Exits 0 thru 15 + +; Keyword values: + + INORTH=1 + ICROSS=13 + ITAKE=16 + IDROP=17 + ITHROW=18 + IQUIT=31 + IYES=75 + INO=76 + ILOOK=78 + ISAVE=92 + IRESTORE=93 + IEXAMINE=95 + IRAM=96 + IOOPS=97 + IEXITS=240 + IAGAIN=241 + IEVERYTHING=250 ; EVERYTHING-NOUNOFFSET + IEXCEPT=251 + IIT=252 + ITHEN=385 + +; SAYINGS (RELATIVE TO NOUNOFFSET) + + IGARBAGE=2999 + NULLOBJECT=255 +; NULLNUMBER=65535 + +; WORD TYPE VALUES + + ASCITYPE=0 + VERBTYPE=2 ; V + CONJTYPE=4 ; J + PREPTYPE=6 ; P + NOUNTYPE=8 ; N + ADJETYPE=10 ; A + MATCHTYPE=12 ; C - used for matching with particular words - + ; e.g. was a reference to scenery the word 'panel' + NUMBTYPE=14 + ASCIOFFSET=0 + VERBOFFSET=1000 + CONJOFFSET=0 + PREPOFFSET=1000 + NOUNOFFSET=1000 + ADJEOFFSET=0 + MATCHOFFSET=4300 ;used for matching with particular words + NUMBEROFFSET=1 ;offset within NOUNOFFSET + HINUMBEROFFSET=0 ;highest number offset + + MINNOUNADJUST=550 ;Lowest 'INV' object message + MAXNOUNADJUST=582 ;Highest + ADJUSTOFFSET=515 ;NOUNOFFSET-MINNOUNOFFSET + +; ASCII VALUES + + ICOMMA=44 + IDOT=46 + +;----- + + FALSE=0 + TRUE=1 + +; Constants for Objecttable assignments + + NOUNCARRIED=1 + NOUNONGROUND=2 + NOUNSPECIFIED=128 + NOUNFORBIDDEN=192 + + NEGATIVE=50000 + +;----- + +VAR + LASTOOPSROOM NEXTOOPSPOS NEXTOOPSEND + PARSEX1 PARSEX2 PARSEX3 PARSEX4 + VERB PREP NOUN1 NOUN2 INUMBER + VALUE + INDEX + FROM DEST STATUS ROOM DIR NUMEXITS + EXITVISIBLE + CURRENTOBJECT OBJECT HISEARCHPOS + LASTWORDPRINTED + OUTPUTWORD + RESULT + WORD1 WORD2 WORD3 WORD4 + PARSEM1 + LASTPICTURE + SEARCHTYPE WORDTYPE EXCEPT + WORDNOTPROCESSED EOL SEPARATOR EVERYTHING NOMOREINPUT + PROCESSED SUPRESSCHECKING + ITWORD ITNUMBER AGAINVERB + VERBSTOCALL HAVECALLEDVERB SOMETHINGPROCESSED LASTVERBVALID + CURRENTMESSAGE + DOOR + OOPSFL ; >> ANDY 26/6/86 + +;----- + +TABLE + OUTPUTBUFFER=7 + OBJECTTABLE=8 ; USED FOR EVERYTHING AND SIMILAR WORDS + LINPUT=9 + +;----- +;-------------------------------------------------- +;--------------------------------------------------- +;---------------------------------------------------- diff --git a/l9dev/regress/games.l9/colossal.l9/aspecial.txt b/l9dev/regress/games.l9/colossal.l9/aspecial.txt new file mode 100644 index 0000000..b42e233 --- /dev/null +++ b/l9dev/regress/games.l9/colossal.l9/aspecial.txt @@ -0,0 +1,1957 @@ +;Colossal Adventure 27/05/86 +;Converted from version on 17/01/84 +; +;>> extra messages 694,695,696 added at 27/8/86 by MJA +;>> (for the 16bit versions). If the small text games are re-issued, +;>> we will have to make the appropriate changes in their text +; +CONST + LIST3MAX=33 ;>>MIKE 27/8/86 + +BEGIN +;Copyright (C) 1984,1986 Level 9 Computing +.STARTGAME + CLEAR ;>> moved from L70 +; C0=0 ;>> + C1=1 ;>> + C2=2 ;>> + C3=3 ;>> + VERSION=GAMECODE ;>>Must be before 'RETURNTOSTART' + GAMESOLVED=JUSTPLAYING ;>> + +.RETURNTOSTART ;>> Only for 'CHAIN' + + SCREEN G C0 ;>> NICK 1/7/86 + CLS G ;>> NICK 1/7/86 + LASTPICTURE=501 ;>> NICK 1/7/86 + PICTURE LASTPICTURE ;>> NICK 1/7/86 + + GOSUB @INITPARSER ;>> +; +;>.L10 +;.L20 +;.L40 +;>> .L50 GOTO L70 ;COLD START +;>> .L60 GOTO @L450 ;WARM +;>> moved to STARTGAME .L70 CLEAR +;>>.L80 +;>> C1=1 ;moved to STARTGAME +;>>.L85 +;>> C2=2 ;moved to STARTGAME +;>> C3=3 ;moved to STARTGAME + C8=255 + +; X1=C0 ;>> +;.CLEARALL ;>> +; IF X1>255 THEN CLEAREND ;>> +; LIST1(X1)=C0 ;>> +; ADD X1,C1 ;>> +; GOTO CLEARALL ;>> +;.CLEAREND ;>> + + X1=C1 +.L120 X2=LIST2(X1) ;OBJECT ROOMS + LIST3(X1)=X2 + LIST5(X1)=C9 + LIST1(X1)=C9 + ADD X1,C1 + IF X1<34 THEN L120 ;Only 33 bytes long (?) +.L180 LIST1(X1)=C9 + ADD X1,C1 + IF X1<110 THEN L180 + T1=120 ;TIME LEFT + ;M1=0 ;NO. OF MOVES LEFT + ;F1=0 ;BOTTLE CONTENTS + ;F2=0 ;CAGE + F3=C2 ;BEAR CHAINED + ;D1=0 ;NUMDIE + W1=30 ;WITT'S END PROB. + ;D2=0 ;FIRST DWARF + D3=C2 ;DWARF ANGRY + ;D4=0 ;NO DWARVES IN ROOM + ;F4=0 ;TROLL LURKING + ;F5=0 ;CLAM + ;F6=0 ;PLANT SMALL + ;F7=0 ;FEE FLAG +;>> .L350 +;L1=0 ;LAMP OFF +;L2=0 ;LAMP MOVES +;S1=0 ;HALL MIST VISITED? +;E5=0 ;NORTH CHAINED ELVES +;E6=0 ;SOUTH CHAINED ELVES +;E4=0 ;NO KING +;S2=0 ;NO QUIT YET + S6=C1 ;NO SAVE YET + ;S3=0 ;ENDGAME SCORE + S5=216 ;SPIDER ROOM + ;T2=0 ;NOT IN ENDGAME + ;E1=0 ;NO BLAST YET + ;E2=0 ;SKELETONS + ;B1=0 ;NO ENDGAME BRIDGE YET + ;E3=0 ;ENDGAME DOOR OPEN + MESSAGE C1 ;Copyright message + MESSAGE 12 ;CR + R1=C1 + GOSUB @INITOOPS ;>> +.L450 GOTO @L4000 +.L500 GOSUB @L22000 ;CHECK IF ROOM IS WATERED + W5=W4 + IF R1<>50 THEN L505 + S1=C1;HALL OF MISTS +.L505 IF R1>165 THEN L510 + IF R1>49 THEN L530 +.L510 D4=C0 ;NO DWARVES + GOTO L650 +.L530 RANDOM X1 + IF X1>5 THEN L650 + IF X1C0 THEN L600 + ; FIRST DWARF + MESSAGE 91 + LIST3(26)=R1 ;AXE APPEARS + GOTO L630 +.L600 ; ANOTHER DWARF + MESSAGE 92 + ADD D4,C1 ;ANOTHER DWARF IN ROOM +.L630 ADD D2,C1 ;NO. OF DWARVES SEEN +.L650 + GOSUB @L33000 ;LAMP OUT ? +.L655 GOSUB @L32500 ;VOICE SAYS PLUGH +.L659 ;>> MESSAGE 13 ; WHAT NOW ? +.L660 +.RESETSTACK + STACK + GOSUB @OOPSCHECK ;>> + +.I4CHECK ;>> + GOSUB @GETCOMMAND ;>> INPUT I1 I2 I3 I4 + IF I4=C0 THEN I4CHECK ;>> + +.L665 GOSUB @L32000 ;HANDLE FEE ETC. PART 1 +.L670 IF I4=C0 THEN L660 +.L690 ; + JUMP @L800 I1 + +.L700 ; PIRATE + X1=LIST5(24) ;HAS CHEST BEEN SEEN + IF X1=C1 THEN L550 + R2=C8 + R3=C8 + GOSUB @L11000 + IF N3=C0 THEN L550 + R3=115 ;CHEST + LIST3(24)=R3 ;CHEST APPEARS IN MAZE + GOSUB @L11000 ;TREASURE + MESSAGE 93 + GOTO L650 +.L800 DATA @L1100,@L2000,@L2000,@L2000,@L2000 ;1-4 + DATA @L2000,@L2000,@L2000,@L2000,@L2000 ;5-9 + DATA @L2000,@L2000,@L2000,@L2000,@L2000 ;10-14 + DATA @L2000,@L5000,@L5500,@L6000,@L6500 ;15-19 + DATA @L23000,@L7000,@L7100,@L7200,@L7500 ;20-24 + DATA @L7900,@L8000,@L8600,@L7800,@L7600 ;25-29 + DATA @L8700,@L9500,@L9600,@L9700,@L9800 ;30-34 + DATA @LIGHT,@EXTINGUISH,@TURN,@L1300,@L1300 ;35-39 + DATA @L1300,@L1300,@L1300,@L27000,@L1300 ;40-44 + DATA @L1300,@L1300,@L1300,@L1300,@L1300 ;45-49 + DATA @L1300,@L1300,@L1300,@L1300,@L1300 ;50-54 + DATA @L1300,@L1300,@L1300,@L1300,@L1300 ;55-59 + DATA @L1300,@L1300,@L1300,@L1300,@L1300 ;60-64 + DATA @L1300,@L1300,@L1300,@L15800,@L1300 ;65-69 + DATA @L1300,@L4500,@L1300,@L1300,@L15900 ;70-74 + DATA @L1300,@L1300,@L16500,@LOOK,@L16200 ;75-79 + DATA @L16200,@L16200,@L16200,@L19000,@L19500 ;80-84 + DATA @L1300,@L1300,@L15000,@L15400,@L15700 ;85-89 + DATA @L16000,@L1100,@L29000,@RESTORE,@L27500 ;90-94 + DATA @EXAMINE,@RAMCOMMAND,@OOPS,@WORDS,@PICTURES ;95-99 + DATA @STARTGAME,@AUTHORS,@ILLEGALCOMMAND,@ILLEGALCOMMAND ;100-103 + DATA @ILLEGALCOMMAND,@HELP ; 104-105 + +.ILLEGALCOMMAND + GOSUB @CANCELINPUT +.ENDCOMMAND ;>> +.L1000 ; AFTER PLAYER ACTION, + GOSUB @L20000 ;ENDGAME BITS+PIECES +.L1010 ; TRY THE EVIL LITTLE DWARVES + IF R1<50 THEN @L500 + IF D4=C0 THEN @L500 + RANDOM X1 + IF X1>80 THEN @L500 ;DONT THROW KNIVES + MESSAGE 94 ;Knife thrown + X1=20 + IF D3=C0 THEN L1070 + X1=50 +.L1070 IF D4=C1 THEN L1090 + ADD X1,X1 +.L1090 RANDOM X2 + IF X2>X1 THEN L1098 ;MISSES + MESSAGE 95 ;Hits + GOTO L1500 ;DIE +.L1098 MESSAGE 96 ;Misses + GOTO @L500 +.L1100 MESSAGE 5 ;Don't understand + GOTO ILLEGALCOMMAND ;>>L1000 + +.L1200 + MESSAGE 6 ;Be specific + GOTO L1000 +.SPECIALALL + MESSAGE 2022 ; doesn't seem to be anything here + GOTO L1000 + +.L1250 MESSAGE 100 ;Can't + GOTO ILLEGALCOMMAND ;>>L1000 +.L1300 MESSAGE 7 ;What ? + GOTO ILLEGALCOMMAND ;>>L1000 +.L1350 MESSAGE 8 ;I don't see it here + GOTO L1000 +.L1400 MESSAGE 9 ;I don't have it + GOTO L1000 +.L1450 MESSAGE 77 ;Nothing to attack + GOTO L1000 +;----- +.L1500 ; DEATH COMES HERE + R2=R1 + R1=19 ;HEAVEN + IF T2>C0 THEN L1700 ;ENDGAME + ADD D1,C1 + X1=52 + ADD X1,D1 + MESSAGE X1 ;Sarcastic comment +.L1551 + MESSAGE 664 ;RESSURECT? + + GOSUB @ASKINPUT ;>> + IF RESULT=FALSE THEN L1551 ;>> + + GOSUB @L18000 ;GET YES/NO RESPONSE + IF Y1=C2 THEN L1551 + IF Y1=C0 THEN L1700 ;NO + IF D1> +.L1700 MESSAGE 82 ;You scored + GOSUB @L9000 ;CALCULATE SCORE + PRINT S4 + MESSAGE 81 ;out of 1000 + MESSAGE S7 ;RATING + IF S7<>682 THEN @QUITPLAYAGAIN ;>> 676 + GOTO @ASKFINAL ;>>Option to SAVE then QUITPLAYAGAIN + +;===== + +;>>.L19030 +;>> MESSAGE 13;REALLY QUIT? +;>> INPUT I1 I2 I3 I4 +;>> IF I1=C1 THEN @L3000;NO! +;>> IF I1=29 THEN @L51000;ANOTHER GAME +;>> MESSAGE 9;YES OR NO! +;>> GOTO L19030 + +;----- + +.EXAMINE ;>> + IF I4=C2 THEN EXAMINE1 + IF EVERYTHING=TRUE THEN SPECIALALL ; MIKE 9/9/86 + MESSAGE 6 ;I don't understand + GOTO @L1000 +.EXAMINE1 + + IF I2<>69 THEN NOTEXAMINEDWARF ;>> NICK 15/7/86 + IF D4=C0 THEN NOTEXAMINEDWARF ;>> NICK 15/7/86 + MESSAGE 1633 ;>> NICK 15/7/86 notices your gaze + GOTO @L1000 ;>> NICK 15/7/86 +.NOTEXAMINEDWARF ;>> NICK 15/7/86 + IF I2<>29 THEN EXAMINENWATER + MESSAGE 1700 ; water message + GOTO AFTEREXAMINE + +.EXAMINENWATER + IF I2<>28 THEN EXAMINENOIL + MESSAGE 1701 ; oil examine message + GOTO AFTEREXAMINE + +.EXAMINENOIL + OBJECT=I2 + GOSUB @CHECKFIXEDOBJECT + IF RESULT=FALSE THEN EXAMINE2 + GOSUB @L5300 ;Convert object number + GOTO EXAMINE4 + +.EXAMINE2 + GOSUB @L5300 ;Convert I2 to object number + IF I2>LIST3MAX THEN @SILLY + X1=LIST3(I2) + IF X1=R1 THEN EXAMINE4 ;on floor + IF X1=C8 THEN EXAMINE4 ;carried + MESSAGE 8 ;I don't see it here + GOTO @L1000 + +.EXAMINE4 + X1=1599 ;1600=Start of examine messages + ADD I2,X1 + MESSAGE I2 +.AFTEREXAMINE + MESSAGE DOT + GOTO @L1000 + +;----- +.L2000 ; MOVE +;>>MIKE 9/7/86 GOSUB @SAVEOOPS ;>> + EXIT R1 I1 X1 R2 + IF R1=77 THEN @L3300 ;WITT'S END + IF R1>165 THEN L2022 ;DIFF MAZE FORMULA + IF R1<145 THEN L2022 + IF R2<>C0 THEN L2022 + R2=R1 + ADD R2,I1 +.L2017 IF R2<166 THEN L2022 + X1=21 + SUB R2,X1 + GOTO L2017 +.L2022 + GOSUB @L26000 ;ENDGAME SPECIAL CASES + IF R2=C0 THEN L2070 + IF X1110 THEN L2100 + X2=LIST1(R1) + IF X2=C1 THEN L2100 ;GRATES OPEN + GOSUB L2300 ;SPECIAL CASES 1 + GOTO @L1000 +.L2070 MESSAGE 4 ;Notpos + GOTO @L1000 +.L2100 IF R2<>C8 THEN L2110 + MESSAGE 28 ;DIES + GOTO @L1500 +.L2110 GOSUB @L12000 ;LIGHT IN R1:L3=1,R2:L4=1 + IF L3=C1 THEN L2200 + IF L4=C1 THEN L2200 + RANDOM X1 + IF X1>85 THEN L2200 + MESSAGE 52 ;Die + GOTO @L1500 +.L2200 + GOSUB L2500 ;SPECIAL CASES 2 +.L2210 + + IF R1<>33 THEN NOTLENSMOVE ;>> + IF R2<>34 THEN NOTLENSMOVE ;>> + GOSUB @LENSLOKAPPOLOGY ;>>MIKE 15/9/86 MESSAGE 2330 ; sorry about this! + GOSUB @LENSLOK ;>> + IF RESULT=FALSE THEN @L4000 ;>> +.NOTLENSMOVE ;>> + GOSUB @SAVEOOPS ;>> MIKE 9/7/86 + R1=R2 + GOTO @L4000 ;DESC ROOM +.L2300 ; MESSAGES FOR GRATES ETC. + IF R1<>4 THEN L2340 + IF R2<>17 THEN L2340 +.L2330 MESSAGE 16 ;Grate locked + GOTO @L1000 +.L2340 + IF R1<>17 THEN L2370 + IF R2=4 THEN L2330 ;GRATE LOCKED +.L2370 + IF R1<>52 THEN L2390 + MESSAGE 32 ;SNAKE +.L2390 + IF R1<>58 THEN L2420 + IF R2<>59 THEN L2420 +.L2410 GOTO L2070 ;NOTPOS-CRYSTAL BRIDGE +.L2420 + IF R1<>59 THEN L2430 + IF R2=58 THEN L2410 ;CRYSTAL BRIDGE +.L2430 IF R1<>92 THEN L2440 + IF R2<>94 THEN L2440 + MESSAGE 57 ;NOPLANT +.L2440 IF R1<>107 THEN L2450 + IF R2<>71 THEN L2450 + MESSAGE 58 ;GATE +.L2450 + RETURN +.L2500 ; SPECIAL CASES + GOSUB @L28100 ;SPIDER SPECIAL CASES + X1=LIST3(8) ;GOLD + IF X1<>C8 THEN L2600 + IF R1<>50 THEN L2560 + IF R2<>31 THEN L2560 + MESSAGE 56 ;DOME UNCLIMABLE + GOTO @L1000 +.L2560 IF R1<>31 THEN L2600 + IF R2<>50 THEN L2600 + MESSAGE 28 ;DIE + GOTO @L1500 + ; +.L2600 IF R2<>244 THEN L2700 ;RANDOM BEDQUILT +.L2610 RANDOM X1 + IF X1>9 THEN L2610 + R2=97 + ADD R2,X1 + RETURN + ; +.L2700 + IF R1<>104 THEN L2800 + IF R2<>101 THEN L2750 +.L2720 RANDOM X2 ;SWISS TO ORIENTAL + IF X2<120 THEN @L2070 ;NOTPOS + RETURN + ; +.L2750 IF R2=85 THEN L2720 ;SWISS-TALL EW + ; +.L2800 IF R1=78 THEN L2820 ;ALCOVE + IF R1<>18 THEN L2900 +.L2820 IF R2=18 THEN L2835 + IF R2<>78 THEN L2900 +.L2835 R4=R2 + R2=C8 + R3=C8 + GOSUB @L11000 ;OBJECT COUNT + IF N5=C0 THEN L2895 ;POSSIBLE INDEED! + IF N5>C1 THEN L2897 ;NOTPOS + X1=LIST3(14) ;EGG JEWEL + IF X1<>C8 THEN L2897 ;NOTPOS +.L2895 R2=R4 + RETURN +.L2897 MESSAGE 649 ;SOMETHING TOO BIG + R2=R1 + RETURN +.L2900 ; WEST FROM SW REPOSITORY + IF R2<>252 THEN L3000 + IF E1<>C1 THEN @L2070 ;NOTPOS + R2=171 ;CORRIDOR + RETURN +.L3000 ; TROLL BRIDGE + IF R1=93 THEN L3030 + IF R1<>32 THEN L3500 ;NOT TROLL B. +.L3030 IF R2=32 THEN L3050 + IF R2<>93 THEN L3500 ;NOT TROLL B. +.L3050 IF F4=C0 THEN L3100 ;TROLL APPEARS + IF F4=C1 THEN L3150 ;BLOCKS WAY + X1=LIST3(12) ;BEAR + IF X1=C8 THEN L3200 + IF F4<>C2 THEN L3090 + F4=C0 +.L3090 RETURN + ; +.L3100 ; TROLL APPEARS + MESSAGE 62 + F4=C1 + LIST1(93)=C1 + LIST1(32)=C1 + GOTO @L1000 + ; +.L3150 ; TROLL ALREADY THERE + MESSAGE 63 + GOTO @L1000 + ; +.L3200 ; CARRYING BEAR OVER TROLL BRIDGE + MESSAGE 90 ;Bridge collapses + LIST3(12)=C9 ;KILL BEAR + GOTO @L1500 ;DEATH + ; +.L3300 ; WITT'S END + IF R1<>77 THEN @L2110 + IF R2<>254 THEN L3360 + W1=180 +.L3340 MESSAGE 43 ;Maze,NoGo + GOTO @L1000 +.L3360 IF R2<>76 THEN L3340 + RANDOM X1 + IF X1>178 THEN L3340 ;>> +;>> IF X1>100 THEN L3340 + GOTO @L2210 ;MOVE +;----- +.L3500 ; OUT OF GRATE IN ENDGAME + IF E1=C0 THEN L3090 ;RETURN + IF R1<>17 THEN L3090 ;RETURN + IF R2<>4 THEN L3090 ;RETURN + E4=C1 ;MET KING + MESSAGE 687 ;ELVES WAITING FOR YOU + CLS G ;>> PETE 7/7/86 + LASTPICTURE=501 ;>> DRAW TREES AT GAME END. PETE 7/7/86 + PICTURE LASTPICTURE ;>> PETE 7/7/86 + GOTO @L1700 ;END GAME +;----- +.LOOK ;>> + IF I2<>2900 THEN L4000 ;preposition ? + I2=I3 + I3=0 + SUB I4,C1 + GOTO @EXAMINE +;----- + +.DESCRIBE ;>> +.L4000 ; DESCRIBE + GOSUB @L12000 ;LIGHT DETECTION + IF L3<>C0 THEN L4050 + CLS G ;>> + LASTPICTURE=0 ;>>Redraw picture if user moves back to previous room + PICTURE LASTPICTURE ;>>MIKE 2/8/86 + MESSAGE 59 ;Dark +; and go to a black screen... + X1=19 + LIST9(C0)=X1 + LIST9(C1)=C0 + LIST9(C2)=C0 + DRIVER + + GOTO @L1000 +.L4050 + + X1=500 ;>> + ADD X1,R1 ;>> + IF LASTPICTURE=X1 THEN SAMEPICTURE ;>> + CLS G ;>> + PICTURE X1 ;>> + LASTPICTURE=X1 ;>> +.SAMEPICTURE ;>> + + X1=100 + ADD X1,R1 + MESSAGE X1 ;Room description + MESSAGE DOT ;>> + MESSAGE 12 ;CR + ; MESSAGE DESCRIPTION FOR FEATURE + IF R1<>199 THEN L4109 + IF E3=C1 THEN L4105 + MESSAGE 672 ;DOOR OPEN + GOTO L4109 +.L4105 MESSAGE 673 ;DOOR LOCKED +.L4109 IF R1>110 THEN L4200 + X1=LIST1(R1) + X2=330 ;GATES ETC. CLOSED + IF X1<>C1 THEN L4150 + X2=440 ;GATES ETC. OPEN +.L4150 ADD X2,R1 + MESSAGE X2 +; + IF R1<>92 THEN L4200 ;PLANT ROOM + X4=642 + IF F6=C0 THEN L4190 + X4=643 + IF F6<>C1 THEN L4200 +.L4190 MESSAGE X4;INTERMEDIATE PLANT DESCRIPTIONS +.L4200 IF R1=195 THEN L4202 + IF R1<>197 THEN L4205 +.L4202 IF B1=C0 THEN L4205 + MESSAGE 498 ;CRYSTAL BRIDGE IS THERE +.L4205 IF R1<>191 THEN L4209 ;ELVES + IF E2=C1 THEN L4209 + MESSAGE 663 ;PILES OF SKELETONS +.L4209 GOSUB @L28500 ;CHAINED ELVES DESCR. + ; LIST ANY OBJECTS LYING AROUND + MESSAGE 12 ;CR + R3=R1 +.L4220 X1=C1 +.L4250 GOSUB @L13000 ;DESCRIBE OBJECT + ADD X1,C1 + IF X1<33 THEN L4250 + ; + ; DESCRIBE ANY DWARVES + GOSUB @L28400 ;MESSAGE SPIDER DESC + IF R1<50 THEN @L1000 + IF D4=C0 THEN @L1000 + IF D4>C1 THEN L4350 + MESSAGE 97 ;ONE DWARF HERE + GOTO @L1000 +.L4350 MESSAGE 98 ;There are + PRINT D4 + MESSAGE 99 ;Dwarves here + GOTO @L1000 + ; +.L4500 ; INVENTORY + MESSAGE 10 ;You have + MESSAGE 12 ;CR + R2=C8 + R3=C8 + GOSUB @L11000 ;OBJECT COUNT + IF N5>C0 THEN L4220 ;LIST OBJECTS + MESSAGE 11 ;Nothing at all ! + GOTO @L1000 +;----- +.L5000 ; TAKE OBJECT + IF I2<>C0 THEN L5040 + IF I4=C2 THEN L5035 ;2 ARGS GIVEN + IF EVERYTHING=TRUE THEN @SPECIALALL ;>>MIKE 9/9/86 + MESSAGE 5 ;DON'T UNDERSTAND + GOTO @L1000 +.L5035 ; SECOND OF TWO ARGS NOT UNDERSTOOD + MESSAGE 60 ;NO-OBJ + GOTO @L1000 +.L5040 + + IF I2<>69 THEN NOTTAKEDWARF ;>> NICK 15/7/86 + IF D4=C0 THEN NOTTAKEDWARF ;>> NICK 15/7/86 + MESSAGE 78 ;>> NICK 15/7/86 Too agile + GOTO @L1000 ;>> NICK 15/7/86 +.NOTTAKEDWARF ;>> NICK 15/7/86 + + GOSUB @L5300 ;CONVERT I2 + IF R1<>40 THEN L5049 ;BEAR ROOM + IF F3<>C2 THEN L5049 ;BEAR PLACID + MESSAGE 47 ;BEAR SNAPS ETC. + GOTO @L1000 +.L5049 + IF I2>LIST3MAX THEN @SILLY ;>>MIKE 27/8/86 + X1=LIST3(I2) + IF X1=R1 THEN L5120 + IF X1<>C8 THEN L5090 +.ALREADYHAVEIT + MESSAGE 61 ;Already have it + GOTO @L1000 +.L5090 MESSAGE 8 ;Don't see it + GOTO @L1000 +.L5120 IF I2<>7 THEN L5150 ;NOT BIRD + IF F2=C0 THEN L5150 + GOTO ALREADYHAVEIT ;>>MIKE 26/8/86 - L5090 ;CAN'T GET BIRD IF CAGED +.L5150 LIST5(I2)=C1 ;OBJECT SEEN + GOSUB @L21000 ;SEE IF ALL OBJECTS FOUND + R2=C8 + R3=C8 + GOSUB @L11000 ;COUNT OBJECTS + IF N5<4 THEN L5250 + MESSAGE 46 ;Hands full + GOTO @L1000 +.L5250 GOSUB @L17000 ;BIRD IS SPECIAL + LIST3(I2)=C8 ;CARRIED + MESSAGE ok ;>>mike 19/9/86 - was 648 ;I HAVE IT NOW + GOTO @L1000 + ; +.L5300 ; TRANSLATE I2 TO OBJECT NO. + GOSUB @CONVERTI2 ;>> + IF I2=65529 THEN @L1200 ;BE MORE SPECIFIC + RETURN +;----- +.L5500 ; DROP OBJECT + GOSUB L5300 ;CONVERT I2 + IF I2>LIST3MAX THEN @SILLY ;>>MIKE 27/8/86 + X1=LIST3(I2) + IF X1=C8 THEN L5650 + MESSAGE 9 ;I don't have it + GOTO @L1000 + ; +.L5600 ; ACTUALLY DROP IT + MESSAGE 645 ;Dropped +.SILENTDROP LIST3(I2)=R1 + GOTO @L1000 + +.L5650 ; BIRD + IF S5<>C8 THEN L5663 + IF R1=209 THEN @L28300 ;SPIDER EATS HIM +.L5663 IF I2<>7 THEN L5700 ;BIRD + F2=C0 + IF R1=68 THEN L5695 ;DRAG? + IF R1<>52 THEN L5600 ;KINGS + MESSAGE 34 ;BIRD ATTACKS + LIST1(52)=C1 + GOTO SILENTDROP ;>>L5600 +.L5695 X1=LIST1(R1) + IF X1=C8 THEN L5600 + MESSAGE 39 ;BIRD GETS EATEN + LIST3(7)=C9 + GOTO @L1000 +.L5700 ; BEAR+TROLL + IF I2<>12 THEN L5750 + IF R1<>32 THEN L5600 + IF F4>1 THEN L5600 ;TROLL NOT THERE + MESSAGE 50 ;Bear attacks + LIST1(32)=C9 + LIST1(93)=C9 + F4=C3 ;TROLL GONE + GOTO SILENTDROP ;>>L5600 +.L5750 ; MING VASE + IF I2<>17 THEN L5850 + X1=LIST3(16) ;PILLOW + IF X1=R1 THEN L5600 + IF R1=84 THEN L5600 ;SOFT ROOM + MESSAGE 45 ;VASE BREAKS + LIST3(17)=C9 ;GET RID OF VASE + GOTO @L1000 + ; +.L5850 ; COINS + IF I2<>21 THEN L5900 + IF R1<>145 THEN L5600 ;VENDING M/C + L2=C8 ;NEW BATTERIES IN LAMP + LIST3(21)=C9 ;KILL COINS + MESSAGE 650 ;TELL HIM ABOUT IT + GOTO @L1000 + ; +.L5900 ; CAGE + IF I2<>5 THEN L5950 ;CAGE + IF F2=C0 THEN L5950 ;CAGE EMPTY + LIST3(7)=R1 + GOTO @L5600 +.L5950 ; ELIXIR + IF I2<>29 THEN L5990 + IF R1<>191 THEN L5970 + MESSAGE 662 ;ELVES ARISE + E2=C1 ;ELVES FREE +.L5965 LIST3(29)=C9 ;KILL ELIXIR + GOTO @L1000 +.L5970 MESSAGE 661 + GOTO L5965 +.L5990 ; LITTER IN PICNIC SPOT + IF R1<>13 THEN @L5600 + MESSAGE 683 ;LIGHTENING GETS YOU + GOTO @L1500 +;----- +.L6000 ; THROW + IF R1<>40 THEN L6000A ;>>MIKE 9/7/86 + IF I2=38 THEN @FEEDBEAR ;>> "THROW FOOD" = "FEED BEAR" +.L6000A ;>>MIKE 9/7/86 + GOSUB @L5300 ;CONVERT I2 + O1=I2 + GOSUB @L14000 ;CHECK O1 CARRIED + GOSUB @L31000 ;DIE IN REPOSITORY + IF O1=28 THEN @L28200 ;JADE SPIDER +.L6040 + IF R1=93 THEN L6250 ;TROLL + IF R1=32 THEN L6250 ;TROLL + IF R1=68 THEN L6350 ;DRAGON + IF I2<>26 THEN @L5650;NOT AXE,SO DROP IT +.L6080 + IF D4=C0 THEN THROWATDRAGON ;>>MIKE 27/8/86 -@L5650 ;NO DWARVES TO KILL + ; KILL DWARVES + RANDOM X1 + IF X1>30 THEN L6140 + MESSAGE 65 ;Missed + GOTO @SILENTDROP ;>> @L5650 ;DROP AXE +.L6140 X1=66 ;THE DWARF DIES + IF D4=C1 THEN L6170 + X1=67 ;ONE OF THE DWARVES +.L6170 MESSAGE X1 + SUB D4,C1 ;ONE LESS DWARF + D3=C1 ;DWARVES MAD + GOTO @SILENTDROP ;>> @L5650 ;DROP AXE + ; +.THROWATDRAGON ; throw axe at or snake or bear, if here. +; no dwarves around. + X1=LIST1(R1) + IF X1<>C0 THEN @L5650 ; drop it + IF R1=52 THEN THROWSNAKE + IF R1=68 THEN THROWSNAKE + GOTO @L5650 ; drop it +.THROWSNAKE + MESSAGE 696 ; bounces off + GOTO @SILENTDROP +;--- +.L6250 ; TROLL + IF F4<>C1 THEN L6080 ;NO TROLL + IF I2=12 THEN @L5700 ;BEAR + IF I2<>26 THEN L6300 + MESSAGE 64 ;TROLL RETURNS AXE + GOTO @L1000 + ; +.L6300 X1=LIST4(I2) + IF X1=C0 THEN L6345 ;WORTHLESS + LIST3(I2)=C9 ;TROLL GETS TREASURE + MESSAGE 89 ;TROLL THANKS YOU + F4=2 + LIST1(93)=C9 + LIST1(32)=C9 + GOTO @L1000 +.L6345 MESSAGE 88 ;NOT WORTH ANYTHING + GOTO @L1000 + ; +.L6350 ; DRAGON + IF I2<>26 THEN @L5650 ;NOT AXE + X1=LIST1(R1) + IF X1<>C0 THEN @L5650 ;NO DRAGON + MESSAGE 40 ;AXE BOUNCES OFF SCALES + GOTO @SILENTDROP ;>> @L5600 +.L6500 ; OPEN,UNLOCK + IF I2=65 THEN @L15700 ;SESAME + IF R1=193 THEN @L6950 ;N ELVES + IF R1=194 THEN @L6970 ;S ELVES + IF I2<>35 THEN L6650 ;GRATE + IF R1=4 THEN L6550 + IF R1=17 THEN L6550 + GOTO @L1250;CAN'T +.L6550 X1=LIST3(C1) + IF X1=C8 THEN L6600 +.L6570 MESSAGE 19 ;NOKEYS + GOTO @L1000 + ; +.L6600 ; UNLOCK THAT GRATE NOW + LIST1(4)=C1 + LIST1(17)=C1 + MESSAGE 17 ;TELL HIM ABOUT IT + GOTO @L1000 + ; +.L6650 ; CHAIN + IF I2=47 THEN L6665 ;BEAR + IF I2<>57 THEN L6800;CHAIN +.L6665 IF R1<>40 THEN L6800 + X1=LIST3(C1) + IF X1<>C8 THEN L6570 + IF F3<>C2 THEN L6690 + MESSAGE 47 ;CAN'T GET TO CHAIN + GOTO @L1000 +.L6690 ; CHAIN APPEARS + F3=C0 ;BEAR PASSIVE + X1=40 + LIST3(22)=X1 ;CHAIN + MESSAGE 48 ;CHAIN CLICKS OPEN + GOTO @L1000 + ; +.L6800 ; CLAM + IF I2<>85 THEN @L1250;CAN'T + IF R1<>103 THEN @L1350 + X1=LIST1(103) + IF X1=C0 THEN L6870 + MESSAGE 68 ;It's already open + GOTO @L1000 +.L6870 X1=LIST3(18) ;TRIDENT + IF X1=C8 THEN L6910 + MESSAGE 41 ;Won't open + GOTO @L1000 +.L6910 MESSAGE 42 ;CLAM OPENS + X1=81 ;CUL-DE-SAC + LIST3(19)=X1 + LIST1(103)=C1 ;CLAM=OYSTER NOW + GOTO @L1000 + ; +.L6950 ; UNLOCK N ELVES + IF E5=C1 THEN @L1000 + MESSAGE 689 ;ELVES RUSH OFF + E5=C1 + GOTO @L1000 +.L6970 ; UNLOCK S ELVES + IF E6=C1 THEN @L1000 + MESSAGE 689 ;ELVES RUSH OFF + E6=C1 + GOTO @L1000 +;----- +.TURN +; e.g. TURN LAMP ON/OFF + IF NOUN1=37 THEN TURNLAMP + IF NOUN2<>37 THEN @NOTHINGHAPPENS +.TURNLAMP + IF PREP=2901 THEN L7000 ; on + IF PREP=2906 THEN L7100 ; off + GOTO @NOTHINGHAPPENS +;--- +.EXTINGUISH + IF NOUN1=37 THEN L7100 ; lamp off + GOTO @NOTHINGHAPPENS +;--- +.LIGHT + IF PREP=2906 THEN L7100 ; light off + IF PREP=2901 THEN L7000 ; light on + IF NOUN1<>37 THEN @NOTHINGHAPPENS ; not lamp +; drop through to light lamp +.L7000 ; LIGHT ON + O1=C2 + GOSUB @L14000 ;CHECK OBJECT CARIED + IF L2=254 THEN @L1250;CAN'T. LAMP DEAD + L1=C1 + MESSAGE 14;LAMP NOW ON + GOTO @DESCRIBE ;>> GOTO @L1000 + ; +.L7100 ; LIGHT OFF + O1=C2 + GOSUB @L14000 ;CHECK OBJECT CARRIED + L1=C0 + MESSAGE 15;LAMP NOW OFF + GOTO @DESCRIBE ;>> @L1000 Clear graphics if now dark + ; +.L7200 ; FILL + GOSUB @L5300 ;CONVERT I2 + O1=4 ;BOTTLE + IF I2<>O1 THEN @L1100 + GOSUB @L14000 ;CHECK OBJECT CARRIED + IF R1<4 THEN L7300 + IF R1=70 THEN L7300 ;RESERVOIR + IF R1=73 THEN L7300 ;LITTLE PIT + IF R1=71 THEN L7300 ;MAG CAVERN + IF R1=90 THEN L7350 ;OIL WELL + MESSAGE 69 ;NO FLUIDS + GOTO @L1000 +.L7300 ; FILL WITH WATER + MESSAGE OK ;>>MIKE 23/6/86 + F1=C1 + GOTO @L1000 +.L7350 ; FILL WITH OIL + MESSAGE OK ;>>MIKE 23/6/86 + F1=C2 + GOTO @L1000 +;----- +.L7500 ; EMPTY + GOSUB @L5300 ;CONVERT I2 + O1=4 + IF O1<>I2 THEN @L1100;DON'T UNDERSTAND + GOSUB @L14000 ;CHECK O1 CARRIED + IF F1=C1 THEN L7600 + IF F1=C2 THEN L7800 + MESSAGE 70 ;ALREADY EMPTY + GOTO @L1000 + ; +.L7600 ; WATER + IF F1<>C1 THEN L7930 ;HAVE NONE + IF R1<>92 THEN L7720 + IF F6=C0 THEN L7660 ;PLANT STATUS + IF F6=C1 THEN L7690 + MESSAGE 74 ;SHRIVELS + F6=C0 + LIST1(92)=C9 ;KILL ROOM STATUS + GOTO L7730 +.L7660 MESSAGE 72 ;PLANT GROWS + F6=C1 + GOTO L7730 +.L7690 MESSAGE 73 ;PLANT FINISHES GROWS + F6=C2 + LIST1(92)=C1 ;SET ROOM STATUS + GOTO L7730 +.L7720 MESSAGE 21 ;WATER ON GROUND +.L7730 F1=C0 ;BOTTLE EMPTY + GOTO @L1000 + ; +.L7800 ; OIL + IF F1<>C2 THEN L7930 ;NO OIL + IF R1<>107 THEN L7850 + MESSAGE 75 ;GATE OPENS + LIST1(107)=C1 + LIST1(71)=C1 + GOTO L7730 +.L7850 IF R1<>92 THEN L7880 + MESSAGE 76 ;PLANT+OIL + GOTO L7730 +.L7880 MESSAGE 22 ;OIL ONGROUND + GOTO L7730 +;----- +.L7900 ; POUR WATER/OIL + X1=LIST3(4) + IF X1=C8 THEN L7950 +.L7930 MESSAGE 71 ;HAVEN'T GOT ANY + GOTO @L1000 +.L7950 IF I2=29 THEN L7980 ;WATER + IF I2<>28 THEN @L1100 ;NOT OIL + IF F1<>C2 THEN L7930 + GOTO L7800 +.L7980 IF F1<>C1 THEN L7930 + GOTO L7600 +;----- +.L8000 ; ATTACK + GOSUB @L31000 ;DIE IN REPOSITORY + IF I2<>42 THEN L8100 ;BIRD + X1=LIST3(7) + IF X1<>R1 THEN @L1450 + MESSAGE 26 ;BIRD DIES + LIST3(7)=C9 ;AND VANISHES + GOTO @L1000 + ; +.L8100 IF I2<>73 THEN L8200 ;SNAKE + IF R1<>52 THEN @L1450 ;KINGS +.L8120 X1=LIST1(R1) + IF X1<>C0 THEN @L1450 + MESSAGE 33;Dont bother attacking snake + GOTO @L1000 + ; +.L8200 IF I2<>72 THEN L8300 ;DRAGON + IF R1<>68 THEN @L1450 ;SECRET NS +.L8220 X1=LIST1(R1) + IF X1<>C0 THEN @L1450 + +.ASKDRAGON ;>> + MESSAGE 693 ;>>With bare hands ? + GOSUB @ASKINPUT ;>> + IF RESULT=FALSE THEN ASKDRAGON ;>> + IF I1=INO THEN @L1000 ;>> + IF I1=INORTH THEN @L1000 ;>> + IF I1<>IYES THEN ASKDRAGON ;>> + + MESSAGE 38 ;KILL DRAGON WITH BARE HANDS + LIST1(R1)=C1 + LIST3(23)=R1 + GOTO @L1000 + ; +.L8300 IF I2<>47 THEN L8400 ;BEAR + X1=LIST3(12) + IF X1=C8 THEN L8340 + IF X1<>R1 THEN @L1450 +.L8340 MESSAGE 49 ;BEAR DODGES + GOTO @L1000 + ; +.L8400 IF I2<>69 THEN L8500 ;DWARF + IF D4=C0 THEN @L1450 +.L8420 MESSAGE 78 ;DWARVES EVADE YOU + D3=C1 + GOTO @L1000 + ; +.L8500 IF I2<>C0 THEN @L1250;CAN'T + IF R1=52 THEN L8120 + IF R1=68 THEN L8220 + IF D4<>C0 THEN L8420 + GOTO @L1450 + ; +.L8600 ; READ +; IF I2=?? THEN @EXAMINE ;>>MIKE 18/8/86 + IF I2<>55 THEN @L1250;CAN'T + X1=LIST3(20) ;MAG + IF X1<>C8 THEN @L1400;DON'T HAVE IT + MESSAGE 79 ;magazine message + GOTO @L1000 + ; +.L8700 ; SCORE + MESSAGE 80 ;If you were to stop now, + GOSUB L9000 ;CALCULATE SCORE + PRINT S4 + MESSAGE 81 ;OUT OF A MAX OF 350 + GOTO @L1000 +;----- +.L9000 ; SCORING + S4=30 + X1=D1 ;NUMDIE + ADD X1,X1 ;X1:=D1*10 + X2=X1 + ADD X2,X2 + ADD X2,X2 + ADD X2,X1 + SUB S4,X2 + ; + IF S1<>C1 THEN L9130 + X1=30;TO MISTS + ADD S4,X1 +.L9130 ; + IF S2<>C0 THEN L9170 + X1=9 ;HE QUIT + ADD S4,X1 +.L9170 ; HAS ENDGAME CLOCK BEEN STARTED? + IF T2=C0 THEN L9210 + X1=50 + ADD S4,X1 +.L9210 X1=LIST3(20) ;MAGAZINE + IF X1<>77 THEN L9240 ;WITT'S END + X1=5 + ADD S4,X1 +.L9240 ; HAS HE SAVED/RESTORED?1 LESS IF SO + ADD S4,S6 + ; ADD ENDGAME SCORE (IF ANY) + ADD S4,S3 + ; + ; NOW THE TREASURES + ; 5 POINTS FOR SEEING EACH + ; 10 FOR TAKING BACK TO BUILDING + X1=C1 +.L9340 X2=LIST4(X1);VALUE + IF X2=C0 THEN L9440 + X2=LIST5(X1) ;HAS IT BEEN FOUND ? + IF X2=C0 THEN L9440 + IF X1>28 THEN L9400 ;NO FOUND FOR CROWNS + X3=5 + ADD S4,X3 +.L9400 + X2=LIST3(X1) ; list3 is always within range + IF X2=C8 THEN L9420 ;CARRIED + IF X2<>14 THEN L9440 ;BUILDING +.L9420 X3=10 + IF X1<30 THEN L9430 + X3=50 ;SCORE FOR CROWN JEWELS +.L9430 ADD S4,X3 +.L9440 ADD X1,C1 + IF X1<33 THEN L9340 + ; HAS HE FREED THE ELVES? + X3=100 + IF E2=C0 THEN L9464 + ADD S4,X3 +.L9464 IF E5=C0 THEN L9466 + ADD S4,X3 +.L9466 IF E6=C0 THEN L9468 + ADD S4,X3 +.L9468 IF E4=C0 THEN L9470 ;ELVEN KING ? + ADD S4,X3 +.L9470 ; + GOSUB @L30000;CALCULATE RATING + RETURN + +;----- + +.L9500 ; QUIT + MESSAGE 83;REALLY QUIT? +;>> INPUT I1 I2 I3 I4 + GOSUB @ASKINPUT ;>> + IF RESULT=FALSE THEN L9500 ;>> + IF I1=INORTH THEN @ENDCOMMAND ;North + IF I1=INO THEN @ENDCOMMAND ;No + IF I1=IYES THEN @ABORTGAME ;Play again + MESSAGE 2312;YES OR NO! + GOTO L9500 + +;----- + +;>>.L9500 ; QUIT +;>> MESSAGE 83 ;Really want to quit now ? +;>>.L9512 +;>> GOSUB @CLEARINPUT ;>> +;>> GOSUB GETI1I2I3I4 ;>> INPUT I1 I2 I3 I4 +;>> GOSUB @L18000 ;GET YES/NO RESPONSE +;>> IF Y1=C2 THEN L9512 +;>> IF Y1=C0 THEN @L1000 ;NO +;>> ;MUST BE YES +;>> S2=C1 ;HE QUIT +;>> GOTO @L1700 ;SCORE+STOP + +;----- + +.L9600 ; PLUGH +;>>MIKE 9/7/86 GOSUB @SAVEOOPS ;>> + GOSUB @L31000 ;DIE IN REPOSITORY + IF T2>C0 THEN L9670 + IF R1<>14 THEN L9640 ;BUILDING + R1=55 +.L9630 + GOTO @L4000 ;DESCRIBE +.L9640 IF R1<>55 THEN L9670 ;Y2 + R1=14 + GOTO L9630 +.L9670 MESSAGE 23 ;Nothing happens + GOTO @L1000 + ; +.L9700 ; XYZZY + GOSUB @L31000 ;DIE IN REPOSITORY + IF T2>C0 THEN L9670 + IF R1<>14 THEN L9740 ;BUILDING + R1=28 + GOTO L9630 +.L9740 IF R1<>28 THEN L9670 ;DEBRIS ROOM + R1=14 + GOTO L9630 + ; +.L9800 ; PLOVER + GOSUB @L31000 ;DIE IN REPOSITORY + IF T2>C0 THEN L9670 ;ENDGAME + R3=R1 + IF R1<>55 THEN L9840 ;Y2 + R1=18 + GOTO L9860 +.L9840 IF R1<>18 THEN L9670 ;NOTHING HAPPENS + R1=55 +.L9860 R2=C8 + O1=LIST3(13) ;PYRAMID + GOSUB L11000 ;DROP TRASURE + LIST3(13)=O1 + GOTO L9630 + ; SET UP CONSTANTS + C1=1 + C2=2 + C8=255 + C9=C0 + RETURN +;----- +.L11000 ; ALL OBJECTS CARRIED GO TO R2 + ; TREASURE GOES TO R3 + ; RETURNS N3=NO. OF TREASURES + ; RETURNS N4=NO. OBJECTS,ALLOWING FOR + ; BIRD + ; RETURNS N5=TOTAL NO. CARRIED + X1=C1 + N3=C0 + N4=C0 +.L11070 IF X1=7 THEN L11150 ;BIRD + X2=LIST3(X1) ; list3 is always within range + IF X2<>C8 THEN L11150 + X2=LIST4(X1) ;VALUE OF OBJECT + IF X2=C0 THEN L11140 ;WORTHLESS + ADD N3,C1 ;ANOTHER TREASURE + LIST3(X1)=R3 + GOTO L11150 +.L11140 ADD N4,C1 ;ANOTHER OBJECT + LIST3(X1)=R2 +.L11150 ADD X1,C1 + IF X1<33 THEN L11070 + N5=N3 + ADD N5,N4 + RETURN +;----- +.L12000 ; IF LIGHT IN R1,L3=1 + ; IF LIGHT IN R2,L4=1 + R3=R1 + GOSUB L12500 + L3=L6 + R3=R2 + GOSUB L12500 + L4=L6 + RETURN + ; +.L12500 ; CHECK IF LIGHT IN R3,L6=1 + IF R3<26 THEN L12600 ;NATURALLY LIGHT + IF R3>225 THEN L12600 ;NATURALLY LIGHT + IF R3<166 THEN L12520 + IF R3<169 THEN L12600 ;NATURALLY LIGHT +.L12520 L6=LIST3(C2) ;LAMP + IF L6=C8 THEN L12590 + IF L6=R3 THEN L12590 + ; NO LAMP +.L12560 ; ROOM DARK + L6=LIST3(28) ;PENTACLE + IF L6=C8 THEN L12610 +.L12570 L6=C0 + RETURN +.L12590 IF L1=C0 THEN L12560 ;LIGHT OFF +.L12600 ; ROOM IS LIGHT (HOORAY !) + L6=LIST3(28) ;PENTACLE + IF L6=C8 THEN L12570 ;ROOM DARK +.L12610 L6=C1 + RETURN +;----- +.L13000 ; MESSAGE DESCRIPTION OF OBJECT X1 + ; IN ROOM R3 + R2=LIST3(X1) ; prbably always in range + IF R2=R3 THEN L13050 + RETURN +.L13050 LIST5(X1)=C1 ;OBJECT HAS BEEN SEEN + ;X4=550;OBJECTS WHEN CARRIED + ;IF R3=C8 THEN L13056 + ;X4=585;OBJECTS ON GROUND +.L13056 IF F2=C0 THEN L13150 ;CAGE EMPTY + IF X1=7 THEN L13080 ;BIRD + IF X1<>5 THEN L13150 + RETURN;NO DESC FOR OCCUPIED CAGE +.L13080 X4=631 ;BIRD IN CAGE ON FLOOR + IF R3<>C8 THEN L13110 + X4=630 ;IN HAND +.L13110 GOTO L13650 + ; +.L13150 IF X1<>12 THEN L13250 ;BEAR + IF F3=C0 THEN L13600 ;NOTHING SPECIAL + X4=632 + ADD X4,F3 + GOTO L13650 ;MESSAGE DESC + RETURN + ; +.L13250 ; MING VASE ON THE PILLOW + IF X1=17 THEN L13300 ;VASE + IF X1=16 THEN L13300 ;PILLOW + GOTO L13400 + ; +.L13300 X2=LIST3(17) ;VASE ROOM + X3=LIST3(16) ;PILLOW ROOM + IF X2<>X3 THEN L13600 ;NO SPECIAL + IF X2=C8 THEN L13600 + IF X1=16 THEN L13660 ;NO DESC FOR PILOW + X4=635 ;VASE ON PILLOW + GOTO L13650 +.L13400 ; BOTTLE + IF X1<>4 THEN L13500 + X4=636 ;CARRIED + IF R2=C8 THEN L13440 + X4=639 ;ON GROUND +.L13440 ADD X4,F1 ;CONTENTS OF BOTTLE + GOTO L13650 + ; +.L13500 ; LAMP +.L13600 ; MESSAGE 'NORMAL' DESCRIPTION + X4=550;OBJECTS WHEN CARRIED + IF R3=C8 THEN L13640 + X4=585;OBJECTS ON GROUND +.L13640 ADD X4,X1 ;CALCULATE DESCRIPTION NO. +.L13650 MESSAGE X4 + MESSAGE DOTCR ;>> 12 ;CR +.L13660 RETURN + ; +;----- +.L14000 ; CHECK OBJECT O1 IS CARRIED + IF O1>LIST3MAX THEN @SILLY ;>>MIKE 27/8/86 + O2=LIST3(O1) + IF O2<>C8 THEN @L1400 ;DONT HAVE IT + RETURN +;----- +.FEEDBEAR ;>>> + I2=47 ;>>> + +.L15000 ; FEED + X1=LIST3(3) ;FOOD + IF X1=C8 THEN L15050 + MESSAGE 71 ;HAVEN'T GOT ANY + GOTO @L1000 +.L15050 + IF I2=72 THEN L15100 ;DRAGON + IF I2=73 THEN L15150 ;SNAKE + IF I2=42 THEN L15200 ;BIRD + IF I2=47 THEN L15250 ;BEAR + IF I2=38 THEN L15250 ; FEED FOOD->FEED BEAR >>MIKE 28/8/86 + IF I2<>C0 THEN @L1250;CAN'T + GOTO @L1100 ;DON'T UNDERSTAND + ; +.L15100 X1=LIST1(68) ;DRAGON + IF R1<>68 THEN @L1350 ;NOT HERE +.L15120 IF X1=C1 THEN @L1350 + MESSAGE 37 ;NOT HUNGRY + GOTO @L1000 + ; +.L15150 X1=LIST1(52) ;SNAKE + IF R1<>52 THEN @L1350 ;NOT HERE + GOTO L15120 + ; +.L15200 X1=LIST3(7) ;BIRD + IF X1<>R1 THEN @L1350 ;NOT HERE + MESSAGE 27 ;NOT HUNGRY + GOTO @L1000 + ; +.L15250 ; BEAR + IF R1<>40 THEN @L1350 ;NOT HERE + LIST3(3)=C9 ;FOOD DISAPPEARS + F3=C1 ;BEAR PASSIVE + MESSAGE 84 ;BEAR EATS IT ! + GOTO @L1000 +;----- +.L15400 ; WAVE + IF I2=41 THEN L15500 ;ROD +; IF I2<>C0 THEN L15450 ;SILLY + IF R1=56 THEN L15650 ;WINDOW + IF R1=108 THEN L15650 ;WINDOW +.L15450 +.NOTHINGHAPPENS ;>> + MESSAGE 23 ;NOTHING HAPPENS + GOTO @L1000 + ; +.L15500 ; (WAVE) ROD + O1=6 ;ROD + GOSUB @L14000 ;CHECK IT'S CARRIED + IF R1=195 THEN L15635 + IF R1=197 THEN L15635 + IF R1=58 THEN L15510 + IF R1<>59 THEN L15450 +.L15510 X1=LIST1(58) + IF X1=C0 THEN L15590 + ; BRIDGE THERE + X1=C0 + MESSAGE 31 ;VANISHES +.L15560 LIST1(58)=X1 + LIST1(59)=X1 + GOTO @L1000 +.L15590 ; BRIDGE NOT THERE + X1=C1 + MESSAGE 30 ;BRIDGE APPEARS + GOTO L15560 + ; +.L15635 ; ROD IN ENDGAME AT FISSURE + IF B1=C0 THEN L15645 + B1=C0 + MESSAGE 31 ;VANISHES + GOTO @L1000 +.L15645 B1=C1 + MESSAGE 30 ;APPEARS + GOTO @L1000 +.L15650 ; WINDOW + MESSAGE 36 ;FIGURE WAVES BACK + GOTO @L1000 +;----- +.L15700 ; SESAME ETC. + GOSUB @L31000 ;DIE IN REPOSITORY + MESSAGE 23 ;NOTHING HAPPENS + GOTO @L1000 + ; +.L15800 ; SMASH + GOSUB @L31000 ;DIE IN REPOSITORY + IF I2<>86 THEN @L1250;CAN'T + MESSAGE 85;CAN'T BE REACHED (MIRROR) + GOTO @L1000 + ; +.L15900 ; EAT + IF I2<>38 THEN @L1250;CAN'T + X1=LIST3(3) + IF X1<>C8 THEN L16030 + LIST3(3)=C9 ;GET RID OF FOOD +.L15950 MESSAGE 3 ;THANKS + GOTO @L1000 + ; +.L16000 ; DRINK + X1=LIST3(4) ;BOTTLE + IF X1=C8 THEN L16050 +.L16030 MESSAGE 71 ;HAVEN'T GOT ANY + GOTO @L1000 +.L16050 IF F1=C0 THEN L16030 ;BOTTLE EMPTY + IF F1<>C1 THEN L16100 + IF I2<>29 THEN L16030 ;WATER + F1=C0 + GOTO L15950 ;THANKS +.L16100 IF I2<>28 THEN L16030 ;OIL + MESSAGE 86 ;NO THANKS! + GOTO @L1000 +;----- +.L16200 ; FEE,FIE,FOE,FOO + ;X1=79 + ;SUB I1,X1 + ;IF I1=F7 THEN L16300 + ;MESSAGE 44;GET IT RIGHT + ;F7=0 + ;GOTO L1000 + ; +.L16300 ADD F7,C1 + IF F7<4 THEN @L1000 + ; MOVE EGGS BACK TO GIANT ROOM + F7=C0 + X1=LIST3(15) + IF X1=C8 THEN L16338 + IF X1<>R1 THEN L16340 +.L16338 MESSAGE 647 ;EGGS VANISH +.L16340 X1=95 + LIST3(15)=X1 + IF X1<>R1 THEN L16360 + MESSAGE 646 ;EGGS REAPPEAR +.L16360 GOTO @L1000 +;----- +.L16500 ; GIVE (TO TROLL) + IF R1=93 THEN @L6000 ;THROW + IF R1=32 THEN @L6000 ;THROW + IF R1<>40 THEN L16500A ;>>MIKE 9/7/86 + IF I2=38 THEN @FEEDBEAR ;>> "GIVE FOOD" = "FEED BEAR" +.L16500A + MESSAGE 87 ;TO WHOM ? + GOTO @L1000 +;----- +.L17000 ; BIRD BEING PICKED UP IS AWKWARD + IF I2<>7 THEN L17500 + X1=LIST3(5) ;CAGE + IF X1=C8 THEN L17100 + MESSAGE 24;CAN'T CATCH THE BIRD + GOTO @L1000 +.L17100 X1=LIST3(6) + IF X1=C8 THEN L17200 + F2=C1 + RETURN +.L17200 ; OH DEAR, HE'S GOT THE ROD + MESSAGE 25 ;BIRD FLIES AWAY + GOTO @L1000 +.L17500 IF I2<>12 THEN L17600 ;BEAR + IF F3<>C2 THEN L17550 + MESSAGE 47 ;CAN'T GET NEAR IT + GOTO @L1000 +.L17550 IF F3<>C1 THEN L17600 + MESSAGE 51 ;BEAR CHAINED + GOTO @L1000 +.L17600 IF I2<>5 THEN L17700 ;CAGE + IF F2=C0 THEN L17700 + LIST3(7)=C8 +.L17700 RETURN + +.L18000 ; GET YES/NO RESPONSE + ; IF YES,Y1=1. NO,Y1=0 + Y1=C0 + MESSAGE 12 ;CR + IF I1=75 THEN L18100 ;YES + IF I1=76 THEN L18150 ;NO + IF I1=C1 THEN L18150 ;NO(RTH) + MESSAGE 5 ;DON'T UNDERSTAND + Y1=C2 ;ERROR + RETURN +.L18100 Y1=C1 +.L18150 RETURN + +.L19000 ; RUB + IF I2<>37 THEN L19520 ;NOT LAMP + O1=C2 ;LAMP + GOSUB @L14000 ;CHECK LAMP CARRIED + MESSAGE 2 ;RUBBING LAMP IS BORING + GOTO @L1000 +.L19500 ; BLAST + IF T2>C0 THEN L19550 +.L19520 MESSAGE 23;NOTHING HAPPENS + GOTO @L1000 +.L19550 IF E1=C1 THEN L19520 + ; GIVE A BONUS FOR BLASTING + S3=20 + MESSAGE 651 ;DYMANITE EXPLODES + R2=LIST3(27) ;DYNAMITE + IF R2=R1 THEN L19800 ;KILLS YOU + IF R2=C8 THEN L19800 + IF R2<>170 THEN L19700 + ; DWARVES ARISE + MESSAGE 652 + MESSAGE 653 ;ROOF KILLS DWARVES + X1=80 ;KILL DWARVES + ADD S3,X1 + GOTO @L24000 ;DEATH +.L19700 ; NOW HOLE IN WALL,ETC. + E1=C1 + X1=180 ;KILLED DWARVES+LIVED! + ADD S3,X1 + MESSAGE 654 ;DWARVES DEAD ETC. + W2=169 ;WATER AT NE END + W3=C1 ;WHICH IS FULL OF WATER + GOTO @L1000 +.L19800 ; SAME ROOM AS DYNAMITE + MESSAGE 652 ;DWARVES WAKE + KILL YOU + MESSAGE 653 ;ROOF KILLS YOU + GOTO @L24000 +.L20000 ; ENDGAME-PICTUREED FROM 1000 + IF T2>C0 THEN L20050 + RETURN +.L20050 ADD T2,C1 + IF T2<>6 THEN L20100 + ; ANOUNCE CLOSING + MESSAGE 632 +.L20090 RETURN +.L20100 IF T2<>20 THEN L20700 + ; NOW WE CATAPULT HIM INTO ENDGAME + ; FIRST ASK HIM + MESSAGE 667 ;ELF APPEARS +.L20113 +;>> INPUT I1 I2 I3 I4 + GOSUB @ASKINPUT ;>> + IF RESULT=FALSE THEN L20113 ;>> + GOSUB @L18000 ;GET YES/NO + IF Y1=C1 THEN L20121 ;YES + IF Y1=C0 THEN L20119 ;NO + GOTO L20113 +.L20119 MESSAGE 668 ;REFUSED ! + GOTO @L1700 ;STOP GAME +.L20121 MESSAGE 669 ;ACCEPTED + ; DROP/KILL TREASURE, + ; OBJECTS INTO SW REPOSITORY + X1=C1 +.L20160 X2=LIST4(X1) ;VALUE + IF X2=C1 THEN L20200 + IF X1=20 THEN L20300;GAZETTE (WIITS END) + X2=170 ;REPOSITORY +.L20190 LIST3(X1)=X2 ; always in range + GOTO L20300 +.L20200 ; TREASURE + X2=LIST3(X1) ; always in range + IF X2<>C8 THEN L20250 + X2=14 ;TO BUILDING IF CARRIED + GOTO L20190 ;DROP IT +.L20250 IF X2=14 THEN L20300 ;IN BUILDING + X2=C0 + GOTO L20190 ;KILL TREASURE IF NOT + ; IN BUILDING +.L20300 ADD X1,C1 + IF X1<28 THEN L20160 + ; NOW KILL BIRD+CAGE,BEAR,BOTTLE + LIST3(7)=C9 ;BIRD + LIST3(5)=C9 ;CAGE + LIST3(12)=C9 ;BEAR + LIST3(4)=C9 ;BOTTLE + ; NOW INTO ENDGAME + R1=170 + ; NOW TELL HIM WHAT'S GOING ON + MESSAGE 644 + ; LAMP HAS NEW BATTERIES NOW + L2=C8 + L1=C1 + GOTO @L1010 ;INPUT CLEAR STACK +.L20700 IF E1=C0 THEN L20090 ;NO WATER YET + GOSUB L22000 ;CHECK IF HE DROWNS + IF W4=C0 THEN L20710 + IF W5=C0 THEN L20710;NOT WATERED BEFORE + MESSAGE 658 ;DROWNS + GOTO @L24000 ;DIES +.L20710 ; NOW THE WATER STARTS TO RISE + IF W2=197 THEN L20910 ;STOPPED RISING + ADD W3,C1 + IF W3C2 THEN L20850 + X1=R1 + SUB X1,C1 + IF X1<>W2 THEN L20850 + ; ROOM NEXT DOOR IS FLOODED + MESSAGE 655 + RETURN +.L20850 GOSUB L22000 ;W4=1 IF DROWNING LIKELY + IF W4=C0 THEN L20900 + MESSAGE 656 ;ROOM FULL OF WATER + RETURN +.L20900 IF W2C0 THEN L21200 ;IN ENDGAME + ; IF SO, START ENDGAME CLOCK + X1=C1 +.L21030 X2=LIST4(X1) ;VALUE + IF X2=C0 THEN L21100 ;WORTHLESS + X2=LIST5(X1) ;HAS IT BEEN FOUND? + IF X2=C0 THEN L21200 ;NO +.L21100 ADD X1,C1 + IF X1<28 THEN L21030 + ; GOT THEM ALL !!! + T2=C1 +.L21200 RETURN +.L22000 ; W4=1 IF DROWNING LIKELY + W4=C0 + IF W2C2 THEN L22100 + W4=C1 +.L22100 RETURN +.L23000 ; 'LOCK' + IF E3=C1 THEN @L1250 + X1=LIST3(C1) ;KEYS + IF X1=C8 THEN L23050 + MESSAGE 19 ;NOKEYS + GOTO @L1000 +.L23050 IF I2<>91 THEN @L1250;CAN'T + IF R1<>199 THEN @L1350 ;NOT SEEN + E3=C1 + MESSAGE 18 ;SHUTS + GOTO @L1000 +.L24000 ; ENDGAME DEATH + GOTO @L1700 +.L24500 ; LAVA BLOWS UP + W3=C2 ;WATER LEVEL + IF E3=C1 THEN L24600 + MESSAGE 660 ;DIES IN BLAST + GOTO L24000 ;DEATH +.L24600 MESSAGE 659 ;SURVIVES BLAST + GOTO @L1010 +.L24700 ; WEB TEARS + MESSAGE 674 ;FALL TO DEATH + GOTO L24000 +.L26000 ; ENDGAME SPECIAL MOVEMENT + IF B1=C0 THEN L26100 ;NO BRIDGE + IF R1<>197 THEN L26020 ;W BANK + IF I1=15 THEN L26010 ;CROSS + IF I1<>C3 THEN L26100 ;EAST +.L26010 R2=195 + RETURN +.L26020 IF R1<>195 THEN L26100 + IF I1=7 THEN L26030 + IF I1<>15 THEN L26100 ;CROSS +.L26030 R2=197 + RETURN +.L26100 ; ENDGAME DOOR + IF R1<>199 THEN L26200 + IF R2<>198 THEN L26200 + IF E3=C1 THEN @L2070 ;NOTPOS +.L26200 ; WEB CAVERN + RETURN +.L27000 ; GOLD (GO) + I1=I2 + I2=I3 + I3=45 ;JEWELRY + GOTO @L690 +.L27500 ; SAY + GOSUB @L31000 ;DIE IN REPOSITORY + IF I2=32 THEN @L9600 ;PLUGH + IF I2=33 THEN @L9700 ;XYZZY + IF I2=34 THEN @L9800 ;PLOVER + MESSAGE 23 ;NOTHING HAPPENS + GOTO @L1000 + ; SPIDER CODE HENCEFORTH +.L28100 ; CAN'T GO UP WEB WHILE SPIDER LIVES + IF R1<>216 THEN L28150 ;NOT WEB + IF S5=C0 THEN L28150 ;SPIDER GONE + IF R2<>219 THEN L28150 + IF S5=C8 THEN L24700 ;WEB TEARS + MESSAGE 684 ;CAN'T GET PAST SPIDER + GOTO @L1000 +.L28150 RETURN +.L28200 ; THROW JADE SPIDER + IF S5<>C8 THEN @L6040 + IF R1<>209 THEN L28300 ;NOT PINNACLE + ; SPIDER GOES OVER THE SIDE + LIST3(28)=C9 ;KILL JADE SPIDER + S5=C0 ;KILL BIG SPIDER + MESSAGE 685 ;TELL HIM ABOUT IT + GOTO @L1000 +.L28300 ; SPIDER EATS HIM + MESSAGE 686 ;HO HO + GOTO @L24000 ;ENDGAME +.L28400 ; MESSAGE DESCRIPTION FOR SPIDER + IF S5=C8 THEN L28430 + IF R1=S5 THEN L28460 ;? + RETURN +.L28430 MESSAGE 675 ;SPIDER HERE WITH EYES + RETURN +.L28460 X1=LIST3(28) ;SPIDER + IF X1<>C8 THEN L28465 + S5=C8 +.L28465 MESSAGE 671 ;SPIDER HERE + RETURN +.L28500 ; MESSAGE DESCRIPTIONS FOR CHAINED ELVES + IF R1<>193 THEN L28600 + IF E5=C1 THEN L28550 + MESSAGE 688 +.L28550 RETURN +.L28600 IF R1<>194 THEN L28550 + IF E6=C1 THEN L28550 + MESSAGE 688 + RETURN +.L29000 ; SAVE WORKSPACE + S6=C0 + SAVE + GOTO @L1000 +.RESTORE ; RESTORE WORKSPACE + MESSAGE 2328 ; YES or NO please >>MIKE 3/7/86 + GOSUB @ASKINPUT ;>>MIKE 3/7/86 + IF RESULT=FALSE THEN RESTORE ;>>MIKE 3/7/86 + GOSUB @L18000 ;>>MIKE 3/7/86 + IF Y1=0 THEN @L1000 ; NO >>MIKE 3/7/86 + IF Y1<>1 THEN RESTORE ;>>MIKE 3/7/86 + GOSUB @LENSLOK + IF RESULT=FALSE THEN @L1000 + RESTORE + GOTO @AFTERRESTORE ;>> @L4000 +.L30000 ; RETURN RATING IN S7 + IF S4>60 THEN L30200 + S7=676 ;GET BACK TO FARM + RETURN +.L30200 IF S4>120 THEN L30300 + S7=677 ;NOVICE + RETURN +.L30300 IF S4>200 THEN L30400 + S7=678 ;PLAYER + RETURN +.L30400 IF S4>350 THEN L30500 + S7=679 ;GOOD PLAYER + RETURN +.L30500 IF S4>750 THEN L30600 + S7=680 ;ADVENTURER + RETURN +.L30600 IF S4>1099 THEN L30700 + S7=681 ;MASTER ADVENTURER + RETURN +.L30700 S7=682 ;GRAND MASTER ADVENTURER + RETURN +.L31000 ; KILL HIM IF IN REPOSITORY + IF W2>168 THEN L31030 + IF R1=170 THEN L31100 + IF R1=169 THEN L31100 +.L31030 RETURN +.L31100 MESSAGE 692 ;NOISE ECHOES + GOTO @L1700 +.L32000 ; HANDLE FEE,FIE PART 1 + IF F7=C0 THEN L32100 + X1=I1 + X2=79 + SUB X1,X2 + IF X1=F7 THEN L32100 + MESSAGE 44 ;GET IT RIGHT DUMMY + F7=C0 ;STACK FEE FLAG + I4=C0 ;KILL INPUT +.L32100 RETURN +;----- +.L32500 ; VOICE AT Y2 + IF R1<>55 THEN L32600 ;Y2 + RANDOM X1 + IF X1>20 THEN L32600 + MESSAGE 35 ;VOICE SAYS PLUGH +.L32600 RETURN +;----- +.L33000 ; HANDLE LAMP GOING OUT + X2=LIST3(C2) ;LAMP ROOM + IF L2<>252 THEN L33040 + L2=256 ;SKIP 254,255 +.L33040 IF L2=C8 THEN L33200 + IF L1<>C1 THEN L33200 + ADD L2,C1 ;LAMP CONTINUES TO DIE + IF L2<>265 THEN L33100 + IF X2<>C8 THEN L33200;NO LAMP + MESSAGE 690 ;LAMP GOING DIM +.L33100 IF L2<>300 THEN L33200 + L1=C0 ;LAMP OFF + L2=254 ;LAMP DEAD + IF X2<>C8 THEN L33200 ;NO LAMP + MESSAGE 691 ;LAMP GOES OUT + GOTO @L659 +.L33200 + RETURN +;----- +.ISOBJECTHERE +; return RESULT=TRUE if OBJECT is on floor in current room + I2=OBJECT ;>> +.IOHI2 + GOSUB @CONVERTI2 ;>> + + GOSUB CHECKFIXEDOBJECT ;>> + IF RESULT=TRUE THEN L33200 ;RETURN + + IF I2>LIST3MAX THEN @IOMFALSE ;>>** List 3 is only 33 long (?) + + IF I2=65529 THEN @IOMFALSE + RESULT=LIST3(I2) ;>> + +;>> IF OBJECT> IF OBJECT>MAXOBJECT THEN IOMFALSE +;>>; IF OBJECT>153 THEN IOTUNTAKEABLE +;>> PARSEX2=OBJECT +;>> PARSEX1=35 +;>> SUB PARSEX2,PARSEX1 +;>> RESULT=LIST3(PARSEX2) + + IF RESULT=R1 THEN @IOMTRUE +;>> IF RESULT=C8 THEN IOMTRUE ;> Object carried + GOTO @IOMFALSE +; +;----- +; +.CHECKFIXEDOBJECT ;>> +; for things in particular rooms, set PARSEX1=ROOM, and jump to CHECKROOM + IF OBJECT=103 THEN @IOMTRUE ;>>Spider + PARSEX1=32 ;>>Bridge + IF OBJECT=102 THEN CHECKBRIDGE ;>> + PARSEX1=92 ;Plant + IF OBJECT=70 THEN CHECKROOM + PARSEX1=93 ;Troll + IF OBJECT=94 THEN CHECKTROLL + PARSEX1=52 ;Snake + IF OBJECT=73 THEN CHECKSNAKE + PARSEX1=68 ;Dragon + IF OBJECT=72 THEN CHECKDRAGON + PARSEX1=103 ;Clam + IF OBJECT=85 THEN CHECKROOM + PARSEX1=69 ;Mirror + IF OBJECT=86 THEN CHECKROOM + PARSEX1=199 ;Door + IF OBJECT=91 THEN CHECKROOM + PARSEX1=71 ;Gate + IF OBJECT=100 THEN CHECKGATE + PARSEX1=4 ;Grate + IF OBJECT=35 THEN CHECKGRATE + GOTO @IOMFALSE + +.CHECKBRIDGE ;>> + IF B1=C1 THEN @IOMTRUE ;>>Engame bridge + IF R1=58 THEN @IOMTRUE ;>> + IF R1=59 THEN @IOMTRUE ;>> + IF R1=93 THEN @IOMTRUE ;>> + GOTO CHECKROOM ;>> + +.CHECKSNAKE + PARSEX2=LIST1(52) ;Driven off ? + IF PARSEX2=C1 THEN @IOMFALSE + GOTO CHECKROOM + +.CHECKDRAGON + PARSEX2=LIST1(68) ;Killed ? + IF PARSEX2=C1 THEN IOMFALSE + GOTO CHECKROOM + +.CHECKTROLL + PARSEX2=LIST1(93) ;Troll at bridge ? + IF PARSEX2<>C1 THEN IOMFALSE + IF R1=32 THEN IOMTRUE + GOTO CHECKROOM + +.CHECKGRATE + IF R1=17 THEN IOMTRUE + GOTO CHECKROOM + +;.CHECKMIRROR +; IF R1=56 THEN IOMTRUE +; GOTO CHECKROOM + +.CHECKGATE + IF R1=107 THEN IOMTRUE +.CHECKROOM + IF R1=PARSEX1 THEN IOMTRUE + GOTO IOMFALSE + +;----- +;.IOTUNTAKEABLE +; RESULT=LIST1(OBJECT) +; IF RESULT=R1 THEN IOMTRUE +; GOTO IOMFALSE +;----- +.SILLY ;>>MIKE 27/8/86 + IF I2=69 THEN UNWISE ; dwarf + IF I2=72 THEN UNWISE ; dragon + IF I2=73 THEN UNWISE ; snake + MESSAGE 694 ; don't be absurd + GOTO @L1000 +.UNWISE + MESSAGE 695 ; that sounds positively lethal + GOTO @L1000 +;--- +.CONVERTI2 + +; IF I2<>69 THEN NOTDWARF ;>> NICK 15/7/86 +; IF D4=C0 THEN INVALIDOBJECT ;>> NICK 15/7/86 +;.NOTDWARF ;>> NICK 15/7/86 + + IF I2>104 THEN INVALIDOBJECT ;>> + IF I2>101 THEN OBJECTOK ;>> + IF I2=100 THEN OBJECTOK ;gate + IF I2=94 THEN OBJECTOK + IF I2=91 THEN OBJECTOK + IF I2>86 THEN INVALIDOBJECT + IF I2>84 THEN OBJECTOK + IF I2>78 THEN INVALIDOBJECT ;>>** + IF I2> + MESSAGE 2319 ;>> + GOTO @ENDCOMMAND ;>> +;----- +.HELP + IF R1=226 THEN HELPFOREST + IF R1<8 THEN HELPNFOREST + IF R1>12 THEN HELPNFOREST +.HELPFOREST + MESSAGE 1821 ; there is SOMETHING in the forest + GOTO @ENDCOMMAND + +.HELPNFOREST + IF R1<>4 THEN HELPNGRATE + MESSAGE 1822 ; can open the grate + GOTO @ENDCOMMAND + +.HELPNGRATE + IF R1<>52 THEN HELPNSNAKE + MESSAGE 1823 ; snake can be scared off + GOTO @ENDCOMMAND + +.HELPNSNAKE + IF R1<>58 THEN HELPNBRIDGE + MESSAGE 1824 ; magic might help + GOTO @ENDCOMMAND + +.HELPNBRIDGE + IF R1=62 THEN HELPMAZE + IF R1<>60 THEN HELPNMAZE +.HELPMAZE + MESSAGE 1825 ; mazes can be mapped + GOTO @ENDCOMMAND + +.HELPNMAZE + IF R1<>77 THEN HELPNWITT + MESSAGE 1826 ; go south out of Witt's end + GOTO @ENDCOMMAND + +.HELPNWITT + MESSAGE 1820 ; on your own + GOTO @authors ;>>mike 21/9/86 ENDCOMMAND +;--- +;------------------------------------- +;------------------------------------- +;------------------------------------- +;------------------------------------- diff --git a/l9dev/regress/games.l9/colossal.l9/book.txt b/l9dev/regress/games.l9/colossal.l9/book.txt new file mode 100644 index 0000000..49963c8 --- /dev/null +++ b/l9dev/regress/games.l9/colossal.l9/book.txt @@ -0,0 +1,242 @@ + +; Code for book protection system +; +; Copyright (C) 1986 Level 9 Computing +; +; For Colossal +; +; 2/9/86 +; +; table of comparison words start at 4300 (MATCHOFFSET) + +CONST + MaxChapter=20 + MaxParagraph=12 + MaxWord=8 + MaxAttemptsPerWord=3 + TotalWords=100 + +VAR + CHAPTER + PARAGRAPH +; LINE + WORD + RANDOMSEED + COUNT TESTCOUNT SAVECOUNT + ATTEMPTS + +BEGIN +;.LENSLOK +;.TRYALLWORDS +; TESTCOUNT=1 +;.TAW1 +; COUNT=TESTCOUNT +; GOSUB @GETWORDCOUNT +; IF CHAPTER=0 THEN TAW2 +; COUNT=TESTCOUNT +; GOSUB @DISPLAYWORD +; COUNT=TESTCOUNT +; GOSUB COMPAREPROTECTIONWORD +; IF VALUE=0 THEN TAW1 +;.TAW2 +; ADD TESTCOUNT,C1 +; GOTO TAW1 +;--- +.COMPAREPROTECTIONWORD +; return VALUE=word entered, or zero if failed +.CPWGETWORD + NOMOREINPUT=FALSE + WORDNOTPROCESSED=FALSE + SUPRESSCHECKING=TRUE + GOSUB @GETNEXTWORD + INDEX=0 + GOSUB @READINPUTLIST + IF VALUE=0 THEN CPWGETWORD +.CPW1 + SEARCHTYPE=MATCHTYPE + GOSUB @CHECKTYPEMORE + IF VALUE=0 THEN CPWFAIL + IF VALUE=COUNT THEN CPWOK + GOTO CPW1 +.CPWFAIL + VALUE=0 + SUPRESSCHECKING=FALSE + RETURN +.CPWOK + SUPRESSCHECKING=FALSE + RETURN +;--- +;.TEST +; C1=1 +; TESTCOUNT=1 +;.TEST1 +; COUNT=TESTCOUNT +; GOSUB GETWORDCOUNT +; IF CHAPTER=0 THEN TEST2 ; some problem, so skip over it +; GOSUB @DISPLAYWORD +;.TEST2 +; ADD TESTCOUNT,C1 +; IF TESTCOUNT0 THEN TESTUSER1 + GOSUB GETRANDOMWORD ; only pick a new word on startup, or on success + TESTCOUNT=COUNT + +.TESTUSER1 + ATTEMPTS=0 +; GOSUB GETRANDOMWORD +; TESTCOUNT=COUNT + MESSAGE 4200 ; whatsit appears +.TESTUSER2 + GOSUB @DISPLAYWORD + COUNT=TESTCOUNT + GOSUB @COMPAREPROTECTIONWORD + IF VALUE<>0 THEN TESTUSEROK + ADD ATTEMPTS,C1 + IF ATTEMPTS0 THEN GWC1 +; now get chapter number +.GETCHAPTERNUMBER + GOSUB RANDOM + X2=MAXCHAPTER + GOSUB @X1MODX2 + CHAPTER=X1 + IF CHAPTER=0 THEN GETCHAPTERNUMBER + + GOSUB RANDOM + X2=MAXPARAGRAPH + GOSUB @X1MODX2 + PARAGRAPH=X1 + + GOSUB RANDOM + X2=MAXWORD + GOSUB @X1MODX2 + WORD=X1 +; ok, now check for validity - SPECIAL to different books + IF CHAPTER<>2 THEN NCHAP2 + IF PARAGRAPH>8 THEN CHECKFAIL +.NCHAP2 + IF CHAPTER<>5 THEN NCHAP5 + IF PARAGRAPH>7 THEN CHECKFAIL +.NCHAP5 + IF CHAPTER<>19 THEN NCHAP19 + IF PARAGRAPH>10 THEN CHECKFAIL +.NCHAP19 + RETURN + +.CHECKFAIL + CHAPTER=0 + PARAGRAPH=0 + WORD=0 + RETURN +;--- +.DISPLAYWORD + X1=4210 ; number table + ADD X1,WORD + MESSAGE X1 ; nth + MESSAGE 4201 ; word from the + X1=4210 ; number table + ADD X1,PARAGRAPH + + MESSAGE X1 ; nth + MESSAGE 4203 ; paragraph of chapter + PRINT CHAPTER + MESSAGE 4204 ; ." + RETURN +;--- +.RANDOM +; return X1=random number + X1=RANDOMSEED + ADD X1,X1 + ADD X1,X1 + ADD X1,X1 + ADD X1,X1 + ADD X1,X1 + ADD X1,X1 + ADD X1,X1 + ADD X1,X1 + +; now replace low-order byte with 10. + X2=10 + ADD X1,X2 + + SUB X1,RANDOMSEED + ADD X1,X1 + ADD X1,X1 + ADD X1,RANDOMSEED + X2=1 + ADD X1,X2 + RANDOMSEED=X1 +; and return low-order of seed as a random number + X2=31 + LIST9(X2)=X1 + X1=LIST9(X2) + RETURN +;--- +.X1MODX2 + IF X1>not needed for BOOK protection +;------------------------------------------------ +;------------------------------------------------ +;------------------------------------------------- diff --git a/l9dev/regress/games.l9/colossal.l9/chain.txt b/l9dev/regress/games.l9/colossal.l9/chain.txt new file mode 100644 index 0000000..eb1b7dc --- /dev/null +++ b/l9dev/regress/games.l9/colossal.l9/chain.txt @@ -0,0 +1,159 @@ +; Lenslok code +; +; 27/05/86 +; + VAR + GAMEOVER ;>> + + BEGIN +;----- + +.SOLVEDPREVIOUS +;For use in SCORE message. + IF C0<>FIRSTPART THEN SOLVED1 ;No previous game ? + + IF GAMESOLVED<>SOLVING THEN SOLVED1 ;>> +;>> IF VERSION<>GAMECOMPLETE THEN SOLVED1 + MESSAGE 2315 ;You have solved the previous game(s) +.SOLVED1 + RETURN +; +;----- + +.ASKFINAL +;Called when current game is complete + +;Second and final parts are continuation of previous parts +;if 'complete' flag already set. + IF C0<>FIRSTPART THEN ASK2A +;>> IF VERSION<>GAMECOMPLETE THEN QUITPLAYAGAIN + IF GAMESOLVED<>SOLVING THEN QUITPLAYAGAIN ;>> +.ASK2 +;If the final part and solved previous parts then win entire trilogy + IF C0<>FINALPART THEN SOLVEDALL + +.ASK2A ;>> + MESSAGE 2313 ;Do you want to SAVE final position ? + GOSUB ASKINPUT + IF RESULT=FALSE THEN ASK2A ;>> +;>> IF RESULT=FALSE THEN ASK2 + IF I1=IYES THEN SAVEFINAL + IF I1=INO THEN QUITPLAYAGAIN + IF I1=INORTH THEN QUITPLAYAGAIN + GOTO ASK2A ;>> +;>> GOTO ASKFINAL +.SAVEFINAL + GAMESOLVED=ENDPOSITION ;>> +;(Don't return to game play after here) +;>>VERSION=GAMECOMPLETE + SAVE + GOTO ASK2A ;>> +;>> GOTO ASKFINAL +.SOLVEDALL + MESSAGE 2316 ;You have solved the entire trilogy + GOTO QUITPLAYAGAIN + +;----- + +.ASKINPUT + GOSUB @CLEARINPUT + GOSUB @GETI1I2I3I4 + IF I1=IRAM THEN ASKIN2 + IF I1=IOOPS THEN ASKIN3 + IF I1=IRESTORE THEN ASKIN1 + RESULT=TRUE + RETURN + +.ASKIN1 + GOSUB @LENSLOK + IF RESULT=FALSE THEN ASKIN4 + RESTORE + IF GAMEOVER=TRUE THEN @STARTGAME ;>>Trap bug on TORCH driver + GOTO @AFTERRESTORE + +.ASKIN2 + NOMOREINPUT=TRUE + GOTO @RAMLOAD + +.ASKIN3 + GOSUB @TRYOOPS + IF RESULT=TRUE THEN @AFTERRESTORE ;>> ENDCOMMAND + +.ASKIN4 + RESULT=FALSE + RETURN + +;----- + +.QUITPLAYAGAIN + GAMEOVER=TRUE ;>> + MESSAGE 2311 ;Quit or Restore ? + GOSUB ASKINPUT + IF RESULT=FALSE THEN QUITPLAYAGAIN + IF I1=IQUIT THEN @STARTGAME + GOTO QUITPLAYAGAIN + +;----- + +.ABORTGAME + MESSAGE 2310 ;Press space + +.WAITFORSPACE ;Variables may be corrupted + C0=0 + C1=1 + C3=3 + LINPUT(C0)=C3 + DRIVER + X1=LINPUT(C1) + IF X1<>32 THEN WAITFORSPACE + GOTO @STARTGAME + +;----- + +.WORDS + SCREEN T + GOTO @ENDCOMMAND + +;----- + +.PICTURES + SCREEN G C0 + LASTPICTURE=0 + GOTO @DESCRIBE ;Re-describe room + +;----- + +.AFTERRESTORE +;After a RESTORE or RAMLOAD or PICTURES + + LASTPICTURE=0 ; >>MIKE 24/6/86 + C0=0 ;>> +;Solved current game of previous game? + IF GAMESOLVED<>ENDPOSITION THEN AFTER2 ;>> + + IF VERSION=GAMECODE THEN @DIE ;>>Solved current game + IF C0<>FIRSTPART THEN AFTER2 ;First part can't be a chain + IF VERSION<>PREVIOUSGAMECODE THEN AFTER2 ;>> +;Solved previous game. +;>> IF VERSION<>PREVIOUSGAMECOMPLETE THEN AFTER2 +;Mark as having solved all previous parts: + CLEAR ;>> + VERSION=GAMECODE ;>> + GAMESOLVED=SOLVING ;>> +;>> VERSION=GAMECOMPLETE + GOTO @RETURNTOSTART + +.AFTER2 +;>> IF VERSION=GAMECOMPLETE THEN @DIE ;Already solved this game ? + + IF VERSION<>GAMECODE THEN WRONGPOSITION ;Wong game restored + IF C1<>1 THEN WRONGPOSITION + IF C2<>2 THEN WRONGPOSITION + IF C3=3 THEN @DESCRIBE +.WRONGPOSITION + MESSAGE 2314 ;Bad restored position + GOTO @ABORTGAME + +;----- +;------------------------------------- +;----------- diff --git a/l9dev/regress/games.l9/colossal.l9/compile.bat b/l9dev/regress/games.l9/colossal.l9/compile.bat new file mode 100644 index 0000000..5f961ae --- /dev/null +++ b/l9dev/regress/games.l9/colossal.l9/compile.bat @@ -0,0 +1,10 @@ +7 +1aconst.txt +1apconst.txt +1acore.txt +1aparse.txt +1aspecial.txt +1chain.txt +1oops.txt +1book.txt +2340 diff --git a/l9dev/regress/games.l9/colossal.l9/exit.txt b/l9dev/regress/games.l9/colossal.l9/exit.txt new file mode 100644 index 0000000..4bff111 --- /dev/null +++ b/l9dev/regress/games.l9/colossal.l9/exit.txt @@ -0,0 +1,670 @@ +;New Colossal Advent exits +;MJAustin 1982 +;19:55 on 4/7/82 +;Room 1 +0001 11 14 +0001 1 21 +0001 3 14 +1001 4 2 +;Room 2 +0001 4 3 +0001 3 8 +0000 2 8 +0001 9 8 +1000 7 7 +;Room 3 +0001 4 4 +0000 3 9 +1000 7 10 +;Room 4 +0001 4 5 +0000 3 7 +0010 11 17 +1010 10 17 +;Room 5 +0001 4 6 +0000 7 7 +1000 3 7 +;Room 6 +0000 7 7 +0000 4 255 +0000 13 255 +1000 3 7 +;Room 7 +0000 7 7 +0001 4 166 +0000 3 7 +0001 1 8 +1001 9 166 +;Room 8 +0001 2 9 +1001 1 9 +;Room 9 +0000 1 9 +0000 7 10 +0000 5 9 +0001 3 10 +1000 4 13 +;Room 10 +0000 4 11 +1000 1 10 +;Room 11 +0000 1 226 +0000 9 12 +0000 14 12 +1000 4 13 +;Room 12 +1000 10 10 +;Room 13 +0000 3 8 +0000 4 4 +0000 6 4 +0000 7 2 +0000 8 1 +1000 1 1 +;Room 14 +0001 3 15 +0001 10 41 +1001 14 41 +;Room 15 +0001 3 16 +1000 4 10 +;Room 16 +1000 13 255 +;Room 17 +0001 7 27 +0010 12 4 +1010 9 4 +;Room 18 +1000 2 26 +;Room 19 +1000 13 20 +;Room 20 +1000 0 0 +;Room 21 +0000 7 21 +0000 1 21 +1001 3 22 +;Room 22 +0000 1 22 +1001 3 23 +;Room 23 +0001 4 15 +0001 3 24 +1000 1 25 +;Room 24 +0001 4 16 +0001 1 25 +1000 3 24 +;Room 25 +0000 1 25 +0000 7 23 +1000 3 25 +;Room 26 +1000 4 18 +;Room 27 +1001 7 28 +;Room 28 +1001 7 29 +;Room 29 +1001 7 30 +;Room 30 +1001 7 31 +;Room 31 +1001 10 50 +;Room 32 +1000 2 33 +;Room 33 +0000 7 32 +1001 3 34 +;Room 34 +0000 2 35 +0000 5 38 +1001 10 38 +;Room 35 +0000 4 34 +0001 3 36 +1001 1 37 +;Room 36 +1000 0 0 +;Room 37 +1000 13 255 +;Room 38 +0000 1 34 +0000 4 39 +1001 10 39 +;Room 39 +0001 3 40 +1001 11 40 +;Room 40 +1000 0 0 +;Room 41 +1000 14 14 ; climb ladder back up to surface +;Room 42 +1000 0 0 +;Room 43 +1000 0 0 +;Room 44 +1000 0 0 +;Room 45 +1000 0 0 +;Room 46 +1000 0 0 +;Room 47 +1000 0 0 +;Room 48 +1000 0 0 +;Room 49 +1000 0 0 +;Room 50 +0001 4 51 +0001 7 58 +0000 1 52 +0000 3 31 +1000 14 31 +;Room 51 +1000 0 0 +;Room 52 +0010 4 53 +0010 7 65 +0010 1 54 +0000 3 50 +0010 6 66 +1001 9 50 +;Room 53 +1000 1 52 +;Room 54 +0000 4 52 +0001 1 55 +1001 10 98 +;Room 55 +0001 7 56 +1000 3 57 +;Room 56 +1001 13 255 +;Room 57 +0000 10 55 +1000 9 50 +;Room 58 +0011 15 59 +1011 7 59 +;Room 59 +0001 7 60 +1000 1 60 +;Room 60 +0000 1 59 +0001 7 61 +0000 4 138 +1000 9 146 +;Room 61 +0000 9 60 +0001 7 62 +0000 1 63 +1000 10 63 +;Room 62 +0000 4 146 +1001 1 63 +;Room 63 +0000 7 63 +0001 1 64 +1001 3 65 +;Room 64 +1000 0 0 +;Room 65 +1000 3 52 +;Room 66 +0000 3 52 +0001 7 68 +1001 10 87 +;Room 67 +0001 1 69 +1001 10 106 +;Room 68 +1001 1 67 +;Room 69 +1001 1 70 +;Room 70 +1000 0 0 +;Room 71 +0000 7 74 +1000 9 74 +;Room 72 +0001 10 73 +1001 7 98 +;Room 73 +1000 14 72 +;Room 74 +0000 10 100 +1000 1 71 +;Room 75 +1000 7 78 +;Room 76 +0000 3 77 +0001 9 102 +1000 7 82 +;Room 77 +1000 4 76 +;Room 78 +0000 8 75 +1001 3 18 +;Room 79 +1000 0 0 +;Room 80 +1001 10 81 +;Room 81 +1000 0 0 +;Room 82 +0000 7 104 +0000 1 244 +0000 2 244 +0000 5 244 +0000 4 244 +0000 6 244 +0000 8 244 +0000 9 244 +0000 10 244 +0000 11 244 +0000 12 244 +0000 13 244 +0000 14 244 +1001 3 102 +;Room 83 +1000 0 0 +;Room 84 +1000 0 0 +;Room 85 +0000 1 104 +0000 7 86 +1000 3 87 +;Room 86 +1000 4 85 +;Room 87 +0000 1 85 +1001 4 88 +;Room 88 +1000 0 0 +;Room 89 +0000 10 100 +1000 1 93 +;Room 90 +1000 0 0 +;Room 91 +0001 10 92 +1000 7 106 +;Room 92 +1010 14 94 +;Room 93 +0000 6 89 +0001 2 32 +1001 15 32 +;Room 94 +0000 3 92 +0000 10 92 +1000 7 95 +;Room 95 +0000 4 94 +0001 3 96 +1001 1 107 +;Room 96 +1000 0 0 +;Room 97 +0001 1 109 +0001 4 110 +1000 3 82 +;Room 98 +1001 7 99 +;Room 99 +1001 10 102 +;Room 100 +0000 5 101 +0000 6 89 +1001 1 83 +;Room 101 +0001 1 75 +0000 9 75 +0000 7 100 +1000 5 104 +;Room 102 +0001 1 103 +1000 3 76 +;Room 103 +0001 9 79 +1001 10 80 +;Room 104 +0000 2 82 +0001 4 85 +0001 3 84 +0001 7 105 +1000 8 101 +;Room 105 +0001 10 90 +1001 7 91 +;Room 106 +0000 1 82 +1000 4 91 +;Room 107 +1011 1 71 +;Room 108 +1000 7 109 +;Room 109 +0000 1 108 +1000 5 82 +;Room 110 +1000 10 116 +;Room 111 +1000 0 0 +;Room 112 +1000 0 0 +;Room 113 +1000 0 0 +;Room 114 +1000 0 0 +;Room 115 +1000 0 0 +;Room 116 +0000 4 134 +0000 10 30 +0000 3 139 +1001 1 137 +;Room 117 +1000 0 0 +;Room 118 +0000 1 140 +0001 3 119 +0001 9 117 +0001 10 117 +1000 4 120 +;Room 119 +1000 0 0 +;Room 120 +1000 3 118 +;Room 121 +1000 0 0 +;Room 122 +1000 0 0 +;Room 123 +0000 7 123 +0000 4 123 +0001 3 122 +1000 1 138 +;Room 124 +0000 3 140 +0001 1 121 +0001 10 125 +1000 4 126 +;Room 125 +1000 0 0 +;Room 126 +0000 3 124 +0001 7 127 +0001 9 128 +1000 4 129 +;Room 127 +1000 7 128 +;Room 128 +0000 7 127 +0000 4 130 +1000 3 129 +;Room 129 +0000 7 126 +0001 4 130 +0000 1 135 +0000 3 128 +1001 10 132 +;Room 130 +0000 7 128 +1000 4 131 +;Room 131 +1000 7 130 +;Room 132 +1000 0 0 +;Room 133 +1000 9 135 +;Room 134 +1000 3 116 +;Room 135 +0000 7 129 +0000 10 133 +1001 3 116 +;Room 136 +1000 0 0 +;Room 137 +1001 7 136 +;Room 138 +0001 1 60 +0000 9 60 +0001 3 140 +1000 7 123 +;Room 139 +0000 1 116 +0001 8 115 +1001 7 137 +;Room 140 +0000 4 124 +1000 3 118 +;Room 141 +1000 0 0 +;Room 142 +1000 0 0 +;Room 143 +1000 0 0 +;Room 144 +1000 0 0 +;Room 145 +1000 0 0 +;Room 146 +1000 9 62 +;Room 147 +1000 0 0 +;Room 148 +1000 0 0 +;Room 149 +1000 0 0 +;Room 150 +1000 10 62 +;Room 151 +1000 7 62 +;Room 152 +1000 3 62 +;Room 153 +1000 0 0 +;Room 154 +1000 0 0 +;Room 155 +1000 0 0 +;Room 156 +1000 0 0 +;Room 157 +1000 0 0 +;Room 158 +1000 0 0 +;Room 159 +1000 0 0 +;Room 160 +1000 0 0 +;Room 161 +1000 0 0 +;Room 162 +1000 0 0 +;Room 163 +1000 0 0 +;Room 164 +1000 0 0 +;Room 165 +1000 0 0 +;Room 166 +0001 4 167 +1001 9 167 +;Room 167 +0001 4 168 +1001 9 168 +;Room 168 +1000 0 0 +;Room 169 +0001 7 170 +0001 6 170 +1001 4 170 +;Room 170 +1000 7 252 +;Room 171 +0000 3 170 +1001 7 172 +;Room 172 +1000 0 0 +;Room 173 +0001 3 172 +0001 7 174 +1001 9 175 +;Room 174 +1000 0 0 +;Room 175 +1001 9 176 +;Room 176 +1001 9 177 +;Room 177 +1000 0 0 +;Room 178 +0001 10 177 +1001 9 179 +;Room 179 +0001 7 180 +0000 4 180 +0000 3 183 +1000 1 186 +;Room 180 +0000 4 180 +0000 7 182 +1001 1 182 +;Room 181 +1000 0 0 +;Room 182 +0000 7 182 +0000 1 182 +1000 3 186 +;Room 183 +0000 7 186 +0000 4 187 +0000 3 179 +1001 10 188 +;Room 184 +1000 1 186 +;Room 185 +0000 3 187 +1001 4 187 +;Room 186 +0000 4 180 +0000 3 186 +0000 1 184 +0001 3 185 +0001 4 183 +1000 7 186 +;Room 187 +0000 7 183 +1000 4 179 +;Room 188 +0001 3 189 +1001 7 190 +;Room 189 +1000 0 0 +;Room 190 +0001 1 191 +1001 7 192 +;Room 191 +1000 0 0 +;Room 192 +0001 1 193 +0001 4 194 +1001 7 195 +;Room 193 +1000 0 0 +;Room 194 +1000 0 0 +;Room 195 +1000 0 0 +;Room 196 +1000 0 0 +;Room 197 +1001 7 198 +;Room 198 +1001 7 199 +;Room 199 +1001 9 203 +;Room 200 +1001 9 199 +;Room 201 +1001 9 200 +;Room 202 +1001 9 201 +;Room 203 +1001 9 204 +;Room 204 +1001 9 205 +;Room 205 +1001 9 206 +;Room 206 +1001 9 207 +;Room 207 +1001 9 208 +;Room 208 +1001 9 209 +;Room 209 +1000 0 0 +;Room 210 +0001 1 218 +0001 4 211 +1001 7 206 +;Room 211 +1000 0 0 +;Room 212 +0001 7 211 +1001 3 213 +;Room 213 +1000 0 0 +;Room 214 +0001 1 215 +1001 4 213 +;Room 215 +1000 0 0 +;Room 216 +0001 1 217 +0001 2 215 +0001 3 214 +0001 5 213 +0001 4 212 +0001 6 211 +0001 7 210 +0001 8 218 +1001 9 219 +;Room 217 +0001 7 218 +1001 3 215 +;Room 218 +1000 0 0 +;Room 219 +1001 9 220 +;Room 220 +1001 7 221 +;Room 221 +1001 7 222 +;Room 222 +1001 7 223 +;Room 223 +1001 7 224 +;Room 224 +0001 1 225 +1000 7 227 +;Room 225 +1000 0 0 +;Room 226 +0000 1 9 +0000 3 9 +1000 4 11 +;Room 227 +0000 9 70 +1000 12 70 +;Room 228 +0000 0 0 +;------------------------------------- +;------------------------------------- +;------------------------------------- +;-------------------------- diff --git a/l9dev/regress/games.l9/colossal.l9/license.txt b/l9dev/regress/games.l9/colossal.l9/license.txt new file mode 100644 index 0000000..9c355e1 --- /dev/null +++ b/l9dev/regress/games.l9/colossal.l9/license.txt @@ -0,0 +1,2 @@ +These files are covered by the license to be found in https://github.com/MikeTheTechie/Level9-Public/blob/main/License.txt +All other rights are reserved. diff --git a/l9dev/regress/games.l9/colossal.l9/oops.txt b/l9dev/regress/games.l9/colossal.l9/oops.txt new file mode 100644 index 0000000..9f1b803 --- /dev/null +++ b/l9dev/regress/games.l9/colossal.l9/oops.txt @@ -0,0 +1,216 @@ +;'RAM' and 'OOPS' for Converted Trilogies + +;Copyright (C) 1986 Level 9 Computing + +;B:OOPS.TXT + +;----- + +VAR + SAVEL90 + SAVEL91 + SAVEL92 + SAVEL93 + +BEGIN + +;'RAM SAVE or 'RAM LOAD' + +.RAMCOMMAND + VALUE=I2 + IF VALUE=IRESTORE THEN RAMLOAD + +;Otherwise it's a RAM SAVE: + + PARSEX2=C0 ; first position + GOSUB @RAMWRITE +.RAMSAVEEND + IF RESULT<>C0 THEN NOTAVBLE;>>>=C0 THEN @ENDCOMMAND ;>>> ANDY 26/6/86 + MESSAGE OK ;>>> ANDY 26/6/86 + GOTO @ENDCOMMAND ;>>> ANDY 26/6/86 +.NOTAVBLE ;>>> ANDY 26/6/86 + MESSAGE 2300 ;Not available + GOTO @CANCELINPUT + +;'RAM' keyword followed by LOAD/RESTORE + +.RAMLOAD + PARSEX2=C0 ; first position + GOSUB @RAMREAD + IF RESULT<>C0 THEN NOTAVBLE1 ;>>>=C0 THEN @AFTERRESTORE;>>>ANDY 26/6/86 + MESSAGE OK ;>>> ANDY 26/6/86 + MESSAGE CR ;>>> ANDY 26/6/86 + GOTO @AFTERRESTORE ;>>> ANDY 26/6/86 +.NOTAVBLE1 ;>>> ANDY 26/6/86 + MESSAGE 2300 ;Not available + GOTO @CANCELINPUT + +;----- + +.INITOOPS +; count number of oops positions available + LASTOOPSROOM=C0 + OOPSPOSEND=C0 + OOPSPOS=C0 + NEXTOOPSPOS=C0 + NEXTOOPSEND=C0 + + PARSEX2=C1 + GOSUB @RAMWRITE + IF RESULT=C0 THEN INITOOPS1 + + PARSEX2=C0 + GOSUB @RAMWRITE + IF RESULT<>C0 THEN INITOOPSRET ;No RAM SAVE + MESSAGE 2301 ;Only RAM SAVE available + GOTO INITOOPS2 + +.INITOOPS1 + OOPSPOS=C1 + NEXTOOPSPOS=C1 + MESSAGE 2302 ; ram and oops available + +; now go through and write 'certified garbage' to all positions +.INITOOPS2 + C2=65000 ; show that positions are invalid +.INITOOPS3 + GOSUB @RAMWRITE + ADD PARSEX2,C1 + IF RESULT=C0 THEN INITOOPS3 + C2=2 ; restore C2 +.INITOOPSRET + RETURN + +;----- + +.OOPS + GOSUB TRYOOPS + IF RESULT=TRUE THEN @AFTERRESTORE + GOTO @ENDCOMMAND + +.TRYOOPS +; OOPSPOS points to next free position in ram save area +; go back some positions if they are available + IF OOPSPOS<>C0 THEN OOPS1 + MESSAGE 2300 ;Not available + RESULT=FALSE + RETURN + +.OOPS1 + IF OOPSPOS<>C1 THEN OOPS3 +; have gone to position 0, so need to wrap round to end of ram area + IF OOPSPOSEND<>C0 THEN OOPS2 + + MESSAGE 2304 ;No OOPS position found + RESULT=FALSE + RETURN + +.OOPS2 + OOPSPOS=OOPSPOSEND ; first invalid position + +.OOPS3 + OOPSFL=1 ; >> ANDY 26/6/86 + SUB OOPSPOS,C1 + PARSEX2=OOPSPOS + GOSUB RAMREAD + NOMOREINPUT=TRUE + RESULT=TRUE + RETURN + +;----- + +.SAVEOOPS +; OOPSPOS points to the next free position in ram save area +; this routine called on EVERY movement +; try writing to current position + + IF OOPSPOS=C0 THEN SAVEOOPSRET ;OOPS not available + + LASTOOPSROOM=R1 + NEXTOOPSPOS=OOPSPOS + NEXTOOPSEND=OOPSPOSEND + +.SAVEOOPS1 + PARSEX2=NEXTOOPSPOS + GOSUB RAMWRITE + IF RESULT=C0 THEN SAVEOOPSOK ; fine, inc pointer and finish +; something went wrong. +; if we are in the first position, tell the user +; that it is not available here + IF NEXTOOPSPOS<2 THEN SAVEOOPSRET ; keep quiet, ignore the error +; ok, so have some saved positions. Rotate round cyclically + NEXTOOPSEND=NEXTOOPSPOS ; save first invalid position + NEXTOOPSPOS=C1 + GOTO SAVEOOPS1 + +.SAVEOOPSOK + ADD NEXTOOPSPOS,C1 +.SAVEOOPSRET + RETURN + +;----- + +.OOPSCHECK + IF R1=LASTOOPSROOM THEN SAMEROOM + OOPSPOS=NEXTOOPSPOS + OOPSPOSEND=NEXTOOPSEND + LASTOOPSROOM=R1 +.SAMEROOM + RETURN + +;----- + +.RAMREAD + PARSEX1=23 ; code for ramload + GOSUB RAMOPERATION + IF C2<>2 THEN RAMERROR ;Do not use C2. Check for corrupted variables + RETURN + +.RAMERROR + IF OOPSFL<>1 THEN RAMERROR1 + MESSAGE 2304 ; >> Can't Oops back any further: ANDY 26/6/86 + OOPSFL=0 ; >> ANDY 26/6/86 + GOTO @ABORTGAME ; >> ANDY 26/6/86 +.RAMERROR1 ; >> ANDY 26/6/86 + MESSAGE 2303 ; Must RAM SAVE first + GOTO @ABORTGAME + +;----- + +.RAMWRITE + PARSEX1=22 ; code for ramsave +; drop through to RAMOPERATION + +.RAMOPERATION +; write to position PARSEX2, return RESULT=0 if OK + SAVEL90=LINPUT(C0) ;>> + SAVEL91=LINPUT(C1) ;>> + SAVEL92=LINPUT(C2) ;>> + SAVEL93=LINPUT(C3) ;>> + + LINPUT(C0)=PARSEX1 + LINPUT(C1)=PARSEX2 ; position number + LINPUT(C2)=C0 + DRIVER + C0=0 ;In case variables are corrupted. + RESULT=LINPUT(C0) + +;Now restore LIST 9. However variables may have been corrupted. + LINPUT(0)=SAVEL90 ;>> +; C1=1 ;>> +; ADD C0,C1 ;>> + LINPUT(1)=SAVEL91 ;>> (C0=1) +; ADD C0,C1 ;>> + LINPUT(2)=SAVEL92 ;>> (C0=2) +; ADD C0,C1 ;>> + LINPUT(3)=SAVEL93 ;>> (C0=3) +; C0=0 ;>> + RETURN +; +.NOTAVAILABLE + MESSAGE 2300 ;Feature not implemented + RETURN + +;----- +;------------------------------------- +;--------------- diff --git a/l9dev/regress/games.l9/colossal.l9/ref/table.dat b/l9dev/regress/games.l9/colossal.l9/ref/table.dat new file mode 100644 index 0000000000000000000000000000000000000000..2c08c06583532edeb27bcb5b054adab71d0c0c58 GIT binary patch literal 133 zcmYe0Vqjp%0AdXA|33pm14vXINEZNUcOX3(B*4JX=m5kGKzsnm$>8JT<&&0?Gd44| n){qj44@q@r@X-WHs4%QLb?Vmjt3W0QFaiOHfMFmDBFX>&!axzk literal 0 HcmV?d00001 diff --git a/l9dev/regress/games.l9/colossal.l9/st.l9/gamedata.dat b/l9dev/regress/games.l9/colossal.l9/st.l9/gamedata.dat new file mode 100644 index 0000000000000000000000000000000000000000..b5e9bc903599a22718227648874da95e96822a22 GIT binary patch literal 30453 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 Zsgo(KE2R;?mijaf(*XJ?4qk#<{|B)CX;}aO literal 0 HcmV?d00001 diff --git a/l9dev/regress/games.l9/colossal.l9/st.l9/ref/gamedata.dat b/l9dev/regress/games.l9/colossal.l9/st.l9/ref/gamedata.dat new file mode 100644 index 0000000000000000000000000000000000000000..b5e9bc903599a22718227648874da95e96822a22 GIT binary patch literal 30453 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 Zsgo(KE2R;?mijaf(*XJ?4qk#<{|B)CX;}aO literal 0 HcmV?d00001 diff --git a/l9dev/regress/games.l9/colossal.l9/st.l9/ref/squash.dat b/l9dev/regress/games.l9/colossal.l9/st.l9/ref/squash.dat new file mode 100644 index 0000000000000000000000000000000000000000..2b04d071ecc8ceee6cd6912fca3b4b7742f9e708 GIT binary patch literal 22272 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 literal 0 HcmV?d00001 diff --git a/l9dev/regress/games.l9/colossal.l9/st.l9/squash.dat b/l9dev/regress/games.l9/colossal.l9/st.l9/squash.dat new file mode 100644 index 0000000000000000000000000000000000000000..2b04d071ecc8ceee6cd6912fca3b4b7742f9e708 GIT binary patch literal 22272 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 literal 0 HcmV?d00001 diff --git a/l9dev/regress/games.l9/colossal.l9/table.dat b/l9dev/regress/games.l9/colossal.l9/table.dat new file mode 100644 index 0000000000000000000000000000000000000000..2c08c06583532edeb27bcb5b054adab71d0c0c58 GIT binary patch literal 133 zcmYe0Vqjp%0AdXA|33pm14vXINEZNUcOX3(B*4JX=m5kGKzsnm$>8JT<&&0?Gd44| n){qj44@q@r@X-WHs4%QLb?Vmjt3W0QFaiOHfMFmDBFX>&!axzk literal 0 HcmV?d00001 diff --git a/l9dev/regress/games.l9/colossal.l9/table.txt b/l9dev/regress/games.l9/colossal.l9/table.txt new file mode 100644 index 0000000..cce0d82 --- /dev/null +++ b/l9dev/regress/games.l9/colossal.l9/table.txt @@ -0,0 +1,88 @@ +;LIST INITIAL VALUES +; for COLOSSAL +;Copyright (C) 1982 MJ.Austin. +; 18:40 on 23/5/86 +; + ORG 0 +start + dc.l $8000 + dc.l LIST2-start-1 + dc.l $8070 + dc.l LIST4-start-1 + dc.l $8093 ;>> $8091 + dc.l 0 ;LIST 6 + dc.l $8140 ; LIST 7 + dc.l $8180 ; LIST 8 + dc.l $81C0 ; LIST 9 + dc.l LASTPTR-start +; +LIST2 + dc.b 14 ;KEYS + dc.b 14 ;LAMP + dc.b 13 ;FOOD + dc.b 14 ;BOTTLE + dc.b 27 ;CAGE + dc.b 28 ;ROD + dc.b 30 ;BIRD + dc.b 51 ;GOLD + dc.b 54 ;SILVER + dc.b 53 ;JEWELRY + dc.b 59 ;DIAMONDS + dc.b 40 ;BEAR + dc.b 26 ;PLATINUM PYRAMID + dc.b 18 ;EGG JEWEL + dc.b 95 ;EGGS + dc.b 84 ;PILLOW + dc.b 101 ;MING VASE + dc.b 71 ;TRIDENT + dc.b 0 ;PEARL + dc.b 76 ;MAGAZINE + dc.b 41 ;COINS + dc.b 0 ;CHAIN + dc.b 0 ;RUG + dc.b 0 ;CHEST + dc.b 36 ;SPICES + dc.b 0 ;AXE + dc.b 170 ;DYNAMITE + dc.b 202 ;JADE SPIDER + dc.b 202 ;ELIXIR + dc.b 218 ;ORB + dc.b 215 ;SCEPTRE + dc.b 213 ;CROWN +;--------- +;NOW OBJECT VALUE +LIST4 + dc.b 0 + dc.b 0 + dc.b 0 + dc.b 0 + dc.b 0 + dc.b 0 + dc.b 0 + dc.b 1 ;GOLD + dc.b 1 + dc.b 1 + dc.b 1 + dc.b 0 + dc.b 1 + dc.b 1 + dc.b 1 + dc.b 0 + dc.b 1 + dc.b 1 + dc.b 1 + dc.b 0 + dc.b 1 + dc.b 1 + dc.b 1 + dc.b 1 + dc.b 1 + dc.b 0 + dc.b 0 + dc.b 0 ;JADE SPIDER + dc.b 0 ;ELIXIR + dc.b 1 ;ORB + dc.b 1 ;SCEPTRE + dc.b 1 ;CROWN +;-------- +LASTPTR diff --git a/l9dev/regress/games.l9/eden.l9/acode.acd b/l9dev/regress/games.l9/eden.l9/acode.acd new file mode 100644 index 0000000000000000000000000000000000000000..19291ab192673b1d626565b0271db3aac6c887a8 GIT binary patch literal 10108 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