From e1c4761d2d8b3f268a7b37cd27f8dfcfa487eb40 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Sat, 7 Mar 1998 15:37:00 -0500 Subject: [PATCH] Import of version 2.9.0 --- BUGS | 5 + CHANGES | 44 + COMPILING | 28 + Makefile | 51 + README | 319 ++++ TODO | 4 + data/data_files_here | 0 data/level4.dat | 36 +- data/moon2.tb1 | Bin 12021 -> 8436 bytes data/register.tb1 | Bin 5865 -> 4413 bytes data/ships.tb1 | Bin 4182 -> 3621 bytes data/tb_cc.wav | Bin 10566 -> 0 bytes data/tb_kapow.wav | Bin 13014 -> 0 bytes data/tbahh.raw | 1 + data/tbash.tb1 | Bin 11709 -> 9681 bytes data/tbaship.tb1 | Bin 9453 -> 7266 bytes data/tbbonk.raw | 1 + data/tbcc.raw | 1 + data/tbchief.tb1 | Bin 27663 -> 21375 bytes data/tbclick.raw | Bin 0 -> 4313 bytes data/tbcobj.tb1 | Bin 44907 -> 34836 bytes data/tbconsol.tb1 | Bin 11817 -> 9615 bytes data/tbcrash.tb1 | Bin 6009 -> 4869 bytes data/tbeerm.tb1 | Bin 9867 -> 7716 bytes data/tbgorg.tb1 | Bin 20622 -> 17952 bytes data/tbkapow.raw | 1 + data/tbl2ship.tb1 | Bin 24348 -> 18756 bytes data/tbl3intr.tb1 | Bin 9366 -> 8868 bytes data/tblev3.tb1 | Bin 11835 -> 8964 bytes data/tbma1.tb1 | Bin 36723 -> 30579 bytes data/tbomb1.tb1 | Bin 37617 -> 28650 bytes data/tbow.raw | 1 + data/tbpit.tb1 | Bin 7038 -> 5415 bytes data/tbscream.raw | Bin 0 -> 17976 bytes data/tbshapes.tb1 | Bin 9432 -> 7122 bytes data/tbsobj.tb1 | Bin 4233 -> 3114 bytes data/tbtract.tb1 | Bin 6435 -> 5085 bytes data/tbzrrp.raw | Bin 0 -> 4273 bytes data/viewscr.tb1 | Bin 6471 -> 5373 bytes data/vmwfan.mod | Bin 27471 -> 0 bytes data/weave1.mod | Bin 17723 -> 0 bytes hiscore.tb1 | 20 + level1.c | 703 +++++++ level2.c | 608 +++++++ levels.h | 4 + procs.c | 4142 ++++++++++++++++++++++++++++++++++++++++++ soundIt.c | 713 ++++++++ soundIt.h | 91 + svmwgrap.c | 799 ++++++++ svmwgrap.h | 43 + tb1-2.9.0.lsm | 16 + tb1.c | 418 +++++ tblib.c | 1301 +++++++++++++ tblib.h | 34 + 54 files changed, 9366 insertions(+), 18 deletions(-) create mode 100644 BUGS create mode 100644 CHANGES create mode 100644 COMPILING create mode 100644 Makefile create mode 100644 README create mode 100644 TODO create mode 100644 data/data_files_here delete mode 100644 data/tb_cc.wav delete mode 100644 data/tb_kapow.wav create mode 100644 data/tbahh.raw create mode 100644 data/tbbonk.raw create mode 100644 data/tbcc.raw create mode 100644 data/tbclick.raw create mode 100644 data/tbkapow.raw create mode 100644 data/tbow.raw create mode 100644 data/tbscream.raw create mode 100644 data/tbzrrp.raw delete mode 100644 data/vmwfan.mod delete mode 100644 data/weave1.mod create mode 100644 hiscore.tb1 create mode 100644 level1.c create mode 100644 level2.c create mode 100644 levels.h create mode 100644 procs.c create mode 100644 soundIt.c create mode 100644 soundIt.h create mode 100644 svmwgrap.c create mode 100644 svmwgrap.h create mode 100644 tb1-2.9.0.lsm create mode 100644 tb1.c create mode 100644 tblib.c create mode 100644 tblib.h diff --git a/BUGS b/BUGS new file mode 100644 index 0000000..61026ca --- /dev/null +++ b/BUGS @@ -0,0 +1,5 @@ +Known Bugs: +% svgalib needs -force8bpp option +% weird colors at times in 8bpp X mode +% Enlightenment window manager screws up 8bpp colors +% game is not finished diff --git a/CHANGES b/CHANGES new file mode 100644 index 0000000..c79af10 --- /dev/null +++ b/CHANGES @@ -0,0 +1,44 @@ +7 March 1998 +* Added Level 2, mostly working + +6 March 1998 +* Added load game support + +5 March 1998 +* Fixed typo in credits [Yes I had "linux torvalds" by mistake]. Thanks + to my friend John C. for catching that one. +* Added save game support. + +3 March 1998 +* Really cleaned up level1.c Mostly cleaned +* Modularized and actually re-wrote some code, instead of translating it. +* Lots of really minor tweaks trying to up performance. + +1 March 1998 +* Got little opener slowed down +* Got credits working +* Got pause to work +* Got sidebar reporting hiscore. + +29 February 1998 +* OK, there was no 29th. But I did more work later and it felt + like a new day. +* Cleaned up the tb1.c majorly +* Added support for having the data files searched for in many directories. +* Cleaned out the directory structure and removed cruft. +* Got sound support working! +* added -force8bpp option so SVGA target works +* Other miscelaneous things + +28 February 1998 +* AWESOME!! WORKING BETTER THAN IT WAS BEFORE! +* Moved over to fast DirectBuffer Calls. FAST! +* Got gameplay working, GETTING SCROLLING STARS +* added vmwCrossBlit functions. FAST! Thanks to andy at the ggi-list +* Fixed lots of minor bugs + +27 February 1998 +* Started this file +* Today converted from 320x600 virtual to 3 320x200s [2 are in memory] +* Added support so it can (almost) run in both 8bpp and 16bpp mode. +* Broke a lot more than I fixed. diff --git a/COMPILING b/COMPILING new file mode 100644 index 0000000..680b2d5 --- /dev/null +++ b/COMPILING @@ -0,0 +1,28 @@ +First you have to get the ggi graphics library. + * for newest updates/info check out http://www.ggi-project.org + * Get a new snapshot from ftp://synergy.caltech.edu/pub/ggi/ggi-snapshots + * Get a newer one --> I developed it with ggi-980226.tar.gz + * save it + * uncompress it "tar -xzvf ggi-980226.tar.gz" + * "cd ggi" "cd lib" "cd libggi" "make" + * this brings up a menu. be sure to choose "xserv","svga" and "mem" + you can choose others if you wish, but these are all needed. + * exit the menu + * "make" + * should compile w/o problems [hopefully] + * "su" "make install" + * link your ~/ggi/include/ggi directory to /usr/local/include/ggi + [or however you want to get the files in the right place] + * copy the files ~/ggi/lib/libggi/include/ggi/*.h into + /usr/local/include/ggi + * should be all set up + +Now compile TB1 + * Uncompress the .tar.gz file + * "make" + * all should go OK.. you will get errors on some of the sound stuff, + but as long as the "tb1" file is created, you are good to go. + * It is known to work under 8bpp and 16bpp x-targets. Let me know if + it doesn't work under all of them + +Vince Weaver weave@eng.umd.edu http://www.glue.umd.edu/~weave/tb1 diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..6fd635c --- /dev/null +++ b/Makefile @@ -0,0 +1,51 @@ +############################################################## +# Makefile for Seabattle 1.0 -- by Vince Weaver # +# # +# Written on Linux 2.1.35 # +# # +# To modify for your configuration, add or remove the # # +# # +############################################################## + +#Your compiler. If gcc doesn't work, try CC +CC = gcc +#CC = cc + +#On Linux, uncomment the following +# +PLATFORM = Linux +C_OPTS = -O2 -Wall -DHAVE_LINUX_SOUND +L_OPTS = -lggi + +###################################################################### +# THERE IS NO NEED TO EDIT ANYTHING BELOW THIS LINE # +###################################################################### + +all: tb1 + +clean: + rm -f *.o + rm -f tb1 + rm -f *~ + +tb1: tb1.o svmwgrap.o tblib.o level1.o level2.o soundIt.o + $(CC) $(C_OPTS) -o tb1 tb1.o svmwgrap.o tblib.o level1.o level2.o soundIt.o $(L_OPTS) + @strip tb1 + +soundIt.o: soundIt.c + $(CC) $(C_OPTS) -c soundIt.c + +tb1.o: tb1.c + $(CC) $(C_OPTS) -c tb1.c + +tblib.o: tblib.c + $(CC) $(C_OPTS) -c tblib.c + +level1.o: level1.c + $(CC) $(C_OPTS) -c level1.c + +level2.o: level2.c + $(CC) $(C_OPTS) -c level2.c + +svmwgrap.o: svmwgrap.c + $(CC) $(C_OPTS) -c svmwgrap.c diff --git a/README b/README new file mode 100644 index 0000000..8cae589 --- /dev/null +++ b/README @@ -0,0 +1,319 @@ +what follows is the old dos readme... I'll update it one of these days.. + + +°°°°°² °°°°°² °² °² °°°°² °°°°°² °² °² °°°°² °°°°°² °² °² + °² °² °² °°²°°² °² °² °² °² °°²°°² °² °² °² °°²°°² + °² °² °² °²°²°² °°°°² °² °² °²°²°² °°°°² °°°°² °²°²°² + °² °² °² °² °² °² °² °² °² °² °² °² °² °² °² °² + °² °°°°°² °² °² °°°°² °°°°°² °² °² °°°°² °°°°°² °² °² + AND THE INVASION OF THE INANIMATE OBJECTS + + by + + Vince Weaver + +Version 2.4a +--------------------------------------------------------------------- + +Contents +-------- + 1.0 SYSTEM REQUIREMENTS + 2.0 STARTING THE GAME + 3.0 THE STORY + 4.0 GAME PLAY + 5.0 SAVING/LOADING GAMES + 6.0 TROUBLESHOOTING + 7.0 REGISTERING + 8.0 ACKNOWLEDGEMENTS + 9.0 CURRENT BUGS (FEATURES) + 10.0 PRAISE/ACCOMPLISHMENTS + + + 1.0 SYSTEM REQUIREMENTS +--------------------------------------------------------------------- + Bare Minimum: + 286/ 400K RAM/ 500K disk space + To run at a reasonable speed: + 386 33Mhz or better + For Digitized Sound: + XMS RAM, Sound Blaster or Compatible sound card + + (I have been developing this on a 386 33Mhz and it runs + passibly. It runs so much smoother on a 486. I'll try + to optimize the code some more...) + + + 2.0 STARTING THE GAME +--------------------------------------------------------------------- + Make sure all the files are in the same directory (list below) + [if any are missing, you will get a run-time error] + + Run the TBSETUP configuration utility. Pick the appropriate + options. + + Type TB1 to run the game. See "TROUBLESHOOTING" if you encounter + any errors. + + + To run Tom Bombem off of a CD-ROM: + Either type "tb1 -cdrom" to start the program in read-only + mode, or say "y" when prompted if you want read-only mode. + In this mode there are no saved games and the high score + list will not change. + + Files Needed: + TB1.EXE - Main executable + TBSETUP.EXE - Setup Program + CONFIG.TB1 - Config File Created by Setup Program + TBSOUND.EXE - Cool sound tester + MOON2.TB1 ¿ + REGISTER.TB1 ³ + TBGORG.TB1 ³ + TBCRASH.TB1 ³ + TBSOBJ.TB1 ³ + SHIPS.TB1 à Graphics files in PAINTPRO 5.0 format + TBOMB1.TB1 ³ + TBMA1.TB1 ³ + VIEWSCR.TB1 ³ + TBSHAPES.TB1 ³ + TBCOBJ.TB1 ³ + TBCHIEF.TB1 ³ + TBASHIP.TB1 ³ + TBL2SHIP.TB1 ³ + TBLEV3.TB1 ³ + TBL3INTR.TB1 ³ + TBEERM.TB1 ³ + TBCONSOL.TB1 ³ + TBPIT.TB1 ³ + TBASH.TB1 ³ + TBCOBJ.TB1 ³ + TBTRACT.TB1 Ù + LEVEL2.TB1 - Level Two Database + LEVEL4.TB1 - Level Four Database + FILE_ID.DIZ - Info file for BBS's + TBFONT.TB1 - Fonts for the game (a standard VGA font) + HISCORE.TB1 - The High Score List + TB1.DOC - The file you're reading + SOUNDS.TB1 - Sound effects + SGx.TB1 - Where x is a number... these are saved games + + + 3.0 THE STORY +--------------------------------------------------------------------- + + To understand the game, pick the "Story" option off of the + main menu. This part of the game took a lot of time in + itself, and is fun to read. + + The "Audio Error!" is not a real error. I just saved myself + the trouble of recording a voice-track for the game. As many + friends have said, "That's cheating!" but anyway unless I had + a lot of time and a CD-ROM, it is not practical. + + Anyway in the story, any key will speed up most scenes, and + escape will quit the whole thing. + + 4.0 GAME PLAY + -------------------------------------------------------------------- + To begin the game, select "NEW GAME" at the main menu. + + A little humorous movie will show; press to skip. + + The game itself is pretty simplistic as of yet. Basically + shoot the things coming at you. The arrow keys manuever... + the manuevering takes a little bit of practice to master. + Space shoots. You can shoot up to two missiles at once. + "S" toggles sound. "P" pauses. If the game play is too fast, + try the "+" and "-" keys to adjust. Sorry, if it runs too + slow at the onset, then your computer is too slow. + + The first level culminates with a "boss" character. Read the + story and see what happens. The dialog will clue you into + what's happening. + + The second level is now totally finished. Be sure to save + your games whenever you start a new level! + + Levels three and four are currently under development. In + level three, use the arrow keys to "walk" around. The space + bar will fire a weapon if you've picked one up. To activate/ + pick up things, walk into them. + + Level four is similar to level two. (Actually they are based + on the same game engine). They will be finished by version 2.5. + + An undocumented featue: when your score reaches a multiple of + 400 your shields are increased by one. + + Basic Summary of Keyboard Commands: + + ARROWS Manuever + SPACE Fires + Exits + P Pauses + S Toggles sound on/off + + Slows down game speed + - Increases game speed + F1 Shows help message + F2 Saves the Game (see "SAVING/LOADING GAMES") + + 5.0 SAVING/ LOADING GAMES +--------------------------------------------------------------------- + You can save games. However the only part that is saved is + how you begin the level. Therefore there is no real purpose + to saving your game until you reach level two. + + This might seem annoying, but at this point it is the only + practical way to implement saved games. + + + 6.0 TROUBLESHOOTING +--------------------------------------------------------------------- + This program usually runs fine on most computers. Occasionally + it will lock up on my brother for some inexplicable reason. + If it locks up frequently, try playing without sound blaster + sounds. + + Possible Problems: + + RUNTIME ERRORS: (Characterized by a "Rumtime Error at 4454:3434" + message.) Either a genuine bug or else one of + the ".TB1" graphics files is missing. + + LOCKING UP : If you have a sound blaster, try configuring + without SOUND, using the "TBSETUP" utility. + + MEMORY ERRORS : If you want soundblaster sound, HIMEM.SYS must + be loaded. Check DOS documentation. + + SOUND ERRORS : If you have a sound blaster and you are not + getting sound, be sure your "SET BLASTER" + command in your autoexec.bat is set properly. + + HARSH GRATING SOUND: This has happened occassionally at a + certain point on level two. I've tried to + fix it. If it's annoying, turn the sound + off. + + MISC ERRORS : Contact me at vmweaver@wam.umd.edu + + + 7.0 REGISTERING +--------------------------------------------------------------------- + My game is freeware. There is no copy protection. Hopefully + if you like it you will let me know, by mail or by e-mail. + A donation is not required, but if you want to you can send + me one. + + I will be attending college soon (Fall of 1996) so my e-mail + address, has changed from what it was earlier to: + vmweaver@wam.umd.edu + + You can get Tom Bombem at its web site, + + http://www.wam.umd.edu/~vmweaver/tb1/ + + Also, a college education is expensive, so any donations would + be a big help. + + Vince Weaver vmweaver@wam.umd.edu + [real home] + 326 Foster Knoll Dr. + Joppa, MD 21085-4706 + + + 8.0 ACKNOWLEDGEMENTS +--------------------------------------------------------------------- + I would like to thank many people who helped on this project. + + Ethan Brodsky for his excelent sound blaster routines. + Get them at http://www.pobox.com/~ebrodsky/smix/smix.html + There would be no sound blaster sound without them. + + The authors of PCGPE. This program started out as a + "flying toaster" demonstration from the Asphixia + VGA tutorials. I gradually replaced most of their code, + but I still use their putpixel, waitretrace, setmcga and + settext routines. + + I would also like to thank all my friends who have supported + me, especially Gus Thompson, because she went to Spain and + gave me time to work on this. Also Marie Prosser for + inspiration, and she also went away for three weeks + allowing me to work on this. Thanks to Nick Attanasio + who actually plays this game a lot, and whose comments + have hastened work on level 3. + + FUTURE ENHANCEMENTS: + I am going to learn how to use Mode X vga programming. + Supposedly this will speed up the code. Unless you + have a 386 like me, you probably won't notice. + + I'm also going to try to get some music in the + background, and of course add more levels. + + Also watch for a SGI gl port and possibly some + sort of Linux port. The only problem is that + they'll have to be in C. ( :-( ) + + +9.0 CURRENT BUGS (FEATURES) +------------------------------------------------------------------- + + Level One: No Known Ones + Level Two: Locks up for no reason near end sometimes? + Level Three: Many. This level still is under development. + Sometimes doors will not activate, sometimes + they send you to the wrong room. + Laser doesn't work, nor do enemies or + radioactive flooring. It is possible to + beat it though. + Level Four:Not done. Right now is level two with different + shape table. + + LOOK FOR NEWER RELEASES TO HAVE FEWER BUGS. + + If you find a unique bug, e-mail me describing it. + + +10.0 PRAISE/ACCOMPLISHMENTS OF TOM BOMBEM +___________________________________________________________________ + + Supposedly it will be on one of Pacific Hi-Tech's + "Gamehead" CD's. We'll see. + + A German book company has offered to put it in a CD included + with a Shareware Games book. + + Now Praise: + + + "I just like it when it says 'Ahhh... Mr. Bombem.'" + ----Greg Grabowski, Bel Air, MD + + "It's simplicity reminded me of the early computer + shooters... Kind of nostalgic... But the nice + side [is] the very clever cinematic text." + ---->> Delance << + + "The game is well designed but does not fit + our current product line." + ----Apogee Software Productions + + +Remember: Watch for the newest version of Tom Bombem... and have fun. + + Vince Weaver 14 July 1996 18:12:59 EDT + + + + + + + + + + + + + diff --git a/TODO b/TODO new file mode 100644 index 0000000..5b067dc --- /dev/null +++ b/TODO @@ -0,0 +1,4 @@ +Finish the game [or at least get it on-par with the dos version] +Requires: + Levels2-4 + Highscore list diff --git a/data/data_files_here b/data/data_files_here new file mode 100644 index 0000000..e69de29 diff --git a/data/level4.dat b/data/level4.dat index a688856..3b30234 100644 --- a/data/level4.dat +++ b/data/level4.dat @@ -1,22 +1,22 @@ -31 31 31 31 31 31 31 31 31 31 31 31 -5 7 5 5 5 5 5 5 5 5 7 5 -5 5 3 5 30 30 30 30 5 3 5 5 -5 5 5 5 4 4 4 4 5 5 5 5 -15 15 15 15 31 31 31 31 15 15 15 15 -17 17 17 17 16 16 16 16 17 17 17 17 -9 9 9 9 9 9 9 9 9 9 9 9 -9 9 9 9 9 9 9 9 9 9 9 9 -9 9 9 9 9 9 9 9 9 9 9 9 -9 9 9 9 9 9 9 9 9 9 9 9 -9 9 9 9 9 9 9 9 9 9 9 9 -9 9 9 9 9 9 9 9 9 9 9 9 -7 9 9 9 9 9 9 9 9 9 9 7 -9 9 9 9 9 9 9 9 9 9 9 9 -9 9 9 9 9 9 9 9 9 9 9 9 -12 9 9 9 12 9 9 12 9 9 9 12 -9 9 9 9 9 9 9 9 9 9 9 9 -9 9 9 9 9 9 9 9 9 9 9 9 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 +15 15 15 15 0 0 0 0 15 15 15 15 +0 0 0 0 0 0 0 0 0 0 0 0 30 30 30 30 30 30 30 30 30 30 30 30 +5 5 5 5 5 5 5 5 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 +5 4 5 5 5 5 5 5 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 +5 5 5 5 5 4 5 5 5 5 5 5 +5 12 5 5 5 5 5 5 5 5 12 5 +5 5 5 5 14 5 14 5 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 +12 5 5 5 12 5 5 12 5 5 5 12 +5 5 5 5 5 5 5 5 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 +31 31 31 31 31 31 31 31 31 31 31 31 0 0 0 0 0 0 0 0 0 0 0 0 2 2 18 19 0 0 0 0 19 18 2 2 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/data/moon2.tb1 b/data/moon2.tb1 index 6005f48696c766eb62c1b142c5909a2d6a676a34..2d393b134300fa9abaec6ecc73abdb707dfe4bbb 100644 GIT binary patch literal 8436 zcmeI1UudN3UB{pIoteyRlATO8C+Tc<*`00e>6Ej!QLqLIwS{9{6*TmuWe^L29(v|N zAs4xbH}bsUKqErQO<}5n5d=q2I#=>ucoDD6#VSD&auIZ;q5~cGSew`SfXd^|TyaJs)2^zk2WK^Y@-kCX;vHeRnVzJbwI`T)e%yx+3Fr`ft2@{P^lh zPpKhH-c>O_`R^wP{J$Z94nyrrc`pmu=Z^Zlbfatdy$^ZV{F!`*kN(QnZyXIW-+aZ_ zug>3oBR!nI{i@$S)3x@y9}+YFd3{9oD%#(8{jd0%(*1$!d40a%$^2%=YrgF3$ExDP z>wdfGuYB6~JM;B#&2K*DProq#N_-{GJNl^kqtLAD<^!1I|9#_O_>RB$O-K7q6+G+u z?Z@>|*1Z8~{?zNMZ_SJO%lXYWUw)eZg}?p+lW+N>-}LoYef`$_TfZ^C`PY|gY7b(+ z9=Drel7;KMXsuC7*2%N2R<@I6TeVm&1eN#E(97fCR-AR>Y|YE++-F-2?u(&b*9>+i=Wd5X!G!*xy9vpfrVxXxZ&<7}0$rzhD~p6w|kapJ5I1Zg)u3GsY|FUHv& z%Huwscf7tfzsZa4$~;A$b%>xW*%oEwAzO|8pis)2$IIn#T@PmqL`cOb$XP0>R&;5n zj`DcOeX-q9FX5-m(SK425xlro^jC`3in=?iIn+YYA~Jo|=ty7ZyMRM6q3&y~*lvW+ zQ^upYkiO`!r>VAB@^$i7jii0f zDEO3XDpeWJ+cZwDEHvV!z)Z!5Q2e zQYWk%Vg0O#a?x*u@W0mElK4Gi^s13j78NO)6jm9l z2<~M~1}-N|1TDv@RXU<1Fkg4NTB-*aEe5-E4C&Hj@aI(ZOLyDXQ%7 zxbBkV>P4%q_El277;IE+$~lFqoO6OgK9TQmy&$+oqr_EoV+_+h@e}xUd|qLR*`4#U zr>?bI1>MLHI^3{QM1!`}wawH^3<^G_wU5s?!N0d!*x)o@EO1o>>BP$=1EMl$$J4C^ z#H>1Pwdbf(&sx!67x)ACC0*izd6e5|JrOiGb=y=ra{P|x;>+@Us=Ab%5UuSL#ej#@##XrDW%ZOdt&Hc3$R>n8p3nX+iQ*-M-gfqm z)t)vol?`RgMLfi`8Ha?7Yz=s0xyVK@(!rdTyBjdBF+pRf9ehy5RxM7`Rw6G_in2*| zx4bJ5XqJ{Qh`gXiw0+Ccp;hKNSV5>Bd>$qVwLPav%mCuxJJnvVvxmyq$aZqwgTtPI z>XX-&a?Z@YFWcb>^NSPCr_U(i5AApfacwpT=8+yXXs4pS=(dYtTVBUUblRsLA9dhj zr>>cGMz|0Q)Uc%@E4LgkX_pD_+g;PyLtrxa>UZW*?a7^_VNHZSB9|~Hz2KusT353tC!2_t|z4da?+I=)PU#NjzdAvP*b30@sl2Ce=i=IWs136wrio= z+jK38Axn*P#Ea0b_BCn%ia0iys0gW#amdZAr?aS1>xxx!)uv!esdk4d&Yn{rFKUX% z^riSk>vq~MHHN})1N{)eL}-tr{W!w^*VU9#FlB4f(onB#&j|04NFxSxvX@~sYjmf^ zL2uuwM@t$g-r_UY0#F`8*dBb%Ct{q8HywVeDGrB>>B`Qko*{+0uKO6i?Z@B2Qow z3J5M&QTr#rg64^HCmuV(iJDc*i21k~OB}2+OtPriE(Obikf>S4VB0Vf$J&t-mBj$e zrB97BER%OC_b^r))a+$7^-iat7pSu)PYAzn6Z?9AZX_2oNf#GA$DiAfE`@ZgPqAs~ z_BEKe2Yks?%M_eLDN?~qkYz_Be41x`of_1>W<*~<1&~eQ(9=gCsj|m->1VuYzBTvr zud9s1R&`hcnM;n}roLt24cpqAj4HGOX13RG@J{7a=eJ=E?Wq#s0PGFZU6}r$1QQ;Nle)ZrLjWNlI~qKNH4m&S#^qC01Mlb_m}A%p(lB$ z45zLY!v`whgoliSn1xm`vI89nhrbT{hym|viD*nrbjwu9PR(&DJuB(6yeKy@~wkogY=zsGN33E&hZOCFY!b|1aEZKX?` z(q_3{j5dpbNKvP>Jf%VjCR~VC_0_X-xN`r@_?*^?>0Q+@0zEsxHW5_79Q>YmXP4oM zoXVEQ|01c*n@f^35@Li)j72ByWPR#dHLQRYHl@~(2R$-?J@-DbCQm4aF_b1*ko+Ws ze>4J*!d}Yj)RRW#HrujC6+D!yz*-!G$!!se;nOdeL(ud#9vkQmxJsOs#;tbpKC2hA zyF!mA$_w%}?PbGeh(KMpV2~@8cvmOqF4`ubW!41*fhp3r7X|nQcBdaxLZ*i#){F7I zVhj{`>8857egU{QRry|QshLpKCIU_URee;h!$P7m zULt8W*=kJ%?*Jm`$SyjOx?=ZXQCi*_e9A-ZA#7!`I9>CwZ<8TAsy?TE^yc3+T_{`C z4?`q$`of47`2`9%^6>5=*lLR*3nzIv6}&XgYoi$Bx0v2T+NS`CQ$C~71EsKq#{LIU zDYE0o!&|&4M$)~M3nkyET+t=5*ynTY3!3ZmRT9Nx+*NY&+--_zX`9rrFsFF99tWWP zeGe2VIDOTeu@z3#Z_!<*e&VxNx~e)GHx`G+;?#E9Ni)7tly}wUxLuU=cu%=b$d34J z@*}*x9k-opyJ5-}!oH0ioJo4@KY}sQ+_SaOJ^+&I+`Ge`Pd??Hs)ZRm;%4-6Pmb~I zm8sEv&e-yYwGd`;JH#jYr62Yiw4m0;dI>{;oURmLDgpcq5U^+rBpGHdiB8y$?&(Hz z;rQfbk4|{_f;XOLu~2}m1;JjrnKABi_#glUUij4 zzuJ^rD`x1VCL|FdxfnqXD*JWMozoq*!+u6y<%-pfy%))`QIZ8WpdF6l%rYMMQ1Y0i zx$_muz+qYoSf;$KG?NUNGD(rE?4tVNpxF`r-hZ#@MaEc^Zow&x7_$i%8{YT- zi^-*hc(@P`@dWzP9%KO^vxZuj-bGG6dsEwnVqTls>pXNEA8=+5itz&xWX1(Z_{jWh z^Tdh%&@x+${f5pthn5*YoyyRh>hr!`2(NiLwzNY**T^CAl0VY&F%eZQArle3(++a=$y!emj;cL$F z=W(0Lp&JZa%0j8yyoA4w{bR=22c&Du6`-oAuedNo-cxpR{<1BJa88RK8 zC}XGYHhs*4LD7djO5RqZ$2QvtJ2lD>W#`nOG11|0XCa$#@MG@y3Z44gb&3)g()35{ z71Qxa9|Qhb?!70aX%MDt%ADf7aSsWFV%L=v0Z*Dmzv*M!XXgi)e{ubDz!6@@I1ldW zccMm>C+YOdF0g36e!)q<>)vb5o9gE`vbH>FV89`VG4%TE4V=(`n+Tf4H*k-=x}Jys zP_!5SoRob|Z|gqbeemIL-B<}~tPFqW>weWv_4Ut+>lgnR6n zjhI>6D?jar?HeokH>P^y#$t{&D!>uK#f<{;%^NFIRr$}}tm@m&^{2jm`$n$poqR&% z`}qWoJvu5kL)bhjU)MvueH~qe(B*Bum%n&;bj-31K0WHcTzNF^d+}>}e*Dp+;TtJJ zev0>L3`4l1$Pw0Fek+fXZU`NJRDb!ch?ui{0&5LrKVex@1%y0*Ms4@F<`*hS&rj<9 z=;g|z?!%+$PqXZ3`bL~~k6N2~WM%!wR@Uj|sMU?rH&WQ6%TE=vM;{tfWsp(X7mVa< zx~HBG*5Jxx!@acTRwKA*Ru4l*t)=_ymP37nPlF!jUZ7uLx_r_c!Cjmfdzd6Wj5inh6=m$P67u&Oj_Ox2(>@gO4m~jQ@7dw?zEc zS8zIk{K{)~hC;l|zCxj^wm)jYEp+j3E!ZG-aNcG!hkwGjR z^r#XlG>@JQ`jd#2OJpHn+t_E7dF(EUL()#ntQ#}o1W@xPO1TA`A*4r#>CM*L_Y zFSeAJHDX>!YA<#(7rG?cySfSz7J77{k}O}P=e9G6-)F7sXYKlpuKQIHKN2F)x`Y&{ z;3r>vL_nMCm0nUsN=T);OjT4ZE%v~W7-}yB-no`4w&mL79{aRd?Q$Vbmj93=xnG5e zYDE*1Ejcg&KQ3nphRlSBS&^yg?$wUcd1!=|9xVVsH?WP}0s8z(iBstbVlHEXP{Vyyk0GYJzjg+j@L- zlP{eB{))Pvi}*GR{v}elETOcME3)cioQZDEMJXYk6C$6rL2|ClUH!rv?b4yGaTVjh z6Anvg{6WOGp6&RvT08N=$1)Z_mDG@OKp@`PnXsN!<5dl@nCCRtb(A8>&rjkj z-?KX3=h*oAs?uwfh7UV5SmvSBJ+7rdu}m%ScmR#IGqKU}rKhW0rMhusq`I%!s1_*p zuJhdKAU;N6+r|mox-{y)8b@wyZ)_x8UfC z$d`!Fgj}eigM4OT$~FCWP0;w6@#fV zB^@k7>31HI?_Gw&*5$UfCB*+_1>r_H5}>5VOwf9*vz4E;DSBMin~I`QH6ML3j#6H$ zp2SD18wI8PT3YAML-{CTUTLqltu)U_SCcdCfn?oRdS%EOKbNpG=Y3s*w#hwkFf8C* zdA~@CAWaG70{{&7W=M57xO%MJC&@(CcO5v3`omNX4PF$M&WW-dt-U)|Nqt(k%F9w1 z+J_wFoLU@UncGzm<}M7?k(KQ zO;+1oRD~qS@mmp}&`XfVox%6EyTU>F6A|BO;8O+g5P8Rw|6Dq6yk#2`AOY}I_Crch zOAMt+s?L7YsjS`J*IKk0$qVz5jI$HrmFpf7vm8lLBC>Nn&fYwsfz#E-3j;2lGm(rM z^`qlhHbqkR&PTw>nM69H$W*rL!!6g9iW6$c!TL#9U_C5?@pfB=^qG2sRwacvnZat4l&CuoD|>2YR;zFV?N*XZUsB5$g^D~rRB9P5ldP~AGqu{fQJf)6mu?Yq!Es+jB|n*S5BZ!@1o8A)6};|muzdfp$(MLk=dH~h zGF1K>Z}dKO6KC%}JnI1;jI*#%%bEbIML7kK)GX|fH2mZFXh3)_yyU&rAYp79GGPvE zm$De2xJJDNiu-in7+KA*g8BQ~9{U|PVw%ozFmo)C z(T|fkZ}7QuDCafOFt9CZf43A~wI_MkwQ1qJss3n5QJ6wY@Le513SnV5nJQ^R8P!@L09on#0Bw!I`WoAluU6YLBrlVPE^UhrHFm;!nB!nHB;Rk67Y^?UH0M zF*q&Fhrkbsd1;ugysW9XaW_&9U(3l)O76z+TC(?m9YLO}NdTu1_#`aM6Y^7)eP{9q z+ntxTx1Bs?uw^<Y5bNbc_bUsIeeInDmIaq)AOQ^c2-b-FK?wMC~ zH?EpkQ)MolRmJCm{Dr6EgncYUciygS-nra=~nRX{WrG>V>c1RojEeGWme(94iv1(~(N909mXjr2h z$goYawJXw}=n8Z0J+#5rZtsu3G2tfhH+$4wCtIk_Dpi7J4nAadmXYO=EG3R<5VMwO8c#EV-jQvG~N~vQXtSIiHUL+ zZr9A@k?z9k^6`pf4Z_01OvLJk3MGOo+6e+xC?cYS)ejE#bK|@ys^{7VV?sm3ykA|l z@F_*J!KytZ6E<2PDsdl5eBb_h@UzKku02x4Ry#GNL~b79Ql?eQjc$AJq0xDPtP}?( zo$Ge_(GFsHgE^DZeqZY5ExuYj`?hoPa~2$(_lyvT`Hg42u{AQ zI$QWq4vRQcA-Ggy$k`^7R&6#NA00g8P_>hbE+O{&g;<|0G;<^QLfFE`oeUqiVK-H! z@j;)=(U&kq*{pz`caujB{%~x22Vp|IP&J>z%@^i$;h z%If)uA2W^C1X7CAq0@GBB7>ug0-S@ZQ#xesM zzI{H&Qo@bF#ihOO4VB-G@L_nY?N>P~hjr=Ep8)L(8RqfF5kDP0%~AEtx6NLz2?!H>NUJIDne zhnEX;jUO+xpp_qFUXJ)Vi6i9N5*)(?_?8-;lmJS~6VF@D32*?Azh454CXdfp+q@I1 z4x{*(ty>+=KnYwpiVK0i1^Ok=r3bwGgL%Sd&9MS-UPhJqL6xH;;%iT<;OQ7|?nnNM z$DMgQI4VrZ^)_D-$9PHmTaCsqM*Phw4J{OWEFwq!SQL9S_}U^zPqkimC;t;~G@Q2F z0H4<{^;l;4RXC$JPovE{%V_hI312bht!SP+qw(H||1?7WsoSlH|2QGU_tepkmn9$h zoICNFk-xxiy3dgJ4$k>tV8@STfwO4bAu$(he8CC)rthE6rhoDjSI)1QKVPy zIry$Rs>iBK`Ab6ntkESNX}75KY`bOrN`xLcXc5ogv_qrO8t2hNPkE?)!%(}<(W_-5 z72hg~^15Wcr&k*ZNLXomSH3Zruu}dd?WTam~(w>-d6F|17wC))E2aO z!pW_65ReDELWR~f9#5te|7T`SkEX_hC7cn?3g?9j!bRbPbW%DcosrH;=cNnMMd^fcQaPoZQO+vol?%#6 z<%Dt4IAxqM&Kl>93&us`gmuz7Wu39kTIa0`)3(>{s&=@JA646js(LnSHZJ};S8I_DiMk}M2F~}IX zg;GVOqEXSR=v53VM((RLQJH8=v?h8JgNc!wEp1db8XK*R-o{{KWCutem5;_p>!bHE z_!!w1GDH=k3DJh=LkuBC_6qVN6;J_yy?9L49{yVtfBS0sjTqGHwd%s_`Y0dG2lY7X z)CF$J`PZX))*Zg6m&K#i>vVBQ(S?uol6GQ4>rUInX*nL0`$aL!n}cu5{Q+*u{b4b~ z!*VpEo%J%?TMjuqM>wa*5Yil;a$va$#Lea^_bbGv)O*VuNqdA9Gu*EzoKok->;~rr zCbAbPkdu}il06D3Bs+I^aFt^)#Li!G-jbTpPlBxhc)~p;S{9muL3{wcW zr7ZOkwiS#IHNNI;Nt3E|ueLPIAPZpEJAadQBDPbnH)zxaQgu*{v5t_Pg#`^FgV^*DK_Iun^}Yc_|58s)Eh&YjI~9*2mt|- z3o9ob@qU2xa;-CR6d3@qcY6^0bG&ITI8-3e9GoDwTYM()S*S6j?sJt(s4Sfo27S zQ>=aAOMp}i0&Woeq+R^LwtTfto%(_-!?dkgokBp!RUeb2je;6kxg>>|MmE}qwO(!X z=Q7c+okrbGT{w3qD8HNhxm=bAZ^AQH1L0_5j_@xCkR|}-Le4EB&j$rY&($by^i)xDZXW{tui58KsceZ|Mcd^7B6;t-3T=EWS9 z(vt)T&M1WMi3V^$j|d;p!%gajVCh(Uw18o@y9OvAqtTEB$QTyF=Ul|9;`T8bo}&?r zGkL-ODf;eH2pr3u?Lnwm5NH&%(nON@5W)!69fJuRh-2;5qs2u6NnYjZD&9#B=bq-> z2C5y866*|;lU%4G%~~6Ns;{%%DL@L;)rM!y!98l$;YT1q=Z(m$Fx80ebAecE#>vYg zdJeU>pmLgG^y_*6G@ObXpQA4BR|0|0i}M9l)EuHy@Hs=RF1ru^zy&}maGEy?LcOW4 za_ZWum#8J@pi?aPQAT8rac3;&`6e=QM{!68ZBJ717dksV!b1CnZVtyw{ze0Q4H*JTaC zk29+7szASz$gIpBVhMcmlCvNe0#hNy?vz5f77Q9TyiB$H3<0utA6R+XkJtSMq2%mn zG&rCy1uU0RcZVGxIDJov8yH@fk3L+&`Aq;?%06HYd3XOg?cr&vk3RdPTRq+2a3L@2 z>tT2QETQdAOYng#qpQ4K{n#8{;7mva(9^d6blGhVk#58x6?(UBAM`9+%+UcI{ylB} z4k>28;MS*ExXJpI7+aLdlHwGlH%3hJ?1gV+MlP!y924|cwvtrT~$wu`g)hxvMlYv zk4UL6(*&RBA#m(F=xz3eOzFEVdi?=e{^xNNd$~MGUg?FlFJ;@O2d_PAJC?p zZYD45<7zZULwkg+>~utPcH~8Ngu}zQFYDtSbQ5)LqPFs;sl+s8>FBFCBZuP&y`V9b z3^l5c2BZ1^OwH#ljbz?_fR~Vcgs2h*KEAOX!g-7KFsTHW{)J?@-r>@o(?lNID&voO`$+A#F;>W==GASK)w71sRVt%(`O7U(e{B51c9V2Pv~=eIbi(x zWFs7$9^`-E%n;QhaB93wPB}G8O0Ix7umn!^yZr%6-*RAraHPA#*4l0~ejOl&Z8(EU z6_``)z)5Z8lZ`$v>63MBPWmRV$Neh|G$07lG0(rR)k{n&Sc{`>Z0E)IIrig-tEa=1 zi~K{cHk{0R?ZE|Jkzbg3%(at-XHVcCTqjO9~+}PdLSs f(Y*SvbZPeYAT@Dk&zLZ)#Tg%`7eL{$Nuks`{(ChwvK<^;jer5jtl;I z;^ouRlXHTJ6D~rE>xGQ%hlEDT6I#LYtALx?HF z9AXWzg(xAq6n%;z#gt-Bv8LEkloVZ#KF5$_$}#6yb8IMp?q$asZZPJ>E_6qVN6;J_yy||4(fBg5qUZII*yWjh9 zFP{!*!T-3si+*^X4X4?#TlnK_*v^L?))}t5<4^uL$2ISqmTT-e&2HBTY6%3pk8p(e zZ-_O7S+|{ao8|J`qT9@txX%^W4|?5UCo`Vr>(j%8wiwYy8gqmb1bm3o-Q!#^4f(S6 zfW4)1M<(fFl~k0RgP@ZfgYMMC0KeWO0q%VLxOs0=W1|LoRCfRQPz8{Sr%?#*843 z*gs9N%K_rk>uVwq7!z@)2SfD{RB`{J!^2d&`9gnhUAUy~HeI)cKC4MI;6QEQtXaM` zj}jPL?k3QX(Gv6S#O|U^T$Kq(Qaa_Mb^w3!$WPpe56yprm_m)cs+eOIa|HOe9f%FR zawZdly;b|3_GAhv@tU=tnBqDe+tp|RZ$6+F^Bq!LVDB-lcFj&eL}BeYECvfz$$waW z>owz~Er$BY0r?S4w{@m1SA`{@UMoImFPMeMsD-8@9jN*Z$C<(&Z;`E4u;;--xE@vK z?PA!EK6X1zL0f6A5}x~woyY}K6EfEIR!`o1<>>8uHkr{9VLdOWT-19 zh)l*iAU1V^>H}EfTbA+Ka+wRPcZpmez@vldekjC_FOC>9s%z>32rwO1B`{t0yGyz` z6=RAAra+m`#78->;Hp0{QM(~8U;!)IAZp68A-?9Nj8+a)@22|`D=Tn#o?AKVA@aNda%EvVliQ zF?2Q~7y$&@{ki7SyhpAO7F0V3yXR_Icn6O#4!9toZiCTip)uoKA*hijGgmUy)ylyg z^Opps)EHjX`K%u*_Q=AaKx&Hr%qfOS0}|olIKQ~SEE@o#U712Hw$dmdk6fh+&ICEn z9}ifU&d9C1o%r_9d^PUP!QgY$H5 z0}vBU`&1u0k*sYL2a}FiFg(wcxveVH!3fY1JRP1F%3rIvX(vBwf)-Nicl5g3E!ag^ zfxlA(rZ90V#d0_>@0fi`fzLCr;3__ywHNvlei0KPnA7jT?~r@I(hg=cQ@E~i$37zd z3VFQRI9XuMsHrUtglg~DNOb?CZk`v9hsAL2w1he88lIQdKUe0oU_AjU6Ci8J#%cst zOe&10=jG#pXljI6p!X4l4XlL+-EIG<(d)5?v4J4S0uX*uHNq2kr<~E5U=FAy#_GZr zm@7;Q&PfW+_Tw>f09v&1k`~fLQPZK>J zI?|?h3k;5jGFu(V-CfCS!tKo45zY0H+x9^7iqorl)?>Cp$xby-2Ut~)-#+Xmf{WYg)(oEmQx9jX;CyqMffb3dz#bQrYc(Pt@W@y#Q0XnET8vRz zkmH|rhXyZR)^(=ulOsmEhYsAsIeH14@8}uq1VY`0!^6Z1 zv1$Zk*EbvtC%?qY!lyG)8G`k*ZgG*F)5Yo8UAhQH~h-%j}Lc;l`>=$&Lzf9?MJGe=H=@^`((;X5d7|9 p`tNbH=7tPJz_Gc8zjj6`jm~ee)2sfE+&uf;Unu?m>HkE5{{k(9tDgV> diff --git a/data/ships.tb1 b/data/ships.tb1 index ba8cbf4f89696b37d8974e00978b4b8766e09a77..8902406cb1ca67562f8dddb78bccdbf9465d9ca5 100644 GIT binary patch literal 3621 zcmeHIA#CGT82%i;Hfb(*NqVgoFii#r9*CxZ(-d&PJ7sFBMVmE6lYv1%z(9dPL8W<; zJ6XDbN-G!$FeoSpI1pf95Kv%g0RaIA0tx~G3JMCUZQx(G=a+k3dpR(Aw>sAEr|}1%(~HEfO_Un>5X;NU%k%T| z>2!K_b{0jEQ1<)%qoX6w^IX^McDur@*=*M9^=h?h7zP2Cz#Mo3jDZm_1WtiI&;vZc z1-gI@v;Y&J*^J_t!jL?V9EVJkWDpuS)HkVT&;b^Em~;@e5w<`yBZ`SaB9H!b=-Q-f zgRZfdVUi$vjW9$Iz}w$S-E?5`L25W(tBF^1x$Rsj|M3z`AFqt5VR6;InTO{O+$Q+U} zAcTaY1-uFNA~<1MhLJ3TPfkac;TeJ5Pv}2X^lC0P17mW3rE^ zgU~|IfcqRahk3W0C~mLbM>opab%zO+Ed>ed#%wyGjbb)AIy{Pi?CBacAod_nr~J2TYRti%rTAji%*;N zidn1Ft6SVCEE{yyCY&cNp6v4^l1Uwn0 z+Sdv96W$hD(a*rs;ye%SQSquG*V=}gE6%lhNM{AHRuFRqsjVQ!3bLwML9}~bn<6*O z$jc1#GUxIy7n@p1fVsm;%0ki&4cABcOoQ%&k~QeRq9IMJkw*z&Eoq~b&Bvnq#t8o9QNoPVpq-%_(K zHHB1QN*y6mb@aW_&+V$t+zy&Abyp|_qI~-eW@yaR6|xodci6EWG=&w7 zQBZ$@;9ysVS~@2rKZ%O>ueu{@FjhUYvgb literal 4182 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 diff --git a/data/tbahh.raw b/data/tbahh.raw new file mode 100644 index 0000000..154173c --- /dev/null +++ b/data/tbahh.raw @@ -0,0 +1 @@ +}}}}||||||}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}~~}}}}}}}}}}}}}}}}}}}}~~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}||}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}||||||}}}}}}}}}}}}}}~~~~~~~~~~€‚‚‡‹œ­¶¿¿¿¹´ª ŒxfTJ@ABMWco{‡‹‘’Š‚}xphijosuvwwvvqlbXQKNQ[eq}†”™›œ–Š„zxvwwwwvuttrpoonnsw‡’¡¥£¢˜Œ€ujaXWW[_ju~‡Ž•–—“‰‚~zwtwy|‚…„„€|vpha_^`ahow‰“˜›™”ˆ€|xtpuy|~ƒˆ‰‰ŒŽŠ‡„‚}}|~€…‰ŠŠŠŠ†‚€~zvvvvuy}~‚€~|zxuutvwyz}‚…‡‰‰ˆ‡†„‚€ƒ„„†‡ƒ€~wpmjfbcehjpuzƒ†ˆŠ‡„‚€xpnljikmnosvwxxxvtrpooqrtvwxwwwwtrmhb\ZYWVY\^_ekpu~‡‘›©·»¿¿¿¿¿¿¿·°œˆxh\PNLQU^gpyƒ“™ ¢£¥¦§§§§£ œ˜’Œ†€}zƒ‡‹‹‹‘———™›•—Ÿ ¡Ÿœ›€xp\HDA@@EJMOYcgjlng`XPH@@@@@@@@@@@ACA@@@@@@@@@@@@@FKµŸ¯¿¿¿¿¿¿¿¿¿¿¿¿@@@@@@@@@LWsŸ¯·¿¿¿¿¿¿¿¿¿¿¿¿¿½¼VpX@@@@@@@@@\w[¿¿¿¿¿¿¿¿¿«˜ˆxrljhgeb`ZULDB@BCUgƒŸ¯¿¿¿¿¿¿¿¿¿P`P@@@@@@@VkQ·»¿¿¿¿¿»¸ ˆyjaXL@@@@@@@@@@@@@DG[o~‘”Š€lXL@@@@@@@@@@@@@FKU_G¯·¿¿¿¿¿¿¿¿¿¿¿@@@@@@@@@@BC©§¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿³¨ŒpX@@@@@@@@@XoW¿¿¿¿¿¿¿¿¿±¤Šp`PH@@@CFJMIFGGYk‰§³¿¿¿¿¿¿¿¿¿XpX@@@@@@@P_K·»¿¿¿¿¿»¸ž„r`P@@@@@@@@@@@@@@@@@HOcw~„zp`PH@@@@@@@@@HO[gr|„‹¥¿¿¿¿¿¿¿¿¿¿¿»¸¼@@@@@@@@@LWC¯·¿¿¿¿¿¿¿¿¿¿¿¿¿±¤˜Œv`P@@@@@@@@@`_¿¿¿¿¿¿¿¿¿«˜~dR@@@@@BCKRSTWYl_¿¿¿¿¿¿¿¿¿§¨@@@@@@@@@°Ÿ¯¿¿¿¿¿¿¿«˜~dTDB@@@@@@@@@@@@@@@FK\mxƒ€lXL@@@@@@@@@LWgw~…ŠŸ¯·¿¿¿¿¿¿¿¿¿¿¿P`P@@@@@@@AA®›­¿¿¿¿¿¿¿¿¿¿¿¾¾¯ –Œ~pX@@@@@@@@@P_K·»¿¿¿¿¿¿¿·°pX@@@@@@@DGOVY[ckM¯·¿¿¿¿¿¿¿¿¿Ÿ€`@@@@@@@HOG¿¿¿¿¿¿¿¾¾Ÿ€bDB@@@@@@@@@@@@@@@@@LWgw‡ƒ€p`P@@@@@@@@@@@P_r…’Ÿ¯¿¿¿¿¿¿¿¿¿¿¿½¼¾@@@@@@@@@DG³Ÿ¯¿¿¿¿¿¿¿¿¿¿¿¿¿±¤’€jTJ@@@@@@@@@`_¿¿¿¿¿¿¿¿¿³¨ˆhT@@@@@@@@@DINS]gw‡“Ÿ¯¿¿¿¿¿¿¿¿¿·°¸@@@@@@@BC±Ÿ¯¿¿¿¿¿¿¿Ÿ€`@@@@@@@@@@@@@@@@@@@DGYku€€xpX@@@@@@@@@@@@@LWq‹¥¿¿¿¿¿¿¿¿¿¿¿¿¿¿@@@@@@@@@@@`_¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿©”z`P@@@@@@@@@XoW¿¿¿¿¿¿¿¿¿¹´š€jTJ@@@@@@@@@@@JSg{Ÿ¯¿¿¿¿¿¿¿¿¿·°@PH@@@@@@@`_¿¿¿¿¿¿¿±¤B`P@@@@@@@@@@@@@@@@@LWgw†•”’‰€dHD@@@@@@@@@@@@@LW`is}^¿¿¿¿¿¿¿¿¿¿¿¿¿@@@@@@@@@@DG»¯·¿¿¿¿¿¿¿¿¿¿¿¿¿»¸¥’pX@@@@@@@@@LWK¿¿¿¿¿¿¿¿¿»¸TpX@@@@@@@HOZdeeimv†–Ÿ¯¿¿¿¿¿¿¿¿¿¾¾Ÿ€dHD@@@DGc—¯·¿¿¿¿¿¯ ˆpbTLDB@@@@@@@@@@@@@HOcwƒ“–‹€jTJ@@@@@@@@@@@@@@@DGWgow‹Ÿ¯¿¿¿¿¿¿¿¿¿¿¿P`P@@@@@@@@@¯Ÿ¯¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿µ¬šˆlPH@@@@@@@@@«—«¿¿¿¿¿¿¿¿¿Ÿ€dHD@@@@@KU`kihb]bfms}‡™«µ¿¿¿¿¿«˜|`P@@@P_O¿¿¿¿¿¿¿¿¿§¨@@@@@@@@@§§¿¿¿·°œˆt`SFIKQWY[XUJ@@@@@@@@@@@@@DGS_[XL@@@@@@@AATgK¯·¿¿¿¿¿¿¿¿¿¿¿HPH@@@@@@@@@`›·»¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¡„¢@@@@@@@@@AA°Ÿ¯¿¿¿¿¿¿¿¿¿¯ €th`XSNKHD@@@@@@@P_w§¿¿¿¿¿¿¿¯ €`P@@@@@HO¯§¿¿¿¿¿¿¿¿¿¯ °@@@@@@@@@HO·Ÿ«·»¿·°¨ ”ˆvk`P@@@@@@@@@@@@@BCLUZ_[XL@@@@@@@@@@@LWj}–¯·¿¿¿¿¿¿¿¿¿¿¿Ÿ€`@@@@@@@@@XoO¯·¿¿¿¿¿¿¿¿¿¿¿¿¿¯ ˆpX@@@@@@@@@DG³Ÿ¯¿¿¿¿¿¿¿¿¿·°˜€jTJ@@@@@@@@@@@N[iw‡—«¿¿¿¿¿¿¿¯ „hT@@@@@@@XoW¿¿¿¿¿¿¿¿¿¿¿P`P@@@@@@@@@`šµº¿¿¿¸²¥˜‚yp`PH@@@@@@@@@@@@@KU^fc`THD@@@@@@@@@FK[k}§¿¿¿¿¿¿¿¿¿¿¿¿¿@@@@@@@@@@@@XoW¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿«˜|`P@@@@@@@@@DG¯—«¿¿¿¿¿¿¿¿¿¾¾§zdVHD@@@@@@@CEQ]hs„•¤³¹¿¿¿·°˜€p`P@@@@@LWk_¿¿¿¿¿¿¿¿¿¿¿GPH@@@@@@@@@`_¿¿¿¿¿¿¿³¨”€thT@@@@@@@@@@@@@DGWgovspf\N@@@@@@@@@@@FK]o‹§³¿¿¿¿¿¿¿¿¿¿¿Ÿ€`@@@@@@@@@P_K·»¿¿¿¿¿¿¿¿¿¿¿¿¿£ˆpXL@@@@@@@@@AA°Ÿ¯¿¿¿¿¿¿¿¿¿¿¿Ÿ€dHD@@@@@@@@@@@P_n}ŽŸ¯¿¿¿¿¿¿¿¯ ˆpX@@@@@@@HO³—«¿¿¿¿¿¿¿¿¿£ˆ¤@@@@@@@@@TgG§³¿¿¿¿¿·°¤˜ˆt`P@@@@@@@@@@@DGWgsƒ‡ƒ€hPH@@@@@@@@@@@@@N[gsy—¯·¿¿¿¿¿¿¿¿¿¿¿@@@@@@@@@@@@°Ÿ¯¿¿¿¿¿¿¿¿¿¿¿¿¿¯ Ž|rhT@@@@@@@@@HO¿¯·¿¿¿¿¿¿¿¿¿¯ ¸PH@@@@@@@CFKOYcgks{‹›§³¹¿¿¿½¼¢ˆnTJ@@@@@AA¬—«¿¿¿¿¿¿¿¿¿Ÿ€`@@@@@@@@@`_¿¿¿¿¿³¨’Šƒ…†whZLF@@@@@@@@@BC]w‹Ÿ£§›pPH@@@@@@@@@@@AAP^gosw‡—«¿¿¿¿¿¿¿¿¿¿¿¯ °@@@@@@@@@`_¿¿¿¿¿¿¿¿¿¿¿¸²¥˜‡vsp\HD@@@@@@@@@§§¿¿¿¿¿¿¿¿¿·°@PH@@@@@@@DGNU`koruwƒ›§³¿¿¿¿¿¯ ˆpX@@@@@@@¯Ÿ¯¿¿¿¿¿¿¿¿¿P`P@@@@@@@P_K·»¿¿¿¯ ŠtfXYYahaZVRI@@@@@@@@@N[mŽš˜†tZ@@@@@@@@@@@P_}›œœŠxdPKFS_O¿¿¿¿¿¿¿¿¿·°¸@@@@@@@BCA¿¿¿¿¿¿¿¿¿§xahoz„†‡•£™pPH@@@@@@@\w[¿¿¿¿¿¿¿¿¿£ˆ¤@@@@@@@XoŽŒ„|rh`XZ[eo«¯²© Št^HD@@@HO¯§¿¿¿¿¿¿¿¿¿XpX@@@@@@@P_w§¿¿¿¿¿¬š€o_bd`\VPH@@@@@@@@@HOe{‰—––‹€p`P@@@@@@@@@@@HO]kuytplignuŠŸ¯¿¿¿¿¿¿¿¿¿·°¸@@@@@@@P_G¯·¿¿¿¿¿¾¾¥Œv{‡Ž’•—˜Œ€hPH@@@@@DGc_¿¿¿¿¿¿¿¿¿£ˆt`SFDCIO]kqwutnh`YURVYbky†‘›ž š”Š€rd^X[]jw‘«µ¿¿¿¿¿¿¿¿¿ThT@@@@@@@RcM·»¿¿¿·°œˆt`UKHECBA@@@@@@@@@HO_ow„ˆ€xhXL@@@@@@@@@@@@@FKWcioppoou{]¿¿¿¿¿¿¿¿¿¿¿·°¸@@@@@@@P_G¯·¿¿¿¿¿¿¿¯ ”‰Š‹‡ƒ„…‚€thT@@@@@@@P_{—«¿¿¿¿¿¿¿½¼¢ˆt`VLJHOU^glpnmhd`\[[`enw‚”›šš‘ˆ|peZTNQS_k{‹¯·¿¿¿¿¿¿¿¿¿¿¿Ÿ€dHD@@@@@BCQ_G¯·¿¿¿¿¿¹´š€rdR@@@@@@@@@@@HO_ov}‚ypeZM@@@@@@@@@@@@@@@@@@@CEP[k{•¯·¿¿¿¿¿¿¿¿¿¿¿P`P@@@@@@@\w[¿¿¿¿¿¿¿¾¾´ª§¥£ ›–ŠtbPH@@@@@DG_w“¯·¿¿¿¿¿¿¿¯ ŠtfXQJKKRY^cddbaaadgmsy‡”™—•Œ„xlbXTQTWaky‡—§±»½¿¿¿¹´®¨¦¥²¿¿¿¿¿¿¿¯ °A@@@@@@BCa_¿¿¿¿¿¿¿¯ €`P@@@@@@@@@CFDBA@AAHOSW]bcc]XL@@@@@@@@@@@@@P_o‹———«¿¿¿¿¿¿¿¿¿¿¿¿¿GPH@@@@@@@XoW¿¿¿¿¿¿¿¿¿´ª¢š‘ˆ…‚€ytdTJ@@@@@BCYo‹§³¿¿¿¿¿¿¿¯ †l\LF@CEOYcmquvvsqomnosw~…Ž—›Ÿœš‘ˆ}ri`[Wdqv{Ÿ¯¿¿¿¿¿¿¿XpdXL@@@@@`Ÿ¯¿¿¿¿¿¬š‰xdPJDB@@@@@@@@@@@@@HO[gs~}vp\HD@@@@@@@@@@@LWj}ˆ“¥·»¿¿¿¿¿¿¿¿¿¿¿§¨@@@@@@@BC©§¿¿¿¿¿¿¿¿¿·°¦œ„|tldXLF@@@@@@@TgƒŸ¯¿¿¿¿¿¿¿¹´š€p`RDB@DGQ[aglqsuvwz|€ƒˆ’–˜š—”Œ„zpf\WRSU]er›¥®²µ²°©¢™†|vplhfeeefgikpu€‹¥¿¿¿¿¿¿¿¿¿£ˆ¤@@@@@@@BCašµº¿¿¿µ¬–€n\UNJGEDCBCDB@@@@@@@JS\ehjc\N@@@@@@@@@@@@@P_{—«¿¿¿¿¿¿¿¿¿¿¿¿¿Ÿ€`@@@@@@@@@XoS·»¿¿¿¿¿¿¿¿¿¿¿³¨–„r`P@@@@@@@@@P_{—«¿¿¿¿¿¿¿¿¿«˜„p`PH@@@CFKOU[agnu}…•›¡¥¨¦¥ž˜Œ€th^TPLOQX_n}Š—£¯´¹¸¸°¨ž”Š€xpkfc`]ZXVUTUVZ^gow›¥¯µ»½¿¿¿¿¿¿¿¿¿¯ ´HD@@@@@AAWmN¯·¿¿¿¾¾¯ ˆp]JE@@@@@AAHOLIMPOO\ir{…Ž‘ˆ€thT@@@@@@@@@HOV]_aXPH@@@HO¿¯·¿¿¿¿¿¿¿¿¿Ÿ€`@@@@@@@DG³Ÿ¯¿¿¿¿¿¿¿³¨¥£¦©­±´¶­¤’€`@@@@@@@@@`_¿¿¿¿¿¿¿½¼¢ˆt`VMNOW_gorurpkfc`bdls€š§®´°¬ž~lZHD@@@HOcw‰›¨µ¹¼¶±¨ ’„zqmjkkmnnmjhd`ZUTSX]hsŸ¯·¿¿¿¿¿¿¿¿¿¿¿»¸¬ »VK@@@@@@@M[u£·»¿¿¿·°œˆr\SJE@@@@@CFDCHLMNYcmw‹ŽŒˆ}rcTJ@@@@@HO[gqzwtnhXHD@@@@@P_O¿¿¿¿¿¿¿¿¿¿¿Ÿ€`@@@@@CE^w‹Ÿ¬¹µ²ª¢š’–¦¯¶½»º­ ˆpX@@@@@@@HO¯§¿¿¿¿¿¿¿¯ €tifcegmsuwtrmhaZXVZ^go{‡’¡¤ œ„vh^TOJOS]gsŸ§¯±²¯¬¦ ˜‹‡„~{xtphaZTPLMMT[eo›§®µ¶¶±¬©¦³¿¿¿¿¿¿¿¯ ˆpX@@@@@BCIO·Ÿªµº¿¿¿·°˜€n\PDB@@@@@BEGIJJPU\co{ƒŠ’š™˜”‚tdTJ@@@@@BCP]forunhXHD@@@@@§§¿¿¿¿¿¿¿¿¿§¨@@@@@@@P_¿Ÿ¯¿¿¿¹´¢ˆ†‹•ž©³¹¿»¸¤pPH@@@@@BCa_¿¿¿¿¿¿¿¯ €p`[V[_isy€€xph`ZUWYbky‡–¥­µ²°¤˜†tdTJ@ABMWgw‡—¢­°²­¨ž”Š€ztsruw{~~~{xphaZVRTU]er‹—¡«®±­ª¡˜Œxpjdddhkosw{}ƒ‘Ÿ¯¿¿¿¿¿¿¿³¨”€`@@@@@@@HOk‡—§±ºµ°¤˜†tnha[ZZXW\`]ZWUPKORX]fow†’Š‚{tdTKBA@@@BCOZgsy‚„{qh_VOHIJS[m“§³¿¿¿¿¿¿¿¿¿³¨˜ˆzlf`__bdjosvz}€ƒ‰•›¡§«¯°°ª¤š„xl`VLJHLOYcmwƒŽ•›ž ž™–’ŽŠ†„‚}zxuroligffikosy†‘•–—”‘Œˆ€xsnjgggjmrv{ƒ‡‰‹ŒŽŽ‘’’‘Š…{uoieabcu‡Ÿ·»¿¿¿¿¿²¥’€aCA@BCHLf‹—©»´®«¨˜ˆ}rlfdb^ZYXVTPLF@@@EIT_is{ƒ„„~xl`P@@@@@@@@@HQX_dhgg_XTQLHT_w§¿¿¿¿¿¿¿¿¿·°@PH@@@@@BCa“§³¿½¼³ª¡˜–•™£©®²¯¬ ”‚pX@@@@@BCYo‡Ÿ¯¿¿¿¿¿·° €pha_^cglqtwutplgbaaeiqyƒ• £žš‘ˆ}ria^\`cks|…•˜›™˜”‰ƒ~yvtuuwyz{yxtplhdabcfipw€‰—›Ÿ  œ˜’Œ†€{vutuux{ƒ‹Ÿ³¹¿¿¿¿¿³¨œpPOOG@O]ZWo‡‰‹—¢™–”ˆ|xupkihb\]^\Z[[YX\_fmu|…‡ˆ…‚zri`UJE@@@CFKOU[_ccb]XURNJMONLRWWW\`__goƒ—«¿¿¿¿¿¿¿¿¿¿¿§ªDB@@@@@LWkŸ¥«ªª¥¡ Ÿ¡¢¤¥¥¦£ ˜‚tdTJ@@@DGS_s‡—§±»¼¼¶°¤˜Ž„|tplmmprrspnkhd```dgnu~‡—›ž›˜‘Šxqjgehjqw‡Ž•™œ›š—”Š…~{zyyxwwspmjfb`^^^cgnu~‡—›Ÿ ¡ž›¡§³¿¿¿¿¿¿¿¯ €`@@@@@EJU_y’¡¯³¶²®Ÿ€qh`ZTRPNMPRRRQPNMOQW]dkry}€‚„~xrlbXVTOJKLF@@@@@@@@@@@@@GMbw“¯·¿¿¿¿¿¿¿¿¿·°H`P@@@@@HOg’¥°º»»µ°«§¥£¥§¨©§¦”†xdPH@@@@@CEZo‡Ÿ¯¿¿¿¿¿»¸©š€vlhefgjmnnlkhedbdejow‡”™™˜’Œ‚xnd^XVUZ_go{‡‘›¡§¨©¥¢œ–Š†‚|zxtplid`]ZXWZ]cir{…–¡¤£¢˜‘Šƒ|wrpnmmoqtvxy{|}~€ˆ§¿¿¿¿¿¿¿·° ¨@@@@@EJKKgƒ‰œ¨£Ÿ™”ˆ}zxtqpplhiid`ZUOJMOSWakqw~„‚€|xph`XTPRSUW\`eimpqqlheb[TTTMGGHD@CFOWs§¿¿¿¿¿¿¿¿¿¿¿Ÿ€`@@@@@@@N[l}ˆ“™Ÿžžžž£§¬±´···±¬ž~lZHD@@@BCQ_s‡–¥­µ´´¬¥œ”†}{zz{{{xuqmhdb`cejow~†’——–‘Œ„|tlgbaaeipw‡Œ‘“••”’Šˆ†…„ƒƒ‚‚€}yuoje`]Z\]bgowŠ‘—›ž™–‘Œ†€|xvtvw†• «µ¿¿¿½¼±§“€yscT`kaXk}xrŒ…~„zqpplijkfbdfc```ZUVWXY_dimsy|‚„€|vph`ZTOJIHIJLNRURPNLF@@@@@@@P_K·»¿¿¿¿¿¿¿¿¿§¨@@@@@@@P_w«®°ª¤ž˜——£©¯´¹·µª ˆpX@@@@@@@HOg—¯·¿¿¿¾¾±¤šˆ€|y{}~~~xrjb[TRQTWajuŠ•šž›˜ˆ~tlda^bels}‡Ž•˜›™˜•’‰†„‚ƒ„†‡††ƒ€xqjd^XWVY[cku‡”™š›˜–‘Œ†€|xvuvwxy{}}}}}~”©´¿¿¿¿¿·°ª¤B`abQ@N\SK`tvw‚Œ‹‹ˆ†yxxwuvvrnoplifd`]]\`cioswy{yxtpjd]VSPRTX[_bdfhigfca[USRNJFBA@@@AAXoW¿¿¿¿¿¿¿¿¿¿¿§pPH@@@@@LWi{‡“—š˜–––™› ¥ª¯³·µ´ª ŒxdPH@@@@@N[mŸªµ¶·°ª¡˜ˆ‚|zy{}~}|xtnhd`][_biow‡’•’Š„|unhfdhkqw‡Ž•˜›š™•’‰…‚€~~{xtpkfc`_^bejow‡Ž“—˜™—–“‹†ƒ€~|{zxwutsrqppprtx{‡—§³¿¿¿¿¿¿¿ª”Š€cGC@DGHH\ort…•Ž†‰Œ‚xxxwwz}xtuwpifd\UVVWW_fmsx|}~{xtph`[VVVWW[^`beheca`YRMIFCDEIMZg{§¿¿¿¿¿¿¿¿¿¿¿¯ ˆpdXRMQUZ_isy„‰ŒŽ’•˜œŸ¢¤££˜ˆ|pf\VPOOU[eo{‡‘›¡§§¦£ ™’ˆƒ~{xvutsrqomkiiikmqty}…ˆŠ‹‹‡„€|wrolkjmosw{„‰Œ‘’’‘Ž‹Š‰ˆ…ƒ€}xtplhdb```cejnsw{„‰ŒŒŠ‰‡…ƒ€~|zxwutttuvxy{}ƒ„……†‡…„‚~|zyxwvuux{Ÿ«·»¿¿¿±¤ž˜|`bdR@Wnf_x–œ—“‹„}vspmkihecbb^[VQOMMMT[cju…Š”Ž‰„€vlfa_]]]aegimpmjgd\TPLF@@@@@HOcw[¿¿¿¿¿¿¿¿¿¿¿¡„r`RDEFOWbmv‡ŽŠŒ’—£©¯°±­©œ€p`PH@@AHO[gs› ¥£ œ˜’Œˆ…ƒ‚ƒ„…‡†…‚€yrmhdabcgkqw‡‹‹ˆ‚|vqnklmpsyƒ‡ŠŒŠˆ‡…„„„…†‡ˆ‡‡„|xrlgca_abgkry€‡Œ“•””‘Ž‹ˆ„}|{zyxxwvutsrrrtuwy|ƒ…‡‡‡…„‚€~|ywvuttuuvwxxz{||~€ƒ„†‡—§±»½¿¾½º¸¥“pf]N@P_YRnŠ‚y‰˜‡ˆˆ~uvwvuvxusuvqlhd]WSPTW^enw~…††‡ˆ~tojc]_`bcgjosssqph`XPIBA@@ACEIMRW`it—¯·¿¿¿¿¿¿¿¿¿³¨xfTNHJKU_is{ƒˆŽŽŽŽ‘“–™œŸ  ›–ˆ~tld`\^_fmu|„‹““’ŽŠ†‚~zywyz}‚…‡ˆ‡†ƒ€}ywutstuwy{||{ywspmjiikmrv}ƒ‰”™›œ›˜•Œˆ„€}zxvusrpomkihggijnqv{†ŠŽ‘“““‘Œ‰…‚|zxwvvvuuvvvvwxz{}‡£·»¿¿¿¿¿¯ š”­FMTJ@P`__p€ˆƒxusqprsttuvrng`XPMJJILOSW\a``\XMBA@@@@@HOg_¿¿¿¿¿¿¿¿¿¿¿«˜„pf\^_gnw…Š‹ŒŠˆ‚|{z}‡– £¤¤œ”Š€thb\]]bgq{„’—˜˜“Žˆ‚|vtstuy}‚‡ŠŒ‹‹†‚~{wtssuvy{}€€}{vqlhebbbfiou~†Œ’–šœœ›˜–“‹ˆ†„‚|xtplheb```cejou{†ŠŽ‘ŽŒŠˆ†„ƒ‚‚‚ˆ›§³¿¼¹¼¿«˜”w^_`[W\`lw|€Š“ŒŒŒ€tssnjkligjmiffg`Z[\ZY^bfjnqtwxxwvpkgd`]ZXWVUTWZYXWVSPONPSUVZ^bfghouz“§³¿¿¿¿¿¿¿¿¿¹´¤”‡ztnmmpsx}€‚ƒ„‚€~||{}ƒ‡‹“–––“Š„~xtpnlnosw{‚…††„ƒ}{{{}~‚…‡ˆ‰Šˆ†ƒ€|yvsqoopqrtvwwwwutrqqqsty}‚†‹’•–—•“‰†ƒ€}zyxwvuutsqponmlnoruy}‚†‰ŒŽŒ’—¡«µ¿½»½¿¯ ˜{f_XWWXXhwz}Š—•“”–‹€~|vpqspmqtpljh`YTPNLMNSW[_ejkljheb_\YVUTSRUWXX[^acksy„ˆˆ‰€xrmgagmv’¥±½¾¿¿¿¿¿±¤˜Œ‚yxxz{‚‰Œ‘“‡‚~zwuwy~ƒ‰Ž’––•’Žˆ‚}xtpqqtw{ƒ‡‰Šˆ†ƒ€{vtrrrux|‚…‡ˆ†…‚€|ywutsuvy{}‚‚‚€~{ywuuvwy|ƒ†‰‹ŒŒ‹Š†ƒ€}zwvvwwyz{|}}|{yxwvuuvvxz|~ƒ…†††††„‚€~}}}}}~~~~~~~}}}}}€ƒ›§³¸¼¾¿·°¨ ˆplh^UY\bgov{„ˆˆˆ€xvtrqrsttwzxvutlea^YTVWZ]bglqsurplhd`_^^]bgjmopnmf`VLF@@@@@@@P_w§¿¿¿¿¿¿¿¿¿¸²£”†ƒƒ„‡‰‰‰‡…ytpmjmoty‰–šžœ–‘Š„~yvtuux{ƒ†ˆ‡†ƒ€{vrnljlmquy}‚‡ŠŽŒŠ‰‡†…„ƒƒ‚‚€~{xtplheba`bcgkqv{…ŠŽ‘“”••””“’‘Ž‹‰†„€|xtplifedefiknquy|‚„†‡‰Š‹‹ŒŒ‹‹Š‰‡†„‚}zxwvuuvvwxz{||}}~~}}~~€€€€€‰“§¬±¶»³¬§¢‘€ztlecbgknqw}~~€ztrqnlnoonswwwwxsnkhd`_^`adglqvz|}|{xuqnkhfeghkmrwz|}~|zyxrmjheba`^\\\\\]^achmsy„›§±»½¿¿¿¿¿»¸°¨ ˜’‰†„ƒ€}{wtqnkhgghiloty…‰Ž‘‹Šˆ†„ƒ‚‚€€~|zxuroljiiijkoruwy{}€‚‚€€€€€€~}||{zyxxxxyz{}~ƒ…†ˆ‰Š‹‹‹‹‹Š‰ˆˆ‡†…„ƒƒ‚~}|{zzyyyz{|}~‚…•ž§­²¸½¹¶³°¤˜”‰ƒ|{zyxwwtrpnieca`_abcdhkmortsrqqomlkkkkllmmnmlkjigfeddcbccbbccbba`_^]\[ZZZ\^diqy„Ž—Ÿ§¯³¶¶µ²°¬¨¤¡š—•’ŽŒˆ„{vrnjgeddegjlpsvxz|~€‚ƒ…†ˆŠŒŽ‘‘‘‘ŽŒ‰‡„~|zxvuutuuvvvwwwwwwwwwxyz{||}}~~~~~~‚„…†‡ˆˆˆˆ‡‡†…ƒ‚€~}|{zyxwutsrpoonnnpqstvwy{}~€‚ƒ„„„„„„„„„„ƒƒ‚€}|{zyxwwwwyzƒ‰“—›Ÿžš˜”Šˆ†„‚€€€~|zxvtrppopqstwyz|||{zxvsqonmmnnoppppponmljihhgghhijlmopqqrsstssssrrrqqqppppppppppqqrsuw{~ƒ‡‹“—™š››š™˜——–––——––••“’Ž‹‰†„‚~~}}|||{{{zzzyxxxxyzz{|}~€‚‚ƒƒƒƒƒƒ„„„„ƒƒƒ‚€~}}|{zzyyyyyyyyzz{{{||}}~~€€€~~~~~~~~€ƒ…‡‰ŠŠ‰‰ˆ‡‡‡ˆ‰ˆˆ‰‰‰‰‰‰‰ˆ†…„ƒ‚~}|{{zzzyxxwvutssrqpponnmmlkjjiihhhhhiijjklmnoopqrsstttttssssrrrrstvwz|~‚ƒ„†‡‰‹Œ‘“•—˜™š››œœ››š™˜—•”“’‘ŽŒŠ‰‡…ƒ}{zywvvutssrqqqpooooppqrrstvwxyz{|}~~€‚‚ƒƒ„„ƒƒƒƒ‚€~}}}||||||||||}}~€€€€€€€€€~~}||{{{zz{{{{{{{|||}}~~€€€€€~}}||{{{{{{{{|||}~~€‚…‡ˆ‰‰‰ˆˆ‰‰Š‹ŠŠ‰‰ˆ‡††…„‚€~}|{{zzzzyyzzzzzyyxwwvvutttuuuuutttttttsstttuvvwxyyz{{{||||{{{{{{{zzzzzyyyyxxwwwwxxxxyyyzzzzzzzzzzyyxxxxxyyz{||~€‚‚ƒ„……†‡‰Š‹ŒŽ‘‘‘ŽŒŒ‹Š‰ˆ‡‡…„ƒ€€~}|{zzyyxwwvuuttsssssttuvwxyzz{{||}}}}~~€€€€€€€€€€‚ƒ„…‡ˆ‰‰‰‰‰‰ŠŠ‹‹‹‹ŒŒ‹‹ŠŠŠ‰ˆ†…„ƒ‚€~}|{zywvtrqonmlkjjiihhhhhgffeeeeeeeffffgghijkkllmmnoopqstuwz|ƒ…†‡‰ŠŒ’“”•–—˜™™™™˜˜˜—————–••””’‘ŽŒŠˆ†„‚€}|zxwvutrqponmmmnnoopqrrsttuvwxyz{|}~€‚‚‚‚€€~~~~~}}}}||||||{{|||}}~~~€€€~~~~}}||{{zyyxxxxxyyyzz{{{|}}~~€€€€€~~~~~~}}}}}}}}}}||||||||||}}}}}}}}}}}}~~~~~~~~~~~~~}}}}}}}}}~~~~€ƒ…‡ˆˆˆ‡†‡‡ˆ‰Š‹‹‹‰ˆˆˆˆˆ‡†„ƒ‚€€~}}||zyxwvutsrrrrqqppppooooooooppqqrstuvwxxxxxxyyyyzzzzzzzzzzzyxxwwwwvvvvuuuuuuttttuuvvwxz{}~€ƒ„…†ˆŠŒŽ‘’’““””””””“’‘‘ŽŒ‹Šˆ‡…„‚€€~}||{zyxwwvvvuuuuuuuvvwwwwxxxxyzz{||}}~~~~~~~~~~~~~~~~~}}}}||||||}}}}~~~~€ƒ„†ˆ‰‰‰‰‰‰Š‹ŒŒŒ‹ŠŠ‰ˆˆ†…„ƒ‚‚€~}|{zyxwvutrqqpoonmllkkkjjjiijjjjkkkkllmmmmmmmmnnoooppqqqqqqqrrrrstvwy{}‚„…‡‰ŒŽ’”•–—˜™šššššššš™™™˜—–•”’Ž‹‰‡…ƒ‚€~}|zyxwvutsssrrrrrrssttuuuvvwwxyyz{||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€~~~~}}~~~~~~~~~~€‚‚‚ƒ„„„„………………„„„ƒƒ‚€€~}}||{{zzyyyxxwwwwwwwwwwwwxxxxxxxxxxxxxxxwwwvvuutttttttssrrrqqqqqqrrrrssrrrrqqqqrrrrrrrrstuvwxz{}ƒ„…‡‰‹ŒŽ‘’“””•••–––•••••””“’‘ŽŒ‹‰ˆ‡†…„‚€}|{zyxwwvvuuttttttuuuuvvvwwwxyzz{{||||}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€‚ƒ…†‡ˆ‰‰‰‰Š‹ŒŒ‹‹‹‹ŠŠ‰ˆ‡‡†…„„‚~}|{zyxwvtsrqpponmlkjjjiiiiiiiiiiiiiiiijjjjjjkkllmmmmnopqrsttuuvvwwxxyy{}~‚„…†ˆŠŒŽ‘“”•–—˜™šššššš™™™˜˜–•“’ŒŠˆ†…ƒ‚€~}|{zyxwvvuttssrrrqqrrrrrsttuuvvwxyz{{|}~~€‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚‚€€€~~~~}}}}||}}}}}}}}~~~~~~‚„†‡‡††††‡ˆŠ‹‹‹ŠŠ‰ˆˆˆ‰‰ˆ‡‡†††…„‚~|{zyxwvusrqqppnmlkjjjjjjiiiiiiijjjkkkkllmmnnnnopqrssttuuuuvvvvwwwwwwxxyz|~€‚ƒ…†‡ˆŠŒŽ‘’“”•–—˜™™™™™˜˜——•”’‘ŽŒ‹‰ˆ†„ƒ€~|{zyxwvvutssrrssssttttuuvvwwxyyzz{||}}~~~~~~~~~~~~~~}}}}~~€‚ƒ„„…†‡‡ˆ‰‰‰‰‰ŠŠ‰‰‰ˆˆˆˆˆ‡‡†…„„ƒ‚€~}|{zzyyxxwvvuutssrrqpppoo…šššš™™˜—–•”’‘ŽŒ‹Š‰‡†„ƒ€~}|{yxwvuttssrrrrrrrsssttuvvwwxyzz{{||}}~~~~~~‚„†‰‹ŽŽŽŽŽ‘’’’‘ŽŒ‹‹ŠŠ‰ˆ†…„ƒ‚}zxvtrqponmljhgfeddccbbbbccddccddfghiklmmnnoopqrrssssssttttuuuvvwxyz{}ƒ„…‡‰‹’•—˜™š›œžžŸŸ  ŸŸžžœš˜–“‘‹Šˆ†„‚|zxusqpnmmlllkkkjjjklnoqsuwxyz{}~€‚„…†‡ˆˆˆˆ‡‡††………„ƒƒ€}|{zyxxxxz{}~ƒ…†ˆŠ‘“•——————––•••””’ŽŒŠˆ…ƒ€~|{yxvtrpmkihgfeeddccccccdeghjkklkkjjjjjjiiiigfedcba```abbbaa``aabbdeghjlpsx}„Š‘—›Ÿ¢¥¨«¯³¶¹»½¼¼¹·³°­«¨¦£ œ™”‰‚}xuromkigfdca`abdfilortvxy{}€ƒ†‰‹ŽŽŒŒŒ‹‹‰ˆ†„~{ywutsrqpomlkkkkmnpqtw{„ˆ‹“–™¡¤§¨¨¨¨¦¥¢ ž›š—•Œˆ„€|ywtrpnkhfdba`___abccccddefghjlnonnmlkjiihhgfca`_^]\\\\[[YXWWVVWXZ\]]^_abdfilpsy‡–¡¥¨«¯³·»½¿¿¿¿¿¾¼·²­¨¦¤¢ š•Žˆ„€{vspnlkkjjhgfegimqtwz}€‚„†ˆŠŒ‘“•••“‘ŽŒŠˆ†„‚€}{xurpmkjjjjihhijklmoqv{‡‹Ž‘”—Ÿ§¯·»¾½½»¹´°­ª¨§¦¥ œ’ˆ~tokihfda^ZVQMJGGGKNQTTTSSUW[^behjlnoppppprsrromkigfedb`_^\[YWVUVWY[\]^_`acejou{‡Ž•šž¢¥©­²·»¿¿¿¿¿¿¿¼ºµ±®¬ª¨£ž˜’Œ†‚~{xurpnkihgfefgjmprtvy{}‚…ˆ‹‘’“““’‘‘ŽŒŠ‰‡†„‚€~}|{{zyxxyz{|}}~‚„…‡ˆ‰ŠŒŽŽŽŽ‹Š‰‰‡†„‚€~|{ywusqomljhfdcbaa``_^^^__acegjlmmnoqsuwxyyyyxwvvuttssrqnljhhhhhgggggfggijklmnoopqsuxz}…Š’“–™œž ¢¢£¢¢¡ žœ›š››››™—“ŽŒ‹Š‰ˆ‡†…„‚€~€ƒ…†‡‡‡ˆ‰Š‹ŒŒŽ‘ŽŒŠ‰ˆ‡‡‡‡†…ƒ‚€~}}}}}}||{zywwwwwxxxxxxxwwwvvwwxyxxxxwwvuttssssssqpnmllkjiijkjhggffedefgghijkkkjjlnprtuvvxyxxyy{}~ƒ‚‚‚‚„…„„‡‰ŠŒ‹Š‹ŒŠˆˆˆˆˆ…‚€~}|{{yxxxxxwwwwxy{}~ƒƒƒ„…††††ˆŠ‹ŒŒŒŒŒ‹‹ŒŒ‹ŠŠŠ‰ˆ†„„„„„ƒƒƒ„„„ƒ‚ƒƒ„…††‡ˆˆˆ‡††…†‡†††…„„‚€€€~}zxwwutrpomlljiklkkjikljhhijjkklmnoqsttvxyyyyyyyywvwxvtuvuuroswspooruroqrrrpoqsuwz|{z}‚„ƒƒ…‡ˆ‰†„„„€}~~€ƒ…ˆŠ‰ˆ‰‰‰‰‡…‡ˆ…ƒƒƒ‚‚€€‚„†‡††ˆ‹‡„…†††…ƒ…†††ƒ€~}€ƒ‚€‚„ƒƒ€~~~}|}}||zyvsttuuvw{~€~}|€ƒ„…ƒ…ˆ†„€}~~€}|{{{}ƒ†……ƒ‚€ƒ‡ˆˆˆ‡ƒ€‚}yyz|~}||zxz|~€€~}€‚€~ƒ€}€ƒ…†€{€…ƒ„‡ƒ€~}€€}z€…„„‚€}{zz}}{{{}~€ztx{zzzz}€€}z}|y{|zyz{~~€„‡ƒ€|y~ƒ~z|}~}|~€€}zyy{|zyyyz{ywutqorusrssrrvzzyyy|}{~€~‚…„ƒ€}||…|~€~||{†~wz}„€}€~|~„ˆ„€€}|~{xxy||xwvy|zy{|{z{{~€}{€…‚€‚…yz{‚{tz…Š„}…€{~€|xwvy{xuvwvvz}}|€„~~~zwz|~€€|xyy}€~}„‚„}v{„ˆ‡‡†„„„}vz~€€‚„{wtuw}ƒ|vx{ƒz}~„……‚€}{ˆ~uz€€{w}‚|{{€„~x|‚}xww~„}|ƒ‰„€|y~‚€~}„~xusx|yv{ytzwpxzuy}€‚}yyy}€~}xt~‡~tuuz{vut€‹ƒ|}}„‹…€‡Ž‡€}z…ƒxz{„Œ„|ywz|tlnox€ysuw{ƒ†~wŠŠ‰‹‡ƒ€ƒ€|y…~xxxyytpxytssuwxyzz}|y}€}{~€„ˆ€x{}€~}}}~€€}z}}{|}€ysx|}wo{‡ƒ€{w‡ƒ€{w‹…€|y€†ƒzt€‹…€}{€„‚€€€}{~€ztssz€wou{xvutwzwtvwy{~€}{€…‹Š…Š•›”–Ÿ™”Œ„‡Š…€wow|zto|ˆ}rtv~†xyy~‚€}{€„|uuu}„zprsyytvw~„ƒ‡‹ˆ†‚„ˆ~uwywutrrrssvxsou{vry}|}}‚†ƒ€~†Ž„z~†Šy‚‹…€€yry|zxw}ƒ|vy|}}zx{}…‚€~|~‚„}v}ƒ|}}†ŽŠ†„‰†|~‚~zxwz}wqpox€wosw€ˆyju€ƒ…„„……ƒ‚}ƒˆƒ‚…ˆ~uz‚„{}€€ys}†{|}{y|€yrsty~yuwxxxvuvw|€{w{~~~|{||€ƒ„…}€„~yt|ƒ{tsrx}zxofq{xvvw{~|z}‚~z‡ƒ†Œƒzƒ†ˆ‚}||†…„{ƒŠ€vz}„}vwx{~{x{}||}}‚‡‚}xtzwpxytx{€…z{{‚ˆ}rtv~…~x|‚„~xxyxx||y~ƒ|uxzyxy{{|xuxzxvxy{|~‚„‚„€}}}„Šƒ|~‚„|tx{~€}z€…‚€|xz{ƒ{tx{‚ˆ~tx{€„|t~‡…„~y{}„yow~„{sx}||tmxƒ~yz{}~|zxw|€€€€}y€‡|~ƒ|{{€………„„ƒ‚~{}~‚…€{|}{zyy{|zx{~ytx{|}||~}|€„ƒ‚‚…ˆ‡†‚~€€€}{|}||yvxyzzxw{~{y|~}|zyz{xuy}||yv|‚}x{~€~|||{zxwxyzzyx{|z{|€ƒ€}~|y{~|{}~ytz}|xux{~€|yxw{~}|{}ƒ‡‚}„‡||}„z~€€€~}…„ƒ‚„‡ƒ€ƒ…††‚~}{‚ˆ{|}…‚€~|€„~€€€€~}~€‚„€}~€‚ƒ~‚€~„}{€„€}~~}~}|€ƒ€}{z~}{y}€}z|~€|y}€}z{{}~~|{}~}zw|~|yw}ƒ|yw}‚€~{w{~€{w{€|wz}„}vy{‚|||||||{{zz{|zy{~zvy||}zxz{||||||}}}}~~}}~~€~~~~}||}}|{zx{~|z|}~~|{|||{||{{|}|{|}}}||~}{}~}~~~~~}}~~~}}}}~~|{|}|{|}}}|{||~}{{{}}{|}~~}}||~€€~}~~€‚}~~€~}}|{}~}||{{}~}}{z}~|yz{}~|||~~~}}~~}|}~~~}|}~~}}}}}~~~~}}~~~~}}}}~~~~}|}~~~}}~€€~~}}}}}|||||||{{{||||||}}}}}}~~~~~~~~~}}}}}}}}||{{zzzz|}€‚~zyy|~}|}~}|||~€€~~}}~~~~}}||{{{{|}|{{{{|||{{{{||||}}}}}~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~}}~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}||}}}}||||||||}}}}||}}||}}}}~~~~~~~~~~~~}}}}||||||||||||||||||}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}||||||}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}||||||||}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}~~}}}}}}}}~~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}~~~~}}}}}}}}}}}}}}||||||||}}}}}}}}}}}}~~~~}}}}}}~~~~~~}}}}}}}}~~~~~~~~}}}}}}~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}~~~~}}~~}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}~~}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}||||||||}}}}||}}}}}}}}}}}}}}~~}}~~~~~~~~~~}}~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~}}}}}}~~~~}}}}~~~~~~~~}}~~~~~~~~}}}}}}}}}}||||||||}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}||}}}}}}||||}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}||||||||||}}}}}}}}}}}}}}~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~~~~~~~~~~~}}}}}}~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~}}}}}}}}~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}||||}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}||||}}}}}}}}}}}}}}}}}}~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}~~}}}}}}}}}}||}}}}~~}}}}}}}}}}}}}}~~}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~}}}}}}}}||||||}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}||||||}}}}}}}}}}}}}}}}~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}||}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~}}}}}}}}}}}}}}}}}}}}}}~~~~}}}}}}}}}}}}~~}}}}}}}}}}}}}}}}}}}}}}}}~~}}}}}}}}}}}}}}}}}}~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}||||||}}}}}}}}}}}}}}~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}||||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}||||||||}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~}}}}}}~~}}}}}}~~~~~~~~}}~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~}}}}}}}}}}~~}}}}}}}}}}}}}}}}}}}}~~~~~~}}}}}}}}}}}}||||}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}||||}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}~~~~}}}}~~}}}}}}}}}}~~~~~~}}}}}}~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}||}}…š§¥¤’€qbhmy…ˆ‹ƒ|skmnv}€‚}yurtuy}~~{yyy{}~}|||||}~~~}|{{|}~€€€€€€}z{{}}|{zzz{|{{{z{{zz{{zyzz|}~~}{yz{}~}{z}~~}|||}}}}€~}|{}~€‚‚‚€‚‚‚€€€€}|||||}~~}~Ž¨²­¨œˆ€}z{|wrmhfehjlnoprsy‚„|tokmow‚…~xrlt{~~|zy{|}yvtx|~€|xyz|}~}{zz}~~{ywux{}~€|xxwxx{~€~||{}‚…ƒ}{z„……‚€{vz}€‚€~{xwwy{||}~zwuty}„ƒ‚~zyx|ƒ†ƒ€ztuvy|~|vqtvy{|~{xwvy{}~~{yz{||€„}|}~~~~~~~~~‚€€€€„†…„‚€ƒ„„„‚€~‚…„„‚€‚„…ƒ‚€~€ƒ………ƒ‚|~‚…„„€}||}}€}{|~}|||{{zyyyyyxxwvvuuusrrrpnoopqrsrqolkklmopppnljhjkmnnmkjiikloqsuxz}…‹“”•–—š¡¥©¬­®­¬ª¨§¦¥¤¢ œ™–“Ž‹ˆ„€{vtrqpppnmkjihijmosvxz}ƒ†ˆ‹’”•–—™š››™˜–”’ŽŽ‹ˆ„€|xvtsrqplifdcbaa``^\\\\\\\[ZZY[\^_`a_^[XURPONNKHEBA@AACEHJQWco“›£¤¥¦§®µº¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿»¸°¨ž”Š€rd\URONMKJE@@@@@@@EIPW]chmrw{‡–£©¯´¸»»»¸µ²¯­«ª©¦¤ž˜ˆvohc^ZVSPMJHFDCCCEGKOW_is}†“˜œ¡¦­³¹¿¿¿¿¿¿¿¿¿¾½¹¶²®©¤œ”Œ„zqib]XTPMJHFDCA@@@BEJNTY]adgiknquy|~}}yvqmhda^ZVOHD@@@@@@@@@@@@@@@Vk}—ž¡£©¯·¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿±¤“‚sdVHD@@@@@@@@@@@@@@@@@LWbmt{‡‘›¨µº¿¿¿¿¿¿¿¿¿¿¿¿¿½¼µ®§ –ŒrcTJ@@@@@@@@@@@@@@@@@JSewŠ¨³¹¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¹´®¨¢œ’ˆxhZLF@@@@@@@@@@@@@@@AAHOW_iry‚„ƒƒ„„†ˆˆˆ„€yri`THD@@@@@@@@@@@@@@@DG[o“§®µº¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿½¼¦|hXHD@@@@@@@@@@@@@@@@@@@N[k{‰—¡«³»½¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¸²© •Š}pdXL@@@@@@@@@@@@@@@@@DGS^kw…“¡¯·¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿·°˜€`@@@@@@@@@@@@@@@@@´¨˜ˆvdTDB@@@@@@@@@@@@@@@@@@@JSao«µ¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¹´¨œ„zph`XPH@@@@@@@@@@@@@@@GMV_is}†—£¯·¿¿¿¿¿¿¿¿¿¿¿¿¿¾¼º¸²¬ ”„tfXMBA@@ABDDDDDFGKOU[`ehknquy€‡Œ‘”—•”Œ‰‡…ƒ‚€ytnhb\XUQNLJHFDBA@@@@@BDGJOS[bks}†Ž•šž¡£¦©­±¶»½¿¿¿¿¿»¸²¬¦ š”Š…€|xtpmkihfeeeefghjloqtwz|ƒ…†‡‰Š‹‹ŒŒ‹‹‹Š‰‰‡†…„‚€~|{yxwvvutsrqponooppqqrsttvwyz|}ƒ…†‡ˆ‰Š‹ŽŽŒ‹‰ˆ‡†…„ƒ‚€~|{zzyxxxxxyyyyyyyyzz{{||||||||||}}}}}}}|||{{{zzzzyxxwvuuttsrqqpppppqrrssttuuvvwxz{}~€‚‚ƒƒ„„ƒƒ‚€€~~~}}}}||||||||||||}}}~ƒ„„……†‡‡ˆ‰‰Š‹ŒŽŽŽŒŒŠ‰ˆ‡…„‚€~|zywutsrqppoonnnnoopqstvwxyz{||}}~€‚ƒƒ„ƒƒƒƒ‚‚‚€€~~~~}}||||||||||||}}}}~~€€‚‚‚ƒƒƒƒƒƒ‚‚€~~}|{zxwvuttsrqpppooppqqrrsstuvwyz{|}~€‚ƒ„…………………„ƒƒ‚€€~}{zyxwwwwwwwwwwwwwwxy{|}~€‚ƒ…†‡ˆ‰Š‹ŒŒŽŽŽŽŒŒŠ‰ˆ‡…„ƒ‚€~}{zyxwvvuuuvvwwxxyyyyyyz{|}~€€€€€€€€€~~}|||{{zzyxwwvuuuuuuuuuuuvvwwxy{|~€‚‚ƒ„……††‡‡†††……„„ƒ‚‚€~}{zyxwwvvvuuuttttuuvwxyz{|}~~‚ƒ„………………………………„„ƒ‚€~}}|||{{zzyyxxxxxyyyyz{||}}~€‚ƒ„„……††††††……„„ƒ‚€~}}|{zzyxwvvuuuvvvvvvwwwwxyz{|}~€‚‚ƒƒƒ„„„„„„„ƒƒƒ‚€~}|{zyxwwvvvvvvvvvvwwxxyz|}~€‚‚ƒ„„……†††††……„ƒ‚‚€~}}{zyyxwvvvvvvvvvwwxyyz{|}~€€‚‚ƒ„„……„„„„ƒƒ‚‚‚‚€~~}|{zzyyyyyxxxxwwxxyyzz{||}~~€‚‚ƒƒ„„„ƒƒƒƒƒƒ‚‚‚‚€~}||{{{zzzzyyxxxxyyyzz{||}}~~€€€€€€€~~~~~}}}}}||{{zzzyzzzzzzzz{{{{{{|}~~€€‚‚‚‚€€~~}}||{{zzyyxxxxxxyyyyzz{{{||}~~€‚‚‚‚ƒƒƒƒƒƒƒ‚‚‚€~~}}|{{zzzzzzzzzzzzzz{{||}}~~~~€€€€€€€€€€€~}|||{{{{{{{{zzzz{{{{||}}~~€€€€€€€~}}||||||}}}}||||{{{{||}}}}}}}~~~~~~}}}}}}}}||||{zzzyyzzzz{{{{{{||}}~~€€‚‚‚‚‚‚€€€~~}}||||{{{{{zzzzzz{{{{||||}}}}}}~~€€€~~~~}}}|||||||{{{{{{{{{{{|||||}}}}~~~~~~€€€€€€€€€€~~}}}}}}||||||||||||||}}}}}}}}~~~~~~~~~~}}}}}}||||||{{{{{{{{{{{|||||}}}}~€€€€€€~~}|||{{{{zzzzzzzz{{{{{{||}}}}~~~~}}}}}}}}}}||||||||||||||||}}}}~~~~~~~~~~}}}}}}}}||||||~ƒ‡…„ƒ‚~{{{{{||}~~~}}|||}}}~~~~}}~~~~‚…ŠŽŒ‹‡„‚€€€€€€~|zxxyyzyyz{{|||}~€‚ƒ„„„ƒƒƒ„„„„………………††††…„†‡Š‘’‘ŽŒŒ‹‹ŠŠ‰ˆ‡†……†‡ŠŒŽ‹‰…‚}|{{{||||{{zyyxyy{}~‚…‡ˆ‡‡†…„„ƒ‚€}zywvuuuttvwwwxyxxwvutuuvwvvvvutttvwxy{|~~}|zyxvutsqpppppppqqrsuvvwxyyyxxxyyzz{{|||~€‚ƒ„†‡ˆ‰Š‹‹Œ‹‹Š‰‡†„ƒ€~|{zxvutssttuvwwxyyz{||}}}||zywvutsrpnljiikllljihhfecba`^\ZYWUTSSSUVWXZ[\\^_bdimrw‡‘š£«²¹¼¿¾¾º¶±¬¦ š”Š…€|xsnjfc`^\\\_bhmsy€‡Ž•šŸ£§©ªªª©©§¥¢ œ˜”Š…€|xtrponooqrtuwxyz{{||||{{yxurnjfb^[XUTRRRTUWXZ\^_``_^\[XVUTRPNMIFC@@@@@@@BCINU[iw‹Ÿ¯¿¿¿¿¿¿¿¿¿¿¿¿¿¼º©˜Ž„|tmf_XRLF@@@BCKSaoŸ¯·¿¿¿¿¿»¸®¥œ”†}yvrnjfb^[XXXZ\cir{…™£¨¬­­ª§¡œ•Ž‡€{vqmiea^ZVSQPPRTY^gow‹—Ÿ§¬±³µ´´±®ª¦£ §­¶¿¿¿¿¿·°˜€rdTDB@AALWbmv…‹ŒŒŽ’“–˜›š˜ˆzl\LF@@@@@@@FKU^cgghda^\ZYWVVVVVUTPLF@@@@@@@@@@@HOg_¿¿¿¿¿¿¿¿¿¿¿¿¿»¸¤„xph`XRLF@@@@@@@LWk“§³¿¿¿¿¿¿¿·°¢”Š€ztrponljgdb`]Z[\aemu€‹”£©©©¤ ˜‘ˆ€ztplkjiigfdb`^\[[[_biow‡—ž£§¨¨¦¤ œ˜”‘ŽŒŠˆ‡‰‹“›¥¯²´±®£˜‚uhb]XT]eimv…‹•””–—”’‘Œˆ„xph`THD@@@@@CENWakputtqnhb]XQJHGECBBA@@@@@@@AADGJMRW[_dis}ŽŸ¯¿¿¿¿¿¿¿¿¿¿¿½¼¢ˆubYQPOQSUWZ\\\]^cgq{ˆ•¢¯·¿¿¿¿¿¸²£”†xofc`bcgkosuwwwtrqopquy…Š”™šš–’‹„|uojhfghkmpsuvvvtrpoooruz†“™¡¢¢Ÿ˜”Œˆ…„ƒ›¥¯·¿¼¸´°”xphT@@@FK]ow›¡§¤¢˜”‹‡…„ƒ‚~zqh`XMBA@@@@@HO[gkoqsolf`XPMJKKNQTW[^___`^\ZXTPMJIHHHJKMOU[eoƒ—«¿¿¿¿¿¿¿¿¿¿¿¿¿§zdZPMJMOSW[_cfikosy‹—£¯·¿¿¿¿¿¹´¦˜Œ€thc^^^behkmoppnmkjjjnqw}„‹‘—›žœ˜”Žˆ‚}yusqppqqppomjhfdddhkqw†Ž•šŸ¡£¢¢Ÿœ˜”Œ’—Ÿ¦²½¶°®¬–€xp\HHIIIZks{‹›¡§«®§¡œ˜‰†„€|{ztnid[RKDB@@@DGQ[eou{}{xpib\YVVVXZ\^_`^]YVQMIFEDEEHKPUZ_dhkmprtux{ƒ‘Ÿ¯¿¿¿¿¿¿¿¿¿¿¿¯ ˆpbTPMQU]enw~…‡‰ˆ‡ˆ‰Œ•›£«°µ·¸´°¤˜Œ€rd]VUTX[bipw{€}{yxwy{ƒ‰“—˜™•’Œ†xsnkijjlnqsuvvvtsqponoptw{†’—˜™˜—“Œˆ‰Š‘—£¯¶¼¾¿·°¤˜„pg^WPW]cit‹—£Ÿœ–ˆ€ztnijjiijlhea]WQNKMNSW_flqtwusnib\XTRQSUZ_cgikihc^ZVROMLLMPTX[_bcccba```dgs›·»¿¿¿¿¿¿¿¿¿·°˜€mZTNPQX_isy‚€~}|~†–Ÿ©²·¼º¹°¨œ€pg^[XZ[agnuz€€~|xtrpqqv{ƒŠ‘—›Ÿžž™”Œ„|tnifdeegiklmmlkihggikpu|ƒŒ•œ£§«««§¤ž˜‘Š…€~}ˆ’§®µ°«¥ Œxl`UKNPX_o‹—¡«­¯§ ˜…zuqmikmlllmhd^XRLJGKNU[ckpux{wsmhaZVSQPQSVX[^`bbbaa_^]\\\]^^^^^^]]\[Z\]_aho§¿¿¿¿¿¿¿¿¿¿¿·°˜€th`Y[\bgow|‚ƒ€~„‰•œ£¦©¨¨¢œ’ˆ~tmfc`ceimtzƒ„…‚€}zwtsruw{…‹’“”’Š„~ytpmjihjklmnoppoooopqtw{†’—œ¡¢£¡ ›–Š…€|xz{‡’Ÿ«±¶µµª “†ud_[XVakrx„– £›”Žˆvspliloooqrnjfb[TQNOOSW^ejotxusold\XTPMNORUZ_cgijihd`ZTPLLKMOTY`fmsy‚„†ˆŒ›§³¿¿¿¿¿¿¿¿¿¿¿¯ €rd^XZ[cjry~ƒ…‡††„‚wljhiilnqtwy{|||{zyyz{}~„‡‰‹ŒŒŠ‰…‚}xtplhgeffhjmoswy{}€‚„…‡‰‹‘’””•“’‰…ƒ‚…ˆ•˜šŸ›˜“‡€{vrnpqsuz†’—˜˜–•Œˆ„zxvtrrsrqpojfc`[VUTUUX[_cgjmoppnmieb`^\\\\\^___``^][ZXVUTSRSTVWZ]`cgkosy‡ž­¶¿¿¿¿¿¿¿¿¿¿¿³¨šŒrkdb`ceimrvy{}‚…‡‹“—›Ÿ ¢¡ œ˜‘Š…€xpligfghkmqtwyz{{{zzzz{|~‚…ˆŠŒŽŽŽŒ‹‡„€|xtqnmlmmoqtwy{}ƒ„…†‡‡ˆ‰ŠŒŽŽŽŒŠˆ†‡ˆŒ—Ÿ¢¥©¬¦¡š‘ˆ„€xqppnmrwz}‚†††……~{xurqqppqrssrqnligc`_^]\^_bdhkmoqsrqonkigeca_^^]^^^^^^]\[ZYYYYYZZZ[\_adgms}‡‘›£«±·»¿¿¿¾½¹¶±¬¦ š•‘Šˆ…‚}zwspligeddfgjlptx|€„‡ŠŒŽŽŽŒŠˆ…ƒ‚‚‚ƒƒ„„ƒƒ‚~|{yxxwwwxxyyxxxxwwvuuuuuvvwxz{|}€‚ƒ…†‡‡‰ŠŠŠ‹‹‹Š‰‰‡†…„‚€~|zywutsrrtuy|€„†‡‡‡‡‡ˆ‰‹ŒŽŽ‘’’’‘‹‰†ƒ|xurpnljihgggffgggghhiiiiiijjklmnooppqqqqpppoonnnmmlllllkjjihfedcbaa`aaceimsy…Š“—™›Ÿ¡¢£¤¥¥¦§©ª«¬¬­¬¬ª¨¦¤ ™–“Œˆ…‚€~|zxvutrqqponmlkjihhhhhijlnprtvxz|~€‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒ‚‚€}|{{zyyyyyzz|}~‚‚ƒƒƒ„„„„„„„„„„ƒƒ‚‚€~~~ƒ‡Š‹Š‰ˆˆˆ‡‡‡‡‡‡‰ŠŒŽŒ‹‰‡„‚|zxvutsrrssssrqonmlkjihhhhhijlmnopppponmljihggghhhhiijkllllllkkjjjjkloqvz€…‰“•–˜™šš›››œž¡£¥§©«¬­¬¬ª¨¥¢žš–’ŽŠ‡…ƒ‚€~|{yxvtrpmjhfedddeegilnruwz|~€€€€€‚‚‚‚€~}||{{||}~~€€‚‚‚‚€~~}}}~~~~~~}}||||{{{{||}~‚…‰“””’ŽŒŒ‹ŠŠŠŠ‹‹Œ‹‹Š‰‡†ƒ~{xusqponmnnnnoonnmlkjiihhgffffghijkllmmmmlkkjiihhggffffghjklmnnmljiiilnsw{†‘•˜›Ÿ¡£££££¤¤¦§©ª«¬¬¬«ª§¤Ÿ›•Š„€|xtrponnnoooppqqqqqppppqqstvwy{}~€‚ƒ„„„„ƒƒ‚€€~~~}}}|{zyxwvuutttuuvvwxz{}~€‚„…†‡‡ˆˆˆ‡‡‡‡††……„„ƒ‚€~~}|{{|}~„‰‘”–••””’‹ˆ…‚€~}~€€€}{zxwvvuuvvwxxyxxvusrpnkigfdcccdefghijkkkkkjjiihhgfffffffedcb`^\[YXVUUUX[ckuŸ«·»¿¿¿¿¿¿¿¿¿¼¹²¬¦ œ˜•’ŽŠ†‚}xrlf`\XURSTX[agnuz†Œ“•–•”“‘Ž‹Š‡…}xtplhdb```bcfilosvxz|}~~€‚ƒ…†ˆŠŒŽŽŽŽŒŠˆ†„‚€~}||{{{{{{{{zyxwvutsssttuvxy{|~ƒ„…‰’—¢¦©«¬ª¨¤ œ˜’‡‚~zxvuttsssrqonljihgggghikmoqstuvwwwvutssrqqpoonmkjhgedba`_]\[ZYXXXXXXYYYZZZZZZYXXWY[agsŸ¯¿¿¿¿¿¿¿¿¿¿¿¹´ª ˜‘Œˆ†„‚~|wsmhd`[WVVY\dks{ƒ‹‘—šžžœ›˜•’ŽŒ‹‹ŠŠŠ‰‡†ƒ€{vqlhda^^^`bfinrvz}ƒƒƒ‚‚€‚‚„…‡ˆ‰Š‰‰‡†„‚€~}{{{||~ƒ…†††……ƒ~|zxwvvuuuvwxxyyyyyyzz{|~‡™£©¯µº¸¶³°¨ ˜‰‚~{wtuvuuvvtqonkhfdddgilorux{||{zxwusqpooopppqqppnlifc`^\[ZZZ[\^_`abbba`^\[YXXXXXYZ[[]_eku›©·»¿¿¿¿¿¿¿¿¿¸²© ˜‘Œˆ…‚}zxtpkgc`^\]^cgnu|ƒ‰“—˜™—–”’ŽŒŠ‰ˆˆˆ‡†„ƒ€}yuplhedcdehkosw{~ƒ…†††…„„ƒƒ‚‚‚‚‚‚€}{zxvtsrrssuwz}ƒ…†‡ˆˆˆ‡††„ƒ‚€€~}|{yxvusrqqqqrsuw{‡—Ÿ¦­±µ²°¬© ˜”Š…‚€|yz{yxwwtqomkiiijkmoqsuwxyxxvtrqonmmlllljihhfdcb`^]]\\]^_`aaaabcddfhiijjihfdb`^\ZY[]emz‡—§³¿¿¿¿¿¿¿¿¿¹´«¢œ–“Ž‹Š‡„~yrlgc`^__cgnuz†“””“’ŽŒ‹‹ŒŒŒŒŠˆ„€|xsnjfedefikorvy|~€‚‚ƒƒ…††‡‡‡…„‚€}{xvtsrrtuwy|~€‚„……………„„ƒƒƒƒƒƒ‚‚€~}{ywusrqpppqrtvy{}ƒ…‡Œ‘—¢§«¯°±®«¥ ˜‘Š„~yurpoooppppoonnmmmmnoqruwyz{|||zxwutrqpponnmljhfeca_]]\]^`acefghijkkkjjhfdc`^]\ZXXXWW]cmvƒŸ¯·¿¿¿¿¿¿¿¿¿·°¨¡œ˜”Š‡„€|vqlhd`^\^_cgnu|ƒ‰Ž‘”•–•”’‘ŽŽŽŽŽŽŒ‰‡ƒ€{vqlhecbccfiloswz}‚ƒ„„………†††‡‡‡‡†…ƒ‚€~{ywutssstuwy{}~ƒ„………„„„„ƒ‚€~}{zxwvutsssssuvxz|~€„†Œ‘˜Ÿ£§«¯®®ª¦Ÿ˜’†€{vspnmnnnooooonnmmmnooqsuwy{|}}}|zxwusqponnnnnmmmlkkihgfedcccccccccdddefgghhgfedb`]ZYWZ\dkuŽª·»¿¿¿¿¿¿¿»¸°¨¢œ—’ŒŠˆ„}ytpjea^]\^_ejqw~„‰Ž‘”•••”“’ŽŒŒ‹ŠŠˆ†ƒ€|yuqmjhgggijmorux{}€€€€€€€‚ƒƒƒƒƒ‚€~|{yxwwwwxy{}~ƒ„…„„ƒƒ‚€€~}|{{zyyxxwwwwwwwwxyz|}~‚ƒƒ„„„„„„……‰’—›Ÿ£¦¥¤ —’ˆ„€ztqnmmmnooppppppnmnnnopqstwyz{|}|{yxvtrqppppqqrsttttrqomkihggghikmoqstvwwxxxxwwwvuuttttttuvwy{}‚…‡‰‹‘’“”•••––––••••”“‘ŽŒŠˆ†„‚~}|{zzyyyyyzzzz{{{{||}}~~€€€€~~}}|{zzzyyyyyxxxxwvvuuuuuvvwxyz|}~€‚ƒƒ„„„……††††††……„„ƒƒ‚€~~}|{{zyz{}~ƒ‡‹“—™š™™—–“Œ‰†ƒ€~~~}|zxurpomlllllnopqrrqponmljhgfeddddefghijkllmmmmmmmmllkkjjkloqv{†‹’”•–––––––••••–—˜™›œ›š—”‘Ž‹ˆ†„‚€~~}}||{zyxwwutssrrssttvwxxyz{|||}}}}}}}}}}}}}}~€€~~~}}|||{{{{{{||||{{{zzzzzzz{{||}~€‚ƒƒƒƒ‚‚‚‚€€~~}}|{{zzzyyyxxxxyyzz{{||}}~~~~~~~~~~~~}}}}||||{{||}}}}~~€€€€€€€€~~~~~~ƒ†‰‹ŒŒŒŠ‰‰‰ˆˆ‡††……„……††††…„‚€~|yvtrqpoonnoopqqqpponnmnnooppqrtvxyz{|}~~~~~~~~~~~~~~~~~~~~}}|{{zzyyyyyyyz{{{||}}~~~~‚ƒƒ„…††††……„„ƒƒ‚€~~~}}||||{zyyxxxxxxyyyyzzzz{{||}}~~€€‚ƒƒ„„…†‡‡ˆˆ‰ŠŠ‹‹‹ŒŽŽŒ‹Š‰ˆˆ‡†…„ƒ‚€~}|{zyxwwvvuuttttttuuuvvwwwxxxxxxwwwwwwwwvvvvvvuuuutttttttuuuvvwwwwxxxxxxxxwwvvutsrqqponmlljiiijknquy|ƒ†ˆŠŒ’“”•—˜š›Ÿ¡¢¢¢¡ žš˜”‘ŽŒŠˆ†„ƒ‚€~}|{yxvtsqpnmlkkklmnoqsuvxyz{}~€‚ƒ„„……†‡‡‡††…„ƒ‚€~}{zyxxxxxxxyyyyzzzz{{||}}}~~€€€€€~~~~~}}}||||{{{{{{{{{{zz{{{{||}}~~€€‚‚‚‚ƒ„ƒƒƒ‚~|{yxwvuuttttttuuuutsrqqpppooooppqrssttuuvvwwwwwwxxyyz{||||}}||||||{{{{{{{{{{zzzzzyyyxxxxxxxxyyyyz{||}}~€‚ƒ„„……†‡‡‡‡‡ˆˆˆˆ‰‰‰‰‰‰‰‰ˆˆ‡‡†††……………„„ƒƒ‚‚€€~}||{zzyyyzzzz{{{||}~~‚‚ƒ„…††ˆ‰ŠŠ‹‹ŠŠŠŠŠ‰‰‰ˆ‡‡‡†…„„ƒ‚€~}|{zyxwvvuuuttssrrrqqqppppppppppooppppppqqqqqqrrrrrrrrrrqqqqqqppppoooooooonnnnpqtw{~‚…ˆŠŒ‘“”•–——™š›œžŸŸŸŸž›™–”‘Ž‹ˆ†„ƒ‚€~}|{zxwvusrqponnnooqrstuvxyzz{|}}~~€‚‚ƒƒƒƒƒƒƒ‚€~}||{zzzyyyyzz{{{{||||||}}~~€€€€€€~~~~~~~~}}}}||||||{{{{{{{{{{{{{{||||||}}}}}}~~~~~~~~~~~~~~ƒ‡Š‹Œ‹‹Š‰‰‰‰‰‰ˆˆˆˆˆˆˆˆˆ‡‡…„‚€~|yvtrqpooooooppppppooooooppqrstvwy{|}~~~~~~~~~~~}}|||{zzyxwwvuutttuuvwwwxxyyzz{{||}}~~€€€€€€€~~~~}}}}}}}}}}||||||}}~€€‚ƒ„„…††‡‡ˆˆ‰‰‰‰‰‰‰‰‰‰‰‰ˆˆ‡‡††……„ƒ‚‚€~}}||{{zzzzzyyxxyyyyzz{|||}}}}~~‚„‡‰‹ŒŒŒ‹‹ŠŠŠ‰‰‰‰‰ˆˆˆˆˆˆˆ‡†…„‚€~|zxwwvuutttttssqponmmlkkjjjjjklmnnooooooooppqrrssttuuvwwwwwwvvuuuuutttsssstvwz|ƒ„†‡ˆ‰ŠŒ‘’”•–—˜™™™˜˜–•“‘ŽŒŠ‰ˆ†…„ƒ‚€€~}{zyxvuttsrrrrrstuvwwxxyyz{|}~€‚‚‚‚‚‚‚€€~}||{{zzzzzzyyzzzz{{||}}~~€‚‚‚‚ƒƒƒƒ‚‚‚‚€€€€~~}|{{zzzzyyyxxxxxyyyyzz{{{|||}}~€‚‚‚‚€€€~~~}}||{{zzzzyyyxxyyyyzz{{{|||}}}}~~€€€€€€€~~~}}||||{{{{{{{{{{||}}}}}}}}~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~ƒ‡Š‹ŒŒŒ‹Š‰‰ˆˆ‡‡‡‡‡†††……„„‚€~|zywusrqqrrssstttttsrrqrrssttuvwwxyz{{{{{{{zzzyyyzzzzyyyyxxxxxwwvvvvvvvvvwwwwwwwwvvuuuuvvwwxy{|}~‚ƒ„…††‡ˆˆ‰‰Š‹ŒŒŽŽŒŒ‹ŠŠ‰ˆ‡†……„„„ƒƒ‚‚‚€€~}}||{{{{{{{{{{{{{{{{{{{{{{||||||||}}}}}}~~~~~~}}~~~~~~}}}}}}~~~~~~}}}}~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~‚…‡‡‡‡†††……††…„………………†††…„„‚€~}{zxwwwwwwwwwwwvvutssrrrrrrsstuvvwwvvvvvvvuuuuuuvvvwwwwwwwwxxyyyyyyyyyyyyyzzz{{{{{{zzzzzzzz{{|||}}~€‚ƒ„…††‡‡ˆˆˆ‰ŠŠŠŠ‹‹‹‹‹‹‹‹ŠŠŠ‰ˆˆ‡†…„ƒ‚‚€€~~}||{{zzzyyyyxxxxyyyyzz{{{||}}}~~€€€~~~}}}||{{{{{{||}}}}}}}}}}~~€€€€€ƒ…‡ˆˆ‡‡†††††††…††…………………„„ƒ‚~}|{zyyxxxwwwvvutssrqqqqqqqqqqqrrssrrrrqqqqrrssuvwwxxxxxxxwwwvvuuvvwwwwwwvvuttsttuvxz|~ƒ…†ˆ‰Š‹Ž‘’““““““‘ŽŒŠ‰ˆ†…ƒ‚€~}||{zyxxxwvvvvvwwwwxxyyzz{{|}}~~€€‚‚€€~~}}||||{{{zzzzyyyzzzzz{||}}}}~~€€€€€~~~~}}||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~€‚…‡ˆ‰ˆˆ‡†††††…………………†††††…„ƒ€€~}|{zzzzzzzzyxwwvusrqqppppppooopppppppppqqrstuvwxyyz{{||||}}}}}}}}}}|||{{zzyyxxxwvvvvvvvwwxxyz{|~‚ƒ„…†‡‡ˆ‰‰Š‹‹ŒŽŽŽŽŒ‹‰ˆ‡‡†…„„ƒ‚€€~}|{{zyxxxxxxyyyyzz{{{{||||}}}}~~~~~~}}}}~~}}}}||||||||||{{{{||||||||}}}}~~~~~~~~~~~~~~~~}}}}}}~‚ƒ„……„„„„…………†‡‡‡ˆˆˆˆˆˆ‡‡…„ƒ‚€~}{zyyxxwvvuttrqppnmllllllllmmnopqrrssssssttuvwxyz{||||||||{{{||||{{{{zzzzyxxwwwwwyz|}~‚ƒ„…†‡‡ˆ‰Š‹ŒŽŽŽ‹Š‰ˆ†…„ƒ‚‚€~}}||{{zzyxxxwwxxyyzz{{||}}}~~~€€€€€€€€~~~~~}}|||{{zzzzzz{{zz{{||}}~~€‚‚‚‚€€~~}|{zyyzzzzzzzzzzzz{{{{|||}}}~~‚„†‰‹ŒŒ‹‹ŠŠ‰ˆˆˆ‡‡ˆˆ‡‡‡‡‡‡††…„‚€~|zywvvvvvvvvuutssqponmmmmnnoooppqqrrrsstuuuvvwwxyyzzzzzzzzzzz{{{{||||{{{zzyyyzzzzzzzz{|}}~€‚ƒƒ„„…††‡‡ˆ‰Š‹‹‹ŒŒŒŒ‹‹‹Š‰ˆ‡‡†…„„ƒ‚€€~}|{zzyyxxxxxxxxyyyzz{{||}}}~~€€€€€€€€€€€€€€~~~}}}||||||||||||||||||||}}}}~~~~~~~~~~~~}}}}~~~~ƒ…‡‰ŠŠŠ‰ˆˆˆ‡‡‡‡ˆˆ‰‰‰‰ŠŠŠŠ‰ˆ†„‚~}|{zyxxwwvuutsqponlkkkkkllllmmnoppppqqrstuvwxyz{||}}}}}}}}||||||||||{{zyyxxwwvvuvvvwxyz{|}~~€‚ƒ„…††‡‡ˆ‰Š‹ŒŽŽŽŽŒ‹‹Š‰ˆˆ‡‡†…„„ƒ‚€€~}||{zzyyyxxyyzz{{||}}~~€‚‚‚‚€€~}||{{zzzzzyyyyyyyyyzzz{{||}~~€‚‚‚‚‚‚‚ƒƒƒƒƒƒ‚€€€€~~}}}}}}}}}}~~~~€€€€€€€~~}}||{zyyxwvvuuuuuuuuuuuuuuuuuvvwxxyyzz{{{{{{{{{{{{||}}}}||||||{{||||||{{{{{{{{{{{{{{||||}}}}}}~~~~~~~~€€‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ„„……††…………„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚€€€€€~~}}||||{{{{{{zzzyyyzzzzzzyyyyxxwwwwxxxxxxyyyyyyxxxxxxxxyyyyzzzz{{||}}}}}}}}}}||}}}}~~~~~~~}}||}}~~~~}}||{{{{{{{{||||}}}}}}~~~~}}}}~€€‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€~~~}}~~~~~~~~~~~}}}||||||{{||}}||||||||}}~~€€€€€~~}|||{{{{zzyyxxwvvuvvvvwwwwwwxxxxyyyzzz{{||||}}}}}}}}}}~~~~~~}}}}}||}}}}||||||}}||||{{{{{{{{{{||||}}}}}}}}}}~~€‚‚‚‚‚‚‚‚ƒƒƒ„„„„„ƒƒƒƒƒƒƒƒƒƒƒ‚‚€~~~}}}}}}}}}}}}}}}}}||||||||}}~~~~~~~~}||{{zzzyyyyyyyyyyzzzzzzzz{{{{{{||||||||||||||||}}}}}}}}||||||||||}}}}|||||||||{||||}~€‚‚ƒƒ‚‚€€€€~~}}||{{zzzyyyyy|~~~~~~~~~~}}}}}}}}}}~~€‚‚‚‚€€€~}}||{{{{{{{||||||||}}}}||||{{zzzzzzzzzzzzzz{{{{||||{{zz{{{{{{{{{zzzzz{|}}~~€‚‚‚‚‚‚‚‚‚‚‚€€~}}||{{{{zzzzzzzzzzzzzzzzzz{{||}~€€€~~~}}}|||||||}}}~€€‚ƒƒ„„„„„„„ƒƒƒ‚‚‚‚€€€~~~~~~}|{{zzzzzz{{||}~‚ƒ„……„„„„ƒ‚‚€€~}|{zyyxxxxxxxxwwvvvvvvvwxxyyz{{{{zyyxwwvwwxyz{|}~~~~~}}}}}}}|||||{zzyxwvuuuuvwxy{|}~€‚‚‚‚ƒƒ„„ƒƒ‚~}|{zyyzz{{{{||||{{{{||}~€ƒ„……†‡ˆˆˆˆ‡‡‡‡‡‡‡‡††……ƒ‚€~~}}}}}}}||{zzyyyyyz{|}~€€‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒ‚€~~~~€€€~~}|zyxxwvwwwwxyz{||||||{{||||||}}}}~~}}}|||{{zzzyxxwvvvvvwwxxyyzzzz{{}~‚‚‚€~~}~€€€~~|{yxwwvvvvwwwxwwwvvvwwwxyy{|~‚ƒ„„„ƒ‚€~}}~~~~~}|{zyyxxyy{|~€‚ƒƒ„„„„„……†‡ˆ‰Š‹‹‹ŠŠˆ‡…ƒ~}}|||}}}}}}}}}}}}~~~~}|{zyyxxyyz{}~~~~}}}||{zyxxxxxyyyzzzzzyyxwutsrsstuwy{}‚‚‚€€~}}~‚„…„„ƒ‚€~|zywwvwxz{}~€€~|zyxwwwxyz{||||{{{zyyxxxxyyyyzz{{{{|}~€‚ƒ„…††‡‡‡‡†…„ƒ‚€~~~~~~~~~~~€‚‚ƒ„„„ƒƒ‚‚€~~}}|||||}}~~}}}}~~~~€‚ƒƒƒƒ‚€~}|{{zzzzzzzzzzzzzz{{{{{{{{zzzz{{{{{zzzyyyyyyzzzzyyxxwvuutttuwx{}€ƒ…‡‡‡‡†…„‚~}|{{zzzzzzzzzz{{|}}~~~~~~}}|||{{{{||}}~~~~€€€€~}|{zyxwwvwwyz{|~‚ƒ„„„„„„„„„„„…………„„‚€~}}}~~‚‚‚‚€€ƒ„…††…„ƒ€~|{{{{|}~€€€~}{zyxwwxxyz{|}}}}||{zzzzz{{{{zzyxwvuuuuvwxz{}~~~}}||||||||}}~~~~}|zyxxxxyz|}~€€}|{zzyzz|}‚€~}|{zzz{{|}}}||{{zyyyxxwwxxz{|}~~}|||}~€‚„…‡ˆˆˆˆ‡†……„„ƒ„„ƒƒ€}||{zzyzz{{{{||}}~~~~~~€‚‚‚‚ƒƒƒƒ‚‚‚€€€‚‚‚€€€~~~~}}}||{{zzzyzz{{{{{{||}}||||{{zzyxxwwwwwwwxxyyxxwvuttttuwxz|~~}}}~~‚‚‚‚‚‚‚‚‚€€~}||||||}}||||{{{|}~~~|{yxvuvvwxz{}~€€€~~}~~€‚…‡‰‹ŒŒŠ‰†„€}{xxwxxyyzz{{{{||}}~€‚ƒ„…………„ƒ‚€€€€‚ƒƒ„„„„„ƒ‚€~}}||}}}~~~~~}}||}}~‚ƒ„„„ƒ‚€}|zyyxxxxxyzzzzz{{{{{{{|}~€€€~{yvtrpooqsuvxy{|||{zzyzz{{|}~ƒƒƒ‚‚€~~}~~€‚‚‚€€€~}|{{zzz{{|}~€€€~}{zyyzz|}~~~}|{zzz{{|}~~~}||zxwvuuvwz|‚…‡ˆ‰ˆˆ†„‚€ƒ…†††„‚€~}|{{}~‚„„„ƒ‚€}}}~‚„…†††…„‚€~}~~€€~~}|{{{{{{|}}~€€~|{zyyyyyzz{{||||||{{zyxxxxxxxxxxwvuuttssttvwy{|}}}}|{{zzz{||~€€€€€€‚ƒ„„ƒƒ€~|{yxxxxyz{|}~€‚ƒ„„ƒƒ‚‚€~|{zzzzzyyyyzz{{||}~€‚‚ƒ„………„„‚€~~~€‚€~}}|||{{zzzzzz|}~ƒ…†ˆ‰Š‹‹‹‹‹Š‰‰ˆ‡†„ƒ€}{yxxxyz|}~~~~}}||||||||}}}~}}||zyyxxxyyyzzzzzzyxxwvutssstuuvvwwxxxyz{}~€‚‚‚‚~}|||||}}}}}}}}~ƒ„†‡ˆˆˆ‡†…„‚€~}|||}}~~~}}~~~~~~~}}|{{zzyyxxxxyz{|~~~|{zyyyzz{|~ƒ„„ƒƒ€~|{z{|}€€€€€€€€~~}}}||{zzzzzzz{{}€‚‚‚€€~}||}}~~~~~~~~~~~}~~‚ƒ„……„ƒ€~}||{zyxyy{|}~~~}}{zyyz{}€€€~~|{zyyyyyz{||}}~~~}}|||||}~€‚‚‚€~|zxwvwwxy{|}€€€~~~~‚ƒƒ€~}}|}~€ƒ………„ƒ|yvtrssuw{‚…†ˆˆˆ‡‡†…ƒ‚€~}||||{{zywvutuuwy|ƒ„…„ƒ€~}||{|||||||||||{{{zz{{{{{{||{zyyxxyy|~ƒ…‡‡‡†…ƒ~}|{zyyxxvuutttttvwy{}‚„………ƒ‚€~~~~}|zxwvvuuuvwxy{}}~}}|{zyyyz{|}~€‚ƒ‚‚‚€~~}}}}}}||{z{{|}~ƒ†‰Š‹ŒŒ‹‰‡„}{zyxxxxxyyyyxxyz|}€‚…‡ˆˆ‡†ƒ~|zxwwxy{|}~~}}|||{{{{{||}~€€€€€}|{yxwvvvwxyz{|}~~~~}}}}}}~~€‚ƒ‚‚€~}{zzzz{||}}|{zxxwxy{|}~}|{zyyz{|}~~€€~}|{{{{{{|}~~~~}|{{{{|}~‚ƒ„ƒƒ‚‚€€~~~~~}{yxvutttvwy{|}~‚ƒ„……††……„„‚~}|zxvuttuuwx{}€‚ƒ„ƒ‚€}|zxxwxxz{|||{zzyxyz|~„†ˆ‰‰ˆ‡…ƒ~}}}~‚‚‚‚‚€~~}~€‚‚‚€}{xurppprtwz}‚‚‚€~}}~~~~~~}}|{zyyyz{||}~~}}||{{{{|}~~€€‚ƒƒ‚‚~}|zyyyzz{{||}}~~~~€€‚ƒƒƒ‚‚€~}|{{|}~‚‚‚€~}|{||~ƒ„…††…„ƒ‚~|{z{{|}~~~~|{xvutttvwz}~~~}}}}~ƒ„††‡‡‡††…„‚€~~}|{zyyzz{{||||{{{{{{||||{zyxyyz{}€€€€‚€~|{zyyyyz{|}}~~~~}|||}}~‚ƒƒƒƒ‚€~}||||||||||||{zzyyyyyzzz{{{{{zyyyxxxxyz|}~€€€€~~}|||}}}}~€€€~~}}}}~~~~~}}}}||||}}~~€€‚ƒ„……††††…„„‚}|{zyxxxxxxyyyyzz{|~€‚‚‚€~}|||}}~€€€~}|{{zyyyxxxxxxxxyyyyyyzz{{|}~~~~~~~~~~~~~}}}||||}}~~~~~~}}~~~}}||}}~~}|{zyyyyyz{{||}}}}~~ƒ„„„„ƒƒ‚€~~}}|||{{{||}}}}}}|||{{{|||}}}||{zyyxxxxz{}~€€€~}|{zzz{{|}~~}|{zyyz{}ƒ„………ƒ€~}}}}~€‚‚€~~~~}}~~~~}|{zzz{|~ƒ„„„„ƒ‚€€~~~~~~}|{zyxwwwvvvvwwxxz{}€‚ƒƒƒƒƒƒƒƒƒƒƒ‚‚~|{zyxxxxyyz{||||||||}}~‚„……†…„ƒ€~}|||~‚ƒƒ‚‚€~}}}~~€€€€€~}|{zzz{{|}~~~}}}||||||}}~€€€€€€‚‚€~}{zzyyyzz{{{{zzzzzz{{{|||}}~€‚ƒƒƒ‚~}|zyyyyyyyyyyyyyzz{|||}~~}|||||}~€€€€€~}||{{zzzz{{{{zzzz{|}~€€€~~}~~~~~~~~~}}}~~~~}}}}~~~~}|{{zyyyzz{|}~~~~}}}}}~~~~~~~~}}}}}}}}~~~~~}}}~~~~~}}}}}}}~~€€~~~~€€~}}}|||||}~‚‚‚‚‚€~}}|}}~€€€~}|{{{{|}~€€~}}||{{{{{{{{{z{{{||}}}~~€‚ƒƒ„„„„ƒ‚€~~}}||{zzyzz{{||||||{{zyyyzz|}~‚‚€€~€€}|zxwvuuvwxyzzzzzyyxxwxxyz{|}~~~~~~~~~€€~}|{{zzz{{{{zzyyxxyyzz{|}}~~}}}}}~‚ƒƒƒƒ‚~}}}}~‚~}|{z{{|}~~}|{zyyyyz{{|}~~~~}}||||}}~ƒ„„„„„„ƒ‚€€€€€€€~}{zyxxxz{|}}}||{zzyz{||}~~~~~}}||||||}}~~~}|{zyxxwxxyz{|}}~~~~}}}}}}~~~~}|zyzz|}‚ƒ„„ƒ‚€~}||{{{{{||}}}}~~~~~~~~~€‚‚‚‚€~}}}~~€€€~~~}}}}||||{{{{||}}}}}}}}}}}}}}~€€~~}}}~~€€€~~~~~~}|{zzz{|}}}~~~~~}}}}}}}}||||||||||}}}~~~~~}}||{{zz{{{|||}}||||{{zzzzzz{|}}}}~~~~}||{{zyyyyyz{{}~€€€€€‚‚ƒƒ‚‚€~~~~~~~}||{zzzzz{{||||||||}}~€‚ƒ‚‚€~}||||||||||||{{zz{{||}~~~}|{zyyyz{|~€€€~~}||{{{|||||||||{{{{{{{|}~~~~}|{zyyzzz{{||}}~~~~~~~€‚ƒ„„„„‚€€~}}}}|||{{{{{{|||}}~~~~~}}|{{zzyyzz|}~ƒ„„ƒƒ€~}}||}}~~~~}}|{{{{|||}~~~}}}}}}}}~~~~}}}}}}||||||||||}}~€€~}||{{{{|}~~~}|{{{}~€‚ƒƒƒ‚€~}~~~~€€€€€~~}}}~~~~}|{zyxyyyzz{||}}~€‚ƒƒƒ‚€€€€€~}{zyxwvwwyz|}~~~~}}}}~€€}|zyyyyz{|}~~~~~~}~~~~}}|||||{|||}}}|||{{{zz{{|}~€‚‚€€~}||||||||||{{{{{||}~~}}}}~ƒ„„„„ƒ‚€€~}}|||||}}}}}|{{zzz{|}€€€~~}}~€€‚‚‚‚€€€~}||{{{zzzzzzyyyyyz{{||}}}}}||||||||||}~€‚‚€}|||||}}}~}}}||{{{|}~~€€€€~}}}}}||||{{{{{{||||||{{{{{{||}}}}||||}}}}~~~~~~~~~}}} \ No newline at end of file diff --git a/data/tbash.tb1 b/data/tbash.tb1 index 6dc2071e990cfc16e6e9ad0fc511f113191debdf..6a1b9fd14d9b19245c570123bc0ed52eedf82847 100644 GIT binary patch literal 9681 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 Nn40+a;h*s5{{T&Qt}6fl literal 11709 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 diff --git a/data/tbaship.tb1 b/data/tbaship.tb1 index 339a6a8275bfa4d27d3119c61b6f31dd76d66112..f6d2512872f01235b17259269ef58fc31a97c127 100644 GIT binary patch literal 7266 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 NjQ@xJFCX^v{{qy639kSE literal 9453 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 diff --git a/data/tbbonk.raw b/data/tbbonk.raw new file mode 100644 index 0000000..2a313d6 --- /dev/null +++ b/data/tbbonk.raw @@ -0,0 +1 @@ +vvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvvvxxxxzz||zzxxxxxxzzzzzzxxxxvvvvttttttvvxxxxvvvvttttttvvvvxxzzzzzzzzzzxxxxxxxxxxvvvvvvttttttttvvvvxxxxxxxxvtttttrrrrrrrrrrpppprrttttvvxxzzzzxvttrrrrrrrrttvvxxzzzz||~~„ŠŽ’”””’ŒŠ„€zvplhdb`bbdfjnrvz~€‚€~~~|zvtrpnlllnprtxz||~~||zzxvtrnlllllnnprrrttttvvxxzzxxxxxxvvtrnljhjjllnnprrrttttz~–¬®°¨ œ˜”’ŽŒˆ†„‚rb`^````bbddffpz€„‚‚~|xtpnpptvz~ˆ”˜”’ŽŒˆ†‚€thb^````bbddjnv~†ŽŒŠ„€ztpljhjjlnrtxz||||xvrpljhfffhhlnrtxz|~~~||zzxxvtttvvvvvvttrrppnljjjjlnprtvxx|~‚†’ž¢¦ œ˜”ŽŒŠ†„‚€vld^^^``bbbbfjpvz|zzvtrprrtvz~†Ž”˜”’ŽŒŠˆ€zpfb^``bbbbfjrz€†ŠŒŠˆ„€ztplhfhjlnrvz~‚„‚‚~|xtplhfddffhjnrvz|~~~~~|zxvvvvvxxzzzzzzxvrpljhhjjlnrtxz|~~~~~|zvtrrtt~†’žœœ˜”ŽŒŠ†„‚‚vld^^^``bbddltx|zzvtrpnlprvz€†Œ’”–’ŒŠ„€xphb````dflrx~‚„†ˆ„€|zrljhfdhjnrx|€‚†ˆ†„€~xtplhdddfhlnrtxz||||zzxvttttvvxz||||||zxtrnljjjjllprtvz|||||zzvtrptvz~Žž  š–’ŒŠˆ†„‚xph`^^``bbfjptvvtrpnljllprx~†Œ’˜––’ŒŠ‚|tlhdbbddhlptxz||zzxxvvtrrrrrtvxxz|zzzzxvttrppppprrrrttrrrrrrrrrrtvxxz|||~~~~||zxvtrpnnllnnnnprttttttttttttttxz|~Žœ ¢œ˜”’ŽŒˆ†„‚|xnd`^^^bdhlnpppnljjjjllptz~†Œ”––’Š„€|xtplllnnprttttrrpnllnnprvx|~‚„‚‚€€|zvtpnllllprtvxzzzzzvtrpnljjllprtvz|~~€€~~|zvtrrrrrrttvvttttrrpnlljjlnpprtx|‚†’œ ¤žš–”ŒŠˆ†„€~vphbddfhhhjjjjhfffffhjnrx|‚†ŠŒ’ŽŠ†‚~|zxvttttttttttrpljjjjjlnrtx|~~~~~~||zxtrrrpprtvvxzzzzzvtrpnljjjjlnrtxz||~~~~||zxvvttttttttttttrrppnlllllllnprtx|„Š”œ ¤žš–’ŽŒŠˆ†„€~tljjlljjlllljjfdddddhjnptvz~„ŠŠŠˆˆ†„€~||zzxvxxzzxxvvttrpnlllnnprtvxxzz||zzxxvtttrrttvxzzzzzzxvttrpnlllnnprttvvxzzzzzxxxxvvttvvvvvvttttrrppnnllllnnprtvz~†Ž–ž  œ˜”ŒŠˆ†‚€xpnnppnnpprrpnljfdddffhjllptz~€‚‚‚€€€€~~||zz||||||||zzvtrpnljjllnprtx|~~~~|zxxvtrppprrttvxzz|~||zxvtrpnlllnnprtvxzzzzzzzxvvvttttttvvvvvvttrrppnnllnnpprrvx|~†Ž–œž š–’Œˆ†„~zvrttttrrttrrppljfdddffhhjlprvz||||zz||||zzzz|~~~~~~~||zxvtrppppprrttxzzzzzxxvvttrrpprrttvvxz||zzxxvtrrrrpppprrttvvvvxxvvttttttttttvvxxxxxxvvttrrrrpppprrrrttvvz|‚†Œ’–š–”ŽŠŠŠŠŠ„€|xzzxxvtttrrppnljhhhjjhhjjllprttttttxzzzzz||~~~~~~~~||zzxxvvvvttttvvvvxzxxvvttrrpprrrrttvvxzzzzzzzxxvvttrrrrrrttttvvvvvvttttttttttttvvvvvvvvttttttrrrrrrrrrrttttxz|~ˆ”–’ŒŠŒŒŒŒ†‚~|||zxvtttttrrpnljjjjjhhffhjlnprpprtvxzzzzzz||~~~~~~~~||||zzzzxxvvttttttttvvvvvvttttttttttvvvvvvxxxxvvvvttttttttttttttvvvvvvttttttttttttttttttttttttttttttttttttrrrrttxz€†Œ’ŒˆŠŠŽŒˆ‚~||zzxvttttttrrppnllljjhhffjlnnnnpprtvvxxzzzz||||||||||||||zzzzzzxxvvvvvvvvvvxxvvttttttttttttttvvvvxxxxvvvvttttttttttvvvvvvttttttttttttttttttvvvvvvvvvvvvttttttttttttttttvvz|‚†ŠŒˆ†„‚†ŠŠŠ†‚€~||zzxxxxvvttttrpnnppnljjjjlnnnllnprrttvvvvxxzzzzzzzz||||||zzzzzzxxxxvvvvvvvvxxxxxxvvvvvvvvttttvvvvvvvvvvttttttttttttttvvvvvvvvvvvvvvttttttttttttvvvvvvttttttttttttttttttxz€„†ˆ„‚€~‚†ˆˆ„‚€~~~||||zzxxxxvvtrpprrppnlnnpppppppprrttttttttvvxzxxxxzzzzzzzzzzzzzzzzxxxxxxxxvvxzzzxxvvvvxxvvttttttttttttvvvvvvttttttttttvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvttttttttttttttttvvxz|~‚„‚€~~€‚„„€~||||||||zzxxxxxxvtrrrrrrpppppppppprrrrrrttttttvvxxxxvvxxzzzzzzzzzzzzzzxxzzxxxxxxxxxxxxzzzzzzxxvvvvvvttttttttttttttvvvvttttttttttvvvvvvvvvvvvvvvvvvvvvvvvttttttttttttttttvvxz|~~~||~~€‚‚‚€~||||||||zzxxxxxxvtttrrrrrrrrpprrrrrrrrttttttttvvvvvvvvxxxxzzzzzzzzzzzzzzxxzzzzzzxxxxxxxxvvvvvvvvvvvvvvvvvvvvvvvvvvttttvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvttvvttvvvvxz||||||||~~~~||||zz||||zzxxxxvvttttrrrrrrrrrrrrrrrrttttttttvvvvvvxxxxxxzzzzzzxxzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxvvvvvvvvvvvvvvvvvvvvvvttvvvvvvvvvvvvvvvvvvvvvvttttvvvvvvvvttvvvvvvvvvvxxzz||||zz||||||zzzzzzzzzzxxvvxxvvvvttttttttttttttttttttttttvvvvvvvvvvvvvvxxxxxxxxxxxxxxxxxxxxxxxxxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxxxxxxxvvxxxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxxxxxvvxxvvvvxxvvxxxxvvvvvvxxxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvxxxxxxxxxxxxxxxxvvxxxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvxxxxxxxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvxxxxxxxxxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvxxvvvvvvvvvvvvvvvvvvvvxxxxxxvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvxxvvxxxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvxxxxxxvvvvvvvvxxz|~~~~||xvrnjhfdfhnrvz|~‚„‚€|zvtrppprrtvz~‚„„„‚€|xtpljllllptxz|~~~~~|zvtrpnlnnprvz||~~~~|zxvttttttvxzzzzxxvtrrrrttttvvxzzzzzxxvvttttvvxxzzzzzzxxvvvvttvvxxzzzzxxxxvvttttvvvvxxxxxxxxvvvvvvvvvvvvxxxxxxxxvvvvvvvvvvxxxxxxvvvvvvvvvvvvxxvvxxvvvvvvvvvvxxxxvvxxvvvvvvvvvvxxxxxxxxvvvvvvttvvvvxxxxxxxxvvvvvvvvvvxxxxvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvxxxxxxxxvvvvvvxxvvxxvvvvvvvvvvvvvvxxxxvvvvvvvvvvvvvvxxxxxxxxvvvvvvvvvvvvvvxxvvvvvvvvvvvvxxxxxxvvvvvvvvvvxxvvxxxxxxvvvvvvvvvvvvvvvvvvvvvvvvxxxxxxvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvxxxxxxvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvxxxxvvvvvvvvxxxxxxxxxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvxxxxxxxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvxxvvvvvvxxvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxxxzzzzzzxvvvvvttttvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvxxxxxxxxxxxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxxxxxxxxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvxxxxvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv \ No newline at end of file diff --git a/data/tbcc.raw b/data/tbcc.raw new file mode 100644 index 0000000..d9a6cd3 --- /dev/null +++ b/data/tbcc.raw @@ -0,0 +1 @@ +{{{{{||{{{{{{{{{{{{{{{{||||{{{{||{{{{{{{{{{{{{{{{{{||{{{{{{{{{{{{{{{{{{{{{{||{{{{||{{{{||||{{||{{{{||{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{{{{||{{{{||{{{{{{{{{{{{{{{{{{||{{{{{{{{{{{{{{{{||{{||{{{{{{{{{{{{{{{{{{||{{{{{{{{{{||{{{{{{{{{{{{{{{{||{{{{||{{{{||||{{{{{{{{{{{{{{{{||{{{{{{{{||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{{{{||||{{{{{{{{||{{{{||||{{||||{{{{{{{{||{{||||{{{{||{{{{{{||{{||}}~ƒ‡ƒ}|ywvvwwvv{|z{{xuvwtruxwwxxyzzz{|zy{|zy{|{z|}|{{{zz{{|}|{|}}}~~}}}}||{z|}||}~}}||||||zy{}|{}~}|}}~~}|}}zx{}{yzz{|{z|}|{{{zz}|z{{yxyy{}{y{}zx{}yvz~{x|zvz~|z{{||zy|zvy{zz|~|z|}||}~€zuy|wsw{ywy{yw{zuz}{|||x}{v|‚~z{{zyz{wtzzux{yx|wptxyy|~~~}}}}unv}vpz„}w~…}uy}„zq}‰}ryzuz{w{~zwz|~€{v‚Ž{ix†~wvu~†~wxxurywoŽq~‹x}{uz~zv{xquy|{w{zvz~voz…‚}|‚‡x€ˆyju€{w|€zty}~€€|y|~}}ƒˆ€x}‚|zy„ƒx{~zwutzysx}zxrmtz|}~~|{‚wmz†ymv€~}|{{€…‚€zvuuwyzz€†€{zzzz}€~|~‡Žq}ˆ…ƒ€}xtuv~…ynz†~wxywux{xuuuy}vpx~}vowytz€yruwsow~}umx‚qapulrx|wp|‡€z{|‚€~{y Œy‰™€††€‚}x}€wp~puywvwwtqppppppv{yw{~|zxwvuvvy|||wsyytvxxxyytp|ˆ…‚|w}ƒ}xz{|}yv{€€{u{€ysw{xuŒ‡ƒ€„‡wxy|zv{~}~|yxw}ƒ|u{~{zy}€{v{{wwwy{ywz}xsvyxxyy|~~~}}~{x{}}}{z}zvxyz{||{{}}{zz{{{{|}}}}}zxvuy}zxwwz}}}||~~}~~~|{}|yzz|}{yzz{{xvwwy{zy{}~~}|}~~~}}||}}}}}}}}~~|zyyyyxxz{zz{{|}||{{|}||||}}{z{|||{{||{{{{zz{{{{||||{{|}||{{||{z{{|}{y{}||{{|}|{||{zzz{{{{{{||{z{|}}|{||{{zyzzzzzz{|{{{{{{{{||||||{{zzzz{{{{{{||||||{{||||||||{zzz{|{{{{||||||{{{{{{||||{{{{zz{|{{||||||||{{||||{{{{||{zzz{{{{{{||{{||||||{{||||||{{zzzz{{{{{{||||||||||||}}||||{{zz{{{{zz{|{{||||||||||||||{{zzzz{{zz{|{{|}||||}}||||||{z{{zzyyzz|}||}}}}|{|}||}}|{zzzzzz{{zz{{||||}}||}}|{||{z{{zz|}{zyy{}{z|}|{|}}}}}}}|{{{zzzzzzyyxxyz{|||{{}~~~~~}|||}}||{z{{{{||{zyyzzyxyyz{||||}}|{||{{{{||{z{{|}{z{{{{||{z{|||||||||}}||{z|~|{|}||||{{||zy{|zxyz|~}|||{z|}zwz|||}}}}|{||{zzz|}|{}}{}{xz{yxz|||||~~~€‚|||{{xv{yt{‚{t}†‚~|{zzyy|ysy~zv}ƒ}wyz|~{xyyxxz{}~}}}~~~„‰‚{~€xquyurw|yvxzwuvw|~‚†€{€…}v{{xyzxvy{}~vnsw{~wp{†€z}€…‹‡ƒ„„€}zyytpx€woqrtvxz{|xuz|yzz{{|}}}€~|~xrywpŽ|jx†|}}{yvszvl}|k{‹}oŽqux|rfs€qbt†~wxx{}}}zx|{xwv{|zvr€p€s‹€vz~|zyyxxxxz|}~~~}}~ƒ}wusy~xsz}umxƒyp{…€{||sf~–€k‚˜‡v~…zsl’y`xoy‚}yyyvsŠ€w{~|{xu|ƒyptx€‡yl€”€m~€qzƒ€~vo€‘}iy‰zuq~Šua{”|d|”{bs„~yuq}‰{mv~|zyyxxŠ}qx{x{}wqy€~}voz…}vz}wr|…yzz€…}u~†}uz~yuy}||zx†|svxz|zyyy|‚„„ˆ‚}ˆ“€n}‹sz€~|„Œ‚y}€~{y~ƒzr~Šyit~{yurztgs~xrvy|{wspv|tlv{x„€qŒ†€~|~€|yz{tmvvnty~ƒ{syytzxqst~‡{p|‡wy{ƒzq|†xyy|{xusy~yuz~€‚|„‹†„‡††{q~‹x|€|xtqrrportuv{yty~{ywuzzvxy|xqz‚}xt~ˆ|qx~{xyz~zsz€~|||…zpuz~‚ypx€‚ƒ{t|„|z{{zz{{zz|~|z|}‚†~w{~€}yzz{|||~zuz{xyz~~|z„~y{}{ywuy}yv~…~w{zv|~{~}yuzxrmis}}}sjv~|riu€€vmw~{xu{€zux{||xux{~€ysx}…{r~‰…‚yq}‰‚|ws}‡}t{|x|~}~|y{}~~{xz{}~xry€~|vq}‰zwuŒƒ{~„‡|}}{z|}|{}~|z~~{x|{wvuz~{yxxwwxyzzxwy{xvxywvww‡~vxz„|uwy|wpsv}ƒ{trqx}{wtx|}}zxz{‡€yxw€‰|px…‹€u|‚„…~x…~x||zzz|~}|zy}€~}||‚~{{{||zywvwxz{xvxy~‚~{zy{|}~yty}€yrz€€{w‡wvv}„{rvy„zqtw{~}|yw†„‚zrzƒ„|twy~‚yqx~~~{xyy}€~}zw{~{x|‚|w|€‚„~y}}zx~ƒ|vwx}ztvwxyyyzzxwvuz~zwsow~|{wsz€ztzxrw{‚}xwv{€|yury€~}yv{€€€~}‚†ƒ~|‚ˆ‚|}~‚†‚~|z~‚|wxxyyurvz{|yv{{wvvy{ywvv|}xty}~ytx{zzzz}€}z{{}zuxz}€}{zyzz|}yvz~€{wz||w|€}y~ƒ|y|}|ywvvy{||xuvw}ƒ|yv{~~zwz}}}}{zyywvwwxyxwyz{{zyzzyxwvz~|zzz{{yx{}}}|{~€„‡€y{}‚†}yu{€xqqqy€{vsqy€zuz€yrw|~|z{{€„ƒ‚{uz~‚…~xxx~ƒ~yurvy|~}}zx{~ƒ€~}|}}~~}{vqtvz}}}zxyzzz|~€€€~€‚‚‚€~zwutvx{}~~~~|{~€€€~|{z|~€|xyzyyvstuy|ywtruxxxwvuu{‚ƒ€}}}~|yxx|‚|zx{}~|zzz{{{{||yvxy|~{xusvxyzyxvuwxz{||ywxyzzyywuuux{}}|}}}zyxz{|}}}{z|}|{zz{|~€ƒ†ƒ~|}}~}|{{~{vwwyzxvuuwx{~~~|{zzyyzzyxyy|~~zwyz}€~{xyyzz{|}}{yzz}~~|zyy|~€~|{zzz|}}}xtuuz~~{xww|€}yxw{~~}|{yxvtvx{}zwutwz|}yvuuz~„‚€|xyy{}~~€|z{|}}zwtqv{€…}wruw~…†‡|xtzƒ†}vprsy~€}{yxz|~{wtvx|€}zyy{}~~|zwtwy{}|{xux{~€}{yx|€ƒ…€{xvy|||yvuuxz|}~~{yxx{~€‚}yuvv{‚~{wsrrw|†ƒ|xyzƒƒƒ|vuty~‚…}yuvvz~~~{ywvy|€ƒ~zwuxz~‚€{xww{€€~|{{zy|~€~}}~~|{xvxy}€}{vrtv|‚†‰ƒ}zwyz}€€€zupkosz‚‚|vvv|„†}wrtuz~~{yzz{|}~}}{zzz{{}~~~}|zyzzyyxx{~‚…}xtvx|€€~|ywz|€ƒ€~{xwwyzzz{|}}}}|{zz|~{yxwz|~{xvuwy|~|zvsvy|~}}~~}}||}~~~€~~~€€€|xurqquy~‚ƒ„}wsprs}†ˆ‰ztosv|€€{wtrvz}€‚ƒ~zuprsz„‡‚~zvy|†„‚zspnty€‡…ƒ|vtrx}‚†ƒ€{wxx|€€}{ywvvxz}~}yvtrw{‚}yvtvx|€€}{yxyz}€€€}{ywyz|~€~|yvwx{~}}{yxxz{~€|zxwyz}~}{zyyyyz{|}|{xuvvy|~~}{yyy{|€ƒzvsqstx|~~~}}}}~~}|ywxxyz|}~~}{z{{|}~~~yuuuvwz}…††xsnsx€‡ˆ‰ƒ}unpqy…ˆƒ~ytuuz~€‚€zvsquy~ƒ{xwvuuy|~{xwwz}…„ƒ}wspsu{„‡‚~xrpntz‡„‚~z{|‚€~zwxx|‚„ƒ‚}ywvz}€}zuqsty~ƒ{xvtuuxz|~~~}}}}|{||zyzzzz{|~€€~zvutwz|}|{ywy{~€€€{wvuz‚…zuqstz€„‡„‚zsqosv~…†‡‚}yuwy}€‚ƒ|wsrqvzƒƒƒ|urpuz‡…ƒ}wusw{€„ƒƒ~zvrssyƒ†}yuuux{|}}}{zyy{|}~~~|{zzzz|~~~|{zyxwyz~‚ƒ„€|vqqqw|‚ˆ†„}wusuvz}‚‡ƒ€ysrqtv|„†}wqstz€ƒ…~{xxx{}{zyyxxyz}€‚ƒ{vrtu|‚†‰‚|vqrsx|‚ˆ…ƒ|vsprty~ƒ|yvwwz}‚†‚ytqnsw‡‰‹ƒ|vqrsy‚…‚€ztrqtw{€~|ywz|‚ƒ€}zwvvz}‚†ƒ€zutsx|€„ƒ‚|wtqrrvz}€€€}zxwxy|~}|{z|}~~|zyyzzyyxxz{~~{yxwyz|}}}||||{{{{zyz{|}||{{zyz{}}{xux{‚ƒƒ€}{ywvvvy{}~}|{|}}}{z|}~}|ywwwz|~€~zwww{~€~|zxvsqtw|€ƒ…ƒ‚{utswz}€|z{|~€€~|ywvvuuwxyz|~}|zxvtvx|€‚ƒ€}{ywvuuxzƒ„…~ytssx|†„ƒ~zwuvwz}€‚€~zwwwyz|}~~~~|zyxz{~€~zwww{~€~}{yyy{}~~~{xww{~€‚€|zxvxyzz|}~}{xuvvxz|}~~|{{{||~€}{yxz|}}}}{zyxyz|}|{zz{|}}|{zyzz|}||{zyyz{}~€~{xwvxy{|||||||{{zyyy{}~}|zxwvy{~~{xxxz|€}|zxwwy{}€}zwvuvwz}}zwux{}}|{zxwz|~€~}||{{zyyy{|}~}|zxxxyy{|||{zyxyy|~€‚€~|{||{{{{||}}}}||zyxxyz|}}}|{{{{{{{||{zzz{{||~€€}zxvwwyz|}}}{yxwxy{|~~}{yyy{|~}{yxwwxy{}}}}}|{||}~~~|{yxyz}ƒ|xtuvy|‚‚~{wtuvxz|}}}||zyyyyy{}~|zxwxy{}€‚€|ywvwwy{}€~|zwuvwyz}€}zwxxyz|}}}{ywvy{}€€}{xvwx{~}|zyyyz{{{zyzzyyzz{|}~€€€~}{yxwxy{}€‚‚‚|ywwwxyzzzz{{||{{zyzz{{{{{{|}||zyzz|}}}||zyzz|}€}{ywxx{}}}~~|{zz{{zyyyz{||}}||zyyyzz{{zyzz|}~~}{z{{|}||{{yxyz|~~~{yzzyyz{{{||}~}}{zzz{|}~}}||zyyyz{}~~~|{xvvvwxyyzz{|}~}}{yz{}€€}{zyyy{|~~~|zxwxy{}~~}}zxwwz|~€~{yxxyz{|}}{zyxyyzz|~€~|zyyyxxyz|~€~{yyyyyzz|}||zyxxz{}|yxxyz{{|}~~}|{zyxxyy{|}~}|{{||||}~}|{zyyyyyyz{|}}}|{yxxxz{||}~}|zyxwxxz|~{yxxx{~€‚€~{yxwxxz{}~}|zxxxz|~}|}}}}||zyzz{{||{zyyyy{|}}~~~~|{yxyyzz{|}}}}{yxxyz|~}|zyxxxxyyyyyyz{|}~~~}{yyy{|~€€€}{ywvvxz~ƒ„‚}yvstux{~‚‚}zwwwz|~€~{ywuvwz|…„ƒ~zvsttx{}|ywuwx{~~~~~|zyxyyz{||}~}}{zyy{|~|zwuvwz|}~~~}}{zyy{}~~|{{{|}||{zyyzz{{|}||{zzz{{|}}}|{yxwwy{~€‚€~|zyxxyz}}|zyyyyy{|~~}|{zzyyz{}~}}|{{{{{zz{|~~}zxvtuuy|~|zywuvwy{~€€}{xuttwy}€‚„‚€|ywvwwyz|~}|ywwwy{}~}|zyyyyyz{||}~€‚€|zyyzz{|}~}}|{zyxwxyzz|}}}|{{{zzzz|~~~|{yxyz{{{{{{zzyyz{|}~~}}||{zyyzz|~~}{ywvwxz|~€}zxwwyz|~€‚€}zxvvvxz|~~~|{yxxxz{{{||zyyyzz{{{{}~€€~|ywwwyz|}~~}{zyyyy{|~}|zxwwyz}‚€|yvstux{~€€€~}{yxxz{|}~~}}|{{{zz{|}}~~}|zywvwx{}~~}|{zyyzz{{}~~~}|zxxxyz{{|}~~~}}|{{{zz{{|}||{{||}~}}{zyyzz{|}~~~}|zyyyzz{{||{zyyyyz{||}}|{{{{{zzzzzz{|}}}}||}}~~~~|{yxwwxxyz}€€~|zxxxyz|~€~{yxwxy{|~}|{zyxyyz{}~~}|{ywxxz|~~}zwvuvwz|~~~}|zxxxz|~~~|zxwxxyz|}~~}{zxvwwz|‚‚€~{xwvwx{~€€}{ywwwy{}~~~}}|{yxyyzz{{||}}||{{{{||||}}||{{zyzz{|}~~~|{zzzz{{{{||}}||||{z{{zz{|}}}}||{zzzyyz{|}}}||zyyyzz|~€€€}{yxyyz{|}}}||{zzzzz{{{{zyyyz{|}~~~~}}|{zzzz{{||{{zzzz{|}}}}}}|{zyzz{{{{zz{{{{{{zzyyz{|}}}}}||||{z{{|}~~}}{zyxwwxy{|}~}|{zyyzz{{|}}}}}}}||{{zzyyz{||}}||||{zzz{{}~~~|zxwxxz{||||||{{zzzz{{||}}}}|{{{||||}}}}|{zyyyzz{{{{||}}||{z{{{{{{{{|}||}}|{zz{{{{{{||||{{zz{{||{{{{{{{{zz{{||||{{zz{{||||||{{||}}~~~~|{yxyyz{|}}}|{zz{{||||}}||{zyyyyzz{|}~}}||zyxxyz{{||}}||{z{{||{{||||||||{{{{||}}~~}}|{zzyyzzzz{{||}}}}}}||||||||{{zzyyyyzz|}}}}}|{zzzz{{||}}||{{zyxxyy{|}~~~}}{yxxyz|~~}{zyxyy{|~~}{zyxyz|}}}|{yxwwxyz{}~~~}|zyyyzz{|}~~~}|{zzz{{||||{{{{{{zz{|||||{{zzzzzz{{zzzzzzzz{{|}||{{{{{{|}}}}}}}}}||{{{{||||{{zz{{||}}}}|{zzyyyyz{|}}}}}||{zyyzz{|~~~}|zyyyz{}~~~|{yxwwyz|}~~}}|{yxxxyz|}~~}{ywvwwyz|}~~}{yxxyz|~~~|zxvwwyz|~~}{zxwwwyz|~~~|{ywwwyz|~~~|{ywwwyz|~}|zyyyzz|}~}|{zyyyyzz|}~~~}|{zyyzz|}~~~~}|zxxxyz{|}}||{{zyyyzz{|}~}}||{zzz{{||}}||{{zyzz{{||}}}}||{{zzzz{|}~}}|{zyyyyyz{|}}}|{ywwwyz|~€}{yxyyz{}~~~}}|{zyyyz{||}}||{{zz|}{zyxyyzz{|||||{zyyzz{|}}}}||||{{{{{{|}}}}}||zyyyzz{{||||||{{zzzzzz{{||}}||||{{{{||{{{{zz{{||}}}}}}||{zzz{{{{||}}||{zyyzz{{|}}}||||{{{{{{zzzz{|||||{{{{{{{{{{||}}~~}}||{{zzzzzz{{||||{{zz{{||||||zyyyzz{{|}}}}}||||}}||||{{{{{{||}}|{{{zzzzzzzz|}}}||{{zyyy{|}}}}|{zzyyyyz{|}~~}}|{zz{{{{{{||{{zzzzzz{{||}}~~}}|{{{zzzzzz{{||}}}}||{zzz{{||||}}}}|{{{{{|}}}||{zzzzz{{||||{{zz{{{{||{{{{{{||}}}}|{zzzz{{||||{{zzyyyyzz|}~~~~}|{zyyzzzz{{{{||{{{{{{||}}||{{{{{{|}}}}}||{{zz{{||||}}~~}|zyyyyyz{||{{zz{|{{{{{{|}~~}}||{zyyyyz{|}~~}|zyxxyyz{||}}||}}}}}}||{{||||{{zzzz{{{{|}||{{zyxwxy{|}~~}|{zz{{||}}}}|{zzzz{|}}}}|{zzzz{{{{{{{{{{{{zz{{{{{{{{{{{{{{{{{{{{{{||||||{{||||{{{{{{{{{{||||||}}||||{{||||||||{{zzyyzzzz{|}}}}||{zyyyyz{|}~~}|{zyyyyz{|}~~~~}|{zyxyyz{}~~}{zyxxxyz|}~~}}|{zyyyyyz{|}~~}}||{zzz{{|}||||{{{{{{{{|}}}}}||zyyyyyz{||}}||||{zzz{{|}}}||{{zyxxyyzz{{|}}}||{zyyyyzz|}~}|zyxwxyz{}~}|zyxxyz|}}}}}||{zzzzz{{|}~~}}|{zzyyzz{|}~}}||{{zzzz{{|}}}||{zzz{{{{|}}}||{{zzzzzz{|||}}}}}}||||{{{{zzzzzz{{{{||{{{{{{zzzz{|||||||{{zzzz{{|}~~}}|{zzzz{{|}}}}}}}|{zzyyzz{{{{{{zzzzzz{{|}}}||||{zzzzz{|}~}}||{zyyyyz{|}}}}}|{{{zz{{||}}}}||{{zzzz{{|}}}}}|{zyyyzz|}~~~~}}{zyyzz|}~~~~}|zxxxyyz{|}}}||{{zzyyzz{{|}}}}}{zyyz{||}~~~}}||{zyyyy{|}}}}|{zzyyyyzz{{|}||}}|{{{{{||||||||{{{{{{{{{{||}}||{{{{zzzzzz{{{{{{{{||||||{{{{{{||||}}||{zzz{{||||{{zzyyzz{|}~}}}}|{zzyyzz{|}~~~}}|{zzyyzz{{|}}}||{zzzzz{{{{{{zzzz{{{{{{||{{||||||{{{{{{{{||}}||||{zzz{|||}}||{zyyyyzz|}}}}}||{{zzzz{{||{{zzyyyyzz{|}}}}||{{{{{{|}}}}}}}|{zzzz{{||}}}}|{zzyyyyz{|}~~}|{zzzzz{|}}~~}}||{zyyyyzz{{||{{{{{{||}}}}||{{{{{{zz{{{{{{||||{{||}}}}|{{{zzzzzz{{{{||||}}||{{zzzzzz{|}}}}}}||{zzz{{||||{{{{{{zzzz{{||}}}}|{zzyyzz{{|}}}}}{zyyyyzz|}}}}}}}||{{{{||}}||||{{{{zz{{||||||{{{{{{||||||{{||{{{{{{zzzzzz{{|}||{{{{||}}}}~~}|{zzzzzzz{{{{{{||{{{{||||||}}|{{{{{{{{{{{{{||}}||{zyyyyzz{|}}}}}}||||||||}}}}||{{{{{{{{{{zzzz{{{{||||||{{{{{{||{{||{{zzzz{{{{||||{{{{{{{{{{||}}}}}}||{{zzzz{{||{{{{{{{{{{{{{{||}}||{{{{zzzz{{||||||{{zzzz{{|}}}}}}}||{zzz{{{{{{{{{{{{||||||}}||||||||{{{{||||||{{{{zzzzzz{{{{||}}||||{{{{zz{{||||||{{{{{{{{{{{{||||{{||{{{{zz{{{{||{{{{zzzz{{||||}}||{{{{{{||||}}||||{{zz{{{{||||||{{zz{{{{||||{{{{zzzzzz{{||||}}}}||||||||||||{{{{{{{{{{{{{{{{||||||||{zzz{{||||||{{{{zz{{{{||||}}||}}||||{{{{{{{{{{{{zzzz{{{{|}}}||{{zzzz{{||||||{{{{{{{{||}}}}||{{{{zzzz{{||||{{{{{{zz{{{{|}}}||{{{{zz{{||||||{{{{zz{{{{{{||||||||{z{{{{||}}||{zzzyyzz{|}}}}||{{zzzz{{{{||}}}}||{{zzzz{{||||||{{zzzz{{{{|}}}||{{{{{{{{zz{{{{{{zzzzzz{{||||||||||{{{{{{{{||||||{{{{{{zz{{||||||||{{||||{{{{{{{{{{||{{{{{{||{{{{{{zz{{{{{{||{{||||{{||{{{{{{{{{{{{{{{{{{||||||||{{{{||||{{||||||||||||}}||{{zzzzzzzz{{||||||||||||||||{{{{{{{{{{||||||{{{{{{{{{{{{{{{{||| \ No newline at end of file diff --git a/data/tbchief.tb1 b/data/tbchief.tb1 index 754f83e0a9289219b8b5d1949ed1fe6694374c81..1642ca0c312173dd73deb6ebb2ad5daaf0917134 100644 GIT binary patch literal 21375 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 diff --git a/data/tbclick.raw b/data/tbclick.raw new file mode 100644 index 0000000000000000000000000000000000000000..e73469e8b859feb6cbb16e3e60e1bca758bb7470 GIT binary patch literal 4313 zcmai0F^k+r7)_ZfRjL%mRY(<5xJq%DV2laoFo#*paV%mHVi7_JA;d6%dEiRKi0y@*93RT9OnJ*oeIiv z%v3VR3Oy!u40wJW6b95#U*aB{K91M~M~LUwcU1+n!PAhdJIaoy#&tqYKppo^DhLZj z(44RycDWi*!+waU{{OET^7(h{yOt%gi+SMUoAuou1!#)7=9j|8t||}{7}ywZ)IO| zxTCv#=I~rb*#5oMh@8Ej6SxkZE1K}yyN&C=Uvq!h9rR0V)X%_g%u?3_i%@I8Q@;jO zU+q5oy(*sN5Y!P%#5D(dq0gf_nkjtmRommq!go06VQh~*Q~=VUOPVuA@GK5E3L{}* z-Rqw({`$LZ+mD-H+pk_cyZPzE``z@xWYfEwe}23A=Gl{*P4wu~&mSC3Giz$=u0Cvw zXAh${ZhCxlS{GUEHgC?C?{2T_^={*)M^B$0AD>K4UL?rA2HLyp%ZoOPr%^P;Fx%~R z)pu^46_F~mmX@bmGFHcV5y1!Ud zO}D^2pG6u(2QIeLn zE^FIwoB8C)F-lBMvu1g|?$_JZqU&1MEo>RTI*aBwm1WIpz3JQCZTq;reZReaS3dso zv#0L1{kXl_wb9eB`#=Bqef#3k7cV#EBAtJCQDxAD4f^Xa@?fb~2#?fKjDZu@3~ zzdOvPoKG{8MMaw&_cy-1f7hX;Zi5huuHqeqKeNZ=6buVli4(P zrZP<)6>jtT>Y|78%h%_tCbw`QkFzRE=4qCdrp(iMnr1nY-THcI=BM-8Hg%CBo|kUb znyRp!Ei*isriJFJa?8Gl+-=`pCdlr|%v5A19@2TU&K-wM?=yji;w^Zn}oQ`IYONDveV7`e$*1 zPBzY5qGVr z@)}vZa~=FbPS>wcx-9ZqX1J3iV3lDmp|5H5V@;Xm&{*SdAz0XSR^RxlK&%Eohwlj9 z=(;SCQ&nYIptg}WyTlEoJ9X{gL@Uhjt|Mk`1^$Hf-&n}kZ;%FD9T@mZKs2aAS&k|U z|4S;16n)7u2!|2i=ugw47X7i%+Q5$*XZc|@Tm-P>PK*1_J$~1qaq^zv(q{!D$fOSc zEhPD5f@2s48%|DJKtV{EgF^2ZL&xxk znx!-TK5;F-_Iy`DU!;3Al<56Y4{>@wc>mx#{3K&`hxbm^N?lgc&d_t832GSf%q}3o z|MIXgK;lPd>7=+xepIWa=@UEwZ|Ijlwu4$U7J@eL!K@KQX@63+gFkMPMWkqDKj9-aLz z$?fZma)h<)sBgk(;6`2SyVoy_m9^?;FNO-@g7sz^d9Lmr&SRI$glfTs{gC+e^k}qwKxCz@BiV}&42pG?|<{_v*&jIXIjbs zTB@Z~t3?O==N6sbqW}5$|1ICA1OEr7pMU=Or=Nb>?RMMk_U7g$O0KP~z5Vvv_wL=R zR4TV`-^OF}^Ye3abJwq5FBXfwQlBf;SL*jlb(DIj)P_=@D7B_kO{sfIRg}7|)Phns zlqxIb_j>-;mcPF4-@E58F8bxN&oA*?i~d^KuND1e_4uxOw4^p~sr4Jm_j|s-<@@Wt zf6w1r^#4%y|4{V*pdRaAB*;6{5-*Ej;D*pP??z@XSZ!dgWyVZ4XcJAGHxIDjEd9`(?+`RqL`qEru@x|K0 ztb6nNn>R{#=U-SX7jM0Eb$)K9JUcUY{d}o7DFjU(w@an%8>Q_xOWW(E?d{U~cInOS z(ha&gTiRYMZP!ZMo2Axv>E3qf=Jxf{_CjgmuuH~%Gj_FwF2JYp_RSQ~ad|4x13{d()8!mh2< zHPy9}7p>XUi!bpzE!$mKnfp@swe^`_*XQ4>-+8~j_F;W%z0kM#kI!? zU;d!p`tN$@W4Z1vr(d@!RK?01MEL$n?fF>a>!o)JH?6{wjkgt=c75xkLf_^WUUGZC zuFt)fddpiIddq5<>g-I#&UArQPM_e)1YZfCNEruZ-s(XmvwR#}jFvx}BEsCeB0`~J z6&g0AD739Y*A~RAHhScO+j|FKLYCoWF4jlBN2z~anR%W`5|Jy^TDmSjL&r?00LjSW z;3T*nx@%s0CSArQha2w{npUCh6uRJpV{KSgJEPQD2v{hiA4ilqM*>C*)O!!Sod-(Y zI+SQ6i%1lb%Lo{`8xr$EQo2IfCZ6AUztC_%X_AiE?ucm6rjZ5C#qN4N;e&H%xwy3% z-BSaJhqVqt*iL6`i{2;^@KQ9q3=MatTtHy5R#A3i&JjzU9WY;>s+B*`=40?QKFL2SuU2Mp4_1sgMihyfJ1@A&(bXx938DxR$K#!Jx1Z2eywBmC*WW3LI_Uw znHXi)_h9+6O8rejd?Om2ggS2UQ!a*Xg-ufmETNL-<>@$hoo97_5gDvLSo*+f00b~0 zfC7LRD8?>NXmDXLA55F@_O8`y59+P8LNiln+w~o|NWlb@_>RUTkW2bb_qY+^sDLmm zqBTcC!`jFIG~vdWfCP^yGAa5I@Fc(-s#kEc@P_ryhf#0<6b!z>C!M0d{iuB#IpX)+z!n0>c{fX@` z^0RnEsY%WA)b^wC>~2V3fD8;W=_8J5?YF%<7cDm+;b9(RD(VLzLTZf=#4g-4vXCiL zs-XHOmHO%tWg(wS9bpG2P3ji~^5EirIHW&2mP9t##S$U%%rL16?#^X+VInhe%vSwV zN{_P z1v(s0sy>bez??w0vQ-oq@sklC8~~|Ygn!XL1*MGs86dBV33_zY1*H5TFeLS{Dz@e3 z2|b)Qk`^omVA>=5peK)5mYWT5tGx#dHSwM$;&m}1a2T}xp)-h?lP3e+P#r|eE%)4L zJq^l?)JHCJf<}U5BtftlHY{Kc%u5Q3Y?TR9$cS%FfP>aS(zuYK#eN3rECuAXTt1aT zPX~uWec>H)89<{+9^Y~W2bkIYDFHl9*;F!U-6!*lW@{rHx5-irVsbA>ED5N> z*TdWhEK=xtZVbyTA)FpTxH*bv+(H77A;sdz#EaF}-lJI^7jssy8^R63$K5Hoo!}3> zpN3LOj6r^L;9IFKZ|AvSsOz5NHq$^=$8U)O)LK&@2wy{Q$krDS-c!s_&%du*i%#U; zZ0FtlRD#bbjYI&TBjjL+%2mi<9LDFY7@vL0u<;3%akQ}f9z>YSz*FKhc4|aCYO1@F z_ZG|_=F^k52q8h>`k8xy$A@)dg%S@H_;+2B$|#kQpP(fN0C>sZ5z$9oUT8UyMnCjU zhGS;*jstz+8HpLI0c0Gj;=puR4aaKAT$2u{4)loF?cfpM7Sv+78KNSCR$p$Quj{P` zUX8+d?qXxCPFm9t_Kc38C;)(i(>g062Nua7X6}ZpkUSXn^`ycfTQ`U(Flo6TR-`-L z@+Gfz)vH~CJGLr>n74Kre}l+#0Mvfv<0$C~%qCuo2$L=O+!}zQs0mT@F2@)MafxF} zH33m>2)hCgWhh}#!WDLcgduDiABBnmVYEG@ivnr**-&{2Vza5BiPq2nq)YaJ#~?JD z4FY(}!n6~No=xa&VGI>0?AVWB02O%z(?p29xr!WIVZDaG_c2RPmZU`!BfbYk&|Y^-r4HA6IDP6(xO_-5kOA$$X3m{I9NH!wa%^V415=@5G znH;zsggs^qmEt91>rK?oCWhxc;n2@o?xdUlRiU3N?4GVKJfJz}HtZ5zOsqzcrNVR#BakCqqE?Tuo7W{YREF7ryNhCzL z9_phyLxIsQMW>{0g@9UdC`fRK5Rw|)gX}5+>{02P5f(I|uKdBa! z$4`AF#R>r#USH#-C5$Nq8ITz?o`q1--B_|gs1Smvg87gv%E-hlPg!Tt`(dDlz81xx zdinS3@OPNtC7@uUWgHjdOav$qL}UrmM$<_E1i^?xnl^+9V=KHOhG^yx53?%6uN6Y3 zIJgn`)S(@iw+|qqWgra^ASHz@R51JTe!zzYtzGhjEru=Yj2l!;ARX2PHs-(ys}@3f z3ahyMSU@oXgkF>n$s-^T zN&==_lm|y!A=7@iMd%tltSpJvcN+B>3Sii}rsxrspLJ*$Qptf-JPktgt4U;HZx&l5 zqrza(e1K0(-BKI}tvmM}&J$Q$$*oDz_Xy` z3rI!CaQiXQP5l^aITwz-AI5>)pSBX1XiX)5YO|Rt{Y<@9tk*t>;Y^MIbCMk_v0;1~ z(Lrg(O1@E;cItCzd4^k#aXN*OhJjKn+JjJ4o{{Kc+=_Ny49#j9ZzVP-@NrNmqo;Ve zct&lVGJH$yJSlRBcw!Z2Qr#R8tO<{X0h9)_jaE@lvD6;~Qa4kjUMqlR(^f&*g=vJ5 zzk)}jo=PhmFo9lHP>2DCD!6$k+Rh9>Ain zg9rzWhsfF>7;#8gzD`}NyL;fXAoalnpXG43Nj|!;E32iZyEVz1k?y8c6F2JXyFiT1 z4#_f*I;|uYm{{4lr0Ty&5m%5rGjJRtqXap4p@6{13_4oG1PFLTs6gCF4eNBul4`vJ zP2^aP8V~V9oqiD6;k(BWoFg16$zz1SWVd2ux6zd>3r+$8gkwD8aKQ?Iqn$;Hn&Tz% zD*eI>sho%Sr0KI(0nB$LPJ`kz2!XO6I|3XBri(w^2rqHuGq)DBvjMlI+ZndQ<4|<0 zZaQ2eF=~^TjYnHJH;pu&qInY2WyS@hsYXz>1yw2!k5!;+EC{pcoEezFm{1~OpNB9y z8!c)d!qg&rqIn_%AHzV3RYDvK+)bEQxU0D;11O>HsJIS_Mj^^gSepby>`7HWhlxaY zXJ!o9F%?tb!dDJbSmsx!Dez87k~|-SPFvA|!EssjL~wnVtc{%W^++(x7zU4v{zgY( z)CKzbiBu((c#oi?CDa8&(k#QFoI#I&a{DyD8}ez(xFQ!=`ho#s0~F# z+No)uXJhCY;)$gi1|6<5uY`eFWBQ`k!$1XoFiJmpJbmOY7_z$A;+i8!2C7P{^9WS- z1rXL7gM!h}X$yaf5wlQTd|C+#-bKgJFduW*G3b~T6z2%9h68A*RR|TvMRR?Co8YO* zCSlc#|K5i$4 z*fgnFc2d)2kv$&8ZG^*(Oy*E}d58mpfe)0WF+>p#Da8r4%rG)|turF`RS(Hc?6j{e zHctpRGVs*mP;QCUJe80lS~&2wvA#$xBOET&^R&c+_J`KaB8jg@Y(HXDh`?hjj54N< zz5OO7RcEi66+qi0uOdJBfOLu?2Ggf7ROEqt^Yk%_;B8^}%&w5rCe6~1Uc`h5lyrLV z_UrKu`$qzwJn3|z<&k2ete^I?c*%jN%(DG2F zF|1jniUWv==mH6uP#MVuMI(oO+A~J85$5G|7TGvr9;JLBBUv-BMe9^3ZNm=dj)ugv zC1uoGR`#@&{4i<^G0~5MWVxY%S)@ac_=v3V<_;|EMv%MiwIFQxqp*oF#KcTyLH8!w zKMo0_k5mr)h*uk}o8$S!ph4-BV?lRJPaP6KYNRwZc02{+GgbWlLBvNs`3&bpWMRYgYsX*$ z(i@KNLBZj``r@9omL~U?*Lao+a6<}>&ABuq`}$ZPIjnTo4j>v_RV8}>xsFzTKi&>f zB?G_gjv-6P0yDLc4**W?@0db`$5P&Kc@`ub=1FK_0t`wfj0LL}$&yv>t5Zd+ZhU4d zXk7LH8rR6Px=oO&87EW-mmkNfhswvK8v!Ib4<9K_ZYRzkAu+W48#IOMFG z5a-L5!f_hi2gDAKjJxj|2hY%sTTJGEf?*@IZ39`Cax^0^TD}h?#Vp?jhmj_10Oqjj z)b$YA(IRJ&7-==0_exi+#*{broECZV0GuCJgfRgTNl#$10z(7+S&fmA*23r`_Z_57 z;%hG;;1CY(DJC|3HyV;|!dilKFOo_&a@>`Fbh&5}29v8I*RZrk%wM@X^qB@H86tmA zQXD5qMw&5zyru^;UJC=vb5{GL)rFYnnZ5b3gf)I}L=PUUjPxBQ=pdv1imIEEe<<^r zGz6orf%0DE_+-jk#;izKI>+l=V2RGD{t1Gs@$4T-v}v!0czDw5VcqlB!)9xloHWag z!I!rzLY?-OuY~#wVe>`W$pIPBK&g@U=FTHC(`rm;0rOtz5??txmZTxaYK`c}!xWR= zv+U>Rq}lX2`~kkQSfA8F4M$_r}qLiSBa9Y`8l{n7Ja zqA#;%)tj8P7CFx!)ST5mbc)sagwou=7|60+z|30hiw)8hrUV5fDz$3>=$m!{rP#1&vcGi*D9tRdQwrrx9EsN625 z#OX?~wa77*Jfzf#G{S_`XS}_OEI9N!+~c;FzreIVOD+udoPz2>ya6<%`(QwL34_we z$*P2|=ehwD0#1F8jnACy)e{BnASI(vP>0q#4~X*#4#e{MB+(_DF_=KZ@#aX!$*C2^ z;z=B0doveU5zdI^|3ahDOF;uH9i+F3o+fe;6KH?~&v(qUnqTXLs0Ni z=129Nfm<}`76W>u>Xf(uVAaW4B$gv@Hym^GsUmzVxA;w;u7|E2aWV&DijT0CyWtVJ512zN} zH5+9}!Rwr5OwL3Nsf&=6ya~AyeCYs}nqtZh)g(%t0{9%;{_{)-O-4 zB|McugG7w?(WI<5FXN+_|IK?dS0ob4P22ZtU(Pi%PYbIoH*8v?#2<1tPUMuGE86$x ze)-fJlkx7ro}7wO=yXn5xoO8V>3-{lmEONUEr>7;3*&EM#Z%mviCodj%{stmCI4qD ztyp7nQ^gks% z)pk_FQpMnir`(>|&hc_o-s7?}v5v^_=r}`CL-wL$1i#<4(MuKW1yTb?|+W|NX zj{K9r`OngqR`x#QpHwpR^NL%WR1HTJEganvroK4g~+&aKT4(z1)iRc<_@!xT4&QDmyrGzhf^% zv+*M*7%w5K9N#yrYv3U;7jf7&q7|HY6`UO3ka8-ub1Eps6 zLT3l6jW)|qa9;OgP#|>Ws&XB7KJRYjRoTM1mUP&zkDU2@{NaS1tzc#h^L}Bf=a}K} z0*2vVS?MGh{ypW|+<04UK!o5Nf`G18pYvv2e3W6fbDTVO-qK`d>j&A5jM}xb8#W(v z6B~4%tq^aca%I_WN99U!C8OoSM`6P@Y|KRkJgP&~(w&YR2V!l8>+w z6ZM)4OV%uKn;L4==x!(zv^CF@poKAdKKmzvQGjIFRnA*&LS{5ycz8**f z!Re2s4xQs!LPl<}$Y;{zl87SMArMLU$vyoJC*6MDBxs&=oU{{j4%AK(Gw9Rc3WhBq z0fR@hyviLam+byWLM_C%{)65fqRYk*D(EsaI4qh77`~Wf?BH%qdNv}L)xZk-SFH*s zwPNzKZL98Atv+?1PHf91w+$pQmp=~83FA|sl*PXI02X?hwvM9>Y^3j!Vk%cUF@Qp~ zGop`t49=O5sfq@PBzuiF7HiVh0cJx#q*&DR*fYWW@vvy0zy>yFt-d$Zh9pfH>pKCf zzqrhj6>Z`Zs>qIcx-nS8MSC952THq?J|QU+vNja8sIU^e;7dn(1jn%bPqZXCpEDTp z>p_#5w=pMX2Ebgo3ge*MoZF#bNlPamlcwxwhrNtU^F%J}&?TP=rU?ajxfkG+4Bk}fLR$HCX5!}&vt@A;2u zr#q5PSQqOxlZ2l#QG*CphP|P|?-=uMP;Hk)lg(MTQFLV=BA zN;IOUE(@uZ3`2}I1qH(MX{=U3Pw`p+S&0$5)nS8KG%s*H`1W>$t=OR1SK1jYI)L?qYG*S=zWpqC% zz~YEPVVpanwMa_jLA^`+k74J-<8JC_fX+95bkilfV8yNoCuOoo`J>>FD74tUYBKoJ_hSE4h zfC$fpIa9?KR5?Ri%i=vntSsQ2_(uW4yNv~Vf}xfpv=(1Fyh_^9`HaoA`Q}ANc?6NI zpfVVj4R+$frb$Pu5y*TOa*e1LbkZp$!A4k0@sb?dv{?Gwu*QUxls@R#w^FjGV%ECB zK2*n1>7QF=RDGG{jf^w{8?I|42KJF`d0b+Ss7sPs|5Oposra2BV@)&U=|lG#?JOq_ zz59fE=P6bZQ2GfA@~2u__*VikvzMgtRj-A;xF_$o@Le7f)M0;OUmR#M95aSj@d*HZ zEHiTsJ~V3ao=}bAM~uSiTJ+~j$6-#tg5^l1kTU>>^+YQ=hstZ0Z?i>ltRW(U_H?EH_b%Ri}Zy;0pG%oE~_RZCV` zj%zy&d$sj#r|md>%h|Q7y`NY2mZ~#zt6MLv?!2CD*wxnEY}c;t{XDx1h+<*YH?2M{ zj^%^0%0_joYu}R#hp-(KzD54Y@W*UIifDPq-)B^RMIH)kqZ-J8=w z{Sen7ud`t}Z5wS^-MfohX>yHSQR%hS+F!9muV@tjdZ_3&uIq|k$+ijDBUV(MN2h#; z#0hk5DLZXvXRU16UabkLBPzNM<1^x_0nd656CC`f;{mr&g48?W0!&hNo2o=sr~Svs!y8bp3TxQME_?i0#o7R8@byk{A%BMj)u@TT;eD6`apGsCMqwj*1o;E6O-$>s!RD$5z`%{IGtCxYhp;EC8WjG1z6fU z)wQ2ix9(E&davv&UD82wB#*jaC}4BoG=+yh$u^<6FF~VMw_ah53;0P0ufhBtx~|L8 z)au-i@DU0;#h{`V42WsKPpL_`60hiaUc`JZ92E}{>Wbr94y5QnE&*zeUby!%U2ix} z({eT(r)@diz`uk|Ixlw1A}K8m(+nORC(IHmW%IUeyN$pViw=|kK)?m#9hY9Kc;|Cte}YcT z7;O23ezKTSbpU=KrcRt7v?B<|->+few?(=y)|+7rqjk9#bq}6Cy^DXI9#y=kjVGp6 gWwa=_{+B-+PhOOD7E|W1KYv%U!A8aJ8RPu_0F;1ZoB#j- literal 44907 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�ySzd;f$Y8r8iTn{o{uxUG z@iMXFEn0`r;6M>kW|?~^YQ*TK(e23)v5qwYKv@$}92+B)IS`6>zoGL!CfE(TfOdWb zkOhGlXUXE_HZxc%r@m`RfotF3Si1sNIb0_(h=HMwTQMR8ZP&jx8wnbkYkwoS(Q`ue^{`2pLg~DoZ$bOk;)wx}ZK~ zWu?Ko%*N+NHs+;gxv|*}az3S70I{V5fg>0PQXoU8oNNRUer7S%EMjWEa)Xv)Ud!zj z)V--%*z+>$rpk`nPne=6ik8+jkaGIurmCIh#x^82WbV*#g`7G+@(IqC)M1fQFTVp^ zg|Ae{Zna4B>g2$Ad{fmv^~8|z5A=$d!x)3@)trLL0~3Z;r-+KjGLs3U;Oo=Y3T`zG z)xWWhKUGLu0Kf3FT2wLLwbYW&@9^I#*6iaL2!7_laX+=*W98}#RME2`x23}noJs+t znZJ?rUl692nPpSf2$r6B9^So+7q?fCu^{U3kvwOlFNjkL{8fByNa2rM$( IPmA*Z17IjI$^ZZW diff --git a/data/tbconsol.tb1 b/data/tbconsol.tb1 index 7777b4d20725ec790dba812a1d8b62e77a103ac6..f8e0209de5fd5e4c29c2072c05f5e950cb67e730 100644 GIT binary patch literal 9615 zcmeHMJ!oXt6+Z9Hn;E@bd4FPWY>*98IN=qt5%ywKxOf2<3J7N$M3`bA0xRG`Sq374 z!4nt-p(vnYiv(1>Vv8+QxR`_qnL@=B528ZF6fUMvF##0{*II^3zXOsz3kPFFtyI;q|kB+#~t3Py0ms`})9-6)mpl zKMH?Wl+p+PfcWg$v*Y9Ae!t)A^*WsnEcf>Ic6WE1&1R#~SX*0z+tSj~;^N}`{CuTS zQAE#(hD6^G9TFW7wTYe*?Gfz|HHjKTYeY4oWull!4F;;)RY{_nO;xX}I93dz_Umdd zRy!5-C7rC((JFOTC|M?@21<36N|b7<@9OG#te#iYb2=H&QA(Y!DM@H+iyG@xTcJ3n zzN)7x?x@NWMUPLYbwnE-T1{x61_!E}sHCNutEwKWxS}cq_D%x9Aq58%v?+K>!5#%W z6f`MlP_RZpje=zgV&J%JRIF4*DX^rI6FNGgPR9^xP^|_+^#c{RRb^jMqG2v_YL!N~*N= z2{j&4Euz>hr>ZNPz>rQ3>8L}Ugpw`VTBk;hYBB6jkJYfR2C4eyKpnMJ`cxexs{2^A zTk2^;C97wDs-N!Gj(1l2t?FTO`QXc?PUDmPFXAU_A1AAekLwS2Y74FE{Kj&$zVvQA zuB?3g_R`{8@xoh+^KV3zSsBp$nMP5%9HkpknnY9uG5_)YIGrP7e)2FuVuPcKhy|1hlj zUb`4pi(cCgt0g`IKB0#OXTYa@DmJj64Xf6&z&4>lfR||CCCJc}*dBVT5&T>1Ywdw4 zHaHRM!;;Oq{lFmj;gCUw9(==LL8yj9MA4c*p3bq}J5T4_Qe5CJf^a}Cz!7(g2KO1( zi}AVMQNjymNX@!K$iN*Ms0`c@u>gB9#%XCgGJHR9Qhp<6jBsUELeQ;Y0y+x`XM##z z`eXxLUKY@6w?4Ox9+s%QaI=X+fc?4N7;6wllf+?W1C8J#@iHuJP?w~k3ippjQg+Qa z(DfW3sDg&ByaVDkRP=h}%p|+^b`(*B^Vv4T3>Q>JgPZ2s7E8W!6Xc6(AfkJP&*$0U zoKIX=*xW~ejO3WLiHGyj+&OE@SuQe?vfa!c+3Gob>{M$(^v+YAz6(BLle5>^dF}Tu z_T8loCKwERmu0%-WmfzgCTy}j%vHh)%{uE6@+ptRv1qF;u^8tV~VsE`Xum2y9 zF-x(wDaG2x^=%!#C*dF%x!{K0JbcF+{(E!qHbQSNJ(B1Uj9j>gHuw9%EK&p1W_Nb8 zE8spe6xcfq=n?&E^Yk6zw!JjBeYyrOU~YETHoFqVXU>9;9Fe=v;J)A2vS>s$%tbjS z1e5eRieDOPchQJ!auH<~3z)c@rZ_q;WaPCk2VZ&wds82s5pscj>u`>tN&;nRb4|ve z>1t@Gl0aFWTn*i8P8sb+7DBJUWf=nn7fuj;*T#GnxCme+t#NU(u^HDO>4=My%^tGj z=r%iy*|m+fscBU_`TaJsj%13YJ~L)H+&80s!{x?&%4XNyli}pM<8#4pzR(OqDVp4fyDu>Oz9A`< z#7nHByEolqa>0dFV3r%wm#p3WbL}3Jj>rZBtSmS5Wr|hCU68yoG&3ht?J+wcm@!FE zzj^WHy6<#$(p84CurKQ4ZZKeqKEp(&X6Iv`uX;-|9n=WsohXyN_PuFa$=u}4G3zES zKG)5>)bB6T_SA0g44F512FNl-4*5>B+?b(D#x@sGM1PlW+2o6^z{^c$OctGJKkvPhnPq)Ox*BR`atSlE~@=3O|*~Na$(8Gg< za^1$fRhd}AbD||fRH7$%Be>&~*LA$~jg_d_+W)+TuZFcdK>XIsEg~?~J9F|+M?^kA zG}H{xK4-K5XK4X?{Stsq3ntwyAhW%AtF!=ah3!Rx41vLYyoBDuPTmwDNmOPupV9F9 z&eZP_%<8sejWRNmsaiH`Qp4|1Q>+W3*En<;UX!l{9;*Ds5C6~l{9<{faX+xVs>Z8o z$TtZueG-1<^?pS3OY=>I#fKg>znweBSZ?CK^t5s47>BJ>;+JFW9WxjIQcJ1=JfM38 zeQH^}uC~8DiDiz-rI?dh771VK_8#zAyt1mVU7Lm1`~KNXULV`#YkECdUq;Zb!Ia6F zWPT>MeAzsuk|9r;oLA4=NCjSS&PUL$sVC>2-Cw5;FT_Fb9Q|4J;?CK7DLdyrSM~n5 z`}-TO=j%^#`uufnXKrwIcnV^V#yu^M)7x)}?e4vSM!vrO457{U;gG-e{{COD{p0em z>b1|xL$BQb6sM8>@)-pE;{tvfZ2!;Rv literal 11817 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 F`5$XQu^9jW diff --git a/data/tbcrash.tb1 b/data/tbcrash.tb1 index f930f1bf101994e646325ce094d79c2236aa1b43..df78ab9f948fcb6fb12317a9b8846e978e3c55c1 100644 GIT binary patch literal 4869 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

DU{9jgm7CZxjQL(zASh zlsKc9nKj%p3s}nt+dCNJu%u(C#w40<5Bwf)-;mbBr+`@9GWD9oQHfo-Cf_mxh0m z8HBdniMcbzT;K{0Q?8xV5N(EQqwQM>2n| zeGn9-u>{edIqvf{-G%VLD$@MQNcnIaGI6osCmWXruS-Nsxb|t+f_01qi!?1F2r)jb z{lc@Uf)(t+t?FE4TlA&5A@ZdGm;odRd&n)SKU50@sjqm3rcMw})6}O)nD%0;NPmrz6`3#v^3@P;jh0dZ4|9=jSuPme@5 z46r0eQGpzz1q2!`WEgn#Dg2}50?%{AgA%a&b&UbloN*13)4)nl2M^TkKB?%&@G7{e!ilM(HF*2<`FiTIEg#s;2Q>v7R*NARxHVN+ z72wBUjPt%>xx=1zgD5tGHDH64RWLkvJzRZVyv&NCS7?z>Xlb-App+F8*`SV^n?TB;i6^k8TF3)T9kmHKMZa z3j837ThvngZL3-$3;Z@dAdUJN0X~uJ00Vt~TqV&P`oYn|0c4c{25B~};wgdz)I3WD z*a6c?(I#Ex6gf-|m<*9%hJkYKa7?eq8bUD(k`gSljBZkpcw`E+E}W>~Vrf}tvqJL}bhxpPMA{-B(xSj8_U-{KlolT!MH{mk zIvr!B0?YFaju(pMi$G|bmT!ig3N^Bs?{)rsec_`cu^oEHAX7dR`(LS&k2uIkt& z#M!~QcFd=&atl8B!sibCl+hVPzA#uOMP$TJ){8pt=IQgF&?H#pI3xQQ{}AHW4_rFN zr|<7b8-rirODYcdC6!yle%$c6>yMDrAPT;m!MrvVWOSQr`XZmvxbhcHex2!j0Cf?W z;ryp`Uf17Z^uG=Mbf-`S-q!vE(TY4D&tv7k$kh$*(o2ZQ??^bAG;hc3CV9r|{%t~P xiTsGWenJlyb<$1gM|A|!?|g}8)XL9^;d8Y3YT{L9afRN#Eb@Nx{3bD6`Y(gg$<+V= diff --git a/data/tbeerm.tb1 b/data/tbeerm.tb1 index 8a7cbcbb7092f88977c01898a70a88b10b274eac..cb0c8e14fcf5cde47f0f325f9f8a7f87de8c953a 100644 GIT binary patch literal 7716 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 literal 9867 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 diff --git a/data/tbgorg.tb1 b/data/tbgorg.tb1 index 8d5d6f0b089c3ddacb8a4350279b263dba8c18ae..9c5ca906efd56a2619cdb67917100828d00a52fe 100644 GIT binary patch literal 17952 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 literal 20622 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 Yq4_Zc<-d;Hb^dWj4gVi#fBeb+1>&r^xc~qF diff --git a/data/tbkapow.raw b/data/tbkapow.raw new file mode 100644 index 0000000..37735f3 --- /dev/null +++ b/data/tbkapow.raw @@ -0,0 +1 @@ +|||||{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||{{{|{{{{{{{{{|{{{{{{{{{|{{{|{{{{{{{|||||||{{{{{{{{{{{{{{{{{|||||{{{{{{{{{|{{{{{{{{{{{|{{{{{{{{{|||{{{|||{{{|||{{{{{|||||||{{{|{{{|{{{{{{{{{|~€~}|{{|~}||{{zzz{{{{{{|||||||€…ƒ‚}|{|}}}~€€€ƒ…†ˆ…ƒ€}}}~€‚ƒƒƒƒƒ‚‚€~}{zyyyyyyxwxz~ƒ€wnrvvvx{€†‹Š…zyxwvsqppqrtvxz|~~€ysrruxz|ƒ„†ˆŠˆ†Œ“˜›š•‹†ƒ€|x‡‡ˆŒ‡~ƒˆŠŽ–¨³³´ª –‘•’‹†‚ƒ…ˆ‹Œ”›—”Š€|xxy{}~ytnijkrz}€~~~ƒ‡Š†€|xz|uoqtssvyxxwv}…ˆŒ†€yrrsx~†ŽŽ…|}ˆ’‰€‚†ŠŠŠ‹‡‚„‡„}ztow…‹…€vmrw‹Ÿ€rd[Saplijlfa[U^hgf]TVYcmorw|skqw{ƒ‡‹“—“™£˜›ž—’œ§¤¢ŸœŽ€‘££¤’€{vy}}~o`ek”Š€o_]\eo‡€ujc]v‘”Š†‚„†s`cfghb\VPICQ_w|howwxusx}~Ž¡¦¡“‰ŠŒ„}~€}zvrrrpnidcc`]_b^[agghb]cieairx„ŠŠ‹‰ˆ€yz|}€„ˆ‰‹›«´½±¥¡ž ›”‚xdPJEFGZmvxri`eknrw|||{{†’˜ž˜’‰€th]SRRMIMRW]\\SJLOW`][bjnskdVHVep{dM[imqtwxyvtkb`_benxxyz{‡Œ’ˆ„€€vlgcbbeheb_\\]XS]gediow›™˜Œ€xqppic[TX\YW^eddddb`THD@^}`CP^`b_]cjihb\YWalmov}…Š„xmb^Z\_gotzxvqligikt}~Š•šŸ ¢¢¢¢¢›”Žˆˆ‰†„„…‡‰„€zuld`]]^fopqpoqtttrqomiedc]XTPU[^adgjnoqlhkotz|…‹–”’Œ†|rqqx€…Š‡…„ƒŒ•–—–•—š”Ž‹‰Œ”™–”‹…€ujgdegow€ŠŽ“—›—”‹‚{tj`VLd|zy^DFHFD]vuu`K]oƒ—¥³¯¬¤™–ž¦£ š”Š€|xrmnpv}…š§¬±ª¤–Œ‚|}‡–œ›“Œ‚xqke`^\_cehkov~†š¦¨ª©©¦¤–‘ŒŠˆƒ~wph`cfimquz„‰ˆ‡|tlfagmu}Œ› ¥©­±¶µµ³²«¥¦¨«¯³·´²®ª¡˜’Œ„|tlkjqx{…‹‡„~xlaYROLc{dMT[eoy„‡‹‰‡„‚€|x{~~‚‡‡‡Œ‘Ž‹Š…€~}yvuuuuwzwttunh_WXZVRSTSSW[bihgikjjnrsuwy‰Œ‰„xmifjow‰”™Ÿ¦­®¯¥œ˜”Ž‰„€yrnjmpkfjnquy}…‘£ª±¹·µ­¥¡—’‰€thecYPOOQS]gnuy}‚‡‡ˆŠŒ‹Š‡„„…ytph`_^_aceb`acp}~€}zvrqpib`^`cfipw‡—£Ÿœ–‘’”–—™šœ•Ž‘‹†„ƒ|yvtsqoqsssvyyy|€ƒ†Œ’“•—š™˜‘Š†ƒuhc_^]fotyvsyƒ‡ˆ‰‹‹ŠŒŽŒ‹ŒŽŒŠ‹Š‡ƒ€|xrlf`YSRRW]aeimorrrx…‹”–˜“‡€ztqnkiiihgnv|ƒˆŽ“™—•••••“’‰~|unkijkpux{}ƒ†‰•œ£££§«¨¥©®©¤œ”Š€|xvtpmoqw}†ŠŽ’‹Š€vqlfaaacfjoswvvwx{…‹Ž‘Štj`VMF@_|yz{cKXerŸ¥««¬©¦¤¢˜”Š‚zqhgfgis}‰•›¢¡¡™’Œ†……~xrljha[YXXXWW]cluz…ŒŽ‰„zwurojfgifcehovvw{ƒ‡††€ztohaab`_acbbhoqtvx{~„‹•Ÿ¡¤¢ ™’‹„|tnheccd^X[^bfmuuvvvtrtvy}~€‚€~{ywvvwutpmoqonpsvyvttuwz‚‹‹Œ‰„~{x{~€ƒ~zuph`accciou{€…‰ŽŽŽ‘•Œˆ…†‡ƒˆ‘‘’”–˜š”‰„zvsrqonrvvwz}€ƒ‚‚€€…‹Œ”›™———•”Šˆ‡‡ˆ†…‚€ƒ‡„‚‰‘–›œž ˜‘Š„~xvtrpkfa\YWXZ`fgihhhiijnrsuvwwwtroligiknqrsx}~‚…‡ŠŠŠ‡„‚|wvux{|}€„zuqmjjkkkt}}~~€zurpkfhjjkt}ƒŠŒŽŠ†|vqx„…‡‹‹‡ƒ€~|zxz}~€ƒ€~~tjgdcc`^`b`^_`cgkoruz}{ƒ†‰†„|zxvz~‚‡‹’–––’ŽŠ„„…zwtsrmiebdffgkpuz|…‹•—š–’‰€|xtpnmoqsuvw~…‰Ž’—šž˜”Œƒzvrmifcccegjmmnrvzƒˆ‹‹ŒŠˆ‡…„~xsorvx{€…Œ”•—˜š•ŽŒˆ…‚€wnlje`___`ekjjpvz~…ƒ~{xurqplhd``aeihgiknrx„Š–••Œ‡ƒ„…†ˆ{yxvuuv|‚ƒ„„…yuromlkosvy|~~€ƒ†‰‹Ž’—•“Œˆ„{yxvuwyyz{}{zvrrrtvspqrpnrvwxtqrtw{}„‰‰Š‡…‚€}z{}‚‡Ž•‘Ž‰„~xtpligfgiiiloqsuwxywvspnls{~‡Šˆ…‚}xtqnprstuwy{zy{~{yvtrpoolinsuw~†‰Š‡††ƒ€}{|~~|z|ƒ‹“’’Œˆ„~xz}…Ž’‘Œ‰„€ƒ~zvroligjnmmnph`ejeadgc``adgjnoqx‚…ˆŒŒŠ‡‰‹‰ˆ‹Ž“–’Š…}~~}~|yyyyzxwxyvtttqoqtuvwywvvwvvvwvvwyvtuvsqqqqqtwz~…‹’’’“•—™“ŽŒŠ„zvwx{~}}~€|z{|yvqlf`\XURSUZ_fmsz…ŠŒŠˆ‰Š‰‰‰‰…‚‚ƒ€~~~zvwyyzyy}‚}yvtrqpponmlgcbacfjnqux{„ˆŒŒ•••“‘‹‡†…†ˆ…ƒ€}~€|y~ƒ€~}yvx{wty‚††‡…„~{y{~|{yxvttuuuy~…ƒ‚„†ƒ€}zvsqpnmnopqw}}{zwtsrsuuvxzyyvtuwrmnpsvvw{€‚„ƒƒƒ„†ˆ‡‡‰‹ƒ|xtpmnorvvvwxyzxwwxyzz{{{~‚€}|zxxyxxxyyyz{ƒ†ŠŠŠŠŠˆ†„‚ƒ„zxvsqmjlooorux|ƒ‚€€}zvrtvuuuvtrsuy~~ƒˆ†„€€€~~}|zyursuuvvvx{|}}}‚ƒ„{}{wz}yutsrqonoqsuwz|ƒ†‰‰‰†„‚€~}}~}}‚€ƒ€‚„|zz{}„Š‘‰„€yrqpnmllosssuxxy|€‚ƒ……†‚|yyzyyvtvyz{zz{}|{yxvuuuvwz}€ƒ‡‹Š‰ŒŽŽŒ‹‰ˆ„€ztqnljihmrrsux}‚ƒ…†‡‹ŽŠˆ…‚}yuqppooooruuuwyz{|}€ƒ‚ƒ…ƒ‚|zxurolkjjjiiknnonmnpsvy}€ƒ‡Œ‰‡…„†‰ˆ‡ˆ‰‡†……‚€}{wtsstuuvz~}}}~€‚}||xuttvyxwwxxyz{|}‚€‚†……„„„„‚€{vutsrqqsvwywuy~}|}€~}zwvurpnmnoooruuvy}}}€„„…†‡‡ˆˆ‰…}ytpnmorrrqqpomlmoruwy……†††††††ƒ€~|wrrsuwy{ƒ„†ˆ‹‘“ŽŠ‡ƒ€~|ywtqppmkjjlorvxz‰‹ŽŒ‡ƒ}xurmhgfdcdefgjmquwy|‚………‚€|z|~~€‚„†……†ˆ‡‡†…ƒ‚€~~|zyxvuuvsqqrrsvy{}~~~}|zxwvuurpppoopqsvxz…„„ˆŒŽŒŠ‰ˆ†„~~~}}~~~{yyy{}~ƒ‚~}|yvutsrrrpoopruy}}}€„€~|wsqponmllmnpruwz|ƒˆ†…‚€~}{z|~|{zz{|{z|~|{{{{{ywvvuttuwyz{|~~ƒ€~~~~|{yxuspnopruwy{}~€‚‚ƒ„…‚€~|vqmjihggghjmnpu{€…‡ŠŒ‘“”•™™–’Ž‹ˆ‚}yvsqppligfhjlnquy}}}}}||{{|~}}{zyyxxwwwxxyyy|„…‡‰‹Œ‘’“”–•”‹…€xqjda_][]_dinsx}…‰‘ŽŽŽŽŒ‰†…„€‚€€‚‚‚€€‚ƒ„ƒƒ„…ƒ‚~|{{zzzzyyyz{}|{|~}}‚‚ƒ~}zxxxwwvusqoniecba`__begimquy………ˆ‹‹‹‹‹ˆ†…„€|||ywvuvxy{~‚„‡ˆŠ‹ŽŽŒ‡‚|vpjfb_]_abdefiloruxz}‚€}zyxtqqrrsssrrrstvwyxxyzyxvuuvwxyz{}}~€ƒƒƒƒ„…†……†‡††††…………ƒ€}||}||||~‚ƒ„†††………†‡ˆ…‚{uttqopqqrtvvvx{zy{}}}|{{{yxz|}€‚€€|yz|zyyzzzxvsqppmkjjjjkmmnqtuwz}~€‚„†‡ˆ‡†…„}|||}~~„ƒƒ…‡…„ƒƒ‚€~}|{yxwvtrrrstvxy{{{|}~€~|{yxwvuutstuuuuvvvuuvxxyz{|}~€}xtojfba`__adfimrvz|„‰‰Š‹ŒŒŠˆ‰ŠŠ‹Š‰ˆˆ…ƒ€~~~~~€‚…„„„„ƒƒ€~~~~|{{{zz|~}}~}{|}|{|~~|yvtsrpnpstvwyyz{}|{{{zyxxwwvuroljklmnoqsuuvvwvvxz{|}‚…‰Ž“˜—–”’ŽŠ‰ˆƒ|zyxxxwwwwxy{}~€‚ƒ„„…ƒ‚~}}~€‚€~~~|{xvtrpnlkkkjihhiklmoqsvx{|}~€~}~€€~}|||}~}|zyyz{|}ƒƒ„…‡†…ƒ‚‚‚€~~|zyywvuuvxy{{|}~~€}{zzzwuttttsstvvvwxyz{}‚ƒ‚‚‚ƒ€}{yvtrqqqrtuvvwwxy{{||}‚‚ƒ„……†„ƒ‚‚€~}}}}{z|~~€‚‚‚‚‚~{zzxvvvvwxz{|}~~~€ƒƒƒ‚€€|zyxtqommmmmnponnoooopqstuwyyyz{|~~~~~|{{|{{xvvvwxwvwyyz|ƒ„…………†„ƒ„…„„ƒ‚€}zwtqnnnnnoqsvwxxyz{zz|~~~}}{zyxvtttsrqqrstux{~‚†‹ŒŽ‘’“’’‹ˆ†„€|xusqpponoqqrrrsttuvwxyyzzzyxvuuvwxyz{}}~€‚ƒ……†‡ˆ‡‡†…„„ƒƒ‚‚€~|zwurpnmkjjklnpsuwz}~‚…‡‰ˆˆ†…€{ywwwxyxxxyxxyzyyz{|}~ƒ†‰‰ŠŠŠˆ†ƒ~}}{zyxwwvvvwwwxyz{|}~€€}|{zyxxxxyyzz{|~~~~}}}}}~~~}|{{zyyyyzxvuurppqqrrrsuvwwxz}~ƒ‚€€}{yxvusrsuwyyz{|}~~~}|}~~~~~~~}~~}}}|{yxvutsrrrrsttuwy{~€ƒ„……†‡ˆ†………„ƒ€}{zwuttuvvwxz{}~€ƒ………„„„„‚€~~~~‚„ƒ‚€~}{zyyxxwwwxvutstusrrrrrrrsuwzz{|~~~~}}{zxvuusrqqrtsstuvxy{ƒ…ˆŠŒŽŽŽ‹‰†ƒ€}{ywvtsqppqrsvy{}~€~~|{zzxvuuuuvwxz|ƒ‡ˆ‰ˆˆ‡†…„‚€|zyxwvtsrqqqrsrrtvwy{}}~€‚€€‚‚‚€~}|{ywxywuuuwyyyz{{|{{zzxvutsrqqqrqppqsuwy|ƒ‡‰‹‹‹ŠŠ‡…ƒ‚|||zxvuvwwwxy{}}~‚ƒƒƒƒƒ‚‚‚ƒ„…„„ƒƒ€}zwurponmlmnnoqstvy}~ƒ‡ˆ‰ˆ‡†…„„€}{zxvuttuuuuvvwwwxyz{|}~~}||||{zyyxxxy{}}~~~~}|{{yxxxxxvuuvwxwvwxwvuuvwxyz|}~~~~}|{zzz{|}~}}}|{yxxxvutttuvwwxz}}~€~}{zyxxyyyz{|~~€€~~~~}|{{{{zyxxvuttvyyzz{|}}}~~~}|{{zyyzyxxyyzyyyyyzz{|}}~~~~€‚ƒ„…†……„„‚€~}|{{{{{zzyyxwvutssstuwyyyz{|}|{{|{zyyyyyyxxxyyz{}~€‚„„……†††„ƒ‚~}|{zzzyyxxwvvwxz{}}}||{{{{zyyyxxxyyyyyyzyywvtrqqpopqqrsuvwxz{|}~}}}~~~~}}}~~€€~~~ƒ‚‚€~~~~~~}}}}{yyyyywvutttsrstuwxyz|}~}}~€~~|{zyxwwxxxwwwwvvsqqqppoopqqrsuvxy{|~€€~~}}}}|{zzyyz{|}}~~ƒ„…†ˆ‡†„ƒ‚}}}}}~~~}}}}}}||{{|}}}}}}}|{zzzzyyxxwwvuuvvwwwxzz{|}~€‚‚‚‚‚€~|{zyxwwxxyz{{||}|||}|{{{zyxxyzyyyyyyyyyyyz{|}~}}}}{zyyyyxwvuuvvvvvvvuuuvvvwyz{|}}}}~~~‚ƒ„„……………„„ƒƒƒƒƒ„ƒƒ‚~}|zxwvuuuuttuvwyz|}€‚ƒ„ƒ‚€~~}|{zyyyyxxvuttttsrrrrrrstvwyz{|}||{{zzzzzzyyxxxxy{{|}€‚~}|{{zywvuuuuvwxyz{|~~~~}}}~~~~~~~~~~|zyxusrqqqrtuvwy{}~€‚€€~}}|{|}}~~~~~~~~~~}}}}||||{zyyyzyyyzzzzzyxxywvuutttuvwy{|}~€~}|{yxwwutrqqrrstuvxy{}€‚ƒ„…†††††…„ƒƒ~}|{zzyyyzzzzzz{{|{{|}}~}}~~~~~~~~~~~~}}}~~~~€€~~}}{zyyyyyyxxxxwwwwvvuuuuuvwxyz{||}}}}~}|zyxwvuuuuuuvvwwwxyyyz{{|||{{|}~€€~~~~}}}}{zyyyyyz{}}}|{{{zzyxxxwwwwvuuuuuuvxz{}~€~~}}||zyz{zzzzzzyyyzz{{|}~~~~€€€~~}}}}}}||||{{{{|}~~~~~}|{{zzyyxxwwwwwxxyz{{{}€‚‚ƒ„…„ƒ€~}{yxwvvtssttuvwwxxyyz{||}}~~€€€~~}}||{zyyxwvuuuvwxyz{{{{|||{{zzzzyyxxxxwwwwwwxyyzzz{|{{|}}~~~~~~~}||}{zz{{{zzzzzzz{zzyyyz{||||}}~~€‚ƒ„„……………„ƒ€~}|{zyywvvvvvvwxyyz{}}}}}|{{{zzyxxxxxxxwwvuttsssstuuvvwxyyzz{|}}~~~~~~~~~~~~~~~~~}}}~~~}}}}}}{zzzyyz{zzzzyxxyyzzz{|||}€€~}||{{zywutsrrsuuvvwxyyz{||}}~}}||{zzzyyz{zzzz{||}}~~€€~}||||{z{||}~€€€~~~}}|{zzzzyyyyxxxxxxxxxyyyyyxwvvvvvvuuuutttuuuvwxyz|}~~€€€~}|{zzzzz{zyyzzzz{{|||{{{||}}~~~~~}}}}||}~~€‚€~~}}}~~~~~~}}}||{zzzzzzzz{{{{{{||||}}}||{zzzyyyyyyz|{{{|{zyxxxwvvvvwwwwxwvvwwxyz{}~ƒ„…………………„ƒƒ„ƒ‚‚ƒ‚‚‚‚€}{zzyxwwvvuuttuvwxxyyzzzzzzzz{zzyyxxxxxxyzz{|}}~~~|{|}{zzzyyxxxxyzyyyz{||}}}||{{{|{{{{zyxxxyyyyyyyyzzzz{{{zzzzz{{||}|||}|{zzz{|}~€€€€€€€~}}}}}}|{zyxxwvwxxyyz{||}}}|{zzyxwvvvvvwxwwxz{||}}}}~}|{{zzzzz{{{|}}}}}||{{zzyyyzzzyyz{{||||}~€€~}{zyyxxxxyz{|||}€‚€~}|{zywuuusqrstuvwxz{}|||||}}~~~~}}{zyyxxxxxyyzz{{||}}}||{{zywvvwxyyyyzz{|}}}~€‚‚‚€~}}}{yyzyyxwxyyzz{{|{{{{{|||{{zzzzyyxxwwxyyzzzz{{{{||||||||}}}{yyyxwwwwxxyz||}}}}~~}|{{zyxxwwxyyz{}~€‚‚ƒƒƒƒƒ‚‚€}|{zyxxxxxxyyyz{{{{{{{|}}}}~€}{yxwvuuuvvvwxy{{||}~€€~}||{zyxxxwwwxxyz{{||||}}}}}}~~~~~}|zyxxxyyyyzzzz{|}}~~~}||zywvuttuuvwxyzzzz{|}|{{|||zyyzzzyyxxxxxyz{{||}~€‚‚‚~}}||{{zzz{|}||||||{zzzyyxxxyyyyzzzz{zzyyxwvvvvvwxzz{|}||||{zzzyyyzz{|~~€‚‚ƒƒƒ‚~}||||||}||{{{||}||||}~~~~~}|{zyxwwxyz|}~~€€~~}|{zyywvuuuuuuttuwxyz{{||}}~}}||{zyyxwvvvwxzz{|}}~~~~}}}}{zyxwwvuvwxyyz{||}}}}~~~~~~}}{zz{{{{{|}|||}}~~~~~~~~}}}}}}}}}}|{{|||}~}}}}}}||}~}}}~}||||||}||{{|}}}}~~~~~}}|{zyxwvvvvvvwxxyyzzzz{{||}}}}}||{{zzz{zyyyyyyzz{|}|{{{zzyyyyyyz{zzyyyyz{{{|~}}~~~~~~~~~}}}}}}}~}||}}~}|{{zzyyyyyzyxxxxxxyyzyyyzyxwvvvvwxyz{{{|}~€‚„„…„ƒ‚€~}|{ywvuuuuuuuvxxyz{{{zzyyyyyyxxxyyyyzyyyyyzz{{{{{{|||}~~€‚‚‚‚‚‚‚€~~|{zyyyxxxxwwwwwxyz{|}~~~~~~}}{zz{{{{{{{zz{|||{{zzyyyzyyyyyyyzzzzzzzz{{|{zzz{}}}|||||}}~}|{zzzzzz{|}}}||zxwvuuuuvwwwwwwwxyz{|}~~~}}||{{{{|}}}}}}}}}}~}}}}|{{{zyyz{|{{zzyyyzyyyzzz{|}~~~}}}~}||}|||}}~~€‚‚ƒƒƒƒƒ‚€~~}}||||||{{zzyyyyyyyz{|||{{zyxxwwwwwwwxxxxyz{{{{{{{zzyyyzyyz{zzz{{{{{zzz{zzyyxxyzzzyyxxxxwwvvuuuuuvwxxy{}}}}}}}}~}}||||{{|}|{zzzzzz{|}~~€‚‚ƒƒ„„…„„ƒ‚€~}}}}}||||{{{{zzzzyyxxwvuuuvvvvvvwwxyzzzz{{||||}}}}}~€‚ƒ„„„ƒƒ‚‚€}|{zyyxwvvvvvwxzz{|}}~~~}||{{{|{{{|{{zyyyyzz{{|||{{|}}}}~~€€€€€~}}}}|{zzyyxxwvvwwxxyyyyyyyyyyyxxxxxyyyz{{||}~€€~~}}||{zzzyxwwwwvvvwxyz{|~~~~~~}}|{zywvuuuuvwwwxyyyz{|}}}}~~~}}||{zzzzzz{|}~~~}}}}||{zzzyyyzzzzzz{{{|}||{{{|||}~~~~|{zzzzzzyyyyxxxxxxwwwwxyyzz{{||}||||{{{{zyxxxxxyz{|}~€€~~~~~~}}}}||{{{{{{{{{||}}}~€€~}||{{{{{||}}}}~}}}}}~~~}}||{{zzzzzzyyz{zzyyyzz{{{zyyyyyyyyyyyyyxxxxxyz{{|}~~~~}}|{{{zyyyxxxxxyyzz{{||}}}}~~~~~~~~~~~}|{zyyxxxxxxxxxyyyyyyzzzyyyyyyyyyyxxwwwwz~}}}}}~~€€~}||||||||{zyywvwxxyyzz{|}}~}}}}}}||{zyxwwvvwyz{|~~€€~~}}|{zzzzzzz{|}}~~~}}}}|{{{zzyyxwvvvvvvvvvwxyyzzzzzzzzzz{zzz{zzyxxyyyyyyyxxxyxxxyxxyzzzzz{|}~~€€~~}}|{zzzzzzzz{||}}}}}}}}}}}}~~~~~}}}||||{{|}}}}}}~~~}}}~}|||{{{{{{|}}~~€€‚€~~}}{zzzyyyyxxxyyyyyyz{|{{{|{{{{|}|{{|{zyyxxwwwxxyyyyz{|{{|}|{zzzzzzzz{|{zzzz{zzzzz{zzz{{{{|{{{{zzyyxxxxwwwwvvvvwxxyyyz|}~~€‚‚ƒƒ„ƒ‚€~}}|{zyxxxxxyyzzzz{|}}}}}}~}}}}}}|{{|{zyyxxxyyyyzz{{|{{{{zzzzzzzzzzz{{|||{{{{zzzzxwwwwwwxxyyzz{|}}}}}}}|{zyxxwwwxxyz{|}}~~€€~~}}}}}~~~~~}|{{zzzzzzzzyxxyyyyy{}~~~~~}}|||||}|{zz{|}~‚‚‚‚‚}|{zzzzzzyyyyyyyzyxxxxyyzzzz{{{{{{|{{|}}}|||}|{{|||||{{zzzzzzyyyyyyyyyz{}}~}}}}||{zyyxxvutttuuuvwxz{}}~~€‚€~}|{zzyyxxxxxxxyyzzzzz{}}~~~}||{{zzzzzzz{{{{||||}}}}~~€‚‚‚€~}}}}}}||{{zzzzz{{{zzz{{||}}}||{zyyxxwwwwwxyzz{{{{{zzyyyyxwvvvvuuuvvwxz{}~€‚ƒ„„„ƒƒ€~}|{zyyyxxyz{||}~€‚ƒƒƒ‚‚‚‚€~}|{zyxwwvvvvvvwxxxxyz||}}~~~~~~~~~~~~}}}}|{zzyxxxwwxyyz{}}~~~}}||{{zzyyxwvvvvvwwxy{|}}~~~~~~~~~~~}}||{zyyxxxyyzzzz{|}}}~~}||{zyyyyxxxyyyyyyyyzzz{|}~~~~~}}|{zyyyxxxxxyyzzzzzzzz{|}}~~~~~}}}}|{zzyxxxwwwxwwwwwxxyyzz{{|}~~~~~~~~~~~}}}}}}}}}}}}}}}}||||||{{{||}}}}}}}|{{{zzzzzzzzz{{{{{{|{{{|{zzzzzz{zzzzzzzzzzzzzzyyyyyyyzz{{||}}}}}}}}~~~}|{{zzzzyyyyyyyzzzz{{|||{{zzzzzzyyxxxxwwwxwwwxyz{|}€‚‚ƒƒ„„„‚€~}{zyyxwvvvwxyyz{||}}}}~~~}|{{{{{{|}}}}}}~~~~~~~~~~~~~€€~~}}||{{{{{{zzzzz{zzzzz{{{{||}}~}}||||||{{{{{{{{{{{|{{{{{{{{zzyyxxwvvwwwxyyzz{|}}}||{{{{zzzzz{{{|}}~~~}}|{zyyzzzz{{{{{{|||||||{{{{{{{{{{zzyyyzz{|}}}}}~~}||{{zyxxvuuuuuuvwyz{|}~€€€~~}}||||{{{{{||}}~~~~~~~~~}}||zyxwvvvvvwxyyyyz{||}}}}~~~}||||{{{{{{zzz{{|||||||{{{{zzyyyyyyyzyyyzz{zzzzz{{||}~~~~~~~~~~~~~~~}}}}||{zzzyyyzzzzzzz{|||{{zzyyyyyzzzz{|}}}}}||||{{zzzzyyyyyyyyyyyzz{{||}}}}}}}}}}}}}|{zz{|||||{{{||}}~~~~}}}}||||||||{zyyxxxyxxxyyzz{|}}}}~~~~}}||{zzzyyyyyyyyyyyzyyyyyyyyyz{||}}~~~~}|{zyyyyxxxxxxxyyz{||}}~~~~}}||{zyyyyxxxxxxxyyzz{{|}~~~~}|{zyxwvuutttuuvvwxyyz{|}€€~~}|{zzzzzz{{||}}}~~~~~~~}}}~~~~~~~}}}}}}||{{zzyyyyxxxxwvvvvvwxxyz{{||}}~}}||{zzzzzzzzzz{{{{||}}}}~~~~}}}}|{{{{||||||||||||}}}||{{zzyyxxwvuuuvvvvvvwxyyz{||}}~~~~~}}||{{{{zzyyxxxxxyyz{||}}~~~}}||{{{{zyyyyzzz{}}~~~~~~~~}}{zyyyyxwwwwwwwwxxyxxxyyzzzzzz{zzyyyyxxxyyyz{|}}}}~~~~~~€€€€~}|{zzzzzzzzzzz{{{{||}}~~~~}|{{zyxxwwwwvvvwwxyz{||}}~}}|||||||||||}|||||||}}}}}}}}~}}|||}}}||{{{{zzzzz{{{{||}}}}~~~~~}}}}||{{{{zyyyxxxxxyyz{||}}~~~}||zyxxwwxyyyz{{{{||}|{{{{{zzyyyyxxxxxxxxxyz{|}}}}}}}}}||||{{zzyyyyyzz{|}}~~~~~~}}}}|{zzzzzzzzzzzzzzzzz{{{zzyyxxwvuuuuuuuuvwxyyz{}~~~}}|{zzzzyyyyyyyzz{|}}}}~~~~}}|{zzyyxxxxwwwxyz{||}}~~~~}}{zyyxxwwwxxyyzz{|}~€‚‚‚‚‚‚‚€€~}}|{zyxxwwvvvvvvwxxyz{{|||||{zyyxxwwwwwwwwxyyz{||||}}}}~~~~~}}||{{zzyyxxxxxxxyz{{||}}~~~~}|{zzzzzyyxxxyyyyzz{{||}}}}}}}}~~~}}||{{{{zzzzzz{||}~~~~~}}|||||}}~~~~~~~~~~~~}}||{{zzzzyyxxxyyzzzz{{{{{{{zzzzzzz{{{{{{||||}|||}}}}}}}}}}}||{{{{zzyyyyxxxyyzzzz{|}}~~~~~}}||{{{{{{zzz{zzzzzzz{zzzzzzz{{{{{{{{{{{{{zzzzzzzzz{{{|}}}}~~~~~~~~~}}}}||{{{{{{{{{{{{{||}}}}}}}}}|||}||{{zzzzzzz{{{{{{{{||||||}}}}~}}}}}~~~}}}}||{{zzzzyyyyyyyyyyyzyyyzzzyyyyyzyyyzyyyyyzz{{||}}~~~~~~~}}}}}}|{{{{{zzz{{{{||||}}}}}}}||||{{zzzzyyxxwwwwwxxyyzz{|}}~~~~}}|{zzyyxxwwwxxyyyz{{||||}}~~~}}}}||{{{||||}}}}~~~~~~}}||||{{zzz{{{{{{{{||||||||||}}}||||{{zzzzzzyyyyyzzzz{{||||}}}}}|||}||||{zyyxxxyyyyzz{{{{|||{{zzzzyyyzzzzzz{|}}}}~~~~~~~~~~}}||{ \ No newline at end of file diff --git a/data/tbl2ship.tb1 b/data/tbl2ship.tb1 index 8372cfd49d187c6f55905efba6b348fc121dafee..2cacedba2e20f5a7fced73efe558eeaacb1e44db 100644 GIT binary patch literal 18756 zcmds9O>A7(bw2OS6NgmNdTfaz^%HAqOTxreVm4M=+E%S`lQd&Tu?K|`ObWIb)O1YS z0z5^OnrRq!9!--}sy0){K?!uyPHHU%t=keUTM&g7Tntby1cU{=;6e+c)j|s|xbT9D z*Prj4^X{EHe-ek50-?6>bou7aJ>Na&-0%FnN9CV=?u85a-+u8MzxMgD1KaEA}A{%AXQJR3>*+8&P!8Hn&DY#0(5(SGC%urCGV3L9Y1?MTqVjUMvl#QZv6agjO zyh+!u)5?kgRH8xwfF`a*+2tr*kEj~am76qkoi47>M3vQWP1I11CW@kl6A=ZifOetL z?ak=sYP4C6HfEyriRfB3T1iKBik9eRnXX@=l_FL1H1{PcouNX8vaUL#iO6nXi*Byd z^%YvFQgx2zE>fvLg)HXZx)E({M4OH1!)wv?<*0Erx>k)=E75W}x>|~=#qIYdZe1zd zSiG=N&acm$zc!s)DSfFvm90<ro{C6K56+W99tmOXo8eb0;RU=?iC%<;F*|W257z z4`$MzRtN38HZqyU`Ap+drcuo_8kuS%bE%Oz&v(Z%jfqTSG1FMd)Ek+ZMke1looN&@ zjk!!?ndg4c$dntI3z!RkhUu76V>^ zuVLX3V`ddWIRR_3CNKbo_0S8X%*1?rs~9ktsp00DD#A!q>EWni^N8l|V{GrReM#(_ z68pv)gSL5tcUN6u0k#l3vXqC|UKy2+ATWR5AX)Gz;iUpE9e87bmxZ~-=rBDTpt3iI zk#(>d)=ULhACc$(k(A5A6@6*!VdkIO;SM%vJ7{fs!%6?a9%O~5|K4njH&ByCtHGshe^Wtw=@wYLJ z8Wz=`w~>Ixsdyt!Dk8~}CQd5x&Umm9{#F?qX{I6$9#=o0qj%eoXs~e7A&)h~X`5$` z;qKKU-{qXjljI6!l3>(gBVhQELk{gRt0N^77_5J(4HZ=KZaQJW zU6g5g{)(fGI5`xC@x=#V5kFl2Ok3&|Zt8uunxv89U{GU=U7FhHAk6y>&yR&?Bu8a# z_c~Jxn>GvksgvA6GdMwfh+-Sr>@+rz=)`2j1X?}`qZ6I;inxy52Y60|>kkT~5=cg< zFHS+h)mmjpT#Ivcs~`3Uc*Qa*7uAm+Za!>_i|`hF33u3kc#il_r(&vvQX6iyM%3cXe{9^gQy<`)Vl$4zrYK_T*}}?y%y(S(3`6|&03j_msw-ZaRVxE zs0c;Hz;FzqI@TV~LoA`H&zs`XCvoce;EQs!v_a71xap_`Re7tEobc1?x(8bgB&AR#usV?_ z*%BQjjd{}?^AmfMKASm;KVEHb(x+wPr|c=_3Y7a896M~n(3&mt_FG-z#BAn>57KV6 zg&Y%cB%}%zX>7hQ9U-j zbZ_Dxai6t>RH5kxvi&$HWA9SqYqk4Rr3DrTHNpfrn80(AB}qqFjhf1;33e-8l7E}f zB10DAstCwZq2NaD6#b2Zgo^?RG|enU?1*fQn?fCK!0EJ7H{7Gm`fi36*Kuj>a;V(* zg%E@#IOo@n7V0UEZb;HNPpfJ2yeqjjZI(1u@Jn45>o%>aGAQwCt6Xh@p@I`FHATlw zFmPZS4f1~1))SEg-zcRGJ$H#b%xE4~`nyoTGL|j?3H`?$@ zS_7UEWtNpUO!FZ?y~8CBc3Or}j&N#(W7q=q$3xpVN{P#bzs6OgJg^xq9o7N1gXoX@ zI!&(VLbpR@4VT4Hr-r5TDG@F6ptSEmYxP~ivsQ*$xF7wrOJ;SDuE?Fk7zdEvS&M+C!);G(~6 z1EXauGYLmzwk+sKE$iTkS;+do&HuH-VA7H{S$}7Fz>=PZKSxm9Ch8>%e!>|w4x0J{ zJO_zT9$6N5=1p%Cob!Q^m0+UFCN$LQra1KyU+pD@KgAqufBKNgC}bTZAt`X_&td() zx7>y3U;~8Bkx-y%hYDNZ{LnfxcyxwL{gHtOFwJCpbG=Guk{~a~N(S zRRT5;2p0IQjZ_vmM=YaM$VcqZ8M)8@C}w6Tdbx5uFa2XgcT!z;-k_4EM3pFpx>e)6~t%`;AWv-`Mjod05v6=&ckP?{8ri@vxmiIo+=(j!fTW*lxF zpRd373s6z-ISg3mW2p_KZAZ0Ev}uynq;u;3wQqRc6c}!zjo>%ob(_=FXCLsMl5%MV z2bnQ9*-t}c!sO@bjqE24m@Z{phB)9~lyvS@WtBLc%X1wX2glkS zS9ZeU7(XWx21YLNqDgM2S{BbD@kn%EAHKZ}_5gTvKfu6E2X=yQg3GiPL3!E2YjKFj zM>*{^!CtVM*sca8BX;nb5>r~FNX-aN6JNr7e5;tSF~x-V$zTkd`bLM8X2#ockZa!l zHTE>5k?}xiP|2`)(|+ol2qZHmp8;K%23MSEycCSVr4B~{!p3O!yQ}Rvjg{2cg#rzvLx68ZO3-1t#Y>k$6l3;*)dZUk)uAX~@B};_C)@i#;K^<_+W%1A^HdyG-bg-8t^qx>I-XfB`Uo1YoIz$LZXp zAcwh6nk_sIAC~thq?^RZ6DDJU=dey(?_%lDRcW6cxb*0b?F2h$L(7X-637Q6B@m@$ zrKg(Wr*eP_4F~yz==lV^Vy^H-BA|ty+o2k-kmrNj36_{QAZ5Tluq94w23_W;8!RKA zVISxMj42Ub>I*6$eAGdB7+NA4wuGR3ZewDcibHjf66Yy>SA;BWw zX=pvIT3@)aK<+P#Gr%Rvl4BG(U`f!CHB(9vyz99_+Rp~Y&`{V&cOBiH(l?vxDGdKt)Rm+WTyL61fS$frd{a7rES3W4hq75zno3hW!N(Qc?+a2Dn5H?L_Wqsk-EW8lG)&D=E1Q zFkgrV+guCFvmO-7GG8+>PW$mZRFB?k3xnTYnEGyV1Ijtx0qM*=llyv-An}AFeOzUM zXV~-M|5NCaNhXO+ttGh9=Y-au&y2`6&%^`Srpf%VP2>{XKE(lK%8Ix7u84bjcOp1v zmNtS`6TQ}a2?XWU&LIaTdaTFF-0kNF4RBqPjjK`QyGVDtqJ1f>AMy$p7>I&lEkkgsy{M|x|>#NabAdq~3sP|sq}xh$(%4q&fk`BOp51m3bN zSV-4A%?BsVQJCkHkZ9cjC)a@3R1SSJcq34~jD6jk)jo&xo~2|_jG(n{vih|yI*b!? z%$dSlvP>+}(EFByt$j7GqVKWr8`s8Btx@#(yU%lOx2DE5eSC=^E96!|bs(=c#m?Vc zle@JQLx9*6pJ==+4g0<#IPqdbe+@LEA#scr7;$NNCm0gu4zX^VFeastVQdA+Hpu< zRRr*>W*CeV_41lr3z#lO?*L=FjxV=qW=~*{2;!_s3Y6ypO28}fE}G#T!CSCF%*6aL z**>4R=TWQ?;Wg1uVy3$V=GFTR#-2=*5|yTfaLk)d9LvA}sBQIilx8^K(69!IkWb6{ z%thaagtOr_(X_1goYl;pApOc+0`r=M(N}ZcoFGkOa1b;=AfT8RO4l{GE5FI>Np*Qp zTapG>&XU{fTs%TuwNLj00F^iri9v~{cLT#3;{Gr0+7M`44M~#lgd_=gOIaSQa~NU` zNXLWgFFc9nUlHO`UBx!&A+<51MT5B zxS`6vu=m8CL_Z<1=_{>Dt_-E{n7#`Dc?qHAF&vR@{8v@Fv?al5^7hNByK#Pg7cS|m z>005!xOgz(<_UeteRj_ht!4XE^<9v-yY%BXWoz<#8PlVzw@ytij_`{CIrX3Kx2jQo zm#rATr``48DUl;$s+Y0krTx8&(8n%G-V3)!4#mfTGh2|JKLBPc1)W#F#P>U|oipW* zFULxIDSD=qHBbbbqW!s+8&Bq}qY z5Jt(*v@l?rqTlI%7pnZha8P?w!bPzc`Sas%2>!OKKRbA8b{$~Svs0(hm2!X7eRch! z0WXa#;WXjxLDB!4&>?57DSv)&a(?>t`JFD#$sg6=oo^hTaJ zHCul?oPK0>>ap3Kky+c=GZLBza4*mW?BQ*-+{1|j@&I2_kAo)sTsTHce7IXIUT zXJQamCjp3#CdUV>KGp}`K+tw>zO@g&TMwCsB)~m9NNf-xsN2?yEy(10CZfD zlmeLFai3@MsYJ4|gvRngA(LlSSL%3DNbaT65Hfg4%)A1#T@JuYHhT;myV!~=fc4Q63dQq z+o!}5!yWYQ5*=5l=%BFrDEBtUaiHezin#L5afs`o4favzbTvPwu3j_1ktayZ$-+F}wI$I5-^E)jD|p4Qt{G{TvAkI7f?n zT@C;8hCaUetQid0HT(D87sA0&Zsx#ex-2^?hXTJ!-|wMlS$1~tEw7Zp`ZCxT-inv) z-xck$0|RMbJ}p;tNOZyf4F{p^v*E22j&gHM?@M|3ySxj$Z^_5}ee+_{gmd$%O#40j zMhTwV%k`&x(7b12H};<4ACvz>-iKZ82fvRl2hm|(1YgO?Z@}Rz_%WGmxk)4Pb$yH8 zyqutmCknhs^4A~O0!#m!ESTZR^gF1diT=|ZsBaGO1Kj_TkG|=p1EN=D{2yT^<)!ft zq&$RDBYlyu4B4uo@@Ej%noA2BG($_^Hw`B6yTXy8h M?;$$dq=D4`0coGcG5`Po literal 24348 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 M23-S?)0mn62hV$lkN^Mx diff --git a/data/tbl3intr.tb1 b/data/tbl3intr.tb1 index 5731ce35f983cb39dcd746a3e6b5ad86ad21b2f3..cf2c5948461f86307811d64af452c0c24047bf9c 100644 GIT binary patch literal 8868 zcmeHMKWH0Q82{eoA}L0)g)34um~fa3H<;of6t`r!f}sj^TTw*Oph1HR863F5lms+f zzz`1}G<48#g9i^9G6;Hu2MrnyszJjI88mqCpdo_?4}o;}DE;0$o&2PerHkWJmfGg? zyZ65LeZTMbzI*?!`2EwLOT}M*`R$vpH@~?2I}83#6Pf_cCKvRt#ET{VgY;WME?q+1Z)rd7VzjaU9ZYG#W=oN3~kbG|k=JUFudS6t=duHa0diO+$bSfOCMi09}AK zKnvgmpaF0QPy;Xlb^*!&I{*d%_WO8xinfil8dfT37$}Tjvw{r+4>f!NgFWa~!6|{g z1BiXZQ$!oFhW}LXy@BsFd=G;@^jvV>fNjIU0hoJGE`ecyhZPqM2eo5_`T(pR>^o4k zp^yDGp4wNubXj9&I} zaEg5!y&85a*f!A7unE|Jfd##NaH?Pz;b0rg$57V6kmgAu6cSq&3!;)teyS1J6i-KcrH=h~D zyHD)uR=x80u)Jv%H}-e*y~3l4p_QJj6}IxmW`1iUr)z0HLBrD3b$3U1_jT9SU01hV zec#o0cNQs{x*NJ%*4+c$ZE@W@KMcZF0Y z6s#^O+!0OcR0UzdR~X7k3r(`1l55|{M62lTyS_WEX?Dk1e&>c3Md3Q$#1KqlyZ*Zv zn(u~#bsP-qsL*<_Y?!RIK2(@^>`<$k@t%=noj_++rJ~fA6JCL2##5&CT986!9)`IJ zN=wOj+azbl5>?Gpgr>m_Qh6pnT!DL^ubl8`bP_|Gm%=jdxVmzl%Xs%g^$DRreOzwa zRBGHi;apxhSMHfvl7vucsXWXp%&B?UKG9&3na=@Id`=rCup&GzNjOz1XS_7WS@m&d zL#<2WI2UX-9pY_?qb>SqmnF26Ld1DG8rqo5%Ix_mo#JQ>A1yf*8GDrj*$`S4jAdpr z=-gqZlC1v3%+$0&ycI_bvT3XEW#Ee?>pv!|w5Uz>NC`XvKEXrV^h1-A$`5=s9GX>N zppnx%l2k?jUO#)8>^yzl_#-|5V32pk(tQ}JfT2(&GZVr)1Nh-}_vQ5@Z=DtM5 z8XPA8XeOa-50Y@ve#Kih(h zU8FD8N%@eZ(AGvFP+Uyp^Qb0Ro!6wGRAFIN4C1vxEznVp@CbMh3AP9!M^ajCA0|9S zV176c^DUb4HC=!CZi^N}yg1q~%%q=FDs&OE525a^{N@};a^pO+g$=0%rSjprrU2?0AX zf}Qc?H}Rt|$7EK@ZAb~UDGBX^n=%}eSw1raDX}EbE=g$Rsr#e2jmaz>ZANI*0&QAC zd*kel$t>Rp1>7z(Ex}(mE|(?D;Z0G*86#HX{IKRDhmHbunzVo@# zA6)4~T9HMUSdEWXmsC76sqC-F;lpplv53j6zxb}RBH>&o&S}qZQ&w-+)Oxa` zBrTQX%K7@Ip}H+o;S+s2=_$#UlB}y-dc=f-be*i@|U!uKsBcd2Wln|hfOF`pOg zPQLx{PrIAa>B+CTapuQrJbcIaSU%*6^ zcyOAYdeys^1%T41K1F>M@3n)9*QHAg21F3(0Hl zW=9{Ycr4Sdi)Dr2bHLR%FX}b3l7BUmbS56_*9`k*X-T>ig2i-8aSu6%g#AF0QnOaK4? literal 9366 zcmeHNOKuxS5PdzO$=js&HEpJIsf^mUtb&@ zL;kDr4{9|j_*YIAbMhbYPmV|m^^1$IU%x&*J#DpG$H&L@dYv`*_xJbq_R8gQsZ`qB z+~j8IbUK+#ZftDWwoSlm;3e<^H~|{KA#ecf16805lz>ej4`curpmv*%j>z+1YvY!#2c2H?zyN;rVHnkgcj9t=@_7bSXpnnIc8%Z>_Btpxu~kRGlVND6 zFjS~eRAE>rh*3auMD$IYI!Dy@s8yzu0ySK!+f)PXqf1JKMgKk+pHhFF1bH@#{{_cgnt#^*0h4$932+&t%CK*b@CQrL z4|JwgT2?O^9el?!F|a1JT9HCx7KWJ$)|HhQykj|?%e-m>OKF}-gIt~(AE_X{&sL5O zxObx0Ha{!NvSB*)DVrGNL-kRmKe=D-+mt=(opB~ppRDz+%aRdVR}o3`2D3d2+Z_$Y zME4_L%X#uTfi30HF>pq>oEXF<&JP-=8+z-E;#{%Wcqnd;M0>8$CJnTlLLBq>d}xVXKSH__`5$k;) z`@l65opKJ3;g3po$C{m)SDJfz5<7M(P+_@dNGk+G#QN`JJ+XW+mV%)nMO0aXiLz@6 zfY)Vw%W^81>}X^-4=ov)ijEA=S7T#8J2f%^3>l>d1fwHkN*yI}-C4Y=ktsTVl+5{A z&OAo)$j4xM)RR))2vG@_QGjP29vw!~J`4agJm+wYOI!5QYCEAP-lCZX26s7F0`7Ve zD;nHgT*gIT(=Ses_Ub)~zOCUIG)qG|%u%QzFsum{`jSB~qAa9U|IQ$|a(7wArl9UH z1w|*z(pbcIq616e-uM`n34EI7jnr23O6~TxTEFb7|@Bx9zkSChleV6iZKeR^X1QV zkEn(#a8WcUL=}bTkV0Z$j^Z!Czf|MKSb(jN+XnI{cZ>W|jmsG(NE=5XcMRm_((nZ_ zU#f9Fg$T-G~*@EL!hK3b}Az35lPIb*JJ zU+})=ZqZ(b!D_5;#V#T&Q=h8$f$)9}hA%hbv4Iu4vSPi6lmm`xSm%x-H*9bPPQ%ww zL#OsFOefxPEtLNc;?%qy(g*xw<5Z|??l@9b;39k_+cFRJ>Zmn#ue<2%x&jyB`|~$O zU+4ql*v zFSGfrx60gQxBH!VD?a>6sM&?@>P>~Qhu^DbjBWgqi@F^FGk;vJ_3Ia qUEgQ<>Z7>e+wz$FUe7KruGuZU9Qq3Z^RET|FHes^>ff`O|NjFMfpaYY diff --git a/data/tblev3.tb1 b/data/tblev3.tb1 index 1d0812cac69c1a1ee5f7ea7e6eb3c95a8864c66a..ff15cc45e6242902f448d1c703331c89840f27c4 100644 GIT binary patch literal 8964 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 diff --git a/data/tbma1.tb1 b/data/tbma1.tb1 index 9d9e058274299c2d9b9bdf52b772afd7c60238bd..8fc5c508db3aff74dc37e9a08103d6fbe58a6474 100644 GIT binary patch literal 30579 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 wQ8%e&X`Ii*wQE zec$=M`OcXcdv-S{L0zy8XU}}!`#$gU{(fh?%lLf{{K={DPk-{y?z(;CfLa??@}C8@ zpwz+wUGP7r==K!-C&GVEMG;;2e{lQOTW`Jj=9|rCb7f^^X=w>7XJ=<$eDTF|=gyVO z<sdGw|l{&4|giGNuSd(v(cD~g?p!oE85N5W3yBscquF9KlaHpjMRj&b zmFCoXw0k_J>(6B7V5c_At;M)`$E%|+_POX}Q3^~92zoFf`8 zFb$Pxvcxpp5-C3pXaGhx*P~0z(fVA}JQuA^Mi+|FQa)Nx(X6^uQ5VmurIMN(SJNj{ z`A#)aP(_>0XfiSewA7_Fb#X~8&8fL*HT{GtPpF9^)^EHSwVKiTYV@lM(Z$7R_4Vk& zT(sPX7Aw)~%%8gV*x2ad;>h9A;|B`)T@s+(*VRH{^<-i7Y+-e-u)129TP>VjEu5sM zBZbw;!s<+6b*ZqhS~#~_7+*bJSe+=WP8U`eY3&=Uh01E-6xJf1Gv%zi`SDCSbT@}G z zD|<6z&!$`HxC(=lBOn*mVqS$Mu853$-qhNs7`fp-Xgmacqh8SMz1$gLjujPv(u$RDTcG;@ULn=os-)y%5n`Mc;2jg2rqYZnnkO|@GR@n1i zB)BV{TPBT$SZhm1sr9e}nD^%J5sQ*qA-WP9_cMT9maZ#+N@e--K^_|zp2)uj>>6WI ziYd-@?j+*5lTaM_*BE;jGKO-E%GSPKQR%QHP;ncq%GtXlgsz~Zm>L_P{aMw!%`+is zccN5$K_W7{<#Y_`DTE(NbLrlDmFA!`0xghBHy3HfA~b#9>hSdYa85Do zk?uEaZ*72TM{qU*#KJ%{{8hh03E+NL2cB$0fPk4u`O;Yuh8^YOPGcQg-;X?25m^56elp%k+ z>l;6mq9H_?aNwB*Q%@r85}B_X<~6 zY)&UyF8_RIyQyP><-5e_E=N&&*ER6MKsyooQ`d1*SAtw)9lohx4HH^UhLhTd24YeXsw5&u}eayR9Y(&+wDHvsk-Ub zj^OP#=gBBCy|wE#c)wjXRIITvf^Bz>WeOy_&~B?0@1+{^Q0eb&gY4J3d4K+6;fv7E(0hCh8TUvZDU z_w)Uy^%HCT|K4qVhyE4SNT*wlYT!+XUzvTzx{>GIS6ZnWu<;p7&NJyv7P5(tJe=Sv zvtK1qd>YmFkS`B|=QrdAi?K$Yw|AvmU$Mk?gs6s(W3QF~?YK8e>F{oSls2l(4S(8} z&|d`s#+K(d!soYy3ew2@r1>MT;Tf6c#;BIPY;`{?Tu8=xEf#+a!A9E!Oa<=Kn<-x4 z8WrY7bXh|BDq{V_1tt+E=85Ps9D-!Imk2S-Y~gS& z#U9H6a!8Y_&-XqU&&L!tmXzBlBDyZB+ZQls5S+r#U(u_DC_ z+&%*3Q?l`GwIa((hx#aeyR2}tt&E1fqaor)@+mu)_GVXv;UK%>Wm_phn{7$(h+nWQ zt(PGr+8Q}>vT^J1QTvHV$RZs&Vj*9mbQ@0v!1la`XW?|RoA~Gr{e+gGs`qjk1)F>% z(W@;b30?Pqgy$*ic~(awZ0UTY^~%FG64bXY^RXpsN!!Eswidb1CCUQJF(J{L1h&i0 zwH-*%G*VOuBqKq*X{V>1ijzr z1Mv)%tjyTR6DH^|Ku&pFmndcs3>-YN-A=vVEjIF22DP(>`aYFkSA5rx4Z|4oK!jM% zwH+-KQ4%FYT}^DT(!Ldvkz8(Z=t+gC4?SYr1co+^tnSZ4PA}_Jm~9wf13PVkE$SqW zFey#BXL*$EvW)i*QXa3I0aho46uIE)qHWh*e&XImYaz8e@2mZmS zFw-(YwYlm?g47MYvJ(tucd7@J0|rc;f1Yd zSR>}`XG~XO*V7TKkNF6&9g3vctBX>n8c1AmjJ3yUUL4Dd?B;GO{B|ax>rl{50t$$I z;Ozu6*ATXy-!BbF0%QK|&C9TnUOb!Z@ zMuINRSIfB z6y6RJe%Q`UWFP-ALsx4`=ZE%tC&-KiUjJTstXEVd%;xe9qW4zOYa`ri8?(h(>?pw+?eyJc_Qm$E@o!B2V)EaFnx~wPNYiQ`w?T@~*(BD4LF1^>j7YUtjE?^h$lJ6blntY<=*n7Lbn}96`7(az~ zmcDBSp6mFEdpyBcPPpQW9%$dgdLOW!>^EZ){YCPd@0Gt!p1JQsnZN#s3V!A&N2yQc zN=I`|+}^@Bu2P?I#_{|Y`j1aLMf@?SX7*Pn4pnDwaPXC!I^yJU{UTov=1RwMO>8{m z4CCSZdHegSnZ4D~gVi(Gal5>8A{eZt>_kQ58KfrU(fAZOThMjRujI&%ac5tya{ zGgZwTu5KtmQp(l94&_SwrZYyY&tktM0%3k!pbHY5rd!>(NvS&^S*bsE%D9Hr%z^6E z(dyRsmGZP?Fu&iD?6Kr84eye`wmHO;=Ngzdt5x7^o66C;@Bu5<4CFctyr|@!p;@kD9 z@6;C{>b1D2JzCTqaG6r~?02(9ud3z7tIZednNkgbv6aXdOHpHYuC$9|`!-ml z6vZCvO0lkhb^Xx*x==BYM2Q@SB9AL)kZT}=z|URmBZLGbLmk2oM!}qWIV!d(;}3vX zB%ocF>RTwJDVBdA*T|7@I0e3d32piA`QeY1k!_A4HxqQ7MfINPgiL10=X#41MDEPk9Y)GUp457ypw(=|4QZe&WToU%t52 zJU{xY^ArDde)iYr*Z%wbmYN=WP^l5Ov7Z_)A>S{6mHK6$Ehl{H|-PTs*zHM z1;0{%hZrDo3fz&oj8~`7QXQw^RTt3Zk8)o|ZG^5{6Do2I%A@n^|Kk@O)^eNMz^@R) z%tIR0vkBoOS-Hq`?i#*R@|}wB%=^xY@3h)lym7}b?qPuiw}HQl3VIJ}zz4WWJjFTd z^VK6!BWU72Rl<^2ojQyk;OABj$yD3Xe7XPrJ_&E`gDosMQ0jn&`kct5>4iEtq%-*aVl`DYtf}g zwYDQDY*5VM3-n)R%-43o>34&@XU`m0>J?O~>crvd!ZAbz^i~h=!(d5Kly_+qB6L++BVIHd~VQbONDEx_}JIS&Sr}4P!UnFpQGYBPQ5Qv^Bs2OS}%Mf;YY(WQC;yx zJ0}i>B3nn3aM&UMN~J_Q^meIshKgA5gHX9phcZPS|L`}%5w~6#w(YgKrEIE@Pfg@V z{3EBdQpBDQrAXW9_4_NC51`JlXHyQ9(+|PkbkUs|TT<%pnO;B4`>gb(u-K+rmk9B! zFF^&pTy}ipRwi8X!U*N}7=1^p(*{(G$8hidXQu9WGxfkx#7!ya1% zqaF@QUQqFac@L^<>-c$!wL8dy`V@sCn}3><1)s9*^KJ8WE|B+8`anAZ0JERpL~k8s z7{WYiDg6Er#t9U82H*ogkavTkTN^zcjQh1SkKl)pH2h%Ett~trtoQ)Kc)YM2$1@6F zJWf8E_lSo+co3F;(VG`yqK4+Tk(_k$5XDEfdAl>DIVw_(f! zi7zmMrd!*1I%v7J()#k8_5uiTIQ-;_V1Qnqd+0EVr&4=|N_aACx#k|H3=EH5B?euQ z1VBpS5HBmF7chW)y5X_ydn}K9lE>E*=ybrw7?50l1&`DYe=Znt$veFWq46V|vkLY~Ueh`Q=B0;Hk|%7Bo0cBx@F3fB`D< z5pFigUj#;@VxkyZlcSe%ma%Pe`J&c&i(hg5d52LEB+FSp!YMKs7K(aD3q`C(!u&W) z&XYmQ2{!#MBq=K3?b0E|oLULc-nbwCzMT*ah4REp3XuzQM2o?L`8-v zLMq*)QAzNa8RI?D?6}~Z<3{5IKuBB}Y?SF#ZAxx!>I{A;kf{7pzDsN)ilp*T^_zGU zPVDkvqW-sQpoVvYU-6hUz$4Pqc(>f1{oV+b&vS?iCkDe*39WRaUV!?8@TLgY^`~71 zD;Py6miQf4N+)b6iL*h@(rf^UOh?ij?a72t>59~Lne+%l4xB~)YWY-_8y+)bMm4@c z@SrHIpiy$x$0$O^ftCYY30;$McsDLwWr`jcQ|hPv5n^HykUqK?{Y-owKh!}QKB8T^ z*ww+iF7824hkxo8v-CF^_6?zG_jit{R5(KK@nooz62U&jnBj1Dlj!n-hC@E>bXXeg zggu@%Q`UfCs->BDQK0tQ4n>`;WYAK<)j@9Y-yIB<9cfNb0V*$;cO(bJt!OI@3*Q3pONu9OxBe$<6}0QrRX2)h@g!Xctl> zqhx_p^%3Un5qV1><1qm1nXP?HGoG!F4l+IR3<e^Y!@*(%=(Nx z3*@`d9Cd0~#6Io}!?fGu$dS=<(&;d4VMZu=LD>x|u8f`BD4*te8<=U*qxwcyoO(0p?EXQj-5@KE;vCUCf|BV{y`0KAto8WTIcf}n8CbCl-ku-xT(^fIEcc7~f5P0JX2 zFlpcn%X52~{muitFd2txhP32FM0`R>i>~}OLs+G9&BL=z>9RggwO=N1E4gg6wan*g zqYu|+9;+=siSM2+8*PhDUJMw-dK|8TcCVh_fSkUXRI0>X50S|oCrRwfJa(evIKc=G zWnNH{YKac$Q88b`4|R`4hyk2Oo~M%j&+k5X7|ZQ4^&lsE zPRQKR`-t0G=4l#o@;F|3+!;~iF-v$rxDN-jMDA@R|ksG{nFPp_QX0dp8HR5Ubw;@tde|ybi)kFu#2Wr8hq~3p;pE!oz@v=nYmJ)B&D3Wg73qfSJkl z$;G^{1D~c+VF(wf0YmkyO7(A-i<1gIxE=0(o5VPq{5A;@JI`^eWA$=z&WtJeU015r z{_d9HGZl{0YgO}B4R2QKQzf27aZp8+;#ChiEVV5@+Q^I6o(ScbY#)|;GMN^4gHPa8 z>gQL6kPnH3kYCD4`ePz>+2bx%{@yeW2of=AIzCF%zYpSTc{iIN6Pdz?M{ZRdoB^IR zcz&j18czb`^vfzu?hEUxSMEH>XX-=z!s=68{D-d+xtvPc$EAwLvld``R0Q-py}`<< z!AyrWYnnR2n5X-PLA!)@2P!H&_biX!Ou9S<@UYszp~-qfi%8(IzfJMfe7X{xGh;G~ z4)NQG)A)WCQ!9P{PH#;e>*^|efjIA|hQ6vhuiTJfdPl_FLAT%vhYELLo@dNg8$DV; zeQO$4ApNZxh5ySHq}U@)3o-2R)ph8bh@0#m)M15huIKR&lIW}Yz#w5mBmZZC5klBcu%8z+{_Q0Ip|VuFrgzziWFa z;hnZcNh|2zXhlxpTFKl22`;7B2j2~*eVwL#8Tc`%03^2+9GBr>l$lHv>7Xj_r21oB99UH{tGMH?>Lr9kDTlhWLZ}YFM0>+Qj3jCXTVOeDt c!H=6=q(J3Ay3bAFp_eL8@7erts{HW(0m>i3=Kufz literal 37617 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 diff --git a/data/tbscream.raw b/data/tbscream.raw new file mode 100644 index 0000000000000000000000000000000000000000..8ccd6c7baae60d2177bf8f1aa96a66d94f5c7968 GIT binary patch literal 17976 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 literal 0 HcmV?d00001 diff --git a/data/tbshapes.tb1 b/data/tbshapes.tb1 index 4575304c240d42145c58e0203086b0bccf166f11..5276f5b2eac999d59630c63c8972c8240ca502f7 100644 GIT binary patch literal 7122 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 literal 9432 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 NB%b{L_kWnce*lc;Jl_BS diff --git a/data/tbsobj.tb1 b/data/tbsobj.tb1 index ba911af123dd33c179976a418447d3522ed57977..21022256f000f704e86d436de73f9bb4b79e9464 100644 GIT binary patch literal 3114 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 diff --git a/data/tbzrrp.raw b/data/tbzrrp.raw new file mode 100644 index 0000000000000000000000000000000000000000..f4d7e02e27a8b7c7fb7daa80dfdc7e456813e3fd GIT binary patch literal 4273 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 diff --git a/data/vmwfan.mod b/data/vmwfan.mod deleted file mode 100644 index 7fe9430911cb38171c10e5aaab5f0a554f0936f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27471 zcmeFZX>=RsnJ!pZ3rhi2SO^prvOp3fz(oWkQW9k;A?>ImCAK4_lkT`Xxow}B?!K9s zKHWLfIWzaioQb+S_jY=cZu`b@EXPTtSdJ-MvdFe%OR;Q|u@zH0DQ*BsY$R3^Aa-IW zY98d?oYVK7`8((S2@{JOidFS}@B6&Z^Sp22kN*1G|I4@k>M#D>_P2lY*Z-dQFCR~z zdg4!pzVi6f|MlDd`f2}vB*y>SpZxy2-><;$SKxod3JAXQKjN(a_MA@-Jvk(}%>3IQ z{r2mB`?KGD{kzYt7yRz)-+lh?|G>Zf`R~5|-RJ+W*S3E5yZ`?C-~aym-><;$SK$BO z6=>pvZ|*gD{Il0=?lt!I8o&Lh*YT-dt2ci8MWgjyqp|nf7qwoCgIWjTe?+s{XySLZ zYO%0etkf#yO0|?PWwp1(P>@`Ls7 zojDgdf993zGyiaRHt`>W^K{5_%0{~#>{f8>^f4RvS6>}JHSQ=L9xb0rl(T-}4bODw zLq2rjT$z}@ona;uK^JkIACGXBvD1~q|Ev4N)yU=OJe7IpQ|&oaK|m z_omCt_r5>vo172YW?n59gQ4I^nQ(n`oEiHM<9g4SEpv?iqU*0te8crs!gcC78_$%p zynX3kuip2}pE);m=H=--m%lqXKY3%0ndQfIPX7P=<{#R}6MWt54O-l^c#H@R8ozy# zW0Df8%!J;azAGI`xm2uV=<=<-EhsRLu<W;+cOrgTHZRBA8EkgMY|A`>m&*l8uc& zJ-_gGz5l|?Q_p7-d)dsm@z4I^ z+kZG}{GZve)7;3|cb+-Ha?de`$MZ&}J{SqkzdQT!`M*1J=FIh}Ge16a9bcUJ=j-#+ zH!?)?q*lXG%UX->Eu-}%3fKl|LN(*xglf^m#GDW3QsJmZb&wcIxc;;)TpMB2pjN{K`78@}YByN4Lbzk4V z_ucD_slT7}ot>n`kIId)(6w?4agsYVuCj5Xp&;3wA8>um-Tj$wjJJ)A4>-A# zM5>&Pi*cFfzIW#P=gyy-nz(W1^@;8K>(R2v_4U7gYV4WkMrdx_W*qyL^TZ$i&2iVW z&vlM{d%Wj}GlqlDPfwlyPv3v_(Oo}Rz>@|!n)crKW|I30A^=%de$yGC8M zE&6F&dF=Gq6Mr=B`lhq}>)&+m4m@TfnzGOjUOf9B&wT%v)8}7)XX2;-JRQ3AN>C|F zbANi$cK9@rr3VS#N{)SL)OPB$jXd?2<3jpLXTs>t-kA94yJvoI?)3{-uHSfNVmkcs zjX7O0?)u{R*w;_ntva=XEs;mfx~}roZ@Wl#JW;nj60rolHBJ9+Yg?0>$t~kWs8QH zdGXx&GiP4DjP1Dm!uQ{NcjEf(>B=(idiuDH8*vjELsvFqd3s#udh&^`qknPIefUe` zjPcYs@hCL&gXgbYJpba=i`S=qHajyt8%+dvxUWAoa`bK}E* z{LDCh$Z}7OFoKHr2fsZ3%GsBG{L72y&%OEXmFsi9+c$Z~A-n6z(QX?zNbFKNGv_$$ zb{-uccAa`^gyl|JIkz_S!R1Tm|K<4?fAQn$%v^CNbO3C;iNgYSL+r&rJa z)Auh;ox3r81XF(yng$}#dFi1hZ%-6J5D?{!nQlxiM+Jl#W}le^w?Ma_(1pA<6k)R z?6{2{u!pW)egE}WFaPAlAHF(!PZ|NiB-E?u6wc<$!CP&~xD`j3uu_Ydx8+OoT3&tnX2 z92+0|<1Y-jkN(Z+qn|%`yvMm4nVG!t!B1Xz{^d)T-n($)N0Uo)^K*4>fA2t_(_tT! zW#gg&mZaMbSxsc}tLLuH-Tr8fw^$uc zTTl0xt(eWUQ;dqCIAFwK>)6v@eCo*QeSdJWo%PNw-=BKr2QR#Qd2;F}=YBaobL%4y zFLU(UbUkASnDVZms%y{kD%a@2@s7jpvF9Fp{KT=RPPoOXL~#C{*S`1sE7vdn?A*`a zoBVis=3c?r!_wSmAM3Icje^luC(7J#-{(fz;m>?!?BtQp9Y1w)P*$mWL)Xs#)AJLP zul@Lq*DpxyFawony!T=;Vpf6W=)X#Xhz!PKBmk zeE!wTuTH#l@ukU`%dcIJ@@XTha=5-^m+>7!lG@9b`&=Vdm)&*Z)bZi*6JJ05CAURk zWR_-Le(lxQE?s=#+%IR(zj}3geqAJylwISaW*tlFX*N=z`??P~xxwKt9X~#B;`4v< z%yFlga}(a%um9rQ$FHA#d3x&NFD7T+TrbOGe79?~caW9R4)I>9pyUQQCp~=d#Q3=V z#N*GNK4^Ej8EI+{f7`ZG?Opk3QRB*SG$!4wZ=Zuz4>*lPu$(0+ zmu<&#_+)SIXO0h_`r0$B>rYPDcp`o4=O0e}@TJMi7k~Q0^B1P)?#~v=MthG<<>(w1 z*BhZA-OpzE{SGJhMLT!mn<%#Lr zZ%^~mhO&2%p-&tqYQ!E~t3s~KE;){=sec_3*6JHwtf=#K-F1&N$%GGx!rq2J< zxsRsam|iPvmR&5*9UZqR1XL*APQ`g{kReUOqpmNE9)0}4iKmW_+B%ua{IwesuV0@z z`}`{t*ZyU4{`PcPr)ctyaa;S4Y%@s{**G~UB{hZt*YMc*V*_KKfBLv<*v-bWx8At) z?w!luJ9p#k^H-+dzj==qrt2C5 zIl?U6n)OaiT>AL6e|qEc*>hKyL!NS#Y7UGZw$o;VFjTM53WB#0ykm64?L7Q>`-v}n z{=m`WP9n4(nwprs_WDbgEm=uca57khgDjM?kV!TMIb5Bhq@exj=3Em ze20&mI!S06*=y6cuV4Gw)r;r9cj1lq-<`{BFPD1mKPS} zM7*kM)3-ZD4)hQ2A3N^;+R6Q{E>Ye)H~-+1A!G?byc4Esj=+%gGS zE67PASt%QY9E)IZJU;3=apKFz$3~s9LSoVT&WHC=2VZ~d%G=9JbGZs>Z66*V?y|51 z&s&H>WxFmd&`t~2?HY7B#>S64;r=X3)2V94p2kdg1 z;W?r%5*JCe&aQRYy9ZtFqvHdoPIh)M!pQ8_{Eh4Hod40QFTZj5>hywVBgq-K#|9lX z#Iu-`^0IVUPD$HY#!) z*R3~brE&vNl@*l??=YLWeIw59!{Z25H>+;Q<@Jw#Go4KEeKyCC z)1sGXge1WiA@K}^slBUX;K*R-!N*3%#@$x7QI16C@622~|LRZwW#aPXU)}vUn5M1W z2Zr6|ZnM##v_fV0c)7(F=ln6uMBG=X>C`w)+?#{uk6Q>8po*dV6HfD=&RBm0pdim^yiML<5 zbp4~n)iP=7)KeToG6rp?R*(<{qN<}Uhn@63Eaupk$DKn%*2*4DY~Q|r`4{JZ@y5BI zOiWGR|0E+->WnspM#5Q%Qgu(B+LdjWjczN=9oaX0=+yY(k)v+0oRW$2-rG}eUc7MS z?72(RSEpCYLM838$&A_oTbWnZ3IbswPV3CH!{+Ea`o$-Xjh#F+%2>1}rk3^IxcV!U z&$q8kzcrnTm+3B-mK^A|DUISXAr;5Ndoo@{cgrk8`$qR4IDBZtsW2LJGDTwc_OtpH(taB3P{y_%@ABY(d5C9(nAT4S$mEP{~4bp&OI0 zPhPqB<4d2+Oa^%cE$X3+T^uXo+Zdvft!B#-BcoQdA99)wA9sDW*JYDi4zR*(F)?%H z!};^)CU0JQYj$ggq*QIBaiB}e>vS?+P|T*QB2Ko)*&Md^L!*Pkqc)YA>(i%c;`Rr3 zZcV-P_SD3im!=nSg9tFrPK!xKzz}>b6hy3vq@1b4aiIIN!^cPU-nhQg|BL8_LR+k2gc!_SP`Iae3M9n{xK*~F(G zynW-%iOZ9(UGh{@g{H`2Rd*<8Lej%*#`j9)TG=QhhXz^W*q5Q3-1auC5G&!uo3}sy z;PRW-ul;ypaxNFilxeHh=wQpneny?GH}Xl6sO(w#8QSr=@uQ#LKWOXeKV&ti^h7v< z^nLf8*M9oyx*>0}hwE0aqa*>bH`%owc-m602M;<2M{hhf0Y+O!I)vil7Y&t(X0A+|Sf)nHYQ>G6>~3YZR&5$b-2=l=Xh%m`QpL%FVkAo-&AQjD|~+O_Inq9 z@y45z7boX}v1FtmB*Y@UOk`xUd%|XRS5gUOET;B@ZWn-bgdI4r-`#C)lQqOZ(y6zn zUVrn_^?SkXWRjHawVO#@w@o3}D7JW2C0H)<29v9Q;OKb&fiB1BA?KjYq9DcD`5V`! z-u(G5-}vR+!^KQ7$7^&5EGMHI0*#@?saP&u&@uQ!F1Ni)&-K_l&8%1^m4)tpdgb!P zvoB7(Hu>vEtLt%IoS|8Y=2)#*X%z~H=uUP|MOqDxeM5GW-P+yl=u#O>3`wjl-k(9S zfAg*Do(B&z!aT1sYLq=r#%MCKI&GzxFGxvN)xB?|zt7!k8W^#4utp#sk=#+Q5L99Ch+J@g$v-8*9dHe127v8=0 z?pz>HNbsyyqt!Ah&TZC-MZ1-BS)@|a!}iva_Sib@CPRnaz{o_2+tar%p1bnKMZ?Ev$2y^(;6cy;PlyK=;P}bCnnBcn3%pZ zI~Oa|Nv)zmGREF^yOkv>xp0*fd^`dY7z4s=kesSUI^sV3c zH!~tyt0G8ar@hlP!YY+YB1f~v4rXAq*YTK}wRGrZq{^sQ6Sd8UGt=)+ygvEf^zBbp zcM7D=EZ#G)x(>&v&1e<#m0c+U{7-0yn4OKUJtO{2}A$kp=q-~Zt1#S7CjZ%)ib zf;>Tr1x;m}UgsF>)Dt3NS0t4+>fAni*Wq!yrCTo}M4V00;KjcAk3T*?ar3P=UZ1$R z5ZoyUvpHTW6rjj(dMR1s<=WbAyOSLl+5ebxpADqZVA6|p#C8Gr`|f*_*QZ{+H2WxA z;)z{}Qby_=eZzhBHiGAb4MIxmI=OxB!F_#Q1g}$&?HZXtMR=D!e(wVS&1;i4W`p^3 zre16CHQJ_ijp}8zRVF0_a+R@@b2*P5?>B3#Vv=K}I){`x6-4Cr;>yg2GZ!W=-CSQ?FDol` zC9x;rMh1HsT~`~kCoVN4x{A`#?K;%2H!ElvB@>j5ph3&azT5AAaPi#ahrgbSr1K@J zTFaBhKBt*6*%`Q9BBs(*(p=Ax@j+{sp0-hhP;Ox>skm?1`|;H)SEnW)u7|?Bl&n;X zyu)fUwyFBq2AT@_Y`)nb9epmhSx=kH(xTF!(ugXd?b!SW(>LC{bQ7WG&+xKDxUQhv z+bG&*V8mcM<;qrBLUFFc2lPf)7bViNFtsRx-%EwOx8A>Y^}Xpk)62V+$VMbC+Ea*V z*bwb{QYvefc1fAa^~3?EW4OQ9s--(RyNy;U(Ws^tAI|)0^3MCyv%yj^76x(?Jf&gH zCM%<)&=)CXdCooH?(gZ}*DF@HnJ6R6G(-YaieLZg<_8~6U7rhYr8k4ooqCZc6*|4n z#7e~?bv9q6&5mKW)wREu)$3*Q4pxTv2B}{9z+`sqmlWWu0rdPtL+*T@EF6@znM2Se$sEIvc zHj*(g^nly$8Xa=#ta^sFXeff#XSbr>x%;2YygR!ZkHm}V?M%JesH;dNWzy7@On#$O ztdRzz$v)I??KbFu#rlSlp~ThF+Um-qnSY&}y*KBJrq<(Ig+zuRsx&KA(%M=jSxD98 z3YxPcN!(hJwo*b`CsfI**_AEt!}s31`Toaq8=W z)akTofagR*sV9i-OxC}=a%<|{>0jSl^?8@$5pO&mhfyUXEoyCrr;5DFtT7E7I`G)h z5i4ics1*vmo@fx+Xe#vJ*3Fy9z=hSwYBIJJiZ@FXp)~6i3QC;i<#LklwhcUf%spuD zwyQ;L;Qnf&k}74_1E0P(`^ns5*z3x8MKd-ksTptNsA~pYX-`T3MuNaZ-hdr)5oE=jtCmc6e~0w~b{a8Vgma z5V=e}zi|80U(bAW=hmusaW%BC98RROyP`H3+(x3VV`{rpn`Pk8$k8Dfm|D3G27$bh z$?&yAV19OX=K8%A++xVLvYy&W?eIzkZPAM*`Zk$JpfFl{j*cJdJABMWTWxwBBd+ci z>*B1>zjkZ-la={L!Q|$O2gZN0DsIwNmQtzP%rZi%meT{H?!F_#PODzmrdN=%>`sly z$77p!KboF?@Zr6X|NdNHeKnX)WP~J5(Mp3}r&KHIWM_wC|9%j1lL+-wA8)E^f;2V54BP?xs z)|X~Jc(Cwj!4veZtS9`N;kvk9R_RsBHk(et>sVvEJY74zM{ zJM-z>Zkgdq*eBP)$Lx+(1t_7g?WQUb^$i z;@aZ;{Z(%;7EVR-m5PLB)oomdL8mizIEEZ9_prOu=ICG*A|X*OHieDsW-PJ1aCddd zvwHW@BTpz0SWm=41u@Z-7+9^6(&-HjXWu^eh}+)nuxZs)t&xR-&IaPKmHFFu9z1yT z@ZRjbb>H%;&+iTHRzcB>;IlMsXz%Ok+kb4txqq;~)5^+Z#R4xZ#wLGeTNRa4-W4e?6>P>RbE77Q-xF{vheBb;?gIxi}SOd z@aCEa3sVp@ihQ?Os_QnJJ32ZC_Pd8i4jt$_FxaDqbJ8f6fV9QUJ9EDI+m99>+fCqau^}6$C3MvY5onl2Nm)s3BWA-xmdSi3*Bc>jahnRh=~Si3zv z7w~NOJ;@R;01?pZEDom@4zgqafxd&sMr^bhuwBWOi#wIgwbi9ZON+N|eCS!afBW{m zWv|!kiRO#d25pcU2fK8AL;Lq185uY-e%#$}ZnvrA!eXgeDQ07#rC?&=*6f_ex3V|~ z7ck%r=b*2crnIfg##y*t7m{HJw)UV6ew0>16icOiHS1m62(8|ky?b|YW#QgKVE5ui z*caPt5KR=XPMfZ~ZvZuS-_g&E?|0hmHj@Iisv>B_e1UMtyYQR)4;NRKZarG_F8Tbp z!QFbJ#_Kqp(O~Kw80fbBPP)8BMu%&V;|7jl>wB#oz^A>YKwQbD;-PRXaDUe0TYBVuxajjHX5^VxXHduJ{jTX={N4+KN=4;SN+<-it>lagW@D$cCq z4iEQ3NOtxgv?+BKMkEGQ6tWxl?|4G~#f3SKHxOBUI2R0Ude^tgyo%sS9oK8tng)j8 z{y97M4|1$VuLk=8r0piW3k%DBpBKl4H-f%LzJM>Vx|*yCr462BZ5FMi!@7TTa9|$@ zWv@-6)giX)0&y|1w&q`tN4=hv@J=ig_4$3_(2^&K37c$LBU7TN)7;Qd@4msoerI>P zPHi?QiH3qG#{AyZM?v7l!bW5*7+PBndY6{w;?-I6}iBjy4%6 zp-?HyZ-;$AB;Wj_HBWFmv=Ib-@+|mvc1ysnrb>ZYNOO*Xp`qd710(zFTnE>|sA;WK zQcZZGG2dEnc`g`3cNikA~M*qtW>}AL?kPR!Z&i0{G1uDc#=L**$RJpp)yiGjs<-C{2n+7AINt z2E6kR!kewI0l%Dow79ul&L!)jCLvQZN^N(4SI^O7Bd!srrPpRq>sXUUQb}%yeDTn{ z$L9@3qmclBYUv?Ja4KKktMi1C5i3odZQTAL_mPp_?j95>a0^x~BT}JcXg%Otec;~+ zh2w!xXkqpNt~Z$nspr)S0o|t4an7E7M?UNB?;EtSYMoU^8x+OuOvn?CEX*%>*Q24e zNObAW?1ROn|AE0yS1+rv8sUTJrNYK`cq_KKv9uhHhNH=J zHnh09zOb0w&F=8T9#5*9N|V{hc8?r#?>~IN*4+b*&ap-_l0K2jY~saXA7pvfzrMco z$=rGzys})Viv>JSgE+Ul`umO^bEBTMSxrV`2dh`)Q^{<^_Ymtc=TB^gqMJ~M%gd|r zY$j7eeJv{uG9hi#Sq{592ZpQ`MnkK~HZ#-6X0j1*Q_m1E=FowzPLyknrQ1dc1kK`hY%}6r+Xw{W>3nS6w{&k|Jr)iY$V!Tr z?nxQ6HjLKJ?!jSaZx?HZ((Pawp-@r`Z%2IVzSWh*;PzH567t^uG#Gm5sUsnHRX)mAmh_1zkhk|;WCyeQ!YuBq9)AtBfUMW&Zsk5O=^W)Ow@KVp~YpNcivOT20R|` z-Nn#)Fq-70yolDTb;dS@2#AkfCj7B(y|S&tY*5J6BvCDAy(=N_{aL8Apzp!l-8oNd zD`3O%N|My+D51pEVeW9b2Zo$BmNr@8aA_zJA*dt*TcL%8g|wHBNaCDIpiQpL~uJ5@`e0Miz~}s|4tF=i=>q*1H#S3wsHGL zkB#)B0QcI>dKCq1suZfJHShc^H1fK~v$paO!z9b=JBfIv!i!XtNKDGqT3P%4{rjL@ zI=QZPmXX3UF98w~-ut)j%&jkZRu(<;b949SJfTQpC!GTcq|{24TCOv6fQk+e4h{Ww zam*&z&>}gJ4Xt`x!ewoFX>Il4orS=XKa-C`6zJ7-JKJ&>wH%gZ*gY^X)C2Tojc~~1 z6tNXr_dWo@p1Xc4C~4DE3KgZ)nY;J*_4YdYIyoyq8*)NKNh_(X z(9%M9_0eho+i@SFcg4FNh@x9Vs^tt>4rt?Xc6pbVP(z}&27U0W+U7MT3!K+IT7XtBUywJ)dN~uK1fKb{oBT zQO<5hgR34WgZT%GfwhOTb1hX6Octavp^_5IHEnIsgMFPn5HSvxYKl}0qYx8&l~O9~ zTV40B%|BRJ^LZcMU0n0{SN+L4Pf{@5;C^c@T+g7x-s2qHXH!d+ZH$&tNQ6YCmxGRqam=Zr49eG-=8d0gi5gpe49}MEc&~hT6M zd!?#KBvL2@5`ztfCAV+i{(aUq5L%9c1{oU}rOcrFW29Z?3#6ULU@rQlhjnF)Zws#d_9?zsQO|gK4OJX!z%vP><;J|@i z*3@k?v05GaiV6Y0SINdV{p(Q3%Ztlv{?++AbN+xYo-Sh+ofn{ct_NInyWCw|hnefp z(+rwNN(qV9e<>CSZ$(0&mXJ!TUhi5Mj$EnHXu?B4VCg9+yZ*i|YlqEd)=+I$tz01^ z8jaHS#zr&}_Afw71OqGcD}J9Zv{k59D)5L@MhrW(aX@TaS68o{WsL1+v_dGk41Lvj zB$7faL{(;UwIXVwq4IG%}L548r?y3^+P%<~Ftq7OqUCr5eRVd?yoGL5TshEiTQ^ zdsgO=y@k|Ph9^lz)*v~j)!5no8I&{zc5WMbG{sD=l3MkwqfiIDYlwlxx#&)=Slr3*Izy`` z1hL8?B?g^VmNj!`O0L#3D)DZ%0E!R1z;Xtb*PwZpSN)MpCE-UmSs;+eRc)-r!gf1* zJ6Wxvoz<$8SYw9B@0AMqtqsqTKeoEy-3*}`E_vd+*-&^_AeIOLGsX@pYXu_Otd{n6 zgB3%TRud&4#EsorG2{t`A*=&yYk{@-`@!UPWIa|uI*BEu(qPi*+U@(g%$&8Y-Ktel zZ6-!4BWevnEwR24g8c)G3PZ;%hhrO|jcBTj8Y5JpQK&ZdIqZ(!cFxvmWpu3GfaU|5 z7(`_&9$62BR+m;c!%O$(u!H_UAdoDVngRiB)Y3*wY4tg6rp_*w(SRT78DXO?YQfA# zAh@vxei&X`oI?qQGalI3D%T24rJ7bVdZc`R4?xYvb(r*w*`x;i0H12<&1fuuE@mPG zf6KcO4u(Uk;dHLB%gf{{TB9=dI~{#}eNLyN8*9{IW@K`)7*5G{WP5XI!SDBNtN~(z zvCY7`Kat$YRGR|uK!wKK-r3XJ&B0SM>5UdtE0I7%N{Li5y}9mPS`7q3e($n>D;5fF z#=~29*aP;jOs-I|CMY^9H)QXyc3908qh2D?=|z0Cn2QAe3p}ktfJ8!@5nm|26Hiw} zBq^7vD7eHOruOb`o6&^XhIUFo(zKLlR?~^N-?O+1bv*}C65IeofFFSoV}VrJ;&}iI zwjIffj4<0QYV0YaR>}6NrD9~&AB}m}aC_lMFoaYJZ-g`TJpeu_1D!E)-8M{wn6>RN z@#K_BrPRnpc#Z{Z5}sekyXf^{OZ?E;UjJsi05d>ZhjpkkcETiaw3L}m$Ec*FTur0F zCN8BDp-4Ckg}%PJ5eWp>{h)2(XuKqm5+an7HjZoWMhB(c?m!ckk&y-}Rtt)KyQRlz;|xkTJW4e~tE7TvDVs}eBI7|TVjy6#wWXz%KsZ?` z6?jr2m1{J5t66Whb#`~LIvuT|6-t^yu;JmKLLwBxZ3S?$jqoPIZGLqtl_@l&LSCt& zjfhKBG!$RX(8lUP!5N)SEfz?H`BXmP_XjrvYvBa8Wa-f&5H(q@VXRJ|($GeWQHKiC zYqNHMS!m(uw!s#sgkb8~$lAunsy`G8V=o@fdA;lL?VSc+7s%yGU7HaN#qO@I?hbSo z4Pe7YwNe2yuingU#{v)&fq*ZX@Of5Y{`&&STpm3+37lplGS=ML3U58MwHh@WXfBq? ziCQtcwHb(Su7(q_SZr;1ZE0a`GXj#Z*AOXD+cjFq@qw-`TYEc$eg%#M%TcKXm^q2W zx5J_EW_%|a0ykY)SoQm(JB31}E?1JMCbXfW3$qI_ELyqDXn}Qrg}gw|SZcV{aW3;Q;rTR08`!?WrS$1}w| zFIOlKjS98V%2{nzeOsHRwSQWbT#HFC2_Qe0ibTVatz;?@j{+b|SBys(||WTx7{@S2o>9{@sXF@o%4Ep?Q% zMdBC@C1_y8Di+=XAb}?)V<>BZKrouhWU4AkERmAvzM8Ej6U#Cxqq()13Z>qtRZBr< z(%Y#-Y&(-q?(9U?pe>fyW1E}FszA6WAZk3UE=JR)Yi)>HPAQ~PrADu%;Hg&%=~QAX zp3G-*cyw(8yc`wi$Ww47M%!kA=95b>u$RuHwlihOyzR|3f7ttI)gOn0B&{Oc1OigSP#P?Y!GH#rTuDLk z>C`G(PVDZ2>Fty%*?ev@ys;5lS%hki*M;aJ2^%#Mh@sZ#GYRN?Egk zHen{4E|gG9L+Ak@4VTy9Iac;+DEAT>#b{I-*2tQ0ok%~R2Y3S`m5UKHnN+s4myLrQ ztob&)4?M9{u8ap7%Wx0nw2}rOnIJ!va*2d)leM&)Oe)%gu-^=4S{IuQt#59k7wQQ> zomVQ23Yt4orHWE%V8!WKl}Msy6cpe|L92vtrqFMJk6$V!!tr<*1kvM1Ak_9SgxhSX zik1azuynE%5?4(bOj@WdB}s{k$wD!eEtK<#trY70Ix0mtQ>-?tcxDrfTTH4HYLInC zu0|$d6ID8`hy=$^XS4BGwy={(#N$!mH+WYtnJ?FxwW?4oM57<*&~DQ+=!wd8P&6hj zMWb*x(O6CvN`=(+4p>cSeHj!H2(VkPRGWAXoTQ<-j227=r~&?zQp4(1Dm}}{r9>qO zA11q#-imLb>MzePtgMGqg-W?W?CnWtB`?)#!P018xV)87E!%}*;CU24B1^?=F1?-H zf)xyTAB=Aos(iE31Rj!drOIf9uZ`I#g%&|ZYZSW)nBF;UsAKvv`m`AjAq4fwn(p7n4#zl(4Y0o6n@fVH9Bpw=*I zN<}H~p+u`*A#7I4crX_6nc2-kMCexKbPpz&^qmatwpcD{bbX#j=QiA&{ zm#U3QDh5`w0Xrd@DP*%XA#xCAiBOE)YH~06sOgL@X5(#e7{*$rW;`WCkvGEESKZ3iSpd z9k9NGeEqFQg(n|vjgLzziL<6H6ARytQir@mSfNn5Qn02)KdFHoW%7mcZ{NkC)wPvMDRi(= z_Q8g6bW3F*dc-1$uvW*`XLGr95@a6>iZ0=9tyaa=qvL@1r}S#14?d%EVlPO1BS76k zn&SSzF;ZKJ7}}bdofO{kp|;m-l&fMHv8QZ}+bBd*{DWm7u_wSAxkS*|10rTn{k9T` z$Yy*S4+rE*pcajMS%?ir1=gU=BamVwT}TKJ-6ZZ=3IO5>0=QksrMIHk`khoVpWlV& z2u2D83zX5dDFk8}f>kQO9?Dt}g};GI6@ac6O1aclB%XlcO+_-ip!Loa$O$YXjoB;- zZc8D@ACXFt&A4K8S;S&AsdmdX*lfwfW;`9+*e(N(Yj`sZzFymtg8P7BfG;3PnuJgw z!XypZf*VOIY?=_Gsc0;fia;>s%5|I%QCevL3^gi|SgFFL;b8-U7h+*#Bmk8Z<2^Pi zyCqmO@I}K&`b4^1#uODYrCe!B)hfISg+(ewTJC{pN>MrpkwVe{)E0MZImB5ClboC3 z7_@7?RNq7Gz~U&>N*qUnq+{l{mF=i$==xA%AubeUuaHXb>?9Ki?dWzow_8B(yi_PP z_*Tw}tGuQY!h|O-y2P7zz z-6To|uZ0}Ij+01v9E^05;s)!W_^C`b8HE7ejA!%NQoWSPRU0@Nwi`EzQy{j)09FdS zDaJG@LZR8Lm$J}yI4-&w3L`5D)p8!lQx{<30;ZQ5r3pS85Lg0L2%bk| zcA$R{qi|VbP+G-u0RRbUk3ECsrK4e|ssX$$2}Q|T4TZa!MOvVN9tRvE33tKY z3JoAW4{%YTyeq*DMc7Q0S_Z96LEH&3I8(%W?iNyU1PsO*wsuMwW5n_xmoPD}0Is0+ zs#|RmctNex;oOK^oG+U%m5P}}VtXqd4aWcIAKF^^4Av=!^Hnfc-HK!iHnW64vBud{YOTH%Y>4$@9&{ap z30phx%fKoTub7LdH<8p$i9{rZPpVamnj{5@AtjkMx)ptD3F8Bo0DP=x6ejRSEF6v|cCy&iU65P>-fu_SrbWnL6XjwBhLF(N zQb8WHnCxB?$erGfN5U{4W044kHnQ1Vu>xo#@MHptHhfWJQOlSy=+xkExPlfBs_o`6 znGlX{pgFba_XBaZko%a;!;vDT4pusbz);qtD$M?Z^+7>Xf+ilSD_2TsAX>{e-VDLh zX{87<1Bi&+RYOpKvH=ri(1uWj&==^Jw34?`!!Sz%R#J;`2N41&7?@Qq7j~Oyg@a?$ zAi&6YWou=$AjB;n33yD@;jQDvEq~k}*o1Ail|u3tp}7RSgvMF)42k1$9Hyx;8mhtf zm{DqBa5k}>-ig3MLi;?qy}g6?G%6O*-@@b~jaSn!kQg=0h&Gc+k29hUAbojElx=OL zQc>UPDjXfaFaig7lih6!nj+9Hh!GeAI%s8!)x;W%Fa&X-O+rx1CAT3&G4=$NhQ!!G zpyqNpJT=ll3%;dbpd&R(=yQvSHR7oiw9(OzXx0j8oNx<$5jZ*<==5jO$cyZ62N2;~ zsc9AHB|LpRcYyJtHbjw3fHnpoIGap@S9;*efj*<+XOhW0D1045rWy^T7Nww6N;!;H z7Du(|5VSyiRP8i0WE=+RsuzxK6xg_x&gW3v8ch=0PC-wCptnp&OraVLMy-kz0AZW( zNi#bb>w?v_2H!aWo{<0|=PDq36t-QZR6ur-c!a`?rz;G4@D1=1RPhRw;ZDTwTU%WV z0%_n1qTAUbHAr?HJOG_q3G_y9+-fzmm`b2!aQkqrEjj~R&W9d=9|K;=?N}VSpT^r# zVcZpPfmK1v9W&r&*oiD_pcOC+z=t87FlMly4-~8p{8i06Y>e~ z|6)b6(t?fy3^qsyVh>P;4fJ^z;jo}fu@%FV*YLSsMAk5{1HjnY24b|TX`xo%!wE6i z0TWrnXw96h%Z`bZHlwzM!3s%h>ywFyZxN066JuytQ7w2lm~pE* zWsvjB3rnl3zECWRp+_{zwsMfaPy=vgWEfFk(1XVb(HKMX7zP`5gMbN)C8pcfUut6eI z*u@>99ix{J$;TS5sSCwgq5ga6ZPyC<|o)KBph=Z@E9a%Lybhk_ZwK zU_b~3g8Q3vtIAb=S>9`}xn>$;%>&MSn=c+P@`s6|ko_iBL)2r8u$xOCTwysv> z`2vW&zFUZb^s?ioHMb9s+Izb$`0>fO|@4cFyBx&wllE$%AwT|U;Ho7FVGQGaOhmvk=?H%qlo4Z0r>ky22Jyj|%>eAjX z2fJLObuDKy`D}72%8fTKyoE76uEpgh(|zJ09i7M8f#+{XTF8x`t8X(vL0^3}SO>6Cwc z#ore2)9GY{U_K!ecB~6d)Uj+jSeaCg14PK73$H$^4f6H%^|jCdR|*kHKMRri+^Zuh z*+v7|k20bxil}%t7%J9P+Ui0nu*44aQmI05wUUv6KY!2}-kcpB><~iiSiAB4CnN5( zy8W}E+^fZ+*Rj#nuO3(}dtxyo$-onXQ0s|m7CIPk?xr(6IPOt0X|Ude1ry0^ZGClZ zy=GapLhqUYTrTKXE_`037VZ|$FUPX}WOT|$^=`h4~4KVLa-xwgjh{Sr#3$;~+~l>}n9xkVrr zDREyM9*hDjd+|uZm`IzaSY53aiq$$>q@LG3PQd{OxNOI|MbFY~G`Q30X@3aT@W~N0 zPC8Rs`^)uk% z?%w|P=Fjine{Jo=^Z*>{W;9djD%Z2cdTf(3l`8IN)&rGnn#Xh4VMO}Icl!2bGZ?(? z0QWKRVa@rEDZ?!Ba%H1G6gb%|hx+pV$wxHLk2-DI8TtMP>Y#}|h>lb_!}!4COtDrM zeyb%{oXB9MRLCudk_kl>Fz2Cl($lX^ynVZKdQP@%&~t7vmC09Jne|%aiaIu3t&sZo z^6Ag)3ZLC+QF=5tX&5&*n|myCb_GOHBBFS+Ve{2$smc)xlo+L4LY1$L*ZF9D+?j?6 zy3Iyo8|fU)%q>9V70xCs!FX1$S61l3i|HjbFyK)`7$aUy+muS1Tl-WugWmz1Jj}gc z5@jr7!`ixaR7M#558#_I^x^1me}AXxrhWUlDO>1)12MbhPp?q-MK*U?s;jk1(da=D z%_4^RTu_u@!gq*= zzcsd-ja@xAEb3~atI{}8!Bi`?__+YCTe09v2N2}jOEe6Mcz5f^zrS;P4A&72!1?dn z2lR*%-Qjy!tg6*Swo)OV{9s6ZiZL>yzzsLt(Ps14uRV9+^z8h4@<0zkS7d5KNm4E< zpep4ue=_O^@R|(!?bb1oz@~8+g5b^F4kW67em(v3Fnej83{m61wMvZ}R!Zv2FWQ5L z*=?U*Cd7ok0%6^+E!BcqZX&}k$SzHcg+Vq z?Q)0C=cFBpyQxlyRM>JbddfTfmg+Z|6Le#Pu~QGuEq{EwzT?{T)3u#(l90+{P6i(;ea8{wnbG`6l-xq2WZ%l<{%i!bT(HYpAs`n9w?xe zJa2w(#t_|O3NORY27CAQ+F+qD#Ay8RnmT@o>{0r2za#oqjj6fW3v>53z&tMqxY&gy zNM@Y_WFwRh!ZZhwRj5nTn!8v>&X!ARd|$tMy1l#@oVE`r5BI2tS-ssR^Etn`5b!Zt z5*D5(txhSsfNi>r7sT3bZBQanrLrj7E)iHRtrba+H%;N|@`Hoszp&+P536uhp{T0O;-|d||uj77UKp$rv^e++5 zCKh9zo+3q5CV`6Dxy+ZvkBYo0ES^A%N@rgy;R?jrARYNUZVVTKpiHn~LHdk!c@o&5 z#U4haLB=semMG9q+AWWCLobI@L^?#|t-!6RaAT_RdRgm;k)H1D)9ZPweO)~#_AhW< z7Y0#9sfFYaFBC!%d%0pj9`f~z`v4D*PHYgLZH}rXwROV|Q`#U`UWlVS4MrAZ@*QZ!q{hd76zMUh10uTBLo-i=wWleQHFoob!}+IO0=74qDG{ zl!+$+kq?4vbYm74p3#zYF8A!aF2FP7@oHfK3v(tfdEkEgq(`IIabF=UH|XQLCkOLi z94M0&)J)7~)uMbCTZr)M0YycYj=sftx^_`i#y1wH$nXFYc%i@zVBy7CJT5ezN=vkd zHSq=bKbWN3RjRpYG$&&p5D1knwY_H>A%287lCB{F zb5BpGtm`kPw-jY%qWN8wf56*5b@l4$C^cZjJ zO)c*Be_!9taB(y+rVBrs0IoyS{D=XQz%Hx`*y8E}SRC%#Iq69>%*PNxaACShwZyd#O5jwcU{WCm(Fr79kWo`A z5C$q>?}id(|1PYP5N$?`@%Z!tWu%f#r}O3VGrp2eeSRN7ZK$v~KZlJoIAOvOBJQMn zex(Jy1Ci=q-`MDKB9SQ;ohI}l4eSz}G(Hz`GAAdeOc^T8-pL7_--PM0aj?$NAJI+0 zEMNht0IlBI=s0*Snd0=+cT_wuM5xDoNpLn9j_#kH=H8OZP{e0-^u}4;H9X0CQ5&8O z3P;@asF>h}eca!8k7O&0Il z4mxw`EYxeX60o({V{8?%>5S~t!Q9>Ac1Z1jvFa|(KoXQByP!DfZOFl_>*BTIL|wB} zgbIPt#Q%mckqMze0Xk;$f!-(5Ij&1CW*xMi&=nUNoLH2zC-i{hkxwG&v@|f!G}uzw zu+OsZU1SI)Wx+r9)B)~jAk+Px)x9&+W`BtMpNxk#%7AZiaA4f$jVewuSP?kT!`<~Y z6*#s3e;0Zz>edUQL+$k8i8$ch$Ir_iXs5chY!bvBYWz4EPH|zK`B_IqctJ&Vt46<$ ziJB-9*dA5^$w~Tv+ZRlu2ZHjPOy4>O>J=l#UEGd_qcJ9*GnwNEu+vCdI^l~Y+1Thi z2)=*T(O_&S5QSZecUoJPN5X>t@eO1)aMiFmTYy< cHy&QusH)`oa;MXQI9c~%>Hq()x&(>;4|s`5%m4rY diff --git a/data/weave1.mod b/data/weave1.mod deleted file mode 100644 index e12cee1998018daad304492e3c3baad3b916e27b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17723 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 MOi%XvO*n!5FI0ld{Qv*} diff --git a/hiscore.tb1 b/hiscore.tb1 new file mode 100644 index 0000000..57b1784 --- /dev/null +++ b/hiscore.tb1 @@ -0,0 +1,20 @@ +Vince!;! +Vince; +Vince +KEVIN +KEVIN!@#%& +Vince +Vince +KEVIN +MREE +kevin +2210 +2000 +1900 +1860 +1860 +1850 +1810 +1790 +1790 +1790 diff --git a/level1.c b/level1.c new file mode 100644 index 0000000..842203e --- /dev/null +++ b/level1.c @@ -0,0 +1,703 @@ +/* + Level 1 Engine Code for Tom Bombem + */ + + /* The Includes */ +#include +#include +#include +#include +#include +#include "svmwgrap.h" +#include "levels.h" +#include "tblib.h" +#include "soundIt.h" + + /* Define this to get a frames per second readout */ +/* #define DEBUG_ON */ + + /* The sounds */ +#define NUM_SAMPLES 4 +#define SND_CC 0 +#define SND_BONK 1 +#define SND_KAPOW 2 +#define SND_ZRRP 3 + + /* The global variables ;) I like global variables hehe */ +extern vmw_font *tb1_font; +extern ggi_visual_t vis; +extern ggi_visual_t vaddr; +extern ggi_visual_t vaddr2; +extern ggi_color eight_bit_pal[256]; +extern ggi_pixel tb1_pal[256]; +extern ggi_directbuffer_t dbuf_vis; +extern ggi_directbuffer_t dbuf_vaddr; +extern ggi_directbuffer_t dbuf_vaddr2; +extern ggi_pixellinearbuffer *plb_vis; +extern ggi_pixellinearbuffer *plb_vaddr; +extern ggi_pixellinearbuffer *plb_vaddr2; +extern int sound_possible; +extern int sound_enabled; +extern int color_depth; +extern int stride_factor; + + /* I like structures also ;) */ +struct enemyinfo { + int x,y; + int kind; + int out,exploding,boundarycheck,dead; + int explodeprogress; + int minx,maxx,xspeed,yspeed; + int hitsneeded; +}; + +struct bulletinfo { + int out,x,y; +}; + + /* Define how many sound effects there are */ +Sample sound_effects[NUM_SAMPLES]; + + /* o/~ more structures o/~ */ +struct enemyinfo enemy[5]; +struct bulletinfo bullet[3]; +struct timeval timing_info; +struct timezone dontcare; + + /* This seemed like a good idea to modularize things */ +int level_one_wave_behavior[]= + {0,0,0,0,0, 1,1,1,1,1, + 1,1,2,2,2, 2,2,2,2,2, + 3,3,3,3,3, 3,3,3,3,3, + 2,2,2,2,2, 2,3,3,3,3, + 3,3,3,3,3, 3,1,1,1,1, + 1,3,3,3,3, 3,3,3,3,3, + 3,2,2,2,2, 2,2,2,2,2, + 2,2,2,2,2, 2,1,1,1,1, + 1,1,1,3,3, 3,2,2,2,2, + 2,2,2,2,2, 2,1,1,1,1, + 1,4,4,4,4}; + + /* Yes I was too lazy to re-arrange the order of the functions */ +void beforeboss(); + + /* Defines the behavior of the objects in level 1 */ +int level_one_behavior(int reset) +{ + int what,temp,whichone,need_to_pause=0; + static int wave=0; + static int saucersout=0; + + if (reset) { + wave=0; + saucersout=0; + } + + if (level_one_wave_behavior[wave]!=4) wave++; + saucersout--; + if (saucersout<0) saucersout=0; + if (saucersout>5) saucersout=5; + + /* **START NEW WAVE ***/ + + switch(level_one_wave_behavior[wave]) { + + /* STANDARD */ + case 0: if (saucersout==0) { + saucersout=5; + what=(3+rand()%8); + for(temp=0; temp<5; temp++) { + enemy[temp].kind=what; + enemy[temp].x=0; + enemy[temp].y=0; + enemy[temp].xspeed=5; + enemy[temp].x=temp*20; + enemy[temp].minx=(temp*20); + enemy[temp].maxx=(temp*20)+120; + enemy[temp].boundarycheck=1; + enemy[temp].yspeed=10; + enemy[temp].out=1; + enemy[temp].exploding=0; + enemy[temp].hitsneeded=1; + enemy[temp].dead=0; + } + } break; + /* *FALLING STRAIGHT* */ + case 3: + for (temp=0; temp<5;temp++) + if (!enemy[temp].out) { + enemy[temp].kind=rand()%8+3; + enemy[temp].x=rand()%200+1; + enemy[temp].y=0; + enemy[temp].xspeed=0; + enemy[temp].minx=enemy[temp].x; + enemy[temp].maxx=enemy[temp].x; + enemy[temp].boundarycheck=1; + enemy[temp].yspeed=5+(wave/40); + enemy[temp].out=1; + enemy[temp].exploding=0; + enemy[temp].hitsneeded=1; + enemy[temp].dead=0; + saucersout++; + } break; + + /* *FALLING GRADUALLY SIDEWAYS* */ + case 2: + for(temp=0;temp<5;temp++) + if (!enemy[temp].out) { + enemy[temp].kind=rand()%8+3; + enemy[temp].y=0; + enemy[temp].xspeed=5; + enemy[temp].minx=rand()%100; + enemy[temp].maxx=rand()%100+120; + enemy[temp].x=enemy[temp].minx; + enemy[temp].boundarycheck=0; + enemy[temp].yspeed=1; + enemy[temp].out=1; + enemy[temp].exploding=0; + enemy[temp].hitsneeded=1; + enemy[temp].dead=0; + saucersout++; + } break; + + /**ZIG-ZAG**/ + case 1: if (!saucersout) { + saucersout=5; + whichone=rand()%8+3; + for(temp=0;temp<5;temp++) + if (!enemy[temp].out) { + enemy[temp].kind=whichone; + enemy[temp].y=temp*10; + enemy[temp].xspeed=5; + enemy[temp].minx=0; + enemy[temp].maxx=220; + enemy[temp].x=temp*20; + enemy[temp].boundarycheck=0; + enemy[temp].yspeed=1; + enemy[temp].out=1; + enemy[temp].exploding=0; + enemy[temp].hitsneeded=1; + enemy[temp].dead=0; + } + } break; + + /* Beginning of Boss */ + case 4: + if (!saucersout) { + beforeboss(); + need_to_pause=1; + enemy[0].kind=15; + enemy[1].kind=15; + enemy[2].kind=14; + for(temp=0;temp<3;temp++) { + enemy[temp].x=(temp*20)+10; + enemy[temp].y=0; + enemy[temp].xspeed=5; + enemy[temp].minx=0; + enemy[temp].maxx=220; + enemy[temp].boundarycheck=1; + enemy[temp].yspeed=0; + enemy[temp].out=1; + enemy[temp].exploding=0; + enemy[temp].hitsneeded=3; + enemy[temp].dead=0; + saucersout++; + } + } break; + default: break; + } + + /* Objects Cast off by the Boss */ + if (enemy[1].kind==15) { + /* Detect if Level One is Over */ + if ((enemy[0].dead) && (enemy[1].dead) && (enemy[2].dead)) return 9; + for(temp=3;temp<5;temp++) { + saucersout++; + if ((!enemy[temp].out) && (enemy[temp-3].out)) { + enemy[temp].kind=rand()%8+3; + enemy[temp].x=enemy[temp-3].x; + enemy[temp].y=20; + enemy[temp].xspeed=0; + enemy[temp].minx=enemy[temp].x; + enemy[temp].maxx=enemy[temp].x; + enemy[temp].boundarycheck=0; + enemy[temp].yspeed=4; + enemy[temp].out=1; + enemy[temp].exploding=0; + enemy[temp].hitsneeded=1; + enemy[temp].dead=0; + } + } + } + return need_to_pause; +} + + /* The little Sequence Before you hit the Boss */ +void beforeboss() +{ + char *tempst[300]; + + clear_keyboard_buffer(); + GGILoadPicPacked(0,0,vaddr,0,1, + tb1_data_file("viewscr.tb1",(char *)tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + ggiSetGCForeground(vis,0); + ggiDrawBox(vis,0,0,320,200); + vmwArbitraryCrossBlit(plb_vaddr->read,0,5,58,37, + plb_vis->write,10,10,plb_vis->stride,stride_factor); + VMWsmalltextxy("HUMAN!",70,10,tb1_pal[2],tb1_pal[0],1,tb1_font,vis); + VMWsmalltextxy("WHAT ARE YOU DOING?!",70,20,tb1_pal[2], + tb1_pal[0],1,tb1_font,vis); + VMWsmalltextxy("YOUR SPECIES MUST BE TERMINATED!",70,30,tb1_pal[2], + tb1_pal[0],1,tb1_font,vis); + pauseawhile(5); + vmwArbitraryCrossBlit(plb_vaddr->read,0,42,58,37, + plb_vis->write,10,50,plb_vis->stride,stride_factor); + VMWsmalltextxy("I'M SORRY.",70,50,tb1_pal[9],tb1_pal[0],1,tb1_font,vis); + VMWsmalltextxy("WE DIDN'T MEAN TO DESTROY YOUR ENVOY.",70,60,tb1_pal[9], + tb1_pal[0],1,tb1_font,vis); + VMWsmalltextxy("WILL YOU FORGIVE US AND TRY PEACE?",70,70,tb1_pal[9], + tb1_pal[0],1,tb1_font,vis); + pauseawhile(5); + vmwArbitraryCrossBlit(plb_vaddr->read,0,5,58,37, + plb_vis->write,10,90,plb_vis->stride,stride_factor); + VMWsmalltextxy("NO! YOU MUST BE DESTROYED!",70,90,tb1_pal[2], + tb1_pal[0],1,tb1_font,vis); + VMWsmalltextxy("OUR FUNDING ... OUR ENVOY WAS DAMAGED BY",70,100, + tb1_pal[2],tb1_pal[0],1,tb1_font,vis); + VMWsmalltextxy("YOU! VENGEANCE WILL BE OURS! YOUR PUNY",70,110, + tb1_pal[2],tb1_pal[0],1,tb1_font,vis); + VMWsmalltextxy("PRIMITIVE SPACECRAFT WITH ITS INFERIOR",70,120, + tb1_pal[2],tb1_pal[0],1,tb1_font,vis); + VMWsmalltextxy("WEAPONS WOULD HAVE TO SCORE 9 DIRECT HITS",70,130, + tb1_pal[2],tb1_pal[0],1,tb1_font,vis); + VMWsmalltextxy("TO DESTROY MY SHIP! DIE EARTH SCUM!!!!",70,140, + tb1_pal[2],tb1_pal[0],1,tb1_font,vis); + pauseawhile(5); +} + + /* The Sequence After You Defeat (hopefully) the Boss */ +void afterboss() +{ + char *tempst[300]; + + GGILoadPicPacked(0,0,vaddr,0,1, + tb1_data_file("viewscr.tb1",(char *)tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + ggiSetGCForeground(vis,tb1_pal[0]); + ggiDrawBox(vis,0,0,320,200); + vmwArbitraryCrossBlit(plb_vaddr->read,0,42,58,37, + plb_vis->write,10,10,plb_vis->stride,stride_factor); + VMWsmalltextxy("HMM.. THEY DON'T BUILD SUPERIOR",70,10, + tb1_pal[9],tb1_pal[0],1,tb1_font,vis); + VMWsmalltextxy("TECHNOLOGY LIKE THEY USED TO.",70,20, + tb1_pal[9],tb1_pal[0],1,tb1_font,vis); + VMWsmalltextxy("I GUESS I CAN GO HOME NOW.",70,30, + tb1_pal[9],tb1_pal[0],1,tb1_font,vis); + pauseawhile(5); + vmwArbitraryCrossBlit(plb_vaddr->read,0,5,58,37, + plb_vis->write,10,50,plb_vis->stride,stride_factor); + VMWsmalltextxy("NOT SO FAST! YOU JUST DESTROYED AN ANTIQUATED",70,50, + tb1_pal[2],tb1_pal[0],1,tb1_font,vis); + VMWsmalltextxy("DEFENSE SYSTEM THAT WAS PROGRAMMED BY A 16",70,60, + tb1_pal[2],tb1_pal[0],1,tb1_font,vis); + VMWsmalltextxy("YEAR OLD! OUR MAIN DEFENSE PROGRAMMER HAS ",70,70, + tb1_pal[2],tb1_pal[0],1,tb1_font,vis); + VMWsmalltextxy("MUCH MORE SKILL NOW! UNLESS YOU DESTROY OUR",70,80, + tb1_pal[2],tb1_pal[0],1,tb1_font,vis); + VMWsmalltextxy("ENTIRE XENOCIDE... I MEAN PEACE... ENVOY",70,90, + tb1_pal[2],tb1_pal[0],1,tb1_font,vis); + VMWsmalltextxy("WE WILL STILL DESTROY YOUR HOME PLANET.",70,100, + tb1_pal[2],tb1_pal[0],1,tb1_font,vis); + VMWsmalltextxy("NICE TRY PUNY EARTHLING!",70,110,tb1_pal[2], + tb1_pal[0],1,tb1_font,vis); + pauseawhile(7); + vmwArbitraryCrossBlit(plb_vaddr->read,0,42,58,37, + plb_vis->write,10,130,plb_vis->stride,stride_factor); + VMWsmalltextxy("HMM.. I GUESS I BETTER SAVE THE EARTH.",70,130, + tb1_pal[9],tb1_pal[0],1,tb1_font,vis); + VMWsmalltextxy("I'D BETTER SAVE MY GAME TOO.",70,140, + tb1_pal[9],tb1_pal[0],1,tb1_font,vis); + VMWsmalltextxy("D'OH! I''M OUT OF BIG MISSILES! ",70,150, + tb1_pal[9],tb1_pal[0],1,tb1_font,vis); + VMWsmalltextxy("WELL AT LEAST I HAVE SOME SMALLER SPARES.",70,160, + tb1_pal[9],tb1_pal[0],1,tb1_font,vis); + pauseawhile(5); +} + + /* The Main Level One */ +void levelone(int *level,int *shields,int *score) +{ + int ch=0; + int i,j,grapherror; + char tempst[300]; + int itemp,whatdelay=1,levelover=0; + int shipx=36,shipadd=0,shipframe=1; + int bigship1[1500],bigship2[1500],bigship3[1500]; + int shapetable[20][400]; + long oldsec,oldusec,time_spent; + int howmuchscroll=0; + int speed_factor=1,game_paused=0; + int beginscore,beginshield; + + /* Set this up for Save Game */ + beginscore=*score; + beginshield=*shields; + + /* Load All The Sounds */ + if (sound_possible) { + Snd_loadRawSample(tb1_data_file("tbcc.raw",(char *)&tempst), + &sound_effects[0],0); + Snd_loadRawSample(tb1_data_file("tbbonk.raw",(char *)&tempst), + &sound_effects[1],0); + Snd_loadRawSample(tb1_data_file("tbkapow.raw",(char *)&tempst), + &sound_effects[2],0); + Snd_loadRawSample(tb1_data_file("tbzrrp.raw",(char *)&tempst), + &sound_effects[3],0); + + /* Initialize Sound, if Possible */ + if (Snd_init( NUM_SAMPLES,sound_effects,22050,4, + "/dev/dsp")==EXIT_FAILURE) { + printf("ERROR! Cannot init sound.\n"); + sound_enabled=0; + } + } + /* Load Sprites (or whatever you want to call them) */ + grapherror=GGILoadPicPacked(0,0,vaddr,1,1, + tb1_data_file("ships.tb1",(char *)&tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + vmwGetSprite(vaddr,0,0,48,30,(int *)&bigship1); + vmwGetSprite(vaddr,0,32,48,30,(int *)&bigship2); + vmwGetSprite(vaddr,0,64,48,30,(int *)&bigship3); + + grapherror=GGILoadPicPacked(0,0,vaddr,1,1, + tb1_data_file("tbshapes.tb1",(char *)&tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + for(j=0;j<2;j++) + for(i=0;i<10;i++) + vmwGetSprite(vaddr,1+(i*19),1+(j*19),18,20, + (int *)&shapetable[(j*10)+i]); + + /* Set up initial Enemy Structs */ + for(i=0;i<5;i++) { + enemy[i].exploding=0; + enemy[i].out=0; + enemy[i].dead=0; + } + for(i=0;i<2;i++) { + bullet[i].out=0; + bullet[i].x=0; + bullet[i].y=0; + } + /* Setup and draw the sidebar */ + setupsidebar(*score,0,*shields); + ggiSetGCForeground(vis,tb1_pal[0]); + vmwCrossBlit(plb_vaddr->write,plb_vaddr2->read,plb_vaddr->stride,200); + sprintf(tempst,"%d",*level); + ggiDrawBox(vaddr2,251,52,63,7); + VMWtextxy(tempst,307,51,tb1_pal[12],tb1_pal[0],0,tb1_font,vaddr2); + + /* Clear the screen and draw the stars */ + ggiSetGCForeground(vaddr2,tb1_pal[0]); + ggiDrawBox(vaddr2,0,0,320,400); + for(i=0;i<100;i++) { + vmwPutSprite(shapetable[11],18,18,stride_factor, + plb_vaddr2->write,rand()%238, + rand()%400,plb_vaddr2->stride); + vmwPutSprite(shapetable[12],18,18,stride_factor, + plb_vaddr2->write,rand()%238, + rand()%400,plb_vaddr2->stride); + } + change_shields(shields); + + /* Draw the Little Box announcing the Start of the Level */ + ggiSetGCForeground(vis,tb1_pal[0]); + ggiDrawBox(vis,0,0,320,200); + coolbox(70,85,240,120,1,vis); + VMWtextxy(" LEVEL ONE:",84,95,tb1_pal[4],tb1_pal[7],0,tb1_font,vis); + VMWtextxy("INANIMATE OBJECTS",84,105,tb1_pal[4],tb1_pal[7],0,tb1_font,vis); + + /* Initiate some last variables */ + level_one_behavior(1); + pauseawhile(5); + gettimeofday(&timing_info,&dontcare); + oldsec=timing_info.tv_sec; oldusec=timing_info.tv_usec; + + /* MAIN GAME LOOP */ + while(!levelover) { + ch=0; + /* Scroll the Stars */ + if (speed_factor>1) howmuchscroll-=speed_factor; + else howmuchscroll--; + if (howmuchscroll<0) howmuchscroll=399; + if (howmuchscroll>199) { + vmwArbitraryCrossBlit(plb_vaddr2->read,0,howmuchscroll,240, + 400-howmuchscroll, + plb_vaddr->write,0,0,plb_vaddr->stride, + stride_factor); + vmwArbitraryCrossBlit(plb_vaddr2->read,0,0,240,howmuchscroll-200, + plb_vaddr->write,0,400-howmuchscroll, + plb_vaddr->stride, + stride_factor); + } + else { + vmwArbitraryCrossBlit(plb_vaddr2->read,0,howmuchscroll,240,200, + plb_vaddr->write,0,0,plb_vaddr->stride, + stride_factor); + } + + + /* Check for Collisions */ + for(i=0;i<5;i++) { + if (!enemy[i].dead) { + for(itemp=0;itemp<2;itemp++) { + if (bullet[itemp].out) + if (collision(bullet[itemp].x,bullet[itemp].y,10,10, + enemy[i].x,enemy[i].y,9,9)) { + if (sound_enabled) Snd_effect(SND_KAPOW,2); + enemy[i].hitsneeded--; + if (enemy[i].hitsneeded<1) enemy[i].dead=1; + else enemy[i].dead=0; + enemy[i].exploding=1; + enemy[i].explodeprogress=0; + bullet[itemp].out=0; + (*score)+=10; + changescore(*score,shields); + } + } + } + } + + /* Explode the things that are exploding */ + for(i=0;i<5;i++) { + if (enemy[i].exploding) { + enemy[i].explodeprogress++; + if (enemy[i].explodeprogress<=5) + vmwPutSprite(shapetable[enemy[i].explodeprogress+14], + 18,18,stride_factor, + plb_vaddr->write,enemy[i].x,enemy[i].y, + plb_vaddr->stride); + else if (enemy[i].dead) { + enemy[i].out=0; + enemy[i].exploding=0; + game_paused=level_one_behavior(0); + } + else enemy[i].exploding=0; + } + } + /* Move the Missiles */ + for(i=0;i<2;i++) { + if (bullet[i].out) { + if (speed_factor>1) bullet[i].y-=(5*speed_factor); + else bullet[i].y-=5; + if (bullet[i].y<5) bullet[i].out=0; + else vmwPutSprite(shapetable[0],18,18,stride_factor, + plb_vaddr->write,bullet[i].x,bullet[i].y, + plb_vaddr->stride); + } + } + + /* MOVE ENEMIES */ + for(i=0;i<5;i++) { + if ((enemy[i].out) && (!enemy[i].dead)) { + vmwPutSprite(shapetable[enemy[i].kind-1],18,18,stride_factor, + plb_vaddr->write,enemy[i].x,enemy[i].y, + plb_vaddr->stride); + if (speed_factor==1) enemy[i].x+=enemy[i].xspeed; + else enemy[i].x+=(enemy[i].xspeed*speed_factor); + /* Check Position */ + /* Check Position */ + if (!enemy[i].boundarycheck) + if (speed_factor>1) enemy[i].y+=(enemy[i].yspeed*speed_factor); + else enemy[i].y+=enemy[i].yspeed; + if ((enemy[i].x<=enemy[i].minx) || (enemy[i].x>=enemy[i].maxx)) { + enemy[i].xspeed=-enemy[i].xspeed; + if (speed_factor>1) enemy[i].x+=(enemy[i].xspeed*speed_factor); + else enemy[i].x+=enemy[i].xspeed; + if (speed_factor>1) enemy[i].y+=(enemy[i].yspeed*speed_factor); + else enemy[i].y+=enemy[i].yspeed; + } + /* Too Low */ + + /* Too Low */ + if (enemy[i].y>179) { + enemy[i].out=0; + game_paused=level_one_behavior(0); + } + if (enemy[i].y>140) { + if (collision(shipx,165,24,15,enemy[i].x,enemy[i].y,9,9)) { + if (sound_enabled) Snd_effect(SND_BONK,1); + enemy[i].hitsneeded--; + if (enemy[i].hitsneeded==0) enemy[i].dead=1; + else enemy[i].dead=0; + enemy[i].exploding=1; + enemy[i].explodeprogress=0; + (*shields)--; + if (*shields<0) levelover=1; + if (*shields>0) change_shields(shields); + } + } + } + } + /* See if beat the level. Yes, bad variable name. Oh well */ + if (game_paused==9) { + afterboss(); + *level=2; + levelover=1; + } + + /* **READ KEYBOARD** */ + if ( (ch=get_input())!=0) { + switch(ch){ + case TB_ESC: levelover=1; break; + case TB_RIGHT: if (shipadd>=0) shipadd+=3; else shipadd=0; break; + case TB_LEFT: if (shipadd<=0) shipadd-=3; else shipadd=0; break; + case TB_F1: game_paused=1; help(); break; + case '+': whatdelay++; if (whatdelay>25) whatdelay=25; break; + case 'P': case 'p': game_paused=1; + coolbox(65,85,175,110,1,vis); + VMWtextxy("GAME PAUSED",79,95,tb1_pal[4],tb1_pal[7], + 0,tb1_font,vis); + while (get_input()==0) { + usleep(30000); + } + break; + case '-': whatdelay--; if (whatdelay<1) whatdelay=1; break; + case 'S': + case 's': if(sound_possible) sound_enabled=!(sound_enabled); break; + case TB_F2: game_paused=1; savegame(*level,beginscore,beginshield); + break; + case ' ': for(j=0;j<2;j++) + if (!bullet[j].out) { + if (sound_enabled) Snd_effect(SND_CC,0); + bullet[j].out=1; + bullet[j].x=shipx+15; + bullet[j].y=165; + vmwPutSprite(shapetable[0],18,18,stride_factor, + plb_vaddr->write,bullet[j].x, + bullet[j].y,plb_vaddr->stride); + j=3; + } + } + } + + /* **MOVE SHIP** */ + if (speed_factor>1) shipx+=(shipadd*speed_factor); + else shipx+=shipadd; + if (shipx<1) shipx=1; + if (shipx>190) shipx=190; + switch(shipframe) { + case 1: vmwPutSprite(bigship1,48,30,stride_factor, + plb_vaddr->write,shipx,165, + plb_vaddr->stride); break; + case 3: vmwPutSprite(bigship2,48,30,stride_factor, + plb_vaddr->write,shipx,165, + plb_vaddr->stride); break; + case 2: + case 4: vmwPutSprite(bigship3,48,30,stride_factor, + plb_vaddr->write,shipx,165, + plb_vaddr->stride); break; + } + shipframe++; + if (shipframe==5) shipframe=1; + + /* Flip Pages */ + vmwCrossBlit(plb_vis->write,plb_vaddr->read,plb_vis->stride,200); + ggiFlush(vis); + + /* Calculate how much time has passed */ + gettimeofday(&timing_info,&dontcare); + time_spent=timing_info.tv_usec-oldusec; + if (timing_info.tv_sec-oldsec) time_spent+=1000000; +#ifdef DEBUG_ON + printf("%f\n",1000000/(float)time_spent); +#endif + /* If time passed was too little, wait a bit */ + while (time_spent<33000){ + gettimeofday(&timing_info,&dontcare); + usleep(5); + time_spent=timing_info.tv_usec-oldusec; + if (timing_info.tv_sec-oldsec) time_spent+=1000000; + } + /* It game is paused, don't keep track of time */ + if (!game_paused) speed_factor=(time_spent/30000); + oldusec=timing_info.tv_usec; + oldsec=timing_info.tv_sec; + if (game_paused) { + gettimeofday(&timing_info,&dontcare); + oldusec=timing_info.tv_usec; + oldsec=timing_info.tv_sec; + game_paused=0; + } + } + /* All Done. Close up sound */ + Snd_restore(); +} + + /* The little opener before Level 1 */ +void littleopener() +{ + int ship1[400],ship2[400]; + int i; + char *tempst[300]; + + ggiSetGCForeground(vaddr,tb1_pal[0]); + ggiDrawBox(vaddr,0,0,320,200); + GGILoadPicPacked(0,0,vaddr,1,1, + tb1_data_file("moon2.tb1",(char *)tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + GGILoadPicPacked(0,0,vis,1,0, + tb1_data_file("moon2.tb1",(char *)tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + vmwGetSprite(vaddr,9,178,15,18,ship1); + vmwGetSprite(vaddr,30,178,15,18,ship2); + ggiSetGCForeground(vis,tb1_pal[0]); + ggiDrawBox(vaddr,0,178,319,21); + vmwCrossBlit(plb_vis->write,plb_vaddr->read,plb_vis->stride,200); + vmwCrossBlit(plb_vaddr2->write,plb_vaddr->read,plb_vaddr->stride,200); + for(i=100;i>0;i--) { + vmwArbitraryCrossBlit(plb_vaddr2->read,0,95,320,40, + plb_vaddr->write,0,95, + plb_vaddr->stride,stride_factor); + vmwPutSprite(ship2,15,18,stride_factor, + plb_vaddr->write,i*2,100,plb_vaddr->stride); + vmwArbitraryCrossBlit(plb_vaddr->read,0,95,320,40, + plb_vis->write,0,95,plb_vaddr->stride, + stride_factor); + usleep(30000); + if (get_input()!=0) break; + } + vmwCrossBlit(plb_vis->write,plb_vaddr2->read,plb_vis->stride,200); + VMWtextxy(">KCHK< TOM! WHERE ARE YOU GOING?",5,180,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + ggiFlush(vis); + pauseawhile(3); + ggiDrawBox(vis,0,178,319,21); + VMWtextxy("Ooops. ",5,180,tb1_pal[24],tb1_pal[0],1,tb1_font,vis); + pauseawhile(3); + for(i=0;i<151;i++) { + vmwArbitraryCrossBlit(plb_vaddr2->read,0,95,320,40, + plb_vaddr->write,0,95,plb_vaddr->stride, + stride_factor); + vmwPutSprite(ship1,15,18,stride_factor, + plb_vaddr->write,i*2,100,plb_vaddr->stride); + vmwArbitraryCrossBlit(plb_vaddr->read,0,95,320,40, + plb_vis->write,0,95,plb_vaddr->stride, + stride_factor); + usleep(30000); + if (get_input()!=0) break; + } + vmwCrossBlit(plb_vis->write,plb_vaddr2->read,plb_vis->stride,200); + ggiSetGCForeground(vis,tb1_pal[0]); + ggiDrawBox(vis,0,0,320,200); + GGILoadPicPacked(0,0,vis,1,0, + tb1_data_file("tbgorg.tb1",(char *)tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + +} diff --git a/level2.c b/level2.c new file mode 100644 index 0000000..38ec90f --- /dev/null +++ b/level2.c @@ -0,0 +1,608 @@ +/* + * Level 2 Engine Code for Tom Bombem + * */ + + /* The Includes */ +#include +#include +#include +#include +#include +#include "svmwgrap.h" +#include "levels.h" +#include "tblib.h" +#include "soundIt.h" + + /* Define this to get a frames per second readout */ +/* #define DEBUG_ON */ + + /* The sounds */ +#define NUM_SAMPLES 4 +#define SND_CC 0 +#define SND_BONK 1 +#define SND_KAPOW 2 +#define SND_ZRRP 3 + + /* The global variables ;) I like global variables hehe */ +extern vmw_font *tb1_font; +extern ggi_visual_t vis; +extern ggi_visual_t vaddr; +extern ggi_visual_t vaddr2; +extern ggi_color eight_bit_pal[256]; +extern ggi_pixel tb1_pal[256]; +extern ggi_directbuffer_t dbuf_vis; +extern ggi_directbuffer_t dbuf_vaddr; +extern ggi_directbuffer_t dbuf_vaddr2; +extern ggi_pixellinearbuffer *plb_vis; +extern ggi_pixellinearbuffer *plb_vaddr; +extern ggi_pixellinearbuffer *plb_vaddr2; +extern int sound_possible; +extern int sound_enabled; +extern int color_depth; +extern int stride_factor; + +struct enemyinfo { + int x,y; + int kind; + int out,exploding,boundarycheck,dead; + int explodeprogress; + int minx,maxx,xspeed,yspeed; + int hitsneeded; +}; + +struct bulletinfo { + int out,x,y; +}; + +struct obstruction { + int x,y; + int shooting,dead,exploding; + int explodeprogress; + int howmanyhits; + int kind,lastshot; +}; + + /* Define how many sound effects there are */ +Sample sound_effects[NUM_SAMPLES]; + + +void leveltwoengine(int *level, int *shields, int *score) +{ + int ch,i; + char tempst[300]; + int k,game_paused=0,speed_factor=1; + int shipx=36; + int whatdelay=1,beginscore,beginshield; + FILE *f=NULL; + int levelover=0,j,backrow=0; + int background[201][13]; + struct enemyinfo enemy[10]; + struct bulletinfo bullet[4]; + struct timeval timing_info; + struct timezone dontcare; + + long oldsec,oldusec,time_spent; + int howmuchscroll=0; + struct obstruction passive[50]; + int shipadd=0,shipframe=1; + int our_row,our_shape,rows_goneby=0; + + int ship_shape[3][1600]; + int shape_table[40][200]; + int enemies_drawn[200]; + + /* Set this up for Save Game */ + beginscore=*score; + beginshield=*shields; + + /* Load All The Sounds */ + if (sound_possible) { + Snd_loadRawSample(tb1_data_file("tbcc.raw",(char *)&tempst), + &sound_effects[0],0); + Snd_loadRawSample(tb1_data_file("tbbonk.raw",(char *)&tempst), + &sound_effects[1],0); + Snd_loadRawSample(tb1_data_file("tbkapow.raw",(char *)&tempst), + &sound_effects[2],0); + Snd_loadRawSample(tb1_data_file("tbzrrp.raw",(char *)&tempst), + &sound_effects[3],0); + + /* Initialize Sound, if Possible */ + if (Snd_init( NUM_SAMPLES,sound_effects,22050,4, + "/dev/dsp")==EXIT_FAILURE) { + printf("ERROR! Cannot init sound.\n"); + sound_enabled=0; + } + } + + /* Load Sprites (or whatever you want to call them) */ + GGILoadPicPacked(0,0,vaddr,1,1, + tb1_data_file("ships.tb1",(char *)tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + + vmwGetSprite(vaddr,0,0,48,30,(int *)&ship_shape[0]); + vmwGetSprite(vaddr,0,32,48,30,(int *)&ship_shape[1]); + vmwGetSprite(vaddr,0,64,48,30,(int *)&ship_shape[2]); + + if (*level==2) GGILoadPicPacked(0,0,vaddr,1,1, + tb1_data_file("tbaship.tb1",(char *)tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + if (*level==4) GGILoadPicPacked(0,0,vaddr,1,1, + tb1_data_file("tbeerm.tb1",(char *)tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + + for(j=0;j<4;j++) + for(i=0;i<10;i++) + vmwGetSprite(vaddr,1+i*21,1+j*11,20,10,(int *)&shape_table[j*10+i]); + + /* Load Background Data */ + if (*level==2) f=fopen(tb1_data_file("level2.dat",(char *)tempst),"r"); + if (*level==4) f=fopen(tb1_data_file("level4.dat",(char *)tempst),"r"); + if (f==NULL) printf("ERROR! Could't open level %d data!\n",*level); + + for(j=0;j<200;j++) + for(i=0;i<12;i++) fscanf(f,"%d",&background[j][i]); + fclose(f); + + /* Initialize Structures for enemy, bullets, and background */ + for(i=0;i<50;i++) { + passive[i].dead=1; + passive[i].exploding=0; + } + for(i=0;i<10;i++) enemy[i].out=0; + for(i=0;i<3;i++) { + bullet[i].out=0; + bullet[i].x=0; + bullet[i].y=0; + } + for(i=0;i<200;i++) enemies_drawn[i]=0; + + /* Setup and draw the sidebar */ + setupsidebar(*score,0,*shields); + ggiSetGCForeground(vis,tb1_pal[0]); + vmwCrossBlit(plb_vaddr->write,plb_vaddr2->read,plb_vaddr->stride,200); + sprintf(tempst,"%d",*level); + ggiDrawBox(vaddr2,251,52,63,7); + VMWtextxy(tempst,307,51,tb1_pal[12],tb1_pal[0],0,tb1_font,vaddr2); + + /* Clear the screen and draw the stars */ + ggiSetGCForeground(vaddr2,tb1_pal[0]); + ggiDrawBox(vaddr2,0,0,320,400); + for(i=0;i<100;i++) { + vmwPutSprite(shape_table[32],20,10,stride_factor, + plb_vaddr2->write,rand()%238, + rand()%400,plb_vaddr2->stride); + vmwPutSprite(shape_table[33],20,10,stride_factor, + plb_vaddr2->write,rand()%238, + rand()%400,plb_vaddr2->stride); + } + change_shields(shields); + + /* Announce the Start of the Level */ + ggiSetGCForeground(vis,tb1_pal[0]); + ggiDrawBox(vis,0,0,320,200); + coolbox(70,85,240,120,1,vis); + if (*level==2) { + VMWtextxy(" LEVEL TWO:",84,95,tb1_pal[4],tb1_pal[7],0,tb1_font,vis); + VMWtextxy("THE \"PEACE ENVOY\"",84,105,tb1_pal[4],tb1_pal[7],0,tb1_font,vis); + } + if (*level==4) { + VMWtextxy(" LEVEL FOUR:",84,95,tb1_pal[4],tb1_pal[7],0,tb1_font,vis); + VMWtextxy(" THE PLANET EERM",84,105,tb1_pal[4],tb1_pal[7],0,tb1_font,vis); + } + clear_keyboard_buffer(); + pauseawhile(5); + + gettimeofday(&timing_info,&dontcare); + oldsec=timing_info.tv_sec; oldusec=timing_info.tv_usec; + + /**** GAME LOOP ****/ + while (!levelover) { + ch=0; + /* Scroll the Background */ + if (speed_factor>1) howmuchscroll-=speed_factor; + else howmuchscroll--; + if (howmuchscroll<0) { + howmuchscroll=200+howmuchscroll; + ggiCopyBox(vaddr2,0,0,240,200,0,200); + for(i=0;i<12;i++) + for(j=19;j>=0;j--) { + our_shape=background[backrow+(19-j)][i]; + vmwPutSprite(shape_table[our_shape], + 20,10,stride_factor, + plb_vaddr2->write,i*20,j*10, + plb_vaddr2->stride); + } + backrow+=20; + } + /* Setup Obstructions */ + our_row=rows_goneby/10; + if (!enemies_drawn[our_row]) { + enemies_drawn[our_row]=1; + for(i=0;i<12;i++) { + our_shape=background[our_row][i]; + if ((our_shape>9)&&(our_shape<20)) { + k=0; + while ((!passive[k].dead) && (k<40)) k++; + passive[k].dead=0; + passive[k].kind=our_shape; + if ((our_shape>10) && (our_shape<15)) passive[k].shooting=1; + else passive[k].shooting=0; + passive[k].exploding=0; + passive[k].x=i*20; + passive[k].y=(rows_goneby%10)-9; + passive[k].howmanyhits=1; + passive[k].lastshot=0; + } + } + } + /* Flip the far background to vaddr */ + vmwArbitraryCrossBlit(plb_vaddr2->read,0,0+howmuchscroll,240,200, + plb_vaddr->write,0,0,plb_vaddr->stride, + stride_factor); + + /***Collision Check***/ + for(i=0;i<40;i++) + if ((!passive[i].dead) && (!passive[i].exploding)) { + for(j=0;j<3;j++) { + if ((bullet[j].out) && + (collision(bullet[j].x,bullet[j].y,3,4,passive[i].x, + passive[i].y,10,5))){ + if (passive[i].kind!=10) { + if (sound_enabled) Snd_effect(SND_KAPOW,2); + passive[i].exploding=1; + passive[i].explodeprogress=0; + bullet[j].out=0; + *score+=10; + changescore(*score,shields); + } + else { + bullet[j].out=0; + k=0; + while ((!enemy[k].out) && (k<10)) k++; + if (k<9) { + enemy[k].out=1; + enemy[k].y=bullet[j].y; + enemy[k].x=bullet[j].x; + enemy[k].yspeed=7; + enemy[k].kind=21; + } + } + } + } + + /* See if ship is hitting any Obstructions*/ + if ((passive[i].y>155) && (passive[i].kind!=10)) { + if ((collision(passive[i].x,passive[i].y,10,5,shipx+16,165,5,5))|| + (collision(passive[i].x,passive[i].y,10,5,shipx+6,175,18,8))) { + if (sound_enabled) Snd_effect(SND_BONK,1); + passive[i].dead=1; + (*shields)--; + if(*shields<0) levelover=1; + vmwPutSprite(shape_table[34], + 20,10,stride_factor,plb_vaddr2->write, + passive[i].x,passive[i].y+howmuchscroll, + plb_vaddr2->stride); + change_shields(shields); + } + } + } + /* See if hit by lasers */ + for (i=0;i<10;i++) + if (enemy[i].out) { + if ((collision(enemy[i].x,enemy[i].y,2,5,shipx+16,165,5,5)) || + (collision(enemy[i].x,enemy[i].y,2,5,shipx+6,175,18,8))) { + if (sound_enabled) Snd_effect(SND_BONK,1); + enemy[i].out=0; + (*shields)--; + if (*shields<0) levelover=1; + change_shields(shields); + } + } + + /***DO EXPLOSIONS***/ + for(i=0;i<40;i++) + if (passive[i].exploding) { + passive[i].explodeprogress++; + vmwPutSprite(shape_table[35+passive[i].explodeprogress], + 20,10,stride_factor,plb_vaddr2->write, + passive[i].x,passive[i].y+howmuchscroll, + plb_vaddr2->stride); + if (passive[i].explodeprogress>4) { + passive[i].dead=1; + passive[i].exploding=0; + vmwPutSprite(shape_table[34],20,10,stride_factor, + plb_vaddr2->write,passive[i].x, + passive[i].y+howmuchscroll, + plb_vaddr2->stride); + + } + } + + /***MOVE BULLET***/ + for(i=0;i<3;i++) { + if (bullet[i].out) { + if (speed_factor>1) bullet[i].y-=(5*speed_factor); + else bullet[i].y-=5; + if (bullet[i].y<5) bullet[i].out=0; + else vmwPutSprite(shape_table[20],20,10,stride_factor, + plb_vaddr->write,bullet[i].x,bullet[i].y, + plb_vaddr->stride); + } + } + + /***MOVE ENEMIES***/ + for(j=0;j<40;j++) { + if (!passive[j].dead) { + if (speed_factor==1) passive[j].y++; + else passive[j].y+=speed_factor; + if (passive[j].y>190) passive[j].dead=1; + } + if (passive[j].lastshot>0) passive[j].lastshot--; + if ((!passive[j].dead) && (passive[j].shooting) + && (!passive[j].lastshot) && (passive[j].y>0)) { + k=0; + while ((enemy[k].out) && (k<10)) k++; + if (k<9) { + passive[j].lastshot=30; + enemy[k].out=1; + enemy[k].y=passive[j].y; + enemy[k].x=passive[j].x+5; + enemy[k].yspeed=5; + enemy[k].kind=25; + if (passive[j].kind==11) enemy[k].kind=26; + } + } + } + + for(j=0;j<10;j++) { + if (enemy[j].out) { + vmwPutSprite(shape_table[enemy[j].kind],20,10,stride_factor, + plb_vaddr->write,enemy[j].x,enemy[j].y, + plb_vaddr->stride); + if (speed_factor==1) enemy[j].y+=enemy[j].yspeed; + else enemy[j].y+=(enemy[j].yspeed*speed_factor); + if (enemy[j].y>189) enemy[j].out=0; + } + } + + /***READ KEYBOARD***/ + if ((ch=get_input())!=0) { + switch(ch) { + case TB_ESC: levelover=1; break; + case TB_RIGHT: if (shipadd>=0) shipadd+=3; else shipadd=0; break; + case TB_LEFT: if (shipadd<=0) shipadd-=3; else shipadd=0; break; + case TB_F1: game_paused=1; help(); break; + case '+': whatdelay++; break; + case 'P': case 'p': game_paused=1; + coolbox(65,85,175,110,1,vis); + VMWtextxy("GAME PAUSED",79,95,tb1_pal[4],tb1_pal[7], + 0,tb1_font,vis); + while (get_input()==0) usleep(30000); + break; + case '-': whatdelay--; break; + case 'S': + case 's': if(sound_possible) sound_enabled=!(sound_enabled); break; + case TB_F2: game_paused=1; savegame(*level,beginscore,beginshield); + break; + case ' ': for(j=0;j<3;j++) + if (!bullet[j].out) { + if (sound_enabled) Snd_effect(SND_CC,0); + bullet[j].out=1; + bullet[j].x=shipx+21; + bullet[j].y=165; + vmwPutSprite(shape_table[20],20,10,stride_factor, + plb_vaddr->write,bullet[j].x, + bullet[j].y,plb_vaddr->stride); + j=4; + } + + } + } + + + + /***MOVE SHIP***/ + if (speed_factor>1) { + shipx+=(shipadd*speed_factor); + rows_goneby+=(speed_factor); + } + else { + shipx+=shipadd; + rows_goneby++; + } + if (shipx<1) shipx=1; + if (shipx>190) shipx=190; + switch(shipframe) { + case 1: vmwPutSprite(ship_shape[0],48,30,stride_factor, + plb_vaddr->write,shipx,165, + plb_vaddr->stride); break; + case 3: vmwPutSprite(ship_shape[1],48,30,stride_factor, + plb_vaddr->write,shipx,165, + plb_vaddr->stride); break; + case 2: + case 4: vmwPutSprite(ship_shape[2],48,30,stride_factor, + plb_vaddr->write,shipx,165, + plb_vaddr->stride); break; + } + shipframe++; + if (shipframe==5) shipframe=1; + + /* Flip Pages */ + vmwCrossBlit(plb_vis->write,plb_vaddr->read,plb_vis->stride,200); + ggiFlush(vis); + + /* Calculate how much time has passed */ + gettimeofday(&timing_info,&dontcare); + time_spent=timing_info.tv_usec-oldusec; + if (timing_info.tv_sec-oldsec) time_spent+=1000000; +#ifdef DEBUG_ON + printf("%f\n",1000000/(float)time_spent); +#endif + /* If time passed was too little, wait a bit */ + while (time_spent<33000){ + gettimeofday(&timing_info,&dontcare); + usleep(5); + time_spent=timing_info.tv_usec-oldusec; + if (timing_info.tv_sec-oldsec) time_spent+=1000000; + } + + /* It game is paused, don't keep track of time */ + + if (game_paused) { + gettimeofday(&timing_info,&dontcare); + oldusec=timing_info.tv_usec; + oldsec=timing_info.tv_sec; + game_paused=0; + speed_factor=1; + } + else { + speed_factor=(time_spent/30000); + oldusec=timing_info.tv_usec; + oldsec=timing_info.tv_sec; + } + + + /*printf("%i\n",rows_goneby);*/ + if (rows_goneby>1950) { + printf("%i\n",rows_goneby); + /* + clearkeyboardbuffer; + pauseawhile(200); + fade; + grapherror:=Mode13LoadPicPacked(0,0,vaddr,false,true,'viewscr.tb1'); + cls(0,vga); + blockmove(0,79,58,116,vaddr,10,10,vga); + clearkeyboardbuffer; + outsmalltextxy('UNIDENTIFIED SPACECRAFT!',70,10,2,0,vga,true); + outsmalltextxy('DO YOU WISH TO DEACTIVATE ',70,20,2,0,vga,true); + outsmalltextxy('THIS SHIP''S SECURITY SYSTEMS? (Y/N)',70,30,2,0,vga,true); + unfade; + clearkeyboardbuffer; + ch:='!'; + repeat + if keypressed then ch:=readkey; + until (upcase(ch)='Y') or (upcase(ch)='N'); + + if upcase(ch)='N' then begin + blockmove(0,79,58,116,vaddr,10,50,vga); + outsmalltextxy('NO? AFFIRMATIVE. ',70,50,9,0,vga,true); + outsmalltextxy('ARMING REMOTE DESTRUCTION RAY.',70,60,9,0,vga,true); + outsmalltextxy('GOOD-BYE.',70,70,9,0,vga,true); + pauseawhile(400); + fade; + end; + + if upcase(ch)='Y' then begin + blockmove(0,79,58,116,vaddr,10,50,vga); + outsmalltextxy('"Y"=CORRECT PASSWORD. ',70,50,2,0,vga,true); + outsmalltextxy('WELCOME SUPREME TENTACLEE COMMANDER.',70,60,2,0,vga,true); + outsmalltextxy('INITIATING TRACTOR BEAM AND AUTOMATIC',70,70,2,0,vga,true); + outsmalltextxy('LANDING PROCEDURE.',70,80,2,0,vga,true); + outsmalltextxy('WE WILL BE DEPARTING FOR THE PLANET',70,90,2,0,vga,true); + outsmalltextxy('EERM IN THREE MICROCYCLE UNITS.',70,100,2,0,vga,true); + pauseawhile(550); + level:=3; + clearkeyboardbuffer; + blockmove(0,42,58,79,vaddr,10,110,vga); + outsmalltextxy('Wha? Wait!',70,110,9,0,vga,true); + outsmalltextxy('What''s happening?',70,120,9,0,vga,true); + pauseawhile(550); + fade; + end; + + grapherror:=Mode13LoadPicPacked(0,0,vaddr,false,true,'tbtract.tb1'); + for i:=0 to 239 do + for j:=0 to 49 do + putpixel240(i,j,getpixel(i,j,vaddr),vaddr2); + cls(0,vga); + unfade; + for howmuchscroll:=50 downto 1 do begin + flipd240(howmuchscroll,vaddr,vaddr2); + putshape (bigship3off,vaddr,43,30,shipx,165); + waitretrace; + flipd320(vaddr,vga); + end; + + if upcase(ch)='N' then begin + clearkeyboardbuffer; + line(7,6,shipx+10,180,4,vga); + line(shipx+37,180,231,6,4,vga); + pauseawhile(50); + clearkeyboardbuffer; + for i:=shipx to shipx+48 do + verticalline(165,195,i,4,vga); + pauseawhile(200); + flipd240(howmuchscroll,vaddr,vaddr2); + flipd320(vaddr,vga); + pauseawhile(150); + end; + + + if upcase(ch)='Y' then begin; + shipadd:=sgn(shipx-95); + shipy:=165; + repeat + if shipx<>95 then shipx:=shipx-shipadd; + if shipy>9 then dec(shipy); + flipd240(howmuchscroll,vaddr,vaddr2); + line(7,6,shipx+10,shipy+15,2,vaddr); + line(shipx+37,shipy+15,231,6,2,vaddr); + putshape (bigship3off,vaddr,43,30,shipx,shipy); + waitretrace; + flipd320(vaddr,vga); + until (shipx=95) and (shipy=9); + clearkeyboardbuffer; + pauseawhile(850); + fade; + cls(0,vga); + + + while keypressed do ch:=readkey; + if level=4 then begin + outsmalltextxy('THE PLANET EERM?',20,20,10,0,vga,true); + outsmalltextxy('XENOCIDE FLEET?',20,30,10,0,vga,true); + outsmalltextxy('WHAT''S GOING ON?',20,40,10,0,vga,true); + outsmalltextxy('A MAJOR GOVERNMENT CONSPIRACY? MASS HALUCINATIONS?',20,50,10,0,vga,true); + + outsmalltextxy('WATCH FOR TOM BOMBEM LEVEL 3 (CURRENTLY IN THE DESIGN PHASE).',10,70,12,0,vga,true); + outsmalltextxy('ALL THESE QUESTIONS WILL BE ANSWERED!',10,80,12,0,vga,true); + outsmalltextxy('ALSO MORE FEATURES WILL BE ADDED:',10,90,12,0,vga,true); + outsmalltextxy(' BETTER GRAPHICS, SOUND AND SPEED.',10,100,12,0,vga,true); + + outsmalltextxy('TO HASTEN COMPLETION, SEND QUESTIONS/COMMENTS/DONATIONS TO ',9,120,9,0,vga,true); + outsmalltextxy('THE AUTHOR (SEE THE REGISTER MESSAGE FOR RELEVANT ADDRESSES).',9,130,9,0,vga,true); + + outsmalltextxy('THANK YOU FOR PLAYING TOM BOMBEM',80,150,14,0,vga,true); + unfade; + pauseawhile(1800); + end; */ + levelover=1; + } + } + Snd_restore(); +} + + + +void littleopener2() +{ + char tempst[300]; + + ggiSetGCForeground(vis,tb1_pal[0]); + ggiDrawBox(vis,0,0,320,200); + ggiSetGCForeground(vaddr,tb1_pal[0]); + ggiDrawBox(vaddr,0,0,320,200); + GGILoadPicPacked(0,0,vis,1,1, + tb1_data_file("tbl2ship.tb1",(char *)tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + VMWtextxy("Hmmmm... ",10,10,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("This Might Be Harder Than I Thought.",10,20,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + pauseawhile(13); + ggiSetGCForeground(vis,tb1_pal[0]); + ggiDrawBox(vis,0,0,320,200); + +} diff --git a/levels.h b/levels.h new file mode 100644 index 0000000..6ff9486 --- /dev/null +++ b/levels.h @@ -0,0 +1,4 @@ +void levelone(int *level, int *shields,int *score); +void littleopener(); +void leveltwoengine(int *level, int *shields, int *score); +void littleopener2(); diff --git a/procs.c b/procs.c new file mode 100644 index 0000000..d2f372a --- /dev/null +++ b/procs.c @@ -0,0 +1,4142 @@ +/*program TOM_BOMB_EM_AND_INVASION_OF_INANIMATE_OBJECTS; +{version 2.4a} + {by Vincent Weaver....21085-4706} + +uses svmwgraph,nvmwgraph,crt,detect,smix,dos; + +*/ + +#include + + +int NumSounds = 8; + +/* {Shape Table Values For Story} + bargeoff = 0; + bigflame1off = 290; + bigflame2off = 780; + sflame2off = 1270; + sflame1off = 1290; + truck1off = 1310; + truck2off = 1370; + explo1off = 1430; + explo2off = 1730; + rent1off = 2030; + {Shape Table Values for Game} + shape1off = 8000; + shape2off = 8400; + shape3off = 8800; + shape4off = 9200; + shape5off = 9600; + shape6off = 10000; + shape7off = 10400; + shape8off = 10800; + shape9off = 11200; + shape10off = 11600; + shape11off = 12000; + shape12off = 12400; + shape13off = 12800; + shape14off = 13200; + shape15off = 13600; + shape16off = 14000; + shape17off = 14400; + shape18off = 14800; + shape19off = 15200; + shape20off = 15600; + bigship1off = 0; + bigship2off = 1600; + bigship3off = 3200; + shapearray : + array [1..20] of word =(8000,8400,8800,9200, + 9600,10000,10400,10800, + 11200,11600,12000,12400, + 12800,13200,13600,14000, + 14400,14800,15200,15600); + + + shape2array : + array [0..39] of word =(8000,8200,8400,8600,8800, + 9000,9200,9400,9600,9800, + 10000,10200,10400,10600,10800, + 11000,11200,11400,11600,11800, + 12000,12200,12400,12600,12800, + 13000,13200,13400,13600,13800, + 14000,14200,14400,14600,14800, + 15000,15200,15400,15600,15800); + + shape3array : + array [0..79] of word =(8000,8100,8200,8300,8400, + 8500,8600,8700,8800,8900, + 9000,9100,9200,9300,9400, + 9500,9600,9700,9800,9900, + 10000,10100,10200,10300,10400, + 10500,10600,10700,10800,10900, + 11000,11100,11200,11300,11400, + 11500,11600,11700,11800,11900, + 12000,12100,12200,12300,12400, + 12500,12600,12700,12800,12900, + 13000,13100,13200,13300,13400, + 13500,13600,13700,13800,13900, + 14000,14100,14200,14300,14400, + 14500,14600,14700,14800,14900, + 15000,15100,15200,15300,15400, + 15500,15600,15700,15800,15900); + + + + + + +var {Brodsky's Variables} + BaseIO: word; IRQ, DMA, DMA16: byte; + Sound: array[0..NumSounds-1] of PSound; + OldExitProc: pointer; + Xsoundeffects,Xsbsound:byte; + */ +int sbsound,sbeffects; + /* XBASEIO,XDMA,XIRQ:word; + +type ScreenType = array [0..3999] of byte; {For Ansi Loading} + + + EnemyInfo = record + x,y:integer; + kind:byte; + out,exploding,boundarycheck,dead:boolean; + explodprogress:byte; + minx,maxx,xspeed,yspeed:integer; + hitsneeded:integer; + end; + Obstruction = record + x,y:integer; + shooting,dead,exploding:boolean; + explodeprogress:byte; + howmanyhits:integer; + kind,lastshot:byte; + end; + + + + + + + Virtual = Array [1..64000] of byte; { The size of our Virtual Screen } + VirtPtr = ^Virtual; { Pointer to the virtual screen } + + ShapeTable = Array [0..16000] of byte; + ShapePtr = ^ShapeTable; +*/ + +int ho,mi,se,s100; + /* background:array[0..200,0..11] of byte; + tempsec:integer; + flames:boolean; + inte:integer; + dev,mix,stat,pro,loop : integer; + testr,string_param,md : string; + howmuchscroll:byte; + filestuff:searchrec; {for load game} + savegamef:text; + ondisk:string; + tempch:char; + CDROMmode:boolean; + +VAR Virscr,VirScr2,VirScr3 : VirtPtr; { Our first Virtual screen } + ShapeTable1:ShapePtr; + num:byte; + Vaddr,Vaddr2,Vaddr3 : Word; { The segment of our 2nd virt. screen} + ShapeAddr:word; { The segment of the shape table} + ShapeOfs:word; + backofs,backseg:word; + ourpal : Array [0..255,1..3] of byte; { A virtual pallette } + enemy:array[0..5] of enemyinfo; + passive:array[0..30] of obstruction; + numpassive:integer; + Soundp : Pointer; + Check : BOOLEAN; + + hiscore,level,shields:integer; + beginscore,beginshields:integer; + score:longint; + axel_und_carmen:boolean; + tempi,tempj:integer; + scorest:string[8]; + soundeffects:boolean; + lowscore:integer; + it,hiname:string[10]; + shipxadd,shipyadd,shipadd,shipx,shipy,shipspeed,shipframe:integer; + + +var grapherror:byte; + temp:array[1..3] of byte; + i,j:byte; + x,y,barpos:integer; + screen:screentype absolute $B800:0000; + ch:char; +*/ + +void clearkeyboardbuffer() +{ + /* mem[$0040:$001c]:=mem[$0040:$001a];*/ +} + + +void fillblock(int xx1,int yy1,int xx2,int yy2,int colo,int where) +{ + +} + +void ReadConfigFile() +{ + + FILE *fff; + + if(1) /*!(CDROMmode)*/{ + /*{$I-} + assign(ff,'config.tb1'); + reset(ff); + close(ff); + {$I+} + if IOresult<>0 then begin + textcolor(12); + writeln('Warning: Missing or Invalid "config.tb1" file'); + writeln; + textcolor(3); + writeln('If you are running this off of a CD-ROM drive:'); + textcolor(7); + writeln(' For optimal performance you should copy this game'); + writeln(' to a floppy or hard disk. However you can play in'); + writeln(' read only mode.'); + writeln; + textcolor(3); + writeln('If you are not running this off of a CD-ROM drive:'); + textcolor(7); + write(' Please run the "'); + textcolor(2); + write('tbsetup'); + textcolor(7); + writeln('" utility included to set'); + writeln(' up your computer. Thank You.'); + writeln; + textcolor(3); + writeln('It is possible to play this game in read only mode. There will'); + writeln('be no high scores or saved games, but it is playable.'); + writeln; + textcolor(12); + writeln('Press ''R'' to play in read-only mode.'); + clearkeyboardbuffer; + repeat until keypressed; + ch:=readkey; + textcolor(7); + if upcase(ch)='R' then CDROMmode:=true + else halt(5); + end; + end; + if not(CDROMmode) then begin + assign(ff,'config.tb1'); + reset(ff); + readln(ff,Xsoundeffects); + readln(ff,Xsbsound); + readln(ff,Xbaseio); + readln(ff,Xirq); + readln(ff,Xdma); + close(ff); + end + else begin + writeln; + writeln; + textcolor(2); + writeln('Do you want soundblaster effects? (y/n)'); + writeln; + textcolor(7); + writeln(' (If you encounter problems, be sure the SET BLASTER'); + writeln(' environmental variable is set. See your soundcard''s manual).'); + clearkeyboardbuffer; + repeat until keypressed; + ch:=readkey; if upcase(ch)='Y' then begin + xsbsound:=1; Xsoundeffects:=1; soundeffects:=true; + end + else begin xsbsound:=0; Xsoundeffects:=0; soundeffects:=false; + end; + end; +end; +*/ + } +} + + +char menuread() +{ +/*var chtemp,ch2:char; +begin + repeat until keypressed; + ch2:=#0; + chtemp:=readkey; + if chtemp=chr(0) then ch2:=readkey; + chtemp:=upcase(chtemp); + if (ord(chtemp)<10) and (ord(chtemp)<128) then begin + if ch2='H' then chtemp:='ß'; {up} + if ch2='M' then chtemp:='Þ'; {right} + if ch2='P' then chtemp:='Ü'; {down} + if ch2='K' then chtemp:='Ý'; {left} + if ch2=';' then chtemp:='¨'; {f1} + if ch2='I' then chtemp:='ô'; {pgup} + if ch2='Q' then chtemp:='õ'; {pgdown} + end; + menuread:=chtemp; +end; +*/ +} + +void coolbox(int x1,int y1,int x2,int y2,int fill,int page) +{ + int i; + /* + for(i=0;i<5;i++) box(x1+i,y1+i,x2-i,y2-i,31-i,page); + if(fill) for (i=y1+5;iscores[tempi] then inc(place); + place:=10-place; + for tempi:=9 downto place do scores[tempi]:=scores[tempi-1]; + for tempi:=9 downto place do names[tempi]:=names[tempi-1]; + scores[place]:=score; + names[place]:=hiname; + if not(CDROMmode) then begin + assign(hilist,'HISCORE.TB1'); + rewrite(hilist); + for i:=0 to 9 do writeln(hilist,names[i]); + for i:=0 to 9 do writeln(hilist,scores[i]); + close(hilist); + end; + end; +*/ +} + +/*procedure putshape240over(shapeoffset,towhere,xacross,yacross,xx,yy:word); +label bob,bob2,bob3; +begin + asm + {saves registers} + push ds + mov cx,[yy] {multiplies y value by 320} + shl cx,4 + mov ax,cx + shl cx,1 + add ax,cx + shl cx,1 + add ax,cx + shl cx,1 + add ax,cx + add ax,[xx] {adds the x-value to get offset} + mov di,ax + + + mov bx,[yacross] + xor dx,dx + mov ax,[shapeaddr] {moves segment of array} + mov ds,ax + mov ax,[shapeoffset] {moves offsett if array} + {add ax,[shapeofs]} + mov si,ax + mov ax,towhere {loads place to move it} + + mov es,ax + xor cx,cx + xor dx,dx + mov ax,240 + sub ax,[xacross] {xacross?} + bob: + mov cx,[xacross] {how long to loop across (the x-size of array)} + rep movsb + cmp dx,bx + jz bob3 + xor cx,cx + add di,ax + inc dx + jmp bob + bob3: + {restore variables} + pop ds + end; +end; + +procedure putshape240(shapeoffset,towhere,xacross,yacross,xx,yy:word); +label bob,bob4,bob2,bob3; +begin + asm + {saves registers} + push ds + mov cx,[yy] {multiplies y value by 320} + shl cx,4 + mov ax,cx + shl cx,1 + add ax,cx + shl cx,1 + add ax,cx + shl cx,1 + add ax,cx + add ax,[xx] {adds the x-value to get offset} + mov di,ax + + mov bx,240 + sub bx,[xacross] {xacross?} + push bx + mov bx,[yacross] + xor dx,dx + mov ax,[shapeaddr] {moves segment of array} + mov ds,ax + mov ax,[shapeoffset] {moves offsett if array} + {add ax,[shapeofs]} + mov si,ax + mov ax,towhere {loads place to move it} + + mov es,ax + xor ax,ax + xor cx,cx + xor dx,dx + bob: + mov cx,[xacross] {how long to loop across (the x-size of array)} + bob4: + xor ah,ah + lodsb + cmp ax,0 {If zero skip, if not, store value} + jz bob2 + stosb + dec di + bob2: {Adds when x-value must be increased} + inc di + loop bob4 + cmp dx,bx + jz bob3 + xor cx,cx + pop ax + add di,ax + push ax + inc dx + jmp bob + bob3: + pop bx {restore variables} + pop ds + end; +end; + + + + +procedure putshape(shapeoffset,towhere,xacross,yacross,xx,yy:word); +label bob,bob4,bob2,bob3; +begin + asm + {saves registers} + push ds + mov ax,[yy] {multiplies y value by 320} + shl ax,5 + mov cx,ax + shl ax,1 + shl cx,3 + add ax,cx + add ax,[xx] {adds the x-value to get offset} + mov di,ax + mov bx,320 + sub bx,[xacross] {xacross?} + push bx + mov bx,[yacross] + xor dx,dx + mov ax,[shapeaddr] {moves segment of array} + mov ds,ax + mov ax,[shapeoffset] {moves offsett if array} + {add ax,[shapeofs]} + mov si,ax + mov ax,[towhere] {loads place to move it} + mov es,ax + xor ax,ax + xor cx,cx + xor dx,dx + bob: + mov cx,[xacross] {how long to loop across (the x-size of array)} + bob4: + xor ah,ah + lodsb + cmp ax,0 {If zero skip, if not, store value} + jz bob2 + stosb + dec di + bob2: {Adds when x-value must be increased} + inc di + loop bob4 + cmp dx,bx + jz bob3 + xor cx,cx + pop ax + add di,ax + push ax + inc dx + jmp bob + bob3: + pop bx {restore variables} + pop ds + end; +end; + +procedure putshapeline(fromwhereo,towhere,xacross,yacross,xx,yy,line:word); +var int,color:integer; +{draws just one line of a shape with same syntax as putshape} +begin + for int:=0 to xacross do begin + {does not work. stack overflow} + (*asm + push ax + push bx + push cx + mov ax,[line] {multiplies y value by 320} + mul [xacross] + add ax,[int] + mov bx,ax + mov ax,[ShapeAddr] {moves segment of array} + mov ds,ax + {mov ax,[ShapeOfs]} {moves offset of array} + mov ax,[fromwhereo] + add ax,bx + mov si,ax + xor ax,ax + lodsb + mov [color],ax + pop cx + pop bx + pop ax + end;*) + color:=ShapeTable1^[fromwhereo+((xacross*line)+int)]; + if color<>0 then putpixel(xx+int,yy+line,color,towhere); + end; +end; + +procedure putshapeover(fromwhereo,towhere,xacross,yacross,xx,yy:word); +label bbob,bbob4,bbob2,bbob3; +begin + asm + push ax {saves registers} + push dx + push cx + push bx + push ds + mov ax,[yy] {multiplies y value by 320} + shl ax,5 + mov cx,ax + shl ax,1 + shl cx,3 + add ax,cx + add ax,[xx] {adds the x-value to get offset} + mov di,ax + mov bx,320 + sub bx,[xacross] {xacross?} + push bx + mov bx,[yacross] + xor dx,dx + mov ax,[shapeaddr] {moves segment of array} + mov ds,ax + (*add ax,[shapeofs] *) {moves offsett if array} + mov ax,[fromwhereo] + mov si,ax + mov ax,[towhere] {loads place to move it} + mov es,ax + xor ax,ax + xor cx,cx + xor dx,dx + bbob: + mov cx,[xacross] {how long to loop across (the x-size of array)} + bbob4: + rep movsb {copies, overwriting} + bbob2: {Adds when x-value must be increased} + cmp dx,bx + jz bbob3 + xor cx,cx + pop ax + add di,ax + push ax + inc dx + jmp bbob + bbob3: + pop bx {restore variables} + pop ds + pop bx + pop cx + pop dx + pop ax + end; +end; +*/ + +void help() +{ +/* cls(0,vga); + coolbox(0,0,319,199,0,vga); + outtextxy("HELP",144,10,4,0,vga,0); + outtextxy("--------------------------------------",10,20,12,0,vga,false); + outtextxy("IN THE GAME:",10,30,4,0,vga,false); + outtextxy(" ARROWS MANUEVER",10,40,4,0,vga,false); + outtextxy(" SPACE BAR FIRES MISSILES",10,50,4,0,vga,false); + outtextxy(" F2 SAVES GAME",10,60,4,0,vga,false); + outtextxy(" P=PAUSE S=TOGGLE SOUND ESC=QUIT",10,70,4,0,vga,false); + outtextxy("--------------------------------------",10,80,12,0,vga,false); + outtextxy("MISSION: SHOOT THE INANIMATE OBJECTS",10,90,4,0,vga,false); + outtextxy(" WHY? WATCH THE STORY!",10,100,4,0,vga,false); + outtextxy("--------------------------------------",10,110,12,0,vga,false); + outtextxy("THE SPACE BAR SPEEDS UP MOVIE SCENES",10,120,4,0,vga,false); + outtextxy("ESC QUITS THEM",10,130,4,0,vga,false); + outtextxy("--------------------------------------",10,140,12,0,vga,false); + outtextxy(" SEE \"TB1.DOC\" FOR MORE HELP/INFO",10,150,4,0,vga,false); + outtextxy("--------------------------------------",10,160,12,0,vga,false); + outtextxy("PRESS ANY KEY TO CONTINUE",64,185,4,0,vga,false); + repeat until keypressed; + ch:=readkey;*/ +} + + +void makehole(int y,int tempaddr) +{ + /*fillblock(249,y,314,y+9,0,tempaddr); + horizontalline(249,314,y,24,tempaddr); + horizontalline(249,313,y+10,18,tempaddr); + verticalline(y,y+9,249,24,tempaddr); + verticalline(y+1,y+10,314,18,tempaddr);*/ +} + +void setupsidebar() +{ + int i,x,y,loop1,loop2,loop3; + int tempaddr; + +/* + tempaddr:=vaddr; + fillblock(240,0,320,199,19,tempaddr); + verticalline(0,199,240,18,tempaddr); + horizontalline(240,319,0,18,tempaddr); + verticalline(0,199,399,24,tempaddr); + horizontalline(241,319,199,24,tempaddr); + outtextxy('SCORE',241,1,127,0,tempaddr,false); + outtextxy('SCORE',242,2,143,0,tempaddr,false); + makehole(10); + str(score,it); + outtextxy(it,250+(8*(8-length(it))),11,12,0,tempaddr,true); + + outtextxy('HI-SCORE',241,21,127,0,tempaddr,false); + outtextxy('HI-SCORE',242,22,143,0,tempaddr,false); + str(hiscore,it); + makehole(30); + outtextxy(it,250+(8*(8-length(it))),31,12,0,tempaddr,true); + + outtextxy('LEVEL',241,41,127,0,tempaddr,false); + outtextxy('LEVEL',242,42,143,0,tempaddr,false); + makehole(50); + outtextxy('SHIELDS',241,61,127,0,tempaddr,false); + outtextxy('SHIELDS',242,62,143,0,tempaddr,false); + makehole(70); + for i:=0 to ((4*shields)-1) do + verticalline(71,78,250+i,(47-(i div 4)),tempaddr); + + outtextxy('WEAPONS',241,81,127,0,tempaddr,false); + outtextxy('WEAPONS',242,82,143,0,tempaddr,false); + makehole(90); + + fillblock(249,111,314,189,0,tempaddr); + + verticalline(111,189,249,24,tempaddr); + verticalline(111,189,315,18,tempaddr); + horizontalline(249,315,111,24,tempaddr); + horizontalline(249,315,189,18,tempaddr); + + outtextxy(' TB1 ',250,114,2,0,tempaddr,false); + outtextxy(' TB1 ',251,115,10,0,tempaddr,false); + outtextxy('F1-HELP ',250,124,2,0,tempaddr,false); + outtextxy('F1-HELP ',251,125,10,0,tempaddr,false); + outtextxy('F2-SAVES',250,134,2,0,tempaddr,false); + outtextxy('F2-SAVES',251,135,10,0,tempaddr,false); + outtextxy('ESC-QUIT',250,144,2,0,tempaddr,false); + outtextxy('ESC-QUIT',251,145,10,0,tempaddr,false); + outtextxy('P-PAUSES',250,154,2,0,tempaddr,false); + outtextxy('P-PAUSES',251,155,10,0,tempaddr,false); + outtextxy('S-SOUND ',250,164,2,0,tempaddr,false); + outtextxy('S-SOUND ',251,165,10,0,tempaddr,false); + + + flipd320(vaddr,vaddr2); +END;*/ +} + + + +/*Procedure blockmove(x1,y1,x2,y2,p1,x3,y3,p2:word); + { This is a small procedure to copy block x1,y1,x2,y2, + from page 1 to x3,y3 on page 2} +BEGIN + asm + push ds + push es + mov ax,p1 + mov ds,ax + mov ax,p2 + mov es,ax + + mov bx,[X1] + mov dx,[Y1] + push bx {; and this again for later} + mov bx, dx {; bx = dx} + mov dh, dl {; dx = dx * 256} + xor dl, dl + shl bx, 6 {; bx = bx * 64} + add dx, bx {; dx = dx + bx (ie y*320)} + pop bx {; get back our x} + add bx, dx {; finalise location} + mov si, bx {; es:di = where to go} + + mov bx,[X3] + mov dx,[Y3] + push bx {; and this again for later} + mov bx, dx {; bx = dx} + mov dh, dl {; dx = dx * 256} + xor dl, dl + shl bx, 6 {; bx = bx * 64} + add dx, bx {; dx = dx + bx (ie y*320)} + pop bx {; get back our x} + add bx, dx {; finalise location} + mov di, bx {; es:di = where to go} + + mov ax,[y2] + sub ax,[y1] + + mov dx,[x2] + sub dx,[x1] + mov bx,320 + sub bx,dx + + +@@1 : + mov cx, dx { Width of block to copy divided by 2 } + shr cx,1 + jnc @@2 + rep movsw + movsb + jmp @@3 +@@2: + rep movsw +@@3: + add di,bx + add si,bx + dec ax + jnz @@1 + + pop es + pop ds + end; +END; + + +procedure pauseawhile(howlong:word); +var i:word; +begin + i:=0; + repeat + waitretrace; + inc(i); + if i>howlong then exit; + until keypressed; +end; + + + +procedure changescore; +var itemp,jtemp:integer; +begin + str(score:8,scorest); + outtextxy(scorest,250,11,12,0,vaddr,true); + if (score mod 400 =0) and (shields<16) then begin + if sbeffects then startsound(sound[2],0,false); + inc(shields); + pal(254,shields*4,0,0); + for itemp:=0 to shields do + for jtemp:=71 to 78 do + horizontalline(250+(itemp*4), + 254+(itemp*4),jtemp, + 47-itemp,vaddr); + + end; +end; + +function collision(x1,y1,xsize1,ysize1,x2,y2,xsize2,ysize2:integer):boolean; +var bob:byte; + hit:boolean; +label aat1,aat2,aat3,aat4; +begin + bob:=0; + asm + mov ax,[x1] + mov bx,[x2] + mov cx,[xsize1] + mov dx,[xsize2] + cmp bx,ax + jnge aat1 + xchg ax,bx + xchg cx,dx + aat1: + add ax,cx + add bx,dx + + sub ax,bx + add cx,dx + cmp cx,ax + jnge aat3 + inc [bob] + + mov ax,[y1] + mov bx,[y2] + mov cx,[ysize1] + mov dx,[ysize2] + cmp bx,ax + jnge aat2 + xchg ax,bx + xchg cx,dx + aat2: + add ax,cx + add bx,dx + + sub ax,bx + add cx,dx + cmp cx,ax + jnge aat3 + inc [bob] + aat3: + mov [hit],0 + cmp [bob],2 + jnz aat4 + mov [hit],1 + aat4: + end; + if hit then collision:=true + else collision:=false; +end; + + + +{%%} +procedure clearshape; +begin + asm + push es + mov cx,8000 + mov es,[shapeaddr] + xor di,di + mov al,5 + mov ah,al + rep stosw + pop es + end; +end; + + +{000+} + +procedure outbackline(line,row:word); +label bob,bob2,bob3; +var off2,off:word; +begin + off2:=vaddr3; {not sure why necessary, but keep} + off:=backseg; {losing the values of the original} + asm + {saves registers} + push ds + push es + xor ax,ax {old xx variable (times to repeat)=0} + push ax + + {mov cx,[(4-row)*10)] } {multiplies y value by 2400} + + {calculates initial offset for y value} + + mov ax,4 + sub ax,row + shl ax,5 + mov bx,ax + shl ax,1 + add bx,ax + shl ax,2 + add bx,ax + shl ax,3 + add bx,ax {original row offset is in bx} + + +bob2: {get background array} + mov ax,[off] + mov ds,ax + mov dx,[line] + shl dx, 2 + mov ax,dx + shl dx,1 + add ax,dx + pop cx + add ax,cx + push cx + add ax,[backofs] + mov si,ax + lodsb + xor ah,ah + mov cx,ax + + + shl cx,3 {from background number, get actual offset} + mov ax,cx + shl cx,3 + add ax,cx + shl cx,1 + add ax,cx + add ax,8000 + mov si,ax + + mov ax,[shapeaddr] + mov ds,ax + + + + + mov ax,[off2] {loads place to move it} + mov es,ax + mov di,bx + mov ax,220 {what to add to increase one y} + xor dx,dx + bob: + mov cx,20 {how long to loop across (the x-size of array)} + rep movsb {move, overwriting} + cmp dx,9 {see if longer than y size} + jz bob3 {if so, end} + add di,ax {if not, increase y by one} + inc dx + jmp bob + bob3: + add bx,20 {Increase starting offset value} + + pop cx {jump if not drawn 12 across} + inc cx + cmp cx,12 + push cx + jnz bob2 + {restore variables} + pop cx + pop es + pop ds + end; +end; + + +procedure savegame; +begin + if CDROMmode then exit; + cls(0,vga); + coolbox(0,0,319,199,false,vga); + outtextxy('SAVE GAME',124,10,4,0,vga,false); + outtextxy('THIS WILL ONLY SAVE HOW YOU WERE',10,20,4,0,vga,false); + outtextxy('AT THE BEGINNING OF THE LEVEL!!!',10,30,4,0,vga,false); + findfirst('SG?.TB1',ANYFILE,filestuff); + ondisk:='ALREADY SAVED GAMES:'; + while doserror=0 do with filestuff do + begin + ondisk:=concat(ondisk,name[3]); + findnext(filestuff); + end; + if ondisk='' then ondisk:=concat(ondisk,'NONE'); + outtextxy(ondisk,10,50,4,0,vga,false); + outtextxy('SAVE WHICH GAME?',10,60,4,0,vga,false); + repeat until keypressed; + tempch:=readkey; + if (tempch>='0') and (tempch<='9') then begin + {$I-} + ondisk:=concat('SG',tempch,'.TB1'); + assign(savegamef,ondisk); + rewrite(savegamef); + {$I+} + If IOResult=0 then begin + writeln(savegamef,beginscore); + writeln(savegamef,level); + writeln(savegamef,beginshields); + close(savegamef); + outtextxy('GAME SAVED',120,150,15,0,vga,false); + end + else outtextxy('ERROR! GAME NOT SAVED!',102,150,15,0,vga,false); + outtextxy('PRESS ANY KEY...',96,180,4,0,vga,false); + repeat; until keypressed; tempch:=readkey; + end; +end; + + +procedure put10shape240(shapeoffset,towhere,xx,yy:word); +label bob,bob4,bob2,bob3; +begin + asm + {saves registers} + push ds + mov cx,[yy] {multiplies y value by 320} + shl cx,4 + mov ax,cx + shl cx,1 + add ax,cx + shl cx,1 + add ax,cx + shl cx,1 + add ax,cx + add ax,[xx] {adds the x-value to get offset} + mov di,ax + + mov bx,240 + sub bx,10 {xacross?} + push bx + mov bx,9 + xor dx,dx + mov ax,[shapeaddr] {moves segment of array} + mov ds,ax + mov ax,[shapeoffset] {moves offsett if array} + {add ax,[shapeofs]} + mov si,ax + mov ax,towhere {loads place to move it} + + mov es,ax + xor ax,ax + xor cx,cx + xor dx,dx + bob: + mov cx,10 {how long to loop across (the x-size of array)} + bob4: + xor ah,ah + lodsb + cmp ax,0 {If zero skip, if not, store value} + jz bob2 + stosb + dec di + bob2: {Adds when x-value must be increased} + inc di + loop bob4 + cmp dx,bx + jz bob3 + xor cx,cx + pop ax + add di,ax + push ax + inc dx + jmp bob + bob3: + pop bx {restore variables} + pop ds + end; +end; + + +function upcollide(x,y,speed:word;add:integer;howfar,where:word):word; +var add2,color:word; +label mree1,mree2,mree3,mree4,mree5,mree6; +begin + add2:=y+add; + asm + {saves registers} + push ds + mov cx,[add2] {multiplies y value by 320} + shl cx,4 + mov ax,cx + shl cx,1 + add ax,cx + shl cx,1 + add ax,cx + shl cx,1 + add ax,cx + add ax,[x] {adds the x-value to get offset} + mov si,ax + mov ax,[where] + mov ds,ax + xor ah,ah + + mov [color],0 + mov dx,[speed] + inc dx + mree2: + dec dx + + mov cx,[howfar] + mree3: + lodsb + cmp ax,3 + je mree1 + cmp ax,5 + je mree4 + jne mree6 + mree4: + cmp bx,3 + je mree6 + mree1: + mov [color],ax + mov bx,ax + mree6: + loop mree3 + add si,240 + sub si,[howfar] + cmp dx,0 + jne mree2 + pop ds + end; + upcollide:=color; +end; + +function leftcollide(x,y,speed:word;add:integer;howfar,where:word):word; +var add2,color:word; +label mree1,mree2,mree3,mree4,mree5,mree6; +begin + add2:=x+add; + asm + {saves registers} + push ds + mov cx,[y] {multiplies y value by 320} + shl cx,4 + mov ax,cx + shl cx,1 + add ax,cx + shl cx,1 + add ax,cx + shl cx,1 + add ax,cx + add ax,[add2] {adds the x-value to get offset} + mov si,ax + mov ax,[where] + mov ds,ax + xor ah,ah + + mov [color],0 + mov dx,[howfar] + inc dx + + mree2: + dec dx + + mov cx,[speed] + inc cx + mree3: + lodsb + cmp ax,3 + je mree1 + cmp ax,5 + jne mree6 + cmp bx,3 + je mree6 + mree1: + mov [color],ax + mov bx,ax + mree6: + loop mree3 + add si,240 + sub si,[speed] + cmp dx,0 + jne mree2 + pop ds + end; + leftcollide:=color; +end; + + + + +procedure loadlevel3shapes; +var x,y,i,j,shape:byte; +begin + clearshape; + grapherror:=mode13loadpicpacked(0,0,vaddr,false,true,'tblev3.tb1'); + + for j:=0 to 3 do + for i:=0 to 19 do + for x:=0 to 9 do + for y:=0 to 9 do + ShapeTable1^[shape3array[(j*20)+i]+((y*10)+x)] + :=getpixel(1+x+(i*11),1+y+(j*11),vaddr); + cls(0,vaddr); +end; + + +procedure littleopener3; +var star_x:array[0..5]of integer; + star_y:array[0..5]of integer; +begin + loadlevel3shapes; + grapherror:=mode13loadpicpacked(0,0,vga,true,false,'tbl2ship.tb1'); + fade; + cls(0,vga); + grapherror:=mode13loadpicpacked(0,0,vaddr,false,true,'tbl3intr.tb1'); + blockmove(0,3,171,117,vaddr,10,10,vga); + putshape (shape3array[60],vga,10,9,113,52); + + + unfade; + outtextxy('Hmmmm... STUPID TRACTOR BEAM.',10,155,10,0,vga,false); + outtextxy('I GUESS I''D BETTER GO SHUT IT OFF.',10,165,10,0,vga,false); + pauseawhile(700); + clearkeyboardbuffer; + + for i:=24 downto 0 do begin + blockmove(0,3,171,117,vaddr,10,10,vga); + putshape (shape3array[60+(4*(i mod 4))],vga,10,9,113,28+i); + + waitretrace; waitretrace; waitretrace; + waitretrace; waitretrace; waitretrace; + end; + putshape (shape3array[60],vga,10,9,113,28); + fillblock(10,155,300,185,0,vga); + outtextxy('I''M LUCKY I WORE MAGNETIC SHOES.',10,155,12,0,vga,false); + outtextxy('Hmmmm. SOMEONE LEFT THE AIR-LOCK',10,165,12,0,vga,false); + outtextxy(' UNLOCKED. STRANGE.',10,175,12,0,vga,false); + pauseawhile(600); + clearkeyboardbuffer; + putpixel(110,20,10,vga); + putpixel(110,22,10,vga); + fillblock(111,14,123,29,0,vga); + fillblock(10,155,300,185,0,vga); + outtextxy('I HOPE THIS ISN''T A TRAP.',10,155,9,0,vga,false); + outtextxy('I WISH I HAD SOME FORM OF ',10,165,9,0,vga,false); + outtextxy(' WEAPON.',10,175,9,0,vga,false); + pauseawhile(600); + clearkeyboardbuffer; + fade; + cls(0,vga); + blockmove(179,41,287,134,vaddr,10,10,vga); + for i:=0 to 5 do begin + star_x[i]:=37+random(70); + star_y[i]:=18+random(56); + putpixel(star_x[i],star_y[i],15,vga); + end; + outtextxy('WOW!! A GLASS-WALLED AIR-LOCK.',10,135,9,0,vga,false); + unfade; + pauseawhile(500); + clearkeyboardbuffer; + fillblock(10,135,300,185,0,vga); + outtextxy('NOW WHERE ARE WE GOING?',5,125,9,0,vga,false); + outtextxy('I GUESS THE PLANET EERM.',5,135,9,0,vga,false); + outtextxy('WHAT AN ODD NAME.',5,145,9,0,vga,false); + outtextxy('AND WHY AM I TALKING TO MYSELF?',5,155,10,0,vga,false); + outtextxy('ANYWAY I JUST WANT TO GO HOME',5,165,9,0,vga,false); + outtextxy(' AND SLEEP.',5,175,9,0,vga,false); + + clearkeyboardbuffer; + j:=0; + while (j<2400) and (not(keypressed)) do begin + inc(j); + for i:=0 to 5 do begin + putpixel(star_x[i],star_y[i],0,vga); + inc(star_x[i]); + if star_x[i]>107 then begin + star_x[i]:=37; + star_y[i]:=18+random(56); + end; + putpixel(star_x[i],star_y[i],15,vga); + end; + waitretrace; waitretrace;waitretrace; + + end; + + if keypressed then ch:=readkey; + + fade; + cls(0,vga); + unfade; +end; + + +Procedure levelthree; +label newroom; +type{ +EnemyInfo = record + x,y:integer; + kind:byte; + out,exploding,boundarycheck,dead:boolean; + explodprogress:byte; + minx,maxx,xspeed,yspeed:integer; + hitsneeded:integer; + end;} +pittype = record + px,py:integer; + end; +kctype = record + kcx,kcy:integer; + kcout:boolean; + end; + +const framedir:array[0..1,0..3] of integer =((0,1,0,-1),(1,0,-1,0)); +VAR loop1,loop2:integer; + ch,ch2:char; + pits:array[0..4] of pittype; + numpits:byte; + + bullet1x,bullet1y,bullet2x,bullet2y,i:integer; + bullet1dir,bullet2dir,collide:byte; + bullet1out,bullet2out:boolean; + whichone,temp,temp2:integer; + tempst:string; + what:byte; + k:integer; + itemp,jtemp:byte; + whatdelay:byte; + tempilg:byte; + xx:integer; + ucollide,dcollide,lcollide,rcollide:word; + walking,feet:byte; + room:byte; + backrow,topblocky:integer; + levelover,odd,changeroom,havegun:boolean; + whichroomnext:array[0..3] of byte; {n,s,e,w} + keycards:array[0..3] of boolean; + keycard:kctype; + shieldup:array[0..11] of boolean; + shieldx,shieldy,laserx,lasery:integer; + laserup:array[0..11] of boolean; + computers:array[0..11] of boolean; + computerx,computery:integer; + computer_0hits:integer; + tempkc:byte; + +procedure horizwalls(x,y,howfar:word); +var i:word; +begin + for i:=0 to howfar do + put10shape240(shape3array[3],vaddr2,x+(i*10),y); +end; + +procedure verticalwalls(x,y,howfar:word); +var i:word; +begin + for i:=0 to howfar do + put10shape240(shape3array[2],vaddr2,x,y+(i*10)); +end; + +procedure dopits; +var i:word; +begin + for i:=0 to (numpits-1) do + with pits[i] do + put10shape240(shape3array[5],vaddr2,px,py); +end; + +procedure clearroom; +var i,j:byte; +begin + for i:=0 to 23 do + for j:=0 to 19 do + put10shape240(shape3array[0], + vaddr2,i*10,j*10); +end; + + +procedure doroom(n,s,e,w:boolean); +var i:byte; +begin + for i:=0 to 2 do begin + put10shape240(shape3array[18],vaddr2,100+(i*10),0); + put10shape240(shape3array[18],vaddr2,100+(i*10),199); + put10shape240(shape3array[19],vaddr2,0,90+(i*10)); + put10shape240(shape3array[19],vaddr2,239,90+(i*10)); + end; + + if n then begin + horizwalls(0,0,10); + horizwalls(130,0,10); + end + else horizwalls(0,0,23); + if s then begin + horizwalls(0,197,10); + horizwalls(130,197,10); + end + else horizwalls(0,197,23); + + if e then begin + verticalwalls(237,0,8); + verticalwalls(237,110,8); + end + + else for i:=0 to 20 do put10shape240(shape3array[2],vaddr2,237,i*10); + if w then begin + verticalwalls(0,0,8); + verticalwalls(0,110,8); + end + else for i:=0 to 20 do put10shape240(shape3array[2],vaddr2,0,i*10); + +end; + + + +BEGIN + {loadlevel3shapes;} + computer_0hits:=0; + whatdelay:=1; + havegun:=true; + for i:=0 to 3 do keycards[i]:=false; + for i:=0 to 11 do begin + shieldup[i]:=false; + laserup[i]:=false; + computers[i]:=false; + end; + shieldup[0]:=true; + laserup[0]:=true; + computers[0]:=true; + + shipx:=115; + shipy:=180; + odd:=false; + shipxadd:=0; + room:=0; + shipyadd:=0; + + shipframe:=1; + shipspeed:=5; + + ch:=#1; ch2:=#1; + bullet1out:=false; bullet2out:=false; + bullet1x:=0; bullet1y:=0; + bullet2x:=0; bullet2y:=0; + + flipd320(vaddr2,vaddr); + str(level,tempst); + fillblock(251,52,314,59,0,vaddr); + outtextxy(tempst,307,51,12,0,vaddr,false); + + cls(0,vaddr2); + + pal(250,0,0,63); + pal(251,63,0,0); + + pal(254,shields*4,0,0); + howmuchscroll:=50; + + cls(0,vga); + coolbox(70,85,240,120,true,vga); + outtextxy(' LEVEL THREE:',84,95,4,7,vga,false); + outtextxy(' THE ALIEN SHIP',84,105,4,7,vga,false); + + clearkeyboardbuffer; + pauseawhile(300); + numpassive:=0; + levelover:=false; + +newroom: + numpits:=0; + changeroom:=false; + if room=254 then room:=0; + clearroom; + if shipframe=1 then shipy:=188 + else if shipframe=3 then shipy:=3 + else if shipframe=2 then shipx:=3 + else if shipframe=4 then shipx:=228; + keycard.kcout:=false; + + + if room=0 then begin + whichroomnext[0]:=1; + whichroomnext[1]:=255; + clearroom; + verticalwalls(30,0,16); + verticalwalls(207,0,16); + verticalwalls(57,30,16); + verticalwalls(180,30,16); + with pits[0] do begin + px:=95; + py:=80; + end; + with pits[1] do begin + px:=135; + py:=80; + end; + numpits:=2; { actual} + dopits; + + for i:=0 to 10 do + for j:=0 to 2 do begin + put10shape240(shape3array[4],vaddr2,60+(j*10),80+(i*10)); + put10shape240(shape3array[4],vaddr2,150+(j*10),80+(i*10)); + end; +{walkway} + for i:=0 to 15 do for j:=0 to 1 do + put10shape240(shape3array[1],vaddr2,110+(j*10),40+(i*10)); + + put10shape240(shape3array[6],vaddr2,110,30); + put10shape240(shape3array[6],vaddr2,120,30); + computerx:=110; + computery:=30; + + if shieldup[0] then begin + shieldx:=10; + shieldy:=10; + put10shape240(shape3array[8],vaddr2,10,10); + end; + + if laserup[0] then begin + laserx:=220; + lasery:=10; + put10shape240(shape3array[7],vaddr2,220,10); + end; + + {badguys} + {put10shape240(shape3array[32],vaddr2,40,180); + put10shape240(shape3array[32],vaddr2,190,180);} + + + doroom(true,true,false,false); + + + end; + if room=1 then begin + whichroomnext[0]:=2; + whichroomnext[1]:=0; + doroom(true,true,false,false); + end; + if room=2 then begin + whichroomnext[1]:=1; + whichroomnext[2]:=6; + whichroomnext[3]:=4; + with pits[0] do begin + px:=95; + py:=80; + end; + with pits[1] do begin + px:=135; + py:=80; + end; + numpits:=2; + dopits; + + doroom(false,true,true,true); + end; + if room=3 then begin + whichroomnext[0]:=4; + if not(keycards[3]) then + begin + keycard.kcout:=true; + keycard.kcx:=100; + keycard.kcy:=100; + put10shape240(shape3array[12],vaddr2,100,100); + end; + doroom(true,false,false,false); + end; + if room=4 then begin + whichroomnext[0]:=7; + whichroomnext[1]:=3; + whichroomnext[2]:=2; + doroom(true,true,true,false); + end; + if room=5 then begin + whichroomnext[0]:=6; + doroom(true,false,false,false); + if not(keycards[2]) then begin + keycard.kcout:=true; + keycard.kcx:=100; + keycard.kcy:=100; + put10shape240(shape3array[11],vaddr2,100,100); + end; + end; + if room=6 then begin + whichroomnext[0]:=11; + whichroomnext[1]:=5; + whichroomnext[3]:=2; + doroom(true,true,false,true); + end; + if room=7 then begin + whichroomnext[0]:=8; + whichroomnext[1]:=4; + doroom(true,true,false,false); + end; + if room=8 then begin + whichroomnext[1]:=7; + whichroomnext[2]:=9; + if not(keycards[0]) then begin + keycard.kcout:=true; + keycard.kcx:=100; + keycard.kcy:=100; + put10shape240(shape3array[9],vaddr2,100,100); + end; + doroom(false,true,true,false); + end; + if room=9 then begin + whichroomnext[2]:=10; + whichroomnext[3]:=8; + doroom(false,false,true,true); + end; + if room=10 then begin + whichroomnext[1]:=11; + whichroomnext[3]:=9; + if not(keycards[1]) then begin + keycard.kcout:=true; + keycard.kcx:=100; + keycard.kcy:=100; + put10shape240(shape3array[10],vaddr2,100,100); + end; + doroom(false,true,false,true); + end; + if room=11 then begin + whichroomnext[0]:=10; + whichroomnext[1]:=6; + doroom(true,true,false,false); + end; + if room=255 then begin + if keycards[0] and keycards[1] and + keycards[2] and keycards[3] then + begin + levelover:=true; + cls(0,vga); + outtextxy('You Have won!',5,5,9,7,vga,false); + outtextxy('But as you can see this level is not done yet.',5,15,9,7,vga,false); + {outtextxy('Anyway');} + readln; + inc(level); + end + else begin + cls(0,vga); + outtextxy('You Cannot Leave Yet',5,5,9,7,vga,true); + repeat until keypressed; tempch:=readkey; + levelover:=false; + shipframe:=1; + room:=254; + end; + end; + if (room=254) and not(levelover) then goto newroom; + + + + + +{**** GAME LOOP ****} +{*******************} + Repeat + ch2:=#1; + ch:=#1; + + flipd240(0,vaddr,vaddr2); + +{***Collision Check***} + if numpits>0 then + for i:=0 to (numpits-1) do with pits[i] do + if collision(shipx,shipy,5,4,px,py,4,4) + then begin + levelover:=true; + cls(0,vga); + grapherror:=mode13loadpicpacked(0,0,vga,false,true,'tbpit.tb1'); + if sbeffects then StartSound(Sound[7], 0, false); + + {outtextxy('You Fell In A Pit!',5,5,9,2,vga,false);} + clearkeyboardbuffer; + repeat until keypressed; tempch:=readkey; + end; + if keycard.kcout then + if collision(shipx,shipy,5,4,keycard.kcx,keycard.kcy,5,5) + then begin + keycard.kcout:=false; + case room of + 3: keycards[3]:=true; + 5: keycards[2]:=true; + 8: keycards[0]:=true; + 10:keycards[1]:=true; + end; + put10shape240(shape3array[0],vaddr2,keycard.kcx,keycard.kcy); + end; + if shieldup[room] then + if collision(shipx,shipy,5,4,shieldx,shieldy,5,5) + then begin + shieldup[room]:=false; + put10shape240(shape3array[0],vaddr2,shieldx,shieldy); + inc(shields); + pal(254,shields*4,0,0); + for itemp:=0 to shields do + for jtemp:=71 to 78 do + horizontalline(250+(itemp*4), + 254+(itemp*4),jtemp, + 47-itemp,vaddr); + end; + if laserup[room] then + if collision(shipx,shipy,5,4,laserx,lasery,5,5) + then begin + laserup[room]:=false; + put10shape240(shape3array[0],vaddr2,laserx,lasery); + end; + if computers[room] then + if collision(shipx,shipy,5,4,computerx,computery,10,5) + then begin + cls(0,vga); + grapherror:=mode13loadpicpacked(0,0,vga,false,true,'tbconsol.tb1'); + tempkc:=0; + if keycards[0] then begin + inc(tempkc); + putpixel(147,132,0,vga); + end; + if keycards[1] then begin + inc(tempkc); + putpixel(179,132,0,vga); + end; + if keycards[2] then begin + inc(tempkc); + putpixel(179,160,0,vga); + end; + if keycards[3] then begin + inc(tempkc); + putpixel(147,160,0,vga); + end; + + case room of + 0: begin + inc(computer_0hits); + if computer_0hits=1 then begin + + outtextxy('COMPUTER ACTIVATED:',47,30,2,0,vga,true); + outsmalltextxy(' HUMAN YOU HAVE COME TOO SOON. LEVELS 3',47,40,2,0,vga,true); + outsmalltextxy(' AND 4 ARE INCOMPLETE.',47,48,2,0,vga,true); + outsmalltextxy(' ANYWAY I CAN SEE YOU ARE NOT THE',47,58,2,0,vga,true); + outsmalltextxy(' TENTACLEE COMMANDER. YOU ARE IN',47,66,2,0,vga,true); + outsmalltextxy(' GRAVE DANGER. LUCKILY THE MAIN',47,74,2,0,vga,true); + outsmalltextxy(' COMPUTER SYSTEM DOES NOT APPROVE',47,82,2,0,vga,true); + outsmalltextxy(' OF THE TENTACLEE''S POLICIES.',47,90,2,0,vga,true); + outsmalltextxy(' I PERSONALLY CANNOT SHUT OFF THE TRACTOR',47,100,2,0,vga,true); + outsmalltextxy(' BEAM. YOU MUST RETRIEVE FOUR KEYCARDS',47,108,2,0,vga,true); + outsmalltextxy(' SCATTERED AROUND THE FLIGHT DECK.',47,116,2,0,vga,true); + outsmalltextxy(' THE MAP BELOW WILL AID YOU.',47,124,2,0,vga,true); + end; + if computer_0hits=2 then begin + outtextxy('COMPUTER ACTIVATED:',47,30,2,0,vga,true); + outsmalltextxy(' HUMAN I HAVE ALREADY TOLD YOU MUCH.',47,40,2,0,vga,true); + outsmalltextxy(' COLLECT THE 4 KEYCARDS, MADE OF',47,48,2,0,vga,true); + outsmalltextxy(' RUBY, GOLD, EMERALD, AND ALUMINUM.',47,56,2,0,vga,true); + outsmalltextxy(' WATCH OUT FOR ENEMIES NOT UNDER MY',47,66,2,0,vga,true); + outsmalltextxy(' CONTROL, RADIOACTIVE FLOORS, AND',47,74,2,0,vga,true); + outsmalltextxy(' EXTREMELY DEEP PITS.',47,82,2,0,vga,true); + end; + if computer_0hits>2 then begin + outtextxy('COMPUTER ACTIVATED:',47,30,2,0,vga,true); + outsmalltextxy(' HUMAN, GO AWAY. YOU ANNOY ME.',47,40,2,0,vga,true); + outsmalltextxy(' I HAVE TOLD YOU EVERYTHING.',47,48,2,0,vga,true); + end; + + + + end; + end; + clearkeyboardbuffer; + repeat until keypressed; tempch:=readkey; + shipx:=shipx+(4*framedir[1,shipframe]); + shipy:=shipy+(4*framedir[0,shipframe]); + end; + + +{***DO EXPLOSIONS***} +{ for i:=0 to 30 do + if passive[i].exploding then with passive[i] do begin + inc(explodeprogress); + putshape240(shape2array[35+explodeprogress],vaddr2, + 20,9,x,y+howmuchscroll); + if explodeprogress>4 then begin + dead:=true; + exploding:=false; + putshape240over(14800(*shape2array[34]*),vaddr2, + 20,9,x,y+howmuchscroll); + end; + end; + + } +{***MOVE BULLET***} + if bullet1out then begin + case bullet1dir of + 1:begin dec(bullet1y,5); + collide:=upcollide(bullet1x,bullet1y,5,-5,3,vaddr2); + end; + 2:begin inc(bullet1x,5); + collide:=leftcollide(bullet1x,bullet1y,5,10,3,vaddr2); + end; + 3:begin inc(bullet1y,5); + collide:=upcollide(bullet1x,bullet1y,5,10,3,vaddr2); + end; + 4:begin dec(bullet1x,5); + collide:=leftcollide(bullet1x,bullet1y,5,-5,3,vaddr2); + end; + end; + + if collide<>0 then bullet1out:=false; + if bullet1out then putshape(shape3array[76],vaddr,10,9,bullet1x,bullet1y); + end; + if bullet2out then begin + dec(bullet2y,5); + if bullet2y<5 then bullet2out:=false; + if bullet2out then putshape(shape3array[76],vaddr,10,9,bullet2x,bullet2y); + end; +{***MOVE ENEMIES***} + { for j:=0 to 30 do begin + if passive[j].dead=false then begin + inc(passive[j].y); + if(passive[j].y)>190 then passive[j].dead:=true; + end; + end; + for j:=0 to 30 do begin + if passive[j].lastshot>0 then dec(passive[j].lastshot); + if (passive[j].dead=false) and (passive[j].shooting) + and (passive[j].lastshot=0) and (passive[j].y>0) + then begin + tempilg:=7; + for i:=0 to 5 do if enemy[i].out=false then tempilg:=i; + if tempilg<>7 then begin + passive[j].lastshot:=30; + enemy[tempilg].out:=true; + enemy[tempilg].y:=passive[j].y; + enemy[tempilg].x:=passive[j].x+5; + enemy[tempilg].yspeed:=5; + enemy[tempilg].kind:=25; + if passive[j].kind=11 then enemy[tempilg].kind:=26; + end; + end; + end; + for j:=0 to 5 do begin + if enemy[j].out then begin + putshape(shape2array[enemy[j].kind],vaddr, + 20,9,enemy[j].x,enemy[j].y); + enemy[j].y:=enemy[j].y+enemy[j].yspeed; + if enemy[j].y>189 then enemy[j].out:=false; + end; + end; + } + +{***READ KEYBOARD***} + + if keypressed then BEGIN + ch:=readkey; + if ch=chr(0) then ch2:=readkey; + if ch=#27 then levelover:=true; + clearkeyboardbuffer; + + if ch2='M' then begin + if (shipframe=2) and (shipxadd=0) then shipxadd:=2 + else if (shipframe<>2) then shipframe:=2 + else inc(shipxadd); + end; + if ch2='K' then begin + if (shipframe=4) and (shipxadd=0) then shipxadd:=-2 + else if (shipframe<>4) then shipframe:=4 + else dec(shipxadd); + end; + if ch2='H' then begin + if (shipframe=1) and (shipyadd=0) then shipyadd:=-2 + else if (shipframe<>1) then shipframe:=1 + else dec(shipyadd); + + end; + if ch2='P' then begin + if (shipframe=3) and (shipyadd=0) then shipyadd:=2 + else if (shipframe<>3) then shipframe:=3 + else inc(shipyadd); + + end; + if ch2=';' then help; + if ch='+' then begin + inc(whatdelay); + if whatdelay>25 then whatdelay:=25; + end; + if (ch='P') or (ch='p') then begin + coolbox(65,85,175,110,true,vga); + outtextxy('GAME PAUSED',79,95,4,7,vga,false); + clearkeyboardbuffer; + repeat until keypressed; tempch:=readkey; + end; + if ch='-' then begin + dec(whatdelay); + if whatdelay<1 then whatdelay:=1; + end; + if (ch='S') or (ch='s') then sbeffects:=not(sbeffects); + + if ch2='<' then savegame; + + end; + if (ch=' ') and havegun then begin + if (bullet1out=false) then begin + if sbeffects then StartSound(Sound[4], 0, false); + bullet1out:=true; + bullet1x:=shipx+3; + bullet1y:=shipy+4; + bullet1dir:=shipframe; + putshape(shape3array[76],vaddr,10,9,bullet1x,bullet1y); + end + else + if (bullet2out=false) then begin + if sbeffects then StartSound(Sound[4], 0, false); + bullet2out:=true; + bullet2x:=shipx; + bullet2y:=shipy; + bullet2dir:=shipframe; + putshape(shape3array[76],vaddr,10,9,bullet2x,bullet2y); + end; + end; + +{***MOVE SHIP***} + + + ucollide:=upcollide(shipx,shipy,abs(shipyadd),-abs(shipyadd),10,vaddr2); + dcollide:=upcollide(shipx,shipy,abs(shipyadd),8,10,vaddr2); + lcollide:=leftcollide(shipx,shipy,abs(shipxadd),-abs(shipxadd),8,vaddr2); + rcollide:=leftcollide(shipx,shipy,abs(shipxadd),0,8,vaddr2); + if (shipframe=1) and (ucollide<>0) then shipyadd:=0; + if (shipframe=3) and (dcollide<>0) then shipyadd:=0; + if (shipframe=2) and (rcollide<>0) then shipxadd:=0; + if (shipframe=4) and (lcollide<>0) then shipxadd:=0; + shipy:=shipy+shipyadd; + shipyadd:=shipyadd-sgn(shipyadd); + shipx:=shipx+shipxadd; + shipxadd:=shipxadd-sgn(shipxadd); + + case ucollide of + 5: begin + changeroom:=true; + room:=whichroomnext[0]; + end; + end; + case dcollide of + 5: begin + changeroom:=true; + room:=whichroomnext[1]; + end; + end; + case rcollide of + 5: begin + changeroom:=true; + room:=whichroomnext[2]; + end; + end; + case lcollide of + 5: begin + changeroom:=true; + room:=whichroomnext[3]; + end; + end; + if (shipyadd<>0) or (shipxadd<>0) then inc(walking,4) + else walking:=0; + if walking>12 then walking:=0; + + CASE shipframe of + 1 : putshape (shape3array[60+walking],vaddr,10,9,shipx,shipy); + 2 : putshape (shape3array[61+walking],vaddr,10,9,shipx,shipy); + 3 : putshape (shape3array[62+walking],vaddr,10,9,shipx,shipy); + 4 : putshape (shape3array[63+walking],vaddr,10,9,shipx,shipy); + END; + waitretrace; + flipd320 (vaddr,vga); + if odd then begin + pal(250,0,0,63); + pal(251,63,0,0); + odd:=not(odd); + end + else begin + pal(251,0,0,63); + pal(250,63,0,0); + odd:=not(odd); + end; + + + for i:=0 to whatdelay do waitretrace; + + if changeroom then goto newroom; + + until levelover; +END; + + + + + +Procedure leveltwoengine(l_level:byte); +VAR loop1,loop2:integer; + ch,ch2:char; + saucersout:integer; + bullet1x,bullet1y,bullet2x,bullet2y,i:integer; + bullet1out,bullet2out:boolean; + whichone,temp,temp2:integer; + tempst:string; + what:byte; + k:integer; + itemp,jtemp:byte; + whatdelay:byte; + tempilg:byte; + xx:integer; + + backrow,topblocky:integer; + f:text; + levelover:boolean; + +procedure loadlevel2shapes; +var x,y,i,j,shape:byte; +begin + clearshape; + grapherror:=mode13loadpicpacked(0,0,vaddr,false,true,'ships.tb1'); + + for i:=0 to 42 do + for j:=0 to 30 do begin + ShapeTable1^[bigship1off+((j*43)+i)]:=getpixel(i,j,vaddr); + ShapeTable1^[bigship2off+((j*43)+i)]:=getpixel(i,j+32,vaddr); + ShapeTable1^[bigship3off+((j*43)+i)]:=getpixel(i,j+64,vaddr); + end; + + + if l_level=2 then + grapherror:=mode13loadpicpacked(0,0,vaddr,false,true,'tbaship.tb1'); + if l_level=4 then + grapherror:=mode13loadpicpacked(0,0,vaddr,false,true,'tbeerm.tb1'); + for j:=0 to 3 do + for i:=0 to 9 do + for x:=0 to 19 do + for y:=0 to 9 do + ShapeTable1^[shape2array[(j*10)+i]+((y*20)+x)] + :=getpixel(1+x+(i*21),1+y+(j*11),vaddr); + cls(0,vaddr); +end; + + + +BEGIN + level:=l_level; + loadlevel2shapes; + if l_level=2 then assign(f,'level2.tb1'); + if l_level=4 then assign(f,'level4.tb1'); + reset(f); + for j:=0 to 200 do + for i:=0 to 11 do read(f,background[j,i]); + close(f); + + for i:=0 to 30 do begin + passive[i].dead:=true; + passive[i].exploding:=false; + end; + for i:=0 to 5 do begin + enemy[i].out:=false; + end; + + + backrow:=0; + whatdelay:=1; + shipx:=36; + shipadd:=0; + shipframe:=1; + shipspeed:=5; + ch:=#1; ch2:=#1; + bullet1out:=false; bullet2out:=false; + bullet1x:=0; bullet1y:=0; + bullet2x:=0; bullet2y:=0; + + flipd320(vaddr2,vaddr); + str(level,tempst); + fillblock(251,52,314,59,0,vaddr); + outtextxy(tempst,307,51,12,0,vaddr,false); + + cls(0,vaddr2); + + for i:=0 to 100 do + begin + putshape240(14400{32}, + vaddr2,20,9,random(237),random(227)); + putshape240(14400{shape2array[32]}, + vaddr2,20,9,random(237),random(227)); + end; + + pal(254,shields*4,0,0); + howmuchscroll:=50; + + cls(0,vga); + coolbox(70,85,240,120,true,vga); + if l_level=2 then begin + outtextxy(' LEVEL TWO:',84,95,4,7,vga,false); + outtextxy('THE "PEACE ENVOY"',84,105,4,7,vga,false); + end; + if l_level=4 then begin + outtextxy(' LEVEL FOUR:',84,95,4,7,vga,false); + outtextxy(' THE PLANET EERM',84,105,4,7,vga,false); + end; + + clearkeyboardbuffer; + pauseawhile(300); + numpassive:=0; + levelover:=false; +{**** GAME LOOP ****} +{*******************} + Repeat + ch2:=#1; + ch:=#1; + dec(howmuchscroll); + if howmuchscroll<1 then begin + flipd50(vaddr2,2250,vaddr2,3000); + flipd50(vaddr2,1500,vaddr2,2250); + flipd50(vaddr2,750,vaddr2,1500); + flipd50(vaddr2,0,vaddr2,750); + for i:=0 to 4 do begin + outbackline(backrow,i); + for xx:=0 to 11 do begin + if (background[backrow,xx]>9) and + (background[backrow,xx]<20) then begin + k:=-1; + for j:=0 to numpassive do + if passive[j].dead=true then k:=j; + if k=-1 then begin + inc(numpassive); k:=numpassive; end; + with passive[k] do begin + dead:=false; + kind:=background[backrow,xx]; + if (kind>10) and + (kind<15) then + shooting:=true + else shooting:=false; + exploding:=false; + x:=xx*20; + y:=-(((i+1)*10)); + howmanyhits:=1; + lastshot:=0; + end; + end; + end; + inc(backrow); + end; + flipd50(vaddr3,0,vaddr2,0); + howmuchscroll:=50; + end; + + flipd240(howmuchscroll,vaddr,vaddr2); + + topblocky:=backrow-(howmuchscroll div 10)-1; + +{ str(passive[1].y,it); + outtextxy(it,10,10,12,0,vaddr,true); + + str(passive[1].x,it); + outtextxy(it,10,20,12,0,vaddr,true); } + + + + +{***Collision Check***} + + for i:=0 to 30 do if (passive[i].dead=false) and (passive[i].exploding=false) then with passive[i] do begin + if (bullet1out) and collision(bullet1x,bullet1y,3,4,x,y,10,5) + then begin + if kind<>10 then begin + if sbeffects then StartSound(Sound[3], 0, false); + exploding:=true; + explodeprogress:=0; + bullet1out:=false; + inc(score,10); + changescore; + end + else begin + bullet1out:=false; + tempilg:=7; + for i:=0 to 5 do if enemy[i].out=false then tempilg:=i; + if tempilg<>7 then begin + enemy[tempilg].out:=true; + enemy[tempilg].y:=bullet1y; + enemy[tempilg].x:=bullet1x; + enemy[tempilg].yspeed:=7; + enemy[tempilg].kind:=21; + end; + end; + end; + if (bullet2out) and collision(bullet2x,bullet2y,3,4,x,y,10,5) + then begin + if kind<>10 then begin + if sbeffects then StartSound(Sound[3], 0, false); + exploding:=true; + explodeprogress:=0; + bullet2out:=false; + inc(score,10); + changescore; + end + else begin + bullet2out:=false; + tempilg:=7; + for i:=0 to 5 do if enemy[i].out=false then tempilg:=i; + if tempilg<>7 then begin + enemy[tempilg].out:=true; + enemy[tempilg].y:=bullet2y; + enemy[tempilg].x:=bullet2x; + enemy[tempilg].yspeed:=7; + enemy[tempilg].kind:=21; + end; + end; + end; + + if (y>155) and (kind<>10) then begin + if collision(x,y,10,5,shipx+16,165,5,5) + or collision(x,y,10,5,shipx+6,175,18,8) + then begin + if sbeffects then startsound(Sound[5],0,false); + {exploding:=true; + explodeprogress:=2;} + dead:=true; + dec(shields); + if shields<0 then levelover:=true; + putshape240over(14800{shape2array[34]},vaddr2, + 20,9,x,y+howmuchscroll); + fillblock(250,71,314,79,0,vaddr); + if shields>0 then begin + pal(254,shields*4,0,0); + for itemp:=0 to shields do + for jtemp:=71 to 78 do + horizontalline(250+(itemp*4), + 254+(itemp*4),jtemp, + 47-itemp,vaddr); + end; + end; + end; + end; + + for i:=0 to 5 do if (enemy[i].out) then + if collision(enemy[i].x,enemy[i].y,2,5,shipx+16,165,5,5) + or collision(enemy[i].x,enemy[i].y,2,5,shipx+6,175,18,8) + then begin + if sbeffects then startsound(Sound[5],0,false); + enemy[i].out:=false; + dec(shields); + if shields<0 then levelover:=true; + {putshape240over(shape2array[34],vaddr2, + 20,9,passive[i].x,passive[i].y+howmuchscroll);} + fillblock(250,71,314,79,0,vaddr); + if shields>0 then begin + pal(254,shields*4,0,0); + for itemp:=0 to shields do + for jtemp:=71 to 78 do + horizontalline(250+(itemp*4), + 254+(itemp*4),jtemp, + 47-itemp,vaddr); + end; + + end; +{ for i:=0 to 30 do if (passive[i].dead=false) and (passive[i].y>-1) then + putshape(shape2array[16], + vaddr,20,9,passive[i].x,passive[i].y);} + + +{***DO EXPLOSIONS***} + for i:=0 to 30 do + if passive[i].exploding then with passive[i] do begin + inc(explodeprogress); + putshape240(shape2array[35+explodeprogress],vaddr2, + 20,9,x,y+howmuchscroll); + if explodeprogress>4 then begin + dead:=true; + exploding:=false; + putshape240over(14800{shape2array[34]},vaddr2, + 20,9,x,y+howmuchscroll); + end; + end; + + +{***MOVE BULLET***} + if bullet1out then begin + dec(bullet1y,5); + if bullet1y<5 then bullet1out:=false; + if bullet1out then putshape(12000,vaddr,20,9,bullet1x,bullet1y); + end; + if bullet2out then begin + dec(bullet2y,5); + if bullet2y<5 then bullet2out:=false; + if bullet2out then putshape(12000,vaddr,20,9,bullet2x,bullet2y); + end; +{***MOVE ENEMIES***} + for j:=0 to 30 do begin + if passive[j].dead=false then begin + inc(passive[j].y); + if(passive[j].y)>190 then passive[j].dead:=true; + end; + end; + for j:=0 to 30 do begin + if passive[j].lastshot>0 then dec(passive[j].lastshot); + if (passive[j].dead=false) and (passive[j].shooting) + and (passive[j].lastshot=0) and (passive[j].y>0) + then begin + tempilg:=7; + for i:=0 to 5 do if enemy[i].out=false then tempilg:=i; + if tempilg<>7 then begin + passive[j].lastshot:=30; + enemy[tempilg].out:=true; + enemy[tempilg].y:=passive[j].y; + enemy[tempilg].x:=passive[j].x+5; + enemy[tempilg].yspeed:=5; + enemy[tempilg].kind:=25; + if passive[j].kind=11 then enemy[tempilg].kind:=26; + end; + end; + end; + for j:=0 to 5 do begin + if enemy[j].out then begin + putshape(shape2array[enemy[j].kind],vaddr, + 20,9,enemy[j].x,enemy[j].y); + enemy[j].y:=enemy[j].y+enemy[j].yspeed; + if enemy[j].y>189 then enemy[j].out:=false; + end; + end; + + +{***READ KEYBOARD***} + + if keypressed then BEGIN + ch:=readkey; + if ch=chr(0) then ch2:=readkey; + if ch=#27 then levelover:=true; + if ch2='M' then + if shipadd>=0 then inc(shipadd,3) else shipadd:=0; + if ch2='K' then + if shipadd<=0 then dec(shipadd,3) else shipadd:=0; + if ch2=';' then help; + if ch='+' then begin + inc(whatdelay); + if whatdelay>25 then whatdelay:=25; + end; + if (ch='P') or (ch='p') then begin + coolbox(65,85,175,110,true,vga); + outtextxy('GAME PAUSED',79,95,4,7,vga,false); + clearkeyboardbuffer; + repeat until keypressed; tempch:=readkey; + end; + if ch='-' then begin + dec(whatdelay); + if whatdelay<1 then whatdelay:=1; + end; + if (ch='S') or (ch='s') then sbeffects:=not(sbeffects); + + if ch2='<' then savegame; + + end; + if (ch=' ') then begin + if (bullet1out=false) then begin + if sbeffects then StartSound(Sound[4], 0, false); + bullet1out:=true; + bullet1x:=shipx+21; + bullet1y:=165; + putshape(12000,vaddr,20,9,bullet1x,bullet1y); + end + else + if (bullet2out=false) then begin + if sbeffects then StartSound(Sound[4], 0, false); + bullet2out:=true; + bullet2x:=shipx+21; + bullet2y:=165; + putshape(12000,vaddr,20,9,bullet2x,bullet2y); + end; + end; + +{***MOVE SHIP***} + shipx:=shipx+shipadd; + if (shipx<1) then shipx:=1; + if (shipx>190) then shipx:=190; + CASE shipframe of + 1 : putshape (bigship1off,vaddr,43,30,shipx,165); + 3 : putshape (bigship3off,vaddr,43,30,shipx,165); + 2,4 : putshape (bigship2off,vaddr,43,30,shipx,165); + END; + inc(shipframe); + if shipframe=5 then shipframe:=1; + waitretrace; + flipd320 (vaddr,vga); + for i:=0 to whatdelay do waitretrace; + + {str(backrow,testr); + outtextxy(testr,20,20,9,7,vga,true);} + + if backrow>=200 then begin + clearkeyboardbuffer; + pauseawhile(200); + fade; + grapherror:=Mode13LoadPicPacked(0,0,vaddr,false,true,'viewscr.tb1'); + cls(0,vga); + blockmove(0,79,58,116,vaddr,10,10,vga); + clearkeyboardbuffer; + outsmalltextxy('UNIDENTIFIED SPACECRAFT!',70,10,2,0,vga,true); + outsmalltextxy('DO YOU WISH TO DEACTIVATE ',70,20,2,0,vga,true); + outsmalltextxy('THIS SHIP''S SECURITY SYSTEMS? (Y/N)',70,30,2,0,vga,true); + unfade; + clearkeyboardbuffer; + ch:='!'; + repeat + if keypressed then ch:=readkey; + until (upcase(ch)='Y') or (upcase(ch)='N'); + + if upcase(ch)='N' then begin + blockmove(0,79,58,116,vaddr,10,50,vga); + outsmalltextxy('NO? AFFIRMATIVE. ',70,50,9,0,vga,true); + outsmalltextxy('ARMING REMOTE DESTRUCTION RAY.',70,60,9,0,vga,true); + outsmalltextxy('GOOD-BYE.',70,70,9,0,vga,true); + pauseawhile(400); + fade; + end; + + if upcase(ch)='Y' then begin + blockmove(0,79,58,116,vaddr,10,50,vga); + outsmalltextxy('"Y"=CORRECT PASSWORD. ',70,50,2,0,vga,true); + outsmalltextxy('WELCOME SUPREME TENTACLEE COMMANDER.',70,60,2,0,vga,true); + outsmalltextxy('INITIATING TRACTOR BEAM AND AUTOMATIC',70,70,2,0,vga,true); + outsmalltextxy('LANDING PROCEDURE.',70,80,2,0,vga,true); + outsmalltextxy('WE WILL BE DEPARTING FOR THE PLANET',70,90,2,0,vga,true); + outsmalltextxy('EERM IN THREE MICROCYCLE UNITS.',70,100,2,0,vga,true); + pauseawhile(550); + level:=3; + clearkeyboardbuffer; + blockmove(0,42,58,79,vaddr,10,110,vga); + outsmalltextxy('Wha? Wait!',70,110,9,0,vga,true); + outsmalltextxy('What''s happening?',70,120,9,0,vga,true); + pauseawhile(550); + fade; + end; + + grapherror:=Mode13LoadPicPacked(0,0,vaddr,false,true,'tbtract.tb1'); + for i:=0 to 239 do + for j:=0 to 49 do + putpixel240(i,j,getpixel(i,j,vaddr),vaddr2); + cls(0,vga); + unfade; + for howmuchscroll:=50 downto 1 do begin + flipd240(howmuchscroll,vaddr,vaddr2); + putshape (bigship3off,vaddr,43,30,shipx,165); + waitretrace; + flipd320(vaddr,vga); + end; + + if upcase(ch)='N' then begin + clearkeyboardbuffer; + line(7,6,shipx+10,180,4,vga); + line(shipx+37,180,231,6,4,vga); + pauseawhile(50); + clearkeyboardbuffer; + for i:=shipx to shipx+48 do + verticalline(165,195,i,4,vga); + pauseawhile(200); + flipd240(howmuchscroll,vaddr,vaddr2); + flipd320(vaddr,vga); + pauseawhile(150); + end; + + + if upcase(ch)='Y' then begin; + shipadd:=sgn(shipx-95); + shipy:=165; + repeat + if shipx<>95 then shipx:=shipx-shipadd; + if shipy>9 then dec(shipy); + flipd240(howmuchscroll,vaddr,vaddr2); + line(7,6,shipx+10,shipy+15,2,vaddr); + line(shipx+37,shipy+15,231,6,2,vaddr); + putshape (bigship3off,vaddr,43,30,shipx,shipy); + waitretrace; + flipd320(vaddr,vga); + until (shipx=95) and (shipy=9); + clearkeyboardbuffer; + pauseawhile(850); + fade; + cls(0,vga); + + + while keypressed do ch:=readkey; + if level=4 then begin + outsmalltextxy('THE PLANET EERM?',20,20,10,0,vga,true); + outsmalltextxy('XENOCIDE FLEET?',20,30,10,0,vga,true); + outsmalltextxy('WHAT''S GOING ON?',20,40,10,0,vga,true); + outsmalltextxy('A MAJOR GOVERNMENT CONSPIRACY? MASS HALUCINATIONS?',20,50,10,0,vga,true); + + outsmalltextxy('WATCH FOR TOM BOMBEM LEVEL 3 (CURRENTLY IN THE DESIGN PHASE).',10,70,12,0,vga,true); + outsmalltextxy('ALL THESE QUESTIONS WILL BE ANSWERED!',10,80,12,0,vga,true); + outsmalltextxy('ALSO MORE FEATURES WILL BE ADDED:',10,90,12,0,vga,true); + outsmalltextxy(' BETTER GRAPHICS, SOUND AND SPEED.',10,100,12,0,vga,true); + + outsmalltextxy('TO HASTEN COMPLETION, SEND QUESTIONS/COMMENTS/DONATIONS TO ',9,120,9,0,vga,true); + outsmalltextxy('THE AUTHOR (SEE THE REGISTER MESSAGE FOR RELEVANT ADDRESSES).',9,130,9,0,vga,true); + + outsmalltextxy('THANK YOU FOR PLAYING TOM BOMBEM',80,150,14,0,vga,true); + unfade; + pauseawhile(1800); + end; + levelover:=true; + unfade; + end; + end; +until levelover; +END; + + +Procedure levelone; +VAR loop1,loop2:integer; + ch,ch2:char; + saucersout:integer; + bullet1x,bullet1y,bullet2x,bullet2y,i,wave:integer; + bullet1out,bullet2out:boolean; + whichone,temp,temp2,whichwave:integer; + tempst:string; + what:byte; + itemp,jtemp:byte; + whatdelay:byte; + levelover:boolean; + + +procedure waveincrease; +begin + inc(wave); + dec(saucersout); + if saucersout<0 then saucersout:=0; + if saucersout>5 then saucersout:=5; + if wave<6 then whichwave:=0; + if (wave>=6) and (wave<=12) then whichwave:=1; {1} + if (wave>12) and (wave<=20) then whichwave:=2; {2} + if (wave>20) and (wave<=30) then whichwave:=3; {3} + if (wave>30) and (wave<=36) then whichwave:=2; {2} + if (wave>36) and (wave<=46) then whichwave:=3; + if (wave>46) and (wave<=50) then whichwave:=1; + if (wave>50) and (wave<=60) then whichwave:=3; + if (wave>60) and (wave<=76) then whichwave:=2; + if (wave>76) and (wave<=82) then whichwave:=1; + if (wave>82) and (wave<=85) then whichwave:=3; + if (wave>85) and (wave<=96) then whichwave:=2; + if (wave>96) and (wave<=100) then whichwave:=1; + if (wave>100) then whichwave:=4; +end; + +procedure BeforeBoss; +begin + fade; + grapherror:=Mode13LoadPicPacked(0,0,vaddr,false,true,'viewscr.tb1'); + cls(0,vga); + blockmove(0,5,58,42,vaddr,10,10,vga); + clearkeyboardbuffer; + outsmalltextxy('HUMAN!',70,10,2,0,vga,true); + outsmalltextxy('WHAT ARE YOU DOING?!',70,20,2,0,vga,true); + outsmalltextxy('YOUR SPECIES MUST BE TERMINATED!',70,30,2,0,vga,true); + unfade; + pauseawhile(350); + clearkeyboardbuffer; + blockmove(0,42,58,79,vaddr,10,50,vga); + outsmalltextxy('I''M SORRY.',70,50,9,0,vga,true); + outsmalltextxy('WE DIDN''T MEAN TO DESTROY YOUR ENVOY.',70,60,9,0,vga,true); + outsmalltextxy('WILL YOU FORGIVE US AND TRY PEACE?',70,70,9,0,vga,true); + pauseawhile(400); + clearkeyboardbuffer; + blockmove(0,5,58,42,vaddr,10,90,vga); + outsmalltextxy('NO! YOU MUST BE DESTROYED!',70,90,2,0,vga,true); + outsmalltextxy('OUR FUNDING ... OUR ENVOY WAS DAMAGED BY',70,100,2,0,vga,true); + outsmalltextxy('YOU! VENGEANCE WILL BE OURS! YOUR PUNY',70,110,2,0,vga,true); + outsmalltextxy('PRIMITIVE SPACECRAFT WITH ITS INFERIOR',70,120,2,0,vga,true); + outsmalltextxy('WEAPONS WOULD HAVE TO SCORE 9 DIRECT HITS',70,130,2,0,vga,true); + outsmalltextxy('TO DESTROY MY SHIP! DIE EARTH SCUM!!!!',70,140,2,0,vga,true); + pauseawhile(800); + flipd240(howmuchscroll,vaddr,vaddr2); +end; + + +procedure AfterBoss; +begin + level:=2; + fade; + clearkeyboardbuffer; + grapherror:=Mode13LoadPicPacked(0,0,vaddr,false,true,'viewscr.tb1'); + cls(0,vga); + blockmove(0,42,58,79,vaddr,10,10,vga); + outsmalltextxy('HMM.. THEY DON''T BUILD SUPERIOR',70,10,9,0,vga,true); + outsmalltextxy('TECHNOLOGY LIKE THEY USED TO.',70,20,9,0,vga,true); + outsmalltextxy('I GUESS I CAN GO HOME NOW.',70,30,9,0,vga,true); + unfade; + pauseawhile(400); + clearkeyboardbuffer; + blockmove(0,5,58,42,vaddr,10,50,vga); + outsmalltextxy('NOT SO FAST! YOU JUST DESTROYED AN ANTIQUATED',70,50,2,0,vga,true); + outsmalltextxy('DEFENSE SYSTEM THAT WAS PROGRAMMED BY A 16',70,60,2,0,vga,true); + outsmalltextxy('YEAR OLD! OUR MAIN DEFENSE PROGRAMMER HAS ',70,70,2,0,vga,true); + outsmalltextxy('MUCH MORE SKILL NOW! UNLESS YOU DESTROY OUR',70,80,2,0,vga,true); + outsmalltextxy('ENTIRE XENOCIDE... I MEAN PEACE... ENVOY',70,90,2,0,vga,true); + outsmalltextxy('WE WILL STILL DESTROY YOUR HOME PLANET.',70,100,2,0,vga,true); + outsmalltextxy('NICE TRY PUNY EARTHLING!',70,110,2,0,vga,true); + pauseawhile(1200); + clearkeyboardbuffer; + blockmove(0,42,58,79,vaddr,10,130,vga); + outsmalltextxy('HMM.. I GUESS I BETTER SAVE THE EARTH.',70,130,9,0,vga,true); + outsmalltextxy('I''D BETTER SAVE MY GAME TOO.',70,140,9,0,vga,true); + outsmalltextxy('D''OH! I''M OUT OF BIG MISSILES! ',70,150,9,0,vga,true); + outsmalltextxy('WELL AT LEAST I HAVE SOME SMALLER SPARES.',70,160,9,0,vga,true); + pauseawhile(500); + clearkeyboardbuffer; + fade; + cls(0,vga); + flipd240(howmuchscroll,vaddr,vaddr2); + unfade; + + + {outsmalltextxy('YOU''VE BEATEN LEVEL ONE!!!',70,60,12,0,vga,true); + outsmalltextxy('NO, THIS IS NOT ONE OF THOSE ANNOYING',70,70,12,0,vga,true); + outsmalltextxy('"REGISTER NOW!" MESSAGES. ACTUALLY ',70,80,12,0,vga,true); + outsmalltextxy('THIS IS AS FAR AS THE GAME IS WRITTEN.',70,90,12,0,vga,true); + outsmalltextxy('OF COURSE, TO HASTEN ITS COMPLETION YOU',70,110,11,0,vga,true); + outsmalltextxy('COULD SEND A CONTRIBUTION TO THE AUTHOR.',70,120,11,0,vga,true); + outsmalltextxy(' ',70,130,11,0,vga,true); + outsmalltextxy('IN ANY CASE WATCH SOON FOR THE FURTHER ',70,150,14,0,vga,true); + outsmalltextxy('ADVENTURES OF TOM BOMBEM!!!',70,160,14,0,vga,true); + pauseawhile(1800); + flipd240(howmuchscroll,vaddr,vaddr2);} +end; + + +BEGIN + wave:=0; + whichwave:=0; + whatdelay:=1; + shipx:=36; + shipadd:=0; + shipframe:=1; + shipspeed:=5; + levelover:=false; + ch:=#1; ch2:=#1; + for i:=0 to 4 do begin + enemy[i].exploding:=false; + enemy[i].out:=false; + enemy[i].dead:=false; + end; + + bullet1out:=false; bullet2out:=false; + bullet1x:=0; bullet1y:=0; + bullet2x:=0; bullet2y:=0; + saucersout:=0; + + + flipd320(vaddr2,vaddr); + str(level,tempst); + fillblock(251,52,314,59,0,vaddr); + outtextxy(tempst,307,51,12,0,vaddr,false); + + cls(0,vaddr2); + for i:=0 to 50 do + putshape240(shapearray[12], + vaddr2,18,17,random(238),random(260)); + for i:=0 to 50 do + putshape240(shapearray[13], + vaddr2,18,17,random(238),random(260)); + {for i:=0 to 10 do putshape240(shapearray[11], + vaddr2,18,17,i*20,i*20);} + + pal(254,shields*4,0,0); + howmuchscroll:=50; + + cls(0,vga); + coolbox(70,85,240,120,true,vga); + outtextxy(' LEVEL ONE:',84,95,4,7,vga,false); + outtextxy('INANIMATE OBJECTS',84,105,4,7,vga,false); + + clearkeyboardbuffer; + pauseawhile(300); +{**** GAME LOOP ****} +{*******************} + + Repeat + ch2:=#1; + ch:=#1; + dec(howmuchscroll); + if howmuchscroll<1 then begin + flipd50(vaddr2,3000,vaddr3,0); + flipd50(vaddr2,2250,vaddr2,3000); + flipd50(vaddr2,1500,vaddr2,2250); + flipd50(vaddr2,750,vaddr2,1500); + flipd50(vaddr2,0,vaddr2,750); + flipd50(vaddr3,0,vaddr2,0); + howmuchscroll:=50; + end; + flipd240(howmuchscroll,vaddr,vaddr2); + +{***Collsion Check***} + for i:=0 to 4 do begin + if (enemy[i].dead=false) then begin + if (bullet1out) then begin + if collision(bullet1x,bullet1y,10,10, + enemy[i].x,enemy[i].y,9,9) then begin + if sbeffects then StartSound(Sound[3], 0, false); + dec(enemy[i].hitsneeded); + if enemy[i].hitsneeded<1 then enemy[i].dead:=true + else enemy[i].dead:=false; + enemy[i].exploding:=true; + enemy[i].explodprogress:=0; + bullet1out:=false; + inc(score,10); + changescore; + end; + end; + if (bullet2out) then begin + if collision(bullet2x,bullet2y,10,10, + enemy[i].x,enemy[i].y,9,9) then begin + if sbeffects then StartSound(Sound[3], 0, false); + dec(enemy[i].hitsneeded); + if enemy[i].hitsneeded<1 then enemy[i].dead:=true + else enemy[i].dead:=false; + enemy[i].exploding:=true; + enemy[i].explodprogress:=0; + bullet2out:=false; + inc(score,10); + changescore; + end; + end; + end; + end; + +{***DO EXPLOSIONS***} + for i:=0 to 4 do begin + if enemy[i].exploding=true then begin + inc(enemy[i].explodprogress); + if enemy[i].explodprogress<=5 then + putshape(shapearray[enemy[i].explodprogress+15], + vaddr,18,17,enemy[i].x,enemy[i].y) + else + if enemy[i].dead then begin + enemy[i].out:=false; + enemy[i].exploding:=false; + waveincrease; + end + else enemy[i].exploding:=false; + end; + end; +{***MOVE BULLET***} + if bullet1out then begin + dec(bullet1y,5); + if bullet1y<5 then bullet1out:=false; + if bullet1out then putshape(shape1off,vaddr,18,17,bullet1x,bullet1y); + end; + if bullet2out then begin + dec(bullet2y,5); + if bullet2y<5 then bullet2out:=false; + if bullet2out then putshape(shape1off,vaddr,18,17,bullet2x,bullet2y); + end; +{***MOVE ENEMIES***} + for i:=0 to 4 do begin + if (enemy[i].out=true) and (enemy[i].dead=false) then begin + putshape(shapearray[enemy[i].kind],vaddr,18,17,enemy[i].x,enemy[i].y); + enemy[i].x:=enemy[i].x+enemy[i].xspeed; + {*Check Position*} + if enemy[i].boundarycheck=false then inc(enemy[i].y,enemy[i].yspeed); + + if (enemy[i].x<=enemy[i].minx) or (enemy[i].x>=enemy[i].maxx) then begin + enemy[i].xspeed:=-enemy[i].xspeed; + enemy[i].x:=enemy[i].x+enemy[i].xspeed; + inc(enemy[i].y,enemy[i].yspeed); + end; + {*Too Low*} + if enemy[i].y>179 then begin + enemy[i].out:=false; + dec(saucersout); + end; + if enemy[i].y>140 then begin + if collision(shipx,165, + 24,15, + enemy[i].x,enemy[i].y, + 9,9) + then begin + if sbeffects then startsound(Sound[5],0,false); + dec(enemy[i].hitsneeded); + if enemy[i].hitsneeded=0 then enemy[i].dead:=true + else enemy[i].dead:=false; + enemy[i].exploding:=true; + enemy[i].explodprogress:=0; + dec(shields); + if shields<0 then levelover:=true; + fillblock(250,71,314,79,0,vaddr); + if shields>0 then begin + pal(254,shields*4,0,0); + for itemp:=0 to shields do + for jtemp:=71 to 78 do + horizontalline(250+(itemp*4), + 254+(itemp*4),jtemp, + 47-itemp,vaddr); + end; + end; + end; + + end; + end; +{***START NEW WAVE***} + {**STANDARD**} + if (saucersout=0) and (whichwave=0) then begin + saucersout:=5; + what:=random(8)+3; + for temp:=0 to 4 do begin + with enemy[temp] do begin + kind:=what; + x:=0; + y:=0; + xspeed:=5; + x:=temp*20; + minx:=(temp*20); + maxx:=(temp*20)+120; + boundarycheck:=true; + yspeed:=10; + out:=true; + exploding:=false; + hitsneeded:=1; + dead:=false; + end; + end; + end; + {**FALLING STRAIGHT**} + if whichwave=3 then begin + for temp:=0 to 4 do + if enemy[temp].out=false then begin + with enemy[temp] do begin + kind:=random(8)+3; + x:=random(200)+1; + y:=0; + xspeed:=0; + minx:=enemy[temp].x; + maxx:=enemy[temp].x; + boundarycheck:=true; + yspeed:=5+(wave div 40); + out:=true; + exploding:=false; + hitsneeded:=1; + dead:=false; + inc(saucersout); + end; + end; + end; + {**FALLING GRADUALLY SIDEWAYS**} + + if whichwave=2 then begin + for temp:=0 to 4 do + if enemy[temp].out=false then begin + with enemy[temp] do begin + kind:=random(8)+3; + y:=0; + xspeed:=5; + minx:=random(100); + maxx:=random(100)+120; + x:=enemy[temp].minx; + boundarycheck:=false; + yspeed:=1; + out:=true; + exploding:=false; + hitsneeded:=1; + dead:=false; + inc(saucersout); + end; + end; + end; + {**ZIG-ZAG**} + if (whichwave=1) and (saucersout=0) then begin + saucersout:=5; + whichone:=random(8)+3; + for temp:=0 to 4 do + if enemy[temp].out=false then begin + with enemy[temp] do begin + kind:=whichone; + y:=temp*10; + xspeed:=5; + minx:=0; + maxx:=220; + x:=temp*20; + boundarycheck:=false; + yspeed:=1; + out:=true; + exploding:=false; + hitsneeded:=1; + dead:=false; + end; + end; + end; + + if (whichwave=4) then begin + if saucersout=0 then begin + beforeboss; + enemy[0].kind:=15; + enemy[1].kind:=15; + enemy[2].kind:=14; + for temp:=0 to 2 do begin + with enemy[temp] do begin + x:=temp*20; + y:=0; + xspeed:=5; + minx:=0; + maxx:=220; + boundarycheck:=true; + yspeed:=0; + out:=true; + exploding:=false; + hitsneeded:=3; + dead:=false; + inc(Saucersout); + end; + end; + end; + + if enemy[1].kind=15 then + for temp:=3 to 4 do begin + inc(saucersout); + if (enemy[temp].out=false) + and (enemy[temp-3].out=true) then begin + with enemy[temp] do begin + kind:=random(8)+3; + x:=enemy[temp-3].x; + y:=20; + xspeed:=0; + minx:=x; + maxx:=x; + boundarycheck:=false; + yspeed:=5; + out:=true; + exploding:=false; + hitsneeded:=1; + dead:=false; + end; + end; + end; + end; + + if (whichwave=4) and (enemy[0].dead=true) and + (enemy[1].dead=true) and (enemy[2].dead=true) + and (wave>109) + then begin + AfterBoss; + levelover:=true; + end; +{***READ KEYBOARD***} + + if keypressed then BEGIN + ch:=readkey; + if ch=chr(0) then ch2:=readkey; + if ch=#27 then levelover:=true; + if ch2='M' then + if shipadd>=0 then inc(shipadd,3) else shipadd:=0; + if ch2='K' then + if shipadd<=0 then dec(shipadd,3) else shipadd:=0; + if ch2=';' then help; + if ch='+' then begin + inc(whatdelay); + if whatdelay>25 then whatdelay:=25; + end; + if (ch='P') or (ch='p') then begin + coolbox(65,85,175,110,true,vga); + outtextxy('GAME PAUSED',79,95,4,7,vga,false); + clearkeyboardbuffer; + repeat until keypressed; tempch:=readkey; + end; + if ch='-' then begin + dec(whatdelay); + if whatdelay<1 then whatdelay:=1; + end; + if (ch='S') or (ch='s') then sbeffects:=not(sbeffects); + + if ch2='<' then savegame; + + end; + if (ch=' ') then begin + if (bullet1out=false) then begin + if sbeffects then StartSound(Sound[4], 0, false); + bullet1out:=true; + bullet1x:=shipx+15; + bullet1y:=165; + putshape(shape1off,vaddr,18,17,bullet1x,bullet1y); + end + else + if (bullet2out=false) then begin + if sbeffects then StartSound(Sound[4], 0, false); + bullet2out:=true; + bullet2x:=shipx+15; + bullet2y:=165; + putshape(shape1off,vaddr,18,17,bullet2x,bullet2y); + end; + end; + +{***MOVE SHIP***} + shipx:=shipx+shipadd; + if (shipx<1) then shipx:=1; + if (shipx>190) then shipx:=190; + CASE shipframe of + 1 : putshape (bigship1off,vaddr,48,29,shipx,165); + 3 : putshape (bigship3off,vaddr,48,29,shipx,165); + 2,4 : putshape (bigship2off,vaddr,48,29,shipx,165); + END; + inc(shipframe);; + if shipframe=5 then shipframe:=1; + waitretrace; + flipd320 (vaddr,vga); + for i:=0 to whatdelay do waitretrace; + until levelover; +END; + +function grinput(xv,yv,howlong,forecol,backcol:integer):string; +var tempst:string; + ch3:char; + label bob; +begin + tempst:=''; + ch3:='Û'; + repeat + repeat until keypressed; + ch3:=readkey; + if (ch3=#8) and (ord(tempst[0])>0) then begin + fillblock(xv,yv,ord(tempst[0])*8+xv,yv+8,backcol,vga); + dec(tempst[0]); + end; + if length(tempst)>=howlong then goto bob; + if ch3>#20 then tempst:=concat(tempst,ch3); + if tempst[0]>#0 then + outtextxy(tempst,xv,yv,forecol,backcol,vga,true); + bob: + until ch3=#13; + grinput:=tempst; +end; + +procedure loadshapes; +var x,y,i,j,shape:byte; +begin + grapherror:=Mode13LoadPicpacked(0,0,vaddr,false,true,'ships.tb1'); + for i:=0 to 47 do + for j:=0 to 29 do begin + ShapeTable1^[bigship1off+((j*48)+i)]:=getpixel(i,j,vaddr); + ShapeTable1^[bigship2off+((j*48)+i)]:=getpixel(i,j+32,vaddr); + ShapeTable1^[bigship3off+((j*48)+i)]:=getpixel(i,j+64,vaddr); + end; + + grapherror:=Mode13LoadPicpacked(0,0,vaddr,false,true,'tbshapes.tb1'); + for j:=0 to 1 do + for i:=0 to 9 do + for x:=0 to 17 do + for y:=0 to 17 do + ShapeTable1^[shapearray[(((j*10)+1)+i)]+((y*18)+x)] + :=getpixel(1+x+(i*19),1+y+(j*19),vaddr); + cls(0,vaddr); +end; + + + +procedure littleopener; +begin + grapherror:=Mode13LoadPicpacked(0,0,vga,true,false,'moon2.tb1'); + fade; + cls(0,vga); + grapherror:=Mode13LoadPicpacked(0,0,vga,false,true,'moon2.tb1'); + for i:=0 to 15 do + for j:=0 to 18 do begin + ShapeTable1^[6000+((j*16)+i)]:=getpixel(i+9,j+178,vga); + ShapeTable1^[6400+((j*16)+i)]:=getpixel(i+30,j+178,vga); + end; + fillblock(0,178,319,199,0,vga); + unfade; + flipd320(vga,vaddr); + flipd320(vaddr,vaddr2); + for i:=100 downto 0 do begin + flipd320(vaddr2,vaddr); + putshape(6400,vaddr,16,18,i,100); + waitretrace; + if keypressed then if readkey=#27 then exit; + flipd320(vaddr,vga); + end; + flipd320(vaddr2,vga); + outtextxy('>KCHK< TOM! WHERE ARE YOU GOING?',5,180,15,0,vga,true); + pauseawhile(500); if keypressed then ch:=readkey; + waitretrace; + fillblock(0,178,319,199,0,vga); + outtextxy('Ooops. ',5,180,24,0,vga,true); + pauseawhile(500); if keypressed then ch:=readkey; + for inte:=0 to 151 do begin + flipd320(vaddr2,vaddr); + putshape(6000,vaddr,16,18,inte*2,100); + waitretrace; + flipd320(vaddr,vga); + if keypressed then if readkey=#27 then exit; + end; + flipd320(vaddr2,vga); + pauseawhile(5); + fade; + cls(0,vga); + unfade; +end; + +procedure littleopener2; +begin + cls(0,vga); + grapherror:=Mode13LoadPicpacked(0,0,vga,true,false,'tbl2ship.tb1'); + fade; + grapherror:=Mode13LoadPicpacked(0,0,vga,false,true,'tbl2ship.tb1'); + unfade; + outtextxy('Hmmmm... ',10,10,4,0,vga,false); + outtextxy('This Might Be Harder Than I Thought.',10,20,4,0,vga,false); + pauseawhile(500); if keypressed then ch:=readkey; + fade; + cls(0,vga); + unfade; +end; + + + +procedure playthegame(lev:integer); + +begin + + fade; + cls(0,vga); + unfade; + cls(0,vaddr); + level:=lev; + if level=0 then begin + littleopener; + shields:=10; + score:=0; + inc(level); + end; + beginscore:=score; + beginshields:=shields; + loadshapes; + grapherror:=Mode13LoadPicpacked(0,0,vga,true,false,'tbsobj.tb1'); + + hiscore:=showhiscore(false,false); + + + if level=1 then begin + setupsidebar; + y:=0; + levelone; + if level=2 then littleopener2; + end; + if level=2 then begin + setupsidebar; + beginscore:=score; + beginshields:=shields; + leveltwoengine(2); + end; + if level=3 then begin + setupsidebar; + beginscore:=score; + beginshields:=shields; + littleopener3; + levelthree; + end; + if level=4 then begin + setupsidebar; + beginscore:=score; + beginshields:=shields; + leveltwoengine(4); + end; + + + + + clearkeyboardbuffer; + + coolbox(70,85,170,110,true,vga); + outtextxy('GAME OVER',84,95,4,7,vga,false); + for inte:=0 to 100 do waitretrace; + repeat until keypressed; tempch:=readkey; + clearkeyboardbuffer; + + hiscore:=showhiscore(false,false); + if score>lowscore then begin + coolbox(10,75,310,125,true,vga); + outtextxy('NEW HIGH SCORE!',90,80,12,7,vga,false); + outtextxy('ENTER YOUR NAME (10 Chars)',30,90,0,7,vga,false); + hiname:=grinput(110,110,10,11,7); + hiscore:=showhiscore(false,true); + end; + hiscore:=showhiscore(true,false); + fade; + cls(0,vga); +end; + + + +procedure shadowrite(st:string;x5,y5,forecol,backcol:integer); +begin + outtextxy(st,x5+1,y5+1,backcol,0,vga,false); + outtextxy(st,x5,y5,forecol,0,vga,false); +end; + + + + function HexW(W: word): string; {Word} + const + HexChars: array [0..$F] of Char = '0123456789ABCDEF'; + begin + HexW := + HexChars[(W and $F000) shr 12] + + HexChars[(W and $0F00) shr 8] + + HexChars[(W and $00F0) shr 4] + + HexChars[(W and $000F)]; + end; + + procedure OurExitProc; far; + {If the program terminates with a runtime error before the extended memory} + {is deallocated, then the memory will still be allocated, and will be lost} + {until the next reboot. This exit procedure is ALWAYS called upon program} + {termination and will deallocate extended memory if necessary. } + var + i: byte; + begin + for i := 0 to NumSounds-1 do + if Sound[i] <> nil then FreeSound(Sound[i]); + if SharedEMB then ShutdownSharing; + ExitProc := OldExitProc; {Chain to next exit procedure} + end; + +procedure Init; + + begin + if not(GetSettings(BaseIO, IRQ, DMA, DMA16)) then + begin + baseio:=xbaseio; irq:=xirq; dma:=xdma; dma16:=0; + end; + if not(InitSB(BaseIO, IRQ, DMA, DMA16)) then + begin + settext; + writeln('Error initializing sound card'); + writeln('Incorrect base IO address, sound card not installed, or broken'); + writeln('Check your BLASTER= environmental value or re-run TBSETUP.'); + Halt(2); {Sound card could not be initialized} + end; + if not(InitXMS) then + begin + writeln('Error initializing extended memory'); + writeln('HIMEM.SYS must be installed'); + writeln('You might be better off by choosing no sound effects'); + writeln('In the TBSETUP program'); + Halt(3); {XMS driver not installed} + end + else + begin + if GetFreeXMS < XMSRequired + then + begin + writeln('Insufficient free XMS'); + writeln('You might be better off by choosing no sound effects'); + writeln('In the TBSETUP program.'); + Halt(4); {Insufficient XMS memory} + end + else + begin + if SharedEMB then InitSharing; + OpenSoundResourceFile('SOUNDS.TB1'); + LoadSound(Sound[0], 'CLICK'); + LoadSound(Sound[1], 'AHH'); + LoadSound(Sound[2], 'ZOOP'); + LoadSound(Sound[3], 'KAPOW'); + LoadSound(Sound[4], 'CC'); + LoadSound(Sound[5],'BONK'); + LoadSound(Sound[6],'OW'); + LoadSound(Sound[7],'SCREAM'); + CloseSoundResourceFile; + OldExitProc := ExitProc; + ExitProc := @OurExitProc; + end + end; + InitMixing; + end; + + procedure Shutdownsb1; + begin + ShutdownMixing; + ShutdownSB5; + + for i := 0 to NumSounds-1 do + FreeSound(Sound[i]); + if SharedEMB then ShutdownSharing; + writeln; + end; + + + + + +procedure QUIT; +label menu2; +begin + coolbox(90,75,230,125,true,vga); + barpos:=0; + outtextxy('QUIT??? ARE YOU',97,82,9,7,vga,false); + outtextxy('ABSOLUTELY SURE?',97,90,9,7,vga,false); + repeat + if barpos=0 then outtextxy('YES-RIGHT NOW!',97,98,150,0,vga,true) + else outtextxy('YES-RIGHT NOW!',97,98,150,7,vga,true); + if barpos=1 then outtextxy('NO--NOT YET.',97,106,150,0,vga,true) + else outtextxy('NO--NOT YET.',97,106,150,7,vga,true); + ch:=menuread; + if (ord(ch)>219) and (ord(ch)<224) then inc(barpos); + if ch='Y' then barpos:=0; + if ch='N' then barpos:=1; + if barpos=2 then barpos:=0; + until ch=#13; + if barpos=1 then goto menu2; + settext; + gotoxy(1,23); + move(imagedata,screen,4000); + textcolor(7); + if sbsound then shutdownsb1; + shutdown; + halt; + menu2: + barpos:=6; +end; + + + + + + + + + + +procedure options; +var opbarpos,argh:integer; +begin + cls(0,vaddr); + coolbox(0,0,319,199,false,vaddr); + flipd320(vaddr,vga); + outtextxy('ESC QUITS',120,175,32,0,vga,true); + opbarpos:=0; + repeat + if sbeffects then begin + if opbarpos=0 then outtextxy('SOUND ON ',30,30,32,7,vga,true) + else outtextxy('SOUND ON ',30,30,32,0,vga,true); + end; + if not(sbeffects) then begin + if opbarpos=0 then outtextxy('NO SOUND ',30,30,32,7,vga,true) + else outtextxy('NO SOUND ',30,30,32,0,vga,true); + end; + if opbarpos=1 then outtextxy('VIEW HIGH SCORES',30,40,32,7,vga,true) + else outtextxy('VIEW HIGH SCORES',30,40,32,0,vga,true); + ch:=menuread; + if (ord(ch)=222) or (ord(ch)=220) then inc(opbarpos); + if (ord(ch)=223) or (ord(ch)=221) then dec(opbarpos); + if ch='M' then opbarpos:=0; + if ch='V' then opbarpos:=1; + if (ch=#13) and (opbarpos=0) then sbeffects:=not(sbeffects); + if (ch=#13) and (opbarpos=1) then begin + ch:=#27; + argh:=4; + end; + if opbarpos=2 then opbarpos:=0; + if opbarpos=-1 then opbarpos:=1; + until ch=#27; + if argh=4 then hiscore:=(showhiscore(true,false)); +end; + +procedure loadgame; +begin + ondisk:=''; + coolbox(90,75,230,125,true,vga); + outtextxy('LOAD WHICH GAME',97,82,9,7,vga,false); + + findfirst('SG?.TB1',ANYFILE,filestuff); + while doserror=0 do with filestuff do + begin + ondisk:=concat(ondisk,name[3]); + findnext(filestuff); + end; + if ondisk='' then ondisk:='NO GAMES SAVED'; + outtextxy(ondisk,97,92,4,7,vga,false); + repeat until keypressed; + ch:=readkey; + if (ch>='0') and (ch<='9') then begin + {$I-} + ondisk:=concat('SG',ch,'.TB1'); + assign(savegamef,ondisk); + reset(savegamef); + {$I+} + If IOResult=0 then begin + readln(savegamef,score); + readln(savegamef,level); + readln(savegamef,shields); + close(savegamef); + playthegame(level); + end; + end; + +end; + + + +{************ +************* +************ +************} + + +procedure story; +var error:byte; + xtemp,ytemp:integer; + thrustcol:integer; + thrust:real; + tempch:char; + alienchar:byte; + cycles:byte; + + + + +procedure doflames; +begin + + if flames=true then begin + putshape(bigflame1off,vaddr,27,17,213,100); + putshapeover(sflame2off,vaddr,4,4,105,90); + putshapeover(sflame1off,vaddr,4,4,151,71); + putshapeover(sflame2off,vaddr,4,4,218,72); + end + else + begin + putshape(bigflame2off,vaddr,27,17,213,100); + putshapeover(sflame1off,vaddr,4,4,105,90); + putshapeover(sflame2off,vaddr,4,4,151,71); + putshapeover(sflame1off,vaddr,4,4,218,72); + outtextxy(chr(alienchar),10,10,12,0,vaddr,true); + inc(alienchar); + if alienchar>44 then alienchar:=34; + end; + flipd320(vaddr,vga); + vdelay(5); + flames:=not(flames); +end; + +procedure puttruck(xp,yp,frame:integer;where:word); +var xtemp,into,ytemp:integer; + col:byte; +begin + for into:=0 to 7 do begin + if(into+yp>=172) then + if frame=0 then putshapeline(truck1off,where,6,8,xp,yp,into) + else putshapeline(truck2off,where,6,8,xp,yp,into); + end; +end; + +procedure pauseawhile(howlong:word); +var i:word; +begin + i:=0; + repeat + waitretrace; + inc(i); + if i>howlong then exit; + until keypressed; +end; + + +begin + fade; + error:=Mode13LoadPicpacked(0,0,vaddr,false,true,'tbsobj.tb1'); + for ytemp:=0 to 18 do + for xtemp:=0 to 26 do begin + ShapeTable1^[((ytemp*27)+xtemp)+bigflame1off]:=getpixel(xtemp,ytemp+2,vaddr); + ShapeTable1^[((ytemp*27)+xtemp)+bigflame2off]:=getpixel(xtemp,ytemp+21,vaddr); + end; + for ytemp:=0 to 18 do + for xtemp:=0 to 15 do begin + ShapeTable1^[((ytemp*16)+xtemp)+explo1off]:=getpixel(127+xtemp,ytemp+100,vaddr); + ShapeTable1^[((ytemp*16)+xtemp)+explo2off]:=getpixel(148+xtemp,ytemp+100,vaddr); + end; + for ytemp:=0 to 6 do + for xtemp:=0 to 15 do + ShapeTable1^[((ytemp*16)+xtemp)+rent1off]:=getpixel(168+xtemp,ytemp+100,vaddr); + + for ytemp:=0 to 4 do + for xtemp:=0 to 3 do begin + ShapeTable1^[((ytemp*4)+xtemp)+sflame1off]:=getpixel(xtemp,ytemp+43,vaddr); + ShapeTable1^[((ytemp*4)+xtemp)+sflame2off]:=getpixel(xtemp,ytemp+47,vaddr); + end; + + for ytemp:=0 to 18 do + for xtemp:=0 to 15 do + ShapeTable1^[((ytemp*16)+xtemp)+bargeoff]:=getpixel(xtemp+65,ytemp+100,vaddr); + + for ytemp:=0 to 8 do + for xtemp:=0 to 5 do begin + ShapeTable1^[((ytemp*6)+xtemp)+truck1off]:=getpixel(xtemp+85,ytemp+100,vaddr); + ShapeTable1^[((ytemp*6)+xtemp)+truck2off]:=getpixel(xtemp+95,ytemp+100,vaddr); + end; + +{******FIRST MESSAGE*******} + cls(0,vga); + outtextxy('THE STORY SO FAR...',20,20,4,0,vga,false); + unfade; + pauseawhile(300); if keypressed then if readkey=#27 then exit; + fade; + cls(0,vga); + error:=Mode13LoadPicpacked(0,0,vaddr2,false,true,'tbcobj.tb1'); + blockmove(129,56,178,188,vaddr2,10,10,vga); + outtextxy('YOU ARE TOM BOMBEM, A STRANGE',80,10,1,0,vga,false); + outtextxy(' BUT EFFICIENT MEMBER OF',80,20,1,0,vga,false); + outtextxy(' THE LUNAR SPACE FORCE.',80,30,1,0,vga,false); + outtextxy('YOU NEVER SAY MUCH AND YOU ARE',80,50,4,0,vga,false); + outtextxy(' RARELY SEEN OUTSIDE OF ',80,60,4,0,vga,false); + outtextxy(' YOUR BLUE SPACESUIT.',80,70,4,0,vga,false); + outtextxy('YOU OFTEN GET YOURSELF IN ',80,90,2,0,vga,false); + outtextxy(' TROUBLE BY SCRATCHING',80,100,2,0,vga,false); + outtextxy(' YOUR HEAD AT INAPPROPRIATE',80,110,2,0,vga,false); + outtextxy(' TIMES.',80,120,2,0,vga,false); + outtextxy('PRESS ANY KEY....',96,185,15,0,vga,false); + unfade; + pauseawhile(900); if keypressed then if readkey=#27 then exit; + fade; + cls(0,vga); + blockmove(129,56,178,188,vaddr2,260,10,vga); + blockmove(99,104,128,185,vaddr2,287,13,vga); + outtextxy('IT IS THE YEAR 2028.',10,10,1,0,vga,false); + outtextxy('YOU HAVE BEEN SUMMONED BY',10,30,3,0,vga,false); + outtextxy(' LUNAR DICTATOR-IN-CHIEF',10,40,3,0,vga,false); + outtextxy(' VINCENT WEAVER ABOUT A',10,50,3,0,vga,false); + outtextxy(' TOP SECRET THREAT TO ',10,60,3,0,vga,false); + outtextxy(' INTERPLANETARY SECURITY.',10,70,3,0,vga,false); + outtextxy('YOU ATTEND THE BRIEFING WITH',10,90,5,0,vga,false); + outtextxy(' YOUR USUAL CONFUSED',10,100,5,0,vga,false); + outtextxy(' QUIETNESS. YOU STILL DO',10,110,5,0,vga,false); + outtextxy(' NOT UNDERSTAND YOUR OWN',10,120,5,0,vga,false); + outtextxy(' SUCCESSFULNESS.',10,130,5,0,vga,false); + outtextxy('PRESS ANY KEY....',96,185,15,0,vga,false); + unfade; + pauseawhile(900); if keypressed then if readkey=#27 then exit; + fade; + + error:=Mode13LoadPicpacked(0,0,vga,false,true,'tbchief.tb1'); + + unfade; + blockmove(115,55,206,114,vga,115,55,vaddr); + + {pauseawhile(600); if keypressed then if readkey=#27 then exit;} + + outtextxy('Ahhh.... Mr. Bombem.... ',1,1,15,0,vga,true); + if sbeffects then startsound(sound[1],0,false); + pauseawhile(200); if keypressed then if readkey=#27 then exit; + if sbeffects then startsound(sound[3],0,false); + blockmove(188,14,279,73,vaddr2,115,55,vga); + pauseawhile(500); if keypressed then if readkey=#27 then exit; + blockmove(115,55,206,114,vaddr,115,55,vga); + outtextxy('I''ll be brief. ',1,1,15,0,vga,true); + pauseawhile(400); if keypressed then if readkey=#27 then exit; + outtextxy('Do you know how this base was founded?',1,1,15,0,vga,true); + pauseawhile(600); if keypressed then if readkey=#27 then exit; + outtextxy('No? Well watch the screen. ',1,1,15,0,vga,true); + pauseawhile(400); if keypressed then if readkey=#27 then exit; + blockmove(210,75,295,134,vaddr2,210,136,vga); + pauseawhile(300); if keypressed then if readkey=#27 then exit; + + pal(250,0,0,0); + fade; + +{******BARGE TAKING OFF**********} + error:=Mode13LoadPIcpacked(0,0,vaddr2,false,true,'tbma1.tb1'); +{ outsmalltextxy('MY WIFE AND I FOUNDED',212,3,14,0,vaddr2,false); + outsmalltextxy('THIS BASE IN 2008.',212,9,14,0,vaddr2,false); + outsmalltextxy('THE ONLY WAY TO ',212,16,13,0,vaddr2,false); + outsmalltextxy('FINANCE IT WAS TO',212,22,13,0,vaddr2,false); + outsmalltextxy('ENGAGE IN A DUBIOUS',212,28,13,0,vaddr2,false); + outsmalltextxy('BUSINESS.',212,34,13,0,vaddr2,false); + outsmalltextxy('WE LAUNCHED EARTH''S',212,41,12,0,vaddr2,false); + outsmalltextxy('TRASH INTO SPACE',212,47,12,0,vaddr2,false); + outsmalltextxy('FOR A PROFIT.',212,53,12,0,vaddr2,false); + outsmalltextxy('HERE IS FOOTAGE FROM',212,60,11,0,vaddr2,false); + outsmalltextxy('THE LAST LAUNCH EIGHT',212,66,11,0,vaddr2,false); + outsmalltextxy('YEARS AGO.',212,72,11,0,vaddr2,false);} + flipd320(vaddr2,vaddr); + putshape(bargeoff,vaddr,16,18,141,157); + flipd320(vaddr,vga); + unfade; + + pauseawhile(700); if keypressed then if readkey=#27 then exit; + + for ytemp:=191 downto 164 do begin + if ytemp>=172 then blockmove(145,ytemp,152,ytemp+10,vaddr2,145,ytemp,vaddr) + else blockmove(145,172,152,182,vaddr2,145,172,vaddr); + puttruck(145,ytemp,ytemp mod 2,vaddr); + pauseawhile(7); + if keypressed then if readkey=#27 then exit; + flipd320(vaddr,vga); + end; + + pauseawhile(20); + flipd320(vaddr2,vaddr); + putshape(bargeoff,vaddr,16,18,141,157); + thrustcol:=0; + ytemp:=157; + thrust:=0; + while ytemp>-25 do begin + thrust:=thrust+0.05; + if thrustcol<63 then inc(thrustcol); + blockmove(141,ytemp,171,ytemp+30,vaddr2,141,ytemp,vaddr); + for i:=1 to 17 do + if ytemp+i>=0 then + putshapeline(bargeoff,vaddr,16,18,141,ytemp,i); + pauseawhile(5); + if keypressed then if readkey=#27 then exit; + pal(250,thrustcol,0,0); + flipd320(vaddr,vga); + ytemp:=ytemp-round(thrust); + end; + + pauseawhile(100); + if keypressed then if readkey=#27 then exit; + fade; + +{****SECOND CHIEF*******} + error:=Mode13LoadPicpacked(0,0,vaddr2,false,true,'tbcobj.tb1'); + error:=Mode13LoadPicpacked(0,0,vga,false,true,'tbchief.tb1'); + blockmove(7,104,97,125,vaddr2,6,174,vga); + unfade; + outtextxy('You might wonder why this is important.',1,1,15,0,vga,true); + pauseawhile(600); if keypressed then if readkey=#27 then exit; + outtextxy('Last week we received a message. ',1,1,15,0,vga,true); + pauseawhile(600); if keypressed then if readkey=#27 then exit; + outtextxy('It is of extra-terrestrial origin. ',1,1,15,0,vga,true); + pauseawhile(600); if keypressed then if readkey=#27 then exit; + outtextxy('Watch the screen. ',1,1,15,0,vga,true); + blockmove(210,136,295,195,vaddr2,210,136,vga); + pauseawhile(300); if keypressed then if readkey=#27 then exit; + fade; + +{******ALIEN DELEGATION*****} + error:=Mode13LoadPicpacked(0,0,vaddr2,false,true,'tbcrash.tb1'); + alienchar:=34; + flipd320(vaddr2,vaddr); + flipd320(vaddr,vga); + putshape(bargeoff,vaddr,16,18,97,180); + unfade; + xtemp:=97; + ytemp:=181; + flames:=true; + while ytemp>118 do begin + blockmove(xtemp,ytemp,xtemp+20,ytemp+20,vaddr2,xtemp,ytemp,vaddr); + putshape(bargeoff,vaddr,16,18,xtemp,ytemp); + doflames; + dec(ytemp); + inc(xtemp); + pauseawhile(1); + if keypressed then if readkey=#27 then exit; + end; + blockmove(xtemp,ytemp,xtemp+30,ytemp+30,vaddr2,xtemp,ytemp,vaddr); + pal(0,63,63,63); + putshape(explo1off,vga,16,18,160,118); + pauseawhile(5); + if keypressed then if readkey=#27 then exit; + pal(0,0,0,0); + if sbeffects then startsound(sound[3],0,false); + for xtemp:=0 to 10 do begin + putshapeover(explo2off,vaddr,16,18,160,118); + doflames; + putshapeover(explo1off,vaddr,16,18,160,118); + doflames; + end; + blockmove(159,114,189,144,vaddr2,159,114,vaddr); + putshapeover(rent1off,vaddr,16,6,160,115); + flipd320(vaddr,vga); + cycles:=0; + repeat + doflames; + inc(cycles); + until ((keypressed) or (cycles>60)); + if keypressed then if readkey=#27 then exit; + +{****ALIEN MESSAGE*****} + fade; + error:=Mode13LoadPicpacked(0,0,vga,false,true,'tbgorg.tb1'); + unfade; + outtextxy('GREETINGS EARTHLINGS.',0,162,12,0,vga,false); + outtextxy('I AM GORGONZOLA THE REPULSIVE.',0,171,12,0,vga,false); + outtextxy('YOU HAVE MADE A BIG MISTAKE.',0,180,12,0,vga,false); + pauseawhile(600); + if keypressed then if readkey=#27 then exit; + outtextxy('YOUR SHIP FULL OF REFUSE HAS',0,162,12,0,vga,true); + outtextxy('DAMAGED OUR OFFICIAL PEACE ',0,171,12,0,vga,true); + outtextxy('ENVOY. IT WAS ON ITS WAY TO ',0,180,12,0,vga,true); + outtextxy('YOUR PLANET. ',0,189,12,0,vga,true); + pauseawhile(600); + if keypressed then if readkey=#27 then exit; + outtextxy('IN AN IRONIC FORM OF RETALLIATION',0,162,12,0,vga,true); + outtextxy('WE HAVE MADE YOUR TRASH EVIL AND',0,171,12,0,vga,true); + outtextxy('TURNED IT AGAINST YOU. ',0,180,12,0,vga,true); + outtextxy(' DIE EARTH SCUM! ',0,189,12,0,vga,true); + pauseawhile(600); + if keypressed then if readkey=#27 then exit; + fade; +{****** THIRD CHIEF *******} + error:=Mode13LoadPicpacked(0,0,vaddr2,false,true,'tbcobj.tb1'); + error:=Mode13LoadPicpacked(0,0,vga,false,true,'tbchief.tb1'); + blockmove(7,127,97,148,vaddr2,6,174,vga); + unfade; + outtextxy('Tom, our radar detects approaching ',1,1,15,0,vga,true); + pauseawhile(500); if keypressed then if readkey=#27 then exit; + outtextxy('objects. They are inside the ',1,1,15,0,vga,true); + pauseawhile(500); if keypressed then if readkey=#27 then exit; + outtextxy('orbit of Jupiter. ',1,1,15,0,vga,true); + pauseawhile(500); if keypressed then if readkey=#27 then exit; + outtextxy('You are our only hope! ',1,1,15,0,vga,true); + pauseawhile(500); if keypressed then if readkey=#27 then exit; + outtextxy('Will you fly our only spaceship ',1,1,15,0,vga,true); + pauseawhile(500); if keypressed then if readkey=#27 then exit; + outtextxy('and save the human race? ',1,1,15,0,vga,true); + pauseawhile(500); if keypressed then if readkey=#27 then exit; + blockmove(5,16,44,98,vaddr2,146,59,vga); + pauseawhile(10); + blockmove(46,16,85,98,vaddr2,146,59,vga); + pauseawhile(10); + blockmove(87,16,126,98,vaddr2,146,59,vga); + outtextxy('Scratch. Scratch. ',1,1,9,0,vga,true); + pauseawhile(300); if keypressed then if readkey=#27 then exit; + outtextxy('I knew you''d do it. Good Luck! ',1,1,15,0,vga,true); + pauseawhile(600); if keypressed then if readkey=#27 then exit; + outtextxy(' ',1,1,9,0,vga,true); + pauseawhile(600); if keypressed then if readkey=#27 then exit; +end; + +procedure credits; +var j:integer; + sp:boolean; + ky:word; + procedure rotate(stri:string;col:integer); + var j1,k1:integer; + + begin + if not(sp) then begin + for j1:=0 to 7 do begin + + outtextline(stri,0,198,col,0,j1,vga); + {move(mem vga:320 vga:0 63680} + asm + push ds; + push es; + mov ax,vga + mov ds,ax + mov es,ax + mov cx,31840 + mov si,320 + mov di,0 + rep movsw + pop es; + pop ds; + end; + if keypressed then begin sp:=true; ch:=readkey; end; + end; + end; + end; + procedure skip; begin rotate(' ',0); end; + label ender; +begin + sp:=false; + cls(0,vaddr); + flipd320(vaddr,vga); + j:=0; + if keypressed then ch:=readkey; + rotate(' TOM BOMBEM',4); + rotate(' INVASION OF THE INANIMATE OBJECTS',4); + skip; rotate(' PROGRAMMING',9); + skip; rotate(' VINCENT M WEAVER',9); + skip; skip; rotate(' GRAPHICS',10); + if sp then goto ender; + skip; rotate(' VINCENT M WEAVER',10); + skip; skip; rotate(' SOUND EFFECTS',11); + if sp then goto ender; + skip; rotate(' VINCENT M WEAVER',11); + skip; skip; rotate(' GRAPHICS INSPIRATION',12); + if sp then goto ender; + skip; rotate(' JEFF WARWICK',12); + skip; skip; rotate(' GENERAL HELP',13); + if sp then goto ender; + skip; rotate(' JOHN CLEMENS',13); + skip; rotate(' JASON GRIMM',13); + skip; skip; rotate(' PCGPE AUTHORS, esp',14); + if sp then goto ender; + skip; rotate(' GRANT SMITH',14); + skip; skip; rotate(' SOUND BLASTER CODE',15); + if sp then goto ender; + skip; rotate(' ETHAN BRODSKY',15); + skip; skip; rotate(' INSPIRATION',9); + if sp then goto ender; + skip; rotate(' DOUGLAS ADAMS',9); + skip; rotate(' CLIFF STOLL',9); + skip; rotate(' ARTHUR C CLARKE',9); + skip; rotate(' ISAAC ASIMOV',9); + skip; rotate(' GORDON KORMAN',9); + skip; skip; rotate(' THANKS TO ALL THE AGENTS',10); + if sp then goto ender; + skip; rotate(' B,D,JL,L,N,P,S,W,PM,E,G,TK',10); + skip; rotate(' AND ESPECIALLY MP',10); + + ender: + ky:=0; + repeat + asm + push ds; + push es; + mov ax,vaddr2 + mov ds,ax + mov ax,vga + mov es,ax + mov ax,ky + shl ax,5 + mov cx,ax + shl ax,1 + shl cx,3 + add ax,cx + mov si,ax + mov di,63680 + mov cx,160 + rep movsw + pop es; + pop ds; + end; + + {move(mem[vaddr2:(ky*320)],mem[vga:(32000)],320);} + asm + push ax; + push ds; + push es; + push cx; + push si; + push di; + mov ax,vga + mov ds,ax + mov es,ax + mov cx,31840 + mov si,320 + mov di,0 + rep movsw + pop di; + pop si; + pop cx; + pop es; + pop ds; + pop ax; + end;{ + Move (mem[vga:320],mem[vga:0],63680); } + inc(ky); + until (keypressed) or (ky=199); + if keypressed then ch:=readkey; + end; + + +procedure register; + +var pagenum,oldpagenum,numpages:integer; + pagest:string; + numst:string[2]; + +procedure page1; +begin + flipd320(vaddr,vga); + shadowrite(' TO REGISTER',10,10,9,1); + shadowrite('I STARTED THIS GAME IN LATE',70,30,9,1); + shadowrite(' 1994, WHEN I WAS 16.',70,40,9,1); + shadowrite('I WROTE THIS GAME ENTIRELY IN',75,50,9,1); + shadowrite(' MY FREE TIME.',74,60,9,1); + shadowrite(' ^(AUTHOR AT AGE 17)',10,70,10,2); + shadowrite('HOPEFULLY YOU FEEL MY FREE TIME IS',10,90,12,4); + shadowrite(' WORTH SOMETHING. YOU DO NOT NEED',10,100,12,4); + shadowrite(' TO SEND MONEY, BUT ANY GIFT WOULD',10,110,12,4); + shadowrite(' BE APPRECIATED. ALSO I WOULD BE',10,120,12,4); + shadowrite(' GLAD TO HEAR ANY COMMENTS AND ',10,130,12,4); + shadowrite(' ANSWER ANY QUESTIONS.',10,140,12,4); +end; +procedure page2; +begin + flipd320(vaddr2,vga); + shadowrite('I CAN BE REACHED AS:',10,10,10,2); + shadowrite(' VINCENT WEAVER',10,20,10,2); + shadowrite(' 326 FOSTER KNOLL DR.',10,30,10,2); + shadowrite(' JOPPA, MD 21085-4706, USA, ETC.',10,40,10,2); + shadowrite('AFTER THE SUMMER OF 1996 I WILL BE',10,60,13,5); + shadowrite(' AWAY AT COLLEGE, AT THE UNIVERSITY',10,70,13,5); + shadowrite(' OF MARYLAND, COLLEGE PARK.',10,80,13,5); + shadowrite('GET THE NEWEST VERSION OF TB1 AT',10,100,11,3); + shadowrite(' THE OFFICIAL TB1 WEB SITE:',10,110,11,3); + shadowrite(' http://www.wam.umd.edu/~vmweaver/tb1/',10,120,11,3); + shadowrite('I CAN BE CONTACTED VIA E-MAIL AT:',10,140,12,4); + shadowrite(' VMWEAVER@WAM.UMD.EDU',10,150,9,1); + shadowrite('FEEL FREE TO SEND COMMENTS/MONEY.',10,160,12,4); +end; + +procedure page3; +begin + flipd320(vaddr2,vga); + shadowrite('OTHER VMW SOFTWARE PRODUCTIONS:',10,10,15,7); + shadowrite(' PAINTPRO:',10,30,13,5); + shadowrite(' LOAD AND SAVE GRAPHICS PICTURES',10,40,13,5); + shadowrite(' INTO C, PASCAL, BASIC, ETC.',10,50,13,5); + shadowrite(' WITH SCREEN CAPTURE UTILITY.',10,60,13,5); + shadowrite(' SPACEWAR III:',10,70,11,3); + shadowrite(' NEVER COMPLETED GAME WITH WORKING',10,80,11,3); + shadowrite(' SPACESHIPS. SORT OF COOL.',10,90,11,3); + shadowrite(' AITAS: (ADVENTURES IN TIME AND SPACE)',10,100,12,4); + shadowrite(' THIS GAME WILL BE FINISHED SOMEDAY.',10,110,12,4); + shadowrite(' IT HAS BEEN UNDER WAY FOR 5 YEARS.',10,120,12,4); +{ shadowrite(' MISC PASCAL/BASIC PROGRAMS:',10,130,9,1); + shadowrite(' OVER 500 PROGRAMS WRITTEN OR TYPED',10,140,9,1); + shadowrite(' IN BY ME....FUN TO LOOK AT.',10,150,9,1);} +end; + +procedure page4; +begin + flipd320(vaddr2,vga); + shadowrite('DISCLAIMERS:',10,10,12,14); + shadowrite('* THE ABOVE PROGRAMS HAVE NEVER DONE *',8,30,12,4); + shadowrite('* ANYTHING BAD TO MY COMPUTER THAT *',8,40,12,4); + shadowrite('* CTRL-ALT-DEL WOULDN''T FIX. I AM *',8,50,12,4); + shadowrite('* NOT RESPONSIBLE FOR HARD DISK *',8,60,12,4); + shadowrite('* DISSAPPEARANCES, MISSING MODEMS *',8,70,12,4); + shadowrite('* MOUSE BREAKDOWNS, MELTING MONITORS *',8,80,12,4); + SHADOWRITE('* OR ANYTHING ELSE. *',8,90,12,4); + shadowrite('% ALL VMW SOFTWARE PRODUCTIONS ARE %',8,110,11,3); + shadowrite('% RELEASED VIRUS FREE !!!!!!!!!!!! %',8,120,11,3); +end; + + /fade(); + cls(0,vga); + unfade; + cls(0,vaddr); + grapherror:=Mode13LoadPIcpacked(0,0,vaddr,true,true,'register.tb1'); + coolbox(0,0,319,199,false,vaddr); + cls(0,vaddr2); + coolbox(0,0,319,199,false,vaddr2); + pagenum:=1; + oldpagenum:=1; + numpages:=4; + page1; + shadowrite('PAGE 1 of 4: ESC QUITS',50,180,15,7); + repeat + ch:=menuread; + if (ch=' ') or (ch=#13) then inc(pagenum); + if (ch='õ') or (ch='Þ') or (ch='Ü') then inc(pagenum); + if (ch='ô') or (ch='Ý') or (ch='ß') then dec(pagenum); + if pagenum>4 then pagenum:=1; + if pagenum<1 then pagenum:=4; + if oldpagenum<>pagenum then begin + if pagenum=1 then page1; + if pagenum=2 then page2; + if pagenum=3 then page3; + if pagenum=4 then page4; + str(pagenum:2,numst); + pagest:=concat('PAGE ',numst); + str(numpages:2,numst); + pagest:=concat(pagest,' of ',numst,': ESC QUITS'); + shadowrite(pagest,50,180,15,7); + oldpagenum:=pagenum; + end; + until ch=#27; + fade; + cls(0,vga); + unfade; + grapherror:=Mode13LoadPIcpacked(0,0,vaddr2,true,true,'tbomb1.tb1'); + fade; +end; +*/ + +int main(int argc,char **argv) +{ + int i,j,cdrom_mode; + char tempst[100]; + + cdrom_mode=0; + if (argc>1){ + for (i=1;i + +#elif defined(HAVE_SUN_SOUND) +# if defined(HAVE_SYS_AUDIOIO_H) +# include +# elif defined(HAVE_SUN_AUDIOIO_H) +# include +# endif + +#elif defined(HAVE_HP_SOUND) +# include + +#endif + +#include "soundIt.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/*==========================================================================*/ +/* the mix buff, where the channels are mixed into. The mix buffer is then + dumped to the sound device (/dev/dsp). Samples are mixed in + Vunclipbuf (buffer of ints), then the values in Vunclipbuf are clipped to + values between 0 and 255, and stored into Vclippedbuf (buffer of unsigned + chars). +*/ + +typedef struct { +#if defined(HAVE_LINUX_SOUND) + unsigned char *Vclippedbuf; +#elif defined(HAVE_16BIT_SOUND) + short *Vclippedbuf; +#endif + int *Vunclipbuf; + int Vsize; +} Mix; + +/*==========================================================================*/ +typedef struct { + unsigned char *Vstart, *Vcurrent; /* ptr's into a playing sample */ + int Vlen; /* length of sample in bytes */ + int Vleft; /* bytes left of sample to play */ + int Vloop; /* loop=0 : play sample once */ + /* loop=1 : loop sample */ +} Channel; + +/*==========================================================================*/ + +/* variables prefixed with S_ are static */ +/* 0 if mixer isn't initialized or init failed, 1 if mixer is good */ +static int S_mixerStatus = 0; + +static const Sample *S_sounds = NULL; /* ptr to array of samples */ +static int S_num_sounds = 0; /* size of 'sounds' array above */ +static int S_fd_snddev = -1; /* file # for sound device once open */ +static int S_fd_pipe[2] = { -1, -1 }; /* pipe to talk to child process */ +static int S_son_pid = -1; /* process ID for the forked sound mixer */ +static const char *S_snddev = NULL; /* char string for device, ie "/dev/dsp" */ +static int S_num_channels = 6; /* number of channels to mix */ +static int S_playback_freq = 0; /* playback frequency (in Hz) */ +/*==========================================================================*/ +/* non-public functions, used only within this file*/ + +int Snd_init_dev(void); +int Snd_restore_dev(void); + +void Chan_reset(Channel *chan); /* init channel structure */ + + /* start a sample playing on a channel */ +void Chan_assign(Channel *chan, const Sample *snd); + + /* mix all channels together into the 'mix' structure */ +int Chan_mixAll(Mix *mix, Channel *ch); + + /* used by Chan_mixAll to mix the 1st channel */ +int Chan_copyIn(Channel *chan, Mix *mix); + + /* used by Chan_mixAll to mix a loop in the 1st channel */ +int Chan_copyIn_loop(Channel *chan, Mix *mix); + + /* used by Chan_mixAll to mix the middle channels */ +int Chan_mixIn(Channel *chan, Mix *mix); + + /* used by Chan_mixAll to mix the last channel */ +int Chan_finalMixIn(Channel *chan, Mix *mix); + + +/* alloc mem for mix buffer, and deallocate function */ +/* The sound channels are mixed together into the mix buffer */ +/* then the mix buffer data is sent directly to the sound device */ +void Mix_alloc(Mix *mix, int size); +void Mix_dealloc(Mix *mix); + +/*==========================================================================*/ +/* justing for testing, normally not called */ +void +dump_snd_list(void) +{ + int i=0; + + for(i=0; i=S_num_sounds) + return EXIT_FAILURE; + + /* make sure a valid channel # was passed in */ + if(channel<0 || channel>=S_num_channels) + return EXIT_FAILURE; + + if(S_sounds[sound_num].data != NULL) { + write(S_fd_pipe[1], &sound_num, sizeof(sound_num)); + write(S_fd_pipe[1], &channel, sizeof(channel)); + } + else { + fprintf(stderr,"Referencing NULL sound entry\n"); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} + +/*============================================================================*/ +int +Snd_init_dev(void) +{ + int whoami; + S_fd_snddev = -1; + + S_son_pid = 0; + + if(access(S_snddev,W_OK) != 0) { + perror("no access to sound device"); + return EXIT_FAILURE; + } + + S_fd_snddev = open(S_snddev,O_WRONLY); + + if(S_fd_snddev < 0) { + perror("cannot open sound device"); + return EXIT_FAILURE; + } + + close(S_fd_snddev); + + if(pipe(S_fd_pipe) < 0) { + perror("cannot create pipe for sound control"); + return EXIT_FAILURE; + } + + /* now setup 2nd process for writing the data... */ + if((whoami = fork()) < 0) { + perror("cannot fork sound driver\n"); + return EXIT_FAILURE; + } + + if(whoami != 0) { /* successfully created son */ + close(S_fd_pipe[0]); /* close end for reading */ + S_son_pid = whoami; + return EXIT_SUCCESS; + } + + /* Here is the code for the son... */ + { + int sound_num,ch,i; + struct timeval tval = {0L,0L}; + fd_set readfds,dsp; + Mix mix; + int fragsize; + Channel *chan; + + chan = (Channel *)malloc(sizeof(Channel) * S_num_channels); + + for(i=0; i 1050) + printf("No good sample rate\n"); + if(ioctl(S_fd_snddev, AUDIO_SET_SAMPLE_RATE, best_rate)==-1) + perror("Sound driver ioctl: Audio Set Sample Rate"); + + /* AUDIO_OUT_LINE | AUDIO_OUT_INTERNAL | AUDIO_OUT_EXTERNAL */ + if(ioctl(S_fd_snddev, AUDIO_SET_OUTPUT, AUDIO_OUT_EXTERNAL)==-1) + perror("Sound driver ioctl: Audio Set Output"); + + again.cgain[0].transmit_gain = AUDIO_MAX_GAIN; + again.cgain[0].monitor_gain = AUDIO_OFF_GAIN; + again.cgain[1].transmit_gain = AUDIO_MAX_GAIN; + again.cgain[1].monitor_gain = AUDIO_OFF_GAIN; + again.channel_mask = AUDIO_CHANNEL_LEFT | AUDIO_CHANNEL_RIGHT; + if(ioctl(S_fd_snddev, AUDIO_SET_GAINS, &again)==-1) + perror("Sound driver ioctl: Audio Set Gain"); + + /* + alimits.max_transmit_buffer_size = 512; + alimits.max_receive_buffer_size = 512; + if(ioctl(S_fd_snddev, AUDIO_SET_LIMITS, &alimits)==-1) + perror("Sound driver ioctl: Audio Set Limits"); + + if(ioctl(S_fd_snddev, AUDIO_GET_LIMITS, &alimits)==-1) + perror("Sound driver ioctl: Audio Get Limits"); + + fragsize=alimits.max_transmit_buffer_size; + */ + fragsize = 1024; + } +#endif + + /*printf("after: block size: %d \n", fragsize);*/ + + /* init mixer object*/ + Mix_alloc(&mix, fragsize); + + close(S_fd_pipe[1]); /* close end for writing */ + + FD_ZERO(&dsp); + FD_SET(S_fd_snddev, &dsp); + + FD_ZERO(&readfds); + FD_SET(S_fd_pipe[0], &readfds); + + /* printf("soundIt library v"SOUNDIT_VERS" initialized.\n");*/ + + for(;;) { + FD_SET(S_fd_pipe[0], &readfds); + tval.tv_sec=0L; + tval.tv_usec=0L; + select(S_fd_pipe[0]+1, &readfds,NULL,NULL,&tval); + + if(FD_ISSET(S_fd_pipe[0], &readfds)) { + if(read(S_fd_pipe[0], &sound_num, sizeof(int))==0) + break; + + read(S_fd_pipe[0], &ch, sizeof(int)); + + /*printf("chan=%d snd=%d len=%d\n", + ch, sound_num, S_sounds[sound_num].len);*/ + Chan_assign(&(chan[ch]), &(S_sounds[sound_num])); + } + + Chan_mixAll(&mix,chan); + +#if defined(HAVE_LINUX_SOUND) + write(S_fd_snddev, mix.Vclippedbuf, fragsize); +#elif defined(HAVE_SUN_SOUND) + { + int stat; + audio_info_t ainfo; + static unsigned int samplecount=0; + + do { + stat = ioctl(S_fd_snddev, AUDIO_GETINFO, &ainfo); + if(samplecount-ainfo.play.samplesVstart=NULL; + chan->Vcurrent=NULL; + chan->Vlen=0; + chan->Vleft=0; + chan->Vloop=0; +} + +/*==========================================================================*/ +void +Chan_assign(Channel *chan, const Sample *snd) +{ + chan->Vstart = snd->data; + chan->Vcurrent= chan->Vstart; + chan->Vlen = snd->len; + chan->Vleft = snd->len; + chan->Vloop = snd->loop; +} + +/*==========================================================================*/ +int +Chan_copyIn(Channel *chan, Mix *mix) +{ + int i, *p = mix->Vunclipbuf, result, min; + + result = (chan->Vleft>0) ? 1 : 0; + min = (chan->Vleft < mix->Vsize) ? chan->Vleft : mix->Vsize; + + for(i=0; iVcurrent++; + } + chan->Vleft -= i; + + /* fill the remaining (if any) part of the mix buffer with silence */ + while(iVsize) { + *p++ = 128; + i++; + } + return result; +} + +/*==========================================================================*/ +int +Chan_copyIn_loop(Channel *chan, Mix *mix) +{ + int i=0; + int *p = mix->Vunclipbuf; + int left_mix_vsize=mix->Vsize; + + if (chan->Vleft==0) + chan->Vleft=chan->Vlen; + + if(left_mix_vsize > chan->Vleft) { + + /* fill the rest of the sample first */ + for(i=0; iVleft; i++) + *p++ = (int)*chan->Vcurrent++; + + left_mix_vsize -= chan->Vleft; + chan->Vleft = chan->Vlen; + + /* loop the sample by writing it repeatedly */ + while(left_mix_vsize > chan->Vlen) { + chan->Vcurrent=chan->Vstart; + for(i=0; iVleft; i++) + *p++ = (int) *chan->Vcurrent++; + + left_mix_vsize-=chan->Vlen; + } + + /* Return to the start of the Sample */ + chan->Vcurrent=chan->Vstart; + + /* If there is some space left, then fill it up :-) */ + for(i=0;iVcurrent++; + + chan->Vleft=chan->Vlen - left_mix_vsize; + } + else { + + /* fill in all that fits, no looping to be done ! */ + for(i=0; iVsize; i++) + *p++ = (int) *chan->Vcurrent++; + + chan->Vleft -= i; + } + return 1; +} + +/*==========================================================================*/ +int +Chan_mixIn(Channel *chan, Mix *mix) +{ + int i,*p = mix->Vunclipbuf, result, min; + + result = (chan->Vleft>0) ? 1 : 0; + min = (chan->Vleft < mix->Vsize) ? chan->Vleft : mix->Vsize; + + for(i=0; iVcurrent++) - 128; + + chan->Vleft -= i; + return result; +} + +/*========================================================================*/ +/* clip an int to a value between 0 and 255 */ +#ifdef HAVE_16BIT_SOUND +/* +static inline short +clip(int i) +{ + return ((i<0) ? 0 : ( (i>255) ? 255 : i )) * 257 - 32768; +} +*/ +#define clip(i) ((short)((((i)<0) ? 0 : ( ((i)>255) ? 255 : (i) )) * 257 - 128*257)) +#else +static inline unsigned char +clip(int i) +{ + return (i<0) ? 0 : ( (i>255) ? 255 : i ); +} +#endif + +/*==========================================================================*/ +int +Chan_finalMixIn(Channel *chan, Mix *mix) +{ + int i; + int *p = mix->Vunclipbuf, result, min; +#ifdef HAVE_16BIT_SOUND + short *final = mix->Vclippedbuf; +#else + unsigned char *final = mix->Vclippedbuf; +#endif + + result = (chan->Vleft>0) ? 1 : 0; + min = (chan->Vleft < mix->Vsize) ? chan->Vleft : mix->Vsize; + + for(i=0; iVcurrent++) - 128; + *final++ = clip(*p); + p++; + } + chan->Vleft -= i; + + /* copy rest of Vunclipbuf over to Vclippedbuf */ + while (iVsize) { + *final++ = clip(*p); + p++; + i++; + } + + return result; +} + + +/*==========================================================================*/ +void +Mix_alloc(Mix *mix, int size) +{ +#ifdef HAVE_16BIT_SOUND + mix->Vclippedbuf = (short *)calloc( sizeof(short), size); +#else + mix->Vclippedbuf = (unsigned char *)calloc( sizeof(char), size); +#endif + mix->Vunclipbuf = (int *)calloc( sizeof(int), size); + mix->Vsize = size; + + if((mix->Vclippedbuf==NULL) || (mix->Vunclipbuf==NULL)) { + printf("Unable to allocate memory for mixer buffer.\n"); + exit(-1); + } +} + +/*==========================================================================*/ +void +Mix_dealloc(Mix *mix) +{ + if(mix->Vclippedbuf) + free(mix->Vclippedbuf); + if(mix->Vunclipbuf) + free(mix->Vunclipbuf); +} + +/*==========================================================================*/ +/* Mixes together the channels into one sound. + Returns # of channels currently playing *any* sound + Therefore, return 0 means to channels have a sample, therefore no + sound is playing +*/ +int +Chan_mixAll(Mix *mix, Channel *chan) +{ + int result=0, i=0; + + /* Loop in the first channel ? */ + if (chan->Vloop==0) + result = Chan_copyIn(chan, mix); + else + result = Chan_copyIn_loop(chan, mix); + + /* we want to loop for S_num_channels-2 */ + for(i=2; idata = NULL; + sample->len = 0; + sample->loop = loop; + + fp = fopen(file,"r"); + + if(fp==NULL) + return -1; + + /* get length of the file */ + sample->len = lseek(fileno(fp), 0, SEEK_END); + + /* go back to beginning of file */ + lseek(fileno(fp), 0, SEEK_SET); + + /* alloc memory for sample */ + sample->data = (unsigned char *)malloc(sample->len); + + if(sample->data==NULL) { + fclose(fp); + return -2; + } + + fread(sample->data, 1, sample->len, fp); + + fclose(fp); + + return 0; +} diff --git a/soundIt.h b/soundIt.h new file mode 100644 index 0000000..97c8c07 --- /dev/null +++ b/soundIt.h @@ -0,0 +1,91 @@ + +/* SoundIt library 0.04 + + Copyright 1994 Brad Pitzel pitzel@cs.sfu.ca + + Adapted to Solaris/SunOS by Peter Ekberg. + + Feel free to use/distribute/modify as long as proper credits + are included. +*/ + +/* Designed for digital sound effects in interactive apps (games, drum + machines, digital organs, ???) + + Will mix channels of mono 8-bit raw samples, & play back in "real-time". + Each channel can only play one sample at a time, but all + channels can play a different sample simultaneously. + + If you have sox, use the ' -t .ub ' option to make samples + that this library will play properly. +*/ + +#ifndef SOUNDIT_VERS +#define SOUNDIT_VERS "0.04" + +#include +#include + +#ifndef EXIT_FAILURE +#define EXIT_FAILURE 1 +#endif +#ifndef EXIT_SUCCESS +#define EXIT_SUCCESS 0 +#endif + +/* 00002 = 2 fragments */ +/* 00007 = means each fragment is 2^7 or 128 bytes */ +/* See voxware docs (in /usr/src/linux/drivers/sound) for more info */ +#define FRAG_SPEC 0x00020007 + +/*==========================================================================*/ +typedef struct { + unsigned char *data; /* unsigned 8-bit raw samples */ + int len; /* length of sample in bytes */ + int loop; /* loop=0 : play sample once, */ + /* loop=1 : loop sample */ +} Sample; + +void dump_snd_list(void); + +/*==========================================================================*/ +/* given the name of a .raw sound file, load it into the Sample struct */ +/* pointed to by 'sample' */ +int +Snd_loadRawSample(const char *file, Sample *sample, int loop); + +/*==========================================================================*/ +/* init sound device, etc.. */ +/* num_snd = the number of samples in the sample array *sa */ +/* sa = the sample array */ +/* freq = the rate (Hz) to play back the samples */ +/* channels = # of channels to mix */ +/* sound_device = a char string for the sound device, eg, "/dev/dsp" */ +/* returns: 0=success, -1=failure.*/ +int +Snd_init(int num_snd, const Sample *sa, int freq, + int channels, const char *sound_device); + + +/* shutdown sample player, free mem, etc/etc..*/ +int +Snd_restore(void); + + +/* play a sound effect in the given channel 1..n*/ +/* volume = integers from 0 (off) to 100 (full volume)*/ +int +Snd_effect(int nr, int channel); + + +/* stop a channel (1..n) from playing*/ +/*void +Snd_reset(enum snd_channel channel);*/ + + +/* stop all channels from playing*/ +/*void +Snd_reset(void);*/ + + +#endif diff --git a/svmwgrap.c b/svmwgrap.c new file mode 100644 index 0000000..910c119 --- /dev/null +++ b/svmwgrap.c @@ -0,0 +1,799 @@ +#include +#include +#include +#include +#include + + +/*var unfadered:array[0..255] of byte; + unfadeblue:array[0..255] of byte; + unfadegreen:array[0..255] of byte; + fontline:array[0..255] of byte; + charset:array[0..255,0..15] of byte; + charheight:byte; + fontseg,fontoff:word; +*/ + + +typedef struct { + char *font_data; + int width; + int height; + int numchars; +} vmw_font; + + +int vmwCrossBlit(char *dest,char *src,int stride,int ysize) +{ + + int y; + + for (y = 0; y < ysize; y++) { + memcpy (dest, src, stride); + src += stride; + dest += stride; + } + return 0; +} + +int vmwCrossBlit240(char *dest,char *src,int stride,int stride_factor, + int ysize) +{ + + int y; + + for (y = 0; y < ysize; y++) { + memcpy (dest, src, (240*stride_factor)); + src += stride; + dest += stride; + } + return 0; +} + +int vmwArbitraryCrossBlit(char *src,int x1,int y1,int w,int h, + char *dest,int x2,int y2,int stride, + int stride_factor) +{ + int y; + src+=(stride*y1); + dest+=(stride*y2); + + for(y=0;y6\n",header); + exit(3); + } + buffpointer=12; + /* Read X and Y sizes */ + temp1=buffer[buffpointer]; + temp2=buffer[buffpointer+1]; + temp3=buffer[buffpointer+2]; + buffpointer+=3; + if (buffpointer>=errorlev) { + printf("PPRO error... Early end of file.\n"); + exit(3); + } + xsize=(temp2>>4)+(temp1<<4); + ysize=((temp2-((temp2>>4)<<4))<<16)+temp3; + /* being old 6 bytes 2 two int*/ + temp1=buffer[buffpointer]; + temp2=buffer[buffpointer+1]; + temp3=buffer[buffpointer+2]; + buffpointer+=3; + if (buffpointer>=errorlev) { + printf("PPRO error... Early end of file.\n"); + exit(3); + } + numcolors=(temp2>>4)+(temp1<<4); + /*int2=((temp2-((temp2>>4)<<4))*256)+temp3;*/ + picwidth=xsize+1; + picheight=ysize+1; + /*Load Palette*/ + if (numcolors!=256) printf("%d colors is not supported yet.\n",numcolors); + for (i=0;i<256;i++) { + eight_bit_pal[i].r=(buffer[buffpointer]*0x100); + eight_bit_pal[i].g=(buffer[buffpointer+1]*0x100); + eight_bit_pal[i].b=(buffer[buffpointer+2]*0x100); + buffpointer+=3; + if (buffpointer>=errorlev) { + if (errorlev==300) { + errorlev=fread(buffer,1,300,fff); + buffpointer=0; + } + else { + lastread=1; + } + } + } + if(LoadPal) { + if(color_depth!=8) { + for(i=0;i<256;i++) + tb1_pal[i]=ggiMapColor(vis,&eight_bit_pal[i]); + } + else { + for(i=0;i<256;i++) tb1_pal[i]=(ggi_pixel)i; + ggiSetPaletteVec(vis,0,256,eight_bit_pal); + } + } + x=x1; + y=y1; + while ((!lastread)&&(LoadPic)) { + temp1=buffer[buffpointer]; + temp2=buffer[buffpointer+1]; + temp3=buffer[buffpointer+2]; + buffpointer+=3; + if (buffpointer>=errorlev) { + if (errorlev==300) { + errorlev=fread(buffer,1,300,fff); + buffpointer=0; + } + else lastread=1; + } + int1=(temp2>>4)+(temp1<<4); + int2=((temp2-((temp2>>4)<<4))*256)+temp3; + if (int1>2047) { + ggiPutPixel(vis,x,y,tb1_pal[int1-2048]); + x++; + if (x>xsize+x1) { + x=x1; y++; + } + ggiPutPixel(vis,x,y,tb1_pal[int2-2048]); + x++; + if (x>xsize+x1){ + x=x1;y++; + } + } + else { + col=int1; + numacross=int2; + while ((x+numacross)>(xsize+x1)) { + ggiSetGCForeground(vis,tb1_pal[col]); + ggiDrawHLine(vis,x,y,((xsize+x1)-x)); + numacross=numacross-((xsize+1)-x); + x=x1; + y++; + } + if (numacross!=0) { + ggiSetGCForeground(vis,tb1_pal[col]); + ggiDrawHLine(vis,x,y,numacross); + } + x=x+numacross; + } + } + ggiFlush(vis); + if (fff!=NULL) fclose(fff); + return 0; +} + + + +vmw_font *LoadVMWFont(char *namest,int xsize,int ysize,int numchars) +{ + unsigned char buff[16]; + FILE *f; + int i,fonty,numloop; + vmw_font *font; + char *data; + + font=(vmw_font *)malloc(sizeof(vmw_font)); + data=(char *)calloc(numchars*ysize,(sizeof(char))); + + f=fopen(namest,"r"); + if (f==NULL) { + printf("ERROR loading font file %s.\n",namest); + return NULL; + } + numloop=(numchars*ysize); + + font->width=xsize; + font->height=ysize; + font->numchars=numchars; + font->font_data=data; + fonty=0; + while ( (!feof(f))&&(fonty<=numloop)) { + fread(buff,1,16,f); + for(i=0;i<16;i++) font->font_data[fonty+i]=buff[i]; + fonty+=16; + } + fclose(f); + return font; +} + +/*int bit(unsigned char mree,int whichbit) +{ + return mree&(128>>whichbit); +} + */ + +void VMWtextlineover(char *st,int x,int y,int col,int background,int line, + vmw_font *font,ggi_visual_t vis) +{ + int i,xx,len; + len=strlen(st); + for(i=0;ifont_data[(st[i]*font->height)+line])&(128>>xx) ) + ggiPutPixel(vis,(x+(i*8)+xx),y,col); + else + ggiPutPixel(vis,(x+(i*8)+xx),y,background); + } +} + + +void VMWtextline(char *st,int x,int y,int col,int background,int line, + vmw_font *font,ggi_visual_t vis) +{ + int i,len,xx; + len=strlen(st); + for(i=0;ifont_data[(st[i]*16)+line])) + &(128>>xx) ) { + ggiPutPixel(vis,x+(i*8)+xx,y,col); + } +} + +void VMWtextxy(char *st,int x,int y,int col,int background,int overwrite, + vmw_font *font,ggi_visual_t vis) +{ + int lineon,i,xx,len; + + len=strlen(st); + for(lineon=0;lineon<8;lineon++){ + for(i=0;ifont_data[(st[i]*font->height)+lineon])&(128>>xx) ) + ggiPutPixel(vis,(x+(i*8)+xx),y+lineon,col); + else + if(overwrite) ggiPutPixel(vis,(x+(i*8)+xx),y+lineon,background); + } + } + /*VMWtextlineover(st,x,y+lineon,col,background,lineon,font,vis);*/ + /* VMWtextline(st,x,y+lineon,col,background,lineon,font,vis);*/ +} + + +void VMWsmalltextxy(char *st,int x,int y,int col,int background,int overwrite, + vmw_font *font,ggi_visual_t vis) +{ + int lineon,i,xx,len; + + /* This will print out a small 4x5 font located in chars */ + /* 128-255 in a normal VGA font. These are custom made */ + /* fonts they are non-standard */ + + len=strlen(st); + for(lineon=0;lineon<5;lineon++) { + for(i=0;ifont_data[((st[i]+128)*font->height)+lineon])&(128>>xx) ) + ggiPutPixel(vis,(x+(i*5)+xx),y+lineon,col); + else + if(overwrite) ggiPutPixel(vis,(x+(i*5)+xx),y+lineon,background); + } + } +} + +/* +var i,len:word; + +begin + len:=length(St); + for i:=1 to (len div 2)+1 do begin + fontline[(i-1)*2]:=charset[(ord(st[(i*2)]))+128,line]; + fontline[((i-1)*2)+1]:=charset[(ord(st[(i*2)-1]))+128,line]; + end; + asm + push ds + push si + push es + push di + mov ax,[fontseg] + mov ds,ax + mov ax,[fontoff] + mov si,ax + mov dh,[col] + mov dl,[background] + mov ax,[y] {multiplies y value by 320} + shl ax,5 + mov cx,ax + shl ax,1 + shl cx,3 + add ax,cx + add ax,[x] {adds the x-value to get offset} + mov di,ax + mov ax,[where] + mov es,ax + mov bx,[len] +gus1: + xor ax,ax + cmp bx,02 + jnge gus4 + mov cx,10 + lodsb + push bx + mov bl,al + xor bh,bh + lodsb + shl ax,5 + add ax,bx + shl ax,3 + pop bx + jmp gus5 +gus4: + mov cx,5 + lodsw +gus5: + shl ax,1 + push ax + jc gus7 + mov al,dl + jmp gus8 +gus7: + mov al,dh +gus8: + xor ah,ah + stosb + pop ax + loop gus5 + cmp bx,2 + jng gus3 + dec bx + dec bx + jmp gus1 +gus3: + pop di + pop es + pop si + pop ds +end; +end; + +procedure outsmalltextline(st:string;x,y:integer;col,background:byte;line:integer;where:word); +label gus1,gus4,gus6,gus5,gus7,gus8,gus3; +var i,len:word; + +begin + len:=length(St); + for i:=1 to (len div 2)+1 do begin + fontline[(i-1)*2]:=charset[(ord(st[(i*2)]))+128,line]; + fontline[((i-1)*2)+1]:=charset[(ord(st[(i*2)-1]))+128,line]; + end; + asm + push ds + push si + push es + push di + mov ax,[fontseg] + mov ds,ax + mov ax,[fontoff] + mov si,ax + mov dh,[col] + mov bl,[background] + mov ax,[y] {multiplies y value by 320} + shl ax,5 + mov cx,ax + shl ax,1 + shl cx,3 + add ax,cx + add ax,[x] {adds the x-value to get offset} + mov di,ax + mov ax,[where] + mov es,ax + mov bx,[len] + +gus1: + xor ax,ax + cmp bx,02 + jnge gus4 + mov cx,10 + lodsb + push bx + mov bl,al + xor bh,bh + lodsb + shl ax,5 + add ax,bx + shl ax,3 + pop bx + jmp gus5 +gus4: + mov cx,5 + lodsw +gus5: + shl ax,1 + push ax + jc gus7 + inc di + jmp gus8 +gus7: + mov al,dh + xor ah,ah + stosb +gus8: + pop ax + loop gus5 + cmp bx,2 + jng gus3 + dec bx + dec bx + jmp gus1 +gus3: + pop di + pop es + pop si + pop ds +end; +end; + + +procedure outsmalltextxy(st:string;x,y,col,background:integer;where:word;overwrite:boolean); +label l0105; +var l,len,i,xadd,yadd,lineon:integer; + n,k,o,min,max,qwerty:byte; +begin + for lineon:=0 to 4 do + if overwrite then + outsmalltextlineover(st,x,y+lineon,col,background,lineon,where) + else + outsmalltextline(st,x,y+lineon,col,background,lineon,where); + +end; + + + +function sgn(a:real):integer; +begin + if a>0 then sgn:=+1; + if a<0 then sgn:=-1; + if a=0 then sgn:=0; +end; + +procedure line(a,b,c,d,col:integer;where:word); +var u,s,v,d1x,d1y,d2x,d2y,m,n:real; + i:integer; +begin + u:= c - a; + v:= d - b; + d1x:= SGN(u); + d1y:= SGN(v); + d2x:= SGN(u); + d2y:= 0; + m:= ABS(u); + n := ABS(v); + IF NOT (M>N) then + BEGIN + d2x := 0 ; + d2y := SGN(v); + m := ABS(v); + n := ABS(u); + END; + s := INT(m / 2); + FOR i := 0 TO round(m) DO + BEGIN + putpixel(a,b,col,where); + s := s + n; + IF not (s0 then dec(r); + if g>0 then dec(g); + if b>0 then dec(b); + pal(j,r,g,b); + end; + end; +end; + +procedure unfade; +var i,j:integer; + r,g,b:byte; +begin + for i:=0 to 63 do begin + for j:=0 to 255 do begin + getpal(j,r,g,b); + if r +#include +#include +#include +#include +#include +#include + +#include + +#include "svmwgrap.h" +#include "tblib.h" + + /* Exported Global Variables */ +ggi_visual_t vis,vaddr,vaddr2; +vmw_font *tb1_font; +uint white; +ggi_color eight_bit_pal[256]; +ggi_pixel tb1_pal[256]; +int color_depth; +ggi_directbuffer_t dbuf_vis,dbuf_vaddr,dbuf_vaddr2; +ggi_pixellinearbuffer *plb_vis = NULL,*plb_vaddr= NULL,*plb_vaddr2=NULL; +int stride_factor=1; +int sound_enabled=1,sound_possible=1,read_only_mode=0; +char path_to_data[256]; + +struct timeval time_info; +struct timezone dontcare; + + /* Setup the Graphics */ +int setup_graphics(int force_8bpp) +{ + int err; + ggi_mode mode; + int vx,vy,sx,sy; + + ggiInit(); + vis=ggiOpen(NULL); + + if (force_8bpp) + err=ggiSetGraphMode(vis,320,200,320,200,GT_8BIT); + else + err=ggiSetGraphMode(vis,320,200,320,200,GGI_AUTO); + if (err) { + fprintf(stderr,"ERROR! Problem opening 320x200 vis\n\n"); + return 2; + } + + ggiGetMode(vis,&mode); + vx=mode.virt.x; vy=mode.virt.y; + sx=mode.visible.x;sy=mode.visible.y; + switch (mode.graphtype) { + case GT_1BIT: color_depth=1;break; + case GT_4BIT: color_depth=4;break; + case GT_8BIT: color_depth=8;break; + case GT_15BIT: color_depth=15;break; + case GT_16BIT: color_depth=16;break; + case GT_24BIT: color_depth=24;break; + case GT_32BIT: color_depth=32;break; + default: break; + } + printf(" + Opened a %d x %d (%d x %d) mode with %d bpp\n", + sx,sy,vx,vy,color_depth); + + err = ggiDBGetBuffer (vis, &dbuf_vis); + if (err) { + printf("Error! Could not get directbuffer\n"); + return 2; + } + if (!(ggiDBGetLayout (dbuf_vis) == blPixelLinearBuffer)) { + printf("Error! Nonlinear Display Buffer.\n"); + return 2; + } + if (!(plb_vis = ggiDBGetPLB (dbuf_vis)) ) { + printf("Error! Problem getting pixel linear buffer.\n"); + return 2; + } + + vaddr=ggiOpen("display-memory",NULL); + err=ggiSetGraphMode(vaddr,320,200,320,200,mode.graphtype); + if (err) { + printf("ERROR! Problem opening 320x200x%d vaddr\n",color_depth); + return 2; + } + err = ggiDBGetBuffer (vaddr, &dbuf_vaddr); + if (err) { + printf("Error! Could not get directbuffer\n"); + return 2; + } + if (!(ggiDBGetLayout (dbuf_vaddr) == blPixelLinearBuffer)) { + printf("Error! Nonlinear Display Buffer.\n"); + return 2; + } + if (!(plb_vaddr = ggiDBGetPLB (dbuf_vaddr)) ) { + printf("Error! Problem getting pixel linear buffer.\n"); + return 2; + } + + vaddr2=ggiOpen("display-memory",NULL); + err=ggiSetGraphMode(vaddr2,320,400,320,400,mode.graphtype); + if (err){ + printf("ERROR! Problem opening 320x400x%d vaddr2\n",color_depth); + return 2; + } + err = ggiDBGetBuffer (vaddr2, &dbuf_vaddr2); + if (err) { + printf("Error! Could not get directbuffer\n"); + return 2; + } + if (!(ggiDBGetLayout (dbuf_vaddr2) == blPixelLinearBuffer)) { + printf("Error! Nonlinear Display Buffer.\n"); + return 2; + } + if (!(plb_vaddr2 = ggiDBGetPLB (dbuf_vaddr2)) ) { + printf("Error! Problem getting pixel linear buffer.\n"); + return 2; + } + stride_factor=(plb_vis->stride)/320; + printf(" + Using a stride factor of %d\n",stride_factor); + printf(" + GGI Graphics Initialization successful...\n"); + printf(" + Running TB1 in %dbpp Mode...\n",color_depth); + return 0; +} + +int command_line_help(int show_version,char *runas) +{ + if (!show_version) { + printf("Usage: %s [-force8bpp] [-nosound] [-readonly]" + " [-version] [-?]\n\n",runas); + printf(" -force8bpp : force to run in 8bpp mode\n"); + printf(" -nosound : disables sound within game\n"); + printf(" -readonly : don't try to write files to disk\n"); + printf(" -version : print version\n"); + printf(" -? : print this help message\n"); + printf("\n"); + } + return 0; +} + + +int main(int argc,char **argv) +{ + int i,grapherror,reloadpic=0,force_8bpp=0; + int ch,ch2,x,barpos,time_sec; + char *tempst[300]; + FILE *fff; + + printf("\nTom Bombem v%s by Vince Weaver weave@eng.umd.edu\n",TB1_VERSION); + printf(" http://www.glue.umd.edu/~weave/tb1\n\n"); + + /* Parse Command Line Arguments */ + i=1; + while(i *\ + \* No 9-22-94 Back to yes 10-6-94 uh_oh 2-21-95 */ + /* gone for real long time 10-12-95 *\ + \* 11-95 not Amy anymore, but Gus */ + /* 3-96 oh well... gave up on Gus finally *\ + \* 5-11-96 Now Marie... what fun life is */ + + /* Randomize random number generator */ + srandom(time(NULL)); + + /* Load the tom bombem font */ + tb1_font=LoadVMWFont(tb1_data_file("tbfont.tb1",(char *)tempst),8,16,256); + + /* Setup Graphics */ + if (setup_graphics(force_8bpp)==2) { + fprintf(stderr,"ERROR: Couldn't get display set up properly.\n"); + return 2; + } + + /* Do the VMW Software Production Logo */ + for(x=0;x<=40;x++){ + eight_bit_pal[100+x].r=((x+20)*4)*0x100; + eight_bit_pal[100+x].g=0; + eight_bit_pal[100+x].b=0; + + eight_bit_pal[141+x].r=0; + eight_bit_pal[141+x].g=0; + eight_bit_pal[141+x].b=((x+20)*4)*0x100; + + eight_bit_pal[182+x].r=0; + eight_bit_pal[182+x].g=((x+20)*4)*0x100;; + eight_bit_pal[182+x].b=0; + + if (color_depth!=8) { + tb1_pal[100+x]=ggiMapColor(vis,&eight_bit_pal[100+x]); + tb1_pal[141+x]=ggiMapColor(vis,&eight_bit_pal[141+x]); + tb1_pal[182+x]=ggiMapColor(vis,&eight_bit_pal[182+x]); + } + else { + for(i=0;i<256;i++) tb1_pal[i]=(ggi_pixel)i; + } + } + /* Set the white color */ + eight_bit_pal[15].r=255*0x100; + eight_bit_pal[15].g=255*0x100; + eight_bit_pal[15].b=255*0x100; + + /* Finalize Pallette Stuff */ + if (color_depth!=8) { + tb1_pal[15]=ggiMapColor(vis,&eight_bit_pal[15]); + } + else ggiSetPaletteVec(vis,0,256,eight_bit_pal); + + /* Actually draw the stylized VMW */ + for(x=0;x<=40;x++){ + ggiSetGCForeground(vis,tb1_pal[100+x]); + ggiDrawVLine(vis,x+40,45,2*x); + ggiSetGCForeground(vis,tb1_pal[141+x]); + ggiDrawVLine(vis,x+120,45,2*x); + ggiDrawVLine(vis,x+200,45,2*x); + ggiSetGCForeground(vis,tb1_pal[182+x]); + ggiDrawVLine(vis,x+80,125-(2*x),2*x); + ggiDrawVLine(vis,x+160,125-(2*x),2*x); + } + for(x=40;x>0;x--){ + ggiSetGCForeground(vis,tb1_pal[140-x]); + ggiDrawVLine(vis,x+80,45,80-(2*x)); + ggiSetGCForeground(vis,tb1_pal[181-x]); + ggiDrawVLine(vis,x+160,45,80-(2*x)); + ggiDrawVLine(vis,x+240,45,80-(2*x)); + ggiSetGCForeground(vis,tb1_pal[222-x]); + ggiDrawVLine(vis,x+120,45+(2*x),80-(2*x)); + ggiDrawVLine(vis,x+200,45+(2*x),80-(2*x)); + } + + ggiSetGCForeground(vis,tb1_pal[15]); + VMWtextxy("A VMW SOFTWARE PRODUCTION",60,140, + tb1_pal[15],tb1_pal[15],0,tb1_font,vis); + ggiFlush(vis); + pauseawhile(5); + + /* Clear the Screen and get ready for the Menu */ + ggiSetGCForeground(vis,tb1_pal[0]); + ggiFillscreen(vis); + + /* Load the title screen */ + grapherror=GGILoadPicPacked(0,0,vis,1,1, + tb1_data_file("tbomb1.tb1",(char *)tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + grapherror=GGILoadPicPacked(0,0,vaddr2,1,1, + tb1_data_file("tbomb1.tb1",(char *)tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + ggiFlush(vis); + ggiFlush(vaddr2); + pauseawhile(5); + + /* Main Menu Loop */ + while (1) { + if (reloadpic) { + grapherror=GGILoadPicPacked(0,0,vaddr2,1,1, + tb1_data_file("tbomb1.tb1",(char *)tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + ggiFlush(vaddr2); + reloadpic=0; + } + vmwCrossBlit(plb_vis->write,plb_vaddr2->read,plb_vis->stride,200); + ggiFlush(vis); + + barpos=0; + VMWtextxy("F1 HELP",0,190,tb1_pal[9],tb1_pal[7],0,tb1_font,vis); + coolbox(117,61,199,140,1,vis); + ggiFlush(vis); + ch=0; + while(ch!=TB_ENTER){ + if (barpos==0) VMWtextxy("NEW GAME",123,67, + tb1_pal[32],tb1_pal[0],1,tb1_font,vis); + else VMWtextxy("NEW GAME",123,67, + tb1_pal[32],tb1_pal[7],1,tb1_font,vis); + if (barpos==1) VMWtextxy("OPTIONS",123,77, + tb1_pal[32],tb1_pal[0],1,tb1_font,vis); + else VMWtextxy("OPTIONS",123,77, + tb1_pal[32],tb1_pal[7],1,tb1_font,vis); + if (barpos==2) VMWtextxy("ABOUT",123,87, + tb1_pal[32],tb1_pal[0],1,tb1_font,vis); + else VMWtextxy("ABOUT",123,87, + tb1_pal[32],tb1_pal[7],1,tb1_font,vis); + if (barpos==3) VMWtextxy("LOAD GAME",123,97, + tb1_pal[32],tb1_pal[0],1,tb1_font,vis); + else VMWtextxy("LOAD GAME",123,97, + tb1_pal[32],tb1_pal[7],1,tb1_font,vis); + if (barpos==4) VMWtextxy("STORY",123,107, + tb1_pal[32],tb1_pal[0],1,tb1_font,vis); + else VMWtextxy("STORY",123,107, + tb1_pal[32],tb1_pal[7],1,tb1_font,vis); + if (barpos==5) VMWtextxy("CREDITS",123,117, + tb1_pal[32],tb1_pal[0],1,tb1_font,vis); + else VMWtextxy("CREDITS",123,117, + tb1_pal[32],tb1_pal[7],1,tb1_font,vis); + if (barpos==6) VMWtextxy("QUIT",123,127, + tb1_pal[32],tb1_pal[0],1,tb1_font,vis); + else VMWtextxy("QUIT",123,127, + tb1_pal[32],tb1_pal[7],1,tb1_font,vis); + ggiFlush(vis); + + /* If at title screen too long, run credits */ + gettimeofday(&time_info,&dontcare); + time_sec=time_info.tv_sec; + while( ((ch=get_input())==0)) { + usleep(10); + gettimeofday(&time_info,&dontcare); + if (time_info.tv_sec-time_sec>40) { + credits(); + ch=TB_ENTER; + barpos=9; + reloadpic=1; + gettimeofday(&time_info,&dontcare); + time_sec=time_info.tv_sec; + } + } + + /* Change menu position based on key pressed */ + ch2=toupper(ch); + if ((ch==TB_DOWN)||(ch==TB_RIGHT)) barpos++; + if ((ch==TB_UP) || (ch==TB_LEFT)) barpos--; + if (ch==TB_F1) {barpos=10; ch=TB_ENTER;} /*F1*/ + if (ch2=='N') barpos=0; /*N*/ + if (ch2=='O') barpos=1; /*O*/ + if (ch2=='A') barpos=2; /*A*/ + if (ch2=='L') barpos=3; /*L*/ + if (ch2=='S') barpos=4; /*S*/ + if (ch2=='C') barpos=5; /*C*/ + if (ch2=='Q') barpos=6; /*Q*/ + if (ch==27){ /* escape */ + barpos=6; + ch=TB_ENTER; + } + if(barpos==7) barpos=0; + if(barpos<0) barpos=6; + } + /* Run whatever it was that the person pressed */ + switch (barpos) { + case 0: playthegame(0,0,12); reloadpic=1; break; + case 1: options(vis); reloadpic=1; break; + case 2: about(vis); reloadpic=1; break; + case 3: loadgame(); reloadpic=1; break; + case 4: story(); reloadpic=1; break; + case 5: credits(); reloadpic=1; break; + case 6: barpos=quit(vis); break; + case 10: help(vis); break; + } + } +} diff --git a/tblib.c b/tblib.c new file mode 100644 index 0000000..5e9e327 --- /dev/null +++ b/tblib.c @@ -0,0 +1,1301 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "soundIt.h" +#include "svmwgrap.h" +#include "levels.h" + +extern vmw_font *tb1_font; +extern ggi_visual_t vis; +extern ggi_visual_t vaddr; +extern ggi_visual_t vaddr2; +extern ggi_directbuffer_t dbuf_vis; +extern ggi_directbuffer_t dbuf_vaddr; +extern ggi_directbuffer_t dbuf_vaddr2; +extern ggi_pixellinearbuffer *plb_vis; +extern ggi_pixellinearbuffer *plb_vaddr; +extern ggi_pixellinearbuffer *plb_vaddr2; +extern int stride_factor; +extern char path_to_data[256]; +extern int sound_enabled; +extern int sound_possible; +extern int read_only_mode; +extern ggi_color eight_bit_pal[256]; +extern ggi_pixel tb1_pal[256]; +extern int color_depth; + +#define TB_ESC 27 +#define TB_ENTER 1024 +#define TB_F1 1025 +#define TB_F2 1026 +#define TB_UP 1027 +#define TB_DOWN 1028 +#define TB_LEFT 1029 +#define TB_RIGHT 1030 +#define TB_PGUP 1031 +#define TB_PGDOWN 1032 + + + /* Convenience Function */ +int change_shields(int *shields) +{ + int itemp,jtemp; + + eight_bit_pal[254].r=(*shields)*0x1000; + eight_bit_pal[254].g=0; + eight_bit_pal[254].b=0; + + if (color_depth!=8) + tb1_pal[254]=ggiMapColor(vis,&eight_bit_pal[254]); + else { + tb1_pal[254]=254; + ggiSetPaletteVec(vis,254,1,&eight_bit_pal[254]); + } + ggiSetGCForeground(vaddr,tb1_pal[0]); + ggiDrawBox(vaddr,250,71,64,8); + for(itemp=0;itemp<(*shields)*4;itemp+=4) + for(jtemp=71;jtemp<79;jtemp++) { + ggiSetGCForeground(vaddr,tb1_pal[47-(itemp/4)]); + ggiDrawHLine(vaddr,250+itemp,jtemp,4); + } + + return 0; +} + + /* TSIA [well actually FNSIA (function name says it all) */ +int changescore(int score,int *shields) +{ + char scorest[20]; + + sprintf(scorest,"%d",score); + VMWtextxy(scorest,317-(strlen(scorest)*9),11, + tb1_pal[12],tb1_pal[0],1,tb1_font,vaddr); + if ( ((score % 400)==0) && (*shields<16) ) { + if (sound_enabled) Snd_effect(/*SND_ZRRP*/3,3); + (*shields)++; + change_shields(shields); + } + return 0; +} + + /* The collision detection routine. Optimize? */ + /* Detects if x1,y1 is within x2,y2 */ +int collision(x1,y1,xsize,ysize,x2,y2,x2size,y2size) +{ + if (abs((y1+ysize)-(y2+y2size))<(ysize+y2size)){ + if (abs((x1+xsize)-(x2+x2size))<(xsize+x2size)) return 1; + } + return 0; +} + +char *tb1_data_file(char *name, char *store) +{ + sprintf(store,"%s/%s",path_to_data,name); + return store; +} + +int get_input() { + + int evmask; + ggi_event ev; + struct timeval t={0,0}; + + evmask=emKeyPress|emKeyRelease|emPointer; + + while (ggiEventPoll(vis,evmask,&t)) { + do { + ggiEventRead(vis,&ev,evmask); + } while(! ( (1 << ev.any.type) & evmask ) ); + + if (ev.any.type==evKeyPress) { + switch(KTYP(U(ev.key.sym))) { + case KT_LATIN: + case KT_LETTER: + return (KVAL(U(ev.key.sym))); break; + default: switch(U(ev.key.sym)) { + case K_UP: /* CrSr up */ + case K_P8: /* Keypad 8 */ + return TB_UP;break; + case K_DOWN: /* CrSr down */ + case K_P2: /* Keypad 2 */ + return TB_DOWN;break; + case K_RIGHT: /* CrSr right */ + case K_P6: /* CrSr right */ + return TB_RIGHT;break; + case K_LEFT: /* CrSr left */ + case K_P4: /* CrSr left */ + return TB_LEFT;break; + case K_F1: + return TB_F1;break; + case K_F2: + return TB_F2;break; + case K_ENTER: /* enter */ + return TB_ENTER;break; + default: + /*printf("sym=%4x code=%4x\n",ev.key.sym,ev.key.code);*/break; + } + } + } + } + return 0; +} + + +void clear_keyboard_buffer() +{ + while (get_input()!=0) ; +} + +void drawsquare(int x1,int y1,int x2,int y2,int col,ggi_visual_t page) +{ + ggiSetGCForeground(page,tb1_pal[col]); + /*ggiDrawHLine(page,x1,y1,(x2-x1)); + ggiDrawHLine(page,x1,y2,(x2-x1)); + ggiDrawVLine(page,x1,y1,(y2-y1)); + ggiDrawVLine(page,x2,y1,(y2-y1));*/ + ggiDrawLine(page,x1,y1,x1,y2); + ggiDrawLine(page,x2,y1,x2,y2); + ggiDrawLine(page,x1,y1,x2,y1); + ggiDrawLine(page,x1,y2,x2,y2); +} + +void coolbox(int x1,int y1,int x2,int y2,int fill,ggi_visual_t page) +{ + int i; + + for(i=0;i<5;i++) { + /*ggiSetGCForeground(page,31-i); + ggiDrawBox(page,x1+i,y1+i,(x2-x1-i-i),(y2-y1-i-i));*/ + drawsquare(x1+i,y1+i,x2-i,y2-i,31-i,page); + } + if (fill) { + ggiSetGCForeground(page,tb1_pal[7]); + for(i=y1+5;iscores[i]) place++; + place=10-place; + for(i=9;i>place;i--) + scores[i]=scores[i-1]; + for(i=9;i>place;i--) + strcpy(names[i-1],names[i]); + scores[place]=score; + strcpy(hiname,names[place]); + if (!read_only_mode) { + hilist=fopen("hiscore.tb1","w"); + for(i=0;i<9;i++) fprintf(hilist,"%s\n",names[i]); + for(i=0;i<9;i++) fprintf(hilist,"%i\n",scores[i]); + fclose(hilist); + } +} + + + +void help() +{ + coolbox(0,0,319,199,1,vis); + VMWtextxy("HELP",144,10,4,0,0,tb1_font,vis); + VMWtextxy("--------------------------------------",10,20, + tb1_pal[12],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("IN THE GAME:",10,30,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy(" ARROWS MANUEVER",10,40, + tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy(" SPACE BAR FIRES MISSILES",10,50, + tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy(" F2 SAVES GAME",10,60, + tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy(" P=PAUSE S=TOGGLE SOUND ESC=QUIT",10,70, + tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("--------------------------------------",10,80, + tb1_pal[12],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("MISSION: SHOOT THE INANIMATE OBJECTS",10,90, + tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy(" WHY? WATCH THE STORY!",10,100, + tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("--------------------------------------",10,110, + tb1_pal[12],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("THE SPACE BAR SPEEDS UP MOVIE SCENES",10,120, + tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("ESC QUITS THEM",10,130, + tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("--------------------------------------",10,140, + tb1_pal[12],tb1_pal[0],0,tb1_font,vis); + VMWtextxy(" SEE \"README\" FOR MORE HELP/INFO",10,150, + tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("--------------------------------------",10,160, + tb1_pal[12],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("PRESS ANY KEY TO CONTINUE",64,185, + tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + while(get_input()==0) usleep(30); +} + + +void makehole(ggi_visual_t vis,int y) +{ + ggiSetGCForeground(vis,tb1_pal[0]); + ggiDrawBox(vis,249,y,64,9); + ggiSetGCForeground(vis,tb1_pal[24]); + ggiDrawHLine(vis,249,y,65); + ggiDrawVLine(vis,249,y,9); + ggiSetGCForeground(vis,tb1_pal[18]); + ggiDrawHLine(vis,249,y+10,64); + ggiDrawVLine(vis,314,y+1,9); +} + +void setupsidebar(int score,int hiscore,int shields) +{ + int i; + char it[50]; + + ggiSetGCForeground(vaddr2,tb1_pal[19]); + ggiDrawBox(vaddr2,240,0,80,199); + + ggiSetGCForeground(vaddr2,tb1_pal[18]); + ggiDrawVLine(vaddr2,240,0,199); + ggiDrawHLine(vaddr2,240,0,79); + + ggiSetGCForeground(vaddr2,tb1_pal[24]); + ggiDrawVLine(vaddr2,319,0,199); + ggiDrawHLine(vaddr2,241,199,78); + + VMWtextxy("SCORE",241,1,tb1_pal[127],tb1_pal[0],0,tb1_font,vaddr2); + VMWtextxy("SCORE",242,2,tb1_pal[143],tb1_pal[0],0,tb1_font,vaddr2); + makehole(vaddr2,10); + sprintf(it,"%d",score); + VMWtextxy(it,250+(8*(8-strlen(it))),11,tb1_pal[12],tb1_pal[0],1,tb1_font,vaddr2); + + hiscore=showhiscore(0); + VMWtextxy("HI-SCORE",241,21,tb1_pal[127],tb1_pal[0],0,tb1_font,vaddr2); + VMWtextxy("HI-SCORE",242,22,tb1_pal[143],tb1_pal[0],0,tb1_font,vaddr2); + sprintf(it,"%d",hiscore); + makehole(vaddr2,30); + VMWtextxy(it,250+(8*(8-strlen(it))),31,tb1_pal[12],tb1_pal[0],1,tb1_font,vaddr2); + + VMWtextxy("LEVEL",241,41,tb1_pal[127],tb1_pal[0],0,tb1_font,vaddr2); + VMWtextxy("LEVEL",242,42,tb1_pal[143],tb1_pal[0],0,tb1_font,vaddr2); + makehole(vaddr2,50); + VMWtextxy("SHIELDS",241,61,tb1_pal[127],tb1_pal[0],0,tb1_font,vaddr2); + VMWtextxy("SHIELDS",242,62,tb1_pal[143],tb1_pal[0],0,tb1_font,vaddr2); + makehole(vaddr2,70); + for(i=0;i<(4*shields);i++) { + ggiSetGCForeground(vaddr2,tb1_pal[(47-(i/4))]); + ggiDrawVLine(vaddr2,250+i,71,8); + } + VMWtextxy("WEAPONS",241,81,tb1_pal[127],tb1_pal[0],0,tb1_font,vaddr2); + VMWtextxy("WEAPONS",242,82,tb1_pal[143],tb1_pal[0],0,tb1_font,vaddr2); + makehole(vaddr2,90); + + ggiSetGCForeground(vaddr2,tb1_pal[0]); + ggiDrawBox(vaddr2,249,111,65,78); + + ggiSetGCForeground(vaddr2,tb1_pal[24]); + ggiDrawVLine(vaddr2,249,111,78); + ggiDrawHLine(vaddr2,249,111,66); + ggiSetGCForeground(vaddr2,tb1_pal[18]); + ggiDrawVLine(vaddr2,315,111,78); + ggiDrawHLine(vaddr2,249,189,66); + + VMWtextxy(" TB1 ",250,114,tb1_pal[2],tb1_pal[0],0,tb1_font,vaddr2); + VMWtextxy(" TB1 ",251,115,tb1_pal[10],tb1_pal[0],0,tb1_font,vaddr2); + VMWtextxy("F1-HELP ",250,124,tb1_pal[2],tb1_pal[0],0,tb1_font,vaddr2); + VMWtextxy("F1-HELP ",251,125,tb1_pal[10],tb1_pal[0],0,tb1_font,vaddr2); + VMWtextxy("F2-SAVES",250,134,tb1_pal[2],tb1_pal[0],0,tb1_font,vaddr2); + VMWtextxy("F2-SAVES",251,135,tb1_pal[10],tb1_pal[0],0,tb1_font,vaddr2); + VMWtextxy("ESC-QUIT",250,144,tb1_pal[2],tb1_pal[0],0,tb1_font,vaddr2); + VMWtextxy("ESC-QUIT",251,145,tb1_pal[10],tb1_pal[0],0,tb1_font,vaddr2); + VMWtextxy("P-PAUSES",250,154,tb1_pal[2],tb1_pal[0],0,tb1_font,vaddr2); + VMWtextxy("P-PAUSES",251,155,tb1_pal[10],tb1_pal[0],0,tb1_font,vaddr2); + VMWtextxy("S-SOUND ",250,164,tb1_pal[2],tb1_pal[0],0,tb1_font,vaddr2); + VMWtextxy("S-SOUND ",251,165,tb1_pal[10],tb1_pal[0],0,tb1_font,vaddr2); +} + + + + + +void pauseawhile(int howlong) +{ + struct timeval bob; + struct timezone mree; + long begin_s,begin_u; + + clear_keyboard_buffer(); + gettimeofday(&bob,&mree); + begin_s=bob.tv_sec; begin_u=bob.tv_usec; + while(( (bob.tv_sec-begin_s)18) + VMWtextxy("$HOME/.tb1",120,20,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + else + VMWtextxy(tempst,120,20,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("WHERE TB1 STORES SAVED GAMES",20,30,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("DOES NOT EXIST. DO YOU WANT",20,40,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("TO CREATE THIS DIRECTORY?",20,50,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy(" PLEASE ANSWER [Y or N]",20,60,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("NOTE IF YOU ANSWER \"N\" YOU",20,80,tb1_pal[12],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("WILL NOT BE ABLE TO SAVE",20,90,tb1_pal[12],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("GAMES",20,100,tb1_pal[12],tb1_pal[0],0,tb1_font,vis); + ch='M'; + clear_keyboard_buffer(); + while( (ch!='Y') && (ch!='y') && (ch!='N') && (ch!='n')) { + while((ch=get_input())==0) usleep(30); + } + if (toupper(ch)=='Y') + if (!mkdir(tempst,744)) dot_tb1_exists=1; + else { + coolbox(0,0,319,199,1,vis); + VMWtextxy("WARNING! COULD NOT CREATE",30,30,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("DIRECTORY! ABANDONING SAVE!",20,40,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + } + + } + else dot_tb1_exists=1; + } + if (dot_tb1_exists) { + coolbox(0,0,319,199,1,vis); + VMWtextxy("SAVE GAME",110,20,tb1_pal[9],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("NOTE: THIS ONLY SAVES THE GAME",10,40,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("AT THE BEGINNING OF THE LEVEL!",10,50,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("ALREADY EXISTING GAMES",10,70,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + j=0; + for(i=0;i<10;i++) { + sprintf(save_game_name,"%s/sg%i.tb1",tempst,i); + if ((fff=fopen(save_game_name,"r"))!=NULL) { + sprintf(tempst2,"%i",i); + VMWtextxy(tempst2,50+j*20,80,tb1_pal[12],tb1_pal[0],0,tb1_font,vis); + fclose(fff); + j++; + } + } + if (j==0) VMWtextxy("NONE",140,90,tb1_pal[12],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("PRESS NUMBER OF GAME TO SAVE",20,110,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("(0-9) [ESC CANCELS]",60,120,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + ch='M'; + clear_keyboard_buffer(); + while( ((ch<'0') || (ch>='9')) && (ch!=TB_ESC)) { + while((ch=get_input())==0) usleep(30); + } + if (ch==TB_ESC) { + coolbox(0,0,320,200,1,vis); + VMWtextxy("SAVE CANCELED",90,95,tb1_pal[12],tb1_pal[4],0,tb1_font,vis); + } + else { + sprintf(save_game_name,"%s/sg%c.tb1",tempst,ch); + if ((fff=fopen(save_game_name,"w"))!=NULL) { + fprintf(fff,"%i\n%i\n%i\n",level,begin_score,begin_shields); + fclose(fff); + coolbox(0,0,320,200,1,vis); + sprintf(tempst,"GAME %c SAVED",ch); + VMWtextxy(tempst,90,95,tb1_pal[12],tb1_pal[0],0,tb1_font,vis); + } + else { + coolbox(0,0,320,200,1,vis); + VMWtextxy("ERROR SAVING FILE!",70,90,tb1_pal[12],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("GAME NOT SAVED!",80,100,tb1_pal[12],tb1_pal[0],0,tb1_font,vis); + } + } + } + VMWtextxy("PRESS ANY KEY...",80,180,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + while( (ch=get_input())==0) usleep(30); +} + +void shadowrite(char *st,int x5,int y5,int forecol,int backcol, + ggi_visual_t vis) +{ + VMWtextxy(st,x5+1,y5+1,tb1_pal[backcol],0,0,tb1_font,vis); + VMWtextxy(st,x5,y5,tb1_pal[forecol],0,0,tb1_font,vis); +} + +void options() +{ + int opbarpos,argh=0,ch=0; + + ggiSetGCForeground(vis,tb1_pal[8]); + ggiFillscreen(vis); + coolbox(0,0,319,199,0,vis); + VMWtextxy("ESC QUITS",120,175,tb1_pal[32],tb1_pal[0],1,tb1_font,vis); + opbarpos=0; + while(ch!=TB_ESC) { + if (sound_enabled) { + if (opbarpos==0) VMWtextxy("SOUND ON ",30,30,tb1_pal[32], + tb1_pal[7],1,tb1_font,vis); + else VMWtextxy("SOUND ON ",30,30,tb1_pal[32], + tb1_pal[0],1,tb1_font,vis); + } + else { + if (opbarpos==0) VMWtextxy("NO SOUND ",30,30,tb1_pal[32], + tb1_pal[7],1,tb1_font,vis); + else VMWtextxy("NO SOUND ",30,30,tb1_pal[32], + tb1_pal[0],1,tb1_font,vis); + } + if (opbarpos==1) VMWtextxy("VIEW HIGH SCORES",30,40,tb1_pal[32], + tb1_pal[7],1,tb1_font,vis); + else VMWtextxy("VIEW HIGH SCORES",30,40,tb1_pal[32], + tb1_pal[0],1,tb1_font,vis); + + while( (ch=get_input())==0) usleep(30); + + if ((ch==TB_RIGHT) || (ch==TB_DOWN)) opbarpos++; + if ((ch==TB_LEFT) || (ch==TB_UP)) opbarpos--; + if ((ch=='M')||(ch=='m')) opbarpos=0; + if ((ch=='V')||(ch=='v')) opbarpos=1; + if ((ch==TB_ENTER) && (opbarpos==0)) sound_enabled=!sound_enabled; + if ((ch==TB_ENTER) && (opbarpos==1)){ + ch=TB_ESC; + argh=4; + } + if (opbarpos==2) opbarpos=0; + if (opbarpos==-1) opbarpos=1; + } + if (argh==4) showhiscore(1); +} + +void playthegame(int lev,int sc,int sh); + + +void loadgame() +{ + char tempst[300],tempst2[5],file_name[320]; + int i,j; + FILE *fff; + int game_exist[10]={0,0,0,0,0, 0,0,0,0,0}; + char ch; + int level,score,shields; + + coolbox(0,0,320,200,1,vis); + VMWtextxy("LOAD GAME",110,10,tb1_pal[9],tb1_pal[0],0,tb1_font,vis); + + sprintf(tempst,"%s/.tb1",getenv("HOME")); + + j=0; + for(i=0;i<10;i++) { + sprintf(file_name,"%s/sg%i.tb1",tempst,i); + if ((fff=fopen(file_name,"r"))!=NULL) { + sprintf(tempst2,"%i",i); + VMWtextxy(tempst2,50+j*20,50,tb1_pal[12],tb1_pal[0],0,tb1_font,vis); + fclose(fff); + game_exist[i]=1; + j++; + } + } + if (j==0) { + VMWtextxy("NO SAVED GAMES FOUND",60,50,tb1_pal[12],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("PRESS ANY KEY...",80,180,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + while( (ch=get_input())==0) usleep(30); + } + else { + VMWtextxy("LOAD WHICH GAME?",80,30,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("THE FOLLOWING EXIST:",40,40,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("PRESS A NUMBER. (ESC CANCELS)",20,60,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + ch='M'; + clear_keyboard_buffer(); + IchLiebeMree: + while( ((ch<'0') || (ch>'9')) && (ch!=TB_ESC)) { + while((ch=get_input())==0) usleep(30); + } + if (!(game_exist[ch-48])) goto IchLiebeMree; + if(ch==TB_ESC) { + coolbox(0,0,320,200,1,vis); + VMWtextxy("LOAD CANCELED",90,95,tb1_pal[12],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("PRESS ANY KEY...",80,180,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + while( (ch=get_input())==0) usleep(30); + } + else { + sprintf(file_name,"%s/sg%c.tb1",tempst,ch); + if (( fff=fopen(file_name,"r"))!=NULL) { + fscanf(fff,"%d",&level); + fscanf(fff,"%d",&score); + fscanf(fff,"%d",&shields); + playthegame(level,score,shields); + } + } + } +} + +void story() +{ + int error; + int xtemp,ytemp; + int thrustcol; + float thrust; + char tempch; + int alienchar; + int cycles; + char *tempst[300]; +/* +procedure doflames; +begin + + if flames=true then begin + putshape(bigflame1off,vaddr,27,17,213,100); + putshapeover(sflame2off,vaddr,4,4,105,90); + putshapeover(sflame1off,vaddr,4,4,151,71); + putshapeover(sflame2off,vaddr,4,4,218,72); + end + else + begin + putshape(bigflame2off,vaddr,27,17,213,100); + putshapeover(sflame1off,vaddr,4,4,105,90); + putshapeover(sflame2off,vaddr,4,4,151,71); + putshapeover(sflame1off,vaddr,4,4,218,72); + outtextxy(chr(alienchar),10,10,12,0,vaddr,true); + inc(alienchar); + if alienchar>44 then alienchar:=34; + end; + flipd320(vaddr,vga); + vdelay(5); + flames:=not(flames); +end; + +procedure puttruck(xp,yp,frame:integer;where:word); +var xtemp,into,ytemp:integer; + col:byte; +begin + for into:=0 to 7 do begin + if(into+yp>=172) then + if frame=0 then putshapeline(truck1off,where,6,8,xp,yp,into) + else putshapeline(truck2off,where,6,8,xp,yp,into); + end; +end; +*/ + + GGILoadPicPacked(0,0,vaddr,1,1, + tb1_data_file("tbsobj.tb1",(char *)tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + /* + for ytemp:=0 to 18 do + for xtemp:=0 to 26 do begin + ShapeTable1^[((ytemp*27)+xtemp)+bigflame1off]:=getpixel(xtemp,ytemp+2,vaddr); + ShapeTable1^[((ytemp*27)+xtemp)+bigflame2off]:=getpixel(xtemp,ytemp+21,vaddr); + end; + for ytemp:=0 to 18 do + for xtemp:=0 to 15 do begin + ShapeTable1^[((ytemp*16)+xtemp)+explo1off]:=getpixel(127+xtemp,ytemp+100,vaddr); + ShapeTable1^[((ytemp*16)+xtemp)+explo2off]:=getpixel(148+xtemp,ytemp+100,vaddr); + end; + for ytemp:=0 to 6 do + for xtemp:=0 to 15 do + ShapeTable1^[((ytemp*16)+xtemp)+rent1off]:=getpixel(168+xtemp,ytemp+100,vaddr); + + for ytemp:=0 to 4 do + for xtemp:=0 to 3 do begin + ShapeTable1^[((ytemp*4)+xtemp)+sflame1off]:=getpixel(xtemp,ytemp+43,vaddr); + ShapeTable1^[((ytemp*4)+xtemp)+sflame2off]:=getpixel(xtemp,ytemp+47,vaddr); + end; + + for ytemp:=0 to 18 do + for xtemp:=0 to 15 do + ShapeTable1^[((ytemp*16)+xtemp)+bargeoff]:=getpixel(xtemp+65,ytemp+100,vaddr); + + for ytemp:=0 to 8 do + for xtemp:=0 to 5 do begin + ShapeTable1^[((ytemp*6)+xtemp)+truck1off]:=getpixel(xtemp+85,ytemp+100,vaddr); + ShapeTable1^[((ytemp*6)+xtemp)+truck2off]:=getpixel(xtemp+95,ytemp+100,vaddr); + end; +*/ + + /******FIRST MESSAGE********/ + ggiSetGCForeground(vis,tb1_pal[0]); + ggiDrawBox(vis,0,0,320,200); + + VMWtextxy("THE STORY SO FAR...",20,20,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + pauseawhile(7); + + ggiSetGCForeground(vis,tb1_pal[0]); + ggiDrawBox(vis,0,0,320,200); + + GGILoadPicPacked(0,0,vaddr2,1,1, + tb1_data_file("tbcobj.tb1",(char *)tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + vmwArbitraryCrossBlit(plb_vaddr2->read,129,56,49,132, + plb_vis->write,10,10,plb_vis->stride, + stride_factor); + VMWtextxy("YOU ARE TOM BOMBEM, A STRANGE",80,10,tb1_pal[1],tb1_pal[0],0,tb1_font,vis); + VMWtextxy(" BUT EFFICIENT MEMBER OF",80,20,tb1_pal[1],tb1_pal[0],0,tb1_font,vis); + VMWtextxy(" THE LUNAR SPACE FORCE.",80,30,tb1_pal[1],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("YOU NEVER SAY MUCH AND YOU ARE",80,50,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy(" RARELY SEEN OUTSIDE OF",80,60,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy(" YOUR BLUE SPACESUIT.",80,70,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("YOU OFTEN GET YOURSELF IN ",80,90,tb1_pal[2],tb1_pal[0],0,tb1_font,vis); + VMWtextxy(" TROUBLE BY SCRATCHING",80,100,tb1_pal[2],tb1_pal[0],0,tb1_font,vis); + VMWtextxy(" YOUR HEAD AT INAPPROPRIATE",80,110,tb1_pal[2],tb1_pal[0],0,tb1_font,vis); + VMWtextxy(" TIMES.",80,120,tb1_pal[2],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("PRESS ANY KEY....",96,185,tb1_pal[15],tb1_pal[0],0,tb1_font,vis); + pauseawhile(12); + + ggiSetGCForeground(vis,tb1_pal[0]); + ggiDrawBox(vis,0,0,320,200); + + vmwArbitraryCrossBlit(plb_vaddr2->read,129,56,49,132, + plb_vis->write,260,10,plb_vis->stride, + stride_factor); + vmwArbitraryCrossBlit(plb_vaddr2->read,99,104,29,81, + plb_vis->write,287,13,plb_vis->stride, + stride_factor); + + VMWtextxy("IT IS THE YEAR 2028.",10,10,tb1_pal[1],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("YOU HAVE BEEN SUMMONED BY",10,30,tb1_pal[3],tb1_pal[0],0,tb1_font,vis); + VMWtextxy(" LUNAR DICTATOR-IN-CHIEF",10,40,tb1_pal[3],tb1_pal[0],0,tb1_font,vis); + VMWtextxy(" VINCENT WEAVER ABOUT A",10,50,tb1_pal[3],tb1_pal[0],0,tb1_font,vis); + VMWtextxy(" TOP SECRET THREAT TO ",10,60,tb1_pal[3],tb1_pal[0],0,tb1_font,vis); + VMWtextxy(" INTERPLANETARY SECURITY.",10,70,tb1_pal[3],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("YOU ATTEND THE BRIEFING WITH",10,90,tb1_pal[5],tb1_pal[0],0,tb1_font,vis); + VMWtextxy(" YOUR USUAL CONFUSED",10,100,tb1_pal[5],tb1_pal[0],0,tb1_font,vis); + VMWtextxy(" QUIETNESS. YOU STILL DO",10,110,tb1_pal[5],tb1_pal[0],0,tb1_font,vis); + VMWtextxy(" NOT UNDERSTAND YOUR OWN",10,120,tb1_pal[5],tb1_pal[0],0,tb1_font,vis); + VMWtextxy(" SUCCESSFULNESS.",10,130,tb1_pal[5],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("PRESS ANY KEY....",96,185,tb1_pal[15],tb1_pal[0],0,tb1_font,vis); + pauseawhile(10); + + GGILoadPicPacked(0,0,vis,1,1, + tb1_data_file("tbchief.tb1",(char *)tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + + vmwArbitraryCrossBlit(plb_vis->read,115,55,91,59, + plb_vaddr->write,115,55,plb_vis->stride, + stride_factor); + + pauseawhile(6); + VMWtextxy("Ahhh.... Mr. Bombem.... ",1,1,tb1_pal[15],tb1_pal[0],0,tb1_font,vis); + + /* if sbeffects then startsound(sound[1],0,false);*/ + pauseawhile(2); + + /*if sbeffects then startsound(sound[3],0,false);*/ + vmwArbitraryCrossBlit(plb_vaddr2->read,188,14,91,59, + plb_vis->write,115,55,plb_vis->stride, + stride_factor); + + pauseawhile(6); + vmwArbitraryCrossBlit(plb_vaddr->read,115,55,91,59, + plb_vis->write,115,55,plb_vis->stride, + stride_factor); + + VMWtextxy("I'll be brief. ",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + pauseawhile(5); + VMWtextxy("Do you know how this base was founded?",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + pauseawhile(5); + VMWtextxy("No? Well watch the screen. ",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + pauseawhile(5); + vmwArbitraryCrossBlit(plb_vaddr2->read,210,75,85,60, + plb_vis->write,210,136,plb_vis->stride, + stride_factor); + pauseawhile(4); + + /*pal(250,0,0,0);*/ + + + /******BARGE TAKING OFF***********/ + + GGILoadPicPacked(0,0,vaddr2,1,1, + tb1_data_file("tbma1.tb1",(char *)tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + + VMWsmalltextxy("MY WIFE AND I FOUNDED",212,3,tb1_pal[14],tb1_pal[0],0,tb1_font,vaddr2); + VMWsmalltextxy("THIS BASE IN 2008.",212,9,tb1_pal[14],tb1_pal[0],0,tb1_font,vaddr2); + VMWsmalltextxy("THE ONLY WAY TO ",212,16,tb1_pal[13],tb1_pal[0],0,tb1_font,vaddr2); + VMWsmalltextxy("FINANCE IT WAS TO",212,22,tb1_pal[13],tb1_pal[0],0,tb1_font,vaddr2); + VMWsmalltextxy("ENGAGE IN A DUBIOUS",212,28,tb1_pal[13],tb1_pal[0],0,tb1_font,vaddr2); + VMWsmalltextxy("BUSINESS.",212,34,tb1_pal[13],tb1_pal[0],0,tb1_font,vaddr2); + VMWsmalltextxy("WE LAUNCHED EARTH'S",212,41,tb1_pal[12],tb1_pal[0],0,tb1_font,vaddr2); + VMWsmalltextxy("TRASH INTO SPACE",212,47,tb1_pal[12],tb1_pal[0],0,tb1_font,vaddr2); + VMWsmalltextxy("FOR A PROFIT.",212,53,tb1_pal[12],tb1_pal[0],0,tb1_font,vaddr2); + VMWsmalltextxy("HERE IS FOOTAGE FROM",212,60,tb1_pal[11],tb1_pal[0],0,tb1_font,vaddr2); + VMWsmalltextxy("THE LAST LAUNCH EIGHT",212,66,tb1_pal[11],tb1_pal[0],0,tb1_font,vaddr2); + VMWsmalltextxy("YEARS AGO.",212,72,tb1_pal[11],tb1_pal[0],0,tb1_font,vaddr2); + + vmwCrossBlit(plb_vaddr->write,plb_vaddr2->read,plb_vis->stride,200); + +/* putshape(bargeoff,vaddr,16,18,141,157);*/ + + vmwCrossBlit(plb_vis->write,plb_vaddr->read,plb_vis->stride,200); + pauseawhile(7); +/* + + for ytemp:=191 downto 164 do begin + if ytemp>=172 then blockmove(145,ytemp,152,ytemp+10,vaddr2,145,ytemp,vaddr) + else blockmove(145,172,152,182,vaddr2,145,172,vaddr); + puttruck(145,ytemp,ytemp mod 2,vaddr); + pauseawhile(7); + if keypressed then if readkey=#27 then exit; + flipd320(vaddr,vga); + end; + + pauseawhile(20); + flipd320(vaddr2,vaddr); + putshape(bargeoff,vaddr,16,18,141,157); + thrustcol:=0; + ytemp:=157; + thrust:=0; + while ytemp>-25 do begin + thrust:=thrust+0.05; + if thrustcol<63 then inc(thrustcol); + blockmove(141,ytemp,171,ytemp+30,vaddr2,141,ytemp,vaddr); + for i:=1 to 17 do + if ytemp+i>=0 then + putshapeline(bargeoff,vaddr,16,18,141,ytemp,i); + pauseawhile(5); + if keypressed then if readkey=#27 then exit; + pal(250,thrustcol,0,0); + flipd320(vaddr,vga); + ytemp:=ytemp-round(thrust); + end; +*/ + pauseawhile(5); + + + /****SECOND CHIEF*******/ + ggiSetGCForeground(vis,tb1_pal[0]); + ggiDrawBox(vis,0,0,320,200); + GGILoadPicPacked(0,0,vaddr2,1,1, + tb1_data_file("tbcobj.tb1",(char *)tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + GGILoadPicPacked(0,0,vis,1,1, + tb1_data_file("tbchief.tb1",(char *)tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + vmwArbitraryCrossBlit(plb_vaddr2->read,7,104,90,21, + plb_vis->write,6,174,plb_vis->stride, + stride_factor); + + VMWtextxy("You might wonder why this is important.",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + pauseawhile(6); + VMWtextxy("Last week we received a message. ",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + pauseawhile(6); + VMWtextxy("It is of extra-terrestrial origin. ",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + pauseawhile(6); + VMWtextxy("Watch the screen. ",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + + vmwArbitraryCrossBlit(plb_vaddr2->read,210,136,85,59, + plb_vis->write,210,136,plb_vis->stride, + stride_factor); + pauseawhile(4); + + /******ALIEN DELEGATION*****/ + GGILoadPicPacked(0,0,vaddr2,1,1, + tb1_data_file("tbcrash.tb1",(char *)tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + + /*alienchar:=34; + flipd320(vaddr2,vaddr); + flipd320(vaddr,vga); + putshape(bargeoff,vaddr,16,18,97,180); + unfade; + xtemp:=97; + ytemp:=181; + flames:=true; + while ytemp>118 do begin + blockmove(xtemp,ytemp,xtemp+20,ytemp+20,vaddr2,xtemp,ytemp,vaddr); + putshape(bargeoff,vaddr,16,18,xtemp,ytemp); + doflames; + dec(ytemp); + inc(xtemp); + pauseawhile(1); + if keypressed then if readkey=#27 then exit; + end; + blockmove(xtemp,ytemp,xtemp+30,ytemp+30,vaddr2,xtemp,ytemp,vaddr); + pal(0,63,63,63); + putshape(explo1off,vga,16,18,160,118); + pauseawhile(5); + if keypressed then if readkey=#27 then exit; + pal(0,0,0,0); + if sbeffects then startsound(sound[3],0,false); + for xtemp:=0 to 10 do begin + putshapeover(explo2off,vaddr,16,18,160,118); + doflames; + putshapeover(explo1off,vaddr,16,18,160,118); + doflames; + end; + blockmove(159,114,189,144,vaddr2,159,114,vaddr); + putshapeover(rent1off,vaddr,16,6,160,115); + flipd320(vaddr,vga); + cycles:=0; + repeat + doflames; + inc(cycles); + until ((keypressed) or (cycles>60)); + if keypressed then if readkey=#27 then exit; + */ + + /****ALIEN MESSAGE*****/ + GGILoadPicPacked(0,0,vis,1,1, + tb1_data_file("tbgorg.tb1",(char *)tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + VMWtextxy("GREETINGS EARTHLINGS.",0,162,tb1_pal[12],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("I AM GORGONZOLA THE REPULSIVE.",0,171,tb1_pal[12],tb1_pal[0],0,tb1_font,vis); + VMWtextxy("YOU HAVE MADE A BIG MISTAKE.",0,180,tb1_pal[12],tb1_pal[0],0,tb1_font,vis); + pauseawhile(7); + VMWtextxy("YOUR SHIP FULL OF REFUSE HAS",0,162,tb1_pal[12],tb1_pal[0],1,tb1_font,vis); + VMWtextxy("DAMAGED OUR OFFICIAL PEACE ",0,171,tb1_pal[12],tb1_pal[0],1,tb1_font,vis); + VMWtextxy("ENVOY. IT WAS ON ITS WAY TO ",0,180,tb1_pal[12],tb1_pal[0],1,tb1_font,vis); + VMWtextxy("YOUR PLANET. ",0,189,tb1_pal[12],tb1_pal[0],1,tb1_font,vis); + pauseawhile(7); + VMWtextxy("IN AN IRONIC FORM OF RETALLIATION",0,162,tb1_pal[12],tb1_pal[0],1,tb1_font,vis); + VMWtextxy("WE HAVE MADE YOUR TRASH EVIL AND",0,171,tb1_pal[12],tb1_pal[0],1,tb1_font,vis); + VMWtextxy("TURNED IT AGAINST YOU. ",0,180,tb1_pal[12],tb1_pal[0],1,tb1_font,vis); + VMWtextxy(" DIE EARTH SCUM! ",0,189,tb1_pal[12],tb1_pal[0],1,tb1_font,vis); + pauseawhile(7); + + /****** THIRD CHIEF *******/ + GGILoadPicPacked(0,0,vaddr2,1,1, + tb1_data_file("tbcobj.tb1",(char *)tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + GGILoadPicPacked(0,0,vis,1,1, + tb1_data_file("tbchief.tb1",(char *)tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + vmwArbitraryCrossBlit(plb_vaddr2->read,7,127,90,21, + plb_vis->write,6,174,plb_vis->stride, + stride_factor); + + VMWtextxy("Tom, our radar detects approaching ",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + pauseawhile(6); + VMWtextxy("objects. They are inside the ",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + pauseawhile(6); + VMWtextxy("orbit of Jupiter. ",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + pauseawhile(6); + VMWtextxy("You are our only hope! ",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + pauseawhile(6); + VMWtextxy("Will you fly our only spaceship ",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + pauseawhile(6); + VMWtextxy("and save the human race? ",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + pauseawhile(6); + vmwArbitraryCrossBlit(plb_vaddr2->read,5,16,39,82, + plb_vis->write,146,59,plb_vis->stride, + stride_factor); + pauseawhile(1); + vmwArbitraryCrossBlit(plb_vaddr2->read,46,16,39,82, + plb_vis->write,146,59,plb_vis->stride, + stride_factor); + pauseawhile(1); + vmwArbitraryCrossBlit(plb_vaddr2->read,87,16,39,82, + plb_vis->write,146,59,plb_vis->stride, + stride_factor); + VMWtextxy("Scratch. Scratch. ",1,1,tb1_pal[9],tb1_pal[0],1,tb1_font,vis); + pauseawhile(5); + VMWtextxy("I knew you'd do it. Good Luck! ",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + pauseawhile(6); + VMWtextxy(" ",1,1,tb1_pal[9],tb1_pal[0],1,tb1_font,vis); + pauseawhile(10); +} + +void credits() +{ + int i,keypressed=0; + char *tempst[300]; + + ggiSetGCForeground(vaddr2,tb1_pal[0]); + ggiDrawBox(vaddr2,0,0,320,400); + + VMWtextxy(" TOM BOMBEM",0,210,tb1_pal[4],tb1_pal[0], + 1,tb1_font,vaddr2); + VMWtextxy(" INVASION OF THE INANIMATE OBJECTS",0,220,tb1_pal[4],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" PROGRAMMING",0,240,tb1_pal[9],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" VINCENT M WEAVER",0,260,tb1_pal[9],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" GRAPHICS",0,290,tb1_pal[10],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" VINCENT M WEAVER",0,310,tb1_pal[10],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" SOUND EFFECTS",0,340,tb1_pal[11],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" VINCENT M WEAVER",0,360,tb1_pal[11],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" GRAPHICS INSPIRATION",0,390,tb1_pal[12],tb1_pal[0],1,tb1_font,vaddr2); + + for(i=0;i<200;i++){ + vmwArbitraryCrossBlit(plb_vaddr2->read,0,i,320,200, + plb_vis->write,0,0, + plb_vis->stride,stride_factor); + usleep(30000); + if (get_input()!=0) { + keypressed=1; break; + } + } + vmwArbitraryCrossBlit(plb_vaddr2->read,0,200,320,200, + plb_vaddr2->write,0,0, + plb_vaddr2->stride,stride_factor); + + ggiSetGCForeground(vaddr2,tb1_pal[0]); + ggiDrawBox(vaddr2,0,200,320,400); + + VMWtextxy(" JEFF WARWICK",0,210,tb1_pal[12],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" GENERAL HELP",0,240,tb1_pal[13],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" JOHN CLEMENS",0,260,tb1_pal[13],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" JASON GRIMM",0,280,tb1_pal[13],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" PCGPE AUTHORS, esp",0,310,tb1_pal[14],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" GRANT SMITH",0,330,tb1_pal[14],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" DOS SOUND BLASTER CODE",0,360,tb1_pal[15],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" ETHAN BRODSKY",0,380,tb1_pal[15],tb1_pal[0],1,tb1_font,vaddr2); + + if (!keypressed) for(i=0;i<200;i++){ + vmwArbitraryCrossBlit(plb_vaddr2->read,0,i,320,200, + plb_vis->write,0,0, + plb_vis->stride,stride_factor); + usleep(30000); + if (get_input()!=0) { + keypressed=1; break; + } + } + + vmwArbitraryCrossBlit(plb_vaddr2->read,0,200,320,200, + plb_vaddr2->write,0,0, + plb_vaddr2->stride,stride_factor); + + ggiSetGCForeground(vaddr2,tb1_pal[0]); + ggiDrawBox(vaddr2,0,200,320,400); + + VMWtextxy(" UNIX SOUNDBLASTER CODE",0,210,tb1_pal[12],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" BRAD PITZEL",0,230,tb1_pal[12],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" PETER EKBERG",0,250,tb1_pal[12],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" THANKS TO ALL THE DEVELOPERS",0,280,tb1_pal[13],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" OF LINUX, ESPECIALLY",0,300,tb1_pal[13],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" LINUS TORVALDS",0,320,tb1_pal[13],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" ALSO SPECIAL THANKS TO",0,350,tb1_pal[14],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" THE GGI DEVELOPMENT TEAM",0,370,tb1_pal[14],tb1_pal[0],1,tb1_font,vaddr2); + + if (!keypressed) for(i=0;i<200;i++){ + vmwArbitraryCrossBlit(plb_vaddr2->read,0,i,320,200, + plb_vis->write,0,0, + plb_vis->stride,stride_factor); + usleep(30000); + if (get_input()!=0) { + keypressed=1; break; + } + } + + vmwArbitraryCrossBlit(plb_vaddr2->read,0,200,320,200, + plb_vaddr2->write,0,0, + plb_vaddr2->stride,stride_factor); + + ggiSetGCForeground(vaddr2,tb1_pal[0]); + ggiDrawBox(vaddr2,0,200,320,400); + + VMWtextxy(" INSPIRATION",0,210,tb1_pal[9],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" DOUGLAS ADAMS",0,230,tb1_pal[9],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" CLIFF STOLL",0,250,tb1_pal[9],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" ARTHUR C CLARKE",0,270,tb1_pal[9],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" ISAAC ASIMOV",0,290,tb1_pal[9],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" GORDON KORMAN",0,310,tb1_pal[9],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" THANKS TO ALL THE AGENTS",0,340,tb1_pal[10],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" B,D,JL,L,N,P,S,W,PM,E,G,TK",0,360,tb1_pal[10],tb1_pal[0],1,tb1_font,vaddr2); + VMWtextxy(" AND ESPECIALLY MP",0,380,tb1_pal[10],tb1_pal[0],1,tb1_font,vaddr2); + + if (!keypressed) for(i=0;i<200;i++){ + vmwArbitraryCrossBlit(plb_vaddr2->read,0,i,320,200, + plb_vis->write,0,0, + plb_vis->stride,stride_factor); + usleep(30000); + if (get_input()!=0) { + keypressed=1; break; + } + } + vmwArbitraryCrossBlit(plb_vaddr2->read,0,200,320,200, + plb_vaddr2->write,0,0, + plb_vaddr2->stride,stride_factor); + + GGILoadPicPacked(0,200,vaddr2,1,1, + tb1_data_file("tbomb1.tb1",(char *)tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + + if (keypressed) { + ggiSetGCForeground(vaddr2,tb1_pal[0]); + ggiDrawBox(vaddr2,0,0,320,200); + } + + for(i=0;i<200;i++){ + vmwArbitraryCrossBlit(plb_vaddr2->read,0,i,320,200, + plb_vis->write,0,0, + plb_vis->stride,stride_factor); + usleep(30000); + if (get_input()!=0) { + break; + } + } + vmwArbitraryCrossBlit(plb_vaddr2->read,0,200,320,200, + plb_vaddr2->write,0,0, + plb_vaddr2->stride,stride_factor); +} + +void about() +{ + int pagenum=1,firstime=0,oldpagenum=0,numpages=4,ch=0; + char tempst[300]; + + + ggiSetGCForeground(vaddr,tb1_pal[0]); + ggiFillscreen(vaddr); + + GGILoadPicPacked(0,0,vaddr,1,1, + tb1_data_file("register.tb1",(char *)&tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + GGILoadPicPacked(0,0,vis,1,0, + tb1_data_file("register.tb1",(char *)&tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + ggiSetGCForeground(vaddr2,tb1_pal[0]); + ggiFillscreen(vaddr2); + + coolbox(0,0,319,199,0,vaddr); + coolbox(0,0,319,199,1,vaddr2); + while((ch!=TB_ESC)&&(ch!='q')){ + while(( (ch=get_input())==0) && (firstime)); + if(!firstime) firstime=1; + if ((ch==' ') || (ch==TB_ENTER)) pagenum++; + if ((ch==TB_RIGHT) || (ch==TB_DOWN) || (ch==TB_PGDOWN)) pagenum++; + if ((ch==TB_LEFT) || (ch==TB_UP) || (ch==TB_PGUP)) pagenum--; + if (pagenum>4) pagenum=1; + if (pagenum<1) pagenum=4; + if (oldpagenum!=pagenum){ + if (pagenum==1) { + /*ggiCrossBlit(vaddr,0,0,320,200,vis,0,0,320,200);*/ + vmwCrossBlit(plb_vis->write,plb_vaddr->read,plb_vis->stride,200); + shadowrite(" INFORMATION",10,10,9,1,vis); + shadowrite("I STARTED THIS GAME IN LATE",70,30,9,1,vis); + shadowrite(" 1994, WHEN I WAS 16.",70,40,9,1,vis); + shadowrite("I WROTE THIS GAME ENTIRELY IN",75,50,9,1,vis); + shadowrite(" MY FREE TIME.",74,60,9,1,vis); + shadowrite(" ^(AUTHOR 1N 1995)",10,70,10,2,vis); + shadowrite("ORIGINALLY THIS GAME WAS CODED IN",10,90,12,4,vis); + shadowrite(" TURBO PASCAL AND IN-LINE ASSEMBLY",10,100,12,4,vis); + shadowrite(" OPTIMIZED TO RUN ON A 386. NOW I",10,110,12,4,vis); + shadowrite(" HAVE PORTED IT TO LINUX AND GGI.",10,120,12,4,vis); + shadowrite(" IN THAT SPIRIT I HAVE NOW GPL'ED",10,130,12,4,vis); + shadowrite(" THE CODE.",10,140,12,4,vis); + } else vmwCrossBlit(plb_vis->write,plb_vaddr2->read,plb_vis->stride,200); + /*ggiCrossBlit(vaddr2,0,0,320,200,vis,0,0,320,200);*/ + if (pagenum==2){ + shadowrite("MY NAME IS VINCE WEAVER",10,10,10,2,vis); + shadowrite(" VISIT MY TALKER",10,20,10,2,vis); + shadowrite(" DERANGED.STUDENT.UMD.EDU 7000",10,30,10,2,vis); + shadowrite(" UP WHENEVER SCHOOL IS IN SESSION",10,40,10,2,vis); + shadowrite("UNTIL MAY OF 2000 I WILL BE",10,60,13,5,vis); + shadowrite(" ATTENDING COLLEGE, AT THE UNIVERSITY",10,70,13,5,vis); + shadowrite(" OF MARYLAND, COLLEGE PARK.",10,80,13,5,vis); + shadowrite("GET THE NEWEST VERSION OF TB1 AT",10,100,11,3,vis); + shadowrite(" THE OFFICIAL TB1 WEB SITE:",10,110,11,3,vis); + shadowrite(" http://www.glue.umd.edu/~weave/tb1/",10,120,11,3,vis); + shadowrite("I CAN BE CONTACTED VIA E-MAIL AT:",10,140,12,4,vis); + shadowrite(" WEAVE@ENG.UMD.EDU",10,150,9,1,vis); + shadowrite("FEEL FREE TO SEND COMMENTS.",10,160,12,4,vis); + } + if (pagenum==3){ + shadowrite("OTHER VMW SOFTWARE PRODUCTIONS:",10,10,15,7,vis); + shadowrite(" PAINTPRO:",10,30,13,5,vis); + shadowrite(" LOAD AND SAVE GRAPHICS PICTURES",10,40,13,5,vis); + shadowrite(" LINUX_LOGO",10,50,11,3,vis); + shadowrite(" A USERLAND ANSI LOGIN DISPLAY",10,60,11,3,vis); + shadowrite(" SPACEWAR III:",10,70,9,1,vis); + shadowrite(" NEVER COMPLETED GAME",10,80,9,1,vis); + shadowrite(" AITAS: (ADVENTURES IN TIME AND SPACE)",10,90,12,4,vis); + shadowrite(" A GAME I'VE BEEN WANTING TO WRITE",10,100,12,4,vis); + shadowrite(" FOR 5 YEARS. [INCOMPLETE]",10,110,12,4,vis); + shadowrite(" FONT_PRINT",10,120,9,1,vis); + shadowrite(" PRINT VGA FONTS IN DOS AND LINUX",10,130,9,1,vis); + shadowrite(" SEABATTLE:",10,140,13,5,vis); + shadowrite(" A BATTLESHIP CLONE CODED IN C",10,150,13,5,vis); + } + if (pagenum==4){ + shadowrite("DISCLAIMER:",10,10,12,14,vis); + shadowrite("* MY PROGRAMS SHOULD NOT DAMAGE YOUR *",8,30,12,4,vis); + shadowrite("* COMPUTER IN ANY WAY. PLEASE DON'T *",8,40,12,4,vis); + shadowrite("* USE MY SOFTWARE IN CRITICAL *",8,50,12,4,vis); + shadowrite("* APPLICATIONS LIKE LIFE-SUPPORT *",8,60,12,4,vis); + shadowrite("* EQUIPMENT, DEFLECTOR SHIELDS, OR *",8,70,12,4,vis); + shadowrite("* AUTOMOBILE ENGINES. *",8,80,12,4,vis); + shadowrite("* LINUX FOREVER! THE OS FOR EVERYONE *",8,90,12,4,vis); + shadowrite("% WARRANTY ESPECIALLY VOID IF USED %",8,110,11,3,vis); + shadowrite("% ON ANY MICROSOFT(tm) OS (YUCK) %",8,120,11,3,vis); + } + sprintf(tempst,"Page %d of %d: ESC QUITS",pagenum,numpages); + shadowrite(tempst,50,180,15,7,vis); + + ggiFlush(vis); + oldpagenum=pagenum; + } + } + GGILoadPicPacked(0,0,vis,1,0, + tb1_data_file("tbgorg.tb1",(char *)&tempst), + (ggi_color *)&eight_bit_pal, + (ggi_pixel *)&tb1_pal,color_depth); + +} + + +void playthegame(int lev,int sc,int sh) +{ + int shields,score,level; + + level=lev; + score=sc; + shields=sh; + + ggiSetGCForeground(vaddr2,tb1_pal[0]); + ggiDrawBox(vis,0,0,320,200); + + if (level==0) { + littleopener(); + shields=12; + score=0; + level++; + } + + if (level==1) { + levelone(&level,&shields,&score); + if(level==2) littleopener2(); + } + if (level==2) { + leveltwoengine(&level,&shields,&score); + } + if (level==3) { + /*littleopener3(); + levelthree();*/ + } + if (level==4) { + leveltwoengine(&level,&shields,&score); + } + coolbox(70,85,170,110,1,vis); + VMWtextxy("GAME OVER",84,95,tb1_pal[4],tb1_pal[7],0,tb1_font,vis); + clear_keyboard_buffer(); + pauseawhile(20); + + + + /* hiscore:=showhiscore(false,false); + if score>lowscore then begin + coolbox(10,75,310,125,true,vga); + outtextxy('NEW HIGH SCORE!',90,80,12,7,vga,false); + outtextxy('ENTER YOUR NAME (10 Chars)',30,90,0,7,vga,false); + hiname:=grinput(110,110,10,11,7); + hiscore:=showhiscore(false,true); + end; + hiscore:=showhiscore(true,false); + fade; + cls(0,vga); +*/ +} + diff --git a/tblib.h b/tblib.h new file mode 100644 index 0000000..bbba957 --- /dev/null +++ b/tblib.h @@ -0,0 +1,34 @@ +#define TB_ESC 27 +#define TB_ENTER 1024 +#define TB_F1 1025 +#define TB_F2 1026 +#define TB_UP 1027 +#define TB_DOWN 1028 +#define TB_LEFT 1029 +#define TB_RIGHT 1030 +#define TB_PGUP 1031 +#define TB_PGDOWN 1032 + +int change_shields(int *shields); +int changescore(int score,int *shields); +int collision(int x1,int y1,int xsize,int ysize,int x2,int y2,int x2size,int y2size); +char *tb1_data_file(char *name,char *store); +int get_input(); +void coolbox(int x1,int y1,int x2,int y2,int fill,ggi_visual_t page); +int close_graphics(); +int quit(); +void ReadConfigFile(int CDROMmode); +int showhiscore(int showchart); +void clear_keyboard_buffer(); +void write_hs_list(int score,char *hiname); +void help(); +void setupsidebar(int score,int hiscore,int shields); +void shadowrite(char *st,int x,int y,int forecol,int backcol,ggi_visual_t vis); +void pauseawhile(int howlong); +void options(); +void savegame(int level,int begin_score,int begin_shields); +void loadgame(); +void story(); +void credits(); +void about(); +void playthegame(int level,int sc,int sh);