From 6314d373e491cc2d709eae14358a381505702f2f Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Mon, 4 Sep 2000 23:57:00 -0400 Subject: [PATCH] SDL Conversion, 2.9.1 --- BUGS | 6 - CHANGES | 13 + COMPILING | 29 - Makefile | 72 +- README | 333 +-- TODO | 4 + data/tb_ahh.wav | Bin 0 -> 38735 bytes data/tb_bonk.wav | Bin 0 -> 9740 bytes data/tb_cc.wav | Bin 0 -> 10611 bytes data/tb_click.wav | Bin 0 -> 4357 bytes data/tb_kapow.wav | Bin 0 -> 13059 bytes data/tb_ow.wav | Bin 0 -> 13275 bytes data/{tbscream.raw => tb_scream.wav} | Bin 17976 -> 18020 bytes data/tb_zrrp.wav | Bin 0 -> 4317 bytes data/tbahh.raw | 1 - data/tbbonk.raw | 1 - data/tbcc.raw | 1 - data/tbclick.raw | Bin 4313 -> 0 bytes data/tbkapow.raw | 1 - data/tbow.raw | 1 - data/tbzrrp.raw | Bin 4273 -> 0 bytes data/vmwfan.mod | Bin 0 -> 27471 bytes data/weave1.mod | Bin 0 -> 17723 bytes gtblib.c | 191 -- gtblib.h | 19 - hiscore.tb1 | 20 - legacy_pascal/README | 3 + legacy_pascal/graph32.asm | 114 + legacy_pascal/lev2file.pas | 25 + legacy_pascal/nvmwtest.pas | 22 + legacy_pascal/tb1sb.pas | 949 ++++++ legacy_pascal/tb_really_old.pas | 614 ++++ legacy_pascal/tbetter.pas | 22 + legacy_pascal/tbside.pas | 61 + level1.c | 704 ----- level2.c | 609 ---- level_1.c | 680 +++++ levels.h | 2 +- procs.c | 4142 -------------------------- sdl_svmwgraph.c | 662 ++++ sdl_svmwgraph.h | 68 + sound.c | 102 + sound.h | 28 + soundIt.c | 713 ----- soundIt.h | 91 - svmwgrap.c | 799 ----- svmwgrap.h | 46 - tb1-2.9.0.lsm | 16 - tb1.c | 451 ++- tb1_state.h | 13 + tb_keypress.h | 11 + tblib.c | 1257 ++++---- tblib.h | 20 +- tbomb1.tb1 | Bin 0 -> 28650 bytes vmw_sprite.c | 52 + vmw_sprite.h | 10 + 56 files changed, 4285 insertions(+), 8693 deletions(-) delete mode 100644 BUGS delete mode 100644 COMPILING create mode 100644 data/tb_ahh.wav create mode 100644 data/tb_bonk.wav create mode 100644 data/tb_cc.wav create mode 100644 data/tb_click.wav create mode 100644 data/tb_kapow.wav create mode 100644 data/tb_ow.wav rename data/{tbscream.raw => tb_scream.wav} (93%) create mode 100644 data/tb_zrrp.wav delete mode 100644 data/tbahh.raw delete mode 100644 data/tbbonk.raw delete mode 100644 data/tbcc.raw delete mode 100644 data/tbclick.raw delete mode 100644 data/tbkapow.raw delete mode 100644 data/tbow.raw delete mode 100644 data/tbzrrp.raw create mode 100644 data/vmwfan.mod create mode 100644 data/weave1.mod delete mode 100644 gtblib.c delete mode 100644 gtblib.h delete mode 100644 hiscore.tb1 create mode 100644 legacy_pascal/graph32.asm create mode 100644 legacy_pascal/lev2file.pas create mode 100644 legacy_pascal/nvmwtest.pas create mode 100644 legacy_pascal/tb1sb.pas create mode 100644 legacy_pascal/tb_really_old.pas create mode 100644 legacy_pascal/tbetter.pas create mode 100644 legacy_pascal/tbside.pas delete mode 100644 level1.c delete mode 100644 level2.c create mode 100644 level_1.c delete mode 100644 procs.c create mode 100644 sdl_svmwgraph.c create mode 100644 sdl_svmwgraph.h create mode 100644 sound.c create mode 100644 sound.h delete mode 100644 soundIt.c delete mode 100644 soundIt.h delete mode 100644 svmwgrap.c delete mode 100644 svmwgrap.h delete mode 100644 tb1-2.9.0.lsm create mode 100644 tb1_state.h create mode 100644 tb_keypress.h create mode 100644 tbomb1.tb1 create mode 100644 vmw_sprite.c create mode 100644 vmw_sprite.h diff --git a/BUGS b/BUGS deleted file mode 100644 index 8ce3322..0000000 --- a/BUGS +++ /dev/null @@ -1,6 +0,0 @@ -Known Bugs: -% sound sounds wrong on linux > 2.1.95 or so -% 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 index c79af10..2bb8a38 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,10 @@ +4 September 2000 ++ Have about 90% of the game running now on SDL. What a fun + way to spend labor day weekend. + +24 June 2000 ++ Started converting to the SDL lib. Got the title screen up + 7 March 1998 * Added Level 2, mostly working @@ -42,3 +49,9 @@ * 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. + +1994-1996 + Wrote Tom Bombem in pascal and inline assembly, using the + "Flying Toaster" demo from PCGPE as a starting point. + Used Ethan Brodsky's sound libs, in addition to my own + "Paintpro" graphics program/loader. diff --git a/COMPILING b/COMPILING deleted file mode 100644 index cd55aba..0000000 --- a/COMPILING +++ /dev/null @@ -1,29 +0,0 @@ -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-980403.tar.gz - * save it - * uncompress it "tar -xzvf ggi-980226.tar.gz" - * "cd ggi" "cd lib" "cd libggi" "make" - * Select the "TARGETS" option on the menu - * this brings up a menu. be sure to choose "xserv","xlib", "svga","multi" - and "mem" you can choose others if you wish, but these are the ones I use. - * 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 index a75cd75..c959bf2 100644 --- a/Makefile +++ b/Makefile @@ -1,54 +1,30 @@ -############################################################## -# Makefile for Tom Bombem -- 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 +INCLUDE= -Wall -I/usr/local/include/SDL -I/usr/local/include +LIBS= -lSDL -lSDL_mixer -L/usr/X11R6/lib -lX11 -lpthread -###################################################################### -# THERE IS NO NEED TO EDIT ANYTHING BELOW THIS LINE # -###################################################################### +all: tb1 -all: tb1 +tb1: tb1.o sdl_svmwgraph.o vmw_sprite.o tblib.o level_1.o sound.o + gcc -o tb1 tb1.o sdl_svmwgraph.o vmw_sprite.o tblib.o level_1.o sound.o $(LIBS) + +tb1.o: tb1.c + gcc -c tb1.c $(INCLUDE) + +tblib.o: tblib.c + gcc -c tblib.c $(INCLUDE) + +sdl_svmwgraph.o: sdl_svmwgraph.c + gcc -c sdl_svmwgraph.c $(INCLUDE) + +vmw_sprite.o: vmw_sprite.c + gcc -c vmw_sprite.c $(INCLUDE) + +level_1.o: level_1.c + gcc -c level_1.c $(INCLUDE) + +sound.o: sound.c + gcc -c sound.c $(INCLUDE) clean: - rm -f *.o - rm -f tb1 - rm -f *~ - -tb1: tb1.o svmwgrap.o gtblib.o tblib.o level1.o level2.o soundIt.o - $(CC) $(C_OPTS) -o tb1 tb1.o svmwgrap.o gtblib.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 - -gtblib.o: gtblib.c - $(CC) $(C_OPTS) -c gtblib.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 + rm tb1 *.o *~ diff --git a/README b/README index 8cae589..d02ad24 100644 --- a/README +++ b/README @@ -1,319 +1,14 @@ -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 - - - - - - - - - - - - - +For now, just compiling info. + +You need the SDL game development library, 1.1.3 or newer: + http://www.libsdl.org/download-1.1.html + +You also need the "SDL_mixer library" from + http://www.libsdl.org/projects/SDL_mixer/index.html + +To compile SDL_Mixer you need the smpeg library: + http://www.lokigames.com/development/smpeg.php3 + +Then a "make" should compile it. + + diff --git a/TODO b/TODO index 5b067dc..faa8505 100644 --- a/TODO +++ b/TODO @@ -2,3 +2,7 @@ Finish the game [or at least get it on-par with the dos version] Requires: Levels2-4 Highscore list + Save Games + Implement Shield Color + Scrolling Credits + Finish Story diff --git a/data/tb_ahh.wav b/data/tb_ahh.wav new file mode 100644 index 0000000000000000000000000000000000000000..a61f08b6c4c96d408cf522a24d34fc66b0b1971b GIT binary patch literal 38735 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 Y(Tq)B^S37c?p&*h3wGg~qcr{h00n7*Q~&?~ literal 0 HcmV?d00001 diff --git a/data/tb_bonk.wav b/data/tb_bonk.wav new file mode 100644 index 0000000000000000000000000000000000000000..19f26d39b4ec3cf08c0ce912744318add0fe61c2 GIT binary patch literal 9740 zcmeHLO^X{x5S1Z^9P<-$Nq$BkhZu6rA-OGUA%qZ$7{nlkVVDd;2r&pDgb>Co%VI*v zA%y&-{FJ;`Z)!d?l2%@?&Bop`+EI5`SG}rw)jjf0KfZkV#kZZ#FW>+CL;u(C>#sVU z&I|m@zU$cMMd!;-?^XEf-)}md>1m0g>6D*~B z{y#(vb({6?^(sV=I8Kr{<~M$)@Ef&46SiP;%o%CAHZ|Obc7-7=XdWvzIVmN8OeUOk zTU7DoYBovIbe^v_+ud%r-K_F?7EgoGpx3?bc6|r2JVC;nxwPE_V(=`gt%F+azMJ8A%@!z5mZA<|1yFhx zlcM%w7}!9GBdayD2w%vFW-Uj|(E9f7?v43o#o_&0*+ec;38Rpg9IzwisU^6>~xlw}`L6`YT(+tgKy(a9; zOKH#8$?i+Q&6~U5Z{O^9Aih;-idwQh18`($j2EM*o3A$8%{pJ8q1dmbus0~iDG`so zfhw{e0P+B3$-XL=HEZ5QjIcN*l6k%pPIS3&hHyEu5C4Mr5OB?Ue4gj|(xMT&$bPG} zQA6j4RlGP+>72DLU|MX&8D*7q{5m_UZZD8pEsO)!y?d~eO+=uxECNSRZG5bjhLjma z^-%e2#)?|4z&@in`CpuojL=R=<%uyEHyvwYSyt`KsEPxheXj!9(S+}IHi=EZLOw0l z`LUb0T$Tq9bydtqy3F0?S_&jeF z$4RstdzLFr*@(fw)pifAu2J9In#DX>^{k_ewPddKhJ`OY>e`}n4V}C)H&Fwv~ZT4ew=)%r(1?xB;8zpSs+T6Ky3`9)<9* z;zYxhHgf5=(YhTz4_BwSD|k-vURZ!5Xh30yd1>>^E>B+|w+=Io5`)lsCpvcSl@Mh$ za_m}bV(}gAwf2m5BI~?4ff$#iJ-zbs$=0_X<{MHWVx@49$5jL#3Fj!}xfs;0z#*b0 z_QO##PU~6l9Cs6LoNPA7E$`K*Kl5!}PwXyLkJx_UE3@x;_x-ZsvxjIEeVq%3h<$t< zIkQaUIEjxS=ea3i_9bq|?Gm5o+fn*c*j=;zboA|&V>8TF(J$p~QJoOXyK+`=-2orP z-OMWSYUcRgV`v;pd#xUo@Jfey5=wDIS(0z@vR+5evz|>a$5C>&sds+lR_OcPc4~+9 zm3h=RxAE@Q&g0ao`*76q@?m`4hsPszJ;&tZ$9Xm*zQm?>T%t)GkHVkLeTu2lYObCh z9k9y zIc`4t*@m}HzSS3-%m3-XZOy&1SiVK+w+7JI{i5?ymk1FSkuL(RC_ z-PnwfadJm}7d6^5nx%em@5m4|T`CQq;q%aPrFG~<+I4-OsrGP&($o?Zt@!HUT(v5V zw#`GUZmGWWxYZ^ax9|J3=a@g&(6ed9cQtkH8#Qg*r``7J`}y?mmsx3Rz3=|E#rtOD z@#FhFh3n}cIfd{s=0A@pA0tyw)5dfC9;+_TnS88FeoQ;OY4!V4FEe`QI)$LBvER^q zp3>%grFTy2+}e5j=XO4&wNE38%QO19#QVN+K4kwx_FP`MXU)$k1CPt4`)-3LpV{C3 E16wYQz5oCK literal 0 HcmV?d00001 diff --git a/data/tb_cc.wav b/data/tb_cc.wav new file mode 100644 index 0000000000000000000000000000000000000000..f63fe555c86657a6cbab65ead18728f82914fb0e GIT binary patch literal 10611 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%0A%RPoD1jEbL8jX1VIhl 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 F{=fYTij)8V literal 0 HcmV?d00001 diff --git a/data/tb_ow.wav b/data/tb_ow.wav new file mode 100644 index 0000000000000000000000000000000000000000..1c69a919b0c98a0ddfcaa8148bbffcfe4b93fecc GIT binary patch literal 13275 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 R%a`u5Is3{vX(ing{tKB8<*)z% literal 0 HcmV?d00001 diff --git a/data/tbscream.raw b/data/tb_scream.wav similarity index 93% rename from data/tbscream.raw rename to data/tb_scream.wav index 8ccd6c7baae60d2177bf8f1aa96a66d94f5c7968..f63dd5096b283658bf056d923df3fec8c213cfe8 100644 GIT binary patch delta 59 zcmdnd!}z3!Q76dL%`L`_fg#*6%rz~yL_vUofq@YS8|)asn2~{lAtkXS(E_MuG9%;q Ijq5vI0lEJUX8-^I delta 22 ecmaFT!?>e|ak2vA`pNH|1t!Zo@ooH>?Fs;GGzm)p diff --git a/data/tb_zrrp.wav b/data/tb_zrrp.wav new file mode 100644 index 0000000000000000000000000000000000000000..ce17430e99365b5fe1a397d87bfaf3566e8dcc88 GIT binary patch literal 4317 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 literal 0 HcmV?d00001 diff --git a/data/weave1.mod b/data/weave1.mod new file mode 100644 index 0000000000000000000000000000000000000000..e12cee1998018daad304492e3c3baad3b916e27b GIT binary patch literal 17723 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 MOi%XvO*n!5FI0ld{Qv*} literal 0 HcmV?d00001 diff --git a/gtblib.c b/gtblib.c deleted file mode 100644 index 37e467b..0000000 --- a/gtblib.c +++ /dev/null @@ -1,191 +0,0 @@ -/* Generic tblib stuff usable by other apps */ - -#include -#include -#include -#include -#include -#include -#include -#include -#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 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 - -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;i219) 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; + move(imagedata,screen,4000); + gotoxy(1,23); + halt; + menu2: + barpos:=6; +end; + +Procedure SetUpVirtual; + { This sets up the memory needed for the virtual screen } +BEGIN + GetMem (VirScr,64000); + vaddr := seg (virscr^); + GetMem (VirScr2,64000); + vaddr2 := seg (virscr2^); +END; + + + + + +{ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ} +Procedure drawstars(menu:boolean); + { This procedure sets up the static background to be used in the program } + +CONST circ : Array [1..5,1..5] of byte = + ((00,00,30,00,00), + (00,00,26,00,00), + (30,26,18,26,30), + (00,00,26,00,00), + (00,00,30,00,00)); + +VAR i,x,y:integer; + loop1,loop2,loop3:integer; + tempaddr:word; + +procedure makehole(y:integer); +var i:integer; +begin + for i:=10 to 75 do line(239+i,y,239+i,y+9,0,tempaddr); + line(249,y,314,y,24,tempaddr); + line(249,y+10,313,y+10,18,tempaddr); + line(249,y,249,y+9,24,tempaddr); + line(314,y+1,314,y+10,18,tempaddr); +end; +BEGIN + tempaddr:=vaddr; + + + For loop1:=1 to 200 do BEGIN + x:=random (315); + y:=random (195); + For loop2:=1 to 5 do + For loop3:=1 to 5 do + if circ [loop2,loop3]<>0 then + putpixel (x+loop2,y+loop3,circ [loop2,loop3],tempaddr); + END; + if menu=false then begin + for i:=240 to 319 do line(i,0,i,199,19,tempaddr); + line(240,0,240,199,18,tempaddr); + line(240,0,319,0,18,tempaddr); + line(319,0,319,199,24,tempaddr); + line(241,199,319,199,24,tempaddr); + outtextxy('SCORE',241,1,15,127,0,tempaddr,false); + outtextxy('SCORE',242,2,15,143,0,tempaddr,false); + makehole(10); + outtextxy(' 0',250,12,15,12,0,tempaddr,false); + outtextxy('HI-SCORE',241,21,15,127,0,tempaddr,false); + outtextxy('HI-SCORE',242,22,15,143,0,tempaddr,false); + makehole(30); + outtextxy(' 0',250,32,15,12,0,tempaddr,false); + outtextxy('LEVEL',241,41,15,127,0,tempaddr,false); + outtextxy('LEVEL',242,42,15,143,0,tempaddr,false); + makehole(50); + outtextxy('12345675',251,52,15,12,0,tempaddr,false); + outtextxy('SHIELDS',241,61,15,127,0,tempaddr,false); + outtextxy('SHIELDS',242,62,15,143,0,tempaddr,false); + makehole(70); + for i:=0 to 63 do line(250+i,71,250+i,79,((i div 4)+32),tempaddr); + + outtextxy('WEAPONS',241,81,15,127,0,tempaddr,false); + outtextxy('WEAPONS',242,82,15,143,0,tempaddr,false); + makehole(90); + for i:=0 to 65 do line(249+i,111,249+i,189,0,tempaddr); + line(249,111,249,189,24,tempaddr); + line(315,111,315,189,18,tempaddr); + line(249,111,315,111,24,tempaddr); + line(249,189,315,189,18,tempaddr); + + outtextxy(' VMW ',251,114,15,15,0,tempaddr,false); + outtextxy('F1-HELP ',251,124,15,15,0,tempaddr,false); + outtextxy('ESC-QUIT',251,135,15,15,0,tempaddr,false); + outtextxy('F2-SAVE ',251,145,15,15,0,tempaddr,false); + end; + if not(menu) then begin + flip (vaddr,vga); { Copy the entire screen at vaddr, our virtual screen } + { on which we have done all our graphics, onto the } + { screen you see, VGA } + flip (vaddr,vaddr2); + end; +END; + +{ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ} +Procedure ScreenTrans (x,y,p1,p2:word); + { This is a small procedure to copy a 30x30 pixel block from coordinates + x,y on the virtual screen to coordinates x,y on the true vga screen } +BEGIN + asm + push ds + push es + mov ax,p1 + mov es,ax + mov ax,p2 + mov ds,ax + mov bx,[X] + mov dx,[Y] + push bx {; and this again for later} + mov bx, dx {; bx = dx} + mov dh, dl {; dx = dx * 256} + xor dl, dl + shl bx, 1 + shl bx, 1 + shl bx, 1 + shl bx, 1 + shl bx, 1 + shl bx, 1 {; 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 si, di + mov al,60 + mov bx, 30 { Hight of block to copy } +@@1 : + mov cx, 24 { Width of block to copy divided by 2 } + rep movsw + add di,110h { 320 - 48 = 272 .. or 110 in hex } + add si,110h + dec bx + jnz @@1 + + pop es + pop ds + end; + { I wrote this procedure late last night, so it may not be in it's + most optimised state. Sorry :-)} +END; + + +{ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ} +Procedure newship; + { This adds a new toaster to the screen } +VAR loop1:integer; +BEGIN + loop1:=1; + + + if not (shipv[1].active) then BEGIN + shipv[1].x:=36; + shipv[1].y:=165; + shipv[1].active:=true; + shipv[1].frame:=1; + shipv[1].speed:=5; + loop1:=10; + END; + +END; + +procedure putico(x,y,fra:byte;where:word); +var i,j,col:integer; +begin + for i:=0 to 47 do + for j:=0 to 29 do begin + col:=frame[fra,i,j]; + if col<>0 then putpixel(i+x,y+j,col,where); + end; + +end; +procedure putwave(x,y,fra:byte;where:word); +var i,j,col:integer; +begin + for i:=10 to 30 do + for j:=0 to 5 do begin + col:=frame[fra,i,j]; + if col<>0 then putpixel((i+x)-10,y+j,col,where); + end; + +end; + +procedure changescore; +begin + str(score:8,scorest); + outtextxy(scorest,250,12,15,12,0,vaddr,true); +end; +{ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ} +Procedure shiproutine; +VAR loop1,loop2:integer; + ch,ch2:char; + shieldcol:integer; + wave1:array[0..5] of boolean; + bulletx,bullety,oldwavex,oldwavey,wavex,wavey,i,waveadd:integer; + bulletout:boolean; +BEGIN + pal(254,0,0,0); + shieldcol:=0; + shipv[1].active:=false; + newship; + ch:=#1; ch2:=#1; + wavex:=0; wavey:=0; waveadd:=5; + oldwavex:=0; oldwavey:=0; + bulletout:=false; bulletx:=0; bullety:=0; + for i:=0 to 4 do wave1[i]:=true; + Repeat + ch2:=#1; + if (bulletout) and (bulletx>wavex) and (bulletxwavey) and (bullety100) or (wavex<5) then begin + inc(wavey,5); + waveadd:=-waveadd; + end; + if wavey>150 then begin + wavey:=0; + for i:=0 to 5 do if wave1[i]=false then wave1[i]:=true; + end; + if keypressed then BEGIN + ch:=readkey; + if ch=chr(0) then ch2:=readkey; + if ch2='M' then inc(shipv[1].x,5); + if ch2='K' then dec(shipv[1].x,5); + if ch=' ' then begin + bulletout:=true; + bulletx:=shipv[1].x+10; + bullety:=shipv[1].y; + putwave(bulletx,bullety,1,vaddr); + end; + if ch='+' then begin inc(shieldcol,3); pal(254,shieldcol,0,0); + if shieldcol>58 then shieldcol:=59; + end; + if ch='-' then begin dec(shieldcol,3); pal(254,shieldcol,0,0); + if shieldcol<5 then shieldcol:=3; + end; + + end; + if shipv[1].active then BEGIN + screentrans (shipv[1].x,shipv[1].y,vaddr,vaddr2); + { Restore the backgrond the toaster was over } + + { Move the toaster } + if (shipv[1].x<1) then shipv[1].x:=1; + if (shipv[1].x>255) then shipv[1].x:=255; + { When toaster reaches the edge of the screen, render it inactive + and bring a new one into existance. } + END; + if shipv[1].active then BEGIN + CASE shipv [1].frame of + 1 : putico (shipv[1].x,shipv[1].y,0,vaddr); + 3 : putico (shipv[1].x,shipv[1].y,1,vaddr); + 2,4 : putico (shipv[1].x,shipv[1].y,2,vaddr); + END; + shipv[1].frame:=shipv[1].frame+1; + if shipv[1].frame=5 then shipv[1].frame:=1; + { Draw all the toasters on the VGA screen } + end; + waitretrace; + flip (vaddr,vga); + until ch=#27; + fade +END; + + +procedure playthegame(lev:integer); +{ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ} +var palloop,paldir:integer; +begin + cls(0,vaddr); + grapherror:=loadpicsuperpacked(0,0,vga,'tbma1.tb1'); + outtextxy('MOONBASE ALPHA: EARTH''S LAST CHANCE!',5,5,15,1,0,vga,false); + pal(255,0,0,0); + palloop:=0; + paldir:=1; + repeat + pal(255,palloop,0,0); + if paldir=1 then inc(palloop) + else dec(palloop); + if palloop>62 then paldir:=-1; + if palloop<1 then paldir:=1; + delay(50); + + until keypressed; + ch:=readkey; + + drawstars(false); + shiproutine; +end; + +procedure dographics; + +var i,j:integer; +begin + grapherror:=loadpicsuperpacked(0,0,vaddr,'ships.tb1'); + for i:=0 to 47 do + for j:=0 to 29 do + frame[0,i,j]:=getpixel(i,j,vaddr); + for i:=0 to 47 do + for j:=0 to 29 do + frame[1,i,j]:=getpixel(i,j+32,vaddr); + for i:=0 to 47 do + for j:=0 to 29 do + frame[2,i,j]:=getpixel(i,j+64,vaddr); + +end; + +procedure background; +begin + cls(0,vaddr); + drawstars(true); + coolbox(0,0,319,199,false,vaddr); +end; + +procedure options; +begin + background; + flip(vaddr,vga); + outtextxy('AS OF YET THERE ARE NO OPTIONS!',10,10,15,9,0,vga,false); + repeat until keypressed; + ch:=readkey; +end; + +procedure loadgame; +begin + coolbox(90,75,230,125,true,vga); + outtextxy('LOAD WHICH GAME',97,82,15,9,7,vga,false); + outtextxy(' (0-9) ',97,90,15,9,7,vga,false); + repeat until keypressed; + level:=0; +end; + +procedure help; +begin + background; + flip(vaddr,vga); + outtextxy('HELP',10,10,15,9,0,vga,false); + outtextxy('Press ESC to exit most stuff.',10,20,15,9,0,vga,false); + outtextxy('Use the arrows to manuever.',10,30,15,9,0,vga,false); + repeat until keypressed; + ch:=readkey; +end; + +procedure story; +var error:byte; + xtemp,ytemp:integer; + thrustcol:integer; + thrust:real; + tempch:char; +procedure putbigflame(xp,yp,frame:integer); +var xtemp,ytemp:integer; +begin + for xtemp:=0 to 26 do + for ytemp:=0 to 18 do + putpixel(xtemp+xp,ytemp+yp,bigflame[frame,xtemp,ytemp],vaddr); +end; +procedure putsmallflame(xp,yp,frame:integer); +var xtemp,ytemp:integer; +begin + for xtemp:=0 to 3 do + for ytemp:=0 to 4 do + putpixel(xtemp+xp,ytemp+yp,smallflame[frame,xtemp,ytemp],vaddr); +end; + +procedure putbarge(xp,yp:integer;where:word); +var xtemp,ytemp:integer; + col:byte; +begin + for xtemp:=0 to 15 do + for ytemp:=0 to 18 do begin + if (ytemp+yp>=0) then begin + col:=barge[xtemp,ytemp]; + if col<>0 then putpixel(xtemp+xp,ytemp+yp,col,where); + end; + end; +end; +procedure puttruck(xp,yp,frame:integer;where:word); +var xtemp,ytemp:integer; + col:byte; +begin + for xtemp:=0 to 5 do + for ytemp:=0 to 8 do begin + col:=truck[frame,xtemp,ytemp]; + if (ytemp+yp>=173) then begin + if col<>0 then putpixel(xtemp+xp,ytemp+yp,col,where); + end; + end; +end; + +begin + fade; + error:=loadpicsuperpacked(0,0,vaddr,'tbsobj.tb1'); + for xtemp:=0 to 26 do + for ytemp:=0 to 18 do begin + bigflame[0,xtemp,ytemp]:=getpixel(xtemp,ytemp+2,vaddr); + bigflame[1,xtemp,ytemp]:=getpixel(xtemp,ytemp+21,vaddr); + end; + for xtemp:=0 to 3 do + for ytemp:=0 to 4 do begin + smallflame[0,xtemp,ytemp]:=getpixel(xtemp,ytemp+43,vaddr); + smallflame[1,xtemp,ytemp]:=getpixel(xtemp,ytemp+47,vaddr); + end; + for xtemp:=0 to 15 do + for ytemp:=0 to 18 do + barge[xtemp,ytemp]:=getpixel(xtemp+65,ytemp+100,vaddr); + for xtemp:=0 to 5 do + for ytemp:=0 to 8 do begin + truck[0,xtemp,ytemp]:=getpixel(xtemp+85,ytemp+100,vaddr); + truck[1,xtemp,ytemp]:=getpixel(xtemp+95,ytemp+100,vaddr); + end; +{******FIRST MESSAGE*******} + cls(0,vga); + outtextxy('MOON BASE ALPHA:',5,5,15,9,0,vga,false); + outtextxy(' THE FIRST PRIVATELY FINANCED SPACE ',5,15,15,9,0,vga,false); + outtextxy(' VENTURE. FOUNDED IN 2004 BY PIONEER',5,25,15,9,0,vga,false); + outtextxy(' VINCE WEAVER. IN ORDER TO SUPPORT',5,35,15,9,0,vga,false); + outtextxy(' ITSELF, IT DISPOSED OF GARBAGE AND',5,45,15,9,0,vga,false); + outtextxy(' NUCLEAR WASTE FROM EARTH BY LAUNCHING',5,55,15,9,0,vga,false); + outtextxy(' IT INTO DEEP SPACE WITH BARGES. ',5,65,15,9,0,vga,false); + outtextxy('NOW IT IS 2018, AND THE LAST BARGE IS',5,75,15,9,0,vga,false); + outtextxy(' TO BE LAUNCHED. NOW ALL WORK THERE',5,85,15,9,0,vga,false); + outtextxy(' WILL BE CONCENTRATED ON BUILDING A',5,95,15,9,0,vga,false); + outtextxy(' TERRAN SPACE FLEET.',5,105,15,9,0,vga,false); + unfade; + repeat until keypressed; tempch:=readkey; + pal(250,0,0,0); + fade; +{******BARGE TAKING OFF**********} + error:=loadpicsuperpacked(0,0,vaddr2,'tbma1.tb1'); + putbarge(141,157,vaddr2); + flip(vaddr2,vaddr); + flip(vaddr,vga); + unfade; + for ytemp:=191 downto 165 do begin + screentrans(145,ytemp,vaddr,vaddr2); + puttruck(145,ytemp,ytemp mod 2,vaddr); + vdelay(7); + flip(vaddr,vga); + end; + error:=loadpicsuperpacked(0,0,vaddr2,'tbma1.tb1'); + vdelay(20); + flip(vaddr2,vaddr); + putbarge(141,157,vaddr); + thrustcol:=0; + ytemp:=157; + thrust:=0; + while ytemp>-25 do begin + thrust:=thrust+0.05; + if thrustcol<63 then inc(thrustcol); + screentrans(141,ytemp,vaddr,vaddr2); + putbarge(141,ytemp,vaddr); + vdelay(7); + pal(250,thrustcol,0,0); + flip(vaddr,vga); + ytemp:=ytemp-round(thrust); + end; + vdelay(100); + fade; +{******SECOND MESSAGE*******} + cls(0,vga); + outtextxy('5 YEARS LATER, 1 LIGHT YEAR DISTANT',5,5,15,9,0,vga,false); + outtextxy(' CATASTROPHE STRIKES!! ',5,15,15,9,0,vga,false); + unfade; + vdelay(100); + repeat until keypressed; tempch:=readkey; + fade; +{******ALIEN DELEGATION*****} + error:=loadpicsuperpacked(0,0,vaddr2,'tbcrash.tb1'); + flip(vaddr2,vaddr); + unfade; + repeat + putbigflame(213,100,0); + putsmallflame(105,90,1); + putsmallflame(151,71,0); + putsmallflame(218,72,1); + putbarge(160,180,vaddr); + flip(vaddr,vga); + vdelay(5); + putbigflame(213,100,1); + putsmallflame(105,90,0); + putsmallflame(151,71,1); + putsmallflame(218,72,0); + flip(vaddr,vga); + vdelay(5); + until keypressed; + ch:=readkey; +{****ALIEN MESSAGE*****} + fade; + error:=loadpicsuperpacked(0,0,vga,'tbgorg.tb1'); + unfade; + outtextxy('GREETINGS EARTHLINGS.',0,162,15,12,0,vga,false); + outtextxy('I AM GORGONZOLA THE REPULSIVE.',0,171,15,12,0,vga,false); + outtextxy('YOU HAVE MADE A BIG MISTAKE.',0,180,15,12,0,vga,false); + readln; +end; + +procedure credits; +var j:integer; + sp:integer; + procedure rotate(stri:string;col:integer); + var j1:integer; + begin + if sp=1 then begin + for j1:=0 to 7 do begin + outtextxy(stri,0,198,j1,col,0,vga,false); + Move (mem[vga:320],mem[vga:0],63680); + if keypressed then begin inc(sp); cls(0,vga); end; + end; + end; + if sp<>1 then begin + outtextxy(stri,0,180,15,col,0,vga,true); + Move (mem[vga:3200],mem[vga:0],60800); + end; + + end; + procedure skip; begin rotate(' ',0); end; +begin + sp:=1; + cls(0,vaddr); + flip(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); + skip; rotate(' VINCENT M WEAVER',10); + skip; skip; rotate(' SOUND',11); + skip; rotate(' VINCENT M WEAVER',11); + skip; skip; rotate(' GRAPHICS INSPIRATION',12); + skip; rotate(' JEFF WARWICK',12); + skip; skip; rotate(' UTOPIA BBS 410-557-0868',13); + skip; rotate(' JOHN CLEMENS',13); + skip; rotate(' JASON GRIMM',13); + skip; skip; rotate(' PCGPE AUTHORS, esp',14); + skip; rotate(' GRANT SMITH',14); + skip; skip; rotate(' SOUND BLASTER INFO',15); + skip; rotate(' AXEL STOLZ',15); + skip; skip; rotate(' INSPIRATION',9); + skip; rotate(' DOUGLAS ADAMS',9); + skip; rotate(' GENE RODENBERRY',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); + skip; rotate(' B,D,JL,L,N,P,S,W,PM,E',10); + skip; rotate(' AND ESPECIALLY AGENT G',10); + i:=0; + repeat + move(mem[vaddr2:(i*320)],mem[vga:63680],320); + Move (mem[vga:320],mem[vga:0],63680); + inc(i); + until (keypressed) or (i=299); + if keypressed then ch:=readkey; + end; + +procedure shadowrite(st:string;x5,y5,forecol,backcol:integer); +begin + outtextxy(st,x5+1,y5+1,15,backcol,0,vga,false); + outtextxy(st,x5,y5,15,forecol,0,vga,false); +end; + +procedure register; + +var pagenum,oldpagenum,numpages:integer; + pagest:string; + numst:string[2]; + +procedure page1; +begin + flip(vaddr,vga); + shadowrite(' TO REGISTER',10,10,9,1); + shadowrite('THIS GAME WAS WRITTEN BY A 16 YEAR OLD',10,30,9,1); + shadowrite(' ENTIRELY IN HIS FREE TIME.',10,40,9,1); + shadowrite('HOPEFULLY YOU FEEL HIS FREE TIME IS',10,50,9,1); + shadowrite(' WORTH SOMETHING.',10,60,9,1); + shadowrite('WARNING:',10,80,12,4); + shadowrite(' VMW SOFTWARE IS NOT AN INCORPORATED',10,90,12,4); + shadowrite(' COMPANY, NOR DOES IT HAVE ANY INCOME',10,100,12,4); + shadowrite(' EXCEPT DONATIONS. NONE OF ITS',10,110,12,4); + shadowrite(' SYMBOLS ARE TRADEMARKED EITHER. (BUT',10,120,12,4); + shadowrite(' I DOUBT YOU''LL NAME A COMPANY AFTER',10,130,12,4); + shadowrite(' MY ININTIALS)',10,140,12,4); +end; +procedure page2; +begin + flip(vaddr,vga); + shadowrite('PLEASE SEND ANY DONATIONS TO:',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('ANY DONATION OF $5 OR MORE GETS THE',10,60,13,5); + shadowrite(' NEWEST VERSION OF THE GAME, PLUS',10,70,13,5); + shadowrite(' ANY OTHER COOL PROGRAMS I HAVE AT',10,80,13,5); + shadowrite(' THE TIME.',10,90,13,5); + shadowrite('ALSO IF YOU SEND ME A SELF ADDRESSED',10,110,11,3); + shadowrite(' STAMPED ENVELOPE WITH SUFFICIENT',10,120,11,3); + shadowrite(' POSTAGE AND A 3 1/2 INCH DISK IN',10,130,11,3); + shadowrite(' IT, I WILL COPY THE NEWEST VERSION',10,140,11,3); + shadowrite(' OF THE GAME ONTO IT.',10,150,11,3); +end; + +procedure page3; +begin + flip(vaddr,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(' ALMOST COMPLETE 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 3 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 + flip(vaddr,vga); + shadowrite('DISCLAIMERS:',10,10,12,14); + shadowrite('** THE ABOVE PROGRAMS HAVE NEVER DONE**',5,30,12,4); + shadowrite('** ANYTHING BAD TO MY COMPUTER THAT **',5,40,12,4); + shadowrite('** CTRL-ALT-DEL WOULDN''T FIX. I AM **',5,50,12,4); + shadowrite('** NOT RESPONSIBLE FOR HARD DISK **',5,60,12,4); + shadowrite('** DISSAPPEARANCES, MISSING MODEMS **',5,70,12,4); + shadowrite('** MOUSE BREAKDOWNS, MELTING MONITORS**',5,80,12,4); + SHADOWRITE('** OR ANYTHING ELSE. **',5,90,12,4); + shadowrite('%% ALL VMW SOFTWARE PRODUCTIONS ARE %%',5,110,11,3); + shadowrite('%% CERTIFIED VIRUS FREE!!!!!!!!!!!! %%',5,120,11,3); +end; + +begin + background; + 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; +end; + + +label picloader,menu; + +begin + axel_und_carmen:=true; {as_of_9-22-94} {change_back_10-6-94} + randomize; + setupvirtual; + fade; + setmcga; + dographics; + energy:=15; + lives:=2; + score:=0; + level:=0; + for x:=0 to 40 do begin + pal(100+x,x+20,0,0); + pal(141+x,0,0,x+20); + pal(182+x,0,x+20,0); + end; + fade; + modinit; + dev:=7; + md:='vmwfan.tb1'; + mix := 10000; {use 10000 normally } + pro := 0; {Leave at 0} + loop :=0; {4 means mod will play forever} + modvolume (255,255,255,255); { Full volume } + modsetup ( stat, dev, mix, pro, loop, md ); + case stat of + 1: writeln('Not a mod'); + 2: writeln('Already playing'); + 4: writeln('Out of memory'); + end; + for x:=0 to 40 do begin + line(x+40,45,x+40,45+(2*x),100+x,vga); + line(x+120,45,x+120,45+(2*x),141+x,vga); + line(x+200,45,x+200,45+(2*x),141+x,vga); + line(x+80,125,x+80,125-(2*x),182+x,vga); + line(x+160,125,x+160,125-(2*x),182+x,vga); + end; + for x:=40 downto 0 do begin + line(x+80,45,x+80,125-(2*x),140-x,vga); + line(x+160,45,x+160,125-(2*x),181-x,vga); + line(x+240,45,x+240,125-(2*x),181-x,vga); + line(x+120,125,x+120,45+(2*x),222-x,vga); + line(x+200,125,x+200,45+(2*x),222-x,vga); + end; + unfade; + + outtextxy('A VMW SOFTWARE PRODUCTION',60,140,15,15,15,VGA,false); + y:=0; + repeat until keypressed; + ch:=readkey; + modstop; + fade; + cls(0,vga); + assign(palf,'pal.tb1'); + reset(palf); + for i:=0 to 255 do begin + for j:=1 to 3 do readln(palf,temp[j]); + pal(i,temp[1],temp[2],temp[3]); + end; + close(palf); + fade; + +PICLOADER: + grapherror:=loadpicsuperpacked(0,0,vaddr2,'tbomb1.tb1'); + if not(axel_und_carmen) then begin + for tempi:=193 to 199 do + for tempj:=290 to 319 do + putpixel(tempj,tempi,0,vaddr2); + end; +MENU: + modinit; + dev:=7; + md:='weave1.tb1'; + mix := 10000; {use 10000 normally } + pro := 0; {Leave at 0} + loop :=0; {4 means mod will play forever} + modvolume (255,255,255,255); { Full volume } + modsetup ( stat, dev, mix, pro, loop, md ); + case stat of + 1: writeln('Not a mod'); + 2: writeln('Already playing'); + 4: writeln('Out of memory'); + end; + flip(vaddr2,vga); + unfade; + repeat until keypressed; + ch:=readkey; + barpos:=0; + outtextxy('F1 HELP',0,190,15,9,7,vga,false); + coolbox(117,61,199,140,true,vga); + repeat + if barpos=0 then outtextxy('NEW GAME',123,67,15,32,0,vga,true) + else outtextxy('NEW GAME',123,67,15,32,7,vga,true); + if barpos=1 then outtextxy('OPTIONS',123,77,15,32,0,vga,true) + else outtextxy('OPTIONS',123,77,15,32,7,vga,true); + if barpos=2 then outtextxy('REGISTER',123,87,15,32,0,vga,true) + else outtextxy('REGISTER',123,87,15,32,7,vga,true); + if barpos=3 then outtextxy('LOAD GAME',123,97,15,32,0,vga,true) + else outtextxy('LOAD GAME',123,97,15,32,7,vga,true); + if barpos=4 then outtextxy('STORY',123,107,15,32,0,vga,true) + else outtextxy('STORY',123,107,15,32,7,vga,true); + if barpos=5 then outtextxy('CREDITS',123,117,15,32,0,vga,true) + else outtextxy('CREDITS',123,117,15,32,7,vga,true); + if barpos=6 then outtextxy('QUIT',123,127,15,32,0,vga,true) + else outtextxy('QUIT',123,127,15,32,7,vga,true); + + ch:=menuread; + if (ord(ch)=222) or (ord(ch)=220) then inc(barpos); + if (ord(ch)=223) or (ord(ch)=221) then dec(barpos); + if (ord(ch)=168) then begin barpos:=10; ch:=#13; end; + if ch='N' then barpos:=0; + if ch='O' then barpos:=1; + if ch='R' then barpos:=2; + if ch='L' then barpos:=3; + if ch='S' then barpos:=4; + if ch='C' then barpos:=5; + if ch='Q' then barpos:=6; + if ch='A' then axel_und_carmen:=not(axel_und_carmen); + if ch=#27 then begin + barpos:=6; + ch:=#13; + end; + if barpos=7 then barpos:=0; + if barpos=-1 then barpos:=6; + until ch=#13; + modstop; + if barpos=6 then quit; + if barpos=1 then options; + if barpos=2 then register; + if barpos=3 then loadgame; + if barpos=4 then story; + if barpos=5 then credits; + if barpos=10 then help; + if barpos=0 then playthegame(0); + if barpos=0 then goto picloader; + if barpos=4 then goto picloader; + goto menu; + +end. \ No newline at end of file diff --git a/legacy_pascal/tb_really_old.pas b/legacy_pascal/tb_really_old.pas new file mode 100644 index 0000000..3317cab --- /dev/null +++ b/legacy_pascal/tb_really_old.pas @@ -0,0 +1,614 @@ +program TOM_BOMB_EM_AND_INVASION_OF_INANIMATE_OBJECTS; + {by Vincent Weaver....21085-4706} + +uses vmwgraph,crt; + +{$I c:\pascal\tb1ans.pas} + + +type screentype = array [0..3999] of byte; +Type Toastinfo = Record { This is format of of each of our } + x,y:integer; { records for the flying toasters } + speed,frame:integer; + active:boolean; + END; + + icon = Array [1..30*48] of byte; { This is the size of our pictures } + + Virtual = Array [1..64000] of byte; { The size of our Virtual Screen } + VirtPtr = ^Virtual; { Pointer to the virtual screen } + +CONST frame1 : icon = ( +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01,01,01, +01,01,01,01,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,02,02, +02,02,02,02,02,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,03,03,03, +03,03,03,03,03,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,04,04,04, +04,04,04,04,04,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,05,05,05, +05,05,05,05,05,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,06,06,06, +06,06,06,06,06,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,05,05,05, +05,05,05,05,05,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,05,05,05, +05,05,05,05,05,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,07,07, +7,07,07,07,07,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,07,07,07, +7,07,07,07,07,07,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,07,07,07, +7,07,07,07,07,08,07,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,09,07,07,07, +7,07,07,07,07,09,08,07,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,09,09,07,07,07, +7,07,07,07,07,09,09,08,07,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,09,09,09,07,07,07, +7,07,07,07,07,09,09,09,08,07,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,09,09,09,09,07,07,07, +7,07,07,07,07,09,09,09,09,08,07,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,09,09,09,09,09,07,07,07, +7,07,07,07,07,09,09,09,09,09,08,07,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,09,09,09,09,09,09,07,07,07, +7,07,07,07,07,09,09,09,09,09,09,08,07,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,07,08,09,09,09,09,09,09,09,07,07,07, +09,09,07,07,07,09,09,09,09,09,09,09,08,07,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,07,08,13,14,15,14,15,09,09,09,07,07,07, +08,08,07,07,07,09,09,09,13,14,15,14,15,08,07,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,07,08,09,13,14,15,14,15,09,09,09,07,07,07, +7,07,07,07,07,09,09,09,13,14,15,14,15,09,08,07,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,07,08,09,09,09,09,09,09,09,09,09,09,07,07,07, +10,10,07,07,07,09,09,09,09,09,09,09,09,09,09,08,07,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,07,08,08,08,08,08,08,08,08,08,08,08,08,07,07,07, +11,11,07,07,07,08,08,08,08,08,08,08,08,08,08,08,08,07,00,00,00,00,00,00, +00,00,00,00,00,00,00,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07, +12,12,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,18, +17,17,18,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,18,19, +20,20,19,18,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,25,24, +21,21,24,25,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,27,26,25, +22,22,25,27,00,26,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,27,24, +23,23,24,26,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,26,27, +24,27,27,27,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,26,25,26, +26,26,27,25,26,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00); + + frame2 : icon = ( +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01,01,01, +01,01,01,01,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,02,02, +02,02,02,02,02,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,03,03,03, +03,03,03,03,03,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,04,04,04, +04,04,04,04,04,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,05,05,05, +05,05,05,05,05,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,06,06,06, +06,06,06,06,06,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,05,05,05, +05,05,05,05,05,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,05,05,05, +05,05,05,05,05,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,07,07, +07,07,07,07,07,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,07,07,07, +07,07,07,07,07,07,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,07,07,07, +07,07,07,07,07,08,07,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,09,07,07,07, +07,07,07,07,07,09,08,07,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,09,09,07,07,07, +07,07,07,07,07,09,09,08,07,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,09,09,09,07,07,07, +07,07,07,07,07,09,09,09,08,07,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,09,09,09,09,07,07,07, +07,07,07,07,07,09,09,09,09,08,07,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,09,09,09,09,09,07,07,07, +07,07,07,07,07,09,09,09,09,09,08,07,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,09,09,09,09,09,09,07,07,07, +07,07,07,07,07,09,09,09,09,09,09,08,07,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,07,08,09,09,09,09,09,09,09,07,07,07, +09,09,07,07,07,09,09,09,09,09,09,09,08,07,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,07,08,13,14,15,14,15,09,09,09,07,07,07, +08,08,07,07,07,09,09,09,13,14,15,14,15,08,07,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,07,08,09,13,14,15,14,15,09,09,09,07,07,07, +07,07,07,07,07,09,09,09,13,14,15,14,15,09,08,07,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,07,08,09,09,09,09,09,09,09,09,09,09,07,07,07, +10,10,07,07,07,09,09,09,09,09,09,09,09,09,09,08,07,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,07,08,08,08,08,08,08,08,08,08,08,08,08,07,07,07, +11,11,07,07,07,08,08,08,08,08,08,08,08,08,08,08,08,07,00,00,00,00,00,00, +00,00,00,00,00,00,00,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07, +12,12,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,18, +17,17,18,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,18,19, +20,20,19,18,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,25,24, +21,21,25,25,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,27,26,25, +22,22,27,27,00,26,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,27,24, +24,23,23,27,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,26,27, +24,27,27,27,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,26,25,26, +26,26,27,25,26,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00); + + + frame3 : icon = ( +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01,01,01, +01,01,01,01,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,02,02, +02,02,02,02,02,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,03,03,03, +03,03,03,03,03,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,04,04,04, +04,04,04,04,04,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,05,05,05, +05,05,05,05,05,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,06,06,06, +06,06,06,06,06,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,05,05,05, +05,05,05,05,05,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,05,05,05, +05,05,05,05,05,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,07,07, +07,07,07,07,07,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,07,07,07, +07,07,07,07,07,07,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,07,07,07, +07,07,07,07,07,08,07,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,09,07,07,07, +07,07,07,07,07,09,08,07,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,09,09,07,07,07, +07,07,07,07,07,09,09,08,07,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,09,09,09,07,07,07, +07,07,07,07,07,09,09,09,08,07,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,09,09,09,09,07,07,07, +07,07,07,07,07,09,09,09,09,08,07,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,09,09,09,09,09,07,07,07, +07,07,07,07,07,09,09,09,09,09,08,07,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,07,08,09,09,09,09,09,09,07,07,07, +07,07,07,07,07,09,09,09,09,09,09,08,07,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,07,08,09,09,09,09,09,09,09,07,07,07, +09,09,07,07,07,09,09,09,09,09,09,09,08,07,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,07,08,13,14,15,14,15,09,09,09,07,07,07, +08,08,07,07,07,09,09,09,13,14,15,14,15,08,07,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,07,08,09,13,14,15,14,15,09,09,09,07,07,07, +07,07,07,07,07,09,09,09,13,14,15,14,15,09,08,07,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,07,08,09,09,09,09,09,09,09,09,09,09,07,07,07, +10,10,07,07,07,09,09,09,09,09,09,09,09,09,09,08,07,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,07,08,08,08,08,08,08,08,08,08,08,08,08,07,07,07, +11,11,07,07,07,08,08,08,08,08,08,08,08,08,08,08,08,07,00,00,00,00,00,00, +00,00,00,00,00,00,00,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07, +12,12,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,18, +17,17,18,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,18,19, +20,20,19,18,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,25,24, +21,21,24,25,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,27,26,25, +22,22,25,27,00,26,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,27,24, +23,23,24,26,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,26,27, +24,27,27,27,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,26,25,26, +26,26,27,25,26,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 + +); + + +VAR Virscr : VirtPtr; { Our first Virtual screen } + VirScr2 : VirtPtr; { Our second Virtual screen } + Vaddr : word; { The segment of our virtual screen} + Vaddr2 : Word; { The segment of our 2nd virt. screen} + ourpal : Array [0..255,1..3] of byte; { A virtual pallette } + toaster : Array [1..1] of toastinfo; { The toaster info } + Sound : Pointer; + Check : BOOLEAN; + + +var grapherror:byte; + temp:array[1..3] of byte; + palf:text; + i,j:byte; + x,y,barpos:integer; + screen:screentype absolute $B800:0000; + ch:char; + +function menuread:char; +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:='ß'; + if ch2='M' then chtemp:='Þ'; + if ch2='P' then chtemp:='Ü'; + if ch2='K' then chtemp:='Ý'; + end; + menuread:=chtemp; +end; +procedure coolbox(x1,y1,x2,y2:integer); +begin + for i:=0 to 5 do box(x1+i,y1+i,x2-i,y2-i,31-i,vga); + for i:=y1+5 to y2-5 do line(x1+5,i,x2-5,i,7,vga); +end; + +{ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ} +Procedure ShutDown; + { This frees the memory used by the virtual screen } +BEGIN + FreeMem (VirScr,64000); + FreeMem (VirScr2,64000); +END; + + + +procedure QUIT; +label menu2; +begin + coolbox(90,75,230,125); + 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; + shutdown; + move(imagedata,screen,4000); + gotoxy(1,23); + halt; + menu2: +end; +Procedure SetUpVirtual; + { This sets up the memory needed for the virtual screen } +BEGIN + GetMem (VirScr,64000); + vaddr := seg (virscr^); + GetMem (VirScr2,64000); + vaddr2 := seg (virscr2^); +END; + + + + +{ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ} +Procedure putico(X,Y:Word;VAR sprt : icon;Where:Word); ASSEMBLER; + { This puts an icon, EXCEPT it's color 0 (black) pixels, onto the screen + "where", at position X,Y } +label + _Redraw, _DrawLoop, _Exit, _LineLoop, _NextLine, _Store, _NoPaint; + +asm + push ds + push es + lds si,Sprt + mov ax,X { ax = x } + mov bx,Y { bx = y } +_Redraw: + push ax + mov ax,[where] + mov es,ax + + mov ax, bx {; ax = bx x = y} + mov bh, bl {; y = y * 256 bx = bx * 256} + xor bl, bl + shl ax, 1 + shl ax, 1 + shl ax, 1 + shl ax, 1 + shl ax, 1 + shl ax, 1 {; y = y * 64 ax = ax * 64} + add bx, ax {; y = (y*256) + (Y*64) bx = bx + ax (ie y*320)} + + pop ax {; get back our x} + + + add ax, bx {; finalise location} + mov di, ax + + mov dl,30 { dl = height of sprite } + xor ch,ch + mov cl,48 { cx = width of sprite } + cld + push ax + mov ax,cx +_DrawLoop: + push di { store y adr. for later } + mov cx,ax { store width } +_LineLoop: + mov bl,byte ptr [si] + or bl,bl + jnz _Store +_NoPaint: + inc si + inc di + loop _LineLoop + jmp _NextLine +_Store: + movsb + loop _LineLoop +_NextLine: + pop di + dec dl + jz _Exit + add di,320 { di = next line of sprite } + jmp _DrawLoop +_Exit: + pop ax + pop es + pop ds +end; + +{ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ} +Procedure SetUpScreen; + { This procedure sets up the static background to be used in the program } + +CONST circ : Array [1..5,1..5] of byte = + ((00,00,10,00,00), + (00,00,09,00,00), + (10,09,8,09,10), + (00,00,09,00,00), + (00,00,10,00,00)); + +VAR x,y:integer; + loop1,loop2,loop3:integer; + +BEGIN + + For loop1:=1 to 200 do BEGIN + x:=random (315); + y:=random (195); + For loop2:=1 to 5 do + For loop3:=1 to 5 do + if circ [loop2,loop3]<>0 then + putpixel (x+loop2,y+loop3,circ [loop2,loop3],vaddr); + END; + flip (vaddr,vga); { Copy the entire screen at vaddr, our virtual screen } + { on which we have done all our graphics, onto the } + { screen you see, VGA } + flip (vaddr,vaddr2); +END; + +{ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ} +Procedure ScreenTrans (x,y:word); + { This is a small procedure to copy a 30x30 pixel block from coordinates + x,y on the virtual screen to coordinates x,y on the true vga screen } +BEGIN + asm + push ds + push es + mov ax,vaddr + mov es,ax + mov ax,vaddr2 + mov ds,ax + mov bx,[X] + mov dx,[Y] + push bx {; and this again for later} + mov bx, dx {; bx = dx} + mov dh, dl {; dx = dx * 256} + xor dl, dl + shl bx, 1 + shl bx, 1 + shl bx, 1 + shl bx, 1 + shl bx, 1 + shl bx, 1 {; 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 si, di + mov al,60 + mov bx, 30 { Hight of block to copy } +@@1 : + mov cx, 24 { Width of block to copy divided by 2 } + rep movsw + add di,110h { 320 - 48 = 272 .. or 110 in hex } + add si,110h + dec bx + jnz @@1 + + pop es + pop ds + end; + { I wrote this procedure late last night, so it may not be in it's + most optimised state. Sorry :-)} +END; + + +{ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ} +Procedure NewToaster; + { This adds a new toaster to the screen } +VAR loop1:integer; +BEGIN + loop1:=0; + repeat + inc (loop1); + if not (toaster[loop1].active) then BEGIN + toaster[loop1].x:=36; + toaster[loop1].y:=165; + toaster[loop1].active:=true; + toaster[loop1].frame:=1; + toaster[loop1].speed:=5; + loop1:=10; + END; + until loop1=10; +END; + + +{ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ} +Procedure Fly; + { This is the procedure where we move and put the toasters } +VAR loop1,loop2:integer; + ch:char; +BEGIN + For loop1:=1 to 10 do + toaster[loop1].active:=FALSE; + ch:=#0; + NewToaster; + Repeat + if keypressed then BEGIN + ch:=readkey; + if ch='+' then inc(toaster[1].x,5); + if ch='-' then dec(toaster[1].x,5); { If '+' is pressed, add a toaster } + end; + + + + + for loop1:=1 to 10 do + if toaster[loop1].active then BEGIN + screentrans (toaster[loop1].x,toaster[loop1].y); + { Restore the backgrond the toaster was over } + + { Move the toaster } + if (toaster[loop1].x<1) or (toaster[loop1].y>170) then BEGIN + toaster[loop1].active:=FALSE; + NewToaster; + END; + { When toaster reaches the edge of the screen, render it inactive + and bring a new one into existance. } + END; + for loop1:=1 to 10 do + if toaster[loop1].active then BEGIN + CASE toaster [loop1].frame of + 1 : putico (toaster[loop1].x,toaster[loop1].y,frame1,vaddr); + 3 : putico (toaster[loop1].x,toaster[loop1].y,frame2,vaddr); + 2,4 : putico (toaster[loop1].x,toaster[loop1].y,frame3,vaddr); + END; + toaster[loop1].frame:=toaster[loop1].frame+1; + if toaster [loop1].frame=5 then toaster[loop1].frame:=1; + { Draw all the toasters on the VGA screen } + END; + waitretrace; + flip (vaddr,vga); + until ch=#27; +END; + +procedure playthegame; +{ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ} +begin + cls(0,vaddr); + SetupScreen; { Draw the background screen to VADDR, then flip it to + the VGA screen } + Fly; { Make the toasters fly around the screen } + { Free the memory taken up by virtual page } +end; + +label picloader,menu; + +begin + randomize; + setupvirtual; + fade; + setmcga; + for x:=0 to 40 do begin + pal(100+x,x+20,0,0); + pal(141+x,0,0,x+20); + pal(182+x,0,x+20,0); + end; + fade; + for x:=0 to 40 do begin + line(x+40,45,x+40,45+(2*x),100+x,vga); + line(x+120,45,x+120,45+(2*x),141+x,vga); + line(x+200,45,x+200,45+(2*x),141+x,vga); + line(x+80,125,x+80,125-(2*x),182+x,vga); + line(x+160,125,x+160,125-(2*x),182+x,vga); + end; + for x:=40 downto 0 do begin + line(x+80,45,x+80,125-(2*x),140-x,vga); + line(x+160,45,x+160,125-(2*x),181-x,vga); + line(x+240,45,x+240,125-(2*x),181-x,vga); + line(x+120,125,x+120,45+(2*x),222-x,vga); + line(x+200,125,x+200,45+(2*x),222-x,vga); + end; + unfade; + + outtextxy('A VMW SOFTWARE PRODUCTION',60,140,15,15,VGA,false); + y:=0; + repeat until keypressed; + ch:=readkey; + fade; + cls(0,vga); + assign(palf,'pal.tb1'); + reset(palf); + for i:=0 to 255 do begin + for j:=1 to 3 do readln(palf,temp[j]); + pal(i,temp[1],temp[2],temp[3]); + end; + close(palf); + fade; +PICLOADER: + grapherror:=loadpicsuperpacked(0,0,vaddr,'tbomb1.tb1'); +MENU: + flip(vaddr,vga); + unfade; + repeat until keypressed; + ch:=readkey; + barpos:=0; + outtextxy('F1 HELP',0,190,9,7,vga,false); + coolbox(117,61,199,140); + repeat + if barpos=0 then outtextxy('NEW GAME',123,67,32,0,vga,true) + else outtextxy('NEW GAME',123,67,32,7,vga,true); + if barpos=1 then outtextxy('OPTIONS',123,77,32,0,vga,true) + else outtextxy('OPTIONS',123,77,32,7,vga,true); + if barpos=2 then outtextxy('REGISTER',123,87,32,0,vga,true) + else outtextxy('REGISTER',123,87,32,7,vga,true); + if barpos=3 then outtextxy('LOAD GAME',123,97,32,0,vga,true) + else outtextxy('LOAD GAME',123,97,32,7,vga,true); + if barpos=4 then outtextxy('STORY',123,107,32,0,vga,true) + else outtextxy('STORY',123,107,32,7,vga,true); + if barpos=5 then outtextxy('CREDITS',123,117,32,0,vga,true) + else outtextxy('CREDITS',123,117,32,7,vga,true); + if barpos=6 then outtextxy('QUIT',123,127,32,0,vga,true) + else outtextxy('QUIT',123,127,32,7,vga,true); + + ch:=menuread; + if (ord(ch)=222) or (ord(ch)=220) then inc(barpos); + if (ord(ch)=223) or (ord(ch)=221) then dec(barpos); + if ch='N' then barpos:=0; + if ch='O' then barpos:=1; + if ch='R' then barpos:=2; + if ch='L' then barpos:=3; + if ch='S' then barpos:=4; + if ch='C' then barpos:=5; + if ch='Q' then barpos:=6; + if ch=#27 then begin + barpos:=6; + ch:=#13; + end; + if barpos=7 then barpos:=0; + if barpos=-1 then barpos:=6; + until ch=#13; + if barpos=6 then quit; + if barpos=0 then playthegame; + if barpos=0 then goto picloader; + goto menu; + +end. \ No newline at end of file diff --git a/legacy_pascal/tbetter.pas b/legacy_pascal/tbetter.pas new file mode 100644 index 0000000..37b2935 --- /dev/null +++ b/legacy_pascal/tbetter.pas @@ -0,0 +1,22 @@ +program maketb1better; +uses vmwgraph; +var palf:text; + x,y,i,j:integer; + temp:array[1..3] of byte; + grapherror:byte; + +begin + setmcga; + cls(0,vga); + assign(palf,'pal.tb1'); + reset(palf); + for i:=0 to 255 do begin + for j:=1 to 3 do readln(palf,temp[j]); + pal(i,temp[1],temp[2],temp[3]); + end; + close(palf); + grapherror:=loadpicsuperpacked(0,0,vga,'tbomb1.tb1'); + + readln; + settext; +end. \ No newline at end of file diff --git a/legacy_pascal/tbside.pas b/legacy_pascal/tbside.pas new file mode 100644 index 0000000..956e41b --- /dev/null +++ b/legacy_pascal/tbside.pas @@ -0,0 +1,61 @@ +uses crt,vmwgraph; +var i,j:integer; + palf:text; + temp:array[0..3] of byte; +procedure makehole(y:integer); +begin + for i:=10 to 75 do line(239+i,y,239+i,y+9,0,vga); + line(249,y,314,y,24,vga); + line(249,y+10,313,y+10,18,vga); + line(249,y,249,y+9,24,vga); + line(314,y+1,314,y+10,18,vga); +end; +begin + setmcga; + assign(palf,'pal.tb1'); + reset(palf); + for i:=0 to 255 do begin + for j:=1 to 3 do readln(palf,temp[j]); + pal(i,temp[1],temp[2],temp[3]); + end; + close(palf); + for i:=240 to 319 do line(i,0,i,199,19,vga); + line(240,0,240,199,18,vga); + line(240,0,319,0,18,vga); + line(319,0,319,199,24,vga); + line(241,199,319,199,24,vga); + outtextxy('SCORE',241,1,127,0,vga,false); + outtextxy('SCORE',242,2,143,0,vga,false); + makehole(10); + outtextxy('00001233',251,12,12,0,vga,false); + outtextxy('HI-SCORE',241,21,127,0,vga,false); + outtextxy('HI-SCORE',242,22,143,0,vga,false); + makehole(30); + outtextxy('12345672',251,32,12,0,vga,false); + outtextxy('LEVEL',241,41,127,0,vga,false); + outtextxy('LEVEL',242,42,143,0,vga,false); + makehole(50); + outtextxy('12345675',251,52,12,0,vga,false); + outtextxy('SHIELDS',241,61,127,0,vga,false); + outtextxy('SHIELDS',242,62,143,0,vga,false); + makehole(70); + for i:=0 to 63 do line(250+i,71,250+i,79,((i div 4)+32),vga); + + outtextxy('WEAPONS',241,81,127,0,vga,false); + outtextxy('WEAPONS',242,82,143,0,vga,false); + makehole(90); + for i:=0 to 65 do line(249+i,111,249+i,189,0,vga); + line(249,111,249,189,24,vga); + line(315,111,315,189,18,vga); + line(249,111,315,111,24,vga); + line(249,189,315,189,18,vga); + + outtextxy(' VMW ',251,114,15,0,vga,false); + outtextxy('F1-HELP ',251,124,15,0,vga,false); + outtextxy('ESC-QUIT',251,135,15,0,vga,false); + outtextxy('F2-SAVE ',251,145,15,0,vga,false); + + readln; + + settext; +end. \ No newline at end of file diff --git a/level1.c b/level1.c deleted file mode 100644 index 2c51b25..0000000 --- a/level1.c +++ /dev/null @@ -1,704 +0,0 @@ -/* - 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 0 - 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); - } -#endif - - /* 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 deleted file mode 100644 index e9ad98d..0000000 --- a/level2.c +++ /dev/null @@ -1,609 +0,0 @@ -/* - * Level 2 Engine Code for Tom Bombem - * */ - - /* The Includes */ -#include -#include -#include -#include -#include -#include "svmwgrap.h" -#include "levels.h" -#include "gtblib.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/level_1.c b/level_1.c new file mode 100644 index 0000000..d7a172a --- /dev/null +++ b/level_1.c @@ -0,0 +1,680 @@ +/* + Level 1 Engine Code for Tom Bombem + */ + + /* The Includes */ +#include +#include +#include +#include +#include "SDL.h" +#include "sdl_svmwgraph.h" +#include "tb1_state.h" +#include "levels.h" +#include "tblib.h" +#include "vmw_sprite.h" +#include "tb_keypress.h" +#include "sound.h" + + /* Define this to get a frames per second readout */ +/* #define DEBUG_ON */ + + /* The sounds */ + +#define NUM_SAMPLES 8 +#define SND_AHH 0 +#define SND_CC 1 +#define SND_KAPOW 2 +#define SND_SCREAM 3 +#define SND_BONK 4 +#define SND_CLICK 5 +#define SND_OW 6 +#define SND_ZRRP 7 + +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 */ + + + /* 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}; + + + + /* The little Sequence Before you hit the Boss */ +void beforeboss(struct tb1_state *game_state) +{ + + clear_keyboard_buffer(); + vmwLoadPicPacked(0,0,game_state->virtual_3,0,1, + tb1_data_file("viewscr.tb1",game_state->path_to_data)); + vmwClearScreen(game_state->virtual_1,0); + vmwArbitraryCrossBlit(game_state->virtual_3,0,5,58,37, + game_state->virtual_1,10,10); + vmwSmallTextXY("HUMAN!",70,10,2,0,1,game_state->tb1_font,game_state->virtual_1); + vmwSmallTextXY("WHAT ARE YOU DOING?!",70,20,2, + 0,1,game_state->tb1_font,game_state->virtual_1); + vmwSmallTextXY("YOUR SPECIES MUST BE TERMINATED!",70,30,2, + 0,1,game_state->tb1_font,game_state->virtual_1); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); + pauseawhile(5); + + vmwArbitraryCrossBlit(game_state->virtual_3,0,42,58,37, + game_state->virtual_1,10,50); + vmwSmallTextXY("I'M SORRY.",70,50,9,0,1,game_state->tb1_font,game_state->virtual_1); + vmwSmallTextXY("WE DIDN'T MEAN TO DESTROY YOUR ENVOY.",70,60,9, + 0,1,game_state->tb1_font,game_state->virtual_1); + vmwSmallTextXY("WILL YOU FORGIVE US AND TRY PEACE?",70,70,9, + 0,1,game_state->tb1_font,game_state->virtual_1); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); + pauseawhile(5); + + vmwArbitraryCrossBlit(game_state->virtual_3,0,5,58,37, + game_state->virtual_1,10,90); + vmwSmallTextXY("NO! YOU MUST BE DESTROYED!",70,90,2, + 0,1,game_state->tb1_font,game_state->virtual_1); + vmwSmallTextXY("OUR FUNDING ... OUR ENVOY WAS DAMAGED BY",70,100, + 2,0,1,game_state->tb1_font,game_state->virtual_1); + vmwSmallTextXY("YOU! VENGEANCE WILL BE OURS! YOUR PUNY",70,110, + 2,0,1,game_state->tb1_font,game_state->virtual_1); + vmwSmallTextXY("PRIMITIVE SPACECRAFT WITH ITS INFERIOR",70,120, + 2,0,1,game_state->tb1_font,game_state->virtual_1); + vmwSmallTextXY("WEAPONS WOULD HAVE TO SCORE 9 DIRECT HITS",70,130, + 2,0,1,game_state->tb1_font,game_state->virtual_1); + vmwSmallTextXY("TO DESTROY MY SHIP! DIE EARTH SCUM!!!!",70,140, + 2,0,1,game_state->tb1_font,game_state->virtual_1); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); + pauseawhile(5); + setupsidebar(game_state); + vmwFlipVirtual(game_state->virtual_1,game_state->virtual_2); +} + + /* The Sequence After You Defeat (hopefully) the Boss */ +void afterboss(struct tb1_state *game_state) +{ + + vmw_font *tb1_font; + + tb1_font=game_state->tb1_font; + + vmwLoadPicPacked(0,0,game_state->virtual_3,0,1, + tb1_data_file("viewscr.tb1",game_state->path_to_data)); + vmwDrawBox(0,0,320,200,0,game_state->virtual_1); + vmwArbitraryCrossBlit(game_state->virtual_3,0,42,58,37, + game_state->virtual_1,10,10); + vmwSmallTextXY("HMM.. THEY DON'T BUILD SUPERIOR",70,10, + 9,0,1,tb1_font,game_state->virtual_1); + vmwSmallTextXY("TECHNOLOGY LIKE THEY USED TO.",70,20, + 9,0,1,tb1_font,game_state->virtual_1); + vmwSmallTextXY("I GUESS I CAN GO HOME NOW.",70,30, + 9,0,1,tb1_font,game_state->virtual_1); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); + pauseawhile(5); + + vmwArbitraryCrossBlit(game_state->virtual_3,0,5,58,37, + game_state->virtual_1,10,50); + vmwSmallTextXY("NOT SO FAST! YOU JUST DESTROYED AN ANTIQUATED",70,50, + 2,0,1,tb1_font,game_state->virtual_1); + vmwSmallTextXY("DEFENSE SYSTEM THAT WAS PROGRAMMED BY A 16",70,60, + 2,0,1,tb1_font,game_state->virtual_1); + vmwSmallTextXY("YEAR OLD! OUR MAIN DEFENSE PROGRAMMER HAS ",70,70, + 2,0,1,tb1_font,game_state->virtual_1); + vmwSmallTextXY("MUCH MORE SKILL NOW! UNLESS YOU DESTROY OUR",70,80, + 2,0,1,tb1_font,game_state->virtual_1); + vmwSmallTextXY("ENTIRE XENOCIDE... I MEAN PEACE... ENVOY",70,90, + 2,0,1,tb1_font,game_state->virtual_1); + vmwSmallTextXY("WE WILL STILL DESTROY YOUR HOME PLANET.",70,100, + 2,0,1,tb1_font,game_state->virtual_1); + vmwSmallTextXY("NICE TRY PUNY EARTHLING!",70,110,2, + 0,1,tb1_font,game_state->virtual_1); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); + pauseawhile(7); + + vmwArbitraryCrossBlit(game_state->virtual_3,0,42,58,37, + game_state->virtual_1,10,130); + vmwSmallTextXY("HMM.. I GUESS I BETTER SAVE THE EARTH.",70,130, + 9,0,1,tb1_font,game_state->virtual_1); + vmwSmallTextXY("I'D BETTER SAVE MY GAME TOO.",70,140, + 9,0,1,tb1_font,game_state->virtual_1); + vmwSmallTextXY("D'OH! I''M OUT OF BIG MISSILES! ",70,150, + 9,0,1,tb1_font,game_state->virtual_1); + vmwSmallTextXY("WELL AT LEAST I HAVE SOME SMALLER SPARES.",70,160, + 9,0,1,tb1_font,game_state->virtual_1); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); + pauseawhile(5); + +} + + + + /* Defines the behavior of the objects in level 1 */ +int level_one_behavior(int reset, struct tb1_state *game_state) +{ + 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(game_state); + 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 Main Level One */ +void levelone(struct tb1_state *game_state) { + + int ch=0,shield_color=0; + int i,j,grapherror; + char tempst[300]; + int itemp,whatdelay=1,levelover=0; + int shipx=36,shipadd=0,shipframe=1; + struct vmwSprite *bigship1,*bigship2,*bigship3; + struct vmwSprite *shapetable[20]; + long oldsec,oldusec,time_spent; + int howmuchscroll=0; + int speed_factor=1,game_paused=0; + int beginscore,beginshield; + + unsigned char *virtual_1,*virtual_2; + vmw_font *tb1_font; + + /* For convenience */ + tb1_font=game_state->tb1_font; + virtual_1=game_state->virtual_1; + virtual_2=game_state->virtual_2; + + /* Set this up for Save Game */ + beginscore=game_state->score; + beginshield=game_state->shields; + + /* Load Sprites */ + grapherror=vmwLoadPicPacked(0,0,virtual_1,1,1, + tb1_data_file("ships.tb1",game_state->path_to_data)); + + bigship1=vmwGetSprite(0,0,48,30,virtual_1); + bigship2=vmwGetSprite(0,32,48,30,virtual_1); + bigship3=vmwGetSprite(0,64,48,30,virtual_1); + + grapherror=vmwLoadPicPacked(0,0,virtual_1,1,1, + tb1_data_file("tbshapes.tb1",game_state->path_to_data)); + + for(j=0;j<2;j++) + for(i=0;i<10;i++) + shapetable[(j*10)+i]=vmwGetSprite(1+(i*19),1+(j*19),18,18, + virtual_1); + + /* 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; + } + + /* Draw the Little Box announcing the Start of the Level */ + + vmwDrawBox(0,0,320,200,0,virtual_1); + coolbox(70,85,240,120,1,virtual_1); + vmwTextXY(" LEVEL ONE:",84,95,4,7,0,tb1_font,virtual_1); + vmwTextXY("INANIMATE OBJECTS",84,105,4,7,0,tb1_font,virtual_1); + vmwBlitMemToSDL(game_state->sdl_screen, virtual_1); + + + /* Setup and draw the sidebar */ + setupsidebar(game_state); + + vmwFlipVirtual(virtual_1,virtual_2); + sprintf(tempst,"%d",game_state->level); + vmwDrawBox(251,52,63,7,0,virtual_2); + vmwTextXY(tempst,307,51,12,0,0,tb1_font,virtual_2); + + /* Clear the screen and draw the stars */ + vmwDrawBox(0,0,320,400,0,virtual_2); + for(i=0;i<100;i++) { + vmwPutSprite(shapetable[11],rand()%238,rand()%380,0,virtual_2); + vmwPutSprite(shapetable[12],rand()%238,rand()%380,0,virtual_2); + } + change_shields(game_state); + + /* Initiate some last variables */ + level_one_behavior(1,game_state); + 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(virtual_2,0,howmuchscroll,240, + 400-howmuchscroll, + virtual_1,0,0); + vmwArbitraryCrossBlit(virtual_2,0,0,240,howmuchscroll-200, + virtual_1,0,400-howmuchscroll); + } + else { + vmwArbitraryCrossBlit(virtual_2,0,howmuchscroll,240,200, + virtual_1,0,0); + } + + + /* 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 (game_state->sound_enabled) + playGameFX(SND_KAPOW); + 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; + game_state->score+=10; + changescore(game_state); + } + } + } + } + + /* 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], + enemy[i].x,enemy[i].y,0, + virtual_1); + else if (enemy[i].dead) { + enemy[i].out=0; + enemy[i].exploding=0; + game_paused=level_one_behavior(0,game_state); + } + 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], + bullet[i].x,bullet[i].y,0, + virtual_1); + } + } + + /* MOVE ENEMIES */ + for(i=0;i<5;i++) { + if ((enemy[i].out) && (!enemy[i].dead)) { + vmwPutSprite(shapetable[enemy[i].kind-1], + enemy[i].x,enemy[i].y, + 0,virtual_1); + 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,game_state); + } + if (enemy[i].y>140) { + if (collision(shipx,165,24,15,enemy[i].x,enemy[i].y,9,9)) { + if (game_state->sound_enabled) + playGameFX(SND_BONK); + 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; + game_state->shields--; + if (game_state->shields<0) levelover=1; + if (game_state->shields>0) change_shields(game_state); + } + } + } + } + /* See if beat the level. Yes, bad variable name. Oh well */ + if (game_paused==9) { + afterboss(game_state); + game_state->level=2; + levelover=1; + } + + /* **READ KEYBOARD** */ + if ( (ch=vmwGetInput())!=0) { + switch(ch){ + case TB_ESCAPE: 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,virtual_1); + vmwTextXY("GAME PAUSED",79,95,4,7, + 0,tb1_font,virtual_1); + vmwBlitMemToSDL(game_state->sdl_screen,virtual_1); + while (vmwGetInput()==0) { + usleep(30000); + } + break; + case '-': whatdelay--; if (whatdelay<1) whatdelay=1; break; + case 'S': + case 's': if (game_state->sound_enabled) + game_state->sound_enabled=!(game_state->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 (game_state->sound_enabled) + playGameFX(SND_CC); + bullet[j].out=1; + bullet[j].x=shipx+15; + bullet[j].y=165; + vmwPutSprite(shapetable[0], + bullet[j].x, + bullet[j].y,0,virtual_1); + 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,shipx,165,shield_color,virtual_1); + break; + case 3: vmwPutSprite(bigship2,shipx,165,shield_color,virtual_1); + break; + case 2: + case 4: vmwPutSprite(bigship3,shipx,165,shield_color,virtual_1); + break; + } + shipframe++; + if (shipframe==5) shipframe=1; + + /* Flip Pages */ + + vmwBlitMemToSDL(game_state->sdl_screen,virtual_1); + + + /* 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; + } + } + +} + + /* The little opener before Level 1 */ +void littleopener(struct tb1_state *game_state) +{ + + struct vmwSprite *ship1,*ship2; + int i; + + vmwClearScreen(game_state->virtual_2,0); + + vmwLoadPicPacked(0,0,game_state->virtual_2,1,1, + tb1_data_file("moon2.tb1",game_state->path_to_data)); + vmwLoadPicPacked(0,0,game_state->virtual_2,1,0, + tb1_data_file("moon2.tb1",game_state->path_to_data)); + + ship1=vmwGetSprite(9,178,15,18,game_state->virtual_2); + ship2=vmwGetSprite(30,178,15,18,game_state->virtual_2); + vmwDrawBox(0,178,319,21,0,game_state->virtual_2); + + for(i=100;i>0;i--) { + vmwFlipVirtual(game_state->virtual_1,game_state->virtual_2); + vmwPutSprite(ship2,i*2,100,0,game_state->virtual_1); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); + usleep(30000); + if (vmwGetInput()) break; + } + vmwFlipVirtual(game_state->virtual_1,game_state->virtual_2); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); + + vmwTextXY(">KCHK< TOM! WHERE ARE YOU GOING?",5,180,15,0,1, + game_state->tb1_font,game_state->virtual_1); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); + pauseawhile(3); + vmwDrawBox(0,178,319,21,0,game_state->virtual_1); + vmwTextXY("Ooops. ",5,180,24,0,1,game_state->tb1_font,game_state->virtual_1); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); + pauseawhile(3); + for(i=0;i<151;i++) { + vmwFlipVirtual(game_state->virtual_1,game_state->virtual_2); + vmwPutSprite(ship1,i*2,100,0,game_state->virtual_1); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); + usleep(15000); + if (vmwGetInput()) break; + } + vmwFlipVirtual(game_state->virtual_1,game_state->virtual_2); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); + + vmwDrawBox(0,0,320,200,0,game_state->virtual_1); + vmwLoadPicPacked(0,0,game_state->virtual_1,1,0, + tb1_data_file("tbgorg.tb1",game_state->path_to_data)); + +} diff --git a/levels.h b/levels.h index 6ff9486..61b068e 100644 --- a/levels.h +++ b/levels.h @@ -1,4 +1,4 @@ -void levelone(int *level, int *shields,int *score); +void levelone(struct tb1_state *game_state); void littleopener(); void leveltwoengine(int *level, int *shields, int *score); void littleopener2(); diff --git a/procs.c b/procs.c deleted file mode 100644 index d2f372a..0000000 --- a/procs.c +++ /dev/null @@ -1,4142 +0,0 @@ -/*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 +#include +#include +#include +#include +#include "SDL.h" +#include "tb_keypress.h" + + +/* hard coded for now */ +#define X_WIDTH 320 +#define Y_HEIGHT 200 +#define BPP 2 /* Bytes Per Pixel, ie 16bpp */ + +//#define DEBUG 1 /* Until we get to Beta */ + +unsigned int global_palette[256]; + + +int vmwPack3Bytes(int r, int g, int b) { + + return ( ( ( (r>>3)&0x1f) <<11)+ + ( ( (g>>2)&0x3f) <<5)+ + ( ( (b>>3)&0x1f) ) ); +} + +void vmwLoadCustomPalette(int pal[256]) { + int i; + for (i=0;i<256;i++) { + global_palette[i]=pal[i]; + + } +} + + +void vmwBlitMemToSDL(SDL_Surface *target, unsigned char *source) { + + int x,y,Bpp; + + unsigned char *s_pointer,*t_pointer; + + + if ( SDL_MUSTLOCK(target) ) { + if ( SDL_LockSurface(target) < 0 ) + return; + } + + Bpp= target->format->BytesPerPixel; + + s_pointer=source; + t_pointer=((Uint8 *)target->pixels); + + for (x=0;x<320;x++) + for (y=0;y<200;y++) { + *((Uint16 *)(t_pointer))=*((Uint16 *)(s_pointer)); + s_pointer+=2; t_pointer+=2; + } + + + /* Update the display */ + if ( SDL_MUSTLOCK(target) ) { + SDL_UnlockSurface(target); + } + + /* Write this out to the screen */ + SDL_UpdateRect(target, 0, 0, 320, 200); + +} + + + + /*---------------------------------------------------------------*\ + | vmwPutPixel | + \*---------------------------------------------------------------*/ + +void vmwPutPixel(int x,int y,int color, unsigned char *target) { + Uint8 *bits; + +#ifdef DEBUG + if ( (y> (Y_HEIGHT-1) ) || (x> (X_WIDTH-1) ) ) { + printf("Out of bounds with PutPixel %i,%i\n",x,y); + return; + } +#endif + + /* Really Ugly SDL Framebuffer stuff */ + bits = ((Uint8 *)target)+(y*320+x)*2; + *((Uint16 *)(bits)) = global_palette[color]; + +} + +unsigned char vmwGetPixel(int x,int y, unsigned char *source) { + /* This is really hacked together, based on the old */ + /* 256 color palette model used by paintPro graphics */ + /* and the old pascal version of this game. I may try */ + /* to improve this in the future */ + + unsigned char i; + + for (i=0;i<255;i++) { + if (*(Uint16* )(((Uint8 *)source)+(y*320+x)*2)==global_palette[i]) + return i; + } + printf("Unknown color! This shouldn't happen!\n"); + return 0; + +} + + +void vmwClearScreen(unsigned char *target, int color) { + + int x,y; + + if (color==0) memset(target,0,320*200*2); + + else { /* Super in-efficient */ + for (x=0;x<320;x++) + for (y=0;y<200;y++) + vmwPutPixel(x,y,color,target); + } + +} + + /*---------------------------------------------------------------*\ + | vmwDrawHLine | + | This is really begging to be optimized. I am sure some | + | targets can do this in hardware | + \*---------------------------------------------------------------*/ + +void vmwDrawHLine(int xstart,int ystart,int how_long,int color, + unsigned char *target) { + + int i; + + for(i=0;i6\n",header); + return 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"); + return 4; + } + + /* Split 48 bits into two 32 bit values */ + xsize=(temp2>>4)+(temp1<<4); + ysize=((temp2-((temp2>>4)<<4))<<16)+temp3; + + temp1=buffer[buffpointer]; + temp2=buffer[buffpointer+1]; + temp3=buffer[buffpointer+2]; + buffpointer+=3; + if (buffpointer>=errorlev) { + printf("PPRO error... Early end of file.\n"); + return 4; + } + + numcolors=(temp2>>4)+(temp1<<4); + + picwidth=xsize+1; + picheight=ysize+1; + /*Load Palette*/ + if (numcolors!=256) printf("%d colors is not supported yet.\n",numcolors); + + /* Fun and games to convert the 24 bit color in paintpro to */ + /* 565 packed 16bit RGB */ + + for(i=0;i<256;i++) { + temp_palette[i]=vmwPack3Bytes(buffer[buffpointer], + buffer[buffpointer+1], + buffer[buffpointer+2]); + buffpointer+=3; + if (buffpointer>=errorlev) { + if (errorlev==300) { + errorlev=fread(buffer,1,300,fff); + buffpointer=0; + } + else { + lastread=1; + } + } + } + + if (LoadPal) { + for (i=0;i<256;i++) global_palette[i]=temp_palette[i]; + } + + + x=x1; + y=y1; + + while ((!lastread)&&(LoadPic)&&(y=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 greater than 2047, we have two single pixels */ + /* of color int1-2048 and int2-2048 */ + if (int1>2047) { + vmwPutPixel(x,y,int1-2048,target); + x++; + if (x>xsize+x1) { + x=x1; y++; +// if (y>ysize-1) { +// printf("Blargh 1\n"); y--; +// } + } + vmwPutPixel(x,y,int2-2048,target); + x++; + if (x>xsize+x1){ + x=x1;y++; +// if (y>ysize) { +// printf("Blargh 2\n"); +// y--; +// } + } + } + else { /* Standard paintpro format */ + col=int1; + numacross=int2; + while ((x+numacross)>(xsize+x1)) { + vmwDrawHLine(x,y,((xsize+x1)-x),col,target); + numacross=numacross-((xsize+1)-x); + x=x1; + y++; + if (y>y1+ysize-1) { + printf("Blrgh 3\n"); + } + } + if ((numacross!=0) && (yxsize+x-1) numacross--; /* Stupid x overflow */ + vmwDrawHLine(x,y,numacross,col,target); + } + x=x+numacross; + } + } + + if (fff!=NULL) fclose(fff); + return 0; +} + + +void clear_keyboard_buffer() { + SDL_Event event; + while (SDL_PollEvent(&event)) { + + } +} + +void pauseawhile(int howlong) { + + struct timeval bob; + struct timezone mree; + long begin_s,begin_u; + + SDL_Event event; + + clear_keyboard_buffer(); + gettimeofday(&bob,&mree); + begin_s=bob.tv_sec; begin_u=bob.tv_usec; + while ((bob.tv_sec-begin_s)=y_start) && (yy<=y_stop)) ) + memcpy(dest+(stride_factor*(xx+x)),(src+xx),stride_factor); + // **(dest+xx+x)=15; + src+=w; + dest+=dest_stride; + } + */ + return 0; + +} + + + +vmw_font *vmwLoadFont(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))&&(fontyfont_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,unsigned char *target) +{ + int i,xx,len; + len=strlen(st); + for(i=0;ifont_data[(st[i]*font->height)+line])&(128>>xx) ) + vmwPutPixel((x+(i*8)+xx),y,col,target); + else + vmwPutPixel((x+(i*8)+xx),y,background,target); + } +} + + +void vmwTextLine(char *st,int x,int y,int col,int background,int line, + vmw_font *font,unsigned char *target) +{ + int i,len,xx; + len=strlen(st); + for(i=0;ifont_data[(st[i]*16)+line])) + &(128>>xx) ) { + vmwPutPixel(x+(i*8)+xx,y,col,target); + } +} + +void vmwTextXY(char *st,int x,int y,int col,int background,int overwrite, + vmw_font *font,unsigned char *target) +{ + 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) ) + vmwPutPixel((x+(i*8)+xx),y+lineon,col,target); + else + if(overwrite) vmwPutPixel((x+(i*8)+xx),y+lineon,background,target); + } + } + /*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,unsigned char *target) +{ + 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) ) + vmwPutPixel((x+(i*5)+xx),y+lineon,col,target); + else + if(overwrite) vmwPutPixel((x+(i*5)+xx),y+lineon,background,target); + } + } +} + +/* + +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 (s + +/* linux only, at the moment */ + +static Mix_Music *music; + +#define NUM_GAME_FX 8 + +static Mix_Chunk *game_fx[NUM_GAME_FX]; + +static char *game_fx_names[] = { + "tb_ahh.wav", + "tb_cc.wav", + "tb_kapow.wav", + "tb_scream.wav", + "tb_bonk.wav", + "tb_click.wav", + "tb_ow.wav", + "tb_zrrp.wav" +}; + +void loadFX(char *path_to_data) { + int i; + char *path; + + for(i = 0; i < NUM_GAME_FX; i++) { + path=tb1_data_file(game_fx_names[i],path_to_data); + + if(path) { + game_fx[i] = Mix_LoadWAV(path); + free(path); + } + } +} + +int initSound(char *path_to_data) { + /* open the audio device */ + if(Mix_OpenAudio(22050, AUDIO_U16, 1, 1024) < 0) { + fprintf(stderr, "can't open audio: %s\n", SDL_GetError()); + exit(2); + } + loadFX(path_to_data); + return 0; +} + + +void shutdownSound() { + Mix_CloseAudio(); +} + + +int loadSound(char *name) { + music = Mix_LoadMUS(name); + return 0; +} + +int playSound() { + if( ! Mix_PlayingMusic() ) + Mix_PlayMusic(music, -1); + /* todo: remove the following once the bug in SDL_mixer is fixed */ + /* we don't want too many references to game objects here */ +// setMusicVolume(game->settings->musicVolume); + return 0; +} + +int stopSound() { + if( Mix_PlayingMusic() ) + Mix_HaltMusic(); + return 0; +} + +void soundIdle() { + /* sdl_mixer uses pthreads, so no work here */ + return; +} + +void playGameFX(int fx) { + Mix_PlayChannel(-1, game_fx[fx], 0); +// fprintf(stderr, "fx on channel %d\n", Mix_PlayChannel(-1, game_fx[fx], 0)); +} + + +void setMusicVolume(float volume) { + if(volume > 1) volume = 1; + if(volume < 0) volume = 0; + + Mix_VolumeMusic((int)(volume * 128)); +} + +void setFxVolume(float volume) { + if(volume > 1) volume = 1; + if(volume < 0) volume = 0; + + Mix_Volume(-1, (int)(volume * 128)); +} diff --git a/sound.h b/sound.h new file mode 100644 index 0000000..90e4a67 --- /dev/null +++ b/sound.h @@ -0,0 +1,28 @@ +#ifndef SOUND_H +#define SOUND_H + +#include +#include + +int initSound(); +void shutdownSound(); + +int loadSound(char *name); +int playSound(); +int stopSound(); +void deleteSound(); +void soundIdle(); + +void setMusicVolume(float volume); +void setFxVolume(float volume); + +void playGameFX(int fx); +void playMenuFX(int fx); + +void playEngine(); +void stopEngine(); + +enum game_fx { fx_engine=0, fx_start, fx_crash, fx_win, fx_lose }; +enum menu_fx { fx_action=0, fx_highlight }; + +#endif diff --git a/soundIt.c b/soundIt.c deleted file mode 100644 index 5f0b2e8..0000000 --- a/soundIt.c +++ /dev/null @@ -1,713 +0,0 @@ - -/* SoundIt library 0.04 - - Copyright 1994 Brad Pitzel pitzel@cs.sfu.ca - - Adapted to Solaris/SunOS and HPUX by Peter Ekberg. - - Feel free to use/distribute/modify as long as proper credits - are included. -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#if defined(HAVE_LINUX_SOUND) -# include - -#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 deleted file mode 100644 index 97c8c07..0000000 --- a/soundIt.h +++ /dev/null @@ -1,91 +0,0 @@ - -/* 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 deleted file mode 100644 index 89b5d1b..0000000 --- a/svmwgrap.c +++ /dev/null @@ -1,799 +0,0 @@ -#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 @@ -18,141 +20,37 @@ #include #include -#include - -#include "svmwgrap.h" +#include "SDL.h" +#include "sdl_svmwgraph.h" +#include "tb1_state.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 *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; +#include "tb_keypress.h" +#include "sound.h" /* Setup the Graphics */ -int setup_graphics(int force_8bpp) +int setup_graphics(struct tb1_state *state) { - int err; - ggi_mode mode; - int vx,vy,sx,sy; - if (ggiInit()) { - fprintf(stderr,"Cannot initialize libGGI!\n"); - return 1; + /* Initialize the SDL library */ + if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { + fprintf(stderr, + "Couldn't initialize SDL: %s\n", SDL_GetError()); + exit(1); + } + + /* Clean up on exit */ + atexit(SDL_Quit); + + /* Initialize the display in a 640x480 8-bit palettized mode */ + state->sdl_screen = SDL_SetVideoMode(320, 200, 16, SDL_SWSURFACE); + if ( state->sdl_screen == NULL ) { + fprintf(stderr, "Couldn't set 320x200x8 video mode: %s\n", + SDL_GetError()); + exit(1); } - vis=ggiOpen(NULL); - if(!vis) { - fprintf(stderr,"Cannot open default visual!\n"); - ggiExit(); - return 1; - } - /* Do I really want to do this? */ - ggiSetFlags(vis, GGIFLAG_ASYNC); - - 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; - } - mode.frames=3; - - if (ggiGetMode(vis,&mode)) { - fprintf(stderr,"Cannot set mode!\n"); - ggiClose(vis); - ggiExit(); - return 1; - } - - 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); - - /*dbuf_vis=ggiDBGetBuffer(vis,0);*/ - /*err = ggiDBGetBuffer (vis, &dbuf_vis);*/ - /*if (!(dbuf_vis=ggiDBGetBuffer(vis,0)) ) { - 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); + printf(" + SDL Graphics Initialization successful...\n"); + printf(" + Running TB1 in %dbpp Mode...\n",16); return 0; } @@ -174,14 +72,39 @@ int command_line_help(int show_version,char *runas) int main(int argc,char **argv) { - int i,grapherror,reloadpic=0,force_8bpp=0; - int ch,ch2,x,barpos,time_sec; - char *tempst[300]; + int i,grapherror,reloadpic=0; + int custom_palette[256]; + int ch,x,barpos,time_sec; FILE *fff; + unsigned char *virtual_1,*virtual_2; + + struct tb1_state *game_state; + + vmw_font *tb1_font; + + struct timeval time_info; + struct timezone dontcare; 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"); + /* Setup the game state */ + + if ( (game_state=calloc(1,sizeof(struct tb1_state)))==NULL) { + printf("You are seriously low on RAM!\n"); + return 3; + } + /* Some sane defaults */ + game_state->level=0; + game_state->shields=0; + game_state->score=0; + game_state->virtual_1=NULL; + game_state->virtual_2=NULL; + game_state->virtual_3=NULL; + game_state->sdl_screen=NULL; + game_state->sound_enabled=1; + game_state->tb1_font=NULL; + /* Parse Command Line Arguments */ i=1; while(isound_enabled=0; +// sound_possible=0; printf(" + Sound totally disabled\n"); break; case 'r': - read_only_mode=1; +// read_only_mode=1; printf(" + Read Only mode enabled\n"); break; default : command_line_help(0,argv[0]); @@ -218,18 +140,18 @@ int main(int argc,char **argv) /* Find the Data */ /* FIXME : User Defined Path Info*/ if ( (fff=fopen("./data/data_files_here","r"))!=NULL) { - strncpy(path_to_data,"./data/",20); + strncpy(game_state->path_to_data,"./data/",20); } else if ( (fff=fopen("/usr/local/games/tb1/data/data_files_here","r")) !=NULL) { - strncpy(path_to_data,"/usr/local/games/tb1/data/",40); + strncpy(game_state->path_to_data,"/usr/local/games/tb1/data/",40); } else { char tempst[200]; sprintf(tempst,"%s/.tb1/data/data_files_here",getenv("HOME")); if ( (fff=fopen(tempst,"r"))!=NULL) { - sprintf(path_to_data,"%s/.tb1/data/",getenv("HOME")); + sprintf(game_state->path_to_data,"%s/.tb1/data/",getenv("HOME")); } else { printf("ERROR! Could not find tb1 data!\n"); @@ -238,7 +160,7 @@ int main(int argc,char **argv) return 9; } } - printf(" + Found tb1 data in %s\n",path_to_data); + printf(" + Found tb1 data in %s\n",game_state->path_to_data); /* FIXME : find where writing info out to */ @@ -252,152 +174,146 @@ int main(int argc,char **argv) /* Randomize random number generator */ srandom(time(NULL)); + printf(" + Seeding random number generator...\n"); + + /* Load sounds */ + initSound(game_state->path_to_data); + loadSound(tb1_data_file("vmwfan.mod",game_state->path_to_data)); + + printf(" + Loaded sounds...\n"); /* Load the tom bombem font */ - tb1_font=LoadVMWFont(tb1_data_file("tbfont.tb1",(char *)tempst),8,16,256); + game_state->tb1_font=vmwLoadFont(tb1_data_file("tbfont.tb1",game_state->path_to_data),8,16,256); + printf(" + Loaded tb1 font...\n"); /* Setup Graphics */ - if (setup_graphics(force_8bpp)==2) { + if (setup_graphics(game_state)) { fprintf(stderr,"ERROR: Couldn't get display set up properly.\n"); return 2; } + + if ((game_state->virtual_1=calloc(320*200,2))==NULL) { + fprintf(stderr,"ERROR: Couldn't get RAM for virtual screen 1!\n"); + return 3; + } + if ((game_state->virtual_2=calloc(320*400,2))==NULL) { + fprintf(stderr,"ERROR: Couldn't get RAM for virtual screen 2!\n"); + return 3; + } + if ((game_state->virtual_3=calloc(320*200,2))==NULL) { + fprintf(stderr,"ERROR: Couldn't get RAM for virtual screen 3!\n"); + return 3; + } + + printf(" + Allocated virtual screens...\n"); + + /* To ease typing burden */ + virtual_1=game_state->virtual_1; + virtual_2=game_state->virtual_2; + tb1_font=game_state->tb1_font; + /* 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; - } + for(x=0;x<=40;x++) { + custom_palette[100+x]=vmwPack3Bytes( ((x+20)*4),0,0); + custom_palette[141+x]=vmwPack3Bytes(0,0, ( (x+20)*4 )); + custom_palette[182+x]=vmwPack3Bytes(0, ( (x+20)*4),0); } + /* 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; - + custom_palette[15]=vmwPack3Bytes(0xff,0xff,0xff); + /* Finalize Pallette Stuff */ - /*if (color_depth!=8) { - tb1_pal[15]=ggiMapColor(vis,&eight_bit_pal[15]); - } - else ggiSetPaletteVec(vis,0,256,eight_bit_pal); - */ + vmwLoadCustomPalette(custom_palette); + SDL_UpdateRect(game_state->sdl_screen, 0, 0, 0, 0); + + /* 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); + vmwDrawVLine(x+40,45,2*x,100+x,virtual_1); + vmwDrawVLine(x+120,45,2*x,141+x,virtual_1); + vmwDrawVLine(x+200,45,2*x,141+x,virtual_1); + vmwDrawVLine(x+80,125-(2*x),2*x,182+x,virtual_1); + vmwDrawVLine(x+160,125-(2*x),2*x,182+x,virtual_1); } 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)); + vmwDrawVLine(x+80,45,80-(2*x),140-x,virtual_1); + vmwDrawVLine(x+160,45,80-(2*x),181-x,virtual_1); + vmwDrawVLine(x+240,45,80-(2*x),181-x,virtual_1); + vmwDrawVLine(x+120,45+(2*x),80-(2*x),222-x,virtual_1); + vmwDrawVLine(x+200,45+(2*x),80-(2*x),222-x,virtual_1); } - ggiSetGCForeground(vis,tb1_pal[15]); - VMWtextxy("A VMW SOFTWARE PRODUCTION",60,140, - tb1_pal[15],tb1_pal[15],0,tb1_font,vis); - ggiFlush(vis); + vmwTextXY("A VMW SOFTWARE PRODUCTION",60,140, + 15,15,0,game_state->tb1_font,virtual_1); + + playSound(); + + vmwBlitMemToSDL(game_state->sdl_screen,virtual_1); pauseawhile(5); + + stopSound(); + loadSound(tb1_data_file("weave1.mod",game_state->path_to_data)); + /* Clear the Screen and get ready for the Menu */ - ggiSetGCForeground(vis,tb1_pal[0]); - ggiFillscreen(vis); + vmwClearScreen(virtual_1,0); /* 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); + grapherror=vmwLoadPicPacked(0,0,virtual_1,1,1, + tb1_data_file("tbomb1.tb1",game_state->path_to_data)); + grapherror=vmwLoadPicPacked(0,0,virtual_2,1,1, + tb1_data_file("tbomb1.tb1",game_state->path_to_data)); + vmwBlitMemToSDL(game_state->sdl_screen,virtual_1); + + /* 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); + grapherror=vmwLoadPicPacked(0,0,virtual_2,1,1, + tb1_data_file("tbomb1.tb1",game_state->path_to_data)); reloadpic=0; } - /*vmwCrossBlit(plb_vis->write,plb_vaddr2->read,plb_vis->stride,200);*/ - ggiFlush(vis); + vmwFlipVirtual(virtual_1,virtual_2); + playSound(); + + while (!vmwGetInput()) usleep(300); 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); + vmwTextXY("F1 HELP",0,190,9,7,0,tb1_font,virtual_1); + coolbox(117,61,199,140,1,virtual_1); + vmwBlitMemToSDL(game_state->sdl_screen,virtual_1); 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 (barpos==0) vmwTextXY("NEW GAME",123,67,32,0,1,tb1_font,virtual_1); + else vmwTextXY("NEW GAME",123,67,32,7,1,tb1_font,virtual_1); + if (barpos==1) vmwTextXY("OPTIONS",123,77,32,0,1,tb1_font,virtual_1); + else vmwTextXY("OPTIONS",123,77,32,7,1,tb1_font,virtual_1); + if (barpos==2) vmwTextXY("ABOUT",123,87,32,0,1,tb1_font,virtual_1); + else vmwTextXY("ABOUT",123,87,32,7,1,tb1_font,virtual_1); + if (barpos==3) vmwTextXY("LOAD GAME",123,97,32,0,1,tb1_font,virtual_1); + else vmwTextXY("LOAD GAME",123,97,32,7,1,tb1_font,virtual_1); + if (barpos==4) vmwTextXY("STORY",123,107,32,0,1,tb1_font,virtual_1); + else vmwTextXY("STORY",123,107,32,7,1,tb1_font,virtual_1); + if (barpos==5) vmwTextXY("CREDITS",123,117,32,0,1,tb1_font,virtual_1); + else vmwTextXY("CREDITS",123,117,32,7,1,tb1_font,virtual_1); + if (barpos==6) vmwTextXY("QUIT",123,127,32,0,1,tb1_font,virtual_1); + else vmwTextXY("QUIT",123,127,32,7,1,tb1_font,virtual_1); + + vmwBlitMemToSDL(game_state->sdl_screen,virtual_1); + /* If at title screen too long, run credits */ gettimeofday(&time_info,&dontcare); time_sec=time_info.tv_sec; - while( ((ch=get_input())==0)) { + + while( ((ch=vmwGetInput())==0)) { usleep(10); gettimeofday(&time_info,&dontcare); if (time_info.tv_sec-time_sec>40) { - credits(); + stopSound(); + credits(game_state); ch=TB_ENTER; barpos=9; reloadpic=1; @@ -407,34 +323,35 @@ int main(int argc,char **argv) } /* 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 */ + if (ch=='n') barpos=0; /*N*/ + if (ch=='o') barpos=1; /*O*/ + if (ch=='a') barpos=2; /*A*/ + if (ch=='l') barpos=3; /*L*/ + if (ch=='s') barpos=4; /*S*/ + if (ch=='c') barpos=5; /*C*/ + if (ch=='q') barpos=6; /*Q*/ + if (ch==TB_ESCAPE){ /* escape */ barpos=6; ch=TB_ENTER; } if(barpos==7) barpos=0; if(barpos<0) barpos=6; } + stopSound(); + /* 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; + case 0: playthegame(game_state); reloadpic=1; break; + case 1: options(game_state); reloadpic=1; break; + case 2: about(game_state); reloadpic=1; break; + case 3: loadgame(); reloadpic=1; break; + case 4: story(game_state); reloadpic=1; break; + case 5: credits(game_state); reloadpic=1; break; + case 6: barpos=quit(game_state); break; + case 10: help(game_state); break; } } } diff --git a/tb1_state.h b/tb1_state.h new file mode 100644 index 0000000..d80a0e9 --- /dev/null +++ b/tb1_state.h @@ -0,0 +1,13 @@ +struct tb1_state { + int level; + int shields; + int shield_color; + int score; + unsigned char *virtual_1; + unsigned char *virtual_2; + unsigned char *virtual_3; + SDL_Surface *sdl_screen; + int sound_enabled; + vmw_font *tb1_font; + char path_to_data[BUFSIZ]; +}; diff --git a/tb_keypress.h b/tb_keypress.h new file mode 100644 index 0000000..6221685 --- /dev/null +++ b/tb_keypress.h @@ -0,0 +1,11 @@ +#define TB_BACKSPACE 1024 +#define TB_ESCAPE 27 +#define TB_ENTER 1025 +#define TB_UP 1026 +#define TB_DOWN 1027 +#define TB_RIGHT 1028 +#define TB_LEFT 1029 +#define TB_F1 1030 +#define TB_F2 1031 +#define TB_PGUP 1032 +#define TB_PGDN 1033 diff --git a/tblib.c b/tblib.c index b901dce..fcebc9c 100644 --- a/tblib.c +++ b/tblib.c @@ -5,81 +5,50 @@ #include #include #include -#include -#include -#include "soundIt.h" -#include "svmwgrap.h" +#include + +#include "sdl_svmwgraph.h" +#include "tb1_state.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 - +#include "tb_keypress.h" +#include "string.h" +#include "sound.h" /* Convenience Function */ -int change_shields(int *shields) +int change_shields(struct tb1_state *game_state) { + int itemp,jtemp; + + game_state->shield_color=(game_state->shields)*0x1000; - 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) + vmwDrawBox(250,71,64,8,0,game_state->virtual_1); + for(itemp=0;itemp<(game_state->shields)*4;itemp+=4) for(jtemp=71;jtemp<79;jtemp++) { - ggiSetGCForeground(vaddr,tb1_pal[47-(itemp/4)]); - ggiDrawHLine(vaddr,250+itemp,jtemp,4); + vmwDrawHLine(250+itemp,jtemp,4,(47-(itemp/4)),game_state->virtual_1); } - return 0; } /* TSIA [well actually FNSIA (function name says it all) */ -int changescore(int score,int *shields) +int changescore(struct tb1_state *game_state) { + char scorest[20]; + unsigned char *vaddr; + vmw_font *tb1_font; - 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); + tb1_font=game_state->tb1_font; + vaddr=game_state->virtual_1; + + sprintf(scorest,"%d",game_state->score); + vmwTextXY(scorest,317-(strlen(scorest)*9),11, + 12,0,1,tb1_font,vaddr); + if ( ((game_state->score % 400)==0) && (game_state->shields<16) ) { + if (game_state->sound_enabled) + playGameFX(/*SND_ZRRP*/7); + game_state->shields++; + change_shields(game_state); } return 0; } @@ -94,82 +63,27 @@ int collision(x1,y1,xsize,ysize,x2,y2,x2size,y2size) return 0; } -char *tb1_data_file(char *name, char *store) +char *tb1_data_file(char *name,char *path) { - sprintf(store,"%s/%s",path_to_data,name); - return store; -} - -int get_input() { - - int evmask; - ggi_event event; - struct timeval t={0,0}; - /*evmask=emKeyPress|emKeyRelease|emPointer;*/ - - if (ggiEventPoll(vis,emKey,&t)) { - ggiEventRead(vis,&event,emKey); - if (event.any.type==evKeyPress) { - switch(event.key.sym) { - case GIIK_Up: /* CrSr up */ - case GIIK_P8: /* Keypad 8 */ - return TB_UP;break; - case GIIK_Down: /* CrSr down */ - case GIIK_P2: /* Keypad 2 */ - return TB_DOWN;break; - case GIIK_Right: /* CrSr right */ - case GIIK_P6: /* CrSr right */ - return TB_RIGHT;break; - case GIIK_Left: /* CrSr left */ - case GIIK_P4: /* CrSr left */ - return TB_LEFT;break; - case GIIK_F1: - return TB_F1;break; - case GIIK_F2: - return TB_F2;break; - case GIIK_Enter: /* enter */ - return TB_ENTER;break; - default: - return event.key.sym; - /*printf("sym=%4x code=%4x\n",ev.key.sym,ev.key.code);*/break; - } - } - } - return 0; + char tempst[BUFSIZ]; + + sprintf(tempst,"%s/%s",path,name); + return strdup(tempst); } - -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) +void coolbox(int x1,int y1,int x2,int y2,int fill,unsigned char *target) { 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); + vmwDrawHLine(x1+i,y1+i,(x2-x1-i-i),31-i,target); + vmwDrawHLine(x1+i,y2-i,(x2-x1-i-i),31-i,target); + vmwDrawVLine(x1+i,y1+i,(y2-y1-i-i),31-i,target); + vmwDrawVLine(x2-i,y1+i,(y2-y1-i-i),31-i,target); } if (fill) { - ggiSetGCForeground(page,tb1_pal[7]); - for(i=y1+5;itb1_font; + target=game_state->virtual_1; + sdl_screen=game_state->sdl_screen; + + coolbox(90,75,230,125,1,target); + vmwTextXY("QUIT??? ARE YOU",97,82,9,7,0,tb1_font,target); + vmwTextXY("ABSOLUTELY SURE?",97,90,9,7,0,tb1_font,target); - coolbox(90,75,230,125,1,vis); - VMWtextxy("QUIT??? ARE YOU",97,82,tb1_pal[9],tb1_pal[7],0,tb1_font,vis); - VMWtextxy("ABSOLUTELY SURE?",97,90,tb1_pal[9],tb1_pal[7],0,tb1_font,vis); while (ch!=TB_ENTER){ - if (barpos==0) VMWtextxy("YES-RIGHT NOW!",97,98,tb1_pal[150],tb1_pal[0],1,tb1_font,vis); - else VMWtextxy("YES-RIGHT NOW!",97,98,tb1_pal[150],tb1_pal[7],1,tb1_font,vis); - if (barpos==1) VMWtextxy("NO--NOT YET.",97,106,tb1_pal[150],tb1_pal[0],1,tb1_font,vis); - else VMWtextxy("NO--NOT YET.",97,106,tb1_pal[150],tb1_pal[7],1,tb1_font,vis); - while ( (ch=get_input())==0); - ch2=toupper(ch); + if (barpos==0) vmwTextXY("YES-RIGHT NOW!",97,98,150,0,1,tb1_font,target); + else vmwTextXY("YES-RIGHT NOW!",97,98,150,7,1,tb1_font,target); + if (barpos==1) vmwTextXY("NO--NOT YET.",97,106,150,0,1,tb1_font,target); + else vmwTextXY("NO--NOT YET.",97,106,150,7,1,tb1_font,target); + vmwBlitMemToSDL(sdl_screen,target); + + while ( !(ch=vmwGetInput()) ) { + usleep(30); + } if ((ch==TB_UP)||(ch==TB_DOWN)||(ch==TB_LEFT)||(ch==TB_RIGHT)) barpos++; - if (ch2=='Y') barpos=0; - if (ch2=='N') barpos=1; + if (ch=='y') barpos=0; + if (ch=='n') barpos=1; if (barpos==2) barpos=0; } if (barpos==0){ + shutdownSound(); close_graphics(); exit(1); } else return 6; - /*move(imagedata,screen,4000); textcolor(7);*/ + } -int showhiscore(int showchart) +int showhiscore(struct tb1_state *game_state,int showchart) { FILE *hilist; @@ -227,28 +157,33 @@ int showhiscore(int showchart) int scores[10]; hilist=fopen("hiscore.tb1","r+"); + if (hilist==NULL) { + printf("Error! can't open high score file!\n"); + return 0; + } + for (i=0;i<10;i++) fscanf(hilist,"%s",names[i]); for (i=0;i<10;i++) fscanf(hilist,"%i",&scores[i]); fclose(hilist); if (!showchart) return scores[0]; if (showchart) { - ggiSetGCForeground(vis,tb1_pal[7]); - ggiDrawBox(vis,45,40,240,120); - coolbox(45,40,285,160,1,vis); + vmwDrawBox(45,40,240,120,7,game_state->virtual_1); + coolbox(45,40,285,160,1,game_state->virtual_1); for(i=0;i<10;i++) - VMWtextxy(names[i],51,46+(i*10),tb1_pal[9],tb1_pal[7],1,tb1_font,vis); + vmwTextXY(names[i],51,46+(i*10),9,7,1,game_state->tb1_font,game_state->virtual_1); for(i=0;i<10;i++){ sprintf(tempstr,"%i",scores[i]); - VMWtextxy(tempstr,181,46+(i*10),tb1_pal[9],tb1_pal[7],1,tb1_font,vis); + vmwTextXY(tempstr,181,46+(i*10),9,7,1,game_state->tb1_font,game_state->virtual_1); } - ggiFlush(vis); - while(get_input()==0); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); + while(vmwGetInput()==0) usleep(100); } return 0; } void write_hs_list(int score,char *hiname) { +#if 0 int i,place; FILE *hilist; char names[10][25]; @@ -275,149 +210,159 @@ void write_hs_list(int score,char *hiname) for(i=0;i<9;i++) fprintf(hilist,"%i\n",scores[i]); fclose(hilist); } +#endif } -void help() +void help(struct tb1_state *game_state) { + unsigned char *vis; + vmw_font *tb1_font; + + vis=game_state->virtual_1; + tb1_font=game_state->tb1_font; + 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); + vmwTextXY("HELP",144,10,4,0,0,tb1_font,vis); + vmwTextXY("--------------------------------------",10,20, + 12,0,0,tb1_font,vis); + vmwTextXY("IN THE GAME:",10,30,4,0,0,tb1_font,vis); + vmwTextXY(" ARROWS MANUEVER",10,40, + 4,0,0,tb1_font,vis); + vmwTextXY(" SPACE BAR FIRES MISSILES",10,50, + 4,0,0,tb1_font,vis); + vmwTextXY(" F2 SAVES GAME",10,60, + 4,0,0,tb1_font,vis); + vmwTextXY(" P=PAUSE S=TOGGLE SOUND ESC=QUIT",10,70, + 4,0,0,tb1_font,vis); + vmwTextXY("--------------------------------------",10,80, + 12,0,0,tb1_font,vis); + vmwTextXY("MISSION: SHOOT THE INANIMATE OBJECTS",10,90, + 4,0,0,tb1_font,vis); + vmwTextXY(" WHY? WATCH THE STORY!",10,100, + 4,0,0,tb1_font,vis); + vmwTextXY("--------------------------------------",10,110, + 12,0,0,tb1_font,vis); + vmwTextXY("THE SPACE BAR SPEEDS UP MOVIE SCENES",10,120, + 4,0,0,tb1_font,vis); + vmwTextXY("ESC QUITS THEM",10,130, + 4,0,0,tb1_font,vis); + vmwTextXY("--------------------------------------",10,140, + 12,0,0,tb1_font,vis); + vmwTextXY(" SEE \"README\" FOR MORE HELP/INFO",10,150, + 4,0,0,tb1_font,vis); + vmwTextXY("--------------------------------------",10,160, + 12,0,0,tb1_font,vis); + vmwTextXY("PRESS ANY KEY TO CONTINUE",64,185, + 4,0,0,tb1_font,vis); + vmwBlitMemToSDL(game_state->sdl_screen,vis); + while(!vmwGetInput()) usleep(30); } -void makehole(ggi_visual_t vis,int y) +void makehole(int y,unsigned char *target) { - 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); + + vmwDrawBox(249,y,64,9,0,target); + vmwDrawHLine(249,y,65,24,target); + vmwDrawVLine(249,y,9,24,target); + vmwDrawHLine(249,y+10,64,18,target); + vmwDrawVLine(314,y+1,9,18,target); + } -void setupsidebar(int score,int hiscore,int shields) +void setupsidebar(struct tb1_state *game_state) { - int i; + + int i,hiscore; char it[50]; - ggiSetGCForeground(vaddr2,tb1_pal[19]); - ggiDrawBox(vaddr2,240,0,80,199); + unsigned char *vaddr2; + vmw_font *tb1_font; - ggiSetGCForeground(vaddr2,tb1_pal[18]); - ggiDrawVLine(vaddr2,240,0,199); - ggiDrawHLine(vaddr2,240,0,79); + tb1_font=game_state->tb1_font; + vaddr2=game_state->virtual_2; - 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); + vmwDrawBox(240,0,80,199,19,game_state->virtual_2); + + vmwDrawVLine(240,0,199,18,game_state->virtual_2); + vmwDrawHLine(240,0,79,18,game_state->virtual_2); - 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); + vmwDrawVLine(319,0,199,24,game_state->virtual_2); + vmwDrawHLine(241,199,78,24,game_state->virtual_2); + + printf("1\n"); fflush(stdout); + + vmwTextXY("SCORE",241,1,127,0,0,tb1_font,vaddr2); + vmwTextXY("SCORE",242,2,143,0,0,tb1_font,vaddr2); + makehole(10,vaddr2); + sprintf(it,"%d",game_state->score); + vmwTextXY(it,250+(8*(8-strlen(it))),11,12,0,1,tb1_font,vaddr2); + + printf("2\n"); fflush(stdout); + + + hiscore=showhiscore(game_state,0); + printf("show high done\n"); fflush(stdout); + + vmwTextXY("HI-SCORE",241,21,127,0,0,tb1_font,vaddr2); + vmwTextXY("HI-SCORE",242,22,143,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); + makehole(30,vaddr2); + vmwTextXY(it,250+(8*(8-strlen(it))),31,12,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); + printf("3\n"); fflush(stdout); - 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); + + vmwTextXY("LEVEL",241,41,127,0,0,tb1_font,vaddr2); + vmwTextXY("LEVEL",242,42,143,0,0,tb1_font,vaddr2); + makehole(50,vaddr2); + vmwTextXY("SHIELDS",241,61,127,0,0,tb1_font,vaddr2); + vmwTextXY("SHIELDS",242,62,143,0,0,tb1_font,vaddr2); + makehole(70,vaddr2); + for(i=0;i<(4*game_state->shields);i++) { + vmwDrawVLine(250+i,71,8,(47-(i/4)),vaddr2); + } + vmwTextXY("WEAPONS",241,81,127,0,0,tb1_font,vaddr2); + vmwTextXY("WEAPONS",242,82,143,0,0,tb1_font,vaddr2); + makehole(90,vaddr2); + + printf("4\n"); fflush(stdout); + + + vmwDrawBox(249,111,65,78,0,vaddr2); + + vmwDrawVLine(249,111,78,24,vaddr2); + vmwDrawHLine(249,111,66,24,vaddr2); + vmwDrawVLine(315,111,78,18,vaddr2); + vmwDrawHLine(249,189,66,18,vaddr2); + + printf("5\n"); fflush(stdout); + + + vmwTextXY(" TB1 ",250,114,2,0,0,tb1_font,vaddr2); + vmwTextXY(" TB1 ",251,115,10,0,0,tb1_font,vaddr2); + vmwTextXY("F1-HELP ",250,124,2,0,0,tb1_font,vaddr2); + vmwTextXY("F1-HELP ",251,125,10,0,0,tb1_font,vaddr2); + vmwTextXY("F2-SAVES",250,134,2,0,0,tb1_font,vaddr2); + vmwTextXY("F2-SAVES",251,135,10,0,0,tb1_font,vaddr2); + vmwTextXY("ESC-QUIT",250,144,2,0,0,tb1_font,vaddr2); + vmwTextXY("ESC-QUIT",251,145,10,0,0,tb1_font,vaddr2); + vmwTextXY("P-PAUSES",250,154,2,0,0,tb1_font,vaddr2); + vmwTextXY("P-PAUSES",251,155,10,0,0,tb1_font,vaddr2); + vmwTextXY("S-SOUND ",250,164,2,0,0,tb1_font,vaddr2); + vmwTextXY("S-SOUND ",251,165,10,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); + vmwTextXY("$HOME/.tb1",120,20,4],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); + vmwTextXY(tempst,120,20,4],0],0,tb1_font,vis); + vmwTextXY("WHERE TB1 STORES SAVED GAMES",20,30,4],0],0,tb1_font,vis); + vmwTextXY("DOES NOT EXIST. DO YOU WANT",20,40,4],0],0,tb1_font,vis); + vmwTextXY("TO CREATE THIS DIRECTORY?",20,50,4],0],0,tb1_font,vis); + vmwTextXY(" PLEASE ANSWER [Y or N]",20,60,4],0],0,tb1_font,vis); + vmwTextXY("NOTE IF YOU ANSWER \"N\" YOU",20,80,12],0],0,tb1_font,vis); + vmwTextXY("WILL NOT BE ABLE TO SAVE",20,90,12],0],0,tb1_font,vis); + vmwTextXY("GAMES",20,100,12],0],0,tb1_font,vis); ch='M'; clear_keyboard_buffer(); while( (ch!='Y') && (ch!='y') && (ch!='N') && (ch!='n')) { @@ -457,8 +402,8 @@ void savegame(int level,int begin_score,int begin_shields) 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); + vmwTextXY("WARNING! COULD NOT CREATE",30,30,4],0],0,tb1_font,vis); + vmwTextXY("DIRECTORY! ABANDONING SAVE!",20,40,4],0],0,tb1_font,vis); } } @@ -466,23 +411,23 @@ void savegame(int level,int begin_score,int begin_shields) } 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); + vmwTextXY("SAVE GAME",110,20,9],0],0,tb1_font,vis); + vmwTextXY("NOTE: THIS ONLY SAVES THE GAME",10,40,4],0],0,tb1_font,vis); + vmwTextXY("AT THE BEGINNING OF THE LEVEL!",10,50,4],0],0,tb1_font,vis); + vmwTextXY("ALREADY EXISTING GAMES",10,70,4],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); + vmwTextXY(tempst2,50+j*20,80,12],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); + if (j==0) vmwTextXY("NONE",140,90,12],0],0,tb1_font,vis); + vmwTextXY("PRESS NUMBER OF GAME TO SAVE",20,110,4],0],0,tb1_font,vis); + vmwTextXY("(0-9) [ESC CANCELS]",60,120,4],0],0,tb1_font,vis); ch='M'; clear_keyboard_buffer(); while( ((ch<'0') || (ch>='9')) && (ch!=TB_ESC)) { @@ -490,7 +435,7 @@ void savegame(int level,int begin_score,int begin_shields) } 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); + vmwTextXY("SAVE CANCELED",90,95,12],4],0,tb1_font,vis); } else { sprintf(save_game_name,"%s/sg%c.tb1",tempst,ch); @@ -499,75 +444,79 @@ void savegame(int level,int begin_score,int 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); + vmwTextXY(tempst,90,95,12],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("ERROR SAVING FILE!",70,90,12],0],0,tb1_font,vis); + vmwTextXY("GAME NOT SAVED!",80,100,12],0],0,tb1_font,vis); } } } - VMWtextxy("PRESS ANY KEY...",80,180,tb1_pal[4],tb1_pal[0],0,tb1_font,vis); + vmwTextXY("PRESS ANY KEY...",80,180,4],0],0,tb1_font,vis); while( (ch=get_input())==0) usleep(30); +#endif } void shadowrite(char *st,int x5,int y5,int forecol,int backcol, - ggi_visual_t vis) + vmw_font *tb1_font,unsigned char *target) { - 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); + vmwTextXY(st,x5+1,y5+1,backcol,0,0,tb1_font,target); + vmwTextXY(st,x5,y5,forecol,0,0,tb1_font,target); } -void options() +void options(struct tb1_state *game_state) { + int opbarpos,argh=0,ch=0; + vmw_font *tb1_font; - 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); + tb1_font=game_state->tb1_font; + + vmwClearScreen(game_state->virtual_1,8); + coolbox(0,0,319,199,0,game_state->virtual_1); + vmwTextXY("ESC QUITS",120,175,32,0,1,tb1_font,game_state->virtual_1); 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); + while(ch!=TB_ESCAPE) { + if (game_state->sound_enabled) { + if (opbarpos==0) vmwTextXY("SOUND ON ",30,30,32, + 7,1,tb1_font,game_state->virtual_1); + else vmwTextXY("SOUND ON ",30,30,32, + 0,1,tb1_font,game_state->virtual_1); } 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==0) vmwTextXY("NO SOUND ",30,30,32, + 7,1,tb1_font,game_state->virtual_1); + else vmwTextXY("NO SOUND ",30,30,32, + 0,1,tb1_font,game_state->virtual_1); } - 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); + if (opbarpos==1) vmwTextXY("VIEW HIGH SCORES",30,40,32, + 7,1,tb1_font,game_state->virtual_1); + else vmwTextXY("VIEW HIGH SCORES",30,40,32, + 0,1,tb1_font,game_state->virtual_1); - while( (ch=get_input())==0) usleep(30); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); + + while(!(ch=vmwGetInput()) ) 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==0)) game_state->sound_enabled=!game_state->sound_enabled; if ((ch==TB_ENTER) && (opbarpos==1)){ - ch=TB_ESC; + ch=TB_ESCAPE; argh=4; } if (opbarpos==2) opbarpos=0; if (opbarpos==-1) opbarpos=1; } - if (argh==4) showhiscore(1); + if (argh==4) showhiscore(game_state,1); } -void playthegame(int lev,int sc,int sh); - - void loadgame() { +#if 0 char tempst[300],tempst2[5],file_name[320]; int i,j; FILE *fff; @@ -576,7 +525,7 @@ void loadgame() 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); + vmwTextXY("LOAD GAME",110,10,9],0],0,tb1_font,vis); sprintf(tempst,"%s/.tb1",getenv("HOME")); @@ -585,21 +534,21 @@ void loadgame() 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); + vmwTextXY(tempst2,50+j*20,50,12],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); + vmwTextXY("NO SAVED GAMES FOUND",60,50,12],0],0,tb1_font,vis); + vmwTextXY("PRESS ANY KEY...",80,180,4],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); + vmwTextXY("LOAD WHICH GAME?",80,30,4],0],0,tb1_font,vis); + vmwTextXY("THE FOLLOWING EXIST:",40,40,4],0],0,tb1_font,vis); + vmwTextXY("PRESS A NUMBER. (ESC CANCELS)",20,60,4],0],0,tb1_font,vis); ch='M'; clear_keyboard_buffer(); IchLiebeMree: @@ -609,8 +558,8 @@ void loadgame() 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); + vmwTextXY("LOAD CANCELED",90,95,12],0],0,tb1_font,vis); + vmwTextXY("PRESS ANY KEY...",80,180,4],0],0,tb1_font,vis); while( (ch=get_input())==0) usleep(30); } else { @@ -623,9 +572,10 @@ void loadgame() } } } +#endif } -void story() +void story(struct tb1_state *game_state) { int error; int xtemp,ytemp; @@ -634,8 +584,11 @@ void story() char tempch; int alienchar; int cycles; - char *tempst[300]; -#if 0 + + vmw_font *tb1_font; + + tb1_font=game_state->tb1_font; + /* procedure doflames; begin @@ -673,10 +626,8 @@ begin 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); + vmwLoadPicPacked(0,0,game_state->virtual_2,1,1, + tb1_data_file("tbsobj.tb1",game_state->path_to_data)); /* for ytemp:=0 to 18 do for xtemp:=0 to 26 do begin @@ -710,126 +661,128 @@ 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); + vmwClearScreen(game_state->virtual_1,0); + vmwTextXY("THE STORY SO FAR...",20,20,4,0,0,tb1_font,game_state->virtual_1); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); 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); + vmwClearScreen(game_state->virtual_1,0); + vmwLoadPicPacked(0,0,game_state->virtual_2,1,1, + tb1_data_file("tbcobj.tb1",game_state->path_to_data)); + + vmwArbitraryCrossBlit(game_state->virtual_2,129,56,49,132, + game_state->virtual_1,10,10); + vmwTextXY("YOU ARE TOM BOMBEM, A STRANGE",80,10,1,0,0,tb1_font,game_state->virtual_1); + vmwTextXY(" BUT EFFICIENT MEMBER OF",80,20,1,0,0,tb1_font,game_state->virtual_1); + vmwTextXY(" THE LUNAR SPACE FORCE.",80,30,1,0,0,tb1_font,game_state->virtual_1); + vmwTextXY("YOU NEVER SAY MUCH AND YOU ARE",80,50,4,0,0,tb1_font,game_state->virtual_1); + vmwTextXY(" RARELY SEEN OUTSIDE OF",80,60,4,0,0,tb1_font,game_state->virtual_1); + vmwTextXY(" YOUR BLUE SPACESUIT.",80,70,4,0,0,tb1_font,game_state->virtual_1); + vmwTextXY("YOU OFTEN GET YOURSELF IN ",80,90,2,0,0,tb1_font,game_state->virtual_1); + vmwTextXY(" TROUBLE BY SCRATCHING",80,100,2,0,0,tb1_font,game_state->virtual_1); + vmwTextXY(" YOUR HEAD AT INAPPROPRIATE",80,110,2,0,0,tb1_font,game_state->virtual_1); + vmwTextXY(" TIMES.",80,120,2,0,0,tb1_font,game_state->virtual_1); + vmwTextXY("PRESS ANY KEY....",96,185,15,0,0,tb1_font,game_state->virtual_1); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); + pauseawhile(15); + + vmwClearScreen(game_state->virtual_1,0); + + vmwArbitraryCrossBlit(game_state->virtual_2,129,56,49,132, + game_state->virtual_1,260,10); + vmwArbitraryCrossBlit(game_state->virtual_2,99,104,29,81, + game_state->virtual_1,287,13); + + vmwTextXY("IT IS THE YEAR 2028.",10,10,1,0,0,tb1_font,game_state->virtual_1); + vmwTextXY("YOU HAVE BEEN SUMMONED BY",10,30,3,0,0,tb1_font,game_state->virtual_1); + vmwTextXY(" LUNAR DICTATOR-IN-CHIEF",10,40,3,0,0,tb1_font,game_state->virtual_1); + vmwTextXY(" VINCENT WEAVER ABOUT A",10,50,3,0,0,tb1_font,game_state->virtual_1); + vmwTextXY(" TOP SECRET THREAT TO ",10,60,3,0,0,tb1_font,game_state->virtual_1); + vmwTextXY(" INTERPLANETARY SECURITY.",10,70,3,0,0,tb1_font,game_state->virtual_1); + vmwTextXY("YOU ATTEND THE BRIEFING WITH",10,90,5,0,0,tb1_font,game_state->virtual_1); + vmwTextXY(" YOUR USUAL CONFUSED",10,100,5,0,0,tb1_font,game_state->virtual_1); + vmwTextXY(" QUIETNESS. YOU STILL DO",10,110,5,0,0,tb1_font,game_state->virtual_1); + vmwTextXY(" NOT UNDERSTAND YOUR OWN",10,120,5,0,0,tb1_font,game_state->virtual_1); + vmwTextXY(" SUCCESSFULNESS.",10,130,5,0,0,tb1_font,game_state->virtual_1); + vmwTextXY("PRESS ANY KEY....",96,185,15,0,0,tb1_font,game_state->virtual_1); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); + pauseawhile(12); + + vmwLoadPicPacked(0,0,game_state->virtual_1,1,1, + tb1_data_file("tbchief.tb1",game_state->path_to_data)); + + /* Save the area where the error will go */ + vmwArbitraryCrossBlit(game_state->virtual_1,115,55,91,59, + game_state->virtual_2,115,255); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); 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); + + vmwTextXY("Ahhh.... Mr. Bombem.... ",1,1,15,0,0,tb1_font,game_state->virtual_1); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); + if (game_state->sound_enabled) playGameFX(0); + pauseawhile(2); + + if (game_state->sound_enabled) playGameFX(2); + /* Show fake error message */ + vmwArbitraryCrossBlit(game_state->virtual_2,188,14,91,59, + game_state->virtual_1,115,55); + + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); + pauseawhile(6); + + /* Restore background where error was */ + vmwArbitraryCrossBlit(game_state->virtual_2,115,255,91,59, + game_state->virtual_1,115,55); + + vmwTextXY("I'll be brief. ",1,1,15,0,1,tb1_font,game_state->virtual_1); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); pauseawhile(5); - VMWtextxy("Do you know how this base was founded?",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + + vmwTextXY("Do you know how this base was founded?",1,1,15,0,1,tb1_font,game_state->virtual_1); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); pauseawhile(5); - VMWtextxy("No? Well watch the screen. ",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + + vmwTextXY("No? Well watch the screen. ",1,1,15,0,1,tb1_font,game_state->virtual_1); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); 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);*/ + /* Put picture on screen */ + vmwArbitraryCrossBlit(game_state->virtual_2,210,75,85,60, + game_state->virtual_1,210,136); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); + pauseawhile(4); /******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); + vmwLoadPicPacked(0,0,game_state->virtual_2,1,1, + tb1_data_file("tbma1.tb1",game_state->path_to_data)); - 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); + vmwSmallTextXY("MY WIFE AND I FOUNDED",212,3,14,0,0,tb1_font,game_state->virtual_2); + vmwSmallTextXY("THIS BASE IN 2008.",212,9,14,0,0,tb1_font,game_state->virtual_2); + vmwSmallTextXY("THE ONLY WAY TO ",212,16,13,0,0,tb1_font,game_state->virtual_2); + vmwSmallTextXY("FINANCE IT WAS TO",212,22,13,0,0,tb1_font,game_state->virtual_2); + vmwSmallTextXY("ENGAGE IN A DUBIOUS",212,28,13,0,0,tb1_font,game_state->virtual_2); + vmwSmallTextXY("BUSINESS.",212,34,13,0,0,tb1_font,game_state->virtual_2); + vmwSmallTextXY("WE LAUNCHED EARTH'S",212,41,12,0,0,tb1_font,game_state->virtual_2); + vmwSmallTextXY("TRASH INTO SPACE",212,47,12,0,0,tb1_font,game_state->virtual_2); + vmwSmallTextXY("FOR A PROFIT.",212,53,12,0,0,tb1_font,game_state->virtual_2); + vmwSmallTextXY("HERE IS FOOTAGE FROM",212,60,11,0,0,tb1_font,game_state->virtual_2); + vmwSmallTextXY("THE LAST LAUNCH EIGHT",212,66,11,0,0,tb1_font,game_state->virtual_2); + vmwSmallTextXY("YEARS AGO.",212,72,11,0,0,tb1_font,game_state->virtual_2); -/* vmwCrossBlit(plb_vaddr->write,plb_vaddr2->read,plb_vis->stride,200); -*/ + vmwFlipVirtual(game_state->virtual_1,game_state->virtual_2); + /* putshape(bargeoff,vaddr,16,18,141,157);*/ - /* vmwCrossBlit(plb_vis->write,plb_vaddr->read,plb_vis->stride,200); - pauseawhile(7);*/ + /* vmwCrossBlit(plb_vis->write,plb_vaddr->read,plb_vis->stride,200);*/ + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); + pauseawhile(7); + +#if 0 /* + 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); @@ -863,7 +816,7 @@ end; /****SECOND CHIEF*******/ - ggiSetGCForeground(vis,tb1_pal[0]); + ggiSetGCForeground(vis,0]); ggiDrawBox(vis,0,0,320,200); GGILoadPicPacked(0,0,vaddr2,1,1, tb1_data_file("tbcobj.tb1",(char *)tempst), @@ -877,13 +830,13 @@ end; 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); + vmwTextXY("You might wonder why this is important.",1,1,15],0],1,tb1_font,virtual_1); pauseawhile(6); - VMWtextxy("Last week we received a message. ",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + vmwTextXY("Last week we received a message. ",1,1,15],0],1,tb1_font,virtual_1); pauseawhile(6); - VMWtextxy("It is of extra-terrestrial origin. ",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + vmwTextXY("It is of extra-terrestrial origin. ",1,1,15],0],1,tb1_font,virtual_1); pauseawhile(6); - VMWtextxy("Watch the screen. ",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + vmwTextXY("Watch the screen. ",1,1,15],0],1,tb1_font,virtual_1); /*vmwArbitraryCrossBlit(plb_vaddr2->read,210,136,85,59, plb_vis->write,210,136,plb_vis->stride, @@ -942,19 +895,19 @@ end; 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); + vmwTextXY("GREETINGS EARTHLINGS.",0,162,12],0],0,tb1_font,virtual_1); + vmwTextXY("I AM GORGONZOLA THE REPULSIVE.",0,171,12],0],0,tb1_font,virtual_1); + vmwTextXY("YOU HAVE MADE A BIG MISTAKE.",0,180,12],0],0,tb1_font,virtual_1); 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); + vmwTextXY("YOUR SHIP FULL OF REFUSE HAS",0,162,12],0],1,tb1_font,virtual_1); + vmwTextXY("DAMAGED OUR OFFICIAL PEACE ",0,171,12],0],1,tb1_font,virtual_1); + vmwTextXY("ENVOY. IT WAS ON ITS WAY TO ",0,180,12],0],1,tb1_font,virtual_1); + vmwTextXY("YOUR PLANET. ",0,189,12],0],1,tb1_font,virtual_1); 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); + vmwTextXY("IN AN IRONIC FORM OF RETALLIATION",0,162,12],0],1,tb1_font,virtual_1); + vmwTextXY("WE HAVE MADE YOUR TRASH EVIL AND",0,171,12],0],1,tb1_font,virtual_1); + vmwTextXY("TURNED IT AGAINST YOU. ",0,180,12],0],1,tb1_font,virtual_1); + vmwTextXY(" DIE EARTH SCUM! ",0,189,12],0],1,tb1_font,virtual_1); pauseawhile(7); /****** THIRD CHIEF *******/ @@ -962,7 +915,7 @@ end; tb1_data_file("tbcobj.tb1",(char *)tempst), (ggi_color *)&eight_bit_pal, (ggi_pixel *)&tb1_pal,color_depth); - GGILoadPicPacked(0,0,vis,1,1, + GGILoadPicPacked(0,0,virtual_1,1,1, tb1_data_file("tbchief.tb1",(char *)tempst), (ggi_color *)&eight_bit_pal, (ggi_pixel *)&tb1_pal,color_depth); @@ -970,17 +923,17 @@ end; 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); + vmwTextXY("Tom, our radar detects approaching ",1,1,15],0],1,tb1_font,virtual_1); pauseawhile(6); - VMWtextxy("objects. They are inside the ",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + vmwTextXY("objects. They are inside the ",1,1,15],0],1,tb1_font,virtual_1); pauseawhile(6); - VMWtextxy("orbit of Jupiter. ",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + vmwTextXY("orbit of Jupiter. ",1,1,15],0],1,tb1_font,virtual_1); pauseawhile(6); - VMWtextxy("You are our only hope! ",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + vmwTextXY("You are our only hope! ",1,1,15],0],1,tb1_font,virtual_1); pauseawhile(6); - VMWtextxy("Will you fly our only spaceship ",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + vmwTextXY("Will you fly our only spaceship ",1,1,15],0],1,tb1_font,virtual_1); pauseawhile(6); - VMWtextxy("and save the human race? ",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + vmwTextXY("and save the human race? ",1,1,15],0],1,tb1_font,virtual_1); pauseawhile(6); vmwArbitraryCrossBlit(plb_vaddr2->read,5,16,39,82, plb_vis->write,146,59,plb_vis->stride, @@ -993,290 +946,271 @@ end; 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); + vmwTextXY("Scratch. Scratch. ",1,1,9],0],1,tb1_font,virtual_1); pauseawhile(5); - VMWtextxy("I knew you'd do it. Good Luck! ",1,1,tb1_pal[15],tb1_pal[0],1,tb1_font,vis); + vmwTextXY("I knew you'd do it. Good Luck! ",1,1,15],0],1,tb1_font,virtual_1); pauseawhile(6); - VMWtextxy(" ",1,1,tb1_pal[9],tb1_pal[0],1,tb1_font,vis); + vmwTextXY(" ",1,1,9],0],1,tb1_font,virtual_1); pauseawhile(10); #endif } -void credits() +void credits(struct tb1_state *game_state) { + int i,keypressed=0; - char *tempst[300]; - ggiSetGCForeground(vaddr2,tb1_pal[0]); - ggiDrawBox(vaddr2,0,0,320,400); + vmw_font *tb1_font; + + tb1_font=game_state->tb1_font; + + vmwDrawBox(0,0,320,400,0,game_state->virtual_2); + + vmwTextXY(" TOM BOMBEM",0,210,4,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" INVASION OF THE INANIMATE OBJECTS",0,220,4,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" PROGRAMMING",0,240,9,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" VINCENT M WEAVER",0,260,9,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" GRAPHICS",0,290,10,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" VINCENT M WEAVER",0,310,10,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" SOUND EFFECTS",0,340,11,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" VINCENT M WEAVER",0,360,11,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" GRAPHICS INSPIRATION",0,390,12,0,1,tb1_font,game_state->virtual_2); - 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); -#if 0 for(i=0;i<200;i++){ - vmwArbitraryCrossBlit(plb_vaddr2->read,0,i,320,200, - plb_vis->write,0,0, - plb_vis->stride,stride_factor); + vmwArbitraryCrossBlit(game_state->virtual_2,0,i,320,200, + game_state->virtual_1,0,0); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); usleep(30000); - if (get_input()!=0) { + if (vmwGetInput()) { 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); + vmwArbitraryCrossBlit(game_state->virtual_2,0,200,320,200, + game_state->virtual_1,0,0); + vmwArbitraryCrossBlit(game_state->virtual_1,0,0,320,200, + game_state->virtual_2,0,0); + vmwDrawBox(0,200,320,200,0,game_state->virtual_2); + + vmwTextXY(" JEFF WARWICK",0,210,12,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" GENERAL HELP",0,240,13,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" JOHN CLEMENS",0,260,13,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" JASON GRIMM",0,280,13,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" PCGPE AUTHORS, esp",0,310,14,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" GRANT SMITH",0,330,14,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" DOS SOUND BLASTER CODE",0,360,15,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" ETHAN BRODSKY",0,380,15,0,1,tb1_font,game_state->virtual_2); 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); + vmwArbitraryCrossBlit(game_state->virtual_2,0,i,320,200, + game_state->virtual_1,0,0); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); usleep(30000); - if (get_input()!=0) { + if (vmwGetInput()) { keypressed=1; break; } } - vmwArbitraryCrossBlit(plb_vaddr2->read,0,200,320,200, - plb_vaddr2->write,0,0, - plb_vaddr2->stride,stride_factor); + vmwArbitraryCrossBlit(game_state->virtual_2,0,200,320,200, + game_state->virtual_2,0,0); + + vmwDrawBox(0,200,320,200,0,game_state->virtual_2); - 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); + vmwTextXY(" GLTRON SOUND CODE",0,210,12,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" ANDREAS UMBACH",0,230,12,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" THANKS TO ALL THE DEVELOPERS",0,260,13,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" OF LINUX, ESPECIALLY",0,280,13,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" LINUS TORVALDS",0,300,13,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" ALSO SPECIAL THANKS TO",0,330,14,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" THE SDL DEVELOPMENT TEAM",0,350,14,0,1,tb1_font,game_state->virtual_2); 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); + vmwArbitraryCrossBlit(game_state->virtual_2,0,i,320,200, + game_state->virtual_1,0,0); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); usleep(30000); - if (get_input()!=0) { + if (vmwGetInput()) { keypressed=1; break; } } - vmwArbitraryCrossBlit(plb_vaddr2->read,0,200,320,200, - plb_vaddr2->write,0,0, - plb_vaddr2->stride,stride_factor); + vmwArbitraryCrossBlit(game_state->virtual_2,0,200,320,200, + game_state->virtual_2,0,0); - ggiSetGCForeground(vaddr2,tb1_pal[0]); - ggiDrawBox(vaddr2,0,200,320,400); + vmwDrawBox(0,200,320,200,0,game_state->virtual_2); - 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); + vmwTextXY(" INSPIRATION",0,210,9,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" DOUGLAS ADAMS",0,230,9,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" CLIFF STOLL",0,250,9,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" ARTHUR C CLARKE",0,270,9,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" ISAAC ASIMOV",0,290,9,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" GORDON KORMAN",0,310,9,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" THANKS TO ALL THE AGENTS",0,340,10,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" B,D,JL,L,N,P,S,W,PM,E,G,TK",0,360,10,0,1,tb1_font,game_state->virtual_2); + vmwTextXY(" AND ESPECIALLY MP",0,380,10,0,1,tb1_font,game_state->virtual_2); 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); + vmwArbitraryCrossBlit(game_state->virtual_2,0,i,320,200, + game_state->virtual_1,0,0); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); usleep(30000); - if (get_input()!=0) { + if (vmwGetInput()) { keypressed=1; break; } } - vmwArbitraryCrossBlit(plb_vaddr2->read,0,200,320,200, - plb_vaddr2->write,0,0, - plb_vaddr2->stride,stride_factor); + vmwArbitraryCrossBlit(game_state->virtual_2,0,200,320,200, + game_state->virtual_2,0,0); - GGILoadPicPacked(0,200,vaddr2,1,1, - tb1_data_file("tbomb1.tb1",(char *)tempst), - (ggi_color *)&eight_bit_pal, - (ggi_pixel *)&tb1_pal,color_depth); + vmwLoadPicPacked(0,200,game_state->virtual_2,1,1, + tb1_data_file("tbomb1.tb1",game_state->path_to_data)); if (keypressed) { - ggiSetGCForeground(vaddr2,tb1_pal[0]); - ggiDrawBox(vaddr2,0,0,320,200); + vmwDrawBox(0,0,320,200,0,game_state->virtual_2); } for(i=0;i<200;i++){ - vmwArbitraryCrossBlit(plb_vaddr2->read,0,i,320,200, - plb_vis->write,0,0, - plb_vis->stride,stride_factor); + vmwArbitraryCrossBlit(game_state->virtual_2,0,i,320,200, + game_state->virtual_1,0,0); + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); usleep(30000); - if (get_input()!=0) { + if (vmwGetInput()) { break; } } - vmwArbitraryCrossBlit(plb_vaddr2->read,0,200,320,200, - plb_vaddr2->write,0,0, - plb_vaddr2->stride,stride_factor); -#endif + vmwArbitraryCrossBlit(game_state->virtual_2,0,200,320,200, + game_state->virtual_1,0,0); + + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); + } -void about() +void about(struct tb1_state *game_state) { int pagenum=1,firstime=0,oldpagenum=0,numpages=4,ch=0; char tempst[300]; -#if 0 - - 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); + + vmw_font *tb1_font; + unsigned char *target1,*target2; + SDL_Surface *sdl_screen; - 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)); + tb1_font=game_state->tb1_font; + target1=game_state->virtual_1; + target2=game_state->virtual_2; + sdl_screen=game_state->sdl_screen; + + vmwClearScreen(target1,0); + + vmwLoadPicPacked(0,0,target2,1,1, + tb1_data_file("register.tb1",game_state->path_to_data)); + + while ((ch!=TB_ESCAPE)&&(ch!='q')){ + while(( (ch=vmwGetInput())==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_RIGHT) || (ch==TB_DOWN) || (ch==TB_PGDN)) 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);*/ + vmwFlipVirtual(target1,target2); + coolbox(0,0,319,199,0,target1); + shadowrite(" INFORMATION",10,10,9,1,tb1_font,target1); + shadowrite("I STARTED THIS GAME IN LATE",70,30,9,1,tb1_font,target1); + shadowrite(" 1994, WHEN I WAS 16.",70,40,9,1,tb1_font,target1); + shadowrite("I WROTE THIS GAME ENTIRELY IN",75,50,9,1,tb1_font,target1); + shadowrite(" MY FREE TIME.",74,60,9,1,tb1_font,target1); + shadowrite(" ^(AUTHOR 1N 1995)",10,70,10,2,tb1_font,target1); + shadowrite("ORIGINALLY THIS GAME WAS CODED IN",10,90,12,4,tb1_font,target1); + shadowrite(" TURBO PASCAL AND IN-LINE ASSEMBLY",10,100,12,4,tb1_font,target1); + shadowrite(" OPTIMIZED TO RUN ON A 386. NOW I",10,110,12,4,tb1_font,target1); + shadowrite(" HAVE PORTED IT TO LINUX AND SDL.",10,120,12,4,tb1_font,target1); + shadowrite(" IN THAT SPIRIT I HAVE NOW GPL'ED",10,130,12,4,tb1_font,target1); + shadowrite(" THE CODE.",10,140,12,4,tb1_font,target1); + } else coolbox(0,0,319,199,1,target1); + 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); + shadowrite("MY NAME IS VINCE WEAVER",10,10,10,2,tb1_font,target1); + shadowrite(" VISIT MY TALKER",10,20,10,2,tb1_font,target1); + shadowrite(" DERANGED.STUDENT.UMD.EDU 7000",10,30,10,2,tb1_font,target1); + shadowrite(" UP WHENEVER SCHOOL IS IN SESSION",10,40,10,2,tb1_font,target1); + shadowrite("UNTIL DECEMBER OF 2000 I WILL BE",10,60,13,5,tb1_font,target1); + shadowrite(" ATTENDING COLLEGE, AT THE UNIVERSITY",10,70,13,5,tb1_font,target1); + shadowrite(" OF MARYLAND, COLLEGE PARK.",10,80,13,5,tb1_font,target1); + shadowrite("GET THE NEWEST VERSION OF TB1 AT",10,100,11,3,tb1_font,target1); + shadowrite(" THE OFFICIAL TB1 WEB SITE:",10,110,11,3,tb1_font,target1); + shadowrite(" http://www.glue.umd.edu/~weave/tb1/",10,120,11,3,tb1_font,target1); + shadowrite("I CAN BE CONTACTED VIA E-MAIL AT:",10,140,12,4,tb1_font,target1); + shadowrite(" WEAVE@ENG.UMD.EDU",10,150,9,1,tb1_font,target1); + shadowrite("FEEL FREE TO SEND COMMENTS.",10,160,12,4,tb1_font,target1); } + 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); + shadowrite("OTHER VMW SOFTWARE PRODUCTIONS:",10,10,15,7,tb1_font,target1); + shadowrite(" PAINTPRO:",10,30,13,5,tb1_font,target1); + shadowrite(" LOAD AND SAVE GRAPHICS PICTURES",10,40,13,5,tb1_font,target1); + shadowrite(" LINUX_LOGO",10,50,11,3,tb1_font,target1); + shadowrite(" A USERLAND ANSI LOGIN DISPLAY",10,60,11,3,tb1_font,target1); + shadowrite(" SPACEWAR III:",10,70,9,1,tb1_font,target1); + shadowrite(" NEVER COMPLETED GAME",10,80,9,1,tb1_font,target1); + shadowrite(" AITAS: (ADVENTURES IN TIME AND SPACE)",10,90,12,4,tb1_font,target1); + shadowrite(" A GAME I'VE BEEN WANTING TO WRITE",10,100,12,4,tb1_font,target1); + shadowrite(" FOR 5 YEARS. [INCOMPLETE]",10,110,12,4,tb1_font,target1); + shadowrite(" FONT_PRINT",10,120,9,1,tb1_font,target1); + shadowrite(" PRINT VGA FONTS IN DOS AND LINUX",10,130,9,1,tb1_font,target1); + shadowrite(" SEABATTLE:",10,140,13,5,tb1_font,target1); + shadowrite(" A BATTLESHIP CLONE CODED IN C",10,150,13,5,tb1_font,target1); } + 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); + shadowrite("DISCLAIMER:",10,10,12,14,tb1_font,target1); + shadowrite("* MY PROGRAMS SHOULD NOT DAMAGE YOUR *",8,30,12,4,tb1_font,target1); + shadowrite("* COMPUTER IN ANY WAY. PLEASE DON'T *",8,40,12,4,tb1_font,target1); + shadowrite("* USE MY SOFTWARE IN CRITICAL *",8,50,12,4,tb1_font,target1); + shadowrite("* APPLICATIONS LIKE LIFE-SUPPORT *",8,60,12,4,tb1_font,target1); + shadowrite("* EQUIPMENT, DEFLECTOR SHIELDS, OR *",8,70,12,4,tb1_font,target1); + shadowrite("* AUTOMOBILE ENGINES. *",8,80,12,4,tb1_font,target1); + shadowrite("* LINUX FOREVER! THE OS FOR EVERYONE *",8,90,12,4,tb1_font,target1); + shadowrite("% WARRANTY ESPECIALLY VOID IF USED %",8,110,11,3,tb1_font,target1); + shadowrite("% ON ANY MICROSOFT(tm) OS (YUCK) %",8,120,11,3,tb1_font,target1); } sprintf(tempst,"Page %d of %d: ESC QUITS",pagenum,numpages); - shadowrite(tempst,50,180,15,7,vis); - - ggiFlush(vis); + shadowrite(tempst,50,180,15,7,tb1_font,target1); + vmwBlitMemToSDL(sdl_screen,target1); 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); -#endif } -void playthegame(int lev,int sc,int sh) +void playthegame(struct tb1_state *game_state) { - 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 (game_state->level==0) { + littleopener(game_state); + game_state->shields=12; + game_state->score=0; + game_state->level++; } - if (level==1) { - levelone(&level,&shields,&score); - if(level==2) littleopener2(); + if (game_state->level==1) { + levelone(game_state); +// if(level==2) littleopener2(); } - if (level==2) { - leveltwoengine(&level,&shields,&score); + if (game_state->level==2) { +// leveltwoengine(&level,&shields,&score); } - if (level==3) { + if (game_state->level==3) { /*littleopener3(); levelthree();*/ } - if (level==4) { - leveltwoengine(&level,&shields,&score); + if (game_state->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); + coolbox(70,85,170,110,1,game_state->virtual_1); + vmwTextXY("GAME OVER",84,95,4,7,0,game_state->tb1_font,game_state->virtual_1); + game_state->level=0; + vmwBlitMemToSDL(game_state->sdl_screen,game_state->virtual_1); clear_keyboard_buffer(); pauseawhile(20); @@ -1294,5 +1228,6 @@ void playthegame(int lev,int sc,int sh) fade; cls(0,vga); */ + } diff --git a/tblib.h b/tblib.h index bcb9a40..dc6e33d 100644 --- a/tblib.h +++ b/tblib.h @@ -1,16 +1,22 @@ -int change_shields(int *shields); -int changescore(int score,int *shields); +int change_shields(struct tb1_state *game_state); +int changescore(struct tb1_state *game_state); 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); +char *tb1_data_file(char *name,char *path); +int get_input(); +void coolbox(int x1,int y1,int x2,int y2,int fill,unsigned char *target); +int close_graphics(); +int quit(struct tb1_state *game_state); void ReadConfigFile(int CDROMmode); -int showhiscore(int showchart); +int showhiscore(struct tb1_state *game_state,int showchart); void write_hs_list(int score,char *hiname); void help(); -void setupsidebar(int score,int hiscore,int shields); +void setupsidebar(struct tb1_state *game_state); +void shadowrite(char *st,int x,int y,int forecol,int backcol,vmw_font *tb1_font,unsigned char *target); +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); +void about(struct tb1_state *game_state); +void playthegame(struct tb1_state *game_state); diff --git a/tbomb1.tb1 b/tbomb1.tb1 new file mode 100644 index 0000000000000000000000000000000000000000..a459058efdf1fa582e4bff9a369bbaedfa0844ce GIT binary patch literal 28650 zcmeHQU2J4$dH&ANoS8G;+4cTqce9&hLepp<+r*+FxJe2VSb`%q#n4qTt)))MhHU<) zWdT=O!c1@`o{+5u5{L;VSTsnc3Sg-gvf5SURz`Kj7R?1xEs?5IX)k<{3tw>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 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 literal 0 HcmV?d00001 diff --git a/vmw_sprite.c b/vmw_sprite.c new file mode 100644 index 0000000..5e2e417 --- /dev/null +++ b/vmw_sprite.c @@ -0,0 +1,52 @@ +#include "SDL.h" +#include "sdl_svmwgraph.h" +#include "vmw_sprite.h" +#include + +extern unsigned int global_palette[256]; + + +struct vmwSprite *vmwGetSprite(int x, int y, + int xsize, int ysize,unsigned char *screen) { + + struct vmwSprite *temp_sprite; + int xtemp,ytemp; + + temp_sprite=calloc(1,sizeof(struct vmwSprite)); + temp_sprite->spritedata=calloc(1,xsize*ysize); + temp_sprite->xsize=xsize; + temp_sprite->ysize=ysize; + + /* The following is very slow and can be easily optimized */ + + for(ytemp=0;ytempspritedata)+ytemp*xsize+xtemp)= + vmwGetPixel(xtemp+x,ytemp+y,screen); + + return temp_sprite; +} + +void vmwPutSprite(struct vmwSprite *sprite,int x,int y,int shield_color, + unsigned char *screen) { + + unsigned char *temp_source,*temp_destination; + int i=0,xx,yy; + + temp_source=sprite->spritedata; + temp_destination= ((Uint8 *)screen)+(y*320+x)*2; + + for (yy=0;yyysize;yy++) { + for (xx=0;xxxsize;xx++) { + + if (*temp_source!=0) { + *((Uint16 *)(temp_destination))=global_palette[*(temp_source)]; + } + temp_source++; + temp_destination+=2; + } + temp_destination+=((320-sprite->xsize)*2); + + } +} + diff --git a/vmw_sprite.h b/vmw_sprite.h new file mode 100644 index 0000000..fd82e8f --- /dev/null +++ b/vmw_sprite.h @@ -0,0 +1,10 @@ +struct vmwSprite { + int xsize; + int ysize; + unsigned char *spritedata; +}; + +struct vmwSprite *vmwGetSprite(int x, int y, int xsize, int ysize, unsigned char *source); +void vmwPutSprite(struct vmwSprite *sprite,int x,int y,int shield_color, + unsigned char *screen); +