ref: 6638e8580dee0e8691a54da80058be66ab78bcd4
parent: 8d4cb55cd3fc025418963128ee7f030f3cc13a5c
author: Konstantinn Bonnet <[email protected]>
date: Mon Feb 15 02:06:09 EST 2016
shuffle source
binary files a/DEICE.EXE /dev/null differ
--- /dev/null
+++ b/GOODSTUF
@@ -1,0 +1,56 @@
+To: ROMERO,TOM
+From: LOTHAR/JAY
+Date: 9 Aug 92 21:06:46
+Subject: AOL Message
+X-mailer: Pegasus Mail v2.3 (R2).
+
+Subj: DREAMS, FLASHBACKS
+Date: 92-08-09 03:59:55 EDT
+From: Tug Hill 2
+Posted on: America Online
+
+On a serious note...
+
+As a former POW (Vietnam), I hesitated to play WOLF for over a
+month after downloading as I feared flashbacks. I didn't want to
+remember all that I had been through all those years ago, when, as
+POW's, my friend and I decided an escape attempt would be better than
+a slow death by torture and starvation.
+
+My friend and I made crude maps and hoarded food. The day of the
+escape we clubbed the guard with stones, took his gun and fought our
+way through two levels of underground tunnels (only a few guards and
+had to crawl). I made it, my friend didn't.
+
+Dreams...NO! NIGHTMARES...YES!! However, the more I play
+WOLF the less frequently I have nightmares. The chilling part is
+turning a corner and seeing a guard with his gun drawn.
+
+WOLF is a powerful game. Fearful as well. I believe that a
+person should face the past. So... when I can play EPISODE 1
+comfortably (no nightmares), I plan on ordering the full series.
+
+Don't let a few bad dreams make you discard this game.
+
+-------------------------------------------------------------------------
+
+Subj: Wolf-3D Section: Action/Arcade Games
+From: Ty Graham 72350,2636 # 191387, * No Replies *
+To: Id Software 72600,1333 Date: 24-Jul-92 18:27:27
+
+Jay, just thought I'd drop a note to let you know how popular Wolf3D is
+here at Microsoft. It seems like I can't walk down a hall without hearing
+'Mein Leben' from someone's office. I hope you guys are getting revenue
+from all this.
+
+Anyway, we were sitting around talking the other day, discussing games for
+Windows, and someone said 'What are those cool guys at Id doing?'. So how
+about it. Are you guys looking at Win games at all? Win32?
+
+In a perfect world, I'd have you guys port the Wolf engine to a multiuser
+maze game for Windows for Workgroups. We need a good M'user Win game.
+
+Anyway some thoughts.
+
+Ty Graham (Microsoft)
+
--- a/INSTALL.BAT
+++ /dev/null
@@ -1,12 +1,0 @@
-@echo off
-DEICE.EXE
-if ERRORLEVEL == 1 GOTO END
-WOLFSRC.EXE -d
-if ERRORLEVEL == 1 GOTO ERROR
-DEL WOLFSRC.EXE
-GO
-goto END
-:ERROR
-echo Error installing WOLFSRC.EXE!
-:END
-
--- /dev/null
+++ b/LICENSE
@@ -1,0 +1,129 @@
+ LIMITED USE SOFTWARE LICENSE AGREEMENT
+
+ This Limited Use Software License Agreement (the "Agreement")
+is a legal agreement between you, the end-user, and Id Software, Inc.
+("ID"). By continuing the downloading of this Wolfenstein 3D
+(the "Trademark") software material, which includes source code
+(the "Source Code"), artwork data, music and software tools
+(collectively, the "Software"), you are agreeing to be bound by the
+terms of this Agreement. If you do not agree to the terms of this
+Agreement, promptly destroy the Software you may have downloaded.
+
+ID SOFTWARE LICENSE
+
+ Grant of License. ID grants to you the right to use one (1)
+copy of the Software on a single computer. You have no ownership or
+proprietary rights in or to the Software, or the Trademark. For purposes
+of this section, "use" means loading the Software into RAM, as well as
+installation on a hard disk or other storage device. The Software,
+together with any archive copy thereof, shall be destroyed when no longer
+used in accordance with this Agreement, or when the right to use the
+Software is terminated. You agree that the Software will not be shipped,
+transferred or exported into any country in violation of the U.S.
+Export Administration Act (or any other law governing such matters) and
+that you will not utilize, in any other manner, the Software in violation
+of any applicable law.
+
+ Permitted Uses. For educational purposes only, you, the end-user,
+may use portions of the Source Code, such as particular routines, to
+develop your own software, but may not duplicate the Source Code, except
+as noted in paragraph 4. The limited right referenced in the preceding
+sentence is hereinafter referred to as "Educational Use." By so exercising
+the Educational Use right you shall not obtain any ownership, copyright,
+proprietary or other interest in or to the Source Code, or any portion of
+the Source Code. You may dispose of your own software in your sole
+discretion. With the exception of the Educational Use right, you may not
+otherwise use the Software, or an portion of the Software, which includes
+the Source Code, for commercial gain.
+
+ Prohibited Uses: Under no circumstances shall you, the end-user,
+be permitted, allowed or authorized to commercially exploit the Software.
+Neither you nor anyone at your direction shall do any of the following acts
+with regard to the Software, or any portion thereof:
+
+ Rent;
+
+ Sell;
+
+ Lease;
+
+ Offer on a pay-per-play basis;
+
+ Distribute for money or any other consideration; or
+
+ In any other manner and through any medium whatsoever commercially
+exploit or use for any commercial purpose.
+
+Notwithstanding the foregoing prohibitions, you may commercially exploit the
+software you develop by exercising the Educational Use right, referenced in
+paragraph 2. hereinabove.
+
+ Copyright. The Software and all copyrights related thereto
+(including all characters and other images generated by the Software
+or depicted in the Software) are owned by ID and is protected by
+United States copyright laws and international treaty provisions.
+Id shall retain exclusive ownership and copyright in and to the Software
+and all portions of the Software and you shall have no ownership or other
+proprietary interest in such materials. You must treat the Software like
+any other copyrighted material, except that you may either (a) make one
+copy of the Software solely for back-up or archival purposes, or (b)
+transfer the Software to a single hard disk provided you keep the original
+solely for back-up or archival purposes. You may not otherwise reproduce,
+copy or disclose to others, in whole or in any part, the Software. You
+may not copy the written materials accompanying the Software. You agree
+to use your best efforts to see that any user of the Software licensed
+hereunder complies with this Agreement.
+
+ NO WARRANTIES. ID DISCLAIMS ALL WARRANTIES, BOTH EXPRESS IMPLIED,
+INCLUDING BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE WITH RESPECT TO THE SOFTWARE. THIS LIMITED
+WARRANTY GIVES YOU SPECIFIC LEGAL RIGHTS. YOU MAY HAVE OTHER RIGHTS WHICH
+VARY FROM JURISDICTION TO JURISDICTION. ID DOES NOT WARRANT THAT THE
+OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED, ERROR FREE OR MEET YOUR
+SPECIFIC REQUIREMENTS. THE WARRANTY SET FORTH ABOVE IS IN LIEU OF ALL OTHER
+EXPRESS WARRANTIES WHETHER ORAL OR WRITTEN. THE AGENTS, EMPLOYEES,
+DISTRIBUTORS, AND DEALERS OF ID ARE NOT AUTHORIZED TO MAKE MODIFICATIONS TO
+THIS WARRANTY, OR ADDITIONAL WARRANTIES ON BEHALF OF ID.
+
+ Exclusive Remedies. The Software is being offered to you free of any
+charge. You agree that you have no remedy against ID, its affiliates,
+contractors, suppliers, and agents for loss or damage caused by any defect
+or failure in the Software regardless of the form of action, whether in
+contract, tort, includinegligence, strict liability or otherwise, with
+regard to the Software. This Agreement shall be construed in accordance
+with and governed by the laws of the State of Texas. Copyright and other
+proprietary matters will be governed by United States laws and international
+treaties. IN ANY CASE, ID SHALL NOT BE LIABLE FOR LOSS OF DATA, LOSS OF
+PROFITS, LOST SAVINGS, SPECIAL, INCIDENTAL, CONSEQUENTIAL, INDIRECT OR OTHER
+SIMILAR DAMAGES ARISING FROM BREACH OF WARRANTY, BREACH OF CONTRACT,
+NEGLIGENCE, OR OTHER LEGAL THEORY EVEN IF ID OR ITS AGENT HAS BEEN ADVISED
+OF THE POSSIBILITY OF SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY.
+Some jurisdictions do not allow the exclusion or limitation of incidental or
+consequential damages, so the above limitation or exclusion may not apply to
+you.
+
+ General Provisions. Neither this Agreement nor any part or portion
+hereof shall be assigned, sublicensed or otherwise transferred by you.
+Should any provision of this Agreement be held to be void, invalid,
+unenforceable or illegal by a court, the validity and enforceability of the
+other provisions shall not be affected thereby. If any provision is
+determined to be unenforceable, you agree to a modification of such
+provision to provide for enforcement of the provision's intent, to the
+extent permitted by applicable law. Failure of a party to enforce any
+provision of this Agreement shall not constitute or be construed as a
+waiver of such provision or of the right to enforce such provision. If
+you fail to comply with any terms of this Agreement, YOUR LICENSE IS
+AUTOMATICALLY TERMINATED and you agree to the issuance of an injunction
+against you in favor of Id. You agree that Id shall not have to post
+bond or other security to obtain an injunction against you to prohibit
+you from violating Id's rights.
+
+ YOU ACKNOWLEDGE THAT YOU HAVE READ THIS AGREEMENT, THAT YOU
+UNDERSTAND THIS AGREEMENT, AND UNDERSTAND THAT BY CONTINUING THE
+DOWNLOADING OF THE SOFTWARE, YOU AGREE TO BE BOUND BY THIS AGREEMENT'S
+TERMS AND CONDITIONS. YOU FURTHER AGREE THAT, EXCEPT FOR WRITTEN SEPARATE
+AGREEMENTS BETWEEN ID AND YOU, THIS AGREEMENT IS A COMPLETE AND EXCLUSIVE
+STATEMENT OF THE RIGHTS AND LIABILITIES OF THE PARTIES. THIS AGREEMENT
+SUPERSEDES ALL PRIOR ORAL AGREEMENTS, PROPOSALS OR UNDERSTANDINGS, AND
+ANY OTHER COMMUNICATIONS BETWEEN ID AND YOU RELATING TO THE SUBJECT MATTER
+OF THIS AGREEMENT
--- /dev/null
+++ b/README
@@ -1,0 +1,8 @@
+NOTES:
+------
+
+This version will compile under BORLAND C++ 3.0/3.1 and compiled perfectly
+before it was uploaded.
+
+Please do not send your questions to id Software.
+
--- a/README.rst
+++ /dev/null
@@ -1,218 +1,0 @@
-Wolfenstein 3D
-==============
-
-The original source release was made using the ``DEICE.EXE``
-installer (DeIce) in the root directory. (Basically a way to
-split self-extracting zip files over multiple floppy disks.)
-After execution, that installer will create the contents of
-the ``WOLFSRC`` directory. In the "installed" directory, the
-the ``README.TXT``, ``RELEASE.TXT``, and ``LICENCE.DOC`` reside
-in the ``README`` directory. They are duplicated below.
-
-Travis "Ash" Bradshaw <[email protected]>
-
-February 6, 2012
-
-RELEASE.TXT
------------
-
-::
-
- We are releasing this code for the entertainment of the
- user community. We don't guarentee that anything even
- builds in here. Projects just seem to rot when you leave
- them alone for long periods of time.
-
- This is all the source we have relating to the original
- PC wolfenstein 3D project. We haven't looked at this
- stuff in years, and I would probably be horribly embarassed
- to dig through my old code, so please don't ask any questions
- about it. The original project was built in borland c++ 3.0.
- I think some minor changes were required for later versions.
-
- You will need the data from a released version of wolf or spear
- to use the exe built from this code. You can just use a
- shareware version if you are really cheap.
-
-
- Some coding comments in retrospect:
-
- The ray casting refresh architecture is still reasonably
- appropriate for the game. A BSP based texture mapper could
- go faster, but ray casting was a lot simpler to do at the time.
-
- The dynamically compiled scaling routines are now a Bad Thing.
- On uncached machines (the original target) they are the fastest
- possible way to scale walls, but on modern processors you just
- wind up thrashing the code cash and wrecking performance.
- A simple looping texture mapper would be faster on 486+ machines.
-
- The whole page manager caching scheme is unecessarily complex.
-
- Way too many #ifdefs in the code!
-
-
- Some project ideas with this code:
-
- Add new monsters or weapons.
-
- Add taller walls and vertical motion. This should only be
- done if the texture mapper is rewritten.
-
- Convert to a 32 bit compiler. This would be a fair amount
- of work, but I would hate to even mess with crusty old 16
- bit code. The code would get a LOT smaller.
-
- Make a multi-player game that runs on DOOM sersetup / ipxsetup drivers.
-
-
- Have fun...
-
- John Carmack
- Technical Director
- Id Software
-
-README.TXT
-----------
-
-NOTES:
-
-This version will compile under BORLAND C++ 3.0/3.1 and compiled perfectly
-before it was uploaded.
-
-Please do not send your questions to id Software.
-
-LICENCE.DOC
------------
-
- ::
- LIMITED USE SOFTWARE LICENSE AGREEMENT
-
- This Limited Use Software License Agreement (the "Agreement")
- is a legal agreement between you, the end-user, and Id Software, Inc.
- ("ID"). By continuing the downloading of this Wolfenstein 3D
- (the "Trademark") software material, which includes source code
- (the "Source Code"), artwork data, music and software tools
- (collectively, the "Software"), you are agreeing to be bound by the
- terms of this Agreement. If you do not agree to the terms of this
- Agreement, promptly destroy the Software you may have downloaded.
-
- ID SOFTWARE LICENSE
-
- Grant of License. ID grants to you the right to use one (1)
- copy of the Software on a single computer. You have no ownership or
- proprietary rights in or to the Software, or the Trademark. For purposes
- of this section, "use" means loading the Software into RAM, as well as
- installation on a hard disk or other storage device. The Software,
- together with any archive copy thereof, shall be destroyed when no longer
- used in accordance with this Agreement, or when the right to use the
- Software is terminated. You agree that the Software will not be shipped,
- transferred or exported into any country in violation of the U.S.
- Export Administration Act (or any other law governing such matters) and
- that you will not utilize, in any other manner, the Software in violation
- of any applicable law.
-
- Permitted Uses. For educational purposes only, you, the end-user,
- may use portions of the Source Code, such as particular routines, to
- develop your own software, but may not duplicate the Source Code, except
- as noted in paragraph 4. The limited right referenced in the preceding
- sentence is hereinafter referred to as "Educational Use." By so exercising
- the Educational Use right you shall not obtain any ownership, copyright,
- proprietary or other interest in or to the Source Code, or any portion of
- the Source Code. You may dispose of your own software in your sole
- discretion. With the exception of the Educational Use right, you may not
- otherwise use the Software, or an portion of the Software, which includes
- the Source Code, for commercial gain.
-
- Prohibited Uses: Under no circumstances shall you, the end-user,
- be permitted, allowed or authorized to commercially exploit the Software.
- Neither you nor anyone at your direction shall do any of the following acts
- with regard to the Software, or any portion thereof:
-
- Rent;
-
- Sell;
-
- Lease;
-
- Offer on a pay-per-play basis;
-
- Distribute for money or any other consideration; or
-
- In any other manner and through any medium whatsoever commercially
- exploit or use for any commercial purpose.
-
- Notwithstanding the foregoing prohibitions, you may commercially exploit the
- software you develop by exercising the Educational Use right, referenced in
- paragraph 2. hereinabove.
-
- Copyright. The Software and all copyrights related thereto
- (including all characters and other images generated by the Software
- or depicted in the Software) are owned by ID and is protected by
- United States copyright laws and international treaty provisions.
- Id shall retain exclusive ownership and copyright in and to the Software
- and all portions of the Software and you shall have no ownership or other
- proprietary interest in such materials. You must treat the Software like
- any other copyrighted material, except that you may either (a) make one
- copy of the Software solely for back-up or archival purposes, or (b)
- transfer the Software to a single hard disk provided you keep the original
- solely for back-up or archival purposes. You may not otherwise reproduce,
- copy or disclose to others, in whole or in any part, the Software. You
- may not copy the written materials accompanying the Software. You agree
- to use your best efforts to see that any user of the Software licensed
- hereunder complies with this Agreement.
-
- NO WARRANTIES. ID DISCLAIMS ALL WARRANTIES, BOTH EXPRESS IMPLIED,
- INCLUDING BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND
- FITNESS FOR A PARTICULAR PURPOSE WITH RESPECT TO THE SOFTWARE. THIS LIMITED
- WARRANTY GIVES YOU SPECIFIC LEGAL RIGHTS. YOU MAY HAVE OTHER RIGHTS WHICH
- VARY FROM JURISDICTION TO JURISDICTION. ID DOES NOT WARRANT THAT THE
- OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED, ERROR FREE OR MEET YOUR
- SPECIFIC REQUIREMENTS. THE WARRANTY SET FORTH ABOVE IS IN LIEU OF ALL OTHER
- EXPRESS WARRANTIES WHETHER ORAL OR WRITTEN. THE AGENTS, EMPLOYEES,
- DISTRIBUTORS, AND DEALERS OF ID ARE NOT AUTHORIZED TO MAKE MODIFICATIONS TO
- THIS WARRANTY, OR ADDITIONAL WARRANTIES ON BEHALF OF ID.
-
- Exclusive Remedies. The Software is being offered to you free of any
- charge. You agree that you have no remedy against ID, its affiliates,
- contractors, suppliers, and agents for loss or damage caused by any defect
- or failure in the Software regardless of the form of action, whether in
- contract, tort, includinegligence, strict liability or otherwise, with
- regard to the Software. This Agreement shall be construed in accordance
- with and governed by the laws of the State of Texas. Copyright and other
- proprietary matters will be governed by United States laws and international
- treaties. IN ANY CASE, ID SHALL NOT BE LIABLE FOR LOSS OF DATA, LOSS OF
- PROFITS, LOST SAVINGS, SPECIAL, INCIDENTAL, CONSEQUENTIAL, INDIRECT OR OTHER
- SIMILAR DAMAGES ARISING FROM BREACH OF WARRANTY, BREACH OF CONTRACT,
- NEGLIGENCE, OR OTHER LEGAL THEORY EVEN IF ID OR ITS AGENT HAS BEEN ADVISED
- OF THE POSSIBILITY OF SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY.
- Some jurisdictions do not allow the exclusion or limitation of incidental or
- consequential damages, so the above limitation or exclusion may not apply to
- you.
-
- General Provisions. Neither this Agreement nor any part or portion
- hereof shall be assigned, sublicensed or otherwise transferred by you.
- Should any provision of this Agreement be held to be void, invalid,
- unenforceable or illegal by a court, the validity and enforceability of the
- other provisions shall not be affected thereby. If any provision is
- determined to be unenforceable, you agree to a modification of such
- provision to provide for enforcement of the provision's intent, to the
- extent permitted by applicable law. Failure of a party to enforce any
- provision of this Agreement shall not constitute or be construed as a
- waiver of such provision or of the right to enforce such provision. If
- you fail to comply with any terms of this Agreement, YOUR LICENSE IS
- AUTOMATICALLY TERMINATED and you agree to the issuance of an injunction
- against you in favor of Id. You agree that Id shall not have to post
- bond or other security to obtain an injunction against you to prohibit
- you from violating Id's rights.
-
- YOU ACKNOWLEDGE THAT YOU HAVE READ THIS AGREEMENT, THAT YOU
- UNDERSTAND THIS AGREEMENT, AND UNDERSTAND THAT BY CONTINUING THE
- DOWNLOADING OF THE SOFTWARE, YOU AGREE TO BE BOUND BY THIS AGREEMENT'S
- TERMS AND CONDITIONS. YOU FURTHER AGREE THAT, EXCEPT FOR WRITTEN SEPARATE
- AGREEMENTS BETWEEN ID AND YOU, THIS AGREEMENT IS A COMPLETE AND EXCLUSIVE
- STATEMENT OF THE RIGHTS AND LIABILITIES OF THE PARTIES. THIS AGREEMENT
- SUPERSEDES ALL PRIOR ORAL AGREEMENTS, PROPOSALS OR UNDERSTANDINGS, AND
- ANY OTHER COMMUNICATIONS BETWEEN ID AND YOU RELATING TO THE SUBJECT MATTER
- OF THIS AGREEMENT
-
--- /dev/null
+++ b/RELEASE
@@ -1,0 +1,53 @@
+We are releasing this code for the entertainment of the
+user community. We don't guarentee that anything even
+builds in here. Projects just seem to rot when you leave
+them alone for long periods of time.
+
+This is all the source we have relating to the original
+PC wolfenstein 3D project. We haven't looked at this
+stuff in years, and I would probably be horribly embarassed
+to dig through my old code, so please don't ask any questions
+about it. The original project was built in borland c++ 3.0.
+I think some minor changes were required for later versions.
+
+You will need the data from a released version of wolf or spear
+to use the exe built from this code. You can just use a
+shareware version if you are really cheap.
+
+
+Some coding comments in retrospect:
+
+The ray casting refresh architecture is still reasonably
+appropriate for the game. A BSP based texture mapper could
+go faster, but ray casting was a lot simpler to do at the time.
+
+The dynamically compiled scaling routines are now a Bad Thing.
+On uncached machines (the original target) they are the fastest
+possible way to scale walls, but on modern processors you just
+wind up thrashing the code cash and wrecking performance.
+A simple looping texture mapper would be faster on 486+ machines.
+
+The whole page manager caching scheme is unecessarily complex.
+
+Way too many #ifdefs in the code!
+
+
+Some project ideas with this code:
+
+Add new monsters or weapons.
+
+Add taller walls and vertical motion. This should only be
+done if the texture mapper is rewritten.
+
+Convert to a 32 bit compiler. This would be a fair amount
+of work, but I would hate to even mess with crusty old 16
+bit code. The code would get a LOT smaller.
+
+Make a multi-player game that runs on DOOM sersetup / ipxsetup drivers.
+
+
+Have fun...
+
+John Carmack
+Technical Director
+Id Software
binary files a/WOLFSRC.1 /dev/null differ
--- a/WOLFSRC.DAT
+++ /dev/null
@@ -1,9 +1,0 @@
-PATH=\WOLFSRC
-SIZE=566432
-EXPSIZE=1776000
-SPACE=0
-LINE0=Wolfenstein Source Code
-LINE1=Official Public Domain Release
-LINE3=Please *DO NOT* e-mail us with questions!
-LINE5=Have Fun!
-DEICE=F:\IDUTILS\DEICE.EXE
--- a/WOLFSRC/AUDIOSDM.H
+++ /dev/null
@@ -1,142 +1,0 @@
-/////////////////////////////////////////////////
-//
-// MUSE Header for .SDM
-// Created Thu Aug 27 07:12:39 1992
-//
-/////////////////////////////////////////////////
-
-#define NUMSOUNDS 81
-#define NUMSNDCHUNKS 267
-
-//
-// Sound names & indexes
-//
-typedef enum {
- HITWALLSND, // 0
- MISSILEHITSND, // 1
- SELECTITEMSND, // 2
- GHOSTSIGHTSND, // 3
- MOVEGUN2SND, // 4
- MOVEGUN1SND, // 5
- NOWAYSND, // 6
- NAZIHITPLAYERSND, // 7
- MISSILEFIRESND, // 8
- PLAYERDEATHSND, // 9
- DOGDEATHSND, // 10
- ATKGATLINGSND, // 11
- GETKEYSND, // 12
- NOITEMSND, // 13
- WALK1SND, // 14
- WALK2SND, // 15
- TAKEDAMAGESND, // 16
- GAMEOVERSND, // 17
- OPENDOORSND, // 18
- CLOSEDOORSND, // 19
- DONOTHINGSND, // 20
- HALTSND, // 21
- DEATHSCREAM2SND, // 22
- ATKKNIFESND, // 23
- ATKPISTOLSND, // 24
- DEATHSCREAM3SND, // 25
- ATKMACHINEGUNSND, // 26
- HITENEMYSND, // 27
- SHOOTDOORSND, // 28
- DEATHSCREAM1SND, // 29
- GETMACHINESND, // 30
- GETAMMOSND, // 31
- SHOOTSND, // 32
- HEALTH1SND, // 33
- HEALTH2SND, // 34
- BONUS1SND, // 35
- BONUS2SND, // 36
- BONUS3SND, // 37
- GETGATLINGSND, // 38
- ESCPRESSEDSND, // 39
- LEVELDONESND, // 40
- DOGBARKSND, // 41
- ENDBONUS1SND, // 42
- ENDBONUS2SND, // 43
- BONUS1UPSND, // 44
- BONUS4SND, // 45
- PUSHWALLSND, // 46
- NOBONUSSND, // 47
- PERCENT100SND, // 48
- BOSSACTIVESND, // 49
- DEATHSCREAM4SND, // 50
- SCHUTZADSND, // 51
- AHHHGSND, // 52
- DEATHSCREAM5SND, // 53
- DEATHSCREAM7SND, // 54
- DEATHSCREAM8SND, // 55
- LEBENSND, // 56
- DEATHSCREAM6SND, // 57
- NAZIFIRESND, // 58
- BOSSFIRESND, // 59
- SSFIRESND, // 60
- SLURPIESND, // 61
- GHOSTFADESND, // 62
- DEATHSCREAM9SND, // 63
- GETAMMOBOXSND, // 64
- ANGELSIGHTSND, // 65
- SPIONSND, // 66
- NEINSOVASSND, // 67
- DOGATTACKSND, // 68
- ANGELFIRESND, // 69
- TRANSSIGHTSND, // 70
- TRANSDEATHSND, // 71
- WILHELMSIGHTSND, // 72
- WILHELMDEATHSND, // 73
- UBERDEATHSND, // 74
- KNIGHTSIGHTSND, // 75
- KNIGHTDEATHSND, // 76
- ANGELDEATHSND, // 77
- KNIGHTMISSILESND, // 78
- GETSPEARSND, // 79
- ANGELTIREDSND, // 80
- LASTSOUND
- } soundnames;
-
-//
-// Base offsets
-//
-#define STARTPCSOUNDS 0
-#define STARTADLIBSOUNDS 81
-#define STARTDIGISOUNDS 162
-#define STARTMUSIC 243
-
-//
-// Music names & indexes
-//
-typedef enum {
- XFUNKIE_MUS, // 0
- DUNGEON_MUS, // 1
- XDEATH_MUS, // 2
- GETTHEM_MUS, // 3
- XTIPTOE_MUS, // 4
- GOINGAFT_MUS, // 5
- URAHERO_MUS, // 6
- XTHEEND_MUS, // 7
- NAZI_OMI_MUS, // 8
- POW_MUS, // 9
- TWELFTH_MUS, // 10
- SEARCHN_MUS, // 11
- SUSPENSE_MUS, // 12
- ZEROHOUR_MUS, // 13
- WONDERIN_MUS, // 14
- ULTIMATE_MUS, // 15
- ENDLEVEL_MUS, // 16
- XEVIL_MUS, // 17
- XJAZNAZI_MUS, // 18
- COPYPRO_MUS, // 19
- XAWARD_MUS, // 20
- XPUTIT_MUS, // 21
- XGETYOU_MUS, // 22
- XTOWER2_MUS, // 23
- LASTMUSIC
- } musicnames;
-
-/////////////////////////////////////////////////
-//
-// Thanks for playing with MUSE!
-//
-/////////////////////////////////////////////////
--- a/WOLFSRC/AUDIOSOD.H
+++ /dev/null
@@ -1,142 +1,0 @@
-/////////////////////////////////////////////////
-//
-// MUSE Header for .SOD
-// Created Thu Aug 13 09:25:58 1992
-//
-/////////////////////////////////////////////////
-
-#define NUMSOUNDS 81
-#define NUMSNDCHUNKS 267
-
-//
-// Sound names & indexes
-//
-typedef enum {
- HITWALLSND, // 0
- MISSILEHITSND, // 1
- SELECTITEMSND, // 2
- GHOSTSIGHTSND, // 3
- MOVEGUN2SND, // 4
- MOVEGUN1SND, // 5
- NOWAYSND, // 6
- NAZIHITPLAYERSND, // 7
- MISSILEFIRESND, // 8
- PLAYERDEATHSND, // 9
- DOGDEATHSND, // 10
- ATKGATLINGSND, // 11
- GETKEYSND, // 12
- NOITEMSND, // 13
- WALK1SND, // 14
- WALK2SND, // 15
- TAKEDAMAGESND, // 16
- GAMEOVERSND, // 17
- OPENDOORSND, // 18
- CLOSEDOORSND, // 19
- DONOTHINGSND, // 20
- HALTSND, // 21
- DEATHSCREAM2SND, // 22
- ATKKNIFESND, // 23
- ATKPISTOLSND, // 24
- DEATHSCREAM3SND, // 25
- ATKMACHINEGUNSND, // 26
- HITENEMYSND, // 27
- SHOOTDOORSND, // 28
- DEATHSCREAM1SND, // 29
- GETMACHINESND, // 30
- GETAMMOSND, // 31
- SHOOTSND, // 32
- HEALTH1SND, // 33
- HEALTH2SND, // 34
- BONUS1SND, // 35
- BONUS2SND, // 36
- BONUS3SND, // 37
- GETGATLINGSND, // 38
- ESCPRESSEDSND, // 39
- LEVELDONESND, // 40
- DOGBARKSND, // 41
- ENDBONUS1SND, // 42
- ENDBONUS2SND, // 43
- BONUS1UPSND, // 44
- BONUS4SND, // 45
- PUSHWALLSND, // 46
- NOBONUSSND, // 47
- PERCENT100SND, // 48
- BOSSACTIVESND, // 49
- DEATHSCREAM4SND, // 50
- SCHUTZADSND, // 51
- AHHHGSND, // 52
- DEATHSCREAM5SND, // 53
- DEATHSCREAM7SND, // 54
- DEATHSCREAM8SND, // 55
- LEBENSND, // 56
- DEATHSCREAM6SND, // 57
- NAZIFIRESND, // 58
- BOSSFIRESND, // 59
- SSFIRESND, // 60
- SLURPIESND, // 61
- GHOSTFADESND, // 62
- DEATHSCREAM9SND, // 63
- GETAMMOBOXSND, // 64
- ANGELSIGHTSND, // 65
- SPIONSND, // 66
- NEINSOVASSND, // 67
- DOGATTACKSND, // 68
- ANGELFIRESND, // 69
- TRANSSIGHTSND, // 70
- TRANSDEATHSND, // 71
- WILHELMSIGHTSND, // 72
- WILHELMDEATHSND, // 73
- UBERDEATHSND, // 74
- KNIGHTSIGHTSND, // 75
- KNIGHTDEATHSND, // 76
- ANGELDEATHSND, // 77
- KNIGHTMISSILESND, // 78
- GETSPEARSND, // 79
- ANGELTIREDSND, // 80
- LASTSOUND
- } soundnames;
-
-//
-// Base offsets
-//
-#define STARTPCSOUNDS 0
-#define STARTADLIBSOUNDS 81
-#define STARTDIGISOUNDS 162
-#define STARTMUSIC 243
-
-//
-// Music names & indexes
-//
-typedef enum {
- XFUNKIE_MUS, // 0
- DUNGEON_MUS, // 1
- XDEATH_MUS, // 2
- GETTHEM_MUS, // 3
- XTIPTOE_MUS, // 4
- GOINGAFT_MUS, // 5
- URAHERO_MUS, // 6
- XTHEEND_MUS, // 7
- NAZI_OMI_MUS, // 8
- POW_MUS, // 9
- TWELFTH_MUS, // 10
- SEARCHN_MUS, // 11
- SUSPENSE_MUS, // 12
- ZEROHOUR_MUS, // 13
- WONDERIN_MUS, // 14
- ULTIMATE_MUS, // 15
- ENDLEVEL_MUS, // 16
- XEVIL_MUS, // 17
- XJAZNAZI_MUS, // 18
- COPYPRO_MUS, // 19
- XAWARD_MUS, // 20
- XPUTIT_MUS, // 21
- XGETYOU_MUS, // 22
- XTOWER2_MUS, // 23
- LASTMUSIC
- } musicnames;
-
-/////////////////////////////////////////////////
-//
-// Thanks for playing with MUSE!
-//
-/////////////////////////////////////////////////
--- a/WOLFSRC/AUDIOWL1.H
+++ /dev/null
@@ -1,133 +1,0 @@
-/////////////////////////////////////////////////
-//
-// MUSE Header for .WL1
-// Created Tue Apr 28 23:57:08 1992
-//
-/////////////////////////////////////////////////
-
-#define NUMSOUNDS 69
-#define NUMSNDCHUNKS 234
-
-//
-// Sound names & indexes
-//
-typedef enum {
- HITWALLSND, // 0
- SELECTWPNSND, // 1
- SELECTITEMSND, // 2
- HEARTBEATSND, // 3
- MOVEGUN2SND, // 4
- MOVEGUN1SND, // 5
- NOWAYSND, // 6
- NAZIHITPLAYERSND, // 7
- NAZIMISSSND, // 8
- PLAYERDEATHSND, // 9
- DOGDEATHSND, // 10
- ATKGATLINGSND, // 11
- GETKEYSND, // 12
- NOITEMSND, // 13
- WALK1SND, // 14
- WALK2SND, // 15
- TAKEDAMAGESND, // 16
- GAMEOVERSND, // 17
- OPENDOORSND, // 18
- CLOSEDOORSND, // 19
- DONOTHINGSND, // 20
- HALTSND, // 21
- DEATHSCREAM2SND, // 22
- ATKKNIFESND, // 23
- ATKPISTOLSND, // 24
- DEATHSCREAM3SND, // 25
- ATKMACHINEGUNSND, // 26
- HITENEMYSND, // 27
- SHOOTDOORSND, // 28
- DEATHSCREAM1SND, // 29
- GETMACHINESND, // 30
- GETAMMOSND, // 31
- SHOOTSND, // 32
- HEALTH1SND, // 33
- HEALTH2SND, // 34
- BONUS1SND, // 35
- BONUS2SND, // 36
- BONUS3SND, // 37
- GETGATLINGSND, // 38
- ESCPRESSEDSND, // 39
- LEVELDONESND, // 40
- DOGBARKSND, // 41
- ENDBONUS1SND, // 42
- ENDBONUS2SND, // 43
- BONUS1UPSND, // 44
- BONUS4SND, // 45
- PUSHWALLSND, // 46
- NOBONUSSND, // 47
- PERCENT100SND, // 48
- BOSSACTIVESND, // 49
- BOSSDIESSND, // 50
- SCHUTZADSND, // 51
- AHHHGSND, // 52
- DIESND, // 53
- EVASND, // 54
- GUTENTAGSND, // 55
- LEBENSND, // 56
- MUTTISND, // 57
- NAZIFIRESND, // 58
- BOSSFIRESND, // 59
- SSFIRESND, // 60
- SLURPIESND, // 61
- TOT_HUNDSND, // 62
- MEINGOTTSND, // 63
- SCHABBSHASND, // 64
- HILTERHASND, // 65
- SPIONSND, // 66
- NEINSOVASSND, // 67
- DOGATTACKSND, // 68
- LASTSOUND
- } soundnames;
-
-//
-// Base offsets
-//
-#define STARTPCSOUNDS 0
-#define STARTADLIBSOUNDS 69
-#define STARTDIGISOUNDS 138
-#define STARTMUSIC 207
-
-//
-// Music names & indexes
-//
-typedef enum {
- CORNER_MUS, // 0
- DUNGEON_MUS, // 1
- GETOUT_MUS, // 2
- GETTHEM_MUS, // 3
- HEADACHE_MUS, // 4
- HITLWLTZ_MUS, // 5
- INTROCW3_MUS, // 6
- NAZI_NOR_MUS, // 7
- NAZI_OMI_MUS, // 8
- POW_MUS, // 9
- SALUTE_MUS, // 10
- SEARCHN_MUS, // 11
- SUSPENSE_MUS, // 12
- VICTORS_MUS, // 13
- WONDERIN_MUS, // 14
- FUNKYOU_MUS, // 15
- ENDLEVEL_MUS, // 16
- GOINGAFT_MUS, // 17
- PREGNANT_MUS, // 18
- ULTIMATE_MUS, // 19
- NAZI_RAP_MUS, // 20
- ZEROHOUR_MUS, // 21
- TWELFTH_MUS, // 22
- ROSTER_MUS, // 23
- URAHERO_MUS, // 24
- VICMARCH_MUS, // 25
- WARMRCH1_MUS, // 26
- LASTMUSIC
- } musicnames;
-
-/////////////////////////////////////////////////
-//
-// Thanks for playing with MUSE!
-//
-/////////////////////////////////////////////////
--- a/WOLFSRC/AUDIOWL6.H
+++ /dev/null
@@ -1,151 +1,0 @@
-/////////////////////////////////////////////////
-//
-// MUSE Header for .WL6
-// Created Tue Jul 14 15:04:53 1992
-//
-/////////////////////////////////////////////////
-
-#define NUMSOUNDS 87
-#define NUMSNDCHUNKS 288
-
-//
-// Sound names & indexes
-//
-typedef enum {
- HITWALLSND, // 0
- SELECTWPNSND, // 1
- SELECTITEMSND, // 2
- HEARTBEATSND, // 3
- MOVEGUN2SND, // 4
- MOVEGUN1SND, // 5
- NOWAYSND, // 6
- NAZIHITPLAYERSND, // 7
- SCHABBSTHROWSND, // 8
- PLAYERDEATHSND, // 9
- DOGDEATHSND, // 10
- ATKGATLINGSND, // 11
- GETKEYSND, // 12
- NOITEMSND, // 13
- WALK1SND, // 14
- WALK2SND, // 15
- TAKEDAMAGESND, // 16
- GAMEOVERSND, // 17
- OPENDOORSND, // 18
- CLOSEDOORSND, // 19
- DONOTHINGSND, // 20
- HALTSND, // 21
- DEATHSCREAM2SND, // 22
- ATKKNIFESND, // 23
- ATKPISTOLSND, // 24
- DEATHSCREAM3SND, // 25
- ATKMACHINEGUNSND, // 26
- HITENEMYSND, // 27
- SHOOTDOORSND, // 28
- DEATHSCREAM1SND, // 29
- GETMACHINESND, // 30
- GETAMMOSND, // 31
- SHOOTSND, // 32
- HEALTH1SND, // 33
- HEALTH2SND, // 34
- BONUS1SND, // 35
- BONUS2SND, // 36
- BONUS3SND, // 37
- GETGATLINGSND, // 38
- ESCPRESSEDSND, // 39
- LEVELDONESND, // 40
- DOGBARKSND, // 41
- ENDBONUS1SND, // 42
- ENDBONUS2SND, // 43
- BONUS1UPSND, // 44
- BONUS4SND, // 45
- PUSHWALLSND, // 46
- NOBONUSSND, // 47
- PERCENT100SND, // 48
- BOSSACTIVESND, // 49
- MUTTISND, // 50
- SCHUTZADSND, // 51
- AHHHGSND, // 52
- DIESND, // 53
- EVASND, // 54
- GUTENTAGSND, // 55
- LEBENSND, // 56
- SCHEISTSND, // 57
- NAZIFIRESND, // 58
- BOSSFIRESND, // 59
- SSFIRESND, // 60
- SLURPIESND, // 61
- TOT_HUNDSND, // 62
- MEINGOTTSND, // 63
- SCHABBSHASND, // 64
- HITLERHASND, // 65
- SPIONSND, // 66
- NEINSOVASSND, // 67
- DOGATTACKSND, // 68
- FLAMETHROWERSND, // 69
- MECHSTEPSND, // 70
- GOOBSSND, // 71
- YEAHSND, // 72
- DEATHSCREAM4SND, // 73
- DEATHSCREAM5SND, // 74
- DEATHSCREAM6SND, // 75
- DEATHSCREAM7SND, // 76
- DEATHSCREAM8SND, // 77
- DEATHSCREAM9SND, // 78
- DONNERSND, // 79
- EINESND, // 80
- ERLAUBENSND, // 81
- KEINSND, // 82
- MEINSND, // 83
- ROSESND, // 84
- MISSILEFIRESND, // 85
- MISSILEHITSND, // 86
- LASTSOUND
- } soundnames;
-
-//
-// Base offsets
-//
-#define STARTPCSOUNDS 0
-#define STARTADLIBSOUNDS 87
-#define STARTDIGISOUNDS 174
-#define STARTMUSIC 261
-
-//
-// Music names & indexes
-//
-typedef enum {
- CORNER_MUS, // 0
- DUNGEON_MUS, // 1
- WARMARCH_MUS, // 2
- GETTHEM_MUS, // 3
- HEADACHE_MUS, // 4
- HITLWLTZ_MUS, // 5
- INTROCW3_MUS, // 6
- NAZI_NOR_MUS, // 7
- NAZI_OMI_MUS, // 8
- POW_MUS, // 9
- SALUTE_MUS, // 10
- SEARCHN_MUS, // 11
- SUSPENSE_MUS, // 12
- VICTORS_MUS, // 13
- WONDERIN_MUS, // 14
- FUNKYOU_MUS, // 15
- ENDLEVEL_MUS, // 16
- GOINGAFT_MUS, // 17
- PREGNANT_MUS, // 18
- ULTIMATE_MUS, // 19
- NAZI_RAP_MUS, // 20
- ZEROHOUR_MUS, // 21
- TWELFTH_MUS, // 22
- ROSTER_MUS, // 23
- URAHERO_MUS, // 24
- VICMARCH_MUS, // 25
- PACMAN_MUS, // 26
- LASTMUSIC
- } musicnames;
-
-/////////////////////////////////////////////////
-//
-// Thanks for playing with MUSE!
-//
-/////////////////////////////////////////////////
--- a/WOLFSRC/BUDIOSOD.H
+++ /dev/null
@@ -1,142 +1,0 @@
-/////////////////////////////////////////////////
-//
-// MUSE Header for .SOD
-// Created Thu Aug 13 09:25:58 1992
-//
-/////////////////////////////////////////////////
-
-#define NUMSOUNDS 81
-#define NUMSNDCHUNKS 267
-
-//
-// Sound names & indexes
-//
-typedef enum {
- HITWALLSND, // 0
- MISSILEHITSND, // 1
- SELECTITEMSND, // 2
- GHOSTSIGHTSND, // 3
- MOVEGUN2SND, // 4
- MOVEGUN1SND, // 5
- NOWAYSND, // 6
- NAZIHITPLAYERSND, // 7
- MISSILEFIRESND, // 8
- PLAYERDEATHSND, // 9
- DOGDEATHSND, // 10
- ATKGATLINGSND, // 11
- GETKEYSND, // 12
- NOITEMSND, // 13
- WALK1SND, // 14
- WALK2SND, // 15
- TAKEDAMAGESND, // 16
- GAMEOVERSND, // 17
- OPENDOORSND, // 18
- CLOSEDOORSND, // 19
- DONOTHINGSND, // 20
- HALTSND, // 21
- DEATHSCREAM2SND, // 22
- ATKKNIFESND, // 23
- ATKPISTOLSND, // 24
- DEATHSCREAM3SND, // 25
- ATKMACHINEGUNSND, // 26
- HITENEMYSND, // 27
- SHOOTDOORSND, // 28
- DEATHSCREAM1SND, // 29
- GETMACHINESND, // 30
- GETAMMOSND, // 31
- SHOOTSND, // 32
- HEALTH1SND, // 33
- HEALTH2SND, // 34
- BONUS1SND, // 35
- BONUS2SND, // 36
- BONUS3SND, // 37
- GETGATLINGSND, // 38
- ESCPRESSEDSND, // 39
- LEVELDONESND, // 40
- DOGBARKSND, // 41
- ENDBONUS1SND, // 42
- ENDBONUS2SND, // 43
- BONUS1UPSND, // 44
- BONUS4SND, // 45
- PUSHWALLSND, // 46
- NOBONUSSND, // 47
- PERCENT100SND, // 48
- BOSSACTIVESND, // 49
- DEATHSCREAM4SND, // 50
- SCHUTZADSND, // 51
- AHHHGSND, // 52
- DEATHSCREAM5SND, // 53
- DEATHSCREAM7SND, // 54
- DEATHSCREAM8SND, // 55
- LEBENSND, // 56
- DEATHSCREAM6SND, // 57
- NAZIFIRESND, // 58
- BOSSFIRESND, // 59
- SSFIRESND, // 60
- SLURPIESND, // 61
- GHOSTFADESND, // 62
- DEATHSCREAM9SND, // 63
- GETAMMOBOXSND, // 64
- ANGELSIGHTSND, // 65
- SPIONSND, // 66
- NEINSOVASSND, // 67
- DOGATTACKSND, // 68
- ANGELFIRESND, // 69
- TRANSSIGHTSND, // 70
- TRANSDEATHSND, // 71
- WILHELMSIGHTSND, // 72
- WILHELMDEATHSND, // 73
- UBERDEATHSND, // 74
- KNIGHTSIGHTSND, // 75
- KNIGHTDEATHSND, // 76
- ANGELDEATHSND, // 77
- KNIGHTMISSILESND, // 78
- GETSPEARSND, // 79
- ANGELTIREDSND, // 80
- LASTSOUND
- } soundnames;
-
-//
-// Base offsets
-//
-#define STARTPCSOUNDS 0
-#define STARTADLIBSOUNDS 81
-#define STARTDIGISOUNDS 162
-#define STARTMUSIC 243
-
-//
-// Music names & indexes
-//
-typedef enum {
- XFUNKIE_MUS, // 0
- DUNGEON_MUS, // 1
- XDEATH_MUS, // 2
- GETTHEM_MUS, // 3
- XTIPTOE_MUS, // 4
- GOINGAFT_MUS, // 5
- URAHERO_MUS, // 6
- XTHEEND_MUS, // 7
- NAZI_OMI_MUS, // 8
- POW_MUS, // 9
- TWELFTH_MUS, // 10
- SEARCHN_MUS, // 11
- SUSPENSE_MUS, // 12
- ZEROHOUR_MUS, // 13
- WONDERIN_MUS, // 14
- ULTIMATE_MUS, // 15
- ENDLEVEL_MUS, // 16
- XEVIL_MUS, // 17
- XJAZNAZI_MUS, // 18
- COPYPRO_MUS, // 19
- XAWARD_MUS, // 20
- XPUTIT_MUS, // 21
- XGETYOU_MUS, // 22
- XTOWER2_MUS, // 23
- LASTMUSIC
- } musicnames;
-
-/////////////////////////////////////////////////
-//
-// Thanks for playing with MUSE!
-//
-/////////////////////////////////////////////////
--- a/WOLFSRC/BUDIOWL6.H
+++ /dev/null
@@ -1,151 +1,0 @@
-/////////////////////////////////////////////////
-//
-// MUSE Header for .WL6
-// Created Sat May 30 18:41:31 1992
-//
-/////////////////////////////////////////////////
-
-#define NUMSOUNDS 87
-#define NUMSNDCHUNKS 288
-
-//
-// Sound names & indexes
-//
-typedef enum {
- HITWALLSND, // 0
- SELECTWPNSND, // 1
- SELECTITEMSND, // 2
- HEARTBEATSND, // 3
- MOVEGUN2SND, // 4
- MOVEGUN1SND, // 5
- NOWAYSND, // 6
- NAZIHITPLAYERSND, // 7
- SCHABBSTHROWSND, // 8
- PLAYERDEATHSND, // 9
- DOGDEATHSND, // 10
- ATKGATLINGSND, // 11
- GETKEYSND, // 12
- NOITEMSND, // 13
- WALK1SND, // 14
- WALK2SND, // 15
- TAKEDAMAGESND, // 16
- GAMEOVERSND, // 17
- OPENDOORSND, // 18
- CLOSEDOORSND, // 19
- DONOTHINGSND, // 20
- HALTSND, // 21
- DEATHSCREAM2SND, // 22
- ATKKNIFESND, // 23
- ATKPISTOLSND, // 24
- DEATHSCREAM3SND, // 25
- ATKMACHINEGUNSND, // 26
- HITENEMYSND, // 27
- SHOOTDOORSND, // 28
- DEATHSCREAM1SND, // 29
- GETMACHINESND, // 30
- GETAMMOSND, // 31
- SHOOTSND, // 32
- HEALTH1SND, // 33
- HEALTH2SND, // 34
- BONUS1SND, // 35
- BONUS2SND, // 36
- BONUS3SND, // 37
- GETGATLINGSND, // 38
- ESCPRESSEDSND, // 39
- LEVELDONESND, // 40
- DOGBARKSND, // 41
- ENDBONUS1SND, // 42
- ENDBONUS2SND, // 43
- BONUS1UPSND, // 44
- BONUS4SND, // 45
- PUSHWALLSND, // 46
- NOBONUSSND, // 47
- PERCENT100SND, // 48
- BOSSACTIVESND, // 49
- MUTTISND, // 50
- SCHUTZADSND, // 51
- AHHHGSND, // 52
- DIESND, // 53
- EVASND, // 54
- GUTENTAGSND, // 55
- LEBENSND, // 56
- SCHEISTSND, // 57
- NAZIFIRESND, // 58
- BOSSFIRESND, // 59
- SSFIRESND, // 60
- SLURPIESND, // 61
- TOT_HUNDSND, // 62
- MEINGOTTSND, // 63
- SCHABBSHASND, // 64
- HITLERHASND, // 65
- SPIONSND, // 66
- NEINSOVASSND, // 67
- DOGATTACKSND, // 68
- FLAMETHROWERSND, // 69
- MECHSTEPSND, // 70
- GOOBSSND, // 71
- YEAHSND, // 72
- DEATHSCREAM4SND, // 73
- DEATHSCREAM5SND, // 74
- DEATHSCREAM6SND, // 75
- DEATHSCREAM7SND, // 76
- DEATHSCREAM8SND, // 77
- DEATHSCREAM9SND, // 78
- DONNERSND, // 79
- EINESND, // 80
- ERLAUBENSND, // 81
- KEINSND, // 82
- MEINSND, // 83
- ROSESND, // 84
- MISSILEFIRESND, // 85
- MISSILEHITSND, // 86
- LASTSOUND
- } soundnames;
-
-//
-// Base offsets
-//
-#define STARTPCSOUNDS 0
-#define STARTADLIBSOUNDS 87
-#define STARTDIGISOUNDS 174
-#define STARTMUSIC 261
-
-//
-// Music names & indexes
-//
-typedef enum {
- CORNER_MUS, // 0
- DUNGEON_MUS, // 1
- WARMARCH_MUS, // 2
- GETTHEM_MUS, // 3
- HEADACHE_MUS, // 4
- HITLWLTZ_MUS, // 5
- INTROCW3_MUS, // 6
- NAZI_NOR_MUS, // 7
- NAZI_OMI_MUS, // 8
- POW_MUS, // 9
- SALUTE_MUS, // 10
- SEARCHN_MUS, // 11
- SUSPENSE_MUS, // 12
- VICTORS_MUS, // 13
- WONDERIN_MUS, // 14
- FUNKYOU_MUS, // 15
- ENDLEVEL_MUS, // 16
- GOINGAFT_MUS, // 17
- PREGNANT_MUS, // 18
- ULTIMATE_MUS, // 19
- NAZI_RAP_MUS, // 20
- ZEROHOUR_MUS, // 21
- TWELFTH_MUS, // 22
- ROSTER_MUS, // 23
- URAHERO_MUS, // 24
- VICMARCH_MUS, // 25
- PACMAN_MUS, // 26
- LASTMUSIC
- } musicnames;
-
-/////////////////////////////////////////////////
-//
-// Thanks for playing with MUSE!
-//
-/////////////////////////////////////////////////
--- a/WOLFSRC/C0.ASM
+++ /dev/null
@@ -1,841 +1,0 @@
- NAME c0
- PAGE 60,132
- LOCALS
-;[]------------------------------------------------------------[]
-;| C0.ASM -- Start Up Code |
-;| |
-;| Turbo C++ Run Time Library |
-;| |
-;| Copyright (c) 1987, 1991 by Borland International Inc. |
-;| All Rights Reserved. |
-;[]------------------------------------------------------------[]
-
- __C0__ = 1
-INCLUDE RULES.ASI
-
-; Segment and Group declarations
-
-_TEXT SEGMENT BYTE PUBLIC 'CODE'
- ENDS
-_FARDATA SEGMENT PARA PUBLIC 'FAR_DATA'
- ENDS
-_FARBSS SEGMENT PARA PUBLIC 'FAR_BSS'
- ENDS
-IFNDEF __TINY__
-_OVERLAY_ SEGMENT PARA PUBLIC 'OVRINFO'
- ENDS
-_1STUB_ SEGMENT PARA PUBLIC 'STUBSEG'
- ENDS
-ENDIF
-_DATA SEGMENT PARA PUBLIC 'DATA'
- ENDS
-_INIT_ SEGMENT WORD PUBLIC 'INITDATA'
-InitStart label byte
- ENDS
-_INITEND_ SEGMENT BYTE PUBLIC 'INITDATA'
-InitEnd label byte
- ENDS
-_EXIT_ SEGMENT WORD PUBLIC 'EXITDATA'
-ExitStart label byte
- ENDS
-_EXITEND_ SEGMENT BYTE PUBLIC 'EXITDATA'
-ExitEnd label byte
- ENDS
-_CVTSEG SEGMENT WORD PUBLIC 'DATA'
- ENDS
-_SCNSEG SEGMENT WORD PUBLIC 'DATA'
- ENDS
-IFNDEF __HUGE__
- _BSS SEGMENT WORD PUBLIC 'BSS'
- ENDS
- _BSSEND SEGMENT BYTE PUBLIC 'BSSEND'
- ENDS
-ENDIF
-IFNDEF __TINY__
- _STACK SEGMENT STACK 'STACK'
- ENDS
-ENDIF
-
- ASSUME CS:_TEXT, DS:DGROUP
-
-; External References
-
-extrn _main:DIST
-extrn _exit:DIST
-extrn __exit:DIST
-extrn __nfile:word
-extrn __setupio:near ;required!
-extrn __stklen:word
-IF LDATA EQ false
-extrn __heaplen:word
-ENDIF
-
- SUBTTL Start Up Code
- PAGE
-;/* */
-;/*-----------------------------------------------------*/
-;/* */
-;/* Start Up Code */
-;/* ------------- */
-;/* */
-;/*-----------------------------------------------------*/
-;/* */
-PSPHigh equ 00002h
-PSPEnv equ 0002ch
-PSPCmd equ 00080h
-
- public __AHINCR
-__AHINCR equ 1000h
- public __AHSHIFT
-__AHSHIFT equ 12
-
-IFDEF __NOFLOAT__
-MINSTACK equ 128 ; minimal stack size in words
-ELSE
-MINSTACK equ 256 ; minimal stack size in words
-ENDIF
-;
-; At the start, DS and ES both point to the segment prefix.
-; SS points to the stack segment except in TINY model where
-; SS is equal to CS
-;
-_TEXT SEGMENT
-IFDEF __TINY__
- ORG 100h
-ENDIF
-STARTX PROC NEAR
-; Save general information, such as :
-; DGROUP segment address
-; DOS version number
-; Program Segment Prefix address
-; Environment address
-; Top of far heap
-
-IFDEF __TINY__
- mov dx, cs ; DX = GROUP Segment address
-ELSE
- mov dx, DGROUP ; DX = GROUP Segment address
-ENDIF
-IFNDEF __BOSS__
- mov cs:DGROUP@@, dx ; __BOSS__
-ENDIF
- mov ah, 30h
- int 21h ; get DOS version number
- mov bp, ds:[PSPHigh]; BP = Highest Memory Segment Addr
- mov bx, ds:[PSPEnv] ; BX = Environment Segment address
- mov ds, dx
- mov _version@, ax ; Keep major and minor version number
- mov _psp@, es ; Keep Program Segment Prefix address
- mov _envseg@, bx ; Keep Environment Segment address
- mov word ptr _heaptop@ + 2, bp
-;
-; Save several vectors and install default divide by zero handler.
-;
- call SaveVectors
-
-;===================
-;
-; IDsoft - Check to make sure that we're running on a 286 or better
-
- pushf ; Save original flags
- xor ax,ax ; Clear AX
- push ax
- popf ; Try to pop the 0
- pushf
- pop ax ; Get results of popping 0 into flags
- popf ; Restore original flags
- or ax,ax
- jns @@Have286 ; If no sign bit, have a 286
-
- mov cx, lgth_no286MSG
- mov dx, offset DGROUP: no286MSG
- jmp MsgExit3
-
-@@Have286:
-; IDsoft - End of modifications (there's also a code segment string)
-;
-;===================
-
-IFDEF __BOSS__
-; Determine if in real mode
- mov ax,0FB42h ; find out if DPMI loader is here
- mov bx,1 ; get info function
- int 2fh ;
-
- push ax ;
- mov ax, cs ; now, save DGROUP
- add ax, cx ;
- mov es, ax ;
- mov dx, ds ;
- mov es:DGROUP@@, dx ;
- mov es:CSalias@@, ax ;
- pop ax ;
-
-; cmp ax,0001h ; if not "TRUE"
-; JNE InRealMode
-
-; 8 is the value of the alias selector
-; in this system
- MOV _protected@, cx
- MOV _hugeincval@, cx
- clc
- mov ax, cx
- xor cx, cx
- or ax, ax
- je @@gotshift
-@@shiftcnt:
- rcr ax,1
- jc @@gotshift
- inc cx
- jmp @@shiftcnt
-@@gotshift:
- mov _shiftcount@,cx
-
-; used by emulator
-; PUSH DS
-; MOV AX, 0E502H ; prot kernel function, get LDT alias
-; INT 21H
-; POP DS
-; MOV _LDT@, AX
-
-; cmp _protected@,0001h ; if not "TRUE"
-; JNE InRealMode
-
- .286P
-IFE LDATA
- mov dx, ds ;
-; LSL AX, DX ;
-; DEC AX ;
- MOV AX, 0FFFEh ;
- MOV SP, AX ;
- MOV SS, DX ;
-ENDIF
- .8086
-; JMP BossSkip
-
-InRealMode label near
-
-ENDIF
-
-; Count the number of environment variables and compute the size.
-; Each variable is ended by a 0 and a zero-length variable stops
-; the environment. The environment can NOT be greater than 32k.
-
- les di, dword ptr _envLng@
- mov ax, di
- mov bx, ax
- mov cx, 07FFFh ; Environment cannot be > 32 Kbytes
- cld
-@@EnvLoop:
- repnz scasb
- jcxz InitFailed ; Bad environment !!!
-IFDEF __BOSS__
- jmp InitOK
-InitFailed: jmp near ptr _abort
-InitOK:
-ENDIF
-
- inc bx ; BX = Nb environment variables
- cmp es:[di], al
- jne @@EnvLoop ; Next variable ...
- or ch, 10000000b
- neg cx
- mov _envLng@, cx ; Save Environment size
- mov cx, dPtrSize / 2
- shl bx, cl
- add bx, dPtrSize * 4
- and bx, not ((dPtrSize * 4) - 1)
- mov _envSize@, bx ; Save Environment Variables Nb.
-
-IFNDEF __BOSS__
-
-; Determine the amount of memory that we need to keep
-
-IFDEF _DSSTACK_
- mov dx, ds
-ELSE
- mov dx, ss
-ENDIF
- sub bp, dx ; BP = remaining size in paragraphs
-IF LDATA
- mov di, seg __stklen
- mov es, di
- mov di, es:__stklen ; DI = Requested stack size
-ELSE
- mov di, __stklen ; DI = Requested stack size
-ENDIF
-;
-; Make sure that the requested stack size is at least MINSTACK words.
-;
- cmp di, 2*MINSTACK ; requested stack big enough ?
- jae AskedStackOK
- mov di, 2*MINSTACK ; no --> use minimal value
-IF LDATA
- mov es:__stklen, di ; override requested stack size
-ELSE
- mov __stklen, di ; override requested stack size
-ENDIF
-
-AskedStackOK label near
-IFDEF _DSSTACK_
- add di, offset DGROUP: edata@
- jb InitFailed ; DATA segment can NOT be > 64 Kbytes
-ENDIF
-IF LDATA EQ false
- add di, __heaplen
- jb InitFailed ; DATA segment can NOT be > 64 Kbytes
-ENDIF
- mov cl, 4
- shr di, cl ; $$$ Do not destroy CL $$$
- inc di ; DI = DS size in paragraphs
- cmp bp, di
-IF LDATA EQ false
- jb InitFailed ; Not enough memory
- cmp __stklen, 0
- je ExpandDS ; Expand DS up to 64 Kb
- cmp __heaplen, 0
- jne ExcessOfMemory ; Much more available than needed
-ExpandDS label near
- mov di, 1000h
- cmp bp, di
- ja ExcessOfMemory ; Enough to run the program
- mov di, bp
- jmp short ExcessOfMemory ; Enough to run the program
-ELSE
- jnb ExcessOfMemory ; Much more available than needed
-ENDIF
-
-; All initialization errors arrive here
-
-InitFailed label near
- jmp near ptr _abort
-
-; Return to DOS the amount of memory in excess
-; Set far heap base and pointer
-
-ExcessOfMemory label near
- mov bx, di
- add bx, dx
- mov word ptr _heapbase@ + 2, bx
- mov word ptr _brklvl@ + 2, bx
- mov ax, _psp@
- sub bx, ax ; BX = Number of paragraphs to keep
- mov es, ax ; ES = Program Segment Prefix address
- mov ah, 04Ah
- push di ; preserve DI
- int 021h ; this call clobbers SI,DI,BP !!!!!!
- pop di ; restore DI
-
- shl di, cl ; $$$ CX is still equal to 4 $$$
-
- cli ; req'd for pre-1983 88/86s
- mov ss, dx ; Set the program stack
- mov sp, di
- sti
-
-IFNDEF _DSSTACK_
- mov ax, seg __stklen
- mov es, ax
- mov es:__stklen, di ; If separate stack segment, save size
-ENDIF
-
-ENDIF ; __BOSS__
-
-IFNDEF __HUGE__
-
-; Reset uninitialized data area
-
- xor ax, ax
- mov es, cs:DGROUP@@
- mov di, offset DGROUP: bdata@
- mov cx, offset DGROUP: edata@
- sub cx, di
- cld
- rep stosb
-ENDIF
-
-; If default number of file handles have changed then tell DOS
- cmp __nfile, 20
- jbe @@NoChange
-
- cmp _osmajor@, 3 ; Check for >= DOS 3.3
- jb @@NoChange
- ja @@DoChange
- cmp _osminor@, 1Eh
- jb @@NoChange
-@@DoChange:
- mov ax, 5801h ; Set last fit allocation
- mov bx, 2
- int 21h
- jc @@BadInit
-
- mov ah, 67h ; Expand handle table
- mov bx, __nfile
- int 21h
- jc @@BadInit
-
- mov ah, 48h ; Allocate 16 bytes to find new
- mov bx, 1 ; top of memory address
- int 21h
- jc @@BadInit
- inc ax ; Adjust address to point after block
- mov word ptr _heaptop@ + 2, ax
-
- dec ax ; Change back and release block
- mov es, ax
- mov ah, 49h
- int 21h
- jc @@BadInit
-
- mov ax, 5801h ; Set first fit allocation
- mov bx, 0
- int 21h
- jnc @@NoChange
-
-@@BadInit: jmp near ptr _abort
-
-@@NoChange:
-
-; Prepare main arguments
-
- mov ah, 0
- int 1ah ; get current BIOS time in ticks
- mov word ptr _StartTime@,dx ; save it for clock() fn
- mov word ptr _StartTime@+2,cx
- or al,al ; was midnight flag set?
- jz @@NotMidnight
- mov ax,40h ; set BIOS midnight flag
- mov es,ax ; at 40:70
- mov bx,70h
- mov byte ptr es:[bx],1
-
-@@NotMidnight:
- xor bp,bp ; set BP to 0 for overlay mgr
-
- mov es, cs:DGROUP@@
- mov si,offset DGROUP:InitStart ;si = start of table
- mov di,offset DGROUP:InitEnd ;di = end of table
- call StartExit
-
-; ExitCode = main(argc,argv,envp);
-
-IF LDATA
- push word ptr __C0environ+2
- push word ptr __C0environ
- push word ptr __C0argv+2
- push word ptr __C0argv
-ELSE
- push word ptr __C0environ
- push word ptr __C0argv
-ENDIF
- push __C0argc
- call _main
-
-; Flush and close streams and files
-
- push ax
- call _exit
-
-;---------------------------------------------------------------------------
-; _cleanup() call all #pragma exit cleanup routines.
-; _checknull() check for null pointer zapping copyright message
-; _terminate(int) exit program with error code
-;
-; These functions are called by exit(), _exit(), _cexit(),
-; and _c_exit().
-;---------------------------------------------------------------------------
-
-; Call cleanup routines
-
-__cleanup PROC DIST
- PUBLIC __cleanup
-
- mov es, cs:DGROUP@@
- push si
- push di
- mov si,offset DGROUP:ExitStart
- mov di,offset DGROUP:ExitEnd
- call StartExit
- pop di
- pop si
- ret
-__cleanup ENDP
-
-; Check for null pointers before exit
-
-__checknull PROC DIST
- PUBLIC __checknull
-
-IF LDATA EQ false
- IFNDEF __TINY__
- push si
- push di
- mov es, cs:DGROUP@@
- xor ax, ax
- mov si, ax
- mov cx, lgth_CopyRight
-ComputeChecksum label near
- add al, es:[si]
- adc ah, 0
- inc si
- loop ComputeChecksum
- sub ax, CheckSum
- jz @@SumOk
- mov cx, lgth_NullCheck
- mov dx, offset DGROUP: NullCheck
- call ErrorDisplay
-@@SumOK: pop di
- pop si
- ENDIF
-ENDIF
- ret
-__checknull ENDP
-
-; Exit to DOS
-
-__terminate PROC DIST
- PUBLIC __terminate
- mov bp,sp
- mov ah,4Ch
- mov al,[bp+cPtrSize]
- int 21h ; Exit to DOS
-__terminate ENDP
-
-STARTX ENDP
-
- SUBTTL Vector save/restore & default Zero divide routines
- PAGE
-;[]------------------------------------------------------------[]
-;| |
-;| Interrupt Save/Restore routines and default divide by zero |
-;| handler. |
-;| |
-;[]------------------------------------------------------------[]
-
-ZeroDivision PROC FAR
- mov cx, lgth_ZeroDivMSG
- mov dx, offset DGROUP: ZeroDivMSG
- jmp MsgExit3
-ZeroDivision ENDP
-
-;--------------------------------------------------------------------------
-; savevectors()
-;
-; Save vectors for 0, 4, 5 & 6 interrupts. This is for extended
-; signal()/raise() support as the signal functions can steal these
-; vectors during runtime.
-;--------------------------------------------------------------------------
-SaveVectors PROC NEAR
- push ds
-; Save INT 0
- mov ax, 3500h
- int 021h
- mov word ptr _Int0Vector@, bx
- mov word ptr _Int0Vector@+2, es
-; Save INT 4
- mov ax, 3504h
- int 021h
- mov word ptr _Int4Vector@, bx
- mov word ptr _Int4Vector@+2, es
-; Save INT 5
- mov ax, 3505h
- int 021h
- mov word ptr _Int5Vector@, bx
- mov word ptr _Int5Vector@+2, es
-; Save INT 6
- mov ax, 3506h
- int 021h
- mov word ptr _Int6Vector@, bx
- mov word ptr _Int6Vector@+2, es
-;
-; Install default divide by zero handler.
-;
- mov ax, 2500h
- mov dx, cs
- mov ds, dx
- mov dx, offset ZeroDivision
- int 21h
-
- pop ds
- ret
-SaveVectors ENDP
-
-;--------------------------------------------------------------------------
-; _restorezero() puts back all the vectors that SaveVectors took.
-;
-;NOTE : TSRs must BE AWARE that signal() functions which take these
-; vectors will be deactivated if the keep() function is executed.
-; If a TSR wants to use the signal functions when it is active it
-; will have to save/restore these vectors itself when activated and
-; deactivated.
-;--------------------------------------------------------------------------
-__restorezero PROC DIST
- PUBLIC __restorezero
-IFDEF __HUGE__
- push ds
- mov ds, cs: DGROUP@@
-ENDIF
- push ds
- mov ax, 2500h
- lds dx, _Int0Vector@
- int 21h
- pop ds
-
- push ds
- mov ax, 2504h
- lds dx, _Int4Vector@
- int 21h
- pop ds
-
- push ds
- mov ax, 2505h
- lds dx, _Int5Vector@
- int 21h
- pop ds
-
-IFNDEF __HUGE__
- push ds
-ENDIF
- mov ax, 2506h
- lds dx, _Int6Vector@
- int 21h
- pop ds
-
- ret
- ENDP
-
-;------------------------------------------------------------------
-; Loop through a startup/exit (SE) table,
-; calling functions in order of priority.
-; ES:SI is assumed to point to the beginning of the SE table
-; ES:DI is assumed to point to the end of the SE table
-; First 64 priorities are reserved by Borland
-;------------------------------------------------------------------
-PNEAR EQU 0
-PFAR EQU 1
-NOTUSED EQU 0ffh
-
-SE STRUC
-calltype db ? ; 0=near,1=far,ff=not used
-priority db ? ; 0=highest,ff=lowest
-addrlow dw ?
-addrhigh dw ?
-SE ENDS
-
-StartExit proc near
-@@Start: cmp si,offset DGROUP:InitStart ; startup or exit?
- je @@StartLow ; it's startup
- xor ah,ah ; start with high priority
- jmp short @@SaveEnd
-@@StartLow: mov ah,0ffh ;start with lowest priority
-@@SaveEnd: mov dx,di ;set sentinel to end of table
- mov bx,si ;bx = start of table
-
-@@TopOfTable: cmp bx,di ;and the end of the table?
- je @@EndOfTable ;yes, exit the loop
- cmp es:[bx.calltype],NOTUSED;check the call type
- je @@Next
- cmp si,offset DGROUP:InitStart ; startup or exit?
- je @@CompareHigh ; it's startup
- cmp ah,es:[bx.priority] ; it's exit
- jmp short @@CheckPrior ; if priority too low, skip
-@@CompareHigh: cmp es:[bx.priority],ah ;check the priority
-@@CheckPrior: ja @@Next ;too high? skip
- mov ah,es:[bx.priority] ;keep priority
- mov dx,bx ;keep index in dx
-@@Next: add bx,SIZE SE ;bx = next item in table
- jmp @@TopOfTable
-
-@@EndOfTable: cmp dx,di ;did we exhaust the table?
- je @@Done ;yes, quit
- mov bx,dx ;bx = highest priority item
- cmp es:[bx.calltype],PNEAR ;is it near or far?
- mov es:[bx.calltype],NOTUSED;wipe the call type
- push es ;save es
- je @@NearCall
-
-@@FarCall: call DWORD PTR es:[bx.addrlow]
- pop es ;restore es
- jmp short @@Start
-
-@@NearCall: call WORD PTR es:[bx.addrlow]
- pop es ;restore es
- jmp short @@Start
-
-@@Done: ret
- endp
-
-;------------------------------------------------------------------
-
-ErrorDisplay PROC NEAR
- mov ah, 040h
- mov bx, 2
- int 021h
- ret
-ErrorDisplay ENDP
-
-_abort PROC DIST
- PUBLIC _abort
- mov cx, lgth_abortMSG
- mov dx, offset DGROUP: abortMSG
-MsgExit3 label near
- mov ds, cs: DGROUP@@
- call ErrorDisplay
-CallExit3 label near
- mov ax, 3
- push ax
- call __exit ; _exit(3);
- ENDP
-
-; The DGROUP@ variable is used to reload DS with DGROUP
-
-PubSym@ DGROUP@, <dw ?>, __PASCAL__
-
-IFDEF __BOSS__
-PubSym@ CSalias@,<dw ?>, __PASCAL__
-ENDIF
-
-
-; __MMODEL is used to determine the memory model or the default
-; pointer types at run time.
-
- public __MMODEL
-__MMODEL dw MMODEL
-
-_TEXT ENDS
-
- SUBTTL Start Up Data Area
- PAGE
-;[]------------------------------------------------------------[]
-;| Start Up Data Area |
-;| |
-;| WARNING Do not move any variables in the data |
-;| segment unless you're absolutely sure |
-;| that it does not matter. |
-;[]------------------------------------------------------------[]
-
-_DATA SEGMENT
-
-; Magic symbol used by the debug info to locate the data segment
- public DATASEG@
-DATASEG@ label byte
-
-; The CopyRight string must NOT be moved or changed without
-; changing the null pointer check logic
-
-CopyRight db 4 dup(0)
- db 'Borland C++ - Copyright 1991 Borland Intl.',0
-lgth_CopyRight equ $ - CopyRight
-
-IF LDATA EQ false
-IFNDEF __TINY__
-CheckSum equ 00D5Ch
-NullCheck db 'Null pointer assignment', 13, 10
-lgth_NullCheck equ $ - NullCheck
-ENDIF
-ENDIF
-
-ZeroDivMSG db 'Divide error', 13, 10
-lgth_ZeroDivMSG equ $ - ZeroDivMSG
-
-abortMSG db 'Abnormal program termination', 13, 10
-lgth_abortMSG equ $ - abortMSG
-
-; JAB - Added string for no 286
-no286MSG db 'Sorry, this program requires a 286 or better.', 13, 10
-lgth_no286MSG equ $ - no286MSG
-; JAB - End of modifications
-
-;
-; Interrupt vector save areas
-;
-; Interrupt vectors 0,4,5 & 6 are saved at startup and then restored
-; when the program terminates. The signal/raise functions might
-; steal these vectors during execution.
-;
-; Note: These vectors save area must not be altered
-; without changing the save/restore logic.
-;
-PubSym@ _Int0Vector <dd 0>, __CDECL__
-PubSym@ _Int4Vector <dd 0>, __CDECL__
-PubSym@ _Int5Vector <dd 0>, __CDECL__
-PubSym@ _Int6Vector <dd 0>, __CDECL__
-;
-; Miscellaneous variables
-;
-PubSym@ _C0argc, <dw 0>, __CDECL__
-dPtrPub@ _C0argv, 0, __CDECL__
-dPtrPub@ _C0environ, 0, __CDECL__
-PubSym@ _envLng, <dw 0>, __CDECL__
-PubSym@ _envseg, <dw 0>, __CDECL__
-PubSym@ _envSize, <dw 0>, __CDECL__
-PubSym@ _psp, <dw 0>, __CDECL__
-PubSym@ _version, <label word>, __CDECL__
-PubSym@ _osversion, <label word>, __CDECL__
-PubSym@ _osmajor, <db 0>, __CDECL__
-PubSym@ _osminor, <db 0>, __CDECL__
-PubSym@ errno, <dw 0>, __CDECL__
-PubSym@ _StartTime, <dw 0,0>, __CDECL__
-
-
-IFDEF __BOSS__
-PubSym@ _protected <dw 0>, __CDECL__
-PubSym@ _shiftcount, <dw 12>, __CDECL__
-PubSym@ _hugeincval, <dw 1000h>, __CDECL__
-ENDIF
-
-; Memory management variables
-
-IF LDATA EQ false
-PubSym@ __heapbase, <dw DGROUP:edata@>, __CDECL__
-ENDIF
-IFNDEF __HUGE__
-PubSym@ __brklvl, <dw DGROUP:edata@>, __CDECL__
-ENDIF
-PubSym@ _heapbase, <dd 0>, __CDECL__
-PubSym@ _brklvl, <dd 0>, __CDECL__
-PubSym@ _heaptop, <dd 0>, __CDECL__
-
-; If stack in DS and Large data model then override location of __emu
-
-IFDEF _DSSTACK_
-IF LDATA
-public __emu
-__emu db 044h DUP (0)
- db 0CCh DUP (?)
-ENDIF
-ENDIF
-
-_DATA ENDS
-
-
-_CVTSEG SEGMENT
-PubSym@ _RealCvtVector, <label word>, __CDECL__
- ENDS
-
-_SCNSEG SEGMENT
-PubSym@ _ScanTodVector, <label word>, __CDECL__
- ENDS
-
-IFNDEF __HUGE__
-_BSS SEGMENT
-bdata@ label byte
- ENDS
-
-_BSSEND SEGMENT
-edata@ label byte
- ENDS
-ENDIF
-
-IFNDEF __TINY__
-_STACK SEGMENT
-IFDEF __BOSS__
- IF LDATA
- db 1400h dup(?)
- ENDIF
-ELSE
- db 128 dup(?) ;minimum stack size
-ENDIF ; __BOSS__
- ENDS
-ENDIF ; __TINY__
- END STARTX
--- a/WOLFSRC/CONTIGSC.C
+++ /dev/null
@@ -1,733 +1,0 @@
-// WL_SCALE.C
-
-#include "WL_DEF.H"
-#pragma hdrstop
-
-#define OP_RETF 0xcb
-
-/*
-=============================================================================
-
- GLOBALS
-
-=============================================================================
-*/
-
-t_compscale far *scaledirectory[MAXSCALEHEIGHT+1];
-long fullscalefarcall[MAXSCALEHEIGHT+1];
-
-int maxscale,maxscaleshl2;
-
-byte far *scalermemory;
-byte _seg *endscalermemory;
-long freescalermemory;
-
-
-/*
-=============================================================================
-
- LOCALS
-
-=============================================================================
-*/
-
-unsigned BuildCompScale (int height, byte far *code);
-
-int stepbytwo;
-
-//===========================================================================
-
-/*
-==============
-=
-= BadScale
-=
-==============
-*/
-
-void far BadScale (void)
-{
- Quit ("BadScale called!");
-}
-
-
-/*
-==========================
-=
-= SetupScaling
-=
-==========================
-*/
-
-long SetupScaling (int maxscaleheight)
-{
- int i,x,y;
- byte far *dest;
- unsigned seg,ofs;
- long size;
-
-
- maxscaleheight/=2; // one scaler every two pixels
-
- maxscale = maxscaleheight-1;
- maxscaleshl2 = maxscale<<2;
-
- dest = scalermemory;
-
-//
-// build the compiled scalers
-//
- stepbytwo = viewheight/2; // save space by double stepping
-
- for (i=1;i<=maxscaleheight;i++)
- {
- seg = FP_SEG(dest);
- ofs = (FP_OFF(dest)+15)&~15;
- dest = MK_FP(seg+ofs/16,0);
-
- scaledirectory[i] = (t_compscale far *)dest;
- size = BuildCompScale (i*2,dest);
- dest += size;
-
- if ((byte huge *)dest-(byte huge *)scalermemory > MAXSCALERMEMORY)
- Quit ("Compiled scalars exceeded allocated space!");
-
- if (i>=stepbytwo)
- i+= 2;
- }
-
-//
-// get far call addresses
-//
- for (i=1;i<=maxscaleheight;i++)
- {
- fullscalefarcall[i] = (long)scaledirectory[i] + scaledirectory[i]->codeofs[0];
- if (i>=stepbytwo)
- {
- scaledirectory[i+1] = scaledirectory[i];
- fullscalefarcall[i+1] = (long)scaledirectory[i] + scaledirectory[i]->codeofs[0];
- scaledirectory[i+2] = scaledirectory[i];
- fullscalefarcall[i+2] = (long)scaledirectory[i] + scaledirectory[i]->codeofs[0];
- i+=2;
- }
- }
- scaledirectory[0] = scaledirectory[1];
- fullscalefarcall[0] = fullscalefarcall[1];
-
-//
-// check for oversize wall drawing
-//
- for (i=maxscaleheight;i<MAXSCALEHEIGHT;i++)
- fullscalefarcall[i] = (long)BadScale;
-
- seg = FP_SEG(dest);
- ofs = (FP_OFF(dest)+15)&~15;
- endscalermemory = (void _seg *)(seg+ofs/16);
- size = (byte huge *)dest-(byte huge *)scalermemory;
- freescalermemory = MAXSCALERMEMORY-16-size;
-
- return size;
-}
-
-//===========================================================================
-
-/*
-========================
-=
-= BuildCompScale
-=
-= Builds a compiled scaler object that will scale a 64 tall object to
-= the given height (centered vertically on the screen)
-=
-= height should be even
-=
-= Call with
-= ---------
-= DS:SI Source for scale
-= ES:DI Dest for scale
-=
-= Calling the compiled scaler only destroys AL
-=
-========================
-*/
-
-unsigned BuildCompScale (int height, byte far *code)
-{
- t_compscale far *work;
-
- int i;
- long fix,step;
- unsigned src,totalscaled,totalsize;
- int startpix,endpix,toppix;
-
- work = (t_compscale far *)code;
-
- step = ((long)height<<16) / 64;
- code = &work->code[0];
- toppix = (viewheight-height)/2;
- fix = 0;
-
- for (src=0;src<=64;src++)
- {
- startpix = fix>>16;
- fix += step;
- endpix = fix>>16;
-
- if (endpix>startpix)
- work->width[src] = endpix-startpix;
- else
- work->width[src] = 0;
-
-//
-// mark the start of the code
-//
- work->codeofs[src] = FP_OFF(code);
-
-//
-// compile some code if the source pixel generates any screen pixels
-//
- startpix+=toppix;
- endpix+=toppix;
-
- if (startpix == endpix || endpix < 0 || startpix >= viewheight || src == 64)
- continue;
-
- //
- // mov al,[si+src]
- //
- *code++ = 0x8a;
- *code++ = 0x44;
- *code++ = src;
-
- for (;startpix<endpix;startpix++)
- {
- if (startpix >= viewheight)
- break; // off the bottom of the view area
- if (startpix < 0)
- continue; // not into the view area
-
- //
- // mov [es:di+heightofs],al
- //
- *code++ = 0x26;
- *code++ = 0x88;
- *code++ = 0x85;
- *((unsigned far *)code)++ = startpix*SCREENBWIDE;
- }
-
- }
-
-//
-// retf
-//
- *code++ = 0xcb;
-
- totalsize = FP_OFF(code);
-
- return totalsize;
-}
-
-
-/*
-=======================
-=
-= ScaleLine
-=
-= linescale should have the high word set to the segment of the scaler
-=
-=======================
-*/
-
-extern int slinex,slinewidth;
-extern unsigned far *linecmds;
-extern long linescale;
-extern unsigned maskword;
-
-byte mask1,mask2,mask3;
-
-
-void near ScaleLine (void)
-{
-asm mov cx,WORD PTR [linescale+2]
-asm mov es,cx // segment of scaler
-
-asm mov bp,WORD PTR [linecmds]
-asm mov dx,SC_INDEX+1 // to set SC_MAPMASK
-
-asm mov bx,[slinex]
-asm mov di,bx
-asm shr di,2 // X in bytes
-asm add di,[bufferofs]
-asm and bx,3
-asm shl bx,3
-asm add bx,[slinewidth] // bx = (pixel*8+pixwidth)
-asm mov al,BYTE [mapmasks3-1+bx] // -1 because pixwidth of 1 is first
-asm mov ds,WORD PTR [linecmds+2]
-asm or al,al
-asm jz notthreebyte // scale across three bytes
-asm jmp threebyte
-notthreebyte:
-asm mov al,BYTE PTR ss:[mapmasks2-1+bx] // -1 because pixwidth of 1 is first
-asm or al,al
-asm jnz twobyte // scale across two bytes
-
-//
-// one byte scaling
-//
-asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
-asm out dx,al // set map mask register
-
-scalesingle:
-
-asm mov bx,[ds:bp] // table location of rtl to patch
-asm or bx,bx
-asm jz linedone // 0 signals end of segment list
-asm mov bx,[es:bx]
-asm mov dl,[es:bx] // save old value
-asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
-asm mov si,[ds:bp+4] // table location of entry spot
-asm mov ax,[es:si]
-asm mov WORD PTR ss:[linescale],ax // call here to start scaling
-asm mov si,[ds:bp+2] // corrected top of shape for this segment
-asm add bp,6 // next segment list
-
-asm mov ax,SCREENSEG
-asm mov es,ax
-asm call ss:[linescale] // scale the segment of pixels
-
-asm mov es,cx // segment of scaler
-asm mov BYTE PTR es:[bx],dl // unpatch the RETF
-asm jmp scalesingle // do the next segment
-
-
-//
-// done
-//
-linedone:
-asm mov ax,ss
-asm mov ds,ax
-return;
-
-//
-// two byte scaling
-//
-twobyte:
-asm mov ss:[mask2],al
-asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
-asm mov ss:[mask1],al
-
-scaledouble:
-
-asm mov bx,[ds:bp] // table location of rtl to patch
-asm or bx,bx
-asm jz linedone // 0 signals end of segment list
-asm mov bx,[es:bx]
-asm mov cl,[es:bx] // save old value
-asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
-asm mov si,[ds:bp+4] // table location of entry spot
-asm mov ax,[es:si]
-asm mov WORD PTR ss:[linescale],ax // call here to start scaling
-asm mov si,[ds:bp+2] // corrected top of shape for this segment
-asm add bp,6 // next segment list
-
-asm mov ax,SCREENSEG
-asm mov es,ax
-asm mov al,ss:[mask1]
-asm out dx,al // set map mask register
-asm call ss:[linescale] // scale the segment of pixels
-asm inc di
-asm mov al,ss:[mask2]
-asm out dx,al // set map mask register
-asm call ss:[linescale] // scale the segment of pixels
-asm dec di
-
-asm mov es,WORD PTR ss:[linescale+2] // segment of scaler
-asm mov BYTE PTR es:[bx],cl // unpatch the RETF
-asm jmp scaledouble // do the next segment
-
-
-//
-// three byte scaling
-//
-threebyte:
-asm mov ss:[mask3],al
-asm mov al,BYTE PTR ss:[mapmasks2-1+bx] // -1 because pixwidth of 1 is first
-asm mov ss:[mask2],al
-asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
-asm mov ss:[mask1],al
-
-scaletriple:
-
-asm mov bx,[ds:bp] // table location of rtl to patch
-asm or bx,bx
-asm jz linedone // 0 signals end of segment list
-asm mov bx,[es:bx]
-asm mov cl,[es:bx] // save old value
-asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
-asm mov si,[ds:bp+4] // table location of entry spot
-asm mov ax,[es:si]
-asm mov WORD PTR ss:[linescale],ax // call here to start scaling
-asm mov si,[ds:bp+2] // corrected top of shape for this segment
-asm add bp,6 // next segment list
-
-asm mov ax,SCREENSEG
-asm mov es,ax
-asm mov al,ss:[mask1]
-asm out dx,al // set map mask register
-asm call ss:[linescale] // scale the segment of pixels
-asm inc di
-asm mov al,ss:[mask2]
-asm out dx,al // set map mask register
-asm call ss:[linescale] // scale the segment of pixels
-asm inc di
-asm mov al,ss:[mask3]
-asm out dx,al // set map mask register
-asm call ss:[linescale] // scale the segment of pixels
-asm dec di
-asm dec di
-
-asm mov es,WORD PTR ss:[linescale+2] // segment of scaler
-asm mov BYTE PTR es:[bx],cl // unpatch the RETF
-asm jmp scaletriple // do the next segment
-
-
-}
-
-
-/*
-=======================
-=
-= ScaleShape
-=
-= Draws a compiled shape at [scale] pixels high
-=
-= each vertical line of the shape has a pointer to segment data:
-= end of segment pixel*2 (0 terminates line) used to patch rtl in scaler
-= top of virtual line with segment in proper place
-= start of segment pixel*2, used to jsl into compiled scaler
-= <repeat>
-=
-= Setup for call
-= --------------
-= GC_MODE read mode 1, write mode 2
-= GC_COLORDONTCARE set to 0, so all reads from video memory return 0xff
-= GC_INDEX pointing at GC_BITMASK
-=
-=======================
-*/
-
-static long longtemp;
-
-void ScaleShape (int xcenter, int shapenum, unsigned height)
-{
- t_compshape _seg *shape;
- t_compscale far *comptable;
- unsigned scale,srcx,stopx,tempx;
- int t;
- unsigned far *cmdptr;
- boolean leftvis,rightvis;
-
-
- shape = PM_GetSpritePage (shapenum);
-
- scale = height>>3; // low three bits are fractional
- if (!scale || scale>maxscale)
- return; // too close or far away
- comptable = scaledirectory[scale];
-
- *(((unsigned *)&linescale)+1)=FP_SEG(comptable); // seg of far call
- *(((unsigned *)&linecmds)+1)=(unsigned)shape; // seg of shape
-
-//
-// scale to the left (from pixel 31 to shape->leftpix)
-//
- srcx = 32;
- slinex = xcenter;
- stopx = shape->leftpix;
- cmdptr = &shape->dataofs[31-stopx];
-
- while ( --srcx >=stopx && slinex>0)
- {
- (unsigned)linecmds = *cmdptr--;
- if ( !(slinewidth = comptable->width[srcx]) )
- continue;
-
- if (slinewidth == 1)
- {
- slinex--;
- if (slinex<viewwidth)
- {
- if (wallheight[slinex] >= height)
- continue; // obscured by closer wall
- ScaleLine ();
- }
- continue;
- }
-
- //
- // handle multi pixel lines
- //
- if (slinex>viewwidth)
- {
- slinex -= slinewidth;
- slinewidth = viewwidth-slinex;
- if (slinewidth<1)
- continue; // still off the right side
- }
- else
- {
- if (slinewidth>slinex)
- slinewidth = slinex;
- slinex -= slinewidth;
- }
-
-
- leftvis = (wallheight[slinex] < height);
- rightvis = (wallheight[slinex+slinewidth-1] < height);
-
- if (leftvis)
- {
- if (rightvis)
- ScaleLine ();
- else
- {
- while (wallheight[slinex+slinewidth-1] >= height)
- slinewidth--;
- ScaleLine ();
- }
- }
- else
- {
- if (!rightvis)
- continue; // totally obscured
-
- while (wallheight[slinex] >= height)
- {
- slinex++;
- slinewidth--;
- }
- ScaleLine ();
- break; // the rest of the shape is gone
- }
- }
-
-
-//
-// scale to the right
-//
- slinex = xcenter;
- stopx = shape->rightpix;
- if (shape->leftpix<31)
- {
- srcx = 31;
- cmdptr = &shape->dataofs[32-shape->leftpix];
- }
- else
- {
- srcx = shape->leftpix-1;
- cmdptr = &shape->dataofs[0];
- }
- slinewidth = 0;
-
- while ( ++srcx <= stopx && (slinex+=slinewidth)<viewwidth)
- {
- (unsigned)linecmds = *cmdptr++;
- if ( !(slinewidth = comptable->width[srcx]) )
- continue;
-
- if (slinewidth == 1)
- {
- if (slinex>=0 && wallheight[slinex] < height)
- {
- ScaleLine ();
- }
- continue;
- }
-
- //
- // handle multi pixel lines
- //
- if (slinex<0)
- {
- if (slinewidth <= -slinex)
- continue; // still off the left edge
-
- slinewidth += slinex;
- slinex = 0;
- }
- else
- {
- if (slinex + slinewidth > viewwidth)
- slinewidth = viewwidth-slinex;
- }
-
-
- leftvis = (wallheight[slinex] < height);
- rightvis = (wallheight[slinex+slinewidth-1] < height);
-
- if (leftvis)
- {
- if (rightvis)
- {
- ScaleLine ();
- }
- else
- {
- while (wallheight[slinex+slinewidth-1] >= height)
- slinewidth--;
- ScaleLine ();
- break; // the rest of the shape is gone
- }
- }
- else
- {
- if (rightvis)
- {
- while (wallheight[slinex] >= height)
- {
- slinex++;
- slinewidth--;
- }
- ScaleLine ();
- }
- else
- continue; // totally obscured
- }
- }
-}
-
-
-
-/*
-=======================
-=
-= SimpleScaleShape
-=
-= NO CLIPPING, height in pixels
-=
-= Draws a compiled shape at [scale] pixels high
-=
-= each vertical line of the shape has a pointer to segment data:
-= end of segment pixel*2 (0 terminates line) used to patch rtl in scaler
-= top of virtual line with segment in proper place
-= start of segment pixel*2, used to jsl into compiled scaler
-= <repeat>
-=
-= Setup for call
-= --------------
-= GC_MODE read mode 1, write mode 2
-= GC_COLORDONTCARE set to 0, so all reads from video memory return 0xff
-= GC_INDEX pointing at GC_BITMASK
-=
-=======================
-*/
-
-void SimpleScaleShape (int xcenter, int shapenum, unsigned height)
-{
- t_compshape _seg *shape;
- t_compscale far *comptable;
- unsigned scale,srcx,stopx,tempx;
- int t;
- unsigned far *cmdptr;
- boolean leftvis,rightvis;
-
-
- shape = PM_GetSpritePage (shapenum);
-
- scale = height>>1;
- comptable = scaledirectory[scale];
-
- *(((unsigned *)&linescale)+1)=FP_SEG(comptable); // seg of far call
- *(((unsigned *)&linecmds)+1)=(unsigned)shape; // seg of shape
-
-//
-// scale to the left (from pixel 31 to shape->leftpix)
-//
- srcx = 32;
- slinex = xcenter;
- stopx = shape->leftpix;
- cmdptr = &shape->dataofs[31-stopx];
-
- while ( --srcx >=stopx )
- {
- (unsigned)linecmds = *cmdptr--;
- if ( !(slinewidth = comptable->width[srcx]) )
- continue;
-
- slinex -= slinewidth;
- ScaleLine ();
- }
-
-
-//
-// scale to the right
-//
- slinex = xcenter;
- stopx = shape->rightpix;
- if (shape->leftpix<31)
- {
- srcx = 31;
- cmdptr = &shape->dataofs[32-shape->leftpix];
- }
- else
- {
- srcx = shape->leftpix-1;
- cmdptr = &shape->dataofs[0];
- }
- slinewidth = 0;
-
- while ( ++srcx <= stopx )
- {
- (unsigned)linecmds = *cmdptr++;
- if ( !(slinewidth = comptable->width[srcx]) )
- continue;
-
- ScaleLine ();
- slinex+=slinewidth;
- }
-}
-
-
-
-
-//
-// bit mask tables for drawing scaled strips up to eight pixels wide
-//
-// down here so the STUPID inline assembler doesn't get confused!
-//
-
-
-byte mapmasks1[4][8] = {
-{1 ,3 ,7 ,15,15,15,15,15},
-{2 ,6 ,14,14,14,14,14,14},
-{4 ,12,12,12,12,12,12,12},
-{8 ,8 ,8 ,8 ,8 ,8 ,8 ,8} };
-
-byte mapmasks2[4][8] = {
-{0 ,0 ,0 ,0 ,1 ,3 ,7 ,15},
-{0 ,0 ,0 ,1 ,3 ,7 ,15,15},
-{0 ,0 ,1 ,3 ,7 ,15,15,15},
-{0 ,1 ,3 ,7 ,15,15,15,15} };
-
-byte mapmasks3[4][8] = {
-{0 ,0 ,0 ,0 ,0 ,0 ,0 ,0},
-{0 ,0 ,0 ,0 ,0 ,0 ,0 ,1},
-{0 ,0 ,0 ,0 ,0 ,0 ,1 ,3},
-{0 ,0 ,0 ,0 ,0 ,1 ,3 ,7} };
-
-
-unsigned wordmasks[8][8] = {
-{0x0080,0x00c0,0x00e0,0x00f0,0x00f8,0x00fc,0x00fe,0x00ff},
-{0x0040,0x0060,0x0070,0x0078,0x007c,0x007e,0x007f,0x807f},
-{0x0020,0x0030,0x0038,0x003c,0x003e,0x003f,0x803f,0xc03f},
-{0x0010,0x0018,0x001c,0x001e,0x001f,0x801f,0xc01f,0xe01f},
-{0x0008,0x000c,0x000e,0x000f,0x800f,0xc00f,0xe00f,0xf00f},
-{0x0004,0x0006,0x0007,0x8007,0xc007,0xe007,0xf007,0xf807},
-{0x0002,0x0003,0x8003,0xc003,0xe003,0xf003,0xf803,0xfc03},
-{0x0001,0x8001,0xc001,0xe001,0xf001,0xf801,0xfc01,0xfe01} };
-
-int slinex,slinewidth;
-unsigned far *linecmds;
-long linescale;
-unsigned maskword;
-
--- a/WOLFSRC/DETECT.C
+++ /dev/null
@@ -1,87 +1,0 @@
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_CheckSB() - Checks to see if a SoundBlaster resides at a
-// particular I/O location
-//
-///////////////////////////////////////////////////////////////////////////
-static boolean
-SDL_CheckSB(int port)
-{
- int i;
-
- sbLocation = port << 4; // Initialize stuff for later use
-
- sbOut(sbReset,true); // Reset the SoundBlaster DSP
-asm mov dx,0x388 // Wait >4usec
-asm in al, dx
-asm in al, dx
-asm in al, dx
-asm in al, dx
-asm in al, dx
-asm in al, dx
-asm in al, dx
-asm in al, dx
-asm in al, dx
-
- sbOut(sbReset,false); // Turn off sb DSP reset
-asm mov dx,0x388 // Wait >100usec
-asm mov cx,100
-usecloop:
-asm in al,dx
-asm loop usecloop
-
- for (i = 0;i < 100;i++)
- {
- if (sbIn(sbDataAvail) & 0x80) // If data is available...
- {
- if (sbIn(sbReadData) == 0xaa) // If it matches correct value
- return(true);
- else
- {
- sbLocation = -1; // Otherwise not a SoundBlaster
- return(false);
- }
- }
- }
- sbLocation = -1; // Retry count exceeded - fail
- return(false);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// Checks to see if a SoundBlaster is in the system. If the port passed is
-// -1, then it scans through all possible I/O locations. If the port
-// passed is 0, then it uses the default (2). If the port is >0, then
-// it just passes it directly to SDL_CheckSB()
-//
-///////////////////////////////////////////////////////////////////////////
-static boolean
-SDL_DetectSoundBlaster(int port)
-{
- int i;
-
- if (port == 0) // If user specifies default, use 2
- port = 2;
- if (port == -1)
- {
- if (SDL_CheckSB(2)) // Check default before scanning
- return(true);
-
- if (SDL_CheckSB(4)) // Check other SB Pro location before scan
- return(true);
-
- for (i = 1;i <= 6;i++) // Scan through possible SB locations
- {
- if ((i == 2) || (i == 4))
- continue;
-
- if (SDL_CheckSB(i)) // If found at this address,
- return(true); // return success
- }
- return(false); // All addresses failed, return failure
- }
- else
- return(SDL_CheckSB(port)); // User specified address or default
-}
-
-
\ No newline at end of file
--- a/WOLFSRC/FOREIGN.H
+++ /dev/null
@@ -1,110 +1,0 @@
-#define QUITSUR "Are you sure you want\n"\
- "to quit this great game?"
-
-#define CURGAME "You are currently in\n"\
- "a game. Continuing will\n"\
- "erase old game. Ok?"
-
-#define GAMESVD "There's already a game\n"\
- "saved at this position.\n"\
- " Overwrite?"
-
-#define ENDGAMESTR "Are you sure you want\n"\
- "to end the game you\n"\
- "are playing? (Y or N):"
-
-#define STR_NG "New Game"
-#define STR_SD "Sound"
-#define STR_CL "Control"
-#define STR_LG "Load Game"
-#define STR_SG "Save Game"
-#define STR_CV "Change View"
-#define STR_VS "View Scores"
-#define STR_EG "End Game"
-#define STR_BD "Back to Demo"
-#define STR_QT "Quit"
-
-#define STR_LOADING "Loading"
-#define STR_SAVING "Saving"
-
-#define STR_GAME "Game"
-#define STR_DEMO "Demo"
-#define STR_LGC "Load Game called\n\""
-#define STR_EMPTY "empty"
-#define STR_CALIB "Calibrate"
-#define STR_JOYST "Joystick"
-#define STR_MOVEJOY "Move joystick to\nupper left and\npress button 0\n"
-#define STR_MOVEJOY2 "Move joystick to\nlower right and\npress button 1\n"
-#define STR_ESCEXIT "ESC to exit"
-
-#define STR_NONE "None"
-#define STR_PC "PC Speaker"
-#define STR_ALSB "AdLib/Sound Blaster"
-#define STR_DISNEY "Disney Sound Source"
-#define STR_SB "Sound Blaster"
-
-#define STR_MOUSEEN "Mouse Enabled"
-#define STR_JOYEN "Joystick Enabled"
-#define STR_PORT2 "Use joystick port 2"
-#define STR_GAMEPAD "Gravis GamePad Enabled"
-#define STR_SENS "Mouse Sensitivity"
-#define STR_CUSTOM "Customize controls"
-
-#define STR_DADDY "Can I play, Daddy?"
-#define STR_HURTME "Don't hurt me."
-#define STR_BRINGEM "Bring 'em on!"
-#define STR_DEATH "I am Death incarnate!"
-
-#define STR_MOUSEADJ "Adjust Mouse Sensitivity"
-#define STR_SLOW "Slow"
-#define STR_FAST "Fast"
-
-#define STR_CRUN "Run"
-#define STR_COPEN "Open"
-#define STR_CFIRE "Fire"
-#define STR_CSTRAFE "Strafe"
-
-#define STR_LEFT "Left"
-#define STR_RIGHT "Right"
-#define STR_FRWD "Frwd"
-#define STR_BKWD "Bkwrd"
-#define STR_THINK "Thinking"
-
-#define STR_SIZE1 "Use arrows to size"
-#define STR_SIZE2 "ENTER to accept"
-#define STR_SIZE3 "ESC to cancel"
-
-#define STR_YOUWIN "you win!"
-
-#define STR_TOTALTIME "total time"
-
-#define STR_RATKILL "kill %"
-#define STR_RATSECRET "secret %"
-#define STR_RATTREASURE "treasure %"
-
-#define STR_BONUS "bonus"
-#define STR_TIME "time"
-#define STR_PAR " par"
-
-#define STR_RAT2KILL "kill ratio %"
-#define STR_RAT2SECRET "secret ratio %"
-#define STR_RAT2TREASURE "treasure ratio %"
-
-#define STR_DEFEATED "defeated!"
-
-#define STR_CHEATER1 "You now have 100% Health,"
-#define STR_CHEATER2 "99 Ammo and both Keys!"
-#define STR_CHEATER3 "Note that you have basically"
-#define STR_CHEATER4 "eliminated your chances of"
-#define STR_CHEATER5 "getting a high score!"
-
-#define STR_NOSPACE1 "There is not enough space"
-#define STR_NOSPACE2 "on your disk to Save Game!"
-
-#define STR_SAVECHT1 "Your Save Game file is,"
-#define STR_SAVECHT2 "shall we say, \"corrupted\"."
-#define STR_SAVECHT3 "But I'll let you go on and"
-#define STR_SAVECHT4 "play anyway...."
-
-#define STR_SEEAGAIN "Let's see that again!"
-
\ No newline at end of file
--- a/WOLFSRC/F_SPEAR.H
+++ /dev/null
@@ -1,87 +1,0 @@
-#define ENDSTR1 "Heroes don't quit, but\ngo ahead and press Y\nif you aren't one."
-#define ENDSTR2 "Press Y to quit,\nor press N to enjoy\nmore violent diversion."
-#define ENDSTR3 "Depressing the Y key means\nyou must return to the\nhumdrum workday world."
-#define ENDSTR4 "Hey, quit or play,\nY or N:\nit's your choice."
-#define ENDSTR5 "Sure you don't want to\nwaste a few more\nproductive hours?"
-#define ENDSTR6 "I think you had better\nplay some more. Please\npress N...please?"
-#define ENDSTR7 "If you are tough, press N.\nIf not, press Y daintily."
-#define ENDSTR8 "I'm thinkin' that\nyou might wanna press N\nto play more. You do it."
-#define ENDSTR9 "Sure. Fine. Quit.\nSee if we care.\nGet it over with.\nPress Y."
-
-#define STR_ENDGAME1 "We owe you a great debt, Mr. Blazkowicz."
-#define STR_ENDGAME2 "You have served your country well."
-#define STR_ENDGAME3 "With the spear gone, the Allies will finally"
-#define STR_ENDGAME4 "by able to destroy Hitler..."
-
-#define STR_COPY1 "That's close, but not close enough to get"
-#define STR_COPY2 "you into the game."
-
-#define STR_COPY3 "Wow, you must have the early version of the"
-#define STR_COPY4 "manual with the totally false information in it."
-
-#define STR_COPY5 "I would let you into the game, but seeing"
-#define STR_COPY6 "as that was not at all the right answer..."
-
-#define STR_COPY7 "It's just too bad we can't get together on"
-#define STR_COPY8 "this one. Sorry."
-
-#define STR_COPY9 "Hey, you're just SO off base!"
-
-#define STR_COPY10 "You know, I once typed that myself when"
-#define STR_COPY11 "I was your age."
-
-#define STR_COPY12 "Nops. Zero points. Zugga."
-
-#define STR_COPY13 "Yeah...right."
-
-#define STR_COPY14 "You must like these quizzes."
-
-#define STR_COPY15 "Could be called \"PixelMeister\"?"
-
-#define STR_COPY16 "Might engineer some software?"
-
-#define STR_COPY17 "Would be found"
-#define STR_COPY18 "directing creatively?"
-
-#define STR_COPY19 "Might be found"
-#define STR_COPY20 "handling operations?"
-
-#define STR_COPY21 "Has a name familiar"
-#define STR_COPY22 "to your weatherman?"
-
-#define STR_NOPE1 "Welcome to the DOS prompt, pirate!"
-#define STR_NOPE2 "Eat hot DOS prompt, goober!"
-#define STR_NOPE3 "Ya know, this program doesn't cost that much."
-#define STR_NOPE4 "Hey...weren't you just AT this DOS prompt?"
-#define STR_NOPE5 "What's a nice user like you doin' at a DOS prompt like this?"
-#define STR_NOPE6 "Well, I'm sure you just \"misplaced\" the manual..."
-#define STR_NOPE7 "Run me again when you've boned up on your manual a bit."
-#define STR_NOPE8 "Nice try, but no Spear."
-#define STR_NOPE9 "That information is in the Spear of Destiny manual, by the way."
-
-#define STR_MISC1 "Under \"Killing the Enemy\", what"
-#define STR_MISC2 "type of enemy is pictured?"
-
-#define STR_MISC3 "How many eyelets are on B.J.'s"
-#define STR_MISC4 "boots? (see page 2)"
-
-#define STR_MISC5 "The word \"minister\" appears in"
-#define STR_MISC6 "what gray shape on page 2?"
-
-#define STR_MISC7 "How many bullets does B.J. have"
-#define STR_MISC8 "on the screen-shot in the middle"
-#define STR_MISC9 "of page 9?"
-
-#define STR_STAR "star"
-#define STR_DEBRIEF " DEBRIEFING\n SESSION\n"
-#define STR_ENEMY1 "Name the member of the"
-#define STR_ENEMY2 "enemy forces shown above"
-
-#define STR_CHECKMAN "CHECK YER MANUAL!"
-#define STR_MAN1 "Which manual page"
-#define STR_MAN2 "is the Options Menu"
-#define STR_MAN3 "function"
-#define STR_MAN4 "on?"
-
-#define STR_ID1 "Which member of Id Software:"
-
\ No newline at end of file
--- a/WOLFSRC/GFXE_SOD.EQU
+++ /dev/null
@@ -1,47 +1,0 @@
-;=====================================
-;
-; Graphics .EQU file for .SOD
-; IGRAB-ed on Fri Jul 31 18:31:00 1992
-;
-;=====================================
-
-
-
-
-
-
-;
-; Amount of each data item
-;
-NUMCHUNKS = 414
-NUMFONT = 0
-NUMFONTM = 0
-NUMPICS = 0
-NUMPICM = 0
-NUMSPRITES = 0
-NUMTILE8 = 0
-NUMTILE8M = 0
-NUMTILE16 = 144
-NUMTILE16M = 270
-NUMTILE32 = 0
-NUMTILE32M = 0
-NUMEXTERN = 0
-;
-; File offsets for data items
-;
-STARTFONT = 0
-STARTFONTM = 0
-STARTPICS = 0
-STARTPICM = 0
-STARTSPRITES = 0
-STARTTILE8 = 0
-STARTTILE8M = 0
-STARTTILE16 = 0
-STARTTILE16M = 144
-STARTTILE32 = 414
-STARTTILE32M = 414
-STARTEXTERN = 414
-
-;
-; Thank you for using IGRAB!
-;
--- a/WOLFSRC/GFXE_SOD.H
+++ /dev/null
@@ -1,53 +1,0 @@
-//////////////////////////////////////
-//
-// Graphics .H file for .SOD
-// IGRAB-ed on Fri Jul 31 18:31:00 1992
-//
-//////////////////////////////////////
-
-typedef enum {
-
-
-
- ENUMEND
- } graphicnums;
-
-//
-// Data LUMPs
-//
-
-//
-// Amount of each data item
-//
-#define NUMCHUNKS 414
-#define NUMFONT 0
-#define NUMFONTM 0
-#define NUMPICS 0
-#define NUMPICM 0
-#define NUMSPRITES 0
-#define NUMTILE8 0
-#define NUMTILE8M 0
-#define NUMTILE16 144
-#define NUMTILE16M 270
-#define NUMTILE32 0
-#define NUMTILE32M 0
-#define NUMEXTERNS 0
-//
-// File offsets for data items
-//
-#define STARTFONT 0
-#define STARTFONTM 0
-#define STARTPICS 0
-#define STARTPICM 0
-#define STARTSPRITES 0
-#define STARTTILE8 0
-#define STARTTILE8M 0
-#define STARTTILE16 0
-#define STARTTILE16M 144
-#define STARTTILE32 414
-#define STARTTILE32M 414
-#define STARTEXTERNS 414
-
-//
-// Thank you for using IGRAB!
-//
--- a/WOLFSRC/GFXE_WL1.EQU
+++ /dev/null
@@ -1,201 +1,0 @@
-;=====================================
-;
-; Graphics .EQU file for .WL1
-; IGRAB-ed on Sat May 02 02:16:56 1992
-;
-;=====================================
-
-H_BJPIC = 3
-H_CASTLEPIC = 4
-H_KEYBOARDPIC = 5
-H_JOYPIC = 6
-H_MOUSEPIC = 7
-H_BOTHPIC = 8
-H_GAMEPADPIC = 9
-H_HEALPIC = 10
-H_TREASUREPIC = 11
-H_GUNPIC = 12
-H_KEYPIC = 13
-H_BLAZEPIC = 14
-H_WEAPON1234PIC = 15
-H_WOLFLOGOPIC = 16
-H_VISAPIC = 17
-H_MCPIC = 18
-H_IDLOGOPIC = 19
-H_FAXPIC = 20
-H_GALACTIXPIC = 21
-H_FGODMOMPIC = 22
-H_AUSTRALIAPIC = 23
-H_CANADAPIC = 24
-H_UKPIC = 25
-C_OPTIONSPIC = 26
-C_CURSOR1PIC = 27
-C_CURSOR2PIC = 28
-C_NOTSELECTEDPIC = 29
-C_SELECTEDPIC = 30
-C_FXTITLEPIC = 31
-C_DIGITITLEPIC = 32
-C_MUSICTITLEPIC = 33
-C_MOUSELBACKPIC = 34
-C_BABYMODEPIC = 35
-C_EASYPIC = 36
-C_NORMALPIC = 37
-C_HARDPIC = 38
-C_LOADSAVEDISKPIC = 39
-C_DISKLOADING1PIC = 40
-C_DISKLOADING2PIC = 41
-C_CONTROLPIC = 42
-C_CUSTOMIZEPIC = 43
-C_LOADGAMEPIC = 44
-C_SAVEGAMEPIC = 45
-C_EPISODE1PIC = 46
-C_EPISODE2PIC = 47
-C_EPISODE3PIC = 48
-C_EPISODE4PIC = 49
-C_EPISODE5PIC = 50
-C_EPISODE6PIC = 51
-C_CODEPIC = 52
-L_GUYPIC = 53
-L_COLONPIC = 54
-L_NUM0PIC = 55
-L_NUM1PIC = 56
-L_NUM2PIC = 57
-L_NUM3PIC = 58
-L_NUM4PIC = 59
-L_NUM5PIC = 60
-L_NUM6PIC = 61
-L_NUM7PIC = 62
-L_NUM8PIC = 63
-L_NUM9PIC = 64
-L_PERCENTPIC = 65
-L_APIC = 66
-L_BPIC = 67
-L_CPIC = 68
-L_DPIC = 69
-L_EPIC = 70
-L_FPIC = 71
-L_GPIC = 72
-L_HPIC = 73
-L_IPIC = 74
-L_JPIC = 75
-L_KPIC = 76
-L_LPIC = 77
-L_MPIC = 78
-L_NPIC = 79
-L_OPIC = 80
-L_PPIC = 81
-L_QPIC = 82
-L_RPIC = 83
-L_SPIC = 84
-L_TPIC = 85
-L_UPIC = 86
-L_VPIC = 87
-L_WPIC = 88
-L_XPIC = 89
-L_YPIC = 90
-L_ZPIC = 91
-L_GUY2PIC = 92
-L_BJWINSPIC = 93
-STATUSBARPIC = 94
-TITLEPIC = 95
-PG13PIC = 96
-CREDITSPIC = 97
-HIGHSCORESPIC = 98
-KNIFEPIC = 99
-GUNPIC = 100
-MACHINEGUNPIC = 101
-GATLINGGUNPIC = 102
-NOKEYPIC = 103
-GOLDKEYPIC = 104
-SILVERKEYPIC = 105
-N_BLANKPIC = 106
-N_0PIC = 107
-N_1PIC = 108
-N_2PIC = 109
-N_3PIC = 110
-N_4PIC = 111
-N_5PIC = 112
-N_6PIC = 113
-N_7PIC = 114
-N_8PIC = 115
-N_9PIC = 116
-FACE1APIC = 117
-FACE1BPIC = 118
-FACE1CPIC = 119
-FACE2APIC = 120
-FACE2BPIC = 121
-FACE2CPIC = 122
-FACE3APIC = 123
-FACE3BPIC = 124
-FACE3CPIC = 125
-FACE4APIC = 126
-FACE4BPIC = 127
-FACE4CPIC = 128
-FACE5APIC = 129
-FACE5BPIC = 130
-FACE5CPIC = 131
-FACE6APIC = 132
-FACE6BPIC = 133
-FACE6CPIC = 134
-FACE7APIC = 135
-FACE7BPIC = 136
-FACE7CPIC = 137
-FACE8APIC = 138
-GOTGATLINGPIC = 139
-PAUSEDPIC = 140
-GETPSYCHEDPIC = 141
-
-
-
-ORDERSCREEN = 557
-
-README_LUMP_START = 3
-README_LUMP_END = 25
-
-CONTROLS_LUMP_START = 26
-CONTROLS_LUMP_END = 52
-
-LEVELEND_LUMP_START = 53
-LEVELEND_LUMP_END = 93
-
-LATCHPICS_LUMP_START = 99
-LATCHPICS_LUMP_END = 141
-
-
-;
-; Amount of each data item
-;
-NUMCHUNKS = 558
-NUMFONT = 2
-NUMFONTM = 0
-NUMPICS = 139
-NUMPICM = 0
-NUMSPRITES = 0
-NUMTILE8 = 72
-NUMTILE8M = 0
-NUMTILE16 = 144
-NUMTILE16M = 270
-NUMTILE32 = 0
-NUMTILE32M = 0
-NUMEXTERN = 1
-;
-; File offsets for data items
-;
-STRUCTPIC = 0
-
-STARTFONT = 1
-STARTFONTM = 3
-STARTPICS = 3
-STARTPICM = 142
-STARTSPRITES = 142
-STARTTILE8 = 142
-STARTTILE8M = 143
-STARTTILE16 = 143
-STARTTILE16M = 287
-STARTTILE32 = 557
-STARTTILE32M = 557
-STARTEXTERN = 557
-
-;
-; Thank you for using IGRAB!
-;
--- a/WOLFSRC/GFXE_WL1.H
+++ /dev/null
@@ -1,211 +1,0 @@
-//////////////////////////////////////
-//
-// Graphics .H file for .WL1
-// IGRAB-ed on Sat May 02 02:16:56 1992
-//
-//////////////////////////////////////
-
-typedef enum {
- // Lump Start
- H_BJPIC=3,
- H_CASTLEPIC, // 4
- H_KEYBOARDPIC, // 5
- H_JOYPIC, // 6
- H_MOUSEPIC, // 7
- H_BOTHPIC, // 8
- H_GAMEPADPIC, // 9
- H_HEALPIC, // 10
- H_TREASUREPIC, // 11
- H_GUNPIC, // 12
- H_KEYPIC, // 13
- H_BLAZEPIC, // 14
- H_WEAPON1234PIC, // 15
- H_WOLFLOGOPIC, // 16
- H_VISAPIC, // 17
- H_MCPIC, // 18
- H_IDLOGOPIC, // 19
- H_FAXPIC, // 20
- H_GALACTIXPIC, // 21
- H_FGODMOMPIC, // 22
- H_AUSTRALIAPIC, // 23
- H_CANADAPIC, // 24
- H_UKPIC, // 25
- // Lump Start
- C_OPTIONSPIC, // 26
- C_CURSOR1PIC, // 27
- C_CURSOR2PIC, // 28
- C_NOTSELECTEDPIC, // 29
- C_SELECTEDPIC, // 30
- C_FXTITLEPIC, // 31
- C_DIGITITLEPIC, // 32
- C_MUSICTITLEPIC, // 33
- C_MOUSELBACKPIC, // 34
- C_BABYMODEPIC, // 35
- C_EASYPIC, // 36
- C_NORMALPIC, // 37
- C_HARDPIC, // 38
- C_LOADSAVEDISKPIC, // 39
- C_DISKLOADING1PIC, // 40
- C_DISKLOADING2PIC, // 41
- C_CONTROLPIC, // 42
- C_CUSTOMIZEPIC, // 43
- C_LOADGAMEPIC, // 44
- C_SAVEGAMEPIC, // 45
- C_EPISODE1PIC, // 46
- C_EPISODE2PIC, // 47
- C_EPISODE3PIC, // 48
- C_EPISODE4PIC, // 49
- C_EPISODE5PIC, // 50
- C_EPISODE6PIC, // 51
- C_CODEPIC, // 52
- // Lump Start
- L_GUYPIC, // 53
- L_COLONPIC, // 54
- L_NUM0PIC, // 55
- L_NUM1PIC, // 56
- L_NUM2PIC, // 57
- L_NUM3PIC, // 58
- L_NUM4PIC, // 59
- L_NUM5PIC, // 60
- L_NUM6PIC, // 61
- L_NUM7PIC, // 62
- L_NUM8PIC, // 63
- L_NUM9PIC, // 64
- L_PERCENTPIC, // 65
- L_APIC, // 66
- L_BPIC, // 67
- L_CPIC, // 68
- L_DPIC, // 69
- L_EPIC, // 70
- L_FPIC, // 71
- L_GPIC, // 72
- L_HPIC, // 73
- L_IPIC, // 74
- L_JPIC, // 75
- L_KPIC, // 76
- L_LPIC, // 77
- L_MPIC, // 78
- L_NPIC, // 79
- L_OPIC, // 80
- L_PPIC, // 81
- L_QPIC, // 82
- L_RPIC, // 83
- L_SPIC, // 84
- L_TPIC, // 85
- L_UPIC, // 86
- L_VPIC, // 87
- L_WPIC, // 88
- L_XPIC, // 89
- L_YPIC, // 90
- L_ZPIC, // 91
- L_GUY2PIC, // 92
- L_BJWINSPIC, // 93
- STATUSBARPIC, // 94
- TITLEPIC, // 95
- PG13PIC, // 96
- CREDITSPIC, // 97
- HIGHSCORESPIC, // 98
- // Lump Start
- KNIFEPIC, // 99
- GUNPIC, // 100
- MACHINEGUNPIC, // 101
- GATLINGGUNPIC, // 102
- NOKEYPIC, // 103
- GOLDKEYPIC, // 104
- SILVERKEYPIC, // 105
- N_BLANKPIC, // 106
- N_0PIC, // 107
- N_1PIC, // 108
- N_2PIC, // 109
- N_3PIC, // 110
- N_4PIC, // 111
- N_5PIC, // 112
- N_6PIC, // 113
- N_7PIC, // 114
- N_8PIC, // 115
- N_9PIC, // 116
- FACE1APIC, // 117
- FACE1BPIC, // 118
- FACE1CPIC, // 119
- FACE2APIC, // 120
- FACE2BPIC, // 121
- FACE2CPIC, // 122
- FACE3APIC, // 123
- FACE3BPIC, // 124
- FACE3CPIC, // 125
- FACE4APIC, // 126
- FACE4BPIC, // 127
- FACE4CPIC, // 128
- FACE5APIC, // 129
- FACE5BPIC, // 130
- FACE5CPIC, // 131
- FACE6APIC, // 132
- FACE6BPIC, // 133
- FACE6CPIC, // 134
- FACE7APIC, // 135
- FACE7BPIC, // 136
- FACE7CPIC, // 137
- FACE8APIC, // 138
- GOTGATLINGPIC, // 139
- PAUSEDPIC, // 140
- GETPSYCHEDPIC, // 141
-
-
-
- ORDERSCREEN=557,
- ENUMEND
- } graphicnums;
-
-//
-// Data LUMPs
-//
-#define README_LUMP_START 3
-#define README_LUMP_END 25
-
-#define CONTROLS_LUMP_START 26
-#define CONTROLS_LUMP_END 52
-
-#define LEVELEND_LUMP_START 53
-#define LEVELEND_LUMP_END 93
-
-#define LATCHPICS_LUMP_START 99
-#define LATCHPICS_LUMP_END 141
-
-
-//
-// Amount of each data item
-//
-#define NUMCHUNKS 558
-#define NUMFONT 2
-#define NUMFONTM 0
-#define NUMPICS 139
-#define NUMPICM 0
-#define NUMSPRITES 0
-#define NUMTILE8 72
-#define NUMTILE8M 0
-#define NUMTILE16 144
-#define NUMTILE16M 270
-#define NUMTILE32 0
-#define NUMTILE32M 0
-#define NUMEXTERNS 1
-//
-// File offsets for data items
-//
-#define STRUCTPIC 0
-
-#define STARTFONT 1
-#define STARTFONTM 3
-#define STARTPICS 3
-#define STARTPICM 142
-#define STARTSPRITES 142
-#define STARTTILE8 142
-#define STARTTILE8M 143
-#define STARTTILE16 143
-#define STARTTILE16M 287
-#define STARTTILE32 557
-#define STARTTILE32M 557
-#define STARTEXTERNS 557
-
-//
-// Thank you for using IGRAB!
-//
--- a/WOLFSRC/GFXE_WL6.EQU
+++ /dev/null
@@ -1,47 +1,0 @@
-;=====================================
-;
-; Graphics .EQU file for .WL6
-; IGRAB-ed on Sun Aug 09 22:17:20 1992
-;
-;=====================================
-
-
-
-
-
-
-;
-; Amount of each data item
-;
-NUMCHUNKS = 414
-NUMFONT = 0
-NUMFONTM = 0
-NUMPICS = 0
-NUMPICM = 0
-NUMSPRITES = 0
-NUMTILE8 = 0
-NUMTILE8M = 0
-NUMTILE16 = 144
-NUMTILE16M = 270
-NUMTILE32 = 0
-NUMTILE32M = 0
-NUMEXTERN = 0
-;
-; File offsets for data items
-;
-STARTFONT = 0
-STARTFONTM = 0
-STARTPICS = 0
-STARTPICM = 0
-STARTSPRITES = 0
-STARTTILE8 = 0
-STARTTILE8M = 0
-STARTTILE16 = 0
-STARTTILE16M = 144
-STARTTILE32 = 414
-STARTTILE32M = 414
-STARTEXTERN = 414
-
-;
-; Thank you for using IGRAB!
-;
--- a/WOLFSRC/GFXE_WL6.H
+++ /dev/null
@@ -1,53 +1,0 @@
-//////////////////////////////////////
-//
-// Graphics .H file for .WL6
-// IGRAB-ed on Sun Aug 09 22:17:20 1992
-//
-//////////////////////////////////////
-
-typedef enum {
-
-
-
- ENUMEND
- } graphicnums;
-
-//
-// Data LUMPs
-//
-
-//
-// Amount of each data item
-//
-#define NUMCHUNKS 414
-#define NUMFONT 0
-#define NUMFONTM 0
-#define NUMPICS 0
-#define NUMPICM 0
-#define NUMSPRITES 0
-#define NUMTILE8 0
-#define NUMTILE8M 0
-#define NUMTILE16 144
-#define NUMTILE16M 270
-#define NUMTILE32 0
-#define NUMTILE32M 0
-#define NUMEXTERNS 0
-//
-// File offsets for data items
-//
-#define STARTFONT 0
-#define STARTFONTM 0
-#define STARTPICS 0
-#define STARTPICM 0
-#define STARTSPRITES 0
-#define STARTTILE8 0
-#define STARTTILE8M 0
-#define STARTTILE16 0
-#define STARTTILE16M 144
-#define STARTTILE32 414
-#define STARTTILE32M 414
-#define STARTEXTERNS 414
-
-//
-// Thank you for using IGRAB!
-//
--- a/WOLFSRC/GFXV_SDM.EQU
+++ /dev/null
@@ -1,208 +1,0 @@
-;=====================================
-;
-; Graphics .EQU file for .SDM
-; IGRAB-ed on Mon Sep 21 14:20:19 1992
-;
-;=====================================
-
-C_BACKDROPPIC = 3
-C_MOUSELBACKPIC = 4
-C_CURSOR1PIC = 5
-C_CURSOR2PIC = 6
-C_NOTSELECTEDPIC = 7
-C_SELECTEDPIC = 8
-C_CUSTOMIZEPIC = 9
-C_JOY1PIC = 10
-C_JOY2PIC = 11
-C_MOUSEPIC = 12
-C_JOYSTICKPIC = 13
-C_KEYBOARDPIC = 14
-C_CONTROLPIC = 15
-C_OPTIONSPIC = 16
-C_FXTITLEPIC = 17
-C_DIGITITLEPIC = 18
-C_MUSICTITLEPIC = 19
-C_HOWTOUGHPIC = 20
-C_BABYMODEPIC = 21
-C_EASYPIC = 22
-C_NORMALPIC = 23
-C_HARDPIC = 24
-C_DISKLOADING1PIC = 25
-C_DISKLOADING2PIC = 26
-C_LOADGAMEPIC = 27
-C_SAVEGAMEPIC = 28
-HIGHSCORESPIC = 29
-C_WONSPEARPIC = 30
-L_GUYPIC = 31
-L_COLONPIC = 32
-L_NUM0PIC = 33
-L_NUM1PIC = 34
-L_NUM2PIC = 35
-L_NUM3PIC = 36
-L_NUM4PIC = 37
-L_NUM5PIC = 38
-L_NUM6PIC = 39
-L_NUM7PIC = 40
-L_NUM8PIC = 41
-L_NUM9PIC = 42
-L_PERCENTPIC = 43
-L_APIC = 44
-L_BPIC = 45
-L_CPIC = 46
-L_DPIC = 47
-L_EPIC = 48
-L_FPIC = 49
-L_GPIC = 50
-L_HPIC = 51
-L_IPIC = 52
-L_JPIC = 53
-L_KPIC = 54
-L_LPIC = 55
-L_MPIC = 56
-L_NPIC = 57
-L_OPIC = 58
-L_PPIC = 59
-L_QPIC = 60
-L_RPIC = 61
-L_SPIC = 62
-L_TPIC = 63
-L_UPIC = 64
-L_VPIC = 65
-L_WPIC = 66
-L_XPIC = 67
-L_YPIC = 68
-L_ZPIC = 69
-L_EXPOINTPIC = 70
-L_APOSTROPHEPIC = 71
-L_GUY2PIC = 72
-L_BJWINSPIC = 73
-TITLE1PIC = 74
-TITLE2PIC = 75
-STATUSBARPIC = 76
-PG13PIC = 77
-CREDITSPIC = 78
-KNIFEPIC = 79
-GUNPIC = 80
-MACHINEGUNPIC = 81
-GATLINGGUNPIC = 82
-NOKEYPIC = 83
-GOLDKEYPIC = 84
-SILVERKEYPIC = 85
-N_BLANKPIC = 86
-N_0PIC = 87
-N_1PIC = 88
-N_2PIC = 89
-N_3PIC = 90
-N_4PIC = 91
-N_5PIC = 92
-N_6PIC = 93
-N_7PIC = 94
-N_8PIC = 95
-N_9PIC = 96
-FACE1APIC = 97
-FACE1BPIC = 98
-FACE1CPIC = 99
-FACE2APIC = 100
-FACE2BPIC = 101
-FACE2CPIC = 102
-FACE3APIC = 103
-FACE3BPIC = 104
-FACE3CPIC = 105
-FACE4APIC = 106
-FACE4BPIC = 107
-FACE4CPIC = 108
-FACE5APIC = 109
-FACE5BPIC = 110
-FACE5CPIC = 111
-FACE6APIC = 112
-FACE6BPIC = 113
-FACE6CPIC = 114
-FACE7APIC = 115
-FACE7BPIC = 116
-FACE7CPIC = 117
-FACE8APIC = 118
-GOTGATLINGPIC = 119
-GODMODEFACE1PIC = 120
-GODMODEFACE2PIC = 121
-GODMODEFACE3PIC = 122
-BJWAITING1PIC = 123
-BJWAITING2PIC = 124
-BJOUCHPIC = 125
-PAUSEDPIC = 126
-GETPSYCHEDPIC = 127
-
-
-
-ORDERSCREEN = 129
-ERRORSCREEN = 130
-TITLEPALETTE = 131
-T_DEMO0 = 132
-
-BACKDROP_LUMP_START = 3
-BACKDROP_LUMP_END = 8
-
-CONTROL_LUMP_START = 9
-CONTROL_LUMP_END = 15
-
-OPTIONS_LUMP_START = 16
-OPTIONS_LUMP_END = 16
-
-SOUND_LUMP_START = 17
-SOUND_LUMP_END = 19
-
-NEWGAME_LUMP_START = 20
-NEWGAME_LUMP_END = 24
-
-LOADSAVE_LUMP_START = 25
-LOADSAVE_LUMP_END = 28
-
-HIGHSCORES_LUMP_START = 29
-HIGHSCORES_LUMP_END = 30
-
-LEVELEND_LUMP_START = 31
-LEVELEND_LUMP_END = 73
-
-TITLESCREEN_LUMP_START = 74
-TITLESCREEN_LUMP_END = 75
-
-LATCHPICS_LUMP_START = 79
-LATCHPICS_LUMP_END = 127
-
-
-;
-; Amount of each data item
-;
-NUMCHUNKS = 133
-NUMFONT = 2
-NUMFONTM = 0
-NUMPICS = 125
-NUMPICM = 0
-NUMSPRITES = 0
-NUMTILE8 = 72
-NUMTILE8M = 0
-NUMTILE16 = 0
-NUMTILE16M = 0
-NUMTILE32 = 0
-NUMTILE32M = 0
-NUMEXTERN = 4
-;
-; File offsets for data items
-;
-STRUCTPIC = 0
-
-STARTFONT = 1
-STARTFONTM = 3
-STARTPICS = 3
-STARTPICM = 128
-STARTSPRITES = 128
-STARTTILE8 = 128
-STARTTILE8M = 129
-STARTTILE16 = 129
-STARTTILE16M = 129
-STARTTILE32 = 129
-STARTTILE32M = 129
-STARTEXTERN = 129
-
-;
-; Thank you for using IGRAB!
-;
--- a/WOLFSRC/GFXV_SDM.H
+++ /dev/null
@@ -1,224 +1,0 @@
-//////////////////////////////////////
-//
-// Graphics .H file for .SDM
-// IGRAB-ed on Mon Sep 21 14:20:19 1992
-//
-//////////////////////////////////////
-
-typedef enum {
- // Lump Start
- C_BACKDROPPIC=3,
- C_MOUSELBACKPIC, // 4
- C_CURSOR1PIC, // 5
- C_CURSOR2PIC, // 6
- C_NOTSELECTEDPIC, // 7
- C_SELECTEDPIC, // 8
- // Lump Start
- C_CUSTOMIZEPIC, // 9
- C_JOY1PIC, // 10
- C_JOY2PIC, // 11
- C_MOUSEPIC, // 12
- C_JOYSTICKPIC, // 13
- C_KEYBOARDPIC, // 14
- C_CONTROLPIC, // 15
- // Lump Start
- C_OPTIONSPIC, // 16
- // Lump Start
- C_FXTITLEPIC, // 17
- C_DIGITITLEPIC, // 18
- C_MUSICTITLEPIC, // 19
- // Lump Start
- C_HOWTOUGHPIC, // 20
- C_BABYMODEPIC, // 21
- C_EASYPIC, // 22
- C_NORMALPIC, // 23
- C_HARDPIC, // 24
- // Lump Start
- C_DISKLOADING1PIC, // 25
- C_DISKLOADING2PIC, // 26
- C_LOADGAMEPIC, // 27
- C_SAVEGAMEPIC, // 28
- // Lump Start
- HIGHSCORESPIC, // 29
- C_WONSPEARPIC, // 30
- // Lump Start
- L_GUYPIC, // 31
- L_COLONPIC, // 32
- L_NUM0PIC, // 33
- L_NUM1PIC, // 34
- L_NUM2PIC, // 35
- L_NUM3PIC, // 36
- L_NUM4PIC, // 37
- L_NUM5PIC, // 38
- L_NUM6PIC, // 39
- L_NUM7PIC, // 40
- L_NUM8PIC, // 41
- L_NUM9PIC, // 42
- L_PERCENTPIC, // 43
- L_APIC, // 44
- L_BPIC, // 45
- L_CPIC, // 46
- L_DPIC, // 47
- L_EPIC, // 48
- L_FPIC, // 49
- L_GPIC, // 50
- L_HPIC, // 51
- L_IPIC, // 52
- L_JPIC, // 53
- L_KPIC, // 54
- L_LPIC, // 55
- L_MPIC, // 56
- L_NPIC, // 57
- L_OPIC, // 58
- L_PPIC, // 59
- L_QPIC, // 60
- L_RPIC, // 61
- L_SPIC, // 62
- L_TPIC, // 63
- L_UPIC, // 64
- L_VPIC, // 65
- L_WPIC, // 66
- L_XPIC, // 67
- L_YPIC, // 68
- L_ZPIC, // 69
- L_EXPOINTPIC, // 70
- L_APOSTROPHEPIC, // 71
- L_GUY2PIC, // 72
- L_BJWINSPIC, // 73
- // Lump Start
- TITLE1PIC, // 74
- TITLE2PIC, // 75
- STATUSBARPIC, // 76
- PG13PIC, // 77
- CREDITSPIC, // 78
- // Lump Start
- KNIFEPIC, // 79
- GUNPIC, // 80
- MACHINEGUNPIC, // 81
- GATLINGGUNPIC, // 82
- NOKEYPIC, // 83
- GOLDKEYPIC, // 84
- SILVERKEYPIC, // 85
- N_BLANKPIC, // 86
- N_0PIC, // 87
- N_1PIC, // 88
- N_2PIC, // 89
- N_3PIC, // 90
- N_4PIC, // 91
- N_5PIC, // 92
- N_6PIC, // 93
- N_7PIC, // 94
- N_8PIC, // 95
- N_9PIC, // 96
- FACE1APIC, // 97
- FACE1BPIC, // 98
- FACE1CPIC, // 99
- FACE2APIC, // 100
- FACE2BPIC, // 101
- FACE2CPIC, // 102
- FACE3APIC, // 103
- FACE3BPIC, // 104
- FACE3CPIC, // 105
- FACE4APIC, // 106
- FACE4BPIC, // 107
- FACE4CPIC, // 108
- FACE5APIC, // 109
- FACE5BPIC, // 110
- FACE5CPIC, // 111
- FACE6APIC, // 112
- FACE6BPIC, // 113
- FACE6CPIC, // 114
- FACE7APIC, // 115
- FACE7BPIC, // 116
- FACE7CPIC, // 117
- FACE8APIC, // 118
- GOTGATLINGPIC, // 119
- GODMODEFACE1PIC, // 120
- GODMODEFACE2PIC, // 121
- GODMODEFACE3PIC, // 122
- BJWAITING1PIC, // 123
- BJWAITING2PIC, // 124
- BJOUCHPIC, // 125
- PAUSEDPIC, // 126
- GETPSYCHEDPIC, // 127
-
-
-
- ORDERSCREEN=129,
- ERRORSCREEN, // 130
- TITLEPALETTE, // 131
- T_DEMO0, // 132
- ENUMEND
- } graphicnums;
-
-//
-// Data LUMPs
-//
-#define BACKDROP_LUMP_START 3
-#define BACKDROP_LUMP_END 8
-
-#define CONTROL_LUMP_START 9
-#define CONTROL_LUMP_END 15
-
-#define OPTIONS_LUMP_START 16
-#define OPTIONS_LUMP_END 16
-
-#define SOUND_LUMP_START 17
-#define SOUND_LUMP_END 19
-
-#define NEWGAME_LUMP_START 20
-#define NEWGAME_LUMP_END 24
-
-#define LOADSAVE_LUMP_START 25
-#define LOADSAVE_LUMP_END 28
-
-#define HIGHSCORES_LUMP_START 29
-#define HIGHSCORES_LUMP_END 30
-
-#define LEVELEND_LUMP_START 31
-#define LEVELEND_LUMP_END 73
-
-#define TITLESCREEN_LUMP_START 74
-#define TITLESCREEN_LUMP_END 75
-
-#define LATCHPICS_LUMP_START 79
-#define LATCHPICS_LUMP_END 127
-
-
-//
-// Amount of each data item
-//
-#define NUMCHUNKS 133
-#define NUMFONT 2
-#define NUMFONTM 0
-#define NUMPICS 125
-#define NUMPICM 0
-#define NUMSPRITES 0
-#define NUMTILE8 72
-#define NUMTILE8M 0
-#define NUMTILE16 0
-#define NUMTILE16M 0
-#define NUMTILE32 0
-#define NUMTILE32M 0
-#define NUMEXTERNS 4
-//
-// File offsets for data items
-//
-#define STRUCTPIC 0
-
-#define STARTFONT 1
-#define STARTFONTM 3
-#define STARTPICS 3
-#define STARTPICM 128
-#define STARTSPRITES 128
-#define STARTTILE8 128
-#define STARTTILE8M 129
-#define STARTTILE16 129
-#define STARTTILE16M 129
-#define STARTTILE32 129
-#define STARTTILE32M 129
-#define STARTEXTERNS 129
-
-//
-// Thank you for using IGRAB!
-//
--- a/WOLFSRC/GFXV_SOD.EQU
+++ /dev/null
@@ -1,259 +1,0 @@
-;=====================================
-;
-; Graphics .EQU file for .SOD
-; IGRAB-ed on Thu Oct 08 20:38:29 1992
-;
-;=====================================
-
-C_BACKDROPPIC = 3
-C_MOUSELBACKPIC = 4
-C_CURSOR1PIC = 5
-C_CURSOR2PIC = 6
-C_NOTSELECTEDPIC = 7
-C_SELECTEDPIC = 8
-C_CUSTOMIZEPIC = 9
-C_JOY1PIC = 10
-C_JOY2PIC = 11
-C_MOUSEPIC = 12
-C_JOYSTICKPIC = 13
-C_KEYBOARDPIC = 14
-C_CONTROLPIC = 15
-C_OPTIONSPIC = 16
-C_FXTITLEPIC = 17
-C_DIGITITLEPIC = 18
-C_MUSICTITLEPIC = 19
-C_HOWTOUGHPIC = 20
-C_BABYMODEPIC = 21
-C_EASYPIC = 22
-C_NORMALPIC = 23
-C_HARDPIC = 24
-C_DISKLOADING1PIC = 25
-C_DISKLOADING2PIC = 26
-C_LOADGAMEPIC = 27
-C_SAVEGAMEPIC = 28
-HIGHSCORESPIC = 29
-C_WONSPEARPIC = 30
-BJCOLLAPSE1PIC = 31
-BJCOLLAPSE2PIC = 32
-BJCOLLAPSE3PIC = 33
-BJCOLLAPSE4PIC = 34
-ENDPICPIC = 35
-L_GUYPIC = 36
-L_COLONPIC = 37
-L_NUM0PIC = 38
-L_NUM1PIC = 39
-L_NUM2PIC = 40
-L_NUM3PIC = 41
-L_NUM4PIC = 42
-L_NUM5PIC = 43
-L_NUM6PIC = 44
-L_NUM7PIC = 45
-L_NUM8PIC = 46
-L_NUM9PIC = 47
-L_PERCENTPIC = 48
-L_APIC = 49
-L_BPIC = 50
-L_CPIC = 51
-L_DPIC = 52
-L_EPIC = 53
-L_FPIC = 54
-L_GPIC = 55
-L_HPIC = 56
-L_IPIC = 57
-L_JPIC = 58
-L_KPIC = 59
-L_LPIC = 60
-L_MPIC = 61
-L_NPIC = 62
-L_OPIC = 63
-L_PPIC = 64
-L_QPIC = 65
-L_RPIC = 66
-L_SPIC = 67
-L_TPIC = 68
-L_UPIC = 69
-L_VPIC = 70
-L_WPIC = 71
-L_XPIC = 72
-L_YPIC = 73
-L_ZPIC = 74
-L_EXPOINTPIC = 75
-L_APOSTROPHEPIC = 76
-L_GUY2PIC = 77
-L_BJWINSPIC = 78
-TITLE1PIC = 79
-TITLE2PIC = 80
-ENDSCREEN11PIC = 81
-ENDSCREEN12PIC = 82
-ENDSCREEN3PIC = 83
-ENDSCREEN4PIC = 84
-ENDSCREEN5PIC = 85
-ENDSCREEN6PIC = 86
-ENDSCREEN7PIC = 87
-ENDSCREEN8PIC = 88
-ENDSCREEN9PIC = 89
-STATUSBARPIC = 90
-PG13PIC = 91
-CREDITSPIC = 92
-IDGUYS1PIC = 93
-IDGUYS2PIC = 94
-COPYPROTTOPPIC = 95
-COPYPROTBOXPIC = 96
-BOSSPIC1PIC = 97
-BOSSPIC2PIC = 98
-BOSSPIC3PIC = 99
-BOSSPIC4PIC = 100
-KNIFEPIC = 101
-GUNPIC = 102
-MACHINEGUNPIC = 103
-GATLINGGUNPIC = 104
-NOKEYPIC = 105
-GOLDKEYPIC = 106
-SILVERKEYPIC = 107
-N_BLANKPIC = 108
-N_0PIC = 109
-N_1PIC = 110
-N_2PIC = 111
-N_3PIC = 112
-N_4PIC = 113
-N_5PIC = 114
-N_6PIC = 115
-N_7PIC = 116
-N_8PIC = 117
-N_9PIC = 118
-FACE1APIC = 119
-FACE1BPIC = 120
-FACE1CPIC = 121
-FACE2APIC = 122
-FACE2BPIC = 123
-FACE2CPIC = 124
-FACE3APIC = 125
-FACE3BPIC = 126
-FACE3CPIC = 127
-FACE4APIC = 128
-FACE4BPIC = 129
-FACE4CPIC = 130
-FACE5APIC = 131
-FACE5BPIC = 132
-FACE5CPIC = 133
-FACE6APIC = 134
-FACE6BPIC = 135
-FACE6CPIC = 136
-FACE7APIC = 137
-FACE7BPIC = 138
-FACE7CPIC = 139
-FACE8APIC = 140
-GOTGATLINGPIC = 141
-GODMODEFACE1PIC = 142
-GODMODEFACE2PIC = 143
-GODMODEFACE3PIC = 144
-BJWAITING1PIC = 145
-BJWAITING2PIC = 146
-BJOUCHPIC = 147
-PAUSEDPIC = 148
-GETPSYCHEDPIC = 149
-
-
-
-ORDERSCREEN = 151
-ERRORSCREEN = 152
-TITLEPALETTE = 153
-END1PALETTE = 154
-END2PALETTE = 155
-END3PALETTE = 156
-END4PALETTE = 157
-END5PALETTE = 158
-END6PALETTE = 159
-END7PALETTE = 160
-END8PALETTE = 161
-END9PALETTE = 162
-IDGUYSPALETTE = 163
-T_DEMO0 = 164
-T_DEMO1 = 165
-T_DEMO2 = 166
-T_DEMO3 = 167
-T_ENDART1 = 168
-
-BACKDROP_LUMP_START = 3
-BACKDROP_LUMP_END = 8
-
-CONTROL_LUMP_START = 9
-CONTROL_LUMP_END = 15
-
-OPTIONS_LUMP_START = 16
-OPTIONS_LUMP_END = 16
-
-SOUND_LUMP_START = 17
-SOUND_LUMP_END = 19
-
-NEWGAME_LUMP_START = 20
-NEWGAME_LUMP_END = 24
-
-LOADSAVE_LUMP_START = 25
-LOADSAVE_LUMP_END = 28
-
-HIGHSCORES_LUMP_START = 29
-HIGHSCORES_LUMP_END = 30
-
-ENDGAME_LUMP_START = 31
-ENDGAME_LUMP_END = 35
-
-LEVELEND_LUMP_START = 36
-LEVELEND_LUMP_END = 78
-
-TITLESCREEN_LUMP_START = 79
-TITLESCREEN_LUMP_END = 80
-
-ENDGAME1_LUMP_START = 81
-ENDGAME1_LUMP_END = 81
-
-ENDGAME2_LUMP_START = 82
-ENDGAME2_LUMP_END = 82
-
-EASTEREGG_LUMP_START = 93
-EASTEREGG_LUMP_END = 94
-
-COPYPROT_LUMP_START = 95
-COPYPROT_LUMP_END = 100
-
-LATCHPICS_LUMP_START = 101
-LATCHPICS_LUMP_END = 149
-
-
-;
-; Amount of each data item
-;
-NUMCHUNKS = 169
-NUMFONT = 2
-NUMFONTM = 0
-NUMPICS = 147
-NUMPICM = 0
-NUMSPRITES = 0
-NUMTILE8 = 72
-NUMTILE8M = 0
-NUMTILE16 = 0
-NUMTILE16M = 0
-NUMTILE32 = 0
-NUMTILE32M = 0
-NUMEXTERN = 18
-;
-; File offsets for data items
-;
-STRUCTPIC = 0
-
-STARTFONT = 1
-STARTFONTM = 3
-STARTPICS = 3
-STARTPICM = 150
-STARTSPRITES = 150
-STARTTILE8 = 150
-STARTTILE8M = 151
-STARTTILE16 = 151
-STARTTILE16M = 151
-STARTTILE32 = 151
-STARTTILE32M = 151
-STARTEXTERN = 151
-
-;
-; Thank you for using IGRAB!
-;
--- a/WOLFSRC/GFXV_SOD.H
+++ /dev/null
@@ -1,280 +1,0 @@
-//////////////////////////////////////
-//
-// Graphics .H file for .SOD
-// IGRAB-ed on Thu Oct 08 20:38:29 1992
-//
-//////////////////////////////////////
-
-typedef enum {
- // Lump Start
- C_BACKDROPPIC=3,
- C_MOUSELBACKPIC, // 4
- C_CURSOR1PIC, // 5
- C_CURSOR2PIC, // 6
- C_NOTSELECTEDPIC, // 7
- C_SELECTEDPIC, // 8
- // Lump Start
- C_CUSTOMIZEPIC, // 9
- C_JOY1PIC, // 10
- C_JOY2PIC, // 11
- C_MOUSEPIC, // 12
- C_JOYSTICKPIC, // 13
- C_KEYBOARDPIC, // 14
- C_CONTROLPIC, // 15
- // Lump Start
- C_OPTIONSPIC, // 16
- // Lump Start
- C_FXTITLEPIC, // 17
- C_DIGITITLEPIC, // 18
- C_MUSICTITLEPIC, // 19
- // Lump Start
- C_HOWTOUGHPIC, // 20
- C_BABYMODEPIC, // 21
- C_EASYPIC, // 22
- C_NORMALPIC, // 23
- C_HARDPIC, // 24
- // Lump Start
- C_DISKLOADING1PIC, // 25
- C_DISKLOADING2PIC, // 26
- C_LOADGAMEPIC, // 27
- C_SAVEGAMEPIC, // 28
- // Lump Start
- HIGHSCORESPIC, // 29
- C_WONSPEARPIC, // 30
- // Lump Start
- BJCOLLAPSE1PIC, // 31
- BJCOLLAPSE2PIC, // 32
- BJCOLLAPSE3PIC, // 33
- BJCOLLAPSE4PIC, // 34
- ENDPICPIC, // 35
- // Lump Start
- L_GUYPIC, // 36
- L_COLONPIC, // 37
- L_NUM0PIC, // 38
- L_NUM1PIC, // 39
- L_NUM2PIC, // 40
- L_NUM3PIC, // 41
- L_NUM4PIC, // 42
- L_NUM5PIC, // 43
- L_NUM6PIC, // 44
- L_NUM7PIC, // 45
- L_NUM8PIC, // 46
- L_NUM9PIC, // 47
- L_PERCENTPIC, // 48
- L_APIC, // 49
- L_BPIC, // 50
- L_CPIC, // 51
- L_DPIC, // 52
- L_EPIC, // 53
- L_FPIC, // 54
- L_GPIC, // 55
- L_HPIC, // 56
- L_IPIC, // 57
- L_JPIC, // 58
- L_KPIC, // 59
- L_LPIC, // 60
- L_MPIC, // 61
- L_NPIC, // 62
- L_OPIC, // 63
- L_PPIC, // 64
- L_QPIC, // 65
- L_RPIC, // 66
- L_SPIC, // 67
- L_TPIC, // 68
- L_UPIC, // 69
- L_VPIC, // 70
- L_WPIC, // 71
- L_XPIC, // 72
- L_YPIC, // 73
- L_ZPIC, // 74
- L_EXPOINTPIC, // 75
- L_APOSTROPHEPIC, // 76
- L_GUY2PIC, // 77
- L_BJWINSPIC, // 78
- // Lump Start
- TITLE1PIC, // 79
- TITLE2PIC, // 80
- // Lump Start
- ENDSCREEN11PIC, // 81
- // Lump Start
- ENDSCREEN12PIC, // 82
- ENDSCREEN3PIC, // 83
- ENDSCREEN4PIC, // 84
- ENDSCREEN5PIC, // 85
- ENDSCREEN6PIC, // 86
- ENDSCREEN7PIC, // 87
- ENDSCREEN8PIC, // 88
- ENDSCREEN9PIC, // 89
- STATUSBARPIC, // 90
- PG13PIC, // 91
- CREDITSPIC, // 92
- // Lump Start
- IDGUYS1PIC, // 93
- IDGUYS2PIC, // 94
- // Lump Start
- COPYPROTTOPPIC, // 95
- COPYPROTBOXPIC, // 96
- BOSSPIC1PIC, // 97
- BOSSPIC2PIC, // 98
- BOSSPIC3PIC, // 99
- BOSSPIC4PIC, // 100
- // Lump Start
- KNIFEPIC, // 101
- GUNPIC, // 102
- MACHINEGUNPIC, // 103
- GATLINGGUNPIC, // 104
- NOKEYPIC, // 105
- GOLDKEYPIC, // 106
- SILVERKEYPIC, // 107
- N_BLANKPIC, // 108
- N_0PIC, // 109
- N_1PIC, // 110
- N_2PIC, // 111
- N_3PIC, // 112
- N_4PIC, // 113
- N_5PIC, // 114
- N_6PIC, // 115
- N_7PIC, // 116
- N_8PIC, // 117
- N_9PIC, // 118
- FACE1APIC, // 119
- FACE1BPIC, // 120
- FACE1CPIC, // 121
- FACE2APIC, // 122
- FACE2BPIC, // 123
- FACE2CPIC, // 124
- FACE3APIC, // 125
- FACE3BPIC, // 126
- FACE3CPIC, // 127
- FACE4APIC, // 128
- FACE4BPIC, // 129
- FACE4CPIC, // 130
- FACE5APIC, // 131
- FACE5BPIC, // 132
- FACE5CPIC, // 133
- FACE6APIC, // 134
- FACE6BPIC, // 135
- FACE6CPIC, // 136
- FACE7APIC, // 137
- FACE7BPIC, // 138
- FACE7CPIC, // 139
- FACE8APIC, // 140
- GOTGATLINGPIC, // 141
- GODMODEFACE1PIC, // 142
- GODMODEFACE2PIC, // 143
- GODMODEFACE3PIC, // 144
- BJWAITING1PIC, // 145
- BJWAITING2PIC, // 146
- BJOUCHPIC, // 147
- PAUSEDPIC, // 148
- GETPSYCHEDPIC, // 149
-
-
-
- ORDERSCREEN=151,
- ERRORSCREEN, // 152
- TITLEPALETTE, // 153
- END1PALETTE, // 154
- END2PALETTE, // 155
- END3PALETTE, // 156
- END4PALETTE, // 157
- END5PALETTE, // 158
- END6PALETTE, // 159
- END7PALETTE, // 160
- END8PALETTE, // 161
- END9PALETTE, // 162
- IDGUYSPALETTE, // 163
- T_DEMO0, // 164
- T_DEMO1, // 165
- T_DEMO2, // 166
- T_DEMO3, // 167
- T_ENDART1, // 168
- ENUMEND
- } graphicnums;
-
-//
-// Data LUMPs
-//
-#define BACKDROP_LUMP_START 3
-#define BACKDROP_LUMP_END 8
-
-#define CONTROL_LUMP_START 9
-#define CONTROL_LUMP_END 15
-
-#define OPTIONS_LUMP_START 16
-#define OPTIONS_LUMP_END 16
-
-#define SOUND_LUMP_START 17
-#define SOUND_LUMP_END 19
-
-#define NEWGAME_LUMP_START 20
-#define NEWGAME_LUMP_END 24
-
-#define LOADSAVE_LUMP_START 25
-#define LOADSAVE_LUMP_END 28
-
-#define HIGHSCORES_LUMP_START 29
-#define HIGHSCORES_LUMP_END 30
-
-#define ENDGAME_LUMP_START 31
-#define ENDGAME_LUMP_END 35
-
-#define LEVELEND_LUMP_START 36
-#define LEVELEND_LUMP_END 78
-
-#define TITLESCREEN_LUMP_START 79
-#define TITLESCREEN_LUMP_END 80
-
-#define ENDGAME1_LUMP_START 81
-#define ENDGAME1_LUMP_END 81
-
-#define ENDGAME2_LUMP_START 82
-#define ENDGAME2_LUMP_END 82
-
-#define EASTEREGG_LUMP_START 93
-#define EASTEREGG_LUMP_END 94
-
-#define COPYPROT_LUMP_START 95
-#define COPYPROT_LUMP_END 100
-
-#define LATCHPICS_LUMP_START 101
-#define LATCHPICS_LUMP_END 149
-
-
-//
-// Amount of each data item
-//
-#define NUMCHUNKS 169
-#define NUMFONT 2
-#define NUMFONTM 0
-#define NUMPICS 147
-#define NUMPICM 0
-#define NUMSPRITES 0
-#define NUMTILE8 72
-#define NUMTILE8M 0
-#define NUMTILE16 0
-#define NUMTILE16M 0
-#define NUMTILE32 0
-#define NUMTILE32M 0
-#define NUMEXTERNS 18
-//
-// File offsets for data items
-//
-#define STRUCTPIC 0
-
-#define STARTFONT 1
-#define STARTFONTM 3
-#define STARTPICS 3
-#define STARTPICM 150
-#define STARTSPRITES 150
-#define STARTTILE8 150
-#define STARTTILE8M 151
-#define STARTTILE16 151
-#define STARTTILE16M 151
-#define STARTTILE32 151
-#define STARTTILE32M 151
-#define STARTEXTERNS 151
-
-//
-// Thank you for using IGRAB!
-//
--- a/WOLFSRC/GFXV_WL1.EQU
+++ /dev/null
@@ -1,199 +1,0 @@
-;=====================================
-;
-; Graphics .EQU file for .WL1
-; IGRAB-ed on Sun May 03 01:19:32 1992
-;
-;=====================================
-
-H_BJPIC = 3
-H_CASTLEPIC = 4
-H_KEYBOARDPIC = 5
-H_JOYPIC = 6
-H_HEALPIC = 7
-H_TREASUREPIC = 8
-H_GUNPIC = 9
-H_KEYPIC = 10
-H_BLAZEPIC = 11
-H_WEAPON1234PIC = 12
-H_WOLFLOGOPIC = 13
-H_VISAPIC = 14
-H_MCPIC = 15
-H_IDLOGOPIC = 16
-H_TOPWINDOWPIC = 17
-H_LEFTWINDOWPIC = 18
-H_RIGHTWINDOWPIC = 19
-H_BOTTOMINFOPIC = 20
-C_OPTIONSPIC = 21
-C_CURSOR1PIC = 22
-C_CURSOR2PIC = 23
-C_NOTSELECTEDPIC = 24
-C_SELECTEDPIC = 25
-C_FXTITLEPIC = 26
-C_DIGITITLEPIC = 27
-C_MUSICTITLEPIC = 28
-C_MOUSELBACKPIC = 29
-C_BABYMODEPIC = 30
-C_EASYPIC = 31
-C_NORMALPIC = 32
-C_HARDPIC = 33
-C_LOADSAVEDISKPIC = 34
-C_DISKLOADING1PIC = 35
-C_DISKLOADING2PIC = 36
-C_CONTROLPIC = 37
-C_CUSTOMIZEPIC = 38
-C_LOADGAMEPIC = 39
-C_SAVEGAMEPIC = 40
-C_EPISODE1PIC = 41
-C_EPISODE2PIC = 42
-C_EPISODE3PIC = 43
-C_EPISODE4PIC = 44
-C_EPISODE5PIC = 45
-C_EPISODE6PIC = 46
-C_CODEPIC = 47
-L_GUYPIC = 48
-L_COLONPIC = 49
-L_NUM0PIC = 50
-L_NUM1PIC = 51
-L_NUM2PIC = 52
-L_NUM3PIC = 53
-L_NUM4PIC = 54
-L_NUM5PIC = 55
-L_NUM6PIC = 56
-L_NUM7PIC = 57
-L_NUM8PIC = 58
-L_NUM9PIC = 59
-L_PERCENTPIC = 60
-L_APIC = 61
-L_BPIC = 62
-L_CPIC = 63
-L_DPIC = 64
-L_EPIC = 65
-L_FPIC = 66
-L_GPIC = 67
-L_HPIC = 68
-L_IPIC = 69
-L_JPIC = 70
-L_KPIC = 71
-L_LPIC = 72
-L_MPIC = 73
-L_NPIC = 74
-L_OPIC = 75
-L_PPIC = 76
-L_QPIC = 77
-L_RPIC = 78
-L_SPIC = 79
-L_TPIC = 80
-L_UPIC = 81
-L_VPIC = 82
-L_WPIC = 83
-L_XPIC = 84
-L_YPIC = 85
-L_ZPIC = 86
-L_EXPOINTPIC = 87
-L_GUY2PIC = 88
-L_BJWINSPIC = 89
-STATUSBARPIC = 90
-TITLEPIC = 91
-PG13PIC = 92
-CREDITSPIC = 93
-HIGHSCORESPIC = 94
-KNIFEPIC = 95
-GUNPIC = 96
-MACHINEGUNPIC = 97
-GATLINGGUNPIC = 98
-NOKEYPIC = 99
-GOLDKEYPIC = 100
-SILVERKEYPIC = 101
-N_BLANKPIC = 102
-N_0PIC = 103
-N_1PIC = 104
-N_2PIC = 105
-N_3PIC = 106
-N_4PIC = 107
-N_5PIC = 108
-N_6PIC = 109
-N_7PIC = 110
-N_8PIC = 111
-N_9PIC = 112
-FACE1APIC = 113
-FACE1BPIC = 114
-FACE1CPIC = 115
-FACE2APIC = 116
-FACE2BPIC = 117
-FACE2CPIC = 118
-FACE3APIC = 119
-FACE3BPIC = 120
-FACE3CPIC = 121
-FACE4APIC = 122
-FACE4BPIC = 123
-FACE4CPIC = 124
-FACE5APIC = 125
-FACE5BPIC = 126
-FACE5CPIC = 127
-FACE6APIC = 128
-FACE6BPIC = 129
-FACE6CPIC = 130
-FACE7APIC = 131
-FACE7BPIC = 132
-FACE7CPIC = 133
-FACE8APIC = 134
-GOTGATLINGPIC = 135
-MUTANTBJPIC = 136
-PAUSEDPIC = 137
-GETPSYCHEDPIC = 138
-
-
-
-ORDERSCREEN = 554
-ERRORSCREEN = 555
-
-README_LUMP_START = 3
-README_LUMP_END = 20
-
-CONTROLS_LUMP_START = 21
-CONTROLS_LUMP_END = 47
-
-LEVELEND_LUMP_START = 48
-LEVELEND_LUMP_END = 89
-
-LATCHPICS_LUMP_START = 95
-LATCHPICS_LUMP_END = 138
-
-
-;
-; Amount of each data item
-;
-NUMCHUNKS = 556
-NUMFONT = 2
-NUMFONTM = 0
-NUMPICS = 136
-NUMPICM = 0
-NUMSPRITES = 0
-NUMTILE8 = 72
-NUMTILE8M = 0
-NUMTILE16 = 144
-NUMTILE16M = 270
-NUMTILE32 = 0
-NUMTILE32M = 0
-NUMEXTERN = 2
-;
-; File offsets for data items
-;
-STRUCTPIC = 0
-
-STARTFONT = 1
-STARTFONTM = 3
-STARTPICS = 3
-STARTPICM = 139
-STARTSPRITES = 139
-STARTTILE8 = 139
-STARTTILE8M = 140
-STARTTILE16 = 140
-STARTTILE16M = 284
-STARTTILE32 = 554
-STARTTILE32M = 554
-STARTEXTERN = 554
-
-;
-; Thank you for using IGRAB!
-;
--- a/WOLFSRC/GFXV_WL1.H
+++ /dev/null
@@ -1,209 +1,0 @@
-//////////////////////////////////////
-//
-// Graphics .H file for .WL1
-// IGRAB-ed on Sun May 03 01:19:32 1992
-//
-//////////////////////////////////////
-
-typedef enum {
- // Lump Start
- H_BJPIC=3,
- H_CASTLEPIC, // 4
- H_KEYBOARDPIC, // 5
- H_JOYPIC, // 6
- H_HEALPIC, // 7
- H_TREASUREPIC, // 8
- H_GUNPIC, // 9
- H_KEYPIC, // 10
- H_BLAZEPIC, // 11
- H_WEAPON1234PIC, // 12
- H_WOLFLOGOPIC, // 13
- H_VISAPIC, // 14
- H_MCPIC, // 15
- H_IDLOGOPIC, // 16
- H_TOPWINDOWPIC, // 17
- H_LEFTWINDOWPIC, // 18
- H_RIGHTWINDOWPIC, // 19
- H_BOTTOMINFOPIC, // 20
- // Lump Start
- C_OPTIONSPIC, // 21
- C_CURSOR1PIC, // 22
- C_CURSOR2PIC, // 23
- C_NOTSELECTEDPIC, // 24
- C_SELECTEDPIC, // 25
- C_FXTITLEPIC, // 26
- C_DIGITITLEPIC, // 27
- C_MUSICTITLEPIC, // 28
- C_MOUSELBACKPIC, // 29
- C_BABYMODEPIC, // 30
- C_EASYPIC, // 31
- C_NORMALPIC, // 32
- C_HARDPIC, // 33
- C_LOADSAVEDISKPIC, // 34
- C_DISKLOADING1PIC, // 35
- C_DISKLOADING2PIC, // 36
- C_CONTROLPIC, // 37
- C_CUSTOMIZEPIC, // 38
- C_LOADGAMEPIC, // 39
- C_SAVEGAMEPIC, // 40
- C_EPISODE1PIC, // 41
- C_EPISODE2PIC, // 42
- C_EPISODE3PIC, // 43
- C_EPISODE4PIC, // 44
- C_EPISODE5PIC, // 45
- C_EPISODE6PIC, // 46
- C_CODEPIC, // 47
- // Lump Start
- L_GUYPIC, // 48
- L_COLONPIC, // 49
- L_NUM0PIC, // 50
- L_NUM1PIC, // 51
- L_NUM2PIC, // 52
- L_NUM3PIC, // 53
- L_NUM4PIC, // 54
- L_NUM5PIC, // 55
- L_NUM6PIC, // 56
- L_NUM7PIC, // 57
- L_NUM8PIC, // 58
- L_NUM9PIC, // 59
- L_PERCENTPIC, // 60
- L_APIC, // 61
- L_BPIC, // 62
- L_CPIC, // 63
- L_DPIC, // 64
- L_EPIC, // 65
- L_FPIC, // 66
- L_GPIC, // 67
- L_HPIC, // 68
- L_IPIC, // 69
- L_JPIC, // 70
- L_KPIC, // 71
- L_LPIC, // 72
- L_MPIC, // 73
- L_NPIC, // 74
- L_OPIC, // 75
- L_PPIC, // 76
- L_QPIC, // 77
- L_RPIC, // 78
- L_SPIC, // 79
- L_TPIC, // 80
- L_UPIC, // 81
- L_VPIC, // 82
- L_WPIC, // 83
- L_XPIC, // 84
- L_YPIC, // 85
- L_ZPIC, // 86
- L_EXPOINTPIC, // 87
- L_GUY2PIC, // 88
- L_BJWINSPIC, // 89
- STATUSBARPIC, // 90
- TITLEPIC, // 91
- PG13PIC, // 92
- CREDITSPIC, // 93
- HIGHSCORESPIC, // 94
- // Lump Start
- KNIFEPIC, // 95
- GUNPIC, // 96
- MACHINEGUNPIC, // 97
- GATLINGGUNPIC, // 98
- NOKEYPIC, // 99
- GOLDKEYPIC, // 100
- SILVERKEYPIC, // 101
- N_BLANKPIC, // 102
- N_0PIC, // 103
- N_1PIC, // 104
- N_2PIC, // 105
- N_3PIC, // 106
- N_4PIC, // 107
- N_5PIC, // 108
- N_6PIC, // 109
- N_7PIC, // 110
- N_8PIC, // 111
- N_9PIC, // 112
- FACE1APIC, // 113
- FACE1BPIC, // 114
- FACE1CPIC, // 115
- FACE2APIC, // 116
- FACE2BPIC, // 117
- FACE2CPIC, // 118
- FACE3APIC, // 119
- FACE3BPIC, // 120
- FACE3CPIC, // 121
- FACE4APIC, // 122
- FACE4BPIC, // 123
- FACE4CPIC, // 124
- FACE5APIC, // 125
- FACE5BPIC, // 126
- FACE5CPIC, // 127
- FACE6APIC, // 128
- FACE6BPIC, // 129
- FACE6CPIC, // 130
- FACE7APIC, // 131
- FACE7BPIC, // 132
- FACE7CPIC, // 133
- FACE8APIC, // 134
- GOTGATLINGPIC, // 135
- MUTANTBJPIC, // 136
- PAUSEDPIC, // 137
- GETPSYCHEDPIC, // 138
-
-
-
- ORDERSCREEN=554,
- ERRORSCREEN, // 555
- ENUMEND
- } graphicnums;
-
-//
-// Data LUMPs
-//
-#define README_LUMP_START 3
-#define README_LUMP_END 20
-
-#define CONTROLS_LUMP_START 21
-#define CONTROLS_LUMP_END 47
-
-#define LEVELEND_LUMP_START 48
-#define LEVELEND_LUMP_END 89
-
-#define LATCHPICS_LUMP_START 95
-#define LATCHPICS_LUMP_END 138
-
-
-//
-// Amount of each data item
-//
-#define NUMCHUNKS 556
-#define NUMFONT 2
-#define NUMFONTM 0
-#define NUMPICS 136
-#define NUMPICM 0
-#define NUMSPRITES 0
-#define NUMTILE8 72
-#define NUMTILE8M 0
-#define NUMTILE16 144
-#define NUMTILE16M 270
-#define NUMTILE32 0
-#define NUMTILE32M 0
-#define NUMEXTERNS 2
-//
-// File offsets for data items
-//
-#define STRUCTPIC 0
-
-#define STARTFONT 1
-#define STARTFONTM 3
-#define STARTPICS 3
-#define STARTPICM 139
-#define STARTSPRITES 139
-#define STARTTILE8 139
-#define STARTTILE8M 140
-#define STARTTILE16 140
-#define STARTTILE16M 284
-#define STARTTILE32 554
-#define STARTTILE32M 554
-#define STARTEXTERNS 554
-
-//
-// Thank you for using IGRAB!
-//
--- a/WOLFSRC/GFXV_WL6.EQU
+++ /dev/null
@@ -1,206 +1,0 @@
-;=====================================
-;
-; Graphics .EQU file for .WL6
-; IGRAB-ed on Wed Apr 13 06:58:44 1994
-;
-;=====================================
-
-H_BJPIC = 3
-H_CASTLEPIC = 4
-H_BLAZEPIC = 5
-H_TOPWINDOWPIC = 6
-H_LEFTWINDOWPIC = 7
-H_RIGHTWINDOWPIC = 8
-H_BOTTOMINFOPIC = 9
-C_OPTIONSPIC = 10
-C_CURSOR1PIC = 11
-C_CURSOR2PIC = 12
-C_NOTSELECTEDPIC = 13
-C_SELECTEDPIC = 14
-C_FXTITLEPIC = 15
-C_DIGITITLEPIC = 16
-C_MUSICTITLEPIC = 17
-C_MOUSELBACKPIC = 18
-C_BABYMODEPIC = 19
-C_EASYPIC = 20
-C_NORMALPIC = 21
-C_HARDPIC = 22
-C_LOADSAVEDISKPIC = 23
-C_DISKLOADING1PIC = 24
-C_DISKLOADING2PIC = 25
-C_CONTROLPIC = 26
-C_CUSTOMIZEPIC = 27
-C_LOADGAMEPIC = 28
-C_SAVEGAMEPIC = 29
-C_EPISODE1PIC = 30
-C_EPISODE2PIC = 31
-C_EPISODE3PIC = 32
-C_EPISODE4PIC = 33
-C_EPISODE5PIC = 34
-C_EPISODE6PIC = 35
-C_CODEPIC = 36
-C_TIMECODEPIC = 37
-C_LEVELPIC = 38
-C_NAMEPIC = 39
-C_SCOREPIC = 40
-C_JOY1PIC = 41
-C_JOY2PIC = 42
-L_GUYPIC = 43
-L_COLONPIC = 44
-L_NUM0PIC = 45
-L_NUM1PIC = 46
-L_NUM2PIC = 47
-L_NUM3PIC = 48
-L_NUM4PIC = 49
-L_NUM5PIC = 50
-L_NUM6PIC = 51
-L_NUM7PIC = 52
-L_NUM8PIC = 53
-L_NUM9PIC = 54
-L_PERCENTPIC = 55
-L_APIC = 56
-L_BPIC = 57
-L_CPIC = 58
-L_DPIC = 59
-L_EPIC = 60
-L_FPIC = 61
-L_GPIC = 62
-L_HPIC = 63
-L_IPIC = 64
-L_JPIC = 65
-L_KPIC = 66
-L_LPIC = 67
-L_MPIC = 68
-L_NPIC = 69
-L_OPIC = 70
-L_PPIC = 71
-L_QPIC = 72
-L_RPIC = 73
-L_SPIC = 74
-L_TPIC = 75
-L_UPIC = 76
-L_VPIC = 77
-L_WPIC = 78
-L_XPIC = 79
-L_YPIC = 80
-L_ZPIC = 81
-L_EXPOINTPIC = 82
-L_APOSTROPHEPIC = 83
-L_GUY2PIC = 84
-L_BJWINSPIC = 85
-STATUSBARPIC = 86
-TITLEPIC = 87
-PG13PIC = 88
-CREDITSPIC = 89
-HIGHSCORESPIC = 90
-KNIFEPIC = 91
-GUNPIC = 92
-MACHINEGUNPIC = 93
-GATLINGGUNPIC = 94
-NOKEYPIC = 95
-GOLDKEYPIC = 96
-SILVERKEYPIC = 97
-N_BLANKPIC = 98
-N_0PIC = 99
-N_1PIC = 100
-N_2PIC = 101
-N_3PIC = 102
-N_4PIC = 103
-N_5PIC = 104
-N_6PIC = 105
-N_7PIC = 106
-N_8PIC = 107
-N_9PIC = 108
-FACE1APIC = 109
-FACE1BPIC = 110
-FACE1CPIC = 111
-FACE2APIC = 112
-FACE2BPIC = 113
-FACE2CPIC = 114
-FACE3APIC = 115
-FACE3BPIC = 116
-FACE3CPIC = 117
-FACE4APIC = 118
-FACE4BPIC = 119
-FACE4CPIC = 120
-FACE5APIC = 121
-FACE5BPIC = 122
-FACE5CPIC = 123
-FACE6APIC = 124
-FACE6BPIC = 125
-FACE6CPIC = 126
-FACE7APIC = 127
-FACE7BPIC = 128
-FACE7CPIC = 129
-FACE8APIC = 130
-GOTGATLINGPIC = 131
-MUTANTBJPIC = 132
-PAUSEDPIC = 133
-GETPSYCHEDPIC = 134
-
-
-
-ORDERSCREEN = 136
-ERRORSCREEN = 137
-T_HELPART = 138
-T_DEMO0 = 139
-T_DEMO1 = 140
-T_DEMO2 = 141
-T_DEMO3 = 142
-T_ENDART1 = 143
-T_ENDART2 = 144
-T_ENDART3 = 145
-T_ENDART4 = 146
-T_ENDART5 = 147
-T_ENDART6 = 148
-
-README_LUMP_START = 3
-README_LUMP_END = 9
-
-CONTROLS_LUMP_START = 10
-CONTROLS_LUMP_END = 42
-
-LEVELEND_LUMP_START = 43
-LEVELEND_LUMP_END = 85
-
-LATCHPICS_LUMP_START = 91
-LATCHPICS_LUMP_END = 134
-
-
-;
-; Amount of each data item
-;
-NUMCHUNKS = 149
-NUMFONT = 2
-NUMFONTM = 0
-NUMPICS = 132
-NUMPICM = 0
-NUMSPRITES = 0
-NUMTILE8 = 72
-NUMTILE8M = 0
-NUMTILE16 = 0
-NUMTILE16M = 0
-NUMTILE32 = 0
-NUMTILE32M = 0
-NUMEXTERN = 13
-;
-; File offsets for data items
-;
-STRUCTPIC = 0
-
-STARTFONT = 1
-STARTFONTM = 3
-STARTPICS = 3
-STARTPICM = 135
-STARTSPRITES = 135
-STARTTILE8 = 135
-STARTTILE8M = 136
-STARTTILE16 = 136
-STARTTILE16M = 136
-STARTTILE32 = 136
-STARTTILE32M = 136
-STARTEXTERN = 136
-
-;
-; Thank you for using IGRAB!
-;
--- a/WOLFSRC/GFXV_WL6.H
+++ /dev/null
@@ -1,216 +1,0 @@
-//////////////////////////////////////
-//
-// Graphics .H file for .WL6
-// IGRAB-ed on Wed Apr 13 06:58:44 1994
-//
-//////////////////////////////////////
-
-typedef enum {
- // Lump Start
- H_BJPIC=3,
- H_CASTLEPIC, // 4
- H_BLAZEPIC, // 5
- H_TOPWINDOWPIC, // 6
- H_LEFTWINDOWPIC, // 7
- H_RIGHTWINDOWPIC, // 8
- H_BOTTOMINFOPIC, // 9
- // Lump Start
- C_OPTIONSPIC, // 10
- C_CURSOR1PIC, // 11
- C_CURSOR2PIC, // 12
- C_NOTSELECTEDPIC, // 13
- C_SELECTEDPIC, // 14
- C_FXTITLEPIC, // 15
- C_DIGITITLEPIC, // 16
- C_MUSICTITLEPIC, // 17
- C_MOUSELBACKPIC, // 18
- C_BABYMODEPIC, // 19
- C_EASYPIC, // 20
- C_NORMALPIC, // 21
- C_HARDPIC, // 22
- C_LOADSAVEDISKPIC, // 23
- C_DISKLOADING1PIC, // 24
- C_DISKLOADING2PIC, // 25
- C_CONTROLPIC, // 26
- C_CUSTOMIZEPIC, // 27
- C_LOADGAMEPIC, // 28
- C_SAVEGAMEPIC, // 29
- C_EPISODE1PIC, // 30
- C_EPISODE2PIC, // 31
- C_EPISODE3PIC, // 32
- C_EPISODE4PIC, // 33
- C_EPISODE5PIC, // 34
- C_EPISODE6PIC, // 35
- C_CODEPIC, // 36
- C_TIMECODEPIC, // 37
- C_LEVELPIC, // 38
- C_NAMEPIC, // 39
- C_SCOREPIC, // 40
- C_JOY1PIC, // 41
- C_JOY2PIC, // 42
- // Lump Start
- L_GUYPIC, // 43
- L_COLONPIC, // 44
- L_NUM0PIC, // 45
- L_NUM1PIC, // 46
- L_NUM2PIC, // 47
- L_NUM3PIC, // 48
- L_NUM4PIC, // 49
- L_NUM5PIC, // 50
- L_NUM6PIC, // 51
- L_NUM7PIC, // 52
- L_NUM8PIC, // 53
- L_NUM9PIC, // 54
- L_PERCENTPIC, // 55
- L_APIC, // 56
- L_BPIC, // 57
- L_CPIC, // 58
- L_DPIC, // 59
- L_EPIC, // 60
- L_FPIC, // 61
- L_GPIC, // 62
- L_HPIC, // 63
- L_IPIC, // 64
- L_JPIC, // 65
- L_KPIC, // 66
- L_LPIC, // 67
- L_MPIC, // 68
- L_NPIC, // 69
- L_OPIC, // 70
- L_PPIC, // 71
- L_QPIC, // 72
- L_RPIC, // 73
- L_SPIC, // 74
- L_TPIC, // 75
- L_UPIC, // 76
- L_VPIC, // 77
- L_WPIC, // 78
- L_XPIC, // 79
- L_YPIC, // 80
- L_ZPIC, // 81
- L_EXPOINTPIC, // 82
- L_APOSTROPHEPIC, // 83
- L_GUY2PIC, // 84
- L_BJWINSPIC, // 85
- STATUSBARPIC, // 86
- TITLEPIC, // 87
- PG13PIC, // 88
- CREDITSPIC, // 89
- HIGHSCORESPIC, // 90
- // Lump Start
- KNIFEPIC, // 91
- GUNPIC, // 92
- MACHINEGUNPIC, // 93
- GATLINGGUNPIC, // 94
- NOKEYPIC, // 95
- GOLDKEYPIC, // 96
- SILVERKEYPIC, // 97
- N_BLANKPIC, // 98
- N_0PIC, // 99
- N_1PIC, // 100
- N_2PIC, // 101
- N_3PIC, // 102
- N_4PIC, // 103
- N_5PIC, // 104
- N_6PIC, // 105
- N_7PIC, // 106
- N_8PIC, // 107
- N_9PIC, // 108
- FACE1APIC, // 109
- FACE1BPIC, // 110
- FACE1CPIC, // 111
- FACE2APIC, // 112
- FACE2BPIC, // 113
- FACE2CPIC, // 114
- FACE3APIC, // 115
- FACE3BPIC, // 116
- FACE3CPIC, // 117
- FACE4APIC, // 118
- FACE4BPIC, // 119
- FACE4CPIC, // 120
- FACE5APIC, // 121
- FACE5BPIC, // 122
- FACE5CPIC, // 123
- FACE6APIC, // 124
- FACE6BPIC, // 125
- FACE6CPIC, // 126
- FACE7APIC, // 127
- FACE7BPIC, // 128
- FACE7CPIC, // 129
- FACE8APIC, // 130
- GOTGATLINGPIC, // 131
- MUTANTBJPIC, // 132
- PAUSEDPIC, // 133
- GETPSYCHEDPIC, // 134
-
-
-
- ORDERSCREEN=136,
- ERRORSCREEN, // 137
- T_HELPART, // 138
- T_DEMO0, // 139
- T_DEMO1, // 140
- T_DEMO2, // 141
- T_DEMO3, // 142
- T_ENDART1, // 143
- T_ENDART2, // 144
- T_ENDART3, // 145
- T_ENDART4, // 146
- T_ENDART5, // 147
- T_ENDART6, // 148
- ENUMEND
- } graphicnums;
-
-//
-// Data LUMPs
-//
-#define README_LUMP_START 3
-#define README_LUMP_END 9
-
-#define CONTROLS_LUMP_START 10
-#define CONTROLS_LUMP_END 42
-
-#define LEVELEND_LUMP_START 43
-#define LEVELEND_LUMP_END 85
-
-#define LATCHPICS_LUMP_START 91
-#define LATCHPICS_LUMP_END 134
-
-
-//
-// Amount of each data item
-//
-#define NUMCHUNKS 149
-#define NUMFONT 2
-#define NUMFONTM 0
-#define NUMPICS 132
-#define NUMPICM 0
-#define NUMSPRITES 0
-#define NUMTILE8 72
-#define NUMTILE8M 0
-#define NUMTILE16 0
-#define NUMTILE16M 0
-#define NUMTILE32 0
-#define NUMTILE32M 0
-#define NUMEXTERNS 13
-//
-// File offsets for data items
-//
-#define STRUCTPIC 0
-
-#define STARTFONT 1
-#define STARTFONTM 3
-#define STARTPICS 3
-#define STARTPICM 135
-#define STARTSPRITES 135
-#define STARTTILE8 135
-#define STARTTILE8M 136
-#define STARTTILE16 136
-#define STARTTILE16M 136
-#define STARTTILE32 136
-#define STARTTILE32M 136
-#define STARTEXTERNS 136
-
-//
-// Thank you for using IGRAB!
-//
--- a/WOLFSRC/GO.BAT
+++ /dev/null
@@ -1,5 +1,0 @@
-sv readme\license.doc
-sv readme\release.txt
-sv readme\readme.txt
-@ECHO Get to Work!
-
--- a/WOLFSRC/GOODSTUF.TXT
+++ /dev/null
@@ -1,56 +1,0 @@
-To: ROMERO,TOM
-From: LOTHAR/JAY
-Date: 9 Aug 92 21:06:46
-Subject: AOL Message
-X-mailer: Pegasus Mail v2.3 (R2).
-
-Subj: DREAMS, FLASHBACKS
-Date: 92-08-09 03:59:55 EDT
-From: Tug Hill 2
-Posted on: America Online
-
-On a serious note...
-
-As a former POW (Vietnam), I hesitated to play WOLF for over a
-month after downloading as I feared flashbacks. I didn't want to
-remember all that I had been through all those years ago, when, as
-POW's, my friend and I decided an escape attempt would be better than
-a slow death by torture and starvation.
-
-My friend and I made crude maps and hoarded food. The day of the
-escape we clubbed the guard with stones, took his gun and fought our
-way through two levels of underground tunnels (only a few guards and
-had to crawl). I made it, my friend didn't.
-
-Dreams...NO! NIGHTMARES...YES!! However, the more I play
-WOLF the less frequently I have nightmares. The chilling part is
-turning a corner and seeing a guard with his gun drawn.
-
-WOLF is a powerful game. Fearful as well. I believe that a
-person should face the past. So... when I can play EPISODE 1
-comfortably (no nightmares), I plan on ordering the full series.
-
-Don't let a few bad dreams make you discard this game.
-
--------------------------------------------------------------------------
-
-Subj: Wolf-3D Section: Action/Arcade Games
-From: Ty Graham 72350,2636 # 191387, * No Replies *
-To: Id Software 72600,1333 Date: 24-Jul-92 18:27:27
-
-Jay, just thought I'd drop a note to let you know how popular Wolf3D is
-here at Microsoft. It seems like I can't walk down a hall without hearing
-'Mein Leben' from someone's office. I hope you guys are getting revenue
-from all this.
-
-Anyway, we were sitting around talking the other day, discussing games for
-Windows, and someone said 'What are those cool guys at Id doing?'. So how
-about it. Are you guys looking at Win games at all? Win32?
-
-In a perfect world, I'd have you guys port the Wolf engine to a multiuser
-maze game for Windows for Workgroups. We need a good M'user Win game.
-
-Anyway some thoughts.
-
-Ty Graham (Microsoft)
-
--- a/WOLFSRC/H_LDIV.ASM
+++ /dev/null
@@ -1,227 +1,0 @@
-;[]-----------------------------------------------------------------[]
-;| H_LDIV.ASM -- long division routine |
-;| |
-;| C/C++ Run Time Library Version 4.0 |
-;| |
-;| Copyright (c) 1987, 1991 by Borland International Inc. |
-;| All Rights Reserved. |
-;[]-----------------------------------------------------------------[]
-.model medium
- INCLUDE RULES.ASI
-.386C ;JAB - we use 386 instructions
-
-_TEXT segment public byte 'CODE'
- assume cs:_TEXT
- public LDIV@
- public F_LDIV@
- public N_LDIV@
- public LUDIV@
- public F_LUDIV@
- public N_LUDIV@
- public LMOD@
- public F_LMOD@
- public N_LMOD@
- public LUMOD@
- public F_LUMOD@
- public N_LUMOD@
-
-N_LDIV@:
- pop cx ;fix up far return
- push cs
- push cx
-LDIV@:
-F_LDIV@:
- xor cx,cx ; signed divide
- jmp short common
-
-; JAB
-;
-; If we're using a 386 or better, the two instructions above get patched
-; to be NOP's (4 of them). So, instead of using the looping code,
-; we use the 386's long divide instruction.
-;
-; The stack after setting up the stack frame:
-; 12[bp]: divisor (high word)
-; 10[bp]: divisor (low word)
-; 8[bp]: dividend (high word)
-; 6[bp]: dividend (low word)
-; 4[bp]: return CS
-; 2[bp]: return IP
-; 0[bp]: previous BP
-;
- IDEAL
-
- push bp
- mov bp,sp ;Save BP, and set it equal to stack
-
- mov eax,[DWORD PTR bp+6]
- cdq
- idiv [DWORD PTR bp+10]
- mov edx,eax
- shr edx,16
-
- pop bp ;Restore BP
- retf 8 ;Return to original caller
-
- MASM
-
-N_LUDIV@:
- pop cx ;fix up far return
- push cs
- push cx
-LUDIV@:
-F_LUDIV@:
- mov cx,1 ; unsigned divide
- jmp short common
-
-N_LMOD@:
- pop cx ;fix up far return
- push cs
- push cx
-LMOD@:
-F_LMOD@:
- mov cx,2 ; signed remainder
- jmp short common
-
-N_LUMOD@:
- pop cx ;fix up far return
- push cs
- push cx
-LUMOD@:
-F_LUMOD@:
- mov cx,3 ; unsigned remainder
-
-;
-; di now contains a two bit control value. The low order
-; bit (test mask of 1) is on if the operation is unsigned,
-; signed otherwise. The next bit (test mask of 2) is on if
-; the operation returns the remainder, quotient otherwise.
-;
-common:
- push bp
- push si
- push di
- mov bp,sp ; set up frame
- mov di,cx
-;
-; dividend is pushed last, therefore the first in the args
-; divisor next.
-;
- mov ax,10[bp] ; get the first low word
- mov dx,12[bp] ; get the first high word
- mov bx,14[bp] ; get the second low word
- mov cx,16[bp] ; get the second high word
-
- or cx,cx
- jnz slow@ldiv ; both high words are zero
-
- or dx,dx
- jz quick@ldiv
-
- or bx,bx
- jz quick@ldiv ; if cx:bx == 0 force a zero divide
- ; we don't expect this to actually
- ; work
-
-slow@ldiv:
-
- test di,1 ; signed divide?
- jnz positive ; no: skip
-;
-; Signed division should be done. Convert negative
-; values to positive and do an unsigned division.
-; Store the sign value in the next higher bit of
-; di (test mask of 4). Thus when we are done, testing
-; that bit will determine the sign of the result.
-;
- or dx,dx ; test sign of dividend
- jns onepos
- neg dx
- neg ax
- sbb dx,0 ; negate dividend
- or di,0Ch
-onepos:
- or cx,cx ; test sign of divisor
- jns positive
- neg cx
- neg bx
- sbb cx,0 ; negate divisor
- xor di,4
-positive:
- mov bp,cx
- mov cx,32 ; shift counter
- push di ; save the flags
-;
-; Now the stack looks something like this:
-;
-; 16[bp]: divisor (high word)
-; 14[bp]: divisor (low word)
-; 12[bp]: dividend (high word)
-; 10[bp]: dividend (low word)
-; 8[bp]: return CS
-; 6[bp]: return IP
-; 4[bp]: previous BP
-; 2[bp]: previous SI
-; [bp]: previous DI
-; -2[bp]: control bits
-; 01 - Unsigned divide
-; 02 - Remainder wanted
-; 04 - Negative quotient
-; 08 - Negative remainder
-;
- xor di,di ; fake a 64 bit dividend
- xor si,si ;
-xloop:
- shl ax,1 ; shift dividend left one bit
- rcl dx,1
- rcl si,1
- rcl di,1
- cmp di,bp ; dividend larger?
- jb nosub
- ja subtract
- cmp si,bx ; maybe
- jb nosub
-subtract:
- sub si,bx
- sbb di,bp ; subtract the divisor
- inc ax ; build quotient
-nosub:
- loop xloop
-;
-; When done with the loop the four register value look like:
-;
-; | di | si | dx | ax |
-; | remainder | quotient |
-;
- pop bx ; get control bits
- test bx,2 ; remainder?
- jz usequo
- mov ax,si
- mov dx,di ; use remainder
- shr bx,1 ; shift in the remainder sign bit
-usequo:
- test bx,4 ; needs negative
- jz finish
- neg dx
- neg ax
- sbb dx,0 ; negate
-finish:
- pop di
- pop si
- pop bp
- retf 8
-
-quick@ldiv:
- div bx ; unsigned divide
- ; DX = remainder AX = quotient
- test di,2 ; want remainder?
- jz quick@quo
- xchg ax,dx
-
-quick@quo:
-
- xor dx,dx
- jmp short finish
-
-_TEXT ends
- end
--- a/WOLFSRC/ID_CA.C
+++ /dev/null
@@ -1,1768 +1,0 @@
-// ID_CA.C
-
-// this has been customized for WOLF
-
-/*
-=============================================================================
-
-Id Software Caching Manager
----------------------------
-
-Must be started BEFORE the memory manager, because it needs to get the headers
-loaded into the data segment
-
-=============================================================================
-*/
-
-#include "ID_HEADS.H"
-#pragma hdrstop
-
-#pragma warn -pro
-#pragma warn -use
-
-#define THREEBYTEGRSTARTS
-
-/*
-=============================================================================
-
- LOCAL CONSTANTS
-
-=============================================================================
-*/
-
-typedef struct
-{
- unsigned bit0,bit1; // 0-255 is a character, > is a pointer to a node
-} huffnode;
-
-
-typedef struct
-{
- unsigned RLEWtag;
- long headeroffsets[100];
- byte tileinfo[];
-} mapfiletype;
-
-
-/*
-=============================================================================
-
- GLOBAL VARIABLES
-
-=============================================================================
-*/
-
-byte _seg *tinf;
-int mapon;
-
-unsigned _seg *mapsegs[MAPPLANES];
-maptype _seg *mapheaderseg[NUMMAPS];
-byte _seg *audiosegs[NUMSNDCHUNKS];
-void _seg *grsegs[NUMCHUNKS];
-
-byte far grneeded[NUMCHUNKS];
-byte ca_levelbit,ca_levelnum;
-
-int profilehandle,debughandle;
-
-char audioname[13]="AUDIO.";
-
-/*
-=============================================================================
-
- LOCAL VARIABLES
-
-=============================================================================
-*/
-
-extern long far CGAhead;
-extern long far EGAhead;
-extern byte CGAdict;
-extern byte EGAdict;
-extern byte far maphead;
-extern byte mapdict;
-extern byte far audiohead;
-extern byte audiodict;
-
-
-char extension[5], // Need a string, not constant to change cache files
- gheadname[10]=GREXT"HEAD.",
- gfilename[10]=GREXT"GRAPH.",
- gdictname[10]=GREXT"DICT.",
- mheadname[10]="MAPHEAD.",
- mfilename[10]="MAPTEMP.",
- aheadname[10]="AUDIOHED.",
- afilename[10]="AUDIOT.";
-
-void CA_CannotOpen(char *string);
-
-long _seg *grstarts; // array of offsets in egagraph, -1 for sparse
-long _seg *audiostarts; // array of offsets in audio / audiot
-
-#ifdef GRHEADERLINKED
-huffnode *grhuffman;
-#else
-huffnode grhuffman[255];
-#endif
-
-#ifdef AUDIOHEADERLINKED
-huffnode *audiohuffman;
-#else
-huffnode audiohuffman[255];
-#endif
-
-
-int grhandle; // handle to EGAGRAPH
-int maphandle; // handle to MAPTEMP / GAMEMAPS
-int audiohandle; // handle to AUDIOT / AUDIO
-
-long chunkcomplen,chunkexplen;
-
-SDMode oldsoundmode;
-
-
-
-void CAL_CarmackExpand (unsigned far *source, unsigned far *dest,
- unsigned length);
-
-
-#ifdef THREEBYTEGRSTARTS
-#define FILEPOSSIZE 3
-//#define GRFILEPOS(c) (*(long far *)(((byte far *)grstarts)+(c)*3)&0xffffff)
-long GRFILEPOS(int c)
-{
- long value;
- int offset;
-
- offset = c*3;
-
- value = *(long far *)(((byte far *)grstarts)+offset);
-
- value &= 0x00ffffffl;
-
- if (value == 0xffffffl)
- value = -1;
-
- return value;
-};
-#else
-#define FILEPOSSIZE 4
-#define GRFILEPOS(c) (grstarts[c])
-#endif
-
-/*
-=============================================================================
-
- LOW LEVEL ROUTINES
-
-=============================================================================
-*/
-
-/*
-============================
-=
-= CA_OpenDebug / CA_CloseDebug
-=
-= Opens a binary file with the handle "debughandle"
-=
-============================
-*/
-
-void CA_OpenDebug (void)
-{
- unlink ("DEBUG.TXT");
- debughandle = open("DEBUG.TXT", O_CREAT | O_WRONLY | O_TEXT);
-}
-
-void CA_CloseDebug (void)
-{
- close (debughandle);
-}
-
-
-
-/*
-============================
-=
-= CAL_GetGrChunkLength
-=
-= Gets the length of an explicit length chunk (not tiles)
-= The file pointer is positioned so the compressed data can be read in next.
-=
-============================
-*/
-
-void CAL_GetGrChunkLength (int chunk)
-{
- lseek(grhandle,GRFILEPOS(chunk),SEEK_SET);
- read(grhandle,&chunkexplen,sizeof(chunkexplen));
- chunkcomplen = GRFILEPOS(chunk+1)-GRFILEPOS(chunk)-4;
-}
-
-
-/*
-==========================
-=
-= CA_FarRead
-=
-= Read from a file to a far pointer
-=
-==========================
-*/
-
-boolean CA_FarRead (int handle, byte far *dest, long length)
-{
- if (length>0xffffl)
- Quit ("CA_FarRead doesn't support 64K reads yet!");
-
-asm push ds
-asm mov bx,[handle]
-asm mov cx,[WORD PTR length]
-asm mov dx,[WORD PTR dest]
-asm mov ds,[WORD PTR dest+2]
-asm mov ah,0x3f // READ w/handle
-asm int 21h
-asm pop ds
-asm jnc good
- errno = _AX;
- return false;
-good:
-asm cmp ax,[WORD PTR length]
-asm je done
- errno = EINVFMT; // user manager knows this is bad read
- return false;
-done:
- return true;
-}
-
-
-/*
-==========================
-=
-= CA_SegWrite
-=
-= Write from a file to a far pointer
-=
-==========================
-*/
-
-boolean CA_FarWrite (int handle, byte far *source, long length)
-{
- if (length>0xffffl)
- Quit ("CA_FarWrite doesn't support 64K reads yet!");
-
-asm push ds
-asm mov bx,[handle]
-asm mov cx,[WORD PTR length]
-asm mov dx,[WORD PTR source]
-asm mov ds,[WORD PTR source+2]
-asm mov ah,0x40 // WRITE w/handle
-asm int 21h
-asm pop ds
-asm jnc good
- errno = _AX;
- return false;
-good:
-asm cmp ax,[WORD PTR length]
-asm je done
- errno = ENOMEM; // user manager knows this is bad write
- return false;
-
-done:
- return true;
-}
-
-
-/*
-==========================
-=
-= CA_ReadFile
-=
-= Reads a file into an allready allocated buffer
-=
-==========================
-*/
-
-boolean CA_ReadFile (char *filename, memptr *ptr)
-{
- int handle;
- long size;
-
- if ((handle = open(filename,O_RDONLY | O_BINARY, S_IREAD)) == -1)
- return false;
-
- size = filelength (handle);
- if (!CA_FarRead (handle,*ptr,size))
- {
- close (handle);
- return false;
- }
- close (handle);
- return true;
-}
-
-
-/*
-==========================
-=
-= CA_WriteFile
-=
-= Writes a file from a memory buffer
-=
-==========================
-*/
-
-boolean CA_WriteFile (char *filename, void far *ptr, long length)
-{
- int handle;
- long size;
-
- handle = open(filename,O_CREAT | O_BINARY | O_WRONLY,
- S_IREAD | S_IWRITE | S_IFREG);
-
- if (handle == -1)
- return false;
-
- if (!CA_FarWrite (handle,ptr,length))
- {
- close (handle);
- return false;
- }
- close (handle);
- return true;
-}
-
-
-
-/*
-==========================
-=
-= CA_LoadFile
-=
-= Allocate space for and load a file
-=
-==========================
-*/
-
-boolean CA_LoadFile (char *filename, memptr *ptr)
-{
- int handle;
- long size;
-
- if ((handle = open(filename,O_RDONLY | O_BINARY, S_IREAD)) == -1)
- return false;
-
- size = filelength (handle);
- MM_GetPtr (ptr,size);
- if (!CA_FarRead (handle,*ptr,size))
- {
- close (handle);
- return false;
- }
- close (handle);
- return true;
-}
-
-/*
-============================================================================
-
- COMPRESSION routines, see JHUFF.C for more
-
-============================================================================
-*/
-
-
-
-/*
-===============
-=
-= CAL_OptimizeNodes
-=
-= Goes through a huffman table and changes the 256-511 node numbers to the
-= actular address of the node. Must be called before CAL_HuffExpand
-=
-===============
-*/
-
-void CAL_OptimizeNodes (huffnode *table)
-{
- huffnode *node;
- int i;
-
- node = table;
-
- for (i=0;i<255;i++)
- {
- if (node->bit0 >= 256)
- node->bit0 = (unsigned)(table+(node->bit0-256));
- if (node->bit1 >= 256)
- node->bit1 = (unsigned)(table+(node->bit1-256));
- node++;
- }
-}
-
-
-
-/*
-======================
-=
-= CAL_HuffExpand
-=
-= Length is the length of the EXPANDED data
-= If screenhack, the data is decompressed in four planes directly
-= to the screen
-=
-======================
-*/
-
-void CAL_HuffExpand (byte huge *source, byte huge *dest,
- long length,huffnode *hufftable, boolean screenhack)
-{
-// unsigned bit,byte,node,code;
- unsigned sourceseg,sourceoff,destseg,destoff,endoff;
- huffnode *headptr;
- byte mapmask;
-// huffnode *nodeon;
-
- headptr = hufftable+254; // head node is allways node 254
-
- source++; // normalize
- source--;
- dest++;
- dest--;
-
- if (screenhack)
- {
- mapmask = 1;
-asm mov dx,SC_INDEX
-asm mov ax,SC_MAPMASK + 256
-asm out dx,ax
- length >>= 2;
- }
-
- sourceseg = FP_SEG(source);
- sourceoff = FP_OFF(source);
- destseg = FP_SEG(dest);
- destoff = FP_OFF(dest);
- endoff = destoff+length;
-
-//
-// ds:si source
-// es:di dest
-// ss:bx node pointer
-//
-
- if (length <0xfff0)
- {
-
-//--------------------------
-// expand less than 64k of data
-//--------------------------
-
-asm mov bx,[headptr]
-
-asm mov si,[sourceoff]
-asm mov di,[destoff]
-asm mov es,[destseg]
-asm mov ds,[sourceseg]
-asm mov ax,[endoff]
-
-asm mov ch,[si] // load first byte
-asm inc si
-asm mov cl,1
-
-expandshort:
-asm test ch,cl // bit set?
-asm jnz bit1short
-asm mov dx,[ss:bx] // take bit0 path from node
-asm shl cl,1 // advance to next bit position
-asm jc newbyteshort
-asm jnc sourceupshort
-
-bit1short:
-asm mov dx,[ss:bx+2] // take bit1 path
-asm shl cl,1 // advance to next bit position
-asm jnc sourceupshort
-
-newbyteshort:
-asm mov ch,[si] // load next byte
-asm inc si
-asm mov cl,1 // back to first bit
-
-sourceupshort:
-asm or dh,dh // if dx<256 its a byte, else move node
-asm jz storebyteshort
-asm mov bx,dx // next node = (huffnode *)code
-asm jmp expandshort
-
-storebyteshort:
-asm mov [es:di],dl
-asm inc di // write a decopmpressed byte out
-asm mov bx,[headptr] // back to the head node for next bit
-
-asm cmp di,ax // done?
-asm jne expandshort
-
-//
-// perform screenhack if needed
-//
-asm test [screenhack],1
-asm jz notscreen
-asm shl [mapmask],1
-asm mov ah,[mapmask]
-asm cmp ah,16
-asm je notscreen // all four planes done
-asm mov dx,SC_INDEX
-asm mov al,SC_MAPMASK
-asm out dx,ax
-asm mov di,[destoff]
-asm mov ax,[endoff]
-asm jmp expandshort
-
-notscreen:;
- }
- else
- {
-
-//--------------------------
-// expand more than 64k of data
-//--------------------------
-
- length--;
-
-asm mov bx,[headptr]
-asm mov cl,1
-
-asm mov si,[sourceoff]
-asm mov di,[destoff]
-asm mov es,[destseg]
-asm mov ds,[sourceseg]
-
-asm lodsb // load first byte
-
-expand:
-asm test al,cl // bit set?
-asm jnz bit1
-asm mov dx,[ss:bx] // take bit0 path from node
-asm jmp gotcode
-bit1:
-asm mov dx,[ss:bx+2] // take bit1 path
-
-gotcode:
-asm shl cl,1 // advance to next bit position
-asm jnc sourceup
-asm lodsb
-asm cmp si,0x10 // normalize ds:si
-asm jb sinorm
-asm mov cx,ds
-asm inc cx
-asm mov ds,cx
-asm xor si,si
-sinorm:
-asm mov cl,1 // back to first bit
-
-sourceup:
-asm or dh,dh // if dx<256 its a byte, else move node
-asm jz storebyte
-asm mov bx,dx // next node = (huffnode *)code
-asm jmp expand
-
-storebyte:
-asm mov [es:di],dl
-asm inc di // write a decopmpressed byte out
-asm mov bx,[headptr] // back to the head node for next bit
-
-asm cmp di,0x10 // normalize es:di
-asm jb dinorm
-asm mov dx,es
-asm inc dx
-asm mov es,dx
-asm xor di,di
-dinorm:
-
-asm sub [WORD PTR ss:length],1
-asm jnc expand
-asm dec [WORD PTR ss:length+2]
-asm jns expand // when length = ffff ffff, done
-
- }
-
-asm mov ax,ss
-asm mov ds,ax
-
-}
-
-
-/*
-======================
-=
-= CAL_CarmackExpand
-=
-= Length is the length of the EXPANDED data
-=
-======================
-*/
-
-#define NEARTAG 0xa7
-#define FARTAG 0xa8
-
-void CAL_CarmackExpand (unsigned far *source, unsigned far *dest, unsigned length)
-{
- unsigned ch,chhigh,count,offset;
- unsigned far *copyptr, far *inptr, far *outptr;
-
- length/=2;
-
- inptr = source;
- outptr = dest;
-
- while (length)
- {
- ch = *inptr++;
- chhigh = ch>>8;
- if (chhigh == NEARTAG)
- {
- count = ch&0xff;
- if (!count)
- { // have to insert a word containing the tag byte
- ch |= *((unsigned char far *)inptr)++;
- *outptr++ = ch;
- length--;
- }
- else
- {
- offset = *((unsigned char far *)inptr)++;
- copyptr = outptr - offset;
- length -= count;
- while (count--)
- *outptr++ = *copyptr++;
- }
- }
- else if (chhigh == FARTAG)
- {
- count = ch&0xff;
- if (!count)
- { // have to insert a word containing the tag byte
- ch |= *((unsigned char far *)inptr)++;
- *outptr++ = ch;
- length --;
- }
- else
- {
- offset = *inptr++;
- copyptr = dest + offset;
- length -= count;
- while (count--)
- *outptr++ = *copyptr++;
- }
- }
- else
- {
- *outptr++ = ch;
- length --;
- }
- }
-}
-
-
-
-/*
-======================
-=
-= CA_RLEWcompress
-=
-======================
-*/
-
-long CA_RLEWCompress (unsigned huge *source, long length, unsigned huge *dest,
- unsigned rlewtag)
-{
- long complength;
- unsigned value,count,i;
- unsigned huge *start,huge *end;
-
- start = dest;
-
- end = source + (length+1)/2;
-
-//
-// compress it
-//
- do
- {
- count = 1;
- value = *source++;
- while (*source == value && source<end)
- {
- count++;
- source++;
- }
- if (count>3 || value == rlewtag)
- {
- //
- // send a tag / count / value string
- //
- *dest++ = rlewtag;
- *dest++ = count;
- *dest++ = value;
- }
- else
- {
- //
- // send word without compressing
- //
- for (i=1;i<=count;i++)
- *dest++ = value;
- }
-
- } while (source<end);
-
- complength = 2*(dest-start);
- return complength;
-}
-
-
-/*
-======================
-=
-= CA_RLEWexpand
-= length is EXPANDED length
-=
-======================
-*/
-
-void CA_RLEWexpand (unsigned huge *source, unsigned huge *dest,long length,
- unsigned rlewtag)
-{
-// unsigned value,count,i;
- unsigned huge *end;
- unsigned sourceseg,sourceoff,destseg,destoff,endseg,endoff;
-
-
-//
-// expand it
-//
-#if 0
- do
- {
- value = *source++;
- if (value != rlewtag)
- //
- // uncompressed
- //
- *dest++=value;
- else
- {
- //
- // compressed string
- //
- count = *source++;
- value = *source++;
- for (i=1;i<=count;i++)
- *dest++ = value;
- }
- } while (dest<end);
-#endif
-
- end = dest + (length)/2;
- sourceseg = FP_SEG(source);
- sourceoff = FP_OFF(source);
- destseg = FP_SEG(dest);
- destoff = FP_OFF(dest);
- endseg = FP_SEG(end);
- endoff = FP_OFF(end);
-
-
-//
-// ax = source value
-// bx = tag value
-// cx = repeat counts
-// dx = scratch
-//
-// NOTE: A repeat count that produces 0xfff0 bytes can blow this!
-//
-
-asm mov bx,rlewtag
-asm mov si,sourceoff
-asm mov di,destoff
-asm mov es,destseg
-asm mov ds,sourceseg
-
-expand:
-asm lodsw
-asm cmp ax,bx
-asm je repeat
-asm stosw
-asm jmp next
-
-repeat:
-asm lodsw
-asm mov cx,ax // repeat count
-asm lodsw // repeat value
-asm rep stosw
-
-next:
-
-asm cmp si,0x10 // normalize ds:si
-asm jb sinorm
-asm mov ax,si
-asm shr ax,1
-asm shr ax,1
-asm shr ax,1
-asm shr ax,1
-asm mov dx,ds
-asm add dx,ax
-asm mov ds,dx
-asm and si,0xf
-sinorm:
-asm cmp di,0x10 // normalize es:di
-asm jb dinorm
-asm mov ax,di
-asm shr ax,1
-asm shr ax,1
-asm shr ax,1
-asm shr ax,1
-asm mov dx,es
-asm add dx,ax
-asm mov es,dx
-asm and di,0xf
-dinorm:
-
-asm cmp di,ss:endoff
-asm jne expand
-asm mov ax,es
-asm cmp ax,ss:endseg
-asm jb expand
-
-asm mov ax,ss
-asm mov ds,ax
-
-}
-
-
-
-/*
-=============================================================================
-
- CACHE MANAGER ROUTINES
-
-=============================================================================
-*/
-
-
-/*
-======================
-=
-= CAL_SetupGrFile
-=
-======================
-*/
-
-void CAL_SetupGrFile (void)
-{
- char fname[13];
- int handle;
- memptr compseg;
-
-#ifdef GRHEADERLINKED
-
- grhuffman = (huffnode *)&EGAdict;
- grstarts = (long _seg *)FP_SEG(&EGAhead);
-
- CAL_OptimizeNodes (grhuffman);
-
-#else
-
-//
-// load ???dict.ext (huffman dictionary for graphics files)
-//
-
- strcpy(fname,gdictname);
- strcat(fname,extension);
-
- if ((handle = open(fname,
- O_RDONLY | O_BINARY, S_IREAD)) == -1)
- CA_CannotOpen(fname);
-
- read(handle, &grhuffman, sizeof(grhuffman));
- close(handle);
- CAL_OptimizeNodes (grhuffman);
-//
-// load the data offsets from ???head.ext
-//
- MM_GetPtr (&(memptr)grstarts,(NUMCHUNKS+1)*FILEPOSSIZE);
-
- strcpy(fname,gheadname);
- strcat(fname,extension);
-
- if ((handle = open(fname,
- O_RDONLY | O_BINARY, S_IREAD)) == -1)
- CA_CannotOpen(fname);
-
- CA_FarRead(handle, (memptr)grstarts, (NUMCHUNKS+1)*FILEPOSSIZE);
-
- close(handle);
-
-
-#endif
-
-//
-// Open the graphics file, leaving it open until the game is finished
-//
- strcpy(fname,gfilename);
- strcat(fname,extension);
-
- grhandle = open(fname, O_RDONLY | O_BINARY);
- if (grhandle == -1)
- CA_CannotOpen(fname);
-
-
-//
-// load the pic and sprite headers into the arrays in the data segment
-//
- MM_GetPtr(&(memptr)pictable,NUMPICS*sizeof(pictabletype));
- CAL_GetGrChunkLength(STRUCTPIC); // position file pointer
- MM_GetPtr(&compseg,chunkcomplen);
- CA_FarRead (grhandle,compseg,chunkcomplen);
- CAL_HuffExpand (compseg, (byte huge *)pictable,NUMPICS*sizeof(pictabletype),grhuffman,false);
- MM_FreePtr(&compseg);
-}
-
-//==========================================================================
-
-
-/*
-======================
-=
-= CAL_SetupMapFile
-=
-======================
-*/
-
-void CAL_SetupMapFile (void)
-{
- int i;
- int handle;
- long length,pos;
- char fname[13];
-
-//
-// load maphead.ext (offsets and tileinfo for map file)
-//
-#ifndef MAPHEADERLINKED
- strcpy(fname,mheadname);
- strcat(fname,extension);
-
- if ((handle = open(fname,
- O_RDONLY | O_BINARY, S_IREAD)) == -1)
- CA_CannotOpen(fname);
-
- length = filelength(handle);
- MM_GetPtr (&(memptr)tinf,length);
- CA_FarRead(handle, tinf, length);
- close(handle);
-#else
-
- tinf = (byte _seg *)FP_SEG(&maphead);
-
-#endif
-
-//
-// open the data file
-//
-#ifdef CARMACIZED
- strcpy(fname,"GAMEMAPS.");
- strcat(fname,extension);
-
- if ((maphandle = open(fname,
- O_RDONLY | O_BINARY, S_IREAD)) == -1)
- CA_CannotOpen(fname);
-#else
- strcpy(fname,mfilename);
- strcat(fname,extension);
-
- if ((maphandle = open(fname,
- O_RDONLY | O_BINARY, S_IREAD)) == -1)
- CA_CannotOpen(fname);
-#endif
-
-//
-// load all map header
-//
- for (i=0;i<NUMMAPS;i++)
- {
- pos = ((mapfiletype _seg *)tinf)->headeroffsets[i];
- if (pos<0) // $FFFFFFFF start is a sparse map
- continue;
-
- MM_GetPtr(&(memptr)mapheaderseg[i],sizeof(maptype));
- MM_SetLock(&(memptr)mapheaderseg[i],true);
- lseek(maphandle,pos,SEEK_SET);
- CA_FarRead (maphandle,(memptr)mapheaderseg[i],sizeof(maptype));
- }
-
-//
-// allocate space for 3 64*64 planes
-//
- for (i=0;i<MAPPLANES;i++)
- {
- MM_GetPtr (&(memptr)mapsegs[i],64*64*2);
- MM_SetLock (&(memptr)mapsegs[i],true);
- }
-}
-
-
-//==========================================================================
-
-
-/*
-======================
-=
-= CAL_SetupAudioFile
-=
-======================
-*/
-
-void CAL_SetupAudioFile (void)
-{
- int handle;
- long length;
- char fname[13];
-
-//
-// load maphead.ext (offsets and tileinfo for map file)
-//
-#ifndef AUDIOHEADERLINKED
- strcpy(fname,aheadname);
- strcat(fname,extension);
-
- if ((handle = open(fname,
- O_RDONLY | O_BINARY, S_IREAD)) == -1)
- CA_CannotOpen(fname);
-
- length = filelength(handle);
- MM_GetPtr (&(memptr)audiostarts,length);
- CA_FarRead(handle, (byte far *)audiostarts, length);
- close(handle);
-#else
- audiohuffman = (huffnode *)&audiodict;
- CAL_OptimizeNodes (audiohuffman);
- audiostarts = (long _seg *)FP_SEG(&audiohead);
-#endif
-
-//
-// open the data file
-//
-#ifndef AUDIOHEADERLINKED
- strcpy(fname,afilename);
- strcat(fname,extension);
-
- if ((audiohandle = open(fname,
- O_RDONLY | O_BINARY, S_IREAD)) == -1)
- CA_CannotOpen(fname);
-#else
- if ((audiohandle = open("AUDIO."EXTENSION,
- O_RDONLY | O_BINARY, S_IREAD)) == -1)
- Quit ("Can't open AUDIO."EXTENSION"!");
-#endif
-}
-
-//==========================================================================
-
-
-/*
-======================
-=
-= CA_Startup
-=
-= Open all files and load in headers
-=
-======================
-*/
-
-void CA_Startup (void)
-{
-#ifdef PROFILE
- unlink ("PROFILE.TXT");
- profilehandle = open("PROFILE.TXT", O_CREAT | O_WRONLY | O_TEXT);
-#endif
-
- CAL_SetupMapFile ();
- CAL_SetupGrFile ();
- CAL_SetupAudioFile ();
-
- mapon = -1;
- ca_levelbit = 1;
- ca_levelnum = 0;
-
-}
-
-//==========================================================================
-
-
-/*
-======================
-=
-= CA_Shutdown
-=
-= Closes all files
-=
-======================
-*/
-
-void CA_Shutdown (void)
-{
-#ifdef PROFILE
- close (profilehandle);
-#endif
-
- close (maphandle);
- close (grhandle);
- close (audiohandle);
-}
-
-//===========================================================================
-
-/*
-======================
-=
-= CA_CacheAudioChunk
-=
-======================
-*/
-
-void CA_CacheAudioChunk (int chunk)
-{
- long pos,compressed;
-#ifdef AUDIOHEADERLINKED
- long expanded;
- memptr bigbufferseg;
- byte far *source;
-#endif
-
- if (audiosegs[chunk])
- {
- MM_SetPurge (&(memptr)audiosegs[chunk],0);
- return; // allready in memory
- }
-
-//
-// load the chunk into a buffer, either the miscbuffer if it fits, or allocate
-// a larger buffer
-//
- pos = audiostarts[chunk];
- compressed = audiostarts[chunk+1]-pos;
-
- lseek(audiohandle,pos,SEEK_SET);
-
-#ifndef AUDIOHEADERLINKED
-
- MM_GetPtr (&(memptr)audiosegs[chunk],compressed);
- if (mmerror)
- return;
-
- CA_FarRead(audiohandle,audiosegs[chunk],compressed);
-
-#else
-
- if (compressed<=BUFFERSIZE)
- {
- CA_FarRead(audiohandle,bufferseg,compressed);
- source = bufferseg;
- }
- else
- {
- MM_GetPtr(&bigbufferseg,compressed);
- if (mmerror)
- return;
- MM_SetLock (&bigbufferseg,true);
- CA_FarRead(audiohandle,bigbufferseg,compressed);
- source = bigbufferseg;
- }
-
- expanded = *(long far *)source;
- source += 4; // skip over length
- MM_GetPtr (&(memptr)audiosegs[chunk],expanded);
- if (mmerror)
- goto done;
- CAL_HuffExpand (source,audiosegs[chunk],expanded,audiohuffman,false);
-
-done:
- if (compressed>BUFFERSIZE)
- MM_FreePtr(&bigbufferseg);
-#endif
-}
-
-//===========================================================================
-
-/*
-======================
-=
-= CA_LoadAllSounds
-=
-= Purges all sounds, then loads all new ones (mode switch)
-=
-======================
-*/
-
-void CA_LoadAllSounds (void)
-{
- unsigned start,i;
-
- switch (oldsoundmode)
- {
- case sdm_Off:
- goto cachein;
- case sdm_PC:
- start = STARTPCSOUNDS;
- break;
- case sdm_AdLib:
- start = STARTADLIBSOUNDS;
- break;
- }
-
- for (i=0;i<NUMSOUNDS;i++,start++)
- if (audiosegs[start])
- MM_SetPurge (&(memptr)audiosegs[start],3); // make purgable
-
-cachein:
-
- switch (SoundMode)
- {
- case sdm_Off:
- return;
- case sdm_PC:
- start = STARTPCSOUNDS;
- break;
- case sdm_AdLib:
- start = STARTADLIBSOUNDS;
- break;
- }
-
- for (i=0;i<NUMSOUNDS;i++,start++)
- CA_CacheAudioChunk (start);
-
- oldsoundmode = SoundMode;
-}
-
-//===========================================================================
-
-
-/*
-======================
-=
-= CAL_ExpandGrChunk
-=
-= Does whatever is needed with a pointer to a compressed chunk
-=
-======================
-*/
-
-void CAL_ExpandGrChunk (int chunk, byte far *source)
-{
- long expanded;
-
-
- if (chunk >= STARTTILE8 && chunk < STARTEXTERNS)
- {
- //
- // expanded sizes of tile8/16/32 are implicit
- //
-
-#define BLOCK 64
-#define MASKBLOCK 128
-
- if (chunk<STARTTILE8M) // tile 8s are all in one chunk!
- expanded = BLOCK*NUMTILE8;
- else if (chunk<STARTTILE16)
- expanded = MASKBLOCK*NUMTILE8M;
- else if (chunk<STARTTILE16M) // all other tiles are one/chunk
- expanded = BLOCK*4;
- else if (chunk<STARTTILE32)
- expanded = MASKBLOCK*4;
- else if (chunk<STARTTILE32M)
- expanded = BLOCK*16;
- else
- expanded = MASKBLOCK*16;
- }
- else
- {
- //
- // everything else has an explicit size longword
- //
- expanded = *(long far *)source;
- source += 4; // skip over length
- }
-
-//
-// allocate final space, decompress it, and free bigbuffer
-// Sprites need to have shifts made and various other junk
-//
- MM_GetPtr (&grsegs[chunk],expanded);
- if (mmerror)
- return;
- CAL_HuffExpand (source,grsegs[chunk],expanded,grhuffman,false);
-}
-
-
-/*
-======================
-=
-= CA_CacheGrChunk
-=
-= Makes sure a given chunk is in memory, loadiing it if needed
-=
-======================
-*/
-
-void CA_CacheGrChunk (int chunk)
-{
- long pos,compressed;
- memptr bigbufferseg;
- byte far *source;
- int next;
-
- grneeded[chunk] |= ca_levelbit; // make sure it doesn't get removed
- if (grsegs[chunk])
- {
- MM_SetPurge (&grsegs[chunk],0);
- return; // allready in memory
- }
-
-//
-// load the chunk into a buffer, either the miscbuffer if it fits, or allocate
-// a larger buffer
-//
- pos = GRFILEPOS(chunk);
- if (pos<0) // $FFFFFFFF start is a sparse tile
- return;
-
- next = chunk +1;
- while (GRFILEPOS(next) == -1) // skip past any sparse tiles
- next++;
-
- compressed = GRFILEPOS(next)-pos;
-
- lseek(grhandle,pos,SEEK_SET);
-
- if (compressed<=BUFFERSIZE)
- {
- CA_FarRead(grhandle,bufferseg,compressed);
- source = bufferseg;
- }
- else
- {
- MM_GetPtr(&bigbufferseg,compressed);
- MM_SetLock (&bigbufferseg,true);
- CA_FarRead(grhandle,bigbufferseg,compressed);
- source = bigbufferseg;
- }
-
- CAL_ExpandGrChunk (chunk,source);
-
- if (compressed>BUFFERSIZE)
- MM_FreePtr(&bigbufferseg);
-}
-
-
-
-//==========================================================================
-
-/*
-======================
-=
-= CA_CacheScreen
-=
-= Decompresses a chunk from disk straight onto the screen
-=
-======================
-*/
-
-void CA_CacheScreen (int chunk)
-{
- long pos,compressed,expanded;
- memptr bigbufferseg;
- byte far *source;
- int next;
-
-//
-// load the chunk into a buffer
-//
- pos = GRFILEPOS(chunk);
- next = chunk +1;
- while (GRFILEPOS(next) == -1) // skip past any sparse tiles
- next++;
- compressed = GRFILEPOS(next)-pos;
-
- lseek(grhandle,pos,SEEK_SET);
-
- MM_GetPtr(&bigbufferseg,compressed);
- MM_SetLock (&bigbufferseg,true);
- CA_FarRead(grhandle,bigbufferseg,compressed);
- source = bigbufferseg;
-
- expanded = *(long far *)source;
- source += 4; // skip over length
-
-//
-// allocate final space, decompress it, and free bigbuffer
-// Sprites need to have shifts made and various other junk
-//
- CAL_HuffExpand (source,MK_FP(SCREENSEG,bufferofs),expanded,grhuffman,true);
- VW_MarkUpdateBlock (0,0,319,199);
- MM_FreePtr(&bigbufferseg);
-}
-
-//==========================================================================
-
-/*
-======================
-=
-= CA_CacheMap
-=
-= WOLF: This is specialized for a 64*64 map size
-=
-======================
-*/
-
-void CA_CacheMap (int mapnum)
-{
- long pos,compressed;
- int plane;
- memptr *dest,bigbufferseg;
- unsigned size;
- unsigned far *source;
-#ifdef CARMACIZED
- memptr buffer2seg;
- long expanded;
-#endif
-
- mapon = mapnum;
-
-//
-// load the planes into the allready allocated buffers
-//
- size = 64*64*2;
-
- for (plane = 0; plane<MAPPLANES; plane++)
- {
- pos = mapheaderseg[mapnum]->planestart[plane];
- compressed = mapheaderseg[mapnum]->planelength[plane];
-
- dest = &(memptr)mapsegs[plane];
-
- lseek(maphandle,pos,SEEK_SET);
- if (compressed<=BUFFERSIZE)
- source = bufferseg;
- else
- {
- MM_GetPtr(&bigbufferseg,compressed);
- MM_SetLock (&bigbufferseg,true);
- source = bigbufferseg;
- }
-
- CA_FarRead(maphandle,(byte far *)source,compressed);
-#ifdef CARMACIZED
- //
- // unhuffman, then unRLEW
- // The huffman'd chunk has a two byte expanded length first
- // The resulting RLEW chunk also does, even though it's not really
- // needed
- //
- expanded = *source;
- source++;
- MM_GetPtr (&buffer2seg,expanded);
- CAL_CarmackExpand (source, (unsigned far *)buffer2seg,expanded);
- CA_RLEWexpand (((unsigned far *)buffer2seg)+1,*dest,size,
- ((mapfiletype _seg *)tinf)->RLEWtag);
- MM_FreePtr (&buffer2seg);
-
-#else
- //
- // unRLEW, skipping expanded length
- //
- CA_RLEWexpand (source+1, *dest,size,
- ((mapfiletype _seg *)tinf)->RLEWtag);
-#endif
-
- if (compressed>BUFFERSIZE)
- MM_FreePtr(&bigbufferseg);
- }
-}
-
-//===========================================================================
-
-/*
-======================
-=
-= CA_UpLevel
-=
-= Goes up a bit level in the needed lists and clears it out.
-= Everything is made purgable
-=
-======================
-*/
-
-void CA_UpLevel (void)
-{
- int i;
-
- if (ca_levelnum==7)
- Quit ("CA_UpLevel: Up past level 7!");
-
- for (i=0;i<NUMCHUNKS;i++)
- if (grsegs[i])
- MM_SetPurge (&(memptr)grsegs[i],3);
- ca_levelbit<<=1;
- ca_levelnum++;
-}
-
-//===========================================================================
-
-/*
-======================
-=
-= CA_DownLevel
-=
-= Goes down a bit level in the needed lists and recaches
-= everything from the lower level
-=
-======================
-*/
-
-void CA_DownLevel (void)
-{
- if (!ca_levelnum)
- Quit ("CA_DownLevel: Down past level 0!");
- ca_levelbit>>=1;
- ca_levelnum--;
- CA_CacheMarks();
-}
-
-//===========================================================================
-
-/*
-======================
-=
-= CA_ClearMarks
-=
-= Clears out all the marks at the current level
-=
-======================
-*/
-
-void CA_ClearMarks (void)
-{
- int i;
-
- for (i=0;i<NUMCHUNKS;i++)
- grneeded[i]&=~ca_levelbit;
-}
-
-
-//===========================================================================
-
-/*
-======================
-=
-= CA_ClearAllMarks
-=
-= Clears out all the marks on all the levels
-=
-======================
-*/
-
-void CA_ClearAllMarks (void)
-{
- _fmemset (grneeded,0,sizeof(grneeded));
- ca_levelbit = 1;
- ca_levelnum = 0;
-}
-
-
-//===========================================================================
-
-
-/*
-======================
-=
-= CA_FreeGraphics
-=
-======================
-*/
-
-
-void CA_SetGrPurge (void)
-{
- int i;
-
-//
-// free graphics
-//
- CA_ClearMarks ();
-
- for (i=0;i<NUMCHUNKS;i++)
- if (grsegs[i])
- MM_SetPurge (&(memptr)grsegs[i],3);
-}
-
-
-
-/*
-======================
-=
-= CA_SetAllPurge
-=
-= Make everything possible purgable
-=
-======================
-*/
-
-void CA_SetAllPurge (void)
-{
- int i;
-
-
-//
-// free sounds
-//
- for (i=0;i<NUMSNDCHUNKS;i++)
- if (audiosegs[i])
- MM_SetPurge (&(memptr)audiosegs[i],3);
-
-//
-// free graphics
-//
- CA_SetGrPurge ();
-}
-
-
-//===========================================================================
-
-/*
-======================
-=
-= CA_CacheMarks
-=
-======================
-*/
-#define MAXEMPTYREAD 1024
-
-void CA_CacheMarks (void)
-{
- int i,next,numcache;
- long pos,endpos,nextpos,nextendpos,compressed;
- long bufferstart,bufferend; // file position of general buffer
- byte far *source;
- memptr bigbufferseg;
-
- numcache = 0;
-//
-// go through and make everything not needed purgable
-//
- for (i=0;i<NUMCHUNKS;i++)
- if (grneeded[i]&ca_levelbit)
- {
- if (grsegs[i]) // its allready in memory, make
- MM_SetPurge(&grsegs[i],0); // sure it stays there!
- else
- numcache++;
- }
- else
- {
- if (grsegs[i]) // not needed, so make it purgeable
- MM_SetPurge(&grsegs[i],3);
- }
-
- if (!numcache) // nothing to cache!
- return;
-
-
-//
-// go through and load in anything still needed
-//
- bufferstart = bufferend = 0; // nothing good in buffer now
-
- for (i=0;i<NUMCHUNKS;i++)
- if ( (grneeded[i]&ca_levelbit) && !grsegs[i])
- {
- pos = GRFILEPOS(i);
- if (pos<0)
- continue;
-
- next = i +1;
- while (GRFILEPOS(next) == -1) // skip past any sparse tiles
- next++;
-
- compressed = GRFILEPOS(next)-pos;
- endpos = pos+compressed;
-
- if (compressed<=BUFFERSIZE)
- {
- if (bufferstart<=pos
- && bufferend>= endpos)
- {
- // data is allready in buffer
- source = (byte _seg *)bufferseg+(pos-bufferstart);
- }
- else
- {
- // load buffer with a new block from disk
- // try to get as many of the needed blocks in as possible
- while ( next < NUMCHUNKS )
- {
- while (next < NUMCHUNKS &&
- !(grneeded[next]&ca_levelbit && !grsegs[next]))
- next++;
- if (next == NUMCHUNKS)
- continue;
-
- nextpos = GRFILEPOS(next);
- while (GRFILEPOS(++next) == -1) // skip past any sparse tiles
- ;
- nextendpos = GRFILEPOS(next);
- if (nextpos - endpos <= MAXEMPTYREAD
- && nextendpos-pos <= BUFFERSIZE)
- endpos = nextendpos;
- else
- next = NUMCHUNKS; // read pos to posend
- }
-
- lseek(grhandle,pos,SEEK_SET);
- CA_FarRead(grhandle,bufferseg,endpos-pos);
- bufferstart = pos;
- bufferend = endpos;
- source = bufferseg;
- }
- }
- else
- {
- // big chunk, allocate temporary buffer
- MM_GetPtr(&bigbufferseg,compressed);
- if (mmerror)
- return;
- MM_SetLock (&bigbufferseg,true);
- lseek(grhandle,pos,SEEK_SET);
- CA_FarRead(grhandle,bigbufferseg,compressed);
- source = bigbufferseg;
- }
-
- CAL_ExpandGrChunk (i,source);
- if (mmerror)
- return;
-
- if (compressed>BUFFERSIZE)
- MM_FreePtr(&bigbufferseg);
-
- }
-}
-
-void CA_CannotOpen(char *string)
-{
- char str[30];
-
- strcpy(str,"Can't open ");
- strcat(str,string);
- strcat(str,"!\n");
- Quit (str);
-}
\ No newline at end of file
--- a/WOLFSRC/ID_CA.H
+++ /dev/null
@@ -1,101 +1,0 @@
-// ID_CA.H
-//===========================================================================
-
-#define NUMMAPS 60
-#define MAPPLANES 2
-
-#define UNCACHEGRCHUNK(chunk) {MM_FreePtr(&grsegs[chunk]);grneeded[chunk]&=~ca_levelbit;}
-
-//===========================================================================
-
-typedef struct
-{
- long planestart[3];
- unsigned planelength[3];
- unsigned width,height;
- char name[16];
-} maptype;
-
-//===========================================================================
-
-extern char audioname[13];
-
-extern byte _seg *tinf;
-extern int mapon;
-
-extern unsigned _seg *mapsegs[MAPPLANES];
-extern maptype _seg *mapheaderseg[NUMMAPS];
-extern byte _seg *audiosegs[NUMSNDCHUNKS];
-extern void _seg *grsegs[NUMCHUNKS];
-
-extern byte far grneeded[NUMCHUNKS];
-extern byte ca_levelbit,ca_levelnum;
-
-extern char *titleptr[8];
-
-extern int profilehandle,debughandle;
-
-extern char extension[5],
- gheadname[10],
- gfilename[10],
- gdictname[10],
- mheadname[10],
- mfilename[10],
- aheadname[10],
- afilename[10];
-
-extern long _seg *grstarts; // array of offsets in egagraph, -1 for sparse
-extern long _seg *audiostarts; // array of offsets in audio / audiot
-//
-// hooks for custom cache dialogs
-//
-extern void (*drawcachebox) (char *title, unsigned numcache);
-extern void (*updatecachebox) (void);
-extern void (*finishcachebox) (void);
-
-//===========================================================================
-
-// just for the score box reshifting
-
-void CAL_ShiftSprite (unsigned segment,unsigned source,unsigned dest,
- unsigned width, unsigned height, unsigned pixshift);
-
-//===========================================================================
-
-void CA_OpenDebug (void);
-void CA_CloseDebug (void);
-boolean CA_FarRead (int handle, byte far *dest, long length);
-boolean CA_FarWrite (int handle, byte far *source, long length);
-boolean CA_ReadFile (char *filename, memptr *ptr);
-boolean CA_LoadFile (char *filename, memptr *ptr);
-boolean CA_WriteFile (char *filename, void far *ptr, long length);
-
-long CA_RLEWCompress (unsigned huge *source, long length, unsigned huge *dest,
- unsigned rlewtag);
-
-void CA_RLEWexpand (unsigned huge *source, unsigned huge *dest,long length,
- unsigned rlewtag);
-
-void CA_Startup (void);
-void CA_Shutdown (void);
-
-void CA_SetGrPurge (void);
-void CA_CacheAudioChunk (int chunk);
-void CA_LoadAllSounds (void);
-
-void CA_UpLevel (void);
-void CA_DownLevel (void);
-
-void CA_SetAllPurge (void);
-
-void CA_ClearMarks (void);
-void CA_ClearAllMarks (void);
-
-#define CA_MarkGrChunk(chunk) grneeded[chunk]|=ca_levelbit
-
-void CA_CacheGrChunk (int chunk);
-void CA_CacheMap (int mapnum);
-
-void CA_CacheMarks (void);
-
-void CA_CacheScreen (int chunk);
--- a/WOLFSRC/ID_HEAD.H
+++ /dev/null
@@ -1,34 +1,0 @@
-// ID_HEAD.H
-
-
-#define EXTENSION "WLF"
-#define WOLF
-
-#define TEXTGR 0
-#define CGAGR 1
-#define EGAGR 2
-#define VGAGR 3
-
-#define GRMODE VGAGR
-
-#include "VERSION.H"
-
-typedef enum {false,true} boolean;
-typedef unsigned char byte;
-typedef unsigned int word;
-typedef unsigned long longword;
-typedef byte * Ptr;
-
-typedef struct
- {
- int x,y;
- } Point;
-
-typedef struct
- {
- Point ul,lr;
- } Rect;
-
-
-void Quit (char *error); // defined in user program
-
--- a/WOLFSRC/ID_HEADS.H
+++ /dev/null
@@ -1,123 +1,0 @@
-// ID_GLOB.H
-
-
-#include <ALLOC.H>
-#include <CTYPE.H>
-#include <DOS.H>
-#include <ERRNO.H>
-#include <FCNTL.H>
-#include <IO.H>
-#include <MEM.H>
-#include <PROCESS.H>
-#include <STDIO.H>
-#include <STDLIB.H>
-#include <STRING.H>
-#include <SYS\STAT.H>
-#include <VALUES.H>
-#include <DIR.H>
-#define __ID_GLOB__
-#include "VERSION.H"
-
-//--------------------------------------------------------------------------
-
-extern char far signon;
-
-#define introscn signon
-
-#ifdef JAPAN
-#ifdef JAPDEMO
-#include "FOREIGN\JAPAN\GFXV_WJ1.H"
-#else
-#include "FOREIGN\JAPAN\GFXV_WJ6.H"
-#endif
-#include "AUDIOWL6.H"
-#include "MAPSWL6.H"
-#else
-
-#ifndef SPEAR
-
-#include "GFXV_WL6.H"
-#include "AUDIOWL6.H"
-#include "MAPSWL6.H"
-
-#else
-
-#ifndef SPEARDEMO
-#include "GFXV_SOD.H"
-#include "AUDIOSOD.H"
-#include "MAPSSOD.H"
-#else
-#include "GFXV_SDM.H"
-#include "AUDIOSDM.H"
-#include "MAPSSDM.H"
-#endif
-
-#endif
-#endif
-//-----------------
-
-
-#define GREXT "VGA"
-
-//
-// ID Engine
-// Types.h - Generic types, #defines, etc.
-// v1.0d1
-//
-
-typedef enum {false,true} boolean;
-typedef unsigned char byte;
-typedef unsigned int word;
-typedef unsigned long longword;
-typedef byte * Ptr;
-
-typedef struct
- {
- int x,y;
- } Point;
-typedef struct
- {
- Point ul,lr;
- } Rect;
-
-#define nil ((void *)0)
-
-
-#include "ID_MM.H"
-#include "ID_PM.H"
-#include "ID_CA.H"
-#include "ID_VL.H"
-#include "ID_VH.H"
-#include "ID_IN.H"
-#include "ID_SD.H"
-#include "ID_US.H"
-
-
-void Quit (char *error); // defined in user program
-
-//
-// replacing refresh manager with custom routines
-//
-
-#define PORTTILESWIDE 20 // all drawing takes place inside a
-#define PORTTILESHIGH 13 // non displayed port of this size
-
-#define UPDATEWIDE PORTTILESWIDE
-#define UPDATEHIGH PORTTILESHIGH
-
-#define MAXTICS 10
-#define DEMOTICS 4
-
-#define UPDATETERMINATE 0x0301
-
-extern unsigned mapwidth,mapheight,tics;
-extern boolean compatability;
-
-extern byte *updateptr;
-extern unsigned uwidthtable[UPDATEHIGH];
-extern unsigned blockstarts[UPDATEWIDE*UPDATEHIGH];
-
-extern byte fontcolor,backcolor;
-
-#define SETFONTCOLOR(f,b) fontcolor=f;backcolor=b;
-
--- a/WOLFSRC/ID_IN.C
+++ /dev/null
@@ -1,990 +1,0 @@
-//
-// ID Engine
-// ID_IN.c - Input Manager
-// v1.0d1
-// By Jason Blochowiak
-//
-
-//
-// This module handles dealing with the various input devices
-//
-// Depends on: Memory Mgr (for demo recording), Sound Mgr (for timing stuff),
-// User Mgr (for command line parms)
-//
-// Globals:
-// LastScan - The keyboard scan code of the last key pressed
-// LastASCII - The ASCII value of the last key pressed
-// DEBUG - there are more globals
-//
-
-#include "ID_HEADS.H"
-#pragma hdrstop
-
-#define KeyInt 9 // The keyboard ISR number
-
-//
-// mouse constants
-//
-#define MReset 0
-#define MButtons 3
-#define MDelta 11
-
-#define MouseInt 0x33
-#define Mouse(x) _AX = x,geninterrupt(MouseInt)
-
-//
-// joystick constants
-//
-#define JoyScaleMax 32768
-#define JoyScaleShift 8
-#define MaxJoyValue 5000
-
-/*
-=============================================================================
-
- GLOBAL VARIABLES
-
-=============================================================================
-*/
-
-//
-// configuration variables
-//
-boolean MousePresent;
-boolean JoysPresent[MaxJoys];
-boolean JoyPadPresent;
-
-
-// Global variables
- boolean Keyboard[NumCodes];
- boolean Paused;
- char LastASCII;
- ScanCode LastScan;
-
- KeyboardDef KbdDefs = {0x1d,0x38,0x47,0x48,0x49,0x4b,0x4d,0x4f,0x50,0x51};
- JoystickDef JoyDefs[MaxJoys];
- ControlType Controls[MaxPlayers];
-
- longword MouseDownCount;
-
- Demo DemoMode = demo_Off;
- byte _seg *DemoBuffer;
- word DemoOffset,DemoSize;
-
-/*
-=============================================================================
-
- LOCAL VARIABLES
-
-=============================================================================
-*/
-static byte far ASCIINames[] = // Unshifted ASCII for scan codes
- {
-// 0 1 2 3 4 5 6 7 8 9 A B C D E F
- 0 ,27 ,'1','2','3','4','5','6','7','8','9','0','-','=',8 ,9 , // 0
- 'q','w','e','r','t','y','u','i','o','p','[',']',13 ,0 ,'a','s', // 1
- 'd','f','g','h','j','k','l',';',39 ,'`',0 ,92 ,'z','x','c','v', // 2
- 'b','n','m',',','.','/',0 ,'*',0 ,' ',0 ,0 ,0 ,0 ,0 ,0 , // 3
- 0 ,0 ,0 ,0 ,0 ,0 ,0 ,'7','8','9','-','4','5','6','+','1', // 4
- '2','3','0',127,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 5
- 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 6
- 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 // 7
- },
- far ShiftNames[] = // Shifted ASCII for scan codes
- {
-// 0 1 2 3 4 5 6 7 8 9 A B C D E F
- 0 ,27 ,'!','@','#','$','%','^','&','*','(',')','_','+',8 ,9 , // 0
- 'Q','W','E','R','T','Y','U','I','O','P','{','}',13 ,0 ,'A','S', // 1
- 'D','F','G','H','J','K','L',':',34 ,'~',0 ,'|','Z','X','C','V', // 2
- 'B','N','M','<','>','?',0 ,'*',0 ,' ',0 ,0 ,0 ,0 ,0 ,0 , // 3
- 0 ,0 ,0 ,0 ,0 ,0 ,0 ,'7','8','9','-','4','5','6','+','1', // 4
- '2','3','0',127,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 5
- 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 6
- 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 // 7
- },
- far SpecialNames[] = // ASCII for 0xe0 prefixed codes
- {
-// 0 1 2 3 4 5 6 7 8 9 A B C D E F
- 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 0
- 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,13 ,0 ,0 ,0 , // 1
- 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 2
- 0 ,0 ,0 ,0 ,0 ,'/',0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 3
- 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 4
- 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 5
- 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 6
- 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 // 7
- };
-
-
-static boolean IN_Started;
-static boolean CapsLock;
-static ScanCode CurCode,LastCode;
-
-static Direction DirTable[] = // Quick lookup for total direction
- {
- dir_NorthWest, dir_North, dir_NorthEast,
- dir_West, dir_None, dir_East,
- dir_SouthWest, dir_South, dir_SouthEast
- };
-
-static void (*INL_KeyHook)(void);
-static void interrupt (*OldKeyVect)(void);
-
-static char *ParmStrings[] = {"nojoys","nomouse",nil};
-
-// Internal routines
-
-///////////////////////////////////////////////////////////////////////////
-//
-// INL_KeyService() - Handles a keyboard interrupt (key up/down)
-//
-///////////////////////////////////////////////////////////////////////////
-static void interrupt
-INL_KeyService(void)
-{
-static boolean special;
- byte k,c,
- temp;
- int i;
-
- k = inportb(0x60); // Get the scan code
-
- // Tell the XT keyboard controller to clear the key
- outportb(0x61,(temp = inportb(0x61)) | 0x80);
- outportb(0x61,temp);
-
- if (k == 0xe0) // Special key prefix
- special = true;
- else if (k == 0xe1) // Handle Pause key
- Paused = true;
- else
- {
- if (k & 0x80) // Break code
- {
- k &= 0x7f;
-
-// DEBUG - handle special keys: ctl-alt-delete, print scrn
-
- Keyboard[k] = false;
- }
- else // Make code
- {
- LastCode = CurCode;
- CurCode = LastScan = k;
- Keyboard[k] = true;
-
- if (special)
- c = SpecialNames[k];
- else
- {
- if (k == sc_CapsLock)
- {
- CapsLock ^= true;
- // DEBUG - make caps lock light work
- }
-
- if (Keyboard[sc_LShift] || Keyboard[sc_RShift]) // If shifted
- {
- c = ShiftNames[k];
- if ((c >= 'A') && (c <= 'Z') && CapsLock)
- c += 'a' - 'A';
- }
- else
- {
- c = ASCIINames[k];
- if ((c >= 'a') && (c <= 'z') && CapsLock)
- c -= 'a' - 'A';
- }
- }
- if (c)
- LastASCII = c;
- }
-
- special = false;
- }
-
- if (INL_KeyHook && !special)
- INL_KeyHook();
- outportb(0x20,0x20);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// INL_GetMouseDelta() - Gets the amount that the mouse has moved from the
-// mouse driver
-//
-///////////////////////////////////////////////////////////////////////////
-static void
-INL_GetMouseDelta(int *x,int *y)
-{
- Mouse(MDelta);
- *x = _CX;
- *y = _DX;
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// INL_GetMouseButtons() - Gets the status of the mouse buttons from the
-// mouse driver
-//
-///////////////////////////////////////////////////////////////////////////
-static word
-INL_GetMouseButtons(void)
-{
- word buttons;
-
- Mouse(MButtons);
- buttons = _BX;
- return(buttons);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// IN_GetJoyAbs() - Reads the absolute position of the specified joystick
-//
-///////////////////////////////////////////////////////////////////////////
-void
-IN_GetJoyAbs(word joy,word *xp,word *yp)
-{
- byte xb,yb,
- xs,ys;
- word x,y;
-
- x = y = 0;
- xs = joy? 2 : 0; // Find shift value for x axis
- xb = 1 << xs; // Use shift value to get x bit mask
- ys = joy? 3 : 1; // Do the same for y axis
- yb = 1 << ys;
-
-// Read the absolute joystick values
-asm pushf // Save some registers
-asm push si
-asm push di
-asm cli // Make sure an interrupt doesn't screw the timings
-
-
-asm mov dx,0x201
-asm in al,dx
-asm out dx,al // Clear the resistors
-
-asm mov ah,[xb] // Get masks into registers
-asm mov ch,[yb]
-
-asm xor si,si // Clear count registers
-asm xor di,di
-asm xor bh,bh // Clear high byte of bx for later
-
-asm push bp // Don't mess up stack frame
-asm mov bp,MaxJoyValue
-
-loop:
-asm in al,dx // Get bits indicating whether all are finished
-
-asm dec bp // Check bounding register
-asm jz done // We have a silly value - abort
-
-asm mov bl,al // Duplicate the bits
-asm and bl,ah // Mask off useless bits (in [xb])
-asm add si,bx // Possibly increment count register
-asm mov cl,bl // Save for testing later
-
-asm mov bl,al
-asm and bl,ch // [yb]
-asm add di,bx
-
-asm add cl,bl
-asm jnz loop // If both bits were 0, drop out
-
-done:
-asm pop bp
-
-asm mov cl,[xs] // Get the number of bits to shift
-asm shr si,cl // and shift the count that many times
-
-asm mov cl,[ys]
-asm shr di,cl
-
-asm mov [x],si // Store the values into the variables
-asm mov [y],di
-
-asm pop di
-asm pop si
-asm popf // Restore the registers
-
- *xp = x;
- *yp = y;
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// INL_GetJoyDelta() - Returns the relative movement of the specified
-// joystick (from +/-127)
-//
-///////////////////////////////////////////////////////////////////////////
-void INL_GetJoyDelta(word joy,int *dx,int *dy)
-{
- word x,y;
- longword time;
- JoystickDef *def;
-static longword lasttime;
-
- IN_GetJoyAbs(joy,&x,&y);
- def = JoyDefs + joy;
-
- if (x < def->threshMinX)
- {
- if (x < def->joyMinX)
- x = def->joyMinX;
-
- x = -(x - def->threshMinX);
- x *= def->joyMultXL;
- x >>= JoyScaleShift;
- *dx = (x > 127)? -127 : -x;
- }
- else if (x > def->threshMaxX)
- {
- if (x > def->joyMaxX)
- x = def->joyMaxX;
-
- x = x - def->threshMaxX;
- x *= def->joyMultXH;
- x >>= JoyScaleShift;
- *dx = (x > 127)? 127 : x;
- }
- else
- *dx = 0;
-
- if (y < def->threshMinY)
- {
- if (y < def->joyMinY)
- y = def->joyMinY;
-
- y = -(y - def->threshMinY);
- y *= def->joyMultYL;
- y >>= JoyScaleShift;
- *dy = (y > 127)? -127 : -y;
- }
- else if (y > def->threshMaxY)
- {
- if (y > def->joyMaxY)
- y = def->joyMaxY;
-
- y = y - def->threshMaxY;
- y *= def->joyMultYH;
- y >>= JoyScaleShift;
- *dy = (y > 127)? 127 : y;
- }
- else
- *dy = 0;
-
- lasttime = TimeCount;
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// INL_GetJoyButtons() - Returns the button status of the specified
-// joystick
-//
-///////////////////////////////////////////////////////////////////////////
-static word
-INL_GetJoyButtons(word joy)
-{
-register word result;
-
- result = inportb(0x201); // Get all the joystick buttons
- result >>= joy? 6 : 4; // Shift into bits 0-1
- result &= 3; // Mask off the useless bits
- result ^= 3;
- return(result);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// IN_GetJoyButtonsDB() - Returns the de-bounced button status of the
-// specified joystick
-//
-///////////////////////////////////////////////////////////////////////////
-word
-IN_GetJoyButtonsDB(word joy)
-{
- longword lasttime;
- word result1,result2;
-
- do
- {
- result1 = INL_GetJoyButtons(joy);
- lasttime = TimeCount;
- while (TimeCount == lasttime)
- ;
- result2 = INL_GetJoyButtons(joy);
- } while (result1 != result2);
- return(result1);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// INL_StartKbd() - Sets up my keyboard stuff for use
-//
-///////////////////////////////////////////////////////////////////////////
-static void
-INL_StartKbd(void)
-{
- INL_KeyHook = NULL; // no key hook routine
-
- IN_ClearKeysDown();
-
- OldKeyVect = getvect(KeyInt);
- setvect(KeyInt,INL_KeyService);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// INL_ShutKbd() - Restores keyboard control to the BIOS
-//
-///////////////////////////////////////////////////////////////////////////
-static void
-INL_ShutKbd(void)
-{
- poke(0x40,0x17,peek(0x40,0x17) & 0xfaf0); // Clear ctrl/alt/shift flags
-
- setvect(KeyInt,OldKeyVect);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// INL_StartMouse() - Detects and sets up the mouse
-//
-///////////////////////////////////////////////////////////////////////////
-static boolean
-INL_StartMouse(void)
-{
-#if 0
- if (getvect(MouseInt))
- {
- Mouse(MReset);
- if (_AX == 0xffff)
- return(true);
- }
- return(false);
-#endif
- union REGS regs;
- unsigned char far *vector;
-
-
- if ((vector=MK_FP(peek(0,0x33*4+2),peek(0,0x33*4)))==NULL)
- return false;
-
- if (*vector == 207)
- return false;
-
- Mouse(MReset);
- return true;
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// INL_ShutMouse() - Cleans up after the mouse
-//
-///////////////////////////////////////////////////////////////////////////
-static void
-INL_ShutMouse(void)
-{
-}
-
-//
-// INL_SetJoyScale() - Sets up scaling values for the specified joystick
-//
-static void
-INL_SetJoyScale(word joy)
-{
- JoystickDef *def;
-
- def = &JoyDefs[joy];
- def->joyMultXL = JoyScaleMax / (def->threshMinX - def->joyMinX);
- def->joyMultXH = JoyScaleMax / (def->joyMaxX - def->threshMaxX);
- def->joyMultYL = JoyScaleMax / (def->threshMinY - def->joyMinY);
- def->joyMultYH = JoyScaleMax / (def->joyMaxY - def->threshMaxY);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// IN_SetupJoy() - Sets up thresholding values and calls INL_SetJoyScale()
-// to set up scaling values
-//
-///////////////////////////////////////////////////////////////////////////
-void
-IN_SetupJoy(word joy,word minx,word maxx,word miny,word maxy)
-{
- word d,r;
- JoystickDef *def;
-
- def = &JoyDefs[joy];
-
- def->joyMinX = minx;
- def->joyMaxX = maxx;
- r = maxx - minx;
- d = r / 3;
- def->threshMinX = ((r / 2) - d) + minx;
- def->threshMaxX = ((r / 2) + d) + minx;
-
- def->joyMinY = miny;
- def->joyMaxY = maxy;
- r = maxy - miny;
- d = r / 3;
- def->threshMinY = ((r / 2) - d) + miny;
- def->threshMaxY = ((r / 2) + d) + miny;
-
- INL_SetJoyScale(joy);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// INL_StartJoy() - Detects & auto-configures the specified joystick
-// The auto-config assumes the joystick is centered
-//
-///////////////////////////////////////////////////////////////////////////
-static boolean
-INL_StartJoy(word joy)
-{
- word x,y;
-
- IN_GetJoyAbs(joy,&x,&y);
-
- if
- (
- ((x == 0) || (x > MaxJoyValue - 10))
- || ((y == 0) || (y > MaxJoyValue - 10))
- )
- return(false);
- else
- {
- IN_SetupJoy(joy,0,x * 2,0,y * 2);
- return(true);
- }
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// INL_ShutJoy() - Cleans up the joystick stuff
-//
-///////////////////////////////////////////////////////////////////////////
-static void
-INL_ShutJoy(word joy)
-{
- JoysPresent[joy] = false;
-}
-
-
-///////////////////////////////////////////////////////////////////////////
-//
-// IN_Startup() - Starts up the Input Mgr
-//
-///////////////////////////////////////////////////////////////////////////
-void
-IN_Startup(void)
-{
- boolean checkjoys,checkmouse;
- word i;
-
- if (IN_Started)
- return;
-
- checkjoys = true;
- checkmouse = true;
- for (i = 1;i < _argc;i++)
- {
- switch (US_CheckParm(_argv[i],ParmStrings))
- {
- case 0:
- checkjoys = false;
- break;
- case 1:
- checkmouse = false;
- break;
- }
- }
-
- INL_StartKbd();
- MousePresent = checkmouse? INL_StartMouse() : false;
-
- for (i = 0;i < MaxJoys;i++)
- JoysPresent[i] = checkjoys? INL_StartJoy(i) : false;
-
- IN_Started = true;
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// IN_Default() - Sets up default conditions for the Input Mgr
-//
-///////////////////////////////////////////////////////////////////////////
-void
-IN_Default(boolean gotit,ControlType in)
-{
- if
- (
- (!gotit)
- || ((in == ctrl_Joystick1) && !JoysPresent[0])
- || ((in == ctrl_Joystick2) && !JoysPresent[1])
- || ((in == ctrl_Mouse) && !MousePresent)
- )
- in = ctrl_Keyboard1;
- IN_SetControlType(0,in);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// IN_Shutdown() - Shuts down the Input Mgr
-//
-///////////////////////////////////////////////////////////////////////////
-void
-IN_Shutdown(void)
-{
- word i;
-
- if (!IN_Started)
- return;
-
- INL_ShutMouse();
- for (i = 0;i < MaxJoys;i++)
- INL_ShutJoy(i);
- INL_ShutKbd();
-
- IN_Started = false;
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// IN_SetKeyHook() - Sets the routine that gets called by INL_KeyService()
-// everytime a real make/break code gets hit
-//
-///////////////////////////////////////////////////////////////////////////
-void
-IN_SetKeyHook(void (*hook)())
-{
- INL_KeyHook = hook;
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// IN_ClearKeysDown() - Clears the keyboard array
-//
-///////////////////////////////////////////////////////////////////////////
-void
-IN_ClearKeysDown(void)
-{
- int i;
-
- LastScan = sc_None;
- LastASCII = key_None;
- memset (Keyboard,0,sizeof(Keyboard));
-}
-
-
-///////////////////////////////////////////////////////////////////////////
-//
-// IN_ReadControl() - Reads the device associated with the specified
-// player and fills in the control info struct
-//
-///////////////////////////////////////////////////////////////////////////
-void
-IN_ReadControl(int player,ControlInfo *info)
-{
- boolean realdelta;
- byte dbyte;
- word buttons;
- int dx,dy;
- Motion mx,my;
- ControlType type;
-register KeyboardDef *def;
-
- dx = dy = 0;
- mx = my = motion_None;
- buttons = 0;
-
- if (DemoMode == demo_Playback)
- {
- dbyte = DemoBuffer[DemoOffset + 1];
- my = (dbyte & 3) - 1;
- mx = ((dbyte >> 2) & 3) - 1;
- buttons = (dbyte >> 4) & 3;
-
- if (!(--DemoBuffer[DemoOffset]))
- {
- DemoOffset += 2;
- if (DemoOffset >= DemoSize)
- DemoMode = demo_PlayDone;
- }
-
- realdelta = false;
- }
- else if (DemoMode == demo_PlayDone)
- Quit("Demo playback exceeded");
- else
- {
- switch (type = Controls[player])
- {
- case ctrl_Keyboard:
- def = &KbdDefs;
-
- if (Keyboard[def->upleft])
- mx = motion_Left,my = motion_Up;
- else if (Keyboard[def->upright])
- mx = motion_Right,my = motion_Up;
- else if (Keyboard[def->downleft])
- mx = motion_Left,my = motion_Down;
- else if (Keyboard[def->downright])
- mx = motion_Right,my = motion_Down;
-
- if (Keyboard[def->up])
- my = motion_Up;
- else if (Keyboard[def->down])
- my = motion_Down;
-
- if (Keyboard[def->left])
- mx = motion_Left;
- else if (Keyboard[def->right])
- mx = motion_Right;
-
- if (Keyboard[def->button0])
- buttons += 1 << 0;
- if (Keyboard[def->button1])
- buttons += 1 << 1;
- realdelta = false;
- break;
- case ctrl_Joystick1:
- case ctrl_Joystick2:
- INL_GetJoyDelta(type - ctrl_Joystick,&dx,&dy);
- buttons = INL_GetJoyButtons(type - ctrl_Joystick);
- realdelta = true;
- break;
- case ctrl_Mouse:
- INL_GetMouseDelta(&dx,&dy);
- buttons = INL_GetMouseButtons();
- realdelta = true;
- break;
- }
- }
-
- if (realdelta)
- {
- mx = (dx < 0)? motion_Left : ((dx > 0)? motion_Right : motion_None);
- my = (dy < 0)? motion_Up : ((dy > 0)? motion_Down : motion_None);
- }
- else
- {
- dx = mx * 127;
- dy = my * 127;
- }
-
- info->x = dx;
- info->xaxis = mx;
- info->y = dy;
- info->yaxis = my;
- info->button0 = buttons & (1 << 0);
- info->button1 = buttons & (1 << 1);
- info->button2 = buttons & (1 << 2);
- info->button3 = buttons & (1 << 3);
- info->dir = DirTable[((my + 1) * 3) + (mx + 1)];
-
- if (DemoMode == demo_Record)
- {
- // Pack the control info into a byte
- dbyte = (buttons << 4) | ((mx + 1) << 2) | (my + 1);
-
- if
- (
- (DemoBuffer[DemoOffset + 1] == dbyte)
- && (DemoBuffer[DemoOffset] < 255)
- )
- (DemoBuffer[DemoOffset])++;
- else
- {
- if (DemoOffset || DemoBuffer[DemoOffset])
- DemoOffset += 2;
-
- if (DemoOffset >= DemoSize)
- Quit("Demo buffer overflow");
-
- DemoBuffer[DemoOffset] = 1;
- DemoBuffer[DemoOffset + 1] = dbyte;
- }
- }
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// IN_SetControlType() - Sets the control type to be used by the specified
-// player
-//
-///////////////////////////////////////////////////////////////////////////
-void
-IN_SetControlType(int player,ControlType type)
-{
- // DEBUG - check that requested type is present?
- Controls[player] = type;
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// IN_WaitForKey() - Waits for a scan code, then clears LastScan and
-// returns the scan code
-//
-///////////////////////////////////////////////////////////////////////////
-ScanCode
-IN_WaitForKey(void)
-{
- ScanCode result;
-
- while (!(result = LastScan))
- ;
- LastScan = 0;
- return(result);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// IN_WaitForASCII() - Waits for an ASCII char, then clears LastASCII and
-// returns the ASCII value
-//
-///////////////////////////////////////////////////////////////////////////
-char
-IN_WaitForASCII(void)
-{
- char result;
-
- while (!(result = LastASCII))
- ;
- LastASCII = '\0';
- return(result);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// IN_Ack() - waits for a button or key press. If a button is down, upon
-// calling, it must be released for it to be recognized
-//
-///////////////////////////////////////////////////////////////////////////
-
-boolean btnstate[8];
-
-void IN_StartAck(void)
-{
- unsigned i,buttons;
-
-//
-// get initial state of everything
-//
- IN_ClearKeysDown();
- memset (btnstate,0,sizeof(btnstate));
-
- buttons = IN_JoyButtons () << 4;
- if (MousePresent)
- buttons |= IN_MouseButtons ();
-
- for (i=0;i<8;i++,buttons>>=1)
- if (buttons&1)
- btnstate[i] = true;
-}
-
-
-boolean IN_CheckAck (void)
-{
- unsigned i,buttons;
-
-//
-// see if something has been pressed
-//
- if (LastScan)
- return true;
-
- buttons = IN_JoyButtons () << 4;
- if (MousePresent)
- buttons |= IN_MouseButtons ();
-
- for (i=0;i<8;i++,buttons>>=1)
- if ( buttons&1 )
- {
- if (!btnstate[i])
- return true;
- }
- else
- btnstate[i]=false;
-
- return false;
-}
-
-
-void IN_Ack (void)
-{
- IN_StartAck ();
-
- while (!IN_CheckAck ())
- ;
-}
-
-
-///////////////////////////////////////////////////////////////////////////
-//
-// IN_UserInput() - Waits for the specified delay time (in ticks) or the
-// user pressing a key or a mouse button. If the clear flag is set, it
-// then either clears the key or waits for the user to let the mouse
-// button up.
-//
-///////////////////////////////////////////////////////////////////////////
-boolean IN_UserInput(longword delay)
-{
- longword lasttime;
-
- lasttime = TimeCount;
- IN_StartAck ();
- do
- {
- if (IN_CheckAck())
- return true;
- } while (TimeCount - lasttime < delay);
- return(false);
-}
-
-//===========================================================================
-
-/*
-===================
-=
-= IN_MouseButtons
-=
-===================
-*/
-
-byte IN_MouseButtons (void)
-{
- if (MousePresent)
- {
- Mouse(MButtons);
- return _BX;
- }
- else
- return 0;
-}
-
-
-/*
-===================
-=
-= IN_JoyButtons
-=
-===================
-*/
-
-byte IN_JoyButtons (void)
-{
- unsigned joybits;
-
- joybits = inportb(0x201); // Get all the joystick buttons
- joybits >>= 4; // only the high bits are useful
- joybits ^= 15; // return with 1=pressed
-
- return joybits;
-}
-
-
--- a/WOLFSRC/ID_IN.H
+++ /dev/null
@@ -1,202 +1,0 @@
-//
-// ID Engine
-// ID_IN.h - Header file for Input Manager
-// v1.0d1
-// By Jason Blochowiak
-//
-
-#ifndef __ID_IN__
-#define __ID_IN__
-
-#ifdef __DEBUG__
-#define __DEBUG_InputMgr__
-#endif
-
-#define MaxPlayers 4
-#define MaxKbds 2
-#define MaxJoys 2
-#define NumCodes 128
-
-typedef byte ScanCode;
-#define sc_None 0
-#define sc_Bad 0xff
-#define sc_Return 0x1c
-#define sc_Enter sc_Return
-#define sc_Escape 0x01
-#define sc_Space 0x39
-#define sc_BackSpace 0x0e
-#define sc_Tab 0x0f
-#define sc_Alt 0x38
-#define sc_Control 0x1d
-#define sc_CapsLock 0x3a
-#define sc_LShift 0x2a
-#define sc_RShift 0x36
-#define sc_UpArrow 0x48
-#define sc_DownArrow 0x50
-#define sc_LeftArrow 0x4b
-#define sc_RightArrow 0x4d
-#define sc_Insert 0x52
-#define sc_Delete 0x53
-#define sc_Home 0x47
-#define sc_End 0x4f
-#define sc_PgUp 0x49
-#define sc_PgDn 0x51
-#define sc_F1 0x3b
-#define sc_F2 0x3c
-#define sc_F3 0x3d
-#define sc_F4 0x3e
-#define sc_F5 0x3f
-#define sc_F6 0x40
-#define sc_F7 0x41
-#define sc_F8 0x42
-#define sc_F9 0x43
-#define sc_F10 0x44
-#define sc_F11 0x57
-#define sc_F12 0x59
-
-#define sc_1 0x02
-#define sc_2 0x03
-#define sc_3 0x04
-#define sc_4 0x05
-#define sc_5 0x06
-#define sc_6 0x07
-#define sc_7 0x08
-#define sc_8 0x09
-#define sc_9 0x0a
-#define sc_0 0x0b
-
-#define sc_A 0x1e
-#define sc_B 0x30
-#define sc_C 0x2e
-#define sc_D 0x20
-#define sc_E 0x12
-#define sc_F 0x21
-#define sc_G 0x22
-#define sc_H 0x23
-#define sc_I 0x17
-#define sc_J 0x24
-#define sc_K 0x25
-#define sc_L 0x26
-#define sc_M 0x32
-#define sc_N 0x31
-#define sc_O 0x18
-#define sc_P 0x19
-#define sc_Q 0x10
-#define sc_R 0x13
-#define sc_S 0x1f
-#define sc_T 0x14
-#define sc_U 0x16
-#define sc_V 0x2f
-#define sc_W 0x11
-#define sc_X 0x2d
-#define sc_Y 0x15
-#define sc_Z 0x2c
-
-#define key_None 0
-#define key_Return 0x0d
-#define key_Enter key_Return
-#define key_Escape 0x1b
-#define key_Space 0x20
-#define key_BackSpace 0x08
-#define key_Tab 0x09
-#define key_Delete 0x7f
-
-// Stuff for the mouse
-#define MReset 0
-#define MButtons 3
-#define MDelta 11
-
-#define MouseInt 0x33
-#define Mouse(x) _AX = x,geninterrupt(MouseInt)
-
-typedef enum {
- demo_Off,demo_Record,demo_Playback,demo_PlayDone
- } Demo;
-typedef enum {
- ctrl_Keyboard,
- ctrl_Keyboard1 = ctrl_Keyboard,ctrl_Keyboard2,
- ctrl_Joystick,
- ctrl_Joystick1 = ctrl_Joystick,ctrl_Joystick2,
- ctrl_Mouse
- } ControlType;
-typedef enum {
- motion_Left = -1,motion_Up = -1,
- motion_None = 0,
- motion_Right = 1,motion_Down = 1
- } Motion;
-typedef enum {
- dir_North,dir_NorthEast,
- dir_East,dir_SouthEast,
- dir_South,dir_SouthWest,
- dir_West,dir_NorthWest,
- dir_None
- } Direction;
-typedef struct {
- boolean button0,button1,button2,button3;
- int x,y;
- Motion xaxis,yaxis;
- Direction dir;
- } CursorInfo;
-typedef CursorInfo ControlInfo;
-typedef struct {
- ScanCode button0,button1,
- upleft, up, upright,
- left, right,
- downleft, down, downright;
- } KeyboardDef;
-typedef struct {
- word joyMinX,joyMinY,
- threshMinX,threshMinY,
- threshMaxX,threshMaxY,
- joyMaxX,joyMaxY,
- joyMultXL,joyMultYL,
- joyMultXH,joyMultYH;
- } JoystickDef;
-// Global variables
-extern boolean Keyboard[],
- MousePresent,
- JoysPresent[];
-extern boolean Paused;
-extern char LastASCII;
-extern ScanCode LastScan;
-extern KeyboardDef KbdDefs;
-extern JoystickDef JoyDefs[];
-extern ControlType Controls[MaxPlayers];
-
-extern Demo DemoMode;
-extern byte _seg *DemoBuffer;
-extern word DemoOffset,DemoSize;
-
-// Function prototypes
-#define IN_KeyDown(code) (Keyboard[(code)])
-#define IN_ClearKey(code) {Keyboard[code] = false;\
- if (code == LastScan) LastScan = sc_None;}
-
-// DEBUG - put names in prototypes
-extern void IN_Startup(void),IN_Shutdown(void),
- IN_Default(boolean gotit,ControlType in),
- IN_SetKeyHook(void (*)()),
- IN_ClearKeysDown(void),
- IN_ReadCursor(CursorInfo *),
- IN_ReadControl(int,ControlInfo *),
- IN_SetControlType(int,ControlType),
- IN_GetJoyAbs(word joy,word *xp,word *yp),
- IN_SetupJoy(word joy,word minx,word maxx,
- word miny,word maxy),
- IN_StopDemo(void),IN_FreeDemoBuffer(void),
- IN_Ack(void),IN_AckBack(void);
-extern boolean IN_UserInput(longword delay);
-extern char IN_WaitForASCII(void);
-extern ScanCode IN_WaitForKey(void);
-extern word IN_GetJoyButtonsDB(word joy);
-extern byte *IN_GetScanName(ScanCode);
-
-
-byte IN_MouseButtons (void);
-byte IN_JoyButtons (void);
-
-void INL_GetJoyDelta(word joy,int *dx,int *dy);
-void IN_StartAck(void);
-boolean IN_CheckAck (void);
-
-#endif
--- a/WOLFSRC/ID_MM.C
+++ /dev/null
@@ -1,953 +1,0 @@
-// NEWMM.C
-
-/*
-=============================================================================
-
- ID software memory manager
- --------------------------
-
-Primary coder: John Carmack
-
-RELIES ON
----------
-Quit (char *error) function
-
-
-WORK TO DO
-----------
-MM_SizePtr to change the size of a given pointer
-
-Multiple purge levels utilized
-
-EMS / XMS unmanaged routines
-
-=============================================================================
-*/
-
-#include "ID_HEADS.H"
-#pragma hdrstop
-
-#pragma warn -pro
-#pragma warn -use
-
-/*
-=============================================================================
-
- LOCAL INFO
-
-=============================================================================
-*/
-
-#define LOCKBIT 0x80 // if set in attributes, block cannot be moved
-#define PURGEBITS 3 // 0-3 level, 0= unpurgable, 3= purge first
-#define PURGEMASK 0xfffc
-#define BASEATTRIBUTES 0 // unlocked, non purgable
-
-#define MAXUMBS 10
-
-typedef struct mmblockstruct
-{
- unsigned start,length;
- unsigned attributes;
- memptr *useptr; // pointer to the segment start
- struct mmblockstruct far *next;
-} mmblocktype;
-
-
-//#define GETNEWBLOCK {if(!(mmnew=mmfree))Quit("MM_GETNEWBLOCK: No free blocks!")\
-// ;mmfree=mmfree->next;}
-
-#define GETNEWBLOCK {if(!mmfree)MML_ClearBlock();mmnew=mmfree;mmfree=mmfree->next;}
-
-#define FREEBLOCK(x) {*x->useptr=NULL;x->next=mmfree;mmfree=x;}
-
-/*
-=============================================================================
-
- GLOBAL VARIABLES
-
-=============================================================================
-*/
-
-mminfotype mminfo;
-memptr bufferseg;
-boolean mmerror;
-
-void (* beforesort) (void);
-void (* aftersort) (void);
-
-/*
-=============================================================================
-
- LOCAL VARIABLES
-
-=============================================================================
-*/
-
-boolean mmstarted;
-
-void far *farheap;
-void *nearheap;
-
-mmblocktype far mmblocks[MAXBLOCKS]
- ,far *mmhead,far *mmfree,far *mmrover,far *mmnew;
-
-boolean bombonerror;
-
-//unsigned totalEMSpages,freeEMSpages,EMSpageframe,EMSpagesmapped,EMShandle;
-
-void (* XMSaddr) (void); // far pointer to XMS driver
-
-unsigned numUMBs,UMBbase[MAXUMBS];
-
-//==========================================================================
-
-//
-// local prototypes
-//
-
-boolean MML_CheckForEMS (void);
-void MML_ShutdownEMS (void);
-void MM_MapEMS (void);
-boolean MML_CheckForXMS (void);
-void MML_ShutdownXMS (void);
-void MML_UseSpace (unsigned segstart, unsigned seglength);
-void MML_ClearBlock (void);
-
-//==========================================================================
-
-/*
-======================
-=
-= MML_CheckForXMS
-=
-= Check for XMM driver
-=
-=======================
-*/
-
-boolean MML_CheckForXMS (void)
-{
- numUMBs = 0;
-
-asm {
- mov ax,0x4300
- int 0x2f // query status of installed diver
- cmp al,0x80
- je good
- }
-
- return false;
-good:
- return true;
-}
-
-
-/*
-======================
-=
-= MML_SetupXMS
-=
-= Try to allocate all upper memory block
-=
-=======================
-*/
-
-void MML_SetupXMS (void)
-{
- unsigned base,size;
-
-asm {
- mov ax,0x4310
- int 0x2f
- mov [WORD PTR XMSaddr],bx
- mov [WORD PTR XMSaddr+2],es // function pointer to XMS driver
- }
-
-getmemory:
-asm {
- mov ah,XMS_ALLOCUMB
- mov dx,0xffff // try for largest block possible
- call [DWORD PTR XMSaddr]
- or ax,ax
- jnz gotone
-
- cmp bl,0xb0 // error: smaller UMB is available
- jne done;
-
- mov ah,XMS_ALLOCUMB
- call [DWORD PTR XMSaddr] // DX holds largest available UMB
- or ax,ax
- jz done // another error...
- }
-
-gotone:
-asm {
- mov [base],bx
- mov [size],dx
- }
- MML_UseSpace (base,size);
- mminfo.XMSmem += size*16;
- UMBbase[numUMBs] = base;
- numUMBs++;
- if (numUMBs < MAXUMBS)
- goto getmemory;
-
-done:;
-}
-
-
-/*
-======================
-=
-= MML_ShutdownXMS
-=
-======================
-*/
-
-void MML_ShutdownXMS (void)
-{
- int i;
- unsigned base;
-
- for (i=0;i<numUMBs;i++)
- {
- base = UMBbase[i];
-
-asm mov ah,XMS_FREEUMB
-asm mov dx,[base]
-asm call [DWORD PTR XMSaddr]
- }
-}
-
-//==========================================================================
-
-/*
-======================
-=
-= MML_UseSpace
-=
-= Marks a range of paragraphs as usable by the memory manager
-= This is used to mark space for the near heap, far heap, ems page frame,
-= and upper memory blocks
-=
-======================
-*/
-
-void MML_UseSpace (unsigned segstart, unsigned seglength)
-{
- mmblocktype far *scan,far *last;
- unsigned oldend;
- long extra;
-
- scan = last = mmhead;
- mmrover = mmhead; // reset rover to start of memory
-
-//
-// search for the block that contains the range of segments
-//
- while (scan->start+scan->length < segstart)
- {
- last = scan;
- scan = scan->next;
- }
-
-//
-// take the given range out of the block
-//
- oldend = scan->start + scan->length;
- extra = oldend - (segstart+seglength);
- if (extra < 0)
- Quit ("MML_UseSpace: Segment spans two blocks!");
-
- if (segstart == scan->start)
- {
- last->next = scan->next; // unlink block
- FREEBLOCK(scan);
- scan = last;
- }
- else
- scan->length = segstart-scan->start; // shorten block
-
- if (extra > 0)
- {
- GETNEWBLOCK;
- mmnew->useptr = NULL;
-
- mmnew->next = scan->next;
- scan->next = mmnew;
- mmnew->start = segstart+seglength;
- mmnew->length = extra;
- mmnew->attributes = LOCKBIT;
- }
-
-}
-
-//==========================================================================
-
-/*
-====================
-=
-= MML_ClearBlock
-=
-= We are out of blocks, so free a purgable block
-=
-====================
-*/
-
-void MML_ClearBlock (void)
-{
- mmblocktype far *scan,far *last;
-
- scan = mmhead->next;
-
- while (scan)
- {
- if (!(scan->attributes&LOCKBIT) && (scan->attributes&PURGEBITS) )
- {
- MM_FreePtr(scan->useptr);
- return;
- }
- scan = scan->next;
- }
-
- Quit ("MM_ClearBlock: No purgable blocks!");
-}
-
-
-//==========================================================================
-
-/*
-===================
-=
-= MM_Startup
-=
-= Grabs all space from turbo with malloc/farmalloc
-= Allocates bufferseg misc buffer
-=
-===================
-*/
-
-static char *ParmStrings[] = {"noems","noxms",""};
-
-void MM_Startup (void)
-{
- int i;
- unsigned long length;
- void far *start;
- unsigned segstart,seglength,endfree;
-
- if (mmstarted)
- MM_Shutdown ();
-
-
- mmstarted = true;
- bombonerror = true;
-//
-// set up the linked list (everything in the free list;
-//
- mmhead = NULL;
- mmfree = &mmblocks[0];
- for (i=0;i<MAXBLOCKS-1;i++)
- mmblocks[i].next = &mmblocks[i+1];
- mmblocks[i].next = NULL;
-
-//
-// locked block of all memory until we punch out free space
-//
- GETNEWBLOCK;
- mmhead = mmnew; // this will allways be the first node
- mmnew->start = 0;
- mmnew->length = 0xffff;
- mmnew->attributes = LOCKBIT;
- mmnew->next = NULL;
- mmrover = mmhead;
-
-
-//
-// get all available near conventional memory segments
-//
- length=coreleft();
- start = (void far *)(nearheap = malloc(length));
-
- length -= 16-(FP_OFF(start)&15);
- length -= SAVENEARHEAP;
- seglength = length / 16; // now in paragraphs
- segstart = FP_SEG(start)+(FP_OFF(start)+15)/16;
- MML_UseSpace (segstart,seglength);
- mminfo.nearheap = length;
-
-//
-// get all available far conventional memory segments
-//
- length=farcoreleft();
- start = farheap = farmalloc(length);
- length -= 16-(FP_OFF(start)&15);
- length -= SAVEFARHEAP;
- seglength = length / 16; // now in paragraphs
- segstart = FP_SEG(start)+(FP_OFF(start)+15)/16;
- MML_UseSpace (segstart,seglength);
- mminfo.farheap = length;
- mminfo.mainmem = mminfo.nearheap + mminfo.farheap;
-
-//
-// allocate the misc buffer
-//
- mmrover = mmhead; // start looking for space after low block
-
- MM_GetPtr (&bufferseg,BUFFERSIZE);
-}
-
-//==========================================================================
-
-/*
-====================
-=
-= MM_Shutdown
-=
-= Frees all conventional, EMS, and XMS allocated
-=
-====================
-*/
-
-void MM_Shutdown (void)
-{
- if (!mmstarted)
- return;
-
- farfree (farheap);
- free (nearheap);
-// MML_ShutdownXMS ();
-}
-
-//==========================================================================
-
-/*
-====================
-=
-= MM_GetPtr
-=
-= Allocates an unlocked, unpurgable block
-=
-====================
-*/
-
-void MM_GetPtr (memptr *baseptr,unsigned long size)
-{
- mmblocktype far *scan,far *lastscan,far *endscan
- ,far *purge,far *next;
- int search;
- unsigned needed,startseg;
-
- needed = (size+15)/16; // convert size from bytes to paragraphs
-
- GETNEWBLOCK; // fill in start and next after a spot is found
- mmnew->length = needed;
- mmnew->useptr = baseptr;
- mmnew->attributes = BASEATTRIBUTES;
-
-tryagain:
- for (search = 0; search<3; search++)
- {
- //
- // first search: try to allocate right after the rover, then on up
- // second search: search from the head pointer up to the rover
- // third search: compress memory, then scan from start
- if (search == 1 && mmrover == mmhead)
- search++;
-
- switch (search)
- {
- case 0:
- lastscan = mmrover;
- scan = mmrover->next;
- endscan = NULL;
- break;
- case 1:
- lastscan = mmhead;
- scan = mmhead->next;
- endscan = mmrover;
- break;
- case 2:
- MM_SortMem ();
- lastscan = mmhead;
- scan = mmhead->next;
- endscan = NULL;
- break;
- }
-
- startseg = lastscan->start + lastscan->length;
-
- while (scan != endscan)
- {
- if (scan->start - startseg >= needed)
- {
- //
- // got enough space between the end of lastscan and
- // the start of scan, so throw out anything in the middle
- // and allocate the new block
- //
- purge = lastscan->next;
- lastscan->next = mmnew;
- mmnew->start = *(unsigned *)baseptr = startseg;
- mmnew->next = scan;
- while ( purge != scan)
- { // free the purgable block
- next = purge->next;
- FREEBLOCK(purge);
- purge = next; // purge another if not at scan
- }
- mmrover = mmnew;
- return; // good allocation!
- }
-
- //
- // if this block is purge level zero or locked, skip past it
- //
- if ( (scan->attributes & LOCKBIT)
- || !(scan->attributes & PURGEBITS) )
- {
- lastscan = scan;
- startseg = lastscan->start + lastscan->length;
- }
-
-
- scan=scan->next; // look at next line
- }
- }
-
- if (bombonerror)
- {
-
-extern char configname[];
-extern boolean insetupscaling;
-extern int viewsize;
-boolean SetViewSize (unsigned width, unsigned height);
-#define HEIGHTRATIO 0.50
-//
-// wolf hack -- size the view down
-//
- if (!insetupscaling && viewsize>10)
- {
-mmblocktype far *savedmmnew;
- savedmmnew = mmnew;
- viewsize -= 2;
- SetViewSize (viewsize*16,viewsize*16*HEIGHTRATIO);
- mmnew = savedmmnew;
- goto tryagain;
- }
-
-// unlink(configname);
- Quit ("MM_GetPtr: Out of memory!");
- }
- else
- mmerror = true;
-}
-
-//==========================================================================
-
-/*
-====================
-=
-= MM_FreePtr
-=
-= Deallocates an unlocked, purgable block
-=
-====================
-*/
-
-void MM_FreePtr (memptr *baseptr)
-{
- mmblocktype far *scan,far *last;
-
- last = mmhead;
- scan = last->next;
-
- if (baseptr == mmrover->useptr) // removed the last allocated block
- mmrover = mmhead;
-
- while (scan->useptr != baseptr && scan)
- {
- last = scan;
- scan = scan->next;
- }
-
- if (!scan)
- Quit ("MM_FreePtr: Block not found!");
-
- last->next = scan->next;
-
- FREEBLOCK(scan);
-}
-//==========================================================================
-
-/*
-=====================
-=
-= MM_SetPurge
-=
-= Sets the purge level for a block (locked blocks cannot be made purgable)
-=
-=====================
-*/
-
-void MM_SetPurge (memptr *baseptr, int purge)
-{
- mmblocktype far *start;
-
- start = mmrover;
-
- do
- {
- if (mmrover->useptr == baseptr)
- break;
-
- mmrover = mmrover->next;
-
- if (!mmrover)
- mmrover = mmhead;
- else if (mmrover == start)
- Quit ("MM_SetPurge: Block not found!");
-
- } while (1);
-
- mmrover->attributes &= ~PURGEBITS;
- mmrover->attributes |= purge;
-}
-
-//==========================================================================
-
-/*
-=====================
-=
-= MM_SetLock
-=
-= Locks / unlocks the block
-=
-=====================
-*/
-
-void MM_SetLock (memptr *baseptr, boolean locked)
-{
- mmblocktype far *start;
-
- start = mmrover;
-
- do
- {
- if (mmrover->useptr == baseptr)
- break;
-
- mmrover = mmrover->next;
-
- if (!mmrover)
- mmrover = mmhead;
- else if (mmrover == start)
- Quit ("MM_SetLock: Block not found!");
-
- } while (1);
-
- mmrover->attributes &= ~LOCKBIT;
- mmrover->attributes |= locked*LOCKBIT;
-}
-
-//==========================================================================
-
-/*
-=====================
-=
-= MM_SortMem
-=
-= Throws out all purgable stuff and compresses movable blocks
-=
-=====================
-*/
-
-void MM_SortMem (void)
-{
- mmblocktype far *scan,far *last,far *next;
- unsigned start,length,source,dest;
- int playing;
-
- //
- // lock down a currently playing sound
- //
- playing = SD_SoundPlaying ();
- if (playing)
- {
- switch (SoundMode)
- {
- case sdm_PC:
- playing += STARTPCSOUNDS;
- break;
- case sdm_AdLib:
- playing += STARTADLIBSOUNDS;
- break;
- }
- MM_SetLock(&(memptr)audiosegs[playing],true);
- }
-
-
- SD_StopSound();
-
- if (beforesort)
- beforesort();
-
- scan = mmhead;
-
- last = NULL; // shut up compiler warning
-
- while (scan)
- {
- if (scan->attributes & LOCKBIT)
- {
- //
- // block is locked, so try to pile later blocks right after it
- //
- start = scan->start + scan->length;
- }
- else
- {
- if (scan->attributes & PURGEBITS)
- {
- //
- // throw out the purgable block
- //
- next = scan->next;
- FREEBLOCK(scan);
- last->next = next;
- scan = next;
- continue;
- }
- else
- {
- //
- // push the non purgable block on top of the last moved block
- //
- if (scan->start != start)
- {
- length = scan->length;
- source = scan->start;
- dest = start;
- while (length > 0xf00)
- {
- movedata(source,0,dest,0,0xf00*16);
- length -= 0xf00;
- source += 0xf00;
- dest += 0xf00;
- }
- movedata(source,0,dest,0,length*16);
-
- scan->start = start;
- *(unsigned *)scan->useptr = start;
- }
- start = scan->start + scan->length;
- }
- }
-
- last = scan;
- scan = scan->next; // go to next block
- }
-
- mmrover = mmhead;
-
- if (aftersort)
- aftersort();
-
- if (playing)
- MM_SetLock(&(memptr)audiosegs[playing],false);
-}
-
-
-//==========================================================================
-
-/*
-=====================
-=
-= MM_ShowMemory
-=
-=====================
-*/
-
-void MM_ShowMemory (void)
-{
- mmblocktype far *scan;
- unsigned color,temp,x,y;
- long end,owner;
- char scratch[80],str[10];
-
- temp = bufferofs;
- bufferofs = displayofs;
- scan = mmhead;
-
- end = -1;
-
- while (scan)
- {
- if (scan->attributes & PURGEBITS)
- color = 5; // dark purple = purgable
- else
- color = 9; // medium blue = non purgable
- if (scan->attributes & LOCKBIT)
- color = 12; // red = locked
- if (scan->start<=end)
- Quit ("MM_ShowMemory: Memory block order currupted!");
- end = scan->length-1;
- y = scan->start/320;
- x = scan->start%320;
- VW_Hlin(x,x+end,y,color);
- VW_Plot(x,y,15);
- if (scan->next && scan->next->start > end+1)
- VW_Hlin(x+end+1,x+(scan->next->start-scan->start),y,0); // black = free
-
- scan = scan->next;
- }
-
- VW_FadeIn ();
- IN_Ack();
-
- bufferofs = temp;
-}
-
-//==========================================================================
-
-/*
-=====================
-=
-= MM_DumpData
-=
-=====================
-*/
-
-void MM_DumpData (void)
-{
- mmblocktype far *scan,far *best;
- long lowest,oldlowest;
- unsigned owner;
- char lock,purge;
- FILE *dumpfile;
-
-
- free (nearheap);
- dumpfile = fopen ("MMDUMP.TXT","w");
- if (!dumpfile)
- Quit ("MM_DumpData: Couldn't open MMDUMP.TXT!");
-
- lowest = -1;
- do
- {
- oldlowest = lowest;
- lowest = 0xffff;
-
- scan = mmhead;
- while (scan)
- {
- owner = (unsigned)scan->useptr;
-
- if (owner && owner<lowest && owner > oldlowest)
- {
- best = scan;
- lowest = owner;
- }
-
- scan = scan->next;
- }
-
- if (lowest != 0xffff)
- {
- if (best->attributes & PURGEBITS)
- purge = 'P';
- else
- purge = '-';
- if (best->attributes & LOCKBIT)
- lock = 'L';
- else
- lock = '-';
- fprintf (dumpfile,"0x%p (%c%c) = %u\n"
- ,(unsigned)lowest,lock,purge,best->length);
- }
-
- } while (lowest != 0xffff);
-
- fclose (dumpfile);
- Quit ("MMDUMP.TXT created.");
-}
-
-//==========================================================================
-
-
-/*
-======================
-=
-= MM_UnusedMemory
-=
-= Returns the total free space without purging
-=
-======================
-*/
-
-long MM_UnusedMemory (void)
-{
- unsigned free;
- mmblocktype far *scan;
-
- free = 0;
- scan = mmhead;
-
- while (scan->next)
- {
- free += scan->next->start - (scan->start + scan->length);
- scan = scan->next;
- }
-
- return free*16l;
-}
-
-//==========================================================================
-
-
-/*
-======================
-=
-= MM_TotalFree
-=
-= Returns the total free space with purging
-=
-======================
-*/
-
-long MM_TotalFree (void)
-{
- unsigned free;
- mmblocktype far *scan;
-
- free = 0;
- scan = mmhead;
-
- while (scan->next)
- {
- if ((scan->attributes&PURGEBITS) && !(scan->attributes&LOCKBIT))
- free += scan->length;
- free += scan->next->start - (scan->start + scan->length);
- scan = scan->next;
- }
-
- return free*16l;
-}
-
-//==========================================================================
-
-/*
-=====================
-=
-= MM_BombOnError
-=
-=====================
-*/
-
-void MM_BombOnError (boolean bomb)
-{
- bombonerror = bomb;
-}
-
-
--- a/WOLFSRC/ID_MM.H
+++ /dev/null
@@ -1,96 +1,0 @@
-// ID_MM.H
-
-#ifndef __ID_CA__
-
-#define __ID_CA__
-
-#define SAVENEARHEAP 0x400 // space to leave in data segment
-#define SAVEFARHEAP 0 // space to leave in far heap
-
-#define BUFFERSIZE 0x1000 // miscelanious, allways available buffer
-
-#define MAXBLOCKS 700
-
-
-//--------
-
-#define EMS_INT 0x67
-
-#define EMS_STATUS 0x40
-#define EMS_GETFRAME 0x41
-#define EMS_GETPAGES 0x42
-#define EMS_ALLOCPAGES 0x43
-#define EMS_MAPPAGE 0x44
-#define EMS_FREEPAGES 0x45
-#define EMS_VERSION 0x46
-
-//--------
-
-#define XMS_INT 0x2f
-#define XMS_CALL(v) _AH = (v);\
- asm call [DWORD PTR XMSDriver]
-
-#define XMS_VERSION 0x00
-
-#define XMS_ALLOCHMA 0x01
-#define XMS_FREEHMA 0x02
-
-#define XMS_GENABLEA20 0x03
-#define XMS_GDISABLEA20 0x04
-#define XMS_LENABLEA20 0x05
-#define XMS_LDISABLEA20 0x06
-#define XMS_QUERYA20 0x07
-
-#define XMS_QUERYFREE 0x08
-#define XMS_ALLOC 0x09
-#define XMS_FREE 0x0A
-#define XMS_MOVE 0x0B
-#define XMS_LOCK 0x0C
-#define XMS_UNLOCK 0x0D
-#define XMS_GETINFO 0x0E
-#define XMS_RESIZE 0x0F
-
-#define XMS_ALLOCUMB 0x10
-#define XMS_FREEUMB 0x11
-
-//==========================================================================
-
-typedef void _seg * memptr;
-
-typedef struct
-{
- long nearheap,farheap,EMSmem,XMSmem,mainmem;
-} mminfotype;
-
-//==========================================================================
-
-extern mminfotype mminfo;
-extern memptr bufferseg;
-extern boolean mmerror;
-
-extern void (* beforesort) (void);
-extern void (* aftersort) (void);
-
-//==========================================================================
-
-void MM_Startup (void);
-void MM_Shutdown (void);
-void MM_MapEMS (void);
-
-void MM_GetPtr (memptr *baseptr,unsigned long size);
-void MM_FreePtr (memptr *baseptr);
-
-void MM_SetPurge (memptr *baseptr, int purge);
-void MM_SetLock (memptr *baseptr, boolean locked);
-void MM_SortMem (void);
-
-void MM_ShowMemory (void);
-
-long MM_UnusedMemory (void);
-long MM_TotalFree (void);
-
-void MM_BombOnError (boolean bomb);
-
-void MML_UseSpace (unsigned segstart, unsigned seglength);
-
-#endif
\ No newline at end of file
--- a/WOLFSRC/ID_PM.C
+++ /dev/null
@@ -1,1199 +1,0 @@
-//
-// ID_PM.C
-// Id Engine's Page Manager v1.0
-// Primary coder: Jason Blochowiak
-//
-
-#include "ID_HEADS.H"
-#pragma hdrstop
-
-// Main Mem specific variables
- boolean MainPresent;
- memptr MainMemPages[PMMaxMainMem];
- PMBlockAttr MainMemUsed[PMMaxMainMem];
- int MainPagesAvail;
-
-// EMS specific variables
- boolean EMSPresent;
- word EMSAvail,EMSPagesAvail,EMSHandle,
- EMSPageFrame,EMSPhysicalPage;
- EMSListStruct EMSList[EMSFrameCount];
-
-// XMS specific variables
- boolean XMSPresent;
- word XMSAvail,XMSPagesAvail,XMSHandle;
- longword XMSDriver;
- int XMSProtectPage = -1;
-
-// File specific variables
- char PageFileName[13] = {"VSWAP."};
- int PageFile = -1;
- word ChunksInFile;
- word PMSpriteStart,PMSoundStart;
-
-// General usage variables
- boolean PMStarted,
- PMPanicMode,
- PMThrashing;
- word XMSPagesUsed,
- EMSPagesUsed,
- MainPagesUsed,
- PMNumBlocks;
- long PMFrameCount;
- PageListStruct far *PMPages,
- _seg *PMSegPages;
-
-static char *ParmStrings[] = {"nomain","noems","noxms",nil};
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// EMS Management code
-//
-/////////////////////////////////////////////////////////////////////////////
-
-//
-// PML_MapEMS() - Maps a logical page to a physical page
-//
-void
-PML_MapEMS(word logical,word physical)
-{
- _AL = physical;
- _BX = logical;
- _DX = EMSHandle;
- _AH = EMS_MAPPAGE;
-asm int EMS_INT
-
- if (_AH)
- Quit("PML_MapEMS: Page mapping failed");
-}
-
-//
-// PML_StartupEMS() - Sets up EMS for Page Mgr's use
-// Checks to see if EMS driver is present
-// Verifies that EMS hardware is present
-// Make sure that EMS version is 3.2 or later
-// If there's more than our minimum (2 pages) available, allocate it (up
-// to the maximum we need)
-//
-
- char EMMDriverName[9] = "EMMXXXX0";
-
-boolean
-PML_StartupEMS(void)
-{
- int i;
- long size;
-
- EMSPresent = false; // Assume that we'll fail
- EMSAvail = 0;
-
- _DX = (word)EMMDriverName;
- _AX = 0x3d00;
- geninterrupt(0x21); // try to open EMMXXXX0 device
-asm jnc gothandle
- goto error;
-
-gothandle:
- _BX = _AX;
- _AX = 0x4400;
- geninterrupt(0x21); // get device info
-asm jnc gotinfo;
- goto error;
-
-gotinfo:
-asm and dx,0x80
- if (!_DX)
- goto error;
-
- _AX = 0x4407;
- geninterrupt(0x21); // get status
-asm jc error
- if (!_AL)
- goto error;
-
- _AH = 0x3e;
- geninterrupt(0x21); // close handle
-
- _AH = EMS_STATUS;
- geninterrupt(EMS_INT);
- if (_AH)
- goto error; // make sure EMS hardware is present
-
- _AH = EMS_VERSION;
- geninterrupt(EMS_INT);
- if (_AH || (_AL < 0x32)) // only work on EMS 3.2 or greater (silly, but...)
- goto error;
-
- _AH = EMS_GETFRAME;
- geninterrupt(EMS_INT);
- if (_AH)
- goto error; // find the page frame address
- EMSPageFrame = _BX;
-
- _AH = EMS_GETPAGES;
- geninterrupt(EMS_INT);
- if (_AH)
- goto error;
- if (_BX < 2)
- goto error; // Require at least 2 pages (32k)
- EMSAvail = _BX;
-
- // Don't hog all available EMS
- size = EMSAvail * (long)EMSPageSize;
- if (size - (EMSPageSize * 2) > (ChunksInFile * (long)PMPageSize))
- {
- size = (ChunksInFile * (long)PMPageSize) + EMSPageSize;
- EMSAvail = size / EMSPageSize;
- }
-
- _AH = EMS_ALLOCPAGES;
- _BX = EMSAvail;
- geninterrupt(EMS_INT);
- if (_AH)
- goto error;
- EMSHandle = _DX;
-
- mminfo.EMSmem += EMSAvail * (long)EMSPageSize;
-
- // Initialize EMS mapping cache
- for (i = 0;i < EMSFrameCount;i++)
- EMSList[i].baseEMSPage = -1;
-
- EMSPresent = true; // We have EMS
-
-error:
- return(EMSPresent);
-}
-
-//
-// PML_ShutdownEMS() - If EMS was used, deallocate it
-//
-void
-PML_ShutdownEMS(void)
-{
- if (EMSPresent)
- {
- asm mov ah,EMS_FREEPAGES
- asm mov dx,[EMSHandle]
- asm int EMS_INT
- if (_AH)
- Quit ("PML_ShutdownEMS: Error freeing EMS");
- }
-}
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// XMS Management code
-//
-/////////////////////////////////////////////////////////////////////////////
-
-//
-// PML_StartupXMS() - Starts up XMS for the Page Mgr's use
-// Checks for presence of an XMS driver
-// Makes sure that there's at least a page of XMS available
-// Allocates any remaining XMS (rounded down to the nearest page size)
-//
-boolean
-PML_StartupXMS(void)
-{
- XMSPresent = false; // Assume failure
- XMSAvail = 0;
-
-asm mov ax,0x4300
-asm int XMS_INT // Check for presence of XMS driver
- if (_AL != 0x80)
- goto error;
-
-
-asm mov ax,0x4310
-asm int XMS_INT // Get address of XMS driver
-asm mov [WORD PTR XMSDriver],bx
-asm mov [WORD PTR XMSDriver+2],es // function pointer to XMS driver
-
- XMS_CALL(XMS_QUERYFREE); // Find out how much XMS is available
- XMSAvail = _AX;
- if (!_AX) // AJR: bugfix 10/8/92
- goto error;
-
- XMSAvail &= ~(PMPageSizeKB - 1); // Round off to nearest page size
- if (XMSAvail < (PMPageSizeKB * 2)) // Need at least 2 pages
- goto error;
-
- _DX = XMSAvail;
- XMS_CALL(XMS_ALLOC); // And do the allocation
- XMSHandle = _DX;
-
- if (!_AX) // AJR: bugfix 10/8/92
- {
- XMSAvail = 0;
- goto error;
- }
-
- mminfo.XMSmem += XMSAvail * 1024;
-
- XMSPresent = true;
-error:
- return(XMSPresent);
-}
-
-//
-// PML_XMSCopy() - Copies a main/EMS page to or from XMS
-// Will round an odd-length request up to the next even value
-//
-void
-PML_XMSCopy(boolean toxms,byte far *addr,word xmspage,word length)
-{
- longword xoffset;
- struct
- {
- longword length;
- word source_handle;
- longword source_offset;
- word target_handle;
- longword target_offset;
- } copy;
-
- if (!addr)
- Quit("PML_XMSCopy: zero address");
-
- xoffset = (longword)xmspage * PMPageSize;
-
- copy.length = (length + 1) & ~1;
- copy.source_handle = toxms? 0 : XMSHandle;
- copy.source_offset = toxms? (long)addr : xoffset;
- copy.target_handle = toxms? XMSHandle : 0;
- copy.target_offset = toxms? xoffset : (long)addr;
-
-asm push si
- _SI = (word)©
- XMS_CALL(XMS_MOVE);
-asm pop si
- if (!_AX)
- Quit("PML_XMSCopy: Error on copy");
-}
-
-#if 1
-#define PML_CopyToXMS(s,t,l) PML_XMSCopy(true,(s),(t),(l))
-#define PML_CopyFromXMS(t,s,l) PML_XMSCopy(false,(t),(s),(l))
-#else
-//
-// PML_CopyToXMS() - Copies the specified number of bytes from the real mode
-// segment address to the specified XMS page
-//
-void
-PML_CopyToXMS(byte far *source,int targetpage,word length)
-{
- PML_XMSCopy(true,source,targetpage,length);
-}
-
-//
-// PML_CopyFromXMS() - Copies the specified number of bytes from an XMS
-// page to the specified real mode address
-//
-void
-PML_CopyFromXMS(byte far *target,int sourcepage,word length)
-{
- PML_XMSCopy(false,target,sourcepage,length);
-}
-#endif
-
-//
-// PML_ShutdownXMS()
-//
-void
-PML_ShutdownXMS(void)
-{
- if (XMSPresent)
- {
- _DX = XMSHandle;
- XMS_CALL(XMS_FREE);
- if (_BL)
- Quit("PML_ShutdownXMS: Error freeing XMS");
- }
-}
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Main memory code
-//
-/////////////////////////////////////////////////////////////////////////////
-
-//
-// PM_SetMainMemPurge() - Sets the purge level for all allocated main memory
-// blocks. This shouldn't be called directly - the PM_LockMainMem() and
-// PM_UnlockMainMem() macros should be used instead.
-//
-void
-PM_SetMainMemPurge(int level)
-{
- int i;
-
- for (i = 0;i < PMMaxMainMem;i++)
- if (MainMemPages[i])
- MM_SetPurge(&MainMemPages[i],level);
-}
-
-//
-// PM_CheckMainMem() - If something besides the Page Mgr makes requests of
-// the Memory Mgr, some of the Page Mgr's blocks may have been purged,
-// so this function runs through the block list and checks to see if
-// any of the blocks have been purged. If so, it marks the corresponding
-// page as purged & unlocked, then goes through the block list and
-// tries to reallocate any blocks that have been purged.
-// This routine now calls PM_LockMainMem() to make sure that any allocation
-// attempts made during the block reallocation sweep don't purge any
-// of the other blocks. Because PM_LockMainMem() is called,
-// PM_UnlockMainMem() needs to be called before any other part of the
-// program makes allocation requests of the Memory Mgr.
-//
-void
-PM_CheckMainMem(void)
-{
- boolean allocfailed;
- int i,n;
- memptr *p;
- PMBlockAttr *used;
- PageListStruct far *page;
-
- if (!MainPresent)
- return;
-
- for (i = 0,page = PMPages;i < ChunksInFile;i++,page++)
- {
- n = page->mainPage;
- if (n != -1) // Is the page using main memory?
- {
- if (!MainMemPages[n]) // Yep, was the block purged?
- {
- page->mainPage = -1; // Yes, mark page as purged & unlocked
- page->locked = pml_Unlocked;
- }
- }
- }
-
- // Prevent allocation attempts from purging any of our other blocks
- PM_LockMainMem();
- allocfailed = false;
- for (i = 0,p = MainMemPages,used = MainMemUsed;i < PMMaxMainMem;i++,p++,used++)
- {
- if (!*p) // If the page got purged
- {
- if (*used & pmba_Allocated) // If it was allocated
- {
- *used &= ~pmba_Allocated; // Mark as unallocated
- MainPagesAvail--; // and decrease available count
- }
-
- if (*used & pmba_Used) // If it was used
- {
- *used &= ~pmba_Used; // Mark as unused
- MainPagesUsed--; // and decrease used count
- }
-
- if (!allocfailed)
- {
- MM_BombOnError(false);
- MM_GetPtr(p,PMPageSize); // Try to reallocate
- if (mmerror) // If it failed,
- allocfailed = true; // don't try any more allocations
- else // If it worked,
- {
- *used |= pmba_Allocated; // Mark as allocated
- MainPagesAvail++; // and increase available count
- }
- MM_BombOnError(true);
- }
- }
- }
- if (mmerror)
- mmerror = false;
-}
-
-//
-// PML_StartupMainMem() - Allocates as much main memory as is possible for
-// the Page Mgr. The memory is allocated as non-purgeable, so if it's
-// necessary to make requests of the Memory Mgr, PM_UnlockMainMem()
-// needs to be called.
-//
-void
-PML_StartupMainMem(void)
-{
- int i,n;
- memptr *p;
-
- MainPagesAvail = 0;
- MM_BombOnError(false);
- for (i = 0,p = MainMemPages;i < PMMaxMainMem;i++,p++)
- {
- MM_GetPtr(p,PMPageSize);
- if (mmerror)
- break;
-
- MainPagesAvail++;
- MainMemUsed[i] = pmba_Allocated;
- }
- MM_BombOnError(true);
- if (mmerror)
- mmerror = false;
- if (MainPagesAvail < PMMinMainMem)
- Quit("PM_SetupMainMem: Not enough main memory");
- MainPresent = true;
-}
-
-//
-// PML_ShutdownMainMem() - Frees all of the main memory blocks used by the
-// Page Mgr.
-//
-void
-PML_ShutdownMainMem(void)
-{
- int i;
- memptr *p;
-
- // DEBUG - mark pages as unallocated & decrease page count as appropriate
- for (i = 0,p = MainMemPages;i < PMMaxMainMem;i++,p++)
- if (*p)
- MM_FreePtr(p);
-}
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// File management code
-//
-/////////////////////////////////////////////////////////////////////////////
-
-//
-// PML_ReadFromFile() - Reads some data in from the page file
-//
-void
-PML_ReadFromFile(byte far *buf,long offset,word length)
-{
- if (!buf)
- Quit("PML_ReadFromFile: Null pointer");
- if (!offset)
- Quit("PML_ReadFromFile: Zero offset");
- if (lseek(PageFile,offset,SEEK_SET) != offset)
- Quit("PML_ReadFromFile: Seek failed");
- if (!CA_FarRead(PageFile,buf,length))
- Quit("PML_ReadFromFile: Read failed");
-}
-
-//
-// PML_OpenPageFile() - Opens the page file and sets up the page info
-//
-void
-PML_OpenPageFile(void)
-{
- int i;
- long size;
- void _seg *buf;
- longword far *offsetptr;
- word far *lengthptr;
- PageListStruct far *page;
-
- PageFile = open(PageFileName,O_RDONLY + O_BINARY);
- if (PageFile == -1)
- Quit("PML_OpenPageFile: Unable to open page file");
-
- // Read in header variables
- read(PageFile,&ChunksInFile,sizeof(ChunksInFile));
- read(PageFile,&PMSpriteStart,sizeof(PMSpriteStart));
- read(PageFile,&PMSoundStart,sizeof(PMSoundStart));
-
- // Allocate and clear the page list
- PMNumBlocks = ChunksInFile;
- MM_GetPtr(&(memptr)PMSegPages,sizeof(PageListStruct) * PMNumBlocks);
- MM_SetLock(&(memptr)PMSegPages,true);
- PMPages = (PageListStruct far *)PMSegPages;
- _fmemset(PMPages,0,sizeof(PageListStruct) * PMNumBlocks);
-
- // Read in the chunk offsets
- size = sizeof(longword) * ChunksInFile;
- MM_GetPtr(&buf,size);
- if (!CA_FarRead(PageFile,(byte far *)buf,size))
- Quit("PML_OpenPageFile: Offset read failed");
- offsetptr = (longword far *)buf;
- for (i = 0,page = PMPages;i < ChunksInFile;i++,page++)
- page->offset = *offsetptr++;
- MM_FreePtr(&buf);
-
- // Read in the chunk lengths
- size = sizeof(word) * ChunksInFile;
- MM_GetPtr(&buf,size);
- if (!CA_FarRead(PageFile,(byte far *)buf,size))
- Quit("PML_OpenPageFile: Length read failed");
- lengthptr = (word far *)buf;
- for (i = 0,page = PMPages;i < ChunksInFile;i++,page++)
- page->length = *lengthptr++;
- MM_FreePtr(&buf);
-}
-
-//
-// PML_ClosePageFile() - Closes the page file
-//
-void
-PML_ClosePageFile(void)
-{
- if (PageFile != -1)
- close(PageFile);
- if (PMSegPages)
- {
- MM_SetLock(&(memptr)PMSegPages,false);
- MM_FreePtr(&(void _seg *)PMSegPages);
- }
-}
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Allocation, etc., code
-//
-/////////////////////////////////////////////////////////////////////////////
-
-//
-// PML_GetEMSAddress()
-//
-// Page is in EMS, so figure out which EMS physical page should be used
-// to map our page in. If normal page, use EMS physical page 3, else
-// use the physical page specified by the lock type
-//
-#if 1
-#pragma argsused // DEBUG - remove lock parameter
-memptr
-PML_GetEMSAddress(int page,PMLockType lock)
-{
- int i,emspage;
- word emsoff,emsbase,offset;
-
- emsoff = page & (PMEMSSubPage - 1);
- emsbase = page - emsoff;
-
- emspage = -1;
- // See if this page is already mapped in
- for (i = 0;i < EMSFrameCount;i++)
- {
- if (EMSList[i].baseEMSPage == emsbase)
- {
- emspage = i; // Yep - don't do a redundant remapping
- break;
- }
- }
-
- // If page isn't already mapped in, find LRU EMS frame, and use it
- if (emspage == -1)
- {
- longword last = MAXLONG;
- for (i = 0;i < EMSFrameCount;i++)
- {
- if (EMSList[i].lastHit < last)
- {
- emspage = i;
- last = EMSList[i].lastHit;
- }
- }
-
- EMSList[emspage].baseEMSPage = emsbase;
- PML_MapEMS(page / PMEMSSubPage,emspage);
- }
-
- if (emspage == -1)
- Quit("PML_GetEMSAddress: EMS find failed");
-
- EMSList[emspage].lastHit = PMFrameCount;
- offset = emspage * EMSPageSizeSeg;
- offset += emsoff * PMPageSizeSeg;
- return((memptr)(EMSPageFrame + offset));
-}
-#else
-memptr
-PML_GetEMSAddress(int page,PMLockType lock)
-{
- word emspage;
-
- emspage = (lock < pml_EMSLock)? 3 : (lock - pml_EMSLock);
-
- PML_MapEMS(page / PMEMSSubPage,emspage);
-
- return((memptr)(EMSPageFrame + (emspage * EMSPageSizeSeg)
- + ((page & (PMEMSSubPage - 1)) * PMPageSizeSeg)));
-}
-#endif
-
-//
-// PM_GetPageAddress() - Returns the address of a given page
-// Maps in EMS if necessary
-// Returns nil if block isn't cached into Main Memory or EMS
-//
-//
-memptr
-PM_GetPageAddress(int pagenum)
-{
- PageListStruct far *page;
-
- page = &PMPages[pagenum];
- if (page->mainPage != -1)
- return(MainMemPages[page->mainPage]);
- else if (page->emsPage != -1)
- return(PML_GetEMSAddress(page->emsPage,page->locked));
- else
- return(nil);
-}
-
-//
-// PML_GiveLRUPage() - Returns the page # of the least recently used
-// present & unlocked main/EMS page (or main page if mainonly is true)
-//
-int
-PML_GiveLRUPage(boolean mainonly)
-{
- int i,lru;
- long last;
- PageListStruct far *page;
-
- for (i = 0,page = PMPages,lru = -1,last = MAXLONG;i < ChunksInFile;i++,page++)
- {
- if
- (
- (page->lastHit < last)
- && ((page->emsPage != -1) || (page->mainPage != -1))
- && (page->locked == pml_Unlocked)
- && (!(mainonly && (page->mainPage == -1)))
- )
- {
- last = page->lastHit;
- lru = i;
- }
- }
-
- if (lru == -1)
- Quit("PML_GiveLRUPage: LRU Search failed");
- return(lru);
-}
-
-//
-// PML_GiveLRUXMSPage() - Returns the page # of the least recently used
-// (and present) XMS page.
-// This routine won't return the XMS page protected (by XMSProtectPage)
-//
-int
-PML_GiveLRUXMSPage(void)
-{
- int i,lru;
- long last;
- PageListStruct far *page;
-
- for (i = 0,page = PMPages,lru = -1,last = MAXLONG;i < ChunksInFile;i++,page++)
- {
- if
- (
- (page->xmsPage != -1)
- && (page->lastHit < last)
- && (i != XMSProtectPage)
- )
- {
- last = page->lastHit;
- lru = i;
- }
- }
- return(lru);
-}
-
-//
-// PML_PutPageInXMS() - If page isn't in XMS, find LRU XMS page and replace
-// it with the main/EMS page
-//
-void
-PML_PutPageInXMS(int pagenum)
-{
- int usexms;
- PageListStruct far *page;
-
- if (!XMSPresent)
- return;
-
- page = &PMPages[pagenum];
- if (page->xmsPage != -1)
- return; // Already in XMS
-
- if (XMSPagesUsed < XMSPagesAvail)
- page->xmsPage = XMSPagesUsed++;
- else
- {
- usexms = PML_GiveLRUXMSPage();
- if (usexms == -1)
- Quit("PML_PutPageInXMS: No XMS LRU");
- page->xmsPage = PMPages[usexms].xmsPage;
- PMPages[usexms].xmsPage = -1;
- }
- PML_CopyToXMS(PM_GetPageAddress(pagenum),page->xmsPage,page->length);
-}
-
-//
-// PML_TransferPageSpace() - A page is being replaced, so give the new page
-// the old one's address space. Returns the address of the new page.
-//
-memptr
-PML_TransferPageSpace(int orig,int new)
-{
- memptr addr;
- PageListStruct far *origpage,far *newpage;
-
- if (orig == new)
- Quit("PML_TransferPageSpace: Identity replacement");
-
- origpage = &PMPages[orig];
- newpage = &PMPages[new];
-
- if (origpage->locked != pml_Unlocked)
- Quit("PML_TransferPageSpace: Killing locked page");
-
- if ((origpage->emsPage == -1) && (origpage->mainPage == -1))
- Quit("PML_TransferPageSpace: Reusing non-existent page");
-
- // Copy page that's about to be purged into XMS
- PML_PutPageInXMS(orig);
-
- // Get the address, and force EMS into a physical page if necessary
- addr = PM_GetPageAddress(orig);
-
- // Steal the address
- newpage->emsPage = origpage->emsPage;
- newpage->mainPage = origpage->mainPage;
-
- // Mark replaced page as purged
- origpage->mainPage = origpage->emsPage = -1;
-
- if (!addr)
- Quit("PML_TransferPageSpace: Zero replacement");
-
- return(addr);
-}
-
-//
-// PML_GetAPageBuffer() - A page buffer is needed. Either get it from the
-// main/EMS free pool, or use PML_GiveLRUPage() to find which page to
-// steal the buffer from. Returns a far pointer to the page buffer, and
-// sets the fields inside the given page structure appropriately.
-// If mainonly is true, free EMS will be ignored, and only main pages
-// will be looked at by PML_GiveLRUPage().
-//
-byte far *
-PML_GetAPageBuffer(int pagenum,boolean mainonly)
-{
- byte far *addr = nil;
- int i,n;
- PMBlockAttr *used;
- PageListStruct far *page;
-
- page = &PMPages[pagenum];
- if ((EMSPagesUsed < EMSPagesAvail) && !mainonly)
- {
- // There's remaining EMS - use it
- page->emsPage = EMSPagesUsed++;
- addr = PML_GetEMSAddress(page->emsPage,page->locked);
- }
- else if (MainPagesUsed < MainPagesAvail)
- {
- // There's remaining main memory - use it
- for (i = 0,n = -1,used = MainMemUsed;i < PMMaxMainMem;i++,used++)
- {
- if ((*used & pmba_Allocated) && !(*used & pmba_Used))
- {
- n = i;
- *used |= pmba_Used;
- break;
- }
- }
- if (n == -1)
- Quit("PML_GetPageBuffer: MainPagesAvail lied");
- addr = MainMemPages[n];
- if (!addr)
- Quit("PML_GetPageBuffer: Purged main block");
- page->mainPage = n;
- MainPagesUsed++;
- }
- else
- addr = PML_TransferPageSpace(PML_GiveLRUPage(mainonly),pagenum);
-
- if (!addr)
- Quit("PML_GetPageBuffer: Search failed");
- return(addr);
-}
-
-//
-// PML_GetPageFromXMS() - If page is in XMS, find LRU main/EMS page and
-// replace it with the page from XMS. If mainonly is true, will only
-// search for LRU main page.
-// XMSProtectPage is set to the page to be retrieved from XMS, so that if
-// the page from which we're stealing the main/EMS from isn't in XMS,
-// it won't copy over the page that we're trying to get from XMS.
-// (pages that are being purged are copied into XMS, if possible)
-//
-memptr
-PML_GetPageFromXMS(int pagenum,boolean mainonly)
-{
- byte far *checkaddr;
- memptr addr = nil;
- PageListStruct far *page;
-
- page = &PMPages[pagenum];
- if (XMSPresent && (page->xmsPage != -1))
- {
- XMSProtectPage = pagenum;
- checkaddr = PML_GetAPageBuffer(pagenum,mainonly);
- if (FP_OFF(checkaddr))
- Quit("PML_GetPageFromXMS: Non segment pointer");
- addr = (memptr)FP_SEG(checkaddr);
- PML_CopyFromXMS(addr,page->xmsPage,page->length);
- XMSProtectPage = -1;
- }
-
- return(addr);
-}
-
-//
-// PML_LoadPage() - A page is not in main/EMS memory, and it's not in XMS.
-// Load it into either main or EMS. If mainonly is true, the page will
-// only be loaded into main.
-//
-void
-PML_LoadPage(int pagenum,boolean mainonly)
-{
- byte far *addr;
- PageListStruct far *page;
-
- addr = PML_GetAPageBuffer(pagenum,mainonly);
- page = &PMPages[pagenum];
- PML_ReadFromFile(addr,page->offset,page->length);
-}
-
-//
-// PM_GetPage() - Returns the address of the page, loading it if necessary
-// First, check if in Main Memory or EMS
-// Then, check XMS
-// If not in XMS, load into Main Memory or EMS
-//
-#pragma warn -pia
-memptr
-PM_GetPage(int pagenum)
-{
- memptr result;
-
- if (pagenum >= ChunksInFile)
- Quit("PM_GetPage: Invalid page request");
-
-#if 0 // for debugging
-asm mov dx,STATUS_REGISTER_1
-asm in al,dx
-asm mov dx,ATR_INDEX
-asm mov al,ATR_OVERSCAN
-asm out dx,al
-asm mov al,10 // bright green
-asm out dx,al
-#endif
-
- if (!(result = PM_GetPageAddress(pagenum)))
- {
- boolean mainonly = (pagenum >= PMSoundStart);
-if (!PMPages[pagenum].offset) // JDC: sparse page
- Quit ("Tried to load a sparse page!");
- if (!(result = PML_GetPageFromXMS(pagenum,mainonly)))
- {
- if (PMPages[pagenum].lastHit == PMFrameCount)
- PMThrashing++;
-
- PML_LoadPage(pagenum,mainonly);
- result = PM_GetPageAddress(pagenum);
- }
- }
- PMPages[pagenum].lastHit = PMFrameCount;
-
-#if 0 // for debugging
-asm mov dx,STATUS_REGISTER_1
-asm in al,dx
-asm mov dx,ATR_INDEX
-asm mov al,ATR_OVERSCAN
-asm out dx,al
-asm mov al,3 // blue
-asm out dx,al
-asm mov al,0x20 // normal
-asm out dx,al
-#endif
-
- return(result);
-}
-#pragma warn +pia
-
-//
-// PM_SetPageLock() - Sets the lock type on a given page
-// pml_Unlocked: Normal, page can be purged
-// pml_Locked: Cannot be purged
-// pml_EMS?: Same as pml_Locked, but if in EMS, use the physical page
-// specified when returning the address. For sound stuff.
-//
-void
-PM_SetPageLock(int pagenum,PMLockType lock)
-{
- if (pagenum < PMSoundStart)
- Quit("PM_SetPageLock: Locking/unlocking non-sound page");
-
- PMPages[pagenum].locked = lock;
-}
-
-//
-// PM_Preload() - Loads as many pages as possible into all types of memory.
-// Calls the update function after each load, indicating the current
-// page, and the total pages that need to be loaded (for thermometer).
-//
-void
-PM_Preload(boolean (*update)(word current,word total))
-{
- int i,j,
- page,oogypage;
- word current,total,
- totalnonxms,totalxms,
- mainfree,maintotal,
- emsfree,emstotal,
- xmsfree,xmstotal;
- memptr addr;
- PageListStruct far *p;
-
- mainfree = (MainPagesAvail - MainPagesUsed) + (EMSPagesAvail - EMSPagesUsed);
- xmsfree = (XMSPagesAvail - XMSPagesUsed);
-
- xmstotal = maintotal = 0;
-
- for (i = 0;i < ChunksInFile;i++)
- {
- if (!PMPages[i].offset)
- continue; // sparse
-
- if ( PMPages[i].emsPage != -1 || PMPages[i].mainPage != -1 )
- continue; // already in main mem
-
- if ( mainfree )
- {
- maintotal++;
- mainfree--;
- }
- else if ( xmsfree && (PMPages[i].xmsPage == -1) )
- {
- xmstotal++;
- xmsfree--;
- }
- }
-
-
- total = maintotal + xmstotal;
-
- if (!total)
- return;
-
- page = 0;
- current = 0;
-
-//
-// cache main/ems blocks
-//
- while (maintotal)
- {
- while ( !PMPages[page].offset || PMPages[page].mainPage != -1
- || PMPages[page].emsPage != -1 )
- page++;
-
- if (page >= ChunksInFile)
- Quit ("PM_Preload: Pages>=ChunksInFile");
-
- PM_GetPage(page);
-
- page++;
- current++;
- maintotal--;
- update(current,total);
- }
-
-//
-// load stuff to XMS
-//
- if (xmstotal)
- {
- for (oogypage = 0 ; PMPages[oogypage].mainPage == -1 ; oogypage++)
- ;
- addr = PM_GetPage(oogypage);
- if (!addr)
- Quit("PM_Preload: XMS buffer failed");
-
- while (xmstotal)
- {
- while ( !PMPages[page].offset || PMPages[page].xmsPage != -1 )
- page++;
-
- if (page >= ChunksInFile)
- Quit ("PM_Preload: Pages>=ChunksInFile");
-
- p = &PMPages[page];
-
- p->xmsPage = XMSPagesUsed++;
- if (XMSPagesUsed > XMSPagesAvail)
- Quit("PM_Preload: Exceeded XMS pages");
- if (p->length > PMPageSize)
- Quit("PM_Preload: Page too long");
-
- PML_ReadFromFile((byte far *)addr,p->offset,p->length);
- PML_CopyToXMS((byte far *)addr,p->xmsPage,p->length);
-
- page++;
- current++;
- xmstotal--;
- update(current,total);
- }
-
- p = &PMPages[oogypage];
- PML_ReadFromFile((byte far *)addr,p->offset,p->length);
- }
-
- update(total,total);
-}
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// General code
-//
-/////////////////////////////////////////////////////////////////////////////
-
-//
-// PM_NextFrame() - Increments the frame counter and adjusts the thrash
-// avoidence variables
-//
-// If currently in panic mode (to avoid thrashing), check to see if the
-// appropriate number of frames have passed since the last time that
-// we would have thrashed. If so, take us out of panic mode.
-//
-//
-void
-PM_NextFrame(void)
-{
- int i;
-
- // Frame count overrun - kill the LRU hit entries & reset frame count
- if (++PMFrameCount >= MAXLONG - 4)
- {
- for (i = 0;i < PMNumBlocks;i++)
- PMPages[i].lastHit = 0;
- PMFrameCount = 0;
- }
-
-#if 0
- for (i = 0;i < PMSoundStart;i++)
- {
- if (PMPages[i].locked)
- {
- char buf[40];
- sprintf(buf,"PM_NextFrame: Page %d is locked",i);
- Quit(buf);
- }
- }
-#endif
-
- if (PMPanicMode)
- {
- // DEBUG - set border color
- if ((!PMThrashing) && (!--PMPanicMode))
- {
- // DEBUG - reset border color
- }
- }
- if (PMThrashing >= PMThrashThreshold)
- PMPanicMode = PMUnThrashThreshold;
- PMThrashing = false;
-}
-
-//
-// PM_Reset() - Sets up caching structures
-//
-void
-PM_Reset(void)
-{
- int i;
- PageListStruct far *page;
-
- XMSPagesAvail = XMSAvail / PMPageSizeKB;
-
- EMSPagesAvail = EMSAvail * (EMSPageSizeKB / PMPageSizeKB);
- EMSPhysicalPage = 0;
-
- MainPagesUsed = EMSPagesUsed = XMSPagesUsed = 0;
-
- PMPanicMode = false;
-
- // Initialize page list
- for (i = 0,page = PMPages;i < PMNumBlocks;i++,page++)
- {
- page->mainPage = -1;
- page->emsPage = -1;
- page->xmsPage = -1;
- page->locked = false;
- }
-}
-
-//
-// PM_Startup() - Start up the Page Mgr
-//
-void
-PM_Startup(void)
-{
- boolean nomain,noems,noxms;
- int i;
-
- if (PMStarted)
- return;
-
- nomain = noems = noxms = false;
- for (i = 1;i < _argc;i++)
- {
- switch (US_CheckParm(_argv[i],ParmStrings))
- {
- case 0:
- nomain = true;
- break;
- case 1:
- noems = true;
- break;
- case 2:
- noxms = true;
- break;
- }
- }
-
- PML_OpenPageFile();
-
- if (!noems)
- PML_StartupEMS();
- if (!noxms)
- PML_StartupXMS();
-
- if (nomain && !EMSPresent)
- Quit("PM_Startup: No main or EMS");
- else
- PML_StartupMainMem();
-
- PM_Reset();
-
- PMStarted = true;
-}
-
-//
-// PM_Shutdown() - Shut down the Page Mgr
-//
-void
-PM_Shutdown(void)
-{
- PML_ShutdownXMS();
- PML_ShutdownEMS();
-
- if (!PMStarted)
- return;
-
- PML_ClosePageFile();
-
- PML_ShutdownMainMem();
-}
--- a/WOLFSRC/ID_PM.H
+++ /dev/null
@@ -1,83 +1,0 @@
-//
-// ID_PM.H
-// Header file for Id Engine's Page Manager
-//
-
-// NOTE! PMPageSize must be an even divisor of EMSPageSize, and >= 1024
-#define EMSPageSize 16384
-#define EMSPageSizeSeg (EMSPageSize >> 4)
-#define EMSPageSizeKB (EMSPageSize >> 10)
-#define EMSFrameCount 4
-#define PMPageSize 4096
-#define PMPageSizeSeg (PMPageSize >> 4)
-#define PMPageSizeKB (PMPageSize >> 10)
-#define PMEMSSubPage (EMSPageSize / PMPageSize)
-
-#define PMMinMainMem 10 // Min acceptable # of pages from main
-#define PMMaxMainMem 100 // Max number of pages in main memory
-
-#define PMThrashThreshold 1 // Number of page thrashes before panic mode
-#define PMUnThrashThreshold 5 // Number of non-thrashing frames before leaving panic mode
-
-typedef enum
- {
- pml_Unlocked,
- pml_Locked
- } PMLockType;
-
-typedef enum
- {
- pmba_Unused = 0,
- pmba_Used = 1,
- pmba_Allocated = 2
- } PMBlockAttr;
-
-typedef struct
- {
- longword offset; // Offset of chunk into file
- word length; // Length of the chunk
-
- int xmsPage; // If in XMS, (xmsPage * PMPageSize) gives offset into XMS handle
-
- PMLockType locked; // If set, this page can't be purged
- int emsPage; // If in EMS, logical page/offset into page
- int mainPage; // If in Main, index into handle array
-
- longword lastHit; // Last frame number of hit
- } PageListStruct;
-
-typedef struct
- {
- int baseEMSPage; // Base EMS page for this phys frame
- longword lastHit; // Last frame number of hit
- } EMSListStruct;
-
-extern boolean XMSPresent,EMSPresent;
-extern word XMSPagesAvail,EMSPagesAvail;
-
-extern word ChunksInFile,
- PMSpriteStart,PMSoundStart;
-extern PageListStruct far *PMPages;
-
-#define PM_GetSoundPage(v) PM_GetPage(PMSoundStart + (v))
-#define PM_GetSpritePage(v) PM_GetPage(PMSpriteStart + (v))
-
-#define PM_LockMainMem() PM_SetMainMemPurge(0)
-#define PM_UnlockMainMem() PM_SetMainMemPurge(3)
-
-
-extern char PageFileName[13];
-
-
-extern void PM_Startup(void),
- PM_Shutdown(void),
- PM_Reset(void),
- PM_Preload(boolean (*update)(word current,word total)),
- PM_NextFrame(void),
- PM_SetPageLock(int pagenum,PMLockType lock),
- PM_SetMainPurge(int level),
- PM_CheckMainMem(void);
-extern memptr PM_GetPageAddress(int pagenum),
- PM_GetPage(int pagenum); // Use this one to cache page
-
-void PM_SetMainMemPurge(int level);
--- a/WOLFSRC/ID_SD.C
+++ /dev/null
@@ -1,2367 +1,0 @@
-//
-// ID Engine
-// ID_SD.c - Sound Manager for Wolfenstein 3D
-// v1.2
-// By Jason Blochowiak
-//
-
-//
-// This module handles dealing with generating sound on the appropriate
-// hardware
-//
-// Depends on: User Mgr (for parm checking)
-//
-// Globals:
-// For User Mgr:
-// SoundSourcePresent - Sound Source thingie present?
-// SoundBlasterPresent - SoundBlaster card present?
-// AdLibPresent - AdLib card present?
-// SoundMode - What device is used for sound effects
-// (Use SM_SetSoundMode() to set)
-// MusicMode - What device is used for music
-// (Use SM_SetMusicMode() to set)
-// DigiMode - What device is used for digitized sound effects
-// (Use SM_SetDigiDevice() to set)
-//
-// For Cache Mgr:
-// NeedsDigitized - load digitized sounds?
-// NeedsMusic - load music?
-//
-
-#pragma hdrstop // Wierdo thing with MUSE
-
-#include <dos.h>
-
-#ifdef _MUSE_ // Will be defined in ID_Types.h
-#include "ID_SD.h"
-#else
-#include "ID_HEADS.H"
-#endif
-#pragma hdrstop
-#pragma warn -pia
-
-#ifdef nil
-#undef nil
-#endif
-#define nil 0
-
-#define SDL_SoundFinished() {SoundNumber = SoundPriority = 0;}
-
-// Macros for SoundBlaster stuff
-#define sbOut(n,b) outportb((n) + sbLocation,b)
-#define sbIn(n) inportb((n) + sbLocation)
-#define sbWriteDelay() while (sbIn(sbWriteStat) & 0x80);
-#define sbReadDelay() while (sbIn(sbDataAvail) & 0x80);
-
-// Macros for AdLib stuff
-#define selreg(n) outportb(alFMAddr,n)
-#define writereg(n) outportb(alFMData,n)
-#define readstat() inportb(alFMStatus)
-
-// Imports from ID_SD_A.ASM
-extern void SDL_SetDS(void),
- SDL_IndicatePC(boolean on);
-extern void interrupt SDL_t0ExtremeAsmService(void),
- SDL_t0FastAsmService(void),
- SDL_t0SlowAsmService(void);
-
-// Global variables
- boolean SoundSourcePresent,
- AdLibPresent,
- SoundBlasterPresent,SBProPresent,
- NeedsDigitized,NeedsMusic,
- SoundPositioned;
- SDMode SoundMode;
- SMMode MusicMode;
- SDSMode DigiMode;
- longword TimeCount;
- word HackCount;
- word *SoundTable; // Really * _seg *SoundTable, but that don't work
- boolean ssIsTandy;
- word ssPort = 2;
- int DigiMap[LASTSOUND];
-
-// Internal variables
-static boolean SD_Started;
- boolean nextsoundpos;
- longword TimerDivisor,TimerCount;
-static char *ParmStrings[] =
- {
- "noal",
- "nosb",
- "nopro",
- "noss",
- "sst",
- "ss1",
- "ss2",
- "ss3",
- nil
- };
-static void (*SoundUserHook)(void);
- soundnames SoundNumber,DigiNumber;
- word SoundPriority,DigiPriority;
- int LeftPosition,RightPosition;
- void interrupt (*t0OldService)(void);
- long LocalTime;
- word TimerRate;
-
- word NumDigi,DigiLeft,DigiPage;
- word _seg *DigiList;
- word DigiLastStart,DigiLastEnd;
- boolean DigiPlaying;
-static boolean DigiMissed,DigiLastSegment;
-static memptr DigiNextAddr;
-static word DigiNextLen;
-
-// SoundBlaster variables
-static boolean sbNoCheck,sbNoProCheck;
-static volatile boolean sbSamplePlaying;
-static byte sbOldIntMask = -1;
-static volatile byte huge *sbNextSegPtr;
-static byte sbDMA = 1,
- sbDMAa1 = 0x83,sbDMAa2 = 2,sbDMAa3 = 3,
- sba1Vals[] = {0x87,0x83,0,0x82},
- sba2Vals[] = {0,2,0,6},
- sba3Vals[] = {1,3,0,7};
-static int sbLocation = -1,sbInterrupt = 7,sbIntVec = 0xf,
- sbIntVectors[] = {-1,-1,0xa,0xb,-1,0xd,-1,0xf,-1,-1,-1};
-static volatile longword sbNextSegLen;
-static volatile SampledSound huge *sbSamples;
-static void interrupt (*sbOldIntHand)(void);
-static byte sbpOldFMMix,sbpOldVOCMix;
-
-// SoundSource variables
- boolean ssNoCheck;
- boolean ssActive;
- word ssControl,ssStatus,ssData;
- byte ssOn,ssOff;
- volatile byte far *ssSample;
- volatile longword ssLengthLeft;
-
-// PC Sound variables
- volatile byte pcLastSample,far *pcSound;
- longword pcLengthLeft;
- word pcSoundLookup[255];
-
-// AdLib variables
- boolean alNoCheck;
- byte far *alSound;
- word alBlock;
- longword alLengthLeft;
- longword alTimeCount;
- Instrument alZeroInst;
-
-// This table maps channel numbers to carrier and modulator op cells
-static byte carriers[9] = { 3, 4, 5,11,12,13,19,20,21},
- modifiers[9] = { 0, 1, 2, 8, 9,10,16,17,18},
-// This table maps percussive voice numbers to op cells
- pcarriers[5] = {19,0xff,0xff,0xff,0xff},
- pmodifiers[5] = {16,17,18,20,21};
-
-// Sequencer variables
- boolean sqActive;
-static word alFXReg;
-static ActiveTrack *tracks[sqMaxTracks],
- mytracks[sqMaxTracks];
-static word sqMode,sqFadeStep;
- word far *sqHack,far *sqHackPtr,sqHackLen,sqHackSeqLen;
- long sqHackTime;
-
-// Internal routines
- void SDL_DigitizedDone(void);
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_SetTimer0() - Sets system timer 0 to the specified speed
-//
-///////////////////////////////////////////////////////////////////////////
-#pragma argsused
-static void
-SDL_SetTimer0(word speed)
-{
-#ifndef TPROF // If using Borland's profiling, don't screw with the timer
-asm pushf
-asm cli
-
- outportb(0x43,0x36); // Change timer 0
- outportb(0x40,speed);
- outportb(0x40,speed >> 8);
- // Kludge to handle special case for digitized PC sounds
- if (TimerDivisor == (1192030 / (TickBase * 100)))
- TimerDivisor = (1192030 / (TickBase * 10));
- else
- TimerDivisor = speed;
-
-asm popf
-#else
- TimerDivisor = 0x10000;
-#endif
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_SetIntsPerSec() - Uses SDL_SetTimer0() to set the number of
-// interrupts generated by system timer 0 per second
-//
-///////////////////////////////////////////////////////////////////////////
-static void
-SDL_SetIntsPerSec(word ints)
-{
- TimerRate = ints;
- SDL_SetTimer0(1192030 / ints);
-}
-
-static void
-SDL_SetTimerSpeed(void)
-{
- word rate;
- void interrupt (*isr)(void);
-
- if ((DigiMode == sds_PC) && DigiPlaying)
- {
- rate = TickBase * 100;
- isr = SDL_t0ExtremeAsmService;
- }
- else if
- (
- (MusicMode == smm_AdLib)
- || ((DigiMode == sds_SoundSource) && DigiPlaying)
- )
- {
- rate = TickBase * 10;
- isr = SDL_t0FastAsmService;
- }
- else
- {
- rate = TickBase * 2;
- isr = SDL_t0SlowAsmService;
- }
-
- if (rate != TimerRate)
- {
- setvect(8,isr);
- SDL_SetIntsPerSec(rate);
- TimerRate = rate;
- }
-}
-
-//
-// SoundBlaster code
-//
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_SBStopSample() - Stops any active sampled sound and causes DMA
-// requests from the SoundBlaster to cease
-//
-///////////////////////////////////////////////////////////////////////////
-#ifdef _MUSE_
-void
-#else
-static void
-#endif
-SDL_SBStopSample(void)
-{
- byte is;
-
-asm pushf
-asm cli
-
- if (sbSamplePlaying)
- {
- sbSamplePlaying = false;
-
- sbWriteDelay();
- sbOut(sbWriteCmd,0xd0); // Turn off DSP DMA
-
- is = inportb(0x21); // Restore interrupt mask bit
- if (sbOldIntMask & (1 << sbInterrupt))
- is |= (1 << sbInterrupt);
- else
- is &= ~(1 << sbInterrupt);
- outportb(0x21,is);
- }
-
-asm popf
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_SBPlaySeg() - Plays a chunk of sampled sound on the SoundBlaster
-// Insures that the chunk doesn't cross a bank boundary, programs the DMA
-// controller, and tells the SB to start doing DMA requests for DAC
-//
-///////////////////////////////////////////////////////////////////////////
-static longword
-SDL_SBPlaySeg(volatile byte huge *data,longword length)
-{
- unsigned datapage;
- longword dataofs,uselen;
-
- uselen = length;
- datapage = FP_SEG(data) >> 12;
- dataofs = ((FP_SEG(data) & 0xfff) << 4) + FP_OFF(data);
- if (dataofs >= 0x10000)
- {
- datapage++;
- dataofs -= 0x10000;
- }
-
- if (dataofs + uselen > 0x10000)
- uselen = 0x10000 - dataofs;
-
- uselen--;
-
- // Program the DMA controller
-asm pushf
-asm cli
- outportb(0x0a,sbDMA | 4); // Mask off DMA on channel sbDMA
- outportb(0x0c,0); // Clear byte ptr flip-flop to lower byte
- outportb(0x0b,0x49); // Set transfer mode for D/A conv
- outportb(sbDMAa2,(byte)dataofs); // Give LSB of address
- outportb(sbDMAa2,(byte)(dataofs >> 8)); // Give MSB of address
- outportb(sbDMAa1,(byte)datapage); // Give page of address
- outportb(sbDMAa3,(byte)uselen); // Give LSB of length
- outportb(sbDMAa3,(byte)(uselen >> 8)); // Give MSB of length
- outportb(0x0a,sbDMA); // Re-enable DMA on channel sbDMA
-
- // Start playing the thing
- sbWriteDelay();
- sbOut(sbWriteCmd,0x14);
- sbWriteDelay();
- sbOut(sbWriteData,(byte)uselen);
- sbWriteDelay();
- sbOut(sbWriteData,(byte)(uselen >> 8));
-asm popf
-
- return(uselen + 1);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_SBService() - Services the SoundBlaster DMA interrupt
-//
-///////////////////////////////////////////////////////////////////////////
-static void interrupt
-SDL_SBService(void)
-{
- longword used;
-
- sbIn(sbDataAvail); // Ack interrupt to SB
-
- if (sbNextSegPtr)
- {
- used = SDL_SBPlaySeg(sbNextSegPtr,sbNextSegLen);
- if (sbNextSegLen <= used)
- sbNextSegPtr = nil;
- else
- {
- sbNextSegPtr += used;
- sbNextSegLen -= used;
- }
- }
- else
- {
- SDL_SBStopSample();
- SDL_DigitizedDone();
- }
-
- outportb(0x20,0x20); // Ack interrupt
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_SBPlaySample() - Plays a sampled sound on the SoundBlaster. Sets up
-// DMA to play the sound
-//
-///////////////////////////////////////////////////////////////////////////
-#ifdef _MUSE_
-void
-#else
-static void
-#endif
-SDL_SBPlaySample(byte huge *data,longword len)
-{
- longword used;
-
- SDL_SBStopSample();
-
-asm pushf
-asm cli
-
- used = SDL_SBPlaySeg(data,len);
- if (len <= used)
- sbNextSegPtr = nil;
- else
- {
- sbNextSegPtr = data + used;
- sbNextSegLen = len - used;
- }
-
- // Save old interrupt status and unmask ours
- sbOldIntMask = inportb(0x21);
- outportb(0x21,sbOldIntMask & ~(1 << sbInterrupt));
-
- sbWriteDelay();
- sbOut(sbWriteCmd,0xd4); // Make sure DSP DMA is enabled
-
- sbSamplePlaying = true;
-
-asm popf
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_PositionSBP() - Sets the attenuation levels for the left and right
-// channels by using the mixer chip on the SB Pro. This hits a hole in
-// the address map for normal SBs.
-//
-///////////////////////////////////////////////////////////////////////////
-static void
-SDL_PositionSBP(int leftpos,int rightpos)
-{
- byte v;
-
- if (!SBProPresent)
- return;
-
- leftpos = 15 - leftpos;
- rightpos = 15 - rightpos;
- v = ((leftpos & 0x0f) << 4) | (rightpos & 0x0f);
-
-asm pushf
-asm cli
-
- sbOut(sbpMixerAddr,sbpmVoiceVol);
- sbOut(sbpMixerData,v);
-
-asm popf
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_CheckSB() - Checks to see if a SoundBlaster resides at a
-// particular I/O location
-//
-///////////////////////////////////////////////////////////////////////////
-static boolean
-SDL_CheckSB(int port)
-{
- int i;
-
- sbLocation = port << 4; // Initialize stuff for later use
-
- sbOut(sbReset,true); // Reset the SoundBlaster DSP
-asm mov dx,0x388 // Wait >4usec
-asm in al, dx
-asm in al, dx
-asm in al, dx
-asm in al, dx
-asm in al, dx
-asm in al, dx
-asm in al, dx
-asm in al, dx
-asm in al, dx
-
- sbOut(sbReset,false); // Turn off sb DSP reset
-asm mov dx,0x388 // Wait >100usec
-asm mov cx,100
-usecloop:
-asm in al,dx
-asm loop usecloop
-
- for (i = 0;i < 100;i++)
- {
- if (sbIn(sbDataAvail) & 0x80) // If data is available...
- {
- if (sbIn(sbReadData) == 0xaa) // If it matches correct value
- return(true);
- else
- {
- sbLocation = -1; // Otherwise not a SoundBlaster
- return(false);
- }
- }
- }
- sbLocation = -1; // Retry count exceeded - fail
- return(false);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// Checks to see if a SoundBlaster is in the system. If the port passed is
-// -1, then it scans through all possible I/O locations. If the port
-// passed is 0, then it uses the default (2). If the port is >0, then
-// it just passes it directly to SDL_CheckSB()
-//
-///////////////////////////////////////////////////////////////////////////
-static boolean
-SDL_DetectSoundBlaster(int port)
-{
- int i;
-
- if (port == 0) // If user specifies default, use 2
- port = 2;
- if (port == -1)
- {
- if (SDL_CheckSB(2)) // Check default before scanning
- return(true);
-
- if (SDL_CheckSB(4)) // Check other SB Pro location before scan
- return(true);
-
- for (i = 1;i <= 6;i++) // Scan through possible SB locations
- {
- if ((i == 2) || (i == 4))
- continue;
-
- if (SDL_CheckSB(i)) // If found at this address,
- return(true); // return success
- }
- return(false); // All addresses failed, return failure
- }
- else
- return(SDL_CheckSB(port)); // User specified address or default
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_SBSetDMA() - Sets the DMA channel to be used by the SoundBlaster
-// code. Sets up sbDMA, and sbDMAa1-sbDMAa3 (used by SDL_SBPlaySeg()).
-//
-///////////////////////////////////////////////////////////////////////////
-void
-SDL_SBSetDMA(byte channel)
-{
- if (channel > 3)
- Quit("SDL_SBSetDMA() - invalid SoundBlaster DMA channel");
-
- sbDMA = channel;
- sbDMAa1 = sba1Vals[channel];
- sbDMAa2 = sba2Vals[channel];
- sbDMAa3 = sba3Vals[channel];
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_StartSB() - Turns on the SoundBlaster
-//
-///////////////////////////////////////////////////////////////////////////
-static void
-SDL_StartSB(void)
-{
- byte timevalue,test;
-
- sbIntVec = sbIntVectors[sbInterrupt];
- if (sbIntVec < 0)
- Quit("SDL_StartSB: Illegal or unsupported interrupt number for SoundBlaster");
-
- sbOldIntHand = getvect(sbIntVec); // Get old interrupt handler
- setvect(sbIntVec,SDL_SBService); // Set mine
-
- sbWriteDelay();
- sbOut(sbWriteCmd,0xd1); // Turn on DSP speaker
-
- // Set the SoundBlaster DAC time constant for 7KHz
- timevalue = 256 - (1000000 / 7000);
- sbWriteDelay();
- sbOut(sbWriteCmd,0x40);
- sbWriteDelay();
- sbOut(sbWriteData,timevalue);
-
- SBProPresent = false;
- if (sbNoProCheck)
- return;
-
- // Check to see if this is a SB Pro
- sbOut(sbpMixerAddr,sbpmFMVol);
- sbpOldFMMix = sbIn(sbpMixerData);
- sbOut(sbpMixerData,0xbb);
- test = sbIn(sbpMixerData);
- if (test == 0xbb)
- {
- // Boost FM output levels to be equivilent with digitized output
- sbOut(sbpMixerData,0xff);
- test = sbIn(sbpMixerData);
- if (test == 0xff)
- {
- SBProPresent = true;
-
- // Save old Voice output levels (SB Pro)
- sbOut(sbpMixerAddr,sbpmVoiceVol);
- sbpOldVOCMix = sbIn(sbpMixerData);
-
- // Turn SB Pro stereo DAC off
- sbOut(sbpMixerAddr,sbpmControl);
- sbOut(sbpMixerData,0); // 0=off,2=on
- }
- }
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_ShutSB() - Turns off the SoundBlaster
-//
-///////////////////////////////////////////////////////////////////////////
-static void
-SDL_ShutSB(void)
-{
- SDL_SBStopSample();
-
- if (SBProPresent)
- {
- // Restore FM output levels (SB Pro)
- sbOut(sbpMixerAddr,sbpmFMVol);
- sbOut(sbpMixerData,sbpOldFMMix);
-
- // Restore Voice output levels (SB Pro)
- sbOut(sbpMixerAddr,sbpmVoiceVol);
- sbOut(sbpMixerData,sbpOldVOCMix);
- }
-
- setvect(sbIntVec,sbOldIntHand); // Set vector back
-}
-
-// Sound Source Code
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_SSStopSample() - Stops a sample playing on the Sound Source
-//
-///////////////////////////////////////////////////////////////////////////
-#ifdef _MUSE_
-void
-#else
-static void
-#endif
-SDL_SSStopSample(void)
-{
-asm pushf
-asm cli
-
- (long)ssSample = 0;
-
-asm popf
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_SSService() - Handles playing the next sample on the Sound Source
-//
-///////////////////////////////////////////////////////////////////////////
-static void
-SDL_SSService(void)
-{
- boolean gotit;
- byte v;
-
- while (ssSample)
- {
- asm mov dx,[ssStatus] // Check to see if FIFO is currently empty
- asm in al,dx
- asm test al,0x40
- asm jnz done // Nope - don't push any more data out
-
- v = *ssSample++;
- if (!(--ssLengthLeft))
- {
- (long)ssSample = 0;
- SDL_DigitizedDone();
- }
-
- asm mov dx,[ssData] // Pump the value out
- asm mov al,[v]
- asm out dx,al
-
- asm mov dx,[ssControl] // Pulse printer select
- asm mov al,[ssOff]
- asm out dx,al
- asm push ax
- asm pop ax
- asm mov al,[ssOn]
- asm out dx,al
-
- asm push ax // Delay a short while
- asm pop ax
- asm push ax
- asm pop ax
- }
-done:;
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_SSPlaySample() - Plays the specified sample on the Sound Source
-//
-///////////////////////////////////////////////////////////////////////////
-#ifdef _MUSE_
-void
-#else
-static void
-#endif
-SDL_SSPlaySample(byte huge *data,longword len)
-{
-asm pushf
-asm cli
-
- ssLengthLeft = len;
- ssSample = (volatile byte far *)data;
-
-asm popf
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_StartSS() - Sets up for and turns on the Sound Source
-//
-///////////////////////////////////////////////////////////////////////////
-static void
-SDL_StartSS(void)
-{
- if (ssPort == 3)
- ssControl = 0x27a; // If using LPT3
- else if (ssPort == 2)
- ssControl = 0x37a; // If using LPT2
- else
- ssControl = 0x3be; // If using LPT1
- ssStatus = ssControl - 1;
- ssData = ssStatus - 1;
-
- ssOn = 0x04;
- if (ssIsTandy)
- ssOff = 0x0e; // Tandy wierdness
- else
- ssOff = 0x0c; // For normal machines
-
- outportb(ssControl,ssOn); // Enable SS
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_ShutSS() - Turns off the Sound Source
-//
-///////////////////////////////////////////////////////////////////////////
-static void
-SDL_ShutSS(void)
-{
- outportb(ssControl,ssOff);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_CheckSS() - Checks to see if a Sound Source is present at the
-// location specified by the sound source variables
-//
-///////////////////////////////////////////////////////////////////////////
-static boolean
-SDL_CheckSS(void)
-{
- boolean present = false;
- longword lasttime;
-
- // Turn the Sound Source on and wait awhile (4 ticks)
- SDL_StartSS();
-
- lasttime = TimeCount;
- while (TimeCount < lasttime + 4)
- ;
-
-asm mov dx,[ssStatus] // Check to see if FIFO is currently empty
-asm in al,dx
-asm test al,0x40
-asm jnz checkdone // Nope - Sound Source not here
-
-asm mov cx,32 // Force FIFO overflow (FIFO is 16 bytes)
-outloop:
-asm mov dx,[ssData] // Pump a neutral value out
-asm mov al,0x80
-asm out dx,al
-
-asm mov dx,[ssControl] // Pulse printer select
-asm mov al,[ssOff]
-asm out dx,al
-asm push ax
-asm pop ax
-asm mov al,[ssOn]
-asm out dx,al
-
-asm push ax // Delay a short while before we do this again
-asm pop ax
-asm push ax
-asm pop ax
-
-asm loop outloop
-
-asm mov dx,[ssStatus] // Is FIFO overflowed now?
-asm in al,dx
-asm test al,0x40
-asm jz checkdone // Nope, still not - Sound Source not here
-
- present = true; // Yes - it's here!
-
-checkdone:
- SDL_ShutSS();
- return(present);
-}
-
-static boolean
-SDL_DetectSoundSource(void)
-{
- for (ssPort = 1;ssPort <= 3;ssPort++)
- if (SDL_CheckSS())
- return(true);
- return(false);
-}
-
-//
-// PC Sound code
-//
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_PCPlaySample() - Plays the specified sample on the PC speaker
-//
-///////////////////////////////////////////////////////////////////////////
-#ifdef _MUSE_
-void
-#else
-static void
-#endif
-SDL_PCPlaySample(byte huge *data,longword len)
-{
-asm pushf
-asm cli
-
- SDL_IndicatePC(true);
-
- pcLengthLeft = len;
- pcSound = (volatile byte far *)data;
-
-asm popf
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_PCStopSample() - Stops a sample playing on the PC speaker
-//
-///////////////////////////////////////////////////////////////////////////
-#ifdef _MUSE_
-void
-#else
-static void
-#endif
-SDL_PCStopSample(void)
-{
-asm pushf
-asm cli
-
- (long)pcSound = 0;
-
- SDL_IndicatePC(false);
-
-asm in al,0x61 // Turn the speaker off
-asm and al,0xfd // ~2
-asm out 0x61,al
-
-asm popf
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_PCPlaySound() - Plays the specified sound on the PC speaker
-//
-///////////////////////////////////////////////////////////////////////////
-#ifdef _MUSE_
-void
-#else
-static void
-#endif
-SDL_PCPlaySound(PCSound far *sound)
-{
-asm pushf
-asm cli
-
- pcLastSample = -1;
- pcLengthLeft = sound->common.length;
- pcSound = sound->data;
-
-asm popf
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_PCStopSound() - Stops the current sound playing on the PC Speaker
-//
-///////////////////////////////////////////////////////////////////////////
-#ifdef _MUSE_
-void
-#else
-static void
-#endif
-SDL_PCStopSound(void)
-{
-asm pushf
-asm cli
-
- (long)pcSound = 0;
-
-asm in al,0x61 // Turn the speaker off
-asm and al,0xfd // ~2
-asm out 0x61,al
-
-asm popf
-}
-
-#if 0
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_PCService() - Handles playing the next sample in a PC sound
-//
-///////////////////////////////////////////////////////////////////////////
-static void
-SDL_PCService(void)
-{
- byte s;
- word t;
-
- if (pcSound)
- {
- s = *pcSound++;
- if (s != pcLastSample)
- {
- asm pushf
- asm cli
-
- pcLastSample = s;
- if (s) // We have a frequency!
- {
- t = pcSoundLookup[s];
- asm mov bx,[t]
-
- asm mov al,0xb6 // Write to channel 2 (speaker) timer
- asm out 43h,al
- asm mov al,bl
- asm out 42h,al // Low byte
- asm mov al,bh
- asm out 42h,al // High byte
-
- asm in al,0x61 // Turn the speaker & gate on
- asm or al,3
- asm out 0x61,al
- }
- else // Time for some silence
- {
- asm in al,0x61 // Turn the speaker & gate off
- asm and al,0xfc // ~3
- asm out 0x61,al
- }
-
- asm popf
- }
-
- if (!(--pcLengthLeft))
- {
- SDL_PCStopSound();
- SDL_SoundFinished();
- }
- }
-}
-#endif
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_ShutPC() - Turns off the pc speaker
-//
-///////////////////////////////////////////////////////////////////////////
-static void
-SDL_ShutPC(void)
-{
-asm pushf
-asm cli
-
- pcSound = 0;
-
-asm in al,0x61 // Turn the speaker & gate off
-asm and al,0xfc // ~3
-asm out 0x61,al
-
-asm popf
-}
-
-//
-// Stuff for digitized sounds
-//
-memptr
-SDL_LoadDigiSegment(word page)
-{
- memptr addr;
-
-#if 0 // for debugging
-asm mov dx,STATUS_REGISTER_1
-asm in al,dx
-asm mov dx,ATR_INDEX
-asm mov al,ATR_OVERSCAN
-asm out dx,al
-asm mov al,10 // bright green
-asm out dx,al
-#endif
-
- addr = PM_GetSoundPage(page);
- PM_SetPageLock(PMSoundStart + page,pml_Locked);
-
-#if 0 // for debugging
-asm mov dx,STATUS_REGISTER_1
-asm in al,dx
-asm mov dx,ATR_INDEX
-asm mov al,ATR_OVERSCAN
-asm out dx,al
-asm mov al,3 // blue
-asm out dx,al
-asm mov al,0x20 // normal
-asm out dx,al
-#endif
-
- return(addr);
-}
-
-void
-SDL_PlayDigiSegment(memptr addr,word len)
-{
- switch (DigiMode)
- {
- case sds_PC:
- SDL_PCPlaySample(addr,len);
- break;
- case sds_SoundSource:
- SDL_SSPlaySample(addr,len);
- break;
- case sds_SoundBlaster:
- SDL_SBPlaySample(addr,len);
- break;
- }
-}
-
-void
-SD_StopDigitized(void)
-{
- int i;
-
-asm pushf
-asm cli
-
- DigiLeft = 0;
- DigiNextAddr = nil;
- DigiNextLen = 0;
- DigiMissed = false;
- DigiPlaying = false;
- DigiNumber = DigiPriority = 0;
- SoundPositioned = false;
- if ((DigiMode == sds_PC) && (SoundMode == sdm_PC))
- SDL_SoundFinished();
-
- switch (DigiMode)
- {
- case sds_PC:
- SDL_PCStopSample();
- break;
- case sds_SoundSource:
- SDL_SSStopSample();
- break;
- case sds_SoundBlaster:
- SDL_SBStopSample();
- break;
- }
-
-asm popf
-
- for (i = DigiLastStart;i < DigiLastEnd;i++)
- PM_SetPageLock(i + PMSoundStart,pml_Unlocked);
- DigiLastStart = 1;
- DigiLastEnd = 0;
-}
-
-void
-SD_Poll(void)
-{
- if (DigiLeft && !DigiNextAddr)
- {
- DigiNextLen = (DigiLeft >= PMPageSize)? PMPageSize : (DigiLeft % PMPageSize);
- DigiLeft -= DigiNextLen;
- if (!DigiLeft)
- DigiLastSegment = true;
- DigiNextAddr = SDL_LoadDigiSegment(DigiPage++);
- }
- if (DigiMissed && DigiNextAddr)
- {
- SDL_PlayDigiSegment(DigiNextAddr,DigiNextLen);
- DigiNextAddr = nil;
- DigiMissed = false;
- if (DigiLastSegment)
- {
- DigiPlaying = false;
- DigiLastSegment = false;
- }
- }
- SDL_SetTimerSpeed();
-}
-
-void
-SD_SetPosition(int leftpos,int rightpos)
-{
- if
- (
- (leftpos < 0)
- || (leftpos > 15)
- || (rightpos < 0)
- || (rightpos > 15)
- || ((leftpos == 15) && (rightpos == 15))
- )
- Quit("SD_SetPosition: Illegal position");
-
- switch (DigiMode)
- {
- case sds_SoundBlaster:
- SDL_PositionSBP(leftpos,rightpos);
- break;
- }
-}
-
-void
-SD_PlayDigitized(word which,int leftpos,int rightpos)
-{
- word len;
- memptr addr;
-
- if (!DigiMode)
- return;
-
- SD_StopDigitized();
- if (which >= NumDigi)
- Quit("SD_PlayDigitized: bad sound number");
-
- SD_SetPosition(leftpos,rightpos);
-
- DigiPage = DigiList[(which * 2) + 0];
- DigiLeft = DigiList[(which * 2) + 1];
-
- DigiLastStart = DigiPage;
- DigiLastEnd = DigiPage + ((DigiLeft + (PMPageSize - 1)) / PMPageSize);
-
- len = (DigiLeft >= PMPageSize)? PMPageSize : (DigiLeft % PMPageSize);
- addr = SDL_LoadDigiSegment(DigiPage++);
-
- DigiPlaying = true;
- DigiLastSegment = false;
-
- SDL_PlayDigiSegment(addr,len);
- DigiLeft -= len;
- if (!DigiLeft)
- DigiLastSegment = true;
-
- SD_Poll();
-}
-
-void
-SDL_DigitizedDone(void)
-{
- if (DigiNextAddr)
- {
- SDL_PlayDigiSegment(DigiNextAddr,DigiNextLen);
- DigiNextAddr = nil;
- DigiMissed = false;
- }
- else
- {
- if (DigiLastSegment)
- {
- DigiPlaying = false;
- DigiLastSegment = false;
- if ((DigiMode == sds_PC) && (SoundMode == sdm_PC))
- {
- SDL_SoundFinished();
- }
- else
- DigiNumber = DigiPriority = 0;
- SoundPositioned = false;
- }
- else
- DigiMissed = true;
- }
-}
-
-void
-SD_SetDigiDevice(SDSMode mode)
-{
- boolean devicenotpresent;
-
- if (mode == DigiMode)
- return;
-
- SD_StopDigitized();
-
- devicenotpresent = false;
- switch (mode)
- {
- case sds_SoundBlaster:
- if (!SoundBlasterPresent)
- {
- if (SoundSourcePresent)
- mode = sds_SoundSource;
- else
- devicenotpresent = true;
- }
- break;
- case sds_SoundSource:
- if (!SoundSourcePresent)
- devicenotpresent = true;
- break;
- }
-
- if (!devicenotpresent)
- {
- if (DigiMode == sds_SoundSource)
- SDL_ShutSS();
-
- DigiMode = mode;
-
- if (mode == sds_SoundSource)
- SDL_StartSS();
-
- SDL_SetTimerSpeed();
- }
-}
-
-void
-SDL_SetupDigi(void)
-{
- memptr list;
- word far *p,
- pg;
- int i;
-
- PM_UnlockMainMem();
- MM_GetPtr(&list,PMPageSize);
- PM_CheckMainMem();
- p = (word far *)MK_FP(PM_GetPage(ChunksInFile - 1),0);
- _fmemcpy((void far *)list,(void far *)p,PMPageSize);
- pg = PMSoundStart;
- for (i = 0;i < PMPageSize / (sizeof(word) * 2);i++,p += 2)
- {
- if (pg >= ChunksInFile - 1)
- break;
- pg += (p[1] + (PMPageSize - 1)) / PMPageSize;
- }
- PM_UnlockMainMem();
- MM_GetPtr((memptr *)&DigiList,i * sizeof(word) * 2);
- _fmemcpy((void far *)DigiList,(void far *)list,i * sizeof(word) * 2);
- MM_FreePtr(&list);
- NumDigi = i;
-
- for (i = 0;i < LASTSOUND;i++)
- DigiMap[i] = -1;
-}
-
-// AdLib Code
-
-///////////////////////////////////////////////////////////////////////////
-//
-// alOut(n,b) - Puts b in AdLib card register n
-//
-///////////////////////////////////////////////////////////////////////////
-void
-alOut(byte n,byte b)
-{
-asm pushf
-asm cli
-
-asm mov dx,0x388
-asm mov al,[n]
-asm out dx,al
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm inc dx
-asm mov al,[b]
-asm out dx,al
-
-asm popf
-
-asm dec dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-asm in al,dx
-}
-
-#if 0
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_SetInstrument() - Puts an instrument into a generator
-//
-///////////////////////////////////////////////////////////////////////////
-static void
-SDL_SetInstrument(int track,int which,Instrument far *inst,boolean percussive)
-{
- byte c,m;
-
- if (percussive)
- {
- c = pcarriers[which];
- m = pmodifiers[which];
- }
- else
- {
- c = carriers[which];
- m = modifiers[which];
- }
-
- tracks[track - 1]->inst = *inst;
- tracks[track - 1]->percussive = percussive;
-
- alOut(m + alChar,inst->mChar);
- alOut(m + alScale,inst->mScale);
- alOut(m + alAttack,inst->mAttack);
- alOut(m + alSus,inst->mSus);
- alOut(m + alWave,inst->mWave);
-
- // Most percussive instruments only use one cell
- if (c != 0xff)
- {
- alOut(c + alChar,inst->cChar);
- alOut(c + alScale,inst->cScale);
- alOut(c + alAttack,inst->cAttack);
- alOut(c + alSus,inst->cSus);
- alOut(c + alWave,inst->cWave);
- }
-
- alOut(which + alFeedCon,inst->nConn); // DEBUG - I think this is right
-}
-#endif
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_ALStopSound() - Turns off any sound effects playing through the
-// AdLib card
-//
-///////////////////////////////////////////////////////////////////////////
-#ifdef _MUSE_
-void
-#else
-static void
-#endif
-SDL_ALStopSound(void)
-{
-asm pushf
-asm cli
-
- (long)alSound = 0;
- alOut(alFreqH + 0,0);
-
-asm popf
-}
-
-static void
-SDL_AlSetFXInst(Instrument far *inst)
-{
- byte c,m;
-
- m = modifiers[0];
- c = carriers[0];
- alOut(m + alChar,inst->mChar);
- alOut(m + alScale,inst->mScale);
- alOut(m + alAttack,inst->mAttack);
- alOut(m + alSus,inst->mSus);
- alOut(m + alWave,inst->mWave);
- alOut(c + alChar,inst->cChar);
- alOut(c + alScale,inst->cScale);
- alOut(c + alAttack,inst->cAttack);
- alOut(c + alSus,inst->cSus);
- alOut(c + alWave,inst->cWave);
-
- // Note: Switch commenting on these lines for old MUSE compatibility
-// alOut(alFeedCon,inst->nConn);
- alOut(alFeedCon,0);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_ALPlaySound() - Plays the specified sound on the AdLib card
-//
-///////////////////////////////////////////////////////////////////////////
-#ifdef _MUSE_
-void
-#else
-static void
-#endif
-SDL_ALPlaySound(AdLibSound far *sound)
-{
- Instrument far *inst;
- byte huge *data;
-
- SDL_ALStopSound();
-
-asm pushf
-asm cli
-
- alLengthLeft = sound->common.length;
- data = sound->data;
- data++;
- data--;
- alSound = (byte far *)data;
- alBlock = ((sound->block & 7) << 2) | 0x20;
- inst = &sound->inst;
-
- if (!(inst->mSus | inst->cSus))
- {
- asm popf
- Quit("SDL_ALPlaySound() - Bad instrument");
- }
-
- SDL_AlSetFXInst(&alZeroInst); // DEBUG
- SDL_AlSetFXInst(inst);
-
-asm popf
-}
-
-#if 0
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_ALSoundService() - Plays the next sample out through the AdLib card
-//
-///////////////////////////////////////////////////////////////////////////
-//static void
-void
-SDL_ALSoundService(void)
-{
- byte s;
-
- if (alSound)
- {
- s = *alSound++;
- if (!s)
- alOut(alFreqH + 0,0);
- else
- {
- alOut(alFreqL + 0,s);
- alOut(alFreqH + 0,alBlock);
- }
-
- if (!(--alLengthLeft))
- {
- (long)alSound = 0;
- alOut(alFreqH + 0,0);
- SDL_SoundFinished();
- }
- }
-}
-#endif
-
-#if 0
-void
-SDL_ALService(void)
-{
- byte a,v;
- word w;
-
- if (!sqActive)
- return;
-
- while (sqHackLen && (sqHackTime <= alTimeCount))
- {
- w = *sqHackPtr++;
- sqHackTime = alTimeCount + *sqHackPtr++;
- asm mov dx,[w]
- asm mov [a],dl
- asm mov [v],dh
- alOut(a,v);
- sqHackLen -= 4;
- }
- alTimeCount++;
- if (!sqHackLen)
- {
- sqHackPtr = (word far *)sqHack;
- sqHackLen = sqHackSeqLen;
- alTimeCount = sqHackTime = 0;
- }
-}
-#endif
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_ShutAL() - Shuts down the AdLib card for sound effects
-//
-///////////////////////////////////////////////////////////////////////////
-static void
-SDL_ShutAL(void)
-{
-asm pushf
-asm cli
-
- alOut(alEffects,0);
- alOut(alFreqH + 0,0);
- SDL_AlSetFXInst(&alZeroInst);
- alSound = 0;
-
-asm popf
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_CleanAL() - Totally shuts down the AdLib card
-//
-///////////////////////////////////////////////////////////////////////////
-static void
-SDL_CleanAL(void)
-{
- int i;
-
-asm pushf
-asm cli
-
- alOut(alEffects,0);
- for (i = 1;i < 0xf5;i++)
- alOut(i,0);
-
-asm popf
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_StartAL() - Starts up the AdLib card for sound effects
-//
-///////////////////////////////////////////////////////////////////////////
-static void
-SDL_StartAL(void)
-{
- alFXReg = 0;
- alOut(alEffects,alFXReg);
- SDL_AlSetFXInst(&alZeroInst);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_DetectAdLib() - Determines if there's an AdLib (or SoundBlaster
-// emulating an AdLib) present
-//
-///////////////////////////////////////////////////////////////////////////
-static boolean
-SDL_DetectAdLib(void)
-{
- byte status1,status2;
- int i;
-
- alOut(4,0x60); // Reset T1 & T2
- alOut(4,0x80); // Reset IRQ
- status1 = readstat();
- alOut(2,0xff); // Set timer 1
- alOut(4,0x21); // Start timer 1
-#if 0
- SDL_Delay(TimerDelay100);
-#else
-asm mov dx,0x388
-asm mov cx,100
-usecloop:
-asm in al,dx
-asm loop usecloop
-#endif
-
- status2 = readstat();
- alOut(4,0x60);
- alOut(4,0x80);
-
- if (((status1 & 0xe0) == 0x00) && ((status2 & 0xe0) == 0xc0))
- {
- for (i = 1;i <= 0xf5;i++) // Zero all the registers
- alOut(i,0);
-
- alOut(1,0x20); // Set WSE=1
- alOut(8,0); // Set CSM=0 & SEL=0
-
- return(true);
- }
- else
- return(false);
-}
-
-#if 0
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_t0Service() - My timer 0 ISR which handles the different timings and
-// dispatches to whatever other routines are appropriate
-//
-///////////////////////////////////////////////////////////////////////////
-static void interrupt
-SDL_t0Service(void)
-{
-static word count = 1;
-
-#if 1 // for debugging
-asm mov dx,STATUS_REGISTER_1
-asm in al,dx
-asm mov dx,ATR_INDEX
-asm mov al,ATR_OVERSCAN
-asm out dx,al
-asm mov al,4 // red
-asm out dx,al
-#endif
-
- HackCount++;
-
- if ((MusicMode == smm_AdLib) || (DigiMode == sds_SoundSource))
- {
- SDL_ALService();
- SDL_SSService();
-// if (!(++count & 7))
- if (!(++count % 10))
- {
- LocalTime++;
- TimeCount++;
- if (SoundUserHook)
- SoundUserHook();
- }
-// if (!(count & 3))
- if (!(count % 5))
- {
- switch (SoundMode)
- {
- case sdm_PC:
- SDL_PCService();
- break;
- case sdm_AdLib:
- SDL_ALSoundService();
- break;
- }
- }
- }
- else
- {
- if (!(++count & 1))
- {
- LocalTime++;
- TimeCount++;
- if (SoundUserHook)
- SoundUserHook();
- }
- switch (SoundMode)
- {
- case sdm_PC:
- SDL_PCService();
- break;
- case sdm_AdLib:
- SDL_ALSoundService();
- break;
- }
- }
-
-asm mov ax,[WORD PTR TimerCount]
-asm add ax,[WORD PTR TimerDivisor]
-asm mov [WORD PTR TimerCount],ax
-asm jnc myack
- t0OldService(); // If we overflow a word, time to call old int handler
-asm jmp olddone
-myack:;
- outportb(0x20,0x20); // Ack the interrupt
-olddone:;
-
-#if 1 // for debugging
-asm mov dx,STATUS_REGISTER_1
-asm in al,dx
-asm mov dx,ATR_INDEX
-asm mov al,ATR_OVERSCAN
-asm out dx,al
-asm mov al,3 // blue
-asm out dx,al
-asm mov al,0x20 // normal
-asm out dx,al
-#endif
-}
-#endif
-
-////////////////////////////////////////////////////////////////////////////
-//
-// SDL_ShutDevice() - turns off whatever device was being used for sound fx
-//
-////////////////////////////////////////////////////////////////////////////
-static void
-SDL_ShutDevice(void)
-{
- switch (SoundMode)
- {
- case sdm_PC:
- SDL_ShutPC();
- break;
- case sdm_AdLib:
- SDL_ShutAL();
- break;
- }
- SoundMode = sdm_Off;
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_CleanDevice() - totally shuts down all sound devices
-//
-///////////////////////////////////////////////////////////////////////////
-static void
-SDL_CleanDevice(void)
-{
- if ((SoundMode == sdm_AdLib) || (MusicMode == smm_AdLib))
- SDL_CleanAL();
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SDL_StartDevice() - turns on whatever device is to be used for sound fx
-//
-///////////////////////////////////////////////////////////////////////////
-static void
-SDL_StartDevice(void)
-{
- switch (SoundMode)
- {
- case sdm_AdLib:
- SDL_StartAL();
- break;
- }
- SoundNumber = SoundPriority = 0;
-}
-
-// Public routines
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SD_SetSoundMode() - Sets which sound hardware to use for sound effects
-//
-///////////////////////////////////////////////////////////////////////////
-boolean
-SD_SetSoundMode(SDMode mode)
-{
- boolean result = false;
- word tableoffset;
-
- SD_StopSound();
-
-#ifndef _MUSE_
- if ((mode == sdm_AdLib) && !AdLibPresent)
- mode = sdm_PC;
-
- switch (mode)
- {
- case sdm_Off:
- NeedsDigitized = false;
- result = true;
- break;
- case sdm_PC:
- tableoffset = STARTPCSOUNDS;
- NeedsDigitized = false;
- result = true;
- break;
- case sdm_AdLib:
- if (AdLibPresent)
- {
- tableoffset = STARTADLIBSOUNDS;
- NeedsDigitized = false;
- result = true;
- }
- break;
- }
-#else
- result = true;
-#endif
-
- if (result && (mode != SoundMode))
- {
- SDL_ShutDevice();
- SoundMode = mode;
-#ifndef _MUSE_
- SoundTable = (word *)(&audiosegs[tableoffset]);
-#endif
- SDL_StartDevice();
- }
-
- SDL_SetTimerSpeed();
-
- return(result);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SD_SetMusicMode() - sets the device to use for background music
-//
-///////////////////////////////////////////////////////////////////////////
-boolean
-SD_SetMusicMode(SMMode mode)
-{
- boolean result = false;
-
- SD_FadeOutMusic();
- while (SD_MusicPlaying())
- ;
-
- switch (mode)
- {
- case smm_Off:
- NeedsMusic = false;
- result = true;
- break;
- case smm_AdLib:
- if (AdLibPresent)
- {
- NeedsMusic = true;
- result = true;
- }
- break;
- }
-
- if (result)
- MusicMode = mode;
-
- SDL_SetTimerSpeed();
-
- return(result);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SD_Startup() - starts up the Sound Mgr
-// Detects all additional sound hardware and installs my ISR
-//
-///////////////////////////////////////////////////////////////////////////
-void
-SD_Startup(void)
-{
- int i;
-
- if (SD_Started)
- return;
-
- SDL_SetDS();
-
- ssIsTandy = false;
- ssNoCheck = false;
- alNoCheck = false;
- sbNoCheck = false;
- sbNoProCheck = false;
-#ifndef _MUSE_
- for (i = 1;i < _argc;i++)
- {
- switch (US_CheckParm(_argv[i],ParmStrings))
- {
- case 0: // No AdLib detection
- alNoCheck = true;
- break;
- case 1: // No SoundBlaster detection
- sbNoCheck = true;
- break;
- case 2: // No SoundBlaster Pro detection
- sbNoProCheck = true;
- break;
- case 3:
- ssNoCheck = true; // No Sound Source detection
- break;
- case 4: // Tandy Sound Source handling
- ssIsTandy = true;
- break;
- case 5: // Sound Source present at LPT1
- ssPort = 1;
- ssNoCheck = SoundSourcePresent = true;
- break;
- case 6: // Sound Source present at LPT2
- ssPort = 2;
- ssNoCheck = SoundSourcePresent = true;
- break;
- case 7: // Sound Source present at LPT3
- ssPort = 3;
- ssNoCheck = SoundSourcePresent = true;
- break;
- }
- }
-#endif
-
- SoundUserHook = 0;
-
- t0OldService = getvect(8); // Get old timer 0 ISR
-
- LocalTime = TimeCount = alTimeCount = 0;
-
- SD_SetSoundMode(sdm_Off);
- SD_SetMusicMode(smm_Off);
-
- if (!ssNoCheck)
- SoundSourcePresent = SDL_DetectSoundSource();
-
- if (!alNoCheck)
- {
- AdLibPresent = SDL_DetectAdLib();
- if (AdLibPresent && !sbNoCheck)
- {
- int port = -1;
- char *env = getenv("BLASTER");
- if (env)
- {
- long temp;
- while (*env)
- {
- while (isspace(*env))
- env++;
-
- switch (toupper(*env))
- {
- case 'A':
- temp = strtol(env + 1,&env,16);
- if
- (
- (temp >= 0x210)
- && (temp <= 0x260)
- && (!(temp & 0x00f))
- )
- port = (temp - 0x200) >> 4;
- else
- Quit("SD_Startup: Unsupported address value in BLASTER");
- break;
- case 'I':
- temp = strtol(env + 1,&env,10);
- if
- (
- (temp >= 0)
- && (temp <= 10)
- && (sbIntVectors[temp] != -1)
- )
- {
- sbInterrupt = temp;
- sbIntVec = sbIntVectors[sbInterrupt];
- }
- else
- Quit("SD_Startup: Unsupported interrupt value in BLASTER");
- break;
- case 'D':
- temp = strtol(env + 1,&env,10);
- if ((temp == 0) || (temp == 1) || (temp == 3))
- SDL_SBSetDMA(temp);
- else
- Quit("SD_Startup: Unsupported DMA value in BLASTER");
- break;
- default:
- while (isspace(*env))
- env++;
- while (*env && !isspace(*env))
- env++;
- break;
- }
- }
- }
- SoundBlasterPresent = SDL_DetectSoundBlaster(port);
- }
- }
-
- for (i = 0;i < 255;i++)
- pcSoundLookup[i] = i * 60;
-
- if (SoundBlasterPresent)
- SDL_StartSB();
-
- SDL_SetupDigi();
-
- SD_Started = true;
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SD_Default() - Sets up the default behaviour for the Sound Mgr whether
-// the config file was present or not.
-//
-///////////////////////////////////////////////////////////////////////////
-void
-SD_Default(boolean gotit,SDMode sd,SMMode sm)
-{
- boolean gotsd,gotsm;
-
- gotsd = gotsm = gotit;
-
- if (gotsd) // Make sure requested sound hardware is available
- {
- switch (sd)
- {
- case sdm_AdLib:
- gotsd = AdLibPresent;
- break;
- }
- }
- if (!gotsd)
- {
- if (AdLibPresent)
- sd = sdm_AdLib;
- else
- sd = sdm_PC;
- }
- if (sd != SoundMode)
- SD_SetSoundMode(sd);
-
-
- if (gotsm) // Make sure requested music hardware is available
- {
- switch (sm)
- {
- case sdm_AdLib:
- gotsm = AdLibPresent;
- break;
- }
- }
- if (!gotsm)
- {
- if (AdLibPresent)
- sm = smm_AdLib;
- }
- if (sm != MusicMode)
- SD_SetMusicMode(sm);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SD_Shutdown() - shuts down the Sound Mgr
-// Removes sound ISR and turns off whatever sound hardware was active
-//
-///////////////////////////////////////////////////////////////////////////
-void
-SD_Shutdown(void)
-{
- if (!SD_Started)
- return;
-
- SD_MusicOff();
- SD_StopSound();
- SDL_ShutDevice();
- SDL_CleanDevice();
-
- if (SoundBlasterPresent)
- SDL_ShutSB();
-
- if (SoundSourcePresent)
- SDL_ShutSS();
-
- asm pushf
- asm cli
-
- SDL_SetTimer0(0);
-
- setvect(8,t0OldService);
-
- asm popf
-
- SD_Started = false;
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SD_SetUserHook() - sets the routine that the Sound Mgr calls every 1/70th
-// of a second from its timer 0 ISR
-//
-///////////////////////////////////////////////////////////////////////////
-void
-SD_SetUserHook(void (* hook)(void))
-{
- SoundUserHook = hook;
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SD_PositionSound() - Sets up a stereo imaging location for the next
-// sound to be played. Each channel ranges from 0 to 15.
-//
-///////////////////////////////////////////////////////////////////////////
-void
-SD_PositionSound(int leftvol,int rightvol)
-{
- LeftPosition = leftvol;
- RightPosition = rightvol;
- nextsoundpos = true;
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SD_PlaySound() - plays the specified sound on the appropriate hardware
-//
-///////////////////////////////////////////////////////////////////////////
-boolean
-SD_PlaySound(soundnames sound)
-{
- boolean ispos;
- SoundCommon far *s;
- int lp,rp;
-
- lp = LeftPosition;
- rp = RightPosition;
- LeftPosition = 0;
- RightPosition = 0;
-
- ispos = nextsoundpos;
- nextsoundpos = false;
-
- if (sound == -1)
- return(false);
-
- s = MK_FP(SoundTable[sound],0);
- if ((SoundMode != sdm_Off) && !s)
- Quit("SD_PlaySound() - Uncached sound");
-
- if ((DigiMode != sds_Off) && (DigiMap[sound] != -1))
- {
- if ((DigiMode == sds_PC) && (SoundMode == sdm_PC))
- {
- if (s->priority < SoundPriority)
- return(false);
-
- SDL_PCStopSound();
-
- SD_PlayDigitized(DigiMap[sound],lp,rp);
- SoundPositioned = ispos;
- SoundNumber = sound;
- SoundPriority = s->priority;
- }
- else
- {
- asm pushf
- asm cli
- if (DigiPriority && !DigiNumber)
- {
- asm popf
- Quit("SD_PlaySound: Priority without a sound");
- }
- asm popf
-
- if (s->priority < DigiPriority)
- return(false);
-
- SD_PlayDigitized(DigiMap[sound],lp,rp);
- SoundPositioned = ispos;
- DigiNumber = sound;
- DigiPriority = s->priority;
- }
-
- return(true);
- }
-
- if (SoundMode == sdm_Off)
- return(false);
- if (!s->length)
- Quit("SD_PlaySound() - Zero length sound");
- if (s->priority < SoundPriority)
- return(false);
-
- switch (SoundMode)
- {
- case sdm_PC:
- SDL_PCPlaySound((void far *)s);
- break;
- case sdm_AdLib:
- SDL_ALPlaySound((void far *)s);
- break;
- }
-
- SoundNumber = sound;
- SoundPriority = s->priority;
-
- return(false);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SD_SoundPlaying() - returns the sound number that's playing, or 0 if
-// no sound is playing
-//
-///////////////////////////////////////////////////////////////////////////
-word
-SD_SoundPlaying(void)
-{
- boolean result = false;
-
- switch (SoundMode)
- {
- case sdm_PC:
- result = pcSound? true : false;
- break;
- case sdm_AdLib:
- result = alSound? true : false;
- break;
- }
-
- if (result)
- return(SoundNumber);
- else
- return(false);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SD_StopSound() - if a sound is playing, stops it
-//
-///////////////////////////////////////////////////////////////////////////
-void
-SD_StopSound(void)
-{
- if (DigiPlaying)
- SD_StopDigitized();
-
- switch (SoundMode)
- {
- case sdm_PC:
- SDL_PCStopSound();
- break;
- case sdm_AdLib:
- SDL_ALStopSound();
- break;
- }
-
- SoundPositioned = false;
-
- SDL_SoundFinished();
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SD_WaitSoundDone() - waits until the current sound is done playing
-//
-///////////////////////////////////////////////////////////////////////////
-void
-SD_WaitSoundDone(void)
-{
- while (SD_SoundPlaying())
- ;
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SD_MusicOn() - turns on the sequencer
-//
-///////////////////////////////////////////////////////////////////////////
-void
-SD_MusicOn(void)
-{
- sqActive = true;
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SD_MusicOff() - turns off the sequencer and any playing notes
-//
-///////////////////////////////////////////////////////////////////////////
-void
-SD_MusicOff(void)
-{
- word i;
-
-
- switch (MusicMode)
- {
- case smm_AdLib:
- alFXReg = 0;
- alOut(alEffects,0);
- for (i = 0;i < sqMaxTracks;i++)
- alOut(alFreqH + i + 1,0);
- break;
- }
- sqActive = false;
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SD_StartMusic() - starts playing the music pointed to
-//
-///////////////////////////////////////////////////////////////////////////
-void
-SD_StartMusic(MusicGroup far *music)
-{
- SD_MusicOff();
-asm pushf
-asm cli
-
- if (MusicMode == smm_AdLib)
- {
- sqHackPtr = sqHack = music->values;
- sqHackSeqLen = sqHackLen = music->length;
- sqHackTime = 0;
- alTimeCount = 0;
- SD_MusicOn();
- }
-
-asm popf
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SD_FadeOutMusic() - starts fading out the music. Call SD_MusicPlaying()
-// to see if the fadeout is complete
-//
-///////////////////////////////////////////////////////////////////////////
-void
-SD_FadeOutMusic(void)
-{
- switch (MusicMode)
- {
- case smm_AdLib:
- // DEBUG - quick hack to turn the music off
- SD_MusicOff();
- break;
- }
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// SD_MusicPlaying() - returns true if music is currently playing, false if
-// not
-//
-///////////////////////////////////////////////////////////////////////////
-boolean
-SD_MusicPlaying(void)
-{
- boolean result;
-
- switch (MusicMode)
- {
- case smm_AdLib:
- result = false;
- // DEBUG - not written
- break;
- default:
- result = false;
- }
-
- return(result);
-}
--- a/WOLFSRC/ID_SD.EQU
+++ /dev/null
@@ -1,38 +1,0 @@
-;
-; ID_SD.EQU
-; Id Sound Manager assembly equates
-;
-
- INCLUDE 'ID_VL.EQU' ; For screen color debugging stuff
-
-; Modes
-sdm_Off = 0
-sdm_PC = 1
-sdm_AdLib = 2
-
-smm_Off = 0
-smm_AdLib = 1
-
-sds_Off = 0
-sds_SoundSource = 1
-sds_SoundBlaster = 2
-
-; Stuff for the PC speaker
-pcTimer = 42h
-pcTAccess = 43h
-pcSpeaker = 61h
-pcSpkBits = 3
-
-; Stuff for the AdLib
-; Operator registers
-alChar = 20h
-alScale = 40h
-alAttack = 60h
-alSus = 80h
-alWave = 0e0h
-; Channel registers
-alFreqL = 0a0h
-alFreqH = 0b0h
-alFeedCon = 0c0h
-; Global registers
-alEffects = 0bdh
--- a/WOLFSRC/ID_SD.H
+++ /dev/null
@@ -1,237 +1,0 @@
-//
-// ID Engine
-// ID_SD.h - Sound Manager Header
-// Version for Wolfenstein
-// By Jason Blochowiak
-//
-
-#ifndef __ID_SD__
-#define __ID_SD__
-
-void alOut(byte n,byte b);
-
-#ifdef __DEBUG__
-#define __DEBUG_SoundMgr__
-#endif
-
-#define TickBase 70 // 70Hz per tick - used as a base for timer 0
-
-typedef enum {
- sdm_Off,
- sdm_PC,sdm_AdLib,
- } SDMode;
-typedef enum {
- smm_Off,smm_AdLib
- } SMMode;
-typedef enum {
- sds_Off,sds_PC,sds_SoundSource,sds_SoundBlaster
- } SDSMode;
-typedef struct
- {
- longword length;
- word priority;
- } SoundCommon;
-
-// PC Sound stuff
-#define pcTimer 0x42
-#define pcTAccess 0x43
-#define pcSpeaker 0x61
-
-#define pcSpkBits 3
-
-typedef struct
- {
- SoundCommon common;
- byte data[1];
- } PCSound;
-
-// Registers for the Sound Blaster card - needs to be offset by n0 (0x10,0x20,0x30,0x40,0x50,0x60)
-#define sbReset 0x206 // W
-#define sbFMStatus 0x208 // R
-#define sbFMAddr 0x208 // W
-#define sbFMData 0x209 // W
-#define sbReadData 0x20a // R
-#define sbWriteCmd 0x20c // W
-#define sbWriteData 0x20c // W
-#define sbWriteStat 0x20c // R
-#define sbDataAvail 0x20e // R
-
-// Registers for the Sound Blaster Pro card - needs to be offset by n0 (0x20 or 0x40)
-#define sbpLFMStatus 0x200 // R
-#define sbpLFMAddr 0x200 // W
-#define sbpLFMData 0x201 // W
-#define sbpRFMStatus 0x202 // R
-#define sbpRFMAddr 0x202 // W
-#define sbpRFMData 0x203 // W
-#define sbpMixerAddr 0x204 // W
-#define sbpMixerData 0x205 // RW
-#define sbpCDData 0x210 // R
-#define sbpCDCommand 0x210 // W
-#define sbpCDStatus 0x211 // R
-#define sbpCDReset 0x212 // W
-
-// SBPro Mixer addresses
-#define sbpmReset 0x00
-#define sbpmVoiceVol 0x04
-#define sbpmMicMix 0x0a
-#define sbpmFilterADC 0x0c
-#define sbpmControl 0x0e
-#define sbpmMasterVol 0x22
-#define sbpmFMVol 0x26
-#define sbpmCDVol 0x28
-#define sbpmLineVol 0x2e
-
-typedef struct
- {
- SoundCommon common;
- word hertz;
- byte bits,
- reference,
- data[1];
- } SampledSound;
-
-// Registers for the AdLib card
-#define alFMStatus 0x388 // R
-#define alFMAddr 0x388 // W
-#define alFMData 0x389 // W
-
-// Register addresses
-// Operator stuff
-#define alChar 0x20
-#define alScale 0x40
-#define alAttack 0x60
-#define alSus 0x80
-#define alWave 0xe0
-// Channel stuff
-#define alFreqL 0xa0
-#define alFreqH 0xb0
-#define alFeedCon 0xc0
-// Global stuff
-#define alEffects 0xbd
-
-typedef struct
- {
- byte mChar,cChar,
- mScale,cScale,
- mAttack,cAttack,
- mSus,cSus,
- mWave,cWave,
- nConn,
-
- // These are only for Muse - these bytes are really unused
- voice,
- mode,
- unused[3];
- } Instrument;
-
-typedef struct
- {
- SoundCommon common;
- Instrument inst;
- byte block,
- data[1];
- } AdLibSound;
-
-//
-// Sequencing stuff
-//
-#define sqMaxTracks 10
-#define sqMaxMoods 1 // DEBUG
-
-#define sev_Null 0 // Does nothing
-#define sev_NoteOff 1 // Turns a note off
-#define sev_NoteOn 2 // Turns a note on
-#define sev_NotePitch 3 // Sets the pitch of a currently playing note
-#define sev_NewInst 4 // Installs a new instrument
-#define sev_NewPerc 5 // Installs a new percussive instrument
-#define sev_PercOn 6 // Turns a percussive note on
-#define sev_PercOff 7 // Turns a percussive note off
-#define sev_SeqEnd -1 // Terminates a sequence
-
-// Flags for MusicGroup.flags
-#define sf_Melodic 0
-#define sf_Percussive 1
-
-#if 1
-typedef struct
- {
- word length,
- values[1];
- } MusicGroup;
-#else
-typedef struct
- {
- word flags,
- count,
- offsets[1];
- } MusicGroup;
-#endif
-
-typedef struct
- {
- /* This part needs to be set up by the user */
- word mood,far *moods[sqMaxMoods];
-
- /* The rest is set up by the code */
- Instrument inst;
- boolean percussive;
- word far *seq;
- longword nextevent;
- } ActiveTrack;
-
-#define sqmode_Normal 0
-#define sqmode_FadeIn 1
-#define sqmode_FadeOut 2
-
-#define sqMaxFade 64 // DEBUG
-
-
-// Global variables
-extern boolean AdLibPresent,
- SoundSourcePresent,
- SoundBlasterPresent,
- NeedsMusic, // For Caching Mgr
- SoundPositioned;
-extern SDMode SoundMode;
-extern SDSMode DigiMode;
-extern SMMode MusicMode;
-extern boolean DigiPlaying;
-extern int DigiMap[];
-extern longword TimeCount; // Global time in ticks
-
-// Function prototypes
-extern void SD_Startup(void),
- SD_Shutdown(void),
- SD_Default(boolean gotit,SDMode sd,SMMode sm),
-
- SD_PositionSound(int leftvol,int rightvol);
-extern boolean SD_PlaySound(soundnames sound);
-extern void SD_SetPosition(int leftvol,int rightvol),
- SD_StopSound(void),
- SD_WaitSoundDone(void),
-
- SD_StartMusic(MusicGroup far *music),
- SD_MusicOn(void),
- SD_MusicOff(void),
- SD_FadeOutMusic(void),
-
- SD_SetUserHook(void (*hook)(void));
-extern boolean SD_MusicPlaying(void),
- SD_SetSoundMode(SDMode mode),
- SD_SetMusicMode(SMMode mode);
-extern word SD_SoundPlaying(void);
-
-extern void SD_SetDigiDevice(SDSMode),
- SD_PlayDigitized(word which,int leftpos,int rightpos),
- SD_StopDigitized(void),
- SD_Poll(void);
-
-#ifdef _MUSE_ // MUSE Goes directly to the lower level routines
-extern void SDL_PCPlaySound(PCSound far *sound),
- SDL_PCStopSound(void),
- SDL_ALPlaySound(AdLibSound far *sound),
- SDL_ALStopSound(void);
-#endif
-
-#endif
-
--- a/WOLFSRC/ID_SD_A.ASM
+++ /dev/null
@@ -1,526 +1,0 @@
-;
-; ID_SD_A.ASM
-; Id Sound Manager assembly stuff
-
- .286C
- IDEAL
- MODEL MEDIUM,C
- JUMPS
-
- INCLUDE 'ID_SD.EQU'
-
-DEBUG = 0
-
- EXTRN SDL_DigitizedDone:FAR
- EXTRN alOut:FAR
-
-;============================================================================
-
-DATASEG
-
- EXTRN sqActive:WORD
- EXTRN ssSample:DWORD
- EXTRN ssLengthLeft:WORD
- EXTRN ssControl:WORD
- EXTRN ssStatus:WORD
- EXTRN ssData:WORD
- EXTRN ssOn:BYTE
- EXTRN ssOff:BYTE
-
- EXTRN pcSound:DWORD
- EXTRN pcLengthLeft:WORD
- EXTRN pcLastSample:BYTE
- EXTRN pcSoundLookup:WORD
-
- EXTRN alSound:DWORD
- EXTRN alBlock:WORD
- EXTRN alLengthLeft:WORD
- EXTRN alTimeCount:DWORD
-
- EXTRN sqHack:DWORD
- EXTRN sqHackPtr:DWORD
- EXTRN sqHackLen:WORD
- EXTRN sqHackSeqLen:WORD
- EXTRN sqHackTime:DWORD
-
- EXTRN HackCount:WORD
- EXTRN TimeCount:WORD
- EXTRN LocalTime:WORD
-
- EXTRN TimerCount:WORD
- EXTRN TimerDivisor:WORD
- EXTRN t0OldService:DWORD
-
- EXTRN SoundMode:WORD
- EXTRN DigiMode:WORD
-
- EXTRN SoundNumber:WORD
- EXTRN SoundPriority:WORD
-
-count_time dw ?
-count_fx dw ?
-
-pcdtab db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
- db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
- db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
- db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
- db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
- db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
- db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
- db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
- db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
- db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
- db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
- db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
- db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
- db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
- db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
- db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
-
-
-;============================================================================
-
-CODESEG
-
-MyDS dw ?
-
-pcindicate dw ?
-extreme dw ?
-
- PROC SDL_SetDS
- PUBLIC SDL_SetDS
-
- mov ax,ds
- mov [cs:MyDS],ds
- ret
-
- ENDP
-
-;
-; COMMONSTART
-; Macro used for common prefix code
-;
- MACRO COMMONSTART
- IF DEBUG
- push dx
- push ax
- mov dx,STATUS_REGISTER_1
- in al,dx
- mov dx,ATR_INDEX
- mov al,ATR_OVERSCAN
- out dx,al
- mov al,4 ; red
- out dx,al
- ENDIF
-
- push ds
- push ax
-
- mov ds,[cs:MyDS]
- inc [HackCount]
- ENDM
-
-;
-; DOFX
-; Macro used to do the sound effects code
-;
- MACRO DOFX
- les di,[pcSound] ; PC sound effects
- mov ax,es
- or ax,di
- jz @@nopc ; nil pointer - no PC sound effect going
-
- mov bl,[es:di] ; Get the byte
- inc [WORD PTR pcSound] ; Increment pointer
- cmp [pcLastSample],bl ; Is this sample the same as last?
- jz @@pcsame ; Yep - don't do anything
- mov [pcLastSample],bl ; No, save it for next time
-
- or bl,bl
- jz @@pcoff ; If 0, turn sounds off
- xor bh,bh
- shl bx,1
- mov bx,[pcSoundLookup+bx] ; Use byte as index into frequency table
-
- mov al,0b6h ; Write to channel 2 (speaker) timer
- out pcTAccess,al
- mov al,bl
- out pcTimer,al ; Low byte
- mov al,bh
- out pcTimer,al ; High byte
-
- in al,pcSpeaker ; Turn the speaker & gate on
- or al,3
- out pcSpeaker,al
-
- jmp @@pcsame
-
-@@pcoff:
- in al,pcSpeaker ; Turn the speaker & gate off
- and al,0fch ; ~3
- out pcSpeaker,al
-
-@@pcsame:
- dec [pcLengthLeft] ; Decrement length
- jnz @@nopc ; If not 0, we're not done with the sound
-
- mov ax,0
- mov [WORD PTR pcSound],ax ; Zero the pointer
- mov [WORD PTR pcSound + 2],ax
- mov [SoundNumber],ax ; Indicate no sound
- mov [SoundPriority],ax ; with no priority
-
- in al,pcSpeaker ; Turn the speaker off
- and al,0fdh ; ~2
- out pcSpeaker,al
-@@nopc:
-
- les di,[alSound] ; AdLib sound effects
- mov ax,es
- or ax,di
- jz @@noal ; nil pointer - no AdLib effect going
-
- xor ah,ah
- mov al,[es:di]
- or al,al
- jz @@aldone
-
- CALL alOut C,alFreqL,ax
- mov ax,[alBlock]
-
-@@aldone:
- CALL alOut C,alFreqH,ax
- inc [WORD PTR alSound]
- dec [alLengthLeft]
- jnz @@noal
-
- mov ax,0
- mov [WORD PTR alSound],ax ; Zero the pointer
- mov [WORD PTR alSound + 2],ax
- mov [SoundNumber],ax ; Indicate no sound
- mov [SoundPriority],ax ; with no priority
- CALL alOut C,alFreqH,ax ; Turn off the sound
-@@noal:
-
- ENDM
-
-;
-;
-;
- MACRO TIME
- cmp [count_time],2
- jb @@notime
- add [LocalTime],1
- adc [LocalTime+2],0
- add [TimeCount],1
- adc [TimeCount+2],0
- mov [count_time],0
-@@notime:
- ENDM
-
-;
-; COMMONEND
-; Macro used for common suffix code
-;
- MACRO COMMONEND
-@@fullexit:
- pop es
- popa
-
-@@nosave:
- mov ax,[TimerDivisor]
- add [TimerCount],ax
- jnc @@myack
-
- pushf
- call [t0OldService]
- jmp @@out
-
-@@myack:
- mov al,20h
- out 20h,al
-
-@@out:
- pop ax
- pop ds
-
- IF DEBUG
- mov dx,STATUS_REGISTER_1
- in al,dx
- mov dx,ATR_INDEX
- mov al,ATR_OVERSCAN
- out dx,al
- mov al,3 ; blue
- out dx,al
- mov al,20h ; normal
- out dx,al
- pop ax
- pop dx
- ENDIF
-
- iret
- ENDM
-
-;
-; SDL_IndicatePC
-;
- PROC SDL_IndicatePC on:WORD
- PUBLIC SDL_IndicatePC
-
- mov ax,[on]
- mov [cs:pcindicate],ax
- ret
-
- ENDP
-
-;
-; SDL_t0ExtremeAsmService
-; Timer 0 ISR 7000Hz interrupts
-;
- PROC SDL_t0ExtremeAsmService
- PUBLIC SDL_t0ExtremeAsmService
-
- push ax
- mov al,[BYTE PTR cs:pcindicate]
- or al,al
- jz @@done
-
- push ds
- push es
- pusha
-
- mov ds,[cs:MyDS]
-
- les di,[pcSound]
- mov ax,es
- or ax,di
- jz @@donereg ; nil pointer
-
- mov bl,[es:di] ; Get the byte
- inc [WORD PTR pcSound] ; Increment pointer
-
- and bl,11100000b ; Nuke some of the precision (DEBUG - do this in the table)
-
- xor bh,bh
- mov ah,[pcdtab+bx] ; Translate the byte
-
- in al,pcSpeaker
- and al,11111100b
- or al,ah
- out pcSpeaker,al
-
- dec [pcLengthLeft]
- jnz @@donereg
-
- mov [WORD PTR pcSound],0 ; We're done with this sample
- mov [WORD PTR pcSound+2],0
-
- in al,pcSpeaker
- and al,11111100b
- out pcSpeaker,al
-
- call SDL_DigitizedDone
-
-@@donereg:
- popa
- pop es
- pop ds
-
-@@done:
- inc [cs:extreme]
- cmp [cs:extreme],10
- jae @@tofast
-
- mov al,20h
- out 20h,al
- pop ax
- iret
-
-@@tofast:
- mov [cs:extreme],0
- pop ax
-
-; jmp SDL_t0FastAsmService ; Drops through to SDL_t0FastAsmService
-
- ENDP
-
-;
-; SDL_t0FastAsmService
-; Timer 0 ISR for 700Hz interrupts
-;
- PROC SDL_t0FastAsmService
- PUBLIC SDL_t0FastAsmService
-
- COMMONSTART
-
- inc [count_fx] ; Time to do PC/AdLib effects & time?
- cmp [count_fx],5
- jae @@dofull
-
- mov ax,[sqActive] ; Is the sequencer active?
- or ax,ax
- jnz @@dofull
-
- mov ax,[WORD PTR ssSample] ; Is there a sample for the Sound Src?
- or ax,[WORD PTR ssSample+2]
- jz @@nosave
-
-@@dofull:
- pusha
- push es
-
- cmp [count_fx],5
- jb @@nofx
- mov [count_fx],0
- DOFX
-
- inc [count_time]
- TIME
-@@nofx:
-
- mov ax,[sqActive]
- or ax,ax
- jz @@nosq
-
- mov ax,[sqHackLen]
- or ax,ax
- jz @@sqdone
-
- les di,[sqHackPtr]
-@@sqloop:
- mov ax,[WORD PTR sqHackTime+2]
- cmp ax,[WORD PTR alTimeCount+2]
- ja @@sqdone
- mov ax,[WORD PTR sqHackTime]
- cmp ax,[WORD PTR alTimeCount]
- ja @@sqdone
-
- mov ax,[es:di+2] ; Get time to next event
- add ax,[WORD PTR alTimeCount]
- mov [WORD PTR sqHackTime],ax
- mov ax,[WORD PTR alTimeCount+2]
- adc ax,0
- mov [WORD PTR sqHackTime+2],ax
-
- mov ax,[es:di] ; Get register/value pair
- xor bh,bh
- mov bl,ah
- xor ah,ah
- CALL alOut C,ax,bx
-
- add di,4
- mov [WORD PTR sqHackPtr],di
-
- sub [sqHackLen],4
- jnz @@sqloop
-
-@@sqdone:
- add [WORD PTR alTimeCount],1
- adc [WORD PTR alTimeCount+2],0
- mov ax,[sqHackLen]
- or ax,ax
- jnz @@nosq
-
- mov ax,[WORD PTR sqHack] ; Copy pointer
- mov [WORD PTR sqHackPtr],ax
- mov ax,[WORD PTR sqHack+2]
- mov [WORD PTR sqHackPtr+2],ax
-
- mov ax,[sqHackSeqLen] ; Copy length
- mov [sqHackLen],ax
-
- mov ax,0
- mov [WORD PTR alTimeCount],ax ; Reset time counts
- mov [WORD PTR alTimeCount+2],ax
- mov [WORD PTR sqHackTime],ax
- mov [WORD PTR sqHackTime+2],ax
-@@nosq:
-
- les di,[ssSample] ; Get pointer to Sound Source sample
- mov ax,es
- or ax,di
- jz @@ssdone ; If nil, skip this
-
-@@ssloop:
- mov dx,[ssStatus] ; Check to see if FIFO has any empty slots
- in al,dx
- test al,40h
- jnz @@ssdone ; Nope - don't push any more data out
-
- mov dx,[ssData]
- mov al,[es:di] ; al = *ssSample
- out dx,al ; Pump the value out
-
- mov dx,[ssControl] ; Pulse printer select
- mov al,[ssOff]
- out dx,al
- push ax
- pop ax
- mov al,[ssOn]
- out dx,al
-
- push ax ; Delay a short while
- pop ax
-
- inc di
- mov [WORD PTR ssSample],di ; ssSample++
-
- dec [ssLengthLeft]
- jnz @@ssloop
-
- mov [WORD PTR ssSample],0 ; We're done with this sample
- mov [WORD PTR ssSample+2],0
-
- call SDL_DigitizedDone
-@@ssdone:
-
- COMMONEND
-
- ENDP
-
-;
-; SDL_t0SlowAsmService
-; Timer 0 ISR for 140Hz interrupts
-;
- PROC SDL_t0SlowAsmService
- PUBLIC SDL_t0SlowAsmService
-
- IF DEBUG
- push dx
- push ax
- mov dx,STATUS_REGISTER_1
- in al,dx
- mov dx,ATR_INDEX
- mov al,ATR_OVERSCAN
- out dx,al
- mov al,4 ; red
- out dx,al
- ENDIF
-
- push ds
- push ax
-
- mov ds,[cs:MyDS]
-
- inc [count_time]
- TIME
-
- mov ax,[WORD PTR pcSound] ; Is there a PC sound effect going?
- or ax,[WORD PTR pcSound+2]
- jnz @@dofull
-
- mov ax,[WORD PTR alSound] ; Is there an AdLib sound effect going?
- or ax,[WORD PTR alSound+2]
- jz @@nosave
-
-@@dofull:
- pusha
- push es
-
- DOFX
-
- COMMONEND
-
- ENDP
-
- END
--- a/WOLFSRC/ID_US.H
+++ /dev/null
@@ -1,123 +1,0 @@
-//
-// ID Engine
-// ID_US.h - Header file for the User Manager
-// v1.0d1
-// By Jason Blochowiak
-//
-
-#ifndef __ID_US__
-#define __ID_US__
-
-#ifdef __DEBUG__
-#define __DEBUG_UserMgr__
-#endif
-
-//#define HELPTEXTLINKED
-
-#define MaxX 320
-#define MaxY 200
-
-#define MaxHelpLines 500
-
-#define MaxHighName 57
-#define MaxScores 7
-typedef struct
- {
- char name[MaxHighName + 1];
- long score;
- word completed,episode;
- } HighScore;
-
-#define MaxGameName 32
-#define MaxSaveGames 6
-typedef struct
- {
- char signature[4];
- word *oldtest;
- boolean present;
- char name[MaxGameName + 1];
- } SaveGame;
-
-#define MaxString 128 // Maximum input string size
-
-typedef struct
- {
- int x,y,
- w,h,
- px,py;
- } WindowRec; // Record used to save & restore screen windows
-
-typedef enum
- {
- gd_Continue,
- gd_Easy,
- gd_Normal,
- gd_Hard
- } GameDiff;
-
-// Hack import for TED launch support
-extern boolean tedlevel;
-extern int tedlevelnum;
-extern void TEDDeath(void);
-
-extern boolean ingame, // Set by game code if a game is in progress
- abortgame, // Set if a game load failed
- loadedgame, // Set if the current game was loaded
- NoWait,
- HighScoresDirty;
-extern char *abortprogram; // Set to error msg if program is dying
-extern GameDiff restartgame; // Normally gd_Continue, else starts game
-extern word PrintX,PrintY; // Current printing location in the window
-extern word WindowX,WindowY,// Current location of window
- WindowW,WindowH;// Current size of window
-
-extern boolean Button0,Button1,
- CursorBad;
-extern int CursorX,CursorY;
-
-extern void (*USL_MeasureString)(char far *,word *,word *),
- (*USL_DrawString)(char far *);
-
-extern boolean (*USL_SaveGame)(int),(*USL_LoadGame)(int);
-extern void (*USL_ResetGame)(void);
-extern SaveGame Games[MaxSaveGames];
-extern HighScore Scores[];
-
-#define US_HomeWindow() {PrintX = WindowX; PrintY = WindowY;}
-
-extern void US_Startup(void),
- US_Setup(void),
- US_Shutdown(void),
- US_InitRndT(boolean randomize),
- US_SetLoadSaveHooks(boolean (*load)(int),
- boolean (*save)(int),
- void (*reset)(void)),
- US_TextScreen(void),
- US_UpdateTextScreen(void),
- US_FinishTextScreen(void),
- US_DrawWindow(word x,word y,word w,word h),
- US_CenterWindow(word,word),
- US_SaveWindow(WindowRec *win),
- US_RestoreWindow(WindowRec *win),
- US_ClearWindow(void),
- US_SetPrintRoutines(void (*measure)(char far *,word *,word *),
- void (*print)(char far *)),
- US_PrintCentered(char far *s),
- US_CPrint(char far *s),
- US_CPrintLine(char far *s),
- US_Print(char far *s),
- US_PrintUnsigned(longword n),
- US_PrintSigned(long n),
- US_StartCursor(void),
- US_ShutCursor(void),
- US_CheckHighScore(long score,word other),
- US_DisplayHighScores(int which);
-extern boolean US_UpdateCursor(void),
- US_LineInput(int x,int y,char *buf,char *def,boolean escok,
- int maxchars,int maxwidth);
-extern int US_CheckParm(char *parm,char **strings),
- US_RndT(void);
-
- void USL_PrintInCenter(char far *s,Rect r);
- char *USL_GiveSaveName(word game);
-#endif
--- a/WOLFSRC/ID_US_1.C
+++ /dev/null
@@ -1,755 +1,0 @@
-//
-// ID Engine
-// ID_US_1.c - User Manager - General routines
-// v1.1d1
-// By Jason Blochowiak
-// Hacked up for Catacomb 3D
-//
-
-//
-// This module handles dealing with user input & feedback
-//
-// Depends on: Input Mgr, View Mgr, some variables from the Sound, Caching,
-// and Refresh Mgrs, Memory Mgr for background save/restore
-//
-// Globals:
-// ingame - Flag set by game indicating if a game is in progress
-// abortgame - Flag set if the current game should be aborted (if a load
-// game fails)
-// loadedgame - Flag set if a game was loaded
-// abortprogram - Normally nil, this points to a terminal error message
-// if the program needs to abort
-// restartgame - Normally set to gd_Continue, this is set to one of the
-// difficulty levels if a new game should be started
-// PrintX, PrintY - Where the User Mgr will print (global coords)
-// WindowX,WindowY,WindowW,WindowH - The dimensions of the current
-// window
-//
-
-#include "ID_HEADS.H"
-
-#pragma hdrstop
-
-#pragma warn -pia
-
-
-// Global variables
- char *abortprogram;
- boolean NoWait;
- word PrintX,PrintY;
- word WindowX,WindowY,WindowW,WindowH;
-
-// Internal variables
-#define ConfigVersion 1
-
-static char *ParmStrings[] = {"TEDLEVEL","NOWAIT"},
- *ParmStrings2[] = {"COMP","NOCOMP"};
-static boolean US_Started;
-
- boolean Button0,Button1,
- CursorBad;
- int CursorX,CursorY;
-
- void (*USL_MeasureString)(char far *,word *,word *) = VW_MeasurePropString,
- (*USL_DrawString)(char far *) = VWB_DrawPropString;
-
- SaveGame Games[MaxSaveGames];
- HighScore Scores[MaxScores] =
- {
- {"id software-'92",10000,1},
- {"Adrian Carmack",10000,1},
- {"John Carmack",10000,1},
- {"Kevin Cloud",10000,1},
- {"Tom Hall",10000,1},
- {"John Romero",10000,1},
- {"Jay Wilbur",10000,1},
- };
-
-// Internal routines
-
-// Public routines
-
-///////////////////////////////////////////////////////////////////////////
-//
-// USL_HardError() - Handles the Abort/Retry/Fail sort of errors passed
-// from DOS.
-//
-///////////////////////////////////////////////////////////////////////////
-#pragma warn -par
-#pragma warn -rch
-int
-USL_HardError(word errval,int ax,int bp,int si)
-{
-#define IGNORE 0
-#define RETRY 1
-#define ABORT 2
-extern void ShutdownId(void);
-
-static char buf[32];
-static WindowRec wr;
- int di;
- char c,*s,*t;
-
-
- di = _DI;
-
- if (ax < 0)
- s = "Device Error";
- else
- {
- if ((di & 0x00ff) == 0)
- s = "Drive ~ is Write Protected";
- else
- s = "Error on Drive ~";
- for (t = buf;*s;s++,t++) // Can't use sprintf()
- if ((*t = *s) == '~')
- *t = (ax & 0x00ff) + 'A';
- *t = '\0';
- s = buf;
- }
-
- c = peekb(0x40,0x49); // Get the current screen mode
- if ((c < 4) || (c == 7))
- goto oh_kill_me;
-
- // DEBUG - handle screen cleanup
-
- US_SaveWindow(&wr);
- US_CenterWindow(30,3);
- US_CPrint(s);
- US_CPrint("(R)etry or (A)bort?");
- VW_UpdateScreen();
- IN_ClearKeysDown();
-
-asm sti // Let the keyboard interrupts come through
-
- while (true)
- {
- switch (IN_WaitForASCII())
- {
- case key_Escape:
- case 'a':
- case 'A':
- goto oh_kill_me;
- break;
- case key_Return:
- case key_Space:
- case 'r':
- case 'R':
- US_ClearWindow();
- VW_UpdateScreen();
- US_RestoreWindow(&wr);
- return(RETRY);
- break;
- }
- }
-
-oh_kill_me:
- abortprogram = s;
- ShutdownId();
- fprintf(stderr,"Terminal Error: %s\n",s);
- if (tedlevel)
- fprintf(stderr,"You launched from TED. I suggest that you reboot...\n");
-
- return(ABORT);
-#undef IGNORE
-#undef RETRY
-#undef ABORT
-}
-#pragma warn +par
-#pragma warn +rch
-
-
-///////////////////////////////////////////////////////////////////////////
-//
-// US_Startup() - Starts the User Mgr
-//
-///////////////////////////////////////////////////////////////////////////
-void
-US_Startup(void)
-{
- int i,n;
-
- if (US_Started)
- return;
-
- harderr(USL_HardError); // Install the fatal error handler
-
- US_InitRndT(true); // Initialize the random number generator
-
- for (i = 1;i < _argc;i++)
- {
- switch (US_CheckParm(_argv[i],ParmStrings2))
- {
- case 0:
- compatability = true;
- break;
- case 1:
- compatability = false;
- break;
- }
- }
-
- // Check for TED launching here
- for (i = 1;i < _argc;i++)
- {
- n = US_CheckParm(_argv[i],ParmStrings);
- switch(n)
- {
- case 0:
- tedlevelnum = atoi(_argv[i + 1]);
- if (tedlevelnum >= 0)
- tedlevel = true;
- break;
-
- case 1:
- NoWait = true;
- break;
- }
- }
-
- US_Started = true;
-}
-
-
-///////////////////////////////////////////////////////////////////////////
-//
-// US_Shutdown() - Shuts down the User Mgr
-//
-///////////////////////////////////////////////////////////////////////////
-void
-US_Shutdown(void)
-{
- if (!US_Started)
- return;
-
- US_Started = false;
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// US_CheckParm() - checks to see if a string matches one of a set of
-// strings. The check is case insensitive. The routine returns the
-// index of the string that matched, or -1 if no matches were found
-//
-///////////////////////////////////////////////////////////////////////////
-int
-US_CheckParm(char *parm,char **strings)
-{
- char cp,cs,
- *p,*s;
- int i;
-
- while (!isalpha(*parm)) // Skip non-alphas
- parm++;
-
- for (i = 0;*strings && **strings;i++)
- {
- for (s = *strings++,p = parm,cs = cp = 0;cs == cp;)
- {
- cs = *s++;
- if (!cs)
- return(i);
- cp = *p++;
-
- if (isupper(cs))
- cs = tolower(cs);
- if (isupper(cp))
- cp = tolower(cp);
- }
- }
- return(-1);
-}
-
-
-// Window/Printing routines
-
-///////////////////////////////////////////////////////////////////////////
-//
-// US_SetPrintRoutines() - Sets the routines used to measure and print
-// from within the User Mgr. Primarily provided to allow switching
-// between masked and non-masked fonts
-//
-///////////////////////////////////////////////////////////////////////////
-void
-US_SetPrintRoutines(void (*measure)(char far *,word *,word *),void (*print)(char far *))
-{
- USL_MeasureString = measure;
- USL_DrawString = print;
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// US_Print() - Prints a string in the current window. Newlines are
-// supported.
-//
-///////////////////////////////////////////////////////////////////////////
-void
-US_Print(char far *s)
-{
- char c,far *se;
- word w,h;
-
- while (*s)
- {
- se = s;
- while ((c = *se) && (c != '\n'))
- se++;
- *se = '\0';
-
- USL_MeasureString(s,&w,&h);
- px = PrintX;
- py = PrintY;
- USL_DrawString(s);
-
- s = se;
- if (c)
- {
- *se = c;
- s++;
-
- PrintX = WindowX;
- PrintY += h;
- }
- else
- PrintX += w;
- }
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// US_PrintUnsigned() - Prints an unsigned long
-//
-///////////////////////////////////////////////////////////////////////////
-void
-US_PrintUnsigned(longword n)
-{
- char buffer[32];
-
- US_Print(ultoa(n,buffer,10));
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// US_PrintSigned() - Prints a signed long
-//
-///////////////////////////////////////////////////////////////////////////
-void
-US_PrintSigned(long n)
-{
- char buffer[32];
-
- US_Print(ltoa(n,buffer,10));
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// USL_PrintInCenter() - Prints a string in the center of the given rect
-//
-///////////////////////////////////////////////////////////////////////////
-void
-USL_PrintInCenter(char far *s,Rect r)
-{
- word w,h,
- rw,rh;
-
- USL_MeasureString(s,&w,&h);
- rw = r.lr.x - r.ul.x;
- rh = r.lr.y - r.ul.y;
-
- px = r.ul.x + ((rw - w) / 2);
- py = r.ul.y + ((rh - h) / 2);
- USL_DrawString(s);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// US_PrintCentered() - Prints a string centered in the current window.
-//
-///////////////////////////////////////////////////////////////////////////
-void
-US_PrintCentered(char far *s)
-{
- Rect r;
-
- r.ul.x = WindowX;
- r.ul.y = WindowY;
- r.lr.x = r.ul.x + WindowW;
- r.lr.y = r.ul.y + WindowH;
-
- USL_PrintInCenter(s,r);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// US_CPrintLine() - Prints a string centered on the current line and
-// advances to the next line. Newlines are not supported.
-//
-///////////////////////////////////////////////////////////////////////////
-void
-US_CPrintLine(char far *s)
-{
- word w,h;
-
- USL_MeasureString(s,&w,&h);
-
- if (w > WindowW)
- Quit("US_CPrintLine() - String exceeds width");
- px = WindowX + ((WindowW - w) / 2);
- py = PrintY;
- USL_DrawString(s);
- PrintY += h;
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// US_CPrint() - Prints a string in the current window. Newlines are
-// supported.
-//
-///////////////////////////////////////////////////////////////////////////
-void
-US_CPrint(char far *s)
-{
- char c,far *se;
-
- while (*s)
- {
- se = s;
- while ((c = *se) && (c != '\n'))
- se++;
- *se = '\0';
-
- US_CPrintLine(s);
-
- s = se;
- if (c)
- {
- *se = c;
- s++;
- }
- }
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// US_ClearWindow() - Clears the current window to white and homes the
-// cursor
-//
-///////////////////////////////////////////////////////////////////////////
-void
-US_ClearWindow(void)
-{
- VWB_Bar(WindowX,WindowY,WindowW,WindowH,WHITE);
- PrintX = WindowX;
- PrintY = WindowY;
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// US_DrawWindow() - Draws a frame and sets the current window parms
-//
-///////////////////////////////////////////////////////////////////////////
-void
-US_DrawWindow(word x,word y,word w,word h)
-{
- word i,
- sx,sy,sw,sh;
-
- WindowX = x * 8;
- WindowY = y * 8;
- WindowW = w * 8;
- WindowH = h * 8;
-
- PrintX = WindowX;
- PrintY = WindowY;
-
- sx = (x - 1) * 8;
- sy = (y - 1) * 8;
- sw = (w + 1) * 8;
- sh = (h + 1) * 8;
-
- US_ClearWindow();
-
- VWB_DrawTile8(sx,sy,0),VWB_DrawTile8(sx,sy + sh,5);
- for (i = sx + 8;i <= sx + sw - 8;i += 8)
- VWB_DrawTile8(i,sy,1),VWB_DrawTile8(i,sy + sh,6);
- VWB_DrawTile8(i,sy,2),VWB_DrawTile8(i,sy + sh,7);
-
- for (i = sy + 8;i <= sy + sh - 8;i += 8)
- VWB_DrawTile8(sx,i,3),VWB_DrawTile8(sx + sw,i,4);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// US_CenterWindow() - Generates a window of a given width & height in the
-// middle of the screen
-//
-///////////////////////////////////////////////////////////////////////////
-void
-US_CenterWindow(word w,word h)
-{
- US_DrawWindow(((MaxX / 8) - w) / 2,((MaxY / 8) - h) / 2,w,h);
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// US_SaveWindow() - Saves the current window parms into a record for
-// later restoration
-//
-///////////////////////////////////////////////////////////////////////////
-void
-US_SaveWindow(WindowRec *win)
-{
- win->x = WindowX;
- win->y = WindowY;
- win->w = WindowW;
- win->h = WindowH;
-
- win->px = PrintX;
- win->py = PrintY;
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// US_RestoreWindow() - Sets the current window parms to those held in the
-// record
-//
-///////////////////////////////////////////////////////////////////////////
-void
-US_RestoreWindow(WindowRec *win)
-{
- WindowX = win->x;
- WindowY = win->y;
- WindowW = win->w;
- WindowH = win->h;
-
- PrintX = win->px;
- PrintY = win->py;
-}
-
-// Input routines
-
-///////////////////////////////////////////////////////////////////////////
-//
-// USL_XORICursor() - XORs the I-bar text cursor. Used by US_LineInput()
-//
-///////////////////////////////////////////////////////////////////////////
-static void
-USL_XORICursor(int x,int y,char *s,word cursor)
-{
- static boolean status; // VGA doesn't XOR...
- char buf[MaxString];
- int temp;
- word w,h;
-
- strcpy(buf,s);
- buf[cursor] = '\0';
- USL_MeasureString(buf,&w,&h);
-
- px = x + w - 1;
- py = y;
- if (status^=1)
- USL_DrawString("\x80");
- else
- {
- temp = fontcolor;
- fontcolor = backcolor;
- USL_DrawString("\x80");
- fontcolor = temp;
- }
-
-}
-
-///////////////////////////////////////////////////////////////////////////
-//
-// US_LineInput() - Gets a line of user input at (x,y), the string defaults
-// to whatever is pointed at by def. Input is restricted to maxchars
-// chars or maxwidth pixels wide. If the user hits escape (and escok is
-// true), nothing is copied into buf, and false is returned. If the
-// user hits return, the current string is copied into buf, and true is
-// returned
-//
-///////////////////////////////////////////////////////////////////////////
-boolean
-US_LineInput(int x,int y,char *buf,char *def,boolean escok,
- int maxchars,int maxwidth)
-{
- boolean redraw,
- cursorvis,cursormoved,
- done,result;
- ScanCode sc;
- char c,
- s[MaxString],olds[MaxString];
- word i,
- cursor,
- w,h,
- len,temp;
- longword lasttime;
-
- if (def)
- strcpy(s,def);
- else
- *s = '\0';
- *olds = '\0';
- cursor = strlen(s);
- cursormoved = redraw = true;
-
- cursorvis = done = false;
- lasttime = TimeCount;
- LastASCII = key_None;
- LastScan = sc_None;
-
- while (!done)
- {
- if (cursorvis)
- USL_XORICursor(x,y,s,cursor);
-
- asm pushf
- asm cli
-
- sc = LastScan;
- LastScan = sc_None;
- c = LastASCII;
- LastASCII = key_None;
-
- asm popf
-
- switch (sc)
- {
- case sc_LeftArrow:
- if (cursor)
- cursor--;
- c = key_None;
- cursormoved = true;
- break;
- case sc_RightArrow:
- if (s[cursor])
- cursor++;
- c = key_None;
- cursormoved = true;
- break;
- case sc_Home:
- cursor = 0;
- c = key_None;
- cursormoved = true;
- break;
- case sc_End:
- cursor = strlen(s);
- c = key_None;
- cursormoved = true;
- break;
-
- case sc_Return:
- strcpy(buf,s);
- done = true;
- result = true;
- c = key_None;
- break;
- case sc_Escape:
- if (escok)
- {
- done = true;
- result = false;
- }
- c = key_None;
- break;
-
- case sc_BackSpace:
- if (cursor)
- {
- strcpy(s + cursor - 1,s + cursor);
- cursor--;
- redraw = true;
- }
- c = key_None;
- cursormoved = true;
- break;
- case sc_Delete:
- if (s[cursor])
- {
- strcpy(s + cursor,s + cursor + 1);
- redraw = true;
- }
- c = key_None;
- cursormoved = true;
- break;
-
- case 0x4c: // Keypad 5
- case sc_UpArrow:
- case sc_DownArrow:
- case sc_PgUp:
- case sc_PgDn:
- case sc_Insert:
- c = key_None;
- break;
- }
-
- if (c)
- {
- len = strlen(s);
- USL_MeasureString(s,&w,&h);
-
- if
- (
- isprint(c)
- && (len < MaxString - 1)
- && ((!maxchars) || (len < maxchars))
- && ((!maxwidth) || (w < maxwidth))
- )
- {
- for (i = len + 1;i > cursor;i--)
- s[i] = s[i - 1];
- s[cursor++] = c;
- redraw = true;
- }
- }
-
- if (redraw)
- {
- px = x;
- py = y;
- temp = fontcolor;
- fontcolor = backcolor;
- USL_DrawString(olds);
- fontcolor = temp;
- strcpy(olds,s);
-
- px = x;
- py = y;
- USL_DrawString(s);
-
- redraw = false;
- }
-
- if (cursormoved)
- {
- cursorvis = false;
- lasttime = TimeCount - TickBase;
-
- cursormoved = false;
- }
- if (TimeCount - lasttime > TickBase / 2)
- {
- lasttime = TimeCount;
-
- cursorvis ^= true;
- }
- if (cursorvis)
- USL_XORICursor(x,y,s,cursor);
-
- VW_UpdateScreen();
- }
-
- if (cursorvis)
- USL_XORICursor(x,y,s,cursor);
- if (!result)
- {
- px = x;
- py = y;
- USL_DrawString(olds);
- }
- VW_UpdateScreen();
-
- IN_ClearKeysDown();
- return(result);
-}
--- a/WOLFSRC/ID_US_A.ASM
+++ /dev/null
@@ -1,101 +1,0 @@
-IDEAL
-MODEL MEDIUM,C
-
-; Assembly portion of the User Mgr. This is just John Carmack's table
-; driven pseudo-random number generator, and we put it in the User Mgr
-; because we couldn't figure out where it should go
-
-
-;============================================================================
-;
-; RANDOM ROUTINES
-;
-;============================================================================
-
- FARDATA
-
-rndindex dw ?
-
-rndtable db 0, 8, 109, 220, 222, 241, 149, 107, 75, 248, 254, 140, 16, 66
- db 74, 21, 211, 47, 80, 242, 154, 27, 205, 128, 161, 89, 77, 36
- db 95, 110, 85, 48, 212, 140, 211, 249, 22, 79, 200, 50, 28, 188
- db 52, 140, 202, 120, 68, 145, 62, 70, 184, 190, 91, 197, 152, 224
- db 149, 104, 25, 178, 252, 182, 202, 182, 141, 197, 4, 81, 181, 242
- db 145, 42, 39, 227, 156, 198, 225, 193, 219, 93, 122, 175, 249, 0
- db 175, 143, 70, 239, 46, 246, 163, 53, 163, 109, 168, 135, 2, 235
- db 25, 92, 20, 145, 138, 77, 69, 166, 78, 176, 173, 212, 166, 113
- db 94, 161, 41, 50, 239, 49, 111, 164, 70, 60, 2, 37, 171, 75
- db 136, 156, 11, 56, 42, 146, 138, 229, 73, 146, 77, 61, 98, 196
- db 135, 106, 63, 197, 195, 86, 96, 203, 113, 101, 170, 247, 181, 113
- db 80, 250, 108, 7, 255, 237, 129, 226, 79, 107, 112, 166, 103, 241
- db 24, 223, 239, 120, 198, 58, 60, 82, 128, 3, 184, 66, 143, 224
- db 145, 224, 81, 206, 163, 45, 63, 90, 168, 114, 59, 33, 159, 95
- db 28, 139, 123, 98, 125, 196, 15, 70, 194, 253, 54, 14, 109, 226
- db 71, 17, 161, 93, 186, 87, 244, 138, 20, 52, 123, 251, 26, 36
- db 17, 46, 52, 231, 232, 76, 31, 221, 84, 37, 216, 165, 212, 106
- db 197, 242, 98, 43, 39, 175, 254, 145, 190, 84, 118, 222, 187, 136
- db 120, 163, 236, 249
-
-PUBLIC rndtable
-
- CODESEG
-
-LastRnd dw ?
-
-;=================================================
-;
-; void US_InitRndT (boolean randomize)
-; Init table based RND generator
-; if randomize is false, the counter is set to 0
-;
-;=================================================
-
-PROC US_InitRndT randomize:word
- uses si,di
- public US_InitRndT
-
- mov ax,SEG rndtable
- mov es,ax
-
- mov ax,[randomize]
- or ax,ax
- jne @@timeit ;if randomize is true, really random
-
- mov dx,0 ;set to a definite value
- jmp @@setit
-
-@@timeit:
- mov ah,2ch
- int 21h ;GetSystemTime
- and dx,0ffh
-
-@@setit:
- mov [es:rndindex],dx
- ret
-
-ENDP
-
-;=================================================
-;
-; int US_RndT (void)
-; Return a random # between 0-255
-; Exit : AX = value
-;
-;=================================================
-PROC US_RndT
- public US_RndT
-
- mov ax,SEG rndtable
- mov es,ax
- mov bx,[es:rndindex]
- inc bx
- and bx,0ffh
- mov [es:rndindex],bx
- mov al,[es:rndtable+BX]
- xor ah,ah
- ret
-
-ENDP
-
-END
-
--- a/WOLFSRC/ID_VH.C
+++ /dev/null
@@ -1,547 +1,0 @@
-// ID_VH.C
-
-#include "ID_HEADS.H"
-
-#define SCREENWIDTH 80
-#define CHARWIDTH 2
-#define TILEWIDTH 4
-#define GRPLANES 4
-#define BYTEPIXELS 4
-
-#define SCREENXMASK (~3)
-#define SCREENXPLUS (3)
-#define SCREENXDIV (4)
-
-#define VIEWWIDTH 80
-
-#define PIXTOBLOCK 4 // 16 pixels to an update block
-
-#define UNCACHEGRCHUNK(chunk) {MM_FreePtr(&grsegs[chunk]);grneeded[chunk]&=~ca_levelbit;}
-
-byte update[UPDATEHIGH][UPDATEWIDE];
-
-//==========================================================================
-
-pictabletype _seg *pictable;
-
-
-int px,py;
-byte fontcolor,backcolor;
-int fontnumber;
-int bufferwidth,bufferheight;
-
-
-//==========================================================================
-
-void VWL_UpdateScreenBlocks (void);
-
-//==========================================================================
-
-void VW_DrawPropString (char far *string)
-{
- fontstruct far *font;
- int width,step,height,i;
- byte far *source, far *dest, far *origdest;
- byte ch,mask;
-
- font = (fontstruct far *)grsegs[STARTFONT+fontnumber];
- height = bufferheight = font->height;
- dest = origdest = MK_FP(SCREENSEG,bufferofs+ylookup[py]+(px>>2));
- mask = 1<<(px&3);
-
-
- while ((ch = *string++)!=0)
- {
- width = step = font->width[ch];
- source = ((byte far *)font)+font->location[ch];
- while (width--)
- {
- VGAMAPMASK(mask);
-
-asm mov ah,[BYTE PTR fontcolor]
-asm mov bx,[step]
-asm mov cx,[height]
-asm mov dx,[linewidth]
-asm lds si,[source]
-asm les di,[dest]
-
-vertloop:
-asm mov al,[si]
-asm or al,al
-asm je next
-asm mov [es:di],ah // draw color
-
-next:
-asm add si,bx
-asm add di,dx
-asm loop vertloop
-asm mov ax,ss
-asm mov ds,ax
-
- source++;
- px++;
- mask <<= 1;
- if (mask == 16)
- {
- mask = 1;
- dest++;
- }
- }
- }
-bufferheight = height;
-bufferwidth = ((dest+1)-origdest)*4;
-}
-
-
-void VW_DrawColorPropString (char far *string)
-{
- fontstruct far *font;
- int width,step,height,i;
- byte far *source, far *dest, far *origdest;
- byte ch,mask;
-
- font = (fontstruct far *)grsegs[STARTFONT+fontnumber];
- height = bufferheight = font->height;
- dest = origdest = MK_FP(SCREENSEG,bufferofs+ylookup[py]+(px>>2));
- mask = 1<<(px&3);
-
-
- while ((ch = *string++)!=0)
- {
- width = step = font->width[ch];
- source = ((byte far *)font)+font->location[ch];
- while (width--)
- {
- VGAMAPMASK(mask);
-
-asm mov ah,[BYTE PTR fontcolor]
-asm mov bx,[step]
-asm mov cx,[height]
-asm mov dx,[linewidth]
-asm lds si,[source]
-asm les di,[dest]
-
-vertloop:
-asm mov al,[si]
-asm or al,al
-asm je next
-asm mov [es:di],ah // draw color
-
-next:
-asm add si,bx
-asm add di,dx
-
-asm rcr cx,1 // inc font color
-asm jc cont
-asm inc ah
-
-cont:
-asm rcl cx,1
-asm loop vertloop
-asm mov ax,ss
-asm mov ds,ax
-
- source++;
- px++;
- mask <<= 1;
- if (mask == 16)
- {
- mask = 1;
- dest++;
- }
- }
- }
-bufferheight = height;
-bufferwidth = ((dest+1)-origdest)*4;
-}
-
-
-//==========================================================================
-
-
-/*
-=================
-=
-= VL_MungePic
-=
-=================
-*/
-
-void VL_MungePic (byte far *source, unsigned width, unsigned height)
-{
- unsigned x,y,plane,size,pwidth;
- byte _seg *temp, far *dest, far *srcline;
-
- size = width*height;
-
- if (width&3)
- MS_Quit ("VL_MungePic: Not divisable by 4!");
-
-//
-// copy the pic to a temp buffer
-//
- MM_GetPtr (&(memptr)temp,size);
- _fmemcpy (temp,source,size);
-
-//
-// munge it back into the original buffer
-//
- dest = source;
- pwidth = width/4;
-
- for (plane=0;plane<4;plane++)
- {
- srcline = temp;
- for (y=0;y<height;y++)
- {
- for (x=0;x<pwidth;x++)
- *dest++ = *(srcline+x*4+plane);
- srcline+=width;
- }
- }
-
- MM_FreePtr (&(memptr)temp);
-}
-
-void VWL_MeasureString (char far *string, word *width, word *height
- , fontstruct _seg *font)
-{
- *height = font->height;
- for (*width = 0;*string;string++)
- *width += font->width[*((byte far *)string)]; // proportional width
-}
-
-void VW_MeasurePropString (char far *string, word *width, word *height)
-{
- VWL_MeasureString(string,width,height,(fontstruct _seg *)grsegs[STARTFONT+fontnumber]);
-}
-
-void VW_MeasureMPropString (char far *string, word *width, word *height)
-{
- VWL_MeasureString(string,width,height,(fontstruct _seg *)grsegs[STARTFONTM+fontnumber]);
-}
-
-
-
-/*
-=============================================================================
-
- Double buffer management routines
-
-=============================================================================
-*/
-
-
-/*
-=======================
-=
-= VW_MarkUpdateBlock
-=
-= Takes a pixel bounded block and marks the tiles in bufferblocks
-= Returns 0 if the entire block is off the buffer screen
-=
-=======================
-*/
-
-int VW_MarkUpdateBlock (int x1, int y1, int x2, int y2)
-{
- int x,y,xt1,yt1,xt2,yt2,nextline;
- byte *mark;
-
- xt1 = x1>>PIXTOBLOCK;
- yt1 = y1>>PIXTOBLOCK;
-
- xt2 = x2>>PIXTOBLOCK;
- yt2 = y2>>PIXTOBLOCK;
-
- if (xt1<0)
- xt1=0;
- else if (xt1>=UPDATEWIDE)
- return 0;
-
- if (yt1<0)
- yt1=0;
- else if (yt1>UPDATEHIGH)
- return 0;
-
- if (xt2<0)
- return 0;
- else if (xt2>=UPDATEWIDE)
- xt2 = UPDATEWIDE-1;
-
- if (yt2<0)
- return 0;
- else if (yt2>=UPDATEHIGH)
- yt2 = UPDATEHIGH-1;
-
- mark = updateptr + uwidthtable[yt1] + xt1;
- nextline = UPDATEWIDE - (xt2-xt1) - 1;
-
- for (y=yt1;y<=yt2;y++)
- {
- for (x=xt1;x<=xt2;x++)
- *mark++ = 1; // this tile will need to be updated
-
- mark += nextline;
- }
-
- return 1;
-}
-
-void VWB_DrawTile8 (int x, int y, int tile)
-{
- if (VW_MarkUpdateBlock (x,y,x+7,y+7))
- LatchDrawChar(x,y,tile);
-}
-
-void VWB_DrawTile8M (int x, int y, int tile)
-{
- if (VW_MarkUpdateBlock (x,y,x+7,y+7))
- VL_MemToScreen (((byte far *)grsegs[STARTTILE8M])+tile*64,8,8,x,y);
-}
-
-
-void VWB_DrawPic (int x, int y, int chunknum)
-{
- int picnum = chunknum - STARTPICS;
- unsigned width,height;
-
- x &= ~7;
-
- width = pictable[picnum].width;
- height = pictable[picnum].height;
-
- if (VW_MarkUpdateBlock (x,y,x+width-1,y+height-1))
- VL_MemToScreen (grsegs[chunknum],width,height,x,y);
-}
-
-
-
-void VWB_DrawPropString (char far *string)
-{
- int x;
- x=px;
- VW_DrawPropString (string);
- VW_MarkUpdateBlock(x,py,px-1,py+bufferheight-1);
-}
-
-
-void VWB_Bar (int x, int y, int width, int height, int color)
-{
- if (VW_MarkUpdateBlock (x,y,x+width,y+height-1) )
- VW_Bar (x,y,width,height,color);
-}
-
-void VWB_Plot (int x, int y, int color)
-{
- if (VW_MarkUpdateBlock (x,y,x,y))
- VW_Plot(x,y,color);
-}
-
-void VWB_Hlin (int x1, int x2, int y, int color)
-{
- if (VW_MarkUpdateBlock (x1,y,x2,y))
- VW_Hlin(x1,x2,y,color);
-}
-
-void VWB_Vlin (int y1, int y2, int x, int color)
-{
- if (VW_MarkUpdateBlock (x,y1,x,y2))
- VW_Vlin(y1,y2,x,color);
-}
-
-void VW_UpdateScreen (void)
-{
- VH_UpdateScreen ();
-}
-
-
-/*
-=============================================================================
-
- WOLFENSTEIN STUFF
-
-=============================================================================
-*/
-
-/*
-=====================
-=
-= LatchDrawPic
-=
-=====================
-*/
-
-void LatchDrawPic (unsigned x, unsigned y, unsigned picnum)
-{
- unsigned wide, height, source;
-
- wide = pictable[picnum-STARTPICS].width;
- height = pictable[picnum-STARTPICS].height;
- source = latchpics[2+picnum-LATCHPICS_LUMP_START];
-
- VL_LatchToScreen (source,wide/4,height,x*8,y);
-}
-
-
-//==========================================================================
-
-/*
-===================
-=
-= LoadLatchMem
-=
-===================
-*/
-
-void LoadLatchMem (void)
-{
- int i,j,p,m,width,height,start,end;
- byte far *src;
- unsigned destoff;
-
-//
-// tile 8s
-//
- latchpics[0] = freelatch;
- CA_CacheGrChunk (STARTTILE8);
- src = (byte _seg *)grsegs[STARTTILE8];
- destoff = freelatch;
-
- for (i=0;i<NUMTILE8;i++)
- {
- VL_MemToLatch (src,8,8,destoff);
- src += 64;
- destoff +=16;
- }
- UNCACHEGRCHUNK (STARTTILE8);
-
-#if 0 // ran out of latch space!
-//
-// tile 16s
-//
- src = (byte _seg *)grsegs[STARTTILE16];
- latchpics[1] = destoff;
-
- for (i=0;i<NUMTILE16;i++)
- {
- CA_CacheGrChunk (STARTTILE16+i);
- src = (byte _seg *)grsegs[STARTTILE16+i];
- VL_MemToLatch (src,16,16,destoff);
- destoff+=64;
- if (src)
- UNCACHEGRCHUNK (STARTTILE16+i);
- }
-#endif
-
-//
-// pics
-//
- start = LATCHPICS_LUMP_START;
- end = LATCHPICS_LUMP_END;
-
- for (i=start;i<=end;i++)
- {
- latchpics[2+i-start] = destoff;
- CA_CacheGrChunk (i);
- width = pictable[i-STARTPICS].width;
- height = pictable[i-STARTPICS].height;
- VL_MemToLatch (grsegs[i],width,height,destoff);
- destoff += width/4 *height;
- UNCACHEGRCHUNK(i);
- }
-
- EGAMAPMASK(15);
-}
-
-//==========================================================================
-
-/*
-===================
-=
-= FizzleFade
-=
-= returns true if aborted
-=
-===================
-*/
-
-extern ControlInfo c;
-
-boolean FizzleFade (unsigned source, unsigned dest,
- unsigned width,unsigned height, unsigned frames, boolean abortable)
-{
- int pixperframe;
- unsigned drawofs,pagedelta;
- byte mask,maskb[8] = {1,2,4,8};
- unsigned x,y,p,frame;
- long rndval;
-
- pagedelta = dest-source;
- rndval = 1;
- y = 0;
- pixperframe = 64000/frames;
-
- IN_StartAck ();
-
- TimeCount=frame=0;
- do // while (1)
- {
- if (abortable && IN_CheckAck () )
- return true;
-
- asm mov es,[screenseg]
-
- for (p=0;p<pixperframe;p++)
- {
- //
- // seperate random value into x/y pair
- //
- asm mov ax,[WORD PTR rndval]
- asm mov dx,[WORD PTR rndval+2]
- asm mov bx,ax
- asm dec bl
- asm mov [BYTE PTR y],bl // low 8 bits - 1 = y xoordinate
- asm mov bx,ax
- asm mov cx,dx
- asm mov [BYTE PTR x],ah // next 9 bits = x xoordinate
- asm mov [BYTE PTR x+1],dl
- //
- // advance to next random element
- //
- asm shr dx,1
- asm rcr ax,1
- asm jnc noxor
- asm xor dx,0x0001
- asm xor ax,0x2000
-noxor:
- asm mov [WORD PTR rndval],ax
- asm mov [WORD PTR rndval+2],dx
-
- if (x>width || y>height)
- continue;
- drawofs = source+ylookup[y] + (x>>2);
-
- //
- // copy one pixel
- //
- mask = x&3;
- VGAREADMAP(mask);
- mask = maskb[mask];
- VGAMAPMASK(mask);
-
- asm mov di,[drawofs]
- asm mov al,[es:di]
- asm add di,[pagedelta]
- asm mov [es:di],al
-
- if (rndval == 1) // entire sequence has been completed
- return false;
- }
- frame++;
- while (TimeCount<frame) // don't go too fast
- ;
- } while (1);
-
-
-}
--- a/WOLFSRC/ID_VH.H
+++ /dev/null
@@ -1,134 +1,0 @@
-// ID_VH.H
-
-
-#define WHITE 15 // graphics mode independant colors
-#define BLACK 0
-#define FIRSTCOLOR 1
-#define SECONDCOLOR 12
-#define F_WHITE 15
-#define F_BLACK 0
-#define F_FIRSTCOLOR 1
-#define F_SECONDCOLOR 12
-
-//===========================================================================
-
-#define MAXSHIFTS 1
-
-typedef struct
-{
- int width,
- height,
- orgx,orgy,
- xl,yl,xh,yh,
- shifts;
-} spritetabletype;
-
-typedef struct
-{
- unsigned sourceoffset[MAXSHIFTS];
- unsigned planesize[MAXSHIFTS];
- unsigned width[MAXSHIFTS];
- byte data[];
-} spritetype; // the memptr for each sprite points to this
-
-typedef struct
-{
- int width,height;
-} pictabletype;
-
-
-typedef struct
-{
- int height;
- int location[256];
- char width[256];
-} fontstruct;
-
-
-//===========================================================================
-
-
-extern pictabletype _seg *pictable;
-extern pictabletype _seg *picmtable;
-extern spritetabletype _seg *spritetable;
-
-extern byte fontcolor;
-extern int fontnumber;
-extern int px,py;
-
-//
-// Double buffer management routines
-//
-
-void VW_InitDoubleBuffer (void);
-int VW_MarkUpdateBlock (int x1, int y1, int x2, int y2);
-void VW_UpdateScreen (void);
-
-//
-// mode independant routines
-// coordinates in pixels, rounded to best screen res
-// regions marked in double buffer
-//
-
-void VWB_DrawTile8 (int x, int y, int tile);
-void VWB_DrawTile8M (int x, int y, int tile);
-void VWB_DrawTile16 (int x, int y, int tile);
-void VWB_DrawTile16M (int x, int y, int tile);
-void VWB_DrawPic (int x, int y, int chunknum);
-void VWB_DrawMPic(int x, int y, int chunknum);
-void VWB_Bar (int x, int y, int width, int height, int color);
-
-void VWB_DrawPropString (char far *string);
-void VWB_DrawMPropString (char far *string);
-void VWB_DrawSprite (int x, int y, int chunknum);
-void VWB_Plot (int x, int y, int color);
-void VWB_Hlin (int x1, int x2, int y, int color);
-void VWB_Vlin (int y1, int y2, int x, int color);
-
-
-//
-// wolfenstein EGA compatability stuff
-//
-extern byte far gamepal;
-
-void VH_SetDefaultColors (void);
-
-#define VW_Startup VL_Startup
-#define VW_Shutdown VL_Shutdown
-#define VW_SetCRTC VL_SetCRTC
-#define VW_SetScreen VL_SetScreen
-#define VW_Bar VL_Bar
-#define VW_Plot VL_Plot
-#define VW_Hlin(x,z,y,c) VL_Hlin(x,y,(z)-(x)+1,c)
-#define VW_Vlin(y,z,x,c) VL_Vlin(x,y,(z)-(y)+1,c)
-#define VW_DrawPic VH_DrawPic
-#define VW_SetSplitScreen VL_SetSplitScreen
-#define VW_SetLineWidth VL_SetLineWidth
-#define VW_ColorBorder VL_ColorBorder
-#define VW_WaitVBL VL_WaitVBL
-#define VW_FadeIn() VL_FadeIn(0,255,&gamepal,30);
-#define VW_FadeOut() VL_FadeOut(0,255,0,0,0,30);
-#define VW_ScreenToScreen VL_ScreenToScreen
-#define VW_SetDefaultColors VH_SetDefaultColors
-void VW_MeasurePropString (char far *string, word *width, word *height);
-#define EGAMAPMASK(x) VGAMAPMASK(x)
-#define EGAWRITEMODE(x) VGAWRITEMODE(x)
-
-//#define VW_MemToScreen VL_MemToLatch
-
-#define MS_Quit Quit
-
-
-#define LatchDrawChar(x,y,p) VL_LatchToScreen(latchpics[0]+(p)*16,2,8,x,y)
-#define LatchDrawTile(x,y,p) VL_LatchToScreen(latchpics[1]+(p)*64,4,16,x,y)
-
-void LatchDrawPic (unsigned x, unsigned y, unsigned picnum);
-void LoadLatchMem (void);
-boolean FizzleFade (unsigned source, unsigned dest,
- unsigned width,unsigned height, unsigned frames,boolean abortable);
-
-
-#define NUMLATCHPICS 100
-extern unsigned latchpics[NUMLATCHPICS];
-extern unsigned freelatch;
-
--- a/WOLFSRC/ID_VH_A.ASM
+++ /dev/null
@@ -1,110 +1,0 @@
-; ID_VL.ASM
-
- IDEAL
- MODEL MEDIUM,C
-
- INCLUDE 'ID_VL.EQU'
-
-SCREENSEG = 0a000h
-
-UPDATEWIDE = 20
-UPDATEHIGH = 13
-
- DATASEG
-
-
-EXTRN bufferofs :WORD
-EXTRN displayofs :WORD
-EXTRN ylookup :WORD
-EXTRN linewidth :WORD
-EXTRN blockstarts :WORD ;offsets from drawofs for each update block
-
-EXTRN update :BYTE
-
- CODESEG
-
-
-;=================
-;
-; VH_UpdateScreen
-;
-;=================
-
-PROC VH_UpdateScreen
-PUBLIC VH_UpdateScreen
-USES si,di
-
- mov dx,SC_INDEX
- mov ax,SC_MAPMASK+15*256
- out dx,ax
-
- mov dx,GC_INDEX
- mov al,GC_MODE
- out dx,al
-
- inc dx
- in al,dx
- and al,252
- or al,1
- out dx,al
-
- mov bx,UPDATEWIDE*UPDATEHIGH-1 ; bx is the tile number
- mov dx,[linewidth]
-
-;
-; see if the tile needs to be copied
-;
-@@checktile:
- test [update+bx],1
- jnz @@copytile
-@@next:
- dec bx
- jns @@checktile
-
-;
-; done
-;
- mov dx,GC_INDEX+1
- in al,dx
- and al,NOT 3
- or al,0
- out dx,al
- ret
-
-;
-; copy a tile
-;
-@@copytile:
- mov [update+bx],0
- shl bx,1
- mov si,[blockstarts+bx]
- shr bx,1
- mov di,si
- add si,[bufferofs]
- add di,[displayofs]
-
- mov ax,SCREENSEG
- mov ds,ax
-
-REPT 16
- mov al,[si]
- mov [di],al
- mov al,[si+1]
- mov [di+1],al
- mov al,[si+2]
- mov [di+2],al
- mov al,[si+3]
- mov [di+3],al
- add si,dx
- add di,dx
-ENDM
-
- mov ax,ss
- mov ds,ax
- jmp @@next
-
-ENDP
-
-
- END
-
--- a/WOLFSRC/ID_VL.C
+++ /dev/null
@@ -1,1084 +1,0 @@
-// ID_VL.C
-
-#include <dos.h>
-#include <alloc.h>
-#include <mem.h>
-#include <string.h>
-#include "ID_HEAD.H"
-#include "ID_VL.H"
-#pragma hdrstop
-
-//
-// SC_INDEX is expected to stay at SC_MAPMASK for proper operation
-//
-
-unsigned bufferofs;
-unsigned displayofs,pelpan;
-
-unsigned screenseg=SCREENSEG; // set to 0xa000 for asm convenience
-
-unsigned linewidth;
-unsigned ylookup[MAXSCANLINES];
-
-boolean screenfaded;
-unsigned bordercolor;
-
-boolean fastpalette; // if true, use outsb to set
-
-byte far palette1[256][3],far palette2[256][3];
-
-//===========================================================================
-
-// asm
-
-int VL_VideoID (void);
-void VL_SetCRTC (int crtc);
-void VL_SetScreen (int crtc, int pelpan);
-void VL_WaitVBL (int vbls);
-
-//===========================================================================
-
-
-/*
-=======================
-=
-= VL_Startup
-=
-=======================
-*/
-
-#if 0
-void VL_Startup (void)
-{
- if ( !MS_CheckParm ("HIDDENCARD") && VL_VideoID () != 5)
- MS_Quit ("You need a VGA graphics card to run this!");
-
- asm cld; // all string instructions assume forward
-}
-
-#endif
-
-/*
-=======================
-=
-= VL_Startup // WOLFENSTEIN HACK
-=
-=======================
-*/
-
-static char *ParmStrings[] = {"HIDDENCARD",""};
-
-void VL_Startup (void)
-{
- int i,videocard;
-
- asm cld;
-
- videocard = VL_VideoID ();
- for (i = 1;i < _argc;i++)
- if (US_CheckParm(_argv[i],ParmStrings) == 0)
- {
- videocard = 5;
- break;
- }
-
- if (videocard != 5)
-Quit ("Improper video card! If you really have a VGA card that I am not \n"
- "detecting, use the -HIDDENCARD command line parameter!");
-
-}
-
-
-
-/*
-=======================
-=
-= VL_Shutdown
-=
-=======================
-*/
-
-void VL_Shutdown (void)
-{
- VL_SetTextMode ();
-}
-
-
-/*
-=======================
-=
-= VL_SetVGAPlaneMode
-=
-=======================
-*/
-
-void VL_SetVGAPlaneMode (void)
-{
-asm mov ax,0x13
-asm int 0x10
- VL_DePlaneVGA ();
- VGAMAPMASK(15);
- VL_SetLineWidth (40);
-}
-
-
-/*
-=======================
-=
-= VL_SetTextMode
-=
-=======================
-*/
-
-void VL_SetTextMode (void)
-{
-asm mov ax,3
-asm int 0x10
-}
-
-//===========================================================================
-
-/*
-=================
-=
-= VL_ClearVideo
-=
-= Fill the entire video buffer with a given color
-=
-=================
-*/
-
-void VL_ClearVideo (byte color)
-{
-asm mov dx,GC_INDEX
-asm mov al,GC_MODE
-asm out dx,al
-asm inc dx
-asm in al,dx
-asm and al,0xfc // write mode 0 to store directly to video
-asm out dx,al
-
-asm mov dx,SC_INDEX
-asm mov ax,SC_MAPMASK+15*256
-asm out dx,ax // write through all four planes
-
-asm mov ax,SCREENSEG
-asm mov es,ax
-asm mov al,[color]
-asm mov ah,al
-asm mov cx,0x8000 // 0x8000 words, clearing 8 video bytes/word
-asm xor di,di
-asm rep stosw
-}
-
-
-/*
-=============================================================================
-
- VGA REGISTER MANAGEMENT ROUTINES
-
-=============================================================================
-*/
-
-
-/*
-=================
-=
-= VL_DePlaneVGA
-=
-=================
-*/
-
-void VL_DePlaneVGA (void)
-{
-
-//
-// change CPU addressing to non linear mode
-//
-
-//
-// turn off chain 4 and odd/even
-//
- outportb (SC_INDEX,SC_MEMMODE);
- outportb (SC_INDEX+1,(inportb(SC_INDEX+1)&~8)|4);
-
- outportb (SC_INDEX,SC_MAPMASK); // leave this set throughought
-
-//
-// turn off odd/even and set write mode 0
-//
- outportb (GC_INDEX,GC_MODE);
- outportb (GC_INDEX+1,inportb(GC_INDEX+1)&~0x13);
-
-//
-// turn off chain
-//
- outportb (GC_INDEX,GC_MISCELLANEOUS);
- outportb (GC_INDEX+1,inportb(GC_INDEX+1)&~2);
-
-//
-// clear the entire buffer space, because int 10h only did 16 k / plane
-//
- VL_ClearVideo (0);
-
-//
-// change CRTC scanning from doubleword to byte mode, allowing >64k scans
-//
- outportb (CRTC_INDEX,CRTC_UNDERLINE);
- outportb (CRTC_INDEX+1,inportb(CRTC_INDEX+1)&~0x40);
-
- outportb (CRTC_INDEX,CRTC_MODE);
- outportb (CRTC_INDEX+1,inportb(CRTC_INDEX+1)|0x40);
-}
-
-//===========================================================================
-
-/*
-====================
-=
-= VL_SetLineWidth
-=
-= Line witdh is in WORDS, 40 words is normal width for vgaplanegr
-=
-====================
-*/
-
-void VL_SetLineWidth (unsigned width)
-{
- int i,offset;
-
-//
-// set wide virtual screen
-//
- outport (CRTC_INDEX,CRTC_OFFSET+width*256);
-
-//
-// set up lookup tables
-//
- linewidth = width*2;
-
- offset = 0;
-
- for (i=0;i<MAXSCANLINES;i++)
- {
- ylookup[i]=offset;
- offset += linewidth;
- }
-}
-
-/*
-====================
-=
-= VL_SetSplitScreen
-=
-====================
-*/
-
-void VL_SetSplitScreen (int linenum)
-{
- VL_WaitVBL (1);
- linenum=linenum*2-1;
- outportb (CRTC_INDEX,CRTC_LINECOMPARE);
- outportb (CRTC_INDEX+1,linenum % 256);
- outportb (CRTC_INDEX,CRTC_OVERFLOW);
- outportb (CRTC_INDEX+1, 1+16*(linenum/256));
- outportb (CRTC_INDEX,CRTC_MAXSCANLINE);
- outportb (CRTC_INDEX+1,inportb(CRTC_INDEX+1) & (255-64));
-}
-
-
-/*
-=============================================================================
-
- PALETTE OPS
-
- To avoid snow, do a WaitVBL BEFORE calling these
-
-=============================================================================
-*/
-
-
-/*
-=================
-=
-= VL_FillPalette
-=
-=================
-*/
-
-void VL_FillPalette (int red, int green, int blue)
-{
- int i;
-
- outportb (PEL_WRITE_ADR,0);
- for (i=0;i<256;i++)
- {
- outportb (PEL_DATA,red);
- outportb (PEL_DATA,green);
- outportb (PEL_DATA,blue);
- }
-}
-
-//===========================================================================
-
-/*
-=================
-=
-= VL_SetColor
-=
-=================
-*/
-
-void VL_SetColor (int color, int red, int green, int blue)
-{
- outportb (PEL_WRITE_ADR,color);
- outportb (PEL_DATA,red);
- outportb (PEL_DATA,green);
- outportb (PEL_DATA,blue);
-}
-
-//===========================================================================
-
-/*
-=================
-=
-= VL_GetColor
-=
-=================
-*/
-
-void VL_GetColor (int color, int *red, int *green, int *blue)
-{
- outportb (PEL_READ_ADR,color);
- *red = inportb (PEL_DATA);
- *green = inportb (PEL_DATA);
- *blue = inportb (PEL_DATA);
-}
-
-//===========================================================================
-
-/*
-=================
-=
-= VL_SetPalette
-=
-= If fast palette setting has been tested for, it is used
-= (some cards don't like outsb palette setting)
-=
-=================
-*/
-
-void VL_SetPalette (byte far *palette)
-{
- int i;
-
-// outportb (PEL_WRITE_ADR,0);
-// for (i=0;i<768;i++)
-// outportb(PEL_DATA,*palette++);
-
- asm mov dx,PEL_WRITE_ADR
- asm mov al,0
- asm out dx,al
- asm mov dx,PEL_DATA
- asm lds si,[palette]
-
- asm test [ss:fastpalette],1
- asm jz slowset
-//
-// set palette fast for cards that can take it
-//
- asm mov cx,768
- asm rep outsb
- asm jmp done
-
-//
-// set palette slowly for some video cards
-//
-slowset:
- asm mov cx,256
-setloop:
- asm lodsb
- asm out dx,al
- asm lodsb
- asm out dx,al
- asm lodsb
- asm out dx,al
- asm loop setloop
-
-done:
- asm mov ax,ss
- asm mov ds,ax
-
-}
-
-
-//===========================================================================
-
-/*
-=================
-=
-= VL_GetPalette
-=
-= This does not use the port string instructions,
-= due to some incompatabilities
-=
-=================
-*/
-
-void VL_GetPalette (byte far *palette)
-{
- int i;
-
- outportb (PEL_READ_ADR,0);
- for (i=0;i<768;i++)
- *palette++ = inportb(PEL_DATA);
-}
-
-
-//===========================================================================
-
-/*
-=================
-=
-= VL_FadeOut
-=
-= Fades the current palette to the given color in the given number of steps
-=
-=================
-*/
-
-void VL_FadeOut (int start, int end, int red, int green, int blue, int steps)
-{
- int i,j,orig,delta;
- byte far *origptr, far *newptr;
-
- VL_WaitVBL(1);
- VL_GetPalette (&palette1[0][0]);
- _fmemcpy (palette2,palette1,768);
-
-//
-// fade through intermediate frames
-//
- for (i=0;i<steps;i++)
- {
- origptr = &palette1[start][0];
- newptr = &palette2[start][0];
- for (j=start;j<=end;j++)
- {
- orig = *origptr++;
- delta = red-orig;
- *newptr++ = orig + delta * i / steps;
- orig = *origptr++;
- delta = green-orig;
- *newptr++ = orig + delta * i / steps;
- orig = *origptr++;
- delta = blue-orig;
- *newptr++ = orig + delta * i / steps;
- }
-
- VL_WaitVBL(1);
- VL_SetPalette (&palette2[0][0]);
- }
-
-//
-// final color
-//
- VL_FillPalette (red,green,blue);
-
- screenfaded = true;
-}
-
-
-/*
-=================
-=
-= VL_FadeIn
-=
-=================
-*/
-
-void VL_FadeIn (int start, int end, byte far *palette, int steps)
-{
- int i,j,delta;
-
- VL_WaitVBL(1);
- VL_GetPalette (&palette1[0][0]);
- _fmemcpy (&palette2[0][0],&palette1[0][0],sizeof(palette1));
-
- start *= 3;
- end = end*3+2;
-
-//
-// fade through intermediate frames
-//
- for (i=0;i<steps;i++)
- {
- for (j=start;j<=end;j++)
- {
- delta = palette[j]-palette1[0][j];
- palette2[0][j] = palette1[0][j] + delta * i / steps;
- }
-
- VL_WaitVBL(1);
- VL_SetPalette (&palette2[0][0]);
- }
-
-//
-// final color
-//
- VL_SetPalette (palette);
- screenfaded = false;
-}
-
-
-
-/*
-=================
-=
-= VL_TestPaletteSet
-=
-= Sets the palette with outsb, then reads it in and compares
-= If it compares ok, fastpalette is set to true.
-=
-=================
-*/
-
-void VL_TestPaletteSet (void)
-{
- int i;
-
- for (i=0;i<768;i++)
- palette1[0][i] = i;
-
- fastpalette = true;
- VL_SetPalette (&palette1[0][0]);
- VL_GetPalette (&palette2[0][0]);
- if (_fmemcmp (&palette1[0][0],&palette2[0][0],768))
- fastpalette = false;
-}
-
-
-/*
-==================
-=
-= VL_ColorBorder
-=
-==================
-*/
-
-void VL_ColorBorder (int color)
-{
- _AH=0x10;
- _AL=1;
- _BH=color;
- geninterrupt (0x10);
- bordercolor = color;
-}
-
-
-
-/*
-=============================================================================
-
- PIXEL OPS
-
-=============================================================================
-*/
-
-byte pixmasks[4] = {1,2,4,8};
-byte leftmasks[4] = {15,14,12,8};
-byte rightmasks[4] = {1,3,7,15};
-
-
-/*
-=================
-=
-= VL_Plot
-=
-=================
-*/
-
-void VL_Plot (int x, int y, int color)
-{
- byte mask;
-
- mask = pixmasks[x&3];
- VGAMAPMASK(mask);
- *(byte far *)MK_FP(SCREENSEG,bufferofs+(ylookup[y]+(x>>2))) = color;
- VGAMAPMASK(15);
-}
-
-
-/*
-=================
-=
-= VL_Hlin
-=
-=================
-*/
-
-void VL_Hlin (unsigned x, unsigned y, unsigned width, unsigned color)
-{
- unsigned xbyte;
- byte far *dest;
- byte leftmask,rightmask;
- int midbytes;
-
- xbyte = x>>2;
- leftmask = leftmasks[x&3];
- rightmask = rightmasks[(x+width-1)&3];
- midbytes = ((x+width+3)>>2) - xbyte - 2;
-
- dest = MK_FP(SCREENSEG,bufferofs+ylookup[y]+xbyte);
-
- if (midbytes<0)
- {
- // all in one byte
- VGAMAPMASK(leftmask&rightmask);
- *dest = color;
- VGAMAPMASK(15);
- return;
- }
-
- VGAMAPMASK(leftmask);
- *dest++ = color;
-
- VGAMAPMASK(15);
- _fmemset (dest,color,midbytes);
- dest+=midbytes;
-
- VGAMAPMASK(rightmask);
- *dest = color;
-
- VGAMAPMASK(15);
-}
-
-
-/*
-=================
-=
-= VL_Vlin
-=
-=================
-*/
-
-void VL_Vlin (int x, int y, int height, int color)
-{
- byte far *dest,mask;
-
- mask = pixmasks[x&3];
- VGAMAPMASK(mask);
-
- dest = MK_FP(SCREENSEG,bufferofs+ylookup[y]+(x>>2));
-
- while (height--)
- {
- *dest = color;
- dest += linewidth;
- }
-
- VGAMAPMASK(15);
-}
-
-
-/*
-=================
-=
-= VL_Bar
-=
-=================
-*/
-
-void VL_Bar (int x, int y, int width, int height, int color)
-{
- byte far *dest;
- byte leftmask,rightmask;
- int midbytes,linedelta;
-
- leftmask = leftmasks[x&3];
- rightmask = rightmasks[(x+width-1)&3];
- midbytes = ((x+width+3)>>2) - (x>>2) - 2;
- linedelta = linewidth-(midbytes+1);
-
- dest = MK_FP(SCREENSEG,bufferofs+ylookup[y]+(x>>2));
-
- if (midbytes<0)
- {
- // all in one byte
- VGAMAPMASK(leftmask&rightmask);
- while (height--)
- {
- *dest = color;
- dest += linewidth;
- }
- VGAMAPMASK(15);
- return;
- }
-
- while (height--)
- {
- VGAMAPMASK(leftmask);
- *dest++ = color;
-
- VGAMAPMASK(15);
- _fmemset (dest,color,midbytes);
- dest+=midbytes;
-
- VGAMAPMASK(rightmask);
- *dest = color;
-
- dest+=linedelta;
- }
-
- VGAMAPMASK(15);
-}
-
-/*
-============================================================================
-
- MEMORY OPS
-
-============================================================================
-*/
-
-/*
-=================
-=
-= VL_MemToLatch
-=
-=================
-*/
-
-void VL_MemToLatch (byte far *source, int width, int height, unsigned dest)
-{
- unsigned count;
- byte plane,mask;
-
- count = ((width+3)/4)*height;
- mask = 1;
- for (plane = 0; plane<4 ; plane++)
- {
- VGAMAPMASK(mask);
- mask <<= 1;
-
-asm mov cx,count
-asm mov ax,SCREENSEG
-asm mov es,ax
-asm mov di,[dest]
-asm lds si,[source]
-asm rep movsb
-asm mov ax,ss
-asm mov ds,ax
-
- source+= count;
- }
-}
-
-
-//===========================================================================
-
-
-/*
-=================
-=
-= VL_MemToScreen
-=
-= Draws a block of data to the screen.
-=
-=================
-*/
-
-void VL_MemToScreen (byte far *source, int width, int height, int x, int y)
-{
- byte far *screen,far *dest,mask;
- int plane;
-
- width>>=2;
- dest = MK_FP(SCREENSEG,bufferofs+ylookup[y]+(x>>2) );
- mask = 1 << (x&3);
-
- for (plane = 0; plane<4; plane++)
- {
- VGAMAPMASK(mask);
- mask <<= 1;
- if (mask == 16)
- mask = 1;
-
- screen = dest;
- for (y=0;y<height;y++,screen+=linewidth,source+=width)
- _fmemcpy (screen,source,width);
- }
-}
-
-//==========================================================================
-
-
-/*
-=================
-=
-= VL_MaskedToScreen
-=
-= Masks a block of main memory to the screen.
-=
-=================
-*/
-
-void VL_MaskedToScreen (byte far *source, int width, int height, int x, int y)
-{
- byte far *screen,far *dest,mask;
- byte far *maskptr;
- int plane;
-
- width>>=2;
- dest = MK_FP(SCREENSEG,bufferofs+ylookup[y]+(x>>2) );
-// mask = 1 << (x&3);
-
-// maskptr = source;
-
- for (plane = 0; plane<4; plane++)
- {
- VGAMAPMASK(mask);
- mask <<= 1;
- if (mask == 16)
- mask = 1;
-
- screen = dest;
- for (y=0;y<height;y++,screen+=linewidth,source+=width)
- _fmemcpy (screen,source,width);
- }
-}
-
-//==========================================================================
-
-/*
-=================
-=
-= VL_LatchToScreen
-=
-=================
-*/
-
-void VL_LatchToScreen (unsigned source, int width, int height, int x, int y)
-{
- VGAWRITEMODE(1);
- VGAMAPMASK(15);
-
-asm mov di,[y] // dest = bufferofs+ylookup[y]+(x>>2)
-asm shl di,1
-asm mov di,[WORD PTR ylookup+di]
-asm add di,[bufferofs]
-asm mov ax,[x]
-asm shr ax,2
-asm add di,ax
-
-asm mov si,[source]
-asm mov ax,[width]
-asm mov bx,[linewidth]
-asm sub bx,ax
-asm mov dx,[height]
-asm mov cx,SCREENSEG
-asm mov ds,cx
-asm mov es,cx
-
-drawline:
-asm mov cx,ax
-asm rep movsb
-asm add di,bx
-asm dec dx
-asm jnz drawline
-
-asm mov ax,ss
-asm mov ds,ax
-
- VGAWRITEMODE(0);
-}
-
-
-//===========================================================================
-
-#if 0
-
-/*
-=================
-=
-= VL_ScreenToScreen
-=
-=================
-*/
-
-void VL_ScreenToScreen (unsigned source, unsigned dest,int width, int height)
-{
- VGAWRITEMODE(1);
- VGAMAPMASK(15);
-
-asm mov si,[source]
-asm mov di,[dest]
-asm mov ax,[width]
-asm mov bx,[linewidth]
-asm sub bx,ax
-asm mov dx,[height]
-asm mov cx,SCREENSEG
-asm mov ds,cx
-asm mov es,cx
-
-drawline:
-asm mov cx,ax
-asm rep movsb
-asm add si,bx
-asm add di,bx
-asm dec dx
-asm jnz drawline
-
-asm mov ax,ss
-asm mov ds,ax
-
- VGAWRITEMODE(0);
-}
-
-
-#endif
-
-/*
-=============================================================================
-
- STRING OUTPUT ROUTINES
-
-=============================================================================
-*/
-
-
-
-
-/*
-===================
-=
-= VL_DrawTile8String
-=
-===================
-*/
-
-void VL_DrawTile8String (char *str, char far *tile8ptr, int printx, int printy)
-{
- int i;
- unsigned far *dest,far *screen,far *src;
-
- dest = MK_FP(SCREENSEG,bufferofs+ylookup[printy]+(printx>>2));
-
- while (*str)
- {
- src = (unsigned far *)(tile8ptr + (*str<<6));
- // each character is 64 bytes
-
- VGAMAPMASK(1);
- screen = dest;
- for (i=0;i<8;i++,screen+=linewidth)
- *screen = *src++;
- VGAMAPMASK(2);
- screen = dest;
- for (i=0;i<8;i++,screen+=linewidth)
- *screen = *src++;
- VGAMAPMASK(4);
- screen = dest;
- for (i=0;i<8;i++,screen+=linewidth)
- *screen = *src++;
- VGAMAPMASK(8);
- screen = dest;
- for (i=0;i<8;i++,screen+=linewidth)
- *screen = *src++;
-
- str++;
- printx += 8;
- dest+=2;
- }
-}
-
-
-
-/*
-===================
-=
-= VL_DrawLatch8String
-=
-===================
-*/
-
-void VL_DrawLatch8String (char *str, unsigned tile8ptr, int printx, int printy)
-{
- int i;
- unsigned src,dest;
-
- dest = bufferofs+ylookup[printy]+(printx>>2);
-
- VGAWRITEMODE(1);
- VGAMAPMASK(15);
-
- while (*str)
- {
- src = tile8ptr + (*str<<4); // each character is 16 latch bytes
-
-asm mov si,[src]
-asm mov di,[dest]
-asm mov dx,[linewidth]
-
-asm mov ax,SCREENSEG
-asm mov ds,ax
-
-asm lodsw
-asm mov [di],ax
-asm add di,dx
-asm lodsw
-asm mov [di],ax
-asm add di,dx
-asm lodsw
-asm mov [di],ax
-asm add di,dx
-asm lodsw
-asm mov [di],ax
-asm add di,dx
-asm lodsw
-asm mov [di],ax
-asm add di,dx
-asm lodsw
-asm mov [di],ax
-asm add di,dx
-asm lodsw
-asm mov [di],ax
-asm add di,dx
-asm lodsw
-asm mov [di],ax
-asm add di,dx
-
-asm mov ax,ss
-asm mov ds,ax
-
- str++;
- printx += 8;
- dest+=2;
- }
-
- VGAWRITEMODE(0);
-}
-
-
-/*
-===================
-=
-= VL_SizeTile8String
-=
-===================
-*/
-
-void VL_SizeTile8String (char *str, int *width, int *height)
-{
- *height = 8;
- *width = 8*strlen(str);
-}
-
-
-
-
-
-
-
-
-
--- a/WOLFSRC/ID_VL.EQU
+++ /dev/null
@@ -1,58 +1,0 @@
-; ID_VL.EQU
-
-SC_INDEX = 03C4h
-SC_RESET = 0
-SC_CLOCK = 1
-SC_MAPMASK = 2
-SC_CHARMAP = 3
-SC_MEMMODE = 4
-
-CRTC_INDEX = 03D4h
-CRTC_H_TOTAL = 0
-CRTC_H_DISPEND = 1
-CRTC_H_BLANK = 2
-CRTC_H_ENDBLANK = 3
-CRTC_H_RETRACE = 4
-CRTC_H_ENDRETRACE = 5
-CRTC_V_TOTAL = 6
-CRTC_OVERFLOW = 7
-CRTC_ROWSCAN = 8
-CRTC_MAXSCANLINE = 9
-CRTC_CURSORSTART = 10
-CRTC_CURSOREND = 11
-CRTC_STARTHIGH = 12
-CRTC_STARTLOW = 13
-CRTC_CURSORHIGH = 14
-CRTC_CURSORLOW = 15
-CRTC_V_RETRACE = 16
-CRTC_V_ENDRETRACE = 17
-CRTC_V_DISPEND = 18
-CRTC_OFFSET = 19
-CRTC_UNDERLINE = 20
-CRTC_V_BLANK = 21
-CRTC_V_ENDBLANK = 22
-CRTC_MODE = 23
-CRTC_LINECOMPARE = 24
-
-
-GC_INDEX = 03CEh
-GC_SETRESET = 0
-GC_ENABLESETRESET = 1
-GC_COLORCOMPARE = 2
-GC_DATAROTATE = 3
-GC_READMAP = 4
-GC_MODE = 5
-GC_MISCELLANEOUS = 6
-GC_COLORDONTCARE = 7
-GC_BITMASK = 8
-
-ATR_INDEX = 03c0h
-ATR_MODE = 16
-ATR_OVERSCAN = 17
-ATR_COLORPLANEENABLE = 18
-ATR_PELPAN = 19
-ATR_COLORSELECT = 20
-
-STATUS_REGISTER_1 = 03dah
-
-
--- a/WOLFSRC/ID_VL.H
+++ /dev/null
@@ -1,161 +1,0 @@
-// ID_VL.H
-
-// wolf compatability
-
-#define MS_Quit Quit
-
-void Quit (char *error);
-
-//===========================================================================
-
-
-#define SC_INDEX 0x3C4
-#define SC_RESET 0
-#define SC_CLOCK 1
-#define SC_MAPMASK 2
-#define SC_CHARMAP 3
-#define SC_MEMMODE 4
-
-#define CRTC_INDEX 0x3D4
-#define CRTC_H_TOTAL 0
-#define CRTC_H_DISPEND 1
-#define CRTC_H_BLANK 2
-#define CRTC_H_ENDBLANK 3
-#define CRTC_H_RETRACE 4
-#define CRTC_H_ENDRETRACE 5
-#define CRTC_V_TOTAL 6
-#define CRTC_OVERFLOW 7
-#define CRTC_ROWSCAN 8
-#define CRTC_MAXSCANLINE 9
-#define CRTC_CURSORSTART 10
-#define CRTC_CURSOREND 11
-#define CRTC_STARTHIGH 12
-#define CRTC_STARTLOW 13
-#define CRTC_CURSORHIGH 14
-#define CRTC_CURSORLOW 15
-#define CRTC_V_RETRACE 16
-#define CRTC_V_ENDRETRACE 17
-#define CRTC_V_DISPEND 18
-#define CRTC_OFFSET 19
-#define CRTC_UNDERLINE 20
-#define CRTC_V_BLANK 21
-#define CRTC_V_ENDBLANK 22
-#define CRTC_MODE 23
-#define CRTC_LINECOMPARE 24
-
-
-#define GC_INDEX 0x3CE
-#define GC_SETRESET 0
-#define GC_ENABLESETRESET 1
-#define GC_COLORCOMPARE 2
-#define GC_DATAROTATE 3
-#define GC_READMAP 4
-#define GC_MODE 5
-#define GC_MISCELLANEOUS 6
-#define GC_COLORDONTCARE 7
-#define GC_BITMASK 8
-
-#define ATR_INDEX 0x3c0
-#define ATR_MODE 16
-#define ATR_OVERSCAN 17
-#define ATR_COLORPLANEENABLE 18
-#define ATR_PELPAN 19
-#define ATR_COLORSELECT 20
-
-#define STATUS_REGISTER_1 0x3da
-
-#define PEL_WRITE_ADR 0x3c8
-#define PEL_READ_ADR 0x3c7
-#define PEL_DATA 0x3c9
-
-
-//===========================================================================
-
-#define SCREENSEG 0xa000
-
-#define SCREENWIDTH 80 // default screen width in bytes
-#define MAXSCANLINES 200 // size of ylookup table
-
-#define CHARWIDTH 2
-#define TILEWIDTH 4
-
-//===========================================================================
-
-extern unsigned bufferofs; // all drawing is reletive to this
-extern unsigned displayofs,pelpan; // last setscreen coordinates
-
-extern unsigned screenseg; // set to 0xa000 for asm convenience
-
-extern unsigned linewidth;
-extern unsigned ylookup[MAXSCANLINES];
-
-extern boolean screenfaded;
-extern unsigned bordercolor;
-
-//===========================================================================
-
-//
-// VGA hardware routines
-//
-
-#define VGAWRITEMODE(x) asm{\
-cli;\
-mov dx,GC_INDEX;\
-mov al,GC_MODE;\
-out dx,al;\
-inc dx;\
-in al,dx;\
-and al,252;\
-or al,x;\
-out dx,al;\
-sti;}
-
-#define VGAMAPMASK(x) asm{cli;mov dx,SC_INDEX;mov al,SC_MAPMASK;mov ah,x;out dx,ax;sti;}
-#define VGAREADMAP(x) asm{cli;mov dx,GC_INDEX;mov al,GC_READMAP;mov ah,x;out dx,ax;sti;}
-
-
-void VL_Startup (void);
-void VL_Shutdown (void);
-
-void VL_SetVGAPlane (void);
-void VL_SetTextMode (void);
-void VL_DePlaneVGA (void);
-void VL_SetVGAPlaneMode (void);
-void VL_ClearVideo (byte color);
-
-void VL_SetLineWidth (unsigned width);
-void VL_SetSplitScreen (int linenum);
-
-void VL_WaitVBL (int vbls);
-void VL_CrtcStart (int crtc);
-void VL_SetScreen (int crtc, int pelpan);
-
-void VL_FillPalette (int red, int green, int blue);
-void VL_SetColor (int color, int red, int green, int blue);
-void VL_GetColor (int color, int *red, int *green, int *blue);
-void VL_SetPalette (byte far *palette);
-void VL_GetPalette (byte far *palette);
-void VL_FadeOut (int start, int end, int red, int green, int blue, int steps);
-void VL_FadeIn (int start, int end, byte far *palette, int steps);
-void VL_ColorBorder (int color);
-
-void VL_Plot (int x, int y, int color);
-void VL_Hlin (unsigned x, unsigned y, unsigned width, unsigned color);
-void VL_Vlin (int x, int y, int height, int color);
-void VL_Bar (int x, int y, int width, int height, int color);
-
-void VL_MungePic (byte far *source, unsigned width, unsigned height);
-void VL_DrawPicBare (int x, int y, byte far *pic, int width, int height);
-void VL_MemToLatch (byte far *source, int width, int height, unsigned dest);
-void VL_ScreenToScreen (unsigned source, unsigned dest,int width, int height);
-void VL_MemToScreen (byte far *source, int width, int height, int x, int y);
-void VL_MaskedToScreen (byte far *source, int width, int height, int x, int y);
-
-void VL_DrawTile8String (char *str, char far *tile8ptr, int printx, int printy);
-void VL_DrawLatch8String (char *str, unsigned tile8ptr, int printx, int printy);
-void VL_SizeTile8String (char *str, int *width, int *height);
-void VL_DrawPropString (char *str, unsigned tile8ptr, int printx, int printy);
-void VL_SizePropString (char *str, int *width, int *height, char far *font);
-
-void VL_TestPaletteSet (void);
-
--- a/WOLFSRC/ID_VL_A.ASM
+++ /dev/null
@@ -1,742 +1,0 @@
-; ID_VL.ASM
-
- IDEAL
- MODEL MEDIUM,C
-
- INCLUDE 'ID_VL.EQU'
-
-SCREENSEG = 0a000h
-
- DATASEG
-
- EXTRN TimeCount:WORD ; incremented every 70th of a second
- EXTRN linewidth:WORD
-
-starttime dw ?
-
- CODESEG
-
-;===========================================================================
-
-
-;==============
-;
-; VL_WaitVBL ******** NEW *********
-;
-; Wait for the vertical retrace (returns before the actual vertical sync)
-;
-;==============
-
-PROC VL_WaitVBL num:WORD
-PUBLIC VL_WaitVBL
-@@wait:
-
- mov dx,STATUS_REGISTER_1
-
- mov cx,[num]
-;
-; wait for a display signal to make sure the raster isn't in the middle
-; of a sync
-;
-@@waitnosync:
- in al,dx
- test al,8
- jnz @@waitnosync
-
-
-@@waitsync:
- in al,dx
- test al,8
- jz @@waitsync
-
- loop @@waitnosync
-
- ret
-
-ENDP
-
-
-;===========================================================================
-
-;==============
-;
-; VL_SetCRTC
-;
-;==============
-
-PROC VL_SetCRTC crtc:WORD
-PUBLIC VL_SetCRTC
-
-;
-; wait for a display signal to make sure the raster isn't in the middle
-; of a sync
-;
- cli
-
- mov dx,STATUS_REGISTER_1
-
-@@waitdisplay:
- in al,dx
- test al,1 ;1 = display is disabled (HBL / VBL)
- jnz @@waitdisplay
-
-
-;
-; set CRTC start
-;
-; for some reason, my XT's EGA card doesn't like word outs to the CRTC
-; index...
-;
- mov cx,[crtc]
- mov dx,CRTC_INDEX
- mov al,0ch ;start address high register
- out dx,al
- inc dx
- mov al,ch
- out dx,al
- dec dx
- mov al,0dh ;start address low register
- out dx,al
- mov al,cl
- inc dx
- out dx,al
-
-
- sti
-
- ret
-
-ENDP
-
-
-
-;===========================================================================
-
-;==============
-;
-; VL_SetScreen
-;
-;==============
-
-PROC VL_SetScreen crtc:WORD, pel:WORD
-PUBLIC VL_SetScreen
-
-
- mov cx,[timecount] ; if timecount goes up by two, the retrace
- add cx,2 ; period was missed (an interrupt covered it)
-
- mov dx,STATUS_REGISTER_1
-
-;
-; wait for a display signal to make sure the raster isn't in the middle
-; of a sync
-;
-@@waitdisplay:
- in al,dx
- test al,1 ;1 = display is disabled (HBL / VBL)
- jnz @@waitdisplay
-
-
-@@loop:
- sti
- jmp $+2
- cli
-
- cmp [timecount],cx ; will only happen if an interrupt is
- jae @@setcrtc ; straddling the entire retrace period
-
-;
-; when several succesive display not enableds occur,
-; the bottom of the screen has been hit
-;
-
- in al,dx
- test al,8
- jnz @@waitdisplay
- test al,1
- jz @@loop
-
- in al,dx
- test al,8
- jnz @@waitdisplay
- test al,1
- jz @@loop
-
- in al,dx
- test al,8
- jnz @@waitdisplay
- test al,1
- jz @@loop
-
- in al,dx
- test al,8
- jnz @@waitdisplay
- test al,1
- jz @@loop
-
- in al,dx
- test al,8
- jnz @@waitdisplay
- test al,1
- jz @@loop
-
-
-@@setcrtc:
-
-
-;
-; set CRTC start
-;
-; for some reason, my XT's EGA card doesn't like word outs to the CRTC
-; index...
-;
- mov cx,[crtc]
- mov dx,CRTC_INDEX
- mov al,0ch ;start address high register
- out dx,al
- inc dx
- mov al,ch
- out dx,al
- dec dx
- mov al,0dh ;start address low register
- out dx,al
- mov al,cl
- inc dx
- out dx,al
-
-;
-; set horizontal panning
-;
- mov dx,ATR_INDEX
- mov al,ATR_PELPAN or 20h
- out dx,al
- jmp $+2
- mov al,[BYTE pel] ;pel pan value
- out dx,al
-
- sti
-
- ret
-
-ENDP
-
-
-;===========================================================================
-
-
-;============================================================================
-;
-; VL_ScreenToScreen
-;
-; Basic block copy routine. Copies one block of screen memory to another,
-; using write mode 1 (sets it and returns with write mode 0). bufferofs is
-; NOT accounted for.
-;
-;============================================================================
-
-PROC VL_ScreenToScreen source:WORD, dest:WORD, wide:WORD, height:WORD
-PUBLIC VL_ScreenToScreen
-USES SI,DI
-
- pushf
- cli
-
- mov dx,SC_INDEX
- mov ax,SC_MAPMASK+15*256
- out dx,ax
- mov dx,GC_INDEX
- mov al,GC_MODE
- out dx,al
- inc dx
- in al,dx
- and al,NOT 3
- or al,1
- out dx,al
-
- popf
-
- mov bx,[linewidth]
- sub bx,[wide]
-
- mov ax,SCREENSEG
- mov es,ax
- mov ds,ax
-
- mov si,[source]
- mov di,[dest] ;start at same place in all planes
- mov dx,[height] ;scan lines to draw
- mov ax,[wide]
-
-@@lineloop:
- mov cx,ax
- rep movsb
- add si,bx
- add di,bx
-
- dec dx
- jnz @@lineloop
-
- mov dx,GC_INDEX+1
- in al,dx
- and al,NOT 3
- out dx,al
-
- mov ax,ss
- mov ds,ax ;restore turbo's data segment
-
- ret
-
-ENDP
-
-
-;===========================================================================
-
-
- MASM
-;���������������������������������������������������������
-;
-; Name: VL_VideoID
-;
-; Function: Detects the presence of various video subsystems
-;
-; int VideoID;
-;
-; Subsystem ID values:
-; 0 = (none)
-; 1 = MDA
-; 2 = CGA
-; 3 = EGA
-; 4 = MCGA
-; 5 = VGA
-; 80h = HGC
-; 81h = HGC+
-; 82h = Hercules InColor
-;
-;���������������������������������������������������������
-
-;���������������������������������������������������������
-;
-; Equates
-;
-;���������������������������������������������������������
-VIDstruct STRUC ; corresponds to C data structure
-
-Video0Type DB ? ; first subsystem type
-Display0Type DB ? ; display attached to first subsystem
-
-Video1Type DB ? ; second subsystem type
-Display1Type DB ? ; display attached to second subsystem
-
-VIDstruct ENDS
-
-
-Device0 EQU word ptr Video0Type[di]
-Device1 EQU word ptr Video1Type[di]
-
-
-MDA EQU 1 ; subsystem types
-CGA EQU 2
-EGA EQU 3
-MCGA EQU 4
-VGA EQU 5
-HGC EQU 80h
-HGCPlus EQU 81h
-InColor EQU 82h
-
-MDADisplay EQU 1 ; display types
-CGADisplay EQU 2
-EGAColorDisplay EQU 3
-PS2MonoDisplay EQU 4
-PS2ColorDisplay EQU 5
-
-TRUE EQU 1
-FALSE EQU 0
-
-;���������������������������������������������������������
-;
-; Program
-;
-;���������������������������������������������������������
-
-Results VIDstruct <> ;results go here!
-
-EGADisplays DB CGADisplay ; 0000b, 0001b (EGA switch values)
- DB EGAColorDisplay ; 0010b, 0011b
- DB MDADisplay ; 0100b, 0101b
- DB CGADisplay ; 0110b, 0111b
- DB EGAColorDisplay ; 1000b, 1001b
- DB MDADisplay ; 1010b, 1011b
-
-DCCtable DB 0,0 ; translate table for INT 10h func 1Ah
- DB MDA,MDADisplay
- DB CGA,CGADisplay
- DB 0,0
- DB EGA,EGAColorDisplay
- DB EGA,MDADisplay
- DB 0,0
- DB VGA,PS2MonoDisplay
- DB VGA,PS2ColorDisplay
- DB 0,0
- DB MCGA,EGAColorDisplay
- DB MCGA,PS2MonoDisplay
- DB MCGA,PS2ColorDisplay
-
-TestSequence DB TRUE ; this list of flags and addresses
- DW FindPS2 ; determines the order in which this
- ; program looks for the various
-EGAflag DB ? ; subsystems
- DW FindEGA
-
-CGAflag DB ?
- DW FindCGA
-
-Monoflag DB ?
- DW FindMono
-
-NumberOfTests EQU ($-TestSequence)/3
-
-
-PUBLIC VL_VideoID
-VL_VideoID PROC
-
- push bp ; preserve caller registers
- mov bp,sp
- push ds
- push si
- push di
-
- push cs
- pop ds
- ASSUME DS:@Code
-
-; initialize the data structure that will contain the results
-
- lea di,Results ; DS:DI -> start of data structure
-
- mov Device0,0 ; zero these variables
- mov Device1,0
-
-; look for the various subsystems using the subroutines whose addresses are
-; tabulated in TestSequence; each subroutine sets flags in TestSequence
-; to indicate whether subsequent subroutines need to be called
-
- mov byte ptr CGAflag,TRUE
- mov byte ptr EGAflag,TRUE
- mov byte ptr Monoflag,TRUE
-
- mov cx,NumberOfTests
- mov si,offset TestSequence
-
-@@L01: lodsb ; AL := flag
- test al,al
- lodsw ; AX := subroutine address
- jz @@L02 ; skip subroutine if flag is false
-
- push si
- push cx
- call ax ; call subroutine to detect subsystem
- pop cx
- pop si
-
-@@L02: loop @@L01
-
-; determine which subsystem is active
-
- call FindActive
-
- mov al,Results.Video0Type
- mov ah,0 ; was: Results.Display0Type
-
- pop di ; restore caller registers and return
- pop si
- pop ds
- mov sp,bp
- pop bp
- ret
-
-VL_VideoID ENDP
-
-
-;
-; FindPS2
-;
-; This subroutine uses INT 10H function 1Ah to determine the video BIOS
-; Display Combination Code (DCC) for each video subsystem present.
-;
-
-FindPS2 PROC near
-
- mov ax,1A00h
- int 10h ; call video BIOS for info
-
- cmp al,1Ah
- jne @@L13 ; exit if function not supported (i.e.,
- ; no MCGA or VGA in system)
-
-; convert BIOS DCCs into specific subsystems & displays
-
- mov cx,bx
- xor bh,bh ; BX := DCC for active subsystem
-
- or ch,ch
- jz @@L11 ; jump if only one subsystem present
-
- mov bl,ch ; BX := inactive DCC
- add bx,bx
- mov ax,[bx+offset DCCtable]
-
- mov Device1,ax
-
- mov bl,cl
- xor bh,bh ; BX := active DCC
-
-@@L11: add bx,bx
- mov ax,[bx+offset DCCtable]
-
- mov Device0,ax
-
-; reset flags for subsystems that have been ruled out
-
- mov byte ptr CGAflag,FALSE
- mov byte ptr EGAflag,FALSE
- mov byte ptr Monoflag,FALSE
-
- lea bx,Video0Type[di] ; if the BIOS reported an MDA ...
- cmp byte ptr [bx],MDA
- je @@L12
-
- lea bx,Video1Type[di]
- cmp byte ptr [bx],MDA
- jne @@L13
-
-@@L12: mov word ptr [bx],0 ; ... Hercules can't be ruled out
- mov byte ptr Monoflag,TRUE
-
-@@L13: ret
-
-FindPS2 ENDP
-
-
-;
-; FindEGA
-;
-; Look for an EGA. This is done by making a call to an EGA BIOS function
-; which doesn't exist in the default (MDA, CGA) BIOS.
-
-FindEGA PROC near ; Caller: AH = flags
- ; Returns: AH = flags
- ; Video0Type and
- ; Display0Type updated
-
- mov bl,10h ; BL := 10h (return EGA info)
- mov ah,12h ; AH := INT 10H function number
- int 10h ; call EGA BIOS for info
- ; if EGA BIOS is present,
- ; BL <> 10H
- ; CL = switch setting
- cmp bl,10h
- je @@L22 ; jump if EGA BIOS not present
-
- mov al,cl
- shr al,1 ; AL := switches/2
- mov bx,offset EGADisplays
- xlat ; determine display type from switches
- mov ah,al ; AH := display type
- mov al,EGA ; AL := subystem type
- call FoundDevice
-
- cmp ah,MDADisplay
- je @@L21 ; jump if EGA has a monochrome display
-
- mov CGAflag,FALSE ; no CGA if EGA has color display
- jmp short @@L22
-
-@@L21: mov Monoflag,FALSE ; EGA has a mono display, so MDA and
- ; Hercules are ruled out
-@@L22: ret
-
-FindEGA ENDP
-
-;
-; FindCGA
-;
-; This is done by looking for the CGA's 6845 CRTC at I/O port 3D4H.
-;
-FindCGA PROC near ; Returns: VIDstruct updated
-
- mov dx,3D4h ; DX := CRTC address port
- call Find6845
- jc @@L31 ; jump if not present
-
- mov al,CGA
- mov ah,CGADisplay
- call FoundDevice
-
-@@L31: ret
-
-FindCGA ENDP
-
-;
-; FindMono
-;
-; This is done by looking for the MDA's 6845 CRTC at I/O port 3B4H. If
-; a 6845 is found, the subroutine distinguishes between an MDA
-; and a Hercules adapter by monitoring bit 7 of the CRT Status byte.
-; This bit changes on Hercules adapters but does not change on an MDA.
-;
-; The various Hercules adapters are identified by bits 4 through 6 of
-; the CRT Status value:
-;
-; 000b = HGC
-; 001b = HGC+
-; 101b = InColor card
-;
-
-FindMono PROC near ; Returns: VIDstruct updated
-
- mov dx,3B4h ; DX := CRTC address port
- call Find6845
- jc @@L44 ; jump if not present
-
- mov dl,0BAh ; DX := 3BAh (status port)
- in al,dx
- and al,80h
- mov ah,al ; AH := bit 7 (vertical sync on HGC)
-
- mov cx,8000h ; do this 32768 times
-@@L41: in al,dx
- and al,80h ; isolate bit 7
- cmp ah,al
- loope @@L41 ; wait for bit 7 to change
- jne @@L42 ; if bit 7 changed, it's a Hercules
-
- mov al,MDA ; if bit 7 didn't change, it's an MDA
- mov ah,MDADisplay
- call FoundDevice
- jmp short @@L44
-
-@@L42: in al,dx
- mov dl,al ; DL := value from status port
- and dl,01110000b ; mask bits 4 thru 6
-
- mov ah,MDADisplay ; assume it's a monochrome display
-
- mov al,HGCPlus ; look for an HGC+
- cmp dl,00010000b
- je @@L43 ; jump if it's an HGC+
-
- mov al,HGC ; look for an InColor card or HGC
- cmp dl,01010000b
- jne @@L43 ; jump if it's not an InColor card
-
- mov al,InColor ; it's an InColor card
- mov ah,EGAColorDisplay
-
-@@L43: call FoundDevice
-
-@@L44: ret
-
-FindMono ENDP
-
-;
-; Find6845
-;
-; This routine detects the presence of the CRTC on a MDA, CGA or HGC.
-; The technique is to write and read register 0Fh of the chip (cursor
-; low). If the same value is read as written, assume the chip is
-; present at the specified port addr.
-;
-
-Find6845 PROC near ; Caller: DX = port addr
- ; Returns: cf set if not present
- mov al,0Fh
- out dx,al ; select 6845 reg 0Fh (Cursor Low)
- inc dx
- in al,dx ; AL := current Cursor Low value
- mov ah,al ; preserve in AH
- mov al,66h ; AL := arbitrary value
- out dx,al ; try to write to 6845
-
- mov cx,100h
-@@L51: loop @@L51 ; wait for 6845 to respond
-
- in al,dx
- xchg ah,al ; AH := returned value
- ; AL := original value
- out dx,al ; restore original value
-
- cmp ah,66h ; test whether 6845 responded
- je @@L52 ; jump if it did (cf is reset)
-
- stc ; set carry flag if no 6845 present
-
-@@L52: ret
-
-Find6845 ENDP
-
-
-;
-; FindActive
-;
-; This subroutine stores the currently active device as Device0. The
-; current video mode determines which subsystem is active.
-;
-
-FindActive PROC near
-
- cmp word ptr Device1,0
- je @@L63 ; exit if only one subsystem
-
- cmp Video0Type[di],4 ; exit if MCGA or VGA present
- jge @@L63 ; (INT 10H function 1AH
- cmp Video1Type[di],4 ; already did the work)
- jge @@L63
-
- mov ah,0Fh
- int 10h ; AL := current BIOS video mode
-
- and al,7
- cmp al,7 ; jump if monochrome
- je @@L61 ; (mode 7 or 0Fh)
-
- cmp Display0Type[di],MDADisplay
- jne @@L63 ; exit if Display0 is color
- jmp short @@L62
-
-@@L61: cmp Display0Type[di],MDADisplay
- je @@L63 ; exit if Display0 is monochrome
-
-@@L62: mov ax,Device0 ; make Device0 currently active
- xchg ax,Device1
- mov Device0,ax
-
-@@L63: ret
-
-FindActive ENDP
-
-
-;
-; FoundDevice
-;
-; This routine updates the list of subsystems.
-;
-
-FoundDevice PROC near ; Caller: AH = display #
- ; AL = subsystem #
- ; Destroys: BX
- lea bx,Video0Type[di]
- cmp byte ptr [bx],0
- je @@L71 ; jump if 1st subsystem
-
- lea bx,Video1Type[di] ; must be 2nd subsystem
-
-@@L71: mov [bx],ax ; update list entry
- ret
-
-FoundDevice ENDP
-
-IDEAL
-
-
-
-END
--- a/WOLFSRC/JABHACK.ASM
+++ /dev/null
@@ -1,98 +1,0 @@
-; JABHACK.ASM
-
-.386C
-IDEAL
-MODEL MEDIUM
-
-EXTRN LDIV@:far
-
-;============================================================================
-
-DATASEG
-
-EXTRN _intaddr:word
-
-;============================================================================
-
-CODESEG
-
-; Hacked up Juan Jimenez's code a bit to just return 386/not 386
-PROC _CheckIs386
-PUBLIC _CheckIs386
-
- pushf ; Save flag registers, we use them here
- xor ax,ax ; Clear AX and...
- push ax ; ...push it onto the stack
- popf ; Pop 0 into flag registers (all bits to 0),
- pushf ; attempting to set bits 12-15 of flags to 0's
- pop ax ; Recover the save flags
- and ax,08000h ; If bits 12-15 of flags are set to
- cmp ax,08000h ; zero then it's 8088/86 or 80188/186
- jz not386
-
- mov ax,07000h ; Try to set flag bits 12-14 to 1's
- push ax ; Push the test value onto the stack
- popf ; Pop it into the flag register
- pushf ; Push it back onto the stack
- pop ax ; Pop it into AX for check
- and ax,07000h ; if bits 12-14 are cleared then
- jz not386 ; the chip is an 80286
-
- mov ax,1 ; We now assume it's a 80386 or better
- popf
- retf
-
-not386:
- xor ax,ax
- popf
- retf
-
- ENDP
-
-
-PROC _jabhack2
-PUBLIC _jabhack2
-
- jmp @@skip
-
-@@where:
- int 060h
- retf
-
-@@skip:
- push es
-
- mov ax,seg LDIV@
- mov es,ax
- mov ax,[WORD PTR @@where]
- mov [WORD FAR es:LDIV@],ax
- mov ax,[WORD PTR @@where+2]
- mov [WORD FAR es:LDIV@+2],ax
-
- mov ax,offset @@jabdiv
- mov [_intaddr],ax
- mov ax,seg @@jabdiv
- mov [_intaddr+2],ax
-
- pop es
- retf
-
-@@jabdiv:
- add sp,4 ;Nuke IRET address, but leave flags
- push bp
- mov bp,sp ;Save BP, and set it equal to stack
- cli
-
- mov eax,[bp+8]
- cdq
- idiv [DWORD PTR bp+12]
- mov edx,eax
- shr edx,16
-
- pop bp ;Restore BP
- popf ;Restore flags (from INT)
- retf 8 ;Return to original caller
-
- ENDP
-
- END
--- a/WOLFSRC/MAPSSDM.H
+++ /dev/null
@@ -1,14 +1,0 @@
-///////////////////////////////////////
-//
-// TED5 Map Header for SDM
-//
-///////////////////////////////////////
-
-//
-// Map Names
-//
-typedef enum {
- TUNNELS_1_MAP, // 0
- TUNNELS_2_MAP, // 1
- LASTMAP
- } mapnames;
--- a/WOLFSRC/MAPSSOD.H
+++ /dev/null
@@ -1,33 +1,0 @@
-///////////////////////////////////////
-//
-// TED5 Map Header for SOD
-//
-///////////////////////////////////////
-
-//
-// Map Names
-//
-typedef enum {
- TUNNELS_1_MAP, // 0
- TUNNELS_2_MAP, // 1
- TUNNELS_3_MAP, // 2
- TUNNELS_4_MAP, // 3
- TUNNEL_BOSS_MAP, // 4
- DUNGEONS_1_MAP, // 5
- DUNGEONS_2_MAP, // 6
- DUNGEONS_3_MAP, // 7
- DUNGEONS_4_MAP, // 8
- DUNGEON_BOSS_MAP, // 9
- CASTLE_1_MAP, // 10
- CASTLE_2_MAP, // 11
- CASTLE_3_MAP, // 12
- CASTLE_4_MAP, // 13
- CASTLE_5_MAP, // 14
- CASTLE_BOSS_MAP, // 15
- RAMPARTS_MAP, // 16
- DEATH_KNIGHT_MAP, // 17
- SECRET_1_MAP, // 18
- SECRET_2_MAP, // 19
- ANGEL_OF_DEATH_MAP, // 20
- LASTMAP
- } mapnames;
--- a/WOLFSRC/MAPSWL1.H
+++ /dev/null
@@ -1,42 +1,0 @@
-///////////////////////////////////////
-//
-// TED5 Map Header for WL1
-//
-///////////////////////////////////////
-
-//
-// Map Names
-//
-typedef enum {
- WOLF1_MAP1_MAP, // 0
- WOLF1_MAP2_MAP, // 1
- WOLF1_MAP3_MAP, // 2
- WOLF1_MAP4_MAP, // 3
- WOLF1_MAP5_MAP, // 4
- WOLF1_MAP6_MAP, // 5
- WOLF1_MAP7_MAP, // 6
- WOLF1_MAP8_MAP, // 7
- WOLF1_BOSS_MAP, // 8
- WOLF1_SECRET_MAP, // 9
- WOLF2_MAP1_MAP, // 10
- WOLF2_MAP2_MAP, // 11
- WOLF2_MAP3_MAP, // 12
- WOLF2_MAP4_MAP, // 13
- WOLF2_MAP5_MAP, // 14
- WOLF2_MAP6_MAP, // 15
- WOLF2_MAP7_MAP, // 16
- WOLF2_MAP8_MAP, // 17
- WOLF2_BOSS_MAP, // 18
- WOLF2_SECRET_MAP, // 19
- WOLF3_MAP1_MAP, // 20
- WOLF3_MAP2_MAP, // 21
- WOLF3_MAP3_MAP, // 22
- WOLF3_MAP4_MAP, // 23
- WOLF3_MAP5_MAP, // 24
- WOLF3_MAP6_MAP, // 25
- WOLF3_MAP7_MAP, // 26
- WOLF3_MAP8_MAP, // 27
- WOLF3_BOSS_MAP, // 28
- WOLF3_SECRET_MAP, // 29
- LASTMAP
- } mapnames;
--- a/WOLFSRC/MAPSWL6.H
+++ /dev/null
@@ -1,73 +1,0 @@
-///////////////////////////////////////
-//
-// TED5 Map Header for WL6
-//
-///////////////////////////////////////
-
-//
-// Map Names
-//
-typedef enum {
- WOLF1_MAP1_MAP, // 0
- WOLF1_MAP2_MAP, // 1
- WOLF1_MAP3_MAP, // 2
- WOLF1_MAP4_MAP, // 3
- WOLF1_MAP5_MAP, // 4
- WOLF1_MAP6_MAP, // 5
- WOLF1_MAP7_MAP, // 6
- WOLF1_MAP8_MAP, // 7
- WOLF1_BOSS_MAP, // 8
- WOLF1_SECRET_MAP, // 9
- WOLF2_MAP1_MAP, // 10
- WOLF2_MAP2_MAP, // 11
- WOLF2_MAP3_MAP, // 12
- WOLF2_MAP4_MAP, // 13
- WOLF2_MAP5_MAP, // 14
- WOLF2_MAP6_MAP, // 15
- WOLF2_MAP7_MAP, // 16
- WOLF2_MAP8_MAP, // 17
- WOLF2_BOSS_MAP, // 18
- WOLF2_SECRET_MAP, // 19
- WOLF3_MAP1_MAP, // 20
- WOLF3_MAP2_MAP, // 21
- WOLF3_MAP3_MAP, // 22
- WOLF3_MAP4_MAP, // 23
- WOLF3_MAP5_MAP, // 24
- WOLF3_MAP6_MAP, // 25
- WOLF3_MAP7_MAP, // 26
- WOLF3_MAP8_MAP, // 27
- WOLF3_BOSS_MAP, // 28
- WOLF3_SECRET_MAP, // 29
- WOLF4_MAP_1_MAP, // 30
- WOLF4_MAP_2_MAP, // 31
- WOLF4_MAP_3_MAP, // 32
- WOLF4_MAP_4_MAP, // 33
- WOLF4_MAP_5_MAP, // 34
- WOLF4_MAP_6_MAP, // 35
- WOLF4_MAP_7_MAP, // 36
- WOLF4_MAP_8_MAP, // 37
- WOLF4_BOSS_MAP, // 38
- WOLF4_SECRET_MAP, // 39
- WOLF5_MAP_1_MAP, // 40
- WOLF5_MAP_2_MAP, // 41
- WOLF5_MAP_3_MAP, // 42
- WOLF5_MAP_4_MAP, // 43
- WOLF5_MAP_5_MAP, // 44
- WOLF5_MAP_6_MAP, // 45
- WOLF5_MAP_7_MAP, // 46
- WOLF5_MAP_8_MAP, // 47
- WOLF5_BOSS_MAP, // 48
- WOLF5_SECRET_MAP, // 49
- WOLF6_MAP_1_MAP, // 50
- WOLF6_MAP_2_MAP, // 51
- WOLF6_MAP_3_MAP, // 52
- WOLF6_MAP_4_MAP, // 53
- WOLF6_MAP_5_MAP, // 54
- WOLF6_MAP_6_MAP, // 55
- WOLF6_MAP_7_MAP, // 56
- WOLF6_MAP_8_MAP, // 57
- WOLF6_BOSS_MAP, // 58
- WOLF6_SECRET_MAP, // 59
- MAP4L10PATH_MAP, // 60
- LASTMAP
- } mapnames;
--- a/WOLFSRC/MAPSWLF.H
+++ /dev/null
@@ -1,16 +1,0 @@
-///////////////////////////////////////
-//
-// TED5 Map Header for WLF
-//
-///////////////////////////////////////
-
-//
-// Map Names
-//
-typedef enum {
- LEVEL_ONE_MAP, // 0
- LEVEL_TWO_MAP, // 1
- LEVEL_THREE_MAP, // 2
- LEVEL_FOUR_MAP, // 3
- LASTMAP
- } mapnames;
--- a/WOLFSRC/MUNGE.C
+++ /dev/null
@@ -1,48 +1,0 @@
-
-/*
-=================
-=
-= VL_MungePic
-=
-=================
-*/
-
-void VL_MungePic (unsigned char far *source, unsigned width, unsigned height)
-{
- unsigned x,y,plane,size,pwidth;
- unsigned char far *temp, far *dest, far *srcline;
-
- size = width*height;
-
- if (width&3)
- errout ("VL_MungePic: Not divisable by 4!\n");
-
-//
-// copy the pic to a temp buffer
-//
- temp = (unsigned char far *)farmalloc (size);
- if (!temp)
- errout ("Non enough memory for munge buffer!\n");
-
- _fmemcpy (temp,source,size);
-
-//
-// munge it back into the original buffer
-//
- dest = source;
- pwidth = width/4;
-
- for (plane=0;plane<4;plane++)
- {
- srcline = temp;
- for (y=0;y<height;y++)
- {
- for (x=0;x<pwidth;x++)
- *dest++ = *(srcline+x*4+plane);
- srcline+=width;
- }
- }
-
- free (temp);
-}
-
binary files a/WOLFSRC/OBJ/GAMEPAL.OBJ /dev/null differ
binary files a/WOLFSRC/OBJ/SIGNON.OBJ /dev/null differ
--- a/WOLFSRC/OLDSCALE.C
+++ /dev/null
@@ -1,737 +1,0 @@
-// WL_SCALE.C
-
-#include "WL_DEF.H"
-#pragma hdrstop
-
-#define OP_RETF 0xcb
-
-/*
-=============================================================================
-
- GLOBALS
-
-=============================================================================
-*/
-
-t_compscale _seg *scaledirectory[MAXSCALEHEIGHT+1];
-long fullscalefarcall[MAXSCALEHEIGHT+1];
-
-int maxscale,maxscaleshl2;
-
-/*
-=============================================================================
-
- LOCALS
-
-=============================================================================
-*/
-
-t_compscale _seg *work;
-unsigned BuildCompScale (int height, memptr *finalspot);
-
-int stepbytwo;
-
-//===========================================================================
-
-/*
-==============
-=
-= BadScale
-=
-==============
-*/
-
-void far BadScale (void)
-{
- Quit ("BadScale called!");
-}
-
-
-/*
-==========================
-=
-= SetupScaling
-=
-==========================
-*/
-
-void SetupScaling (int maxscaleheight)
-{
- int i,x,y;
- byte far *dest;
-
- maxscaleheight/=2; // one scaler every two pixels
-
- maxscale = maxscaleheight-1;
- maxscaleshl2 = maxscale<<2;
-
-//
-// free up old scalers
-//
- for (i=1;i<MAXSCALEHEIGHT;i++)
- {
- if (scaledirectory[i])
- MM_FreePtr (&(memptr)scaledirectory[i]);
- if (i>=stepbytwo)
- i += 2;
- }
- memset (scaledirectory,0,sizeof(scaledirectory));
-
- MM_SortMem ();
-
-//
-// build the compiled scalers
-//
- stepbytwo = viewheight/2; // save space by double stepping
- MM_GetPtr (&(memptr)work,20000);
- if (mmerror)
- return;
-
- for (i=1;i<=maxscaleheight;i++)
- {
- BuildCompScale (i*2,&(memptr)scaledirectory[i]);
- if (mmerror)
- {
- MM_FreePtr (&(memptr)work);
- return;
- }
- if (i>=stepbytwo)
- i+= 2;
- }
- MM_FreePtr (&(memptr)work);
-
-//
-// compact memory and lock down scalers
-//
- MM_SortMem ();
- for (i=1;i<=maxscaleheight;i++)
- {
- MM_SetLock (&(memptr)scaledirectory[i],true);
- fullscalefarcall[i] = (unsigned)scaledirectory[i];
- fullscalefarcall[i] <<=16;
- fullscalefarcall[i] += scaledirectory[i]->codeofs[0];
- if (i>=stepbytwo)
- {
- scaledirectory[i+1] = scaledirectory[i];
- fullscalefarcall[i+1] = fullscalefarcall[i];
- scaledirectory[i+2] = scaledirectory[i];
- fullscalefarcall[i+2] = fullscalefarcall[i];
- i+=2;
- }
- }
- scaledirectory[0] = scaledirectory[1];
- fullscalefarcall[0] = fullscalefarcall[1];
-
-//
-// check for oversize wall drawing
-//
- for (i=maxscaleheight;i<MAXSCALEHEIGHT;i++)
- fullscalefarcall[i] = (long)BadScale;
-
-}
-
-//===========================================================================
-
-/*
-========================
-=
-= BuildCompScale
-=
-= Builds a compiled scaler object that will scale a 64 tall object to
-= the given height (centered vertically on the screen)
-=
-= height should be even
-=
-= Call with
-= ---------
-= DS:SI Source for scale
-= ES:DI Dest for scale
-=
-= Calling the compiled scaler only destroys AL
-=
-========================
-*/
-
-unsigned BuildCompScale (int height, memptr *finalspot)
-{
- byte far *code;
-
- int i;
- long fix,step;
- unsigned src,totalscaled,totalsize;
- int startpix,endpix,toppix;
-
-
- step = ((long)height<<16) / 64;
- code = &work->code[0];
- toppix = (viewheight-height)/2;
- fix = 0;
-
- for (src=0;src<=64;src++)
- {
- startpix = fix>>16;
- fix += step;
- endpix = fix>>16;
-
- if (endpix>startpix)
- work->width[src] = endpix-startpix;
- else
- work->width[src] = 0;
-
-//
-// mark the start of the code
-//
- work->codeofs[src] = FP_OFF(code);
-
-//
-// compile some code if the source pixel generates any screen pixels
-//
- startpix+=toppix;
- endpix+=toppix;
-
- if (startpix == endpix || endpix < 0 || startpix >= viewheight || src == 64)
- continue;
-
- //
- // mov al,[si+src]
- //
- *code++ = 0x8a;
- *code++ = 0x44;
- *code++ = src;
-
- for (;startpix<endpix;startpix++)
- {
- if (startpix >= viewheight)
- break; // off the bottom of the view area
- if (startpix < 0)
- continue; // not into the view area
-
- //
- // mov [es:di+heightofs],al
- //
- *code++ = 0x26;
- *code++ = 0x88;
- *code++ = 0x85;
- *((unsigned far *)code)++ = startpix*SCREENBWIDE;
- }
-
- }
-
-//
-// retf
-//
- *code++ = 0xcb;
-
- totalsize = FP_OFF(code);
- MM_GetPtr (finalspot,totalsize);
- if (mmerror)
- return 0;
- _fmemcpy ((byte _seg *)(*finalspot),(byte _seg *)work,totalsize);
-
- return totalsize;
-}
-
-
-/*
-=======================
-=
-= ScaleLine
-=
-= linescale should have the high word set to the segment of the scaler
-=
-=======================
-*/
-
-extern int slinex,slinewidth;
-extern unsigned far *linecmds;
-extern long linescale;
-extern unsigned maskword;
-
-byte mask1,mask2,mask3;
-
-
-void near ScaleLine (void)
-{
-asm mov cx,WORD PTR [linescale+2]
-asm mov es,cx // segment of scaler
-
-asm mov bp,WORD PTR [linecmds]
-asm mov dx,SC_INDEX+1 // to set SC_MAPMASK
-
-asm mov bx,[slinex]
-asm mov di,bx
-asm shr di,2 // X in bytes
-asm add di,[bufferofs]
-asm and bx,3
-asm shl bx,3
-asm add bx,[slinewidth] // bx = (pixel*8+pixwidth)
-asm mov al,BYTE [mapmasks3-1+bx] // -1 because pixwidth of 1 is first
-asm mov ds,WORD PTR [linecmds+2]
-asm or al,al
-asm jz notthreebyte // scale across three bytes
-asm jmp threebyte
-notthreebyte:
-asm mov al,BYTE PTR ss:[mapmasks2-1+bx] // -1 because pixwidth of 1 is first
-asm or al,al
-asm jnz twobyte // scale across two bytes
-
-//
-// one byte scaling
-//
-asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
-asm out dx,al // set map mask register
-
-scalesingle:
-
-asm mov bx,[ds:bp] // table location of rtl to patch
-asm or bx,bx
-asm jz linedone // 0 signals end of segment list
-asm mov bx,[es:bx]
-asm mov dl,[es:bx] // save old value
-asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
-asm mov si,[ds:bp+4] // table location of entry spot
-asm mov ax,[es:si]
-asm mov WORD PTR ss:[linescale],ax // call here to start scaling
-asm mov si,[ds:bp+2] // corrected top of shape for this segment
-asm add bp,6 // next segment list
-
-asm mov ax,SCREENSEG
-asm mov es,ax
-asm call ss:[linescale] // scale the segment of pixels
-
-asm mov es,cx // segment of scaler
-asm mov BYTE PTR es:[bx],dl // unpatch the RETF
-asm jmp scalesingle // do the next segment
-
-
-//
-// done
-//
-linedone:
-asm mov ax,ss
-asm mov ds,ax
-return;
-
-//
-// two byte scaling
-//
-twobyte:
-asm mov ss:[mask2],al
-asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
-asm mov ss:[mask1],al
-
-scaledouble:
-
-asm mov bx,[ds:bp] // table location of rtl to patch
-asm or bx,bx
-asm jz linedone // 0 signals end of segment list
-asm mov bx,[es:bx]
-asm mov cl,[es:bx] // save old value
-asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
-asm mov si,[ds:bp+4] // table location of entry spot
-asm mov ax,[es:si]
-asm mov WORD PTR ss:[linescale],ax // call here to start scaling
-asm mov si,[ds:bp+2] // corrected top of shape for this segment
-asm add bp,6 // next segment list
-
-asm mov ax,SCREENSEG
-asm mov es,ax
-asm mov al,ss:[mask1]
-asm out dx,al // set map mask register
-asm call ss:[linescale] // scale the segment of pixels
-asm inc di
-asm mov al,ss:[mask2]
-asm out dx,al // set map mask register
-asm call ss:[linescale] // scale the segment of pixels
-asm dec di
-
-asm mov es,WORD PTR ss:[linescale+2] // segment of scaler
-asm mov BYTE PTR es:[bx],cl // unpatch the RETF
-asm jmp scaledouble // do the next segment
-
-
-//
-// three byte scaling
-//
-threebyte:
-asm mov ss:[mask3],al
-asm mov al,BYTE PTR ss:[mapmasks2-1+bx] // -1 because pixwidth of 1 is first
-asm mov ss:[mask2],al
-asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
-asm mov ss:[mask1],al
-
-scaletriple:
-
-asm mov bx,[ds:bp] // table location of rtl to patch
-asm or bx,bx
-asm jz linedone // 0 signals end of segment list
-asm mov bx,[es:bx]
-asm mov cl,[es:bx] // save old value
-asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
-asm mov si,[ds:bp+4] // table location of entry spot
-asm mov ax,[es:si]
-asm mov WORD PTR ss:[linescale],ax // call here to start scaling
-asm mov si,[ds:bp+2] // corrected top of shape for this segment
-asm add bp,6 // next segment list
-
-asm mov ax,SCREENSEG
-asm mov es,ax
-asm mov al,ss:[mask1]
-asm out dx,al // set map mask register
-asm call ss:[linescale] // scale the segment of pixels
-asm inc di
-asm mov al,ss:[mask2]
-asm out dx,al // set map mask register
-asm call ss:[linescale] // scale the segment of pixels
-asm inc di
-asm mov al,ss:[mask3]
-asm out dx,al // set map mask register
-asm call ss:[linescale] // scale the segment of pixels
-asm dec di
-asm dec di
-
-asm mov es,WORD PTR ss:[linescale+2] // segment of scaler
-asm mov BYTE PTR es:[bx],cl // unpatch the RETF
-asm jmp scaletriple // do the next segment
-
-
-}
-
-
-/*
-=======================
-=
-= ScaleShape
-=
-= Draws a compiled shape at [scale] pixels high
-=
-= each vertical line of the shape has a pointer to segment data:
-= end of segment pixel*2 (0 terminates line) used to patch rtl in scaler
-= top of virtual line with segment in proper place
-= start of segment pixel*2, used to jsl into compiled scaler
-= <repeat>
-=
-= Setup for call
-= --------------
-= GC_MODE read mode 1, write mode 2
-= GC_COLORDONTCARE set to 0, so all reads from video memory return 0xff
-= GC_INDEX pointing at GC_BITMASK
-=
-=======================
-*/
-
-static long longtemp;
-
-void ScaleShape (int xcenter, int shapenum, unsigned height)
-{
- t_compshape _seg *shape;
- t_compscale _seg *comptable;
- unsigned scale,srcx,stopx,tempx;
- int t;
- unsigned far *cmdptr;
- boolean leftvis,rightvis;
-
-
- shape = PM_GetSpritePage (shapenum);
-
- scale = height>>3; // low three bits are fractional
- if (!scale || scale>maxscale)
- return; // too close or far away
- comptable = scaledirectory[scale];
-
- *(((unsigned *)&linescale)+1)=(unsigned)comptable; // seg of far call
- *(((unsigned *)&linecmds)+1)=(unsigned)shape; // seg of shape
-
-//
-// scale to the left (from pixel 31 to shape->leftpix)
-//
- srcx = 32;
- slinex = xcenter;
- stopx = shape->leftpix;
- cmdptr = &shape->dataofs[31-stopx];
-
- while ( --srcx >=stopx && slinex>0)
- {
- (unsigned)linecmds = *cmdptr--;
- if ( !(slinewidth = comptable->width[srcx]) )
- continue;
-
- if (slinewidth == 1)
- {
- slinex--;
- if (slinex<viewwidth)
- {
- if (wallheight[slinex] >= height)
- continue; // obscured by closer wall
- ScaleLine ();
- }
- continue;
- }
-
- //
- // handle multi pixel lines
- //
- if (slinex>viewwidth)
- {
- slinex -= slinewidth;
- slinewidth = viewwidth-slinex;
- if (slinewidth<1)
- continue; // still off the right side
- }
- else
- {
- if (slinewidth>slinex)
- slinewidth = slinex;
- slinex -= slinewidth;
- }
-
-
- leftvis = (wallheight[slinex] < height);
- rightvis = (wallheight[slinex+slinewidth-1] < height);
-
- if (leftvis)
- {
- if (rightvis)
- ScaleLine ();
- else
- {
- while (wallheight[slinex+slinewidth-1] >= height)
- slinewidth--;
- ScaleLine ();
- }
- }
- else
- {
- if (!rightvis)
- continue; // totally obscured
-
- while (wallheight[slinex] >= height)
- {
- slinex++;
- slinewidth--;
- }
- ScaleLine ();
- break; // the rest of the shape is gone
- }
- }
-
-
-//
-// scale to the right
-//
- slinex = xcenter;
- stopx = shape->rightpix;
- if (shape->leftpix<31)
- {
- srcx = 31;
- cmdptr = &shape->dataofs[32-shape->leftpix];
- }
- else
- {
- srcx = shape->leftpix-1;
- cmdptr = &shape->dataofs[0];
- }
- slinewidth = 0;
-
- while ( ++srcx <= stopx && (slinex+=slinewidth)<viewwidth)
- {
- (unsigned)linecmds = *cmdptr++;
- if ( !(slinewidth = comptable->width[srcx]) )
- continue;
-
- if (slinewidth == 1)
- {
- if (slinex>=0 && wallheight[slinex] < height)
- {
- ScaleLine ();
- }
- continue;
- }
-
- //
- // handle multi pixel lines
- //
- if (slinex<0)
- {
- if (slinewidth <= -slinex)
- continue; // still off the left edge
-
- slinewidth += slinex;
- slinex = 0;
- }
- else
- {
- if (slinex + slinewidth > viewwidth)
- slinewidth = viewwidth-slinex;
- }
-
-
- leftvis = (wallheight[slinex] < height);
- rightvis = (wallheight[slinex+slinewidth-1] < height);
-
- if (leftvis)
- {
- if (rightvis)
- {
- ScaleLine ();
- }
- else
- {
- while (wallheight[slinex+slinewidth-1] >= height)
- slinewidth--;
- ScaleLine ();
- break; // the rest of the shape is gone
- }
- }
- else
- {
- if (rightvis)
- {
- while (wallheight[slinex] >= height)
- {
- slinex++;
- slinewidth--;
- }
- ScaleLine ();
- }
- else
- continue; // totally obscured
- }
- }
-}
-
-
-
-/*
-=======================
-=
-= SimpleScaleShape
-=
-= NO CLIPPING, height in pixels
-=
-= Draws a compiled shape at [scale] pixels high
-=
-= each vertical line of the shape has a pointer to segment data:
-= end of segment pixel*2 (0 terminates line) used to patch rtl in scaler
-= top of virtual line with segment in proper place
-= start of segment pixel*2, used to jsl into compiled scaler
-= <repeat>
-=
-= Setup for call
-= --------------
-= GC_MODE read mode 1, write mode 2
-= GC_COLORDONTCARE set to 0, so all reads from video memory return 0xff
-= GC_INDEX pointing at GC_BITMASK
-=
-=======================
-*/
-
-void SimpleScaleShape (int xcenter, int shapenum, unsigned height)
-{
- t_compshape _seg *shape;
- t_compscale _seg *comptable;
- unsigned scale,srcx,stopx,tempx;
- int t;
- unsigned far *cmdptr;
- boolean leftvis,rightvis;
-
-
- shape = PM_GetSpritePage (shapenum);
-
- scale = height>>1;
- comptable = scaledirectory[scale];
-
- *(((unsigned *)&linescale)+1)=(unsigned)comptable; // seg of far call
- *(((unsigned *)&linecmds)+1)=(unsigned)shape; // seg of shape
-
-//
-// scale to the left (from pixel 31 to shape->leftpix)
-//
- srcx = 32;
- slinex = xcenter;
- stopx = shape->leftpix;
- cmdptr = &shape->dataofs[31-stopx];
-
- while ( --srcx >=stopx )
- {
- (unsigned)linecmds = *cmdptr--;
- if ( !(slinewidth = comptable->width[srcx]) )
- continue;
-
- slinex -= slinewidth;
- ScaleLine ();
- }
-
-
-//
-// scale to the right
-//
- slinex = xcenter;
- stopx = shape->rightpix;
- if (shape->leftpix<31)
- {
- srcx = 31;
- cmdptr = &shape->dataofs[32-shape->leftpix];
- }
- else
- {
- srcx = shape->leftpix-1;
- cmdptr = &shape->dataofs[0];
- }
- slinewidth = 0;
-
- while ( ++srcx <= stopx )
- {
- (unsigned)linecmds = *cmdptr++;
- if ( !(slinewidth = comptable->width[srcx]) )
- continue;
-
- ScaleLine ();
- slinex+=slinewidth;
- }
-}
-
-
-
-
-//
-// bit mask tables for drawing scaled strips up to eight pixels wide
-//
-// down here so the STUPID inline assembler doesn't get confused!
-//
-
-
-byte mapmasks1[4][8] = {
-{1 ,3 ,7 ,15,15,15,15,15},
-{2 ,6 ,14,14,14,14,14,14},
-{4 ,12,12,12,12,12,12,12},
-{8 ,8 ,8 ,8 ,8 ,8 ,8 ,8} };
-
-byte mapmasks2[4][8] = {
-{0 ,0 ,0 ,0 ,1 ,3 ,7 ,15},
-{0 ,0 ,0 ,1 ,3 ,7 ,15,15},
-{0 ,0 ,1 ,3 ,7 ,15,15,15},
-{0 ,1 ,3 ,7 ,15,15,15,15} };
-
-byte mapmasks3[4][8] = {
-{0 ,0 ,0 ,0 ,0 ,0 ,0 ,0},
-{0 ,0 ,0 ,0 ,0 ,0 ,0 ,1},
-{0 ,0 ,0 ,0 ,0 ,0 ,1 ,3},
-{0 ,0 ,0 ,0 ,0 ,1 ,3 ,7} };
-
-
-unsigned wordmasks[8][8] = {
-{0x0080,0x00c0,0x00e0,0x00f0,0x00f8,0x00fc,0x00fe,0x00ff},
-{0x0040,0x0060,0x0070,0x0078,0x007c,0x007e,0x007f,0x807f},
-{0x0020,0x0030,0x0038,0x003c,0x003e,0x003f,0x803f,0xc03f},
-{0x0010,0x0018,0x001c,0x001e,0x001f,0x801f,0xc01f,0xe01f},
-{0x0008,0x000c,0x000e,0x000f,0x800f,0xc00f,0xe00f,0xf00f},
-{0x0004,0x0006,0x0007,0x8007,0xc007,0xe007,0xf007,0xf807},
-{0x0002,0x0003,0x8003,0xc003,0xe003,0xf003,0xf803,0xfc03},
-{0x0001,0x8001,0xc001,0xe001,0xf001,0xf801,0xfc01,0xfe01} };
-
-int slinex,slinewidth;
-unsigned far *linecmds;
-long linescale;
-unsigned maskword;
-
--- a/WOLFSRC/PICLIST.H
+++ /dev/null
@@ -1,36 +1,0 @@
-//////////////////////////////////////
-//
-// Graphics .H file for .WL1
-// IGRAB-ed on Sat May 02 02:32:49 1992
-//
-//////////////////////////////////////
-
-typedef enum {
- // Lump Start
- H_BJPIC=3,
- H_CASTLEPIC, // 4
- H_KEYBOARDPIC, // 5
- H_JOYPIC, // 6
- H_MOUSEPIC, // 7
- H_BOTHPIC, // 8
- H_GAMEPADPIC, // 9
- H_HEALPIC, // 10
- H_TREASUREPIC, // 11
- H_GUNPIC, // 12
- H_KEYPIC, // 13
- H_BLAZEPIC, // 14
- H_WEAPON1234PIC, // 15
- H_WOLFLOGOPIC, // 16
- H_VISAPIC, // 17
- H_MCPIC, // 18
- H_IDLOGOPIC, // 19
- H_FAXPIC, // 20
- H_GALACTIXPIC, // 21
- H_FGODMOMPIC, // 22
- H_AUSTRALIAPIC, // 23
- H_CANADAPIC, // 24
- H_UKPIC, // 25
- H_TOPWINDOWPIC, // 26
- H_LEFTWINDOWPIC, // 27
- H_RIGHTWINDOWPIC, // 28
- H_BOTTOMINFOPIC, // 29
--- a/WOLFSRC/README/LICENSE.DOC
+++ /dev/null
@@ -1,129 +1,0 @@
- LIMITED USE SOFTWARE LICENSE AGREEMENT
-
- This Limited Use Software License Agreement (the "Agreement")
-is a legal agreement between you, the end-user, and Id Software, Inc.
-("ID"). By continuing the downloading of this Wolfenstein 3D
-(the "Trademark") software material, which includes source code
-(the "Source Code"), artwork data, music and software tools
-(collectively, the "Software"), you are agreeing to be bound by the
-terms of this Agreement. If you do not agree to the terms of this
-Agreement, promptly destroy the Software you may have downloaded.
-
-ID SOFTWARE LICENSE
-
- Grant of License. ID grants to you the right to use one (1)
-copy of the Software on a single computer. You have no ownership or
-proprietary rights in or to the Software, or the Trademark. For purposes
-of this section, "use" means loading the Software into RAM, as well as
-installation on a hard disk or other storage device. The Software,
-together with any archive copy thereof, shall be destroyed when no longer
-used in accordance with this Agreement, or when the right to use the
-Software is terminated. You agree that the Software will not be shipped,
-transferred or exported into any country in violation of the U.S.
-Export Administration Act (or any other law governing such matters) and
-that you will not utilize, in any other manner, the Software in violation
-of any applicable law.
-
- Permitted Uses. For educational purposes only, you, the end-user,
-may use portions of the Source Code, such as particular routines, to
-develop your own software, but may not duplicate the Source Code, except
-as noted in paragraph 4. The limited right referenced in the preceding
-sentence is hereinafter referred to as "Educational Use." By so exercising
-the Educational Use right you shall not obtain any ownership, copyright,
-proprietary or other interest in or to the Source Code, or any portion of
-the Source Code. You may dispose of your own software in your sole
-discretion. With the exception of the Educational Use right, you may not
-otherwise use the Software, or an portion of the Software, which includes
-the Source Code, for commercial gain.
-
- Prohibited Uses: Under no circumstances shall you, the end-user,
-be permitted, allowed or authorized to commercially exploit the Software.
-Neither you nor anyone at your direction shall do any of the following acts
-with regard to the Software, or any portion thereof:
-
- Rent;
-
- Sell;
-
- Lease;
-
- Offer on a pay-per-play basis;
-
- Distribute for money or any other consideration; or
-
- In any other manner and through any medium whatsoever commercially
-exploit or use for any commercial purpose.
-
-Notwithstanding the foregoing prohibitions, you may commercially exploit the
-software you develop by exercising the Educational Use right, referenced in
-paragraph 2. hereinabove.
-
- Copyright. The Software and all copyrights related thereto
-(including all characters and other images generated by the Software
-or depicted in the Software) are owned by ID and is protected by
-United States copyright laws and international treaty provisions.
-Id shall retain exclusive ownership and copyright in and to the Software
-and all portions of the Software and you shall have no ownership or other
-proprietary interest in such materials. You must treat the Software like
-any other copyrighted material, except that you may either (a) make one
-copy of the Software solely for back-up or archival purposes, or (b)
-transfer the Software to a single hard disk provided you keep the original
-solely for back-up or archival purposes. You may not otherwise reproduce,
-copy or disclose to others, in whole or in any part, the Software. You
-may not copy the written materials accompanying the Software. You agree
-to use your best efforts to see that any user of the Software licensed
-hereunder complies with this Agreement.
-
- NO WARRANTIES. ID DISCLAIMS ALL WARRANTIES, BOTH EXPRESS IMPLIED,
-INCLUDING BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE WITH RESPECT TO THE SOFTWARE. THIS LIMITED
-WARRANTY GIVES YOU SPECIFIC LEGAL RIGHTS. YOU MAY HAVE OTHER RIGHTS WHICH
-VARY FROM JURISDICTION TO JURISDICTION. ID DOES NOT WARRANT THAT THE
-OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED, ERROR FREE OR MEET YOUR
-SPECIFIC REQUIREMENTS. THE WARRANTY SET FORTH ABOVE IS IN LIEU OF ALL OTHER
-EXPRESS WARRANTIES WHETHER ORAL OR WRITTEN. THE AGENTS, EMPLOYEES,
-DISTRIBUTORS, AND DEALERS OF ID ARE NOT AUTHORIZED TO MAKE MODIFICATIONS TO
-THIS WARRANTY, OR ADDITIONAL WARRANTIES ON BEHALF OF ID.
-
- Exclusive Remedies. The Software is being offered to you free of any
-charge. You agree that you have no remedy against ID, its affiliates,
-contractors, suppliers, and agents for loss or damage caused by any defect
-or failure in the Software regardless of the form of action, whether in
-contract, tort, includinegligence, strict liability or otherwise, with
-regard to the Software. This Agreement shall be construed in accordance
-with and governed by the laws of the State of Texas. Copyright and other
-proprietary matters will be governed by United States laws and international
-treaties. IN ANY CASE, ID SHALL NOT BE LIABLE FOR LOSS OF DATA, LOSS OF
-PROFITS, LOST SAVINGS, SPECIAL, INCIDENTAL, CONSEQUENTIAL, INDIRECT OR OTHER
-SIMILAR DAMAGES ARISING FROM BREACH OF WARRANTY, BREACH OF CONTRACT,
-NEGLIGENCE, OR OTHER LEGAL THEORY EVEN IF ID OR ITS AGENT HAS BEEN ADVISED
-OF THE POSSIBILITY OF SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY.
-Some jurisdictions do not allow the exclusion or limitation of incidental or
-consequential damages, so the above limitation or exclusion may not apply to
-you.
-
- General Provisions. Neither this Agreement nor any part or portion
-hereof shall be assigned, sublicensed or otherwise transferred by you.
-Should any provision of this Agreement be held to be void, invalid,
-unenforceable or illegal by a court, the validity and enforceability of the
-other provisions shall not be affected thereby. If any provision is
-determined to be unenforceable, you agree to a modification of such
-provision to provide for enforcement of the provision's intent, to the
-extent permitted by applicable law. Failure of a party to enforce any
-provision of this Agreement shall not constitute or be construed as a
-waiver of such provision or of the right to enforce such provision. If
-you fail to comply with any terms of this Agreement, YOUR LICENSE IS
-AUTOMATICALLY TERMINATED and you agree to the issuance of an injunction
-against you in favor of Id. You agree that Id shall not have to post
-bond or other security to obtain an injunction against you to prohibit
-you from violating Id's rights.
-
- YOU ACKNOWLEDGE THAT YOU HAVE READ THIS AGREEMENT, THAT YOU
-UNDERSTAND THIS AGREEMENT, AND UNDERSTAND THAT BY CONTINUING THE
-DOWNLOADING OF THE SOFTWARE, YOU AGREE TO BE BOUND BY THIS AGREEMENT'S
-TERMS AND CONDITIONS. YOU FURTHER AGREE THAT, EXCEPT FOR WRITTEN SEPARATE
-AGREEMENTS BETWEEN ID AND YOU, THIS AGREEMENT IS A COMPLETE AND EXCLUSIVE
-STATEMENT OF THE RIGHTS AND LIABILITIES OF THE PARTIES. THIS AGREEMENT
-SUPERSEDES ALL PRIOR ORAL AGREEMENTS, PROPOSALS OR UNDERSTANDINGS, AND
-ANY OTHER COMMUNICATIONS BETWEEN ID AND YOU RELATING TO THE SUBJECT MATTER
-OF THIS AGREEMENT
--- a/WOLFSRC/README/README.TXT
+++ /dev/null
@@ -1,8 +1,0 @@
-NOTES:
-------
-
-This version will compile under BORLAND C++ 3.0/3.1 and compiled perfectly
-before it was uploaded.
-
-Please do not send your questions to id Software.
-
--- a/WOLFSRC/README/RELEASE.TXT
+++ /dev/null
@@ -1,53 +1,0 @@
-We are releasing this code for the entertainment of the
-user community. We don't guarentee that anything even
-builds in here. Projects just seem to rot when you leave
-them alone for long periods of time.
-
-This is all the source we have relating to the original
-PC wolfenstein 3D project. We haven't looked at this
-stuff in years, and I would probably be horribly embarassed
-to dig through my old code, so please don't ask any questions
-about it. The original project was built in borland c++ 3.0.
-I think some minor changes were required for later versions.
-
-You will need the data from a released version of wolf or spear
-to use the exe built from this code. You can just use a
-shareware version if you are really cheap.
-
-
-Some coding comments in retrospect:
-
-The ray casting refresh architecture is still reasonably
-appropriate for the game. A BSP based texture mapper could
-go faster, but ray casting was a lot simpler to do at the time.
-
-The dynamically compiled scaling routines are now a Bad Thing.
-On uncached machines (the original target) they are the fastest
-possible way to scale walls, but on modern processors you just
-wind up thrashing the code cash and wrecking performance.
-A simple looping texture mapper would be faster on 486+ machines.
-
-The whole page manager caching scheme is unecessarily complex.
-
-Way too many #ifdefs in the code!
-
-
-Some project ideas with this code:
-
-Add new monsters or weapons.
-
-Add taller walls and vertical motion. This should only be
-done if the texture mapper is rewritten.
-
-Convert to a 32 bit compiler. This would be a fair amount
-of work, but I would hate to even mess with crusty old 16
-bit code. The code would get a LOT smaller.
-
-Make a multi-player game that runs on DOOM sersetup / ipxsetup drivers.
-
-
-Have fun...
-
-John Carmack
-Technical Director
-Id Software
binary files a/WOLFSRC/README/~$ICENSE.DOC /dev/null differ
--- a/WOLFSRC/RULES.ASI
+++ /dev/null
@@ -1,692 +1,0 @@
-;[]-----------------------------------------------------------------[]
-;| RULES.ASI -- Rules & Structures for assembler |
-;| |
-;| Turbo C++ Run Time Library |
-;| |
-;| Copyright (c) 1987, 1991 by Borland International Inc. |
-;| All Rights Reserved. |
-;[]-----------------------------------------------------------------[]
-
-;*** First we begin with a few of the major constants of C.
-
-false equ 0 ; Beware ! For incoming parameters, non-false = true.
-true equ 1 ; For results, we generate the proper numbers.
-
-lesser equ -1 ; Incoming, lesser < 0
-equal equ 0
-greater equ 1 ; Incoming, greater > 0
-
- PAGE
-;[]------------------------------------------------------------[]
-;| |
-;| Conditional Assembly Directives |
-;| |
-;[]------------------------------------------------------------[]
-
-;memory model aliases, for the convenience of building the library
-
-IFDEF __s__
-__SMALL__ equ 1
-ENDIF
-
-IFDEF __c__
-__COMPACT__ equ 1
-ENDIF
-
-IFDEF __m__
-__MEDIUM__ equ 1
-ENDIF
-
-IFDEF __l__
-__LARGE__ equ 1
-ENDIF
-
-IFDEF __h__
-__HUGE__ equ 1
-ENDIF
-
-IFNDEF __TINY__
- IFNDEF __SMALL__
- IFNDEF __MEDIUM__
- IFNDEF __COMPACT__
- IFNDEF __LARGE__
- IFNDEF __HUGE__
- %OUT You must supply a model symbol.
- .ERR
- ENDIF
- ENDIF
- ENDIF
- ENDIF
- ENDIF
-ENDIF
-
-;bit masks to extract default pointer types from MMODEL (at run-time)
-FCODE equ 8000h
-FDATA equ 4000h
-
-IFDEF __TINY__ ; Small Code - Small Data
- LPROG equ false
- LDATA equ false
- MMODEL equ 0
- _DSSTACK_ equ <>
-ENDIF
-
-IFDEF __SMALL__ ; Small Code - Small Data
- LPROG equ false
- LDATA equ false
- MMODEL equ 1
- _DSSTACK_ equ <>
-ENDIF
-
-IFDEF __MEDIUM__ ; Large Code - Small Data
- LPROG equ true
- LDATA equ false
- MMODEL equ FCODE+2
- _DSSTACK_ equ <>
-ENDIF
-
-IFDEF __COMPACT__ ; Small Code - Large Data
- LPROG equ false
- LDATA equ true
- MMODEL equ FDATA+3
-ENDIF
-
-IFDEF __LARGE__ ; Large Code - Large Data
- LPROG equ true
- LDATA equ true
- MMODEL equ FCODE+FDATA+4
-ENDIF
-
-IFDEF __HUGE__ ; Large Code - Large Data
- LPROG equ true
- LDATA equ true
- MMODEL equ FCODE+FDATA+5
-ENDIF
-
-IF LPROG
- DIST equ FAR
-ELSE
- DIST equ NEAR
-ENDIF
-
- PAGE
-;[]------------------------------------------------------------[]
-;| |
-;| Segment Declarations Macros |
-;| |
-;[]------------------------------------------------------------[]
-
-Code_Seg@ MACRO ;; Open a Code Segment
-IFDEF __WINDOWS__
-_TEXT SEGMENT WORD PUBLIC 'CODE'
-ELSE
-_TEXT SEGMENT BYTE PUBLIC 'CODE'
-ENDIF
- ASSUME CS:_TEXT
- ENDM
-
-Code_EndS@ MACRO ;; Close a Code Segment
-_TEXT ENDS
- ENDM
-
-Data_Seg@ MACRO ;; Open a Data Segment (initialized)
-_DATA SEGMENT WORD PUBLIC 'DATA'
- ENDM
-
-Data_EndS@ MACRO ;; Close a Data Segment (initialized)
-_DATA ENDS
- ENDM
-
-IFNDEF __HUGE__
- BSS_Seg@ MACRO ;; Open a Data Segment (un-initialized)
- _BSS SEGMENT WORD PUBLIC 'BSS'
- ENDM
-
- BSS_EndS@ MACRO ;; Close a Data Segment (un-initialized)
- _BSS ENDS
- ENDM
-ENDIF
-
-FarData_Seg@ MACRO ;; Open a FAR Data Segment
-_FARDATA SEGMENT PARA PUBLIC 'FAR_DATA'
- ENDM
-
-FarData_EndS@ MACRO ;; Close a FAR Data Segment
-_FARDATA ENDS
- ENDM
-
-FarBSS_Seg@ MACRO ;; Open a FAR BSS Segment
-_FARBSS SEGMENT PARA PUBLIC 'FAR_BSS'
- ENDM
-
-FarBSS_EndS@ MACRO ;; Close a FAR BSS Segment
-_FARBSS ENDS
- ENDM
-
-Const_Seg@ MACRO ;; Open a CONST Segment
-_CONST SEGMENT WORD PUBLIC 'CONST'
- ENDM
-
-Const_EndS@ MACRO ;; Close a CONST Segment
-_CONST ENDS
- ENDM
-
-Init_Seg@ MACRO ;; Open a INIT Segment
-_INIT_ SEGMENT WORD PUBLIC 'INITDATA'
- ENDM
-
-Init_EndS@ MACRO ;; Close a INIT Segment
-_INIT_ ENDS
- ENDM
-
-Exit_Seg@ MACRO ;; Open a EXIT Segment
-_EXIT_ SEGMENT WORD PUBLIC 'EXITDATA'
- ENDM
-
-Exit_EndS@ MACRO ;; Close a EXIT Segment
-_EXIT_ ENDS
- ENDM
-
-CVT_Seg@ MACRO
-_CVTSEG SEGMENT WORD PUBLIC 'DATA'
- ENDM
-
-CVT_EndS@ MACRO
-_CVTSEG ENDS
- ENDM
-
-SCN_Seg@ MACRO
-_SCNSEG SEGMENT WORD PUBLIC 'DATA'
- ENDM
-
-SCN_EndS@ MACRO
-_SCNSEG ENDS
- ENDM
-
-Header@ MACRO
-Code_Seg@
-Code_EndS@
-Data_Seg@
-Data_EndS@
-BSS_Seg@
-BSS_EndS@
- ASSUME CS:_TEXT, DS:DGROUP
- ENDM
-
-;[]------------------------------------------------------------[]
-;| |
-;| Segment Definitions |
-;| |
-;[]------------------------------------------------------------[]
-
-IFDEF __C0__
-
-IFDEF __WINDOWS__
-_TEXT SEGMENT WORD PUBLIC 'CODE'
- ENDS
-ELSE
-_TEXT SEGMENT BYTE PUBLIC 'CODE'
- ENDS
-ENDIF
-
-_FARDATA SEGMENT PARA PUBLIC 'FAR_DATA'
- ENDS
-
-_FARBSS SEGMENT PARA PUBLIC 'FAR_BSS'
- ENDS
-
-IFNDEF __WINDOWS__
- IFNDEF __TINY__
- _OVERLAY_ SEGMENT PARA PUBLIC 'OVRINFO'
- ENDS
- _1STUB_ SEGMENT PARA PUBLIC 'STUBSEG'
- ENDS
- ENDIF
-ENDIF
-
-IFDEF __WINDOWS__
-NULL SEGMENT PARA PUBLIC 'BEGDATA'
- ENDS
-ENDIF
-
-_DATA SEGMENT PARA PUBLIC 'DATA'
- ENDS
- ENDS
-
-_CONST SEGMENT WORD PUBLIC 'CONST'
- ENDS
-
-IFDEF __WINDOWS__
-_FPSEG SEGMENT WORD PUBLIC 'DATA'
- ENDS
-ENDIF
-
-_CVTSEG SEGMENT WORD PUBLIC 'DATA'
- ENDS
-
-_SCNSEG SEGMENT WORD PUBLIC 'DATA'
- ENDS
-
-_INIT_ SEGMENT WORD PUBLIC 'INITDATA'
-InitStart label byte
- ENDS
-_INITEND_ SEGMENT BYTE PUBLIC 'INITDATA'
-InitEnd label byte
- ENDS
-
-_EXIT_ SEGMENT WORD PUBLIC 'EXITDATA'
-ExitStart label byte
- ENDS
-_EXITEND_ SEGMENT BYTE PUBLIC 'EXITDATA'
-ExitEnd label byte
- ENDS
-
-IFNDEF __HUGE__
-_BSS SEGMENT WORD PUBLIC 'BSS'
-BeginBSS label byte
- ENDS
-_BSSEND SEGMENT BYTE PUBLIC 'BSSEND'
-EndBSS label byte
- ENDS
-ENDIF
-
-
-IFDEF __WINDOWS__
-
- IFDEF __HUGE__
- DGROUP GROUP NULL,_DATA,_CONST,_FPSEG,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_
- ELSE
- DGROUP GROUP NULL,_DATA,_CONST,_FPSEG,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND
- ENDIF
-
-ELSE
-
-IFNDEF __NOFLOAT__
- IF LDATA
- IFDEF __HUGE__
- DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_
- ELSE
- DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND
- ENDIF
- ELSE
- IFDEF __TINY__
- DGROUP GROUP _TEXT,_DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND
- ELSE
- DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND
- ENDIF
- ENDIF
-ELSE
- IF LDATA
- IFDEF __HUGE__
- DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_
- ELSE
- DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_BSS,_BSSEND
- ENDIF
- ELSE
- IFDEF __TINY__
- DGROUP GROUP _TEXT,_DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND
- ELSE
- DGROUP GROUP _DATA,_CONST,_CVTSEG,_SCNSEG,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_BSS,_BSSEND
- ENDIF
- ENDIF
-ENDIF ; __NOFLOAT__
-
-ENDIF ; __WINDOWS__
-
-ELSE
-
-Code_Seg@
-Code_EndS@
-Data_Seg@
-Data_EndS@
-DGROUP GROUP _DATA
-
-ENDIF ; __C0__
-
- PAGE
-;[]------------------------------------------------------------[]
-;| |
-;| Old Segment Declarations Macros |
-;| |
-;[]------------------------------------------------------------[]
-
-
-CSeg@ MACRO ;; Open a Code Segment
-IFDEF __WINDOWS__
-_TEXT SEGMENT WORD PUBLIC 'CODE'
-ELSE
-_TEXT SEGMENT BYTE PUBLIC 'CODE'
-ENDIF
- ASSUME CS:_TEXT
- ENDM
-
-CSegEnd@ MACRO ;; Close a Code Segment
-_TEXT ENDS
- ENDM
-
-DSeg@ MACRO ;; Open a Data Segment (initialized)
-_DATA SEGMENT WORD PUBLIC 'DATA'
- ENDM
-
-DSegEnd@ MACRO ;; Close a Data Segment (initialized)
-_DATA ENDS
- ENDM
-
-IFDEF __BSS__
- IFNDEF __HUGE__
- BSeg@ MACRO ;; Open a Data Segment (un-initialized)
- _BSS SEGMENT WORD PUBLIC 'BSS'
- ENDM
-
- BSegEnd@ MACRO ;; Close a Data Segment (un-initialized)
- _BSS ENDS
- ENDM
- ENDIF
-ENDIF
-
-Header@ MACRO
-IFDEF __WINDOWS__
-_TEXT SEGMENT WORD PUBLIC 'CODE'
-ELSE
-_TEXT SEGMENT BYTE PUBLIC 'CODE'
-ENDIF
-_TEXT ENDS
-_DATA SEGMENT WORD PUBLIC 'DATA'
-_DATA ENDS
-IFDEF __BSS__
- IFNDEF __HUGE__
- _BSS SEGMENT WORD PUBLIC 'BSS'
- _BSS ENDS
- ENDIF
-ENDIF
-
- ASSUME CS:_TEXT, DS:DGROUP
- ENDM
-
- PAGE
-;[]------------------------------------------------------------[]
-;| |
-;| C Naming Convention Macros |
-;| |
-;[]------------------------------------------------------------[]
-
-UNDERSCORE EQU 1
-
-ExtSym@ MACRO Sym, sType, sName
- IFNB <sName>
- IFIDN <sName>, <__PASCAL__>
-NAMING = 0
- ELSE
-NAMING = UNDERSCORE
- ENDIF
- ENDIF
- IF NAMING
- EXTRN _&Sym : sType
-Sym&@ equ _&Sym
- ELSE
- EXTRN Sym : sType
-Sym&@ equ Sym
- ENDIF
- ENDM
-
-PubSym@ MACRO Sym, Definition, sName
- IFNB <sName>
- IFIDN <sName>, <__PASCAL__>
-NAMING = 0
- ELSE
-NAMING = UNDERSCORE
- ENDIF
- ENDIF
- IF NAMING
- PUBLIC _&Sym
-_&Sym Definition
-Sym&@ equ _&Sym
- ELSE
- PUBLIC Sym
-Sym Definition
-Sym&@ equ Sym
- ENDIF
- ENDM
-
-Static@ MACRO Sym, Definition, sName
- IFNB <sName>
- IFIDN <sName>, <__PASCAL__>
-NAMING = 0
- ELSE
-NAMING = UNDERSCORE
- ENDIF
- ENDIF
- IF NAMING
-_&Sym Definition
-Sym&@ equ _&Sym
- ELSE
-Sym Definition
-Sym&@ equ Sym
- ENDIF
- ENDM
-
- PAGE
-;[]------------------------------------------------------------[]
-;| |
-;| Macros which are Data Size Dependent |
-;| |
-;[]------------------------------------------------------------[]
-
-IF LDATA
-DPTR_ equ DWORD PTR
-dPtrSize equ 4
-LES_ equ LES
-ES_ equ ES:
-SS_ equ SS:
-LDS_ equ LDS
-
-pushDS_ MACRO
- PUSH DS
- ENDM
-
-popDS_ MACRO
- POP DS
- ENDM
-
-PushPtr MACRO dPtrOff, dPtrSeg
- PUSH dPtrSeg
- PUSH dPtrOff
- ENDM
-
-
-dPtr@ MACRO Sym, VALUE, sName ;; Static Data pointer
-Static@ Sym, <DD VALUE>, sName
- ENDM
-
-dPtrPub@ MACRO Sym, VALUE, sName ;; Global Data Pointer
-PubSym@ Sym, <DD VALUE>, sName
- ENDM
-
-dPtrExt@ MACRO Sym, sName ;; External Data Pointer
-ExtSym@ Sym, DWORD, sName
- ENDM
-ELSE
-DPTR_ equ WORD PTR
-dPtrSize equ 2
-LES_ equ MOV
-ES_ equ DS:
-SS_ equ DS:
-LDS_ equ MOV
-
-pushDS_ MACRO
- ENDM
-
-popDS_ MACRO
- ENDM
-
-PushPtr MACRO dPtrOff, dPtrSeg
- PUSH dPtrOff
- ENDM
-
-dPtr@ MACRO Sym, VALUE, sName ;; Static Data pointer
-Static@ Sym, <DW VALUE>, sName
- ENDM
-
-dPtrPub@ MACRO Sym, VALUE, sName ;; Global Data Pointer
-PubSym@ Sym, <DW VALUE>, sName
- ENDM
-
-dPtrExt@ MACRO Sym, sName ;; External Data Pointer
-ExtSym@ Sym, WORD, sName
- ENDM
-ENDIF
- PAGE
-;[]------------------------------------------------------------[]
-;| |
-;| Macros which are Code Size Dependent |
-;| |
-;[]------------------------------------------------------------[]
-
-IF LPROG
-CPTR_ equ DWORD PTR
-cPtrSize equ 4
-
-Proc@ MACRO Sym, sName ;; Open a Static function
-Static@ Sym, <PROC FAR>, sName
- ENDM
-
-PubProc@ MACRO Sym, sName ;; Open a Public function
-PubSym@ Sym, <PROC FAR>, sName
- ENDM
-
-ExtProc@ MACRO Sym, sName ;; External Function
-ExtSym@ Sym, FAR, sName
- ENDM
-
-cPtr@ MACRO Sym, VALUE, sName ;; Static Function pointer
-Static@ Sym, <DD VALUE>, sName
- ENDM
-
-cPtrPub@ MACRO Sym, VALUE, sName;; Global Function Pointer
-PubSym@ Sym, <DD VALUE>, sName
- ENDM
-
-cPtrExt@ MACRO Sym, sName ;; External Function Pointer
-ExtSym@ Sym, DWORD, sName
- ENDM
-ELSE
-CPTR_ equ WORD PTR
-cPtrSize equ 2
-
-Proc@ MACRO Sym, sName ;; Open a Static function
-Static@ Sym, <PROC NEAR>, sName
- ENDM
-
-PubProc@ MACRO Sym, sName ;; Open a Public function
-PubSym@ Sym, <PROC NEAR>, sName
- ENDM
-
-ExtProc@ MACRO Sym, sName ;; External Function
-ExtSym@ Sym, NEAR, sName
- ENDM
-
-cPtr@ MACRO Sym, VALUE, sName ;; Static Function pointer
-Static@ Sym, <DW VALUE>, sName
- ENDM
-
-cPtrPub@ MACRO Sym, VALUE, sName ;; Global Function Pointer
-PubSym@ Sym, <DW VALUE>, sName
- ENDM
-
-cPtrExt@ MACRO Sym, sName ;; External Function Pointer
-ExtSym@ Sym, WORD, sName
- ENDM
-ENDIF
-
-EndProc@ MACRO Sym, sName ;; Close a function
-Static@ Sym, ENDP, sName
- ENDM
-
- PAGE
-;[]------------------------------------------------------------[]
-;| |
-;| Miscellaneous Definitions |
-;| |
-;[]------------------------------------------------------------[]
-
-;*** Set up some macros for procedure parameters and export/import
-
-nearCall STRUC
-nearBP dw ?
-nearIP dw ?
-nearParam dw ?
-nearCall ENDS
-
-farCall STRUC
-farBP dw ?
-farCSIP dd ?
-aParam dw ?
-farCall ENDS
-
-;*** Next, we define some convenient structures to access the parts
-; of larger objects.
-
-_twoBytes STRUC
-BY0 db ?
-BY1 db ?
-_twoBytes ENDS
-
-_fourWords STRUC
-W0 dw ?
-W1 dw ?
-W2 dw ?
-W3 dw ?
-_fourWords ENDS
-
-_twoDwords STRUC
-DD0 dd ?
-DD1 dd ?
-_twoDwords ENDS
-
-_aFloat STRUC
-double dq ?
-_aFloat ENDS
-
-; How to invoke MSDOS.
-
-MSDOS@ MACRO
- int 21h
- ENDM
- PAGE
-
-; The next section concerns the use of registers. SI and DI are used
-; for register variables, and must be conserved.
-
-; Registers AX, BX, CX, DX will not be preserved across function calls.
-
-; Firstly, the registers to be conserved through function calls, including
-; the setup of local variables.
-
-link@ MACRO _si,_di,_ES,locals
- push bp
- mov bp, sp
- IFNB <locals>
- lea sp, locals
- ENDIF
- IFNB <_si>
- push si
- ENDIF
- IFNB <_di>
- push di
- ENDIF
-ENDM
-
-unLink@ MACRO _si,_di,_ES,locals
- IFNB <_di>
- pop di
- ENDIF
- IFNB <_si>
- pop si
- ENDIF
- IFNB <locals>
- mov sp, bp
- ENDIF
- pop bp
-ENDM
-
-.LIST
--- a/WOLFSRC/SDMVER.H
+++ /dev/null
@@ -1,8 +1,0 @@
-#define SPEAR
-#define SPEARDEMO
-#define ARTSEXTERN
-#define DEMOSEXTERN
-#define CARMACIZED
-//#define MYPROFILE
-//#define DEBCHECK
-//#define UPLOAD
--- a/WOLFSRC/SHAREMSG.H
+++ /dev/null
@@ -1,9 +1,0 @@
-"This game is shareware.\n"
-"Share it with everyone.\n"
-"Thanks.\n\n"
-" Id Software\n"
-
-"This game is NOT shareware.\n"
-"Please do not distribute it.\n"
-"Thanks.\n\n"
-" Id Software\n"
--- a/WOLFSRC/SODVER.H
+++ /dev/null
@@ -1,7 +1,0 @@
-#define SPEAR
-#define ARTSEXTERN
-#define DEMOSEXTERN
-#define CARMACIZED
-//#define MYPROFILE
-//#define DEBCHECK
-//#define UPLOAD
--- a/WOLFSRC/SPANISH.H
+++ /dev/null
@@ -1,112 +1,0 @@
-#define QUITSUR "Estas seguro que quieres\n"\
- "parar este gran juego?"
-
-#define CURGAME "Ahora estas en\n"\
- "un juego. Si continuas\n"\
- "borras el juego viejo. O.K.?"
-
-#define GAMESVD "Ya hay un juego\n"\
- "guardado en esta posicion.\n"\
- "sobre-escribir?"
-
-#define ENDGAMESTR "Estas seguro que quieres\n"\
- "terminar el juego que\n"\
- "estas jugando? (S o N):"
-
-#define STR_NG "Juego nuevo"
-#define STR_SD "Sonido"
-#define STR_CL "Control"
-#define STR_LG "Cargar juego"
-#define STR_SG "Guardar juego"
-#define STR_CV "Cambiar vista"
-#define STR_VS "Ver anotacion"
-#define STR_EG "Abandonar"
-#define STR_BD "Regresar al demo"
-#define STR_QT "Parar"
-
-#define STR_LOADING "Cargando"
-#define STR_SAVING "Guardando"
-
-#define STR_GAME "Regresar, jugar"
-#define STR_DEMO "Regresar al Demo"
-#define STR_LGC "Cargar juego llamado\n\""
-#define STR_EMPTY "vacio"
-#define STR_CALIB "Calibrar"
-#define STR_JOYST "Joystick"
-#define STR_MOVEJOY "Mover joystick a\n"\
- "arriba izq y\n"\
- "oprimir boton 0\n"
-#define STR_MOVEJOY2 "Mover joystick a\n"\
- "abajo derecha y\n"\
- "oprimir boton 1\n"
-#define STR_ESCEXIT "ESC para salir"
-#define STR_NONE "Ninguno"
-#define STR_PC "P.C. bocina"
-#define STR_ALSB "AdLib/Sound Blaster"
-#define STR_DISNEY "Disney Sound Source"
-#define STR_SB "Sound Blaster"
-
-#define STR_MOUSEEN "Raton activado"
-#define STR_JOYEN "Joystick activado"
-#define STR_PORT2 "Use joystick puerto 2"
-#define STR_GAMEPAD "Gravis Gamepad Activada"
-#define STR_SENS "Raton Sensibilidad"
-#define STR_CUSTOM "Modificar controles"
-#define STR_DADDY "Papi puedo jugar?"
-#define STR_HURTME "No me hieras."
-#define STR_BRINGEM "�Echamelos!"
-#define STR_DEATH "La muerte encarnada"
-
-#define STR_MOUSEADJ "Raton ajustar sensibilidad"
-#define STR_SLOW "Lento"
-#define STR_FAST "Rapido"
-
-#define STR_CRUN "Corre"
-#define STR_COPEN "Abre"
-#define STR_CFIRE "Fuego"
-#define STR_CSTRAFE "Ametrallar"
-
-#define STR_LEFT "Izquierda"
-#define STR_RIGHT "Derecha"
-#define STR_FRWD "Adelante"
-#define STR_BKWD "Atras"
-#define STR_THINK "Pensando"
-
-#define STR_SIZE1 "Use flechas para ajustar"
-#define STR_SIZE2 "Enter para aceptar"
-#define STR_SIZE3 "Esc para cancelar"
-
-#define STR_YOUWIN "Tu ganas"
-
-#define STR_TOTALTIME "Tiempo total"
-
-#define STR_RATKILL "Muertes %"
-#define STR_RATSECRET "Secreto %"
-#define STR_RATTREASURE "Tesoros %"
-
-#define STR_BONUS "Bono"
-#define STR_TIME "Tiempo"
-#define STR_PAR "Par"
-
-#define STR_RAT2KILL "Muertes %" // ratio = promedio
-#define STR_RAT2SECRET "Secreto %"
-#define STR_RAT2TREASURE "Tesoros %"
-
-#define STR_DEFEATED "Derrotado!"
-
-#define STR_CHEATER1 "Ahora tienes 100% salud"
-#define STR_CHEATER2 "99 balas y dos llaves"
-#define STR_CHEATER3 "Notar que has basicamente"
-#define STR_CHEATER4 "eliminado tus chances de"
-#define STR_CHEATER5 "obtener puntos altos"
-
-#define STR_NOSPACE1 "No hay suficiente espacio"
-#define STR_NOSPACE2 "en tu disco para guardar juego"
-
-#define STR_SAVECHT1 "Tu archivo para guardar juego es"
-#define STR_SAVECHT2 "diremos,\"corrupto\"."
-#define STR_SAVECHT3 "Pero te dire, sigue y"
-#define STR_SAVECHT4 "de todos modos juega"
-
-#define STR_SEEAGAIN "Veamos eso de nuevo"
-
--- a/WOLFSRC/SPANVER.H
+++ /dev/null
@@ -1,8 +1,0 @@
-//#define SPEAR
-#define SPANISH
-#define ARTSEXTERN
-#define DEMOSEXTERN
-//#define MYPROFILE
-//#define DEBCHECK
-#define CARMACIZED
-//#define UPLOAD
binary files a/WOLFSRC/SV.EXE /dev/null differ
--- a/WOLFSRC/VERSION.H
+++ /dev/null
@@ -1,10 +1,0 @@
-//#define SPEAR
-//#define JAPAN
-#define GOODTIMES
-#define ARTSEXTERN
-#define DEMOSEXTERN
-//#define MYPROFILE
-//#define DEBCHECK
-#define CARMACIZED
-//#define UPLOAD
-
\ No newline at end of file
--- a/WOLFSRC/WHACK_A.ASM
+++ /dev/null
@@ -1,100 +1,0 @@
-; WOLFHACK.ASM
-
-.386C
-IDEAL
-MODEL MEDIUM,C
-
-
-;============================================================================
-
-DATASEG
-
-EXTRN mr_rowofs:WORD
-EXTRN mr_count:WORD
-EXTRN mr_xstep:WORD
-EXTRN mr_ystep:WORD
-EXTRN mr_xfrac:WORD
-EXTRN mr_yfrac:WORD
-EXTRN mr_dest:WORD
-
-FARDATA
-
-planepics db 8192 dup(?) ; // 4k of ceiling, 4k of floor
-PUBLIC planepics
-
-
-;============================================================================
-
-CODESEG
-
-;============================
-;
-; MapRow
-;
-;
-;============================
-
-PROC MapRow
-PUBLIC MapRow
- push esi
- push edi
- push ebp
- push ds
-
- mov bp,[mr_rowofs]
- mov cx,[mr_count]
- mov dx,[mr_ystep]
- shl edx,16
- mov dx,[mr_xstep]
- mov si,[mr_yfrac]
- shl esi,16
- mov si,[mr_xfrac]
- mov di,[mr_dest]
- mov ax,SEG planepics
- mov ds,ax
- mov ax,0a000h
- mov es,ax
- mov ax,1111111111110b
-
-; eax color lookup
-; ebx scratch offset and pixel values
-; ecx loop counter
-; edx packed x / y step values
-; esi packed x / y fractional values
-; edi write pointer
-; ebp toprow to bottomrow delta
-; es: screenseg
-; ds: pictures
-
-; mov al,[esi]
-; mov al,[eax]
-; mov [edi],al
-
-; mov ax,[_variable+ebx+2]
-
-
-pixelloop:
- shld ebx,esi,22 ; shift y units in
- shld ebx,esi,7 ; shift x units in and one extra bit
- and bx,63*65*2 ; mask off extra top bits and 0 low bit
- add esi,edx ; position += step
- mov al,[bx]
- mov al,[eax]
- mov [es:di],al ; write ceiling pixel
- mov al,[bx+1]
- mov al,[eax]
- mov [es:di+bp],al ; write floor pixel
- inc di
- loop pixelloop
-
- pop ds
- pop ebp
- pop edi
- pop esi
-
- retf
-
-ENDP
-
-END
-
--- a/WOLFSRC/WLFJ1VER.H
+++ /dev/null
@@ -1,9 +1,0 @@
-//#define SPEAR
-#define JAPAN
-#define JAPDEMO
-#define UPLOAD
-#define ARTSEXTERN
-#define DEMOSEXTERN
-//#define MYPROFILE
-//#define DEBCHECK
-#define CARMACIZED
--- a/WOLFSRC/WL_ACT1.C
+++ /dev/null
@@ -1,900 +1,0 @@
-// WL_ACT1.C
-
-#include "WL_DEF.H"
-#pragma hdrstop
-
-/*
-=============================================================================
-
- STATICS
-
-=============================================================================
-*/
-
-
-statobj_t statobjlist[MAXSTATS],*laststatobj;
-
-
-struct
-{
- int picnum;
- stat_t type;
-} statinfo[] =
-{
-{SPR_STAT_0}, // puddle spr1v
-{SPR_STAT_1,block}, // Green Barrel "
-{SPR_STAT_2,block}, // Table/chairs "
-{SPR_STAT_3,block}, // Floor lamp "
-{SPR_STAT_4}, // Chandelier "
-{SPR_STAT_5,block}, // Hanged man "
-{SPR_STAT_6,bo_alpo}, // Bad food "
-{SPR_STAT_7,block}, // Red pillar "
-//
-// NEW PAGE
-//
-{SPR_STAT_8,block}, // Tree spr2v
-{SPR_STAT_9}, // Skeleton flat "
-{SPR_STAT_10,block}, // Sink " (SOD:gibs)
-{SPR_STAT_11,block}, // Potted plant "
-{SPR_STAT_12,block}, // Urn "
-{SPR_STAT_13,block}, // Bare table "
-{SPR_STAT_14}, // Ceiling light "
-#ifndef SPEAR
-{SPR_STAT_15}, // Kitchen stuff "
-#else
-{SPR_STAT_15,block}, // Gibs!
-#endif
-//
-// NEW PAGE
-//
-{SPR_STAT_16,block}, // suit of armor spr3v
-{SPR_STAT_17,block}, // Hanging cage "
-{SPR_STAT_18,block}, // SkeletoninCage "
-{SPR_STAT_19}, // Skeleton relax "
-{SPR_STAT_20,bo_key1}, // Key 1 "
-{SPR_STAT_21,bo_key2}, // Key 2 "
-{SPR_STAT_22,block}, // stuff (SOD:gibs)
-{SPR_STAT_23}, // stuff
-//
-// NEW PAGE
-//
-{SPR_STAT_24,bo_food}, // Good food spr4v
-{SPR_STAT_25,bo_firstaid}, // First aid "
-{SPR_STAT_26,bo_clip}, // Clip "
-{SPR_STAT_27,bo_machinegun}, // Machine gun "
-{SPR_STAT_28,bo_chaingun}, // Gatling gun "
-{SPR_STAT_29,bo_cross}, // Cross "
-{SPR_STAT_30,bo_chalice}, // Chalice "
-{SPR_STAT_31,bo_bible}, // Bible "
-//
-// NEW PAGE
-//
-{SPR_STAT_32,bo_crown}, // crown spr5v
-{SPR_STAT_33,bo_fullheal}, // one up "
-{SPR_STAT_34,bo_gibs}, // gibs "
-{SPR_STAT_35,block}, // barrel "
-{SPR_STAT_36,block}, // well "
-{SPR_STAT_37,block}, // Empty well "
-{SPR_STAT_38,bo_gibs}, // Gibs 2 "
-{SPR_STAT_39,block}, // flag "
-//
-// NEW PAGE
-//
-#ifndef SPEAR
-{SPR_STAT_40,block}, // Call Apogee spr7v
-#else
-{SPR_STAT_40}, // Red light
-#endif
-//
-// NEW PAGE
-//
-{SPR_STAT_41}, // junk "
-{SPR_STAT_42}, // junk "
-{SPR_STAT_43}, // junk "
-#ifndef SPEAR
-{SPR_STAT_44}, // pots "
-#else
-{SPR_STAT_44,block}, // Gibs!
-#endif
-{SPR_STAT_45,block}, // stove " (SOD:gibs)
-{SPR_STAT_46,block}, // spears " (SOD:gibs)
-{SPR_STAT_47}, // vines "
-//
-// NEW PAGE
-//
-#ifdef SPEAR
-{SPR_STAT_48,block}, // marble pillar
-{SPR_STAT_49,bo_25clip}, // bonus 25 clip
-{SPR_STAT_50,block}, // truck
-{SPR_STAT_51,bo_spear}, // SPEAR OF DESTINY!
-#endif
-
-{SPR_STAT_26,bo_clip2}, // Clip "
-{-1} // terminator
-};
-
-/*
-===============
-=
-= InitStaticList
-=
-===============
-*/
-
-void InitStaticList (void)
-{
- laststatobj = &statobjlist[0];
-}
-
-
-
-/*
-===============
-=
-= SpawnStatic
-=
-===============
-*/
-
-void SpawnStatic (int tilex, int tiley, int type)
-{
- laststatobj->shapenum = statinfo[type].picnum;
- laststatobj->tilex = tilex;
- laststatobj->tiley = tiley;
- laststatobj->visspot = &spotvis[tilex][tiley];
-
- switch (statinfo[type].type)
- {
- case block:
- (unsigned)actorat[tilex][tiley] = 1; // consider it a blocking tile
- case dressing:
- laststatobj->flags = 0;
- break;
-
- case bo_cross:
- case bo_chalice:
- case bo_bible:
- case bo_crown:
- case bo_fullheal:
- if (!loadedgame)
- gamestate.treasuretotal++;
-
- case bo_firstaid:
- case bo_key1:
- case bo_key2:
- case bo_key3:
- case bo_key4:
- case bo_clip:
- case bo_25clip:
- case bo_machinegun:
- case bo_chaingun:
- case bo_food:
- case bo_alpo:
- case bo_gibs:
- case bo_spear:
- laststatobj->flags = FL_BONUS;
- laststatobj->itemnumber = statinfo[type].type;
- break;
- }
-
- laststatobj++;
-
- if (laststatobj == &statobjlist[MAXSTATS])
- Quit ("Too many static objects!\n");
-}
-
-
-/*
-===============
-=
-= PlaceItemType
-=
-= Called during game play to drop actors' items. It finds the proper
-= item number based on the item type (bo_???). If there are no free item
-= spots, nothing is done.
-=
-===============
-*/
-
-void PlaceItemType (int itemtype, int tilex, int tiley)
-{
- int type;
- statobj_t *spot;
-
-//
-// find the item number
-//
- for (type=0 ; ; type++)
- {
- if (statinfo[type].picnum == -1) // end of list
- Quit ("PlaceItemType: couldn't find type!");
- if (statinfo[type].type == itemtype)
- break;
- }
-
-//
-// find a spot in statobjlist to put it in
-//
- for (spot=&statobjlist[0] ; ; spot++)
- {
- if (spot==laststatobj)
- {
- if (spot == &statobjlist[MAXSTATS])
- return; // no free spots
- laststatobj++; // space at end
- break;
- }
-
- if (spot->shapenum == -1) // -1 is a free spot
- break;
- }
-//
-// place it
-//
- spot->shapenum = statinfo[type].picnum;
- spot->tilex = tilex;
- spot->tiley = tiley;
- spot->visspot = &spotvis[tilex][tiley];
- spot->flags = FL_BONUS;
- spot->itemnumber = statinfo[type].type;
-}
-
-
-
-/*
-=============================================================================
-
- DOORS
-
-doorobjlist[] holds most of the information for the doors
-
-doorposition[] holds the amount the door is open, ranging from 0 to 0xffff
- this is directly accessed by AsmRefresh during rendering
-
-The number of doors is limited to 64 because a spot in tilemap holds the
- door number in the low 6 bits, with the high bit meaning a door center
- and bit 6 meaning a door side tile
-
-Open doors conect two areas, so sounds will travel between them and sight
- will be checked when the player is in a connected area.
-
-Areaconnect is incremented/decremented by each door. If >0 they connect
-
-Every time a door opens or closes the areabyplayer matrix gets recalculated.
- An area is true if it connects with the player's current spor.
-
-=============================================================================
-*/
-
-#define DOORWIDTH 0x7800
-#define OPENTICS 300
-
-doorobj_t doorobjlist[MAXDOORS],*lastdoorobj;
-int doornum;
-
-unsigned doorposition[MAXDOORS]; // leading edge of door 0=closed
- // 0xffff = fully open
-
-byte far areaconnect[NUMAREAS][NUMAREAS];
-
-boolean areabyplayer[NUMAREAS];
-
-
-/*
-==============
-=
-= ConnectAreas
-=
-= Scans outward from playerarea, marking all connected areas
-=
-==============
-*/
-
-void RecursiveConnect (int areanumber)
-{
- int i;
-
- for (i=0;i<NUMAREAS;i++)
- {
- if (areaconnect[areanumber][i] && !areabyplayer[i])
- {
- areabyplayer[i] = true;
- RecursiveConnect (i);
- }
- }
-}
-
-
-void ConnectAreas (void)
-{
- memset (areabyplayer,0,sizeof(areabyplayer));
- areabyplayer[player->areanumber] = true;
- RecursiveConnect (player->areanumber);
-}
-
-
-void InitAreas (void)
-{
- memset (areabyplayer,0,sizeof(areabyplayer));
- areabyplayer[player->areanumber] = true;
-}
-
-
-
-/*
-===============
-=
-= InitDoorList
-=
-===============
-*/
-
-void InitDoorList (void)
-{
- memset (areabyplayer,0,sizeof(areabyplayer));
- _fmemset (areaconnect,0,sizeof(areaconnect));
-
- lastdoorobj = &doorobjlist[0];
- doornum = 0;
-}
-
-
-/*
-===============
-=
-= SpawnDoor
-=
-===============
-*/
-
-void SpawnDoor (int tilex, int tiley, boolean vertical, int lock)
-{
- int areanumber;
- unsigned far *map;
-
- if (doornum==64)
- Quit ("64+ doors on level!");
-
- doorposition[doornum] = 0; // doors start out fully closed
- lastdoorobj->tilex = tilex;
- lastdoorobj->tiley = tiley;
- lastdoorobj->vertical = vertical;
- lastdoorobj->lock = lock;
- lastdoorobj->action = dr_closed;
-
- (unsigned)actorat[tilex][tiley] = doornum | 0x80; // consider it a solid wall
-
-//
-// make the door tile a special tile, and mark the adjacent tiles
-// for door sides
-//
- tilemap[tilex][tiley] = doornum | 0x80;
- map = mapsegs[0] + farmapylookup[tiley]+tilex;
- if (vertical)
- {
- *map = *(map-1); // set area number
- tilemap[tilex][tiley-1] |= 0x40;
- tilemap[tilex][tiley+1] |= 0x40;
- }
- else
- {
- *map = *(map-mapwidth); // set area number
- tilemap[tilex-1][tiley] |= 0x40;
- tilemap[tilex+1][tiley] |= 0x40;
- }
-
- doornum++;
- lastdoorobj++;
-}
-
-//===========================================================================
-
-/*
-=====================
-=
-= OpenDoor
-=
-=====================
-*/
-
-void OpenDoor (int door)
-{
- if (doorobjlist[door].action == dr_open)
- doorobjlist[door].ticcount = 0; // reset open time
- else
- doorobjlist[door].action = dr_opening; // start it opening
-}
-
-
-/*
-=====================
-=
-= CloseDoor
-=
-=====================
-*/
-
-void CloseDoor (int door)
-{
- int tilex,tiley,area;
- objtype *check;
-
-//
-// don't close on anything solid
-//
- tilex = doorobjlist[door].tilex;
- tiley = doorobjlist[door].tiley;
-
- if (actorat[tilex][tiley])
- return;
-
- if (player->tilex == tilex && player->tiley == tiley)
- return;
-
- if (doorobjlist[door].vertical)
- {
- if ( player->tiley == tiley )
- {
- if ( ((player->x+MINDIST) >>TILESHIFT) == tilex )
- return;
- if ( ((player->x-MINDIST) >>TILESHIFT) == tilex )
- return;
- }
- check = actorat[tilex-1][tiley];
- if (check && ((check->x+MINDIST) >> TILESHIFT) == tilex )
- return;
- check = actorat[tilex+1][tiley];
- if (check && ((check->x-MINDIST) >> TILESHIFT) == tilex )
- return;
- }
- else if (!doorobjlist[door].vertical)
- {
- if (player->tilex == tilex)
- {
- if ( ((player->y+MINDIST) >>TILESHIFT) == tiley )
- return;
- if ( ((player->y-MINDIST) >>TILESHIFT) == tiley )
- return;
- }
- check = actorat[tilex][tiley-1];
- if (check && ((check->y+MINDIST) >> TILESHIFT) == tiley )
- return;
- check = actorat[tilex][tiley+1];
- if (check && ((check->y-MINDIST) >> TILESHIFT) == tiley )
- return;
- }
-
-
-//
-// play door sound if in a connected area
-//
- area = *(mapsegs[0] + farmapylookup[doorobjlist[door].tiley]
- +doorobjlist[door].tilex)-AREATILE;
- if (areabyplayer[area])
- {
- PlaySoundLocTile(CLOSEDOORSND,doorobjlist[door].tilex,doorobjlist[door].tiley); // JAB
- }
-
- doorobjlist[door].action = dr_closing;
-//
-// make the door space solid
-//
- (unsigned)actorat[tilex][tiley]
- = door | 0x80;
-}
-
-
-
-/*
-=====================
-=
-= OperateDoor
-=
-= The player wants to change the door's direction
-=
-=====================
-*/
-
-void OperateDoor (int door)
-{
- int lock;
-
- lock = doorobjlist[door].lock;
- if (lock >= dr_lock1 && lock <= dr_lock4)
- {
- if ( ! (gamestate.keys & (1 << (lock-dr_lock1) ) ) )
- {
- SD_PlaySound (NOWAYSND); // locked
- return;
- }
- }
-
- switch (doorobjlist[door].action)
- {
- case dr_closed:
- case dr_closing:
- OpenDoor (door);
- break;
- case dr_open:
- case dr_opening:
- CloseDoor (door);
- break;
- }
-}
-
-
-//===========================================================================
-
-/*
-===============
-=
-= DoorOpen
-=
-= Close the door after three seconds
-=
-===============
-*/
-
-void DoorOpen (int door)
-{
- if ( (doorobjlist[door].ticcount += tics) >= OPENTICS)
- CloseDoor (door);
-}
-
-
-
-/*
-===============
-=
-= DoorOpening
-=
-===============
-*/
-
-void DoorOpening (int door)
-{
- int area1,area2;
- unsigned far *map;
- long position;
-
- position = doorposition[door];
- if (!position)
- {
- //
- // door is just starting to open, so connect the areas
- //
- map = mapsegs[0] + farmapylookup[doorobjlist[door].tiley]
- +doorobjlist[door].tilex;
-
- if (doorobjlist[door].vertical)
- {
- area1 = *(map+1);
- area2 = *(map-1);
- }
- else
- {
- area1 = *(map-mapwidth);
- area2 = *(map+mapwidth);
- }
- area1 -= AREATILE;
- area2 -= AREATILE;
- areaconnect[area1][area2]++;
- areaconnect[area2][area1]++;
- ConnectAreas ();
- if (areabyplayer[area1])
- {
- PlaySoundLocTile(OPENDOORSND,doorobjlist[door].tilex,doorobjlist[door].tiley); // JAB
- }
- }
-
-//
-// slide the door by an adaptive amount
-//
- position += tics<<10;
- if (position >= 0xffff)
- {
- //
- // door is all the way open
- //
- position = 0xffff;
- doorobjlist[door].ticcount = 0;
- doorobjlist[door].action = dr_open;
- actorat[doorobjlist[door].tilex][doorobjlist[door].tiley] = 0;
- }
-
- doorposition[door] = position;
-}
-
-
-/*
-===============
-=
-= DoorClosing
-=
-===============
-*/
-
-void DoorClosing (int door)
-{
- int area1,area2,move;
- unsigned far *map;
- long position;
- int tilex,tiley;
-
- tilex = doorobjlist[door].tilex;
- tiley = doorobjlist[door].tiley;
-
- if ( ((unsigned)actorat[tilex][tiley] != (door | 0x80))
- || (player->tilex == tilex && player->tiley == tiley) )
- { // something got inside the door
- OpenDoor (door);
- return;
- };
-
- position = doorposition[door];
-
-//
-// slide the door by an adaptive amount
-//
- position -= tics<<10;
- if (position <= 0)
- {
- //
- // door is closed all the way, so disconnect the areas
- //
- position = 0;
-
- doorobjlist[door].action = dr_closed;
-
- map = mapsegs[0] + farmapylookup[doorobjlist[door].tiley]
- +doorobjlist[door].tilex;
-
- if (doorobjlist[door].vertical)
- {
- area1 = *(map+1);
- area2 = *(map-1);
- }
- else
- {
- area1 = *(map-mapwidth);
- area2 = *(map+mapwidth);
- }
- area1 -= AREATILE;
- area2 -= AREATILE;
- areaconnect[area1][area2]--;
- areaconnect[area2][area1]--;
-
- ConnectAreas ();
- }
-
- doorposition[door] = position;
-}
-
-
-
-
-/*
-=====================
-=
-= MoveDoors
-=
-= Called from PlayLoop
-=
-=====================
-*/
-
-void MoveDoors (void)
-{
- int door;
-
- if (gamestate.victoryflag) // don't move door during victory sequence
- return;
-
- for (door = 0 ; door < doornum ; door++)
- switch (doorobjlist[door].action)
- {
- case dr_open:
- DoorOpen (door);
- break;
-
- case dr_opening:
- DoorOpening(door);
- break;
-
- case dr_closing:
- DoorClosing(door);
- break;
- }
-}
-
-
-/*
-=============================================================================
-
- PUSHABLE WALLS
-
-=============================================================================
-*/
-
-unsigned pwallstate;
-unsigned pwallpos; // amount a pushable wall has been moved (0-63)
-unsigned pwallx,pwally;
-int pwalldir;
-
-/*
-===============
-=
-= PushWall
-=
-===============
-*/
-
-void PushWall (int checkx, int checky, int dir)
-{
- int oldtile;
-
- if (pwallstate)
- return;
-
-
- oldtile = tilemap[checkx][checky];
- if (!oldtile)
- return;
-
- switch (dir)
- {
- case di_north:
- if (actorat[checkx][checky-1])
- {
- SD_PlaySound (NOWAYSND);
- return;
- }
- (unsigned)actorat[checkx][checky-1] =
- tilemap[checkx][checky-1] = oldtile;
- break;
-
- case di_east:
- if (actorat[checkx+1][checky])
- {
- SD_PlaySound (NOWAYSND);
- return;
- }
- (unsigned)actorat[checkx+1][checky] =
- tilemap[checkx+1][checky] = oldtile;
- break;
-
- case di_south:
- if (actorat[checkx][checky+1])
- {
- SD_PlaySound (NOWAYSND);
- return;
- }
- (unsigned)actorat[checkx][checky+1] =
- tilemap[checkx][checky+1] = oldtile;
- break;
-
- case di_west:
- if (actorat[checkx-1][checky])
- {
- SD_PlaySound (NOWAYSND);
- return;
- }
- (unsigned)actorat[checkx-1][checky] =
- tilemap[checkx-1][checky] = oldtile;
- break;
- }
-
- gamestate.secretcount++;
- pwallx = checkx;
- pwally = checky;
- pwalldir = dir;
- pwallstate = 1;
- pwallpos = 0;
- tilemap[pwallx][pwally] |= 0xc0;
- *(mapsegs[1]+farmapylookup[pwally]+pwallx) = 0; // remove P tile info
-
- SD_PlaySound (PUSHWALLSND);
-}
-
-
-
-/*
-=================
-=
-= MovePWalls
-=
-=================
-*/
-
-void MovePWalls (void)
-{
- int oldblock,oldtile;
-
- if (!pwallstate)
- return;
-
- oldblock = pwallstate/128;
-
- pwallstate += tics;
-
- if (pwallstate/128 != oldblock)
- {
- // block crossed into a new block
- oldtile = tilemap[pwallx][pwally] & 63;
-
- //
- // the tile can now be walked into
- //
- tilemap[pwallx][pwally] = 0;
- (unsigned)actorat[pwallx][pwally] = 0;
- *(mapsegs[0]+farmapylookup[pwally]+pwallx) = player->areanumber+AREATILE;
-
- //
- // see if it should be pushed farther
- //
- if (pwallstate>256)
- {
- //
- // the block has been pushed two tiles
- //
- pwallstate = 0;
- return;
- }
- else
- {
- switch (pwalldir)
- {
- case di_north:
- pwally--;
- if (actorat[pwallx][pwally-1])
- {
- pwallstate = 0;
- return;
- }
- (unsigned)actorat[pwallx][pwally-1] =
- tilemap[pwallx][pwally-1] = oldtile;
- break;
-
- case di_east:
- pwallx++;
- if (actorat[pwallx+1][pwally])
- {
- pwallstate = 0;
- return;
- }
- (unsigned)actorat[pwallx+1][pwally] =
- tilemap[pwallx+1][pwally] = oldtile;
- break;
-
- case di_south:
- pwally++;
- if (actorat[pwallx][pwally+1])
- {
- pwallstate = 0;
- return;
- }
- (unsigned)actorat[pwallx][pwally+1] =
- tilemap[pwallx][pwally+1] = oldtile;
- break;
-
- case di_west:
- pwallx--;
- if (actorat[pwallx-1][pwally])
- {
- pwallstate = 0;
- return;
- }
- (unsigned)actorat[pwallx-1][pwally] =
- tilemap[pwallx-1][pwally] = oldtile;
- break;
- }
-
- tilemap[pwallx][pwally] = oldtile | 0xc0;
- }
- }
-
-
- pwallpos = (pwallstate/2)&63;
-
-}
-
--- a/WOLFSRC/WL_ACT2.C
+++ /dev/null
@@ -1,3872 +1,0 @@
-// WL_ACT2.C
-
-#include "WL_DEF.H"
-#pragma hdrstop
-
-/*
-=============================================================================
-
- LOCAL CONSTANTS
-
-=============================================================================
-*/
-
-#define PROJECTILESIZE 0xc000l
-
-#define BJRUNSPEED 2048
-#define BJJUMPSPEED 680
-
-
-/*
-=============================================================================
-
- GLOBAL VARIABLES
-
-=============================================================================
-*/
-
-
-
-/*
-=============================================================================
-
- LOCAL VARIABLES
-
-=============================================================================
-*/
-
-
-dirtype dirtable[9] = {northwest,north,northeast,west,nodir,east,
- southwest,south,southeast};
-
-int starthitpoints[4][NUMENEMIES] =
- //
- // BABY MODE
- //
- {
- {25, // guards
- 50, // officer
- 100, // SS
- 1, // dogs
- 850, // Hans
- 850, // Schabbs
- 200, // fake hitler
- 800, // mecha hitler
- 45, // mutants
- 25, // ghosts
- 25, // ghosts
- 25, // ghosts
- 25, // ghosts
-
- 850, // Gretel
- 850, // Gift
- 850, // Fat
- 5, // en_spectre,
- 1450, // en_angel,
- 850, // en_trans,
- 1050, // en_uber,
- 950, // en_will,
- 1250 // en_death
- },
- //
- // DON'T HURT ME MODE
- //
- {25, // guards
- 50, // officer
- 100, // SS
- 1, // dogs
- 950, // Hans
- 950, // Schabbs
- 300, // fake hitler
- 950, // mecha hitler
- 55, // mutants
- 25, // ghosts
- 25, // ghosts
- 25, // ghosts
- 25, // ghosts
-
- 950, // Gretel
- 950, // Gift
- 950, // Fat
- 10, // en_spectre,
- 1550, // en_angel,
- 950, // en_trans,
- 1150, // en_uber,
- 1050, // en_will,
- 1350 // en_death
- },
- //
- // BRING 'EM ON MODE
- //
- {25, // guards
- 50, // officer
- 100, // SS
- 1, // dogs
-
- 1050, // Hans
- 1550, // Schabbs
- 400, // fake hitler
- 1050, // mecha hitler
-
- 55, // mutants
- 25, // ghosts
- 25, // ghosts
- 25, // ghosts
- 25, // ghosts
-
- 1050, // Gretel
- 1050, // Gift
- 1050, // Fat
- 15, // en_spectre,
- 1650, // en_angel,
- 1050, // en_trans,
- 1250, // en_uber,
- 1150, // en_will,
- 1450 // en_death
- },
- //
- // DEATH INCARNATE MODE
- //
- {25, // guards
- 50, // officer
- 100, // SS
- 1, // dogs
-
- 1200, // Hans
- 2400, // Schabbs
- 500, // fake hitler
- 1200, // mecha hitler
-
- 65, // mutants
- 25, // ghosts
- 25, // ghosts
- 25, // ghosts
- 25, // ghosts
-
- 1200, // Gretel
- 1200, // Gift
- 1200, // Fat
- 25, // en_spectre,
- 2000, // en_angel,
- 1200, // en_trans,
- 1400, // en_uber,
- 1300, // en_will,
- 1600 // en_death
- }}
- ;
-
-void A_StartDeathCam (objtype *ob);
-
-
-void T_Path (objtype *ob);
-void T_Shoot (objtype *ob);
-void T_Bite (objtype *ob);
-void T_DogChase (objtype *ob);
-void T_Chase (objtype *ob);
-void T_Projectile (objtype *ob);
-void T_Stand (objtype *ob);
-
-void A_DeathScream (objtype *ob);
-
-extern statetype s_rocket;
-extern statetype s_smoke1;
-extern statetype s_smoke2;
-extern statetype s_smoke3;
-extern statetype s_smoke4;
-extern statetype s_boom2;
-extern statetype s_boom3;
-
-void A_Smoke (objtype *ob);
-
-statetype s_rocket = {true,SPR_ROCKET_1,3,T_Projectile,A_Smoke,&s_rocket};
-statetype s_smoke1 = {false,SPR_SMOKE_1,3,NULL,NULL,&s_smoke2};
-statetype s_smoke2 = {false,SPR_SMOKE_2,3,NULL,NULL,&s_smoke3};
-statetype s_smoke3 = {false,SPR_SMOKE_3,3,NULL,NULL,&s_smoke4};
-statetype s_smoke4 = {false,SPR_SMOKE_4,3,NULL,NULL,NULL};
-
-statetype s_boom1 = {false,SPR_BOOM_1,6,NULL,NULL,&s_boom2};
-statetype s_boom2 = {false,SPR_BOOM_2,6,NULL,NULL,&s_boom3};
-statetype s_boom3 = {false,SPR_BOOM_3,6,NULL,NULL,NULL};
-
-#ifdef SPEAR
-
-extern statetype s_hrocket;
-extern statetype s_hsmoke1;
-extern statetype s_hsmoke2;
-extern statetype s_hsmoke3;
-extern statetype s_hsmoke4;
-extern statetype s_hboom2;
-extern statetype s_hboom3;
-
-void A_Smoke (objtype *ob);
-
-statetype s_hrocket = {true,SPR_HROCKET_1,3,T_Projectile,A_Smoke,&s_hrocket};
-statetype s_hsmoke1 = {false,SPR_HSMOKE_1,3,NULL,NULL,&s_hsmoke2};
-statetype s_hsmoke2 = {false,SPR_HSMOKE_2,3,NULL,NULL,&s_hsmoke3};
-statetype s_hsmoke3 = {false,SPR_HSMOKE_3,3,NULL,NULL,&s_hsmoke4};
-statetype s_hsmoke4 = {false,SPR_HSMOKE_4,3,NULL,NULL,NULL};
-
-statetype s_hboom1 = {false,SPR_HBOOM_1,6,NULL,NULL,&s_hboom2};
-statetype s_hboom2 = {false,SPR_HBOOM_2,6,NULL,NULL,&s_hboom3};
-statetype s_hboom3 = {false,SPR_HBOOM_3,6,NULL,NULL,NULL};
-
-#endif
-
-void T_Schabb (objtype *ob);
-void T_SchabbThrow (objtype *ob);
-void T_Fake (objtype *ob);
-void T_FakeFire (objtype *ob);
-void T_Ghosts (objtype *ob);
-
-void A_Slurpie (objtype *ob);
-void A_HitlerMorph (objtype *ob);
-void A_MechaSound (objtype *ob);
-
-/*
-=================
-=
-= A_Smoke
-=
-=================
-*/
-
-void A_Smoke (objtype *ob)
-{
- GetNewActor ();
-#ifdef SPEAR
- if (ob->obclass == hrocketobj)
- new->state = &s_hsmoke1;
- else
-#endif
- new->state = &s_smoke1;
- new->ticcount = 6;
-
- new->tilex = ob->tilex;
- new->tiley = ob->tiley;
- new->x = ob->x;
- new->y = ob->y;
- new->obclass = inertobj;
- new->active = true;
-
- new->flags = FL_NEVERMARK;
-}
-
-
-/*
-===================
-=
-= ProjectileTryMove
-=
-= returns true if move ok
-===================
-*/
-
-#define PROJSIZE 0x2000
-
-boolean ProjectileTryMove (objtype *ob)
-{
- int xl,yl,xh,yh,x,y;
- objtype *check;
- long deltax,deltay;
-
- xl = (ob->x-PROJSIZE) >>TILESHIFT;
- yl = (ob->y-PROJSIZE) >>TILESHIFT;
-
- xh = (ob->x+PROJSIZE) >>TILESHIFT;
- yh = (ob->y+PROJSIZE) >>TILESHIFT;
-
-//
-// check for solid walls
-//
- for (y=yl;y<=yh;y++)
- for (x=xl;x<=xh;x++)
- {
- check = actorat[x][y];
- if (check && check<objlist)
- return false;
- }
-
- return true;
-}
-
-
-
-/*
-=================
-=
-= T_Projectile
-=
-=================
-*/
-
-void T_Projectile (objtype *ob)
-{
- long deltax,deltay;
- int damage;
- long speed;
-
- speed = (long)ob->speed*tics;
-
- deltax = FixedByFrac(speed,costable[ob->angle]);
- deltay = -FixedByFrac(speed,sintable[ob->angle]);
-
- if (deltax>0x10000l)
- deltax = 0x10000l;
- if (deltay>0x10000l)
- deltay = 0x10000l;
-
- ob->x += deltax;
- ob->y += deltay;
-
- deltax = LABS(ob->x - player->x);
- deltay = LABS(ob->y - player->y);
-
- if (!ProjectileTryMove (ob))
- {
- if (ob->obclass == rocketobj)
- {
- PlaySoundLocActor(MISSILEHITSND,ob);
- ob->state = &s_boom1;
- }
-#ifdef SPEAR
- else if (ob->obclass == hrocketobj)
- {
- PlaySoundLocActor(MISSILEHITSND,ob);
- ob->state = &s_hboom1;
- }
-#endif
- else
- ob->state = NULL; // mark for removal
-
- return;
- }
-
- if (deltax < PROJECTILESIZE && deltay < PROJECTILESIZE)
- { // hit the player
- switch (ob->obclass)
- {
- case needleobj:
- damage = (US_RndT() >>3) + 20;
- break;
- case rocketobj:
- case hrocketobj:
- case sparkobj:
- damage = (US_RndT() >>3) + 30;
- break;
- case fireobj:
- damage = (US_RndT() >>3);
- break;
- }
-
- TakeDamage (damage,ob);
- ob->state = NULL; // mark for removal
- return;
- }
-
- ob->tilex = ob->x >> TILESHIFT;
- ob->tiley = ob->y >> TILESHIFT;
-
-}
-
-
-
-
-/*
-=============================================================================
-
- GUARD
-
-=============================================================================
-*/
-
-//
-// guards
-//
-
-extern statetype s_grdstand;
-
-extern statetype s_grdpath1;
-extern statetype s_grdpath1s;
-extern statetype s_grdpath2;
-extern statetype s_grdpath3;
-extern statetype s_grdpath3s;
-extern statetype s_grdpath4;
-
-extern statetype s_grdpain;
-extern statetype s_grdpain1;
-
-extern statetype s_grdgiveup;
-
-extern statetype s_grdshoot1;
-extern statetype s_grdshoot2;
-extern statetype s_grdshoot3;
-extern statetype s_grdshoot4;
-
-extern statetype s_grdchase1;
-extern statetype s_grdchase1s;
-extern statetype s_grdchase2;
-extern statetype s_grdchase3;
-extern statetype s_grdchase3s;
-extern statetype s_grdchase4;
-
-extern statetype s_grddie1;
-extern statetype s_grddie1d;
-extern statetype s_grddie2;
-extern statetype s_grddie3;
-extern statetype s_grddie4;
-
-statetype s_grdstand = {true,SPR_GRD_S_1,0,T_Stand,NULL,&s_grdstand};
-
-statetype s_grdpath1 = {true,SPR_GRD_W1_1,20,T_Path,NULL,&s_grdpath1s};
-statetype s_grdpath1s = {true,SPR_GRD_W1_1,5,NULL,NULL,&s_grdpath2};
-statetype s_grdpath2 = {true,SPR_GRD_W2_1,15,T_Path,NULL,&s_grdpath3};
-statetype s_grdpath3 = {true,SPR_GRD_W3_1,20,T_Path,NULL,&s_grdpath3s};
-statetype s_grdpath3s = {true,SPR_GRD_W3_1,5,NULL,NULL,&s_grdpath4};
-statetype s_grdpath4 = {true,SPR_GRD_W4_1,15,T_Path,NULL,&s_grdpath1};
-
-statetype s_grdpain = {2,SPR_GRD_PAIN_1,10,NULL,NULL,&s_grdchase1};
-statetype s_grdpain1 = {2,SPR_GRD_PAIN_2,10,NULL,NULL,&s_grdchase1};
-
-statetype s_grdshoot1 = {false,SPR_GRD_SHOOT1,20,NULL,NULL,&s_grdshoot2};
-statetype s_grdshoot2 = {false,SPR_GRD_SHOOT2,20,NULL,T_Shoot,&s_grdshoot3};
-statetype s_grdshoot3 = {false,SPR_GRD_SHOOT3,20,NULL,NULL,&s_grdchase1};
-
-statetype s_grdchase1 = {true,SPR_GRD_W1_1,10,T_Chase,NULL,&s_grdchase1s};
-statetype s_grdchase1s = {true,SPR_GRD_W1_1,3,NULL,NULL,&s_grdchase2};
-statetype s_grdchase2 = {true,SPR_GRD_W2_1,8,T_Chase,NULL,&s_grdchase3};
-statetype s_grdchase3 = {true,SPR_GRD_W3_1,10,T_Chase,NULL,&s_grdchase3s};
-statetype s_grdchase3s = {true,SPR_GRD_W3_1,3,NULL,NULL,&s_grdchase4};
-statetype s_grdchase4 = {true,SPR_GRD_W4_1,8,T_Chase,NULL,&s_grdchase1};
-
-statetype s_grddie1 = {false,SPR_GRD_DIE_1,15,NULL,A_DeathScream,&s_grddie2};
-statetype s_grddie2 = {false,SPR_GRD_DIE_2,15,NULL,NULL,&s_grddie3};
-statetype s_grddie3 = {false,SPR_GRD_DIE_3,15,NULL,NULL,&s_grddie4};
-statetype s_grddie4 = {false,SPR_GRD_DEAD,0,NULL,NULL,&s_grddie4};
-
-
-#ifndef SPEAR
-//
-// ghosts
-//
-extern statetype s_blinkychase1;
-extern statetype s_blinkychase2;
-extern statetype s_inkychase1;
-extern statetype s_inkychase2;
-extern statetype s_pinkychase1;
-extern statetype s_pinkychase2;
-extern statetype s_clydechase1;
-extern statetype s_clydechase2;
-
-statetype s_blinkychase1 = {false,SPR_BLINKY_W1,10,T_Ghosts,NULL,&s_blinkychase2};
-statetype s_blinkychase2 = {false,SPR_BLINKY_W2,10,T_Ghosts,NULL,&s_blinkychase1};
-
-statetype s_inkychase1 = {false,SPR_INKY_W1,10,T_Ghosts,NULL,&s_inkychase2};
-statetype s_inkychase2 = {false,SPR_INKY_W2,10,T_Ghosts,NULL,&s_inkychase1};
-
-statetype s_pinkychase1 = {false,SPR_PINKY_W1,10,T_Ghosts,NULL,&s_pinkychase2};
-statetype s_pinkychase2 = {false,SPR_PINKY_W2,10,T_Ghosts,NULL,&s_pinkychase1};
-
-statetype s_clydechase1 = {false,SPR_CLYDE_W1,10,T_Ghosts,NULL,&s_clydechase2};
-statetype s_clydechase2 = {false,SPR_CLYDE_W2,10,T_Ghosts,NULL,&s_clydechase1};
-#endif
-
-//
-// dogs
-//
-
-extern statetype s_dogpath1;
-extern statetype s_dogpath1s;
-extern statetype s_dogpath2;
-extern statetype s_dogpath3;
-extern statetype s_dogpath3s;
-extern statetype s_dogpath4;
-
-extern statetype s_dogjump1;
-extern statetype s_dogjump2;
-extern statetype s_dogjump3;
-extern statetype s_dogjump4;
-extern statetype s_dogjump5;
-
-extern statetype s_dogchase1;
-extern statetype s_dogchase1s;
-extern statetype s_dogchase2;
-extern statetype s_dogchase3;
-extern statetype s_dogchase3s;
-extern statetype s_dogchase4;
-
-extern statetype s_dogdie1;
-extern statetype s_dogdie1d;
-extern statetype s_dogdie2;
-extern statetype s_dogdie3;
-extern statetype s_dogdead;
-
-statetype s_dogpath1 = {true,SPR_DOG_W1_1,20,T_Path,NULL,&s_dogpath1s};
-statetype s_dogpath1s = {true,SPR_DOG_W1_1,5,NULL,NULL,&s_dogpath2};
-statetype s_dogpath2 = {true,SPR_DOG_W2_1,15,T_Path,NULL,&s_dogpath3};
-statetype s_dogpath3 = {true,SPR_DOG_W3_1,20,T_Path,NULL,&s_dogpath3s};
-statetype s_dogpath3s = {true,SPR_DOG_W3_1,5,NULL,NULL,&s_dogpath4};
-statetype s_dogpath4 = {true,SPR_DOG_W4_1,15,T_Path,NULL,&s_dogpath1};
-
-statetype s_dogjump1 = {false,SPR_DOG_JUMP1,10,NULL,NULL,&s_dogjump2};
-statetype s_dogjump2 = {false,SPR_DOG_JUMP2,10,NULL,T_Bite,&s_dogjump3};
-statetype s_dogjump3 = {false,SPR_DOG_JUMP3,10,NULL,NULL,&s_dogjump4};
-statetype s_dogjump4 = {false,SPR_DOG_JUMP1,10,NULL,NULL,&s_dogjump5};
-statetype s_dogjump5 = {false,SPR_DOG_W1_1,10,NULL,NULL,&s_dogchase1};
-
-statetype s_dogchase1 = {true,SPR_DOG_W1_1,10,T_DogChase,NULL,&s_dogchase1s};
-statetype s_dogchase1s = {true,SPR_DOG_W1_1,3,NULL,NULL,&s_dogchase2};
-statetype s_dogchase2 = {true,SPR_DOG_W2_1,8,T_DogChase,NULL,&s_dogchase3};
-statetype s_dogchase3 = {true,SPR_DOG_W3_1,10,T_DogChase,NULL,&s_dogchase3s};
-statetype s_dogchase3s = {true,SPR_DOG_W3_1,3,NULL,NULL,&s_dogchase4};
-statetype s_dogchase4 = {true,SPR_DOG_W4_1,8,T_DogChase,NULL,&s_dogchase1};
-
-statetype s_dogdie1 = {false,SPR_DOG_DIE_1,15,NULL,A_DeathScream,&s_dogdie2};
-statetype s_dogdie2 = {false,SPR_DOG_DIE_2,15,NULL,NULL,&s_dogdie3};
-statetype s_dogdie3 = {false,SPR_DOG_DIE_3,15,NULL,NULL,&s_dogdead};
-statetype s_dogdead = {false,SPR_DOG_DEAD,15,NULL,NULL,&s_dogdead};
-
-
-//
-// officers
-//
-
-extern statetype s_ofcstand;
-
-extern statetype s_ofcpath1;
-extern statetype s_ofcpath1s;
-extern statetype s_ofcpath2;
-extern statetype s_ofcpath3;
-extern statetype s_ofcpath3s;
-extern statetype s_ofcpath4;
-
-extern statetype s_ofcpain;
-extern statetype s_ofcpain1;
-
-extern statetype s_ofcgiveup;
-
-extern statetype s_ofcshoot1;
-extern statetype s_ofcshoot2;
-extern statetype s_ofcshoot3;
-extern statetype s_ofcshoot4;
-
-extern statetype s_ofcchase1;
-extern statetype s_ofcchase1s;
-extern statetype s_ofcchase2;
-extern statetype s_ofcchase3;
-extern statetype s_ofcchase3s;
-extern statetype s_ofcchase4;
-
-extern statetype s_ofcdie1;
-extern statetype s_ofcdie2;
-extern statetype s_ofcdie3;
-extern statetype s_ofcdie4;
-extern statetype s_ofcdie5;
-
-statetype s_ofcstand = {true,SPR_OFC_S_1,0,T_Stand,NULL,&s_ofcstand};
-
-statetype s_ofcpath1 = {true,SPR_OFC_W1_1,20,T_Path,NULL,&s_ofcpath1s};
-statetype s_ofcpath1s = {true,SPR_OFC_W1_1,5,NULL,NULL,&s_ofcpath2};
-statetype s_ofcpath2 = {true,SPR_OFC_W2_1,15,T_Path,NULL,&s_ofcpath3};
-statetype s_ofcpath3 = {true,SPR_OFC_W3_1,20,T_Path,NULL,&s_ofcpath3s};
-statetype s_ofcpath3s = {true,SPR_OFC_W3_1,5,NULL,NULL,&s_ofcpath4};
-statetype s_ofcpath4 = {true,SPR_OFC_W4_1,15,T_Path,NULL,&s_ofcpath1};
-
-statetype s_ofcpain = {2,SPR_OFC_PAIN_1,10,NULL,NULL,&s_ofcchase1};
-statetype s_ofcpain1 = {2,SPR_OFC_PAIN_2,10,NULL,NULL,&s_ofcchase1};
-
-statetype s_ofcshoot1 = {false,SPR_OFC_SHOOT1,6,NULL,NULL,&s_ofcshoot2};
-statetype s_ofcshoot2 = {false,SPR_OFC_SHOOT2,20,NULL,T_Shoot,&s_ofcshoot3};
-statetype s_ofcshoot3 = {false,SPR_OFC_SHOOT3,10,NULL,NULL,&s_ofcchase1};
-
-statetype s_ofcchase1 = {true,SPR_OFC_W1_1,10,T_Chase,NULL,&s_ofcchase1s};
-statetype s_ofcchase1s = {true,SPR_OFC_W1_1,3,NULL,NULL,&s_ofcchase2};
-statetype s_ofcchase2 = {true,SPR_OFC_W2_1,8,T_Chase,NULL,&s_ofcchase3};
-statetype s_ofcchase3 = {true,SPR_OFC_W3_1,10,T_Chase,NULL,&s_ofcchase3s};
-statetype s_ofcchase3s = {true,SPR_OFC_W3_1,3,NULL,NULL,&s_ofcchase4};
-statetype s_ofcchase4 = {true,SPR_OFC_W4_1,8,T_Chase,NULL,&s_ofcchase1};
-
-statetype s_ofcdie1 = {false,SPR_OFC_DIE_1,11,NULL,A_DeathScream,&s_ofcdie2};
-statetype s_ofcdie2 = {false,SPR_OFC_DIE_2,11,NULL,NULL,&s_ofcdie3};
-statetype s_ofcdie3 = {false,SPR_OFC_DIE_3,11,NULL,NULL,&s_ofcdie4};
-statetype s_ofcdie4 = {false,SPR_OFC_DIE_4,11,NULL,NULL,&s_ofcdie5};
-statetype s_ofcdie5 = {false,SPR_OFC_DEAD,0,NULL,NULL,&s_ofcdie5};
-
-
-//
-// mutant
-//
-
-extern statetype s_mutstand;
-
-extern statetype s_mutpath1;
-extern statetype s_mutpath1s;
-extern statetype s_mutpath2;
-extern statetype s_mutpath3;
-extern statetype s_mutpath3s;
-extern statetype s_mutpath4;
-
-extern statetype s_mutpain;
-extern statetype s_mutpain1;
-
-extern statetype s_mutgiveup;
-
-extern statetype s_mutshoot1;
-extern statetype s_mutshoot2;
-extern statetype s_mutshoot3;
-extern statetype s_mutshoot4;
-
-extern statetype s_mutchase1;
-extern statetype s_mutchase1s;
-extern statetype s_mutchase2;
-extern statetype s_mutchase3;
-extern statetype s_mutchase3s;
-extern statetype s_mutchase4;
-
-extern statetype s_mutdie1;
-extern statetype s_mutdie2;
-extern statetype s_mutdie3;
-extern statetype s_mutdie4;
-extern statetype s_mutdie5;
-
-statetype s_mutstand = {true,SPR_MUT_S_1,0,T_Stand,NULL,&s_mutstand};
-
-statetype s_mutpath1 = {true,SPR_MUT_W1_1,20,T_Path,NULL,&s_mutpath1s};
-statetype s_mutpath1s = {true,SPR_MUT_W1_1,5,NULL,NULL,&s_mutpath2};
-statetype s_mutpath2 = {true,SPR_MUT_W2_1,15,T_Path,NULL,&s_mutpath3};
-statetype s_mutpath3 = {true,SPR_MUT_W3_1,20,T_Path,NULL,&s_mutpath3s};
-statetype s_mutpath3s = {true,SPR_MUT_W3_1,5,NULL,NULL,&s_mutpath4};
-statetype s_mutpath4 = {true,SPR_MUT_W4_1,15,T_Path,NULL,&s_mutpath1};
-
-statetype s_mutpain = {2,SPR_MUT_PAIN_1,10,NULL,NULL,&s_mutchase1};
-statetype s_mutpain1 = {2,SPR_MUT_PAIN_2,10,NULL,NULL,&s_mutchase1};
-
-statetype s_mutshoot1 = {false,SPR_MUT_SHOOT1,6,NULL,T_Shoot,&s_mutshoot2};
-statetype s_mutshoot2 = {false,SPR_MUT_SHOOT2,20,NULL,NULL,&s_mutshoot3};
-statetype s_mutshoot3 = {false,SPR_MUT_SHOOT3,10,NULL,T_Shoot,&s_mutshoot4};
-statetype s_mutshoot4 = {false,SPR_MUT_SHOOT4,20,NULL,NULL,&s_mutchase1};
-
-statetype s_mutchase1 = {true,SPR_MUT_W1_1,10,T_Chase,NULL,&s_mutchase1s};
-statetype s_mutchase1s = {true,SPR_MUT_W1_1,3,NULL,NULL,&s_mutchase2};
-statetype s_mutchase2 = {true,SPR_MUT_W2_1,8,T_Chase,NULL,&s_mutchase3};
-statetype s_mutchase3 = {true,SPR_MUT_W3_1,10,T_Chase,NULL,&s_mutchase3s};
-statetype s_mutchase3s = {true,SPR_MUT_W3_1,3,NULL,NULL,&s_mutchase4};
-statetype s_mutchase4 = {true,SPR_MUT_W4_1,8,T_Chase,NULL,&s_mutchase1};
-
-statetype s_mutdie1 = {false,SPR_MUT_DIE_1,7,NULL,A_DeathScream,&s_mutdie2};
-statetype s_mutdie2 = {false,SPR_MUT_DIE_2,7,NULL,NULL,&s_mutdie3};
-statetype s_mutdie3 = {false,SPR_MUT_DIE_3,7,NULL,NULL,&s_mutdie4};
-statetype s_mutdie4 = {false,SPR_MUT_DIE_4,7,NULL,NULL,&s_mutdie5};
-statetype s_mutdie5 = {false,SPR_MUT_DEAD,0,NULL,NULL,&s_mutdie5};
-
-
-//
-// SS
-//
-
-extern statetype s_ssstand;
-
-extern statetype s_sspath1;
-extern statetype s_sspath1s;
-extern statetype s_sspath2;
-extern statetype s_sspath3;
-extern statetype s_sspath3s;
-extern statetype s_sspath4;
-
-extern statetype s_sspain;
-extern statetype s_sspain1;
-
-extern statetype s_ssshoot1;
-extern statetype s_ssshoot2;
-extern statetype s_ssshoot3;
-extern statetype s_ssshoot4;
-extern statetype s_ssshoot5;
-extern statetype s_ssshoot6;
-extern statetype s_ssshoot7;
-extern statetype s_ssshoot8;
-extern statetype s_ssshoot9;
-
-extern statetype s_sschase1;
-extern statetype s_sschase1s;
-extern statetype s_sschase2;
-extern statetype s_sschase3;
-extern statetype s_sschase3s;
-extern statetype s_sschase4;
-
-extern statetype s_ssdie1;
-extern statetype s_ssdie2;
-extern statetype s_ssdie3;
-extern statetype s_ssdie4;
-
-statetype s_ssstand = {true,SPR_SS_S_1,0,T_Stand,NULL,&s_ssstand};
-
-statetype s_sspath1 = {true,SPR_SS_W1_1,20,T_Path,NULL,&s_sspath1s};
-statetype s_sspath1s = {true,SPR_SS_W1_1,5,NULL,NULL,&s_sspath2};
-statetype s_sspath2 = {true,SPR_SS_W2_1,15,T_Path,NULL,&s_sspath3};
-statetype s_sspath3 = {true,SPR_SS_W3_1,20,T_Path,NULL,&s_sspath3s};
-statetype s_sspath3s = {true,SPR_SS_W3_1,5,NULL,NULL,&s_sspath4};
-statetype s_sspath4 = {true,SPR_SS_W4_1,15,T_Path,NULL,&s_sspath1};
-
-statetype s_sspain = {2,SPR_SS_PAIN_1,10,NULL,NULL,&s_sschase1};
-statetype s_sspain1 = {2,SPR_SS_PAIN_2,10,NULL,NULL,&s_sschase1};
-
-statetype s_ssshoot1 = {false,SPR_SS_SHOOT1,20,NULL,NULL,&s_ssshoot2};
-statetype s_ssshoot2 = {false,SPR_SS_SHOOT2,20,NULL,T_Shoot,&s_ssshoot3};
-statetype s_ssshoot3 = {false,SPR_SS_SHOOT3,10,NULL,NULL,&s_ssshoot4};
-statetype s_ssshoot4 = {false,SPR_SS_SHOOT2,10,NULL,T_Shoot,&s_ssshoot5};
-statetype s_ssshoot5 = {false,SPR_SS_SHOOT3,10,NULL,NULL,&s_ssshoot6};
-statetype s_ssshoot6 = {false,SPR_SS_SHOOT2,10,NULL,T_Shoot,&s_ssshoot7};
-statetype s_ssshoot7 = {false,SPR_SS_SHOOT3,10,NULL,NULL,&s_ssshoot8};
-statetype s_ssshoot8 = {false,SPR_SS_SHOOT2,10,NULL,T_Shoot,&s_ssshoot9};
-statetype s_ssshoot9 = {false,SPR_SS_SHOOT3,10,NULL,NULL,&s_sschase1};
-
-statetype s_sschase1 = {true,SPR_SS_W1_1,10,T_Chase,NULL,&s_sschase1s};
-statetype s_sschase1s = {true,SPR_SS_W1_1,3,NULL,NULL,&s_sschase2};
-statetype s_sschase2 = {true,SPR_SS_W2_1,8,T_Chase,NULL,&s_sschase3};
-statetype s_sschase3 = {true,SPR_SS_W3_1,10,T_Chase,NULL,&s_sschase3s};
-statetype s_sschase3s = {true,SPR_SS_W3_1,3,NULL,NULL,&s_sschase4};
-statetype s_sschase4 = {true,SPR_SS_W4_1,8,T_Chase,NULL,&s_sschase1};
-
-statetype s_ssdie1 = {false,SPR_SS_DIE_1,15,NULL,A_DeathScream,&s_ssdie2};
-statetype s_ssdie2 = {false,SPR_SS_DIE_2,15,NULL,NULL,&s_ssdie3};
-statetype s_ssdie3 = {false,SPR_SS_DIE_3,15,NULL,NULL,&s_ssdie4};
-statetype s_ssdie4 = {false,SPR_SS_DEAD,0,NULL,NULL,&s_ssdie4};
-
-
-#ifndef SPEAR
-//
-// hans
-//
-extern statetype s_bossstand;
-
-extern statetype s_bosschase1;
-extern statetype s_bosschase1s;
-extern statetype s_bosschase2;
-extern statetype s_bosschase3;
-extern statetype s_bosschase3s;
-extern statetype s_bosschase4;
-
-extern statetype s_bossdie1;
-extern statetype s_bossdie2;
-extern statetype s_bossdie3;
-extern statetype s_bossdie4;
-
-extern statetype s_bossshoot1;
-extern statetype s_bossshoot2;
-extern statetype s_bossshoot3;
-extern statetype s_bossshoot4;
-extern statetype s_bossshoot5;
-extern statetype s_bossshoot6;
-extern statetype s_bossshoot7;
-extern statetype s_bossshoot8;
-
-
-statetype s_bossstand = {false,SPR_BOSS_W1,0,T_Stand,NULL,&s_bossstand};
-
-statetype s_bosschase1 = {false,SPR_BOSS_W1,10,T_Chase,NULL,&s_bosschase1s};
-statetype s_bosschase1s = {false,SPR_BOSS_W1,3,NULL,NULL,&s_bosschase2};
-statetype s_bosschase2 = {false,SPR_BOSS_W2,8,T_Chase,NULL,&s_bosschase3};
-statetype s_bosschase3 = {false,SPR_BOSS_W3,10,T_Chase,NULL,&s_bosschase3s};
-statetype s_bosschase3s = {false,SPR_BOSS_W3,3,NULL,NULL,&s_bosschase4};
-statetype s_bosschase4 = {false,SPR_BOSS_W4,8,T_Chase,NULL,&s_bosschase1};
-
-statetype s_bossdie1 = {false,SPR_BOSS_DIE1,15,NULL,A_DeathScream,&s_bossdie2};
-statetype s_bossdie2 = {false,SPR_BOSS_DIE2,15,NULL,NULL,&s_bossdie3};
-statetype s_bossdie3 = {false,SPR_BOSS_DIE3,15,NULL,NULL,&s_bossdie4};
-statetype s_bossdie4 = {false,SPR_BOSS_DEAD,0,NULL,NULL,&s_bossdie4};
-
-statetype s_bossshoot1 = {false,SPR_BOSS_SHOOT1,30,NULL,NULL,&s_bossshoot2};
-statetype s_bossshoot2 = {false,SPR_BOSS_SHOOT2,10,NULL,T_Shoot,&s_bossshoot3};
-statetype s_bossshoot3 = {false,SPR_BOSS_SHOOT3,10,NULL,T_Shoot,&s_bossshoot4};
-statetype s_bossshoot4 = {false,SPR_BOSS_SHOOT2,10,NULL,T_Shoot,&s_bossshoot5};
-statetype s_bossshoot5 = {false,SPR_BOSS_SHOOT3,10,NULL,T_Shoot,&s_bossshoot6};
-statetype s_bossshoot6 = {false,SPR_BOSS_SHOOT2,10,NULL,T_Shoot,&s_bossshoot7};
-statetype s_bossshoot7 = {false,SPR_BOSS_SHOOT3,10,NULL,T_Shoot,&s_bossshoot8};
-statetype s_bossshoot8 = {false,SPR_BOSS_SHOOT1,10,NULL,NULL,&s_bosschase1};
-
-
-//
-// gretel
-//
-extern statetype s_gretelstand;
-
-extern statetype s_gretelchase1;
-extern statetype s_gretelchase1s;
-extern statetype s_gretelchase2;
-extern statetype s_gretelchase3;
-extern statetype s_gretelchase3s;
-extern statetype s_gretelchase4;
-
-extern statetype s_greteldie1;
-extern statetype s_greteldie2;
-extern statetype s_greteldie3;
-extern statetype s_greteldie4;
-
-extern statetype s_gretelshoot1;
-extern statetype s_gretelshoot2;
-extern statetype s_gretelshoot3;
-extern statetype s_gretelshoot4;
-extern statetype s_gretelshoot5;
-extern statetype s_gretelshoot6;
-extern statetype s_gretelshoot7;
-extern statetype s_gretelshoot8;
-
-
-statetype s_gretelstand = {false,SPR_GRETEL_W1,0,T_Stand,NULL,&s_gretelstand};
-
-statetype s_gretelchase1 = {false,SPR_GRETEL_W1,10,T_Chase,NULL,&s_gretelchase1s};
-statetype s_gretelchase1s = {false,SPR_GRETEL_W1,3,NULL,NULL,&s_gretelchase2};
-statetype s_gretelchase2 = {false,SPR_GRETEL_W2,8,T_Chase,NULL,&s_gretelchase3};
-statetype s_gretelchase3 = {false,SPR_GRETEL_W3,10,T_Chase,NULL,&s_gretelchase3s};
-statetype s_gretelchase3s = {false,SPR_GRETEL_W3,3,NULL,NULL,&s_gretelchase4};
-statetype s_gretelchase4 = {false,SPR_GRETEL_W4,8,T_Chase,NULL,&s_gretelchase1};
-
-statetype s_greteldie1 = {false,SPR_GRETEL_DIE1,15,NULL,A_DeathScream,&s_greteldie2};
-statetype s_greteldie2 = {false,SPR_GRETEL_DIE2,15,NULL,NULL,&s_greteldie3};
-statetype s_greteldie3 = {false,SPR_GRETEL_DIE3,15,NULL,NULL,&s_greteldie4};
-statetype s_greteldie4 = {false,SPR_GRETEL_DEAD,0,NULL,NULL,&s_greteldie4};
-
-statetype s_gretelshoot1 = {false,SPR_GRETEL_SHOOT1,30,NULL,NULL,&s_gretelshoot2};
-statetype s_gretelshoot2 = {false,SPR_GRETEL_SHOOT2,10,NULL,T_Shoot,&s_gretelshoot3};
-statetype s_gretelshoot3 = {false,SPR_GRETEL_SHOOT3,10,NULL,T_Shoot,&s_gretelshoot4};
-statetype s_gretelshoot4 = {false,SPR_GRETEL_SHOOT2,10,NULL,T_Shoot,&s_gretelshoot5};
-statetype s_gretelshoot5 = {false,SPR_GRETEL_SHOOT3,10,NULL,T_Shoot,&s_gretelshoot6};
-statetype s_gretelshoot6 = {false,SPR_GRETEL_SHOOT2,10,NULL,T_Shoot,&s_gretelshoot7};
-statetype s_gretelshoot7 = {false,SPR_GRETEL_SHOOT3,10,NULL,T_Shoot,&s_gretelshoot8};
-statetype s_gretelshoot8 = {false,SPR_GRETEL_SHOOT1,10,NULL,NULL,&s_gretelchase1};
-#endif
-
-
-/*
-===============
-=
-= SpawnStand
-=
-===============
-*/
-
-void SpawnStand (enemy_t which, int tilex, int tiley, int dir)
-{
- unsigned far *map,tile;
-
- switch (which)
- {
- case en_guard:
- SpawnNewObj (tilex,tiley,&s_grdstand);
- new->speed = SPDPATROL;
- if (!loadedgame)
- gamestate.killtotal++;
- break;
-
- case en_officer:
- SpawnNewObj (tilex,tiley,&s_ofcstand);
- new->speed = SPDPATROL;
- if (!loadedgame)
- gamestate.killtotal++;
- break;
-
- case en_mutant:
- SpawnNewObj (tilex,tiley,&s_mutstand);
- new->speed = SPDPATROL;
- if (!loadedgame)
- gamestate.killtotal++;
- break;
-
- case en_ss:
- SpawnNewObj (tilex,tiley,&s_ssstand);
- new->speed = SPDPATROL;
- if (!loadedgame)
- gamestate.killtotal++;
- break;
- }
-
-
- map = mapsegs[0]+farmapylookup[tiley]+tilex;
- if (*map == AMBUSHTILE)
- {
- tilemap[tilex][tiley] = 0;
-
- if (*(map+1) >= AREATILE)
- tile = *(map+1);
- if (*(map-mapwidth) >= AREATILE)
- tile = *(map-mapwidth);
- if (*(map+mapwidth) >= AREATILE)
- tile = *(map+mapwidth);
- if ( *(map-1) >= AREATILE)
- tile = *(map-1);
-
- *map = tile;
- new->areanumber = tile-AREATILE;
-
- new->flags |= FL_AMBUSH;
- }
-
- new->obclass = guardobj+which;
- new->hitpoints = starthitpoints[gamestate.difficulty][which];
- new->dir = dir*2;
- new->flags |= FL_SHOOTABLE;
-}
-
-
-
-/*
-===============
-=
-= SpawnDeadGuard
-=
-===============
-*/
-
-void SpawnDeadGuard (int tilex, int tiley)
-{
- SpawnNewObj (tilex,tiley,&s_grddie4);
- new->obclass = inertobj;
-}
-
-
-
-#ifndef SPEAR
-/*
-===============
-=
-= SpawnBoss
-=
-===============
-*/
-
-void SpawnBoss (int tilex, int tiley)
-{
- unsigned far *map,tile;
-
- SpawnNewObj (tilex,tiley,&s_bossstand);
- new->speed = SPDPATROL;
-
- new->obclass = bossobj;
- new->hitpoints = starthitpoints[gamestate.difficulty][en_boss];
- new->dir = south;
- new->flags |= FL_SHOOTABLE|FL_AMBUSH;
- if (!loadedgame)
- gamestate.killtotal++;
-}
-
-/*
-===============
-=
-= SpawnGretel
-=
-===============
-*/
-
-void SpawnGretel (int tilex, int tiley)
-{
- unsigned far *map,tile;
-
- SpawnNewObj (tilex,tiley,&s_gretelstand);
- new->speed = SPDPATROL;
-
- new->obclass = gretelobj;
- new->hitpoints = starthitpoints[gamestate.difficulty][en_gretel];
- new->dir = north;
- new->flags |= FL_SHOOTABLE|FL_AMBUSH;
- if (!loadedgame)
- gamestate.killtotal++;
-}
-#endif
-
-/*
-===============
-=
-= SpawnPatrol
-=
-===============
-*/
-
-void SpawnPatrol (enemy_t which, int tilex, int tiley, int dir)
-{
- switch (which)
- {
- case en_guard:
- SpawnNewObj (tilex,tiley,&s_grdpath1);
- new->speed = SPDPATROL;
- if (!loadedgame)
- gamestate.killtotal++;
- break;
-
- case en_officer:
- SpawnNewObj (tilex,tiley,&s_ofcpath1);
- new->speed = SPDPATROL;
- if (!loadedgame)
- gamestate.killtotal++;
- break;
-
- case en_ss:
- SpawnNewObj (tilex,tiley,&s_sspath1);
- new->speed = SPDPATROL;
- if (!loadedgame)
- gamestate.killtotal++;
- break;
-
- case en_mutant:
- SpawnNewObj (tilex,tiley,&s_mutpath1);
- new->speed = SPDPATROL;
- if (!loadedgame)
- gamestate.killtotal++;
- break;
-
- case en_dog:
- SpawnNewObj (tilex,tiley,&s_dogpath1);
- new->speed = SPDDOG;
- if (!loadedgame)
- gamestate.killtotal++;
- break;
- }
-
- new->obclass = guardobj+which;
- new->dir = dir*2;
- new->hitpoints = starthitpoints[gamestate.difficulty][which];
- new->distance = tileglobal;
- new->flags |= FL_SHOOTABLE;
- new->active = true;
-
- actorat[new->tilex][new->tiley] = NULL; // don't use original spot
-
- switch (dir)
- {
- case 0:
- new->tilex++;
- break;
- case 1:
- new->tiley--;
- break;
- case 2:
- new->tilex--;
- break;
- case 3:
- new->tiley++;
- break;
- }
-
- actorat[new->tilex][new->tiley] = new;
-}
-
-
-
-/*
-==================
-=
-= A_DeathScream
-=
-==================
-*/
-
-void A_DeathScream (objtype *ob)
-{
-#ifndef UPLOAD
-#ifndef SPEAR
- if (mapon==9 && !US_RndT())
-#else
- if ((mapon==18 || mapon==19) && !US_RndT())
-#endif
- {
- switch(ob->obclass)
- {
- case mutantobj:
- case guardobj:
- case officerobj:
- case ssobj:
- case dogobj:
- PlaySoundLocActor(DEATHSCREAM6SND,ob);
- return;
- }
- }
-#endif
-
- switch (ob->obclass)
- {
- case mutantobj:
- PlaySoundLocActor(AHHHGSND,ob);
- break;
-
- case guardobj:
- {
- int sounds[9]={ DEATHSCREAM1SND,
- DEATHSCREAM2SND,
- DEATHSCREAM3SND,
- DEATHSCREAM4SND,
- DEATHSCREAM5SND,
- DEATHSCREAM7SND,
- DEATHSCREAM8SND,
- DEATHSCREAM9SND
- };
-
- #ifndef UPLOAD
- PlaySoundLocActor(sounds[US_RndT()%8],ob);
- #else
- PlaySoundLocActor(sounds[US_RndT()%2],ob);
- #endif
- }
- break;
- case officerobj:
- PlaySoundLocActor(NEINSOVASSND,ob);
- break;
- case ssobj:
- PlaySoundLocActor(LEBENSND,ob); // JAB
- break;
- case dogobj:
- PlaySoundLocActor(DOGDEATHSND,ob); // JAB
- break;
-#ifndef SPEAR
- case bossobj:
- SD_PlaySound(MUTTISND); // JAB
- break;
- case schabbobj:
- SD_PlaySound(MEINGOTTSND);
- break;
- case fakeobj:
- SD_PlaySound(HITLERHASND);
- break;
- case mechahitlerobj:
- SD_PlaySound(SCHEISTSND);
- break;
- case realhitlerobj:
- SD_PlaySound(EVASND);
- break;
- case gretelobj:
- SD_PlaySound(MEINSND);
- break;
- case giftobj:
- SD_PlaySound(DONNERSND);
- break;
- case fatobj:
- SD_PlaySound(ROSESND);
- break;
-#else
- case spectreobj:
- SD_PlaySound(GHOSTFADESND);
- break;
- case angelobj:
- SD_PlaySound(ANGELDEATHSND);
- break;
- case transobj:
- SD_PlaySound(TRANSDEATHSND);
- break;
- case uberobj:
- SD_PlaySound(UBERDEATHSND);
- break;
- case willobj:
- SD_PlaySound(WILHELMDEATHSND);
- break;
- case deathobj:
- SD_PlaySound(KNIGHTDEATHSND);
- break;
-#endif
- }
-}
-
-
-/*
-=============================================================================
-
- SPEAR ACTORS
-
-=============================================================================
-*/
-
-#ifdef SPEAR
-
-void T_Launch (objtype *ob);
-void T_Will (objtype *ob);
-
-extern statetype s_angelshoot1;
-extern statetype s_deathshoot1;
-extern statetype s_spark1;
-
-//
-// trans
-//
-extern statetype s_transstand;
-
-extern statetype s_transchase1;
-extern statetype s_transchase1s;
-extern statetype s_transchase2;
-extern statetype s_transchase3;
-extern statetype s_transchase3s;
-extern statetype s_transchase4;
-
-extern statetype s_transdie0;
-extern statetype s_transdie01;
-extern statetype s_transdie1;
-extern statetype s_transdie2;
-extern statetype s_transdie3;
-extern statetype s_transdie4;
-
-extern statetype s_transshoot1;
-extern statetype s_transshoot2;
-extern statetype s_transshoot3;
-extern statetype s_transshoot4;
-extern statetype s_transshoot5;
-extern statetype s_transshoot6;
-extern statetype s_transshoot7;
-extern statetype s_transshoot8;
-
-
-statetype s_transstand = {false,SPR_TRANS_W1,0,T_Stand,NULL,&s_transstand};
-
-statetype s_transchase1 = {false,SPR_TRANS_W1,10,T_Chase,NULL,&s_transchase1s};
-statetype s_transchase1s = {false,SPR_TRANS_W1,3,NULL,NULL,&s_transchase2};
-statetype s_transchase2 = {false,SPR_TRANS_W2,8,T_Chase,NULL,&s_transchase3};
-statetype s_transchase3 = {false,SPR_TRANS_W3,10,T_Chase,NULL,&s_transchase3s};
-statetype s_transchase3s = {false,SPR_TRANS_W3,3,NULL,NULL,&s_transchase4};
-statetype s_transchase4 = {false,SPR_TRANS_W4,8,T_Chase,NULL,&s_transchase1};
-
-statetype s_transdie0 = {false,SPR_TRANS_W1,1,NULL,A_DeathScream,&s_transdie01};
-statetype s_transdie01 = {false,SPR_TRANS_W1,1,NULL,NULL,&s_transdie1};
-statetype s_transdie1 = {false,SPR_TRANS_DIE1,15,NULL,NULL,&s_transdie2};
-statetype s_transdie2 = {false,SPR_TRANS_DIE2,15,NULL,NULL,&s_transdie3};
-statetype s_transdie3 = {false,SPR_TRANS_DIE3,15,NULL,NULL,&s_transdie4};
-statetype s_transdie4 = {false,SPR_TRANS_DEAD,0,NULL,NULL,&s_transdie4};
-
-statetype s_transshoot1 = {false,SPR_TRANS_SHOOT1,30,NULL,NULL,&s_transshoot2};
-statetype s_transshoot2 = {false,SPR_TRANS_SHOOT2,10,NULL,T_Shoot,&s_transshoot3};
-statetype s_transshoot3 = {false,SPR_TRANS_SHOOT3,10,NULL,T_Shoot,&s_transshoot4};
-statetype s_transshoot4 = {false,SPR_TRANS_SHOOT2,10,NULL,T_Shoot,&s_transshoot5};
-statetype s_transshoot5 = {false,SPR_TRANS_SHOOT3,10,NULL,T_Shoot,&s_transshoot6};
-statetype s_transshoot6 = {false,SPR_TRANS_SHOOT2,10,NULL,T_Shoot,&s_transshoot7};
-statetype s_transshoot7 = {false,SPR_TRANS_SHOOT3,10,NULL,T_Shoot,&s_transshoot8};
-statetype s_transshoot8 = {false,SPR_TRANS_SHOOT1,10,NULL,NULL,&s_transchase1};
-
-
-/*
-===============
-=
-= SpawnTrans
-=
-===============
-*/
-
-void SpawnTrans (int tilex, int tiley)
-{
- unsigned far *map,tile;
-
- if (SoundBlasterPresent && DigiMode != sds_Off)
- s_transdie01.tictime = 105;
-
- SpawnNewObj (tilex,tiley,&s_transstand);
- new->obclass = transobj;
- new->hitpoints = starthitpoints[gamestate.difficulty][en_trans];
- new->flags |= FL_SHOOTABLE|FL_AMBUSH;
- if (!loadedgame)
- gamestate.killtotal++;
-}
-
-
-//
-// uber
-//
-void T_UShoot (objtype *ob);
-
-extern statetype s_uberstand;
-
-extern statetype s_uberchase1;
-extern statetype s_uberchase1s;
-extern statetype s_uberchase2;
-extern statetype s_uberchase3;
-extern statetype s_uberchase3s;
-extern statetype s_uberchase4;
-
-extern statetype s_uberdie0;
-extern statetype s_uberdie01;
-extern statetype s_uberdie1;
-extern statetype s_uberdie2;
-extern statetype s_uberdie3;
-extern statetype s_uberdie4;
-extern statetype s_uberdie5;
-
-extern statetype s_ubershoot1;
-extern statetype s_ubershoot2;
-extern statetype s_ubershoot3;
-extern statetype s_ubershoot4;
-extern statetype s_ubershoot5;
-extern statetype s_ubershoot6;
-extern statetype s_ubershoot7;
-
-
-statetype s_uberstand = {false,SPR_UBER_W1,0,T_Stand,NULL,&s_uberstand};
-
-statetype s_uberchase1 = {false,SPR_UBER_W1,10,T_Chase,NULL,&s_uberchase1s};
-statetype s_uberchase1s = {false,SPR_UBER_W1,3,NULL,NULL,&s_uberchase2};
-statetype s_uberchase2 = {false,SPR_UBER_W2,8,T_Chase,NULL,&s_uberchase3};
-statetype s_uberchase3 = {false,SPR_UBER_W3,10,T_Chase,NULL,&s_uberchase3s};
-statetype s_uberchase3s = {false,SPR_UBER_W3,3,NULL,NULL,&s_uberchase4};
-statetype s_uberchase4 = {false,SPR_UBER_W4,8,T_Chase,NULL,&s_uberchase1};
-
-statetype s_uberdie0 = {false,SPR_UBER_W1,1,NULL,A_DeathScream,&s_uberdie01};
-statetype s_uberdie01 = {false,SPR_UBER_W1,1,NULL,NULL,&s_uberdie1};
-statetype s_uberdie1 = {false,SPR_UBER_DIE1,15,NULL,NULL,&s_uberdie2};
-statetype s_uberdie2 = {false,SPR_UBER_DIE2,15,NULL,NULL,&s_uberdie3};
-statetype s_uberdie3 = {false,SPR_UBER_DIE3,15,NULL,NULL,&s_uberdie4};
-statetype s_uberdie4 = {false,SPR_UBER_DIE4,15,NULL,NULL,&s_uberdie5};
-statetype s_uberdie5 = {false,SPR_UBER_DEAD,0,NULL,NULL,&s_uberdie5};
-
-statetype s_ubershoot1 = {false,SPR_UBER_SHOOT1,30,NULL,NULL,&s_ubershoot2};
-statetype s_ubershoot2 = {false,SPR_UBER_SHOOT2,12,NULL,T_UShoot,&s_ubershoot3};
-statetype s_ubershoot3 = {false,SPR_UBER_SHOOT3,12,NULL,T_UShoot,&s_ubershoot4};
-statetype s_ubershoot4 = {false,SPR_UBER_SHOOT4,12,NULL,T_UShoot,&s_ubershoot5};
-statetype s_ubershoot5 = {false,SPR_UBER_SHOOT3,12,NULL,T_UShoot,&s_ubershoot6};
-statetype s_ubershoot6 = {false,SPR_UBER_SHOOT2,12,NULL,T_UShoot,&s_ubershoot7};
-statetype s_ubershoot7 = {false,SPR_UBER_SHOOT1,12,NULL,NULL,&s_uberchase1};
-
-
-/*
-===============
-=
-= SpawnUber
-=
-===============
-*/
-
-void SpawnUber (int tilex, int tiley)
-{
- unsigned far *map,tile;
-
- if (SoundBlasterPresent && DigiMode != sds_Off)
- s_uberdie01.tictime = 70;
-
- SpawnNewObj (tilex,tiley,&s_uberstand);
- new->obclass = uberobj;
- new->hitpoints = starthitpoints[gamestate.difficulty][en_uber];
- new->flags |= FL_SHOOTABLE|FL_AMBUSH;
- if (!loadedgame)
- gamestate.killtotal++;
-}
-
-
-/*
-===============
-=
-= T_UShoot
-=
-===============
-*/
-
-void T_UShoot (objtype *ob)
-{
- int dx,dy,dist;
-
- T_Shoot (ob);
-
- dx = abs(ob->tilex - player->tilex);
- dy = abs(ob->tiley - player->tiley);
- dist = dx>dy ? dx : dy;
- if (dist <= 1)
- TakeDamage (10,ob);
-}
-
-
-//
-// will
-//
-extern statetype s_willstand;
-
-extern statetype s_willchase1;
-extern statetype s_willchase1s;
-extern statetype s_willchase2;
-extern statetype s_willchase3;
-extern statetype s_willchase3s;
-extern statetype s_willchase4;
-
-extern statetype s_willdie1;
-extern statetype s_willdie2;
-extern statetype s_willdie3;
-extern statetype s_willdie4;
-extern statetype s_willdie5;
-extern statetype s_willdie6;
-
-extern statetype s_willshoot1;
-extern statetype s_willshoot2;
-extern statetype s_willshoot3;
-extern statetype s_willshoot4;
-extern statetype s_willshoot5;
-extern statetype s_willshoot6;
-
-
-statetype s_willstand = {false,SPR_WILL_W1,0,T_Stand,NULL,&s_willstand};
-
-statetype s_willchase1 = {false,SPR_WILL_W1,10,T_Will,NULL,&s_willchase1s};
-statetype s_willchase1s = {false,SPR_WILL_W1,3,NULL,NULL,&s_willchase2};
-statetype s_willchase2 = {false,SPR_WILL_W2,8,T_Will,NULL,&s_willchase3};
-statetype s_willchase3 = {false,SPR_WILL_W3,10,T_Will,NULL,&s_willchase3s};
-statetype s_willchase3s = {false,SPR_WILL_W3,3,NULL,NULL,&s_willchase4};
-statetype s_willchase4 = {false,SPR_WILL_W4,8,T_Will,NULL,&s_willchase1};
-
-statetype s_willdeathcam = {false,SPR_WILL_W1,1,NULL,NULL,&s_willdie1};
-
-statetype s_willdie1 = {false,SPR_WILL_W1,1,NULL,A_DeathScream,&s_willdie2};
-statetype s_willdie2 = {false,SPR_WILL_W1,10,NULL,NULL,&s_willdie3};
-statetype s_willdie3 = {false,SPR_WILL_DIE1,10,NULL,NULL,&s_willdie4};
-statetype s_willdie4 = {false,SPR_WILL_DIE2,10,NULL,NULL,&s_willdie5};
-statetype s_willdie5 = {false,SPR_WILL_DIE3,10,NULL,NULL,&s_willdie6};
-statetype s_willdie6 = {false,SPR_WILL_DEAD,20,NULL,NULL,&s_willdie6};
-
-statetype s_willshoot1 = {false,SPR_WILL_SHOOT1,30,NULL,NULL,&s_willshoot2};
-statetype s_willshoot2 = {false,SPR_WILL_SHOOT2,10,NULL,T_Launch,&s_willshoot3};
-statetype s_willshoot3 = {false,SPR_WILL_SHOOT3,10,NULL,T_Shoot,&s_willshoot4};
-statetype s_willshoot4 = {false,SPR_WILL_SHOOT4,10,NULL,T_Shoot,&s_willshoot5};
-statetype s_willshoot5 = {false,SPR_WILL_SHOOT3,10,NULL,T_Shoot,&s_willshoot6};
-statetype s_willshoot6 = {false,SPR_WILL_SHOOT4,10,NULL,T_Shoot,&s_willchase1};
-
-
-/*
-===============
-=
-= SpawnWill
-=
-===============
-*/
-
-void SpawnWill (int tilex, int tiley)
-{
- unsigned far *map,tile;
-
- if (SoundBlasterPresent && DigiMode != sds_Off)
- s_willdie2.tictime = 70;
-
- SpawnNewObj (tilex,tiley,&s_willstand);
- new->obclass = willobj;
- new->hitpoints = starthitpoints[gamestate.difficulty][en_will];
- new->flags |= FL_SHOOTABLE|FL_AMBUSH;
- if (!loadedgame)
- gamestate.killtotal++;
-}
-
-
-/*
-================
-=
-= T_Will
-=
-================
-*/
-
-void T_Will (objtype *ob)
-{
- long move;
- int dx,dy,dist;
- boolean dodge;
-
- dodge = false;
- dx = abs(ob->tilex - player->tilex);
- dy = abs(ob->tiley - player->tiley);
- dist = dx>dy ? dx : dy;
-
- if (CheckLine(ob)) // got a shot at player?
- {
- if ( US_RndT() < (tics<<3) )
- {
- //
- // go into attack frame
- //
- if (ob->obclass == willobj)
- NewState (ob,&s_willshoot1);
- else if (ob->obclass == angelobj)
- NewState (ob,&s_angelshoot1);
- else
- NewState (ob,&s_deathshoot1);
- return;
- }
- dodge = true;
- }
-
- if (ob->dir == nodir)
- {
- if (dodge)
- SelectDodgeDir (ob);
- else
- SelectChaseDir (ob);
- if (ob->dir == nodir)
- return; // object is blocked in
- }
-
- move = ob->speed*tics;
-
- while (move)
- {
- if (ob->distance < 0)
- {
- //
- // waiting for a door to open
- //
- OpenDoor (-ob->distance-1);
- if (doorobjlist[-ob->distance-1].action != dr_open)
- return;
- ob->distance = TILEGLOBAL; // go ahead, the door is now opoen
- }
-
- if (move < ob->distance)
- {
- MoveObj (ob,move);
- break;
- }
-
- //
- // reached goal tile, so select another one
- //
-
- //
- // fix position to account for round off during moving
- //
- ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
- ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
-
- move -= ob->distance;
-
- if (dist <4)
- SelectRunDir (ob);
- else if (dodge)
- SelectDodgeDir (ob);
- else
- SelectChaseDir (ob);
-
- if (ob->dir == nodir)
- return; // object is blocked in
- }
-
-}
-
-
-//
-// death
-//
-extern statetype s_deathstand;
-
-extern statetype s_deathchase1;
-extern statetype s_deathchase1s;
-extern statetype s_deathchase2;
-extern statetype s_deathchase3;
-extern statetype s_deathchase3s;
-extern statetype s_deathchase4;
-
-extern statetype s_deathdie1;
-extern statetype s_deathdie2;
-extern statetype s_deathdie3;
-extern statetype s_deathdie4;
-extern statetype s_deathdie5;
-extern statetype s_deathdie6;
-extern statetype s_deathdie7;
-extern statetype s_deathdie8;
-extern statetype s_deathdie9;
-
-extern statetype s_deathshoot1;
-extern statetype s_deathshoot2;
-extern statetype s_deathshoot3;
-extern statetype s_deathshoot4;
-extern statetype s_deathshoot5;
-
-
-statetype s_deathstand = {false,SPR_DEATH_W1,0,T_Stand,NULL,&s_deathstand};
-
-statetype s_deathchase1 = {false,SPR_DEATH_W1,10,T_Will,NULL,&s_deathchase1s};
-statetype s_deathchase1s = {false,SPR_DEATH_W1,3,NULL,NULL,&s_deathchase2};
-statetype s_deathchase2 = {false,SPR_DEATH_W2,8,T_Will,NULL,&s_deathchase3};
-statetype s_deathchase3 = {false,SPR_DEATH_W3,10,T_Will,NULL,&s_deathchase3s};
-statetype s_deathchase3s = {false,SPR_DEATH_W3,3,NULL,NULL,&s_deathchase4};
-statetype s_deathchase4 = {false,SPR_DEATH_W4,8,T_Will,NULL,&s_deathchase1};
-
-statetype s_deathdeathcam = {false,SPR_DEATH_W1,1,NULL,NULL,&s_deathdie1};
-
-statetype s_deathdie1 = {false,SPR_DEATH_W1,1,NULL,A_DeathScream,&s_deathdie2};
-statetype s_deathdie2 = {false,SPR_DEATH_W1,10,NULL,NULL,&s_deathdie3};
-statetype s_deathdie3 = {false,SPR_DEATH_DIE1,10,NULL,NULL,&s_deathdie4};
-statetype s_deathdie4 = {false,SPR_DEATH_DIE2,10,NULL,NULL,&s_deathdie5};
-statetype s_deathdie5 = {false,SPR_DEATH_DIE3,10,NULL,NULL,&s_deathdie6};
-statetype s_deathdie6 = {false,SPR_DEATH_DIE4,10,NULL,NULL,&s_deathdie7};
-statetype s_deathdie7 = {false,SPR_DEATH_DIE5,10,NULL,NULL,&s_deathdie8};
-statetype s_deathdie8 = {false,SPR_DEATH_DIE6,10,NULL,NULL,&s_deathdie9};
-statetype s_deathdie9 = {false,SPR_DEATH_DEAD,0,NULL,NULL,&s_deathdie9};
-
-statetype s_deathshoot1 = {false,SPR_DEATH_SHOOT1,30,NULL,NULL,&s_deathshoot2};
-statetype s_deathshoot2 = {false,SPR_DEATH_SHOOT2,10,NULL,T_Launch,&s_deathshoot3};
-statetype s_deathshoot3 = {false,SPR_DEATH_SHOOT4,10,NULL,T_Shoot,&s_deathshoot4};
-statetype s_deathshoot4 = {false,SPR_DEATH_SHOOT3,10,NULL,T_Launch,&s_deathshoot5};
-statetype s_deathshoot5 = {false,SPR_DEATH_SHOOT4,10,NULL,T_Shoot,&s_deathchase1};
-
-
-/*
-===============
-=
-= SpawnDeath
-=
-===============
-*/
-
-void SpawnDeath (int tilex, int tiley)
-{
- unsigned far *map,tile;
-
- if (SoundBlasterPresent && DigiMode != sds_Off)
- s_deathdie2.tictime = 105;
-
- SpawnNewObj (tilex,tiley,&s_deathstand);
- new->obclass = deathobj;
- new->hitpoints = starthitpoints[gamestate.difficulty][en_death];
- new->flags |= FL_SHOOTABLE|FL_AMBUSH;
- if (!loadedgame)
- gamestate.killtotal++;
-}
-
-/*
-===============
-=
-= T_Launch
-=
-===============
-*/
-
-void T_Launch (objtype *ob)
-{
- long deltax,deltay;
- float angle;
- int iangle;
-
- deltax = player->x - ob->x;
- deltay = ob->y - player->y;
- angle = atan2 (deltay,deltax);
- if (angle<0)
- angle = M_PI*2+angle;
- iangle = angle/(M_PI*2)*ANGLES;
- if (ob->obclass == deathobj)
- {
- T_Shoot (ob);
- if (ob->state == &s_deathshoot2)
- {
- iangle-=4;
- if (iangle<0)
- iangle+=ANGLES;
- }
- else
- {
- iangle+=4;
- if (iangle>=ANGLES)
- iangle-=ANGLES;
- }
- }
-
- GetNewActor ();
- new->state = &s_rocket;
- new->ticcount = 1;
-
- new->tilex = ob->tilex;
- new->tiley = ob->tiley;
- new->x = ob->x;
- new->y = ob->y;
- new->obclass = rocketobj;
- switch(ob->obclass)
- {
- case deathobj:
- new->state = &s_hrocket;
- new->obclass = hrocketobj;
- PlaySoundLocActor (KNIGHTMISSILESND,new);
- break;
- case angelobj:
- new->state = &s_spark1;
- new->obclass = sparkobj;
- PlaySoundLocActor (ANGELFIRESND,new);
- break;
- default:
- PlaySoundLocActor (MISSILEFIRESND,new);
- }
-
- new->dir = nodir;
- new->angle = iangle;
- new->speed = 0x2000l;
- new->flags = FL_NONMARK;
- new->active = true;
-}
-
-
-
-//
-// angel
-//
-void A_Relaunch (objtype *ob);
-void A_Victory (objtype *ob);
-void A_StartAttack (objtype *ob);
-void A_Breathing (objtype *ob);
-
-extern statetype s_angelstand;
-
-extern statetype s_angelchase1;
-extern statetype s_angelchase1s;
-extern statetype s_angelchase2;
-extern statetype s_angelchase3;
-extern statetype s_angelchase3s;
-extern statetype s_angelchase4;
-
-extern statetype s_angeldie1;
-extern statetype s_angeldie11;
-extern statetype s_angeldie2;
-extern statetype s_angeldie3;
-extern statetype s_angeldie4;
-extern statetype s_angeldie5;
-extern statetype s_angeldie6;
-extern statetype s_angeldie7;
-extern statetype s_angeldie8;
-extern statetype s_angeldie9;
-
-extern statetype s_angelshoot1;
-extern statetype s_angelshoot2;
-extern statetype s_angelshoot3;
-extern statetype s_angelshoot4;
-extern statetype s_angelshoot5;
-extern statetype s_angelshoot6;
-
-extern statetype s_angeltired;
-extern statetype s_angeltired2;
-extern statetype s_angeltired3;
-extern statetype s_angeltired4;
-extern statetype s_angeltired5;
-extern statetype s_angeltired6;
-extern statetype s_angeltired7;
-
-extern statetype s_spark1;
-extern statetype s_spark2;
-extern statetype s_spark3;
-extern statetype s_spark4;
-
-
-statetype s_angelstand = {false,SPR_ANGEL_W1,0,T_Stand,NULL,&s_angelstand};
-
-statetype s_angelchase1 = {false,SPR_ANGEL_W1,10,T_Will,NULL,&s_angelchase1s};
-statetype s_angelchase1s = {false,SPR_ANGEL_W1,3,NULL,NULL,&s_angelchase2};
-statetype s_angelchase2 = {false,SPR_ANGEL_W2,8,T_Will,NULL,&s_angelchase3};
-statetype s_angelchase3 = {false,SPR_ANGEL_W3,10,T_Will,NULL,&s_angelchase3s};
-statetype s_angelchase3s = {false,SPR_ANGEL_W3,3,NULL,NULL,&s_angelchase4};
-statetype s_angelchase4 = {false,SPR_ANGEL_W4,8,T_Will,NULL,&s_angelchase1};
-
-statetype s_angeldie1 = {false,SPR_ANGEL_W1,1,NULL,A_DeathScream,&s_angeldie11};
-statetype s_angeldie11 = {false,SPR_ANGEL_W1,1,NULL,NULL,&s_angeldie2};
-statetype s_angeldie2 = {false,SPR_ANGEL_DIE1,10,NULL,A_Slurpie,&s_angeldie3};
-statetype s_angeldie3 = {false,SPR_ANGEL_DIE2,10,NULL,NULL,&s_angeldie4};
-statetype s_angeldie4 = {false,SPR_ANGEL_DIE3,10,NULL,NULL,&s_angeldie5};
-statetype s_angeldie5 = {false,SPR_ANGEL_DIE4,10,NULL,NULL,&s_angeldie6};
-statetype s_angeldie6 = {false,SPR_ANGEL_DIE5,10,NULL,NULL,&s_angeldie7};
-statetype s_angeldie7 = {false,SPR_ANGEL_DIE6,10,NULL,NULL,&s_angeldie8};
-statetype s_angeldie8 = {false,SPR_ANGEL_DIE7,10,NULL,NULL,&s_angeldie9};
-statetype s_angeldie9 = {false,SPR_ANGEL_DEAD,130,NULL,A_Victory,&s_angeldie9};
-
-statetype s_angelshoot1 = {false,SPR_ANGEL_SHOOT1,10,NULL,A_StartAttack,&s_angelshoot2};
-statetype s_angelshoot2 = {false,SPR_ANGEL_SHOOT2,20,NULL,T_Launch,&s_angelshoot3};
-statetype s_angelshoot3 = {false,SPR_ANGEL_SHOOT1,10,NULL,A_Relaunch,&s_angelshoot2};
-
-statetype s_angeltired = {false,SPR_ANGEL_TIRED1,40,NULL,A_Breathing,&s_angeltired2};
-statetype s_angeltired2 = {false,SPR_ANGEL_TIRED2,40,NULL,NULL,&s_angeltired3};
-statetype s_angeltired3 = {false,SPR_ANGEL_TIRED1,40,NULL,A_Breathing,&s_angeltired4};
-statetype s_angeltired4 = {false,SPR_ANGEL_TIRED2,40,NULL,NULL,&s_angeltired5};
-statetype s_angeltired5 = {false,SPR_ANGEL_TIRED1,40,NULL,A_Breathing,&s_angeltired6};
-statetype s_angeltired6 = {false,SPR_ANGEL_TIRED2,40,NULL,NULL,&s_angeltired7};
-statetype s_angeltired7 = {false,SPR_ANGEL_TIRED1,40,NULL,A_Breathing,&s_angelchase1};
-
-statetype s_spark1 = {false,SPR_SPARK1,6,T_Projectile,NULL,&s_spark2};
-statetype s_spark2 = {false,SPR_SPARK2,6,T_Projectile,NULL,&s_spark3};
-statetype s_spark3 = {false,SPR_SPARK3,6,T_Projectile,NULL,&s_spark4};
-statetype s_spark4 = {false,SPR_SPARK4,6,T_Projectile,NULL,&s_spark1};
-
-
-#pragma argsused
-void A_Slurpie (objtype *ob)
-{
- SD_PlaySound(SLURPIESND);
-}
-
-#pragma argsused
-void A_Breathing (objtype *ob)
-{
- SD_PlaySound(ANGELTIREDSND);
-}
-
-/*
-===============
-=
-= SpawnAngel
-=
-===============
-*/
-
-void SpawnAngel (int tilex, int tiley)
-{
- unsigned far *map,tile;
-
-
- if (SoundBlasterPresent && DigiMode != sds_Off)
- s_angeldie11.tictime = 105;
-
- SpawnNewObj (tilex,tiley,&s_angelstand);
- new->obclass = angelobj;
- new->hitpoints = starthitpoints[gamestate.difficulty][en_angel];
- new->flags |= FL_SHOOTABLE|FL_AMBUSH;
- if (!loadedgame)
- gamestate.killtotal++;
-}
-
-
-/*
-=================
-=
-= A_Victory
-=
-=================
-*/
-
-#pragma argsused
-void A_Victory (objtype *ob)
-{
- playstate = ex_victorious;
-}
-
-
-/*
-=================
-=
-= A_StartAttack
-=
-=================
-*/
-
-void A_StartAttack (objtype *ob)
-{
- ob->temp1 = 0;
-}
-
-
-/*
-=================
-=
-= A_Relaunch
-=
-=================
-*/
-
-void A_Relaunch (objtype *ob)
-{
- if (++ob->temp1 == 3)
- {
- NewState (ob,&s_angeltired);
- return;
- }
-
- if (US_RndT()&1)
- {
- NewState (ob,&s_angelchase1);
- return;
- }
-}
-
-
-
-
-//
-// spectre
-//
-void T_SpectreWait (objtype *ob);
-void A_Dormant (objtype *ob);
-
-extern statetype s_spectrewait1;
-extern statetype s_spectrewait2;
-extern statetype s_spectrewait3;
-extern statetype s_spectrewait4;
-
-extern statetype s_spectrechase1;
-extern statetype s_spectrechase2;
-extern statetype s_spectrechase3;
-extern statetype s_spectrechase4;
-
-extern statetype s_spectredie1;
-extern statetype s_spectredie2;
-extern statetype s_spectredie3;
-extern statetype s_spectredie4;
-
-extern statetype s_spectrewake;
-
-statetype s_spectrewait1 = {false,SPR_SPECTRE_W1,10,T_Stand,NULL,&s_spectrewait2};
-statetype s_spectrewait2 = {false,SPR_SPECTRE_W2,10,T_Stand,NULL,&s_spectrewait3};
-statetype s_spectrewait3 = {false,SPR_SPECTRE_W3,10,T_Stand,NULL,&s_spectrewait4};
-statetype s_spectrewait4 = {false,SPR_SPECTRE_W4,10,T_Stand,NULL,&s_spectrewait1};
-
-statetype s_spectrechase1 = {false,SPR_SPECTRE_W1,10,T_Ghosts,NULL,&s_spectrechase2};
-statetype s_spectrechase2 = {false,SPR_SPECTRE_W2,10,T_Ghosts,NULL,&s_spectrechase3};
-statetype s_spectrechase3 = {false,SPR_SPECTRE_W3,10,T_Ghosts,NULL,&s_spectrechase4};
-statetype s_spectrechase4 = {false,SPR_SPECTRE_W4,10,T_Ghosts,NULL,&s_spectrechase1};
-
-statetype s_spectredie1 = {false,SPR_SPECTRE_F1,10,NULL,NULL,&s_spectredie2};
-statetype s_spectredie2 = {false,SPR_SPECTRE_F2,10,NULL,NULL,&s_spectredie3};
-statetype s_spectredie3 = {false,SPR_SPECTRE_F3,10,NULL,NULL,&s_spectredie4};
-statetype s_spectredie4 = {false,SPR_SPECTRE_F4,300,NULL,NULL,&s_spectrewake};
-statetype s_spectrewake = {false,SPR_SPECTRE_F4,10,NULL,A_Dormant,&s_spectrewake};
-
-/*
-===============
-=
-= SpawnSpectre
-=
-===============
-*/
-
-void SpawnSpectre (int tilex, int tiley)
-{
- unsigned far *map,tile;
-
- SpawnNewObj (tilex,tiley,&s_spectrewait1);
- new->obclass = spectreobj;
- new->hitpoints = starthitpoints[gamestate.difficulty][en_spectre];
- new->flags |= FL_SHOOTABLE|FL_AMBUSH; // |FL_NEVERMARK|FL_NONMARK;
- if (!loadedgame)
- gamestate.killtotal++;
-}
-
-
-/*
-===============
-=
-= A_Dormant
-=
-===============
-*/
-
-void A_Dormant (objtype *ob)
-{
- long deltax,deltay;
- int xl,xh,yl,yh;
- int x,y;
- unsigned tile;
-
- deltax = ob->x - player->x;
- if (deltax < -MINACTORDIST || deltax > MINACTORDIST)
- goto moveok;
- deltay = ob->y - player->y;
- if (deltay < -MINACTORDIST || deltay > MINACTORDIST)
- goto moveok;
-
- return;
-moveok:
-
- xl = (ob->x-MINDIST) >> TILESHIFT;
- xh = (ob->x+MINDIST) >> TILESHIFT;
- yl = (ob->y-MINDIST) >> TILESHIFT;
- yh = (ob->y+MINDIST) >> TILESHIFT;
-
- for (y=yl ; y<=yh ; y++)
- for (x=xl ; x<=xh ; x++)
- {
- tile = actorat[x][y];
- if (!tile)
- continue;
- if (tile<256)
- return;
- if (((objtype *)tile)->flags&FL_SHOOTABLE)
- return;
- }
-
- ob->flags |= FL_AMBUSH | FL_SHOOTABLE;
- ob->flags &= ~FL_ATTACKMODE;
- ob->dir = nodir;
- NewState (ob,&s_spectrewait1);
-}
-
-
-#endif
-
-/*
-=============================================================================
-
- SCHABBS / GIFT / FAT
-
-=============================================================================
-*/
-
-#ifndef SPEAR
-/*
-===============
-=
-= SpawnGhosts
-=
-===============
-*/
-
-void SpawnGhosts (int which, int tilex, int tiley)
-{
- unsigned far *map,tile;
-
- switch(which)
- {
- case en_blinky:
- SpawnNewObj (tilex,tiley,&s_blinkychase1);
- break;
- case en_clyde:
- SpawnNewObj (tilex,tiley,&s_clydechase1);
- break;
- case en_pinky:
- SpawnNewObj (tilex,tiley,&s_pinkychase1);
- break;
- case en_inky:
- SpawnNewObj (tilex,tiley,&s_inkychase1);
- break;
- }
-
- new->obclass = ghostobj;
- new->speed = SPDDOG;
-
- new->dir = east;
- new->flags |= FL_AMBUSH;
- if (!loadedgame)
- gamestate.killtotal++;
-}
-
-
-
-void T_Gift (objtype *ob);
-void T_GiftThrow (objtype *ob);
-
-void T_Fat (objtype *ob);
-void T_FatThrow (objtype *ob);
-
-//
-// schabb
-//
-extern statetype s_schabbstand;
-
-extern statetype s_schabbchase1;
-extern statetype s_schabbchase1s;
-extern statetype s_schabbchase2;
-extern statetype s_schabbchase3;
-extern statetype s_schabbchase3s;
-extern statetype s_schabbchase4;
-
-extern statetype s_schabbdie1;
-extern statetype s_schabbdie2;
-extern statetype s_schabbdie3;
-extern statetype s_schabbdie4;
-extern statetype s_schabbdie5;
-extern statetype s_schabbdie6;
-
-extern statetype s_schabbshoot1;
-extern statetype s_schabbshoot2;
-
-extern statetype s_needle1;
-extern statetype s_needle2;
-extern statetype s_needle3;
-extern statetype s_needle4;
-
-extern statetype s_schabbdeathcam;
-
-
-statetype s_schabbstand = {false,SPR_SCHABB_W1,0,T_Stand,NULL,&s_schabbstand};
-
-statetype s_schabbchase1 = {false,SPR_SCHABB_W1,10,T_Schabb,NULL,&s_schabbchase1s};
-statetype s_schabbchase1s = {false,SPR_SCHABB_W1,3,NULL,NULL,&s_schabbchase2};
-statetype s_schabbchase2 = {false,SPR_SCHABB_W2,8,T_Schabb,NULL,&s_schabbchase3};
-statetype s_schabbchase3 = {false,SPR_SCHABB_W3,10,T_Schabb,NULL,&s_schabbchase3s};
-statetype s_schabbchase3s = {false,SPR_SCHABB_W3,3,NULL,NULL,&s_schabbchase4};
-statetype s_schabbchase4 = {false,SPR_SCHABB_W4,8,T_Schabb,NULL,&s_schabbchase1};
-
-statetype s_schabbdeathcam = {false,SPR_SCHABB_W1,1,NULL,NULL,&s_schabbdie1};
-
-statetype s_schabbdie1 = {false,SPR_SCHABB_W1,10,NULL,A_DeathScream,&s_schabbdie2};
-statetype s_schabbdie2 = {false,SPR_SCHABB_W1,10,NULL,NULL,&s_schabbdie3};
-statetype s_schabbdie3 = {false,SPR_SCHABB_DIE1,10,NULL,NULL,&s_schabbdie4};
-statetype s_schabbdie4 = {false,SPR_SCHABB_DIE2,10,NULL,NULL,&s_schabbdie5};
-statetype s_schabbdie5 = {false,SPR_SCHABB_DIE3,10,NULL,NULL,&s_schabbdie6};
-statetype s_schabbdie6 = {false,SPR_SCHABB_DEAD,20,NULL,A_StartDeathCam,&s_schabbdie6};
-
-statetype s_schabbshoot1 = {false,SPR_SCHABB_SHOOT1,30,NULL,NULL,&s_schabbshoot2};
-statetype s_schabbshoot2 = {false,SPR_SCHABB_SHOOT2,10,NULL,T_SchabbThrow,&s_schabbchase1};
-
-statetype s_needle1 = {false,SPR_HYPO1,6,T_Projectile,NULL,&s_needle2};
-statetype s_needle2 = {false,SPR_HYPO2,6,T_Projectile,NULL,&s_needle3};
-statetype s_needle3 = {false,SPR_HYPO3,6,T_Projectile,NULL,&s_needle4};
-statetype s_needle4 = {false,SPR_HYPO4,6,T_Projectile,NULL,&s_needle1};
-
-
-//
-// gift
-//
-extern statetype s_giftstand;
-
-extern statetype s_giftchase1;
-extern statetype s_giftchase1s;
-extern statetype s_giftchase2;
-extern statetype s_giftchase3;
-extern statetype s_giftchase3s;
-extern statetype s_giftchase4;
-
-extern statetype s_giftdie1;
-extern statetype s_giftdie2;
-extern statetype s_giftdie3;
-extern statetype s_giftdie4;
-extern statetype s_giftdie5;
-extern statetype s_giftdie6;
-
-extern statetype s_giftshoot1;
-extern statetype s_giftshoot2;
-
-extern statetype s_needle1;
-extern statetype s_needle2;
-extern statetype s_needle3;
-extern statetype s_needle4;
-
-extern statetype s_giftdeathcam;
-
-extern statetype s_boom1;
-extern statetype s_boom2;
-extern statetype s_boom3;
-
-
-statetype s_giftstand = {false,SPR_GIFT_W1,0,T_Stand,NULL,&s_giftstand};
-
-statetype s_giftchase1 = {false,SPR_GIFT_W1,10,T_Gift,NULL,&s_giftchase1s};
-statetype s_giftchase1s = {false,SPR_GIFT_W1,3,NULL,NULL,&s_giftchase2};
-statetype s_giftchase2 = {false,SPR_GIFT_W2,8,T_Gift,NULL,&s_giftchase3};
-statetype s_giftchase3 = {false,SPR_GIFT_W3,10,T_Gift,NULL,&s_giftchase3s};
-statetype s_giftchase3s = {false,SPR_GIFT_W3,3,NULL,NULL,&s_giftchase4};
-statetype s_giftchase4 = {false,SPR_GIFT_W4,8,T_Gift,NULL,&s_giftchase1};
-
-statetype s_giftdeathcam = {false,SPR_GIFT_W1,1,NULL,NULL,&s_giftdie1};
-
-statetype s_giftdie1 = {false,SPR_GIFT_W1,1,NULL,A_DeathScream,&s_giftdie2};
-statetype s_giftdie2 = {false,SPR_GIFT_W1,10,NULL,NULL,&s_giftdie3};
-statetype s_giftdie3 = {false,SPR_GIFT_DIE1,10,NULL,NULL,&s_giftdie4};
-statetype s_giftdie4 = {false,SPR_GIFT_DIE2,10,NULL,NULL,&s_giftdie5};
-statetype s_giftdie5 = {false,SPR_GIFT_DIE3,10,NULL,NULL,&s_giftdie6};
-statetype s_giftdie6 = {false,SPR_GIFT_DEAD,20,NULL,A_StartDeathCam,&s_giftdie6};
-
-statetype s_giftshoot1 = {false,SPR_GIFT_SHOOT1,30,NULL,NULL,&s_giftshoot2};
-statetype s_giftshoot2 = {false,SPR_GIFT_SHOOT2,10,NULL,T_GiftThrow,&s_giftchase1};
-
-
-//
-// fat
-//
-extern statetype s_fatstand;
-
-extern statetype s_fatchase1;
-extern statetype s_fatchase1s;
-extern statetype s_fatchase2;
-extern statetype s_fatchase3;
-extern statetype s_fatchase3s;
-extern statetype s_fatchase4;
-
-extern statetype s_fatdie1;
-extern statetype s_fatdie2;
-extern statetype s_fatdie3;
-extern statetype s_fatdie4;
-extern statetype s_fatdie5;
-extern statetype s_fatdie6;
-
-extern statetype s_fatshoot1;
-extern statetype s_fatshoot2;
-extern statetype s_fatshoot3;
-extern statetype s_fatshoot4;
-extern statetype s_fatshoot5;
-extern statetype s_fatshoot6;
-
-extern statetype s_needle1;
-extern statetype s_needle2;
-extern statetype s_needle3;
-extern statetype s_needle4;
-
-extern statetype s_fatdeathcam;
-
-
-statetype s_fatstand = {false,SPR_FAT_W1,0,T_Stand,NULL,&s_fatstand};
-
-statetype s_fatchase1 = {false,SPR_FAT_W1,10,T_Fat,NULL,&s_fatchase1s};
-statetype s_fatchase1s = {false,SPR_FAT_W1,3,NULL,NULL,&s_fatchase2};
-statetype s_fatchase2 = {false,SPR_FAT_W2,8,T_Fat,NULL,&s_fatchase3};
-statetype s_fatchase3 = {false,SPR_FAT_W3,10,T_Fat,NULL,&s_fatchase3s};
-statetype s_fatchase3s = {false,SPR_FAT_W3,3,NULL,NULL,&s_fatchase4};
-statetype s_fatchase4 = {false,SPR_FAT_W4,8,T_Fat,NULL,&s_fatchase1};
-
-statetype s_fatdeathcam = {false,SPR_FAT_W1,1,NULL,NULL,&s_fatdie1};
-
-statetype s_fatdie1 = {false,SPR_FAT_W1,1,NULL,A_DeathScream,&s_fatdie2};
-statetype s_fatdie2 = {false,SPR_FAT_W1,10,NULL,NULL,&s_fatdie3};
-statetype s_fatdie3 = {false,SPR_FAT_DIE1,10,NULL,NULL,&s_fatdie4};
-statetype s_fatdie4 = {false,SPR_FAT_DIE2,10,NULL,NULL,&s_fatdie5};
-statetype s_fatdie5 = {false,SPR_FAT_DIE3,10,NULL,NULL,&s_fatdie6};
-statetype s_fatdie6 = {false,SPR_FAT_DEAD,20,NULL,A_StartDeathCam,&s_fatdie6};
-
-statetype s_fatshoot1 = {false,SPR_FAT_SHOOT1,30,NULL,NULL,&s_fatshoot2};
-statetype s_fatshoot2 = {false,SPR_FAT_SHOOT2,10,NULL,T_GiftThrow,&s_fatshoot3};
-statetype s_fatshoot3 = {false,SPR_FAT_SHOOT3,10,NULL,T_Shoot,&s_fatshoot4};
-statetype s_fatshoot4 = {false,SPR_FAT_SHOOT4,10,NULL,T_Shoot,&s_fatshoot5};
-statetype s_fatshoot5 = {false,SPR_FAT_SHOOT3,10,NULL,T_Shoot,&s_fatshoot6};
-statetype s_fatshoot6 = {false,SPR_FAT_SHOOT4,10,NULL,T_Shoot,&s_fatchase1};
-
-
-/*
-===============
-=
-= SpawnSchabbs
-=
-===============
-*/
-
-void SpawnSchabbs (int tilex, int tiley)
-{
- unsigned far *map,tile;
-
- if (DigiMode != sds_Off)
- s_schabbdie2.tictime = 140;
- else
- s_schabbdie2.tictime = 5;
-
- SpawnNewObj (tilex,tiley,&s_schabbstand);
- new->speed = SPDPATROL;
-
- new->obclass = schabbobj;
- new->hitpoints = starthitpoints[gamestate.difficulty][en_schabbs];
- new->dir = south;
- new->flags |= FL_SHOOTABLE|FL_AMBUSH;
- if (!loadedgame)
- gamestate.killtotal++;
-}
-
-
-/*
-===============
-=
-= SpawnGift
-=
-===============
-*/
-
-void SpawnGift (int tilex, int tiley)
-{
- unsigned far *map,tile;
-
- if (DigiMode != sds_Off)
- s_giftdie2.tictime = 140;
- else
- s_giftdie2.tictime = 5;
-
- SpawnNewObj (tilex,tiley,&s_giftstand);
- new->speed = SPDPATROL;
-
- new->obclass = giftobj;
- new->hitpoints = starthitpoints[gamestate.difficulty][en_gift];
- new->dir = north;
- new->flags |= FL_SHOOTABLE|FL_AMBUSH;
- if (!loadedgame)
- gamestate.killtotal++;
-}
-
-
-/*
-===============
-=
-= SpawnFat
-=
-===============
-*/
-
-void SpawnFat (int tilex, int tiley)
-{
- unsigned far *map,tile;
-
- if (DigiMode != sds_Off)
- s_fatdie2.tictime = 140;
- else
- s_fatdie2.tictime = 5;
-
- SpawnNewObj (tilex,tiley,&s_fatstand);
- new->speed = SPDPATROL;
-
- new->obclass = fatobj;
- new->hitpoints = starthitpoints[gamestate.difficulty][en_fat];
- new->dir = south;
- new->flags |= FL_SHOOTABLE|FL_AMBUSH;
- if (!loadedgame)
- gamestate.killtotal++;
-}
-
-
-/*
-=================
-=
-= T_SchabbThrow
-=
-=================
-*/
-
-void T_SchabbThrow (objtype *ob)
-{
- long deltax,deltay;
- float angle;
- int iangle;
-
- deltax = player->x - ob->x;
- deltay = ob->y - player->y;
- angle = atan2 (deltay,deltax);
- if (angle<0)
- angle = M_PI*2+angle;
- iangle = angle/(M_PI*2)*ANGLES;
-
- GetNewActor ();
- new->state = &s_needle1;
- new->ticcount = 1;
-
- new->tilex = ob->tilex;
- new->tiley = ob->tiley;
- new->x = ob->x;
- new->y = ob->y;
- new->obclass = needleobj;
- new->dir = nodir;
- new->angle = iangle;
- new->speed = 0x2000l;
-
- new->flags = FL_NONMARK;
- new->active = true;
-
- PlaySoundLocActor (SCHABBSTHROWSND,new);
-}
-
-/*
-=================
-=
-= T_GiftThrow
-=
-=================
-*/
-
-void T_GiftThrow (objtype *ob)
-{
- long deltax,deltay;
- float angle;
- int iangle;
-
- deltax = player->x - ob->x;
- deltay = ob->y - player->y;
- angle = atan2 (deltay,deltax);
- if (angle<0)
- angle = M_PI*2+angle;
- iangle = angle/(M_PI*2)*ANGLES;
-
- GetNewActor ();
- new->state = &s_rocket;
- new->ticcount = 1;
-
- new->tilex = ob->tilex;
- new->tiley = ob->tiley;
- new->x = ob->x;
- new->y = ob->y;
- new->obclass = rocketobj;
- new->dir = nodir;
- new->angle = iangle;
- new->speed = 0x2000l;
- new->flags = FL_NONMARK;
- new->active = true;
-
- PlaySoundLocActor (MISSILEFIRESND,new);
-}
-
-
-
-/*
-=================
-=
-= T_Schabb
-=
-=================
-*/
-
-void T_Schabb (objtype *ob)
-{
- long move;
- int dx,dy,dist;
- boolean dodge;
-
- dodge = false;
- dx = abs(ob->tilex - player->tilex);
- dy = abs(ob->tiley - player->tiley);
- dist = dx>dy ? dx : dy;
-
- if (CheckLine(ob)) // got a shot at player?
- {
-
- if ( US_RndT() < (tics<<3) )
- {
- //
- // go into attack frame
- //
- NewState (ob,&s_schabbshoot1);
- return;
- }
- dodge = true;
- }
-
- if (ob->dir == nodir)
- {
- if (dodge)
- SelectDodgeDir (ob);
- else
- SelectChaseDir (ob);
- if (ob->dir == nodir)
- return; // object is blocked in
- }
-
- move = ob->speed*tics;
-
- while (move)
- {
- if (ob->distance < 0)
- {
- //
- // waiting for a door to open
- //
- OpenDoor (-ob->distance-1);
- if (doorobjlist[-ob->distance-1].action != dr_open)
- return;
- ob->distance = TILEGLOBAL; // go ahead, the door is now opoen
- }
-
- if (move < ob->distance)
- {
- MoveObj (ob,move);
- break;
- }
-
- //
- // reached goal tile, so select another one
- //
-
- //
- // fix position to account for round off during moving
- //
- ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
- ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
-
- move -= ob->distance;
-
- if (dist <4)
- SelectRunDir (ob);
- else if (dodge)
- SelectDodgeDir (ob);
- else
- SelectChaseDir (ob);
-
- if (ob->dir == nodir)
- return; // object is blocked in
- }
-
-}
-
-
-
-
-/*
-=================
-=
-= T_Gift
-=
-=================
-*/
-
-void T_Gift (objtype *ob)
-{
- long move;
- int dx,dy,dist;
- boolean dodge;
-
- dodge = false;
- dx = abs(ob->tilex - player->tilex);
- dy = abs(ob->tiley - player->tiley);
- dist = dx>dy ? dx : dy;
-
- if (CheckLine(ob)) // got a shot at player?
- {
-
- if ( US_RndT() < (tics<<3) )
- {
- //
- // go into attack frame
- //
- NewState (ob,&s_giftshoot1);
- return;
- }
- dodge = true;
- }
-
- if (ob->dir == nodir)
- {
- if (dodge)
- SelectDodgeDir (ob);
- else
- SelectChaseDir (ob);
- if (ob->dir == nodir)
- return; // object is blocked in
- }
-
- move = ob->speed*tics;
-
- while (move)
- {
- if (ob->distance < 0)
- {
- //
- // waiting for a door to open
- //
- OpenDoor (-ob->distance-1);
- if (doorobjlist[-ob->distance-1].action != dr_open)
- return;
- ob->distance = TILEGLOBAL; // go ahead, the door is now opoen
- }
-
- if (move < ob->distance)
- {
- MoveObj (ob,move);
- break;
- }
-
- //
- // reached goal tile, so select another one
- //
-
- //
- // fix position to account for round off during moving
- //
- ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
- ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
-
- move -= ob->distance;
-
- if (dist <4)
- SelectRunDir (ob);
- else if (dodge)
- SelectDodgeDir (ob);
- else
- SelectChaseDir (ob);
-
- if (ob->dir == nodir)
- return; // object is blocked in
- }
-
-}
-
-
-
-
-/*
-=================
-=
-= T_Fat
-=
-=================
-*/
-
-void T_Fat (objtype *ob)
-{
- long move;
- int dx,dy,dist;
- boolean dodge;
-
- dodge = false;
- dx = abs(ob->tilex - player->tilex);
- dy = abs(ob->tiley - player->tiley);
- dist = dx>dy ? dx : dy;
-
- if (CheckLine(ob)) // got a shot at player?
- {
-
- if ( US_RndT() < (tics<<3) )
- {
- //
- // go into attack frame
- //
- NewState (ob,&s_fatshoot1);
- return;
- }
- dodge = true;
- }
-
- if (ob->dir == nodir)
- {
- if (dodge)
- SelectDodgeDir (ob);
- else
- SelectChaseDir (ob);
- if (ob->dir == nodir)
- return; // object is blocked in
- }
-
- move = ob->speed*tics;
-
- while (move)
- {
- if (ob->distance < 0)
- {
- //
- // waiting for a door to open
- //
- OpenDoor (-ob->distance-1);
- if (doorobjlist[-ob->distance-1].action != dr_open)
- return;
- ob->distance = TILEGLOBAL; // go ahead, the door is now opoen
- }
-
- if (move < ob->distance)
- {
- MoveObj (ob,move);
- break;
- }
-
- //
- // reached goal tile, so select another one
- //
-
- //
- // fix position to account for round off during moving
- //
- ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
- ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
-
- move -= ob->distance;
-
- if (dist <4)
- SelectRunDir (ob);
- else if (dodge)
- SelectDodgeDir (ob);
- else
- SelectChaseDir (ob);
-
- if (ob->dir == nodir)
- return; // object is blocked in
- }
-
-}
-
-
-
-/*
-=============================================================================
-
- HITLERS
-
-=============================================================================
-*/
-
-
-//
-// fake
-//
-extern statetype s_fakestand;
-
-extern statetype s_fakechase1;
-extern statetype s_fakechase1s;
-extern statetype s_fakechase2;
-extern statetype s_fakechase3;
-extern statetype s_fakechase3s;
-extern statetype s_fakechase4;
-
-extern statetype s_fakedie1;
-extern statetype s_fakedie2;
-extern statetype s_fakedie3;
-extern statetype s_fakedie4;
-extern statetype s_fakedie5;
-extern statetype s_fakedie6;
-
-extern statetype s_fakeshoot1;
-extern statetype s_fakeshoot2;
-extern statetype s_fakeshoot3;
-extern statetype s_fakeshoot4;
-extern statetype s_fakeshoot5;
-extern statetype s_fakeshoot6;
-extern statetype s_fakeshoot7;
-extern statetype s_fakeshoot8;
-extern statetype s_fakeshoot9;
-
-extern statetype s_fire1;
-extern statetype s_fire2;
-
-statetype s_fakestand = {false,SPR_FAKE_W1,0,T_Stand,NULL,&s_fakestand};
-
-statetype s_fakechase1 = {false,SPR_FAKE_W1,10,T_Fake,NULL,&s_fakechase1s};
-statetype s_fakechase1s = {false,SPR_FAKE_W1,3,NULL,NULL,&s_fakechase2};
-statetype s_fakechase2 = {false,SPR_FAKE_W2,8,T_Fake,NULL,&s_fakechase3};
-statetype s_fakechase3 = {false,SPR_FAKE_W3,10,T_Fake,NULL,&s_fakechase3s};
-statetype s_fakechase3s = {false,SPR_FAKE_W3,3,NULL,NULL,&s_fakechase4};
-statetype s_fakechase4 = {false,SPR_FAKE_W4,8,T_Fake,NULL,&s_fakechase1};
-
-statetype s_fakedie1 = {false,SPR_FAKE_DIE1,10,NULL,A_DeathScream,&s_fakedie2};
-statetype s_fakedie2 = {false,SPR_FAKE_DIE2,10,NULL,NULL,&s_fakedie3};
-statetype s_fakedie3 = {false,SPR_FAKE_DIE3,10,NULL,NULL,&s_fakedie4};
-statetype s_fakedie4 = {false,SPR_FAKE_DIE4,10,NULL,NULL,&s_fakedie5};
-statetype s_fakedie5 = {false,SPR_FAKE_DIE5,10,NULL,NULL,&s_fakedie6};
-statetype s_fakedie6 = {false,SPR_FAKE_DEAD,0,NULL,NULL,&s_fakedie6};
-
-statetype s_fakeshoot1 = {false,SPR_FAKE_SHOOT,8,NULL,T_FakeFire,&s_fakeshoot2};
-statetype s_fakeshoot2 = {false,SPR_FAKE_SHOOT,8,NULL,T_FakeFire,&s_fakeshoot3};
-statetype s_fakeshoot3 = {false,SPR_FAKE_SHOOT,8,NULL,T_FakeFire,&s_fakeshoot4};
-statetype s_fakeshoot4 = {false,SPR_FAKE_SHOOT,8,NULL,T_FakeFire,&s_fakeshoot5};
-statetype s_fakeshoot5 = {false,SPR_FAKE_SHOOT,8,NULL,T_FakeFire,&s_fakeshoot6};
-statetype s_fakeshoot6 = {false,SPR_FAKE_SHOOT,8,NULL,T_FakeFire,&s_fakeshoot7};
-statetype s_fakeshoot7 = {false,SPR_FAKE_SHOOT,8,NULL,T_FakeFire,&s_fakeshoot8};
-statetype s_fakeshoot8 = {false,SPR_FAKE_SHOOT,8,NULL,T_FakeFire,&s_fakeshoot9};
-statetype s_fakeshoot9 = {false,SPR_FAKE_SHOOT,8,NULL,NULL,&s_fakechase1};
-
-statetype s_fire1 = {false,SPR_FIRE1,6,NULL,T_Projectile,&s_fire2};
-statetype s_fire2 = {false,SPR_FIRE2,6,NULL,T_Projectile,&s_fire1};
-
-//
-// hitler
-//
-extern statetype s_mechachase1;
-extern statetype s_mechachase1s;
-extern statetype s_mechachase2;
-extern statetype s_mechachase3;
-extern statetype s_mechachase3s;
-extern statetype s_mechachase4;
-
-extern statetype s_mechadie1;
-extern statetype s_mechadie2;
-extern statetype s_mechadie3;
-extern statetype s_mechadie4;
-
-extern statetype s_mechashoot1;
-extern statetype s_mechashoot2;
-extern statetype s_mechashoot3;
-extern statetype s_mechashoot4;
-extern statetype s_mechashoot5;
-extern statetype s_mechashoot6;
-
-
-extern statetype s_hitlerchase1;
-extern statetype s_hitlerchase1s;
-extern statetype s_hitlerchase2;
-extern statetype s_hitlerchase3;
-extern statetype s_hitlerchase3s;
-extern statetype s_hitlerchase4;
-
-extern statetype s_hitlerdie1;
-extern statetype s_hitlerdie2;
-extern statetype s_hitlerdie3;
-extern statetype s_hitlerdie4;
-extern statetype s_hitlerdie5;
-extern statetype s_hitlerdie6;
-extern statetype s_hitlerdie7;
-extern statetype s_hitlerdie8;
-extern statetype s_hitlerdie9;
-extern statetype s_hitlerdie10;
-
-extern statetype s_hitlershoot1;
-extern statetype s_hitlershoot2;
-extern statetype s_hitlershoot3;
-extern statetype s_hitlershoot4;
-extern statetype s_hitlershoot5;
-extern statetype s_hitlershoot6;
-
-extern statetype s_hitlerdeathcam;
-
-statetype s_mechastand = {false,SPR_MECHA_W1,0,T_Stand,NULL,&s_mechastand};
-
-statetype s_mechachase1 = {false,SPR_MECHA_W1,10,T_Chase,A_MechaSound,&s_mechachase1s};
-statetype s_mechachase1s = {false,SPR_MECHA_W1,6,NULL,NULL,&s_mechachase2};
-statetype s_mechachase2 = {false,SPR_MECHA_W2,8,T_Chase,NULL,&s_mechachase3};
-statetype s_mechachase3 = {false,SPR_MECHA_W3,10,T_Chase,A_MechaSound,&s_mechachase3s};
-statetype s_mechachase3s = {false,SPR_MECHA_W3,6,NULL,NULL,&s_mechachase4};
-statetype s_mechachase4 = {false,SPR_MECHA_W4,8,T_Chase,NULL,&s_mechachase1};
-
-statetype s_mechadie1 = {false,SPR_MECHA_DIE1,10,NULL,A_DeathScream,&s_mechadie2};
-statetype s_mechadie2 = {false,SPR_MECHA_DIE2,10,NULL,NULL,&s_mechadie3};
-statetype s_mechadie3 = {false,SPR_MECHA_DIE3,10,NULL,A_HitlerMorph,&s_mechadie4};
-statetype s_mechadie4 = {false,SPR_MECHA_DEAD,0,NULL,NULL,&s_mechadie4};
-
-statetype s_mechashoot1 = {false,SPR_MECHA_SHOOT1,30,NULL,NULL,&s_mechashoot2};
-statetype s_mechashoot2 = {false,SPR_MECHA_SHOOT2,10,NULL,T_Shoot,&s_mechashoot3};
-statetype s_mechashoot3 = {false,SPR_MECHA_SHOOT3,10,NULL,T_Shoot,&s_mechashoot4};
-statetype s_mechashoot4 = {false,SPR_MECHA_SHOOT2,10,NULL,T_Shoot,&s_mechashoot5};
-statetype s_mechashoot5 = {false,SPR_MECHA_SHOOT3,10,NULL,T_Shoot,&s_mechashoot6};
-statetype s_mechashoot6 = {false,SPR_MECHA_SHOOT2,10,NULL,T_Shoot,&s_mechachase1};
-
-
-statetype s_hitlerchase1 = {false,SPR_HITLER_W1,6,T_Chase,NULL,&s_hitlerchase1s};
-statetype s_hitlerchase1s = {false,SPR_HITLER_W1,4,NULL,NULL,&s_hitlerchase2};
-statetype s_hitlerchase2 = {false,SPR_HITLER_W2,2,T_Chase,NULL,&s_hitlerchase3};
-statetype s_hitlerchase3 = {false,SPR_HITLER_W3,6,T_Chase,NULL,&s_hitlerchase3s};
-statetype s_hitlerchase3s = {false,SPR_HITLER_W3,4,NULL,NULL,&s_hitlerchase4};
-statetype s_hitlerchase4 = {false,SPR_HITLER_W4,2,T_Chase,NULL,&s_hitlerchase1};
-
-statetype s_hitlerdeathcam = {false,SPR_HITLER_W1,10,NULL,NULL,&s_hitlerdie1};
-
-statetype s_hitlerdie1 = {false,SPR_HITLER_W1,1,NULL,A_DeathScream,&s_hitlerdie2};
-statetype s_hitlerdie2 = {false,SPR_HITLER_W1,10,NULL,NULL,&s_hitlerdie3};
-statetype s_hitlerdie3 = {false,SPR_HITLER_DIE1,10,NULL,A_Slurpie,&s_hitlerdie4};
-statetype s_hitlerdie4 = {false,SPR_HITLER_DIE2,10,NULL,NULL,&s_hitlerdie5};
-statetype s_hitlerdie5 = {false,SPR_HITLER_DIE3,10,NULL,NULL,&s_hitlerdie6};
-statetype s_hitlerdie6 = {false,SPR_HITLER_DIE4,10,NULL,NULL,&s_hitlerdie7};
-statetype s_hitlerdie7 = {false,SPR_HITLER_DIE5,10,NULL,NULL,&s_hitlerdie8};
-statetype s_hitlerdie8 = {false,SPR_HITLER_DIE6,10,NULL,NULL,&s_hitlerdie9};
-statetype s_hitlerdie9 = {false,SPR_HITLER_DIE7,10,NULL,NULL,&s_hitlerdie10};
-statetype s_hitlerdie10 = {false,SPR_HITLER_DEAD,20,NULL,A_StartDeathCam,&s_hitlerdie10};
-
-statetype s_hitlershoot1 = {false,SPR_HITLER_SHOOT1,30,NULL,NULL,&s_hitlershoot2};
-statetype s_hitlershoot2 = {false,SPR_HITLER_SHOOT2,10,NULL,T_Shoot,&s_hitlershoot3};
-statetype s_hitlershoot3 = {false,SPR_HITLER_SHOOT3,10,NULL,T_Shoot,&s_hitlershoot4};
-statetype s_hitlershoot4 = {false,SPR_HITLER_SHOOT2,10,NULL,T_Shoot,&s_hitlershoot5};
-statetype s_hitlershoot5 = {false,SPR_HITLER_SHOOT3,10,NULL,T_Shoot,&s_hitlershoot6};
-statetype s_hitlershoot6 = {false,SPR_HITLER_SHOOT2,10,NULL,T_Shoot,&s_hitlerchase1};
-
-
-
-/*
-===============
-=
-= SpawnFakeHitler
-=
-===============
-*/
-
-void SpawnFakeHitler (int tilex, int tiley)
-{
- unsigned far *map,tile;
-
-
- if (DigiMode != sds_Off)
- s_hitlerdie2.tictime = 140;
- else
- s_hitlerdie2.tictime = 5;
-
- SpawnNewObj (tilex,tiley,&s_fakestand);
- new->speed = SPDPATROL;
-
- new->obclass = fakeobj;
- new->hitpoints = starthitpoints[gamestate.difficulty][en_fake];
- new->dir = north;
- new->flags |= FL_SHOOTABLE|FL_AMBUSH;
- if (!loadedgame)
- gamestate.killtotal++;
-}
-
-
-/*
-===============
-=
-= SpawnHitler
-=
-===============
-*/
-
-void SpawnHitler (int tilex, int tiley)
-{
- unsigned far *map,tile;
-
- if (DigiMode != sds_Off)
- s_hitlerdie2.tictime = 140;
- else
- s_hitlerdie2.tictime = 5;
-
-
- SpawnNewObj (tilex,tiley,&s_mechastand);
- new->speed = SPDPATROL;
-
- new->obclass = mechahitlerobj;
- new->hitpoints = starthitpoints[gamestate.difficulty][en_hitler];
- new->dir = south;
- new->flags |= FL_SHOOTABLE|FL_AMBUSH;
- if (!loadedgame)
- gamestate.killtotal++;
-}
-
-
-/*
-===============
-=
-= A_HitlerMorph
-=
-===============
-*/
-
-void A_HitlerMorph (objtype *ob)
-{
- unsigned far *map,tile,hitpoints[4]={500,700,800,900};
-
-
- SpawnNewObj (ob->tilex,ob->tiley,&s_hitlerchase1);
- new->speed = SPDPATROL*5;
-
- new->x = ob->x;
- new->y = ob->y;
-
- new->distance = ob->distance;
- new->dir = ob->dir;
- new->flags = ob->flags | FL_SHOOTABLE;
-
- new->obclass = realhitlerobj;
- new->hitpoints = hitpoints[gamestate.difficulty];
-}
-
-
-////////////////////////////////////////////////////////
-//
-// A_MechaSound
-// A_Slurpie
-//
-////////////////////////////////////////////////////////
-void A_MechaSound (objtype *ob)
-{
- if (areabyplayer[ob->areanumber])
- PlaySoundLocActor (MECHSTEPSND,ob);
-}
-
-
-#pragma argsused
-void A_Slurpie (objtype *ob)
-{
- SD_PlaySound(SLURPIESND);
-}
-
-/*
-=================
-=
-= T_FakeFire
-=
-=================
-*/
-
-void T_FakeFire (objtype *ob)
-{
- long deltax,deltay;
- float angle;
- int iangle;
-
- deltax = player->x - ob->x;
- deltay = ob->y - player->y;
- angle = atan2 (deltay,deltax);
- if (angle<0)
- angle = M_PI*2+angle;
- iangle = angle/(M_PI*2)*ANGLES;
-
- GetNewActor ();
- new->state = &s_fire1;
- new->ticcount = 1;
-
- new->tilex = ob->tilex;
- new->tiley = ob->tiley;
- new->x = ob->x;
- new->y = ob->y;
- new->dir = nodir;
- new->angle = iangle;
- new->obclass = fireobj;
- new->speed = 0x1200l;
- new->flags = FL_NEVERMARK;
- new->active = true;
-
- PlaySoundLocActor (FLAMETHROWERSND,new);
-}
-
-
-
-/*
-=================
-=
-= T_Fake
-=
-=================
-*/
-
-void T_Fake (objtype *ob)
-{
- long move;
- int dx,dy,dist;
- boolean dodge;
-
- if (CheckLine(ob)) // got a shot at player?
- {
- if ( US_RndT() < (tics<<1) )
- {
- //
- // go into attack frame
- //
- NewState (ob,&s_fakeshoot1);
- return;
- }
- }
-
- if (ob->dir == nodir)
- {
- SelectDodgeDir (ob);
- if (ob->dir == nodir)
- return; // object is blocked in
- }
-
- move = ob->speed*tics;
-
- while (move)
- {
- if (move < ob->distance)
- {
- MoveObj (ob,move);
- break;
- }
-
- //
- // reached goal tile, so select another one
- //
-
- //
- // fix position to account for round off during moving
- //
- ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
- ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
-
- move -= ob->distance;
-
- SelectDodgeDir (ob);
-
- if (ob->dir == nodir)
- return; // object is blocked in
- }
-
-}
-
-#endif
-/*
-============================================================================
-
- STAND
-
-============================================================================
-*/
-
-
-/*
-===============
-=
-= T_Stand
-=
-===============
-*/
-
-void T_Stand (objtype *ob)
-{
- SightPlayer (ob);
-}
-
-
-/*
-============================================================================
-
- CHASE
-
-============================================================================
-*/
-
-/*
-=================
-=
-= T_Chase
-=
-=================
-*/
-
-void T_Chase (objtype *ob)
-{
- long move;
- int dx,dy,dist,chance;
- boolean dodge;
-
- if (gamestate.victoryflag)
- return;
-
- dodge = false;
- if (CheckLine(ob)) // got a shot at player?
- {
- dx = abs(ob->tilex - player->tilex);
- dy = abs(ob->tiley - player->tiley);
- dist = dx>dy ? dx : dy;
- if (!dist || (dist==1 && ob->distance<0x4000) )
- chance = 300;
- else
- chance = (tics<<4)/dist;
-
- if ( US_RndT()<chance)
- {
- //
- // go into attack frame
- //
- switch (ob->obclass)
- {
- case guardobj:
- NewState (ob,&s_grdshoot1);
- break;
- case officerobj:
- NewState (ob,&s_ofcshoot1);
- break;
- case mutantobj:
- NewState (ob,&s_mutshoot1);
- break;
- case ssobj:
- NewState (ob,&s_ssshoot1);
- break;
-#ifndef SPEAR
- case bossobj:
- NewState (ob,&s_bossshoot1);
- break;
- case gretelobj:
- NewState (ob,&s_gretelshoot1);
- break;
- case mechahitlerobj:
- NewState (ob,&s_mechashoot1);
- break;
- case realhitlerobj:
- NewState (ob,&s_hitlershoot1);
- break;
-#else
- case angelobj:
- NewState (ob,&s_angelshoot1);
- break;
- case transobj:
- NewState (ob,&s_transshoot1);
- break;
- case uberobj:
- NewState (ob,&s_ubershoot1);
- break;
- case willobj:
- NewState (ob,&s_willshoot1);
- break;
- case deathobj:
- NewState (ob,&s_deathshoot1);
- break;
-#endif
- }
- return;
- }
- dodge = true;
- }
-
- if (ob->dir == nodir)
- {
- if (dodge)
- SelectDodgeDir (ob);
- else
- SelectChaseDir (ob);
- if (ob->dir == nodir)
- return; // object is blocked in
- }
-
- move = ob->speed*tics;
-
- while (move)
- {
- if (ob->distance < 0)
- {
- //
- // waiting for a door to open
- //
- OpenDoor (-ob->distance-1);
- if (doorobjlist[-ob->distance-1].action != dr_open)
- return;
- ob->distance = TILEGLOBAL; // go ahead, the door is now opoen
- }
-
- if (move < ob->distance)
- {
- MoveObj (ob,move);
- break;
- }
-
- //
- // reached goal tile, so select another one
- //
-
- //
- // fix position to account for round off during moving
- //
- ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
- ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
-
- move -= ob->distance;
-
- if (dodge)
- SelectDodgeDir (ob);
- else
- SelectChaseDir (ob);
-
- if (ob->dir == nodir)
- return; // object is blocked in
- }
-
-}
-
-
-/*
-=================
-=
-= T_Ghosts
-=
-=================
-*/
-
-void T_Ghosts (objtype *ob)
-{
- long move;
-
-
- if (ob->dir == nodir)
- {
- SelectChaseDir (ob);
- if (ob->dir == nodir)
- return; // object is blocked in
- }
-
- move = ob->speed*tics;
-
- while (move)
- {
- if (move < ob->distance)
- {
- MoveObj (ob,move);
- break;
- }
-
- //
- // reached goal tile, so select another one
- //
-
- //
- // fix position to account for round off during moving
- //
- ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
- ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
-
- move -= ob->distance;
-
- SelectChaseDir (ob);
-
- if (ob->dir == nodir)
- return; // object is blocked in
- }
-
-}
-
-/*
-=================
-=
-= T_DogChase
-=
-=================
-*/
-
-void T_DogChase (objtype *ob)
-{
- long move;
- int dist,chance;
- long dx,dy;
-
-
- if (ob->dir == nodir)
- {
- SelectDodgeDir (ob);
- if (ob->dir == nodir)
- return; // object is blocked in
- }
-
- move = ob->speed*tics;
-
- while (move)
- {
- //
- // check for byte range
- //
- dx = player->x - ob->x;
- if (dx<0)
- dx = -dx;
- dx -= move;
- if (dx <= MINACTORDIST)
- {
- dy = player->y - ob->y;
- if (dy<0)
- dy = -dy;
- dy -= move;
- if (dy <= MINACTORDIST)
- {
- NewState (ob,&s_dogjump1);
- return;
- }
- }
-
- if (move < ob->distance)
- {
- MoveObj (ob,move);
- break;
- }
-
- //
- // reached goal tile, so select another one
- //
-
- //
- // fix position to account for round off during moving
- //
- ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
- ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
-
- move -= ob->distance;
-
- SelectDodgeDir (ob);
-
- if (ob->dir == nodir)
- return; // object is blocked in
- }
-
-}
-
-
-
-/*
-============================================================================
-
- PATH
-
-============================================================================
-*/
-
-
-/*
-===============
-=
-= SelectPathDir
-=
-===============
-*/
-
-void SelectPathDir (objtype *ob)
-{
- unsigned spot;
-
- spot = MAPSPOT(ob->tilex,ob->tiley,1)-ICONARROWS;
-
- if (spot<8)
- {
- // new direction
- ob->dir = spot;
- }
-
- ob->distance = TILEGLOBAL;
-
- if (!TryWalk (ob))
- ob->dir = nodir;
-}
-
-
-/*
-===============
-=
-= T_Path
-=
-===============
-*/
-
-void T_Path (objtype *ob)
-{
- long move;
- long deltax,deltay,size;
-
- if (SightPlayer (ob))
- return;
-
- if (ob->dir == nodir)
- {
- SelectPathDir (ob);
- if (ob->dir == nodir)
- return; // all movement is blocked
- }
-
-
- move = ob->speed*tics;
-
- while (move)
- {
- if (ob->distance < 0)
- {
- //
- // waiting for a door to open
- //
- OpenDoor (-ob->distance-1);
- if (doorobjlist[-ob->distance-1].action != dr_open)
- return;
- ob->distance = TILEGLOBAL; // go ahead, the door is now opoen
- }
-
- if (move < ob->distance)
- {
- MoveObj (ob,move);
- break;
- }
-
- if (ob->tilex>MAPSIZE || ob->tiley>MAPSIZE)
- {
- sprintf (str,"T_Path hit a wall at %u,%u, dir %u"
- ,ob->tilex,ob->tiley,ob->dir);
- Quit (str);
- }
-
-
-
- ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
- ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
- move -= ob->distance;
-
- SelectPathDir (ob);
-
- if (ob->dir == nodir)
- return; // all movement is blocked
- }
-}
-
-
-/*
-=============================================================================
-
- FIGHT
-
-=============================================================================
-*/
-
-
-/*
-===============
-=
-= T_Shoot
-=
-= Try to damage the player, based on skill level and player's speed
-=
-===============
-*/
-
-void T_Shoot (objtype *ob)
-{
- int dx,dy,dist;
- int hitchance,damage;
-
- hitchance = 128;
-
- if (!areabyplayer[ob->areanumber])
- return;
-
- if (!CheckLine (ob)) // player is behind a wall
- return;
-
- dx = abs(ob->tilex - player->tilex);
- dy = abs(ob->tiley - player->tiley);
- dist = dx>dy ? dx:dy;
-
- if (ob->obclass == ssobj || ob->obclass == bossobj)
- dist = dist*2/3; // ss are better shots
-
- if (thrustspeed >= RUNSPEED)
- {
- if (ob->flags&FL_VISABLE)
- hitchance = 160-dist*16; // player can see to dodge
- else
- hitchance = 160-dist*8;
- }
- else
- {
- if (ob->flags&FL_VISABLE)
- hitchance = 256-dist*16; // player can see to dodge
- else
- hitchance = 256-dist*8;
- }
-
-// see if the shot was a hit
-
- if (US_RndT()<hitchance)
- {
- if (dist<2)
- damage = US_RndT()>>2;
- else if (dist<4)
- damage = US_RndT()>>3;
- else
- damage = US_RndT()>>4;
-
- TakeDamage (damage,ob);
- }
-
- switch(ob->obclass)
- {
- case ssobj:
- PlaySoundLocActor(SSFIRESND,ob);
- break;
-#ifndef SPEAR
- case giftobj:
- case fatobj:
- PlaySoundLocActor(MISSILEFIRESND,ob);
- break;
- case mechahitlerobj:
- case realhitlerobj:
- case bossobj:
- PlaySoundLocActor(BOSSFIRESND,ob);
- break;
- case schabbobj:
- PlaySoundLocActor(SCHABBSTHROWSND,ob);
- break;
- case fakeobj:
- PlaySoundLocActor(FLAMETHROWERSND,ob);
- break;
-#endif
- default:
- PlaySoundLocActor(NAZIFIRESND,ob);
- }
-
-}
-
-
-/*
-===============
-=
-= T_Bite
-=
-===============
-*/
-
-void T_Bite (objtype *ob)
-{
- long dx,dy;
- int hitchance,damage;
-
-
- PlaySoundLocActor(DOGATTACKSND,ob); // JAB
-
- dx = player->x - ob->x;
- if (dx<0)
- dx = -dx;
- dx -= TILEGLOBAL;
- if (dx <= MINACTORDIST)
- {
- dy = player->y - ob->y;
- if (dy<0)
- dy = -dy;
- dy -= TILEGLOBAL;
- if (dy <= MINACTORDIST)
- {
- if (US_RndT()<180)
- {
- TakeDamage (US_RndT()>>4,ob);
- return;
- }
- }
- }
-
- return;
-}
-
-
-#ifndef SPEAR
-/*
-============================================================================
-
- BJ VICTORY
-
-============================================================================
-*/
-
-
-//
-// BJ victory
-//
-
-void T_BJRun (objtype *ob);
-void T_BJJump (objtype *ob);
-void T_BJDone (objtype *ob);
-void T_BJYell (objtype *ob);
-
-void T_DeathCam (objtype *ob);
-
-extern statetype s_bjrun1;
-extern statetype s_bjrun1s;
-extern statetype s_bjrun2;
-extern statetype s_bjrun3;
-extern statetype s_bjrun3s;
-extern statetype s_bjrun4;
-
-extern statetype s_bjjump1;
-extern statetype s_bjjump2;
-extern statetype s_bjjump3;
-extern statetype s_bjjump4;
-
-
-statetype s_bjrun1 = {false,SPR_BJ_W1,12,T_BJRun,NULL,&s_bjrun1s};
-statetype s_bjrun1s = {false,SPR_BJ_W1,3, NULL,NULL,&s_bjrun2};
-statetype s_bjrun2 = {false,SPR_BJ_W2,8,T_BJRun,NULL,&s_bjrun3};
-statetype s_bjrun3 = {false,SPR_BJ_W3,12,T_BJRun,NULL,&s_bjrun3s};
-statetype s_bjrun3s = {false,SPR_BJ_W3,3, NULL,NULL,&s_bjrun4};
-statetype s_bjrun4 = {false,SPR_BJ_W4,8,T_BJRun,NULL,&s_bjrun1};
-
-
-statetype s_bjjump1 = {false,SPR_BJ_JUMP1,14,T_BJJump,NULL,&s_bjjump2};
-statetype s_bjjump2 = {false,SPR_BJ_JUMP2,14,T_BJJump,T_BJYell,&s_bjjump3};
-statetype s_bjjump3 = {false,SPR_BJ_JUMP3,14,T_BJJump,NULL,&s_bjjump4};
-statetype s_bjjump4 = {false,SPR_BJ_JUMP4,300,NULL,T_BJDone,&s_bjjump4};
-
-
-statetype s_deathcam = {false,0,0,NULL,NULL,NULL};
-
-
-/*
-===============
-=
-= SpawnBJVictory
-=
-===============
-*/
-
-void SpawnBJVictory (void)
-{
- unsigned far *map,tile;
-
- SpawnNewObj (player->tilex,player->tiley+1,&s_bjrun1);
- new->x = player->x;
- new->y = player->y;
- new->obclass = bjobj;
- new->dir = north;
- new->temp1 = 6; // tiles to run forward
-}
-
-
-
-/*
-===============
-=
-= T_BJRun
-=
-===============
-*/
-
-void T_BJRun (objtype *ob)
-{
- long move;
-
- move = BJRUNSPEED*tics;
-
- while (move)
- {
- if (move < ob->distance)
- {
- MoveObj (ob,move);
- break;
- }
-
-
- ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
- ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
- move -= ob->distance;
-
- SelectPathDir (ob);
-
- if ( !(--ob->temp1) )
- {
- NewState (ob,&s_bjjump1);
- return;
- }
- }
-}
-
-
-/*
-===============
-=
-= T_BJJump
-=
-===============
-*/
-
-void T_BJJump (objtype *ob)
-{
- long move;
-
- move = BJJUMPSPEED*tics;
- MoveObj (ob,move);
-}
-
-
-/*
-===============
-=
-= T_BJYell
-=
-===============
-*/
-
-void T_BJYell (objtype *ob)
-{
- PlaySoundLocActor(YEAHSND,ob); // JAB
-}
-
-
-/*
-===============
-=
-= T_BJDone
-=
-===============
-*/
-
-#pragma argsused
-void T_BJDone (objtype *ob)
-{
- playstate = ex_victorious; // exit castle tile
-}
-
-
-
-//===========================================================================
-
-
-/*
-===============
-=
-= CheckPosition
-=
-===============
-*/
-
-boolean CheckPosition (objtype *ob)
-{
- int x,y,xl,yl,xh,yh;
- objtype *check;
-
- xl = (ob->x-PLAYERSIZE) >>TILESHIFT;
- yl = (ob->y-PLAYERSIZE) >>TILESHIFT;
-
- xh = (ob->x+PLAYERSIZE) >>TILESHIFT;
- yh = (ob->y+PLAYERSIZE) >>TILESHIFT;
-
- //
- // check for solid walls
- //
- for (y=yl;y<=yh;y++)
- for (x=xl;x<=xh;x++)
- {
- check = actorat[x][y];
- if (check && check<objlist)
- return false;
- }
-
- return true;
-}
-
-
-/*
-===============
-=
-= A_StartDeathCam
-=
-===============
-*/
-
-void A_StartDeathCam (objtype *ob)
-{
- long dx,dy;
- float fangle;
- long xmove,ymove;
- long dist;
- int temp,i;
-
- FinishPaletteShifts ();
-
- VW_WaitVBL (100);
-
- if (gamestate.victoryflag)
- {
- playstate = ex_victorious; // exit castle tile
- return;
- }
-
- gamestate.victoryflag = true;
- VW_Bar (0,0,320,200-STATUSLINES,127);
- FizzleFade(bufferofs,displayofs,320,200-STATUSLINES,70,false);
-
- PM_UnlockMainMem ();
- CA_UpLevel ();
- CacheLump(LEVELEND_LUMP_START,LEVELEND_LUMP_END);
- #ifdef JAPAN
- #ifndef JAPDEMO
- CA_CacheScreen(C_LETSSEEPIC);
- #endif
- #else
- Write(0,7,STR_SEEAGAIN);
- #endif
- CA_DownLevel ();
- PM_CheckMainMem ();
-
- VW_UpdateScreen ();
-
- IN_UserInput(300);
-
-//
-// line angle up exactly
-//
- NewState (player,&s_deathcam);
-
- player->x = gamestate.killx;
- player->y = gamestate.killy;
-
- dx = ob->x - player->x;
- dy = player->y - ob->y;
-
- fangle = atan2(dy,dx); // returns -pi to pi
- if (fangle<0)
- fangle = M_PI*2+fangle;
-
- player->angle = fangle/(M_PI*2)*ANGLES;
-
-//
-// try to position as close as possible without being in a wall
-//
- dist = 0x14000l;
- do
- {
- xmove = FixedByFrac(dist,costable[player->angle]);
- ymove = -FixedByFrac(dist,sintable[player->angle]);
-
- player->x = ob->x - xmove;
- player->y = ob->y - ymove;
- dist += 0x1000;
-
- } while (!CheckPosition (player));
- plux = player->x >> UNSIGNEDSHIFT; // scale to fit in unsigned
- pluy = player->y >> UNSIGNEDSHIFT;
- player->tilex = player->x >> TILESHIFT; // scale to tile values
- player->tiley = player->y >> TILESHIFT;
-
-//
-// go back to the game
-//
- temp = bufferofs;
- for (i=0;i<3;i++)
- {
- bufferofs = screenloc[i];
- DrawPlayBorder ();
- }
- bufferofs = temp;
-
- fizzlein = true;
- switch (ob->obclass)
- {
-#ifndef SPEAR
- case schabbobj:
- NewState (ob,&s_schabbdeathcam);
- break;
- case realhitlerobj:
- NewState (ob,&s_hitlerdeathcam);
- break;
- case giftobj:
- NewState (ob,&s_giftdeathcam);
- break;
- case fatobj:
- NewState (ob,&s_fatdeathcam);
- break;
-#endif
- }
-
-}
-
-#endif
--- a/WOLFSRC/WL_AGENT.C
+++ /dev/null
@@ -1,1421 +1,0 @@
-// WL_AGENT.C
-
-#include "WL_DEF.H"
-#pragma hdrstop
-
-
-/*
-=============================================================================
-
- LOCAL CONSTANTS
-
-=============================================================================
-*/
-
-#define MAXMOUSETURN 10
-
-
-#define MOVESCALE 150l
-#define BACKMOVESCALE 100l
-#define ANGLESCALE 20
-
-/*
-=============================================================================
-
- GLOBAL VARIABLES
-
-=============================================================================
-*/
-
-
-
-//
-// player state info
-//
-boolean running;
-long thrustspeed;
-
-unsigned plux,pluy; // player coordinates scaled to unsigned
-
-int anglefrac;
-int gotgatgun; // JR
-
-objtype *LastAttacker;
-
-/*
-=============================================================================
-
- LOCAL VARIABLES
-
-=============================================================================
-*/
-
-
-void T_Player (objtype *ob);
-void T_Attack (objtype *ob);
-
-statetype s_player = {false,0,0,T_Player,NULL,NULL};
-statetype s_attack = {false,0,0,T_Attack,NULL,NULL};
-
-
-long playerxmove,playerymove;
-
-struct atkinf
-{
- char tics,attack,frame; // attack is 1 for gun, 2 for knife
-} attackinfo[4][14] =
-
-{
-{ {6,0,1},{6,2,2},{6,0,3},{6,-1,4} },
-{ {6,0,1},{6,1,2},{6,0,3},{6,-1,4} },
-{ {6,0,1},{6,1,2},{6,3,3},{6,-1,4} },
-{ {6,0,1},{6,1,2},{6,4,3},{6,-1,4} },
-};
-
-
-int strafeangle[9] = {0,90,180,270,45,135,225,315,0};
-
-void DrawWeapon (void);
-void GiveWeapon (int weapon);
-void GiveAmmo (int ammo);
-
-//===========================================================================
-
-//----------
-
-void Attack (void);
-void Use (void);
-void Search (objtype *ob);
-void SelectWeapon (void);
-void SelectItem (void);
-
-//----------
-
-boolean TryMove (objtype *ob);
-void T_Player (objtype *ob);
-
-void ClipMove (objtype *ob, long xmove, long ymove);
-
-/*
-=============================================================================
-
- CONTROL STUFF
-
-=============================================================================
-*/
-
-/*
-======================
-=
-= CheckWeaponChange
-=
-= Keys 1-4 change weapons
-=
-======================
-*/
-
-void CheckWeaponChange (void)
-{
- int i,buttons;
-
- if (!gamestate.ammo) // must use knife with no ammo
- return;
-
- for (i=wp_knife ; i<=gamestate.bestweapon ; i++)
- if (buttonstate[bt_readyknife+i-wp_knife])
- {
- gamestate.weapon = gamestate.chosenweapon = i;
- DrawWeapon ();
- return;
- }
-}
-
-
-/*
-=======================
-=
-= ControlMovement
-=
-= Takes controlx,controly, and buttonstate[bt_strafe]
-=
-= Changes the player's angle and position
-=
-= There is an angle hack because when going 70 fps, the roundoff becomes
-= significant
-=
-=======================
-*/
-
-void ControlMovement (objtype *ob)
-{
- long oldx,oldy;
- int angle,maxxmove;
- int angleunits;
- long speed;
-
- thrustspeed = 0;
-
- oldx = player->x;
- oldy = player->y;
-
-//
-// side to side move
-//
- if (buttonstate[bt_strafe])
- {
- //
- // strafing
- //
- //
- if (controlx > 0)
- {
- angle = ob->angle - ANGLES/4;
- if (angle < 0)
- angle += ANGLES;
- Thrust (angle,controlx*MOVESCALE); // move to left
- }
- else if (controlx < 0)
- {
- angle = ob->angle + ANGLES/4;
- if (angle >= ANGLES)
- angle -= ANGLES;
- Thrust (angle,-controlx*MOVESCALE); // move to right
- }
- }
- else
- {
- //
- // not strafing
- //
- anglefrac += controlx;
- angleunits = anglefrac/ANGLESCALE;
- anglefrac -= angleunits*ANGLESCALE;
- ob->angle -= angleunits;
-
- if (ob->angle >= ANGLES)
- ob->angle -= ANGLES;
- if (ob->angle < 0)
- ob->angle += ANGLES;
-
- }
-
-//
-// forward/backwards move
-//
- if (controly < 0)
- {
- Thrust (ob->angle,-controly*MOVESCALE); // move forwards
- }
- else if (controly > 0)
- {
- angle = ob->angle + ANGLES/2;
- if (angle >= ANGLES)
- angle -= ANGLES;
- Thrust (angle,controly*BACKMOVESCALE); // move backwards
- }
-
- if (gamestate.victoryflag) // watching the BJ actor
- return;
-
-//
-// calculate total move
-//
- playerxmove = player->x - oldx;
- playerymove = player->y - oldy;
-}
-
-/*
-=============================================================================
-
- STATUS WINDOW STUFF
-
-=============================================================================
-*/
-
-
-/*
-==================
-=
-= StatusDrawPic
-=
-==================
-*/
-
-void StatusDrawPic (unsigned x, unsigned y, unsigned picnum)
-{
- unsigned temp;
-
- temp = bufferofs;
- bufferofs = 0;
-
- bufferofs = PAGE1START+(200-STATUSLINES)*SCREENWIDTH;
- LatchDrawPic (x,y,picnum);
- bufferofs = PAGE2START+(200-STATUSLINES)*SCREENWIDTH;
- LatchDrawPic (x,y,picnum);
- bufferofs = PAGE3START+(200-STATUSLINES)*SCREENWIDTH;
- LatchDrawPic (x,y,picnum);
-
- bufferofs = temp;
-}
-
-
-/*
-==================
-=
-= DrawFace
-=
-==================
-*/
-
-void DrawFace (void)
-{
- if (gamestate.health)
- {
- #ifdef SPEAR
- if (godmode)
- StatusDrawPic (17,4,GODMODEFACE1PIC+gamestate.faceframe);
- else
- #endif
- StatusDrawPic (17,4,FACE1APIC+3*((100-gamestate.health)/16)+gamestate.faceframe);
- }
- else
- {
-#ifndef SPEAR
- if (LastAttacker->obclass == needleobj)
- StatusDrawPic (17,4,MUTANTBJPIC);
- else
-#endif
- StatusDrawPic (17,4,FACE8APIC);
- }
-}
-
-
-/*
-===============
-=
-= UpdateFace
-=
-= Calls draw face if time to change
-=
-===============
-*/
-
-#define FACETICS 70
-
-int facecount;
-
-void UpdateFace (void)
-{
-
- if (SD_SoundPlaying() == GETGATLINGSND)
- return;
-
- facecount += tics;
- if (facecount > US_RndT())
- {
- gamestate.faceframe = (US_RndT()>>6);
- if (gamestate.faceframe==3)
- gamestate.faceframe = 1;
-
- facecount = 0;
- DrawFace ();
- }
-}
-
-
-
-/*
-===============
-=
-= LatchNumber
-=
-= right justifies and pads with blanks
-=
-===============
-*/
-
-void LatchNumber (int x, int y, int width, long number)
-{
- unsigned length,c;
- char str[20];
-
- ltoa (number,str,10);
-
- length = strlen (str);
-
- while (length<width)
- {
- StatusDrawPic (x,y,N_BLANKPIC);
- x++;
- width--;
- }
-
- c= length <= width ? 0 : length-width;
-
- while (c<length)
- {
- StatusDrawPic (x,y,str[c]-'0'+ N_0PIC);
- x++;
- c++;
- }
-}
-
-
-/*
-===============
-=
-= DrawHealth
-=
-===============
-*/
-
-void DrawHealth (void)
-{
- LatchNumber (21,16,3,gamestate.health);
-}
-
-
-/*
-===============
-=
-= TakeDamage
-=
-===============
-*/
-
-void TakeDamage (int points,objtype *attacker)
-{
- LastAttacker = attacker;
-
- if (gamestate.victoryflag)
- return;
- if (gamestate.difficulty==gd_baby)
- points>>=2;
-
- if (!godmode)
- gamestate.health -= points;
-
- if (gamestate.health<=0)
- {
- gamestate.health = 0;
- playstate = ex_died;
- killerobj = attacker;
- }
-
- StartDamageFlash (points);
-
- gotgatgun=0;
-
- DrawHealth ();
- DrawFace ();
-
- //
- // MAKE BJ'S EYES BUG IF MAJOR DAMAGE!
- //
- #ifdef SPEAR
- if (points > 30 && gamestate.health!=0 && !godmode)
- {
- StatusDrawPic (17,4,BJOUCHPIC);
- facecount = 0;
- }
- #endif
-
-}
-
-
-/*
-===============
-=
-= HealSelf
-=
-===============
-*/
-
-void HealSelf (int points)
-{
- gamestate.health += points;
- if (gamestate.health>100)
- gamestate.health = 100;
-
- DrawHealth ();
- gotgatgun = 0; // JR
- DrawFace ();
-}
-
-
-//===========================================================================
-
-
-/*
-===============
-=
-= DrawLevel
-=
-===============
-*/
-
-void DrawLevel (void)
-{
-#ifdef SPEAR
- if (gamestate.mapon == 20)
- LatchNumber (2,16,2,18);
- else
-#endif
- LatchNumber (2,16,2,gamestate.mapon+1);
-}
-
-//===========================================================================
-
-
-/*
-===============
-=
-= DrawLives
-=
-===============
-*/
-
-void DrawLives (void)
-{
- LatchNumber (14,16,1,gamestate.lives);
-}
-
-
-/*
-===============
-=
-= GiveExtraMan
-=
-===============
-*/
-
-void GiveExtraMan (void)
-{
- if (gamestate.lives<9)
- gamestate.lives++;
- DrawLives ();
- SD_PlaySound (BONUS1UPSND);
-}
-
-//===========================================================================
-
-/*
-===============
-=
-= DrawScore
-=
-===============
-*/
-
-void DrawScore (void)
-{
- LatchNumber (6,16,6,gamestate.score);
-}
-
-/*
-===============
-=
-= GivePoints
-=
-===============
-*/
-
-void GivePoints (long points)
-{
- gamestate.score += points;
- while (gamestate.score >= gamestate.nextextra)
- {
- gamestate.nextextra += EXTRAPOINTS;
- GiveExtraMan ();
- }
- DrawScore ();
-}
-
-//===========================================================================
-
-/*
-==================
-=
-= DrawWeapon
-=
-==================
-*/
-
-void DrawWeapon (void)
-{
- StatusDrawPic (32,8,KNIFEPIC+gamestate.weapon);
-}
-
-
-/*
-==================
-=
-= DrawKeys
-=
-==================
-*/
-
-void DrawKeys (void)
-{
- if (gamestate.keys & 1)
- StatusDrawPic (30,4,GOLDKEYPIC);
- else
- StatusDrawPic (30,4,NOKEYPIC);
-
- if (gamestate.keys & 2)
- StatusDrawPic (30,20,SILVERKEYPIC);
- else
- StatusDrawPic (30,20,NOKEYPIC);
-}
-
-
-
-/*
-==================
-=
-= GiveWeapon
-=
-==================
-*/
-
-void GiveWeapon (int weapon)
-{
- GiveAmmo (6);
-
- if (gamestate.bestweapon<weapon)
- gamestate.bestweapon = gamestate.weapon
- = gamestate.chosenweapon = weapon;
-
- DrawWeapon ();
-}
-
-
-//===========================================================================
-
-/*
-===============
-=
-= DrawAmmo
-=
-===============
-*/
-
-void DrawAmmo (void)
-{
- LatchNumber (27,16,2,gamestate.ammo);
-}
-
-
-/*
-===============
-=
-= GiveAmmo
-=
-===============
-*/
-
-void GiveAmmo (int ammo)
-{
- if (!gamestate.ammo) // knife was out
- {
- if (!gamestate.attackframe)
- {
- gamestate.weapon = gamestate.chosenweapon;
- DrawWeapon ();
- }
- }
- gamestate.ammo += ammo;
- if (gamestate.ammo > 99)
- gamestate.ammo = 99;
- DrawAmmo ();
-}
-
-//===========================================================================
-
-/*
-==================
-=
-= GiveKey
-=
-==================
-*/
-
-void GiveKey (int key)
-{
- gamestate.keys |= (1<<key);
- DrawKeys ();
-}
-
-
-
-/*
-=============================================================================
-
- MOVEMENT
-
-=============================================================================
-*/
-
-
-/*
-===================
-=
-= GetBonus
-=
-===================
-*/
-void GetBonus (statobj_t *check)
-{
- switch (check->itemnumber)
- {
- case bo_firstaid:
- if (gamestate.health == 100)
- return;
-
- SD_PlaySound (HEALTH2SND);
- HealSelf (25);
- break;
-
- case bo_key1:
- case bo_key2:
- case bo_key3:
- case bo_key4:
- GiveKey (check->itemnumber - bo_key1);
- SD_PlaySound (GETKEYSND);
- break;
-
- case bo_cross:
- SD_PlaySound (BONUS1SND);
- GivePoints (100);
- gamestate.treasurecount++;
- break;
- case bo_chalice:
- SD_PlaySound (BONUS2SND);
- GivePoints (500);
- gamestate.treasurecount++;
- break;
- case bo_bible:
- SD_PlaySound (BONUS3SND);
- GivePoints (1000);
- gamestate.treasurecount++;
- break;
- case bo_crown:
- SD_PlaySound (BONUS4SND);
- GivePoints (5000);
- gamestate.treasurecount++;
- break;
-
- case bo_clip:
- if (gamestate.ammo == 99)
- return;
-
- SD_PlaySound (GETAMMOSND);
- GiveAmmo (8);
- break;
- case bo_clip2:
- if (gamestate.ammo == 99)
- return;
-
- SD_PlaySound (GETAMMOSND);
- GiveAmmo (4);
- break;
-
-#ifdef SPEAR
- case bo_25clip:
- if (gamestate.ammo == 99)
- return;
-
- SD_PlaySound (GETAMMOBOXSND);
- GiveAmmo (25);
- break;
-#endif
-
- case bo_machinegun:
- SD_PlaySound (GETMACHINESND);
- GiveWeapon (wp_machinegun);
- break;
- case bo_chaingun:
- SD_PlaySound (GETGATLINGSND);
- GiveWeapon (wp_chaingun);
-
- StatusDrawPic (17,4,GOTGATLINGPIC);
- facecount = 0;
- gotgatgun = 1;
- break;
-
- case bo_fullheal:
- SD_PlaySound (BONUS1UPSND);
- HealSelf (99);
- GiveAmmo (25);
- GiveExtraMan ();
- gamestate.treasurecount++;
- break;
-
- case bo_food:
- if (gamestate.health == 100)
- return;
-
- SD_PlaySound (HEALTH1SND);
- HealSelf (10);
- break;
-
- case bo_alpo:
- if (gamestate.health == 100)
- return;
-
- SD_PlaySound (HEALTH1SND);
- HealSelf (4);
- break;
-
- case bo_gibs:
- if (gamestate.health >10)
- return;
-
- SD_PlaySound (SLURPIESND);
- HealSelf (1);
- break;
-
- case bo_spear:
- spearflag = true;
- spearx = player->x;
- speary = player->y;
- spearangle = player->angle;
- playstate = ex_completed;
- }
-
- StartBonusFlash ();
- check->shapenum = -1; // remove from list
-}
-
-
-/*
-===================
-=
-= TryMove
-=
-= returns true if move ok
-= debug: use pointers to optimize
-===================
-*/
-
-boolean TryMove (objtype *ob)
-{
- int xl,yl,xh,yh,x,y;
- objtype *check;
- long deltax,deltay;
-
- xl = (ob->x-PLAYERSIZE) >>TILESHIFT;
- yl = (ob->y-PLAYERSIZE) >>TILESHIFT;
-
- xh = (ob->x+PLAYERSIZE) >>TILESHIFT;
- yh = (ob->y+PLAYERSIZE) >>TILESHIFT;
-
-//
-// check for solid walls
-//
- for (y=yl;y<=yh;y++)
- for (x=xl;x<=xh;x++)
- {
- check = actorat[x][y];
- if (check && check<objlist)
- return false;
- }
-
-//
-// check for actors
-//
- if (yl>0)
- yl--;
- if (yh<MAPSIZE-1)
- yh++;
- if (xl>0)
- xl--;
- if (xh<MAPSIZE-1)
- xh++;
-
- for (y=yl;y<=yh;y++)
- for (x=xl;x<=xh;x++)
- {
- check = actorat[x][y];
- if (check > objlist
- && (check->flags & FL_SHOOTABLE) )
- {
- deltax = ob->x - check->x;
- if (deltax < -MINACTORDIST || deltax > MINACTORDIST)
- continue;
- deltay = ob->y - check->y;
- if (deltay < -MINACTORDIST || deltay > MINACTORDIST)
- continue;
-
- return false;
- }
- }
-
- return true;
-}
-
-
-/*
-===================
-=
-= ClipMove
-=
-===================
-*/
-
-void ClipMove (objtype *ob, long xmove, long ymove)
-{
- long basex,basey;
-
- basex = ob->x;
- basey = ob->y;
-
- ob->x = basex+xmove;
- ob->y = basey+ymove;
- if (TryMove (ob))
- return;
-
- if (noclip && ob->x > 2*TILEGLOBAL && ob->y > 2*TILEGLOBAL &&
- ob->x < (((long)(mapwidth-1))<<TILESHIFT)
- && ob->y < (((long)(mapheight-1))<<TILESHIFT) )
- return; // walk through walls
-
- if (!SD_SoundPlaying())
- SD_PlaySound (HITWALLSND);
-
- ob->x = basex+xmove;
- ob->y = basey;
- if (TryMove (ob))
- return;
-
- ob->x = basex;
- ob->y = basey+ymove;
- if (TryMove (ob))
- return;
-
- ob->x = basex;
- ob->y = basey;
-}
-
-//==========================================================================
-
-/*
-===================
-=
-= VictoryTile
-=
-===================
-*/
-
-void VictoryTile (void)
-{
-#ifndef SPEAR
- SpawnBJVictory ();
-#endif
-
- gamestate.victoryflag = true;
-}
-
-
-/*
-===================
-=
-= Thrust
-=
-===================
-*/
-
-void Thrust (int angle, long speed)
-{
- long xmove,ymove;
- long slowmax;
- unsigned offset;
-
-
- //
- // ZERO FUNNY COUNTER IF MOVED!
- //
- #ifdef SPEAR
- if (speed)
- funnyticount = 0;
- #endif
-
- thrustspeed += speed;
-//
-// moving bounds speed
-//
- if (speed >= MINDIST*2)
- speed = MINDIST*2-1;
-
- xmove = FixedByFrac(speed,costable[angle]);
- ymove = -FixedByFrac(speed,sintable[angle]);
-
- ClipMove(player,xmove,ymove);
-
- player->tilex = player->x >> TILESHIFT; // scale to tile values
- player->tiley = player->y >> TILESHIFT;
-
- offset = farmapylookup[player->tiley]+player->tilex;
- player->areanumber = *(mapsegs[0] + offset) -AREATILE;
-
- if (*(mapsegs[1] + offset) == EXITTILE)
- VictoryTile ();
-}
-
-
-/*
-=============================================================================
-
- ACTIONS
-
-=============================================================================
-*/
-
-
-/*
-===============
-=
-= Cmd_Fire
-=
-===============
-*/
-
-void Cmd_Fire (void)
-{
- buttonheld[bt_attack] = true;
-
- gamestate.weaponframe = 0;
-
- player->state = &s_attack;
-
- gamestate.attackframe = 0;
- gamestate.attackcount =
- attackinfo[gamestate.weapon][gamestate.attackframe].tics;
- gamestate.weaponframe =
- attackinfo[gamestate.weapon][gamestate.attackframe].frame;
-}
-
-//===========================================================================
-
-/*
-===============
-=
-= Cmd_Use
-=
-===============
-*/
-
-void Cmd_Use (void)
-{
- objtype *check;
- int checkx,checky,doornum,dir;
- boolean elevatorok;
-
-
-//
-// find which cardinal direction the player is facing
-//
- if (player->angle < ANGLES/8 || player->angle > 7*ANGLES/8)
- {
- checkx = player->tilex + 1;
- checky = player->tiley;
- dir = di_east;
- elevatorok = true;
- }
- else if (player->angle < 3*ANGLES/8)
- {
- checkx = player->tilex;
- checky = player->tiley-1;
- dir = di_north;
- elevatorok = false;
- }
- else if (player->angle < 5*ANGLES/8)
- {
- checkx = player->tilex - 1;
- checky = player->tiley;
- dir = di_west;
- elevatorok = true;
- }
- else
- {
- checkx = player->tilex;
- checky = player->tiley + 1;
- dir = di_south;
- elevatorok = false;
- }
-
- doornum = tilemap[checkx][checky];
- if (*(mapsegs[1]+farmapylookup[checky]+checkx) == PUSHABLETILE)
- {
- //
- // pushable wall
- //
-
- PushWall (checkx,checky,dir);
- return;
- }
- if (!buttonheld[bt_use] && doornum == ELEVATORTILE && elevatorok)
- {
- //
- // use elevator
- //
- buttonheld[bt_use] = true;
-
- tilemap[checkx][checky]++; // flip switch
- if (*(mapsegs[0]+farmapylookup[player->tiley]+player->tilex) == ALTELEVATORTILE)
- playstate = ex_secretlevel;
- else
- playstate = ex_completed;
- SD_PlaySound (LEVELDONESND);
- SD_WaitSoundDone();
- }
- else if (!buttonheld[bt_use] && doornum & 0x80)
- {
- buttonheld[bt_use] = true;
- OperateDoor (doornum & ~0x80);
- }
- else
- SD_PlaySound (DONOTHINGSND);
-
-}
-
-/*
-=============================================================================
-
- PLAYER CONTROL
-
-=============================================================================
-*/
-
-
-
-/*
-===============
-=
-= SpawnPlayer
-=
-===============
-*/
-
-void SpawnPlayer (int tilex, int tiley, int dir)
-{
- player->obclass = playerobj;
- player->active = true;
- player->tilex = tilex;
- player->tiley = tiley;
- player->areanumber =
- *(mapsegs[0] + farmapylookup[player->tiley]+player->tilex);
- player->x = ((long)tilex<<TILESHIFT)+TILEGLOBAL/2;
- player->y = ((long)tiley<<TILESHIFT)+TILEGLOBAL/2;
- player->state = &s_player;
- player->angle = (1-dir)*90;
- if (player->angle<0)
- player->angle += ANGLES;
- player->flags = FL_NEVERMARK;
- Thrust (0,0); // set some variables
-
- InitAreas ();
-}
-
-
-//===========================================================================
-
-/*
-===============
-=
-= T_KnifeAttack
-=
-= Update player hands, and try to do damage when the proper frame is reached
-=
-===============
-*/
-
-void KnifeAttack (objtype *ob)
-{
- objtype *check,*closest;
- long dist;
-
- SD_PlaySound (ATKKNIFESND);
-// actually fire
- dist = 0x7fffffff;
- closest = NULL;
- for (check=ob->next ; check ; check=check->next)
- if ( (check->flags & FL_SHOOTABLE)
- && (check->flags & FL_VISABLE)
- && abs (check->viewx-centerx) < shootdelta
- )
- {
- if (check->transx < dist)
- {
- dist = check->transx;
- closest = check;
- }
- }
-
- if (!closest || dist> 0x18000l)
- {
- // missed
-
- return;
- }
-
-// hit something
- DamageActor (closest,US_RndT() >> 4);
-}
-
-
-
-void GunAttack (objtype *ob)
-{
- objtype *check,*closest,*oldclosest;
- int damage;
- int dx,dy,dist;
- long viewdist;
-
- switch (gamestate.weapon)
- {
- case wp_pistol:
- SD_PlaySound (ATKPISTOLSND);
- break;
- case wp_machinegun:
- SD_PlaySound (ATKMACHINEGUNSND);
- break;
- case wp_chaingun:
- SD_PlaySound (ATKGATLINGSND);
- break;
- }
-
- madenoise = true;
-
-//
-// find potential targets
-//
- viewdist = 0x7fffffffl;
- closest = NULL;
-
- while (1)
- {
- oldclosest = closest;
-
- for (check=ob->next ; check ; check=check->next)
- if ( (check->flags & FL_SHOOTABLE)
- && (check->flags & FL_VISABLE)
- && abs (check->viewx-centerx) < shootdelta
- )
- {
- if (check->transx < viewdist)
- {
- viewdist = check->transx;
- closest = check;
- }
- }
-
- if (closest == oldclosest)
- return; // no more targets, all missed
-
- //
- // trace a line from player to enemey
- //
- if (CheckLine(closest))
- break;
-
- }
-
-//
-// hit something
-//
- dx = abs(closest->tilex - player->tilex);
- dy = abs(closest->tiley - player->tiley);
- dist = dx>dy ? dx:dy;
-
- if (dist<2)
- damage = US_RndT() / 4;
- else if (dist<4)
- damage = US_RndT() / 6;
- else
- {
- if ( (US_RndT() / 12) < dist) // missed
- return;
- damage = US_RndT() / 6;
- }
-
- DamageActor (closest,damage);
-}
-
-//===========================================================================
-
-/*
-===============
-=
-= VictorySpin
-=
-===============
-*/
-
-void VictorySpin (void)
-{
- long desty;
-
- if (player->angle > 270)
- {
- player->angle -= tics * 3;
- if (player->angle < 270)
- player->angle = 270;
- }
- else if (player->angle < 270)
- {
- player->angle += tics * 3;
- if (player->angle > 270)
- player->angle = 270;
- }
-
- desty = (((long)player->tiley-5)<<TILESHIFT)-0x3000;
-
- if (player->y > desty)
- {
- player->y -= tics*4096;
- if (player->y < desty)
- player->y = desty;
- }
-}
-
-
-//===========================================================================
-
-/*
-===============
-=
-= T_Attack
-=
-===============
-*/
-
-void T_Attack (objtype *ob)
-{
- struct atkinf *cur;
-
- UpdateFace ();
-
- if (gamestate.victoryflag) // watching the BJ actor
- {
- VictorySpin ();
- return;
- }
-
- if ( buttonstate[bt_use] && !buttonheld[bt_use] )
- buttonstate[bt_use] = false;
-
- if ( buttonstate[bt_attack] && !buttonheld[bt_attack])
- buttonstate[bt_attack] = false;
-
- ControlMovement (ob);
- if (gamestate.victoryflag) // watching the BJ actor
- return;
-
- plux = player->x >> UNSIGNEDSHIFT; // scale to fit in unsigned
- pluy = player->y >> UNSIGNEDSHIFT;
- player->tilex = player->x >> TILESHIFT; // scale to tile values
- player->tiley = player->y >> TILESHIFT;
-
-//
-// change frame and fire
-//
- gamestate.attackcount -= tics;
- while (gamestate.attackcount <= 0)
- {
- cur = &attackinfo[gamestate.weapon][gamestate.attackframe];
- switch (cur->attack)
- {
- case -1:
- ob->state = &s_player;
- if (!gamestate.ammo)
- {
- gamestate.weapon = wp_knife;
- DrawWeapon ();
- }
- else
- {
- if (gamestate.weapon != gamestate.chosenweapon)
- {
- gamestate.weapon = gamestate.chosenweapon;
- DrawWeapon ();
- }
- };
- gamestate.attackframe = gamestate.weaponframe = 0;
- return;
-
- case 4:
- if (!gamestate.ammo)
- break;
- if (buttonstate[bt_attack])
- gamestate.attackframe -= 2;
- case 1:
- if (!gamestate.ammo)
- { // can only happen with chain gun
- gamestate.attackframe++;
- break;
- }
- GunAttack (ob);
- gamestate.ammo--;
- DrawAmmo ();
- break;
-
- case 2:
- KnifeAttack (ob);
- break;
-
- case 3:
- if (gamestate.ammo && buttonstate[bt_attack])
- gamestate.attackframe -= 2;
- break;
- }
-
- gamestate.attackcount += cur->tics;
- gamestate.attackframe++;
- gamestate.weaponframe =
- attackinfo[gamestate.weapon][gamestate.attackframe].frame;
- }
-
-}
-
-
-
-//===========================================================================
-
-/*
-===============
-=
-= T_Player
-=
-===============
-*/
-
-void T_Player (objtype *ob)
-{
- if (gamestate.victoryflag) // watching the BJ actor
- {
- VictorySpin ();
- return;
- }
-
- UpdateFace ();
- CheckWeaponChange ();
-
- if ( buttonstate[bt_use] )
- Cmd_Use ();
-
- if ( buttonstate[bt_attack] && !buttonheld[bt_attack])
- Cmd_Fire ();
-
- ControlMovement (ob);
- if (gamestate.victoryflag) // watching the BJ actor
- return;
-
-
- plux = player->x >> UNSIGNEDSHIFT; // scale to fit in unsigned
- pluy = player->y >> UNSIGNEDSHIFT;
- player->tilex = player->x >> TILESHIFT; // scale to tile values
- player->tiley = player->y >> TILESHIFT;
-}
-
-
--- a/WOLFSRC/WL_ASM.ASM
+++ /dev/null
@@ -1,67 +1,0 @@
-; JABHACK.ASM
-
-.386C
-IDEAL
-MODEL MEDIUM
-
-EXTRN LDIV@:far
-
-;============================================================================
-
-DATASEG
-
-;============================================================================
-
-CODESEG
-
-; Hacked up Juan Jimenez's code a bit to just return 386/not 386
-PROC _CheckIs386
-PUBLIC _CheckIs386
-
- pushf ; Save flag registers, we use them here
- xor ax,ax ; Clear AX and...
- push ax ; ...push it onto the stack
- popf ; Pop 0 into flag registers (all bits to 0),
- pushf ; attempting to set bits 12-15 of flags to 0's
- pop ax ; Recover the save flags
- and ax,08000h ; If bits 12-15 of flags are set to
- cmp ax,08000h ; zero then it's 8088/86 or 80188/186
- jz not386
-
- mov ax,07000h ; Try to set flag bits 12-14 to 1's
- push ax ; Push the test value onto the stack
- popf ; Pop it into the flag register
- pushf ; Push it back onto the stack
- pop ax ; Pop it into AX for check
- and ax,07000h ; if bits 12-14 are cleared then
- jz not386 ; the chip is an 80286
-
- mov ax,1 ; We now assume it's a 80386 or better
- popf
- retf
-
-not386:
- xor ax,ax
- popf
- retf
-
- ENDP
-
-
-PROC _jabhack2
-PUBLIC _jabhack2
-
- push es
-
- mov ax,seg LDIV@
- mov es,ax
- mov ax,9090h ;Two NOP's
- mov [WORD FAR es:LDIV@],ax ;Patch over XOR AX,AX
- mov [WORD FAR es:LDIV@+2],ax ;and over JMP SHORT COMMON
-
- pop es
- retf
-
- ENDP
-
- END
--- a/WOLFSRC/WL_DEBUG.C
+++ /dev/null
@@ -1,722 +1,0 @@
-// WL_DEBUG.C
-
-#include "WL_DEF.H"
-#pragma hdrstop
-#include <BIOS.H>
-
-/*
-=============================================================================
-
- LOCAL CONSTANTS
-
-=============================================================================
-*/
-
-#define VIEWTILEX (viewwidth/16)
-#define VIEWTILEY (viewheight/16)
-
-/*
-=============================================================================
-
- GLOBAL VARIABLES
-
-=============================================================================
-*/
-
-
-int DebugKeys (void);
-
-/*
-=============================================================================
-
- LOCAL VARIABLES
-
-=============================================================================
-*/
-
-
-int maporgx;
-int maporgy;
-enum {mapview,tilemapview,actoratview,visview} viewtype;
-
-void ViewMap (void);
-
-//===========================================================================
-
-/*
-==================
-=
-= DebugMemory
-=
-==================
-*/
-
-void DebugMemory (void)
-{
- int i;
- char scratch[80],str[10];
- long mem;
- spritetype _seg *block;
-
- CenterWindow (16,7);
-
- US_CPrint ("Memory Usage");
- US_CPrint ("------------");
- US_Print ("Total :");
- US_PrintUnsigned (mminfo.mainmem/1024);
- US_Print ("k\nFree :");
- US_PrintUnsigned (MM_UnusedMemory()/1024);
- US_Print ("k\nWith purge:");
- US_PrintUnsigned (MM_TotalFree()/1024);
- US_Print ("k\n");
- VW_UpdateScreen();
- IN_Ack ();
-}
-
-//===========================================================================
-
-/*
-==================
-=
-= CountObjects
-=
-==================
-*/
-
-void CountObjects (void)
-{
- int i,total,count,active,inactive,doors;
- objtype *obj;
-
- CenterWindow (16,7);
- active = inactive = count = doors = 0;
-
- US_Print ("Total statics :");
- total = laststatobj-&statobjlist[0];
- US_PrintUnsigned (total);
-
- US_Print ("\nIn use statics:");
- for (i=0;i<total;i++)
- if (statobjlist[i].shapenum != -1)
- count++;
- else
- doors++; //debug
- US_PrintUnsigned (count);
-
- US_Print ("\nDoors :");
- US_PrintUnsigned (doornum);
-
- for (obj=player->next;obj;obj=obj->next)
- {
- if (obj->active)
- active++;
- else
- inactive++;
- }
-
- US_Print ("\nTotal actors :");
- US_PrintUnsigned (active+inactive);
-
- US_Print ("\nActive actors :");
- US_PrintUnsigned (active);
-
- VW_UpdateScreen();
- IN_Ack ();
-}
-
-//===========================================================================
-
-/*
-================
-=
-= PicturePause
-=
-================
-*/
-
-void PicturePause (void)
-{
- int i;
- byte p;
- unsigned x;
- byte far *dest,far *src;
- memptr buffer;
-
- VW_ColorBorder (15);
- FinishPaletteShifts ();
-
- LastScan = 0;
- while (!LastScan)
- ;
- if (LastScan != sc_Enter)
- {
- VW_ColorBorder (0);
- return;
- }
-
- VW_ColorBorder (1);
- VW_SetScreen (0,0);
-//
-// vga stuff...
-//
-
- ClearMemory ();
- CA_SetAllPurge();
- MM_GetPtr (&buffer,64000);
- for (p=0;p<4;p++)
- {
- src = MK_FP(0xa000,displayofs);
- dest = (byte far *)buffer+p;
- VGAREADMAP(p);
- for (x=0;x<16000;x++,dest+=4)
- *dest = *src++;
- }
-
-
-#if 0
- for (p=0;p<4;p++)
- {
- src = MK_FP(0xa000,0);
- dest = (byte far *)buffer+51200+p;
- VGAREADMAP(p);
- for (x=0;x<3200;x++,dest+=4)
- *dest = *src++;
- }
-#endif
-
- asm mov ax,0x13
- asm int 0x10
-
- dest = MK_FP(0xa000,0);
- _fmemcpy (dest,buffer,64000);
-
- VL_SetPalette (&gamepal);
-
-
- IN_Shutdown ();
-
- VW_WaitVBL(70);
- bioskey(0);
- VW_WaitVBL(70);
- Quit (NULL);
-}
-
-
-//===========================================================================
-
-
-/*
-================
-=
-= ShapeTest
-=
-================
-*/
-
-#pragma warn -pia
-void ShapeTest (void)
-{
-extern word NumDigi;
-extern word _seg *DigiList;
-static char buf[10];
-
- boolean done;
- ScanCode scan;
- int i,j,k,x;
- longword l;
- memptr addr;
- PageListStruct far *page;
-
- CenterWindow(20,16);
- VW_UpdateScreen();
- for (i = 0,done = false;!done;)
- {
- US_ClearWindow();
-// sound = -1;
-
- page = &PMPages[i];
- US_Print(" Page #");
- US_PrintUnsigned(i);
- if (i < PMSpriteStart)
- US_Print(" (Wall)");
- else if (i < PMSoundStart)
- US_Print(" (Sprite)");
- else if (i == ChunksInFile - 1)
- US_Print(" (Sound Info)");
- else
- US_Print(" (Sound)");
-
- US_Print("\n XMS: ");
- if (page->xmsPage != -1)
- US_PrintUnsigned(page->xmsPage);
- else
- US_Print("No");
-
- US_Print("\n Main: ");
- if (page->mainPage != -1)
- US_PrintUnsigned(page->mainPage);
- else if (page->emsPage != -1)
- {
- US_Print("EMS ");
- US_PrintUnsigned(page->emsPage);
- }
- else
- US_Print("No");
-
- US_Print("\n Last hit: ");
- US_PrintUnsigned(page->lastHit);
-
- US_Print("\n Address: ");
- addr = PM_GetPageAddress(i);
- sprintf(buf,"0x%04x",(word)addr);
- US_Print(buf);
-
- if (addr)
- {
- if (i < PMSpriteStart)
- {
- //
- // draw the wall
- //
- bufferofs += 32*SCREENWIDTH;
- postx = 128;
- postwidth = 1;
- postsource = ((long)((unsigned)addr))<<16;
- for (x=0;x<64;x++,postx++,postsource+=64)
- {
- wallheight[postx] = 256;
- FarScalePost ();
- }
- bufferofs -= 32*SCREENWIDTH;
- }
- else if (i < PMSoundStart)
- {
- //
- // draw the sprite
- //
- bufferofs += 32*SCREENWIDTH;
- SimpleScaleShape (160, i-PMSpriteStart, 64);
- bufferofs -= 32*SCREENWIDTH;
- }
- else if (i == ChunksInFile - 1)
- {
- US_Print("\n\n Number of sounds: ");
- US_PrintUnsigned(NumDigi);
- for (l = j = k = 0;j < NumDigi;j++)
- {
- l += DigiList[(j * 2) + 1];
- k += (DigiList[(j * 2) + 1] + (PMPageSize - 1)) / PMPageSize;
- }
- US_Print("\n Total bytes: ");
- US_PrintUnsigned(l);
- US_Print("\n Total pages: ");
- US_PrintUnsigned(k);
- }
- else
- {
- byte far *dp = (byte far *)MK_FP(addr,0);
- for (j = 0;j < NumDigi;j++)
- {
- k = (DigiList[(j * 2) + 1] + (PMPageSize - 1)) / PMPageSize;
- if
- (
- (i >= PMSoundStart + DigiList[j * 2])
- && (i < PMSoundStart + DigiList[j * 2] + k)
- )
- break;
- }
- if (j < NumDigi)
- {
-// sound = j;
- US_Print("\n Sound #");
- US_PrintUnsigned(j);
- US_Print("\n Segment #");
- US_PrintUnsigned(i - PMSoundStart - DigiList[j * 2]);
- }
- for (j = 0;j < page->length;j += 32)
- {
- byte v = dp[j];
- int v2 = (unsigned)v;
- v2 -= 128;
- v2 /= 4;
- if (v2 < 0)
- VWB_Vlin(WindowY + WindowH - 32 + v2,
- WindowY + WindowH - 32,
- WindowX + 8 + (j / 32),BLACK);
- else
- VWB_Vlin(WindowY + WindowH - 32,
- WindowY + WindowH - 32 + v2,
- WindowX + 8 + (j / 32),BLACK);
- }
- }
- }
-
- VW_UpdateScreen();
-
- while (!(scan = LastScan))
- SD_Poll();
-
- IN_ClearKey(scan);
- switch (scan)
- {
- case sc_LeftArrow:
- if (i)
- i--;
- break;
- case sc_RightArrow:
- if (++i >= ChunksInFile)
- i--;
- break;
- case sc_W: // Walls
- i = 0;
- break;
- case sc_S: // Sprites
- i = PMSpriteStart;
- break;
- case sc_D: // Digitized
- i = PMSoundStart;
- break;
- case sc_I: // Digitized info
- i = ChunksInFile - 1;
- break;
- case sc_L: // Load all pages
- for (j = 0;j < ChunksInFile;j++)
- PM_GetPage(j);
- break;
- case sc_P:
-// if (sound != -1)
-// SD_PlayDigitized(sound);
- break;
- case sc_Escape:
- done = true;
- break;
- case sc_Enter:
- PM_GetPage(i);
- break;
- }
- }
- SD_StopDigitized();
-}
-#pragma warn +pia
-
-
-
-//===========================================================================
-
-
-/*
-================
-=
-= DebugKeys
-=
-================
-*/
-
-int DebugKeys (void)
-{
- boolean esc;
- int level,i;
-
- if (Keyboard[sc_B]) // B = border color
- {
- CenterWindow(24,3);
- PrintY+=6;
- US_Print(" Border color (0-15):");
- VW_UpdateScreen();
- esc = !US_LineInput (px,py,str,NULL,true,2,0);
- if (!esc)
- {
- level = atoi (str);
- if (level>=0 && level<=15)
- VW_ColorBorder (level);
- }
- return 1;
- }
-
- if (Keyboard[sc_C]) // C = count objects
- {
- CountObjects();
- return 1;
- }
-
- if (Keyboard[sc_E]) // E = quit level
- {
- if (tedlevel)
- Quit (NULL);
- playstate = ex_completed;
-// gamestate.mapon++;
- }
-
- if (Keyboard[sc_F]) // F = facing spot
- {
- CenterWindow (14,4);
- US_Print ("X:");
- US_PrintUnsigned (player->x);
- US_Print ("\nY:");
- US_PrintUnsigned (player->y);
- US_Print ("\nA:");
- US_PrintUnsigned (player->angle);
- VW_UpdateScreen();
- IN_Ack();
- return 1;
- }
-
- if (Keyboard[sc_G]) // G = god mode
- {
- CenterWindow (12,2);
- if (godmode)
- US_PrintCentered ("God mode OFF");
- else
- US_PrintCentered ("God mode ON");
- VW_UpdateScreen();
- IN_Ack();
- godmode ^= 1;
- return 1;
- }
- if (Keyboard[sc_H]) // H = hurt self
- {
- IN_ClearKeysDown ();
- TakeDamage (16,NULL);
- }
- else if (Keyboard[sc_I]) // I = item cheat
- {
- CenterWindow (12,3);
- US_PrintCentered ("Free items!");
- VW_UpdateScreen();
- GivePoints (100000);
- HealSelf (99);
- if (gamestate.bestweapon<wp_chaingun)
- GiveWeapon (gamestate.bestweapon+1);
- gamestate.ammo += 50;
- if (gamestate.ammo > 99)
- gamestate.ammo = 99;
- DrawAmmo ();
- IN_Ack ();
- return 1;
- }
- else if (Keyboard[sc_M]) // M = memory info
- {
- DebugMemory();
- return 1;
- }
-#ifdef SPEAR
- else if (Keyboard[sc_N]) // N = no clip
- {
- noclip^=1;
- CenterWindow (18,3);
- if (noclip)
- US_PrintCentered ("No clipping ON");
- else
- US_PrintCentered ("No clipping OFF");
- VW_UpdateScreen();
- IN_Ack ();
- return 1;
- }
-#endif
-#if 0
- else if (Keyboard[sc_O]) // O = overhead
- {
- ViewMap();
- return 1;
- }
-#endif
- else if (Keyboard[sc_P]) // P = pause with no screen disruptioon
- {
- PicturePause ();
- return 1;
- }
- else if (Keyboard[sc_Q]) // Q = fast quit
- Quit (NULL);
- else if (Keyboard[sc_S]) // S = slow motion
- {
- singlestep^=1;
- CenterWindow (18,3);
- if (singlestep)
- US_PrintCentered ("Slow motion ON");
- else
- US_PrintCentered ("Slow motion OFF");
- VW_UpdateScreen();
- IN_Ack ();
- return 1;
- }
- else if (Keyboard[sc_T]) // T = shape test
- {
- ShapeTest ();
- return 1;
- }
- else if (Keyboard[sc_V]) // V = extra VBLs
- {
- CenterWindow(30,3);
- PrintY+=6;
- US_Print(" Add how many extra VBLs(0-8):");
- VW_UpdateScreen();
- esc = !US_LineInput (px,py,str,NULL,true,2,0);
- if (!esc)
- {
- level = atoi (str);
- if (level>=0 && level<=8)
- extravbls = level;
- }
- return 1;
- }
- else if (Keyboard[sc_W]) // W = warp to level
- {
- CenterWindow(26,3);
- PrintY+=6;
-#ifndef SPEAR
- US_Print(" Warp to which level(1-10):");
-#else
- US_Print(" Warp to which level(1-21):");
-#endif
- VW_UpdateScreen();
- esc = !US_LineInput (px,py,str,NULL,true,2,0);
- if (!esc)
- {
- level = atoi (str);
-#ifndef SPEAR
- if (level>0 && level<11)
-#else
- if (level>0 && level<22)
-#endif
- {
- gamestate.mapon = level-1;
- playstate = ex_warped;
- }
- }
- return 1;
- }
- else if (Keyboard[sc_X]) // X = item cheat
- {
- CenterWindow (12,3);
- US_PrintCentered ("Extra stuff!");
- VW_UpdateScreen();
- // DEBUG: put stuff here
- IN_Ack ();
- return 1;
- }
-
- return 0;
-}
-
-
-#if 0
-/*
-===================
-=
-= OverheadRefresh
-=
-===================
-*/
-
-void OverheadRefresh (void)
-{
- unsigned x,y,endx,endy,sx,sy;
- unsigned tile;
-
-
- endx = maporgx+VIEWTILEX;
- endy = maporgy+VIEWTILEY;
-
- for (y=maporgy;y<endy;y++)
- for (x=maporgx;x<endx;x++)
- {
- sx = (x-maporgx)*16;
- sy = (y-maporgy)*16;
-
- switch (viewtype)
- {
-#if 0
- case mapview:
- tile = *(mapsegs[0]+farmapylookup[y]+x);
- break;
-
- case tilemapview:
- tile = tilemap[x][y];
- break;
-
- case visview:
- tile = spotvis[x][y];
- break;
-#endif
- case actoratview:
- tile = (unsigned)actorat[x][y];
- break;
- }
-
- if (tile<MAXWALLTILES)
- LatchDrawTile(sx,sy,tile);
- else
- {
- LatchDrawChar(sx,sy,NUMBERCHARS+((tile&0xf000)>>12));
- LatchDrawChar(sx+8,sy,NUMBERCHARS+((tile&0x0f00)>>8));
- LatchDrawChar(sx,sy+8,NUMBERCHARS+((tile&0x00f0)>>4));
- LatchDrawChar(sx+8,sy+8,NUMBERCHARS+(tile&0x000f));
- }
- }
-
-}
-#endif
-
-#if 0
-/*
-===================
-=
-= ViewMap
-=
-===================
-*/
-
-void ViewMap (void)
-{
- boolean button0held;
-
- viewtype = actoratview;
-// button0held = false;
-
-
- maporgx = player->tilex - VIEWTILEX/2;
- if (maporgx<0)
- maporgx = 0;
- if (maporgx>MAPSIZE-VIEWTILEX)
- maporgx=MAPSIZE-VIEWTILEX;
- maporgy = player->tiley - VIEWTILEY/2;
- if (maporgy<0)
- maporgy = 0;
- if (maporgy>MAPSIZE-VIEWTILEY)
- maporgy=MAPSIZE-VIEWTILEY;
-
- do
- {
-//
-// let user pan around
-//
- PollControls ();
- if (controlx < 0 && maporgx>0)
- maporgx--;
- if (controlx > 0 && maporgx<mapwidth-VIEWTILEX)
- maporgx++;
- if (controly < 0 && maporgy>0)
- maporgy--;
- if (controly > 0 && maporgy<mapheight-VIEWTILEY)
- maporgy++;
-
-#if 0
- if (c.button0 && !button0held)
- {
- button0held = true;
- viewtype++;
- if (viewtype>visview)
- viewtype = mapview;
- }
- if (!c.button0)
- button0held = false;
-#endif
-
- OverheadRefresh ();
-
- } while (!Keyboard[sc_Escape]);
-
- IN_ClearKeysDown ();
-}
-#endif
-
--- a/WOLFSRC/WL_DEF.H
+++ /dev/null
@@ -1,1276 +1,0 @@
-//#define BETA
-#define YEAR 1992
-#define MONTH 9
-#define DAY 30
-
-#include "ID_HEADS.H"
-#include <MATH.H>
-#include <VALUES.H>
-
-#include "WL_MENU.H"
-
-#ifdef SPANISH
-#include "SPANISH.H"
-#else
-#include "FOREIGN.H"
-#endif
-
-#ifdef SPEAR
-#include "F_SPEAR.H"
-#endif
-
-/*
-=============================================================================
-
- MACROS
-
-=============================================================================
-*/
-
-
-#define COLORBORDER(color) asm{mov dx,STATUS_REGISTER_1;in al,dx;\
- mov dx,ATR_INDEX;mov al,ATR_OVERSCAN;out dx,al;mov al,color;out dx,al;\
- mov al,32;out dx,al};
-
-#define MAPSPOT(x,y,plane) (*(mapsegs[plane]+farmapylookup[y]+x))
-
-#define SIGN(x) ((x)>0?1:-1)
-#define ABS(x) ((int)(x)>0?(x):-(x))
-#define LABS(x) ((long)(x)>0?(x):-(x))
-
-/*
-=============================================================================
-
- GLOBAL CONSTANTS
-
-=============================================================================
-*/
-
-#define MAXACTORS 150 // max number of nazis, etc / map
-#define MAXSTATS 400 // max number of lamps, bonus, etc
-#define MAXDOORS 64 // max number of sliding doors
-#define MAXWALLTILES 64 // max number of wall tiles
-
-//
-// tile constants
-//
-
-#define ICONARROWS 90
-#define PUSHABLETILE 98
-#define EXITTILE 99 // at end of castle
-#define AREATILE 107 // first of NUMAREAS floor tiles
-#define NUMAREAS 37
-#define ELEVATORTILE 21
-#define AMBUSHTILE 106
-#define ALTELEVATORTILE 107
-
-#define NUMBERCHARS 9
-
-
-//----------------
-
-#define EXTRAPOINTS 40000
-
-#define PLAYERSPEED 3000
-#define RUNSPEED 6000
-
-#define SCREENSEG 0xa000
-
-#define SCREENBWIDE 80
-
-#define HEIGHTRATIO 0.50 // also defined in id_mm.c
-
-#define BORDERCOLOR 3
-#define FLASHCOLOR 5
-#define FLASHTICS 4
-
-
-#define PLAYERSIZE MINDIST // player radius
-#define MINACTORDIST 0x10000l // minimum dist from player center
- // to any actor center
-
-#define NUMLATCHPICS 100
-
-
-#define PI 3.141592657
-
-#define GLOBAL1 (1l<<16)
-#define TILEGLOBAL GLOBAL1
-#define PIXGLOBAL (GLOBAL1/64)
-#define TILESHIFT 16l
-#define UNSIGNEDSHIFT 8
-
-#define ANGLES 360 // must be divisable by 4
-#define ANGLEQUAD (ANGLES/4)
-#define FINEANGLES 3600
-#define ANG90 (FINEANGLES/4)
-#define ANG180 (ANG90*2)
-#define ANG270 (ANG90*3)
-#define ANG360 (ANG90*4)
-#define VANG90 (ANGLES/4)
-#define VANG180 (VANG90*2)
-#define VANG270 (VANG90*3)
-#define VANG360 (VANG90*4)
-
-#define MINDIST (0x5800l)
-
-
-#define MAXSCALEHEIGHT 256 // largest scale on largest view
-
-#define MAXVIEWWIDTH 320
-
-#define MAPSIZE 64 // maps are 64*64 max
-#define NORTH 0
-#define EAST 1
-#define SOUTH 2
-#define WEST 3
-
-
-#define STATUSLINES 40
-
-#define SCREENSIZE (SCREENBWIDE*208)
-#define PAGE1START 0
-#define PAGE2START (SCREENSIZE)
-#define PAGE3START (SCREENSIZE*2u)
-#define FREESTART (SCREENSIZE*3u)
-
-
-#define PIXRADIUS 512
-
-#define STARTAMMO 8
-
-
-// object flag values
-
-#define FL_SHOOTABLE 1
-#define FL_BONUS 2
-#define FL_NEVERMARK 4
-#define FL_VISABLE 8
-#define FL_ATTACKMODE 16
-#define FL_FIRSTATTACK 32
-#define FL_AMBUSH 64
-#define FL_NONMARK 128
-
-
-//
-// sprite constants
-//
-
-enum {
- SPR_DEMO,
- SPR_DEATHCAM,
-//
-// static sprites
-//
- SPR_STAT_0,SPR_STAT_1,SPR_STAT_2,SPR_STAT_3,
- SPR_STAT_4,SPR_STAT_5,SPR_STAT_6,SPR_STAT_7,
-
- SPR_STAT_8,SPR_STAT_9,SPR_STAT_10,SPR_STAT_11,
- SPR_STAT_12,SPR_STAT_13,SPR_STAT_14,SPR_STAT_15,
-
- SPR_STAT_16,SPR_STAT_17,SPR_STAT_18,SPR_STAT_19,
- SPR_STAT_20,SPR_STAT_21,SPR_STAT_22,SPR_STAT_23,
-
- SPR_STAT_24,SPR_STAT_25,SPR_STAT_26,SPR_STAT_27,
- SPR_STAT_28,SPR_STAT_29,SPR_STAT_30,SPR_STAT_31,
-
- SPR_STAT_32,SPR_STAT_33,SPR_STAT_34,SPR_STAT_35,
- SPR_STAT_36,SPR_STAT_37,SPR_STAT_38,SPR_STAT_39,
-
- SPR_STAT_40,SPR_STAT_41,SPR_STAT_42,SPR_STAT_43,
- SPR_STAT_44,SPR_STAT_45,SPR_STAT_46,SPR_STAT_47,
-
-#ifdef SPEAR
- SPR_STAT_48,SPR_STAT_49,SPR_STAT_50,SPR_STAT_51,
-#endif
-
-//
-// guard
-//
- SPR_GRD_S_1,SPR_GRD_S_2,SPR_GRD_S_3,SPR_GRD_S_4,
- SPR_GRD_S_5,SPR_GRD_S_6,SPR_GRD_S_7,SPR_GRD_S_8,
-
- SPR_GRD_W1_1,SPR_GRD_W1_2,SPR_GRD_W1_3,SPR_GRD_W1_4,
- SPR_GRD_W1_5,SPR_GRD_W1_6,SPR_GRD_W1_7,SPR_GRD_W1_8,
-
- SPR_GRD_W2_1,SPR_GRD_W2_2,SPR_GRD_W2_3,SPR_GRD_W2_4,
- SPR_GRD_W2_5,SPR_GRD_W2_6,SPR_GRD_W2_7,SPR_GRD_W2_8,
-
- SPR_GRD_W3_1,SPR_GRD_W3_2,SPR_GRD_W3_3,SPR_GRD_W3_4,
- SPR_GRD_W3_5,SPR_GRD_W3_6,SPR_GRD_W3_7,SPR_GRD_W3_8,
-
- SPR_GRD_W4_1,SPR_GRD_W4_2,SPR_GRD_W4_3,SPR_GRD_W4_4,
- SPR_GRD_W4_5,SPR_GRD_W4_6,SPR_GRD_W4_7,SPR_GRD_W4_8,
-
- SPR_GRD_PAIN_1,SPR_GRD_DIE_1,SPR_GRD_DIE_2,SPR_GRD_DIE_3,
- SPR_GRD_PAIN_2,SPR_GRD_DEAD,
-
- SPR_GRD_SHOOT1,SPR_GRD_SHOOT2,SPR_GRD_SHOOT3,
-
-//
-// dogs
-//
- SPR_DOG_W1_1,SPR_DOG_W1_2,SPR_DOG_W1_3,SPR_DOG_W1_4,
- SPR_DOG_W1_5,SPR_DOG_W1_6,SPR_DOG_W1_7,SPR_DOG_W1_8,
-
- SPR_DOG_W2_1,SPR_DOG_W2_2,SPR_DOG_W2_3,SPR_DOG_W2_4,
- SPR_DOG_W2_5,SPR_DOG_W2_6,SPR_DOG_W2_7,SPR_DOG_W2_8,
-
- SPR_DOG_W3_1,SPR_DOG_W3_2,SPR_DOG_W3_3,SPR_DOG_W3_4,
- SPR_DOG_W3_5,SPR_DOG_W3_6,SPR_DOG_W3_7,SPR_DOG_W3_8,
-
- SPR_DOG_W4_1,SPR_DOG_W4_2,SPR_DOG_W4_3,SPR_DOG_W4_4,
- SPR_DOG_W4_5,SPR_DOG_W4_6,SPR_DOG_W4_7,SPR_DOG_W4_8,
-
- SPR_DOG_DIE_1,SPR_DOG_DIE_2,SPR_DOG_DIE_3,SPR_DOG_DEAD,
- SPR_DOG_JUMP1,SPR_DOG_JUMP2,SPR_DOG_JUMP3,
-
-
-
-//
-// ss
-//
- SPR_SS_S_1,SPR_SS_S_2,SPR_SS_S_3,SPR_SS_S_4,
- SPR_SS_S_5,SPR_SS_S_6,SPR_SS_S_7,SPR_SS_S_8,
-
- SPR_SS_W1_1,SPR_SS_W1_2,SPR_SS_W1_3,SPR_SS_W1_4,
- SPR_SS_W1_5,SPR_SS_W1_6,SPR_SS_W1_7,SPR_SS_W1_8,
-
- SPR_SS_W2_1,SPR_SS_W2_2,SPR_SS_W2_3,SPR_SS_W2_4,
- SPR_SS_W2_5,SPR_SS_W2_6,SPR_SS_W2_7,SPR_SS_W2_8,
-
- SPR_SS_W3_1,SPR_SS_W3_2,SPR_SS_W3_3,SPR_SS_W3_4,
- SPR_SS_W3_5,SPR_SS_W3_6,SPR_SS_W3_7,SPR_SS_W3_8,
-
- SPR_SS_W4_1,SPR_SS_W4_2,SPR_SS_W4_3,SPR_SS_W4_4,
- SPR_SS_W4_5,SPR_SS_W4_6,SPR_SS_W4_7,SPR_SS_W4_8,
-
- SPR_SS_PAIN_1,SPR_SS_DIE_1,SPR_SS_DIE_2,SPR_SS_DIE_3,
- SPR_SS_PAIN_2,SPR_SS_DEAD,
-
- SPR_SS_SHOOT1,SPR_SS_SHOOT2,SPR_SS_SHOOT3,
-
-//
-// mutant
-//
- SPR_MUT_S_1,SPR_MUT_S_2,SPR_MUT_S_3,SPR_MUT_S_4,
- SPR_MUT_S_5,SPR_MUT_S_6,SPR_MUT_S_7,SPR_MUT_S_8,
-
- SPR_MUT_W1_1,SPR_MUT_W1_2,SPR_MUT_W1_3,SPR_MUT_W1_4,
- SPR_MUT_W1_5,SPR_MUT_W1_6,SPR_MUT_W1_7,SPR_MUT_W1_8,
-
- SPR_MUT_W2_1,SPR_MUT_W2_2,SPR_MUT_W2_3,SPR_MUT_W2_4,
- SPR_MUT_W2_5,SPR_MUT_W2_6,SPR_MUT_W2_7,SPR_MUT_W2_8,
-
- SPR_MUT_W3_1,SPR_MUT_W3_2,SPR_MUT_W3_3,SPR_MUT_W3_4,
- SPR_MUT_W3_5,SPR_MUT_W3_6,SPR_MUT_W3_7,SPR_MUT_W3_8,
-
- SPR_MUT_W4_1,SPR_MUT_W4_2,SPR_MUT_W4_3,SPR_MUT_W4_4,
- SPR_MUT_W4_5,SPR_MUT_W4_6,SPR_MUT_W4_7,SPR_MUT_W4_8,
-
- SPR_MUT_PAIN_1,SPR_MUT_DIE_1,SPR_MUT_DIE_2,SPR_MUT_DIE_3,
- SPR_MUT_PAIN_2,SPR_MUT_DIE_4,SPR_MUT_DEAD,
-
- SPR_MUT_SHOOT1,SPR_MUT_SHOOT2,SPR_MUT_SHOOT3,SPR_MUT_SHOOT4,
-
-//
-// officer
-//
- SPR_OFC_S_1,SPR_OFC_S_2,SPR_OFC_S_3,SPR_OFC_S_4,
- SPR_OFC_S_5,SPR_OFC_S_6,SPR_OFC_S_7,SPR_OFC_S_8,
-
- SPR_OFC_W1_1,SPR_OFC_W1_2,SPR_OFC_W1_3,SPR_OFC_W1_4,
- SPR_OFC_W1_5,SPR_OFC_W1_6,SPR_OFC_W1_7,SPR_OFC_W1_8,
-
- SPR_OFC_W2_1,SPR_OFC_W2_2,SPR_OFC_W2_3,SPR_OFC_W2_4,
- SPR_OFC_W2_5,SPR_OFC_W2_6,SPR_OFC_W2_7,SPR_OFC_W2_8,
-
- SPR_OFC_W3_1,SPR_OFC_W3_2,SPR_OFC_W3_3,SPR_OFC_W3_4,
- SPR_OFC_W3_5,SPR_OFC_W3_6,SPR_OFC_W3_7,SPR_OFC_W3_8,
-
- SPR_OFC_W4_1,SPR_OFC_W4_2,SPR_OFC_W4_3,SPR_OFC_W4_4,
- SPR_OFC_W4_5,SPR_OFC_W4_6,SPR_OFC_W4_7,SPR_OFC_W4_8,
-
- SPR_OFC_PAIN_1,SPR_OFC_DIE_1,SPR_OFC_DIE_2,SPR_OFC_DIE_3,
- SPR_OFC_PAIN_2,SPR_OFC_DIE_4,SPR_OFC_DEAD,
-
- SPR_OFC_SHOOT1,SPR_OFC_SHOOT2,SPR_OFC_SHOOT3,
-
-#ifndef SPEAR
-//
-// ghosts
-//
- SPR_BLINKY_W1,SPR_BLINKY_W2,SPR_PINKY_W1,SPR_PINKY_W2,
- SPR_CLYDE_W1,SPR_CLYDE_W2,SPR_INKY_W1,SPR_INKY_W2,
-
-//
-// hans
-//
- SPR_BOSS_W1,SPR_BOSS_W2,SPR_BOSS_W3,SPR_BOSS_W4,
- SPR_BOSS_SHOOT1,SPR_BOSS_SHOOT2,SPR_BOSS_SHOOT3,SPR_BOSS_DEAD,
-
- SPR_BOSS_DIE1,SPR_BOSS_DIE2,SPR_BOSS_DIE3,
-
-//
-// schabbs
-//
- SPR_SCHABB_W1,SPR_SCHABB_W2,SPR_SCHABB_W3,SPR_SCHABB_W4,
- SPR_SCHABB_SHOOT1,SPR_SCHABB_SHOOT2,
-
- SPR_SCHABB_DIE1,SPR_SCHABB_DIE2,SPR_SCHABB_DIE3,SPR_SCHABB_DEAD,
- SPR_HYPO1,SPR_HYPO2,SPR_HYPO3,SPR_HYPO4,
-
-//
-// fake
-//
- SPR_FAKE_W1,SPR_FAKE_W2,SPR_FAKE_W3,SPR_FAKE_W4,
- SPR_FAKE_SHOOT,SPR_FIRE1,SPR_FIRE2,
-
- SPR_FAKE_DIE1,SPR_FAKE_DIE2,SPR_FAKE_DIE3,SPR_FAKE_DIE4,
- SPR_FAKE_DIE5,SPR_FAKE_DEAD,
-
-//
-// hitler
-//
- SPR_MECHA_W1,SPR_MECHA_W2,SPR_MECHA_W3,SPR_MECHA_W4,
- SPR_MECHA_SHOOT1,SPR_MECHA_SHOOT2,SPR_MECHA_SHOOT3,SPR_MECHA_DEAD,
-
- SPR_MECHA_DIE1,SPR_MECHA_DIE2,SPR_MECHA_DIE3,
-
- SPR_HITLER_W1,SPR_HITLER_W2,SPR_HITLER_W3,SPR_HITLER_W4,
- SPR_HITLER_SHOOT1,SPR_HITLER_SHOOT2,SPR_HITLER_SHOOT3,SPR_HITLER_DEAD,
-
- SPR_HITLER_DIE1,SPR_HITLER_DIE2,SPR_HITLER_DIE3,SPR_HITLER_DIE4,
- SPR_HITLER_DIE5,SPR_HITLER_DIE6,SPR_HITLER_DIE7,
-
-//
-// giftmacher
-//
- SPR_GIFT_W1,SPR_GIFT_W2,SPR_GIFT_W3,SPR_GIFT_W4,
- SPR_GIFT_SHOOT1,SPR_GIFT_SHOOT2,
-
- SPR_GIFT_DIE1,SPR_GIFT_DIE2,SPR_GIFT_DIE3,SPR_GIFT_DEAD,
-#endif
-//
-// Rocket, smoke and small explosion
-//
- SPR_ROCKET_1,SPR_ROCKET_2,SPR_ROCKET_3,SPR_ROCKET_4,
- SPR_ROCKET_5,SPR_ROCKET_6,SPR_ROCKET_7,SPR_ROCKET_8,
-
- SPR_SMOKE_1,SPR_SMOKE_2,SPR_SMOKE_3,SPR_SMOKE_4,
- SPR_BOOM_1,SPR_BOOM_2,SPR_BOOM_3,
-
-//
-// Angel of Death's DeathSparks(tm)
-//
-#ifdef SPEAR
- SPR_HROCKET_1,SPR_HROCKET_2,SPR_HROCKET_3,SPR_HROCKET_4,
- SPR_HROCKET_5,SPR_HROCKET_6,SPR_HROCKET_7,SPR_HROCKET_8,
-
- SPR_HSMOKE_1,SPR_HSMOKE_2,SPR_HSMOKE_3,SPR_HSMOKE_4,
- SPR_HBOOM_1,SPR_HBOOM_2,SPR_HBOOM_3,
-
- SPR_SPARK1,SPR_SPARK2,SPR_SPARK3,SPR_SPARK4,
-#endif
-
-#ifndef SPEAR
-//
-// gretel
-//
- SPR_GRETEL_W1,SPR_GRETEL_W2,SPR_GRETEL_W3,SPR_GRETEL_W4,
- SPR_GRETEL_SHOOT1,SPR_GRETEL_SHOOT2,SPR_GRETEL_SHOOT3,SPR_GRETEL_DEAD,
-
- SPR_GRETEL_DIE1,SPR_GRETEL_DIE2,SPR_GRETEL_DIE3,
-
-//
-// fat face
-//
- SPR_FAT_W1,SPR_FAT_W2,SPR_FAT_W3,SPR_FAT_W4,
- SPR_FAT_SHOOT1,SPR_FAT_SHOOT2,SPR_FAT_SHOOT3,SPR_FAT_SHOOT4,
-
- SPR_FAT_DIE1,SPR_FAT_DIE2,SPR_FAT_DIE3,SPR_FAT_DEAD,
-
-//
-// bj
-//
- SPR_BJ_W1,SPR_BJ_W2,SPR_BJ_W3,SPR_BJ_W4,
- SPR_BJ_JUMP1,SPR_BJ_JUMP2,SPR_BJ_JUMP3,SPR_BJ_JUMP4,
-#else
-//
-// THESE ARE FOR 'SPEAR OF DESTINY'
-//
-
-//
-// Trans Grosse
-//
- SPR_TRANS_W1,SPR_TRANS_W2,SPR_TRANS_W3,SPR_TRANS_W4,
- SPR_TRANS_SHOOT1,SPR_TRANS_SHOOT2,SPR_TRANS_SHOOT3,SPR_TRANS_DEAD,
-
- SPR_TRANS_DIE1,SPR_TRANS_DIE2,SPR_TRANS_DIE3,
-
-//
-// Wilhelm
-//
- SPR_WILL_W1,SPR_WILL_W2,SPR_WILL_W3,SPR_WILL_W4,
- SPR_WILL_SHOOT1,SPR_WILL_SHOOT2,SPR_WILL_SHOOT3,SPR_WILL_SHOOT4,
-
- SPR_WILL_DIE1,SPR_WILL_DIE2,SPR_WILL_DIE3,SPR_WILL_DEAD,
-
-//
-// UberMutant
-//
- SPR_UBER_W1,SPR_UBER_W2,SPR_UBER_W3,SPR_UBER_W4,
- SPR_UBER_SHOOT1,SPR_UBER_SHOOT2,SPR_UBER_SHOOT3,SPR_UBER_SHOOT4,
-
- SPR_UBER_DIE1,SPR_UBER_DIE2,SPR_UBER_DIE3,SPR_UBER_DIE4,
- SPR_UBER_DEAD,
-
-//
-// Death Knight
-//
- SPR_DEATH_W1,SPR_DEATH_W2,SPR_DEATH_W3,SPR_DEATH_W4,
- SPR_DEATH_SHOOT1,SPR_DEATH_SHOOT2,SPR_DEATH_SHOOT3,SPR_DEATH_SHOOT4,
-
- SPR_DEATH_DIE1,SPR_DEATH_DIE2,SPR_DEATH_DIE3,SPR_DEATH_DIE4,
- SPR_DEATH_DIE5,SPR_DEATH_DIE6,SPR_DEATH_DEAD,
-
-//
-// Ghost
-//
- SPR_SPECTRE_W1,SPR_SPECTRE_W2,SPR_SPECTRE_W3,SPR_SPECTRE_W4,
- SPR_SPECTRE_F1,SPR_SPECTRE_F2,SPR_SPECTRE_F3,SPR_SPECTRE_F4,
-
-//
-// Angel of Death
-//
- SPR_ANGEL_W1,SPR_ANGEL_W2,SPR_ANGEL_W3,SPR_ANGEL_W4,
- SPR_ANGEL_SHOOT1,SPR_ANGEL_SHOOT2,SPR_ANGEL_TIRED1,SPR_ANGEL_TIRED2,
-
- SPR_ANGEL_DIE1,SPR_ANGEL_DIE2,SPR_ANGEL_DIE3,SPR_ANGEL_DIE4,
- SPR_ANGEL_DIE5,SPR_ANGEL_DIE6,SPR_ANGEL_DIE7,SPR_ANGEL_DEAD,
-
-#endif
-
-//
-// player attack frames
-//
- SPR_KNIFEREADY,SPR_KNIFEATK1,SPR_KNIFEATK2,SPR_KNIFEATK3,
- SPR_KNIFEATK4,
-
- SPR_PISTOLREADY,SPR_PISTOLATK1,SPR_PISTOLATK2,SPR_PISTOLATK3,
- SPR_PISTOLATK4,
-
- SPR_MACHINEGUNREADY,SPR_MACHINEGUNATK1,SPR_MACHINEGUNATK2,MACHINEGUNATK3,
- SPR_MACHINEGUNATK4,
-
- SPR_CHAINREADY,SPR_CHAINATK1,SPR_CHAINATK2,SPR_CHAINATK3,
- SPR_CHAINATK4,
-
- };
-
-
-/*
-=============================================================================
-
- GLOBAL TYPES
-
-=============================================================================
-*/
-
-typedef long fixed;
-
-typedef enum {
- di_north,
- di_east,
- di_south,
- di_west
-} controldir_t;
-
-typedef enum {
- dr_normal,
- dr_lock1,
- dr_lock2,
- dr_lock3,
- dr_lock4,
- dr_elevator
-} door_t;
-
-typedef enum {
- ac_badobject = -1,
- ac_no,
- ac_yes,
- ac_allways
-} activetype;
-
-typedef enum {
- nothing,
- playerobj,
- inertobj,
- guardobj,
- officerobj,
- ssobj,
- dogobj,
- bossobj,
- schabbobj,
- fakeobj,
- mechahitlerobj,
- mutantobj,
- needleobj,
- fireobj,
- bjobj,
- ghostobj,
- realhitlerobj,
- gretelobj,
- giftobj,
- fatobj,
- rocketobj,
-
- spectreobj,
- angelobj,
- transobj,
- uberobj,
- willobj,
- deathobj,
- hrocketobj,
- sparkobj
-} classtype;
-
-typedef enum {
- dressing,
- block,
- bo_gibs,
- bo_alpo,
- bo_firstaid,
- bo_key1,
- bo_key2,
- bo_key3,
- bo_key4,
- bo_cross,
- bo_chalice,
- bo_bible,
- bo_crown,
- bo_clip,
- bo_clip2,
- bo_machinegun,
- bo_chaingun,
- bo_food,
- bo_fullheal,
- bo_25clip,
- bo_spear
-} stat_t;
-
-typedef enum {
- east,
- northeast,
- north,
- northwest,
- west,
- southwest,
- south,
- southeast,
- nodir
-} dirtype;
-
-
-#define NUMENEMIES 22
-typedef enum {
- en_guard,
- en_officer,
- en_ss,
- en_dog,
- en_boss,
- en_schabbs,
- en_fake,
- en_hitler,
- en_mutant,
- en_blinky,
- en_clyde,
- en_pinky,
- en_inky,
- en_gretel,
- en_gift,
- en_fat,
- en_spectre,
- en_angel,
- en_trans,
- en_uber,
- en_will,
- en_death
-} enemy_t;
-
-
-typedef struct statestruct
-{
- boolean rotate;
- int shapenum; // a shapenum of -1 means get from ob->temp1
- int tictime;
- void (*think) (),(*action) ();
- struct statestruct *next;
-} statetype;
-
-
-//---------------------
-//
-// trivial actor structure
-//
-//---------------------
-
-typedef struct statstruct
-{
- byte tilex,tiley;
- byte *visspot;
- int shapenum; // if shapenum == -1 the obj has been removed
- byte flags;
- byte itemnumber;
-} statobj_t;
-
-
-//---------------------
-//
-// door actor structure
-//
-//---------------------
-
-typedef struct doorstruct
-{
- byte tilex,tiley;
- boolean vertical;
- byte lock;
- enum {dr_open,dr_closed,dr_opening,dr_closing} action;
- int ticcount;
-} doorobj_t;
-
-
-//--------------------
-//
-// thinking actor structure
-//
-//--------------------
-
-typedef struct objstruct
-{
- activetype active;
- int ticcount;
- classtype obclass;
- statetype *state;
-
- byte flags; // FL_SHOOTABLE, etc
-
- long distance; // if negative, wait for that door to open
- dirtype dir;
-
- fixed x,y;
- unsigned tilex,tiley;
- byte areanumber;
-
- int viewx;
- unsigned viewheight;
- fixed transx,transy; // in global coord
-
- int angle;
- int hitpoints;
- long speed;
-
- int temp1,temp2,temp3;
- struct objstruct *next,*prev;
-} objtype;
-
-
-#define NUMBUTTONS 8
-enum {
- bt_nobutton=-1,
- bt_attack=0,
- bt_strafe,
- bt_run,
- bt_use,
- bt_readyknife,
- bt_readypistol,
- bt_readymachinegun,
- bt_readychaingun
-};
-
-
-#define NUMWEAPONS 5
-typedef enum {
- wp_knife,
- wp_pistol,
- wp_machinegun,
- wp_chaingun
-} weapontype;
-
-
-typedef enum {
- gd_baby,
- gd_easy,
- gd_medium,
- gd_hard
-};
-
-//---------------
-//
-// gamestate structure
-//
-//---------------
-
-typedef struct
-{
- int difficulty;
- int mapon;
- long oldscore,score,nextextra;
- int lives;
- int health;
- int ammo;
- int keys;
- weapontype bestweapon,weapon,chosenweapon;
-
- int faceframe;
- int attackframe,attackcount,weaponframe;
-
- int episode,secretcount,treasurecount,killcount,
- secrettotal,treasuretotal,killtotal;
- long TimeCount;
- long killx,killy;
- boolean victoryflag; // set during victory animations
-} gametype;
-
-
-typedef enum {
- ex_stillplaying,
- ex_completed,
- ex_died,
- ex_warped,
- ex_resetgame,
- ex_loadedgame,
- ex_victorious,
- ex_abort,
- ex_demodone,
- ex_secretlevel
-} exit_t;
-
-
-/*
-=============================================================================
-
- WL_MAIN DEFINITIONS
-
-=============================================================================
-*/
-
-extern boolean MS_CheckParm (char far *string);
-
-extern char str[80],str2[20];
-extern int tedlevelnum;
-extern boolean tedlevel;
-extern boolean nospr;
-extern boolean IsA386;
-
-extern byte far *scalermemory;
-
-extern fixed focallength;
-extern unsigned viewangles;
-extern unsigned screenofs;
-extern int viewwidth;
-extern int viewheight;
-extern int centerx;
-extern int shootdelta;
-
-extern int dirangle[9];
-
-extern boolean startgame,loadedgame,virtualreality;
-extern int mouseadjustment;
-//
-// math tables
-//
-extern int pixelangle[MAXVIEWWIDTH];
-extern long far finetangent[FINEANGLES/4];
-extern fixed far sintable[],far *costable;
-
-//
-// derived constants
-//
-extern fixed scale,maxslope;
-extern long heightnumerator;
-extern int minheightdiv;
-
-extern char configname[13];
-
-
-
-void HelpScreens (void);
-void OrderingInfo (void);
-void TEDDeath(void);
-void Quit (char *error);
-void CalcProjection (long focal);
-boolean SetViewSize (unsigned width, unsigned height);
-void NewGame (int difficulty,int episode);
-void NewViewSize (int width);
-boolean LoadTheGame(int file,int x,int y);
-boolean SaveTheGame(int file,int x,int y);
-void ShowViewSize (int width);
-void ShutdownId (void);
-
-
-/*
-=============================================================================
-
- WL_GAME DEFINITIONS
-
-=============================================================================
-*/
-
-
-extern boolean ingame,fizzlein;
-extern unsigned latchpics[NUMLATCHPICS];
-extern gametype gamestate;
-extern int doornum;
-
-extern char demoname[13];
-
-extern long spearx,speary;
-extern unsigned spearangle;
-extern boolean spearflag;
-
-
-void DrawPlayBorder (void);
-void ScanInfoPlane (void);
-void SetupGameLevel (void);
-void NormalScreen (void);
-void DrawPlayScreen (void);
-void FizzleOut (void);
-void GameLoop (void);
-void ClearMemory (void);
-void PlayDemo (int demonumber);
-void RecordDemo (void);
-void DrawAllPlayBorder (void);
-void DrawHighScores(void);
-void DrawAllPlayBorderSides (void);
-
-
-// JAB
-#define PlaySoundLocTile(s,tx,ty) PlaySoundLocGlobal(s,(((long)(tx) << TILESHIFT) + (1L << (TILESHIFT - 1))),(((long)ty << TILESHIFT) + (1L << (TILESHIFT - 1))))
-#define PlaySoundLocActor(s,ob) PlaySoundLocGlobal(s,(ob)->x,(ob)->y)
-void PlaySoundLocGlobal(word s,fixed gx,fixed gy);
-void UpdateSoundLoc(void);
-
-
-/*
-=============================================================================
-
- WL_PLAY DEFINITIONS
-
-=============================================================================
-*/
-
-#ifdef SPEAR
-extern long funnyticount; // FOR FUNNY BJ FACE
-#endif
-
-extern exit_t playstate;
-
-extern boolean madenoise;
-
-extern objtype objlist[MAXACTORS],*new,*obj,*player,*lastobj,
- *objfreelist,*killerobj;
-extern statobj_t statobjlist[MAXSTATS],*laststatobj;
-extern doorobj_t doorobjlist[MAXDOORS],*lastdoorobj;
-
-extern unsigned farmapylookup[MAPSIZE];
-extern byte *nearmapylookup[MAPSIZE];
-
-extern byte tilemap[MAPSIZE][MAPSIZE]; // wall values only
-extern byte spotvis[MAPSIZE][MAPSIZE];
-extern objtype *actorat[MAPSIZE][MAPSIZE];
-
-#define UPDATESIZE (UPDATEWIDE*UPDATEHIGH)
-extern byte update[UPDATESIZE];
-
-extern boolean singlestep,godmode,noclip;
-extern int extravbls;
-
-//
-// control info
-//
-extern boolean mouseenabled,joystickenabled,joypadenabled,joystickprogressive;
-extern int joystickport;
-extern int dirscan[4];
-extern int buttonscan[NUMBUTTONS];
-extern int buttonmouse[4];
-extern int buttonjoy[4];
-
-extern boolean buttonheld[NUMBUTTONS];
-
-extern int viewsize;
-
-//
-// curent user input
-//
-extern int controlx,controly; // range from -100 to 100
-extern boolean buttonstate[NUMBUTTONS];
-
-extern boolean demorecord,demoplayback;
-extern char far *demoptr, far *lastdemoptr;
-extern memptr demobuffer;
-
-
-
-void InitRedShifts (void);
-void FinishPaletteShifts (void);
-
-void CenterWindow(word w,word h);
-void InitActorList (void);
-void GetNewActor (void);
-void RemoveObj (objtype *gone);
-void PollControls (void);
-void StopMusic(void);
-void StartMusic(void);
-void PlayLoop (void);
-void StartDamageFlash (int damage);
-void StartBonusFlash (void);
-
-/*
-=============================================================================
-
- WL_INTER
-
-=============================================================================
-*/
-
-void IntroScreen (void);
-void PreloadGraphics(void);
-void LevelCompleted (void);
-void CheckHighScore (long score,word other);
-void Victory (void);
-void ClearSplitVWB (void);
-
-
-/*
-=============================================================================
-
- WL_DEBUG
-
-=============================================================================
-*/
-
-int DebugKeys (void);
-void PicturePause (void);
-
-
-/*
-=============================================================================
-
- WL_DRAW DEFINITIONS
-
-=============================================================================
-*/
-
-extern unsigned screenloc[3];
-extern unsigned freelatch;
-
-extern long lasttimecount;
-extern long frameon;
-extern boolean fizzlein;
-
-extern unsigned wallheight[MAXVIEWWIDTH];
-
-extern fixed tileglobal;
-extern fixed focallength;
-extern fixed mindist;
-
-//
-// math tables
-//
-extern int pixelangle[MAXVIEWWIDTH];
-extern long far finetangent[FINEANGLES/4];
-extern fixed far sintable[],far *costable;
-
-//
-// derived constants
-//
-extern fixed scale;
-extern long heightnumerator,mindist;
-
-//
-// refresh variables
-//
-extern fixed viewx,viewy; // the focal point
-extern int viewangle;
-extern fixed viewsin,viewcos;
-
-extern long postsource;
-extern unsigned postx;
-extern unsigned postwidth;
-
-
-extern int horizwall[],vertwall[];
-
-extern unsigned pwallpos;
-
-
-fixed FixedByFrac (fixed a, fixed b);
-void TransformActor (objtype *ob);
-void BuildTables (void);
-void ClearScreen (void);
-int CalcRotate (objtype *ob);
-void DrawScaleds (void);
-void CalcTics (void);
-void FixOfs (void);
-void ThreeDRefresh (void);
-void FarScalePost (void);
-
-/*
-=============================================================================
-
- WL_STATE DEFINITIONS
-
-=============================================================================
-*/
-#define TURNTICS 10
-#define SPDPATROL 512
-#define SPDDOG 1500
-
-
-extern dirtype opposite[9];
-extern dirtype diagonal[9][9];
-
-
-void InitHitRect (objtype *ob, unsigned radius);
-void SpawnNewObj (unsigned tilex, unsigned tiley, statetype *state);
-void NewState (objtype *ob, statetype *state);
-
-boolean TryWalk (objtype *ob);
-void SelectChaseDir (objtype *ob);
-void SelectDodgeDir (objtype *ob);
-void SelectRunDir (objtype *ob);
-void MoveObj (objtype *ob, long move);
-boolean SightPlayer (objtype *ob);
-
-void KillActor (objtype *ob);
-void DamageActor (objtype *ob, unsigned damage);
-
-boolean CheckLine (objtype *ob);
-boolean CheckSight (objtype *ob);
-
-
-/*
-=============================================================================
-
- WL_SCALE DEFINITIONS
-
-=============================================================================
-*/
-
-
-#define COMPSCALECODESTART (65*4) // offset to start of code in comp scaler
-
-typedef struct
-{
- unsigned codeofs[65];
- unsigned width[65];
- byte code[];
-} t_compscale;
-
-typedef struct
-{
- unsigned leftpix,rightpix;
- unsigned dataofs[64];
-// table data after dataofs[rightpix-leftpix+1]
-} t_compshape;
-
-
-extern t_compscale _seg *scaledirectory[MAXSCALEHEIGHT+1];
-extern long fullscalefarcall[MAXSCALEHEIGHT+1];
-
-extern byte bitmasks1[8][8];
-extern byte bitmasks2[8][8];
-extern unsigned wordmasks[8][8];
-
-extern byte mapmasks1[4][8];
-extern byte mapmasks2[4][8];
-extern byte mapmasks3[4][8];
-
-extern int maxscale,maxscaleshl2;
-
-extern boolean insetupscaling;
-
-void SetupScaling (int maxscaleheight);
-void ScaleShape (int xcenter, int shapenum, unsigned height);
-void SimpleScaleShape (int xcenter, int shapenum, unsigned height);
-
-/*
-=============================================================================
-
- WL_AGENT DEFINITIONS
-
-=============================================================================
-*/
-
-//
-// player state info
-//
-extern boolean running;
-extern long thrustspeed;
-extern unsigned plux,pluy; // player coordinates scaled to unsigned
-
-extern int anglefrac;
-extern int facecount;
-
-void SpawnPlayer (int tilex, int tiley, int dir);
-void DrawFace (void);
-void DrawHealth (void);
-void TakeDamage (int points,objtype *attacker);
-void HealSelf (int points);
-void DrawLevel (void);
-void DrawLives (void);
-void GiveExtraMan (void);
-void DrawScore (void);
-void GivePoints (long points);
-void DrawWeapon (void);
-void DrawKeys (void);
-void GiveWeapon (int weapon);
-void DrawAmmo (void);
-void GiveAmmo (int ammo);
-void GiveKey (int key);
-void GetBonus (statobj_t *check);
-
-void Thrust (int angle, long speed);
-
-/*
-=============================================================================
-
- WL_ACT1 DEFINITIONS
-
-=============================================================================
-*/
-
-extern doorobj_t doorobjlist[MAXDOORS],*lastdoorobj;
-extern int doornum;
-
-extern unsigned doorposition[MAXDOORS],pwallstate;
-
-extern byte far areaconnect[NUMAREAS][NUMAREAS];
-
-extern boolean areabyplayer[NUMAREAS];
-
-extern unsigned pwallstate;
-extern unsigned pwallpos; // amount a pushable wall has been moved (0-63)
-extern unsigned pwallx,pwally;
-extern int pwalldir;
-
-
-void InitDoorList (void);
-void InitStaticList (void);
-void SpawnStatic (int tilex, int tiley, int type);
-void SpawnDoor (int tilex, int tiley, boolean vertical, int lock);
-void MoveDoors (void);
-void MovePWalls (void);
-void OpenDoor (int door);
-void PlaceItemType (int itemtype, int tilex, int tiley);
-void PushWall (int checkx, int checky, int dir);
-void OperateDoor (int door);
-void InitAreas (void);
-
-/*
-=============================================================================
-
- WL_ACT2 DEFINITIONS
-
-=============================================================================
-*/
-
-#define s_nakedbody s_static10
-
-extern statetype s_grddie1;
-extern statetype s_dogdie1;
-extern statetype s_ofcdie1;
-extern statetype s_mutdie1;
-extern statetype s_ssdie1;
-extern statetype s_bossdie1;
-extern statetype s_schabbdie1;
-extern statetype s_fakedie1;
-extern statetype s_mechadie1;
-extern statetype s_hitlerdie1;
-extern statetype s_greteldie1;
-extern statetype s_giftdie1;
-extern statetype s_fatdie1;
-
-extern statetype s_spectredie1;
-extern statetype s_angeldie1;
-extern statetype s_transdie0;
-extern statetype s_uberdie0;
-extern statetype s_willdie1;
-extern statetype s_deathdie1;
-
-
-extern statetype s_grdchase1;
-extern statetype s_dogchase1;
-extern statetype s_ofcchase1;
-extern statetype s_sschase1;
-extern statetype s_mutchase1;
-extern statetype s_bosschase1;
-extern statetype s_schabbchase1;
-extern statetype s_fakechase1;
-extern statetype s_mechachase1;
-extern statetype s_gretelchase1;
-extern statetype s_giftchase1;
-extern statetype s_fatchase1;
-
-extern statetype s_spectrechase1;
-extern statetype s_angelchase1;
-extern statetype s_transchase1;
-extern statetype s_uberchase1;
-extern statetype s_willchase1;
-extern statetype s_deathchase1;
-
-extern statetype s_blinkychase1;
-extern statetype s_hitlerchase1;
-
-extern statetype s_grdpain;
-extern statetype s_grdpain1;
-extern statetype s_ofcpain;
-extern statetype s_ofcpain1;
-extern statetype s_sspain;
-extern statetype s_sspain1;
-extern statetype s_mutpain;
-extern statetype s_mutpain1;
-
-extern statetype s_deathcam;
-
-extern statetype s_schabbdeathcam2;
-extern statetype s_hitlerdeathcam2;
-extern statetype s_giftdeathcam2;
-extern statetype s_fatdeathcam2;
-
-void SpawnStand (enemy_t which, int tilex, int tiley, int dir);
-void SpawnPatrol (enemy_t which, int tilex, int tiley, int dir);
-void KillActor (objtype *ob);
-
-void US_ControlPanel(byte);
-
-void SpawnDeadGuard (int tilex, int tiley);
-void SpawnBoss (int tilex, int tiley);
-void SpawnGretel (int tilex, int tiley);
-void SpawnTrans (int tilex, int tiley);
-void SpawnUber (int tilex, int tiley);
-void SpawnWill (int tilex, int tiley);
-void SpawnDeath (int tilex, int tiley);
-void SpawnAngel (int tilex, int tiley);
-void SpawnSpectre (int tilex, int tiley);
-void SpawnGhosts (int which, int tilex, int tiley);
-void SpawnSchabbs (int tilex, int tiley);
-void SpawnGift (int tilex, int tiley);
-void SpawnFat (int tilex, int tiley);
-void SpawnFakeHitler (int tilex, int tiley);
-void SpawnHitler (int tilex, int tiley);
-
-/*
-=============================================================================
-
- WL_TEXT DEFINITIONS
-
-=============================================================================
-*/
-
-extern char helpfilename[],endfilename[];
-
-extern void HelpScreens(void);
-extern void EndText(void);
--- a/WOLFSRC/WL_DRAW.C
+++ /dev/null
@@ -1,1403 +1,0 @@
-// WL_DRAW.C
-
-#include "WL_DEF.H"
-#include <DOS.H>
-#pragma hdrstop
-
-//#define DEBUGWALLS
-//#define DEBUGTICS
-
-/*
-=============================================================================
-
- LOCAL CONSTANTS
-
-=============================================================================
-*/
-
-// the door is the last picture before the sprites
-#define DOORWALL (PMSpriteStart-8)
-
-#define ACTORSIZE 0x4000
-
-/*
-=============================================================================
-
- GLOBAL VARIABLES
-
-=============================================================================
-*/
-
-
-#ifdef DEBUGWALLS
-unsigned screenloc[3]= {0,0,0};
-#else
-unsigned screenloc[3]= {PAGE1START,PAGE2START,PAGE3START};
-#endif
-unsigned freelatch = FREESTART;
-
-long lasttimecount;
-long frameon;
-
-unsigned wallheight[MAXVIEWWIDTH];
-
-fixed tileglobal = TILEGLOBAL;
-fixed mindist = MINDIST;
-
-
-//
-// math tables
-//
-int pixelangle[MAXVIEWWIDTH];
-long far finetangent[FINEANGLES/4];
-fixed far sintable[ANGLES+ANGLES/4],far *costable = sintable+(ANGLES/4);
-
-//
-// refresh variables
-//
-fixed viewx,viewy; // the focal point
-int viewangle;
-fixed viewsin,viewcos;
-
-
-
-fixed FixedByFrac (fixed a, fixed b);
-void TransformActor (objtype *ob);
-void BuildTables (void);
-void ClearScreen (void);
-int CalcRotate (objtype *ob);
-void DrawScaleds (void);
-void CalcTics (void);
-void FixOfs (void);
-void ThreeDRefresh (void);
-
-
-
-//
-// wall optimization variables
-//
-int lastside; // true for vertical
-long lastintercept;
-int lasttilehit;
-
-
-//
-// ray tracing variables
-//
-int focaltx,focalty,viewtx,viewty;
-
-int midangle,angle;
-unsigned xpartial,ypartial;
-unsigned xpartialup,xpartialdown,ypartialup,ypartialdown;
-unsigned xinttile,yinttile;
-
-unsigned tilehit;
-unsigned pixx;
-
-int xtile,ytile;
-int xtilestep,ytilestep;
-long xintercept,yintercept;
-long xstep,ystep;
-
-int horizwall[MAXWALLTILES],vertwall[MAXWALLTILES];
-
-
-/*
-=============================================================================
-
- LOCAL VARIABLES
-
-=============================================================================
-*/
-
-
-void AsmRefresh (void); // in WL_DR_A.ASM
-
-/*
-============================================================================
-
- 3 - D DEFINITIONS
-
-============================================================================
-*/
-
-
-//==========================================================================
-
-
-/*
-========================
-=
-= FixedByFrac
-=
-= multiply a 16/16 bit, 2's complement fixed point number by a 16 bit
-= fraction, passed as a signed magnitude 32 bit number
-=
-========================
-*/
-
-#pragma warn -rvl // I stick the return value in with ASMs
-
-fixed FixedByFrac (fixed a, fixed b)
-{
-//
-// setup
-//
-asm mov si,[WORD PTR b+2] // sign of result = sign of fraction
-
-asm mov ax,[WORD PTR a]
-asm mov cx,[WORD PTR a+2]
-
-asm or cx,cx
-asm jns aok: // negative?
-asm neg cx
-asm neg ax
-asm sbb cx,0
-asm xor si,0x8000 // toggle sign of result
-aok:
-
-//
-// multiply cx:ax by bx
-//
-asm mov bx,[WORD PTR b]
-asm mul bx // fraction*fraction
-asm mov di,dx // di is low word of result
-asm mov ax,cx //
-asm mul bx // units*fraction
-asm add ax,di
-asm adc dx,0
-
-//
-// put result dx:ax in 2's complement
-//
-asm test si,0x8000 // is the result negative?
-asm jz ansok:
-asm neg dx
-asm neg ax
-asm sbb dx,0
-
-ansok:;
-
-}
-
-#pragma warn +rvl
-
-//==========================================================================
-
-/*
-========================
-=
-= TransformActor
-=
-= Takes paramaters:
-= gx,gy : globalx/globaly of point
-=
-= globals:
-= viewx,viewy : point of view
-= viewcos,viewsin : sin/cos of viewangle
-= scale : conversion from global value to screen value
-=
-= sets:
-= screenx,transx,transy,screenheight: projected edge location and size
-=
-========================
-*/
-
-
-//
-// transform actor
-//
-void TransformActor (objtype *ob)
-{
- int ratio;
- fixed gx,gy,gxt,gyt,nx,ny;
- long temp;
-
-//
-// translate point to view centered coordinates
-//
- gx = ob->x-viewx;
- gy = ob->y-viewy;
-
-//
-// calculate newx
-//
- gxt = FixedByFrac(gx,viewcos);
- gyt = FixedByFrac(gy,viewsin);
- nx = gxt-gyt-ACTORSIZE; // fudge the shape forward a bit, because
- // the midpoint could put parts of the shape
- // into an adjacent wall
-
-//
-// calculate newy
-//
- gxt = FixedByFrac(gx,viewsin);
- gyt = FixedByFrac(gy,viewcos);
- ny = gyt+gxt;
-
-//
-// calculate perspective ratio
-//
- ob->transx = nx;
- ob->transy = ny;
-
- if (nx<mindist) // too close, don't overflow the divide
- {
- ob->viewheight = 0;
- return;
- }
-
- ob->viewx = centerx + ny*scale/nx; // DEBUG: use assembly divide
-
-//
-// calculate height (heightnumerator/(nx>>8))
-//
- asm mov ax,[WORD PTR heightnumerator]
- asm mov dx,[WORD PTR heightnumerator+2]
- asm idiv [WORD PTR nx+1] // nx>>8
- asm mov [WORD PTR temp],ax
- asm mov [WORD PTR temp+2],dx
-
- ob->viewheight = temp;
-}
-
-//==========================================================================
-
-/*
-========================
-=
-= TransformTile
-=
-= Takes paramaters:
-= tx,ty : tile the object is centered in
-=
-= globals:
-= viewx,viewy : point of view
-= viewcos,viewsin : sin/cos of viewangle
-= scale : conversion from global value to screen value
-=
-= sets:
-= screenx,transx,transy,screenheight: projected edge location and size
-=
-= Returns true if the tile is withing getting distance
-=
-========================
-*/
-
-boolean TransformTile (int tx, int ty, int *dispx, int *dispheight)
-{
- int ratio;
- fixed gx,gy,gxt,gyt,nx,ny;
- long temp;
-
-//
-// translate point to view centered coordinates
-//
- gx = ((long)tx<<TILESHIFT)+0x8000-viewx;
- gy = ((long)ty<<TILESHIFT)+0x8000-viewy;
-
-//
-// calculate newx
-//
- gxt = FixedByFrac(gx,viewcos);
- gyt = FixedByFrac(gy,viewsin);
- nx = gxt-gyt-0x2000; // 0x2000 is size of object
-
-//
-// calculate newy
-//
- gxt = FixedByFrac(gx,viewsin);
- gyt = FixedByFrac(gy,viewcos);
- ny = gyt+gxt;
-
-
-//
-// calculate perspective ratio
-//
- if (nx<mindist) // too close, don't overflow the divide
- {
- *dispheight = 0;
- return false;
- }
-
- *dispx = centerx + ny*scale/nx; // DEBUG: use assembly divide
-
-//
-// calculate height (heightnumerator/(nx>>8))
-//
- asm mov ax,[WORD PTR heightnumerator]
- asm mov dx,[WORD PTR heightnumerator+2]
- asm idiv [WORD PTR nx+1] // nx>>8
- asm mov [WORD PTR temp],ax
- asm mov [WORD PTR temp+2],dx
-
- *dispheight = temp;
-
-//
-// see if it should be grabbed
-//
- if (nx<TILEGLOBAL && ny>-TILEGLOBAL/2 && ny<TILEGLOBAL/2)
- return true;
- else
- return false;
-}
-
-//==========================================================================
-
-/*
-====================
-=
-= CalcHeight
-=
-= Calculates the height of xintercept,yintercept from viewx,viewy
-=
-====================
-*/
-
-#pragma warn -rvl // I stick the return value in with ASMs
-
-int CalcHeight (void)
-{
- int transheight;
- int ratio;
- fixed gxt,gyt,nx,ny;
- long gx,gy;
-
- gx = xintercept-viewx;
- gxt = FixedByFrac(gx,viewcos);
-
- gy = yintercept-viewy;
- gyt = FixedByFrac(gy,viewsin);
-
- nx = gxt-gyt;
-
- //
- // calculate perspective ratio (heightnumerator/(nx>>8))
- //
- if (nx<mindist)
- nx=mindist; // don't let divide overflow
-
- asm mov ax,[WORD PTR heightnumerator]
- asm mov dx,[WORD PTR heightnumerator+2]
- asm idiv [WORD PTR nx+1] // nx>>8
-}
-
-
-//==========================================================================
-
-/*
-===================
-=
-= ScalePost
-=
-===================
-*/
-
-long postsource;
-unsigned postx;
-unsigned postwidth;
-
-void near ScalePost (void) // VGA version
-{
- asm mov ax,SCREENSEG
- asm mov es,ax
-
- asm mov bx,[postx]
- asm shl bx,1
- asm mov bp,WORD PTR [wallheight+bx] // fractional height (low 3 bits frac)
- asm and bp,0xfff8 // bp = heightscaler*4
- asm shr bp,1
- asm cmp bp,[maxscaleshl2]
- asm jle heightok
- asm mov bp,[maxscaleshl2]
-heightok:
- asm add bp,OFFSET fullscalefarcall
- //
- // scale a byte wide strip of wall
- //
- asm mov bx,[postx]
- asm mov di,bx
- asm shr di,2 // X in bytes
- asm add di,[bufferofs]
-
- asm and bx,3
- asm shl bx,3 // bx = pixel*8+pixwidth
- asm add bx,[postwidth]
-
- asm mov al,BYTE PTR [mapmasks1-1+bx] // -1 because no widths of 0
- asm mov dx,SC_INDEX+1
- asm out dx,al // set bit mask register
- asm lds si,DWORD PTR [postsource]
- asm call DWORD PTR [bp] // scale the line of pixels
-
- asm mov al,BYTE PTR [ss:mapmasks2-1+bx] // -1 because no widths of 0
- asm or al,al
- asm jz nomore
-
- //
- // draw a second byte for vertical strips that cross two bytes
- //
- asm inc di
- asm out dx,al // set bit mask register
- asm call DWORD PTR [bp] // scale the line of pixels
-
- asm mov al,BYTE PTR [ss:mapmasks3-1+bx] // -1 because no widths of 0
- asm or al,al
- asm jz nomore
- //
- // draw a third byte for vertical strips that cross three bytes
- //
- asm inc di
- asm out dx,al // set bit mask register
- asm call DWORD PTR [bp] // scale the line of pixels
-
-
-nomore:
- asm mov ax,ss
- asm mov ds,ax
-}
-
-void FarScalePost (void) // just so other files can call
-{
- ScalePost ();
-}
-
-
-/*
-====================
-=
-= HitVertWall
-=
-= tilehit bit 7 is 0, because it's not a door tile
-= if bit 6 is 1 and the adjacent tile is a door tile, use door side pic
-=
-====================
-*/
-
-void HitVertWall (void)
-{
- int wallpic;
- unsigned texture;
-
- texture = (yintercept>>4)&0xfc0;
- if (xtilestep == -1)
- {
- texture = 0xfc0-texture;
- xintercept += TILEGLOBAL;
- }
- wallheight[pixx] = CalcHeight();
-
- if (lastside==1 && lastintercept == xtile && lasttilehit == tilehit)
- {
- // in the same wall type as last time, so check for optimized draw
- if (texture == (unsigned)postsource)
- {
- // wide scale
- postwidth++;
- wallheight[pixx] = wallheight[pixx-1];
- return;
- }
- else
- {
- ScalePost ();
- (unsigned)postsource = texture;
- postwidth = 1;
- postx = pixx;
- }
- }
- else
- {
- // new wall
- if (lastside != -1) // if not the first scaled post
- ScalePost ();
-
- lastside = true;
- lastintercept = xtile;
-
- lasttilehit = tilehit;
- postx = pixx;
- postwidth = 1;
-
- if (tilehit & 0x40)
- { // check for adjacent doors
- ytile = yintercept>>TILESHIFT;
- if ( tilemap[xtile-xtilestep][ytile]&0x80 )
- wallpic = DOORWALL+3;
- else
- wallpic = vertwall[tilehit & ~0x40];
- }
- else
- wallpic = vertwall[tilehit];
-
- *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(wallpic);
- (unsigned)postsource = texture;
-
- }
-}
-
-
-/*
-====================
-=
-= HitHorizWall
-=
-= tilehit bit 7 is 0, because it's not a door tile
-= if bit 6 is 1 and the adjacent tile is a door tile, use door side pic
-=
-====================
-*/
-
-void HitHorizWall (void)
-{
- int wallpic;
- unsigned texture;
-
- texture = (xintercept>>4)&0xfc0;
- if (ytilestep == -1)
- yintercept += TILEGLOBAL;
- else
- texture = 0xfc0-texture;
- wallheight[pixx] = CalcHeight();
-
- if (lastside==0 && lastintercept == ytile && lasttilehit == tilehit)
- {
- // in the same wall type as last time, so check for optimized draw
- if (texture == (unsigned)postsource)
- {
- // wide scale
- postwidth++;
- wallheight[pixx] = wallheight[pixx-1];
- return;
- }
- else
- {
- ScalePost ();
- (unsigned)postsource = texture;
- postwidth = 1;
- postx = pixx;
- }
- }
- else
- {
- // new wall
- if (lastside != -1) // if not the first scaled post
- ScalePost ();
-
- lastside = 0;
- lastintercept = ytile;
-
- lasttilehit = tilehit;
- postx = pixx;
- postwidth = 1;
-
- if (tilehit & 0x40)
- { // check for adjacent doors
- xtile = xintercept>>TILESHIFT;
- if ( tilemap[xtile][ytile-ytilestep]&0x80 )
- wallpic = DOORWALL+2;
- else
- wallpic = horizwall[tilehit & ~0x40];
- }
- else
- wallpic = horizwall[tilehit];
-
- *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(wallpic);
- (unsigned)postsource = texture;
- }
-
-}
-
-//==========================================================================
-
-/*
-====================
-=
-= HitHorizDoor
-=
-====================
-*/
-
-void HitHorizDoor (void)
-{
- unsigned texture,doorpage,doornum;
-
- doornum = tilehit&0x7f;
- texture = ( (xintercept-doorposition[doornum]) >> 4) &0xfc0;
-
- wallheight[pixx] = CalcHeight();
-
- if (lasttilehit == tilehit)
- {
- // in the same door as last time, so check for optimized draw
- if (texture == (unsigned)postsource)
- {
- // wide scale
- postwidth++;
- wallheight[pixx] = wallheight[pixx-1];
- return;
- }
- else
- {
- ScalePost ();
- (unsigned)postsource = texture;
- postwidth = 1;
- postx = pixx;
- }
- }
- else
- {
- if (lastside != -1) // if not the first scaled post
- ScalePost (); // draw last post
- // first pixel in this door
- lastside = 2;
- lasttilehit = tilehit;
- postx = pixx;
- postwidth = 1;
-
- switch (doorobjlist[doornum].lock)
- {
- case dr_normal:
- doorpage = DOORWALL;
- break;
- case dr_lock1:
- case dr_lock2:
- case dr_lock3:
- case dr_lock4:
- doorpage = DOORWALL+6;
- break;
- case dr_elevator:
- doorpage = DOORWALL+4;
- break;
- }
-
- *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(doorpage);
- (unsigned)postsource = texture;
- }
-}
-
-//==========================================================================
-
-/*
-====================
-=
-= HitVertDoor
-=
-====================
-*/
-
-void HitVertDoor (void)
-{
- unsigned texture,doorpage,doornum;
-
- doornum = tilehit&0x7f;
- texture = ( (yintercept-doorposition[doornum]) >> 4) &0xfc0;
-
- wallheight[pixx] = CalcHeight();
-
- if (lasttilehit == tilehit)
- {
- // in the same door as last time, so check for optimized draw
- if (texture == (unsigned)postsource)
- {
- // wide scale
- postwidth++;
- wallheight[pixx] = wallheight[pixx-1];
- return;
- }
- else
- {
- ScalePost ();
- (unsigned)postsource = texture;
- postwidth = 1;
- postx = pixx;
- }
- }
- else
- {
- if (lastside != -1) // if not the first scaled post
- ScalePost (); // draw last post
- // first pixel in this door
- lastside = 2;
- lasttilehit = tilehit;
- postx = pixx;
- postwidth = 1;
-
- switch (doorobjlist[doornum].lock)
- {
- case dr_normal:
- doorpage = DOORWALL;
- break;
- case dr_lock1:
- case dr_lock2:
- case dr_lock3:
- case dr_lock4:
- doorpage = DOORWALL+6;
- break;
- case dr_elevator:
- doorpage = DOORWALL+4;
- break;
- }
-
- *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(doorpage+1);
- (unsigned)postsource = texture;
- }
-}
-
-//==========================================================================
-
-
-/*
-====================
-=
-= HitHorizPWall
-=
-= A pushable wall in action has been hit
-=
-====================
-*/
-
-void HitHorizPWall (void)
-{
- int wallpic;
- unsigned texture,offset;
-
- texture = (xintercept>>4)&0xfc0;
- offset = pwallpos<<10;
- if (ytilestep == -1)
- yintercept += TILEGLOBAL-offset;
- else
- {
- texture = 0xfc0-texture;
- yintercept += offset;
- }
-
- wallheight[pixx] = CalcHeight();
-
- if (lasttilehit == tilehit)
- {
- // in the same wall type as last time, so check for optimized draw
- if (texture == (unsigned)postsource)
- {
- // wide scale
- postwidth++;
- wallheight[pixx] = wallheight[pixx-1];
- return;
- }
- else
- {
- ScalePost ();
- (unsigned)postsource = texture;
- postwidth = 1;
- postx = pixx;
- }
- }
- else
- {
- // new wall
- if (lastside != -1) // if not the first scaled post
- ScalePost ();
-
- lasttilehit = tilehit;
- postx = pixx;
- postwidth = 1;
-
- wallpic = horizwall[tilehit&63];
-
- *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(wallpic);
- (unsigned)postsource = texture;
- }
-
-}
-
-
-/*
-====================
-=
-= HitVertPWall
-=
-= A pushable wall in action has been hit
-=
-====================
-*/
-
-void HitVertPWall (void)
-{
- int wallpic;
- unsigned texture,offset;
-
- texture = (yintercept>>4)&0xfc0;
- offset = pwallpos<<10;
- if (xtilestep == -1)
- {
- xintercept += TILEGLOBAL-offset;
- texture = 0xfc0-texture;
- }
- else
- xintercept += offset;
-
- wallheight[pixx] = CalcHeight();
-
- if (lasttilehit == tilehit)
- {
- // in the same wall type as last time, so check for optimized draw
- if (texture == (unsigned)postsource)
- {
- // wide scale
- postwidth++;
- wallheight[pixx] = wallheight[pixx-1];
- return;
- }
- else
- {
- ScalePost ();
- (unsigned)postsource = texture;
- postwidth = 1;
- postx = pixx;
- }
- }
- else
- {
- // new wall
- if (lastside != -1) // if not the first scaled post
- ScalePost ();
-
- lasttilehit = tilehit;
- postx = pixx;
- postwidth = 1;
-
- wallpic = vertwall[tilehit&63];
-
- *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(wallpic);
- (unsigned)postsource = texture;
- }
-
-}
-
-//==========================================================================
-
-//==========================================================================
-
-#if 0
-/*
-=====================
-=
-= ClearScreen
-=
-=====================
-*/
-
-void ClearScreen (void)
-{
- unsigned floor=egaFloor[gamestate.episode*10+mapon],
- ceiling=egaCeiling[gamestate.episode*10+mapon];
-
- //
- // clear the screen
- //
-asm mov dx,GC_INDEX
-asm mov ax,GC_MODE + 256*2 // read mode 0, write mode 2
-asm out dx,ax
-asm mov ax,GC_BITMASK + 255*256
-asm out dx,ax
-
-asm mov dx,40
-asm mov ax,[viewwidth]
-asm shr ax,3
-asm sub dx,ax // dx = 40-viewwidth/8
-
-asm mov bx,[viewwidth]
-asm shr bx,4 // bl = viewwidth/16
-asm mov bh,BYTE PTR [viewheight]
-asm shr bh,1 // half height
-
-asm mov ax,[ceiling]
-asm mov es,[screenseg]
-asm mov di,[bufferofs]
-
-toploop:
-asm mov cl,bl
-asm rep stosw
-asm add di,dx
-asm dec bh
-asm jnz toploop
-
-asm mov bh,BYTE PTR [viewheight]
-asm shr bh,1 // half height
-asm mov ax,[floor]
-
-bottomloop:
-asm mov cl,bl
-asm rep stosw
-asm add di,dx
-asm dec bh
-asm jnz bottomloop
-
-
-asm mov dx,GC_INDEX
-asm mov ax,GC_MODE + 256*10 // read mode 1, write mode 2
-asm out dx,ax
-asm mov al,GC_BITMASK
-asm out dx,al
-
-}
-#endif
-//==========================================================================
-
-unsigned vgaCeiling[]=
-{
-#ifndef SPEAR
- 0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0xbfbf,
- 0x4e4e,0x4e4e,0x4e4e,0x1d1d,0x8d8d,0x4e4e,0x1d1d,0x2d2d,0x1d1d,0x8d8d,
- 0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x2d2d,0xdddd,0x1d1d,0x1d1d,0x9898,
-
- 0x1d1d,0x9d9d,0x2d2d,0xdddd,0xdddd,0x9d9d,0x2d2d,0x4d4d,0x1d1d,0xdddd,
- 0x7d7d,0x1d1d,0x2d2d,0x2d2d,0xdddd,0xd7d7,0x1d1d,0x1d1d,0x1d1d,0x2d2d,
- 0x1d1d,0x1d1d,0x1d1d,0x1d1d,0xdddd,0xdddd,0x7d7d,0xdddd,0xdddd,0xdddd
-#else
- 0x6f6f,0x4f4f,0x1d1d,0xdede,0xdfdf,0x2e2e,0x7f7f,0x9e9e,0xaeae,0x7f7f,
- 0x1d1d,0xdede,0xdfdf,0xdede,0xdfdf,0xdede,0xe1e1,0xdcdc,0x2e2e,0x1d1d,0xdcdc
-#endif
-};
-
-/*
-=====================
-=
-= VGAClearScreen
-=
-=====================
-*/
-
-void VGAClearScreen (void)
-{
- unsigned ceiling=vgaCeiling[gamestate.episode*10+mapon];
-
- //
- // clear the screen
- //
-asm mov dx,SC_INDEX
-asm mov ax,SC_MAPMASK+15*256 // write through all planes
-asm out dx,ax
-
-asm mov dx,80
-asm mov ax,[viewwidth]
-asm shr ax,2
-asm sub dx,ax // dx = 40-viewwidth/2
-
-asm mov bx,[viewwidth]
-asm shr bx,3 // bl = viewwidth/8
-asm mov bh,BYTE PTR [viewheight]
-asm shr bh,1 // half height
-
-asm mov es,[screenseg]
-asm mov di,[bufferofs]
-asm mov ax,[ceiling]
-
-toploop:
-asm mov cl,bl
-asm rep stosw
-asm add di,dx
-asm dec bh
-asm jnz toploop
-
-asm mov bh,BYTE PTR [viewheight]
-asm shr bh,1 // half height
-asm mov ax,0x1919
-
-bottomloop:
-asm mov cl,bl
-asm rep stosw
-asm add di,dx
-asm dec bh
-asm jnz bottomloop
-}
-
-//==========================================================================
-
-/*
-=====================
-=
-= CalcRotate
-=
-=====================
-*/
-
-int CalcRotate (objtype *ob)
-{
- int angle,viewangle;
-
- // this isn't exactly correct, as it should vary by a trig value,
- // but it is close enough with only eight rotations
-
- viewangle = player->angle + (centerx - ob->viewx)/8;
-
- if (ob->obclass == rocketobj || ob->obclass == hrocketobj)
- angle = (viewangle-180)- ob->angle;
- else
- angle = (viewangle-180)- dirangle[ob->dir];
-
- angle+=ANGLES/16;
- while (angle>=ANGLES)
- angle-=ANGLES;
- while (angle<0)
- angle+=ANGLES;
-
- if (ob->state->rotate == 2) // 2 rotation pain frame
- return 4*(angle/(ANGLES/2)); // seperated by 3 (art layout...)
-
- return angle/(ANGLES/8);
-}
-
-
-/*
-=====================
-=
-= DrawScaleds
-=
-= Draws all objects that are visable
-=
-=====================
-*/
-
-#define MAXVISABLE 50
-
-typedef struct
-{
- int viewx,
- viewheight,
- shapenum;
-} visobj_t;
-
-visobj_t vislist[MAXVISABLE],*visptr,*visstep,*farthest;
-
-void DrawScaleds (void)
-{
- int i,j,least,numvisable,height;
- memptr shape;
- byte *tilespot,*visspot;
- int shapenum;
- unsigned spotloc;
-
- statobj_t *statptr;
- objtype *obj;
-
- visptr = &vislist[0];
-
-//
-// place static objects
-//
- for (statptr = &statobjlist[0] ; statptr !=laststatobj ; statptr++)
- {
- if ((visptr->shapenum = statptr->shapenum) == -1)
- continue; // object has been deleted
-
- if (!*statptr->visspot)
- continue; // not visable
-
- if (TransformTile (statptr->tilex,statptr->tiley
- ,&visptr->viewx,&visptr->viewheight) && statptr->flags & FL_BONUS)
- {
- GetBonus (statptr);
- continue;
- }
-
- if (!visptr->viewheight)
- continue; // to close to the object
-
- if (visptr < &vislist[MAXVISABLE-1]) // don't let it overflow
- visptr++;
- }
-
-//
-// place active objects
-//
- for (obj = player->next;obj;obj=obj->next)
- {
- if (!(visptr->shapenum = obj->state->shapenum))
- continue; // no shape
-
- spotloc = (obj->tilex<<6)+obj->tiley; // optimize: keep in struct?
- visspot = &spotvis[0][0]+spotloc;
- tilespot = &tilemap[0][0]+spotloc;
-
- //
- // could be in any of the nine surrounding tiles
- //
- if (*visspot
- || ( *(visspot-1) && !*(tilespot-1) )
- || ( *(visspot+1) && !*(tilespot+1) )
- || ( *(visspot-65) && !*(tilespot-65) )
- || ( *(visspot-64) && !*(tilespot-64) )
- || ( *(visspot-63) && !*(tilespot-63) )
- || ( *(visspot+65) && !*(tilespot+65) )
- || ( *(visspot+64) && !*(tilespot+64) )
- || ( *(visspot+63) && !*(tilespot+63) ) )
- {
- obj->active = true;
- TransformActor (obj);
- if (!obj->viewheight)
- continue; // too close or far away
-
- visptr->viewx = obj->viewx;
- visptr->viewheight = obj->viewheight;
- if (visptr->shapenum == -1)
- visptr->shapenum = obj->temp1; // special shape
-
- if (obj->state->rotate)
- visptr->shapenum += CalcRotate (obj);
-
- if (visptr < &vislist[MAXVISABLE-1]) // don't let it overflow
- visptr++;
- obj->flags |= FL_VISABLE;
- }
- else
- obj->flags &= ~FL_VISABLE;
- }
-
-//
-// draw from back to front
-//
- numvisable = visptr-&vislist[0];
-
- if (!numvisable)
- return; // no visable objects
-
- for (i = 0; i<numvisable; i++)
- {
- least = 32000;
- for (visstep=&vislist[0] ; visstep<visptr ; visstep++)
- {
- height = visstep->viewheight;
- if (height < least)
- {
- least = height;
- farthest = visstep;
- }
- }
- //
- // draw farthest
- //
- ScaleShape(farthest->viewx,farthest->shapenum,farthest->viewheight);
-
- farthest->viewheight = 32000;
- }
-
-}
-
-//==========================================================================
-
-/*
-==============
-=
-= DrawPlayerWeapon
-=
-= Draw the player's hands
-=
-==============
-*/
-
-int weaponscale[NUMWEAPONS] = {SPR_KNIFEREADY,SPR_PISTOLREADY
- ,SPR_MACHINEGUNREADY,SPR_CHAINREADY};
-
-void DrawPlayerWeapon (void)
-{
- int shapenum;
-
-#ifndef SPEAR
- if (gamestate.victoryflag)
- {
- if (player->state == &s_deathcam && (TimeCount&32) )
- SimpleScaleShape(viewwidth/2,SPR_DEATHCAM,viewheight+1);
- return;
- }
-#endif
-
- if (gamestate.weapon != -1)
- {
- shapenum = weaponscale[gamestate.weapon]+gamestate.weaponframe;
- SimpleScaleShape(viewwidth/2,shapenum,viewheight+1);
- }
-
- if (demorecord || demoplayback)
- SimpleScaleShape(viewwidth/2,SPR_DEMO,viewheight+1);
-}
-
-
-//==========================================================================
-
-
-/*
-=====================
-=
-= CalcTics
-=
-=====================
-*/
-
-void CalcTics (void)
-{
- long newtime,oldtimecount;
-
-//
-// calculate tics since last refresh for adaptive timing
-//
- if (lasttimecount > TimeCount)
- TimeCount = lasttimecount; // if the game was paused a LONG time
-
- do
- {
- newtime = TimeCount;
- tics = newtime-lasttimecount;
- } while (!tics); // make sure at least one tic passes
-
- lasttimecount = newtime;
-
-#ifdef FILEPROFILE
- strcpy (scratch,"\tTics:");
- itoa (tics,str,10);
- strcat (scratch,str);
- strcat (scratch,"\n");
- write (profilehandle,scratch,strlen(scratch));
-#endif
-
- if (tics>MAXTICS)
- {
- TimeCount -= (tics-MAXTICS);
- tics = MAXTICS;
- }
-}
-
-
-//==========================================================================
-
-
-/*
-========================
-=
-= FixOfs
-=
-========================
-*/
-
-void FixOfs (void)
-{
- VW_ScreenToScreen (displayofs,bufferofs,viewwidth/8,viewheight);
-}
-
-
-//==========================================================================
-
-
-/*
-====================
-=
-= WallRefresh
-=
-====================
-*/
-
-void WallRefresh (void)
-{
-//
-// set up variables for this view
-//
- viewangle = player->angle;
- midangle = viewangle*(FINEANGLES/ANGLES);
- viewsin = sintable[viewangle];
- viewcos = costable[viewangle];
- viewx = player->x - FixedByFrac(focallength,viewcos);
- viewy = player->y + FixedByFrac(focallength,viewsin);
-
- focaltx = viewx>>TILESHIFT;
- focalty = viewy>>TILESHIFT;
-
- viewtx = player->x >> TILESHIFT;
- viewty = player->y >> TILESHIFT;
-
- xpartialdown = viewx&(TILEGLOBAL-1);
- xpartialup = TILEGLOBAL-xpartialdown;
- ypartialdown = viewy&(TILEGLOBAL-1);
- ypartialup = TILEGLOBAL-ypartialdown;
-
- lastside = -1; // the first pixel is on a new wall
- AsmRefresh ();
- ScalePost (); // no more optimization on last post
-}
-
-//==========================================================================
-
-/*
-========================
-=
-= ThreeDRefresh
-=
-========================
-*/
-
-void ThreeDRefresh (void)
-{
- int tracedir;
-
-// this wouldn't need to be done except for my debugger/video wierdness
- outportb (SC_INDEX,SC_MAPMASK);
-
-//
-// clear out the traced array
-//
-asm mov ax,ds
-asm mov es,ax
-asm mov di,OFFSET spotvis
-asm xor ax,ax
-asm mov cx,2048 // 64*64 / 2
-asm rep stosw
-
- bufferofs += screenofs;
-
-//
-// follow the walls from there to the right, drawwing as we go
-//
- VGAClearScreen ();
-
- WallRefresh ();
-
-//
-// draw all the scaled images
-//
- DrawScaleds(); // draw scaled stuff
- DrawPlayerWeapon (); // draw player's hands
-
-//
-// show screen and time last cycle
-//
- if (fizzlein)
- {
- FizzleFade(bufferofs,displayofs+screenofs,viewwidth,viewheight,20,false);
- fizzlein = false;
-
- lasttimecount = TimeCount = 0; // don't make a big tic count
-
- }
-
- bufferofs -= screenofs;
- displayofs = bufferofs;
-
- asm cli
- asm mov cx,[displayofs]
- asm mov dx,3d4h // CRTC address register
- asm mov al,0ch // start address high register
- asm out dx,al
- asm inc dx
- asm mov al,ch
- asm out dx,al // set the high byte
- asm sti
-
- bufferofs += SCREENSIZE;
- if (bufferofs > PAGE3START)
- bufferofs = PAGE1START;
-
- frameon++;
- PM_NextFrame();
-}
-
-
-//===========================================================================
-
--- a/WOLFSRC/WL_DR_A.ASM
+++ /dev/null
@@ -1,739 +1,0 @@
- IDEAL
- MODEL MEDIUM,C
- P286
-
-SCREENSEG = 0a000h
-
-FINEANGLES = 3600
-DEG90 = 900
-DEG180 = 1800
-DEG270 = 2700
-DEG360 = 3600
-
-OP_JLE = 07eh
-OP_JGE = 07dh
-
-EXTRN finetangent:DWORD ; far array, starts at offset 0
-
-EXTRN HitHorizWall:FAR
-EXTRN HitVertWall:FAR
-EXTRN HitHorizDoor:FAR
-EXTRN HitVertDoor:FAR
-EXTRN HitHorizPWall:FAR
-EXTRN HitVertPWall:FAR
-
-
-DATASEG
-
-EXTRN viewwidth:WORD
-
-EXTRN tilemap:BYTE
-EXTRN spotvis:BYTE
-EXTRN pixelangle:WORD
-
-
-EXTRN midangle:WORD
-EXTRN angle:WORD
-
-EXTRN focaltx:WORD
-EXTRN focalty:WORD
-EXTRN viewtx:WORD
-EXTRN viewty:WORD
-EXTRN viewx:DWORD
-EXTRN viewy:DWORD
-
-EXTRN xpartialup:WORD
-EXTRN ypartialup:WORD
-EXTRN xpartialdown:WORD
-EXTRN ypartialdown:WORD
-
-EXTRN tilehit:WORD
-EXTRN pixx:WORD
-EXTRN wallheight:WORD ; array of VIEWWIDTH entries
-
-EXTRN xtile:WORD
-EXTRN ytile:WORD
-EXTRN xtilestep:WORD
-EXTRN ytilestep:WORD
-EXTRN xintercept:DWORD
-EXTRN yintercept:DWORD
-EXTRN xstep:DWORD
-EXTRN ystep:DWORD
-
-EXTRN doorposition:WORD ; table of door position values
-
-
-EXTRN pwallpos:WORD ; amound a pushable wall has been moved
-
-CODESEG
-
-;-------------------
-;
-; xpartialbyystep
-;
-; multiplies long [ystep] (possibly negative), by word [xpartial] (in BX)
-;
-; returns dx:ax
-; trashes bx,cx,di
-;
-;-------------------
-
-PROC xpartialbyystep NEAR
-;
-; setup
-;
- mov ax,[WORD ystep]
- mov cx,[WORD ystep+2]
- or cx,cx ; is ystep negatice?
- jns @@multpos
-;
-; multiply negative cx:ax by bx
-;
- neg cx
- neg ax
- sbb cx,0
-
- mul bx ; fraction*fraction
- mov di,dx ; di is low word of result
- mov ax,cx ;
- mul bx ; units*fraction
- add ax,di
- adc dx,0
-
- neg dx
- neg ax
- sbb dx,0
- ret
-;
-; multiply positive cx:ax by bx
-;
-EVEN
-@@multpos:
- mul bx ; fraction*fraction
- mov di,dx ; di is low word of result
- mov ax,cx ;
- mul bx ; units*fraction
- add ax,di
- adc dx,0
-
- ret
-
-ENDP
-
-
-
-;-------------------
-;
-; ypartialbyxstep
-;
-; multiplies long [xstep] (possibly negative), by word [ypartial] (in BP)
-;
-; returns dx:ax
-; trashes cx,di,bp
-;
-;-------------------
-
-PROC ypartialbyxstep NEAR
-;
-; setup
-;
- mov ax,[WORD xstep]
- mov cx,[WORD xstep+2]
- or cx,cx ; is ystep negatice?
- jns @@multpos
-;
-; multiply negative cx:ax by bx
-;
- neg cx
- neg ax
- sbb cx,0
-
- mul bp ; fraction*fraction
- mov di,dx ; di is low word of result
- mov ax,cx ;
- mul bp ; units*fraction
- add ax,di
- adc dx,0
-
- neg dx
- neg ax
- sbb dx,0
- ret
-;
-; multiply positive cx:ax by bx
-;
-EVEN
-@@multpos:
- mul bp ; fraction*fraction
- mov di,dx ; di is low word of result
- mov ax,cx ;
- mul bp ; units*fraction
- add ax,di
- adc dx,0
- ret
-
-ENDP
-
-
-;============================
-;
-; AsmRefresh
-;
-;
-;============================
-
-PROC AsmRefresh
-PUBLIC AsmRefresh
-
- push si
- push di
- push bp
-
- mov [pixx],0
-;---------------------------------------------------------------------------
-;
-; Setup to trace a ray through pixx view pixel
-;
-; CX : angle of the ray through pixx
-; ES : points to segment of finetangent array for this block of code
-;
-; Upon entrance to initialize block
-;
-; BX : xpartial
-; BP : ypartial
-;
-;---------------------------------------------------------------------------
- EVEN
-pixxloop:
- mov ax,SEG finetangent
- mov es,ax
- mov cx,[midangle] ; center of view area
- mov bx,[pixx]
- shl bx,1
- add cx,[pixelangle+bx] ; delta for this pixel
- cmp cx,0
- jge not0
-;----------
-;
-; -90 - -1 degree arc
-;
-;----------
- add cx,FINEANGLES ; -90 is the same as 270
- jmp entry360
-
-not0:
- cmp cx,DEG90
- jge not90
-;----------
-;
-; 0-89 degree arc
-;
-;----------
-entry90:
- mov [xtilestep],1 ; xtilestep = 1
- mov [ytilestep],-1 ; ytilestep = -1
- mov [BYTE cs:horizop],OP_JGE ; patch a jge in
- mov [BYTE cs:vertop],OP_JLE ; patch a jle in
- mov bx,DEG90-1
- sub bx,cx
- shl bx,2
- mov ax,[es:bx]
- mov dx,[es:bx+2]
- mov [WORD xstep],ax
- mov [WORD xstep+2],dx ; xstep = finetangent[DEG90-1-angle]
- mov bx,cx
- shl bx,2
- mov ax,[es:bx]
- mov dx,[es:bx+2]
- neg dx
- neg ax
- sbb dx,0
- mov [WORD ystep],ax
- mov [WORD ystep+2],dx ; ystep = -finetangent[angle]
-
- mov bx,[xpartialup] ; xpartial = xpartialup
- mov bp,[ypartialdown] ; ypartial = ypartialdown
- jmp initvars
-
-not90:
- cmp cx,DEG180
- jge not180
-;----------
-;
-; 90-179 degree arc
-;
-;----------
- mov ax,-1
- mov [xtilestep],ax ; xtilestep = -1
- mov [ytilestep],ax ; ytilestep = -1
- mov [BYTE cs:horizop],OP_JLE ; patch a jle in
- mov [BYTE cs:vertop],OP_JLE ; patch a jle in
-
- mov bx,cx
- shl bx,2
- mov ax,[es:bx-DEG90*4]
- mov dx,[es:bx+2-DEG90*4]
- neg dx
- neg ax
- sbb dx,0
- mov [WORD xstep],ax
- mov [WORD xstep+2],dx ; xstep = -finetangent[angle-DEG90]
- mov bx,DEG180-1
- sub bx,cx
- shl bx,2
- mov ax,[es:bx]
- mov dx,[es:bx+2]
- neg dx
- neg ax
- sbb dx,0
- mov [WORD ystep],ax
- mov [WORD ystep+2],dx ; ystep = -finetangent[DEG180-1-angle]
-
- mov bx,[xpartialdown] ; xpartial = xpartialdown
- mov bp,[ypartialdown] ; ypartial = ypartialdown
- jmp initvars
-
-not180:
- cmp cx,DEG270
- jge not270
-;----------
-;
-; 180-269 degree arc
-;
-;----------
- mov [xtilestep],-1 ; xtilestep = -1
- mov [ytilestep],1 ; ytilestep = 1
- mov [BYTE cs:horizop],OP_JLE ; patch a jle in
- mov [BYTE cs:vertop],OP_JGE ; patch a jge in
-
- mov bx,DEG270-1
- sub bx,cx
- shl bx,2
- mov ax,[es:bx]
- mov dx,[es:bx+2]
- neg dx
- neg ax
- sbb dx,0
- mov [WORD xstep],ax
- mov [WORD xstep+2],dx ; xstep = -finetangent[DEG270-1-angle]
- mov bx,cx
- shl bx,2
- mov ax,[es:bx-DEG180*4]
- mov dx,[es:bx+2-DEG180*4]
- mov [WORD ystep],ax
- mov [WORD ystep+2],dx ; ystep = finetangent[angle-DEG180]
-
- mov bx,[xpartialdown] ; xpartial = xpartialdown
- mov bp,[ypartialup] ; ypartial = ypartialup
- jmp initvars
-
-
-not270:
- cmp cx,DEG360
- jge not360
-;----------
-;
-; 270-359 degree arc
-;
-;----------
-entry360:
- mov ax,1
- mov [xtilestep],ax ; xtilestep = 1
- mov [ytilestep],ax ; ytilestep = 1
- mov [BYTE cs:horizop],OP_JGE ; patch a jge in
- mov [BYTE cs:vertop],OP_JGE ; patch a jge in
-
- mov bx,cx
- shl bx,2
- mov ax,[es:bx-DEG270*4]
- mov dx,[es:bx+2-DEG270*4]
- mov [WORD xstep],ax
- mov [WORD xstep+2],dx ; xstep = finetangent[angle-DEG270]
- mov bx,DEG360-1
- sub bx,cx
- shl bx,2
- mov ax,[es:bx]
- mov dx,[es:bx+2]
- mov [WORD ystep],ax
- mov [WORD ystep+2],dx ; ystep = finetangent[DEG360-1-angle]
-
- mov bx,[xpartialup] ; xpartial = xpartialup
- mov bp,[ypartialup] ; ypartial = ypartialup
- jmp initvars
-
-
-not360:
-;----------
-;
-; 360-449 degree arc
-;
-;----------
- sub cx,FINEANGLES ; -449 is the same as 89
- jmp entry90
-
-;---------------------------------------------------------------------------
-;
-; initialise variables for intersection testing
-;
-;---------------------------------------------------------------------------
-initvars:
- call NEAR xpartialbyystep ; xpartial is in BX
- add ax,[WORD viewy]
- adc dx,[WORD viewy+2]
- mov [WORD yintercept],ax
- mov [WORD yintercept+2],dx
-
- mov si,[focaltx]
- add si,[xtilestep]
- mov [xtile],si ; xtile = focaltx+xtilestep
- shl si,6
- add si,dx ; xspot = (xtile<<6) + yinttile
-
-
- call NEAR ypartialbyxstep ; ypartial is in BP
- add ax,[WORD viewx]
- adc dx,[WORD viewx+2]
- mov [WORD xintercept],ax
- mov cx,dx
-
- mov bx,[focalty]
- add bx,[ytilestep]
- mov bp,bx ; ytile = focalty+ytilestep
- mov di,dx
- shl di,6
- add di,bx ; yspot = (xinttile<<6) + ytile
-
- mov bx,[xtile]
- mov dx,[WORD yintercept+2]
- mov ax,SCREENSEG
- mov es,ax ; faster than mov es,[screenseg]
-
-
-;---------------------------------------------------------------------------
-;
-; trace along this angle until we hit a wall
-;
-; CORE LOOP!
-;
-; All variables are killed when a wall is hit
-;
-; AX : scratch
-; BX : xtile
-; CX : high word of xintercept
-; DX : high word of yintercept
-; SI : xspot (yinttile<<6)+xtile (index into tilemap and spotvis)
-; DI : yspot (xinttile<<6)+ytile (index into tilemap and spotvis)
-; BP : ytile
-; ES : screenseg
-;
-;---------------------------------------------------------------------------
-
-;-----------
-;
-; check intersections with vertical walls
-;
-;-----------
-
- EVEN
-vertcheck:
- cmp dx,bp
-vertop: ; 0x7e = jle (ytilestep==-1)
- jle horizentry ; 0x7d = jge (ytilestep==1)
-vertentry:
- test [BYTE tilemap+si],0ffh ; tilehit = *((byte *)tilemap+xspot);
- jnz hitvert
-passvert:
- mov [BYTE spotvis+si],1 ; *((byte *)spotvis+xspot) = true;
- add bx,[xtilestep] ; xtile+=xtilestep
- mov ax,[WORD ystep]
- add [WORD yintercept],ax ; yintercept += ystep
- adc dx,[WORD ystep+2]
- mov si,bx
- shl si,6
- add si,dx ; xspot = (xtile<<6)+yinttile
- jmp vertcheck
-
- EVEN
-hitvert:
- mov al,[BYTE tilemap+si] ; tilehit = *((byte *)tilemap+xspot);
- mov [BYTE tilehit],al
- or al,al ; set flags
- jns notvertdoor
- jmp vertdoor
-notvertdoor:
- mov [WORD xintercept],0
- mov [WORD xintercept+2],bx
- mov [xtile],bx
- mov [WORD yintercept+2],dx
- mov [ytile],dx
- call FAR HitVertWall
- jmp nextpix
-
-
-;-----------
-;
-; check intersections with horizontal walls
-;
-;-----------
- EVEN
-horizcheck:
- cmp cx,bx
-horizop: ; 0x7e = jle (xtilestep==-1)
- jle vertentry ; 0x7d = jge (xtilestep==1)
-horizentry:
- test [BYTE tilemap+di],0ffh ; tilehit = *((byte *)tilemap+yspot);
- jnz hithoriz
-passhoriz:
- mov [BYTE spotvis+di],1 ; *((byte *)spotvis+yspot) = true;
- add bp,[ytilestep] ; ytile+=ytilestep
- mov ax,[WORD xstep]
- add [WORD xintercept],ax ; xintercept += xstep
- adc cx,[WORD xstep+2]
- mov di,cx
- shl di,6
- add di,bp ; yspot = (xinttile<<6)+ytile
- jmp horizcheck
-
- EVEN
-hithoriz:
- mov al,[BYTE tilemap+di] ; tilehit = *((byte *)tilemap+yspot);
- mov [BYTE tilehit],al
- or al,al ; set flags
- js horizdoor
- mov [WORD xintercept+2],cx
- mov [xtile],cx
- mov [WORD yintercept],0
- mov [WORD yintercept+2],bp
- mov [ytile],bp
- call FAR HitHorizWall
- jmp nextpix
-
-;---------------------------------------------------------------------------
-;
-; next pixel over
-;
-;---------------------------------------------------------------------------
-
-nextpix:
- mov ax,[pixx]
- inc ax
- mov [pixx],ax
- cmp ax,[viewwidth]
- jge done
- jmp pixxloop
-done:
- pop bp
- pop di
- pop si
- retf
-
-;===========================================================================
-
-;=============
-;
-; hit a special horizontal wall, so find which coordinate a door would be
-; intersected at, and check to see if the door is open past that point
-;
-;=============
-horizdoor:
- mov [xtile],bx ; save off live register variables
- mov [WORD yintercept+2],dx
-
- test al,040h ; both high bits set == pushable wall
- jnz horizpushwall
-
- mov bx,ax
- and bx,7fh ; strip high bit
- shl bx,1 ; index into word width door table
-
- mov ax,[WORD xstep]
- mov dx,[WORD xstep+2]
- sar dx,1
- rcr ax,1 ; half a step gets to door position
-
- add ax,[WORD xintercept] ; add half step to current intercept pos
- adc dx,cx ; CX hold high word of xintercept
-
- cmp cx,dx ; is it still in the same tile?
- je hithmid
-;
-; midpoint is outside tile, so it hit the side of the wall before a door
-;
-continuehoriz:
- mov bx,[xtile] ; reload register variables
- mov dx,[WORD yintercept+2]
- jmp passhoriz ; continue tracing
-;
-; the trace hit the door plane at pixel position AX, see if the door is
-; closed that much
-;
-hithmid:
- cmp ax,[doorposition+bx] ; position of leading edge of door
- jb continuehoriz
-;
-; draw the door
-;
- mov [WORD xintercept],ax ; save pixel intercept position
- mov [WORD xintercept+2],cx
-
- mov [WORD yintercept],8000h ; intercept in middle of tile
- mov [WORD yintercept+2],bp
-
- call FAR HitHorizDoor
- jmp nextpix
-
-;============
-;
-; hit a sliding horizontal wall
-;
-;============
-
-horizpushwall:
- mov ax,[WORD xstep+2] ; multiply xstep by pwallmove (0-63)
- mul [pwallpos]
- mov bx,ax
- mov ax,[WORD xstep]
- mul [pwallpos]
- add dx,bx
-
- sar dx,1 ; then divide by 64 to accomplish a
- rcr ax,1 ; fixed point multiplication
- sar dx,1
- rcr ax,1
- sar dx,1
- rcr ax,1
- sar dx,1
- rcr ax,1
- sar dx,1
- rcr ax,1
- sar dx,1
- rcr ax,1
-
- add ax,[WORD xintercept] ; add partial step to current intercept
- adc dx,cx ; CX hold high word of xintercept
-
- cmp cx,dx ; is it still in the same tile?
- jne continuehoriz ; no, it hit the side
-
-;
-; draw the pushable wall at the new height
-;
- mov [WORD xintercept],ax ; save pixel intercept position
- mov [WORD xintercept+2],dx
-
- mov [WORD yintercept+2],bp
- mov [WORD yintercept],0
-
- call FAR HitHorizPWall
- jmp nextpix
-
-
-
-;===========================================================================
-
-;=============
-;
-; hit a special vertical wall, so find which coordinate a door would be
-; intersected at, and check to see if the door is open past that point
-;
-;=============
-vertdoor:
- mov [xtile],bx ; save off live register variables
- mov [WORD yintercept+2],dx
-
- test al,040h ; both high bits set == pushable wall
- jnz vertpushwall
-
- mov bx,ax
- and bx,7fh ; strip high bit
- shl bx,1 ; index into word width doorposition
-
- mov ax,[WORD ystep]
- mov dx,[WORD ystep+2]
- sar dx,1
- rcr ax,1 ; half a step gets to door position
-
- add ax,[WORD yintercept] ; add half step to current intercept pos
- adc dx,[WORD yintercept+2]
-
- cmp [WORD yintercept+2],dx ; is it still in the same tile?
- je hitvmid
-;
-; midpoint is outside tile, so it hit the side of the wall before a door
-;
-continuevert:
- mov bx,[xtile] ; reload register variables
- mov dx,[WORD yintercept+2]
- jmp passvert ; continue tracing
-;
-; the trace hit the door plane at pixel position AX, see if the door is
-; closed that much
-;
-hitvmid:
- cmp ax,[doorposition+bx] ; position of leading edge of door
- jb continuevert
-;
-; draw the door
-;
- mov [WORD yintercept],ax ; save pixel intercept position
- mov [WORD xintercept],8000h ; intercept in middle of tile
- mov ax,[xtile]
- mov [WORD xintercept+2],ax
-
- call FAR HitVertDoor
- jmp nextpix
-
-;============
-;
-; hit a sliding vertical wall
-;
-;============
-
-vertpushwall:
- mov ax,[WORD ystep+2] ; multiply ystep by pwallmove (0-63)
- mul [pwallpos]
- mov bx,ax
- mov ax,[WORD ystep]
- mul [pwallpos]
- add dx,bx
-
- sar dx,1 ; then divide by 64 to accomplish a
- rcr ax,1 ; fixed point multiplication
- sar dx,1
- rcr ax,1
- sar dx,1
- rcr ax,1
- sar dx,1
- rcr ax,1
- sar dx,1
- rcr ax,1
- sar dx,1
- rcr ax,1
-
- add ax,[WORD yintercept] ; add partial step to current intercept
- adc dx,[WORD yintercept+2]
-
- cmp [WORD yintercept+2],dx ; is it still in the same tile?
- jne continuevert ; no, it hit the side
-
-;
-; draw the pushable wall at the new height
-;
- mov [WORD yintercept],ax ; save pixel intercept position
- mov [WORD yintercept+2],dx
-
- mov bx,[xtile]
- mov [WORD xintercept+2],bx
- mov [WORD xintercept],0
-
- call FAR HitVertPWall
- jmp nextpix
-
-
-
-ENDP
-
-
-END
-
-
--- a/WOLFSRC/WL_GAME.C
+++ /dev/null
@@ -1,1484 +1,0 @@
-// WL_GAME.C
-
-#include "WL_DEF.H"
-#pragma hdrstop
-
-#ifdef MYPROFILE
-#include <TIME.H>
-#endif
-
-
-/*
-=============================================================================
-
- LOCAL CONSTANTS
-
-=============================================================================
-*/
-
-
-/*
-=============================================================================
-
- GLOBAL VARIABLES
-
-=============================================================================
-*/
-
-boolean ingame,fizzlein;
-unsigned latchpics[NUMLATCHPICS];
-gametype gamestate;
-
-long spearx,speary;
-unsigned spearangle;
-boolean spearflag;
-
-//
-// ELEVATOR BACK MAPS - REMEMBER (-1)!!
-//
-int ElevatorBackTo[]={1,1,7,3,5,3};
-
-void ScanInfoPlane (void);
-void SetupGameLevel (void);
-void DrawPlayScreen (void);
-void LoadLatchMem (void);
-void GameLoop (void);
-
-/*
-=============================================================================
-
- LOCAL VARIABLES
-
-=============================================================================
-*/
-
-
-
-//===========================================================================
-//===========================================================================
-
-
-/*
-==========================
-=
-= SetSoundLoc - Given the location of an object (in terms of global
-= coordinates, held in globalsoundx and globalsoundy), munges the values
-= for an approximate distance from the left and right ear, and puts
-= those values into leftchannel and rightchannel.
-=
-= JAB
-=
-==========================
-*/
-
- fixed globalsoundx,globalsoundy;
- int leftchannel,rightchannel;
-#define ATABLEMAX 15
-byte righttable[ATABLEMAX][ATABLEMAX * 2] = {
-{ 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 6, 0, 0, 0, 0, 0, 1, 3, 5, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 6, 4, 0, 0, 0, 0, 0, 2, 4, 6, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 6, 6, 4, 1, 0, 0, 0, 1, 2, 4, 6, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 6, 5, 4, 2, 1, 0, 1, 2, 3, 5, 7, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 6, 5, 4, 3, 2, 2, 3, 3, 5, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 6, 6, 5, 4, 4, 4, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 6, 6, 5, 5, 5, 6, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}
-};
-byte lefttable[ATABLEMAX][ATABLEMAX * 2] = {
-{ 8, 8, 8, 8, 8, 8, 8, 8, 5, 3, 1, 0, 0, 0, 0, 0, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 6, 4, 2, 0, 0, 0, 0, 0, 4, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 6, 4, 2, 1, 0, 0, 0, 1, 4, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 7, 5, 3, 2, 1, 0, 1, 2, 4, 5, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 6, 5, 3, 3, 2, 2, 3, 4, 5, 6, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 6, 5, 4, 4, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 6, 6, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 6, 6, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
-{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}
-};
-
-void
-SetSoundLoc(fixed gx,fixed gy)
-{
- fixed xt,yt;
- int x,y;
-
-//
-// translate point to view centered coordinates
-//
- gx -= viewx;
- gy -= viewy;
-
-//
-// calculate newx
-//
- xt = FixedByFrac(gx,viewcos);
- yt = FixedByFrac(gy,viewsin);
- x = (xt - yt) >> TILESHIFT;
-
-//
-// calculate newy
-//
- xt = FixedByFrac(gx,viewsin);
- yt = FixedByFrac(gy,viewcos);
- y = (yt + xt) >> TILESHIFT;
-
- if (y >= ATABLEMAX)
- y = ATABLEMAX - 1;
- else if (y <= -ATABLEMAX)
- y = -ATABLEMAX;
- if (x < 0)
- x = -x;
- if (x >= ATABLEMAX)
- x = ATABLEMAX - 1;
- leftchannel = lefttable[x][y + ATABLEMAX];
- rightchannel = righttable[x][y + ATABLEMAX];
-
-#if 0
- CenterWindow(8,1);
- US_PrintSigned(leftchannel);
- US_Print(",");
- US_PrintSigned(rightchannel);
- VW_UpdateScreen();
-#endif
-}
-
-/*
-==========================
-=
-= SetSoundLocGlobal - Sets up globalsoundx & globalsoundy and then calls
-= UpdateSoundLoc() to transform that into relative channel volumes. Those
-= values are then passed to the Sound Manager so that they'll be used for
-= the next sound played (if possible).
-=
-= JAB
-=
-==========================
-*/
-void PlaySoundLocGlobal(word s,fixed gx,fixed gy)
-{
- SetSoundLoc(gx,gy);
- SD_PositionSound(leftchannel,rightchannel);
- if (SD_PlaySound(s))
- {
- globalsoundx = gx;
- globalsoundy = gy;
- }
-}
-
-void UpdateSoundLoc(void)
-{
- if (SoundPositioned)
- {
- SetSoundLoc(globalsoundx,globalsoundy);
- SD_SetPosition(leftchannel,rightchannel);
- }
-}
-
-/*
-** JAB End
-*/
-
-
-/*
-==========================
-=
-= ClearMemory
-=
-==========================
-*/
-
-void ClearMemory (void)
-{
- PM_UnlockMainMem();
- SD_StopDigitized();
- MM_SortMem ();
-}
-
-
-/*
-==========================
-=
-= ScanInfoPlane
-=
-= Spawn all actors and mark down special places
-=
-==========================
-*/
-
-void ScanInfoPlane (void)
-{
- unsigned x,y,i,j;
- int tile;
- unsigned far *start;
-
- start = mapsegs[1];
- for (y=0;y<mapheight;y++)
- for (x=0;x<mapwidth;x++)
- {
- tile = *start++;
- if (!tile)
- continue;
-
- switch (tile)
- {
- case 19:
- case 20:
- case 21:
- case 22:
- SpawnPlayer(x,y,NORTH+tile-19);
- break;
-
- case 23:
- case 24:
- case 25:
- case 26:
- case 27:
- case 28:
- case 29:
- case 30:
-
- case 31:
- case 32:
- case 33:
- case 34:
- case 35:
- case 36:
- case 37:
- case 38:
-
- case 39:
- case 40:
- case 41:
- case 42:
- case 43:
- case 44:
- case 45:
- case 46:
-
- case 47:
- case 48:
- case 49:
- case 50:
- case 51:
- case 52:
- case 53:
- case 54:
-
- case 55:
- case 56:
- case 57:
- case 58:
- case 59:
- case 60:
- case 61:
- case 62:
-
- case 63:
- case 64:
- case 65:
- case 66:
- case 67:
- case 68:
- case 69:
- case 70:
- case 71:
- case 72:
- case 73: // TRUCK AND SPEAR!
- case 74:
-
- SpawnStatic(x,y,tile-23);
- break;
-
-//
-// P wall
-//
- case 98:
- if (!loadedgame)
- gamestate.secrettotal++;
- break;
-
-//
-// guard
-//
- case 180:
- case 181:
- case 182:
- case 183:
- if (gamestate.difficulty<gd_hard)
- break;
- tile -= 36;
- case 144:
- case 145:
- case 146:
- case 147:
- if (gamestate.difficulty<gd_medium)
- break;
- tile -= 36;
- case 108:
- case 109:
- case 110:
- case 111:
- SpawnStand(en_guard,x,y,tile-108);
- break;
-
-
- case 184:
- case 185:
- case 186:
- case 187:
- if (gamestate.difficulty<gd_hard)
- break;
- tile -= 36;
- case 148:
- case 149:
- case 150:
- case 151:
- if (gamestate.difficulty<gd_medium)
- break;
- tile -= 36;
- case 112:
- case 113:
- case 114:
- case 115:
- SpawnPatrol(en_guard,x,y,tile-112);
- break;
-
- case 124:
- SpawnDeadGuard (x,y);
- break;
-//
-// officer
-//
- case 188:
- case 189:
- case 190:
- case 191:
- if (gamestate.difficulty<gd_hard)
- break;
- tile -= 36;
- case 152:
- case 153:
- case 154:
- case 155:
- if (gamestate.difficulty<gd_medium)
- break;
- tile -= 36;
- case 116:
- case 117:
- case 118:
- case 119:
- SpawnStand(en_officer,x,y,tile-116);
- break;
-
-
- case 192:
- case 193:
- case 194:
- case 195:
- if (gamestate.difficulty<gd_hard)
- break;
- tile -= 36;
- case 156:
- case 157:
- case 158:
- case 159:
- if (gamestate.difficulty<gd_medium)
- break;
- tile -= 36;
- case 120:
- case 121:
- case 122:
- case 123:
- SpawnPatrol(en_officer,x,y,tile-120);
- break;
-
-
-//
-// ss
-//
- case 198:
- case 199:
- case 200:
- case 201:
- if (gamestate.difficulty<gd_hard)
- break;
- tile -= 36;
- case 162:
- case 163:
- case 164:
- case 165:
- if (gamestate.difficulty<gd_medium)
- break;
- tile -= 36;
- case 126:
- case 127:
- case 128:
- case 129:
- SpawnStand(en_ss,x,y,tile-126);
- break;
-
-
- case 202:
- case 203:
- case 204:
- case 205:
- if (gamestate.difficulty<gd_hard)
- break;
- tile -= 36;
- case 166:
- case 167:
- case 168:
- case 169:
- if (gamestate.difficulty<gd_medium)
- break;
- tile -= 36;
- case 130:
- case 131:
- case 132:
- case 133:
- SpawnPatrol(en_ss,x,y,tile-130);
- break;
-
-//
-// dogs
-//
- case 206:
- case 207:
- case 208:
- case 209:
- if (gamestate.difficulty<gd_hard)
- break;
- tile -= 36;
- case 170:
- case 171:
- case 172:
- case 173:
- if (gamestate.difficulty<gd_medium)
- break;
- tile -= 36;
- case 134:
- case 135:
- case 136:
- case 137:
- SpawnStand(en_dog,x,y,tile-134);
- break;
-
-
- case 210:
- case 211:
- case 212:
- case 213:
- if (gamestate.difficulty<gd_hard)
- break;
- tile -= 36;
- case 174:
- case 175:
- case 176:
- case 177:
- if (gamestate.difficulty<gd_medium)
- break;
- tile -= 36;
- case 138:
- case 139:
- case 140:
- case 141:
- SpawnPatrol(en_dog,x,y,tile-138);
- break;
-
-//
-// boss
-//
-#ifndef SPEAR
- case 214:
- SpawnBoss (x,y);
- break;
- case 197:
- SpawnGretel (x,y);
- break;
- case 215:
- SpawnGift (x,y);
- break;
- case 179:
- SpawnFat (x,y);
- break;
- case 196:
- SpawnSchabbs (x,y);
- break;
- case 160:
- SpawnFakeHitler (x,y);
- break;
- case 178:
- SpawnHitler (x,y);
- break;
-#else
- case 106:
- SpawnSpectre (x,y);
- break;
- case 107:
- SpawnAngel (x,y);
- break;
- case 125:
- SpawnTrans (x,y);
- break;
- case 142:
- SpawnUber (x,y);
- break;
- case 143:
- SpawnWill (x,y);
- break;
- case 161:
- SpawnDeath (x,y);
- break;
-
-#endif
-
-//
-// mutants
-//
- case 252:
- case 253:
- case 254:
- case 255:
- if (gamestate.difficulty<gd_hard)
- break;
- tile -= 18;
- case 234:
- case 235:
- case 236:
- case 237:
- if (gamestate.difficulty<gd_medium)
- break;
- tile -= 18;
- case 216:
- case 217:
- case 218:
- case 219:
- SpawnStand(en_mutant,x,y,tile-216);
- break;
-
- case 256:
- case 257:
- case 258:
- case 259:
- if (gamestate.difficulty<gd_hard)
- break;
- tile -= 18;
- case 238:
- case 239:
- case 240:
- case 241:
- if (gamestate.difficulty<gd_medium)
- break;
- tile -= 18;
- case 220:
- case 221:
- case 222:
- case 223:
- SpawnPatrol(en_mutant,x,y,tile-220);
- break;
-
-//
-// ghosts
-//
-#ifndef SPEAR
- case 224:
- SpawnGhosts (en_blinky,x,y);
- break;
- case 225:
- SpawnGhosts (en_clyde,x,y);
- break;
- case 226:
- SpawnGhosts (en_pinky,x,y);
- break;
- case 227:
- SpawnGhosts (en_inky,x,y);
- break;
-#endif
- }
-
- }
-}
-
-//==========================================================================
-
-/*
-==================
-=
-= SetupGameLevel
-=
-==================
-*/
-
-void SetupGameLevel (void)
-{
- int x,y,i;
- unsigned far *map,tile,spot;
-
-
- if (!loadedgame)
- {
- gamestate.TimeCount=
- gamestate.secrettotal=
- gamestate.killtotal=
- gamestate.treasuretotal=
- gamestate.secretcount=
- gamestate.killcount=
- gamestate.treasurecount=0;
- }
-
- if (demoplayback || demorecord)
- US_InitRndT (false);
- else
- US_InitRndT (true);
-
-//
-// load the level
-//
- CA_CacheMap (gamestate.mapon+10*gamestate.episode);
- mapon-=gamestate.episode*10;
-
- mapwidth = mapheaderseg[mapon]->width;
- mapheight = mapheaderseg[mapon]->height;
-
- if (mapwidth != 64 || mapheight != 64)
- Quit ("Map not 64*64!");
-
-
-//
-// copy the wall data to a data segment array
-//
- memset (tilemap,0,sizeof(tilemap));
- memset (actorat,0,sizeof(actorat));
- map = mapsegs[0];
- for (y=0;y<mapheight;y++)
- for (x=0;x<mapwidth;x++)
- {
- tile = *map++;
- if (tile<AREATILE)
- {
- // solid wall
- tilemap[x][y] = tile;
- (unsigned)actorat[x][y] = tile;
- }
- else
- {
- // area floor
- tilemap[x][y] = 0;
- (unsigned)actorat[x][y] = 0;
- }
- }
-
-//
-// spawn doors
-//
- InitActorList (); // start spawning things with a clean slate
- InitDoorList ();
- InitStaticList ();
-
- map = mapsegs[0];
- for (y=0;y<mapheight;y++)
- for (x=0;x<mapwidth;x++)
- {
- tile = *map++;
- if (tile >= 90 && tile <= 101)
- {
- // door
- switch (tile)
- {
- case 90:
- case 92:
- case 94:
- case 96:
- case 98:
- case 100:
- SpawnDoor (x,y,1,(tile-90)/2);
- break;
- case 91:
- case 93:
- case 95:
- case 97:
- case 99:
- case 101:
- SpawnDoor (x,y,0,(tile-91)/2);
- break;
- }
- }
- }
-
-//
-// spawn actors
-//
- ScanInfoPlane ();
-
-//
-// take out the ambush markers
-//
- map = mapsegs[0];
- for (y=0;y<mapheight;y++)
- for (x=0;x<mapwidth;x++)
- {
- tile = *map++;
- if (tile == AMBUSHTILE)
- {
- tilemap[x][y] = 0;
- if ( (unsigned)actorat[x][y] == AMBUSHTILE)
- actorat[x][y] = NULL;
-
- if (*map >= AREATILE)
- tile = *map;
- if (*(map-1-mapwidth) >= AREATILE)
- tile = *(map-1-mapwidth);
- if (*(map-1+mapwidth) >= AREATILE)
- tile = *(map-1+mapwidth);
- if ( *(map-2) >= AREATILE)
- tile = *(map-2);
-
- *(map-1) = tile;
- }
- }
-
-
-
-//
-// have the caching manager load and purge stuff to make sure all marks
-// are in memory
-//
- CA_LoadAllSounds ();
-
-}
-
-
-//==========================================================================
-
-
-/*
-===================
-=
-= DrawPlayBorderSides
-=
-= To fix window overwrites
-=
-===================
-*/
-
-void DrawPlayBorderSides (void)
-{
- int xl,yl;
-
- xl = 160-viewwidth/2;
- yl = (200-STATUSLINES-viewheight)/2;
-
- VWB_Bar (0,0,xl-1,200-STATUSLINES,127);
- VWB_Bar (xl+viewwidth+1,0,xl-2,200-STATUSLINES,127);
-
- VWB_Vlin (yl-1,yl+viewheight,xl-1,0);
- VWB_Vlin (yl-1,yl+viewheight,xl+viewwidth,125);
-}
-
-
-/*
-===================
-=
-= DrawAllPlayBorderSides
-=
-===================
-*/
-
-void DrawAllPlayBorderSides (void)
-{
- unsigned i,temp;
-
- temp = bufferofs;
- for (i=0;i<3;i++)
- {
- bufferofs = screenloc[i];
- DrawPlayBorderSides ();
- }
- bufferofs = temp;
-}
-
-/*
-===================
-=
-= DrawPlayBorder
-=
-===================
-*/
-void DrawAllPlayBorder (void)
-{
- unsigned i,temp;
-
- temp = bufferofs;
- for (i=0;i<3;i++)
- {
- bufferofs = screenloc[i];
- DrawPlayBorder ();
- }
- bufferofs = temp;
-}
-
-/*
-===================
-=
-= DrawPlayBorder
-=
-===================
-*/
-
-void DrawPlayBorder (void)
-{
- int xl,yl;
-
- VWB_Bar (0,0,320,200-STATUSLINES,127);
-
- xl = 160-viewwidth/2;
- yl = (200-STATUSLINES-viewheight)/2;
- VWB_Bar (xl,yl,viewwidth,viewheight,0);
-
- VWB_Hlin (xl-1,xl+viewwidth,yl-1,0);
- VWB_Hlin (xl-1,xl+viewwidth,yl+viewheight,125);
- VWB_Vlin (yl-1,yl+viewheight,xl-1,0);
- VWB_Vlin (yl-1,yl+viewheight,xl+viewwidth,125);
- VWB_Plot (xl-1,yl+viewheight,124);
-}
-
-
-
-/*
-===================
-=
-= DrawPlayScreen
-=
-===================
-*/
-
-void DrawPlayScreen (void)
-{
- int i,j,p,m;
- unsigned temp;
-
- VW_FadeOut ();
-
- temp = bufferofs;
-
- CA_CacheGrChunk (STATUSBARPIC);
-
- for (i=0;i<3;i++)
- {
- bufferofs = screenloc[i];
- DrawPlayBorder ();
- VWB_DrawPic (0,200-STATUSLINES,STATUSBARPIC);
- }
-
- bufferofs = temp;
-
- UNCACHEGRCHUNK (STATUSBARPIC);
-
- DrawFace ();
- DrawHealth ();
- DrawLives ();
- DrawLevel ();
- DrawAmmo ();
- DrawKeys ();
- DrawWeapon ();
- DrawScore ();
-}
-
-
-
-//==========================================================================
-
-/*
-==================
-=
-= StartDemoRecord
-=
-==================
-*/
-
-#define MAXDEMOSIZE 8192
-
-void StartDemoRecord (int levelnumber)
-{
- MM_GetPtr (&demobuffer,MAXDEMOSIZE);
- MM_SetLock (&demobuffer,true);
- demoptr = (char far *)demobuffer;
- lastdemoptr = demoptr+MAXDEMOSIZE;
-
- *demoptr = levelnumber;
- demoptr += 4; // leave space for length
- demorecord = true;
-}
-
-
-/*
-==================
-=
-= FinishDemoRecord
-=
-==================
-*/
-
-char demoname[13] = "DEMO?.";
-
-void FinishDemoRecord (void)
-{
- long length,level;
-
- demorecord = false;
-
- length = demoptr - (char far *)demobuffer;
-
- demoptr = ((char far *)demobuffer)+1;
- *(unsigned far *)demoptr = length;
-
- CenterWindow(24,3);
- PrintY+=6;
- US_Print(" Demo number (0-9):");
- VW_UpdateScreen();
-
- if (US_LineInput (px,py,str,NULL,true,2,0))
- {
- level = atoi (str);
- if (level>=0 && level<=9)
- {
- demoname[4] = '0'+level;
- CA_WriteFile (demoname,(void far *)demobuffer,length);
- }
- }
-
-
- MM_FreePtr (&demobuffer);
-}
-
-//==========================================================================
-
-/*
-==================
-=
-= RecordDemo
-=
-= Fades the screen out, then starts a demo. Exits with the screen faded
-=
-==================
-*/
-
-void RecordDemo (void)
-{
- int level,esc;
-
- CenterWindow(26,3);
- PrintY+=6;
- CA_CacheGrChunk(STARTFONT);
- fontnumber=0;
- US_Print(" Demo which level(1-10):");
- VW_UpdateScreen();
- VW_FadeIn ();
- esc = !US_LineInput (px,py,str,NULL,true,2,0);
- if (esc)
- return;
-
- level = atoi (str);
- level--;
-
- SETFONTCOLOR(0,15);
- VW_FadeOut ();
-
-#ifndef SPEAR
- NewGame (gd_hard,level/10);
- gamestate.mapon = level%10;
-#else
- NewGame (gd_hard,0);
- gamestate.mapon = level;
-#endif
-
- StartDemoRecord (level);
-
- DrawPlayScreen ();
- VW_FadeIn ();
-
- startgame = false;
- demorecord = true;
-
- SetupGameLevel ();
- StartMusic ();
- PM_CheckMainMem ();
- fizzlein = true;
-
- PlayLoop ();
-
- demoplayback = false;
-
- StopMusic ();
- VW_FadeOut ();
- ClearMemory ();
-
- FinishDemoRecord ();
-}
-
-//==========================================================================
-
-/*
-==================
-=
-= PlayDemo
-=
-= Fades the screen out, then starts a demo. Exits with the screen faded
-=
-==================
-*/
-
-void PlayDemo (int demonumber)
-{
- int length;
-
-#ifdef DEMOSEXTERN
-// debug: load chunk
-#ifndef SPEARDEMO
- int dems[4]={T_DEMO0,T_DEMO1,T_DEMO2,T_DEMO3};
-#else
- int dems[1]={T_DEMO0};
-#endif
-
- CA_CacheGrChunk(dems[demonumber]);
- demoptr = grsegs[dems[demonumber]];
- MM_SetLock (&grsegs[dems[demonumber]],true);
-#else
- demoname[4] = '0'+demonumber;
- CA_LoadFile (demoname,&demobuffer);
- MM_SetLock (&demobuffer,true);
- demoptr = (char far *)demobuffer;
-#endif
-
- NewGame (1,0);
- gamestate.mapon = *demoptr++;
- gamestate.difficulty = gd_hard;
- length = *((unsigned far *)demoptr)++;
- demoptr++;
- lastdemoptr = demoptr-4+length;
-
- VW_FadeOut ();
-
- SETFONTCOLOR(0,15);
- DrawPlayScreen ();
- VW_FadeIn ();
-
- startgame = false;
- demoplayback = true;
-
- SetupGameLevel ();
- StartMusic ();
- PM_CheckMainMem ();
- fizzlein = true;
-
- PlayLoop ();
-
-#ifdef DEMOSEXTERN
- UNCACHEGRCHUNK(dems[demonumber]);
-#else
- MM_FreePtr (&demobuffer);
-#endif
-
- demoplayback = false;
-
- StopMusic ();
- VW_FadeOut ();
- ClearMemory ();
-}
-
-//==========================================================================
-
-/*
-==================
-=
-= Died
-=
-==================
-*/
-
-#define DEATHROTATE 2
-
-void Died (void)
-{
- float fangle;
- long dx,dy;
- int iangle,curangle,clockwise,counter,change;
-
- gamestate.weapon = -1; // take away weapon
- SD_PlaySound (PLAYERDEATHSND);
-//
-// swing around to face attacker
-//
- dx = killerobj->x - player->x;
- dy = player->y - killerobj->y;
-
- fangle = atan2(dy,dx); // returns -pi to pi
- if (fangle<0)
- fangle = M_PI*2+fangle;
-
- iangle = fangle/(M_PI*2)*ANGLES;
-
- if (player->angle > iangle)
- {
- counter = player->angle - iangle;
- clockwise = ANGLES-player->angle + iangle;
- }
- else
- {
- clockwise = iangle - player->angle;
- counter = player->angle + ANGLES-iangle;
- }
-
- curangle = player->angle;
-
- if (clockwise<counter)
- {
- //
- // rotate clockwise
- //
- if (curangle>iangle)
- curangle -= ANGLES;
- do
- {
- change = tics*DEATHROTATE;
- if (curangle + change > iangle)
- change = iangle-curangle;
-
- curangle += change;
- player->angle += change;
- if (player->angle >= ANGLES)
- player->angle -= ANGLES;
-
- ThreeDRefresh ();
- CalcTics ();
- } while (curangle != iangle);
- }
- else
- {
- //
- // rotate counterclockwise
- //
- if (curangle<iangle)
- curangle += ANGLES;
- do
- {
- change = -tics*DEATHROTATE;
- if (curangle + change < iangle)
- change = iangle-curangle;
-
- curangle += change;
- player->angle += change;
- if (player->angle < 0)
- player->angle += ANGLES;
-
- ThreeDRefresh ();
- CalcTics ();
- } while (curangle != iangle);
- }
-
-//
-// fade to red
-//
- FinishPaletteShifts ();
-
- bufferofs += screenofs;
- VW_Bar (0,0,viewwidth,viewheight,4);
- IN_ClearKeysDown ();
- FizzleFade(bufferofs,displayofs+screenofs,viewwidth,viewheight,70,false);
- bufferofs -= screenofs;
- IN_UserInput(100);
- SD_WaitSoundDone ();
-
- if (tedlevel == false) // SO'S YA DON'T GET KILLED WHILE LAUNCHING!
- gamestate.lives--;
-
- if (gamestate.lives > -1)
- {
- gamestate.health = 100;
- gamestate.weapon = gamestate.bestweapon
- = gamestate.chosenweapon = wp_pistol;
- gamestate.ammo = STARTAMMO;
- gamestate.keys = 0;
- gamestate.attackframe = gamestate.attackcount =
- gamestate.weaponframe = 0;
-
- DrawKeys ();
- DrawWeapon ();
- DrawAmmo ();
- DrawHealth ();
- DrawFace ();
- DrawLives ();
- }
-
-}
-
-//==========================================================================
-
-/*
-===================
-=
-= GameLoop
-=
-===================
-*/
-
-void GameLoop (void)
-{
- int i,xl,yl,xh,yh;
- char num[20];
- boolean died;
-#ifdef MYPROFILE
- clock_t start,end;
-#endif
-
-restartgame:
- ClearMemory ();
- SETFONTCOLOR(0,15);
- DrawPlayScreen ();
- died = false;
-restart:
- do
- {
- if (!loadedgame)
- gamestate.score = gamestate.oldscore;
- DrawScore();
-
- startgame = false;
- if (loadedgame)
- loadedgame = false;
- else
- SetupGameLevel ();
-
-#ifdef SPEAR
- if (gamestate.mapon == 20) // give them the key allways
- {
- gamestate.keys |= 1;
- DrawKeys ();
- }
-#endif
-
- ingame = true;
- StartMusic ();
- PM_CheckMainMem ();
- if (!died)
- PreloadGraphics ();
- else
- died = false;
-
- fizzlein = true;
- DrawLevel ();
-
-startplayloop:
- PlayLoop ();
-
-#ifdef SPEAR
- if (spearflag)
- {
- SD_StopSound();
- SD_PlaySound(GETSPEARSND);
- if (DigiMode != sds_Off)
- {
- long lasttimecount = TimeCount;
-
- while(TimeCount < lasttimecount+150)
- //while(DigiPlaying!=false)
- SD_Poll();
- }
- else
- SD_WaitSoundDone();
-
- ClearMemory ();
- gamestate.oldscore = gamestate.score;
- gamestate.mapon = 20;
- SetupGameLevel ();
- StartMusic ();
- PM_CheckMainMem ();
- player->x = spearx;
- player->y = speary;
- player->angle = spearangle;
- spearflag = false;
- Thrust (0,0);
- goto startplayloop;
- }
-#endif
-
- StopMusic ();
- ingame = false;
-
- if (demorecord && playstate != ex_warped)
- FinishDemoRecord ();
-
- if (startgame || loadedgame)
- goto restartgame;
-
- switch (playstate)
- {
- case ex_completed:
- case ex_secretlevel:
- gamestate.keys = 0;
- DrawKeys ();
- VW_FadeOut ();
-
- ClearMemory ();
-
- LevelCompleted (); // do the intermission
-#ifdef SPEARDEMO
- if (gamestate.mapon == 1)
- {
- died = true; // don't "get psyched!"
-
- VW_FadeOut ();
-
- ClearMemory ();
-
- CheckHighScore (gamestate.score,gamestate.mapon+1);
-
- #pragma warn -sus
- #ifndef JAPAN
- _fstrcpy(MainMenu[viewscores].string,STR_VS);
- #endif
- MainMenu[viewscores].routine = CP_ViewScores;
- #pragma warn +sus
-
- return;
- }
-#endif
-
-#ifdef JAPDEMO
- if (gamestate.mapon == 3)
- {
- died = true; // don't "get psyched!"
-
- VW_FadeOut ();
-
- ClearMemory ();
-
- CheckHighScore (gamestate.score,gamestate.mapon+1);
-
- #pragma warn -sus
- #ifndef JAPAN
- _fstrcpy(MainMenu[viewscores].string,STR_VS);
- #endif
- MainMenu[viewscores].routine = CP_ViewScores;
- #pragma warn +sus
-
- return;
- }
-#endif
-
- gamestate.oldscore = gamestate.score;
-
-#ifndef SPEAR
- //
- // COMING BACK FROM SECRET LEVEL
- //
- if (gamestate.mapon == 9)
- gamestate.mapon = ElevatorBackTo[gamestate.episode]; // back from secret
- else
- //
- // GOING TO SECRET LEVEL
- //
- if (playstate == ex_secretlevel)
- gamestate.mapon = 9;
-#else
-
-#define FROMSECRET1 3
-#define FROMSECRET2 11
-
- //
- // GOING TO SECRET LEVEL
- //
- if (playstate == ex_secretlevel)
- switch(gamestate.mapon)
- {
- case FROMSECRET1: gamestate.mapon = 18; break;
- case FROMSECRET2: gamestate.mapon = 19; break;
- }
- else
- //
- // COMING BACK FROM SECRET LEVEL
- //
- if (gamestate.mapon == 18 || gamestate.mapon == 19)
- switch(gamestate.mapon)
- {
- case 18: gamestate.mapon = FROMSECRET1+1; break;
- case 19: gamestate.mapon = FROMSECRET2+1; break;
- }
-#endif
- else
- //
- // GOING TO NEXT LEVEL
- //
- gamestate.mapon++;
-
-
- break;
-
- case ex_died:
- Died ();
- died = true; // don't "get psyched!"
-
- if (gamestate.lives > -1)
- break; // more lives left
-
- VW_FadeOut ();
-
- ClearMemory ();
-
- CheckHighScore (gamestate.score,gamestate.mapon+1);
-
- #pragma warn -sus
- #ifndef JAPAN
- _fstrcpy(MainMenu[viewscores].string,STR_VS);
- #endif
- MainMenu[viewscores].routine = CP_ViewScores;
- #pragma warn +sus
-
- return;
-
- case ex_victorious:
-
-#ifndef SPEAR
- VW_FadeOut ();
-#else
- VL_FadeOut (0,255,0,17,17,300);
-#endif
- ClearMemory ();
-
- Victory ();
-
- ClearMemory ();
-
- CheckHighScore (gamestate.score,gamestate.mapon+1);
-
- #pragma warn -sus
- #ifndef JAPAN
- _fstrcpy(MainMenu[viewscores].string,STR_VS);
- #endif
- MainMenu[viewscores].routine = CP_ViewScores;
- #pragma warn +sus
-
- return;
-
- default:
- ClearMemory ();
- break;
- }
-
- } while (1);
-
-}
-
--- a/WOLFSRC/WL_INTER.C
+++ /dev/null
@@ -1,1718 +1,0 @@
-// WL_INTER.C
-
-#include "WL_DEF.H"
-#pragma hdrstop
-
-
-//==========================================================================
-
-/*
-==================
-=
-= CLearSplitVWB
-=
-==================
-*/
-
-void ClearSplitVWB (void)
-{
- memset (update,0,sizeof(update));
- WindowX = 0;
- WindowY = 0;
- WindowW = 320;
- WindowH = 160;
-}
-
-
-//==========================================================================
-
-#ifdef SPEAR
-#ifndef SPEARDEMO
-////////////////////////////////////////////////////////
-//
-// End of Spear of Destiny
-//
-////////////////////////////////////////////////////////
-
-void EndScreen (int palette, int screen)
-{
- CA_CacheScreen (screen);
- VW_UpdateScreen ();
- CA_CacheGrChunk (palette);
- VL_FadeIn(0,255,grsegs[palette],30);
- UNCACHEGRCHUNK (palette);
- IN_ClearKeysDown ();
- IN_Ack ();
- VW_FadeOut ();
-}
-
-
-void EndSpear(void)
-{
- EndScreen (END1PALETTE, ENDSCREEN11PIC);
-
- CA_CacheScreen (ENDSCREEN3PIC);
- VW_UpdateScreen ();
- CA_CacheGrChunk (END3PALETTE);
- VL_FadeIn(0,255,grsegs[END3PALETTE],30);
- UNCACHEGRCHUNK (END3PALETTE);
- fontnumber = 0;
- fontcolor = 0xd0;
- WindowX = 0;
- WindowW = 320;
- PrintX = 0;
- PrintY = 180;
- US_CPrint (STR_ENDGAME1"\n");
- US_CPrint (STR_ENDGAME2);
- VW_UpdateScreen ();
- IN_StartAck ();
- TimeCount = 0;
- while (!IN_CheckAck () && TimeCount < 700);
-
- PrintX = 0;
- PrintY = 180;
- VWB_Bar(0,180,320,20,0);
- US_CPrint (STR_ENDGAME3"\n");
- US_CPrint (STR_ENDGAME4);
- VW_UpdateScreen ();
- IN_StartAck ();
- TimeCount = 0;
- while (!IN_CheckAck () && TimeCount < 700);
-
- VW_FadeOut ();
-
- EndScreen (END4PALETTE, ENDSCREEN4PIC);
- EndScreen (END5PALETTE, ENDSCREEN5PIC);
- EndScreen (END6PALETTE, ENDSCREEN6PIC);
- EndScreen (END7PALETTE, ENDSCREEN7PIC);
- EndScreen (END8PALETTE, ENDSCREEN8PIC);
- EndScreen (END9PALETTE, ENDSCREEN9PIC);
-
- EndScreen (END2PALETTE, ENDSCREEN12PIC);
-
- MainMenu[savegame].active = 0;
-}
-#endif
-#endif
-
-//==========================================================================
-
-/*
-==================
-=
-= Victory
-=
-==================
-*/
-
-void Victory (void)
-{
-#ifndef SPEARDEMO
- long sec;
- int i,min,kr,sr,tr,x;
- char tempstr[8];
-
-#define RATIOX 6
-#define RATIOY 14
-#define TIMEX 14
-#define TIMEY 8
-
-
-#ifdef SPEAR
- StartCPMusic (XTHEEND_MUS);
-
- CA_CacheGrChunk(BJCOLLAPSE1PIC);
- CA_CacheGrChunk(BJCOLLAPSE2PIC);
- CA_CacheGrChunk(BJCOLLAPSE3PIC);
- CA_CacheGrChunk(BJCOLLAPSE4PIC);
-
- VWB_Bar(0,0,320,200,VIEWCOLOR);
- VWB_DrawPic (124,44,BJCOLLAPSE1PIC);
- VW_UpdateScreen ();
- VW_FadeIn ();
- VW_WaitVBL(2*70);
- VWB_DrawPic (124,44,BJCOLLAPSE2PIC);
- VW_UpdateScreen ();
- VW_WaitVBL(105);
- VWB_DrawPic (124,44,BJCOLLAPSE3PIC);
- VW_UpdateScreen ();
- VW_WaitVBL(105);
- VWB_DrawPic (124,44,BJCOLLAPSE4PIC);
- VW_UpdateScreen ();
- VW_WaitVBL(3*70);
-
- UNCACHEGRCHUNK(BJCOLLAPSE1PIC);
- UNCACHEGRCHUNK(BJCOLLAPSE2PIC);
- UNCACHEGRCHUNK(BJCOLLAPSE3PIC);
- UNCACHEGRCHUNK(BJCOLLAPSE4PIC);
- VL_FadeOut (0,255,0,17,17,5);
-#endif
-
- StartCPMusic (URAHERO_MUS);
- ClearSplitVWB ();
- CacheLump(LEVELEND_LUMP_START,LEVELEND_LUMP_END);
- CA_CacheGrChunk(STARTFONT);
-
-#ifndef SPEAR
- CA_CacheGrChunk(C_TIMECODEPIC);
-#endif
-
-
- VWB_Bar (0,0,320,200-STATUSLINES,127);
-#ifdef JAPAN
-#ifndef JAPDEMO
- CA_CacheGrChunk(C_ENDRATIOSPIC);
- VWB_DrawPic(0,0,C_ENDRATIOSPIC);
- UNCACHEGRCHUNK(C_ENDRATIOSPIC);
-#endif
-#else
- Write(18,2,STR_YOUWIN);
-
- Write(TIMEX,TIMEY-2,STR_TOTALTIME);
-
- Write(12,RATIOY-2,"averages");
-
- #ifdef SPANISH
- Write(RATIOX+2, RATIOY, STR_RATKILL);
- Write(RATIOX+2, RATIOY+2, STR_RATSECRET);
- Write(RATIOX+2, RATIOY+4,STR_RATTREASURE);
- #else
- Write(RATIOX+8,RATIOY, STR_RATKILL);
- Write(RATIOX+4,RATIOY+2, STR_RATSECRET);
- Write(RATIOX, RATIOY+4,STR_RATTREASURE);
- #endif
-
-#endif
-
-#ifndef JAPDEMO
- VWB_DrawPic (8,4,L_BJWINSPIC);
-#endif
-
-
-#ifndef SPEAR
- for (kr = sr = tr = sec = i = 0;i < 8;i++)
-#else
- for (kr = sr = tr = sec = i = 0;i < 20;i++)
-#endif
- {
- sec += LevelRatios[i].time;
- kr += LevelRatios[i].kill;
- sr += LevelRatios[i].secret;
- tr += LevelRatios[i].treasure;
- }
-
-#ifndef SPEAR
- kr /= 8;
- sr /= 8;
- tr /= 8;
-#else
- kr /= 14;
- sr /= 14;
- tr /= 14;
-#endif
-
- min = sec/60;
- sec %= 60;
-
- if (min > 99)
- min = sec = 99;
-
- i = TIMEX*8+1;
- VWB_DrawPic(i,TIMEY*8,L_NUM0PIC+(min/10));
- i += 2*8;
- VWB_DrawPic(i,TIMEY*8,L_NUM0PIC+(min%10));
- i += 2*8;
- Write(i/8,TIMEY,":");
- i += 1*8;
- VWB_DrawPic(i,TIMEY*8,L_NUM0PIC+(sec/10));
- i += 2*8;
- VWB_DrawPic(i,TIMEY*8,L_NUM0PIC+(sec%10));
- VW_UpdateScreen ();
-
- itoa(kr,tempstr,10);
- x=RATIOX+24-strlen(tempstr)*2;
- Write(x,RATIOY,tempstr);
-
- itoa(sr,tempstr,10);
- x=RATIOX+24-strlen(tempstr)*2;
- Write(x,RATIOY+2,tempstr);
-
- itoa(tr,tempstr,10);
- x=RATIOX+24-strlen(tempstr)*2;
- Write(x,RATIOY+4,tempstr);
-
-
-#ifndef SPANISH
-#ifndef UPLOAD
-#ifndef SPEAR
- //
- // TOTAL TIME VERIFICATION CODE
- //
- if (gamestate.difficulty>=gd_medium)
- {
- VWB_DrawPic (30*8,TIMEY*8,C_TIMECODEPIC);
- fontnumber = 0;
- fontcolor = READHCOLOR;
- PrintX = 30*8-3;
- PrintY = TIMEY*8+8;
- PrintX+=4;
- tempstr[0] = (((min/10)^(min%10))^0xa)+'A';
- tempstr[1] = (((sec/10)^(sec%10))^0xa)+'A';
- tempstr[2] = (tempstr[0]^tempstr[1])+'A';
- tempstr[3] = 0;
- US_Print(tempstr);
- }
-#endif
-#endif
-#endif
-
-
- fontnumber = 1;
-
- VW_UpdateScreen ();
- VW_FadeIn ();
-
- IN_Ack();
-
- #ifndef SPEAR
- if (Keyboard[sc_P] && MS_CheckParm("goobers"))
- PicturePause();
- #endif
-
- VW_FadeOut ();
-
-#ifndef SPEAR
- UNCACHEGRCHUNK(C_TIMECODEPIC);
-#endif
- UnCacheLump(LEVELEND_LUMP_START,LEVELEND_LUMP_END);
-
-#ifndef SPEAR
- EndText();
-#else
- EndSpear();
-#endif
-
-#endif // SPEARDEMO
-}
-
-
-//==========================================================================
-
-#ifndef JAPAN
-/*
-==================
-=
-= PG13
-=
-==================
-*/
-
-void PG13 (void)
-{
- VW_FadeOut();
- VWB_Bar(0,0,320,200,0x82); // background
-
- CA_CacheGrChunk (PG13PIC);
- VWB_DrawPic (216,110,PG13PIC);
- VW_UpdateScreen ();
-
- UNCACHEGRCHUNK (PG13PIC);
-
- VW_FadeIn();
- IN_UserInput(TickBase*7);
-
- VW_FadeOut ();
-}
-#endif
-
-
-//==========================================================================
-
-void Write(int x,int y,char *string)
-{
- int alpha[]={L_NUM0PIC,L_NUM1PIC,L_NUM2PIC,L_NUM3PIC,L_NUM4PIC,L_NUM5PIC,
- L_NUM6PIC,L_NUM7PIC,L_NUM8PIC,L_NUM9PIC,L_COLONPIC,0,0,0,0,0,0,L_APIC,L_BPIC,
- L_CPIC,L_DPIC,L_EPIC,L_FPIC,L_GPIC,L_HPIC,L_IPIC,L_JPIC,L_KPIC,
- L_LPIC,L_MPIC,L_NPIC,L_OPIC,L_PPIC,L_QPIC,L_RPIC,L_SPIC,L_TPIC,
- L_UPIC,L_VPIC,L_WPIC,L_XPIC,L_YPIC,L_ZPIC};
-
- int i,ox,nx,ny;
- char ch;
-
-
- ox=nx=x*8;
- ny=y*8;
- for (i=0;i<strlen(string);i++)
- if (string[i]=='\n')
- {
- nx=ox;
- ny+=16;
- }
- else
- {
- ch=string[i];
- if (ch>='a')
- ch-=('a'-'A');
- ch-='0';
-
- switch(string[i])
- {
- case '!':
- VWB_DrawPic(nx,ny,L_EXPOINTPIC);
- nx+=8;
- continue;
-
- case '\'':
- VWB_DrawPic(nx,ny,L_APOSTROPHEPIC);
- nx+=8;
- continue;
-
- case ' ': break;
- case 0x3a: // ':'
-
- VWB_DrawPic(nx,ny,L_COLONPIC);
- nx+=8;
- continue;
-
- case '%':
- VWB_DrawPic(nx,ny,L_PERCENTPIC);
- break;
-
- default:
- VWB_DrawPic(nx,ny,alpha[ch]);
- }
- nx+=16;
- }
-}
-
-
-//
-// Breathe Mr. BJ!!!
-//
-void BJ_Breathe(void)
-{
- static int which=0,max=10;
- int pics[2]={L_GUYPIC,L_GUY2PIC};
-
-
- if (TimeCount>max)
- {
- which^=1;
- VWB_DrawPic(0,16,pics[which]);
- VW_UpdateScreen();
- TimeCount=0;
- max=35;
- }
-}
-
-
-
-/*
-==================
-=
-= LevelCompleted
-=
-= Entered with the screen faded out
-= Still in split screen mode with the status bar
-=
-= Exit with the screen faded out
-=
-==================
-*/
-
-#ifndef SPEAR
-LRstruct LevelRatios[8];
-#else
-LRstruct LevelRatios[20];
-#endif
-
-void LevelCompleted (void)
-{
- #define VBLWAIT 30
- #define PAR_AMOUNT 500
- #define PERCENT100AMT 10000
- typedef struct {
- float time;
- char timestr[6];
- } times;
-
- int x,i,min,sec,ratio,kr,sr,tr;
- unsigned temp;
- char tempstr[10];
- long bonus,timeleft=0;
- times parTimes[]=
- {
-#ifndef SPEAR
- //
- // Episode One Par Times
- //
- {1.5, "01:30"},
- {2, "02:00"},
- {2, "02:00"},
- {3.5, "03:30"},
- {3, "03:00"},
- {3, "03:00"},
- {2.5, "02:30"},
- {2.5, "02:30"},
- {0, "??:??"}, // Boss level
- {0, "??:??"}, // Secret level
-
- //
- // Episode Two Par Times
- //
- {1.5, "01:30"},
- {3.5, "03:30"},
- {3, "03:00"},
- {2, "02:00"},
- {4, "04:00"},
- {6, "06:00"},
- {1, "01:00"},
- {3, "03:00"},
- {0, "??:??"},
- {0, "??:??"},
-
- //
- // Episode Three Par Times
- //
- {1.5, "01:30"},
- {1.5, "01:30"},
- {2.5, "02:30"},
- {2.5, "02:30"},
- {3.5, "03:30"},
- {2.5, "02:30"},
- {2, "02:00"},
- {6, "06:00"},
- {0, "??:??"},
- {0, "??:??"},
-
- //
- // Episode Four Par Times
- //
- {2, "02:00"},
- {2, "02:00"},
- {1.5, "01:30"},
- {1, "01:00"},
- {4.5, "04:30"},
- {3.5, "03:30"},
- {2, "02:00"},
- {4.5, "04:30"},
- {0, "??:??"},
- {0, "??:??"},
-
- //
- // Episode Five Par Times
- //
- {2.5, "02:30"},
- {1.5, "01:30"},
- {2.5, "02:30"},
- {2.5, "02:30"},
- {4, "04:00"},
- {3, "03:00"},
- {4.5, "04:30"},
- {3.5, "03:30"},
- {0, "??:??"},
- {0, "??:??"},
-
- //
- // Episode Six Par Times
- //
- {6.5, "06:30"},
- {4, "04:00"},
- {4.5, "04:30"},
- {6, "06:00"},
- {5, "05:00"},
- {5.5, "05:30"},
- {5.5, "05:30"},
- {8.5, "08:30"},
- {0, "??:??"},
- {0, "??:??"}
-#else
- //
- // SPEAR OF DESTINY TIMES
- //
- {1.5, "01:30"},
- {3.5, "03:30"},
- {2.75, "02:45"},
- {3.5, "03:30"},
- {0, "??:??"}, // Boss 1
- {4.5, "04:30"},
- {3.25, "03:15"},
- {2.75, "02:45"},
- {4.75, "04:45"},
- {0, "??:??"}, // Boss 2
- {6.5, "06:30"},
- {4.5, "04:30"},
- {2.75, "02:45"},
- {4.5, "04:30"},
- {6, "06:00"},
- {0, "??:??"}, // Boss 3
- {6, "06:00"},
- {0, "??:??"}, // Boss 4
- {0, "??:??"}, // Secret level 1
- {0, "??:??"}, // Secret level 2
-#endif
- };
-
-
-
- CacheLump(LEVELEND_LUMP_START,LEVELEND_LUMP_END);
- ClearSplitVWB (); // set up for double buffering in split screen
- VWB_Bar (0,0,320,200-STATUSLINES,127);
- StartCPMusic(ENDLEVEL_MUS);
-
-//
-// do the intermission
-//
- IN_ClearKeysDown();
- IN_StartAck();
-
-#ifdef JAPAN
- CA_CacheGrChunk(C_INTERMISSIONPIC);
- VWB_DrawPic(0,0,C_INTERMISSIONPIC);
- UNCACHEGRCHUNK(C_INTERMISSIONPIC);
-#endif
- VWB_DrawPic(0,16,L_GUYPIC);
-
-#ifndef SPEAR
- if (mapon<8)
-#else
- if (mapon != 4 &&
- mapon != 9 &&
- mapon != 15 &&
- mapon < 17)
-#endif
- {
-#ifndef JAPAN
- #ifdef SPANISH
- Write(14,2,"piso\ncompletado");
- #else
- Write(14,2,"floor\ncompleted");
- #endif
-
- Write(14,7,STR_BONUS" 0");
- Write(16,10,STR_TIME);
- Write(16,12,STR_PAR);
-
- #ifdef SPANISH
- Write(11,14, STR_RAT2KILL);
- Write(11,16, STR_RAT2SECRET);
- Write(11,18,STR_RAT2TREASURE);
- #else
- Write(9,14, STR_RAT2KILL);
- Write(5,16, STR_RAT2SECRET);
- Write(1,18,STR_RAT2TREASURE);
- #endif
-
- Write(26,2,itoa(gamestate.mapon+1,tempstr,10));
-#endif
-
- #ifdef SPANISH
- Write(30,12,parTimes[gamestate.episode*10+mapon].timestr);
- #else
- Write(26,12,parTimes[gamestate.episode*10+mapon].timestr);
- #endif
-
- //
- // PRINT TIME
- //
- sec=gamestate.TimeCount/70;
-
- if (sec > 99*60) // 99 minutes max
- sec = 99*60;
-
- if (gamestate.TimeCount<parTimes[gamestate.episode*10+mapon].time*4200)
- timeleft=(parTimes[gamestate.episode*10+mapon].time*4200)/70-sec;
-
- min=sec/60;
- sec%=60;
-
- #ifdef SPANISH
- i=30*8;
- #else
- i=26*8;
- #endif
- VWB_DrawPic(i,10*8,L_NUM0PIC+(min/10));
- i+=2*8;
- VWB_DrawPic(i,10*8,L_NUM0PIC+(min%10));
- i+=2*8;
- Write(i/8,10,":");
- i+=1*8;
- VWB_DrawPic(i,10*8,L_NUM0PIC+(sec/10));
- i+=2*8;
- VWB_DrawPic(i,10*8,L_NUM0PIC+(sec%10));
-
- VW_UpdateScreen ();
- VW_FadeIn ();
-
-
- //
- // FIGURE RATIOS OUT BEFOREHAND
- //
- kr = sr = tr = 0;
- if (gamestate.killtotal)
- kr=(gamestate.killcount*100)/gamestate.killtotal;
- if (gamestate.secrettotal)
- sr=(gamestate.secretcount*100)/gamestate.secrettotal;
- if (gamestate.treasuretotal)
- tr=(gamestate.treasurecount*100)/gamestate.treasuretotal;
-
-
- //
- // PRINT TIME BONUS
- //
- bonus=timeleft*PAR_AMOUNT;
- if (bonus)
- {
- for (i=0;i<=timeleft;i++)
- {
- ltoa((long)i*PAR_AMOUNT,tempstr,10);
- x=36-strlen(tempstr)*2;
- Write(x,7,tempstr);
- if (!(i%(PAR_AMOUNT/10)))
- SD_PlaySound(ENDBONUS1SND);
- VW_UpdateScreen();
- while(SD_SoundPlaying())
- BJ_Breathe();
- if (IN_CheckAck())
- goto done;
- }
-
- VW_UpdateScreen();
- SD_PlaySound(ENDBONUS2SND);
- while(SD_SoundPlaying())
- BJ_Breathe();
- }
-
-
- #ifdef SPANISH
- #define RATIOXX 33
- #else
- #define RATIOXX 37
- #endif
- //
- // KILL RATIO
- //
- ratio=kr;
- for (i=0;i<=ratio;i++)
- {
- itoa(i,tempstr,10);
- x=RATIOXX-strlen(tempstr)*2;
- Write(x,14,tempstr);
- if (!(i%10))
- SD_PlaySound(ENDBONUS1SND);
- VW_UpdateScreen ();
- while(SD_SoundPlaying())
- BJ_Breathe();
-
- if (IN_CheckAck())
- goto done;
- }
- if (ratio==100)
- {
- VW_WaitVBL(VBLWAIT);
- SD_StopSound();
- bonus+=PERCENT100AMT;
- ltoa(bonus,tempstr,10);
- x=(RATIOXX-1)-strlen(tempstr)*2;
- Write(x,7,tempstr);
- VW_UpdateScreen();
- SD_PlaySound(PERCENT100SND);
- }
- else
- if (!ratio)
- {
- VW_WaitVBL(VBLWAIT);
- SD_StopSound();
- SD_PlaySound(NOBONUSSND);
- }
- else
- SD_PlaySound(ENDBONUS2SND);
-
- VW_UpdateScreen();
- while(SD_SoundPlaying())
- BJ_Breathe();
-
-
- //
- // SECRET RATIO
- //
- ratio=sr;
- for (i=0;i<=ratio;i++)
- {
- itoa(i,tempstr,10);
- x=RATIOXX-strlen(tempstr)*2;
- Write(x,16,tempstr);
- if (!(i%10))
- SD_PlaySound(ENDBONUS1SND);
- VW_UpdateScreen ();
- while(SD_SoundPlaying())
- BJ_Breathe();
- BJ_Breathe();
-
- if (IN_CheckAck())
- goto done;
- }
- if (ratio==100)
- {
- VW_WaitVBL(VBLWAIT);
- SD_StopSound();
- bonus+=PERCENT100AMT;
- ltoa(bonus,tempstr,10);
- x=(RATIOXX-1)-strlen(tempstr)*2;
- Write(x,7,tempstr);
- VW_UpdateScreen();
- SD_PlaySound(PERCENT100SND);
- }
- else
- if (!ratio)
- {
- VW_WaitVBL(VBLWAIT);
- SD_StopSound();
- SD_PlaySound(NOBONUSSND);
- }
- else
- SD_PlaySound(ENDBONUS2SND);
- VW_UpdateScreen();
- while(SD_SoundPlaying())
- BJ_Breathe();
-
-
- //
- // TREASURE RATIO
- //
- ratio=tr;
- for (i=0;i<=ratio;i++)
- {
- itoa(i,tempstr,10);
- x=RATIOXX-strlen(tempstr)*2;
- Write(x,18,tempstr);
- if (!(i%10))
- SD_PlaySound(ENDBONUS1SND);
- VW_UpdateScreen ();
- while(SD_SoundPlaying())
- BJ_Breathe();
- if (IN_CheckAck())
- goto done;
- }
- if (ratio==100)
- {
- VW_WaitVBL(VBLWAIT);
- SD_StopSound();
- bonus+=PERCENT100AMT;
- ltoa(bonus,tempstr,10);
- x=(RATIOXX-1)-strlen(tempstr)*2;
- Write(x,7,tempstr);
- VW_UpdateScreen();
- SD_PlaySound(PERCENT100SND);
- }
- else
- if (!ratio)
- {
- VW_WaitVBL(VBLWAIT);
- SD_StopSound();
- SD_PlaySound(NOBONUSSND);
- }
- else
- SD_PlaySound(ENDBONUS2SND);
- VW_UpdateScreen();
- while(SD_SoundPlaying())
- BJ_Breathe();
-
-
- //
- // JUMP STRAIGHT HERE IF KEY PRESSED
- //
- done:
-
- itoa(kr,tempstr,10);
- x=RATIOXX-strlen(tempstr)*2;
- Write(x,14,tempstr);
-
- itoa(sr,tempstr,10);
- x=RATIOXX-strlen(tempstr)*2;
- Write(x,16,tempstr);
-
- itoa(tr,tempstr,10);
- x=RATIOXX-strlen(tempstr)*2;
- Write(x,18,tempstr);
-
- bonus=(long)timeleft*PAR_AMOUNT+
- (PERCENT100AMT*(kr==100))+
- (PERCENT100AMT*(sr==100))+
- (PERCENT100AMT*(tr==100));
-
- GivePoints(bonus);
- ltoa(bonus,tempstr,10);
- x=36-strlen(tempstr)*2;
- Write(x,7,tempstr);
-
- //
- // SAVE RATIO INFORMATION FOR ENDGAME
- //
- LevelRatios[mapon].kill=kr;
- LevelRatios[mapon].secret=sr;
- LevelRatios[mapon].treasure=tr;
- LevelRatios[mapon].time=min*60+sec;
- }
- else
- {
-#ifdef SPEAR
-#ifndef SPEARDEMO
- switch(mapon)
- {
- case 4: Write(14,4," trans\n"
- " grosse\n"
- STR_DEFEATED); break;
- case 9: Write(14,4,"barnacle\n"
- "wilhelm\n"
- STR_DEFEATED); break;
- case 15: Write(14,4,"ubermutant\n"
- STR_DEFEATED); break;
- case 17: Write(14,4," death\n"
- " knight\n"
- STR_DEFEATED); break;
- case 18: Write(13,4,"secret tunnel\n"
- " area\n"
- " completed!"); break;
- case 19: Write(13,4,"secret castle\n"
- " area\n"
- " completed!"); break;
- }
-#endif
-#else
- Write(14,4,"secret floor\n completed!");
-#endif
-
- Write(10,16,"15000 bonus!");
-
- VW_UpdateScreen();
- VW_FadeIn();
-
- GivePoints(15000);
- }
-
-
- DrawScore();
- VW_UpdateScreen();
-
- TimeCount=0;
- IN_StartAck();
- while(!IN_CheckAck())
- BJ_Breathe();
-
-//
-// done
-//
-#ifdef SPEARDEMO
- if (gamestate.mapon == 1)
- {
- SD_PlaySound (BONUS1UPSND);
-
- CA_CacheGrChunk (STARTFONT+1);
- Message ("This concludes your demo\n"
- "of Spear of Destiny! Now,\n"
- "go to your local software\n"
- "store and buy it!");
- UNCACHEGRCHUNK (STARTFONT+1);
-
- IN_ClearKeysDown();
- IN_Ack();
- }
-#endif
-
-#ifdef JAPDEMO
- if (gamestate.mapon == 3)
- {
- SD_PlaySound (BONUS1UPSND);
-
- CA_CacheGrChunk (STARTFONT+1);
- Message ("This concludes your demo\n"
- "of Wolfenstein 3-D! Now,\n"
- "go to your local software\n"
- "store and buy it!");
- UNCACHEGRCHUNK (STARTFONT+1);
-
- IN_ClearKeysDown();
- IN_Ack();
- }
-#endif
-
- #ifndef SPEAR
- if (Keyboard[sc_P] && MS_CheckParm("goobers"))
- PicturePause();
- #endif
-
- VW_FadeOut ();
- temp = bufferofs;
- for (i=0;i<3;i++)
- {
- bufferofs = screenloc[i];
- DrawPlayBorder ();
- }
- bufferofs = temp;
-
- UnCacheLump(LEVELEND_LUMP_START,LEVELEND_LUMP_END);
-}
-
-
-
-//==========================================================================
-
-
-/*
-=================
-=
-= PreloadGraphics
-=
-= Fill the cache up
-=
-=================
-*/
-
-boolean PreloadUpdate(unsigned current, unsigned total)
-{
- unsigned w = WindowW - 10;
-
-
- VWB_Bar(WindowX + 5,WindowY + WindowH - 3,w,2,BLACK);
- w = ((long)w * current) / total;
- if (w)
- {
- VWB_Bar(WindowX + 5,WindowY + WindowH - 3,w,2,0x37); //SECONDCOLOR);
- VWB_Bar(WindowX + 5,WindowY + WindowH - 3,w-1,1,0x32);
-
- }
- VW_UpdateScreen();
-// if (LastScan == sc_Escape)
-// {
-// IN_ClearKeysDown();
-// return(true);
-// }
-// else
- return(false);
-}
-
-void PreloadGraphics(void)
-{
- DrawLevel ();
- ClearSplitVWB (); // set up for double buffering in split screen
-
- VWB_Bar (0,0,320,200-STATUSLINES,127);
-
- LatchDrawPic (20-14,80-3*8,GETPSYCHEDPIC);
-
- WindowX = 160-14*8;
- WindowY = 80-3*8;
- WindowW = 28*8;
- WindowH = 48;
- VW_UpdateScreen();
- VW_FadeIn ();
-
- PM_Preload (PreloadUpdate);
- IN_UserInput (70);
- VW_FadeOut ();
-
- DrawPlayBorder ();
- VW_UpdateScreen ();
-}
-
-
-//==========================================================================
-
-/*
-==================
-=
-= DrawHighScores
-=
-==================
-*/
-
-void DrawHighScores(void)
-{
- char buffer[16],*str,buffer1[5];
- byte temp,temp1,temp2,temp3;
- word i,j,
- w,h,
- x,y;
- HighScore *s;
-
-
- MM_SortMem ();
-
-#ifndef SPEAR
-// CA_CacheGrChunk (C_CODEPIC);
- CA_CacheGrChunk (HIGHSCORESPIC);
- CA_CacheGrChunk (STARTFONT);
- CA_CacheGrChunk (C_LEVELPIC);
- CA_CacheGrChunk (C_SCOREPIC);
- CA_CacheGrChunk (C_NAMEPIC);
-
- ClearMScreen();
- DrawStripes(10);
-
- VWB_DrawPic(48,0,HIGHSCORESPIC);
- UNCACHEGRCHUNK (HIGHSCORESPIC);
-
- VWB_DrawPic(4*8,68,C_NAMEPIC);
- VWB_DrawPic(20*8,68,C_LEVELPIC);
- VWB_DrawPic(28*8,68,C_SCOREPIC);
-#ifndef UPLOAD
-// VWB_DrawPic(35*8,68,C_CODEPIC);
-#endif
- fontnumber=0;
-
-#else
- CacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
- ClearMScreen();
- DrawStripes(10);
- UnCacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
-
- CacheLump (HIGHSCORES_LUMP_START,HIGHSCORES_LUMP_END);
- CA_CacheGrChunk (STARTFONT+1);
- VWB_DrawPic (0,0,HIGHSCORESPIC);
-
- fontnumber = 1;
-#endif
-
-
-#ifndef SPEAR
- SETFONTCOLOR(15,0x29);
-#else
- SETFONTCOLOR(HIGHLIGHT,0x29);
-#endif
-
- for (i = 0,s = Scores;i < MaxScores;i++,s++)
- {
- PrintY = 76 + (16 * i);
-
- //
- // name
- //
-#ifndef SPEAR
- PrintX = 4*8;
-#else
- PrintX = 16;
-#endif
- US_Print(s->name);
-
- //
- // level
- //
- ultoa(s->completed,buffer,10);
-#ifndef SPEAR
- for (str = buffer;*str;str++)
- *str = *str + (129 - '0'); // Used fixed-width numbers (129...)
- USL_MeasureString(buffer,&w,&h);
- PrintX = (22 * 8)-w;
-#else
- USL_MeasureString(buffer,&w,&h);
- PrintX = 194 - w;
-#endif
-
-#ifndef UPLOAD
-#ifndef SPEAR
- PrintX -= 6;
- itoa(s->episode+1,buffer1,10);
- US_Print("E");
- US_Print(buffer1);
- US_Print("/L");
-#endif
-#endif
-
-#ifdef SPEAR
- if (s->completed == 21)
- VWB_DrawPic (PrintX+8,PrintY-1,C_WONSPEARPIC);
- else
-#endif
- US_Print(buffer);
-
- //
- // score
- //
- ultoa(s->score,buffer,10);
-#ifndef SPEAR
- for (str = buffer;*str;str++)
- *str = *str + (129 - '0'); // Used fixed-width numbers (129...)
- USL_MeasureString(buffer,&w,&h);
- PrintX = (34 * 8) - 8 - w;
-#else
- USL_MeasureString(buffer,&w,&h);
- PrintX = 292 - w;
-#endif
- US_Print(buffer);
-
- #if 0
-#ifndef UPLOAD
-#ifndef SPEAR
- //
- // verification #
- //
- if (!i)
- {
- temp=(((s->score >> 28)& 0xf)^
- ((s->score >> 24)& 0xf))+'A';
- temp1=(((s->score >> 20)& 0xf)^
- ((s->score >> 16)& 0xf))+'A';
- temp2=(((s->score >> 12)& 0xf)^
- ((s->score >> 8)& 0xf))+'A';
- temp3=(((s->score >> 4)& 0xf)^
- ((s->score >> 0)& 0xf))+'A';
-
- SETFONTCOLOR(0x49,0x29);
- PrintX = 35*8;
- buffer[0]=temp;
- buffer[1]=temp1;
- buffer[2]=temp2;
- buffer[3]=temp3;
- buffer[4]=0;
- US_Print(buffer);
- SETFONTCOLOR(15,0x29);
- }
-#endif
-#endif
- #endif
- }
-
- VW_UpdateScreen ();
-
-#ifdef SPEAR
- UnCacheLump (HIGHSCORES_LUMP_START,HIGHSCORES_LUMP_END);
- fontnumber = 0;
-#endif
-}
-
-//===========================================================================
-
-
-/*
-=======================
-=
-= CheckHighScore
-=
-=======================
-*/
-
-void CheckHighScore (long score,word other)
-{
- word i,j;
- int n;
- HighScore myscore;
-
- strcpy(myscore.name,"");
- myscore.score = score;
- myscore.episode = gamestate.episode;
- myscore.completed = other;
-
- for (i = 0,n = -1;i < MaxScores;i++)
- {
- if
- (
- (myscore.score > Scores[i].score)
- || (
- (myscore.score == Scores[i].score)
- && (myscore.completed > Scores[i].completed)
- )
- )
- {
- for (j = MaxScores;--j > i;)
- Scores[j] = Scores[j - 1];
- Scores[i] = myscore;
- n = i;
- break;
- }
- }
-
-#ifdef SPEAR
- StartCPMusic (XAWARD_MUS);
-#else
- StartCPMusic (ROSTER_MUS);
-#endif
- DrawHighScores ();
-
- VW_FadeIn ();
-
- if (n != -1)
- {
- //
- // got a high score
- //
- PrintY = 76 + (16 * n);
-#ifndef SPEAR
- PrintX = 4*8;
- backcolor = BORDCOLOR;
- fontcolor = 15;
- US_LineInput(PrintX,PrintY,Scores[n].name,nil,true,MaxHighName,100);
-#else
- PrintX = 16;
- fontnumber = 1;
- VWB_Bar (PrintX-2,PrintY-2,145,15,0x9c);
- VW_UpdateScreen ();
- backcolor = 0x9c;
- fontcolor = 15;
- US_LineInput(PrintX,PrintY,Scores[n].name,nil,true,MaxHighName,130);
-#endif
- }
- else
- {
- IN_ClearKeysDown ();
- IN_UserInput(500);
- }
-
-}
-
-
-#ifndef UPLOAD
-#ifndef SPEAR
-#ifndef JAPAN
-////////////////////////////////////////////////////////
-//
-// NON-SHAREWARE NOTICE
-//
-////////////////////////////////////////////////////////
-void NonShareware(void)
-{
- VW_FadeOut();
-
- ClearMScreen();
- DrawStripes(10);
-
- CA_CacheGrChunk(STARTFONT+1);
- fontnumber = 1;
-
- SETFONTCOLOR(READHCOLOR,BKGDCOLOR);
- PrintX=110;
- PrintY=15;
-
- #ifdef SPANISH
- US_Print("Atencion");
- #else
- US_Print("Attention");
- #endif
-
- SETFONTCOLOR(HIGHLIGHT,BKGDCOLOR);
- WindowX=PrintX=40;
- PrintY=60;
- #ifdef SPANISH
- US_Print("Este juego NO es gratis y\n");
- US_Print("NO es Shareware; favor de\n");
- US_Print("no distribuirlo.\n\n");
- #else
- US_Print("This game is NOT shareware.\n");
- US_Print("Please do not distribute it.\n");
- US_Print("Thanks.\n\n");
- #endif
- US_Print(" Id Software\n");
-
- VW_UpdateScreen ();
- VW_FadeIn();
- IN_Ack();
-}
-#endif
-#endif
-#endif
-
-#ifdef SPEAR
-#ifndef SPEARDEMO
-////////////////////////////////////////////////////////
-//
-// COPY PROTECTION FOR FormGen
-//
-////////////////////////////////////////////////////////
-char far CopyProFailedStrs[][100] = {
- STR_COPY1,
- STR_COPY2,
-
- STR_COPY3,
- STR_COPY4,
-
- STR_COPY5,
- STR_COPY6,
-
- STR_COPY7,
- STR_COPY8,
-
- STR_COPY9,
- "",
-
- STR_COPY10,
- STR_COPY11,
-
- STR_COPY12,
- "",
-
- STR_COPY13,
- "",
-
- STR_COPY14,
- ""
- },
-
- far BackDoorStrs[5][16] = {
- "a spoon?",
- "bite me!",
- "joshua",
- "pelt",
-#ifdef BETA
- "beta"
-#else
- "snoops"
-#endif
- },
-
- far GoodBoyStrs[10][40] = {
- "...is the CORRECT ANSWER!",
- "",
-
- "Consider yourself bitten, sir.",
- "",
-
- "Greetings Professor Falken, would you",
- "like to play Spear of Destiny?",
-
- "Do you have any gold spray paint?",
- "",
-
-#ifdef BETA
- "Beta testing approved.",
-#else
- "I wish I had a 21\" monitor...",
-#endif
- ""
- },
-
- far bossstrs[4][24] = {
- "DEATH KNIGHT",
- "BARNACLE WILHELM",
- "UBERMUTANTUBER MUTANT",
- "TRANS GROSSE"
- },
-
- far WordStr[5][20] = {
- "New Game",
- "Sound...F4",
- "Control...F6",
- "Change View...F5",
- "Quit...F10"},
-
- far WordCorrect[5][2] = {"3","4","4","5","5"},
-
- far MemberStr[10][40] = {
- STR_COPY15,
- "",
-
- STR_COPY16,
- "",
-
- STR_COPY17,
- STR_COPY18,
-
- STR_COPY19,
- STR_COPY20,
-
- STR_COPY21,
- STR_COPY22},
-
- far MemberCorrect[5][24] = {
- "adrian carmack",
- "john carmackjohn romero",
- "tom hall",
- "jay wilbur",
- "kevin cloud"},
-
- far DosMessages[9][80] = {
- STR_NOPE1,
- STR_NOPE2,
- STR_NOPE3,
- STR_NOPE4,
- STR_NOPE5,
- STR_NOPE6,
- STR_NOPE7,
- STR_NOPE8,
- STR_NOPE9},
-
- far MiscTitle[4][20] = {
- "BLOOD TEST",
- "STRAIGHT-LACED",
- "QUITE SHAPELY",
- "I AM WHAT I AMMO"
- },
-
- far MiscStr[12][40] = {
- STR_MISC1,
- STR_MISC2,
- "",
-
- STR_MISC3,
- STR_MISC4,
- "",
-
- STR_MISC5,
- STR_MISC6,
- "",
-
- STR_MISC7,
- STR_MISC8,
- STR_MISC9
- },
-
- far MiscCorrect[4][5] = {"ss","8",STR_STAR,"45"};
-
-
-int BackDoor(char *s)
-{
- int i;
-
-
- strlwr(s);
-
- for (i=0;i<5;i++)
- if (!_fstrcmp(s,BackDoorStrs[i]))
- {
- SETFONTCOLOR(14,15);
- fontnumber = 0;
- PrintY = 175;
- VWB_DrawPic (0,20*8,COPYPROTBOXPIC);
- US_CPrint(GoodBoyStrs[i*2]);
- US_CPrint(GoodBoyStrs[i*2+1]);
- VW_UpdateScreen();
- return 1;
- }
-
- return 0;
-}
-
-
-void CopyProtection(void)
-{
-#define TYPEBOX_Y 177
-#define TYPEBOX_BKGD 0x9c
-#define PRINTCOLOR HIGHLIGHT
-
- int i,match,whichboss,bossnum,try,whichline,enemypicked[4]={0,0,0,0},
- bosses[4] = { BOSSPIC1PIC,BOSSPIC2PIC,BOSSPIC3PIC,BOSSPIC4PIC },
- whichone,whichpicked[4]={0,0,0,0},quiztype,whichmem,
- memberpicked[5]={0,0,0,0,0},wordpicked[5]={0,0,0,0,0},whichword;
-
- char inputbuffer[20],
- message[80];
-
- enum
- {
- debriefing,
- checkmanual,
- staffquiz,
- miscquiz,
-
- totaltypes
- };
-
-
-
- try = 0;
- VW_FadeOut();
- CA_CacheGrChunk(C_BACKDROPPIC);
- CacheLump(COPYPROT_LUMP_START,COPYPROT_LUMP_END);
- CA_CacheGrChunk(STARTFONT+1);
- CA_LoadAllSounds();
- StartCPMusic(COPYPRO_MUS);
- US_InitRndT(true);
-
- while (try<3)
- {
- fontnumber = 1;
- SETFONTCOLOR(PRINTCOLOR-2,15);
- VWB_DrawPic (0,0,C_BACKDROPPIC);
- VWB_DrawPic (0,0,COPYPROTTOPPIC);
- VWB_DrawPic (0,20*8,COPYPROTBOXPIC);
- WindowX = WindowY = 0;
- WindowW = 320;
- WindowH = 200;
- PrintY = 65;
-
- quiztype = US_RndT()%totaltypes;
- switch(quiztype)
- {
- //
- // BOSSES QUIZ
- //
- case debriefing:
- PrintX = 0;
- US_Print(STR_DEBRIEF);
- SETFONTCOLOR(PRINTCOLOR,15);
-
- while (enemypicked[whichboss = US_RndT()&3]);
- enemypicked[whichboss] = 1;
- bossnum = bosses[whichboss];
- VWB_DrawPic(128,60,bossnum);
- fontnumber = 0;
- PrintY = 130;
- US_CPrint(STR_ENEMY1"\n");
- US_CPrint(STR_ENEMY2"\n\n");
-
- VW_UpdateScreen();
- VW_FadeIn();
-
- PrintX = 100;
- fontcolor = 15;
- backcolor = TYPEBOX_BKGD;
- inputbuffer[0] = 0;
- PrintY = TYPEBOX_Y;
- fontnumber = 1;
- US_LineInput(PrintX,PrintY,inputbuffer,nil,true,20,100);
-
- match = 0;
- for (i=0;i<_fstrlen(bossstrs[whichboss]);i++)
- if (!_fstrnicmp(inputbuffer,bossstrs[whichboss]+i,strlen(inputbuffer)) &&
- strlen(inputbuffer)>3)
- match = 1;
-
- match += BackDoor(inputbuffer);
- break;
-
- //
- // MANUAL CHECK
- //
- case checkmanual:
- while (wordpicked[whichword = US_RndT()%5]);
- wordpicked[whichword] = 1;
- US_CPrint(STR_CHECKMAN);
- SETFONTCOLOR(PRINTCOLOR,15);
- PrintY += 25;
- US_CPrint(STR_MAN1);
- US_CPrint(STR_MAN2);
- _fstrcpy(message,STR_MAN3" \"");
- _fstrcat(message,WordStr[whichword]);
- _fstrcat(message,"\" "STR_MAN4);
- US_CPrint(message);
- VW_UpdateScreen();
- VW_FadeIn();
-
- PrintX = 146;
- fontcolor = 15;
- backcolor = TYPEBOX_BKGD;
- inputbuffer[0] = 0;
- PrintY = TYPEBOX_Y;
- US_LineInput(PrintX,PrintY,inputbuffer,nil,true,6,100);
-
- strlwr(inputbuffer);
- match = 1-(_fstrcmp(inputbuffer,WordCorrect[whichword])!=0);
- match += BackDoor(inputbuffer);
- break;
-
- //
- // STAFF QUIZ
- //
- case staffquiz:
- while (memberpicked[whichmem = US_RndT()%5]);
- memberpicked[whichmem] = 1;
- US_CPrint(STR_ID1);
- SETFONTCOLOR(PRINTCOLOR,15);
- PrintY += 25;
- US_CPrint(MemberStr[whichmem*2]);
- US_CPrint(MemberStr[whichmem*2+1]);
- VW_UpdateScreen();
- VW_FadeIn();
-
- PrintX = 100;
- fontcolor = 15;
- backcolor = TYPEBOX_BKGD;
- inputbuffer[0] = 0;
- PrintY = TYPEBOX_Y;
- US_LineInput(PrintX,PrintY,inputbuffer,nil,true,20,120);
-
- strlwr(inputbuffer);
- match = 0;
- for (i=0;i<_fstrlen(MemberCorrect[whichmem]);i++)
- if (!_fstrnicmp(inputbuffer,MemberCorrect[whichmem]+i,strlen(inputbuffer)) &&
- strlen(inputbuffer)>2)
- match = 1;
- match += BackDoor(inputbuffer);
- break;
-
- //
- // MISCELLANEOUS QUESTIONS
- //
- case miscquiz:
- while (whichpicked[whichone = US_RndT()&3]);
- whichpicked[whichone] = 1;
- US_CPrint(MiscTitle[whichone]);
- SETFONTCOLOR(PRINTCOLOR,15);
- PrintY += 25;
- US_CPrint(MiscStr[whichone*3]);
- US_CPrint(MiscStr[whichone*3+1]);
- US_CPrint(MiscStr[whichone*3+2]);
- VW_UpdateScreen();
- VW_FadeIn();
-
- PrintX = 146;
- fontcolor = 15;
- backcolor = TYPEBOX_BKGD;
- inputbuffer[0] = 0;
- PrintY = TYPEBOX_Y;
- US_LineInput(PrintX,PrintY,inputbuffer,nil,true,6,100);
-
- strlwr(inputbuffer);
- match = 1-(_fstrcmp(inputbuffer,MiscCorrect[whichone])!=0);
- match += BackDoor(inputbuffer);
- break;
- }
-
- //
- // IF NO MATCH, WE'VE GOT A (MINOR) PROBLEM!
- //
-
- if (!match)
- {
- whichline = 2*(US_RndT()%9);
- SETFONTCOLOR(14,15);
- fontnumber = 0;
- PrintY = 175;
- VWB_DrawPic (0,20*8,COPYPROTBOXPIC);
- US_CPrint(CopyProFailedStrs[whichline]);
- US_CPrint(CopyProFailedStrs[whichline+1]);
-
- VW_UpdateScreen();
- SD_PlaySound(NOWAYSND);
- IN_UserInput(TickBase*3);
- VW_FadeOut();
- try++;
- }
- else
- {
- int start;
-
-
- SD_PlaySound(BONUS1UPSND);
- SD_WaitSoundDone();
- UNCACHEGRCHUNK (STARTFONT+1);
- UNCACHEGRCHUNK (C_BACKDROPPIC);
- UnCacheLump (COPYPROT_LUMP_START,COPYPROT_LUMP_END);
-
- switch(SoundMode)
- {
- case sdm_Off: return;
- case sdm_PC: start = STARTPCSOUNDS; break;
- case sdm_AdLib: start = STARTADLIBSOUNDS;
- }
-
- for (i=0;i<NUMSOUNDS;i++,start++)
- MM_FreePtr ((memptr *)&audiosegs[start]);
- return;
- }
- }
-
- ClearMemory();
- ShutdownId();
-
- _fstrcpy(message,DosMessages[US_RndT()%9]);
-
- _AX = 3;
- geninterrupt(0x10);
-
- printf("%s\n",message);
- exit(1);
-}
-
-#endif // SPEARDEMO
-#endif // SPEAR
-//===========================================================================
--- a/WOLFSRC/WL_MAIN.C
+++ /dev/null
@@ -1,1616 +1,0 @@
-// WL_MAIN.C
-
-#include <conio.h>
-#include "WL_DEF.H"
-#pragma hdrstop
-
-
-/*
-=============================================================================
-
- WOLFENSTEIN 3-D
-
- An Id Software production
-
- by John Carmack
-
-=============================================================================
-*/
-
-/*
-=============================================================================
-
- LOCAL CONSTANTS
-
-=============================================================================
-*/
-
-
-#define FOCALLENGTH (0x5700l) // in global coordinates
-#define VIEWGLOBAL 0x10000 // globals visable flush to wall
-
-#define VIEWWIDTH 256 // size of view window
-#define VIEWHEIGHT 144
-
-/*
-=============================================================================
-
- GLOBAL VARIABLES
-
-=============================================================================
-*/
-
-char str[80],str2[20];
-int tedlevelnum;
-boolean tedlevel;
-boolean nospr;
-boolean IsA386;
-int dirangle[9] = {0,ANGLES/8,2*ANGLES/8,3*ANGLES/8,4*ANGLES/8,
- 5*ANGLES/8,6*ANGLES/8,7*ANGLES/8,ANGLES};
-
-//
-// proejection variables
-//
-fixed focallength;
-unsigned screenofs;
-int viewwidth;
-int viewheight;
-int centerx;
-int shootdelta; // pixels away from centerx a target can be
-fixed scale,maxslope;
-long heightnumerator;
-int minheightdiv;
-
-
-void Quit (char *error);
-
-boolean startgame,loadedgame,virtualreality;
-int mouseadjustment;
-
-char configname[13]="CONFIG.";
-
-
-/*
-=============================================================================
-
- LOCAL VARIABLES
-
-=============================================================================
-*/
-
-
-/*
-====================
-=
-= ReadConfig
-=
-====================
-*/
-
-void ReadConfig(void)
-{
- int file;
- SDMode sd;
- SMMode sm;
- SDSMode sds;
-
-
- if ( (file = open(configname,O_BINARY | O_RDONLY)) != -1)
- {
- //
- // valid config file
- //
- read(file,Scores,sizeof(HighScore) * MaxScores);
-
- read(file,&sd,sizeof(sd));
- read(file,&sm,sizeof(sm));
- read(file,&sds,sizeof(sds));
-
- read(file,&mouseenabled,sizeof(mouseenabled));
- read(file,&joystickenabled,sizeof(joystickenabled));
- read(file,&joypadenabled,sizeof(joypadenabled));
- read(file,&joystickprogressive,sizeof(joystickprogressive));
- read(file,&joystickport,sizeof(joystickport));
-
- read(file,&dirscan,sizeof(dirscan));
- read(file,&buttonscan,sizeof(buttonscan));
- read(file,&buttonmouse,sizeof(buttonmouse));
- read(file,&buttonjoy,sizeof(buttonjoy));
-
- read(file,&viewsize,sizeof(viewsize));
- read(file,&mouseadjustment,sizeof(mouseadjustment));
-
- close(file);
-
- if (sd == sdm_AdLib && !AdLibPresent && !SoundBlasterPresent)
- {
- sd = sdm_PC;
- sd = smm_Off;
- }
-
- if ((sds == sds_SoundBlaster && !SoundBlasterPresent) ||
- (sds == sds_SoundSource && !SoundSourcePresent))
- sds = sds_Off;
-
- if (!MousePresent)
- mouseenabled = false;
- if (!JoysPresent[joystickport])
- joystickenabled = false;
-
- MainMenu[6].active=1;
- MainItems.curpos=0;
- }
- else
- {
- //
- // no config file, so select by hardware
- //
- if (SoundBlasterPresent || AdLibPresent)
- {
- sd = sdm_AdLib;
- sm = smm_AdLib;
- }
- else
- {
- sd = sdm_PC;
- sm = smm_Off;
- }
-
- if (SoundBlasterPresent)
- sds = sds_SoundBlaster;
- else if (SoundSourcePresent)
- sds = sds_SoundSource;
- else
- sds = sds_Off;
-
- if (MousePresent)
- mouseenabled = true;
-
- joystickenabled = false;
- joypadenabled = false;
- joystickport = 0;
- joystickprogressive = false;
-
- viewsize = 15;
- mouseadjustment=5;
- }
-
- SD_SetMusicMode (sm);
- SD_SetSoundMode (sd);
- SD_SetDigiDevice (sds);
-
-}
-
-
-/*
-====================
-=
-= WriteConfig
-=
-====================
-*/
-
-void WriteConfig(void)
-{
- int file;
-
- file = open(configname,O_CREAT | O_BINARY | O_WRONLY,
- S_IREAD | S_IWRITE | S_IFREG);
-
- if (file != -1)
- {
- write(file,Scores,sizeof(HighScore) * MaxScores);
-
- write(file,&SoundMode,sizeof(SoundMode));
- write(file,&MusicMode,sizeof(MusicMode));
- write(file,&DigiMode,sizeof(DigiMode));
-
- write(file,&mouseenabled,sizeof(mouseenabled));
- write(file,&joystickenabled,sizeof(joystickenabled));
- write(file,&joypadenabled,sizeof(joypadenabled));
- write(file,&joystickprogressive,sizeof(joystickprogressive));
- write(file,&joystickport,sizeof(joystickport));
-
- write(file,&dirscan,sizeof(dirscan));
- write(file,&buttonscan,sizeof(buttonscan));
- write(file,&buttonmouse,sizeof(buttonmouse));
- write(file,&buttonjoy,sizeof(buttonjoy));
-
- write(file,&viewsize,sizeof(viewsize));
- write(file,&mouseadjustment,sizeof(mouseadjustment));
-
- close(file);
- }
-}
-
-
-//===========================================================================
-
-
-/*
-========================
-=
-= Patch386
-=
-= Patch ldiv to use 32 bit instructions
-=
-========================
-*/
-
-char *JHParmStrings[] = {"no386",nil};
-void Patch386 (void)
-{
-extern void far jabhack2(void);
-extern int far CheckIs386(void);
-
- int i;
-
- for (i = 1;i < _argc;i++)
- if (US_CheckParm(_argv[i],JHParmStrings) == 0)
- {
- IsA386 = false;
- return;
- }
-
- if (CheckIs386())
- {
- IsA386 = true;
- jabhack2();
- }
- else
- IsA386 = false;
-}
-
-//===========================================================================
-
-/*
-=====================
-=
-= NewGame
-=
-= Set up new game to start from the beginning
-=
-=====================
-*/
-
-void NewGame (int difficulty,int episode)
-{
- memset (&gamestate,0,sizeof(gamestate));
- gamestate.difficulty = difficulty;
- gamestate.weapon = gamestate.bestweapon
- = gamestate.chosenweapon = wp_pistol;
- gamestate.health = 100;
- gamestate.ammo = STARTAMMO;
- gamestate.lives = 3;
- gamestate.nextextra = EXTRAPOINTS;
- gamestate.episode=episode;
-
- startgame = true;
-}
-
-//===========================================================================
-
-void DiskFlopAnim(int x,int y)
-{
- static char which=0;
- if (!x && !y)
- return;
- VWB_DrawPic(x,y,C_DISKLOADING1PIC+which);
- VW_UpdateScreen();
- which^=1;
-}
-
-
-long DoChecksum(byte far *source,unsigned size,long checksum)
-{
- unsigned i;
-
- for (i=0;i<size-1;i++)
- checksum += source[i]^source[i+1];
-
- return checksum;
-}
-
-
-/*
-==================
-=
-= SaveTheGame
-=
-==================
-*/
-
-boolean SaveTheGame(int file,int x,int y)
-{
- struct diskfree_t dfree;
- long avail,size,checksum;
- objtype *ob,nullobj;
-
-
- if (_dos_getdiskfree(0,&dfree))
- Quit("Error in _dos_getdiskfree call");
-
- avail = (long)dfree.avail_clusters *
- dfree.bytes_per_sector *
- dfree.sectors_per_cluster;
-
- size = 0;
- for (ob = player; ob ; ob=ob->next)
- size += sizeof(*ob);
- size += sizeof(nullobj);
-
- size += sizeof(gamestate) +
- sizeof(LRstruct)*8 +
- sizeof(tilemap) +
- sizeof(actorat) +
- sizeof(laststatobj) +
- sizeof(statobjlist) +
- sizeof(doorposition) +
- sizeof(pwallstate) +
- sizeof(pwallx) +
- sizeof(pwally) +
- sizeof(pwalldir) +
- sizeof(pwallpos);
-
- if (avail < size)
- {
- Message(STR_NOSPACE1"\n"
- STR_NOSPACE2);
- return false;
- }
-
- checksum = 0;
-
-
- DiskFlopAnim(x,y);
- CA_FarWrite (file,(void far *)&gamestate,sizeof(gamestate));
- checksum = DoChecksum((byte far *)&gamestate,sizeof(gamestate),checksum);
-
- DiskFlopAnim(x,y);
-#ifdef SPEAR
- CA_FarWrite (file,(void far *)&LevelRatios[0],sizeof(LRstruct)*20);
- checksum = DoChecksum((byte far *)&LevelRatios[0],sizeof(LRstruct)*20,checksum);
-#else
- CA_FarWrite (file,(void far *)&LevelRatios[0],sizeof(LRstruct)*8);
- checksum = DoChecksum((byte far *)&LevelRatios[0],sizeof(LRstruct)*8,checksum);
-#endif
-
- DiskFlopAnim(x,y);
- CA_FarWrite (file,(void far *)tilemap,sizeof(tilemap));
- checksum = DoChecksum((byte far *)tilemap,sizeof(tilemap),checksum);
- DiskFlopAnim(x,y);
- CA_FarWrite (file,(void far *)actorat,sizeof(actorat));
- checksum = DoChecksum((byte far *)actorat,sizeof(actorat),checksum);
-
- CA_FarWrite (file,(void far *)areaconnect,sizeof(areaconnect));
- CA_FarWrite (file,(void far *)areabyplayer,sizeof(areabyplayer));
-
- for (ob = player ; ob ; ob=ob->next)
- {
- DiskFlopAnim(x,y);
- CA_FarWrite (file,(void far *)ob,sizeof(*ob));
- }
- nullobj.active = ac_badobject; // end of file marker
- DiskFlopAnim(x,y);
- CA_FarWrite (file,(void far *)&nullobj,sizeof(nullobj));
-
-
-
- DiskFlopAnim(x,y);
- CA_FarWrite (file,(void far *)&laststatobj,sizeof(laststatobj));
- checksum = DoChecksum((byte far *)&laststatobj,sizeof(laststatobj),checksum);
- DiskFlopAnim(x,y);
- CA_FarWrite (file,(void far *)statobjlist,sizeof(statobjlist));
- checksum = DoChecksum((byte far *)statobjlist,sizeof(statobjlist),checksum);
-
- DiskFlopAnim(x,y);
- CA_FarWrite (file,(void far *)doorposition,sizeof(doorposition));
- checksum = DoChecksum((byte far *)doorposition,sizeof(doorposition),checksum);
- DiskFlopAnim(x,y);
- CA_FarWrite (file,(void far *)doorobjlist,sizeof(doorobjlist));
- checksum = DoChecksum((byte far *)doorobjlist,sizeof(doorobjlist),checksum);
-
- DiskFlopAnim(x,y);
- CA_FarWrite (file,(void far *)&pwallstate,sizeof(pwallstate));
- checksum = DoChecksum((byte far *)&pwallstate,sizeof(pwallstate),checksum);
- CA_FarWrite (file,(void far *)&pwallx,sizeof(pwallx));
- checksum = DoChecksum((byte far *)&pwallx,sizeof(pwallx),checksum);
- CA_FarWrite (file,(void far *)&pwally,sizeof(pwally));
- checksum = DoChecksum((byte far *)&pwally,sizeof(pwally),checksum);
- CA_FarWrite (file,(void far *)&pwalldir,sizeof(pwalldir));
- checksum = DoChecksum((byte far *)&pwalldir,sizeof(pwalldir),checksum);
- CA_FarWrite (file,(void far *)&pwallpos,sizeof(pwallpos));
- checksum = DoChecksum((byte far *)&pwallpos,sizeof(pwallpos),checksum);
-
- //
- // WRITE OUT CHECKSUM
- //
- CA_FarWrite (file,(void far *)&checksum,sizeof(checksum));
-
- return(true);
-}
-
-//===========================================================================
-
-/*
-==================
-=
-= LoadTheGame
-=
-==================
-*/
-
-boolean LoadTheGame(int file,int x,int y)
-{
- long checksum,oldchecksum;
- objtype *ob,nullobj;
-
-
- checksum = 0;
-
- DiskFlopAnim(x,y);
- CA_FarRead (file,(void far *)&gamestate,sizeof(gamestate));
- checksum = DoChecksum((byte far *)&gamestate,sizeof(gamestate),checksum);
-
- DiskFlopAnim(x,y);
-#ifdef SPEAR
- CA_FarRead (file,(void far *)&LevelRatios[0],sizeof(LRstruct)*20);
- checksum = DoChecksum((byte far *)&LevelRatios[0],sizeof(LRstruct)*20,checksum);
-#else
- CA_FarRead (file,(void far *)&LevelRatios[0],sizeof(LRstruct)*8);
- checksum = DoChecksum((byte far *)&LevelRatios[0],sizeof(LRstruct)*8,checksum);
-#endif
-
- DiskFlopAnim(x,y);
- SetupGameLevel ();
-
- DiskFlopAnim(x,y);
- CA_FarRead (file,(void far *)tilemap,sizeof(tilemap));
- checksum = DoChecksum((byte far *)tilemap,sizeof(tilemap),checksum);
- DiskFlopAnim(x,y);
- CA_FarRead (file,(void far *)actorat,sizeof(actorat));
- checksum = DoChecksum((byte far *)actorat,sizeof(actorat),checksum);
-
- CA_FarRead (file,(void far *)areaconnect,sizeof(areaconnect));
- CA_FarRead (file,(void far *)areabyplayer,sizeof(areabyplayer));
-
-
-
- InitActorList ();
- DiskFlopAnim(x,y);
- CA_FarRead (file,(void far *)player,sizeof(*player));
-
- while (1)
- {
- DiskFlopAnim(x,y);
- CA_FarRead (file,(void far *)&nullobj,sizeof(nullobj));
- if (nullobj.active == ac_badobject)
- break;
- GetNewActor ();
- // don't copy over the links
- memcpy (new,&nullobj,sizeof(nullobj)-4);
- }
-
-
-
- DiskFlopAnim(x,y);
- CA_FarRead (file,(void far *)&laststatobj,sizeof(laststatobj));
- checksum = DoChecksum((byte far *)&laststatobj,sizeof(laststatobj),checksum);
- DiskFlopAnim(x,y);
- CA_FarRead (file,(void far *)statobjlist,sizeof(statobjlist));
- checksum = DoChecksum((byte far *)statobjlist,sizeof(statobjlist),checksum);
-
- DiskFlopAnim(x,y);
- CA_FarRead (file,(void far *)doorposition,sizeof(doorposition));
- checksum = DoChecksum((byte far *)doorposition,sizeof(doorposition),checksum);
- DiskFlopAnim(x,y);
- CA_FarRead (file,(void far *)doorobjlist,sizeof(doorobjlist));
- checksum = DoChecksum((byte far *)doorobjlist,sizeof(doorobjlist),checksum);
-
- DiskFlopAnim(x,y);
- CA_FarRead (file,(void far *)&pwallstate,sizeof(pwallstate));
- checksum = DoChecksum((byte far *)&pwallstate,sizeof(pwallstate),checksum);
- CA_FarRead (file,(void far *)&pwallx,sizeof(pwallx));
- checksum = DoChecksum((byte far *)&pwallx,sizeof(pwallx),checksum);
- CA_FarRead (file,(void far *)&pwally,sizeof(pwally));
- checksum = DoChecksum((byte far *)&pwally,sizeof(pwally),checksum);
- CA_FarRead (file,(void far *)&pwalldir,sizeof(pwalldir));
- checksum = DoChecksum((byte far *)&pwalldir,sizeof(pwalldir),checksum);
- CA_FarRead (file,(void far *)&pwallpos,sizeof(pwallpos));
- checksum = DoChecksum((byte far *)&pwallpos,sizeof(pwallpos),checksum);
-
- CA_FarRead (file,(void far *)&oldchecksum,sizeof(oldchecksum));
-
- if (oldchecksum != checksum)
- {
- Message(STR_SAVECHT1"\n"
- STR_SAVECHT2"\n"
- STR_SAVECHT3"\n"
- STR_SAVECHT4);
-
- IN_ClearKeysDown();
- IN_Ack();
-
- gamestate.score = 0;
- gamestate.lives = 1;
- gamestate.weapon =
- gamestate.chosenweapon =
- gamestate.bestweapon = wp_pistol;
- gamestate.ammo = 8;
- }
-
- return true;
-}
-
-//===========================================================================
-
-/*
-==========================
-=
-= ShutdownId
-=
-= Shuts down all ID_?? managers
-=
-==========================
-*/
-
-void ShutdownId (void)
-{
- US_Shutdown ();
- SD_Shutdown ();
- PM_Shutdown ();
- IN_Shutdown ();
- VW_Shutdown ();
- CA_Shutdown ();
- MM_Shutdown ();
-}
-
-
-//===========================================================================
-
-/*
-==================
-=
-= BuildTables
-=
-= Calculates:
-=
-= scale projection constant
-= sintable/costable overlapping fractional tables
-=
-==================
-*/
-
-const float radtoint = (float)FINEANGLES/2/PI;
-
-void BuildTables (void)
-{
- int i;
- float angle,anglestep;
- double tang;
- fixed value;
-
-
-//
-// calculate fine tangents
-//
-
- for (i=0;i<FINEANGLES/8;i++)
- {
- tang = tan( (i+0.5)/radtoint);
- finetangent[i] = tang*TILEGLOBAL;
- finetangent[FINEANGLES/4-1-i] = 1/tang*TILEGLOBAL;
- }
-
-//
-// costable overlays sintable with a quarter phase shift
-// ANGLES is assumed to be divisable by four
-//
-// The low word of the value is the fraction, the high bit is the sign bit,
-// bits 16-30 should be 0
-//
-
- angle = 0;
- anglestep = PI/2/ANGLEQUAD;
- for (i=0;i<=ANGLEQUAD;i++)
- {
- value=GLOBAL1*sin(angle);
- sintable[i]=
- sintable[i+ANGLES]=
- sintable[ANGLES/2-i] = value;
- sintable[ANGLES-i]=
- sintable[ANGLES/2+i] = value | 0x80000000l;
- angle += anglestep;
- }
-
-}
-
-//===========================================================================
-
-
-/*
-====================
-=
-= CalcProjection
-=
-= Uses focallength
-=
-====================
-*/
-
-void CalcProjection (long focal)
-{
- int i;
- long intang;
- float angle;
- double tang;
- double planedist;
- double globinhalf;
- int halfview;
- double halfangle,facedist;
-
-
- focallength = focal;
- facedist = focal+MINDIST;
- halfview = viewwidth/2; // half view in pixels
-
-//
-// calculate scale value for vertical height calculations
-// and sprite x calculations
-//
- scale = halfview*facedist/(VIEWGLOBAL/2);
-
-//
-// divide heightnumerator by a posts distance to get the posts height for
-// the heightbuffer. The pixel height is height>>2
-//
- heightnumerator = (TILEGLOBAL*scale)>>6;
- minheightdiv = heightnumerator/0x7fff +1;
-
-//
-// calculate the angle offset from view angle of each pixel's ray
-//
-
- for (i=0;i<halfview;i++)
- {
- // start 1/2 pixel over, so viewangle bisects two middle pixels
- tang = (long)i*VIEWGLOBAL/viewwidth/facedist;
- angle = atan(tang);
- intang = angle*radtoint;
- pixelangle[halfview-1-i] = intang;
- pixelangle[halfview+i] = -intang;
- }
-
-//
-// if a point's abs(y/x) is greater than maxslope, the point is outside
-// the view area
-//
- maxslope = finetangent[pixelangle[0]];
- maxslope >>= 8;
-}
-
-
-
-//===========================================================================
-
-/*
-===================
-=
-= SetupWalls
-=
-= Map tile values to scaled pics
-=
-===================
-*/
-
-void SetupWalls (void)
-{
- int i;
-
- for (i=1;i<MAXWALLTILES;i++)
- {
- horizwall[i]=(i-1)*2;
- vertwall[i]=(i-1)*2+1;
- }
-}
-
-//===========================================================================
-
-/*
-==========================
-=
-= SignonScreen
-=
-==========================
-*/
-
-void SignonScreen (void) // VGA version
-{
- unsigned segstart,seglength;
-
- VL_SetVGAPlaneMode ();
- VL_TestPaletteSet ();
- VL_SetPalette (&gamepal);
-
- if (!virtualreality)
- {
- VW_SetScreen(0x8000,0);
- VL_MungePic (&introscn,320,200);
- VL_MemToScreen (&introscn,320,200,0,0);
- VW_SetScreen(0,0);
- }
-
-//
-// reclaim the memory from the linked in signon screen
-//
- segstart = FP_SEG(&introscn);
- seglength = 64000/16;
- if (FP_OFF(&introscn))
- {
- segstart++;
- seglength--;
- }
- MML_UseSpace (segstart,seglength);
-}
-
-
-/*
-==========================
-=
-= FinishSignon
-=
-==========================
-*/
-
-void FinishSignon (void)
-{
-
-#ifndef SPEAR
- VW_Bar (0,189,300,11,peekb(0xa000,0));
- WindowX = 0;
- WindowW = 320;
- PrintY = 190;
-
- #ifndef JAPAN
- SETFONTCOLOR(14,4);
-
- #ifdef SPANISH
- US_CPrint ("Oprima una tecla");
- #else
- US_CPrint ("Press a key");
- #endif
-
- #endif
-
- if (!NoWait)
- IN_Ack ();
-
- #ifndef JAPAN
- VW_Bar (0,189,300,11,peekb(0xa000,0));
-
- PrintY = 190;
- SETFONTCOLOR(10,4);
-
- #ifdef SPANISH
- US_CPrint ("pensando...");
- #else
- US_CPrint ("Working...");
- #endif
-
- #endif
-
- SETFONTCOLOR(0,15);
-#else
- if (!NoWait)
- VW_WaitVBL(3*70);
-#endif
-}
-
-//===========================================================================
-
-/*
-=================
-=
-= MS_CheckParm
-=
-=================
-*/
-
-boolean MS_CheckParm (char far *check)
-{
- int i;
- char *parm;
-
- for (i = 1;i<_argc;i++)
- {
- parm = _argv[i];
-
- while ( !isalpha(*parm) ) // skip - / \ etc.. in front of parm
- if (!*parm++)
- break; // hit end of string without an alphanum
-
- if ( !_fstricmp(check,parm) )
- return true;
- }
-
- return false;
-}
-
-//===========================================================================
-
-/*
-=====================
-=
-= InitDigiMap
-=
-=====================
-*/
-
-static int wolfdigimap[] =
- {
- // These first sounds are in the upload version
-#ifndef SPEAR
- HALTSND, 0,
- DOGBARKSND, 1,
- CLOSEDOORSND, 2,
- OPENDOORSND, 3,
- ATKMACHINEGUNSND, 4,
- ATKPISTOLSND, 5,
- ATKGATLINGSND, 6,
- SCHUTZADSND, 7,
- GUTENTAGSND, 8,
- MUTTISND, 9,
- BOSSFIRESND, 10,
- SSFIRESND, 11,
- DEATHSCREAM1SND, 12,
- DEATHSCREAM2SND, 13,
- DEATHSCREAM3SND, 13,
- TAKEDAMAGESND, 14,
- PUSHWALLSND, 15,
-
- LEBENSND, 20,
- NAZIFIRESND, 21,
- SLURPIESND, 22,
-
- YEAHSND, 32,
-
-#ifndef UPLOAD
- // These are in all other episodes
- DOGDEATHSND, 16,
- AHHHGSND, 17,
- DIESND, 18,
- EVASND, 19,
-
- TOT_HUNDSND, 23,
- MEINGOTTSND, 24,
- SCHABBSHASND, 25,
- HITLERHASND, 26,
- SPIONSND, 27,
- NEINSOVASSND, 28,
- DOGATTACKSND, 29,
- LEVELDONESND, 30,
- MECHSTEPSND, 31,
-
- SCHEISTSND, 33,
- DEATHSCREAM4SND, 34, // AIIEEE
- DEATHSCREAM5SND, 35, // DEE-DEE
- DONNERSND, 36, // EPISODE 4 BOSS DIE
- EINESND, 37, // EPISODE 4 BOSS SIGHTING
- ERLAUBENSND, 38, // EPISODE 6 BOSS SIGHTING
- DEATHSCREAM6SND, 39, // FART
- DEATHSCREAM7SND, 40, // GASP
- DEATHSCREAM8SND, 41, // GUH-BOY!
- DEATHSCREAM9SND, 42, // AH GEEZ!
- KEINSND, 43, // EPISODE 5 BOSS SIGHTING
- MEINSND, 44, // EPISODE 6 BOSS DIE
- ROSESND, 45, // EPISODE 5 BOSS DIE
-
-#endif
-#else
-//
-// SPEAR OF DESTINY DIGISOUNDS
-//
- HALTSND, 0,
- CLOSEDOORSND, 2,
- OPENDOORSND, 3,
- ATKMACHINEGUNSND, 4,
- ATKPISTOLSND, 5,
- ATKGATLINGSND, 6,
- SCHUTZADSND, 7,
- BOSSFIRESND, 8,
- SSFIRESND, 9,
- DEATHSCREAM1SND, 10,
- DEATHSCREAM2SND, 11,
- TAKEDAMAGESND, 12,
- PUSHWALLSND, 13,
- AHHHGSND, 15,
- LEBENSND, 16,
- NAZIFIRESND, 17,
- SLURPIESND, 18,
- LEVELDONESND, 22,
- DEATHSCREAM4SND, 23, // AIIEEE
- DEATHSCREAM3SND, 23, // DOUBLY-MAPPED!!!
- DEATHSCREAM5SND, 24, // DEE-DEE
- DEATHSCREAM6SND, 25, // FART
- DEATHSCREAM7SND, 26, // GASP
- DEATHSCREAM8SND, 27, // GUH-BOY!
- DEATHSCREAM9SND, 28, // AH GEEZ!
- GETGATLINGSND, 38, // Got Gat replacement
-
-#ifndef SPEARDEMO
- DOGBARKSND, 1,
- DOGDEATHSND, 14,
- SPIONSND, 19,
- NEINSOVASSND, 20,
- DOGATTACKSND, 21,
- TRANSSIGHTSND, 29, // Trans Sight
- TRANSDEATHSND, 30, // Trans Death
- WILHELMSIGHTSND, 31, // Wilhelm Sight
- WILHELMDEATHSND, 32, // Wilhelm Death
- UBERDEATHSND, 33, // Uber Death
- KNIGHTSIGHTSND, 34, // Death Knight Sight
- KNIGHTDEATHSND, 35, // Death Knight Death
- ANGELSIGHTSND, 36, // Angel Sight
- ANGELDEATHSND, 37, // Angel Death
- GETSPEARSND, 39, // Got Spear replacement
-#endif
-#endif
- LASTSOUND
- };
-
-
-void InitDigiMap (void)
-{
- int *map;
-
- for (map = wolfdigimap;*map != LASTSOUND;map += 2)
- DigiMap[map[0]] = map[1];
-
-
-}
-
-
-#ifndef SPEAR
-CP_iteminfo MusicItems={CTL_X,CTL_Y,6,0,32};
-CP_itemtype far MusicMenu[]=
- {
- {1,"Get Them!",0},
- {1,"Searching",0},
- {1,"P.O.W.",0},
- {1,"Suspense",0},
- {1,"War March",0},
- {1,"Around The Corner!",0},
-
- {1,"Nazi Anthem",0},
- {1,"Lurking...",0},
- {1,"Going After Hitler",0},
- {1,"Pounding Headache",0},
- {1,"Into the Dungeons",0},
- {1,"Ultimate Conquest",0},
-
- {1,"Kill the S.O.B.",0},
- {1,"The Nazi Rap",0},
- {1,"Twelfth Hour",0},
- {1,"Zero Hour",0},
- {1,"Ultimate Conquest",0},
- {1,"Wolfpack",0}
- };
-#else
-CP_iteminfo MusicItems={CTL_X,CTL_Y-20,9,0,32};
-CP_itemtype far MusicMenu[]=
- {
- {1,"Funky Colonel Bill",0},
- {1,"Death To The Nazis",0},
- {1,"Tiptoeing Around",0},
- {1,"Is This THE END?",0},
- {1,"Evil Incarnate",0},
- {1,"Jazzin' Them Nazis",0},
- {1,"Puttin' It To The Enemy",0},
- {1,"The SS Gonna Get You",0},
- {1,"Towering Above",0}
- };
-#endif
-
-#ifndef SPEARDEMO
-void DoJukebox(void)
-{
- int which,lastsong=-1;
- unsigned start,songs[]=
- {
-#ifndef SPEAR
- GETTHEM_MUS,
- SEARCHN_MUS,
- POW_MUS,
- SUSPENSE_MUS,
- WARMARCH_MUS,
- CORNER_MUS,
-
- NAZI_OMI_MUS,
- PREGNANT_MUS,
- GOINGAFT_MUS,
- HEADACHE_MUS,
- DUNGEON_MUS,
- ULTIMATE_MUS,
-
- INTROCW3_MUS,
- NAZI_RAP_MUS,
- TWELFTH_MUS,
- ZEROHOUR_MUS,
- ULTIMATE_MUS,
- PACMAN_MUS
-#else
- XFUNKIE_MUS, // 0
- XDEATH_MUS, // 2
- XTIPTOE_MUS, // 4
- XTHEEND_MUS, // 7
- XEVIL_MUS, // 17
- XJAZNAZI_MUS, // 18
- XPUTIT_MUS, // 21
- XGETYOU_MUS, // 22
- XTOWER2_MUS // 23
-#endif
- };
- struct dostime_t time;
-
-
-
- IN_ClearKeysDown();
- if (!AdLibPresent && !SoundBlasterPresent)
- return;
-
-
- MenuFadeOut();
-
-#ifndef SPEAR
-#ifndef UPLOAD
- _dos_gettime(&time);
- start = (time.hsecond%3)*6;
-#else
- start = 0;
-#endif
-#else
- start = 0;
-#endif
-
-
- CA_CacheGrChunk (STARTFONT+1);
-#ifdef SPEAR
- CacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
-#else
- CacheLump (CONTROLS_LUMP_START,CONTROLS_LUMP_END);
-#endif
- CA_LoadAllSounds ();
-
- fontnumber=1;
- ClearMScreen ();
- VWB_DrawPic(112,184,C_MOUSELBACKPIC);
- DrawStripes (10);
- SETFONTCOLOR (TEXTCOLOR,BKGDCOLOR);
-
-#ifndef SPEAR
- DrawWindow (CTL_X-2,CTL_Y-6,280,13*7,BKGDCOLOR);
-#else
- DrawWindow (CTL_X-2,CTL_Y-26,280,13*10,BKGDCOLOR);
-#endif
-
- DrawMenu (&MusicItems,&MusicMenu[start]);
-
- SETFONTCOLOR (READHCOLOR,BKGDCOLOR);
- PrintY=15;
- WindowX = 0;
- WindowY = 320;
- US_CPrint ("Robert's Jukebox");
-
- SETFONTCOLOR (TEXTCOLOR,BKGDCOLOR);
- VW_UpdateScreen();
- MenuFadeIn();
-
- do
- {
- which = HandleMenu(&MusicItems,&MusicMenu[start],NULL);
- if (which>=0)
- {
- if (lastsong >= 0)
- MusicMenu[start+lastsong].active = 1;
-
- StartCPMusic(songs[start + which]);
- MusicMenu[start+which].active = 2;
- DrawMenu (&MusicItems,&MusicMenu[start]);
- VW_UpdateScreen();
- lastsong = which;
- }
- } while(which>=0);
-
- MenuFadeOut();
- IN_ClearKeysDown();
-#ifdef SPEAR
- UnCacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
-#else
- UnCacheLump (CONTROLS_LUMP_START,CONTROLS_LUMP_END);
-#endif
-}
-#endif
-
-
-/*
-==========================
-=
-= InitGame
-=
-= Load a few things right away
-=
-==========================
-*/
-
-void InitGame (void)
-{
- int i,x,y;
- unsigned *blockstart;
-
- if (MS_CheckParm ("virtual"))
- virtualreality = true;
- else
- virtualreality = false;
-
- MM_Startup (); // so the signon screen can be freed
-
- SignonScreen ();
-
- VW_Startup ();
- IN_Startup ();
- PM_Startup ();
- PM_UnlockMainMem ();
- SD_Startup ();
- CA_Startup ();
- US_Startup ();
-
-
-#ifndef SPEAR
- if (mminfo.mainmem < 235000L)
-#else
- if (mminfo.mainmem < 257000L && !MS_CheckParm("debugmode"))
-#endif
- {
- memptr screen;
-
- CA_CacheGrChunk (ERRORSCREEN);
- screen = grsegs[ERRORSCREEN];
- ShutdownId();
- movedata ((unsigned)screen,7+7*160,0xb800,0,17*160);
- gotoxy (1,23);
- exit(1);
- }
-
-
-//
-// build some tables
-//
- InitDigiMap ();
-
- for (i=0;i<MAPSIZE;i++)
- {
- nearmapylookup[i] = &tilemap[0][0]+MAPSIZE*i;
- farmapylookup[i] = i*64;
- }
-
- for (i=0;i<PORTTILESHIGH;i++)
- uwidthtable[i] = UPDATEWIDE*i;
-
- blockstart = &blockstarts[0];
- for (y=0;y<UPDATEHIGH;y++)
- for (x=0;x<UPDATEWIDE;x++)
- *blockstart++ = SCREENWIDTH*16*y+x*TILEWIDTH;
-
- updateptr = &update[0];
-
- bufferofs = 0;
- displayofs = 0;
- ReadConfig ();
-
-
-//
-// HOLDING DOWN 'M' KEY?
-//
-#ifndef SPEARDEMO
- if (Keyboard[sc_M])
- DoJukebox();
- else
-#endif
-//
-// draw intro screen stuff
-//
- if (!virtualreality)
- IntroScreen ();
-
-//
-// load in and lock down some basic chunks
-//
-
- CA_CacheGrChunk(STARTFONT);
- MM_SetLock (&grsegs[STARTFONT],true);
-
- LoadLatchMem ();
- BuildTables (); // trig tables
- SetupWalls ();
-
-#if 0
-{
-int temp,i;
-temp = viewsize;
- profilehandle = open("SCALERS.TXT", O_CREAT | O_WRONLY | O_TEXT);
-for (i=1;i<20;i++)
- NewViewSize(i);
-viewsize = temp;
-close(profilehandle);
-}
-#endif
-
- NewViewSize (viewsize);
-
-
-//
-// initialize variables
-//
- InitRedShifts ();
- if (!virtualreality)
- FinishSignon();
-
- displayofs = PAGE1START;
- bufferofs = PAGE2START;
-
- if (virtualreality)
- {
- NoWait = true;
- geninterrupt(0x60);
- }
-}
-
-//===========================================================================
-
-/*
-==========================
-=
-= SetViewSize
-=
-==========================
-*/
-
-boolean SetViewSize (unsigned width, unsigned height)
-{
- viewwidth = width&~15; // must be divisable by 16
- viewheight = height&~1; // must be even
- centerx = viewwidth/2-1;
- shootdelta = viewwidth/10;
- screenofs = ((200-STATUSLINES-viewheight)/2*SCREENWIDTH+(320-viewwidth)/8);
-
-//
-// calculate trace angles and projection constants
-//
- CalcProjection (FOCALLENGTH);
-
-//
-// build all needed compiled scalers
-//
-// MM_BombOnError (false);
- SetupScaling (viewwidth*1.5);
-#if 0
- MM_BombOnError (true);
- if (mmerror)
- {
- Quit ("Can't build scalers!");
- mmerror = false;
- return false;
- }
-#endif
- return true;
-}
-
-
-void ShowViewSize (int width)
-{
- int oldwidth,oldheight;
-
- oldwidth = viewwidth;
- oldheight = viewheight;
-
- viewwidth = width*16;
- viewheight = width*16*HEIGHTRATIO;
- DrawPlayBorder ();
-
- viewheight = oldheight;
- viewwidth = oldwidth;
-}
-
-
-void NewViewSize (int width)
-{
- CA_UpLevel ();
- MM_SortMem ();
- viewsize = width;
- SetViewSize (width*16,width*16*HEIGHTRATIO);
- CA_DownLevel ();
-}
-
-
-
-//===========================================================================
-
-/*
-==========================
-=
-= Quit
-=
-==========================
-*/
-
-void Quit (char *error)
-{
- unsigned finscreen;
- memptr screen;
-
- if (virtualreality)
- geninterrupt(0x61);
-
- ClearMemory ();
- if (!*error)
- {
- #ifndef JAPAN
- CA_CacheGrChunk (ORDERSCREEN);
- screen = grsegs[ORDERSCREEN];
- #endif
- WriteConfig ();
- }
- else
- {
- CA_CacheGrChunk (ERRORSCREEN);
- screen = grsegs[ERRORSCREEN];
- }
-
- ShutdownId ();
-
- if (error && *error)
- {
- movedata ((unsigned)screen,7,0xb800,0,7*160);
- gotoxy (10,4);
- puts(error);
- gotoxy (1,8);
- exit(1);
- }
- else
- if (!error || !(*error))
- {
- clrscr();
- #ifndef JAPAN
- movedata ((unsigned)screen,7,0xb800,0,4000);
- gotoxy(1,24);
- #endif
-//asm mov bh,0
-//asm mov dh,23 // row
-//asm mov dl,0 // collumn
-//asm mov ah,2
-//asm int 0x10
- }
-
- exit(0);
-}
-
-//===========================================================================
-
-
-
-/*
-=====================
-=
-= DemoLoop
-=
-=====================
-*/
-
-static char *ParmStrings[] = {"baby","easy","normal","hard",""};
-
-void DemoLoop (void)
-{
- static int LastDemo;
- int i,level;
- long nsize;
- memptr nullblock;
-
-//
-// check for launch from ted
-//
- if (tedlevel)
- {
- NoWait = true;
- NewGame(1,0);
-
- for (i = 1;i < _argc;i++)
- {
- if ( (level = US_CheckParm(_argv[i],ParmStrings)) != -1)
- {
- gamestate.difficulty=level;
- break;
- }
- }
-
-#ifndef SPEAR
- gamestate.episode = tedlevelnum/10;
- gamestate.mapon = tedlevelnum%10;
-#else
- gamestate.episode = 0;
- gamestate.mapon = tedlevelnum;
-#endif
- GameLoop();
- Quit (NULL);
- }
-
-
-//
-// main game cycle
-//
-
-
-// nsize = (long)40*1024;
-// MM_GetPtr(&nullblock,nsize);
-
-#ifndef DEMOTEST
-
- #ifndef UPLOAD
-
- #ifndef GOODTIMES
- #ifndef SPEAR
- #ifndef JAPAN
- if (!NoWait)
- NonShareware();
- #endif
- #else
-
- #ifndef GOODTIMES
- #ifndef SPEARDEMO
- CopyProtection();
- #endif
- #endif
-
- #endif
- #endif
- #endif
-
- StartCPMusic(INTROSONG);
-
-#ifndef JAPAN
- if (!NoWait)
- PG13 ();
-#endif
-
-#endif
-
- while (1)
- {
- while (!NoWait)
- {
-//
-// title page
-//
- MM_SortMem ();
-#ifndef DEMOTEST
-
-#ifdef SPEAR
- CA_CacheGrChunk (TITLEPALETTE);
-
- CA_CacheGrChunk (TITLE1PIC);
- VWB_DrawPic (0,0,TITLE1PIC);
- UNCACHEGRCHUNK (TITLE1PIC);
-
- CA_CacheGrChunk (TITLE2PIC);
- VWB_DrawPic (0,80,TITLE2PIC);
- UNCACHEGRCHUNK (TITLE2PIC);
- VW_UpdateScreen ();
- VL_FadeIn(0,255,grsegs[TITLEPALETTE],30);
-
- UNCACHEGRCHUNK (TITLEPALETTE);
-#else
- CA_CacheScreen (TITLEPIC);
- VW_UpdateScreen ();
- VW_FadeIn();
-#endif
- if (IN_UserInput(TickBase*15))
- break;
- VW_FadeOut();
-//
-// credits page
-//
- CA_CacheScreen (CREDITSPIC);
- VW_UpdateScreen();
- VW_FadeIn ();
- if (IN_UserInput(TickBase*10))
- break;
- VW_FadeOut ();
-//
-// high scores
-//
- DrawHighScores ();
- VW_UpdateScreen ();
- VW_FadeIn ();
-
- if (IN_UserInput(TickBase*10))
- break;
-#endif
-//
-// demo
-//
-
- #ifndef SPEARDEMO
- PlayDemo (LastDemo++%4);
- #else
- PlayDemo (0);
- #endif
-
- if (playstate == ex_abort)
- break;
- StartCPMusic(INTROSONG);
- }
-
- VW_FadeOut ();
-
-#ifndef SPEAR
- if (Keyboard[sc_Tab] && MS_CheckParm("goobers"))
-#else
- if (Keyboard[sc_Tab] && MS_CheckParm("debugmode"))
-#endif
- RecordDemo ();
- else
- US_ControlPanel (0);
-
- if (startgame || loadedgame)
- {
- GameLoop ();
- VW_FadeOut();
- StartCPMusic(INTROSONG);
- }
- }
-}
-
-
-//===========================================================================
-
-
-/*
-==========================
-=
-= main
-=
-==========================
-*/
-
-char *nosprtxt[] = {"nospr",nil};
-
-void main (void)
-{
- int i;
-
-
-#ifdef BETA
- //
- // THIS IS FOR BETA ONLY!
- //
- struct dosdate_t d;
-
- _dos_getdate(&d);
- if (d.year > YEAR ||
- (d.month >= MONTH && d.day >= DAY))
- {
- printf("Sorry, BETA-TESTING is over. Thanks for you help.\n");
- exit(1);
- }
-#endif
-
- CheckForEpisodes();
-
- Patch386 ();
-
- InitGame ();
-
- DemoLoop();
-
- Quit("Demo loop exited???");
-}
-
--- a/WOLFSRC/WL_MENU.C
+++ /dev/null
@@ -1,3986 +1,0 @@
-////////////////////////////////////////////////////////////////////
-//
-// WL_MENU.C
-// by John Romero (C) 1992 Id Software, Inc.
-//
-////////////////////////////////////////////////////////////////////
-#include "wl_def.h"
-#pragma hdrstop
-
-//
-// PRIVATE PROTOTYPES
-//
-void CP_ReadThis(void);
-
-#ifdef SPEAR
-#define STARTITEM newgame
-
-#else
-#ifdef GOODTIMES
-#define STARTITEM newgame
-
-#else
-#define STARTITEM readthis
-#endif
-#endif
-
-char far endStrings[9][80]=
-{
-#ifndef SPEAR
- {"Dost thou wish to\nleave with such hasty\nabandon?"},
- {"Chickening out...\nalready?"},
- {"Press N for more carnage.\nPress Y to be a weenie."},
- {"So, you think you can\nquit this easily, huh?"},
- {"Press N to save the world.\nPress Y to abandon it in\nits hour of need."},
- {"Press N if you are brave.\nPress Y to cower in shame."},
- {"Heroes, press N.\nWimps, press Y."},
- {"You are at an intersection.\nA sign says, 'Press Y to quit.'\n>"},
- {"For guns and glory, press N.\nFor work and worry, press Y."}
-#else
- ENDSTR1,
- ENDSTR2,
- ENDSTR3,
- ENDSTR4,
- ENDSTR5,
- ENDSTR6,
- ENDSTR7,
- ENDSTR8,
- ENDSTR9
-#endif
-};
-
-CP_iteminfo
- MainItems={MENU_X,MENU_Y,10,STARTITEM,24},
- SndItems={SM_X,SM_Y1,12,0,52},
- LSItems={LSM_X,LSM_Y,10,0,24},
- CtlItems={CTL_X,CTL_Y,6,-1,56},
- CusItems={8,CST_Y+13*2,9,-1,0},
- NewEitems={NE_X,NE_Y,11,0,88},
- NewItems={NM_X,NM_Y,4,2,24};
-
-#pragma warn -sus
-CP_itemtype far
-MainMenu[]=
-{
-#ifdef JAPAN
- {1,"",CP_NewGame},
- {1,"",CP_Sound},
- {1,"",CP_Control},
- {1,"",CP_LoadGame},
- {0,"",CP_SaveGame},
- {1,"",CP_ChangeView},
- {2,"",CP_ReadThis},
- {1,"",CP_ViewScores},
- {1,"",0},
- {1,"",0}
-#else
-
- {1,STR_NG,CP_NewGame},
- {1,STR_SD,CP_Sound},
- {1,STR_CL,CP_Control},
- {1,STR_LG,CP_LoadGame},
- {0,STR_SG,CP_SaveGame},
- {1,STR_CV,CP_ChangeView},
-
-#ifndef GOODTIMES
-#ifndef SPEAR
-
- #ifdef SPANISH
- {2,"Ve esto!",CP_ReadThis},
- #else
- {2,"Read This!",CP_ReadThis},
- #endif
-
-#endif
-#endif
-
- {1,STR_VS,CP_ViewScores},
- {1,STR_BD,0},
- {1,STR_QT,0}
-#endif
-},
-
-far SndMenu[]=
-{
-#ifdef JAPAN
- {1,"",0},
- {1,"",0},
- {1,"",0},
- {0,"",0},
- {0,"",0},
- {1,"",0},
- {1,"",0},
- {1,"",0},
- {0,"",0},
- {0,"",0},
- {1,"",0},
- {1,"",0},
-#else
- {1,STR_NONE,0},
- {1,STR_PC,0},
- {1,STR_ALSB,0},
- {0,"",0},
- {0,"",0},
- {1,STR_NONE,0},
- {1,STR_DISNEY,0},
- {1,STR_SB,0},
- {0,"",0},
- {0,"",0},
- {1,STR_NONE,0},
- {1,STR_ALSB,0}
-#endif
-},
-
-far CtlMenu[]=
-{
-#ifdef JAPAN
- {0,"",0},
- {0,"",0},
- {0,"",0},
- {0,"",0},
- {0,"",MouseSensitivity},
- {1,"",CustomControls}
-#else
- {0,STR_MOUSEEN,0},
- {0,STR_JOYEN,0},
- {0,STR_PORT2,0},
- {0,STR_GAMEPAD,0},
- {0,STR_SENS,MouseSensitivity},
- {1,STR_CUSTOM,CustomControls}
-#endif
-},
-
-#pragma warn +sus
-
-#ifndef SPEAR
-far NewEmenu[]=
-{
-#ifdef JAPAN
-#ifdef JAPDEMO
- {1,"",0},
- {0,"",0},
- {0,"",0},
- {0,"",0},
- {0,"",0},
- {0,"",0},
- {0,"",0},
- {0,"",0},
- {0,"",0},
- {0,"",0},
- {0,"",0},
- {0,"",0},
-#else
- {1,"",0},
- {0,"",0},
- {1,"",0},
- {0,"",0},
- {1,"",0},
- {0,"",0},
- {1,"",0},
- {0,"",0},
- {1,"",0},
- {0,"",0},
- {1,"",0},
- {0,"",0}
-#endif
-#else
- #ifdef SPANISH
- {1,"Episodio 1\n"
- "Fuga desde Wolfenstein",0},
- {0,"",0},
- {3,"Episodio 2\n"
- "Operacion Eisenfaust",0},
- {0,"",0},
- {3,"Episodio 3\n"
- "Muere, Fuhrer, Muere!",0},
- {0,"",0},
- {3,"Episodio 4\n"
- "Un Negro Secreto",0},
- {0,"",0},
- {3,"Episodio 5\n"
- "Huellas del Loco",0},
- {0,"",0},
- {3,"Episodio 6\n"
- "Confrontacion",0}
- #else
- {1,"Episode 1\n"
- "Escape from Wolfenstein",0},
- {0,"",0},
- {3,"Episode 2\n"
- "Operation: Eisenfaust",0},
- {0,"",0},
- {3,"Episode 3\n"
- "Die, Fuhrer, Die!",0},
- {0,"",0},
- {3,"Episode 4\n"
- "A Dark Secret",0},
- {0,"",0},
- {3,"Episode 5\n"
- "Trail of the Madman",0},
- {0,"",0},
- {3,"Episode 6\n"
- "Confrontation",0}
- #endif
-#endif
-},
-#endif
-
-
-far NewMenu[]=
-{
-#ifdef JAPAN
- {1,"",0},
- {1,"",0},
- {1,"",0},
- {1,"",0}
-#else
- {1,STR_DADDY,0},
- {1,STR_HURTME,0},
- {1,STR_BRINGEM,0},
- {1,STR_DEATH,0}
-#endif
-},
-
-far LSMenu[]=
-{
- {1,"",0},
- {1,"",0},
- {1,"",0},
- {1,"",0},
- {1,"",0},
- {1,"",0},
- {1,"",0},
- {1,"",0},
- {1,"",0},
- {1,"",0}
-},
-
-far CusMenu[]=
-{
- {1,"",0},
- {0,"",0},
- {0,"",0},
- {1,"",0},
- {0,"",0},
- {0,"",0},
- {1,"",0},
- {0,"",0},
- {1,"",0}
-}
-;
-
-
-int color_hlite[]={
- DEACTIVE,
- HIGHLIGHT,
- READHCOLOR,
- 0x67
- },
-
- color_norml[]={
- DEACTIVE,
- TEXTCOLOR,
- READCOLOR,
- 0x6b
- };
-
-int EpisodeSelect[6]={1};
-
-
-int SaveGamesAvail[10],StartGame,SoundStatus=1,pickquick;
-char SaveGameNames[10][32],SaveName[13]="SAVEGAM?.";
-
-
-////////////////////////////////////////////////////////////////////
-//
-// INPUT MANAGER SCANCODE TABLES
-//
-////////////////////////////////////////////////////////////////////
-static byte
- *ScanNames[] = // Scan code names with single chars
- {
- "?","?","1","2","3","4","5","6","7","8","9","0","-","+","?","?",
- "Q","W","E","R","T","Y","U","I","O","P","[","]","|","?","A","S",
- "D","F","G","H","J","K","L",";","\"","?","?","?","Z","X","C","V",
- "B","N","M",",",".","/","?","?","?","?","?","?","?","?","?","?",
- "?","?","?","?","?","?","?","?","\xf","?","-","\x15","5","\x11","+","?",
- "\x13","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?",
- "?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?",
- "?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?"
- }, // DEBUG - consolidate these
- far ExtScanCodes[] = // Scan codes with >1 char names
- {
- 1,0xe,0xf,0x1d,0x2a,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,
- 0x3f,0x40,0x41,0x42,0x43,0x44,0x57,0x59,0x46,0x1c,0x36,
- 0x37,0x38,0x47,0x49,0x4f,0x51,0x52,0x53,0x45,0x48,
- 0x50,0x4b,0x4d,0x00
- },
- *ExtScanNames[] = // Names corresponding to ExtScanCodes
- {
- "Esc","BkSp","Tab","Ctrl","LShft","Space","CapsLk","F1","F2","F3","F4",
- "F5","F6","F7","F8","F9","F10","F11","F12","ScrlLk","Enter","RShft",
- "PrtSc","Alt","Home","PgUp","End","PgDn","Ins","Del","NumLk","Up",
- "Down","Left","Right",""
- };
-
-
-////////////////////////////////////////////////////////////////////
-//
-// Wolfenstein Control Panel! Ta Da!
-//
-////////////////////////////////////////////////////////////////////
-void US_ControlPanel(byte scancode)
-{
- int which,i,start;
-
-
- if (ingame)
- if (CP_CheckQuick(scancode))
- return;
-
- StartCPMusic(MENUSONG);
- SetupControlPanel();
-
- //
- // F-KEYS FROM WITHIN GAME
- //
- switch(scancode)
- {
- case sc_F1:
- #ifdef SPEAR
- BossKey();
- #else
- #ifdef GOODTIMES
- BossKey();
- #else
- HelpScreens();
- #endif
- #endif
- goto finishup;
-
- case sc_F2:
- CP_SaveGame(0);
- goto finishup;
-
- case sc_F3:
- CP_LoadGame(0);
- goto finishup;
-
- case sc_F4:
- CP_Sound();
- goto finishup;
-
- case sc_F5:
- CP_ChangeView();
- goto finishup;
-
- case sc_F6:
- CP_Control();
- goto finishup;
-
- finishup:
- CleanupControlPanel();
- #ifdef SPEAR
- UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
- #endif
- return;
- }
-
-#ifdef SPEAR
- CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
-#endif
-
- DrawMainMenu();
- MenuFadeIn();
- StartGame=0;
-
- //
- // MAIN MENU LOOP
- //
- do
- {
- which=HandleMenu(&MainItems,&MainMenu[0],NULL);
-
- #ifdef SPEAR
- #ifndef SPEARDEMO
- //
- // EASTER EGG FOR SPEAR OF DESTINY!
- //
- if (Keyboard[sc_I] && Keyboard[sc_D])
- {
- VW_FadeOut();
- StartCPMusic (XJAZNAZI_MUS);
- UnCacheLump(OPTIONS_LUMP_START,OPTIONS_LUMP_END);
- UnCacheLump(BACKDROP_LUMP_START,BACKDROP_LUMP_END);
- MM_SortMem ();
- ClearMemory ();
-
-
- CA_CacheGrChunk (IDGUYS1PIC);
- VWB_DrawPic(0,0,IDGUYS1PIC);
- UNCACHEGRCHUNK(IDGUYS1PIC);
-
- CA_CacheGrChunk (IDGUYS2PIC);
- VWB_DrawPic(0,80,IDGUYS2PIC);
- UNCACHEGRCHUNK(IDGUYS2PIC);
-
- VW_UpdateScreen();
-
- CA_CacheGrChunk (IDGUYSPALETTE);
- VL_FadeIn(0,255,grsegs[IDGUYSPALETTE],30);
- UNCACHEGRCHUNK(IDGUYSPALETTE);
-
- while (Keyboard[sc_I] || Keyboard[sc_D]);
- IN_ClearKeysDown();
- IN_Ack();
-
- VW_FadeOut();
-
- CacheLump(BACKDROP_LUMP_START,BACKDROP_LUMP_END);
- CacheLump(OPTIONS_LUMP_START,OPTIONS_LUMP_END);
- DrawMainMenu();
- StartCPMusic (MENUSONG);
- MenuFadeIn();
- }
- #endif
- #endif
-
- switch(which)
- {
- case viewscores:
- if (MainMenu[viewscores].routine == NULL)
- if (CP_EndGame())
- StartGame=1;
-
- DrawMainMenu();
- MenuFadeIn();
- break;
-
- case backtodemo:
- #ifdef SPEAR
- if (!ingame)
- {
- //
- // DEALLOCATE ALL SOUNDS!
- //
- switch (SoundMode)
- {
- case sdm_PC:
- start = STARTPCSOUNDS;
- break;
- case sdm_AdLib:
- start = STARTADLIBSOUNDS;
- break;
- }
-
- if (SoundMode != sdm_Off)
- for (i=0;i<NUMSOUNDS;i++,start++)
- if (audiosegs[start])
- MM_SetPurge (&(memptr)audiosegs[start],3); // make purgable
- }
- #endif
-
- MM_SortMem();
- StartGame=1;
- if (!ingame)
- StartCPMusic(INTROSONG);
- VL_FadeOut(0,255,0,0,0,10);
- break;
-
- case -1:
- case quit:
- CP_Quit();
- break;
-
- default:
- if (!StartGame)
- {
- DrawMainMenu();
- MenuFadeIn();
- }
- }
-
- //
- // "EXIT OPTIONS" OR "NEW GAME" EXITS
- //
- } while(!StartGame);
-
- //
- // DEALLOCATE EVERYTHING
- //
- CleanupControlPanel();
-
- //
- // CHANGE MAINMENU ITEM
- //
- if (startgame || loadedgame)
- {
- #pragma warn -sus
- MainMenu[viewscores].routine = NULL;
- #ifndef JAPAN
- _fstrcpy(MainMenu[viewscores].string,STR_EG);
- #endif
- #pragma warn +sus
- }
-
- // RETURN/START GAME EXECUTION
-
-#ifdef SPEAR
- UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
- MM_SortMem ();
-#endif
-}
-
-
-////////////////////////
-//
-// DRAW MAIN MENU SCREEN
-//
-void DrawMainMenu(void)
-{
-#ifdef JAPAN
- CA_CacheScreen(S_OPTIONSPIC);
-#else
- ClearMScreen();
-
- VWB_DrawPic(112,184,C_MOUSELBACKPIC);
- DrawStripes(10);
- VWB_DrawPic(84,0,C_OPTIONSPIC);
-
- #ifdef SPANISH
- DrawWindow(MENU_X-8,MENU_Y-3,MENU_W+8,MENU_H,BKGDCOLOR);
- #else
- DrawWindow(MENU_X-8,MENU_Y-3,MENU_W,MENU_H,BKGDCOLOR);
- #endif
-#endif
-
- //
- // CHANGE "GAME" AND "DEMO"
- //
- if (ingame)
- {
- #ifndef JAPAN
-
- #ifdef SPANISH
- _fstrcpy(&MainMenu[backtodemo].string,STR_GAME);
- #else
- _fstrcpy(&MainMenu[backtodemo].string[8],STR_GAME);
- #endif
-
- #else
- CA_CacheGrChunk(C_MRETGAMEPIC);
- VWB_DrawPic(12*8,20*8,C_MRETGAMEPIC);
- UNCACHEGRCHUNK(C_MRETGAMEPIC);
- CA_CacheGrChunk(C_MENDGAMEPIC);
- VWB_DrawPic(12*8,18*8,C_MENDGAMEPIC);
- UNCACHEGRCHUNK(C_MENDGAMEPIC);
- #endif
- MainMenu[backtodemo].active=2;
- }
- else
- {
- #ifndef JAPAN
- #ifdef SPANISH
- _fstrcpy(&MainMenu[backtodemo].string,STR_BD);
- #else
- _fstrcpy(&MainMenu[backtodemo].string[8],STR_DEMO);
- #endif
- #else
- CA_CacheGrChunk(C_MRETDEMOPIC);
- VWB_DrawPic(12*8,20*8,C_MRETDEMOPIC);
- UNCACHEGRCHUNK(C_MRETDEMOPIC);
- CA_CacheGrChunk(C_MSCORESPIC);
- VWB_DrawPic(12*8,18*8,C_MSCORESPIC);
- UNCACHEGRCHUNK(C_MSCORESPIC);
- #endif
- MainMenu[backtodemo].active=1;
- }
-
- DrawMenu(&MainItems,&MainMenu[0]);
- VW_UpdateScreen();
-}
-
-#ifndef GOODTIMES
-#ifndef SPEAR
-////////////////////////////////////////////////////////////////////
-//
-// READ THIS!
-//
-////////////////////////////////////////////////////////////////////
-void CP_ReadThis(void)
-{
- StartCPMusic(CORNER_MUS);
- HelpScreens();
- StartCPMusic(MENUSONG);
-}
-#endif
-#endif
-
-#ifndef SPEAR
-#ifndef GOODTIMES
-#else
-////////////////////////////////////////////////////////////////////
-//
-// BOSS KEY
-//
-////////////////////////////////////////////////////////////////////
-void BossKey(void)
-{
- SD_MusicOff();
- _AX = 3;
- geninterrupt(0x10);
- printf("C>");
- while (!Keyboard[sc_Escape])
- IN_ClearKeysDown();
-
- SD_MusicOn();
- VL_SetVGAPlaneMode ();
- VL_TestPaletteSet ();
- VL_SetPalette (&gamepal);
- LoadLatchMem();
-}
-#endif
-#endif
-
-////////////////////////////////////////////////////////////////////
-//
-// CHECK QUICK-KEYS & QUIT (WHILE IN A GAME)
-//
-////////////////////////////////////////////////////////////////////
-int CP_CheckQuick(unsigned scancode)
-{
- switch(scancode)
- {
- //
- // END GAME
- //
- case sc_F7:
- CA_CacheGrChunk(STARTFONT+1);
-
- WindowH=160;
- #ifdef JAPAN
- if (GetYorN(7,8,C_JAPQUITPIC))
- #else
- if (Confirm(ENDGAMESTR))
- #endif
- {
- playstate = ex_died;
- pickquick = gamestate.lives = 0;
- }
-
- DrawAllPlayBorder();
- WindowH=200;
- fontnumber=0;
- MainMenu[savegame].active = 0;
- return 1;
-
- //
- // QUICKSAVE
- //
- case sc_F8:
- if (SaveGamesAvail[LSItems.curpos] && pickquick)
- {
- CA_CacheGrChunk(STARTFONT+1);
- fontnumber = 1;
- Message(STR_SAVING"...");
- CP_SaveGame(1);
- fontnumber=0;
- }
- else
- {
- #ifndef SPEAR
- CA_CacheGrChunk(STARTFONT+1);
- CA_CacheGrChunk(C_CURSOR1PIC);
- CA_CacheGrChunk(C_CURSOR2PIC);
- CA_CacheGrChunk(C_DISKLOADING1PIC);
- CA_CacheGrChunk(C_DISKLOADING2PIC);
- CA_CacheGrChunk(C_SAVEGAMEPIC);
- CA_CacheGrChunk(C_MOUSELBACKPIC);
- #else
- CacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
- CA_CacheGrChunk(C_CURSOR1PIC);
- #endif
-
- VW_FadeOut ();
-
- StartCPMusic(MENUSONG);
- pickquick=CP_SaveGame(0);
-
- SETFONTCOLOR(0,15);
- IN_ClearKeysDown();
- DrawPlayScreen ();
-
- if (!startgame && !loadedgame)
- {
- VW_FadeIn ();
- StartMusic ();
- }
-
- if (loadedgame)
- playstate = ex_abort;
- lasttimecount = TimeCount;
-
- if (MousePresent)
- Mouse(MDelta); // Clear accumulated mouse movement
-
- PM_CheckMainMem ();
-
- #ifndef SPEAR
- UNCACHEGRCHUNK(C_CURSOR1PIC);
- UNCACHEGRCHUNK(C_CURSOR2PIC);
- UNCACHEGRCHUNK(C_DISKLOADING1PIC);
- UNCACHEGRCHUNK(C_DISKLOADING2PIC);
- UNCACHEGRCHUNK(C_SAVEGAMEPIC);
- UNCACHEGRCHUNK(C_MOUSELBACKPIC);
- #else
- UnCacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
- #endif
- }
- return 1;
-
- //
- // QUICKLOAD
- //
- case sc_F9:
- if (SaveGamesAvail[LSItems.curpos] && pickquick)
- {
- char string[100]=STR_LGC;
-
-
- CA_CacheGrChunk(STARTFONT+1);
- fontnumber = 1;
-
- strcat(string,SaveGameNames[LSItems.curpos]);
- strcat(string,"\"?");
-
- if (Confirm(string))
- CP_LoadGame(1);
-
- DrawAllPlayBorder();
- fontnumber=0;
- }
- else
- {
- #ifndef SPEAR
- CA_CacheGrChunk(STARTFONT+1);
- CA_CacheGrChunk(C_CURSOR1PIC);
- CA_CacheGrChunk(C_CURSOR2PIC);
- CA_CacheGrChunk(C_DISKLOADING1PIC);
- CA_CacheGrChunk(C_DISKLOADING2PIC);
- CA_CacheGrChunk(C_LOADGAMEPIC);
- CA_CacheGrChunk(C_MOUSELBACKPIC);
- #else
- CA_CacheGrChunk(C_CURSOR1PIC);
- CacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
- #endif
-
- VW_FadeOut ();
-
- StartCPMusic(MENUSONG);
- pickquick=CP_LoadGame(0);
-
- SETFONTCOLOR(0,15);
- IN_ClearKeysDown();
- DrawPlayScreen ();
-
- if (!startgame && !loadedgame)
- {
- VW_FadeIn ();
- StartMusic ();
- }
-
- if (loadedgame)
- playstate = ex_abort;
-
- lasttimecount = TimeCount;
-
- if (MousePresent)
- Mouse(MDelta); // Clear accumulated mouse movement
- PM_CheckMainMem ();
-
- #ifndef SPEAR
- UNCACHEGRCHUNK(C_CURSOR1PIC);
- UNCACHEGRCHUNK(C_CURSOR2PIC);
- UNCACHEGRCHUNK(C_DISKLOADING1PIC);
- UNCACHEGRCHUNK(C_DISKLOADING2PIC);
- UNCACHEGRCHUNK(C_LOADGAMEPIC);
- UNCACHEGRCHUNK(C_MOUSELBACKPIC);
- #else
- UnCacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
- #endif
- }
- return 1;
-
- //
- // QUIT
- //
- case sc_F10:
- CA_CacheGrChunk(STARTFONT+1);
-
- WindowX=WindowY=0;
- WindowW=320;
- WindowH=160;
- #ifdef JAPAN
- if (GetYorN(7,8,C_QUITMSGPIC))
- #else
- #ifdef SPANISH
- if (Confirm(ENDGAMESTR))
- #else
- if (Confirm(endStrings[US_RndT()&0x7+(US_RndT()&1)]))
- #endif
- #endif
- {
- int i;
-
-
- VW_UpdateScreen();
- SD_MusicOff();
- SD_StopSound();
- MenuFadeOut();
-
- //
- // SHUT-UP THE ADLIB
- //
- for (i=1;i<=0xf5;i++)
- alOut(i,0);
- Quit(NULL);
- }
-
- DrawAllPlayBorder();
- WindowH=200;
- fontnumber=0;
- return 1;
- }
-
- return 0;
-}
-
-
-////////////////////////////////////////////////////////////////////
-//
-// END THE CURRENT GAME
-//
-////////////////////////////////////////////////////////////////////
-int CP_EndGame(void)
-{
-#ifdef JAPAN
- if (!GetYorN(7,8,C_JAPQUITPIC))
-#else
- if (!Confirm(ENDGAMESTR))
-#endif
- return 0;
-
- pickquick = gamestate.lives = 0;
- playstate = ex_died;
-
- #pragma warn -sus
- MainMenu[savegame].active = 0;
- MainMenu[viewscores].routine=CP_ViewScores;
- #ifndef JAPAN
- _fstrcpy(MainMenu[viewscores].string,STR_VS);
- #endif
- #pragma warn +sus
-
- return 1;
-}
-
-
-////////////////////////////////////////////////////////////////////
-//
-// VIEW THE HIGH SCORES
-//
-////////////////////////////////////////////////////////////////////
-void CP_ViewScores(void)
-{
- fontnumber=0;
-
-#ifdef SPEAR
- UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
- StartCPMusic (XAWARD_MUS);
-#else
- StartCPMusic (ROSTER_MUS);
-#endif
-
- DrawHighScores ();
- VW_UpdateScreen ();
- MenuFadeIn();
- fontnumber=1;
-
- IN_Ack();
-
- StartCPMusic(MENUSONG);
- MenuFadeOut();
-
-#ifdef SPEAR
- CacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
- CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
-#endif
-}
-
-
-////////////////////////////////////////////////////////////////////
-//
-// START A NEW GAME
-//
-////////////////////////////////////////////////////////////////////
-void CP_NewGame(void)
-{
- int which,episode;
-
-#ifdef SPEAR
- UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
-#endif
-
-
-#ifndef SPEAR
-firstpart:
-
- DrawNewEpisode();
- do
- {
- which=HandleMenu(&NewEitems,&NewEmenu[0],NULL);
- switch(which)
- {
- case -1:
- MenuFadeOut();
- return;
-
- default:
- if (!EpisodeSelect[which/2])
- {
- SD_PlaySound (NOWAYSND);
- Message("Please select \"Read This!\"\n"
- "from the Options menu to\n"
- "find out how to order this\n"
- "episode from Apogee.");
- IN_ClearKeysDown();
- IN_Ack();
- DrawNewEpisode();
- which = 0;
- }
- else
- {
- episode = which/2;
- which = 1;
- }
- break;
- }
-
- } while (!which);
-
- ShootSnd();
-
- //
- // ALREADY IN A GAME?
- //
- if (ingame)
- #ifdef JAPAN
- if (!GetYorN(7,8,C_JAPNEWGAMEPIC))
- #else
- if (!Confirm(CURGAME))
- #endif
- {
- MenuFadeOut();
- return;
- }
-
- MenuFadeOut();
-
-#else
- episode = 0;
-
- //
- // ALREADY IN A GAME?
- //
- CacheLump (NEWGAME_LUMP_START,NEWGAME_LUMP_END);
- DrawNewGame();
- if (ingame)
- if (!Confirm(CURGAME))
- {
- MenuFadeOut();
- UnCacheLump (NEWGAME_LUMP_START,NEWGAME_LUMP_END);
- CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
- return;
- }
-
-#endif
-
- DrawNewGame();
- which=HandleMenu(&NewItems,&NewMenu[0],DrawNewGameDiff);
- if (which<0)
- {
- MenuFadeOut();
- #ifndef SPEAR
- goto firstpart;
- #else
- UnCacheLump (NEWGAME_LUMP_START,NEWGAME_LUMP_END);
- CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
- return;
- #endif
- }
-
- ShootSnd();
- NewGame(which,episode);
- StartGame=1;
- MenuFadeOut();
-
- //
- // CHANGE "READ THIS!" TO NORMAL COLOR
- //
- #ifndef SPEAR
- #ifndef GOODTIMES
- MainMenu[readthis].active=1;
- #endif
- #endif
-
- pickquick = 0;
-
-#ifdef SPEAR
- UnCacheLump (NEWGAME_LUMP_START,NEWGAME_LUMP_END);
- CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
-#endif
-}
-
-
-#ifndef SPEAR
-/////////////////////
-//
-// DRAW NEW EPISODE MENU
-//
-void DrawNewEpisode(void)
-{
- int i;
-
-#ifdef JAPAN
- CA_CacheScreen(S_EPISODEPIC);
-#else
- ClearMScreen();
- VWB_DrawPic(112,184,C_MOUSELBACKPIC);
-
- DrawWindow(NE_X-4,NE_Y-4,NE_W+8,NE_H+8,BKGDCOLOR);
- SETFONTCOLOR(READHCOLOR,BKGDCOLOR);
- PrintY=2;
- WindowX=0;
- #ifdef SPANISH
- US_CPrint("Cual episodio jugar?");
- #else
- US_CPrint("Which episode to play?");
- #endif
-#endif
-
- SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
- DrawMenu(&NewEitems,&NewEmenu[0]);
-
- for (i=0;i<6;i++)
- VWB_DrawPic(NE_X+32,NE_Y+i*26,C_EPISODE1PIC+i);
-
- VW_UpdateScreen();
- MenuFadeIn();
- WaitKeyUp();
-}
-#endif
-
-/////////////////////
-//
-// DRAW NEW GAME MENU
-//
-void DrawNewGame(void)
-{
-#ifdef JAPAN
- CA_CacheScreen(S_SKILLPIC);
-#else
- ClearMScreen();
- VWB_DrawPic(112,184,C_MOUSELBACKPIC);
-
- SETFONTCOLOR(READHCOLOR,BKGDCOLOR);
- PrintX=NM_X+20;
- PrintY=NM_Y-32;
-
-#ifndef SPEAR
- #ifdef SPANISH
- US_Print("Eres macho?");
- #else
- US_Print("How tough are you?");
- #endif
-#else
- VWB_DrawPic (PrintX,PrintY,C_HOWTOUGHPIC);
-#endif
-
- DrawWindow(NM_X-5,NM_Y-10,NM_W,NM_H,BKGDCOLOR);
-#endif
-
- DrawMenu(&NewItems,&NewMenu[0]);
- DrawNewGameDiff(NewItems.curpos);
- VW_UpdateScreen();
- MenuFadeIn();
- WaitKeyUp();
-}
-
-
-////////////////////////
-//
-// DRAW NEW GAME GRAPHIC
-//
-void DrawNewGameDiff(int w)
-{
- VWB_DrawPic(NM_X+185,NM_Y+7,w+C_BABYMODEPIC);
-}
-
-
-////////////////////////////////////////////////////////////////////
-//
-// HANDLE SOUND MENU
-//
-////////////////////////////////////////////////////////////////////
-void CP_Sound(void)
-{
- int which,i;
-
-
-#ifdef SPEAR
- UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
- CacheLump (SOUND_LUMP_START,SOUND_LUMP_END);
-#endif
-
- DrawSoundMenu();
- MenuFadeIn();
- WaitKeyUp();
-
- do
- {
- which=HandleMenu(&SndItems,&SndMenu[0],NULL);
- //
- // HANDLE MENU CHOICES
- //
- switch(which)
- {
- //
- // SOUND EFFECTS
- //
- case 0:
- if (SoundMode!=sdm_Off)
- {
- SD_WaitSoundDone();
- SD_SetSoundMode(sdm_Off);
- DrawSoundMenu();
- }
- break;
- case 1:
- if (SoundMode!=sdm_PC)
- {
- SD_WaitSoundDone();
- SD_SetSoundMode(sdm_PC);
- CA_LoadAllSounds();
- DrawSoundMenu();
- ShootSnd();
- }
- break;
- case 2:
- if (SoundMode!=sdm_AdLib)
- {
- SD_WaitSoundDone();
- SD_SetSoundMode(sdm_AdLib);
- CA_LoadAllSounds();
- DrawSoundMenu();
- ShootSnd();
- }
- break;
-
- //
- // DIGITIZED SOUND
- //
- case 5:
- if (DigiMode!=sds_Off)
- {
- SD_SetDigiDevice(sds_Off);
- DrawSoundMenu();
- }
- break;
- case 6:
- if (DigiMode!=sds_SoundSource)
- {
- SD_SetDigiDevice(sds_SoundSource);
- DrawSoundMenu();
- ShootSnd();
- }
- break;
- case 7:
- if (DigiMode!=sds_SoundBlaster)
- {
- SD_SetDigiDevice(sds_SoundBlaster);
- DrawSoundMenu();
- ShootSnd();
- }
- break;
-
- //
- // MUSIC
- //
- case 10:
- if (MusicMode!=smm_Off)
- {
- SD_SetMusicMode(smm_Off);
- DrawSoundMenu();
- ShootSnd();
- }
- break;
- case 11:
- if (MusicMode!=smm_AdLib)
- {
- SD_SetMusicMode(smm_AdLib);
- DrawSoundMenu();
- ShootSnd();
- StartCPMusic(MENUSONG);
- }
- break;
- }
- } while(which>=0);
-
- MenuFadeOut();
-
-#ifdef SPEAR
- UnCacheLump (SOUND_LUMP_START,SOUND_LUMP_END);
- CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
-#endif
-}
-
-
-//////////////////////
-//
-// DRAW THE SOUND MENU
-//
-void DrawSoundMenu(void)
-{
- int i,on;
-
-
-#ifdef JAPAN
- CA_CacheScreen(S_SOUNDPIC);
-#else
- //
- // DRAW SOUND MENU
- //
- ClearMScreen();
- VWB_DrawPic(112,184,C_MOUSELBACKPIC);
-
- DrawWindow(SM_X-8,SM_Y1-3,SM_W,SM_H1,BKGDCOLOR);
- DrawWindow(SM_X-8,SM_Y2-3,SM_W,SM_H2,BKGDCOLOR);
- DrawWindow(SM_X-8,SM_Y3-3,SM_W,SM_H3,BKGDCOLOR);
-#endif
-
- //
- // IF NO ADLIB, NON-CHOOSENESS!
- //
- if (!AdLibPresent && !SoundBlasterPresent)
- {
- SndMenu[2].active=SndMenu[10].active=SndMenu[11].active=0;
- }
-
- if (!SoundSourcePresent)
- SndMenu[6].active=0;
-
- if (!SoundBlasterPresent)
- SndMenu[7].active=0;
-
- if (!SoundSourcePresent && !SoundBlasterPresent)
- SndMenu[5].active=0;
-
- DrawMenu(&SndItems,&SndMenu[0]);
-#ifndef JAPAN
- VWB_DrawPic(100,SM_Y1-20,C_FXTITLEPIC);
- VWB_DrawPic(100,SM_Y2-20,C_DIGITITLEPIC);
- VWB_DrawPic(100,SM_Y3-20,C_MUSICTITLEPIC);
-#endif
-
- for (i=0;i<SndItems.amount;i++)
-#ifdef JAPAN
- if (i!=3 && i!=4 && i!=8 && i!=9)
-#else
- if (SndMenu[i].string[0])
-#endif
- {
- //
- // DRAW SELECTED/NOT SELECTED GRAPHIC BUTTONS
- //
- on=0;
- switch(i)
- {
- //
- // SOUND EFFECTS
- //
- case 0: if (SoundMode==sdm_Off) on=1; break;
- case 1: if (SoundMode==sdm_PC) on=1; break;
- case 2: if (SoundMode==sdm_AdLib) on=1; break;
-
- //
- // DIGITIZED SOUND
- //
- case 5: if (DigiMode==sds_Off) on=1; break;
- case 6: if (DigiMode==sds_SoundSource) on=1; break;
- case 7: if (DigiMode==sds_SoundBlaster) on=1; break;
-
- //
- // MUSIC
- //
- case 10: if (MusicMode==smm_Off) on=1; break;
- case 11: if (MusicMode==smm_AdLib) on=1; break;
- }
-
- if (on)
- VWB_DrawPic(SM_X+24,SM_Y1+i*13+2,C_SELECTEDPIC);
- else
- VWB_DrawPic(SM_X+24,SM_Y1+i*13+2,C_NOTSELECTEDPIC);
- }
-
- DrawMenuGun(&SndItems);
- VW_UpdateScreen();
-}
-
-
-//
-// DRAW LOAD/SAVE IN PROGRESS
-//
-void DrawLSAction(int which)
-{
- #define LSA_X 96
- #define LSA_Y 80
- #define LSA_W 130
- #define LSA_H 42
-
- DrawWindow(LSA_X,LSA_Y,LSA_W,LSA_H,TEXTCOLOR);
- DrawOutline(LSA_X,LSA_Y,LSA_W,LSA_H,0,HIGHLIGHT);
- VWB_DrawPic(LSA_X+8,LSA_Y+5,C_DISKLOADING1PIC);
-
- fontnumber=1;
- SETFONTCOLOR(0,TEXTCOLOR);
- PrintX=LSA_X+46;
- PrintY=LSA_Y+13;
-
- if (!which)
- US_Print(STR_LOADING"...");
- else
- US_Print(STR_SAVING"...");
-
- VW_UpdateScreen();
-}
-
-
-////////////////////////////////////////////////////////////////////
-//
-// LOAD SAVED GAMES
-//
-////////////////////////////////////////////////////////////////////
-int CP_LoadGame(int quick)
-{
- int handle,which,exit=0;
- char name[13];
-
-
- strcpy(name,SaveName);
-
- //
- // QUICKLOAD?
- //
- if (quick)
- {
- which=LSItems.curpos;
-
- if (SaveGamesAvail[which])
- {
- name[7]=which+'0';
- handle=open(name,O_BINARY);
- lseek(handle,32,SEEK_SET);
- loadedgame=true;
- LoadTheGame(handle,0,0);
- loadedgame=false;
- close(handle);
-
- DrawFace ();
- DrawHealth ();
- DrawLives ();
- DrawLevel ();
- DrawAmmo ();
- DrawKeys ();
- DrawWeapon ();
- DrawScore ();
- return 1;
- }
- }
-
-
-#ifdef SPEAR
- UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
- CacheLump (LOADSAVE_LUMP_START,LOADSAVE_LUMP_END);
-#endif
-
- DrawLoadSaveScreen(0);
-
- do
- {
- which=HandleMenu(&LSItems,&LSMenu[0],TrackWhichGame);
- if (which>=0 && SaveGamesAvail[which])
- {
- ShootSnd();
- name[7]=which+'0';
-
- handle=open(name,O_BINARY);
- lseek(handle,32,SEEK_SET);
-
- DrawLSAction(0);
- loadedgame=true;
-
- LoadTheGame(handle,LSA_X+8,LSA_Y+5);
- close(handle);
-
- StartGame=1;
- ShootSnd();
- //
- // CHANGE "READ THIS!" TO NORMAL COLOR
- //
-
- #ifndef SPEAR
- #ifndef GOODTIMES
- MainMenu[readthis].active=1;
- #endif
- #endif
-
- exit=1;
- break;
- }
-
- } while(which>=0);
-
- MenuFadeOut();
-
-#ifdef SPEAR
- UnCacheLump (LOADSAVE_LUMP_START,LOADSAVE_LUMP_END);
- CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
-#endif
-
- return exit;
-}
-
-
-///////////////////////////////////
-//
-// HIGHLIGHT CURRENT SELECTED ENTRY
-//
-void TrackWhichGame(int w)
-{
- static int lastgameon=0;
-
- PrintLSEntry(lastgameon,TEXTCOLOR);
- PrintLSEntry(w,HIGHLIGHT);
-
- lastgameon=w;
-}
-
-
-////////////////////////////
-//
-// DRAW THE LOAD/SAVE SCREEN
-//
-void DrawLoadSaveScreen(int loadsave)
-{
- #define DISKX 100
- #define DISKY 0
-
- int i;
-
-
- ClearMScreen();
- fontnumber=1;
- VWB_DrawPic(112,184,C_MOUSELBACKPIC);
- DrawWindow(LSM_X-10,LSM_Y-5,LSM_W,LSM_H,BKGDCOLOR);
- DrawStripes(10);
-
- if (!loadsave)
- VWB_DrawPic(60,0,C_LOADGAMEPIC);
- else
- VWB_DrawPic(60,0,C_SAVEGAMEPIC);
-
- for (i=0;i<10;i++)
- PrintLSEntry(i,TEXTCOLOR);
-
- DrawMenu(&LSItems,&LSMenu[0]);
- VW_UpdateScreen();
- MenuFadeIn();
- WaitKeyUp();
-}
-
-
-///////////////////////////////////////////
-//
-// PRINT LOAD/SAVE GAME ENTRY W/BOX OUTLINE
-//
-void PrintLSEntry(int w,int color)
-{
- SETFONTCOLOR(color,BKGDCOLOR);
- DrawOutline(LSM_X+LSItems.indent,LSM_Y+w*13,LSM_W-LSItems.indent-15,11,color,color);
- PrintX=LSM_X+LSItems.indent+2;
- PrintY=LSM_Y+w*13+1;
- fontnumber=0;
-
- if (SaveGamesAvail[w])
- US_Print(SaveGameNames[w]);
- else
- US_Print(" - "STR_EMPTY" -");
-
- fontnumber=1;
-}
-
-
-////////////////////////////////////////////////////////////////////
-//
-// SAVE CURRENT GAME
-//
-////////////////////////////////////////////////////////////////////
-int CP_SaveGame(int quick)
-{
- int handle,which,exit=0;
- unsigned nwritten;
- char name[13],input[32];
-
-
- strcpy(name,SaveName);
-
- //
- // QUICKSAVE?
- //
- if (quick)
- {
- which=LSItems.curpos;
-
- if (SaveGamesAvail[which])
- {
- name[7]=which+'0';
- unlink(name);
- handle=creat(name,S_IREAD|S_IWRITE);
-
- strcpy(input,&SaveGameNames[which][0]);
-
- _dos_write(handle,(void far *)input,32,&nwritten);
- lseek(handle,32,SEEK_SET);
- SaveTheGame(handle,0,0);
- close(handle);
-
- return 1;
- }
- }
-
-
-#ifdef SPEAR
- UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
- CacheLump (LOADSAVE_LUMP_START,LOADSAVE_LUMP_END);
-#endif
-
- DrawLoadSaveScreen(1);
-
- do
- {
- which=HandleMenu(&LSItems,&LSMenu[0],TrackWhichGame);
- if (which>=0)
- {
- //
- // OVERWRITE EXISTING SAVEGAME?
- //
- if (SaveGamesAvail[which])
- #ifdef JAPAN
- if (!GetYorN(7,8,C_JAPSAVEOVERPIC))
- #else
- if (!Confirm(GAMESVD))
- #endif
- {
- DrawLoadSaveScreen(1);
- continue;
- }
- else
- {
- DrawLoadSaveScreen(1);
- PrintLSEntry(which,HIGHLIGHT);
- VW_UpdateScreen();
- }
-
- ShootSnd();
-
- strcpy(input,&SaveGameNames[which][0]);
- name[7]=which+'0';
-
- fontnumber=0;
- if (!SaveGamesAvail[which])
- VWB_Bar(LSM_X+LSItems.indent+1,LSM_Y+which*13+1,LSM_W-LSItems.indent-16,10,BKGDCOLOR);
- VW_UpdateScreen();
-
- if (US_LineInput(LSM_X+LSItems.indent+2,LSM_Y+which*13+1,input,input,true,31,LSM_W-LSItems.indent-30))
- {
- SaveGamesAvail[which]=1;
- strcpy(&SaveGameNames[which][0],input);
-
- unlink(name);
- handle=creat(name,S_IREAD|S_IWRITE);
- _dos_write(handle,(void far *)input,32,&nwritten);
- lseek(handle,32,SEEK_SET);
-
- DrawLSAction(1);
- SaveTheGame(handle,LSA_X+8,LSA_Y+5);
-
- close(handle);
-
- ShootSnd();
- exit=1;
- }
- else
- {
- VWB_Bar(LSM_X+LSItems.indent+1,LSM_Y+which*13+1,LSM_W-LSItems.indent-16,10,BKGDCOLOR);
- PrintLSEntry(which,HIGHLIGHT);
- VW_UpdateScreen();
- SD_PlaySound(ESCPRESSEDSND);
- continue;
- }
-
- fontnumber=1;
- break;
- }
-
- } while(which>=0);
-
- MenuFadeOut();
-
-#ifdef SPEAR
- UnCacheLump (LOADSAVE_LUMP_START,LOADSAVE_LUMP_END);
- CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
-#endif
-
- return exit;
-}
-
-
-////////////////////////////////////////////////////////////////////
-//
-// CALIBRATE JOYSTICK
-//
-////////////////////////////////////////////////////////////////////
-int CalibrateJoystick(void)
-{
- #define CALX 85
- #define CALY 40
- #define CALW 158
- #define CALH 140
-
- unsigned xmin,ymin,xmax,ymax,jb;
-
-
-
- #ifdef JAPAN
- VWB_DrawPic(CALX,CALY,C_JOY0PIC);
- #else
- DrawWindow(CALX-5,CALY-5,CALW,CALH,TEXTCOLOR);
- DrawOutline(CALX-5,CALY-5,CALW,CALH,0,HIGHLIGHT);
- SETFONTCOLOR(0,TEXTCOLOR);
-
- WindowX = PrintX = CALX;
- WindowW = CALW;
- WindowH = CALH;
- WindowY = PrintY = CALY;
- US_Print(" "STR_CALIB"\n "STR_JOYST"\n");
- VWB_DrawPic(CALX+40,CALY+30,C_JOY1PIC);
- PrintY = CALY+80;
- US_Print(STR_MOVEJOY);
- SETFONTCOLOR(BKGDCOLOR,TEXTCOLOR);
- US_Print(" "STR_ESCEXIT);
- #endif
- VW_UpdateScreen();
-
- do
- {
- jb=IN_JoyButtons();
- if (Keyboard[sc_Escape])
- return 0;
- #ifndef SPEAR
- if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))
- PicturePause();
- #endif
-
- } while(!(jb&1));
-
- SD_PlaySound(SHOOTSND);
- IN_GetJoyAbs(joystickport,&xmin,&ymin);
-
-
- #ifdef JAPAN
- VWB_DrawPic(CALX,CALY,C_JOY1PIC);
- #else
- DrawWindow(CALX-5,CALY-5,CALW,CALH,TEXTCOLOR);
- DrawOutline(CALX-5,CALY-5,CALW,CALH,0,HIGHLIGHT);
- SETFONTCOLOR(0,TEXTCOLOR);
-
- PrintX = CALX;
- PrintY = CALY;
- US_Print(" "STR_CALIB"\n "STR_JOYST"\n");
- VWB_DrawPic(CALX+40,CALY+30,C_JOY2PIC);
- PrintY = CALY+80;
- US_Print(STR_MOVEJOY2);
- SETFONTCOLOR(BKGDCOLOR,TEXTCOLOR);
- US_Print(" "STR_ESCEXIT);
- #endif
- VW_UpdateScreen();
-
- do
- {
- jb=IN_JoyButtons();
- if (Keyboard[sc_Escape])
- return 0;
- #ifndef SPEAR
- if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))
- PicturePause();
- #endif
- } while(!(jb&2));
-
- IN_GetJoyAbs(joystickport,&xmax,&ymax);
- SD_PlaySound(SHOOTSND);
-
- while (IN_JoyButtons());
-
- //
- // ASSIGN ACTUAL VALUES HERE
- //
- if ((xmin != xmax) && (ymin != ymax))
- IN_SetupJoy(joystickport,xmin,xmax,ymin,ymax);
- else
- return 0;
-
- return 1;
-}
-
-
-////////////////////////////////////////////////////////////////////
-//
-// DEFINE CONTROLS
-//
-////////////////////////////////////////////////////////////////////
-void CP_Control(void)
-{
- #define CTL_SPC 70
- enum {MOUSEENABLE,JOYENABLE,USEPORT2,PADENABLE,MOUSESENS,CUSTOMIZE};
- int i,which;
-
-
-#ifdef SPEAR
- UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
- CacheLump (CONTROL_LUMP_START,CONTROL_LUMP_END);
-#endif
-
- DrawCtlScreen();
- MenuFadeIn();
- WaitKeyUp();
-
- do
- {
- which=HandleMenu(&CtlItems,&CtlMenu[0],NULL);
- switch(which)
- {
- case MOUSEENABLE:
- mouseenabled^=1;
- _CX=_DX=CENTER;
- Mouse(4);
- DrawCtlScreen();
- CusItems.curpos=-1;
- ShootSnd();
- break;
-
- case JOYENABLE:
- joystickenabled^=1;
- if (joystickenabled)
- if (!CalibrateJoystick())
- joystickenabled = 0;
- DrawCtlScreen();
- CusItems.curpos=-1;
- ShootSnd();
- break;
-
- case USEPORT2:
- joystickport^=1;
- DrawCtlScreen();
- ShootSnd();
- break;
-
- case PADENABLE:
- joypadenabled^=1;
- DrawCtlScreen();
- ShootSnd();
- break;
-
- case MOUSESENS:
- case CUSTOMIZE:
- DrawCtlScreen();
- MenuFadeIn();
- WaitKeyUp();
- break;
- }
- } while(which>=0);
-
- MenuFadeOut();
-
-#ifdef SPEAR
- UnCacheLump (CONTROL_LUMP_START,CONTROL_LUMP_END);
- CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
-#endif
-}
-
-
-////////////////////////////////
-//
-// DRAW MOUSE SENSITIVITY SCREEN
-//
-void DrawMouseSens(void)
-{
-#ifdef JAPAN
- CA_CacheScreen(S_MOUSESENSPIC);
-#else
- ClearMScreen();
- VWB_DrawPic(112,184,C_MOUSELBACKPIC);
- #ifdef SPANISH
- DrawWindow(10,80,300,43,BKGDCOLOR);
- #else
- DrawWindow(10,80,300,30,BKGDCOLOR);
- #endif
-
- WindowX=0;
- WindowW=320;
- PrintY=82;
- SETFONTCOLOR(READCOLOR,BKGDCOLOR);
- US_CPrint(STR_MOUSEADJ);
-
- SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
- #ifdef SPANISH
- PrintX=14;
- PrintY=95+13;
- US_Print(STR_SLOW);
- PrintX=252;
- US_Print(STR_FAST);
- #else
- PrintX=14;
- PrintY=95;
- US_Print(STR_SLOW);
- PrintX=269;
- US_Print(STR_FAST);
- #endif
-#endif
-
- VWB_Bar(60,97,200,10,TEXTCOLOR);
- DrawOutline(60,97,200,10,0,HIGHLIGHT);
- DrawOutline(60+20*mouseadjustment,97,20,10,0,READCOLOR);
- VWB_Bar(61+20*mouseadjustment,98,19,9,READHCOLOR);
-
- VW_UpdateScreen();
- MenuFadeIn();
-}
-
-
-///////////////////////////
-//
-// ADJUST MOUSE SENSITIVITY
-//
-void MouseSensitivity(void)
-{
- ControlInfo ci;
- int exit=0,oldMA;
-
-
- oldMA=mouseadjustment;
- DrawMouseSens();
- do
- {
- ReadAnyControl(&ci);
- switch(ci.dir)
- {
- case dir_North:
- case dir_West:
- if (mouseadjustment)
- {
- mouseadjustment--;
- VWB_Bar(60,97,200,10,TEXTCOLOR);
- DrawOutline(60,97,200,10,0,HIGHLIGHT);
- DrawOutline(60+20*mouseadjustment,97,20,10,0,READCOLOR);
- VWB_Bar(61+20*mouseadjustment,98,19,9,READHCOLOR);
- VW_UpdateScreen();
- SD_PlaySound(MOVEGUN1SND);
- while(Keyboard[sc_LeftArrow]);
- WaitKeyUp();
- }
- break;
-
- case dir_South:
- case dir_East:
- if (mouseadjustment<9)
- {
- mouseadjustment++;
- VWB_Bar(60,97,200,10,TEXTCOLOR);
- DrawOutline(60,97,200,10,0,HIGHLIGHT);
- DrawOutline(60+20*mouseadjustment,97,20,10,0,READCOLOR);
- VWB_Bar(61+20*mouseadjustment,98,19,9,READHCOLOR);
- VW_UpdateScreen();
- SD_PlaySound(MOVEGUN1SND);
- while(Keyboard[sc_RightArrow]);
- WaitKeyUp();
- }
- break;
- }
-
- #ifndef SPEAR
- if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))
- #else
- if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("debugmode"))
- #endif
- PicturePause();
-
- if (ci.button0 || Keyboard[sc_Space] || Keyboard[sc_Enter])
- exit=1;
- else
- if (ci.button1 || Keyboard[sc_Escape])
- exit=2;
-
- } while(!exit);
-
- if (exit==2)
- {
- mouseadjustment=oldMA;
- SD_PlaySound(ESCPRESSEDSND);
- }
- else
- SD_PlaySound(SHOOTSND);
-
- WaitKeyUp();
- MenuFadeOut();
-}
-
-
-///////////////////////////
-//
-// DRAW CONTROL MENU SCREEN
-//
-void DrawCtlScreen(void)
-{
- int i,x,y;
-
-
-#ifdef JAPAN
- CA_CacheScreen(S_CONTROLPIC);
-#else
- ClearMScreen();
- DrawStripes(10);
- VWB_DrawPic(80,0,C_CONTROLPIC);
- VWB_DrawPic(112,184,C_MOUSELBACKPIC);
- DrawWindow(CTL_X-8,CTL_Y-5,CTL_W,CTL_H,BKGDCOLOR);
-#endif
- WindowX=0;
- WindowW=320;
- SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
-
- if (JoysPresent[0])
- CtlMenu[1].active=
- CtlMenu[2].active=
- CtlMenu[3].active=1;
-
- CtlMenu[2].active=CtlMenu[3].active=joystickenabled;
-
- if (MousePresent)
- {
- CtlMenu[4].active=
- CtlMenu[0].active=1;
- }
-
- CtlMenu[4].active=mouseenabled;
-
-
- DrawMenu(&CtlItems,&CtlMenu[0]);
-
-
- x=CTL_X+CtlItems.indent-24;
- y=CTL_Y+3;
- if (mouseenabled)
- VWB_DrawPic(x,y,C_SELECTEDPIC);
- else
- VWB_DrawPic(x,y,C_NOTSELECTEDPIC);
-
- y=CTL_Y+16;
- if (joystickenabled)
- VWB_DrawPic(x,y,C_SELECTEDPIC);
- else
- VWB_DrawPic(x,y,C_NOTSELECTEDPIC);
-
- y=CTL_Y+29;
- if (joystickport)
- VWB_DrawPic(x,y,C_SELECTEDPIC);
- else
- VWB_DrawPic(x,y,C_NOTSELECTEDPIC);
-
- y=CTL_Y+42;
- if (joypadenabled)
- VWB_DrawPic(x,y,C_SELECTEDPIC);
- else
- VWB_DrawPic(x,y,C_NOTSELECTEDPIC);
-
- //
- // PICK FIRST AVAILABLE SPOT
- //
- if (CtlItems.curpos<0 || !CtlMenu[CtlItems.curpos].active)
- for (i=0;i<6;i++)
- if (CtlMenu[i].active)
- {
- CtlItems.curpos=i;
- break;
- }
-
- DrawMenuGun(&CtlItems);
- VW_UpdateScreen();
-}
-
-
-////////////////////////////////////////////////////////////////////
-//
-// CUSTOMIZE CONTROLS
-//
-////////////////////////////////////////////////////////////////////
-enum {FIRE,STRAFE,RUN,OPEN};
-char mbarray[4][3]={"b0","b1","b2","b3"},
- order[4]={RUN,OPEN,FIRE,STRAFE};
-
-
-void CustomControls(void)
-{
- int which;
-
-
- DrawCustomScreen();
- do
- {
- which=HandleMenu(&CusItems,&CusMenu[0],FixupCustom);
- switch(which)
- {
- case 0:
- DefineMouseBtns();
- DrawCustMouse(1);
- break;
- case 3:
- DefineJoyBtns();
- DrawCustJoy(0);
- break;
- case 6:
- DefineKeyBtns();
- DrawCustKeybd(0);
- break;
- case 8:
- DefineKeyMove();
- DrawCustKeys(0);
- }
- } while(which>=0);
-
-
-
- MenuFadeOut();
-}
-
-
-////////////////////////
-//
-// DEFINE THE MOUSE BUTTONS
-//
-void DefineMouseBtns(void)
-{
- CustomCtrls mouseallowed={0,1,1,1};
- EnterCtrlData(2,&mouseallowed,DrawCustMouse,PrintCustMouse,MOUSE);
-}
-
-
-////////////////////////
-//
-// DEFINE THE JOYSTICK BUTTONS
-//
-void DefineJoyBtns(void)
-{
- CustomCtrls joyallowed={1,1,1,1};
- EnterCtrlData(5,&joyallowed,DrawCustJoy,PrintCustJoy,JOYSTICK);
-}
-
-
-////////////////////////
-//
-// DEFINE THE KEYBOARD BUTTONS
-//
-void DefineKeyBtns(void)
-{
- CustomCtrls keyallowed={1,1,1,1};
- EnterCtrlData(8,&keyallowed,DrawCustKeybd,PrintCustKeybd,KEYBOARDBTNS);
-}
-
-
-////////////////////////
-//
-// DEFINE THE KEYBOARD BUTTONS
-//
-void DefineKeyMove(void)
-{
- CustomCtrls keyallowed={1,1,1,1};
- EnterCtrlData(10,&keyallowed,DrawCustKeys,PrintCustKeys,KEYBOARDMOVE);
-}
-
-
-////////////////////////
-//
-// ENTER CONTROL DATA FOR ANY TYPE OF CONTROL
-//
-enum {FWRD,RIGHT,BKWD,LEFT};
-int moveorder[4]={LEFT,RIGHT,FWRD,BKWD};
-
-void EnterCtrlData(int index,CustomCtrls *cust,void (*DrawRtn)(int),void (*PrintRtn)(int),int type)
-{
- int j,exit,tick,redraw,which,x,picked;
- ControlInfo ci;
-
-
- ShootSnd();
- PrintY=CST_Y+13*index;
- IN_ClearKeysDown();
- exit=0;
- redraw=1;
- //
- // FIND FIRST SPOT IN ALLOWED ARRAY
- //
- for (j=0;j<4;j++)
- if (cust->allowed[j])
- {
- which=j;
- break;
- }
-
- do
- {
- if (redraw)
- {
- x=CST_START+CST_SPC*which;
- DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);
-
- DrawRtn(1);
- DrawWindow(x-2,PrintY,CST_SPC,11,TEXTCOLOR);
- DrawOutline(x-2,PrintY,CST_SPC,11,0,HIGHLIGHT);
- SETFONTCOLOR(0,TEXTCOLOR);
- PrintRtn(which);
- PrintX=x;
- SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
- VW_UpdateScreen();
- WaitKeyUp();
- redraw=0;
- }
-
- ReadAnyControl(&ci);
-
- if (type==MOUSE || type==JOYSTICK)
- if (IN_KeyDown(sc_Enter)||IN_KeyDown(sc_Control)||IN_KeyDown(sc_Alt))
- {
- IN_ClearKeysDown();
- ci.button0=ci.button1=false;
- }
-
- //
- // CHANGE BUTTON VALUE?
- //
- if ((ci.button0|ci.button1|ci.button2|ci.button3)||
- ((type==KEYBOARDBTNS||type==KEYBOARDMOVE) && LastScan==sc_Enter))
- {
- tick=TimeCount=picked=0;
- SETFONTCOLOR(0,TEXTCOLOR);
-
- do
- {
- int button,result=0;
-
-
- if (type==KEYBOARDBTNS||type==KEYBOARDMOVE)
- IN_ClearKeysDown();
-
- //
- // FLASH CURSOR
- //
- if (TimeCount>10)
- {
- switch(tick)
- {
- case 0:
- VWB_Bar(x,PrintY+1,CST_SPC-2,10,TEXTCOLOR);
- break;
- case 1:
- PrintX=x;
- US_Print("?");
- SD_PlaySound(HITWALLSND);
- }
- tick^=1;
- TimeCount=0;
- VW_UpdateScreen();
- }
-
- //
- // WHICH TYPE OF INPUT DO WE PROCESS?
- //
- switch(type)
- {
- case MOUSE:
- Mouse(3);
- button=_BX;
- switch(button)
- {
- case 1: result=1; break;
- case 2: result=2; break;
- case 4: result=3; break;
- }
-
- if (result)
- {
- int z;
-
-
- for (z=0;z<4;z++)
- if (order[which]==buttonmouse[z])
- {
- buttonmouse[z]=bt_nobutton;
- break;
- }
-
- buttonmouse[result-1]=order[which];
- picked=1;
- SD_PlaySound(SHOOTDOORSND);
- }
- break;
-
- case JOYSTICK:
- if (ci.button0) result=1;
- else
- if (ci.button1) result=2;
- else
- if (ci.button2) result=3;
- else
- if (ci.button3) result=4;
-
- if (result)
- {
- int z;
-
-
- for (z=0;z<4;z++)
- if (order[which]==buttonjoy[z])
- {
- buttonjoy[z]=bt_nobutton;
- break;
- }
-
- buttonjoy[result-1]=order[which];
- picked=1;
- SD_PlaySound(SHOOTDOORSND);
- }
- break;
-
- case KEYBOARDBTNS:
- if (LastScan)
- {
- buttonscan[order[which]]=LastScan;
- picked=1;
- ShootSnd();
- IN_ClearKeysDown();
- }
- break;
-
- case KEYBOARDMOVE:
- if (LastScan)
- {
- dirscan[moveorder[which]]=LastScan;
- picked=1;
- ShootSnd();
- IN_ClearKeysDown();
- }
- break;
- }
-
- //
- // EXIT INPUT?
- //
- if (IN_KeyDown(sc_Escape))
- {
- picked=1;
- continue;
- }
-
- } while(!picked);
-
- SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
- redraw=1;
- WaitKeyUp();
- continue;
- }
-
- if (ci.button1 || IN_KeyDown(sc_Escape))
- exit=1;
-
- //
- // MOVE TO ANOTHER SPOT?
- //
- switch(ci.dir)
- {
- case dir_West:
- do
- {
- which--;
- if (which<0)
- which=3;
- } while(!cust->allowed[which]);
- redraw=1;
- SD_PlaySound(MOVEGUN1SND);
- while(ReadAnyControl(&ci),ci.dir!=dir_None);
- IN_ClearKeysDown();
- break;
-
- case dir_East:
- do
- {
- which++;
- if (which>3)
- which=0;
- } while(!cust->allowed[which]);
- redraw=1;
- SD_PlaySound(MOVEGUN1SND);
- while(ReadAnyControl(&ci),ci.dir!=dir_None);
- IN_ClearKeysDown();
- break;
- case dir_North:
- case dir_South:
- exit=1;
- }
- } while(!exit);
-
- SD_PlaySound(ESCPRESSEDSND);
- WaitKeyUp();
- DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);
-}
-
-
-////////////////////////
-//
-// FIXUP GUN CURSOR OVERDRAW SHIT
-//
-void FixupCustom(int w)
-{
- static int lastwhich=-1;
- int y=CST_Y+26+w*13;
-
-
- VWB_Hlin(7,32,y-1,DEACTIVE);
- VWB_Hlin(7,32,y+12,BORD2COLOR);
-#ifndef SPEAR
- VWB_Hlin(7,32,y-2,BORDCOLOR);
- VWB_Hlin(7,32,y+13,BORDCOLOR);
-#else
- VWB_Hlin(7,32,y-2,BORD2COLOR);
- VWB_Hlin(7,32,y+13,BORD2COLOR);
-#endif
-
- switch(w)
- {
- case 0: DrawCustMouse(1); break;
- case 3: DrawCustJoy(1); break;
- case 6: DrawCustKeybd(1); break;
- case 8: DrawCustKeys(1);
- }
-
-
- if (lastwhich>=0)
- {
- y=CST_Y+26+lastwhich*13;
- VWB_Hlin(7,32,y-1,DEACTIVE);
- VWB_Hlin(7,32,y+12,BORD2COLOR);
-#ifndef SPEAR
- VWB_Hlin(7,32,y-2,BORDCOLOR);
- VWB_Hlin(7,32,y+13,BORDCOLOR);
-#else
- VWB_Hlin(7,32,y-2,BORD2COLOR);
- VWB_Hlin(7,32,y+13,BORD2COLOR);
-#endif
-
- if (lastwhich!=w)
- switch(lastwhich)
- {
- case 0: DrawCustMouse(0); break;
- case 3: DrawCustJoy(0); break;
- case 6: DrawCustKeybd(0); break;
- case 8: DrawCustKeys(0);
- }
- }
-
- lastwhich=w;
-}
-
-
-////////////////////////
-//
-// DRAW CUSTOMIZE SCREEN
-//
-void DrawCustomScreen(void)
-{
- int i;
-
-
-#ifdef JAPAN
- CA_CacheScreen(S_CUSTOMPIC);
- fontnumber=1;
-
- PrintX=CST_START;
- PrintY = CST_Y+26;
- DrawCustMouse(0);
-
- PrintX=CST_START;
- US_Print("\n\n\n");
- DrawCustJoy(0);
-
- PrintX=CST_START;
- US_Print("\n\n\n");
- DrawCustKeybd(0);
-
- PrintX=CST_START;
- US_Print("\n\n\n");
- DrawCustKeys(0);
-#else
- ClearMScreen();
- WindowX=0;
- WindowW=320;
- VWB_DrawPic(112,184,C_MOUSELBACKPIC);
- DrawStripes(10);
- VWB_DrawPic(80,0,C_CUSTOMIZEPIC);
-
- //
- // MOUSE
- //
- SETFONTCOLOR(READCOLOR,BKGDCOLOR);
- WindowX=0;
- WindowW=320;
-
-#ifndef SPEAR
- PrintY=CST_Y;
- US_CPrint("Mouse\n");
-#else
- PrintY = CST_Y+13;
- VWB_DrawPic (128,48,C_MOUSEPIC);
-#endif
-
- SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
- #ifdef SPANISH
- PrintX=CST_START-16;
- US_Print(STR_CRUN);
- PrintX=CST_START-16+CST_SPC*1;
- US_Print(STR_COPEN);
- PrintX=CST_START-16+CST_SPC*2;
- US_Print(STR_CFIRE);
- PrintX=CST_START-16+CST_SPC*3;
- US_Print(STR_CSTRAFE"\n");
- #else
- PrintX=CST_START;
- US_Print(STR_CRUN);
- PrintX=CST_START+CST_SPC*1;
- US_Print(STR_COPEN);
- PrintX=CST_START+CST_SPC*2;
- US_Print(STR_CFIRE);
- PrintX=CST_START+CST_SPC*3;
- US_Print(STR_CSTRAFE"\n");
- #endif
-
- DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);
- DrawCustMouse(0);
- US_Print("\n");
-
-
- //
- // JOYSTICK/PAD
- //
-#ifndef SPEAR
- SETFONTCOLOR(READCOLOR,BKGDCOLOR);
- US_CPrint("Joystick/Gravis GamePad\n");
-#else
- PrintY += 13;
- VWB_DrawPic (40,88,C_JOYSTICKPIC);
-#endif
-
-#ifdef SPEAR
- VWB_DrawPic (112,120,C_KEYBOARDPIC);
-#endif
-
- SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
- #ifdef SPANISH
- PrintX=CST_START-16;
- US_Print(STR_CRUN);
- PrintX=CST_START-16+CST_SPC*1;
- US_Print(STR_COPEN);
- PrintX=CST_START-16+CST_SPC*2;
- US_Print(STR_CFIRE);
- PrintX=CST_START-16+CST_SPC*3;
- US_Print(STR_CSTRAFE"\n");
- #else
- PrintX=CST_START;
- US_Print(STR_CRUN);
- PrintX=CST_START+CST_SPC*1;
- US_Print(STR_COPEN);
- PrintX=CST_START+CST_SPC*2;
- US_Print(STR_CFIRE);
- PrintX=CST_START+CST_SPC*3;
- US_Print(STR_CSTRAFE"\n");
- #endif
- DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);
- DrawCustJoy(0);
- US_Print("\n");
-
-
- //
- // KEYBOARD
- //
-#ifndef SPEAR
- SETFONTCOLOR(READCOLOR,BKGDCOLOR);
- US_CPrint("Keyboard\n");
-#else
- PrintY += 13;
-#endif
- SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
- #ifdef SPANISH
- PrintX=CST_START-16;
- US_Print(STR_CRUN);
- PrintX=CST_START-16+CST_SPC*1;
- US_Print(STR_COPEN);
- PrintX=CST_START-16+CST_SPC*2;
- US_Print(STR_CFIRE);
- PrintX=CST_START-16+CST_SPC*3;
- US_Print(STR_CSTRAFE"\n");
- #else
- PrintX=CST_START;
- US_Print(STR_CRUN);
- PrintX=CST_START+CST_SPC*1;
- US_Print(STR_COPEN);
- PrintX=CST_START+CST_SPC*2;
- US_Print(STR_CFIRE);
- PrintX=CST_START+CST_SPC*3;
- US_Print(STR_CSTRAFE"\n");
- #endif
- DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);
- DrawCustKeybd(0);
- US_Print("\n");
-
-
- //
- // KEYBOARD MOVE KEYS
- //
- SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
- #ifdef SPANISH
- PrintX=4;
- US_Print(STR_LEFT);
- US_Print("/");
- US_Print(STR_RIGHT);
- US_Print("/");
- US_Print(STR_FRWD);
- US_Print("/");
- US_Print(STR_BKWD"\n");
- #else
- PrintX=CST_START;
- US_Print(STR_LEFT);
- PrintX=CST_START+CST_SPC*1;
- US_Print(STR_RIGHT);
- PrintX=CST_START+CST_SPC*2;
- US_Print(STR_FRWD);
- PrintX=CST_START+CST_SPC*3;
- US_Print(STR_BKWD"\n");
- #endif
- DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);
- DrawCustKeys(0);
-#endif
- //
- // PICK STARTING POINT IN MENU
- //
- if (CusItems.curpos<0)
- for (i=0;i<CusItems.amount;i++)
- if (CusMenu[i].active)
- {
- CusItems.curpos=i;
- break;
- }
-
-
- VW_UpdateScreen();
- MenuFadeIn();
-}
-
-
-void PrintCustMouse(int i)
-{
- int j;
-
- for (j=0;j<4;j++)
- if (order[i]==buttonmouse[j])
- {
- PrintX=CST_START+CST_SPC*i;
- US_Print(mbarray[j]);
- break;
- }
-}
-
-void DrawCustMouse(int hilight)
-{
- int i,color;
-
-
- color=TEXTCOLOR;
- if (hilight)
- color=HIGHLIGHT;
- SETFONTCOLOR(color,BKGDCOLOR);
-
- if (!mouseenabled)
- {
- SETFONTCOLOR(DEACTIVE,BKGDCOLOR);
- CusMenu[0].active=0;
- }
- else
- CusMenu[0].active=1;
-
- PrintY=CST_Y+13*2;
- for (i=0;i<4;i++)
- PrintCustMouse(i);
-}
-
-void PrintCustJoy(int i)
-{
- int j;
-
- for (j=0;j<4;j++)
- if (order[i]==buttonjoy[j])
- {
- PrintX=CST_START+CST_SPC*i;
- US_Print(mbarray[j]);
- break;
- }
-}
-
-void DrawCustJoy(int hilight)
-{
- int i,color;
-
-
- color=TEXTCOLOR;
- if (hilight)
- color=HIGHLIGHT;
- SETFONTCOLOR(color,BKGDCOLOR);
-
- if (!joystickenabled)
- {
- SETFONTCOLOR(DEACTIVE,BKGDCOLOR);
- CusMenu[3].active=0;
- }
- else
- CusMenu[3].active=1;
-
- PrintY=CST_Y+13*5;
- for (i=0;i<4;i++)
- PrintCustJoy(i);
-}
-
-
-void PrintCustKeybd(int i)
-{
- PrintX=CST_START+CST_SPC*i;
- US_Print(IN_GetScanName(buttonscan[order[i]]));
-}
-
-void DrawCustKeybd(int hilight)
-{
- int i,color;
-
-
- color=TEXTCOLOR;
- if (hilight)
- color=HIGHLIGHT;
- SETFONTCOLOR(color,BKGDCOLOR);
-
- PrintY=CST_Y+13*8;
- for (i=0;i<4;i++)
- PrintCustKeybd(i);
-}
-
-void PrintCustKeys(int i)
-{
- PrintX=CST_START+CST_SPC*i;
- US_Print(IN_GetScanName(dirscan[moveorder[i]]));
-}
-
-void DrawCustKeys(int hilight)
-{
- int i,color;
-
-
- color=TEXTCOLOR;
- if (hilight)
- color=HIGHLIGHT;
- SETFONTCOLOR(color,BKGDCOLOR);
-
- PrintY=CST_Y+13*10;
- for (i=0;i<4;i++)
- PrintCustKeys(i);
-}
-
-
-////////////////////////////////////////////////////////////////////
-//
-// CHANGE SCREEN VIEWING SIZE
-//
-////////////////////////////////////////////////////////////////////
-void CP_ChangeView(void)
-{
- int exit=0,oldview,newview;
- ControlInfo ci;
-
-
- WindowX=WindowY=0;
- WindowW=320;
- WindowH=200;
- newview=oldview=viewwidth/16;
- DrawChangeView(oldview);
-
- do
- {
- CheckPause();
- ReadAnyControl(&ci);
- switch(ci.dir)
- {
- case dir_South:
- case dir_West:
- newview--;
- if (newview<4)
- newview=4;
- ShowViewSize(newview);
- VW_UpdateScreen();
- SD_PlaySound(HITWALLSND);
- TicDelay(10);
- break;
-
- case dir_North:
- case dir_East:
- newview++;
- if (newview>19)
- newview=19;
- ShowViewSize(newview);
- VW_UpdateScreen();
- SD_PlaySound(HITWALLSND);
- TicDelay(10);
- break;
- }
-
- #ifndef SPEAR
- if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))
- #else
- if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("debugmode"))
- #endif
- PicturePause();
-
- if (ci.button0 || Keyboard[sc_Enter])
- exit=1;
- else
- if (ci.button1 || Keyboard[sc_Escape])
- {
- viewwidth=oldview*16;
- SD_PlaySound(ESCPRESSEDSND);
- MenuFadeOut();
- return;
- }
-
- } while(!exit);
-
-
- if (oldview!=newview)
- {
- SD_PlaySound (SHOOTSND);
- Message(STR_THINK"...");
- NewViewSize(newview);
- }
-
- ShootSnd();
- MenuFadeOut();
-}
-
-
-/////////////////////////////
-//
-// DRAW THE CHANGEVIEW SCREEN
-//
-void DrawChangeView(int view)
-{
-#ifdef JAPAN
- CA_CacheScreen(S_CHANGEPIC);
-
- ShowViewSize(view);
-#else
- VWB_Bar(0,160,320,40,VIEWCOLOR);
- ShowViewSize(view);
-
- PrintY=161;
- WindowX=0;
- WindowY=320;
- SETFONTCOLOR(HIGHLIGHT,BKGDCOLOR);
-
- US_CPrint(STR_SIZE1"\n");
- US_CPrint(STR_SIZE2"\n");
- US_CPrint(STR_SIZE3);
-#endif
- VW_UpdateScreen();
-
- MenuFadeIn();
-}
-
-
-////////////////////////////////////////////////////////////////////
-//
-// QUIT THIS INFERNAL GAME!
-//
-////////////////////////////////////////////////////////////////////
-void CP_Quit(void)
-{
- int i;
-
-
- #ifdef JAPAN
- if (GetYorN(7,11,C_QUITMSGPIC))
- #else
-
- #ifdef SPANISH
- if (Confirm(ENDGAMESTR))
- #else
- if (Confirm(endStrings[US_RndT()&0x7+(US_RndT()&1)]))
- #endif
-
- #endif
- {
- VW_UpdateScreen();
- SD_MusicOff();
- SD_StopSound();
- MenuFadeOut();
- //
- // SHUT-UP THE ADLIB
- //
- for (i=1;i<=0xf5;i++)
- alOut(i,0);
- Quit(NULL);
- }
-
- DrawMainMenu();
-}
-
-
-////////////////////////////////////////////////////////////////////
-//
-// HANDLE INTRO SCREEN (SYSTEM CONFIG)
-//
-////////////////////////////////////////////////////////////////////
-void IntroScreen(void)
-{
-#ifdef SPEAR
-
-#define MAINCOLOR 0x4f
-#define EMSCOLOR 0x4f
-#define XMSCOLOR 0x4f
-
-#else
-
-#define MAINCOLOR 0x6c
-#define EMSCOLOR 0x6c
-#define XMSCOLOR 0x6c
-
-#endif
-#define FILLCOLOR 14
-
- long memory,emshere,xmshere;
- int i,num,ems[10]={100,200,300,400,500,600,700,800,900,1000},
- xms[10]={100,200,300,400,500,600,700,800,900,1000},
- main[10]={32,64,96,128,160,192,224,256,288,320};
-
-
- //
- // DRAW MAIN MEMORY
- //
- memory=(1023l+mminfo.nearheap+mminfo.farheap)/1024l;
- for (i=0;i<10;i++)
- if (memory>=main[i])
- VWB_Bar(49,163-8*i,6,5,MAINCOLOR-i);
-
-
- //
- // DRAW EMS MEMORY
- //
- if (EMSPresent)
- {
- emshere=4l*EMSPagesAvail;
- for (i=0;i<10;i++)
- if (emshere>=ems[i])
- VWB_Bar(89,163-8*i,6,5,EMSCOLOR-i);
- }
-
- //
- // DRAW XMS MEMORY
- //
- if (XMSPresent)
- {
- xmshere=4l*XMSPagesAvail;
- for (i=0;i<10;i++)
- if (xmshere>=xms[i])
- VWB_Bar(129,163-8*i,6,5,XMSCOLOR-i);
- }
-
- //
- // FILL BOXES
- //
- if (MousePresent)
- VWB_Bar(164,82,12,2,FILLCOLOR);
-
- if (JoysPresent[0] || JoysPresent[1])
- VWB_Bar(164,105,12,2,FILLCOLOR);
-
- if (AdLibPresent && !SoundBlasterPresent)
- VWB_Bar(164,128,12,2,FILLCOLOR);
-
- if (SoundBlasterPresent)
- VWB_Bar(164,151,12,2,FILLCOLOR);
-
- if (SoundSourcePresent)
- VWB_Bar(164,174,12,2,FILLCOLOR);
-}
-
-
-////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////
-//
-// SUPPORT ROUTINES
-//
-////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////
-
-////////////////////////////////////////////////////////////////////
-//
-// Clear Menu screens to dark red
-//
-////////////////////////////////////////////////////////////////////
-void ClearMScreen(void)
-{
-#ifndef SPEAR
- VWB_Bar(0,0,320,200,BORDCOLOR);
-#else
- VWB_DrawPic(0,0,C_BACKDROPPIC);
-#endif
-}
-
-
-////////////////////////////////////////////////////////////////////
-//
-// Un/Cache a LUMP of graphics
-//
-////////////////////////////////////////////////////////////////////
-void CacheLump(int lumpstart,int lumpend)
-{
- int i;
-
- for (i=lumpstart;i<=lumpend;i++)
- CA_CacheGrChunk(i);
-}
-
-
-void UnCacheLump(int lumpstart,int lumpend)
-{
- int i;
-
- for (i=lumpstart;i<=lumpend;i++)
- if (grsegs[i])
- UNCACHEGRCHUNK(i);
-}
-
-
-////////////////////////////////////////////////////////////////////
-//
-// Draw a window for a menu
-//
-////////////////////////////////////////////////////////////////////
-void DrawWindow(int x,int y,int w,int h,int wcolor)
-{
- VWB_Bar(x,y,w,h,wcolor);
- DrawOutline(x,y,w,h,BORD2COLOR,DEACTIVE);
-}
-
-
-void DrawOutline(int x,int y,int w,int h,int color1,int color2)
-{
- VWB_Hlin(x,x+w,y,color2);
- VWB_Vlin(y,y+h,x,color2);
- VWB_Hlin(x,x+w,y+h,color1);
- VWB_Vlin(y,y+h,x+w,color1);
-}
-
-
-////////////////////////////////////////////////////////////////////
-//
-// Setup Control Panel stuff - graphics, etc.
-//
-////////////////////////////////////////////////////////////////////
-void SetupControlPanel(void)
-{
- struct ffblk f;
- char name[13];
- int which,i;
-
-
- //
- // CACHE GRAPHICS & SOUNDS
- //
- CA_CacheGrChunk(STARTFONT+1);
-#ifndef SPEAR
- CacheLump(CONTROLS_LUMP_START,CONTROLS_LUMP_END);
-#else
- CacheLump(BACKDROP_LUMP_START,BACKDROP_LUMP_END);
-#endif
-
- SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
- fontnumber=1;
- WindowH=200;
-
- if (!ingame)
- CA_LoadAllSounds();
- else
- MainMenu[savegame].active=1;
-
- //
- // SEE WHICH SAVE GAME FILES ARE AVAILABLE & READ STRING IN
- //
- strcpy(name,SaveName);
- if (!findfirst(name,&f,0))
- do
- {
- which=f.ff_name[7]-'0';
- if (which<10)
- {
- int handle;
- char temp[32];
-
- SaveGamesAvail[which]=1;
- handle=open(f.ff_name,O_BINARY);
- read(handle,temp,32);
- close(handle);
- strcpy(&SaveGameNames[which][0],temp);
- }
- } while(!findnext(&f));
-
- //
- // CENTER MOUSE
- //
- _CX=_DX=CENTER;
- Mouse(4);
-}
-
-
-////////////////////////////////////////////////////////////////////
-//
-// Clean up all the Control Panel stuff
-//
-////////////////////////////////////////////////////////////////////
-void CleanupControlPanel(void)
-{
-#ifndef SPEAR
- UnCacheLump(CONTROLS_LUMP_START,CONTROLS_LUMP_END);
-#else
- UnCacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
-#endif
-
- fontnumber = 0;
-}
-
-
-////////////////////////////////////////////////////////////////////
-//
-// Handle moving gun around a menu
-//
-////////////////////////////////////////////////////////////////////
-int HandleMenu(CP_iteminfo *item_i,CP_itemtype far *items,void (*routine)(int w))
-{
- char key;
- static int redrawitem=1,lastitem=-1;
- int i,x,y,basey,exit,which,shape,timer;
- ControlInfo ci;
-
-
- which=item_i->curpos;
- x=item_i->x&-8;
- basey=item_i->y-2;
- y=basey+which*13;
-
- VWB_DrawPic(x,y,C_CURSOR1PIC);
- SetTextColor(items+which,1);
- if (redrawitem)
- {
- PrintX=item_i->x+item_i->indent;
- PrintY=item_i->y+which*13;
- US_Print((items+which)->string);
- }
- //
- // CALL CUSTOM ROUTINE IF IT IS NEEDED
- //
- if (routine)
- routine(which);
- VW_UpdateScreen();
-
- shape=C_CURSOR1PIC;
- timer=8;
- exit=0;
- TimeCount=0;
- IN_ClearKeysDown();
-
-
- do
- {
- //
- // CHANGE GUN SHAPE
- //
- if (TimeCount>timer)
- {
- TimeCount=0;
- if (shape==C_CURSOR1PIC)
- {
- shape=C_CURSOR2PIC;
- timer=8;
- }
- else
- {
- shape=C_CURSOR1PIC;
- timer=70;
- }
- VWB_DrawPic(x,y,shape);
- if (routine)
- routine(which);
- VW_UpdateScreen();
- }
-
- CheckPause();
-
- //
- // SEE IF ANY KEYS ARE PRESSED FOR INITIAL CHAR FINDING
- //
- key=LastASCII;
- if (key)
- {
- int ok=0;
-
- //
- // CHECK FOR SCREEN CAPTURE
- //
- #ifndef SPEAR
- if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))
- #else
- if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("debugmode"))
- #endif
- PicturePause();
-
-
- if (key>='a')
- key-='a'-'A';
-
- for (i=which+1;i<item_i->amount;i++)
- if ((items+i)->active && (items+i)->string[0]==key)
- {
- EraseGun(item_i,items,x,y,which);
- which=i;
- DrawGun(item_i,items,x,&y,which,basey,routine);
- ok=1;
- IN_ClearKeysDown();
- break;
- }
-
- //
- // DIDN'T FIND A MATCH FIRST TIME THRU. CHECK AGAIN.
- //
- if (!ok)
- {
- for (i=0;i<which;i++)
- if ((items+i)->active && (items+i)->string[0]==key)
- {
- EraseGun(item_i,items,x,y,which);
- which=i;
- DrawGun(item_i,items,x,&y,which,basey,routine);
- IN_ClearKeysDown();
- break;
- }
- }
- }
-
- //
- // GET INPUT
- //
- ReadAnyControl(&ci);
- switch(ci.dir)
- {
- ////////////////////////////////////////////////
- //
- // MOVE UP
- //
- case dir_North:
-
- EraseGun(item_i,items,x,y,which);
-
- //
- // ANIMATE HALF-STEP
- //
- if (which && (items+which-1)->active)
- {
- y-=6;
- DrawHalfStep(x,y);
- }
-
- //
- // MOVE TO NEXT AVAILABLE SPOT
- //
- do
- {
- if (!which)
- which=item_i->amount-1;
- else
- which--;
- } while(!(items+which)->active);
-
- DrawGun(item_i,items,x,&y,which,basey,routine);
- //
- // WAIT FOR BUTTON-UP OR DELAY NEXT MOVE
- //
- TicDelay(20);
- break;
-
- ////////////////////////////////////////////////
- //
- // MOVE DOWN
- //
- case dir_South:
-
- EraseGun(item_i,items,x,y,which);
- //
- // ANIMATE HALF-STEP
- //
- if (which!=item_i->amount-1 && (items+which+1)->active)
- {
- y+=6;
- DrawHalfStep(x,y);
- }
-
- do
- {
- if (which==item_i->amount-1)
- which=0;
- else
- which++;
- } while(!(items+which)->active);
-
- DrawGun(item_i,items,x,&y,which,basey,routine);
-
- //
- // WAIT FOR BUTTON-UP OR DELAY NEXT MOVE
- //
- TicDelay(20);
- break;
- }
-
- if (ci.button0 ||
- Keyboard[sc_Space] ||
- Keyboard[sc_Enter])
- exit=1;
-
- if (ci.button1 ||
- Keyboard[sc_Escape])
- exit=2;
-
- } while(!exit);
-
-
- IN_ClearKeysDown();
-
- //
- // ERASE EVERYTHING
- //
- if (lastitem!=which)
- {
- VWB_Bar(x-1,y,25,16,BKGDCOLOR);
- PrintX=item_i->x+item_i->indent;
- PrintY=item_i->y+which*13;
- US_Print((items+which)->string);
- redrawitem=1;
- }
- else
- redrawitem=0;
-
- if (routine)
- routine(which);
- VW_UpdateScreen();
-
- item_i->curpos=which;
-
- lastitem=which;
- switch(exit)
- {
- case 1:
- //
- // CALL THE ROUTINE
- //
- if ((items+which)->routine!=NULL)
- {
- ShootSnd();
- MenuFadeOut();
- (items+which)->routine(0);
- }
- return which;
-
- case 2:
- SD_PlaySound(ESCPRESSEDSND);
- return -1;
- }
-
- return 0; // JUST TO SHUT UP THE ERROR MESSAGES!
-}
-
-
-//
-// ERASE GUN & DE-HIGHLIGHT STRING
-//
-void EraseGun(CP_iteminfo *item_i,CP_itemtype far *items,int x,int y,int which)
-{
- VWB_Bar(x-1,y,25,16,BKGDCOLOR);
- SetTextColor(items+which,0);
-
- PrintX=item_i->x+item_i->indent;
- PrintY=item_i->y+which*13;
- US_Print((items+which)->string);
- VW_UpdateScreen();
-}
-
-
-//
-// DRAW HALF STEP OF GUN TO NEXT POSITION
-//
-void DrawHalfStep(int x,int y)
-{
- VWB_DrawPic(x,y,C_CURSOR1PIC);
- VW_UpdateScreen();
- SD_PlaySound(MOVEGUN1SND);
- TimeCount=0;
- while(TimeCount<8);
-}
-
-
-//
-// DRAW GUN AT NEW POSITION
-//
-void DrawGun(CP_iteminfo *item_i,CP_itemtype far *items,int x,int *y,int which,int basey,void (*routine)(int w))
-{
- VWB_Bar(x-1,*y,25,16,BKGDCOLOR);
- *y=basey+which*13;
- VWB_DrawPic(x,*y,C_CURSOR1PIC);
- SetTextColor(items+which,1);
-
- PrintX=item_i->x+item_i->indent;
- PrintY=item_i->y+which*13;
- US_Print((items+which)->string);
-
- //
- // CALL CUSTOM ROUTINE IF IT IS NEEDED
- //
- if (routine)
- routine(which);
- VW_UpdateScreen();
- SD_PlaySound(MOVEGUN2SND);
-}
-
-////////////////////////////////////////////////////////////////////
-//
-// DELAY FOR AN AMOUNT OF TICS OR UNTIL CONTROLS ARE INACTIVE
-//
-////////////////////////////////////////////////////////////////////
-void TicDelay(int count)
-{
- ControlInfo ci;
-
-
- TimeCount=0;
- do
- {
- ReadAnyControl(&ci);
- } while(TimeCount<count && ci.dir!=dir_None);
-}
-
-
-////////////////////////////////////////////////////////////////////
-//
-// Draw a menu
-//
-////////////////////////////////////////////////////////////////////
-void DrawMenu(CP_iteminfo *item_i,CP_itemtype far *items)
-{
- int i,which=item_i->curpos;
-
-
- WindowX=PrintX=item_i->x+item_i->indent;
- WindowY=PrintY=item_i->y;
- WindowW=320;
- WindowH=200;
-
- for (i=0;i<item_i->amount;i++)
- {
- SetTextColor(items+i,which==i);
-
- PrintY=item_i->y+i*13;
- if ((items+i)->active)
- US_Print((items+i)->string);
- else
- {
- SETFONTCOLOR(DEACTIVE,BKGDCOLOR);
- US_Print((items+i)->string);
- SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
- }
-
- US_Print("\n");
- }
-}
-
-
-////////////////////////////////////////////////////////////////////
-//
-// SET TEXT COLOR (HIGHLIGHT OR NO)
-//
-////////////////////////////////////////////////////////////////////
-void SetTextColor(CP_itemtype far *items,int hlight)
-{
- if (hlight)
- {SETFONTCOLOR(color_hlite[items->active],BKGDCOLOR);}
- else
- {SETFONTCOLOR(color_norml[items->active],BKGDCOLOR);}
-}
-
-
-////////////////////////////////////////////////////////////////////
-//
-// WAIT FOR CTRLKEY-UP OR BUTTON-UP
-//
-////////////////////////////////////////////////////////////////////
-void WaitKeyUp(void)
-{
- ControlInfo ci;
- while(ReadAnyControl(&ci), ci.button0|
- ci.button1|
- ci.button2|
- ci.button3|
- Keyboard[sc_Space]|
- Keyboard[sc_Enter]|
- Keyboard[sc_Escape]);
-}
-
-
-////////////////////////////////////////////////////////////////////
-//
-// READ KEYBOARD, JOYSTICK AND MOUSE FOR INPUT
-//
-////////////////////////////////////////////////////////////////////
-void ReadAnyControl(ControlInfo *ci)
-{
- int mouseactive=0;
-
-
- IN_ReadControl(0,ci);
-
- if (mouseenabled)
- {
- int mousey,mousex;
-
-
- // READ MOUSE MOTION COUNTERS
- // RETURN DIRECTION
- // HOME MOUSE
- // CHECK MOUSE BUTTONS
-
- Mouse(3);
- mousex=_CX;
- mousey=_DX;
-
- if (mousey<CENTER-SENSITIVE)
- {
- ci->dir=dir_North;
- _CX=_DX=CENTER;
- Mouse(4);
- mouseactive=1;
- }
- else
- if (mousey>CENTER+SENSITIVE)
- {
- ci->dir=dir_South;
- _CX=_DX=CENTER;
- Mouse(4);
- mouseactive=1;
- }
-
- if (mousex<CENTER-SENSITIVE)
- {
- ci->dir=dir_West;
- _CX=_DX=CENTER;
- Mouse(4);
- mouseactive=1;
- }
- else
- if (mousex>CENTER+SENSITIVE)
- {
- ci->dir=dir_East;
- _CX=_DX=CENTER;
- Mouse(4);
- mouseactive=1;
- }
-
- if (IN_MouseButtons())
- {
- ci->button0=IN_MouseButtons()&1;
- ci->button1=IN_MouseButtons()&2;
- ci->button2=IN_MouseButtons()&4;
- ci->button3=false;
- mouseactive=1;
- }
- }
-
- if (joystickenabled && !mouseactive)
- {
- int jx,jy,jb;
-
-
- INL_GetJoyDelta(joystickport,&jx,&jy);
- if (jy<-SENSITIVE)
- ci->dir=dir_North;
- else
- if (jy>SENSITIVE)
- ci->dir=dir_South;
-
- if (jx<-SENSITIVE)
- ci->dir=dir_West;
- else
- if (jx>SENSITIVE)
- ci->dir=dir_East;
-
- jb=IN_JoyButtons();
- if (jb)
- {
- ci->button0=jb&1;
- ci->button1=jb&2;
- if (joypadenabled)
- {
- ci->button2=jb&4;
- ci->button3=jb&8;
- }
- else
- ci->button2=ci->button3=false;
- }
- }
-}
-
-
-////////////////////////////////////////////////////////////////////
-//
-// DRAW DIALOG AND CONFIRM YES OR NO TO QUESTION
-//
-////////////////////////////////////////////////////////////////////
-int Confirm(char far *string)
-{
- int xit=0,i,x,y,tick=0,time,whichsnd[2]={ESCPRESSEDSND,SHOOTSND};
-
-
- Message(string);
- IN_ClearKeysDown();
-
- //
- // BLINK CURSOR
- //
- x=PrintX;
- y=PrintY;
- TimeCount=0;
-
- do
- {
- if (TimeCount>=10)
- {
- switch(tick)
- {
- case 0:
- VWB_Bar(x,y,8,13,TEXTCOLOR);
- break;
- case 1:
- PrintX=x;
- PrintY=y;
- US_Print("_");
- }
- VW_UpdateScreen();
- tick^=1;
- TimeCount=0;
- }
-
- #ifndef SPEAR
- if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))
- PicturePause();
- #endif
-
- #ifdef SPANISH
- } while(!Keyboard[sc_S] && !Keyboard[sc_N] && !Keyboard[sc_Escape]);
- #else
- } while(!Keyboard[sc_Y] && !Keyboard[sc_N] && !Keyboard[sc_Escape]);
- #endif
-
- #ifdef SPANISH
- if (Keyboard[sc_S])
- {
- xit=1;
- ShootSnd();
- }
-
- while(Keyboard[sc_S] || Keyboard[sc_N] || Keyboard[sc_Escape]);
-
- #else
-
- if (Keyboard[sc_Y])
- {
- xit=1;
- ShootSnd();
- }
-
- while(Keyboard[sc_Y] || Keyboard[sc_N] || Keyboard[sc_Escape]);
- #endif
-
- IN_ClearKeysDown();
- SD_PlaySound(whichsnd[xit]);
- return xit;
-}
-
-#ifdef JAPAN
-////////////////////////////////////////////////////////////////////
-//
-// DRAW MESSAGE & GET Y OR N
-//
-////////////////////////////////////////////////////////////////////
-int GetYorN(int x,int y,int pic)
-{
- int xit=0,whichsnd[2]={ESCPRESSEDSND,SHOOTSND};
-
-
- CA_CacheGrChunk(pic);
- VWB_DrawPic(x * 8,y * 8,pic);
- UNCACHEGRCHUNK(pic);
- VW_UpdateScreen();
- IN_ClearKeysDown();
-
- do
- {
- #ifndef SPEAR
- if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))
- PicturePause();
- #endif
-
- #ifdef SPANISH
- } while(!Keyboard[sc_S] && !Keyboard[sc_N] && !Keyboard[sc_Escape]);
- #else
- } while(!Keyboard[sc_Y] && !Keyboard[sc_N] && !Keyboard[sc_Escape]);
- #endif
-
- #ifdef SPANISH
- if (Keyboard[sc_S])
- {
- xit=1;
- ShootSnd();
- }
-
- while(Keyboard[sc_S] || Keyboard[sc_N] || Keyboard[sc_Escape]);
-
- #else
-
- if (Keyboard[sc_Y])
- {
- xit=1;
- ShootSnd();
- }
-
- while(Keyboard[sc_Y] || Keyboard[sc_N] || Keyboard[sc_Escape]);
- #endif
-
- IN_ClearKeysDown();
- SD_PlaySound(whichsnd[xit]);
- return xit;
-}
-#endif
-
-
-////////////////////////////////////////////////////////////////////
-//
-// PRINT A MESSAGE IN A WINDOW
-//
-////////////////////////////////////////////////////////////////////
-void Message(char far *string)
-{
- int h=0,w=0,mw=0,i,x,y,time;
- fontstruct _seg *font;
-
-
- CA_CacheGrChunk (STARTFONT+1);
- fontnumber=1;
- font=grsegs[STARTFONT+fontnumber];
- h=font->height;
- for (i=0;i<_fstrlen(string);i++)
- if (string[i]=='\n')
- {
- if (w>mw)
- mw=w;
- w=0;
- h+=font->height;
- }
- else
- w+=font->width[string[i]];
-
- if (w+10>mw)
- mw=w+10;
-
- PrintY=(WindowH/2)-h/2;
- PrintX=WindowX=160-mw/2;
-
- DrawWindow(WindowX-5,PrintY-5,mw+10,h+10,TEXTCOLOR);
- DrawOutline(WindowX-5,PrintY-5,mw+10,h+10,0,HIGHLIGHT);
- SETFONTCOLOR(0,TEXTCOLOR);
- US_Print(string);
- VW_UpdateScreen();
-}
-
-
-////////////////////////////////////////////////////////////////////
-//
-// THIS MAY BE FIXED A LITTLE LATER...
-//
-////////////////////////////////////////////////////////////////////
-static int lastmusic;
-
-void StartCPMusic(int song)
-{
- musicnames chunk;
-
- if (audiosegs[STARTMUSIC + lastmusic]) // JDC
- MM_FreePtr ((memptr *)&audiosegs[STARTMUSIC + lastmusic]);
- lastmusic = song;
-
- SD_MusicOff();
- chunk = song;
-
- MM_BombOnError (false);
- CA_CacheAudioChunk(STARTMUSIC + chunk);
- MM_BombOnError (true);
- if (mmerror)
- mmerror = false;
- else
- {
- MM_SetLock(&((memptr)audiosegs[STARTMUSIC + chunk]),true);
- SD_StartMusic((MusicGroup far *)audiosegs[STARTMUSIC + chunk]);
- }
-}
-
-void FreeMusic (void)
-{
- if (audiosegs[STARTMUSIC + lastmusic]) // JDC
- MM_FreePtr ((memptr *)&audiosegs[STARTMUSIC + lastmusic]);
-}
-
-
-///////////////////////////////////////////////////////////////////////////
-//
-// IN_GetScanName() - Returns a string containing the name of the
-// specified scan code
-//
-///////////////////////////////////////////////////////////////////////////
-byte *
-IN_GetScanName(ScanCode scan)
-{
- byte **p;
- ScanCode far *s;
-
- for (s = ExtScanCodes,p = ExtScanNames;*s;p++,s++)
- if (*s == scan)
- return(*p);
-
- return(ScanNames[scan]);
-}
-
-
-///////////////////////////////////////////////////////////////////////////
-//
-// CHECK FOR PAUSE KEY (FOR MUSIC ONLY)
-//
-///////////////////////////////////////////////////////////////////////////
-void CheckPause(void)
-{
- if (Paused)
- {
- switch(SoundStatus)
- {
- case 0: SD_MusicOn(); break;
- case 1: SD_MusicOff(); break;
- }
-
- SoundStatus^=1;
- VW_WaitVBL(3);
- IN_ClearKeysDown();
- Paused=false;
- }
-}
-
-
-///////////////////////////////////////////////////////////////////////////
-//
-// DRAW GUN CURSOR AT CORRECT POSITION IN MENU
-//
-///////////////////////////////////////////////////////////////////////////
-void DrawMenuGun(CP_iteminfo *iteminfo)
-{
- int x,y;
-
-
- x=iteminfo->x;
- y=iteminfo->y+iteminfo->curpos*13-2;
- VWB_DrawPic(x,y,C_CURSOR1PIC);
-}
-
-
-///////////////////////////////////////////////////////////////////////////
-//
-// DRAW SCREEN TITLE STRIPES
-//
-///////////////////////////////////////////////////////////////////////////
-void DrawStripes(int y)
-{
-#ifndef SPEAR
- VWB_Bar(0,y,320,24,0);
- VWB_Hlin(0,319,y+22,STRIPE);
-#else
- VWB_Bar(0,y,320,22,0);
- VWB_Hlin(0,319,y+23,0);
-#endif
-}
-
-void ShootSnd(void)
-{
- SD_PlaySound(SHOOTSND);
-}
-
-
-///////////////////////////////////////////////////////////////////////////
-//
-// CHECK FOR EPISODES
-//
-///////////////////////////////////////////////////////////////////////////
-void CheckForEpisodes(void)
-{
- struct ffblk f;
-
-//
-// JAPANESE VERSION
-//
-#ifdef JAPAN
-#ifdef JAPDEMO
- if (!findfirst("*.WJ1",&f,FA_ARCH))
- {
- strcpy(extension,"WJ1");
-#else
- if (!findfirst("*.WJ6",&f,FA_ARCH))
- {
- strcpy(extension,"WJ6");
-#endif
- strcat(configname,extension);
- strcat(SaveName,extension);
- strcat(PageFileName,extension);
- strcat(audioname,extension);
- strcat(demoname,extension);
- EpisodeSelect[1] =
- EpisodeSelect[2] =
- EpisodeSelect[3] =
- EpisodeSelect[4] =
- EpisodeSelect[5] = 1;
- }
- else
- Quit("NO JAPANESE WOLFENSTEIN 3-D DATA FILES to be found!");
-#else
-
-//
-// ENGLISH
-//
-#ifndef UPLOAD
-#ifndef SPEAR
- if (!findfirst("*.WL6",&f,FA_ARCH))
- {
- strcpy(extension,"WL6");
- NewEmenu[2].active =
- NewEmenu[4].active =
- NewEmenu[6].active =
- NewEmenu[8].active =
- NewEmenu[10].active =
- EpisodeSelect[1] =
- EpisodeSelect[2] =
- EpisodeSelect[3] =
- EpisodeSelect[4] =
- EpisodeSelect[5] = 1;
- }
- else
- if (!findfirst("*.WL3",&f,FA_ARCH))
- {
- strcpy(extension,"WL3");
- NewEmenu[2].active =
- NewEmenu[4].active =
- EpisodeSelect[1] =
- EpisodeSelect[2] = 1;
- }
- else
-#endif
-#endif
-
-
-
-#ifdef SPEAR
-#ifndef SPEARDEMO
- if (!findfirst("*.SOD",&f,FA_ARCH))
- {
- strcpy(extension,"SOD");
- }
- else
- Quit("NO SPEAR OF DESTINY DATA FILES TO BE FOUND!");
-#else
- if (!findfirst("*.SDM",&f,FA_ARCH))
- {
- strcpy(extension,"SDM");
- }
- else
- Quit("NO SPEAR OF DESTINY DEMO DATA FILES TO BE FOUND!");
-#endif
-
-#else
- if (!findfirst("*.WL1",&f,FA_ARCH))
- {
- strcpy(extension,"WL1");
- }
- else
- Quit("NO WOLFENSTEIN 3-D DATA FILES to be found!");
-#endif
-
- strcat(configname,extension);
- strcat(SaveName,extension);
- strcat(PageFileName,extension);
- strcat(audioname,extension);
- strcat(demoname,extension);
-#ifndef SPEAR
-#ifndef GOODTIMES
- strcat(helpfilename,extension);
-#endif
- strcat(endfilename,extension);
-#endif
-#endif
-}
--- a/WOLFSRC/WL_MENU.H
+++ /dev/null
@@ -1,231 +1,0 @@
-//
-// WL_MENU.H
-//
-#ifdef SPEAR
-
-#define BORDCOLOR 0x99
-#define BORD2COLOR 0x93
-#define DEACTIVE 0x9b
-#define BKGDCOLOR 0x9d
-//#define STRIPE 0x9c
-
-#define MenuFadeOut() VL_FadeOut(0,255,0,0,51,10)
-
-#else
-
-#define BORDCOLOR 0x29
-#define BORD2COLOR 0x23
-#define DEACTIVE 0x2b
-#define BKGDCOLOR 0x2d
-#define STRIPE 0x2c
-
-#define MenuFadeOut() VL_FadeOut(0,255,43,0,0,10)
-
-#endif
-
-#define READCOLOR 0x4a
-#define READHCOLOR 0x47
-#define VIEWCOLOR 0x7f
-#define TEXTCOLOR 0x17
-#define HIGHLIGHT 0x13
-#define MenuFadeIn() VL_FadeIn(0,255,&gamepal,10)
-
-
-#define MENUSONG WONDERIN_MUS
-
-#ifndef SPEAR
-#define INTROSONG NAZI_NOR_MUS
-#else
-#define INTROSONG XTOWER2_MUS
-#endif
-
-#define SENSITIVE 60
-#define CENTER SENSITIVE*2
-
-#define MENU_X 76
-#define MENU_Y 55
-#define MENU_W 178
-#ifndef SPEAR
-#define MENU_H 13*10+6
-#else
-#define MENU_H 13*9+6
-#endif
-
-#define SM_X 48
-#define SM_W 250
-
-#define SM_Y1 20
-#define SM_H1 4*13-7
-#define SM_Y2 SM_Y1+5*13
-#define SM_H2 4*13-7
-#define SM_Y3 SM_Y2+5*13
-#define SM_H3 3*13-7
-
-#define CTL_X 24
-#define CTL_Y 70
-#define CTL_W 284
-#define CTL_H 13*7-7
-
-#define LSM_X 85
-#define LSM_Y 55
-#define LSM_W 175
-#define LSM_H 10*13+10
-
-#define NM_X 50
-#define NM_Y 100
-#define NM_W 225
-#define NM_H 13*4+15
-
-#define NE_X 10
-#define NE_Y 23
-#define NE_W 320-NE_X*2
-#define NE_H 200-NE_Y*2
-
-#define CST_X 20
-#define CST_Y 48
-#define CST_START 60
-#define CST_SPC 60
-
-
-//
-// TYPEDEFS
-//
-typedef struct {
- int x,y,amount,curpos,indent;
- } CP_iteminfo;
-
-typedef struct {
- int active;
- char string[36];
- void (* routine)(int temp1);
- } CP_itemtype;
-
-typedef struct {
- int allowed[4];
- } CustomCtrls;
-
-extern CP_itemtype far MainMenu[],far NewEMenu[];
-extern CP_iteminfo MainItems;
-
-//
-// FUNCTION PROTOTYPES
-//
-void SetupControlPanel(void);
-void CleanupControlPanel(void);
-
-void DrawMenu(CP_iteminfo *item_i,CP_itemtype far *items);
-int HandleMenu(CP_iteminfo *item_i,
- CP_itemtype far *items,
- void (*routine)(int w));
-void ClearMScreen(void);
-void DrawWindow(int x,int y,int w,int h,int wcolor);
-void DrawOutline(int x,int y,int w,int h,int color1,int color2);
-void WaitKeyUp(void);
-void ReadAnyControl(ControlInfo *ci);
-void TicDelay(int count);
-void CacheLump(int lumpstart,int lumpend);
-void UnCacheLump(int lumpstart,int lumpend);
-void StartCPMusic(int song);
-int Confirm(char far *string);
-void Message(char far *string);
-void CheckPause(void);
-void ShootSnd(void);
-void CheckSecretMissions(void);
-void BossKey(void);
-
-void DrawGun(CP_iteminfo *item_i,CP_itemtype far *items,int x,int *y,int which,int basey,void (*routine)(int w));
-void DrawHalfStep(int x,int y);
-void EraseGun(CP_iteminfo *item_i,CP_itemtype far *items,int x,int y,int which);
-void SetTextColor(CP_itemtype far *items,int hlight);
-void DrawMenuGun(CP_iteminfo *iteminfo);
-void DrawStripes(int y);
-
-void DefineMouseBtns(void);
-void DefineJoyBtns(void);
-void DefineKeyBtns(void);
-void DefineKeyMove(void);
-void EnterCtrlData(int index,CustomCtrls *cust,void (*DrawRtn)(int),void (*PrintRtn)(int),int type);
-
-void DrawMainMenu(void);
-void DrawSoundMenu(void);
-void DrawLoadSaveScreen(int loadsave);
-void DrawNewEpisode(void);
-void DrawNewGame(void);
-void DrawChangeView(int view);
-void DrawMouseSens(void);
-void DrawCtlScreen(void);
-void DrawCustomScreen(void);
-void DrawLSAction(int which);
-void DrawCustMouse(int hilight);
-void DrawCustJoy(int hilight);
-void DrawCustKeybd(int hilight);
-void DrawCustKeys(int hilight);
-void PrintCustMouse(int i);
-void PrintCustJoy(int i);
-void PrintCustKeybd(int i);
-void PrintCustKeys(int i);
-
-void PrintLSEntry(int w,int color);
-void TrackWhichGame(int w);
-void DrawNewGameDiff(int w);
-void FixupCustom(int w);
-
-void CP_NewGame(void);
-void CP_Sound(void);
-int CP_LoadGame(int quick);
-int CP_SaveGame(int quick);
-void CP_Control(void);
-void CP_ChangeView(void);
-void CP_ExitOptions(void);
-void CP_Quit(void);
-void CP_ViewScores(void);
-int CP_EndGame(void);
-int CP_CheckQuick(unsigned scancode);
-void CustomControls(void);
-void MouseSensitivity(void);
-
-void CheckForEpisodes(void);
-
-//
-// VARIABLES
-//
-extern int SaveGamesAvail[10],StartGame,SoundStatus;
-extern char SaveGameNames[10][32],SaveName[13];
-
-enum {MOUSE,JOYSTICK,KEYBOARDBTNS,KEYBOARDMOVE}; // FOR INPUT TYPES
-
-enum
-{
- newgame,
- soundmenu,
- control,
- loadgame,
- savegame,
- changeview,
-
-#ifndef GOODTIMES
-#ifndef SPEAR
- readthis,
-#endif
-#endif
-
- viewscores,
- backtodemo,
- quit
-} menuitems;
-
-//
-// WL_INTER
-//
-typedef struct {
- int kill,secret,treasure;
- long time;
- } LRstruct;
-
-extern LRstruct LevelRatios[];
-
-void Write (int x,int y,char *string);
-void NonShareware(void);
-int GetYorN(int x,int y,int pic);
-
-
--- a/WOLFSRC/WL_PLAY.C
+++ /dev/null
@@ -1,1472 +1,0 @@
-// WL_PLAY.C
-
-#include "WL_DEF.H"
-#pragma hdrstop
-
-
-/*
-=============================================================================
-
- LOCAL CONSTANTS
-
-=============================================================================
-*/
-
-#define sc_Question 0x35
-
-/*
-=============================================================================
-
- GLOBAL VARIABLES
-
-=============================================================================
-*/
-
-boolean madenoise; // true when shooting or screaming
-
-exit_t playstate;
-
-int DebugOk;
-
-objtype objlist[MAXACTORS],*new,*obj,*player,*lastobj,
- *objfreelist,*killerobj;
-
-unsigned farmapylookup[MAPSIZE];
-byte *nearmapylookup[MAPSIZE];
-
-boolean singlestep,godmode,noclip;
-int extravbls;
-
-byte tilemap[MAPSIZE][MAPSIZE]; // wall values only
-byte spotvis[MAPSIZE][MAPSIZE];
-objtype *actorat[MAPSIZE][MAPSIZE];
-
-//
-// replacing refresh manager
-//
-unsigned mapwidth,mapheight,tics;
-boolean compatability;
-byte *updateptr;
-unsigned mapwidthtable[64];
-unsigned uwidthtable[UPDATEHIGH];
-unsigned blockstarts[UPDATEWIDE*UPDATEHIGH];
-byte update[UPDATESIZE];
-
-//
-// control info
-//
-boolean mouseenabled,joystickenabled,joypadenabled,joystickprogressive;
-int joystickport;
-int dirscan[4] = {sc_UpArrow,sc_RightArrow,sc_DownArrow,sc_LeftArrow};
-int buttonscan[NUMBUTTONS] =
- {sc_Control,sc_Alt,sc_RShift,sc_Space,sc_1,sc_2,sc_3,sc_4};
-int buttonmouse[4]={bt_attack,bt_strafe,bt_use,bt_nobutton};
-int buttonjoy[4]={bt_attack,bt_strafe,bt_use,bt_run};
-
-int viewsize;
-
-boolean buttonheld[NUMBUTTONS];
-
-boolean demorecord,demoplayback;
-char far *demoptr, far *lastdemoptr;
-memptr demobuffer;
-
-//
-// curent user input
-//
-int controlx,controly; // range from -100 to 100 per tic
-boolean buttonstate[NUMBUTTONS];
-
-
-
-//===========================================================================
-
-
-void CenterWindow(word w,word h);
-void InitObjList (void);
-void RemoveObj (objtype *gone);
-void PollControls (void);
-void StopMusic(void);
-void StartMusic(void);
-void PlayLoop (void);
-
-/*
-=============================================================================
-
- LOCAL VARIABLES
-
-=============================================================================
-*/
-
-
-objtype dummyobj;
-
-//
-// LIST OF SONGS FOR EACH VERSION
-//
-int songs[]=
-{
-#ifndef SPEAR
- //
- // Episode One
- //
- GETTHEM_MUS,
- SEARCHN_MUS,
- POW_MUS,
- SUSPENSE_MUS,
- GETTHEM_MUS,
- SEARCHN_MUS,
- POW_MUS,
- SUSPENSE_MUS,
-
- WARMARCH_MUS, // Boss level
- CORNER_MUS, // Secret level
-
- //
- // Episode Two
- //
- NAZI_OMI_MUS,
- PREGNANT_MUS,
- GOINGAFT_MUS,
- HEADACHE_MUS,
- NAZI_OMI_MUS,
- PREGNANT_MUS,
- HEADACHE_MUS,
- GOINGAFT_MUS,
-
- WARMARCH_MUS, // Boss level
- DUNGEON_MUS, // Secret level
-
- //
- // Episode Three
- //
- INTROCW3_MUS,
- NAZI_RAP_MUS,
- TWELFTH_MUS,
- ZEROHOUR_MUS,
- INTROCW3_MUS,
- NAZI_RAP_MUS,
- TWELFTH_MUS,
- ZEROHOUR_MUS,
-
- ULTIMATE_MUS, // Boss level
- PACMAN_MUS, // Secret level
-
- //
- // Episode Four
- //
- GETTHEM_MUS,
- SEARCHN_MUS,
- POW_MUS,
- SUSPENSE_MUS,
- GETTHEM_MUS,
- SEARCHN_MUS,
- POW_MUS,
- SUSPENSE_MUS,
-
- WARMARCH_MUS, // Boss level
- CORNER_MUS, // Secret level
-
- //
- // Episode Five
- //
- NAZI_OMI_MUS,
- PREGNANT_MUS,
- GOINGAFT_MUS,
- HEADACHE_MUS,
- NAZI_OMI_MUS,
- PREGNANT_MUS,
- HEADACHE_MUS,
- GOINGAFT_MUS,
-
- WARMARCH_MUS, // Boss level
- DUNGEON_MUS, // Secret level
-
- //
- // Episode Six
- //
- INTROCW3_MUS,
- NAZI_RAP_MUS,
- TWELFTH_MUS,
- ZEROHOUR_MUS,
- INTROCW3_MUS,
- NAZI_RAP_MUS,
- TWELFTH_MUS,
- ZEROHOUR_MUS,
-
- ULTIMATE_MUS, // Boss level
- FUNKYOU_MUS // Secret level
-#else
-
- //////////////////////////////////////////////////////////////
- //
- // SPEAR OF DESTINY TRACKS
- //
- //////////////////////////////////////////////////////////////
- XTIPTOE_MUS,
- XFUNKIE_MUS,
- XDEATH_MUS,
- XGETYOU_MUS, // DON'T KNOW
- ULTIMATE_MUS, // Trans Gr�sse
-
- DUNGEON_MUS,
- GOINGAFT_MUS,
- POW_MUS,
- TWELFTH_MUS,
- ULTIMATE_MUS, // Barnacle Wilhelm BOSS
-
- NAZI_OMI_MUS,
- GETTHEM_MUS,
- SUSPENSE_MUS,
- SEARCHN_MUS,
- ZEROHOUR_MUS,
- ULTIMATE_MUS, // Super Mutant BOSS
-
- XPUTIT_MUS,
- ULTIMATE_MUS, // Death Knight BOSS
-
- XJAZNAZI_MUS, // Secret level
- XFUNKIE_MUS, // Secret level (DON'T KNOW)
-
- XEVIL_MUS // Angel of Death BOSS
-
-#endif
-};
-
-
-/*
-=============================================================================
-
- USER CONTROL
-
-=============================================================================
-*/
-
-
-#define BASEMOVE 35
-#define RUNMOVE 70
-#define BASETURN 35
-#define RUNTURN 70
-
-#define JOYSCALE 2
-
-/*
-===================
-=
-= PollKeyboardButtons
-=
-===================
-*/
-
-void PollKeyboardButtons (void)
-{
- int i;
-
- for (i=0;i<NUMBUTTONS;i++)
- if (Keyboard[buttonscan[i]])
- buttonstate[i] = true;
-}
-
-
-/*
-===================
-=
-= PollMouseButtons
-=
-===================
-*/
-
-void PollMouseButtons (void)
-{
- int buttons;
-
- buttons = IN_MouseButtons ();
-
- if (buttons&1)
- buttonstate[buttonmouse[0]] = true;
- if (buttons&2)
- buttonstate[buttonmouse[1]] = true;
- if (buttons&4)
- buttonstate[buttonmouse[2]] = true;
-}
-
-
-
-/*
-===================
-=
-= PollJoystickButtons
-=
-===================
-*/
-
-void PollJoystickButtons (void)
-{
- int buttons;
-
- buttons = IN_JoyButtons ();
-
- if (joystickport && !joypadenabled)
- {
- if (buttons&4)
- buttonstate[buttonjoy[0]] = true;
- if (buttons&8)
- buttonstate[buttonjoy[1]] = true;
- }
- else
- {
- if (buttons&1)
- buttonstate[buttonjoy[0]] = true;
- if (buttons&2)
- buttonstate[buttonjoy[1]] = true;
- if (joypadenabled)
- {
- if (buttons&4)
- buttonstate[buttonjoy[2]] = true;
- if (buttons&8)
- buttonstate[buttonjoy[3]] = true;
- }
- }
-}
-
-
-/*
-===================
-=
-= PollKeyboardMove
-=
-===================
-*/
-
-void PollKeyboardMove (void)
-{
- if (buttonstate[bt_run])
- {
- if (Keyboard[dirscan[di_north]])
- controly -= RUNMOVE*tics;
- if (Keyboard[dirscan[di_south]])
- controly += RUNMOVE*tics;
- if (Keyboard[dirscan[di_west]])
- controlx -= RUNMOVE*tics;
- if (Keyboard[dirscan[di_east]])
- controlx += RUNMOVE*tics;
- }
- else
- {
- if (Keyboard[dirscan[di_north]])
- controly -= BASEMOVE*tics;
- if (Keyboard[dirscan[di_south]])
- controly += BASEMOVE*tics;
- if (Keyboard[dirscan[di_west]])
- controlx -= BASEMOVE*tics;
- if (Keyboard[dirscan[di_east]])
- controlx += BASEMOVE*tics;
- }
-}
-
-
-/*
-===================
-=
-= PollMouseMove
-=
-===================
-*/
-
-void PollMouseMove (void)
-{
- int mousexmove,mouseymove;
-
- Mouse(MDelta);
- mousexmove = _CX;
- mouseymove = _DX;
-
- controlx += mousexmove*10/(13-mouseadjustment);
- controly += mouseymove*20/(13-mouseadjustment);
-}
-
-
-
-/*
-===================
-=
-= PollJoystickMove
-=
-===================
-*/
-
-void PollJoystickMove (void)
-{
- int joyx,joyy;
-
- INL_GetJoyDelta(joystickport,&joyx,&joyy);
-
- if (joystickprogressive)
- {
- if (joyx > 64)
- controlx += (joyx-64)*JOYSCALE*tics;
- else if (joyx < -64)
- controlx -= (-joyx-64)*JOYSCALE*tics;
- if (joyy > 64)
- controlx += (joyy-64)*JOYSCALE*tics;
- else if (joyy < -64)
- controly -= (-joyy-64)*JOYSCALE*tics;
- }
- else if (buttonstate[bt_run])
- {
- if (joyx > 64)
- controlx += RUNMOVE*tics;
- else if (joyx < -64)
- controlx -= RUNMOVE*tics;
- if (joyy > 64)
- controly += RUNMOVE*tics;
- else if (joyy < -64)
- controly -= RUNMOVE*tics;
- }
- else
- {
- if (joyx > 64)
- controlx += BASEMOVE*tics;
- else if (joyx < -64)
- controlx -= BASEMOVE*tics;
- if (joyy > 64)
- controly += BASEMOVE*tics;
- else if (joyy < -64)
- controly -= BASEMOVE*tics;
- }
-}
-
-
-/*
-===================
-=
-= PollControls
-=
-= Gets user or demo input, call once each frame
-=
-= controlx set between -100 and 100 per tic
-= controly
-= buttonheld[] the state of the buttons LAST frame
-= buttonstate[] the state of the buttons THIS frame
-=
-===================
-*/
-
-void PollControls (void)
-{
- int max,min,i;
- byte buttonbits;
-
-//
-// get timing info for last frame
-//
- if (demoplayback)
- {
- while (TimeCount<lasttimecount+DEMOTICS)
- ;
- TimeCount = lasttimecount + DEMOTICS;
- lasttimecount += DEMOTICS;
- tics = DEMOTICS;
- }
- else if (demorecord) // demo recording and playback needs
- { // to be constant
-//
-// take DEMOTICS or more tics, and modify Timecount to reflect time taken
-//
- while (TimeCount<lasttimecount+DEMOTICS)
- ;
- TimeCount = lasttimecount + DEMOTICS;
- lasttimecount += DEMOTICS;
- tics = DEMOTICS;
- }
- else
- CalcTics ();
-
- controlx = 0;
- controly = 0;
- memcpy (buttonheld,buttonstate,sizeof(buttonstate));
- memset (buttonstate,0,sizeof(buttonstate));
-
- if (demoplayback)
- {
- //
- // read commands from demo buffer
- //
- buttonbits = *demoptr++;
- for (i=0;i<NUMBUTTONS;i++)
- {
- buttonstate[i] = buttonbits&1;
- buttonbits >>= 1;
- }
-
- controlx = *demoptr++;
- controly = *demoptr++;
-
- if (demoptr == lastdemoptr)
- playstate = ex_completed; // demo is done
-
- controlx *= (int)tics;
- controly *= (int)tics;
-
- return;
- }
-
-
-//
-// get button states
-//
- PollKeyboardButtons ();
-
- if (mouseenabled)
- PollMouseButtons ();
-
- if (joystickenabled)
- PollJoystickButtons ();
-
-//
-// get movements
-//
- PollKeyboardMove ();
-
- if (mouseenabled)
- PollMouseMove ();
-
- if (joystickenabled)
- PollJoystickMove ();
-
-//
-// bound movement to a maximum
-//
- max = 100*tics;
- min = -max;
- if (controlx > max)
- controlx = max;
- else if (controlx < min)
- controlx = min;
-
- if (controly > max)
- controly = max;
- else if (controly < min)
- controly = min;
-
- if (demorecord)
- {
- //
- // save info out to demo buffer
- //
- controlx /= (int)tics;
- controly /= (int)tics;
-
- buttonbits = 0;
-
- for (i=NUMBUTTONS-1;i>=0;i--)
- {
- buttonbits <<= 1;
- if (buttonstate[i])
- buttonbits |= 1;
- }
-
- *demoptr++ = buttonbits;
- *demoptr++ = controlx;
- *demoptr++ = controly;
-
- if (demoptr >= lastdemoptr)
- Quit ("Demo buffer overflowed!");
-
- controlx *= (int)tics;
- controly *= (int)tics;
- }
-}
-
-
-
-//==========================================================================
-
-
-
-///////////////////////////////////////////////////////////////////////////
-//
-// CenterWindow() - Generates a window of a given width & height in the
-// middle of the screen
-//
-///////////////////////////////////////////////////////////////////////////
-
-#define MAXX 320
-#define MAXY 160
-
-void CenterWindow(word w,word h)
-{
- FixOfs ();
- US_DrawWindow(((MAXX / 8) - w) / 2,((MAXY / 8) - h) / 2,w,h);
-}
-
-//===========================================================================
-
-
-/*
-=====================
-=
-= CheckKeys
-=
-=====================
-*/
-
-void CheckKeys (void)
-{
- int i;
- byte scan;
- unsigned temp;
-
-
- if (screenfaded || demoplayback) // don't do anything with a faded screen
- return;
-
- scan = LastScan;
-
-
- #ifdef SPEAR
- //
- // SECRET CHEAT CODE: TAB-G-F10
- //
- if (Keyboard[sc_Tab] &&
- Keyboard[sc_G] &&
- Keyboard[sc_F10])
- {
- WindowH = 160;
- if (godmode)
- {
- Message ("God mode OFF");
- SD_PlaySound (NOBONUSSND);
- }
- else
- {
- Message ("God mode ON");
- SD_PlaySound (ENDBONUS2SND);
- }
-
- IN_Ack();
- godmode ^= 1;
- DrawAllPlayBorderSides ();
- IN_ClearKeysDown();
- return;
- }
- #endif
-
-
- //
- // SECRET CHEAT CODE: 'MLI'
- //
- if (Keyboard[sc_M] &&
- Keyboard[sc_L] &&
- Keyboard[sc_I])
- {
- gamestate.health = 100;
- gamestate.ammo = 99;
- gamestate.keys = 3;
- gamestate.score = 0;
- gamestate.TimeCount += 42000L;
- GiveWeapon (wp_chaingun);
-
- DrawWeapon();
- DrawHealth();
- DrawKeys();
- DrawAmmo();
- DrawScore();
-
- ClearMemory ();
- CA_CacheGrChunk (STARTFONT+1);
- ClearSplitVWB ();
- VW_ScreenToScreen (displayofs,bufferofs,80,160);
-
- Message(STR_CHEATER1"\n"
- STR_CHEATER2"\n\n"
- STR_CHEATER3"\n"
- STR_CHEATER4"\n"
- STR_CHEATER5);
-
- UNCACHEGRCHUNK(STARTFONT+1);
- PM_CheckMainMem ();
- IN_ClearKeysDown();
- IN_Ack();
-
- DrawAllPlayBorder ();
- }
-
- //
- // OPEN UP DEBUG KEYS
- //
-#ifndef SPEAR
- if (Keyboard[sc_BackSpace] &&
- Keyboard[sc_LShift] &&
- Keyboard[sc_Alt] &&
- MS_CheckParm("goobers"))
-#else
- if (Keyboard[sc_BackSpace] &&
- Keyboard[sc_LShift] &&
- Keyboard[sc_Alt] &&
- MS_CheckParm("debugmode"))
-#endif
- {
- ClearMemory ();
- CA_CacheGrChunk (STARTFONT+1);
- ClearSplitVWB ();
- VW_ScreenToScreen (displayofs,bufferofs,80,160);
-
- Message("Debugging keys are\nnow available!");
- UNCACHEGRCHUNK(STARTFONT+1);
- PM_CheckMainMem ();
- IN_ClearKeysDown();
- IN_Ack();
-
- DrawAllPlayBorderSides ();
- DebugOk=1;
- }
-
- //
- // TRYING THE KEEN CHEAT CODE!
- //
- if (Keyboard[sc_B] &&
- Keyboard[sc_A] &&
- Keyboard[sc_T])
- {
- ClearMemory ();
- CA_CacheGrChunk (STARTFONT+1);
- ClearSplitVWB ();
- VW_ScreenToScreen (displayofs,bufferofs,80,160);
-
- Message("Commander Keen is also\n"
- "available from Apogee, but\n"
- "then, you already know\n"
- "that - right, Cheatmeister?!");
-
- UNCACHEGRCHUNK(STARTFONT+1);
- PM_CheckMainMem ();
- IN_ClearKeysDown();
- IN_Ack();
-
- DrawAllPlayBorder ();
- }
-
-//
-// pause key weirdness can't be checked as a scan code
-//
- if (Paused)
- {
- bufferofs = displayofs;
- LatchDrawPic (20-4,80-2*8,PAUSEDPIC);
- SD_MusicOff();
- IN_Ack();
- IN_ClearKeysDown ();
- SD_MusicOn();
- Paused = false;
- if (MousePresent)
- Mouse(MDelta); // Clear accumulated mouse movement
- return;
- }
-
-
-//
-// F1-F7/ESC to enter control panel
-//
- if (
-#ifndef DEBCHECK
- scan == sc_F10 ||
-#endif
- scan == sc_F9 ||
- scan == sc_F7 ||
- scan == sc_F8) // pop up quit dialog
- {
- ClearMemory ();
- ClearSplitVWB ();
- VW_ScreenToScreen (displayofs,bufferofs,80,160);
- US_ControlPanel(scan);
-
- DrawAllPlayBorderSides ();
-
- if (scan == sc_F9)
- StartMusic ();
-
- PM_CheckMainMem ();
- SETFONTCOLOR(0,15);
- IN_ClearKeysDown();
- return;
- }
-
- if ( (scan >= sc_F1 && scan <= sc_F9) || scan == sc_Escape)
- {
- StopMusic ();
- ClearMemory ();
- VW_FadeOut ();
-
- US_ControlPanel(scan);
-
- SETFONTCOLOR(0,15);
- IN_ClearKeysDown();
- DrawPlayScreen ();
- if (!startgame && !loadedgame)
- {
- VW_FadeIn ();
- StartMusic ();
- }
- if (loadedgame)
- playstate = ex_abort;
- lasttimecount = TimeCount;
- if (MousePresent)
- Mouse(MDelta); // Clear accumulated mouse movement
- PM_CheckMainMem ();
- return;
- }
-
-//
-// TAB-? debug keys
-//
- if (Keyboard[sc_Tab] && DebugOk)
- {
- CA_CacheGrChunk (STARTFONT);
- fontnumber=0;
- SETFONTCOLOR(0,15);
- DebugKeys();
- if (MousePresent)
- Mouse(MDelta); // Clear accumulated mouse movement
- lasttimecount = TimeCount;
- return;
- }
-
-}
-
-
-//===========================================================================
-
-/*
-#############################################################################
-
- The objlist data structure
-
-#############################################################################
-
-objlist containt structures for every actor currently playing. The structure
-is accessed as a linked list starting at *player, ending when ob->next ==
-NULL. GetNewObj inserts a new object at the end of the list, meaning that
-if an actor spawn another actor, the new one WILL get to think and react the
-same frame. RemoveObj unlinks the given object and returns it to the free
-list, but does not damage the objects ->next pointer, so if the current object
-removes itself, a linked list following loop can still safely get to the
-next element.
-
-<backwardly linked free list>
-
-#############################################################################
-*/
-
-
-/*
-=========================
-=
-= InitActorList
-=
-= Call to clear out the actor object lists returning them all to the free
-= list. Allocates a special spot for the player.
-=
-=========================
-*/
-
-int objcount;
-
-void InitActorList (void)
-{
- int i;
-
-//
-// init the actor lists
-//
- for (i=0;i<MAXACTORS;i++)
- {
- objlist[i].prev = &objlist[i+1];
- objlist[i].next = NULL;
- }
-
- objlist[MAXACTORS-1].prev = NULL;
-
- objfreelist = &objlist[0];
- lastobj = NULL;
-
- objcount = 0;
-
-//
-// give the player the first free spots
-//
- GetNewActor ();
- player = new;
-
-}
-
-//===========================================================================
-
-/*
-=========================
-=
-= GetNewActor
-=
-= Sets the global variable new to point to a free spot in objlist.
-= The free spot is inserted at the end of the liked list
-=
-= When the object list is full, the caller can either have it bomb out ot
-= return a dummy object pointer that will never get used
-=
-=========================
-*/
-
-void GetNewActor (void)
-{
- if (!objfreelist)
- Quit ("GetNewActor: No free spots in objlist!");
-
- new = objfreelist;
- objfreelist = new->prev;
- memset (new,0,sizeof(*new));
-
- if (lastobj)
- lastobj->next = new;
- new->prev = lastobj; // new->next is allready NULL from memset
-
- new->active = false;
- lastobj = new;
-
- objcount++;
-}
-
-//===========================================================================
-
-/*
-=========================
-=
-= RemoveObj
-=
-= Add the given object back into the free list, and unlink it from it's
-= neighbors
-=
-=========================
-*/
-
-void RemoveObj (objtype *gone)
-{
- objtype **spotat;
-
- if (gone == player)
- Quit ("RemoveObj: Tried to remove the player!");
-
- gone->state = NULL;
-
-//
-// fix the next object's back link
-//
- if (gone == lastobj)
- lastobj = (objtype *)gone->prev;
- else
- gone->next->prev = gone->prev;
-
-//
-// fix the previous object's forward link
-//
- gone->prev->next = gone->next;
-
-//
-// add it back in to the free list
-//
- gone->prev = objfreelist;
- objfreelist = gone;
-
- objcount--;
-}
-
-/*
-=============================================================================
-
- MUSIC STUFF
-
-=============================================================================
-*/
-
-
-/*
-=================
-=
-= StopMusic
-=
-=================
-*/
-
-void StopMusic(void)
-{
- int i;
-
- SD_MusicOff();
- for (i = 0;i < LASTMUSIC;i++)
- if (audiosegs[STARTMUSIC + i])
- {
- MM_SetPurge(&((memptr)audiosegs[STARTMUSIC + i]),3);
- MM_SetLock(&((memptr)audiosegs[STARTMUSIC + i]),false);
- }
-}
-
-//==========================================================================
-
-
-/*
-=================
-=
-= StartMusic
-=
-=================
-*/
-
-void StartMusic(void)
-{
- musicnames chunk;
-
- SD_MusicOff();
- chunk = songs[gamestate.mapon+gamestate.episode*10];
-
-// if ((chunk == -1) || (MusicMode != smm_AdLib))
-//DEBUG control panel return;
-
- MM_BombOnError (false);
- CA_CacheAudioChunk(STARTMUSIC + chunk);
- MM_BombOnError (true);
- if (mmerror)
- mmerror = false;
- else
- {
- MM_SetLock(&((memptr)audiosegs[STARTMUSIC + chunk]),true);
- SD_StartMusic((MusicGroup far *)audiosegs[STARTMUSIC + chunk]);
- }
-}
-
-
-/*
-=============================================================================
-
- PALETTE SHIFTING STUFF
-
-=============================================================================
-*/
-
-#define NUMREDSHIFTS 6
-#define REDSTEPS 8
-
-#define NUMWHITESHIFTS 3
-#define WHITESTEPS 20
-#define WHITETICS 6
-
-
-byte far redshifts[NUMREDSHIFTS][768];
-byte far whiteshifts[NUMREDSHIFTS][768];
-
-int damagecount,bonuscount;
-boolean palshifted;
-
-extern byte far gamepal;
-
-/*
-=====================
-=
-= InitRedShifts
-=
-=====================
-*/
-
-void InitRedShifts (void)
-{
- byte far *workptr, far *baseptr;
- int i,j,delta;
-
-
-//
-// fade through intermediate frames
-//
- for (i=1;i<=NUMREDSHIFTS;i++)
- {
- workptr = (byte far *)&redshifts[i-1][0];
- baseptr = &gamepal;
-
- for (j=0;j<=255;j++)
- {
- delta = 64-*baseptr;
- *workptr++ = *baseptr++ + delta * i / REDSTEPS;
- delta = -*baseptr;
- *workptr++ = *baseptr++ + delta * i / REDSTEPS;
- delta = -*baseptr;
- *workptr++ = *baseptr++ + delta * i / REDSTEPS;
- }
- }
-
- for (i=1;i<=NUMWHITESHIFTS;i++)
- {
- workptr = (byte far *)&whiteshifts[i-1][0];
- baseptr = &gamepal;
-
- for (j=0;j<=255;j++)
- {
- delta = 64-*baseptr;
- *workptr++ = *baseptr++ + delta * i / WHITESTEPS;
- delta = 62-*baseptr;
- *workptr++ = *baseptr++ + delta * i / WHITESTEPS;
- delta = 0-*baseptr;
- *workptr++ = *baseptr++ + delta * i / WHITESTEPS;
- }
- }
-}
-
-
-/*
-=====================
-=
-= ClearPaletteShifts
-=
-=====================
-*/
-
-void ClearPaletteShifts (void)
-{
- bonuscount = damagecount = 0;
-}
-
-
-/*
-=====================
-=
-= StartBonusFlash
-=
-=====================
-*/
-
-void StartBonusFlash (void)
-{
- bonuscount = NUMWHITESHIFTS*WHITETICS; // white shift palette
-}
-
-
-/*
-=====================
-=
-= StartDamageFlash
-=
-=====================
-*/
-
-void StartDamageFlash (int damage)
-{
- damagecount += damage;
-}
-
-
-/*
-=====================
-=
-= UpdatePaletteShifts
-=
-=====================
-*/
-
-void UpdatePaletteShifts (void)
-{
- int red,white;
-
- if (bonuscount)
- {
- white = bonuscount/WHITETICS +1;
- if (white>NUMWHITESHIFTS)
- white = NUMWHITESHIFTS;
- bonuscount -= tics;
- if (bonuscount < 0)
- bonuscount = 0;
- }
- else
- white = 0;
-
-
- if (damagecount)
- {
- red = damagecount/10 +1;
- if (red>NUMREDSHIFTS)
- red = NUMREDSHIFTS;
-
- damagecount -= tics;
- if (damagecount < 0)
- damagecount = 0;
- }
- else
- red = 0;
-
- if (red)
- {
- VW_WaitVBL(1);
- VL_SetPalette (redshifts[red-1]);
- palshifted = true;
- }
- else if (white)
- {
- VW_WaitVBL(1);
- VL_SetPalette (whiteshifts[white-1]);
- palshifted = true;
- }
- else if (palshifted)
- {
- VW_WaitVBL(1);
- VL_SetPalette (&gamepal); // back to normal
- palshifted = false;
- }
-}
-
-
-/*
-=====================
-=
-= FinishPaletteShifts
-=
-= Resets palette to normal if needed
-=
-=====================
-*/
-
-void FinishPaletteShifts (void)
-{
- if (palshifted)
- {
- palshifted = 0;
- VW_WaitVBL(1);
- VL_SetPalette (&gamepal);
- }
-}
-
-
-/*
-=============================================================================
-
- CORE PLAYLOOP
-
-=============================================================================
-*/
-
-
-/*
-=====================
-=
-= DoActor
-=
-=====================
-*/
-
-void DoActor (objtype *ob)
-{
- void (*think)(objtype *);
-
- if (!ob->active && !areabyplayer[ob->areanumber])
- return;
-
- if (!(ob->flags&(FL_NONMARK|FL_NEVERMARK)) )
- actorat[ob->tilex][ob->tiley] = NULL;
-
-//
-// non transitional object
-//
-
- if (!ob->ticcount)
- {
- think = ob->state->think;
- if (think)
- {
- think (ob);
- if (!ob->state)
- {
- RemoveObj (ob);
- return;
- }
- }
-
- if (ob->flags&FL_NEVERMARK)
- return;
-
- if ( (ob->flags&FL_NONMARK) && actorat[ob->tilex][ob->tiley])
- return;
-
- actorat[ob->tilex][ob->tiley] = ob;
- return;
- }
-
-//
-// transitional object
-//
- ob->ticcount-=tics;
- while ( ob->ticcount <= 0)
- {
- think = ob->state->action; // end of state action
- if (think)
- {
- think (ob);
- if (!ob->state)
- {
- RemoveObj (ob);
- return;
- }
- }
-
- ob->state = ob->state->next;
-
- if (!ob->state)
- {
- RemoveObj (ob);
- return;
- }
-
- if (!ob->state->tictime)
- {
- ob->ticcount = 0;
- goto think;
- }
-
- ob->ticcount += ob->state->tictime;
- }
-
-think:
- //
- // think
- //
- think = ob->state->think;
- if (think)
- {
- think (ob);
- if (!ob->state)
- {
- RemoveObj (ob);
- return;
- }
- }
-
- if (ob->flags&FL_NEVERMARK)
- return;
-
- if ( (ob->flags&FL_NONMARK) && actorat[ob->tilex][ob->tiley])
- return;
-
- actorat[ob->tilex][ob->tiley] = ob;
-}
-
-//==========================================================================
-
-
-/*
-===================
-=
-= PlayLoop
-=
-===================
-*/
-long funnyticount;
-
-
-void PlayLoop (void)
-{
- int give;
- int helmetangle;
-
- playstate = TimeCount = lasttimecount = 0;
- frameon = 0;
- running = false;
- anglefrac = 0;
- facecount = 0;
- funnyticount = 0;
- memset (buttonstate,0,sizeof(buttonstate));
- ClearPaletteShifts ();
-
- if (MousePresent)
- Mouse(MDelta); // Clear accumulated mouse movement
-
- if (demoplayback)
- IN_StartAck ();
-
- do
- {
- if (virtualreality)
- {
- helmetangle = peek (0x40,0xf0);
- player->angle += helmetangle;
- if (player->angle >= ANGLES)
- player->angle -= ANGLES;
- }
-
-
- PollControls();
-
-//
-// actor thinking
-//
- madenoise = false;
-
- MoveDoors ();
- MovePWalls ();
-
- for (obj = player;obj;obj = obj->next)
- DoActor (obj);
-
- UpdatePaletteShifts ();
-
- ThreeDRefresh ();
-
- //
- // MAKE FUNNY FACE IF BJ DOESN'T MOVE FOR AWHILE
- //
- #ifdef SPEAR
- funnyticount += tics;
- if (funnyticount > 30l*70)
- {
- funnyticount = 0;
- StatusDrawPic (17,4,BJWAITING1PIC+(US_RndT()&1));
- facecount = 0;
- }
- #endif
-
- gamestate.TimeCount+=tics;
-
- SD_Poll ();
- UpdateSoundLoc(); // JAB
-
- if (screenfaded)
- VW_FadeIn ();
-
- CheckKeys();
-
-//
-// debug aids
-//
- if (singlestep)
- {
- VW_WaitVBL(14);
- lasttimecount = TimeCount;
- }
- if (extravbls)
- VW_WaitVBL(extravbls);
-
- if (demoplayback)
- {
- if (IN_CheckAck ())
- {
- IN_ClearKeysDown ();
- playstate = ex_abort;
- }
- }
-
-
- if (virtualreality)
- {
- player->angle -= helmetangle;
- if (player->angle < 0)
- player->angle += ANGLES;
- }
-
- }while (!playstate && !startgame);
-
- if (playstate != ex_died)
- FinishPaletteShifts ();
-}
-
--- a/WOLFSRC/WL_SCALE.C
+++ /dev/null
@@ -1,733 +1,0 @@
-// WL_SCALE.C
-
-#include "WL_DEF.H"
-#pragma hdrstop
-
-#define OP_RETF 0xcb
-
-/*
-=============================================================================
-
- GLOBALS
-
-=============================================================================
-*/
-
-t_compscale _seg *scaledirectory[MAXSCALEHEIGHT+1];
-long fullscalefarcall[MAXSCALEHEIGHT+1];
-
-int maxscale,maxscaleshl2;
-
-boolean insetupscaling;
-
-/*
-=============================================================================
-
- LOCALS
-
-=============================================================================
-*/
-
-t_compscale _seg *work;
-unsigned BuildCompScale (int height, memptr *finalspot);
-
-int stepbytwo;
-
-//===========================================================================
-
-/*
-==============
-=
-= BadScale
-=
-==============
-*/
-
-void far BadScale (void)
-{
- Quit ("BadScale called!");
-}
-
-
-/*
-==========================
-=
-= SetupScaling
-=
-==========================
-*/
-
-void SetupScaling (int maxscaleheight)
-{
- int i,x,y;
- byte far *dest;
-
- insetupscaling = true;
-
- maxscaleheight/=2; // one scaler every two pixels
-
- maxscale = maxscaleheight-1;
- maxscaleshl2 = maxscale<<2;
-
-//
-// free up old scalers
-//
- for (i=1;i<MAXSCALEHEIGHT;i++)
- {
- if (scaledirectory[i])
- MM_FreePtr (&(memptr)scaledirectory[i]);
- if (i>=stepbytwo)
- i += 2;
- }
- memset (scaledirectory,0,sizeof(scaledirectory));
-
- MM_SortMem ();
-
-//
-// build the compiled scalers
-//
- stepbytwo = viewheight/2; // save space by double stepping
- MM_GetPtr (&(memptr)work,20000);
-
- for (i=1;i<=maxscaleheight;i++)
- {
- BuildCompScale (i*2,&(memptr)scaledirectory[i]);
- if (i>=stepbytwo)
- i+= 2;
- }
- MM_FreePtr (&(memptr)work);
-
-//
-// compact memory and lock down scalers
-//
- MM_SortMem ();
- for (i=1;i<=maxscaleheight;i++)
- {
- MM_SetLock (&(memptr)scaledirectory[i],true);
- fullscalefarcall[i] = (unsigned)scaledirectory[i];
- fullscalefarcall[i] <<=16;
- fullscalefarcall[i] += scaledirectory[i]->codeofs[0];
- if (i>=stepbytwo)
- {
- scaledirectory[i+1] = scaledirectory[i];
- fullscalefarcall[i+1] = fullscalefarcall[i];
- scaledirectory[i+2] = scaledirectory[i];
- fullscalefarcall[i+2] = fullscalefarcall[i];
- i+=2;
- }
- }
- scaledirectory[0] = scaledirectory[1];
- fullscalefarcall[0] = fullscalefarcall[1];
-
-//
-// check for oversize wall drawing
-//
- for (i=maxscaleheight;i<MAXSCALEHEIGHT;i++)
- fullscalefarcall[i] = (long)BadScale;
-
- insetupscaling = false;
-}
-
-//===========================================================================
-
-/*
-========================
-=
-= BuildCompScale
-=
-= Builds a compiled scaler object that will scale a 64 tall object to
-= the given height (centered vertically on the screen)
-=
-= height should be even
-=
-= Call with
-= ---------
-= DS:SI Source for scale
-= ES:DI Dest for scale
-=
-= Calling the compiled scaler only destroys AL
-=
-========================
-*/
-
-unsigned BuildCompScale (int height, memptr *finalspot)
-{
- byte far *code;
-
- int i;
- long fix,step;
- unsigned src,totalscaled,totalsize;
- int startpix,endpix,toppix;
-
-
- step = ((long)height<<16) / 64;
- code = &work->code[0];
- toppix = (viewheight-height)/2;
- fix = 0;
-
- for (src=0;src<=64;src++)
- {
- startpix = fix>>16;
- fix += step;
- endpix = fix>>16;
-
- if (endpix>startpix)
- work->width[src] = endpix-startpix;
- else
- work->width[src] = 0;
-
-//
-// mark the start of the code
-//
- work->codeofs[src] = FP_OFF(code);
-
-//
-// compile some code if the source pixel generates any screen pixels
-//
- startpix+=toppix;
- endpix+=toppix;
-
- if (startpix == endpix || endpix < 0 || startpix >= viewheight || src == 64)
- continue;
-
- //
- // mov al,[si+src]
- //
- *code++ = 0x8a;
- *code++ = 0x44;
- *code++ = src;
-
- for (;startpix<endpix;startpix++)
- {
- if (startpix >= viewheight)
- break; // off the bottom of the view area
- if (startpix < 0)
- continue; // not into the view area
-
- //
- // mov [es:di+heightofs],al
- //
- *code++ = 0x26;
- *code++ = 0x88;
- *code++ = 0x85;
- *((unsigned far *)code)++ = startpix*SCREENBWIDE;
- }
-
- }
-
-//
-// retf
-//
- *code++ = 0xcb;
-
- totalsize = FP_OFF(code);
- MM_GetPtr (finalspot,totalsize);
- _fmemcpy ((byte _seg *)(*finalspot),(byte _seg *)work,totalsize);
-
- return totalsize;
-}
-
-
-/*
-=======================
-=
-= ScaleLine
-=
-= linescale should have the high word set to the segment of the scaler
-=
-=======================
-*/
-
-extern int slinex,slinewidth;
-extern unsigned far *linecmds;
-extern long linescale;
-extern unsigned maskword;
-
-byte mask1,mask2,mask3;
-
-
-void near ScaleLine (void)
-{
-asm mov cx,WORD PTR [linescale+2]
-asm mov es,cx // segment of scaler
-
-asm mov bp,WORD PTR [linecmds]
-asm mov dx,SC_INDEX+1 // to set SC_MAPMASK
-
-asm mov bx,[slinex]
-asm mov di,bx
-asm shr di,2 // X in bytes
-asm add di,[bufferofs]
-asm and bx,3
-asm shl bx,3
-asm add bx,[slinewidth] // bx = (pixel*8+pixwidth)
-asm mov al,BYTE [mapmasks3-1+bx] // -1 because pixwidth of 1 is first
-asm mov ds,WORD PTR [linecmds+2]
-asm or al,al
-asm jz notthreebyte // scale across three bytes
-asm jmp threebyte
-notthreebyte:
-asm mov al,BYTE PTR ss:[mapmasks2-1+bx] // -1 because pixwidth of 1 is first
-asm or al,al
-asm jnz twobyte // scale across two bytes
-
-//
-// one byte scaling
-//
-asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
-asm out dx,al // set map mask register
-
-scalesingle:
-
-asm mov bx,[ds:bp] // table location of rtl to patch
-asm or bx,bx
-asm jz linedone // 0 signals end of segment list
-asm mov bx,[es:bx]
-asm mov dl,[es:bx] // save old value
-asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
-asm mov si,[ds:bp+4] // table location of entry spot
-asm mov ax,[es:si]
-asm mov WORD PTR ss:[linescale],ax // call here to start scaling
-asm mov si,[ds:bp+2] // corrected top of shape for this segment
-asm add bp,6 // next segment list
-
-asm mov ax,SCREENSEG
-asm mov es,ax
-asm call ss:[linescale] // scale the segment of pixels
-
-asm mov es,cx // segment of scaler
-asm mov BYTE PTR es:[bx],dl // unpatch the RETF
-asm jmp scalesingle // do the next segment
-
-
-//
-// done
-//
-linedone:
-asm mov ax,ss
-asm mov ds,ax
-return;
-
-//
-// two byte scaling
-//
-twobyte:
-asm mov ss:[mask2],al
-asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
-asm mov ss:[mask1],al
-
-scaledouble:
-
-asm mov bx,[ds:bp] // table location of rtl to patch
-asm or bx,bx
-asm jz linedone // 0 signals end of segment list
-asm mov bx,[es:bx]
-asm mov cl,[es:bx] // save old value
-asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
-asm mov si,[ds:bp+4] // table location of entry spot
-asm mov ax,[es:si]
-asm mov WORD PTR ss:[linescale],ax // call here to start scaling
-asm mov si,[ds:bp+2] // corrected top of shape for this segment
-asm add bp,6 // next segment list
-
-asm mov ax,SCREENSEG
-asm mov es,ax
-asm mov al,ss:[mask1]
-asm out dx,al // set map mask register
-asm call ss:[linescale] // scale the segment of pixels
-asm inc di
-asm mov al,ss:[mask2]
-asm out dx,al // set map mask register
-asm call ss:[linescale] // scale the segment of pixels
-asm dec di
-
-asm mov es,WORD PTR ss:[linescale+2] // segment of scaler
-asm mov BYTE PTR es:[bx],cl // unpatch the RETF
-asm jmp scaledouble // do the next segment
-
-
-//
-// three byte scaling
-//
-threebyte:
-asm mov ss:[mask3],al
-asm mov al,BYTE PTR ss:[mapmasks2-1+bx] // -1 because pixwidth of 1 is first
-asm mov ss:[mask2],al
-asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
-asm mov ss:[mask1],al
-
-scaletriple:
-
-asm mov bx,[ds:bp] // table location of rtl to patch
-asm or bx,bx
-asm jz linedone // 0 signals end of segment list
-asm mov bx,[es:bx]
-asm mov cl,[es:bx] // save old value
-asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
-asm mov si,[ds:bp+4] // table location of entry spot
-asm mov ax,[es:si]
-asm mov WORD PTR ss:[linescale],ax // call here to start scaling
-asm mov si,[ds:bp+2] // corrected top of shape for this segment
-asm add bp,6 // next segment list
-
-asm mov ax,SCREENSEG
-asm mov es,ax
-asm mov al,ss:[mask1]
-asm out dx,al // set map mask register
-asm call ss:[linescale] // scale the segment of pixels
-asm inc di
-asm mov al,ss:[mask2]
-asm out dx,al // set map mask register
-asm call ss:[linescale] // scale the segment of pixels
-asm inc di
-asm mov al,ss:[mask3]
-asm out dx,al // set map mask register
-asm call ss:[linescale] // scale the segment of pixels
-asm dec di
-asm dec di
-
-asm mov es,WORD PTR ss:[linescale+2] // segment of scaler
-asm mov BYTE PTR es:[bx],cl // unpatch the RETF
-asm jmp scaletriple // do the next segment
-
-
-}
-
-
-/*
-=======================
-=
-= ScaleShape
-=
-= Draws a compiled shape at [scale] pixels high
-=
-= each vertical line of the shape has a pointer to segment data:
-= end of segment pixel*2 (0 terminates line) used to patch rtl in scaler
-= top of virtual line with segment in proper place
-= start of segment pixel*2, used to jsl into compiled scaler
-= <repeat>
-=
-= Setup for call
-= --------------
-= GC_MODE read mode 1, write mode 2
-= GC_COLORDONTCARE set to 0, so all reads from video memory return 0xff
-= GC_INDEX pointing at GC_BITMASK
-=
-=======================
-*/
-
-static long longtemp;
-
-void ScaleShape (int xcenter, int shapenum, unsigned height)
-{
- t_compshape _seg *shape;
- t_compscale _seg *comptable;
- unsigned scale,srcx,stopx,tempx;
- int t;
- unsigned far *cmdptr;
- boolean leftvis,rightvis;
-
-
- shape = PM_GetSpritePage (shapenum);
-
- scale = height>>3; // low three bits are fractional
- if (!scale || scale>maxscale)
- return; // too close or far away
- comptable = scaledirectory[scale];
-
- *(((unsigned *)&linescale)+1)=(unsigned)comptable; // seg of far call
- *(((unsigned *)&linecmds)+1)=(unsigned)shape; // seg of shape
-
-//
-// scale to the left (from pixel 31 to shape->leftpix)
-//
- srcx = 32;
- slinex = xcenter;
- stopx = shape->leftpix;
- cmdptr = &shape->dataofs[31-stopx];
-
- while ( --srcx >=stopx && slinex>0)
- {
- (unsigned)linecmds = *cmdptr--;
- if ( !(slinewidth = comptable->width[srcx]) )
- continue;
-
- if (slinewidth == 1)
- {
- slinex--;
- if (slinex<viewwidth)
- {
- if (wallheight[slinex] >= height)
- continue; // obscured by closer wall
- ScaleLine ();
- }
- continue;
- }
-
- //
- // handle multi pixel lines
- //
- if (slinex>viewwidth)
- {
- slinex -= slinewidth;
- slinewidth = viewwidth-slinex;
- if (slinewidth<1)
- continue; // still off the right side
- }
- else
- {
- if (slinewidth>slinex)
- slinewidth = slinex;
- slinex -= slinewidth;
- }
-
-
- leftvis = (wallheight[slinex] < height);
- rightvis = (wallheight[slinex+slinewidth-1] < height);
-
- if (leftvis)
- {
- if (rightvis)
- ScaleLine ();
- else
- {
- while (wallheight[slinex+slinewidth-1] >= height)
- slinewidth--;
- ScaleLine ();
- }
- }
- else
- {
- if (!rightvis)
- continue; // totally obscured
-
- while (wallheight[slinex] >= height)
- {
- slinex++;
- slinewidth--;
- }
- ScaleLine ();
- break; // the rest of the shape is gone
- }
- }
-
-
-//
-// scale to the right
-//
- slinex = xcenter;
- stopx = shape->rightpix;
- if (shape->leftpix<31)
- {
- srcx = 31;
- cmdptr = &shape->dataofs[32-shape->leftpix];
- }
- else
- {
- srcx = shape->leftpix-1;
- cmdptr = &shape->dataofs[0];
- }
- slinewidth = 0;
-
- while ( ++srcx <= stopx && (slinex+=slinewidth)<viewwidth)
- {
- (unsigned)linecmds = *cmdptr++;
- if ( !(slinewidth = comptable->width[srcx]) )
- continue;
-
- if (slinewidth == 1)
- {
- if (slinex>=0 && wallheight[slinex] < height)
- {
- ScaleLine ();
- }
- continue;
- }
-
- //
- // handle multi pixel lines
- //
- if (slinex<0)
- {
- if (slinewidth <= -slinex)
- continue; // still off the left edge
-
- slinewidth += slinex;
- slinex = 0;
- }
- else
- {
- if (slinex + slinewidth > viewwidth)
- slinewidth = viewwidth-slinex;
- }
-
-
- leftvis = (wallheight[slinex] < height);
- rightvis = (wallheight[slinex+slinewidth-1] < height);
-
- if (leftvis)
- {
- if (rightvis)
- {
- ScaleLine ();
- }
- else
- {
- while (wallheight[slinex+slinewidth-1] >= height)
- slinewidth--;
- ScaleLine ();
- break; // the rest of the shape is gone
- }
- }
- else
- {
- if (rightvis)
- {
- while (wallheight[slinex] >= height)
- {
- slinex++;
- slinewidth--;
- }
- ScaleLine ();
- }
- else
- continue; // totally obscured
- }
- }
-}
-
-
-
-/*
-=======================
-=
-= SimpleScaleShape
-=
-= NO CLIPPING, height in pixels
-=
-= Draws a compiled shape at [scale] pixels high
-=
-= each vertical line of the shape has a pointer to segment data:
-= end of segment pixel*2 (0 terminates line) used to patch rtl in scaler
-= top of virtual line with segment in proper place
-= start of segment pixel*2, used to jsl into compiled scaler
-= <repeat>
-=
-= Setup for call
-= --------------
-= GC_MODE read mode 1, write mode 2
-= GC_COLORDONTCARE set to 0, so all reads from video memory return 0xff
-= GC_INDEX pointing at GC_BITMASK
-=
-=======================
-*/
-
-void SimpleScaleShape (int xcenter, int shapenum, unsigned height)
-{
- t_compshape _seg *shape;
- t_compscale _seg *comptable;
- unsigned scale,srcx,stopx,tempx;
- int t;
- unsigned far *cmdptr;
- boolean leftvis,rightvis;
-
-
- shape = PM_GetSpritePage (shapenum);
-
- scale = height>>1;
- comptable = scaledirectory[scale];
-
- *(((unsigned *)&linescale)+1)=(unsigned)comptable; // seg of far call
- *(((unsigned *)&linecmds)+1)=(unsigned)shape; // seg of shape
-
-//
-// scale to the left (from pixel 31 to shape->leftpix)
-//
- srcx = 32;
- slinex = xcenter;
- stopx = shape->leftpix;
- cmdptr = &shape->dataofs[31-stopx];
-
- while ( --srcx >=stopx )
- {
- (unsigned)linecmds = *cmdptr--;
- if ( !(slinewidth = comptable->width[srcx]) )
- continue;
-
- slinex -= slinewidth;
- ScaleLine ();
- }
-
-
-//
-// scale to the right
-//
- slinex = xcenter;
- stopx = shape->rightpix;
- if (shape->leftpix<31)
- {
- srcx = 31;
- cmdptr = &shape->dataofs[32-shape->leftpix];
- }
- else
- {
- srcx = shape->leftpix-1;
- cmdptr = &shape->dataofs[0];
- }
- slinewidth = 0;
-
- while ( ++srcx <= stopx )
- {
- (unsigned)linecmds = *cmdptr++;
- if ( !(slinewidth = comptable->width[srcx]) )
- continue;
-
- ScaleLine ();
- slinex+=slinewidth;
- }
-}
-
-
-
-
-//
-// bit mask tables for drawing scaled strips up to eight pixels wide
-//
-// down here so the STUPID inline assembler doesn't get confused!
-//
-
-
-byte mapmasks1[4][8] = {
-{1 ,3 ,7 ,15,15,15,15,15},
-{2 ,6 ,14,14,14,14,14,14},
-{4 ,12,12,12,12,12,12,12},
-{8 ,8 ,8 ,8 ,8 ,8 ,8 ,8} };
-
-byte mapmasks2[4][8] = {
-{0 ,0 ,0 ,0 ,1 ,3 ,7 ,15},
-{0 ,0 ,0 ,1 ,3 ,7 ,15,15},
-{0 ,0 ,1 ,3 ,7 ,15,15,15},
-{0 ,1 ,3 ,7 ,15,15,15,15} };
-
-byte mapmasks3[4][8] = {
-{0 ,0 ,0 ,0 ,0 ,0 ,0 ,0},
-{0 ,0 ,0 ,0 ,0 ,0 ,0 ,1},
-{0 ,0 ,0 ,0 ,0 ,0 ,1 ,3},
-{0 ,0 ,0 ,0 ,0 ,1 ,3 ,7} };
-
-
-unsigned wordmasks[8][8] = {
-{0x0080,0x00c0,0x00e0,0x00f0,0x00f8,0x00fc,0x00fe,0x00ff},
-{0x0040,0x0060,0x0070,0x0078,0x007c,0x007e,0x007f,0x807f},
-{0x0020,0x0030,0x0038,0x003c,0x003e,0x003f,0x803f,0xc03f},
-{0x0010,0x0018,0x001c,0x001e,0x001f,0x801f,0xc01f,0xe01f},
-{0x0008,0x000c,0x000e,0x000f,0x800f,0xc00f,0xe00f,0xf00f},
-{0x0004,0x0006,0x0007,0x8007,0xc007,0xe007,0xf007,0xf807},
-{0x0002,0x0003,0x8003,0xc003,0xe003,0xf003,0xf803,0xfc03},
-{0x0001,0x8001,0xc001,0xe001,0xf001,0xf801,0xfc01,0xfe01} };
-
-int slinex,slinewidth;
-unsigned far *linecmds;
-long linescale;
-unsigned maskword;
-
--- a/WOLFSRC/WL_STATE.C
+++ /dev/null
@@ -1,1480 +1,0 @@
-// WL_STATE.C
-
-#include "WL_DEF.H"
-#pragma hdrstop
-
-/*
-=============================================================================
-
- LOCAL CONSTANTS
-
-=============================================================================
-*/
-
-
-/*
-=============================================================================
-
- GLOBAL VARIABLES
-
-=============================================================================
-*/
-
-
-dirtype opposite[9] =
- {west,southwest,south,southeast,east,northeast,north,northwest,nodir};
-
-dirtype diagonal[9][9] =
-{
-/* east */ {nodir,nodir,northeast,nodir,nodir,nodir,southeast,nodir,nodir},
- {nodir,nodir,nodir,nodir,nodir,nodir,nodir,nodir,nodir},
-/* north */ {northeast,nodir,nodir,nodir,northwest,nodir,nodir,nodir,nodir},
- {nodir,nodir,nodir,nodir,nodir,nodir,nodir,nodir,nodir},
-/* west */ {nodir,nodir,northwest,nodir,nodir,nodir,southwest,nodir,nodir},
- {nodir,nodir,nodir,nodir,nodir,nodir,nodir,nodir,nodir},
-/* south */ {southeast,nodir,nodir,nodir,southwest,nodir,nodir,nodir,nodir},
- {nodir,nodir,nodir,nodir,nodir,nodir,nodir,nodir,nodir},
- {nodir,nodir,nodir,nodir,nodir,nodir,nodir,nodir,nodir}
-};
-
-
-
-void SpawnNewObj (unsigned tilex, unsigned tiley, statetype *state);
-void NewState (objtype *ob, statetype *state);
-
-boolean TryWalk (objtype *ob);
-void MoveObj (objtype *ob, long move);
-
-void KillActor (objtype *ob);
-void DamageActor (objtype *ob, unsigned damage);
-
-boolean CheckLine (objtype *ob);
-void FirstSighting (objtype *ob);
-boolean CheckSight (objtype *ob);
-
-/*
-=============================================================================
-
- LOCAL VARIABLES
-
-=============================================================================
-*/
-
-
-
-//===========================================================================
-
-
-/*
-===================
-=
-= SpawnNewObj
-=
-= Spaws a new actor at the given TILE coordinates, with the given state, and
-= the given size in GLOBAL units.
-=
-= new = a pointer to an initialized new actor
-=
-===================
-*/
-
-void SpawnNewObj (unsigned tilex, unsigned tiley, statetype *state)
-{
- GetNewActor ();
- new->state = state;
- if (state->tictime)
- new->ticcount = US_RndT () % state->tictime;
- else
- new->ticcount = 0;
-
- new->tilex = tilex;
- new->tiley = tiley;
- new->x = ((long)tilex<<TILESHIFT)+TILEGLOBAL/2;
- new->y = ((long)tiley<<TILESHIFT)+TILEGLOBAL/2;
- new->dir = nodir;
-
- actorat[tilex][tiley] = new;
- new->areanumber =
- *(mapsegs[0] + farmapylookup[new->tiley]+new->tilex) - AREATILE;
-}
-
-
-
-/*
-===================
-=
-= NewState
-=
-= Changes ob to a new state, setting ticcount to the max for that state
-=
-===================
-*/
-
-void NewState (objtype *ob, statetype *state)
-{
- ob->state = state;
- ob->ticcount = state->tictime;
-}
-
-
-
-/*
-=============================================================================
-
- ENEMY TILE WORLD MOVEMENT CODE
-
-=============================================================================
-*/
-
-
-/*
-==================================
-=
-= TryWalk
-=
-= Attempts to move ob in its current (ob->dir) direction.
-=
-= If blocked by either a wall or an actor returns FALSE
-=
-= If move is either clear or blocked only by a door, returns TRUE and sets
-=
-= ob->tilex = new destination
-= ob->tiley
-= ob->areanumber = the floor tile number (0-(NUMAREAS-1)) of destination
-= ob->distance = TILEGLOBAl, or -doornumber if a door is blocking the way
-=
-= If a door is in the way, an OpenDoor call is made to start it opening.
-= The actor code should wait until
-= doorobjlist[-ob->distance].action = dr_open, meaning the door has been
-= fully opened
-=
-==================================
-*/
-
-#define CHECKDIAG(x,y) \
-{ \
- temp=(unsigned)actorat[x][y]; \
- if (temp) \
- { \
- if (temp<256) \
- return false; \
- if (((objtype *)temp)->flags&FL_SHOOTABLE) \
- return false; \
- } \
-}
-
-#define CHECKSIDE(x,y) \
-{ \
- temp=(unsigned)actorat[x][y]; \
- if (temp) \
- { \
- if (temp<128) \
- return false; \
- if (temp<256) \
- doornum = temp&63; \
- else if (((objtype *)temp)->flags&FL_SHOOTABLE)\
- return false; \
- } \
-}
-
-
-boolean TryWalk (objtype *ob)
-{
- int doornum;
- unsigned temp;
-
- doornum = -1;
-
- if (ob->obclass == inertobj)
- {
- switch (ob->dir)
- {
- case north:
- ob->tiley--;
- break;
-
- case northeast:
- ob->tilex++;
- ob->tiley--;
- break;
-
- case east:
- ob->tilex++;
- break;
-
- case southeast:
- ob->tilex++;
- ob->tiley++;
- break;
-
- case south:
- ob->tiley++;
- break;
-
- case southwest:
- ob->tilex--;
- ob->tiley++;
- break;
-
- case west:
- ob->tilex--;
- break;
-
- case northwest:
- ob->tilex--;
- ob->tiley--;
- break;
- }
- }
- else
- switch (ob->dir)
- {
- case north:
- if (ob->obclass == dogobj || ob->obclass == fakeobj)
- {
- CHECKDIAG(ob->tilex,ob->tiley-1);
- }
- else
- {
- CHECKSIDE(ob->tilex,ob->tiley-1);
- }
- ob->tiley--;
- break;
-
- case northeast:
- CHECKDIAG(ob->tilex+1,ob->tiley-1);
- CHECKDIAG(ob->tilex+1,ob->tiley);
- CHECKDIAG(ob->tilex,ob->tiley-1);
- ob->tilex++;
- ob->tiley--;
- break;
-
- case east:
- if (ob->obclass == dogobj || ob->obclass == fakeobj)
- {
- CHECKDIAG(ob->tilex+1,ob->tiley);
- }
- else
- {
- CHECKSIDE(ob->tilex+1,ob->tiley);
- }
- ob->tilex++;
- break;
-
- case southeast:
- CHECKDIAG(ob->tilex+1,ob->tiley+1);
- CHECKDIAG(ob->tilex+1,ob->tiley);
- CHECKDIAG(ob->tilex,ob->tiley+1);
- ob->tilex++;
- ob->tiley++;
- break;
-
- case south:
- if (ob->obclass == dogobj || ob->obclass == fakeobj)
- {
- CHECKDIAG(ob->tilex,ob->tiley+1);
- }
- else
- {
- CHECKSIDE(ob->tilex,ob->tiley+1);
- }
- ob->tiley++;
- break;
-
- case southwest:
- CHECKDIAG(ob->tilex-1,ob->tiley+1);
- CHECKDIAG(ob->tilex-1,ob->tiley);
- CHECKDIAG(ob->tilex,ob->tiley+1);
- ob->tilex--;
- ob->tiley++;
- break;
-
- case west:
- if (ob->obclass == dogobj || ob->obclass == fakeobj)
- {
- CHECKDIAG(ob->tilex-1,ob->tiley);
- }
- else
- {
- CHECKSIDE(ob->tilex-1,ob->tiley);
- }
- ob->tilex--;
- break;
-
- case northwest:
- CHECKDIAG(ob->tilex-1,ob->tiley-1);
- CHECKDIAG(ob->tilex-1,ob->tiley);
- CHECKDIAG(ob->tilex,ob->tiley-1);
- ob->tilex--;
- ob->tiley--;
- break;
-
- case nodir:
- return false;
-
- default:
- Quit ("Walk: Bad dir");
- }
-
- if (doornum != -1)
- {
- OpenDoor (doornum);
- ob->distance = -doornum-1;
- return true;
- }
-
-
- ob->areanumber =
- *(mapsegs[0] + farmapylookup[ob->tiley]+ob->tilex) - AREATILE;
-
- ob->distance = TILEGLOBAL;
- return true;
-}
-
-
-
-/*
-==================================
-=
-= SelectDodgeDir
-=
-= Attempts to choose and initiate a movement for ob that sends it towards
-= the player while dodging
-=
-= If there is no possible move (ob is totally surrounded)
-=
-= ob->dir = nodir
-=
-= Otherwise
-=
-= ob->dir = new direction to follow
-= ob->distance = TILEGLOBAL or -doornumber
-= ob->tilex = new destination
-= ob->tiley
-= ob->areanumber = the floor tile number (0-(NUMAREAS-1)) of destination
-=
-==================================
-*/
-
-void SelectDodgeDir (objtype *ob)
-{
- int deltax,deltay,i;
- unsigned absdx,absdy;
- dirtype dirtry[5];
- dirtype turnaround,tdir;
-
- if (ob->flags & FL_FIRSTATTACK)
- {
- //
- // turning around is only ok the very first time after noticing the
- // player
- //
- turnaround = nodir;
- ob->flags &= ~FL_FIRSTATTACK;
- }
- else
- turnaround=opposite[ob->dir];
-
- deltax = player->tilex - ob->tilex;
- deltay = player->tiley - ob->tiley;
-
-//
-// arange 5 direction choices in order of preference
-// the four cardinal directions plus the diagonal straight towards
-// the player
-//
-
- if (deltax>0)
- {
- dirtry[1]= east;
- dirtry[3]= west;
- }
- else
- {
- dirtry[1]= west;
- dirtry[3]= east;
- }
-
- if (deltay>0)
- {
- dirtry[2]= south;
- dirtry[4]= north;
- }
- else
- {
- dirtry[2]= north;
- dirtry[4]= south;
- }
-
-//
-// randomize a bit for dodging
-//
- absdx = abs(deltax);
- absdy = abs(deltay);
-
- if (absdx > absdy)
- {
- tdir = dirtry[1];
- dirtry[1] = dirtry[2];
- dirtry[2] = tdir;
- tdir = dirtry[3];
- dirtry[3] = dirtry[4];
- dirtry[4] = tdir;
- }
-
- if (US_RndT() < 128)
- {
- tdir = dirtry[1];
- dirtry[1] = dirtry[2];
- dirtry[2] = tdir;
- tdir = dirtry[3];
- dirtry[3] = dirtry[4];
- dirtry[4] = tdir;
- }
-
- dirtry[0] = diagonal [ dirtry[1] ] [ dirtry[2] ];
-
-//
-// try the directions util one works
-//
- for (i=0;i<5;i++)
- {
- if ( dirtry[i] == nodir || dirtry[i] == turnaround)
- continue;
-
- ob->dir = dirtry[i];
- if (TryWalk(ob))
- return;
- }
-
-//
-// turn around only as a last resort
-//
- if (turnaround != nodir)
- {
- ob->dir = turnaround;
-
- if (TryWalk(ob))
- return;
- }
-
- ob->dir = nodir;
-}
-
-
-/*
-============================
-=
-= SelectChaseDir
-=
-= As SelectDodgeDir, but doesn't try to dodge
-=
-============================
-*/
-
-void SelectChaseDir (objtype *ob)
-{
- int deltax,deltay,i;
- dirtype d[3];
- dirtype tdir, olddir, turnaround;
-
-
- olddir=ob->dir;
- turnaround=opposite[olddir];
-
- deltax=player->tilex - ob->tilex;
- deltay=player->tiley - ob->tiley;
-
- d[1]=nodir;
- d[2]=nodir;
-
- if (deltax>0)
- d[1]= east;
- else if (deltax<0)
- d[1]= west;
- if (deltay>0)
- d[2]=south;
- else if (deltay<0)
- d[2]=north;
-
- if (abs(deltay)>abs(deltax))
- {
- tdir=d[1];
- d[1]=d[2];
- d[2]=tdir;
- }
-
- if (d[1]==turnaround)
- d[1]=nodir;
- if (d[2]==turnaround)
- d[2]=nodir;
-
-
- if (d[1]!=nodir)
- {
- ob->dir=d[1];
- if (TryWalk(ob))
- return; /*either moved forward or attacked*/
- }
-
- if (d[2]!=nodir)
- {
- ob->dir=d[2];
- if (TryWalk(ob))
- return;
- }
-
-/* there is no direct path to the player, so pick another direction */
-
- if (olddir!=nodir)
- {
- ob->dir=olddir;
- if (TryWalk(ob))
- return;
- }
-
- if (US_RndT()>128) /*randomly determine direction of search*/
- {
- for (tdir=north;tdir<=west;tdir++)
- {
- if (tdir!=turnaround)
- {
- ob->dir=tdir;
- if ( TryWalk(ob) )
- return;
- }
- }
- }
- else
- {
- for (tdir=west;tdir>=north;tdir--)
- {
- if (tdir!=turnaround)
- {
- ob->dir=tdir;
- if ( TryWalk(ob) )
- return;
- }
- }
- }
-
- if (turnaround != nodir)
- {
- ob->dir=turnaround;
- if (ob->dir != nodir)
- {
- if ( TryWalk(ob) )
- return;
- }
- }
-
- ob->dir = nodir; // can't move
-}
-
-
-/*
-============================
-=
-= SelectRunDir
-=
-= Run Away from player
-=
-============================
-*/
-
-void SelectRunDir (objtype *ob)
-{
- int deltax,deltay,i;
- dirtype d[3];
- dirtype tdir, olddir, turnaround;
-
-
- deltax=player->tilex - ob->tilex;
- deltay=player->tiley - ob->tiley;
-
- if (deltax<0)
- d[1]= east;
- else
- d[1]= west;
- if (deltay<0)
- d[2]=south;
- else
- d[2]=north;
-
- if (abs(deltay)>abs(deltax))
- {
- tdir=d[1];
- d[1]=d[2];
- d[2]=tdir;
- }
-
- ob->dir=d[1];
- if (TryWalk(ob))
- return; /*either moved forward or attacked*/
-
- ob->dir=d[2];
- if (TryWalk(ob))
- return;
-
-/* there is no direct path to the player, so pick another direction */
-
- if (US_RndT()>128) /*randomly determine direction of search*/
- {
- for (tdir=north;tdir<=west;tdir++)
- {
- ob->dir=tdir;
- if ( TryWalk(ob) )
- return;
- }
- }
- else
- {
- for (tdir=west;tdir>=north;tdir--)
- {
- ob->dir=tdir;
- if ( TryWalk(ob) )
- return;
- }
- }
-
- ob->dir = nodir; // can't move
-}
-
-
-/*
-=================
-=
-= MoveObj
-=
-= Moves ob be move global units in ob->dir direction
-= Actors are not allowed to move inside the player
-= Does NOT check to see if the move is tile map valid
-=
-= ob->x = adjusted for new position
-= ob->y
-=
-=================
-*/
-
-void MoveObj (objtype *ob, long move)
-{
- long deltax,deltay;
-
- switch (ob->dir)
- {
- case north:
- ob->y -= move;
- break;
- case northeast:
- ob->x += move;
- ob->y -= move;
- break;
- case east:
- ob->x += move;
- break;
- case southeast:
- ob->x += move;
- ob->y += move;
- break;
- case south:
- ob->y += move;
- break;
- case southwest:
- ob->x -= move;
- ob->y += move;
- break;
- case west:
- ob->x -= move;
- break;
- case northwest:
- ob->x -= move;
- ob->y -= move;
- break;
-
- case nodir:
- return;
-
- default:
- Quit ("MoveObj: bad dir!");
- }
-
-//
-// check to make sure it's not on top of player
-//
- if (areabyplayer[ob->areanumber])
- {
- deltax = ob->x - player->x;
- if (deltax < -MINACTORDIST || deltax > MINACTORDIST)
- goto moveok;
- deltay = ob->y - player->y;
- if (deltay < -MINACTORDIST || deltay > MINACTORDIST)
- goto moveok;
-
- if (ob->obclass == ghostobj || ob->obclass == spectreobj)
- TakeDamage (tics*2,ob);
-
- //
- // back up
- //
- switch (ob->dir)
- {
- case north:
- ob->y += move;
- break;
- case northeast:
- ob->x -= move;
- ob->y += move;
- break;
- case east:
- ob->x -= move;
- break;
- case southeast:
- ob->x -= move;
- ob->y -= move;
- break;
- case south:
- ob->y -= move;
- break;
- case southwest:
- ob->x += move;
- ob->y -= move;
- break;
- case west:
- ob->x += move;
- break;
- case northwest:
- ob->x += move;
- ob->y += move;
- break;
-
- case nodir:
- return;
- }
- return;
- }
-moveok:
- ob->distance -=move;
-}
-
-/*
-=============================================================================
-
- STUFF
-
-=============================================================================
-*/
-
-/*
-===============
-=
-= DropItem
-=
-= Tries to drop a bonus item somewhere in the tiles surrounding the
-= given tilex/tiley
-=
-===============
-*/
-
-void DropItem (stat_t itemtype, int tilex, int tiley)
-{
- int x,y,xl,xh,yl,yh;
-
-//
-// find a free spot to put it in
-//
- if (!actorat[tilex][tiley])
- {
- PlaceItemType (itemtype, tilex,tiley);
- return;
- }
-
- xl = tilex-1;
- xh = tilex+1;
- yl = tiley-1;
- yh = tiley+1;
-
- for (x=xl ; x<= xh ; x++)
- for (y=yl ; y<= yh ; y++)
- if (!actorat[x][y])
- {
- PlaceItemType (itemtype, x,y);
- return;
- }
-}
-
-
-
-/*
-===============
-=
-= KillActor
-=
-===============
-*/
-
-void KillActor (objtype *ob)
-{
- int tilex,tiley;
-
- tilex = ob->tilex = ob->x >> TILESHIFT; // drop item on center
- tiley = ob->tiley = ob->y >> TILESHIFT;
-
- switch (ob->obclass)
- {
- case guardobj:
- GivePoints (100);
- NewState (ob,&s_grddie1);
- PlaceItemType (bo_clip2,tilex,tiley);
- break;
-
- case officerobj:
- GivePoints (400);
- NewState (ob,&s_ofcdie1);
- PlaceItemType (bo_clip2,tilex,tiley);
- break;
-
- case mutantobj:
- GivePoints (700);
- NewState (ob,&s_mutdie1);
- PlaceItemType (bo_clip2,tilex,tiley);
- break;
-
- case ssobj:
- GivePoints (500);
- NewState (ob,&s_ssdie1);
- if (gamestate.bestweapon < wp_machinegun)
- PlaceItemType (bo_machinegun,tilex,tiley);
- else
- PlaceItemType (bo_clip2,tilex,tiley);
- break;
-
- case dogobj:
- GivePoints (200);
- NewState (ob,&s_dogdie1);
- break;
-
-#ifndef SPEAR
- case bossobj:
- GivePoints (5000);
- NewState (ob,&s_bossdie1);
- PlaceItemType (bo_key1,tilex,tiley);
- break;
-
- case gretelobj:
- GivePoints (5000);
- NewState (ob,&s_greteldie1);
- PlaceItemType (bo_key1,tilex,tiley);
- break;
-
- case giftobj:
- GivePoints (5000);
- gamestate.killx = player->x;
- gamestate.killy = player->y;
- NewState (ob,&s_giftdie1);
- break;
-
- case fatobj:
- GivePoints (5000);
- gamestate.killx = player->x;
- gamestate.killy = player->y;
- NewState (ob,&s_fatdie1);
- break;
-
- case schabbobj:
- GivePoints (5000);
- gamestate.killx = player->x;
- gamestate.killy = player->y;
- NewState (ob,&s_schabbdie1);
- A_DeathScream(ob);
- break;
- case fakeobj:
- GivePoints (2000);
- NewState (ob,&s_fakedie1);
- break;
-
- case mechahitlerobj:
- GivePoints (5000);
- NewState (ob,&s_mechadie1);
- break;
- case realhitlerobj:
- GivePoints (5000);
- gamestate.killx = player->x;
- gamestate.killy = player->y;
- NewState (ob,&s_hitlerdie1);
- A_DeathScream(ob);
- break;
-#else
- case spectreobj:
- GivePoints (200);
- NewState (ob,&s_spectredie1);
- break;
-
- case angelobj:
- GivePoints (5000);
- NewState (ob,&s_angeldie1);
- break;
-
- case transobj:
- GivePoints (5000);
- NewState (ob,&s_transdie0);
- PlaceItemType (bo_key1,tilex,tiley);
- break;
-
- case uberobj:
- GivePoints (5000);
- NewState (ob,&s_uberdie0);
- PlaceItemType (bo_key1,tilex,tiley);
- break;
-
- case willobj:
- GivePoints (5000);
- NewState (ob,&s_willdie1);
- PlaceItemType (bo_key1,tilex,tiley);
- break;
-
- case deathobj:
- GivePoints (5000);
- NewState (ob,&s_deathdie1);
- PlaceItemType (bo_key1,tilex,tiley);
- break;
-#endif
- }
-
- gamestate.killcount++;
- ob->flags &= ~FL_SHOOTABLE;
- actorat[ob->tilex][ob->tiley] = NULL;
- ob->flags |= FL_NONMARK;
-}
-
-
-
-/*
-===================
-=
-= DamageActor
-=
-= Called when the player succesfully hits an enemy.
-=
-= Does damage points to enemy ob, either putting it into a stun frame or
-= killing it.
-=
-===================
-*/
-
-void DamageActor (objtype *ob, unsigned damage)
-{
- madenoise = true;
-
-//
-// do double damage if shooting a non attack mode actor
-//
- if ( !(ob->flags & FL_ATTACKMODE) )
- damage <<= 1;
-
- ob->hitpoints -= damage;
-
- if (ob->hitpoints<=0)
- KillActor (ob);
- else
- {
- if (! (ob->flags & FL_ATTACKMODE) )
- FirstSighting (ob); // put into combat mode
-
- switch (ob->obclass) // dogs only have one hit point
- {
- case guardobj:
- if (ob->hitpoints&1)
- NewState (ob,&s_grdpain);
- else
- NewState (ob,&s_grdpain1);
- break;
-
- case officerobj:
- if (ob->hitpoints&1)
- NewState (ob,&s_ofcpain);
- else
- NewState (ob,&s_ofcpain1);
- break;
-
- case mutantobj:
- if (ob->hitpoints&1)
- NewState (ob,&s_mutpain);
- else
- NewState (ob,&s_mutpain1);
- break;
-
- case ssobj:
- if (ob->hitpoints&1)
- NewState (ob,&s_sspain);
- else
- NewState (ob,&s_sspain1);
-
- break;
-
- }
- }
-}
-
-/*
-=============================================================================
-
- CHECKSIGHT
-
-=============================================================================
-*/
-
-
-/*
-=====================
-=
-= CheckLine
-=
-= Returns true if a straight line between the player and ob is unobstructed
-=
-=====================
-*/
-
-boolean CheckLine (objtype *ob)
-{
- int x1,y1,xt1,yt1,x2,y2,xt2,yt2;
- int x,y;
- int xdist,ydist,xstep,ystep;
- int temp;
- int partial,delta;
- long ltemp;
- int xfrac,yfrac,deltafrac;
- unsigned value,intercept;
-
- x1 = ob->x >> UNSIGNEDSHIFT; // 1/256 tile precision
- y1 = ob->y >> UNSIGNEDSHIFT;
- xt1 = x1 >> 8;
- yt1 = y1 >> 8;
-
- x2 = plux;
- y2 = pluy;
- xt2 = player->tilex;
- yt2 = player->tiley;
-
-
- xdist = abs(xt2-xt1);
-
- if (xdist > 0)
- {
- if (xt2 > xt1)
- {
- partial = 256-(x1&0xff);
- xstep = 1;
- }
- else
- {
- partial = x1&0xff;
- xstep = -1;
- }
-
- deltafrac = abs(x2-x1);
- delta = y2-y1;
- ltemp = ((long)delta<<8)/deltafrac;
- if (ltemp > 0x7fffl)
- ystep = 0x7fff;
- else if (ltemp < -0x7fffl)
- ystep = -0x7fff;
- else
- ystep = ltemp;
- yfrac = y1 + (((long)ystep*partial) >>8);
-
- x = xt1+xstep;
- xt2 += xstep;
- do
- {
- y = yfrac>>8;
- yfrac += ystep;
-
- value = (unsigned)tilemap[x][y];
- x += xstep;
-
- if (!value)
- continue;
-
- if (value<128 || value>256)
- return false;
-
- //
- // see if the door is open enough
- //
- value &= ~0x80;
- intercept = yfrac-ystep/2;
-
- if (intercept>doorposition[value])
- return false;
-
- } while (x != xt2);
- }
-
- ydist = abs(yt2-yt1);
-
- if (ydist > 0)
- {
- if (yt2 > yt1)
- {
- partial = 256-(y1&0xff);
- ystep = 1;
- }
- else
- {
- partial = y1&0xff;
- ystep = -1;
- }
-
- deltafrac = abs(y2-y1);
- delta = x2-x1;
- ltemp = ((long)delta<<8)/deltafrac;
- if (ltemp > 0x7fffl)
- xstep = 0x7fff;
- else if (ltemp < -0x7fffl)
- xstep = -0x7fff;
- else
- xstep = ltemp;
- xfrac = x1 + (((long)xstep*partial) >>8);
-
- y = yt1 + ystep;
- yt2 += ystep;
- do
- {
- x = xfrac>>8;
- xfrac += xstep;
-
- value = (unsigned)tilemap[x][y];
- y += ystep;
-
- if (!value)
- continue;
-
- if (value<128 || value>256)
- return false;
-
- //
- // see if the door is open enough
- //
- value &= ~0x80;
- intercept = xfrac-xstep/2;
-
- if (intercept>doorposition[value])
- return false;
- } while (y != yt2);
- }
-
- return true;
-}
-
-
-
-/*
-================
-=
-= CheckSight
-=
-= Checks a straight line between player and current object
-=
-= If the sight is ok, check alertness and angle to see if they notice
-=
-= returns true if the player has been spoted
-=
-================
-*/
-
-#define MINSIGHT 0x18000l
-
-boolean CheckSight (objtype *ob)
-{
- long deltax,deltay;
-
-//
-// don't bother tracing a line if the area isn't connected to the player's
-//
- if (!areabyplayer[ob->areanumber])
- return false;
-
-//
-// if the player is real close, sight is automatic
-//
- deltax = player->x - ob->x;
- deltay = player->y - ob->y;
-
- if (deltax > -MINSIGHT && deltax < MINSIGHT
- && deltay > -MINSIGHT && deltay < MINSIGHT)
- return true;
-
-//
-// see if they are looking in the right direction
-//
- switch (ob->dir)
- {
- case north:
- if (deltay > 0)
- return false;
- break;
-
- case east:
- if (deltax < 0)
- return false;
- break;
-
- case south:
- if (deltay < 0)
- return false;
- break;
-
- case west:
- if (deltax > 0)
- return false;
- break;
- }
-
-//
-// trace a line to check for blocking tiles (corners)
-//
- return CheckLine (ob);
-
-}
-
-
-
-/*
-===============
-=
-= FirstSighting
-=
-= Puts an actor into attack mode and possibly reverses the direction
-= if the player is behind it
-=
-===============
-*/
-
-void FirstSighting (objtype *ob)
-{
-//
-// react to the player
-//
- switch (ob->obclass)
- {
- case guardobj:
- PlaySoundLocActor(HALTSND,ob);
- NewState (ob,&s_grdchase1);
- ob->speed *= 3; // go faster when chasing player
- break;
-
- case officerobj:
- PlaySoundLocActor(SPIONSND,ob);
- NewState (ob,&s_ofcchase1);
- ob->speed *= 5; // go faster when chasing player
- break;
-
- case mutantobj:
- NewState (ob,&s_mutchase1);
- ob->speed *= 3; // go faster when chasing player
- break;
-
- case ssobj:
- PlaySoundLocActor(SCHUTZADSND,ob);
- NewState (ob,&s_sschase1);
- ob->speed *= 4; // go faster when chasing player
- break;
-
- case dogobj:
- PlaySoundLocActor(DOGBARKSND,ob);
- NewState (ob,&s_dogchase1);
- ob->speed *= 2; // go faster when chasing player
- break;
-
-#ifndef SPEAR
- case bossobj:
- SD_PlaySound(GUTENTAGSND);
- NewState (ob,&s_bosschase1);
- ob->speed = SPDPATROL*3; // go faster when chasing player
- break;
-
- case gretelobj:
- SD_PlaySound(KEINSND);
- NewState (ob,&s_gretelchase1);
- ob->speed *= 3; // go faster when chasing player
- break;
-
- case giftobj:
- SD_PlaySound(EINESND);
- NewState (ob,&s_giftchase1);
- ob->speed *= 3; // go faster when chasing player
- break;
-
- case fatobj:
- SD_PlaySound(ERLAUBENSND);
- NewState (ob,&s_fatchase1);
- ob->speed *= 3; // go faster when chasing player
- break;
-
- case schabbobj:
- SD_PlaySound(SCHABBSHASND);
- NewState (ob,&s_schabbchase1);
- ob->speed *= 3; // go faster when chasing player
- break;
-
- case fakeobj:
- SD_PlaySound(TOT_HUNDSND);
- NewState (ob,&s_fakechase1);
- ob->speed *= 3; // go faster when chasing player
- break;
-
- case mechahitlerobj:
- SD_PlaySound(DIESND);
- NewState (ob,&s_mechachase1);
- ob->speed *= 3; // go faster when chasing player
- break;
-
- case realhitlerobj:
- SD_PlaySound(DIESND);
- NewState (ob,&s_hitlerchase1);
- ob->speed *= 5; // go faster when chasing player
- break;
-
- case ghostobj:
- NewState (ob,&s_blinkychase1);
- ob->speed *= 2; // go faster when chasing player
- break;
-#else
-
- case spectreobj:
- SD_PlaySound(GHOSTSIGHTSND);
- NewState (ob,&s_spectrechase1);
- ob->speed = 800; // go faster when chasing player
- break;
-
- case angelobj:
- SD_PlaySound(ANGELSIGHTSND);
- NewState (ob,&s_angelchase1);
- ob->speed = 1536; // go faster when chasing player
- break;
-
- case transobj:
- SD_PlaySound(TRANSSIGHTSND);
- NewState (ob,&s_transchase1);
- ob->speed = 1536; // go faster when chasing player
- break;
-
- case uberobj:
- NewState (ob,&s_uberchase1);
- ob->speed = 3000; // go faster when chasing player
- break;
-
- case willobj:
- SD_PlaySound(WILHELMSIGHTSND);
- NewState (ob,&s_willchase1);
- ob->speed = 2048; // go faster when chasing player
- break;
-
- case deathobj:
- SD_PlaySound(KNIGHTSIGHTSND);
- NewState (ob,&s_deathchase1);
- ob->speed = 2048; // go faster when chasing player
- break;
-
-#endif
- }
-
- if (ob->distance < 0)
- ob->distance = 0; // ignore the door opening command
-
- ob->flags |= FL_ATTACKMODE|FL_FIRSTATTACK;
-}
-
-
-
-/*
-===============
-=
-= SightPlayer
-=
-= Called by actors that ARE NOT chasing the player. If the player
-= is detected (by sight, noise, or proximity), the actor is put into
-= it's combat frame and true is returned.
-=
-= Incorporates a random reaction delay
-=
-===============
-*/
-
-boolean SightPlayer (objtype *ob)
-{
- if (ob->flags & FL_ATTACKMODE)
- Quit ("An actor in ATTACKMODE called SightPlayer!");
-
- if (ob->temp2)
- {
- //
- // count down reaction time
- //
- ob->temp2 -= tics;
- if (ob->temp2 > 0)
- return false;
- ob->temp2 = 0; // time to react
- }
- else
- {
- if (!areabyplayer[ob->areanumber])
- return false;
-
- if (ob->flags & FL_AMBUSH)
- {
- if (!CheckSight (ob))
- return false;
- ob->flags &= ~FL_AMBUSH;
- }
- else
- {
- if (!madenoise && !CheckSight (ob))
- return false;
- }
-
-
- switch (ob->obclass)
- {
- case guardobj:
- ob->temp2 = 1+US_RndT()/4;
- break;
- case officerobj:
- ob->temp2 = 2;
- break;
- case mutantobj:
- ob->temp2 = 1+US_RndT()/6;
- break;
- case ssobj:
- ob->temp2 = 1+US_RndT()/6;
- break;
- case dogobj:
- ob->temp2 = 1+US_RndT()/8;
- break;
-
- case bossobj:
- case schabbobj:
- case fakeobj:
- case mechahitlerobj:
- case realhitlerobj:
- case gretelobj:
- case giftobj:
- case fatobj:
- case spectreobj:
- case angelobj:
- case transobj:
- case uberobj:
- case willobj:
- case deathobj:
- ob->temp2 = 1;
- break;
- }
- return false;
- }
-
- FirstSighting (ob);
-
- return true;
-}
-
-
--- a/WOLFSRC/WL_TEXT.C
+++ /dev/null
@@ -1,859 +1,0 @@
-// WL_TEXT.C
-
-#include "WL_DEF.H"
-#pragma hdrstop
-
-/*
-=============================================================================
-
-TEXT FORMATTING COMMANDS
-------------------------
-^C<hex digit> Change text color
-^E[enter] End of layout (all pages)
-^G<y>,<x>,<pic>[enter] Draw a graphic and push margins
-^P[enter] start new page, must be the first chars in a layout
-^L<x>,<y>[ENTER] Locate to a specific spot, x in pixels, y in lines
-
-=============================================================================
-*/
-
-/*
-=============================================================================
-
- LOCAL CONSTANTS
-
-=============================================================================
-*/
-
-#define BACKCOLOR 0x11
-
-
-#define WORDLIMIT 80
-#define FONTHEIGHT 10
-#define TOPMARGIN 16
-#define BOTTOMMARGIN 32
-#define LEFTMARGIN 16
-#define RIGHTMARGIN 16
-#define PICMARGIN 8
-#define TEXTROWS ((200-TOPMARGIN-BOTTOMMARGIN)/FONTHEIGHT)
-#define SPACEWIDTH 7
-#define SCREENPIXWIDTH 320
-#define SCREENMID (SCREENPIXWIDTH/2)
-
-/*
-=============================================================================
-
- LOCAL VARIABLES
-
-=============================================================================
-*/
-
-int pagenum,numpages;
-
-unsigned leftmargin[TEXTROWS],rightmargin[TEXTROWS];
-char far *text;
-unsigned rowon;
-
-int picx,picy,picnum,picdelay;
-boolean layoutdone;
-
-//===========================================================================
-
-#ifndef JAPAN
-/*
-=====================
-=
-= RipToEOL
-=
-=====================
-*/
-
-void RipToEOL (void)
-{
- while (*text++ != '\n') // scan to end of line
- ;
-}
-
-
-/*
-=====================
-=
-= ParseNumber
-=
-=====================
-*/
-
-int ParseNumber (void)
-{
- char ch;
- char num[80],*numptr;
-
-//
-// scan until a number is found
-//
- ch = *text;
- while (ch < '0' || ch >'9')
- ch = *++text;
-
-//
-// copy the number out
-//
- numptr = num;
- do
- {
- *numptr++ = ch;
- ch = *++text;
- } while (ch >= '0' && ch <= '9');
- *numptr = 0;
-
- return atoi (num);
-}
-
-
-
-/*
-=====================
-=
-= ParsePicCommand
-=
-= Call with text pointing just after a ^P
-= Upon exit text points to the start of next line
-=
-=====================
-*/
-
-void ParsePicCommand (void)
-{
- picy=ParseNumber();
- picx=ParseNumber();
- picnum=ParseNumber();
- RipToEOL ();
-}
-
-
-void ParseTimedCommand (void)
-{
- picy=ParseNumber();
- picx=ParseNumber();
- picnum=ParseNumber();
- picdelay=ParseNumber();
- RipToEOL ();
-}
-
-
-/*
-=====================
-=
-= TimedPicCommand
-=
-= Call with text pointing just after a ^P
-= Upon exit text points to the start of next line
-=
-=====================
-*/
-
-void TimedPicCommand (void)
-{
- ParseTimedCommand ();
-
-//
-// update the screen, and wait for time delay
-//
- VW_UpdateScreen ();
-
-//
-// wait for time
-//
- TimeCount = 0;
- while (TimeCount < picdelay)
- ;
-
-//
-// draw pic
-//
- VWB_DrawPic (picx&~7,picy,picnum);
-}
-
-
-/*
-=====================
-=
-= HandleCommand
-=
-=====================
-*/
-
-void HandleCommand (void)
-{
- int i,margin,top,bottom;
- int picwidth,picheight,picmid;
-
- switch (toupper(*++text))
- {
- case 'B':
- picy=ParseNumber();
- picx=ParseNumber();
- picwidth=ParseNumber();
- picheight=ParseNumber();
- VWB_Bar(picx,picy,picwidth,picheight,BACKCOLOR);
- RipToEOL();
- break;
- case ';': // comment
- RipToEOL();
- break;
- case 'P': // ^P is start of next page, ^E is end of file
- case 'E':
- layoutdone = true;
- text--; // back up to the '^'
- break;
-
- case 'C': // ^c<hex digit> changes text color
- i = toupper(*++text);
- if (i>='0' && i<='9')
- fontcolor = i-'0';
- else if (i>='A' && i<='F')
- fontcolor = i-'A'+10;
-
- fontcolor *= 16;
- i = toupper(*++text);
- if (i>='0' && i<='9')
- fontcolor += i-'0';
- else if (i>='A' && i<='F')
- fontcolor += i-'A'+10;
- text++;
- break;
-
- case '>':
- px = 160;
- text++;
- break;
-
- case 'L':
- py=ParseNumber();
- rowon = (py-TOPMARGIN)/FONTHEIGHT;
- py = TOPMARGIN+rowon*FONTHEIGHT;
- px=ParseNumber();
- while (*text++ != '\n') // scan to end of line
- ;
- break;
-
- case 'T': // ^Tyyy,xxx,ppp,ttt waits ttt tics, then draws pic
- TimedPicCommand ();
- break;
-
- case 'G': // ^Gyyy,xxx,ppp draws graphic
- ParsePicCommand ();
- VWB_DrawPic (picx&~7,picy,picnum);
- picwidth = pictable[picnum-STARTPICS].width;
- picheight = pictable[picnum-STARTPICS].height;
- //
- // adjust margins
- //
- picmid = picx + picwidth/2;
- if (picmid > SCREENMID)
- margin = picx-PICMARGIN; // new right margin
- else
- margin = picx+picwidth+PICMARGIN; // new left margin
-
- top = (picy-TOPMARGIN)/FONTHEIGHT;
- if (top<0)
- top = 0;
- bottom = (picy+picheight-TOPMARGIN)/FONTHEIGHT;
- if (bottom>=TEXTROWS)
- bottom = TEXTROWS-1;
-
- for (i=top;i<=bottom;i++)
- if (picmid > SCREENMID)
- rightmargin[i] = margin;
- else
- leftmargin[i] = margin;
-
- //
- // adjust this line if needed
- //
- if (px < leftmargin[rowon])
- px = leftmargin[rowon];
- break;
- }
-}
-
-
-/*
-=====================
-=
-= NewLine
-=
-=====================
-*/
-
-void NewLine (void)
-{
- char ch;
-
- if (++rowon == TEXTROWS)
- {
- //
- // overflowed the page, so skip until next page break
- //
- layoutdone = true;
- do
- {
- if (*text == '^')
- {
- ch = toupper(*(text+1));
- if (ch == 'E' || ch == 'P')
- {
- layoutdone = true;
- return;
- }
- }
- text++;
-
- } while (1);
-
- }
- px = leftmargin[rowon];
- py+= FONTHEIGHT;
-}
-
-
-
-/*
-=====================
-=
-= HandleCtrls
-=
-=====================
-*/
-
-void HandleCtrls (void)
-{
- char ch;
-
- ch = *text++; // get the character and advance
-
- if (ch == '\n')
- {
- NewLine ();
- return;
- }
-
-}
-
-
-/*
-=====================
-=
-= HandleWord
-=
-=====================
-*/
-
-void HandleWord (void)
-{
- char word[WORDLIMIT];
- int i,wordindex;
- unsigned wwidth,wheight,newpos;
-
-
- //
- // copy the next word into [word]
- //
- word[0] = *text++;
- wordindex = 1;
- while (*text>32)
- {
- word[wordindex] = *text++;
- if (++wordindex == WORDLIMIT)
- Quit ("PageLayout: Word limit exceeded");
- }
- word[wordindex] = 0; // stick a null at end for C
-
- //
- // see if it fits on this line
- //
- VW_MeasurePropString (word,&wwidth,&wheight);
-
- while (px+wwidth > rightmargin[rowon])
- {
- NewLine ();
- if (layoutdone)
- return; // overflowed page
- }
-
- //
- // print it
- //
- newpos = px+wwidth;
- VWB_DrawPropString (word);
- px = newpos;
-
- //
- // suck up any extra spaces
- //
- while (*text == ' ')
- {
- px += SPACEWIDTH;
- text++;
- }
-}
-
-/*
-=====================
-=
-= PageLayout
-=
-= Clears the screen, draws the pics on the page, and word wraps the text.
-= Returns a pointer to the terminating command
-=
-=====================
-*/
-
-void PageLayout (boolean shownumber)
-{
- int i,oldfontcolor;
- char ch;
-
- oldfontcolor = fontcolor;
-
- fontcolor = 0;
-
-//
-// clear the screen
-//
- VWB_Bar (0,0,320,200,BACKCOLOR);
- VWB_DrawPic (0,0,H_TOPWINDOWPIC);
- VWB_DrawPic (0,8,H_LEFTWINDOWPIC);
- VWB_DrawPic (312,8,H_RIGHTWINDOWPIC);
- VWB_DrawPic (8,176,H_BOTTOMINFOPIC);
-
-
- for (i=0;i<TEXTROWS;i++)
- {
- leftmargin[i] = LEFTMARGIN;
- rightmargin[i] = SCREENPIXWIDTH-RIGHTMARGIN;
- }
-
- px = LEFTMARGIN;
- py = TOPMARGIN;
- rowon = 0;
- layoutdone = false;
-
-//
-// make sure we are starting layout text (^P first command)
-//
- while (*text <= 32)
- text++;
-
- if (*text != '^' || toupper(*++text) != 'P')
- Quit ("PageLayout: Text not headed with ^P");
-
- while (*text++ != '\n')
- ;
-
-
-//
-// process text stream
-//
- do
- {
- ch = *text;
-
- if (ch == '^')
- HandleCommand ();
- else
- if (ch == 9)
- {
- px = (px+8)&0xf8;
- text++;
- }
- else if (ch <= 32)
- HandleCtrls ();
- else
- HandleWord ();
-
- } while (!layoutdone);
-
- pagenum++;
-
- if (shownumber)
- {
- #ifdef SPANISH
- strcpy (str,"Hoja ");
- itoa (pagenum,str2,10);
- strcat (str,str2);
- strcat (str," de ");
- py = 183;
- px = 208;
- #else
- strcpy (str,"pg ");
- itoa (pagenum,str2,10);
- strcat (str,str2);
- strcat (str," of ");
- py = 183;
- px = 213;
- #endif
- itoa (numpages,str2,10);
- strcat (str,str2);
- fontcolor = 0x4f; //12^BACKCOLOR;
-
- VWB_DrawPropString (str);
- }
-
- fontcolor = oldfontcolor;
-}
-
-//===========================================================================
-
-/*
-=====================
-=
-= BackPage
-=
-= Scans for a previous ^P
-=
-=====================
-*/
-
-void BackPage (void)
-{
- pagenum--;
- do
- {
- text--;
- if (*text == '^' && toupper(*(text+1)) == 'P')
- return;
- } while (1);
-}
-
-
-//===========================================================================
-
-
-/*
-=====================
-=
-= CacheLayoutGraphics
-=
-= Scans an entire layout file (until a ^E) marking all graphics used, and
-= counting pages, then caches the graphics in
-=
-=====================
-*/
-void CacheLayoutGraphics (void)
-{
- char far *bombpoint, far *textstart;
- char ch;
-
- textstart = text;
- bombpoint = text+30000;
- numpages = pagenum = 0;
-
- do
- {
- if (*text == '^')
- {
- ch = toupper(*++text);
- if (ch == 'P') // start of a page
- numpages++;
- if (ch == 'E') // end of file, so load graphics and return
- {
- CA_MarkGrChunk(H_TOPWINDOWPIC);
- CA_MarkGrChunk(H_LEFTWINDOWPIC);
- CA_MarkGrChunk(H_RIGHTWINDOWPIC);
- CA_MarkGrChunk(H_BOTTOMINFOPIC);
- CA_CacheMarks ();
- text = textstart;
- return;
- }
- if (ch == 'G') // draw graphic command, so mark graphics
- {
- ParsePicCommand ();
- CA_MarkGrChunk (picnum);
- }
- if (ch == 'T') // timed draw graphic command, so mark graphics
- {
- ParseTimedCommand ();
- CA_MarkGrChunk (picnum);
- }
- }
- else
- text++;
-
- } while (text<bombpoint);
-
- Quit ("CacheLayoutGraphics: No ^E to terminate file!");
-}
-#endif
-
-
-/*
-=====================
-=
-= ShowArticle
-=
-=====================
-*/
-
-#ifdef JAPAN
-void ShowArticle (int which)
-#else
-void ShowArticle (char far *article)
-#endif
-{
- #ifdef JAPAN
- int snames[10] = { H_HELP1PIC,
- H_HELP2PIC,
- H_HELP3PIC,
- H_HELP4PIC,
- H_HELP5PIC,
- H_HELP6PIC,
- H_HELP7PIC,
- H_HELP8PIC,
- H_HELP9PIC,
- H_HELP10PIC};
- int enames[14] = {
- 0,0,
- #ifndef JAPDEMO
- C_ENDGAME1APIC,
- C_ENDGAME1BPIC,
- C_ENDGAME2APIC,
- C_ENDGAME2BPIC,
- C_ENDGAME3APIC,
- C_ENDGAME3BPIC,
- C_ENDGAME4APIC,
- C_ENDGAME4BPIC,
- C_ENDGAME5APIC,
- C_ENDGAME5BPIC,
- C_ENDGAME6APIC,
- C_ENDGAME6BPIC
- #endif
- };
- #endif
- unsigned oldfontnumber;
- unsigned temp;
- boolean newpage,firstpage;
-
- #ifdef JAPAN
- pagenum = 1;
- if (!which)
- numpages = 10;
- else
- numpages = 2;
-
- #else
-
- text = article;
- oldfontnumber = fontnumber;
- fontnumber = 0;
- CA_MarkGrChunk(STARTFONT);
- VWB_Bar (0,0,320,200,BACKCOLOR);
- CacheLayoutGraphics ();
- #endif
-
- newpage = true;
- firstpage = true;
-
- do
- {
- if (newpage)
- {
- newpage = false;
- #ifdef JAPAN
- if (!which)
- CA_CacheScreen(snames[pagenum - 1]);
- else
- CA_CacheScreen(enames[which*2 + pagenum - 1]);
- #else
- PageLayout (true);
- #endif
- VW_UpdateScreen ();
- if (firstpage)
- {
- VL_FadeIn(0,255,&gamepal,10);
- // VW_FadeIn ()
- firstpage = false;
- }
- }
-
- LastScan = 0;
- while (!LastScan)
- ;
-
- switch (LastScan)
- {
- case sc_UpArrow:
- case sc_PgUp:
- case sc_LeftArrow:
- if (pagenum>1)
- {
- #ifndef JAPAN
- BackPage ();
- BackPage ();
- #else
- pagenum--;
- #endif
- newpage = true;
- }
- break;
-
- case sc_Enter:
- case sc_DownArrow:
- case sc_PgDn:
- case sc_RightArrow: // the text allready points at next page
- if (pagenum<numpages)
- {
- newpage = true;
- #ifdef JAPAN
- pagenum++;
- #endif
- }
- break;
- }
-
- #ifndef SPEAR
- if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))
- PicturePause();
- #endif
-
- } while (LastScan != sc_Escape);
-
- IN_ClearKeysDown ();
- fontnumber = oldfontnumber;
-}
-
-
-//===========================================================================
-
-#ifndef JAPAN
-#ifdef ARTSEXTERN
-int endextern = T_ENDART1;
-#ifndef SPEAR
-int helpextern = T_HELPART;
-#endif
-#endif
-char helpfilename[13] = "HELPART.",
- endfilename[13] = "ENDART1.";
-#endif
-
-/*
-=================
-=
-= HelpScreens
-=
-=================
-*/
-#ifndef SPEAR
-void HelpScreens (void)
-{
- int artnum;
- char far *text;
- memptr layout;
-
-
- CA_UpLevel ();
- MM_SortMem ();
-#ifdef JAPAN
- ShowArticle (0);
- VW_FadeOut();
- FreeMusic ();
- CA_DownLevel ();
- MM_SortMem ();
-#else
-
-
-
-
-#ifdef ARTSEXTERN
- artnum = helpextern;
- CA_CacheGrChunk (artnum);
- text = (char _seg *)grsegs[artnum];
- MM_SetLock (&grsegs[artnum], true);
-#else
- CA_LoadFile (helpfilename,&layout);
- text = (char _seg *)layout;
- MM_SetLock (&layout, true);
-#endif
-
- ShowArticle (text);
-
-#ifdef ARTSEXTERN
- MM_FreePtr (&grsegs[artnum]);
-#else
- MM_FreePtr (&layout);
-#endif
-
-
-
- VW_FadeOut();
-
- FreeMusic ();
- CA_DownLevel ();
- MM_SortMem ();
-#endif
-}
-#endif
-
-//
-// END ARTICLES
-//
-void EndText (void)
-{
- int artnum;
- char far *text;
- memptr layout;
-
-
- ClearMemory ();
-
- CA_UpLevel ();
- MM_SortMem ();
-#ifdef JAPAN
- ShowArticle(gamestate.episode + 1);
-
- VW_FadeOut();
-
- SETFONTCOLOR(0,15);
- IN_ClearKeysDown();
- if (MousePresent)
- Mouse(MDelta); // Clear accumulated mouse movement
-
- FreeMusic ();
- CA_DownLevel ();
- MM_SortMem ();
-#else
-
-
-
-#ifdef ARTSEXTERN
- artnum = endextern+gamestate.episode;
- CA_CacheGrChunk (artnum);
- text = (char _seg *)grsegs[artnum];
- MM_SetLock (&grsegs[artnum], true);
-#else
- endfilename[6] = '1'+gamestate.episode;
- CA_LoadFile (endfilename,&layout);
- text = (char _seg *)layout;
- MM_SetLock (&layout, true);
-#endif
-
- ShowArticle (text);
-
-#ifdef ARTSEXTERN
- MM_FreePtr (&grsegs[artnum]);
-#else
- MM_FreePtr (&layout);
-#endif
-
-
- VW_FadeOut();
- SETFONTCOLOR(0,15);
- IN_ClearKeysDown();
- if (MousePresent)
- Mouse(MDelta); // Clear accumulated mouse movement
-
- FreeMusic ();
- CA_DownLevel ();
- MM_SortMem ();
-#endif
-}
binary files a/WOLFSRC/WOLF.DSW /dev/null differ
binary files a/WOLFSRC/WOLF.EXE /dev/null differ
binary files a/WOLFSRC/WOLF.IDE /dev/null differ
binary files a/WOLFSRC/WOLF.OBR /dev/null differ
binary files a/WOLFSRC/WOLF.~DE /dev/null differ
--- a/WOLFSRC/WOLF1VER.H
+++ /dev/null
@@ -1,7 +1,0 @@
-//#define SPEAR
-#define ARTSEXTERN
-#define DEMOSEXTERN
-//#define MYPROFILE
-//#define DEBCHECK
-#define CARMACIZED
-#define UPLOAD
binary files a/WOLFSRC/WOLF3D.DSK /dev/null differ
binary files a/WOLFSRC/WOLF3D.EXE /dev/null differ
--- a/WOLFSRC/WOLF3D.MAP
+++ /dev/null
@@ -1,3660 +1,0 @@
-
- Start Stop Length Name Class
-
- 00000H 044BBH 044BCH _TEXT CODE
- 044BCH 044BCH 00000H H_LDIV_TEXT CODE
- 044BCH 04855H 0039AH WOLFHACK_TEXT CODE
- 04858H 048BCH 00065H WHACK_A_TEXT CODE
- 048C0H 048FAH 0003BH WL_ASM_TEXT CODE
- 048FBH 060ABH 017B1H WL_MAIN_TEXT CODE
- 060ACH 06A53H 009A8H WL_TEXT_TEXT CODE
- 06A54H 0A853H 03E00H WL_MENU_TEXT CODE
- 0A854H 0BC65H 01412H WL_INTER_TEXT CODE
- 0BC66H 0CFC6H 01361H WL_GAME_TEXT CODE
- 0CFC7H 0E0DCH 01116H WL_PLAY_TEXT CODE
- 0E0DDH 0EBCEH 00AF2H WL_DEBUG_TEXT CODE
- 0EBCFH 0FB85H 00FB7H WL_DRAW_TEXT CODE
- 0FB86H 0FFD9H 00454H WL_DR_A_TEXT CODE
- 0FFDAH 1087BH 008A2H WL_SCALE_TEXT CODE
- 1087CH 12014H 01799H WL_STATE_TEXT CODE
- 12015H 1320EH 011FAH WL_AGENT_TEXT CODE
- 1320FH 13ECBH 00CBDH WL_ACT1_TEXT CODE
- 13ECCH 160F7H 0222CH WL_ACT2_TEXT CODE
- 160F8H 177B0H 016B9H ID_CA_TEXT CODE
- 177B1H 182DFH 00B2FH ID_IN_TEXT CODE
- 182E0H 19126H 00E47H ID_MM_TEXT CODE
- 19127H 1A286H 01160H ID_PM_TEXT CODE
- 1A287H 1BB15H 0188FH ID_SD_TEXT CODE
- 1BB16H 1BF07H 003F2H ID_SD_A_TEXT CODE
- 1BF08H 1CAADH 00BA6H ID_US_1_TEXT CODE
- 1CAAEH 1CAF2H 00045H ID_US_A_TEXT CODE
- 1CAF3H 1D61FH 00B2DH ID_VL_TEXT CODE
- 1D620H 1DF01H 008E2H ID_VH_TEXT CODE
- 1DF02H 1E195H 00294H ID_VL_A_TEXT CODE
- 1E196H 1E38BH 001F6H ID_VH_A_TEXT CODE
- 1E390H 20B06H 02777H EMU_PROG CODE
- 20B10H 210D7H 005C8H E87_PROG CODE
- 210E0H 210E0H 00000H _FARDATA FAR_DATA
- 210E0H 230DFH 02000H FAR_DATA FAR_DATA
- 230E0H 231E1H 00102H FAR_DATA FAR_DATA
- 231F0H 234E3H 002F4H WL_MAIN5_DATA FAR_DATA
- 234F0H 237BFH 002D0H WL_MENU5_DATA FAR_DATA
- 237C0H 23939H 0017AH WL_MENU6_DATA FAR_DATA
- 23940H 23B37H 001F8H WL_MENU7_DATA FAR_DATA
- 23B40H 23C3BH 000FCH WL_MENU8_DATA FAR_DATA
- 23C40H 23E0DH 001CEH WL_MENU9_DATA FAR_DATA
- 23E10H 23EB7H 000A8H WL_MENU10_DATA FAR_DATA
- 23EC0H 24063H 001A4H WL_MENU11_DATA FAR_DATA
- 24070H 241E9H 0017AH WL_MENU12_DATA FAR_DATA
- 241F0H 24213H 00024H WL_MENU13_DATA FAR_DATA
- 24220H 33C1FH 0FA00H SignonSeg FAR_DATA
- 33C20H 33C9FH 00080H ID_IN5_DATA FAR_DATA
- 33CA0H 33D1FH 00080H ID_IN6_DATA FAR_DATA
- 33D20H 33D9FH 00080H ID_IN7_DATA FAR_DATA
- 33DA0H 33DA0H 00000H _FARBSS FAR_BSS
- 33DA0H 342F8H 00559H _COMDEF_AA_ FAR_BSS
- 34300H 34A07H 00708H _COMDEF_AB_ FAR_BSS
- 34A10H 3581FH 00E10H _COMDEF_AC_ FAR_BSS
- 35820H 358B4H 00095H _COMDEF_AD_ FAR_BSS
- 358C0H 36ABFH 01200H _COMDEF_AE_ FAR_BSS
- 36AC0H 37CBFH 01200H _COMDEF_AF_ FAR_BSS
- 37CC0H 39D8FH 020D0H _COMDEF_AG_ FAR_BSS
- 39D90H 3A08FH 00300H _COMDEF_AH_ FAR_BSS
- 3A090H 3A38FH 00300H _COMDEF_AI_ FAR_BSS
- 3A390H 3A390H 00000H _OVERLAY_ OVRINFO
- 3A390H 3A390H 00000H _1STUB_ STUBSEG
- 3A390H 3EAC9H 0473AH _DATA DATA
- 3EACAH 3EACDH 00004H _CVTSEG DATA
- 3EACEH 3EAD9H 0000CH _SCNSEG DATA
- 3EADAH 3EADAH 00000H _CONST CONST
- 3EADAH 3EAF7H 0001EH _INIT_ INITDATA
- 3EAF8H 3EAF8H 00000H _INITEND_ INITDATA
- 3EAF8H 3EAFDH 00006H _EXIT_ EXITDATA
- 3EAFEH 3EAFEH 00000H _EXITEND_ EXITDATA
- 3EAFEH 3ED73H 00276H _BSS BSS
- 3ED74H 4933EH 0A5CBH _COMDEF_ BSS
- 4933FH 4933FH 00000H _BSSEND BSSEND
- 49340H 493BFH 00080H _STACK STACK
-
-
-Detailed map of segments
-
- 0000:0000 02B2 C=CODE S=_TEXT G=(none) M=C0.ASM ACBP=28
- 0000:02B2 00DE C=CODE S=_TEXT G=(none) M=H_LDIV.ASM ACBP=28
- 0000:0390 0258 C=CODE S=_TEXT G=(none) M=FPINIT ACBP=28
- 0000:05E8 0000 C=CODE S=_TEXT G=(none) M=E87TRAP ACBP=28
- 0000:05E8 0000 C=CODE S=_TEXT G=(none) M=PROTFLAG ACBP=28
- 0000:05E8 0000 C=CODE S=_TEXT G=(none) M=DEFLT87 ACBP=28
- 0000:05E8 000D C=CODE S=_TEXT G=(none) M=ATAN ACBP=28
- 0000:05F5 0000 C=CODE S=_TEXT G=(none) M=HUGEVAL ACBP=28
- 0000:05F5 009A C=CODE S=_TEXT G=(none) M=LDTRUNC ACBP=28
- 0000:068F 0000 C=CODE S=_TEXT G=(none) M=MATHWHY ACBP=28
- 0000:068F 01B5 C=CODE S=_TEXT G=(none) M=REALCVT ACBP=28
- 0000:0844 0361 C=CODE S=_TEXT G=(none) M=SCANTOD ACBP=28
- 0000:0BA5 0205 C=CODE S=_TEXT G=(none) M=XCVT ACBP=28
- 0000:0DAA 00A4 C=CODE S=_TEXT G=(none) M=FPERR ACBP=28
- 0000:0E4E 00C9 C=CODE S=_TEXT G=(none) M=_POW10 ACBP=28
- 0000:0F17 000B C=CODE S=_TEXT G=(none) M=POW10D ACBP=28
- 0000:0F22 0026 C=CODE S=_TEXT G=(none) M=MATHERR ACBP=28
- 0000:0F48 004D C=CODE S=_TEXT G=(none) M=SIN ACBP=28
- 0000:0F95 0050 C=CODE S=_TEXT G=(none) M=TAN ACBP=28
- 0000:0FE5 0090 C=CODE S=_TEXT G=(none) M=_MATHERR ACBP=28
- 0000:1075 00BB C=CODE S=_TEXT G=(none) M=ATAN2 ACBP=28
- 0000:1130 002C C=CODE S=_TEXT G=(none) M=FFTOL ACBP=28
- 0000:115C 002D C=CODE S=_TEXT G=(none) M=ATEXIT ACBP=28
- 0000:1189 0000 C=CODE S=_TEXT G=(none) M=CTYPE ACBP=28
- 0000:1189 0038 C=CODE S=_TEXT G=(none) M=DOSFATTR ACBP=28
- 0000:11C1 0032 C=CODE S=_TEXT G=(none) M=DOSGDATE ACBP=28
- 0000:11F3 0023 C=CODE S=_TEXT G=(none) M=DOSWRITE ACBP=28
- 0000:1216 0093 C=CODE S=_TEXT G=(none) M=EXIT ACBP=28
- 0000:12A9 0000 C=CODE S=_TEXT G=(none) M=FILES ACBP=28
- 0000:12A9 0000 C=CODE S=_TEXT G=(none) M=FILES2 ACBP=28
- 0000:12A9 0000 C=CODE S=_TEXT G=(none) M=FMODE ACBP=28
- 0000:12A9 0000 C=CODE S=_TEXT G=(none) M=FPSTKLEN ACBP=28
- 0000:12A9 0017 C=CODE S=_TEXT G=(none) M=F_LXMUL ACBP=28
- 0000:12C0 0021 C=CODE S=_TEXT G=(none) M=F_PCMP ACBP=28
- 0000:12E1 001C C=CODE S=_TEXT G=(none) M=F_SCOPY ACBP=28
- 0000:12FD 0020 C=CODE S=_TEXT G=(none) M=GETVECT ACBP=28
- 0000:131D 0000 C=CODE S=_TEXT G=(none) M=HEAPLEN ACBP=28
- 0000:131D 0021 C=CODE S=_TEXT G=(none) M=H_LLSH ACBP=28
- 0000:133E 0020 C=CODE S=_TEXT G=(none) M=H_LRSH ACBP=28
- 0000:135E 0021 C=CODE S=_TEXT G=(none) M=H_LURSH ACBP=28
- 0000:137F 0088 C=CODE S=_TEXT G=(none) M=H_PADA ACBP=28
- 0000:1407 0060 C=CODE S=_TEXT G=(none) M=H_PADD ACBP=28
- 0000:1467 0028 C=CODE S=_TEXT G=(none) M=H_PSBP ACBP=28
- 0000:148F 0027 C=CODE S=_TEXT G=(none) M=H_SPUSH ACBP=28
- 0000:14B6 004B C=CODE S=_TEXT G=(none) M=IOERROR ACBP=28
- 0000:1501 0011 C=CODE S=_TEXT G=(none) M=ISATTY ACBP=28
- 0000:1512 009A C=CODE S=_TEXT G=(none) M=LONGTOA ACBP=28
- 0000:15AC 0029 C=CODE S=_TEXT G=(none) M=LSEEK ACBP=28
- 0000:15D5 0082 C=CODE S=_TEXT G=(none) M=MKNAME ACBP=28
- 0000:1657 0021 C=CODE S=_TEXT G=(none) M=N_PCMP ACBP=28
- 0000:1678 0032 C=CODE S=_TEXT G=(none) M=OUTPORT ACBP=28
- 0000:16AA 002D C=CODE S=_TEXT G=(none) M=READA ACBP=28
- 0000:16D7 01AA C=CODE S=_TEXT G=(none) M=SCANTOL ACBP=28
- 0000:1881 00A5 C=CODE S=_TEXT G=(none) M=SETUPIO ACBP=28
- 0000:1926 0000 C=CODE S=_TEXT G=(none) M=SIGDATA ACBP=28
- 0000:1926 0000 C=CODE S=_TEXT G=(none) M=STKLEN ACBP=28
- 0000:1926 0018 C=CODE S=_TEXT G=(none) M=TELL ACBP=28
- 0000:193E 002C C=CODE S=_TEXT G=(none) M=TOLOWER ACBP=28
- 0000:196A 002C C=CODE S=_TEXT G=(none) M=TOUPPER ACBP=28
- 0000:1996 0016 C=CODE S=_TEXT G=(none) M=UNLINK ACBP=28
- 0000:19AC 04C6 C=CODE S=_TEXT G=(none) M=VPRINTER ACBP=28
- 0000:1E72 009F C=CODE S=_TEXT G=(none) M=VRAM ACBP=28
- 0000:1F11 001A C=CODE S=_TEXT G=(none) M=XCLOSE ACBP=28
- 0000:1F2B 0029 C=CODE S=_TEXT G=(none) M=_STPCPY ACBP=28
- 0000:1F54 0025 C=CODE S=_TEXT G=(none) M=BIOSKEY ACBP=28
- 0000:1F79 006F C=CODE S=_TEXT G=(none) M=BRK ACBP=28
- 0000:1FE8 0029 C=CODE S=_TEXT G=(none) M=CLRSCR ACBP=28
- 0000:2011 0010 C=CODE S=_TEXT G=(none) M=CORELEFT ACBP=28
- 0000:2021 01B3 C=CODE S=_TEXT G=(none) M=CRTINIT ACBP=28
- 0000:21D4 001F C=CODE S=_TEXT G=(none) M=CVTFAK ACBP=28
- 0000:21F3 0421 C=CODE S=_TEXT G=(none) M=FARHEAP ACBP=28
- 0000:2614 0143 C=CODE S=_TEXT G=(none) M=FBRK ACBP=28
- 0000:2757 0050 C=CODE S=_TEXT G=(none) M=FCORELFT ACBP=28
- 0000:27A7 0049 C=CODE S=_TEXT G=(none) M=GOTOXY ACBP=28
- 0000:27F0 0095 C=CODE S=_TEXT G=(none) M=GPTEXT ACBP=28
- 0000:2885 002E C=CODE S=_TEXT G=(none) M=HARD ACBP=28
- 0000:28B3 0126 C=CODE S=_TEXT G=(none) M=HARDERR ACBP=28
- 0000:29D9 0027 C=CODE S=_TEXT G=(none) M=IOCTL ACBP=28
- 0000:2A00 009D C=CODE S=_TEXT G=(none) M=MOVETEXT ACBP=28
- 0000:2A9D 027B C=CODE S=_TEXT G=(none) M=NEARHEAP ACBP=28
- 0000:2D18 0004 C=CODE S=_TEXT G=(none) M=REALCVT ACBP=28
- 0000:2D1C 01AB C=CODE S=_TEXT G=(none) M=SCREEN ACBP=28
- 0000:2EC7 0188 C=CODE S=_TEXT G=(none) M=SCROLL ACBP=28
- 0000:304F 0115 C=CODE S=_TEXT G=(none) M=SETARGV ACBP=28
- 0000:3164 001C C=CODE S=_TEXT G=(none) M=SETBLOCK ACBP=28
- 0000:3180 005D C=CODE S=_TEXT G=(none) M=SETENVP ACBP=28
- 0000:31DD 002C C=CODE S=_TEXT G=(none) M=WHEREXY ACBP=28
- 0000:3209 007D C=CODE S=_TEXT G=(none) M=ATOL ACBP=28
- 0000:3286 0010 C=CODE S=_TEXT G=(none) M=BDOS ACBP=28
- 0000:3296 001B C=CODE S=_TEXT G=(none) M=CHMODA ACBP=28
- 0000:32B1 0028 C=CODE S=_TEXT G=(none) M=CLOSE ACBP=28
- 0000:32D9 001E C=CODE S=_TEXT G=(none) M=CLOSEA ACBP=28
- 0000:32F7 008B C=CODE S=_TEXT G=(none) M=CREAT ACBP=28
- 0000:3382 007D C=CODE S=_TEXT G=(none) M=FCLOSE ACBP=28
- 0000:33FF 0081 C=CODE S=_TEXT G=(none) M=FFLUSH ACBP=28
- 0000:3480 0060 C=CODE S=_TEXT G=(none) M=FINDFIRS ACBP=28
- 0000:34E0 0041 C=CODE S=_TEXT G=(none) M=FLENGTH ACBP=28
- 0000:3521 003A C=CODE S=_TEXT G=(none) M=FLUSHALL ACBP=28
- 0000:355B 01A0 C=CODE S=_TEXT G=(none) M=FOPEN ACBP=28
- 0000:36FB 0016 C=CODE S=_TEXT G=(none) M=FPRINTF ACBP=28
- 0000:3711 0112 C=CODE S=_TEXT G=(none) M=FSEEK ACBP=28
- 0000:3823 005F C=CODE S=_TEXT G=(none) M=GETENV ACBP=28
- 0000:3882 0067 C=CODE S=_TEXT G=(none) M=LTOA1 ACBP=28
- 0000:38E9 001F C=CODE S=_TEXT G=(none) M=MEMCPY ACBP=28
- 0000:3908 0022 C=CODE S=_TEXT G=(none) M=MOVEDATA ACBP=28
- 0000:392A 0183 C=CODE S=_TEXT G=(none) M=OPEN ACBP=28
- 0000:3AAD 004D C=CODE S=_TEXT G=(none) M=OPENA ACBP=28
- 0000:3AFA 0017 C=CODE S=_TEXT G=(none) M=PRINTF ACBP=28
- 0000:3B11 0302 C=CODE S=_TEXT G=(none) M=PUTC ACBP=28
- 0000:3E13 004B C=CODE S=_TEXT G=(none) M=PUTS ACBP=28
- 0000:3E5E 00CE C=CODE S=_TEXT G=(none) M=READ ACBP=28
- 0000:3F2C 0003 C=CODE S=_TEXT G=(none) M=READU ACBP=28
- 0000:3F2F 00D6 C=CODE S=_TEXT G=(none) M=SETVBUF ACBP=28
- 0000:4005 0061 C=CODE S=_TEXT G=(none) M=SPRINTF ACBP=28
- 0000:4066 0039 C=CODE S=_TEXT G=(none) M=STRCAT ACBP=28
- 0000:409F 0022 C=CODE S=_TEXT G=(none) M=STRCPY ACBP=28
- 0000:40C1 001A C=CODE S=_TEXT G=(none) M=STRLEN ACBP=28
- 0000:40DB 00FF C=CODE S=_TEXT G=(none) M=STRTOL ACBP=28
- 0000:41DA 010C C=CODE S=_TEXT G=(none) M=WRITE ACBP=28
- 0000:42E6 003A C=CODE S=_TEXT G=(none) M=WRITEA ACBP=28
- 0000:4320 0003 C=CODE S=_TEXT G=(none) M=WRITEU ACBP=28
- 0000:4323 0028 C=CODE S=_TEXT G=(none) M=XFCLOSE ACBP=28
- 0000:434B 0023 C=CODE S=_TEXT G=(none) M=XFFLUSH ACBP=28
- 0000:436E 0028 C=CODE S=_TEXT G=(none) M=FMEMCMP ACBP=28
- 0000:4396 0024 C=CODE S=_TEXT G=(none) M=FMEMCPY ACBP=28
- 0000:43BA 0043 C=CODE S=_TEXT G=(none) M=FMEMSET ACBP=28
- 0000:43FD 0029 C=CODE S=_TEXT G=(none) M=FSTRCPY ACBP=28
- 0000:4426 0041 C=CODE S=_TEXT G=(none) M=FSTRICMP ACBP=28
- 0000:4467 001F C=CODE S=_TEXT G=(none) M=FSTRLEN ACBP=28
- 0000:4486 0036 C=CODE S=_TEXT G=(none) M=DOSDFREE ACBP=28
- 044B:000C 0000 C=CODE S=H_LDIV_TEXT G=(none) M=H_LDIV.ASM ACBP=48
- 044B:000C 039A C=CODE S=WOLFHACK_TEXT G=(none) M=WOLFHACK.C ACBP=28
- 0485:0008 0065 C=CODE S=WHACK_A_TEXT G=(none) M=WHACK_A.ASM ACBP=A8
- 048C:0000 003B C=CODE S=WL_ASM_TEXT G=(none) M=WL_ASM.ASM ACBP=A8
- 048F:000B 17B1 C=CODE S=WL_MAIN_TEXT G=(none) M=WL_MAIN.C ACBP=28
- 060A:000C 09A8 C=CODE S=WL_TEXT_TEXT G=(none) M=WL_TEXT.C ACBP=28
- 06A5:0004 3E00 C=CODE S=WL_MENU_TEXT G=(none) M=WL_MENU.C ACBP=28
- 0A85:0004 1412 C=CODE S=WL_INTER_TEXT G=(none) M=WL_INTER.C ACBP=28
- 0BC6:0006 1361 C=CODE S=WL_GAME_TEXT G=(none) M=WL_GAME.C ACBP=28
- 0CFC:0007 1116 C=CODE S=WL_PLAY_TEXT G=(none) M=WL_PLAY.C ACBP=28
- 0E0D:000D 0AF2 C=CODE S=WL_DEBUG_TEXT G=(none) M=WL_DEBUG.C ACBP=28
- 0EBC:000F 0FB7 C=CODE S=WL_DRAW_TEXT G=(none) M=WL_DRAW.C ACBP=28
- 0FB8:0006 0454 C=CODE S=WL_DR_A_TEXT G=(none) M=WL_DR_A.ASM ACBP=48
- 0FFD:000A 08A2 C=CODE S=WL_SCALE_TEXT G=(none) M=WL_SCALE.C ACBP=28
- 1087:000C 1799 C=CODE S=WL_STATE_TEXT G=(none) M=WL_STATE.C ACBP=28
- 1201:0005 11FA C=CODE S=WL_AGENT_TEXT G=(none) M=WL_AGENT.C ACBP=28
- 1320:000F 0CBD C=CODE S=WL_ACT1_TEXT G=(none) M=WL_ACT1.C ACBP=28
- 13EC:000C 222C C=CODE S=WL_ACT2_TEXT G=(none) M=WL_ACT2.C ACBP=28
- 160F:0008 16B9 C=CODE S=ID_CA_TEXT G=(none) M=ID_CA.C ACBP=28
- 177B:0001 0B2F C=CODE S=ID_IN_TEXT G=(none) M=ID_IN.C ACBP=28
- 182E:0000 0E47 C=CODE S=ID_MM_TEXT G=(none) M=ID_MM.C ACBP=28
- 1912:0007 1160 C=CODE S=ID_PM_TEXT G=(none) M=ID_PM.C ACBP=28
- 1A28:0007 188F C=CODE S=ID_SD_TEXT G=(none) M=ID_SD.C ACBP=28
- 1BB1:0006 03F2 C=CODE S=ID_SD_A_TEXT G=(none) M=ID_SD_A.ASM ACBP=48
- 1BF0:0008 0BA6 C=CODE S=ID_US_1_TEXT G=(none) M=ID_US_1.C ACBP=28
- 1CAA:000E 0045 C=CODE S=ID_US_A_TEXT G=(none) M=ID_US_A.ASM ACBP=48
- 1CAF:0003 0B2D C=CODE S=ID_VL_TEXT G=(none) M=ID_VL.C ACBP=28
- 1D62:0000 08E2 C=CODE S=ID_VH_TEXT G=(none) M=ID_VH.C ACBP=28
- 1DF0:0002 0294 C=CODE S=ID_VL_A_TEXT G=(none) M=ID_VL_A.ASM ACBP=48
- 1E19:0006 01F6 C=CODE S=ID_VH_A_TEXT G=(none) M=ID_VH_A.ASM ACBP=48
- 1E39:0000 0000 C=CODE S=EMU_PROG G=(none) M=FPINIT ACBP=68
- 1E39:0000 2777 C=CODE S=EMU_PROG G=(none) M=EMU086 ACBP=68
- 20B1:0000 0000 C=CODE S=E87_PROG G=(none) M=FPINIT ACBP=68
- 20B1:0000 03E3 C=CODE S=E87_PROG G=(none) M=EMU087 ACBP=68
- 20B1:03F0 01D8 C=CODE S=E87_PROG G=(none) M=E87TRAP ACBP=68
- 210E:0000 0000 C=FAR_DATA S=_FARDATA G=(none) M=C0.ASM ACBP=68
- 210E:0000 2000 C=FAR_DATA S=FAR_DATA G=(none) M=WHACK_A.ASM ACBP=60
- 230E:0000 0102 C=FAR_DATA S=FAR_DATA G=(none) M=ID_US_A.ASM ACBP=60
- 231F:0000 02F4 C=FAR_DATA S=WL_MAIN5_DATA G=(none) M=WL_MAIN.C ACBP=68
- 234F:0000 02D0 C=FAR_DATA S=WL_MENU5_DATA G=(none) M=WL_MENU.C ACBP=68
- 237C:0000 017A C=FAR_DATA S=WL_MENU6_DATA G=(none) M=WL_MENU.C ACBP=68
- 2394:0000 01F8 C=FAR_DATA S=WL_MENU7_DATA G=(none) M=WL_MENU.C ACBP=68
- 23B4:0000 00FC C=FAR_DATA S=WL_MENU8_DATA G=(none) M=WL_MENU.C ACBP=68
- 23C4:0000 01CE C=FAR_DATA S=WL_MENU9_DATA G=(none) M=WL_MENU.C ACBP=68
- 23E1:0000 00A8 C=FAR_DATA S=WL_MENU10_DATA G=(none) M=WL_MENU.C ACBP=68
- 23EC:0000 01A4 C=FAR_DATA S=WL_MENU11_DATA G=(none) M=WL_MENU.C ACBP=68
- 2407:0000 017A C=FAR_DATA S=WL_MENU12_DATA G=(none) M=WL_MENU.C ACBP=68
- 241F:0000 0024 C=FAR_DATA S=WL_MENU13_DATA G=(none) M=WL_MENU.C ACBP=68
- 2422:0000 FA00 C=FAR_DATA S=SignonSeg G=(none) M=SIGNON.BIN ACBP=60
- 33C2:0000 0080 C=FAR_DATA S=ID_IN5_DATA G=(none) M=ID_IN.C ACBP=68
- 33CA:0000 0080 C=FAR_DATA S=ID_IN6_DATA G=(none) M=ID_IN.C ACBP=68
- 33D2:0000 0080 C=FAR_DATA S=ID_IN7_DATA G=(none) M=ID_IN.C ACBP=68
- 33DA:0000 0000 C=FAR_BSS S=_FARBSS G=(none) M=C0.ASM ACBP=68
- 33DA:0000 0559 C=FAR_BSS S=_COMDEF_AA_ G=(none) M=WL_ACT1.C ACBP=60
- 3430:0000 0708 C=FAR_BSS S=_COMDEF_AB_ G=(none) M=WL_DRAW.C ACBP=60
- 34A1:0000 0E10 C=FAR_BSS S=_COMDEF_AC_ G=(none) M=WL_DRAW.C ACBP=60
- 3582:0000 0095 C=FAR_BSS S=_COMDEF_AD_ G=(none) M=ID_CA.C ACBP=60
- 358C:0000 1200 C=FAR_BSS S=_COMDEF_AE_ G=(none) M=WL_PLAY.C ACBP=60
- 36AC:0000 1200 C=FAR_BSS S=_COMDEF_AF_ G=(none) M=WL_PLAY.C ACBP=60
- 37CC:0000 20D0 C=FAR_BSS S=_COMDEF_AG_ G=(none) M=ID_MM.C ACBP=60
- 39D9:0000 0300 C=FAR_BSS S=_COMDEF_AH_ G=(none) M=ID_VL.C ACBP=60
- 3A09:0000 0300 C=FAR_BSS S=_COMDEF_AI_ G=(none) M=ID_VL.C ACBP=60
- 3A39:0000 0000 C=OVRINFO S=_OVERLAY_ G=(none) M=C0.ASM ACBP=68
- 3A39:0000 0000 C=STUBSEG S=_1STUB_ G=(none) M=C0.ASM ACBP=68
- 3A39:0000 00D9 C=DATA S=_DATA G=DGROUP M=C0.ASM ACBP=68
- 3A39:00DA 0000 C=DATA S=_DATA G=DGROUP M=H_LDIV.ASM ACBP=48
- 3A39:00DA 0002 C=DATA S=_DATA G=DGROUP M=WOLFHACK.C ACBP=48
- 3A39:00DC 0000 C=DATA S=_DATA G=DGROUP M=WHACK_A.ASM ACBP=A8
- 3A39:00DC 0000 C=DATA S=_DATA G=DGROUP M=WL_ASM.ASM ACBP=A8
- 3A39:00DC 0254 C=DATA S=_DATA G=DGROUP M=WL_MAIN.C ACBP=48
- 3A39:0330 00A1 C=DATA S=_DATA G=DGROUP M=WL_TEXT.C ACBP=48
- 3A39:03D2 06B4 C=DATA S=_DATA G=DGROUP M=WL_MENU.C ACBP=48
- 3A39:0A86 03ED C=DATA S=_DATA G=DGROUP M=WL_INTER.C ACBP=48
- 3A39:0E74 03FC C=DATA S=_DATA G=DGROUP M=WL_GAME.C ACBP=48
- 3A39:1270 0216 C=DATA S=_DATA G=DGROUP M=WL_PLAY.C ACBP=48
- 3A39:1486 01FE C=DATA S=_DATA G=DGROUP M=WL_DEBUG.C ACBP=48
- 3A39:1684 0096 C=DATA S=_DATA G=DGROUP M=WL_DRAW.C ACBP=48
- 3A39:171A 0000 C=DATA S=_DATA G=DGROUP M=WL_DR_A.ASM ACBP=48
- 3A39:171A 00F1 C=DATA S=_DATA G=DGROUP M=WL_SCALE.C ACBP=48
- 3A39:180C 00FF C=DATA S=_DATA G=DGROUP M=WL_STATE.C ACBP=48
- 3A39:190C 0112 C=DATA S=_DATA G=DGROUP M=WL_AGENT.C ACBP=48
- 3A39:1A1E 0119 C=DATA S=_DATA G=DGROUP M=WL_ACT1.C ACBP=48
- 3A39:1B38 1412 C=DATA S=_DATA G=DGROUP M=WL_ACT2.C ACBP=48
- 3A39:2F4A 0300 C=DATA S=_DATA G=DGROUP M=GAMEPAL.BIN ACBP=48
- 3A39:324A 0109 C=DATA S=_DATA G=DGROUP M=ID_CA.C ACBP=48
- 3A39:3354 005F C=DATA S=_DATA G=DGROUP M=ID_IN.C ACBP=48
- 3A39:33B4 015B C=DATA S=_DATA G=DGROUP M=ID_MM.C ACBP=48
- 3A39:3510 0490 C=DATA S=_DATA G=DGROUP M=ID_PM.C ACBP=48
- 3A39:39A0 0265 C=DATA S=_DATA G=DGROUP M=ID_SD.C ACBP=48
- 3A39:3C06 0104 C=DATA S=_DATA G=DGROUP M=ID_SD_A.ASM ACBP=48
- 3A39:3D0A 02B9 C=DATA S=_DATA G=DGROUP M=ID_US_1.C ACBP=48
- 3A39:3FC4 0000 C=DATA S=_DATA G=DGROUP M=ID_US_A.ASM ACBP=48
- 3A39:3FC4 0097 C=DATA S=_DATA G=DGROUP M=ID_VL.C ACBP=48
- 3A39:405C 0029 C=DATA S=_DATA G=DGROUP M=ID_VH.C ACBP=48
- 3A39:4086 0002 C=DATA S=_DATA G=DGROUP M=ID_VL_A.ASM ACBP=48
- 3A39:4088 0000 C=DATA S=_DATA G=DGROUP M=ID_VH_A.ASM ACBP=48
- 3A39:4090 0002 C=DATA S=_DATA G=DGROUP M=FPINIT ACBP=68
- 3A39:40A0 0000 C=DATA S=_DATA G=DGROUP M=E87TRAP ACBP=68
- 3A39:40A0 0003 C=DATA S=_DATA G=DGROUP M=PROTFLAG ACBP=48
- 3A39:40A4 0002 C=DATA S=_DATA G=DGROUP M=DEFLT87 ACBP=48
- 3A39:40A6 0000 C=DATA S=_DATA G=DGROUP M=ATAN ACBP=48
- 3A39:40A6 0024 C=DATA S=_DATA G=DGROUP M=HUGEVAL ACBP=48
- 3A39:40CA 0000 C=DATA S=_DATA G=DGROUP M=LDTRUNC ACBP=48
- 3A39:40CA 0037 C=DATA S=_DATA G=DGROUP M=MATHWHY ACBP=48
- 3A39:4102 0000 C=DATA S=_DATA G=DGROUP M=REALCVT ACBP=48
- 3A39:4102 0018 C=DATA S=_DATA G=DGROUP M=SCANTOD ACBP=48
- 3A39:411A 0000 C=DATA S=_DATA G=DGROUP M=XCVT ACBP=48
- 3A39:411A 008C C=DATA S=_DATA G=DGROUP M=FPERR ACBP=48
- 3A39:41A6 0080 C=DATA S=_DATA G=DGROUP M=_POW10 ACBP=48
- 3A39:4226 0000 C=DATA S=_DATA G=DGROUP M=POW10D ACBP=48
- 3A39:4226 0000 C=DATA S=_DATA G=DGROUP M=MATHERR ACBP=48
- 3A39:4226 000C C=DATA S=_DATA G=DGROUP M=SIN ACBP=48
- 3A39:4232 000C C=DATA S=_DATA G=DGROUP M=TAN ACBP=48
- 3A39:423E 000E C=DATA S=_DATA G=DGROUP M=_MATHERR ACBP=48
- 3A39:424C 0018 C=DATA S=_DATA G=DGROUP M=ATAN2 ACBP=48
- 3A39:4270 0110 C=DATA S=_DATA G=DGROUP M=EMUVARS ACBP=68
- 3A39:4380 0000 C=DATA S=_DATA G=DGROUP M=FFTOL ACBP=48
- 3A39:4380 0002 C=DATA S=_DATA G=DGROUP M=ATEXIT ACBP=48
- 3A39:4382 0101 C=DATA S=_DATA G=DGROUP M=CTYPE ACBP=48
- 3A39:4484 0000 C=DATA S=_DATA G=DGROUP M=DOSFATTR ACBP=48
- 3A39:4484 0000 C=DATA S=_DATA G=DGROUP M=DOSGDATE ACBP=48
- 3A39:4484 0000 C=DATA S=_DATA G=DGROUP M=DOSWRITE ACBP=48
- 3A39:4484 000C C=DATA S=_DATA G=DGROUP M=EXIT ACBP=48
- 3A39:4490 0140 C=DATA S=_DATA G=DGROUP M=FILES ACBP=48
- 3A39:45D0 002A C=DATA S=_DATA G=DGROUP M=FILES2 ACBP=48
- 3A39:45FA 0004 C=DATA S=_DATA G=DGROUP M=FMODE ACBP=48
- 3A39:45FE 0002 C=DATA S=_DATA G=DGROUP M=FPSTKLEN ACBP=48
- 3A39:4600 0000 C=DATA S=_DATA G=DGROUP M=F_LXMUL ACBP=48
- 3A39:4600 0000 C=DATA S=_DATA G=DGROUP M=F_PCMP ACBP=48
- 3A39:4600 0000 C=DATA S=_DATA G=DGROUP M=F_SCOPY ACBP=48
- 3A39:4600 0000 C=DATA S=_DATA G=DGROUP M=GETVECT ACBP=48
- 3A39:4600 0002 C=DATA S=_DATA G=DGROUP M=HEAPLEN ACBP=48
- 3A39:4602 0000 C=DATA S=_DATA G=DGROUP M=H_LLSH ACBP=48
- 3A39:4602 0000 C=DATA S=_DATA G=DGROUP M=H_LRSH ACBP=48
- 3A39:4602 0000 C=DATA S=_DATA G=DGROUP M=H_LURSH ACBP=48
- 3A39:4602 0000 C=DATA S=_DATA G=DGROUP M=H_PADA ACBP=48
- 3A39:4602 0000 C=DATA S=_DATA G=DGROUP M=H_PADD ACBP=48
- 3A39:4602 0000 C=DATA S=_DATA G=DGROUP M=H_PSBP ACBP=48
- 3A39:4602 0000 C=DATA S=_DATA G=DGROUP M=H_SPUSH ACBP=48
- 3A39:4602 005B C=DATA S=_DATA G=DGROUP M=IOERROR ACBP=48
- 3A39:465E 0000 C=DATA S=_DATA G=DGROUP M=ISATTY ACBP=48
- 3A39:465E 0000 C=DATA S=_DATA G=DGROUP M=LONGTOA ACBP=48
- 3A39:465E 0000 C=DATA S=_DATA G=DGROUP M=LSEEK ACBP=48
- 3A39:465E 0009 C=DATA S=_DATA G=DGROUP M=MKNAME ACBP=48
- 3A39:4668 0000 C=DATA S=_DATA G=DGROUP M=N_PCMP ACBP=48
- 3A39:4668 0000 C=DATA S=_DATA G=DGROUP M=OUTPORT ACBP=48
- 3A39:4668 0000 C=DATA S=_DATA G=DGROUP M=READA ACBP=48
- 3A39:4668 0000 C=DATA S=_DATA G=DGROUP M=SCANTOL ACBP=48
- 3A39:4668 0000 C=DATA S=_DATA G=DGROUP M=SETUPIO ACBP=48
- 3A39:4668 0000 C=DATA S=_DATA G=DGROUP M=SIGDATA ACBP=48
- 3A39:4668 0002 C=DATA S=_DATA G=DGROUP M=STKLEN ACBP=48
- 3A39:466A 0000 C=DATA S=_DATA G=DGROUP M=TELL ACBP=48
- 3A39:466A 0000 C=DATA S=_DATA G=DGROUP M=TOLOWER ACBP=48
- 3A39:466A 0000 C=DATA S=_DATA G=DGROUP M=TOUPPER ACBP=48
- 3A39:466A 0000 C=DATA S=_DATA G=DGROUP M=UNLINK ACBP=48
- 3A39:466A 0067 C=DATA S=_DATA G=DGROUP M=VPRINTER ACBP=48
- 3A39:46D2 0000 C=DATA S=_DATA G=DGROUP M=VRAM ACBP=48
- 3A39:46D2 0000 C=DATA S=_DATA G=DGROUP M=XCLOSE ACBP=48
- 3A39:46D2 0000 C=DATA S=_DATA G=DGROUP M=_STPCPY ACBP=48
- 3A39:46D2 0000 C=DATA S=_DATA G=DGROUP M=BIOSKEY ACBP=48
- 3A39:46D2 0000 C=DATA S=_DATA G=DGROUP M=BRK ACBP=48
- 3A39:46D2 0000 C=DATA S=_DATA G=DGROUP M=CLRSCR ACBP=48
- 3A39:46D2 0000 C=DATA S=_DATA G=DGROUP M=CORELEFT ACBP=48
- 3A39:46D2 0018 C=DATA S=_DATA G=DGROUP M=CRTINIT ACBP=48
- 3A39:46EA 0031 C=DATA S=_DATA G=DGROUP M=CVTFAK ACBP=48
- 3A39:471C 0000 C=DATA S=_DATA G=DGROUP M=FARHEAP ACBP=48
- 3A39:471C 0002 C=DATA S=_DATA G=DGROUP M=FBRK ACBP=48
- 3A39:471E 0000 C=DATA S=_DATA G=DGROUP M=FCORELFT ACBP=48
- 3A39:471E 0000 C=DATA S=_DATA G=DGROUP M=GOTOXY ACBP=48
- 3A39:471E 0000 C=DATA S=_DATA G=DGROUP M=GPTEXT ACBP=48
- 3A39:471E 0000 C=DATA S=_DATA G=DGROUP M=HARD ACBP=48
- 3A39:471E 0000 C=DATA S=_DATA G=DGROUP M=HARDERR ACBP=48
- 3A39:471E 0000 C=DATA S=_DATA G=DGROUP M=IOCTL ACBP=48
- 3A39:471E 0000 C=DATA S=_DATA G=DGROUP M=MOVETEXT ACBP=48
- 3A39:471E 0006 C=DATA S=_DATA G=DGROUP M=NEARHEAP ACBP=48
- 3A39:4724 0000 C=DATA S=_DATA G=DGROUP M=REALCVT ACBP=48
- 3A39:4724 0000 C=DATA S=_DATA G=DGROUP M=SCREEN ACBP=48
- 3A39:4724 0000 C=DATA S=_DATA G=DGROUP M=SCROLL ACBP=48
- 3A39:4724 000E C=DATA S=_DATA G=DGROUP M=SETARGV ACBP=48
- 3A39:4732 0000 C=DATA S=_DATA G=DGROUP M=SETBLOCK ACBP=48
- 3A39:4732 0002 C=DATA S=_DATA G=DGROUP M=SETENVP ACBP=48
- 3A39:4734 0000 C=DATA S=_DATA G=DGROUP M=WHEREXY ACBP=48
- 3A39:4734 0000 C=DATA S=_DATA G=DGROUP M=ATOL ACBP=48
- 3A39:4734 0000 C=DATA S=_DATA G=DGROUP M=BDOS ACBP=48
- 3A39:4734 0000 C=DATA S=_DATA G=DGROUP M=CHMODA ACBP=48
- 3A39:4734 0000 C=DATA S=_DATA G=DGROUP M=CLOSE ACBP=48
- 3A39:4734 0000 C=DATA S=_DATA G=DGROUP M=CLOSEA ACBP=48
- 3A39:4734 0000 C=DATA S=_DATA G=DGROUP M=CREAT ACBP=48
- 3A39:4734 0000 C=DATA S=_DATA G=DGROUP M=FCLOSE ACBP=48
- 3A39:4734 0000 C=DATA S=_DATA G=DGROUP M=FFLUSH ACBP=48
- 3A39:4734 0000 C=DATA S=_DATA G=DGROUP M=FINDFIRS ACBP=48
- 3A39:4734 0000 C=DATA S=_DATA G=DGROUP M=FLENGTH ACBP=48
- 3A39:4734 0000 C=DATA S=_DATA G=DGROUP M=FLUSHALL ACBP=48
- 3A39:4734 0000 C=DATA S=_DATA G=DGROUP M=FOPEN ACBP=48
- 3A39:4734 0000 C=DATA S=_DATA G=DGROUP M=FPRINTF ACBP=48
- 3A39:4734 0000 C=DATA S=_DATA G=DGROUP M=FSEEK ACBP=48
- 3A39:4734 0000 C=DATA S=_DATA G=DGROUP M=GETENV ACBP=48
- 3A39:4734 0000 C=DATA S=_DATA G=DGROUP M=LTOA1 ACBP=48
- 3A39:4734 0000 C=DATA S=_DATA G=DGROUP M=MEMCPY ACBP=48
- 3A39:4734 0000 C=DATA S=_DATA G=DGROUP M=MOVEDATA ACBP=48
- 3A39:4734 0000 C=DATA S=_DATA G=DGROUP M=OPEN ACBP=48
- 3A39:4734 0000 C=DATA S=_DATA G=DGROUP M=OPENA ACBP=48
- 3A39:4734 0000 C=DATA S=_DATA G=DGROUP M=PRINTF ACBP=48
- 3A39:4734 0001 C=DATA S=_DATA G=DGROUP M=PUTC ACBP=48
- 3A39:4736 0000 C=DATA S=_DATA G=DGROUP M=PUTS ACBP=48
- 3A39:4736 0000 C=DATA S=_DATA G=DGROUP M=READ ACBP=48
- 3A39:4736 0000 C=DATA S=_DATA G=DGROUP M=READU ACBP=48
- 3A39:4736 0004 C=DATA S=_DATA G=DGROUP M=SETVBUF ACBP=48
- 3A39:473A 0000 C=DATA S=_DATA G=DGROUP M=SPRINTF ACBP=48
- 3A39:473A 0000 C=DATA S=_DATA G=DGROUP M=STRCAT ACBP=48
- 3A39:473A 0000 C=DATA S=_DATA G=DGROUP M=STRCPY ACBP=48
- 3A39:473A 0000 C=DATA S=_DATA G=DGROUP M=STRLEN ACBP=48
- 3A39:473A 0000 C=DATA S=_DATA G=DGROUP M=STRTOL ACBP=48
- 3A39:473A 0000 C=DATA S=_DATA G=DGROUP M=WRITE ACBP=48
- 3A39:473A 0000 C=DATA S=_DATA G=DGROUP M=WRITEA ACBP=48
- 3A39:473A 0000 C=DATA S=_DATA G=DGROUP M=WRITEU ACBP=48
- 3A39:473A 0000 C=DATA S=_DATA G=DGROUP M=XFCLOSE ACBP=48
- 3A39:473A 0000 C=DATA S=_DATA G=DGROUP M=XFFLUSH ACBP=48
- 3A39:473A 0000 C=DATA S=_DATA G=DGROUP M=FMEMCMP ACBP=48
- 3A39:473A 0000 C=DATA S=_DATA G=DGROUP M=FMEMCPY ACBP=48
- 3A39:473A 0000 C=DATA S=_DATA G=DGROUP M=FMEMSET ACBP=48
- 3A39:473A 0000 C=DATA S=_DATA G=DGROUP M=FSTRCPY ACBP=48
- 3A39:473A 0000 C=DATA S=_DATA G=DGROUP M=FSTRICMP ACBP=48
- 3A39:473A 0000 C=DATA S=_DATA G=DGROUP M=FSTRLEN ACBP=48
- 3A39:473A 0000 C=DATA S=_DATA G=DGROUP M=DOSDFREE ACBP=48
- 3A39:473A 0000 C=DATA S=_CVTSEG G=DGROUP M=C0.ASM ACBP=48
- 3A39:473A 0002 C=DATA S=_CVTSEG G=DGROUP M=REALCVT ACBP=48
- 3A39:473C 0002 C=DATA S=_CVTSEG G=DGROUP M=CVTFAK ACBP=48
- 3A39:473E 0000 C=DATA S=_CVTSEG G=DGROUP M=REALCVT ACBP=48
- 3A39:473E 0000 C=DATA S=_SCNSEG G=DGROUP M=C0.ASM ACBP=48
- 3A39:473E 0006 C=DATA S=_SCNSEG G=DGROUP M=SCANTOD ACBP=48
- 3A39:4744 0006 C=DATA S=_SCNSEG G=DGROUP M=CVTFAK ACBP=48
- 3A39:474A 0000 C=CONST S=_CONST G=DGROUP M=C0.ASM ACBP=48
- 3A39:474A 0000 C=INITDATA S=_INIT_ G=DGROUP M=C0.ASM ACBP=48
- 3A39:474A 0006 C=INITDATA S=_INIT_ G=DGROUP M=FPINIT ACBP=48
- 3A39:4750 0006 C=INITDATA S=_INIT_ G=DGROUP M=SETUPIO ACBP=48
- 3A39:4756 0006 C=INITDATA S=_INIT_ G=DGROUP M=CRTINIT ACBP=48
- 3A39:475C 0006 C=INITDATA S=_INIT_ G=DGROUP M=SETARGV ACBP=48
- 3A39:4762 0006 C=INITDATA S=_INIT_ G=DGROUP M=SETENVP ACBP=48
- 3A39:4768 0000 C=INITDATA S=_INITEND_ G=DGROUP M=C0.ASM ACBP=28
- 3A39:4768 0000 C=EXITDATA S=_EXIT_ G=DGROUP M=C0.ASM ACBP=48
- 3A39:4768 0006 C=EXITDATA S=_EXIT_ G=DGROUP M=FPINIT ACBP=48
- 3A39:476E 0000 C=EXITDATA S=_EXITEND_ G=DGROUP M=C0.ASM ACBP=28
- 3A39:476E 0000 C=BSS S=_BSS G=DGROUP M=C0.ASM ACBP=48
- 3A39:476E 0000 C=BSS S=_BSS G=DGROUP M=WOLFHACK.C ACBP=48
- 3A39:476E 0002 C=BSS S=_BSS G=DGROUP M=WL_MAIN.C ACBP=48
- 3A39:4770 0000 C=BSS S=_BSS G=DGROUP M=WL_TEXT.C ACBP=48
- 3A39:4770 0002 C=BSS S=_BSS G=DGROUP M=WL_MENU.C ACBP=48
- 3A39:4772 0000 C=BSS S=_BSS G=DGROUP M=WL_INTER.C ACBP=48
- 3A39:4772 0000 C=BSS S=_BSS G=DGROUP M=WL_GAME.C ACBP=48
- 3A39:4772 0000 C=BSS S=_BSS G=DGROUP M=WL_PLAY.C ACBP=48
- 3A39:4772 000A C=BSS S=_BSS G=DGROUP M=WL_DEBUG.C ACBP=48
- 3A39:477C 0000 C=BSS S=_BSS G=DGROUP M=WL_DRAW.C ACBP=48
- 3A39:477C 0004 C=BSS S=_BSS G=DGROUP M=WL_SCALE.C ACBP=48
- 3A39:4780 0000 C=BSS S=_BSS G=DGROUP M=WL_STATE.C ACBP=48
- 3A39:4780 0000 C=BSS S=_BSS G=DGROUP M=WL_AGENT.C ACBP=48
- 3A39:4780 0000 C=BSS S=_BSS G=DGROUP M=WL_ACT1.C ACBP=48
- 3A39:4780 0000 C=BSS S=_BSS G=DGROUP M=WL_ACT2.C ACBP=48
- 3A39:4780 0000 C=BSS S=_BSS G=DGROUP M=ID_CA.C ACBP=48
- 3A39:4780 0014 C=BSS S=_BSS G=DGROUP M=ID_IN.C ACBP=48
- 3A39:4794 0000 C=BSS S=_BSS G=DGROUP M=ID_MM.C ACBP=48
- 3A39:4794 0000 C=BSS S=_BSS G=DGROUP M=ID_PM.C ACBP=48
- 3A39:4794 0180 C=BSS S=_BSS G=DGROUP M=ID_SD.C ACBP=48
- 3A39:4914 0030 C=BSS S=_BSS G=DGROUP M=ID_US_1.C ACBP=48
- 3A39:4944 0000 C=BSS S=_BSS G=DGROUP M=ID_VL.C ACBP=48
- 3A39:4944 0000 C=BSS S=_BSS G=DGROUP M=ID_VH.C ACBP=48
- 3A39:4944 0000 C=BSS S=_BSS G=DGROUP M=ATAN ACBP=48
- 3A39:4944 0000 C=BSS S=_BSS G=DGROUP M=LDTRUNC ACBP=48
- 3A39:4944 0000 C=BSS S=_BSS G=DGROUP M=REALCVT ACBP=48
- 3A39:4944 0000 C=BSS S=_BSS G=DGROUP M=SCANTOD ACBP=48
- 3A39:4944 0000 C=BSS S=_BSS G=DGROUP M=XCVT ACBP=48
- 3A39:4944 0000 C=BSS S=_BSS G=DGROUP M=_POW10 ACBP=48
- 3A39:4944 0000 C=BSS S=_BSS G=DGROUP M=SIN ACBP=48
- 3A39:4944 0000 C=BSS S=_BSS G=DGROUP M=TAN ACBP=48
- 3A39:4944 0000 C=BSS S=_BSS G=DGROUP M=ATAN2 ACBP=48
- 3A39:4944 0080 C=BSS S=_BSS G=DGROUP M=ATEXIT ACBP=48
- 3A39:49C4 0000 C=BSS S=_BSS G=DGROUP M=DOSFATTR ACBP=48
- 3A39:49C4 0000 C=BSS S=_BSS G=DGROUP M=DOSWRITE ACBP=48
- 3A39:49C4 0000 C=BSS S=_BSS G=DGROUP M=GETVECT ACBP=48
- 3A39:49C4 0000 C=BSS S=_BSS G=DGROUP M=IOERROR ACBP=48
- 3A39:49C4 0000 C=BSS S=_BSS G=DGROUP M=ISATTY ACBP=48
- 3A39:49C4 0000 C=BSS S=_BSS G=DGROUP M=LONGTOA ACBP=48
- 3A39:49C4 0000 C=BSS S=_BSS G=DGROUP M=LSEEK ACBP=48
- 3A39:49C4 000D C=BSS S=_BSS G=DGROUP M=MKNAME ACBP=48
- 3A39:49D2 0000 C=BSS S=_BSS G=DGROUP M=OUTPORT ACBP=48
- 3A39:49D2 0000 C=BSS S=_BSS G=DGROUP M=READA ACBP=48
- 3A39:49D2 0000 C=BSS S=_BSS G=DGROUP M=SCANTOL ACBP=48
- 3A39:49D2 0000 C=BSS S=_BSS G=DGROUP M=SETUPIO ACBP=48
- 3A39:49D2 0004 C=BSS S=_BSS G=DGROUP M=SIGDATA ACBP=48
- 3A39:49D6 0000 C=BSS S=_BSS G=DGROUP M=UNLINK ACBP=48
- 3A39:49D6 0000 C=BSS S=_BSS G=DGROUP M=VPRINTER ACBP=48
- 3A39:49D6 0000 C=BSS S=_BSS G=DGROUP M=VRAM ACBP=48
- 3A39:49D6 0000 C=BSS S=_BSS G=DGROUP M=BIOSKEY ACBP=48
- 3A39:49D6 0000 C=BSS S=_BSS G=DGROUP M=BRK ACBP=48
- 3A39:49D6 0000 C=BSS S=_BSS G=DGROUP M=CORELEFT ACBP=48
- 3A39:49D6 0000 C=BSS S=_BSS G=DGROUP M=CRTINIT ACBP=48
- 3A39:49D6 000C C=BSS S=_BSS G=DGROUP M=HARDERR ACBP=48
- 3A39:49E2 0000 C=BSS S=_BSS G=DGROUP M=IOCTL ACBP=48
- 3A39:49E2 0000 C=BSS S=_BSS G=DGROUP M=SETBLOCK ACBP=48
- 3A39:49E2 0000 C=BSS S=_BSS G=DGROUP M=ATOL ACBP=48
- 3A39:49E2 0000 C=BSS S=_BSS G=DGROUP M=BDOS ACBP=48
- 3A39:49E2 0000 C=BSS S=_BSS G=DGROUP M=CHMODA ACBP=48
- 3A39:49E2 0000 C=BSS S=_BSS G=DGROUP M=CLOSEA ACBP=48
- 3A39:49E2 0000 C=BSS S=_BSS G=DGROUP M=CREAT ACBP=48
- 3A39:49E2 0000 C=BSS S=_BSS G=DGROUP M=FINDFIRS ACBP=48
- 3A39:49E2 0000 C=BSS S=_BSS G=DGROUP M=FLENGTH ACBP=48
- 3A39:49E2 0000 C=BSS S=_BSS G=DGROUP M=GETENV ACBP=48
- 3A39:49E2 0000 C=BSS S=_BSS G=DGROUP M=MEMCPY ACBP=48
- 3A39:49E2 0000 C=BSS S=_BSS G=DGROUP M=MOVEDATA ACBP=48
- 3A39:49E2 0000 C=BSS S=_BSS G=DGROUP M=OPEN ACBP=48
- 3A39:49E2 0000 C=BSS S=_BSS G=DGROUP M=OPENA ACBP=48
- 3A39:49E2 0001 C=BSS S=_BSS G=DGROUP M=PUTC ACBP=48
- 3A39:49E4 0000 C=BSS S=_BSS G=DGROUP M=READ ACBP=48
- 3A39:49E4 0000 C=BSS S=_BSS G=DGROUP M=STRCAT ACBP=48
- 3A39:49E4 0000 C=BSS S=_BSS G=DGROUP M=STRCPY ACBP=48
- 3A39:49E4 0000 C=BSS S=_BSS G=DGROUP M=STRLEN ACBP=48
- 3A39:49E4 0000 C=BSS S=_BSS G=DGROUP M=WRITEA ACBP=48
- 3A39:49E4 0000 C=BSS S=_BSS G=DGROUP M=FMEMCMP ACBP=48
- 3A39:49E4 0000 C=BSS S=_BSS G=DGROUP M=FMEMCPY ACBP=48
- 3A39:49E4 0000 C=BSS S=_BSS G=DGROUP M=FMEMSET ACBP=48
- 3A39:49E4 0000 C=BSS S=_BSS G=DGROUP M=FSTRCPY ACBP=48
- 3A39:49E4 0000 C=BSS S=_BSS G=DGROUP M=FSTRICMP ACBP=48
- 3A39:49E4 0000 C=BSS S=_BSS G=DGROUP M=FSTRLEN ACBP=48
- 3A39:49E4 A5CB C=BSS S=_COMDEF_ G=DGROUP M=WOLFHACK.C ACBP=48
- 3A39:EFAF 0000 C=BSSEND S=_BSSEND G=DGROUP M=C0.ASM ACBP=28
- 4934:0000 0080 C=STACK S=_STACK G=(none) M=C0.ASM ACBP=74
-
- Address Publics by Name
-
- 3A39:0000 idle DATASEG@
- 0000:02AE idle DGROUP@
- 1E39:2152 e086_Entry
- 1E39:26E0 e086_Shortcut
- 20B1:0306 e087_Entry
- 20B1:03C6 e087_Shortcut
- 20B1:0430 e087_Trap
- 0000:FE32 idle FIARQQ
- 0000:0E32 idle FICRQQ
- 0000:5C32 Abs FIDRQQ
- 0000:1632 Abs FIERQQ
- 0000:0632 idle FISRQQ
- 0000:A23D Abs FIWRQQ
- 0000:4000 idle FJARQQ
- 0000:C000 idle FJCRQQ
- 0000:8000 idle FJSRQQ
- 0000:1130 idle FTOL@
- 0000:1130 F_FTOL@
- 0000:02B5 F_LDIV@
- 0000:02DC F_LMOD@
- 0000:02D4 idle F_LUDIV@
- 0000:02E4 idle F_LUMOD@
- 0000:1320 F_LXLSH@
- 0000:12A9 F_LXMUL@
- 0000:1341 F_LXRSH@
- 0000:1361 F_LXURSH@
- 0000:1382 F_PADA@
- 0000:140A F_PADD@
- 0000:12C0 F_PCMP@
- 0000:13C6 F_PSBA@
- 0000:146A F_PSBP@
- 0000:1439 idle F_PSUB@
- 0000:12E1 F_SCOPY@
- 0000:1495 F_SPUSH@
- 0000:02B5 LDIV@
- 0000:02DC idle LMOD@
- 0000:02D4 idle LUDIV@
- 0000:02E4 idle LUMOD@
- 0000:1320 idle LXLSH@
- 0000:12A9 idle LXMUL@
- 0000:1341 idle LXRSH@
- 0000:1361 idle LXURSH@
- 0000:02B2 idle N_LDIV@
- 0000:02D9 idle N_LMOD@
- 0000:02D1 idle N_LUDIV@
- 0000:02E1 idle N_LUMOD@
- 0000:131D N_LXLSH@
- 0000:133E idle N_LXRSH@
- 0000:135E idle N_LXURSH@
- 0000:137F idle N_PADA@
- 0000:1407 N_PADD@
- 0000:1657 N_PCMP@
- 0000:13C3 idle N_PSBA@
- 0000:1467 N_PSBP@
- 0000:1436 idle N_PSUB@
- 0000:148F idle N_SPUSH@
- 0000:1382 idle PADA@
- 0000:140A idle PADD@
- 0000:12C0 idle PCMP@
- 0000:13C6 idle PSBA@
- 0000:146A idle PSBP@
- 0000:1439 idle PSUB@
- 0000:12E1 idle SCOPY@
- 0000:1495 idle SPUSH@
- 0000:0296 _abort
- 3A39:EE11 _abortprogram
- 3A39:55BA _actorat
- 3A39:9C43 _AdLibPresent
- 3A39:3293 idle _afilename
- 3A39:E8B0 _aftersort
- 3A39:3289 idle _aheadname
- 3A39:EAB2 _alBlock
- 3A39:EAAE _alLengthLeft
- 3A39:EAB8 _alNoCheck
- 1A28:0D03 _alOut
- 3A39:EAB4 _alSound
- 3A39:EAAA _alTimeCount
- 3A39:EA9A _alZeroInst
- 3A39:D9C6 _angle
- 3A39:A4E2 _anglefrac
- 3A39:52DC _areabyplayer
- 33DA:0000 _areaconnect
- 0FB8:0072 _AsmRefresh
- 0000:05E8 _atan
- 0000:1075 _atan2
- 0000:115C idle _atexit
- 0000:3279 idle _atoi
- 0000:3209 _atol
- 3A39:192C idle _attackinfo
- 3A39:E01D _audiohandle
- 3A39:E023 _audiohuffman
- 3A39:324A _audioname
- 3A39:A054 _audiosegs
- 3A39:E81B _audiostarts
- 13EC:072D _A_DeathScream
- 13EC:1220 idle _A_HitlerMorph
- 13EC:12A8 idle _A_MechaSound
- 13EC:12D8 idle _A_Slurpie
- 13EC:000C idle _A_Smoke
- 13EC:1F4F idle _A_StartDeathCam
- 3A39:9956 _backcolor
- 060A:0660 idle _BackPage
- 0FFD:000A idle _BadScale
- 3A39:4C52 _basedist
- 0000:3286 _bdos
- 3A39:E8B4 _beforesort
- 0000:1F54 _bioskey
- 0A85:056F idle _BJ_Breathe
- 3A39:9957 _blockstarts
- 3A39:E896 _bombonerror
- 3A39:A41C _bonuscount
- 3A39:EE15 _bordercolor
- 06A5:025E idle _BossKey
- 0000:1FCC idle _brk
- 3A39:E828 _btnstate
- 3A39:EFAB _bufferheight
- 3A39:52D4 _bufferofs
- 3A39:E826 _bufferseg
- 3A39:EFAD _bufferwidth
- 0FFD:01DB idle _BuildCompScale
- 048F:0BFA idle _BuildTables
- 3A39:EE0F _Button0
- 3A39:EE0D _Button1
- 3A39:A4FE _buttonheld
- 3A39:1290 _buttonjoy
- 3A39:1288 _buttonmouse
- 3A39:1278 _buttonscan
- 3A39:A4EA _buttonstate
- 060A:068A idle _CacheLayoutGraphics
- 06A5:2D10 _CacheLump
- 0EBC:02F9 idle _CalcHeight
- 048F:0D49 idle _CalcProjection
- 0EBC:0A73 idle _CalcRotate
- 0EBC:0D9E _CalcTics
- 06A5:148E idle _CalibrateJoystick
- 160F:046B idle _CAL_CarmackExpand
- 160F:0E22 idle _CAL_ExpandGrChunk
- 160F:0088 idle _CAL_GetGrChunkLength
- 160F:0300 idle _CAL_HuffExpand
- 160F:02B5 idle _CAL_OptimizeNodes
- 160F:0B75 idle _CAL_SetupAudioFile
- 160F:078E idle _CAL_SetupGrFile
- 160F:09C0 idle _CAL_SetupMapFile
- 160F:0CF9 _CA_CacheAudioChunk
- 160F:0EF4 _CA_CacheGrChunk
- 160F:111A _CA_CacheMap
- 160F:135D _CA_CacheMarks
- 160F:1031 _CA_CacheScreen
- 160F:165E idle _CA_CannotOpen
- 160F:12ED idle _CA_ClearAllMarks
- 160F:12CC idle _CA_ClearMarks
- 160F:0077 idle _CA_CloseDebug
- 160F:12A6 _CA_DownLevel
- 160F:00E4 _CA_FarRead
- 160F:012F _CA_FarWrite
- 3A39:9EE9 _ca_levelbit
- 3A39:E823 _ca_levelnum
- 160F:0DA1 _CA_LoadAllSounds
- 160F:023B idle _CA_LoadFile
- 160F:0056 idle _CA_OpenDebug
- 160F:017A idle _CA_ReadFile
- 160F:058F idle _CA_RLEWCompress
- 160F:06D7 idle _CA_RLEWexpand
- 160F:1336 _CA_SetAllPurge
- 160F:130F idle _CA_SetGrPurge
- 160F:0CD0 _CA_Shutdown
- 160F:0CAF _CA_Startup
- 160F:1269 _CA_UpLevel
- 160F:01E5 _CA_WriteFile
- 0CFC:05E6 _CenterWindow
- 3A39:9896 _centerx
- 06A5:3C30 _CheckForEpisodes
- 0A85:120F _CheckHighScore
- 048C:0000 _CheckIs386
- 0CFC:0614 idle _CheckKeys
- 1087:0FED _CheckLine
- 06A5:3B7D idle _CheckPause
- 13EC:1EB7 idle _CheckPosition
- 1087:1291 idle _CheckSight
- 1201:0005 idle _CheckWeaponChange
- 3A39:E019 _chunkcomplen
- 3A39:E015 _chunkexplen
- 3A39:D866 _ChunksInFile
- 06A5:2F07 idle _CleanupControlPanel
- 0BC6:017B _ClearMemory
- 06A5:2CF7 _ClearMScreen
- 0CFC:0CBC idle _ClearPaletteShifts
- 0A85:0004 _ClearSplitVWB
- 1201:091D idle _ClipMove
- 0000:32B1 _close
- 1320:0369 idle _CloseDoor
- 0000:1FE8 _clrscr
- 1201:0B37 idle _Cmd_Fire
- 1201:0B89 idle _Cmd_Use
- 3A39:0418 idle _color_hlite
- 3A39:0420 idle _color_norml
- 3A39:D846 _compatability
- 3A39:00EE _configname
- 06A5:3839 idle _Confirm
- 1320:01B7 idle _ConnectAreas
- 1201:0039 idle _ControlMovement
- 3A39:E844 _Controls
- 3A39:A4FC _controlx
- 3A39:A4FA _controly
- 0000:2011 _coreleft
- 3A39:1694 _costable
- 0E0D:00C2 idle _CountObjects
- 06A5:288C idle _CP_ChangeView
- 06A5:02A8 idle _CP_CheckQuick
- 06A5:16A9 idle _CP_Control
- 06A5:079D idle _CP_EndGame
- 06A5:0EDA idle _CP_LoadGame
- 06A5:0851 idle _CP_NewGame
- 06A5:2A7D idle _CP_Quit
- 06A5:11BB idle _CP_SaveGame
- 06A5:0ADF idle _CP_Sound
- 06A5:07F3 _CP_ViewScores
- 0000:3310 _creat
- 3A39:03F0 idle _CtlItems
- 23B4:0000 idle _CtlMenu
- 3A39:EE0B _CursorBad
- 3A39:EE09 _CursorX
- 3A39:EE07 _CursorY
- 3A39:03FA idle _CusItems
- 2407:0000 idle _CusMenu
- 06A5:1C5A idle _CustomControls
- 1087:0EF2 _DamageActor
- 3A39:A41E _damagecount
- 3A39:E81F _debughandle
- 0E0D:076C _DebugKeys
- 0E0D:000D idle _DebugMemory
- 3A39:A4DE _DebugOk
- 06A5:1D37 idle _DefineJoyBtns
- 06A5:1D73 idle _DefineKeyBtns
- 06A5:1DAF idle _DefineKeyMove
- 06A5:1CFB idle _DefineMouseBtns
- 3A39:E842 _DemoBuffer
- 3A39:A2AC _demobuffer
- 048F:159A idle _DemoLoop
- 3A39:335E idle _DemoMode
- 3A39:1204 _demoname
- 3A39:E840 _DemoOffset
- 3A39:A2B6 _demoplayback
- 3A39:A2B2 _demoptr
- 3A39:A2B8 _demorecord
- 3A39:E83E _DemoSize
- 3A39:181E idle _diagonal
- 0BC6:0F34 idle _Died
- 3A39:ECD5 _DigiLastEnd
- 3A39:ECD7 _DigiLastStart
- 3A39:ECDB _DigiLeft
- 3A39:D84A _DigiList
- 3A39:9B8B _DigiMap
- 3A39:9C3B _DigiMode
- 3A39:ECEF _DigiNumber
- 3A39:ECD9 _DigiPage
- 3A39:ED07 _DigiPlaying
- 3A39:ECEB _DigiPriority
- 3A39:00DC _dirangle
- 3A39:46E1 _directvideo
- 3A39:1270 _dirscan
- 3A39:1B38 idle _dirtable
- 048F:03BA idle _DiskFlopAnim
- 3A39:9D4E _displayofs
- 0CFC:0E00 idle _DoActor
- 048F:03E9 idle _DoChecksum
- 048F:1041 idle _DoJukebox
- 1320:07B9 idle _DoorClosing
- 3A39:D85C _doornum
- 3A39:86BA _doorobjlist
- 1320:0631 idle _DoorOpen
- 1320:065F idle _DoorOpening
- 3A39:5328 _doorposition
- 0BC6:09E5 _DrawAllPlayBorder
- 0BC6:09BA _DrawAllPlayBorderSides
- 1201:04F5 _DrawAmmo
- 06A5:29FF idle _DrawChangeView
- 06A5:1A9B idle _DrawCtlScreen
- 06A5:275E idle _DrawCustJoy
- 06A5:27F2 idle _DrawCustKeybd
- 06A5:285A idle _DrawCustKeys
- 06A5:26B7 idle _DrawCustMouse
- 06A5:23A7 idle _DrawCustomScreen
- 1201:01FF _DrawFace
- 06A5:34BE idle _DrawGun
- 06A5:347E idle _DrawHalfStep
- 1201:032A _DrawHealth
- 0A85:1041 _DrawHighScores
- 1201:047F _DrawKeys
- 1201:03C2 _DrawLevel
- 1201:03DB _DrawLives
- 06A5:1089 idle _DrawLoadSaveScreen
- 06A5:0E5E idle _DrawLSAction
- 06A5:01BE idle _DrawMainMenu
- 06A5:35AC _DrawMenu
- 06A5:3BBD idle _DrawMenuGun
- 06A5:17AE idle _DrawMouseSens
- 06A5:098F idle _DrawNewEpisode
- 06A5:0A3C idle _DrawNewGame
- 06A5:0AC6 idle _DrawNewGameDiff
- 06A5:2DA4 idle _DrawOutline
- 044B:027E idle _DrawPlanes
- 0BC6:0A11 _DrawPlayBorder
- 0BC6:0930 idle _DrawPlayBorderSides
- 0EBC:0D02 idle _DrawPlayerWeapon
- 0BC6:0ADB _DrawPlayScreen
- 0EBC:0AEF idle _DrawScaleds
- 1201:0411 _DrawScore
- 06A5:0C70 idle _DrawSoundMenu
- 044B:0034 idle _DrawSpans
- 06A5:3BF0 _DrawStripes
- 1201:0468 _DrawWeapon
- 06A5:2D6E _DrawWindow
- 1087:0B99 idle _DropItem
- 3A39:A422 _dummyobj
- 3A39:0E74 idle _ElevatorBackTo
- 3A39:352A idle _EMMDriverName
- 3A39:E8F2 _EMSAvail
- 3A39:E8F0 _EMSHandle
- 3A39:E8D4 _EMSList
- 3A39:E8EE _EMSPageFrame
- 3A39:A294 _EMSPagesAvail
- 3A39:E8C2 _EMSPagesUsed
- 3A39:E8EC _EMSPhysicalPage
- 3A39:A298 _EMSPresent
- 3A39:0330 idle _endextern
- 3A39:0341 _endfilename
- 234F:0000 idle _endStrings
- 060A:090C _EndText
- 06A5:1DEB idle _EnterCtrlData
- 3A39:4732 _environ
- 3A39:0428 idle _EpisodeSelect
- 06A5:3407 idle _EraseGun
- 3A39:00C3 _errno
- 0000:126E _exit
- 3A39:A04F _extension
- 3A39:A50E _extravbls
- 3A39:A4E0 _facecount
- 0000:2757 _farcoreleft
- 0000:2333 _farfree
- 3A39:E8AA _farheap
- 0000:243D _farmalloc
- 3A39:863A _farmapylookup
- 0000:259A idle _farrealloc
- 0EBC:040A _FarScalePost
- 3A39:D868 _farthest
- 3A39:EE13 _fastpalette
- 0000:3382 _fclose
- 0000:33FF _fflush
- 0000:34E0 _filelength
- 0000:3480 _findfirst
- 0000:34B3 _findnext
- 34A1:0000 _finetangent
- 0BC6:0BC7 idle _FinishDemoRecord
- 0CFC:0DD6 _FinishPaletteShifts
- 048F:0F21 idle _FinishSignon
- 1087:138E idle _FirstSighting
- 0EBC:000F _FixedByFrac
- 044B:000C idle _FixedMul
- 0EBC:0E01 _FixOfs
- 06A5:2237 idle _FixupCustom
- 1D62:07A1 _FizzleFade
- 3A39:A2C8 _fizzlein
- 0000:3521 _flushall
- 3A39:989A _focallength
- 3A39:D9D0 _focaltx
- 3A39:D9CE _focalty
- 3A39:9D4D _fontcolor
- 3A39:9D4B _fontnumber
- 0000:36DC _fopen
- 0000:36FB _fprintf
- 0000:3B2A _fputc
- 0000:3C5E idle _fputchar
- 3A39:A4E6 _frameon
- 0000:2A9D _free
- 3A39:168A _freelatch
- 06A5:3B16 _FreeMusic
- 0000:376E _fseek
- 0000:37D6 idle _ftell
- 3A39:D9DC _fullscalefarcall
- 3A39:A416 _funnyticount
- 0BC6:1162 _GameLoop
- 3A39:2F4A _gamepal
- 3A39:ED0B _Games
- 3A39:95C2 _gamestate
- 3A39:326B idle _gdictname
- 1201:0557 _GetBonus
- 0000:3823 _getenv
- 0CFC:09F4 _GetNewActor
- 0000:27F0 _gettext
- 0000:12FD _getvect
- 3A39:3261 idle _gfilename
- 3A39:3257 idle _gheadname
- 1201:050D idle _GiveAmmo
- 1201:03F3 idle _GiveExtraMan
- 1201:0542 idle _GiveKey
- 1201:042B _GivePoints
- 1201:04CC _GiveWeapon
- 3A39:A2A8 _globalsoundx
- 3A39:A2A4 _globalsoundy
- 3A39:A512 _godmode
- 3A39:E00B _gotgatgun
- 0000:27A7 _gotoxy
- 160F:0008 idle _GRFILEPOS
- 3A39:E021 _grhandle
- 3A39:E41F _grhuffman
- 3582:0000 _grneeded
- 3A39:9D50 _grsegs
- 3A39:E81D _grstarts
- 1201:0DFF idle _GunAttack
- 3A39:ED01 _HackCount
- 3A39:00DA idle _halfheight
- 060A:00F7 idle _HandleCommand
- 060A:03A7 idle _HandleCtrls
- 06A5:2F1D _HandleMenu
- 060A:03C7 idle _HandleWord
- 0000:2885 _harderr
- 0000:2897 idle _hardresume
- 0000:28A5 idle _hardretn
- 1201:039B _HealSelf
- 3A39:9606 _heightnumerator
- 3A39:0332 idle _helpextern
- 3A39:0334 idle _helpfilename
- 060A:0885 idle _HelpScreens
- 0EBC:0653 _HitHorizDoor
- 0EBC:0857 _HitHorizPWall
- 0EBC:0531 _HitHorizWall
- 0EBC:0753 _HitVertDoor
- 0EBC:0931 _HitVertPWall
- 0EBC:0412 _HitVertWall
- 3A39:542A _horizwall
- 3A39:A04A _ingame
- 0CFC:09B0 _InitActorList
- 1320:01F0 _InitAreas
- 048F:1020 idle _InitDigiMap
- 1320:0218 _InitDoorList
- 048F:122A idle _InitGame
- 0CFC:0B4C _InitRedShifts
- 1320:000F _InitStaticList
- 177B:01DA _INL_GetJoyDelta
- 3A39:DDF7 _insetupscaling
- 06A5:2B04 _IntroScreen
- 177B:0AB2 _IN_Ack
- 177B:0A59 _IN_CheckAck
- 177B:068B _IN_ClearKeysDown
- 177B:060E idle _IN_Default
- 177B:0141 _IN_GetJoyAbs
- 177B:0336 idle _IN_GetJoyButtonsDB
- 06A5:3B39 idle _IN_GetScanName
- 177B:0B1B _IN_JoyButtons
- 177B:0B04 _IN_MouseButtons
- 177B:06AA _IN_ReadControl
- 177B:09C2 idle _IN_SetControlType
- 177B:0679 idle _IN_SetKeyHook
- 177B:048B _IN_SetupJoy
- 177B:064D _IN_Shutdown
- 177B:0A0A _IN_StartAck
- 177B:0572 _IN_Startup
- 177B:0AC3 _IN_UserInput
- 177B:09EF _IN_WaitForASCII
- 177B:09D3 idle _IN_WaitForKey
- 0000:29D9 _ioctl
- 3A39:989E _IsA386
- 0000:1501 _isatty
- 0000:3882 _itoa
- 048C:0028 _jabhack2
- 3A39:00FC idle _JHParmStrings
- 3A39:E84C _JoyDefs
- 3A39:54B0 _joypadenabled
- 3A39:E83C _JoyPadPresent
- 3A39:9C45 _JoysPresent
- 3A39:54B2 _joystickenabled
- 3A39:54AC _joystickport
- 3A39:54AE _joystickprogressive
- 3A39:3354 idle _KbdDefs
- 3A39:9C4B _Keyboard
- 1087:0C2C idle _KillActor
- 3A39:A2BA _killerobj
- 1201:0D6B idle _KnifeAttack
- 3A39:A04C _LastASCII
- 3A39:E009 _LastAttacker
- 3A39:A2AE _lastdemoptr
- 3A39:E011 _lastdoorobj
- 3A39:D9D4 _lastintercept
- 3A39:B518 _lastobj
- 3A39:9EE2 _LastScan
- 3A39:D9D8 _lastside
- 3A39:893A _laststatobj
- 3A39:D9D2 _lasttilehit
- 3A39:9EEC _lasttimecount
- 1D62:062F _LatchDrawPic
- 1201:02A1 idle _LatchNumber
- 3A39:A2D2 _latchpics
- 3A39:9E8E _layoutdone
- 3A39:A2A2 _leftchannel
- 3A39:9EBC _leftmargin
- 3A39:3FCE idle _leftmasks
- 3A39:ECE9 _LeftPosition
- 3A39:1042 idle _lefttable
- 0A85:05D1 _LevelCompleted
- 3A39:9906 _LevelRatios
- 3A39:DDEB _linecmds
- 3A39:DDE7 _linescale
- 3A39:EFA7 _linewidth
- 3A39:9B85 _loadedgame
- 1D62:0687 _LoadLatchMem
- 048F:0803 _LoadTheGame
- 3A39:ECDF _LocalTime
- 0000:15AC _lseek
- 3A39:03E6 idle _LSItems
- 23EC:0000 idle _LSMenu
- 0000:38C4 _ltoa
- 3A39:D844 _madenoise
- 048F:179C _main
- 3A39:03D2 _MainItems
- 3A39:E9BE _MainMemPages
- 3A39:E8F6 _MainMemUsed
- 237C:0000 _MainMenu
- 3A39:E8F4 _MainPagesAvail
- 3A39:E8C0 _MainPagesUsed
- 3A39:EA86 _MainPresent
- 0000:2B6C _malloc
- 3A39:E01F _maphandle
- 3A39:A39A _mapheaderseg
- 3A39:A2CC _mapheight
- 3A39:171A _mapmasks1
- 3A39:173A _mapmasks2
- 3A39:175A _mapmasks3
- 3A39:A29E _mapon
- 3A39:D852 _maporgx
- 3A39:D850 _maporgy
- 0485:0008 _MapRow
- 3A39:A412 _mapsegs
- 3A39:A2CE _mapwidth
- 3A39:A45E _mapwidthtable
- 3A39:DDE4 _mask1
- 3A39:DDE3 _mask2
- 3A39:DDE2 _mask3
- 3A39:DDE5 _maskword
- 0000:0F22 _matherr
- 3A39:DDF9 _maxscale
- 3A39:D9DA _maxscaleshl2
- 3A39:960A _maxslope
- 3A39:05F2 idle _mbarray
- 0000:38E9 _memcpy
- 3A39:52D2 _menuitems
- 06A5:3960 _Message
- 3A39:327F idle _mfilename
- 3A39:3275 idle _mheadname
- 3A39:D9C8 _midangle
- 3A39:1690 idle _mindist
- 3A39:9604 _minheightdiv
- 3A39:49FA _mirrorofs
- 37CC:0000 _mmblocks
- 3A39:A29C _mmerror
- 3A39:E8A0 _mmfree
- 3A39:E8A4 _mmhead
- 3A39:9E7A _mminfo
- 182E:0000 idle _MML_CheckForXMS
- 182E:0239 idle _MML_ClearBlock
- 182E:001B idle _MML_SetupXMS
- 182E:0087 idle _MML_ShutdownXMS
- 182E:00B6 _MML_UseSpace
- 3A39:E898 _mmnew
- 3A39:E89C _mmrover
- 3A39:E8AE _mmstarted
- 182E:0E3C _MM_BombOnError
- 182E:0C31 idle _MM_DumpData
- 182E:0767 _MM_FreePtr
- 182E:04B3 _MM_GetPtr
- 182E:08A9 _MM_SetLock
- 182E:082B _MM_SetPurge
- 182E:0AE0 idle _MM_ShowMemory
- 182E:048B _MM_Shutdown
- 182E:092B _MM_SortMem
- 182E:029A _MM_Startup
- 182E:0DC0 _MM_TotalFree
- 182E:0D5B _MM_UnusedMemory
- 3A39:988E _mouseadjustment
- 3A39:E838 _MouseDownCount
- 3A39:54B4 _mouseenabled
- 3A39:9C49 _MousePresent
- 06A5:18B2 idle _MouseSensitivity
- 0000:3908 _movedata
- 1320:08E8 _MoveDoors
- 1087:0967 _MoveObj
- 3A39:0622 idle _moveorder
- 1320:0AC9 _MovePWalls
- 0000:2A00 _movetext
- 3A39:49EE _mr_count
- 3A39:49E4 _mr_dest
- 3A39:49F0 _mr_rowofs
- 3A39:49E8 _mr_xfrac
- 3A39:49EC _mr_xstep
- 3A39:49E6 _mr_yfrac
- 3A39:49EA _mr_ystep
- 048F:0FBA _MS_CheckParm
- 3A39:01C4 idle _MusicItems
- 231F:0000 idle _MusicMenu
- 3A39:9C39 _MusicMode
- 3A39:E8A8 _nearheap
- 3A39:85BA _nearmapylookup
- 3A39:ED03 _NeedsDigitized
- 3A39:ED09 _NeedsMusic
- 3A39:95BE _new
- 3A39:0404 idle _NewEitems
- 23C4:0000 idle _NewEmenu
- 048F:0369 _NewGame
- 3A39:040E idle _NewItems
- 060A:034C idle _NewLine
- 23E1:0000 idle _NewMenu
- 1087:00BA _NewState
- 048F:148B _NewViewSize
- 3A39:ECFB _nextsoundpos
- 3A39:A510 _noclip
- 0A85:1353 idle _NonShareware
- 3A39:98A0 _nospr
- 3A39:01FC idle _nosprtxt
- 3A39:9B83 _NoWait
- 3A39:D84C _NumDigi
- 3A39:9EDA _numpages
- 3A39:E890 _numUMBs
- 3A39:B51A _obj
- 3A39:A420 _objcount
- 3A39:B516 _objfreelist
- 3A39:B51C _objlist
- 3A39:E013 _oldsoundmode
- 0000:3955 _open
- 1320:0340 _OpenDoor
- 1320:05BD _OperateDoor
- 3A39:180C idle _opposite
- 3A39:05FE idle _order
- 0000:169C idle _outp
- 0000:1678 _outport
- 0000:1684 idle _outportb
- 0000:1690 idle _outpw
- 3A39:3520 idle _PageFile
- 3A39:3512 _PageFileName
- 060A:0475 idle _PageLayout
- 3A39:9EDC _pagenum
- 3A09:0000 _palette1
- 39D9:0000 _palette2
- 3A39:A41A _palshifted
- 060A:001F idle _ParseNumber
- 060A:0071 idle _ParsePicCommand
- 060A:008F idle _ParseTimedCommand
- 048F:030D idle _Patch386
- 3A39:A04D _Paused
- 3A39:ECC0 _pcLastSample
- 3A39:ECB8 _pcLengthLeft
- 3A39:49F2 _pcos
- 3A39:ECBC _pcSound
- 3A39:EABA _pcSoundLookup
- 3A39:EFA9 _pelpan
- 0A85:03CC _PG13
- 3A39:9E90 _picdelay
- 3A39:9EEA _pickquick
- 3A39:9E92 _picnum
- 3A39:9EE7 _pictable
- 0E0D:01B3 _PicturePause
- 3A39:9E96 _picx
- 3A39:9E94 _picy
- 3A39:960E _pixelangle
- 3A39:3FCA idle _pixmasks
- 3A39:D9B2 _pixx
- 1320:00E1 _PlaceItemType
- 210E:0000 _planepics
- 3A39:4AC2 _planeylookup
- 0BC6:0DD1 _PlayDemo
- 3A39:95BC _player
- 3A39:E005 _playerxmove
- 3A39:E001 _playerymove
- 0CFC:0F8C _PlayLoop
- 0BC6:00F7 _PlaySoundLocGlobal
- 3A39:95C0 _playstate
- 3A39:DFFF _plux
- 3A39:DFFD _pluy
- 3A39:E8BA _PMFrameCount
- 1912:06B1 idle _PML_ClosePageFile
- 1912:0A96 idle _PML_GetAPageBuffer
- 1912:06E8 idle _PML_GetEMSAddress
- 1912:0BA0 idle _PML_GetPageFromXMS
- 1912:0812 idle _PML_GiveLRUPage
- 1912:08B0 idle _PML_GiveLRUXMSPage
- 1912:0C21 idle _PML_LoadPage
- 1912:0007 idle _PML_MapEMS
- 1912:04E8 idle _PML_OpenPageFile
- 1912:0920 idle _PML_PutPageInXMS
- 1912:046E idle _PML_ReadFromFile
- 1912:0155 idle _PML_ShutdownEMS
- 1912:0447 idle _PML_ShutdownMainMem
- 1912:0293 idle _PML_ShutdownXMS
- 1912:0029 idle _PML_StartupEMS
- 1912:03D0 idle _PML_StartupMainMem
- 1912:0178 idle _PML_StartupXMS
- 1912:09C9 idle _PML_TransferPageSpace
- 1912:01EA idle _PML_XMSCopy
- 3A39:E8BE _PMNumBlocks
- 3A39:D85E _PMPages
- 3A39:E8C8 _PMPanicMode
- 3A39:E8B8 _PMSegPages
- 3A39:D862 _PMSoundStart
- 3A39:D864 _PMSpriteStart
- 3A39:E8CA _PMStarted
- 3A39:E8C6 _PMThrashing
- 1912:02DF _PM_CheckMainMem
- 1912:0C71 _PM_GetPage
- 1912:07BF _PM_GetPageAddress
- 1912:0FBA _PM_NextFrame
- 1912:0D60 _PM_Preload
- 1912:1034 idle _PM_Reset
- 1912:02B8 _PM_SetMainMemPurge
- 1912:0D31 _PM_SetPageLock
- 1912:114B _PM_Shutdown
- 1912:10A0 _PM_Startup
- 0CFC:03B9 idle _PollControls
- 0CFC:006F idle _PollJoystickButtons
- 0CFC:0248 idle _PollJoystickMove
- 0CFC:0007 idle _PollKeyboardButtons
- 0CFC:0100 idle _PollKeyboardMove
- 0CFC:002B idle _PollMouseButtons
- 0CFC:020C idle _PollMouseMove
- 3A39:D858 _postsource
- 3A39:D854 _postwidth
- 3A39:D856 _postx
- 0000:0F17 _pow10
- 0A85:0FA5 _PreloadGraphics
- 0A85:0F10 idle _PreloadUpdate
- 06A5:2714 idle _PrintCustJoy
- 06A5:27BB idle _PrintCustKeybd
- 06A5:2824 idle _PrintCustKeys
- 06A5:266D idle _PrintCustMouse
- 0000:3AFA _printf
- 06A5:112F idle _PrintLSEntry
- 3A39:A048 _PrintX
- 3A39:9B81 _PrintY
- 3A39:E821 _profilehandle
- 13EC:005A idle _ProjectileTryMove
- 3A39:49F6 _psin
- 1320:093B _PushWall
- 0000:3E13 _puts
- 0000:2844 _puttext
- 3A39:52D6 _pwalldir
- 3A39:53A8 _pwallpos
- 3A39:5326 _pwallstate
- 3A39:52DA _pwallx
- 3A39:52D8 _pwally
- 3A39:9EE5 _px
- 3A39:9EE3 _py
- 048F:14CF _Quit
- 3A39:0102 idle _radtoint
- 0000:3F2C _read
- 06A5:36DC idle _ReadAnyControl
- 048F:000B idle _ReadConfig
- 0000:2CC5 idle _realloc
- 0BC6:0C9A _RecordDemo
- 1320:016B idle _RecursiveConnect
- 36AC:0000 _redshifts
- 0CFC:0A55 idle _RemoveObj
- 3A39:A2A0 _rightchannel
- 3A39:9E9E _rightmargin
- 3A39:3FD2 idle _rightmasks
- 3A39:ECE7 _RightPosition
- 3A39:0E80 idle _righttable
- 060A:000C idle _RipToEOL
- 230E:0002 idle _rndtable
- 3A39:9E98 _rowon
- 3A39:A4E4 _running
- 3A39:9EF0 _SaveGameNames
- 3A39:A032 _SaveGamesAvail
- 3A39:0436 idle _SaveName
- 048F:042E _SaveTheGame
- 3A39:ED05 _SBProPresent
- 0000:1FD8 idle _sbrk
- 3A39:52CA _scale
- 3A39:DDFB _scaledirectory
- 0FFD:032F idle _ScaleLine
- 0EBC:0397 idle _ScalePost
- 0FFD:0479 _ScaleShape
- 0BC6:0194 idle _ScanInfoPlane
- 3A39:3D1A _Scores
- 3A39:D848 _screenfaded
- 3A39:1684 _screenloc
- 3A39:9898 _screenofs
- 3A39:3FC4 _screenseg
- 1A28:0B5F _SDL_DigitizedDone
- 1BB1:0014 _SDL_IndicatePC
- 1A28:08B0 idle _SDL_LoadDigiSegment
- 1A28:08E1 idle _SDL_PlayDigiSegment
- 1A28:0501 idle _SDL_SBSetDMA
- 1BB1:000C _SDL_SetDS
- 1A28:0C2D idle _SDL_SetupDigi
- 1BB1:0021 _SDL_t0ExtremeAsmService
- 1BB1:009B _SDL_t0FastAsmService
- 1BB1:02CD _SDL_t0SlowAsmService
- 1A28:14B4 idle _SD_Default
- 1A28:1870 idle _SD_FadeOutMusic
- 1A28:17DA _SD_MusicOff
- 1A28:17CF _SD_MusicOn
- 1A28:1881 idle _SD_MusicPlaying
- 1A28:0A9F idle _SD_PlayDigitized
- 1A28:15A4 _SD_PlaySound
- 1A28:09CC _SD_Poll
- 1A28:158D _SD_PositionSound
- 1A28:0BC9 _SD_SetDigiDevice
- 1A28:1129 _SD_SetMusicMode
- 1A28:0A58 _SD_SetPosition
- 1A28:109B _SD_SetSoundMode
- 1A28:157B idle _SD_SetUserHook
- 1A28:1523 _SD_Shutdown
- 1A28:1744 _SD_SoundPlaying
- 1A28:181E _SD_StartMusic
- 1A28:117B _SD_Startup
- 1A28:092B _SD_StopDigitized
- 1A28:178B _SD_StopSound
- 1A28:17C2 _SD_WaitSoundDone
- 1087:0747 _SelectChaseDir
- 1087:0619 _SelectDodgeDir
- 13EC:1951 idle _SelectPathDir
- 1087:089F _SelectRunDir
- 0000:3164 _setblock
- 044B:0179 idle _SetPlaneViewSize
- 0BC6:0006 idle _SetSoundLoc
- 06A5:3677 idle _SetTextColor
- 06A5:2E09 idle _SetupControlPanel
- 0BC6:0683 _SetupGameLevel
- 0FFD:001A _SetupScaling
- 048F:0E7C idle _SetupWalls
- 0000:3F2F _setvbuf
- 0000:130C _setvect
- 048F:13BC _SetViewSize
- 0E0D:02C5 idle _ShapeTest
- 3A39:9894 _shootdelta
- 06A5:3C21 idle _ShootSnd
- 060A:0771 idle _ShowArticle
- 048F:1442 _ShowViewSize
- 048F:0BD2 _ShutdownId
- 1087:167A _SightPlayer
- 2422:0000 _signon
- 048F:0E9F idle _SignonScreen
- 0FFD:078D _SimpleScaleShape
- 0000:0F48 _sin
- 3A39:A514 _singlestep
- 3430:0000 _sintable
- 3A39:DDEF _slinewidth
- 3A39:DDF1 _slinex
- 3A39:03DC idle _SndItems
- 2394:0000 idle _SndMenu
- 3A39:1298 idle _songs
- 3A39:9C3F _SoundBlasterPresent
- 3A39:9C3D _SoundMode
- 3A39:ECF1 _SoundNumber
- 3A39:A2D0 _SoundPositioned
- 3A39:ECED _SoundPriority
- 3A39:9C41 _SoundSourcePresent
- 3A39:0434 idle _SoundStatus
- 3A39:ECFF _SoundTable
- 3A39:4F72 _spanstart
- 13EC:1D7E _SpawnBJVictory
- 13EC:04D9 _SpawnBoss
- 13EC:04BA _SpawnDeadGuard
- 1320:024B _SpawnDoor
- 13EC:1152 _SpawnFakeHitler
- 13EC:0A19 _SpawnFat
- 13EC:08C5 _SpawnGhosts
- 13EC:09B2 _SpawnGift
- 13EC:052B _SpawnGretel
- 13EC:11B9 _SpawnHitler
- 1087:000C _SpawnNewObj
- 13EC:057D _SpawnPatrol
- 1201:0CCC _SpawnPlayer
- 13EC:094B _SpawnSchabbs
- 13EC:0312 _SpawnStand
- 1320:001A _SpawnStatic
- 3A39:A2BE _spearangle
- 3A39:A2BC _spearflag
- 3A39:A2C4 _spearx
- 3A39:A2C0 _speary
- 3A39:A516 _spotvis
- 0000:402D _sprintf
- 3A39:EA98 _sqActive
- 3A39:EA94 _sqHack
- 3A39:EA8E _sqHackLen
- 3A39:EA90 _sqHackPtr
- 3A39:EA8C _sqHackSeqLen
- 3A39:EA88 _sqHackTime
- 3A39:ECD1 _ssActive
- 3A39:ECCF _ssControl
- 3A39:ECCB _ssData
- 3A39:ECFD _ssIsTandy
- 3A39:ECC1 _ssLengthLeft
- 3A39:ECD3 _ssNoCheck
- 3A39:ECC9 _ssOff
- 3A39:ECCA _ssOn
- 3A39:39A0 idle _ssPort
- 3A39:ECC5 _ssSample
- 3A39:ECCD _ssStatus
- 0CFC:0CC9 _StartBonusFlash
- 06A5:3A8F _StartCPMusic
- 0CFC:0CD4 _StartDamageFlash
- 0BC6:0B76 idle _StartDemoRecord
- 3A39:A030 _StartGame
- 3A39:9892 _startgame
- 3A39:1B4A idle _starthitpoints
- 0CFC:0AD6 _StartMusic
- 3A39:1A1E idle _statinfo
- 3A39:893C _statobjlist
- 1201:01A8 idle _StatusDrawPic
- 3A39:DDF3 _stepbytwo
- 3A39:4DE2 _stepscale
- 0CFC:0AA3 _StopMusic
- 3A39:98B6 _str
- 3A39:98A2 _str2
- 3A39:1A0C idle _strafeangle
- 0000:4066 _strcat
- 0000:409F _strcpy
- 0000:40C1 _strlen
- 0000:4105 _strtol
- 3A39:191C idle _s_attack
- 3A39:2EB4 idle _s_bjjump1
- 3A39:2EC4 idle _s_bjjump2
- 3A39:2ED4 idle _s_bjjump3
- 3A39:2EE4 idle _s_bjjump4
- 3A39:2E54 idle _s_bjrun1
- 3A39:2E64 idle _s_bjrun1s
- 3A39:2E74 idle _s_bjrun2
- 3A39:2E84 idle _s_bjrun3
- 3A39:2E94 idle _s_bjrun3s
- 3A39:2EA4 idle _s_bjrun4
- 3A39:1DDA _s_blinkychase1
- 3A39:1DEA idle _s_blinkychase2
- 3A39:1C4A idle _s_boom1
- 3A39:1C5A idle _s_boom2
- 3A39:1C6A idle _s_boom3
- 3A39:246A _s_bosschase1
- 3A39:247A idle _s_bosschase1s
- 3A39:248A idle _s_bosschase2
- 3A39:249A idle _s_bosschase3
- 3A39:24AA idle _s_bosschase3s
- 3A39:24BA idle _s_bosschase4
- 3A39:24CA _s_bossdie1
- 3A39:24DA idle _s_bossdie2
- 3A39:24EA idle _s_bossdie3
- 3A39:24FA idle _s_bossdie4
- 3A39:250A idle _s_bossshoot1
- 3A39:251A idle _s_bossshoot2
- 3A39:252A idle _s_bossshoot3
- 3A39:253A idle _s_bossshoot4
- 3A39:254A idle _s_bossshoot5
- 3A39:255A idle _s_bossshoot6
- 3A39:256A idle _s_bossshoot7
- 3A39:257A idle _s_bossshoot8
- 3A39:245A idle _s_bossstand
- 3A39:1E3A idle _s_clydechase1
- 3A39:1E4A idle _s_clydechase2
- 3A39:2EF4 _s_deathcam
- 3A39:1F0A _s_dogchase1
- 3A39:1F1A idle _s_dogchase1s
- 3A39:1F2A idle _s_dogchase2
- 3A39:1F3A idle _s_dogchase3
- 3A39:1F4A idle _s_dogchase3s
- 3A39:1F5A idle _s_dogchase4
- 3A39:1F9A idle _s_dogdead
- 3A39:1F6A _s_dogdie1
- 3A39:1F7A idle _s_dogdie2
- 3A39:1F8A idle _s_dogdie3
- 3A39:1EBA idle _s_dogjump1
- 3A39:1ECA idle _s_dogjump2
- 3A39:1EDA idle _s_dogjump3
- 3A39:1EEA idle _s_dogjump4
- 3A39:1EFA idle _s_dogjump5
- 3A39:1E5A idle _s_dogpath1
- 3A39:1E6A idle _s_dogpath1s
- 3A39:1E7A idle _s_dogpath2
- 3A39:1E8A idle _s_dogpath3
- 3A39:1E9A idle _s_dogpath3s
- 3A39:1EAA idle _s_dogpath4
- 3A39:2A5C _s_fakechase1
- 3A39:2A6C idle _s_fakechase1s
- 3A39:2A7C idle _s_fakechase2
- 3A39:2A8C idle _s_fakechase3
- 3A39:2A9C idle _s_fakechase3s
- 3A39:2AAC idle _s_fakechase4
- 3A39:2ABC _s_fakedie1
- 3A39:2ACC idle _s_fakedie2
- 3A39:2ADC idle _s_fakedie3
- 3A39:2AEC idle _s_fakedie4
- 3A39:2AFC idle _s_fakedie5
- 3A39:2B0C idle _s_fakedie6
- 3A39:2B1C idle _s_fakeshoot1
- 3A39:2B2C idle _s_fakeshoot2
- 3A39:2B3C idle _s_fakeshoot3
- 3A39:2B4C idle _s_fakeshoot4
- 3A39:2B5C idle _s_fakeshoot5
- 3A39:2B6C idle _s_fakeshoot6
- 3A39:2B7C idle _s_fakeshoot7
- 3A39:2B8C idle _s_fakeshoot8
- 3A39:2B9C idle _s_fakeshoot9
- 3A39:2A4C idle _s_fakestand
- 3A39:291C _s_fatchase1
- 3A39:292C idle _s_fatchase1s
- 3A39:293C idle _s_fatchase2
- 3A39:294C idle _s_fatchase3
- 3A39:295C idle _s_fatchase3s
- 3A39:296C idle _s_fatchase4
- 3A39:297C idle _s_fatdeathcam
- 3A39:298C _s_fatdie1
- 3A39:299C idle _s_fatdie2
- 3A39:29AC idle _s_fatdie3
- 3A39:29BC idle _s_fatdie4
- 3A39:29CC idle _s_fatdie5
- 3A39:29DC idle _s_fatdie6
- 3A39:29EC idle _s_fatshoot1
- 3A39:29FC idle _s_fatshoot2
- 3A39:2A0C idle _s_fatshoot3
- 3A39:2A1C idle _s_fatshoot4
- 3A39:2A2C idle _s_fatshoot5
- 3A39:2A3C idle _s_fatshoot6
- 3A39:290C idle _s_fatstand
- 3A39:2BAC idle _s_fire1
- 3A39:2BBC idle _s_fire2
- 3A39:281C _s_giftchase1
- 3A39:282C idle _s_giftchase1s
- 3A39:283C idle _s_giftchase2
- 3A39:284C idle _s_giftchase3
- 3A39:285C idle _s_giftchase3s
- 3A39:286C idle _s_giftchase4
- 3A39:287C idle _s_giftdeathcam
- 3A39:288C _s_giftdie1
- 3A39:289C idle _s_giftdie2
- 3A39:28AC idle _s_giftdie3
- 3A39:28BC idle _s_giftdie4
- 3A39:28CC idle _s_giftdie5
- 3A39:28DC idle _s_giftdie6
- 3A39:28EC idle _s_giftshoot1
- 3A39:28FC idle _s_giftshoot2
- 3A39:280C idle _s_giftstand
- 3A39:1D3A _s_grdchase1
- 3A39:1D4A idle _s_grdchase1s
- 3A39:1D5A idle _s_grdchase2
- 3A39:1D6A idle _s_grdchase3
- 3A39:1D7A idle _s_grdchase3s
- 3A39:1D8A idle _s_grdchase4
- 3A39:1D9A _s_grddie1
- 3A39:1DAA idle _s_grddie2
- 3A39:1DBA idle _s_grddie3
- 3A39:1DCA idle _s_grddie4
- 3A39:1CEA _s_grdpain
- 3A39:1CFA _s_grdpain1
- 3A39:1C8A idle _s_grdpath1
- 3A39:1C9A idle _s_grdpath1s
- 3A39:1CAA idle _s_grdpath2
- 3A39:1CBA idle _s_grdpath3
- 3A39:1CCA idle _s_grdpath3s
- 3A39:1CDA idle _s_grdpath4
- 3A39:1D0A idle _s_grdshoot1
- 3A39:1D1A idle _s_grdshoot2
- 3A39:1D2A idle _s_grdshoot3
- 3A39:1C7A idle _s_grdstand
- 3A39:259A _s_gretelchase1
- 3A39:25AA idle _s_gretelchase1s
- 3A39:25BA idle _s_gretelchase2
- 3A39:25CA idle _s_gretelchase3
- 3A39:25DA idle _s_gretelchase3s
- 3A39:25EA idle _s_gretelchase4
- 3A39:25FA _s_greteldie1
- 3A39:260A idle _s_greteldie2
- 3A39:261A idle _s_greteldie3
- 3A39:262A idle _s_greteldie4
- 3A39:263A idle _s_gretelshoot1
- 3A39:264A idle _s_gretelshoot2
- 3A39:265A idle _s_gretelshoot3
- 3A39:266A idle _s_gretelshoot4
- 3A39:267A idle _s_gretelshoot5
- 3A39:268A idle _s_gretelshoot6
- 3A39:269A idle _s_gretelshoot7
- 3A39:26AA idle _s_gretelshoot8
- 3A39:258A idle _s_gretelstand
- 3A39:2CDC _s_hitlerchase1
- 3A39:2CEC idle _s_hitlerchase1s
- 3A39:2CFC idle _s_hitlerchase2
- 3A39:2D0C idle _s_hitlerchase3
- 3A39:2D1C idle _s_hitlerchase3s
- 3A39:2D2C idle _s_hitlerchase4
- 3A39:2D3C idle _s_hitlerdeathcam
- 3A39:2D4C _s_hitlerdie1
- 3A39:2DDC idle _s_hitlerdie10
- 3A39:2D5C idle _s_hitlerdie2
- 3A39:2D6C idle _s_hitlerdie3
- 3A39:2D7C idle _s_hitlerdie4
- 3A39:2D8C idle _s_hitlerdie5
- 3A39:2D9C idle _s_hitlerdie6
- 3A39:2DAC idle _s_hitlerdie7
- 3A39:2DBC idle _s_hitlerdie8
- 3A39:2DCC idle _s_hitlerdie9
- 3A39:2DEC idle _s_hitlershoot1
- 3A39:2DFC idle _s_hitlershoot2
- 3A39:2E0C idle _s_hitlershoot3
- 3A39:2E1C idle _s_hitlershoot4
- 3A39:2E2C idle _s_hitlershoot5
- 3A39:2E3C idle _s_hitlershoot6
- 3A39:1DFA idle _s_inkychase1
- 3A39:1E0A idle _s_inkychase2
- 3A39:2BDC _s_mechachase1
- 3A39:2BEC idle _s_mechachase1s
- 3A39:2BFC idle _s_mechachase2
- 3A39:2C0C idle _s_mechachase3
- 3A39:2C1C idle _s_mechachase3s
- 3A39:2C2C idle _s_mechachase4
- 3A39:2C3C _s_mechadie1
- 3A39:2C4C idle _s_mechadie2
- 3A39:2C5C idle _s_mechadie3
- 3A39:2C6C idle _s_mechadie4
- 3A39:2C7C idle _s_mechashoot1
- 3A39:2C8C idle _s_mechashoot2
- 3A39:2C9C idle _s_mechashoot3
- 3A39:2CAC idle _s_mechashoot4
- 3A39:2CBC idle _s_mechashoot5
- 3A39:2CCC idle _s_mechashoot6
- 3A39:2BCC idle _s_mechastand
- 3A39:21EA _s_mutchase1
- 3A39:21FA idle _s_mutchase1s
- 3A39:220A idle _s_mutchase2
- 3A39:221A idle _s_mutchase3
- 3A39:222A idle _s_mutchase3s
- 3A39:223A idle _s_mutchase4
- 3A39:224A _s_mutdie1
- 3A39:225A idle _s_mutdie2
- 3A39:226A idle _s_mutdie3
- 3A39:227A idle _s_mutdie4
- 3A39:228A idle _s_mutdie5
- 3A39:218A _s_mutpain
- 3A39:219A _s_mutpain1
- 3A39:212A idle _s_mutpath1
- 3A39:213A idle _s_mutpath1s
- 3A39:214A idle _s_mutpath2
- 3A39:215A idle _s_mutpath3
- 3A39:216A idle _s_mutpath3s
- 3A39:217A idle _s_mutpath4
- 3A39:21AA idle _s_mutshoot1
- 3A39:21BA idle _s_mutshoot2
- 3A39:21CA idle _s_mutshoot3
- 3A39:21DA idle _s_mutshoot4
- 3A39:211A idle _s_mutstand
- 3A39:27CC idle _s_needle1
- 3A39:27DC idle _s_needle2
- 3A39:27EC idle _s_needle3
- 3A39:27FC idle _s_needle4
- 3A39:206A _s_ofcchase1
- 3A39:207A idle _s_ofcchase1s
- 3A39:208A idle _s_ofcchase2
- 3A39:209A idle _s_ofcchase3
- 3A39:20AA idle _s_ofcchase3s
- 3A39:20BA idle _s_ofcchase4
- 3A39:20CA _s_ofcdie1
- 3A39:20DA idle _s_ofcdie2
- 3A39:20EA idle _s_ofcdie3
- 3A39:20FA idle _s_ofcdie4
- 3A39:210A idle _s_ofcdie5
- 3A39:201A _s_ofcpain
- 3A39:202A _s_ofcpain1
- 3A39:1FBA idle _s_ofcpath1
- 3A39:1FCA idle _s_ofcpath1s
- 3A39:1FDA idle _s_ofcpath2
- 3A39:1FEA idle _s_ofcpath3
- 3A39:1FFA idle _s_ofcpath3s
- 3A39:200A idle _s_ofcpath4
- 3A39:203A idle _s_ofcshoot1
- 3A39:204A idle _s_ofcshoot2
- 3A39:205A idle _s_ofcshoot3
- 3A39:1FAA idle _s_ofcstand
- 3A39:1E1A idle _s_pinkychase1
- 3A39:1E2A idle _s_pinkychase2
- 3A39:190C idle _s_player
- 3A39:1BFA idle _s_rocket
- 3A39:26DC _s_schabbchase1
- 3A39:26EC idle _s_schabbchase1s
- 3A39:26FC idle _s_schabbchase2
- 3A39:270C idle _s_schabbchase3
- 3A39:271C idle _s_schabbchase3s
- 3A39:272C idle _s_schabbchase4
- 3A39:273C idle _s_schabbdeathcam
- 3A39:274C _s_schabbdie1
- 3A39:275C idle _s_schabbdie2
- 3A39:276C idle _s_schabbdie3
- 3A39:277C idle _s_schabbdie4
- 3A39:278C idle _s_schabbdie5
- 3A39:279C idle _s_schabbdie6
- 3A39:27AC idle _s_schabbshoot1
- 3A39:27BC idle _s_schabbshoot2
- 3A39:26CC idle _s_schabbstand
- 3A39:1C0A idle _s_smoke1
- 3A39:1C1A idle _s_smoke2
- 3A39:1C2A idle _s_smoke3
- 3A39:1C3A idle _s_smoke4
- 3A39:23BA _s_sschase1
- 3A39:23CA idle _s_sschase1s
- 3A39:23DA idle _s_sschase2
- 3A39:23EA idle _s_sschase3
- 3A39:23FA idle _s_sschase3s
- 3A39:240A idle _s_sschase4
- 3A39:241A _s_ssdie1
- 3A39:242A idle _s_ssdie2
- 3A39:243A idle _s_ssdie3
- 3A39:244A idle _s_ssdie4
- 3A39:230A _s_sspain
- 3A39:231A _s_sspain1
- 3A39:22AA idle _s_sspath1
- 3A39:22BA idle _s_sspath1s
- 3A39:22CA idle _s_sspath2
- 3A39:22DA idle _s_sspath3
- 3A39:22EA idle _s_sspath3s
- 3A39:22FA idle _s_sspath4
- 3A39:232A idle _s_ssshoot1
- 3A39:233A idle _s_ssshoot2
- 3A39:234A idle _s_ssshoot3
- 3A39:235A idle _s_ssshoot4
- 3A39:236A idle _s_ssshoot5
- 3A39:237A idle _s_ssshoot6
- 3A39:238A idle _s_ssshoot7
- 3A39:239A idle _s_ssshoot8
- 3A39:23AA idle _s_ssshoot9
- 3A39:229A idle _s_ssstand
- 3A39:ECE3 _t0OldService
- 1201:0342 _TakeDamage
- 0000:0F95 _tan
- 3A39:9B89 _tedlevel
- 3A39:9B87 _tedlevelnum
- 0000:1926 _tell
- 3A39:9E9A _text
- 0EBC:0F15 _ThreeDRefresh
- 1201:0A51 idle _Thrust
- 3A39:E00D _thrustspeed
- 06A5:3570 idle _TicDelay
- 3A39:A2CA _tics
- 3A39:168C _tileglobal
- 3A39:D9B4 _tilehit
- 3A39:75BA _tilemap
- 3A39:9EDE _TimeCount
- 060A:00B4 idle _TimedPicCommand
- 3A39:ECF3 _TimerCount
- 3A39:ECF7 _TimerDivisor
- 3A39:ECDD _TimerRate
- 3A39:E824 _tinf
- 0000:193E _tolower
- 0000:196A _toupper
- 06A5:1062 idle _TrackWhichGame
- 0EBC:004D idle _TransformActor
- 0EBC:018B idle _TransformTile
- 1201:0794 idle _TryMove
- 1087:00D2 _TryWalk
- 1201:0FEB idle _T_Attack
- 13EC:1CA5 idle _T_Bite
- 13EC:1EAC idle _T_BJDone
- 13EC:1E66 idle _T_BJJump
- 13EC:1DD1 idle _T_BJRun
- 13EC:1E8C idle _T_BJYell
- 13EC:14EC idle _T_Chase
- 13EC:17EF idle _T_DogChase
- 13EC:1404 idle _T_Fake
- 13EC:12E7 idle _T_FakeFire
- 13EC:0FCA idle _T_Fat
- 13EC:1743 idle _T_Ghosts
- 13EC:0E42 idle _T_Gift
- 13EC:0B9D idle _T_GiftThrow
- 13EC:199D idle _T_Path
- 1201:117D idle _T_Player
- 13EC:00F3 idle _T_Projectile
- 13EC:0CBA idle _T_Schabb
- 13EC:0A80 idle _T_SchabbThrow
- 13EC:1ACC idle _T_Shoot
- 13EC:14DC idle _T_Stand
- 0000:38AA _ultoa
- 3A39:E87C _UMBbase
- 06A5:2D2F _UnCacheLump
- 0000:1996 _unlink
- 3A39:54B6 _update
- 1201:025B idle _UpdateFace
- 0CFC:0CE0 idle _UpdatePaletteShifts
- 3A39:9B79 _updateptr
- 0BC6:0148 _UpdateSoundLoc
- 3A39:3D16 idle _USL_DrawString
- 1BF0:0008 idle _USL_HardError
- 3A39:3D12 _USL_MeasureString
- 1BF0:03C2 idle _USL_PrintInCenter
- 1BF0:0669 idle _US_CenterWindow
- 1BF0:020F _US_CheckParm
- 1BF0:0528 _US_ClearWindow
- 06A5:0004 _US_ControlPanel
- 1BF0:04BF _US_CPrint
- 1BF0:0462 idle _US_CPrintLine
- 1BF0:0553 _US_DrawWindow
- 1CAA:0010 _US_InitRndT
- 1BF0:0782 _US_LineInput
- 1BF0:02D4 _US_Print
- 1BF0:0420 _US_PrintCentered
- 1BF0:039D idle _US_PrintSigned
- 1BF0:0378 _US_PrintUnsigned
- 1BF0:06BA idle _US_RestoreWindow
- 1CAA:0038 _US_RndT
- 1BF0:068D idle _US_SaveWindow
- 1BF0:02B5 idle _US_SetPrintRoutines
- 1BF0:01FD _US_Shutdown
- 1BF0:0131 _US_Startup
- 3A39:9B5F _uwidthtable
- 3A39:53AA _vertwall
- 3A39:1698 idle _vgaCeiling
- 0EBC:0A0B idle _VGAClearScreen
- 1E19:0006 _VH_UpdateScreen
- 0A85:0031 _Victory
- 1201:0F2E idle _VictorySpin
- 1201:0A41 idle _VictoryTile
- 3A39:DDE0 _viewangle
- 3A39:503A _viewcos
- 3A39:52CE _viewheight
- 3A39:503E _viewsin
- 3A39:54AA _viewsize
- 3A39:D9CC _viewtx
- 3A39:D9CA _viewty
- 3A39:D84E _viewtype
- 3A39:52D0 _viewwidth
- 3A39:5046 _viewx
- 3A39:5042 _viewy
- 3A39:9890 _virtualreality
- 3A39:D86E _vislist
- 3A39:D86C _visptr
- 3A39:D86A _visstep
- 1CAF:0646 _VL_Bar
- 1CAF:0092 idle _VL_ClearVideo
- 1CAF:04A5 _VL_ColorBorder
- 1CAF:00BC idle _VL_DePlaneVGA
- 1CAF:0A5B idle _VL_DrawLatch8String
- 1CAF:092E idle _VL_DrawTile8String
- 1CAF:0374 _VL_FadeIn
- 1CAF:0256 _VL_FadeOut
- 1CAF:0198 idle _VL_FillPalette
- 1CAF:01D8 idle _VL_GetColor
- 1CAF:0235 idle _VL_GetPalette
- 1CAF:0504 _VL_Hlin
- 1CAF:08C5 _VL_LatchToScreen
- 1CAF:0837 idle _VL_MaskedToScreen
- 1CAF:0749 _VL_MemToLatch
- 1CAF:079C _VL_MemToScreen
- 1D62:022E _VL_MungePic
- 1CAF:04B9 _VL_Plot
- 1DF0:00AA _VL_ScreenToScreen
- 1CAF:01BD idle _VL_SetColor
- 1DF0:0019 idle _VL_SetCRTC
- 1CAF:0113 idle _VL_SetLineWidth
- 1CAF:0203 _VL_SetPalette
- 1DF0:003D _VL_SetScreen
- 1CAF:014C idle _VL_SetSplitScreen
- 1CAF:0088 idle _VL_SetTextMode
- 1CAF:0065 _VL_SetVGAPlaneMode
- 1CAF:005B _VL_Shutdown
- 1CAF:0B07 idle _VL_SizeTile8String
- 1CAF:0003 _VL_Startup
- 1CAF:044A _VL_TestPaletteSet
- 1DF0:012A _VL_VideoID
- 1CAF:05DF _VL_Vlin
- 1DF0:0002 _VL_WaitVBL
- 0000:404A idle _vsprintf
- 1D62:0556 _VWB_Bar
- 1D62:04B3 _VWB_DrawPic
- 1D62:051F _VWB_DrawPropString
- 1D62:042B _VWB_DrawTile8
- 1D62:046E idle _VWB_DrawTile8M
- 1D62:05BD _VWB_Hlin
- 1D62:0592 _VWB_Plot
- 1D62:05F1 _VWB_Vlin
- 1D62:02EC idle _VWL_MeasureString
- 1D62:0113 idle _VW_DrawColorPropString
- 1D62:0000 idle _VW_DrawPropString
- 1D62:0370 _VW_MarkUpdateBlock
- 1D62:034E idle _VW_MeasureMPropString
- 1D62:032C _VW_MeasurePropString
- 1D62:0625 _VW_UpdateScreen
- 06A5:36AC idle _WaitKeyUp
- 3A39:504A _wallheight
- 0EBC:0E24 idle _WallRefresh
- 3A39:1710 idle _weaponscale
- 0000:31E7 idle _wherex
- 0000:31F6 idle _wherey
- 358C:0000 _whiteshifts
- 3A39:A046 _WindowH
- 3A39:9B7B _WindowW
- 3A39:9B7F _WindowX
- 3A39:9B7D _WindowY
- 3A39:177A idle _wordmasks
- 3A39:DDF5 _work
- 0000:4320 _write
- 0A85:046A _Write
- 048F:020F idle _WriteConfig
- 3A39:D9A6 _xintercept
- 3A39:D9B8 _xinttile
- 3A39:E892 _XMSaddr
- 3A39:E8D2 _XMSAvail
- 3A39:E8CC _XMSDriver
- 3A39:E8D0 _XMSHandle
- 3A39:A296 _XMSPagesAvail
- 3A39:E8C4 _XMSPagesUsed
- 3A39:A29A _XMSPresent
- 3A39:3510 idle _XMSProtectPage
- 3A39:D9C4 _xpartial
- 3A39:D9BE _xpartialdown
- 3A39:D9C0 _xpartialup
- 3A39:D99E _xstep
- 3A39:D9B0 _xtile
- 3A39:D9AC _xtilestep
- 3A39:D9A2 _yintercept
- 3A39:D9B6 _yinttile
- 3A39:EE17 _ylookup
- 3A39:D9C2 _ypartial
- 3A39:D9BA _ypartialdown
- 3A39:D9BC _ypartialup
- 3A39:D99A _ystep
- 3A39:D9AE _ytile
- 3A39:D9AA _ytilestep
- 3A39:4090 __8087
- 0000:1000 idle __AHINCR
- 0000:000C idle __AHSHIFT
- 3A39:4724 __argc
- 3A39:4726 __argv
- 3A39:4380 __atexitcnt
- 3A39:4944 __atexittbl
- 0000:268A __brk
- 3A39:00D1 __brklvl
- 3A39:00B3 __C0argc
- 3A39:00B5 __C0argv
- 0000:20DD idle __c0crtinit
- 3A39:00B7 __C0environ
- 0000:128F idle __cexit
- 0000:0189 __checknull
- 0000:3296 __chmod
- 0000:0176 __cleanup
- 0000:32D9 __close
- 0000:20FA idle __crtinit
- 3A39:4382 __ctype
- 0000:0000 Abs __cvtfak
- 0000:129D idle __c_exit
- 3A39:40A4 __default87
- 3A39:4602 __doserrno
- 0000:14EF __DOSERROR
- 3A39:4604 idle __dosErrorToSV
- 0000:11C1 idle __dos_getdate
- 0000:4486 __dos_getdiskfree
- 0000:1189 __dos_getfileattr
- 0000:11DA __dos_gettime
- 0000:11A6 idle __dos_setfileattr
- 0000:11F3 __dos_write
- 3A39:4270 __emu
- 3A39:00B9 __envLng
- 3A39:00BB __envseg
- 3A39:00BD __envSize
- 0000:127D __exit
- 3A39:4484 __exitbuf
- 3A39:4488 __exitfopen
- 3A39:448C __exitopen
- 3A39:471E idle __first
- 0000:8087 idle __floatconvert
- 0000:436E __fmemcmp
- 0000:4396 __fmemcpy
- 0000:43DE __fmemset
- 3A39:45FA __fmode
- 0000:0DAA __fperror
- 3A39:45FE __fpstklen
- 0000:05E4 __fpuint
- 0000:3B11 idle __fputc
- 0000:3C70 __FPUTN
- 0000:43BA idle __fsetmem
- 0000:43FD __fstrcpy
- 0000:4426 __fstricmp
- 0000:4467 __fstrlen
- 0000:36B1 idle __GETFP
- 0000:2933 idle __harderr
- 0000:295F __hardresume
- 0000:297A __hardretn
- 3A39:00CD __heapbase
- 3A39:4600 __heaplen
- 3A39:00D5 __heaptop
- 3A39:40AA __huge_dble
- 3A39:40A6 idle __huge_flt
- 3A39:40B2 idle __huge_ldble
- 3A39:40BC idle __indefinite
- 3A39:00A3 idle __Int0Vector
- 3A39:00A7 idle __Int4Vector
- 3A39:00AB idle __Int5Vector
- 3A39:00AF idle __Int6Vector
- 0000:14B6 __IOERROR
- 3A39:4720 idle __last
- 3A39:40A1 __LDT
- 0000:05F5 __LDTRUNC
- 0000:1512 __LONGTOA
- 0000:0FE5 __matherr
- 3A39:40CA __mathwhy
- 0000:15D5 __MKNAME
- 0000:02B0 idle __MMODEL
- 3A39:45D0 __nfile
- 3A39:45FC __notUmask
- 0000:3AAD __open
- 3A39:45D2 __openfd
- 0000:3615 idle __OPENFP
- 3A39:00C1 __osmajor
- 3A39:00C2 idle __osminor
- 3A39:00C1 idle __osversion
- 0000:0E4E __POW10
- 3A39:40A0 __protected
- 3A39:00BF __psp
- 0000:16AA __read
- 0000:2D18 __REALCVT
- 3A39:473A __RealCvtVector
- 0000:020A __restorezero
- 3A39:4722 idle __rover
- 0000:26C9 __sbrk
- 3A39:473E idle __ScanTodVector
- 0000:1702 __scantol
- 0000:2E48 __SCREENIO
- 0000:2EE9 __SCROLL
- 0000:0000 idle __setargv__
- 0000:0000 idle __setenvp__
- 0000:1881 __setupio
- 3A39:00C5 idle __StartTime
- 3A39:4668 __stklen
- 0000:1F2B __stpcpy
- 3A39:4490 __streams
- 0000:01B4 __terminate
- 3A39:40C0 idle __tiny_ldble
- 0000:1614 idle __TMPNAM
- 0000:0000 idle __turboCrt
- 0000:0000 Abs __turboCvt
- 0000:8087 Abs __turboFloat
- 0000:158F __UTOA
- 0000:2E84 __VALIDATEXY
- 3A39:00C1 __version
- 3A39:46D2 __video
- 0000:2059 __VideoInt
- 0000:19C4 __VPRINTER
- 0000:1E72 __VPTR
- 0000:1E97 __VRAM
- 0000:31DD __wherexy
- 0000:42E6 __write
- 0000:1F11 __xclose
- 0000:0BA5 __XCVT
- 0000:4323 __xfclose
- 0000:434B __xfflush
- 0000:1F79 ___brk
- 3A39:00CB ___brklvl
- 0000:21F3 idle ___first
- 0000:04FD idle ___fpreset
- 0000:2907 ___harderr
- 3A39:00C9 idle ___heapbase
- 0000:21F5 idle ___last
- 0000:3E5E ___read
- 0000:21F7 idle ___rover
- 0000:1F9B ___sbrk
- 3A39:49D2 ___SignalPtr
- 0000:41DA ___write
-
- Address Publics by Value
-
- 0000:0000 Abs __turboCvt
- 0000:0000 idle __turboCrt
- 0000:0000 Abs __cvtfak
- 0000:0000 idle __setargv__
- 0000:0000 idle __setenvp__
- 0000:000C idle __AHSHIFT
- 0000:0632 idle FISRQQ
- 0000:0E32 idle FICRQQ
- 0000:1000 idle __AHINCR
- 0000:1632 Abs FIERQQ
- 0000:4000 idle FJARQQ
- 0000:5C32 Abs FIDRQQ
- 0000:8000 idle FJSRQQ
- 0000:8087 Abs __turboFloat
- 0000:8087 idle __floatconvert
- 0000:A23D Abs FIWRQQ
- 0000:C000 idle FJCRQQ
- 0000:FE32 idle FIARQQ
- 0000:0176 __cleanup
- 0000:0189 __checknull
- 0000:01B4 __terminate
- 0000:020A __restorezero
- 0000:0296 _abort
- 0000:02AE idle DGROUP@
- 0000:02B0 idle __MMODEL
- 0000:02B2 idle N_LDIV@
- 0000:02B5 LDIV@
- 0000:02B5 F_LDIV@
- 0000:02D1 idle N_LUDIV@
- 0000:02D4 idle F_LUDIV@
- 0000:02D4 idle LUDIV@
- 0000:02D9 idle N_LMOD@
- 0000:02DC F_LMOD@
- 0000:02DC idle LMOD@
- 0000:02E1 idle N_LUMOD@
- 0000:02E4 idle LUMOD@
- 0000:02E4 idle F_LUMOD@
- 0000:04FD idle ___fpreset
- 0000:05E4 __fpuint
- 0000:05E8 _atan
- 0000:05F5 __LDTRUNC
- 0000:0BA5 __XCVT
- 0000:0DAA __fperror
- 0000:0E4E __POW10
- 0000:0F17 _pow10
- 0000:0F22 _matherr
- 0000:0F48 _sin
- 0000:0F95 _tan
- 0000:0FE5 __matherr
- 0000:1075 _atan2
- 0000:1130 F_FTOL@
- 0000:1130 idle FTOL@
- 0000:115C idle _atexit
- 0000:1189 __dos_getfileattr
- 0000:11A6 idle __dos_setfileattr
- 0000:11C1 idle __dos_getdate
- 0000:11DA __dos_gettime
- 0000:11F3 __dos_write
- 0000:126E _exit
- 0000:127D __exit
- 0000:128F idle __cexit
- 0000:129D idle __c_exit
- 0000:12A9 F_LXMUL@
- 0000:12A9 idle LXMUL@
- 0000:12C0 F_PCMP@
- 0000:12C0 idle PCMP@
- 0000:12E1 F_SCOPY@
- 0000:12E1 idle SCOPY@
- 0000:12FD _getvect
- 0000:130C _setvect
- 0000:131D N_LXLSH@
- 0000:1320 F_LXLSH@
- 0000:1320 idle LXLSH@
- 0000:133E idle N_LXRSH@
- 0000:1341 F_LXRSH@
- 0000:1341 idle LXRSH@
- 0000:135E idle N_LXURSH@
- 0000:1361 F_LXURSH@
- 0000:1361 idle LXURSH@
- 0000:137F idle N_PADA@
- 0000:1382 F_PADA@
- 0000:1382 idle PADA@
- 0000:13C3 idle N_PSBA@
- 0000:13C6 F_PSBA@
- 0000:13C6 idle PSBA@
- 0000:1407 N_PADD@
- 0000:140A F_PADD@
- 0000:140A idle PADD@
- 0000:1436 idle N_PSUB@
- 0000:1439 idle F_PSUB@
- 0000:1439 idle PSUB@
- 0000:1467 N_PSBP@
- 0000:146A F_PSBP@
- 0000:146A idle PSBP@
- 0000:148F idle N_SPUSH@
- 0000:1495 F_SPUSH@
- 0000:1495 idle SPUSH@
- 0000:14B6 __IOERROR
- 0000:14EF __DOSERROR
- 0000:1501 _isatty
- 0000:1512 __LONGTOA
- 0000:158F __UTOA
- 0000:15AC _lseek
- 0000:15D5 __MKNAME
- 0000:1614 idle __TMPNAM
- 0000:1657 N_PCMP@
- 0000:1678 _outport
- 0000:1684 idle _outportb
- 0000:1690 idle _outpw
- 0000:169C idle _outp
- 0000:16AA __read
- 0000:1702 __scantol
- 0000:1881 __setupio
- 0000:1926 _tell
- 0000:193E _tolower
- 0000:196A _toupper
- 0000:1996 _unlink
- 0000:19C4 __VPRINTER
- 0000:1E72 __VPTR
- 0000:1E97 __VRAM
- 0000:1F11 __xclose
- 0000:1F2B __stpcpy
- 0000:1F54 _bioskey
- 0000:1F79 ___brk
- 0000:1F9B ___sbrk
- 0000:1FCC idle _brk
- 0000:1FD8 idle _sbrk
- 0000:1FE8 _clrscr
- 0000:2011 _coreleft
- 0000:2059 __VideoInt
- 0000:20DD idle __c0crtinit
- 0000:20FA idle __crtinit
- 0000:21F3 idle ___first
- 0000:21F5 idle ___last
- 0000:21F7 idle ___rover
- 0000:2333 _farfree
- 0000:243D _farmalloc
- 0000:259A idle _farrealloc
- 0000:268A __brk
- 0000:26C9 __sbrk
- 0000:2757 _farcoreleft
- 0000:27A7 _gotoxy
- 0000:27F0 _gettext
- 0000:2844 _puttext
- 0000:2885 _harderr
- 0000:2897 idle _hardresume
- 0000:28A5 idle _hardretn
- 0000:2907 ___harderr
- 0000:2933 idle __harderr
- 0000:295F __hardresume
- 0000:297A __hardretn
- 0000:29D9 _ioctl
- 0000:2A00 _movetext
- 0000:2A9D _free
- 0000:2B6C _malloc
- 0000:2CC5 idle _realloc
- 0000:2D18 __REALCVT
- 0000:2E48 __SCREENIO
- 0000:2E84 __VALIDATEXY
- 0000:2EE9 __SCROLL
- 0000:3164 _setblock
- 0000:31DD __wherexy
- 0000:31E7 idle _wherex
- 0000:31F6 idle _wherey
- 0000:3209 _atol
- 0000:3279 idle _atoi
- 0000:3286 _bdos
- 0000:3296 __chmod
- 0000:32B1 _close
- 0000:32D9 __close
- 0000:3310 _creat
- 0000:3382 _fclose
- 0000:33FF _fflush
- 0000:3480 _findfirst
- 0000:34B3 _findnext
- 0000:34E0 _filelength
- 0000:3521 _flushall
- 0000:3615 idle __OPENFP
- 0000:36B1 idle __GETFP
- 0000:36DC _fopen
- 0000:36FB _fprintf
- 0000:376E _fseek
- 0000:37D6 idle _ftell
- 0000:3823 _getenv
- 0000:3882 _itoa
- 0000:38AA _ultoa
- 0000:38C4 _ltoa
- 0000:38E9 _memcpy
- 0000:3908 _movedata
- 0000:3955 _open
- 0000:3AAD __open
- 0000:3AFA _printf
- 0000:3B11 idle __fputc
- 0000:3B2A _fputc
- 0000:3C5E idle _fputchar
- 0000:3C70 __FPUTN
- 0000:3E13 _puts
- 0000:3E5E ___read
- 0000:3F2C _read
- 0000:3F2F _setvbuf
- 0000:402D _sprintf
- 0000:404A idle _vsprintf
- 0000:4066 _strcat
- 0000:409F _strcpy
- 0000:40C1 _strlen
- 0000:4105 _strtol
- 0000:41DA ___write
- 0000:42E6 __write
- 0000:4320 _write
- 0000:4323 __xfclose
- 0000:434B __xfflush
- 0000:436E __fmemcmp
- 0000:4396 __fmemcpy
- 0000:43BA idle __fsetmem
- 0000:43DE __fmemset
- 0000:43FD __fstrcpy
- 0000:4426 __fstricmp
- 0000:4467 __fstrlen
- 0000:4486 __dos_getdiskfree
- 044B:000C idle _FixedMul
- 044B:0034 idle _DrawSpans
- 044B:0179 idle _SetPlaneViewSize
- 044B:027E idle _DrawPlanes
- 0485:0008 _MapRow
- 048C:0000 _CheckIs386
- 048C:0028 _jabhack2
- 048F:000B idle _ReadConfig
- 048F:020F idle _WriteConfig
- 048F:030D idle _Patch386
- 048F:0369 _NewGame
- 048F:03BA idle _DiskFlopAnim
- 048F:03E9 idle _DoChecksum
- 048F:042E _SaveTheGame
- 048F:0803 _LoadTheGame
- 048F:0BD2 _ShutdownId
- 048F:0BFA idle _BuildTables
- 048F:0D49 idle _CalcProjection
- 048F:0E7C idle _SetupWalls
- 048F:0E9F idle _SignonScreen
- 048F:0F21 idle _FinishSignon
- 048F:0FBA _MS_CheckParm
- 048F:1020 idle _InitDigiMap
- 048F:1041 idle _DoJukebox
- 048F:122A idle _InitGame
- 048F:13BC _SetViewSize
- 048F:1442 _ShowViewSize
- 048F:148B _NewViewSize
- 048F:14CF _Quit
- 048F:159A idle _DemoLoop
- 048F:179C _main
- 060A:000C idle _RipToEOL
- 060A:001F idle _ParseNumber
- 060A:0071 idle _ParsePicCommand
- 060A:008F idle _ParseTimedCommand
- 060A:00B4 idle _TimedPicCommand
- 060A:00F7 idle _HandleCommand
- 060A:034C idle _NewLine
- 060A:03A7 idle _HandleCtrls
- 060A:03C7 idle _HandleWord
- 060A:0475 idle _PageLayout
- 060A:0660 idle _BackPage
- 060A:068A idle _CacheLayoutGraphics
- 060A:0771 idle _ShowArticle
- 060A:0885 idle _HelpScreens
- 060A:090C _EndText
- 06A5:0004 _US_ControlPanel
- 06A5:01BE idle _DrawMainMenu
- 06A5:025E idle _BossKey
- 06A5:02A8 idle _CP_CheckQuick
- 06A5:079D idle _CP_EndGame
- 06A5:07F3 _CP_ViewScores
- 06A5:0851 idle _CP_NewGame
- 06A5:098F idle _DrawNewEpisode
- 06A5:0A3C idle _DrawNewGame
- 06A5:0AC6 idle _DrawNewGameDiff
- 06A5:0ADF idle _CP_Sound
- 06A5:0C70 idle _DrawSoundMenu
- 06A5:0E5E idle _DrawLSAction
- 06A5:0EDA idle _CP_LoadGame
- 06A5:1062 idle _TrackWhichGame
- 06A5:1089 idle _DrawLoadSaveScreen
- 06A5:112F idle _PrintLSEntry
- 06A5:11BB idle _CP_SaveGame
- 06A5:148E idle _CalibrateJoystick
- 06A5:16A9 idle _CP_Control
- 06A5:17AE idle _DrawMouseSens
- 06A5:18B2 idle _MouseSensitivity
- 06A5:1A9B idle _DrawCtlScreen
- 06A5:1C5A idle _CustomControls
- 06A5:1CFB idle _DefineMouseBtns
- 06A5:1D37 idle _DefineJoyBtns
- 06A5:1D73 idle _DefineKeyBtns
- 06A5:1DAF idle _DefineKeyMove
- 06A5:1DEB idle _EnterCtrlData
- 06A5:2237 idle _FixupCustom
- 06A5:23A7 idle _DrawCustomScreen
- 06A5:266D idle _PrintCustMouse
- 06A5:26B7 idle _DrawCustMouse
- 06A5:2714 idle _PrintCustJoy
- 06A5:275E idle _DrawCustJoy
- 06A5:27BB idle _PrintCustKeybd
- 06A5:27F2 idle _DrawCustKeybd
- 06A5:2824 idle _PrintCustKeys
- 06A5:285A idle _DrawCustKeys
- 06A5:288C idle _CP_ChangeView
- 06A5:29FF idle _DrawChangeView
- 06A5:2A7D idle _CP_Quit
- 06A5:2B04 _IntroScreen
- 06A5:2CF7 _ClearMScreen
- 06A5:2D10 _CacheLump
- 06A5:2D2F _UnCacheLump
- 06A5:2D6E _DrawWindow
- 06A5:2DA4 idle _DrawOutline
- 06A5:2E09 idle _SetupControlPanel
- 06A5:2F07 idle _CleanupControlPanel
- 06A5:2F1D _HandleMenu
- 06A5:3407 idle _EraseGun
- 06A5:347E idle _DrawHalfStep
- 06A5:34BE idle _DrawGun
- 06A5:3570 idle _TicDelay
- 06A5:35AC _DrawMenu
- 06A5:3677 idle _SetTextColor
- 06A5:36AC idle _WaitKeyUp
- 06A5:36DC idle _ReadAnyControl
- 06A5:3839 idle _Confirm
- 06A5:3960 _Message
- 06A5:3A8F _StartCPMusic
- 06A5:3B16 _FreeMusic
- 06A5:3B39 idle _IN_GetScanName
- 06A5:3B7D idle _CheckPause
- 06A5:3BBD idle _DrawMenuGun
- 06A5:3BF0 _DrawStripes
- 06A5:3C21 idle _ShootSnd
- 06A5:3C30 _CheckForEpisodes
- 0A85:0004 _ClearSplitVWB
- 0A85:0031 _Victory
- 0A85:03CC _PG13
- 0A85:046A _Write
- 0A85:056F idle _BJ_Breathe
- 0A85:05D1 _LevelCompleted
- 0A85:0F10 idle _PreloadUpdate
- 0A85:0FA5 _PreloadGraphics
- 0A85:1041 _DrawHighScores
- 0A85:120F _CheckHighScore
- 0A85:1353 idle _NonShareware
- 0BC6:0006 idle _SetSoundLoc
- 0BC6:00F7 _PlaySoundLocGlobal
- 0BC6:0148 _UpdateSoundLoc
- 0BC6:017B _ClearMemory
- 0BC6:0194 idle _ScanInfoPlane
- 0BC6:0683 _SetupGameLevel
- 0BC6:0930 idle _DrawPlayBorderSides
- 0BC6:09BA _DrawAllPlayBorderSides
- 0BC6:09E5 _DrawAllPlayBorder
- 0BC6:0A11 _DrawPlayBorder
- 0BC6:0ADB _DrawPlayScreen
- 0BC6:0B76 idle _StartDemoRecord
- 0BC6:0BC7 idle _FinishDemoRecord
- 0BC6:0C9A _RecordDemo
- 0BC6:0DD1 _PlayDemo
- 0BC6:0F34 idle _Died
- 0BC6:1162 _GameLoop
- 0CFC:0007 idle _PollKeyboardButtons
- 0CFC:002B idle _PollMouseButtons
- 0CFC:006F idle _PollJoystickButtons
- 0CFC:0100 idle _PollKeyboardMove
- 0CFC:020C idle _PollMouseMove
- 0CFC:0248 idle _PollJoystickMove
- 0CFC:03B9 idle _PollControls
- 0CFC:05E6 _CenterWindow
- 0CFC:0614 idle _CheckKeys
- 0CFC:09B0 _InitActorList
- 0CFC:09F4 _GetNewActor
- 0CFC:0A55 idle _RemoveObj
- 0CFC:0AA3 _StopMusic
- 0CFC:0AD6 _StartMusic
- 0CFC:0B4C _InitRedShifts
- 0CFC:0CBC idle _ClearPaletteShifts
- 0CFC:0CC9 _StartBonusFlash
- 0CFC:0CD4 _StartDamageFlash
- 0CFC:0CE0 idle _UpdatePaletteShifts
- 0CFC:0DD6 _FinishPaletteShifts
- 0CFC:0E00 idle _DoActor
- 0CFC:0F8C _PlayLoop
- 0E0D:000D idle _DebugMemory
- 0E0D:00C2 idle _CountObjects
- 0E0D:01B3 _PicturePause
- 0E0D:02C5 idle _ShapeTest
- 0E0D:076C _DebugKeys
- 0EBC:000F _FixedByFrac
- 0EBC:004D idle _TransformActor
- 0EBC:018B idle _TransformTile
- 0EBC:02F9 idle _CalcHeight
- 0EBC:0397 idle _ScalePost
- 0EBC:040A _FarScalePost
- 0EBC:0412 _HitVertWall
- 0EBC:0531 _HitHorizWall
- 0EBC:0653 _HitHorizDoor
- 0EBC:0753 _HitVertDoor
- 0EBC:0857 _HitHorizPWall
- 0EBC:0931 _HitVertPWall
- 0EBC:0A0B idle _VGAClearScreen
- 0EBC:0A73 idle _CalcRotate
- 0EBC:0AEF idle _DrawScaleds
- 0EBC:0D02 idle _DrawPlayerWeapon
- 0EBC:0D9E _CalcTics
- 0EBC:0E01 _FixOfs
- 0EBC:0E24 idle _WallRefresh
- 0EBC:0F15 _ThreeDRefresh
- 0FB8:0072 _AsmRefresh
- 0FFD:000A idle _BadScale
- 0FFD:001A _SetupScaling
- 0FFD:01DB idle _BuildCompScale
- 0FFD:032F idle _ScaleLine
- 0FFD:0479 _ScaleShape
- 0FFD:078D _SimpleScaleShape
- 1087:000C _SpawnNewObj
- 1087:00BA _NewState
- 1087:00D2 _TryWalk
- 1087:0619 _SelectDodgeDir
- 1087:0747 _SelectChaseDir
- 1087:089F _SelectRunDir
- 1087:0967 _MoveObj
- 1087:0B99 idle _DropItem
- 1087:0C2C idle _KillActor
- 1087:0EF2 _DamageActor
- 1087:0FED _CheckLine
- 1087:1291 idle _CheckSight
- 1087:138E idle _FirstSighting
- 1087:167A _SightPlayer
- 1201:0005 idle _CheckWeaponChange
- 1201:0039 idle _ControlMovement
- 1201:01A8 idle _StatusDrawPic
- 1201:01FF _DrawFace
- 1201:025B idle _UpdateFace
- 1201:02A1 idle _LatchNumber
- 1201:032A _DrawHealth
- 1201:0342 _TakeDamage
- 1201:039B _HealSelf
- 1201:03C2 _DrawLevel
- 1201:03DB _DrawLives
- 1201:03F3 idle _GiveExtraMan
- 1201:0411 _DrawScore
- 1201:042B _GivePoints
- 1201:0468 _DrawWeapon
- 1201:047F _DrawKeys
- 1201:04CC _GiveWeapon
- 1201:04F5 _DrawAmmo
- 1201:050D idle _GiveAmmo
- 1201:0542 idle _GiveKey
- 1201:0557 _GetBonus
- 1201:0794 idle _TryMove
- 1201:091D idle _ClipMove
- 1201:0A41 idle _VictoryTile
- 1201:0A51 idle _Thrust
- 1201:0B37 idle _Cmd_Fire
- 1201:0B89 idle _Cmd_Use
- 1201:0CCC _SpawnPlayer
- 1201:0D6B idle _KnifeAttack
- 1201:0DFF idle _GunAttack
- 1201:0F2E idle _VictorySpin
- 1201:0FEB idle _T_Attack
- 1201:117D idle _T_Player
- 1320:000F _InitStaticList
- 1320:001A _SpawnStatic
- 1320:00E1 _PlaceItemType
- 1320:016B idle _RecursiveConnect
- 1320:01B7 idle _ConnectAreas
- 1320:01F0 _InitAreas
- 1320:0218 _InitDoorList
- 1320:024B _SpawnDoor
- 1320:0340 _OpenDoor
- 1320:0369 idle _CloseDoor
- 1320:05BD _OperateDoor
- 1320:0631 idle _DoorOpen
- 1320:065F idle _DoorOpening
- 1320:07B9 idle _DoorClosing
- 1320:08E8 _MoveDoors
- 1320:093B _PushWall
- 1320:0AC9 _MovePWalls
- 13EC:000C idle _A_Smoke
- 13EC:005A idle _ProjectileTryMove
- 13EC:00F3 idle _T_Projectile
- 13EC:0312 _SpawnStand
- 13EC:04BA _SpawnDeadGuard
- 13EC:04D9 _SpawnBoss
- 13EC:052B _SpawnGretel
- 13EC:057D _SpawnPatrol
- 13EC:072D _A_DeathScream
- 13EC:08C5 _SpawnGhosts
- 13EC:094B _SpawnSchabbs
- 13EC:09B2 _SpawnGift
- 13EC:0A19 _SpawnFat
- 13EC:0A80 idle _T_SchabbThrow
- 13EC:0B9D idle _T_GiftThrow
- 13EC:0CBA idle _T_Schabb
- 13EC:0E42 idle _T_Gift
- 13EC:0FCA idle _T_Fat
- 13EC:1152 _SpawnFakeHitler
- 13EC:11B9 _SpawnHitler
- 13EC:1220 idle _A_HitlerMorph
- 13EC:12A8 idle _A_MechaSound
- 13EC:12D8 idle _A_Slurpie
- 13EC:12E7 idle _T_FakeFire
- 13EC:1404 idle _T_Fake
- 13EC:14DC idle _T_Stand
- 13EC:14EC idle _T_Chase
- 13EC:1743 idle _T_Ghosts
- 13EC:17EF idle _T_DogChase
- 13EC:1951 idle _SelectPathDir
- 13EC:199D idle _T_Path
- 13EC:1ACC idle _T_Shoot
- 13EC:1CA5 idle _T_Bite
- 13EC:1D7E _SpawnBJVictory
- 13EC:1DD1 idle _T_BJRun
- 13EC:1E66 idle _T_BJJump
- 13EC:1E8C idle _T_BJYell
- 13EC:1EAC idle _T_BJDone
- 13EC:1EB7 idle _CheckPosition
- 13EC:1F4F idle _A_StartDeathCam
- 160F:0008 idle _GRFILEPOS
- 160F:0056 idle _CA_OpenDebug
- 160F:0077 idle _CA_CloseDebug
- 160F:0088 idle _CAL_GetGrChunkLength
- 160F:00E4 _CA_FarRead
- 160F:012F _CA_FarWrite
- 160F:017A idle _CA_ReadFile
- 160F:01E5 _CA_WriteFile
- 160F:023B idle _CA_LoadFile
- 160F:02B5 idle _CAL_OptimizeNodes
- 160F:0300 idle _CAL_HuffExpand
- 160F:046B idle _CAL_CarmackExpand
- 160F:058F idle _CA_RLEWCompress
- 160F:06D7 idle _CA_RLEWexpand
- 160F:078E idle _CAL_SetupGrFile
- 160F:09C0 idle _CAL_SetupMapFile
- 160F:0B75 idle _CAL_SetupAudioFile
- 160F:0CAF _CA_Startup
- 160F:0CD0 _CA_Shutdown
- 160F:0CF9 _CA_CacheAudioChunk
- 160F:0DA1 _CA_LoadAllSounds
- 160F:0E22 idle _CAL_ExpandGrChunk
- 160F:0EF4 _CA_CacheGrChunk
- 160F:1031 _CA_CacheScreen
- 160F:111A _CA_CacheMap
- 160F:1269 _CA_UpLevel
- 160F:12A6 _CA_DownLevel
- 160F:12CC idle _CA_ClearMarks
- 160F:12ED idle _CA_ClearAllMarks
- 160F:130F idle _CA_SetGrPurge
- 160F:1336 _CA_SetAllPurge
- 160F:135D _CA_CacheMarks
- 160F:165E idle _CA_CannotOpen
- 177B:0141 _IN_GetJoyAbs
- 177B:01DA _INL_GetJoyDelta
- 177B:0336 idle _IN_GetJoyButtonsDB
- 177B:048B _IN_SetupJoy
- 177B:0572 _IN_Startup
- 177B:060E idle _IN_Default
- 177B:064D _IN_Shutdown
- 177B:0679 idle _IN_SetKeyHook
- 177B:068B _IN_ClearKeysDown
- 177B:06AA _IN_ReadControl
- 177B:09C2 idle _IN_SetControlType
- 177B:09D3 idle _IN_WaitForKey
- 177B:09EF _IN_WaitForASCII
- 177B:0A0A _IN_StartAck
- 177B:0A59 _IN_CheckAck
- 177B:0AB2 _IN_Ack
- 177B:0AC3 _IN_UserInput
- 177B:0B04 _IN_MouseButtons
- 177B:0B1B _IN_JoyButtons
- 182E:0000 idle _MML_CheckForXMS
- 182E:001B idle _MML_SetupXMS
- 182E:0087 idle _MML_ShutdownXMS
- 182E:00B6 _MML_UseSpace
- 182E:0239 idle _MML_ClearBlock
- 182E:029A _MM_Startup
- 182E:048B _MM_Shutdown
- 182E:04B3 _MM_GetPtr
- 182E:0767 _MM_FreePtr
- 182E:082B _MM_SetPurge
- 182E:08A9 _MM_SetLock
- 182E:092B _MM_SortMem
- 182E:0AE0 idle _MM_ShowMemory
- 182E:0C31 idle _MM_DumpData
- 182E:0D5B _MM_UnusedMemory
- 182E:0DC0 _MM_TotalFree
- 182E:0E3C _MM_BombOnError
- 1912:0007 idle _PML_MapEMS
- 1912:0029 idle _PML_StartupEMS
- 1912:0155 idle _PML_ShutdownEMS
- 1912:0178 idle _PML_StartupXMS
- 1912:01EA idle _PML_XMSCopy
- 1912:0293 idle _PML_ShutdownXMS
- 1912:02B8 _PM_SetMainMemPurge
- 1912:02DF _PM_CheckMainMem
- 1912:03D0 idle _PML_StartupMainMem
- 1912:0447 idle _PML_ShutdownMainMem
- 1912:046E idle _PML_ReadFromFile
- 1912:04E8 idle _PML_OpenPageFile
- 1912:06B1 idle _PML_ClosePageFile
- 1912:06E8 idle _PML_GetEMSAddress
- 1912:07BF _PM_GetPageAddress
- 1912:0812 idle _PML_GiveLRUPage
- 1912:08B0 idle _PML_GiveLRUXMSPage
- 1912:0920 idle _PML_PutPageInXMS
- 1912:09C9 idle _PML_TransferPageSpace
- 1912:0A96 idle _PML_GetAPageBuffer
- 1912:0BA0 idle _PML_GetPageFromXMS
- 1912:0C21 idle _PML_LoadPage
- 1912:0C71 _PM_GetPage
- 1912:0D31 _PM_SetPageLock
- 1912:0D60 _PM_Preload
- 1912:0FBA _PM_NextFrame
- 1912:1034 idle _PM_Reset
- 1912:10A0 _PM_Startup
- 1912:114B _PM_Shutdown
- 1A28:0501 idle _SDL_SBSetDMA
- 1A28:08B0 idle _SDL_LoadDigiSegment
- 1A28:08E1 idle _SDL_PlayDigiSegment
- 1A28:092B _SD_StopDigitized
- 1A28:09CC _SD_Poll
- 1A28:0A58 _SD_SetPosition
- 1A28:0A9F idle _SD_PlayDigitized
- 1A28:0B5F _SDL_DigitizedDone
- 1A28:0BC9 _SD_SetDigiDevice
- 1A28:0C2D idle _SDL_SetupDigi
- 1A28:0D03 _alOut
- 1A28:109B _SD_SetSoundMode
- 1A28:1129 _SD_SetMusicMode
- 1A28:117B _SD_Startup
- 1A28:14B4 idle _SD_Default
- 1A28:1523 _SD_Shutdown
- 1A28:157B idle _SD_SetUserHook
- 1A28:158D _SD_PositionSound
- 1A28:15A4 _SD_PlaySound
- 1A28:1744 _SD_SoundPlaying
- 1A28:178B _SD_StopSound
- 1A28:17C2 _SD_WaitSoundDone
- 1A28:17CF _SD_MusicOn
- 1A28:17DA _SD_MusicOff
- 1A28:181E _SD_StartMusic
- 1A28:1870 idle _SD_FadeOutMusic
- 1A28:1881 idle _SD_MusicPlaying
- 1BB1:000C _SDL_SetDS
- 1BB1:0014 _SDL_IndicatePC
- 1BB1:0021 _SDL_t0ExtremeAsmService
- 1BB1:009B _SDL_t0FastAsmService
- 1BB1:02CD _SDL_t0SlowAsmService
- 1BF0:0008 idle _USL_HardError
- 1BF0:0131 _US_Startup
- 1BF0:01FD _US_Shutdown
- 1BF0:020F _US_CheckParm
- 1BF0:02B5 idle _US_SetPrintRoutines
- 1BF0:02D4 _US_Print
- 1BF0:0378 _US_PrintUnsigned
- 1BF0:039D idle _US_PrintSigned
- 1BF0:03C2 idle _USL_PrintInCenter
- 1BF0:0420 _US_PrintCentered
- 1BF0:0462 idle _US_CPrintLine
- 1BF0:04BF _US_CPrint
- 1BF0:0528 _US_ClearWindow
- 1BF0:0553 _US_DrawWindow
- 1BF0:0669 idle _US_CenterWindow
- 1BF0:068D idle _US_SaveWindow
- 1BF0:06BA idle _US_RestoreWindow
- 1BF0:0782 _US_LineInput
- 1CAA:0010 _US_InitRndT
- 1CAA:0038 _US_RndT
- 1CAF:0003 _VL_Startup
- 1CAF:005B _VL_Shutdown
- 1CAF:0065 _VL_SetVGAPlaneMode
- 1CAF:0088 idle _VL_SetTextMode
- 1CAF:0092 idle _VL_ClearVideo
- 1CAF:00BC idle _VL_DePlaneVGA
- 1CAF:0113 idle _VL_SetLineWidth
- 1CAF:014C idle _VL_SetSplitScreen
- 1CAF:0198 idle _VL_FillPalette
- 1CAF:01BD idle _VL_SetColor
- 1CAF:01D8 idle _VL_GetColor
- 1CAF:0203 _VL_SetPalette
- 1CAF:0235 idle _VL_GetPalette
- 1CAF:0256 _VL_FadeOut
- 1CAF:0374 _VL_FadeIn
- 1CAF:044A _VL_TestPaletteSet
- 1CAF:04A5 _VL_ColorBorder
- 1CAF:04B9 _VL_Plot
- 1CAF:0504 _VL_Hlin
- 1CAF:05DF _VL_Vlin
- 1CAF:0646 _VL_Bar
- 1CAF:0749 _VL_MemToLatch
- 1CAF:079C _VL_MemToScreen
- 1CAF:0837 idle _VL_MaskedToScreen
- 1CAF:08C5 _VL_LatchToScreen
- 1CAF:092E idle _VL_DrawTile8String
- 1CAF:0A5B idle _VL_DrawLatch8String
- 1CAF:0B07 idle _VL_SizeTile8String
- 1D62:0000 idle _VW_DrawPropString
- 1D62:0113 idle _VW_DrawColorPropString
- 1D62:022E _VL_MungePic
- 1D62:02EC idle _VWL_MeasureString
- 1D62:032C _VW_MeasurePropString
- 1D62:034E idle _VW_MeasureMPropString
- 1D62:0370 _VW_MarkUpdateBlock
- 1D62:042B _VWB_DrawTile8
- 1D62:046E idle _VWB_DrawTile8M
- 1D62:04B3 _VWB_DrawPic
- 1D62:051F _VWB_DrawPropString
- 1D62:0556 _VWB_Bar
- 1D62:0592 _VWB_Plot
- 1D62:05BD _VWB_Hlin
- 1D62:05F1 _VWB_Vlin
- 1D62:0625 _VW_UpdateScreen
- 1D62:062F _LatchDrawPic
- 1D62:0687 _LoadLatchMem
- 1D62:07A1 _FizzleFade
- 1DF0:0002 _VL_WaitVBL
- 1DF0:0019 idle _VL_SetCRTC
- 1DF0:003D _VL_SetScreen
- 1DF0:00AA _VL_ScreenToScreen
- 1DF0:012A _VL_VideoID
- 1E19:0006 _VH_UpdateScreen
- 1E39:2152 e086_Entry
- 1E39:26E0 e086_Shortcut
- 20B1:0306 e087_Entry
- 20B1:03C6 e087_Shortcut
- 20B1:0430 e087_Trap
- 210E:0000 _planepics
- 230E:0002 idle _rndtable
- 231F:0000 idle _MusicMenu
- 234F:0000 idle _endStrings
- 237C:0000 _MainMenu
- 2394:0000 idle _SndMenu
- 23B4:0000 idle _CtlMenu
- 23C4:0000 idle _NewEmenu
- 23E1:0000 idle _NewMenu
- 23EC:0000 idle _LSMenu
- 2407:0000 idle _CusMenu
- 2422:0000 _signon
- 33DA:0000 _areaconnect
- 3430:0000 _sintable
- 34A1:0000 _finetangent
- 3582:0000 _grneeded
- 358C:0000 _whiteshifts
- 36AC:0000 _redshifts
- 37CC:0000 _mmblocks
- 39D9:0000 _palette2
- 3A09:0000 _palette1
- 3A39:0000 idle DATASEG@
- 3A39:00A3 idle __Int0Vector
- 3A39:00A7 idle __Int4Vector
- 3A39:00AB idle __Int5Vector
- 3A39:00AF idle __Int6Vector
- 3A39:00B3 __C0argc
- 3A39:00B5 __C0argv
- 3A39:00B7 __C0environ
- 3A39:00B9 __envLng
- 3A39:00BB __envseg
- 3A39:00BD __envSize
- 3A39:00BF __psp
- 3A39:00C1 idle __osversion
- 3A39:00C1 __osmajor
- 3A39:00C1 __version
- 3A39:00C2 idle __osminor
- 3A39:00C3 _errno
- 3A39:00C5 idle __StartTime
- 3A39:00C9 idle ___heapbase
- 3A39:00CB ___brklvl
- 3A39:00CD __heapbase
- 3A39:00D1 __brklvl
- 3A39:00D5 __heaptop
- 3A39:00DA idle _halfheight
- 3A39:00DC _dirangle
- 3A39:00EE _configname
- 3A39:00FC idle _JHParmStrings
- 3A39:0102 idle _radtoint
- 3A39:01C4 idle _MusicItems
- 3A39:01FC idle _nosprtxt
- 3A39:0330 idle _endextern
- 3A39:0332 idle _helpextern
- 3A39:0334 idle _helpfilename
- 3A39:0341 _endfilename
- 3A39:03D2 _MainItems
- 3A39:03DC idle _SndItems
- 3A39:03E6 idle _LSItems
- 3A39:03F0 idle _CtlItems
- 3A39:03FA idle _CusItems
- 3A39:0404 idle _NewEitems
- 3A39:040E idle _NewItems
- 3A39:0418 idle _color_hlite
- 3A39:0420 idle _color_norml
- 3A39:0428 idle _EpisodeSelect
- 3A39:0434 idle _SoundStatus
- 3A39:0436 idle _SaveName
- 3A39:05F2 idle _mbarray
- 3A39:05FE idle _order
- 3A39:0622 idle _moveorder
- 3A39:0E74 idle _ElevatorBackTo
- 3A39:0E80 idle _righttable
- 3A39:1042 idle _lefttable
- 3A39:1204 _demoname
- 3A39:1270 _dirscan
- 3A39:1278 _buttonscan
- 3A39:1288 _buttonmouse
- 3A39:1290 _buttonjoy
- 3A39:1298 idle _songs
- 3A39:1684 _screenloc
- 3A39:168A _freelatch
- 3A39:168C _tileglobal
- 3A39:1690 idle _mindist
- 3A39:1694 _costable
- 3A39:1698 idle _vgaCeiling
- 3A39:1710 idle _weaponscale
- 3A39:171A _mapmasks1
- 3A39:173A _mapmasks2
- 3A39:175A _mapmasks3
- 3A39:177A idle _wordmasks
- 3A39:180C idle _opposite
- 3A39:181E idle _diagonal
- 3A39:190C idle _s_player
- 3A39:191C idle _s_attack
- 3A39:192C idle _attackinfo
- 3A39:1A0C idle _strafeangle
- 3A39:1A1E idle _statinfo
- 3A39:1B38 idle _dirtable
- 3A39:1B4A idle _starthitpoints
- 3A39:1BFA idle _s_rocket
- 3A39:1C0A idle _s_smoke1
- 3A39:1C1A idle _s_smoke2
- 3A39:1C2A idle _s_smoke3
- 3A39:1C3A idle _s_smoke4
- 3A39:1C4A idle _s_boom1
- 3A39:1C5A idle _s_boom2
- 3A39:1C6A idle _s_boom3
- 3A39:1C7A idle _s_grdstand
- 3A39:1C8A idle _s_grdpath1
- 3A39:1C9A idle _s_grdpath1s
- 3A39:1CAA idle _s_grdpath2
- 3A39:1CBA idle _s_grdpath3
- 3A39:1CCA idle _s_grdpath3s
- 3A39:1CDA idle _s_grdpath4
- 3A39:1CEA _s_grdpain
- 3A39:1CFA _s_grdpain1
- 3A39:1D0A idle _s_grdshoot1
- 3A39:1D1A idle _s_grdshoot2
- 3A39:1D2A idle _s_grdshoot3
- 3A39:1D3A _s_grdchase1
- 3A39:1D4A idle _s_grdchase1s
- 3A39:1D5A idle _s_grdchase2
- 3A39:1D6A idle _s_grdchase3
- 3A39:1D7A idle _s_grdchase3s
- 3A39:1D8A idle _s_grdchase4
- 3A39:1D9A _s_grddie1
- 3A39:1DAA idle _s_grddie2
- 3A39:1DBA idle _s_grddie3
- 3A39:1DCA idle _s_grddie4
- 3A39:1DDA _s_blinkychase1
- 3A39:1DEA idle _s_blinkychase2
- 3A39:1DFA idle _s_inkychase1
- 3A39:1E0A idle _s_inkychase2
- 3A39:1E1A idle _s_pinkychase1
- 3A39:1E2A idle _s_pinkychase2
- 3A39:1E3A idle _s_clydechase1
- 3A39:1E4A idle _s_clydechase2
- 3A39:1E5A idle _s_dogpath1
- 3A39:1E6A idle _s_dogpath1s
- 3A39:1E7A idle _s_dogpath2
- 3A39:1E8A idle _s_dogpath3
- 3A39:1E9A idle _s_dogpath3s
- 3A39:1EAA idle _s_dogpath4
- 3A39:1EBA idle _s_dogjump1
- 3A39:1ECA idle _s_dogjump2
- 3A39:1EDA idle _s_dogjump3
- 3A39:1EEA idle _s_dogjump4
- 3A39:1EFA idle _s_dogjump5
- 3A39:1F0A _s_dogchase1
- 3A39:1F1A idle _s_dogchase1s
- 3A39:1F2A idle _s_dogchase2
- 3A39:1F3A idle _s_dogchase3
- 3A39:1F4A idle _s_dogchase3s
- 3A39:1F5A idle _s_dogchase4
- 3A39:1F6A _s_dogdie1
- 3A39:1F7A idle _s_dogdie2
- 3A39:1F8A idle _s_dogdie3
- 3A39:1F9A idle _s_dogdead
- 3A39:1FAA idle _s_ofcstand
- 3A39:1FBA idle _s_ofcpath1
- 3A39:1FCA idle _s_ofcpath1s
- 3A39:1FDA idle _s_ofcpath2
- 3A39:1FEA idle _s_ofcpath3
- 3A39:1FFA idle _s_ofcpath3s
- 3A39:200A idle _s_ofcpath4
- 3A39:201A _s_ofcpain
- 3A39:202A _s_ofcpain1
- 3A39:203A idle _s_ofcshoot1
- 3A39:204A idle _s_ofcshoot2
- 3A39:205A idle _s_ofcshoot3
- 3A39:206A _s_ofcchase1
- 3A39:207A idle _s_ofcchase1s
- 3A39:208A idle _s_ofcchase2
- 3A39:209A idle _s_ofcchase3
- 3A39:20AA idle _s_ofcchase3s
- 3A39:20BA idle _s_ofcchase4
- 3A39:20CA _s_ofcdie1
- 3A39:20DA idle _s_ofcdie2
- 3A39:20EA idle _s_ofcdie3
- 3A39:20FA idle _s_ofcdie4
- 3A39:210A idle _s_ofcdie5
- 3A39:211A idle _s_mutstand
- 3A39:212A idle _s_mutpath1
- 3A39:213A idle _s_mutpath1s
- 3A39:214A idle _s_mutpath2
- 3A39:215A idle _s_mutpath3
- 3A39:216A idle _s_mutpath3s
- 3A39:217A idle _s_mutpath4
- 3A39:218A _s_mutpain
- 3A39:219A _s_mutpain1
- 3A39:21AA idle _s_mutshoot1
- 3A39:21BA idle _s_mutshoot2
- 3A39:21CA idle _s_mutshoot3
- 3A39:21DA idle _s_mutshoot4
- 3A39:21EA _s_mutchase1
- 3A39:21FA idle _s_mutchase1s
- 3A39:220A idle _s_mutchase2
- 3A39:221A idle _s_mutchase3
- 3A39:222A idle _s_mutchase3s
- 3A39:223A idle _s_mutchase4
- 3A39:224A _s_mutdie1
- 3A39:225A idle _s_mutdie2
- 3A39:226A idle _s_mutdie3
- 3A39:227A idle _s_mutdie4
- 3A39:228A idle _s_mutdie5
- 3A39:229A idle _s_ssstand
- 3A39:22AA idle _s_sspath1
- 3A39:22BA idle _s_sspath1s
- 3A39:22CA idle _s_sspath2
- 3A39:22DA idle _s_sspath3
- 3A39:22EA idle _s_sspath3s
- 3A39:22FA idle _s_sspath4
- 3A39:230A _s_sspain
- 3A39:231A _s_sspain1
- 3A39:232A idle _s_ssshoot1
- 3A39:233A idle _s_ssshoot2
- 3A39:234A idle _s_ssshoot3
- 3A39:235A idle _s_ssshoot4
- 3A39:236A idle _s_ssshoot5
- 3A39:237A idle _s_ssshoot6
- 3A39:238A idle _s_ssshoot7
- 3A39:239A idle _s_ssshoot8
- 3A39:23AA idle _s_ssshoot9
- 3A39:23BA _s_sschase1
- 3A39:23CA idle _s_sschase1s
- 3A39:23DA idle _s_sschase2
- 3A39:23EA idle _s_sschase3
- 3A39:23FA idle _s_sschase3s
- 3A39:240A idle _s_sschase4
- 3A39:241A _s_ssdie1
- 3A39:242A idle _s_ssdie2
- 3A39:243A idle _s_ssdie3
- 3A39:244A idle _s_ssdie4
- 3A39:245A idle _s_bossstand
- 3A39:246A _s_bosschase1
- 3A39:247A idle _s_bosschase1s
- 3A39:248A idle _s_bosschase2
- 3A39:249A idle _s_bosschase3
- 3A39:24AA idle _s_bosschase3s
- 3A39:24BA idle _s_bosschase4
- 3A39:24CA _s_bossdie1
- 3A39:24DA idle _s_bossdie2
- 3A39:24EA idle _s_bossdie3
- 3A39:24FA idle _s_bossdie4
- 3A39:250A idle _s_bossshoot1
- 3A39:251A idle _s_bossshoot2
- 3A39:252A idle _s_bossshoot3
- 3A39:253A idle _s_bossshoot4
- 3A39:254A idle _s_bossshoot5
- 3A39:255A idle _s_bossshoot6
- 3A39:256A idle _s_bossshoot7
- 3A39:257A idle _s_bossshoot8
- 3A39:258A idle _s_gretelstand
- 3A39:259A _s_gretelchase1
- 3A39:25AA idle _s_gretelchase1s
- 3A39:25BA idle _s_gretelchase2
- 3A39:25CA idle _s_gretelchase3
- 3A39:25DA idle _s_gretelchase3s
- 3A39:25EA idle _s_gretelchase4
- 3A39:25FA _s_greteldie1
- 3A39:260A idle _s_greteldie2
- 3A39:261A idle _s_greteldie3
- 3A39:262A idle _s_greteldie4
- 3A39:263A idle _s_gretelshoot1
- 3A39:264A idle _s_gretelshoot2
- 3A39:265A idle _s_gretelshoot3
- 3A39:266A idle _s_gretelshoot4
- 3A39:267A idle _s_gretelshoot5
- 3A39:268A idle _s_gretelshoot6
- 3A39:269A idle _s_gretelshoot7
- 3A39:26AA idle _s_gretelshoot8
- 3A39:26CC idle _s_schabbstand
- 3A39:26DC _s_schabbchase1
- 3A39:26EC idle _s_schabbchase1s
- 3A39:26FC idle _s_schabbchase2
- 3A39:270C idle _s_schabbchase3
- 3A39:271C idle _s_schabbchase3s
- 3A39:272C idle _s_schabbchase4
- 3A39:273C idle _s_schabbdeathcam
- 3A39:274C _s_schabbdie1
- 3A39:275C idle _s_schabbdie2
- 3A39:276C idle _s_schabbdie3
- 3A39:277C idle _s_schabbdie4
- 3A39:278C idle _s_schabbdie5
- 3A39:279C idle _s_schabbdie6
- 3A39:27AC idle _s_schabbshoot1
- 3A39:27BC idle _s_schabbshoot2
- 3A39:27CC idle _s_needle1
- 3A39:27DC idle _s_needle2
- 3A39:27EC idle _s_needle3
- 3A39:27FC idle _s_needle4
- 3A39:280C idle _s_giftstand
- 3A39:281C _s_giftchase1
- 3A39:282C idle _s_giftchase1s
- 3A39:283C idle _s_giftchase2
- 3A39:284C idle _s_giftchase3
- 3A39:285C idle _s_giftchase3s
- 3A39:286C idle _s_giftchase4
- 3A39:287C idle _s_giftdeathcam
- 3A39:288C _s_giftdie1
- 3A39:289C idle _s_giftdie2
- 3A39:28AC idle _s_giftdie3
- 3A39:28BC idle _s_giftdie4
- 3A39:28CC idle _s_giftdie5
- 3A39:28DC idle _s_giftdie6
- 3A39:28EC idle _s_giftshoot1
- 3A39:28FC idle _s_giftshoot2
- 3A39:290C idle _s_fatstand
- 3A39:291C _s_fatchase1
- 3A39:292C idle _s_fatchase1s
- 3A39:293C idle _s_fatchase2
- 3A39:294C idle _s_fatchase3
- 3A39:295C idle _s_fatchase3s
- 3A39:296C idle _s_fatchase4
- 3A39:297C idle _s_fatdeathcam
- 3A39:298C _s_fatdie1
- 3A39:299C idle _s_fatdie2
- 3A39:29AC idle _s_fatdie3
- 3A39:29BC idle _s_fatdie4
- 3A39:29CC idle _s_fatdie5
- 3A39:29DC idle _s_fatdie6
- 3A39:29EC idle _s_fatshoot1
- 3A39:29FC idle _s_fatshoot2
- 3A39:2A0C idle _s_fatshoot3
- 3A39:2A1C idle _s_fatshoot4
- 3A39:2A2C idle _s_fatshoot5
- 3A39:2A3C idle _s_fatshoot6
- 3A39:2A4C idle _s_fakestand
- 3A39:2A5C _s_fakechase1
- 3A39:2A6C idle _s_fakechase1s
- 3A39:2A7C idle _s_fakechase2
- 3A39:2A8C idle _s_fakechase3
- 3A39:2A9C idle _s_fakechase3s
- 3A39:2AAC idle _s_fakechase4
- 3A39:2ABC _s_fakedie1
- 3A39:2ACC idle _s_fakedie2
- 3A39:2ADC idle _s_fakedie3
- 3A39:2AEC idle _s_fakedie4
- 3A39:2AFC idle _s_fakedie5
- 3A39:2B0C idle _s_fakedie6
- 3A39:2B1C idle _s_fakeshoot1
- 3A39:2B2C idle _s_fakeshoot2
- 3A39:2B3C idle _s_fakeshoot3
- 3A39:2B4C idle _s_fakeshoot4
- 3A39:2B5C idle _s_fakeshoot5
- 3A39:2B6C idle _s_fakeshoot6
- 3A39:2B7C idle _s_fakeshoot7
- 3A39:2B8C idle _s_fakeshoot8
- 3A39:2B9C idle _s_fakeshoot9
- 3A39:2BAC idle _s_fire1
- 3A39:2BBC idle _s_fire2
- 3A39:2BCC idle _s_mechastand
- 3A39:2BDC _s_mechachase1
- 3A39:2BEC idle _s_mechachase1s
- 3A39:2BFC idle _s_mechachase2
- 3A39:2C0C idle _s_mechachase3
- 3A39:2C1C idle _s_mechachase3s
- 3A39:2C2C idle _s_mechachase4
- 3A39:2C3C _s_mechadie1
- 3A39:2C4C idle _s_mechadie2
- 3A39:2C5C idle _s_mechadie3
- 3A39:2C6C idle _s_mechadie4
- 3A39:2C7C idle _s_mechashoot1
- 3A39:2C8C idle _s_mechashoot2
- 3A39:2C9C idle _s_mechashoot3
- 3A39:2CAC idle _s_mechashoot4
- 3A39:2CBC idle _s_mechashoot5
- 3A39:2CCC idle _s_mechashoot6
- 3A39:2CDC _s_hitlerchase1
- 3A39:2CEC idle _s_hitlerchase1s
- 3A39:2CFC idle _s_hitlerchase2
- 3A39:2D0C idle _s_hitlerchase3
- 3A39:2D1C idle _s_hitlerchase3s
- 3A39:2D2C idle _s_hitlerchase4
- 3A39:2D3C idle _s_hitlerdeathcam
- 3A39:2D4C _s_hitlerdie1
- 3A39:2D5C idle _s_hitlerdie2
- 3A39:2D6C idle _s_hitlerdie3
- 3A39:2D7C idle _s_hitlerdie4
- 3A39:2D8C idle _s_hitlerdie5
- 3A39:2D9C idle _s_hitlerdie6
- 3A39:2DAC idle _s_hitlerdie7
- 3A39:2DBC idle _s_hitlerdie8
- 3A39:2DCC idle _s_hitlerdie9
- 3A39:2DDC idle _s_hitlerdie10
- 3A39:2DEC idle _s_hitlershoot1
- 3A39:2DFC idle _s_hitlershoot2
- 3A39:2E0C idle _s_hitlershoot3
- 3A39:2E1C idle _s_hitlershoot4
- 3A39:2E2C idle _s_hitlershoot5
- 3A39:2E3C idle _s_hitlershoot6
- 3A39:2E54 idle _s_bjrun1
- 3A39:2E64 idle _s_bjrun1s
- 3A39:2E74 idle _s_bjrun2
- 3A39:2E84 idle _s_bjrun3
- 3A39:2E94 idle _s_bjrun3s
- 3A39:2EA4 idle _s_bjrun4
- 3A39:2EB4 idle _s_bjjump1
- 3A39:2EC4 idle _s_bjjump2
- 3A39:2ED4 idle _s_bjjump3
- 3A39:2EE4 idle _s_bjjump4
- 3A39:2EF4 _s_deathcam
- 3A39:2F4A _gamepal
- 3A39:324A _audioname
- 3A39:3257 idle _gheadname
- 3A39:3261 idle _gfilename
- 3A39:326B idle _gdictname
- 3A39:3275 idle _mheadname
- 3A39:327F idle _mfilename
- 3A39:3289 idle _aheadname
- 3A39:3293 idle _afilename
- 3A39:3354 idle _KbdDefs
- 3A39:335E idle _DemoMode
- 3A39:3510 idle _XMSProtectPage
- 3A39:3512 _PageFileName
- 3A39:3520 idle _PageFile
- 3A39:352A idle _EMMDriverName
- 3A39:39A0 idle _ssPort
- 3A39:3D12 _USL_MeasureString
- 3A39:3D16 idle _USL_DrawString
- 3A39:3D1A _Scores
- 3A39:3FC4 _screenseg
- 3A39:3FCA idle _pixmasks
- 3A39:3FCE idle _leftmasks
- 3A39:3FD2 idle _rightmasks
- 3A39:4090 __8087
- 3A39:40A0 __protected
- 3A39:40A1 __LDT
- 3A39:40A4 __default87
- 3A39:40A6 idle __huge_flt
- 3A39:40AA __huge_dble
- 3A39:40B2 idle __huge_ldble
- 3A39:40BC idle __indefinite
- 3A39:40C0 idle __tiny_ldble
- 3A39:40CA __mathwhy
- 3A39:4270 __emu
- 3A39:4380 __atexitcnt
- 3A39:4382 __ctype
- 3A39:4484 __exitbuf
- 3A39:4488 __exitfopen
- 3A39:448C __exitopen
- 3A39:4490 __streams
- 3A39:45D0 __nfile
- 3A39:45D2 __openfd
- 3A39:45FA __fmode
- 3A39:45FC __notUmask
- 3A39:45FE __fpstklen
- 3A39:4600 __heaplen
- 3A39:4602 __doserrno
- 3A39:4604 idle __dosErrorToSV
- 3A39:4668 __stklen
- 3A39:46D2 __video
- 3A39:46E1 _directvideo
- 3A39:471E idle __first
- 3A39:4720 idle __last
- 3A39:4722 idle __rover
- 3A39:4724 __argc
- 3A39:4726 __argv
- 3A39:4732 _environ
- 3A39:473A __RealCvtVector
- 3A39:473E idle __ScanTodVector
- 3A39:4944 __atexittbl
- 3A39:49D2 ___SignalPtr
- 3A39:49E4 _mr_dest
- 3A39:49E6 _mr_yfrac
- 3A39:49E8 _mr_xfrac
- 3A39:49EA _mr_ystep
- 3A39:49EC _mr_xstep
- 3A39:49EE _mr_count
- 3A39:49F0 _mr_rowofs
- 3A39:49F2 _pcos
- 3A39:49F6 _psin
- 3A39:49FA _mirrorofs
- 3A39:4AC2 _planeylookup
- 3A39:4C52 _basedist
- 3A39:4DE2 _stepscale
- 3A39:4F72 _spanstart
- 3A39:503A _viewcos
- 3A39:503E _viewsin
- 3A39:5042 _viewy
- 3A39:5046 _viewx
- 3A39:504A _wallheight
- 3A39:52CA _scale
- 3A39:52CE _viewheight
- 3A39:52D0 _viewwidth
- 3A39:52D2 _menuitems
- 3A39:52D4 _bufferofs
- 3A39:52D6 _pwalldir
- 3A39:52D8 _pwally
- 3A39:52DA _pwallx
- 3A39:52DC _areabyplayer
- 3A39:5326 _pwallstate
- 3A39:5328 _doorposition
- 3A39:53A8 _pwallpos
- 3A39:53AA _vertwall
- 3A39:542A _horizwall
- 3A39:54AA _viewsize
- 3A39:54AC _joystickport
- 3A39:54AE _joystickprogressive
- 3A39:54B0 _joypadenabled
- 3A39:54B2 _joystickenabled
- 3A39:54B4 _mouseenabled
- 3A39:54B6 _update
- 3A39:55BA _actorat
- 3A39:75BA _tilemap
- 3A39:85BA _nearmapylookup
- 3A39:863A _farmapylookup
- 3A39:86BA _doorobjlist
- 3A39:893A _laststatobj
- 3A39:893C _statobjlist
- 3A39:95BC _player
- 3A39:95BE _new
- 3A39:95C0 _playstate
- 3A39:95C2 _gamestate
- 3A39:9604 _minheightdiv
- 3A39:9606 _heightnumerator
- 3A39:960A _maxslope
- 3A39:960E _pixelangle
- 3A39:988E _mouseadjustment
- 3A39:9890 _virtualreality
- 3A39:9892 _startgame
- 3A39:9894 _shootdelta
- 3A39:9896 _centerx
- 3A39:9898 _screenofs
- 3A39:989A _focallength
- 3A39:989E _IsA386
- 3A39:98A0 _nospr
- 3A39:98A2 _str2
- 3A39:98B6 _str
- 3A39:9906 _LevelRatios
- 3A39:9956 _backcolor
- 3A39:9957 _blockstarts
- 3A39:9B5F _uwidthtable
- 3A39:9B79 _updateptr
- 3A39:9B7B _WindowW
- 3A39:9B7D _WindowY
- 3A39:9B7F _WindowX
- 3A39:9B81 _PrintY
- 3A39:9B83 _NoWait
- 3A39:9B85 _loadedgame
- 3A39:9B87 _tedlevelnum
- 3A39:9B89 _tedlevel
- 3A39:9B8B _DigiMap
- 3A39:9C39 _MusicMode
- 3A39:9C3B _DigiMode
- 3A39:9C3D _SoundMode
- 3A39:9C3F _SoundBlasterPresent
- 3A39:9C41 _SoundSourcePresent
- 3A39:9C43 _AdLibPresent
- 3A39:9C45 _JoysPresent
- 3A39:9C49 _MousePresent
- 3A39:9C4B _Keyboard
- 3A39:9D4B _fontnumber
- 3A39:9D4D _fontcolor
- 3A39:9D4E _displayofs
- 3A39:9D50 _grsegs
- 3A39:9E7A _mminfo
- 3A39:9E8E _layoutdone
- 3A39:9E90 _picdelay
- 3A39:9E92 _picnum
- 3A39:9E94 _picy
- 3A39:9E96 _picx
- 3A39:9E98 _rowon
- 3A39:9E9A _text
- 3A39:9E9E _rightmargin
- 3A39:9EBC _leftmargin
- 3A39:9EDA _numpages
- 3A39:9EDC _pagenum
- 3A39:9EDE _TimeCount
- 3A39:9EE2 _LastScan
- 3A39:9EE3 _py
- 3A39:9EE5 _px
- 3A39:9EE7 _pictable
- 3A39:9EE9 _ca_levelbit
- 3A39:9EEA _pickquick
- 3A39:9EEC _lasttimecount
- 3A39:9EF0 _SaveGameNames
- 3A39:A030 _StartGame
- 3A39:A032 _SaveGamesAvail
- 3A39:A046 _WindowH
- 3A39:A048 _PrintX
- 3A39:A04A _ingame
- 3A39:A04C _LastASCII
- 3A39:A04D _Paused
- 3A39:A04F _extension
- 3A39:A054 _audiosegs
- 3A39:A294 _EMSPagesAvail
- 3A39:A296 _XMSPagesAvail
- 3A39:A298 _EMSPresent
- 3A39:A29A _XMSPresent
- 3A39:A29C _mmerror
- 3A39:A29E _mapon
- 3A39:A2A0 _rightchannel
- 3A39:A2A2 _leftchannel
- 3A39:A2A4 _globalsoundy
- 3A39:A2A8 _globalsoundx
- 3A39:A2AC _demobuffer
- 3A39:A2AE _lastdemoptr
- 3A39:A2B2 _demoptr
- 3A39:A2B6 _demoplayback
- 3A39:A2B8 _demorecord
- 3A39:A2BA _killerobj
- 3A39:A2BC _spearflag
- 3A39:A2BE _spearangle
- 3A39:A2C0 _speary
- 3A39:A2C4 _spearx
- 3A39:A2C8 _fizzlein
- 3A39:A2CA _tics
- 3A39:A2CC _mapheight
- 3A39:A2CE _mapwidth
- 3A39:A2D0 _SoundPositioned
- 3A39:A2D2 _latchpics
- 3A39:A39A _mapheaderseg
- 3A39:A412 _mapsegs
- 3A39:A416 _funnyticount
- 3A39:A41A _palshifted
- 3A39:A41C _bonuscount
- 3A39:A41E _damagecount
- 3A39:A420 _objcount
- 3A39:A422 _dummyobj
- 3A39:A45E _mapwidthtable
- 3A39:A4DE _DebugOk
- 3A39:A4E0 _facecount
- 3A39:A4E2 _anglefrac
- 3A39:A4E4 _running
- 3A39:A4E6 _frameon
- 3A39:A4EA _buttonstate
- 3A39:A4FA _controly
- 3A39:A4FC _controlx
- 3A39:A4FE _buttonheld
- 3A39:A50E _extravbls
- 3A39:A510 _noclip
- 3A39:A512 _godmode
- 3A39:A514 _singlestep
- 3A39:A516 _spotvis
- 3A39:B516 _objfreelist
- 3A39:B518 _lastobj
- 3A39:B51A _obj
- 3A39:B51C _objlist
- 3A39:D844 _madenoise
- 3A39:D846 _compatability
- 3A39:D848 _screenfaded
- 3A39:D84A _DigiList
- 3A39:D84C _NumDigi
- 3A39:D84E _viewtype
- 3A39:D850 _maporgy
- 3A39:D852 _maporgx
- 3A39:D854 _postwidth
- 3A39:D856 _postx
- 3A39:D858 _postsource
- 3A39:D85C _doornum
- 3A39:D85E _PMPages
- 3A39:D862 _PMSoundStart
- 3A39:D864 _PMSpriteStart
- 3A39:D866 _ChunksInFile
- 3A39:D868 _farthest
- 3A39:D86A _visstep
- 3A39:D86C _visptr
- 3A39:D86E _vislist
- 3A39:D99A _ystep
- 3A39:D99E _xstep
- 3A39:D9A2 _yintercept
- 3A39:D9A6 _xintercept
- 3A39:D9AA _ytilestep
- 3A39:D9AC _xtilestep
- 3A39:D9AE _ytile
- 3A39:D9B0 _xtile
- 3A39:D9B2 _pixx
- 3A39:D9B4 _tilehit
- 3A39:D9B6 _yinttile
- 3A39:D9B8 _xinttile
- 3A39:D9BA _ypartialdown
- 3A39:D9BC _ypartialup
- 3A39:D9BE _xpartialdown
- 3A39:D9C0 _xpartialup
- 3A39:D9C2 _ypartial
- 3A39:D9C4 _xpartial
- 3A39:D9C6 _angle
- 3A39:D9C8 _midangle
- 3A39:D9CA _viewty
- 3A39:D9CC _viewtx
- 3A39:D9CE _focalty
- 3A39:D9D0 _focaltx
- 3A39:D9D2 _lasttilehit
- 3A39:D9D4 _lastintercept
- 3A39:D9D8 _lastside
- 3A39:D9DA _maxscaleshl2
- 3A39:D9DC _fullscalefarcall
- 3A39:DDE0 _viewangle
- 3A39:DDE2 _mask3
- 3A39:DDE3 _mask2
- 3A39:DDE4 _mask1
- 3A39:DDE5 _maskword
- 3A39:DDE7 _linescale
- 3A39:DDEB _linecmds
- 3A39:DDEF _slinewidth
- 3A39:DDF1 _slinex
- 3A39:DDF3 _stepbytwo
- 3A39:DDF5 _work
- 3A39:DDF7 _insetupscaling
- 3A39:DDF9 _maxscale
- 3A39:DDFB _scaledirectory
- 3A39:DFFD _pluy
- 3A39:DFFF _plux
- 3A39:E001 _playerymove
- 3A39:E005 _playerxmove
- 3A39:E009 _LastAttacker
- 3A39:E00B _gotgatgun
- 3A39:E00D _thrustspeed
- 3A39:E011 _lastdoorobj
- 3A39:E013 _oldsoundmode
- 3A39:E015 _chunkexplen
- 3A39:E019 _chunkcomplen
- 3A39:E01D _audiohandle
- 3A39:E01F _maphandle
- 3A39:E021 _grhandle
- 3A39:E023 _audiohuffman
- 3A39:E41F _grhuffman
- 3A39:E81B _audiostarts
- 3A39:E81D _grstarts
- 3A39:E81F _debughandle
- 3A39:E821 _profilehandle
- 3A39:E823 _ca_levelnum
- 3A39:E824 _tinf
- 3A39:E826 _bufferseg
- 3A39:E828 _btnstate
- 3A39:E838 _MouseDownCount
- 3A39:E83C _JoyPadPresent
- 3A39:E83E _DemoSize
- 3A39:E840 _DemoOffset
- 3A39:E842 _DemoBuffer
- 3A39:E844 _Controls
- 3A39:E84C _JoyDefs
- 3A39:E87C _UMBbase
- 3A39:E890 _numUMBs
- 3A39:E892 _XMSaddr
- 3A39:E896 _bombonerror
- 3A39:E898 _mmnew
- 3A39:E89C _mmrover
- 3A39:E8A0 _mmfree
- 3A39:E8A4 _mmhead
- 3A39:E8A8 _nearheap
- 3A39:E8AA _farheap
- 3A39:E8AE _mmstarted
- 3A39:E8B0 _aftersort
- 3A39:E8B4 _beforesort
- 3A39:E8B8 _PMSegPages
- 3A39:E8BA _PMFrameCount
- 3A39:E8BE _PMNumBlocks
- 3A39:E8C0 _MainPagesUsed
- 3A39:E8C2 _EMSPagesUsed
- 3A39:E8C4 _XMSPagesUsed
- 3A39:E8C6 _PMThrashing
- 3A39:E8C8 _PMPanicMode
- 3A39:E8CA _PMStarted
- 3A39:E8CC _XMSDriver
- 3A39:E8D0 _XMSHandle
- 3A39:E8D2 _XMSAvail
- 3A39:E8D4 _EMSList
- 3A39:E8EC _EMSPhysicalPage
- 3A39:E8EE _EMSPageFrame
- 3A39:E8F0 _EMSHandle
- 3A39:E8F2 _EMSAvail
- 3A39:E8F4 _MainPagesAvail
- 3A39:E8F6 _MainMemUsed
- 3A39:E9BE _MainMemPages
- 3A39:EA86 _MainPresent
- 3A39:EA88 _sqHackTime
- 3A39:EA8C _sqHackSeqLen
- 3A39:EA8E _sqHackLen
- 3A39:EA90 _sqHackPtr
- 3A39:EA94 _sqHack
- 3A39:EA98 _sqActive
- 3A39:EA9A _alZeroInst
- 3A39:EAAA _alTimeCount
- 3A39:EAAE _alLengthLeft
- 3A39:EAB2 _alBlock
- 3A39:EAB4 _alSound
- 3A39:EAB8 _alNoCheck
- 3A39:EABA _pcSoundLookup
- 3A39:ECB8 _pcLengthLeft
- 3A39:ECBC _pcSound
- 3A39:ECC0 _pcLastSample
- 3A39:ECC1 _ssLengthLeft
- 3A39:ECC5 _ssSample
- 3A39:ECC9 _ssOff
- 3A39:ECCA _ssOn
- 3A39:ECCB _ssData
- 3A39:ECCD _ssStatus
- 3A39:ECCF _ssControl
- 3A39:ECD1 _ssActive
- 3A39:ECD3 _ssNoCheck
- 3A39:ECD5 _DigiLastEnd
- 3A39:ECD7 _DigiLastStart
- 3A39:ECD9 _DigiPage
- 3A39:ECDB _DigiLeft
- 3A39:ECDD _TimerRate
- 3A39:ECDF _LocalTime
- 3A39:ECE3 _t0OldService
- 3A39:ECE7 _RightPosition
- 3A39:ECE9 _LeftPosition
- 3A39:ECEB _DigiPriority
- 3A39:ECED _SoundPriority
- 3A39:ECEF _DigiNumber
- 3A39:ECF1 _SoundNumber
- 3A39:ECF3 _TimerCount
- 3A39:ECF7 _TimerDivisor
- 3A39:ECFB _nextsoundpos
- 3A39:ECFD _ssIsTandy
- 3A39:ECFF _SoundTable
- 3A39:ED01 _HackCount
- 3A39:ED03 _NeedsDigitized
- 3A39:ED05 _SBProPresent
- 3A39:ED07 _DigiPlaying
- 3A39:ED09 _NeedsMusic
- 3A39:ED0B _Games
- 3A39:EE07 _CursorY
- 3A39:EE09 _CursorX
- 3A39:EE0B _CursorBad
- 3A39:EE0D _Button1
- 3A39:EE0F _Button0
- 3A39:EE11 _abortprogram
- 3A39:EE13 _fastpalette
- 3A39:EE15 _bordercolor
- 3A39:EE17 _ylookup
- 3A39:EFA7 _linewidth
- 3A39:EFA9 _pelpan
- 3A39:EFAB _bufferheight
- 3A39:EFAD _bufferwidth
-
-Program entry point at 0000:0000
-
binary files a/WOLFSRC/WOLF3D.PRJ /dev/null differ
--- a/WOLFSRC/WOLFGTV.H
+++ /dev/null
@@ -1,10 +1,0 @@
-//#define SPEAR
-//#define JAPAN
-#define GOODTIMES
-#define ARTSEXTERN
-#define DEMOSEXTERN
-//#define MYPROFILE
-//#define DEBCHECK
-#define CARMACIZED
-//#define UPLOAD
-
\ No newline at end of file
--- a/WOLFSRC/WOLFHACK.C
+++ /dev/null
@@ -1,186 +1,0 @@
-// WOLFHACK.C
-
-#include "WL_DEF.H"
-
-#define MAXVIEWHEIGHT 200
-
-int spanstart[MAXVIEWHEIGHT/2];
-
-fixed stepscale[MAXVIEWHEIGHT/2];
-fixed basedist[MAXVIEWHEIGHT/2];
-
-extern char far planepics[8192]; // 4k of ceiling, 4k of floor
-
-int halfheight = 0;
-
-byte far *planeylookup[MAXVIEWHEIGHT/2];
-unsigned mirrorofs[MAXVIEWHEIGHT/2];
-
-fixed psin, pcos;
-
-fixed FixedMul (fixed a, fixed b)
-{
- return (a>>8)*(b>>8);
-}
-
-
-int mr_rowofs;
-int mr_count;
-int mr_xstep;
-int mr_ystep;
-int mr_xfrac;
-int mr_yfrac;
-int mr_dest;
-
-
-/*
-==============
-=
-= DrawSpans
-=
-= Height ranges from 0 (infinity) to viewheight/2 (nearest)
-==============
-*/
-
-void DrawSpans (int x1, int x2, int height)
-{
- fixed length;
- int ofs;
- int prestep;
- fixed startxfrac, startyfrac;
-
- int x, startx, count, plane, startplane;
- byte far *toprow, far *dest;
-
- toprow = planeylookup[height]+bufferofs;
- mr_rowofs = mirrorofs[height];
-
- mr_xstep = (psin<<1)/height;
- mr_ystep = (pcos<<1)/height;
-
- length = basedist[height];
- startxfrac = (viewx + FixedMul(length,pcos));
- startyfrac = (viewy - FixedMul(length,psin));
-
-// draw two spans simultaniously
-
- plane = startplane = x1&3;
- prestep = viewwidth/2 - x1;
- do
- {
- outportb (SC_INDEX+1,1<<plane);
- mr_xfrac = startxfrac - (mr_xstep>>2)*prestep;
- mr_yfrac = startyfrac - (mr_ystep>>2)*prestep;
-
- startx = x1>>2;
- mr_dest = (unsigned)toprow + startx;
- mr_count = ((x2-plane)>>2) - startx + 1;
- x1++;
- prestep--;
- if (mr_count)
- MapRow ();
- plane = (plane+1)&3;
- } while (plane != startplane);
-
-}
-
-
-
-
-/*
-===================
-=
-= SetPlaneViewSize
-=
-===================
-*/
-
-void SetPlaneViewSize (void)
-{
- int x,y;
- byte far *dest, far *src;
-
- halfheight = viewheight>>1;
-
-
- for (y=0 ; y<halfheight ; y++)
- {
- planeylookup[y] = (byte far *)0xa0000000l + (halfheight-1-y)*SCREENBWIDE;;
- mirrorofs[y] = (y*2+1)*SCREENBWIDE;
-
- stepscale[y] = y*GLOBAL1/32;
- if (y>0)
- basedist[y] = GLOBAL1/2*scale/y;
- }
-
- src = PM_GetPage(0);
- dest = planepics;
- for (x=0 ; x<4096 ; x++)
- {
- *dest = *src++;
- dest += 2;
- }
- src = PM_GetPage(1);
- dest = planepics+1;
- for (x=0 ; x<4096 ; x++)
- {
- *dest = *src++;
- dest += 2;
- }
-
-}
-
-
-/*
-===================
-=
-= DrawPlanes
-=
-===================
-*/
-
-void DrawPlanes (void)
-{
- int height, lastheight;
- int x;
-
- if (viewheight>>1 != halfheight)
- SetPlaneViewSize (); // screen size has changed
-
-
- psin = viewsin;
- if (psin < 0)
- psin = -(psin&0xffff);
- pcos = viewcos;
- if (pcos < 0)
- pcos = -(pcos&0xffff);
-
-//
-// loop over all columns
-//
- lastheight = halfheight;
-
- for (x=0 ; x<viewwidth ; x++)
- {
- height = wallheight[x]>>3;
- if (height < lastheight)
- { // more starts
- do
- {
- spanstart[--lastheight] = x;
- } while (lastheight > height);
- }
- else if (height > lastheight)
- { // draw spans
- if (height > halfheight)
- height = halfheight;
- for ( ; lastheight < height ; lastheight++)
- DrawSpans (spanstart[lastheight], x-1, lastheight);
- }
- }
-
- height = halfheight;
- for ( ; lastheight < height ; lastheight++)
- DrawSpans (spanstart[lastheight], x-1, lastheight);
-}
-
--- a/WOLFSRC/WOLFJVER.H
+++ /dev/null
@@ -1,8 +1,0 @@
-//#define SPEAR
-#define JAPAN
-#define ARTSEXTERN
-#define DEMOSEXTERN
-//#define MYPROFILE
-//#define DEBCHECK
-#define CARMACIZED
-//#define UPLOAD
--- a/WOLFSRC/WOLFVER.H
+++ /dev/null
@@ -1,7 +1,0 @@
-//#define SPEAR
-#define ARTSEXTERN
-#define DEMOSEXTERN
-//#define MYPROFILE
-//#define DEBCHECK
-#define CARMACIZED
-//#define UPLOAD
--- /dev/null
+++ b/act1.c
@@ -1,0 +1,900 @@
+// WL_ACT1.C
+
+#include "WL_DEF.H"
+#pragma hdrstop
+
+/*
+=============================================================================
+
+ STATICS
+
+=============================================================================
+*/
+
+
+statobj_t statobjlist[MAXSTATS],*laststatobj;
+
+
+struct
+{
+ int picnum;
+ stat_t type;
+} statinfo[] =
+{
+{SPR_STAT_0}, // puddle spr1v
+{SPR_STAT_1,block}, // Green Barrel "
+{SPR_STAT_2,block}, // Table/chairs "
+{SPR_STAT_3,block}, // Floor lamp "
+{SPR_STAT_4}, // Chandelier "
+{SPR_STAT_5,block}, // Hanged man "
+{SPR_STAT_6,bo_alpo}, // Bad food "
+{SPR_STAT_7,block}, // Red pillar "
+//
+// NEW PAGE
+//
+{SPR_STAT_8,block}, // Tree spr2v
+{SPR_STAT_9}, // Skeleton flat "
+{SPR_STAT_10,block}, // Sink " (SOD:gibs)
+{SPR_STAT_11,block}, // Potted plant "
+{SPR_STAT_12,block}, // Urn "
+{SPR_STAT_13,block}, // Bare table "
+{SPR_STAT_14}, // Ceiling light "
+#ifndef SPEAR
+{SPR_STAT_15}, // Kitchen stuff "
+#else
+{SPR_STAT_15,block}, // Gibs!
+#endif
+//
+// NEW PAGE
+//
+{SPR_STAT_16,block}, // suit of armor spr3v
+{SPR_STAT_17,block}, // Hanging cage "
+{SPR_STAT_18,block}, // SkeletoninCage "
+{SPR_STAT_19}, // Skeleton relax "
+{SPR_STAT_20,bo_key1}, // Key 1 "
+{SPR_STAT_21,bo_key2}, // Key 2 "
+{SPR_STAT_22,block}, // stuff (SOD:gibs)
+{SPR_STAT_23}, // stuff
+//
+// NEW PAGE
+//
+{SPR_STAT_24,bo_food}, // Good food spr4v
+{SPR_STAT_25,bo_firstaid}, // First aid "
+{SPR_STAT_26,bo_clip}, // Clip "
+{SPR_STAT_27,bo_machinegun}, // Machine gun "
+{SPR_STAT_28,bo_chaingun}, // Gatling gun "
+{SPR_STAT_29,bo_cross}, // Cross "
+{SPR_STAT_30,bo_chalice}, // Chalice "
+{SPR_STAT_31,bo_bible}, // Bible "
+//
+// NEW PAGE
+//
+{SPR_STAT_32,bo_crown}, // crown spr5v
+{SPR_STAT_33,bo_fullheal}, // one up "
+{SPR_STAT_34,bo_gibs}, // gibs "
+{SPR_STAT_35,block}, // barrel "
+{SPR_STAT_36,block}, // well "
+{SPR_STAT_37,block}, // Empty well "
+{SPR_STAT_38,bo_gibs}, // Gibs 2 "
+{SPR_STAT_39,block}, // flag "
+//
+// NEW PAGE
+//
+#ifndef SPEAR
+{SPR_STAT_40,block}, // Call Apogee spr7v
+#else
+{SPR_STAT_40}, // Red light
+#endif
+//
+// NEW PAGE
+//
+{SPR_STAT_41}, // junk "
+{SPR_STAT_42}, // junk "
+{SPR_STAT_43}, // junk "
+#ifndef SPEAR
+{SPR_STAT_44}, // pots "
+#else
+{SPR_STAT_44,block}, // Gibs!
+#endif
+{SPR_STAT_45,block}, // stove " (SOD:gibs)
+{SPR_STAT_46,block}, // spears " (SOD:gibs)
+{SPR_STAT_47}, // vines "
+//
+// NEW PAGE
+//
+#ifdef SPEAR
+{SPR_STAT_48,block}, // marble pillar
+{SPR_STAT_49,bo_25clip}, // bonus 25 clip
+{SPR_STAT_50,block}, // truck
+{SPR_STAT_51,bo_spear}, // SPEAR OF DESTINY!
+#endif
+
+{SPR_STAT_26,bo_clip2}, // Clip "
+{-1} // terminator
+};
+
+/*
+===============
+=
+= InitStaticList
+=
+===============
+*/
+
+void InitStaticList (void)
+{
+ laststatobj = &statobjlist[0];
+}
+
+
+
+/*
+===============
+=
+= SpawnStatic
+=
+===============
+*/
+
+void SpawnStatic (int tilex, int tiley, int type)
+{
+ laststatobj->shapenum = statinfo[type].picnum;
+ laststatobj->tilex = tilex;
+ laststatobj->tiley = tiley;
+ laststatobj->visspot = &spotvis[tilex][tiley];
+
+ switch (statinfo[type].type)
+ {
+ case block:
+ (unsigned)actorat[tilex][tiley] = 1; // consider it a blocking tile
+ case dressing:
+ laststatobj->flags = 0;
+ break;
+
+ case bo_cross:
+ case bo_chalice:
+ case bo_bible:
+ case bo_crown:
+ case bo_fullheal:
+ if (!loadedgame)
+ gamestate.treasuretotal++;
+
+ case bo_firstaid:
+ case bo_key1:
+ case bo_key2:
+ case bo_key3:
+ case bo_key4:
+ case bo_clip:
+ case bo_25clip:
+ case bo_machinegun:
+ case bo_chaingun:
+ case bo_food:
+ case bo_alpo:
+ case bo_gibs:
+ case bo_spear:
+ laststatobj->flags = FL_BONUS;
+ laststatobj->itemnumber = statinfo[type].type;
+ break;
+ }
+
+ laststatobj++;
+
+ if (laststatobj == &statobjlist[MAXSTATS])
+ Quit ("Too many static objects!\n");
+}
+
+
+/*
+===============
+=
+= PlaceItemType
+=
+= Called during game play to drop actors' items. It finds the proper
+= item number based on the item type (bo_???). If there are no free item
+= spots, nothing is done.
+=
+===============
+*/
+
+void PlaceItemType (int itemtype, int tilex, int tiley)
+{
+ int type;
+ statobj_t *spot;
+
+//
+// find the item number
+//
+ for (type=0 ; ; type++)
+ {
+ if (statinfo[type].picnum == -1) // end of list
+ Quit ("PlaceItemType: couldn't find type!");
+ if (statinfo[type].type == itemtype)
+ break;
+ }
+
+//
+// find a spot in statobjlist to put it in
+//
+ for (spot=&statobjlist[0] ; ; spot++)
+ {
+ if (spot==laststatobj)
+ {
+ if (spot == &statobjlist[MAXSTATS])
+ return; // no free spots
+ laststatobj++; // space at end
+ break;
+ }
+
+ if (spot->shapenum == -1) // -1 is a free spot
+ break;
+ }
+//
+// place it
+//
+ spot->shapenum = statinfo[type].picnum;
+ spot->tilex = tilex;
+ spot->tiley = tiley;
+ spot->visspot = &spotvis[tilex][tiley];
+ spot->flags = FL_BONUS;
+ spot->itemnumber = statinfo[type].type;
+}
+
+
+
+/*
+=============================================================================
+
+ DOORS
+
+doorobjlist[] holds most of the information for the doors
+
+doorposition[] holds the amount the door is open, ranging from 0 to 0xffff
+ this is directly accessed by AsmRefresh during rendering
+
+The number of doors is limited to 64 because a spot in tilemap holds the
+ door number in the low 6 bits, with the high bit meaning a door center
+ and bit 6 meaning a door side tile
+
+Open doors conect two areas, so sounds will travel between them and sight
+ will be checked when the player is in a connected area.
+
+Areaconnect is incremented/decremented by each door. If >0 they connect
+
+Every time a door opens or closes the areabyplayer matrix gets recalculated.
+ An area is true if it connects with the player's current spor.
+
+=============================================================================
+*/
+
+#define DOORWIDTH 0x7800
+#define OPENTICS 300
+
+doorobj_t doorobjlist[MAXDOORS],*lastdoorobj;
+int doornum;
+
+unsigned doorposition[MAXDOORS]; // leading edge of door 0=closed
+ // 0xffff = fully open
+
+byte far areaconnect[NUMAREAS][NUMAREAS];
+
+boolean areabyplayer[NUMAREAS];
+
+
+/*
+==============
+=
+= ConnectAreas
+=
+= Scans outward from playerarea, marking all connected areas
+=
+==============
+*/
+
+void RecursiveConnect (int areanumber)
+{
+ int i;
+
+ for (i=0;i<NUMAREAS;i++)
+ {
+ if (areaconnect[areanumber][i] && !areabyplayer[i])
+ {
+ areabyplayer[i] = true;
+ RecursiveConnect (i);
+ }
+ }
+}
+
+
+void ConnectAreas (void)
+{
+ memset (areabyplayer,0,sizeof(areabyplayer));
+ areabyplayer[player->areanumber] = true;
+ RecursiveConnect (player->areanumber);
+}
+
+
+void InitAreas (void)
+{
+ memset (areabyplayer,0,sizeof(areabyplayer));
+ areabyplayer[player->areanumber] = true;
+}
+
+
+
+/*
+===============
+=
+= InitDoorList
+=
+===============
+*/
+
+void InitDoorList (void)
+{
+ memset (areabyplayer,0,sizeof(areabyplayer));
+ _fmemset (areaconnect,0,sizeof(areaconnect));
+
+ lastdoorobj = &doorobjlist[0];
+ doornum = 0;
+}
+
+
+/*
+===============
+=
+= SpawnDoor
+=
+===============
+*/
+
+void SpawnDoor (int tilex, int tiley, boolean vertical, int lock)
+{
+ int areanumber;
+ unsigned far *map;
+
+ if (doornum==64)
+ Quit ("64+ doors on level!");
+
+ doorposition[doornum] = 0; // doors start out fully closed
+ lastdoorobj->tilex = tilex;
+ lastdoorobj->tiley = tiley;
+ lastdoorobj->vertical = vertical;
+ lastdoorobj->lock = lock;
+ lastdoorobj->action = dr_closed;
+
+ (unsigned)actorat[tilex][tiley] = doornum | 0x80; // consider it a solid wall
+
+//
+// make the door tile a special tile, and mark the adjacent tiles
+// for door sides
+//
+ tilemap[tilex][tiley] = doornum | 0x80;
+ map = mapsegs[0] + farmapylookup[tiley]+tilex;
+ if (vertical)
+ {
+ *map = *(map-1); // set area number
+ tilemap[tilex][tiley-1] |= 0x40;
+ tilemap[tilex][tiley+1] |= 0x40;
+ }
+ else
+ {
+ *map = *(map-mapwidth); // set area number
+ tilemap[tilex-1][tiley] |= 0x40;
+ tilemap[tilex+1][tiley] |= 0x40;
+ }
+
+ doornum++;
+ lastdoorobj++;
+}
+
+//===========================================================================
+
+/*
+=====================
+=
+= OpenDoor
+=
+=====================
+*/
+
+void OpenDoor (int door)
+{
+ if (doorobjlist[door].action == dr_open)
+ doorobjlist[door].ticcount = 0; // reset open time
+ else
+ doorobjlist[door].action = dr_opening; // start it opening
+}
+
+
+/*
+=====================
+=
+= CloseDoor
+=
+=====================
+*/
+
+void CloseDoor (int door)
+{
+ int tilex,tiley,area;
+ objtype *check;
+
+//
+// don't close on anything solid
+//
+ tilex = doorobjlist[door].tilex;
+ tiley = doorobjlist[door].tiley;
+
+ if (actorat[tilex][tiley])
+ return;
+
+ if (player->tilex == tilex && player->tiley == tiley)
+ return;
+
+ if (doorobjlist[door].vertical)
+ {
+ if ( player->tiley == tiley )
+ {
+ if ( ((player->x+MINDIST) >>TILESHIFT) == tilex )
+ return;
+ if ( ((player->x-MINDIST) >>TILESHIFT) == tilex )
+ return;
+ }
+ check = actorat[tilex-1][tiley];
+ if (check && ((check->x+MINDIST) >> TILESHIFT) == tilex )
+ return;
+ check = actorat[tilex+1][tiley];
+ if (check && ((check->x-MINDIST) >> TILESHIFT) == tilex )
+ return;
+ }
+ else if (!doorobjlist[door].vertical)
+ {
+ if (player->tilex == tilex)
+ {
+ if ( ((player->y+MINDIST) >>TILESHIFT) == tiley )
+ return;
+ if ( ((player->y-MINDIST) >>TILESHIFT) == tiley )
+ return;
+ }
+ check = actorat[tilex][tiley-1];
+ if (check && ((check->y+MINDIST) >> TILESHIFT) == tiley )
+ return;
+ check = actorat[tilex][tiley+1];
+ if (check && ((check->y-MINDIST) >> TILESHIFT) == tiley )
+ return;
+ }
+
+
+//
+// play door sound if in a connected area
+//
+ area = *(mapsegs[0] + farmapylookup[doorobjlist[door].tiley]
+ +doorobjlist[door].tilex)-AREATILE;
+ if (areabyplayer[area])
+ {
+ PlaySoundLocTile(CLOSEDOORSND,doorobjlist[door].tilex,doorobjlist[door].tiley); // JAB
+ }
+
+ doorobjlist[door].action = dr_closing;
+//
+// make the door space solid
+//
+ (unsigned)actorat[tilex][tiley]
+ = door | 0x80;
+}
+
+
+
+/*
+=====================
+=
+= OperateDoor
+=
+= The player wants to change the door's direction
+=
+=====================
+*/
+
+void OperateDoor (int door)
+{
+ int lock;
+
+ lock = doorobjlist[door].lock;
+ if (lock >= dr_lock1 && lock <= dr_lock4)
+ {
+ if ( ! (gamestate.keys & (1 << (lock-dr_lock1) ) ) )
+ {
+ SD_PlaySound (NOWAYSND); // locked
+ return;
+ }
+ }
+
+ switch (doorobjlist[door].action)
+ {
+ case dr_closed:
+ case dr_closing:
+ OpenDoor (door);
+ break;
+ case dr_open:
+ case dr_opening:
+ CloseDoor (door);
+ break;
+ }
+}
+
+
+//===========================================================================
+
+/*
+===============
+=
+= DoorOpen
+=
+= Close the door after three seconds
+=
+===============
+*/
+
+void DoorOpen (int door)
+{
+ if ( (doorobjlist[door].ticcount += tics) >= OPENTICS)
+ CloseDoor (door);
+}
+
+
+
+/*
+===============
+=
+= DoorOpening
+=
+===============
+*/
+
+void DoorOpening (int door)
+{
+ int area1,area2;
+ unsigned far *map;
+ long position;
+
+ position = doorposition[door];
+ if (!position)
+ {
+ //
+ // door is just starting to open, so connect the areas
+ //
+ map = mapsegs[0] + farmapylookup[doorobjlist[door].tiley]
+ +doorobjlist[door].tilex;
+
+ if (doorobjlist[door].vertical)
+ {
+ area1 = *(map+1);
+ area2 = *(map-1);
+ }
+ else
+ {
+ area1 = *(map-mapwidth);
+ area2 = *(map+mapwidth);
+ }
+ area1 -= AREATILE;
+ area2 -= AREATILE;
+ areaconnect[area1][area2]++;
+ areaconnect[area2][area1]++;
+ ConnectAreas ();
+ if (areabyplayer[area1])
+ {
+ PlaySoundLocTile(OPENDOORSND,doorobjlist[door].tilex,doorobjlist[door].tiley); // JAB
+ }
+ }
+
+//
+// slide the door by an adaptive amount
+//
+ position += tics<<10;
+ if (position >= 0xffff)
+ {
+ //
+ // door is all the way open
+ //
+ position = 0xffff;
+ doorobjlist[door].ticcount = 0;
+ doorobjlist[door].action = dr_open;
+ actorat[doorobjlist[door].tilex][doorobjlist[door].tiley] = 0;
+ }
+
+ doorposition[door] = position;
+}
+
+
+/*
+===============
+=
+= DoorClosing
+=
+===============
+*/
+
+void DoorClosing (int door)
+{
+ int area1,area2,move;
+ unsigned far *map;
+ long position;
+ int tilex,tiley;
+
+ tilex = doorobjlist[door].tilex;
+ tiley = doorobjlist[door].tiley;
+
+ if ( ((unsigned)actorat[tilex][tiley] != (door | 0x80))
+ || (player->tilex == tilex && player->tiley == tiley) )
+ { // something got inside the door
+ OpenDoor (door);
+ return;
+ };
+
+ position = doorposition[door];
+
+//
+// slide the door by an adaptive amount
+//
+ position -= tics<<10;
+ if (position <= 0)
+ {
+ //
+ // door is closed all the way, so disconnect the areas
+ //
+ position = 0;
+
+ doorobjlist[door].action = dr_closed;
+
+ map = mapsegs[0] + farmapylookup[doorobjlist[door].tiley]
+ +doorobjlist[door].tilex;
+
+ if (doorobjlist[door].vertical)
+ {
+ area1 = *(map+1);
+ area2 = *(map-1);
+ }
+ else
+ {
+ area1 = *(map-mapwidth);
+ area2 = *(map+mapwidth);
+ }
+ area1 -= AREATILE;
+ area2 -= AREATILE;
+ areaconnect[area1][area2]--;
+ areaconnect[area2][area1]--;
+
+ ConnectAreas ();
+ }
+
+ doorposition[door] = position;
+}
+
+
+
+
+/*
+=====================
+=
+= MoveDoors
+=
+= Called from PlayLoop
+=
+=====================
+*/
+
+void MoveDoors (void)
+{
+ int door;
+
+ if (gamestate.victoryflag) // don't move door during victory sequence
+ return;
+
+ for (door = 0 ; door < doornum ; door++)
+ switch (doorobjlist[door].action)
+ {
+ case dr_open:
+ DoorOpen (door);
+ break;
+
+ case dr_opening:
+ DoorOpening(door);
+ break;
+
+ case dr_closing:
+ DoorClosing(door);
+ break;
+ }
+}
+
+
+/*
+=============================================================================
+
+ PUSHABLE WALLS
+
+=============================================================================
+*/
+
+unsigned pwallstate;
+unsigned pwallpos; // amount a pushable wall has been moved (0-63)
+unsigned pwallx,pwally;
+int pwalldir;
+
+/*
+===============
+=
+= PushWall
+=
+===============
+*/
+
+void PushWall (int checkx, int checky, int dir)
+{
+ int oldtile;
+
+ if (pwallstate)
+ return;
+
+
+ oldtile = tilemap[checkx][checky];
+ if (!oldtile)
+ return;
+
+ switch (dir)
+ {
+ case di_north:
+ if (actorat[checkx][checky-1])
+ {
+ SD_PlaySound (NOWAYSND);
+ return;
+ }
+ (unsigned)actorat[checkx][checky-1] =
+ tilemap[checkx][checky-1] = oldtile;
+ break;
+
+ case di_east:
+ if (actorat[checkx+1][checky])
+ {
+ SD_PlaySound (NOWAYSND);
+ return;
+ }
+ (unsigned)actorat[checkx+1][checky] =
+ tilemap[checkx+1][checky] = oldtile;
+ break;
+
+ case di_south:
+ if (actorat[checkx][checky+1])
+ {
+ SD_PlaySound (NOWAYSND);
+ return;
+ }
+ (unsigned)actorat[checkx][checky+1] =
+ tilemap[checkx][checky+1] = oldtile;
+ break;
+
+ case di_west:
+ if (actorat[checkx-1][checky])
+ {
+ SD_PlaySound (NOWAYSND);
+ return;
+ }
+ (unsigned)actorat[checkx-1][checky] =
+ tilemap[checkx-1][checky] = oldtile;
+ break;
+ }
+
+ gamestate.secretcount++;
+ pwallx = checkx;
+ pwally = checky;
+ pwalldir = dir;
+ pwallstate = 1;
+ pwallpos = 0;
+ tilemap[pwallx][pwally] |= 0xc0;
+ *(mapsegs[1]+farmapylookup[pwally]+pwallx) = 0; // remove P tile info
+
+ SD_PlaySound (PUSHWALLSND);
+}
+
+
+
+/*
+=================
+=
+= MovePWalls
+=
+=================
+*/
+
+void MovePWalls (void)
+{
+ int oldblock,oldtile;
+
+ if (!pwallstate)
+ return;
+
+ oldblock = pwallstate/128;
+
+ pwallstate += tics;
+
+ if (pwallstate/128 != oldblock)
+ {
+ // block crossed into a new block
+ oldtile = tilemap[pwallx][pwally] & 63;
+
+ //
+ // the tile can now be walked into
+ //
+ tilemap[pwallx][pwally] = 0;
+ (unsigned)actorat[pwallx][pwally] = 0;
+ *(mapsegs[0]+farmapylookup[pwally]+pwallx) = player->areanumber+AREATILE;
+
+ //
+ // see if it should be pushed farther
+ //
+ if (pwallstate>256)
+ {
+ //
+ // the block has been pushed two tiles
+ //
+ pwallstate = 0;
+ return;
+ }
+ else
+ {
+ switch (pwalldir)
+ {
+ case di_north:
+ pwally--;
+ if (actorat[pwallx][pwally-1])
+ {
+ pwallstate = 0;
+ return;
+ }
+ (unsigned)actorat[pwallx][pwally-1] =
+ tilemap[pwallx][pwally-1] = oldtile;
+ break;
+
+ case di_east:
+ pwallx++;
+ if (actorat[pwallx+1][pwally])
+ {
+ pwallstate = 0;
+ return;
+ }
+ (unsigned)actorat[pwallx+1][pwally] =
+ tilemap[pwallx+1][pwally] = oldtile;
+ break;
+
+ case di_south:
+ pwally++;
+ if (actorat[pwallx][pwally+1])
+ {
+ pwallstate = 0;
+ return;
+ }
+ (unsigned)actorat[pwallx][pwally+1] =
+ tilemap[pwallx][pwally+1] = oldtile;
+ break;
+
+ case di_west:
+ pwallx--;
+ if (actorat[pwallx-1][pwally])
+ {
+ pwallstate = 0;
+ return;
+ }
+ (unsigned)actorat[pwallx-1][pwally] =
+ tilemap[pwallx-1][pwally] = oldtile;
+ break;
+ }
+
+ tilemap[pwallx][pwally] = oldtile | 0xc0;
+ }
+ }
+
+
+ pwallpos = (pwallstate/2)&63;
+
+}
+
--- /dev/null
+++ b/act2.c
@@ -1,0 +1,3872 @@
+// WL_ACT2.C
+
+#include "WL_DEF.H"
+#pragma hdrstop
+
+/*
+=============================================================================
+
+ LOCAL CONSTANTS
+
+=============================================================================
+*/
+
+#define PROJECTILESIZE 0xc000l
+
+#define BJRUNSPEED 2048
+#define BJJUMPSPEED 680
+
+
+/*
+=============================================================================
+
+ GLOBAL VARIABLES
+
+=============================================================================
+*/
+
+
+
+/*
+=============================================================================
+
+ LOCAL VARIABLES
+
+=============================================================================
+*/
+
+
+dirtype dirtable[9] = {northwest,north,northeast,west,nodir,east,
+ southwest,south,southeast};
+
+int starthitpoints[4][NUMENEMIES] =
+ //
+ // BABY MODE
+ //
+ {
+ {25, // guards
+ 50, // officer
+ 100, // SS
+ 1, // dogs
+ 850, // Hans
+ 850, // Schabbs
+ 200, // fake hitler
+ 800, // mecha hitler
+ 45, // mutants
+ 25, // ghosts
+ 25, // ghosts
+ 25, // ghosts
+ 25, // ghosts
+
+ 850, // Gretel
+ 850, // Gift
+ 850, // Fat
+ 5, // en_spectre,
+ 1450, // en_angel,
+ 850, // en_trans,
+ 1050, // en_uber,
+ 950, // en_will,
+ 1250 // en_death
+ },
+ //
+ // DON'T HURT ME MODE
+ //
+ {25, // guards
+ 50, // officer
+ 100, // SS
+ 1, // dogs
+ 950, // Hans
+ 950, // Schabbs
+ 300, // fake hitler
+ 950, // mecha hitler
+ 55, // mutants
+ 25, // ghosts
+ 25, // ghosts
+ 25, // ghosts
+ 25, // ghosts
+
+ 950, // Gretel
+ 950, // Gift
+ 950, // Fat
+ 10, // en_spectre,
+ 1550, // en_angel,
+ 950, // en_trans,
+ 1150, // en_uber,
+ 1050, // en_will,
+ 1350 // en_death
+ },
+ //
+ // BRING 'EM ON MODE
+ //
+ {25, // guards
+ 50, // officer
+ 100, // SS
+ 1, // dogs
+
+ 1050, // Hans
+ 1550, // Schabbs
+ 400, // fake hitler
+ 1050, // mecha hitler
+
+ 55, // mutants
+ 25, // ghosts
+ 25, // ghosts
+ 25, // ghosts
+ 25, // ghosts
+
+ 1050, // Gretel
+ 1050, // Gift
+ 1050, // Fat
+ 15, // en_spectre,
+ 1650, // en_angel,
+ 1050, // en_trans,
+ 1250, // en_uber,
+ 1150, // en_will,
+ 1450 // en_death
+ },
+ //
+ // DEATH INCARNATE MODE
+ //
+ {25, // guards
+ 50, // officer
+ 100, // SS
+ 1, // dogs
+
+ 1200, // Hans
+ 2400, // Schabbs
+ 500, // fake hitler
+ 1200, // mecha hitler
+
+ 65, // mutants
+ 25, // ghosts
+ 25, // ghosts
+ 25, // ghosts
+ 25, // ghosts
+
+ 1200, // Gretel
+ 1200, // Gift
+ 1200, // Fat
+ 25, // en_spectre,
+ 2000, // en_angel,
+ 1200, // en_trans,
+ 1400, // en_uber,
+ 1300, // en_will,
+ 1600 // en_death
+ }}
+ ;
+
+void A_StartDeathCam (objtype *ob);
+
+
+void T_Path (objtype *ob);
+void T_Shoot (objtype *ob);
+void T_Bite (objtype *ob);
+void T_DogChase (objtype *ob);
+void T_Chase (objtype *ob);
+void T_Projectile (objtype *ob);
+void T_Stand (objtype *ob);
+
+void A_DeathScream (objtype *ob);
+
+extern statetype s_rocket;
+extern statetype s_smoke1;
+extern statetype s_smoke2;
+extern statetype s_smoke3;
+extern statetype s_smoke4;
+extern statetype s_boom2;
+extern statetype s_boom3;
+
+void A_Smoke (objtype *ob);
+
+statetype s_rocket = {true,SPR_ROCKET_1,3,T_Projectile,A_Smoke,&s_rocket};
+statetype s_smoke1 = {false,SPR_SMOKE_1,3,NULL,NULL,&s_smoke2};
+statetype s_smoke2 = {false,SPR_SMOKE_2,3,NULL,NULL,&s_smoke3};
+statetype s_smoke3 = {false,SPR_SMOKE_3,3,NULL,NULL,&s_smoke4};
+statetype s_smoke4 = {false,SPR_SMOKE_4,3,NULL,NULL,NULL};
+
+statetype s_boom1 = {false,SPR_BOOM_1,6,NULL,NULL,&s_boom2};
+statetype s_boom2 = {false,SPR_BOOM_2,6,NULL,NULL,&s_boom3};
+statetype s_boom3 = {false,SPR_BOOM_3,6,NULL,NULL,NULL};
+
+#ifdef SPEAR
+
+extern statetype s_hrocket;
+extern statetype s_hsmoke1;
+extern statetype s_hsmoke2;
+extern statetype s_hsmoke3;
+extern statetype s_hsmoke4;
+extern statetype s_hboom2;
+extern statetype s_hboom3;
+
+void A_Smoke (objtype *ob);
+
+statetype s_hrocket = {true,SPR_HROCKET_1,3,T_Projectile,A_Smoke,&s_hrocket};
+statetype s_hsmoke1 = {false,SPR_HSMOKE_1,3,NULL,NULL,&s_hsmoke2};
+statetype s_hsmoke2 = {false,SPR_HSMOKE_2,3,NULL,NULL,&s_hsmoke3};
+statetype s_hsmoke3 = {false,SPR_HSMOKE_3,3,NULL,NULL,&s_hsmoke4};
+statetype s_hsmoke4 = {false,SPR_HSMOKE_4,3,NULL,NULL,NULL};
+
+statetype s_hboom1 = {false,SPR_HBOOM_1,6,NULL,NULL,&s_hboom2};
+statetype s_hboom2 = {false,SPR_HBOOM_2,6,NULL,NULL,&s_hboom3};
+statetype s_hboom3 = {false,SPR_HBOOM_3,6,NULL,NULL,NULL};
+
+#endif
+
+void T_Schabb (objtype *ob);
+void T_SchabbThrow (objtype *ob);
+void T_Fake (objtype *ob);
+void T_FakeFire (objtype *ob);
+void T_Ghosts (objtype *ob);
+
+void A_Slurpie (objtype *ob);
+void A_HitlerMorph (objtype *ob);
+void A_MechaSound (objtype *ob);
+
+/*
+=================
+=
+= A_Smoke
+=
+=================
+*/
+
+void A_Smoke (objtype *ob)
+{
+ GetNewActor ();
+#ifdef SPEAR
+ if (ob->obclass == hrocketobj)
+ new->state = &s_hsmoke1;
+ else
+#endif
+ new->state = &s_smoke1;
+ new->ticcount = 6;
+
+ new->tilex = ob->tilex;
+ new->tiley = ob->tiley;
+ new->x = ob->x;
+ new->y = ob->y;
+ new->obclass = inertobj;
+ new->active = true;
+
+ new->flags = FL_NEVERMARK;
+}
+
+
+/*
+===================
+=
+= ProjectileTryMove
+=
+= returns true if move ok
+===================
+*/
+
+#define PROJSIZE 0x2000
+
+boolean ProjectileTryMove (objtype *ob)
+{
+ int xl,yl,xh,yh,x,y;
+ objtype *check;
+ long deltax,deltay;
+
+ xl = (ob->x-PROJSIZE) >>TILESHIFT;
+ yl = (ob->y-PROJSIZE) >>TILESHIFT;
+
+ xh = (ob->x+PROJSIZE) >>TILESHIFT;
+ yh = (ob->y+PROJSIZE) >>TILESHIFT;
+
+//
+// check for solid walls
+//
+ for (y=yl;y<=yh;y++)
+ for (x=xl;x<=xh;x++)
+ {
+ check = actorat[x][y];
+ if (check && check<objlist)
+ return false;
+ }
+
+ return true;
+}
+
+
+
+/*
+=================
+=
+= T_Projectile
+=
+=================
+*/
+
+void T_Projectile (objtype *ob)
+{
+ long deltax,deltay;
+ int damage;
+ long speed;
+
+ speed = (long)ob->speed*tics;
+
+ deltax = FixedByFrac(speed,costable[ob->angle]);
+ deltay = -FixedByFrac(speed,sintable[ob->angle]);
+
+ if (deltax>0x10000l)
+ deltax = 0x10000l;
+ if (deltay>0x10000l)
+ deltay = 0x10000l;
+
+ ob->x += deltax;
+ ob->y += deltay;
+
+ deltax = LABS(ob->x - player->x);
+ deltay = LABS(ob->y - player->y);
+
+ if (!ProjectileTryMove (ob))
+ {
+ if (ob->obclass == rocketobj)
+ {
+ PlaySoundLocActor(MISSILEHITSND,ob);
+ ob->state = &s_boom1;
+ }
+#ifdef SPEAR
+ else if (ob->obclass == hrocketobj)
+ {
+ PlaySoundLocActor(MISSILEHITSND,ob);
+ ob->state = &s_hboom1;
+ }
+#endif
+ else
+ ob->state = NULL; // mark for removal
+
+ return;
+ }
+
+ if (deltax < PROJECTILESIZE && deltay < PROJECTILESIZE)
+ { // hit the player
+ switch (ob->obclass)
+ {
+ case needleobj:
+ damage = (US_RndT() >>3) + 20;
+ break;
+ case rocketobj:
+ case hrocketobj:
+ case sparkobj:
+ damage = (US_RndT() >>3) + 30;
+ break;
+ case fireobj:
+ damage = (US_RndT() >>3);
+ break;
+ }
+
+ TakeDamage (damage,ob);
+ ob->state = NULL; // mark for removal
+ return;
+ }
+
+ ob->tilex = ob->x >> TILESHIFT;
+ ob->tiley = ob->y >> TILESHIFT;
+
+}
+
+
+
+
+/*
+=============================================================================
+
+ GUARD
+
+=============================================================================
+*/
+
+//
+// guards
+//
+
+extern statetype s_grdstand;
+
+extern statetype s_grdpath1;
+extern statetype s_grdpath1s;
+extern statetype s_grdpath2;
+extern statetype s_grdpath3;
+extern statetype s_grdpath3s;
+extern statetype s_grdpath4;
+
+extern statetype s_grdpain;
+extern statetype s_grdpain1;
+
+extern statetype s_grdgiveup;
+
+extern statetype s_grdshoot1;
+extern statetype s_grdshoot2;
+extern statetype s_grdshoot3;
+extern statetype s_grdshoot4;
+
+extern statetype s_grdchase1;
+extern statetype s_grdchase1s;
+extern statetype s_grdchase2;
+extern statetype s_grdchase3;
+extern statetype s_grdchase3s;
+extern statetype s_grdchase4;
+
+extern statetype s_grddie1;
+extern statetype s_grddie1d;
+extern statetype s_grddie2;
+extern statetype s_grddie3;
+extern statetype s_grddie4;
+
+statetype s_grdstand = {true,SPR_GRD_S_1,0,T_Stand,NULL,&s_grdstand};
+
+statetype s_grdpath1 = {true,SPR_GRD_W1_1,20,T_Path,NULL,&s_grdpath1s};
+statetype s_grdpath1s = {true,SPR_GRD_W1_1,5,NULL,NULL,&s_grdpath2};
+statetype s_grdpath2 = {true,SPR_GRD_W2_1,15,T_Path,NULL,&s_grdpath3};
+statetype s_grdpath3 = {true,SPR_GRD_W3_1,20,T_Path,NULL,&s_grdpath3s};
+statetype s_grdpath3s = {true,SPR_GRD_W3_1,5,NULL,NULL,&s_grdpath4};
+statetype s_grdpath4 = {true,SPR_GRD_W4_1,15,T_Path,NULL,&s_grdpath1};
+
+statetype s_grdpain = {2,SPR_GRD_PAIN_1,10,NULL,NULL,&s_grdchase1};
+statetype s_grdpain1 = {2,SPR_GRD_PAIN_2,10,NULL,NULL,&s_grdchase1};
+
+statetype s_grdshoot1 = {false,SPR_GRD_SHOOT1,20,NULL,NULL,&s_grdshoot2};
+statetype s_grdshoot2 = {false,SPR_GRD_SHOOT2,20,NULL,T_Shoot,&s_grdshoot3};
+statetype s_grdshoot3 = {false,SPR_GRD_SHOOT3,20,NULL,NULL,&s_grdchase1};
+
+statetype s_grdchase1 = {true,SPR_GRD_W1_1,10,T_Chase,NULL,&s_grdchase1s};
+statetype s_grdchase1s = {true,SPR_GRD_W1_1,3,NULL,NULL,&s_grdchase2};
+statetype s_grdchase2 = {true,SPR_GRD_W2_1,8,T_Chase,NULL,&s_grdchase3};
+statetype s_grdchase3 = {true,SPR_GRD_W3_1,10,T_Chase,NULL,&s_grdchase3s};
+statetype s_grdchase3s = {true,SPR_GRD_W3_1,3,NULL,NULL,&s_grdchase4};
+statetype s_grdchase4 = {true,SPR_GRD_W4_1,8,T_Chase,NULL,&s_grdchase1};
+
+statetype s_grddie1 = {false,SPR_GRD_DIE_1,15,NULL,A_DeathScream,&s_grddie2};
+statetype s_grddie2 = {false,SPR_GRD_DIE_2,15,NULL,NULL,&s_grddie3};
+statetype s_grddie3 = {false,SPR_GRD_DIE_3,15,NULL,NULL,&s_grddie4};
+statetype s_grddie4 = {false,SPR_GRD_DEAD,0,NULL,NULL,&s_grddie4};
+
+
+#ifndef SPEAR
+//
+// ghosts
+//
+extern statetype s_blinkychase1;
+extern statetype s_blinkychase2;
+extern statetype s_inkychase1;
+extern statetype s_inkychase2;
+extern statetype s_pinkychase1;
+extern statetype s_pinkychase2;
+extern statetype s_clydechase1;
+extern statetype s_clydechase2;
+
+statetype s_blinkychase1 = {false,SPR_BLINKY_W1,10,T_Ghosts,NULL,&s_blinkychase2};
+statetype s_blinkychase2 = {false,SPR_BLINKY_W2,10,T_Ghosts,NULL,&s_blinkychase1};
+
+statetype s_inkychase1 = {false,SPR_INKY_W1,10,T_Ghosts,NULL,&s_inkychase2};
+statetype s_inkychase2 = {false,SPR_INKY_W2,10,T_Ghosts,NULL,&s_inkychase1};
+
+statetype s_pinkychase1 = {false,SPR_PINKY_W1,10,T_Ghosts,NULL,&s_pinkychase2};
+statetype s_pinkychase2 = {false,SPR_PINKY_W2,10,T_Ghosts,NULL,&s_pinkychase1};
+
+statetype s_clydechase1 = {false,SPR_CLYDE_W1,10,T_Ghosts,NULL,&s_clydechase2};
+statetype s_clydechase2 = {false,SPR_CLYDE_W2,10,T_Ghosts,NULL,&s_clydechase1};
+#endif
+
+//
+// dogs
+//
+
+extern statetype s_dogpath1;
+extern statetype s_dogpath1s;
+extern statetype s_dogpath2;
+extern statetype s_dogpath3;
+extern statetype s_dogpath3s;
+extern statetype s_dogpath4;
+
+extern statetype s_dogjump1;
+extern statetype s_dogjump2;
+extern statetype s_dogjump3;
+extern statetype s_dogjump4;
+extern statetype s_dogjump5;
+
+extern statetype s_dogchase1;
+extern statetype s_dogchase1s;
+extern statetype s_dogchase2;
+extern statetype s_dogchase3;
+extern statetype s_dogchase3s;
+extern statetype s_dogchase4;
+
+extern statetype s_dogdie1;
+extern statetype s_dogdie1d;
+extern statetype s_dogdie2;
+extern statetype s_dogdie3;
+extern statetype s_dogdead;
+
+statetype s_dogpath1 = {true,SPR_DOG_W1_1,20,T_Path,NULL,&s_dogpath1s};
+statetype s_dogpath1s = {true,SPR_DOG_W1_1,5,NULL,NULL,&s_dogpath2};
+statetype s_dogpath2 = {true,SPR_DOG_W2_1,15,T_Path,NULL,&s_dogpath3};
+statetype s_dogpath3 = {true,SPR_DOG_W3_1,20,T_Path,NULL,&s_dogpath3s};
+statetype s_dogpath3s = {true,SPR_DOG_W3_1,5,NULL,NULL,&s_dogpath4};
+statetype s_dogpath4 = {true,SPR_DOG_W4_1,15,T_Path,NULL,&s_dogpath1};
+
+statetype s_dogjump1 = {false,SPR_DOG_JUMP1,10,NULL,NULL,&s_dogjump2};
+statetype s_dogjump2 = {false,SPR_DOG_JUMP2,10,NULL,T_Bite,&s_dogjump3};
+statetype s_dogjump3 = {false,SPR_DOG_JUMP3,10,NULL,NULL,&s_dogjump4};
+statetype s_dogjump4 = {false,SPR_DOG_JUMP1,10,NULL,NULL,&s_dogjump5};
+statetype s_dogjump5 = {false,SPR_DOG_W1_1,10,NULL,NULL,&s_dogchase1};
+
+statetype s_dogchase1 = {true,SPR_DOG_W1_1,10,T_DogChase,NULL,&s_dogchase1s};
+statetype s_dogchase1s = {true,SPR_DOG_W1_1,3,NULL,NULL,&s_dogchase2};
+statetype s_dogchase2 = {true,SPR_DOG_W2_1,8,T_DogChase,NULL,&s_dogchase3};
+statetype s_dogchase3 = {true,SPR_DOG_W3_1,10,T_DogChase,NULL,&s_dogchase3s};
+statetype s_dogchase3s = {true,SPR_DOG_W3_1,3,NULL,NULL,&s_dogchase4};
+statetype s_dogchase4 = {true,SPR_DOG_W4_1,8,T_DogChase,NULL,&s_dogchase1};
+
+statetype s_dogdie1 = {false,SPR_DOG_DIE_1,15,NULL,A_DeathScream,&s_dogdie2};
+statetype s_dogdie2 = {false,SPR_DOG_DIE_2,15,NULL,NULL,&s_dogdie3};
+statetype s_dogdie3 = {false,SPR_DOG_DIE_3,15,NULL,NULL,&s_dogdead};
+statetype s_dogdead = {false,SPR_DOG_DEAD,15,NULL,NULL,&s_dogdead};
+
+
+//
+// officers
+//
+
+extern statetype s_ofcstand;
+
+extern statetype s_ofcpath1;
+extern statetype s_ofcpath1s;
+extern statetype s_ofcpath2;
+extern statetype s_ofcpath3;
+extern statetype s_ofcpath3s;
+extern statetype s_ofcpath4;
+
+extern statetype s_ofcpain;
+extern statetype s_ofcpain1;
+
+extern statetype s_ofcgiveup;
+
+extern statetype s_ofcshoot1;
+extern statetype s_ofcshoot2;
+extern statetype s_ofcshoot3;
+extern statetype s_ofcshoot4;
+
+extern statetype s_ofcchase1;
+extern statetype s_ofcchase1s;
+extern statetype s_ofcchase2;
+extern statetype s_ofcchase3;
+extern statetype s_ofcchase3s;
+extern statetype s_ofcchase4;
+
+extern statetype s_ofcdie1;
+extern statetype s_ofcdie2;
+extern statetype s_ofcdie3;
+extern statetype s_ofcdie4;
+extern statetype s_ofcdie5;
+
+statetype s_ofcstand = {true,SPR_OFC_S_1,0,T_Stand,NULL,&s_ofcstand};
+
+statetype s_ofcpath1 = {true,SPR_OFC_W1_1,20,T_Path,NULL,&s_ofcpath1s};
+statetype s_ofcpath1s = {true,SPR_OFC_W1_1,5,NULL,NULL,&s_ofcpath2};
+statetype s_ofcpath2 = {true,SPR_OFC_W2_1,15,T_Path,NULL,&s_ofcpath3};
+statetype s_ofcpath3 = {true,SPR_OFC_W3_1,20,T_Path,NULL,&s_ofcpath3s};
+statetype s_ofcpath3s = {true,SPR_OFC_W3_1,5,NULL,NULL,&s_ofcpath4};
+statetype s_ofcpath4 = {true,SPR_OFC_W4_1,15,T_Path,NULL,&s_ofcpath1};
+
+statetype s_ofcpain = {2,SPR_OFC_PAIN_1,10,NULL,NULL,&s_ofcchase1};
+statetype s_ofcpain1 = {2,SPR_OFC_PAIN_2,10,NULL,NULL,&s_ofcchase1};
+
+statetype s_ofcshoot1 = {false,SPR_OFC_SHOOT1,6,NULL,NULL,&s_ofcshoot2};
+statetype s_ofcshoot2 = {false,SPR_OFC_SHOOT2,20,NULL,T_Shoot,&s_ofcshoot3};
+statetype s_ofcshoot3 = {false,SPR_OFC_SHOOT3,10,NULL,NULL,&s_ofcchase1};
+
+statetype s_ofcchase1 = {true,SPR_OFC_W1_1,10,T_Chase,NULL,&s_ofcchase1s};
+statetype s_ofcchase1s = {true,SPR_OFC_W1_1,3,NULL,NULL,&s_ofcchase2};
+statetype s_ofcchase2 = {true,SPR_OFC_W2_1,8,T_Chase,NULL,&s_ofcchase3};
+statetype s_ofcchase3 = {true,SPR_OFC_W3_1,10,T_Chase,NULL,&s_ofcchase3s};
+statetype s_ofcchase3s = {true,SPR_OFC_W3_1,3,NULL,NULL,&s_ofcchase4};
+statetype s_ofcchase4 = {true,SPR_OFC_W4_1,8,T_Chase,NULL,&s_ofcchase1};
+
+statetype s_ofcdie1 = {false,SPR_OFC_DIE_1,11,NULL,A_DeathScream,&s_ofcdie2};
+statetype s_ofcdie2 = {false,SPR_OFC_DIE_2,11,NULL,NULL,&s_ofcdie3};
+statetype s_ofcdie3 = {false,SPR_OFC_DIE_3,11,NULL,NULL,&s_ofcdie4};
+statetype s_ofcdie4 = {false,SPR_OFC_DIE_4,11,NULL,NULL,&s_ofcdie5};
+statetype s_ofcdie5 = {false,SPR_OFC_DEAD,0,NULL,NULL,&s_ofcdie5};
+
+
+//
+// mutant
+//
+
+extern statetype s_mutstand;
+
+extern statetype s_mutpath1;
+extern statetype s_mutpath1s;
+extern statetype s_mutpath2;
+extern statetype s_mutpath3;
+extern statetype s_mutpath3s;
+extern statetype s_mutpath4;
+
+extern statetype s_mutpain;
+extern statetype s_mutpain1;
+
+extern statetype s_mutgiveup;
+
+extern statetype s_mutshoot1;
+extern statetype s_mutshoot2;
+extern statetype s_mutshoot3;
+extern statetype s_mutshoot4;
+
+extern statetype s_mutchase1;
+extern statetype s_mutchase1s;
+extern statetype s_mutchase2;
+extern statetype s_mutchase3;
+extern statetype s_mutchase3s;
+extern statetype s_mutchase4;
+
+extern statetype s_mutdie1;
+extern statetype s_mutdie2;
+extern statetype s_mutdie3;
+extern statetype s_mutdie4;
+extern statetype s_mutdie5;
+
+statetype s_mutstand = {true,SPR_MUT_S_1,0,T_Stand,NULL,&s_mutstand};
+
+statetype s_mutpath1 = {true,SPR_MUT_W1_1,20,T_Path,NULL,&s_mutpath1s};
+statetype s_mutpath1s = {true,SPR_MUT_W1_1,5,NULL,NULL,&s_mutpath2};
+statetype s_mutpath2 = {true,SPR_MUT_W2_1,15,T_Path,NULL,&s_mutpath3};
+statetype s_mutpath3 = {true,SPR_MUT_W3_1,20,T_Path,NULL,&s_mutpath3s};
+statetype s_mutpath3s = {true,SPR_MUT_W3_1,5,NULL,NULL,&s_mutpath4};
+statetype s_mutpath4 = {true,SPR_MUT_W4_1,15,T_Path,NULL,&s_mutpath1};
+
+statetype s_mutpain = {2,SPR_MUT_PAIN_1,10,NULL,NULL,&s_mutchase1};
+statetype s_mutpain1 = {2,SPR_MUT_PAIN_2,10,NULL,NULL,&s_mutchase1};
+
+statetype s_mutshoot1 = {false,SPR_MUT_SHOOT1,6,NULL,T_Shoot,&s_mutshoot2};
+statetype s_mutshoot2 = {false,SPR_MUT_SHOOT2,20,NULL,NULL,&s_mutshoot3};
+statetype s_mutshoot3 = {false,SPR_MUT_SHOOT3,10,NULL,T_Shoot,&s_mutshoot4};
+statetype s_mutshoot4 = {false,SPR_MUT_SHOOT4,20,NULL,NULL,&s_mutchase1};
+
+statetype s_mutchase1 = {true,SPR_MUT_W1_1,10,T_Chase,NULL,&s_mutchase1s};
+statetype s_mutchase1s = {true,SPR_MUT_W1_1,3,NULL,NULL,&s_mutchase2};
+statetype s_mutchase2 = {true,SPR_MUT_W2_1,8,T_Chase,NULL,&s_mutchase3};
+statetype s_mutchase3 = {true,SPR_MUT_W3_1,10,T_Chase,NULL,&s_mutchase3s};
+statetype s_mutchase3s = {true,SPR_MUT_W3_1,3,NULL,NULL,&s_mutchase4};
+statetype s_mutchase4 = {true,SPR_MUT_W4_1,8,T_Chase,NULL,&s_mutchase1};
+
+statetype s_mutdie1 = {false,SPR_MUT_DIE_1,7,NULL,A_DeathScream,&s_mutdie2};
+statetype s_mutdie2 = {false,SPR_MUT_DIE_2,7,NULL,NULL,&s_mutdie3};
+statetype s_mutdie3 = {false,SPR_MUT_DIE_3,7,NULL,NULL,&s_mutdie4};
+statetype s_mutdie4 = {false,SPR_MUT_DIE_4,7,NULL,NULL,&s_mutdie5};
+statetype s_mutdie5 = {false,SPR_MUT_DEAD,0,NULL,NULL,&s_mutdie5};
+
+
+//
+// SS
+//
+
+extern statetype s_ssstand;
+
+extern statetype s_sspath1;
+extern statetype s_sspath1s;
+extern statetype s_sspath2;
+extern statetype s_sspath3;
+extern statetype s_sspath3s;
+extern statetype s_sspath4;
+
+extern statetype s_sspain;
+extern statetype s_sspain1;
+
+extern statetype s_ssshoot1;
+extern statetype s_ssshoot2;
+extern statetype s_ssshoot3;
+extern statetype s_ssshoot4;
+extern statetype s_ssshoot5;
+extern statetype s_ssshoot6;
+extern statetype s_ssshoot7;
+extern statetype s_ssshoot8;
+extern statetype s_ssshoot9;
+
+extern statetype s_sschase1;
+extern statetype s_sschase1s;
+extern statetype s_sschase2;
+extern statetype s_sschase3;
+extern statetype s_sschase3s;
+extern statetype s_sschase4;
+
+extern statetype s_ssdie1;
+extern statetype s_ssdie2;
+extern statetype s_ssdie3;
+extern statetype s_ssdie4;
+
+statetype s_ssstand = {true,SPR_SS_S_1,0,T_Stand,NULL,&s_ssstand};
+
+statetype s_sspath1 = {true,SPR_SS_W1_1,20,T_Path,NULL,&s_sspath1s};
+statetype s_sspath1s = {true,SPR_SS_W1_1,5,NULL,NULL,&s_sspath2};
+statetype s_sspath2 = {true,SPR_SS_W2_1,15,T_Path,NULL,&s_sspath3};
+statetype s_sspath3 = {true,SPR_SS_W3_1,20,T_Path,NULL,&s_sspath3s};
+statetype s_sspath3s = {true,SPR_SS_W3_1,5,NULL,NULL,&s_sspath4};
+statetype s_sspath4 = {true,SPR_SS_W4_1,15,T_Path,NULL,&s_sspath1};
+
+statetype s_sspain = {2,SPR_SS_PAIN_1,10,NULL,NULL,&s_sschase1};
+statetype s_sspain1 = {2,SPR_SS_PAIN_2,10,NULL,NULL,&s_sschase1};
+
+statetype s_ssshoot1 = {false,SPR_SS_SHOOT1,20,NULL,NULL,&s_ssshoot2};
+statetype s_ssshoot2 = {false,SPR_SS_SHOOT2,20,NULL,T_Shoot,&s_ssshoot3};
+statetype s_ssshoot3 = {false,SPR_SS_SHOOT3,10,NULL,NULL,&s_ssshoot4};
+statetype s_ssshoot4 = {false,SPR_SS_SHOOT2,10,NULL,T_Shoot,&s_ssshoot5};
+statetype s_ssshoot5 = {false,SPR_SS_SHOOT3,10,NULL,NULL,&s_ssshoot6};
+statetype s_ssshoot6 = {false,SPR_SS_SHOOT2,10,NULL,T_Shoot,&s_ssshoot7};
+statetype s_ssshoot7 = {false,SPR_SS_SHOOT3,10,NULL,NULL,&s_ssshoot8};
+statetype s_ssshoot8 = {false,SPR_SS_SHOOT2,10,NULL,T_Shoot,&s_ssshoot9};
+statetype s_ssshoot9 = {false,SPR_SS_SHOOT3,10,NULL,NULL,&s_sschase1};
+
+statetype s_sschase1 = {true,SPR_SS_W1_1,10,T_Chase,NULL,&s_sschase1s};
+statetype s_sschase1s = {true,SPR_SS_W1_1,3,NULL,NULL,&s_sschase2};
+statetype s_sschase2 = {true,SPR_SS_W2_1,8,T_Chase,NULL,&s_sschase3};
+statetype s_sschase3 = {true,SPR_SS_W3_1,10,T_Chase,NULL,&s_sschase3s};
+statetype s_sschase3s = {true,SPR_SS_W3_1,3,NULL,NULL,&s_sschase4};
+statetype s_sschase4 = {true,SPR_SS_W4_1,8,T_Chase,NULL,&s_sschase1};
+
+statetype s_ssdie1 = {false,SPR_SS_DIE_1,15,NULL,A_DeathScream,&s_ssdie2};
+statetype s_ssdie2 = {false,SPR_SS_DIE_2,15,NULL,NULL,&s_ssdie3};
+statetype s_ssdie3 = {false,SPR_SS_DIE_3,15,NULL,NULL,&s_ssdie4};
+statetype s_ssdie4 = {false,SPR_SS_DEAD,0,NULL,NULL,&s_ssdie4};
+
+
+#ifndef SPEAR
+//
+// hans
+//
+extern statetype s_bossstand;
+
+extern statetype s_bosschase1;
+extern statetype s_bosschase1s;
+extern statetype s_bosschase2;
+extern statetype s_bosschase3;
+extern statetype s_bosschase3s;
+extern statetype s_bosschase4;
+
+extern statetype s_bossdie1;
+extern statetype s_bossdie2;
+extern statetype s_bossdie3;
+extern statetype s_bossdie4;
+
+extern statetype s_bossshoot1;
+extern statetype s_bossshoot2;
+extern statetype s_bossshoot3;
+extern statetype s_bossshoot4;
+extern statetype s_bossshoot5;
+extern statetype s_bossshoot6;
+extern statetype s_bossshoot7;
+extern statetype s_bossshoot8;
+
+
+statetype s_bossstand = {false,SPR_BOSS_W1,0,T_Stand,NULL,&s_bossstand};
+
+statetype s_bosschase1 = {false,SPR_BOSS_W1,10,T_Chase,NULL,&s_bosschase1s};
+statetype s_bosschase1s = {false,SPR_BOSS_W1,3,NULL,NULL,&s_bosschase2};
+statetype s_bosschase2 = {false,SPR_BOSS_W2,8,T_Chase,NULL,&s_bosschase3};
+statetype s_bosschase3 = {false,SPR_BOSS_W3,10,T_Chase,NULL,&s_bosschase3s};
+statetype s_bosschase3s = {false,SPR_BOSS_W3,3,NULL,NULL,&s_bosschase4};
+statetype s_bosschase4 = {false,SPR_BOSS_W4,8,T_Chase,NULL,&s_bosschase1};
+
+statetype s_bossdie1 = {false,SPR_BOSS_DIE1,15,NULL,A_DeathScream,&s_bossdie2};
+statetype s_bossdie2 = {false,SPR_BOSS_DIE2,15,NULL,NULL,&s_bossdie3};
+statetype s_bossdie3 = {false,SPR_BOSS_DIE3,15,NULL,NULL,&s_bossdie4};
+statetype s_bossdie4 = {false,SPR_BOSS_DEAD,0,NULL,NULL,&s_bossdie4};
+
+statetype s_bossshoot1 = {false,SPR_BOSS_SHOOT1,30,NULL,NULL,&s_bossshoot2};
+statetype s_bossshoot2 = {false,SPR_BOSS_SHOOT2,10,NULL,T_Shoot,&s_bossshoot3};
+statetype s_bossshoot3 = {false,SPR_BOSS_SHOOT3,10,NULL,T_Shoot,&s_bossshoot4};
+statetype s_bossshoot4 = {false,SPR_BOSS_SHOOT2,10,NULL,T_Shoot,&s_bossshoot5};
+statetype s_bossshoot5 = {false,SPR_BOSS_SHOOT3,10,NULL,T_Shoot,&s_bossshoot6};
+statetype s_bossshoot6 = {false,SPR_BOSS_SHOOT2,10,NULL,T_Shoot,&s_bossshoot7};
+statetype s_bossshoot7 = {false,SPR_BOSS_SHOOT3,10,NULL,T_Shoot,&s_bossshoot8};
+statetype s_bossshoot8 = {false,SPR_BOSS_SHOOT1,10,NULL,NULL,&s_bosschase1};
+
+
+//
+// gretel
+//
+extern statetype s_gretelstand;
+
+extern statetype s_gretelchase1;
+extern statetype s_gretelchase1s;
+extern statetype s_gretelchase2;
+extern statetype s_gretelchase3;
+extern statetype s_gretelchase3s;
+extern statetype s_gretelchase4;
+
+extern statetype s_greteldie1;
+extern statetype s_greteldie2;
+extern statetype s_greteldie3;
+extern statetype s_greteldie4;
+
+extern statetype s_gretelshoot1;
+extern statetype s_gretelshoot2;
+extern statetype s_gretelshoot3;
+extern statetype s_gretelshoot4;
+extern statetype s_gretelshoot5;
+extern statetype s_gretelshoot6;
+extern statetype s_gretelshoot7;
+extern statetype s_gretelshoot8;
+
+
+statetype s_gretelstand = {false,SPR_GRETEL_W1,0,T_Stand,NULL,&s_gretelstand};
+
+statetype s_gretelchase1 = {false,SPR_GRETEL_W1,10,T_Chase,NULL,&s_gretelchase1s};
+statetype s_gretelchase1s = {false,SPR_GRETEL_W1,3,NULL,NULL,&s_gretelchase2};
+statetype s_gretelchase2 = {false,SPR_GRETEL_W2,8,T_Chase,NULL,&s_gretelchase3};
+statetype s_gretelchase3 = {false,SPR_GRETEL_W3,10,T_Chase,NULL,&s_gretelchase3s};
+statetype s_gretelchase3s = {false,SPR_GRETEL_W3,3,NULL,NULL,&s_gretelchase4};
+statetype s_gretelchase4 = {false,SPR_GRETEL_W4,8,T_Chase,NULL,&s_gretelchase1};
+
+statetype s_greteldie1 = {false,SPR_GRETEL_DIE1,15,NULL,A_DeathScream,&s_greteldie2};
+statetype s_greteldie2 = {false,SPR_GRETEL_DIE2,15,NULL,NULL,&s_greteldie3};
+statetype s_greteldie3 = {false,SPR_GRETEL_DIE3,15,NULL,NULL,&s_greteldie4};
+statetype s_greteldie4 = {false,SPR_GRETEL_DEAD,0,NULL,NULL,&s_greteldie4};
+
+statetype s_gretelshoot1 = {false,SPR_GRETEL_SHOOT1,30,NULL,NULL,&s_gretelshoot2};
+statetype s_gretelshoot2 = {false,SPR_GRETEL_SHOOT2,10,NULL,T_Shoot,&s_gretelshoot3};
+statetype s_gretelshoot3 = {false,SPR_GRETEL_SHOOT3,10,NULL,T_Shoot,&s_gretelshoot4};
+statetype s_gretelshoot4 = {false,SPR_GRETEL_SHOOT2,10,NULL,T_Shoot,&s_gretelshoot5};
+statetype s_gretelshoot5 = {false,SPR_GRETEL_SHOOT3,10,NULL,T_Shoot,&s_gretelshoot6};
+statetype s_gretelshoot6 = {false,SPR_GRETEL_SHOOT2,10,NULL,T_Shoot,&s_gretelshoot7};
+statetype s_gretelshoot7 = {false,SPR_GRETEL_SHOOT3,10,NULL,T_Shoot,&s_gretelshoot8};
+statetype s_gretelshoot8 = {false,SPR_GRETEL_SHOOT1,10,NULL,NULL,&s_gretelchase1};
+#endif
+
+
+/*
+===============
+=
+= SpawnStand
+=
+===============
+*/
+
+void SpawnStand (enemy_t which, int tilex, int tiley, int dir)
+{
+ unsigned far *map,tile;
+
+ switch (which)
+ {
+ case en_guard:
+ SpawnNewObj (tilex,tiley,&s_grdstand);
+ new->speed = SPDPATROL;
+ if (!loadedgame)
+ gamestate.killtotal++;
+ break;
+
+ case en_officer:
+ SpawnNewObj (tilex,tiley,&s_ofcstand);
+ new->speed = SPDPATROL;
+ if (!loadedgame)
+ gamestate.killtotal++;
+ break;
+
+ case en_mutant:
+ SpawnNewObj (tilex,tiley,&s_mutstand);
+ new->speed = SPDPATROL;
+ if (!loadedgame)
+ gamestate.killtotal++;
+ break;
+
+ case en_ss:
+ SpawnNewObj (tilex,tiley,&s_ssstand);
+ new->speed = SPDPATROL;
+ if (!loadedgame)
+ gamestate.killtotal++;
+ break;
+ }
+
+
+ map = mapsegs[0]+farmapylookup[tiley]+tilex;
+ if (*map == AMBUSHTILE)
+ {
+ tilemap[tilex][tiley] = 0;
+
+ if (*(map+1) >= AREATILE)
+ tile = *(map+1);
+ if (*(map-mapwidth) >= AREATILE)
+ tile = *(map-mapwidth);
+ if (*(map+mapwidth) >= AREATILE)
+ tile = *(map+mapwidth);
+ if ( *(map-1) >= AREATILE)
+ tile = *(map-1);
+
+ *map = tile;
+ new->areanumber = tile-AREATILE;
+
+ new->flags |= FL_AMBUSH;
+ }
+
+ new->obclass = guardobj+which;
+ new->hitpoints = starthitpoints[gamestate.difficulty][which];
+ new->dir = dir*2;
+ new->flags |= FL_SHOOTABLE;
+}
+
+
+
+/*
+===============
+=
+= SpawnDeadGuard
+=
+===============
+*/
+
+void SpawnDeadGuard (int tilex, int tiley)
+{
+ SpawnNewObj (tilex,tiley,&s_grddie4);
+ new->obclass = inertobj;
+}
+
+
+
+#ifndef SPEAR
+/*
+===============
+=
+= SpawnBoss
+=
+===============
+*/
+
+void SpawnBoss (int tilex, int tiley)
+{
+ unsigned far *map,tile;
+
+ SpawnNewObj (tilex,tiley,&s_bossstand);
+ new->speed = SPDPATROL;
+
+ new->obclass = bossobj;
+ new->hitpoints = starthitpoints[gamestate.difficulty][en_boss];
+ new->dir = south;
+ new->flags |= FL_SHOOTABLE|FL_AMBUSH;
+ if (!loadedgame)
+ gamestate.killtotal++;
+}
+
+/*
+===============
+=
+= SpawnGretel
+=
+===============
+*/
+
+void SpawnGretel (int tilex, int tiley)
+{
+ unsigned far *map,tile;
+
+ SpawnNewObj (tilex,tiley,&s_gretelstand);
+ new->speed = SPDPATROL;
+
+ new->obclass = gretelobj;
+ new->hitpoints = starthitpoints[gamestate.difficulty][en_gretel];
+ new->dir = north;
+ new->flags |= FL_SHOOTABLE|FL_AMBUSH;
+ if (!loadedgame)
+ gamestate.killtotal++;
+}
+#endif
+
+/*
+===============
+=
+= SpawnPatrol
+=
+===============
+*/
+
+void SpawnPatrol (enemy_t which, int tilex, int tiley, int dir)
+{
+ switch (which)
+ {
+ case en_guard:
+ SpawnNewObj (tilex,tiley,&s_grdpath1);
+ new->speed = SPDPATROL;
+ if (!loadedgame)
+ gamestate.killtotal++;
+ break;
+
+ case en_officer:
+ SpawnNewObj (tilex,tiley,&s_ofcpath1);
+ new->speed = SPDPATROL;
+ if (!loadedgame)
+ gamestate.killtotal++;
+ break;
+
+ case en_ss:
+ SpawnNewObj (tilex,tiley,&s_sspath1);
+ new->speed = SPDPATROL;
+ if (!loadedgame)
+ gamestate.killtotal++;
+ break;
+
+ case en_mutant:
+ SpawnNewObj (tilex,tiley,&s_mutpath1);
+ new->speed = SPDPATROL;
+ if (!loadedgame)
+ gamestate.killtotal++;
+ break;
+
+ case en_dog:
+ SpawnNewObj (tilex,tiley,&s_dogpath1);
+ new->speed = SPDDOG;
+ if (!loadedgame)
+ gamestate.killtotal++;
+ break;
+ }
+
+ new->obclass = guardobj+which;
+ new->dir = dir*2;
+ new->hitpoints = starthitpoints[gamestate.difficulty][which];
+ new->distance = tileglobal;
+ new->flags |= FL_SHOOTABLE;
+ new->active = true;
+
+ actorat[new->tilex][new->tiley] = NULL; // don't use original spot
+
+ switch (dir)
+ {
+ case 0:
+ new->tilex++;
+ break;
+ case 1:
+ new->tiley--;
+ break;
+ case 2:
+ new->tilex--;
+ break;
+ case 3:
+ new->tiley++;
+ break;
+ }
+
+ actorat[new->tilex][new->tiley] = new;
+}
+
+
+
+/*
+==================
+=
+= A_DeathScream
+=
+==================
+*/
+
+void A_DeathScream (objtype *ob)
+{
+#ifndef UPLOAD
+#ifndef SPEAR
+ if (mapon==9 && !US_RndT())
+#else
+ if ((mapon==18 || mapon==19) && !US_RndT())
+#endif
+ {
+ switch(ob->obclass)
+ {
+ case mutantobj:
+ case guardobj:
+ case officerobj:
+ case ssobj:
+ case dogobj:
+ PlaySoundLocActor(DEATHSCREAM6SND,ob);
+ return;
+ }
+ }
+#endif
+
+ switch (ob->obclass)
+ {
+ case mutantobj:
+ PlaySoundLocActor(AHHHGSND,ob);
+ break;
+
+ case guardobj:
+ {
+ int sounds[9]={ DEATHSCREAM1SND,
+ DEATHSCREAM2SND,
+ DEATHSCREAM3SND,
+ DEATHSCREAM4SND,
+ DEATHSCREAM5SND,
+ DEATHSCREAM7SND,
+ DEATHSCREAM8SND,
+ DEATHSCREAM9SND
+ };
+
+ #ifndef UPLOAD
+ PlaySoundLocActor(sounds[US_RndT()%8],ob);
+ #else
+ PlaySoundLocActor(sounds[US_RndT()%2],ob);
+ #endif
+ }
+ break;
+ case officerobj:
+ PlaySoundLocActor(NEINSOVASSND,ob);
+ break;
+ case ssobj:
+ PlaySoundLocActor(LEBENSND,ob); // JAB
+ break;
+ case dogobj:
+ PlaySoundLocActor(DOGDEATHSND,ob); // JAB
+ break;
+#ifndef SPEAR
+ case bossobj:
+ SD_PlaySound(MUTTISND); // JAB
+ break;
+ case schabbobj:
+ SD_PlaySound(MEINGOTTSND);
+ break;
+ case fakeobj:
+ SD_PlaySound(HITLERHASND);
+ break;
+ case mechahitlerobj:
+ SD_PlaySound(SCHEISTSND);
+ break;
+ case realhitlerobj:
+ SD_PlaySound(EVASND);
+ break;
+ case gretelobj:
+ SD_PlaySound(MEINSND);
+ break;
+ case giftobj:
+ SD_PlaySound(DONNERSND);
+ break;
+ case fatobj:
+ SD_PlaySound(ROSESND);
+ break;
+#else
+ case spectreobj:
+ SD_PlaySound(GHOSTFADESND);
+ break;
+ case angelobj:
+ SD_PlaySound(ANGELDEATHSND);
+ break;
+ case transobj:
+ SD_PlaySound(TRANSDEATHSND);
+ break;
+ case uberobj:
+ SD_PlaySound(UBERDEATHSND);
+ break;
+ case willobj:
+ SD_PlaySound(WILHELMDEATHSND);
+ break;
+ case deathobj:
+ SD_PlaySound(KNIGHTDEATHSND);
+ break;
+#endif
+ }
+}
+
+
+/*
+=============================================================================
+
+ SPEAR ACTORS
+
+=============================================================================
+*/
+
+#ifdef SPEAR
+
+void T_Launch (objtype *ob);
+void T_Will (objtype *ob);
+
+extern statetype s_angelshoot1;
+extern statetype s_deathshoot1;
+extern statetype s_spark1;
+
+//
+// trans
+//
+extern statetype s_transstand;
+
+extern statetype s_transchase1;
+extern statetype s_transchase1s;
+extern statetype s_transchase2;
+extern statetype s_transchase3;
+extern statetype s_transchase3s;
+extern statetype s_transchase4;
+
+extern statetype s_transdie0;
+extern statetype s_transdie01;
+extern statetype s_transdie1;
+extern statetype s_transdie2;
+extern statetype s_transdie3;
+extern statetype s_transdie4;
+
+extern statetype s_transshoot1;
+extern statetype s_transshoot2;
+extern statetype s_transshoot3;
+extern statetype s_transshoot4;
+extern statetype s_transshoot5;
+extern statetype s_transshoot6;
+extern statetype s_transshoot7;
+extern statetype s_transshoot8;
+
+
+statetype s_transstand = {false,SPR_TRANS_W1,0,T_Stand,NULL,&s_transstand};
+
+statetype s_transchase1 = {false,SPR_TRANS_W1,10,T_Chase,NULL,&s_transchase1s};
+statetype s_transchase1s = {false,SPR_TRANS_W1,3,NULL,NULL,&s_transchase2};
+statetype s_transchase2 = {false,SPR_TRANS_W2,8,T_Chase,NULL,&s_transchase3};
+statetype s_transchase3 = {false,SPR_TRANS_W3,10,T_Chase,NULL,&s_transchase3s};
+statetype s_transchase3s = {false,SPR_TRANS_W3,3,NULL,NULL,&s_transchase4};
+statetype s_transchase4 = {false,SPR_TRANS_W4,8,T_Chase,NULL,&s_transchase1};
+
+statetype s_transdie0 = {false,SPR_TRANS_W1,1,NULL,A_DeathScream,&s_transdie01};
+statetype s_transdie01 = {false,SPR_TRANS_W1,1,NULL,NULL,&s_transdie1};
+statetype s_transdie1 = {false,SPR_TRANS_DIE1,15,NULL,NULL,&s_transdie2};
+statetype s_transdie2 = {false,SPR_TRANS_DIE2,15,NULL,NULL,&s_transdie3};
+statetype s_transdie3 = {false,SPR_TRANS_DIE3,15,NULL,NULL,&s_transdie4};
+statetype s_transdie4 = {false,SPR_TRANS_DEAD,0,NULL,NULL,&s_transdie4};
+
+statetype s_transshoot1 = {false,SPR_TRANS_SHOOT1,30,NULL,NULL,&s_transshoot2};
+statetype s_transshoot2 = {false,SPR_TRANS_SHOOT2,10,NULL,T_Shoot,&s_transshoot3};
+statetype s_transshoot3 = {false,SPR_TRANS_SHOOT3,10,NULL,T_Shoot,&s_transshoot4};
+statetype s_transshoot4 = {false,SPR_TRANS_SHOOT2,10,NULL,T_Shoot,&s_transshoot5};
+statetype s_transshoot5 = {false,SPR_TRANS_SHOOT3,10,NULL,T_Shoot,&s_transshoot6};
+statetype s_transshoot6 = {false,SPR_TRANS_SHOOT2,10,NULL,T_Shoot,&s_transshoot7};
+statetype s_transshoot7 = {false,SPR_TRANS_SHOOT3,10,NULL,T_Shoot,&s_transshoot8};
+statetype s_transshoot8 = {false,SPR_TRANS_SHOOT1,10,NULL,NULL,&s_transchase1};
+
+
+/*
+===============
+=
+= SpawnTrans
+=
+===============
+*/
+
+void SpawnTrans (int tilex, int tiley)
+{
+ unsigned far *map,tile;
+
+ if (SoundBlasterPresent && DigiMode != sds_Off)
+ s_transdie01.tictime = 105;
+
+ SpawnNewObj (tilex,tiley,&s_transstand);
+ new->obclass = transobj;
+ new->hitpoints = starthitpoints[gamestate.difficulty][en_trans];
+ new->flags |= FL_SHOOTABLE|FL_AMBUSH;
+ if (!loadedgame)
+ gamestate.killtotal++;
+}
+
+
+//
+// uber
+//
+void T_UShoot (objtype *ob);
+
+extern statetype s_uberstand;
+
+extern statetype s_uberchase1;
+extern statetype s_uberchase1s;
+extern statetype s_uberchase2;
+extern statetype s_uberchase3;
+extern statetype s_uberchase3s;
+extern statetype s_uberchase4;
+
+extern statetype s_uberdie0;
+extern statetype s_uberdie01;
+extern statetype s_uberdie1;
+extern statetype s_uberdie2;
+extern statetype s_uberdie3;
+extern statetype s_uberdie4;
+extern statetype s_uberdie5;
+
+extern statetype s_ubershoot1;
+extern statetype s_ubershoot2;
+extern statetype s_ubershoot3;
+extern statetype s_ubershoot4;
+extern statetype s_ubershoot5;
+extern statetype s_ubershoot6;
+extern statetype s_ubershoot7;
+
+
+statetype s_uberstand = {false,SPR_UBER_W1,0,T_Stand,NULL,&s_uberstand};
+
+statetype s_uberchase1 = {false,SPR_UBER_W1,10,T_Chase,NULL,&s_uberchase1s};
+statetype s_uberchase1s = {false,SPR_UBER_W1,3,NULL,NULL,&s_uberchase2};
+statetype s_uberchase2 = {false,SPR_UBER_W2,8,T_Chase,NULL,&s_uberchase3};
+statetype s_uberchase3 = {false,SPR_UBER_W3,10,T_Chase,NULL,&s_uberchase3s};
+statetype s_uberchase3s = {false,SPR_UBER_W3,3,NULL,NULL,&s_uberchase4};
+statetype s_uberchase4 = {false,SPR_UBER_W4,8,T_Chase,NULL,&s_uberchase1};
+
+statetype s_uberdie0 = {false,SPR_UBER_W1,1,NULL,A_DeathScream,&s_uberdie01};
+statetype s_uberdie01 = {false,SPR_UBER_W1,1,NULL,NULL,&s_uberdie1};
+statetype s_uberdie1 = {false,SPR_UBER_DIE1,15,NULL,NULL,&s_uberdie2};
+statetype s_uberdie2 = {false,SPR_UBER_DIE2,15,NULL,NULL,&s_uberdie3};
+statetype s_uberdie3 = {false,SPR_UBER_DIE3,15,NULL,NULL,&s_uberdie4};
+statetype s_uberdie4 = {false,SPR_UBER_DIE4,15,NULL,NULL,&s_uberdie5};
+statetype s_uberdie5 = {false,SPR_UBER_DEAD,0,NULL,NULL,&s_uberdie5};
+
+statetype s_ubershoot1 = {false,SPR_UBER_SHOOT1,30,NULL,NULL,&s_ubershoot2};
+statetype s_ubershoot2 = {false,SPR_UBER_SHOOT2,12,NULL,T_UShoot,&s_ubershoot3};
+statetype s_ubershoot3 = {false,SPR_UBER_SHOOT3,12,NULL,T_UShoot,&s_ubershoot4};
+statetype s_ubershoot4 = {false,SPR_UBER_SHOOT4,12,NULL,T_UShoot,&s_ubershoot5};
+statetype s_ubershoot5 = {false,SPR_UBER_SHOOT3,12,NULL,T_UShoot,&s_ubershoot6};
+statetype s_ubershoot6 = {false,SPR_UBER_SHOOT2,12,NULL,T_UShoot,&s_ubershoot7};
+statetype s_ubershoot7 = {false,SPR_UBER_SHOOT1,12,NULL,NULL,&s_uberchase1};
+
+
+/*
+===============
+=
+= SpawnUber
+=
+===============
+*/
+
+void SpawnUber (int tilex, int tiley)
+{
+ unsigned far *map,tile;
+
+ if (SoundBlasterPresent && DigiMode != sds_Off)
+ s_uberdie01.tictime = 70;
+
+ SpawnNewObj (tilex,tiley,&s_uberstand);
+ new->obclass = uberobj;
+ new->hitpoints = starthitpoints[gamestate.difficulty][en_uber];
+ new->flags |= FL_SHOOTABLE|FL_AMBUSH;
+ if (!loadedgame)
+ gamestate.killtotal++;
+}
+
+
+/*
+===============
+=
+= T_UShoot
+=
+===============
+*/
+
+void T_UShoot (objtype *ob)
+{
+ int dx,dy,dist;
+
+ T_Shoot (ob);
+
+ dx = abs(ob->tilex - player->tilex);
+ dy = abs(ob->tiley - player->tiley);
+ dist = dx>dy ? dx : dy;
+ if (dist <= 1)
+ TakeDamage (10,ob);
+}
+
+
+//
+// will
+//
+extern statetype s_willstand;
+
+extern statetype s_willchase1;
+extern statetype s_willchase1s;
+extern statetype s_willchase2;
+extern statetype s_willchase3;
+extern statetype s_willchase3s;
+extern statetype s_willchase4;
+
+extern statetype s_willdie1;
+extern statetype s_willdie2;
+extern statetype s_willdie3;
+extern statetype s_willdie4;
+extern statetype s_willdie5;
+extern statetype s_willdie6;
+
+extern statetype s_willshoot1;
+extern statetype s_willshoot2;
+extern statetype s_willshoot3;
+extern statetype s_willshoot4;
+extern statetype s_willshoot5;
+extern statetype s_willshoot6;
+
+
+statetype s_willstand = {false,SPR_WILL_W1,0,T_Stand,NULL,&s_willstand};
+
+statetype s_willchase1 = {false,SPR_WILL_W1,10,T_Will,NULL,&s_willchase1s};
+statetype s_willchase1s = {false,SPR_WILL_W1,3,NULL,NULL,&s_willchase2};
+statetype s_willchase2 = {false,SPR_WILL_W2,8,T_Will,NULL,&s_willchase3};
+statetype s_willchase3 = {false,SPR_WILL_W3,10,T_Will,NULL,&s_willchase3s};
+statetype s_willchase3s = {false,SPR_WILL_W3,3,NULL,NULL,&s_willchase4};
+statetype s_willchase4 = {false,SPR_WILL_W4,8,T_Will,NULL,&s_willchase1};
+
+statetype s_willdeathcam = {false,SPR_WILL_W1,1,NULL,NULL,&s_willdie1};
+
+statetype s_willdie1 = {false,SPR_WILL_W1,1,NULL,A_DeathScream,&s_willdie2};
+statetype s_willdie2 = {false,SPR_WILL_W1,10,NULL,NULL,&s_willdie3};
+statetype s_willdie3 = {false,SPR_WILL_DIE1,10,NULL,NULL,&s_willdie4};
+statetype s_willdie4 = {false,SPR_WILL_DIE2,10,NULL,NULL,&s_willdie5};
+statetype s_willdie5 = {false,SPR_WILL_DIE3,10,NULL,NULL,&s_willdie6};
+statetype s_willdie6 = {false,SPR_WILL_DEAD,20,NULL,NULL,&s_willdie6};
+
+statetype s_willshoot1 = {false,SPR_WILL_SHOOT1,30,NULL,NULL,&s_willshoot2};
+statetype s_willshoot2 = {false,SPR_WILL_SHOOT2,10,NULL,T_Launch,&s_willshoot3};
+statetype s_willshoot3 = {false,SPR_WILL_SHOOT3,10,NULL,T_Shoot,&s_willshoot4};
+statetype s_willshoot4 = {false,SPR_WILL_SHOOT4,10,NULL,T_Shoot,&s_willshoot5};
+statetype s_willshoot5 = {false,SPR_WILL_SHOOT3,10,NULL,T_Shoot,&s_willshoot6};
+statetype s_willshoot6 = {false,SPR_WILL_SHOOT4,10,NULL,T_Shoot,&s_willchase1};
+
+
+/*
+===============
+=
+= SpawnWill
+=
+===============
+*/
+
+void SpawnWill (int tilex, int tiley)
+{
+ unsigned far *map,tile;
+
+ if (SoundBlasterPresent && DigiMode != sds_Off)
+ s_willdie2.tictime = 70;
+
+ SpawnNewObj (tilex,tiley,&s_willstand);
+ new->obclass = willobj;
+ new->hitpoints = starthitpoints[gamestate.difficulty][en_will];
+ new->flags |= FL_SHOOTABLE|FL_AMBUSH;
+ if (!loadedgame)
+ gamestate.killtotal++;
+}
+
+
+/*
+================
+=
+= T_Will
+=
+================
+*/
+
+void T_Will (objtype *ob)
+{
+ long move;
+ int dx,dy,dist;
+ boolean dodge;
+
+ dodge = false;
+ dx = abs(ob->tilex - player->tilex);
+ dy = abs(ob->tiley - player->tiley);
+ dist = dx>dy ? dx : dy;
+
+ if (CheckLine(ob)) // got a shot at player?
+ {
+ if ( US_RndT() < (tics<<3) )
+ {
+ //
+ // go into attack frame
+ //
+ if (ob->obclass == willobj)
+ NewState (ob,&s_willshoot1);
+ else if (ob->obclass == angelobj)
+ NewState (ob,&s_angelshoot1);
+ else
+ NewState (ob,&s_deathshoot1);
+ return;
+ }
+ dodge = true;
+ }
+
+ if (ob->dir == nodir)
+ {
+ if (dodge)
+ SelectDodgeDir (ob);
+ else
+ SelectChaseDir (ob);
+ if (ob->dir == nodir)
+ return; // object is blocked in
+ }
+
+ move = ob->speed*tics;
+
+ while (move)
+ {
+ if (ob->distance < 0)
+ {
+ //
+ // waiting for a door to open
+ //
+ OpenDoor (-ob->distance-1);
+ if (doorobjlist[-ob->distance-1].action != dr_open)
+ return;
+ ob->distance = TILEGLOBAL; // go ahead, the door is now opoen
+ }
+
+ if (move < ob->distance)
+ {
+ MoveObj (ob,move);
+ break;
+ }
+
+ //
+ // reached goal tile, so select another one
+ //
+
+ //
+ // fix position to account for round off during moving
+ //
+ ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
+ ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
+
+ move -= ob->distance;
+
+ if (dist <4)
+ SelectRunDir (ob);
+ else if (dodge)
+ SelectDodgeDir (ob);
+ else
+ SelectChaseDir (ob);
+
+ if (ob->dir == nodir)
+ return; // object is blocked in
+ }
+
+}
+
+
+//
+// death
+//
+extern statetype s_deathstand;
+
+extern statetype s_deathchase1;
+extern statetype s_deathchase1s;
+extern statetype s_deathchase2;
+extern statetype s_deathchase3;
+extern statetype s_deathchase3s;
+extern statetype s_deathchase4;
+
+extern statetype s_deathdie1;
+extern statetype s_deathdie2;
+extern statetype s_deathdie3;
+extern statetype s_deathdie4;
+extern statetype s_deathdie5;
+extern statetype s_deathdie6;
+extern statetype s_deathdie7;
+extern statetype s_deathdie8;
+extern statetype s_deathdie9;
+
+extern statetype s_deathshoot1;
+extern statetype s_deathshoot2;
+extern statetype s_deathshoot3;
+extern statetype s_deathshoot4;
+extern statetype s_deathshoot5;
+
+
+statetype s_deathstand = {false,SPR_DEATH_W1,0,T_Stand,NULL,&s_deathstand};
+
+statetype s_deathchase1 = {false,SPR_DEATH_W1,10,T_Will,NULL,&s_deathchase1s};
+statetype s_deathchase1s = {false,SPR_DEATH_W1,3,NULL,NULL,&s_deathchase2};
+statetype s_deathchase2 = {false,SPR_DEATH_W2,8,T_Will,NULL,&s_deathchase3};
+statetype s_deathchase3 = {false,SPR_DEATH_W3,10,T_Will,NULL,&s_deathchase3s};
+statetype s_deathchase3s = {false,SPR_DEATH_W3,3,NULL,NULL,&s_deathchase4};
+statetype s_deathchase4 = {false,SPR_DEATH_W4,8,T_Will,NULL,&s_deathchase1};
+
+statetype s_deathdeathcam = {false,SPR_DEATH_W1,1,NULL,NULL,&s_deathdie1};
+
+statetype s_deathdie1 = {false,SPR_DEATH_W1,1,NULL,A_DeathScream,&s_deathdie2};
+statetype s_deathdie2 = {false,SPR_DEATH_W1,10,NULL,NULL,&s_deathdie3};
+statetype s_deathdie3 = {false,SPR_DEATH_DIE1,10,NULL,NULL,&s_deathdie4};
+statetype s_deathdie4 = {false,SPR_DEATH_DIE2,10,NULL,NULL,&s_deathdie5};
+statetype s_deathdie5 = {false,SPR_DEATH_DIE3,10,NULL,NULL,&s_deathdie6};
+statetype s_deathdie6 = {false,SPR_DEATH_DIE4,10,NULL,NULL,&s_deathdie7};
+statetype s_deathdie7 = {false,SPR_DEATH_DIE5,10,NULL,NULL,&s_deathdie8};
+statetype s_deathdie8 = {false,SPR_DEATH_DIE6,10,NULL,NULL,&s_deathdie9};
+statetype s_deathdie9 = {false,SPR_DEATH_DEAD,0,NULL,NULL,&s_deathdie9};
+
+statetype s_deathshoot1 = {false,SPR_DEATH_SHOOT1,30,NULL,NULL,&s_deathshoot2};
+statetype s_deathshoot2 = {false,SPR_DEATH_SHOOT2,10,NULL,T_Launch,&s_deathshoot3};
+statetype s_deathshoot3 = {false,SPR_DEATH_SHOOT4,10,NULL,T_Shoot,&s_deathshoot4};
+statetype s_deathshoot4 = {false,SPR_DEATH_SHOOT3,10,NULL,T_Launch,&s_deathshoot5};
+statetype s_deathshoot5 = {false,SPR_DEATH_SHOOT4,10,NULL,T_Shoot,&s_deathchase1};
+
+
+/*
+===============
+=
+= SpawnDeath
+=
+===============
+*/
+
+void SpawnDeath (int tilex, int tiley)
+{
+ unsigned far *map,tile;
+
+ if (SoundBlasterPresent && DigiMode != sds_Off)
+ s_deathdie2.tictime = 105;
+
+ SpawnNewObj (tilex,tiley,&s_deathstand);
+ new->obclass = deathobj;
+ new->hitpoints = starthitpoints[gamestate.difficulty][en_death];
+ new->flags |= FL_SHOOTABLE|FL_AMBUSH;
+ if (!loadedgame)
+ gamestate.killtotal++;
+}
+
+/*
+===============
+=
+= T_Launch
+=
+===============
+*/
+
+void T_Launch (objtype *ob)
+{
+ long deltax,deltay;
+ float angle;
+ int iangle;
+
+ deltax = player->x - ob->x;
+ deltay = ob->y - player->y;
+ angle = atan2 (deltay,deltax);
+ if (angle<0)
+ angle = M_PI*2+angle;
+ iangle = angle/(M_PI*2)*ANGLES;
+ if (ob->obclass == deathobj)
+ {
+ T_Shoot (ob);
+ if (ob->state == &s_deathshoot2)
+ {
+ iangle-=4;
+ if (iangle<0)
+ iangle+=ANGLES;
+ }
+ else
+ {
+ iangle+=4;
+ if (iangle>=ANGLES)
+ iangle-=ANGLES;
+ }
+ }
+
+ GetNewActor ();
+ new->state = &s_rocket;
+ new->ticcount = 1;
+
+ new->tilex = ob->tilex;
+ new->tiley = ob->tiley;
+ new->x = ob->x;
+ new->y = ob->y;
+ new->obclass = rocketobj;
+ switch(ob->obclass)
+ {
+ case deathobj:
+ new->state = &s_hrocket;
+ new->obclass = hrocketobj;
+ PlaySoundLocActor (KNIGHTMISSILESND,new);
+ break;
+ case angelobj:
+ new->state = &s_spark1;
+ new->obclass = sparkobj;
+ PlaySoundLocActor (ANGELFIRESND,new);
+ break;
+ default:
+ PlaySoundLocActor (MISSILEFIRESND,new);
+ }
+
+ new->dir = nodir;
+ new->angle = iangle;
+ new->speed = 0x2000l;
+ new->flags = FL_NONMARK;
+ new->active = true;
+}
+
+
+
+//
+// angel
+//
+void A_Relaunch (objtype *ob);
+void A_Victory (objtype *ob);
+void A_StartAttack (objtype *ob);
+void A_Breathing (objtype *ob);
+
+extern statetype s_angelstand;
+
+extern statetype s_angelchase1;
+extern statetype s_angelchase1s;
+extern statetype s_angelchase2;
+extern statetype s_angelchase3;
+extern statetype s_angelchase3s;
+extern statetype s_angelchase4;
+
+extern statetype s_angeldie1;
+extern statetype s_angeldie11;
+extern statetype s_angeldie2;
+extern statetype s_angeldie3;
+extern statetype s_angeldie4;
+extern statetype s_angeldie5;
+extern statetype s_angeldie6;
+extern statetype s_angeldie7;
+extern statetype s_angeldie8;
+extern statetype s_angeldie9;
+
+extern statetype s_angelshoot1;
+extern statetype s_angelshoot2;
+extern statetype s_angelshoot3;
+extern statetype s_angelshoot4;
+extern statetype s_angelshoot5;
+extern statetype s_angelshoot6;
+
+extern statetype s_angeltired;
+extern statetype s_angeltired2;
+extern statetype s_angeltired3;
+extern statetype s_angeltired4;
+extern statetype s_angeltired5;
+extern statetype s_angeltired6;
+extern statetype s_angeltired7;
+
+extern statetype s_spark1;
+extern statetype s_spark2;
+extern statetype s_spark3;
+extern statetype s_spark4;
+
+
+statetype s_angelstand = {false,SPR_ANGEL_W1,0,T_Stand,NULL,&s_angelstand};
+
+statetype s_angelchase1 = {false,SPR_ANGEL_W1,10,T_Will,NULL,&s_angelchase1s};
+statetype s_angelchase1s = {false,SPR_ANGEL_W1,3,NULL,NULL,&s_angelchase2};
+statetype s_angelchase2 = {false,SPR_ANGEL_W2,8,T_Will,NULL,&s_angelchase3};
+statetype s_angelchase3 = {false,SPR_ANGEL_W3,10,T_Will,NULL,&s_angelchase3s};
+statetype s_angelchase3s = {false,SPR_ANGEL_W3,3,NULL,NULL,&s_angelchase4};
+statetype s_angelchase4 = {false,SPR_ANGEL_W4,8,T_Will,NULL,&s_angelchase1};
+
+statetype s_angeldie1 = {false,SPR_ANGEL_W1,1,NULL,A_DeathScream,&s_angeldie11};
+statetype s_angeldie11 = {false,SPR_ANGEL_W1,1,NULL,NULL,&s_angeldie2};
+statetype s_angeldie2 = {false,SPR_ANGEL_DIE1,10,NULL,A_Slurpie,&s_angeldie3};
+statetype s_angeldie3 = {false,SPR_ANGEL_DIE2,10,NULL,NULL,&s_angeldie4};
+statetype s_angeldie4 = {false,SPR_ANGEL_DIE3,10,NULL,NULL,&s_angeldie5};
+statetype s_angeldie5 = {false,SPR_ANGEL_DIE4,10,NULL,NULL,&s_angeldie6};
+statetype s_angeldie6 = {false,SPR_ANGEL_DIE5,10,NULL,NULL,&s_angeldie7};
+statetype s_angeldie7 = {false,SPR_ANGEL_DIE6,10,NULL,NULL,&s_angeldie8};
+statetype s_angeldie8 = {false,SPR_ANGEL_DIE7,10,NULL,NULL,&s_angeldie9};
+statetype s_angeldie9 = {false,SPR_ANGEL_DEAD,130,NULL,A_Victory,&s_angeldie9};
+
+statetype s_angelshoot1 = {false,SPR_ANGEL_SHOOT1,10,NULL,A_StartAttack,&s_angelshoot2};
+statetype s_angelshoot2 = {false,SPR_ANGEL_SHOOT2,20,NULL,T_Launch,&s_angelshoot3};
+statetype s_angelshoot3 = {false,SPR_ANGEL_SHOOT1,10,NULL,A_Relaunch,&s_angelshoot2};
+
+statetype s_angeltired = {false,SPR_ANGEL_TIRED1,40,NULL,A_Breathing,&s_angeltired2};
+statetype s_angeltired2 = {false,SPR_ANGEL_TIRED2,40,NULL,NULL,&s_angeltired3};
+statetype s_angeltired3 = {false,SPR_ANGEL_TIRED1,40,NULL,A_Breathing,&s_angeltired4};
+statetype s_angeltired4 = {false,SPR_ANGEL_TIRED2,40,NULL,NULL,&s_angeltired5};
+statetype s_angeltired5 = {false,SPR_ANGEL_TIRED1,40,NULL,A_Breathing,&s_angeltired6};
+statetype s_angeltired6 = {false,SPR_ANGEL_TIRED2,40,NULL,NULL,&s_angeltired7};
+statetype s_angeltired7 = {false,SPR_ANGEL_TIRED1,40,NULL,A_Breathing,&s_angelchase1};
+
+statetype s_spark1 = {false,SPR_SPARK1,6,T_Projectile,NULL,&s_spark2};
+statetype s_spark2 = {false,SPR_SPARK2,6,T_Projectile,NULL,&s_spark3};
+statetype s_spark3 = {false,SPR_SPARK3,6,T_Projectile,NULL,&s_spark4};
+statetype s_spark4 = {false,SPR_SPARK4,6,T_Projectile,NULL,&s_spark1};
+
+
+#pragma argsused
+void A_Slurpie (objtype *ob)
+{
+ SD_PlaySound(SLURPIESND);
+}
+
+#pragma argsused
+void A_Breathing (objtype *ob)
+{
+ SD_PlaySound(ANGELTIREDSND);
+}
+
+/*
+===============
+=
+= SpawnAngel
+=
+===============
+*/
+
+void SpawnAngel (int tilex, int tiley)
+{
+ unsigned far *map,tile;
+
+
+ if (SoundBlasterPresent && DigiMode != sds_Off)
+ s_angeldie11.tictime = 105;
+
+ SpawnNewObj (tilex,tiley,&s_angelstand);
+ new->obclass = angelobj;
+ new->hitpoints = starthitpoints[gamestate.difficulty][en_angel];
+ new->flags |= FL_SHOOTABLE|FL_AMBUSH;
+ if (!loadedgame)
+ gamestate.killtotal++;
+}
+
+
+/*
+=================
+=
+= A_Victory
+=
+=================
+*/
+
+#pragma argsused
+void A_Victory (objtype *ob)
+{
+ playstate = ex_victorious;
+}
+
+
+/*
+=================
+=
+= A_StartAttack
+=
+=================
+*/
+
+void A_StartAttack (objtype *ob)
+{
+ ob->temp1 = 0;
+}
+
+
+/*
+=================
+=
+= A_Relaunch
+=
+=================
+*/
+
+void A_Relaunch (objtype *ob)
+{
+ if (++ob->temp1 == 3)
+ {
+ NewState (ob,&s_angeltired);
+ return;
+ }
+
+ if (US_RndT()&1)
+ {
+ NewState (ob,&s_angelchase1);
+ return;
+ }
+}
+
+
+
+
+//
+// spectre
+//
+void T_SpectreWait (objtype *ob);
+void A_Dormant (objtype *ob);
+
+extern statetype s_spectrewait1;
+extern statetype s_spectrewait2;
+extern statetype s_spectrewait3;
+extern statetype s_spectrewait4;
+
+extern statetype s_spectrechase1;
+extern statetype s_spectrechase2;
+extern statetype s_spectrechase3;
+extern statetype s_spectrechase4;
+
+extern statetype s_spectredie1;
+extern statetype s_spectredie2;
+extern statetype s_spectredie3;
+extern statetype s_spectredie4;
+
+extern statetype s_spectrewake;
+
+statetype s_spectrewait1 = {false,SPR_SPECTRE_W1,10,T_Stand,NULL,&s_spectrewait2};
+statetype s_spectrewait2 = {false,SPR_SPECTRE_W2,10,T_Stand,NULL,&s_spectrewait3};
+statetype s_spectrewait3 = {false,SPR_SPECTRE_W3,10,T_Stand,NULL,&s_spectrewait4};
+statetype s_spectrewait4 = {false,SPR_SPECTRE_W4,10,T_Stand,NULL,&s_spectrewait1};
+
+statetype s_spectrechase1 = {false,SPR_SPECTRE_W1,10,T_Ghosts,NULL,&s_spectrechase2};
+statetype s_spectrechase2 = {false,SPR_SPECTRE_W2,10,T_Ghosts,NULL,&s_spectrechase3};
+statetype s_spectrechase3 = {false,SPR_SPECTRE_W3,10,T_Ghosts,NULL,&s_spectrechase4};
+statetype s_spectrechase4 = {false,SPR_SPECTRE_W4,10,T_Ghosts,NULL,&s_spectrechase1};
+
+statetype s_spectredie1 = {false,SPR_SPECTRE_F1,10,NULL,NULL,&s_spectredie2};
+statetype s_spectredie2 = {false,SPR_SPECTRE_F2,10,NULL,NULL,&s_spectredie3};
+statetype s_spectredie3 = {false,SPR_SPECTRE_F3,10,NULL,NULL,&s_spectredie4};
+statetype s_spectredie4 = {false,SPR_SPECTRE_F4,300,NULL,NULL,&s_spectrewake};
+statetype s_spectrewake = {false,SPR_SPECTRE_F4,10,NULL,A_Dormant,&s_spectrewake};
+
+/*
+===============
+=
+= SpawnSpectre
+=
+===============
+*/
+
+void SpawnSpectre (int tilex, int tiley)
+{
+ unsigned far *map,tile;
+
+ SpawnNewObj (tilex,tiley,&s_spectrewait1);
+ new->obclass = spectreobj;
+ new->hitpoints = starthitpoints[gamestate.difficulty][en_spectre];
+ new->flags |= FL_SHOOTABLE|FL_AMBUSH; // |FL_NEVERMARK|FL_NONMARK;
+ if (!loadedgame)
+ gamestate.killtotal++;
+}
+
+
+/*
+===============
+=
+= A_Dormant
+=
+===============
+*/
+
+void A_Dormant (objtype *ob)
+{
+ long deltax,deltay;
+ int xl,xh,yl,yh;
+ int x,y;
+ unsigned tile;
+
+ deltax = ob->x - player->x;
+ if (deltax < -MINACTORDIST || deltax > MINACTORDIST)
+ goto moveok;
+ deltay = ob->y - player->y;
+ if (deltay < -MINACTORDIST || deltay > MINACTORDIST)
+ goto moveok;
+
+ return;
+moveok:
+
+ xl = (ob->x-MINDIST) >> TILESHIFT;
+ xh = (ob->x+MINDIST) >> TILESHIFT;
+ yl = (ob->y-MINDIST) >> TILESHIFT;
+ yh = (ob->y+MINDIST) >> TILESHIFT;
+
+ for (y=yl ; y<=yh ; y++)
+ for (x=xl ; x<=xh ; x++)
+ {
+ tile = actorat[x][y];
+ if (!tile)
+ continue;
+ if (tile<256)
+ return;
+ if (((objtype *)tile)->flags&FL_SHOOTABLE)
+ return;
+ }
+
+ ob->flags |= FL_AMBUSH | FL_SHOOTABLE;
+ ob->flags &= ~FL_ATTACKMODE;
+ ob->dir = nodir;
+ NewState (ob,&s_spectrewait1);
+}
+
+
+#endif
+
+/*
+=============================================================================
+
+ SCHABBS / GIFT / FAT
+
+=============================================================================
+*/
+
+#ifndef SPEAR
+/*
+===============
+=
+= SpawnGhosts
+=
+===============
+*/
+
+void SpawnGhosts (int which, int tilex, int tiley)
+{
+ unsigned far *map,tile;
+
+ switch(which)
+ {
+ case en_blinky:
+ SpawnNewObj (tilex,tiley,&s_blinkychase1);
+ break;
+ case en_clyde:
+ SpawnNewObj (tilex,tiley,&s_clydechase1);
+ break;
+ case en_pinky:
+ SpawnNewObj (tilex,tiley,&s_pinkychase1);
+ break;
+ case en_inky:
+ SpawnNewObj (tilex,tiley,&s_inkychase1);
+ break;
+ }
+
+ new->obclass = ghostobj;
+ new->speed = SPDDOG;
+
+ new->dir = east;
+ new->flags |= FL_AMBUSH;
+ if (!loadedgame)
+ gamestate.killtotal++;
+}
+
+
+
+void T_Gift (objtype *ob);
+void T_GiftThrow (objtype *ob);
+
+void T_Fat (objtype *ob);
+void T_FatThrow (objtype *ob);
+
+//
+// schabb
+//
+extern statetype s_schabbstand;
+
+extern statetype s_schabbchase1;
+extern statetype s_schabbchase1s;
+extern statetype s_schabbchase2;
+extern statetype s_schabbchase3;
+extern statetype s_schabbchase3s;
+extern statetype s_schabbchase4;
+
+extern statetype s_schabbdie1;
+extern statetype s_schabbdie2;
+extern statetype s_schabbdie3;
+extern statetype s_schabbdie4;
+extern statetype s_schabbdie5;
+extern statetype s_schabbdie6;
+
+extern statetype s_schabbshoot1;
+extern statetype s_schabbshoot2;
+
+extern statetype s_needle1;
+extern statetype s_needle2;
+extern statetype s_needle3;
+extern statetype s_needle4;
+
+extern statetype s_schabbdeathcam;
+
+
+statetype s_schabbstand = {false,SPR_SCHABB_W1,0,T_Stand,NULL,&s_schabbstand};
+
+statetype s_schabbchase1 = {false,SPR_SCHABB_W1,10,T_Schabb,NULL,&s_schabbchase1s};
+statetype s_schabbchase1s = {false,SPR_SCHABB_W1,3,NULL,NULL,&s_schabbchase2};
+statetype s_schabbchase2 = {false,SPR_SCHABB_W2,8,T_Schabb,NULL,&s_schabbchase3};
+statetype s_schabbchase3 = {false,SPR_SCHABB_W3,10,T_Schabb,NULL,&s_schabbchase3s};
+statetype s_schabbchase3s = {false,SPR_SCHABB_W3,3,NULL,NULL,&s_schabbchase4};
+statetype s_schabbchase4 = {false,SPR_SCHABB_W4,8,T_Schabb,NULL,&s_schabbchase1};
+
+statetype s_schabbdeathcam = {false,SPR_SCHABB_W1,1,NULL,NULL,&s_schabbdie1};
+
+statetype s_schabbdie1 = {false,SPR_SCHABB_W1,10,NULL,A_DeathScream,&s_schabbdie2};
+statetype s_schabbdie2 = {false,SPR_SCHABB_W1,10,NULL,NULL,&s_schabbdie3};
+statetype s_schabbdie3 = {false,SPR_SCHABB_DIE1,10,NULL,NULL,&s_schabbdie4};
+statetype s_schabbdie4 = {false,SPR_SCHABB_DIE2,10,NULL,NULL,&s_schabbdie5};
+statetype s_schabbdie5 = {false,SPR_SCHABB_DIE3,10,NULL,NULL,&s_schabbdie6};
+statetype s_schabbdie6 = {false,SPR_SCHABB_DEAD,20,NULL,A_StartDeathCam,&s_schabbdie6};
+
+statetype s_schabbshoot1 = {false,SPR_SCHABB_SHOOT1,30,NULL,NULL,&s_schabbshoot2};
+statetype s_schabbshoot2 = {false,SPR_SCHABB_SHOOT2,10,NULL,T_SchabbThrow,&s_schabbchase1};
+
+statetype s_needle1 = {false,SPR_HYPO1,6,T_Projectile,NULL,&s_needle2};
+statetype s_needle2 = {false,SPR_HYPO2,6,T_Projectile,NULL,&s_needle3};
+statetype s_needle3 = {false,SPR_HYPO3,6,T_Projectile,NULL,&s_needle4};
+statetype s_needle4 = {false,SPR_HYPO4,6,T_Projectile,NULL,&s_needle1};
+
+
+//
+// gift
+//
+extern statetype s_giftstand;
+
+extern statetype s_giftchase1;
+extern statetype s_giftchase1s;
+extern statetype s_giftchase2;
+extern statetype s_giftchase3;
+extern statetype s_giftchase3s;
+extern statetype s_giftchase4;
+
+extern statetype s_giftdie1;
+extern statetype s_giftdie2;
+extern statetype s_giftdie3;
+extern statetype s_giftdie4;
+extern statetype s_giftdie5;
+extern statetype s_giftdie6;
+
+extern statetype s_giftshoot1;
+extern statetype s_giftshoot2;
+
+extern statetype s_needle1;
+extern statetype s_needle2;
+extern statetype s_needle3;
+extern statetype s_needle4;
+
+extern statetype s_giftdeathcam;
+
+extern statetype s_boom1;
+extern statetype s_boom2;
+extern statetype s_boom3;
+
+
+statetype s_giftstand = {false,SPR_GIFT_W1,0,T_Stand,NULL,&s_giftstand};
+
+statetype s_giftchase1 = {false,SPR_GIFT_W1,10,T_Gift,NULL,&s_giftchase1s};
+statetype s_giftchase1s = {false,SPR_GIFT_W1,3,NULL,NULL,&s_giftchase2};
+statetype s_giftchase2 = {false,SPR_GIFT_W2,8,T_Gift,NULL,&s_giftchase3};
+statetype s_giftchase3 = {false,SPR_GIFT_W3,10,T_Gift,NULL,&s_giftchase3s};
+statetype s_giftchase3s = {false,SPR_GIFT_W3,3,NULL,NULL,&s_giftchase4};
+statetype s_giftchase4 = {false,SPR_GIFT_W4,8,T_Gift,NULL,&s_giftchase1};
+
+statetype s_giftdeathcam = {false,SPR_GIFT_W1,1,NULL,NULL,&s_giftdie1};
+
+statetype s_giftdie1 = {false,SPR_GIFT_W1,1,NULL,A_DeathScream,&s_giftdie2};
+statetype s_giftdie2 = {false,SPR_GIFT_W1,10,NULL,NULL,&s_giftdie3};
+statetype s_giftdie3 = {false,SPR_GIFT_DIE1,10,NULL,NULL,&s_giftdie4};
+statetype s_giftdie4 = {false,SPR_GIFT_DIE2,10,NULL,NULL,&s_giftdie5};
+statetype s_giftdie5 = {false,SPR_GIFT_DIE3,10,NULL,NULL,&s_giftdie6};
+statetype s_giftdie6 = {false,SPR_GIFT_DEAD,20,NULL,A_StartDeathCam,&s_giftdie6};
+
+statetype s_giftshoot1 = {false,SPR_GIFT_SHOOT1,30,NULL,NULL,&s_giftshoot2};
+statetype s_giftshoot2 = {false,SPR_GIFT_SHOOT2,10,NULL,T_GiftThrow,&s_giftchase1};
+
+
+//
+// fat
+//
+extern statetype s_fatstand;
+
+extern statetype s_fatchase1;
+extern statetype s_fatchase1s;
+extern statetype s_fatchase2;
+extern statetype s_fatchase3;
+extern statetype s_fatchase3s;
+extern statetype s_fatchase4;
+
+extern statetype s_fatdie1;
+extern statetype s_fatdie2;
+extern statetype s_fatdie3;
+extern statetype s_fatdie4;
+extern statetype s_fatdie5;
+extern statetype s_fatdie6;
+
+extern statetype s_fatshoot1;
+extern statetype s_fatshoot2;
+extern statetype s_fatshoot3;
+extern statetype s_fatshoot4;
+extern statetype s_fatshoot5;
+extern statetype s_fatshoot6;
+
+extern statetype s_needle1;
+extern statetype s_needle2;
+extern statetype s_needle3;
+extern statetype s_needle4;
+
+extern statetype s_fatdeathcam;
+
+
+statetype s_fatstand = {false,SPR_FAT_W1,0,T_Stand,NULL,&s_fatstand};
+
+statetype s_fatchase1 = {false,SPR_FAT_W1,10,T_Fat,NULL,&s_fatchase1s};
+statetype s_fatchase1s = {false,SPR_FAT_W1,3,NULL,NULL,&s_fatchase2};
+statetype s_fatchase2 = {false,SPR_FAT_W2,8,T_Fat,NULL,&s_fatchase3};
+statetype s_fatchase3 = {false,SPR_FAT_W3,10,T_Fat,NULL,&s_fatchase3s};
+statetype s_fatchase3s = {false,SPR_FAT_W3,3,NULL,NULL,&s_fatchase4};
+statetype s_fatchase4 = {false,SPR_FAT_W4,8,T_Fat,NULL,&s_fatchase1};
+
+statetype s_fatdeathcam = {false,SPR_FAT_W1,1,NULL,NULL,&s_fatdie1};
+
+statetype s_fatdie1 = {false,SPR_FAT_W1,1,NULL,A_DeathScream,&s_fatdie2};
+statetype s_fatdie2 = {false,SPR_FAT_W1,10,NULL,NULL,&s_fatdie3};
+statetype s_fatdie3 = {false,SPR_FAT_DIE1,10,NULL,NULL,&s_fatdie4};
+statetype s_fatdie4 = {false,SPR_FAT_DIE2,10,NULL,NULL,&s_fatdie5};
+statetype s_fatdie5 = {false,SPR_FAT_DIE3,10,NULL,NULL,&s_fatdie6};
+statetype s_fatdie6 = {false,SPR_FAT_DEAD,20,NULL,A_StartDeathCam,&s_fatdie6};
+
+statetype s_fatshoot1 = {false,SPR_FAT_SHOOT1,30,NULL,NULL,&s_fatshoot2};
+statetype s_fatshoot2 = {false,SPR_FAT_SHOOT2,10,NULL,T_GiftThrow,&s_fatshoot3};
+statetype s_fatshoot3 = {false,SPR_FAT_SHOOT3,10,NULL,T_Shoot,&s_fatshoot4};
+statetype s_fatshoot4 = {false,SPR_FAT_SHOOT4,10,NULL,T_Shoot,&s_fatshoot5};
+statetype s_fatshoot5 = {false,SPR_FAT_SHOOT3,10,NULL,T_Shoot,&s_fatshoot6};
+statetype s_fatshoot6 = {false,SPR_FAT_SHOOT4,10,NULL,T_Shoot,&s_fatchase1};
+
+
+/*
+===============
+=
+= SpawnSchabbs
+=
+===============
+*/
+
+void SpawnSchabbs (int tilex, int tiley)
+{
+ unsigned far *map,tile;
+
+ if (DigiMode != sds_Off)
+ s_schabbdie2.tictime = 140;
+ else
+ s_schabbdie2.tictime = 5;
+
+ SpawnNewObj (tilex,tiley,&s_schabbstand);
+ new->speed = SPDPATROL;
+
+ new->obclass = schabbobj;
+ new->hitpoints = starthitpoints[gamestate.difficulty][en_schabbs];
+ new->dir = south;
+ new->flags |= FL_SHOOTABLE|FL_AMBUSH;
+ if (!loadedgame)
+ gamestate.killtotal++;
+}
+
+
+/*
+===============
+=
+= SpawnGift
+=
+===============
+*/
+
+void SpawnGift (int tilex, int tiley)
+{
+ unsigned far *map,tile;
+
+ if (DigiMode != sds_Off)
+ s_giftdie2.tictime = 140;
+ else
+ s_giftdie2.tictime = 5;
+
+ SpawnNewObj (tilex,tiley,&s_giftstand);
+ new->speed = SPDPATROL;
+
+ new->obclass = giftobj;
+ new->hitpoints = starthitpoints[gamestate.difficulty][en_gift];
+ new->dir = north;
+ new->flags |= FL_SHOOTABLE|FL_AMBUSH;
+ if (!loadedgame)
+ gamestate.killtotal++;
+}
+
+
+/*
+===============
+=
+= SpawnFat
+=
+===============
+*/
+
+void SpawnFat (int tilex, int tiley)
+{
+ unsigned far *map,tile;
+
+ if (DigiMode != sds_Off)
+ s_fatdie2.tictime = 140;
+ else
+ s_fatdie2.tictime = 5;
+
+ SpawnNewObj (tilex,tiley,&s_fatstand);
+ new->speed = SPDPATROL;
+
+ new->obclass = fatobj;
+ new->hitpoints = starthitpoints[gamestate.difficulty][en_fat];
+ new->dir = south;
+ new->flags |= FL_SHOOTABLE|FL_AMBUSH;
+ if (!loadedgame)
+ gamestate.killtotal++;
+}
+
+
+/*
+=================
+=
+= T_SchabbThrow
+=
+=================
+*/
+
+void T_SchabbThrow (objtype *ob)
+{
+ long deltax,deltay;
+ float angle;
+ int iangle;
+
+ deltax = player->x - ob->x;
+ deltay = ob->y - player->y;
+ angle = atan2 (deltay,deltax);
+ if (angle<0)
+ angle = M_PI*2+angle;
+ iangle = angle/(M_PI*2)*ANGLES;
+
+ GetNewActor ();
+ new->state = &s_needle1;
+ new->ticcount = 1;
+
+ new->tilex = ob->tilex;
+ new->tiley = ob->tiley;
+ new->x = ob->x;
+ new->y = ob->y;
+ new->obclass = needleobj;
+ new->dir = nodir;
+ new->angle = iangle;
+ new->speed = 0x2000l;
+
+ new->flags = FL_NONMARK;
+ new->active = true;
+
+ PlaySoundLocActor (SCHABBSTHROWSND,new);
+}
+
+/*
+=================
+=
+= T_GiftThrow
+=
+=================
+*/
+
+void T_GiftThrow (objtype *ob)
+{
+ long deltax,deltay;
+ float angle;
+ int iangle;
+
+ deltax = player->x - ob->x;
+ deltay = ob->y - player->y;
+ angle = atan2 (deltay,deltax);
+ if (angle<0)
+ angle = M_PI*2+angle;
+ iangle = angle/(M_PI*2)*ANGLES;
+
+ GetNewActor ();
+ new->state = &s_rocket;
+ new->ticcount = 1;
+
+ new->tilex = ob->tilex;
+ new->tiley = ob->tiley;
+ new->x = ob->x;
+ new->y = ob->y;
+ new->obclass = rocketobj;
+ new->dir = nodir;
+ new->angle = iangle;
+ new->speed = 0x2000l;
+ new->flags = FL_NONMARK;
+ new->active = true;
+
+ PlaySoundLocActor (MISSILEFIRESND,new);
+}
+
+
+
+/*
+=================
+=
+= T_Schabb
+=
+=================
+*/
+
+void T_Schabb (objtype *ob)
+{
+ long move;
+ int dx,dy,dist;
+ boolean dodge;
+
+ dodge = false;
+ dx = abs(ob->tilex - player->tilex);
+ dy = abs(ob->tiley - player->tiley);
+ dist = dx>dy ? dx : dy;
+
+ if (CheckLine(ob)) // got a shot at player?
+ {
+
+ if ( US_RndT() < (tics<<3) )
+ {
+ //
+ // go into attack frame
+ //
+ NewState (ob,&s_schabbshoot1);
+ return;
+ }
+ dodge = true;
+ }
+
+ if (ob->dir == nodir)
+ {
+ if (dodge)
+ SelectDodgeDir (ob);
+ else
+ SelectChaseDir (ob);
+ if (ob->dir == nodir)
+ return; // object is blocked in
+ }
+
+ move = ob->speed*tics;
+
+ while (move)
+ {
+ if (ob->distance < 0)
+ {
+ //
+ // waiting for a door to open
+ //
+ OpenDoor (-ob->distance-1);
+ if (doorobjlist[-ob->distance-1].action != dr_open)
+ return;
+ ob->distance = TILEGLOBAL; // go ahead, the door is now opoen
+ }
+
+ if (move < ob->distance)
+ {
+ MoveObj (ob,move);
+ break;
+ }
+
+ //
+ // reached goal tile, so select another one
+ //
+
+ //
+ // fix position to account for round off during moving
+ //
+ ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
+ ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
+
+ move -= ob->distance;
+
+ if (dist <4)
+ SelectRunDir (ob);
+ else if (dodge)
+ SelectDodgeDir (ob);
+ else
+ SelectChaseDir (ob);
+
+ if (ob->dir == nodir)
+ return; // object is blocked in
+ }
+
+}
+
+
+
+
+/*
+=================
+=
+= T_Gift
+=
+=================
+*/
+
+void T_Gift (objtype *ob)
+{
+ long move;
+ int dx,dy,dist;
+ boolean dodge;
+
+ dodge = false;
+ dx = abs(ob->tilex - player->tilex);
+ dy = abs(ob->tiley - player->tiley);
+ dist = dx>dy ? dx : dy;
+
+ if (CheckLine(ob)) // got a shot at player?
+ {
+
+ if ( US_RndT() < (tics<<3) )
+ {
+ //
+ // go into attack frame
+ //
+ NewState (ob,&s_giftshoot1);
+ return;
+ }
+ dodge = true;
+ }
+
+ if (ob->dir == nodir)
+ {
+ if (dodge)
+ SelectDodgeDir (ob);
+ else
+ SelectChaseDir (ob);
+ if (ob->dir == nodir)
+ return; // object is blocked in
+ }
+
+ move = ob->speed*tics;
+
+ while (move)
+ {
+ if (ob->distance < 0)
+ {
+ //
+ // waiting for a door to open
+ //
+ OpenDoor (-ob->distance-1);
+ if (doorobjlist[-ob->distance-1].action != dr_open)
+ return;
+ ob->distance = TILEGLOBAL; // go ahead, the door is now opoen
+ }
+
+ if (move < ob->distance)
+ {
+ MoveObj (ob,move);
+ break;
+ }
+
+ //
+ // reached goal tile, so select another one
+ //
+
+ //
+ // fix position to account for round off during moving
+ //
+ ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
+ ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
+
+ move -= ob->distance;
+
+ if (dist <4)
+ SelectRunDir (ob);
+ else if (dodge)
+ SelectDodgeDir (ob);
+ else
+ SelectChaseDir (ob);
+
+ if (ob->dir == nodir)
+ return; // object is blocked in
+ }
+
+}
+
+
+
+
+/*
+=================
+=
+= T_Fat
+=
+=================
+*/
+
+void T_Fat (objtype *ob)
+{
+ long move;
+ int dx,dy,dist;
+ boolean dodge;
+
+ dodge = false;
+ dx = abs(ob->tilex - player->tilex);
+ dy = abs(ob->tiley - player->tiley);
+ dist = dx>dy ? dx : dy;
+
+ if (CheckLine(ob)) // got a shot at player?
+ {
+
+ if ( US_RndT() < (tics<<3) )
+ {
+ //
+ // go into attack frame
+ //
+ NewState (ob,&s_fatshoot1);
+ return;
+ }
+ dodge = true;
+ }
+
+ if (ob->dir == nodir)
+ {
+ if (dodge)
+ SelectDodgeDir (ob);
+ else
+ SelectChaseDir (ob);
+ if (ob->dir == nodir)
+ return; // object is blocked in
+ }
+
+ move = ob->speed*tics;
+
+ while (move)
+ {
+ if (ob->distance < 0)
+ {
+ //
+ // waiting for a door to open
+ //
+ OpenDoor (-ob->distance-1);
+ if (doorobjlist[-ob->distance-1].action != dr_open)
+ return;
+ ob->distance = TILEGLOBAL; // go ahead, the door is now opoen
+ }
+
+ if (move < ob->distance)
+ {
+ MoveObj (ob,move);
+ break;
+ }
+
+ //
+ // reached goal tile, so select another one
+ //
+
+ //
+ // fix position to account for round off during moving
+ //
+ ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
+ ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
+
+ move -= ob->distance;
+
+ if (dist <4)
+ SelectRunDir (ob);
+ else if (dodge)
+ SelectDodgeDir (ob);
+ else
+ SelectChaseDir (ob);
+
+ if (ob->dir == nodir)
+ return; // object is blocked in
+ }
+
+}
+
+
+
+/*
+=============================================================================
+
+ HITLERS
+
+=============================================================================
+*/
+
+
+//
+// fake
+//
+extern statetype s_fakestand;
+
+extern statetype s_fakechase1;
+extern statetype s_fakechase1s;
+extern statetype s_fakechase2;
+extern statetype s_fakechase3;
+extern statetype s_fakechase3s;
+extern statetype s_fakechase4;
+
+extern statetype s_fakedie1;
+extern statetype s_fakedie2;
+extern statetype s_fakedie3;
+extern statetype s_fakedie4;
+extern statetype s_fakedie5;
+extern statetype s_fakedie6;
+
+extern statetype s_fakeshoot1;
+extern statetype s_fakeshoot2;
+extern statetype s_fakeshoot3;
+extern statetype s_fakeshoot4;
+extern statetype s_fakeshoot5;
+extern statetype s_fakeshoot6;
+extern statetype s_fakeshoot7;
+extern statetype s_fakeshoot8;
+extern statetype s_fakeshoot9;
+
+extern statetype s_fire1;
+extern statetype s_fire2;
+
+statetype s_fakestand = {false,SPR_FAKE_W1,0,T_Stand,NULL,&s_fakestand};
+
+statetype s_fakechase1 = {false,SPR_FAKE_W1,10,T_Fake,NULL,&s_fakechase1s};
+statetype s_fakechase1s = {false,SPR_FAKE_W1,3,NULL,NULL,&s_fakechase2};
+statetype s_fakechase2 = {false,SPR_FAKE_W2,8,T_Fake,NULL,&s_fakechase3};
+statetype s_fakechase3 = {false,SPR_FAKE_W3,10,T_Fake,NULL,&s_fakechase3s};
+statetype s_fakechase3s = {false,SPR_FAKE_W3,3,NULL,NULL,&s_fakechase4};
+statetype s_fakechase4 = {false,SPR_FAKE_W4,8,T_Fake,NULL,&s_fakechase1};
+
+statetype s_fakedie1 = {false,SPR_FAKE_DIE1,10,NULL,A_DeathScream,&s_fakedie2};
+statetype s_fakedie2 = {false,SPR_FAKE_DIE2,10,NULL,NULL,&s_fakedie3};
+statetype s_fakedie3 = {false,SPR_FAKE_DIE3,10,NULL,NULL,&s_fakedie4};
+statetype s_fakedie4 = {false,SPR_FAKE_DIE4,10,NULL,NULL,&s_fakedie5};
+statetype s_fakedie5 = {false,SPR_FAKE_DIE5,10,NULL,NULL,&s_fakedie6};
+statetype s_fakedie6 = {false,SPR_FAKE_DEAD,0,NULL,NULL,&s_fakedie6};
+
+statetype s_fakeshoot1 = {false,SPR_FAKE_SHOOT,8,NULL,T_FakeFire,&s_fakeshoot2};
+statetype s_fakeshoot2 = {false,SPR_FAKE_SHOOT,8,NULL,T_FakeFire,&s_fakeshoot3};
+statetype s_fakeshoot3 = {false,SPR_FAKE_SHOOT,8,NULL,T_FakeFire,&s_fakeshoot4};
+statetype s_fakeshoot4 = {false,SPR_FAKE_SHOOT,8,NULL,T_FakeFire,&s_fakeshoot5};
+statetype s_fakeshoot5 = {false,SPR_FAKE_SHOOT,8,NULL,T_FakeFire,&s_fakeshoot6};
+statetype s_fakeshoot6 = {false,SPR_FAKE_SHOOT,8,NULL,T_FakeFire,&s_fakeshoot7};
+statetype s_fakeshoot7 = {false,SPR_FAKE_SHOOT,8,NULL,T_FakeFire,&s_fakeshoot8};
+statetype s_fakeshoot8 = {false,SPR_FAKE_SHOOT,8,NULL,T_FakeFire,&s_fakeshoot9};
+statetype s_fakeshoot9 = {false,SPR_FAKE_SHOOT,8,NULL,NULL,&s_fakechase1};
+
+statetype s_fire1 = {false,SPR_FIRE1,6,NULL,T_Projectile,&s_fire2};
+statetype s_fire2 = {false,SPR_FIRE2,6,NULL,T_Projectile,&s_fire1};
+
+//
+// hitler
+//
+extern statetype s_mechachase1;
+extern statetype s_mechachase1s;
+extern statetype s_mechachase2;
+extern statetype s_mechachase3;
+extern statetype s_mechachase3s;
+extern statetype s_mechachase4;
+
+extern statetype s_mechadie1;
+extern statetype s_mechadie2;
+extern statetype s_mechadie3;
+extern statetype s_mechadie4;
+
+extern statetype s_mechashoot1;
+extern statetype s_mechashoot2;
+extern statetype s_mechashoot3;
+extern statetype s_mechashoot4;
+extern statetype s_mechashoot5;
+extern statetype s_mechashoot6;
+
+
+extern statetype s_hitlerchase1;
+extern statetype s_hitlerchase1s;
+extern statetype s_hitlerchase2;
+extern statetype s_hitlerchase3;
+extern statetype s_hitlerchase3s;
+extern statetype s_hitlerchase4;
+
+extern statetype s_hitlerdie1;
+extern statetype s_hitlerdie2;
+extern statetype s_hitlerdie3;
+extern statetype s_hitlerdie4;
+extern statetype s_hitlerdie5;
+extern statetype s_hitlerdie6;
+extern statetype s_hitlerdie7;
+extern statetype s_hitlerdie8;
+extern statetype s_hitlerdie9;
+extern statetype s_hitlerdie10;
+
+extern statetype s_hitlershoot1;
+extern statetype s_hitlershoot2;
+extern statetype s_hitlershoot3;
+extern statetype s_hitlershoot4;
+extern statetype s_hitlershoot5;
+extern statetype s_hitlershoot6;
+
+extern statetype s_hitlerdeathcam;
+
+statetype s_mechastand = {false,SPR_MECHA_W1,0,T_Stand,NULL,&s_mechastand};
+
+statetype s_mechachase1 = {false,SPR_MECHA_W1,10,T_Chase,A_MechaSound,&s_mechachase1s};
+statetype s_mechachase1s = {false,SPR_MECHA_W1,6,NULL,NULL,&s_mechachase2};
+statetype s_mechachase2 = {false,SPR_MECHA_W2,8,T_Chase,NULL,&s_mechachase3};
+statetype s_mechachase3 = {false,SPR_MECHA_W3,10,T_Chase,A_MechaSound,&s_mechachase3s};
+statetype s_mechachase3s = {false,SPR_MECHA_W3,6,NULL,NULL,&s_mechachase4};
+statetype s_mechachase4 = {false,SPR_MECHA_W4,8,T_Chase,NULL,&s_mechachase1};
+
+statetype s_mechadie1 = {false,SPR_MECHA_DIE1,10,NULL,A_DeathScream,&s_mechadie2};
+statetype s_mechadie2 = {false,SPR_MECHA_DIE2,10,NULL,NULL,&s_mechadie3};
+statetype s_mechadie3 = {false,SPR_MECHA_DIE3,10,NULL,A_HitlerMorph,&s_mechadie4};
+statetype s_mechadie4 = {false,SPR_MECHA_DEAD,0,NULL,NULL,&s_mechadie4};
+
+statetype s_mechashoot1 = {false,SPR_MECHA_SHOOT1,30,NULL,NULL,&s_mechashoot2};
+statetype s_mechashoot2 = {false,SPR_MECHA_SHOOT2,10,NULL,T_Shoot,&s_mechashoot3};
+statetype s_mechashoot3 = {false,SPR_MECHA_SHOOT3,10,NULL,T_Shoot,&s_mechashoot4};
+statetype s_mechashoot4 = {false,SPR_MECHA_SHOOT2,10,NULL,T_Shoot,&s_mechashoot5};
+statetype s_mechashoot5 = {false,SPR_MECHA_SHOOT3,10,NULL,T_Shoot,&s_mechashoot6};
+statetype s_mechashoot6 = {false,SPR_MECHA_SHOOT2,10,NULL,T_Shoot,&s_mechachase1};
+
+
+statetype s_hitlerchase1 = {false,SPR_HITLER_W1,6,T_Chase,NULL,&s_hitlerchase1s};
+statetype s_hitlerchase1s = {false,SPR_HITLER_W1,4,NULL,NULL,&s_hitlerchase2};
+statetype s_hitlerchase2 = {false,SPR_HITLER_W2,2,T_Chase,NULL,&s_hitlerchase3};
+statetype s_hitlerchase3 = {false,SPR_HITLER_W3,6,T_Chase,NULL,&s_hitlerchase3s};
+statetype s_hitlerchase3s = {false,SPR_HITLER_W3,4,NULL,NULL,&s_hitlerchase4};
+statetype s_hitlerchase4 = {false,SPR_HITLER_W4,2,T_Chase,NULL,&s_hitlerchase1};
+
+statetype s_hitlerdeathcam = {false,SPR_HITLER_W1,10,NULL,NULL,&s_hitlerdie1};
+
+statetype s_hitlerdie1 = {false,SPR_HITLER_W1,1,NULL,A_DeathScream,&s_hitlerdie2};
+statetype s_hitlerdie2 = {false,SPR_HITLER_W1,10,NULL,NULL,&s_hitlerdie3};
+statetype s_hitlerdie3 = {false,SPR_HITLER_DIE1,10,NULL,A_Slurpie,&s_hitlerdie4};
+statetype s_hitlerdie4 = {false,SPR_HITLER_DIE2,10,NULL,NULL,&s_hitlerdie5};
+statetype s_hitlerdie5 = {false,SPR_HITLER_DIE3,10,NULL,NULL,&s_hitlerdie6};
+statetype s_hitlerdie6 = {false,SPR_HITLER_DIE4,10,NULL,NULL,&s_hitlerdie7};
+statetype s_hitlerdie7 = {false,SPR_HITLER_DIE5,10,NULL,NULL,&s_hitlerdie8};
+statetype s_hitlerdie8 = {false,SPR_HITLER_DIE6,10,NULL,NULL,&s_hitlerdie9};
+statetype s_hitlerdie9 = {false,SPR_HITLER_DIE7,10,NULL,NULL,&s_hitlerdie10};
+statetype s_hitlerdie10 = {false,SPR_HITLER_DEAD,20,NULL,A_StartDeathCam,&s_hitlerdie10};
+
+statetype s_hitlershoot1 = {false,SPR_HITLER_SHOOT1,30,NULL,NULL,&s_hitlershoot2};
+statetype s_hitlershoot2 = {false,SPR_HITLER_SHOOT2,10,NULL,T_Shoot,&s_hitlershoot3};
+statetype s_hitlershoot3 = {false,SPR_HITLER_SHOOT3,10,NULL,T_Shoot,&s_hitlershoot4};
+statetype s_hitlershoot4 = {false,SPR_HITLER_SHOOT2,10,NULL,T_Shoot,&s_hitlershoot5};
+statetype s_hitlershoot5 = {false,SPR_HITLER_SHOOT3,10,NULL,T_Shoot,&s_hitlershoot6};
+statetype s_hitlershoot6 = {false,SPR_HITLER_SHOOT2,10,NULL,T_Shoot,&s_hitlerchase1};
+
+
+
+/*
+===============
+=
+= SpawnFakeHitler
+=
+===============
+*/
+
+void SpawnFakeHitler (int tilex, int tiley)
+{
+ unsigned far *map,tile;
+
+
+ if (DigiMode != sds_Off)
+ s_hitlerdie2.tictime = 140;
+ else
+ s_hitlerdie2.tictime = 5;
+
+ SpawnNewObj (tilex,tiley,&s_fakestand);
+ new->speed = SPDPATROL;
+
+ new->obclass = fakeobj;
+ new->hitpoints = starthitpoints[gamestate.difficulty][en_fake];
+ new->dir = north;
+ new->flags |= FL_SHOOTABLE|FL_AMBUSH;
+ if (!loadedgame)
+ gamestate.killtotal++;
+}
+
+
+/*
+===============
+=
+= SpawnHitler
+=
+===============
+*/
+
+void SpawnHitler (int tilex, int tiley)
+{
+ unsigned far *map,tile;
+
+ if (DigiMode != sds_Off)
+ s_hitlerdie2.tictime = 140;
+ else
+ s_hitlerdie2.tictime = 5;
+
+
+ SpawnNewObj (tilex,tiley,&s_mechastand);
+ new->speed = SPDPATROL;
+
+ new->obclass = mechahitlerobj;
+ new->hitpoints = starthitpoints[gamestate.difficulty][en_hitler];
+ new->dir = south;
+ new->flags |= FL_SHOOTABLE|FL_AMBUSH;
+ if (!loadedgame)
+ gamestate.killtotal++;
+}
+
+
+/*
+===============
+=
+= A_HitlerMorph
+=
+===============
+*/
+
+void A_HitlerMorph (objtype *ob)
+{
+ unsigned far *map,tile,hitpoints[4]={500,700,800,900};
+
+
+ SpawnNewObj (ob->tilex,ob->tiley,&s_hitlerchase1);
+ new->speed = SPDPATROL*5;
+
+ new->x = ob->x;
+ new->y = ob->y;
+
+ new->distance = ob->distance;
+ new->dir = ob->dir;
+ new->flags = ob->flags | FL_SHOOTABLE;
+
+ new->obclass = realhitlerobj;
+ new->hitpoints = hitpoints[gamestate.difficulty];
+}
+
+
+////////////////////////////////////////////////////////
+//
+// A_MechaSound
+// A_Slurpie
+//
+////////////////////////////////////////////////////////
+void A_MechaSound (objtype *ob)
+{
+ if (areabyplayer[ob->areanumber])
+ PlaySoundLocActor (MECHSTEPSND,ob);
+}
+
+
+#pragma argsused
+void A_Slurpie (objtype *ob)
+{
+ SD_PlaySound(SLURPIESND);
+}
+
+/*
+=================
+=
+= T_FakeFire
+=
+=================
+*/
+
+void T_FakeFire (objtype *ob)
+{
+ long deltax,deltay;
+ float angle;
+ int iangle;
+
+ deltax = player->x - ob->x;
+ deltay = ob->y - player->y;
+ angle = atan2 (deltay,deltax);
+ if (angle<0)
+ angle = M_PI*2+angle;
+ iangle = angle/(M_PI*2)*ANGLES;
+
+ GetNewActor ();
+ new->state = &s_fire1;
+ new->ticcount = 1;
+
+ new->tilex = ob->tilex;
+ new->tiley = ob->tiley;
+ new->x = ob->x;
+ new->y = ob->y;
+ new->dir = nodir;
+ new->angle = iangle;
+ new->obclass = fireobj;
+ new->speed = 0x1200l;
+ new->flags = FL_NEVERMARK;
+ new->active = true;
+
+ PlaySoundLocActor (FLAMETHROWERSND,new);
+}
+
+
+
+/*
+=================
+=
+= T_Fake
+=
+=================
+*/
+
+void T_Fake (objtype *ob)
+{
+ long move;
+ int dx,dy,dist;
+ boolean dodge;
+
+ if (CheckLine(ob)) // got a shot at player?
+ {
+ if ( US_RndT() < (tics<<1) )
+ {
+ //
+ // go into attack frame
+ //
+ NewState (ob,&s_fakeshoot1);
+ return;
+ }
+ }
+
+ if (ob->dir == nodir)
+ {
+ SelectDodgeDir (ob);
+ if (ob->dir == nodir)
+ return; // object is blocked in
+ }
+
+ move = ob->speed*tics;
+
+ while (move)
+ {
+ if (move < ob->distance)
+ {
+ MoveObj (ob,move);
+ break;
+ }
+
+ //
+ // reached goal tile, so select another one
+ //
+
+ //
+ // fix position to account for round off during moving
+ //
+ ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
+ ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
+
+ move -= ob->distance;
+
+ SelectDodgeDir (ob);
+
+ if (ob->dir == nodir)
+ return; // object is blocked in
+ }
+
+}
+
+#endif
+/*
+============================================================================
+
+ STAND
+
+============================================================================
+*/
+
+
+/*
+===============
+=
+= T_Stand
+=
+===============
+*/
+
+void T_Stand (objtype *ob)
+{
+ SightPlayer (ob);
+}
+
+
+/*
+============================================================================
+
+ CHASE
+
+============================================================================
+*/
+
+/*
+=================
+=
+= T_Chase
+=
+=================
+*/
+
+void T_Chase (objtype *ob)
+{
+ long move;
+ int dx,dy,dist,chance;
+ boolean dodge;
+
+ if (gamestate.victoryflag)
+ return;
+
+ dodge = false;
+ if (CheckLine(ob)) // got a shot at player?
+ {
+ dx = abs(ob->tilex - player->tilex);
+ dy = abs(ob->tiley - player->tiley);
+ dist = dx>dy ? dx : dy;
+ if (!dist || (dist==1 && ob->distance<0x4000) )
+ chance = 300;
+ else
+ chance = (tics<<4)/dist;
+
+ if ( US_RndT()<chance)
+ {
+ //
+ // go into attack frame
+ //
+ switch (ob->obclass)
+ {
+ case guardobj:
+ NewState (ob,&s_grdshoot1);
+ break;
+ case officerobj:
+ NewState (ob,&s_ofcshoot1);
+ break;
+ case mutantobj:
+ NewState (ob,&s_mutshoot1);
+ break;
+ case ssobj:
+ NewState (ob,&s_ssshoot1);
+ break;
+#ifndef SPEAR
+ case bossobj:
+ NewState (ob,&s_bossshoot1);
+ break;
+ case gretelobj:
+ NewState (ob,&s_gretelshoot1);
+ break;
+ case mechahitlerobj:
+ NewState (ob,&s_mechashoot1);
+ break;
+ case realhitlerobj:
+ NewState (ob,&s_hitlershoot1);
+ break;
+#else
+ case angelobj:
+ NewState (ob,&s_angelshoot1);
+ break;
+ case transobj:
+ NewState (ob,&s_transshoot1);
+ break;
+ case uberobj:
+ NewState (ob,&s_ubershoot1);
+ break;
+ case willobj:
+ NewState (ob,&s_willshoot1);
+ break;
+ case deathobj:
+ NewState (ob,&s_deathshoot1);
+ break;
+#endif
+ }
+ return;
+ }
+ dodge = true;
+ }
+
+ if (ob->dir == nodir)
+ {
+ if (dodge)
+ SelectDodgeDir (ob);
+ else
+ SelectChaseDir (ob);
+ if (ob->dir == nodir)
+ return; // object is blocked in
+ }
+
+ move = ob->speed*tics;
+
+ while (move)
+ {
+ if (ob->distance < 0)
+ {
+ //
+ // waiting for a door to open
+ //
+ OpenDoor (-ob->distance-1);
+ if (doorobjlist[-ob->distance-1].action != dr_open)
+ return;
+ ob->distance = TILEGLOBAL; // go ahead, the door is now opoen
+ }
+
+ if (move < ob->distance)
+ {
+ MoveObj (ob,move);
+ break;
+ }
+
+ //
+ // reached goal tile, so select another one
+ //
+
+ //
+ // fix position to account for round off during moving
+ //
+ ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
+ ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
+
+ move -= ob->distance;
+
+ if (dodge)
+ SelectDodgeDir (ob);
+ else
+ SelectChaseDir (ob);
+
+ if (ob->dir == nodir)
+ return; // object is blocked in
+ }
+
+}
+
+
+/*
+=================
+=
+= T_Ghosts
+=
+=================
+*/
+
+void T_Ghosts (objtype *ob)
+{
+ long move;
+
+
+ if (ob->dir == nodir)
+ {
+ SelectChaseDir (ob);
+ if (ob->dir == nodir)
+ return; // object is blocked in
+ }
+
+ move = ob->speed*tics;
+
+ while (move)
+ {
+ if (move < ob->distance)
+ {
+ MoveObj (ob,move);
+ break;
+ }
+
+ //
+ // reached goal tile, so select another one
+ //
+
+ //
+ // fix position to account for round off during moving
+ //
+ ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
+ ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
+
+ move -= ob->distance;
+
+ SelectChaseDir (ob);
+
+ if (ob->dir == nodir)
+ return; // object is blocked in
+ }
+
+}
+
+/*
+=================
+=
+= T_DogChase
+=
+=================
+*/
+
+void T_DogChase (objtype *ob)
+{
+ long move;
+ int dist,chance;
+ long dx,dy;
+
+
+ if (ob->dir == nodir)
+ {
+ SelectDodgeDir (ob);
+ if (ob->dir == nodir)
+ return; // object is blocked in
+ }
+
+ move = ob->speed*tics;
+
+ while (move)
+ {
+ //
+ // check for byte range
+ //
+ dx = player->x - ob->x;
+ if (dx<0)
+ dx = -dx;
+ dx -= move;
+ if (dx <= MINACTORDIST)
+ {
+ dy = player->y - ob->y;
+ if (dy<0)
+ dy = -dy;
+ dy -= move;
+ if (dy <= MINACTORDIST)
+ {
+ NewState (ob,&s_dogjump1);
+ return;
+ }
+ }
+
+ if (move < ob->distance)
+ {
+ MoveObj (ob,move);
+ break;
+ }
+
+ //
+ // reached goal tile, so select another one
+ //
+
+ //
+ // fix position to account for round off during moving
+ //
+ ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
+ ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
+
+ move -= ob->distance;
+
+ SelectDodgeDir (ob);
+
+ if (ob->dir == nodir)
+ return; // object is blocked in
+ }
+
+}
+
+
+
+/*
+============================================================================
+
+ PATH
+
+============================================================================
+*/
+
+
+/*
+===============
+=
+= SelectPathDir
+=
+===============
+*/
+
+void SelectPathDir (objtype *ob)
+{
+ unsigned spot;
+
+ spot = MAPSPOT(ob->tilex,ob->tiley,1)-ICONARROWS;
+
+ if (spot<8)
+ {
+ // new direction
+ ob->dir = spot;
+ }
+
+ ob->distance = TILEGLOBAL;
+
+ if (!TryWalk (ob))
+ ob->dir = nodir;
+}
+
+
+/*
+===============
+=
+= T_Path
+=
+===============
+*/
+
+void T_Path (objtype *ob)
+{
+ long move;
+ long deltax,deltay,size;
+
+ if (SightPlayer (ob))
+ return;
+
+ if (ob->dir == nodir)
+ {
+ SelectPathDir (ob);
+ if (ob->dir == nodir)
+ return; // all movement is blocked
+ }
+
+
+ move = ob->speed*tics;
+
+ while (move)
+ {
+ if (ob->distance < 0)
+ {
+ //
+ // waiting for a door to open
+ //
+ OpenDoor (-ob->distance-1);
+ if (doorobjlist[-ob->distance-1].action != dr_open)
+ return;
+ ob->distance = TILEGLOBAL; // go ahead, the door is now opoen
+ }
+
+ if (move < ob->distance)
+ {
+ MoveObj (ob,move);
+ break;
+ }
+
+ if (ob->tilex>MAPSIZE || ob->tiley>MAPSIZE)
+ {
+ sprintf (str,"T_Path hit a wall at %u,%u, dir %u"
+ ,ob->tilex,ob->tiley,ob->dir);
+ Quit (str);
+ }
+
+
+
+ ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
+ ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
+ move -= ob->distance;
+
+ SelectPathDir (ob);
+
+ if (ob->dir == nodir)
+ return; // all movement is blocked
+ }
+}
+
+
+/*
+=============================================================================
+
+ FIGHT
+
+=============================================================================
+*/
+
+
+/*
+===============
+=
+= T_Shoot
+=
+= Try to damage the player, based on skill level and player's speed
+=
+===============
+*/
+
+void T_Shoot (objtype *ob)
+{
+ int dx,dy,dist;
+ int hitchance,damage;
+
+ hitchance = 128;
+
+ if (!areabyplayer[ob->areanumber])
+ return;
+
+ if (!CheckLine (ob)) // player is behind a wall
+ return;
+
+ dx = abs(ob->tilex - player->tilex);
+ dy = abs(ob->tiley - player->tiley);
+ dist = dx>dy ? dx:dy;
+
+ if (ob->obclass == ssobj || ob->obclass == bossobj)
+ dist = dist*2/3; // ss are better shots
+
+ if (thrustspeed >= RUNSPEED)
+ {
+ if (ob->flags&FL_VISABLE)
+ hitchance = 160-dist*16; // player can see to dodge
+ else
+ hitchance = 160-dist*8;
+ }
+ else
+ {
+ if (ob->flags&FL_VISABLE)
+ hitchance = 256-dist*16; // player can see to dodge
+ else
+ hitchance = 256-dist*8;
+ }
+
+// see if the shot was a hit
+
+ if (US_RndT()<hitchance)
+ {
+ if (dist<2)
+ damage = US_RndT()>>2;
+ else if (dist<4)
+ damage = US_RndT()>>3;
+ else
+ damage = US_RndT()>>4;
+
+ TakeDamage (damage,ob);
+ }
+
+ switch(ob->obclass)
+ {
+ case ssobj:
+ PlaySoundLocActor(SSFIRESND,ob);
+ break;
+#ifndef SPEAR
+ case giftobj:
+ case fatobj:
+ PlaySoundLocActor(MISSILEFIRESND,ob);
+ break;
+ case mechahitlerobj:
+ case realhitlerobj:
+ case bossobj:
+ PlaySoundLocActor(BOSSFIRESND,ob);
+ break;
+ case schabbobj:
+ PlaySoundLocActor(SCHABBSTHROWSND,ob);
+ break;
+ case fakeobj:
+ PlaySoundLocActor(FLAMETHROWERSND,ob);
+ break;
+#endif
+ default:
+ PlaySoundLocActor(NAZIFIRESND,ob);
+ }
+
+}
+
+
+/*
+===============
+=
+= T_Bite
+=
+===============
+*/
+
+void T_Bite (objtype *ob)
+{
+ long dx,dy;
+ int hitchance,damage;
+
+
+ PlaySoundLocActor(DOGATTACKSND,ob); // JAB
+
+ dx = player->x - ob->x;
+ if (dx<0)
+ dx = -dx;
+ dx -= TILEGLOBAL;
+ if (dx <= MINACTORDIST)
+ {
+ dy = player->y - ob->y;
+ if (dy<0)
+ dy = -dy;
+ dy -= TILEGLOBAL;
+ if (dy <= MINACTORDIST)
+ {
+ if (US_RndT()<180)
+ {
+ TakeDamage (US_RndT()>>4,ob);
+ return;
+ }
+ }
+ }
+
+ return;
+}
+
+
+#ifndef SPEAR
+/*
+============================================================================
+
+ BJ VICTORY
+
+============================================================================
+*/
+
+
+//
+// BJ victory
+//
+
+void T_BJRun (objtype *ob);
+void T_BJJump (objtype *ob);
+void T_BJDone (objtype *ob);
+void T_BJYell (objtype *ob);
+
+void T_DeathCam (objtype *ob);
+
+extern statetype s_bjrun1;
+extern statetype s_bjrun1s;
+extern statetype s_bjrun2;
+extern statetype s_bjrun3;
+extern statetype s_bjrun3s;
+extern statetype s_bjrun4;
+
+extern statetype s_bjjump1;
+extern statetype s_bjjump2;
+extern statetype s_bjjump3;
+extern statetype s_bjjump4;
+
+
+statetype s_bjrun1 = {false,SPR_BJ_W1,12,T_BJRun,NULL,&s_bjrun1s};
+statetype s_bjrun1s = {false,SPR_BJ_W1,3, NULL,NULL,&s_bjrun2};
+statetype s_bjrun2 = {false,SPR_BJ_W2,8,T_BJRun,NULL,&s_bjrun3};
+statetype s_bjrun3 = {false,SPR_BJ_W3,12,T_BJRun,NULL,&s_bjrun3s};
+statetype s_bjrun3s = {false,SPR_BJ_W3,3, NULL,NULL,&s_bjrun4};
+statetype s_bjrun4 = {false,SPR_BJ_W4,8,T_BJRun,NULL,&s_bjrun1};
+
+
+statetype s_bjjump1 = {false,SPR_BJ_JUMP1,14,T_BJJump,NULL,&s_bjjump2};
+statetype s_bjjump2 = {false,SPR_BJ_JUMP2,14,T_BJJump,T_BJYell,&s_bjjump3};
+statetype s_bjjump3 = {false,SPR_BJ_JUMP3,14,T_BJJump,NULL,&s_bjjump4};
+statetype s_bjjump4 = {false,SPR_BJ_JUMP4,300,NULL,T_BJDone,&s_bjjump4};
+
+
+statetype s_deathcam = {false,0,0,NULL,NULL,NULL};
+
+
+/*
+===============
+=
+= SpawnBJVictory
+=
+===============
+*/
+
+void SpawnBJVictory (void)
+{
+ unsigned far *map,tile;
+
+ SpawnNewObj (player->tilex,player->tiley+1,&s_bjrun1);
+ new->x = player->x;
+ new->y = player->y;
+ new->obclass = bjobj;
+ new->dir = north;
+ new->temp1 = 6; // tiles to run forward
+}
+
+
+
+/*
+===============
+=
+= T_BJRun
+=
+===============
+*/
+
+void T_BJRun (objtype *ob)
+{
+ long move;
+
+ move = BJRUNSPEED*tics;
+
+ while (move)
+ {
+ if (move < ob->distance)
+ {
+ MoveObj (ob,move);
+ break;
+ }
+
+
+ ob->x = ((long)ob->tilex<<TILESHIFT)+TILEGLOBAL/2;
+ ob->y = ((long)ob->tiley<<TILESHIFT)+TILEGLOBAL/2;
+ move -= ob->distance;
+
+ SelectPathDir (ob);
+
+ if ( !(--ob->temp1) )
+ {
+ NewState (ob,&s_bjjump1);
+ return;
+ }
+ }
+}
+
+
+/*
+===============
+=
+= T_BJJump
+=
+===============
+*/
+
+void T_BJJump (objtype *ob)
+{
+ long move;
+
+ move = BJJUMPSPEED*tics;
+ MoveObj (ob,move);
+}
+
+
+/*
+===============
+=
+= T_BJYell
+=
+===============
+*/
+
+void T_BJYell (objtype *ob)
+{
+ PlaySoundLocActor(YEAHSND,ob); // JAB
+}
+
+
+/*
+===============
+=
+= T_BJDone
+=
+===============
+*/
+
+#pragma argsused
+void T_BJDone (objtype *ob)
+{
+ playstate = ex_victorious; // exit castle tile
+}
+
+
+
+//===========================================================================
+
+
+/*
+===============
+=
+= CheckPosition
+=
+===============
+*/
+
+boolean CheckPosition (objtype *ob)
+{
+ int x,y,xl,yl,xh,yh;
+ objtype *check;
+
+ xl = (ob->x-PLAYERSIZE) >>TILESHIFT;
+ yl = (ob->y-PLAYERSIZE) >>TILESHIFT;
+
+ xh = (ob->x+PLAYERSIZE) >>TILESHIFT;
+ yh = (ob->y+PLAYERSIZE) >>TILESHIFT;
+
+ //
+ // check for solid walls
+ //
+ for (y=yl;y<=yh;y++)
+ for (x=xl;x<=xh;x++)
+ {
+ check = actorat[x][y];
+ if (check && check<objlist)
+ return false;
+ }
+
+ return true;
+}
+
+
+/*
+===============
+=
+= A_StartDeathCam
+=
+===============
+*/
+
+void A_StartDeathCam (objtype *ob)
+{
+ long dx,dy;
+ float fangle;
+ long xmove,ymove;
+ long dist;
+ int temp,i;
+
+ FinishPaletteShifts ();
+
+ VW_WaitVBL (100);
+
+ if (gamestate.victoryflag)
+ {
+ playstate = ex_victorious; // exit castle tile
+ return;
+ }
+
+ gamestate.victoryflag = true;
+ VW_Bar (0,0,320,200-STATUSLINES,127);
+ FizzleFade(bufferofs,displayofs,320,200-STATUSLINES,70,false);
+
+ PM_UnlockMainMem ();
+ CA_UpLevel ();
+ CacheLump(LEVELEND_LUMP_START,LEVELEND_LUMP_END);
+ #ifdef JAPAN
+ #ifndef JAPDEMO
+ CA_CacheScreen(C_LETSSEEPIC);
+ #endif
+ #else
+ Write(0,7,STR_SEEAGAIN);
+ #endif
+ CA_DownLevel ();
+ PM_CheckMainMem ();
+
+ VW_UpdateScreen ();
+
+ IN_UserInput(300);
+
+//
+// line angle up exactly
+//
+ NewState (player,&s_deathcam);
+
+ player->x = gamestate.killx;
+ player->y = gamestate.killy;
+
+ dx = ob->x - player->x;
+ dy = player->y - ob->y;
+
+ fangle = atan2(dy,dx); // returns -pi to pi
+ if (fangle<0)
+ fangle = M_PI*2+fangle;
+
+ player->angle = fangle/(M_PI*2)*ANGLES;
+
+//
+// try to position as close as possible without being in a wall
+//
+ dist = 0x14000l;
+ do
+ {
+ xmove = FixedByFrac(dist,costable[player->angle]);
+ ymove = -FixedByFrac(dist,sintable[player->angle]);
+
+ player->x = ob->x - xmove;
+ player->y = ob->y - ymove;
+ dist += 0x1000;
+
+ } while (!CheckPosition (player));
+ plux = player->x >> UNSIGNEDSHIFT; // scale to fit in unsigned
+ pluy = player->y >> UNSIGNEDSHIFT;
+ player->tilex = player->x >> TILESHIFT; // scale to tile values
+ player->tiley = player->y >> TILESHIFT;
+
+//
+// go back to the game
+//
+ temp = bufferofs;
+ for (i=0;i<3;i++)
+ {
+ bufferofs = screenloc[i];
+ DrawPlayBorder ();
+ }
+ bufferofs = temp;
+
+ fizzlein = true;
+ switch (ob->obclass)
+ {
+#ifndef SPEAR
+ case schabbobj:
+ NewState (ob,&s_schabbdeathcam);
+ break;
+ case realhitlerobj:
+ NewState (ob,&s_hitlerdeathcam);
+ break;
+ case giftobj:
+ NewState (ob,&s_giftdeathcam);
+ break;
+ case fatobj:
+ NewState (ob,&s_fatdeathcam);
+ break;
+#endif
+ }
+
+}
+
+#endif
--- /dev/null
+++ b/agent.c
@@ -1,0 +1,1421 @@
+// WL_AGENT.C
+
+#include "WL_DEF.H"
+#pragma hdrstop
+
+
+/*
+=============================================================================
+
+ LOCAL CONSTANTS
+
+=============================================================================
+*/
+
+#define MAXMOUSETURN 10
+
+
+#define MOVESCALE 150l
+#define BACKMOVESCALE 100l
+#define ANGLESCALE 20
+
+/*
+=============================================================================
+
+ GLOBAL VARIABLES
+
+=============================================================================
+*/
+
+
+
+//
+// player state info
+//
+boolean running;
+long thrustspeed;
+
+unsigned plux,pluy; // player coordinates scaled to unsigned
+
+int anglefrac;
+int gotgatgun; // JR
+
+objtype *LastAttacker;
+
+/*
+=============================================================================
+
+ LOCAL VARIABLES
+
+=============================================================================
+*/
+
+
+void T_Player (objtype *ob);
+void T_Attack (objtype *ob);
+
+statetype s_player = {false,0,0,T_Player,NULL,NULL};
+statetype s_attack = {false,0,0,T_Attack,NULL,NULL};
+
+
+long playerxmove,playerymove;
+
+struct atkinf
+{
+ char tics,attack,frame; // attack is 1 for gun, 2 for knife
+} attackinfo[4][14] =
+
+{
+{ {6,0,1},{6,2,2},{6,0,3},{6,-1,4} },
+{ {6,0,1},{6,1,2},{6,0,3},{6,-1,4} },
+{ {6,0,1},{6,1,2},{6,3,3},{6,-1,4} },
+{ {6,0,1},{6,1,2},{6,4,3},{6,-1,4} },
+};
+
+
+int strafeangle[9] = {0,90,180,270,45,135,225,315,0};
+
+void DrawWeapon (void);
+void GiveWeapon (int weapon);
+void GiveAmmo (int ammo);
+
+//===========================================================================
+
+//----------
+
+void Attack (void);
+void Use (void);
+void Search (objtype *ob);
+void SelectWeapon (void);
+void SelectItem (void);
+
+//----------
+
+boolean TryMove (objtype *ob);
+void T_Player (objtype *ob);
+
+void ClipMove (objtype *ob, long xmove, long ymove);
+
+/*
+=============================================================================
+
+ CONTROL STUFF
+
+=============================================================================
+*/
+
+/*
+======================
+=
+= CheckWeaponChange
+=
+= Keys 1-4 change weapons
+=
+======================
+*/
+
+void CheckWeaponChange (void)
+{
+ int i,buttons;
+
+ if (!gamestate.ammo) // must use knife with no ammo
+ return;
+
+ for (i=wp_knife ; i<=gamestate.bestweapon ; i++)
+ if (buttonstate[bt_readyknife+i-wp_knife])
+ {
+ gamestate.weapon = gamestate.chosenweapon = i;
+ DrawWeapon ();
+ return;
+ }
+}
+
+
+/*
+=======================
+=
+= ControlMovement
+=
+= Takes controlx,controly, and buttonstate[bt_strafe]
+=
+= Changes the player's angle and position
+=
+= There is an angle hack because when going 70 fps, the roundoff becomes
+= significant
+=
+=======================
+*/
+
+void ControlMovement (objtype *ob)
+{
+ long oldx,oldy;
+ int angle,maxxmove;
+ int angleunits;
+ long speed;
+
+ thrustspeed = 0;
+
+ oldx = player->x;
+ oldy = player->y;
+
+//
+// side to side move
+//
+ if (buttonstate[bt_strafe])
+ {
+ //
+ // strafing
+ //
+ //
+ if (controlx > 0)
+ {
+ angle = ob->angle - ANGLES/4;
+ if (angle < 0)
+ angle += ANGLES;
+ Thrust (angle,controlx*MOVESCALE); // move to left
+ }
+ else if (controlx < 0)
+ {
+ angle = ob->angle + ANGLES/4;
+ if (angle >= ANGLES)
+ angle -= ANGLES;
+ Thrust (angle,-controlx*MOVESCALE); // move to right
+ }
+ }
+ else
+ {
+ //
+ // not strafing
+ //
+ anglefrac += controlx;
+ angleunits = anglefrac/ANGLESCALE;
+ anglefrac -= angleunits*ANGLESCALE;
+ ob->angle -= angleunits;
+
+ if (ob->angle >= ANGLES)
+ ob->angle -= ANGLES;
+ if (ob->angle < 0)
+ ob->angle += ANGLES;
+
+ }
+
+//
+// forward/backwards move
+//
+ if (controly < 0)
+ {
+ Thrust (ob->angle,-controly*MOVESCALE); // move forwards
+ }
+ else if (controly > 0)
+ {
+ angle = ob->angle + ANGLES/2;
+ if (angle >= ANGLES)
+ angle -= ANGLES;
+ Thrust (angle,controly*BACKMOVESCALE); // move backwards
+ }
+
+ if (gamestate.victoryflag) // watching the BJ actor
+ return;
+
+//
+// calculate total move
+//
+ playerxmove = player->x - oldx;
+ playerymove = player->y - oldy;
+}
+
+/*
+=============================================================================
+
+ STATUS WINDOW STUFF
+
+=============================================================================
+*/
+
+
+/*
+==================
+=
+= StatusDrawPic
+=
+==================
+*/
+
+void StatusDrawPic (unsigned x, unsigned y, unsigned picnum)
+{
+ unsigned temp;
+
+ temp = bufferofs;
+ bufferofs = 0;
+
+ bufferofs = PAGE1START+(200-STATUSLINES)*SCREENWIDTH;
+ LatchDrawPic (x,y,picnum);
+ bufferofs = PAGE2START+(200-STATUSLINES)*SCREENWIDTH;
+ LatchDrawPic (x,y,picnum);
+ bufferofs = PAGE3START+(200-STATUSLINES)*SCREENWIDTH;
+ LatchDrawPic (x,y,picnum);
+
+ bufferofs = temp;
+}
+
+
+/*
+==================
+=
+= DrawFace
+=
+==================
+*/
+
+void DrawFace (void)
+{
+ if (gamestate.health)
+ {
+ #ifdef SPEAR
+ if (godmode)
+ StatusDrawPic (17,4,GODMODEFACE1PIC+gamestate.faceframe);
+ else
+ #endif
+ StatusDrawPic (17,4,FACE1APIC+3*((100-gamestate.health)/16)+gamestate.faceframe);
+ }
+ else
+ {
+#ifndef SPEAR
+ if (LastAttacker->obclass == needleobj)
+ StatusDrawPic (17,4,MUTANTBJPIC);
+ else
+#endif
+ StatusDrawPic (17,4,FACE8APIC);
+ }
+}
+
+
+/*
+===============
+=
+= UpdateFace
+=
+= Calls draw face if time to change
+=
+===============
+*/
+
+#define FACETICS 70
+
+int facecount;
+
+void UpdateFace (void)
+{
+
+ if (SD_SoundPlaying() == GETGATLINGSND)
+ return;
+
+ facecount += tics;
+ if (facecount > US_RndT())
+ {
+ gamestate.faceframe = (US_RndT()>>6);
+ if (gamestate.faceframe==3)
+ gamestate.faceframe = 1;
+
+ facecount = 0;
+ DrawFace ();
+ }
+}
+
+
+
+/*
+===============
+=
+= LatchNumber
+=
+= right justifies and pads with blanks
+=
+===============
+*/
+
+void LatchNumber (int x, int y, int width, long number)
+{
+ unsigned length,c;
+ char str[20];
+
+ ltoa (number,str,10);
+
+ length = strlen (str);
+
+ while (length<width)
+ {
+ StatusDrawPic (x,y,N_BLANKPIC);
+ x++;
+ width--;
+ }
+
+ c= length <= width ? 0 : length-width;
+
+ while (c<length)
+ {
+ StatusDrawPic (x,y,str[c]-'0'+ N_0PIC);
+ x++;
+ c++;
+ }
+}
+
+
+/*
+===============
+=
+= DrawHealth
+=
+===============
+*/
+
+void DrawHealth (void)
+{
+ LatchNumber (21,16,3,gamestate.health);
+}
+
+
+/*
+===============
+=
+= TakeDamage
+=
+===============
+*/
+
+void TakeDamage (int points,objtype *attacker)
+{
+ LastAttacker = attacker;
+
+ if (gamestate.victoryflag)
+ return;
+ if (gamestate.difficulty==gd_baby)
+ points>>=2;
+
+ if (!godmode)
+ gamestate.health -= points;
+
+ if (gamestate.health<=0)
+ {
+ gamestate.health = 0;
+ playstate = ex_died;
+ killerobj = attacker;
+ }
+
+ StartDamageFlash (points);
+
+ gotgatgun=0;
+
+ DrawHealth ();
+ DrawFace ();
+
+ //
+ // MAKE BJ'S EYES BUG IF MAJOR DAMAGE!
+ //
+ #ifdef SPEAR
+ if (points > 30 && gamestate.health!=0 && !godmode)
+ {
+ StatusDrawPic (17,4,BJOUCHPIC);
+ facecount = 0;
+ }
+ #endif
+
+}
+
+
+/*
+===============
+=
+= HealSelf
+=
+===============
+*/
+
+void HealSelf (int points)
+{
+ gamestate.health += points;
+ if (gamestate.health>100)
+ gamestate.health = 100;
+
+ DrawHealth ();
+ gotgatgun = 0; // JR
+ DrawFace ();
+}
+
+
+//===========================================================================
+
+
+/*
+===============
+=
+= DrawLevel
+=
+===============
+*/
+
+void DrawLevel (void)
+{
+#ifdef SPEAR
+ if (gamestate.mapon == 20)
+ LatchNumber (2,16,2,18);
+ else
+#endif
+ LatchNumber (2,16,2,gamestate.mapon+1);
+}
+
+//===========================================================================
+
+
+/*
+===============
+=
+= DrawLives
+=
+===============
+*/
+
+void DrawLives (void)
+{
+ LatchNumber (14,16,1,gamestate.lives);
+}
+
+
+/*
+===============
+=
+= GiveExtraMan
+=
+===============
+*/
+
+void GiveExtraMan (void)
+{
+ if (gamestate.lives<9)
+ gamestate.lives++;
+ DrawLives ();
+ SD_PlaySound (BONUS1UPSND);
+}
+
+//===========================================================================
+
+/*
+===============
+=
+= DrawScore
+=
+===============
+*/
+
+void DrawScore (void)
+{
+ LatchNumber (6,16,6,gamestate.score);
+}
+
+/*
+===============
+=
+= GivePoints
+=
+===============
+*/
+
+void GivePoints (long points)
+{
+ gamestate.score += points;
+ while (gamestate.score >= gamestate.nextextra)
+ {
+ gamestate.nextextra += EXTRAPOINTS;
+ GiveExtraMan ();
+ }
+ DrawScore ();
+}
+
+//===========================================================================
+
+/*
+==================
+=
+= DrawWeapon
+=
+==================
+*/
+
+void DrawWeapon (void)
+{
+ StatusDrawPic (32,8,KNIFEPIC+gamestate.weapon);
+}
+
+
+/*
+==================
+=
+= DrawKeys
+=
+==================
+*/
+
+void DrawKeys (void)
+{
+ if (gamestate.keys & 1)
+ StatusDrawPic (30,4,GOLDKEYPIC);
+ else
+ StatusDrawPic (30,4,NOKEYPIC);
+
+ if (gamestate.keys & 2)
+ StatusDrawPic (30,20,SILVERKEYPIC);
+ else
+ StatusDrawPic (30,20,NOKEYPIC);
+}
+
+
+
+/*
+==================
+=
+= GiveWeapon
+=
+==================
+*/
+
+void GiveWeapon (int weapon)
+{
+ GiveAmmo (6);
+
+ if (gamestate.bestweapon<weapon)
+ gamestate.bestweapon = gamestate.weapon
+ = gamestate.chosenweapon = weapon;
+
+ DrawWeapon ();
+}
+
+
+//===========================================================================
+
+/*
+===============
+=
+= DrawAmmo
+=
+===============
+*/
+
+void DrawAmmo (void)
+{
+ LatchNumber (27,16,2,gamestate.ammo);
+}
+
+
+/*
+===============
+=
+= GiveAmmo
+=
+===============
+*/
+
+void GiveAmmo (int ammo)
+{
+ if (!gamestate.ammo) // knife was out
+ {
+ if (!gamestate.attackframe)
+ {
+ gamestate.weapon = gamestate.chosenweapon;
+ DrawWeapon ();
+ }
+ }
+ gamestate.ammo += ammo;
+ if (gamestate.ammo > 99)
+ gamestate.ammo = 99;
+ DrawAmmo ();
+}
+
+//===========================================================================
+
+/*
+==================
+=
+= GiveKey
+=
+==================
+*/
+
+void GiveKey (int key)
+{
+ gamestate.keys |= (1<<key);
+ DrawKeys ();
+}
+
+
+
+/*
+=============================================================================
+
+ MOVEMENT
+
+=============================================================================
+*/
+
+
+/*
+===================
+=
+= GetBonus
+=
+===================
+*/
+void GetBonus (statobj_t *check)
+{
+ switch (check->itemnumber)
+ {
+ case bo_firstaid:
+ if (gamestate.health == 100)
+ return;
+
+ SD_PlaySound (HEALTH2SND);
+ HealSelf (25);
+ break;
+
+ case bo_key1:
+ case bo_key2:
+ case bo_key3:
+ case bo_key4:
+ GiveKey (check->itemnumber - bo_key1);
+ SD_PlaySound (GETKEYSND);
+ break;
+
+ case bo_cross:
+ SD_PlaySound (BONUS1SND);
+ GivePoints (100);
+ gamestate.treasurecount++;
+ break;
+ case bo_chalice:
+ SD_PlaySound (BONUS2SND);
+ GivePoints (500);
+ gamestate.treasurecount++;
+ break;
+ case bo_bible:
+ SD_PlaySound (BONUS3SND);
+ GivePoints (1000);
+ gamestate.treasurecount++;
+ break;
+ case bo_crown:
+ SD_PlaySound (BONUS4SND);
+ GivePoints (5000);
+ gamestate.treasurecount++;
+ break;
+
+ case bo_clip:
+ if (gamestate.ammo == 99)
+ return;
+
+ SD_PlaySound (GETAMMOSND);
+ GiveAmmo (8);
+ break;
+ case bo_clip2:
+ if (gamestate.ammo == 99)
+ return;
+
+ SD_PlaySound (GETAMMOSND);
+ GiveAmmo (4);
+ break;
+
+#ifdef SPEAR
+ case bo_25clip:
+ if (gamestate.ammo == 99)
+ return;
+
+ SD_PlaySound (GETAMMOBOXSND);
+ GiveAmmo (25);
+ break;
+#endif
+
+ case bo_machinegun:
+ SD_PlaySound (GETMACHINESND);
+ GiveWeapon (wp_machinegun);
+ break;
+ case bo_chaingun:
+ SD_PlaySound (GETGATLINGSND);
+ GiveWeapon (wp_chaingun);
+
+ StatusDrawPic (17,4,GOTGATLINGPIC);
+ facecount = 0;
+ gotgatgun = 1;
+ break;
+
+ case bo_fullheal:
+ SD_PlaySound (BONUS1UPSND);
+ HealSelf (99);
+ GiveAmmo (25);
+ GiveExtraMan ();
+ gamestate.treasurecount++;
+ break;
+
+ case bo_food:
+ if (gamestate.health == 100)
+ return;
+
+ SD_PlaySound (HEALTH1SND);
+ HealSelf (10);
+ break;
+
+ case bo_alpo:
+ if (gamestate.health == 100)
+ return;
+
+ SD_PlaySound (HEALTH1SND);
+ HealSelf (4);
+ break;
+
+ case bo_gibs:
+ if (gamestate.health >10)
+ return;
+
+ SD_PlaySound (SLURPIESND);
+ HealSelf (1);
+ break;
+
+ case bo_spear:
+ spearflag = true;
+ spearx = player->x;
+ speary = player->y;
+ spearangle = player->angle;
+ playstate = ex_completed;
+ }
+
+ StartBonusFlash ();
+ check->shapenum = -1; // remove from list
+}
+
+
+/*
+===================
+=
+= TryMove
+=
+= returns true if move ok
+= debug: use pointers to optimize
+===================
+*/
+
+boolean TryMove (objtype *ob)
+{
+ int xl,yl,xh,yh,x,y;
+ objtype *check;
+ long deltax,deltay;
+
+ xl = (ob->x-PLAYERSIZE) >>TILESHIFT;
+ yl = (ob->y-PLAYERSIZE) >>TILESHIFT;
+
+ xh = (ob->x+PLAYERSIZE) >>TILESHIFT;
+ yh = (ob->y+PLAYERSIZE) >>TILESHIFT;
+
+//
+// check for solid walls
+//
+ for (y=yl;y<=yh;y++)
+ for (x=xl;x<=xh;x++)
+ {
+ check = actorat[x][y];
+ if (check && check<objlist)
+ return false;
+ }
+
+//
+// check for actors
+//
+ if (yl>0)
+ yl--;
+ if (yh<MAPSIZE-1)
+ yh++;
+ if (xl>0)
+ xl--;
+ if (xh<MAPSIZE-1)
+ xh++;
+
+ for (y=yl;y<=yh;y++)
+ for (x=xl;x<=xh;x++)
+ {
+ check = actorat[x][y];
+ if (check > objlist
+ && (check->flags & FL_SHOOTABLE) )
+ {
+ deltax = ob->x - check->x;
+ if (deltax < -MINACTORDIST || deltax > MINACTORDIST)
+ continue;
+ deltay = ob->y - check->y;
+ if (deltay < -MINACTORDIST || deltay > MINACTORDIST)
+ continue;
+
+ return false;
+ }
+ }
+
+ return true;
+}
+
+
+/*
+===================
+=
+= ClipMove
+=
+===================
+*/
+
+void ClipMove (objtype *ob, long xmove, long ymove)
+{
+ long basex,basey;
+
+ basex = ob->x;
+ basey = ob->y;
+
+ ob->x = basex+xmove;
+ ob->y = basey+ymove;
+ if (TryMove (ob))
+ return;
+
+ if (noclip && ob->x > 2*TILEGLOBAL && ob->y > 2*TILEGLOBAL &&
+ ob->x < (((long)(mapwidth-1))<<TILESHIFT)
+ && ob->y < (((long)(mapheight-1))<<TILESHIFT) )
+ return; // walk through walls
+
+ if (!SD_SoundPlaying())
+ SD_PlaySound (HITWALLSND);
+
+ ob->x = basex+xmove;
+ ob->y = basey;
+ if (TryMove (ob))
+ return;
+
+ ob->x = basex;
+ ob->y = basey+ymove;
+ if (TryMove (ob))
+ return;
+
+ ob->x = basex;
+ ob->y = basey;
+}
+
+//==========================================================================
+
+/*
+===================
+=
+= VictoryTile
+=
+===================
+*/
+
+void VictoryTile (void)
+{
+#ifndef SPEAR
+ SpawnBJVictory ();
+#endif
+
+ gamestate.victoryflag = true;
+}
+
+
+/*
+===================
+=
+= Thrust
+=
+===================
+*/
+
+void Thrust (int angle, long speed)
+{
+ long xmove,ymove;
+ long slowmax;
+ unsigned offset;
+
+
+ //
+ // ZERO FUNNY COUNTER IF MOVED!
+ //
+ #ifdef SPEAR
+ if (speed)
+ funnyticount = 0;
+ #endif
+
+ thrustspeed += speed;
+//
+// moving bounds speed
+//
+ if (speed >= MINDIST*2)
+ speed = MINDIST*2-1;
+
+ xmove = FixedByFrac(speed,costable[angle]);
+ ymove = -FixedByFrac(speed,sintable[angle]);
+
+ ClipMove(player,xmove,ymove);
+
+ player->tilex = player->x >> TILESHIFT; // scale to tile values
+ player->tiley = player->y >> TILESHIFT;
+
+ offset = farmapylookup[player->tiley]+player->tilex;
+ player->areanumber = *(mapsegs[0] + offset) -AREATILE;
+
+ if (*(mapsegs[1] + offset) == EXITTILE)
+ VictoryTile ();
+}
+
+
+/*
+=============================================================================
+
+ ACTIONS
+
+=============================================================================
+*/
+
+
+/*
+===============
+=
+= Cmd_Fire
+=
+===============
+*/
+
+void Cmd_Fire (void)
+{
+ buttonheld[bt_attack] = true;
+
+ gamestate.weaponframe = 0;
+
+ player->state = &s_attack;
+
+ gamestate.attackframe = 0;
+ gamestate.attackcount =
+ attackinfo[gamestate.weapon][gamestate.attackframe].tics;
+ gamestate.weaponframe =
+ attackinfo[gamestate.weapon][gamestate.attackframe].frame;
+}
+
+//===========================================================================
+
+/*
+===============
+=
+= Cmd_Use
+=
+===============
+*/
+
+void Cmd_Use (void)
+{
+ objtype *check;
+ int checkx,checky,doornum,dir;
+ boolean elevatorok;
+
+
+//
+// find which cardinal direction the player is facing
+//
+ if (player->angle < ANGLES/8 || player->angle > 7*ANGLES/8)
+ {
+ checkx = player->tilex + 1;
+ checky = player->tiley;
+ dir = di_east;
+ elevatorok = true;
+ }
+ else if (player->angle < 3*ANGLES/8)
+ {
+ checkx = player->tilex;
+ checky = player->tiley-1;
+ dir = di_north;
+ elevatorok = false;
+ }
+ else if (player->angle < 5*ANGLES/8)
+ {
+ checkx = player->tilex - 1;
+ checky = player->tiley;
+ dir = di_west;
+ elevatorok = true;
+ }
+ else
+ {
+ checkx = player->tilex;
+ checky = player->tiley + 1;
+ dir = di_south;
+ elevatorok = false;
+ }
+
+ doornum = tilemap[checkx][checky];
+ if (*(mapsegs[1]+farmapylookup[checky]+checkx) == PUSHABLETILE)
+ {
+ //
+ // pushable wall
+ //
+
+ PushWall (checkx,checky,dir);
+ return;
+ }
+ if (!buttonheld[bt_use] && doornum == ELEVATORTILE && elevatorok)
+ {
+ //
+ // use elevator
+ //
+ buttonheld[bt_use] = true;
+
+ tilemap[checkx][checky]++; // flip switch
+ if (*(mapsegs[0]+farmapylookup[player->tiley]+player->tilex) == ALTELEVATORTILE)
+ playstate = ex_secretlevel;
+ else
+ playstate = ex_completed;
+ SD_PlaySound (LEVELDONESND);
+ SD_WaitSoundDone();
+ }
+ else if (!buttonheld[bt_use] && doornum & 0x80)
+ {
+ buttonheld[bt_use] = true;
+ OperateDoor (doornum & ~0x80);
+ }
+ else
+ SD_PlaySound (DONOTHINGSND);
+
+}
+
+/*
+=============================================================================
+
+ PLAYER CONTROL
+
+=============================================================================
+*/
+
+
+
+/*
+===============
+=
+= SpawnPlayer
+=
+===============
+*/
+
+void SpawnPlayer (int tilex, int tiley, int dir)
+{
+ player->obclass = playerobj;
+ player->active = true;
+ player->tilex = tilex;
+ player->tiley = tiley;
+ player->areanumber =
+ *(mapsegs[0] + farmapylookup[player->tiley]+player->tilex);
+ player->x = ((long)tilex<<TILESHIFT)+TILEGLOBAL/2;
+ player->y = ((long)tiley<<TILESHIFT)+TILEGLOBAL/2;
+ player->state = &s_player;
+ player->angle = (1-dir)*90;
+ if (player->angle<0)
+ player->angle += ANGLES;
+ player->flags = FL_NEVERMARK;
+ Thrust (0,0); // set some variables
+
+ InitAreas ();
+}
+
+
+//===========================================================================
+
+/*
+===============
+=
+= T_KnifeAttack
+=
+= Update player hands, and try to do damage when the proper frame is reached
+=
+===============
+*/
+
+void KnifeAttack (objtype *ob)
+{
+ objtype *check,*closest;
+ long dist;
+
+ SD_PlaySound (ATKKNIFESND);
+// actually fire
+ dist = 0x7fffffff;
+ closest = NULL;
+ for (check=ob->next ; check ; check=check->next)
+ if ( (check->flags & FL_SHOOTABLE)
+ && (check->flags & FL_VISABLE)
+ && abs (check->viewx-centerx) < shootdelta
+ )
+ {
+ if (check->transx < dist)
+ {
+ dist = check->transx;
+ closest = check;
+ }
+ }
+
+ if (!closest || dist> 0x18000l)
+ {
+ // missed
+
+ return;
+ }
+
+// hit something
+ DamageActor (closest,US_RndT() >> 4);
+}
+
+
+
+void GunAttack (objtype *ob)
+{
+ objtype *check,*closest,*oldclosest;
+ int damage;
+ int dx,dy,dist;
+ long viewdist;
+
+ switch (gamestate.weapon)
+ {
+ case wp_pistol:
+ SD_PlaySound (ATKPISTOLSND);
+ break;
+ case wp_machinegun:
+ SD_PlaySound (ATKMACHINEGUNSND);
+ break;
+ case wp_chaingun:
+ SD_PlaySound (ATKGATLINGSND);
+ break;
+ }
+
+ madenoise = true;
+
+//
+// find potential targets
+//
+ viewdist = 0x7fffffffl;
+ closest = NULL;
+
+ while (1)
+ {
+ oldclosest = closest;
+
+ for (check=ob->next ; check ; check=check->next)
+ if ( (check->flags & FL_SHOOTABLE)
+ && (check->flags & FL_VISABLE)
+ && abs (check->viewx-centerx) < shootdelta
+ )
+ {
+ if (check->transx < viewdist)
+ {
+ viewdist = check->transx;
+ closest = check;
+ }
+ }
+
+ if (closest == oldclosest)
+ return; // no more targets, all missed
+
+ //
+ // trace a line from player to enemey
+ //
+ if (CheckLine(closest))
+ break;
+
+ }
+
+//
+// hit something
+//
+ dx = abs(closest->tilex - player->tilex);
+ dy = abs(closest->tiley - player->tiley);
+ dist = dx>dy ? dx:dy;
+
+ if (dist<2)
+ damage = US_RndT() / 4;
+ else if (dist<4)
+ damage = US_RndT() / 6;
+ else
+ {
+ if ( (US_RndT() / 12) < dist) // missed
+ return;
+ damage = US_RndT() / 6;
+ }
+
+ DamageActor (closest,damage);
+}
+
+//===========================================================================
+
+/*
+===============
+=
+= VictorySpin
+=
+===============
+*/
+
+void VictorySpin (void)
+{
+ long desty;
+
+ if (player->angle > 270)
+ {
+ player->angle -= tics * 3;
+ if (player->angle < 270)
+ player->angle = 270;
+ }
+ else if (player->angle < 270)
+ {
+ player->angle += tics * 3;
+ if (player->angle > 270)
+ player->angle = 270;
+ }
+
+ desty = (((long)player->tiley-5)<<TILESHIFT)-0x3000;
+
+ if (player->y > desty)
+ {
+ player->y -= tics*4096;
+ if (player->y < desty)
+ player->y = desty;
+ }
+}
+
+
+//===========================================================================
+
+/*
+===============
+=
+= T_Attack
+=
+===============
+*/
+
+void T_Attack (objtype *ob)
+{
+ struct atkinf *cur;
+
+ UpdateFace ();
+
+ if (gamestate.victoryflag) // watching the BJ actor
+ {
+ VictorySpin ();
+ return;
+ }
+
+ if ( buttonstate[bt_use] && !buttonheld[bt_use] )
+ buttonstate[bt_use] = false;
+
+ if ( buttonstate[bt_attack] && !buttonheld[bt_attack])
+ buttonstate[bt_attack] = false;
+
+ ControlMovement (ob);
+ if (gamestate.victoryflag) // watching the BJ actor
+ return;
+
+ plux = player->x >> UNSIGNEDSHIFT; // scale to fit in unsigned
+ pluy = player->y >> UNSIGNEDSHIFT;
+ player->tilex = player->x >> TILESHIFT; // scale to tile values
+ player->tiley = player->y >> TILESHIFT;
+
+//
+// change frame and fire
+//
+ gamestate.attackcount -= tics;
+ while (gamestate.attackcount <= 0)
+ {
+ cur = &attackinfo[gamestate.weapon][gamestate.attackframe];
+ switch (cur->attack)
+ {
+ case -1:
+ ob->state = &s_player;
+ if (!gamestate.ammo)
+ {
+ gamestate.weapon = wp_knife;
+ DrawWeapon ();
+ }
+ else
+ {
+ if (gamestate.weapon != gamestate.chosenweapon)
+ {
+ gamestate.weapon = gamestate.chosenweapon;
+ DrawWeapon ();
+ }
+ };
+ gamestate.attackframe = gamestate.weaponframe = 0;
+ return;
+
+ case 4:
+ if (!gamestate.ammo)
+ break;
+ if (buttonstate[bt_attack])
+ gamestate.attackframe -= 2;
+ case 1:
+ if (!gamestate.ammo)
+ { // can only happen with chain gun
+ gamestate.attackframe++;
+ break;
+ }
+ GunAttack (ob);
+ gamestate.ammo--;
+ DrawAmmo ();
+ break;
+
+ case 2:
+ KnifeAttack (ob);
+ break;
+
+ case 3:
+ if (gamestate.ammo && buttonstate[bt_attack])
+ gamestate.attackframe -= 2;
+ break;
+ }
+
+ gamestate.attackcount += cur->tics;
+ gamestate.attackframe++;
+ gamestate.weaponframe =
+ attackinfo[gamestate.weapon][gamestate.attackframe].frame;
+ }
+
+}
+
+
+
+//===========================================================================
+
+/*
+===============
+=
+= T_Player
+=
+===============
+*/
+
+void T_Player (objtype *ob)
+{
+ if (gamestate.victoryflag) // watching the BJ actor
+ {
+ VictorySpin ();
+ return;
+ }
+
+ UpdateFace ();
+ CheckWeaponChange ();
+
+ if ( buttonstate[bt_use] )
+ Cmd_Use ();
+
+ if ( buttonstate[bt_attack] && !buttonheld[bt_attack])
+ Cmd_Fire ();
+
+ ControlMovement (ob);
+ if (gamestate.victoryflag) // watching the BJ actor
+ return;
+
+
+ plux = player->x >> UNSIGNEDSHIFT; // scale to fit in unsigned
+ pluy = player->y >> UNSIGNEDSHIFT;
+ player->tilex = player->x >> TILESHIFT; // scale to tile values
+ player->tiley = player->y >> TILESHIFT;
+}
+
+
--- /dev/null
+++ b/audiosdm.h
@@ -1,0 +1,142 @@
+/////////////////////////////////////////////////
+//
+// MUSE Header for .SDM
+// Created Thu Aug 27 07:12:39 1992
+//
+/////////////////////////////////////////////////
+
+#define NUMSOUNDS 81
+#define NUMSNDCHUNKS 267
+
+//
+// Sound names & indexes
+//
+typedef enum {
+ HITWALLSND, // 0
+ MISSILEHITSND, // 1
+ SELECTITEMSND, // 2
+ GHOSTSIGHTSND, // 3
+ MOVEGUN2SND, // 4
+ MOVEGUN1SND, // 5
+ NOWAYSND, // 6
+ NAZIHITPLAYERSND, // 7
+ MISSILEFIRESND, // 8
+ PLAYERDEATHSND, // 9
+ DOGDEATHSND, // 10
+ ATKGATLINGSND, // 11
+ GETKEYSND, // 12
+ NOITEMSND, // 13
+ WALK1SND, // 14
+ WALK2SND, // 15
+ TAKEDAMAGESND, // 16
+ GAMEOVERSND, // 17
+ OPENDOORSND, // 18
+ CLOSEDOORSND, // 19
+ DONOTHINGSND, // 20
+ HALTSND, // 21
+ DEATHSCREAM2SND, // 22
+ ATKKNIFESND, // 23
+ ATKPISTOLSND, // 24
+ DEATHSCREAM3SND, // 25
+ ATKMACHINEGUNSND, // 26
+ HITENEMYSND, // 27
+ SHOOTDOORSND, // 28
+ DEATHSCREAM1SND, // 29
+ GETMACHINESND, // 30
+ GETAMMOSND, // 31
+ SHOOTSND, // 32
+ HEALTH1SND, // 33
+ HEALTH2SND, // 34
+ BONUS1SND, // 35
+ BONUS2SND, // 36
+ BONUS3SND, // 37
+ GETGATLINGSND, // 38
+ ESCPRESSEDSND, // 39
+ LEVELDONESND, // 40
+ DOGBARKSND, // 41
+ ENDBONUS1SND, // 42
+ ENDBONUS2SND, // 43
+ BONUS1UPSND, // 44
+ BONUS4SND, // 45
+ PUSHWALLSND, // 46
+ NOBONUSSND, // 47
+ PERCENT100SND, // 48
+ BOSSACTIVESND, // 49
+ DEATHSCREAM4SND, // 50
+ SCHUTZADSND, // 51
+ AHHHGSND, // 52
+ DEATHSCREAM5SND, // 53
+ DEATHSCREAM7SND, // 54
+ DEATHSCREAM8SND, // 55
+ LEBENSND, // 56
+ DEATHSCREAM6SND, // 57
+ NAZIFIRESND, // 58
+ BOSSFIRESND, // 59
+ SSFIRESND, // 60
+ SLURPIESND, // 61
+ GHOSTFADESND, // 62
+ DEATHSCREAM9SND, // 63
+ GETAMMOBOXSND, // 64
+ ANGELSIGHTSND, // 65
+ SPIONSND, // 66
+ NEINSOVASSND, // 67
+ DOGATTACKSND, // 68
+ ANGELFIRESND, // 69
+ TRANSSIGHTSND, // 70
+ TRANSDEATHSND, // 71
+ WILHELMSIGHTSND, // 72
+ WILHELMDEATHSND, // 73
+ UBERDEATHSND, // 74
+ KNIGHTSIGHTSND, // 75
+ KNIGHTDEATHSND, // 76
+ ANGELDEATHSND, // 77
+ KNIGHTMISSILESND, // 78
+ GETSPEARSND, // 79
+ ANGELTIREDSND, // 80
+ LASTSOUND
+ } soundnames;
+
+//
+// Base offsets
+//
+#define STARTPCSOUNDS 0
+#define STARTADLIBSOUNDS 81
+#define STARTDIGISOUNDS 162
+#define STARTMUSIC 243
+
+//
+// Music names & indexes
+//
+typedef enum {
+ XFUNKIE_MUS, // 0
+ DUNGEON_MUS, // 1
+ XDEATH_MUS, // 2
+ GETTHEM_MUS, // 3
+ XTIPTOE_MUS, // 4
+ GOINGAFT_MUS, // 5
+ URAHERO_MUS, // 6
+ XTHEEND_MUS, // 7
+ NAZI_OMI_MUS, // 8
+ POW_MUS, // 9
+ TWELFTH_MUS, // 10
+ SEARCHN_MUS, // 11
+ SUSPENSE_MUS, // 12
+ ZEROHOUR_MUS, // 13
+ WONDERIN_MUS, // 14
+ ULTIMATE_MUS, // 15
+ ENDLEVEL_MUS, // 16
+ XEVIL_MUS, // 17
+ XJAZNAZI_MUS, // 18
+ COPYPRO_MUS, // 19
+ XAWARD_MUS, // 20
+ XPUTIT_MUS, // 21
+ XGETYOU_MUS, // 22
+ XTOWER2_MUS, // 23
+ LASTMUSIC
+ } musicnames;
+
+/////////////////////////////////////////////////
+//
+// Thanks for playing with MUSE!
+//
+/////////////////////////////////////////////////
--- /dev/null
+++ b/audiosod.h
@@ -1,0 +1,142 @@
+/////////////////////////////////////////////////
+//
+// MUSE Header for .SOD
+// Created Thu Aug 13 09:25:58 1992
+//
+/////////////////////////////////////////////////
+
+#define NUMSOUNDS 81
+#define NUMSNDCHUNKS 267
+
+//
+// Sound names & indexes
+//
+typedef enum {
+ HITWALLSND, // 0
+ MISSILEHITSND, // 1
+ SELECTITEMSND, // 2
+ GHOSTSIGHTSND, // 3
+ MOVEGUN2SND, // 4
+ MOVEGUN1SND, // 5
+ NOWAYSND, // 6
+ NAZIHITPLAYERSND, // 7
+ MISSILEFIRESND, // 8
+ PLAYERDEATHSND, // 9
+ DOGDEATHSND, // 10
+ ATKGATLINGSND, // 11
+ GETKEYSND, // 12
+ NOITEMSND, // 13
+ WALK1SND, // 14
+ WALK2SND, // 15
+ TAKEDAMAGESND, // 16
+ GAMEOVERSND, // 17
+ OPENDOORSND, // 18
+ CLOSEDOORSND, // 19
+ DONOTHINGSND, // 20
+ HALTSND, // 21
+ DEATHSCREAM2SND, // 22
+ ATKKNIFESND, // 23
+ ATKPISTOLSND, // 24
+ DEATHSCREAM3SND, // 25
+ ATKMACHINEGUNSND, // 26
+ HITENEMYSND, // 27
+ SHOOTDOORSND, // 28
+ DEATHSCREAM1SND, // 29
+ GETMACHINESND, // 30
+ GETAMMOSND, // 31
+ SHOOTSND, // 32
+ HEALTH1SND, // 33
+ HEALTH2SND, // 34
+ BONUS1SND, // 35
+ BONUS2SND, // 36
+ BONUS3SND, // 37
+ GETGATLINGSND, // 38
+ ESCPRESSEDSND, // 39
+ LEVELDONESND, // 40
+ DOGBARKSND, // 41
+ ENDBONUS1SND, // 42
+ ENDBONUS2SND, // 43
+ BONUS1UPSND, // 44
+ BONUS4SND, // 45
+ PUSHWALLSND, // 46
+ NOBONUSSND, // 47
+ PERCENT100SND, // 48
+ BOSSACTIVESND, // 49
+ DEATHSCREAM4SND, // 50
+ SCHUTZADSND, // 51
+ AHHHGSND, // 52
+ DEATHSCREAM5SND, // 53
+ DEATHSCREAM7SND, // 54
+ DEATHSCREAM8SND, // 55
+ LEBENSND, // 56
+ DEATHSCREAM6SND, // 57
+ NAZIFIRESND, // 58
+ BOSSFIRESND, // 59
+ SSFIRESND, // 60
+ SLURPIESND, // 61
+ GHOSTFADESND, // 62
+ DEATHSCREAM9SND, // 63
+ GETAMMOBOXSND, // 64
+ ANGELSIGHTSND, // 65
+ SPIONSND, // 66
+ NEINSOVASSND, // 67
+ DOGATTACKSND, // 68
+ ANGELFIRESND, // 69
+ TRANSSIGHTSND, // 70
+ TRANSDEATHSND, // 71
+ WILHELMSIGHTSND, // 72
+ WILHELMDEATHSND, // 73
+ UBERDEATHSND, // 74
+ KNIGHTSIGHTSND, // 75
+ KNIGHTDEATHSND, // 76
+ ANGELDEATHSND, // 77
+ KNIGHTMISSILESND, // 78
+ GETSPEARSND, // 79
+ ANGELTIREDSND, // 80
+ LASTSOUND
+ } soundnames;
+
+//
+// Base offsets
+//
+#define STARTPCSOUNDS 0
+#define STARTADLIBSOUNDS 81
+#define STARTDIGISOUNDS 162
+#define STARTMUSIC 243
+
+//
+// Music names & indexes
+//
+typedef enum {
+ XFUNKIE_MUS, // 0
+ DUNGEON_MUS, // 1
+ XDEATH_MUS, // 2
+ GETTHEM_MUS, // 3
+ XTIPTOE_MUS, // 4
+ GOINGAFT_MUS, // 5
+ URAHERO_MUS, // 6
+ XTHEEND_MUS, // 7
+ NAZI_OMI_MUS, // 8
+ POW_MUS, // 9
+ TWELFTH_MUS, // 10
+ SEARCHN_MUS, // 11
+ SUSPENSE_MUS, // 12
+ ZEROHOUR_MUS, // 13
+ WONDERIN_MUS, // 14
+ ULTIMATE_MUS, // 15
+ ENDLEVEL_MUS, // 16
+ XEVIL_MUS, // 17
+ XJAZNAZI_MUS, // 18
+ COPYPRO_MUS, // 19
+ XAWARD_MUS, // 20
+ XPUTIT_MUS, // 21
+ XGETYOU_MUS, // 22
+ XTOWER2_MUS, // 23
+ LASTMUSIC
+ } musicnames;
+
+/////////////////////////////////////////////////
+//
+// Thanks for playing with MUSE!
+//
+/////////////////////////////////////////////////
--- /dev/null
+++ b/audiowl1.h
@@ -1,0 +1,133 @@
+/////////////////////////////////////////////////
+//
+// MUSE Header for .WL1
+// Created Tue Apr 28 23:57:08 1992
+//
+/////////////////////////////////////////////////
+
+#define NUMSOUNDS 69
+#define NUMSNDCHUNKS 234
+
+//
+// Sound names & indexes
+//
+typedef enum {
+ HITWALLSND, // 0
+ SELECTWPNSND, // 1
+ SELECTITEMSND, // 2
+ HEARTBEATSND, // 3
+ MOVEGUN2SND, // 4
+ MOVEGUN1SND, // 5
+ NOWAYSND, // 6
+ NAZIHITPLAYERSND, // 7
+ NAZIMISSSND, // 8
+ PLAYERDEATHSND, // 9
+ DOGDEATHSND, // 10
+ ATKGATLINGSND, // 11
+ GETKEYSND, // 12
+ NOITEMSND, // 13
+ WALK1SND, // 14
+ WALK2SND, // 15
+ TAKEDAMAGESND, // 16
+ GAMEOVERSND, // 17
+ OPENDOORSND, // 18
+ CLOSEDOORSND, // 19
+ DONOTHINGSND, // 20
+ HALTSND, // 21
+ DEATHSCREAM2SND, // 22
+ ATKKNIFESND, // 23
+ ATKPISTOLSND, // 24
+ DEATHSCREAM3SND, // 25
+ ATKMACHINEGUNSND, // 26
+ HITENEMYSND, // 27
+ SHOOTDOORSND, // 28
+ DEATHSCREAM1SND, // 29
+ GETMACHINESND, // 30
+ GETAMMOSND, // 31
+ SHOOTSND, // 32
+ HEALTH1SND, // 33
+ HEALTH2SND, // 34
+ BONUS1SND, // 35
+ BONUS2SND, // 36
+ BONUS3SND, // 37
+ GETGATLINGSND, // 38
+ ESCPRESSEDSND, // 39
+ LEVELDONESND, // 40
+ DOGBARKSND, // 41
+ ENDBONUS1SND, // 42
+ ENDBONUS2SND, // 43
+ BONUS1UPSND, // 44
+ BONUS4SND, // 45
+ PUSHWALLSND, // 46
+ NOBONUSSND, // 47
+ PERCENT100SND, // 48
+ BOSSACTIVESND, // 49
+ BOSSDIESSND, // 50
+ SCHUTZADSND, // 51
+ AHHHGSND, // 52
+ DIESND, // 53
+ EVASND, // 54
+ GUTENTAGSND, // 55
+ LEBENSND, // 56
+ MUTTISND, // 57
+ NAZIFIRESND, // 58
+ BOSSFIRESND, // 59
+ SSFIRESND, // 60
+ SLURPIESND, // 61
+ TOT_HUNDSND, // 62
+ MEINGOTTSND, // 63
+ SCHABBSHASND, // 64
+ HILTERHASND, // 65
+ SPIONSND, // 66
+ NEINSOVASSND, // 67
+ DOGATTACKSND, // 68
+ LASTSOUND
+ } soundnames;
+
+//
+// Base offsets
+//
+#define STARTPCSOUNDS 0
+#define STARTADLIBSOUNDS 69
+#define STARTDIGISOUNDS 138
+#define STARTMUSIC 207
+
+//
+// Music names & indexes
+//
+typedef enum {
+ CORNER_MUS, // 0
+ DUNGEON_MUS, // 1
+ GETOUT_MUS, // 2
+ GETTHEM_MUS, // 3
+ HEADACHE_MUS, // 4
+ HITLWLTZ_MUS, // 5
+ INTROCW3_MUS, // 6
+ NAZI_NOR_MUS, // 7
+ NAZI_OMI_MUS, // 8
+ POW_MUS, // 9
+ SALUTE_MUS, // 10
+ SEARCHN_MUS, // 11
+ SUSPENSE_MUS, // 12
+ VICTORS_MUS, // 13
+ WONDERIN_MUS, // 14
+ FUNKYOU_MUS, // 15
+ ENDLEVEL_MUS, // 16
+ GOINGAFT_MUS, // 17
+ PREGNANT_MUS, // 18
+ ULTIMATE_MUS, // 19
+ NAZI_RAP_MUS, // 20
+ ZEROHOUR_MUS, // 21
+ TWELFTH_MUS, // 22
+ ROSTER_MUS, // 23
+ URAHERO_MUS, // 24
+ VICMARCH_MUS, // 25
+ WARMRCH1_MUS, // 26
+ LASTMUSIC
+ } musicnames;
+
+/////////////////////////////////////////////////
+//
+// Thanks for playing with MUSE!
+//
+/////////////////////////////////////////////////
--- /dev/null
+++ b/audiowl6.h
@@ -1,0 +1,151 @@
+/////////////////////////////////////////////////
+//
+// MUSE Header for .WL6
+// Created Tue Jul 14 15:04:53 1992
+//
+/////////////////////////////////////////////////
+
+#define NUMSOUNDS 87
+#define NUMSNDCHUNKS 288
+
+//
+// Sound names & indexes
+//
+typedef enum {
+ HITWALLSND, // 0
+ SELECTWPNSND, // 1
+ SELECTITEMSND, // 2
+ HEARTBEATSND, // 3
+ MOVEGUN2SND, // 4
+ MOVEGUN1SND, // 5
+ NOWAYSND, // 6
+ NAZIHITPLAYERSND, // 7
+ SCHABBSTHROWSND, // 8
+ PLAYERDEATHSND, // 9
+ DOGDEATHSND, // 10
+ ATKGATLINGSND, // 11
+ GETKEYSND, // 12
+ NOITEMSND, // 13
+ WALK1SND, // 14
+ WALK2SND, // 15
+ TAKEDAMAGESND, // 16
+ GAMEOVERSND, // 17
+ OPENDOORSND, // 18
+ CLOSEDOORSND, // 19
+ DONOTHINGSND, // 20
+ HALTSND, // 21
+ DEATHSCREAM2SND, // 22
+ ATKKNIFESND, // 23
+ ATKPISTOLSND, // 24
+ DEATHSCREAM3SND, // 25
+ ATKMACHINEGUNSND, // 26
+ HITENEMYSND, // 27
+ SHOOTDOORSND, // 28
+ DEATHSCREAM1SND, // 29
+ GETMACHINESND, // 30
+ GETAMMOSND, // 31
+ SHOOTSND, // 32
+ HEALTH1SND, // 33
+ HEALTH2SND, // 34
+ BONUS1SND, // 35
+ BONUS2SND, // 36
+ BONUS3SND, // 37
+ GETGATLINGSND, // 38
+ ESCPRESSEDSND, // 39
+ LEVELDONESND, // 40
+ DOGBARKSND, // 41
+ ENDBONUS1SND, // 42
+ ENDBONUS2SND, // 43
+ BONUS1UPSND, // 44
+ BONUS4SND, // 45
+ PUSHWALLSND, // 46
+ NOBONUSSND, // 47
+ PERCENT100SND, // 48
+ BOSSACTIVESND, // 49
+ MUTTISND, // 50
+ SCHUTZADSND, // 51
+ AHHHGSND, // 52
+ DIESND, // 53
+ EVASND, // 54
+ GUTENTAGSND, // 55
+ LEBENSND, // 56
+ SCHEISTSND, // 57
+ NAZIFIRESND, // 58
+ BOSSFIRESND, // 59
+ SSFIRESND, // 60
+ SLURPIESND, // 61
+ TOT_HUNDSND, // 62
+ MEINGOTTSND, // 63
+ SCHABBSHASND, // 64
+ HITLERHASND, // 65
+ SPIONSND, // 66
+ NEINSOVASSND, // 67
+ DOGATTACKSND, // 68
+ FLAMETHROWERSND, // 69
+ MECHSTEPSND, // 70
+ GOOBSSND, // 71
+ YEAHSND, // 72
+ DEATHSCREAM4SND, // 73
+ DEATHSCREAM5SND, // 74
+ DEATHSCREAM6SND, // 75
+ DEATHSCREAM7SND, // 76
+ DEATHSCREAM8SND, // 77
+ DEATHSCREAM9SND, // 78
+ DONNERSND, // 79
+ EINESND, // 80
+ ERLAUBENSND, // 81
+ KEINSND, // 82
+ MEINSND, // 83
+ ROSESND, // 84
+ MISSILEFIRESND, // 85
+ MISSILEHITSND, // 86
+ LASTSOUND
+ } soundnames;
+
+//
+// Base offsets
+//
+#define STARTPCSOUNDS 0
+#define STARTADLIBSOUNDS 87
+#define STARTDIGISOUNDS 174
+#define STARTMUSIC 261
+
+//
+// Music names & indexes
+//
+typedef enum {
+ CORNER_MUS, // 0
+ DUNGEON_MUS, // 1
+ WARMARCH_MUS, // 2
+ GETTHEM_MUS, // 3
+ HEADACHE_MUS, // 4
+ HITLWLTZ_MUS, // 5
+ INTROCW3_MUS, // 6
+ NAZI_NOR_MUS, // 7
+ NAZI_OMI_MUS, // 8
+ POW_MUS, // 9
+ SALUTE_MUS, // 10
+ SEARCHN_MUS, // 11
+ SUSPENSE_MUS, // 12
+ VICTORS_MUS, // 13
+ WONDERIN_MUS, // 14
+ FUNKYOU_MUS, // 15
+ ENDLEVEL_MUS, // 16
+ GOINGAFT_MUS, // 17
+ PREGNANT_MUS, // 18
+ ULTIMATE_MUS, // 19
+ NAZI_RAP_MUS, // 20
+ ZEROHOUR_MUS, // 21
+ TWELFTH_MUS, // 22
+ ROSTER_MUS, // 23
+ URAHERO_MUS, // 24
+ VICMARCH_MUS, // 25
+ PACMAN_MUS, // 26
+ LASTMUSIC
+ } musicnames;
+
+/////////////////////////////////////////////////
+//
+// Thanks for playing with MUSE!
+//
+/////////////////////////////////////////////////
--- /dev/null
+++ b/budiosod.h
@@ -1,0 +1,142 @@
+/////////////////////////////////////////////////
+//
+// MUSE Header for .SOD
+// Created Thu Aug 13 09:25:58 1992
+//
+/////////////////////////////////////////////////
+
+#define NUMSOUNDS 81
+#define NUMSNDCHUNKS 267
+
+//
+// Sound names & indexes
+//
+typedef enum {
+ HITWALLSND, // 0
+ MISSILEHITSND, // 1
+ SELECTITEMSND, // 2
+ GHOSTSIGHTSND, // 3
+ MOVEGUN2SND, // 4
+ MOVEGUN1SND, // 5
+ NOWAYSND, // 6
+ NAZIHITPLAYERSND, // 7
+ MISSILEFIRESND, // 8
+ PLAYERDEATHSND, // 9
+ DOGDEATHSND, // 10
+ ATKGATLINGSND, // 11
+ GETKEYSND, // 12
+ NOITEMSND, // 13
+ WALK1SND, // 14
+ WALK2SND, // 15
+ TAKEDAMAGESND, // 16
+ GAMEOVERSND, // 17
+ OPENDOORSND, // 18
+ CLOSEDOORSND, // 19
+ DONOTHINGSND, // 20
+ HALTSND, // 21
+ DEATHSCREAM2SND, // 22
+ ATKKNIFESND, // 23
+ ATKPISTOLSND, // 24
+ DEATHSCREAM3SND, // 25
+ ATKMACHINEGUNSND, // 26
+ HITENEMYSND, // 27
+ SHOOTDOORSND, // 28
+ DEATHSCREAM1SND, // 29
+ GETMACHINESND, // 30
+ GETAMMOSND, // 31
+ SHOOTSND, // 32
+ HEALTH1SND, // 33
+ HEALTH2SND, // 34
+ BONUS1SND, // 35
+ BONUS2SND, // 36
+ BONUS3SND, // 37
+ GETGATLINGSND, // 38
+ ESCPRESSEDSND, // 39
+ LEVELDONESND, // 40
+ DOGBARKSND, // 41
+ ENDBONUS1SND, // 42
+ ENDBONUS2SND, // 43
+ BONUS1UPSND, // 44
+ BONUS4SND, // 45
+ PUSHWALLSND, // 46
+ NOBONUSSND, // 47
+ PERCENT100SND, // 48
+ BOSSACTIVESND, // 49
+ DEATHSCREAM4SND, // 50
+ SCHUTZADSND, // 51
+ AHHHGSND, // 52
+ DEATHSCREAM5SND, // 53
+ DEATHSCREAM7SND, // 54
+ DEATHSCREAM8SND, // 55
+ LEBENSND, // 56
+ DEATHSCREAM6SND, // 57
+ NAZIFIRESND, // 58
+ BOSSFIRESND, // 59
+ SSFIRESND, // 60
+ SLURPIESND, // 61
+ GHOSTFADESND, // 62
+ DEATHSCREAM9SND, // 63
+ GETAMMOBOXSND, // 64
+ ANGELSIGHTSND, // 65
+ SPIONSND, // 66
+ NEINSOVASSND, // 67
+ DOGATTACKSND, // 68
+ ANGELFIRESND, // 69
+ TRANSSIGHTSND, // 70
+ TRANSDEATHSND, // 71
+ WILHELMSIGHTSND, // 72
+ WILHELMDEATHSND, // 73
+ UBERDEATHSND, // 74
+ KNIGHTSIGHTSND, // 75
+ KNIGHTDEATHSND, // 76
+ ANGELDEATHSND, // 77
+ KNIGHTMISSILESND, // 78
+ GETSPEARSND, // 79
+ ANGELTIREDSND, // 80
+ LASTSOUND
+ } soundnames;
+
+//
+// Base offsets
+//
+#define STARTPCSOUNDS 0
+#define STARTADLIBSOUNDS 81
+#define STARTDIGISOUNDS 162
+#define STARTMUSIC 243
+
+//
+// Music names & indexes
+//
+typedef enum {
+ XFUNKIE_MUS, // 0
+ DUNGEON_MUS, // 1
+ XDEATH_MUS, // 2
+ GETTHEM_MUS, // 3
+ XTIPTOE_MUS, // 4
+ GOINGAFT_MUS, // 5
+ URAHERO_MUS, // 6
+ XTHEEND_MUS, // 7
+ NAZI_OMI_MUS, // 8
+ POW_MUS, // 9
+ TWELFTH_MUS, // 10
+ SEARCHN_MUS, // 11
+ SUSPENSE_MUS, // 12
+ ZEROHOUR_MUS, // 13
+ WONDERIN_MUS, // 14
+ ULTIMATE_MUS, // 15
+ ENDLEVEL_MUS, // 16
+ XEVIL_MUS, // 17
+ XJAZNAZI_MUS, // 18
+ COPYPRO_MUS, // 19
+ XAWARD_MUS, // 20
+ XPUTIT_MUS, // 21
+ XGETYOU_MUS, // 22
+ XTOWER2_MUS, // 23
+ LASTMUSIC
+ } musicnames;
+
+/////////////////////////////////////////////////
+//
+// Thanks for playing with MUSE!
+//
+/////////////////////////////////////////////////
--- /dev/null
+++ b/budiowl6.h
@@ -1,0 +1,151 @@
+/////////////////////////////////////////////////
+//
+// MUSE Header for .WL6
+// Created Sat May 30 18:41:31 1992
+//
+/////////////////////////////////////////////////
+
+#define NUMSOUNDS 87
+#define NUMSNDCHUNKS 288
+
+//
+// Sound names & indexes
+//
+typedef enum {
+ HITWALLSND, // 0
+ SELECTWPNSND, // 1
+ SELECTITEMSND, // 2
+ HEARTBEATSND, // 3
+ MOVEGUN2SND, // 4
+ MOVEGUN1SND, // 5
+ NOWAYSND, // 6
+ NAZIHITPLAYERSND, // 7
+ SCHABBSTHROWSND, // 8
+ PLAYERDEATHSND, // 9
+ DOGDEATHSND, // 10
+ ATKGATLINGSND, // 11
+ GETKEYSND, // 12
+ NOITEMSND, // 13
+ WALK1SND, // 14
+ WALK2SND, // 15
+ TAKEDAMAGESND, // 16
+ GAMEOVERSND, // 17
+ OPENDOORSND, // 18
+ CLOSEDOORSND, // 19
+ DONOTHINGSND, // 20
+ HALTSND, // 21
+ DEATHSCREAM2SND, // 22
+ ATKKNIFESND, // 23
+ ATKPISTOLSND, // 24
+ DEATHSCREAM3SND, // 25
+ ATKMACHINEGUNSND, // 26
+ HITENEMYSND, // 27
+ SHOOTDOORSND, // 28
+ DEATHSCREAM1SND, // 29
+ GETMACHINESND, // 30
+ GETAMMOSND, // 31
+ SHOOTSND, // 32
+ HEALTH1SND, // 33
+ HEALTH2SND, // 34
+ BONUS1SND, // 35
+ BONUS2SND, // 36
+ BONUS3SND, // 37
+ GETGATLINGSND, // 38
+ ESCPRESSEDSND, // 39
+ LEVELDONESND, // 40
+ DOGBARKSND, // 41
+ ENDBONUS1SND, // 42
+ ENDBONUS2SND, // 43
+ BONUS1UPSND, // 44
+ BONUS4SND, // 45
+ PUSHWALLSND, // 46
+ NOBONUSSND, // 47
+ PERCENT100SND, // 48
+ BOSSACTIVESND, // 49
+ MUTTISND, // 50
+ SCHUTZADSND, // 51
+ AHHHGSND, // 52
+ DIESND, // 53
+ EVASND, // 54
+ GUTENTAGSND, // 55
+ LEBENSND, // 56
+ SCHEISTSND, // 57
+ NAZIFIRESND, // 58
+ BOSSFIRESND, // 59
+ SSFIRESND, // 60
+ SLURPIESND, // 61
+ TOT_HUNDSND, // 62
+ MEINGOTTSND, // 63
+ SCHABBSHASND, // 64
+ HITLERHASND, // 65
+ SPIONSND, // 66
+ NEINSOVASSND, // 67
+ DOGATTACKSND, // 68
+ FLAMETHROWERSND, // 69
+ MECHSTEPSND, // 70
+ GOOBSSND, // 71
+ YEAHSND, // 72
+ DEATHSCREAM4SND, // 73
+ DEATHSCREAM5SND, // 74
+ DEATHSCREAM6SND, // 75
+ DEATHSCREAM7SND, // 76
+ DEATHSCREAM8SND, // 77
+ DEATHSCREAM9SND, // 78
+ DONNERSND, // 79
+ EINESND, // 80
+ ERLAUBENSND, // 81
+ KEINSND, // 82
+ MEINSND, // 83
+ ROSESND, // 84
+ MISSILEFIRESND, // 85
+ MISSILEHITSND, // 86
+ LASTSOUND
+ } soundnames;
+
+//
+// Base offsets
+//
+#define STARTPCSOUNDS 0
+#define STARTADLIBSOUNDS 87
+#define STARTDIGISOUNDS 174
+#define STARTMUSIC 261
+
+//
+// Music names & indexes
+//
+typedef enum {
+ CORNER_MUS, // 0
+ DUNGEON_MUS, // 1
+ WARMARCH_MUS, // 2
+ GETTHEM_MUS, // 3
+ HEADACHE_MUS, // 4
+ HITLWLTZ_MUS, // 5
+ INTROCW3_MUS, // 6
+ NAZI_NOR_MUS, // 7
+ NAZI_OMI_MUS, // 8
+ POW_MUS, // 9
+ SALUTE_MUS, // 10
+ SEARCHN_MUS, // 11
+ SUSPENSE_MUS, // 12
+ VICTORS_MUS, // 13
+ WONDERIN_MUS, // 14
+ FUNKYOU_MUS, // 15
+ ENDLEVEL_MUS, // 16
+ GOINGAFT_MUS, // 17
+ PREGNANT_MUS, // 18
+ ULTIMATE_MUS, // 19
+ NAZI_RAP_MUS, // 20
+ ZEROHOUR_MUS, // 21
+ TWELFTH_MUS, // 22
+ ROSTER_MUS, // 23
+ URAHERO_MUS, // 24
+ VICMARCH_MUS, // 25
+ PACMAN_MUS, // 26
+ LASTMUSIC
+ } musicnames;
+
+/////////////////////////////////////////////////
+//
+// Thanks for playing with MUSE!
+//
+/////////////////////////////////////////////////
--- /dev/null
+++ b/ca.c
@@ -1,0 +1,1768 @@
+// ID_CA.C
+
+// this has been customized for WOLF
+
+/*
+=============================================================================
+
+Id Software Caching Manager
+---------------------------
+
+Must be started BEFORE the memory manager, because it needs to get the headers
+loaded into the data segment
+
+=============================================================================
+*/
+
+#include "ID_HEADS.H"
+#pragma hdrstop
+
+#pragma warn -pro
+#pragma warn -use
+
+#define THREEBYTEGRSTARTS
+
+/*
+=============================================================================
+
+ LOCAL CONSTANTS
+
+=============================================================================
+*/
+
+typedef struct
+{
+ unsigned bit0,bit1; // 0-255 is a character, > is a pointer to a node
+} huffnode;
+
+
+typedef struct
+{
+ unsigned RLEWtag;
+ long headeroffsets[100];
+ byte tileinfo[];
+} mapfiletype;
+
+
+/*
+=============================================================================
+
+ GLOBAL VARIABLES
+
+=============================================================================
+*/
+
+byte _seg *tinf;
+int mapon;
+
+unsigned _seg *mapsegs[MAPPLANES];
+maptype _seg *mapheaderseg[NUMMAPS];
+byte _seg *audiosegs[NUMSNDCHUNKS];
+void _seg *grsegs[NUMCHUNKS];
+
+byte far grneeded[NUMCHUNKS];
+byte ca_levelbit,ca_levelnum;
+
+int profilehandle,debughandle;
+
+char audioname[13]="AUDIO.";
+
+/*
+=============================================================================
+
+ LOCAL VARIABLES
+
+=============================================================================
+*/
+
+extern long far CGAhead;
+extern long far EGAhead;
+extern byte CGAdict;
+extern byte EGAdict;
+extern byte far maphead;
+extern byte mapdict;
+extern byte far audiohead;
+extern byte audiodict;
+
+
+char extension[5], // Need a string, not constant to change cache files
+ gheadname[10]=GREXT"HEAD.",
+ gfilename[10]=GREXT"GRAPH.",
+ gdictname[10]=GREXT"DICT.",
+ mheadname[10]="MAPHEAD.",
+ mfilename[10]="MAPTEMP.",
+ aheadname[10]="AUDIOHED.",
+ afilename[10]="AUDIOT.";
+
+void CA_CannotOpen(char *string);
+
+long _seg *grstarts; // array of offsets in egagraph, -1 for sparse
+long _seg *audiostarts; // array of offsets in audio / audiot
+
+#ifdef GRHEADERLINKED
+huffnode *grhuffman;
+#else
+huffnode grhuffman[255];
+#endif
+
+#ifdef AUDIOHEADERLINKED
+huffnode *audiohuffman;
+#else
+huffnode audiohuffman[255];
+#endif
+
+
+int grhandle; // handle to EGAGRAPH
+int maphandle; // handle to MAPTEMP / GAMEMAPS
+int audiohandle; // handle to AUDIOT / AUDIO
+
+long chunkcomplen,chunkexplen;
+
+SDMode oldsoundmode;
+
+
+
+void CAL_CarmackExpand (unsigned far *source, unsigned far *dest,
+ unsigned length);
+
+
+#ifdef THREEBYTEGRSTARTS
+#define FILEPOSSIZE 3
+//#define GRFILEPOS(c) (*(long far *)(((byte far *)grstarts)+(c)*3)&0xffffff)
+long GRFILEPOS(int c)
+{
+ long value;
+ int offset;
+
+ offset = c*3;
+
+ value = *(long far *)(((byte far *)grstarts)+offset);
+
+ value &= 0x00ffffffl;
+
+ if (value == 0xffffffl)
+ value = -1;
+
+ return value;
+};
+#else
+#define FILEPOSSIZE 4
+#define GRFILEPOS(c) (grstarts[c])
+#endif
+
+/*
+=============================================================================
+
+ LOW LEVEL ROUTINES
+
+=============================================================================
+*/
+
+/*
+============================
+=
+= CA_OpenDebug / CA_CloseDebug
+=
+= Opens a binary file with the handle "debughandle"
+=
+============================
+*/
+
+void CA_OpenDebug (void)
+{
+ unlink ("DEBUG.TXT");
+ debughandle = open("DEBUG.TXT", O_CREAT | O_WRONLY | O_TEXT);
+}
+
+void CA_CloseDebug (void)
+{
+ close (debughandle);
+}
+
+
+
+/*
+============================
+=
+= CAL_GetGrChunkLength
+=
+= Gets the length of an explicit length chunk (not tiles)
+= The file pointer is positioned so the compressed data can be read in next.
+=
+============================
+*/
+
+void CAL_GetGrChunkLength (int chunk)
+{
+ lseek(grhandle,GRFILEPOS(chunk),SEEK_SET);
+ read(grhandle,&chunkexplen,sizeof(chunkexplen));
+ chunkcomplen = GRFILEPOS(chunk+1)-GRFILEPOS(chunk)-4;
+}
+
+
+/*
+==========================
+=
+= CA_FarRead
+=
+= Read from a file to a far pointer
+=
+==========================
+*/
+
+boolean CA_FarRead (int handle, byte far *dest, long length)
+{
+ if (length>0xffffl)
+ Quit ("CA_FarRead doesn't support 64K reads yet!");
+
+asm push ds
+asm mov bx,[handle]
+asm mov cx,[WORD PTR length]
+asm mov dx,[WORD PTR dest]
+asm mov ds,[WORD PTR dest+2]
+asm mov ah,0x3f // READ w/handle
+asm int 21h
+asm pop ds
+asm jnc good
+ errno = _AX;
+ return false;
+good:
+asm cmp ax,[WORD PTR length]
+asm je done
+ errno = EINVFMT; // user manager knows this is bad read
+ return false;
+done:
+ return true;
+}
+
+
+/*
+==========================
+=
+= CA_SegWrite
+=
+= Write from a file to a far pointer
+=
+==========================
+*/
+
+boolean CA_FarWrite (int handle, byte far *source, long length)
+{
+ if (length>0xffffl)
+ Quit ("CA_FarWrite doesn't support 64K reads yet!");
+
+asm push ds
+asm mov bx,[handle]
+asm mov cx,[WORD PTR length]
+asm mov dx,[WORD PTR source]
+asm mov ds,[WORD PTR source+2]
+asm mov ah,0x40 // WRITE w/handle
+asm int 21h
+asm pop ds
+asm jnc good
+ errno = _AX;
+ return false;
+good:
+asm cmp ax,[WORD PTR length]
+asm je done
+ errno = ENOMEM; // user manager knows this is bad write
+ return false;
+
+done:
+ return true;
+}
+
+
+/*
+==========================
+=
+= CA_ReadFile
+=
+= Reads a file into an allready allocated buffer
+=
+==========================
+*/
+
+boolean CA_ReadFile (char *filename, memptr *ptr)
+{
+ int handle;
+ long size;
+
+ if ((handle = open(filename,O_RDONLY | O_BINARY, S_IREAD)) == -1)
+ return false;
+
+ size = filelength (handle);
+ if (!CA_FarRead (handle,*ptr,size))
+ {
+ close (handle);
+ return false;
+ }
+ close (handle);
+ return true;
+}
+
+
+/*
+==========================
+=
+= CA_WriteFile
+=
+= Writes a file from a memory buffer
+=
+==========================
+*/
+
+boolean CA_WriteFile (char *filename, void far *ptr, long length)
+{
+ int handle;
+ long size;
+
+ handle = open(filename,O_CREAT | O_BINARY | O_WRONLY,
+ S_IREAD | S_IWRITE | S_IFREG);
+
+ if (handle == -1)
+ return false;
+
+ if (!CA_FarWrite (handle,ptr,length))
+ {
+ close (handle);
+ return false;
+ }
+ close (handle);
+ return true;
+}
+
+
+
+/*
+==========================
+=
+= CA_LoadFile
+=
+= Allocate space for and load a file
+=
+==========================
+*/
+
+boolean CA_LoadFile (char *filename, memptr *ptr)
+{
+ int handle;
+ long size;
+
+ if ((handle = open(filename,O_RDONLY | O_BINARY, S_IREAD)) == -1)
+ return false;
+
+ size = filelength (handle);
+ MM_GetPtr (ptr,size);
+ if (!CA_FarRead (handle,*ptr,size))
+ {
+ close (handle);
+ return false;
+ }
+ close (handle);
+ return true;
+}
+
+/*
+============================================================================
+
+ COMPRESSION routines, see JHUFF.C for more
+
+============================================================================
+*/
+
+
+
+/*
+===============
+=
+= CAL_OptimizeNodes
+=
+= Goes through a huffman table and changes the 256-511 node numbers to the
+= actular address of the node. Must be called before CAL_HuffExpand
+=
+===============
+*/
+
+void CAL_OptimizeNodes (huffnode *table)
+{
+ huffnode *node;
+ int i;
+
+ node = table;
+
+ for (i=0;i<255;i++)
+ {
+ if (node->bit0 >= 256)
+ node->bit0 = (unsigned)(table+(node->bit0-256));
+ if (node->bit1 >= 256)
+ node->bit1 = (unsigned)(table+(node->bit1-256));
+ node++;
+ }
+}
+
+
+
+/*
+======================
+=
+= CAL_HuffExpand
+=
+= Length is the length of the EXPANDED data
+= If screenhack, the data is decompressed in four planes directly
+= to the screen
+=
+======================
+*/
+
+void CAL_HuffExpand (byte huge *source, byte huge *dest,
+ long length,huffnode *hufftable, boolean screenhack)
+{
+// unsigned bit,byte,node,code;
+ unsigned sourceseg,sourceoff,destseg,destoff,endoff;
+ huffnode *headptr;
+ byte mapmask;
+// huffnode *nodeon;
+
+ headptr = hufftable+254; // head node is allways node 254
+
+ source++; // normalize
+ source--;
+ dest++;
+ dest--;
+
+ if (screenhack)
+ {
+ mapmask = 1;
+asm mov dx,SC_INDEX
+asm mov ax,SC_MAPMASK + 256
+asm out dx,ax
+ length >>= 2;
+ }
+
+ sourceseg = FP_SEG(source);
+ sourceoff = FP_OFF(source);
+ destseg = FP_SEG(dest);
+ destoff = FP_OFF(dest);
+ endoff = destoff+length;
+
+//
+// ds:si source
+// es:di dest
+// ss:bx node pointer
+//
+
+ if (length <0xfff0)
+ {
+
+//--------------------------
+// expand less than 64k of data
+//--------------------------
+
+asm mov bx,[headptr]
+
+asm mov si,[sourceoff]
+asm mov di,[destoff]
+asm mov es,[destseg]
+asm mov ds,[sourceseg]
+asm mov ax,[endoff]
+
+asm mov ch,[si] // load first byte
+asm inc si
+asm mov cl,1
+
+expandshort:
+asm test ch,cl // bit set?
+asm jnz bit1short
+asm mov dx,[ss:bx] // take bit0 path from node
+asm shl cl,1 // advance to next bit position
+asm jc newbyteshort
+asm jnc sourceupshort
+
+bit1short:
+asm mov dx,[ss:bx+2] // take bit1 path
+asm shl cl,1 // advance to next bit position
+asm jnc sourceupshort
+
+newbyteshort:
+asm mov ch,[si] // load next byte
+asm inc si
+asm mov cl,1 // back to first bit
+
+sourceupshort:
+asm or dh,dh // if dx<256 its a byte, else move node
+asm jz storebyteshort
+asm mov bx,dx // next node = (huffnode *)code
+asm jmp expandshort
+
+storebyteshort:
+asm mov [es:di],dl
+asm inc di // write a decopmpressed byte out
+asm mov bx,[headptr] // back to the head node for next bit
+
+asm cmp di,ax // done?
+asm jne expandshort
+
+//
+// perform screenhack if needed
+//
+asm test [screenhack],1
+asm jz notscreen
+asm shl [mapmask],1
+asm mov ah,[mapmask]
+asm cmp ah,16
+asm je notscreen // all four planes done
+asm mov dx,SC_INDEX
+asm mov al,SC_MAPMASK
+asm out dx,ax
+asm mov di,[destoff]
+asm mov ax,[endoff]
+asm jmp expandshort
+
+notscreen:;
+ }
+ else
+ {
+
+//--------------------------
+// expand more than 64k of data
+//--------------------------
+
+ length--;
+
+asm mov bx,[headptr]
+asm mov cl,1
+
+asm mov si,[sourceoff]
+asm mov di,[destoff]
+asm mov es,[destseg]
+asm mov ds,[sourceseg]
+
+asm lodsb // load first byte
+
+expand:
+asm test al,cl // bit set?
+asm jnz bit1
+asm mov dx,[ss:bx] // take bit0 path from node
+asm jmp gotcode
+bit1:
+asm mov dx,[ss:bx+2] // take bit1 path
+
+gotcode:
+asm shl cl,1 // advance to next bit position
+asm jnc sourceup
+asm lodsb
+asm cmp si,0x10 // normalize ds:si
+asm jb sinorm
+asm mov cx,ds
+asm inc cx
+asm mov ds,cx
+asm xor si,si
+sinorm:
+asm mov cl,1 // back to first bit
+
+sourceup:
+asm or dh,dh // if dx<256 its a byte, else move node
+asm jz storebyte
+asm mov bx,dx // next node = (huffnode *)code
+asm jmp expand
+
+storebyte:
+asm mov [es:di],dl
+asm inc di // write a decopmpressed byte out
+asm mov bx,[headptr] // back to the head node for next bit
+
+asm cmp di,0x10 // normalize es:di
+asm jb dinorm
+asm mov dx,es
+asm inc dx
+asm mov es,dx
+asm xor di,di
+dinorm:
+
+asm sub [WORD PTR ss:length],1
+asm jnc expand
+asm dec [WORD PTR ss:length+2]
+asm jns expand // when length = ffff ffff, done
+
+ }
+
+asm mov ax,ss
+asm mov ds,ax
+
+}
+
+
+/*
+======================
+=
+= CAL_CarmackExpand
+=
+= Length is the length of the EXPANDED data
+=
+======================
+*/
+
+#define NEARTAG 0xa7
+#define FARTAG 0xa8
+
+void CAL_CarmackExpand (unsigned far *source, unsigned far *dest, unsigned length)
+{
+ unsigned ch,chhigh,count,offset;
+ unsigned far *copyptr, far *inptr, far *outptr;
+
+ length/=2;
+
+ inptr = source;
+ outptr = dest;
+
+ while (length)
+ {
+ ch = *inptr++;
+ chhigh = ch>>8;
+ if (chhigh == NEARTAG)
+ {
+ count = ch&0xff;
+ if (!count)
+ { // have to insert a word containing the tag byte
+ ch |= *((unsigned char far *)inptr)++;
+ *outptr++ = ch;
+ length--;
+ }
+ else
+ {
+ offset = *((unsigned char far *)inptr)++;
+ copyptr = outptr - offset;
+ length -= count;
+ while (count--)
+ *outptr++ = *copyptr++;
+ }
+ }
+ else if (chhigh == FARTAG)
+ {
+ count = ch&0xff;
+ if (!count)
+ { // have to insert a word containing the tag byte
+ ch |= *((unsigned char far *)inptr)++;
+ *outptr++ = ch;
+ length --;
+ }
+ else
+ {
+ offset = *inptr++;
+ copyptr = dest + offset;
+ length -= count;
+ while (count--)
+ *outptr++ = *copyptr++;
+ }
+ }
+ else
+ {
+ *outptr++ = ch;
+ length --;
+ }
+ }
+}
+
+
+
+/*
+======================
+=
+= CA_RLEWcompress
+=
+======================
+*/
+
+long CA_RLEWCompress (unsigned huge *source, long length, unsigned huge *dest,
+ unsigned rlewtag)
+{
+ long complength;
+ unsigned value,count,i;
+ unsigned huge *start,huge *end;
+
+ start = dest;
+
+ end = source + (length+1)/2;
+
+//
+// compress it
+//
+ do
+ {
+ count = 1;
+ value = *source++;
+ while (*source == value && source<end)
+ {
+ count++;
+ source++;
+ }
+ if (count>3 || value == rlewtag)
+ {
+ //
+ // send a tag / count / value string
+ //
+ *dest++ = rlewtag;
+ *dest++ = count;
+ *dest++ = value;
+ }
+ else
+ {
+ //
+ // send word without compressing
+ //
+ for (i=1;i<=count;i++)
+ *dest++ = value;
+ }
+
+ } while (source<end);
+
+ complength = 2*(dest-start);
+ return complength;
+}
+
+
+/*
+======================
+=
+= CA_RLEWexpand
+= length is EXPANDED length
+=
+======================
+*/
+
+void CA_RLEWexpand (unsigned huge *source, unsigned huge *dest,long length,
+ unsigned rlewtag)
+{
+// unsigned value,count,i;
+ unsigned huge *end;
+ unsigned sourceseg,sourceoff,destseg,destoff,endseg,endoff;
+
+
+//
+// expand it
+//
+#if 0
+ do
+ {
+ value = *source++;
+ if (value != rlewtag)
+ //
+ // uncompressed
+ //
+ *dest++=value;
+ else
+ {
+ //
+ // compressed string
+ //
+ count = *source++;
+ value = *source++;
+ for (i=1;i<=count;i++)
+ *dest++ = value;
+ }
+ } while (dest<end);
+#endif
+
+ end = dest + (length)/2;
+ sourceseg = FP_SEG(source);
+ sourceoff = FP_OFF(source);
+ destseg = FP_SEG(dest);
+ destoff = FP_OFF(dest);
+ endseg = FP_SEG(end);
+ endoff = FP_OFF(end);
+
+
+//
+// ax = source value
+// bx = tag value
+// cx = repeat counts
+// dx = scratch
+//
+// NOTE: A repeat count that produces 0xfff0 bytes can blow this!
+//
+
+asm mov bx,rlewtag
+asm mov si,sourceoff
+asm mov di,destoff
+asm mov es,destseg
+asm mov ds,sourceseg
+
+expand:
+asm lodsw
+asm cmp ax,bx
+asm je repeat
+asm stosw
+asm jmp next
+
+repeat:
+asm lodsw
+asm mov cx,ax // repeat count
+asm lodsw // repeat value
+asm rep stosw
+
+next:
+
+asm cmp si,0x10 // normalize ds:si
+asm jb sinorm
+asm mov ax,si
+asm shr ax,1
+asm shr ax,1
+asm shr ax,1
+asm shr ax,1
+asm mov dx,ds
+asm add dx,ax
+asm mov ds,dx
+asm and si,0xf
+sinorm:
+asm cmp di,0x10 // normalize es:di
+asm jb dinorm
+asm mov ax,di
+asm shr ax,1
+asm shr ax,1
+asm shr ax,1
+asm shr ax,1
+asm mov dx,es
+asm add dx,ax
+asm mov es,dx
+asm and di,0xf
+dinorm:
+
+asm cmp di,ss:endoff
+asm jne expand
+asm mov ax,es
+asm cmp ax,ss:endseg
+asm jb expand
+
+asm mov ax,ss
+asm mov ds,ax
+
+}
+
+
+
+/*
+=============================================================================
+
+ CACHE MANAGER ROUTINES
+
+=============================================================================
+*/
+
+
+/*
+======================
+=
+= CAL_SetupGrFile
+=
+======================
+*/
+
+void CAL_SetupGrFile (void)
+{
+ char fname[13];
+ int handle;
+ memptr compseg;
+
+#ifdef GRHEADERLINKED
+
+ grhuffman = (huffnode *)&EGAdict;
+ grstarts = (long _seg *)FP_SEG(&EGAhead);
+
+ CAL_OptimizeNodes (grhuffman);
+
+#else
+
+//
+// load ???dict.ext (huffman dictionary for graphics files)
+//
+
+ strcpy(fname,gdictname);
+ strcat(fname,extension);
+
+ if ((handle = open(fname,
+ O_RDONLY | O_BINARY, S_IREAD)) == -1)
+ CA_CannotOpen(fname);
+
+ read(handle, &grhuffman, sizeof(grhuffman));
+ close(handle);
+ CAL_OptimizeNodes (grhuffman);
+//
+// load the data offsets from ???head.ext
+//
+ MM_GetPtr (&(memptr)grstarts,(NUMCHUNKS+1)*FILEPOSSIZE);
+
+ strcpy(fname,gheadname);
+ strcat(fname,extension);
+
+ if ((handle = open(fname,
+ O_RDONLY | O_BINARY, S_IREAD)) == -1)
+ CA_CannotOpen(fname);
+
+ CA_FarRead(handle, (memptr)grstarts, (NUMCHUNKS+1)*FILEPOSSIZE);
+
+ close(handle);
+
+
+#endif
+
+//
+// Open the graphics file, leaving it open until the game is finished
+//
+ strcpy(fname,gfilename);
+ strcat(fname,extension);
+
+ grhandle = open(fname, O_RDONLY | O_BINARY);
+ if (grhandle == -1)
+ CA_CannotOpen(fname);
+
+
+//
+// load the pic and sprite headers into the arrays in the data segment
+//
+ MM_GetPtr(&(memptr)pictable,NUMPICS*sizeof(pictabletype));
+ CAL_GetGrChunkLength(STRUCTPIC); // position file pointer
+ MM_GetPtr(&compseg,chunkcomplen);
+ CA_FarRead (grhandle,compseg,chunkcomplen);
+ CAL_HuffExpand (compseg, (byte huge *)pictable,NUMPICS*sizeof(pictabletype),grhuffman,false);
+ MM_FreePtr(&compseg);
+}
+
+//==========================================================================
+
+
+/*
+======================
+=
+= CAL_SetupMapFile
+=
+======================
+*/
+
+void CAL_SetupMapFile (void)
+{
+ int i;
+ int handle;
+ long length,pos;
+ char fname[13];
+
+//
+// load maphead.ext (offsets and tileinfo for map file)
+//
+#ifndef MAPHEADERLINKED
+ strcpy(fname,mheadname);
+ strcat(fname,extension);
+
+ if ((handle = open(fname,
+ O_RDONLY | O_BINARY, S_IREAD)) == -1)
+ CA_CannotOpen(fname);
+
+ length = filelength(handle);
+ MM_GetPtr (&(memptr)tinf,length);
+ CA_FarRead(handle, tinf, length);
+ close(handle);
+#else
+
+ tinf = (byte _seg *)FP_SEG(&maphead);
+
+#endif
+
+//
+// open the data file
+//
+#ifdef CARMACIZED
+ strcpy(fname,"GAMEMAPS.");
+ strcat(fname,extension);
+
+ if ((maphandle = open(fname,
+ O_RDONLY | O_BINARY, S_IREAD)) == -1)
+ CA_CannotOpen(fname);
+#else
+ strcpy(fname,mfilename);
+ strcat(fname,extension);
+
+ if ((maphandle = open(fname,
+ O_RDONLY | O_BINARY, S_IREAD)) == -1)
+ CA_CannotOpen(fname);
+#endif
+
+//
+// load all map header
+//
+ for (i=0;i<NUMMAPS;i++)
+ {
+ pos = ((mapfiletype _seg *)tinf)->headeroffsets[i];
+ if (pos<0) // $FFFFFFFF start is a sparse map
+ continue;
+
+ MM_GetPtr(&(memptr)mapheaderseg[i],sizeof(maptype));
+ MM_SetLock(&(memptr)mapheaderseg[i],true);
+ lseek(maphandle,pos,SEEK_SET);
+ CA_FarRead (maphandle,(memptr)mapheaderseg[i],sizeof(maptype));
+ }
+
+//
+// allocate space for 3 64*64 planes
+//
+ for (i=0;i<MAPPLANES;i++)
+ {
+ MM_GetPtr (&(memptr)mapsegs[i],64*64*2);
+ MM_SetLock (&(memptr)mapsegs[i],true);
+ }
+}
+
+
+//==========================================================================
+
+
+/*
+======================
+=
+= CAL_SetupAudioFile
+=
+======================
+*/
+
+void CAL_SetupAudioFile (void)
+{
+ int handle;
+ long length;
+ char fname[13];
+
+//
+// load maphead.ext (offsets and tileinfo for map file)
+//
+#ifndef AUDIOHEADERLINKED
+ strcpy(fname,aheadname);
+ strcat(fname,extension);
+
+ if ((handle = open(fname,
+ O_RDONLY | O_BINARY, S_IREAD)) == -1)
+ CA_CannotOpen(fname);
+
+ length = filelength(handle);
+ MM_GetPtr (&(memptr)audiostarts,length);
+ CA_FarRead(handle, (byte far *)audiostarts, length);
+ close(handle);
+#else
+ audiohuffman = (huffnode *)&audiodict;
+ CAL_OptimizeNodes (audiohuffman);
+ audiostarts = (long _seg *)FP_SEG(&audiohead);
+#endif
+
+//
+// open the data file
+//
+#ifndef AUDIOHEADERLINKED
+ strcpy(fname,afilename);
+ strcat(fname,extension);
+
+ if ((audiohandle = open(fname,
+ O_RDONLY | O_BINARY, S_IREAD)) == -1)
+ CA_CannotOpen(fname);
+#else
+ if ((audiohandle = open("AUDIO."EXTENSION,
+ O_RDONLY | O_BINARY, S_IREAD)) == -1)
+ Quit ("Can't open AUDIO."EXTENSION"!");
+#endif
+}
+
+//==========================================================================
+
+
+/*
+======================
+=
+= CA_Startup
+=
+= Open all files and load in headers
+=
+======================
+*/
+
+void CA_Startup (void)
+{
+#ifdef PROFILE
+ unlink ("PROFILE.TXT");
+ profilehandle = open("PROFILE.TXT", O_CREAT | O_WRONLY | O_TEXT);
+#endif
+
+ CAL_SetupMapFile ();
+ CAL_SetupGrFile ();
+ CAL_SetupAudioFile ();
+
+ mapon = -1;
+ ca_levelbit = 1;
+ ca_levelnum = 0;
+
+}
+
+//==========================================================================
+
+
+/*
+======================
+=
+= CA_Shutdown
+=
+= Closes all files
+=
+======================
+*/
+
+void CA_Shutdown (void)
+{
+#ifdef PROFILE
+ close (profilehandle);
+#endif
+
+ close (maphandle);
+ close (grhandle);
+ close (audiohandle);
+}
+
+//===========================================================================
+
+/*
+======================
+=
+= CA_CacheAudioChunk
+=
+======================
+*/
+
+void CA_CacheAudioChunk (int chunk)
+{
+ long pos,compressed;
+#ifdef AUDIOHEADERLINKED
+ long expanded;
+ memptr bigbufferseg;
+ byte far *source;
+#endif
+
+ if (audiosegs[chunk])
+ {
+ MM_SetPurge (&(memptr)audiosegs[chunk],0);
+ return; // allready in memory
+ }
+
+//
+// load the chunk into a buffer, either the miscbuffer if it fits, or allocate
+// a larger buffer
+//
+ pos = audiostarts[chunk];
+ compressed = audiostarts[chunk+1]-pos;
+
+ lseek(audiohandle,pos,SEEK_SET);
+
+#ifndef AUDIOHEADERLINKED
+
+ MM_GetPtr (&(memptr)audiosegs[chunk],compressed);
+ if (mmerror)
+ return;
+
+ CA_FarRead(audiohandle,audiosegs[chunk],compressed);
+
+#else
+
+ if (compressed<=BUFFERSIZE)
+ {
+ CA_FarRead(audiohandle,bufferseg,compressed);
+ source = bufferseg;
+ }
+ else
+ {
+ MM_GetPtr(&bigbufferseg,compressed);
+ if (mmerror)
+ return;
+ MM_SetLock (&bigbufferseg,true);
+ CA_FarRead(audiohandle,bigbufferseg,compressed);
+ source = bigbufferseg;
+ }
+
+ expanded = *(long far *)source;
+ source += 4; // skip over length
+ MM_GetPtr (&(memptr)audiosegs[chunk],expanded);
+ if (mmerror)
+ goto done;
+ CAL_HuffExpand (source,audiosegs[chunk],expanded,audiohuffman,false);
+
+done:
+ if (compressed>BUFFERSIZE)
+ MM_FreePtr(&bigbufferseg);
+#endif
+}
+
+//===========================================================================
+
+/*
+======================
+=
+= CA_LoadAllSounds
+=
+= Purges all sounds, then loads all new ones (mode switch)
+=
+======================
+*/
+
+void CA_LoadAllSounds (void)
+{
+ unsigned start,i;
+
+ switch (oldsoundmode)
+ {
+ case sdm_Off:
+ goto cachein;
+ case sdm_PC:
+ start = STARTPCSOUNDS;
+ break;
+ case sdm_AdLib:
+ start = STARTADLIBSOUNDS;
+ break;
+ }
+
+ for (i=0;i<NUMSOUNDS;i++,start++)
+ if (audiosegs[start])
+ MM_SetPurge (&(memptr)audiosegs[start],3); // make purgable
+
+cachein:
+
+ switch (SoundMode)
+ {
+ case sdm_Off:
+ return;
+ case sdm_PC:
+ start = STARTPCSOUNDS;
+ break;
+ case sdm_AdLib:
+ start = STARTADLIBSOUNDS;
+ break;
+ }
+
+ for (i=0;i<NUMSOUNDS;i++,start++)
+ CA_CacheAudioChunk (start);
+
+ oldsoundmode = SoundMode;
+}
+
+//===========================================================================
+
+
+/*
+======================
+=
+= CAL_ExpandGrChunk
+=
+= Does whatever is needed with a pointer to a compressed chunk
+=
+======================
+*/
+
+void CAL_ExpandGrChunk (int chunk, byte far *source)
+{
+ long expanded;
+
+
+ if (chunk >= STARTTILE8 && chunk < STARTEXTERNS)
+ {
+ //
+ // expanded sizes of tile8/16/32 are implicit
+ //
+
+#define BLOCK 64
+#define MASKBLOCK 128
+
+ if (chunk<STARTTILE8M) // tile 8s are all in one chunk!
+ expanded = BLOCK*NUMTILE8;
+ else if (chunk<STARTTILE16)
+ expanded = MASKBLOCK*NUMTILE8M;
+ else if (chunk<STARTTILE16M) // all other tiles are one/chunk
+ expanded = BLOCK*4;
+ else if (chunk<STARTTILE32)
+ expanded = MASKBLOCK*4;
+ else if (chunk<STARTTILE32M)
+ expanded = BLOCK*16;
+ else
+ expanded = MASKBLOCK*16;
+ }
+ else
+ {
+ //
+ // everything else has an explicit size longword
+ //
+ expanded = *(long far *)source;
+ source += 4; // skip over length
+ }
+
+//
+// allocate final space, decompress it, and free bigbuffer
+// Sprites need to have shifts made and various other junk
+//
+ MM_GetPtr (&grsegs[chunk],expanded);
+ if (mmerror)
+ return;
+ CAL_HuffExpand (source,grsegs[chunk],expanded,grhuffman,false);
+}
+
+
+/*
+======================
+=
+= CA_CacheGrChunk
+=
+= Makes sure a given chunk is in memory, loadiing it if needed
+=
+======================
+*/
+
+void CA_CacheGrChunk (int chunk)
+{
+ long pos,compressed;
+ memptr bigbufferseg;
+ byte far *source;
+ int next;
+
+ grneeded[chunk] |= ca_levelbit; // make sure it doesn't get removed
+ if (grsegs[chunk])
+ {
+ MM_SetPurge (&grsegs[chunk],0);
+ return; // allready in memory
+ }
+
+//
+// load the chunk into a buffer, either the miscbuffer if it fits, or allocate
+// a larger buffer
+//
+ pos = GRFILEPOS(chunk);
+ if (pos<0) // $FFFFFFFF start is a sparse tile
+ return;
+
+ next = chunk +1;
+ while (GRFILEPOS(next) == -1) // skip past any sparse tiles
+ next++;
+
+ compressed = GRFILEPOS(next)-pos;
+
+ lseek(grhandle,pos,SEEK_SET);
+
+ if (compressed<=BUFFERSIZE)
+ {
+ CA_FarRead(grhandle,bufferseg,compressed);
+ source = bufferseg;
+ }
+ else
+ {
+ MM_GetPtr(&bigbufferseg,compressed);
+ MM_SetLock (&bigbufferseg,true);
+ CA_FarRead(grhandle,bigbufferseg,compressed);
+ source = bigbufferseg;
+ }
+
+ CAL_ExpandGrChunk (chunk,source);
+
+ if (compressed>BUFFERSIZE)
+ MM_FreePtr(&bigbufferseg);
+}
+
+
+
+//==========================================================================
+
+/*
+======================
+=
+= CA_CacheScreen
+=
+= Decompresses a chunk from disk straight onto the screen
+=
+======================
+*/
+
+void CA_CacheScreen (int chunk)
+{
+ long pos,compressed,expanded;
+ memptr bigbufferseg;
+ byte far *source;
+ int next;
+
+//
+// load the chunk into a buffer
+//
+ pos = GRFILEPOS(chunk);
+ next = chunk +1;
+ while (GRFILEPOS(next) == -1) // skip past any sparse tiles
+ next++;
+ compressed = GRFILEPOS(next)-pos;
+
+ lseek(grhandle,pos,SEEK_SET);
+
+ MM_GetPtr(&bigbufferseg,compressed);
+ MM_SetLock (&bigbufferseg,true);
+ CA_FarRead(grhandle,bigbufferseg,compressed);
+ source = bigbufferseg;
+
+ expanded = *(long far *)source;
+ source += 4; // skip over length
+
+//
+// allocate final space, decompress it, and free bigbuffer
+// Sprites need to have shifts made and various other junk
+//
+ CAL_HuffExpand (source,MK_FP(SCREENSEG,bufferofs),expanded,grhuffman,true);
+ VW_MarkUpdateBlock (0,0,319,199);
+ MM_FreePtr(&bigbufferseg);
+}
+
+//==========================================================================
+
+/*
+======================
+=
+= CA_CacheMap
+=
+= WOLF: This is specialized for a 64*64 map size
+=
+======================
+*/
+
+void CA_CacheMap (int mapnum)
+{
+ long pos,compressed;
+ int plane;
+ memptr *dest,bigbufferseg;
+ unsigned size;
+ unsigned far *source;
+#ifdef CARMACIZED
+ memptr buffer2seg;
+ long expanded;
+#endif
+
+ mapon = mapnum;
+
+//
+// load the planes into the allready allocated buffers
+//
+ size = 64*64*2;
+
+ for (plane = 0; plane<MAPPLANES; plane++)
+ {
+ pos = mapheaderseg[mapnum]->planestart[plane];
+ compressed = mapheaderseg[mapnum]->planelength[plane];
+
+ dest = &(memptr)mapsegs[plane];
+
+ lseek(maphandle,pos,SEEK_SET);
+ if (compressed<=BUFFERSIZE)
+ source = bufferseg;
+ else
+ {
+ MM_GetPtr(&bigbufferseg,compressed);
+ MM_SetLock (&bigbufferseg,true);
+ source = bigbufferseg;
+ }
+
+ CA_FarRead(maphandle,(byte far *)source,compressed);
+#ifdef CARMACIZED
+ //
+ // unhuffman, then unRLEW
+ // The huffman'd chunk has a two byte expanded length first
+ // The resulting RLEW chunk also does, even though it's not really
+ // needed
+ //
+ expanded = *source;
+ source++;
+ MM_GetPtr (&buffer2seg,expanded);
+ CAL_CarmackExpand (source, (unsigned far *)buffer2seg,expanded);
+ CA_RLEWexpand (((unsigned far *)buffer2seg)+1,*dest,size,
+ ((mapfiletype _seg *)tinf)->RLEWtag);
+ MM_FreePtr (&buffer2seg);
+
+#else
+ //
+ // unRLEW, skipping expanded length
+ //
+ CA_RLEWexpand (source+1, *dest,size,
+ ((mapfiletype _seg *)tinf)->RLEWtag);
+#endif
+
+ if (compressed>BUFFERSIZE)
+ MM_FreePtr(&bigbufferseg);
+ }
+}
+
+//===========================================================================
+
+/*
+======================
+=
+= CA_UpLevel
+=
+= Goes up a bit level in the needed lists and clears it out.
+= Everything is made purgable
+=
+======================
+*/
+
+void CA_UpLevel (void)
+{
+ int i;
+
+ if (ca_levelnum==7)
+ Quit ("CA_UpLevel: Up past level 7!");
+
+ for (i=0;i<NUMCHUNKS;i++)
+ if (grsegs[i])
+ MM_SetPurge (&(memptr)grsegs[i],3);
+ ca_levelbit<<=1;
+ ca_levelnum++;
+}
+
+//===========================================================================
+
+/*
+======================
+=
+= CA_DownLevel
+=
+= Goes down a bit level in the needed lists and recaches
+= everything from the lower level
+=
+======================
+*/
+
+void CA_DownLevel (void)
+{
+ if (!ca_levelnum)
+ Quit ("CA_DownLevel: Down past level 0!");
+ ca_levelbit>>=1;
+ ca_levelnum--;
+ CA_CacheMarks();
+}
+
+//===========================================================================
+
+/*
+======================
+=
+= CA_ClearMarks
+=
+= Clears out all the marks at the current level
+=
+======================
+*/
+
+void CA_ClearMarks (void)
+{
+ int i;
+
+ for (i=0;i<NUMCHUNKS;i++)
+ grneeded[i]&=~ca_levelbit;
+}
+
+
+//===========================================================================
+
+/*
+======================
+=
+= CA_ClearAllMarks
+=
+= Clears out all the marks on all the levels
+=
+======================
+*/
+
+void CA_ClearAllMarks (void)
+{
+ _fmemset (grneeded,0,sizeof(grneeded));
+ ca_levelbit = 1;
+ ca_levelnum = 0;
+}
+
+
+//===========================================================================
+
+
+/*
+======================
+=
+= CA_FreeGraphics
+=
+======================
+*/
+
+
+void CA_SetGrPurge (void)
+{
+ int i;
+
+//
+// free graphics
+//
+ CA_ClearMarks ();
+
+ for (i=0;i<NUMCHUNKS;i++)
+ if (grsegs[i])
+ MM_SetPurge (&(memptr)grsegs[i],3);
+}
+
+
+
+/*
+======================
+=
+= CA_SetAllPurge
+=
+= Make everything possible purgable
+=
+======================
+*/
+
+void CA_SetAllPurge (void)
+{
+ int i;
+
+
+//
+// free sounds
+//
+ for (i=0;i<NUMSNDCHUNKS;i++)
+ if (audiosegs[i])
+ MM_SetPurge (&(memptr)audiosegs[i],3);
+
+//
+// free graphics
+//
+ CA_SetGrPurge ();
+}
+
+
+//===========================================================================
+
+/*
+======================
+=
+= CA_CacheMarks
+=
+======================
+*/
+#define MAXEMPTYREAD 1024
+
+void CA_CacheMarks (void)
+{
+ int i,next,numcache;
+ long pos,endpos,nextpos,nextendpos,compressed;
+ long bufferstart,bufferend; // file position of general buffer
+ byte far *source;
+ memptr bigbufferseg;
+
+ numcache = 0;
+//
+// go through and make everything not needed purgable
+//
+ for (i=0;i<NUMCHUNKS;i++)
+ if (grneeded[i]&ca_levelbit)
+ {
+ if (grsegs[i]) // its allready in memory, make
+ MM_SetPurge(&grsegs[i],0); // sure it stays there!
+ else
+ numcache++;
+ }
+ else
+ {
+ if (grsegs[i]) // not needed, so make it purgeable
+ MM_SetPurge(&grsegs[i],3);
+ }
+
+ if (!numcache) // nothing to cache!
+ return;
+
+
+//
+// go through and load in anything still needed
+//
+ bufferstart = bufferend = 0; // nothing good in buffer now
+
+ for (i=0;i<NUMCHUNKS;i++)
+ if ( (grneeded[i]&ca_levelbit) && !grsegs[i])
+ {
+ pos = GRFILEPOS(i);
+ if (pos<0)
+ continue;
+
+ next = i +1;
+ while (GRFILEPOS(next) == -1) // skip past any sparse tiles
+ next++;
+
+ compressed = GRFILEPOS(next)-pos;
+ endpos = pos+compressed;
+
+ if (compressed<=BUFFERSIZE)
+ {
+ if (bufferstart<=pos
+ && bufferend>= endpos)
+ {
+ // data is allready in buffer
+ source = (byte _seg *)bufferseg+(pos-bufferstart);
+ }
+ else
+ {
+ // load buffer with a new block from disk
+ // try to get as many of the needed blocks in as possible
+ while ( next < NUMCHUNKS )
+ {
+ while (next < NUMCHUNKS &&
+ !(grneeded[next]&ca_levelbit && !grsegs[next]))
+ next++;
+ if (next == NUMCHUNKS)
+ continue;
+
+ nextpos = GRFILEPOS(next);
+ while (GRFILEPOS(++next) == -1) // skip past any sparse tiles
+ ;
+ nextendpos = GRFILEPOS(next);
+ if (nextpos - endpos <= MAXEMPTYREAD
+ && nextendpos-pos <= BUFFERSIZE)
+ endpos = nextendpos;
+ else
+ next = NUMCHUNKS; // read pos to posend
+ }
+
+ lseek(grhandle,pos,SEEK_SET);
+ CA_FarRead(grhandle,bufferseg,endpos-pos);
+ bufferstart = pos;
+ bufferend = endpos;
+ source = bufferseg;
+ }
+ }
+ else
+ {
+ // big chunk, allocate temporary buffer
+ MM_GetPtr(&bigbufferseg,compressed);
+ if (mmerror)
+ return;
+ MM_SetLock (&bigbufferseg,true);
+ lseek(grhandle,pos,SEEK_SET);
+ CA_FarRead(grhandle,bigbufferseg,compressed);
+ source = bigbufferseg;
+ }
+
+ CAL_ExpandGrChunk (i,source);
+ if (mmerror)
+ return;
+
+ if (compressed>BUFFERSIZE)
+ MM_FreePtr(&bigbufferseg);
+
+ }
+}
+
+void CA_CannotOpen(char *string)
+{
+ char str[30];
+
+ strcpy(str,"Can't open ");
+ strcat(str,string);
+ strcat(str,"!\n");
+ Quit (str);
+}
\ No newline at end of file
--- /dev/null
+++ b/ca.h
@@ -1,0 +1,101 @@
+// ID_CA.H
+//===========================================================================
+
+#define NUMMAPS 60
+#define MAPPLANES 2
+
+#define UNCACHEGRCHUNK(chunk) {MM_FreePtr(&grsegs[chunk]);grneeded[chunk]&=~ca_levelbit;}
+
+//===========================================================================
+
+typedef struct
+{
+ long planestart[3];
+ unsigned planelength[3];
+ unsigned width,height;
+ char name[16];
+} maptype;
+
+//===========================================================================
+
+extern char audioname[13];
+
+extern byte _seg *tinf;
+extern int mapon;
+
+extern unsigned _seg *mapsegs[MAPPLANES];
+extern maptype _seg *mapheaderseg[NUMMAPS];
+extern byte _seg *audiosegs[NUMSNDCHUNKS];
+extern void _seg *grsegs[NUMCHUNKS];
+
+extern byte far grneeded[NUMCHUNKS];
+extern byte ca_levelbit,ca_levelnum;
+
+extern char *titleptr[8];
+
+extern int profilehandle,debughandle;
+
+extern char extension[5],
+ gheadname[10],
+ gfilename[10],
+ gdictname[10],
+ mheadname[10],
+ mfilename[10],
+ aheadname[10],
+ afilename[10];
+
+extern long _seg *grstarts; // array of offsets in egagraph, -1 for sparse
+extern long _seg *audiostarts; // array of offsets in audio / audiot
+//
+// hooks for custom cache dialogs
+//
+extern void (*drawcachebox) (char *title, unsigned numcache);
+extern void (*updatecachebox) (void);
+extern void (*finishcachebox) (void);
+
+//===========================================================================
+
+// just for the score box reshifting
+
+void CAL_ShiftSprite (unsigned segment,unsigned source,unsigned dest,
+ unsigned width, unsigned height, unsigned pixshift);
+
+//===========================================================================
+
+void CA_OpenDebug (void);
+void CA_CloseDebug (void);
+boolean CA_FarRead (int handle, byte far *dest, long length);
+boolean CA_FarWrite (int handle, byte far *source, long length);
+boolean CA_ReadFile (char *filename, memptr *ptr);
+boolean CA_LoadFile (char *filename, memptr *ptr);
+boolean CA_WriteFile (char *filename, void far *ptr, long length);
+
+long CA_RLEWCompress (unsigned huge *source, long length, unsigned huge *dest,
+ unsigned rlewtag);
+
+void CA_RLEWexpand (unsigned huge *source, unsigned huge *dest,long length,
+ unsigned rlewtag);
+
+void CA_Startup (void);
+void CA_Shutdown (void);
+
+void CA_SetGrPurge (void);
+void CA_CacheAudioChunk (int chunk);
+void CA_LoadAllSounds (void);
+
+void CA_UpLevel (void);
+void CA_DownLevel (void);
+
+void CA_SetAllPurge (void);
+
+void CA_ClearMarks (void);
+void CA_ClearAllMarks (void);
+
+#define CA_MarkGrChunk(chunk) grneeded[chunk]|=ca_levelbit
+
+void CA_CacheGrChunk (int chunk);
+void CA_CacheMap (int mapnum);
+
+void CA_CacheMarks (void);
+
+void CA_CacheScreen (int chunk);
--- /dev/null
+++ b/debug.c
@@ -1,0 +1,722 @@
+// WL_DEBUG.C
+
+#include "WL_DEF.H"
+#pragma hdrstop
+#include <BIOS.H>
+
+/*
+=============================================================================
+
+ LOCAL CONSTANTS
+
+=============================================================================
+*/
+
+#define VIEWTILEX (viewwidth/16)
+#define VIEWTILEY (viewheight/16)
+
+/*
+=============================================================================
+
+ GLOBAL VARIABLES
+
+=============================================================================
+*/
+
+
+int DebugKeys (void);
+
+/*
+=============================================================================
+
+ LOCAL VARIABLES
+
+=============================================================================
+*/
+
+
+int maporgx;
+int maporgy;
+enum {mapview,tilemapview,actoratview,visview} viewtype;
+
+void ViewMap (void);
+
+//===========================================================================
+
+/*
+==================
+=
+= DebugMemory
+=
+==================
+*/
+
+void DebugMemory (void)
+{
+ int i;
+ char scratch[80],str[10];
+ long mem;
+ spritetype _seg *block;
+
+ CenterWindow (16,7);
+
+ US_CPrint ("Memory Usage");
+ US_CPrint ("------------");
+ US_Print ("Total :");
+ US_PrintUnsigned (mminfo.mainmem/1024);
+ US_Print ("k\nFree :");
+ US_PrintUnsigned (MM_UnusedMemory()/1024);
+ US_Print ("k\nWith purge:");
+ US_PrintUnsigned (MM_TotalFree()/1024);
+ US_Print ("k\n");
+ VW_UpdateScreen();
+ IN_Ack ();
+}
+
+//===========================================================================
+
+/*
+==================
+=
+= CountObjects
+=
+==================
+*/
+
+void CountObjects (void)
+{
+ int i,total,count,active,inactive,doors;
+ objtype *obj;
+
+ CenterWindow (16,7);
+ active = inactive = count = doors = 0;
+
+ US_Print ("Total statics :");
+ total = laststatobj-&statobjlist[0];
+ US_PrintUnsigned (total);
+
+ US_Print ("\nIn use statics:");
+ for (i=0;i<total;i++)
+ if (statobjlist[i].shapenum != -1)
+ count++;
+ else
+ doors++; //debug
+ US_PrintUnsigned (count);
+
+ US_Print ("\nDoors :");
+ US_PrintUnsigned (doornum);
+
+ for (obj=player->next;obj;obj=obj->next)
+ {
+ if (obj->active)
+ active++;
+ else
+ inactive++;
+ }
+
+ US_Print ("\nTotal actors :");
+ US_PrintUnsigned (active+inactive);
+
+ US_Print ("\nActive actors :");
+ US_PrintUnsigned (active);
+
+ VW_UpdateScreen();
+ IN_Ack ();
+}
+
+//===========================================================================
+
+/*
+================
+=
+= PicturePause
+=
+================
+*/
+
+void PicturePause (void)
+{
+ int i;
+ byte p;
+ unsigned x;
+ byte far *dest,far *src;
+ memptr buffer;
+
+ VW_ColorBorder (15);
+ FinishPaletteShifts ();
+
+ LastScan = 0;
+ while (!LastScan)
+ ;
+ if (LastScan != sc_Enter)
+ {
+ VW_ColorBorder (0);
+ return;
+ }
+
+ VW_ColorBorder (1);
+ VW_SetScreen (0,0);
+//
+// vga stuff...
+//
+
+ ClearMemory ();
+ CA_SetAllPurge();
+ MM_GetPtr (&buffer,64000);
+ for (p=0;p<4;p++)
+ {
+ src = MK_FP(0xa000,displayofs);
+ dest = (byte far *)buffer+p;
+ VGAREADMAP(p);
+ for (x=0;x<16000;x++,dest+=4)
+ *dest = *src++;
+ }
+
+
+#if 0
+ for (p=0;p<4;p++)
+ {
+ src = MK_FP(0xa000,0);
+ dest = (byte far *)buffer+51200+p;
+ VGAREADMAP(p);
+ for (x=0;x<3200;x++,dest+=4)
+ *dest = *src++;
+ }
+#endif
+
+ asm mov ax,0x13
+ asm int 0x10
+
+ dest = MK_FP(0xa000,0);
+ _fmemcpy (dest,buffer,64000);
+
+ VL_SetPalette (&gamepal);
+
+
+ IN_Shutdown ();
+
+ VW_WaitVBL(70);
+ bioskey(0);
+ VW_WaitVBL(70);
+ Quit (NULL);
+}
+
+
+//===========================================================================
+
+
+/*
+================
+=
+= ShapeTest
+=
+================
+*/
+
+#pragma warn -pia
+void ShapeTest (void)
+{
+extern word NumDigi;
+extern word _seg *DigiList;
+static char buf[10];
+
+ boolean done;
+ ScanCode scan;
+ int i,j,k,x;
+ longword l;
+ memptr addr;
+ PageListStruct far *page;
+
+ CenterWindow(20,16);
+ VW_UpdateScreen();
+ for (i = 0,done = false;!done;)
+ {
+ US_ClearWindow();
+// sound = -1;
+
+ page = &PMPages[i];
+ US_Print(" Page #");
+ US_PrintUnsigned(i);
+ if (i < PMSpriteStart)
+ US_Print(" (Wall)");
+ else if (i < PMSoundStart)
+ US_Print(" (Sprite)");
+ else if (i == ChunksInFile - 1)
+ US_Print(" (Sound Info)");
+ else
+ US_Print(" (Sound)");
+
+ US_Print("\n XMS: ");
+ if (page->xmsPage != -1)
+ US_PrintUnsigned(page->xmsPage);
+ else
+ US_Print("No");
+
+ US_Print("\n Main: ");
+ if (page->mainPage != -1)
+ US_PrintUnsigned(page->mainPage);
+ else if (page->emsPage != -1)
+ {
+ US_Print("EMS ");
+ US_PrintUnsigned(page->emsPage);
+ }
+ else
+ US_Print("No");
+
+ US_Print("\n Last hit: ");
+ US_PrintUnsigned(page->lastHit);
+
+ US_Print("\n Address: ");
+ addr = PM_GetPageAddress(i);
+ sprintf(buf,"0x%04x",(word)addr);
+ US_Print(buf);
+
+ if (addr)
+ {
+ if (i < PMSpriteStart)
+ {
+ //
+ // draw the wall
+ //
+ bufferofs += 32*SCREENWIDTH;
+ postx = 128;
+ postwidth = 1;
+ postsource = ((long)((unsigned)addr))<<16;
+ for (x=0;x<64;x++,postx++,postsource+=64)
+ {
+ wallheight[postx] = 256;
+ FarScalePost ();
+ }
+ bufferofs -= 32*SCREENWIDTH;
+ }
+ else if (i < PMSoundStart)
+ {
+ //
+ // draw the sprite
+ //
+ bufferofs += 32*SCREENWIDTH;
+ SimpleScaleShape (160, i-PMSpriteStart, 64);
+ bufferofs -= 32*SCREENWIDTH;
+ }
+ else if (i == ChunksInFile - 1)
+ {
+ US_Print("\n\n Number of sounds: ");
+ US_PrintUnsigned(NumDigi);
+ for (l = j = k = 0;j < NumDigi;j++)
+ {
+ l += DigiList[(j * 2) + 1];
+ k += (DigiList[(j * 2) + 1] + (PMPageSize - 1)) / PMPageSize;
+ }
+ US_Print("\n Total bytes: ");
+ US_PrintUnsigned(l);
+ US_Print("\n Total pages: ");
+ US_PrintUnsigned(k);
+ }
+ else
+ {
+ byte far *dp = (byte far *)MK_FP(addr,0);
+ for (j = 0;j < NumDigi;j++)
+ {
+ k = (DigiList[(j * 2) + 1] + (PMPageSize - 1)) / PMPageSize;
+ if
+ (
+ (i >= PMSoundStart + DigiList[j * 2])
+ && (i < PMSoundStart + DigiList[j * 2] + k)
+ )
+ break;
+ }
+ if (j < NumDigi)
+ {
+// sound = j;
+ US_Print("\n Sound #");
+ US_PrintUnsigned(j);
+ US_Print("\n Segment #");
+ US_PrintUnsigned(i - PMSoundStart - DigiList[j * 2]);
+ }
+ for (j = 0;j < page->length;j += 32)
+ {
+ byte v = dp[j];
+ int v2 = (unsigned)v;
+ v2 -= 128;
+ v2 /= 4;
+ if (v2 < 0)
+ VWB_Vlin(WindowY + WindowH - 32 + v2,
+ WindowY + WindowH - 32,
+ WindowX + 8 + (j / 32),BLACK);
+ else
+ VWB_Vlin(WindowY + WindowH - 32,
+ WindowY + WindowH - 32 + v2,
+ WindowX + 8 + (j / 32),BLACK);
+ }
+ }
+ }
+
+ VW_UpdateScreen();
+
+ while (!(scan = LastScan))
+ SD_Poll();
+
+ IN_ClearKey(scan);
+ switch (scan)
+ {
+ case sc_LeftArrow:
+ if (i)
+ i--;
+ break;
+ case sc_RightArrow:
+ if (++i >= ChunksInFile)
+ i--;
+ break;
+ case sc_W: // Walls
+ i = 0;
+ break;
+ case sc_S: // Sprites
+ i = PMSpriteStart;
+ break;
+ case sc_D: // Digitized
+ i = PMSoundStart;
+ break;
+ case sc_I: // Digitized info
+ i = ChunksInFile - 1;
+ break;
+ case sc_L: // Load all pages
+ for (j = 0;j < ChunksInFile;j++)
+ PM_GetPage(j);
+ break;
+ case sc_P:
+// if (sound != -1)
+// SD_PlayDigitized(sound);
+ break;
+ case sc_Escape:
+ done = true;
+ break;
+ case sc_Enter:
+ PM_GetPage(i);
+ break;
+ }
+ }
+ SD_StopDigitized();
+}
+#pragma warn +pia
+
+
+
+//===========================================================================
+
+
+/*
+================
+=
+= DebugKeys
+=
+================
+*/
+
+int DebugKeys (void)
+{
+ boolean esc;
+ int level,i;
+
+ if (Keyboard[sc_B]) // B = border color
+ {
+ CenterWindow(24,3);
+ PrintY+=6;
+ US_Print(" Border color (0-15):");
+ VW_UpdateScreen();
+ esc = !US_LineInput (px,py,str,NULL,true,2,0);
+ if (!esc)
+ {
+ level = atoi (str);
+ if (level>=0 && level<=15)
+ VW_ColorBorder (level);
+ }
+ return 1;
+ }
+
+ if (Keyboard[sc_C]) // C = count objects
+ {
+ CountObjects();
+ return 1;
+ }
+
+ if (Keyboard[sc_E]) // E = quit level
+ {
+ if (tedlevel)
+ Quit (NULL);
+ playstate = ex_completed;
+// gamestate.mapon++;
+ }
+
+ if (Keyboard[sc_F]) // F = facing spot
+ {
+ CenterWindow (14,4);
+ US_Print ("X:");
+ US_PrintUnsigned (player->x);
+ US_Print ("\nY:");
+ US_PrintUnsigned (player->y);
+ US_Print ("\nA:");
+ US_PrintUnsigned (player->angle);
+ VW_UpdateScreen();
+ IN_Ack();
+ return 1;
+ }
+
+ if (Keyboard[sc_G]) // G = god mode
+ {
+ CenterWindow (12,2);
+ if (godmode)
+ US_PrintCentered ("God mode OFF");
+ else
+ US_PrintCentered ("God mode ON");
+ VW_UpdateScreen();
+ IN_Ack();
+ godmode ^= 1;
+ return 1;
+ }
+ if (Keyboard[sc_H]) // H = hurt self
+ {
+ IN_ClearKeysDown ();
+ TakeDamage (16,NULL);
+ }
+ else if (Keyboard[sc_I]) // I = item cheat
+ {
+ CenterWindow (12,3);
+ US_PrintCentered ("Free items!");
+ VW_UpdateScreen();
+ GivePoints (100000);
+ HealSelf (99);
+ if (gamestate.bestweapon<wp_chaingun)
+ GiveWeapon (gamestate.bestweapon+1);
+ gamestate.ammo += 50;
+ if (gamestate.ammo > 99)
+ gamestate.ammo = 99;
+ DrawAmmo ();
+ IN_Ack ();
+ return 1;
+ }
+ else if (Keyboard[sc_M]) // M = memory info
+ {
+ DebugMemory();
+ return 1;
+ }
+#ifdef SPEAR
+ else if (Keyboard[sc_N]) // N = no clip
+ {
+ noclip^=1;
+ CenterWindow (18,3);
+ if (noclip)
+ US_PrintCentered ("No clipping ON");
+ else
+ US_PrintCentered ("No clipping OFF");
+ VW_UpdateScreen();
+ IN_Ack ();
+ return 1;
+ }
+#endif
+#if 0
+ else if (Keyboard[sc_O]) // O = overhead
+ {
+ ViewMap();
+ return 1;
+ }
+#endif
+ else if (Keyboard[sc_P]) // P = pause with no screen disruptioon
+ {
+ PicturePause ();
+ return 1;
+ }
+ else if (Keyboard[sc_Q]) // Q = fast quit
+ Quit (NULL);
+ else if (Keyboard[sc_S]) // S = slow motion
+ {
+ singlestep^=1;
+ CenterWindow (18,3);
+ if (singlestep)
+ US_PrintCentered ("Slow motion ON");
+ else
+ US_PrintCentered ("Slow motion OFF");
+ VW_UpdateScreen();
+ IN_Ack ();
+ return 1;
+ }
+ else if (Keyboard[sc_T]) // T = shape test
+ {
+ ShapeTest ();
+ return 1;
+ }
+ else if (Keyboard[sc_V]) // V = extra VBLs
+ {
+ CenterWindow(30,3);
+ PrintY+=6;
+ US_Print(" Add how many extra VBLs(0-8):");
+ VW_UpdateScreen();
+ esc = !US_LineInput (px,py,str,NULL,true,2,0);
+ if (!esc)
+ {
+ level = atoi (str);
+ if (level>=0 && level<=8)
+ extravbls = level;
+ }
+ return 1;
+ }
+ else if (Keyboard[sc_W]) // W = warp to level
+ {
+ CenterWindow(26,3);
+ PrintY+=6;
+#ifndef SPEAR
+ US_Print(" Warp to which level(1-10):");
+#else
+ US_Print(" Warp to which level(1-21):");
+#endif
+ VW_UpdateScreen();
+ esc = !US_LineInput (px,py,str,NULL,true,2,0);
+ if (!esc)
+ {
+ level = atoi (str);
+#ifndef SPEAR
+ if (level>0 && level<11)
+#else
+ if (level>0 && level<22)
+#endif
+ {
+ gamestate.mapon = level-1;
+ playstate = ex_warped;
+ }
+ }
+ return 1;
+ }
+ else if (Keyboard[sc_X]) // X = item cheat
+ {
+ CenterWindow (12,3);
+ US_PrintCentered ("Extra stuff!");
+ VW_UpdateScreen();
+ // DEBUG: put stuff here
+ IN_Ack ();
+ return 1;
+ }
+
+ return 0;
+}
+
+
+#if 0
+/*
+===================
+=
+= OverheadRefresh
+=
+===================
+*/
+
+void OverheadRefresh (void)
+{
+ unsigned x,y,endx,endy,sx,sy;
+ unsigned tile;
+
+
+ endx = maporgx+VIEWTILEX;
+ endy = maporgy+VIEWTILEY;
+
+ for (y=maporgy;y<endy;y++)
+ for (x=maporgx;x<endx;x++)
+ {
+ sx = (x-maporgx)*16;
+ sy = (y-maporgy)*16;
+
+ switch (viewtype)
+ {
+#if 0
+ case mapview:
+ tile = *(mapsegs[0]+farmapylookup[y]+x);
+ break;
+
+ case tilemapview:
+ tile = tilemap[x][y];
+ break;
+
+ case visview:
+ tile = spotvis[x][y];
+ break;
+#endif
+ case actoratview:
+ tile = (unsigned)actorat[x][y];
+ break;
+ }
+
+ if (tile<MAXWALLTILES)
+ LatchDrawTile(sx,sy,tile);
+ else
+ {
+ LatchDrawChar(sx,sy,NUMBERCHARS+((tile&0xf000)>>12));
+ LatchDrawChar(sx+8,sy,NUMBERCHARS+((tile&0x0f00)>>8));
+ LatchDrawChar(sx,sy+8,NUMBERCHARS+((tile&0x00f0)>>4));
+ LatchDrawChar(sx+8,sy+8,NUMBERCHARS+(tile&0x000f));
+ }
+ }
+
+}
+#endif
+
+#if 0
+/*
+===================
+=
+= ViewMap
+=
+===================
+*/
+
+void ViewMap (void)
+{
+ boolean button0held;
+
+ viewtype = actoratview;
+// button0held = false;
+
+
+ maporgx = player->tilex - VIEWTILEX/2;
+ if (maporgx<0)
+ maporgx = 0;
+ if (maporgx>MAPSIZE-VIEWTILEX)
+ maporgx=MAPSIZE-VIEWTILEX;
+ maporgy = player->tiley - VIEWTILEY/2;
+ if (maporgy<0)
+ maporgy = 0;
+ if (maporgy>MAPSIZE-VIEWTILEY)
+ maporgy=MAPSIZE-VIEWTILEY;
+
+ do
+ {
+//
+// let user pan around
+//
+ PollControls ();
+ if (controlx < 0 && maporgx>0)
+ maporgx--;
+ if (controlx > 0 && maporgx<mapwidth-VIEWTILEX)
+ maporgx++;
+ if (controly < 0 && maporgy>0)
+ maporgy--;
+ if (controly > 0 && maporgy<mapheight-VIEWTILEY)
+ maporgy++;
+
+#if 0
+ if (c.button0 && !button0held)
+ {
+ button0held = true;
+ viewtype++;
+ if (viewtype>visview)
+ viewtype = mapview;
+ }
+ if (!c.button0)
+ button0held = false;
+#endif
+
+ OverheadRefresh ();
+
+ } while (!Keyboard[sc_Escape]);
+
+ IN_ClearKeysDown ();
+}
+#endif
+
--- /dev/null
+++ b/def.h
@@ -1,0 +1,1276 @@
+//#define BETA
+#define YEAR 1992
+#define MONTH 9
+#define DAY 30
+
+#include "ID_HEADS.H"
+#include <MATH.H>
+#include <VALUES.H>
+
+#include "WL_MENU.H"
+
+#ifdef SPANISH
+#include "SPANISH.H"
+#else
+#include "FOREIGN.H"
+#endif
+
+#ifdef SPEAR
+#include "F_SPEAR.H"
+#endif
+
+/*
+=============================================================================
+
+ MACROS
+
+=============================================================================
+*/
+
+
+#define COLORBORDER(color) asm{mov dx,STATUS_REGISTER_1;in al,dx;\
+ mov dx,ATR_INDEX;mov al,ATR_OVERSCAN;out dx,al;mov al,color;out dx,al;\
+ mov al,32;out dx,al};
+
+#define MAPSPOT(x,y,plane) (*(mapsegs[plane]+farmapylookup[y]+x))
+
+#define SIGN(x) ((x)>0?1:-1)
+#define ABS(x) ((int)(x)>0?(x):-(x))
+#define LABS(x) ((long)(x)>0?(x):-(x))
+
+/*
+=============================================================================
+
+ GLOBAL CONSTANTS
+
+=============================================================================
+*/
+
+#define MAXACTORS 150 // max number of nazis, etc / map
+#define MAXSTATS 400 // max number of lamps, bonus, etc
+#define MAXDOORS 64 // max number of sliding doors
+#define MAXWALLTILES 64 // max number of wall tiles
+
+//
+// tile constants
+//
+
+#define ICONARROWS 90
+#define PUSHABLETILE 98
+#define EXITTILE 99 // at end of castle
+#define AREATILE 107 // first of NUMAREAS floor tiles
+#define NUMAREAS 37
+#define ELEVATORTILE 21
+#define AMBUSHTILE 106
+#define ALTELEVATORTILE 107
+
+#define NUMBERCHARS 9
+
+
+//----------------
+
+#define EXTRAPOINTS 40000
+
+#define PLAYERSPEED 3000
+#define RUNSPEED 6000
+
+#define SCREENSEG 0xa000
+
+#define SCREENBWIDE 80
+
+#define HEIGHTRATIO 0.50 // also defined in id_mm.c
+
+#define BORDERCOLOR 3
+#define FLASHCOLOR 5
+#define FLASHTICS 4
+
+
+#define PLAYERSIZE MINDIST // player radius
+#define MINACTORDIST 0x10000l // minimum dist from player center
+ // to any actor center
+
+#define NUMLATCHPICS 100
+
+
+#define PI 3.141592657
+
+#define GLOBAL1 (1l<<16)
+#define TILEGLOBAL GLOBAL1
+#define PIXGLOBAL (GLOBAL1/64)
+#define TILESHIFT 16l
+#define UNSIGNEDSHIFT 8
+
+#define ANGLES 360 // must be divisable by 4
+#define ANGLEQUAD (ANGLES/4)
+#define FINEANGLES 3600
+#define ANG90 (FINEANGLES/4)
+#define ANG180 (ANG90*2)
+#define ANG270 (ANG90*3)
+#define ANG360 (ANG90*4)
+#define VANG90 (ANGLES/4)
+#define VANG180 (VANG90*2)
+#define VANG270 (VANG90*3)
+#define VANG360 (VANG90*4)
+
+#define MINDIST (0x5800l)
+
+
+#define MAXSCALEHEIGHT 256 // largest scale on largest view
+
+#define MAXVIEWWIDTH 320
+
+#define MAPSIZE 64 // maps are 64*64 max
+#define NORTH 0
+#define EAST 1
+#define SOUTH 2
+#define WEST 3
+
+
+#define STATUSLINES 40
+
+#define SCREENSIZE (SCREENBWIDE*208)
+#define PAGE1START 0
+#define PAGE2START (SCREENSIZE)
+#define PAGE3START (SCREENSIZE*2u)
+#define FREESTART (SCREENSIZE*3u)
+
+
+#define PIXRADIUS 512
+
+#define STARTAMMO 8
+
+
+// object flag values
+
+#define FL_SHOOTABLE 1
+#define FL_BONUS 2
+#define FL_NEVERMARK 4
+#define FL_VISABLE 8
+#define FL_ATTACKMODE 16
+#define FL_FIRSTATTACK 32
+#define FL_AMBUSH 64
+#define FL_NONMARK 128
+
+
+//
+// sprite constants
+//
+
+enum {
+ SPR_DEMO,
+ SPR_DEATHCAM,
+//
+// static sprites
+//
+ SPR_STAT_0,SPR_STAT_1,SPR_STAT_2,SPR_STAT_3,
+ SPR_STAT_4,SPR_STAT_5,SPR_STAT_6,SPR_STAT_7,
+
+ SPR_STAT_8,SPR_STAT_9,SPR_STAT_10,SPR_STAT_11,
+ SPR_STAT_12,SPR_STAT_13,SPR_STAT_14,SPR_STAT_15,
+
+ SPR_STAT_16,SPR_STAT_17,SPR_STAT_18,SPR_STAT_19,
+ SPR_STAT_20,SPR_STAT_21,SPR_STAT_22,SPR_STAT_23,
+
+ SPR_STAT_24,SPR_STAT_25,SPR_STAT_26,SPR_STAT_27,
+ SPR_STAT_28,SPR_STAT_29,SPR_STAT_30,SPR_STAT_31,
+
+ SPR_STAT_32,SPR_STAT_33,SPR_STAT_34,SPR_STAT_35,
+ SPR_STAT_36,SPR_STAT_37,SPR_STAT_38,SPR_STAT_39,
+
+ SPR_STAT_40,SPR_STAT_41,SPR_STAT_42,SPR_STAT_43,
+ SPR_STAT_44,SPR_STAT_45,SPR_STAT_46,SPR_STAT_47,
+
+#ifdef SPEAR
+ SPR_STAT_48,SPR_STAT_49,SPR_STAT_50,SPR_STAT_51,
+#endif
+
+//
+// guard
+//
+ SPR_GRD_S_1,SPR_GRD_S_2,SPR_GRD_S_3,SPR_GRD_S_4,
+ SPR_GRD_S_5,SPR_GRD_S_6,SPR_GRD_S_7,SPR_GRD_S_8,
+
+ SPR_GRD_W1_1,SPR_GRD_W1_2,SPR_GRD_W1_3,SPR_GRD_W1_4,
+ SPR_GRD_W1_5,SPR_GRD_W1_6,SPR_GRD_W1_7,SPR_GRD_W1_8,
+
+ SPR_GRD_W2_1,SPR_GRD_W2_2,SPR_GRD_W2_3,SPR_GRD_W2_4,
+ SPR_GRD_W2_5,SPR_GRD_W2_6,SPR_GRD_W2_7,SPR_GRD_W2_8,
+
+ SPR_GRD_W3_1,SPR_GRD_W3_2,SPR_GRD_W3_3,SPR_GRD_W3_4,
+ SPR_GRD_W3_5,SPR_GRD_W3_6,SPR_GRD_W3_7,SPR_GRD_W3_8,
+
+ SPR_GRD_W4_1,SPR_GRD_W4_2,SPR_GRD_W4_3,SPR_GRD_W4_4,
+ SPR_GRD_W4_5,SPR_GRD_W4_6,SPR_GRD_W4_7,SPR_GRD_W4_8,
+
+ SPR_GRD_PAIN_1,SPR_GRD_DIE_1,SPR_GRD_DIE_2,SPR_GRD_DIE_3,
+ SPR_GRD_PAIN_2,SPR_GRD_DEAD,
+
+ SPR_GRD_SHOOT1,SPR_GRD_SHOOT2,SPR_GRD_SHOOT3,
+
+//
+// dogs
+//
+ SPR_DOG_W1_1,SPR_DOG_W1_2,SPR_DOG_W1_3,SPR_DOG_W1_4,
+ SPR_DOG_W1_5,SPR_DOG_W1_6,SPR_DOG_W1_7,SPR_DOG_W1_8,
+
+ SPR_DOG_W2_1,SPR_DOG_W2_2,SPR_DOG_W2_3,SPR_DOG_W2_4,
+ SPR_DOG_W2_5,SPR_DOG_W2_6,SPR_DOG_W2_7,SPR_DOG_W2_8,
+
+ SPR_DOG_W3_1,SPR_DOG_W3_2,SPR_DOG_W3_3,SPR_DOG_W3_4,
+ SPR_DOG_W3_5,SPR_DOG_W3_6,SPR_DOG_W3_7,SPR_DOG_W3_8,
+
+ SPR_DOG_W4_1,SPR_DOG_W4_2,SPR_DOG_W4_3,SPR_DOG_W4_4,
+ SPR_DOG_W4_5,SPR_DOG_W4_6,SPR_DOG_W4_7,SPR_DOG_W4_8,
+
+ SPR_DOG_DIE_1,SPR_DOG_DIE_2,SPR_DOG_DIE_3,SPR_DOG_DEAD,
+ SPR_DOG_JUMP1,SPR_DOG_JUMP2,SPR_DOG_JUMP3,
+
+
+
+//
+// ss
+//
+ SPR_SS_S_1,SPR_SS_S_2,SPR_SS_S_3,SPR_SS_S_4,
+ SPR_SS_S_5,SPR_SS_S_6,SPR_SS_S_7,SPR_SS_S_8,
+
+ SPR_SS_W1_1,SPR_SS_W1_2,SPR_SS_W1_3,SPR_SS_W1_4,
+ SPR_SS_W1_5,SPR_SS_W1_6,SPR_SS_W1_7,SPR_SS_W1_8,
+
+ SPR_SS_W2_1,SPR_SS_W2_2,SPR_SS_W2_3,SPR_SS_W2_4,
+ SPR_SS_W2_5,SPR_SS_W2_6,SPR_SS_W2_7,SPR_SS_W2_8,
+
+ SPR_SS_W3_1,SPR_SS_W3_2,SPR_SS_W3_3,SPR_SS_W3_4,
+ SPR_SS_W3_5,SPR_SS_W3_6,SPR_SS_W3_7,SPR_SS_W3_8,
+
+ SPR_SS_W4_1,SPR_SS_W4_2,SPR_SS_W4_3,SPR_SS_W4_4,
+ SPR_SS_W4_5,SPR_SS_W4_6,SPR_SS_W4_7,SPR_SS_W4_8,
+
+ SPR_SS_PAIN_1,SPR_SS_DIE_1,SPR_SS_DIE_2,SPR_SS_DIE_3,
+ SPR_SS_PAIN_2,SPR_SS_DEAD,
+
+ SPR_SS_SHOOT1,SPR_SS_SHOOT2,SPR_SS_SHOOT3,
+
+//
+// mutant
+//
+ SPR_MUT_S_1,SPR_MUT_S_2,SPR_MUT_S_3,SPR_MUT_S_4,
+ SPR_MUT_S_5,SPR_MUT_S_6,SPR_MUT_S_7,SPR_MUT_S_8,
+
+ SPR_MUT_W1_1,SPR_MUT_W1_2,SPR_MUT_W1_3,SPR_MUT_W1_4,
+ SPR_MUT_W1_5,SPR_MUT_W1_6,SPR_MUT_W1_7,SPR_MUT_W1_8,
+
+ SPR_MUT_W2_1,SPR_MUT_W2_2,SPR_MUT_W2_3,SPR_MUT_W2_4,
+ SPR_MUT_W2_5,SPR_MUT_W2_6,SPR_MUT_W2_7,SPR_MUT_W2_8,
+
+ SPR_MUT_W3_1,SPR_MUT_W3_2,SPR_MUT_W3_3,SPR_MUT_W3_4,
+ SPR_MUT_W3_5,SPR_MUT_W3_6,SPR_MUT_W3_7,SPR_MUT_W3_8,
+
+ SPR_MUT_W4_1,SPR_MUT_W4_2,SPR_MUT_W4_3,SPR_MUT_W4_4,
+ SPR_MUT_W4_5,SPR_MUT_W4_6,SPR_MUT_W4_7,SPR_MUT_W4_8,
+
+ SPR_MUT_PAIN_1,SPR_MUT_DIE_1,SPR_MUT_DIE_2,SPR_MUT_DIE_3,
+ SPR_MUT_PAIN_2,SPR_MUT_DIE_4,SPR_MUT_DEAD,
+
+ SPR_MUT_SHOOT1,SPR_MUT_SHOOT2,SPR_MUT_SHOOT3,SPR_MUT_SHOOT4,
+
+//
+// officer
+//
+ SPR_OFC_S_1,SPR_OFC_S_2,SPR_OFC_S_3,SPR_OFC_S_4,
+ SPR_OFC_S_5,SPR_OFC_S_6,SPR_OFC_S_7,SPR_OFC_S_8,
+
+ SPR_OFC_W1_1,SPR_OFC_W1_2,SPR_OFC_W1_3,SPR_OFC_W1_4,
+ SPR_OFC_W1_5,SPR_OFC_W1_6,SPR_OFC_W1_7,SPR_OFC_W1_8,
+
+ SPR_OFC_W2_1,SPR_OFC_W2_2,SPR_OFC_W2_3,SPR_OFC_W2_4,
+ SPR_OFC_W2_5,SPR_OFC_W2_6,SPR_OFC_W2_7,SPR_OFC_W2_8,
+
+ SPR_OFC_W3_1,SPR_OFC_W3_2,SPR_OFC_W3_3,SPR_OFC_W3_4,
+ SPR_OFC_W3_5,SPR_OFC_W3_6,SPR_OFC_W3_7,SPR_OFC_W3_8,
+
+ SPR_OFC_W4_1,SPR_OFC_W4_2,SPR_OFC_W4_3,SPR_OFC_W4_4,
+ SPR_OFC_W4_5,SPR_OFC_W4_6,SPR_OFC_W4_7,SPR_OFC_W4_8,
+
+ SPR_OFC_PAIN_1,SPR_OFC_DIE_1,SPR_OFC_DIE_2,SPR_OFC_DIE_3,
+ SPR_OFC_PAIN_2,SPR_OFC_DIE_4,SPR_OFC_DEAD,
+
+ SPR_OFC_SHOOT1,SPR_OFC_SHOOT2,SPR_OFC_SHOOT3,
+
+#ifndef SPEAR
+//
+// ghosts
+//
+ SPR_BLINKY_W1,SPR_BLINKY_W2,SPR_PINKY_W1,SPR_PINKY_W2,
+ SPR_CLYDE_W1,SPR_CLYDE_W2,SPR_INKY_W1,SPR_INKY_W2,
+
+//
+// hans
+//
+ SPR_BOSS_W1,SPR_BOSS_W2,SPR_BOSS_W3,SPR_BOSS_W4,
+ SPR_BOSS_SHOOT1,SPR_BOSS_SHOOT2,SPR_BOSS_SHOOT3,SPR_BOSS_DEAD,
+
+ SPR_BOSS_DIE1,SPR_BOSS_DIE2,SPR_BOSS_DIE3,
+
+//
+// schabbs
+//
+ SPR_SCHABB_W1,SPR_SCHABB_W2,SPR_SCHABB_W3,SPR_SCHABB_W4,
+ SPR_SCHABB_SHOOT1,SPR_SCHABB_SHOOT2,
+
+ SPR_SCHABB_DIE1,SPR_SCHABB_DIE2,SPR_SCHABB_DIE3,SPR_SCHABB_DEAD,
+ SPR_HYPO1,SPR_HYPO2,SPR_HYPO3,SPR_HYPO4,
+
+//
+// fake
+//
+ SPR_FAKE_W1,SPR_FAKE_W2,SPR_FAKE_W3,SPR_FAKE_W4,
+ SPR_FAKE_SHOOT,SPR_FIRE1,SPR_FIRE2,
+
+ SPR_FAKE_DIE1,SPR_FAKE_DIE2,SPR_FAKE_DIE3,SPR_FAKE_DIE4,
+ SPR_FAKE_DIE5,SPR_FAKE_DEAD,
+
+//
+// hitler
+//
+ SPR_MECHA_W1,SPR_MECHA_W2,SPR_MECHA_W3,SPR_MECHA_W4,
+ SPR_MECHA_SHOOT1,SPR_MECHA_SHOOT2,SPR_MECHA_SHOOT3,SPR_MECHA_DEAD,
+
+ SPR_MECHA_DIE1,SPR_MECHA_DIE2,SPR_MECHA_DIE3,
+
+ SPR_HITLER_W1,SPR_HITLER_W2,SPR_HITLER_W3,SPR_HITLER_W4,
+ SPR_HITLER_SHOOT1,SPR_HITLER_SHOOT2,SPR_HITLER_SHOOT3,SPR_HITLER_DEAD,
+
+ SPR_HITLER_DIE1,SPR_HITLER_DIE2,SPR_HITLER_DIE3,SPR_HITLER_DIE4,
+ SPR_HITLER_DIE5,SPR_HITLER_DIE6,SPR_HITLER_DIE7,
+
+//
+// giftmacher
+//
+ SPR_GIFT_W1,SPR_GIFT_W2,SPR_GIFT_W3,SPR_GIFT_W4,
+ SPR_GIFT_SHOOT1,SPR_GIFT_SHOOT2,
+
+ SPR_GIFT_DIE1,SPR_GIFT_DIE2,SPR_GIFT_DIE3,SPR_GIFT_DEAD,
+#endif
+//
+// Rocket, smoke and small explosion
+//
+ SPR_ROCKET_1,SPR_ROCKET_2,SPR_ROCKET_3,SPR_ROCKET_4,
+ SPR_ROCKET_5,SPR_ROCKET_6,SPR_ROCKET_7,SPR_ROCKET_8,
+
+ SPR_SMOKE_1,SPR_SMOKE_2,SPR_SMOKE_3,SPR_SMOKE_4,
+ SPR_BOOM_1,SPR_BOOM_2,SPR_BOOM_3,
+
+//
+// Angel of Death's DeathSparks(tm)
+//
+#ifdef SPEAR
+ SPR_HROCKET_1,SPR_HROCKET_2,SPR_HROCKET_3,SPR_HROCKET_4,
+ SPR_HROCKET_5,SPR_HROCKET_6,SPR_HROCKET_7,SPR_HROCKET_8,
+
+ SPR_HSMOKE_1,SPR_HSMOKE_2,SPR_HSMOKE_3,SPR_HSMOKE_4,
+ SPR_HBOOM_1,SPR_HBOOM_2,SPR_HBOOM_3,
+
+ SPR_SPARK1,SPR_SPARK2,SPR_SPARK3,SPR_SPARK4,
+#endif
+
+#ifndef SPEAR
+//
+// gretel
+//
+ SPR_GRETEL_W1,SPR_GRETEL_W2,SPR_GRETEL_W3,SPR_GRETEL_W4,
+ SPR_GRETEL_SHOOT1,SPR_GRETEL_SHOOT2,SPR_GRETEL_SHOOT3,SPR_GRETEL_DEAD,
+
+ SPR_GRETEL_DIE1,SPR_GRETEL_DIE2,SPR_GRETEL_DIE3,
+
+//
+// fat face
+//
+ SPR_FAT_W1,SPR_FAT_W2,SPR_FAT_W3,SPR_FAT_W4,
+ SPR_FAT_SHOOT1,SPR_FAT_SHOOT2,SPR_FAT_SHOOT3,SPR_FAT_SHOOT4,
+
+ SPR_FAT_DIE1,SPR_FAT_DIE2,SPR_FAT_DIE3,SPR_FAT_DEAD,
+
+//
+// bj
+//
+ SPR_BJ_W1,SPR_BJ_W2,SPR_BJ_W3,SPR_BJ_W4,
+ SPR_BJ_JUMP1,SPR_BJ_JUMP2,SPR_BJ_JUMP3,SPR_BJ_JUMP4,
+#else
+//
+// THESE ARE FOR 'SPEAR OF DESTINY'
+//
+
+//
+// Trans Grosse
+//
+ SPR_TRANS_W1,SPR_TRANS_W2,SPR_TRANS_W3,SPR_TRANS_W4,
+ SPR_TRANS_SHOOT1,SPR_TRANS_SHOOT2,SPR_TRANS_SHOOT3,SPR_TRANS_DEAD,
+
+ SPR_TRANS_DIE1,SPR_TRANS_DIE2,SPR_TRANS_DIE3,
+
+//
+// Wilhelm
+//
+ SPR_WILL_W1,SPR_WILL_W2,SPR_WILL_W3,SPR_WILL_W4,
+ SPR_WILL_SHOOT1,SPR_WILL_SHOOT2,SPR_WILL_SHOOT3,SPR_WILL_SHOOT4,
+
+ SPR_WILL_DIE1,SPR_WILL_DIE2,SPR_WILL_DIE3,SPR_WILL_DEAD,
+
+//
+// UberMutant
+//
+ SPR_UBER_W1,SPR_UBER_W2,SPR_UBER_W3,SPR_UBER_W4,
+ SPR_UBER_SHOOT1,SPR_UBER_SHOOT2,SPR_UBER_SHOOT3,SPR_UBER_SHOOT4,
+
+ SPR_UBER_DIE1,SPR_UBER_DIE2,SPR_UBER_DIE3,SPR_UBER_DIE4,
+ SPR_UBER_DEAD,
+
+//
+// Death Knight
+//
+ SPR_DEATH_W1,SPR_DEATH_W2,SPR_DEATH_W3,SPR_DEATH_W4,
+ SPR_DEATH_SHOOT1,SPR_DEATH_SHOOT2,SPR_DEATH_SHOOT3,SPR_DEATH_SHOOT4,
+
+ SPR_DEATH_DIE1,SPR_DEATH_DIE2,SPR_DEATH_DIE3,SPR_DEATH_DIE4,
+ SPR_DEATH_DIE5,SPR_DEATH_DIE6,SPR_DEATH_DEAD,
+
+//
+// Ghost
+//
+ SPR_SPECTRE_W1,SPR_SPECTRE_W2,SPR_SPECTRE_W3,SPR_SPECTRE_W4,
+ SPR_SPECTRE_F1,SPR_SPECTRE_F2,SPR_SPECTRE_F3,SPR_SPECTRE_F4,
+
+//
+// Angel of Death
+//
+ SPR_ANGEL_W1,SPR_ANGEL_W2,SPR_ANGEL_W3,SPR_ANGEL_W4,
+ SPR_ANGEL_SHOOT1,SPR_ANGEL_SHOOT2,SPR_ANGEL_TIRED1,SPR_ANGEL_TIRED2,
+
+ SPR_ANGEL_DIE1,SPR_ANGEL_DIE2,SPR_ANGEL_DIE3,SPR_ANGEL_DIE4,
+ SPR_ANGEL_DIE5,SPR_ANGEL_DIE6,SPR_ANGEL_DIE7,SPR_ANGEL_DEAD,
+
+#endif
+
+//
+// player attack frames
+//
+ SPR_KNIFEREADY,SPR_KNIFEATK1,SPR_KNIFEATK2,SPR_KNIFEATK3,
+ SPR_KNIFEATK4,
+
+ SPR_PISTOLREADY,SPR_PISTOLATK1,SPR_PISTOLATK2,SPR_PISTOLATK3,
+ SPR_PISTOLATK4,
+
+ SPR_MACHINEGUNREADY,SPR_MACHINEGUNATK1,SPR_MACHINEGUNATK2,MACHINEGUNATK3,
+ SPR_MACHINEGUNATK4,
+
+ SPR_CHAINREADY,SPR_CHAINATK1,SPR_CHAINATK2,SPR_CHAINATK3,
+ SPR_CHAINATK4,
+
+ };
+
+
+/*
+=============================================================================
+
+ GLOBAL TYPES
+
+=============================================================================
+*/
+
+typedef long fixed;
+
+typedef enum {
+ di_north,
+ di_east,
+ di_south,
+ di_west
+} controldir_t;
+
+typedef enum {
+ dr_normal,
+ dr_lock1,
+ dr_lock2,
+ dr_lock3,
+ dr_lock4,
+ dr_elevator
+} door_t;
+
+typedef enum {
+ ac_badobject = -1,
+ ac_no,
+ ac_yes,
+ ac_allways
+} activetype;
+
+typedef enum {
+ nothing,
+ playerobj,
+ inertobj,
+ guardobj,
+ officerobj,
+ ssobj,
+ dogobj,
+ bossobj,
+ schabbobj,
+ fakeobj,
+ mechahitlerobj,
+ mutantobj,
+ needleobj,
+ fireobj,
+ bjobj,
+ ghostobj,
+ realhitlerobj,
+ gretelobj,
+ giftobj,
+ fatobj,
+ rocketobj,
+
+ spectreobj,
+ angelobj,
+ transobj,
+ uberobj,
+ willobj,
+ deathobj,
+ hrocketobj,
+ sparkobj
+} classtype;
+
+typedef enum {
+ dressing,
+ block,
+ bo_gibs,
+ bo_alpo,
+ bo_firstaid,
+ bo_key1,
+ bo_key2,
+ bo_key3,
+ bo_key4,
+ bo_cross,
+ bo_chalice,
+ bo_bible,
+ bo_crown,
+ bo_clip,
+ bo_clip2,
+ bo_machinegun,
+ bo_chaingun,
+ bo_food,
+ bo_fullheal,
+ bo_25clip,
+ bo_spear
+} stat_t;
+
+typedef enum {
+ east,
+ northeast,
+ north,
+ northwest,
+ west,
+ southwest,
+ south,
+ southeast,
+ nodir
+} dirtype;
+
+
+#define NUMENEMIES 22
+typedef enum {
+ en_guard,
+ en_officer,
+ en_ss,
+ en_dog,
+ en_boss,
+ en_schabbs,
+ en_fake,
+ en_hitler,
+ en_mutant,
+ en_blinky,
+ en_clyde,
+ en_pinky,
+ en_inky,
+ en_gretel,
+ en_gift,
+ en_fat,
+ en_spectre,
+ en_angel,
+ en_trans,
+ en_uber,
+ en_will,
+ en_death
+} enemy_t;
+
+
+typedef struct statestruct
+{
+ boolean rotate;
+ int shapenum; // a shapenum of -1 means get from ob->temp1
+ int tictime;
+ void (*think) (),(*action) ();
+ struct statestruct *next;
+} statetype;
+
+
+//---------------------
+//
+// trivial actor structure
+//
+//---------------------
+
+typedef struct statstruct
+{
+ byte tilex,tiley;
+ byte *visspot;
+ int shapenum; // if shapenum == -1 the obj has been removed
+ byte flags;
+ byte itemnumber;
+} statobj_t;
+
+
+//---------------------
+//
+// door actor structure
+//
+//---------------------
+
+typedef struct doorstruct
+{
+ byte tilex,tiley;
+ boolean vertical;
+ byte lock;
+ enum {dr_open,dr_closed,dr_opening,dr_closing} action;
+ int ticcount;
+} doorobj_t;
+
+
+//--------------------
+//
+// thinking actor structure
+//
+//--------------------
+
+typedef struct objstruct
+{
+ activetype active;
+ int ticcount;
+ classtype obclass;
+ statetype *state;
+
+ byte flags; // FL_SHOOTABLE, etc
+
+ long distance; // if negative, wait for that door to open
+ dirtype dir;
+
+ fixed x,y;
+ unsigned tilex,tiley;
+ byte areanumber;
+
+ int viewx;
+ unsigned viewheight;
+ fixed transx,transy; // in global coord
+
+ int angle;
+ int hitpoints;
+ long speed;
+
+ int temp1,temp2,temp3;
+ struct objstruct *next,*prev;
+} objtype;
+
+
+#define NUMBUTTONS 8
+enum {
+ bt_nobutton=-1,
+ bt_attack=0,
+ bt_strafe,
+ bt_run,
+ bt_use,
+ bt_readyknife,
+ bt_readypistol,
+ bt_readymachinegun,
+ bt_readychaingun
+};
+
+
+#define NUMWEAPONS 5
+typedef enum {
+ wp_knife,
+ wp_pistol,
+ wp_machinegun,
+ wp_chaingun
+} weapontype;
+
+
+typedef enum {
+ gd_baby,
+ gd_easy,
+ gd_medium,
+ gd_hard
+};
+
+//---------------
+//
+// gamestate structure
+//
+//---------------
+
+typedef struct
+{
+ int difficulty;
+ int mapon;
+ long oldscore,score,nextextra;
+ int lives;
+ int health;
+ int ammo;
+ int keys;
+ weapontype bestweapon,weapon,chosenweapon;
+
+ int faceframe;
+ int attackframe,attackcount,weaponframe;
+
+ int episode,secretcount,treasurecount,killcount,
+ secrettotal,treasuretotal,killtotal;
+ long TimeCount;
+ long killx,killy;
+ boolean victoryflag; // set during victory animations
+} gametype;
+
+
+typedef enum {
+ ex_stillplaying,
+ ex_completed,
+ ex_died,
+ ex_warped,
+ ex_resetgame,
+ ex_loadedgame,
+ ex_victorious,
+ ex_abort,
+ ex_demodone,
+ ex_secretlevel
+} exit_t;
+
+
+/*
+=============================================================================
+
+ WL_MAIN DEFINITIONS
+
+=============================================================================
+*/
+
+extern boolean MS_CheckParm (char far *string);
+
+extern char str[80],str2[20];
+extern int tedlevelnum;
+extern boolean tedlevel;
+extern boolean nospr;
+extern boolean IsA386;
+
+extern byte far *scalermemory;
+
+extern fixed focallength;
+extern unsigned viewangles;
+extern unsigned screenofs;
+extern int viewwidth;
+extern int viewheight;
+extern int centerx;
+extern int shootdelta;
+
+extern int dirangle[9];
+
+extern boolean startgame,loadedgame,virtualreality;
+extern int mouseadjustment;
+//
+// math tables
+//
+extern int pixelangle[MAXVIEWWIDTH];
+extern long far finetangent[FINEANGLES/4];
+extern fixed far sintable[],far *costable;
+
+//
+// derived constants
+//
+extern fixed scale,maxslope;
+extern long heightnumerator;
+extern int minheightdiv;
+
+extern char configname[13];
+
+
+
+void HelpScreens (void);
+void OrderingInfo (void);
+void TEDDeath(void);
+void Quit (char *error);
+void CalcProjection (long focal);
+boolean SetViewSize (unsigned width, unsigned height);
+void NewGame (int difficulty,int episode);
+void NewViewSize (int width);
+boolean LoadTheGame(int file,int x,int y);
+boolean SaveTheGame(int file,int x,int y);
+void ShowViewSize (int width);
+void ShutdownId (void);
+
+
+/*
+=============================================================================
+
+ WL_GAME DEFINITIONS
+
+=============================================================================
+*/
+
+
+extern boolean ingame,fizzlein;
+extern unsigned latchpics[NUMLATCHPICS];
+extern gametype gamestate;
+extern int doornum;
+
+extern char demoname[13];
+
+extern long spearx,speary;
+extern unsigned spearangle;
+extern boolean spearflag;
+
+
+void DrawPlayBorder (void);
+void ScanInfoPlane (void);
+void SetupGameLevel (void);
+void NormalScreen (void);
+void DrawPlayScreen (void);
+void FizzleOut (void);
+void GameLoop (void);
+void ClearMemory (void);
+void PlayDemo (int demonumber);
+void RecordDemo (void);
+void DrawAllPlayBorder (void);
+void DrawHighScores(void);
+void DrawAllPlayBorderSides (void);
+
+
+// JAB
+#define PlaySoundLocTile(s,tx,ty) PlaySoundLocGlobal(s,(((long)(tx) << TILESHIFT) + (1L << (TILESHIFT - 1))),(((long)ty << TILESHIFT) + (1L << (TILESHIFT - 1))))
+#define PlaySoundLocActor(s,ob) PlaySoundLocGlobal(s,(ob)->x,(ob)->y)
+void PlaySoundLocGlobal(word s,fixed gx,fixed gy);
+void UpdateSoundLoc(void);
+
+
+/*
+=============================================================================
+
+ WL_PLAY DEFINITIONS
+
+=============================================================================
+*/
+
+#ifdef SPEAR
+extern long funnyticount; // FOR FUNNY BJ FACE
+#endif
+
+extern exit_t playstate;
+
+extern boolean madenoise;
+
+extern objtype objlist[MAXACTORS],*new,*obj,*player,*lastobj,
+ *objfreelist,*killerobj;
+extern statobj_t statobjlist[MAXSTATS],*laststatobj;
+extern doorobj_t doorobjlist[MAXDOORS],*lastdoorobj;
+
+extern unsigned farmapylookup[MAPSIZE];
+extern byte *nearmapylookup[MAPSIZE];
+
+extern byte tilemap[MAPSIZE][MAPSIZE]; // wall values only
+extern byte spotvis[MAPSIZE][MAPSIZE];
+extern objtype *actorat[MAPSIZE][MAPSIZE];
+
+#define UPDATESIZE (UPDATEWIDE*UPDATEHIGH)
+extern byte update[UPDATESIZE];
+
+extern boolean singlestep,godmode,noclip;
+extern int extravbls;
+
+//
+// control info
+//
+extern boolean mouseenabled,joystickenabled,joypadenabled,joystickprogressive;
+extern int joystickport;
+extern int dirscan[4];
+extern int buttonscan[NUMBUTTONS];
+extern int buttonmouse[4];
+extern int buttonjoy[4];
+
+extern boolean buttonheld[NUMBUTTONS];
+
+extern int viewsize;
+
+//
+// curent user input
+//
+extern int controlx,controly; // range from -100 to 100
+extern boolean buttonstate[NUMBUTTONS];
+
+extern boolean demorecord,demoplayback;
+extern char far *demoptr, far *lastdemoptr;
+extern memptr demobuffer;
+
+
+
+void InitRedShifts (void);
+void FinishPaletteShifts (void);
+
+void CenterWindow(word w,word h);
+void InitActorList (void);
+void GetNewActor (void);
+void RemoveObj (objtype *gone);
+void PollControls (void);
+void StopMusic(void);
+void StartMusic(void);
+void PlayLoop (void);
+void StartDamageFlash (int damage);
+void StartBonusFlash (void);
+
+/*
+=============================================================================
+
+ WL_INTER
+
+=============================================================================
+*/
+
+void IntroScreen (void);
+void PreloadGraphics(void);
+void LevelCompleted (void);
+void CheckHighScore (long score,word other);
+void Victory (void);
+void ClearSplitVWB (void);
+
+
+/*
+=============================================================================
+
+ WL_DEBUG
+
+=============================================================================
+*/
+
+int DebugKeys (void);
+void PicturePause (void);
+
+
+/*
+=============================================================================
+
+ WL_DRAW DEFINITIONS
+
+=============================================================================
+*/
+
+extern unsigned screenloc[3];
+extern unsigned freelatch;
+
+extern long lasttimecount;
+extern long frameon;
+extern boolean fizzlein;
+
+extern unsigned wallheight[MAXVIEWWIDTH];
+
+extern fixed tileglobal;
+extern fixed focallength;
+extern fixed mindist;
+
+//
+// math tables
+//
+extern int pixelangle[MAXVIEWWIDTH];
+extern long far finetangent[FINEANGLES/4];
+extern fixed far sintable[],far *costable;
+
+//
+// derived constants
+//
+extern fixed scale;
+extern long heightnumerator,mindist;
+
+//
+// refresh variables
+//
+extern fixed viewx,viewy; // the focal point
+extern int viewangle;
+extern fixed viewsin,viewcos;
+
+extern long postsource;
+extern unsigned postx;
+extern unsigned postwidth;
+
+
+extern int horizwall[],vertwall[];
+
+extern unsigned pwallpos;
+
+
+fixed FixedByFrac (fixed a, fixed b);
+void TransformActor (objtype *ob);
+void BuildTables (void);
+void ClearScreen (void);
+int CalcRotate (objtype *ob);
+void DrawScaleds (void);
+void CalcTics (void);
+void FixOfs (void);
+void ThreeDRefresh (void);
+void FarScalePost (void);
+
+/*
+=============================================================================
+
+ WL_STATE DEFINITIONS
+
+=============================================================================
+*/
+#define TURNTICS 10
+#define SPDPATROL 512
+#define SPDDOG 1500
+
+
+extern dirtype opposite[9];
+extern dirtype diagonal[9][9];
+
+
+void InitHitRect (objtype *ob, unsigned radius);
+void SpawnNewObj (unsigned tilex, unsigned tiley, statetype *state);
+void NewState (objtype *ob, statetype *state);
+
+boolean TryWalk (objtype *ob);
+void SelectChaseDir (objtype *ob);
+void SelectDodgeDir (objtype *ob);
+void SelectRunDir (objtype *ob);
+void MoveObj (objtype *ob, long move);
+boolean SightPlayer (objtype *ob);
+
+void KillActor (objtype *ob);
+void DamageActor (objtype *ob, unsigned damage);
+
+boolean CheckLine (objtype *ob);
+boolean CheckSight (objtype *ob);
+
+
+/*
+=============================================================================
+
+ WL_SCALE DEFINITIONS
+
+=============================================================================
+*/
+
+
+#define COMPSCALECODESTART (65*4) // offset to start of code in comp scaler
+
+typedef struct
+{
+ unsigned codeofs[65];
+ unsigned width[65];
+ byte code[];
+} t_compscale;
+
+typedef struct
+{
+ unsigned leftpix,rightpix;
+ unsigned dataofs[64];
+// table data after dataofs[rightpix-leftpix+1]
+} t_compshape;
+
+
+extern t_compscale _seg *scaledirectory[MAXSCALEHEIGHT+1];
+extern long fullscalefarcall[MAXSCALEHEIGHT+1];
+
+extern byte bitmasks1[8][8];
+extern byte bitmasks2[8][8];
+extern unsigned wordmasks[8][8];
+
+extern byte mapmasks1[4][8];
+extern byte mapmasks2[4][8];
+extern byte mapmasks3[4][8];
+
+extern int maxscale,maxscaleshl2;
+
+extern boolean insetupscaling;
+
+void SetupScaling (int maxscaleheight);
+void ScaleShape (int xcenter, int shapenum, unsigned height);
+void SimpleScaleShape (int xcenter, int shapenum, unsigned height);
+
+/*
+=============================================================================
+
+ WL_AGENT DEFINITIONS
+
+=============================================================================
+*/
+
+//
+// player state info
+//
+extern boolean running;
+extern long thrustspeed;
+extern unsigned plux,pluy; // player coordinates scaled to unsigned
+
+extern int anglefrac;
+extern int facecount;
+
+void SpawnPlayer (int tilex, int tiley, int dir);
+void DrawFace (void);
+void DrawHealth (void);
+void TakeDamage (int points,objtype *attacker);
+void HealSelf (int points);
+void DrawLevel (void);
+void DrawLives (void);
+void GiveExtraMan (void);
+void DrawScore (void);
+void GivePoints (long points);
+void DrawWeapon (void);
+void DrawKeys (void);
+void GiveWeapon (int weapon);
+void DrawAmmo (void);
+void GiveAmmo (int ammo);
+void GiveKey (int key);
+void GetBonus (statobj_t *check);
+
+void Thrust (int angle, long speed);
+
+/*
+=============================================================================
+
+ WL_ACT1 DEFINITIONS
+
+=============================================================================
+*/
+
+extern doorobj_t doorobjlist[MAXDOORS],*lastdoorobj;
+extern int doornum;
+
+extern unsigned doorposition[MAXDOORS],pwallstate;
+
+extern byte far areaconnect[NUMAREAS][NUMAREAS];
+
+extern boolean areabyplayer[NUMAREAS];
+
+extern unsigned pwallstate;
+extern unsigned pwallpos; // amount a pushable wall has been moved (0-63)
+extern unsigned pwallx,pwally;
+extern int pwalldir;
+
+
+void InitDoorList (void);
+void InitStaticList (void);
+void SpawnStatic (int tilex, int tiley, int type);
+void SpawnDoor (int tilex, int tiley, boolean vertical, int lock);
+void MoveDoors (void);
+void MovePWalls (void);
+void OpenDoor (int door);
+void PlaceItemType (int itemtype, int tilex, int tiley);
+void PushWall (int checkx, int checky, int dir);
+void OperateDoor (int door);
+void InitAreas (void);
+
+/*
+=============================================================================
+
+ WL_ACT2 DEFINITIONS
+
+=============================================================================
+*/
+
+#define s_nakedbody s_static10
+
+extern statetype s_grddie1;
+extern statetype s_dogdie1;
+extern statetype s_ofcdie1;
+extern statetype s_mutdie1;
+extern statetype s_ssdie1;
+extern statetype s_bossdie1;
+extern statetype s_schabbdie1;
+extern statetype s_fakedie1;
+extern statetype s_mechadie1;
+extern statetype s_hitlerdie1;
+extern statetype s_greteldie1;
+extern statetype s_giftdie1;
+extern statetype s_fatdie1;
+
+extern statetype s_spectredie1;
+extern statetype s_angeldie1;
+extern statetype s_transdie0;
+extern statetype s_uberdie0;
+extern statetype s_willdie1;
+extern statetype s_deathdie1;
+
+
+extern statetype s_grdchase1;
+extern statetype s_dogchase1;
+extern statetype s_ofcchase1;
+extern statetype s_sschase1;
+extern statetype s_mutchase1;
+extern statetype s_bosschase1;
+extern statetype s_schabbchase1;
+extern statetype s_fakechase1;
+extern statetype s_mechachase1;
+extern statetype s_gretelchase1;
+extern statetype s_giftchase1;
+extern statetype s_fatchase1;
+
+extern statetype s_spectrechase1;
+extern statetype s_angelchase1;
+extern statetype s_transchase1;
+extern statetype s_uberchase1;
+extern statetype s_willchase1;
+extern statetype s_deathchase1;
+
+extern statetype s_blinkychase1;
+extern statetype s_hitlerchase1;
+
+extern statetype s_grdpain;
+extern statetype s_grdpain1;
+extern statetype s_ofcpain;
+extern statetype s_ofcpain1;
+extern statetype s_sspain;
+extern statetype s_sspain1;
+extern statetype s_mutpain;
+extern statetype s_mutpain1;
+
+extern statetype s_deathcam;
+
+extern statetype s_schabbdeathcam2;
+extern statetype s_hitlerdeathcam2;
+extern statetype s_giftdeathcam2;
+extern statetype s_fatdeathcam2;
+
+void SpawnStand (enemy_t which, int tilex, int tiley, int dir);
+void SpawnPatrol (enemy_t which, int tilex, int tiley, int dir);
+void KillActor (objtype *ob);
+
+void US_ControlPanel(byte);
+
+void SpawnDeadGuard (int tilex, int tiley);
+void SpawnBoss (int tilex, int tiley);
+void SpawnGretel (int tilex, int tiley);
+void SpawnTrans (int tilex, int tiley);
+void SpawnUber (int tilex, int tiley);
+void SpawnWill (int tilex, int tiley);
+void SpawnDeath (int tilex, int tiley);
+void SpawnAngel (int tilex, int tiley);
+void SpawnSpectre (int tilex, int tiley);
+void SpawnGhosts (int which, int tilex, int tiley);
+void SpawnSchabbs (int tilex, int tiley);
+void SpawnGift (int tilex, int tiley);
+void SpawnFat (int tilex, int tiley);
+void SpawnFakeHitler (int tilex, int tiley);
+void SpawnHitler (int tilex, int tiley);
+
+/*
+=============================================================================
+
+ WL_TEXT DEFINITIONS
+
+=============================================================================
+*/
+
+extern char helpfilename[],endfilename[];
+
+extern void HelpScreens(void);
+extern void EndText(void);
--- /dev/null
+++ b/detect.c
@@ -1,0 +1,87 @@
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_CheckSB() - Checks to see if a SoundBlaster resides at a
+// particular I/O location
+//
+///////////////////////////////////////////////////////////////////////////
+static boolean
+SDL_CheckSB(int port)
+{
+ int i;
+
+ sbLocation = port << 4; // Initialize stuff for later use
+
+ sbOut(sbReset,true); // Reset the SoundBlaster DSP
+asm mov dx,0x388 // Wait >4usec
+asm in al, dx
+asm in al, dx
+asm in al, dx
+asm in al, dx
+asm in al, dx
+asm in al, dx
+asm in al, dx
+asm in al, dx
+asm in al, dx
+
+ sbOut(sbReset,false); // Turn off sb DSP reset
+asm mov dx,0x388 // Wait >100usec
+asm mov cx,100
+usecloop:
+asm in al,dx
+asm loop usecloop
+
+ for (i = 0;i < 100;i++)
+ {
+ if (sbIn(sbDataAvail) & 0x80) // If data is available...
+ {
+ if (sbIn(sbReadData) == 0xaa) // If it matches correct value
+ return(true);
+ else
+ {
+ sbLocation = -1; // Otherwise not a SoundBlaster
+ return(false);
+ }
+ }
+ }
+ sbLocation = -1; // Retry count exceeded - fail
+ return(false);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// Checks to see if a SoundBlaster is in the system. If the port passed is
+// -1, then it scans through all possible I/O locations. If the port
+// passed is 0, then it uses the default (2). If the port is >0, then
+// it just passes it directly to SDL_CheckSB()
+//
+///////////////////////////////////////////////////////////////////////////
+static boolean
+SDL_DetectSoundBlaster(int port)
+{
+ int i;
+
+ if (port == 0) // If user specifies default, use 2
+ port = 2;
+ if (port == -1)
+ {
+ if (SDL_CheckSB(2)) // Check default before scanning
+ return(true);
+
+ if (SDL_CheckSB(4)) // Check other SB Pro location before scan
+ return(true);
+
+ for (i = 1;i <= 6;i++) // Scan through possible SB locations
+ {
+ if ((i == 2) || (i == 4))
+ continue;
+
+ if (SDL_CheckSB(i)) // If found at this address,
+ return(true); // return success
+ }
+ return(false); // All addresses failed, return failure
+ }
+ else
+ return(SDL_CheckSB(port)); // User specified address or default
+}
+
+
\ No newline at end of file
--- /dev/null
+++ b/dr.asm
@@ -1,0 +1,739 @@
+ IDEAL
+ MODEL MEDIUM,C
+ P286
+
+SCREENSEG = 0a000h
+
+FINEANGLES = 3600
+DEG90 = 900
+DEG180 = 1800
+DEG270 = 2700
+DEG360 = 3600
+
+OP_JLE = 07eh
+OP_JGE = 07dh
+
+EXTRN finetangent:DWORD ; far array, starts at offset 0
+
+EXTRN HitHorizWall:FAR
+EXTRN HitVertWall:FAR
+EXTRN HitHorizDoor:FAR
+EXTRN HitVertDoor:FAR
+EXTRN HitHorizPWall:FAR
+EXTRN HitVertPWall:FAR
+
+
+DATASEG
+
+EXTRN viewwidth:WORD
+
+EXTRN tilemap:BYTE
+EXTRN spotvis:BYTE
+EXTRN pixelangle:WORD
+
+
+EXTRN midangle:WORD
+EXTRN angle:WORD
+
+EXTRN focaltx:WORD
+EXTRN focalty:WORD
+EXTRN viewtx:WORD
+EXTRN viewty:WORD
+EXTRN viewx:DWORD
+EXTRN viewy:DWORD
+
+EXTRN xpartialup:WORD
+EXTRN ypartialup:WORD
+EXTRN xpartialdown:WORD
+EXTRN ypartialdown:WORD
+
+EXTRN tilehit:WORD
+EXTRN pixx:WORD
+EXTRN wallheight:WORD ; array of VIEWWIDTH entries
+
+EXTRN xtile:WORD
+EXTRN ytile:WORD
+EXTRN xtilestep:WORD
+EXTRN ytilestep:WORD
+EXTRN xintercept:DWORD
+EXTRN yintercept:DWORD
+EXTRN xstep:DWORD
+EXTRN ystep:DWORD
+
+EXTRN doorposition:WORD ; table of door position values
+
+
+EXTRN pwallpos:WORD ; amound a pushable wall has been moved
+
+CODESEG
+
+;-------------------
+;
+; xpartialbyystep
+;
+; multiplies long [ystep] (possibly negative), by word [xpartial] (in BX)
+;
+; returns dx:ax
+; trashes bx,cx,di
+;
+;-------------------
+
+PROC xpartialbyystep NEAR
+;
+; setup
+;
+ mov ax,[WORD ystep]
+ mov cx,[WORD ystep+2]
+ or cx,cx ; is ystep negatice?
+ jns @@multpos
+;
+; multiply negative cx:ax by bx
+;
+ neg cx
+ neg ax
+ sbb cx,0
+
+ mul bx ; fraction*fraction
+ mov di,dx ; di is low word of result
+ mov ax,cx ;
+ mul bx ; units*fraction
+ add ax,di
+ adc dx,0
+
+ neg dx
+ neg ax
+ sbb dx,0
+ ret
+;
+; multiply positive cx:ax by bx
+;
+EVEN
+@@multpos:
+ mul bx ; fraction*fraction
+ mov di,dx ; di is low word of result
+ mov ax,cx ;
+ mul bx ; units*fraction
+ add ax,di
+ adc dx,0
+
+ ret
+
+ENDP
+
+
+
+;-------------------
+;
+; ypartialbyxstep
+;
+; multiplies long [xstep] (possibly negative), by word [ypartial] (in BP)
+;
+; returns dx:ax
+; trashes cx,di,bp
+;
+;-------------------
+
+PROC ypartialbyxstep NEAR
+;
+; setup
+;
+ mov ax,[WORD xstep]
+ mov cx,[WORD xstep+2]
+ or cx,cx ; is ystep negatice?
+ jns @@multpos
+;
+; multiply negative cx:ax by bx
+;
+ neg cx
+ neg ax
+ sbb cx,0
+
+ mul bp ; fraction*fraction
+ mov di,dx ; di is low word of result
+ mov ax,cx ;
+ mul bp ; units*fraction
+ add ax,di
+ adc dx,0
+
+ neg dx
+ neg ax
+ sbb dx,0
+ ret
+;
+; multiply positive cx:ax by bx
+;
+EVEN
+@@multpos:
+ mul bp ; fraction*fraction
+ mov di,dx ; di is low word of result
+ mov ax,cx ;
+ mul bp ; units*fraction
+ add ax,di
+ adc dx,0
+ ret
+
+ENDP
+
+
+;============================
+;
+; AsmRefresh
+;
+;
+;============================
+
+PROC AsmRefresh
+PUBLIC AsmRefresh
+
+ push si
+ push di
+ push bp
+
+ mov [pixx],0
+;---------------------------------------------------------------------------
+;
+; Setup to trace a ray through pixx view pixel
+;
+; CX : angle of the ray through pixx
+; ES : points to segment of finetangent array for this block of code
+;
+; Upon entrance to initialize block
+;
+; BX : xpartial
+; BP : ypartial
+;
+;---------------------------------------------------------------------------
+ EVEN
+pixxloop:
+ mov ax,SEG finetangent
+ mov es,ax
+ mov cx,[midangle] ; center of view area
+ mov bx,[pixx]
+ shl bx,1
+ add cx,[pixelangle+bx] ; delta for this pixel
+ cmp cx,0
+ jge not0
+;----------
+;
+; -90 - -1 degree arc
+;
+;----------
+ add cx,FINEANGLES ; -90 is the same as 270
+ jmp entry360
+
+not0:
+ cmp cx,DEG90
+ jge not90
+;----------
+;
+; 0-89 degree arc
+;
+;----------
+entry90:
+ mov [xtilestep],1 ; xtilestep = 1
+ mov [ytilestep],-1 ; ytilestep = -1
+ mov [BYTE cs:horizop],OP_JGE ; patch a jge in
+ mov [BYTE cs:vertop],OP_JLE ; patch a jle in
+ mov bx,DEG90-1
+ sub bx,cx
+ shl bx,2
+ mov ax,[es:bx]
+ mov dx,[es:bx+2]
+ mov [WORD xstep],ax
+ mov [WORD xstep+2],dx ; xstep = finetangent[DEG90-1-angle]
+ mov bx,cx
+ shl bx,2
+ mov ax,[es:bx]
+ mov dx,[es:bx+2]
+ neg dx
+ neg ax
+ sbb dx,0
+ mov [WORD ystep],ax
+ mov [WORD ystep+2],dx ; ystep = -finetangent[angle]
+
+ mov bx,[xpartialup] ; xpartial = xpartialup
+ mov bp,[ypartialdown] ; ypartial = ypartialdown
+ jmp initvars
+
+not90:
+ cmp cx,DEG180
+ jge not180
+;----------
+;
+; 90-179 degree arc
+;
+;----------
+ mov ax,-1
+ mov [xtilestep],ax ; xtilestep = -1
+ mov [ytilestep],ax ; ytilestep = -1
+ mov [BYTE cs:horizop],OP_JLE ; patch a jle in
+ mov [BYTE cs:vertop],OP_JLE ; patch a jle in
+
+ mov bx,cx
+ shl bx,2
+ mov ax,[es:bx-DEG90*4]
+ mov dx,[es:bx+2-DEG90*4]
+ neg dx
+ neg ax
+ sbb dx,0
+ mov [WORD xstep],ax
+ mov [WORD xstep+2],dx ; xstep = -finetangent[angle-DEG90]
+ mov bx,DEG180-1
+ sub bx,cx
+ shl bx,2
+ mov ax,[es:bx]
+ mov dx,[es:bx+2]
+ neg dx
+ neg ax
+ sbb dx,0
+ mov [WORD ystep],ax
+ mov [WORD ystep+2],dx ; ystep = -finetangent[DEG180-1-angle]
+
+ mov bx,[xpartialdown] ; xpartial = xpartialdown
+ mov bp,[ypartialdown] ; ypartial = ypartialdown
+ jmp initvars
+
+not180:
+ cmp cx,DEG270
+ jge not270
+;----------
+;
+; 180-269 degree arc
+;
+;----------
+ mov [xtilestep],-1 ; xtilestep = -1
+ mov [ytilestep],1 ; ytilestep = 1
+ mov [BYTE cs:horizop],OP_JLE ; patch a jle in
+ mov [BYTE cs:vertop],OP_JGE ; patch a jge in
+
+ mov bx,DEG270-1
+ sub bx,cx
+ shl bx,2
+ mov ax,[es:bx]
+ mov dx,[es:bx+2]
+ neg dx
+ neg ax
+ sbb dx,0
+ mov [WORD xstep],ax
+ mov [WORD xstep+2],dx ; xstep = -finetangent[DEG270-1-angle]
+ mov bx,cx
+ shl bx,2
+ mov ax,[es:bx-DEG180*4]
+ mov dx,[es:bx+2-DEG180*4]
+ mov [WORD ystep],ax
+ mov [WORD ystep+2],dx ; ystep = finetangent[angle-DEG180]
+
+ mov bx,[xpartialdown] ; xpartial = xpartialdown
+ mov bp,[ypartialup] ; ypartial = ypartialup
+ jmp initvars
+
+
+not270:
+ cmp cx,DEG360
+ jge not360
+;----------
+;
+; 270-359 degree arc
+;
+;----------
+entry360:
+ mov ax,1
+ mov [xtilestep],ax ; xtilestep = 1
+ mov [ytilestep],ax ; ytilestep = 1
+ mov [BYTE cs:horizop],OP_JGE ; patch a jge in
+ mov [BYTE cs:vertop],OP_JGE ; patch a jge in
+
+ mov bx,cx
+ shl bx,2
+ mov ax,[es:bx-DEG270*4]
+ mov dx,[es:bx+2-DEG270*4]
+ mov [WORD xstep],ax
+ mov [WORD xstep+2],dx ; xstep = finetangent[angle-DEG270]
+ mov bx,DEG360-1
+ sub bx,cx
+ shl bx,2
+ mov ax,[es:bx]
+ mov dx,[es:bx+2]
+ mov [WORD ystep],ax
+ mov [WORD ystep+2],dx ; ystep = finetangent[DEG360-1-angle]
+
+ mov bx,[xpartialup] ; xpartial = xpartialup
+ mov bp,[ypartialup] ; ypartial = ypartialup
+ jmp initvars
+
+
+not360:
+;----------
+;
+; 360-449 degree arc
+;
+;----------
+ sub cx,FINEANGLES ; -449 is the same as 89
+ jmp entry90
+
+;---------------------------------------------------------------------------
+;
+; initialise variables for intersection testing
+;
+;---------------------------------------------------------------------------
+initvars:
+ call NEAR xpartialbyystep ; xpartial is in BX
+ add ax,[WORD viewy]
+ adc dx,[WORD viewy+2]
+ mov [WORD yintercept],ax
+ mov [WORD yintercept+2],dx
+
+ mov si,[focaltx]
+ add si,[xtilestep]
+ mov [xtile],si ; xtile = focaltx+xtilestep
+ shl si,6
+ add si,dx ; xspot = (xtile<<6) + yinttile
+
+
+ call NEAR ypartialbyxstep ; ypartial is in BP
+ add ax,[WORD viewx]
+ adc dx,[WORD viewx+2]
+ mov [WORD xintercept],ax
+ mov cx,dx
+
+ mov bx,[focalty]
+ add bx,[ytilestep]
+ mov bp,bx ; ytile = focalty+ytilestep
+ mov di,dx
+ shl di,6
+ add di,bx ; yspot = (xinttile<<6) + ytile
+
+ mov bx,[xtile]
+ mov dx,[WORD yintercept+2]
+ mov ax,SCREENSEG
+ mov es,ax ; faster than mov es,[screenseg]
+
+
+;---------------------------------------------------------------------------
+;
+; trace along this angle until we hit a wall
+;
+; CORE LOOP!
+;
+; All variables are killed when a wall is hit
+;
+; AX : scratch
+; BX : xtile
+; CX : high word of xintercept
+; DX : high word of yintercept
+; SI : xspot (yinttile<<6)+xtile (index into tilemap and spotvis)
+; DI : yspot (xinttile<<6)+ytile (index into tilemap and spotvis)
+; BP : ytile
+; ES : screenseg
+;
+;---------------------------------------------------------------------------
+
+;-----------
+;
+; check intersections with vertical walls
+;
+;-----------
+
+ EVEN
+vertcheck:
+ cmp dx,bp
+vertop: ; 0x7e = jle (ytilestep==-1)
+ jle horizentry ; 0x7d = jge (ytilestep==1)
+vertentry:
+ test [BYTE tilemap+si],0ffh ; tilehit = *((byte *)tilemap+xspot);
+ jnz hitvert
+passvert:
+ mov [BYTE spotvis+si],1 ; *((byte *)spotvis+xspot) = true;
+ add bx,[xtilestep] ; xtile+=xtilestep
+ mov ax,[WORD ystep]
+ add [WORD yintercept],ax ; yintercept += ystep
+ adc dx,[WORD ystep+2]
+ mov si,bx
+ shl si,6
+ add si,dx ; xspot = (xtile<<6)+yinttile
+ jmp vertcheck
+
+ EVEN
+hitvert:
+ mov al,[BYTE tilemap+si] ; tilehit = *((byte *)tilemap+xspot);
+ mov [BYTE tilehit],al
+ or al,al ; set flags
+ jns notvertdoor
+ jmp vertdoor
+notvertdoor:
+ mov [WORD xintercept],0
+ mov [WORD xintercept+2],bx
+ mov [xtile],bx
+ mov [WORD yintercept+2],dx
+ mov [ytile],dx
+ call FAR HitVertWall
+ jmp nextpix
+
+
+;-----------
+;
+; check intersections with horizontal walls
+;
+;-----------
+ EVEN
+horizcheck:
+ cmp cx,bx
+horizop: ; 0x7e = jle (xtilestep==-1)
+ jle vertentry ; 0x7d = jge (xtilestep==1)
+horizentry:
+ test [BYTE tilemap+di],0ffh ; tilehit = *((byte *)tilemap+yspot);
+ jnz hithoriz
+passhoriz:
+ mov [BYTE spotvis+di],1 ; *((byte *)spotvis+yspot) = true;
+ add bp,[ytilestep] ; ytile+=ytilestep
+ mov ax,[WORD xstep]
+ add [WORD xintercept],ax ; xintercept += xstep
+ adc cx,[WORD xstep+2]
+ mov di,cx
+ shl di,6
+ add di,bp ; yspot = (xinttile<<6)+ytile
+ jmp horizcheck
+
+ EVEN
+hithoriz:
+ mov al,[BYTE tilemap+di] ; tilehit = *((byte *)tilemap+yspot);
+ mov [BYTE tilehit],al
+ or al,al ; set flags
+ js horizdoor
+ mov [WORD xintercept+2],cx
+ mov [xtile],cx
+ mov [WORD yintercept],0
+ mov [WORD yintercept+2],bp
+ mov [ytile],bp
+ call FAR HitHorizWall
+ jmp nextpix
+
+;---------------------------------------------------------------------------
+;
+; next pixel over
+;
+;---------------------------------------------------------------------------
+
+nextpix:
+ mov ax,[pixx]
+ inc ax
+ mov [pixx],ax
+ cmp ax,[viewwidth]
+ jge done
+ jmp pixxloop
+done:
+ pop bp
+ pop di
+ pop si
+ retf
+
+;===========================================================================
+
+;=============
+;
+; hit a special horizontal wall, so find which coordinate a door would be
+; intersected at, and check to see if the door is open past that point
+;
+;=============
+horizdoor:
+ mov [xtile],bx ; save off live register variables
+ mov [WORD yintercept+2],dx
+
+ test al,040h ; both high bits set == pushable wall
+ jnz horizpushwall
+
+ mov bx,ax
+ and bx,7fh ; strip high bit
+ shl bx,1 ; index into word width door table
+
+ mov ax,[WORD xstep]
+ mov dx,[WORD xstep+2]
+ sar dx,1
+ rcr ax,1 ; half a step gets to door position
+
+ add ax,[WORD xintercept] ; add half step to current intercept pos
+ adc dx,cx ; CX hold high word of xintercept
+
+ cmp cx,dx ; is it still in the same tile?
+ je hithmid
+;
+; midpoint is outside tile, so it hit the side of the wall before a door
+;
+continuehoriz:
+ mov bx,[xtile] ; reload register variables
+ mov dx,[WORD yintercept+2]
+ jmp passhoriz ; continue tracing
+;
+; the trace hit the door plane at pixel position AX, see if the door is
+; closed that much
+;
+hithmid:
+ cmp ax,[doorposition+bx] ; position of leading edge of door
+ jb continuehoriz
+;
+; draw the door
+;
+ mov [WORD xintercept],ax ; save pixel intercept position
+ mov [WORD xintercept+2],cx
+
+ mov [WORD yintercept],8000h ; intercept in middle of tile
+ mov [WORD yintercept+2],bp
+
+ call FAR HitHorizDoor
+ jmp nextpix
+
+;============
+;
+; hit a sliding horizontal wall
+;
+;============
+
+horizpushwall:
+ mov ax,[WORD xstep+2] ; multiply xstep by pwallmove (0-63)
+ mul [pwallpos]
+ mov bx,ax
+ mov ax,[WORD xstep]
+ mul [pwallpos]
+ add dx,bx
+
+ sar dx,1 ; then divide by 64 to accomplish a
+ rcr ax,1 ; fixed point multiplication
+ sar dx,1
+ rcr ax,1
+ sar dx,1
+ rcr ax,1
+ sar dx,1
+ rcr ax,1
+ sar dx,1
+ rcr ax,1
+ sar dx,1
+ rcr ax,1
+
+ add ax,[WORD xintercept] ; add partial step to current intercept
+ adc dx,cx ; CX hold high word of xintercept
+
+ cmp cx,dx ; is it still in the same tile?
+ jne continuehoriz ; no, it hit the side
+
+;
+; draw the pushable wall at the new height
+;
+ mov [WORD xintercept],ax ; save pixel intercept position
+ mov [WORD xintercept+2],dx
+
+ mov [WORD yintercept+2],bp
+ mov [WORD yintercept],0
+
+ call FAR HitHorizPWall
+ jmp nextpix
+
+
+
+;===========================================================================
+
+;=============
+;
+; hit a special vertical wall, so find which coordinate a door would be
+; intersected at, and check to see if the door is open past that point
+;
+;=============
+vertdoor:
+ mov [xtile],bx ; save off live register variables
+ mov [WORD yintercept+2],dx
+
+ test al,040h ; both high bits set == pushable wall
+ jnz vertpushwall
+
+ mov bx,ax
+ and bx,7fh ; strip high bit
+ shl bx,1 ; index into word width doorposition
+
+ mov ax,[WORD ystep]
+ mov dx,[WORD ystep+2]
+ sar dx,1
+ rcr ax,1 ; half a step gets to door position
+
+ add ax,[WORD yintercept] ; add half step to current intercept pos
+ adc dx,[WORD yintercept+2]
+
+ cmp [WORD yintercept+2],dx ; is it still in the same tile?
+ je hitvmid
+;
+; midpoint is outside tile, so it hit the side of the wall before a door
+;
+continuevert:
+ mov bx,[xtile] ; reload register variables
+ mov dx,[WORD yintercept+2]
+ jmp passvert ; continue tracing
+;
+; the trace hit the door plane at pixel position AX, see if the door is
+; closed that much
+;
+hitvmid:
+ cmp ax,[doorposition+bx] ; position of leading edge of door
+ jb continuevert
+;
+; draw the door
+;
+ mov [WORD yintercept],ax ; save pixel intercept position
+ mov [WORD xintercept],8000h ; intercept in middle of tile
+ mov ax,[xtile]
+ mov [WORD xintercept+2],ax
+
+ call FAR HitVertDoor
+ jmp nextpix
+
+;============
+;
+; hit a sliding vertical wall
+;
+;============
+
+vertpushwall:
+ mov ax,[WORD ystep+2] ; multiply ystep by pwallmove (0-63)
+ mul [pwallpos]
+ mov bx,ax
+ mov ax,[WORD ystep]
+ mul [pwallpos]
+ add dx,bx
+
+ sar dx,1 ; then divide by 64 to accomplish a
+ rcr ax,1 ; fixed point multiplication
+ sar dx,1
+ rcr ax,1
+ sar dx,1
+ rcr ax,1
+ sar dx,1
+ rcr ax,1
+ sar dx,1
+ rcr ax,1
+ sar dx,1
+ rcr ax,1
+
+ add ax,[WORD yintercept] ; add partial step to current intercept
+ adc dx,[WORD yintercept+2]
+
+ cmp [WORD yintercept+2],dx ; is it still in the same tile?
+ jne continuevert ; no, it hit the side
+
+;
+; draw the pushable wall at the new height
+;
+ mov [WORD yintercept],ax ; save pixel intercept position
+ mov [WORD yintercept+2],dx
+
+ mov bx,[xtile]
+ mov [WORD xintercept+2],bx
+ mov [WORD xintercept],0
+
+ call FAR HitVertPWall
+ jmp nextpix
+
+
+
+ENDP
+
+
+END
+
+
--- /dev/null
+++ b/draw.c
@@ -1,0 +1,1403 @@
+// WL_DRAW.C
+
+#include "WL_DEF.H"
+#include <DOS.H>
+#pragma hdrstop
+
+//#define DEBUGWALLS
+//#define DEBUGTICS
+
+/*
+=============================================================================
+
+ LOCAL CONSTANTS
+
+=============================================================================
+*/
+
+// the door is the last picture before the sprites
+#define DOORWALL (PMSpriteStart-8)
+
+#define ACTORSIZE 0x4000
+
+/*
+=============================================================================
+
+ GLOBAL VARIABLES
+
+=============================================================================
+*/
+
+
+#ifdef DEBUGWALLS
+unsigned screenloc[3]= {0,0,0};
+#else
+unsigned screenloc[3]= {PAGE1START,PAGE2START,PAGE3START};
+#endif
+unsigned freelatch = FREESTART;
+
+long lasttimecount;
+long frameon;
+
+unsigned wallheight[MAXVIEWWIDTH];
+
+fixed tileglobal = TILEGLOBAL;
+fixed mindist = MINDIST;
+
+
+//
+// math tables
+//
+int pixelangle[MAXVIEWWIDTH];
+long far finetangent[FINEANGLES/4];
+fixed far sintable[ANGLES+ANGLES/4],far *costable = sintable+(ANGLES/4);
+
+//
+// refresh variables
+//
+fixed viewx,viewy; // the focal point
+int viewangle;
+fixed viewsin,viewcos;
+
+
+
+fixed FixedByFrac (fixed a, fixed b);
+void TransformActor (objtype *ob);
+void BuildTables (void);
+void ClearScreen (void);
+int CalcRotate (objtype *ob);
+void DrawScaleds (void);
+void CalcTics (void);
+void FixOfs (void);
+void ThreeDRefresh (void);
+
+
+
+//
+// wall optimization variables
+//
+int lastside; // true for vertical
+long lastintercept;
+int lasttilehit;
+
+
+//
+// ray tracing variables
+//
+int focaltx,focalty,viewtx,viewty;
+
+int midangle,angle;
+unsigned xpartial,ypartial;
+unsigned xpartialup,xpartialdown,ypartialup,ypartialdown;
+unsigned xinttile,yinttile;
+
+unsigned tilehit;
+unsigned pixx;
+
+int xtile,ytile;
+int xtilestep,ytilestep;
+long xintercept,yintercept;
+long xstep,ystep;
+
+int horizwall[MAXWALLTILES],vertwall[MAXWALLTILES];
+
+
+/*
+=============================================================================
+
+ LOCAL VARIABLES
+
+=============================================================================
+*/
+
+
+void AsmRefresh (void); // in WL_DR_A.ASM
+
+/*
+============================================================================
+
+ 3 - D DEFINITIONS
+
+============================================================================
+*/
+
+
+//==========================================================================
+
+
+/*
+========================
+=
+= FixedByFrac
+=
+= multiply a 16/16 bit, 2's complement fixed point number by a 16 bit
+= fraction, passed as a signed magnitude 32 bit number
+=
+========================
+*/
+
+#pragma warn -rvl // I stick the return value in with ASMs
+
+fixed FixedByFrac (fixed a, fixed b)
+{
+//
+// setup
+//
+asm mov si,[WORD PTR b+2] // sign of result = sign of fraction
+
+asm mov ax,[WORD PTR a]
+asm mov cx,[WORD PTR a+2]
+
+asm or cx,cx
+asm jns aok: // negative?
+asm neg cx
+asm neg ax
+asm sbb cx,0
+asm xor si,0x8000 // toggle sign of result
+aok:
+
+//
+// multiply cx:ax by bx
+//
+asm mov bx,[WORD PTR b]
+asm mul bx // fraction*fraction
+asm mov di,dx // di is low word of result
+asm mov ax,cx //
+asm mul bx // units*fraction
+asm add ax,di
+asm adc dx,0
+
+//
+// put result dx:ax in 2's complement
+//
+asm test si,0x8000 // is the result negative?
+asm jz ansok:
+asm neg dx
+asm neg ax
+asm sbb dx,0
+
+ansok:;
+
+}
+
+#pragma warn +rvl
+
+//==========================================================================
+
+/*
+========================
+=
+= TransformActor
+=
+= Takes paramaters:
+= gx,gy : globalx/globaly of point
+=
+= globals:
+= viewx,viewy : point of view
+= viewcos,viewsin : sin/cos of viewangle
+= scale : conversion from global value to screen value
+=
+= sets:
+= screenx,transx,transy,screenheight: projected edge location and size
+=
+========================
+*/
+
+
+//
+// transform actor
+//
+void TransformActor (objtype *ob)
+{
+ int ratio;
+ fixed gx,gy,gxt,gyt,nx,ny;
+ long temp;
+
+//
+// translate point to view centered coordinates
+//
+ gx = ob->x-viewx;
+ gy = ob->y-viewy;
+
+//
+// calculate newx
+//
+ gxt = FixedByFrac(gx,viewcos);
+ gyt = FixedByFrac(gy,viewsin);
+ nx = gxt-gyt-ACTORSIZE; // fudge the shape forward a bit, because
+ // the midpoint could put parts of the shape
+ // into an adjacent wall
+
+//
+// calculate newy
+//
+ gxt = FixedByFrac(gx,viewsin);
+ gyt = FixedByFrac(gy,viewcos);
+ ny = gyt+gxt;
+
+//
+// calculate perspective ratio
+//
+ ob->transx = nx;
+ ob->transy = ny;
+
+ if (nx<mindist) // too close, don't overflow the divide
+ {
+ ob->viewheight = 0;
+ return;
+ }
+
+ ob->viewx = centerx + ny*scale/nx; // DEBUG: use assembly divide
+
+//
+// calculate height (heightnumerator/(nx>>8))
+//
+ asm mov ax,[WORD PTR heightnumerator]
+ asm mov dx,[WORD PTR heightnumerator+2]
+ asm idiv [WORD PTR nx+1] // nx>>8
+ asm mov [WORD PTR temp],ax
+ asm mov [WORD PTR temp+2],dx
+
+ ob->viewheight = temp;
+}
+
+//==========================================================================
+
+/*
+========================
+=
+= TransformTile
+=
+= Takes paramaters:
+= tx,ty : tile the object is centered in
+=
+= globals:
+= viewx,viewy : point of view
+= viewcos,viewsin : sin/cos of viewangle
+= scale : conversion from global value to screen value
+=
+= sets:
+= screenx,transx,transy,screenheight: projected edge location and size
+=
+= Returns true if the tile is withing getting distance
+=
+========================
+*/
+
+boolean TransformTile (int tx, int ty, int *dispx, int *dispheight)
+{
+ int ratio;
+ fixed gx,gy,gxt,gyt,nx,ny;
+ long temp;
+
+//
+// translate point to view centered coordinates
+//
+ gx = ((long)tx<<TILESHIFT)+0x8000-viewx;
+ gy = ((long)ty<<TILESHIFT)+0x8000-viewy;
+
+//
+// calculate newx
+//
+ gxt = FixedByFrac(gx,viewcos);
+ gyt = FixedByFrac(gy,viewsin);
+ nx = gxt-gyt-0x2000; // 0x2000 is size of object
+
+//
+// calculate newy
+//
+ gxt = FixedByFrac(gx,viewsin);
+ gyt = FixedByFrac(gy,viewcos);
+ ny = gyt+gxt;
+
+
+//
+// calculate perspective ratio
+//
+ if (nx<mindist) // too close, don't overflow the divide
+ {
+ *dispheight = 0;
+ return false;
+ }
+
+ *dispx = centerx + ny*scale/nx; // DEBUG: use assembly divide
+
+//
+// calculate height (heightnumerator/(nx>>8))
+//
+ asm mov ax,[WORD PTR heightnumerator]
+ asm mov dx,[WORD PTR heightnumerator+2]
+ asm idiv [WORD PTR nx+1] // nx>>8
+ asm mov [WORD PTR temp],ax
+ asm mov [WORD PTR temp+2],dx
+
+ *dispheight = temp;
+
+//
+// see if it should be grabbed
+//
+ if (nx<TILEGLOBAL && ny>-TILEGLOBAL/2 && ny<TILEGLOBAL/2)
+ return true;
+ else
+ return false;
+}
+
+//==========================================================================
+
+/*
+====================
+=
+= CalcHeight
+=
+= Calculates the height of xintercept,yintercept from viewx,viewy
+=
+====================
+*/
+
+#pragma warn -rvl // I stick the return value in with ASMs
+
+int CalcHeight (void)
+{
+ int transheight;
+ int ratio;
+ fixed gxt,gyt,nx,ny;
+ long gx,gy;
+
+ gx = xintercept-viewx;
+ gxt = FixedByFrac(gx,viewcos);
+
+ gy = yintercept-viewy;
+ gyt = FixedByFrac(gy,viewsin);
+
+ nx = gxt-gyt;
+
+ //
+ // calculate perspective ratio (heightnumerator/(nx>>8))
+ //
+ if (nx<mindist)
+ nx=mindist; // don't let divide overflow
+
+ asm mov ax,[WORD PTR heightnumerator]
+ asm mov dx,[WORD PTR heightnumerator+2]
+ asm idiv [WORD PTR nx+1] // nx>>8
+}
+
+
+//==========================================================================
+
+/*
+===================
+=
+= ScalePost
+=
+===================
+*/
+
+long postsource;
+unsigned postx;
+unsigned postwidth;
+
+void near ScalePost (void) // VGA version
+{
+ asm mov ax,SCREENSEG
+ asm mov es,ax
+
+ asm mov bx,[postx]
+ asm shl bx,1
+ asm mov bp,WORD PTR [wallheight+bx] // fractional height (low 3 bits frac)
+ asm and bp,0xfff8 // bp = heightscaler*4
+ asm shr bp,1
+ asm cmp bp,[maxscaleshl2]
+ asm jle heightok
+ asm mov bp,[maxscaleshl2]
+heightok:
+ asm add bp,OFFSET fullscalefarcall
+ //
+ // scale a byte wide strip of wall
+ //
+ asm mov bx,[postx]
+ asm mov di,bx
+ asm shr di,2 // X in bytes
+ asm add di,[bufferofs]
+
+ asm and bx,3
+ asm shl bx,3 // bx = pixel*8+pixwidth
+ asm add bx,[postwidth]
+
+ asm mov al,BYTE PTR [mapmasks1-1+bx] // -1 because no widths of 0
+ asm mov dx,SC_INDEX+1
+ asm out dx,al // set bit mask register
+ asm lds si,DWORD PTR [postsource]
+ asm call DWORD PTR [bp] // scale the line of pixels
+
+ asm mov al,BYTE PTR [ss:mapmasks2-1+bx] // -1 because no widths of 0
+ asm or al,al
+ asm jz nomore
+
+ //
+ // draw a second byte for vertical strips that cross two bytes
+ //
+ asm inc di
+ asm out dx,al // set bit mask register
+ asm call DWORD PTR [bp] // scale the line of pixels
+
+ asm mov al,BYTE PTR [ss:mapmasks3-1+bx] // -1 because no widths of 0
+ asm or al,al
+ asm jz nomore
+ //
+ // draw a third byte for vertical strips that cross three bytes
+ //
+ asm inc di
+ asm out dx,al // set bit mask register
+ asm call DWORD PTR [bp] // scale the line of pixels
+
+
+nomore:
+ asm mov ax,ss
+ asm mov ds,ax
+}
+
+void FarScalePost (void) // just so other files can call
+{
+ ScalePost ();
+}
+
+
+/*
+====================
+=
+= HitVertWall
+=
+= tilehit bit 7 is 0, because it's not a door tile
+= if bit 6 is 1 and the adjacent tile is a door tile, use door side pic
+=
+====================
+*/
+
+void HitVertWall (void)
+{
+ int wallpic;
+ unsigned texture;
+
+ texture = (yintercept>>4)&0xfc0;
+ if (xtilestep == -1)
+ {
+ texture = 0xfc0-texture;
+ xintercept += TILEGLOBAL;
+ }
+ wallheight[pixx] = CalcHeight();
+
+ if (lastside==1 && lastintercept == xtile && lasttilehit == tilehit)
+ {
+ // in the same wall type as last time, so check for optimized draw
+ if (texture == (unsigned)postsource)
+ {
+ // wide scale
+ postwidth++;
+ wallheight[pixx] = wallheight[pixx-1];
+ return;
+ }
+ else
+ {
+ ScalePost ();
+ (unsigned)postsource = texture;
+ postwidth = 1;
+ postx = pixx;
+ }
+ }
+ else
+ {
+ // new wall
+ if (lastside != -1) // if not the first scaled post
+ ScalePost ();
+
+ lastside = true;
+ lastintercept = xtile;
+
+ lasttilehit = tilehit;
+ postx = pixx;
+ postwidth = 1;
+
+ if (tilehit & 0x40)
+ { // check for adjacent doors
+ ytile = yintercept>>TILESHIFT;
+ if ( tilemap[xtile-xtilestep][ytile]&0x80 )
+ wallpic = DOORWALL+3;
+ else
+ wallpic = vertwall[tilehit & ~0x40];
+ }
+ else
+ wallpic = vertwall[tilehit];
+
+ *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(wallpic);
+ (unsigned)postsource = texture;
+
+ }
+}
+
+
+/*
+====================
+=
+= HitHorizWall
+=
+= tilehit bit 7 is 0, because it's not a door tile
+= if bit 6 is 1 and the adjacent tile is a door tile, use door side pic
+=
+====================
+*/
+
+void HitHorizWall (void)
+{
+ int wallpic;
+ unsigned texture;
+
+ texture = (xintercept>>4)&0xfc0;
+ if (ytilestep == -1)
+ yintercept += TILEGLOBAL;
+ else
+ texture = 0xfc0-texture;
+ wallheight[pixx] = CalcHeight();
+
+ if (lastside==0 && lastintercept == ytile && lasttilehit == tilehit)
+ {
+ // in the same wall type as last time, so check for optimized draw
+ if (texture == (unsigned)postsource)
+ {
+ // wide scale
+ postwidth++;
+ wallheight[pixx] = wallheight[pixx-1];
+ return;
+ }
+ else
+ {
+ ScalePost ();
+ (unsigned)postsource = texture;
+ postwidth = 1;
+ postx = pixx;
+ }
+ }
+ else
+ {
+ // new wall
+ if (lastside != -1) // if not the first scaled post
+ ScalePost ();
+
+ lastside = 0;
+ lastintercept = ytile;
+
+ lasttilehit = tilehit;
+ postx = pixx;
+ postwidth = 1;
+
+ if (tilehit & 0x40)
+ { // check for adjacent doors
+ xtile = xintercept>>TILESHIFT;
+ if ( tilemap[xtile][ytile-ytilestep]&0x80 )
+ wallpic = DOORWALL+2;
+ else
+ wallpic = horizwall[tilehit & ~0x40];
+ }
+ else
+ wallpic = horizwall[tilehit];
+
+ *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(wallpic);
+ (unsigned)postsource = texture;
+ }
+
+}
+
+//==========================================================================
+
+/*
+====================
+=
+= HitHorizDoor
+=
+====================
+*/
+
+void HitHorizDoor (void)
+{
+ unsigned texture,doorpage,doornum;
+
+ doornum = tilehit&0x7f;
+ texture = ( (xintercept-doorposition[doornum]) >> 4) &0xfc0;
+
+ wallheight[pixx] = CalcHeight();
+
+ if (lasttilehit == tilehit)
+ {
+ // in the same door as last time, so check for optimized draw
+ if (texture == (unsigned)postsource)
+ {
+ // wide scale
+ postwidth++;
+ wallheight[pixx] = wallheight[pixx-1];
+ return;
+ }
+ else
+ {
+ ScalePost ();
+ (unsigned)postsource = texture;
+ postwidth = 1;
+ postx = pixx;
+ }
+ }
+ else
+ {
+ if (lastside != -1) // if not the first scaled post
+ ScalePost (); // draw last post
+ // first pixel in this door
+ lastside = 2;
+ lasttilehit = tilehit;
+ postx = pixx;
+ postwidth = 1;
+
+ switch (doorobjlist[doornum].lock)
+ {
+ case dr_normal:
+ doorpage = DOORWALL;
+ break;
+ case dr_lock1:
+ case dr_lock2:
+ case dr_lock3:
+ case dr_lock4:
+ doorpage = DOORWALL+6;
+ break;
+ case dr_elevator:
+ doorpage = DOORWALL+4;
+ break;
+ }
+
+ *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(doorpage);
+ (unsigned)postsource = texture;
+ }
+}
+
+//==========================================================================
+
+/*
+====================
+=
+= HitVertDoor
+=
+====================
+*/
+
+void HitVertDoor (void)
+{
+ unsigned texture,doorpage,doornum;
+
+ doornum = tilehit&0x7f;
+ texture = ( (yintercept-doorposition[doornum]) >> 4) &0xfc0;
+
+ wallheight[pixx] = CalcHeight();
+
+ if (lasttilehit == tilehit)
+ {
+ // in the same door as last time, so check for optimized draw
+ if (texture == (unsigned)postsource)
+ {
+ // wide scale
+ postwidth++;
+ wallheight[pixx] = wallheight[pixx-1];
+ return;
+ }
+ else
+ {
+ ScalePost ();
+ (unsigned)postsource = texture;
+ postwidth = 1;
+ postx = pixx;
+ }
+ }
+ else
+ {
+ if (lastside != -1) // if not the first scaled post
+ ScalePost (); // draw last post
+ // first pixel in this door
+ lastside = 2;
+ lasttilehit = tilehit;
+ postx = pixx;
+ postwidth = 1;
+
+ switch (doorobjlist[doornum].lock)
+ {
+ case dr_normal:
+ doorpage = DOORWALL;
+ break;
+ case dr_lock1:
+ case dr_lock2:
+ case dr_lock3:
+ case dr_lock4:
+ doorpage = DOORWALL+6;
+ break;
+ case dr_elevator:
+ doorpage = DOORWALL+4;
+ break;
+ }
+
+ *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(doorpage+1);
+ (unsigned)postsource = texture;
+ }
+}
+
+//==========================================================================
+
+
+/*
+====================
+=
+= HitHorizPWall
+=
+= A pushable wall in action has been hit
+=
+====================
+*/
+
+void HitHorizPWall (void)
+{
+ int wallpic;
+ unsigned texture,offset;
+
+ texture = (xintercept>>4)&0xfc0;
+ offset = pwallpos<<10;
+ if (ytilestep == -1)
+ yintercept += TILEGLOBAL-offset;
+ else
+ {
+ texture = 0xfc0-texture;
+ yintercept += offset;
+ }
+
+ wallheight[pixx] = CalcHeight();
+
+ if (lasttilehit == tilehit)
+ {
+ // in the same wall type as last time, so check for optimized draw
+ if (texture == (unsigned)postsource)
+ {
+ // wide scale
+ postwidth++;
+ wallheight[pixx] = wallheight[pixx-1];
+ return;
+ }
+ else
+ {
+ ScalePost ();
+ (unsigned)postsource = texture;
+ postwidth = 1;
+ postx = pixx;
+ }
+ }
+ else
+ {
+ // new wall
+ if (lastside != -1) // if not the first scaled post
+ ScalePost ();
+
+ lasttilehit = tilehit;
+ postx = pixx;
+ postwidth = 1;
+
+ wallpic = horizwall[tilehit&63];
+
+ *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(wallpic);
+ (unsigned)postsource = texture;
+ }
+
+}
+
+
+/*
+====================
+=
+= HitVertPWall
+=
+= A pushable wall in action has been hit
+=
+====================
+*/
+
+void HitVertPWall (void)
+{
+ int wallpic;
+ unsigned texture,offset;
+
+ texture = (yintercept>>4)&0xfc0;
+ offset = pwallpos<<10;
+ if (xtilestep == -1)
+ {
+ xintercept += TILEGLOBAL-offset;
+ texture = 0xfc0-texture;
+ }
+ else
+ xintercept += offset;
+
+ wallheight[pixx] = CalcHeight();
+
+ if (lasttilehit == tilehit)
+ {
+ // in the same wall type as last time, so check for optimized draw
+ if (texture == (unsigned)postsource)
+ {
+ // wide scale
+ postwidth++;
+ wallheight[pixx] = wallheight[pixx-1];
+ return;
+ }
+ else
+ {
+ ScalePost ();
+ (unsigned)postsource = texture;
+ postwidth = 1;
+ postx = pixx;
+ }
+ }
+ else
+ {
+ // new wall
+ if (lastside != -1) // if not the first scaled post
+ ScalePost ();
+
+ lasttilehit = tilehit;
+ postx = pixx;
+ postwidth = 1;
+
+ wallpic = vertwall[tilehit&63];
+
+ *( ((unsigned *)&postsource)+1) = (unsigned)PM_GetPage(wallpic);
+ (unsigned)postsource = texture;
+ }
+
+}
+
+//==========================================================================
+
+//==========================================================================
+
+#if 0
+/*
+=====================
+=
+= ClearScreen
+=
+=====================
+*/
+
+void ClearScreen (void)
+{
+ unsigned floor=egaFloor[gamestate.episode*10+mapon],
+ ceiling=egaCeiling[gamestate.episode*10+mapon];
+
+ //
+ // clear the screen
+ //
+asm mov dx,GC_INDEX
+asm mov ax,GC_MODE + 256*2 // read mode 0, write mode 2
+asm out dx,ax
+asm mov ax,GC_BITMASK + 255*256
+asm out dx,ax
+
+asm mov dx,40
+asm mov ax,[viewwidth]
+asm shr ax,3
+asm sub dx,ax // dx = 40-viewwidth/8
+
+asm mov bx,[viewwidth]
+asm shr bx,4 // bl = viewwidth/16
+asm mov bh,BYTE PTR [viewheight]
+asm shr bh,1 // half height
+
+asm mov ax,[ceiling]
+asm mov es,[screenseg]
+asm mov di,[bufferofs]
+
+toploop:
+asm mov cl,bl
+asm rep stosw
+asm add di,dx
+asm dec bh
+asm jnz toploop
+
+asm mov bh,BYTE PTR [viewheight]
+asm shr bh,1 // half height
+asm mov ax,[floor]
+
+bottomloop:
+asm mov cl,bl
+asm rep stosw
+asm add di,dx
+asm dec bh
+asm jnz bottomloop
+
+
+asm mov dx,GC_INDEX
+asm mov ax,GC_MODE + 256*10 // read mode 1, write mode 2
+asm out dx,ax
+asm mov al,GC_BITMASK
+asm out dx,al
+
+}
+#endif
+//==========================================================================
+
+unsigned vgaCeiling[]=
+{
+#ifndef SPEAR
+ 0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0xbfbf,
+ 0x4e4e,0x4e4e,0x4e4e,0x1d1d,0x8d8d,0x4e4e,0x1d1d,0x2d2d,0x1d1d,0x8d8d,
+ 0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x2d2d,0xdddd,0x1d1d,0x1d1d,0x9898,
+
+ 0x1d1d,0x9d9d,0x2d2d,0xdddd,0xdddd,0x9d9d,0x2d2d,0x4d4d,0x1d1d,0xdddd,
+ 0x7d7d,0x1d1d,0x2d2d,0x2d2d,0xdddd,0xd7d7,0x1d1d,0x1d1d,0x1d1d,0x2d2d,
+ 0x1d1d,0x1d1d,0x1d1d,0x1d1d,0xdddd,0xdddd,0x7d7d,0xdddd,0xdddd,0xdddd
+#else
+ 0x6f6f,0x4f4f,0x1d1d,0xdede,0xdfdf,0x2e2e,0x7f7f,0x9e9e,0xaeae,0x7f7f,
+ 0x1d1d,0xdede,0xdfdf,0xdede,0xdfdf,0xdede,0xe1e1,0xdcdc,0x2e2e,0x1d1d,0xdcdc
+#endif
+};
+
+/*
+=====================
+=
+= VGAClearScreen
+=
+=====================
+*/
+
+void VGAClearScreen (void)
+{
+ unsigned ceiling=vgaCeiling[gamestate.episode*10+mapon];
+
+ //
+ // clear the screen
+ //
+asm mov dx,SC_INDEX
+asm mov ax,SC_MAPMASK+15*256 // write through all planes
+asm out dx,ax
+
+asm mov dx,80
+asm mov ax,[viewwidth]
+asm shr ax,2
+asm sub dx,ax // dx = 40-viewwidth/2
+
+asm mov bx,[viewwidth]
+asm shr bx,3 // bl = viewwidth/8
+asm mov bh,BYTE PTR [viewheight]
+asm shr bh,1 // half height
+
+asm mov es,[screenseg]
+asm mov di,[bufferofs]
+asm mov ax,[ceiling]
+
+toploop:
+asm mov cl,bl
+asm rep stosw
+asm add di,dx
+asm dec bh
+asm jnz toploop
+
+asm mov bh,BYTE PTR [viewheight]
+asm shr bh,1 // half height
+asm mov ax,0x1919
+
+bottomloop:
+asm mov cl,bl
+asm rep stosw
+asm add di,dx
+asm dec bh
+asm jnz bottomloop
+}
+
+//==========================================================================
+
+/*
+=====================
+=
+= CalcRotate
+=
+=====================
+*/
+
+int CalcRotate (objtype *ob)
+{
+ int angle,viewangle;
+
+ // this isn't exactly correct, as it should vary by a trig value,
+ // but it is close enough with only eight rotations
+
+ viewangle = player->angle + (centerx - ob->viewx)/8;
+
+ if (ob->obclass == rocketobj || ob->obclass == hrocketobj)
+ angle = (viewangle-180)- ob->angle;
+ else
+ angle = (viewangle-180)- dirangle[ob->dir];
+
+ angle+=ANGLES/16;
+ while (angle>=ANGLES)
+ angle-=ANGLES;
+ while (angle<0)
+ angle+=ANGLES;
+
+ if (ob->state->rotate == 2) // 2 rotation pain frame
+ return 4*(angle/(ANGLES/2)); // seperated by 3 (art layout...)
+
+ return angle/(ANGLES/8);
+}
+
+
+/*
+=====================
+=
+= DrawScaleds
+=
+= Draws all objects that are visable
+=
+=====================
+*/
+
+#define MAXVISABLE 50
+
+typedef struct
+{
+ int viewx,
+ viewheight,
+ shapenum;
+} visobj_t;
+
+visobj_t vislist[MAXVISABLE],*visptr,*visstep,*farthest;
+
+void DrawScaleds (void)
+{
+ int i,j,least,numvisable,height;
+ memptr shape;
+ byte *tilespot,*visspot;
+ int shapenum;
+ unsigned spotloc;
+
+ statobj_t *statptr;
+ objtype *obj;
+
+ visptr = &vislist[0];
+
+//
+// place static objects
+//
+ for (statptr = &statobjlist[0] ; statptr !=laststatobj ; statptr++)
+ {
+ if ((visptr->shapenum = statptr->shapenum) == -1)
+ continue; // object has been deleted
+
+ if (!*statptr->visspot)
+ continue; // not visable
+
+ if (TransformTile (statptr->tilex,statptr->tiley
+ ,&visptr->viewx,&visptr->viewheight) && statptr->flags & FL_BONUS)
+ {
+ GetBonus (statptr);
+ continue;
+ }
+
+ if (!visptr->viewheight)
+ continue; // to close to the object
+
+ if (visptr < &vislist[MAXVISABLE-1]) // don't let it overflow
+ visptr++;
+ }
+
+//
+// place active objects
+//
+ for (obj = player->next;obj;obj=obj->next)
+ {
+ if (!(visptr->shapenum = obj->state->shapenum))
+ continue; // no shape
+
+ spotloc = (obj->tilex<<6)+obj->tiley; // optimize: keep in struct?
+ visspot = &spotvis[0][0]+spotloc;
+ tilespot = &tilemap[0][0]+spotloc;
+
+ //
+ // could be in any of the nine surrounding tiles
+ //
+ if (*visspot
+ || ( *(visspot-1) && !*(tilespot-1) )
+ || ( *(visspot+1) && !*(tilespot+1) )
+ || ( *(visspot-65) && !*(tilespot-65) )
+ || ( *(visspot-64) && !*(tilespot-64) )
+ || ( *(visspot-63) && !*(tilespot-63) )
+ || ( *(visspot+65) && !*(tilespot+65) )
+ || ( *(visspot+64) && !*(tilespot+64) )
+ || ( *(visspot+63) && !*(tilespot+63) ) )
+ {
+ obj->active = true;
+ TransformActor (obj);
+ if (!obj->viewheight)
+ continue; // too close or far away
+
+ visptr->viewx = obj->viewx;
+ visptr->viewheight = obj->viewheight;
+ if (visptr->shapenum == -1)
+ visptr->shapenum = obj->temp1; // special shape
+
+ if (obj->state->rotate)
+ visptr->shapenum += CalcRotate (obj);
+
+ if (visptr < &vislist[MAXVISABLE-1]) // don't let it overflow
+ visptr++;
+ obj->flags |= FL_VISABLE;
+ }
+ else
+ obj->flags &= ~FL_VISABLE;
+ }
+
+//
+// draw from back to front
+//
+ numvisable = visptr-&vislist[0];
+
+ if (!numvisable)
+ return; // no visable objects
+
+ for (i = 0; i<numvisable; i++)
+ {
+ least = 32000;
+ for (visstep=&vislist[0] ; visstep<visptr ; visstep++)
+ {
+ height = visstep->viewheight;
+ if (height < least)
+ {
+ least = height;
+ farthest = visstep;
+ }
+ }
+ //
+ // draw farthest
+ //
+ ScaleShape(farthest->viewx,farthest->shapenum,farthest->viewheight);
+
+ farthest->viewheight = 32000;
+ }
+
+}
+
+//==========================================================================
+
+/*
+==============
+=
+= DrawPlayerWeapon
+=
+= Draw the player's hands
+=
+==============
+*/
+
+int weaponscale[NUMWEAPONS] = {SPR_KNIFEREADY,SPR_PISTOLREADY
+ ,SPR_MACHINEGUNREADY,SPR_CHAINREADY};
+
+void DrawPlayerWeapon (void)
+{
+ int shapenum;
+
+#ifndef SPEAR
+ if (gamestate.victoryflag)
+ {
+ if (player->state == &s_deathcam && (TimeCount&32) )
+ SimpleScaleShape(viewwidth/2,SPR_DEATHCAM,viewheight+1);
+ return;
+ }
+#endif
+
+ if (gamestate.weapon != -1)
+ {
+ shapenum = weaponscale[gamestate.weapon]+gamestate.weaponframe;
+ SimpleScaleShape(viewwidth/2,shapenum,viewheight+1);
+ }
+
+ if (demorecord || demoplayback)
+ SimpleScaleShape(viewwidth/2,SPR_DEMO,viewheight+1);
+}
+
+
+//==========================================================================
+
+
+/*
+=====================
+=
+= CalcTics
+=
+=====================
+*/
+
+void CalcTics (void)
+{
+ long newtime,oldtimecount;
+
+//
+// calculate tics since last refresh for adaptive timing
+//
+ if (lasttimecount > TimeCount)
+ TimeCount = lasttimecount; // if the game was paused a LONG time
+
+ do
+ {
+ newtime = TimeCount;
+ tics = newtime-lasttimecount;
+ } while (!tics); // make sure at least one tic passes
+
+ lasttimecount = newtime;
+
+#ifdef FILEPROFILE
+ strcpy (scratch,"\tTics:");
+ itoa (tics,str,10);
+ strcat (scratch,str);
+ strcat (scratch,"\n");
+ write (profilehandle,scratch,strlen(scratch));
+#endif
+
+ if (tics>MAXTICS)
+ {
+ TimeCount -= (tics-MAXTICS);
+ tics = MAXTICS;
+ }
+}
+
+
+//==========================================================================
+
+
+/*
+========================
+=
+= FixOfs
+=
+========================
+*/
+
+void FixOfs (void)
+{
+ VW_ScreenToScreen (displayofs,bufferofs,viewwidth/8,viewheight);
+}
+
+
+//==========================================================================
+
+
+/*
+====================
+=
+= WallRefresh
+=
+====================
+*/
+
+void WallRefresh (void)
+{
+//
+// set up variables for this view
+//
+ viewangle = player->angle;
+ midangle = viewangle*(FINEANGLES/ANGLES);
+ viewsin = sintable[viewangle];
+ viewcos = costable[viewangle];
+ viewx = player->x - FixedByFrac(focallength,viewcos);
+ viewy = player->y + FixedByFrac(focallength,viewsin);
+
+ focaltx = viewx>>TILESHIFT;
+ focalty = viewy>>TILESHIFT;
+
+ viewtx = player->x >> TILESHIFT;
+ viewty = player->y >> TILESHIFT;
+
+ xpartialdown = viewx&(TILEGLOBAL-1);
+ xpartialup = TILEGLOBAL-xpartialdown;
+ ypartialdown = viewy&(TILEGLOBAL-1);
+ ypartialup = TILEGLOBAL-ypartialdown;
+
+ lastside = -1; // the first pixel is on a new wall
+ AsmRefresh ();
+ ScalePost (); // no more optimization on last post
+}
+
+//==========================================================================
+
+/*
+========================
+=
+= ThreeDRefresh
+=
+========================
+*/
+
+void ThreeDRefresh (void)
+{
+ int tracedir;
+
+// this wouldn't need to be done except for my debugger/video wierdness
+ outportb (SC_INDEX,SC_MAPMASK);
+
+//
+// clear out the traced array
+//
+asm mov ax,ds
+asm mov es,ax
+asm mov di,OFFSET spotvis
+asm xor ax,ax
+asm mov cx,2048 // 64*64 / 2
+asm rep stosw
+
+ bufferofs += screenofs;
+
+//
+// follow the walls from there to the right, drawwing as we go
+//
+ VGAClearScreen ();
+
+ WallRefresh ();
+
+//
+// draw all the scaled images
+//
+ DrawScaleds(); // draw scaled stuff
+ DrawPlayerWeapon (); // draw player's hands
+
+//
+// show screen and time last cycle
+//
+ if (fizzlein)
+ {
+ FizzleFade(bufferofs,displayofs+screenofs,viewwidth,viewheight,20,false);
+ fizzlein = false;
+
+ lasttimecount = TimeCount = 0; // don't make a big tic count
+
+ }
+
+ bufferofs -= screenofs;
+ displayofs = bufferofs;
+
+ asm cli
+ asm mov cx,[displayofs]
+ asm mov dx,3d4h // CRTC address register
+ asm mov al,0ch // start address high register
+ asm out dx,al
+ asm inc dx
+ asm mov al,ch
+ asm out dx,al // set the high byte
+ asm sti
+
+ bufferofs += SCREENSIZE;
+ if (bufferofs > PAGE3START)
+ bufferofs = PAGE1START;
+
+ frameon++;
+ PM_NextFrame();
+}
+
+
+//===========================================================================
+
--- /dev/null
+++ b/f_spear.h
@@ -1,0 +1,87 @@
+#define ENDSTR1 "Heroes don't quit, but\ngo ahead and press Y\nif you aren't one."
+#define ENDSTR2 "Press Y to quit,\nor press N to enjoy\nmore violent diversion."
+#define ENDSTR3 "Depressing the Y key means\nyou must return to the\nhumdrum workday world."
+#define ENDSTR4 "Hey, quit or play,\nY or N:\nit's your choice."
+#define ENDSTR5 "Sure you don't want to\nwaste a few more\nproductive hours?"
+#define ENDSTR6 "I think you had better\nplay some more. Please\npress N...please?"
+#define ENDSTR7 "If you are tough, press N.\nIf not, press Y daintily."
+#define ENDSTR8 "I'm thinkin' that\nyou might wanna press N\nto play more. You do it."
+#define ENDSTR9 "Sure. Fine. Quit.\nSee if we care.\nGet it over with.\nPress Y."
+
+#define STR_ENDGAME1 "We owe you a great debt, Mr. Blazkowicz."
+#define STR_ENDGAME2 "You have served your country well."
+#define STR_ENDGAME3 "With the spear gone, the Allies will finally"
+#define STR_ENDGAME4 "by able to destroy Hitler..."
+
+#define STR_COPY1 "That's close, but not close enough to get"
+#define STR_COPY2 "you into the game."
+
+#define STR_COPY3 "Wow, you must have the early version of the"
+#define STR_COPY4 "manual with the totally false information in it."
+
+#define STR_COPY5 "I would let you into the game, but seeing"
+#define STR_COPY6 "as that was not at all the right answer..."
+
+#define STR_COPY7 "It's just too bad we can't get together on"
+#define STR_COPY8 "this one. Sorry."
+
+#define STR_COPY9 "Hey, you're just SO off base!"
+
+#define STR_COPY10 "You know, I once typed that myself when"
+#define STR_COPY11 "I was your age."
+
+#define STR_COPY12 "Nops. Zero points. Zugga."
+
+#define STR_COPY13 "Yeah...right."
+
+#define STR_COPY14 "You must like these quizzes."
+
+#define STR_COPY15 "Could be called \"PixelMeister\"?"
+
+#define STR_COPY16 "Might engineer some software?"
+
+#define STR_COPY17 "Would be found"
+#define STR_COPY18 "directing creatively?"
+
+#define STR_COPY19 "Might be found"
+#define STR_COPY20 "handling operations?"
+
+#define STR_COPY21 "Has a name familiar"
+#define STR_COPY22 "to your weatherman?"
+
+#define STR_NOPE1 "Welcome to the DOS prompt, pirate!"
+#define STR_NOPE2 "Eat hot DOS prompt, goober!"
+#define STR_NOPE3 "Ya know, this program doesn't cost that much."
+#define STR_NOPE4 "Hey...weren't you just AT this DOS prompt?"
+#define STR_NOPE5 "What's a nice user like you doin' at a DOS prompt like this?"
+#define STR_NOPE6 "Well, I'm sure you just \"misplaced\" the manual..."
+#define STR_NOPE7 "Run me again when you've boned up on your manual a bit."
+#define STR_NOPE8 "Nice try, but no Spear."
+#define STR_NOPE9 "That information is in the Spear of Destiny manual, by the way."
+
+#define STR_MISC1 "Under \"Killing the Enemy\", what"
+#define STR_MISC2 "type of enemy is pictured?"
+
+#define STR_MISC3 "How many eyelets are on B.J.'s"
+#define STR_MISC4 "boots? (see page 2)"
+
+#define STR_MISC5 "The word \"minister\" appears in"
+#define STR_MISC6 "what gray shape on page 2?"
+
+#define STR_MISC7 "How many bullets does B.J. have"
+#define STR_MISC8 "on the screen-shot in the middle"
+#define STR_MISC9 "of page 9?"
+
+#define STR_STAR "star"
+#define STR_DEBRIEF " DEBRIEFING\n SESSION\n"
+#define STR_ENEMY1 "Name the member of the"
+#define STR_ENEMY2 "enemy forces shown above"
+
+#define STR_CHECKMAN "CHECK YER MANUAL!"
+#define STR_MAN1 "Which manual page"
+#define STR_MAN2 "is the Options Menu"
+#define STR_MAN3 "function"
+#define STR_MAN4 "on?"
+
+#define STR_ID1 "Which member of Id Software:"
+
\ No newline at end of file
--- /dev/null
+++ b/foreign.h
@@ -1,0 +1,110 @@
+#define QUITSUR "Are you sure you want\n"\
+ "to quit this great game?"
+
+#define CURGAME "You are currently in\n"\
+ "a game. Continuing will\n"\
+ "erase old game. Ok?"
+
+#define GAMESVD "There's already a game\n"\
+ "saved at this position.\n"\
+ " Overwrite?"
+
+#define ENDGAMESTR "Are you sure you want\n"\
+ "to end the game you\n"\
+ "are playing? (Y or N):"
+
+#define STR_NG "New Game"
+#define STR_SD "Sound"
+#define STR_CL "Control"
+#define STR_LG "Load Game"
+#define STR_SG "Save Game"
+#define STR_CV "Change View"
+#define STR_VS "View Scores"
+#define STR_EG "End Game"
+#define STR_BD "Back to Demo"
+#define STR_QT "Quit"
+
+#define STR_LOADING "Loading"
+#define STR_SAVING "Saving"
+
+#define STR_GAME "Game"
+#define STR_DEMO "Demo"
+#define STR_LGC "Load Game called\n\""
+#define STR_EMPTY "empty"
+#define STR_CALIB "Calibrate"
+#define STR_JOYST "Joystick"
+#define STR_MOVEJOY "Move joystick to\nupper left and\npress button 0\n"
+#define STR_MOVEJOY2 "Move joystick to\nlower right and\npress button 1\n"
+#define STR_ESCEXIT "ESC to exit"
+
+#define STR_NONE "None"
+#define STR_PC "PC Speaker"
+#define STR_ALSB "AdLib/Sound Blaster"
+#define STR_DISNEY "Disney Sound Source"
+#define STR_SB "Sound Blaster"
+
+#define STR_MOUSEEN "Mouse Enabled"
+#define STR_JOYEN "Joystick Enabled"
+#define STR_PORT2 "Use joystick port 2"
+#define STR_GAMEPAD "Gravis GamePad Enabled"
+#define STR_SENS "Mouse Sensitivity"
+#define STR_CUSTOM "Customize controls"
+
+#define STR_DADDY "Can I play, Daddy?"
+#define STR_HURTME "Don't hurt me."
+#define STR_BRINGEM "Bring 'em on!"
+#define STR_DEATH "I am Death incarnate!"
+
+#define STR_MOUSEADJ "Adjust Mouse Sensitivity"
+#define STR_SLOW "Slow"
+#define STR_FAST "Fast"
+
+#define STR_CRUN "Run"
+#define STR_COPEN "Open"
+#define STR_CFIRE "Fire"
+#define STR_CSTRAFE "Strafe"
+
+#define STR_LEFT "Left"
+#define STR_RIGHT "Right"
+#define STR_FRWD "Frwd"
+#define STR_BKWD "Bkwrd"
+#define STR_THINK "Thinking"
+
+#define STR_SIZE1 "Use arrows to size"
+#define STR_SIZE2 "ENTER to accept"
+#define STR_SIZE3 "ESC to cancel"
+
+#define STR_YOUWIN "you win!"
+
+#define STR_TOTALTIME "total time"
+
+#define STR_RATKILL "kill %"
+#define STR_RATSECRET "secret %"
+#define STR_RATTREASURE "treasure %"
+
+#define STR_BONUS "bonus"
+#define STR_TIME "time"
+#define STR_PAR " par"
+
+#define STR_RAT2KILL "kill ratio %"
+#define STR_RAT2SECRET "secret ratio %"
+#define STR_RAT2TREASURE "treasure ratio %"
+
+#define STR_DEFEATED "defeated!"
+
+#define STR_CHEATER1 "You now have 100% Health,"
+#define STR_CHEATER2 "99 Ammo and both Keys!"
+#define STR_CHEATER3 "Note that you have basically"
+#define STR_CHEATER4 "eliminated your chances of"
+#define STR_CHEATER5 "getting a high score!"
+
+#define STR_NOSPACE1 "There is not enough space"
+#define STR_NOSPACE2 "on your disk to Save Game!"
+
+#define STR_SAVECHT1 "Your Save Game file is,"
+#define STR_SAVECHT2 "shall we say, \"corrupted\"."
+#define STR_SAVECHT3 "But I'll let you go on and"
+#define STR_SAVECHT4 "play anyway...."
+
+#define STR_SEEAGAIN "Let's see that again!"
+
\ No newline at end of file
--- /dev/null
+++ b/game.c
@@ -1,0 +1,1484 @@
+// WL_GAME.C
+
+#include "WL_DEF.H"
+#pragma hdrstop
+
+#ifdef MYPROFILE
+#include <TIME.H>
+#endif
+
+
+/*
+=============================================================================
+
+ LOCAL CONSTANTS
+
+=============================================================================
+*/
+
+
+/*
+=============================================================================
+
+ GLOBAL VARIABLES
+
+=============================================================================
+*/
+
+boolean ingame,fizzlein;
+unsigned latchpics[NUMLATCHPICS];
+gametype gamestate;
+
+long spearx,speary;
+unsigned spearangle;
+boolean spearflag;
+
+//
+// ELEVATOR BACK MAPS - REMEMBER (-1)!!
+//
+int ElevatorBackTo[]={1,1,7,3,5,3};
+
+void ScanInfoPlane (void);
+void SetupGameLevel (void);
+void DrawPlayScreen (void);
+void LoadLatchMem (void);
+void GameLoop (void);
+
+/*
+=============================================================================
+
+ LOCAL VARIABLES
+
+=============================================================================
+*/
+
+
+
+//===========================================================================
+//===========================================================================
+
+
+/*
+==========================
+=
+= SetSoundLoc - Given the location of an object (in terms of global
+= coordinates, held in globalsoundx and globalsoundy), munges the values
+= for an approximate distance from the left and right ear, and puts
+= those values into leftchannel and rightchannel.
+=
+= JAB
+=
+==========================
+*/
+
+ fixed globalsoundx,globalsoundy;
+ int leftchannel,rightchannel;
+#define ATABLEMAX 15
+byte righttable[ATABLEMAX][ATABLEMAX * 2] = {
+{ 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 6, 0, 0, 0, 0, 0, 1, 3, 5, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 6, 4, 0, 0, 0, 0, 0, 2, 4, 6, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 6, 6, 4, 1, 0, 0, 0, 1, 2, 4, 6, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 6, 5, 4, 2, 1, 0, 1, 2, 3, 5, 7, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 6, 5, 4, 3, 2, 2, 3, 3, 5, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 6, 6, 5, 4, 4, 4, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 6, 6, 5, 5, 5, 6, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}
+};
+byte lefttable[ATABLEMAX][ATABLEMAX * 2] = {
+{ 8, 8, 8, 8, 8, 8, 8, 8, 5, 3, 1, 0, 0, 0, 0, 0, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 6, 4, 2, 0, 0, 0, 0, 0, 4, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 6, 4, 2, 1, 0, 0, 0, 1, 4, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 7, 5, 3, 2, 1, 0, 1, 2, 4, 5, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 6, 5, 3, 3, 2, 2, 3, 4, 5, 6, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 6, 5, 4, 4, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 6, 6, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 6, 6, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
+{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}
+};
+
+void
+SetSoundLoc(fixed gx,fixed gy)
+{
+ fixed xt,yt;
+ int x,y;
+
+//
+// translate point to view centered coordinates
+//
+ gx -= viewx;
+ gy -= viewy;
+
+//
+// calculate newx
+//
+ xt = FixedByFrac(gx,viewcos);
+ yt = FixedByFrac(gy,viewsin);
+ x = (xt - yt) >> TILESHIFT;
+
+//
+// calculate newy
+//
+ xt = FixedByFrac(gx,viewsin);
+ yt = FixedByFrac(gy,viewcos);
+ y = (yt + xt) >> TILESHIFT;
+
+ if (y >= ATABLEMAX)
+ y = ATABLEMAX - 1;
+ else if (y <= -ATABLEMAX)
+ y = -ATABLEMAX;
+ if (x < 0)
+ x = -x;
+ if (x >= ATABLEMAX)
+ x = ATABLEMAX - 1;
+ leftchannel = lefttable[x][y + ATABLEMAX];
+ rightchannel = righttable[x][y + ATABLEMAX];
+
+#if 0
+ CenterWindow(8,1);
+ US_PrintSigned(leftchannel);
+ US_Print(",");
+ US_PrintSigned(rightchannel);
+ VW_UpdateScreen();
+#endif
+}
+
+/*
+==========================
+=
+= SetSoundLocGlobal - Sets up globalsoundx & globalsoundy and then calls
+= UpdateSoundLoc() to transform that into relative channel volumes. Those
+= values are then passed to the Sound Manager so that they'll be used for
+= the next sound played (if possible).
+=
+= JAB
+=
+==========================
+*/
+void PlaySoundLocGlobal(word s,fixed gx,fixed gy)
+{
+ SetSoundLoc(gx,gy);
+ SD_PositionSound(leftchannel,rightchannel);
+ if (SD_PlaySound(s))
+ {
+ globalsoundx = gx;
+ globalsoundy = gy;
+ }
+}
+
+void UpdateSoundLoc(void)
+{
+ if (SoundPositioned)
+ {
+ SetSoundLoc(globalsoundx,globalsoundy);
+ SD_SetPosition(leftchannel,rightchannel);
+ }
+}
+
+/*
+** JAB End
+*/
+
+
+/*
+==========================
+=
+= ClearMemory
+=
+==========================
+*/
+
+void ClearMemory (void)
+{
+ PM_UnlockMainMem();
+ SD_StopDigitized();
+ MM_SortMem ();
+}
+
+
+/*
+==========================
+=
+= ScanInfoPlane
+=
+= Spawn all actors and mark down special places
+=
+==========================
+*/
+
+void ScanInfoPlane (void)
+{
+ unsigned x,y,i,j;
+ int tile;
+ unsigned far *start;
+
+ start = mapsegs[1];
+ for (y=0;y<mapheight;y++)
+ for (x=0;x<mapwidth;x++)
+ {
+ tile = *start++;
+ if (!tile)
+ continue;
+
+ switch (tile)
+ {
+ case 19:
+ case 20:
+ case 21:
+ case 22:
+ SpawnPlayer(x,y,NORTH+tile-19);
+ break;
+
+ case 23:
+ case 24:
+ case 25:
+ case 26:
+ case 27:
+ case 28:
+ case 29:
+ case 30:
+
+ case 31:
+ case 32:
+ case 33:
+ case 34:
+ case 35:
+ case 36:
+ case 37:
+ case 38:
+
+ case 39:
+ case 40:
+ case 41:
+ case 42:
+ case 43:
+ case 44:
+ case 45:
+ case 46:
+
+ case 47:
+ case 48:
+ case 49:
+ case 50:
+ case 51:
+ case 52:
+ case 53:
+ case 54:
+
+ case 55:
+ case 56:
+ case 57:
+ case 58:
+ case 59:
+ case 60:
+ case 61:
+ case 62:
+
+ case 63:
+ case 64:
+ case 65:
+ case 66:
+ case 67:
+ case 68:
+ case 69:
+ case 70:
+ case 71:
+ case 72:
+ case 73: // TRUCK AND SPEAR!
+ case 74:
+
+ SpawnStatic(x,y,tile-23);
+ break;
+
+//
+// P wall
+//
+ case 98:
+ if (!loadedgame)
+ gamestate.secrettotal++;
+ break;
+
+//
+// guard
+//
+ case 180:
+ case 181:
+ case 182:
+ case 183:
+ if (gamestate.difficulty<gd_hard)
+ break;
+ tile -= 36;
+ case 144:
+ case 145:
+ case 146:
+ case 147:
+ if (gamestate.difficulty<gd_medium)
+ break;
+ tile -= 36;
+ case 108:
+ case 109:
+ case 110:
+ case 111:
+ SpawnStand(en_guard,x,y,tile-108);
+ break;
+
+
+ case 184:
+ case 185:
+ case 186:
+ case 187:
+ if (gamestate.difficulty<gd_hard)
+ break;
+ tile -= 36;
+ case 148:
+ case 149:
+ case 150:
+ case 151:
+ if (gamestate.difficulty<gd_medium)
+ break;
+ tile -= 36;
+ case 112:
+ case 113:
+ case 114:
+ case 115:
+ SpawnPatrol(en_guard,x,y,tile-112);
+ break;
+
+ case 124:
+ SpawnDeadGuard (x,y);
+ break;
+//
+// officer
+//
+ case 188:
+ case 189:
+ case 190:
+ case 191:
+ if (gamestate.difficulty<gd_hard)
+ break;
+ tile -= 36;
+ case 152:
+ case 153:
+ case 154:
+ case 155:
+ if (gamestate.difficulty<gd_medium)
+ break;
+ tile -= 36;
+ case 116:
+ case 117:
+ case 118:
+ case 119:
+ SpawnStand(en_officer,x,y,tile-116);
+ break;
+
+
+ case 192:
+ case 193:
+ case 194:
+ case 195:
+ if (gamestate.difficulty<gd_hard)
+ break;
+ tile -= 36;
+ case 156:
+ case 157:
+ case 158:
+ case 159:
+ if (gamestate.difficulty<gd_medium)
+ break;
+ tile -= 36;
+ case 120:
+ case 121:
+ case 122:
+ case 123:
+ SpawnPatrol(en_officer,x,y,tile-120);
+ break;
+
+
+//
+// ss
+//
+ case 198:
+ case 199:
+ case 200:
+ case 201:
+ if (gamestate.difficulty<gd_hard)
+ break;
+ tile -= 36;
+ case 162:
+ case 163:
+ case 164:
+ case 165:
+ if (gamestate.difficulty<gd_medium)
+ break;
+ tile -= 36;
+ case 126:
+ case 127:
+ case 128:
+ case 129:
+ SpawnStand(en_ss,x,y,tile-126);
+ break;
+
+
+ case 202:
+ case 203:
+ case 204:
+ case 205:
+ if (gamestate.difficulty<gd_hard)
+ break;
+ tile -= 36;
+ case 166:
+ case 167:
+ case 168:
+ case 169:
+ if (gamestate.difficulty<gd_medium)
+ break;
+ tile -= 36;
+ case 130:
+ case 131:
+ case 132:
+ case 133:
+ SpawnPatrol(en_ss,x,y,tile-130);
+ break;
+
+//
+// dogs
+//
+ case 206:
+ case 207:
+ case 208:
+ case 209:
+ if (gamestate.difficulty<gd_hard)
+ break;
+ tile -= 36;
+ case 170:
+ case 171:
+ case 172:
+ case 173:
+ if (gamestate.difficulty<gd_medium)
+ break;
+ tile -= 36;
+ case 134:
+ case 135:
+ case 136:
+ case 137:
+ SpawnStand(en_dog,x,y,tile-134);
+ break;
+
+
+ case 210:
+ case 211:
+ case 212:
+ case 213:
+ if (gamestate.difficulty<gd_hard)
+ break;
+ tile -= 36;
+ case 174:
+ case 175:
+ case 176:
+ case 177:
+ if (gamestate.difficulty<gd_medium)
+ break;
+ tile -= 36;
+ case 138:
+ case 139:
+ case 140:
+ case 141:
+ SpawnPatrol(en_dog,x,y,tile-138);
+ break;
+
+//
+// boss
+//
+#ifndef SPEAR
+ case 214:
+ SpawnBoss (x,y);
+ break;
+ case 197:
+ SpawnGretel (x,y);
+ break;
+ case 215:
+ SpawnGift (x,y);
+ break;
+ case 179:
+ SpawnFat (x,y);
+ break;
+ case 196:
+ SpawnSchabbs (x,y);
+ break;
+ case 160:
+ SpawnFakeHitler (x,y);
+ break;
+ case 178:
+ SpawnHitler (x,y);
+ break;
+#else
+ case 106:
+ SpawnSpectre (x,y);
+ break;
+ case 107:
+ SpawnAngel (x,y);
+ break;
+ case 125:
+ SpawnTrans (x,y);
+ break;
+ case 142:
+ SpawnUber (x,y);
+ break;
+ case 143:
+ SpawnWill (x,y);
+ break;
+ case 161:
+ SpawnDeath (x,y);
+ break;
+
+#endif
+
+//
+// mutants
+//
+ case 252:
+ case 253:
+ case 254:
+ case 255:
+ if (gamestate.difficulty<gd_hard)
+ break;
+ tile -= 18;
+ case 234:
+ case 235:
+ case 236:
+ case 237:
+ if (gamestate.difficulty<gd_medium)
+ break;
+ tile -= 18;
+ case 216:
+ case 217:
+ case 218:
+ case 219:
+ SpawnStand(en_mutant,x,y,tile-216);
+ break;
+
+ case 256:
+ case 257:
+ case 258:
+ case 259:
+ if (gamestate.difficulty<gd_hard)
+ break;
+ tile -= 18;
+ case 238:
+ case 239:
+ case 240:
+ case 241:
+ if (gamestate.difficulty<gd_medium)
+ break;
+ tile -= 18;
+ case 220:
+ case 221:
+ case 222:
+ case 223:
+ SpawnPatrol(en_mutant,x,y,tile-220);
+ break;
+
+//
+// ghosts
+//
+#ifndef SPEAR
+ case 224:
+ SpawnGhosts (en_blinky,x,y);
+ break;
+ case 225:
+ SpawnGhosts (en_clyde,x,y);
+ break;
+ case 226:
+ SpawnGhosts (en_pinky,x,y);
+ break;
+ case 227:
+ SpawnGhosts (en_inky,x,y);
+ break;
+#endif
+ }
+
+ }
+}
+
+//==========================================================================
+
+/*
+==================
+=
+= SetupGameLevel
+=
+==================
+*/
+
+void SetupGameLevel (void)
+{
+ int x,y,i;
+ unsigned far *map,tile,spot;
+
+
+ if (!loadedgame)
+ {
+ gamestate.TimeCount=
+ gamestate.secrettotal=
+ gamestate.killtotal=
+ gamestate.treasuretotal=
+ gamestate.secretcount=
+ gamestate.killcount=
+ gamestate.treasurecount=0;
+ }
+
+ if (demoplayback || demorecord)
+ US_InitRndT (false);
+ else
+ US_InitRndT (true);
+
+//
+// load the level
+//
+ CA_CacheMap (gamestate.mapon+10*gamestate.episode);
+ mapon-=gamestate.episode*10;
+
+ mapwidth = mapheaderseg[mapon]->width;
+ mapheight = mapheaderseg[mapon]->height;
+
+ if (mapwidth != 64 || mapheight != 64)
+ Quit ("Map not 64*64!");
+
+
+//
+// copy the wall data to a data segment array
+//
+ memset (tilemap,0,sizeof(tilemap));
+ memset (actorat,0,sizeof(actorat));
+ map = mapsegs[0];
+ for (y=0;y<mapheight;y++)
+ for (x=0;x<mapwidth;x++)
+ {
+ tile = *map++;
+ if (tile<AREATILE)
+ {
+ // solid wall
+ tilemap[x][y] = tile;
+ (unsigned)actorat[x][y] = tile;
+ }
+ else
+ {
+ // area floor
+ tilemap[x][y] = 0;
+ (unsigned)actorat[x][y] = 0;
+ }
+ }
+
+//
+// spawn doors
+//
+ InitActorList (); // start spawning things with a clean slate
+ InitDoorList ();
+ InitStaticList ();
+
+ map = mapsegs[0];
+ for (y=0;y<mapheight;y++)
+ for (x=0;x<mapwidth;x++)
+ {
+ tile = *map++;
+ if (tile >= 90 && tile <= 101)
+ {
+ // door
+ switch (tile)
+ {
+ case 90:
+ case 92:
+ case 94:
+ case 96:
+ case 98:
+ case 100:
+ SpawnDoor (x,y,1,(tile-90)/2);
+ break;
+ case 91:
+ case 93:
+ case 95:
+ case 97:
+ case 99:
+ case 101:
+ SpawnDoor (x,y,0,(tile-91)/2);
+ break;
+ }
+ }
+ }
+
+//
+// spawn actors
+//
+ ScanInfoPlane ();
+
+//
+// take out the ambush markers
+//
+ map = mapsegs[0];
+ for (y=0;y<mapheight;y++)
+ for (x=0;x<mapwidth;x++)
+ {
+ tile = *map++;
+ if (tile == AMBUSHTILE)
+ {
+ tilemap[x][y] = 0;
+ if ( (unsigned)actorat[x][y] == AMBUSHTILE)
+ actorat[x][y] = NULL;
+
+ if (*map >= AREATILE)
+ tile = *map;
+ if (*(map-1-mapwidth) >= AREATILE)
+ tile = *(map-1-mapwidth);
+ if (*(map-1+mapwidth) >= AREATILE)
+ tile = *(map-1+mapwidth);
+ if ( *(map-2) >= AREATILE)
+ tile = *(map-2);
+
+ *(map-1) = tile;
+ }
+ }
+
+
+
+//
+// have the caching manager load and purge stuff to make sure all marks
+// are in memory
+//
+ CA_LoadAllSounds ();
+
+}
+
+
+//==========================================================================
+
+
+/*
+===================
+=
+= DrawPlayBorderSides
+=
+= To fix window overwrites
+=
+===================
+*/
+
+void DrawPlayBorderSides (void)
+{
+ int xl,yl;
+
+ xl = 160-viewwidth/2;
+ yl = (200-STATUSLINES-viewheight)/2;
+
+ VWB_Bar (0,0,xl-1,200-STATUSLINES,127);
+ VWB_Bar (xl+viewwidth+1,0,xl-2,200-STATUSLINES,127);
+
+ VWB_Vlin (yl-1,yl+viewheight,xl-1,0);
+ VWB_Vlin (yl-1,yl+viewheight,xl+viewwidth,125);
+}
+
+
+/*
+===================
+=
+= DrawAllPlayBorderSides
+=
+===================
+*/
+
+void DrawAllPlayBorderSides (void)
+{
+ unsigned i,temp;
+
+ temp = bufferofs;
+ for (i=0;i<3;i++)
+ {
+ bufferofs = screenloc[i];
+ DrawPlayBorderSides ();
+ }
+ bufferofs = temp;
+}
+
+/*
+===================
+=
+= DrawPlayBorder
+=
+===================
+*/
+void DrawAllPlayBorder (void)
+{
+ unsigned i,temp;
+
+ temp = bufferofs;
+ for (i=0;i<3;i++)
+ {
+ bufferofs = screenloc[i];
+ DrawPlayBorder ();
+ }
+ bufferofs = temp;
+}
+
+/*
+===================
+=
+= DrawPlayBorder
+=
+===================
+*/
+
+void DrawPlayBorder (void)
+{
+ int xl,yl;
+
+ VWB_Bar (0,0,320,200-STATUSLINES,127);
+
+ xl = 160-viewwidth/2;
+ yl = (200-STATUSLINES-viewheight)/2;
+ VWB_Bar (xl,yl,viewwidth,viewheight,0);
+
+ VWB_Hlin (xl-1,xl+viewwidth,yl-1,0);
+ VWB_Hlin (xl-1,xl+viewwidth,yl+viewheight,125);
+ VWB_Vlin (yl-1,yl+viewheight,xl-1,0);
+ VWB_Vlin (yl-1,yl+viewheight,xl+viewwidth,125);
+ VWB_Plot (xl-1,yl+viewheight,124);
+}
+
+
+
+/*
+===================
+=
+= DrawPlayScreen
+=
+===================
+*/
+
+void DrawPlayScreen (void)
+{
+ int i,j,p,m;
+ unsigned temp;
+
+ VW_FadeOut ();
+
+ temp = bufferofs;
+
+ CA_CacheGrChunk (STATUSBARPIC);
+
+ for (i=0;i<3;i++)
+ {
+ bufferofs = screenloc[i];
+ DrawPlayBorder ();
+ VWB_DrawPic (0,200-STATUSLINES,STATUSBARPIC);
+ }
+
+ bufferofs = temp;
+
+ UNCACHEGRCHUNK (STATUSBARPIC);
+
+ DrawFace ();
+ DrawHealth ();
+ DrawLives ();
+ DrawLevel ();
+ DrawAmmo ();
+ DrawKeys ();
+ DrawWeapon ();
+ DrawScore ();
+}
+
+
+
+//==========================================================================
+
+/*
+==================
+=
+= StartDemoRecord
+=
+==================
+*/
+
+#define MAXDEMOSIZE 8192
+
+void StartDemoRecord (int levelnumber)
+{
+ MM_GetPtr (&demobuffer,MAXDEMOSIZE);
+ MM_SetLock (&demobuffer,true);
+ demoptr = (char far *)demobuffer;
+ lastdemoptr = demoptr+MAXDEMOSIZE;
+
+ *demoptr = levelnumber;
+ demoptr += 4; // leave space for length
+ demorecord = true;
+}
+
+
+/*
+==================
+=
+= FinishDemoRecord
+=
+==================
+*/
+
+char demoname[13] = "DEMO?.";
+
+void FinishDemoRecord (void)
+{
+ long length,level;
+
+ demorecord = false;
+
+ length = demoptr - (char far *)demobuffer;
+
+ demoptr = ((char far *)demobuffer)+1;
+ *(unsigned far *)demoptr = length;
+
+ CenterWindow(24,3);
+ PrintY+=6;
+ US_Print(" Demo number (0-9):");
+ VW_UpdateScreen();
+
+ if (US_LineInput (px,py,str,NULL,true,2,0))
+ {
+ level = atoi (str);
+ if (level>=0 && level<=9)
+ {
+ demoname[4] = '0'+level;
+ CA_WriteFile (demoname,(void far *)demobuffer,length);
+ }
+ }
+
+
+ MM_FreePtr (&demobuffer);
+}
+
+//==========================================================================
+
+/*
+==================
+=
+= RecordDemo
+=
+= Fades the screen out, then starts a demo. Exits with the screen faded
+=
+==================
+*/
+
+void RecordDemo (void)
+{
+ int level,esc;
+
+ CenterWindow(26,3);
+ PrintY+=6;
+ CA_CacheGrChunk(STARTFONT);
+ fontnumber=0;
+ US_Print(" Demo which level(1-10):");
+ VW_UpdateScreen();
+ VW_FadeIn ();
+ esc = !US_LineInput (px,py,str,NULL,true,2,0);
+ if (esc)
+ return;
+
+ level = atoi (str);
+ level--;
+
+ SETFONTCOLOR(0,15);
+ VW_FadeOut ();
+
+#ifndef SPEAR
+ NewGame (gd_hard,level/10);
+ gamestate.mapon = level%10;
+#else
+ NewGame (gd_hard,0);
+ gamestate.mapon = level;
+#endif
+
+ StartDemoRecord (level);
+
+ DrawPlayScreen ();
+ VW_FadeIn ();
+
+ startgame = false;
+ demorecord = true;
+
+ SetupGameLevel ();
+ StartMusic ();
+ PM_CheckMainMem ();
+ fizzlein = true;
+
+ PlayLoop ();
+
+ demoplayback = false;
+
+ StopMusic ();
+ VW_FadeOut ();
+ ClearMemory ();
+
+ FinishDemoRecord ();
+}
+
+//==========================================================================
+
+/*
+==================
+=
+= PlayDemo
+=
+= Fades the screen out, then starts a demo. Exits with the screen faded
+=
+==================
+*/
+
+void PlayDemo (int demonumber)
+{
+ int length;
+
+#ifdef DEMOSEXTERN
+// debug: load chunk
+#ifndef SPEARDEMO
+ int dems[4]={T_DEMO0,T_DEMO1,T_DEMO2,T_DEMO3};
+#else
+ int dems[1]={T_DEMO0};
+#endif
+
+ CA_CacheGrChunk(dems[demonumber]);
+ demoptr = grsegs[dems[demonumber]];
+ MM_SetLock (&grsegs[dems[demonumber]],true);
+#else
+ demoname[4] = '0'+demonumber;
+ CA_LoadFile (demoname,&demobuffer);
+ MM_SetLock (&demobuffer,true);
+ demoptr = (char far *)demobuffer;
+#endif
+
+ NewGame (1,0);
+ gamestate.mapon = *demoptr++;
+ gamestate.difficulty = gd_hard;
+ length = *((unsigned far *)demoptr)++;
+ demoptr++;
+ lastdemoptr = demoptr-4+length;
+
+ VW_FadeOut ();
+
+ SETFONTCOLOR(0,15);
+ DrawPlayScreen ();
+ VW_FadeIn ();
+
+ startgame = false;
+ demoplayback = true;
+
+ SetupGameLevel ();
+ StartMusic ();
+ PM_CheckMainMem ();
+ fizzlein = true;
+
+ PlayLoop ();
+
+#ifdef DEMOSEXTERN
+ UNCACHEGRCHUNK(dems[demonumber]);
+#else
+ MM_FreePtr (&demobuffer);
+#endif
+
+ demoplayback = false;
+
+ StopMusic ();
+ VW_FadeOut ();
+ ClearMemory ();
+}
+
+//==========================================================================
+
+/*
+==================
+=
+= Died
+=
+==================
+*/
+
+#define DEATHROTATE 2
+
+void Died (void)
+{
+ float fangle;
+ long dx,dy;
+ int iangle,curangle,clockwise,counter,change;
+
+ gamestate.weapon = -1; // take away weapon
+ SD_PlaySound (PLAYERDEATHSND);
+//
+// swing around to face attacker
+//
+ dx = killerobj->x - player->x;
+ dy = player->y - killerobj->y;
+
+ fangle = atan2(dy,dx); // returns -pi to pi
+ if (fangle<0)
+ fangle = M_PI*2+fangle;
+
+ iangle = fangle/(M_PI*2)*ANGLES;
+
+ if (player->angle > iangle)
+ {
+ counter = player->angle - iangle;
+ clockwise = ANGLES-player->angle + iangle;
+ }
+ else
+ {
+ clockwise = iangle - player->angle;
+ counter = player->angle + ANGLES-iangle;
+ }
+
+ curangle = player->angle;
+
+ if (clockwise<counter)
+ {
+ //
+ // rotate clockwise
+ //
+ if (curangle>iangle)
+ curangle -= ANGLES;
+ do
+ {
+ change = tics*DEATHROTATE;
+ if (curangle + change > iangle)
+ change = iangle-curangle;
+
+ curangle += change;
+ player->angle += change;
+ if (player->angle >= ANGLES)
+ player->angle -= ANGLES;
+
+ ThreeDRefresh ();
+ CalcTics ();
+ } while (curangle != iangle);
+ }
+ else
+ {
+ //
+ // rotate counterclockwise
+ //
+ if (curangle<iangle)
+ curangle += ANGLES;
+ do
+ {
+ change = -tics*DEATHROTATE;
+ if (curangle + change < iangle)
+ change = iangle-curangle;
+
+ curangle += change;
+ player->angle += change;
+ if (player->angle < 0)
+ player->angle += ANGLES;
+
+ ThreeDRefresh ();
+ CalcTics ();
+ } while (curangle != iangle);
+ }
+
+//
+// fade to red
+//
+ FinishPaletteShifts ();
+
+ bufferofs += screenofs;
+ VW_Bar (0,0,viewwidth,viewheight,4);
+ IN_ClearKeysDown ();
+ FizzleFade(bufferofs,displayofs+screenofs,viewwidth,viewheight,70,false);
+ bufferofs -= screenofs;
+ IN_UserInput(100);
+ SD_WaitSoundDone ();
+
+ if (tedlevel == false) // SO'S YA DON'T GET KILLED WHILE LAUNCHING!
+ gamestate.lives--;
+
+ if (gamestate.lives > -1)
+ {
+ gamestate.health = 100;
+ gamestate.weapon = gamestate.bestweapon
+ = gamestate.chosenweapon = wp_pistol;
+ gamestate.ammo = STARTAMMO;
+ gamestate.keys = 0;
+ gamestate.attackframe = gamestate.attackcount =
+ gamestate.weaponframe = 0;
+
+ DrawKeys ();
+ DrawWeapon ();
+ DrawAmmo ();
+ DrawHealth ();
+ DrawFace ();
+ DrawLives ();
+ }
+
+}
+
+//==========================================================================
+
+/*
+===================
+=
+= GameLoop
+=
+===================
+*/
+
+void GameLoop (void)
+{
+ int i,xl,yl,xh,yh;
+ char num[20];
+ boolean died;
+#ifdef MYPROFILE
+ clock_t start,end;
+#endif
+
+restartgame:
+ ClearMemory ();
+ SETFONTCOLOR(0,15);
+ DrawPlayScreen ();
+ died = false;
+restart:
+ do
+ {
+ if (!loadedgame)
+ gamestate.score = gamestate.oldscore;
+ DrawScore();
+
+ startgame = false;
+ if (loadedgame)
+ loadedgame = false;
+ else
+ SetupGameLevel ();
+
+#ifdef SPEAR
+ if (gamestate.mapon == 20) // give them the key allways
+ {
+ gamestate.keys |= 1;
+ DrawKeys ();
+ }
+#endif
+
+ ingame = true;
+ StartMusic ();
+ PM_CheckMainMem ();
+ if (!died)
+ PreloadGraphics ();
+ else
+ died = false;
+
+ fizzlein = true;
+ DrawLevel ();
+
+startplayloop:
+ PlayLoop ();
+
+#ifdef SPEAR
+ if (spearflag)
+ {
+ SD_StopSound();
+ SD_PlaySound(GETSPEARSND);
+ if (DigiMode != sds_Off)
+ {
+ long lasttimecount = TimeCount;
+
+ while(TimeCount < lasttimecount+150)
+ //while(DigiPlaying!=false)
+ SD_Poll();
+ }
+ else
+ SD_WaitSoundDone();
+
+ ClearMemory ();
+ gamestate.oldscore = gamestate.score;
+ gamestate.mapon = 20;
+ SetupGameLevel ();
+ StartMusic ();
+ PM_CheckMainMem ();
+ player->x = spearx;
+ player->y = speary;
+ player->angle = spearangle;
+ spearflag = false;
+ Thrust (0,0);
+ goto startplayloop;
+ }
+#endif
+
+ StopMusic ();
+ ingame = false;
+
+ if (demorecord && playstate != ex_warped)
+ FinishDemoRecord ();
+
+ if (startgame || loadedgame)
+ goto restartgame;
+
+ switch (playstate)
+ {
+ case ex_completed:
+ case ex_secretlevel:
+ gamestate.keys = 0;
+ DrawKeys ();
+ VW_FadeOut ();
+
+ ClearMemory ();
+
+ LevelCompleted (); // do the intermission
+#ifdef SPEARDEMO
+ if (gamestate.mapon == 1)
+ {
+ died = true; // don't "get psyched!"
+
+ VW_FadeOut ();
+
+ ClearMemory ();
+
+ CheckHighScore (gamestate.score,gamestate.mapon+1);
+
+ #pragma warn -sus
+ #ifndef JAPAN
+ _fstrcpy(MainMenu[viewscores].string,STR_VS);
+ #endif
+ MainMenu[viewscores].routine = CP_ViewScores;
+ #pragma warn +sus
+
+ return;
+ }
+#endif
+
+#ifdef JAPDEMO
+ if (gamestate.mapon == 3)
+ {
+ died = true; // don't "get psyched!"
+
+ VW_FadeOut ();
+
+ ClearMemory ();
+
+ CheckHighScore (gamestate.score,gamestate.mapon+1);
+
+ #pragma warn -sus
+ #ifndef JAPAN
+ _fstrcpy(MainMenu[viewscores].string,STR_VS);
+ #endif
+ MainMenu[viewscores].routine = CP_ViewScores;
+ #pragma warn +sus
+
+ return;
+ }
+#endif
+
+ gamestate.oldscore = gamestate.score;
+
+#ifndef SPEAR
+ //
+ // COMING BACK FROM SECRET LEVEL
+ //
+ if (gamestate.mapon == 9)
+ gamestate.mapon = ElevatorBackTo[gamestate.episode]; // back from secret
+ else
+ //
+ // GOING TO SECRET LEVEL
+ //
+ if (playstate == ex_secretlevel)
+ gamestate.mapon = 9;
+#else
+
+#define FROMSECRET1 3
+#define FROMSECRET2 11
+
+ //
+ // GOING TO SECRET LEVEL
+ //
+ if (playstate == ex_secretlevel)
+ switch(gamestate.mapon)
+ {
+ case FROMSECRET1: gamestate.mapon = 18; break;
+ case FROMSECRET2: gamestate.mapon = 19; break;
+ }
+ else
+ //
+ // COMING BACK FROM SECRET LEVEL
+ //
+ if (gamestate.mapon == 18 || gamestate.mapon == 19)
+ switch(gamestate.mapon)
+ {
+ case 18: gamestate.mapon = FROMSECRET1+1; break;
+ case 19: gamestate.mapon = FROMSECRET2+1; break;
+ }
+#endif
+ else
+ //
+ // GOING TO NEXT LEVEL
+ //
+ gamestate.mapon++;
+
+
+ break;
+
+ case ex_died:
+ Died ();
+ died = true; // don't "get psyched!"
+
+ if (gamestate.lives > -1)
+ break; // more lives left
+
+ VW_FadeOut ();
+
+ ClearMemory ();
+
+ CheckHighScore (gamestate.score,gamestate.mapon+1);
+
+ #pragma warn -sus
+ #ifndef JAPAN
+ _fstrcpy(MainMenu[viewscores].string,STR_VS);
+ #endif
+ MainMenu[viewscores].routine = CP_ViewScores;
+ #pragma warn +sus
+
+ return;
+
+ case ex_victorious:
+
+#ifndef SPEAR
+ VW_FadeOut ();
+#else
+ VL_FadeOut (0,255,0,17,17,300);
+#endif
+ ClearMemory ();
+
+ Victory ();
+
+ ClearMemory ();
+
+ CheckHighScore (gamestate.score,gamestate.mapon+1);
+
+ #pragma warn -sus
+ #ifndef JAPAN
+ _fstrcpy(MainMenu[viewscores].string,STR_VS);
+ #endif
+ MainMenu[viewscores].routine = CP_ViewScores;
+ #pragma warn +sus
+
+ return;
+
+ default:
+ ClearMemory ();
+ break;
+ }
+
+ } while (1);
+
+}
+
binary files /dev/null b/gamepal.obj differ
--- /dev/null
+++ b/gfxe_sod.equ
@@ -1,0 +1,47 @@
+;=====================================
+;
+; Graphics .EQU file for .SOD
+; IGRAB-ed on Fri Jul 31 18:31:00 1992
+;
+;=====================================
+
+
+
+
+
+
+;
+; Amount of each data item
+;
+NUMCHUNKS = 414
+NUMFONT = 0
+NUMFONTM = 0
+NUMPICS = 0
+NUMPICM = 0
+NUMSPRITES = 0
+NUMTILE8 = 0
+NUMTILE8M = 0
+NUMTILE16 = 144
+NUMTILE16M = 270
+NUMTILE32 = 0
+NUMTILE32M = 0
+NUMEXTERN = 0
+;
+; File offsets for data items
+;
+STARTFONT = 0
+STARTFONTM = 0
+STARTPICS = 0
+STARTPICM = 0
+STARTSPRITES = 0
+STARTTILE8 = 0
+STARTTILE8M = 0
+STARTTILE16 = 0
+STARTTILE16M = 144
+STARTTILE32 = 414
+STARTTILE32M = 414
+STARTEXTERN = 414
+
+;
+; Thank you for using IGRAB!
+;
--- /dev/null
+++ b/gfxe_sod.h
@@ -1,0 +1,53 @@
+//////////////////////////////////////
+//
+// Graphics .H file for .SOD
+// IGRAB-ed on Fri Jul 31 18:31:00 1992
+//
+//////////////////////////////////////
+
+typedef enum {
+
+
+
+ ENUMEND
+ } graphicnums;
+
+//
+// Data LUMPs
+//
+
+//
+// Amount of each data item
+//
+#define NUMCHUNKS 414
+#define NUMFONT 0
+#define NUMFONTM 0
+#define NUMPICS 0
+#define NUMPICM 0
+#define NUMSPRITES 0
+#define NUMTILE8 0
+#define NUMTILE8M 0
+#define NUMTILE16 144
+#define NUMTILE16M 270
+#define NUMTILE32 0
+#define NUMTILE32M 0
+#define NUMEXTERNS 0
+//
+// File offsets for data items
+//
+#define STARTFONT 0
+#define STARTFONTM 0
+#define STARTPICS 0
+#define STARTPICM 0
+#define STARTSPRITES 0
+#define STARTTILE8 0
+#define STARTTILE8M 0
+#define STARTTILE16 0
+#define STARTTILE16M 144
+#define STARTTILE32 414
+#define STARTTILE32M 414
+#define STARTEXTERNS 414
+
+//
+// Thank you for using IGRAB!
+//
--- /dev/null
+++ b/gfxe_wl1.equ
@@ -1,0 +1,201 @@
+;=====================================
+;
+; Graphics .EQU file for .WL1
+; IGRAB-ed on Sat May 02 02:16:56 1992
+;
+;=====================================
+
+H_BJPIC = 3
+H_CASTLEPIC = 4
+H_KEYBOARDPIC = 5
+H_JOYPIC = 6
+H_MOUSEPIC = 7
+H_BOTHPIC = 8
+H_GAMEPADPIC = 9
+H_HEALPIC = 10
+H_TREASUREPIC = 11
+H_GUNPIC = 12
+H_KEYPIC = 13
+H_BLAZEPIC = 14
+H_WEAPON1234PIC = 15
+H_WOLFLOGOPIC = 16
+H_VISAPIC = 17
+H_MCPIC = 18
+H_IDLOGOPIC = 19
+H_FAXPIC = 20
+H_GALACTIXPIC = 21
+H_FGODMOMPIC = 22
+H_AUSTRALIAPIC = 23
+H_CANADAPIC = 24
+H_UKPIC = 25
+C_OPTIONSPIC = 26
+C_CURSOR1PIC = 27
+C_CURSOR2PIC = 28
+C_NOTSELECTEDPIC = 29
+C_SELECTEDPIC = 30
+C_FXTITLEPIC = 31
+C_DIGITITLEPIC = 32
+C_MUSICTITLEPIC = 33
+C_MOUSELBACKPIC = 34
+C_BABYMODEPIC = 35
+C_EASYPIC = 36
+C_NORMALPIC = 37
+C_HARDPIC = 38
+C_LOADSAVEDISKPIC = 39
+C_DISKLOADING1PIC = 40
+C_DISKLOADING2PIC = 41
+C_CONTROLPIC = 42
+C_CUSTOMIZEPIC = 43
+C_LOADGAMEPIC = 44
+C_SAVEGAMEPIC = 45
+C_EPISODE1PIC = 46
+C_EPISODE2PIC = 47
+C_EPISODE3PIC = 48
+C_EPISODE4PIC = 49
+C_EPISODE5PIC = 50
+C_EPISODE6PIC = 51
+C_CODEPIC = 52
+L_GUYPIC = 53
+L_COLONPIC = 54
+L_NUM0PIC = 55
+L_NUM1PIC = 56
+L_NUM2PIC = 57
+L_NUM3PIC = 58
+L_NUM4PIC = 59
+L_NUM5PIC = 60
+L_NUM6PIC = 61
+L_NUM7PIC = 62
+L_NUM8PIC = 63
+L_NUM9PIC = 64
+L_PERCENTPIC = 65
+L_APIC = 66
+L_BPIC = 67
+L_CPIC = 68
+L_DPIC = 69
+L_EPIC = 70
+L_FPIC = 71
+L_GPIC = 72
+L_HPIC = 73
+L_IPIC = 74
+L_JPIC = 75
+L_KPIC = 76
+L_LPIC = 77
+L_MPIC = 78
+L_NPIC = 79
+L_OPIC = 80
+L_PPIC = 81
+L_QPIC = 82
+L_RPIC = 83
+L_SPIC = 84
+L_TPIC = 85
+L_UPIC = 86
+L_VPIC = 87
+L_WPIC = 88
+L_XPIC = 89
+L_YPIC = 90
+L_ZPIC = 91
+L_GUY2PIC = 92
+L_BJWINSPIC = 93
+STATUSBARPIC = 94
+TITLEPIC = 95
+PG13PIC = 96
+CREDITSPIC = 97
+HIGHSCORESPIC = 98
+KNIFEPIC = 99
+GUNPIC = 100
+MACHINEGUNPIC = 101
+GATLINGGUNPIC = 102
+NOKEYPIC = 103
+GOLDKEYPIC = 104
+SILVERKEYPIC = 105
+N_BLANKPIC = 106
+N_0PIC = 107
+N_1PIC = 108
+N_2PIC = 109
+N_3PIC = 110
+N_4PIC = 111
+N_5PIC = 112
+N_6PIC = 113
+N_7PIC = 114
+N_8PIC = 115
+N_9PIC = 116
+FACE1APIC = 117
+FACE1BPIC = 118
+FACE1CPIC = 119
+FACE2APIC = 120
+FACE2BPIC = 121
+FACE2CPIC = 122
+FACE3APIC = 123
+FACE3BPIC = 124
+FACE3CPIC = 125
+FACE4APIC = 126
+FACE4BPIC = 127
+FACE4CPIC = 128
+FACE5APIC = 129
+FACE5BPIC = 130
+FACE5CPIC = 131
+FACE6APIC = 132
+FACE6BPIC = 133
+FACE6CPIC = 134
+FACE7APIC = 135
+FACE7BPIC = 136
+FACE7CPIC = 137
+FACE8APIC = 138
+GOTGATLINGPIC = 139
+PAUSEDPIC = 140
+GETPSYCHEDPIC = 141
+
+
+
+ORDERSCREEN = 557
+
+README_LUMP_START = 3
+README_LUMP_END = 25
+
+CONTROLS_LUMP_START = 26
+CONTROLS_LUMP_END = 52
+
+LEVELEND_LUMP_START = 53
+LEVELEND_LUMP_END = 93
+
+LATCHPICS_LUMP_START = 99
+LATCHPICS_LUMP_END = 141
+
+
+;
+; Amount of each data item
+;
+NUMCHUNKS = 558
+NUMFONT = 2
+NUMFONTM = 0
+NUMPICS = 139
+NUMPICM = 0
+NUMSPRITES = 0
+NUMTILE8 = 72
+NUMTILE8M = 0
+NUMTILE16 = 144
+NUMTILE16M = 270
+NUMTILE32 = 0
+NUMTILE32M = 0
+NUMEXTERN = 1
+;
+; File offsets for data items
+;
+STRUCTPIC = 0
+
+STARTFONT = 1
+STARTFONTM = 3
+STARTPICS = 3
+STARTPICM = 142
+STARTSPRITES = 142
+STARTTILE8 = 142
+STARTTILE8M = 143
+STARTTILE16 = 143
+STARTTILE16M = 287
+STARTTILE32 = 557
+STARTTILE32M = 557
+STARTEXTERN = 557
+
+;
+; Thank you for using IGRAB!
+;
--- /dev/null
+++ b/gfxe_wl1.h
@@ -1,0 +1,211 @@
+//////////////////////////////////////
+//
+// Graphics .H file for .WL1
+// IGRAB-ed on Sat May 02 02:16:56 1992
+//
+//////////////////////////////////////
+
+typedef enum {
+ // Lump Start
+ H_BJPIC=3,
+ H_CASTLEPIC, // 4
+ H_KEYBOARDPIC, // 5
+ H_JOYPIC, // 6
+ H_MOUSEPIC, // 7
+ H_BOTHPIC, // 8
+ H_GAMEPADPIC, // 9
+ H_HEALPIC, // 10
+ H_TREASUREPIC, // 11
+ H_GUNPIC, // 12
+ H_KEYPIC, // 13
+ H_BLAZEPIC, // 14
+ H_WEAPON1234PIC, // 15
+ H_WOLFLOGOPIC, // 16
+ H_VISAPIC, // 17
+ H_MCPIC, // 18
+ H_IDLOGOPIC, // 19
+ H_FAXPIC, // 20
+ H_GALACTIXPIC, // 21
+ H_FGODMOMPIC, // 22
+ H_AUSTRALIAPIC, // 23
+ H_CANADAPIC, // 24
+ H_UKPIC, // 25
+ // Lump Start
+ C_OPTIONSPIC, // 26
+ C_CURSOR1PIC, // 27
+ C_CURSOR2PIC, // 28
+ C_NOTSELECTEDPIC, // 29
+ C_SELECTEDPIC, // 30
+ C_FXTITLEPIC, // 31
+ C_DIGITITLEPIC, // 32
+ C_MUSICTITLEPIC, // 33
+ C_MOUSELBACKPIC, // 34
+ C_BABYMODEPIC, // 35
+ C_EASYPIC, // 36
+ C_NORMALPIC, // 37
+ C_HARDPIC, // 38
+ C_LOADSAVEDISKPIC, // 39
+ C_DISKLOADING1PIC, // 40
+ C_DISKLOADING2PIC, // 41
+ C_CONTROLPIC, // 42
+ C_CUSTOMIZEPIC, // 43
+ C_LOADGAMEPIC, // 44
+ C_SAVEGAMEPIC, // 45
+ C_EPISODE1PIC, // 46
+ C_EPISODE2PIC, // 47
+ C_EPISODE3PIC, // 48
+ C_EPISODE4PIC, // 49
+ C_EPISODE5PIC, // 50
+ C_EPISODE6PIC, // 51
+ C_CODEPIC, // 52
+ // Lump Start
+ L_GUYPIC, // 53
+ L_COLONPIC, // 54
+ L_NUM0PIC, // 55
+ L_NUM1PIC, // 56
+ L_NUM2PIC, // 57
+ L_NUM3PIC, // 58
+ L_NUM4PIC, // 59
+ L_NUM5PIC, // 60
+ L_NUM6PIC, // 61
+ L_NUM7PIC, // 62
+ L_NUM8PIC, // 63
+ L_NUM9PIC, // 64
+ L_PERCENTPIC, // 65
+ L_APIC, // 66
+ L_BPIC, // 67
+ L_CPIC, // 68
+ L_DPIC, // 69
+ L_EPIC, // 70
+ L_FPIC, // 71
+ L_GPIC, // 72
+ L_HPIC, // 73
+ L_IPIC, // 74
+ L_JPIC, // 75
+ L_KPIC, // 76
+ L_LPIC, // 77
+ L_MPIC, // 78
+ L_NPIC, // 79
+ L_OPIC, // 80
+ L_PPIC, // 81
+ L_QPIC, // 82
+ L_RPIC, // 83
+ L_SPIC, // 84
+ L_TPIC, // 85
+ L_UPIC, // 86
+ L_VPIC, // 87
+ L_WPIC, // 88
+ L_XPIC, // 89
+ L_YPIC, // 90
+ L_ZPIC, // 91
+ L_GUY2PIC, // 92
+ L_BJWINSPIC, // 93
+ STATUSBARPIC, // 94
+ TITLEPIC, // 95
+ PG13PIC, // 96
+ CREDITSPIC, // 97
+ HIGHSCORESPIC, // 98
+ // Lump Start
+ KNIFEPIC, // 99
+ GUNPIC, // 100
+ MACHINEGUNPIC, // 101
+ GATLINGGUNPIC, // 102
+ NOKEYPIC, // 103
+ GOLDKEYPIC, // 104
+ SILVERKEYPIC, // 105
+ N_BLANKPIC, // 106
+ N_0PIC, // 107
+ N_1PIC, // 108
+ N_2PIC, // 109
+ N_3PIC, // 110
+ N_4PIC, // 111
+ N_5PIC, // 112
+ N_6PIC, // 113
+ N_7PIC, // 114
+ N_8PIC, // 115
+ N_9PIC, // 116
+ FACE1APIC, // 117
+ FACE1BPIC, // 118
+ FACE1CPIC, // 119
+ FACE2APIC, // 120
+ FACE2BPIC, // 121
+ FACE2CPIC, // 122
+ FACE3APIC, // 123
+ FACE3BPIC, // 124
+ FACE3CPIC, // 125
+ FACE4APIC, // 126
+ FACE4BPIC, // 127
+ FACE4CPIC, // 128
+ FACE5APIC, // 129
+ FACE5BPIC, // 130
+ FACE5CPIC, // 131
+ FACE6APIC, // 132
+ FACE6BPIC, // 133
+ FACE6CPIC, // 134
+ FACE7APIC, // 135
+ FACE7BPIC, // 136
+ FACE7CPIC, // 137
+ FACE8APIC, // 138
+ GOTGATLINGPIC, // 139
+ PAUSEDPIC, // 140
+ GETPSYCHEDPIC, // 141
+
+
+
+ ORDERSCREEN=557,
+ ENUMEND
+ } graphicnums;
+
+//
+// Data LUMPs
+//
+#define README_LUMP_START 3
+#define README_LUMP_END 25
+
+#define CONTROLS_LUMP_START 26
+#define CONTROLS_LUMP_END 52
+
+#define LEVELEND_LUMP_START 53
+#define LEVELEND_LUMP_END 93
+
+#define LATCHPICS_LUMP_START 99
+#define LATCHPICS_LUMP_END 141
+
+
+//
+// Amount of each data item
+//
+#define NUMCHUNKS 558
+#define NUMFONT 2
+#define NUMFONTM 0
+#define NUMPICS 139
+#define NUMPICM 0
+#define NUMSPRITES 0
+#define NUMTILE8 72
+#define NUMTILE8M 0
+#define NUMTILE16 144
+#define NUMTILE16M 270
+#define NUMTILE32 0
+#define NUMTILE32M 0
+#define NUMEXTERNS 1
+//
+// File offsets for data items
+//
+#define STRUCTPIC 0
+
+#define STARTFONT 1
+#define STARTFONTM 3
+#define STARTPICS 3
+#define STARTPICM 142
+#define STARTSPRITES 142
+#define STARTTILE8 142
+#define STARTTILE8M 143
+#define STARTTILE16 143
+#define STARTTILE16M 287
+#define STARTTILE32 557
+#define STARTTILE32M 557
+#define STARTEXTERNS 557
+
+//
+// Thank you for using IGRAB!
+//
--- /dev/null
+++ b/gfxe_wl6.equ
@@ -1,0 +1,47 @@
+;=====================================
+;
+; Graphics .EQU file for .WL6
+; IGRAB-ed on Sun Aug 09 22:17:20 1992
+;
+;=====================================
+
+
+
+
+
+
+;
+; Amount of each data item
+;
+NUMCHUNKS = 414
+NUMFONT = 0
+NUMFONTM = 0
+NUMPICS = 0
+NUMPICM = 0
+NUMSPRITES = 0
+NUMTILE8 = 0
+NUMTILE8M = 0
+NUMTILE16 = 144
+NUMTILE16M = 270
+NUMTILE32 = 0
+NUMTILE32M = 0
+NUMEXTERN = 0
+;
+; File offsets for data items
+;
+STARTFONT = 0
+STARTFONTM = 0
+STARTPICS = 0
+STARTPICM = 0
+STARTSPRITES = 0
+STARTTILE8 = 0
+STARTTILE8M = 0
+STARTTILE16 = 0
+STARTTILE16M = 144
+STARTTILE32 = 414
+STARTTILE32M = 414
+STARTEXTERN = 414
+
+;
+; Thank you for using IGRAB!
+;
--- /dev/null
+++ b/gfxe_wl6.h
@@ -1,0 +1,53 @@
+//////////////////////////////////////
+//
+// Graphics .H file for .WL6
+// IGRAB-ed on Sun Aug 09 22:17:20 1992
+//
+//////////////////////////////////////
+
+typedef enum {
+
+
+
+ ENUMEND
+ } graphicnums;
+
+//
+// Data LUMPs
+//
+
+//
+// Amount of each data item
+//
+#define NUMCHUNKS 414
+#define NUMFONT 0
+#define NUMFONTM 0
+#define NUMPICS 0
+#define NUMPICM 0
+#define NUMSPRITES 0
+#define NUMTILE8 0
+#define NUMTILE8M 0
+#define NUMTILE16 144
+#define NUMTILE16M 270
+#define NUMTILE32 0
+#define NUMTILE32M 0
+#define NUMEXTERNS 0
+//
+// File offsets for data items
+//
+#define STARTFONT 0
+#define STARTFONTM 0
+#define STARTPICS 0
+#define STARTPICM 0
+#define STARTSPRITES 0
+#define STARTTILE8 0
+#define STARTTILE8M 0
+#define STARTTILE16 0
+#define STARTTILE16M 144
+#define STARTTILE32 414
+#define STARTTILE32M 414
+#define STARTEXTERNS 414
+
+//
+// Thank you for using IGRAB!
+//
--- /dev/null
+++ b/gfxv_sdm.equ
@@ -1,0 +1,208 @@
+;=====================================
+;
+; Graphics .EQU file for .SDM
+; IGRAB-ed on Mon Sep 21 14:20:19 1992
+;
+;=====================================
+
+C_BACKDROPPIC = 3
+C_MOUSELBACKPIC = 4
+C_CURSOR1PIC = 5
+C_CURSOR2PIC = 6
+C_NOTSELECTEDPIC = 7
+C_SELECTEDPIC = 8
+C_CUSTOMIZEPIC = 9
+C_JOY1PIC = 10
+C_JOY2PIC = 11
+C_MOUSEPIC = 12
+C_JOYSTICKPIC = 13
+C_KEYBOARDPIC = 14
+C_CONTROLPIC = 15
+C_OPTIONSPIC = 16
+C_FXTITLEPIC = 17
+C_DIGITITLEPIC = 18
+C_MUSICTITLEPIC = 19
+C_HOWTOUGHPIC = 20
+C_BABYMODEPIC = 21
+C_EASYPIC = 22
+C_NORMALPIC = 23
+C_HARDPIC = 24
+C_DISKLOADING1PIC = 25
+C_DISKLOADING2PIC = 26
+C_LOADGAMEPIC = 27
+C_SAVEGAMEPIC = 28
+HIGHSCORESPIC = 29
+C_WONSPEARPIC = 30
+L_GUYPIC = 31
+L_COLONPIC = 32
+L_NUM0PIC = 33
+L_NUM1PIC = 34
+L_NUM2PIC = 35
+L_NUM3PIC = 36
+L_NUM4PIC = 37
+L_NUM5PIC = 38
+L_NUM6PIC = 39
+L_NUM7PIC = 40
+L_NUM8PIC = 41
+L_NUM9PIC = 42
+L_PERCENTPIC = 43
+L_APIC = 44
+L_BPIC = 45
+L_CPIC = 46
+L_DPIC = 47
+L_EPIC = 48
+L_FPIC = 49
+L_GPIC = 50
+L_HPIC = 51
+L_IPIC = 52
+L_JPIC = 53
+L_KPIC = 54
+L_LPIC = 55
+L_MPIC = 56
+L_NPIC = 57
+L_OPIC = 58
+L_PPIC = 59
+L_QPIC = 60
+L_RPIC = 61
+L_SPIC = 62
+L_TPIC = 63
+L_UPIC = 64
+L_VPIC = 65
+L_WPIC = 66
+L_XPIC = 67
+L_YPIC = 68
+L_ZPIC = 69
+L_EXPOINTPIC = 70
+L_APOSTROPHEPIC = 71
+L_GUY2PIC = 72
+L_BJWINSPIC = 73
+TITLE1PIC = 74
+TITLE2PIC = 75
+STATUSBARPIC = 76
+PG13PIC = 77
+CREDITSPIC = 78
+KNIFEPIC = 79
+GUNPIC = 80
+MACHINEGUNPIC = 81
+GATLINGGUNPIC = 82
+NOKEYPIC = 83
+GOLDKEYPIC = 84
+SILVERKEYPIC = 85
+N_BLANKPIC = 86
+N_0PIC = 87
+N_1PIC = 88
+N_2PIC = 89
+N_3PIC = 90
+N_4PIC = 91
+N_5PIC = 92
+N_6PIC = 93
+N_7PIC = 94
+N_8PIC = 95
+N_9PIC = 96
+FACE1APIC = 97
+FACE1BPIC = 98
+FACE1CPIC = 99
+FACE2APIC = 100
+FACE2BPIC = 101
+FACE2CPIC = 102
+FACE3APIC = 103
+FACE3BPIC = 104
+FACE3CPIC = 105
+FACE4APIC = 106
+FACE4BPIC = 107
+FACE4CPIC = 108
+FACE5APIC = 109
+FACE5BPIC = 110
+FACE5CPIC = 111
+FACE6APIC = 112
+FACE6BPIC = 113
+FACE6CPIC = 114
+FACE7APIC = 115
+FACE7BPIC = 116
+FACE7CPIC = 117
+FACE8APIC = 118
+GOTGATLINGPIC = 119
+GODMODEFACE1PIC = 120
+GODMODEFACE2PIC = 121
+GODMODEFACE3PIC = 122
+BJWAITING1PIC = 123
+BJWAITING2PIC = 124
+BJOUCHPIC = 125
+PAUSEDPIC = 126
+GETPSYCHEDPIC = 127
+
+
+
+ORDERSCREEN = 129
+ERRORSCREEN = 130
+TITLEPALETTE = 131
+T_DEMO0 = 132
+
+BACKDROP_LUMP_START = 3
+BACKDROP_LUMP_END = 8
+
+CONTROL_LUMP_START = 9
+CONTROL_LUMP_END = 15
+
+OPTIONS_LUMP_START = 16
+OPTIONS_LUMP_END = 16
+
+SOUND_LUMP_START = 17
+SOUND_LUMP_END = 19
+
+NEWGAME_LUMP_START = 20
+NEWGAME_LUMP_END = 24
+
+LOADSAVE_LUMP_START = 25
+LOADSAVE_LUMP_END = 28
+
+HIGHSCORES_LUMP_START = 29
+HIGHSCORES_LUMP_END = 30
+
+LEVELEND_LUMP_START = 31
+LEVELEND_LUMP_END = 73
+
+TITLESCREEN_LUMP_START = 74
+TITLESCREEN_LUMP_END = 75
+
+LATCHPICS_LUMP_START = 79
+LATCHPICS_LUMP_END = 127
+
+
+;
+; Amount of each data item
+;
+NUMCHUNKS = 133
+NUMFONT = 2
+NUMFONTM = 0
+NUMPICS = 125
+NUMPICM = 0
+NUMSPRITES = 0
+NUMTILE8 = 72
+NUMTILE8M = 0
+NUMTILE16 = 0
+NUMTILE16M = 0
+NUMTILE32 = 0
+NUMTILE32M = 0
+NUMEXTERN = 4
+;
+; File offsets for data items
+;
+STRUCTPIC = 0
+
+STARTFONT = 1
+STARTFONTM = 3
+STARTPICS = 3
+STARTPICM = 128
+STARTSPRITES = 128
+STARTTILE8 = 128
+STARTTILE8M = 129
+STARTTILE16 = 129
+STARTTILE16M = 129
+STARTTILE32 = 129
+STARTTILE32M = 129
+STARTEXTERN = 129
+
+;
+; Thank you for using IGRAB!
+;
--- /dev/null
+++ b/gfxv_sdm.h
@@ -1,0 +1,224 @@
+//////////////////////////////////////
+//
+// Graphics .H file for .SDM
+// IGRAB-ed on Mon Sep 21 14:20:19 1992
+//
+//////////////////////////////////////
+
+typedef enum {
+ // Lump Start
+ C_BACKDROPPIC=3,
+ C_MOUSELBACKPIC, // 4
+ C_CURSOR1PIC, // 5
+ C_CURSOR2PIC, // 6
+ C_NOTSELECTEDPIC, // 7
+ C_SELECTEDPIC, // 8
+ // Lump Start
+ C_CUSTOMIZEPIC, // 9
+ C_JOY1PIC, // 10
+ C_JOY2PIC, // 11
+ C_MOUSEPIC, // 12
+ C_JOYSTICKPIC, // 13
+ C_KEYBOARDPIC, // 14
+ C_CONTROLPIC, // 15
+ // Lump Start
+ C_OPTIONSPIC, // 16
+ // Lump Start
+ C_FXTITLEPIC, // 17
+ C_DIGITITLEPIC, // 18
+ C_MUSICTITLEPIC, // 19
+ // Lump Start
+ C_HOWTOUGHPIC, // 20
+ C_BABYMODEPIC, // 21
+ C_EASYPIC, // 22
+ C_NORMALPIC, // 23
+ C_HARDPIC, // 24
+ // Lump Start
+ C_DISKLOADING1PIC, // 25
+ C_DISKLOADING2PIC, // 26
+ C_LOADGAMEPIC, // 27
+ C_SAVEGAMEPIC, // 28
+ // Lump Start
+ HIGHSCORESPIC, // 29
+ C_WONSPEARPIC, // 30
+ // Lump Start
+ L_GUYPIC, // 31
+ L_COLONPIC, // 32
+ L_NUM0PIC, // 33
+ L_NUM1PIC, // 34
+ L_NUM2PIC, // 35
+ L_NUM3PIC, // 36
+ L_NUM4PIC, // 37
+ L_NUM5PIC, // 38
+ L_NUM6PIC, // 39
+ L_NUM7PIC, // 40
+ L_NUM8PIC, // 41
+ L_NUM9PIC, // 42
+ L_PERCENTPIC, // 43
+ L_APIC, // 44
+ L_BPIC, // 45
+ L_CPIC, // 46
+ L_DPIC, // 47
+ L_EPIC, // 48
+ L_FPIC, // 49
+ L_GPIC, // 50
+ L_HPIC, // 51
+ L_IPIC, // 52
+ L_JPIC, // 53
+ L_KPIC, // 54
+ L_LPIC, // 55
+ L_MPIC, // 56
+ L_NPIC, // 57
+ L_OPIC, // 58
+ L_PPIC, // 59
+ L_QPIC, // 60
+ L_RPIC, // 61
+ L_SPIC, // 62
+ L_TPIC, // 63
+ L_UPIC, // 64
+ L_VPIC, // 65
+ L_WPIC, // 66
+ L_XPIC, // 67
+ L_YPIC, // 68
+ L_ZPIC, // 69
+ L_EXPOINTPIC, // 70
+ L_APOSTROPHEPIC, // 71
+ L_GUY2PIC, // 72
+ L_BJWINSPIC, // 73
+ // Lump Start
+ TITLE1PIC, // 74
+ TITLE2PIC, // 75
+ STATUSBARPIC, // 76
+ PG13PIC, // 77
+ CREDITSPIC, // 78
+ // Lump Start
+ KNIFEPIC, // 79
+ GUNPIC, // 80
+ MACHINEGUNPIC, // 81
+ GATLINGGUNPIC, // 82
+ NOKEYPIC, // 83
+ GOLDKEYPIC, // 84
+ SILVERKEYPIC, // 85
+ N_BLANKPIC, // 86
+ N_0PIC, // 87
+ N_1PIC, // 88
+ N_2PIC, // 89
+ N_3PIC, // 90
+ N_4PIC, // 91
+ N_5PIC, // 92
+ N_6PIC, // 93
+ N_7PIC, // 94
+ N_8PIC, // 95
+ N_9PIC, // 96
+ FACE1APIC, // 97
+ FACE1BPIC, // 98
+ FACE1CPIC, // 99
+ FACE2APIC, // 100
+ FACE2BPIC, // 101
+ FACE2CPIC, // 102
+ FACE3APIC, // 103
+ FACE3BPIC, // 104
+ FACE3CPIC, // 105
+ FACE4APIC, // 106
+ FACE4BPIC, // 107
+ FACE4CPIC, // 108
+ FACE5APIC, // 109
+ FACE5BPIC, // 110
+ FACE5CPIC, // 111
+ FACE6APIC, // 112
+ FACE6BPIC, // 113
+ FACE6CPIC, // 114
+ FACE7APIC, // 115
+ FACE7BPIC, // 116
+ FACE7CPIC, // 117
+ FACE8APIC, // 118
+ GOTGATLINGPIC, // 119
+ GODMODEFACE1PIC, // 120
+ GODMODEFACE2PIC, // 121
+ GODMODEFACE3PIC, // 122
+ BJWAITING1PIC, // 123
+ BJWAITING2PIC, // 124
+ BJOUCHPIC, // 125
+ PAUSEDPIC, // 126
+ GETPSYCHEDPIC, // 127
+
+
+
+ ORDERSCREEN=129,
+ ERRORSCREEN, // 130
+ TITLEPALETTE, // 131
+ T_DEMO0, // 132
+ ENUMEND
+ } graphicnums;
+
+//
+// Data LUMPs
+//
+#define BACKDROP_LUMP_START 3
+#define BACKDROP_LUMP_END 8
+
+#define CONTROL_LUMP_START 9
+#define CONTROL_LUMP_END 15
+
+#define OPTIONS_LUMP_START 16
+#define OPTIONS_LUMP_END 16
+
+#define SOUND_LUMP_START 17
+#define SOUND_LUMP_END 19
+
+#define NEWGAME_LUMP_START 20
+#define NEWGAME_LUMP_END 24
+
+#define LOADSAVE_LUMP_START 25
+#define LOADSAVE_LUMP_END 28
+
+#define HIGHSCORES_LUMP_START 29
+#define HIGHSCORES_LUMP_END 30
+
+#define LEVELEND_LUMP_START 31
+#define LEVELEND_LUMP_END 73
+
+#define TITLESCREEN_LUMP_START 74
+#define TITLESCREEN_LUMP_END 75
+
+#define LATCHPICS_LUMP_START 79
+#define LATCHPICS_LUMP_END 127
+
+
+//
+// Amount of each data item
+//
+#define NUMCHUNKS 133
+#define NUMFONT 2
+#define NUMFONTM 0
+#define NUMPICS 125
+#define NUMPICM 0
+#define NUMSPRITES 0
+#define NUMTILE8 72
+#define NUMTILE8M 0
+#define NUMTILE16 0
+#define NUMTILE16M 0
+#define NUMTILE32 0
+#define NUMTILE32M 0
+#define NUMEXTERNS 4
+//
+// File offsets for data items
+//
+#define STRUCTPIC 0
+
+#define STARTFONT 1
+#define STARTFONTM 3
+#define STARTPICS 3
+#define STARTPICM 128
+#define STARTSPRITES 128
+#define STARTTILE8 128
+#define STARTTILE8M 129
+#define STARTTILE16 129
+#define STARTTILE16M 129
+#define STARTTILE32 129
+#define STARTTILE32M 129
+#define STARTEXTERNS 129
+
+//
+// Thank you for using IGRAB!
+//
--- /dev/null
+++ b/gfxv_sod.equ
@@ -1,0 +1,259 @@
+;=====================================
+;
+; Graphics .EQU file for .SOD
+; IGRAB-ed on Thu Oct 08 20:38:29 1992
+;
+;=====================================
+
+C_BACKDROPPIC = 3
+C_MOUSELBACKPIC = 4
+C_CURSOR1PIC = 5
+C_CURSOR2PIC = 6
+C_NOTSELECTEDPIC = 7
+C_SELECTEDPIC = 8
+C_CUSTOMIZEPIC = 9
+C_JOY1PIC = 10
+C_JOY2PIC = 11
+C_MOUSEPIC = 12
+C_JOYSTICKPIC = 13
+C_KEYBOARDPIC = 14
+C_CONTROLPIC = 15
+C_OPTIONSPIC = 16
+C_FXTITLEPIC = 17
+C_DIGITITLEPIC = 18
+C_MUSICTITLEPIC = 19
+C_HOWTOUGHPIC = 20
+C_BABYMODEPIC = 21
+C_EASYPIC = 22
+C_NORMALPIC = 23
+C_HARDPIC = 24
+C_DISKLOADING1PIC = 25
+C_DISKLOADING2PIC = 26
+C_LOADGAMEPIC = 27
+C_SAVEGAMEPIC = 28
+HIGHSCORESPIC = 29
+C_WONSPEARPIC = 30
+BJCOLLAPSE1PIC = 31
+BJCOLLAPSE2PIC = 32
+BJCOLLAPSE3PIC = 33
+BJCOLLAPSE4PIC = 34
+ENDPICPIC = 35
+L_GUYPIC = 36
+L_COLONPIC = 37
+L_NUM0PIC = 38
+L_NUM1PIC = 39
+L_NUM2PIC = 40
+L_NUM3PIC = 41
+L_NUM4PIC = 42
+L_NUM5PIC = 43
+L_NUM6PIC = 44
+L_NUM7PIC = 45
+L_NUM8PIC = 46
+L_NUM9PIC = 47
+L_PERCENTPIC = 48
+L_APIC = 49
+L_BPIC = 50
+L_CPIC = 51
+L_DPIC = 52
+L_EPIC = 53
+L_FPIC = 54
+L_GPIC = 55
+L_HPIC = 56
+L_IPIC = 57
+L_JPIC = 58
+L_KPIC = 59
+L_LPIC = 60
+L_MPIC = 61
+L_NPIC = 62
+L_OPIC = 63
+L_PPIC = 64
+L_QPIC = 65
+L_RPIC = 66
+L_SPIC = 67
+L_TPIC = 68
+L_UPIC = 69
+L_VPIC = 70
+L_WPIC = 71
+L_XPIC = 72
+L_YPIC = 73
+L_ZPIC = 74
+L_EXPOINTPIC = 75
+L_APOSTROPHEPIC = 76
+L_GUY2PIC = 77
+L_BJWINSPIC = 78
+TITLE1PIC = 79
+TITLE2PIC = 80
+ENDSCREEN11PIC = 81
+ENDSCREEN12PIC = 82
+ENDSCREEN3PIC = 83
+ENDSCREEN4PIC = 84
+ENDSCREEN5PIC = 85
+ENDSCREEN6PIC = 86
+ENDSCREEN7PIC = 87
+ENDSCREEN8PIC = 88
+ENDSCREEN9PIC = 89
+STATUSBARPIC = 90
+PG13PIC = 91
+CREDITSPIC = 92
+IDGUYS1PIC = 93
+IDGUYS2PIC = 94
+COPYPROTTOPPIC = 95
+COPYPROTBOXPIC = 96
+BOSSPIC1PIC = 97
+BOSSPIC2PIC = 98
+BOSSPIC3PIC = 99
+BOSSPIC4PIC = 100
+KNIFEPIC = 101
+GUNPIC = 102
+MACHINEGUNPIC = 103
+GATLINGGUNPIC = 104
+NOKEYPIC = 105
+GOLDKEYPIC = 106
+SILVERKEYPIC = 107
+N_BLANKPIC = 108
+N_0PIC = 109
+N_1PIC = 110
+N_2PIC = 111
+N_3PIC = 112
+N_4PIC = 113
+N_5PIC = 114
+N_6PIC = 115
+N_7PIC = 116
+N_8PIC = 117
+N_9PIC = 118
+FACE1APIC = 119
+FACE1BPIC = 120
+FACE1CPIC = 121
+FACE2APIC = 122
+FACE2BPIC = 123
+FACE2CPIC = 124
+FACE3APIC = 125
+FACE3BPIC = 126
+FACE3CPIC = 127
+FACE4APIC = 128
+FACE4BPIC = 129
+FACE4CPIC = 130
+FACE5APIC = 131
+FACE5BPIC = 132
+FACE5CPIC = 133
+FACE6APIC = 134
+FACE6BPIC = 135
+FACE6CPIC = 136
+FACE7APIC = 137
+FACE7BPIC = 138
+FACE7CPIC = 139
+FACE8APIC = 140
+GOTGATLINGPIC = 141
+GODMODEFACE1PIC = 142
+GODMODEFACE2PIC = 143
+GODMODEFACE3PIC = 144
+BJWAITING1PIC = 145
+BJWAITING2PIC = 146
+BJOUCHPIC = 147
+PAUSEDPIC = 148
+GETPSYCHEDPIC = 149
+
+
+
+ORDERSCREEN = 151
+ERRORSCREEN = 152
+TITLEPALETTE = 153
+END1PALETTE = 154
+END2PALETTE = 155
+END3PALETTE = 156
+END4PALETTE = 157
+END5PALETTE = 158
+END6PALETTE = 159
+END7PALETTE = 160
+END8PALETTE = 161
+END9PALETTE = 162
+IDGUYSPALETTE = 163
+T_DEMO0 = 164
+T_DEMO1 = 165
+T_DEMO2 = 166
+T_DEMO3 = 167
+T_ENDART1 = 168
+
+BACKDROP_LUMP_START = 3
+BACKDROP_LUMP_END = 8
+
+CONTROL_LUMP_START = 9
+CONTROL_LUMP_END = 15
+
+OPTIONS_LUMP_START = 16
+OPTIONS_LUMP_END = 16
+
+SOUND_LUMP_START = 17
+SOUND_LUMP_END = 19
+
+NEWGAME_LUMP_START = 20
+NEWGAME_LUMP_END = 24
+
+LOADSAVE_LUMP_START = 25
+LOADSAVE_LUMP_END = 28
+
+HIGHSCORES_LUMP_START = 29
+HIGHSCORES_LUMP_END = 30
+
+ENDGAME_LUMP_START = 31
+ENDGAME_LUMP_END = 35
+
+LEVELEND_LUMP_START = 36
+LEVELEND_LUMP_END = 78
+
+TITLESCREEN_LUMP_START = 79
+TITLESCREEN_LUMP_END = 80
+
+ENDGAME1_LUMP_START = 81
+ENDGAME1_LUMP_END = 81
+
+ENDGAME2_LUMP_START = 82
+ENDGAME2_LUMP_END = 82
+
+EASTEREGG_LUMP_START = 93
+EASTEREGG_LUMP_END = 94
+
+COPYPROT_LUMP_START = 95
+COPYPROT_LUMP_END = 100
+
+LATCHPICS_LUMP_START = 101
+LATCHPICS_LUMP_END = 149
+
+
+;
+; Amount of each data item
+;
+NUMCHUNKS = 169
+NUMFONT = 2
+NUMFONTM = 0
+NUMPICS = 147
+NUMPICM = 0
+NUMSPRITES = 0
+NUMTILE8 = 72
+NUMTILE8M = 0
+NUMTILE16 = 0
+NUMTILE16M = 0
+NUMTILE32 = 0
+NUMTILE32M = 0
+NUMEXTERN = 18
+;
+; File offsets for data items
+;
+STRUCTPIC = 0
+
+STARTFONT = 1
+STARTFONTM = 3
+STARTPICS = 3
+STARTPICM = 150
+STARTSPRITES = 150
+STARTTILE8 = 150
+STARTTILE8M = 151
+STARTTILE16 = 151
+STARTTILE16M = 151
+STARTTILE32 = 151
+STARTTILE32M = 151
+STARTEXTERN = 151
+
+;
+; Thank you for using IGRAB!
+;
--- /dev/null
+++ b/gfxv_sod.h
@@ -1,0 +1,280 @@
+//////////////////////////////////////
+//
+// Graphics .H file for .SOD
+// IGRAB-ed on Thu Oct 08 20:38:29 1992
+//
+//////////////////////////////////////
+
+typedef enum {
+ // Lump Start
+ C_BACKDROPPIC=3,
+ C_MOUSELBACKPIC, // 4
+ C_CURSOR1PIC, // 5
+ C_CURSOR2PIC, // 6
+ C_NOTSELECTEDPIC, // 7
+ C_SELECTEDPIC, // 8
+ // Lump Start
+ C_CUSTOMIZEPIC, // 9
+ C_JOY1PIC, // 10
+ C_JOY2PIC, // 11
+ C_MOUSEPIC, // 12
+ C_JOYSTICKPIC, // 13
+ C_KEYBOARDPIC, // 14
+ C_CONTROLPIC, // 15
+ // Lump Start
+ C_OPTIONSPIC, // 16
+ // Lump Start
+ C_FXTITLEPIC, // 17
+ C_DIGITITLEPIC, // 18
+ C_MUSICTITLEPIC, // 19
+ // Lump Start
+ C_HOWTOUGHPIC, // 20
+ C_BABYMODEPIC, // 21
+ C_EASYPIC, // 22
+ C_NORMALPIC, // 23
+ C_HARDPIC, // 24
+ // Lump Start
+ C_DISKLOADING1PIC, // 25
+ C_DISKLOADING2PIC, // 26
+ C_LOADGAMEPIC, // 27
+ C_SAVEGAMEPIC, // 28
+ // Lump Start
+ HIGHSCORESPIC, // 29
+ C_WONSPEARPIC, // 30
+ // Lump Start
+ BJCOLLAPSE1PIC, // 31
+ BJCOLLAPSE2PIC, // 32
+ BJCOLLAPSE3PIC, // 33
+ BJCOLLAPSE4PIC, // 34
+ ENDPICPIC, // 35
+ // Lump Start
+ L_GUYPIC, // 36
+ L_COLONPIC, // 37
+ L_NUM0PIC, // 38
+ L_NUM1PIC, // 39
+ L_NUM2PIC, // 40
+ L_NUM3PIC, // 41
+ L_NUM4PIC, // 42
+ L_NUM5PIC, // 43
+ L_NUM6PIC, // 44
+ L_NUM7PIC, // 45
+ L_NUM8PIC, // 46
+ L_NUM9PIC, // 47
+ L_PERCENTPIC, // 48
+ L_APIC, // 49
+ L_BPIC, // 50
+ L_CPIC, // 51
+ L_DPIC, // 52
+ L_EPIC, // 53
+ L_FPIC, // 54
+ L_GPIC, // 55
+ L_HPIC, // 56
+ L_IPIC, // 57
+ L_JPIC, // 58
+ L_KPIC, // 59
+ L_LPIC, // 60
+ L_MPIC, // 61
+ L_NPIC, // 62
+ L_OPIC, // 63
+ L_PPIC, // 64
+ L_QPIC, // 65
+ L_RPIC, // 66
+ L_SPIC, // 67
+ L_TPIC, // 68
+ L_UPIC, // 69
+ L_VPIC, // 70
+ L_WPIC, // 71
+ L_XPIC, // 72
+ L_YPIC, // 73
+ L_ZPIC, // 74
+ L_EXPOINTPIC, // 75
+ L_APOSTROPHEPIC, // 76
+ L_GUY2PIC, // 77
+ L_BJWINSPIC, // 78
+ // Lump Start
+ TITLE1PIC, // 79
+ TITLE2PIC, // 80
+ // Lump Start
+ ENDSCREEN11PIC, // 81
+ // Lump Start
+ ENDSCREEN12PIC, // 82
+ ENDSCREEN3PIC, // 83
+ ENDSCREEN4PIC, // 84
+ ENDSCREEN5PIC, // 85
+ ENDSCREEN6PIC, // 86
+ ENDSCREEN7PIC, // 87
+ ENDSCREEN8PIC, // 88
+ ENDSCREEN9PIC, // 89
+ STATUSBARPIC, // 90
+ PG13PIC, // 91
+ CREDITSPIC, // 92
+ // Lump Start
+ IDGUYS1PIC, // 93
+ IDGUYS2PIC, // 94
+ // Lump Start
+ COPYPROTTOPPIC, // 95
+ COPYPROTBOXPIC, // 96
+ BOSSPIC1PIC, // 97
+ BOSSPIC2PIC, // 98
+ BOSSPIC3PIC, // 99
+ BOSSPIC4PIC, // 100
+ // Lump Start
+ KNIFEPIC, // 101
+ GUNPIC, // 102
+ MACHINEGUNPIC, // 103
+ GATLINGGUNPIC, // 104
+ NOKEYPIC, // 105
+ GOLDKEYPIC, // 106
+ SILVERKEYPIC, // 107
+ N_BLANKPIC, // 108
+ N_0PIC, // 109
+ N_1PIC, // 110
+ N_2PIC, // 111
+ N_3PIC, // 112
+ N_4PIC, // 113
+ N_5PIC, // 114
+ N_6PIC, // 115
+ N_7PIC, // 116
+ N_8PIC, // 117
+ N_9PIC, // 118
+ FACE1APIC, // 119
+ FACE1BPIC, // 120
+ FACE1CPIC, // 121
+ FACE2APIC, // 122
+ FACE2BPIC, // 123
+ FACE2CPIC, // 124
+ FACE3APIC, // 125
+ FACE3BPIC, // 126
+ FACE3CPIC, // 127
+ FACE4APIC, // 128
+ FACE4BPIC, // 129
+ FACE4CPIC, // 130
+ FACE5APIC, // 131
+ FACE5BPIC, // 132
+ FACE5CPIC, // 133
+ FACE6APIC, // 134
+ FACE6BPIC, // 135
+ FACE6CPIC, // 136
+ FACE7APIC, // 137
+ FACE7BPIC, // 138
+ FACE7CPIC, // 139
+ FACE8APIC, // 140
+ GOTGATLINGPIC, // 141
+ GODMODEFACE1PIC, // 142
+ GODMODEFACE2PIC, // 143
+ GODMODEFACE3PIC, // 144
+ BJWAITING1PIC, // 145
+ BJWAITING2PIC, // 146
+ BJOUCHPIC, // 147
+ PAUSEDPIC, // 148
+ GETPSYCHEDPIC, // 149
+
+
+
+ ORDERSCREEN=151,
+ ERRORSCREEN, // 152
+ TITLEPALETTE, // 153
+ END1PALETTE, // 154
+ END2PALETTE, // 155
+ END3PALETTE, // 156
+ END4PALETTE, // 157
+ END5PALETTE, // 158
+ END6PALETTE, // 159
+ END7PALETTE, // 160
+ END8PALETTE, // 161
+ END9PALETTE, // 162
+ IDGUYSPALETTE, // 163
+ T_DEMO0, // 164
+ T_DEMO1, // 165
+ T_DEMO2, // 166
+ T_DEMO3, // 167
+ T_ENDART1, // 168
+ ENUMEND
+ } graphicnums;
+
+//
+// Data LUMPs
+//
+#define BACKDROP_LUMP_START 3
+#define BACKDROP_LUMP_END 8
+
+#define CONTROL_LUMP_START 9
+#define CONTROL_LUMP_END 15
+
+#define OPTIONS_LUMP_START 16
+#define OPTIONS_LUMP_END 16
+
+#define SOUND_LUMP_START 17
+#define SOUND_LUMP_END 19
+
+#define NEWGAME_LUMP_START 20
+#define NEWGAME_LUMP_END 24
+
+#define LOADSAVE_LUMP_START 25
+#define LOADSAVE_LUMP_END 28
+
+#define HIGHSCORES_LUMP_START 29
+#define HIGHSCORES_LUMP_END 30
+
+#define ENDGAME_LUMP_START 31
+#define ENDGAME_LUMP_END 35
+
+#define LEVELEND_LUMP_START 36
+#define LEVELEND_LUMP_END 78
+
+#define TITLESCREEN_LUMP_START 79
+#define TITLESCREEN_LUMP_END 80
+
+#define ENDGAME1_LUMP_START 81
+#define ENDGAME1_LUMP_END 81
+
+#define ENDGAME2_LUMP_START 82
+#define ENDGAME2_LUMP_END 82
+
+#define EASTEREGG_LUMP_START 93
+#define EASTEREGG_LUMP_END 94
+
+#define COPYPROT_LUMP_START 95
+#define COPYPROT_LUMP_END 100
+
+#define LATCHPICS_LUMP_START 101
+#define LATCHPICS_LUMP_END 149
+
+
+//
+// Amount of each data item
+//
+#define NUMCHUNKS 169
+#define NUMFONT 2
+#define NUMFONTM 0
+#define NUMPICS 147
+#define NUMPICM 0
+#define NUMSPRITES 0
+#define NUMTILE8 72
+#define NUMTILE8M 0
+#define NUMTILE16 0
+#define NUMTILE16M 0
+#define NUMTILE32 0
+#define NUMTILE32M 0
+#define NUMEXTERNS 18
+//
+// File offsets for data items
+//
+#define STRUCTPIC 0
+
+#define STARTFONT 1
+#define STARTFONTM 3
+#define STARTPICS 3
+#define STARTPICM 150
+#define STARTSPRITES 150
+#define STARTTILE8 150
+#define STARTTILE8M 151
+#define STARTTILE16 151
+#define STARTTILE16M 151
+#define STARTTILE32 151
+#define STARTTILE32M 151
+#define STARTEXTERNS 151
+
+//
+// Thank you for using IGRAB!
+//
--- /dev/null
+++ b/gfxv_wl1.equ
@@ -1,0 +1,199 @@
+;=====================================
+;
+; Graphics .EQU file for .WL1
+; IGRAB-ed on Sun May 03 01:19:32 1992
+;
+;=====================================
+
+H_BJPIC = 3
+H_CASTLEPIC = 4
+H_KEYBOARDPIC = 5
+H_JOYPIC = 6
+H_HEALPIC = 7
+H_TREASUREPIC = 8
+H_GUNPIC = 9
+H_KEYPIC = 10
+H_BLAZEPIC = 11
+H_WEAPON1234PIC = 12
+H_WOLFLOGOPIC = 13
+H_VISAPIC = 14
+H_MCPIC = 15
+H_IDLOGOPIC = 16
+H_TOPWINDOWPIC = 17
+H_LEFTWINDOWPIC = 18
+H_RIGHTWINDOWPIC = 19
+H_BOTTOMINFOPIC = 20
+C_OPTIONSPIC = 21
+C_CURSOR1PIC = 22
+C_CURSOR2PIC = 23
+C_NOTSELECTEDPIC = 24
+C_SELECTEDPIC = 25
+C_FXTITLEPIC = 26
+C_DIGITITLEPIC = 27
+C_MUSICTITLEPIC = 28
+C_MOUSELBACKPIC = 29
+C_BABYMODEPIC = 30
+C_EASYPIC = 31
+C_NORMALPIC = 32
+C_HARDPIC = 33
+C_LOADSAVEDISKPIC = 34
+C_DISKLOADING1PIC = 35
+C_DISKLOADING2PIC = 36
+C_CONTROLPIC = 37
+C_CUSTOMIZEPIC = 38
+C_LOADGAMEPIC = 39
+C_SAVEGAMEPIC = 40
+C_EPISODE1PIC = 41
+C_EPISODE2PIC = 42
+C_EPISODE3PIC = 43
+C_EPISODE4PIC = 44
+C_EPISODE5PIC = 45
+C_EPISODE6PIC = 46
+C_CODEPIC = 47
+L_GUYPIC = 48
+L_COLONPIC = 49
+L_NUM0PIC = 50
+L_NUM1PIC = 51
+L_NUM2PIC = 52
+L_NUM3PIC = 53
+L_NUM4PIC = 54
+L_NUM5PIC = 55
+L_NUM6PIC = 56
+L_NUM7PIC = 57
+L_NUM8PIC = 58
+L_NUM9PIC = 59
+L_PERCENTPIC = 60
+L_APIC = 61
+L_BPIC = 62
+L_CPIC = 63
+L_DPIC = 64
+L_EPIC = 65
+L_FPIC = 66
+L_GPIC = 67
+L_HPIC = 68
+L_IPIC = 69
+L_JPIC = 70
+L_KPIC = 71
+L_LPIC = 72
+L_MPIC = 73
+L_NPIC = 74
+L_OPIC = 75
+L_PPIC = 76
+L_QPIC = 77
+L_RPIC = 78
+L_SPIC = 79
+L_TPIC = 80
+L_UPIC = 81
+L_VPIC = 82
+L_WPIC = 83
+L_XPIC = 84
+L_YPIC = 85
+L_ZPIC = 86
+L_EXPOINTPIC = 87
+L_GUY2PIC = 88
+L_BJWINSPIC = 89
+STATUSBARPIC = 90
+TITLEPIC = 91
+PG13PIC = 92
+CREDITSPIC = 93
+HIGHSCORESPIC = 94
+KNIFEPIC = 95
+GUNPIC = 96
+MACHINEGUNPIC = 97
+GATLINGGUNPIC = 98
+NOKEYPIC = 99
+GOLDKEYPIC = 100
+SILVERKEYPIC = 101
+N_BLANKPIC = 102
+N_0PIC = 103
+N_1PIC = 104
+N_2PIC = 105
+N_3PIC = 106
+N_4PIC = 107
+N_5PIC = 108
+N_6PIC = 109
+N_7PIC = 110
+N_8PIC = 111
+N_9PIC = 112
+FACE1APIC = 113
+FACE1BPIC = 114
+FACE1CPIC = 115
+FACE2APIC = 116
+FACE2BPIC = 117
+FACE2CPIC = 118
+FACE3APIC = 119
+FACE3BPIC = 120
+FACE3CPIC = 121
+FACE4APIC = 122
+FACE4BPIC = 123
+FACE4CPIC = 124
+FACE5APIC = 125
+FACE5BPIC = 126
+FACE5CPIC = 127
+FACE6APIC = 128
+FACE6BPIC = 129
+FACE6CPIC = 130
+FACE7APIC = 131
+FACE7BPIC = 132
+FACE7CPIC = 133
+FACE8APIC = 134
+GOTGATLINGPIC = 135
+MUTANTBJPIC = 136
+PAUSEDPIC = 137
+GETPSYCHEDPIC = 138
+
+
+
+ORDERSCREEN = 554
+ERRORSCREEN = 555
+
+README_LUMP_START = 3
+README_LUMP_END = 20
+
+CONTROLS_LUMP_START = 21
+CONTROLS_LUMP_END = 47
+
+LEVELEND_LUMP_START = 48
+LEVELEND_LUMP_END = 89
+
+LATCHPICS_LUMP_START = 95
+LATCHPICS_LUMP_END = 138
+
+
+;
+; Amount of each data item
+;
+NUMCHUNKS = 556
+NUMFONT = 2
+NUMFONTM = 0
+NUMPICS = 136
+NUMPICM = 0
+NUMSPRITES = 0
+NUMTILE8 = 72
+NUMTILE8M = 0
+NUMTILE16 = 144
+NUMTILE16M = 270
+NUMTILE32 = 0
+NUMTILE32M = 0
+NUMEXTERN = 2
+;
+; File offsets for data items
+;
+STRUCTPIC = 0
+
+STARTFONT = 1
+STARTFONTM = 3
+STARTPICS = 3
+STARTPICM = 139
+STARTSPRITES = 139
+STARTTILE8 = 139
+STARTTILE8M = 140
+STARTTILE16 = 140
+STARTTILE16M = 284
+STARTTILE32 = 554
+STARTTILE32M = 554
+STARTEXTERN = 554
+
+;
+; Thank you for using IGRAB!
+;
--- /dev/null
+++ b/gfxv_wl1.h
@@ -1,0 +1,209 @@
+//////////////////////////////////////
+//
+// Graphics .H file for .WL1
+// IGRAB-ed on Sun May 03 01:19:32 1992
+//
+//////////////////////////////////////
+
+typedef enum {
+ // Lump Start
+ H_BJPIC=3,
+ H_CASTLEPIC, // 4
+ H_KEYBOARDPIC, // 5
+ H_JOYPIC, // 6
+ H_HEALPIC, // 7
+ H_TREASUREPIC, // 8
+ H_GUNPIC, // 9
+ H_KEYPIC, // 10
+ H_BLAZEPIC, // 11
+ H_WEAPON1234PIC, // 12
+ H_WOLFLOGOPIC, // 13
+ H_VISAPIC, // 14
+ H_MCPIC, // 15
+ H_IDLOGOPIC, // 16
+ H_TOPWINDOWPIC, // 17
+ H_LEFTWINDOWPIC, // 18
+ H_RIGHTWINDOWPIC, // 19
+ H_BOTTOMINFOPIC, // 20
+ // Lump Start
+ C_OPTIONSPIC, // 21
+ C_CURSOR1PIC, // 22
+ C_CURSOR2PIC, // 23
+ C_NOTSELECTEDPIC, // 24
+ C_SELECTEDPIC, // 25
+ C_FXTITLEPIC, // 26
+ C_DIGITITLEPIC, // 27
+ C_MUSICTITLEPIC, // 28
+ C_MOUSELBACKPIC, // 29
+ C_BABYMODEPIC, // 30
+ C_EASYPIC, // 31
+ C_NORMALPIC, // 32
+ C_HARDPIC, // 33
+ C_LOADSAVEDISKPIC, // 34
+ C_DISKLOADING1PIC, // 35
+ C_DISKLOADING2PIC, // 36
+ C_CONTROLPIC, // 37
+ C_CUSTOMIZEPIC, // 38
+ C_LOADGAMEPIC, // 39
+ C_SAVEGAMEPIC, // 40
+ C_EPISODE1PIC, // 41
+ C_EPISODE2PIC, // 42
+ C_EPISODE3PIC, // 43
+ C_EPISODE4PIC, // 44
+ C_EPISODE5PIC, // 45
+ C_EPISODE6PIC, // 46
+ C_CODEPIC, // 47
+ // Lump Start
+ L_GUYPIC, // 48
+ L_COLONPIC, // 49
+ L_NUM0PIC, // 50
+ L_NUM1PIC, // 51
+ L_NUM2PIC, // 52
+ L_NUM3PIC, // 53
+ L_NUM4PIC, // 54
+ L_NUM5PIC, // 55
+ L_NUM6PIC, // 56
+ L_NUM7PIC, // 57
+ L_NUM8PIC, // 58
+ L_NUM9PIC, // 59
+ L_PERCENTPIC, // 60
+ L_APIC, // 61
+ L_BPIC, // 62
+ L_CPIC, // 63
+ L_DPIC, // 64
+ L_EPIC, // 65
+ L_FPIC, // 66
+ L_GPIC, // 67
+ L_HPIC, // 68
+ L_IPIC, // 69
+ L_JPIC, // 70
+ L_KPIC, // 71
+ L_LPIC, // 72
+ L_MPIC, // 73
+ L_NPIC, // 74
+ L_OPIC, // 75
+ L_PPIC, // 76
+ L_QPIC, // 77
+ L_RPIC, // 78
+ L_SPIC, // 79
+ L_TPIC, // 80
+ L_UPIC, // 81
+ L_VPIC, // 82
+ L_WPIC, // 83
+ L_XPIC, // 84
+ L_YPIC, // 85
+ L_ZPIC, // 86
+ L_EXPOINTPIC, // 87
+ L_GUY2PIC, // 88
+ L_BJWINSPIC, // 89
+ STATUSBARPIC, // 90
+ TITLEPIC, // 91
+ PG13PIC, // 92
+ CREDITSPIC, // 93
+ HIGHSCORESPIC, // 94
+ // Lump Start
+ KNIFEPIC, // 95
+ GUNPIC, // 96
+ MACHINEGUNPIC, // 97
+ GATLINGGUNPIC, // 98
+ NOKEYPIC, // 99
+ GOLDKEYPIC, // 100
+ SILVERKEYPIC, // 101
+ N_BLANKPIC, // 102
+ N_0PIC, // 103
+ N_1PIC, // 104
+ N_2PIC, // 105
+ N_3PIC, // 106
+ N_4PIC, // 107
+ N_5PIC, // 108
+ N_6PIC, // 109
+ N_7PIC, // 110
+ N_8PIC, // 111
+ N_9PIC, // 112
+ FACE1APIC, // 113
+ FACE1BPIC, // 114
+ FACE1CPIC, // 115
+ FACE2APIC, // 116
+ FACE2BPIC, // 117
+ FACE2CPIC, // 118
+ FACE3APIC, // 119
+ FACE3BPIC, // 120
+ FACE3CPIC, // 121
+ FACE4APIC, // 122
+ FACE4BPIC, // 123
+ FACE4CPIC, // 124
+ FACE5APIC, // 125
+ FACE5BPIC, // 126
+ FACE5CPIC, // 127
+ FACE6APIC, // 128
+ FACE6BPIC, // 129
+ FACE6CPIC, // 130
+ FACE7APIC, // 131
+ FACE7BPIC, // 132
+ FACE7CPIC, // 133
+ FACE8APIC, // 134
+ GOTGATLINGPIC, // 135
+ MUTANTBJPIC, // 136
+ PAUSEDPIC, // 137
+ GETPSYCHEDPIC, // 138
+
+
+
+ ORDERSCREEN=554,
+ ERRORSCREEN, // 555
+ ENUMEND
+ } graphicnums;
+
+//
+// Data LUMPs
+//
+#define README_LUMP_START 3
+#define README_LUMP_END 20
+
+#define CONTROLS_LUMP_START 21
+#define CONTROLS_LUMP_END 47
+
+#define LEVELEND_LUMP_START 48
+#define LEVELEND_LUMP_END 89
+
+#define LATCHPICS_LUMP_START 95
+#define LATCHPICS_LUMP_END 138
+
+
+//
+// Amount of each data item
+//
+#define NUMCHUNKS 556
+#define NUMFONT 2
+#define NUMFONTM 0
+#define NUMPICS 136
+#define NUMPICM 0
+#define NUMSPRITES 0
+#define NUMTILE8 72
+#define NUMTILE8M 0
+#define NUMTILE16 144
+#define NUMTILE16M 270
+#define NUMTILE32 0
+#define NUMTILE32M 0
+#define NUMEXTERNS 2
+//
+// File offsets for data items
+//
+#define STRUCTPIC 0
+
+#define STARTFONT 1
+#define STARTFONTM 3
+#define STARTPICS 3
+#define STARTPICM 139
+#define STARTSPRITES 139
+#define STARTTILE8 139
+#define STARTTILE8M 140
+#define STARTTILE16 140
+#define STARTTILE16M 284
+#define STARTTILE32 554
+#define STARTTILE32M 554
+#define STARTEXTERNS 554
+
+//
+// Thank you for using IGRAB!
+//
--- /dev/null
+++ b/gfxv_wl6.equ
@@ -1,0 +1,206 @@
+;=====================================
+;
+; Graphics .EQU file for .WL6
+; IGRAB-ed on Wed Apr 13 06:58:44 1994
+;
+;=====================================
+
+H_BJPIC = 3
+H_CASTLEPIC = 4
+H_BLAZEPIC = 5
+H_TOPWINDOWPIC = 6
+H_LEFTWINDOWPIC = 7
+H_RIGHTWINDOWPIC = 8
+H_BOTTOMINFOPIC = 9
+C_OPTIONSPIC = 10
+C_CURSOR1PIC = 11
+C_CURSOR2PIC = 12
+C_NOTSELECTEDPIC = 13
+C_SELECTEDPIC = 14
+C_FXTITLEPIC = 15
+C_DIGITITLEPIC = 16
+C_MUSICTITLEPIC = 17
+C_MOUSELBACKPIC = 18
+C_BABYMODEPIC = 19
+C_EASYPIC = 20
+C_NORMALPIC = 21
+C_HARDPIC = 22
+C_LOADSAVEDISKPIC = 23
+C_DISKLOADING1PIC = 24
+C_DISKLOADING2PIC = 25
+C_CONTROLPIC = 26
+C_CUSTOMIZEPIC = 27
+C_LOADGAMEPIC = 28
+C_SAVEGAMEPIC = 29
+C_EPISODE1PIC = 30
+C_EPISODE2PIC = 31
+C_EPISODE3PIC = 32
+C_EPISODE4PIC = 33
+C_EPISODE5PIC = 34
+C_EPISODE6PIC = 35
+C_CODEPIC = 36
+C_TIMECODEPIC = 37
+C_LEVELPIC = 38
+C_NAMEPIC = 39
+C_SCOREPIC = 40
+C_JOY1PIC = 41
+C_JOY2PIC = 42
+L_GUYPIC = 43
+L_COLONPIC = 44
+L_NUM0PIC = 45
+L_NUM1PIC = 46
+L_NUM2PIC = 47
+L_NUM3PIC = 48
+L_NUM4PIC = 49
+L_NUM5PIC = 50
+L_NUM6PIC = 51
+L_NUM7PIC = 52
+L_NUM8PIC = 53
+L_NUM9PIC = 54
+L_PERCENTPIC = 55
+L_APIC = 56
+L_BPIC = 57
+L_CPIC = 58
+L_DPIC = 59
+L_EPIC = 60
+L_FPIC = 61
+L_GPIC = 62
+L_HPIC = 63
+L_IPIC = 64
+L_JPIC = 65
+L_KPIC = 66
+L_LPIC = 67
+L_MPIC = 68
+L_NPIC = 69
+L_OPIC = 70
+L_PPIC = 71
+L_QPIC = 72
+L_RPIC = 73
+L_SPIC = 74
+L_TPIC = 75
+L_UPIC = 76
+L_VPIC = 77
+L_WPIC = 78
+L_XPIC = 79
+L_YPIC = 80
+L_ZPIC = 81
+L_EXPOINTPIC = 82
+L_APOSTROPHEPIC = 83
+L_GUY2PIC = 84
+L_BJWINSPIC = 85
+STATUSBARPIC = 86
+TITLEPIC = 87
+PG13PIC = 88
+CREDITSPIC = 89
+HIGHSCORESPIC = 90
+KNIFEPIC = 91
+GUNPIC = 92
+MACHINEGUNPIC = 93
+GATLINGGUNPIC = 94
+NOKEYPIC = 95
+GOLDKEYPIC = 96
+SILVERKEYPIC = 97
+N_BLANKPIC = 98
+N_0PIC = 99
+N_1PIC = 100
+N_2PIC = 101
+N_3PIC = 102
+N_4PIC = 103
+N_5PIC = 104
+N_6PIC = 105
+N_7PIC = 106
+N_8PIC = 107
+N_9PIC = 108
+FACE1APIC = 109
+FACE1BPIC = 110
+FACE1CPIC = 111
+FACE2APIC = 112
+FACE2BPIC = 113
+FACE2CPIC = 114
+FACE3APIC = 115
+FACE3BPIC = 116
+FACE3CPIC = 117
+FACE4APIC = 118
+FACE4BPIC = 119
+FACE4CPIC = 120
+FACE5APIC = 121
+FACE5BPIC = 122
+FACE5CPIC = 123
+FACE6APIC = 124
+FACE6BPIC = 125
+FACE6CPIC = 126
+FACE7APIC = 127
+FACE7BPIC = 128
+FACE7CPIC = 129
+FACE8APIC = 130
+GOTGATLINGPIC = 131
+MUTANTBJPIC = 132
+PAUSEDPIC = 133
+GETPSYCHEDPIC = 134
+
+
+
+ORDERSCREEN = 136
+ERRORSCREEN = 137
+T_HELPART = 138
+T_DEMO0 = 139
+T_DEMO1 = 140
+T_DEMO2 = 141
+T_DEMO3 = 142
+T_ENDART1 = 143
+T_ENDART2 = 144
+T_ENDART3 = 145
+T_ENDART4 = 146
+T_ENDART5 = 147
+T_ENDART6 = 148
+
+README_LUMP_START = 3
+README_LUMP_END = 9
+
+CONTROLS_LUMP_START = 10
+CONTROLS_LUMP_END = 42
+
+LEVELEND_LUMP_START = 43
+LEVELEND_LUMP_END = 85
+
+LATCHPICS_LUMP_START = 91
+LATCHPICS_LUMP_END = 134
+
+
+;
+; Amount of each data item
+;
+NUMCHUNKS = 149
+NUMFONT = 2
+NUMFONTM = 0
+NUMPICS = 132
+NUMPICM = 0
+NUMSPRITES = 0
+NUMTILE8 = 72
+NUMTILE8M = 0
+NUMTILE16 = 0
+NUMTILE16M = 0
+NUMTILE32 = 0
+NUMTILE32M = 0
+NUMEXTERN = 13
+;
+; File offsets for data items
+;
+STRUCTPIC = 0
+
+STARTFONT = 1
+STARTFONTM = 3
+STARTPICS = 3
+STARTPICM = 135
+STARTSPRITES = 135
+STARTTILE8 = 135
+STARTTILE8M = 136
+STARTTILE16 = 136
+STARTTILE16M = 136
+STARTTILE32 = 136
+STARTTILE32M = 136
+STARTEXTERN = 136
+
+;
+; Thank you for using IGRAB!
+;
--- /dev/null
+++ b/gfxv_wl6.h
@@ -1,0 +1,216 @@
+//////////////////////////////////////
+//
+// Graphics .H file for .WL6
+// IGRAB-ed on Wed Apr 13 06:58:44 1994
+//
+//////////////////////////////////////
+
+typedef enum {
+ // Lump Start
+ H_BJPIC=3,
+ H_CASTLEPIC, // 4
+ H_BLAZEPIC, // 5
+ H_TOPWINDOWPIC, // 6
+ H_LEFTWINDOWPIC, // 7
+ H_RIGHTWINDOWPIC, // 8
+ H_BOTTOMINFOPIC, // 9
+ // Lump Start
+ C_OPTIONSPIC, // 10
+ C_CURSOR1PIC, // 11
+ C_CURSOR2PIC, // 12
+ C_NOTSELECTEDPIC, // 13
+ C_SELECTEDPIC, // 14
+ C_FXTITLEPIC, // 15
+ C_DIGITITLEPIC, // 16
+ C_MUSICTITLEPIC, // 17
+ C_MOUSELBACKPIC, // 18
+ C_BABYMODEPIC, // 19
+ C_EASYPIC, // 20
+ C_NORMALPIC, // 21
+ C_HARDPIC, // 22
+ C_LOADSAVEDISKPIC, // 23
+ C_DISKLOADING1PIC, // 24
+ C_DISKLOADING2PIC, // 25
+ C_CONTROLPIC, // 26
+ C_CUSTOMIZEPIC, // 27
+ C_LOADGAMEPIC, // 28
+ C_SAVEGAMEPIC, // 29
+ C_EPISODE1PIC, // 30
+ C_EPISODE2PIC, // 31
+ C_EPISODE3PIC, // 32
+ C_EPISODE4PIC, // 33
+ C_EPISODE5PIC, // 34
+ C_EPISODE6PIC, // 35
+ C_CODEPIC, // 36
+ C_TIMECODEPIC, // 37
+ C_LEVELPIC, // 38
+ C_NAMEPIC, // 39
+ C_SCOREPIC, // 40
+ C_JOY1PIC, // 41
+ C_JOY2PIC, // 42
+ // Lump Start
+ L_GUYPIC, // 43
+ L_COLONPIC, // 44
+ L_NUM0PIC, // 45
+ L_NUM1PIC, // 46
+ L_NUM2PIC, // 47
+ L_NUM3PIC, // 48
+ L_NUM4PIC, // 49
+ L_NUM5PIC, // 50
+ L_NUM6PIC, // 51
+ L_NUM7PIC, // 52
+ L_NUM8PIC, // 53
+ L_NUM9PIC, // 54
+ L_PERCENTPIC, // 55
+ L_APIC, // 56
+ L_BPIC, // 57
+ L_CPIC, // 58
+ L_DPIC, // 59
+ L_EPIC, // 60
+ L_FPIC, // 61
+ L_GPIC, // 62
+ L_HPIC, // 63
+ L_IPIC, // 64
+ L_JPIC, // 65
+ L_KPIC, // 66
+ L_LPIC, // 67
+ L_MPIC, // 68
+ L_NPIC, // 69
+ L_OPIC, // 70
+ L_PPIC, // 71
+ L_QPIC, // 72
+ L_RPIC, // 73
+ L_SPIC, // 74
+ L_TPIC, // 75
+ L_UPIC, // 76
+ L_VPIC, // 77
+ L_WPIC, // 78
+ L_XPIC, // 79
+ L_YPIC, // 80
+ L_ZPIC, // 81
+ L_EXPOINTPIC, // 82
+ L_APOSTROPHEPIC, // 83
+ L_GUY2PIC, // 84
+ L_BJWINSPIC, // 85
+ STATUSBARPIC, // 86
+ TITLEPIC, // 87
+ PG13PIC, // 88
+ CREDITSPIC, // 89
+ HIGHSCORESPIC, // 90
+ // Lump Start
+ KNIFEPIC, // 91
+ GUNPIC, // 92
+ MACHINEGUNPIC, // 93
+ GATLINGGUNPIC, // 94
+ NOKEYPIC, // 95
+ GOLDKEYPIC, // 96
+ SILVERKEYPIC, // 97
+ N_BLANKPIC, // 98
+ N_0PIC, // 99
+ N_1PIC, // 100
+ N_2PIC, // 101
+ N_3PIC, // 102
+ N_4PIC, // 103
+ N_5PIC, // 104
+ N_6PIC, // 105
+ N_7PIC, // 106
+ N_8PIC, // 107
+ N_9PIC, // 108
+ FACE1APIC, // 109
+ FACE1BPIC, // 110
+ FACE1CPIC, // 111
+ FACE2APIC, // 112
+ FACE2BPIC, // 113
+ FACE2CPIC, // 114
+ FACE3APIC, // 115
+ FACE3BPIC, // 116
+ FACE3CPIC, // 117
+ FACE4APIC, // 118
+ FACE4BPIC, // 119
+ FACE4CPIC, // 120
+ FACE5APIC, // 121
+ FACE5BPIC, // 122
+ FACE5CPIC, // 123
+ FACE6APIC, // 124
+ FACE6BPIC, // 125
+ FACE6CPIC, // 126
+ FACE7APIC, // 127
+ FACE7BPIC, // 128
+ FACE7CPIC, // 129
+ FACE8APIC, // 130
+ GOTGATLINGPIC, // 131
+ MUTANTBJPIC, // 132
+ PAUSEDPIC, // 133
+ GETPSYCHEDPIC, // 134
+
+
+
+ ORDERSCREEN=136,
+ ERRORSCREEN, // 137
+ T_HELPART, // 138
+ T_DEMO0, // 139
+ T_DEMO1, // 140
+ T_DEMO2, // 141
+ T_DEMO3, // 142
+ T_ENDART1, // 143
+ T_ENDART2, // 144
+ T_ENDART3, // 145
+ T_ENDART4, // 146
+ T_ENDART5, // 147
+ T_ENDART6, // 148
+ ENUMEND
+ } graphicnums;
+
+//
+// Data LUMPs
+//
+#define README_LUMP_START 3
+#define README_LUMP_END 9
+
+#define CONTROLS_LUMP_START 10
+#define CONTROLS_LUMP_END 42
+
+#define LEVELEND_LUMP_START 43
+#define LEVELEND_LUMP_END 85
+
+#define LATCHPICS_LUMP_START 91
+#define LATCHPICS_LUMP_END 134
+
+
+//
+// Amount of each data item
+//
+#define NUMCHUNKS 149
+#define NUMFONT 2
+#define NUMFONTM 0
+#define NUMPICS 132
+#define NUMPICM 0
+#define NUMSPRITES 0
+#define NUMTILE8 72
+#define NUMTILE8M 0
+#define NUMTILE16 0
+#define NUMTILE16M 0
+#define NUMTILE32 0
+#define NUMTILE32M 0
+#define NUMEXTERNS 13
+//
+// File offsets for data items
+//
+#define STRUCTPIC 0
+
+#define STARTFONT 1
+#define STARTFONTM 3
+#define STARTPICS 3
+#define STARTPICM 135
+#define STARTSPRITES 135
+#define STARTTILE8 135
+#define STARTTILE8M 136
+#define STARTTILE16 136
+#define STARTTILE16M 136
+#define STARTTILE32 136
+#define STARTTILE32M 136
+#define STARTEXTERNS 136
+
+//
+// Thank you for using IGRAB!
+//
--- /dev/null
+++ b/head.h
@@ -1,0 +1,34 @@
+// ID_HEAD.H
+
+
+#define EXTENSION "WLF"
+#define WOLF
+
+#define TEXTGR 0
+#define CGAGR 1
+#define EGAGR 2
+#define VGAGR 3
+
+#define GRMODE VGAGR
+
+#include "VERSION.H"
+
+typedef enum {false,true} boolean;
+typedef unsigned char byte;
+typedef unsigned int word;
+typedef unsigned long longword;
+typedef byte * Ptr;
+
+typedef struct
+ {
+ int x,y;
+ } Point;
+
+typedef struct
+ {
+ Point ul,lr;
+ } Rect;
+
+
+void Quit (char *error); // defined in user program
+
--- /dev/null
+++ b/heads.h
@@ -1,0 +1,123 @@
+// ID_GLOB.H
+
+
+#include <ALLOC.H>
+#include <CTYPE.H>
+#include <DOS.H>
+#include <ERRNO.H>
+#include <FCNTL.H>
+#include <IO.H>
+#include <MEM.H>
+#include <PROCESS.H>
+#include <STDIO.H>
+#include <STDLIB.H>
+#include <STRING.H>
+#include <SYS\STAT.H>
+#include <VALUES.H>
+#include <DIR.H>
+#define __ID_GLOB__
+#include "VERSION.H"
+
+//--------------------------------------------------------------------------
+
+extern char far signon;
+
+#define introscn signon
+
+#ifdef JAPAN
+#ifdef JAPDEMO
+#include "FOREIGN\JAPAN\GFXV_WJ1.H"
+#else
+#include "FOREIGN\JAPAN\GFXV_WJ6.H"
+#endif
+#include "AUDIOWL6.H"
+#include "MAPSWL6.H"
+#else
+
+#ifndef SPEAR
+
+#include "GFXV_WL6.H"
+#include "AUDIOWL6.H"
+#include "MAPSWL6.H"
+
+#else
+
+#ifndef SPEARDEMO
+#include "GFXV_SOD.H"
+#include "AUDIOSOD.H"
+#include "MAPSSOD.H"
+#else
+#include "GFXV_SDM.H"
+#include "AUDIOSDM.H"
+#include "MAPSSDM.H"
+#endif
+
+#endif
+#endif
+//-----------------
+
+
+#define GREXT "VGA"
+
+//
+// ID Engine
+// Types.h - Generic types, #defines, etc.
+// v1.0d1
+//
+
+typedef enum {false,true} boolean;
+typedef unsigned char byte;
+typedef unsigned int word;
+typedef unsigned long longword;
+typedef byte * Ptr;
+
+typedef struct
+ {
+ int x,y;
+ } Point;
+typedef struct
+ {
+ Point ul,lr;
+ } Rect;
+
+#define nil ((void *)0)
+
+
+#include "ID_MM.H"
+#include "ID_PM.H"
+#include "ID_CA.H"
+#include "ID_VL.H"
+#include "ID_VH.H"
+#include "ID_IN.H"
+#include "ID_SD.H"
+#include "ID_US.H"
+
+
+void Quit (char *error); // defined in user program
+
+//
+// replacing refresh manager with custom routines
+//
+
+#define PORTTILESWIDE 20 // all drawing takes place inside a
+#define PORTTILESHIGH 13 // non displayed port of this size
+
+#define UPDATEWIDE PORTTILESWIDE
+#define UPDATEHIGH PORTTILESHIGH
+
+#define MAXTICS 10
+#define DEMOTICS 4
+
+#define UPDATETERMINATE 0x0301
+
+extern unsigned mapwidth,mapheight,tics;
+extern boolean compatability;
+
+extern byte *updateptr;
+extern unsigned uwidthtable[UPDATEHIGH];
+extern unsigned blockstarts[UPDATEWIDE*UPDATEHIGH];
+
+extern byte fontcolor,backcolor;
+
+#define SETFONTCOLOR(f,b) fontcolor=f;backcolor=b;
+
--- /dev/null
+++ b/in.c
@@ -1,0 +1,990 @@
+//
+// ID Engine
+// ID_IN.c - Input Manager
+// v1.0d1
+// By Jason Blochowiak
+//
+
+//
+// This module handles dealing with the various input devices
+//
+// Depends on: Memory Mgr (for demo recording), Sound Mgr (for timing stuff),
+// User Mgr (for command line parms)
+//
+// Globals:
+// LastScan - The keyboard scan code of the last key pressed
+// LastASCII - The ASCII value of the last key pressed
+// DEBUG - there are more globals
+//
+
+#include "ID_HEADS.H"
+#pragma hdrstop
+
+#define KeyInt 9 // The keyboard ISR number
+
+//
+// mouse constants
+//
+#define MReset 0
+#define MButtons 3
+#define MDelta 11
+
+#define MouseInt 0x33
+#define Mouse(x) _AX = x,geninterrupt(MouseInt)
+
+//
+// joystick constants
+//
+#define JoyScaleMax 32768
+#define JoyScaleShift 8
+#define MaxJoyValue 5000
+
+/*
+=============================================================================
+
+ GLOBAL VARIABLES
+
+=============================================================================
+*/
+
+//
+// configuration variables
+//
+boolean MousePresent;
+boolean JoysPresent[MaxJoys];
+boolean JoyPadPresent;
+
+
+// Global variables
+ boolean Keyboard[NumCodes];
+ boolean Paused;
+ char LastASCII;
+ ScanCode LastScan;
+
+ KeyboardDef KbdDefs = {0x1d,0x38,0x47,0x48,0x49,0x4b,0x4d,0x4f,0x50,0x51};
+ JoystickDef JoyDefs[MaxJoys];
+ ControlType Controls[MaxPlayers];
+
+ longword MouseDownCount;
+
+ Demo DemoMode = demo_Off;
+ byte _seg *DemoBuffer;
+ word DemoOffset,DemoSize;
+
+/*
+=============================================================================
+
+ LOCAL VARIABLES
+
+=============================================================================
+*/
+static byte far ASCIINames[] = // Unshifted ASCII for scan codes
+ {
+// 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ 0 ,27 ,'1','2','3','4','5','6','7','8','9','0','-','=',8 ,9 , // 0
+ 'q','w','e','r','t','y','u','i','o','p','[',']',13 ,0 ,'a','s', // 1
+ 'd','f','g','h','j','k','l',';',39 ,'`',0 ,92 ,'z','x','c','v', // 2
+ 'b','n','m',',','.','/',0 ,'*',0 ,' ',0 ,0 ,0 ,0 ,0 ,0 , // 3
+ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,'7','8','9','-','4','5','6','+','1', // 4
+ '2','3','0',127,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 5
+ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 6
+ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 // 7
+ },
+ far ShiftNames[] = // Shifted ASCII for scan codes
+ {
+// 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ 0 ,27 ,'!','@','#','$','%','^','&','*','(',')','_','+',8 ,9 , // 0
+ 'Q','W','E','R','T','Y','U','I','O','P','{','}',13 ,0 ,'A','S', // 1
+ 'D','F','G','H','J','K','L',':',34 ,'~',0 ,'|','Z','X','C','V', // 2
+ 'B','N','M','<','>','?',0 ,'*',0 ,' ',0 ,0 ,0 ,0 ,0 ,0 , // 3
+ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,'7','8','9','-','4','5','6','+','1', // 4
+ '2','3','0',127,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 5
+ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 6
+ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 // 7
+ },
+ far SpecialNames[] = // ASCII for 0xe0 prefixed codes
+ {
+// 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 0
+ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,13 ,0 ,0 ,0 , // 1
+ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 2
+ 0 ,0 ,0 ,0 ,0 ,'/',0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 3
+ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 4
+ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 5
+ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 6
+ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 // 7
+ };
+
+
+static boolean IN_Started;
+static boolean CapsLock;
+static ScanCode CurCode,LastCode;
+
+static Direction DirTable[] = // Quick lookup for total direction
+ {
+ dir_NorthWest, dir_North, dir_NorthEast,
+ dir_West, dir_None, dir_East,
+ dir_SouthWest, dir_South, dir_SouthEast
+ };
+
+static void (*INL_KeyHook)(void);
+static void interrupt (*OldKeyVect)(void);
+
+static char *ParmStrings[] = {"nojoys","nomouse",nil};
+
+// Internal routines
+
+///////////////////////////////////////////////////////////////////////////
+//
+// INL_KeyService() - Handles a keyboard interrupt (key up/down)
+//
+///////////////////////////////////////////////////////////////////////////
+static void interrupt
+INL_KeyService(void)
+{
+static boolean special;
+ byte k,c,
+ temp;
+ int i;
+
+ k = inportb(0x60); // Get the scan code
+
+ // Tell the XT keyboard controller to clear the key
+ outportb(0x61,(temp = inportb(0x61)) | 0x80);
+ outportb(0x61,temp);
+
+ if (k == 0xe0) // Special key prefix
+ special = true;
+ else if (k == 0xe1) // Handle Pause key
+ Paused = true;
+ else
+ {
+ if (k & 0x80) // Break code
+ {
+ k &= 0x7f;
+
+// DEBUG - handle special keys: ctl-alt-delete, print scrn
+
+ Keyboard[k] = false;
+ }
+ else // Make code
+ {
+ LastCode = CurCode;
+ CurCode = LastScan = k;
+ Keyboard[k] = true;
+
+ if (special)
+ c = SpecialNames[k];
+ else
+ {
+ if (k == sc_CapsLock)
+ {
+ CapsLock ^= true;
+ // DEBUG - make caps lock light work
+ }
+
+ if (Keyboard[sc_LShift] || Keyboard[sc_RShift]) // If shifted
+ {
+ c = ShiftNames[k];
+ if ((c >= 'A') && (c <= 'Z') && CapsLock)
+ c += 'a' - 'A';
+ }
+ else
+ {
+ c = ASCIINames[k];
+ if ((c >= 'a') && (c <= 'z') && CapsLock)
+ c -= 'a' - 'A';
+ }
+ }
+ if (c)
+ LastASCII = c;
+ }
+
+ special = false;
+ }
+
+ if (INL_KeyHook && !special)
+ INL_KeyHook();
+ outportb(0x20,0x20);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// INL_GetMouseDelta() - Gets the amount that the mouse has moved from the
+// mouse driver
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+INL_GetMouseDelta(int *x,int *y)
+{
+ Mouse(MDelta);
+ *x = _CX;
+ *y = _DX;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// INL_GetMouseButtons() - Gets the status of the mouse buttons from the
+// mouse driver
+//
+///////////////////////////////////////////////////////////////////////////
+static word
+INL_GetMouseButtons(void)
+{
+ word buttons;
+
+ Mouse(MButtons);
+ buttons = _BX;
+ return(buttons);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// IN_GetJoyAbs() - Reads the absolute position of the specified joystick
+//
+///////////////////////////////////////////////////////////////////////////
+void
+IN_GetJoyAbs(word joy,word *xp,word *yp)
+{
+ byte xb,yb,
+ xs,ys;
+ word x,y;
+
+ x = y = 0;
+ xs = joy? 2 : 0; // Find shift value for x axis
+ xb = 1 << xs; // Use shift value to get x bit mask
+ ys = joy? 3 : 1; // Do the same for y axis
+ yb = 1 << ys;
+
+// Read the absolute joystick values
+asm pushf // Save some registers
+asm push si
+asm push di
+asm cli // Make sure an interrupt doesn't screw the timings
+
+
+asm mov dx,0x201
+asm in al,dx
+asm out dx,al // Clear the resistors
+
+asm mov ah,[xb] // Get masks into registers
+asm mov ch,[yb]
+
+asm xor si,si // Clear count registers
+asm xor di,di
+asm xor bh,bh // Clear high byte of bx for later
+
+asm push bp // Don't mess up stack frame
+asm mov bp,MaxJoyValue
+
+loop:
+asm in al,dx // Get bits indicating whether all are finished
+
+asm dec bp // Check bounding register
+asm jz done // We have a silly value - abort
+
+asm mov bl,al // Duplicate the bits
+asm and bl,ah // Mask off useless bits (in [xb])
+asm add si,bx // Possibly increment count register
+asm mov cl,bl // Save for testing later
+
+asm mov bl,al
+asm and bl,ch // [yb]
+asm add di,bx
+
+asm add cl,bl
+asm jnz loop // If both bits were 0, drop out
+
+done:
+asm pop bp
+
+asm mov cl,[xs] // Get the number of bits to shift
+asm shr si,cl // and shift the count that many times
+
+asm mov cl,[ys]
+asm shr di,cl
+
+asm mov [x],si // Store the values into the variables
+asm mov [y],di
+
+asm pop di
+asm pop si
+asm popf // Restore the registers
+
+ *xp = x;
+ *yp = y;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// INL_GetJoyDelta() - Returns the relative movement of the specified
+// joystick (from +/-127)
+//
+///////////////////////////////////////////////////////////////////////////
+void INL_GetJoyDelta(word joy,int *dx,int *dy)
+{
+ word x,y;
+ longword time;
+ JoystickDef *def;
+static longword lasttime;
+
+ IN_GetJoyAbs(joy,&x,&y);
+ def = JoyDefs + joy;
+
+ if (x < def->threshMinX)
+ {
+ if (x < def->joyMinX)
+ x = def->joyMinX;
+
+ x = -(x - def->threshMinX);
+ x *= def->joyMultXL;
+ x >>= JoyScaleShift;
+ *dx = (x > 127)? -127 : -x;
+ }
+ else if (x > def->threshMaxX)
+ {
+ if (x > def->joyMaxX)
+ x = def->joyMaxX;
+
+ x = x - def->threshMaxX;
+ x *= def->joyMultXH;
+ x >>= JoyScaleShift;
+ *dx = (x > 127)? 127 : x;
+ }
+ else
+ *dx = 0;
+
+ if (y < def->threshMinY)
+ {
+ if (y < def->joyMinY)
+ y = def->joyMinY;
+
+ y = -(y - def->threshMinY);
+ y *= def->joyMultYL;
+ y >>= JoyScaleShift;
+ *dy = (y > 127)? -127 : -y;
+ }
+ else if (y > def->threshMaxY)
+ {
+ if (y > def->joyMaxY)
+ y = def->joyMaxY;
+
+ y = y - def->threshMaxY;
+ y *= def->joyMultYH;
+ y >>= JoyScaleShift;
+ *dy = (y > 127)? 127 : y;
+ }
+ else
+ *dy = 0;
+
+ lasttime = TimeCount;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// INL_GetJoyButtons() - Returns the button status of the specified
+// joystick
+//
+///////////////////////////////////////////////////////////////////////////
+static word
+INL_GetJoyButtons(word joy)
+{
+register word result;
+
+ result = inportb(0x201); // Get all the joystick buttons
+ result >>= joy? 6 : 4; // Shift into bits 0-1
+ result &= 3; // Mask off the useless bits
+ result ^= 3;
+ return(result);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// IN_GetJoyButtonsDB() - Returns the de-bounced button status of the
+// specified joystick
+//
+///////////////////////////////////////////////////////////////////////////
+word
+IN_GetJoyButtonsDB(word joy)
+{
+ longword lasttime;
+ word result1,result2;
+
+ do
+ {
+ result1 = INL_GetJoyButtons(joy);
+ lasttime = TimeCount;
+ while (TimeCount == lasttime)
+ ;
+ result2 = INL_GetJoyButtons(joy);
+ } while (result1 != result2);
+ return(result1);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// INL_StartKbd() - Sets up my keyboard stuff for use
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+INL_StartKbd(void)
+{
+ INL_KeyHook = NULL; // no key hook routine
+
+ IN_ClearKeysDown();
+
+ OldKeyVect = getvect(KeyInt);
+ setvect(KeyInt,INL_KeyService);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// INL_ShutKbd() - Restores keyboard control to the BIOS
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+INL_ShutKbd(void)
+{
+ poke(0x40,0x17,peek(0x40,0x17) & 0xfaf0); // Clear ctrl/alt/shift flags
+
+ setvect(KeyInt,OldKeyVect);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// INL_StartMouse() - Detects and sets up the mouse
+//
+///////////////////////////////////////////////////////////////////////////
+static boolean
+INL_StartMouse(void)
+{
+#if 0
+ if (getvect(MouseInt))
+ {
+ Mouse(MReset);
+ if (_AX == 0xffff)
+ return(true);
+ }
+ return(false);
+#endif
+ union REGS regs;
+ unsigned char far *vector;
+
+
+ if ((vector=MK_FP(peek(0,0x33*4+2),peek(0,0x33*4)))==NULL)
+ return false;
+
+ if (*vector == 207)
+ return false;
+
+ Mouse(MReset);
+ return true;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// INL_ShutMouse() - Cleans up after the mouse
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+INL_ShutMouse(void)
+{
+}
+
+//
+// INL_SetJoyScale() - Sets up scaling values for the specified joystick
+//
+static void
+INL_SetJoyScale(word joy)
+{
+ JoystickDef *def;
+
+ def = &JoyDefs[joy];
+ def->joyMultXL = JoyScaleMax / (def->threshMinX - def->joyMinX);
+ def->joyMultXH = JoyScaleMax / (def->joyMaxX - def->threshMaxX);
+ def->joyMultYL = JoyScaleMax / (def->threshMinY - def->joyMinY);
+ def->joyMultYH = JoyScaleMax / (def->joyMaxY - def->threshMaxY);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// IN_SetupJoy() - Sets up thresholding values and calls INL_SetJoyScale()
+// to set up scaling values
+//
+///////////////////////////////////////////////////////////////////////////
+void
+IN_SetupJoy(word joy,word minx,word maxx,word miny,word maxy)
+{
+ word d,r;
+ JoystickDef *def;
+
+ def = &JoyDefs[joy];
+
+ def->joyMinX = minx;
+ def->joyMaxX = maxx;
+ r = maxx - minx;
+ d = r / 3;
+ def->threshMinX = ((r / 2) - d) + minx;
+ def->threshMaxX = ((r / 2) + d) + minx;
+
+ def->joyMinY = miny;
+ def->joyMaxY = maxy;
+ r = maxy - miny;
+ d = r / 3;
+ def->threshMinY = ((r / 2) - d) + miny;
+ def->threshMaxY = ((r / 2) + d) + miny;
+
+ INL_SetJoyScale(joy);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// INL_StartJoy() - Detects & auto-configures the specified joystick
+// The auto-config assumes the joystick is centered
+//
+///////////////////////////////////////////////////////////////////////////
+static boolean
+INL_StartJoy(word joy)
+{
+ word x,y;
+
+ IN_GetJoyAbs(joy,&x,&y);
+
+ if
+ (
+ ((x == 0) || (x > MaxJoyValue - 10))
+ || ((y == 0) || (y > MaxJoyValue - 10))
+ )
+ return(false);
+ else
+ {
+ IN_SetupJoy(joy,0,x * 2,0,y * 2);
+ return(true);
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// INL_ShutJoy() - Cleans up the joystick stuff
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+INL_ShutJoy(word joy)
+{
+ JoysPresent[joy] = false;
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+//
+// IN_Startup() - Starts up the Input Mgr
+//
+///////////////////////////////////////////////////////////////////////////
+void
+IN_Startup(void)
+{
+ boolean checkjoys,checkmouse;
+ word i;
+
+ if (IN_Started)
+ return;
+
+ checkjoys = true;
+ checkmouse = true;
+ for (i = 1;i < _argc;i++)
+ {
+ switch (US_CheckParm(_argv[i],ParmStrings))
+ {
+ case 0:
+ checkjoys = false;
+ break;
+ case 1:
+ checkmouse = false;
+ break;
+ }
+ }
+
+ INL_StartKbd();
+ MousePresent = checkmouse? INL_StartMouse() : false;
+
+ for (i = 0;i < MaxJoys;i++)
+ JoysPresent[i] = checkjoys? INL_StartJoy(i) : false;
+
+ IN_Started = true;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// IN_Default() - Sets up default conditions for the Input Mgr
+//
+///////////////////////////////////////////////////////////////////////////
+void
+IN_Default(boolean gotit,ControlType in)
+{
+ if
+ (
+ (!gotit)
+ || ((in == ctrl_Joystick1) && !JoysPresent[0])
+ || ((in == ctrl_Joystick2) && !JoysPresent[1])
+ || ((in == ctrl_Mouse) && !MousePresent)
+ )
+ in = ctrl_Keyboard1;
+ IN_SetControlType(0,in);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// IN_Shutdown() - Shuts down the Input Mgr
+//
+///////////////////////////////////////////////////////////////////////////
+void
+IN_Shutdown(void)
+{
+ word i;
+
+ if (!IN_Started)
+ return;
+
+ INL_ShutMouse();
+ for (i = 0;i < MaxJoys;i++)
+ INL_ShutJoy(i);
+ INL_ShutKbd();
+
+ IN_Started = false;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// IN_SetKeyHook() - Sets the routine that gets called by INL_KeyService()
+// everytime a real make/break code gets hit
+//
+///////////////////////////////////////////////////////////////////////////
+void
+IN_SetKeyHook(void (*hook)())
+{
+ INL_KeyHook = hook;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// IN_ClearKeysDown() - Clears the keyboard array
+//
+///////////////////////////////////////////////////////////////////////////
+void
+IN_ClearKeysDown(void)
+{
+ int i;
+
+ LastScan = sc_None;
+ LastASCII = key_None;
+ memset (Keyboard,0,sizeof(Keyboard));
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+//
+// IN_ReadControl() - Reads the device associated with the specified
+// player and fills in the control info struct
+//
+///////////////////////////////////////////////////////////////////////////
+void
+IN_ReadControl(int player,ControlInfo *info)
+{
+ boolean realdelta;
+ byte dbyte;
+ word buttons;
+ int dx,dy;
+ Motion mx,my;
+ ControlType type;
+register KeyboardDef *def;
+
+ dx = dy = 0;
+ mx = my = motion_None;
+ buttons = 0;
+
+ if (DemoMode == demo_Playback)
+ {
+ dbyte = DemoBuffer[DemoOffset + 1];
+ my = (dbyte & 3) - 1;
+ mx = ((dbyte >> 2) & 3) - 1;
+ buttons = (dbyte >> 4) & 3;
+
+ if (!(--DemoBuffer[DemoOffset]))
+ {
+ DemoOffset += 2;
+ if (DemoOffset >= DemoSize)
+ DemoMode = demo_PlayDone;
+ }
+
+ realdelta = false;
+ }
+ else if (DemoMode == demo_PlayDone)
+ Quit("Demo playback exceeded");
+ else
+ {
+ switch (type = Controls[player])
+ {
+ case ctrl_Keyboard:
+ def = &KbdDefs;
+
+ if (Keyboard[def->upleft])
+ mx = motion_Left,my = motion_Up;
+ else if (Keyboard[def->upright])
+ mx = motion_Right,my = motion_Up;
+ else if (Keyboard[def->downleft])
+ mx = motion_Left,my = motion_Down;
+ else if (Keyboard[def->downright])
+ mx = motion_Right,my = motion_Down;
+
+ if (Keyboard[def->up])
+ my = motion_Up;
+ else if (Keyboard[def->down])
+ my = motion_Down;
+
+ if (Keyboard[def->left])
+ mx = motion_Left;
+ else if (Keyboard[def->right])
+ mx = motion_Right;
+
+ if (Keyboard[def->button0])
+ buttons += 1 << 0;
+ if (Keyboard[def->button1])
+ buttons += 1 << 1;
+ realdelta = false;
+ break;
+ case ctrl_Joystick1:
+ case ctrl_Joystick2:
+ INL_GetJoyDelta(type - ctrl_Joystick,&dx,&dy);
+ buttons = INL_GetJoyButtons(type - ctrl_Joystick);
+ realdelta = true;
+ break;
+ case ctrl_Mouse:
+ INL_GetMouseDelta(&dx,&dy);
+ buttons = INL_GetMouseButtons();
+ realdelta = true;
+ break;
+ }
+ }
+
+ if (realdelta)
+ {
+ mx = (dx < 0)? motion_Left : ((dx > 0)? motion_Right : motion_None);
+ my = (dy < 0)? motion_Up : ((dy > 0)? motion_Down : motion_None);
+ }
+ else
+ {
+ dx = mx * 127;
+ dy = my * 127;
+ }
+
+ info->x = dx;
+ info->xaxis = mx;
+ info->y = dy;
+ info->yaxis = my;
+ info->button0 = buttons & (1 << 0);
+ info->button1 = buttons & (1 << 1);
+ info->button2 = buttons & (1 << 2);
+ info->button3 = buttons & (1 << 3);
+ info->dir = DirTable[((my + 1) * 3) + (mx + 1)];
+
+ if (DemoMode == demo_Record)
+ {
+ // Pack the control info into a byte
+ dbyte = (buttons << 4) | ((mx + 1) << 2) | (my + 1);
+
+ if
+ (
+ (DemoBuffer[DemoOffset + 1] == dbyte)
+ && (DemoBuffer[DemoOffset] < 255)
+ )
+ (DemoBuffer[DemoOffset])++;
+ else
+ {
+ if (DemoOffset || DemoBuffer[DemoOffset])
+ DemoOffset += 2;
+
+ if (DemoOffset >= DemoSize)
+ Quit("Demo buffer overflow");
+
+ DemoBuffer[DemoOffset] = 1;
+ DemoBuffer[DemoOffset + 1] = dbyte;
+ }
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// IN_SetControlType() - Sets the control type to be used by the specified
+// player
+//
+///////////////////////////////////////////////////////////////////////////
+void
+IN_SetControlType(int player,ControlType type)
+{
+ // DEBUG - check that requested type is present?
+ Controls[player] = type;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// IN_WaitForKey() - Waits for a scan code, then clears LastScan and
+// returns the scan code
+//
+///////////////////////////////////////////////////////////////////////////
+ScanCode
+IN_WaitForKey(void)
+{
+ ScanCode result;
+
+ while (!(result = LastScan))
+ ;
+ LastScan = 0;
+ return(result);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// IN_WaitForASCII() - Waits for an ASCII char, then clears LastASCII and
+// returns the ASCII value
+//
+///////////////////////////////////////////////////////////////////////////
+char
+IN_WaitForASCII(void)
+{
+ char result;
+
+ while (!(result = LastASCII))
+ ;
+ LastASCII = '\0';
+ return(result);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// IN_Ack() - waits for a button or key press. If a button is down, upon
+// calling, it must be released for it to be recognized
+//
+///////////////////////////////////////////////////////////////////////////
+
+boolean btnstate[8];
+
+void IN_StartAck(void)
+{
+ unsigned i,buttons;
+
+//
+// get initial state of everything
+//
+ IN_ClearKeysDown();
+ memset (btnstate,0,sizeof(btnstate));
+
+ buttons = IN_JoyButtons () << 4;
+ if (MousePresent)
+ buttons |= IN_MouseButtons ();
+
+ for (i=0;i<8;i++,buttons>>=1)
+ if (buttons&1)
+ btnstate[i] = true;
+}
+
+
+boolean IN_CheckAck (void)
+{
+ unsigned i,buttons;
+
+//
+// see if something has been pressed
+//
+ if (LastScan)
+ return true;
+
+ buttons = IN_JoyButtons () << 4;
+ if (MousePresent)
+ buttons |= IN_MouseButtons ();
+
+ for (i=0;i<8;i++,buttons>>=1)
+ if ( buttons&1 )
+ {
+ if (!btnstate[i])
+ return true;
+ }
+ else
+ btnstate[i]=false;
+
+ return false;
+}
+
+
+void IN_Ack (void)
+{
+ IN_StartAck ();
+
+ while (!IN_CheckAck ())
+ ;
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+//
+// IN_UserInput() - Waits for the specified delay time (in ticks) or the
+// user pressing a key or a mouse button. If the clear flag is set, it
+// then either clears the key or waits for the user to let the mouse
+// button up.
+//
+///////////////////////////////////////////////////////////////////////////
+boolean IN_UserInput(longword delay)
+{
+ longword lasttime;
+
+ lasttime = TimeCount;
+ IN_StartAck ();
+ do
+ {
+ if (IN_CheckAck())
+ return true;
+ } while (TimeCount - lasttime < delay);
+ return(false);
+}
+
+//===========================================================================
+
+/*
+===================
+=
+= IN_MouseButtons
+=
+===================
+*/
+
+byte IN_MouseButtons (void)
+{
+ if (MousePresent)
+ {
+ Mouse(MButtons);
+ return _BX;
+ }
+ else
+ return 0;
+}
+
+
+/*
+===================
+=
+= IN_JoyButtons
+=
+===================
+*/
+
+byte IN_JoyButtons (void)
+{
+ unsigned joybits;
+
+ joybits = inportb(0x201); // Get all the joystick buttons
+ joybits >>= 4; // only the high bits are useful
+ joybits ^= 15; // return with 1=pressed
+
+ return joybits;
+}
+
+
--- /dev/null
+++ b/in.h
@@ -1,0 +1,202 @@
+//
+// ID Engine
+// ID_IN.h - Header file for Input Manager
+// v1.0d1
+// By Jason Blochowiak
+//
+
+#ifndef __ID_IN__
+#define __ID_IN__
+
+#ifdef __DEBUG__
+#define __DEBUG_InputMgr__
+#endif
+
+#define MaxPlayers 4
+#define MaxKbds 2
+#define MaxJoys 2
+#define NumCodes 128
+
+typedef byte ScanCode;
+#define sc_None 0
+#define sc_Bad 0xff
+#define sc_Return 0x1c
+#define sc_Enter sc_Return
+#define sc_Escape 0x01
+#define sc_Space 0x39
+#define sc_BackSpace 0x0e
+#define sc_Tab 0x0f
+#define sc_Alt 0x38
+#define sc_Control 0x1d
+#define sc_CapsLock 0x3a
+#define sc_LShift 0x2a
+#define sc_RShift 0x36
+#define sc_UpArrow 0x48
+#define sc_DownArrow 0x50
+#define sc_LeftArrow 0x4b
+#define sc_RightArrow 0x4d
+#define sc_Insert 0x52
+#define sc_Delete 0x53
+#define sc_Home 0x47
+#define sc_End 0x4f
+#define sc_PgUp 0x49
+#define sc_PgDn 0x51
+#define sc_F1 0x3b
+#define sc_F2 0x3c
+#define sc_F3 0x3d
+#define sc_F4 0x3e
+#define sc_F5 0x3f
+#define sc_F6 0x40
+#define sc_F7 0x41
+#define sc_F8 0x42
+#define sc_F9 0x43
+#define sc_F10 0x44
+#define sc_F11 0x57
+#define sc_F12 0x59
+
+#define sc_1 0x02
+#define sc_2 0x03
+#define sc_3 0x04
+#define sc_4 0x05
+#define sc_5 0x06
+#define sc_6 0x07
+#define sc_7 0x08
+#define sc_8 0x09
+#define sc_9 0x0a
+#define sc_0 0x0b
+
+#define sc_A 0x1e
+#define sc_B 0x30
+#define sc_C 0x2e
+#define sc_D 0x20
+#define sc_E 0x12
+#define sc_F 0x21
+#define sc_G 0x22
+#define sc_H 0x23
+#define sc_I 0x17
+#define sc_J 0x24
+#define sc_K 0x25
+#define sc_L 0x26
+#define sc_M 0x32
+#define sc_N 0x31
+#define sc_O 0x18
+#define sc_P 0x19
+#define sc_Q 0x10
+#define sc_R 0x13
+#define sc_S 0x1f
+#define sc_T 0x14
+#define sc_U 0x16
+#define sc_V 0x2f
+#define sc_W 0x11
+#define sc_X 0x2d
+#define sc_Y 0x15
+#define sc_Z 0x2c
+
+#define key_None 0
+#define key_Return 0x0d
+#define key_Enter key_Return
+#define key_Escape 0x1b
+#define key_Space 0x20
+#define key_BackSpace 0x08
+#define key_Tab 0x09
+#define key_Delete 0x7f
+
+// Stuff for the mouse
+#define MReset 0
+#define MButtons 3
+#define MDelta 11
+
+#define MouseInt 0x33
+#define Mouse(x) _AX = x,geninterrupt(MouseInt)
+
+typedef enum {
+ demo_Off,demo_Record,demo_Playback,demo_PlayDone
+ } Demo;
+typedef enum {
+ ctrl_Keyboard,
+ ctrl_Keyboard1 = ctrl_Keyboard,ctrl_Keyboard2,
+ ctrl_Joystick,
+ ctrl_Joystick1 = ctrl_Joystick,ctrl_Joystick2,
+ ctrl_Mouse
+ } ControlType;
+typedef enum {
+ motion_Left = -1,motion_Up = -1,
+ motion_None = 0,
+ motion_Right = 1,motion_Down = 1
+ } Motion;
+typedef enum {
+ dir_North,dir_NorthEast,
+ dir_East,dir_SouthEast,
+ dir_South,dir_SouthWest,
+ dir_West,dir_NorthWest,
+ dir_None
+ } Direction;
+typedef struct {
+ boolean button0,button1,button2,button3;
+ int x,y;
+ Motion xaxis,yaxis;
+ Direction dir;
+ } CursorInfo;
+typedef CursorInfo ControlInfo;
+typedef struct {
+ ScanCode button0,button1,
+ upleft, up, upright,
+ left, right,
+ downleft, down, downright;
+ } KeyboardDef;
+typedef struct {
+ word joyMinX,joyMinY,
+ threshMinX,threshMinY,
+ threshMaxX,threshMaxY,
+ joyMaxX,joyMaxY,
+ joyMultXL,joyMultYL,
+ joyMultXH,joyMultYH;
+ } JoystickDef;
+// Global variables
+extern boolean Keyboard[],
+ MousePresent,
+ JoysPresent[];
+extern boolean Paused;
+extern char LastASCII;
+extern ScanCode LastScan;
+extern KeyboardDef KbdDefs;
+extern JoystickDef JoyDefs[];
+extern ControlType Controls[MaxPlayers];
+
+extern Demo DemoMode;
+extern byte _seg *DemoBuffer;
+extern word DemoOffset,DemoSize;
+
+// Function prototypes
+#define IN_KeyDown(code) (Keyboard[(code)])
+#define IN_ClearKey(code) {Keyboard[code] = false;\
+ if (code == LastScan) LastScan = sc_None;}
+
+// DEBUG - put names in prototypes
+extern void IN_Startup(void),IN_Shutdown(void),
+ IN_Default(boolean gotit,ControlType in),
+ IN_SetKeyHook(void (*)()),
+ IN_ClearKeysDown(void),
+ IN_ReadCursor(CursorInfo *),
+ IN_ReadControl(int,ControlInfo *),
+ IN_SetControlType(int,ControlType),
+ IN_GetJoyAbs(word joy,word *xp,word *yp),
+ IN_SetupJoy(word joy,word minx,word maxx,
+ word miny,word maxy),
+ IN_StopDemo(void),IN_FreeDemoBuffer(void),
+ IN_Ack(void),IN_AckBack(void);
+extern boolean IN_UserInput(longword delay);
+extern char IN_WaitForASCII(void);
+extern ScanCode IN_WaitForKey(void);
+extern word IN_GetJoyButtonsDB(word joy);
+extern byte *IN_GetScanName(ScanCode);
+
+
+byte IN_MouseButtons (void);
+byte IN_JoyButtons (void);
+
+void INL_GetJoyDelta(word joy,int *dx,int *dy);
+void IN_StartAck(void);
+boolean IN_CheckAck (void);
+
+#endif
--- /dev/null
+++ b/inter.c
@@ -1,0 +1,1718 @@
+// WL_INTER.C
+
+#include "WL_DEF.H"
+#pragma hdrstop
+
+
+//==========================================================================
+
+/*
+==================
+=
+= CLearSplitVWB
+=
+==================
+*/
+
+void ClearSplitVWB (void)
+{
+ memset (update,0,sizeof(update));
+ WindowX = 0;
+ WindowY = 0;
+ WindowW = 320;
+ WindowH = 160;
+}
+
+
+//==========================================================================
+
+#ifdef SPEAR
+#ifndef SPEARDEMO
+////////////////////////////////////////////////////////
+//
+// End of Spear of Destiny
+//
+////////////////////////////////////////////////////////
+
+void EndScreen (int palette, int screen)
+{
+ CA_CacheScreen (screen);
+ VW_UpdateScreen ();
+ CA_CacheGrChunk (palette);
+ VL_FadeIn(0,255,grsegs[palette],30);
+ UNCACHEGRCHUNK (palette);
+ IN_ClearKeysDown ();
+ IN_Ack ();
+ VW_FadeOut ();
+}
+
+
+void EndSpear(void)
+{
+ EndScreen (END1PALETTE, ENDSCREEN11PIC);
+
+ CA_CacheScreen (ENDSCREEN3PIC);
+ VW_UpdateScreen ();
+ CA_CacheGrChunk (END3PALETTE);
+ VL_FadeIn(0,255,grsegs[END3PALETTE],30);
+ UNCACHEGRCHUNK (END3PALETTE);
+ fontnumber = 0;
+ fontcolor = 0xd0;
+ WindowX = 0;
+ WindowW = 320;
+ PrintX = 0;
+ PrintY = 180;
+ US_CPrint (STR_ENDGAME1"\n");
+ US_CPrint (STR_ENDGAME2);
+ VW_UpdateScreen ();
+ IN_StartAck ();
+ TimeCount = 0;
+ while (!IN_CheckAck () && TimeCount < 700);
+
+ PrintX = 0;
+ PrintY = 180;
+ VWB_Bar(0,180,320,20,0);
+ US_CPrint (STR_ENDGAME3"\n");
+ US_CPrint (STR_ENDGAME4);
+ VW_UpdateScreen ();
+ IN_StartAck ();
+ TimeCount = 0;
+ while (!IN_CheckAck () && TimeCount < 700);
+
+ VW_FadeOut ();
+
+ EndScreen (END4PALETTE, ENDSCREEN4PIC);
+ EndScreen (END5PALETTE, ENDSCREEN5PIC);
+ EndScreen (END6PALETTE, ENDSCREEN6PIC);
+ EndScreen (END7PALETTE, ENDSCREEN7PIC);
+ EndScreen (END8PALETTE, ENDSCREEN8PIC);
+ EndScreen (END9PALETTE, ENDSCREEN9PIC);
+
+ EndScreen (END2PALETTE, ENDSCREEN12PIC);
+
+ MainMenu[savegame].active = 0;
+}
+#endif
+#endif
+
+//==========================================================================
+
+/*
+==================
+=
+= Victory
+=
+==================
+*/
+
+void Victory (void)
+{
+#ifndef SPEARDEMO
+ long sec;
+ int i,min,kr,sr,tr,x;
+ char tempstr[8];
+
+#define RATIOX 6
+#define RATIOY 14
+#define TIMEX 14
+#define TIMEY 8
+
+
+#ifdef SPEAR
+ StartCPMusic (XTHEEND_MUS);
+
+ CA_CacheGrChunk(BJCOLLAPSE1PIC);
+ CA_CacheGrChunk(BJCOLLAPSE2PIC);
+ CA_CacheGrChunk(BJCOLLAPSE3PIC);
+ CA_CacheGrChunk(BJCOLLAPSE4PIC);
+
+ VWB_Bar(0,0,320,200,VIEWCOLOR);
+ VWB_DrawPic (124,44,BJCOLLAPSE1PIC);
+ VW_UpdateScreen ();
+ VW_FadeIn ();
+ VW_WaitVBL(2*70);
+ VWB_DrawPic (124,44,BJCOLLAPSE2PIC);
+ VW_UpdateScreen ();
+ VW_WaitVBL(105);
+ VWB_DrawPic (124,44,BJCOLLAPSE3PIC);
+ VW_UpdateScreen ();
+ VW_WaitVBL(105);
+ VWB_DrawPic (124,44,BJCOLLAPSE4PIC);
+ VW_UpdateScreen ();
+ VW_WaitVBL(3*70);
+
+ UNCACHEGRCHUNK(BJCOLLAPSE1PIC);
+ UNCACHEGRCHUNK(BJCOLLAPSE2PIC);
+ UNCACHEGRCHUNK(BJCOLLAPSE3PIC);
+ UNCACHEGRCHUNK(BJCOLLAPSE4PIC);
+ VL_FadeOut (0,255,0,17,17,5);
+#endif
+
+ StartCPMusic (URAHERO_MUS);
+ ClearSplitVWB ();
+ CacheLump(LEVELEND_LUMP_START,LEVELEND_LUMP_END);
+ CA_CacheGrChunk(STARTFONT);
+
+#ifndef SPEAR
+ CA_CacheGrChunk(C_TIMECODEPIC);
+#endif
+
+
+ VWB_Bar (0,0,320,200-STATUSLINES,127);
+#ifdef JAPAN
+#ifndef JAPDEMO
+ CA_CacheGrChunk(C_ENDRATIOSPIC);
+ VWB_DrawPic(0,0,C_ENDRATIOSPIC);
+ UNCACHEGRCHUNK(C_ENDRATIOSPIC);
+#endif
+#else
+ Write(18,2,STR_YOUWIN);
+
+ Write(TIMEX,TIMEY-2,STR_TOTALTIME);
+
+ Write(12,RATIOY-2,"averages");
+
+ #ifdef SPANISH
+ Write(RATIOX+2, RATIOY, STR_RATKILL);
+ Write(RATIOX+2, RATIOY+2, STR_RATSECRET);
+ Write(RATIOX+2, RATIOY+4,STR_RATTREASURE);
+ #else
+ Write(RATIOX+8,RATIOY, STR_RATKILL);
+ Write(RATIOX+4,RATIOY+2, STR_RATSECRET);
+ Write(RATIOX, RATIOY+4,STR_RATTREASURE);
+ #endif
+
+#endif
+
+#ifndef JAPDEMO
+ VWB_DrawPic (8,4,L_BJWINSPIC);
+#endif
+
+
+#ifndef SPEAR
+ for (kr = sr = tr = sec = i = 0;i < 8;i++)
+#else
+ for (kr = sr = tr = sec = i = 0;i < 20;i++)
+#endif
+ {
+ sec += LevelRatios[i].time;
+ kr += LevelRatios[i].kill;
+ sr += LevelRatios[i].secret;
+ tr += LevelRatios[i].treasure;
+ }
+
+#ifndef SPEAR
+ kr /= 8;
+ sr /= 8;
+ tr /= 8;
+#else
+ kr /= 14;
+ sr /= 14;
+ tr /= 14;
+#endif
+
+ min = sec/60;
+ sec %= 60;
+
+ if (min > 99)
+ min = sec = 99;
+
+ i = TIMEX*8+1;
+ VWB_DrawPic(i,TIMEY*8,L_NUM0PIC+(min/10));
+ i += 2*8;
+ VWB_DrawPic(i,TIMEY*8,L_NUM0PIC+(min%10));
+ i += 2*8;
+ Write(i/8,TIMEY,":");
+ i += 1*8;
+ VWB_DrawPic(i,TIMEY*8,L_NUM0PIC+(sec/10));
+ i += 2*8;
+ VWB_DrawPic(i,TIMEY*8,L_NUM0PIC+(sec%10));
+ VW_UpdateScreen ();
+
+ itoa(kr,tempstr,10);
+ x=RATIOX+24-strlen(tempstr)*2;
+ Write(x,RATIOY,tempstr);
+
+ itoa(sr,tempstr,10);
+ x=RATIOX+24-strlen(tempstr)*2;
+ Write(x,RATIOY+2,tempstr);
+
+ itoa(tr,tempstr,10);
+ x=RATIOX+24-strlen(tempstr)*2;
+ Write(x,RATIOY+4,tempstr);
+
+
+#ifndef SPANISH
+#ifndef UPLOAD
+#ifndef SPEAR
+ //
+ // TOTAL TIME VERIFICATION CODE
+ //
+ if (gamestate.difficulty>=gd_medium)
+ {
+ VWB_DrawPic (30*8,TIMEY*8,C_TIMECODEPIC);
+ fontnumber = 0;
+ fontcolor = READHCOLOR;
+ PrintX = 30*8-3;
+ PrintY = TIMEY*8+8;
+ PrintX+=4;
+ tempstr[0] = (((min/10)^(min%10))^0xa)+'A';
+ tempstr[1] = (((sec/10)^(sec%10))^0xa)+'A';
+ tempstr[2] = (tempstr[0]^tempstr[1])+'A';
+ tempstr[3] = 0;
+ US_Print(tempstr);
+ }
+#endif
+#endif
+#endif
+
+
+ fontnumber = 1;
+
+ VW_UpdateScreen ();
+ VW_FadeIn ();
+
+ IN_Ack();
+
+ #ifndef SPEAR
+ if (Keyboard[sc_P] && MS_CheckParm("goobers"))
+ PicturePause();
+ #endif
+
+ VW_FadeOut ();
+
+#ifndef SPEAR
+ UNCACHEGRCHUNK(C_TIMECODEPIC);
+#endif
+ UnCacheLump(LEVELEND_LUMP_START,LEVELEND_LUMP_END);
+
+#ifndef SPEAR
+ EndText();
+#else
+ EndSpear();
+#endif
+
+#endif // SPEARDEMO
+}
+
+
+//==========================================================================
+
+#ifndef JAPAN
+/*
+==================
+=
+= PG13
+=
+==================
+*/
+
+void PG13 (void)
+{
+ VW_FadeOut();
+ VWB_Bar(0,0,320,200,0x82); // background
+
+ CA_CacheGrChunk (PG13PIC);
+ VWB_DrawPic (216,110,PG13PIC);
+ VW_UpdateScreen ();
+
+ UNCACHEGRCHUNK (PG13PIC);
+
+ VW_FadeIn();
+ IN_UserInput(TickBase*7);
+
+ VW_FadeOut ();
+}
+#endif
+
+
+//==========================================================================
+
+void Write(int x,int y,char *string)
+{
+ int alpha[]={L_NUM0PIC,L_NUM1PIC,L_NUM2PIC,L_NUM3PIC,L_NUM4PIC,L_NUM5PIC,
+ L_NUM6PIC,L_NUM7PIC,L_NUM8PIC,L_NUM9PIC,L_COLONPIC,0,0,0,0,0,0,L_APIC,L_BPIC,
+ L_CPIC,L_DPIC,L_EPIC,L_FPIC,L_GPIC,L_HPIC,L_IPIC,L_JPIC,L_KPIC,
+ L_LPIC,L_MPIC,L_NPIC,L_OPIC,L_PPIC,L_QPIC,L_RPIC,L_SPIC,L_TPIC,
+ L_UPIC,L_VPIC,L_WPIC,L_XPIC,L_YPIC,L_ZPIC};
+
+ int i,ox,nx,ny;
+ char ch;
+
+
+ ox=nx=x*8;
+ ny=y*8;
+ for (i=0;i<strlen(string);i++)
+ if (string[i]=='\n')
+ {
+ nx=ox;
+ ny+=16;
+ }
+ else
+ {
+ ch=string[i];
+ if (ch>='a')
+ ch-=('a'-'A');
+ ch-='0';
+
+ switch(string[i])
+ {
+ case '!':
+ VWB_DrawPic(nx,ny,L_EXPOINTPIC);
+ nx+=8;
+ continue;
+
+ case '\'':
+ VWB_DrawPic(nx,ny,L_APOSTROPHEPIC);
+ nx+=8;
+ continue;
+
+ case ' ': break;
+ case 0x3a: // ':'
+
+ VWB_DrawPic(nx,ny,L_COLONPIC);
+ nx+=8;
+ continue;
+
+ case '%':
+ VWB_DrawPic(nx,ny,L_PERCENTPIC);
+ break;
+
+ default:
+ VWB_DrawPic(nx,ny,alpha[ch]);
+ }
+ nx+=16;
+ }
+}
+
+
+//
+// Breathe Mr. BJ!!!
+//
+void BJ_Breathe(void)
+{
+ static int which=0,max=10;
+ int pics[2]={L_GUYPIC,L_GUY2PIC};
+
+
+ if (TimeCount>max)
+ {
+ which^=1;
+ VWB_DrawPic(0,16,pics[which]);
+ VW_UpdateScreen();
+ TimeCount=0;
+ max=35;
+ }
+}
+
+
+
+/*
+==================
+=
+= LevelCompleted
+=
+= Entered with the screen faded out
+= Still in split screen mode with the status bar
+=
+= Exit with the screen faded out
+=
+==================
+*/
+
+#ifndef SPEAR
+LRstruct LevelRatios[8];
+#else
+LRstruct LevelRatios[20];
+#endif
+
+void LevelCompleted (void)
+{
+ #define VBLWAIT 30
+ #define PAR_AMOUNT 500
+ #define PERCENT100AMT 10000
+ typedef struct {
+ float time;
+ char timestr[6];
+ } times;
+
+ int x,i,min,sec,ratio,kr,sr,tr;
+ unsigned temp;
+ char tempstr[10];
+ long bonus,timeleft=0;
+ times parTimes[]=
+ {
+#ifndef SPEAR
+ //
+ // Episode One Par Times
+ //
+ {1.5, "01:30"},
+ {2, "02:00"},
+ {2, "02:00"},
+ {3.5, "03:30"},
+ {3, "03:00"},
+ {3, "03:00"},
+ {2.5, "02:30"},
+ {2.5, "02:30"},
+ {0, "??:??"}, // Boss level
+ {0, "??:??"}, // Secret level
+
+ //
+ // Episode Two Par Times
+ //
+ {1.5, "01:30"},
+ {3.5, "03:30"},
+ {3, "03:00"},
+ {2, "02:00"},
+ {4, "04:00"},
+ {6, "06:00"},
+ {1, "01:00"},
+ {3, "03:00"},
+ {0, "??:??"},
+ {0, "??:??"},
+
+ //
+ // Episode Three Par Times
+ //
+ {1.5, "01:30"},
+ {1.5, "01:30"},
+ {2.5, "02:30"},
+ {2.5, "02:30"},
+ {3.5, "03:30"},
+ {2.5, "02:30"},
+ {2, "02:00"},
+ {6, "06:00"},
+ {0, "??:??"},
+ {0, "??:??"},
+
+ //
+ // Episode Four Par Times
+ //
+ {2, "02:00"},
+ {2, "02:00"},
+ {1.5, "01:30"},
+ {1, "01:00"},
+ {4.5, "04:30"},
+ {3.5, "03:30"},
+ {2, "02:00"},
+ {4.5, "04:30"},
+ {0, "??:??"},
+ {0, "??:??"},
+
+ //
+ // Episode Five Par Times
+ //
+ {2.5, "02:30"},
+ {1.5, "01:30"},
+ {2.5, "02:30"},
+ {2.5, "02:30"},
+ {4, "04:00"},
+ {3, "03:00"},
+ {4.5, "04:30"},
+ {3.5, "03:30"},
+ {0, "??:??"},
+ {0, "??:??"},
+
+ //
+ // Episode Six Par Times
+ //
+ {6.5, "06:30"},
+ {4, "04:00"},
+ {4.5, "04:30"},
+ {6, "06:00"},
+ {5, "05:00"},
+ {5.5, "05:30"},
+ {5.5, "05:30"},
+ {8.5, "08:30"},
+ {0, "??:??"},
+ {0, "??:??"}
+#else
+ //
+ // SPEAR OF DESTINY TIMES
+ //
+ {1.5, "01:30"},
+ {3.5, "03:30"},
+ {2.75, "02:45"},
+ {3.5, "03:30"},
+ {0, "??:??"}, // Boss 1
+ {4.5, "04:30"},
+ {3.25, "03:15"},
+ {2.75, "02:45"},
+ {4.75, "04:45"},
+ {0, "??:??"}, // Boss 2
+ {6.5, "06:30"},
+ {4.5, "04:30"},
+ {2.75, "02:45"},
+ {4.5, "04:30"},
+ {6, "06:00"},
+ {0, "??:??"}, // Boss 3
+ {6, "06:00"},
+ {0, "??:??"}, // Boss 4
+ {0, "??:??"}, // Secret level 1
+ {0, "??:??"}, // Secret level 2
+#endif
+ };
+
+
+
+ CacheLump(LEVELEND_LUMP_START,LEVELEND_LUMP_END);
+ ClearSplitVWB (); // set up for double buffering in split screen
+ VWB_Bar (0,0,320,200-STATUSLINES,127);
+ StartCPMusic(ENDLEVEL_MUS);
+
+//
+// do the intermission
+//
+ IN_ClearKeysDown();
+ IN_StartAck();
+
+#ifdef JAPAN
+ CA_CacheGrChunk(C_INTERMISSIONPIC);
+ VWB_DrawPic(0,0,C_INTERMISSIONPIC);
+ UNCACHEGRCHUNK(C_INTERMISSIONPIC);
+#endif
+ VWB_DrawPic(0,16,L_GUYPIC);
+
+#ifndef SPEAR
+ if (mapon<8)
+#else
+ if (mapon != 4 &&
+ mapon != 9 &&
+ mapon != 15 &&
+ mapon < 17)
+#endif
+ {
+#ifndef JAPAN
+ #ifdef SPANISH
+ Write(14,2,"piso\ncompletado");
+ #else
+ Write(14,2,"floor\ncompleted");
+ #endif
+
+ Write(14,7,STR_BONUS" 0");
+ Write(16,10,STR_TIME);
+ Write(16,12,STR_PAR);
+
+ #ifdef SPANISH
+ Write(11,14, STR_RAT2KILL);
+ Write(11,16, STR_RAT2SECRET);
+ Write(11,18,STR_RAT2TREASURE);
+ #else
+ Write(9,14, STR_RAT2KILL);
+ Write(5,16, STR_RAT2SECRET);
+ Write(1,18,STR_RAT2TREASURE);
+ #endif
+
+ Write(26,2,itoa(gamestate.mapon+1,tempstr,10));
+#endif
+
+ #ifdef SPANISH
+ Write(30,12,parTimes[gamestate.episode*10+mapon].timestr);
+ #else
+ Write(26,12,parTimes[gamestate.episode*10+mapon].timestr);
+ #endif
+
+ //
+ // PRINT TIME
+ //
+ sec=gamestate.TimeCount/70;
+
+ if (sec > 99*60) // 99 minutes max
+ sec = 99*60;
+
+ if (gamestate.TimeCount<parTimes[gamestate.episode*10+mapon].time*4200)
+ timeleft=(parTimes[gamestate.episode*10+mapon].time*4200)/70-sec;
+
+ min=sec/60;
+ sec%=60;
+
+ #ifdef SPANISH
+ i=30*8;
+ #else
+ i=26*8;
+ #endif
+ VWB_DrawPic(i,10*8,L_NUM0PIC+(min/10));
+ i+=2*8;
+ VWB_DrawPic(i,10*8,L_NUM0PIC+(min%10));
+ i+=2*8;
+ Write(i/8,10,":");
+ i+=1*8;
+ VWB_DrawPic(i,10*8,L_NUM0PIC+(sec/10));
+ i+=2*8;
+ VWB_DrawPic(i,10*8,L_NUM0PIC+(sec%10));
+
+ VW_UpdateScreen ();
+ VW_FadeIn ();
+
+
+ //
+ // FIGURE RATIOS OUT BEFOREHAND
+ //
+ kr = sr = tr = 0;
+ if (gamestate.killtotal)
+ kr=(gamestate.killcount*100)/gamestate.killtotal;
+ if (gamestate.secrettotal)
+ sr=(gamestate.secretcount*100)/gamestate.secrettotal;
+ if (gamestate.treasuretotal)
+ tr=(gamestate.treasurecount*100)/gamestate.treasuretotal;
+
+
+ //
+ // PRINT TIME BONUS
+ //
+ bonus=timeleft*PAR_AMOUNT;
+ if (bonus)
+ {
+ for (i=0;i<=timeleft;i++)
+ {
+ ltoa((long)i*PAR_AMOUNT,tempstr,10);
+ x=36-strlen(tempstr)*2;
+ Write(x,7,tempstr);
+ if (!(i%(PAR_AMOUNT/10)))
+ SD_PlaySound(ENDBONUS1SND);
+ VW_UpdateScreen();
+ while(SD_SoundPlaying())
+ BJ_Breathe();
+ if (IN_CheckAck())
+ goto done;
+ }
+
+ VW_UpdateScreen();
+ SD_PlaySound(ENDBONUS2SND);
+ while(SD_SoundPlaying())
+ BJ_Breathe();
+ }
+
+
+ #ifdef SPANISH
+ #define RATIOXX 33
+ #else
+ #define RATIOXX 37
+ #endif
+ //
+ // KILL RATIO
+ //
+ ratio=kr;
+ for (i=0;i<=ratio;i++)
+ {
+ itoa(i,tempstr,10);
+ x=RATIOXX-strlen(tempstr)*2;
+ Write(x,14,tempstr);
+ if (!(i%10))
+ SD_PlaySound(ENDBONUS1SND);
+ VW_UpdateScreen ();
+ while(SD_SoundPlaying())
+ BJ_Breathe();
+
+ if (IN_CheckAck())
+ goto done;
+ }
+ if (ratio==100)
+ {
+ VW_WaitVBL(VBLWAIT);
+ SD_StopSound();
+ bonus+=PERCENT100AMT;
+ ltoa(bonus,tempstr,10);
+ x=(RATIOXX-1)-strlen(tempstr)*2;
+ Write(x,7,tempstr);
+ VW_UpdateScreen();
+ SD_PlaySound(PERCENT100SND);
+ }
+ else
+ if (!ratio)
+ {
+ VW_WaitVBL(VBLWAIT);
+ SD_StopSound();
+ SD_PlaySound(NOBONUSSND);
+ }
+ else
+ SD_PlaySound(ENDBONUS2SND);
+
+ VW_UpdateScreen();
+ while(SD_SoundPlaying())
+ BJ_Breathe();
+
+
+ //
+ // SECRET RATIO
+ //
+ ratio=sr;
+ for (i=0;i<=ratio;i++)
+ {
+ itoa(i,tempstr,10);
+ x=RATIOXX-strlen(tempstr)*2;
+ Write(x,16,tempstr);
+ if (!(i%10))
+ SD_PlaySound(ENDBONUS1SND);
+ VW_UpdateScreen ();
+ while(SD_SoundPlaying())
+ BJ_Breathe();
+ BJ_Breathe();
+
+ if (IN_CheckAck())
+ goto done;
+ }
+ if (ratio==100)
+ {
+ VW_WaitVBL(VBLWAIT);
+ SD_StopSound();
+ bonus+=PERCENT100AMT;
+ ltoa(bonus,tempstr,10);
+ x=(RATIOXX-1)-strlen(tempstr)*2;
+ Write(x,7,tempstr);
+ VW_UpdateScreen();
+ SD_PlaySound(PERCENT100SND);
+ }
+ else
+ if (!ratio)
+ {
+ VW_WaitVBL(VBLWAIT);
+ SD_StopSound();
+ SD_PlaySound(NOBONUSSND);
+ }
+ else
+ SD_PlaySound(ENDBONUS2SND);
+ VW_UpdateScreen();
+ while(SD_SoundPlaying())
+ BJ_Breathe();
+
+
+ //
+ // TREASURE RATIO
+ //
+ ratio=tr;
+ for (i=0;i<=ratio;i++)
+ {
+ itoa(i,tempstr,10);
+ x=RATIOXX-strlen(tempstr)*2;
+ Write(x,18,tempstr);
+ if (!(i%10))
+ SD_PlaySound(ENDBONUS1SND);
+ VW_UpdateScreen ();
+ while(SD_SoundPlaying())
+ BJ_Breathe();
+ if (IN_CheckAck())
+ goto done;
+ }
+ if (ratio==100)
+ {
+ VW_WaitVBL(VBLWAIT);
+ SD_StopSound();
+ bonus+=PERCENT100AMT;
+ ltoa(bonus,tempstr,10);
+ x=(RATIOXX-1)-strlen(tempstr)*2;
+ Write(x,7,tempstr);
+ VW_UpdateScreen();
+ SD_PlaySound(PERCENT100SND);
+ }
+ else
+ if (!ratio)
+ {
+ VW_WaitVBL(VBLWAIT);
+ SD_StopSound();
+ SD_PlaySound(NOBONUSSND);
+ }
+ else
+ SD_PlaySound(ENDBONUS2SND);
+ VW_UpdateScreen();
+ while(SD_SoundPlaying())
+ BJ_Breathe();
+
+
+ //
+ // JUMP STRAIGHT HERE IF KEY PRESSED
+ //
+ done:
+
+ itoa(kr,tempstr,10);
+ x=RATIOXX-strlen(tempstr)*2;
+ Write(x,14,tempstr);
+
+ itoa(sr,tempstr,10);
+ x=RATIOXX-strlen(tempstr)*2;
+ Write(x,16,tempstr);
+
+ itoa(tr,tempstr,10);
+ x=RATIOXX-strlen(tempstr)*2;
+ Write(x,18,tempstr);
+
+ bonus=(long)timeleft*PAR_AMOUNT+
+ (PERCENT100AMT*(kr==100))+
+ (PERCENT100AMT*(sr==100))+
+ (PERCENT100AMT*(tr==100));
+
+ GivePoints(bonus);
+ ltoa(bonus,tempstr,10);
+ x=36-strlen(tempstr)*2;
+ Write(x,7,tempstr);
+
+ //
+ // SAVE RATIO INFORMATION FOR ENDGAME
+ //
+ LevelRatios[mapon].kill=kr;
+ LevelRatios[mapon].secret=sr;
+ LevelRatios[mapon].treasure=tr;
+ LevelRatios[mapon].time=min*60+sec;
+ }
+ else
+ {
+#ifdef SPEAR
+#ifndef SPEARDEMO
+ switch(mapon)
+ {
+ case 4: Write(14,4," trans\n"
+ " grosse\n"
+ STR_DEFEATED); break;
+ case 9: Write(14,4,"barnacle\n"
+ "wilhelm\n"
+ STR_DEFEATED); break;
+ case 15: Write(14,4,"ubermutant\n"
+ STR_DEFEATED); break;
+ case 17: Write(14,4," death\n"
+ " knight\n"
+ STR_DEFEATED); break;
+ case 18: Write(13,4,"secret tunnel\n"
+ " area\n"
+ " completed!"); break;
+ case 19: Write(13,4,"secret castle\n"
+ " area\n"
+ " completed!"); break;
+ }
+#endif
+#else
+ Write(14,4,"secret floor\n completed!");
+#endif
+
+ Write(10,16,"15000 bonus!");
+
+ VW_UpdateScreen();
+ VW_FadeIn();
+
+ GivePoints(15000);
+ }
+
+
+ DrawScore();
+ VW_UpdateScreen();
+
+ TimeCount=0;
+ IN_StartAck();
+ while(!IN_CheckAck())
+ BJ_Breathe();
+
+//
+// done
+//
+#ifdef SPEARDEMO
+ if (gamestate.mapon == 1)
+ {
+ SD_PlaySound (BONUS1UPSND);
+
+ CA_CacheGrChunk (STARTFONT+1);
+ Message ("This concludes your demo\n"
+ "of Spear of Destiny! Now,\n"
+ "go to your local software\n"
+ "store and buy it!");
+ UNCACHEGRCHUNK (STARTFONT+1);
+
+ IN_ClearKeysDown();
+ IN_Ack();
+ }
+#endif
+
+#ifdef JAPDEMO
+ if (gamestate.mapon == 3)
+ {
+ SD_PlaySound (BONUS1UPSND);
+
+ CA_CacheGrChunk (STARTFONT+1);
+ Message ("This concludes your demo\n"
+ "of Wolfenstein 3-D! Now,\n"
+ "go to your local software\n"
+ "store and buy it!");
+ UNCACHEGRCHUNK (STARTFONT+1);
+
+ IN_ClearKeysDown();
+ IN_Ack();
+ }
+#endif
+
+ #ifndef SPEAR
+ if (Keyboard[sc_P] && MS_CheckParm("goobers"))
+ PicturePause();
+ #endif
+
+ VW_FadeOut ();
+ temp = bufferofs;
+ for (i=0;i<3;i++)
+ {
+ bufferofs = screenloc[i];
+ DrawPlayBorder ();
+ }
+ bufferofs = temp;
+
+ UnCacheLump(LEVELEND_LUMP_START,LEVELEND_LUMP_END);
+}
+
+
+
+//==========================================================================
+
+
+/*
+=================
+=
+= PreloadGraphics
+=
+= Fill the cache up
+=
+=================
+*/
+
+boolean PreloadUpdate(unsigned current, unsigned total)
+{
+ unsigned w = WindowW - 10;
+
+
+ VWB_Bar(WindowX + 5,WindowY + WindowH - 3,w,2,BLACK);
+ w = ((long)w * current) / total;
+ if (w)
+ {
+ VWB_Bar(WindowX + 5,WindowY + WindowH - 3,w,2,0x37); //SECONDCOLOR);
+ VWB_Bar(WindowX + 5,WindowY + WindowH - 3,w-1,1,0x32);
+
+ }
+ VW_UpdateScreen();
+// if (LastScan == sc_Escape)
+// {
+// IN_ClearKeysDown();
+// return(true);
+// }
+// else
+ return(false);
+}
+
+void PreloadGraphics(void)
+{
+ DrawLevel ();
+ ClearSplitVWB (); // set up for double buffering in split screen
+
+ VWB_Bar (0,0,320,200-STATUSLINES,127);
+
+ LatchDrawPic (20-14,80-3*8,GETPSYCHEDPIC);
+
+ WindowX = 160-14*8;
+ WindowY = 80-3*8;
+ WindowW = 28*8;
+ WindowH = 48;
+ VW_UpdateScreen();
+ VW_FadeIn ();
+
+ PM_Preload (PreloadUpdate);
+ IN_UserInput (70);
+ VW_FadeOut ();
+
+ DrawPlayBorder ();
+ VW_UpdateScreen ();
+}
+
+
+//==========================================================================
+
+/*
+==================
+=
+= DrawHighScores
+=
+==================
+*/
+
+void DrawHighScores(void)
+{
+ char buffer[16],*str,buffer1[5];
+ byte temp,temp1,temp2,temp3;
+ word i,j,
+ w,h,
+ x,y;
+ HighScore *s;
+
+
+ MM_SortMem ();
+
+#ifndef SPEAR
+// CA_CacheGrChunk (C_CODEPIC);
+ CA_CacheGrChunk (HIGHSCORESPIC);
+ CA_CacheGrChunk (STARTFONT);
+ CA_CacheGrChunk (C_LEVELPIC);
+ CA_CacheGrChunk (C_SCOREPIC);
+ CA_CacheGrChunk (C_NAMEPIC);
+
+ ClearMScreen();
+ DrawStripes(10);
+
+ VWB_DrawPic(48,0,HIGHSCORESPIC);
+ UNCACHEGRCHUNK (HIGHSCORESPIC);
+
+ VWB_DrawPic(4*8,68,C_NAMEPIC);
+ VWB_DrawPic(20*8,68,C_LEVELPIC);
+ VWB_DrawPic(28*8,68,C_SCOREPIC);
+#ifndef UPLOAD
+// VWB_DrawPic(35*8,68,C_CODEPIC);
+#endif
+ fontnumber=0;
+
+#else
+ CacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
+ ClearMScreen();
+ DrawStripes(10);
+ UnCacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
+
+ CacheLump (HIGHSCORES_LUMP_START,HIGHSCORES_LUMP_END);
+ CA_CacheGrChunk (STARTFONT+1);
+ VWB_DrawPic (0,0,HIGHSCORESPIC);
+
+ fontnumber = 1;
+#endif
+
+
+#ifndef SPEAR
+ SETFONTCOLOR(15,0x29);
+#else
+ SETFONTCOLOR(HIGHLIGHT,0x29);
+#endif
+
+ for (i = 0,s = Scores;i < MaxScores;i++,s++)
+ {
+ PrintY = 76 + (16 * i);
+
+ //
+ // name
+ //
+#ifndef SPEAR
+ PrintX = 4*8;
+#else
+ PrintX = 16;
+#endif
+ US_Print(s->name);
+
+ //
+ // level
+ //
+ ultoa(s->completed,buffer,10);
+#ifndef SPEAR
+ for (str = buffer;*str;str++)
+ *str = *str + (129 - '0'); // Used fixed-width numbers (129...)
+ USL_MeasureString(buffer,&w,&h);
+ PrintX = (22 * 8)-w;
+#else
+ USL_MeasureString(buffer,&w,&h);
+ PrintX = 194 - w;
+#endif
+
+#ifndef UPLOAD
+#ifndef SPEAR
+ PrintX -= 6;
+ itoa(s->episode+1,buffer1,10);
+ US_Print("E");
+ US_Print(buffer1);
+ US_Print("/L");
+#endif
+#endif
+
+#ifdef SPEAR
+ if (s->completed == 21)
+ VWB_DrawPic (PrintX+8,PrintY-1,C_WONSPEARPIC);
+ else
+#endif
+ US_Print(buffer);
+
+ //
+ // score
+ //
+ ultoa(s->score,buffer,10);
+#ifndef SPEAR
+ for (str = buffer;*str;str++)
+ *str = *str + (129 - '0'); // Used fixed-width numbers (129...)
+ USL_MeasureString(buffer,&w,&h);
+ PrintX = (34 * 8) - 8 - w;
+#else
+ USL_MeasureString(buffer,&w,&h);
+ PrintX = 292 - w;
+#endif
+ US_Print(buffer);
+
+ #if 0
+#ifndef UPLOAD
+#ifndef SPEAR
+ //
+ // verification #
+ //
+ if (!i)
+ {
+ temp=(((s->score >> 28)& 0xf)^
+ ((s->score >> 24)& 0xf))+'A';
+ temp1=(((s->score >> 20)& 0xf)^
+ ((s->score >> 16)& 0xf))+'A';
+ temp2=(((s->score >> 12)& 0xf)^
+ ((s->score >> 8)& 0xf))+'A';
+ temp3=(((s->score >> 4)& 0xf)^
+ ((s->score >> 0)& 0xf))+'A';
+
+ SETFONTCOLOR(0x49,0x29);
+ PrintX = 35*8;
+ buffer[0]=temp;
+ buffer[1]=temp1;
+ buffer[2]=temp2;
+ buffer[3]=temp3;
+ buffer[4]=0;
+ US_Print(buffer);
+ SETFONTCOLOR(15,0x29);
+ }
+#endif
+#endif
+ #endif
+ }
+
+ VW_UpdateScreen ();
+
+#ifdef SPEAR
+ UnCacheLump (HIGHSCORES_LUMP_START,HIGHSCORES_LUMP_END);
+ fontnumber = 0;
+#endif
+}
+
+//===========================================================================
+
+
+/*
+=======================
+=
+= CheckHighScore
+=
+=======================
+*/
+
+void CheckHighScore (long score,word other)
+{
+ word i,j;
+ int n;
+ HighScore myscore;
+
+ strcpy(myscore.name,"");
+ myscore.score = score;
+ myscore.episode = gamestate.episode;
+ myscore.completed = other;
+
+ for (i = 0,n = -1;i < MaxScores;i++)
+ {
+ if
+ (
+ (myscore.score > Scores[i].score)
+ || (
+ (myscore.score == Scores[i].score)
+ && (myscore.completed > Scores[i].completed)
+ )
+ )
+ {
+ for (j = MaxScores;--j > i;)
+ Scores[j] = Scores[j - 1];
+ Scores[i] = myscore;
+ n = i;
+ break;
+ }
+ }
+
+#ifdef SPEAR
+ StartCPMusic (XAWARD_MUS);
+#else
+ StartCPMusic (ROSTER_MUS);
+#endif
+ DrawHighScores ();
+
+ VW_FadeIn ();
+
+ if (n != -1)
+ {
+ //
+ // got a high score
+ //
+ PrintY = 76 + (16 * n);
+#ifndef SPEAR
+ PrintX = 4*8;
+ backcolor = BORDCOLOR;
+ fontcolor = 15;
+ US_LineInput(PrintX,PrintY,Scores[n].name,nil,true,MaxHighName,100);
+#else
+ PrintX = 16;
+ fontnumber = 1;
+ VWB_Bar (PrintX-2,PrintY-2,145,15,0x9c);
+ VW_UpdateScreen ();
+ backcolor = 0x9c;
+ fontcolor = 15;
+ US_LineInput(PrintX,PrintY,Scores[n].name,nil,true,MaxHighName,130);
+#endif
+ }
+ else
+ {
+ IN_ClearKeysDown ();
+ IN_UserInput(500);
+ }
+
+}
+
+
+#ifndef UPLOAD
+#ifndef SPEAR
+#ifndef JAPAN
+////////////////////////////////////////////////////////
+//
+// NON-SHAREWARE NOTICE
+//
+////////////////////////////////////////////////////////
+void NonShareware(void)
+{
+ VW_FadeOut();
+
+ ClearMScreen();
+ DrawStripes(10);
+
+ CA_CacheGrChunk(STARTFONT+1);
+ fontnumber = 1;
+
+ SETFONTCOLOR(READHCOLOR,BKGDCOLOR);
+ PrintX=110;
+ PrintY=15;
+
+ #ifdef SPANISH
+ US_Print("Atencion");
+ #else
+ US_Print("Attention");
+ #endif
+
+ SETFONTCOLOR(HIGHLIGHT,BKGDCOLOR);
+ WindowX=PrintX=40;
+ PrintY=60;
+ #ifdef SPANISH
+ US_Print("Este juego NO es gratis y\n");
+ US_Print("NO es Shareware; favor de\n");
+ US_Print("no distribuirlo.\n\n");
+ #else
+ US_Print("This game is NOT shareware.\n");
+ US_Print("Please do not distribute it.\n");
+ US_Print("Thanks.\n\n");
+ #endif
+ US_Print(" Id Software\n");
+
+ VW_UpdateScreen ();
+ VW_FadeIn();
+ IN_Ack();
+}
+#endif
+#endif
+#endif
+
+#ifdef SPEAR
+#ifndef SPEARDEMO
+////////////////////////////////////////////////////////
+//
+// COPY PROTECTION FOR FormGen
+//
+////////////////////////////////////////////////////////
+char far CopyProFailedStrs[][100] = {
+ STR_COPY1,
+ STR_COPY2,
+
+ STR_COPY3,
+ STR_COPY4,
+
+ STR_COPY5,
+ STR_COPY6,
+
+ STR_COPY7,
+ STR_COPY8,
+
+ STR_COPY9,
+ "",
+
+ STR_COPY10,
+ STR_COPY11,
+
+ STR_COPY12,
+ "",
+
+ STR_COPY13,
+ "",
+
+ STR_COPY14,
+ ""
+ },
+
+ far BackDoorStrs[5][16] = {
+ "a spoon?",
+ "bite me!",
+ "joshua",
+ "pelt",
+#ifdef BETA
+ "beta"
+#else
+ "snoops"
+#endif
+ },
+
+ far GoodBoyStrs[10][40] = {
+ "...is the CORRECT ANSWER!",
+ "",
+
+ "Consider yourself bitten, sir.",
+ "",
+
+ "Greetings Professor Falken, would you",
+ "like to play Spear of Destiny?",
+
+ "Do you have any gold spray paint?",
+ "",
+
+#ifdef BETA
+ "Beta testing approved.",
+#else
+ "I wish I had a 21\" monitor...",
+#endif
+ ""
+ },
+
+ far bossstrs[4][24] = {
+ "DEATH KNIGHT",
+ "BARNACLE WILHELM",
+ "UBERMUTANTUBER MUTANT",
+ "TRANS GROSSE"
+ },
+
+ far WordStr[5][20] = {
+ "New Game",
+ "Sound...F4",
+ "Control...F6",
+ "Change View...F5",
+ "Quit...F10"},
+
+ far WordCorrect[5][2] = {"3","4","4","5","5"},
+
+ far MemberStr[10][40] = {
+ STR_COPY15,
+ "",
+
+ STR_COPY16,
+ "",
+
+ STR_COPY17,
+ STR_COPY18,
+
+ STR_COPY19,
+ STR_COPY20,
+
+ STR_COPY21,
+ STR_COPY22},
+
+ far MemberCorrect[5][24] = {
+ "adrian carmack",
+ "john carmackjohn romero",
+ "tom hall",
+ "jay wilbur",
+ "kevin cloud"},
+
+ far DosMessages[9][80] = {
+ STR_NOPE1,
+ STR_NOPE2,
+ STR_NOPE3,
+ STR_NOPE4,
+ STR_NOPE5,
+ STR_NOPE6,
+ STR_NOPE7,
+ STR_NOPE8,
+ STR_NOPE9},
+
+ far MiscTitle[4][20] = {
+ "BLOOD TEST",
+ "STRAIGHT-LACED",
+ "QUITE SHAPELY",
+ "I AM WHAT I AMMO"
+ },
+
+ far MiscStr[12][40] = {
+ STR_MISC1,
+ STR_MISC2,
+ "",
+
+ STR_MISC3,
+ STR_MISC4,
+ "",
+
+ STR_MISC5,
+ STR_MISC6,
+ "",
+
+ STR_MISC7,
+ STR_MISC8,
+ STR_MISC9
+ },
+
+ far MiscCorrect[4][5] = {"ss","8",STR_STAR,"45"};
+
+
+int BackDoor(char *s)
+{
+ int i;
+
+
+ strlwr(s);
+
+ for (i=0;i<5;i++)
+ if (!_fstrcmp(s,BackDoorStrs[i]))
+ {
+ SETFONTCOLOR(14,15);
+ fontnumber = 0;
+ PrintY = 175;
+ VWB_DrawPic (0,20*8,COPYPROTBOXPIC);
+ US_CPrint(GoodBoyStrs[i*2]);
+ US_CPrint(GoodBoyStrs[i*2+1]);
+ VW_UpdateScreen();
+ return 1;
+ }
+
+ return 0;
+}
+
+
+void CopyProtection(void)
+{
+#define TYPEBOX_Y 177
+#define TYPEBOX_BKGD 0x9c
+#define PRINTCOLOR HIGHLIGHT
+
+ int i,match,whichboss,bossnum,try,whichline,enemypicked[4]={0,0,0,0},
+ bosses[4] = { BOSSPIC1PIC,BOSSPIC2PIC,BOSSPIC3PIC,BOSSPIC4PIC },
+ whichone,whichpicked[4]={0,0,0,0},quiztype,whichmem,
+ memberpicked[5]={0,0,0,0,0},wordpicked[5]={0,0,0,0,0},whichword;
+
+ char inputbuffer[20],
+ message[80];
+
+ enum
+ {
+ debriefing,
+ checkmanual,
+ staffquiz,
+ miscquiz,
+
+ totaltypes
+ };
+
+
+
+ try = 0;
+ VW_FadeOut();
+ CA_CacheGrChunk(C_BACKDROPPIC);
+ CacheLump(COPYPROT_LUMP_START,COPYPROT_LUMP_END);
+ CA_CacheGrChunk(STARTFONT+1);
+ CA_LoadAllSounds();
+ StartCPMusic(COPYPRO_MUS);
+ US_InitRndT(true);
+
+ while (try<3)
+ {
+ fontnumber = 1;
+ SETFONTCOLOR(PRINTCOLOR-2,15);
+ VWB_DrawPic (0,0,C_BACKDROPPIC);
+ VWB_DrawPic (0,0,COPYPROTTOPPIC);
+ VWB_DrawPic (0,20*8,COPYPROTBOXPIC);
+ WindowX = WindowY = 0;
+ WindowW = 320;
+ WindowH = 200;
+ PrintY = 65;
+
+ quiztype = US_RndT()%totaltypes;
+ switch(quiztype)
+ {
+ //
+ // BOSSES QUIZ
+ //
+ case debriefing:
+ PrintX = 0;
+ US_Print(STR_DEBRIEF);
+ SETFONTCOLOR(PRINTCOLOR,15);
+
+ while (enemypicked[whichboss = US_RndT()&3]);
+ enemypicked[whichboss] = 1;
+ bossnum = bosses[whichboss];
+ VWB_DrawPic(128,60,bossnum);
+ fontnumber = 0;
+ PrintY = 130;
+ US_CPrint(STR_ENEMY1"\n");
+ US_CPrint(STR_ENEMY2"\n\n");
+
+ VW_UpdateScreen();
+ VW_FadeIn();
+
+ PrintX = 100;
+ fontcolor = 15;
+ backcolor = TYPEBOX_BKGD;
+ inputbuffer[0] = 0;
+ PrintY = TYPEBOX_Y;
+ fontnumber = 1;
+ US_LineInput(PrintX,PrintY,inputbuffer,nil,true,20,100);
+
+ match = 0;
+ for (i=0;i<_fstrlen(bossstrs[whichboss]);i++)
+ if (!_fstrnicmp(inputbuffer,bossstrs[whichboss]+i,strlen(inputbuffer)) &&
+ strlen(inputbuffer)>3)
+ match = 1;
+
+ match += BackDoor(inputbuffer);
+ break;
+
+ //
+ // MANUAL CHECK
+ //
+ case checkmanual:
+ while (wordpicked[whichword = US_RndT()%5]);
+ wordpicked[whichword] = 1;
+ US_CPrint(STR_CHECKMAN);
+ SETFONTCOLOR(PRINTCOLOR,15);
+ PrintY += 25;
+ US_CPrint(STR_MAN1);
+ US_CPrint(STR_MAN2);
+ _fstrcpy(message,STR_MAN3" \"");
+ _fstrcat(message,WordStr[whichword]);
+ _fstrcat(message,"\" "STR_MAN4);
+ US_CPrint(message);
+ VW_UpdateScreen();
+ VW_FadeIn();
+
+ PrintX = 146;
+ fontcolor = 15;
+ backcolor = TYPEBOX_BKGD;
+ inputbuffer[0] = 0;
+ PrintY = TYPEBOX_Y;
+ US_LineInput(PrintX,PrintY,inputbuffer,nil,true,6,100);
+
+ strlwr(inputbuffer);
+ match = 1-(_fstrcmp(inputbuffer,WordCorrect[whichword])!=0);
+ match += BackDoor(inputbuffer);
+ break;
+
+ //
+ // STAFF QUIZ
+ //
+ case staffquiz:
+ while (memberpicked[whichmem = US_RndT()%5]);
+ memberpicked[whichmem] = 1;
+ US_CPrint(STR_ID1);
+ SETFONTCOLOR(PRINTCOLOR,15);
+ PrintY += 25;
+ US_CPrint(MemberStr[whichmem*2]);
+ US_CPrint(MemberStr[whichmem*2+1]);
+ VW_UpdateScreen();
+ VW_FadeIn();
+
+ PrintX = 100;
+ fontcolor = 15;
+ backcolor = TYPEBOX_BKGD;
+ inputbuffer[0] = 0;
+ PrintY = TYPEBOX_Y;
+ US_LineInput(PrintX,PrintY,inputbuffer,nil,true,20,120);
+
+ strlwr(inputbuffer);
+ match = 0;
+ for (i=0;i<_fstrlen(MemberCorrect[whichmem]);i++)
+ if (!_fstrnicmp(inputbuffer,MemberCorrect[whichmem]+i,strlen(inputbuffer)) &&
+ strlen(inputbuffer)>2)
+ match = 1;
+ match += BackDoor(inputbuffer);
+ break;
+
+ //
+ // MISCELLANEOUS QUESTIONS
+ //
+ case miscquiz:
+ while (whichpicked[whichone = US_RndT()&3]);
+ whichpicked[whichone] = 1;
+ US_CPrint(MiscTitle[whichone]);
+ SETFONTCOLOR(PRINTCOLOR,15);
+ PrintY += 25;
+ US_CPrint(MiscStr[whichone*3]);
+ US_CPrint(MiscStr[whichone*3+1]);
+ US_CPrint(MiscStr[whichone*3+2]);
+ VW_UpdateScreen();
+ VW_FadeIn();
+
+ PrintX = 146;
+ fontcolor = 15;
+ backcolor = TYPEBOX_BKGD;
+ inputbuffer[0] = 0;
+ PrintY = TYPEBOX_Y;
+ US_LineInput(PrintX,PrintY,inputbuffer,nil,true,6,100);
+
+ strlwr(inputbuffer);
+ match = 1-(_fstrcmp(inputbuffer,MiscCorrect[whichone])!=0);
+ match += BackDoor(inputbuffer);
+ break;
+ }
+
+ //
+ // IF NO MATCH, WE'VE GOT A (MINOR) PROBLEM!
+ //
+
+ if (!match)
+ {
+ whichline = 2*(US_RndT()%9);
+ SETFONTCOLOR(14,15);
+ fontnumber = 0;
+ PrintY = 175;
+ VWB_DrawPic (0,20*8,COPYPROTBOXPIC);
+ US_CPrint(CopyProFailedStrs[whichline]);
+ US_CPrint(CopyProFailedStrs[whichline+1]);
+
+ VW_UpdateScreen();
+ SD_PlaySound(NOWAYSND);
+ IN_UserInput(TickBase*3);
+ VW_FadeOut();
+ try++;
+ }
+ else
+ {
+ int start;
+
+
+ SD_PlaySound(BONUS1UPSND);
+ SD_WaitSoundDone();
+ UNCACHEGRCHUNK (STARTFONT+1);
+ UNCACHEGRCHUNK (C_BACKDROPPIC);
+ UnCacheLump (COPYPROT_LUMP_START,COPYPROT_LUMP_END);
+
+ switch(SoundMode)
+ {
+ case sdm_Off: return;
+ case sdm_PC: start = STARTPCSOUNDS; break;
+ case sdm_AdLib: start = STARTADLIBSOUNDS;
+ }
+
+ for (i=0;i<NUMSOUNDS;i++,start++)
+ MM_FreePtr ((memptr *)&audiosegs[start]);
+ return;
+ }
+ }
+
+ ClearMemory();
+ ShutdownId();
+
+ _fstrcpy(message,DosMessages[US_RndT()%9]);
+
+ _AX = 3;
+ geninterrupt(0x10);
+
+ printf("%s\n",message);
+ exit(1);
+}
+
+#endif // SPEARDEMO
+#endif // SPEAR
+//===========================================================================
--- /dev/null
+++ b/main.c
@@ -1,0 +1,1616 @@
+// WL_MAIN.C
+
+#include <conio.h>
+#include "WL_DEF.H"
+#pragma hdrstop
+
+
+/*
+=============================================================================
+
+ WOLFENSTEIN 3-D
+
+ An Id Software production
+
+ by John Carmack
+
+=============================================================================
+*/
+
+/*
+=============================================================================
+
+ LOCAL CONSTANTS
+
+=============================================================================
+*/
+
+
+#define FOCALLENGTH (0x5700l) // in global coordinates
+#define VIEWGLOBAL 0x10000 // globals visable flush to wall
+
+#define VIEWWIDTH 256 // size of view window
+#define VIEWHEIGHT 144
+
+/*
+=============================================================================
+
+ GLOBAL VARIABLES
+
+=============================================================================
+*/
+
+char str[80],str2[20];
+int tedlevelnum;
+boolean tedlevel;
+boolean nospr;
+boolean IsA386;
+int dirangle[9] = {0,ANGLES/8,2*ANGLES/8,3*ANGLES/8,4*ANGLES/8,
+ 5*ANGLES/8,6*ANGLES/8,7*ANGLES/8,ANGLES};
+
+//
+// proejection variables
+//
+fixed focallength;
+unsigned screenofs;
+int viewwidth;
+int viewheight;
+int centerx;
+int shootdelta; // pixels away from centerx a target can be
+fixed scale,maxslope;
+long heightnumerator;
+int minheightdiv;
+
+
+void Quit (char *error);
+
+boolean startgame,loadedgame,virtualreality;
+int mouseadjustment;
+
+char configname[13]="CONFIG.";
+
+
+/*
+=============================================================================
+
+ LOCAL VARIABLES
+
+=============================================================================
+*/
+
+
+/*
+====================
+=
+= ReadConfig
+=
+====================
+*/
+
+void ReadConfig(void)
+{
+ int file;
+ SDMode sd;
+ SMMode sm;
+ SDSMode sds;
+
+
+ if ( (file = open(configname,O_BINARY | O_RDONLY)) != -1)
+ {
+ //
+ // valid config file
+ //
+ read(file,Scores,sizeof(HighScore) * MaxScores);
+
+ read(file,&sd,sizeof(sd));
+ read(file,&sm,sizeof(sm));
+ read(file,&sds,sizeof(sds));
+
+ read(file,&mouseenabled,sizeof(mouseenabled));
+ read(file,&joystickenabled,sizeof(joystickenabled));
+ read(file,&joypadenabled,sizeof(joypadenabled));
+ read(file,&joystickprogressive,sizeof(joystickprogressive));
+ read(file,&joystickport,sizeof(joystickport));
+
+ read(file,&dirscan,sizeof(dirscan));
+ read(file,&buttonscan,sizeof(buttonscan));
+ read(file,&buttonmouse,sizeof(buttonmouse));
+ read(file,&buttonjoy,sizeof(buttonjoy));
+
+ read(file,&viewsize,sizeof(viewsize));
+ read(file,&mouseadjustment,sizeof(mouseadjustment));
+
+ close(file);
+
+ if (sd == sdm_AdLib && !AdLibPresent && !SoundBlasterPresent)
+ {
+ sd = sdm_PC;
+ sd = smm_Off;
+ }
+
+ if ((sds == sds_SoundBlaster && !SoundBlasterPresent) ||
+ (sds == sds_SoundSource && !SoundSourcePresent))
+ sds = sds_Off;
+
+ if (!MousePresent)
+ mouseenabled = false;
+ if (!JoysPresent[joystickport])
+ joystickenabled = false;
+
+ MainMenu[6].active=1;
+ MainItems.curpos=0;
+ }
+ else
+ {
+ //
+ // no config file, so select by hardware
+ //
+ if (SoundBlasterPresent || AdLibPresent)
+ {
+ sd = sdm_AdLib;
+ sm = smm_AdLib;
+ }
+ else
+ {
+ sd = sdm_PC;
+ sm = smm_Off;
+ }
+
+ if (SoundBlasterPresent)
+ sds = sds_SoundBlaster;
+ else if (SoundSourcePresent)
+ sds = sds_SoundSource;
+ else
+ sds = sds_Off;
+
+ if (MousePresent)
+ mouseenabled = true;
+
+ joystickenabled = false;
+ joypadenabled = false;
+ joystickport = 0;
+ joystickprogressive = false;
+
+ viewsize = 15;
+ mouseadjustment=5;
+ }
+
+ SD_SetMusicMode (sm);
+ SD_SetSoundMode (sd);
+ SD_SetDigiDevice (sds);
+
+}
+
+
+/*
+====================
+=
+= WriteConfig
+=
+====================
+*/
+
+void WriteConfig(void)
+{
+ int file;
+
+ file = open(configname,O_CREAT | O_BINARY | O_WRONLY,
+ S_IREAD | S_IWRITE | S_IFREG);
+
+ if (file != -1)
+ {
+ write(file,Scores,sizeof(HighScore) * MaxScores);
+
+ write(file,&SoundMode,sizeof(SoundMode));
+ write(file,&MusicMode,sizeof(MusicMode));
+ write(file,&DigiMode,sizeof(DigiMode));
+
+ write(file,&mouseenabled,sizeof(mouseenabled));
+ write(file,&joystickenabled,sizeof(joystickenabled));
+ write(file,&joypadenabled,sizeof(joypadenabled));
+ write(file,&joystickprogressive,sizeof(joystickprogressive));
+ write(file,&joystickport,sizeof(joystickport));
+
+ write(file,&dirscan,sizeof(dirscan));
+ write(file,&buttonscan,sizeof(buttonscan));
+ write(file,&buttonmouse,sizeof(buttonmouse));
+ write(file,&buttonjoy,sizeof(buttonjoy));
+
+ write(file,&viewsize,sizeof(viewsize));
+ write(file,&mouseadjustment,sizeof(mouseadjustment));
+
+ close(file);
+ }
+}
+
+
+//===========================================================================
+
+
+/*
+========================
+=
+= Patch386
+=
+= Patch ldiv to use 32 bit instructions
+=
+========================
+*/
+
+char *JHParmStrings[] = {"no386",nil};
+void Patch386 (void)
+{
+extern void far jabhack2(void);
+extern int far CheckIs386(void);
+
+ int i;
+
+ for (i = 1;i < _argc;i++)
+ if (US_CheckParm(_argv[i],JHParmStrings) == 0)
+ {
+ IsA386 = false;
+ return;
+ }
+
+ if (CheckIs386())
+ {
+ IsA386 = true;
+ jabhack2();
+ }
+ else
+ IsA386 = false;
+}
+
+//===========================================================================
+
+/*
+=====================
+=
+= NewGame
+=
+= Set up new game to start from the beginning
+=
+=====================
+*/
+
+void NewGame (int difficulty,int episode)
+{
+ memset (&gamestate,0,sizeof(gamestate));
+ gamestate.difficulty = difficulty;
+ gamestate.weapon = gamestate.bestweapon
+ = gamestate.chosenweapon = wp_pistol;
+ gamestate.health = 100;
+ gamestate.ammo = STARTAMMO;
+ gamestate.lives = 3;
+ gamestate.nextextra = EXTRAPOINTS;
+ gamestate.episode=episode;
+
+ startgame = true;
+}
+
+//===========================================================================
+
+void DiskFlopAnim(int x,int y)
+{
+ static char which=0;
+ if (!x && !y)
+ return;
+ VWB_DrawPic(x,y,C_DISKLOADING1PIC+which);
+ VW_UpdateScreen();
+ which^=1;
+}
+
+
+long DoChecksum(byte far *source,unsigned size,long checksum)
+{
+ unsigned i;
+
+ for (i=0;i<size-1;i++)
+ checksum += source[i]^source[i+1];
+
+ return checksum;
+}
+
+
+/*
+==================
+=
+= SaveTheGame
+=
+==================
+*/
+
+boolean SaveTheGame(int file,int x,int y)
+{
+ struct diskfree_t dfree;
+ long avail,size,checksum;
+ objtype *ob,nullobj;
+
+
+ if (_dos_getdiskfree(0,&dfree))
+ Quit("Error in _dos_getdiskfree call");
+
+ avail = (long)dfree.avail_clusters *
+ dfree.bytes_per_sector *
+ dfree.sectors_per_cluster;
+
+ size = 0;
+ for (ob = player; ob ; ob=ob->next)
+ size += sizeof(*ob);
+ size += sizeof(nullobj);
+
+ size += sizeof(gamestate) +
+ sizeof(LRstruct)*8 +
+ sizeof(tilemap) +
+ sizeof(actorat) +
+ sizeof(laststatobj) +
+ sizeof(statobjlist) +
+ sizeof(doorposition) +
+ sizeof(pwallstate) +
+ sizeof(pwallx) +
+ sizeof(pwally) +
+ sizeof(pwalldir) +
+ sizeof(pwallpos);
+
+ if (avail < size)
+ {
+ Message(STR_NOSPACE1"\n"
+ STR_NOSPACE2);
+ return false;
+ }
+
+ checksum = 0;
+
+
+ DiskFlopAnim(x,y);
+ CA_FarWrite (file,(void far *)&gamestate,sizeof(gamestate));
+ checksum = DoChecksum((byte far *)&gamestate,sizeof(gamestate),checksum);
+
+ DiskFlopAnim(x,y);
+#ifdef SPEAR
+ CA_FarWrite (file,(void far *)&LevelRatios[0],sizeof(LRstruct)*20);
+ checksum = DoChecksum((byte far *)&LevelRatios[0],sizeof(LRstruct)*20,checksum);
+#else
+ CA_FarWrite (file,(void far *)&LevelRatios[0],sizeof(LRstruct)*8);
+ checksum = DoChecksum((byte far *)&LevelRatios[0],sizeof(LRstruct)*8,checksum);
+#endif
+
+ DiskFlopAnim(x,y);
+ CA_FarWrite (file,(void far *)tilemap,sizeof(tilemap));
+ checksum = DoChecksum((byte far *)tilemap,sizeof(tilemap),checksum);
+ DiskFlopAnim(x,y);
+ CA_FarWrite (file,(void far *)actorat,sizeof(actorat));
+ checksum = DoChecksum((byte far *)actorat,sizeof(actorat),checksum);
+
+ CA_FarWrite (file,(void far *)areaconnect,sizeof(areaconnect));
+ CA_FarWrite (file,(void far *)areabyplayer,sizeof(areabyplayer));
+
+ for (ob = player ; ob ; ob=ob->next)
+ {
+ DiskFlopAnim(x,y);
+ CA_FarWrite (file,(void far *)ob,sizeof(*ob));
+ }
+ nullobj.active = ac_badobject; // end of file marker
+ DiskFlopAnim(x,y);
+ CA_FarWrite (file,(void far *)&nullobj,sizeof(nullobj));
+
+
+
+ DiskFlopAnim(x,y);
+ CA_FarWrite (file,(void far *)&laststatobj,sizeof(laststatobj));
+ checksum = DoChecksum((byte far *)&laststatobj,sizeof(laststatobj),checksum);
+ DiskFlopAnim(x,y);
+ CA_FarWrite (file,(void far *)statobjlist,sizeof(statobjlist));
+ checksum = DoChecksum((byte far *)statobjlist,sizeof(statobjlist),checksum);
+
+ DiskFlopAnim(x,y);
+ CA_FarWrite (file,(void far *)doorposition,sizeof(doorposition));
+ checksum = DoChecksum((byte far *)doorposition,sizeof(doorposition),checksum);
+ DiskFlopAnim(x,y);
+ CA_FarWrite (file,(void far *)doorobjlist,sizeof(doorobjlist));
+ checksum = DoChecksum((byte far *)doorobjlist,sizeof(doorobjlist),checksum);
+
+ DiskFlopAnim(x,y);
+ CA_FarWrite (file,(void far *)&pwallstate,sizeof(pwallstate));
+ checksum = DoChecksum((byte far *)&pwallstate,sizeof(pwallstate),checksum);
+ CA_FarWrite (file,(void far *)&pwallx,sizeof(pwallx));
+ checksum = DoChecksum((byte far *)&pwallx,sizeof(pwallx),checksum);
+ CA_FarWrite (file,(void far *)&pwally,sizeof(pwally));
+ checksum = DoChecksum((byte far *)&pwally,sizeof(pwally),checksum);
+ CA_FarWrite (file,(void far *)&pwalldir,sizeof(pwalldir));
+ checksum = DoChecksum((byte far *)&pwalldir,sizeof(pwalldir),checksum);
+ CA_FarWrite (file,(void far *)&pwallpos,sizeof(pwallpos));
+ checksum = DoChecksum((byte far *)&pwallpos,sizeof(pwallpos),checksum);
+
+ //
+ // WRITE OUT CHECKSUM
+ //
+ CA_FarWrite (file,(void far *)&checksum,sizeof(checksum));
+
+ return(true);
+}
+
+//===========================================================================
+
+/*
+==================
+=
+= LoadTheGame
+=
+==================
+*/
+
+boolean LoadTheGame(int file,int x,int y)
+{
+ long checksum,oldchecksum;
+ objtype *ob,nullobj;
+
+
+ checksum = 0;
+
+ DiskFlopAnim(x,y);
+ CA_FarRead (file,(void far *)&gamestate,sizeof(gamestate));
+ checksum = DoChecksum((byte far *)&gamestate,sizeof(gamestate),checksum);
+
+ DiskFlopAnim(x,y);
+#ifdef SPEAR
+ CA_FarRead (file,(void far *)&LevelRatios[0],sizeof(LRstruct)*20);
+ checksum = DoChecksum((byte far *)&LevelRatios[0],sizeof(LRstruct)*20,checksum);
+#else
+ CA_FarRead (file,(void far *)&LevelRatios[0],sizeof(LRstruct)*8);
+ checksum = DoChecksum((byte far *)&LevelRatios[0],sizeof(LRstruct)*8,checksum);
+#endif
+
+ DiskFlopAnim(x,y);
+ SetupGameLevel ();
+
+ DiskFlopAnim(x,y);
+ CA_FarRead (file,(void far *)tilemap,sizeof(tilemap));
+ checksum = DoChecksum((byte far *)tilemap,sizeof(tilemap),checksum);
+ DiskFlopAnim(x,y);
+ CA_FarRead (file,(void far *)actorat,sizeof(actorat));
+ checksum = DoChecksum((byte far *)actorat,sizeof(actorat),checksum);
+
+ CA_FarRead (file,(void far *)areaconnect,sizeof(areaconnect));
+ CA_FarRead (file,(void far *)areabyplayer,sizeof(areabyplayer));
+
+
+
+ InitActorList ();
+ DiskFlopAnim(x,y);
+ CA_FarRead (file,(void far *)player,sizeof(*player));
+
+ while (1)
+ {
+ DiskFlopAnim(x,y);
+ CA_FarRead (file,(void far *)&nullobj,sizeof(nullobj));
+ if (nullobj.active == ac_badobject)
+ break;
+ GetNewActor ();
+ // don't copy over the links
+ memcpy (new,&nullobj,sizeof(nullobj)-4);
+ }
+
+
+
+ DiskFlopAnim(x,y);
+ CA_FarRead (file,(void far *)&laststatobj,sizeof(laststatobj));
+ checksum = DoChecksum((byte far *)&laststatobj,sizeof(laststatobj),checksum);
+ DiskFlopAnim(x,y);
+ CA_FarRead (file,(void far *)statobjlist,sizeof(statobjlist));
+ checksum = DoChecksum((byte far *)statobjlist,sizeof(statobjlist),checksum);
+
+ DiskFlopAnim(x,y);
+ CA_FarRead (file,(void far *)doorposition,sizeof(doorposition));
+ checksum = DoChecksum((byte far *)doorposition,sizeof(doorposition),checksum);
+ DiskFlopAnim(x,y);
+ CA_FarRead (file,(void far *)doorobjlist,sizeof(doorobjlist));
+ checksum = DoChecksum((byte far *)doorobjlist,sizeof(doorobjlist),checksum);
+
+ DiskFlopAnim(x,y);
+ CA_FarRead (file,(void far *)&pwallstate,sizeof(pwallstate));
+ checksum = DoChecksum((byte far *)&pwallstate,sizeof(pwallstate),checksum);
+ CA_FarRead (file,(void far *)&pwallx,sizeof(pwallx));
+ checksum = DoChecksum((byte far *)&pwallx,sizeof(pwallx),checksum);
+ CA_FarRead (file,(void far *)&pwally,sizeof(pwally));
+ checksum = DoChecksum((byte far *)&pwally,sizeof(pwally),checksum);
+ CA_FarRead (file,(void far *)&pwalldir,sizeof(pwalldir));
+ checksum = DoChecksum((byte far *)&pwalldir,sizeof(pwalldir),checksum);
+ CA_FarRead (file,(void far *)&pwallpos,sizeof(pwallpos));
+ checksum = DoChecksum((byte far *)&pwallpos,sizeof(pwallpos),checksum);
+
+ CA_FarRead (file,(void far *)&oldchecksum,sizeof(oldchecksum));
+
+ if (oldchecksum != checksum)
+ {
+ Message(STR_SAVECHT1"\n"
+ STR_SAVECHT2"\n"
+ STR_SAVECHT3"\n"
+ STR_SAVECHT4);
+
+ IN_ClearKeysDown();
+ IN_Ack();
+
+ gamestate.score = 0;
+ gamestate.lives = 1;
+ gamestate.weapon =
+ gamestate.chosenweapon =
+ gamestate.bestweapon = wp_pistol;
+ gamestate.ammo = 8;
+ }
+
+ return true;
+}
+
+//===========================================================================
+
+/*
+==========================
+=
+= ShutdownId
+=
+= Shuts down all ID_?? managers
+=
+==========================
+*/
+
+void ShutdownId (void)
+{
+ US_Shutdown ();
+ SD_Shutdown ();
+ PM_Shutdown ();
+ IN_Shutdown ();
+ VW_Shutdown ();
+ CA_Shutdown ();
+ MM_Shutdown ();
+}
+
+
+//===========================================================================
+
+/*
+==================
+=
+= BuildTables
+=
+= Calculates:
+=
+= scale projection constant
+= sintable/costable overlapping fractional tables
+=
+==================
+*/
+
+const float radtoint = (float)FINEANGLES/2/PI;
+
+void BuildTables (void)
+{
+ int i;
+ float angle,anglestep;
+ double tang;
+ fixed value;
+
+
+//
+// calculate fine tangents
+//
+
+ for (i=0;i<FINEANGLES/8;i++)
+ {
+ tang = tan( (i+0.5)/radtoint);
+ finetangent[i] = tang*TILEGLOBAL;
+ finetangent[FINEANGLES/4-1-i] = 1/tang*TILEGLOBAL;
+ }
+
+//
+// costable overlays sintable with a quarter phase shift
+// ANGLES is assumed to be divisable by four
+//
+// The low word of the value is the fraction, the high bit is the sign bit,
+// bits 16-30 should be 0
+//
+
+ angle = 0;
+ anglestep = PI/2/ANGLEQUAD;
+ for (i=0;i<=ANGLEQUAD;i++)
+ {
+ value=GLOBAL1*sin(angle);
+ sintable[i]=
+ sintable[i+ANGLES]=
+ sintable[ANGLES/2-i] = value;
+ sintable[ANGLES-i]=
+ sintable[ANGLES/2+i] = value | 0x80000000l;
+ angle += anglestep;
+ }
+
+}
+
+//===========================================================================
+
+
+/*
+====================
+=
+= CalcProjection
+=
+= Uses focallength
+=
+====================
+*/
+
+void CalcProjection (long focal)
+{
+ int i;
+ long intang;
+ float angle;
+ double tang;
+ double planedist;
+ double globinhalf;
+ int halfview;
+ double halfangle,facedist;
+
+
+ focallength = focal;
+ facedist = focal+MINDIST;
+ halfview = viewwidth/2; // half view in pixels
+
+//
+// calculate scale value for vertical height calculations
+// and sprite x calculations
+//
+ scale = halfview*facedist/(VIEWGLOBAL/2);
+
+//
+// divide heightnumerator by a posts distance to get the posts height for
+// the heightbuffer. The pixel height is height>>2
+//
+ heightnumerator = (TILEGLOBAL*scale)>>6;
+ minheightdiv = heightnumerator/0x7fff +1;
+
+//
+// calculate the angle offset from view angle of each pixel's ray
+//
+
+ for (i=0;i<halfview;i++)
+ {
+ // start 1/2 pixel over, so viewangle bisects two middle pixels
+ tang = (long)i*VIEWGLOBAL/viewwidth/facedist;
+ angle = atan(tang);
+ intang = angle*radtoint;
+ pixelangle[halfview-1-i] = intang;
+ pixelangle[halfview+i] = -intang;
+ }
+
+//
+// if a point's abs(y/x) is greater than maxslope, the point is outside
+// the view area
+//
+ maxslope = finetangent[pixelangle[0]];
+ maxslope >>= 8;
+}
+
+
+
+//===========================================================================
+
+/*
+===================
+=
+= SetupWalls
+=
+= Map tile values to scaled pics
+=
+===================
+*/
+
+void SetupWalls (void)
+{
+ int i;
+
+ for (i=1;i<MAXWALLTILES;i++)
+ {
+ horizwall[i]=(i-1)*2;
+ vertwall[i]=(i-1)*2+1;
+ }
+}
+
+//===========================================================================
+
+/*
+==========================
+=
+= SignonScreen
+=
+==========================
+*/
+
+void SignonScreen (void) // VGA version
+{
+ unsigned segstart,seglength;
+
+ VL_SetVGAPlaneMode ();
+ VL_TestPaletteSet ();
+ VL_SetPalette (&gamepal);
+
+ if (!virtualreality)
+ {
+ VW_SetScreen(0x8000,0);
+ VL_MungePic (&introscn,320,200);
+ VL_MemToScreen (&introscn,320,200,0,0);
+ VW_SetScreen(0,0);
+ }
+
+//
+// reclaim the memory from the linked in signon screen
+//
+ segstart = FP_SEG(&introscn);
+ seglength = 64000/16;
+ if (FP_OFF(&introscn))
+ {
+ segstart++;
+ seglength--;
+ }
+ MML_UseSpace (segstart,seglength);
+}
+
+
+/*
+==========================
+=
+= FinishSignon
+=
+==========================
+*/
+
+void FinishSignon (void)
+{
+
+#ifndef SPEAR
+ VW_Bar (0,189,300,11,peekb(0xa000,0));
+ WindowX = 0;
+ WindowW = 320;
+ PrintY = 190;
+
+ #ifndef JAPAN
+ SETFONTCOLOR(14,4);
+
+ #ifdef SPANISH
+ US_CPrint ("Oprima una tecla");
+ #else
+ US_CPrint ("Press a key");
+ #endif
+
+ #endif
+
+ if (!NoWait)
+ IN_Ack ();
+
+ #ifndef JAPAN
+ VW_Bar (0,189,300,11,peekb(0xa000,0));
+
+ PrintY = 190;
+ SETFONTCOLOR(10,4);
+
+ #ifdef SPANISH
+ US_CPrint ("pensando...");
+ #else
+ US_CPrint ("Working...");
+ #endif
+
+ #endif
+
+ SETFONTCOLOR(0,15);
+#else
+ if (!NoWait)
+ VW_WaitVBL(3*70);
+#endif
+}
+
+//===========================================================================
+
+/*
+=================
+=
+= MS_CheckParm
+=
+=================
+*/
+
+boolean MS_CheckParm (char far *check)
+{
+ int i;
+ char *parm;
+
+ for (i = 1;i<_argc;i++)
+ {
+ parm = _argv[i];
+
+ while ( !isalpha(*parm) ) // skip - / \ etc.. in front of parm
+ if (!*parm++)
+ break; // hit end of string without an alphanum
+
+ if ( !_fstricmp(check,parm) )
+ return true;
+ }
+
+ return false;
+}
+
+//===========================================================================
+
+/*
+=====================
+=
+= InitDigiMap
+=
+=====================
+*/
+
+static int wolfdigimap[] =
+ {
+ // These first sounds are in the upload version
+#ifndef SPEAR
+ HALTSND, 0,
+ DOGBARKSND, 1,
+ CLOSEDOORSND, 2,
+ OPENDOORSND, 3,
+ ATKMACHINEGUNSND, 4,
+ ATKPISTOLSND, 5,
+ ATKGATLINGSND, 6,
+ SCHUTZADSND, 7,
+ GUTENTAGSND, 8,
+ MUTTISND, 9,
+ BOSSFIRESND, 10,
+ SSFIRESND, 11,
+ DEATHSCREAM1SND, 12,
+ DEATHSCREAM2SND, 13,
+ DEATHSCREAM3SND, 13,
+ TAKEDAMAGESND, 14,
+ PUSHWALLSND, 15,
+
+ LEBENSND, 20,
+ NAZIFIRESND, 21,
+ SLURPIESND, 22,
+
+ YEAHSND, 32,
+
+#ifndef UPLOAD
+ // These are in all other episodes
+ DOGDEATHSND, 16,
+ AHHHGSND, 17,
+ DIESND, 18,
+ EVASND, 19,
+
+ TOT_HUNDSND, 23,
+ MEINGOTTSND, 24,
+ SCHABBSHASND, 25,
+ HITLERHASND, 26,
+ SPIONSND, 27,
+ NEINSOVASSND, 28,
+ DOGATTACKSND, 29,
+ LEVELDONESND, 30,
+ MECHSTEPSND, 31,
+
+ SCHEISTSND, 33,
+ DEATHSCREAM4SND, 34, // AIIEEE
+ DEATHSCREAM5SND, 35, // DEE-DEE
+ DONNERSND, 36, // EPISODE 4 BOSS DIE
+ EINESND, 37, // EPISODE 4 BOSS SIGHTING
+ ERLAUBENSND, 38, // EPISODE 6 BOSS SIGHTING
+ DEATHSCREAM6SND, 39, // FART
+ DEATHSCREAM7SND, 40, // GASP
+ DEATHSCREAM8SND, 41, // GUH-BOY!
+ DEATHSCREAM9SND, 42, // AH GEEZ!
+ KEINSND, 43, // EPISODE 5 BOSS SIGHTING
+ MEINSND, 44, // EPISODE 6 BOSS DIE
+ ROSESND, 45, // EPISODE 5 BOSS DIE
+
+#endif
+#else
+//
+// SPEAR OF DESTINY DIGISOUNDS
+//
+ HALTSND, 0,
+ CLOSEDOORSND, 2,
+ OPENDOORSND, 3,
+ ATKMACHINEGUNSND, 4,
+ ATKPISTOLSND, 5,
+ ATKGATLINGSND, 6,
+ SCHUTZADSND, 7,
+ BOSSFIRESND, 8,
+ SSFIRESND, 9,
+ DEATHSCREAM1SND, 10,
+ DEATHSCREAM2SND, 11,
+ TAKEDAMAGESND, 12,
+ PUSHWALLSND, 13,
+ AHHHGSND, 15,
+ LEBENSND, 16,
+ NAZIFIRESND, 17,
+ SLURPIESND, 18,
+ LEVELDONESND, 22,
+ DEATHSCREAM4SND, 23, // AIIEEE
+ DEATHSCREAM3SND, 23, // DOUBLY-MAPPED!!!
+ DEATHSCREAM5SND, 24, // DEE-DEE
+ DEATHSCREAM6SND, 25, // FART
+ DEATHSCREAM7SND, 26, // GASP
+ DEATHSCREAM8SND, 27, // GUH-BOY!
+ DEATHSCREAM9SND, 28, // AH GEEZ!
+ GETGATLINGSND, 38, // Got Gat replacement
+
+#ifndef SPEARDEMO
+ DOGBARKSND, 1,
+ DOGDEATHSND, 14,
+ SPIONSND, 19,
+ NEINSOVASSND, 20,
+ DOGATTACKSND, 21,
+ TRANSSIGHTSND, 29, // Trans Sight
+ TRANSDEATHSND, 30, // Trans Death
+ WILHELMSIGHTSND, 31, // Wilhelm Sight
+ WILHELMDEATHSND, 32, // Wilhelm Death
+ UBERDEATHSND, 33, // Uber Death
+ KNIGHTSIGHTSND, 34, // Death Knight Sight
+ KNIGHTDEATHSND, 35, // Death Knight Death
+ ANGELSIGHTSND, 36, // Angel Sight
+ ANGELDEATHSND, 37, // Angel Death
+ GETSPEARSND, 39, // Got Spear replacement
+#endif
+#endif
+ LASTSOUND
+ };
+
+
+void InitDigiMap (void)
+{
+ int *map;
+
+ for (map = wolfdigimap;*map != LASTSOUND;map += 2)
+ DigiMap[map[0]] = map[1];
+
+
+}
+
+
+#ifndef SPEAR
+CP_iteminfo MusicItems={CTL_X,CTL_Y,6,0,32};
+CP_itemtype far MusicMenu[]=
+ {
+ {1,"Get Them!",0},
+ {1,"Searching",0},
+ {1,"P.O.W.",0},
+ {1,"Suspense",0},
+ {1,"War March",0},
+ {1,"Around The Corner!",0},
+
+ {1,"Nazi Anthem",0},
+ {1,"Lurking...",0},
+ {1,"Going After Hitler",0},
+ {1,"Pounding Headache",0},
+ {1,"Into the Dungeons",0},
+ {1,"Ultimate Conquest",0},
+
+ {1,"Kill the S.O.B.",0},
+ {1,"The Nazi Rap",0},
+ {1,"Twelfth Hour",0},
+ {1,"Zero Hour",0},
+ {1,"Ultimate Conquest",0},
+ {1,"Wolfpack",0}
+ };
+#else
+CP_iteminfo MusicItems={CTL_X,CTL_Y-20,9,0,32};
+CP_itemtype far MusicMenu[]=
+ {
+ {1,"Funky Colonel Bill",0},
+ {1,"Death To The Nazis",0},
+ {1,"Tiptoeing Around",0},
+ {1,"Is This THE END?",0},
+ {1,"Evil Incarnate",0},
+ {1,"Jazzin' Them Nazis",0},
+ {1,"Puttin' It To The Enemy",0},
+ {1,"The SS Gonna Get You",0},
+ {1,"Towering Above",0}
+ };
+#endif
+
+#ifndef SPEARDEMO
+void DoJukebox(void)
+{
+ int which,lastsong=-1;
+ unsigned start,songs[]=
+ {
+#ifndef SPEAR
+ GETTHEM_MUS,
+ SEARCHN_MUS,
+ POW_MUS,
+ SUSPENSE_MUS,
+ WARMARCH_MUS,
+ CORNER_MUS,
+
+ NAZI_OMI_MUS,
+ PREGNANT_MUS,
+ GOINGAFT_MUS,
+ HEADACHE_MUS,
+ DUNGEON_MUS,
+ ULTIMATE_MUS,
+
+ INTROCW3_MUS,
+ NAZI_RAP_MUS,
+ TWELFTH_MUS,
+ ZEROHOUR_MUS,
+ ULTIMATE_MUS,
+ PACMAN_MUS
+#else
+ XFUNKIE_MUS, // 0
+ XDEATH_MUS, // 2
+ XTIPTOE_MUS, // 4
+ XTHEEND_MUS, // 7
+ XEVIL_MUS, // 17
+ XJAZNAZI_MUS, // 18
+ XPUTIT_MUS, // 21
+ XGETYOU_MUS, // 22
+ XTOWER2_MUS // 23
+#endif
+ };
+ struct dostime_t time;
+
+
+
+ IN_ClearKeysDown();
+ if (!AdLibPresent && !SoundBlasterPresent)
+ return;
+
+
+ MenuFadeOut();
+
+#ifndef SPEAR
+#ifndef UPLOAD
+ _dos_gettime(&time);
+ start = (time.hsecond%3)*6;
+#else
+ start = 0;
+#endif
+#else
+ start = 0;
+#endif
+
+
+ CA_CacheGrChunk (STARTFONT+1);
+#ifdef SPEAR
+ CacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
+#else
+ CacheLump (CONTROLS_LUMP_START,CONTROLS_LUMP_END);
+#endif
+ CA_LoadAllSounds ();
+
+ fontnumber=1;
+ ClearMScreen ();
+ VWB_DrawPic(112,184,C_MOUSELBACKPIC);
+ DrawStripes (10);
+ SETFONTCOLOR (TEXTCOLOR,BKGDCOLOR);
+
+#ifndef SPEAR
+ DrawWindow (CTL_X-2,CTL_Y-6,280,13*7,BKGDCOLOR);
+#else
+ DrawWindow (CTL_X-2,CTL_Y-26,280,13*10,BKGDCOLOR);
+#endif
+
+ DrawMenu (&MusicItems,&MusicMenu[start]);
+
+ SETFONTCOLOR (READHCOLOR,BKGDCOLOR);
+ PrintY=15;
+ WindowX = 0;
+ WindowY = 320;
+ US_CPrint ("Robert's Jukebox");
+
+ SETFONTCOLOR (TEXTCOLOR,BKGDCOLOR);
+ VW_UpdateScreen();
+ MenuFadeIn();
+
+ do
+ {
+ which = HandleMenu(&MusicItems,&MusicMenu[start],NULL);
+ if (which>=0)
+ {
+ if (lastsong >= 0)
+ MusicMenu[start+lastsong].active = 1;
+
+ StartCPMusic(songs[start + which]);
+ MusicMenu[start+which].active = 2;
+ DrawMenu (&MusicItems,&MusicMenu[start]);
+ VW_UpdateScreen();
+ lastsong = which;
+ }
+ } while(which>=0);
+
+ MenuFadeOut();
+ IN_ClearKeysDown();
+#ifdef SPEAR
+ UnCacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
+#else
+ UnCacheLump (CONTROLS_LUMP_START,CONTROLS_LUMP_END);
+#endif
+}
+#endif
+
+
+/*
+==========================
+=
+= InitGame
+=
+= Load a few things right away
+=
+==========================
+*/
+
+void InitGame (void)
+{
+ int i,x,y;
+ unsigned *blockstart;
+
+ if (MS_CheckParm ("virtual"))
+ virtualreality = true;
+ else
+ virtualreality = false;
+
+ MM_Startup (); // so the signon screen can be freed
+
+ SignonScreen ();
+
+ VW_Startup ();
+ IN_Startup ();
+ PM_Startup ();
+ PM_UnlockMainMem ();
+ SD_Startup ();
+ CA_Startup ();
+ US_Startup ();
+
+
+#ifndef SPEAR
+ if (mminfo.mainmem < 235000L)
+#else
+ if (mminfo.mainmem < 257000L && !MS_CheckParm("debugmode"))
+#endif
+ {
+ memptr screen;
+
+ CA_CacheGrChunk (ERRORSCREEN);
+ screen = grsegs[ERRORSCREEN];
+ ShutdownId();
+ movedata ((unsigned)screen,7+7*160,0xb800,0,17*160);
+ gotoxy (1,23);
+ exit(1);
+ }
+
+
+//
+// build some tables
+//
+ InitDigiMap ();
+
+ for (i=0;i<MAPSIZE;i++)
+ {
+ nearmapylookup[i] = &tilemap[0][0]+MAPSIZE*i;
+ farmapylookup[i] = i*64;
+ }
+
+ for (i=0;i<PORTTILESHIGH;i++)
+ uwidthtable[i] = UPDATEWIDE*i;
+
+ blockstart = &blockstarts[0];
+ for (y=0;y<UPDATEHIGH;y++)
+ for (x=0;x<UPDATEWIDE;x++)
+ *blockstart++ = SCREENWIDTH*16*y+x*TILEWIDTH;
+
+ updateptr = &update[0];
+
+ bufferofs = 0;
+ displayofs = 0;
+ ReadConfig ();
+
+
+//
+// HOLDING DOWN 'M' KEY?
+//
+#ifndef SPEARDEMO
+ if (Keyboard[sc_M])
+ DoJukebox();
+ else
+#endif
+//
+// draw intro screen stuff
+//
+ if (!virtualreality)
+ IntroScreen ();
+
+//
+// load in and lock down some basic chunks
+//
+
+ CA_CacheGrChunk(STARTFONT);
+ MM_SetLock (&grsegs[STARTFONT],true);
+
+ LoadLatchMem ();
+ BuildTables (); // trig tables
+ SetupWalls ();
+
+#if 0
+{
+int temp,i;
+temp = viewsize;
+ profilehandle = open("SCALERS.TXT", O_CREAT | O_WRONLY | O_TEXT);
+for (i=1;i<20;i++)
+ NewViewSize(i);
+viewsize = temp;
+close(profilehandle);
+}
+#endif
+
+ NewViewSize (viewsize);
+
+
+//
+// initialize variables
+//
+ InitRedShifts ();
+ if (!virtualreality)
+ FinishSignon();
+
+ displayofs = PAGE1START;
+ bufferofs = PAGE2START;
+
+ if (virtualreality)
+ {
+ NoWait = true;
+ geninterrupt(0x60);
+ }
+}
+
+//===========================================================================
+
+/*
+==========================
+=
+= SetViewSize
+=
+==========================
+*/
+
+boolean SetViewSize (unsigned width, unsigned height)
+{
+ viewwidth = width&~15; // must be divisable by 16
+ viewheight = height&~1; // must be even
+ centerx = viewwidth/2-1;
+ shootdelta = viewwidth/10;
+ screenofs = ((200-STATUSLINES-viewheight)/2*SCREENWIDTH+(320-viewwidth)/8);
+
+//
+// calculate trace angles and projection constants
+//
+ CalcProjection (FOCALLENGTH);
+
+//
+// build all needed compiled scalers
+//
+// MM_BombOnError (false);
+ SetupScaling (viewwidth*1.5);
+#if 0
+ MM_BombOnError (true);
+ if (mmerror)
+ {
+ Quit ("Can't build scalers!");
+ mmerror = false;
+ return false;
+ }
+#endif
+ return true;
+}
+
+
+void ShowViewSize (int width)
+{
+ int oldwidth,oldheight;
+
+ oldwidth = viewwidth;
+ oldheight = viewheight;
+
+ viewwidth = width*16;
+ viewheight = width*16*HEIGHTRATIO;
+ DrawPlayBorder ();
+
+ viewheight = oldheight;
+ viewwidth = oldwidth;
+}
+
+
+void NewViewSize (int width)
+{
+ CA_UpLevel ();
+ MM_SortMem ();
+ viewsize = width;
+ SetViewSize (width*16,width*16*HEIGHTRATIO);
+ CA_DownLevel ();
+}
+
+
+
+//===========================================================================
+
+/*
+==========================
+=
+= Quit
+=
+==========================
+*/
+
+void Quit (char *error)
+{
+ unsigned finscreen;
+ memptr screen;
+
+ if (virtualreality)
+ geninterrupt(0x61);
+
+ ClearMemory ();
+ if (!*error)
+ {
+ #ifndef JAPAN
+ CA_CacheGrChunk (ORDERSCREEN);
+ screen = grsegs[ORDERSCREEN];
+ #endif
+ WriteConfig ();
+ }
+ else
+ {
+ CA_CacheGrChunk (ERRORSCREEN);
+ screen = grsegs[ERRORSCREEN];
+ }
+
+ ShutdownId ();
+
+ if (error && *error)
+ {
+ movedata ((unsigned)screen,7,0xb800,0,7*160);
+ gotoxy (10,4);
+ puts(error);
+ gotoxy (1,8);
+ exit(1);
+ }
+ else
+ if (!error || !(*error))
+ {
+ clrscr();
+ #ifndef JAPAN
+ movedata ((unsigned)screen,7,0xb800,0,4000);
+ gotoxy(1,24);
+ #endif
+//asm mov bh,0
+//asm mov dh,23 // row
+//asm mov dl,0 // collumn
+//asm mov ah,2
+//asm int 0x10
+ }
+
+ exit(0);
+}
+
+//===========================================================================
+
+
+
+/*
+=====================
+=
+= DemoLoop
+=
+=====================
+*/
+
+static char *ParmStrings[] = {"baby","easy","normal","hard",""};
+
+void DemoLoop (void)
+{
+ static int LastDemo;
+ int i,level;
+ long nsize;
+ memptr nullblock;
+
+//
+// check for launch from ted
+//
+ if (tedlevel)
+ {
+ NoWait = true;
+ NewGame(1,0);
+
+ for (i = 1;i < _argc;i++)
+ {
+ if ( (level = US_CheckParm(_argv[i],ParmStrings)) != -1)
+ {
+ gamestate.difficulty=level;
+ break;
+ }
+ }
+
+#ifndef SPEAR
+ gamestate.episode = tedlevelnum/10;
+ gamestate.mapon = tedlevelnum%10;
+#else
+ gamestate.episode = 0;
+ gamestate.mapon = tedlevelnum;
+#endif
+ GameLoop();
+ Quit (NULL);
+ }
+
+
+//
+// main game cycle
+//
+
+
+// nsize = (long)40*1024;
+// MM_GetPtr(&nullblock,nsize);
+
+#ifndef DEMOTEST
+
+ #ifndef UPLOAD
+
+ #ifndef GOODTIMES
+ #ifndef SPEAR
+ #ifndef JAPAN
+ if (!NoWait)
+ NonShareware();
+ #endif
+ #else
+
+ #ifndef GOODTIMES
+ #ifndef SPEARDEMO
+ CopyProtection();
+ #endif
+ #endif
+
+ #endif
+ #endif
+ #endif
+
+ StartCPMusic(INTROSONG);
+
+#ifndef JAPAN
+ if (!NoWait)
+ PG13 ();
+#endif
+
+#endif
+
+ while (1)
+ {
+ while (!NoWait)
+ {
+//
+// title page
+//
+ MM_SortMem ();
+#ifndef DEMOTEST
+
+#ifdef SPEAR
+ CA_CacheGrChunk (TITLEPALETTE);
+
+ CA_CacheGrChunk (TITLE1PIC);
+ VWB_DrawPic (0,0,TITLE1PIC);
+ UNCACHEGRCHUNK (TITLE1PIC);
+
+ CA_CacheGrChunk (TITLE2PIC);
+ VWB_DrawPic (0,80,TITLE2PIC);
+ UNCACHEGRCHUNK (TITLE2PIC);
+ VW_UpdateScreen ();
+ VL_FadeIn(0,255,grsegs[TITLEPALETTE],30);
+
+ UNCACHEGRCHUNK (TITLEPALETTE);
+#else
+ CA_CacheScreen (TITLEPIC);
+ VW_UpdateScreen ();
+ VW_FadeIn();
+#endif
+ if (IN_UserInput(TickBase*15))
+ break;
+ VW_FadeOut();
+//
+// credits page
+//
+ CA_CacheScreen (CREDITSPIC);
+ VW_UpdateScreen();
+ VW_FadeIn ();
+ if (IN_UserInput(TickBase*10))
+ break;
+ VW_FadeOut ();
+//
+// high scores
+//
+ DrawHighScores ();
+ VW_UpdateScreen ();
+ VW_FadeIn ();
+
+ if (IN_UserInput(TickBase*10))
+ break;
+#endif
+//
+// demo
+//
+
+ #ifndef SPEARDEMO
+ PlayDemo (LastDemo++%4);
+ #else
+ PlayDemo (0);
+ #endif
+
+ if (playstate == ex_abort)
+ break;
+ StartCPMusic(INTROSONG);
+ }
+
+ VW_FadeOut ();
+
+#ifndef SPEAR
+ if (Keyboard[sc_Tab] && MS_CheckParm("goobers"))
+#else
+ if (Keyboard[sc_Tab] && MS_CheckParm("debugmode"))
+#endif
+ RecordDemo ();
+ else
+ US_ControlPanel (0);
+
+ if (startgame || loadedgame)
+ {
+ GameLoop ();
+ VW_FadeOut();
+ StartCPMusic(INTROSONG);
+ }
+ }
+}
+
+
+//===========================================================================
+
+
+/*
+==========================
+=
+= main
+=
+==========================
+*/
+
+char *nosprtxt[] = {"nospr",nil};
+
+void main (void)
+{
+ int i;
+
+
+#ifdef BETA
+ //
+ // THIS IS FOR BETA ONLY!
+ //
+ struct dosdate_t d;
+
+ _dos_getdate(&d);
+ if (d.year > YEAR ||
+ (d.month >= MONTH && d.day >= DAY))
+ {
+ printf("Sorry, BETA-TESTING is over. Thanks for you help.\n");
+ exit(1);
+ }
+#endif
+
+ CheckForEpisodes();
+
+ Patch386 ();
+
+ InitGame ();
+
+ DemoLoop();
+
+ Quit("Demo loop exited???");
+}
+
--- /dev/null
+++ b/mapssdm.h
@@ -1,0 +1,14 @@
+///////////////////////////////////////
+//
+// TED5 Map Header for SDM
+//
+///////////////////////////////////////
+
+//
+// Map Names
+//
+typedef enum {
+ TUNNELS_1_MAP, // 0
+ TUNNELS_2_MAP, // 1
+ LASTMAP
+ } mapnames;
--- /dev/null
+++ b/mapssod.h
@@ -1,0 +1,33 @@
+///////////////////////////////////////
+//
+// TED5 Map Header for SOD
+//
+///////////////////////////////////////
+
+//
+// Map Names
+//
+typedef enum {
+ TUNNELS_1_MAP, // 0
+ TUNNELS_2_MAP, // 1
+ TUNNELS_3_MAP, // 2
+ TUNNELS_4_MAP, // 3
+ TUNNEL_BOSS_MAP, // 4
+ DUNGEONS_1_MAP, // 5
+ DUNGEONS_2_MAP, // 6
+ DUNGEONS_3_MAP, // 7
+ DUNGEONS_4_MAP, // 8
+ DUNGEON_BOSS_MAP, // 9
+ CASTLE_1_MAP, // 10
+ CASTLE_2_MAP, // 11
+ CASTLE_3_MAP, // 12
+ CASTLE_4_MAP, // 13
+ CASTLE_5_MAP, // 14
+ CASTLE_BOSS_MAP, // 15
+ RAMPARTS_MAP, // 16
+ DEATH_KNIGHT_MAP, // 17
+ SECRET_1_MAP, // 18
+ SECRET_2_MAP, // 19
+ ANGEL_OF_DEATH_MAP, // 20
+ LASTMAP
+ } mapnames;
--- /dev/null
+++ b/mapswl1.h
@@ -1,0 +1,42 @@
+///////////////////////////////////////
+//
+// TED5 Map Header for WL1
+//
+///////////////////////////////////////
+
+//
+// Map Names
+//
+typedef enum {
+ WOLF1_MAP1_MAP, // 0
+ WOLF1_MAP2_MAP, // 1
+ WOLF1_MAP3_MAP, // 2
+ WOLF1_MAP4_MAP, // 3
+ WOLF1_MAP5_MAP, // 4
+ WOLF1_MAP6_MAP, // 5
+ WOLF1_MAP7_MAP, // 6
+ WOLF1_MAP8_MAP, // 7
+ WOLF1_BOSS_MAP, // 8
+ WOLF1_SECRET_MAP, // 9
+ WOLF2_MAP1_MAP, // 10
+ WOLF2_MAP2_MAP, // 11
+ WOLF2_MAP3_MAP, // 12
+ WOLF2_MAP4_MAP, // 13
+ WOLF2_MAP5_MAP, // 14
+ WOLF2_MAP6_MAP, // 15
+ WOLF2_MAP7_MAP, // 16
+ WOLF2_MAP8_MAP, // 17
+ WOLF2_BOSS_MAP, // 18
+ WOLF2_SECRET_MAP, // 19
+ WOLF3_MAP1_MAP, // 20
+ WOLF3_MAP2_MAP, // 21
+ WOLF3_MAP3_MAP, // 22
+ WOLF3_MAP4_MAP, // 23
+ WOLF3_MAP5_MAP, // 24
+ WOLF3_MAP6_MAP, // 25
+ WOLF3_MAP7_MAP, // 26
+ WOLF3_MAP8_MAP, // 27
+ WOLF3_BOSS_MAP, // 28
+ WOLF3_SECRET_MAP, // 29
+ LASTMAP
+ } mapnames;
--- /dev/null
+++ b/mapswl6.h
@@ -1,0 +1,73 @@
+///////////////////////////////////////
+//
+// TED5 Map Header for WL6
+//
+///////////////////////////////////////
+
+//
+// Map Names
+//
+typedef enum {
+ WOLF1_MAP1_MAP, // 0
+ WOLF1_MAP2_MAP, // 1
+ WOLF1_MAP3_MAP, // 2
+ WOLF1_MAP4_MAP, // 3
+ WOLF1_MAP5_MAP, // 4
+ WOLF1_MAP6_MAP, // 5
+ WOLF1_MAP7_MAP, // 6
+ WOLF1_MAP8_MAP, // 7
+ WOLF1_BOSS_MAP, // 8
+ WOLF1_SECRET_MAP, // 9
+ WOLF2_MAP1_MAP, // 10
+ WOLF2_MAP2_MAP, // 11
+ WOLF2_MAP3_MAP, // 12
+ WOLF2_MAP4_MAP, // 13
+ WOLF2_MAP5_MAP, // 14
+ WOLF2_MAP6_MAP, // 15
+ WOLF2_MAP7_MAP, // 16
+ WOLF2_MAP8_MAP, // 17
+ WOLF2_BOSS_MAP, // 18
+ WOLF2_SECRET_MAP, // 19
+ WOLF3_MAP1_MAP, // 20
+ WOLF3_MAP2_MAP, // 21
+ WOLF3_MAP3_MAP, // 22
+ WOLF3_MAP4_MAP, // 23
+ WOLF3_MAP5_MAP, // 24
+ WOLF3_MAP6_MAP, // 25
+ WOLF3_MAP7_MAP, // 26
+ WOLF3_MAP8_MAP, // 27
+ WOLF3_BOSS_MAP, // 28
+ WOLF3_SECRET_MAP, // 29
+ WOLF4_MAP_1_MAP, // 30
+ WOLF4_MAP_2_MAP, // 31
+ WOLF4_MAP_3_MAP, // 32
+ WOLF4_MAP_4_MAP, // 33
+ WOLF4_MAP_5_MAP, // 34
+ WOLF4_MAP_6_MAP, // 35
+ WOLF4_MAP_7_MAP, // 36
+ WOLF4_MAP_8_MAP, // 37
+ WOLF4_BOSS_MAP, // 38
+ WOLF4_SECRET_MAP, // 39
+ WOLF5_MAP_1_MAP, // 40
+ WOLF5_MAP_2_MAP, // 41
+ WOLF5_MAP_3_MAP, // 42
+ WOLF5_MAP_4_MAP, // 43
+ WOLF5_MAP_5_MAP, // 44
+ WOLF5_MAP_6_MAP, // 45
+ WOLF5_MAP_7_MAP, // 46
+ WOLF5_MAP_8_MAP, // 47
+ WOLF5_BOSS_MAP, // 48
+ WOLF5_SECRET_MAP, // 49
+ WOLF6_MAP_1_MAP, // 50
+ WOLF6_MAP_2_MAP, // 51
+ WOLF6_MAP_3_MAP, // 52
+ WOLF6_MAP_4_MAP, // 53
+ WOLF6_MAP_5_MAP, // 54
+ WOLF6_MAP_6_MAP, // 55
+ WOLF6_MAP_7_MAP, // 56
+ WOLF6_MAP_8_MAP, // 57
+ WOLF6_BOSS_MAP, // 58
+ WOLF6_SECRET_MAP, // 59
+ MAP4L10PATH_MAP, // 60
+ LASTMAP
+ } mapnames;
--- /dev/null
+++ b/mapswlf.h
@@ -1,0 +1,16 @@
+///////////////////////////////////////
+//
+// TED5 Map Header for WLF
+//
+///////////////////////////////////////
+
+//
+// Map Names
+//
+typedef enum {
+ LEVEL_ONE_MAP, // 0
+ LEVEL_TWO_MAP, // 1
+ LEVEL_THREE_MAP, // 2
+ LEVEL_FOUR_MAP, // 3
+ LASTMAP
+ } mapnames;
--- /dev/null
+++ b/menu.c
@@ -1,0 +1,3986 @@
+////////////////////////////////////////////////////////////////////
+//
+// WL_MENU.C
+// by John Romero (C) 1992 Id Software, Inc.
+//
+////////////////////////////////////////////////////////////////////
+#include "wl_def.h"
+#pragma hdrstop
+
+//
+// PRIVATE PROTOTYPES
+//
+void CP_ReadThis(void);
+
+#ifdef SPEAR
+#define STARTITEM newgame
+
+#else
+#ifdef GOODTIMES
+#define STARTITEM newgame
+
+#else
+#define STARTITEM readthis
+#endif
+#endif
+
+char far endStrings[9][80]=
+{
+#ifndef SPEAR
+ {"Dost thou wish to\nleave with such hasty\nabandon?"},
+ {"Chickening out...\nalready?"},
+ {"Press N for more carnage.\nPress Y to be a weenie."},
+ {"So, you think you can\nquit this easily, huh?"},
+ {"Press N to save the world.\nPress Y to abandon it in\nits hour of need."},
+ {"Press N if you are brave.\nPress Y to cower in shame."},
+ {"Heroes, press N.\nWimps, press Y."},
+ {"You are at an intersection.\nA sign says, 'Press Y to quit.'\n>"},
+ {"For guns and glory, press N.\nFor work and worry, press Y."}
+#else
+ ENDSTR1,
+ ENDSTR2,
+ ENDSTR3,
+ ENDSTR4,
+ ENDSTR5,
+ ENDSTR6,
+ ENDSTR7,
+ ENDSTR8,
+ ENDSTR9
+#endif
+};
+
+CP_iteminfo
+ MainItems={MENU_X,MENU_Y,10,STARTITEM,24},
+ SndItems={SM_X,SM_Y1,12,0,52},
+ LSItems={LSM_X,LSM_Y,10,0,24},
+ CtlItems={CTL_X,CTL_Y,6,-1,56},
+ CusItems={8,CST_Y+13*2,9,-1,0},
+ NewEitems={NE_X,NE_Y,11,0,88},
+ NewItems={NM_X,NM_Y,4,2,24};
+
+#pragma warn -sus
+CP_itemtype far
+MainMenu[]=
+{
+#ifdef JAPAN
+ {1,"",CP_NewGame},
+ {1,"",CP_Sound},
+ {1,"",CP_Control},
+ {1,"",CP_LoadGame},
+ {0,"",CP_SaveGame},
+ {1,"",CP_ChangeView},
+ {2,"",CP_ReadThis},
+ {1,"",CP_ViewScores},
+ {1,"",0},
+ {1,"",0}
+#else
+
+ {1,STR_NG,CP_NewGame},
+ {1,STR_SD,CP_Sound},
+ {1,STR_CL,CP_Control},
+ {1,STR_LG,CP_LoadGame},
+ {0,STR_SG,CP_SaveGame},
+ {1,STR_CV,CP_ChangeView},
+
+#ifndef GOODTIMES
+#ifndef SPEAR
+
+ #ifdef SPANISH
+ {2,"Ve esto!",CP_ReadThis},
+ #else
+ {2,"Read This!",CP_ReadThis},
+ #endif
+
+#endif
+#endif
+
+ {1,STR_VS,CP_ViewScores},
+ {1,STR_BD,0},
+ {1,STR_QT,0}
+#endif
+},
+
+far SndMenu[]=
+{
+#ifdef JAPAN
+ {1,"",0},
+ {1,"",0},
+ {1,"",0},
+ {0,"",0},
+ {0,"",0},
+ {1,"",0},
+ {1,"",0},
+ {1,"",0},
+ {0,"",0},
+ {0,"",0},
+ {1,"",0},
+ {1,"",0},
+#else
+ {1,STR_NONE,0},
+ {1,STR_PC,0},
+ {1,STR_ALSB,0},
+ {0,"",0},
+ {0,"",0},
+ {1,STR_NONE,0},
+ {1,STR_DISNEY,0},
+ {1,STR_SB,0},
+ {0,"",0},
+ {0,"",0},
+ {1,STR_NONE,0},
+ {1,STR_ALSB,0}
+#endif
+},
+
+far CtlMenu[]=
+{
+#ifdef JAPAN
+ {0,"",0},
+ {0,"",0},
+ {0,"",0},
+ {0,"",0},
+ {0,"",MouseSensitivity},
+ {1,"",CustomControls}
+#else
+ {0,STR_MOUSEEN,0},
+ {0,STR_JOYEN,0},
+ {0,STR_PORT2,0},
+ {0,STR_GAMEPAD,0},
+ {0,STR_SENS,MouseSensitivity},
+ {1,STR_CUSTOM,CustomControls}
+#endif
+},
+
+#pragma warn +sus
+
+#ifndef SPEAR
+far NewEmenu[]=
+{
+#ifdef JAPAN
+#ifdef JAPDEMO
+ {1,"",0},
+ {0,"",0},
+ {0,"",0},
+ {0,"",0},
+ {0,"",0},
+ {0,"",0},
+ {0,"",0},
+ {0,"",0},
+ {0,"",0},
+ {0,"",0},
+ {0,"",0},
+ {0,"",0},
+#else
+ {1,"",0},
+ {0,"",0},
+ {1,"",0},
+ {0,"",0},
+ {1,"",0},
+ {0,"",0},
+ {1,"",0},
+ {0,"",0},
+ {1,"",0},
+ {0,"",0},
+ {1,"",0},
+ {0,"",0}
+#endif
+#else
+ #ifdef SPANISH
+ {1,"Episodio 1\n"
+ "Fuga desde Wolfenstein",0},
+ {0,"",0},
+ {3,"Episodio 2\n"
+ "Operacion Eisenfaust",0},
+ {0,"",0},
+ {3,"Episodio 3\n"
+ "Muere, Fuhrer, Muere!",0},
+ {0,"",0},
+ {3,"Episodio 4\n"
+ "Un Negro Secreto",0},
+ {0,"",0},
+ {3,"Episodio 5\n"
+ "Huellas del Loco",0},
+ {0,"",0},
+ {3,"Episodio 6\n"
+ "Confrontacion",0}
+ #else
+ {1,"Episode 1\n"
+ "Escape from Wolfenstein",0},
+ {0,"",0},
+ {3,"Episode 2\n"
+ "Operation: Eisenfaust",0},
+ {0,"",0},
+ {3,"Episode 3\n"
+ "Die, Fuhrer, Die!",0},
+ {0,"",0},
+ {3,"Episode 4\n"
+ "A Dark Secret",0},
+ {0,"",0},
+ {3,"Episode 5\n"
+ "Trail of the Madman",0},
+ {0,"",0},
+ {3,"Episode 6\n"
+ "Confrontation",0}
+ #endif
+#endif
+},
+#endif
+
+
+far NewMenu[]=
+{
+#ifdef JAPAN
+ {1,"",0},
+ {1,"",0},
+ {1,"",0},
+ {1,"",0}
+#else
+ {1,STR_DADDY,0},
+ {1,STR_HURTME,0},
+ {1,STR_BRINGEM,0},
+ {1,STR_DEATH,0}
+#endif
+},
+
+far LSMenu[]=
+{
+ {1,"",0},
+ {1,"",0},
+ {1,"",0},
+ {1,"",0},
+ {1,"",0},
+ {1,"",0},
+ {1,"",0},
+ {1,"",0},
+ {1,"",0},
+ {1,"",0}
+},
+
+far CusMenu[]=
+{
+ {1,"",0},
+ {0,"",0},
+ {0,"",0},
+ {1,"",0},
+ {0,"",0},
+ {0,"",0},
+ {1,"",0},
+ {0,"",0},
+ {1,"",0}
+}
+;
+
+
+int color_hlite[]={
+ DEACTIVE,
+ HIGHLIGHT,
+ READHCOLOR,
+ 0x67
+ },
+
+ color_norml[]={
+ DEACTIVE,
+ TEXTCOLOR,
+ READCOLOR,
+ 0x6b
+ };
+
+int EpisodeSelect[6]={1};
+
+
+int SaveGamesAvail[10],StartGame,SoundStatus=1,pickquick;
+char SaveGameNames[10][32],SaveName[13]="SAVEGAM?.";
+
+
+////////////////////////////////////////////////////////////////////
+//
+// INPUT MANAGER SCANCODE TABLES
+//
+////////////////////////////////////////////////////////////////////
+static byte
+ *ScanNames[] = // Scan code names with single chars
+ {
+ "?","?","1","2","3","4","5","6","7","8","9","0","-","+","?","?",
+ "Q","W","E","R","T","Y","U","I","O","P","[","]","|","?","A","S",
+ "D","F","G","H","J","K","L",";","\"","?","?","?","Z","X","C","V",
+ "B","N","M",",",".","/","?","?","?","?","?","?","?","?","?","?",
+ "?","?","?","?","?","?","?","?","\xf","?","-","\x15","5","\x11","+","?",
+ "\x13","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?",
+ "?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?",
+ "?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?"
+ }, // DEBUG - consolidate these
+ far ExtScanCodes[] = // Scan codes with >1 char names
+ {
+ 1,0xe,0xf,0x1d,0x2a,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,
+ 0x3f,0x40,0x41,0x42,0x43,0x44,0x57,0x59,0x46,0x1c,0x36,
+ 0x37,0x38,0x47,0x49,0x4f,0x51,0x52,0x53,0x45,0x48,
+ 0x50,0x4b,0x4d,0x00
+ },
+ *ExtScanNames[] = // Names corresponding to ExtScanCodes
+ {
+ "Esc","BkSp","Tab","Ctrl","LShft","Space","CapsLk","F1","F2","F3","F4",
+ "F5","F6","F7","F8","F9","F10","F11","F12","ScrlLk","Enter","RShft",
+ "PrtSc","Alt","Home","PgUp","End","PgDn","Ins","Del","NumLk","Up",
+ "Down","Left","Right",""
+ };
+
+
+////////////////////////////////////////////////////////////////////
+//
+// Wolfenstein Control Panel! Ta Da!
+//
+////////////////////////////////////////////////////////////////////
+void US_ControlPanel(byte scancode)
+{
+ int which,i,start;
+
+
+ if (ingame)
+ if (CP_CheckQuick(scancode))
+ return;
+
+ StartCPMusic(MENUSONG);
+ SetupControlPanel();
+
+ //
+ // F-KEYS FROM WITHIN GAME
+ //
+ switch(scancode)
+ {
+ case sc_F1:
+ #ifdef SPEAR
+ BossKey();
+ #else
+ #ifdef GOODTIMES
+ BossKey();
+ #else
+ HelpScreens();
+ #endif
+ #endif
+ goto finishup;
+
+ case sc_F2:
+ CP_SaveGame(0);
+ goto finishup;
+
+ case sc_F3:
+ CP_LoadGame(0);
+ goto finishup;
+
+ case sc_F4:
+ CP_Sound();
+ goto finishup;
+
+ case sc_F5:
+ CP_ChangeView();
+ goto finishup;
+
+ case sc_F6:
+ CP_Control();
+ goto finishup;
+
+ finishup:
+ CleanupControlPanel();
+ #ifdef SPEAR
+ UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
+ #endif
+ return;
+ }
+
+#ifdef SPEAR
+ CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
+#endif
+
+ DrawMainMenu();
+ MenuFadeIn();
+ StartGame=0;
+
+ //
+ // MAIN MENU LOOP
+ //
+ do
+ {
+ which=HandleMenu(&MainItems,&MainMenu[0],NULL);
+
+ #ifdef SPEAR
+ #ifndef SPEARDEMO
+ //
+ // EASTER EGG FOR SPEAR OF DESTINY!
+ //
+ if (Keyboard[sc_I] && Keyboard[sc_D])
+ {
+ VW_FadeOut();
+ StartCPMusic (XJAZNAZI_MUS);
+ UnCacheLump(OPTIONS_LUMP_START,OPTIONS_LUMP_END);
+ UnCacheLump(BACKDROP_LUMP_START,BACKDROP_LUMP_END);
+ MM_SortMem ();
+ ClearMemory ();
+
+
+ CA_CacheGrChunk (IDGUYS1PIC);
+ VWB_DrawPic(0,0,IDGUYS1PIC);
+ UNCACHEGRCHUNK(IDGUYS1PIC);
+
+ CA_CacheGrChunk (IDGUYS2PIC);
+ VWB_DrawPic(0,80,IDGUYS2PIC);
+ UNCACHEGRCHUNK(IDGUYS2PIC);
+
+ VW_UpdateScreen();
+
+ CA_CacheGrChunk (IDGUYSPALETTE);
+ VL_FadeIn(0,255,grsegs[IDGUYSPALETTE],30);
+ UNCACHEGRCHUNK(IDGUYSPALETTE);
+
+ while (Keyboard[sc_I] || Keyboard[sc_D]);
+ IN_ClearKeysDown();
+ IN_Ack();
+
+ VW_FadeOut();
+
+ CacheLump(BACKDROP_LUMP_START,BACKDROP_LUMP_END);
+ CacheLump(OPTIONS_LUMP_START,OPTIONS_LUMP_END);
+ DrawMainMenu();
+ StartCPMusic (MENUSONG);
+ MenuFadeIn();
+ }
+ #endif
+ #endif
+
+ switch(which)
+ {
+ case viewscores:
+ if (MainMenu[viewscores].routine == NULL)
+ if (CP_EndGame())
+ StartGame=1;
+
+ DrawMainMenu();
+ MenuFadeIn();
+ break;
+
+ case backtodemo:
+ #ifdef SPEAR
+ if (!ingame)
+ {
+ //
+ // DEALLOCATE ALL SOUNDS!
+ //
+ switch (SoundMode)
+ {
+ case sdm_PC:
+ start = STARTPCSOUNDS;
+ break;
+ case sdm_AdLib:
+ start = STARTADLIBSOUNDS;
+ break;
+ }
+
+ if (SoundMode != sdm_Off)
+ for (i=0;i<NUMSOUNDS;i++,start++)
+ if (audiosegs[start])
+ MM_SetPurge (&(memptr)audiosegs[start],3); // make purgable
+ }
+ #endif
+
+ MM_SortMem();
+ StartGame=1;
+ if (!ingame)
+ StartCPMusic(INTROSONG);
+ VL_FadeOut(0,255,0,0,0,10);
+ break;
+
+ case -1:
+ case quit:
+ CP_Quit();
+ break;
+
+ default:
+ if (!StartGame)
+ {
+ DrawMainMenu();
+ MenuFadeIn();
+ }
+ }
+
+ //
+ // "EXIT OPTIONS" OR "NEW GAME" EXITS
+ //
+ } while(!StartGame);
+
+ //
+ // DEALLOCATE EVERYTHING
+ //
+ CleanupControlPanel();
+
+ //
+ // CHANGE MAINMENU ITEM
+ //
+ if (startgame || loadedgame)
+ {
+ #pragma warn -sus
+ MainMenu[viewscores].routine = NULL;
+ #ifndef JAPAN
+ _fstrcpy(MainMenu[viewscores].string,STR_EG);
+ #endif
+ #pragma warn +sus
+ }
+
+ // RETURN/START GAME EXECUTION
+
+#ifdef SPEAR
+ UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
+ MM_SortMem ();
+#endif
+}
+
+
+////////////////////////
+//
+// DRAW MAIN MENU SCREEN
+//
+void DrawMainMenu(void)
+{
+#ifdef JAPAN
+ CA_CacheScreen(S_OPTIONSPIC);
+#else
+ ClearMScreen();
+
+ VWB_DrawPic(112,184,C_MOUSELBACKPIC);
+ DrawStripes(10);
+ VWB_DrawPic(84,0,C_OPTIONSPIC);
+
+ #ifdef SPANISH
+ DrawWindow(MENU_X-8,MENU_Y-3,MENU_W+8,MENU_H,BKGDCOLOR);
+ #else
+ DrawWindow(MENU_X-8,MENU_Y-3,MENU_W,MENU_H,BKGDCOLOR);
+ #endif
+#endif
+
+ //
+ // CHANGE "GAME" AND "DEMO"
+ //
+ if (ingame)
+ {
+ #ifndef JAPAN
+
+ #ifdef SPANISH
+ _fstrcpy(&MainMenu[backtodemo].string,STR_GAME);
+ #else
+ _fstrcpy(&MainMenu[backtodemo].string[8],STR_GAME);
+ #endif
+
+ #else
+ CA_CacheGrChunk(C_MRETGAMEPIC);
+ VWB_DrawPic(12*8,20*8,C_MRETGAMEPIC);
+ UNCACHEGRCHUNK(C_MRETGAMEPIC);
+ CA_CacheGrChunk(C_MENDGAMEPIC);
+ VWB_DrawPic(12*8,18*8,C_MENDGAMEPIC);
+ UNCACHEGRCHUNK(C_MENDGAMEPIC);
+ #endif
+ MainMenu[backtodemo].active=2;
+ }
+ else
+ {
+ #ifndef JAPAN
+ #ifdef SPANISH
+ _fstrcpy(&MainMenu[backtodemo].string,STR_BD);
+ #else
+ _fstrcpy(&MainMenu[backtodemo].string[8],STR_DEMO);
+ #endif
+ #else
+ CA_CacheGrChunk(C_MRETDEMOPIC);
+ VWB_DrawPic(12*8,20*8,C_MRETDEMOPIC);
+ UNCACHEGRCHUNK(C_MRETDEMOPIC);
+ CA_CacheGrChunk(C_MSCORESPIC);
+ VWB_DrawPic(12*8,18*8,C_MSCORESPIC);
+ UNCACHEGRCHUNK(C_MSCORESPIC);
+ #endif
+ MainMenu[backtodemo].active=1;
+ }
+
+ DrawMenu(&MainItems,&MainMenu[0]);
+ VW_UpdateScreen();
+}
+
+#ifndef GOODTIMES
+#ifndef SPEAR
+////////////////////////////////////////////////////////////////////
+//
+// READ THIS!
+//
+////////////////////////////////////////////////////////////////////
+void CP_ReadThis(void)
+{
+ StartCPMusic(CORNER_MUS);
+ HelpScreens();
+ StartCPMusic(MENUSONG);
+}
+#endif
+#endif
+
+#ifndef SPEAR
+#ifndef GOODTIMES
+#else
+////////////////////////////////////////////////////////////////////
+//
+// BOSS KEY
+//
+////////////////////////////////////////////////////////////////////
+void BossKey(void)
+{
+ SD_MusicOff();
+ _AX = 3;
+ geninterrupt(0x10);
+ printf("C>");
+ while (!Keyboard[sc_Escape])
+ IN_ClearKeysDown();
+
+ SD_MusicOn();
+ VL_SetVGAPlaneMode ();
+ VL_TestPaletteSet ();
+ VL_SetPalette (&gamepal);
+ LoadLatchMem();
+}
+#endif
+#endif
+
+////////////////////////////////////////////////////////////////////
+//
+// CHECK QUICK-KEYS & QUIT (WHILE IN A GAME)
+//
+////////////////////////////////////////////////////////////////////
+int CP_CheckQuick(unsigned scancode)
+{
+ switch(scancode)
+ {
+ //
+ // END GAME
+ //
+ case sc_F7:
+ CA_CacheGrChunk(STARTFONT+1);
+
+ WindowH=160;
+ #ifdef JAPAN
+ if (GetYorN(7,8,C_JAPQUITPIC))
+ #else
+ if (Confirm(ENDGAMESTR))
+ #endif
+ {
+ playstate = ex_died;
+ pickquick = gamestate.lives = 0;
+ }
+
+ DrawAllPlayBorder();
+ WindowH=200;
+ fontnumber=0;
+ MainMenu[savegame].active = 0;
+ return 1;
+
+ //
+ // QUICKSAVE
+ //
+ case sc_F8:
+ if (SaveGamesAvail[LSItems.curpos] && pickquick)
+ {
+ CA_CacheGrChunk(STARTFONT+1);
+ fontnumber = 1;
+ Message(STR_SAVING"...");
+ CP_SaveGame(1);
+ fontnumber=0;
+ }
+ else
+ {
+ #ifndef SPEAR
+ CA_CacheGrChunk(STARTFONT+1);
+ CA_CacheGrChunk(C_CURSOR1PIC);
+ CA_CacheGrChunk(C_CURSOR2PIC);
+ CA_CacheGrChunk(C_DISKLOADING1PIC);
+ CA_CacheGrChunk(C_DISKLOADING2PIC);
+ CA_CacheGrChunk(C_SAVEGAMEPIC);
+ CA_CacheGrChunk(C_MOUSELBACKPIC);
+ #else
+ CacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
+ CA_CacheGrChunk(C_CURSOR1PIC);
+ #endif
+
+ VW_FadeOut ();
+
+ StartCPMusic(MENUSONG);
+ pickquick=CP_SaveGame(0);
+
+ SETFONTCOLOR(0,15);
+ IN_ClearKeysDown();
+ DrawPlayScreen ();
+
+ if (!startgame && !loadedgame)
+ {
+ VW_FadeIn ();
+ StartMusic ();
+ }
+
+ if (loadedgame)
+ playstate = ex_abort;
+ lasttimecount = TimeCount;
+
+ if (MousePresent)
+ Mouse(MDelta); // Clear accumulated mouse movement
+
+ PM_CheckMainMem ();
+
+ #ifndef SPEAR
+ UNCACHEGRCHUNK(C_CURSOR1PIC);
+ UNCACHEGRCHUNK(C_CURSOR2PIC);
+ UNCACHEGRCHUNK(C_DISKLOADING1PIC);
+ UNCACHEGRCHUNK(C_DISKLOADING2PIC);
+ UNCACHEGRCHUNK(C_SAVEGAMEPIC);
+ UNCACHEGRCHUNK(C_MOUSELBACKPIC);
+ #else
+ UnCacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
+ #endif
+ }
+ return 1;
+
+ //
+ // QUICKLOAD
+ //
+ case sc_F9:
+ if (SaveGamesAvail[LSItems.curpos] && pickquick)
+ {
+ char string[100]=STR_LGC;
+
+
+ CA_CacheGrChunk(STARTFONT+1);
+ fontnumber = 1;
+
+ strcat(string,SaveGameNames[LSItems.curpos]);
+ strcat(string,"\"?");
+
+ if (Confirm(string))
+ CP_LoadGame(1);
+
+ DrawAllPlayBorder();
+ fontnumber=0;
+ }
+ else
+ {
+ #ifndef SPEAR
+ CA_CacheGrChunk(STARTFONT+1);
+ CA_CacheGrChunk(C_CURSOR1PIC);
+ CA_CacheGrChunk(C_CURSOR2PIC);
+ CA_CacheGrChunk(C_DISKLOADING1PIC);
+ CA_CacheGrChunk(C_DISKLOADING2PIC);
+ CA_CacheGrChunk(C_LOADGAMEPIC);
+ CA_CacheGrChunk(C_MOUSELBACKPIC);
+ #else
+ CA_CacheGrChunk(C_CURSOR1PIC);
+ CacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
+ #endif
+
+ VW_FadeOut ();
+
+ StartCPMusic(MENUSONG);
+ pickquick=CP_LoadGame(0);
+
+ SETFONTCOLOR(0,15);
+ IN_ClearKeysDown();
+ DrawPlayScreen ();
+
+ if (!startgame && !loadedgame)
+ {
+ VW_FadeIn ();
+ StartMusic ();
+ }
+
+ if (loadedgame)
+ playstate = ex_abort;
+
+ lasttimecount = TimeCount;
+
+ if (MousePresent)
+ Mouse(MDelta); // Clear accumulated mouse movement
+ PM_CheckMainMem ();
+
+ #ifndef SPEAR
+ UNCACHEGRCHUNK(C_CURSOR1PIC);
+ UNCACHEGRCHUNK(C_CURSOR2PIC);
+ UNCACHEGRCHUNK(C_DISKLOADING1PIC);
+ UNCACHEGRCHUNK(C_DISKLOADING2PIC);
+ UNCACHEGRCHUNK(C_LOADGAMEPIC);
+ UNCACHEGRCHUNK(C_MOUSELBACKPIC);
+ #else
+ UnCacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
+ #endif
+ }
+ return 1;
+
+ //
+ // QUIT
+ //
+ case sc_F10:
+ CA_CacheGrChunk(STARTFONT+1);
+
+ WindowX=WindowY=0;
+ WindowW=320;
+ WindowH=160;
+ #ifdef JAPAN
+ if (GetYorN(7,8,C_QUITMSGPIC))
+ #else
+ #ifdef SPANISH
+ if (Confirm(ENDGAMESTR))
+ #else
+ if (Confirm(endStrings[US_RndT()&0x7+(US_RndT()&1)]))
+ #endif
+ #endif
+ {
+ int i;
+
+
+ VW_UpdateScreen();
+ SD_MusicOff();
+ SD_StopSound();
+ MenuFadeOut();
+
+ //
+ // SHUT-UP THE ADLIB
+ //
+ for (i=1;i<=0xf5;i++)
+ alOut(i,0);
+ Quit(NULL);
+ }
+
+ DrawAllPlayBorder();
+ WindowH=200;
+ fontnumber=0;
+ return 1;
+ }
+
+ return 0;
+}
+
+
+////////////////////////////////////////////////////////////////////
+//
+// END THE CURRENT GAME
+//
+////////////////////////////////////////////////////////////////////
+int CP_EndGame(void)
+{
+#ifdef JAPAN
+ if (!GetYorN(7,8,C_JAPQUITPIC))
+#else
+ if (!Confirm(ENDGAMESTR))
+#endif
+ return 0;
+
+ pickquick = gamestate.lives = 0;
+ playstate = ex_died;
+
+ #pragma warn -sus
+ MainMenu[savegame].active = 0;
+ MainMenu[viewscores].routine=CP_ViewScores;
+ #ifndef JAPAN
+ _fstrcpy(MainMenu[viewscores].string,STR_VS);
+ #endif
+ #pragma warn +sus
+
+ return 1;
+}
+
+
+////////////////////////////////////////////////////////////////////
+//
+// VIEW THE HIGH SCORES
+//
+////////////////////////////////////////////////////////////////////
+void CP_ViewScores(void)
+{
+ fontnumber=0;
+
+#ifdef SPEAR
+ UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
+ StartCPMusic (XAWARD_MUS);
+#else
+ StartCPMusic (ROSTER_MUS);
+#endif
+
+ DrawHighScores ();
+ VW_UpdateScreen ();
+ MenuFadeIn();
+ fontnumber=1;
+
+ IN_Ack();
+
+ StartCPMusic(MENUSONG);
+ MenuFadeOut();
+
+#ifdef SPEAR
+ CacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
+ CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
+#endif
+}
+
+
+////////////////////////////////////////////////////////////////////
+//
+// START A NEW GAME
+//
+////////////////////////////////////////////////////////////////////
+void CP_NewGame(void)
+{
+ int which,episode;
+
+#ifdef SPEAR
+ UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
+#endif
+
+
+#ifndef SPEAR
+firstpart:
+
+ DrawNewEpisode();
+ do
+ {
+ which=HandleMenu(&NewEitems,&NewEmenu[0],NULL);
+ switch(which)
+ {
+ case -1:
+ MenuFadeOut();
+ return;
+
+ default:
+ if (!EpisodeSelect[which/2])
+ {
+ SD_PlaySound (NOWAYSND);
+ Message("Please select \"Read This!\"\n"
+ "from the Options menu to\n"
+ "find out how to order this\n"
+ "episode from Apogee.");
+ IN_ClearKeysDown();
+ IN_Ack();
+ DrawNewEpisode();
+ which = 0;
+ }
+ else
+ {
+ episode = which/2;
+ which = 1;
+ }
+ break;
+ }
+
+ } while (!which);
+
+ ShootSnd();
+
+ //
+ // ALREADY IN A GAME?
+ //
+ if (ingame)
+ #ifdef JAPAN
+ if (!GetYorN(7,8,C_JAPNEWGAMEPIC))
+ #else
+ if (!Confirm(CURGAME))
+ #endif
+ {
+ MenuFadeOut();
+ return;
+ }
+
+ MenuFadeOut();
+
+#else
+ episode = 0;
+
+ //
+ // ALREADY IN A GAME?
+ //
+ CacheLump (NEWGAME_LUMP_START,NEWGAME_LUMP_END);
+ DrawNewGame();
+ if (ingame)
+ if (!Confirm(CURGAME))
+ {
+ MenuFadeOut();
+ UnCacheLump (NEWGAME_LUMP_START,NEWGAME_LUMP_END);
+ CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
+ return;
+ }
+
+#endif
+
+ DrawNewGame();
+ which=HandleMenu(&NewItems,&NewMenu[0],DrawNewGameDiff);
+ if (which<0)
+ {
+ MenuFadeOut();
+ #ifndef SPEAR
+ goto firstpart;
+ #else
+ UnCacheLump (NEWGAME_LUMP_START,NEWGAME_LUMP_END);
+ CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
+ return;
+ #endif
+ }
+
+ ShootSnd();
+ NewGame(which,episode);
+ StartGame=1;
+ MenuFadeOut();
+
+ //
+ // CHANGE "READ THIS!" TO NORMAL COLOR
+ //
+ #ifndef SPEAR
+ #ifndef GOODTIMES
+ MainMenu[readthis].active=1;
+ #endif
+ #endif
+
+ pickquick = 0;
+
+#ifdef SPEAR
+ UnCacheLump (NEWGAME_LUMP_START,NEWGAME_LUMP_END);
+ CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
+#endif
+}
+
+
+#ifndef SPEAR
+/////////////////////
+//
+// DRAW NEW EPISODE MENU
+//
+void DrawNewEpisode(void)
+{
+ int i;
+
+#ifdef JAPAN
+ CA_CacheScreen(S_EPISODEPIC);
+#else
+ ClearMScreen();
+ VWB_DrawPic(112,184,C_MOUSELBACKPIC);
+
+ DrawWindow(NE_X-4,NE_Y-4,NE_W+8,NE_H+8,BKGDCOLOR);
+ SETFONTCOLOR(READHCOLOR,BKGDCOLOR);
+ PrintY=2;
+ WindowX=0;
+ #ifdef SPANISH
+ US_CPrint("Cual episodio jugar?");
+ #else
+ US_CPrint("Which episode to play?");
+ #endif
+#endif
+
+ SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
+ DrawMenu(&NewEitems,&NewEmenu[0]);
+
+ for (i=0;i<6;i++)
+ VWB_DrawPic(NE_X+32,NE_Y+i*26,C_EPISODE1PIC+i);
+
+ VW_UpdateScreen();
+ MenuFadeIn();
+ WaitKeyUp();
+}
+#endif
+
+/////////////////////
+//
+// DRAW NEW GAME MENU
+//
+void DrawNewGame(void)
+{
+#ifdef JAPAN
+ CA_CacheScreen(S_SKILLPIC);
+#else
+ ClearMScreen();
+ VWB_DrawPic(112,184,C_MOUSELBACKPIC);
+
+ SETFONTCOLOR(READHCOLOR,BKGDCOLOR);
+ PrintX=NM_X+20;
+ PrintY=NM_Y-32;
+
+#ifndef SPEAR
+ #ifdef SPANISH
+ US_Print("Eres macho?");
+ #else
+ US_Print("How tough are you?");
+ #endif
+#else
+ VWB_DrawPic (PrintX,PrintY,C_HOWTOUGHPIC);
+#endif
+
+ DrawWindow(NM_X-5,NM_Y-10,NM_W,NM_H,BKGDCOLOR);
+#endif
+
+ DrawMenu(&NewItems,&NewMenu[0]);
+ DrawNewGameDiff(NewItems.curpos);
+ VW_UpdateScreen();
+ MenuFadeIn();
+ WaitKeyUp();
+}
+
+
+////////////////////////
+//
+// DRAW NEW GAME GRAPHIC
+//
+void DrawNewGameDiff(int w)
+{
+ VWB_DrawPic(NM_X+185,NM_Y+7,w+C_BABYMODEPIC);
+}
+
+
+////////////////////////////////////////////////////////////////////
+//
+// HANDLE SOUND MENU
+//
+////////////////////////////////////////////////////////////////////
+void CP_Sound(void)
+{
+ int which,i;
+
+
+#ifdef SPEAR
+ UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
+ CacheLump (SOUND_LUMP_START,SOUND_LUMP_END);
+#endif
+
+ DrawSoundMenu();
+ MenuFadeIn();
+ WaitKeyUp();
+
+ do
+ {
+ which=HandleMenu(&SndItems,&SndMenu[0],NULL);
+ //
+ // HANDLE MENU CHOICES
+ //
+ switch(which)
+ {
+ //
+ // SOUND EFFECTS
+ //
+ case 0:
+ if (SoundMode!=sdm_Off)
+ {
+ SD_WaitSoundDone();
+ SD_SetSoundMode(sdm_Off);
+ DrawSoundMenu();
+ }
+ break;
+ case 1:
+ if (SoundMode!=sdm_PC)
+ {
+ SD_WaitSoundDone();
+ SD_SetSoundMode(sdm_PC);
+ CA_LoadAllSounds();
+ DrawSoundMenu();
+ ShootSnd();
+ }
+ break;
+ case 2:
+ if (SoundMode!=sdm_AdLib)
+ {
+ SD_WaitSoundDone();
+ SD_SetSoundMode(sdm_AdLib);
+ CA_LoadAllSounds();
+ DrawSoundMenu();
+ ShootSnd();
+ }
+ break;
+
+ //
+ // DIGITIZED SOUND
+ //
+ case 5:
+ if (DigiMode!=sds_Off)
+ {
+ SD_SetDigiDevice(sds_Off);
+ DrawSoundMenu();
+ }
+ break;
+ case 6:
+ if (DigiMode!=sds_SoundSource)
+ {
+ SD_SetDigiDevice(sds_SoundSource);
+ DrawSoundMenu();
+ ShootSnd();
+ }
+ break;
+ case 7:
+ if (DigiMode!=sds_SoundBlaster)
+ {
+ SD_SetDigiDevice(sds_SoundBlaster);
+ DrawSoundMenu();
+ ShootSnd();
+ }
+ break;
+
+ //
+ // MUSIC
+ //
+ case 10:
+ if (MusicMode!=smm_Off)
+ {
+ SD_SetMusicMode(smm_Off);
+ DrawSoundMenu();
+ ShootSnd();
+ }
+ break;
+ case 11:
+ if (MusicMode!=smm_AdLib)
+ {
+ SD_SetMusicMode(smm_AdLib);
+ DrawSoundMenu();
+ ShootSnd();
+ StartCPMusic(MENUSONG);
+ }
+ break;
+ }
+ } while(which>=0);
+
+ MenuFadeOut();
+
+#ifdef SPEAR
+ UnCacheLump (SOUND_LUMP_START,SOUND_LUMP_END);
+ CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
+#endif
+}
+
+
+//////////////////////
+//
+// DRAW THE SOUND MENU
+//
+void DrawSoundMenu(void)
+{
+ int i,on;
+
+
+#ifdef JAPAN
+ CA_CacheScreen(S_SOUNDPIC);
+#else
+ //
+ // DRAW SOUND MENU
+ //
+ ClearMScreen();
+ VWB_DrawPic(112,184,C_MOUSELBACKPIC);
+
+ DrawWindow(SM_X-8,SM_Y1-3,SM_W,SM_H1,BKGDCOLOR);
+ DrawWindow(SM_X-8,SM_Y2-3,SM_W,SM_H2,BKGDCOLOR);
+ DrawWindow(SM_X-8,SM_Y3-3,SM_W,SM_H3,BKGDCOLOR);
+#endif
+
+ //
+ // IF NO ADLIB, NON-CHOOSENESS!
+ //
+ if (!AdLibPresent && !SoundBlasterPresent)
+ {
+ SndMenu[2].active=SndMenu[10].active=SndMenu[11].active=0;
+ }
+
+ if (!SoundSourcePresent)
+ SndMenu[6].active=0;
+
+ if (!SoundBlasterPresent)
+ SndMenu[7].active=0;
+
+ if (!SoundSourcePresent && !SoundBlasterPresent)
+ SndMenu[5].active=0;
+
+ DrawMenu(&SndItems,&SndMenu[0]);
+#ifndef JAPAN
+ VWB_DrawPic(100,SM_Y1-20,C_FXTITLEPIC);
+ VWB_DrawPic(100,SM_Y2-20,C_DIGITITLEPIC);
+ VWB_DrawPic(100,SM_Y3-20,C_MUSICTITLEPIC);
+#endif
+
+ for (i=0;i<SndItems.amount;i++)
+#ifdef JAPAN
+ if (i!=3 && i!=4 && i!=8 && i!=9)
+#else
+ if (SndMenu[i].string[0])
+#endif
+ {
+ //
+ // DRAW SELECTED/NOT SELECTED GRAPHIC BUTTONS
+ //
+ on=0;
+ switch(i)
+ {
+ //
+ // SOUND EFFECTS
+ //
+ case 0: if (SoundMode==sdm_Off) on=1; break;
+ case 1: if (SoundMode==sdm_PC) on=1; break;
+ case 2: if (SoundMode==sdm_AdLib) on=1; break;
+
+ //
+ // DIGITIZED SOUND
+ //
+ case 5: if (DigiMode==sds_Off) on=1; break;
+ case 6: if (DigiMode==sds_SoundSource) on=1; break;
+ case 7: if (DigiMode==sds_SoundBlaster) on=1; break;
+
+ //
+ // MUSIC
+ //
+ case 10: if (MusicMode==smm_Off) on=1; break;
+ case 11: if (MusicMode==smm_AdLib) on=1; break;
+ }
+
+ if (on)
+ VWB_DrawPic(SM_X+24,SM_Y1+i*13+2,C_SELECTEDPIC);
+ else
+ VWB_DrawPic(SM_X+24,SM_Y1+i*13+2,C_NOTSELECTEDPIC);
+ }
+
+ DrawMenuGun(&SndItems);
+ VW_UpdateScreen();
+}
+
+
+//
+// DRAW LOAD/SAVE IN PROGRESS
+//
+void DrawLSAction(int which)
+{
+ #define LSA_X 96
+ #define LSA_Y 80
+ #define LSA_W 130
+ #define LSA_H 42
+
+ DrawWindow(LSA_X,LSA_Y,LSA_W,LSA_H,TEXTCOLOR);
+ DrawOutline(LSA_X,LSA_Y,LSA_W,LSA_H,0,HIGHLIGHT);
+ VWB_DrawPic(LSA_X+8,LSA_Y+5,C_DISKLOADING1PIC);
+
+ fontnumber=1;
+ SETFONTCOLOR(0,TEXTCOLOR);
+ PrintX=LSA_X+46;
+ PrintY=LSA_Y+13;
+
+ if (!which)
+ US_Print(STR_LOADING"...");
+ else
+ US_Print(STR_SAVING"...");
+
+ VW_UpdateScreen();
+}
+
+
+////////////////////////////////////////////////////////////////////
+//
+// LOAD SAVED GAMES
+//
+////////////////////////////////////////////////////////////////////
+int CP_LoadGame(int quick)
+{
+ int handle,which,exit=0;
+ char name[13];
+
+
+ strcpy(name,SaveName);
+
+ //
+ // QUICKLOAD?
+ //
+ if (quick)
+ {
+ which=LSItems.curpos;
+
+ if (SaveGamesAvail[which])
+ {
+ name[7]=which+'0';
+ handle=open(name,O_BINARY);
+ lseek(handle,32,SEEK_SET);
+ loadedgame=true;
+ LoadTheGame(handle,0,0);
+ loadedgame=false;
+ close(handle);
+
+ DrawFace ();
+ DrawHealth ();
+ DrawLives ();
+ DrawLevel ();
+ DrawAmmo ();
+ DrawKeys ();
+ DrawWeapon ();
+ DrawScore ();
+ return 1;
+ }
+ }
+
+
+#ifdef SPEAR
+ UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
+ CacheLump (LOADSAVE_LUMP_START,LOADSAVE_LUMP_END);
+#endif
+
+ DrawLoadSaveScreen(0);
+
+ do
+ {
+ which=HandleMenu(&LSItems,&LSMenu[0],TrackWhichGame);
+ if (which>=0 && SaveGamesAvail[which])
+ {
+ ShootSnd();
+ name[7]=which+'0';
+
+ handle=open(name,O_BINARY);
+ lseek(handle,32,SEEK_SET);
+
+ DrawLSAction(0);
+ loadedgame=true;
+
+ LoadTheGame(handle,LSA_X+8,LSA_Y+5);
+ close(handle);
+
+ StartGame=1;
+ ShootSnd();
+ //
+ // CHANGE "READ THIS!" TO NORMAL COLOR
+ //
+
+ #ifndef SPEAR
+ #ifndef GOODTIMES
+ MainMenu[readthis].active=1;
+ #endif
+ #endif
+
+ exit=1;
+ break;
+ }
+
+ } while(which>=0);
+
+ MenuFadeOut();
+
+#ifdef SPEAR
+ UnCacheLump (LOADSAVE_LUMP_START,LOADSAVE_LUMP_END);
+ CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
+#endif
+
+ return exit;
+}
+
+
+///////////////////////////////////
+//
+// HIGHLIGHT CURRENT SELECTED ENTRY
+//
+void TrackWhichGame(int w)
+{
+ static int lastgameon=0;
+
+ PrintLSEntry(lastgameon,TEXTCOLOR);
+ PrintLSEntry(w,HIGHLIGHT);
+
+ lastgameon=w;
+}
+
+
+////////////////////////////
+//
+// DRAW THE LOAD/SAVE SCREEN
+//
+void DrawLoadSaveScreen(int loadsave)
+{
+ #define DISKX 100
+ #define DISKY 0
+
+ int i;
+
+
+ ClearMScreen();
+ fontnumber=1;
+ VWB_DrawPic(112,184,C_MOUSELBACKPIC);
+ DrawWindow(LSM_X-10,LSM_Y-5,LSM_W,LSM_H,BKGDCOLOR);
+ DrawStripes(10);
+
+ if (!loadsave)
+ VWB_DrawPic(60,0,C_LOADGAMEPIC);
+ else
+ VWB_DrawPic(60,0,C_SAVEGAMEPIC);
+
+ for (i=0;i<10;i++)
+ PrintLSEntry(i,TEXTCOLOR);
+
+ DrawMenu(&LSItems,&LSMenu[0]);
+ VW_UpdateScreen();
+ MenuFadeIn();
+ WaitKeyUp();
+}
+
+
+///////////////////////////////////////////
+//
+// PRINT LOAD/SAVE GAME ENTRY W/BOX OUTLINE
+//
+void PrintLSEntry(int w,int color)
+{
+ SETFONTCOLOR(color,BKGDCOLOR);
+ DrawOutline(LSM_X+LSItems.indent,LSM_Y+w*13,LSM_W-LSItems.indent-15,11,color,color);
+ PrintX=LSM_X+LSItems.indent+2;
+ PrintY=LSM_Y+w*13+1;
+ fontnumber=0;
+
+ if (SaveGamesAvail[w])
+ US_Print(SaveGameNames[w]);
+ else
+ US_Print(" - "STR_EMPTY" -");
+
+ fontnumber=1;
+}
+
+
+////////////////////////////////////////////////////////////////////
+//
+// SAVE CURRENT GAME
+//
+////////////////////////////////////////////////////////////////////
+int CP_SaveGame(int quick)
+{
+ int handle,which,exit=0;
+ unsigned nwritten;
+ char name[13],input[32];
+
+
+ strcpy(name,SaveName);
+
+ //
+ // QUICKSAVE?
+ //
+ if (quick)
+ {
+ which=LSItems.curpos;
+
+ if (SaveGamesAvail[which])
+ {
+ name[7]=which+'0';
+ unlink(name);
+ handle=creat(name,S_IREAD|S_IWRITE);
+
+ strcpy(input,&SaveGameNames[which][0]);
+
+ _dos_write(handle,(void far *)input,32,&nwritten);
+ lseek(handle,32,SEEK_SET);
+ SaveTheGame(handle,0,0);
+ close(handle);
+
+ return 1;
+ }
+ }
+
+
+#ifdef SPEAR
+ UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
+ CacheLump (LOADSAVE_LUMP_START,LOADSAVE_LUMP_END);
+#endif
+
+ DrawLoadSaveScreen(1);
+
+ do
+ {
+ which=HandleMenu(&LSItems,&LSMenu[0],TrackWhichGame);
+ if (which>=0)
+ {
+ //
+ // OVERWRITE EXISTING SAVEGAME?
+ //
+ if (SaveGamesAvail[which])
+ #ifdef JAPAN
+ if (!GetYorN(7,8,C_JAPSAVEOVERPIC))
+ #else
+ if (!Confirm(GAMESVD))
+ #endif
+ {
+ DrawLoadSaveScreen(1);
+ continue;
+ }
+ else
+ {
+ DrawLoadSaveScreen(1);
+ PrintLSEntry(which,HIGHLIGHT);
+ VW_UpdateScreen();
+ }
+
+ ShootSnd();
+
+ strcpy(input,&SaveGameNames[which][0]);
+ name[7]=which+'0';
+
+ fontnumber=0;
+ if (!SaveGamesAvail[which])
+ VWB_Bar(LSM_X+LSItems.indent+1,LSM_Y+which*13+1,LSM_W-LSItems.indent-16,10,BKGDCOLOR);
+ VW_UpdateScreen();
+
+ if (US_LineInput(LSM_X+LSItems.indent+2,LSM_Y+which*13+1,input,input,true,31,LSM_W-LSItems.indent-30))
+ {
+ SaveGamesAvail[which]=1;
+ strcpy(&SaveGameNames[which][0],input);
+
+ unlink(name);
+ handle=creat(name,S_IREAD|S_IWRITE);
+ _dos_write(handle,(void far *)input,32,&nwritten);
+ lseek(handle,32,SEEK_SET);
+
+ DrawLSAction(1);
+ SaveTheGame(handle,LSA_X+8,LSA_Y+5);
+
+ close(handle);
+
+ ShootSnd();
+ exit=1;
+ }
+ else
+ {
+ VWB_Bar(LSM_X+LSItems.indent+1,LSM_Y+which*13+1,LSM_W-LSItems.indent-16,10,BKGDCOLOR);
+ PrintLSEntry(which,HIGHLIGHT);
+ VW_UpdateScreen();
+ SD_PlaySound(ESCPRESSEDSND);
+ continue;
+ }
+
+ fontnumber=1;
+ break;
+ }
+
+ } while(which>=0);
+
+ MenuFadeOut();
+
+#ifdef SPEAR
+ UnCacheLump (LOADSAVE_LUMP_START,LOADSAVE_LUMP_END);
+ CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
+#endif
+
+ return exit;
+}
+
+
+////////////////////////////////////////////////////////////////////
+//
+// CALIBRATE JOYSTICK
+//
+////////////////////////////////////////////////////////////////////
+int CalibrateJoystick(void)
+{
+ #define CALX 85
+ #define CALY 40
+ #define CALW 158
+ #define CALH 140
+
+ unsigned xmin,ymin,xmax,ymax,jb;
+
+
+
+ #ifdef JAPAN
+ VWB_DrawPic(CALX,CALY,C_JOY0PIC);
+ #else
+ DrawWindow(CALX-5,CALY-5,CALW,CALH,TEXTCOLOR);
+ DrawOutline(CALX-5,CALY-5,CALW,CALH,0,HIGHLIGHT);
+ SETFONTCOLOR(0,TEXTCOLOR);
+
+ WindowX = PrintX = CALX;
+ WindowW = CALW;
+ WindowH = CALH;
+ WindowY = PrintY = CALY;
+ US_Print(" "STR_CALIB"\n "STR_JOYST"\n");
+ VWB_DrawPic(CALX+40,CALY+30,C_JOY1PIC);
+ PrintY = CALY+80;
+ US_Print(STR_MOVEJOY);
+ SETFONTCOLOR(BKGDCOLOR,TEXTCOLOR);
+ US_Print(" "STR_ESCEXIT);
+ #endif
+ VW_UpdateScreen();
+
+ do
+ {
+ jb=IN_JoyButtons();
+ if (Keyboard[sc_Escape])
+ return 0;
+ #ifndef SPEAR
+ if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))
+ PicturePause();
+ #endif
+
+ } while(!(jb&1));
+
+ SD_PlaySound(SHOOTSND);
+ IN_GetJoyAbs(joystickport,&xmin,&ymin);
+
+
+ #ifdef JAPAN
+ VWB_DrawPic(CALX,CALY,C_JOY1PIC);
+ #else
+ DrawWindow(CALX-5,CALY-5,CALW,CALH,TEXTCOLOR);
+ DrawOutline(CALX-5,CALY-5,CALW,CALH,0,HIGHLIGHT);
+ SETFONTCOLOR(0,TEXTCOLOR);
+
+ PrintX = CALX;
+ PrintY = CALY;
+ US_Print(" "STR_CALIB"\n "STR_JOYST"\n");
+ VWB_DrawPic(CALX+40,CALY+30,C_JOY2PIC);
+ PrintY = CALY+80;
+ US_Print(STR_MOVEJOY2);
+ SETFONTCOLOR(BKGDCOLOR,TEXTCOLOR);
+ US_Print(" "STR_ESCEXIT);
+ #endif
+ VW_UpdateScreen();
+
+ do
+ {
+ jb=IN_JoyButtons();
+ if (Keyboard[sc_Escape])
+ return 0;
+ #ifndef SPEAR
+ if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))
+ PicturePause();
+ #endif
+ } while(!(jb&2));
+
+ IN_GetJoyAbs(joystickport,&xmax,&ymax);
+ SD_PlaySound(SHOOTSND);
+
+ while (IN_JoyButtons());
+
+ //
+ // ASSIGN ACTUAL VALUES HERE
+ //
+ if ((xmin != xmax) && (ymin != ymax))
+ IN_SetupJoy(joystickport,xmin,xmax,ymin,ymax);
+ else
+ return 0;
+
+ return 1;
+}
+
+
+////////////////////////////////////////////////////////////////////
+//
+// DEFINE CONTROLS
+//
+////////////////////////////////////////////////////////////////////
+void CP_Control(void)
+{
+ #define CTL_SPC 70
+ enum {MOUSEENABLE,JOYENABLE,USEPORT2,PADENABLE,MOUSESENS,CUSTOMIZE};
+ int i,which;
+
+
+#ifdef SPEAR
+ UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
+ CacheLump (CONTROL_LUMP_START,CONTROL_LUMP_END);
+#endif
+
+ DrawCtlScreen();
+ MenuFadeIn();
+ WaitKeyUp();
+
+ do
+ {
+ which=HandleMenu(&CtlItems,&CtlMenu[0],NULL);
+ switch(which)
+ {
+ case MOUSEENABLE:
+ mouseenabled^=1;
+ _CX=_DX=CENTER;
+ Mouse(4);
+ DrawCtlScreen();
+ CusItems.curpos=-1;
+ ShootSnd();
+ break;
+
+ case JOYENABLE:
+ joystickenabled^=1;
+ if (joystickenabled)
+ if (!CalibrateJoystick())
+ joystickenabled = 0;
+ DrawCtlScreen();
+ CusItems.curpos=-1;
+ ShootSnd();
+ break;
+
+ case USEPORT2:
+ joystickport^=1;
+ DrawCtlScreen();
+ ShootSnd();
+ break;
+
+ case PADENABLE:
+ joypadenabled^=1;
+ DrawCtlScreen();
+ ShootSnd();
+ break;
+
+ case MOUSESENS:
+ case CUSTOMIZE:
+ DrawCtlScreen();
+ MenuFadeIn();
+ WaitKeyUp();
+ break;
+ }
+ } while(which>=0);
+
+ MenuFadeOut();
+
+#ifdef SPEAR
+ UnCacheLump (CONTROL_LUMP_START,CONTROL_LUMP_END);
+ CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
+#endif
+}
+
+
+////////////////////////////////
+//
+// DRAW MOUSE SENSITIVITY SCREEN
+//
+void DrawMouseSens(void)
+{
+#ifdef JAPAN
+ CA_CacheScreen(S_MOUSESENSPIC);
+#else
+ ClearMScreen();
+ VWB_DrawPic(112,184,C_MOUSELBACKPIC);
+ #ifdef SPANISH
+ DrawWindow(10,80,300,43,BKGDCOLOR);
+ #else
+ DrawWindow(10,80,300,30,BKGDCOLOR);
+ #endif
+
+ WindowX=0;
+ WindowW=320;
+ PrintY=82;
+ SETFONTCOLOR(READCOLOR,BKGDCOLOR);
+ US_CPrint(STR_MOUSEADJ);
+
+ SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
+ #ifdef SPANISH
+ PrintX=14;
+ PrintY=95+13;
+ US_Print(STR_SLOW);
+ PrintX=252;
+ US_Print(STR_FAST);
+ #else
+ PrintX=14;
+ PrintY=95;
+ US_Print(STR_SLOW);
+ PrintX=269;
+ US_Print(STR_FAST);
+ #endif
+#endif
+
+ VWB_Bar(60,97,200,10,TEXTCOLOR);
+ DrawOutline(60,97,200,10,0,HIGHLIGHT);
+ DrawOutline(60+20*mouseadjustment,97,20,10,0,READCOLOR);
+ VWB_Bar(61+20*mouseadjustment,98,19,9,READHCOLOR);
+
+ VW_UpdateScreen();
+ MenuFadeIn();
+}
+
+
+///////////////////////////
+//
+// ADJUST MOUSE SENSITIVITY
+//
+void MouseSensitivity(void)
+{
+ ControlInfo ci;
+ int exit=0,oldMA;
+
+
+ oldMA=mouseadjustment;
+ DrawMouseSens();
+ do
+ {
+ ReadAnyControl(&ci);
+ switch(ci.dir)
+ {
+ case dir_North:
+ case dir_West:
+ if (mouseadjustment)
+ {
+ mouseadjustment--;
+ VWB_Bar(60,97,200,10,TEXTCOLOR);
+ DrawOutline(60,97,200,10,0,HIGHLIGHT);
+ DrawOutline(60+20*mouseadjustment,97,20,10,0,READCOLOR);
+ VWB_Bar(61+20*mouseadjustment,98,19,9,READHCOLOR);
+ VW_UpdateScreen();
+ SD_PlaySound(MOVEGUN1SND);
+ while(Keyboard[sc_LeftArrow]);
+ WaitKeyUp();
+ }
+ break;
+
+ case dir_South:
+ case dir_East:
+ if (mouseadjustment<9)
+ {
+ mouseadjustment++;
+ VWB_Bar(60,97,200,10,TEXTCOLOR);
+ DrawOutline(60,97,200,10,0,HIGHLIGHT);
+ DrawOutline(60+20*mouseadjustment,97,20,10,0,READCOLOR);
+ VWB_Bar(61+20*mouseadjustment,98,19,9,READHCOLOR);
+ VW_UpdateScreen();
+ SD_PlaySound(MOVEGUN1SND);
+ while(Keyboard[sc_RightArrow]);
+ WaitKeyUp();
+ }
+ break;
+ }
+
+ #ifndef SPEAR
+ if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))
+ #else
+ if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("debugmode"))
+ #endif
+ PicturePause();
+
+ if (ci.button0 || Keyboard[sc_Space] || Keyboard[sc_Enter])
+ exit=1;
+ else
+ if (ci.button1 || Keyboard[sc_Escape])
+ exit=2;
+
+ } while(!exit);
+
+ if (exit==2)
+ {
+ mouseadjustment=oldMA;
+ SD_PlaySound(ESCPRESSEDSND);
+ }
+ else
+ SD_PlaySound(SHOOTSND);
+
+ WaitKeyUp();
+ MenuFadeOut();
+}
+
+
+///////////////////////////
+//
+// DRAW CONTROL MENU SCREEN
+//
+void DrawCtlScreen(void)
+{
+ int i,x,y;
+
+
+#ifdef JAPAN
+ CA_CacheScreen(S_CONTROLPIC);
+#else
+ ClearMScreen();
+ DrawStripes(10);
+ VWB_DrawPic(80,0,C_CONTROLPIC);
+ VWB_DrawPic(112,184,C_MOUSELBACKPIC);
+ DrawWindow(CTL_X-8,CTL_Y-5,CTL_W,CTL_H,BKGDCOLOR);
+#endif
+ WindowX=0;
+ WindowW=320;
+ SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
+
+ if (JoysPresent[0])
+ CtlMenu[1].active=
+ CtlMenu[2].active=
+ CtlMenu[3].active=1;
+
+ CtlMenu[2].active=CtlMenu[3].active=joystickenabled;
+
+ if (MousePresent)
+ {
+ CtlMenu[4].active=
+ CtlMenu[0].active=1;
+ }
+
+ CtlMenu[4].active=mouseenabled;
+
+
+ DrawMenu(&CtlItems,&CtlMenu[0]);
+
+
+ x=CTL_X+CtlItems.indent-24;
+ y=CTL_Y+3;
+ if (mouseenabled)
+ VWB_DrawPic(x,y,C_SELECTEDPIC);
+ else
+ VWB_DrawPic(x,y,C_NOTSELECTEDPIC);
+
+ y=CTL_Y+16;
+ if (joystickenabled)
+ VWB_DrawPic(x,y,C_SELECTEDPIC);
+ else
+ VWB_DrawPic(x,y,C_NOTSELECTEDPIC);
+
+ y=CTL_Y+29;
+ if (joystickport)
+ VWB_DrawPic(x,y,C_SELECTEDPIC);
+ else
+ VWB_DrawPic(x,y,C_NOTSELECTEDPIC);
+
+ y=CTL_Y+42;
+ if (joypadenabled)
+ VWB_DrawPic(x,y,C_SELECTEDPIC);
+ else
+ VWB_DrawPic(x,y,C_NOTSELECTEDPIC);
+
+ //
+ // PICK FIRST AVAILABLE SPOT
+ //
+ if (CtlItems.curpos<0 || !CtlMenu[CtlItems.curpos].active)
+ for (i=0;i<6;i++)
+ if (CtlMenu[i].active)
+ {
+ CtlItems.curpos=i;
+ break;
+ }
+
+ DrawMenuGun(&CtlItems);
+ VW_UpdateScreen();
+}
+
+
+////////////////////////////////////////////////////////////////////
+//
+// CUSTOMIZE CONTROLS
+//
+////////////////////////////////////////////////////////////////////
+enum {FIRE,STRAFE,RUN,OPEN};
+char mbarray[4][3]={"b0","b1","b2","b3"},
+ order[4]={RUN,OPEN,FIRE,STRAFE};
+
+
+void CustomControls(void)
+{
+ int which;
+
+
+ DrawCustomScreen();
+ do
+ {
+ which=HandleMenu(&CusItems,&CusMenu[0],FixupCustom);
+ switch(which)
+ {
+ case 0:
+ DefineMouseBtns();
+ DrawCustMouse(1);
+ break;
+ case 3:
+ DefineJoyBtns();
+ DrawCustJoy(0);
+ break;
+ case 6:
+ DefineKeyBtns();
+ DrawCustKeybd(0);
+ break;
+ case 8:
+ DefineKeyMove();
+ DrawCustKeys(0);
+ }
+ } while(which>=0);
+
+
+
+ MenuFadeOut();
+}
+
+
+////////////////////////
+//
+// DEFINE THE MOUSE BUTTONS
+//
+void DefineMouseBtns(void)
+{
+ CustomCtrls mouseallowed={0,1,1,1};
+ EnterCtrlData(2,&mouseallowed,DrawCustMouse,PrintCustMouse,MOUSE);
+}
+
+
+////////////////////////
+//
+// DEFINE THE JOYSTICK BUTTONS
+//
+void DefineJoyBtns(void)
+{
+ CustomCtrls joyallowed={1,1,1,1};
+ EnterCtrlData(5,&joyallowed,DrawCustJoy,PrintCustJoy,JOYSTICK);
+}
+
+
+////////////////////////
+//
+// DEFINE THE KEYBOARD BUTTONS
+//
+void DefineKeyBtns(void)
+{
+ CustomCtrls keyallowed={1,1,1,1};
+ EnterCtrlData(8,&keyallowed,DrawCustKeybd,PrintCustKeybd,KEYBOARDBTNS);
+}
+
+
+////////////////////////
+//
+// DEFINE THE KEYBOARD BUTTONS
+//
+void DefineKeyMove(void)
+{
+ CustomCtrls keyallowed={1,1,1,1};
+ EnterCtrlData(10,&keyallowed,DrawCustKeys,PrintCustKeys,KEYBOARDMOVE);
+}
+
+
+////////////////////////
+//
+// ENTER CONTROL DATA FOR ANY TYPE OF CONTROL
+//
+enum {FWRD,RIGHT,BKWD,LEFT};
+int moveorder[4]={LEFT,RIGHT,FWRD,BKWD};
+
+void EnterCtrlData(int index,CustomCtrls *cust,void (*DrawRtn)(int),void (*PrintRtn)(int),int type)
+{
+ int j,exit,tick,redraw,which,x,picked;
+ ControlInfo ci;
+
+
+ ShootSnd();
+ PrintY=CST_Y+13*index;
+ IN_ClearKeysDown();
+ exit=0;
+ redraw=1;
+ //
+ // FIND FIRST SPOT IN ALLOWED ARRAY
+ //
+ for (j=0;j<4;j++)
+ if (cust->allowed[j])
+ {
+ which=j;
+ break;
+ }
+
+ do
+ {
+ if (redraw)
+ {
+ x=CST_START+CST_SPC*which;
+ DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);
+
+ DrawRtn(1);
+ DrawWindow(x-2,PrintY,CST_SPC,11,TEXTCOLOR);
+ DrawOutline(x-2,PrintY,CST_SPC,11,0,HIGHLIGHT);
+ SETFONTCOLOR(0,TEXTCOLOR);
+ PrintRtn(which);
+ PrintX=x;
+ SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
+ VW_UpdateScreen();
+ WaitKeyUp();
+ redraw=0;
+ }
+
+ ReadAnyControl(&ci);
+
+ if (type==MOUSE || type==JOYSTICK)
+ if (IN_KeyDown(sc_Enter)||IN_KeyDown(sc_Control)||IN_KeyDown(sc_Alt))
+ {
+ IN_ClearKeysDown();
+ ci.button0=ci.button1=false;
+ }
+
+ //
+ // CHANGE BUTTON VALUE?
+ //
+ if ((ci.button0|ci.button1|ci.button2|ci.button3)||
+ ((type==KEYBOARDBTNS||type==KEYBOARDMOVE) && LastScan==sc_Enter))
+ {
+ tick=TimeCount=picked=0;
+ SETFONTCOLOR(0,TEXTCOLOR);
+
+ do
+ {
+ int button,result=0;
+
+
+ if (type==KEYBOARDBTNS||type==KEYBOARDMOVE)
+ IN_ClearKeysDown();
+
+ //
+ // FLASH CURSOR
+ //
+ if (TimeCount>10)
+ {
+ switch(tick)
+ {
+ case 0:
+ VWB_Bar(x,PrintY+1,CST_SPC-2,10,TEXTCOLOR);
+ break;
+ case 1:
+ PrintX=x;
+ US_Print("?");
+ SD_PlaySound(HITWALLSND);
+ }
+ tick^=1;
+ TimeCount=0;
+ VW_UpdateScreen();
+ }
+
+ //
+ // WHICH TYPE OF INPUT DO WE PROCESS?
+ //
+ switch(type)
+ {
+ case MOUSE:
+ Mouse(3);
+ button=_BX;
+ switch(button)
+ {
+ case 1: result=1; break;
+ case 2: result=2; break;
+ case 4: result=3; break;
+ }
+
+ if (result)
+ {
+ int z;
+
+
+ for (z=0;z<4;z++)
+ if (order[which]==buttonmouse[z])
+ {
+ buttonmouse[z]=bt_nobutton;
+ break;
+ }
+
+ buttonmouse[result-1]=order[which];
+ picked=1;
+ SD_PlaySound(SHOOTDOORSND);
+ }
+ break;
+
+ case JOYSTICK:
+ if (ci.button0) result=1;
+ else
+ if (ci.button1) result=2;
+ else
+ if (ci.button2) result=3;
+ else
+ if (ci.button3) result=4;
+
+ if (result)
+ {
+ int z;
+
+
+ for (z=0;z<4;z++)
+ if (order[which]==buttonjoy[z])
+ {
+ buttonjoy[z]=bt_nobutton;
+ break;
+ }
+
+ buttonjoy[result-1]=order[which];
+ picked=1;
+ SD_PlaySound(SHOOTDOORSND);
+ }
+ break;
+
+ case KEYBOARDBTNS:
+ if (LastScan)
+ {
+ buttonscan[order[which]]=LastScan;
+ picked=1;
+ ShootSnd();
+ IN_ClearKeysDown();
+ }
+ break;
+
+ case KEYBOARDMOVE:
+ if (LastScan)
+ {
+ dirscan[moveorder[which]]=LastScan;
+ picked=1;
+ ShootSnd();
+ IN_ClearKeysDown();
+ }
+ break;
+ }
+
+ //
+ // EXIT INPUT?
+ //
+ if (IN_KeyDown(sc_Escape))
+ {
+ picked=1;
+ continue;
+ }
+
+ } while(!picked);
+
+ SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
+ redraw=1;
+ WaitKeyUp();
+ continue;
+ }
+
+ if (ci.button1 || IN_KeyDown(sc_Escape))
+ exit=1;
+
+ //
+ // MOVE TO ANOTHER SPOT?
+ //
+ switch(ci.dir)
+ {
+ case dir_West:
+ do
+ {
+ which--;
+ if (which<0)
+ which=3;
+ } while(!cust->allowed[which]);
+ redraw=1;
+ SD_PlaySound(MOVEGUN1SND);
+ while(ReadAnyControl(&ci),ci.dir!=dir_None);
+ IN_ClearKeysDown();
+ break;
+
+ case dir_East:
+ do
+ {
+ which++;
+ if (which>3)
+ which=0;
+ } while(!cust->allowed[which]);
+ redraw=1;
+ SD_PlaySound(MOVEGUN1SND);
+ while(ReadAnyControl(&ci),ci.dir!=dir_None);
+ IN_ClearKeysDown();
+ break;
+ case dir_North:
+ case dir_South:
+ exit=1;
+ }
+ } while(!exit);
+
+ SD_PlaySound(ESCPRESSEDSND);
+ WaitKeyUp();
+ DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);
+}
+
+
+////////////////////////
+//
+// FIXUP GUN CURSOR OVERDRAW SHIT
+//
+void FixupCustom(int w)
+{
+ static int lastwhich=-1;
+ int y=CST_Y+26+w*13;
+
+
+ VWB_Hlin(7,32,y-1,DEACTIVE);
+ VWB_Hlin(7,32,y+12,BORD2COLOR);
+#ifndef SPEAR
+ VWB_Hlin(7,32,y-2,BORDCOLOR);
+ VWB_Hlin(7,32,y+13,BORDCOLOR);
+#else
+ VWB_Hlin(7,32,y-2,BORD2COLOR);
+ VWB_Hlin(7,32,y+13,BORD2COLOR);
+#endif
+
+ switch(w)
+ {
+ case 0: DrawCustMouse(1); break;
+ case 3: DrawCustJoy(1); break;
+ case 6: DrawCustKeybd(1); break;
+ case 8: DrawCustKeys(1);
+ }
+
+
+ if (lastwhich>=0)
+ {
+ y=CST_Y+26+lastwhich*13;
+ VWB_Hlin(7,32,y-1,DEACTIVE);
+ VWB_Hlin(7,32,y+12,BORD2COLOR);
+#ifndef SPEAR
+ VWB_Hlin(7,32,y-2,BORDCOLOR);
+ VWB_Hlin(7,32,y+13,BORDCOLOR);
+#else
+ VWB_Hlin(7,32,y-2,BORD2COLOR);
+ VWB_Hlin(7,32,y+13,BORD2COLOR);
+#endif
+
+ if (lastwhich!=w)
+ switch(lastwhich)
+ {
+ case 0: DrawCustMouse(0); break;
+ case 3: DrawCustJoy(0); break;
+ case 6: DrawCustKeybd(0); break;
+ case 8: DrawCustKeys(0);
+ }
+ }
+
+ lastwhich=w;
+}
+
+
+////////////////////////
+//
+// DRAW CUSTOMIZE SCREEN
+//
+void DrawCustomScreen(void)
+{
+ int i;
+
+
+#ifdef JAPAN
+ CA_CacheScreen(S_CUSTOMPIC);
+ fontnumber=1;
+
+ PrintX=CST_START;
+ PrintY = CST_Y+26;
+ DrawCustMouse(0);
+
+ PrintX=CST_START;
+ US_Print("\n\n\n");
+ DrawCustJoy(0);
+
+ PrintX=CST_START;
+ US_Print("\n\n\n");
+ DrawCustKeybd(0);
+
+ PrintX=CST_START;
+ US_Print("\n\n\n");
+ DrawCustKeys(0);
+#else
+ ClearMScreen();
+ WindowX=0;
+ WindowW=320;
+ VWB_DrawPic(112,184,C_MOUSELBACKPIC);
+ DrawStripes(10);
+ VWB_DrawPic(80,0,C_CUSTOMIZEPIC);
+
+ //
+ // MOUSE
+ //
+ SETFONTCOLOR(READCOLOR,BKGDCOLOR);
+ WindowX=0;
+ WindowW=320;
+
+#ifndef SPEAR
+ PrintY=CST_Y;
+ US_CPrint("Mouse\n");
+#else
+ PrintY = CST_Y+13;
+ VWB_DrawPic (128,48,C_MOUSEPIC);
+#endif
+
+ SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
+ #ifdef SPANISH
+ PrintX=CST_START-16;
+ US_Print(STR_CRUN);
+ PrintX=CST_START-16+CST_SPC*1;
+ US_Print(STR_COPEN);
+ PrintX=CST_START-16+CST_SPC*2;
+ US_Print(STR_CFIRE);
+ PrintX=CST_START-16+CST_SPC*3;
+ US_Print(STR_CSTRAFE"\n");
+ #else
+ PrintX=CST_START;
+ US_Print(STR_CRUN);
+ PrintX=CST_START+CST_SPC*1;
+ US_Print(STR_COPEN);
+ PrintX=CST_START+CST_SPC*2;
+ US_Print(STR_CFIRE);
+ PrintX=CST_START+CST_SPC*3;
+ US_Print(STR_CSTRAFE"\n");
+ #endif
+
+ DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);
+ DrawCustMouse(0);
+ US_Print("\n");
+
+
+ //
+ // JOYSTICK/PAD
+ //
+#ifndef SPEAR
+ SETFONTCOLOR(READCOLOR,BKGDCOLOR);
+ US_CPrint("Joystick/Gravis GamePad\n");
+#else
+ PrintY += 13;
+ VWB_DrawPic (40,88,C_JOYSTICKPIC);
+#endif
+
+#ifdef SPEAR
+ VWB_DrawPic (112,120,C_KEYBOARDPIC);
+#endif
+
+ SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
+ #ifdef SPANISH
+ PrintX=CST_START-16;
+ US_Print(STR_CRUN);
+ PrintX=CST_START-16+CST_SPC*1;
+ US_Print(STR_COPEN);
+ PrintX=CST_START-16+CST_SPC*2;
+ US_Print(STR_CFIRE);
+ PrintX=CST_START-16+CST_SPC*3;
+ US_Print(STR_CSTRAFE"\n");
+ #else
+ PrintX=CST_START;
+ US_Print(STR_CRUN);
+ PrintX=CST_START+CST_SPC*1;
+ US_Print(STR_COPEN);
+ PrintX=CST_START+CST_SPC*2;
+ US_Print(STR_CFIRE);
+ PrintX=CST_START+CST_SPC*3;
+ US_Print(STR_CSTRAFE"\n");
+ #endif
+ DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);
+ DrawCustJoy(0);
+ US_Print("\n");
+
+
+ //
+ // KEYBOARD
+ //
+#ifndef SPEAR
+ SETFONTCOLOR(READCOLOR,BKGDCOLOR);
+ US_CPrint("Keyboard\n");
+#else
+ PrintY += 13;
+#endif
+ SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
+ #ifdef SPANISH
+ PrintX=CST_START-16;
+ US_Print(STR_CRUN);
+ PrintX=CST_START-16+CST_SPC*1;
+ US_Print(STR_COPEN);
+ PrintX=CST_START-16+CST_SPC*2;
+ US_Print(STR_CFIRE);
+ PrintX=CST_START-16+CST_SPC*3;
+ US_Print(STR_CSTRAFE"\n");
+ #else
+ PrintX=CST_START;
+ US_Print(STR_CRUN);
+ PrintX=CST_START+CST_SPC*1;
+ US_Print(STR_COPEN);
+ PrintX=CST_START+CST_SPC*2;
+ US_Print(STR_CFIRE);
+ PrintX=CST_START+CST_SPC*3;
+ US_Print(STR_CSTRAFE"\n");
+ #endif
+ DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);
+ DrawCustKeybd(0);
+ US_Print("\n");
+
+
+ //
+ // KEYBOARD MOVE KEYS
+ //
+ SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
+ #ifdef SPANISH
+ PrintX=4;
+ US_Print(STR_LEFT);
+ US_Print("/");
+ US_Print(STR_RIGHT);
+ US_Print("/");
+ US_Print(STR_FRWD);
+ US_Print("/");
+ US_Print(STR_BKWD"\n");
+ #else
+ PrintX=CST_START;
+ US_Print(STR_LEFT);
+ PrintX=CST_START+CST_SPC*1;
+ US_Print(STR_RIGHT);
+ PrintX=CST_START+CST_SPC*2;
+ US_Print(STR_FRWD);
+ PrintX=CST_START+CST_SPC*3;
+ US_Print(STR_BKWD"\n");
+ #endif
+ DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);
+ DrawCustKeys(0);
+#endif
+ //
+ // PICK STARTING POINT IN MENU
+ //
+ if (CusItems.curpos<0)
+ for (i=0;i<CusItems.amount;i++)
+ if (CusMenu[i].active)
+ {
+ CusItems.curpos=i;
+ break;
+ }
+
+
+ VW_UpdateScreen();
+ MenuFadeIn();
+}
+
+
+void PrintCustMouse(int i)
+{
+ int j;
+
+ for (j=0;j<4;j++)
+ if (order[i]==buttonmouse[j])
+ {
+ PrintX=CST_START+CST_SPC*i;
+ US_Print(mbarray[j]);
+ break;
+ }
+}
+
+void DrawCustMouse(int hilight)
+{
+ int i,color;
+
+
+ color=TEXTCOLOR;
+ if (hilight)
+ color=HIGHLIGHT;
+ SETFONTCOLOR(color,BKGDCOLOR);
+
+ if (!mouseenabled)
+ {
+ SETFONTCOLOR(DEACTIVE,BKGDCOLOR);
+ CusMenu[0].active=0;
+ }
+ else
+ CusMenu[0].active=1;
+
+ PrintY=CST_Y+13*2;
+ for (i=0;i<4;i++)
+ PrintCustMouse(i);
+}
+
+void PrintCustJoy(int i)
+{
+ int j;
+
+ for (j=0;j<4;j++)
+ if (order[i]==buttonjoy[j])
+ {
+ PrintX=CST_START+CST_SPC*i;
+ US_Print(mbarray[j]);
+ break;
+ }
+}
+
+void DrawCustJoy(int hilight)
+{
+ int i,color;
+
+
+ color=TEXTCOLOR;
+ if (hilight)
+ color=HIGHLIGHT;
+ SETFONTCOLOR(color,BKGDCOLOR);
+
+ if (!joystickenabled)
+ {
+ SETFONTCOLOR(DEACTIVE,BKGDCOLOR);
+ CusMenu[3].active=0;
+ }
+ else
+ CusMenu[3].active=1;
+
+ PrintY=CST_Y+13*5;
+ for (i=0;i<4;i++)
+ PrintCustJoy(i);
+}
+
+
+void PrintCustKeybd(int i)
+{
+ PrintX=CST_START+CST_SPC*i;
+ US_Print(IN_GetScanName(buttonscan[order[i]]));
+}
+
+void DrawCustKeybd(int hilight)
+{
+ int i,color;
+
+
+ color=TEXTCOLOR;
+ if (hilight)
+ color=HIGHLIGHT;
+ SETFONTCOLOR(color,BKGDCOLOR);
+
+ PrintY=CST_Y+13*8;
+ for (i=0;i<4;i++)
+ PrintCustKeybd(i);
+}
+
+void PrintCustKeys(int i)
+{
+ PrintX=CST_START+CST_SPC*i;
+ US_Print(IN_GetScanName(dirscan[moveorder[i]]));
+}
+
+void DrawCustKeys(int hilight)
+{
+ int i,color;
+
+
+ color=TEXTCOLOR;
+ if (hilight)
+ color=HIGHLIGHT;
+ SETFONTCOLOR(color,BKGDCOLOR);
+
+ PrintY=CST_Y+13*10;
+ for (i=0;i<4;i++)
+ PrintCustKeys(i);
+}
+
+
+////////////////////////////////////////////////////////////////////
+//
+// CHANGE SCREEN VIEWING SIZE
+//
+////////////////////////////////////////////////////////////////////
+void CP_ChangeView(void)
+{
+ int exit=0,oldview,newview;
+ ControlInfo ci;
+
+
+ WindowX=WindowY=0;
+ WindowW=320;
+ WindowH=200;
+ newview=oldview=viewwidth/16;
+ DrawChangeView(oldview);
+
+ do
+ {
+ CheckPause();
+ ReadAnyControl(&ci);
+ switch(ci.dir)
+ {
+ case dir_South:
+ case dir_West:
+ newview--;
+ if (newview<4)
+ newview=4;
+ ShowViewSize(newview);
+ VW_UpdateScreen();
+ SD_PlaySound(HITWALLSND);
+ TicDelay(10);
+ break;
+
+ case dir_North:
+ case dir_East:
+ newview++;
+ if (newview>19)
+ newview=19;
+ ShowViewSize(newview);
+ VW_UpdateScreen();
+ SD_PlaySound(HITWALLSND);
+ TicDelay(10);
+ break;
+ }
+
+ #ifndef SPEAR
+ if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))
+ #else
+ if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("debugmode"))
+ #endif
+ PicturePause();
+
+ if (ci.button0 || Keyboard[sc_Enter])
+ exit=1;
+ else
+ if (ci.button1 || Keyboard[sc_Escape])
+ {
+ viewwidth=oldview*16;
+ SD_PlaySound(ESCPRESSEDSND);
+ MenuFadeOut();
+ return;
+ }
+
+ } while(!exit);
+
+
+ if (oldview!=newview)
+ {
+ SD_PlaySound (SHOOTSND);
+ Message(STR_THINK"...");
+ NewViewSize(newview);
+ }
+
+ ShootSnd();
+ MenuFadeOut();
+}
+
+
+/////////////////////////////
+//
+// DRAW THE CHANGEVIEW SCREEN
+//
+void DrawChangeView(int view)
+{
+#ifdef JAPAN
+ CA_CacheScreen(S_CHANGEPIC);
+
+ ShowViewSize(view);
+#else
+ VWB_Bar(0,160,320,40,VIEWCOLOR);
+ ShowViewSize(view);
+
+ PrintY=161;
+ WindowX=0;
+ WindowY=320;
+ SETFONTCOLOR(HIGHLIGHT,BKGDCOLOR);
+
+ US_CPrint(STR_SIZE1"\n");
+ US_CPrint(STR_SIZE2"\n");
+ US_CPrint(STR_SIZE3);
+#endif
+ VW_UpdateScreen();
+
+ MenuFadeIn();
+}
+
+
+////////////////////////////////////////////////////////////////////
+//
+// QUIT THIS INFERNAL GAME!
+//
+////////////////////////////////////////////////////////////////////
+void CP_Quit(void)
+{
+ int i;
+
+
+ #ifdef JAPAN
+ if (GetYorN(7,11,C_QUITMSGPIC))
+ #else
+
+ #ifdef SPANISH
+ if (Confirm(ENDGAMESTR))
+ #else
+ if (Confirm(endStrings[US_RndT()&0x7+(US_RndT()&1)]))
+ #endif
+
+ #endif
+ {
+ VW_UpdateScreen();
+ SD_MusicOff();
+ SD_StopSound();
+ MenuFadeOut();
+ //
+ // SHUT-UP THE ADLIB
+ //
+ for (i=1;i<=0xf5;i++)
+ alOut(i,0);
+ Quit(NULL);
+ }
+
+ DrawMainMenu();
+}
+
+
+////////////////////////////////////////////////////////////////////
+//
+// HANDLE INTRO SCREEN (SYSTEM CONFIG)
+//
+////////////////////////////////////////////////////////////////////
+void IntroScreen(void)
+{
+#ifdef SPEAR
+
+#define MAINCOLOR 0x4f
+#define EMSCOLOR 0x4f
+#define XMSCOLOR 0x4f
+
+#else
+
+#define MAINCOLOR 0x6c
+#define EMSCOLOR 0x6c
+#define XMSCOLOR 0x6c
+
+#endif
+#define FILLCOLOR 14
+
+ long memory,emshere,xmshere;
+ int i,num,ems[10]={100,200,300,400,500,600,700,800,900,1000},
+ xms[10]={100,200,300,400,500,600,700,800,900,1000},
+ main[10]={32,64,96,128,160,192,224,256,288,320};
+
+
+ //
+ // DRAW MAIN MEMORY
+ //
+ memory=(1023l+mminfo.nearheap+mminfo.farheap)/1024l;
+ for (i=0;i<10;i++)
+ if (memory>=main[i])
+ VWB_Bar(49,163-8*i,6,5,MAINCOLOR-i);
+
+
+ //
+ // DRAW EMS MEMORY
+ //
+ if (EMSPresent)
+ {
+ emshere=4l*EMSPagesAvail;
+ for (i=0;i<10;i++)
+ if (emshere>=ems[i])
+ VWB_Bar(89,163-8*i,6,5,EMSCOLOR-i);
+ }
+
+ //
+ // DRAW XMS MEMORY
+ //
+ if (XMSPresent)
+ {
+ xmshere=4l*XMSPagesAvail;
+ for (i=0;i<10;i++)
+ if (xmshere>=xms[i])
+ VWB_Bar(129,163-8*i,6,5,XMSCOLOR-i);
+ }
+
+ //
+ // FILL BOXES
+ //
+ if (MousePresent)
+ VWB_Bar(164,82,12,2,FILLCOLOR);
+
+ if (JoysPresent[0] || JoysPresent[1])
+ VWB_Bar(164,105,12,2,FILLCOLOR);
+
+ if (AdLibPresent && !SoundBlasterPresent)
+ VWB_Bar(164,128,12,2,FILLCOLOR);
+
+ if (SoundBlasterPresent)
+ VWB_Bar(164,151,12,2,FILLCOLOR);
+
+ if (SoundSourcePresent)
+ VWB_Bar(164,174,12,2,FILLCOLOR);
+}
+
+
+////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////
+//
+// SUPPORT ROUTINES
+//
+////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////
+//
+// Clear Menu screens to dark red
+//
+////////////////////////////////////////////////////////////////////
+void ClearMScreen(void)
+{
+#ifndef SPEAR
+ VWB_Bar(0,0,320,200,BORDCOLOR);
+#else
+ VWB_DrawPic(0,0,C_BACKDROPPIC);
+#endif
+}
+
+
+////////////////////////////////////////////////////////////////////
+//
+// Un/Cache a LUMP of graphics
+//
+////////////////////////////////////////////////////////////////////
+void CacheLump(int lumpstart,int lumpend)
+{
+ int i;
+
+ for (i=lumpstart;i<=lumpend;i++)
+ CA_CacheGrChunk(i);
+}
+
+
+void UnCacheLump(int lumpstart,int lumpend)
+{
+ int i;
+
+ for (i=lumpstart;i<=lumpend;i++)
+ if (grsegs[i])
+ UNCACHEGRCHUNK(i);
+}
+
+
+////////////////////////////////////////////////////////////////////
+//
+// Draw a window for a menu
+//
+////////////////////////////////////////////////////////////////////
+void DrawWindow(int x,int y,int w,int h,int wcolor)
+{
+ VWB_Bar(x,y,w,h,wcolor);
+ DrawOutline(x,y,w,h,BORD2COLOR,DEACTIVE);
+}
+
+
+void DrawOutline(int x,int y,int w,int h,int color1,int color2)
+{
+ VWB_Hlin(x,x+w,y,color2);
+ VWB_Vlin(y,y+h,x,color2);
+ VWB_Hlin(x,x+w,y+h,color1);
+ VWB_Vlin(y,y+h,x+w,color1);
+}
+
+
+////////////////////////////////////////////////////////////////////
+//
+// Setup Control Panel stuff - graphics, etc.
+//
+////////////////////////////////////////////////////////////////////
+void SetupControlPanel(void)
+{
+ struct ffblk f;
+ char name[13];
+ int which,i;
+
+
+ //
+ // CACHE GRAPHICS & SOUNDS
+ //
+ CA_CacheGrChunk(STARTFONT+1);
+#ifndef SPEAR
+ CacheLump(CONTROLS_LUMP_START,CONTROLS_LUMP_END);
+#else
+ CacheLump(BACKDROP_LUMP_START,BACKDROP_LUMP_END);
+#endif
+
+ SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
+ fontnumber=1;
+ WindowH=200;
+
+ if (!ingame)
+ CA_LoadAllSounds();
+ else
+ MainMenu[savegame].active=1;
+
+ //
+ // SEE WHICH SAVE GAME FILES ARE AVAILABLE & READ STRING IN
+ //
+ strcpy(name,SaveName);
+ if (!findfirst(name,&f,0))
+ do
+ {
+ which=f.ff_name[7]-'0';
+ if (which<10)
+ {
+ int handle;
+ char temp[32];
+
+ SaveGamesAvail[which]=1;
+ handle=open(f.ff_name,O_BINARY);
+ read(handle,temp,32);
+ close(handle);
+ strcpy(&SaveGameNames[which][0],temp);
+ }
+ } while(!findnext(&f));
+
+ //
+ // CENTER MOUSE
+ //
+ _CX=_DX=CENTER;
+ Mouse(4);
+}
+
+
+////////////////////////////////////////////////////////////////////
+//
+// Clean up all the Control Panel stuff
+//
+////////////////////////////////////////////////////////////////////
+void CleanupControlPanel(void)
+{
+#ifndef SPEAR
+ UnCacheLump(CONTROLS_LUMP_START,CONTROLS_LUMP_END);
+#else
+ UnCacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
+#endif
+
+ fontnumber = 0;
+}
+
+
+////////////////////////////////////////////////////////////////////
+//
+// Handle moving gun around a menu
+//
+////////////////////////////////////////////////////////////////////
+int HandleMenu(CP_iteminfo *item_i,CP_itemtype far *items,void (*routine)(int w))
+{
+ char key;
+ static int redrawitem=1,lastitem=-1;
+ int i,x,y,basey,exit,which,shape,timer;
+ ControlInfo ci;
+
+
+ which=item_i->curpos;
+ x=item_i->x&-8;
+ basey=item_i->y-2;
+ y=basey+which*13;
+
+ VWB_DrawPic(x,y,C_CURSOR1PIC);
+ SetTextColor(items+which,1);
+ if (redrawitem)
+ {
+ PrintX=item_i->x+item_i->indent;
+ PrintY=item_i->y+which*13;
+ US_Print((items+which)->string);
+ }
+ //
+ // CALL CUSTOM ROUTINE IF IT IS NEEDED
+ //
+ if (routine)
+ routine(which);
+ VW_UpdateScreen();
+
+ shape=C_CURSOR1PIC;
+ timer=8;
+ exit=0;
+ TimeCount=0;
+ IN_ClearKeysDown();
+
+
+ do
+ {
+ //
+ // CHANGE GUN SHAPE
+ //
+ if (TimeCount>timer)
+ {
+ TimeCount=0;
+ if (shape==C_CURSOR1PIC)
+ {
+ shape=C_CURSOR2PIC;
+ timer=8;
+ }
+ else
+ {
+ shape=C_CURSOR1PIC;
+ timer=70;
+ }
+ VWB_DrawPic(x,y,shape);
+ if (routine)
+ routine(which);
+ VW_UpdateScreen();
+ }
+
+ CheckPause();
+
+ //
+ // SEE IF ANY KEYS ARE PRESSED FOR INITIAL CHAR FINDING
+ //
+ key=LastASCII;
+ if (key)
+ {
+ int ok=0;
+
+ //
+ // CHECK FOR SCREEN CAPTURE
+ //
+ #ifndef SPEAR
+ if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))
+ #else
+ if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("debugmode"))
+ #endif
+ PicturePause();
+
+
+ if (key>='a')
+ key-='a'-'A';
+
+ for (i=which+1;i<item_i->amount;i++)
+ if ((items+i)->active && (items+i)->string[0]==key)
+ {
+ EraseGun(item_i,items,x,y,which);
+ which=i;
+ DrawGun(item_i,items,x,&y,which,basey,routine);
+ ok=1;
+ IN_ClearKeysDown();
+ break;
+ }
+
+ //
+ // DIDN'T FIND A MATCH FIRST TIME THRU. CHECK AGAIN.
+ //
+ if (!ok)
+ {
+ for (i=0;i<which;i++)
+ if ((items+i)->active && (items+i)->string[0]==key)
+ {
+ EraseGun(item_i,items,x,y,which);
+ which=i;
+ DrawGun(item_i,items,x,&y,which,basey,routine);
+ IN_ClearKeysDown();
+ break;
+ }
+ }
+ }
+
+ //
+ // GET INPUT
+ //
+ ReadAnyControl(&ci);
+ switch(ci.dir)
+ {
+ ////////////////////////////////////////////////
+ //
+ // MOVE UP
+ //
+ case dir_North:
+
+ EraseGun(item_i,items,x,y,which);
+
+ //
+ // ANIMATE HALF-STEP
+ //
+ if (which && (items+which-1)->active)
+ {
+ y-=6;
+ DrawHalfStep(x,y);
+ }
+
+ //
+ // MOVE TO NEXT AVAILABLE SPOT
+ //
+ do
+ {
+ if (!which)
+ which=item_i->amount-1;
+ else
+ which--;
+ } while(!(items+which)->active);
+
+ DrawGun(item_i,items,x,&y,which,basey,routine);
+ //
+ // WAIT FOR BUTTON-UP OR DELAY NEXT MOVE
+ //
+ TicDelay(20);
+ break;
+
+ ////////////////////////////////////////////////
+ //
+ // MOVE DOWN
+ //
+ case dir_South:
+
+ EraseGun(item_i,items,x,y,which);
+ //
+ // ANIMATE HALF-STEP
+ //
+ if (which!=item_i->amount-1 && (items+which+1)->active)
+ {
+ y+=6;
+ DrawHalfStep(x,y);
+ }
+
+ do
+ {
+ if (which==item_i->amount-1)
+ which=0;
+ else
+ which++;
+ } while(!(items+which)->active);
+
+ DrawGun(item_i,items,x,&y,which,basey,routine);
+
+ //
+ // WAIT FOR BUTTON-UP OR DELAY NEXT MOVE
+ //
+ TicDelay(20);
+ break;
+ }
+
+ if (ci.button0 ||
+ Keyboard[sc_Space] ||
+ Keyboard[sc_Enter])
+ exit=1;
+
+ if (ci.button1 ||
+ Keyboard[sc_Escape])
+ exit=2;
+
+ } while(!exit);
+
+
+ IN_ClearKeysDown();
+
+ //
+ // ERASE EVERYTHING
+ //
+ if (lastitem!=which)
+ {
+ VWB_Bar(x-1,y,25,16,BKGDCOLOR);
+ PrintX=item_i->x+item_i->indent;
+ PrintY=item_i->y+which*13;
+ US_Print((items+which)->string);
+ redrawitem=1;
+ }
+ else
+ redrawitem=0;
+
+ if (routine)
+ routine(which);
+ VW_UpdateScreen();
+
+ item_i->curpos=which;
+
+ lastitem=which;
+ switch(exit)
+ {
+ case 1:
+ //
+ // CALL THE ROUTINE
+ //
+ if ((items+which)->routine!=NULL)
+ {
+ ShootSnd();
+ MenuFadeOut();
+ (items+which)->routine(0);
+ }
+ return which;
+
+ case 2:
+ SD_PlaySound(ESCPRESSEDSND);
+ return -1;
+ }
+
+ return 0; // JUST TO SHUT UP THE ERROR MESSAGES!
+}
+
+
+//
+// ERASE GUN & DE-HIGHLIGHT STRING
+//
+void EraseGun(CP_iteminfo *item_i,CP_itemtype far *items,int x,int y,int which)
+{
+ VWB_Bar(x-1,y,25,16,BKGDCOLOR);
+ SetTextColor(items+which,0);
+
+ PrintX=item_i->x+item_i->indent;
+ PrintY=item_i->y+which*13;
+ US_Print((items+which)->string);
+ VW_UpdateScreen();
+}
+
+
+//
+// DRAW HALF STEP OF GUN TO NEXT POSITION
+//
+void DrawHalfStep(int x,int y)
+{
+ VWB_DrawPic(x,y,C_CURSOR1PIC);
+ VW_UpdateScreen();
+ SD_PlaySound(MOVEGUN1SND);
+ TimeCount=0;
+ while(TimeCount<8);
+}
+
+
+//
+// DRAW GUN AT NEW POSITION
+//
+void DrawGun(CP_iteminfo *item_i,CP_itemtype far *items,int x,int *y,int which,int basey,void (*routine)(int w))
+{
+ VWB_Bar(x-1,*y,25,16,BKGDCOLOR);
+ *y=basey+which*13;
+ VWB_DrawPic(x,*y,C_CURSOR1PIC);
+ SetTextColor(items+which,1);
+
+ PrintX=item_i->x+item_i->indent;
+ PrintY=item_i->y+which*13;
+ US_Print((items+which)->string);
+
+ //
+ // CALL CUSTOM ROUTINE IF IT IS NEEDED
+ //
+ if (routine)
+ routine(which);
+ VW_UpdateScreen();
+ SD_PlaySound(MOVEGUN2SND);
+}
+
+////////////////////////////////////////////////////////////////////
+//
+// DELAY FOR AN AMOUNT OF TICS OR UNTIL CONTROLS ARE INACTIVE
+//
+////////////////////////////////////////////////////////////////////
+void TicDelay(int count)
+{
+ ControlInfo ci;
+
+
+ TimeCount=0;
+ do
+ {
+ ReadAnyControl(&ci);
+ } while(TimeCount<count && ci.dir!=dir_None);
+}
+
+
+////////////////////////////////////////////////////////////////////
+//
+// Draw a menu
+//
+////////////////////////////////////////////////////////////////////
+void DrawMenu(CP_iteminfo *item_i,CP_itemtype far *items)
+{
+ int i,which=item_i->curpos;
+
+
+ WindowX=PrintX=item_i->x+item_i->indent;
+ WindowY=PrintY=item_i->y;
+ WindowW=320;
+ WindowH=200;
+
+ for (i=0;i<item_i->amount;i++)
+ {
+ SetTextColor(items+i,which==i);
+
+ PrintY=item_i->y+i*13;
+ if ((items+i)->active)
+ US_Print((items+i)->string);
+ else
+ {
+ SETFONTCOLOR(DEACTIVE,BKGDCOLOR);
+ US_Print((items+i)->string);
+ SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
+ }
+
+ US_Print("\n");
+ }
+}
+
+
+////////////////////////////////////////////////////////////////////
+//
+// SET TEXT COLOR (HIGHLIGHT OR NO)
+//
+////////////////////////////////////////////////////////////////////
+void SetTextColor(CP_itemtype far *items,int hlight)
+{
+ if (hlight)
+ {SETFONTCOLOR(color_hlite[items->active],BKGDCOLOR);}
+ else
+ {SETFONTCOLOR(color_norml[items->active],BKGDCOLOR);}
+}
+
+
+////////////////////////////////////////////////////////////////////
+//
+// WAIT FOR CTRLKEY-UP OR BUTTON-UP
+//
+////////////////////////////////////////////////////////////////////
+void WaitKeyUp(void)
+{
+ ControlInfo ci;
+ while(ReadAnyControl(&ci), ci.button0|
+ ci.button1|
+ ci.button2|
+ ci.button3|
+ Keyboard[sc_Space]|
+ Keyboard[sc_Enter]|
+ Keyboard[sc_Escape]);
+}
+
+
+////////////////////////////////////////////////////////////////////
+//
+// READ KEYBOARD, JOYSTICK AND MOUSE FOR INPUT
+//
+////////////////////////////////////////////////////////////////////
+void ReadAnyControl(ControlInfo *ci)
+{
+ int mouseactive=0;
+
+
+ IN_ReadControl(0,ci);
+
+ if (mouseenabled)
+ {
+ int mousey,mousex;
+
+
+ // READ MOUSE MOTION COUNTERS
+ // RETURN DIRECTION
+ // HOME MOUSE
+ // CHECK MOUSE BUTTONS
+
+ Mouse(3);
+ mousex=_CX;
+ mousey=_DX;
+
+ if (mousey<CENTER-SENSITIVE)
+ {
+ ci->dir=dir_North;
+ _CX=_DX=CENTER;
+ Mouse(4);
+ mouseactive=1;
+ }
+ else
+ if (mousey>CENTER+SENSITIVE)
+ {
+ ci->dir=dir_South;
+ _CX=_DX=CENTER;
+ Mouse(4);
+ mouseactive=1;
+ }
+
+ if (mousex<CENTER-SENSITIVE)
+ {
+ ci->dir=dir_West;
+ _CX=_DX=CENTER;
+ Mouse(4);
+ mouseactive=1;
+ }
+ else
+ if (mousex>CENTER+SENSITIVE)
+ {
+ ci->dir=dir_East;
+ _CX=_DX=CENTER;
+ Mouse(4);
+ mouseactive=1;
+ }
+
+ if (IN_MouseButtons())
+ {
+ ci->button0=IN_MouseButtons()&1;
+ ci->button1=IN_MouseButtons()&2;
+ ci->button2=IN_MouseButtons()&4;
+ ci->button3=false;
+ mouseactive=1;
+ }
+ }
+
+ if (joystickenabled && !mouseactive)
+ {
+ int jx,jy,jb;
+
+
+ INL_GetJoyDelta(joystickport,&jx,&jy);
+ if (jy<-SENSITIVE)
+ ci->dir=dir_North;
+ else
+ if (jy>SENSITIVE)
+ ci->dir=dir_South;
+
+ if (jx<-SENSITIVE)
+ ci->dir=dir_West;
+ else
+ if (jx>SENSITIVE)
+ ci->dir=dir_East;
+
+ jb=IN_JoyButtons();
+ if (jb)
+ {
+ ci->button0=jb&1;
+ ci->button1=jb&2;
+ if (joypadenabled)
+ {
+ ci->button2=jb&4;
+ ci->button3=jb&8;
+ }
+ else
+ ci->button2=ci->button3=false;
+ }
+ }
+}
+
+
+////////////////////////////////////////////////////////////////////
+//
+// DRAW DIALOG AND CONFIRM YES OR NO TO QUESTION
+//
+////////////////////////////////////////////////////////////////////
+int Confirm(char far *string)
+{
+ int xit=0,i,x,y,tick=0,time,whichsnd[2]={ESCPRESSEDSND,SHOOTSND};
+
+
+ Message(string);
+ IN_ClearKeysDown();
+
+ //
+ // BLINK CURSOR
+ //
+ x=PrintX;
+ y=PrintY;
+ TimeCount=0;
+
+ do
+ {
+ if (TimeCount>=10)
+ {
+ switch(tick)
+ {
+ case 0:
+ VWB_Bar(x,y,8,13,TEXTCOLOR);
+ break;
+ case 1:
+ PrintX=x;
+ PrintY=y;
+ US_Print("_");
+ }
+ VW_UpdateScreen();
+ tick^=1;
+ TimeCount=0;
+ }
+
+ #ifndef SPEAR
+ if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))
+ PicturePause();
+ #endif
+
+ #ifdef SPANISH
+ } while(!Keyboard[sc_S] && !Keyboard[sc_N] && !Keyboard[sc_Escape]);
+ #else
+ } while(!Keyboard[sc_Y] && !Keyboard[sc_N] && !Keyboard[sc_Escape]);
+ #endif
+
+ #ifdef SPANISH
+ if (Keyboard[sc_S])
+ {
+ xit=1;
+ ShootSnd();
+ }
+
+ while(Keyboard[sc_S] || Keyboard[sc_N] || Keyboard[sc_Escape]);
+
+ #else
+
+ if (Keyboard[sc_Y])
+ {
+ xit=1;
+ ShootSnd();
+ }
+
+ while(Keyboard[sc_Y] || Keyboard[sc_N] || Keyboard[sc_Escape]);
+ #endif
+
+ IN_ClearKeysDown();
+ SD_PlaySound(whichsnd[xit]);
+ return xit;
+}
+
+#ifdef JAPAN
+////////////////////////////////////////////////////////////////////
+//
+// DRAW MESSAGE & GET Y OR N
+//
+////////////////////////////////////////////////////////////////////
+int GetYorN(int x,int y,int pic)
+{
+ int xit=0,whichsnd[2]={ESCPRESSEDSND,SHOOTSND};
+
+
+ CA_CacheGrChunk(pic);
+ VWB_DrawPic(x * 8,y * 8,pic);
+ UNCACHEGRCHUNK(pic);
+ VW_UpdateScreen();
+ IN_ClearKeysDown();
+
+ do
+ {
+ #ifndef SPEAR
+ if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))
+ PicturePause();
+ #endif
+
+ #ifdef SPANISH
+ } while(!Keyboard[sc_S] && !Keyboard[sc_N] && !Keyboard[sc_Escape]);
+ #else
+ } while(!Keyboard[sc_Y] && !Keyboard[sc_N] && !Keyboard[sc_Escape]);
+ #endif
+
+ #ifdef SPANISH
+ if (Keyboard[sc_S])
+ {
+ xit=1;
+ ShootSnd();
+ }
+
+ while(Keyboard[sc_S] || Keyboard[sc_N] || Keyboard[sc_Escape]);
+
+ #else
+
+ if (Keyboard[sc_Y])
+ {
+ xit=1;
+ ShootSnd();
+ }
+
+ while(Keyboard[sc_Y] || Keyboard[sc_N] || Keyboard[sc_Escape]);
+ #endif
+
+ IN_ClearKeysDown();
+ SD_PlaySound(whichsnd[xit]);
+ return xit;
+}
+#endif
+
+
+////////////////////////////////////////////////////////////////////
+//
+// PRINT A MESSAGE IN A WINDOW
+//
+////////////////////////////////////////////////////////////////////
+void Message(char far *string)
+{
+ int h=0,w=0,mw=0,i,x,y,time;
+ fontstruct _seg *font;
+
+
+ CA_CacheGrChunk (STARTFONT+1);
+ fontnumber=1;
+ font=grsegs[STARTFONT+fontnumber];
+ h=font->height;
+ for (i=0;i<_fstrlen(string);i++)
+ if (string[i]=='\n')
+ {
+ if (w>mw)
+ mw=w;
+ w=0;
+ h+=font->height;
+ }
+ else
+ w+=font->width[string[i]];
+
+ if (w+10>mw)
+ mw=w+10;
+
+ PrintY=(WindowH/2)-h/2;
+ PrintX=WindowX=160-mw/2;
+
+ DrawWindow(WindowX-5,PrintY-5,mw+10,h+10,TEXTCOLOR);
+ DrawOutline(WindowX-5,PrintY-5,mw+10,h+10,0,HIGHLIGHT);
+ SETFONTCOLOR(0,TEXTCOLOR);
+ US_Print(string);
+ VW_UpdateScreen();
+}
+
+
+////////////////////////////////////////////////////////////////////
+//
+// THIS MAY BE FIXED A LITTLE LATER...
+//
+////////////////////////////////////////////////////////////////////
+static int lastmusic;
+
+void StartCPMusic(int song)
+{
+ musicnames chunk;
+
+ if (audiosegs[STARTMUSIC + lastmusic]) // JDC
+ MM_FreePtr ((memptr *)&audiosegs[STARTMUSIC + lastmusic]);
+ lastmusic = song;
+
+ SD_MusicOff();
+ chunk = song;
+
+ MM_BombOnError (false);
+ CA_CacheAudioChunk(STARTMUSIC + chunk);
+ MM_BombOnError (true);
+ if (mmerror)
+ mmerror = false;
+ else
+ {
+ MM_SetLock(&((memptr)audiosegs[STARTMUSIC + chunk]),true);
+ SD_StartMusic((MusicGroup far *)audiosegs[STARTMUSIC + chunk]);
+ }
+}
+
+void FreeMusic (void)
+{
+ if (audiosegs[STARTMUSIC + lastmusic]) // JDC
+ MM_FreePtr ((memptr *)&audiosegs[STARTMUSIC + lastmusic]);
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+//
+// IN_GetScanName() - Returns a string containing the name of the
+// specified scan code
+//
+///////////////////////////////////////////////////////////////////////////
+byte *
+IN_GetScanName(ScanCode scan)
+{
+ byte **p;
+ ScanCode far *s;
+
+ for (s = ExtScanCodes,p = ExtScanNames;*s;p++,s++)
+ if (*s == scan)
+ return(*p);
+
+ return(ScanNames[scan]);
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+//
+// CHECK FOR PAUSE KEY (FOR MUSIC ONLY)
+//
+///////////////////////////////////////////////////////////////////////////
+void CheckPause(void)
+{
+ if (Paused)
+ {
+ switch(SoundStatus)
+ {
+ case 0: SD_MusicOn(); break;
+ case 1: SD_MusicOff(); break;
+ }
+
+ SoundStatus^=1;
+ VW_WaitVBL(3);
+ IN_ClearKeysDown();
+ Paused=false;
+ }
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+//
+// DRAW GUN CURSOR AT CORRECT POSITION IN MENU
+//
+///////////////////////////////////////////////////////////////////////////
+void DrawMenuGun(CP_iteminfo *iteminfo)
+{
+ int x,y;
+
+
+ x=iteminfo->x;
+ y=iteminfo->y+iteminfo->curpos*13-2;
+ VWB_DrawPic(x,y,C_CURSOR1PIC);
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+//
+// DRAW SCREEN TITLE STRIPES
+//
+///////////////////////////////////////////////////////////////////////////
+void DrawStripes(int y)
+{
+#ifndef SPEAR
+ VWB_Bar(0,y,320,24,0);
+ VWB_Hlin(0,319,y+22,STRIPE);
+#else
+ VWB_Bar(0,y,320,22,0);
+ VWB_Hlin(0,319,y+23,0);
+#endif
+}
+
+void ShootSnd(void)
+{
+ SD_PlaySound(SHOOTSND);
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+//
+// CHECK FOR EPISODES
+//
+///////////////////////////////////////////////////////////////////////////
+void CheckForEpisodes(void)
+{
+ struct ffblk f;
+
+//
+// JAPANESE VERSION
+//
+#ifdef JAPAN
+#ifdef JAPDEMO
+ if (!findfirst("*.WJ1",&f,FA_ARCH))
+ {
+ strcpy(extension,"WJ1");
+#else
+ if (!findfirst("*.WJ6",&f,FA_ARCH))
+ {
+ strcpy(extension,"WJ6");
+#endif
+ strcat(configname,extension);
+ strcat(SaveName,extension);
+ strcat(PageFileName,extension);
+ strcat(audioname,extension);
+ strcat(demoname,extension);
+ EpisodeSelect[1] =
+ EpisodeSelect[2] =
+ EpisodeSelect[3] =
+ EpisodeSelect[4] =
+ EpisodeSelect[5] = 1;
+ }
+ else
+ Quit("NO JAPANESE WOLFENSTEIN 3-D DATA FILES to be found!");
+#else
+
+//
+// ENGLISH
+//
+#ifndef UPLOAD
+#ifndef SPEAR
+ if (!findfirst("*.WL6",&f,FA_ARCH))
+ {
+ strcpy(extension,"WL6");
+ NewEmenu[2].active =
+ NewEmenu[4].active =
+ NewEmenu[6].active =
+ NewEmenu[8].active =
+ NewEmenu[10].active =
+ EpisodeSelect[1] =
+ EpisodeSelect[2] =
+ EpisodeSelect[3] =
+ EpisodeSelect[4] =
+ EpisodeSelect[5] = 1;
+ }
+ else
+ if (!findfirst("*.WL3",&f,FA_ARCH))
+ {
+ strcpy(extension,"WL3");
+ NewEmenu[2].active =
+ NewEmenu[4].active =
+ EpisodeSelect[1] =
+ EpisodeSelect[2] = 1;
+ }
+ else
+#endif
+#endif
+
+
+
+#ifdef SPEAR
+#ifndef SPEARDEMO
+ if (!findfirst("*.SOD",&f,FA_ARCH))
+ {
+ strcpy(extension,"SOD");
+ }
+ else
+ Quit("NO SPEAR OF DESTINY DATA FILES TO BE FOUND!");
+#else
+ if (!findfirst("*.SDM",&f,FA_ARCH))
+ {
+ strcpy(extension,"SDM");
+ }
+ else
+ Quit("NO SPEAR OF DESTINY DEMO DATA FILES TO BE FOUND!");
+#endif
+
+#else
+ if (!findfirst("*.WL1",&f,FA_ARCH))
+ {
+ strcpy(extension,"WL1");
+ }
+ else
+ Quit("NO WOLFENSTEIN 3-D DATA FILES to be found!");
+#endif
+
+ strcat(configname,extension);
+ strcat(SaveName,extension);
+ strcat(PageFileName,extension);
+ strcat(audioname,extension);
+ strcat(demoname,extension);
+#ifndef SPEAR
+#ifndef GOODTIMES
+ strcat(helpfilename,extension);
+#endif
+ strcat(endfilename,extension);
+#endif
+#endif
+}
--- /dev/null
+++ b/menu.h
@@ -1,0 +1,231 @@
+//
+// WL_MENU.H
+//
+#ifdef SPEAR
+
+#define BORDCOLOR 0x99
+#define BORD2COLOR 0x93
+#define DEACTIVE 0x9b
+#define BKGDCOLOR 0x9d
+//#define STRIPE 0x9c
+
+#define MenuFadeOut() VL_FadeOut(0,255,0,0,51,10)
+
+#else
+
+#define BORDCOLOR 0x29
+#define BORD2COLOR 0x23
+#define DEACTIVE 0x2b
+#define BKGDCOLOR 0x2d
+#define STRIPE 0x2c
+
+#define MenuFadeOut() VL_FadeOut(0,255,43,0,0,10)
+
+#endif
+
+#define READCOLOR 0x4a
+#define READHCOLOR 0x47
+#define VIEWCOLOR 0x7f
+#define TEXTCOLOR 0x17
+#define HIGHLIGHT 0x13
+#define MenuFadeIn() VL_FadeIn(0,255,&gamepal,10)
+
+
+#define MENUSONG WONDERIN_MUS
+
+#ifndef SPEAR
+#define INTROSONG NAZI_NOR_MUS
+#else
+#define INTROSONG XTOWER2_MUS
+#endif
+
+#define SENSITIVE 60
+#define CENTER SENSITIVE*2
+
+#define MENU_X 76
+#define MENU_Y 55
+#define MENU_W 178
+#ifndef SPEAR
+#define MENU_H 13*10+6
+#else
+#define MENU_H 13*9+6
+#endif
+
+#define SM_X 48
+#define SM_W 250
+
+#define SM_Y1 20
+#define SM_H1 4*13-7
+#define SM_Y2 SM_Y1+5*13
+#define SM_H2 4*13-7
+#define SM_Y3 SM_Y2+5*13
+#define SM_H3 3*13-7
+
+#define CTL_X 24
+#define CTL_Y 70
+#define CTL_W 284
+#define CTL_H 13*7-7
+
+#define LSM_X 85
+#define LSM_Y 55
+#define LSM_W 175
+#define LSM_H 10*13+10
+
+#define NM_X 50
+#define NM_Y 100
+#define NM_W 225
+#define NM_H 13*4+15
+
+#define NE_X 10
+#define NE_Y 23
+#define NE_W 320-NE_X*2
+#define NE_H 200-NE_Y*2
+
+#define CST_X 20
+#define CST_Y 48
+#define CST_START 60
+#define CST_SPC 60
+
+
+//
+// TYPEDEFS
+//
+typedef struct {
+ int x,y,amount,curpos,indent;
+ } CP_iteminfo;
+
+typedef struct {
+ int active;
+ char string[36];
+ void (* routine)(int temp1);
+ } CP_itemtype;
+
+typedef struct {
+ int allowed[4];
+ } CustomCtrls;
+
+extern CP_itemtype far MainMenu[],far NewEMenu[];
+extern CP_iteminfo MainItems;
+
+//
+// FUNCTION PROTOTYPES
+//
+void SetupControlPanel(void);
+void CleanupControlPanel(void);
+
+void DrawMenu(CP_iteminfo *item_i,CP_itemtype far *items);
+int HandleMenu(CP_iteminfo *item_i,
+ CP_itemtype far *items,
+ void (*routine)(int w));
+void ClearMScreen(void);
+void DrawWindow(int x,int y,int w,int h,int wcolor);
+void DrawOutline(int x,int y,int w,int h,int color1,int color2);
+void WaitKeyUp(void);
+void ReadAnyControl(ControlInfo *ci);
+void TicDelay(int count);
+void CacheLump(int lumpstart,int lumpend);
+void UnCacheLump(int lumpstart,int lumpend);
+void StartCPMusic(int song);
+int Confirm(char far *string);
+void Message(char far *string);
+void CheckPause(void);
+void ShootSnd(void);
+void CheckSecretMissions(void);
+void BossKey(void);
+
+void DrawGun(CP_iteminfo *item_i,CP_itemtype far *items,int x,int *y,int which,int basey,void (*routine)(int w));
+void DrawHalfStep(int x,int y);
+void EraseGun(CP_iteminfo *item_i,CP_itemtype far *items,int x,int y,int which);
+void SetTextColor(CP_itemtype far *items,int hlight);
+void DrawMenuGun(CP_iteminfo *iteminfo);
+void DrawStripes(int y);
+
+void DefineMouseBtns(void);
+void DefineJoyBtns(void);
+void DefineKeyBtns(void);
+void DefineKeyMove(void);
+void EnterCtrlData(int index,CustomCtrls *cust,void (*DrawRtn)(int),void (*PrintRtn)(int),int type);
+
+void DrawMainMenu(void);
+void DrawSoundMenu(void);
+void DrawLoadSaveScreen(int loadsave);
+void DrawNewEpisode(void);
+void DrawNewGame(void);
+void DrawChangeView(int view);
+void DrawMouseSens(void);
+void DrawCtlScreen(void);
+void DrawCustomScreen(void);
+void DrawLSAction(int which);
+void DrawCustMouse(int hilight);
+void DrawCustJoy(int hilight);
+void DrawCustKeybd(int hilight);
+void DrawCustKeys(int hilight);
+void PrintCustMouse(int i);
+void PrintCustJoy(int i);
+void PrintCustKeybd(int i);
+void PrintCustKeys(int i);
+
+void PrintLSEntry(int w,int color);
+void TrackWhichGame(int w);
+void DrawNewGameDiff(int w);
+void FixupCustom(int w);
+
+void CP_NewGame(void);
+void CP_Sound(void);
+int CP_LoadGame(int quick);
+int CP_SaveGame(int quick);
+void CP_Control(void);
+void CP_ChangeView(void);
+void CP_ExitOptions(void);
+void CP_Quit(void);
+void CP_ViewScores(void);
+int CP_EndGame(void);
+int CP_CheckQuick(unsigned scancode);
+void CustomControls(void);
+void MouseSensitivity(void);
+
+void CheckForEpisodes(void);
+
+//
+// VARIABLES
+//
+extern int SaveGamesAvail[10],StartGame,SoundStatus;
+extern char SaveGameNames[10][32],SaveName[13];
+
+enum {MOUSE,JOYSTICK,KEYBOARDBTNS,KEYBOARDMOVE}; // FOR INPUT TYPES
+
+enum
+{
+ newgame,
+ soundmenu,
+ control,
+ loadgame,
+ savegame,
+ changeview,
+
+#ifndef GOODTIMES
+#ifndef SPEAR
+ readthis,
+#endif
+#endif
+
+ viewscores,
+ backtodemo,
+ quit
+} menuitems;
+
+//
+// WL_INTER
+//
+typedef struct {
+ int kill,secret,treasure;
+ long time;
+ } LRstruct;
+
+extern LRstruct LevelRatios[];
+
+void Write (int x,int y,char *string);
+void NonShareware(void);
+int GetYorN(int x,int y,int pic);
+
+
--- /dev/null
+++ b/mm.c
@@ -1,0 +1,953 @@
+// NEWMM.C
+
+/*
+=============================================================================
+
+ ID software memory manager
+ --------------------------
+
+Primary coder: John Carmack
+
+RELIES ON
+---------
+Quit (char *error) function
+
+
+WORK TO DO
+----------
+MM_SizePtr to change the size of a given pointer
+
+Multiple purge levels utilized
+
+EMS / XMS unmanaged routines
+
+=============================================================================
+*/
+
+#include "ID_HEADS.H"
+#pragma hdrstop
+
+#pragma warn -pro
+#pragma warn -use
+
+/*
+=============================================================================
+
+ LOCAL INFO
+
+=============================================================================
+*/
+
+#define LOCKBIT 0x80 // if set in attributes, block cannot be moved
+#define PURGEBITS 3 // 0-3 level, 0= unpurgable, 3= purge first
+#define PURGEMASK 0xfffc
+#define BASEATTRIBUTES 0 // unlocked, non purgable
+
+#define MAXUMBS 10
+
+typedef struct mmblockstruct
+{
+ unsigned start,length;
+ unsigned attributes;
+ memptr *useptr; // pointer to the segment start
+ struct mmblockstruct far *next;
+} mmblocktype;
+
+
+//#define GETNEWBLOCK {if(!(mmnew=mmfree))Quit("MM_GETNEWBLOCK: No free blocks!")\
+// ;mmfree=mmfree->next;}
+
+#define GETNEWBLOCK {if(!mmfree)MML_ClearBlock();mmnew=mmfree;mmfree=mmfree->next;}
+
+#define FREEBLOCK(x) {*x->useptr=NULL;x->next=mmfree;mmfree=x;}
+
+/*
+=============================================================================
+
+ GLOBAL VARIABLES
+
+=============================================================================
+*/
+
+mminfotype mminfo;
+memptr bufferseg;
+boolean mmerror;
+
+void (* beforesort) (void);
+void (* aftersort) (void);
+
+/*
+=============================================================================
+
+ LOCAL VARIABLES
+
+=============================================================================
+*/
+
+boolean mmstarted;
+
+void far *farheap;
+void *nearheap;
+
+mmblocktype far mmblocks[MAXBLOCKS]
+ ,far *mmhead,far *mmfree,far *mmrover,far *mmnew;
+
+boolean bombonerror;
+
+//unsigned totalEMSpages,freeEMSpages,EMSpageframe,EMSpagesmapped,EMShandle;
+
+void (* XMSaddr) (void); // far pointer to XMS driver
+
+unsigned numUMBs,UMBbase[MAXUMBS];
+
+//==========================================================================
+
+//
+// local prototypes
+//
+
+boolean MML_CheckForEMS (void);
+void MML_ShutdownEMS (void);
+void MM_MapEMS (void);
+boolean MML_CheckForXMS (void);
+void MML_ShutdownXMS (void);
+void MML_UseSpace (unsigned segstart, unsigned seglength);
+void MML_ClearBlock (void);
+
+//==========================================================================
+
+/*
+======================
+=
+= MML_CheckForXMS
+=
+= Check for XMM driver
+=
+=======================
+*/
+
+boolean MML_CheckForXMS (void)
+{
+ numUMBs = 0;
+
+asm {
+ mov ax,0x4300
+ int 0x2f // query status of installed diver
+ cmp al,0x80
+ je good
+ }
+
+ return false;
+good:
+ return true;
+}
+
+
+/*
+======================
+=
+= MML_SetupXMS
+=
+= Try to allocate all upper memory block
+=
+=======================
+*/
+
+void MML_SetupXMS (void)
+{
+ unsigned base,size;
+
+asm {
+ mov ax,0x4310
+ int 0x2f
+ mov [WORD PTR XMSaddr],bx
+ mov [WORD PTR XMSaddr+2],es // function pointer to XMS driver
+ }
+
+getmemory:
+asm {
+ mov ah,XMS_ALLOCUMB
+ mov dx,0xffff // try for largest block possible
+ call [DWORD PTR XMSaddr]
+ or ax,ax
+ jnz gotone
+
+ cmp bl,0xb0 // error: smaller UMB is available
+ jne done;
+
+ mov ah,XMS_ALLOCUMB
+ call [DWORD PTR XMSaddr] // DX holds largest available UMB
+ or ax,ax
+ jz done // another error...
+ }
+
+gotone:
+asm {
+ mov [base],bx
+ mov [size],dx
+ }
+ MML_UseSpace (base,size);
+ mminfo.XMSmem += size*16;
+ UMBbase[numUMBs] = base;
+ numUMBs++;
+ if (numUMBs < MAXUMBS)
+ goto getmemory;
+
+done:;
+}
+
+
+/*
+======================
+=
+= MML_ShutdownXMS
+=
+======================
+*/
+
+void MML_ShutdownXMS (void)
+{
+ int i;
+ unsigned base;
+
+ for (i=0;i<numUMBs;i++)
+ {
+ base = UMBbase[i];
+
+asm mov ah,XMS_FREEUMB
+asm mov dx,[base]
+asm call [DWORD PTR XMSaddr]
+ }
+}
+
+//==========================================================================
+
+/*
+======================
+=
+= MML_UseSpace
+=
+= Marks a range of paragraphs as usable by the memory manager
+= This is used to mark space for the near heap, far heap, ems page frame,
+= and upper memory blocks
+=
+======================
+*/
+
+void MML_UseSpace (unsigned segstart, unsigned seglength)
+{
+ mmblocktype far *scan,far *last;
+ unsigned oldend;
+ long extra;
+
+ scan = last = mmhead;
+ mmrover = mmhead; // reset rover to start of memory
+
+//
+// search for the block that contains the range of segments
+//
+ while (scan->start+scan->length < segstart)
+ {
+ last = scan;
+ scan = scan->next;
+ }
+
+//
+// take the given range out of the block
+//
+ oldend = scan->start + scan->length;
+ extra = oldend - (segstart+seglength);
+ if (extra < 0)
+ Quit ("MML_UseSpace: Segment spans two blocks!");
+
+ if (segstart == scan->start)
+ {
+ last->next = scan->next; // unlink block
+ FREEBLOCK(scan);
+ scan = last;
+ }
+ else
+ scan->length = segstart-scan->start; // shorten block
+
+ if (extra > 0)
+ {
+ GETNEWBLOCK;
+ mmnew->useptr = NULL;
+
+ mmnew->next = scan->next;
+ scan->next = mmnew;
+ mmnew->start = segstart+seglength;
+ mmnew->length = extra;
+ mmnew->attributes = LOCKBIT;
+ }
+
+}
+
+//==========================================================================
+
+/*
+====================
+=
+= MML_ClearBlock
+=
+= We are out of blocks, so free a purgable block
+=
+====================
+*/
+
+void MML_ClearBlock (void)
+{
+ mmblocktype far *scan,far *last;
+
+ scan = mmhead->next;
+
+ while (scan)
+ {
+ if (!(scan->attributes&LOCKBIT) && (scan->attributes&PURGEBITS) )
+ {
+ MM_FreePtr(scan->useptr);
+ return;
+ }
+ scan = scan->next;
+ }
+
+ Quit ("MM_ClearBlock: No purgable blocks!");
+}
+
+
+//==========================================================================
+
+/*
+===================
+=
+= MM_Startup
+=
+= Grabs all space from turbo with malloc/farmalloc
+= Allocates bufferseg misc buffer
+=
+===================
+*/
+
+static char *ParmStrings[] = {"noems","noxms",""};
+
+void MM_Startup (void)
+{
+ int i;
+ unsigned long length;
+ void far *start;
+ unsigned segstart,seglength,endfree;
+
+ if (mmstarted)
+ MM_Shutdown ();
+
+
+ mmstarted = true;
+ bombonerror = true;
+//
+// set up the linked list (everything in the free list;
+//
+ mmhead = NULL;
+ mmfree = &mmblocks[0];
+ for (i=0;i<MAXBLOCKS-1;i++)
+ mmblocks[i].next = &mmblocks[i+1];
+ mmblocks[i].next = NULL;
+
+//
+// locked block of all memory until we punch out free space
+//
+ GETNEWBLOCK;
+ mmhead = mmnew; // this will allways be the first node
+ mmnew->start = 0;
+ mmnew->length = 0xffff;
+ mmnew->attributes = LOCKBIT;
+ mmnew->next = NULL;
+ mmrover = mmhead;
+
+
+//
+// get all available near conventional memory segments
+//
+ length=coreleft();
+ start = (void far *)(nearheap = malloc(length));
+
+ length -= 16-(FP_OFF(start)&15);
+ length -= SAVENEARHEAP;
+ seglength = length / 16; // now in paragraphs
+ segstart = FP_SEG(start)+(FP_OFF(start)+15)/16;
+ MML_UseSpace (segstart,seglength);
+ mminfo.nearheap = length;
+
+//
+// get all available far conventional memory segments
+//
+ length=farcoreleft();
+ start = farheap = farmalloc(length);
+ length -= 16-(FP_OFF(start)&15);
+ length -= SAVEFARHEAP;
+ seglength = length / 16; // now in paragraphs
+ segstart = FP_SEG(start)+(FP_OFF(start)+15)/16;
+ MML_UseSpace (segstart,seglength);
+ mminfo.farheap = length;
+ mminfo.mainmem = mminfo.nearheap + mminfo.farheap;
+
+//
+// allocate the misc buffer
+//
+ mmrover = mmhead; // start looking for space after low block
+
+ MM_GetPtr (&bufferseg,BUFFERSIZE);
+}
+
+//==========================================================================
+
+/*
+====================
+=
+= MM_Shutdown
+=
+= Frees all conventional, EMS, and XMS allocated
+=
+====================
+*/
+
+void MM_Shutdown (void)
+{
+ if (!mmstarted)
+ return;
+
+ farfree (farheap);
+ free (nearheap);
+// MML_ShutdownXMS ();
+}
+
+//==========================================================================
+
+/*
+====================
+=
+= MM_GetPtr
+=
+= Allocates an unlocked, unpurgable block
+=
+====================
+*/
+
+void MM_GetPtr (memptr *baseptr,unsigned long size)
+{
+ mmblocktype far *scan,far *lastscan,far *endscan
+ ,far *purge,far *next;
+ int search;
+ unsigned needed,startseg;
+
+ needed = (size+15)/16; // convert size from bytes to paragraphs
+
+ GETNEWBLOCK; // fill in start and next after a spot is found
+ mmnew->length = needed;
+ mmnew->useptr = baseptr;
+ mmnew->attributes = BASEATTRIBUTES;
+
+tryagain:
+ for (search = 0; search<3; search++)
+ {
+ //
+ // first search: try to allocate right after the rover, then on up
+ // second search: search from the head pointer up to the rover
+ // third search: compress memory, then scan from start
+ if (search == 1 && mmrover == mmhead)
+ search++;
+
+ switch (search)
+ {
+ case 0:
+ lastscan = mmrover;
+ scan = mmrover->next;
+ endscan = NULL;
+ break;
+ case 1:
+ lastscan = mmhead;
+ scan = mmhead->next;
+ endscan = mmrover;
+ break;
+ case 2:
+ MM_SortMem ();
+ lastscan = mmhead;
+ scan = mmhead->next;
+ endscan = NULL;
+ break;
+ }
+
+ startseg = lastscan->start + lastscan->length;
+
+ while (scan != endscan)
+ {
+ if (scan->start - startseg >= needed)
+ {
+ //
+ // got enough space between the end of lastscan and
+ // the start of scan, so throw out anything in the middle
+ // and allocate the new block
+ //
+ purge = lastscan->next;
+ lastscan->next = mmnew;
+ mmnew->start = *(unsigned *)baseptr = startseg;
+ mmnew->next = scan;
+ while ( purge != scan)
+ { // free the purgable block
+ next = purge->next;
+ FREEBLOCK(purge);
+ purge = next; // purge another if not at scan
+ }
+ mmrover = mmnew;
+ return; // good allocation!
+ }
+
+ //
+ // if this block is purge level zero or locked, skip past it
+ //
+ if ( (scan->attributes & LOCKBIT)
+ || !(scan->attributes & PURGEBITS) )
+ {
+ lastscan = scan;
+ startseg = lastscan->start + lastscan->length;
+ }
+
+
+ scan=scan->next; // look at next line
+ }
+ }
+
+ if (bombonerror)
+ {
+
+extern char configname[];
+extern boolean insetupscaling;
+extern int viewsize;
+boolean SetViewSize (unsigned width, unsigned height);
+#define HEIGHTRATIO 0.50
+//
+// wolf hack -- size the view down
+//
+ if (!insetupscaling && viewsize>10)
+ {
+mmblocktype far *savedmmnew;
+ savedmmnew = mmnew;
+ viewsize -= 2;
+ SetViewSize (viewsize*16,viewsize*16*HEIGHTRATIO);
+ mmnew = savedmmnew;
+ goto tryagain;
+ }
+
+// unlink(configname);
+ Quit ("MM_GetPtr: Out of memory!");
+ }
+ else
+ mmerror = true;
+}
+
+//==========================================================================
+
+/*
+====================
+=
+= MM_FreePtr
+=
+= Deallocates an unlocked, purgable block
+=
+====================
+*/
+
+void MM_FreePtr (memptr *baseptr)
+{
+ mmblocktype far *scan,far *last;
+
+ last = mmhead;
+ scan = last->next;
+
+ if (baseptr == mmrover->useptr) // removed the last allocated block
+ mmrover = mmhead;
+
+ while (scan->useptr != baseptr && scan)
+ {
+ last = scan;
+ scan = scan->next;
+ }
+
+ if (!scan)
+ Quit ("MM_FreePtr: Block not found!");
+
+ last->next = scan->next;
+
+ FREEBLOCK(scan);
+}
+//==========================================================================
+
+/*
+=====================
+=
+= MM_SetPurge
+=
+= Sets the purge level for a block (locked blocks cannot be made purgable)
+=
+=====================
+*/
+
+void MM_SetPurge (memptr *baseptr, int purge)
+{
+ mmblocktype far *start;
+
+ start = mmrover;
+
+ do
+ {
+ if (mmrover->useptr == baseptr)
+ break;
+
+ mmrover = mmrover->next;
+
+ if (!mmrover)
+ mmrover = mmhead;
+ else if (mmrover == start)
+ Quit ("MM_SetPurge: Block not found!");
+
+ } while (1);
+
+ mmrover->attributes &= ~PURGEBITS;
+ mmrover->attributes |= purge;
+}
+
+//==========================================================================
+
+/*
+=====================
+=
+= MM_SetLock
+=
+= Locks / unlocks the block
+=
+=====================
+*/
+
+void MM_SetLock (memptr *baseptr, boolean locked)
+{
+ mmblocktype far *start;
+
+ start = mmrover;
+
+ do
+ {
+ if (mmrover->useptr == baseptr)
+ break;
+
+ mmrover = mmrover->next;
+
+ if (!mmrover)
+ mmrover = mmhead;
+ else if (mmrover == start)
+ Quit ("MM_SetLock: Block not found!");
+
+ } while (1);
+
+ mmrover->attributes &= ~LOCKBIT;
+ mmrover->attributes |= locked*LOCKBIT;
+}
+
+//==========================================================================
+
+/*
+=====================
+=
+= MM_SortMem
+=
+= Throws out all purgable stuff and compresses movable blocks
+=
+=====================
+*/
+
+void MM_SortMem (void)
+{
+ mmblocktype far *scan,far *last,far *next;
+ unsigned start,length,source,dest;
+ int playing;
+
+ //
+ // lock down a currently playing sound
+ //
+ playing = SD_SoundPlaying ();
+ if (playing)
+ {
+ switch (SoundMode)
+ {
+ case sdm_PC:
+ playing += STARTPCSOUNDS;
+ break;
+ case sdm_AdLib:
+ playing += STARTADLIBSOUNDS;
+ break;
+ }
+ MM_SetLock(&(memptr)audiosegs[playing],true);
+ }
+
+
+ SD_StopSound();
+
+ if (beforesort)
+ beforesort();
+
+ scan = mmhead;
+
+ last = NULL; // shut up compiler warning
+
+ while (scan)
+ {
+ if (scan->attributes & LOCKBIT)
+ {
+ //
+ // block is locked, so try to pile later blocks right after it
+ //
+ start = scan->start + scan->length;
+ }
+ else
+ {
+ if (scan->attributes & PURGEBITS)
+ {
+ //
+ // throw out the purgable block
+ //
+ next = scan->next;
+ FREEBLOCK(scan);
+ last->next = next;
+ scan = next;
+ continue;
+ }
+ else
+ {
+ //
+ // push the non purgable block on top of the last moved block
+ //
+ if (scan->start != start)
+ {
+ length = scan->length;
+ source = scan->start;
+ dest = start;
+ while (length > 0xf00)
+ {
+ movedata(source,0,dest,0,0xf00*16);
+ length -= 0xf00;
+ source += 0xf00;
+ dest += 0xf00;
+ }
+ movedata(source,0,dest,0,length*16);
+
+ scan->start = start;
+ *(unsigned *)scan->useptr = start;
+ }
+ start = scan->start + scan->length;
+ }
+ }
+
+ last = scan;
+ scan = scan->next; // go to next block
+ }
+
+ mmrover = mmhead;
+
+ if (aftersort)
+ aftersort();
+
+ if (playing)
+ MM_SetLock(&(memptr)audiosegs[playing],false);
+}
+
+
+//==========================================================================
+
+/*
+=====================
+=
+= MM_ShowMemory
+=
+=====================
+*/
+
+void MM_ShowMemory (void)
+{
+ mmblocktype far *scan;
+ unsigned color,temp,x,y;
+ long end,owner;
+ char scratch[80],str[10];
+
+ temp = bufferofs;
+ bufferofs = displayofs;
+ scan = mmhead;
+
+ end = -1;
+
+ while (scan)
+ {
+ if (scan->attributes & PURGEBITS)
+ color = 5; // dark purple = purgable
+ else
+ color = 9; // medium blue = non purgable
+ if (scan->attributes & LOCKBIT)
+ color = 12; // red = locked
+ if (scan->start<=end)
+ Quit ("MM_ShowMemory: Memory block order currupted!");
+ end = scan->length-1;
+ y = scan->start/320;
+ x = scan->start%320;
+ VW_Hlin(x,x+end,y,color);
+ VW_Plot(x,y,15);
+ if (scan->next && scan->next->start > end+1)
+ VW_Hlin(x+end+1,x+(scan->next->start-scan->start),y,0); // black = free
+
+ scan = scan->next;
+ }
+
+ VW_FadeIn ();
+ IN_Ack();
+
+ bufferofs = temp;
+}
+
+//==========================================================================
+
+/*
+=====================
+=
+= MM_DumpData
+=
+=====================
+*/
+
+void MM_DumpData (void)
+{
+ mmblocktype far *scan,far *best;
+ long lowest,oldlowest;
+ unsigned owner;
+ char lock,purge;
+ FILE *dumpfile;
+
+
+ free (nearheap);
+ dumpfile = fopen ("MMDUMP.TXT","w");
+ if (!dumpfile)
+ Quit ("MM_DumpData: Couldn't open MMDUMP.TXT!");
+
+ lowest = -1;
+ do
+ {
+ oldlowest = lowest;
+ lowest = 0xffff;
+
+ scan = mmhead;
+ while (scan)
+ {
+ owner = (unsigned)scan->useptr;
+
+ if (owner && owner<lowest && owner > oldlowest)
+ {
+ best = scan;
+ lowest = owner;
+ }
+
+ scan = scan->next;
+ }
+
+ if (lowest != 0xffff)
+ {
+ if (best->attributes & PURGEBITS)
+ purge = 'P';
+ else
+ purge = '-';
+ if (best->attributes & LOCKBIT)
+ lock = 'L';
+ else
+ lock = '-';
+ fprintf (dumpfile,"0x%p (%c%c) = %u\n"
+ ,(unsigned)lowest,lock,purge,best->length);
+ }
+
+ } while (lowest != 0xffff);
+
+ fclose (dumpfile);
+ Quit ("MMDUMP.TXT created.");
+}
+
+//==========================================================================
+
+
+/*
+======================
+=
+= MM_UnusedMemory
+=
+= Returns the total free space without purging
+=
+======================
+*/
+
+long MM_UnusedMemory (void)
+{
+ unsigned free;
+ mmblocktype far *scan;
+
+ free = 0;
+ scan = mmhead;
+
+ while (scan->next)
+ {
+ free += scan->next->start - (scan->start + scan->length);
+ scan = scan->next;
+ }
+
+ return free*16l;
+}
+
+//==========================================================================
+
+
+/*
+======================
+=
+= MM_TotalFree
+=
+= Returns the total free space with purging
+=
+======================
+*/
+
+long MM_TotalFree (void)
+{
+ unsigned free;
+ mmblocktype far *scan;
+
+ free = 0;
+ scan = mmhead;
+
+ while (scan->next)
+ {
+ if ((scan->attributes&PURGEBITS) && !(scan->attributes&LOCKBIT))
+ free += scan->length;
+ free += scan->next->start - (scan->start + scan->length);
+ scan = scan->next;
+ }
+
+ return free*16l;
+}
+
+//==========================================================================
+
+/*
+=====================
+=
+= MM_BombOnError
+=
+=====================
+*/
+
+void MM_BombOnError (boolean bomb)
+{
+ bombonerror = bomb;
+}
+
+
--- /dev/null
+++ b/mm.h
@@ -1,0 +1,96 @@
+// ID_MM.H
+
+#ifndef __ID_CA__
+
+#define __ID_CA__
+
+#define SAVENEARHEAP 0x400 // space to leave in data segment
+#define SAVEFARHEAP 0 // space to leave in far heap
+
+#define BUFFERSIZE 0x1000 // miscelanious, allways available buffer
+
+#define MAXBLOCKS 700
+
+
+//--------
+
+#define EMS_INT 0x67
+
+#define EMS_STATUS 0x40
+#define EMS_GETFRAME 0x41
+#define EMS_GETPAGES 0x42
+#define EMS_ALLOCPAGES 0x43
+#define EMS_MAPPAGE 0x44
+#define EMS_FREEPAGES 0x45
+#define EMS_VERSION 0x46
+
+//--------
+
+#define XMS_INT 0x2f
+#define XMS_CALL(v) _AH = (v);\
+ asm call [DWORD PTR XMSDriver]
+
+#define XMS_VERSION 0x00
+
+#define XMS_ALLOCHMA 0x01
+#define XMS_FREEHMA 0x02
+
+#define XMS_GENABLEA20 0x03
+#define XMS_GDISABLEA20 0x04
+#define XMS_LENABLEA20 0x05
+#define XMS_LDISABLEA20 0x06
+#define XMS_QUERYA20 0x07
+
+#define XMS_QUERYFREE 0x08
+#define XMS_ALLOC 0x09
+#define XMS_FREE 0x0A
+#define XMS_MOVE 0x0B
+#define XMS_LOCK 0x0C
+#define XMS_UNLOCK 0x0D
+#define XMS_GETINFO 0x0E
+#define XMS_RESIZE 0x0F
+
+#define XMS_ALLOCUMB 0x10
+#define XMS_FREEUMB 0x11
+
+//==========================================================================
+
+typedef void _seg * memptr;
+
+typedef struct
+{
+ long nearheap,farheap,EMSmem,XMSmem,mainmem;
+} mminfotype;
+
+//==========================================================================
+
+extern mminfotype mminfo;
+extern memptr bufferseg;
+extern boolean mmerror;
+
+extern void (* beforesort) (void);
+extern void (* aftersort) (void);
+
+//==========================================================================
+
+void MM_Startup (void);
+void MM_Shutdown (void);
+void MM_MapEMS (void);
+
+void MM_GetPtr (memptr *baseptr,unsigned long size);
+void MM_FreePtr (memptr *baseptr);
+
+void MM_SetPurge (memptr *baseptr, int purge);
+void MM_SetLock (memptr *baseptr, boolean locked);
+void MM_SortMem (void);
+
+void MM_ShowMemory (void);
+
+long MM_UnusedMemory (void);
+long MM_TotalFree (void);
+
+void MM_BombOnError (boolean bomb);
+
+void MML_UseSpace (unsigned segstart, unsigned seglength);
+
+#endif
\ No newline at end of file
--- /dev/null
+++ b/munge.c
@@ -1,0 +1,48 @@
+
+/*
+=================
+=
+= VL_MungePic
+=
+=================
+*/
+
+void VL_MungePic (unsigned char far *source, unsigned width, unsigned height)
+{
+ unsigned x,y,plane,size,pwidth;
+ unsigned char far *temp, far *dest, far *srcline;
+
+ size = width*height;
+
+ if (width&3)
+ errout ("VL_MungePic: Not divisable by 4!\n");
+
+//
+// copy the pic to a temp buffer
+//
+ temp = (unsigned char far *)farmalloc (size);
+ if (!temp)
+ errout ("Non enough memory for munge buffer!\n");
+
+ _fmemcpy (temp,source,size);
+
+//
+// munge it back into the original buffer
+//
+ dest = source;
+ pwidth = width/4;
+
+ for (plane=0;plane<4;plane++)
+ {
+ srcline = temp;
+ for (y=0;y<height;y++)
+ {
+ for (x=0;x<pwidth;x++)
+ *dest++ = *(srcline+x*4+plane);
+ srcline+=width;
+ }
+ }
+
+ free (temp);
+}
+
--- /dev/null
+++ b/oldscale.c
@@ -1,0 +1,737 @@
+// WL_SCALE.C
+
+#include "WL_DEF.H"
+#pragma hdrstop
+
+#define OP_RETF 0xcb
+
+/*
+=============================================================================
+
+ GLOBALS
+
+=============================================================================
+*/
+
+t_compscale _seg *scaledirectory[MAXSCALEHEIGHT+1];
+long fullscalefarcall[MAXSCALEHEIGHT+1];
+
+int maxscale,maxscaleshl2;
+
+/*
+=============================================================================
+
+ LOCALS
+
+=============================================================================
+*/
+
+t_compscale _seg *work;
+unsigned BuildCompScale (int height, memptr *finalspot);
+
+int stepbytwo;
+
+//===========================================================================
+
+/*
+==============
+=
+= BadScale
+=
+==============
+*/
+
+void far BadScale (void)
+{
+ Quit ("BadScale called!");
+}
+
+
+/*
+==========================
+=
+= SetupScaling
+=
+==========================
+*/
+
+void SetupScaling (int maxscaleheight)
+{
+ int i,x,y;
+ byte far *dest;
+
+ maxscaleheight/=2; // one scaler every two pixels
+
+ maxscale = maxscaleheight-1;
+ maxscaleshl2 = maxscale<<2;
+
+//
+// free up old scalers
+//
+ for (i=1;i<MAXSCALEHEIGHT;i++)
+ {
+ if (scaledirectory[i])
+ MM_FreePtr (&(memptr)scaledirectory[i]);
+ if (i>=stepbytwo)
+ i += 2;
+ }
+ memset (scaledirectory,0,sizeof(scaledirectory));
+
+ MM_SortMem ();
+
+//
+// build the compiled scalers
+//
+ stepbytwo = viewheight/2; // save space by double stepping
+ MM_GetPtr (&(memptr)work,20000);
+ if (mmerror)
+ return;
+
+ for (i=1;i<=maxscaleheight;i++)
+ {
+ BuildCompScale (i*2,&(memptr)scaledirectory[i]);
+ if (mmerror)
+ {
+ MM_FreePtr (&(memptr)work);
+ return;
+ }
+ if (i>=stepbytwo)
+ i+= 2;
+ }
+ MM_FreePtr (&(memptr)work);
+
+//
+// compact memory and lock down scalers
+//
+ MM_SortMem ();
+ for (i=1;i<=maxscaleheight;i++)
+ {
+ MM_SetLock (&(memptr)scaledirectory[i],true);
+ fullscalefarcall[i] = (unsigned)scaledirectory[i];
+ fullscalefarcall[i] <<=16;
+ fullscalefarcall[i] += scaledirectory[i]->codeofs[0];
+ if (i>=stepbytwo)
+ {
+ scaledirectory[i+1] = scaledirectory[i];
+ fullscalefarcall[i+1] = fullscalefarcall[i];
+ scaledirectory[i+2] = scaledirectory[i];
+ fullscalefarcall[i+2] = fullscalefarcall[i];
+ i+=2;
+ }
+ }
+ scaledirectory[0] = scaledirectory[1];
+ fullscalefarcall[0] = fullscalefarcall[1];
+
+//
+// check for oversize wall drawing
+//
+ for (i=maxscaleheight;i<MAXSCALEHEIGHT;i++)
+ fullscalefarcall[i] = (long)BadScale;
+
+}
+
+//===========================================================================
+
+/*
+========================
+=
+= BuildCompScale
+=
+= Builds a compiled scaler object that will scale a 64 tall object to
+= the given height (centered vertically on the screen)
+=
+= height should be even
+=
+= Call with
+= ---------
+= DS:SI Source for scale
+= ES:DI Dest for scale
+=
+= Calling the compiled scaler only destroys AL
+=
+========================
+*/
+
+unsigned BuildCompScale (int height, memptr *finalspot)
+{
+ byte far *code;
+
+ int i;
+ long fix,step;
+ unsigned src,totalscaled,totalsize;
+ int startpix,endpix,toppix;
+
+
+ step = ((long)height<<16) / 64;
+ code = &work->code[0];
+ toppix = (viewheight-height)/2;
+ fix = 0;
+
+ for (src=0;src<=64;src++)
+ {
+ startpix = fix>>16;
+ fix += step;
+ endpix = fix>>16;
+
+ if (endpix>startpix)
+ work->width[src] = endpix-startpix;
+ else
+ work->width[src] = 0;
+
+//
+// mark the start of the code
+//
+ work->codeofs[src] = FP_OFF(code);
+
+//
+// compile some code if the source pixel generates any screen pixels
+//
+ startpix+=toppix;
+ endpix+=toppix;
+
+ if (startpix == endpix || endpix < 0 || startpix >= viewheight || src == 64)
+ continue;
+
+ //
+ // mov al,[si+src]
+ //
+ *code++ = 0x8a;
+ *code++ = 0x44;
+ *code++ = src;
+
+ for (;startpix<endpix;startpix++)
+ {
+ if (startpix >= viewheight)
+ break; // off the bottom of the view area
+ if (startpix < 0)
+ continue; // not into the view area
+
+ //
+ // mov [es:di+heightofs],al
+ //
+ *code++ = 0x26;
+ *code++ = 0x88;
+ *code++ = 0x85;
+ *((unsigned far *)code)++ = startpix*SCREENBWIDE;
+ }
+
+ }
+
+//
+// retf
+//
+ *code++ = 0xcb;
+
+ totalsize = FP_OFF(code);
+ MM_GetPtr (finalspot,totalsize);
+ if (mmerror)
+ return 0;
+ _fmemcpy ((byte _seg *)(*finalspot),(byte _seg *)work,totalsize);
+
+ return totalsize;
+}
+
+
+/*
+=======================
+=
+= ScaleLine
+=
+= linescale should have the high word set to the segment of the scaler
+=
+=======================
+*/
+
+extern int slinex,slinewidth;
+extern unsigned far *linecmds;
+extern long linescale;
+extern unsigned maskword;
+
+byte mask1,mask2,mask3;
+
+
+void near ScaleLine (void)
+{
+asm mov cx,WORD PTR [linescale+2]
+asm mov es,cx // segment of scaler
+
+asm mov bp,WORD PTR [linecmds]
+asm mov dx,SC_INDEX+1 // to set SC_MAPMASK
+
+asm mov bx,[slinex]
+asm mov di,bx
+asm shr di,2 // X in bytes
+asm add di,[bufferofs]
+asm and bx,3
+asm shl bx,3
+asm add bx,[slinewidth] // bx = (pixel*8+pixwidth)
+asm mov al,BYTE [mapmasks3-1+bx] // -1 because pixwidth of 1 is first
+asm mov ds,WORD PTR [linecmds+2]
+asm or al,al
+asm jz notthreebyte // scale across three bytes
+asm jmp threebyte
+notthreebyte:
+asm mov al,BYTE PTR ss:[mapmasks2-1+bx] // -1 because pixwidth of 1 is first
+asm or al,al
+asm jnz twobyte // scale across two bytes
+
+//
+// one byte scaling
+//
+asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
+asm out dx,al // set map mask register
+
+scalesingle:
+
+asm mov bx,[ds:bp] // table location of rtl to patch
+asm or bx,bx
+asm jz linedone // 0 signals end of segment list
+asm mov bx,[es:bx]
+asm mov dl,[es:bx] // save old value
+asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
+asm mov si,[ds:bp+4] // table location of entry spot
+asm mov ax,[es:si]
+asm mov WORD PTR ss:[linescale],ax // call here to start scaling
+asm mov si,[ds:bp+2] // corrected top of shape for this segment
+asm add bp,6 // next segment list
+
+asm mov ax,SCREENSEG
+asm mov es,ax
+asm call ss:[linescale] // scale the segment of pixels
+
+asm mov es,cx // segment of scaler
+asm mov BYTE PTR es:[bx],dl // unpatch the RETF
+asm jmp scalesingle // do the next segment
+
+
+//
+// done
+//
+linedone:
+asm mov ax,ss
+asm mov ds,ax
+return;
+
+//
+// two byte scaling
+//
+twobyte:
+asm mov ss:[mask2],al
+asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
+asm mov ss:[mask1],al
+
+scaledouble:
+
+asm mov bx,[ds:bp] // table location of rtl to patch
+asm or bx,bx
+asm jz linedone // 0 signals end of segment list
+asm mov bx,[es:bx]
+asm mov cl,[es:bx] // save old value
+asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
+asm mov si,[ds:bp+4] // table location of entry spot
+asm mov ax,[es:si]
+asm mov WORD PTR ss:[linescale],ax // call here to start scaling
+asm mov si,[ds:bp+2] // corrected top of shape for this segment
+asm add bp,6 // next segment list
+
+asm mov ax,SCREENSEG
+asm mov es,ax
+asm mov al,ss:[mask1]
+asm out dx,al // set map mask register
+asm call ss:[linescale] // scale the segment of pixels
+asm inc di
+asm mov al,ss:[mask2]
+asm out dx,al // set map mask register
+asm call ss:[linescale] // scale the segment of pixels
+asm dec di
+
+asm mov es,WORD PTR ss:[linescale+2] // segment of scaler
+asm mov BYTE PTR es:[bx],cl // unpatch the RETF
+asm jmp scaledouble // do the next segment
+
+
+//
+// three byte scaling
+//
+threebyte:
+asm mov ss:[mask3],al
+asm mov al,BYTE PTR ss:[mapmasks2-1+bx] // -1 because pixwidth of 1 is first
+asm mov ss:[mask2],al
+asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
+asm mov ss:[mask1],al
+
+scaletriple:
+
+asm mov bx,[ds:bp] // table location of rtl to patch
+asm or bx,bx
+asm jz linedone // 0 signals end of segment list
+asm mov bx,[es:bx]
+asm mov cl,[es:bx] // save old value
+asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
+asm mov si,[ds:bp+4] // table location of entry spot
+asm mov ax,[es:si]
+asm mov WORD PTR ss:[linescale],ax // call here to start scaling
+asm mov si,[ds:bp+2] // corrected top of shape for this segment
+asm add bp,6 // next segment list
+
+asm mov ax,SCREENSEG
+asm mov es,ax
+asm mov al,ss:[mask1]
+asm out dx,al // set map mask register
+asm call ss:[linescale] // scale the segment of pixels
+asm inc di
+asm mov al,ss:[mask2]
+asm out dx,al // set map mask register
+asm call ss:[linescale] // scale the segment of pixels
+asm inc di
+asm mov al,ss:[mask3]
+asm out dx,al // set map mask register
+asm call ss:[linescale] // scale the segment of pixels
+asm dec di
+asm dec di
+
+asm mov es,WORD PTR ss:[linescale+2] // segment of scaler
+asm mov BYTE PTR es:[bx],cl // unpatch the RETF
+asm jmp scaletriple // do the next segment
+
+
+}
+
+
+/*
+=======================
+=
+= ScaleShape
+=
+= Draws a compiled shape at [scale] pixels high
+=
+= each vertical line of the shape has a pointer to segment data:
+= end of segment pixel*2 (0 terminates line) used to patch rtl in scaler
+= top of virtual line with segment in proper place
+= start of segment pixel*2, used to jsl into compiled scaler
+= <repeat>
+=
+= Setup for call
+= --------------
+= GC_MODE read mode 1, write mode 2
+= GC_COLORDONTCARE set to 0, so all reads from video memory return 0xff
+= GC_INDEX pointing at GC_BITMASK
+=
+=======================
+*/
+
+static long longtemp;
+
+void ScaleShape (int xcenter, int shapenum, unsigned height)
+{
+ t_compshape _seg *shape;
+ t_compscale _seg *comptable;
+ unsigned scale,srcx,stopx,tempx;
+ int t;
+ unsigned far *cmdptr;
+ boolean leftvis,rightvis;
+
+
+ shape = PM_GetSpritePage (shapenum);
+
+ scale = height>>3; // low three bits are fractional
+ if (!scale || scale>maxscale)
+ return; // too close or far away
+ comptable = scaledirectory[scale];
+
+ *(((unsigned *)&linescale)+1)=(unsigned)comptable; // seg of far call
+ *(((unsigned *)&linecmds)+1)=(unsigned)shape; // seg of shape
+
+//
+// scale to the left (from pixel 31 to shape->leftpix)
+//
+ srcx = 32;
+ slinex = xcenter;
+ stopx = shape->leftpix;
+ cmdptr = &shape->dataofs[31-stopx];
+
+ while ( --srcx >=stopx && slinex>0)
+ {
+ (unsigned)linecmds = *cmdptr--;
+ if ( !(slinewidth = comptable->width[srcx]) )
+ continue;
+
+ if (slinewidth == 1)
+ {
+ slinex--;
+ if (slinex<viewwidth)
+ {
+ if (wallheight[slinex] >= height)
+ continue; // obscured by closer wall
+ ScaleLine ();
+ }
+ continue;
+ }
+
+ //
+ // handle multi pixel lines
+ //
+ if (slinex>viewwidth)
+ {
+ slinex -= slinewidth;
+ slinewidth = viewwidth-slinex;
+ if (slinewidth<1)
+ continue; // still off the right side
+ }
+ else
+ {
+ if (slinewidth>slinex)
+ slinewidth = slinex;
+ slinex -= slinewidth;
+ }
+
+
+ leftvis = (wallheight[slinex] < height);
+ rightvis = (wallheight[slinex+slinewidth-1] < height);
+
+ if (leftvis)
+ {
+ if (rightvis)
+ ScaleLine ();
+ else
+ {
+ while (wallheight[slinex+slinewidth-1] >= height)
+ slinewidth--;
+ ScaleLine ();
+ }
+ }
+ else
+ {
+ if (!rightvis)
+ continue; // totally obscured
+
+ while (wallheight[slinex] >= height)
+ {
+ slinex++;
+ slinewidth--;
+ }
+ ScaleLine ();
+ break; // the rest of the shape is gone
+ }
+ }
+
+
+//
+// scale to the right
+//
+ slinex = xcenter;
+ stopx = shape->rightpix;
+ if (shape->leftpix<31)
+ {
+ srcx = 31;
+ cmdptr = &shape->dataofs[32-shape->leftpix];
+ }
+ else
+ {
+ srcx = shape->leftpix-1;
+ cmdptr = &shape->dataofs[0];
+ }
+ slinewidth = 0;
+
+ while ( ++srcx <= stopx && (slinex+=slinewidth)<viewwidth)
+ {
+ (unsigned)linecmds = *cmdptr++;
+ if ( !(slinewidth = comptable->width[srcx]) )
+ continue;
+
+ if (slinewidth == 1)
+ {
+ if (slinex>=0 && wallheight[slinex] < height)
+ {
+ ScaleLine ();
+ }
+ continue;
+ }
+
+ //
+ // handle multi pixel lines
+ //
+ if (slinex<0)
+ {
+ if (slinewidth <= -slinex)
+ continue; // still off the left edge
+
+ slinewidth += slinex;
+ slinex = 0;
+ }
+ else
+ {
+ if (slinex + slinewidth > viewwidth)
+ slinewidth = viewwidth-slinex;
+ }
+
+
+ leftvis = (wallheight[slinex] < height);
+ rightvis = (wallheight[slinex+slinewidth-1] < height);
+
+ if (leftvis)
+ {
+ if (rightvis)
+ {
+ ScaleLine ();
+ }
+ else
+ {
+ while (wallheight[slinex+slinewidth-1] >= height)
+ slinewidth--;
+ ScaleLine ();
+ break; // the rest of the shape is gone
+ }
+ }
+ else
+ {
+ if (rightvis)
+ {
+ while (wallheight[slinex] >= height)
+ {
+ slinex++;
+ slinewidth--;
+ }
+ ScaleLine ();
+ }
+ else
+ continue; // totally obscured
+ }
+ }
+}
+
+
+
+/*
+=======================
+=
+= SimpleScaleShape
+=
+= NO CLIPPING, height in pixels
+=
+= Draws a compiled shape at [scale] pixels high
+=
+= each vertical line of the shape has a pointer to segment data:
+= end of segment pixel*2 (0 terminates line) used to patch rtl in scaler
+= top of virtual line with segment in proper place
+= start of segment pixel*2, used to jsl into compiled scaler
+= <repeat>
+=
+= Setup for call
+= --------------
+= GC_MODE read mode 1, write mode 2
+= GC_COLORDONTCARE set to 0, so all reads from video memory return 0xff
+= GC_INDEX pointing at GC_BITMASK
+=
+=======================
+*/
+
+void SimpleScaleShape (int xcenter, int shapenum, unsigned height)
+{
+ t_compshape _seg *shape;
+ t_compscale _seg *comptable;
+ unsigned scale,srcx,stopx,tempx;
+ int t;
+ unsigned far *cmdptr;
+ boolean leftvis,rightvis;
+
+
+ shape = PM_GetSpritePage (shapenum);
+
+ scale = height>>1;
+ comptable = scaledirectory[scale];
+
+ *(((unsigned *)&linescale)+1)=(unsigned)comptable; // seg of far call
+ *(((unsigned *)&linecmds)+1)=(unsigned)shape; // seg of shape
+
+//
+// scale to the left (from pixel 31 to shape->leftpix)
+//
+ srcx = 32;
+ slinex = xcenter;
+ stopx = shape->leftpix;
+ cmdptr = &shape->dataofs[31-stopx];
+
+ while ( --srcx >=stopx )
+ {
+ (unsigned)linecmds = *cmdptr--;
+ if ( !(slinewidth = comptable->width[srcx]) )
+ continue;
+
+ slinex -= slinewidth;
+ ScaleLine ();
+ }
+
+
+//
+// scale to the right
+//
+ slinex = xcenter;
+ stopx = shape->rightpix;
+ if (shape->leftpix<31)
+ {
+ srcx = 31;
+ cmdptr = &shape->dataofs[32-shape->leftpix];
+ }
+ else
+ {
+ srcx = shape->leftpix-1;
+ cmdptr = &shape->dataofs[0];
+ }
+ slinewidth = 0;
+
+ while ( ++srcx <= stopx )
+ {
+ (unsigned)linecmds = *cmdptr++;
+ if ( !(slinewidth = comptable->width[srcx]) )
+ continue;
+
+ ScaleLine ();
+ slinex+=slinewidth;
+ }
+}
+
+
+
+
+//
+// bit mask tables for drawing scaled strips up to eight pixels wide
+//
+// down here so the STUPID inline assembler doesn't get confused!
+//
+
+
+byte mapmasks1[4][8] = {
+{1 ,3 ,7 ,15,15,15,15,15},
+{2 ,6 ,14,14,14,14,14,14},
+{4 ,12,12,12,12,12,12,12},
+{8 ,8 ,8 ,8 ,8 ,8 ,8 ,8} };
+
+byte mapmasks2[4][8] = {
+{0 ,0 ,0 ,0 ,1 ,3 ,7 ,15},
+{0 ,0 ,0 ,1 ,3 ,7 ,15,15},
+{0 ,0 ,1 ,3 ,7 ,15,15,15},
+{0 ,1 ,3 ,7 ,15,15,15,15} };
+
+byte mapmasks3[4][8] = {
+{0 ,0 ,0 ,0 ,0 ,0 ,0 ,0},
+{0 ,0 ,0 ,0 ,0 ,0 ,0 ,1},
+{0 ,0 ,0 ,0 ,0 ,0 ,1 ,3},
+{0 ,0 ,0 ,0 ,0 ,1 ,3 ,7} };
+
+
+unsigned wordmasks[8][8] = {
+{0x0080,0x00c0,0x00e0,0x00f0,0x00f8,0x00fc,0x00fe,0x00ff},
+{0x0040,0x0060,0x0070,0x0078,0x007c,0x007e,0x007f,0x807f},
+{0x0020,0x0030,0x0038,0x003c,0x003e,0x003f,0x803f,0xc03f},
+{0x0010,0x0018,0x001c,0x001e,0x001f,0x801f,0xc01f,0xe01f},
+{0x0008,0x000c,0x000e,0x000f,0x800f,0xc00f,0xe00f,0xf00f},
+{0x0004,0x0006,0x0007,0x8007,0xc007,0xe007,0xf007,0xf807},
+{0x0002,0x0003,0x8003,0xc003,0xe003,0xf003,0xf803,0xfc03},
+{0x0001,0x8001,0xc001,0xe001,0xf001,0xf801,0xfc01,0xfe01} };
+
+int slinex,slinewidth;
+unsigned far *linecmds;
+long linescale;
+unsigned maskword;
+
--- /dev/null
+++ b/piclist.h
@@ -1,0 +1,36 @@
+//////////////////////////////////////
+//
+// Graphics .H file for .WL1
+// IGRAB-ed on Sat May 02 02:32:49 1992
+//
+//////////////////////////////////////
+
+typedef enum {
+ // Lump Start
+ H_BJPIC=3,
+ H_CASTLEPIC, // 4
+ H_KEYBOARDPIC, // 5
+ H_JOYPIC, // 6
+ H_MOUSEPIC, // 7
+ H_BOTHPIC, // 8
+ H_GAMEPADPIC, // 9
+ H_HEALPIC, // 10
+ H_TREASUREPIC, // 11
+ H_GUNPIC, // 12
+ H_KEYPIC, // 13
+ H_BLAZEPIC, // 14
+ H_WEAPON1234PIC, // 15
+ H_WOLFLOGOPIC, // 16
+ H_VISAPIC, // 17
+ H_MCPIC, // 18
+ H_IDLOGOPIC, // 19
+ H_FAXPIC, // 20
+ H_GALACTIXPIC, // 21
+ H_FGODMOMPIC, // 22
+ H_AUSTRALIAPIC, // 23
+ H_CANADAPIC, // 24
+ H_UKPIC, // 25
+ H_TOPWINDOWPIC, // 26
+ H_LEFTWINDOWPIC, // 27
+ H_RIGHTWINDOWPIC, // 28
+ H_BOTTOMINFOPIC, // 29
--- /dev/null
+++ b/play.c
@@ -1,0 +1,1472 @@
+// WL_PLAY.C
+
+#include "WL_DEF.H"
+#pragma hdrstop
+
+
+/*
+=============================================================================
+
+ LOCAL CONSTANTS
+
+=============================================================================
+*/
+
+#define sc_Question 0x35
+
+/*
+=============================================================================
+
+ GLOBAL VARIABLES
+
+=============================================================================
+*/
+
+boolean madenoise; // true when shooting or screaming
+
+exit_t playstate;
+
+int DebugOk;
+
+objtype objlist[MAXACTORS],*new,*obj,*player,*lastobj,
+ *objfreelist,*killerobj;
+
+unsigned farmapylookup[MAPSIZE];
+byte *nearmapylookup[MAPSIZE];
+
+boolean singlestep,godmode,noclip;
+int extravbls;
+
+byte tilemap[MAPSIZE][MAPSIZE]; // wall values only
+byte spotvis[MAPSIZE][MAPSIZE];
+objtype *actorat[MAPSIZE][MAPSIZE];
+
+//
+// replacing refresh manager
+//
+unsigned mapwidth,mapheight,tics;
+boolean compatability;
+byte *updateptr;
+unsigned mapwidthtable[64];
+unsigned uwidthtable[UPDATEHIGH];
+unsigned blockstarts[UPDATEWIDE*UPDATEHIGH];
+byte update[UPDATESIZE];
+
+//
+// control info
+//
+boolean mouseenabled,joystickenabled,joypadenabled,joystickprogressive;
+int joystickport;
+int dirscan[4] = {sc_UpArrow,sc_RightArrow,sc_DownArrow,sc_LeftArrow};
+int buttonscan[NUMBUTTONS] =
+ {sc_Control,sc_Alt,sc_RShift,sc_Space,sc_1,sc_2,sc_3,sc_4};
+int buttonmouse[4]={bt_attack,bt_strafe,bt_use,bt_nobutton};
+int buttonjoy[4]={bt_attack,bt_strafe,bt_use,bt_run};
+
+int viewsize;
+
+boolean buttonheld[NUMBUTTONS];
+
+boolean demorecord,demoplayback;
+char far *demoptr, far *lastdemoptr;
+memptr demobuffer;
+
+//
+// curent user input
+//
+int controlx,controly; // range from -100 to 100 per tic
+boolean buttonstate[NUMBUTTONS];
+
+
+
+//===========================================================================
+
+
+void CenterWindow(word w,word h);
+void InitObjList (void);
+void RemoveObj (objtype *gone);
+void PollControls (void);
+void StopMusic(void);
+void StartMusic(void);
+void PlayLoop (void);
+
+/*
+=============================================================================
+
+ LOCAL VARIABLES
+
+=============================================================================
+*/
+
+
+objtype dummyobj;
+
+//
+// LIST OF SONGS FOR EACH VERSION
+//
+int songs[]=
+{
+#ifndef SPEAR
+ //
+ // Episode One
+ //
+ GETTHEM_MUS,
+ SEARCHN_MUS,
+ POW_MUS,
+ SUSPENSE_MUS,
+ GETTHEM_MUS,
+ SEARCHN_MUS,
+ POW_MUS,
+ SUSPENSE_MUS,
+
+ WARMARCH_MUS, // Boss level
+ CORNER_MUS, // Secret level
+
+ //
+ // Episode Two
+ //
+ NAZI_OMI_MUS,
+ PREGNANT_MUS,
+ GOINGAFT_MUS,
+ HEADACHE_MUS,
+ NAZI_OMI_MUS,
+ PREGNANT_MUS,
+ HEADACHE_MUS,
+ GOINGAFT_MUS,
+
+ WARMARCH_MUS, // Boss level
+ DUNGEON_MUS, // Secret level
+
+ //
+ // Episode Three
+ //
+ INTROCW3_MUS,
+ NAZI_RAP_MUS,
+ TWELFTH_MUS,
+ ZEROHOUR_MUS,
+ INTROCW3_MUS,
+ NAZI_RAP_MUS,
+ TWELFTH_MUS,
+ ZEROHOUR_MUS,
+
+ ULTIMATE_MUS, // Boss level
+ PACMAN_MUS, // Secret level
+
+ //
+ // Episode Four
+ //
+ GETTHEM_MUS,
+ SEARCHN_MUS,
+ POW_MUS,
+ SUSPENSE_MUS,
+ GETTHEM_MUS,
+ SEARCHN_MUS,
+ POW_MUS,
+ SUSPENSE_MUS,
+
+ WARMARCH_MUS, // Boss level
+ CORNER_MUS, // Secret level
+
+ //
+ // Episode Five
+ //
+ NAZI_OMI_MUS,
+ PREGNANT_MUS,
+ GOINGAFT_MUS,
+ HEADACHE_MUS,
+ NAZI_OMI_MUS,
+ PREGNANT_MUS,
+ HEADACHE_MUS,
+ GOINGAFT_MUS,
+
+ WARMARCH_MUS, // Boss level
+ DUNGEON_MUS, // Secret level
+
+ //
+ // Episode Six
+ //
+ INTROCW3_MUS,
+ NAZI_RAP_MUS,
+ TWELFTH_MUS,
+ ZEROHOUR_MUS,
+ INTROCW3_MUS,
+ NAZI_RAP_MUS,
+ TWELFTH_MUS,
+ ZEROHOUR_MUS,
+
+ ULTIMATE_MUS, // Boss level
+ FUNKYOU_MUS // Secret level
+#else
+
+ //////////////////////////////////////////////////////////////
+ //
+ // SPEAR OF DESTINY TRACKS
+ //
+ //////////////////////////////////////////////////////////////
+ XTIPTOE_MUS,
+ XFUNKIE_MUS,
+ XDEATH_MUS,
+ XGETYOU_MUS, // DON'T KNOW
+ ULTIMATE_MUS, // Trans Gr�sse
+
+ DUNGEON_MUS,
+ GOINGAFT_MUS,
+ POW_MUS,
+ TWELFTH_MUS,
+ ULTIMATE_MUS, // Barnacle Wilhelm BOSS
+
+ NAZI_OMI_MUS,
+ GETTHEM_MUS,
+ SUSPENSE_MUS,
+ SEARCHN_MUS,
+ ZEROHOUR_MUS,
+ ULTIMATE_MUS, // Super Mutant BOSS
+
+ XPUTIT_MUS,
+ ULTIMATE_MUS, // Death Knight BOSS
+
+ XJAZNAZI_MUS, // Secret level
+ XFUNKIE_MUS, // Secret level (DON'T KNOW)
+
+ XEVIL_MUS // Angel of Death BOSS
+
+#endif
+};
+
+
+/*
+=============================================================================
+
+ USER CONTROL
+
+=============================================================================
+*/
+
+
+#define BASEMOVE 35
+#define RUNMOVE 70
+#define BASETURN 35
+#define RUNTURN 70
+
+#define JOYSCALE 2
+
+/*
+===================
+=
+= PollKeyboardButtons
+=
+===================
+*/
+
+void PollKeyboardButtons (void)
+{
+ int i;
+
+ for (i=0;i<NUMBUTTONS;i++)
+ if (Keyboard[buttonscan[i]])
+ buttonstate[i] = true;
+}
+
+
+/*
+===================
+=
+= PollMouseButtons
+=
+===================
+*/
+
+void PollMouseButtons (void)
+{
+ int buttons;
+
+ buttons = IN_MouseButtons ();
+
+ if (buttons&1)
+ buttonstate[buttonmouse[0]] = true;
+ if (buttons&2)
+ buttonstate[buttonmouse[1]] = true;
+ if (buttons&4)
+ buttonstate[buttonmouse[2]] = true;
+}
+
+
+
+/*
+===================
+=
+= PollJoystickButtons
+=
+===================
+*/
+
+void PollJoystickButtons (void)
+{
+ int buttons;
+
+ buttons = IN_JoyButtons ();
+
+ if (joystickport && !joypadenabled)
+ {
+ if (buttons&4)
+ buttonstate[buttonjoy[0]] = true;
+ if (buttons&8)
+ buttonstate[buttonjoy[1]] = true;
+ }
+ else
+ {
+ if (buttons&1)
+ buttonstate[buttonjoy[0]] = true;
+ if (buttons&2)
+ buttonstate[buttonjoy[1]] = true;
+ if (joypadenabled)
+ {
+ if (buttons&4)
+ buttonstate[buttonjoy[2]] = true;
+ if (buttons&8)
+ buttonstate[buttonjoy[3]] = true;
+ }
+ }
+}
+
+
+/*
+===================
+=
+= PollKeyboardMove
+=
+===================
+*/
+
+void PollKeyboardMove (void)
+{
+ if (buttonstate[bt_run])
+ {
+ if (Keyboard[dirscan[di_north]])
+ controly -= RUNMOVE*tics;
+ if (Keyboard[dirscan[di_south]])
+ controly += RUNMOVE*tics;
+ if (Keyboard[dirscan[di_west]])
+ controlx -= RUNMOVE*tics;
+ if (Keyboard[dirscan[di_east]])
+ controlx += RUNMOVE*tics;
+ }
+ else
+ {
+ if (Keyboard[dirscan[di_north]])
+ controly -= BASEMOVE*tics;
+ if (Keyboard[dirscan[di_south]])
+ controly += BASEMOVE*tics;
+ if (Keyboard[dirscan[di_west]])
+ controlx -= BASEMOVE*tics;
+ if (Keyboard[dirscan[di_east]])
+ controlx += BASEMOVE*tics;
+ }
+}
+
+
+/*
+===================
+=
+= PollMouseMove
+=
+===================
+*/
+
+void PollMouseMove (void)
+{
+ int mousexmove,mouseymove;
+
+ Mouse(MDelta);
+ mousexmove = _CX;
+ mouseymove = _DX;
+
+ controlx += mousexmove*10/(13-mouseadjustment);
+ controly += mouseymove*20/(13-mouseadjustment);
+}
+
+
+
+/*
+===================
+=
+= PollJoystickMove
+=
+===================
+*/
+
+void PollJoystickMove (void)
+{
+ int joyx,joyy;
+
+ INL_GetJoyDelta(joystickport,&joyx,&joyy);
+
+ if (joystickprogressive)
+ {
+ if (joyx > 64)
+ controlx += (joyx-64)*JOYSCALE*tics;
+ else if (joyx < -64)
+ controlx -= (-joyx-64)*JOYSCALE*tics;
+ if (joyy > 64)
+ controlx += (joyy-64)*JOYSCALE*tics;
+ else if (joyy < -64)
+ controly -= (-joyy-64)*JOYSCALE*tics;
+ }
+ else if (buttonstate[bt_run])
+ {
+ if (joyx > 64)
+ controlx += RUNMOVE*tics;
+ else if (joyx < -64)
+ controlx -= RUNMOVE*tics;
+ if (joyy > 64)
+ controly += RUNMOVE*tics;
+ else if (joyy < -64)
+ controly -= RUNMOVE*tics;
+ }
+ else
+ {
+ if (joyx > 64)
+ controlx += BASEMOVE*tics;
+ else if (joyx < -64)
+ controlx -= BASEMOVE*tics;
+ if (joyy > 64)
+ controly += BASEMOVE*tics;
+ else if (joyy < -64)
+ controly -= BASEMOVE*tics;
+ }
+}
+
+
+/*
+===================
+=
+= PollControls
+=
+= Gets user or demo input, call once each frame
+=
+= controlx set between -100 and 100 per tic
+= controly
+= buttonheld[] the state of the buttons LAST frame
+= buttonstate[] the state of the buttons THIS frame
+=
+===================
+*/
+
+void PollControls (void)
+{
+ int max,min,i;
+ byte buttonbits;
+
+//
+// get timing info for last frame
+//
+ if (demoplayback)
+ {
+ while (TimeCount<lasttimecount+DEMOTICS)
+ ;
+ TimeCount = lasttimecount + DEMOTICS;
+ lasttimecount += DEMOTICS;
+ tics = DEMOTICS;
+ }
+ else if (demorecord) // demo recording and playback needs
+ { // to be constant
+//
+// take DEMOTICS or more tics, and modify Timecount to reflect time taken
+//
+ while (TimeCount<lasttimecount+DEMOTICS)
+ ;
+ TimeCount = lasttimecount + DEMOTICS;
+ lasttimecount += DEMOTICS;
+ tics = DEMOTICS;
+ }
+ else
+ CalcTics ();
+
+ controlx = 0;
+ controly = 0;
+ memcpy (buttonheld,buttonstate,sizeof(buttonstate));
+ memset (buttonstate,0,sizeof(buttonstate));
+
+ if (demoplayback)
+ {
+ //
+ // read commands from demo buffer
+ //
+ buttonbits = *demoptr++;
+ for (i=0;i<NUMBUTTONS;i++)
+ {
+ buttonstate[i] = buttonbits&1;
+ buttonbits >>= 1;
+ }
+
+ controlx = *demoptr++;
+ controly = *demoptr++;
+
+ if (demoptr == lastdemoptr)
+ playstate = ex_completed; // demo is done
+
+ controlx *= (int)tics;
+ controly *= (int)tics;
+
+ return;
+ }
+
+
+//
+// get button states
+//
+ PollKeyboardButtons ();
+
+ if (mouseenabled)
+ PollMouseButtons ();
+
+ if (joystickenabled)
+ PollJoystickButtons ();
+
+//
+// get movements
+//
+ PollKeyboardMove ();
+
+ if (mouseenabled)
+ PollMouseMove ();
+
+ if (joystickenabled)
+ PollJoystickMove ();
+
+//
+// bound movement to a maximum
+//
+ max = 100*tics;
+ min = -max;
+ if (controlx > max)
+ controlx = max;
+ else if (controlx < min)
+ controlx = min;
+
+ if (controly > max)
+ controly = max;
+ else if (controly < min)
+ controly = min;
+
+ if (demorecord)
+ {
+ //
+ // save info out to demo buffer
+ //
+ controlx /= (int)tics;
+ controly /= (int)tics;
+
+ buttonbits = 0;
+
+ for (i=NUMBUTTONS-1;i>=0;i--)
+ {
+ buttonbits <<= 1;
+ if (buttonstate[i])
+ buttonbits |= 1;
+ }
+
+ *demoptr++ = buttonbits;
+ *demoptr++ = controlx;
+ *demoptr++ = controly;
+
+ if (demoptr >= lastdemoptr)
+ Quit ("Demo buffer overflowed!");
+
+ controlx *= (int)tics;
+ controly *= (int)tics;
+ }
+}
+
+
+
+//==========================================================================
+
+
+
+///////////////////////////////////////////////////////////////////////////
+//
+// CenterWindow() - Generates a window of a given width & height in the
+// middle of the screen
+//
+///////////////////////////////////////////////////////////////////////////
+
+#define MAXX 320
+#define MAXY 160
+
+void CenterWindow(word w,word h)
+{
+ FixOfs ();
+ US_DrawWindow(((MAXX / 8) - w) / 2,((MAXY / 8) - h) / 2,w,h);
+}
+
+//===========================================================================
+
+
+/*
+=====================
+=
+= CheckKeys
+=
+=====================
+*/
+
+void CheckKeys (void)
+{
+ int i;
+ byte scan;
+ unsigned temp;
+
+
+ if (screenfaded || demoplayback) // don't do anything with a faded screen
+ return;
+
+ scan = LastScan;
+
+
+ #ifdef SPEAR
+ //
+ // SECRET CHEAT CODE: TAB-G-F10
+ //
+ if (Keyboard[sc_Tab] &&
+ Keyboard[sc_G] &&
+ Keyboard[sc_F10])
+ {
+ WindowH = 160;
+ if (godmode)
+ {
+ Message ("God mode OFF");
+ SD_PlaySound (NOBONUSSND);
+ }
+ else
+ {
+ Message ("God mode ON");
+ SD_PlaySound (ENDBONUS2SND);
+ }
+
+ IN_Ack();
+ godmode ^= 1;
+ DrawAllPlayBorderSides ();
+ IN_ClearKeysDown();
+ return;
+ }
+ #endif
+
+
+ //
+ // SECRET CHEAT CODE: 'MLI'
+ //
+ if (Keyboard[sc_M] &&
+ Keyboard[sc_L] &&
+ Keyboard[sc_I])
+ {
+ gamestate.health = 100;
+ gamestate.ammo = 99;
+ gamestate.keys = 3;
+ gamestate.score = 0;
+ gamestate.TimeCount += 42000L;
+ GiveWeapon (wp_chaingun);
+
+ DrawWeapon();
+ DrawHealth();
+ DrawKeys();
+ DrawAmmo();
+ DrawScore();
+
+ ClearMemory ();
+ CA_CacheGrChunk (STARTFONT+1);
+ ClearSplitVWB ();
+ VW_ScreenToScreen (displayofs,bufferofs,80,160);
+
+ Message(STR_CHEATER1"\n"
+ STR_CHEATER2"\n\n"
+ STR_CHEATER3"\n"
+ STR_CHEATER4"\n"
+ STR_CHEATER5);
+
+ UNCACHEGRCHUNK(STARTFONT+1);
+ PM_CheckMainMem ();
+ IN_ClearKeysDown();
+ IN_Ack();
+
+ DrawAllPlayBorder ();
+ }
+
+ //
+ // OPEN UP DEBUG KEYS
+ //
+#ifndef SPEAR
+ if (Keyboard[sc_BackSpace] &&
+ Keyboard[sc_LShift] &&
+ Keyboard[sc_Alt] &&
+ MS_CheckParm("goobers"))
+#else
+ if (Keyboard[sc_BackSpace] &&
+ Keyboard[sc_LShift] &&
+ Keyboard[sc_Alt] &&
+ MS_CheckParm("debugmode"))
+#endif
+ {
+ ClearMemory ();
+ CA_CacheGrChunk (STARTFONT+1);
+ ClearSplitVWB ();
+ VW_ScreenToScreen (displayofs,bufferofs,80,160);
+
+ Message("Debugging keys are\nnow available!");
+ UNCACHEGRCHUNK(STARTFONT+1);
+ PM_CheckMainMem ();
+ IN_ClearKeysDown();
+ IN_Ack();
+
+ DrawAllPlayBorderSides ();
+ DebugOk=1;
+ }
+
+ //
+ // TRYING THE KEEN CHEAT CODE!
+ //
+ if (Keyboard[sc_B] &&
+ Keyboard[sc_A] &&
+ Keyboard[sc_T])
+ {
+ ClearMemory ();
+ CA_CacheGrChunk (STARTFONT+1);
+ ClearSplitVWB ();
+ VW_ScreenToScreen (displayofs,bufferofs,80,160);
+
+ Message("Commander Keen is also\n"
+ "available from Apogee, but\n"
+ "then, you already know\n"
+ "that - right, Cheatmeister?!");
+
+ UNCACHEGRCHUNK(STARTFONT+1);
+ PM_CheckMainMem ();
+ IN_ClearKeysDown();
+ IN_Ack();
+
+ DrawAllPlayBorder ();
+ }
+
+//
+// pause key weirdness can't be checked as a scan code
+//
+ if (Paused)
+ {
+ bufferofs = displayofs;
+ LatchDrawPic (20-4,80-2*8,PAUSEDPIC);
+ SD_MusicOff();
+ IN_Ack();
+ IN_ClearKeysDown ();
+ SD_MusicOn();
+ Paused = false;
+ if (MousePresent)
+ Mouse(MDelta); // Clear accumulated mouse movement
+ return;
+ }
+
+
+//
+// F1-F7/ESC to enter control panel
+//
+ if (
+#ifndef DEBCHECK
+ scan == sc_F10 ||
+#endif
+ scan == sc_F9 ||
+ scan == sc_F7 ||
+ scan == sc_F8) // pop up quit dialog
+ {
+ ClearMemory ();
+ ClearSplitVWB ();
+ VW_ScreenToScreen (displayofs,bufferofs,80,160);
+ US_ControlPanel(scan);
+
+ DrawAllPlayBorderSides ();
+
+ if (scan == sc_F9)
+ StartMusic ();
+
+ PM_CheckMainMem ();
+ SETFONTCOLOR(0,15);
+ IN_ClearKeysDown();
+ return;
+ }
+
+ if ( (scan >= sc_F1 && scan <= sc_F9) || scan == sc_Escape)
+ {
+ StopMusic ();
+ ClearMemory ();
+ VW_FadeOut ();
+
+ US_ControlPanel(scan);
+
+ SETFONTCOLOR(0,15);
+ IN_ClearKeysDown();
+ DrawPlayScreen ();
+ if (!startgame && !loadedgame)
+ {
+ VW_FadeIn ();
+ StartMusic ();
+ }
+ if (loadedgame)
+ playstate = ex_abort;
+ lasttimecount = TimeCount;
+ if (MousePresent)
+ Mouse(MDelta); // Clear accumulated mouse movement
+ PM_CheckMainMem ();
+ return;
+ }
+
+//
+// TAB-? debug keys
+//
+ if (Keyboard[sc_Tab] && DebugOk)
+ {
+ CA_CacheGrChunk (STARTFONT);
+ fontnumber=0;
+ SETFONTCOLOR(0,15);
+ DebugKeys();
+ if (MousePresent)
+ Mouse(MDelta); // Clear accumulated mouse movement
+ lasttimecount = TimeCount;
+ return;
+ }
+
+}
+
+
+//===========================================================================
+
+/*
+#############################################################################
+
+ The objlist data structure
+
+#############################################################################
+
+objlist containt structures for every actor currently playing. The structure
+is accessed as a linked list starting at *player, ending when ob->next ==
+NULL. GetNewObj inserts a new object at the end of the list, meaning that
+if an actor spawn another actor, the new one WILL get to think and react the
+same frame. RemoveObj unlinks the given object and returns it to the free
+list, but does not damage the objects ->next pointer, so if the current object
+removes itself, a linked list following loop can still safely get to the
+next element.
+
+<backwardly linked free list>
+
+#############################################################################
+*/
+
+
+/*
+=========================
+=
+= InitActorList
+=
+= Call to clear out the actor object lists returning them all to the free
+= list. Allocates a special spot for the player.
+=
+=========================
+*/
+
+int objcount;
+
+void InitActorList (void)
+{
+ int i;
+
+//
+// init the actor lists
+//
+ for (i=0;i<MAXACTORS;i++)
+ {
+ objlist[i].prev = &objlist[i+1];
+ objlist[i].next = NULL;
+ }
+
+ objlist[MAXACTORS-1].prev = NULL;
+
+ objfreelist = &objlist[0];
+ lastobj = NULL;
+
+ objcount = 0;
+
+//
+// give the player the first free spots
+//
+ GetNewActor ();
+ player = new;
+
+}
+
+//===========================================================================
+
+/*
+=========================
+=
+= GetNewActor
+=
+= Sets the global variable new to point to a free spot in objlist.
+= The free spot is inserted at the end of the liked list
+=
+= When the object list is full, the caller can either have it bomb out ot
+= return a dummy object pointer that will never get used
+=
+=========================
+*/
+
+void GetNewActor (void)
+{
+ if (!objfreelist)
+ Quit ("GetNewActor: No free spots in objlist!");
+
+ new = objfreelist;
+ objfreelist = new->prev;
+ memset (new,0,sizeof(*new));
+
+ if (lastobj)
+ lastobj->next = new;
+ new->prev = lastobj; // new->next is allready NULL from memset
+
+ new->active = false;
+ lastobj = new;
+
+ objcount++;
+}
+
+//===========================================================================
+
+/*
+=========================
+=
+= RemoveObj
+=
+= Add the given object back into the free list, and unlink it from it's
+= neighbors
+=
+=========================
+*/
+
+void RemoveObj (objtype *gone)
+{
+ objtype **spotat;
+
+ if (gone == player)
+ Quit ("RemoveObj: Tried to remove the player!");
+
+ gone->state = NULL;
+
+//
+// fix the next object's back link
+//
+ if (gone == lastobj)
+ lastobj = (objtype *)gone->prev;
+ else
+ gone->next->prev = gone->prev;
+
+//
+// fix the previous object's forward link
+//
+ gone->prev->next = gone->next;
+
+//
+// add it back in to the free list
+//
+ gone->prev = objfreelist;
+ objfreelist = gone;
+
+ objcount--;
+}
+
+/*
+=============================================================================
+
+ MUSIC STUFF
+
+=============================================================================
+*/
+
+
+/*
+=================
+=
+= StopMusic
+=
+=================
+*/
+
+void StopMusic(void)
+{
+ int i;
+
+ SD_MusicOff();
+ for (i = 0;i < LASTMUSIC;i++)
+ if (audiosegs[STARTMUSIC + i])
+ {
+ MM_SetPurge(&((memptr)audiosegs[STARTMUSIC + i]),3);
+ MM_SetLock(&((memptr)audiosegs[STARTMUSIC + i]),false);
+ }
+}
+
+//==========================================================================
+
+
+/*
+=================
+=
+= StartMusic
+=
+=================
+*/
+
+void StartMusic(void)
+{
+ musicnames chunk;
+
+ SD_MusicOff();
+ chunk = songs[gamestate.mapon+gamestate.episode*10];
+
+// if ((chunk == -1) || (MusicMode != smm_AdLib))
+//DEBUG control panel return;
+
+ MM_BombOnError (false);
+ CA_CacheAudioChunk(STARTMUSIC + chunk);
+ MM_BombOnError (true);
+ if (mmerror)
+ mmerror = false;
+ else
+ {
+ MM_SetLock(&((memptr)audiosegs[STARTMUSIC + chunk]),true);
+ SD_StartMusic((MusicGroup far *)audiosegs[STARTMUSIC + chunk]);
+ }
+}
+
+
+/*
+=============================================================================
+
+ PALETTE SHIFTING STUFF
+
+=============================================================================
+*/
+
+#define NUMREDSHIFTS 6
+#define REDSTEPS 8
+
+#define NUMWHITESHIFTS 3
+#define WHITESTEPS 20
+#define WHITETICS 6
+
+
+byte far redshifts[NUMREDSHIFTS][768];
+byte far whiteshifts[NUMREDSHIFTS][768];
+
+int damagecount,bonuscount;
+boolean palshifted;
+
+extern byte far gamepal;
+
+/*
+=====================
+=
+= InitRedShifts
+=
+=====================
+*/
+
+void InitRedShifts (void)
+{
+ byte far *workptr, far *baseptr;
+ int i,j,delta;
+
+
+//
+// fade through intermediate frames
+//
+ for (i=1;i<=NUMREDSHIFTS;i++)
+ {
+ workptr = (byte far *)&redshifts[i-1][0];
+ baseptr = &gamepal;
+
+ for (j=0;j<=255;j++)
+ {
+ delta = 64-*baseptr;
+ *workptr++ = *baseptr++ + delta * i / REDSTEPS;
+ delta = -*baseptr;
+ *workptr++ = *baseptr++ + delta * i / REDSTEPS;
+ delta = -*baseptr;
+ *workptr++ = *baseptr++ + delta * i / REDSTEPS;
+ }
+ }
+
+ for (i=1;i<=NUMWHITESHIFTS;i++)
+ {
+ workptr = (byte far *)&whiteshifts[i-1][0];
+ baseptr = &gamepal;
+
+ for (j=0;j<=255;j++)
+ {
+ delta = 64-*baseptr;
+ *workptr++ = *baseptr++ + delta * i / WHITESTEPS;
+ delta = 62-*baseptr;
+ *workptr++ = *baseptr++ + delta * i / WHITESTEPS;
+ delta = 0-*baseptr;
+ *workptr++ = *baseptr++ + delta * i / WHITESTEPS;
+ }
+ }
+}
+
+
+/*
+=====================
+=
+= ClearPaletteShifts
+=
+=====================
+*/
+
+void ClearPaletteShifts (void)
+{
+ bonuscount = damagecount = 0;
+}
+
+
+/*
+=====================
+=
+= StartBonusFlash
+=
+=====================
+*/
+
+void StartBonusFlash (void)
+{
+ bonuscount = NUMWHITESHIFTS*WHITETICS; // white shift palette
+}
+
+
+/*
+=====================
+=
+= StartDamageFlash
+=
+=====================
+*/
+
+void StartDamageFlash (int damage)
+{
+ damagecount += damage;
+}
+
+
+/*
+=====================
+=
+= UpdatePaletteShifts
+=
+=====================
+*/
+
+void UpdatePaletteShifts (void)
+{
+ int red,white;
+
+ if (bonuscount)
+ {
+ white = bonuscount/WHITETICS +1;
+ if (white>NUMWHITESHIFTS)
+ white = NUMWHITESHIFTS;
+ bonuscount -= tics;
+ if (bonuscount < 0)
+ bonuscount = 0;
+ }
+ else
+ white = 0;
+
+
+ if (damagecount)
+ {
+ red = damagecount/10 +1;
+ if (red>NUMREDSHIFTS)
+ red = NUMREDSHIFTS;
+
+ damagecount -= tics;
+ if (damagecount < 0)
+ damagecount = 0;
+ }
+ else
+ red = 0;
+
+ if (red)
+ {
+ VW_WaitVBL(1);
+ VL_SetPalette (redshifts[red-1]);
+ palshifted = true;
+ }
+ else if (white)
+ {
+ VW_WaitVBL(1);
+ VL_SetPalette (whiteshifts[white-1]);
+ palshifted = true;
+ }
+ else if (palshifted)
+ {
+ VW_WaitVBL(1);
+ VL_SetPalette (&gamepal); // back to normal
+ palshifted = false;
+ }
+}
+
+
+/*
+=====================
+=
+= FinishPaletteShifts
+=
+= Resets palette to normal if needed
+=
+=====================
+*/
+
+void FinishPaletteShifts (void)
+{
+ if (palshifted)
+ {
+ palshifted = 0;
+ VW_WaitVBL(1);
+ VL_SetPalette (&gamepal);
+ }
+}
+
+
+/*
+=============================================================================
+
+ CORE PLAYLOOP
+
+=============================================================================
+*/
+
+
+/*
+=====================
+=
+= DoActor
+=
+=====================
+*/
+
+void DoActor (objtype *ob)
+{
+ void (*think)(objtype *);
+
+ if (!ob->active && !areabyplayer[ob->areanumber])
+ return;
+
+ if (!(ob->flags&(FL_NONMARK|FL_NEVERMARK)) )
+ actorat[ob->tilex][ob->tiley] = NULL;
+
+//
+// non transitional object
+//
+
+ if (!ob->ticcount)
+ {
+ think = ob->state->think;
+ if (think)
+ {
+ think (ob);
+ if (!ob->state)
+ {
+ RemoveObj (ob);
+ return;
+ }
+ }
+
+ if (ob->flags&FL_NEVERMARK)
+ return;
+
+ if ( (ob->flags&FL_NONMARK) && actorat[ob->tilex][ob->tiley])
+ return;
+
+ actorat[ob->tilex][ob->tiley] = ob;
+ return;
+ }
+
+//
+// transitional object
+//
+ ob->ticcount-=tics;
+ while ( ob->ticcount <= 0)
+ {
+ think = ob->state->action; // end of state action
+ if (think)
+ {
+ think (ob);
+ if (!ob->state)
+ {
+ RemoveObj (ob);
+ return;
+ }
+ }
+
+ ob->state = ob->state->next;
+
+ if (!ob->state)
+ {
+ RemoveObj (ob);
+ return;
+ }
+
+ if (!ob->state->tictime)
+ {
+ ob->ticcount = 0;
+ goto think;
+ }
+
+ ob->ticcount += ob->state->tictime;
+ }
+
+think:
+ //
+ // think
+ //
+ think = ob->state->think;
+ if (think)
+ {
+ think (ob);
+ if (!ob->state)
+ {
+ RemoveObj (ob);
+ return;
+ }
+ }
+
+ if (ob->flags&FL_NEVERMARK)
+ return;
+
+ if ( (ob->flags&FL_NONMARK) && actorat[ob->tilex][ob->tiley])
+ return;
+
+ actorat[ob->tilex][ob->tiley] = ob;
+}
+
+//==========================================================================
+
+
+/*
+===================
+=
+= PlayLoop
+=
+===================
+*/
+long funnyticount;
+
+
+void PlayLoop (void)
+{
+ int give;
+ int helmetangle;
+
+ playstate = TimeCount = lasttimecount = 0;
+ frameon = 0;
+ running = false;
+ anglefrac = 0;
+ facecount = 0;
+ funnyticount = 0;
+ memset (buttonstate,0,sizeof(buttonstate));
+ ClearPaletteShifts ();
+
+ if (MousePresent)
+ Mouse(MDelta); // Clear accumulated mouse movement
+
+ if (demoplayback)
+ IN_StartAck ();
+
+ do
+ {
+ if (virtualreality)
+ {
+ helmetangle = peek (0x40,0xf0);
+ player->angle += helmetangle;
+ if (player->angle >= ANGLES)
+ player->angle -= ANGLES;
+ }
+
+
+ PollControls();
+
+//
+// actor thinking
+//
+ madenoise = false;
+
+ MoveDoors ();
+ MovePWalls ();
+
+ for (obj = player;obj;obj = obj->next)
+ DoActor (obj);
+
+ UpdatePaletteShifts ();
+
+ ThreeDRefresh ();
+
+ //
+ // MAKE FUNNY FACE IF BJ DOESN'T MOVE FOR AWHILE
+ //
+ #ifdef SPEAR
+ funnyticount += tics;
+ if (funnyticount > 30l*70)
+ {
+ funnyticount = 0;
+ StatusDrawPic (17,4,BJWAITING1PIC+(US_RndT()&1));
+ facecount = 0;
+ }
+ #endif
+
+ gamestate.TimeCount+=tics;
+
+ SD_Poll ();
+ UpdateSoundLoc(); // JAB
+
+ if (screenfaded)
+ VW_FadeIn ();
+
+ CheckKeys();
+
+//
+// debug aids
+//
+ if (singlestep)
+ {
+ VW_WaitVBL(14);
+ lasttimecount = TimeCount;
+ }
+ if (extravbls)
+ VW_WaitVBL(extravbls);
+
+ if (demoplayback)
+ {
+ if (IN_CheckAck ())
+ {
+ IN_ClearKeysDown ();
+ playstate = ex_abort;
+ }
+ }
+
+
+ if (virtualreality)
+ {
+ player->angle -= helmetangle;
+ if (player->angle < 0)
+ player->angle += ANGLES;
+ }
+
+ }while (!playstate && !startgame);
+
+ if (playstate != ex_died)
+ FinishPaletteShifts ();
+}
+
--- /dev/null
+++ b/pm.c
@@ -1,0 +1,1199 @@
+//
+// ID_PM.C
+// Id Engine's Page Manager v1.0
+// Primary coder: Jason Blochowiak
+//
+
+#include "ID_HEADS.H"
+#pragma hdrstop
+
+// Main Mem specific variables
+ boolean MainPresent;
+ memptr MainMemPages[PMMaxMainMem];
+ PMBlockAttr MainMemUsed[PMMaxMainMem];
+ int MainPagesAvail;
+
+// EMS specific variables
+ boolean EMSPresent;
+ word EMSAvail,EMSPagesAvail,EMSHandle,
+ EMSPageFrame,EMSPhysicalPage;
+ EMSListStruct EMSList[EMSFrameCount];
+
+// XMS specific variables
+ boolean XMSPresent;
+ word XMSAvail,XMSPagesAvail,XMSHandle;
+ longword XMSDriver;
+ int XMSProtectPage = -1;
+
+// File specific variables
+ char PageFileName[13] = {"VSWAP."};
+ int PageFile = -1;
+ word ChunksInFile;
+ word PMSpriteStart,PMSoundStart;
+
+// General usage variables
+ boolean PMStarted,
+ PMPanicMode,
+ PMThrashing;
+ word XMSPagesUsed,
+ EMSPagesUsed,
+ MainPagesUsed,
+ PMNumBlocks;
+ long PMFrameCount;
+ PageListStruct far *PMPages,
+ _seg *PMSegPages;
+
+static char *ParmStrings[] = {"nomain","noems","noxms",nil};
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// EMS Management code
+//
+/////////////////////////////////////////////////////////////////////////////
+
+//
+// PML_MapEMS() - Maps a logical page to a physical page
+//
+void
+PML_MapEMS(word logical,word physical)
+{
+ _AL = physical;
+ _BX = logical;
+ _DX = EMSHandle;
+ _AH = EMS_MAPPAGE;
+asm int EMS_INT
+
+ if (_AH)
+ Quit("PML_MapEMS: Page mapping failed");
+}
+
+//
+// PML_StartupEMS() - Sets up EMS for Page Mgr's use
+// Checks to see if EMS driver is present
+// Verifies that EMS hardware is present
+// Make sure that EMS version is 3.2 or later
+// If there's more than our minimum (2 pages) available, allocate it (up
+// to the maximum we need)
+//
+
+ char EMMDriverName[9] = "EMMXXXX0";
+
+boolean
+PML_StartupEMS(void)
+{
+ int i;
+ long size;
+
+ EMSPresent = false; // Assume that we'll fail
+ EMSAvail = 0;
+
+ _DX = (word)EMMDriverName;
+ _AX = 0x3d00;
+ geninterrupt(0x21); // try to open EMMXXXX0 device
+asm jnc gothandle
+ goto error;
+
+gothandle:
+ _BX = _AX;
+ _AX = 0x4400;
+ geninterrupt(0x21); // get device info
+asm jnc gotinfo;
+ goto error;
+
+gotinfo:
+asm and dx,0x80
+ if (!_DX)
+ goto error;
+
+ _AX = 0x4407;
+ geninterrupt(0x21); // get status
+asm jc error
+ if (!_AL)
+ goto error;
+
+ _AH = 0x3e;
+ geninterrupt(0x21); // close handle
+
+ _AH = EMS_STATUS;
+ geninterrupt(EMS_INT);
+ if (_AH)
+ goto error; // make sure EMS hardware is present
+
+ _AH = EMS_VERSION;
+ geninterrupt(EMS_INT);
+ if (_AH || (_AL < 0x32)) // only work on EMS 3.2 or greater (silly, but...)
+ goto error;
+
+ _AH = EMS_GETFRAME;
+ geninterrupt(EMS_INT);
+ if (_AH)
+ goto error; // find the page frame address
+ EMSPageFrame = _BX;
+
+ _AH = EMS_GETPAGES;
+ geninterrupt(EMS_INT);
+ if (_AH)
+ goto error;
+ if (_BX < 2)
+ goto error; // Require at least 2 pages (32k)
+ EMSAvail = _BX;
+
+ // Don't hog all available EMS
+ size = EMSAvail * (long)EMSPageSize;
+ if (size - (EMSPageSize * 2) > (ChunksInFile * (long)PMPageSize))
+ {
+ size = (ChunksInFile * (long)PMPageSize) + EMSPageSize;
+ EMSAvail = size / EMSPageSize;
+ }
+
+ _AH = EMS_ALLOCPAGES;
+ _BX = EMSAvail;
+ geninterrupt(EMS_INT);
+ if (_AH)
+ goto error;
+ EMSHandle = _DX;
+
+ mminfo.EMSmem += EMSAvail * (long)EMSPageSize;
+
+ // Initialize EMS mapping cache
+ for (i = 0;i < EMSFrameCount;i++)
+ EMSList[i].baseEMSPage = -1;
+
+ EMSPresent = true; // We have EMS
+
+error:
+ return(EMSPresent);
+}
+
+//
+// PML_ShutdownEMS() - If EMS was used, deallocate it
+//
+void
+PML_ShutdownEMS(void)
+{
+ if (EMSPresent)
+ {
+ asm mov ah,EMS_FREEPAGES
+ asm mov dx,[EMSHandle]
+ asm int EMS_INT
+ if (_AH)
+ Quit ("PML_ShutdownEMS: Error freeing EMS");
+ }
+}
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// XMS Management code
+//
+/////////////////////////////////////////////////////////////////////////////
+
+//
+// PML_StartupXMS() - Starts up XMS for the Page Mgr's use
+// Checks for presence of an XMS driver
+// Makes sure that there's at least a page of XMS available
+// Allocates any remaining XMS (rounded down to the nearest page size)
+//
+boolean
+PML_StartupXMS(void)
+{
+ XMSPresent = false; // Assume failure
+ XMSAvail = 0;
+
+asm mov ax,0x4300
+asm int XMS_INT // Check for presence of XMS driver
+ if (_AL != 0x80)
+ goto error;
+
+
+asm mov ax,0x4310
+asm int XMS_INT // Get address of XMS driver
+asm mov [WORD PTR XMSDriver],bx
+asm mov [WORD PTR XMSDriver+2],es // function pointer to XMS driver
+
+ XMS_CALL(XMS_QUERYFREE); // Find out how much XMS is available
+ XMSAvail = _AX;
+ if (!_AX) // AJR: bugfix 10/8/92
+ goto error;
+
+ XMSAvail &= ~(PMPageSizeKB - 1); // Round off to nearest page size
+ if (XMSAvail < (PMPageSizeKB * 2)) // Need at least 2 pages
+ goto error;
+
+ _DX = XMSAvail;
+ XMS_CALL(XMS_ALLOC); // And do the allocation
+ XMSHandle = _DX;
+
+ if (!_AX) // AJR: bugfix 10/8/92
+ {
+ XMSAvail = 0;
+ goto error;
+ }
+
+ mminfo.XMSmem += XMSAvail * 1024;
+
+ XMSPresent = true;
+error:
+ return(XMSPresent);
+}
+
+//
+// PML_XMSCopy() - Copies a main/EMS page to or from XMS
+// Will round an odd-length request up to the next even value
+//
+void
+PML_XMSCopy(boolean toxms,byte far *addr,word xmspage,word length)
+{
+ longword xoffset;
+ struct
+ {
+ longword length;
+ word source_handle;
+ longword source_offset;
+ word target_handle;
+ longword target_offset;
+ } copy;
+
+ if (!addr)
+ Quit("PML_XMSCopy: zero address");
+
+ xoffset = (longword)xmspage * PMPageSize;
+
+ copy.length = (length + 1) & ~1;
+ copy.source_handle = toxms? 0 : XMSHandle;
+ copy.source_offset = toxms? (long)addr : xoffset;
+ copy.target_handle = toxms? XMSHandle : 0;
+ copy.target_offset = toxms? xoffset : (long)addr;
+
+asm push si
+ _SI = (word)©
+ XMS_CALL(XMS_MOVE);
+asm pop si
+ if (!_AX)
+ Quit("PML_XMSCopy: Error on copy");
+}
+
+#if 1
+#define PML_CopyToXMS(s,t,l) PML_XMSCopy(true,(s),(t),(l))
+#define PML_CopyFromXMS(t,s,l) PML_XMSCopy(false,(t),(s),(l))
+#else
+//
+// PML_CopyToXMS() - Copies the specified number of bytes from the real mode
+// segment address to the specified XMS page
+//
+void
+PML_CopyToXMS(byte far *source,int targetpage,word length)
+{
+ PML_XMSCopy(true,source,targetpage,length);
+}
+
+//
+// PML_CopyFromXMS() - Copies the specified number of bytes from an XMS
+// page to the specified real mode address
+//
+void
+PML_CopyFromXMS(byte far *target,int sourcepage,word length)
+{
+ PML_XMSCopy(false,target,sourcepage,length);
+}
+#endif
+
+//
+// PML_ShutdownXMS()
+//
+void
+PML_ShutdownXMS(void)
+{
+ if (XMSPresent)
+ {
+ _DX = XMSHandle;
+ XMS_CALL(XMS_FREE);
+ if (_BL)
+ Quit("PML_ShutdownXMS: Error freeing XMS");
+ }
+}
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Main memory code
+//
+/////////////////////////////////////////////////////////////////////////////
+
+//
+// PM_SetMainMemPurge() - Sets the purge level for all allocated main memory
+// blocks. This shouldn't be called directly - the PM_LockMainMem() and
+// PM_UnlockMainMem() macros should be used instead.
+//
+void
+PM_SetMainMemPurge(int level)
+{
+ int i;
+
+ for (i = 0;i < PMMaxMainMem;i++)
+ if (MainMemPages[i])
+ MM_SetPurge(&MainMemPages[i],level);
+}
+
+//
+// PM_CheckMainMem() - If something besides the Page Mgr makes requests of
+// the Memory Mgr, some of the Page Mgr's blocks may have been purged,
+// so this function runs through the block list and checks to see if
+// any of the blocks have been purged. If so, it marks the corresponding
+// page as purged & unlocked, then goes through the block list and
+// tries to reallocate any blocks that have been purged.
+// This routine now calls PM_LockMainMem() to make sure that any allocation
+// attempts made during the block reallocation sweep don't purge any
+// of the other blocks. Because PM_LockMainMem() is called,
+// PM_UnlockMainMem() needs to be called before any other part of the
+// program makes allocation requests of the Memory Mgr.
+//
+void
+PM_CheckMainMem(void)
+{
+ boolean allocfailed;
+ int i,n;
+ memptr *p;
+ PMBlockAttr *used;
+ PageListStruct far *page;
+
+ if (!MainPresent)
+ return;
+
+ for (i = 0,page = PMPages;i < ChunksInFile;i++,page++)
+ {
+ n = page->mainPage;
+ if (n != -1) // Is the page using main memory?
+ {
+ if (!MainMemPages[n]) // Yep, was the block purged?
+ {
+ page->mainPage = -1; // Yes, mark page as purged & unlocked
+ page->locked = pml_Unlocked;
+ }
+ }
+ }
+
+ // Prevent allocation attempts from purging any of our other blocks
+ PM_LockMainMem();
+ allocfailed = false;
+ for (i = 0,p = MainMemPages,used = MainMemUsed;i < PMMaxMainMem;i++,p++,used++)
+ {
+ if (!*p) // If the page got purged
+ {
+ if (*used & pmba_Allocated) // If it was allocated
+ {
+ *used &= ~pmba_Allocated; // Mark as unallocated
+ MainPagesAvail--; // and decrease available count
+ }
+
+ if (*used & pmba_Used) // If it was used
+ {
+ *used &= ~pmba_Used; // Mark as unused
+ MainPagesUsed--; // and decrease used count
+ }
+
+ if (!allocfailed)
+ {
+ MM_BombOnError(false);
+ MM_GetPtr(p,PMPageSize); // Try to reallocate
+ if (mmerror) // If it failed,
+ allocfailed = true; // don't try any more allocations
+ else // If it worked,
+ {
+ *used |= pmba_Allocated; // Mark as allocated
+ MainPagesAvail++; // and increase available count
+ }
+ MM_BombOnError(true);
+ }
+ }
+ }
+ if (mmerror)
+ mmerror = false;
+}
+
+//
+// PML_StartupMainMem() - Allocates as much main memory as is possible for
+// the Page Mgr. The memory is allocated as non-purgeable, so if it's
+// necessary to make requests of the Memory Mgr, PM_UnlockMainMem()
+// needs to be called.
+//
+void
+PML_StartupMainMem(void)
+{
+ int i,n;
+ memptr *p;
+
+ MainPagesAvail = 0;
+ MM_BombOnError(false);
+ for (i = 0,p = MainMemPages;i < PMMaxMainMem;i++,p++)
+ {
+ MM_GetPtr(p,PMPageSize);
+ if (mmerror)
+ break;
+
+ MainPagesAvail++;
+ MainMemUsed[i] = pmba_Allocated;
+ }
+ MM_BombOnError(true);
+ if (mmerror)
+ mmerror = false;
+ if (MainPagesAvail < PMMinMainMem)
+ Quit("PM_SetupMainMem: Not enough main memory");
+ MainPresent = true;
+}
+
+//
+// PML_ShutdownMainMem() - Frees all of the main memory blocks used by the
+// Page Mgr.
+//
+void
+PML_ShutdownMainMem(void)
+{
+ int i;
+ memptr *p;
+
+ // DEBUG - mark pages as unallocated & decrease page count as appropriate
+ for (i = 0,p = MainMemPages;i < PMMaxMainMem;i++,p++)
+ if (*p)
+ MM_FreePtr(p);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// File management code
+//
+/////////////////////////////////////////////////////////////////////////////
+
+//
+// PML_ReadFromFile() - Reads some data in from the page file
+//
+void
+PML_ReadFromFile(byte far *buf,long offset,word length)
+{
+ if (!buf)
+ Quit("PML_ReadFromFile: Null pointer");
+ if (!offset)
+ Quit("PML_ReadFromFile: Zero offset");
+ if (lseek(PageFile,offset,SEEK_SET) != offset)
+ Quit("PML_ReadFromFile: Seek failed");
+ if (!CA_FarRead(PageFile,buf,length))
+ Quit("PML_ReadFromFile: Read failed");
+}
+
+//
+// PML_OpenPageFile() - Opens the page file and sets up the page info
+//
+void
+PML_OpenPageFile(void)
+{
+ int i;
+ long size;
+ void _seg *buf;
+ longword far *offsetptr;
+ word far *lengthptr;
+ PageListStruct far *page;
+
+ PageFile = open(PageFileName,O_RDONLY + O_BINARY);
+ if (PageFile == -1)
+ Quit("PML_OpenPageFile: Unable to open page file");
+
+ // Read in header variables
+ read(PageFile,&ChunksInFile,sizeof(ChunksInFile));
+ read(PageFile,&PMSpriteStart,sizeof(PMSpriteStart));
+ read(PageFile,&PMSoundStart,sizeof(PMSoundStart));
+
+ // Allocate and clear the page list
+ PMNumBlocks = ChunksInFile;
+ MM_GetPtr(&(memptr)PMSegPages,sizeof(PageListStruct) * PMNumBlocks);
+ MM_SetLock(&(memptr)PMSegPages,true);
+ PMPages = (PageListStruct far *)PMSegPages;
+ _fmemset(PMPages,0,sizeof(PageListStruct) * PMNumBlocks);
+
+ // Read in the chunk offsets
+ size = sizeof(longword) * ChunksInFile;
+ MM_GetPtr(&buf,size);
+ if (!CA_FarRead(PageFile,(byte far *)buf,size))
+ Quit("PML_OpenPageFile: Offset read failed");
+ offsetptr = (longword far *)buf;
+ for (i = 0,page = PMPages;i < ChunksInFile;i++,page++)
+ page->offset = *offsetptr++;
+ MM_FreePtr(&buf);
+
+ // Read in the chunk lengths
+ size = sizeof(word) * ChunksInFile;
+ MM_GetPtr(&buf,size);
+ if (!CA_FarRead(PageFile,(byte far *)buf,size))
+ Quit("PML_OpenPageFile: Length read failed");
+ lengthptr = (word far *)buf;
+ for (i = 0,page = PMPages;i < ChunksInFile;i++,page++)
+ page->length = *lengthptr++;
+ MM_FreePtr(&buf);
+}
+
+//
+// PML_ClosePageFile() - Closes the page file
+//
+void
+PML_ClosePageFile(void)
+{
+ if (PageFile != -1)
+ close(PageFile);
+ if (PMSegPages)
+ {
+ MM_SetLock(&(memptr)PMSegPages,false);
+ MM_FreePtr(&(void _seg *)PMSegPages);
+ }
+}
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Allocation, etc., code
+//
+/////////////////////////////////////////////////////////////////////////////
+
+//
+// PML_GetEMSAddress()
+//
+// Page is in EMS, so figure out which EMS physical page should be used
+// to map our page in. If normal page, use EMS physical page 3, else
+// use the physical page specified by the lock type
+//
+#if 1
+#pragma argsused // DEBUG - remove lock parameter
+memptr
+PML_GetEMSAddress(int page,PMLockType lock)
+{
+ int i,emspage;
+ word emsoff,emsbase,offset;
+
+ emsoff = page & (PMEMSSubPage - 1);
+ emsbase = page - emsoff;
+
+ emspage = -1;
+ // See if this page is already mapped in
+ for (i = 0;i < EMSFrameCount;i++)
+ {
+ if (EMSList[i].baseEMSPage == emsbase)
+ {
+ emspage = i; // Yep - don't do a redundant remapping
+ break;
+ }
+ }
+
+ // If page isn't already mapped in, find LRU EMS frame, and use it
+ if (emspage == -1)
+ {
+ longword last = MAXLONG;
+ for (i = 0;i < EMSFrameCount;i++)
+ {
+ if (EMSList[i].lastHit < last)
+ {
+ emspage = i;
+ last = EMSList[i].lastHit;
+ }
+ }
+
+ EMSList[emspage].baseEMSPage = emsbase;
+ PML_MapEMS(page / PMEMSSubPage,emspage);
+ }
+
+ if (emspage == -1)
+ Quit("PML_GetEMSAddress: EMS find failed");
+
+ EMSList[emspage].lastHit = PMFrameCount;
+ offset = emspage * EMSPageSizeSeg;
+ offset += emsoff * PMPageSizeSeg;
+ return((memptr)(EMSPageFrame + offset));
+}
+#else
+memptr
+PML_GetEMSAddress(int page,PMLockType lock)
+{
+ word emspage;
+
+ emspage = (lock < pml_EMSLock)? 3 : (lock - pml_EMSLock);
+
+ PML_MapEMS(page / PMEMSSubPage,emspage);
+
+ return((memptr)(EMSPageFrame + (emspage * EMSPageSizeSeg)
+ + ((page & (PMEMSSubPage - 1)) * PMPageSizeSeg)));
+}
+#endif
+
+//
+// PM_GetPageAddress() - Returns the address of a given page
+// Maps in EMS if necessary
+// Returns nil if block isn't cached into Main Memory or EMS
+//
+//
+memptr
+PM_GetPageAddress(int pagenum)
+{
+ PageListStruct far *page;
+
+ page = &PMPages[pagenum];
+ if (page->mainPage != -1)
+ return(MainMemPages[page->mainPage]);
+ else if (page->emsPage != -1)
+ return(PML_GetEMSAddress(page->emsPage,page->locked));
+ else
+ return(nil);
+}
+
+//
+// PML_GiveLRUPage() - Returns the page # of the least recently used
+// present & unlocked main/EMS page (or main page if mainonly is true)
+//
+int
+PML_GiveLRUPage(boolean mainonly)
+{
+ int i,lru;
+ long last;
+ PageListStruct far *page;
+
+ for (i = 0,page = PMPages,lru = -1,last = MAXLONG;i < ChunksInFile;i++,page++)
+ {
+ if
+ (
+ (page->lastHit < last)
+ && ((page->emsPage != -1) || (page->mainPage != -1))
+ && (page->locked == pml_Unlocked)
+ && (!(mainonly && (page->mainPage == -1)))
+ )
+ {
+ last = page->lastHit;
+ lru = i;
+ }
+ }
+
+ if (lru == -1)
+ Quit("PML_GiveLRUPage: LRU Search failed");
+ return(lru);
+}
+
+//
+// PML_GiveLRUXMSPage() - Returns the page # of the least recently used
+// (and present) XMS page.
+// This routine won't return the XMS page protected (by XMSProtectPage)
+//
+int
+PML_GiveLRUXMSPage(void)
+{
+ int i,lru;
+ long last;
+ PageListStruct far *page;
+
+ for (i = 0,page = PMPages,lru = -1,last = MAXLONG;i < ChunksInFile;i++,page++)
+ {
+ if
+ (
+ (page->xmsPage != -1)
+ && (page->lastHit < last)
+ && (i != XMSProtectPage)
+ )
+ {
+ last = page->lastHit;
+ lru = i;
+ }
+ }
+ return(lru);
+}
+
+//
+// PML_PutPageInXMS() - If page isn't in XMS, find LRU XMS page and replace
+// it with the main/EMS page
+//
+void
+PML_PutPageInXMS(int pagenum)
+{
+ int usexms;
+ PageListStruct far *page;
+
+ if (!XMSPresent)
+ return;
+
+ page = &PMPages[pagenum];
+ if (page->xmsPage != -1)
+ return; // Already in XMS
+
+ if (XMSPagesUsed < XMSPagesAvail)
+ page->xmsPage = XMSPagesUsed++;
+ else
+ {
+ usexms = PML_GiveLRUXMSPage();
+ if (usexms == -1)
+ Quit("PML_PutPageInXMS: No XMS LRU");
+ page->xmsPage = PMPages[usexms].xmsPage;
+ PMPages[usexms].xmsPage = -1;
+ }
+ PML_CopyToXMS(PM_GetPageAddress(pagenum),page->xmsPage,page->length);
+}
+
+//
+// PML_TransferPageSpace() - A page is being replaced, so give the new page
+// the old one's address space. Returns the address of the new page.
+//
+memptr
+PML_TransferPageSpace(int orig,int new)
+{
+ memptr addr;
+ PageListStruct far *origpage,far *newpage;
+
+ if (orig == new)
+ Quit("PML_TransferPageSpace: Identity replacement");
+
+ origpage = &PMPages[orig];
+ newpage = &PMPages[new];
+
+ if (origpage->locked != pml_Unlocked)
+ Quit("PML_TransferPageSpace: Killing locked page");
+
+ if ((origpage->emsPage == -1) && (origpage->mainPage == -1))
+ Quit("PML_TransferPageSpace: Reusing non-existent page");
+
+ // Copy page that's about to be purged into XMS
+ PML_PutPageInXMS(orig);
+
+ // Get the address, and force EMS into a physical page if necessary
+ addr = PM_GetPageAddress(orig);
+
+ // Steal the address
+ newpage->emsPage = origpage->emsPage;
+ newpage->mainPage = origpage->mainPage;
+
+ // Mark replaced page as purged
+ origpage->mainPage = origpage->emsPage = -1;
+
+ if (!addr)
+ Quit("PML_TransferPageSpace: Zero replacement");
+
+ return(addr);
+}
+
+//
+// PML_GetAPageBuffer() - A page buffer is needed. Either get it from the
+// main/EMS free pool, or use PML_GiveLRUPage() to find which page to
+// steal the buffer from. Returns a far pointer to the page buffer, and
+// sets the fields inside the given page structure appropriately.
+// If mainonly is true, free EMS will be ignored, and only main pages
+// will be looked at by PML_GiveLRUPage().
+//
+byte far *
+PML_GetAPageBuffer(int pagenum,boolean mainonly)
+{
+ byte far *addr = nil;
+ int i,n;
+ PMBlockAttr *used;
+ PageListStruct far *page;
+
+ page = &PMPages[pagenum];
+ if ((EMSPagesUsed < EMSPagesAvail) && !mainonly)
+ {
+ // There's remaining EMS - use it
+ page->emsPage = EMSPagesUsed++;
+ addr = PML_GetEMSAddress(page->emsPage,page->locked);
+ }
+ else if (MainPagesUsed < MainPagesAvail)
+ {
+ // There's remaining main memory - use it
+ for (i = 0,n = -1,used = MainMemUsed;i < PMMaxMainMem;i++,used++)
+ {
+ if ((*used & pmba_Allocated) && !(*used & pmba_Used))
+ {
+ n = i;
+ *used |= pmba_Used;
+ break;
+ }
+ }
+ if (n == -1)
+ Quit("PML_GetPageBuffer: MainPagesAvail lied");
+ addr = MainMemPages[n];
+ if (!addr)
+ Quit("PML_GetPageBuffer: Purged main block");
+ page->mainPage = n;
+ MainPagesUsed++;
+ }
+ else
+ addr = PML_TransferPageSpace(PML_GiveLRUPage(mainonly),pagenum);
+
+ if (!addr)
+ Quit("PML_GetPageBuffer: Search failed");
+ return(addr);
+}
+
+//
+// PML_GetPageFromXMS() - If page is in XMS, find LRU main/EMS page and
+// replace it with the page from XMS. If mainonly is true, will only
+// search for LRU main page.
+// XMSProtectPage is set to the page to be retrieved from XMS, so that if
+// the page from which we're stealing the main/EMS from isn't in XMS,
+// it won't copy over the page that we're trying to get from XMS.
+// (pages that are being purged are copied into XMS, if possible)
+//
+memptr
+PML_GetPageFromXMS(int pagenum,boolean mainonly)
+{
+ byte far *checkaddr;
+ memptr addr = nil;
+ PageListStruct far *page;
+
+ page = &PMPages[pagenum];
+ if (XMSPresent && (page->xmsPage != -1))
+ {
+ XMSProtectPage = pagenum;
+ checkaddr = PML_GetAPageBuffer(pagenum,mainonly);
+ if (FP_OFF(checkaddr))
+ Quit("PML_GetPageFromXMS: Non segment pointer");
+ addr = (memptr)FP_SEG(checkaddr);
+ PML_CopyFromXMS(addr,page->xmsPage,page->length);
+ XMSProtectPage = -1;
+ }
+
+ return(addr);
+}
+
+//
+// PML_LoadPage() - A page is not in main/EMS memory, and it's not in XMS.
+// Load it into either main or EMS. If mainonly is true, the page will
+// only be loaded into main.
+//
+void
+PML_LoadPage(int pagenum,boolean mainonly)
+{
+ byte far *addr;
+ PageListStruct far *page;
+
+ addr = PML_GetAPageBuffer(pagenum,mainonly);
+ page = &PMPages[pagenum];
+ PML_ReadFromFile(addr,page->offset,page->length);
+}
+
+//
+// PM_GetPage() - Returns the address of the page, loading it if necessary
+// First, check if in Main Memory or EMS
+// Then, check XMS
+// If not in XMS, load into Main Memory or EMS
+//
+#pragma warn -pia
+memptr
+PM_GetPage(int pagenum)
+{
+ memptr result;
+
+ if (pagenum >= ChunksInFile)
+ Quit("PM_GetPage: Invalid page request");
+
+#if 0 // for debugging
+asm mov dx,STATUS_REGISTER_1
+asm in al,dx
+asm mov dx,ATR_INDEX
+asm mov al,ATR_OVERSCAN
+asm out dx,al
+asm mov al,10 // bright green
+asm out dx,al
+#endif
+
+ if (!(result = PM_GetPageAddress(pagenum)))
+ {
+ boolean mainonly = (pagenum >= PMSoundStart);
+if (!PMPages[pagenum].offset) // JDC: sparse page
+ Quit ("Tried to load a sparse page!");
+ if (!(result = PML_GetPageFromXMS(pagenum,mainonly)))
+ {
+ if (PMPages[pagenum].lastHit == PMFrameCount)
+ PMThrashing++;
+
+ PML_LoadPage(pagenum,mainonly);
+ result = PM_GetPageAddress(pagenum);
+ }
+ }
+ PMPages[pagenum].lastHit = PMFrameCount;
+
+#if 0 // for debugging
+asm mov dx,STATUS_REGISTER_1
+asm in al,dx
+asm mov dx,ATR_INDEX
+asm mov al,ATR_OVERSCAN
+asm out dx,al
+asm mov al,3 // blue
+asm out dx,al
+asm mov al,0x20 // normal
+asm out dx,al
+#endif
+
+ return(result);
+}
+#pragma warn +pia
+
+//
+// PM_SetPageLock() - Sets the lock type on a given page
+// pml_Unlocked: Normal, page can be purged
+// pml_Locked: Cannot be purged
+// pml_EMS?: Same as pml_Locked, but if in EMS, use the physical page
+// specified when returning the address. For sound stuff.
+//
+void
+PM_SetPageLock(int pagenum,PMLockType lock)
+{
+ if (pagenum < PMSoundStart)
+ Quit("PM_SetPageLock: Locking/unlocking non-sound page");
+
+ PMPages[pagenum].locked = lock;
+}
+
+//
+// PM_Preload() - Loads as many pages as possible into all types of memory.
+// Calls the update function after each load, indicating the current
+// page, and the total pages that need to be loaded (for thermometer).
+//
+void
+PM_Preload(boolean (*update)(word current,word total))
+{
+ int i,j,
+ page,oogypage;
+ word current,total,
+ totalnonxms,totalxms,
+ mainfree,maintotal,
+ emsfree,emstotal,
+ xmsfree,xmstotal;
+ memptr addr;
+ PageListStruct far *p;
+
+ mainfree = (MainPagesAvail - MainPagesUsed) + (EMSPagesAvail - EMSPagesUsed);
+ xmsfree = (XMSPagesAvail - XMSPagesUsed);
+
+ xmstotal = maintotal = 0;
+
+ for (i = 0;i < ChunksInFile;i++)
+ {
+ if (!PMPages[i].offset)
+ continue; // sparse
+
+ if ( PMPages[i].emsPage != -1 || PMPages[i].mainPage != -1 )
+ continue; // already in main mem
+
+ if ( mainfree )
+ {
+ maintotal++;
+ mainfree--;
+ }
+ else if ( xmsfree && (PMPages[i].xmsPage == -1) )
+ {
+ xmstotal++;
+ xmsfree--;
+ }
+ }
+
+
+ total = maintotal + xmstotal;
+
+ if (!total)
+ return;
+
+ page = 0;
+ current = 0;
+
+//
+// cache main/ems blocks
+//
+ while (maintotal)
+ {
+ while ( !PMPages[page].offset || PMPages[page].mainPage != -1
+ || PMPages[page].emsPage != -1 )
+ page++;
+
+ if (page >= ChunksInFile)
+ Quit ("PM_Preload: Pages>=ChunksInFile");
+
+ PM_GetPage(page);
+
+ page++;
+ current++;
+ maintotal--;
+ update(current,total);
+ }
+
+//
+// load stuff to XMS
+//
+ if (xmstotal)
+ {
+ for (oogypage = 0 ; PMPages[oogypage].mainPage == -1 ; oogypage++)
+ ;
+ addr = PM_GetPage(oogypage);
+ if (!addr)
+ Quit("PM_Preload: XMS buffer failed");
+
+ while (xmstotal)
+ {
+ while ( !PMPages[page].offset || PMPages[page].xmsPage != -1 )
+ page++;
+
+ if (page >= ChunksInFile)
+ Quit ("PM_Preload: Pages>=ChunksInFile");
+
+ p = &PMPages[page];
+
+ p->xmsPage = XMSPagesUsed++;
+ if (XMSPagesUsed > XMSPagesAvail)
+ Quit("PM_Preload: Exceeded XMS pages");
+ if (p->length > PMPageSize)
+ Quit("PM_Preload: Page too long");
+
+ PML_ReadFromFile((byte far *)addr,p->offset,p->length);
+ PML_CopyToXMS((byte far *)addr,p->xmsPage,p->length);
+
+ page++;
+ current++;
+ xmstotal--;
+ update(current,total);
+ }
+
+ p = &PMPages[oogypage];
+ PML_ReadFromFile((byte far *)addr,p->offset,p->length);
+ }
+
+ update(total,total);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// General code
+//
+/////////////////////////////////////////////////////////////////////////////
+
+//
+// PM_NextFrame() - Increments the frame counter and adjusts the thrash
+// avoidence variables
+//
+// If currently in panic mode (to avoid thrashing), check to see if the
+// appropriate number of frames have passed since the last time that
+// we would have thrashed. If so, take us out of panic mode.
+//
+//
+void
+PM_NextFrame(void)
+{
+ int i;
+
+ // Frame count overrun - kill the LRU hit entries & reset frame count
+ if (++PMFrameCount >= MAXLONG - 4)
+ {
+ for (i = 0;i < PMNumBlocks;i++)
+ PMPages[i].lastHit = 0;
+ PMFrameCount = 0;
+ }
+
+#if 0
+ for (i = 0;i < PMSoundStart;i++)
+ {
+ if (PMPages[i].locked)
+ {
+ char buf[40];
+ sprintf(buf,"PM_NextFrame: Page %d is locked",i);
+ Quit(buf);
+ }
+ }
+#endif
+
+ if (PMPanicMode)
+ {
+ // DEBUG - set border color
+ if ((!PMThrashing) && (!--PMPanicMode))
+ {
+ // DEBUG - reset border color
+ }
+ }
+ if (PMThrashing >= PMThrashThreshold)
+ PMPanicMode = PMUnThrashThreshold;
+ PMThrashing = false;
+}
+
+//
+// PM_Reset() - Sets up caching structures
+//
+void
+PM_Reset(void)
+{
+ int i;
+ PageListStruct far *page;
+
+ XMSPagesAvail = XMSAvail / PMPageSizeKB;
+
+ EMSPagesAvail = EMSAvail * (EMSPageSizeKB / PMPageSizeKB);
+ EMSPhysicalPage = 0;
+
+ MainPagesUsed = EMSPagesUsed = XMSPagesUsed = 0;
+
+ PMPanicMode = false;
+
+ // Initialize page list
+ for (i = 0,page = PMPages;i < PMNumBlocks;i++,page++)
+ {
+ page->mainPage = -1;
+ page->emsPage = -1;
+ page->xmsPage = -1;
+ page->locked = false;
+ }
+}
+
+//
+// PM_Startup() - Start up the Page Mgr
+//
+void
+PM_Startup(void)
+{
+ boolean nomain,noems,noxms;
+ int i;
+
+ if (PMStarted)
+ return;
+
+ nomain = noems = noxms = false;
+ for (i = 1;i < _argc;i++)
+ {
+ switch (US_CheckParm(_argv[i],ParmStrings))
+ {
+ case 0:
+ nomain = true;
+ break;
+ case 1:
+ noems = true;
+ break;
+ case 2:
+ noxms = true;
+ break;
+ }
+ }
+
+ PML_OpenPageFile();
+
+ if (!noems)
+ PML_StartupEMS();
+ if (!noxms)
+ PML_StartupXMS();
+
+ if (nomain && !EMSPresent)
+ Quit("PM_Startup: No main or EMS");
+ else
+ PML_StartupMainMem();
+
+ PM_Reset();
+
+ PMStarted = true;
+}
+
+//
+// PM_Shutdown() - Shut down the Page Mgr
+//
+void
+PM_Shutdown(void)
+{
+ PML_ShutdownXMS();
+ PML_ShutdownEMS();
+
+ if (!PMStarted)
+ return;
+
+ PML_ClosePageFile();
+
+ PML_ShutdownMainMem();
+}
--- /dev/null
+++ b/pm.h
@@ -1,0 +1,83 @@
+//
+// ID_PM.H
+// Header file for Id Engine's Page Manager
+//
+
+// NOTE! PMPageSize must be an even divisor of EMSPageSize, and >= 1024
+#define EMSPageSize 16384
+#define EMSPageSizeSeg (EMSPageSize >> 4)
+#define EMSPageSizeKB (EMSPageSize >> 10)
+#define EMSFrameCount 4
+#define PMPageSize 4096
+#define PMPageSizeSeg (PMPageSize >> 4)
+#define PMPageSizeKB (PMPageSize >> 10)
+#define PMEMSSubPage (EMSPageSize / PMPageSize)
+
+#define PMMinMainMem 10 // Min acceptable # of pages from main
+#define PMMaxMainMem 100 // Max number of pages in main memory
+
+#define PMThrashThreshold 1 // Number of page thrashes before panic mode
+#define PMUnThrashThreshold 5 // Number of non-thrashing frames before leaving panic mode
+
+typedef enum
+ {
+ pml_Unlocked,
+ pml_Locked
+ } PMLockType;
+
+typedef enum
+ {
+ pmba_Unused = 0,
+ pmba_Used = 1,
+ pmba_Allocated = 2
+ } PMBlockAttr;
+
+typedef struct
+ {
+ longword offset; // Offset of chunk into file
+ word length; // Length of the chunk
+
+ int xmsPage; // If in XMS, (xmsPage * PMPageSize) gives offset into XMS handle
+
+ PMLockType locked; // If set, this page can't be purged
+ int emsPage; // If in EMS, logical page/offset into page
+ int mainPage; // If in Main, index into handle array
+
+ longword lastHit; // Last frame number of hit
+ } PageListStruct;
+
+typedef struct
+ {
+ int baseEMSPage; // Base EMS page for this phys frame
+ longword lastHit; // Last frame number of hit
+ } EMSListStruct;
+
+extern boolean XMSPresent,EMSPresent;
+extern word XMSPagesAvail,EMSPagesAvail;
+
+extern word ChunksInFile,
+ PMSpriteStart,PMSoundStart;
+extern PageListStruct far *PMPages;
+
+#define PM_GetSoundPage(v) PM_GetPage(PMSoundStart + (v))
+#define PM_GetSpritePage(v) PM_GetPage(PMSpriteStart + (v))
+
+#define PM_LockMainMem() PM_SetMainMemPurge(0)
+#define PM_UnlockMainMem() PM_SetMainMemPurge(3)
+
+
+extern char PageFileName[13];
+
+
+extern void PM_Startup(void),
+ PM_Shutdown(void),
+ PM_Reset(void),
+ PM_Preload(boolean (*update)(word current,word total)),
+ PM_NextFrame(void),
+ PM_SetPageLock(int pagenum,PMLockType lock),
+ PM_SetMainPurge(int level),
+ PM_CheckMainMem(void);
+extern memptr PM_GetPageAddress(int pagenum),
+ PM_GetPage(int pagenum); // Use this one to cache page
+
+void PM_SetMainMemPurge(int level);
--- /dev/null
+++ b/scale.c
@@ -1,0 +1,733 @@
+// WL_SCALE.C
+
+#include "WL_DEF.H"
+#pragma hdrstop
+
+#define OP_RETF 0xcb
+
+/*
+=============================================================================
+
+ GLOBALS
+
+=============================================================================
+*/
+
+t_compscale _seg *scaledirectory[MAXSCALEHEIGHT+1];
+long fullscalefarcall[MAXSCALEHEIGHT+1];
+
+int maxscale,maxscaleshl2;
+
+boolean insetupscaling;
+
+/*
+=============================================================================
+
+ LOCALS
+
+=============================================================================
+*/
+
+t_compscale _seg *work;
+unsigned BuildCompScale (int height, memptr *finalspot);
+
+int stepbytwo;
+
+//===========================================================================
+
+/*
+==============
+=
+= BadScale
+=
+==============
+*/
+
+void far BadScale (void)
+{
+ Quit ("BadScale called!");
+}
+
+
+/*
+==========================
+=
+= SetupScaling
+=
+==========================
+*/
+
+void SetupScaling (int maxscaleheight)
+{
+ int i,x,y;
+ byte far *dest;
+
+ insetupscaling = true;
+
+ maxscaleheight/=2; // one scaler every two pixels
+
+ maxscale = maxscaleheight-1;
+ maxscaleshl2 = maxscale<<2;
+
+//
+// free up old scalers
+//
+ for (i=1;i<MAXSCALEHEIGHT;i++)
+ {
+ if (scaledirectory[i])
+ MM_FreePtr (&(memptr)scaledirectory[i]);
+ if (i>=stepbytwo)
+ i += 2;
+ }
+ memset (scaledirectory,0,sizeof(scaledirectory));
+
+ MM_SortMem ();
+
+//
+// build the compiled scalers
+//
+ stepbytwo = viewheight/2; // save space by double stepping
+ MM_GetPtr (&(memptr)work,20000);
+
+ for (i=1;i<=maxscaleheight;i++)
+ {
+ BuildCompScale (i*2,&(memptr)scaledirectory[i]);
+ if (i>=stepbytwo)
+ i+= 2;
+ }
+ MM_FreePtr (&(memptr)work);
+
+//
+// compact memory and lock down scalers
+//
+ MM_SortMem ();
+ for (i=1;i<=maxscaleheight;i++)
+ {
+ MM_SetLock (&(memptr)scaledirectory[i],true);
+ fullscalefarcall[i] = (unsigned)scaledirectory[i];
+ fullscalefarcall[i] <<=16;
+ fullscalefarcall[i] += scaledirectory[i]->codeofs[0];
+ if (i>=stepbytwo)
+ {
+ scaledirectory[i+1] = scaledirectory[i];
+ fullscalefarcall[i+1] = fullscalefarcall[i];
+ scaledirectory[i+2] = scaledirectory[i];
+ fullscalefarcall[i+2] = fullscalefarcall[i];
+ i+=2;
+ }
+ }
+ scaledirectory[0] = scaledirectory[1];
+ fullscalefarcall[0] = fullscalefarcall[1];
+
+//
+// check for oversize wall drawing
+//
+ for (i=maxscaleheight;i<MAXSCALEHEIGHT;i++)
+ fullscalefarcall[i] = (long)BadScale;
+
+ insetupscaling = false;
+}
+
+//===========================================================================
+
+/*
+========================
+=
+= BuildCompScale
+=
+= Builds a compiled scaler object that will scale a 64 tall object to
+= the given height (centered vertically on the screen)
+=
+= height should be even
+=
+= Call with
+= ---------
+= DS:SI Source for scale
+= ES:DI Dest for scale
+=
+= Calling the compiled scaler only destroys AL
+=
+========================
+*/
+
+unsigned BuildCompScale (int height, memptr *finalspot)
+{
+ byte far *code;
+
+ int i;
+ long fix,step;
+ unsigned src,totalscaled,totalsize;
+ int startpix,endpix,toppix;
+
+
+ step = ((long)height<<16) / 64;
+ code = &work->code[0];
+ toppix = (viewheight-height)/2;
+ fix = 0;
+
+ for (src=0;src<=64;src++)
+ {
+ startpix = fix>>16;
+ fix += step;
+ endpix = fix>>16;
+
+ if (endpix>startpix)
+ work->width[src] = endpix-startpix;
+ else
+ work->width[src] = 0;
+
+//
+// mark the start of the code
+//
+ work->codeofs[src] = FP_OFF(code);
+
+//
+// compile some code if the source pixel generates any screen pixels
+//
+ startpix+=toppix;
+ endpix+=toppix;
+
+ if (startpix == endpix || endpix < 0 || startpix >= viewheight || src == 64)
+ continue;
+
+ //
+ // mov al,[si+src]
+ //
+ *code++ = 0x8a;
+ *code++ = 0x44;
+ *code++ = src;
+
+ for (;startpix<endpix;startpix++)
+ {
+ if (startpix >= viewheight)
+ break; // off the bottom of the view area
+ if (startpix < 0)
+ continue; // not into the view area
+
+ //
+ // mov [es:di+heightofs],al
+ //
+ *code++ = 0x26;
+ *code++ = 0x88;
+ *code++ = 0x85;
+ *((unsigned far *)code)++ = startpix*SCREENBWIDE;
+ }
+
+ }
+
+//
+// retf
+//
+ *code++ = 0xcb;
+
+ totalsize = FP_OFF(code);
+ MM_GetPtr (finalspot,totalsize);
+ _fmemcpy ((byte _seg *)(*finalspot),(byte _seg *)work,totalsize);
+
+ return totalsize;
+}
+
+
+/*
+=======================
+=
+= ScaleLine
+=
+= linescale should have the high word set to the segment of the scaler
+=
+=======================
+*/
+
+extern int slinex,slinewidth;
+extern unsigned far *linecmds;
+extern long linescale;
+extern unsigned maskword;
+
+byte mask1,mask2,mask3;
+
+
+void near ScaleLine (void)
+{
+asm mov cx,WORD PTR [linescale+2]
+asm mov es,cx // segment of scaler
+
+asm mov bp,WORD PTR [linecmds]
+asm mov dx,SC_INDEX+1 // to set SC_MAPMASK
+
+asm mov bx,[slinex]
+asm mov di,bx
+asm shr di,2 // X in bytes
+asm add di,[bufferofs]
+asm and bx,3
+asm shl bx,3
+asm add bx,[slinewidth] // bx = (pixel*8+pixwidth)
+asm mov al,BYTE [mapmasks3-1+bx] // -1 because pixwidth of 1 is first
+asm mov ds,WORD PTR [linecmds+2]
+asm or al,al
+asm jz notthreebyte // scale across three bytes
+asm jmp threebyte
+notthreebyte:
+asm mov al,BYTE PTR ss:[mapmasks2-1+bx] // -1 because pixwidth of 1 is first
+asm or al,al
+asm jnz twobyte // scale across two bytes
+
+//
+// one byte scaling
+//
+asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
+asm out dx,al // set map mask register
+
+scalesingle:
+
+asm mov bx,[ds:bp] // table location of rtl to patch
+asm or bx,bx
+asm jz linedone // 0 signals end of segment list
+asm mov bx,[es:bx]
+asm mov dl,[es:bx] // save old value
+asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
+asm mov si,[ds:bp+4] // table location of entry spot
+asm mov ax,[es:si]
+asm mov WORD PTR ss:[linescale],ax // call here to start scaling
+asm mov si,[ds:bp+2] // corrected top of shape for this segment
+asm add bp,6 // next segment list
+
+asm mov ax,SCREENSEG
+asm mov es,ax
+asm call ss:[linescale] // scale the segment of pixels
+
+asm mov es,cx // segment of scaler
+asm mov BYTE PTR es:[bx],dl // unpatch the RETF
+asm jmp scalesingle // do the next segment
+
+
+//
+// done
+//
+linedone:
+asm mov ax,ss
+asm mov ds,ax
+return;
+
+//
+// two byte scaling
+//
+twobyte:
+asm mov ss:[mask2],al
+asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
+asm mov ss:[mask1],al
+
+scaledouble:
+
+asm mov bx,[ds:bp] // table location of rtl to patch
+asm or bx,bx
+asm jz linedone // 0 signals end of segment list
+asm mov bx,[es:bx]
+asm mov cl,[es:bx] // save old value
+asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
+asm mov si,[ds:bp+4] // table location of entry spot
+asm mov ax,[es:si]
+asm mov WORD PTR ss:[linescale],ax // call here to start scaling
+asm mov si,[ds:bp+2] // corrected top of shape for this segment
+asm add bp,6 // next segment list
+
+asm mov ax,SCREENSEG
+asm mov es,ax
+asm mov al,ss:[mask1]
+asm out dx,al // set map mask register
+asm call ss:[linescale] // scale the segment of pixels
+asm inc di
+asm mov al,ss:[mask2]
+asm out dx,al // set map mask register
+asm call ss:[linescale] // scale the segment of pixels
+asm dec di
+
+asm mov es,WORD PTR ss:[linescale+2] // segment of scaler
+asm mov BYTE PTR es:[bx],cl // unpatch the RETF
+asm jmp scaledouble // do the next segment
+
+
+//
+// three byte scaling
+//
+threebyte:
+asm mov ss:[mask3],al
+asm mov al,BYTE PTR ss:[mapmasks2-1+bx] // -1 because pixwidth of 1 is first
+asm mov ss:[mask2],al
+asm mov al,BYTE PTR ss:[mapmasks1-1+bx] // -1 because pixwidth of 1 is first
+asm mov ss:[mask1],al
+
+scaletriple:
+
+asm mov bx,[ds:bp] // table location of rtl to patch
+asm or bx,bx
+asm jz linedone // 0 signals end of segment list
+asm mov bx,[es:bx]
+asm mov cl,[es:bx] // save old value
+asm mov BYTE PTR es:[bx],OP_RETF // patch a RETF in
+asm mov si,[ds:bp+4] // table location of entry spot
+asm mov ax,[es:si]
+asm mov WORD PTR ss:[linescale],ax // call here to start scaling
+asm mov si,[ds:bp+2] // corrected top of shape for this segment
+asm add bp,6 // next segment list
+
+asm mov ax,SCREENSEG
+asm mov es,ax
+asm mov al,ss:[mask1]
+asm out dx,al // set map mask register
+asm call ss:[linescale] // scale the segment of pixels
+asm inc di
+asm mov al,ss:[mask2]
+asm out dx,al // set map mask register
+asm call ss:[linescale] // scale the segment of pixels
+asm inc di
+asm mov al,ss:[mask3]
+asm out dx,al // set map mask register
+asm call ss:[linescale] // scale the segment of pixels
+asm dec di
+asm dec di
+
+asm mov es,WORD PTR ss:[linescale+2] // segment of scaler
+asm mov BYTE PTR es:[bx],cl // unpatch the RETF
+asm jmp scaletriple // do the next segment
+
+
+}
+
+
+/*
+=======================
+=
+= ScaleShape
+=
+= Draws a compiled shape at [scale] pixels high
+=
+= each vertical line of the shape has a pointer to segment data:
+= end of segment pixel*2 (0 terminates line) used to patch rtl in scaler
+= top of virtual line with segment in proper place
+= start of segment pixel*2, used to jsl into compiled scaler
+= <repeat>
+=
+= Setup for call
+= --------------
+= GC_MODE read mode 1, write mode 2
+= GC_COLORDONTCARE set to 0, so all reads from video memory return 0xff
+= GC_INDEX pointing at GC_BITMASK
+=
+=======================
+*/
+
+static long longtemp;
+
+void ScaleShape (int xcenter, int shapenum, unsigned height)
+{
+ t_compshape _seg *shape;
+ t_compscale _seg *comptable;
+ unsigned scale,srcx,stopx,tempx;
+ int t;
+ unsigned far *cmdptr;
+ boolean leftvis,rightvis;
+
+
+ shape = PM_GetSpritePage (shapenum);
+
+ scale = height>>3; // low three bits are fractional
+ if (!scale || scale>maxscale)
+ return; // too close or far away
+ comptable = scaledirectory[scale];
+
+ *(((unsigned *)&linescale)+1)=(unsigned)comptable; // seg of far call
+ *(((unsigned *)&linecmds)+1)=(unsigned)shape; // seg of shape
+
+//
+// scale to the left (from pixel 31 to shape->leftpix)
+//
+ srcx = 32;
+ slinex = xcenter;
+ stopx = shape->leftpix;
+ cmdptr = &shape->dataofs[31-stopx];
+
+ while ( --srcx >=stopx && slinex>0)
+ {
+ (unsigned)linecmds = *cmdptr--;
+ if ( !(slinewidth = comptable->width[srcx]) )
+ continue;
+
+ if (slinewidth == 1)
+ {
+ slinex--;
+ if (slinex<viewwidth)
+ {
+ if (wallheight[slinex] >= height)
+ continue; // obscured by closer wall
+ ScaleLine ();
+ }
+ continue;
+ }
+
+ //
+ // handle multi pixel lines
+ //
+ if (slinex>viewwidth)
+ {
+ slinex -= slinewidth;
+ slinewidth = viewwidth-slinex;
+ if (slinewidth<1)
+ continue; // still off the right side
+ }
+ else
+ {
+ if (slinewidth>slinex)
+ slinewidth = slinex;
+ slinex -= slinewidth;
+ }
+
+
+ leftvis = (wallheight[slinex] < height);
+ rightvis = (wallheight[slinex+slinewidth-1] < height);
+
+ if (leftvis)
+ {
+ if (rightvis)
+ ScaleLine ();
+ else
+ {
+ while (wallheight[slinex+slinewidth-1] >= height)
+ slinewidth--;
+ ScaleLine ();
+ }
+ }
+ else
+ {
+ if (!rightvis)
+ continue; // totally obscured
+
+ while (wallheight[slinex] >= height)
+ {
+ slinex++;
+ slinewidth--;
+ }
+ ScaleLine ();
+ break; // the rest of the shape is gone
+ }
+ }
+
+
+//
+// scale to the right
+//
+ slinex = xcenter;
+ stopx = shape->rightpix;
+ if (shape->leftpix<31)
+ {
+ srcx = 31;
+ cmdptr = &shape->dataofs[32-shape->leftpix];
+ }
+ else
+ {
+ srcx = shape->leftpix-1;
+ cmdptr = &shape->dataofs[0];
+ }
+ slinewidth = 0;
+
+ while ( ++srcx <= stopx && (slinex+=slinewidth)<viewwidth)
+ {
+ (unsigned)linecmds = *cmdptr++;
+ if ( !(slinewidth = comptable->width[srcx]) )
+ continue;
+
+ if (slinewidth == 1)
+ {
+ if (slinex>=0 && wallheight[slinex] < height)
+ {
+ ScaleLine ();
+ }
+ continue;
+ }
+
+ //
+ // handle multi pixel lines
+ //
+ if (slinex<0)
+ {
+ if (slinewidth <= -slinex)
+ continue; // still off the left edge
+
+ slinewidth += slinex;
+ slinex = 0;
+ }
+ else
+ {
+ if (slinex + slinewidth > viewwidth)
+ slinewidth = viewwidth-slinex;
+ }
+
+
+ leftvis = (wallheight[slinex] < height);
+ rightvis = (wallheight[slinex+slinewidth-1] < height);
+
+ if (leftvis)
+ {
+ if (rightvis)
+ {
+ ScaleLine ();
+ }
+ else
+ {
+ while (wallheight[slinex+slinewidth-1] >= height)
+ slinewidth--;
+ ScaleLine ();
+ break; // the rest of the shape is gone
+ }
+ }
+ else
+ {
+ if (rightvis)
+ {
+ while (wallheight[slinex] >= height)
+ {
+ slinex++;
+ slinewidth--;
+ }
+ ScaleLine ();
+ }
+ else
+ continue; // totally obscured
+ }
+ }
+}
+
+
+
+/*
+=======================
+=
+= SimpleScaleShape
+=
+= NO CLIPPING, height in pixels
+=
+= Draws a compiled shape at [scale] pixels high
+=
+= each vertical line of the shape has a pointer to segment data:
+= end of segment pixel*2 (0 terminates line) used to patch rtl in scaler
+= top of virtual line with segment in proper place
+= start of segment pixel*2, used to jsl into compiled scaler
+= <repeat>
+=
+= Setup for call
+= --------------
+= GC_MODE read mode 1, write mode 2
+= GC_COLORDONTCARE set to 0, so all reads from video memory return 0xff
+= GC_INDEX pointing at GC_BITMASK
+=
+=======================
+*/
+
+void SimpleScaleShape (int xcenter, int shapenum, unsigned height)
+{
+ t_compshape _seg *shape;
+ t_compscale _seg *comptable;
+ unsigned scale,srcx,stopx,tempx;
+ int t;
+ unsigned far *cmdptr;
+ boolean leftvis,rightvis;
+
+
+ shape = PM_GetSpritePage (shapenum);
+
+ scale = height>>1;
+ comptable = scaledirectory[scale];
+
+ *(((unsigned *)&linescale)+1)=(unsigned)comptable; // seg of far call
+ *(((unsigned *)&linecmds)+1)=(unsigned)shape; // seg of shape
+
+//
+// scale to the left (from pixel 31 to shape->leftpix)
+//
+ srcx = 32;
+ slinex = xcenter;
+ stopx = shape->leftpix;
+ cmdptr = &shape->dataofs[31-stopx];
+
+ while ( --srcx >=stopx )
+ {
+ (unsigned)linecmds = *cmdptr--;
+ if ( !(slinewidth = comptable->width[srcx]) )
+ continue;
+
+ slinex -= slinewidth;
+ ScaleLine ();
+ }
+
+
+//
+// scale to the right
+//
+ slinex = xcenter;
+ stopx = shape->rightpix;
+ if (shape->leftpix<31)
+ {
+ srcx = 31;
+ cmdptr = &shape->dataofs[32-shape->leftpix];
+ }
+ else
+ {
+ srcx = shape->leftpix-1;
+ cmdptr = &shape->dataofs[0];
+ }
+ slinewidth = 0;
+
+ while ( ++srcx <= stopx )
+ {
+ (unsigned)linecmds = *cmdptr++;
+ if ( !(slinewidth = comptable->width[srcx]) )
+ continue;
+
+ ScaleLine ();
+ slinex+=slinewidth;
+ }
+}
+
+
+
+
+//
+// bit mask tables for drawing scaled strips up to eight pixels wide
+//
+// down here so the STUPID inline assembler doesn't get confused!
+//
+
+
+byte mapmasks1[4][8] = {
+{1 ,3 ,7 ,15,15,15,15,15},
+{2 ,6 ,14,14,14,14,14,14},
+{4 ,12,12,12,12,12,12,12},
+{8 ,8 ,8 ,8 ,8 ,8 ,8 ,8} };
+
+byte mapmasks2[4][8] = {
+{0 ,0 ,0 ,0 ,1 ,3 ,7 ,15},
+{0 ,0 ,0 ,1 ,3 ,7 ,15,15},
+{0 ,0 ,1 ,3 ,7 ,15,15,15},
+{0 ,1 ,3 ,7 ,15,15,15,15} };
+
+byte mapmasks3[4][8] = {
+{0 ,0 ,0 ,0 ,0 ,0 ,0 ,0},
+{0 ,0 ,0 ,0 ,0 ,0 ,0 ,1},
+{0 ,0 ,0 ,0 ,0 ,0 ,1 ,3},
+{0 ,0 ,0 ,0 ,0 ,1 ,3 ,7} };
+
+
+unsigned wordmasks[8][8] = {
+{0x0080,0x00c0,0x00e0,0x00f0,0x00f8,0x00fc,0x00fe,0x00ff},
+{0x0040,0x0060,0x0070,0x0078,0x007c,0x007e,0x007f,0x807f},
+{0x0020,0x0030,0x0038,0x003c,0x003e,0x003f,0x803f,0xc03f},
+{0x0010,0x0018,0x001c,0x001e,0x001f,0x801f,0xc01f,0xe01f},
+{0x0008,0x000c,0x000e,0x000f,0x800f,0xc00f,0xe00f,0xf00f},
+{0x0004,0x0006,0x0007,0x8007,0xc007,0xe007,0xf007,0xf807},
+{0x0002,0x0003,0x8003,0xc003,0xe003,0xf003,0xf803,0xfc03},
+{0x0001,0x8001,0xc001,0xe001,0xf001,0xf801,0xfc01,0xfe01} };
+
+int slinex,slinewidth;
+unsigned far *linecmds;
+long linescale;
+unsigned maskword;
+
--- /dev/null
+++ b/sd.asm
@@ -1,0 +1,526 @@
+;
+; ID_SD_A.ASM
+; Id Sound Manager assembly stuff
+
+ .286C
+ IDEAL
+ MODEL MEDIUM,C
+ JUMPS
+
+ INCLUDE 'ID_SD.EQU'
+
+DEBUG = 0
+
+ EXTRN SDL_DigitizedDone:FAR
+ EXTRN alOut:FAR
+
+;============================================================================
+
+DATASEG
+
+ EXTRN sqActive:WORD
+ EXTRN ssSample:DWORD
+ EXTRN ssLengthLeft:WORD
+ EXTRN ssControl:WORD
+ EXTRN ssStatus:WORD
+ EXTRN ssData:WORD
+ EXTRN ssOn:BYTE
+ EXTRN ssOff:BYTE
+
+ EXTRN pcSound:DWORD
+ EXTRN pcLengthLeft:WORD
+ EXTRN pcLastSample:BYTE
+ EXTRN pcSoundLookup:WORD
+
+ EXTRN alSound:DWORD
+ EXTRN alBlock:WORD
+ EXTRN alLengthLeft:WORD
+ EXTRN alTimeCount:DWORD
+
+ EXTRN sqHack:DWORD
+ EXTRN sqHackPtr:DWORD
+ EXTRN sqHackLen:WORD
+ EXTRN sqHackSeqLen:WORD
+ EXTRN sqHackTime:DWORD
+
+ EXTRN HackCount:WORD
+ EXTRN TimeCount:WORD
+ EXTRN LocalTime:WORD
+
+ EXTRN TimerCount:WORD
+ EXTRN TimerDivisor:WORD
+ EXTRN t0OldService:DWORD
+
+ EXTRN SoundMode:WORD
+ EXTRN DigiMode:WORD
+
+ EXTRN SoundNumber:WORD
+ EXTRN SoundPriority:WORD
+
+count_time dw ?
+count_fx dw ?
+
+pcdtab db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
+ db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
+ db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
+ db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
+ db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
+ db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
+ db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
+ db 00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b,00b
+ db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
+ db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
+ db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
+ db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
+ db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
+ db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
+ db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
+ db 10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b,10b
+
+
+;============================================================================
+
+CODESEG
+
+MyDS dw ?
+
+pcindicate dw ?
+extreme dw ?
+
+ PROC SDL_SetDS
+ PUBLIC SDL_SetDS
+
+ mov ax,ds
+ mov [cs:MyDS],ds
+ ret
+
+ ENDP
+
+;
+; COMMONSTART
+; Macro used for common prefix code
+;
+ MACRO COMMONSTART
+ IF DEBUG
+ push dx
+ push ax
+ mov dx,STATUS_REGISTER_1
+ in al,dx
+ mov dx,ATR_INDEX
+ mov al,ATR_OVERSCAN
+ out dx,al
+ mov al,4 ; red
+ out dx,al
+ ENDIF
+
+ push ds
+ push ax
+
+ mov ds,[cs:MyDS]
+ inc [HackCount]
+ ENDM
+
+;
+; DOFX
+; Macro used to do the sound effects code
+;
+ MACRO DOFX
+ les di,[pcSound] ; PC sound effects
+ mov ax,es
+ or ax,di
+ jz @@nopc ; nil pointer - no PC sound effect going
+
+ mov bl,[es:di] ; Get the byte
+ inc [WORD PTR pcSound] ; Increment pointer
+ cmp [pcLastSample],bl ; Is this sample the same as last?
+ jz @@pcsame ; Yep - don't do anything
+ mov [pcLastSample],bl ; No, save it for next time
+
+ or bl,bl
+ jz @@pcoff ; If 0, turn sounds off
+ xor bh,bh
+ shl bx,1
+ mov bx,[pcSoundLookup+bx] ; Use byte as index into frequency table
+
+ mov al,0b6h ; Write to channel 2 (speaker) timer
+ out pcTAccess,al
+ mov al,bl
+ out pcTimer,al ; Low byte
+ mov al,bh
+ out pcTimer,al ; High byte
+
+ in al,pcSpeaker ; Turn the speaker & gate on
+ or al,3
+ out pcSpeaker,al
+
+ jmp @@pcsame
+
+@@pcoff:
+ in al,pcSpeaker ; Turn the speaker & gate off
+ and al,0fch ; ~3
+ out pcSpeaker,al
+
+@@pcsame:
+ dec [pcLengthLeft] ; Decrement length
+ jnz @@nopc ; If not 0, we're not done with the sound
+
+ mov ax,0
+ mov [WORD PTR pcSound],ax ; Zero the pointer
+ mov [WORD PTR pcSound + 2],ax
+ mov [SoundNumber],ax ; Indicate no sound
+ mov [SoundPriority],ax ; with no priority
+
+ in al,pcSpeaker ; Turn the speaker off
+ and al,0fdh ; ~2
+ out pcSpeaker,al
+@@nopc:
+
+ les di,[alSound] ; AdLib sound effects
+ mov ax,es
+ or ax,di
+ jz @@noal ; nil pointer - no AdLib effect going
+
+ xor ah,ah
+ mov al,[es:di]
+ or al,al
+ jz @@aldone
+
+ CALL alOut C,alFreqL,ax
+ mov ax,[alBlock]
+
+@@aldone:
+ CALL alOut C,alFreqH,ax
+ inc [WORD PTR alSound]
+ dec [alLengthLeft]
+ jnz @@noal
+
+ mov ax,0
+ mov [WORD PTR alSound],ax ; Zero the pointer
+ mov [WORD PTR alSound + 2],ax
+ mov [SoundNumber],ax ; Indicate no sound
+ mov [SoundPriority],ax ; with no priority
+ CALL alOut C,alFreqH,ax ; Turn off the sound
+@@noal:
+
+ ENDM
+
+;
+;
+;
+ MACRO TIME
+ cmp [count_time],2
+ jb @@notime
+ add [LocalTime],1
+ adc [LocalTime+2],0
+ add [TimeCount],1
+ adc [TimeCount+2],0
+ mov [count_time],0
+@@notime:
+ ENDM
+
+;
+; COMMONEND
+; Macro used for common suffix code
+;
+ MACRO COMMONEND
+@@fullexit:
+ pop es
+ popa
+
+@@nosave:
+ mov ax,[TimerDivisor]
+ add [TimerCount],ax
+ jnc @@myack
+
+ pushf
+ call [t0OldService]
+ jmp @@out
+
+@@myack:
+ mov al,20h
+ out 20h,al
+
+@@out:
+ pop ax
+ pop ds
+
+ IF DEBUG
+ mov dx,STATUS_REGISTER_1
+ in al,dx
+ mov dx,ATR_INDEX
+ mov al,ATR_OVERSCAN
+ out dx,al
+ mov al,3 ; blue
+ out dx,al
+ mov al,20h ; normal
+ out dx,al
+ pop ax
+ pop dx
+ ENDIF
+
+ iret
+ ENDM
+
+;
+; SDL_IndicatePC
+;
+ PROC SDL_IndicatePC on:WORD
+ PUBLIC SDL_IndicatePC
+
+ mov ax,[on]
+ mov [cs:pcindicate],ax
+ ret
+
+ ENDP
+
+;
+; SDL_t0ExtremeAsmService
+; Timer 0 ISR 7000Hz interrupts
+;
+ PROC SDL_t0ExtremeAsmService
+ PUBLIC SDL_t0ExtremeAsmService
+
+ push ax
+ mov al,[BYTE PTR cs:pcindicate]
+ or al,al
+ jz @@done
+
+ push ds
+ push es
+ pusha
+
+ mov ds,[cs:MyDS]
+
+ les di,[pcSound]
+ mov ax,es
+ or ax,di
+ jz @@donereg ; nil pointer
+
+ mov bl,[es:di] ; Get the byte
+ inc [WORD PTR pcSound] ; Increment pointer
+
+ and bl,11100000b ; Nuke some of the precision (DEBUG - do this in the table)
+
+ xor bh,bh
+ mov ah,[pcdtab+bx] ; Translate the byte
+
+ in al,pcSpeaker
+ and al,11111100b
+ or al,ah
+ out pcSpeaker,al
+
+ dec [pcLengthLeft]
+ jnz @@donereg
+
+ mov [WORD PTR pcSound],0 ; We're done with this sample
+ mov [WORD PTR pcSound+2],0
+
+ in al,pcSpeaker
+ and al,11111100b
+ out pcSpeaker,al
+
+ call SDL_DigitizedDone
+
+@@donereg:
+ popa
+ pop es
+ pop ds
+
+@@done:
+ inc [cs:extreme]
+ cmp [cs:extreme],10
+ jae @@tofast
+
+ mov al,20h
+ out 20h,al
+ pop ax
+ iret
+
+@@tofast:
+ mov [cs:extreme],0
+ pop ax
+
+; jmp SDL_t0FastAsmService ; Drops through to SDL_t0FastAsmService
+
+ ENDP
+
+;
+; SDL_t0FastAsmService
+; Timer 0 ISR for 700Hz interrupts
+;
+ PROC SDL_t0FastAsmService
+ PUBLIC SDL_t0FastAsmService
+
+ COMMONSTART
+
+ inc [count_fx] ; Time to do PC/AdLib effects & time?
+ cmp [count_fx],5
+ jae @@dofull
+
+ mov ax,[sqActive] ; Is the sequencer active?
+ or ax,ax
+ jnz @@dofull
+
+ mov ax,[WORD PTR ssSample] ; Is there a sample for the Sound Src?
+ or ax,[WORD PTR ssSample+2]
+ jz @@nosave
+
+@@dofull:
+ pusha
+ push es
+
+ cmp [count_fx],5
+ jb @@nofx
+ mov [count_fx],0
+ DOFX
+
+ inc [count_time]
+ TIME
+@@nofx:
+
+ mov ax,[sqActive]
+ or ax,ax
+ jz @@nosq
+
+ mov ax,[sqHackLen]
+ or ax,ax
+ jz @@sqdone
+
+ les di,[sqHackPtr]
+@@sqloop:
+ mov ax,[WORD PTR sqHackTime+2]
+ cmp ax,[WORD PTR alTimeCount+2]
+ ja @@sqdone
+ mov ax,[WORD PTR sqHackTime]
+ cmp ax,[WORD PTR alTimeCount]
+ ja @@sqdone
+
+ mov ax,[es:di+2] ; Get time to next event
+ add ax,[WORD PTR alTimeCount]
+ mov [WORD PTR sqHackTime],ax
+ mov ax,[WORD PTR alTimeCount+2]
+ adc ax,0
+ mov [WORD PTR sqHackTime+2],ax
+
+ mov ax,[es:di] ; Get register/value pair
+ xor bh,bh
+ mov bl,ah
+ xor ah,ah
+ CALL alOut C,ax,bx
+
+ add di,4
+ mov [WORD PTR sqHackPtr],di
+
+ sub [sqHackLen],4
+ jnz @@sqloop
+
+@@sqdone:
+ add [WORD PTR alTimeCount],1
+ adc [WORD PTR alTimeCount+2],0
+ mov ax,[sqHackLen]
+ or ax,ax
+ jnz @@nosq
+
+ mov ax,[WORD PTR sqHack] ; Copy pointer
+ mov [WORD PTR sqHackPtr],ax
+ mov ax,[WORD PTR sqHack+2]
+ mov [WORD PTR sqHackPtr+2],ax
+
+ mov ax,[sqHackSeqLen] ; Copy length
+ mov [sqHackLen],ax
+
+ mov ax,0
+ mov [WORD PTR alTimeCount],ax ; Reset time counts
+ mov [WORD PTR alTimeCount+2],ax
+ mov [WORD PTR sqHackTime],ax
+ mov [WORD PTR sqHackTime+2],ax
+@@nosq:
+
+ les di,[ssSample] ; Get pointer to Sound Source sample
+ mov ax,es
+ or ax,di
+ jz @@ssdone ; If nil, skip this
+
+@@ssloop:
+ mov dx,[ssStatus] ; Check to see if FIFO has any empty slots
+ in al,dx
+ test al,40h
+ jnz @@ssdone ; Nope - don't push any more data out
+
+ mov dx,[ssData]
+ mov al,[es:di] ; al = *ssSample
+ out dx,al ; Pump the value out
+
+ mov dx,[ssControl] ; Pulse printer select
+ mov al,[ssOff]
+ out dx,al
+ push ax
+ pop ax
+ mov al,[ssOn]
+ out dx,al
+
+ push ax ; Delay a short while
+ pop ax
+
+ inc di
+ mov [WORD PTR ssSample],di ; ssSample++
+
+ dec [ssLengthLeft]
+ jnz @@ssloop
+
+ mov [WORD PTR ssSample],0 ; We're done with this sample
+ mov [WORD PTR ssSample+2],0
+
+ call SDL_DigitizedDone
+@@ssdone:
+
+ COMMONEND
+
+ ENDP
+
+;
+; SDL_t0SlowAsmService
+; Timer 0 ISR for 140Hz interrupts
+;
+ PROC SDL_t0SlowAsmService
+ PUBLIC SDL_t0SlowAsmService
+
+ IF DEBUG
+ push dx
+ push ax
+ mov dx,STATUS_REGISTER_1
+ in al,dx
+ mov dx,ATR_INDEX
+ mov al,ATR_OVERSCAN
+ out dx,al
+ mov al,4 ; red
+ out dx,al
+ ENDIF
+
+ push ds
+ push ax
+
+ mov ds,[cs:MyDS]
+
+ inc [count_time]
+ TIME
+
+ mov ax,[WORD PTR pcSound] ; Is there a PC sound effect going?
+ or ax,[WORD PTR pcSound+2]
+ jnz @@dofull
+
+ mov ax,[WORD PTR alSound] ; Is there an AdLib sound effect going?
+ or ax,[WORD PTR alSound+2]
+ jz @@nosave
+
+@@dofull:
+ pusha
+ push es
+
+ DOFX
+
+ COMMONEND
+
+ ENDP
+
+ END
--- /dev/null
+++ b/sd.c
@@ -1,0 +1,2367 @@
+//
+// ID Engine
+// ID_SD.c - Sound Manager for Wolfenstein 3D
+// v1.2
+// By Jason Blochowiak
+//
+
+//
+// This module handles dealing with generating sound on the appropriate
+// hardware
+//
+// Depends on: User Mgr (for parm checking)
+//
+// Globals:
+// For User Mgr:
+// SoundSourcePresent - Sound Source thingie present?
+// SoundBlasterPresent - SoundBlaster card present?
+// AdLibPresent - AdLib card present?
+// SoundMode - What device is used for sound effects
+// (Use SM_SetSoundMode() to set)
+// MusicMode - What device is used for music
+// (Use SM_SetMusicMode() to set)
+// DigiMode - What device is used for digitized sound effects
+// (Use SM_SetDigiDevice() to set)
+//
+// For Cache Mgr:
+// NeedsDigitized - load digitized sounds?
+// NeedsMusic - load music?
+//
+
+#pragma hdrstop // Wierdo thing with MUSE
+
+#include <dos.h>
+
+#ifdef _MUSE_ // Will be defined in ID_Types.h
+#include "ID_SD.h"
+#else
+#include "ID_HEADS.H"
+#endif
+#pragma hdrstop
+#pragma warn -pia
+
+#ifdef nil
+#undef nil
+#endif
+#define nil 0
+
+#define SDL_SoundFinished() {SoundNumber = SoundPriority = 0;}
+
+// Macros for SoundBlaster stuff
+#define sbOut(n,b) outportb((n) + sbLocation,b)
+#define sbIn(n) inportb((n) + sbLocation)
+#define sbWriteDelay() while (sbIn(sbWriteStat) & 0x80);
+#define sbReadDelay() while (sbIn(sbDataAvail) & 0x80);
+
+// Macros for AdLib stuff
+#define selreg(n) outportb(alFMAddr,n)
+#define writereg(n) outportb(alFMData,n)
+#define readstat() inportb(alFMStatus)
+
+// Imports from ID_SD_A.ASM
+extern void SDL_SetDS(void),
+ SDL_IndicatePC(boolean on);
+extern void interrupt SDL_t0ExtremeAsmService(void),
+ SDL_t0FastAsmService(void),
+ SDL_t0SlowAsmService(void);
+
+// Global variables
+ boolean SoundSourcePresent,
+ AdLibPresent,
+ SoundBlasterPresent,SBProPresent,
+ NeedsDigitized,NeedsMusic,
+ SoundPositioned;
+ SDMode SoundMode;
+ SMMode MusicMode;
+ SDSMode DigiMode;
+ longword TimeCount;
+ word HackCount;
+ word *SoundTable; // Really * _seg *SoundTable, but that don't work
+ boolean ssIsTandy;
+ word ssPort = 2;
+ int DigiMap[LASTSOUND];
+
+// Internal variables
+static boolean SD_Started;
+ boolean nextsoundpos;
+ longword TimerDivisor,TimerCount;
+static char *ParmStrings[] =
+ {
+ "noal",
+ "nosb",
+ "nopro",
+ "noss",
+ "sst",
+ "ss1",
+ "ss2",
+ "ss3",
+ nil
+ };
+static void (*SoundUserHook)(void);
+ soundnames SoundNumber,DigiNumber;
+ word SoundPriority,DigiPriority;
+ int LeftPosition,RightPosition;
+ void interrupt (*t0OldService)(void);
+ long LocalTime;
+ word TimerRate;
+
+ word NumDigi,DigiLeft,DigiPage;
+ word _seg *DigiList;
+ word DigiLastStart,DigiLastEnd;
+ boolean DigiPlaying;
+static boolean DigiMissed,DigiLastSegment;
+static memptr DigiNextAddr;
+static word DigiNextLen;
+
+// SoundBlaster variables
+static boolean sbNoCheck,sbNoProCheck;
+static volatile boolean sbSamplePlaying;
+static byte sbOldIntMask = -1;
+static volatile byte huge *sbNextSegPtr;
+static byte sbDMA = 1,
+ sbDMAa1 = 0x83,sbDMAa2 = 2,sbDMAa3 = 3,
+ sba1Vals[] = {0x87,0x83,0,0x82},
+ sba2Vals[] = {0,2,0,6},
+ sba3Vals[] = {1,3,0,7};
+static int sbLocation = -1,sbInterrupt = 7,sbIntVec = 0xf,
+ sbIntVectors[] = {-1,-1,0xa,0xb,-1,0xd,-1,0xf,-1,-1,-1};
+static volatile longword sbNextSegLen;
+static volatile SampledSound huge *sbSamples;
+static void interrupt (*sbOldIntHand)(void);
+static byte sbpOldFMMix,sbpOldVOCMix;
+
+// SoundSource variables
+ boolean ssNoCheck;
+ boolean ssActive;
+ word ssControl,ssStatus,ssData;
+ byte ssOn,ssOff;
+ volatile byte far *ssSample;
+ volatile longword ssLengthLeft;
+
+// PC Sound variables
+ volatile byte pcLastSample,far *pcSound;
+ longword pcLengthLeft;
+ word pcSoundLookup[255];
+
+// AdLib variables
+ boolean alNoCheck;
+ byte far *alSound;
+ word alBlock;
+ longword alLengthLeft;
+ longword alTimeCount;
+ Instrument alZeroInst;
+
+// This table maps channel numbers to carrier and modulator op cells
+static byte carriers[9] = { 3, 4, 5,11,12,13,19,20,21},
+ modifiers[9] = { 0, 1, 2, 8, 9,10,16,17,18},
+// This table maps percussive voice numbers to op cells
+ pcarriers[5] = {19,0xff,0xff,0xff,0xff},
+ pmodifiers[5] = {16,17,18,20,21};
+
+// Sequencer variables
+ boolean sqActive;
+static word alFXReg;
+static ActiveTrack *tracks[sqMaxTracks],
+ mytracks[sqMaxTracks];
+static word sqMode,sqFadeStep;
+ word far *sqHack,far *sqHackPtr,sqHackLen,sqHackSeqLen;
+ long sqHackTime;
+
+// Internal routines
+ void SDL_DigitizedDone(void);
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_SetTimer0() - Sets system timer 0 to the specified speed
+//
+///////////////////////////////////////////////////////////////////////////
+#pragma argsused
+static void
+SDL_SetTimer0(word speed)
+{
+#ifndef TPROF // If using Borland's profiling, don't screw with the timer
+asm pushf
+asm cli
+
+ outportb(0x43,0x36); // Change timer 0
+ outportb(0x40,speed);
+ outportb(0x40,speed >> 8);
+ // Kludge to handle special case for digitized PC sounds
+ if (TimerDivisor == (1192030 / (TickBase * 100)))
+ TimerDivisor = (1192030 / (TickBase * 10));
+ else
+ TimerDivisor = speed;
+
+asm popf
+#else
+ TimerDivisor = 0x10000;
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_SetIntsPerSec() - Uses SDL_SetTimer0() to set the number of
+// interrupts generated by system timer 0 per second
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_SetIntsPerSec(word ints)
+{
+ TimerRate = ints;
+ SDL_SetTimer0(1192030 / ints);
+}
+
+static void
+SDL_SetTimerSpeed(void)
+{
+ word rate;
+ void interrupt (*isr)(void);
+
+ if ((DigiMode == sds_PC) && DigiPlaying)
+ {
+ rate = TickBase * 100;
+ isr = SDL_t0ExtremeAsmService;
+ }
+ else if
+ (
+ (MusicMode == smm_AdLib)
+ || ((DigiMode == sds_SoundSource) && DigiPlaying)
+ )
+ {
+ rate = TickBase * 10;
+ isr = SDL_t0FastAsmService;
+ }
+ else
+ {
+ rate = TickBase * 2;
+ isr = SDL_t0SlowAsmService;
+ }
+
+ if (rate != TimerRate)
+ {
+ setvect(8,isr);
+ SDL_SetIntsPerSec(rate);
+ TimerRate = rate;
+ }
+}
+
+//
+// SoundBlaster code
+//
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_SBStopSample() - Stops any active sampled sound and causes DMA
+// requests from the SoundBlaster to cease
+//
+///////////////////////////////////////////////////////////////////////////
+#ifdef _MUSE_
+void
+#else
+static void
+#endif
+SDL_SBStopSample(void)
+{
+ byte is;
+
+asm pushf
+asm cli
+
+ if (sbSamplePlaying)
+ {
+ sbSamplePlaying = false;
+
+ sbWriteDelay();
+ sbOut(sbWriteCmd,0xd0); // Turn off DSP DMA
+
+ is = inportb(0x21); // Restore interrupt mask bit
+ if (sbOldIntMask & (1 << sbInterrupt))
+ is |= (1 << sbInterrupt);
+ else
+ is &= ~(1 << sbInterrupt);
+ outportb(0x21,is);
+ }
+
+asm popf
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_SBPlaySeg() - Plays a chunk of sampled sound on the SoundBlaster
+// Insures that the chunk doesn't cross a bank boundary, programs the DMA
+// controller, and tells the SB to start doing DMA requests for DAC
+//
+///////////////////////////////////////////////////////////////////////////
+static longword
+SDL_SBPlaySeg(volatile byte huge *data,longword length)
+{
+ unsigned datapage;
+ longword dataofs,uselen;
+
+ uselen = length;
+ datapage = FP_SEG(data) >> 12;
+ dataofs = ((FP_SEG(data) & 0xfff) << 4) + FP_OFF(data);
+ if (dataofs >= 0x10000)
+ {
+ datapage++;
+ dataofs -= 0x10000;
+ }
+
+ if (dataofs + uselen > 0x10000)
+ uselen = 0x10000 - dataofs;
+
+ uselen--;
+
+ // Program the DMA controller
+asm pushf
+asm cli
+ outportb(0x0a,sbDMA | 4); // Mask off DMA on channel sbDMA
+ outportb(0x0c,0); // Clear byte ptr flip-flop to lower byte
+ outportb(0x0b,0x49); // Set transfer mode for D/A conv
+ outportb(sbDMAa2,(byte)dataofs); // Give LSB of address
+ outportb(sbDMAa2,(byte)(dataofs >> 8)); // Give MSB of address
+ outportb(sbDMAa1,(byte)datapage); // Give page of address
+ outportb(sbDMAa3,(byte)uselen); // Give LSB of length
+ outportb(sbDMAa3,(byte)(uselen >> 8)); // Give MSB of length
+ outportb(0x0a,sbDMA); // Re-enable DMA on channel sbDMA
+
+ // Start playing the thing
+ sbWriteDelay();
+ sbOut(sbWriteCmd,0x14);
+ sbWriteDelay();
+ sbOut(sbWriteData,(byte)uselen);
+ sbWriteDelay();
+ sbOut(sbWriteData,(byte)(uselen >> 8));
+asm popf
+
+ return(uselen + 1);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_SBService() - Services the SoundBlaster DMA interrupt
+//
+///////////////////////////////////////////////////////////////////////////
+static void interrupt
+SDL_SBService(void)
+{
+ longword used;
+
+ sbIn(sbDataAvail); // Ack interrupt to SB
+
+ if (sbNextSegPtr)
+ {
+ used = SDL_SBPlaySeg(sbNextSegPtr,sbNextSegLen);
+ if (sbNextSegLen <= used)
+ sbNextSegPtr = nil;
+ else
+ {
+ sbNextSegPtr += used;
+ sbNextSegLen -= used;
+ }
+ }
+ else
+ {
+ SDL_SBStopSample();
+ SDL_DigitizedDone();
+ }
+
+ outportb(0x20,0x20); // Ack interrupt
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_SBPlaySample() - Plays a sampled sound on the SoundBlaster. Sets up
+// DMA to play the sound
+//
+///////////////////////////////////////////////////////////////////////////
+#ifdef _MUSE_
+void
+#else
+static void
+#endif
+SDL_SBPlaySample(byte huge *data,longword len)
+{
+ longword used;
+
+ SDL_SBStopSample();
+
+asm pushf
+asm cli
+
+ used = SDL_SBPlaySeg(data,len);
+ if (len <= used)
+ sbNextSegPtr = nil;
+ else
+ {
+ sbNextSegPtr = data + used;
+ sbNextSegLen = len - used;
+ }
+
+ // Save old interrupt status and unmask ours
+ sbOldIntMask = inportb(0x21);
+ outportb(0x21,sbOldIntMask & ~(1 << sbInterrupt));
+
+ sbWriteDelay();
+ sbOut(sbWriteCmd,0xd4); // Make sure DSP DMA is enabled
+
+ sbSamplePlaying = true;
+
+asm popf
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_PositionSBP() - Sets the attenuation levels for the left and right
+// channels by using the mixer chip on the SB Pro. This hits a hole in
+// the address map for normal SBs.
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_PositionSBP(int leftpos,int rightpos)
+{
+ byte v;
+
+ if (!SBProPresent)
+ return;
+
+ leftpos = 15 - leftpos;
+ rightpos = 15 - rightpos;
+ v = ((leftpos & 0x0f) << 4) | (rightpos & 0x0f);
+
+asm pushf
+asm cli
+
+ sbOut(sbpMixerAddr,sbpmVoiceVol);
+ sbOut(sbpMixerData,v);
+
+asm popf
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_CheckSB() - Checks to see if a SoundBlaster resides at a
+// particular I/O location
+//
+///////////////////////////////////////////////////////////////////////////
+static boolean
+SDL_CheckSB(int port)
+{
+ int i;
+
+ sbLocation = port << 4; // Initialize stuff for later use
+
+ sbOut(sbReset,true); // Reset the SoundBlaster DSP
+asm mov dx,0x388 // Wait >4usec
+asm in al, dx
+asm in al, dx
+asm in al, dx
+asm in al, dx
+asm in al, dx
+asm in al, dx
+asm in al, dx
+asm in al, dx
+asm in al, dx
+
+ sbOut(sbReset,false); // Turn off sb DSP reset
+asm mov dx,0x388 // Wait >100usec
+asm mov cx,100
+usecloop:
+asm in al,dx
+asm loop usecloop
+
+ for (i = 0;i < 100;i++)
+ {
+ if (sbIn(sbDataAvail) & 0x80) // If data is available...
+ {
+ if (sbIn(sbReadData) == 0xaa) // If it matches correct value
+ return(true);
+ else
+ {
+ sbLocation = -1; // Otherwise not a SoundBlaster
+ return(false);
+ }
+ }
+ }
+ sbLocation = -1; // Retry count exceeded - fail
+ return(false);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// Checks to see if a SoundBlaster is in the system. If the port passed is
+// -1, then it scans through all possible I/O locations. If the port
+// passed is 0, then it uses the default (2). If the port is >0, then
+// it just passes it directly to SDL_CheckSB()
+//
+///////////////////////////////////////////////////////////////////////////
+static boolean
+SDL_DetectSoundBlaster(int port)
+{
+ int i;
+
+ if (port == 0) // If user specifies default, use 2
+ port = 2;
+ if (port == -1)
+ {
+ if (SDL_CheckSB(2)) // Check default before scanning
+ return(true);
+
+ if (SDL_CheckSB(4)) // Check other SB Pro location before scan
+ return(true);
+
+ for (i = 1;i <= 6;i++) // Scan through possible SB locations
+ {
+ if ((i == 2) || (i == 4))
+ continue;
+
+ if (SDL_CheckSB(i)) // If found at this address,
+ return(true); // return success
+ }
+ return(false); // All addresses failed, return failure
+ }
+ else
+ return(SDL_CheckSB(port)); // User specified address or default
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_SBSetDMA() - Sets the DMA channel to be used by the SoundBlaster
+// code. Sets up sbDMA, and sbDMAa1-sbDMAa3 (used by SDL_SBPlaySeg()).
+//
+///////////////////////////////////////////////////////////////////////////
+void
+SDL_SBSetDMA(byte channel)
+{
+ if (channel > 3)
+ Quit("SDL_SBSetDMA() - invalid SoundBlaster DMA channel");
+
+ sbDMA = channel;
+ sbDMAa1 = sba1Vals[channel];
+ sbDMAa2 = sba2Vals[channel];
+ sbDMAa3 = sba3Vals[channel];
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_StartSB() - Turns on the SoundBlaster
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_StartSB(void)
+{
+ byte timevalue,test;
+
+ sbIntVec = sbIntVectors[sbInterrupt];
+ if (sbIntVec < 0)
+ Quit("SDL_StartSB: Illegal or unsupported interrupt number for SoundBlaster");
+
+ sbOldIntHand = getvect(sbIntVec); // Get old interrupt handler
+ setvect(sbIntVec,SDL_SBService); // Set mine
+
+ sbWriteDelay();
+ sbOut(sbWriteCmd,0xd1); // Turn on DSP speaker
+
+ // Set the SoundBlaster DAC time constant for 7KHz
+ timevalue = 256 - (1000000 / 7000);
+ sbWriteDelay();
+ sbOut(sbWriteCmd,0x40);
+ sbWriteDelay();
+ sbOut(sbWriteData,timevalue);
+
+ SBProPresent = false;
+ if (sbNoProCheck)
+ return;
+
+ // Check to see if this is a SB Pro
+ sbOut(sbpMixerAddr,sbpmFMVol);
+ sbpOldFMMix = sbIn(sbpMixerData);
+ sbOut(sbpMixerData,0xbb);
+ test = sbIn(sbpMixerData);
+ if (test == 0xbb)
+ {
+ // Boost FM output levels to be equivilent with digitized output
+ sbOut(sbpMixerData,0xff);
+ test = sbIn(sbpMixerData);
+ if (test == 0xff)
+ {
+ SBProPresent = true;
+
+ // Save old Voice output levels (SB Pro)
+ sbOut(sbpMixerAddr,sbpmVoiceVol);
+ sbpOldVOCMix = sbIn(sbpMixerData);
+
+ // Turn SB Pro stereo DAC off
+ sbOut(sbpMixerAddr,sbpmControl);
+ sbOut(sbpMixerData,0); // 0=off,2=on
+ }
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_ShutSB() - Turns off the SoundBlaster
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_ShutSB(void)
+{
+ SDL_SBStopSample();
+
+ if (SBProPresent)
+ {
+ // Restore FM output levels (SB Pro)
+ sbOut(sbpMixerAddr,sbpmFMVol);
+ sbOut(sbpMixerData,sbpOldFMMix);
+
+ // Restore Voice output levels (SB Pro)
+ sbOut(sbpMixerAddr,sbpmVoiceVol);
+ sbOut(sbpMixerData,sbpOldVOCMix);
+ }
+
+ setvect(sbIntVec,sbOldIntHand); // Set vector back
+}
+
+// Sound Source Code
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_SSStopSample() - Stops a sample playing on the Sound Source
+//
+///////////////////////////////////////////////////////////////////////////
+#ifdef _MUSE_
+void
+#else
+static void
+#endif
+SDL_SSStopSample(void)
+{
+asm pushf
+asm cli
+
+ (long)ssSample = 0;
+
+asm popf
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_SSService() - Handles playing the next sample on the Sound Source
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_SSService(void)
+{
+ boolean gotit;
+ byte v;
+
+ while (ssSample)
+ {
+ asm mov dx,[ssStatus] // Check to see if FIFO is currently empty
+ asm in al,dx
+ asm test al,0x40
+ asm jnz done // Nope - don't push any more data out
+
+ v = *ssSample++;
+ if (!(--ssLengthLeft))
+ {
+ (long)ssSample = 0;
+ SDL_DigitizedDone();
+ }
+
+ asm mov dx,[ssData] // Pump the value out
+ asm mov al,[v]
+ asm out dx,al
+
+ asm mov dx,[ssControl] // Pulse printer select
+ asm mov al,[ssOff]
+ asm out dx,al
+ asm push ax
+ asm pop ax
+ asm mov al,[ssOn]
+ asm out dx,al
+
+ asm push ax // Delay a short while
+ asm pop ax
+ asm push ax
+ asm pop ax
+ }
+done:;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_SSPlaySample() - Plays the specified sample on the Sound Source
+//
+///////////////////////////////////////////////////////////////////////////
+#ifdef _MUSE_
+void
+#else
+static void
+#endif
+SDL_SSPlaySample(byte huge *data,longword len)
+{
+asm pushf
+asm cli
+
+ ssLengthLeft = len;
+ ssSample = (volatile byte far *)data;
+
+asm popf
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_StartSS() - Sets up for and turns on the Sound Source
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_StartSS(void)
+{
+ if (ssPort == 3)
+ ssControl = 0x27a; // If using LPT3
+ else if (ssPort == 2)
+ ssControl = 0x37a; // If using LPT2
+ else
+ ssControl = 0x3be; // If using LPT1
+ ssStatus = ssControl - 1;
+ ssData = ssStatus - 1;
+
+ ssOn = 0x04;
+ if (ssIsTandy)
+ ssOff = 0x0e; // Tandy wierdness
+ else
+ ssOff = 0x0c; // For normal machines
+
+ outportb(ssControl,ssOn); // Enable SS
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_ShutSS() - Turns off the Sound Source
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_ShutSS(void)
+{
+ outportb(ssControl,ssOff);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_CheckSS() - Checks to see if a Sound Source is present at the
+// location specified by the sound source variables
+//
+///////////////////////////////////////////////////////////////////////////
+static boolean
+SDL_CheckSS(void)
+{
+ boolean present = false;
+ longword lasttime;
+
+ // Turn the Sound Source on and wait awhile (4 ticks)
+ SDL_StartSS();
+
+ lasttime = TimeCount;
+ while (TimeCount < lasttime + 4)
+ ;
+
+asm mov dx,[ssStatus] // Check to see if FIFO is currently empty
+asm in al,dx
+asm test al,0x40
+asm jnz checkdone // Nope - Sound Source not here
+
+asm mov cx,32 // Force FIFO overflow (FIFO is 16 bytes)
+outloop:
+asm mov dx,[ssData] // Pump a neutral value out
+asm mov al,0x80
+asm out dx,al
+
+asm mov dx,[ssControl] // Pulse printer select
+asm mov al,[ssOff]
+asm out dx,al
+asm push ax
+asm pop ax
+asm mov al,[ssOn]
+asm out dx,al
+
+asm push ax // Delay a short while before we do this again
+asm pop ax
+asm push ax
+asm pop ax
+
+asm loop outloop
+
+asm mov dx,[ssStatus] // Is FIFO overflowed now?
+asm in al,dx
+asm test al,0x40
+asm jz checkdone // Nope, still not - Sound Source not here
+
+ present = true; // Yes - it's here!
+
+checkdone:
+ SDL_ShutSS();
+ return(present);
+}
+
+static boolean
+SDL_DetectSoundSource(void)
+{
+ for (ssPort = 1;ssPort <= 3;ssPort++)
+ if (SDL_CheckSS())
+ return(true);
+ return(false);
+}
+
+//
+// PC Sound code
+//
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_PCPlaySample() - Plays the specified sample on the PC speaker
+//
+///////////////////////////////////////////////////////////////////////////
+#ifdef _MUSE_
+void
+#else
+static void
+#endif
+SDL_PCPlaySample(byte huge *data,longword len)
+{
+asm pushf
+asm cli
+
+ SDL_IndicatePC(true);
+
+ pcLengthLeft = len;
+ pcSound = (volatile byte far *)data;
+
+asm popf
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_PCStopSample() - Stops a sample playing on the PC speaker
+//
+///////////////////////////////////////////////////////////////////////////
+#ifdef _MUSE_
+void
+#else
+static void
+#endif
+SDL_PCStopSample(void)
+{
+asm pushf
+asm cli
+
+ (long)pcSound = 0;
+
+ SDL_IndicatePC(false);
+
+asm in al,0x61 // Turn the speaker off
+asm and al,0xfd // ~2
+asm out 0x61,al
+
+asm popf
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_PCPlaySound() - Plays the specified sound on the PC speaker
+//
+///////////////////////////////////////////////////////////////////////////
+#ifdef _MUSE_
+void
+#else
+static void
+#endif
+SDL_PCPlaySound(PCSound far *sound)
+{
+asm pushf
+asm cli
+
+ pcLastSample = -1;
+ pcLengthLeft = sound->common.length;
+ pcSound = sound->data;
+
+asm popf
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_PCStopSound() - Stops the current sound playing on the PC Speaker
+//
+///////////////////////////////////////////////////////////////////////////
+#ifdef _MUSE_
+void
+#else
+static void
+#endif
+SDL_PCStopSound(void)
+{
+asm pushf
+asm cli
+
+ (long)pcSound = 0;
+
+asm in al,0x61 // Turn the speaker off
+asm and al,0xfd // ~2
+asm out 0x61,al
+
+asm popf
+}
+
+#if 0
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_PCService() - Handles playing the next sample in a PC sound
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_PCService(void)
+{
+ byte s;
+ word t;
+
+ if (pcSound)
+ {
+ s = *pcSound++;
+ if (s != pcLastSample)
+ {
+ asm pushf
+ asm cli
+
+ pcLastSample = s;
+ if (s) // We have a frequency!
+ {
+ t = pcSoundLookup[s];
+ asm mov bx,[t]
+
+ asm mov al,0xb6 // Write to channel 2 (speaker) timer
+ asm out 43h,al
+ asm mov al,bl
+ asm out 42h,al // Low byte
+ asm mov al,bh
+ asm out 42h,al // High byte
+
+ asm in al,0x61 // Turn the speaker & gate on
+ asm or al,3
+ asm out 0x61,al
+ }
+ else // Time for some silence
+ {
+ asm in al,0x61 // Turn the speaker & gate off
+ asm and al,0xfc // ~3
+ asm out 0x61,al
+ }
+
+ asm popf
+ }
+
+ if (!(--pcLengthLeft))
+ {
+ SDL_PCStopSound();
+ SDL_SoundFinished();
+ }
+ }
+}
+#endif
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_ShutPC() - Turns off the pc speaker
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_ShutPC(void)
+{
+asm pushf
+asm cli
+
+ pcSound = 0;
+
+asm in al,0x61 // Turn the speaker & gate off
+asm and al,0xfc // ~3
+asm out 0x61,al
+
+asm popf
+}
+
+//
+// Stuff for digitized sounds
+//
+memptr
+SDL_LoadDigiSegment(word page)
+{
+ memptr addr;
+
+#if 0 // for debugging
+asm mov dx,STATUS_REGISTER_1
+asm in al,dx
+asm mov dx,ATR_INDEX
+asm mov al,ATR_OVERSCAN
+asm out dx,al
+asm mov al,10 // bright green
+asm out dx,al
+#endif
+
+ addr = PM_GetSoundPage(page);
+ PM_SetPageLock(PMSoundStart + page,pml_Locked);
+
+#if 0 // for debugging
+asm mov dx,STATUS_REGISTER_1
+asm in al,dx
+asm mov dx,ATR_INDEX
+asm mov al,ATR_OVERSCAN
+asm out dx,al
+asm mov al,3 // blue
+asm out dx,al
+asm mov al,0x20 // normal
+asm out dx,al
+#endif
+
+ return(addr);
+}
+
+void
+SDL_PlayDigiSegment(memptr addr,word len)
+{
+ switch (DigiMode)
+ {
+ case sds_PC:
+ SDL_PCPlaySample(addr,len);
+ break;
+ case sds_SoundSource:
+ SDL_SSPlaySample(addr,len);
+ break;
+ case sds_SoundBlaster:
+ SDL_SBPlaySample(addr,len);
+ break;
+ }
+}
+
+void
+SD_StopDigitized(void)
+{
+ int i;
+
+asm pushf
+asm cli
+
+ DigiLeft = 0;
+ DigiNextAddr = nil;
+ DigiNextLen = 0;
+ DigiMissed = false;
+ DigiPlaying = false;
+ DigiNumber = DigiPriority = 0;
+ SoundPositioned = false;
+ if ((DigiMode == sds_PC) && (SoundMode == sdm_PC))
+ SDL_SoundFinished();
+
+ switch (DigiMode)
+ {
+ case sds_PC:
+ SDL_PCStopSample();
+ break;
+ case sds_SoundSource:
+ SDL_SSStopSample();
+ break;
+ case sds_SoundBlaster:
+ SDL_SBStopSample();
+ break;
+ }
+
+asm popf
+
+ for (i = DigiLastStart;i < DigiLastEnd;i++)
+ PM_SetPageLock(i + PMSoundStart,pml_Unlocked);
+ DigiLastStart = 1;
+ DigiLastEnd = 0;
+}
+
+void
+SD_Poll(void)
+{
+ if (DigiLeft && !DigiNextAddr)
+ {
+ DigiNextLen = (DigiLeft >= PMPageSize)? PMPageSize : (DigiLeft % PMPageSize);
+ DigiLeft -= DigiNextLen;
+ if (!DigiLeft)
+ DigiLastSegment = true;
+ DigiNextAddr = SDL_LoadDigiSegment(DigiPage++);
+ }
+ if (DigiMissed && DigiNextAddr)
+ {
+ SDL_PlayDigiSegment(DigiNextAddr,DigiNextLen);
+ DigiNextAddr = nil;
+ DigiMissed = false;
+ if (DigiLastSegment)
+ {
+ DigiPlaying = false;
+ DigiLastSegment = false;
+ }
+ }
+ SDL_SetTimerSpeed();
+}
+
+void
+SD_SetPosition(int leftpos,int rightpos)
+{
+ if
+ (
+ (leftpos < 0)
+ || (leftpos > 15)
+ || (rightpos < 0)
+ || (rightpos > 15)
+ || ((leftpos == 15) && (rightpos == 15))
+ )
+ Quit("SD_SetPosition: Illegal position");
+
+ switch (DigiMode)
+ {
+ case sds_SoundBlaster:
+ SDL_PositionSBP(leftpos,rightpos);
+ break;
+ }
+}
+
+void
+SD_PlayDigitized(word which,int leftpos,int rightpos)
+{
+ word len;
+ memptr addr;
+
+ if (!DigiMode)
+ return;
+
+ SD_StopDigitized();
+ if (which >= NumDigi)
+ Quit("SD_PlayDigitized: bad sound number");
+
+ SD_SetPosition(leftpos,rightpos);
+
+ DigiPage = DigiList[(which * 2) + 0];
+ DigiLeft = DigiList[(which * 2) + 1];
+
+ DigiLastStart = DigiPage;
+ DigiLastEnd = DigiPage + ((DigiLeft + (PMPageSize - 1)) / PMPageSize);
+
+ len = (DigiLeft >= PMPageSize)? PMPageSize : (DigiLeft % PMPageSize);
+ addr = SDL_LoadDigiSegment(DigiPage++);
+
+ DigiPlaying = true;
+ DigiLastSegment = false;
+
+ SDL_PlayDigiSegment(addr,len);
+ DigiLeft -= len;
+ if (!DigiLeft)
+ DigiLastSegment = true;
+
+ SD_Poll();
+}
+
+void
+SDL_DigitizedDone(void)
+{
+ if (DigiNextAddr)
+ {
+ SDL_PlayDigiSegment(DigiNextAddr,DigiNextLen);
+ DigiNextAddr = nil;
+ DigiMissed = false;
+ }
+ else
+ {
+ if (DigiLastSegment)
+ {
+ DigiPlaying = false;
+ DigiLastSegment = false;
+ if ((DigiMode == sds_PC) && (SoundMode == sdm_PC))
+ {
+ SDL_SoundFinished();
+ }
+ else
+ DigiNumber = DigiPriority = 0;
+ SoundPositioned = false;
+ }
+ else
+ DigiMissed = true;
+ }
+}
+
+void
+SD_SetDigiDevice(SDSMode mode)
+{
+ boolean devicenotpresent;
+
+ if (mode == DigiMode)
+ return;
+
+ SD_StopDigitized();
+
+ devicenotpresent = false;
+ switch (mode)
+ {
+ case sds_SoundBlaster:
+ if (!SoundBlasterPresent)
+ {
+ if (SoundSourcePresent)
+ mode = sds_SoundSource;
+ else
+ devicenotpresent = true;
+ }
+ break;
+ case sds_SoundSource:
+ if (!SoundSourcePresent)
+ devicenotpresent = true;
+ break;
+ }
+
+ if (!devicenotpresent)
+ {
+ if (DigiMode == sds_SoundSource)
+ SDL_ShutSS();
+
+ DigiMode = mode;
+
+ if (mode == sds_SoundSource)
+ SDL_StartSS();
+
+ SDL_SetTimerSpeed();
+ }
+}
+
+void
+SDL_SetupDigi(void)
+{
+ memptr list;
+ word far *p,
+ pg;
+ int i;
+
+ PM_UnlockMainMem();
+ MM_GetPtr(&list,PMPageSize);
+ PM_CheckMainMem();
+ p = (word far *)MK_FP(PM_GetPage(ChunksInFile - 1),0);
+ _fmemcpy((void far *)list,(void far *)p,PMPageSize);
+ pg = PMSoundStart;
+ for (i = 0;i < PMPageSize / (sizeof(word) * 2);i++,p += 2)
+ {
+ if (pg >= ChunksInFile - 1)
+ break;
+ pg += (p[1] + (PMPageSize - 1)) / PMPageSize;
+ }
+ PM_UnlockMainMem();
+ MM_GetPtr((memptr *)&DigiList,i * sizeof(word) * 2);
+ _fmemcpy((void far *)DigiList,(void far *)list,i * sizeof(word) * 2);
+ MM_FreePtr(&list);
+ NumDigi = i;
+
+ for (i = 0;i < LASTSOUND;i++)
+ DigiMap[i] = -1;
+}
+
+// AdLib Code
+
+///////////////////////////////////////////////////////////////////////////
+//
+// alOut(n,b) - Puts b in AdLib card register n
+//
+///////////////////////////////////////////////////////////////////////////
+void
+alOut(byte n,byte b)
+{
+asm pushf
+asm cli
+
+asm mov dx,0x388
+asm mov al,[n]
+asm out dx,al
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm inc dx
+asm mov al,[b]
+asm out dx,al
+
+asm popf
+
+asm dec dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+asm in al,dx
+}
+
+#if 0
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_SetInstrument() - Puts an instrument into a generator
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_SetInstrument(int track,int which,Instrument far *inst,boolean percussive)
+{
+ byte c,m;
+
+ if (percussive)
+ {
+ c = pcarriers[which];
+ m = pmodifiers[which];
+ }
+ else
+ {
+ c = carriers[which];
+ m = modifiers[which];
+ }
+
+ tracks[track - 1]->inst = *inst;
+ tracks[track - 1]->percussive = percussive;
+
+ alOut(m + alChar,inst->mChar);
+ alOut(m + alScale,inst->mScale);
+ alOut(m + alAttack,inst->mAttack);
+ alOut(m + alSus,inst->mSus);
+ alOut(m + alWave,inst->mWave);
+
+ // Most percussive instruments only use one cell
+ if (c != 0xff)
+ {
+ alOut(c + alChar,inst->cChar);
+ alOut(c + alScale,inst->cScale);
+ alOut(c + alAttack,inst->cAttack);
+ alOut(c + alSus,inst->cSus);
+ alOut(c + alWave,inst->cWave);
+ }
+
+ alOut(which + alFeedCon,inst->nConn); // DEBUG - I think this is right
+}
+#endif
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_ALStopSound() - Turns off any sound effects playing through the
+// AdLib card
+//
+///////////////////////////////////////////////////////////////////////////
+#ifdef _MUSE_
+void
+#else
+static void
+#endif
+SDL_ALStopSound(void)
+{
+asm pushf
+asm cli
+
+ (long)alSound = 0;
+ alOut(alFreqH + 0,0);
+
+asm popf
+}
+
+static void
+SDL_AlSetFXInst(Instrument far *inst)
+{
+ byte c,m;
+
+ m = modifiers[0];
+ c = carriers[0];
+ alOut(m + alChar,inst->mChar);
+ alOut(m + alScale,inst->mScale);
+ alOut(m + alAttack,inst->mAttack);
+ alOut(m + alSus,inst->mSus);
+ alOut(m + alWave,inst->mWave);
+ alOut(c + alChar,inst->cChar);
+ alOut(c + alScale,inst->cScale);
+ alOut(c + alAttack,inst->cAttack);
+ alOut(c + alSus,inst->cSus);
+ alOut(c + alWave,inst->cWave);
+
+ // Note: Switch commenting on these lines for old MUSE compatibility
+// alOut(alFeedCon,inst->nConn);
+ alOut(alFeedCon,0);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_ALPlaySound() - Plays the specified sound on the AdLib card
+//
+///////////////////////////////////////////////////////////////////////////
+#ifdef _MUSE_
+void
+#else
+static void
+#endif
+SDL_ALPlaySound(AdLibSound far *sound)
+{
+ Instrument far *inst;
+ byte huge *data;
+
+ SDL_ALStopSound();
+
+asm pushf
+asm cli
+
+ alLengthLeft = sound->common.length;
+ data = sound->data;
+ data++;
+ data--;
+ alSound = (byte far *)data;
+ alBlock = ((sound->block & 7) << 2) | 0x20;
+ inst = &sound->inst;
+
+ if (!(inst->mSus | inst->cSus))
+ {
+ asm popf
+ Quit("SDL_ALPlaySound() - Bad instrument");
+ }
+
+ SDL_AlSetFXInst(&alZeroInst); // DEBUG
+ SDL_AlSetFXInst(inst);
+
+asm popf
+}
+
+#if 0
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_ALSoundService() - Plays the next sample out through the AdLib card
+//
+///////////////////////////////////////////////////////////////////////////
+//static void
+void
+SDL_ALSoundService(void)
+{
+ byte s;
+
+ if (alSound)
+ {
+ s = *alSound++;
+ if (!s)
+ alOut(alFreqH + 0,0);
+ else
+ {
+ alOut(alFreqL + 0,s);
+ alOut(alFreqH + 0,alBlock);
+ }
+
+ if (!(--alLengthLeft))
+ {
+ (long)alSound = 0;
+ alOut(alFreqH + 0,0);
+ SDL_SoundFinished();
+ }
+ }
+}
+#endif
+
+#if 0
+void
+SDL_ALService(void)
+{
+ byte a,v;
+ word w;
+
+ if (!sqActive)
+ return;
+
+ while (sqHackLen && (sqHackTime <= alTimeCount))
+ {
+ w = *sqHackPtr++;
+ sqHackTime = alTimeCount + *sqHackPtr++;
+ asm mov dx,[w]
+ asm mov [a],dl
+ asm mov [v],dh
+ alOut(a,v);
+ sqHackLen -= 4;
+ }
+ alTimeCount++;
+ if (!sqHackLen)
+ {
+ sqHackPtr = (word far *)sqHack;
+ sqHackLen = sqHackSeqLen;
+ alTimeCount = sqHackTime = 0;
+ }
+}
+#endif
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_ShutAL() - Shuts down the AdLib card for sound effects
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_ShutAL(void)
+{
+asm pushf
+asm cli
+
+ alOut(alEffects,0);
+ alOut(alFreqH + 0,0);
+ SDL_AlSetFXInst(&alZeroInst);
+ alSound = 0;
+
+asm popf
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_CleanAL() - Totally shuts down the AdLib card
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_CleanAL(void)
+{
+ int i;
+
+asm pushf
+asm cli
+
+ alOut(alEffects,0);
+ for (i = 1;i < 0xf5;i++)
+ alOut(i,0);
+
+asm popf
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_StartAL() - Starts up the AdLib card for sound effects
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_StartAL(void)
+{
+ alFXReg = 0;
+ alOut(alEffects,alFXReg);
+ SDL_AlSetFXInst(&alZeroInst);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_DetectAdLib() - Determines if there's an AdLib (or SoundBlaster
+// emulating an AdLib) present
+//
+///////////////////////////////////////////////////////////////////////////
+static boolean
+SDL_DetectAdLib(void)
+{
+ byte status1,status2;
+ int i;
+
+ alOut(4,0x60); // Reset T1 & T2
+ alOut(4,0x80); // Reset IRQ
+ status1 = readstat();
+ alOut(2,0xff); // Set timer 1
+ alOut(4,0x21); // Start timer 1
+#if 0
+ SDL_Delay(TimerDelay100);
+#else
+asm mov dx,0x388
+asm mov cx,100
+usecloop:
+asm in al,dx
+asm loop usecloop
+#endif
+
+ status2 = readstat();
+ alOut(4,0x60);
+ alOut(4,0x80);
+
+ if (((status1 & 0xe0) == 0x00) && ((status2 & 0xe0) == 0xc0))
+ {
+ for (i = 1;i <= 0xf5;i++) // Zero all the registers
+ alOut(i,0);
+
+ alOut(1,0x20); // Set WSE=1
+ alOut(8,0); // Set CSM=0 & SEL=0
+
+ return(true);
+ }
+ else
+ return(false);
+}
+
+#if 0
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_t0Service() - My timer 0 ISR which handles the different timings and
+// dispatches to whatever other routines are appropriate
+//
+///////////////////////////////////////////////////////////////////////////
+static void interrupt
+SDL_t0Service(void)
+{
+static word count = 1;
+
+#if 1 // for debugging
+asm mov dx,STATUS_REGISTER_1
+asm in al,dx
+asm mov dx,ATR_INDEX
+asm mov al,ATR_OVERSCAN
+asm out dx,al
+asm mov al,4 // red
+asm out dx,al
+#endif
+
+ HackCount++;
+
+ if ((MusicMode == smm_AdLib) || (DigiMode == sds_SoundSource))
+ {
+ SDL_ALService();
+ SDL_SSService();
+// if (!(++count & 7))
+ if (!(++count % 10))
+ {
+ LocalTime++;
+ TimeCount++;
+ if (SoundUserHook)
+ SoundUserHook();
+ }
+// if (!(count & 3))
+ if (!(count % 5))
+ {
+ switch (SoundMode)
+ {
+ case sdm_PC:
+ SDL_PCService();
+ break;
+ case sdm_AdLib:
+ SDL_ALSoundService();
+ break;
+ }
+ }
+ }
+ else
+ {
+ if (!(++count & 1))
+ {
+ LocalTime++;
+ TimeCount++;
+ if (SoundUserHook)
+ SoundUserHook();
+ }
+ switch (SoundMode)
+ {
+ case sdm_PC:
+ SDL_PCService();
+ break;
+ case sdm_AdLib:
+ SDL_ALSoundService();
+ break;
+ }
+ }
+
+asm mov ax,[WORD PTR TimerCount]
+asm add ax,[WORD PTR TimerDivisor]
+asm mov [WORD PTR TimerCount],ax
+asm jnc myack
+ t0OldService(); // If we overflow a word, time to call old int handler
+asm jmp olddone
+myack:;
+ outportb(0x20,0x20); // Ack the interrupt
+olddone:;
+
+#if 1 // for debugging
+asm mov dx,STATUS_REGISTER_1
+asm in al,dx
+asm mov dx,ATR_INDEX
+asm mov al,ATR_OVERSCAN
+asm out dx,al
+asm mov al,3 // blue
+asm out dx,al
+asm mov al,0x20 // normal
+asm out dx,al
+#endif
+}
+#endif
+
+////////////////////////////////////////////////////////////////////////////
+//
+// SDL_ShutDevice() - turns off whatever device was being used for sound fx
+//
+////////////////////////////////////////////////////////////////////////////
+static void
+SDL_ShutDevice(void)
+{
+ switch (SoundMode)
+ {
+ case sdm_PC:
+ SDL_ShutPC();
+ break;
+ case sdm_AdLib:
+ SDL_ShutAL();
+ break;
+ }
+ SoundMode = sdm_Off;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_CleanDevice() - totally shuts down all sound devices
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_CleanDevice(void)
+{
+ if ((SoundMode == sdm_AdLib) || (MusicMode == smm_AdLib))
+ SDL_CleanAL();
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SDL_StartDevice() - turns on whatever device is to be used for sound fx
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_StartDevice(void)
+{
+ switch (SoundMode)
+ {
+ case sdm_AdLib:
+ SDL_StartAL();
+ break;
+ }
+ SoundNumber = SoundPriority = 0;
+}
+
+// Public routines
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SD_SetSoundMode() - Sets which sound hardware to use for sound effects
+//
+///////////////////////////////////////////////////////////////////////////
+boolean
+SD_SetSoundMode(SDMode mode)
+{
+ boolean result = false;
+ word tableoffset;
+
+ SD_StopSound();
+
+#ifndef _MUSE_
+ if ((mode == sdm_AdLib) && !AdLibPresent)
+ mode = sdm_PC;
+
+ switch (mode)
+ {
+ case sdm_Off:
+ NeedsDigitized = false;
+ result = true;
+ break;
+ case sdm_PC:
+ tableoffset = STARTPCSOUNDS;
+ NeedsDigitized = false;
+ result = true;
+ break;
+ case sdm_AdLib:
+ if (AdLibPresent)
+ {
+ tableoffset = STARTADLIBSOUNDS;
+ NeedsDigitized = false;
+ result = true;
+ }
+ break;
+ }
+#else
+ result = true;
+#endif
+
+ if (result && (mode != SoundMode))
+ {
+ SDL_ShutDevice();
+ SoundMode = mode;
+#ifndef _MUSE_
+ SoundTable = (word *)(&audiosegs[tableoffset]);
+#endif
+ SDL_StartDevice();
+ }
+
+ SDL_SetTimerSpeed();
+
+ return(result);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SD_SetMusicMode() - sets the device to use for background music
+//
+///////////////////////////////////////////////////////////////////////////
+boolean
+SD_SetMusicMode(SMMode mode)
+{
+ boolean result = false;
+
+ SD_FadeOutMusic();
+ while (SD_MusicPlaying())
+ ;
+
+ switch (mode)
+ {
+ case smm_Off:
+ NeedsMusic = false;
+ result = true;
+ break;
+ case smm_AdLib:
+ if (AdLibPresent)
+ {
+ NeedsMusic = true;
+ result = true;
+ }
+ break;
+ }
+
+ if (result)
+ MusicMode = mode;
+
+ SDL_SetTimerSpeed();
+
+ return(result);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SD_Startup() - starts up the Sound Mgr
+// Detects all additional sound hardware and installs my ISR
+//
+///////////////////////////////////////////////////////////////////////////
+void
+SD_Startup(void)
+{
+ int i;
+
+ if (SD_Started)
+ return;
+
+ SDL_SetDS();
+
+ ssIsTandy = false;
+ ssNoCheck = false;
+ alNoCheck = false;
+ sbNoCheck = false;
+ sbNoProCheck = false;
+#ifndef _MUSE_
+ for (i = 1;i < _argc;i++)
+ {
+ switch (US_CheckParm(_argv[i],ParmStrings))
+ {
+ case 0: // No AdLib detection
+ alNoCheck = true;
+ break;
+ case 1: // No SoundBlaster detection
+ sbNoCheck = true;
+ break;
+ case 2: // No SoundBlaster Pro detection
+ sbNoProCheck = true;
+ break;
+ case 3:
+ ssNoCheck = true; // No Sound Source detection
+ break;
+ case 4: // Tandy Sound Source handling
+ ssIsTandy = true;
+ break;
+ case 5: // Sound Source present at LPT1
+ ssPort = 1;
+ ssNoCheck = SoundSourcePresent = true;
+ break;
+ case 6: // Sound Source present at LPT2
+ ssPort = 2;
+ ssNoCheck = SoundSourcePresent = true;
+ break;
+ case 7: // Sound Source present at LPT3
+ ssPort = 3;
+ ssNoCheck = SoundSourcePresent = true;
+ break;
+ }
+ }
+#endif
+
+ SoundUserHook = 0;
+
+ t0OldService = getvect(8); // Get old timer 0 ISR
+
+ LocalTime = TimeCount = alTimeCount = 0;
+
+ SD_SetSoundMode(sdm_Off);
+ SD_SetMusicMode(smm_Off);
+
+ if (!ssNoCheck)
+ SoundSourcePresent = SDL_DetectSoundSource();
+
+ if (!alNoCheck)
+ {
+ AdLibPresent = SDL_DetectAdLib();
+ if (AdLibPresent && !sbNoCheck)
+ {
+ int port = -1;
+ char *env = getenv("BLASTER");
+ if (env)
+ {
+ long temp;
+ while (*env)
+ {
+ while (isspace(*env))
+ env++;
+
+ switch (toupper(*env))
+ {
+ case 'A':
+ temp = strtol(env + 1,&env,16);
+ if
+ (
+ (temp >= 0x210)
+ && (temp <= 0x260)
+ && (!(temp & 0x00f))
+ )
+ port = (temp - 0x200) >> 4;
+ else
+ Quit("SD_Startup: Unsupported address value in BLASTER");
+ break;
+ case 'I':
+ temp = strtol(env + 1,&env,10);
+ if
+ (
+ (temp >= 0)
+ && (temp <= 10)
+ && (sbIntVectors[temp] != -1)
+ )
+ {
+ sbInterrupt = temp;
+ sbIntVec = sbIntVectors[sbInterrupt];
+ }
+ else
+ Quit("SD_Startup: Unsupported interrupt value in BLASTER");
+ break;
+ case 'D':
+ temp = strtol(env + 1,&env,10);
+ if ((temp == 0) || (temp == 1) || (temp == 3))
+ SDL_SBSetDMA(temp);
+ else
+ Quit("SD_Startup: Unsupported DMA value in BLASTER");
+ break;
+ default:
+ while (isspace(*env))
+ env++;
+ while (*env && !isspace(*env))
+ env++;
+ break;
+ }
+ }
+ }
+ SoundBlasterPresent = SDL_DetectSoundBlaster(port);
+ }
+ }
+
+ for (i = 0;i < 255;i++)
+ pcSoundLookup[i] = i * 60;
+
+ if (SoundBlasterPresent)
+ SDL_StartSB();
+
+ SDL_SetupDigi();
+
+ SD_Started = true;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SD_Default() - Sets up the default behaviour for the Sound Mgr whether
+// the config file was present or not.
+//
+///////////////////////////////////////////////////////////////////////////
+void
+SD_Default(boolean gotit,SDMode sd,SMMode sm)
+{
+ boolean gotsd,gotsm;
+
+ gotsd = gotsm = gotit;
+
+ if (gotsd) // Make sure requested sound hardware is available
+ {
+ switch (sd)
+ {
+ case sdm_AdLib:
+ gotsd = AdLibPresent;
+ break;
+ }
+ }
+ if (!gotsd)
+ {
+ if (AdLibPresent)
+ sd = sdm_AdLib;
+ else
+ sd = sdm_PC;
+ }
+ if (sd != SoundMode)
+ SD_SetSoundMode(sd);
+
+
+ if (gotsm) // Make sure requested music hardware is available
+ {
+ switch (sm)
+ {
+ case sdm_AdLib:
+ gotsm = AdLibPresent;
+ break;
+ }
+ }
+ if (!gotsm)
+ {
+ if (AdLibPresent)
+ sm = smm_AdLib;
+ }
+ if (sm != MusicMode)
+ SD_SetMusicMode(sm);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SD_Shutdown() - shuts down the Sound Mgr
+// Removes sound ISR and turns off whatever sound hardware was active
+//
+///////////////////////////////////////////////////////////////////////////
+void
+SD_Shutdown(void)
+{
+ if (!SD_Started)
+ return;
+
+ SD_MusicOff();
+ SD_StopSound();
+ SDL_ShutDevice();
+ SDL_CleanDevice();
+
+ if (SoundBlasterPresent)
+ SDL_ShutSB();
+
+ if (SoundSourcePresent)
+ SDL_ShutSS();
+
+ asm pushf
+ asm cli
+
+ SDL_SetTimer0(0);
+
+ setvect(8,t0OldService);
+
+ asm popf
+
+ SD_Started = false;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SD_SetUserHook() - sets the routine that the Sound Mgr calls every 1/70th
+// of a second from its timer 0 ISR
+//
+///////////////////////////////////////////////////////////////////////////
+void
+SD_SetUserHook(void (* hook)(void))
+{
+ SoundUserHook = hook;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SD_PositionSound() - Sets up a stereo imaging location for the next
+// sound to be played. Each channel ranges from 0 to 15.
+//
+///////////////////////////////////////////////////////////////////////////
+void
+SD_PositionSound(int leftvol,int rightvol)
+{
+ LeftPosition = leftvol;
+ RightPosition = rightvol;
+ nextsoundpos = true;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SD_PlaySound() - plays the specified sound on the appropriate hardware
+//
+///////////////////////////////////////////////////////////////////////////
+boolean
+SD_PlaySound(soundnames sound)
+{
+ boolean ispos;
+ SoundCommon far *s;
+ int lp,rp;
+
+ lp = LeftPosition;
+ rp = RightPosition;
+ LeftPosition = 0;
+ RightPosition = 0;
+
+ ispos = nextsoundpos;
+ nextsoundpos = false;
+
+ if (sound == -1)
+ return(false);
+
+ s = MK_FP(SoundTable[sound],0);
+ if ((SoundMode != sdm_Off) && !s)
+ Quit("SD_PlaySound() - Uncached sound");
+
+ if ((DigiMode != sds_Off) && (DigiMap[sound] != -1))
+ {
+ if ((DigiMode == sds_PC) && (SoundMode == sdm_PC))
+ {
+ if (s->priority < SoundPriority)
+ return(false);
+
+ SDL_PCStopSound();
+
+ SD_PlayDigitized(DigiMap[sound],lp,rp);
+ SoundPositioned = ispos;
+ SoundNumber = sound;
+ SoundPriority = s->priority;
+ }
+ else
+ {
+ asm pushf
+ asm cli
+ if (DigiPriority && !DigiNumber)
+ {
+ asm popf
+ Quit("SD_PlaySound: Priority without a sound");
+ }
+ asm popf
+
+ if (s->priority < DigiPriority)
+ return(false);
+
+ SD_PlayDigitized(DigiMap[sound],lp,rp);
+ SoundPositioned = ispos;
+ DigiNumber = sound;
+ DigiPriority = s->priority;
+ }
+
+ return(true);
+ }
+
+ if (SoundMode == sdm_Off)
+ return(false);
+ if (!s->length)
+ Quit("SD_PlaySound() - Zero length sound");
+ if (s->priority < SoundPriority)
+ return(false);
+
+ switch (SoundMode)
+ {
+ case sdm_PC:
+ SDL_PCPlaySound((void far *)s);
+ break;
+ case sdm_AdLib:
+ SDL_ALPlaySound((void far *)s);
+ break;
+ }
+
+ SoundNumber = sound;
+ SoundPriority = s->priority;
+
+ return(false);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SD_SoundPlaying() - returns the sound number that's playing, or 0 if
+// no sound is playing
+//
+///////////////////////////////////////////////////////////////////////////
+word
+SD_SoundPlaying(void)
+{
+ boolean result = false;
+
+ switch (SoundMode)
+ {
+ case sdm_PC:
+ result = pcSound? true : false;
+ break;
+ case sdm_AdLib:
+ result = alSound? true : false;
+ break;
+ }
+
+ if (result)
+ return(SoundNumber);
+ else
+ return(false);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SD_StopSound() - if a sound is playing, stops it
+//
+///////////////////////////////////////////////////////////////////////////
+void
+SD_StopSound(void)
+{
+ if (DigiPlaying)
+ SD_StopDigitized();
+
+ switch (SoundMode)
+ {
+ case sdm_PC:
+ SDL_PCStopSound();
+ break;
+ case sdm_AdLib:
+ SDL_ALStopSound();
+ break;
+ }
+
+ SoundPositioned = false;
+
+ SDL_SoundFinished();
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SD_WaitSoundDone() - waits until the current sound is done playing
+//
+///////////////////////////////////////////////////////////////////////////
+void
+SD_WaitSoundDone(void)
+{
+ while (SD_SoundPlaying())
+ ;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SD_MusicOn() - turns on the sequencer
+//
+///////////////////////////////////////////////////////////////////////////
+void
+SD_MusicOn(void)
+{
+ sqActive = true;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SD_MusicOff() - turns off the sequencer and any playing notes
+//
+///////////////////////////////////////////////////////////////////////////
+void
+SD_MusicOff(void)
+{
+ word i;
+
+
+ switch (MusicMode)
+ {
+ case smm_AdLib:
+ alFXReg = 0;
+ alOut(alEffects,0);
+ for (i = 0;i < sqMaxTracks;i++)
+ alOut(alFreqH + i + 1,0);
+ break;
+ }
+ sqActive = false;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SD_StartMusic() - starts playing the music pointed to
+//
+///////////////////////////////////////////////////////////////////////////
+void
+SD_StartMusic(MusicGroup far *music)
+{
+ SD_MusicOff();
+asm pushf
+asm cli
+
+ if (MusicMode == smm_AdLib)
+ {
+ sqHackPtr = sqHack = music->values;
+ sqHackSeqLen = sqHackLen = music->length;
+ sqHackTime = 0;
+ alTimeCount = 0;
+ SD_MusicOn();
+ }
+
+asm popf
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SD_FadeOutMusic() - starts fading out the music. Call SD_MusicPlaying()
+// to see if the fadeout is complete
+//
+///////////////////////////////////////////////////////////////////////////
+void
+SD_FadeOutMusic(void)
+{
+ switch (MusicMode)
+ {
+ case smm_AdLib:
+ // DEBUG - quick hack to turn the music off
+ SD_MusicOff();
+ break;
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// SD_MusicPlaying() - returns true if music is currently playing, false if
+// not
+//
+///////////////////////////////////////////////////////////////////////////
+boolean
+SD_MusicPlaying(void)
+{
+ boolean result;
+
+ switch (MusicMode)
+ {
+ case smm_AdLib:
+ result = false;
+ // DEBUG - not written
+ break;
+ default:
+ result = false;
+ }
+
+ return(result);
+}
--- /dev/null
+++ b/sd.equ
@@ -1,0 +1,38 @@
+;
+; ID_SD.EQU
+; Id Sound Manager assembly equates
+;
+
+ INCLUDE 'ID_VL.EQU' ; For screen color debugging stuff
+
+; Modes
+sdm_Off = 0
+sdm_PC = 1
+sdm_AdLib = 2
+
+smm_Off = 0
+smm_AdLib = 1
+
+sds_Off = 0
+sds_SoundSource = 1
+sds_SoundBlaster = 2
+
+; Stuff for the PC speaker
+pcTimer = 42h
+pcTAccess = 43h
+pcSpeaker = 61h
+pcSpkBits = 3
+
+; Stuff for the AdLib
+; Operator registers
+alChar = 20h
+alScale = 40h
+alAttack = 60h
+alSus = 80h
+alWave = 0e0h
+; Channel registers
+alFreqL = 0a0h
+alFreqH = 0b0h
+alFeedCon = 0c0h
+; Global registers
+alEffects = 0bdh
--- /dev/null
+++ b/sd.h
@@ -1,0 +1,237 @@
+//
+// ID Engine
+// ID_SD.h - Sound Manager Header
+// Version for Wolfenstein
+// By Jason Blochowiak
+//
+
+#ifndef __ID_SD__
+#define __ID_SD__
+
+void alOut(byte n,byte b);
+
+#ifdef __DEBUG__
+#define __DEBUG_SoundMgr__
+#endif
+
+#define TickBase 70 // 70Hz per tick - used as a base for timer 0
+
+typedef enum {
+ sdm_Off,
+ sdm_PC,sdm_AdLib,
+ } SDMode;
+typedef enum {
+ smm_Off,smm_AdLib
+ } SMMode;
+typedef enum {
+ sds_Off,sds_PC,sds_SoundSource,sds_SoundBlaster
+ } SDSMode;
+typedef struct
+ {
+ longword length;
+ word priority;
+ } SoundCommon;
+
+// PC Sound stuff
+#define pcTimer 0x42
+#define pcTAccess 0x43
+#define pcSpeaker 0x61
+
+#define pcSpkBits 3
+
+typedef struct
+ {
+ SoundCommon common;
+ byte data[1];
+ } PCSound;
+
+// Registers for the Sound Blaster card - needs to be offset by n0 (0x10,0x20,0x30,0x40,0x50,0x60)
+#define sbReset 0x206 // W
+#define sbFMStatus 0x208 // R
+#define sbFMAddr 0x208 // W
+#define sbFMData 0x209 // W
+#define sbReadData 0x20a // R
+#define sbWriteCmd 0x20c // W
+#define sbWriteData 0x20c // W
+#define sbWriteStat 0x20c // R
+#define sbDataAvail 0x20e // R
+
+// Registers for the Sound Blaster Pro card - needs to be offset by n0 (0x20 or 0x40)
+#define sbpLFMStatus 0x200 // R
+#define sbpLFMAddr 0x200 // W
+#define sbpLFMData 0x201 // W
+#define sbpRFMStatus 0x202 // R
+#define sbpRFMAddr 0x202 // W
+#define sbpRFMData 0x203 // W
+#define sbpMixerAddr 0x204 // W
+#define sbpMixerData 0x205 // RW
+#define sbpCDData 0x210 // R
+#define sbpCDCommand 0x210 // W
+#define sbpCDStatus 0x211 // R
+#define sbpCDReset 0x212 // W
+
+// SBPro Mixer addresses
+#define sbpmReset 0x00
+#define sbpmVoiceVol 0x04
+#define sbpmMicMix 0x0a
+#define sbpmFilterADC 0x0c
+#define sbpmControl 0x0e
+#define sbpmMasterVol 0x22
+#define sbpmFMVol 0x26
+#define sbpmCDVol 0x28
+#define sbpmLineVol 0x2e
+
+typedef struct
+ {
+ SoundCommon common;
+ word hertz;
+ byte bits,
+ reference,
+ data[1];
+ } SampledSound;
+
+// Registers for the AdLib card
+#define alFMStatus 0x388 // R
+#define alFMAddr 0x388 // W
+#define alFMData 0x389 // W
+
+// Register addresses
+// Operator stuff
+#define alChar 0x20
+#define alScale 0x40
+#define alAttack 0x60
+#define alSus 0x80
+#define alWave 0xe0
+// Channel stuff
+#define alFreqL 0xa0
+#define alFreqH 0xb0
+#define alFeedCon 0xc0
+// Global stuff
+#define alEffects 0xbd
+
+typedef struct
+ {
+ byte mChar,cChar,
+ mScale,cScale,
+ mAttack,cAttack,
+ mSus,cSus,
+ mWave,cWave,
+ nConn,
+
+ // These are only for Muse - these bytes are really unused
+ voice,
+ mode,
+ unused[3];
+ } Instrument;
+
+typedef struct
+ {
+ SoundCommon common;
+ Instrument inst;
+ byte block,
+ data[1];
+ } AdLibSound;
+
+//
+// Sequencing stuff
+//
+#define sqMaxTracks 10
+#define sqMaxMoods 1 // DEBUG
+
+#define sev_Null 0 // Does nothing
+#define sev_NoteOff 1 // Turns a note off
+#define sev_NoteOn 2 // Turns a note on
+#define sev_NotePitch 3 // Sets the pitch of a currently playing note
+#define sev_NewInst 4 // Installs a new instrument
+#define sev_NewPerc 5 // Installs a new percussive instrument
+#define sev_PercOn 6 // Turns a percussive note on
+#define sev_PercOff 7 // Turns a percussive note off
+#define sev_SeqEnd -1 // Terminates a sequence
+
+// Flags for MusicGroup.flags
+#define sf_Melodic 0
+#define sf_Percussive 1
+
+#if 1
+typedef struct
+ {
+ word length,
+ values[1];
+ } MusicGroup;
+#else
+typedef struct
+ {
+ word flags,
+ count,
+ offsets[1];
+ } MusicGroup;
+#endif
+
+typedef struct
+ {
+ /* This part needs to be set up by the user */
+ word mood,far *moods[sqMaxMoods];
+
+ /* The rest is set up by the code */
+ Instrument inst;
+ boolean percussive;
+ word far *seq;
+ longword nextevent;
+ } ActiveTrack;
+
+#define sqmode_Normal 0
+#define sqmode_FadeIn 1
+#define sqmode_FadeOut 2
+
+#define sqMaxFade 64 // DEBUG
+
+
+// Global variables
+extern boolean AdLibPresent,
+ SoundSourcePresent,
+ SoundBlasterPresent,
+ NeedsMusic, // For Caching Mgr
+ SoundPositioned;
+extern SDMode SoundMode;
+extern SDSMode DigiMode;
+extern SMMode MusicMode;
+extern boolean DigiPlaying;
+extern int DigiMap[];
+extern longword TimeCount; // Global time in ticks
+
+// Function prototypes
+extern void SD_Startup(void),
+ SD_Shutdown(void),
+ SD_Default(boolean gotit,SDMode sd,SMMode sm),
+
+ SD_PositionSound(int leftvol,int rightvol);
+extern boolean SD_PlaySound(soundnames sound);
+extern void SD_SetPosition(int leftvol,int rightvol),
+ SD_StopSound(void),
+ SD_WaitSoundDone(void),
+
+ SD_StartMusic(MusicGroup far *music),
+ SD_MusicOn(void),
+ SD_MusicOff(void),
+ SD_FadeOutMusic(void),
+
+ SD_SetUserHook(void (*hook)(void));
+extern boolean SD_MusicPlaying(void),
+ SD_SetSoundMode(SDMode mode),
+ SD_SetMusicMode(SMMode mode);
+extern word SD_SoundPlaying(void);
+
+extern void SD_SetDigiDevice(SDSMode),
+ SD_PlayDigitized(word which,int leftpos,int rightpos),
+ SD_StopDigitized(void),
+ SD_Poll(void);
+
+#ifdef _MUSE_ // MUSE Goes directly to the lower level routines
+extern void SDL_PCPlaySound(PCSound far *sound),
+ SDL_PCStopSound(void),
+ SDL_ALPlaySound(AdLibSound far *sound),
+ SDL_ALStopSound(void);
+#endif
+
+#endif
+
--- /dev/null
+++ b/sdmver.h
@@ -1,0 +1,8 @@
+#define SPEAR
+#define SPEARDEMO
+#define ARTSEXTERN
+#define DEMOSEXTERN
+#define CARMACIZED
+//#define MYPROFILE
+//#define DEBCHECK
+//#define UPLOAD
--- /dev/null
+++ b/sharemsg.h
@@ -1,0 +1,9 @@
+"This game is shareware.\n"
+"Share it with everyone.\n"
+"Thanks.\n\n"
+" Id Software\n"
+
+"This game is NOT shareware.\n"
+"Please do not distribute it.\n"
+"Thanks.\n\n"
+" Id Software\n"
binary files /dev/null b/signon.obj differ
--- /dev/null
+++ b/sodver.h
@@ -1,0 +1,7 @@
+#define SPEAR
+#define ARTSEXTERN
+#define DEMOSEXTERN
+#define CARMACIZED
+//#define MYPROFILE
+//#define DEBCHECK
+//#define UPLOAD
--- /dev/null
+++ b/spanish.h
@@ -1,0 +1,112 @@
+#define QUITSUR "Estas seguro que quieres\n"\
+ "parar este gran juego?"
+
+#define CURGAME "Ahora estas en\n"\
+ "un juego. Si continuas\n"\
+ "borras el juego viejo. O.K.?"
+
+#define GAMESVD "Ya hay un juego\n"\
+ "guardado en esta posicion.\n"\
+ "sobre-escribir?"
+
+#define ENDGAMESTR "Estas seguro que quieres\n"\
+ "terminar el juego que\n"\
+ "estas jugando? (S o N):"
+
+#define STR_NG "Juego nuevo"
+#define STR_SD "Sonido"
+#define STR_CL "Control"
+#define STR_LG "Cargar juego"
+#define STR_SG "Guardar juego"
+#define STR_CV "Cambiar vista"
+#define STR_VS "Ver anotacion"
+#define STR_EG "Abandonar"
+#define STR_BD "Regresar al demo"
+#define STR_QT "Parar"
+
+#define STR_LOADING "Cargando"
+#define STR_SAVING "Guardando"
+
+#define STR_GAME "Regresar, jugar"
+#define STR_DEMO "Regresar al Demo"
+#define STR_LGC "Cargar juego llamado\n\""
+#define STR_EMPTY "vacio"
+#define STR_CALIB "Calibrar"
+#define STR_JOYST "Joystick"
+#define STR_MOVEJOY "Mover joystick a\n"\
+ "arriba izq y\n"\
+ "oprimir boton 0\n"
+#define STR_MOVEJOY2 "Mover joystick a\n"\
+ "abajo derecha y\n"\
+ "oprimir boton 1\n"
+#define STR_ESCEXIT "ESC para salir"
+#define STR_NONE "Ninguno"
+#define STR_PC "P.C. bocina"
+#define STR_ALSB "AdLib/Sound Blaster"
+#define STR_DISNEY "Disney Sound Source"
+#define STR_SB "Sound Blaster"
+
+#define STR_MOUSEEN "Raton activado"
+#define STR_JOYEN "Joystick activado"
+#define STR_PORT2 "Use joystick puerto 2"
+#define STR_GAMEPAD "Gravis Gamepad Activada"
+#define STR_SENS "Raton Sensibilidad"
+#define STR_CUSTOM "Modificar controles"
+#define STR_DADDY "Papi puedo jugar?"
+#define STR_HURTME "No me hieras."
+#define STR_BRINGEM "�Echamelos!"
+#define STR_DEATH "La muerte encarnada"
+
+#define STR_MOUSEADJ "Raton ajustar sensibilidad"
+#define STR_SLOW "Lento"
+#define STR_FAST "Rapido"
+
+#define STR_CRUN "Corre"
+#define STR_COPEN "Abre"
+#define STR_CFIRE "Fuego"
+#define STR_CSTRAFE "Ametrallar"
+
+#define STR_LEFT "Izquierda"
+#define STR_RIGHT "Derecha"
+#define STR_FRWD "Adelante"
+#define STR_BKWD "Atras"
+#define STR_THINK "Pensando"
+
+#define STR_SIZE1 "Use flechas para ajustar"
+#define STR_SIZE2 "Enter para aceptar"
+#define STR_SIZE3 "Esc para cancelar"
+
+#define STR_YOUWIN "Tu ganas"
+
+#define STR_TOTALTIME "Tiempo total"
+
+#define STR_RATKILL "Muertes %"
+#define STR_RATSECRET "Secreto %"
+#define STR_RATTREASURE "Tesoros %"
+
+#define STR_BONUS "Bono"
+#define STR_TIME "Tiempo"
+#define STR_PAR "Par"
+
+#define STR_RAT2KILL "Muertes %" // ratio = promedio
+#define STR_RAT2SECRET "Secreto %"
+#define STR_RAT2TREASURE "Tesoros %"
+
+#define STR_DEFEATED "Derrotado!"
+
+#define STR_CHEATER1 "Ahora tienes 100% salud"
+#define STR_CHEATER2 "99 balas y dos llaves"
+#define STR_CHEATER3 "Notar que has basicamente"
+#define STR_CHEATER4 "eliminado tus chances de"
+#define STR_CHEATER5 "obtener puntos altos"
+
+#define STR_NOSPACE1 "No hay suficiente espacio"
+#define STR_NOSPACE2 "en tu disco para guardar juego"
+
+#define STR_SAVECHT1 "Tu archivo para guardar juego es"
+#define STR_SAVECHT2 "diremos,\"corrupto\"."
+#define STR_SAVECHT3 "Pero te dire, sigue y"
+#define STR_SAVECHT4 "de todos modos juega"
+
+#define STR_SEEAGAIN "Veamos eso de nuevo"
+
--- /dev/null
+++ b/spanver.h
@@ -1,0 +1,8 @@
+//#define SPEAR
+#define SPANISH
+#define ARTSEXTERN
+#define DEMOSEXTERN
+//#define MYPROFILE
+//#define DEBCHECK
+#define CARMACIZED
+//#define UPLOAD
--- /dev/null
+++ b/state.c
@@ -1,0 +1,1480 @@
+// WL_STATE.C
+
+#include "WL_DEF.H"
+#pragma hdrstop
+
+/*
+=============================================================================
+
+ LOCAL CONSTANTS
+
+=============================================================================
+*/
+
+
+/*
+=============================================================================
+
+ GLOBAL VARIABLES
+
+=============================================================================
+*/
+
+
+dirtype opposite[9] =
+ {west,southwest,south,southeast,east,northeast,north,northwest,nodir};
+
+dirtype diagonal[9][9] =
+{
+/* east */ {nodir,nodir,northeast,nodir,nodir,nodir,southeast,nodir,nodir},
+ {nodir,nodir,nodir,nodir,nodir,nodir,nodir,nodir,nodir},
+/* north */ {northeast,nodir,nodir,nodir,northwest,nodir,nodir,nodir,nodir},
+ {nodir,nodir,nodir,nodir,nodir,nodir,nodir,nodir,nodir},
+/* west */ {nodir,nodir,northwest,nodir,nodir,nodir,southwest,nodir,nodir},
+ {nodir,nodir,nodir,nodir,nodir,nodir,nodir,nodir,nodir},
+/* south */ {southeast,nodir,nodir,nodir,southwest,nodir,nodir,nodir,nodir},
+ {nodir,nodir,nodir,nodir,nodir,nodir,nodir,nodir,nodir},
+ {nodir,nodir,nodir,nodir,nodir,nodir,nodir,nodir,nodir}
+};
+
+
+
+void SpawnNewObj (unsigned tilex, unsigned tiley, statetype *state);
+void NewState (objtype *ob, statetype *state);
+
+boolean TryWalk (objtype *ob);
+void MoveObj (objtype *ob, long move);
+
+void KillActor (objtype *ob);
+void DamageActor (objtype *ob, unsigned damage);
+
+boolean CheckLine (objtype *ob);
+void FirstSighting (objtype *ob);
+boolean CheckSight (objtype *ob);
+
+/*
+=============================================================================
+
+ LOCAL VARIABLES
+
+=============================================================================
+*/
+
+
+
+//===========================================================================
+
+
+/*
+===================
+=
+= SpawnNewObj
+=
+= Spaws a new actor at the given TILE coordinates, with the given state, and
+= the given size in GLOBAL units.
+=
+= new = a pointer to an initialized new actor
+=
+===================
+*/
+
+void SpawnNewObj (unsigned tilex, unsigned tiley, statetype *state)
+{
+ GetNewActor ();
+ new->state = state;
+ if (state->tictime)
+ new->ticcount = US_RndT () % state->tictime;
+ else
+ new->ticcount = 0;
+
+ new->tilex = tilex;
+ new->tiley = tiley;
+ new->x = ((long)tilex<<TILESHIFT)+TILEGLOBAL/2;
+ new->y = ((long)tiley<<TILESHIFT)+TILEGLOBAL/2;
+ new->dir = nodir;
+
+ actorat[tilex][tiley] = new;
+ new->areanumber =
+ *(mapsegs[0] + farmapylookup[new->tiley]+new->tilex) - AREATILE;
+}
+
+
+
+/*
+===================
+=
+= NewState
+=
+= Changes ob to a new state, setting ticcount to the max for that state
+=
+===================
+*/
+
+void NewState (objtype *ob, statetype *state)
+{
+ ob->state = state;
+ ob->ticcount = state->tictime;
+}
+
+
+
+/*
+=============================================================================
+
+ ENEMY TILE WORLD MOVEMENT CODE
+
+=============================================================================
+*/
+
+
+/*
+==================================
+=
+= TryWalk
+=
+= Attempts to move ob in its current (ob->dir) direction.
+=
+= If blocked by either a wall or an actor returns FALSE
+=
+= If move is either clear or blocked only by a door, returns TRUE and sets
+=
+= ob->tilex = new destination
+= ob->tiley
+= ob->areanumber = the floor tile number (0-(NUMAREAS-1)) of destination
+= ob->distance = TILEGLOBAl, or -doornumber if a door is blocking the way
+=
+= If a door is in the way, an OpenDoor call is made to start it opening.
+= The actor code should wait until
+= doorobjlist[-ob->distance].action = dr_open, meaning the door has been
+= fully opened
+=
+==================================
+*/
+
+#define CHECKDIAG(x,y) \
+{ \
+ temp=(unsigned)actorat[x][y]; \
+ if (temp) \
+ { \
+ if (temp<256) \
+ return false; \
+ if (((objtype *)temp)->flags&FL_SHOOTABLE) \
+ return false; \
+ } \
+}
+
+#define CHECKSIDE(x,y) \
+{ \
+ temp=(unsigned)actorat[x][y]; \
+ if (temp) \
+ { \
+ if (temp<128) \
+ return false; \
+ if (temp<256) \
+ doornum = temp&63; \
+ else if (((objtype *)temp)->flags&FL_SHOOTABLE)\
+ return false; \
+ } \
+}
+
+
+boolean TryWalk (objtype *ob)
+{
+ int doornum;
+ unsigned temp;
+
+ doornum = -1;
+
+ if (ob->obclass == inertobj)
+ {
+ switch (ob->dir)
+ {
+ case north:
+ ob->tiley--;
+ break;
+
+ case northeast:
+ ob->tilex++;
+ ob->tiley--;
+ break;
+
+ case east:
+ ob->tilex++;
+ break;
+
+ case southeast:
+ ob->tilex++;
+ ob->tiley++;
+ break;
+
+ case south:
+ ob->tiley++;
+ break;
+
+ case southwest:
+ ob->tilex--;
+ ob->tiley++;
+ break;
+
+ case west:
+ ob->tilex--;
+ break;
+
+ case northwest:
+ ob->tilex--;
+ ob->tiley--;
+ break;
+ }
+ }
+ else
+ switch (ob->dir)
+ {
+ case north:
+ if (ob->obclass == dogobj || ob->obclass == fakeobj)
+ {
+ CHECKDIAG(ob->tilex,ob->tiley-1);
+ }
+ else
+ {
+ CHECKSIDE(ob->tilex,ob->tiley-1);
+ }
+ ob->tiley--;
+ break;
+
+ case northeast:
+ CHECKDIAG(ob->tilex+1,ob->tiley-1);
+ CHECKDIAG(ob->tilex+1,ob->tiley);
+ CHECKDIAG(ob->tilex,ob->tiley-1);
+ ob->tilex++;
+ ob->tiley--;
+ break;
+
+ case east:
+ if (ob->obclass == dogobj || ob->obclass == fakeobj)
+ {
+ CHECKDIAG(ob->tilex+1,ob->tiley);
+ }
+ else
+ {
+ CHECKSIDE(ob->tilex+1,ob->tiley);
+ }
+ ob->tilex++;
+ break;
+
+ case southeast:
+ CHECKDIAG(ob->tilex+1,ob->tiley+1);
+ CHECKDIAG(ob->tilex+1,ob->tiley);
+ CHECKDIAG(ob->tilex,ob->tiley+1);
+ ob->tilex++;
+ ob->tiley++;
+ break;
+
+ case south:
+ if (ob->obclass == dogobj || ob->obclass == fakeobj)
+ {
+ CHECKDIAG(ob->tilex,ob->tiley+1);
+ }
+ else
+ {
+ CHECKSIDE(ob->tilex,ob->tiley+1);
+ }
+ ob->tiley++;
+ break;
+
+ case southwest:
+ CHECKDIAG(ob->tilex-1,ob->tiley+1);
+ CHECKDIAG(ob->tilex-1,ob->tiley);
+ CHECKDIAG(ob->tilex,ob->tiley+1);
+ ob->tilex--;
+ ob->tiley++;
+ break;
+
+ case west:
+ if (ob->obclass == dogobj || ob->obclass == fakeobj)
+ {
+ CHECKDIAG(ob->tilex-1,ob->tiley);
+ }
+ else
+ {
+ CHECKSIDE(ob->tilex-1,ob->tiley);
+ }
+ ob->tilex--;
+ break;
+
+ case northwest:
+ CHECKDIAG(ob->tilex-1,ob->tiley-1);
+ CHECKDIAG(ob->tilex-1,ob->tiley);
+ CHECKDIAG(ob->tilex,ob->tiley-1);
+ ob->tilex--;
+ ob->tiley--;
+ break;
+
+ case nodir:
+ return false;
+
+ default:
+ Quit ("Walk: Bad dir");
+ }
+
+ if (doornum != -1)
+ {
+ OpenDoor (doornum);
+ ob->distance = -doornum-1;
+ return true;
+ }
+
+
+ ob->areanumber =
+ *(mapsegs[0] + farmapylookup[ob->tiley]+ob->tilex) - AREATILE;
+
+ ob->distance = TILEGLOBAL;
+ return true;
+}
+
+
+
+/*
+==================================
+=
+= SelectDodgeDir
+=
+= Attempts to choose and initiate a movement for ob that sends it towards
+= the player while dodging
+=
+= If there is no possible move (ob is totally surrounded)
+=
+= ob->dir = nodir
+=
+= Otherwise
+=
+= ob->dir = new direction to follow
+= ob->distance = TILEGLOBAL or -doornumber
+= ob->tilex = new destination
+= ob->tiley
+= ob->areanumber = the floor tile number (0-(NUMAREAS-1)) of destination
+=
+==================================
+*/
+
+void SelectDodgeDir (objtype *ob)
+{
+ int deltax,deltay,i;
+ unsigned absdx,absdy;
+ dirtype dirtry[5];
+ dirtype turnaround,tdir;
+
+ if (ob->flags & FL_FIRSTATTACK)
+ {
+ //
+ // turning around is only ok the very first time after noticing the
+ // player
+ //
+ turnaround = nodir;
+ ob->flags &= ~FL_FIRSTATTACK;
+ }
+ else
+ turnaround=opposite[ob->dir];
+
+ deltax = player->tilex - ob->tilex;
+ deltay = player->tiley - ob->tiley;
+
+//
+// arange 5 direction choices in order of preference
+// the four cardinal directions plus the diagonal straight towards
+// the player
+//
+
+ if (deltax>0)
+ {
+ dirtry[1]= east;
+ dirtry[3]= west;
+ }
+ else
+ {
+ dirtry[1]= west;
+ dirtry[3]= east;
+ }
+
+ if (deltay>0)
+ {
+ dirtry[2]= south;
+ dirtry[4]= north;
+ }
+ else
+ {
+ dirtry[2]= north;
+ dirtry[4]= south;
+ }
+
+//
+// randomize a bit for dodging
+//
+ absdx = abs(deltax);
+ absdy = abs(deltay);
+
+ if (absdx > absdy)
+ {
+ tdir = dirtry[1];
+ dirtry[1] = dirtry[2];
+ dirtry[2] = tdir;
+ tdir = dirtry[3];
+ dirtry[3] = dirtry[4];
+ dirtry[4] = tdir;
+ }
+
+ if (US_RndT() < 128)
+ {
+ tdir = dirtry[1];
+ dirtry[1] = dirtry[2];
+ dirtry[2] = tdir;
+ tdir = dirtry[3];
+ dirtry[3] = dirtry[4];
+ dirtry[4] = tdir;
+ }
+
+ dirtry[0] = diagonal [ dirtry[1] ] [ dirtry[2] ];
+
+//
+// try the directions util one works
+//
+ for (i=0;i<5;i++)
+ {
+ if ( dirtry[i] == nodir || dirtry[i] == turnaround)
+ continue;
+
+ ob->dir = dirtry[i];
+ if (TryWalk(ob))
+ return;
+ }
+
+//
+// turn around only as a last resort
+//
+ if (turnaround != nodir)
+ {
+ ob->dir = turnaround;
+
+ if (TryWalk(ob))
+ return;
+ }
+
+ ob->dir = nodir;
+}
+
+
+/*
+============================
+=
+= SelectChaseDir
+=
+= As SelectDodgeDir, but doesn't try to dodge
+=
+============================
+*/
+
+void SelectChaseDir (objtype *ob)
+{
+ int deltax,deltay,i;
+ dirtype d[3];
+ dirtype tdir, olddir, turnaround;
+
+
+ olddir=ob->dir;
+ turnaround=opposite[olddir];
+
+ deltax=player->tilex - ob->tilex;
+ deltay=player->tiley - ob->tiley;
+
+ d[1]=nodir;
+ d[2]=nodir;
+
+ if (deltax>0)
+ d[1]= east;
+ else if (deltax<0)
+ d[1]= west;
+ if (deltay>0)
+ d[2]=south;
+ else if (deltay<0)
+ d[2]=north;
+
+ if (abs(deltay)>abs(deltax))
+ {
+ tdir=d[1];
+ d[1]=d[2];
+ d[2]=tdir;
+ }
+
+ if (d[1]==turnaround)
+ d[1]=nodir;
+ if (d[2]==turnaround)
+ d[2]=nodir;
+
+
+ if (d[1]!=nodir)
+ {
+ ob->dir=d[1];
+ if (TryWalk(ob))
+ return; /*either moved forward or attacked*/
+ }
+
+ if (d[2]!=nodir)
+ {
+ ob->dir=d[2];
+ if (TryWalk(ob))
+ return;
+ }
+
+/* there is no direct path to the player, so pick another direction */
+
+ if (olddir!=nodir)
+ {
+ ob->dir=olddir;
+ if (TryWalk(ob))
+ return;
+ }
+
+ if (US_RndT()>128) /*randomly determine direction of search*/
+ {
+ for (tdir=north;tdir<=west;tdir++)
+ {
+ if (tdir!=turnaround)
+ {
+ ob->dir=tdir;
+ if ( TryWalk(ob) )
+ return;
+ }
+ }
+ }
+ else
+ {
+ for (tdir=west;tdir>=north;tdir--)
+ {
+ if (tdir!=turnaround)
+ {
+ ob->dir=tdir;
+ if ( TryWalk(ob) )
+ return;
+ }
+ }
+ }
+
+ if (turnaround != nodir)
+ {
+ ob->dir=turnaround;
+ if (ob->dir != nodir)
+ {
+ if ( TryWalk(ob) )
+ return;
+ }
+ }
+
+ ob->dir = nodir; // can't move
+}
+
+
+/*
+============================
+=
+= SelectRunDir
+=
+= Run Away from player
+=
+============================
+*/
+
+void SelectRunDir (objtype *ob)
+{
+ int deltax,deltay,i;
+ dirtype d[3];
+ dirtype tdir, olddir, turnaround;
+
+
+ deltax=player->tilex - ob->tilex;
+ deltay=player->tiley - ob->tiley;
+
+ if (deltax<0)
+ d[1]= east;
+ else
+ d[1]= west;
+ if (deltay<0)
+ d[2]=south;
+ else
+ d[2]=north;
+
+ if (abs(deltay)>abs(deltax))
+ {
+ tdir=d[1];
+ d[1]=d[2];
+ d[2]=tdir;
+ }
+
+ ob->dir=d[1];
+ if (TryWalk(ob))
+ return; /*either moved forward or attacked*/
+
+ ob->dir=d[2];
+ if (TryWalk(ob))
+ return;
+
+/* there is no direct path to the player, so pick another direction */
+
+ if (US_RndT()>128) /*randomly determine direction of search*/
+ {
+ for (tdir=north;tdir<=west;tdir++)
+ {
+ ob->dir=tdir;
+ if ( TryWalk(ob) )
+ return;
+ }
+ }
+ else
+ {
+ for (tdir=west;tdir>=north;tdir--)
+ {
+ ob->dir=tdir;
+ if ( TryWalk(ob) )
+ return;
+ }
+ }
+
+ ob->dir = nodir; // can't move
+}
+
+
+/*
+=================
+=
+= MoveObj
+=
+= Moves ob be move global units in ob->dir direction
+= Actors are not allowed to move inside the player
+= Does NOT check to see if the move is tile map valid
+=
+= ob->x = adjusted for new position
+= ob->y
+=
+=================
+*/
+
+void MoveObj (objtype *ob, long move)
+{
+ long deltax,deltay;
+
+ switch (ob->dir)
+ {
+ case north:
+ ob->y -= move;
+ break;
+ case northeast:
+ ob->x += move;
+ ob->y -= move;
+ break;
+ case east:
+ ob->x += move;
+ break;
+ case southeast:
+ ob->x += move;
+ ob->y += move;
+ break;
+ case south:
+ ob->y += move;
+ break;
+ case southwest:
+ ob->x -= move;
+ ob->y += move;
+ break;
+ case west:
+ ob->x -= move;
+ break;
+ case northwest:
+ ob->x -= move;
+ ob->y -= move;
+ break;
+
+ case nodir:
+ return;
+
+ default:
+ Quit ("MoveObj: bad dir!");
+ }
+
+//
+// check to make sure it's not on top of player
+//
+ if (areabyplayer[ob->areanumber])
+ {
+ deltax = ob->x - player->x;
+ if (deltax < -MINACTORDIST || deltax > MINACTORDIST)
+ goto moveok;
+ deltay = ob->y - player->y;
+ if (deltay < -MINACTORDIST || deltay > MINACTORDIST)
+ goto moveok;
+
+ if (ob->obclass == ghostobj || ob->obclass == spectreobj)
+ TakeDamage (tics*2,ob);
+
+ //
+ // back up
+ //
+ switch (ob->dir)
+ {
+ case north:
+ ob->y += move;
+ break;
+ case northeast:
+ ob->x -= move;
+ ob->y += move;
+ break;
+ case east:
+ ob->x -= move;
+ break;
+ case southeast:
+ ob->x -= move;
+ ob->y -= move;
+ break;
+ case south:
+ ob->y -= move;
+ break;
+ case southwest:
+ ob->x += move;
+ ob->y -= move;
+ break;
+ case west:
+ ob->x += move;
+ break;
+ case northwest:
+ ob->x += move;
+ ob->y += move;
+ break;
+
+ case nodir:
+ return;
+ }
+ return;
+ }
+moveok:
+ ob->distance -=move;
+}
+
+/*
+=============================================================================
+
+ STUFF
+
+=============================================================================
+*/
+
+/*
+===============
+=
+= DropItem
+=
+= Tries to drop a bonus item somewhere in the tiles surrounding the
+= given tilex/tiley
+=
+===============
+*/
+
+void DropItem (stat_t itemtype, int tilex, int tiley)
+{
+ int x,y,xl,xh,yl,yh;
+
+//
+// find a free spot to put it in
+//
+ if (!actorat[tilex][tiley])
+ {
+ PlaceItemType (itemtype, tilex,tiley);
+ return;
+ }
+
+ xl = tilex-1;
+ xh = tilex+1;
+ yl = tiley-1;
+ yh = tiley+1;
+
+ for (x=xl ; x<= xh ; x++)
+ for (y=yl ; y<= yh ; y++)
+ if (!actorat[x][y])
+ {
+ PlaceItemType (itemtype, x,y);
+ return;
+ }
+}
+
+
+
+/*
+===============
+=
+= KillActor
+=
+===============
+*/
+
+void KillActor (objtype *ob)
+{
+ int tilex,tiley;
+
+ tilex = ob->tilex = ob->x >> TILESHIFT; // drop item on center
+ tiley = ob->tiley = ob->y >> TILESHIFT;
+
+ switch (ob->obclass)
+ {
+ case guardobj:
+ GivePoints (100);
+ NewState (ob,&s_grddie1);
+ PlaceItemType (bo_clip2,tilex,tiley);
+ break;
+
+ case officerobj:
+ GivePoints (400);
+ NewState (ob,&s_ofcdie1);
+ PlaceItemType (bo_clip2,tilex,tiley);
+ break;
+
+ case mutantobj:
+ GivePoints (700);
+ NewState (ob,&s_mutdie1);
+ PlaceItemType (bo_clip2,tilex,tiley);
+ break;
+
+ case ssobj:
+ GivePoints (500);
+ NewState (ob,&s_ssdie1);
+ if (gamestate.bestweapon < wp_machinegun)
+ PlaceItemType (bo_machinegun,tilex,tiley);
+ else
+ PlaceItemType (bo_clip2,tilex,tiley);
+ break;
+
+ case dogobj:
+ GivePoints (200);
+ NewState (ob,&s_dogdie1);
+ break;
+
+#ifndef SPEAR
+ case bossobj:
+ GivePoints (5000);
+ NewState (ob,&s_bossdie1);
+ PlaceItemType (bo_key1,tilex,tiley);
+ break;
+
+ case gretelobj:
+ GivePoints (5000);
+ NewState (ob,&s_greteldie1);
+ PlaceItemType (bo_key1,tilex,tiley);
+ break;
+
+ case giftobj:
+ GivePoints (5000);
+ gamestate.killx = player->x;
+ gamestate.killy = player->y;
+ NewState (ob,&s_giftdie1);
+ break;
+
+ case fatobj:
+ GivePoints (5000);
+ gamestate.killx = player->x;
+ gamestate.killy = player->y;
+ NewState (ob,&s_fatdie1);
+ break;
+
+ case schabbobj:
+ GivePoints (5000);
+ gamestate.killx = player->x;
+ gamestate.killy = player->y;
+ NewState (ob,&s_schabbdie1);
+ A_DeathScream(ob);
+ break;
+ case fakeobj:
+ GivePoints (2000);
+ NewState (ob,&s_fakedie1);
+ break;
+
+ case mechahitlerobj:
+ GivePoints (5000);
+ NewState (ob,&s_mechadie1);
+ break;
+ case realhitlerobj:
+ GivePoints (5000);
+ gamestate.killx = player->x;
+ gamestate.killy = player->y;
+ NewState (ob,&s_hitlerdie1);
+ A_DeathScream(ob);
+ break;
+#else
+ case spectreobj:
+ GivePoints (200);
+ NewState (ob,&s_spectredie1);
+ break;
+
+ case angelobj:
+ GivePoints (5000);
+ NewState (ob,&s_angeldie1);
+ break;
+
+ case transobj:
+ GivePoints (5000);
+ NewState (ob,&s_transdie0);
+ PlaceItemType (bo_key1,tilex,tiley);
+ break;
+
+ case uberobj:
+ GivePoints (5000);
+ NewState (ob,&s_uberdie0);
+ PlaceItemType (bo_key1,tilex,tiley);
+ break;
+
+ case willobj:
+ GivePoints (5000);
+ NewState (ob,&s_willdie1);
+ PlaceItemType (bo_key1,tilex,tiley);
+ break;
+
+ case deathobj:
+ GivePoints (5000);
+ NewState (ob,&s_deathdie1);
+ PlaceItemType (bo_key1,tilex,tiley);
+ break;
+#endif
+ }
+
+ gamestate.killcount++;
+ ob->flags &= ~FL_SHOOTABLE;
+ actorat[ob->tilex][ob->tiley] = NULL;
+ ob->flags |= FL_NONMARK;
+}
+
+
+
+/*
+===================
+=
+= DamageActor
+=
+= Called when the player succesfully hits an enemy.
+=
+= Does damage points to enemy ob, either putting it into a stun frame or
+= killing it.
+=
+===================
+*/
+
+void DamageActor (objtype *ob, unsigned damage)
+{
+ madenoise = true;
+
+//
+// do double damage if shooting a non attack mode actor
+//
+ if ( !(ob->flags & FL_ATTACKMODE) )
+ damage <<= 1;
+
+ ob->hitpoints -= damage;
+
+ if (ob->hitpoints<=0)
+ KillActor (ob);
+ else
+ {
+ if (! (ob->flags & FL_ATTACKMODE) )
+ FirstSighting (ob); // put into combat mode
+
+ switch (ob->obclass) // dogs only have one hit point
+ {
+ case guardobj:
+ if (ob->hitpoints&1)
+ NewState (ob,&s_grdpain);
+ else
+ NewState (ob,&s_grdpain1);
+ break;
+
+ case officerobj:
+ if (ob->hitpoints&1)
+ NewState (ob,&s_ofcpain);
+ else
+ NewState (ob,&s_ofcpain1);
+ break;
+
+ case mutantobj:
+ if (ob->hitpoints&1)
+ NewState (ob,&s_mutpain);
+ else
+ NewState (ob,&s_mutpain1);
+ break;
+
+ case ssobj:
+ if (ob->hitpoints&1)
+ NewState (ob,&s_sspain);
+ else
+ NewState (ob,&s_sspain1);
+
+ break;
+
+ }
+ }
+}
+
+/*
+=============================================================================
+
+ CHECKSIGHT
+
+=============================================================================
+*/
+
+
+/*
+=====================
+=
+= CheckLine
+=
+= Returns true if a straight line between the player and ob is unobstructed
+=
+=====================
+*/
+
+boolean CheckLine (objtype *ob)
+{
+ int x1,y1,xt1,yt1,x2,y2,xt2,yt2;
+ int x,y;
+ int xdist,ydist,xstep,ystep;
+ int temp;
+ int partial,delta;
+ long ltemp;
+ int xfrac,yfrac,deltafrac;
+ unsigned value,intercept;
+
+ x1 = ob->x >> UNSIGNEDSHIFT; // 1/256 tile precision
+ y1 = ob->y >> UNSIGNEDSHIFT;
+ xt1 = x1 >> 8;
+ yt1 = y1 >> 8;
+
+ x2 = plux;
+ y2 = pluy;
+ xt2 = player->tilex;
+ yt2 = player->tiley;
+
+
+ xdist = abs(xt2-xt1);
+
+ if (xdist > 0)
+ {
+ if (xt2 > xt1)
+ {
+ partial = 256-(x1&0xff);
+ xstep = 1;
+ }
+ else
+ {
+ partial = x1&0xff;
+ xstep = -1;
+ }
+
+ deltafrac = abs(x2-x1);
+ delta = y2-y1;
+ ltemp = ((long)delta<<8)/deltafrac;
+ if (ltemp > 0x7fffl)
+ ystep = 0x7fff;
+ else if (ltemp < -0x7fffl)
+ ystep = -0x7fff;
+ else
+ ystep = ltemp;
+ yfrac = y1 + (((long)ystep*partial) >>8);
+
+ x = xt1+xstep;
+ xt2 += xstep;
+ do
+ {
+ y = yfrac>>8;
+ yfrac += ystep;
+
+ value = (unsigned)tilemap[x][y];
+ x += xstep;
+
+ if (!value)
+ continue;
+
+ if (value<128 || value>256)
+ return false;
+
+ //
+ // see if the door is open enough
+ //
+ value &= ~0x80;
+ intercept = yfrac-ystep/2;
+
+ if (intercept>doorposition[value])
+ return false;
+
+ } while (x != xt2);
+ }
+
+ ydist = abs(yt2-yt1);
+
+ if (ydist > 0)
+ {
+ if (yt2 > yt1)
+ {
+ partial = 256-(y1&0xff);
+ ystep = 1;
+ }
+ else
+ {
+ partial = y1&0xff;
+ ystep = -1;
+ }
+
+ deltafrac = abs(y2-y1);
+ delta = x2-x1;
+ ltemp = ((long)delta<<8)/deltafrac;
+ if (ltemp > 0x7fffl)
+ xstep = 0x7fff;
+ else if (ltemp < -0x7fffl)
+ xstep = -0x7fff;
+ else
+ xstep = ltemp;
+ xfrac = x1 + (((long)xstep*partial) >>8);
+
+ y = yt1 + ystep;
+ yt2 += ystep;
+ do
+ {
+ x = xfrac>>8;
+ xfrac += xstep;
+
+ value = (unsigned)tilemap[x][y];
+ y += ystep;
+
+ if (!value)
+ continue;
+
+ if (value<128 || value>256)
+ return false;
+
+ //
+ // see if the door is open enough
+ //
+ value &= ~0x80;
+ intercept = xfrac-xstep/2;
+
+ if (intercept>doorposition[value])
+ return false;
+ } while (y != yt2);
+ }
+
+ return true;
+}
+
+
+
+/*
+================
+=
+= CheckSight
+=
+= Checks a straight line between player and current object
+=
+= If the sight is ok, check alertness and angle to see if they notice
+=
+= returns true if the player has been spoted
+=
+================
+*/
+
+#define MINSIGHT 0x18000l
+
+boolean CheckSight (objtype *ob)
+{
+ long deltax,deltay;
+
+//
+// don't bother tracing a line if the area isn't connected to the player's
+//
+ if (!areabyplayer[ob->areanumber])
+ return false;
+
+//
+// if the player is real close, sight is automatic
+//
+ deltax = player->x - ob->x;
+ deltay = player->y - ob->y;
+
+ if (deltax > -MINSIGHT && deltax < MINSIGHT
+ && deltay > -MINSIGHT && deltay < MINSIGHT)
+ return true;
+
+//
+// see if they are looking in the right direction
+//
+ switch (ob->dir)
+ {
+ case north:
+ if (deltay > 0)
+ return false;
+ break;
+
+ case east:
+ if (deltax < 0)
+ return false;
+ break;
+
+ case south:
+ if (deltay < 0)
+ return false;
+ break;
+
+ case west:
+ if (deltax > 0)
+ return false;
+ break;
+ }
+
+//
+// trace a line to check for blocking tiles (corners)
+//
+ return CheckLine (ob);
+
+}
+
+
+
+/*
+===============
+=
+= FirstSighting
+=
+= Puts an actor into attack mode and possibly reverses the direction
+= if the player is behind it
+=
+===============
+*/
+
+void FirstSighting (objtype *ob)
+{
+//
+// react to the player
+//
+ switch (ob->obclass)
+ {
+ case guardobj:
+ PlaySoundLocActor(HALTSND,ob);
+ NewState (ob,&s_grdchase1);
+ ob->speed *= 3; // go faster when chasing player
+ break;
+
+ case officerobj:
+ PlaySoundLocActor(SPIONSND,ob);
+ NewState (ob,&s_ofcchase1);
+ ob->speed *= 5; // go faster when chasing player
+ break;
+
+ case mutantobj:
+ NewState (ob,&s_mutchase1);
+ ob->speed *= 3; // go faster when chasing player
+ break;
+
+ case ssobj:
+ PlaySoundLocActor(SCHUTZADSND,ob);
+ NewState (ob,&s_sschase1);
+ ob->speed *= 4; // go faster when chasing player
+ break;
+
+ case dogobj:
+ PlaySoundLocActor(DOGBARKSND,ob);
+ NewState (ob,&s_dogchase1);
+ ob->speed *= 2; // go faster when chasing player
+ break;
+
+#ifndef SPEAR
+ case bossobj:
+ SD_PlaySound(GUTENTAGSND);
+ NewState (ob,&s_bosschase1);
+ ob->speed = SPDPATROL*3; // go faster when chasing player
+ break;
+
+ case gretelobj:
+ SD_PlaySound(KEINSND);
+ NewState (ob,&s_gretelchase1);
+ ob->speed *= 3; // go faster when chasing player
+ break;
+
+ case giftobj:
+ SD_PlaySound(EINESND);
+ NewState (ob,&s_giftchase1);
+ ob->speed *= 3; // go faster when chasing player
+ break;
+
+ case fatobj:
+ SD_PlaySound(ERLAUBENSND);
+ NewState (ob,&s_fatchase1);
+ ob->speed *= 3; // go faster when chasing player
+ break;
+
+ case schabbobj:
+ SD_PlaySound(SCHABBSHASND);
+ NewState (ob,&s_schabbchase1);
+ ob->speed *= 3; // go faster when chasing player
+ break;
+
+ case fakeobj:
+ SD_PlaySound(TOT_HUNDSND);
+ NewState (ob,&s_fakechase1);
+ ob->speed *= 3; // go faster when chasing player
+ break;
+
+ case mechahitlerobj:
+ SD_PlaySound(DIESND);
+ NewState (ob,&s_mechachase1);
+ ob->speed *= 3; // go faster when chasing player
+ break;
+
+ case realhitlerobj:
+ SD_PlaySound(DIESND);
+ NewState (ob,&s_hitlerchase1);
+ ob->speed *= 5; // go faster when chasing player
+ break;
+
+ case ghostobj:
+ NewState (ob,&s_blinkychase1);
+ ob->speed *= 2; // go faster when chasing player
+ break;
+#else
+
+ case spectreobj:
+ SD_PlaySound(GHOSTSIGHTSND);
+ NewState (ob,&s_spectrechase1);
+ ob->speed = 800; // go faster when chasing player
+ break;
+
+ case angelobj:
+ SD_PlaySound(ANGELSIGHTSND);
+ NewState (ob,&s_angelchase1);
+ ob->speed = 1536; // go faster when chasing player
+ break;
+
+ case transobj:
+ SD_PlaySound(TRANSSIGHTSND);
+ NewState (ob,&s_transchase1);
+ ob->speed = 1536; // go faster when chasing player
+ break;
+
+ case uberobj:
+ NewState (ob,&s_uberchase1);
+ ob->speed = 3000; // go faster when chasing player
+ break;
+
+ case willobj:
+ SD_PlaySound(WILHELMSIGHTSND);
+ NewState (ob,&s_willchase1);
+ ob->speed = 2048; // go faster when chasing player
+ break;
+
+ case deathobj:
+ SD_PlaySound(KNIGHTSIGHTSND);
+ NewState (ob,&s_deathchase1);
+ ob->speed = 2048; // go faster when chasing player
+ break;
+
+#endif
+ }
+
+ if (ob->distance < 0)
+ ob->distance = 0; // ignore the door opening command
+
+ ob->flags |= FL_ATTACKMODE|FL_FIRSTATTACK;
+}
+
+
+
+/*
+===============
+=
+= SightPlayer
+=
+= Called by actors that ARE NOT chasing the player. If the player
+= is detected (by sight, noise, or proximity), the actor is put into
+= it's combat frame and true is returned.
+=
+= Incorporates a random reaction delay
+=
+===============
+*/
+
+boolean SightPlayer (objtype *ob)
+{
+ if (ob->flags & FL_ATTACKMODE)
+ Quit ("An actor in ATTACKMODE called SightPlayer!");
+
+ if (ob->temp2)
+ {
+ //
+ // count down reaction time
+ //
+ ob->temp2 -= tics;
+ if (ob->temp2 > 0)
+ return false;
+ ob->temp2 = 0; // time to react
+ }
+ else
+ {
+ if (!areabyplayer[ob->areanumber])
+ return false;
+
+ if (ob->flags & FL_AMBUSH)
+ {
+ if (!CheckSight (ob))
+ return false;
+ ob->flags &= ~FL_AMBUSH;
+ }
+ else
+ {
+ if (!madenoise && !CheckSight (ob))
+ return false;
+ }
+
+
+ switch (ob->obclass)
+ {
+ case guardobj:
+ ob->temp2 = 1+US_RndT()/4;
+ break;
+ case officerobj:
+ ob->temp2 = 2;
+ break;
+ case mutantobj:
+ ob->temp2 = 1+US_RndT()/6;
+ break;
+ case ssobj:
+ ob->temp2 = 1+US_RndT()/6;
+ break;
+ case dogobj:
+ ob->temp2 = 1+US_RndT()/8;
+ break;
+
+ case bossobj:
+ case schabbobj:
+ case fakeobj:
+ case mechahitlerobj:
+ case realhitlerobj:
+ case gretelobj:
+ case giftobj:
+ case fatobj:
+ case spectreobj:
+ case angelobj:
+ case transobj:
+ case uberobj:
+ case willobj:
+ case deathobj:
+ ob->temp2 = 1;
+ break;
+ }
+ return false;
+ }
+
+ FirstSighting (ob);
+
+ return true;
+}
+
+
--- /dev/null
+++ b/text.c
@@ -1,0 +1,859 @@
+// WL_TEXT.C
+
+#include "WL_DEF.H"
+#pragma hdrstop
+
+/*
+=============================================================================
+
+TEXT FORMATTING COMMANDS
+------------------------
+^C<hex digit> Change text color
+^E[enter] End of layout (all pages)
+^G<y>,<x>,<pic>[enter] Draw a graphic and push margins
+^P[enter] start new page, must be the first chars in a layout
+^L<x>,<y>[ENTER] Locate to a specific spot, x in pixels, y in lines
+
+=============================================================================
+*/
+
+/*
+=============================================================================
+
+ LOCAL CONSTANTS
+
+=============================================================================
+*/
+
+#define BACKCOLOR 0x11
+
+
+#define WORDLIMIT 80
+#define FONTHEIGHT 10
+#define TOPMARGIN 16
+#define BOTTOMMARGIN 32
+#define LEFTMARGIN 16
+#define RIGHTMARGIN 16
+#define PICMARGIN 8
+#define TEXTROWS ((200-TOPMARGIN-BOTTOMMARGIN)/FONTHEIGHT)
+#define SPACEWIDTH 7
+#define SCREENPIXWIDTH 320
+#define SCREENMID (SCREENPIXWIDTH/2)
+
+/*
+=============================================================================
+
+ LOCAL VARIABLES
+
+=============================================================================
+*/
+
+int pagenum,numpages;
+
+unsigned leftmargin[TEXTROWS],rightmargin[TEXTROWS];
+char far *text;
+unsigned rowon;
+
+int picx,picy,picnum,picdelay;
+boolean layoutdone;
+
+//===========================================================================
+
+#ifndef JAPAN
+/*
+=====================
+=
+= RipToEOL
+=
+=====================
+*/
+
+void RipToEOL (void)
+{
+ while (*text++ != '\n') // scan to end of line
+ ;
+}
+
+
+/*
+=====================
+=
+= ParseNumber
+=
+=====================
+*/
+
+int ParseNumber (void)
+{
+ char ch;
+ char num[80],*numptr;
+
+//
+// scan until a number is found
+//
+ ch = *text;
+ while (ch < '0' || ch >'9')
+ ch = *++text;
+
+//
+// copy the number out
+//
+ numptr = num;
+ do
+ {
+ *numptr++ = ch;
+ ch = *++text;
+ } while (ch >= '0' && ch <= '9');
+ *numptr = 0;
+
+ return atoi (num);
+}
+
+
+
+/*
+=====================
+=
+= ParsePicCommand
+=
+= Call with text pointing just after a ^P
+= Upon exit text points to the start of next line
+=
+=====================
+*/
+
+void ParsePicCommand (void)
+{
+ picy=ParseNumber();
+ picx=ParseNumber();
+ picnum=ParseNumber();
+ RipToEOL ();
+}
+
+
+void ParseTimedCommand (void)
+{
+ picy=ParseNumber();
+ picx=ParseNumber();
+ picnum=ParseNumber();
+ picdelay=ParseNumber();
+ RipToEOL ();
+}
+
+
+/*
+=====================
+=
+= TimedPicCommand
+=
+= Call with text pointing just after a ^P
+= Upon exit text points to the start of next line
+=
+=====================
+*/
+
+void TimedPicCommand (void)
+{
+ ParseTimedCommand ();
+
+//
+// update the screen, and wait for time delay
+//
+ VW_UpdateScreen ();
+
+//
+// wait for time
+//
+ TimeCount = 0;
+ while (TimeCount < picdelay)
+ ;
+
+//
+// draw pic
+//
+ VWB_DrawPic (picx&~7,picy,picnum);
+}
+
+
+/*
+=====================
+=
+= HandleCommand
+=
+=====================
+*/
+
+void HandleCommand (void)
+{
+ int i,margin,top,bottom;
+ int picwidth,picheight,picmid;
+
+ switch (toupper(*++text))
+ {
+ case 'B':
+ picy=ParseNumber();
+ picx=ParseNumber();
+ picwidth=ParseNumber();
+ picheight=ParseNumber();
+ VWB_Bar(picx,picy,picwidth,picheight,BACKCOLOR);
+ RipToEOL();
+ break;
+ case ';': // comment
+ RipToEOL();
+ break;
+ case 'P': // ^P is start of next page, ^E is end of file
+ case 'E':
+ layoutdone = true;
+ text--; // back up to the '^'
+ break;
+
+ case 'C': // ^c<hex digit> changes text color
+ i = toupper(*++text);
+ if (i>='0' && i<='9')
+ fontcolor = i-'0';
+ else if (i>='A' && i<='F')
+ fontcolor = i-'A'+10;
+
+ fontcolor *= 16;
+ i = toupper(*++text);
+ if (i>='0' && i<='9')
+ fontcolor += i-'0';
+ else if (i>='A' && i<='F')
+ fontcolor += i-'A'+10;
+ text++;
+ break;
+
+ case '>':
+ px = 160;
+ text++;
+ break;
+
+ case 'L':
+ py=ParseNumber();
+ rowon = (py-TOPMARGIN)/FONTHEIGHT;
+ py = TOPMARGIN+rowon*FONTHEIGHT;
+ px=ParseNumber();
+ while (*text++ != '\n') // scan to end of line
+ ;
+ break;
+
+ case 'T': // ^Tyyy,xxx,ppp,ttt waits ttt tics, then draws pic
+ TimedPicCommand ();
+ break;
+
+ case 'G': // ^Gyyy,xxx,ppp draws graphic
+ ParsePicCommand ();
+ VWB_DrawPic (picx&~7,picy,picnum);
+ picwidth = pictable[picnum-STARTPICS].width;
+ picheight = pictable[picnum-STARTPICS].height;
+ //
+ // adjust margins
+ //
+ picmid = picx + picwidth/2;
+ if (picmid > SCREENMID)
+ margin = picx-PICMARGIN; // new right margin
+ else
+ margin = picx+picwidth+PICMARGIN; // new left margin
+
+ top = (picy-TOPMARGIN)/FONTHEIGHT;
+ if (top<0)
+ top = 0;
+ bottom = (picy+picheight-TOPMARGIN)/FONTHEIGHT;
+ if (bottom>=TEXTROWS)
+ bottom = TEXTROWS-1;
+
+ for (i=top;i<=bottom;i++)
+ if (picmid > SCREENMID)
+ rightmargin[i] = margin;
+ else
+ leftmargin[i] = margin;
+
+ //
+ // adjust this line if needed
+ //
+ if (px < leftmargin[rowon])
+ px = leftmargin[rowon];
+ break;
+ }
+}
+
+
+/*
+=====================
+=
+= NewLine
+=
+=====================
+*/
+
+void NewLine (void)
+{
+ char ch;
+
+ if (++rowon == TEXTROWS)
+ {
+ //
+ // overflowed the page, so skip until next page break
+ //
+ layoutdone = true;
+ do
+ {
+ if (*text == '^')
+ {
+ ch = toupper(*(text+1));
+ if (ch == 'E' || ch == 'P')
+ {
+ layoutdone = true;
+ return;
+ }
+ }
+ text++;
+
+ } while (1);
+
+ }
+ px = leftmargin[rowon];
+ py+= FONTHEIGHT;
+}
+
+
+
+/*
+=====================
+=
+= HandleCtrls
+=
+=====================
+*/
+
+void HandleCtrls (void)
+{
+ char ch;
+
+ ch = *text++; // get the character and advance
+
+ if (ch == '\n')
+ {
+ NewLine ();
+ return;
+ }
+
+}
+
+
+/*
+=====================
+=
+= HandleWord
+=
+=====================
+*/
+
+void HandleWord (void)
+{
+ char word[WORDLIMIT];
+ int i,wordindex;
+ unsigned wwidth,wheight,newpos;
+
+
+ //
+ // copy the next word into [word]
+ //
+ word[0] = *text++;
+ wordindex = 1;
+ while (*text>32)
+ {
+ word[wordindex] = *text++;
+ if (++wordindex == WORDLIMIT)
+ Quit ("PageLayout: Word limit exceeded");
+ }
+ word[wordindex] = 0; // stick a null at end for C
+
+ //
+ // see if it fits on this line
+ //
+ VW_MeasurePropString (word,&wwidth,&wheight);
+
+ while (px+wwidth > rightmargin[rowon])
+ {
+ NewLine ();
+ if (layoutdone)
+ return; // overflowed page
+ }
+
+ //
+ // print it
+ //
+ newpos = px+wwidth;
+ VWB_DrawPropString (word);
+ px = newpos;
+
+ //
+ // suck up any extra spaces
+ //
+ while (*text == ' ')
+ {
+ px += SPACEWIDTH;
+ text++;
+ }
+}
+
+/*
+=====================
+=
+= PageLayout
+=
+= Clears the screen, draws the pics on the page, and word wraps the text.
+= Returns a pointer to the terminating command
+=
+=====================
+*/
+
+void PageLayout (boolean shownumber)
+{
+ int i,oldfontcolor;
+ char ch;
+
+ oldfontcolor = fontcolor;
+
+ fontcolor = 0;
+
+//
+// clear the screen
+//
+ VWB_Bar (0,0,320,200,BACKCOLOR);
+ VWB_DrawPic (0,0,H_TOPWINDOWPIC);
+ VWB_DrawPic (0,8,H_LEFTWINDOWPIC);
+ VWB_DrawPic (312,8,H_RIGHTWINDOWPIC);
+ VWB_DrawPic (8,176,H_BOTTOMINFOPIC);
+
+
+ for (i=0;i<TEXTROWS;i++)
+ {
+ leftmargin[i] = LEFTMARGIN;
+ rightmargin[i] = SCREENPIXWIDTH-RIGHTMARGIN;
+ }
+
+ px = LEFTMARGIN;
+ py = TOPMARGIN;
+ rowon = 0;
+ layoutdone = false;
+
+//
+// make sure we are starting layout text (^P first command)
+//
+ while (*text <= 32)
+ text++;
+
+ if (*text != '^' || toupper(*++text) != 'P')
+ Quit ("PageLayout: Text not headed with ^P");
+
+ while (*text++ != '\n')
+ ;
+
+
+//
+// process text stream
+//
+ do
+ {
+ ch = *text;
+
+ if (ch == '^')
+ HandleCommand ();
+ else
+ if (ch == 9)
+ {
+ px = (px+8)&0xf8;
+ text++;
+ }
+ else if (ch <= 32)
+ HandleCtrls ();
+ else
+ HandleWord ();
+
+ } while (!layoutdone);
+
+ pagenum++;
+
+ if (shownumber)
+ {
+ #ifdef SPANISH
+ strcpy (str,"Hoja ");
+ itoa (pagenum,str2,10);
+ strcat (str,str2);
+ strcat (str," de ");
+ py = 183;
+ px = 208;
+ #else
+ strcpy (str,"pg ");
+ itoa (pagenum,str2,10);
+ strcat (str,str2);
+ strcat (str," of ");
+ py = 183;
+ px = 213;
+ #endif
+ itoa (numpages,str2,10);
+ strcat (str,str2);
+ fontcolor = 0x4f; //12^BACKCOLOR;
+
+ VWB_DrawPropString (str);
+ }
+
+ fontcolor = oldfontcolor;
+}
+
+//===========================================================================
+
+/*
+=====================
+=
+= BackPage
+=
+= Scans for a previous ^P
+=
+=====================
+*/
+
+void BackPage (void)
+{
+ pagenum--;
+ do
+ {
+ text--;
+ if (*text == '^' && toupper(*(text+1)) == 'P')
+ return;
+ } while (1);
+}
+
+
+//===========================================================================
+
+
+/*
+=====================
+=
+= CacheLayoutGraphics
+=
+= Scans an entire layout file (until a ^E) marking all graphics used, and
+= counting pages, then caches the graphics in
+=
+=====================
+*/
+void CacheLayoutGraphics (void)
+{
+ char far *bombpoint, far *textstart;
+ char ch;
+
+ textstart = text;
+ bombpoint = text+30000;
+ numpages = pagenum = 0;
+
+ do
+ {
+ if (*text == '^')
+ {
+ ch = toupper(*++text);
+ if (ch == 'P') // start of a page
+ numpages++;
+ if (ch == 'E') // end of file, so load graphics and return
+ {
+ CA_MarkGrChunk(H_TOPWINDOWPIC);
+ CA_MarkGrChunk(H_LEFTWINDOWPIC);
+ CA_MarkGrChunk(H_RIGHTWINDOWPIC);
+ CA_MarkGrChunk(H_BOTTOMINFOPIC);
+ CA_CacheMarks ();
+ text = textstart;
+ return;
+ }
+ if (ch == 'G') // draw graphic command, so mark graphics
+ {
+ ParsePicCommand ();
+ CA_MarkGrChunk (picnum);
+ }
+ if (ch == 'T') // timed draw graphic command, so mark graphics
+ {
+ ParseTimedCommand ();
+ CA_MarkGrChunk (picnum);
+ }
+ }
+ else
+ text++;
+
+ } while (text<bombpoint);
+
+ Quit ("CacheLayoutGraphics: No ^E to terminate file!");
+}
+#endif
+
+
+/*
+=====================
+=
+= ShowArticle
+=
+=====================
+*/
+
+#ifdef JAPAN
+void ShowArticle (int which)
+#else
+void ShowArticle (char far *article)
+#endif
+{
+ #ifdef JAPAN
+ int snames[10] = { H_HELP1PIC,
+ H_HELP2PIC,
+ H_HELP3PIC,
+ H_HELP4PIC,
+ H_HELP5PIC,
+ H_HELP6PIC,
+ H_HELP7PIC,
+ H_HELP8PIC,
+ H_HELP9PIC,
+ H_HELP10PIC};
+ int enames[14] = {
+ 0,0,
+ #ifndef JAPDEMO
+ C_ENDGAME1APIC,
+ C_ENDGAME1BPIC,
+ C_ENDGAME2APIC,
+ C_ENDGAME2BPIC,
+ C_ENDGAME3APIC,
+ C_ENDGAME3BPIC,
+ C_ENDGAME4APIC,
+ C_ENDGAME4BPIC,
+ C_ENDGAME5APIC,
+ C_ENDGAME5BPIC,
+ C_ENDGAME6APIC,
+ C_ENDGAME6BPIC
+ #endif
+ };
+ #endif
+ unsigned oldfontnumber;
+ unsigned temp;
+ boolean newpage,firstpage;
+
+ #ifdef JAPAN
+ pagenum = 1;
+ if (!which)
+ numpages = 10;
+ else
+ numpages = 2;
+
+ #else
+
+ text = article;
+ oldfontnumber = fontnumber;
+ fontnumber = 0;
+ CA_MarkGrChunk(STARTFONT);
+ VWB_Bar (0,0,320,200,BACKCOLOR);
+ CacheLayoutGraphics ();
+ #endif
+
+ newpage = true;
+ firstpage = true;
+
+ do
+ {
+ if (newpage)
+ {
+ newpage = false;
+ #ifdef JAPAN
+ if (!which)
+ CA_CacheScreen(snames[pagenum - 1]);
+ else
+ CA_CacheScreen(enames[which*2 + pagenum - 1]);
+ #else
+ PageLayout (true);
+ #endif
+ VW_UpdateScreen ();
+ if (firstpage)
+ {
+ VL_FadeIn(0,255,&gamepal,10);
+ // VW_FadeIn ()
+ firstpage = false;
+ }
+ }
+
+ LastScan = 0;
+ while (!LastScan)
+ ;
+
+ switch (LastScan)
+ {
+ case sc_UpArrow:
+ case sc_PgUp:
+ case sc_LeftArrow:
+ if (pagenum>1)
+ {
+ #ifndef JAPAN
+ BackPage ();
+ BackPage ();
+ #else
+ pagenum--;
+ #endif
+ newpage = true;
+ }
+ break;
+
+ case sc_Enter:
+ case sc_DownArrow:
+ case sc_PgDn:
+ case sc_RightArrow: // the text allready points at next page
+ if (pagenum<numpages)
+ {
+ newpage = true;
+ #ifdef JAPAN
+ pagenum++;
+ #endif
+ }
+ break;
+ }
+
+ #ifndef SPEAR
+ if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))
+ PicturePause();
+ #endif
+
+ } while (LastScan != sc_Escape);
+
+ IN_ClearKeysDown ();
+ fontnumber = oldfontnumber;
+}
+
+
+//===========================================================================
+
+#ifndef JAPAN
+#ifdef ARTSEXTERN
+int endextern = T_ENDART1;
+#ifndef SPEAR
+int helpextern = T_HELPART;
+#endif
+#endif
+char helpfilename[13] = "HELPART.",
+ endfilename[13] = "ENDART1.";
+#endif
+
+/*
+=================
+=
+= HelpScreens
+=
+=================
+*/
+#ifndef SPEAR
+void HelpScreens (void)
+{
+ int artnum;
+ char far *text;
+ memptr layout;
+
+
+ CA_UpLevel ();
+ MM_SortMem ();
+#ifdef JAPAN
+ ShowArticle (0);
+ VW_FadeOut();
+ FreeMusic ();
+ CA_DownLevel ();
+ MM_SortMem ();
+#else
+
+
+
+
+#ifdef ARTSEXTERN
+ artnum = helpextern;
+ CA_CacheGrChunk (artnum);
+ text = (char _seg *)grsegs[artnum];
+ MM_SetLock (&grsegs[artnum], true);
+#else
+ CA_LoadFile (helpfilename,&layout);
+ text = (char _seg *)layout;
+ MM_SetLock (&layout, true);
+#endif
+
+ ShowArticle (text);
+
+#ifdef ARTSEXTERN
+ MM_FreePtr (&grsegs[artnum]);
+#else
+ MM_FreePtr (&layout);
+#endif
+
+
+
+ VW_FadeOut();
+
+ FreeMusic ();
+ CA_DownLevel ();
+ MM_SortMem ();
+#endif
+}
+#endif
+
+//
+// END ARTICLES
+//
+void EndText (void)
+{
+ int artnum;
+ char far *text;
+ memptr layout;
+
+
+ ClearMemory ();
+
+ CA_UpLevel ();
+ MM_SortMem ();
+#ifdef JAPAN
+ ShowArticle(gamestate.episode + 1);
+
+ VW_FadeOut();
+
+ SETFONTCOLOR(0,15);
+ IN_ClearKeysDown();
+ if (MousePresent)
+ Mouse(MDelta); // Clear accumulated mouse movement
+
+ FreeMusic ();
+ CA_DownLevel ();
+ MM_SortMem ();
+#else
+
+
+
+#ifdef ARTSEXTERN
+ artnum = endextern+gamestate.episode;
+ CA_CacheGrChunk (artnum);
+ text = (char _seg *)grsegs[artnum];
+ MM_SetLock (&grsegs[artnum], true);
+#else
+ endfilename[6] = '1'+gamestate.episode;
+ CA_LoadFile (endfilename,&layout);
+ text = (char _seg *)layout;
+ MM_SetLock (&layout, true);
+#endif
+
+ ShowArticle (text);
+
+#ifdef ARTSEXTERN
+ MM_FreePtr (&grsegs[artnum]);
+#else
+ MM_FreePtr (&layout);
+#endif
+
+
+ VW_FadeOut();
+ SETFONTCOLOR(0,15);
+ IN_ClearKeysDown();
+ if (MousePresent)
+ Mouse(MDelta); // Clear accumulated mouse movement
+
+ FreeMusic ();
+ CA_DownLevel ();
+ MM_SortMem ();
+#endif
+}
--- /dev/null
+++ b/us.asm
@@ -1,0 +1,101 @@
+IDEAL
+MODEL MEDIUM,C
+
+; Assembly portion of the User Mgr. This is just John Carmack's table
+; driven pseudo-random number generator, and we put it in the User Mgr
+; because we couldn't figure out where it should go
+
+
+;============================================================================
+;
+; RANDOM ROUTINES
+;
+;============================================================================
+
+ FARDATA
+
+rndindex dw ?
+
+rndtable db 0, 8, 109, 220, 222, 241, 149, 107, 75, 248, 254, 140, 16, 66
+ db 74, 21, 211, 47, 80, 242, 154, 27, 205, 128, 161, 89, 77, 36
+ db 95, 110, 85, 48, 212, 140, 211, 249, 22, 79, 200, 50, 28, 188
+ db 52, 140, 202, 120, 68, 145, 62, 70, 184, 190, 91, 197, 152, 224
+ db 149, 104, 25, 178, 252, 182, 202, 182, 141, 197, 4, 81, 181, 242
+ db 145, 42, 39, 227, 156, 198, 225, 193, 219, 93, 122, 175, 249, 0
+ db 175, 143, 70, 239, 46, 246, 163, 53, 163, 109, 168, 135, 2, 235
+ db 25, 92, 20, 145, 138, 77, 69, 166, 78, 176, 173, 212, 166, 113
+ db 94, 161, 41, 50, 239, 49, 111, 164, 70, 60, 2, 37, 171, 75
+ db 136, 156, 11, 56, 42, 146, 138, 229, 73, 146, 77, 61, 98, 196
+ db 135, 106, 63, 197, 195, 86, 96, 203, 113, 101, 170, 247, 181, 113
+ db 80, 250, 108, 7, 255, 237, 129, 226, 79, 107, 112, 166, 103, 241
+ db 24, 223, 239, 120, 198, 58, 60, 82, 128, 3, 184, 66, 143, 224
+ db 145, 224, 81, 206, 163, 45, 63, 90, 168, 114, 59, 33, 159, 95
+ db 28, 139, 123, 98, 125, 196, 15, 70, 194, 253, 54, 14, 109, 226
+ db 71, 17, 161, 93, 186, 87, 244, 138, 20, 52, 123, 251, 26, 36
+ db 17, 46, 52, 231, 232, 76, 31, 221, 84, 37, 216, 165, 212, 106
+ db 197, 242, 98, 43, 39, 175, 254, 145, 190, 84, 118, 222, 187, 136
+ db 120, 163, 236, 249
+
+PUBLIC rndtable
+
+ CODESEG
+
+LastRnd dw ?
+
+;=================================================
+;
+; void US_InitRndT (boolean randomize)
+; Init table based RND generator
+; if randomize is false, the counter is set to 0
+;
+;=================================================
+
+PROC US_InitRndT randomize:word
+ uses si,di
+ public US_InitRndT
+
+ mov ax,SEG rndtable
+ mov es,ax
+
+ mov ax,[randomize]
+ or ax,ax
+ jne @@timeit ;if randomize is true, really random
+
+ mov dx,0 ;set to a definite value
+ jmp @@setit
+
+@@timeit:
+ mov ah,2ch
+ int 21h ;GetSystemTime
+ and dx,0ffh
+
+@@setit:
+ mov [es:rndindex],dx
+ ret
+
+ENDP
+
+;=================================================
+;
+; int US_RndT (void)
+; Return a random # between 0-255
+; Exit : AX = value
+;
+;=================================================
+PROC US_RndT
+ public US_RndT
+
+ mov ax,SEG rndtable
+ mov es,ax
+ mov bx,[es:rndindex]
+ inc bx
+ and bx,0ffh
+ mov [es:rndindex],bx
+ mov al,[es:rndtable+BX]
+ xor ah,ah
+ ret
+
+ENDP
+
+END
+
--- /dev/null
+++ b/us.h
@@ -1,0 +1,123 @@
+//
+// ID Engine
+// ID_US.h - Header file for the User Manager
+// v1.0d1
+// By Jason Blochowiak
+//
+
+#ifndef __ID_US__
+#define __ID_US__
+
+#ifdef __DEBUG__
+#define __DEBUG_UserMgr__
+#endif
+
+//#define HELPTEXTLINKED
+
+#define MaxX 320
+#define MaxY 200
+
+#define MaxHelpLines 500
+
+#define MaxHighName 57
+#define MaxScores 7
+typedef struct
+ {
+ char name[MaxHighName + 1];
+ long score;
+ word completed,episode;
+ } HighScore;
+
+#define MaxGameName 32
+#define MaxSaveGames 6
+typedef struct
+ {
+ char signature[4];
+ word *oldtest;
+ boolean present;
+ char name[MaxGameName + 1];
+ } SaveGame;
+
+#define MaxString 128 // Maximum input string size
+
+typedef struct
+ {
+ int x,y,
+ w,h,
+ px,py;
+ } WindowRec; // Record used to save & restore screen windows
+
+typedef enum
+ {
+ gd_Continue,
+ gd_Easy,
+ gd_Normal,
+ gd_Hard
+ } GameDiff;
+
+// Hack import for TED launch support
+extern boolean tedlevel;
+extern int tedlevelnum;
+extern void TEDDeath(void);
+
+extern boolean ingame, // Set by game code if a game is in progress
+ abortgame, // Set if a game load failed
+ loadedgame, // Set if the current game was loaded
+ NoWait,
+ HighScoresDirty;
+extern char *abortprogram; // Set to error msg if program is dying
+extern GameDiff restartgame; // Normally gd_Continue, else starts game
+extern word PrintX,PrintY; // Current printing location in the window
+extern word WindowX,WindowY,// Current location of window
+ WindowW,WindowH;// Current size of window
+
+extern boolean Button0,Button1,
+ CursorBad;
+extern int CursorX,CursorY;
+
+extern void (*USL_MeasureString)(char far *,word *,word *),
+ (*USL_DrawString)(char far *);
+
+extern boolean (*USL_SaveGame)(int),(*USL_LoadGame)(int);
+extern void (*USL_ResetGame)(void);
+extern SaveGame Games[MaxSaveGames];
+extern HighScore Scores[];
+
+#define US_HomeWindow() {PrintX = WindowX; PrintY = WindowY;}
+
+extern void US_Startup(void),
+ US_Setup(void),
+ US_Shutdown(void),
+ US_InitRndT(boolean randomize),
+ US_SetLoadSaveHooks(boolean (*load)(int),
+ boolean (*save)(int),
+ void (*reset)(void)),
+ US_TextScreen(void),
+ US_UpdateTextScreen(void),
+ US_FinishTextScreen(void),
+ US_DrawWindow(word x,word y,word w,word h),
+ US_CenterWindow(word,word),
+ US_SaveWindow(WindowRec *win),
+ US_RestoreWindow(WindowRec *win),
+ US_ClearWindow(void),
+ US_SetPrintRoutines(void (*measure)(char far *,word *,word *),
+ void (*print)(char far *)),
+ US_PrintCentered(char far *s),
+ US_CPrint(char far *s),
+ US_CPrintLine(char far *s),
+ US_Print(char far *s),
+ US_PrintUnsigned(longword n),
+ US_PrintSigned(long n),
+ US_StartCursor(void),
+ US_ShutCursor(void),
+ US_CheckHighScore(long score,word other),
+ US_DisplayHighScores(int which);
+extern boolean US_UpdateCursor(void),
+ US_LineInput(int x,int y,char *buf,char *def,boolean escok,
+ int maxchars,int maxwidth);
+extern int US_CheckParm(char *parm,char **strings),
+ US_RndT(void);
+
+ void USL_PrintInCenter(char far *s,Rect r);
+ char *USL_GiveSaveName(word game);
+#endif
--- /dev/null
+++ b/us1.c
@@ -1,0 +1,755 @@
+//
+// ID Engine
+// ID_US_1.c - User Manager - General routines
+// v1.1d1
+// By Jason Blochowiak
+// Hacked up for Catacomb 3D
+//
+
+//
+// This module handles dealing with user input & feedback
+//
+// Depends on: Input Mgr, View Mgr, some variables from the Sound, Caching,
+// and Refresh Mgrs, Memory Mgr for background save/restore
+//
+// Globals:
+// ingame - Flag set by game indicating if a game is in progress
+// abortgame - Flag set if the current game should be aborted (if a load
+// game fails)
+// loadedgame - Flag set if a game was loaded
+// abortprogram - Normally nil, this points to a terminal error message
+// if the program needs to abort
+// restartgame - Normally set to gd_Continue, this is set to one of the
+// difficulty levels if a new game should be started
+// PrintX, PrintY - Where the User Mgr will print (global coords)
+// WindowX,WindowY,WindowW,WindowH - The dimensions of the current
+// window
+//
+
+#include "ID_HEADS.H"
+
+#pragma hdrstop
+
+#pragma warn -pia
+
+
+// Global variables
+ char *abortprogram;
+ boolean NoWait;
+ word PrintX,PrintY;
+ word WindowX,WindowY,WindowW,WindowH;
+
+// Internal variables
+#define ConfigVersion 1
+
+static char *ParmStrings[] = {"TEDLEVEL","NOWAIT"},
+ *ParmStrings2[] = {"COMP","NOCOMP"};
+static boolean US_Started;
+
+ boolean Button0,Button1,
+ CursorBad;
+ int CursorX,CursorY;
+
+ void (*USL_MeasureString)(char far *,word *,word *) = VW_MeasurePropString,
+ (*USL_DrawString)(char far *) = VWB_DrawPropString;
+
+ SaveGame Games[MaxSaveGames];
+ HighScore Scores[MaxScores] =
+ {
+ {"id software-'92",10000,1},
+ {"Adrian Carmack",10000,1},
+ {"John Carmack",10000,1},
+ {"Kevin Cloud",10000,1},
+ {"Tom Hall",10000,1},
+ {"John Romero",10000,1},
+ {"Jay Wilbur",10000,1},
+ };
+
+// Internal routines
+
+// Public routines
+
+///////////////////////////////////////////////////////////////////////////
+//
+// USL_HardError() - Handles the Abort/Retry/Fail sort of errors passed
+// from DOS.
+//
+///////////////////////////////////////////////////////////////////////////
+#pragma warn -par
+#pragma warn -rch
+int
+USL_HardError(word errval,int ax,int bp,int si)
+{
+#define IGNORE 0
+#define RETRY 1
+#define ABORT 2
+extern void ShutdownId(void);
+
+static char buf[32];
+static WindowRec wr;
+ int di;
+ char c,*s,*t;
+
+
+ di = _DI;
+
+ if (ax < 0)
+ s = "Device Error";
+ else
+ {
+ if ((di & 0x00ff) == 0)
+ s = "Drive ~ is Write Protected";
+ else
+ s = "Error on Drive ~";
+ for (t = buf;*s;s++,t++) // Can't use sprintf()
+ if ((*t = *s) == '~')
+ *t = (ax & 0x00ff) + 'A';
+ *t = '\0';
+ s = buf;
+ }
+
+ c = peekb(0x40,0x49); // Get the current screen mode
+ if ((c < 4) || (c == 7))
+ goto oh_kill_me;
+
+ // DEBUG - handle screen cleanup
+
+ US_SaveWindow(&wr);
+ US_CenterWindow(30,3);
+ US_CPrint(s);
+ US_CPrint("(R)etry or (A)bort?");
+ VW_UpdateScreen();
+ IN_ClearKeysDown();
+
+asm sti // Let the keyboard interrupts come through
+
+ while (true)
+ {
+ switch (IN_WaitForASCII())
+ {
+ case key_Escape:
+ case 'a':
+ case 'A':
+ goto oh_kill_me;
+ break;
+ case key_Return:
+ case key_Space:
+ case 'r':
+ case 'R':
+ US_ClearWindow();
+ VW_UpdateScreen();
+ US_RestoreWindow(&wr);
+ return(RETRY);
+ break;
+ }
+ }
+
+oh_kill_me:
+ abortprogram = s;
+ ShutdownId();
+ fprintf(stderr,"Terminal Error: %s\n",s);
+ if (tedlevel)
+ fprintf(stderr,"You launched from TED. I suggest that you reboot...\n");
+
+ return(ABORT);
+#undef IGNORE
+#undef RETRY
+#undef ABORT
+}
+#pragma warn +par
+#pragma warn +rch
+
+
+///////////////////////////////////////////////////////////////////////////
+//
+// US_Startup() - Starts the User Mgr
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_Startup(void)
+{
+ int i,n;
+
+ if (US_Started)
+ return;
+
+ harderr(USL_HardError); // Install the fatal error handler
+
+ US_InitRndT(true); // Initialize the random number generator
+
+ for (i = 1;i < _argc;i++)
+ {
+ switch (US_CheckParm(_argv[i],ParmStrings2))
+ {
+ case 0:
+ compatability = true;
+ break;
+ case 1:
+ compatability = false;
+ break;
+ }
+ }
+
+ // Check for TED launching here
+ for (i = 1;i < _argc;i++)
+ {
+ n = US_CheckParm(_argv[i],ParmStrings);
+ switch(n)
+ {
+ case 0:
+ tedlevelnum = atoi(_argv[i + 1]);
+ if (tedlevelnum >= 0)
+ tedlevel = true;
+ break;
+
+ case 1:
+ NoWait = true;
+ break;
+ }
+ }
+
+ US_Started = true;
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+//
+// US_Shutdown() - Shuts down the User Mgr
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_Shutdown(void)
+{
+ if (!US_Started)
+ return;
+
+ US_Started = false;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// US_CheckParm() - checks to see if a string matches one of a set of
+// strings. The check is case insensitive. The routine returns the
+// index of the string that matched, or -1 if no matches were found
+//
+///////////////////////////////////////////////////////////////////////////
+int
+US_CheckParm(char *parm,char **strings)
+{
+ char cp,cs,
+ *p,*s;
+ int i;
+
+ while (!isalpha(*parm)) // Skip non-alphas
+ parm++;
+
+ for (i = 0;*strings && **strings;i++)
+ {
+ for (s = *strings++,p = parm,cs = cp = 0;cs == cp;)
+ {
+ cs = *s++;
+ if (!cs)
+ return(i);
+ cp = *p++;
+
+ if (isupper(cs))
+ cs = tolower(cs);
+ if (isupper(cp))
+ cp = tolower(cp);
+ }
+ }
+ return(-1);
+}
+
+
+// Window/Printing routines
+
+///////////////////////////////////////////////////////////////////////////
+//
+// US_SetPrintRoutines() - Sets the routines used to measure and print
+// from within the User Mgr. Primarily provided to allow switching
+// between masked and non-masked fonts
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_SetPrintRoutines(void (*measure)(char far *,word *,word *),void (*print)(char far *))
+{
+ USL_MeasureString = measure;
+ USL_DrawString = print;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// US_Print() - Prints a string in the current window. Newlines are
+// supported.
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_Print(char far *s)
+{
+ char c,far *se;
+ word w,h;
+
+ while (*s)
+ {
+ se = s;
+ while ((c = *se) && (c != '\n'))
+ se++;
+ *se = '\0';
+
+ USL_MeasureString(s,&w,&h);
+ px = PrintX;
+ py = PrintY;
+ USL_DrawString(s);
+
+ s = se;
+ if (c)
+ {
+ *se = c;
+ s++;
+
+ PrintX = WindowX;
+ PrintY += h;
+ }
+ else
+ PrintX += w;
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// US_PrintUnsigned() - Prints an unsigned long
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_PrintUnsigned(longword n)
+{
+ char buffer[32];
+
+ US_Print(ultoa(n,buffer,10));
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// US_PrintSigned() - Prints a signed long
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_PrintSigned(long n)
+{
+ char buffer[32];
+
+ US_Print(ltoa(n,buffer,10));
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// USL_PrintInCenter() - Prints a string in the center of the given rect
+//
+///////////////////////////////////////////////////////////////////////////
+void
+USL_PrintInCenter(char far *s,Rect r)
+{
+ word w,h,
+ rw,rh;
+
+ USL_MeasureString(s,&w,&h);
+ rw = r.lr.x - r.ul.x;
+ rh = r.lr.y - r.ul.y;
+
+ px = r.ul.x + ((rw - w) / 2);
+ py = r.ul.y + ((rh - h) / 2);
+ USL_DrawString(s);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// US_PrintCentered() - Prints a string centered in the current window.
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_PrintCentered(char far *s)
+{
+ Rect r;
+
+ r.ul.x = WindowX;
+ r.ul.y = WindowY;
+ r.lr.x = r.ul.x + WindowW;
+ r.lr.y = r.ul.y + WindowH;
+
+ USL_PrintInCenter(s,r);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// US_CPrintLine() - Prints a string centered on the current line and
+// advances to the next line. Newlines are not supported.
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_CPrintLine(char far *s)
+{
+ word w,h;
+
+ USL_MeasureString(s,&w,&h);
+
+ if (w > WindowW)
+ Quit("US_CPrintLine() - String exceeds width");
+ px = WindowX + ((WindowW - w) / 2);
+ py = PrintY;
+ USL_DrawString(s);
+ PrintY += h;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// US_CPrint() - Prints a string in the current window. Newlines are
+// supported.
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_CPrint(char far *s)
+{
+ char c,far *se;
+
+ while (*s)
+ {
+ se = s;
+ while ((c = *se) && (c != '\n'))
+ se++;
+ *se = '\0';
+
+ US_CPrintLine(s);
+
+ s = se;
+ if (c)
+ {
+ *se = c;
+ s++;
+ }
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// US_ClearWindow() - Clears the current window to white and homes the
+// cursor
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_ClearWindow(void)
+{
+ VWB_Bar(WindowX,WindowY,WindowW,WindowH,WHITE);
+ PrintX = WindowX;
+ PrintY = WindowY;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// US_DrawWindow() - Draws a frame and sets the current window parms
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_DrawWindow(word x,word y,word w,word h)
+{
+ word i,
+ sx,sy,sw,sh;
+
+ WindowX = x * 8;
+ WindowY = y * 8;
+ WindowW = w * 8;
+ WindowH = h * 8;
+
+ PrintX = WindowX;
+ PrintY = WindowY;
+
+ sx = (x - 1) * 8;
+ sy = (y - 1) * 8;
+ sw = (w + 1) * 8;
+ sh = (h + 1) * 8;
+
+ US_ClearWindow();
+
+ VWB_DrawTile8(sx,sy,0),VWB_DrawTile8(sx,sy + sh,5);
+ for (i = sx + 8;i <= sx + sw - 8;i += 8)
+ VWB_DrawTile8(i,sy,1),VWB_DrawTile8(i,sy + sh,6);
+ VWB_DrawTile8(i,sy,2),VWB_DrawTile8(i,sy + sh,7);
+
+ for (i = sy + 8;i <= sy + sh - 8;i += 8)
+ VWB_DrawTile8(sx,i,3),VWB_DrawTile8(sx + sw,i,4);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// US_CenterWindow() - Generates a window of a given width & height in the
+// middle of the screen
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_CenterWindow(word w,word h)
+{
+ US_DrawWindow(((MaxX / 8) - w) / 2,((MaxY / 8) - h) / 2,w,h);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// US_SaveWindow() - Saves the current window parms into a record for
+// later restoration
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_SaveWindow(WindowRec *win)
+{
+ win->x = WindowX;
+ win->y = WindowY;
+ win->w = WindowW;
+ win->h = WindowH;
+
+ win->px = PrintX;
+ win->py = PrintY;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// US_RestoreWindow() - Sets the current window parms to those held in the
+// record
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_RestoreWindow(WindowRec *win)
+{
+ WindowX = win->x;
+ WindowY = win->y;
+ WindowW = win->w;
+ WindowH = win->h;
+
+ PrintX = win->px;
+ PrintY = win->py;
+}
+
+// Input routines
+
+///////////////////////////////////////////////////////////////////////////
+//
+// USL_XORICursor() - XORs the I-bar text cursor. Used by US_LineInput()
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+USL_XORICursor(int x,int y,char *s,word cursor)
+{
+ static boolean status; // VGA doesn't XOR...
+ char buf[MaxString];
+ int temp;
+ word w,h;
+
+ strcpy(buf,s);
+ buf[cursor] = '\0';
+ USL_MeasureString(buf,&w,&h);
+
+ px = x + w - 1;
+ py = y;
+ if (status^=1)
+ USL_DrawString("\x80");
+ else
+ {
+ temp = fontcolor;
+ fontcolor = backcolor;
+ USL_DrawString("\x80");
+ fontcolor = temp;
+ }
+
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// US_LineInput() - Gets a line of user input at (x,y), the string defaults
+// to whatever is pointed at by def. Input is restricted to maxchars
+// chars or maxwidth pixels wide. If the user hits escape (and escok is
+// true), nothing is copied into buf, and false is returned. If the
+// user hits return, the current string is copied into buf, and true is
+// returned
+//
+///////////////////////////////////////////////////////////////////////////
+boolean
+US_LineInput(int x,int y,char *buf,char *def,boolean escok,
+ int maxchars,int maxwidth)
+{
+ boolean redraw,
+ cursorvis,cursormoved,
+ done,result;
+ ScanCode sc;
+ char c,
+ s[MaxString],olds[MaxString];
+ word i,
+ cursor,
+ w,h,
+ len,temp;
+ longword lasttime;
+
+ if (def)
+ strcpy(s,def);
+ else
+ *s = '\0';
+ *olds = '\0';
+ cursor = strlen(s);
+ cursormoved = redraw = true;
+
+ cursorvis = done = false;
+ lasttime = TimeCount;
+ LastASCII = key_None;
+ LastScan = sc_None;
+
+ while (!done)
+ {
+ if (cursorvis)
+ USL_XORICursor(x,y,s,cursor);
+
+ asm pushf
+ asm cli
+
+ sc = LastScan;
+ LastScan = sc_None;
+ c = LastASCII;
+ LastASCII = key_None;
+
+ asm popf
+
+ switch (sc)
+ {
+ case sc_LeftArrow:
+ if (cursor)
+ cursor--;
+ c = key_None;
+ cursormoved = true;
+ break;
+ case sc_RightArrow:
+ if (s[cursor])
+ cursor++;
+ c = key_None;
+ cursormoved = true;
+ break;
+ case sc_Home:
+ cursor = 0;
+ c = key_None;
+ cursormoved = true;
+ break;
+ case sc_End:
+ cursor = strlen(s);
+ c = key_None;
+ cursormoved = true;
+ break;
+
+ case sc_Return:
+ strcpy(buf,s);
+ done = true;
+ result = true;
+ c = key_None;
+ break;
+ case sc_Escape:
+ if (escok)
+ {
+ done = true;
+ result = false;
+ }
+ c = key_None;
+ break;
+
+ case sc_BackSpace:
+ if (cursor)
+ {
+ strcpy(s + cursor - 1,s + cursor);
+ cursor--;
+ redraw = true;
+ }
+ c = key_None;
+ cursormoved = true;
+ break;
+ case sc_Delete:
+ if (s[cursor])
+ {
+ strcpy(s + cursor,s + cursor + 1);
+ redraw = true;
+ }
+ c = key_None;
+ cursormoved = true;
+ break;
+
+ case 0x4c: // Keypad 5
+ case sc_UpArrow:
+ case sc_DownArrow:
+ case sc_PgUp:
+ case sc_PgDn:
+ case sc_Insert:
+ c = key_None;
+ break;
+ }
+
+ if (c)
+ {
+ len = strlen(s);
+ USL_MeasureString(s,&w,&h);
+
+ if
+ (
+ isprint(c)
+ && (len < MaxString - 1)
+ && ((!maxchars) || (len < maxchars))
+ && ((!maxwidth) || (w < maxwidth))
+ )
+ {
+ for (i = len + 1;i > cursor;i--)
+ s[i] = s[i - 1];
+ s[cursor++] = c;
+ redraw = true;
+ }
+ }
+
+ if (redraw)
+ {
+ px = x;
+ py = y;
+ temp = fontcolor;
+ fontcolor = backcolor;
+ USL_DrawString(olds);
+ fontcolor = temp;
+ strcpy(olds,s);
+
+ px = x;
+ py = y;
+ USL_DrawString(s);
+
+ redraw = false;
+ }
+
+ if (cursormoved)
+ {
+ cursorvis = false;
+ lasttime = TimeCount - TickBase;
+
+ cursormoved = false;
+ }
+ if (TimeCount - lasttime > TickBase / 2)
+ {
+ lasttime = TimeCount;
+
+ cursorvis ^= true;
+ }
+ if (cursorvis)
+ USL_XORICursor(x,y,s,cursor);
+
+ VW_UpdateScreen();
+ }
+
+ if (cursorvis)
+ USL_XORICursor(x,y,s,cursor);
+ if (!result)
+ {
+ px = x;
+ py = y;
+ USL_DrawString(olds);
+ }
+ VW_UpdateScreen();
+
+ IN_ClearKeysDown();
+ return(result);
+}
--- /dev/null
+++ b/version.h
@@ -1,0 +1,10 @@
+//#define SPEAR
+//#define JAPAN
+#define GOODTIMES
+#define ARTSEXTERN
+#define DEMOSEXTERN
+//#define MYPROFILE
+//#define DEBCHECK
+#define CARMACIZED
+//#define UPLOAD
+
\ No newline at end of file
--- /dev/null
+++ b/vh.asm
@@ -1,0 +1,110 @@
+; ID_VL.ASM
+
+ IDEAL
+ MODEL MEDIUM,C
+
+ INCLUDE 'ID_VL.EQU'
+
+SCREENSEG = 0a000h
+
+UPDATEWIDE = 20
+UPDATEHIGH = 13
+
+ DATASEG
+
+
+EXTRN bufferofs :WORD
+EXTRN displayofs :WORD
+EXTRN ylookup :WORD
+EXTRN linewidth :WORD
+EXTRN blockstarts :WORD ;offsets from drawofs for each update block
+
+EXTRN update :BYTE
+
+ CODESEG
+
+
+;=================
+;
+; VH_UpdateScreen
+;
+;=================
+
+PROC VH_UpdateScreen
+PUBLIC VH_UpdateScreen
+USES si,di
+
+ mov dx,SC_INDEX
+ mov ax,SC_MAPMASK+15*256
+ out dx,ax
+
+ mov dx,GC_INDEX
+ mov al,GC_MODE
+ out dx,al
+
+ inc dx
+ in al,dx
+ and al,252
+ or al,1
+ out dx,al
+
+ mov bx,UPDATEWIDE*UPDATEHIGH-1 ; bx is the tile number
+ mov dx,[linewidth]
+
+;
+; see if the tile needs to be copied
+;
+@@checktile:
+ test [update+bx],1
+ jnz @@copytile
+@@next:
+ dec bx
+ jns @@checktile
+
+;
+; done
+;
+ mov dx,GC_INDEX+1
+ in al,dx
+ and al,NOT 3
+ or al,0
+ out dx,al
+ ret
+
+;
+; copy a tile
+;
+@@copytile:
+ mov [update+bx],0
+ shl bx,1
+ mov si,[blockstarts+bx]
+ shr bx,1
+ mov di,si
+ add si,[bufferofs]
+ add di,[displayofs]
+
+ mov ax,SCREENSEG
+ mov ds,ax
+
+REPT 16
+ mov al,[si]
+ mov [di],al
+ mov al,[si+1]
+ mov [di+1],al
+ mov al,[si+2]
+ mov [di+2],al
+ mov al,[si+3]
+ mov [di+3],al
+ add si,dx
+ add di,dx
+ENDM
+
+ mov ax,ss
+ mov ds,ax
+ jmp @@next
+
+ENDP
+
+
+ END
+
--- /dev/null
+++ b/vh.c
@@ -1,0 +1,547 @@
+// ID_VH.C
+
+#include "ID_HEADS.H"
+
+#define SCREENWIDTH 80
+#define CHARWIDTH 2
+#define TILEWIDTH 4
+#define GRPLANES 4
+#define BYTEPIXELS 4
+
+#define SCREENXMASK (~3)
+#define SCREENXPLUS (3)
+#define SCREENXDIV (4)
+
+#define VIEWWIDTH 80
+
+#define PIXTOBLOCK 4 // 16 pixels to an update block
+
+#define UNCACHEGRCHUNK(chunk) {MM_FreePtr(&grsegs[chunk]);grneeded[chunk]&=~ca_levelbit;}
+
+byte update[UPDATEHIGH][UPDATEWIDE];
+
+//==========================================================================
+
+pictabletype _seg *pictable;
+
+
+int px,py;
+byte fontcolor,backcolor;
+int fontnumber;
+int bufferwidth,bufferheight;
+
+
+//==========================================================================
+
+void VWL_UpdateScreenBlocks (void);
+
+//==========================================================================
+
+void VW_DrawPropString (char far *string)
+{
+ fontstruct far *font;
+ int width,step,height,i;
+ byte far *source, far *dest, far *origdest;
+ byte ch,mask;
+
+ font = (fontstruct far *)grsegs[STARTFONT+fontnumber];
+ height = bufferheight = font->height;
+ dest = origdest = MK_FP(SCREENSEG,bufferofs+ylookup[py]+(px>>2));
+ mask = 1<<(px&3);
+
+
+ while ((ch = *string++)!=0)
+ {
+ width = step = font->width[ch];
+ source = ((byte far *)font)+font->location[ch];
+ while (width--)
+ {
+ VGAMAPMASK(mask);
+
+asm mov ah,[BYTE PTR fontcolor]
+asm mov bx,[step]
+asm mov cx,[height]
+asm mov dx,[linewidth]
+asm lds si,[source]
+asm les di,[dest]
+
+vertloop:
+asm mov al,[si]
+asm or al,al
+asm je next
+asm mov [es:di],ah // draw color
+
+next:
+asm add si,bx
+asm add di,dx
+asm loop vertloop
+asm mov ax,ss
+asm mov ds,ax
+
+ source++;
+ px++;
+ mask <<= 1;
+ if (mask == 16)
+ {
+ mask = 1;
+ dest++;
+ }
+ }
+ }
+bufferheight = height;
+bufferwidth = ((dest+1)-origdest)*4;
+}
+
+
+void VW_DrawColorPropString (char far *string)
+{
+ fontstruct far *font;
+ int width,step,height,i;
+ byte far *source, far *dest, far *origdest;
+ byte ch,mask;
+
+ font = (fontstruct far *)grsegs[STARTFONT+fontnumber];
+ height = bufferheight = font->height;
+ dest = origdest = MK_FP(SCREENSEG,bufferofs+ylookup[py]+(px>>2));
+ mask = 1<<(px&3);
+
+
+ while ((ch = *string++)!=0)
+ {
+ width = step = font->width[ch];
+ source = ((byte far *)font)+font->location[ch];
+ while (width--)
+ {
+ VGAMAPMASK(mask);
+
+asm mov ah,[BYTE PTR fontcolor]
+asm mov bx,[step]
+asm mov cx,[height]
+asm mov dx,[linewidth]
+asm lds si,[source]
+asm les di,[dest]
+
+vertloop:
+asm mov al,[si]
+asm or al,al
+asm je next
+asm mov [es:di],ah // draw color
+
+next:
+asm add si,bx
+asm add di,dx
+
+asm rcr cx,1 // inc font color
+asm jc cont
+asm inc ah
+
+cont:
+asm rcl cx,1
+asm loop vertloop
+asm mov ax,ss
+asm mov ds,ax
+
+ source++;
+ px++;
+ mask <<= 1;
+ if (mask == 16)
+ {
+ mask = 1;
+ dest++;
+ }
+ }
+ }
+bufferheight = height;
+bufferwidth = ((dest+1)-origdest)*4;
+}
+
+
+//==========================================================================
+
+
+/*
+=================
+=
+= VL_MungePic
+=
+=================
+*/
+
+void VL_MungePic (byte far *source, unsigned width, unsigned height)
+{
+ unsigned x,y,plane,size,pwidth;
+ byte _seg *temp, far *dest, far *srcline;
+
+ size = width*height;
+
+ if (width&3)
+ MS_Quit ("VL_MungePic: Not divisable by 4!");
+
+//
+// copy the pic to a temp buffer
+//
+ MM_GetPtr (&(memptr)temp,size);
+ _fmemcpy (temp,source,size);
+
+//
+// munge it back into the original buffer
+//
+ dest = source;
+ pwidth = width/4;
+
+ for (plane=0;plane<4;plane++)
+ {
+ srcline = temp;
+ for (y=0;y<height;y++)
+ {
+ for (x=0;x<pwidth;x++)
+ *dest++ = *(srcline+x*4+plane);
+ srcline+=width;
+ }
+ }
+
+ MM_FreePtr (&(memptr)temp);
+}
+
+void VWL_MeasureString (char far *string, word *width, word *height
+ , fontstruct _seg *font)
+{
+ *height = font->height;
+ for (*width = 0;*string;string++)
+ *width += font->width[*((byte far *)string)]; // proportional width
+}
+
+void VW_MeasurePropString (char far *string, word *width, word *height)
+{
+ VWL_MeasureString(string,width,height,(fontstruct _seg *)grsegs[STARTFONT+fontnumber]);
+}
+
+void VW_MeasureMPropString (char far *string, word *width, word *height)
+{
+ VWL_MeasureString(string,width,height,(fontstruct _seg *)grsegs[STARTFONTM+fontnumber]);
+}
+
+
+
+/*
+=============================================================================
+
+ Double buffer management routines
+
+=============================================================================
+*/
+
+
+/*
+=======================
+=
+= VW_MarkUpdateBlock
+=
+= Takes a pixel bounded block and marks the tiles in bufferblocks
+= Returns 0 if the entire block is off the buffer screen
+=
+=======================
+*/
+
+int VW_MarkUpdateBlock (int x1, int y1, int x2, int y2)
+{
+ int x,y,xt1,yt1,xt2,yt2,nextline;
+ byte *mark;
+
+ xt1 = x1>>PIXTOBLOCK;
+ yt1 = y1>>PIXTOBLOCK;
+
+ xt2 = x2>>PIXTOBLOCK;
+ yt2 = y2>>PIXTOBLOCK;
+
+ if (xt1<0)
+ xt1=0;
+ else if (xt1>=UPDATEWIDE)
+ return 0;
+
+ if (yt1<0)
+ yt1=0;
+ else if (yt1>UPDATEHIGH)
+ return 0;
+
+ if (xt2<0)
+ return 0;
+ else if (xt2>=UPDATEWIDE)
+ xt2 = UPDATEWIDE-1;
+
+ if (yt2<0)
+ return 0;
+ else if (yt2>=UPDATEHIGH)
+ yt2 = UPDATEHIGH-1;
+
+ mark = updateptr + uwidthtable[yt1] + xt1;
+ nextline = UPDATEWIDE - (xt2-xt1) - 1;
+
+ for (y=yt1;y<=yt2;y++)
+ {
+ for (x=xt1;x<=xt2;x++)
+ *mark++ = 1; // this tile will need to be updated
+
+ mark += nextline;
+ }
+
+ return 1;
+}
+
+void VWB_DrawTile8 (int x, int y, int tile)
+{
+ if (VW_MarkUpdateBlock (x,y,x+7,y+7))
+ LatchDrawChar(x,y,tile);
+}
+
+void VWB_DrawTile8M (int x, int y, int tile)
+{
+ if (VW_MarkUpdateBlock (x,y,x+7,y+7))
+ VL_MemToScreen (((byte far *)grsegs[STARTTILE8M])+tile*64,8,8,x,y);
+}
+
+
+void VWB_DrawPic (int x, int y, int chunknum)
+{
+ int picnum = chunknum - STARTPICS;
+ unsigned width,height;
+
+ x &= ~7;
+
+ width = pictable[picnum].width;
+ height = pictable[picnum].height;
+
+ if (VW_MarkUpdateBlock (x,y,x+width-1,y+height-1))
+ VL_MemToScreen (grsegs[chunknum],width,height,x,y);
+}
+
+
+
+void VWB_DrawPropString (char far *string)
+{
+ int x;
+ x=px;
+ VW_DrawPropString (string);
+ VW_MarkUpdateBlock(x,py,px-1,py+bufferheight-1);
+}
+
+
+void VWB_Bar (int x, int y, int width, int height, int color)
+{
+ if (VW_MarkUpdateBlock (x,y,x+width,y+height-1) )
+ VW_Bar (x,y,width,height,color);
+}
+
+void VWB_Plot (int x, int y, int color)
+{
+ if (VW_MarkUpdateBlock (x,y,x,y))
+ VW_Plot(x,y,color);
+}
+
+void VWB_Hlin (int x1, int x2, int y, int color)
+{
+ if (VW_MarkUpdateBlock (x1,y,x2,y))
+ VW_Hlin(x1,x2,y,color);
+}
+
+void VWB_Vlin (int y1, int y2, int x, int color)
+{
+ if (VW_MarkUpdateBlock (x,y1,x,y2))
+ VW_Vlin(y1,y2,x,color);
+}
+
+void VW_UpdateScreen (void)
+{
+ VH_UpdateScreen ();
+}
+
+
+/*
+=============================================================================
+
+ WOLFENSTEIN STUFF
+
+=============================================================================
+*/
+
+/*
+=====================
+=
+= LatchDrawPic
+=
+=====================
+*/
+
+void LatchDrawPic (unsigned x, unsigned y, unsigned picnum)
+{
+ unsigned wide, height, source;
+
+ wide = pictable[picnum-STARTPICS].width;
+ height = pictable[picnum-STARTPICS].height;
+ source = latchpics[2+picnum-LATCHPICS_LUMP_START];
+
+ VL_LatchToScreen (source,wide/4,height,x*8,y);
+}
+
+
+//==========================================================================
+
+/*
+===================
+=
+= LoadLatchMem
+=
+===================
+*/
+
+void LoadLatchMem (void)
+{
+ int i,j,p,m,width,height,start,end;
+ byte far *src;
+ unsigned destoff;
+
+//
+// tile 8s
+//
+ latchpics[0] = freelatch;
+ CA_CacheGrChunk (STARTTILE8);
+ src = (byte _seg *)grsegs[STARTTILE8];
+ destoff = freelatch;
+
+ for (i=0;i<NUMTILE8;i++)
+ {
+ VL_MemToLatch (src,8,8,destoff);
+ src += 64;
+ destoff +=16;
+ }
+ UNCACHEGRCHUNK (STARTTILE8);
+
+#if 0 // ran out of latch space!
+//
+// tile 16s
+//
+ src = (byte _seg *)grsegs[STARTTILE16];
+ latchpics[1] = destoff;
+
+ for (i=0;i<NUMTILE16;i++)
+ {
+ CA_CacheGrChunk (STARTTILE16+i);
+ src = (byte _seg *)grsegs[STARTTILE16+i];
+ VL_MemToLatch (src,16,16,destoff);
+ destoff+=64;
+ if (src)
+ UNCACHEGRCHUNK (STARTTILE16+i);
+ }
+#endif
+
+//
+// pics
+//
+ start = LATCHPICS_LUMP_START;
+ end = LATCHPICS_LUMP_END;
+
+ for (i=start;i<=end;i++)
+ {
+ latchpics[2+i-start] = destoff;
+ CA_CacheGrChunk (i);
+ width = pictable[i-STARTPICS].width;
+ height = pictable[i-STARTPICS].height;
+ VL_MemToLatch (grsegs[i],width,height,destoff);
+ destoff += width/4 *height;
+ UNCACHEGRCHUNK(i);
+ }
+
+ EGAMAPMASK(15);
+}
+
+//==========================================================================
+
+/*
+===================
+=
+= FizzleFade
+=
+= returns true if aborted
+=
+===================
+*/
+
+extern ControlInfo c;
+
+boolean FizzleFade (unsigned source, unsigned dest,
+ unsigned width,unsigned height, unsigned frames, boolean abortable)
+{
+ int pixperframe;
+ unsigned drawofs,pagedelta;
+ byte mask,maskb[8] = {1,2,4,8};
+ unsigned x,y,p,frame;
+ long rndval;
+
+ pagedelta = dest-source;
+ rndval = 1;
+ y = 0;
+ pixperframe = 64000/frames;
+
+ IN_StartAck ();
+
+ TimeCount=frame=0;
+ do // while (1)
+ {
+ if (abortable && IN_CheckAck () )
+ return true;
+
+ asm mov es,[screenseg]
+
+ for (p=0;p<pixperframe;p++)
+ {
+ //
+ // seperate random value into x/y pair
+ //
+ asm mov ax,[WORD PTR rndval]
+ asm mov dx,[WORD PTR rndval+2]
+ asm mov bx,ax
+ asm dec bl
+ asm mov [BYTE PTR y],bl // low 8 bits - 1 = y xoordinate
+ asm mov bx,ax
+ asm mov cx,dx
+ asm mov [BYTE PTR x],ah // next 9 bits = x xoordinate
+ asm mov [BYTE PTR x+1],dl
+ //
+ // advance to next random element
+ //
+ asm shr dx,1
+ asm rcr ax,1
+ asm jnc noxor
+ asm xor dx,0x0001
+ asm xor ax,0x2000
+noxor:
+ asm mov [WORD PTR rndval],ax
+ asm mov [WORD PTR rndval+2],dx
+
+ if (x>width || y>height)
+ continue;
+ drawofs = source+ylookup[y] + (x>>2);
+
+ //
+ // copy one pixel
+ //
+ mask = x&3;
+ VGAREADMAP(mask);
+ mask = maskb[mask];
+ VGAMAPMASK(mask);
+
+ asm mov di,[drawofs]
+ asm mov al,[es:di]
+ asm add di,[pagedelta]
+ asm mov [es:di],al
+
+ if (rndval == 1) // entire sequence has been completed
+ return false;
+ }
+ frame++;
+ while (TimeCount<frame) // don't go too fast
+ ;
+ } while (1);
+
+
+}
--- /dev/null
+++ b/vh.h
@@ -1,0 +1,134 @@
+// ID_VH.H
+
+
+#define WHITE 15 // graphics mode independant colors
+#define BLACK 0
+#define FIRSTCOLOR 1
+#define SECONDCOLOR 12
+#define F_WHITE 15
+#define F_BLACK 0
+#define F_FIRSTCOLOR 1
+#define F_SECONDCOLOR 12
+
+//===========================================================================
+
+#define MAXSHIFTS 1
+
+typedef struct
+{
+ int width,
+ height,
+ orgx,orgy,
+ xl,yl,xh,yh,
+ shifts;
+} spritetabletype;
+
+typedef struct
+{
+ unsigned sourceoffset[MAXSHIFTS];
+ unsigned planesize[MAXSHIFTS];
+ unsigned width[MAXSHIFTS];
+ byte data[];
+} spritetype; // the memptr for each sprite points to this
+
+typedef struct
+{
+ int width,height;
+} pictabletype;
+
+
+typedef struct
+{
+ int height;
+ int location[256];
+ char width[256];
+} fontstruct;
+
+
+//===========================================================================
+
+
+extern pictabletype _seg *pictable;
+extern pictabletype _seg *picmtable;
+extern spritetabletype _seg *spritetable;
+
+extern byte fontcolor;
+extern int fontnumber;
+extern int px,py;
+
+//
+// Double buffer management routines
+//
+
+void VW_InitDoubleBuffer (void);
+int VW_MarkUpdateBlock (int x1, int y1, int x2, int y2);
+void VW_UpdateScreen (void);
+
+//
+// mode independant routines
+// coordinates in pixels, rounded to best screen res
+// regions marked in double buffer
+//
+
+void VWB_DrawTile8 (int x, int y, int tile);
+void VWB_DrawTile8M (int x, int y, int tile);
+void VWB_DrawTile16 (int x, int y, int tile);
+void VWB_DrawTile16M (int x, int y, int tile);
+void VWB_DrawPic (int x, int y, int chunknum);
+void VWB_DrawMPic(int x, int y, int chunknum);
+void VWB_Bar (int x, int y, int width, int height, int color);
+
+void VWB_DrawPropString (char far *string);
+void VWB_DrawMPropString (char far *string);
+void VWB_DrawSprite (int x, int y, int chunknum);
+void VWB_Plot (int x, int y, int color);
+void VWB_Hlin (int x1, int x2, int y, int color);
+void VWB_Vlin (int y1, int y2, int x, int color);
+
+
+//
+// wolfenstein EGA compatability stuff
+//
+extern byte far gamepal;
+
+void VH_SetDefaultColors (void);
+
+#define VW_Startup VL_Startup
+#define VW_Shutdown VL_Shutdown
+#define VW_SetCRTC VL_SetCRTC
+#define VW_SetScreen VL_SetScreen
+#define VW_Bar VL_Bar
+#define VW_Plot VL_Plot
+#define VW_Hlin(x,z,y,c) VL_Hlin(x,y,(z)-(x)+1,c)
+#define VW_Vlin(y,z,x,c) VL_Vlin(x,y,(z)-(y)+1,c)
+#define VW_DrawPic VH_DrawPic
+#define VW_SetSplitScreen VL_SetSplitScreen
+#define VW_SetLineWidth VL_SetLineWidth
+#define VW_ColorBorder VL_ColorBorder
+#define VW_WaitVBL VL_WaitVBL
+#define VW_FadeIn() VL_FadeIn(0,255,&gamepal,30);
+#define VW_FadeOut() VL_FadeOut(0,255,0,0,0,30);
+#define VW_ScreenToScreen VL_ScreenToScreen
+#define VW_SetDefaultColors VH_SetDefaultColors
+void VW_MeasurePropString (char far *string, word *width, word *height);
+#define EGAMAPMASK(x) VGAMAPMASK(x)
+#define EGAWRITEMODE(x) VGAWRITEMODE(x)
+
+//#define VW_MemToScreen VL_MemToLatch
+
+#define MS_Quit Quit
+
+
+#define LatchDrawChar(x,y,p) VL_LatchToScreen(latchpics[0]+(p)*16,2,8,x,y)
+#define LatchDrawTile(x,y,p) VL_LatchToScreen(latchpics[1]+(p)*64,4,16,x,y)
+
+void LatchDrawPic (unsigned x, unsigned y, unsigned picnum);
+void LoadLatchMem (void);
+boolean FizzleFade (unsigned source, unsigned dest,
+ unsigned width,unsigned height, unsigned frames,boolean abortable);
+
+
+#define NUMLATCHPICS 100
+extern unsigned latchpics[NUMLATCHPICS];
+extern unsigned freelatch;
+
--- /dev/null
+++ b/vl.asm
@@ -1,0 +1,742 @@
+; ID_VL.ASM
+
+ IDEAL
+ MODEL MEDIUM,C
+
+ INCLUDE 'ID_VL.EQU'
+
+SCREENSEG = 0a000h
+
+ DATASEG
+
+ EXTRN TimeCount:WORD ; incremented every 70th of a second
+ EXTRN linewidth:WORD
+
+starttime dw ?
+
+ CODESEG
+
+;===========================================================================
+
+
+;==============
+;
+; VL_WaitVBL ******** NEW *********
+;
+; Wait for the vertical retrace (returns before the actual vertical sync)
+;
+;==============
+
+PROC VL_WaitVBL num:WORD
+PUBLIC VL_WaitVBL
+@@wait:
+
+ mov dx,STATUS_REGISTER_1
+
+ mov cx,[num]
+;
+; wait for a display signal to make sure the raster isn't in the middle
+; of a sync
+;
+@@waitnosync:
+ in al,dx
+ test al,8
+ jnz @@waitnosync
+
+
+@@waitsync:
+ in al,dx
+ test al,8
+ jz @@waitsync
+
+ loop @@waitnosync
+
+ ret
+
+ENDP
+
+
+;===========================================================================
+
+;==============
+;
+; VL_SetCRTC
+;
+;==============
+
+PROC VL_SetCRTC crtc:WORD
+PUBLIC VL_SetCRTC
+
+;
+; wait for a display signal to make sure the raster isn't in the middle
+; of a sync
+;
+ cli
+
+ mov dx,STATUS_REGISTER_1
+
+@@waitdisplay:
+ in al,dx
+ test al,1 ;1 = display is disabled (HBL / VBL)
+ jnz @@waitdisplay
+
+
+;
+; set CRTC start
+;
+; for some reason, my XT's EGA card doesn't like word outs to the CRTC
+; index...
+;
+ mov cx,[crtc]
+ mov dx,CRTC_INDEX
+ mov al,0ch ;start address high register
+ out dx,al
+ inc dx
+ mov al,ch
+ out dx,al
+ dec dx
+ mov al,0dh ;start address low register
+ out dx,al
+ mov al,cl
+ inc dx
+ out dx,al
+
+
+ sti
+
+ ret
+
+ENDP
+
+
+
+;===========================================================================
+
+;==============
+;
+; VL_SetScreen
+;
+;==============
+
+PROC VL_SetScreen crtc:WORD, pel:WORD
+PUBLIC VL_SetScreen
+
+
+ mov cx,[timecount] ; if timecount goes up by two, the retrace
+ add cx,2 ; period was missed (an interrupt covered it)
+
+ mov dx,STATUS_REGISTER_1
+
+;
+; wait for a display signal to make sure the raster isn't in the middle
+; of a sync
+;
+@@waitdisplay:
+ in al,dx
+ test al,1 ;1 = display is disabled (HBL / VBL)
+ jnz @@waitdisplay
+
+
+@@loop:
+ sti
+ jmp $+2
+ cli
+
+ cmp [timecount],cx ; will only happen if an interrupt is
+ jae @@setcrtc ; straddling the entire retrace period
+
+;
+; when several succesive display not enableds occur,
+; the bottom of the screen has been hit
+;
+
+ in al,dx
+ test al,8
+ jnz @@waitdisplay
+ test al,1
+ jz @@loop
+
+ in al,dx
+ test al,8
+ jnz @@waitdisplay
+ test al,1
+ jz @@loop
+
+ in al,dx
+ test al,8
+ jnz @@waitdisplay
+ test al,1
+ jz @@loop
+
+ in al,dx
+ test al,8
+ jnz @@waitdisplay
+ test al,1
+ jz @@loop
+
+ in al,dx
+ test al,8
+ jnz @@waitdisplay
+ test al,1
+ jz @@loop
+
+
+@@setcrtc:
+
+
+;
+; set CRTC start
+;
+; for some reason, my XT's EGA card doesn't like word outs to the CRTC
+; index...
+;
+ mov cx,[crtc]
+ mov dx,CRTC_INDEX
+ mov al,0ch ;start address high register
+ out dx,al
+ inc dx
+ mov al,ch
+ out dx,al
+ dec dx
+ mov al,0dh ;start address low register
+ out dx,al
+ mov al,cl
+ inc dx
+ out dx,al
+
+;
+; set horizontal panning
+;
+ mov dx,ATR_INDEX
+ mov al,ATR_PELPAN or 20h
+ out dx,al
+ jmp $+2
+ mov al,[BYTE pel] ;pel pan value
+ out dx,al
+
+ sti
+
+ ret
+
+ENDP
+
+
+;===========================================================================
+
+
+;============================================================================
+;
+; VL_ScreenToScreen
+;
+; Basic block copy routine. Copies one block of screen memory to another,
+; using write mode 1 (sets it and returns with write mode 0). bufferofs is
+; NOT accounted for.
+;
+;============================================================================
+
+PROC VL_ScreenToScreen source:WORD, dest:WORD, wide:WORD, height:WORD
+PUBLIC VL_ScreenToScreen
+USES SI,DI
+
+ pushf
+ cli
+
+ mov dx,SC_INDEX
+ mov ax,SC_MAPMASK+15*256
+ out dx,ax
+ mov dx,GC_INDEX
+ mov al,GC_MODE
+ out dx,al
+ inc dx
+ in al,dx
+ and al,NOT 3
+ or al,1
+ out dx,al
+
+ popf
+
+ mov bx,[linewidth]
+ sub bx,[wide]
+
+ mov ax,SCREENSEG
+ mov es,ax
+ mov ds,ax
+
+ mov si,[source]
+ mov di,[dest] ;start at same place in all planes
+ mov dx,[height] ;scan lines to draw
+ mov ax,[wide]
+
+@@lineloop:
+ mov cx,ax
+ rep movsb
+ add si,bx
+ add di,bx
+
+ dec dx
+ jnz @@lineloop
+
+ mov dx,GC_INDEX+1
+ in al,dx
+ and al,NOT 3
+ out dx,al
+
+ mov ax,ss
+ mov ds,ax ;restore turbo's data segment
+
+ ret
+
+ENDP
+
+
+;===========================================================================
+
+
+ MASM
+;���������������������������������������������������������
+;
+; Name: VL_VideoID
+;
+; Function: Detects the presence of various video subsystems
+;
+; int VideoID;
+;
+; Subsystem ID values:
+; 0 = (none)
+; 1 = MDA
+; 2 = CGA
+; 3 = EGA
+; 4 = MCGA
+; 5 = VGA
+; 80h = HGC
+; 81h = HGC+
+; 82h = Hercules InColor
+;
+;���������������������������������������������������������
+
+;���������������������������������������������������������
+;
+; Equates
+;
+;���������������������������������������������������������
+VIDstruct STRUC ; corresponds to C data structure
+
+Video0Type DB ? ; first subsystem type
+Display0Type DB ? ; display attached to first subsystem
+
+Video1Type DB ? ; second subsystem type
+Display1Type DB ? ; display attached to second subsystem
+
+VIDstruct ENDS
+
+
+Device0 EQU word ptr Video0Type[di]
+Device1 EQU word ptr Video1Type[di]
+
+
+MDA EQU 1 ; subsystem types
+CGA EQU 2
+EGA EQU 3
+MCGA EQU 4
+VGA EQU 5
+HGC EQU 80h
+HGCPlus EQU 81h
+InColor EQU 82h
+
+MDADisplay EQU 1 ; display types
+CGADisplay EQU 2
+EGAColorDisplay EQU 3
+PS2MonoDisplay EQU 4
+PS2ColorDisplay EQU 5
+
+TRUE EQU 1
+FALSE EQU 0
+
+;���������������������������������������������������������
+;
+; Program
+;
+;���������������������������������������������������������
+
+Results VIDstruct <> ;results go here!
+
+EGADisplays DB CGADisplay ; 0000b, 0001b (EGA switch values)
+ DB EGAColorDisplay ; 0010b, 0011b
+ DB MDADisplay ; 0100b, 0101b
+ DB CGADisplay ; 0110b, 0111b
+ DB EGAColorDisplay ; 1000b, 1001b
+ DB MDADisplay ; 1010b, 1011b
+
+DCCtable DB 0,0 ; translate table for INT 10h func 1Ah
+ DB MDA,MDADisplay
+ DB CGA,CGADisplay
+ DB 0,0
+ DB EGA,EGAColorDisplay
+ DB EGA,MDADisplay
+ DB 0,0
+ DB VGA,PS2MonoDisplay
+ DB VGA,PS2ColorDisplay
+ DB 0,0
+ DB MCGA,EGAColorDisplay
+ DB MCGA,PS2MonoDisplay
+ DB MCGA,PS2ColorDisplay
+
+TestSequence DB TRUE ; this list of flags and addresses
+ DW FindPS2 ; determines the order in which this
+ ; program looks for the various
+EGAflag DB ? ; subsystems
+ DW FindEGA
+
+CGAflag DB ?
+ DW FindCGA
+
+Monoflag DB ?
+ DW FindMono
+
+NumberOfTests EQU ($-TestSequence)/3
+
+
+PUBLIC VL_VideoID
+VL_VideoID PROC
+
+ push bp ; preserve caller registers
+ mov bp,sp
+ push ds
+ push si
+ push di
+
+ push cs
+ pop ds
+ ASSUME DS:@Code
+
+; initialize the data structure that will contain the results
+
+ lea di,Results ; DS:DI -> start of data structure
+
+ mov Device0,0 ; zero these variables
+ mov Device1,0
+
+; look for the various subsystems using the subroutines whose addresses are
+; tabulated in TestSequence; each subroutine sets flags in TestSequence
+; to indicate whether subsequent subroutines need to be called
+
+ mov byte ptr CGAflag,TRUE
+ mov byte ptr EGAflag,TRUE
+ mov byte ptr Monoflag,TRUE
+
+ mov cx,NumberOfTests
+ mov si,offset TestSequence
+
+@@L01: lodsb ; AL := flag
+ test al,al
+ lodsw ; AX := subroutine address
+ jz @@L02 ; skip subroutine if flag is false
+
+ push si
+ push cx
+ call ax ; call subroutine to detect subsystem
+ pop cx
+ pop si
+
+@@L02: loop @@L01
+
+; determine which subsystem is active
+
+ call FindActive
+
+ mov al,Results.Video0Type
+ mov ah,0 ; was: Results.Display0Type
+
+ pop di ; restore caller registers and return
+ pop si
+ pop ds
+ mov sp,bp
+ pop bp
+ ret
+
+VL_VideoID ENDP
+
+
+;
+; FindPS2
+;
+; This subroutine uses INT 10H function 1Ah to determine the video BIOS
+; Display Combination Code (DCC) for each video subsystem present.
+;
+
+FindPS2 PROC near
+
+ mov ax,1A00h
+ int 10h ; call video BIOS for info
+
+ cmp al,1Ah
+ jne @@L13 ; exit if function not supported (i.e.,
+ ; no MCGA or VGA in system)
+
+; convert BIOS DCCs into specific subsystems & displays
+
+ mov cx,bx
+ xor bh,bh ; BX := DCC for active subsystem
+
+ or ch,ch
+ jz @@L11 ; jump if only one subsystem present
+
+ mov bl,ch ; BX := inactive DCC
+ add bx,bx
+ mov ax,[bx+offset DCCtable]
+
+ mov Device1,ax
+
+ mov bl,cl
+ xor bh,bh ; BX := active DCC
+
+@@L11: add bx,bx
+ mov ax,[bx+offset DCCtable]
+
+ mov Device0,ax
+
+; reset flags for subsystems that have been ruled out
+
+ mov byte ptr CGAflag,FALSE
+ mov byte ptr EGAflag,FALSE
+ mov byte ptr Monoflag,FALSE
+
+ lea bx,Video0Type[di] ; if the BIOS reported an MDA ...
+ cmp byte ptr [bx],MDA
+ je @@L12
+
+ lea bx,Video1Type[di]
+ cmp byte ptr [bx],MDA
+ jne @@L13
+
+@@L12: mov word ptr [bx],0 ; ... Hercules can't be ruled out
+ mov byte ptr Monoflag,TRUE
+
+@@L13: ret
+
+FindPS2 ENDP
+
+
+;
+; FindEGA
+;
+; Look for an EGA. This is done by making a call to an EGA BIOS function
+; which doesn't exist in the default (MDA, CGA) BIOS.
+
+FindEGA PROC near ; Caller: AH = flags
+ ; Returns: AH = flags
+ ; Video0Type and
+ ; Display0Type updated
+
+ mov bl,10h ; BL := 10h (return EGA info)
+ mov ah,12h ; AH := INT 10H function number
+ int 10h ; call EGA BIOS for info
+ ; if EGA BIOS is present,
+ ; BL <> 10H
+ ; CL = switch setting
+ cmp bl,10h
+ je @@L22 ; jump if EGA BIOS not present
+
+ mov al,cl
+ shr al,1 ; AL := switches/2
+ mov bx,offset EGADisplays
+ xlat ; determine display type from switches
+ mov ah,al ; AH := display type
+ mov al,EGA ; AL := subystem type
+ call FoundDevice
+
+ cmp ah,MDADisplay
+ je @@L21 ; jump if EGA has a monochrome display
+
+ mov CGAflag,FALSE ; no CGA if EGA has color display
+ jmp short @@L22
+
+@@L21: mov Monoflag,FALSE ; EGA has a mono display, so MDA and
+ ; Hercules are ruled out
+@@L22: ret
+
+FindEGA ENDP
+
+;
+; FindCGA
+;
+; This is done by looking for the CGA's 6845 CRTC at I/O port 3D4H.
+;
+FindCGA PROC near ; Returns: VIDstruct updated
+
+ mov dx,3D4h ; DX := CRTC address port
+ call Find6845
+ jc @@L31 ; jump if not present
+
+ mov al,CGA
+ mov ah,CGADisplay
+ call FoundDevice
+
+@@L31: ret
+
+FindCGA ENDP
+
+;
+; FindMono
+;
+; This is done by looking for the MDA's 6845 CRTC at I/O port 3B4H. If
+; a 6845 is found, the subroutine distinguishes between an MDA
+; and a Hercules adapter by monitoring bit 7 of the CRT Status byte.
+; This bit changes on Hercules adapters but does not change on an MDA.
+;
+; The various Hercules adapters are identified by bits 4 through 6 of
+; the CRT Status value:
+;
+; 000b = HGC
+; 001b = HGC+
+; 101b = InColor card
+;
+
+FindMono PROC near ; Returns: VIDstruct updated
+
+ mov dx,3B4h ; DX := CRTC address port
+ call Find6845
+ jc @@L44 ; jump if not present
+
+ mov dl,0BAh ; DX := 3BAh (status port)
+ in al,dx
+ and al,80h
+ mov ah,al ; AH := bit 7 (vertical sync on HGC)
+
+ mov cx,8000h ; do this 32768 times
+@@L41: in al,dx
+ and al,80h ; isolate bit 7
+ cmp ah,al
+ loope @@L41 ; wait for bit 7 to change
+ jne @@L42 ; if bit 7 changed, it's a Hercules
+
+ mov al,MDA ; if bit 7 didn't change, it's an MDA
+ mov ah,MDADisplay
+ call FoundDevice
+ jmp short @@L44
+
+@@L42: in al,dx
+ mov dl,al ; DL := value from status port
+ and dl,01110000b ; mask bits 4 thru 6
+
+ mov ah,MDADisplay ; assume it's a monochrome display
+
+ mov al,HGCPlus ; look for an HGC+
+ cmp dl,00010000b
+ je @@L43 ; jump if it's an HGC+
+
+ mov al,HGC ; look for an InColor card or HGC
+ cmp dl,01010000b
+ jne @@L43 ; jump if it's not an InColor card
+
+ mov al,InColor ; it's an InColor card
+ mov ah,EGAColorDisplay
+
+@@L43: call FoundDevice
+
+@@L44: ret
+
+FindMono ENDP
+
+;
+; Find6845
+;
+; This routine detects the presence of the CRTC on a MDA, CGA or HGC.
+; The technique is to write and read register 0Fh of the chip (cursor
+; low). If the same value is read as written, assume the chip is
+; present at the specified port addr.
+;
+
+Find6845 PROC near ; Caller: DX = port addr
+ ; Returns: cf set if not present
+ mov al,0Fh
+ out dx,al ; select 6845 reg 0Fh (Cursor Low)
+ inc dx
+ in al,dx ; AL := current Cursor Low value
+ mov ah,al ; preserve in AH
+ mov al,66h ; AL := arbitrary value
+ out dx,al ; try to write to 6845
+
+ mov cx,100h
+@@L51: loop @@L51 ; wait for 6845 to respond
+
+ in al,dx
+ xchg ah,al ; AH := returned value
+ ; AL := original value
+ out dx,al ; restore original value
+
+ cmp ah,66h ; test whether 6845 responded
+ je @@L52 ; jump if it did (cf is reset)
+
+ stc ; set carry flag if no 6845 present
+
+@@L52: ret
+
+Find6845 ENDP
+
+
+;
+; FindActive
+;
+; This subroutine stores the currently active device as Device0. The
+; current video mode determines which subsystem is active.
+;
+
+FindActive PROC near
+
+ cmp word ptr Device1,0
+ je @@L63 ; exit if only one subsystem
+
+ cmp Video0Type[di],4 ; exit if MCGA or VGA present
+ jge @@L63 ; (INT 10H function 1AH
+ cmp Video1Type[di],4 ; already did the work)
+ jge @@L63
+
+ mov ah,0Fh
+ int 10h ; AL := current BIOS video mode
+
+ and al,7
+ cmp al,7 ; jump if monochrome
+ je @@L61 ; (mode 7 or 0Fh)
+
+ cmp Display0Type[di],MDADisplay
+ jne @@L63 ; exit if Display0 is color
+ jmp short @@L62
+
+@@L61: cmp Display0Type[di],MDADisplay
+ je @@L63 ; exit if Display0 is monochrome
+
+@@L62: mov ax,Device0 ; make Device0 currently active
+ xchg ax,Device1
+ mov Device0,ax
+
+@@L63: ret
+
+FindActive ENDP
+
+
+;
+; FoundDevice
+;
+; This routine updates the list of subsystems.
+;
+
+FoundDevice PROC near ; Caller: AH = display #
+ ; AL = subsystem #
+ ; Destroys: BX
+ lea bx,Video0Type[di]
+ cmp byte ptr [bx],0
+ je @@L71 ; jump if 1st subsystem
+
+ lea bx,Video1Type[di] ; must be 2nd subsystem
+
+@@L71: mov [bx],ax ; update list entry
+ ret
+
+FoundDevice ENDP
+
+IDEAL
+
+
+
+END
--- /dev/null
+++ b/vl.c
@@ -1,0 +1,1084 @@
+// ID_VL.C
+
+#include <dos.h>
+#include <alloc.h>
+#include <mem.h>
+#include <string.h>
+#include "ID_HEAD.H"
+#include "ID_VL.H"
+#pragma hdrstop
+
+//
+// SC_INDEX is expected to stay at SC_MAPMASK for proper operation
+//
+
+unsigned bufferofs;
+unsigned displayofs,pelpan;
+
+unsigned screenseg=SCREENSEG; // set to 0xa000 for asm convenience
+
+unsigned linewidth;
+unsigned ylookup[MAXSCANLINES];
+
+boolean screenfaded;
+unsigned bordercolor;
+
+boolean fastpalette; // if true, use outsb to set
+
+byte far palette1[256][3],far palette2[256][3];
+
+//===========================================================================
+
+// asm
+
+int VL_VideoID (void);
+void VL_SetCRTC (int crtc);
+void VL_SetScreen (int crtc, int pelpan);
+void VL_WaitVBL (int vbls);
+
+//===========================================================================
+
+
+/*
+=======================
+=
+= VL_Startup
+=
+=======================
+*/
+
+#if 0
+void VL_Startup (void)
+{
+ if ( !MS_CheckParm ("HIDDENCARD") && VL_VideoID () != 5)
+ MS_Quit ("You need a VGA graphics card to run this!");
+
+ asm cld; // all string instructions assume forward
+}
+
+#endif
+
+/*
+=======================
+=
+= VL_Startup // WOLFENSTEIN HACK
+=
+=======================
+*/
+
+static char *ParmStrings[] = {"HIDDENCARD",""};
+
+void VL_Startup (void)
+{
+ int i,videocard;
+
+ asm cld;
+
+ videocard = VL_VideoID ();
+ for (i = 1;i < _argc;i++)
+ if (US_CheckParm(_argv[i],ParmStrings) == 0)
+ {
+ videocard = 5;
+ break;
+ }
+
+ if (videocard != 5)
+Quit ("Improper video card! If you really have a VGA card that I am not \n"
+ "detecting, use the -HIDDENCARD command line parameter!");
+
+}
+
+
+
+/*
+=======================
+=
+= VL_Shutdown
+=
+=======================
+*/
+
+void VL_Shutdown (void)
+{
+ VL_SetTextMode ();
+}
+
+
+/*
+=======================
+=
+= VL_SetVGAPlaneMode
+=
+=======================
+*/
+
+void VL_SetVGAPlaneMode (void)
+{
+asm mov ax,0x13
+asm int 0x10
+ VL_DePlaneVGA ();
+ VGAMAPMASK(15);
+ VL_SetLineWidth (40);
+}
+
+
+/*
+=======================
+=
+= VL_SetTextMode
+=
+=======================
+*/
+
+void VL_SetTextMode (void)
+{
+asm mov ax,3
+asm int 0x10
+}
+
+//===========================================================================
+
+/*
+=================
+=
+= VL_ClearVideo
+=
+= Fill the entire video buffer with a given color
+=
+=================
+*/
+
+void VL_ClearVideo (byte color)
+{
+asm mov dx,GC_INDEX
+asm mov al,GC_MODE
+asm out dx,al
+asm inc dx
+asm in al,dx
+asm and al,0xfc // write mode 0 to store directly to video
+asm out dx,al
+
+asm mov dx,SC_INDEX
+asm mov ax,SC_MAPMASK+15*256
+asm out dx,ax // write through all four planes
+
+asm mov ax,SCREENSEG
+asm mov es,ax
+asm mov al,[color]
+asm mov ah,al
+asm mov cx,0x8000 // 0x8000 words, clearing 8 video bytes/word
+asm xor di,di
+asm rep stosw
+}
+
+
+/*
+=============================================================================
+
+ VGA REGISTER MANAGEMENT ROUTINES
+
+=============================================================================
+*/
+
+
+/*
+=================
+=
+= VL_DePlaneVGA
+=
+=================
+*/
+
+void VL_DePlaneVGA (void)
+{
+
+//
+// change CPU addressing to non linear mode
+//
+
+//
+// turn off chain 4 and odd/even
+//
+ outportb (SC_INDEX,SC_MEMMODE);
+ outportb (SC_INDEX+1,(inportb(SC_INDEX+1)&~8)|4);
+
+ outportb (SC_INDEX,SC_MAPMASK); // leave this set throughought
+
+//
+// turn off odd/even and set write mode 0
+//
+ outportb (GC_INDEX,GC_MODE);
+ outportb (GC_INDEX+1,inportb(GC_INDEX+1)&~0x13);
+
+//
+// turn off chain
+//
+ outportb (GC_INDEX,GC_MISCELLANEOUS);
+ outportb (GC_INDEX+1,inportb(GC_INDEX+1)&~2);
+
+//
+// clear the entire buffer space, because int 10h only did 16 k / plane
+//
+ VL_ClearVideo (0);
+
+//
+// change CRTC scanning from doubleword to byte mode, allowing >64k scans
+//
+ outportb (CRTC_INDEX,CRTC_UNDERLINE);
+ outportb (CRTC_INDEX+1,inportb(CRTC_INDEX+1)&~0x40);
+
+ outportb (CRTC_INDEX,CRTC_MODE);
+ outportb (CRTC_INDEX+1,inportb(CRTC_INDEX+1)|0x40);
+}
+
+//===========================================================================
+
+/*
+====================
+=
+= VL_SetLineWidth
+=
+= Line witdh is in WORDS, 40 words is normal width for vgaplanegr
+=
+====================
+*/
+
+void VL_SetLineWidth (unsigned width)
+{
+ int i,offset;
+
+//
+// set wide virtual screen
+//
+ outport (CRTC_INDEX,CRTC_OFFSET+width*256);
+
+//
+// set up lookup tables
+//
+ linewidth = width*2;
+
+ offset = 0;
+
+ for (i=0;i<MAXSCANLINES;i++)
+ {
+ ylookup[i]=offset;
+ offset += linewidth;
+ }
+}
+
+/*
+====================
+=
+= VL_SetSplitScreen
+=
+====================
+*/
+
+void VL_SetSplitScreen (int linenum)
+{
+ VL_WaitVBL (1);
+ linenum=linenum*2-1;
+ outportb (CRTC_INDEX,CRTC_LINECOMPARE);
+ outportb (CRTC_INDEX+1,linenum % 256);
+ outportb (CRTC_INDEX,CRTC_OVERFLOW);
+ outportb (CRTC_INDEX+1, 1+16*(linenum/256));
+ outportb (CRTC_INDEX,CRTC_MAXSCANLINE);
+ outportb (CRTC_INDEX+1,inportb(CRTC_INDEX+1) & (255-64));
+}
+
+
+/*
+=============================================================================
+
+ PALETTE OPS
+
+ To avoid snow, do a WaitVBL BEFORE calling these
+
+=============================================================================
+*/
+
+
+/*
+=================
+=
+= VL_FillPalette
+=
+=================
+*/
+
+void VL_FillPalette (int red, int green, int blue)
+{
+ int i;
+
+ outportb (PEL_WRITE_ADR,0);
+ for (i=0;i<256;i++)
+ {
+ outportb (PEL_DATA,red);
+ outportb (PEL_DATA,green);
+ outportb (PEL_DATA,blue);
+ }
+}
+
+//===========================================================================
+
+/*
+=================
+=
+= VL_SetColor
+=
+=================
+*/
+
+void VL_SetColor (int color, int red, int green, int blue)
+{
+ outportb (PEL_WRITE_ADR,color);
+ outportb (PEL_DATA,red);
+ outportb (PEL_DATA,green);
+ outportb (PEL_DATA,blue);
+}
+
+//===========================================================================
+
+/*
+=================
+=
+= VL_GetColor
+=
+=================
+*/
+
+void VL_GetColor (int color, int *red, int *green, int *blue)
+{
+ outportb (PEL_READ_ADR,color);
+ *red = inportb (PEL_DATA);
+ *green = inportb (PEL_DATA);
+ *blue = inportb (PEL_DATA);
+}
+
+//===========================================================================
+
+/*
+=================
+=
+= VL_SetPalette
+=
+= If fast palette setting has been tested for, it is used
+= (some cards don't like outsb palette setting)
+=
+=================
+*/
+
+void VL_SetPalette (byte far *palette)
+{
+ int i;
+
+// outportb (PEL_WRITE_ADR,0);
+// for (i=0;i<768;i++)
+// outportb(PEL_DATA,*palette++);
+
+ asm mov dx,PEL_WRITE_ADR
+ asm mov al,0
+ asm out dx,al
+ asm mov dx,PEL_DATA
+ asm lds si,[palette]
+
+ asm test [ss:fastpalette],1
+ asm jz slowset
+//
+// set palette fast for cards that can take it
+//
+ asm mov cx,768
+ asm rep outsb
+ asm jmp done
+
+//
+// set palette slowly for some video cards
+//
+slowset:
+ asm mov cx,256
+setloop:
+ asm lodsb
+ asm out dx,al
+ asm lodsb
+ asm out dx,al
+ asm lodsb
+ asm out dx,al
+ asm loop setloop
+
+done:
+ asm mov ax,ss
+ asm mov ds,ax
+
+}
+
+
+//===========================================================================
+
+/*
+=================
+=
+= VL_GetPalette
+=
+= This does not use the port string instructions,
+= due to some incompatabilities
+=
+=================
+*/
+
+void VL_GetPalette (byte far *palette)
+{
+ int i;
+
+ outportb (PEL_READ_ADR,0);
+ for (i=0;i<768;i++)
+ *palette++ = inportb(PEL_DATA);
+}
+
+
+//===========================================================================
+
+/*
+=================
+=
+= VL_FadeOut
+=
+= Fades the current palette to the given color in the given number of steps
+=
+=================
+*/
+
+void VL_FadeOut (int start, int end, int red, int green, int blue, int steps)
+{
+ int i,j,orig,delta;
+ byte far *origptr, far *newptr;
+
+ VL_WaitVBL(1);
+ VL_GetPalette (&palette1[0][0]);
+ _fmemcpy (palette2,palette1,768);
+
+//
+// fade through intermediate frames
+//
+ for (i=0;i<steps;i++)
+ {
+ origptr = &palette1[start][0];
+ newptr = &palette2[start][0];
+ for (j=start;j<=end;j++)
+ {
+ orig = *origptr++;
+ delta = red-orig;
+ *newptr++ = orig + delta * i / steps;
+ orig = *origptr++;
+ delta = green-orig;
+ *newptr++ = orig + delta * i / steps;
+ orig = *origptr++;
+ delta = blue-orig;
+ *newptr++ = orig + delta * i / steps;
+ }
+
+ VL_WaitVBL(1);
+ VL_SetPalette (&palette2[0][0]);
+ }
+
+//
+// final color
+//
+ VL_FillPalette (red,green,blue);
+
+ screenfaded = true;
+}
+
+
+/*
+=================
+=
+= VL_FadeIn
+=
+=================
+*/
+
+void VL_FadeIn (int start, int end, byte far *palette, int steps)
+{
+ int i,j,delta;
+
+ VL_WaitVBL(1);
+ VL_GetPalette (&palette1[0][0]);
+ _fmemcpy (&palette2[0][0],&palette1[0][0],sizeof(palette1));
+
+ start *= 3;
+ end = end*3+2;
+
+//
+// fade through intermediate frames
+//
+ for (i=0;i<steps;i++)
+ {
+ for (j=start;j<=end;j++)
+ {
+ delta = palette[j]-palette1[0][j];
+ palette2[0][j] = palette1[0][j] + delta * i / steps;
+ }
+
+ VL_WaitVBL(1);
+ VL_SetPalette (&palette2[0][0]);
+ }
+
+//
+// final color
+//
+ VL_SetPalette (palette);
+ screenfaded = false;
+}
+
+
+
+/*
+=================
+=
+= VL_TestPaletteSet
+=
+= Sets the palette with outsb, then reads it in and compares
+= If it compares ok, fastpalette is set to true.
+=
+=================
+*/
+
+void VL_TestPaletteSet (void)
+{
+ int i;
+
+ for (i=0;i<768;i++)
+ palette1[0][i] = i;
+
+ fastpalette = true;
+ VL_SetPalette (&palette1[0][0]);
+ VL_GetPalette (&palette2[0][0]);
+ if (_fmemcmp (&palette1[0][0],&palette2[0][0],768))
+ fastpalette = false;
+}
+
+
+/*
+==================
+=
+= VL_ColorBorder
+=
+==================
+*/
+
+void VL_ColorBorder (int color)
+{
+ _AH=0x10;
+ _AL=1;
+ _BH=color;
+ geninterrupt (0x10);
+ bordercolor = color;
+}
+
+
+
+/*
+=============================================================================
+
+ PIXEL OPS
+
+=============================================================================
+*/
+
+byte pixmasks[4] = {1,2,4,8};
+byte leftmasks[4] = {15,14,12,8};
+byte rightmasks[4] = {1,3,7,15};
+
+
+/*
+=================
+=
+= VL_Plot
+=
+=================
+*/
+
+void VL_Plot (int x, int y, int color)
+{
+ byte mask;
+
+ mask = pixmasks[x&3];
+ VGAMAPMASK(mask);
+ *(byte far *)MK_FP(SCREENSEG,bufferofs+(ylookup[y]+(x>>2))) = color;
+ VGAMAPMASK(15);
+}
+
+
+/*
+=================
+=
+= VL_Hlin
+=
+=================
+*/
+
+void VL_Hlin (unsigned x, unsigned y, unsigned width, unsigned color)
+{
+ unsigned xbyte;
+ byte far *dest;
+ byte leftmask,rightmask;
+ int midbytes;
+
+ xbyte = x>>2;
+ leftmask = leftmasks[x&3];
+ rightmask = rightmasks[(x+width-1)&3];
+ midbytes = ((x+width+3)>>2) - xbyte - 2;
+
+ dest = MK_FP(SCREENSEG,bufferofs+ylookup[y]+xbyte);
+
+ if (midbytes<0)
+ {
+ // all in one byte
+ VGAMAPMASK(leftmask&rightmask);
+ *dest = color;
+ VGAMAPMASK(15);
+ return;
+ }
+
+ VGAMAPMASK(leftmask);
+ *dest++ = color;
+
+ VGAMAPMASK(15);
+ _fmemset (dest,color,midbytes);
+ dest+=midbytes;
+
+ VGAMAPMASK(rightmask);
+ *dest = color;
+
+ VGAMAPMASK(15);
+}
+
+
+/*
+=================
+=
+= VL_Vlin
+=
+=================
+*/
+
+void VL_Vlin (int x, int y, int height, int color)
+{
+ byte far *dest,mask;
+
+ mask = pixmasks[x&3];
+ VGAMAPMASK(mask);
+
+ dest = MK_FP(SCREENSEG,bufferofs+ylookup[y]+(x>>2));
+
+ while (height--)
+ {
+ *dest = color;
+ dest += linewidth;
+ }
+
+ VGAMAPMASK(15);
+}
+
+
+/*
+=================
+=
+= VL_Bar
+=
+=================
+*/
+
+void VL_Bar (int x, int y, int width, int height, int color)
+{
+ byte far *dest;
+ byte leftmask,rightmask;
+ int midbytes,linedelta;
+
+ leftmask = leftmasks[x&3];
+ rightmask = rightmasks[(x+width-1)&3];
+ midbytes = ((x+width+3)>>2) - (x>>2) - 2;
+ linedelta = linewidth-(midbytes+1);
+
+ dest = MK_FP(SCREENSEG,bufferofs+ylookup[y]+(x>>2));
+
+ if (midbytes<0)
+ {
+ // all in one byte
+ VGAMAPMASK(leftmask&rightmask);
+ while (height--)
+ {
+ *dest = color;
+ dest += linewidth;
+ }
+ VGAMAPMASK(15);
+ return;
+ }
+
+ while (height--)
+ {
+ VGAMAPMASK(leftmask);
+ *dest++ = color;
+
+ VGAMAPMASK(15);
+ _fmemset (dest,color,midbytes);
+ dest+=midbytes;
+
+ VGAMAPMASK(rightmask);
+ *dest = color;
+
+ dest+=linedelta;
+ }
+
+ VGAMAPMASK(15);
+}
+
+/*
+============================================================================
+
+ MEMORY OPS
+
+============================================================================
+*/
+
+/*
+=================
+=
+= VL_MemToLatch
+=
+=================
+*/
+
+void VL_MemToLatch (byte far *source, int width, int height, unsigned dest)
+{
+ unsigned count;
+ byte plane,mask;
+
+ count = ((width+3)/4)*height;
+ mask = 1;
+ for (plane = 0; plane<4 ; plane++)
+ {
+ VGAMAPMASK(mask);
+ mask <<= 1;
+
+asm mov cx,count
+asm mov ax,SCREENSEG
+asm mov es,ax
+asm mov di,[dest]
+asm lds si,[source]
+asm rep movsb
+asm mov ax,ss
+asm mov ds,ax
+
+ source+= count;
+ }
+}
+
+
+//===========================================================================
+
+
+/*
+=================
+=
+= VL_MemToScreen
+=
+= Draws a block of data to the screen.
+=
+=================
+*/
+
+void VL_MemToScreen (byte far *source, int width, int height, int x, int y)
+{
+ byte far *screen,far *dest,mask;
+ int plane;
+
+ width>>=2;
+ dest = MK_FP(SCREENSEG,bufferofs+ylookup[y]+(x>>2) );
+ mask = 1 << (x&3);
+
+ for (plane = 0; plane<4; plane++)
+ {
+ VGAMAPMASK(mask);
+ mask <<= 1;
+ if (mask == 16)
+ mask = 1;
+
+ screen = dest;
+ for (y=0;y<height;y++,screen+=linewidth,source+=width)
+ _fmemcpy (screen,source,width);
+ }
+}
+
+//==========================================================================
+
+
+/*
+=================
+=
+= VL_MaskedToScreen
+=
+= Masks a block of main memory to the screen.
+=
+=================
+*/
+
+void VL_MaskedToScreen (byte far *source, int width, int height, int x, int y)
+{
+ byte far *screen,far *dest,mask;
+ byte far *maskptr;
+ int plane;
+
+ width>>=2;
+ dest = MK_FP(SCREENSEG,bufferofs+ylookup[y]+(x>>2) );
+// mask = 1 << (x&3);
+
+// maskptr = source;
+
+ for (plane = 0; plane<4; plane++)
+ {
+ VGAMAPMASK(mask);
+ mask <<= 1;
+ if (mask == 16)
+ mask = 1;
+
+ screen = dest;
+ for (y=0;y<height;y++,screen+=linewidth,source+=width)
+ _fmemcpy (screen,source,width);
+ }
+}
+
+//==========================================================================
+
+/*
+=================
+=
+= VL_LatchToScreen
+=
+=================
+*/
+
+void VL_LatchToScreen (unsigned source, int width, int height, int x, int y)
+{
+ VGAWRITEMODE(1);
+ VGAMAPMASK(15);
+
+asm mov di,[y] // dest = bufferofs+ylookup[y]+(x>>2)
+asm shl di,1
+asm mov di,[WORD PTR ylookup+di]
+asm add di,[bufferofs]
+asm mov ax,[x]
+asm shr ax,2
+asm add di,ax
+
+asm mov si,[source]
+asm mov ax,[width]
+asm mov bx,[linewidth]
+asm sub bx,ax
+asm mov dx,[height]
+asm mov cx,SCREENSEG
+asm mov ds,cx
+asm mov es,cx
+
+drawline:
+asm mov cx,ax
+asm rep movsb
+asm add di,bx
+asm dec dx
+asm jnz drawline
+
+asm mov ax,ss
+asm mov ds,ax
+
+ VGAWRITEMODE(0);
+}
+
+
+//===========================================================================
+
+#if 0
+
+/*
+=================
+=
+= VL_ScreenToScreen
+=
+=================
+*/
+
+void VL_ScreenToScreen (unsigned source, unsigned dest,int width, int height)
+{
+ VGAWRITEMODE(1);
+ VGAMAPMASK(15);
+
+asm mov si,[source]
+asm mov di,[dest]
+asm mov ax,[width]
+asm mov bx,[linewidth]
+asm sub bx,ax
+asm mov dx,[height]
+asm mov cx,SCREENSEG
+asm mov ds,cx
+asm mov es,cx
+
+drawline:
+asm mov cx,ax
+asm rep movsb
+asm add si,bx
+asm add di,bx
+asm dec dx
+asm jnz drawline
+
+asm mov ax,ss
+asm mov ds,ax
+
+ VGAWRITEMODE(0);
+}
+
+
+#endif
+
+/*
+=============================================================================
+
+ STRING OUTPUT ROUTINES
+
+=============================================================================
+*/
+
+
+
+
+/*
+===================
+=
+= VL_DrawTile8String
+=
+===================
+*/
+
+void VL_DrawTile8String (char *str, char far *tile8ptr, int printx, int printy)
+{
+ int i;
+ unsigned far *dest,far *screen,far *src;
+
+ dest = MK_FP(SCREENSEG,bufferofs+ylookup[printy]+(printx>>2));
+
+ while (*str)
+ {
+ src = (unsigned far *)(tile8ptr + (*str<<6));
+ // each character is 64 bytes
+
+ VGAMAPMASK(1);
+ screen = dest;
+ for (i=0;i<8;i++,screen+=linewidth)
+ *screen = *src++;
+ VGAMAPMASK(2);
+ screen = dest;
+ for (i=0;i<8;i++,screen+=linewidth)
+ *screen = *src++;
+ VGAMAPMASK(4);
+ screen = dest;
+ for (i=0;i<8;i++,screen+=linewidth)
+ *screen = *src++;
+ VGAMAPMASK(8);
+ screen = dest;
+ for (i=0;i<8;i++,screen+=linewidth)
+ *screen = *src++;
+
+ str++;
+ printx += 8;
+ dest+=2;
+ }
+}
+
+
+
+/*
+===================
+=
+= VL_DrawLatch8String
+=
+===================
+*/
+
+void VL_DrawLatch8String (char *str, unsigned tile8ptr, int printx, int printy)
+{
+ int i;
+ unsigned src,dest;
+
+ dest = bufferofs+ylookup[printy]+(printx>>2);
+
+ VGAWRITEMODE(1);
+ VGAMAPMASK(15);
+
+ while (*str)
+ {
+ src = tile8ptr + (*str<<4); // each character is 16 latch bytes
+
+asm mov si,[src]
+asm mov di,[dest]
+asm mov dx,[linewidth]
+
+asm mov ax,SCREENSEG
+asm mov ds,ax
+
+asm lodsw
+asm mov [di],ax
+asm add di,dx
+asm lodsw
+asm mov [di],ax
+asm add di,dx
+asm lodsw
+asm mov [di],ax
+asm add di,dx
+asm lodsw
+asm mov [di],ax
+asm add di,dx
+asm lodsw
+asm mov [di],ax
+asm add di,dx
+asm lodsw
+asm mov [di],ax
+asm add di,dx
+asm lodsw
+asm mov [di],ax
+asm add di,dx
+asm lodsw
+asm mov [di],ax
+asm add di,dx
+
+asm mov ax,ss
+asm mov ds,ax
+
+ str++;
+ printx += 8;
+ dest+=2;
+ }
+
+ VGAWRITEMODE(0);
+}
+
+
+/*
+===================
+=
+= VL_SizeTile8String
+=
+===================
+*/
+
+void VL_SizeTile8String (char *str, int *width, int *height)
+{
+ *height = 8;
+ *width = 8*strlen(str);
+}
+
+
+
+
+
+
+
+
+
--- /dev/null
+++ b/vl.equ
@@ -1,0 +1,58 @@
+; ID_VL.EQU
+
+SC_INDEX = 03C4h
+SC_RESET = 0
+SC_CLOCK = 1
+SC_MAPMASK = 2
+SC_CHARMAP = 3
+SC_MEMMODE = 4
+
+CRTC_INDEX = 03D4h
+CRTC_H_TOTAL = 0
+CRTC_H_DISPEND = 1
+CRTC_H_BLANK = 2
+CRTC_H_ENDBLANK = 3
+CRTC_H_RETRACE = 4
+CRTC_H_ENDRETRACE = 5
+CRTC_V_TOTAL = 6
+CRTC_OVERFLOW = 7
+CRTC_ROWSCAN = 8
+CRTC_MAXSCANLINE = 9
+CRTC_CURSORSTART = 10
+CRTC_CURSOREND = 11
+CRTC_STARTHIGH = 12
+CRTC_STARTLOW = 13
+CRTC_CURSORHIGH = 14
+CRTC_CURSORLOW = 15
+CRTC_V_RETRACE = 16
+CRTC_V_ENDRETRACE = 17
+CRTC_V_DISPEND = 18
+CRTC_OFFSET = 19
+CRTC_UNDERLINE = 20
+CRTC_V_BLANK = 21
+CRTC_V_ENDBLANK = 22
+CRTC_MODE = 23
+CRTC_LINECOMPARE = 24
+
+
+GC_INDEX = 03CEh
+GC_SETRESET = 0
+GC_ENABLESETRESET = 1
+GC_COLORCOMPARE = 2
+GC_DATAROTATE = 3
+GC_READMAP = 4
+GC_MODE = 5
+GC_MISCELLANEOUS = 6
+GC_COLORDONTCARE = 7
+GC_BITMASK = 8
+
+ATR_INDEX = 03c0h
+ATR_MODE = 16
+ATR_OVERSCAN = 17
+ATR_COLORPLANEENABLE = 18
+ATR_PELPAN = 19
+ATR_COLORSELECT = 20
+
+STATUS_REGISTER_1 = 03dah
+
+
--- /dev/null
+++ b/vl.h
@@ -1,0 +1,161 @@
+// ID_VL.H
+
+// wolf compatability
+
+#define MS_Quit Quit
+
+void Quit (char *error);
+
+//===========================================================================
+
+
+#define SC_INDEX 0x3C4
+#define SC_RESET 0
+#define SC_CLOCK 1
+#define SC_MAPMASK 2
+#define SC_CHARMAP 3
+#define SC_MEMMODE 4
+
+#define CRTC_INDEX 0x3D4
+#define CRTC_H_TOTAL 0
+#define CRTC_H_DISPEND 1
+#define CRTC_H_BLANK 2
+#define CRTC_H_ENDBLANK 3
+#define CRTC_H_RETRACE 4
+#define CRTC_H_ENDRETRACE 5
+#define CRTC_V_TOTAL 6
+#define CRTC_OVERFLOW 7
+#define CRTC_ROWSCAN 8
+#define CRTC_MAXSCANLINE 9
+#define CRTC_CURSORSTART 10
+#define CRTC_CURSOREND 11
+#define CRTC_STARTHIGH 12
+#define CRTC_STARTLOW 13
+#define CRTC_CURSORHIGH 14
+#define CRTC_CURSORLOW 15
+#define CRTC_V_RETRACE 16
+#define CRTC_V_ENDRETRACE 17
+#define CRTC_V_DISPEND 18
+#define CRTC_OFFSET 19
+#define CRTC_UNDERLINE 20
+#define CRTC_V_BLANK 21
+#define CRTC_V_ENDBLANK 22
+#define CRTC_MODE 23
+#define CRTC_LINECOMPARE 24
+
+
+#define GC_INDEX 0x3CE
+#define GC_SETRESET 0
+#define GC_ENABLESETRESET 1
+#define GC_COLORCOMPARE 2
+#define GC_DATAROTATE 3
+#define GC_READMAP 4
+#define GC_MODE 5
+#define GC_MISCELLANEOUS 6
+#define GC_COLORDONTCARE 7
+#define GC_BITMASK 8
+
+#define ATR_INDEX 0x3c0
+#define ATR_MODE 16
+#define ATR_OVERSCAN 17
+#define ATR_COLORPLANEENABLE 18
+#define ATR_PELPAN 19
+#define ATR_COLORSELECT 20
+
+#define STATUS_REGISTER_1 0x3da
+
+#define PEL_WRITE_ADR 0x3c8
+#define PEL_READ_ADR 0x3c7
+#define PEL_DATA 0x3c9
+
+
+//===========================================================================
+
+#define SCREENSEG 0xa000
+
+#define SCREENWIDTH 80 // default screen width in bytes
+#define MAXSCANLINES 200 // size of ylookup table
+
+#define CHARWIDTH 2
+#define TILEWIDTH 4
+
+//===========================================================================
+
+extern unsigned bufferofs; // all drawing is reletive to this
+extern unsigned displayofs,pelpan; // last setscreen coordinates
+
+extern unsigned screenseg; // set to 0xa000 for asm convenience
+
+extern unsigned linewidth;
+extern unsigned ylookup[MAXSCANLINES];
+
+extern boolean screenfaded;
+extern unsigned bordercolor;
+
+//===========================================================================
+
+//
+// VGA hardware routines
+//
+
+#define VGAWRITEMODE(x) asm{\
+cli;\
+mov dx,GC_INDEX;\
+mov al,GC_MODE;\
+out dx,al;\
+inc dx;\
+in al,dx;\
+and al,252;\
+or al,x;\
+out dx,al;\
+sti;}
+
+#define VGAMAPMASK(x) asm{cli;mov dx,SC_INDEX;mov al,SC_MAPMASK;mov ah,x;out dx,ax;sti;}
+#define VGAREADMAP(x) asm{cli;mov dx,GC_INDEX;mov al,GC_READMAP;mov ah,x;out dx,ax;sti;}
+
+
+void VL_Startup (void);
+void VL_Shutdown (void);
+
+void VL_SetVGAPlane (void);
+void VL_SetTextMode (void);
+void VL_DePlaneVGA (void);
+void VL_SetVGAPlaneMode (void);
+void VL_ClearVideo (byte color);
+
+void VL_SetLineWidth (unsigned width);
+void VL_SetSplitScreen (int linenum);
+
+void VL_WaitVBL (int vbls);
+void VL_CrtcStart (int crtc);
+void VL_SetScreen (int crtc, int pelpan);
+
+void VL_FillPalette (int red, int green, int blue);
+void VL_SetColor (int color, int red, int green, int blue);
+void VL_GetColor (int color, int *red, int *green, int *blue);
+void VL_SetPalette (byte far *palette);
+void VL_GetPalette (byte far *palette);
+void VL_FadeOut (int start, int end, int red, int green, int blue, int steps);
+void VL_FadeIn (int start, int end, byte far *palette, int steps);
+void VL_ColorBorder (int color);
+
+void VL_Plot (int x, int y, int color);
+void VL_Hlin (unsigned x, unsigned y, unsigned width, unsigned color);
+void VL_Vlin (int x, int y, int height, int color);
+void VL_Bar (int x, int y, int width, int height, int color);
+
+void VL_MungePic (byte far *source, unsigned width, unsigned height);
+void VL_DrawPicBare (int x, int y, byte far *pic, int width, int height);
+void VL_MemToLatch (byte far *source, int width, int height, unsigned dest);
+void VL_ScreenToScreen (unsigned source, unsigned dest,int width, int height);
+void VL_MemToScreen (byte far *source, int width, int height, int x, int y);
+void VL_MaskedToScreen (byte far *source, int width, int height, int x, int y);
+
+void VL_DrawTile8String (char *str, char far *tile8ptr, int printx, int printy);
+void VL_DrawLatch8String (char *str, unsigned tile8ptr, int printx, int printy);
+void VL_SizeTile8String (char *str, int *width, int *height);
+void VL_DrawPropString (char *str, unsigned tile8ptr, int printx, int printy);
+void VL_SizePropString (char *str, int *width, int *height, char far *font);
+
+void VL_TestPaletteSet (void);
+
--- /dev/null
+++ b/whack_a.asm
@@ -1,0 +1,100 @@
+; WOLFHACK.ASM
+
+.386C
+IDEAL
+MODEL MEDIUM,C
+
+
+;============================================================================
+
+DATASEG
+
+EXTRN mr_rowofs:WORD
+EXTRN mr_count:WORD
+EXTRN mr_xstep:WORD
+EXTRN mr_ystep:WORD
+EXTRN mr_xfrac:WORD
+EXTRN mr_yfrac:WORD
+EXTRN mr_dest:WORD
+
+FARDATA
+
+planepics db 8192 dup(?) ; // 4k of ceiling, 4k of floor
+PUBLIC planepics
+
+
+;============================================================================
+
+CODESEG
+
+;============================
+;
+; MapRow
+;
+;
+;============================
+
+PROC MapRow
+PUBLIC MapRow
+ push esi
+ push edi
+ push ebp
+ push ds
+
+ mov bp,[mr_rowofs]
+ mov cx,[mr_count]
+ mov dx,[mr_ystep]
+ shl edx,16
+ mov dx,[mr_xstep]
+ mov si,[mr_yfrac]
+ shl esi,16
+ mov si,[mr_xfrac]
+ mov di,[mr_dest]
+ mov ax,SEG planepics
+ mov ds,ax
+ mov ax,0a000h
+ mov es,ax
+ mov ax,1111111111110b
+
+; eax color lookup
+; ebx scratch offset and pixel values
+; ecx loop counter
+; edx packed x / y step values
+; esi packed x / y fractional values
+; edi write pointer
+; ebp toprow to bottomrow delta
+; es: screenseg
+; ds: pictures
+
+; mov al,[esi]
+; mov al,[eax]
+; mov [edi],al
+
+; mov ax,[_variable+ebx+2]
+
+
+pixelloop:
+ shld ebx,esi,22 ; shift y units in
+ shld ebx,esi,7 ; shift x units in and one extra bit
+ and bx,63*65*2 ; mask off extra top bits and 0 low bit
+ add esi,edx ; position += step
+ mov al,[bx]
+ mov al,[eax]
+ mov [es:di],al ; write ceiling pixel
+ mov al,[bx+1]
+ mov al,[eax]
+ mov [es:di+bp],al ; write floor pixel
+ inc di
+ loop pixelloop
+
+ pop ds
+ pop ebp
+ pop edi
+ pop esi
+
+ retf
+
+ENDP
+
+END
+
--- /dev/null
+++ b/wlfj1ver.h
@@ -1,0 +1,9 @@
+//#define SPEAR
+#define JAPAN
+#define JAPDEMO
+#define UPLOAD
+#define ARTSEXTERN
+#define DEMOSEXTERN
+//#define MYPROFILE
+//#define DEBCHECK
+#define CARMACIZED
--- /dev/null
+++ b/wolf1ver.h
@@ -1,0 +1,7 @@
+//#define SPEAR
+#define ARTSEXTERN
+#define DEMOSEXTERN
+//#define MYPROFILE
+//#define DEBCHECK
+#define CARMACIZED
+#define UPLOAD
--- /dev/null
+++ b/wolfgtv.h
@@ -1,0 +1,10 @@
+//#define SPEAR
+//#define JAPAN
+#define GOODTIMES
+#define ARTSEXTERN
+#define DEMOSEXTERN
+//#define MYPROFILE
+//#define DEBCHECK
+#define CARMACIZED
+//#define UPLOAD
+
\ No newline at end of file
--- /dev/null
+++ b/wolfhack.c
@@ -1,0 +1,186 @@
+// WOLFHACK.C
+
+#include "WL_DEF.H"
+
+#define MAXVIEWHEIGHT 200
+
+int spanstart[MAXVIEWHEIGHT/2];
+
+fixed stepscale[MAXVIEWHEIGHT/2];
+fixed basedist[MAXVIEWHEIGHT/2];
+
+extern char far planepics[8192]; // 4k of ceiling, 4k of floor
+
+int halfheight = 0;
+
+byte far *planeylookup[MAXVIEWHEIGHT/2];
+unsigned mirrorofs[MAXVIEWHEIGHT/2];
+
+fixed psin, pcos;
+
+fixed FixedMul (fixed a, fixed b)
+{
+ return (a>>8)*(b>>8);
+}
+
+
+int mr_rowofs;
+int mr_count;
+int mr_xstep;
+int mr_ystep;
+int mr_xfrac;
+int mr_yfrac;
+int mr_dest;
+
+
+/*
+==============
+=
+= DrawSpans
+=
+= Height ranges from 0 (infinity) to viewheight/2 (nearest)
+==============
+*/
+
+void DrawSpans (int x1, int x2, int height)
+{
+ fixed length;
+ int ofs;
+ int prestep;
+ fixed startxfrac, startyfrac;
+
+ int x, startx, count, plane, startplane;
+ byte far *toprow, far *dest;
+
+ toprow = planeylookup[height]+bufferofs;
+ mr_rowofs = mirrorofs[height];
+
+ mr_xstep = (psin<<1)/height;
+ mr_ystep = (pcos<<1)/height;
+
+ length = basedist[height];
+ startxfrac = (viewx + FixedMul(length,pcos));
+ startyfrac = (viewy - FixedMul(length,psin));
+
+// draw two spans simultaniously
+
+ plane = startplane = x1&3;
+ prestep = viewwidth/2 - x1;
+ do
+ {
+ outportb (SC_INDEX+1,1<<plane);
+ mr_xfrac = startxfrac - (mr_xstep>>2)*prestep;
+ mr_yfrac = startyfrac - (mr_ystep>>2)*prestep;
+
+ startx = x1>>2;
+ mr_dest = (unsigned)toprow + startx;
+ mr_count = ((x2-plane)>>2) - startx + 1;
+ x1++;
+ prestep--;
+ if (mr_count)
+ MapRow ();
+ plane = (plane+1)&3;
+ } while (plane != startplane);
+
+}
+
+
+
+
+/*
+===================
+=
+= SetPlaneViewSize
+=
+===================
+*/
+
+void SetPlaneViewSize (void)
+{
+ int x,y;
+ byte far *dest, far *src;
+
+ halfheight = viewheight>>1;
+
+
+ for (y=0 ; y<halfheight ; y++)
+ {
+ planeylookup[y] = (byte far *)0xa0000000l + (halfheight-1-y)*SCREENBWIDE;;
+ mirrorofs[y] = (y*2+1)*SCREENBWIDE;
+
+ stepscale[y] = y*GLOBAL1/32;
+ if (y>0)
+ basedist[y] = GLOBAL1/2*scale/y;
+ }
+
+ src = PM_GetPage(0);
+ dest = planepics;
+ for (x=0 ; x<4096 ; x++)
+ {
+ *dest = *src++;
+ dest += 2;
+ }
+ src = PM_GetPage(1);
+ dest = planepics+1;
+ for (x=0 ; x<4096 ; x++)
+ {
+ *dest = *src++;
+ dest += 2;
+ }
+
+}
+
+
+/*
+===================
+=
+= DrawPlanes
+=
+===================
+*/
+
+void DrawPlanes (void)
+{
+ int height, lastheight;
+ int x;
+
+ if (viewheight>>1 != halfheight)
+ SetPlaneViewSize (); // screen size has changed
+
+
+ psin = viewsin;
+ if (psin < 0)
+ psin = -(psin&0xffff);
+ pcos = viewcos;
+ if (pcos < 0)
+ pcos = -(pcos&0xffff);
+
+//
+// loop over all columns
+//
+ lastheight = halfheight;
+
+ for (x=0 ; x<viewwidth ; x++)
+ {
+ height = wallheight[x]>>3;
+ if (height < lastheight)
+ { // more starts
+ do
+ {
+ spanstart[--lastheight] = x;
+ } while (lastheight > height);
+ }
+ else if (height > lastheight)
+ { // draw spans
+ if (height > halfheight)
+ height = halfheight;
+ for ( ; lastheight < height ; lastheight++)
+ DrawSpans (spanstart[lastheight], x-1, lastheight);
+ }
+ }
+
+ height = halfheight;
+ for ( ; lastheight < height ; lastheight++)
+ DrawSpans (spanstart[lastheight], x-1, lastheight);
+}
+
--- /dev/null
+++ b/wolfjver.h
@@ -1,0 +1,8 @@
+//#define SPEAR
+#define JAPAN
+#define ARTSEXTERN
+#define DEMOSEXTERN
+//#define MYPROFILE
+//#define DEBCHECK
+#define CARMACIZED
+//#define UPLOAD
--- /dev/null
+++ b/wolfver.h
@@ -1,0 +1,7 @@
+//#define SPEAR
+#define ARTSEXTERN
+#define DEMOSEXTERN
+//#define MYPROFILE
+//#define DEBCHECK
+#define CARMACIZED
+//#define UPLOAD