[
  {
    "path": "CONTRIBUTORS.md",
    "content": "\r\n= PSXDOOM RE contributors (sorted alphabetically)\r\n=\r\n\r\n* **[Darragh Coy (intacowetrust)](https://github.com/BodbDearg)**\r\n\r\n    * Various information and code for PSX DOOM based on his own extensive reverse engineering efforts, including:\r\n    \r\n      * Suggestions for changing names in variables:\r\n      \r\n               cheatfullbright -> viewlighting\r\n               solidseg -> solidsubsectors\r\n               newend-> endsubsector\r\n               numsegs-> numdrawsubsectors\r\n               xtoviewangle -> yslope\r\n               vissprites_tmp ->visspritehead\r\n               lastsprite_p -> next\r\n               \r\n      * Identification of differences in the DrawImage and I_DrawSprite code:\r\n         https://github.com/BodbDearg/PsyDoom/commit/9360bd322bc939a29903f21b19f216931b67f196#r37085143\r\n         \r\n      * Bug identification, on line 259 in p_tick.c:\r\n         https://github.com/BodbDearg/PsyDoom/commit/50862aab3a3511dbc33269ee1249429314a71c18#commitcomment-37125911\r\n         \r\n      * Identification of non-existent lines in the original code:\r\n         https://github.com/BodbDearg/PsyDoom/commit/8b7afc9d06f76c9f7fd00fc2e840107dd79a01de#r37163087\r\n         https://github.com/BodbDearg/PsyDoom/commit/775e02de38cd3bf50e3dfa7173529c6ff783d641#r37185771\r\n         \r\n      * Update Identification from Psx Doom Greatest Hits:\r\n         https://github.com/BodbDearg/PsyDoom/commit/775e02de38cd3bf50e3dfa7173529c6ff783d641#r37185747\r\n         \r\n      * Fire sky width repair in title:\r\n         https://github.com/BodbDearg/PsyDoom/commit/9bd75ff52b517bec0737d946b12db5254a1d0e95\r\n         \r\n      * Identification of error in the CD_TRACK array:\r\n         https://github.com/BodbDearg/PsyDoom/commit/7f75f07502bcac6557c7d026f0188f07704899a6#r37223485\r\n         \r\n      * Identification of non-existent lines, in the first version of Psx Doom, but which were subsequently added in the Greatest Hits version:\r\n         https://github.com/BodbDearg/PsyDoom/commit/0457990ceebdf6e0e5cd9279e63a25b97f96a28c#r37246141\r\n         \r\n      * Line identification that is present in the 'Greatest Hits' version\r\n         https://github.com/BodbDearg/PsyDoom/commit/f258d1713611a4e3ea3766f4e02266f3a0772638#r37268303\r\n         \r\n      * Identification of a small correction on line 265 in am_main.cpp\r\n         https://github.com/BodbDearg/PsyDoom/commit/40816754f7978d4c2b3c34bf0cdb31c8e50abd0b#r37315450\r\n         \r\n      * Error identification in state blocks (else / if), in the files (f_main.c and st_main.c)\r\n         https://github.com/BodbDearg/PsyDoom/commit/f4d6fb8b428ff0262cde02f7c77fdd71dc45d0bc#r37348133\r\n         https://github.com/BodbDearg/PsyDoom/commit/201f293f0473e288c77b2f6e3c1a4c8b622c2968#commitcomment-37368964\r\n         \r\n      * Non-existent lines are blocked in Psx Doom\r\n         https://github.com/BodbDearg/PsyDoom/commit/d60da8761208e3cb137e5b5fb85c6dd3a9ff514c#r37805111\r\n         \r\n      * Wess_malloc : fix function signature\r\n         https://github.com/BodbDearg/PsyDoom/commit/a89ae26943fe08dc213d77bcabc50090c74316f0\r\n\r\n      * Return fix in wess_seq_loader_init function\r\n         https://github.com/BodbDearg/PsyDoom/commit/81f2bdc65724d2d7bce01e89900845803edeb957#r38278381\r\n\r\n      * Error identification on the line (168) in wess_seq_load_sub function\r\n         https://github.com/BodbDearg/PsyDoom/commit/89b38b23f6e0067d7ac123960c0cdc6064a8ef51#r38286066\r\n\r\n      * Changes in data types in variable ptk_stat->psp\r\n         https://github.com/BodbDearg/PsyDoom/commit/3eea78ba5a31da31f1007061f95bd6e32d275754#commitcomment-38312476\r\n         https://github.com/BodbDearg/PsyDoom/commit/b952d4be8126ae1fa16f3dfdb87b190c5db6aabb\r\n\r\n      * Changes in (Write_Vlq and Len_Vlq) functions\r\n         https://github.com/BodbDearg/PsyDoom/commit/f5e0d69afeb1dee45b699002ee26fe513ae2271d\r\n         \r\n      * Non-existent return statement identification\r\n         https://github.com/BodbDearg/PsyDoom/commit/1a01906c71ea7aadd5a1393cb0cf3365ed68138e#r38841312\r\n         \r\n      * Identification Missing sum in damagecount\r\n         https://github.com/BodbDearg/PsyDoom/commit/69dd2e3ad910eb1dcf5bd159651aafea7e21e3fa\r\n         \r\n      * Automap: fix a PSX DOOM bug where lines flagged with ML_DONTDRAW\r\n         https://github.com/BodbDearg/PsyDoom/commit/5a9b4059ac7a18b724edc380c26fa3fc6e548f5a\r\n         \r\n      * Range checks, added from Psy Doom to avoid alterations in P_RadiusAttack\r\n         https://github.com/BodbDearg/PsyDoom/commit/107f7d3d91824e06f3b9e5106e3498e98a590ebe\r\n      \r\n      * P_FindNextHighestFloor: rewritten to avoid possible undefined behavior, from PsyDoom\r\n         https://github.com/BodbDearg/PsyDoom/commit/91a3cc54e050d1ebba3572fb935a2625717ee21f\r\n\r\n      * P_CheckKeyLock and P_SpawnSpecials: added skull key detection code from Greatest Hits version, also fatal BUFFER OVERFLOW is corrected in the D_memset assignment in activeceilings and activeplats\r\n         https://github.com/BodbDearg/PsyDoom/commit/227fbaddf5237088d236865169cb2cae995043a5\r\n         https://github.com/BodbDearg/PsyDoom/commit/f9e7295f63a2757f68bca66eb83661de71b184e5\r\n\r\n      * P_SpawnStrobeFlashFast: Fixed `minlight` and` maxlight` assignments, as they were reversed.\r\n         https://github.com/BodbDearg/PsyDoom/commit/8dec4ccbbd73d278b7b1d0d8e1090b0e39ad539d\r\n\r\n      * T_CountdownTimer: Correction of regressive count, the code towards which an extra tick will be delayed to carry out the action\r\n         https://github.com/BodbDearg/PsyDoom/commit/890d7dd90474b837d552b45cd38d737f11f7477f\r\n\r\n      * P_UseLines: Another blockmap check ranges is added\r\n         https://github.com/BodbDearg/PsyDoom/commit/ea5f99886ae054ac89c88dc961402b681a5b1562\r\n\r\n      * A_CheckReload: Eliminate the return status and change a \"void\" like in Doom PC, since it's return is unnecessary.\r\n         https://github.com/BodbDearg/PsyDoom/commit/7c6d6d851cd6f7f9ac6c3ddd04ce37c8ca53632b\r\n\r\n      * A_Punch and A_Saw: (angle_t) identification is added before (P_Random () - P_Random ()), in order to avoid demo desynchronization\r\n         https://github.com/BodbDearg/PsyDoom/commit/7b3d77fdb689f98808faf7a0d3a77f80556dd079\r\n         https://github.com/BodbDearg/PsyDoom/commit/dc56fa6d91ee6d8f54aa11e9053fafd85ddad7f3\r\n\r\n      * Suggestion to create a code to increase the map limit to 255\r\n         https://github.com/BodbDearg/PsyDoom/commit/78436a90bfb8e2318141c13bce2e9c8f313af814\r\n\r\n      * Floor rendering fix, from PsyDoom\r\n         https://github.com/BodbDearg/PsyDoom/commit/2a0250ca6b43d920706849d0d9018cc4656cb1f1\r\n\r\n* **[Fabien Sanglard](https://github.com/fabiensanglard)**\r\n\r\n   * Article **[The Polygons of Doom: PSX](http://fabiensanglard.net/doom_psx/index.html)**\r\n   * Fix cryptic magic number \"mode\" for Plane rendition\r\n   \r\n* **[James Haley (Quasar)](https://github.com/haleyjd)**\r\n    * Wrong name identification in the PA_PointOnDivlineSide function, which must be called PA_DivlineSide\r\n\r\n* **[Samuel Villarreal (svkaiser)](https://github.com/svkaiser)**\r\n\r\n    * Console DOOM reverse engineering, specs & tools:\r\n    https://www.doomworld.com/forum/topic/38608-the-console-doom-hacking-project-console-specs\r\n    * Doom64-EX source code (DOOM 64 was based on PSX DOOM, thus can serve as a reference point for it):\r\n    https://github.com/svkaiser/Doom64EX\r\n"
  },
  {
    "path": "ERRORDETECTION.md",
    "content": "PSXDOOM RE Error detection before source code release (sorted alphabetically)\r\n============================================\r\n\r\n* **[Gerardo Vsquez Garca (Gerardo194)]**\r\n\r\n    * The player does not keep weapons and ammunition if he advances in level.\r\n    * The lines of action were not activated when a special enemy died, for example the barons of hell on map 8.\r\n    * In the game menu when you pause and press select.\r\n    * The barrels and the rocket did not generate the radio damage, to the enemies only to the player.\r\n    * Error in the position of the fps code, this generated problems when generating the graphics in the ot.\r\n    * The repeatable action buttons, the game was frozen as it did not reproduce the sound of the button when it returns to the initial graph.\r\n    * I didn't play the music of Club Doom.\r\n    * Spider Demon attack sound error.\r\n    * Texture identification error in sidedefs.\r\n    * Error loading MAP60.LCD before executing Cast Monsters.\r\n\r\n* **[Samuel Villarreal (svkaiser)]**\r\n\r\n    * Errors in the view bobbing.\r\n    * Scrolling wall textures did not work."
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "PSXDOOM/GAME/CD/PSXDOOM/CDAUDIO/tmp.txt",
    "content": "temp file"
  },
  {
    "path": "PSXDOOM/GAME/CD/PSXDOOM/MAPDIR0/tmp.txt",
    "content": "temp file"
  },
  {
    "path": "PSXDOOM/GAME/CD/PSXDOOM/MAPDIR1/tmp.txt",
    "content": "temp file"
  },
  {
    "path": "PSXDOOM/GAME/CD/PSXDOOM/MAPDIR2/tmp.txt",
    "content": "temp file"
  },
  {
    "path": "PSXDOOM/GAME/CD/PSXDOOM/MAPDIR3/tmp.txt",
    "content": "temp file"
  },
  {
    "path": "PSXDOOM/GAME/CD/PSXDOOM/MAPDIR4/tmp.txt",
    "content": "temp file"
  },
  {
    "path": "PSXDOOM/GAME/CD/PSXDOOM/MAPDIR5/tmp.txt",
    "content": "temp file"
  },
  {
    "path": "PSXDOOM/GAME/CD/PSXDOOM/MAPDIR6/tmp.txt",
    "content": "temp file"
  },
  {
    "path": "PSXDOOM/GAME/CD/PSXDOOM/MAPDIR7/tmp.txt",
    "content": "temp file"
  },
  {
    "path": "PSXDOOM/GAME/CD/PSXDOOM/MUSIC/tmp.txt",
    "content": "temp file"
  },
  {
    "path": "PSXDOOM/GAME/CD/PSXDOOM/SNDMAPS1/tmp.txt",
    "content": "temp file"
  },
  {
    "path": "PSXDOOM/GAME/CD/PSXDOOM/SNDMAPS2/tmp.txt",
    "content": "temp file"
  },
  {
    "path": "PSXDOOM/GAME/CD/PSXDOOM/SNDMAPS3/tmp.txt",
    "content": "temp file"
  },
  {
    "path": "PSXDOOM/GAME/MAKE_CD.bat",
    "content": "mkpsxiso.exe -y -makeabs -lba2 doom.txt -lba doom_.txt PSXDOOMCD.xml\r\n\r\ncopy PSXCDABS.C ..\\\r\ncopy PSXCDABS.H ..\\\r\npause"
  },
  {
    "path": "PSXDOOM/GAME/PSXDOOMCD.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n\r\n<!-- MKPSXISO example XML script -->\r\n\r\n<iso_project image_name=\"PSXDOOM.bin\" cue_sheet=\"PSXDOOM.cue\">\r\n\r\n\t<!-- <track>\r\n\t\tSpecifies a track to the ISO project. This example element creates a data\r\n\t\ttrack for storing data files and CD-XA/STR streams.\r\n\t\r\n\t\tOnly one data track is allowed and data tracks must only be specified as the\r\n\t\tfirst track in the ISO image and cannot\tbe specified after an audio track.\r\n\t\t\r\n\t\tAttributes:\r\n\t\t\ttype\t\t- Track type (either data or audio).\r\n\t\t\tsource\t\t- For audio tracks only, specifies the file name of a wav audio\r\n\t\t\t\t\t\t  file to use for the audio track.\t\r\n\t-->\r\n\r\n\t<track type = \"data\" >\r\n\t\r\n\t\t<identifiers\r\n\t\t\tsystem\t\t= \"PLAYSTATION\"\r\n\t\t\tapplication\t= \"PLAYSTATION\"\r\n\t\t\tvolume\t\t= \"PSXDOOM\"\r\n\t\t\tvolumeset\t= \"PSXDOOM\"\r\n\t\t\tpublisher\t= \"WILLIAMS ENTERTAINMENT\"\r\n\t\t\tdatapreparer\t= \"WILLIAMS ENTERTAINMENT\"\r\n\t\t/>\r\n\t\t\r\n\r\n\t\t<license file = \"licensea.dat\"/>\r\n\t\t\r\n\r\n\t\t<directory_tree>\r\n\t\t\r\n\t\t\t<file name = \"SYSTEM.CNF\"\ttype = \"data\"\tsource=\"CD\\SYSTEM.CNF\"/>\r\n\t\t\t<file name = \"SLUS_000.77\"\ttype = \"data\"\tsource=\"CD\\SLUS_000.77\"/>\r\n\t\t\t\r\n\t\t\t<dir name = \"PSXDOOM\">\r\n\r\n\t\t\t\t<dir name = \"ABIN\">\r\n\t\t\t\t\t<file name = \"DEMO1.LMP\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\ABIN\\DEMO1.LMP\"/>\r\n\t\t\t\t\t<file name = \"DEMO2.LMP\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\ABIN\\DEMO2.LMP\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR60.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\ABIN\\MAPSPR60.IMG\"/>\r\n\t\t\t\t\t<file name = \"MOVIE.STR\"\ttype = \"str\"\tsource=\"CD\\PSXDOOM\\ABIN\\MOVIE.STR\"/>\r\n\t\t\t\t\t<file name = \"PSXDOOM.EXE\"\ttype = \"data\"\tsource=\"MAIN.EXE\"/>\t<!--Discard original CD\\PSXDOOM\\ABIN\\PSXDOOM.EXE-->\r\n\t\t\t\t\t<file name = \"PSXDOOM.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\ABIN\\PSXDOOM.WAD\"/>\r\n\t\t\t\t</dir>\r\n\r\n\t\t\t\t<dir name = \"MAPDIR0\">\r\n\t\t\t\t\t<file name = \"MAP01.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAP01.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP02.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAP02.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP03.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAP03.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP04.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAP04.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP05.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAP05.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP06.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAP06.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP07.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAP07.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP08.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAP08.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR01.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAPSPR01.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR02.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAPSPR02.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR03.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAPSPR03.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR04.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAPSPR04.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR05.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAPSPR05.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR06.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAPSPR06.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR07.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAPSPR07.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR08.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAPSPR08.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX01.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAPTEX01.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX02.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAPTEX02.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX03.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAPTEX03.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX04.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAPTEX04.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX05.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAPTEX05.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX06.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAPTEX06.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX07.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAPTEX07.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX08.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR0\\MAPTEX08.IMG\"/>\r\n\t\t\t\t</dir>\r\n\r\n\t\t\t\t<dir name = \"MAPDIR1\">\r\n\t\t\t\t\t<file name = \"MAP09.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAP09.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP10.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAP10.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP11.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAP11.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP12.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAP12.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP13.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAP13.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP14.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAP14.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP15.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAP15.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP16.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAP16.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR09.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAPSPR09.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR10.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAPSPR10.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR11.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAPSPR11.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR12.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAPSPR12.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR13.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAPSPR13.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR14.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAPSPR14.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR15.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAPSPR15.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR16.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAPSPR16.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX09.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAPTEX09.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX10.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAPTEX10.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX11.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAPTEX11.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX12.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAPTEX12.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX13.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAPTEX13.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX14.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAPTEX14.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX15.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAPTEX15.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX16.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR1\\MAPTEX16.IMG\"/>\r\n\t\t\t\t</dir>\r\n\r\n\t\t\t\t<dir name = \"MAPDIR2\">\r\n\t\t\t\t\t<file name = \"MAP17.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAP17.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP18.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAP18.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP19.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAP19.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP20.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAP20.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP21.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAP21.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP22.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAP22.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP23.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAP23.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP24.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAP24.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR17.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAPSPR17.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR18.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAPSPR18.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR19.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAPSPR19.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR20.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAPSPR20.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR21.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAPSPR21.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR22.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAPSPR22.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR23.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAPSPR23.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR24.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAPSPR24.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX17.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAPTEX17.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX18.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAPTEX18.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX19.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAPTEX19.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX20.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAPTEX20.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX21.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAPTEX21.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX22.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAPTEX22.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX23.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAPTEX23.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX24.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR2\\MAPTEX24.IMG\"/>\r\n\t\t\t\t</dir>\r\n\r\n\t\t\t\t<dir name = \"MAPDIR3\">\r\n\t\t\t\t\t<file name = \"MAP25.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAP25.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP26.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAP26.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP27.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAP27.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP28.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAP28.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP29.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAP29.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP30.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAP30.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP31.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAP31.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP32.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAP32.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR25.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAPSPR25.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR26.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAPSPR26.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR27.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAPSPR27.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR28.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAPSPR28.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR29.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAPSPR29.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR30.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAPSPR30.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR31.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAPSPR31.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR32.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAPSPR32.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX25.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAPTEX25.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX26.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAPTEX26.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX27.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAPTEX27.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX28.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAPTEX28.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX29.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAPTEX29.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX30.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAPTEX30.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX31.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAPTEX31.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX32.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR3\\MAPTEX32.IMG\"/>\r\n\t\t\t\t</dir>\r\n\r\n\t\t\t\t<dir name = \"MAPDIR4\">\r\n\t\t\t\t\t<file name = \"MAP33.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAP33.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP34.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAP34.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP35.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAP35.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP36.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAP36.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP37.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAP37.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP38.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAP38.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP39.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAP39.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP40.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAP40.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR33.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAPSPR33.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR34.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAPSPR34.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR35.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAPSPR35.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR36.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAPSPR36.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR37.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAPSPR37.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR38.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAPSPR38.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR39.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAPSPR39.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR40.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAPSPR40.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX33.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAPTEX33.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX34.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAPTEX34.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX35.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAPTEX35.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX36.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAPTEX36.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX37.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAPTEX37.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX38.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAPTEX38.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX39.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAPTEX39.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX40.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR4\\MAPTEX40.IMG\"/>\r\n\t\t\t\t</dir>\r\n\r\n\t\t\t\t<dir name = \"MAPDIR5\">\r\n\t\t\t\t\t<file name = \"MAP41.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAP41.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP42.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAP42.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP43.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAP43.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP44.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAP44.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP45.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAP45.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP46.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAP46.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP47.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAP47.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP48.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAP48.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR41.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAPSPR41.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR42.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAPSPR42.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR43.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAPSPR43.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR44.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAPSPR44.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR45.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAPSPR45.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR46.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAPSPR46.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR47.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAPSPR47.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR48.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAPSPR48.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX41.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAPTEX41.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX42.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAPTEX42.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX43.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAPTEX43.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX44.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAPTEX44.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX45.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAPTEX45.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX46.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAPTEX46.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX47.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAPTEX47.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX48.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR5\\MAPTEX48.IMG\"/>\r\n\t\t\t\t</dir>\r\n\r\n\t\t\t\t<dir name = \"MAPDIR6\">\r\n\t\t\t\t\t<file name = \"MAP49.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAP49.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP50.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAP50.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP51.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAP51.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP52.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAP52.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP53.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAP53.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP54.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAP54.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP55.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAP55.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP56.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAP56.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR49.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAPSPR49.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR50.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAPSPR50.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR51.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAPSPR51.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR52.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAPSPR52.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR53.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAPSPR53.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR54.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAPSPR54.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR55.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAPSPR55.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR56.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAPSPR56.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX49.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAPTEX49.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX50.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAPTEX50.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX51.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAPTEX51.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX52.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAPTEX52.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX53.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAPTEX53.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX54.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAPTEX54.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX55.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAPTEX55.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX56.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR6\\MAPTEX56.IMG\"/>\r\n\t\t\t\t</dir>\r\n\r\n\t\t\t\t<dir name = \"MAPDIR7\">\r\n\t\t\t\t\t<file name = \"MAP57.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAP57.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP58.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAP58.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP59.WAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAP59.WAD\"/>\r\n\t\t\t\t\t<file name = \"MAP60.PAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAP60.PAD\"/>\r\n\t\t\t\t\t<file name = \"MAP61.PAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAP61.PAD\"/>\r\n\t\t\t\t\t<file name = \"MAP62.PAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAP62.PAD\"/>\r\n\t\t\t\t\t<file name = \"MAP63.PAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAP63.PAD\"/>\r\n\t\t\t\t\t<file name = \"MAP64.PAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAP64.PAD\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR57.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAPSPR57.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR58.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAPSPR58.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR59.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAPSPR59.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR60.PAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAPSPR60.PAD\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR61.PAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAPSPR61.PAD\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR62.PAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAPSPR62.PAD\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR63.PAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAPSPR63.PAD\"/>\r\n\t\t\t\t\t<file name = \"MAPSPR64.PAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAPSPR64.PAD\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX57.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAPTEX57.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX58.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAPTEX58.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX59.IMG\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAPTEX59.IMG\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX60.PAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAPTEX60.PAD\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX61.PAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAPTEX61.PAD\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX62.PAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAPTEX62.PAD\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX63.PAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAPTEX63.PAD\"/>\r\n\t\t\t\t\t<file name = \"MAPTEX64.PAD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MAPDIR7\\MAPTEX64.PAD\"/>\r\n\t\t\t\t</dir>\r\n\r\n\t\t\t\t<dir name = \"MUSIC\">\r\n\t\t\t\t\t<file name = \"DOOMSFX.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MUSIC\\DOOMSFX.LCD\"/>\r\n\t\t\t\t\t<file name = \"DOOMSND.WMD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MUSIC\\DOOMSND.WMD\"/>\r\n\t\t\t\t\t<file name = \"MUSLEV1.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MUSIC\\MUSLEV1.LCD\"/>\r\n\t\t\t\t\t<file name = \"MUSLEV10.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MUSIC\\MUSLEV10.LCD\"/>\r\n\t\t\t\t\t<file name = \"MUSLEV11.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MUSIC\\MUSLEV11.LCD\"/>\r\n\t\t\t\t\t<file name = \"MUSLEV12.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MUSIC\\MUSLEV12.LCD\"/>\r\n\t\t\t\t\t<file name = \"MUSLEV13.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MUSIC\\MUSLEV13.LCD\"/>\r\n\t\t\t\t\t<file name = \"MUSLEV14.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MUSIC\\MUSLEV14.LCD\"/>\r\n\t\t\t\t\t<file name = \"MUSLEV15.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MUSIC\\MUSLEV15.LCD\"/>\r\n\t\t\t\t\t<file name = \"MUSLEV16.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MUSIC\\MUSLEV16.LCD\"/>\r\n\t\t\t\t\t<file name = \"MUSLEV17.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MUSIC\\MUSLEV17.LCD\"/>\r\n\t\t\t\t\t<file name = \"MUSLEV18.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MUSIC\\MUSLEV18.LCD\"/>\r\n\t\t\t\t\t<file name = \"MUSLEV19.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MUSIC\\MUSLEV19.LCD\"/>\r\n\t\t\t\t\t<file name = \"MUSLEV2.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MUSIC\\MUSLEV2.LCD\"/>\r\n\t\t\t\t\t<file name = \"MUSLEV20.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MUSIC\\MUSLEV20.LCD\"/>\r\n\t\t\t\t\t<file name = \"MUSLEV3.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MUSIC\\MUSLEV3.LCD\"/>\r\n\t\t\t\t\t<file name = \"MUSLEV4.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MUSIC\\MUSLEV4.LCD\"/>\r\n\t\t\t\t\t<file name = \"MUSLEV5.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MUSIC\\MUSLEV5.LCD\"/>\r\n\t\t\t\t\t<file name = \"MUSLEV6.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MUSIC\\MUSLEV6.LCD\"/>\r\n\t\t\t\t\t<file name = \"MUSLEV7.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MUSIC\\MUSLEV7.LCD\"/>\r\n\t\t\t\t\t<file name = \"MUSLEV8.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MUSIC\\MUSLEV8.LCD\"/>\r\n\t\t\t\t\t<file name = \"MUSLEV9.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\MUSIC\\MUSLEV9.LCD\"/>\r\n\t\t\t\t</dir>\r\n\r\n\t\t\t\t<dir name = \"SNDMAPS1\">\r\n\t\t\t\t\t<file name = \"MAP01.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS1\\MAP01.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP02.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS1\\MAP02.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP03.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS1\\MAP03.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP04.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS1\\MAP04.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP05.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS1\\MAP05.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP06.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS1\\MAP06.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP07.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS1\\MAP07.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP08.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS1\\MAP08.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP09.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS1\\MAP09.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP10.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS1\\MAP10.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP11.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS1\\MAP11.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP12.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS1\\MAP12.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP13.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS1\\MAP13.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP14.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS1\\MAP14.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP15.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS1\\MAP15.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP16.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS1\\MAP16.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP17.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS1\\MAP17.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP18.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS1\\MAP18.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP19.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS1\\MAP19.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP20.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS1\\MAP20.LCD\"/>\r\n\t\t\t\t</dir>\r\n\r\n\t\t\t\t<dir name = \"SNDMAPS2\">\r\n\t\t\t\t\t<file name = \"MAP21.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS2\\MAP21.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP22.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS2\\MAP22.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP23.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS2\\MAP23.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP24.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS2\\MAP24.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP25.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS2\\MAP25.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP26.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS2\\MAP26.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP27.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS2\\MAP27.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP28.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS2\\MAP28.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP29.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS2\\MAP29.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP30.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS2\\MAP30.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP31.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS2\\MAP31.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP32.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS2\\MAP32.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP33.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS2\\MAP33.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP34.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS2\\MAP34.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP35.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS2\\MAP35.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP36.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS2\\MAP36.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP37.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS2\\MAP37.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP38.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS2\\MAP38.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP39.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS2\\MAP39.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP40.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS2\\MAP40.LCD\"/>\r\n\t\t\t\t</dir>\r\n\r\n\t\t\t\t<dir name = \"SNDMAPS3\">\r\n\t\t\t\t\t<file name = \"MAP41.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS3\\MAP41.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP42.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS3\\MAP42.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP43.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS3\\MAP43.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP44.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS3\\MAP44.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP45.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS3\\MAP45.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP46.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS3\\MAP46.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP47.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS3\\MAP47.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP48.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS3\\MAP48.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP49.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS3\\MAP49.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP50.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS3\\MAP50.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP51.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS3\\MAP51.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP52.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS3\\MAP52.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP53.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS3\\MAP53.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP54.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS3\\MAP54.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP55.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS3\\MAP55.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP56.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS3\\MAP56.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP57.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS3\\MAP57.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP58.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS3\\MAP58.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP59.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS3\\MAP59.LCD\"/>\r\n\t\t\t\t\t<file name = \"MAP60.LCD\"\ttype = \"data\"\tsource=\"CD\\PSXDOOM\\SNDMAPS3\\MAP60.LCD\"/>\r\n\t\t\t\t\t<dummy sectors=\"2048\"/>\r\n\t\t\t\t</dir>\r\n\r\n\t\t\t\t<dir name = \"CDAUDIO\">\r\n\t\t\t\t\t<file name = \"DOOMMAIN.RAW\"\ttype = \"da\"\t source = \"CD\\PSXDOOM\\CDAUDIO\\DOOMMAIN.RAW\"/>\r\n\t\t\t\t\t<file name = \"DMSELECT.RAW\"\ttype = \"da\"\t source = \"CD\\PSXDOOM\\CDAUDIO\\DMSELECT.RAW\"/>\r\n\t\t\t\t\t<file name = \"CREDITS.RAW\"\ttype = \"da\"\t source = \"CD\\PSXDOOM\\CDAUDIO\\CREDITS.RAW\"/>\r\n\t\t\t\t\t<file name = \"COMPLETE.RAW\"\ttype = \"da\"\t source = \"CD\\PSXDOOM\\CDAUDIO\\COMPLETE.RAW\"/>\r\n\t\t\t\t\t<file name = \"DOOMRAVE.RAW\"\ttype = \"da\"\t source = \"CD\\PSXDOOM\\CDAUDIO\\DOOMRAVE.RAW\"/>\r\n\t\t\t\t\t<file name = \"DOOM1FIN.RAW\"\ttype = \"da\"\t source = \"CD\\PSXDOOM\\CDAUDIO\\DOOM1FIN.RAW\"/>\r\n\t\t\t\t\t<file name = \"FINALE1.RAW\"\ttype = \"da\"\t source = \"CD\\PSXDOOM\\CDAUDIO\\FINALE1.RAW\"/>\r\n\t\t\t\t</dir>\r\n\r\n\t\t\t</dir>\r\n\r\n\t\t\r\n\t\t</directory_tree>\r\n\t\t\r\n\t</track>\r\n\t\r\n</iso_project>"
  },
  {
    "path": "PSXDOOM/LCDLOAD.C",
    "content": "// Reconstruido por Erick Vasquez Garcia 16/05/2019 [GEC]\r\n// Update 20/10/2019 [GEC]\r\n\r\n#include <libspu.h>\r\n#include \"psxcd.h\"\r\n#include \"psxspu.h\"\r\n#include \"wessapi.h\"\r\n#include \"lcdload.h\"\r\n#include \"doomdata.h\"\r\n\r\nextern int lcd_open;\t//L800758F4\r\nextern char *lcd_ppat_data_patches;//L800758F8\r\nextern char *lcd_ppat_data_patchmaps;//L800758FC\r\nextern char *lcd_ppat_data_patchinfo;//L80075900\r\nextern char *lcd_ppat_data_track;//L80075904\r\nextern patch_group_data *lcd_ppat_info;//L80075908;\r\nextern unsigned long lcd_sample_pos;//L8007590C\r\nextern unsigned int lcd_sectorbuf_pos;//L80075910\r\nextern unsigned int lcd_totaltogo;//L80075914\r\n\r\nextern short lcd_sectorbuf_code ; //L80075918\r\nextern char *lcd_sectorbuf;//L8007591C\r\n\r\nextern int lcd_cd_status; //L80075920\r\n\r\nextern int  lcd_sync_intr;//L80075924\r\nextern char lcd_sync_result[8];//0x80075928\r\n\r\nextern Wess_Data_IO_Struct lcd_data_fileref;//0x8007f104\r\n\r\n#define CHUNKSIZE 2048\r\nextern char chunk[CHUNKSIZE];//80096394\r\nextern char chunk2[CHUNKSIZE];//80096BA4\r\n\r\nint wess_dig_lcd_loader_init(void *input_pm_stat)//80048C54\r\n{\r\n    pmasterstat *pm_stat;\r\n    patch_group_data *pat_info;\r\n\tchar *ppat_data;\r\n\tint k;\r\n\r\n\tpm_stat = input_pm_stat;\r\n\r\n\tlcd_open = 0;\r\n\tif (!pm_stat)\r\n\t\treturn 0;\r\n\r\n\tfor (k = 0; k < pm_stat->pmod_info->mod_hdr.patch_types_infile; k++)\r\n\t{\r\n\t\tpat_info = (pm_stat->ppat_info + k);\r\n\r\n\t\tif (pat_info->pat_grp_hdr.patch_id == SNDHW_TAG_DRIVER_ID)\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\tlcd_ppat_info = pat_info;\r\n\r\n\tif (lcd_ppat_info != 0)\r\n\t{\r\n\t\tppat_data = lcd_ppat_info->ppat_data;\r\n\t\tlcd_open = 1;\r\n\r\n\t\tlcd_ppat_data_patches = ppat_data;\r\n\r\n\t\t//printf(\"patches %d\\n\",lcd_ppat_info->pat_grp_hdr.patches);\r\n\t\tppat_data += (lcd_ppat_info->pat_grp_hdr.patches * sizeof(patches_header));\r\n\t\tlcd_ppat_data_patchmaps = ppat_data;\r\n\r\n\t\t//printf(\"patchmaps %d\\n\",lcd_ppat_info->pat_grp_hdr.patchmaps);\r\n\t\tppat_data += (lcd_ppat_info->pat_grp_hdr.patchmaps * sizeof(patchmaps_header));\r\n\t\tlcd_ppat_data_patchinfo = ppat_data;\r\n\r\n\t\t//printf(\"patchinfo %d\\n\",lcd_ppat_info->pat_grp_hdr.patchinfo);\r\n\t\tppat_data += (lcd_ppat_info->pat_grp_hdr.patchinfo * sizeof(patchinfo_header));\r\n\t\tlcd_ppat_data_track = ppat_data;\r\n\t\treturn 1;\r\n\t}\r\n\r\n\treturn 0;\r\n}\r\n\r\nvoid wess_dig_set_sample_position(int samplenum, char *samplepos)//80048D3C\r\n{\r\n    patchinfo_header *patchinfo;\r\n\r\n\tif (lcd_ppat_data_patchinfo)\r\n\t{\r\n\t\tpatchinfo = (patchinfo_header *) (lcd_ppat_data_patchinfo + (samplenum * sizeof(patchinfo_header)));\r\n\t\tpatchinfo->sample_pos = (unsigned long)samplepos;\r\n\t}\r\n}\r\n\r\nWess_Data_IO_Struct *wess_dig_lcd_data_open(char *filename)//80048D68\r\n{\r\n    Wess_File_IO_Struct *fp;\r\n\r\n\tfp = psxcd_open(filename);\r\n\r\n\tlcd_data_fileref = *fp;\r\n\r\n\treturn(&lcd_data_fileref);\r\n}\r\n\r\nint wess_dig_lcd_data_read(unsigned char *buffer,void *destptr, SampleBlock *sampblk, int override)//80048DDC\r\n{\r\n    patchinfo_header *patchinfo;\r\n\tunsigned int samplenum, totaltogo, readbytes, totaltogo_tmp;\r\n\tunsigned long spuptr;\r\n\r\n\tspuptr = 0;\r\n\treadbytes = 0;\r\n\ttotaltogo = CHUNKSIZE;\r\n\r\n    while(totaltogo != 0)\r\n    {\r\n        //InitNextSampleBlock\r\n        if (lcd_totaltogo == 0)\r\n        {\r\n            if (lcd_sectorbuf_pos > 0)\r\n            {\r\n                samplenum = (short) *(lcd_sectorbuf + (lcd_sectorbuf_pos << 1));\r\n                patchinfo = (patchinfo_header *)(lcd_ppat_data_patchinfo + (samplenum * sizeof(patchinfo_header)));\r\n\r\n                if (!(patchinfo->sample_pos) || (override != 0))\r\n                {\r\n                    patchinfo->sample_pos = lcd_sample_pos;\r\n                    if (sampblk != 0)\r\n                    {\r\n                        sampblk->sampindx[sampblk->numsamps] = samplenum;\r\n                        sampblk->samppos[sampblk->numsamps] = patchinfo->sample_pos >> 3;\r\n                        sampblk->numsamps += 1;\r\n                        //printf(\"save to sample [%d] [%d]\\n\", patchinfo->sample_pos, patchinfo->sample_pos >> 3);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (lcd_sectorbuf_code <= lcd_sectorbuf_pos)\r\n            {\r\n                return readbytes;\r\n            }\r\n\r\n            lcd_sectorbuf_pos++;\r\n            samplenum = (short) *(lcd_sectorbuf + (lcd_sectorbuf_pos << 1));\r\n            patchinfo = (patchinfo_header *)(lcd_ppat_data_patchinfo + (samplenum * sizeof(patchinfo_header)));\r\n\r\n            lcd_totaltogo = patchinfo->sample_size;\r\n            lcd_sample_pos = ((unsigned long)destptr + spuptr);\r\n\r\n            if (((end_of_sram - (unsigned long)destptr) + spuptr) < patchinfo->sample_size)\r\n            {\r\n                lcd_totaltogo = 0;\r\n                return readbytes;\r\n            }\r\n            if (totaltogo == 0) {\r\n                return readbytes;\r\n            }\r\n        }\r\n\r\n        totaltogo_tmp = totaltogo;\r\n\r\n        //Read Data\r\n        if (lcd_totaltogo < totaltogo)\r\n        {\r\n            samplenum = (short) *(lcd_sectorbuf + (lcd_sectorbuf_pos << 1));\r\n            patchinfo = (patchinfo_header *)(lcd_ppat_data_patchinfo + (samplenum * sizeof(patchinfo_header)));\r\n\r\n            if (!(patchinfo->sample_pos) || (override != 0))\r\n            {\r\n                SpuIsTransferCompleted(SPU_TRANSFER_WAIT);\r\n                SpuSetTransferStartAddr(((unsigned long)destptr + spuptr));\r\n                SpuWrite((buffer + spuptr), lcd_totaltogo);\r\n                readbytes += lcd_totaltogo;\r\n            }\r\n            totaltogo = totaltogo_tmp - lcd_totaltogo;\r\n            spuptr += lcd_totaltogo;\r\n            lcd_totaltogo = 0;\r\n        }\r\n        else\r\n        {\r\n            samplenum = (short) *(lcd_sectorbuf + (lcd_sectorbuf_pos << 1));\r\n            patchinfo = (patchinfo_header *)(lcd_ppat_data_patchinfo + (samplenum * sizeof(patchinfo_header)));\r\n\r\n            if (!(patchinfo->sample_pos) || (override != 0))\r\n            {\r\n                SpuIsTransferCompleted(SPU_TRANSFER_WAIT);\r\n                SpuSetTransferStartAddr(((unsigned long)destptr + spuptr));\r\n                SpuWrite(buffer+spuptr, totaltogo_tmp);\r\n                readbytes += totaltogo_tmp;\r\n            }\r\n\r\n            spuptr += totaltogo_tmp;\r\n            lcd_totaltogo -= totaltogo_tmp;\r\n            totaltogo = 0;\r\n        }\r\n    }\r\n\r\n\treturn (readbytes);\r\n}\r\n\r\nint wess_dig_lcd_psxcd_sync(void)//8004911C\r\n{\r\n    unsigned long block;\r\n\r\n\tblock = millicount;\r\n\tblock += 8000;\r\n\r\n\twhile (millicount < block)\r\n\t{\r\n\t\tlcd_sync_intr = CdSync(1, (u_char *)&lcd_sync_result);\r\n\r\n\t\tif (lcd_sync_intr == CdlDiskError)\r\n\t\t{\r\n\t\t\tCdFlush();\r\n\t\t\treturn 1;\r\n\t\t}\r\n\r\n\t\tif (lcd_sync_intr == CdlComplete) return 0;\r\n\t}\r\n\r\n\treturn 1;\r\n}\r\n\r\nint wess_dig_lcd_load(char *lcdfilename, void *memptr, SampleBlock *sampblk, int override)//800491C4\r\n{\r\n\tWess_File_IO_Struct *fileptr;\r\n\tchar *destptr;\r\n\tint countbytes, bytestocopy, readbytes;\r\n\tboolean read1, read2;\r\n\r\n\tpsxcd_disable_callbacks();\r\n\r\nReadAgain:\r\n\tdo\r\n\t{\r\n\t\tdo\r\n\t\t{\r\n\t\t\tdo\r\n\t\t\t{\r\n\t\t\t\tlcd_sectorbuf_pos = 0;\r\n\t\t\t\tlcd_totaltogo = 0;\r\n\t\t\t\treadbytes = 0;\r\n\r\n\t\t\t\tpsxcd_init_pos();\r\n\t\t\t\tpsxcd_set_data_mode();\r\n\r\n\t\t\t\tfileptr = wess_dig_lcd_data_open(lcdfilename);\r\n\r\n\t\t\t\tif (*(int *)&fileptr->file.pos == 0)\r\n\t\t\t\t\treturn 0;\r\n\r\n\t\t\t\tbytestocopy = fileptr->file.size;\r\n\r\n\t\t\t\tCdIntToPos(CdPosToInt(&fileptr->file.pos), &fileptr->new_io_loc);\r\n\t\t\t\tCdControl(CdlSetloc, (u_char *)&fileptr->new_io_loc, 0);\r\n\t\t\t\tCdControl(CdlReadN, (u_char *)&fileptr->new_io_loc, 0);\r\n\t\t\t\tdo\r\n\t\t\t\t{\r\n\t\t\t\t\tlcd_cd_status = CdReady(1, 0);\r\n\t\t\t\t\tif (lcd_cd_status == CdlDataReady) goto DataReady1;\r\n\t\t\t\t} while (lcd_cd_status != CdlDiskError);\r\n\t\t\t\tCdFlush();\r\n\t\t\tDataReady1:\r\n\t\t\t} while (lcd_cd_status == CdlDiskError);\r\n\r\n\t\t\tCdGetSector((u_long *)&sectorbuf, CHUNKSIZE / 4);\r\n\t\t\tlcd_sectorbuf_code = (short)*sectorbuf; // read lcd count indx\r\n\t\t\tlcd_sectorbuf = (char *)&sectorbuf;\r\n\t\t} while (100 < lcd_sectorbuf_code);\r\n\r\n\t\tif (bytestocopy < CHUNKSIZE)\r\n\t\t\tbytestocopy = 0;\r\n\t\telse\r\n\t\t\tbytestocopy += -CHUNKSIZE;\r\n\r\n\t\tread1 = true;\r\n\t\tread2 = true;\r\n\t\tdestptr = memptr;\r\n\t\tlcd_sectorbuf_code = (short)*sectorbuf; // read lcd count indx\r\n\t\twhile (bytestocopy != 0)\r\n\t\t{\r\n\t\t\tif (read1)\r\n\t\t\t{\r\n\t\t\t\tdo\r\n\t\t\t\t{\r\n\t\t\t\t\tlcd_cd_status = CdReady(1, 0);\r\n\t\t\t\t\tif (lcd_cd_status == CdlDataReady) goto DataReady2;\r\n\t\t\t\t} while (lcd_cd_status != CdlDiskError);\r\n\t\t\t\tCdFlush();\r\n\t\t\tDataReady2:\r\n\t\t\t\tif (lcd_cd_status == CdlDiskError) goto ReadAgain;\r\n\r\n\t\t\t\tCdGetSector((u_long *)&chunk, CHUNKSIZE / 4);\r\n\r\n\t\t\t\tif (bytestocopy < CHUNKSIZE)\r\n\t\t\t\t\tbytestocopy = 0;\r\n\t\t\t\telse\r\n\t\t\t\t\tbytestocopy += -CHUNKSIZE;\r\n\r\n\t\t\t\tcountbytes = wess_dig_lcd_data_read(chunk, destptr, sampblk, override);\r\n\t\t\t\treadbytes += countbytes;\r\n\t\t\t\tdestptr += countbytes;\r\n\t\t\t\tread2 = true;\r\n\t\t\t\tread1 = false;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tif (read2)\r\n\t\t\t\t{\r\n\t\t\t\t\tdo\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tlcd_cd_status = CdReady(1, 0);\r\n\t\t\t\t\t\tif (lcd_cd_status == CdlDataReady) goto DataReady3;\r\n\t\t\t\t\t} while (lcd_cd_status != CdlDiskError);\r\n\t\t\t\t\tCdFlush();\r\n\t\t\t\tDataReady3:\r\n\t\t\t\t\tif (lcd_cd_status == CdlDiskError) goto ReadAgain;\r\n\r\n\t\t\t\t\tCdGetSector((u_long *)&chunk2, CHUNKSIZE / 4);\r\n\r\n\t\t\t\t\tif (bytestocopy < CHUNKSIZE)\r\n\t\t\t\t\t\tbytestocopy = 0;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tbytestocopy += -CHUNKSIZE;\r\n\r\n\t\t\t\t\tSpuIsTransferCompleted(SPU_TRANSFER_WAIT);\r\n\t\t\t\t\tcountbytes = wess_dig_lcd_data_read(chunk2, destptr, sampblk, override);\r\n\t\t\t\t\treadbytes += countbytes;\r\n\t\t\t\t\tdestptr += countbytes;\r\n\t\t\t\t\tread2 = false;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tdo\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tlcd_cd_status = CdReady(1, 0);\r\n\t\t\t\t\t\tif (lcd_cd_status == CdlDataReady) goto DataReady4;\r\n\t\t\t\t\t} while (lcd_cd_status != CdlDiskError);\r\n\t\t\t\t\tCdFlush();\r\n\t\t\t\tDataReady4:\r\n\t\t\t\t\tif (lcd_cd_status == CdlDiskError) goto ReadAgain;\r\n\r\n\t\t\t\t\tCdGetSector((u_long *)&chunk, CHUNKSIZE / 4);\r\n\r\n\t\t\t\t\tif (bytestocopy < CHUNKSIZE)\r\n\t\t\t\t\t\tbytestocopy = 0;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tbytestocopy += -CHUNKSIZE;\r\n\r\n\t\t\t\t\tSpuIsTransferCompleted(SPU_TRANSFER_WAIT);\r\n\t\t\t\t\tcountbytes = wess_dig_lcd_data_read(chunk, destptr, sampblk, override);\r\n\t\t\t\t\treadbytes += countbytes;\r\n\t\t\t\t\tdestptr += countbytes;\r\n\t\t\t\t\tread2 = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (lcd_cd_status != CdlDiskError)\r\n\t\t{\r\n\t\t\tCdControl(CdlPause, 0, 0);\r\n\t\t\tif (wess_dig_lcd_psxcd_sync() == 0)\r\n\t\t\t{\r\n\t\t\t\tSpuIsTransferCompleted(SPU_TRANSFER_WAIT);\r\n\t\t\t\tpsxcd_enable_callbacks();\r\n\t\t\t\treturn (readbytes);\r\n\t\t\t}\r\n\t\t}\r\n\t} while (true);\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/LCDLOAD.H",
    "content": "    /*------------------------------------------------------------------*/\r\n    /*\r\n                      Williams Entertainment Sound System\r\n                             by Scott Patterson\r\n\r\n                   Application Programming Interface Routines:\r\n\r\n                   - digital (in linear .LCD file) load functions\r\n    */\r\n    /*------------------------------------------------------------------*/\r\n\r\n#define SAMPLE_RECORD_SIZE 100\r\n\r\ntypedef struct SampleBlock {\r\n    unsigned short numsamps;//r*\r\n    unsigned short sampindx[SAMPLE_RECORD_SIZE];//r*2\r\n    unsigned short samppos[SAMPLE_RECORD_SIZE];//r*4\r\n}SampleBlock;\r\n\r\nextern int wess_dig_lcd_loader_init(void *input_pm_stat);\r\n\r\nextern void wess_dig_set_sample_position(int samplenum, char *samplepos);\r\n\r\nextern int wess_dig_lcd_load(char *lcdfilename,void *memptr,SampleBlock *sampblk, int override);\r\n\r\n\r\n"
  },
  {
    "path": "PSXDOOM/MAIN.LNK",
    "content": "\r\n\torg\t$80010000\r\n\r\ntext\tgroup\t\t\t\t; main text group\r\nbss\tgroup\tbss\t\t\t; main data group\r\n\r\n\tsection\t.rdata,text\t; main sections\r\n\tsection\t.text,text\r\n\tsection\t.data,text\r\n\tsection\t.sdata,text\r\n\r\n\tsection\t.sbss,bss\t; The bss sections\r\n\tsection\t.bss,bss\r\n\r\n\t;\r\n\t; Object files\r\n\t;\r\n\r\n\tinclude\t\"obj\\d_main.obj\"\r\n\tinclude\t\"obj\\info.obj\"\r\n\tinclude\t\"obj\\sprinfo.obj\"\r\n\tinclude\t\"obj\\g_game.obj\"\r\n\tinclude\t\"obj\\p_base.obj\"\r\n\tinclude\t\"obj\\p_ceilng.obj\"\r\n\tinclude\t\"obj\\p_change.obj\"\r\n\tinclude\t\"obj\\p_doors.obj\"\r\n\tinclude\t\"obj\\p_enemy.obj\"\r\n\tinclude\t\"obj\\p_floor.obj\"\r\n\tinclude\t\"obj\\p_inter.obj\"\r\n\tinclude\t\"obj\\p_lights.obj\"\r\n\tinclude\t\"obj\\p_map.obj\"\r\n\tinclude\t\"obj\\p_maputl.obj\"\r\n\tinclude\t\"obj\\p_mobj.obj\"\r\n\tinclude\t\"obj\\p_move.obj\"\r\n\tinclude\t\"obj\\p_plats.obj\"\r\n\tinclude\t\"obj\\p_pspr.obj\"\r\n\tinclude\t\"obj\\p_setup.obj\"\r\n\tinclude\t\"obj\\p_shoot.obj\"\r\n\tinclude\t\"obj\\p_sight.obj\"\r\n\tinclude\t\"obj\\p_slide.obj\"\r\n\tinclude\t\"obj\\p_spec.obj\"\r\n\tinclude\t\"obj\\p_switch.obj\"\r\n\tinclude\t\"obj\\p_telept.obj\"\r\n\tinclude\t\"obj\\p_tick.obj\"\r\n\tinclude\t\"obj\\p_user.obj\"\r\n\tinclude\t\"obj\\r_phase1.obj\"\r\n\tinclude\t\"obj\\r_phase2.obj\"\r\n\tinclude\t\"obj\\r_data.obj\"\r\n\tinclude\t\"obj\\r_main.obj\"\r\n\tinclude\t\"obj\\vsprintf.obj\"\r\n\tinclude\t\"obj\\w_wad.obj\"\r\n\tinclude\t\"obj\\psx_file.obj\"\r\n\tinclude\t\"obj\\z_zone.obj\"\r\n\tinclude\t\"obj\\psxmain.obj\"\r\n\t;include\t\"obj\\psxmain_mip.obj\" ;//-----MIPS\r\n\tinclude\t\"obj\\l_main.obj\"\r\n\tinclude\t\"obj\\t_main.obj\"\r\n\tinclude\t\"obj\\m_main.obj\"\r\n\tinclude\t\"obj\\c_main.obj\"\r\n\tinclude\t\"obj\\pw_main.obj\"\r\n\tinclude\t\"obj\\cf_main.obj\"\r\n\tinclude\t\"obj\\m_password.obj\"\r\n\tinclude\t\"obj\\st_main.obj\"\r\n\tinclude\t\"obj\\am_main.obj\"\r\n\tinclude\t\"obj\\in_main.obj\"\r\n\tinclude\t\"obj\\f_main.obj\"\r\n\tinclude\t\"obj\\o_main.obj\"\r\n\tinclude\t\"obj\\m_fixed.obj\"\r\n\tinclude\t\"obj\\tables.obj\"\r\n\tinclude\t\"obj\\psxcd.obj\"\r\n\tinclude\t\"obj\\s_sound.obj\"\r\n\tinclude\t\"obj\\psxspu.obj\"\r\n\tinclude\t\"obj\\psxcmd.obj\"\r\n\tinclude\t\"obj\\wessapip.obj\"\r\n\tinclude\t\"obj\\wessapi.obj\"\r\n\tinclude\t\"obj\\wessarc.obj\"\r\n\tinclude\t\"obj\\wessapit.obj\"\r\n\tinclude\t\"obj\\wessseq.obj\"\r\n\tinclude\t\"obj\\seqload.obj\"\r\n\tinclude\t\"obj\\lcdload.obj\"\r\n\tinclude\t\"obj\\wessapim.obj\"\r\n\tinclude\t\"obj\\seqloadr.obj\"\r\n\r\n\tinclude\t\"obj\\wessbase.obj\"\r\n\r\n\tinclude \"obj\\snmain.obj\"\r\n\r\n\t;\r\n\t; Library files\r\n\t;\r\n\r\n\tinclib \"C:\\psyq\\lib\\libsn.lib\"\r\n\tinclib \"C:\\psyq\\lib\\libapi.lib\"\r\n\tinclib \"C:\\psyq\\lib\\libetc.lib\"\r\n\tinclib \"C:\\psyq\\lib\\libgpu.lib\"\r\n\tinclib \"C:\\psyq\\lib\\libgte.lib\"\r\n\tinclib \"C:\\psyq\\lib\\libspu.lib\"\r\n\tinclib \"C:\\psyq\\lib\\libc.lib\"\r\n\tinclib \"C:\\psyq\\lib\\libcd.lib\"\r\n\tinclib \"C:\\psyq\\lib\\libc2.lib\"\r\n\tinclib \"C:\\psyq\\lib\\libcomb.lib\"\r\n\r\n\t; The following line initializes the program counter register so\r\n\t; that the downloader sets the entry point before the program\r\n\t; is executed.  SN_ENTRY_POINT is defined in a module in\r\n\t; ligsn.lib and clears the bss, sets up the heap, etc., before\r\n\t; calling main().\r\n\r\n\tregs\tpc=__SN_ENTRY_POINT\t; entry point\r\n\r\n"
  },
  {
    "path": "PSXDOOM/MAKEFILE.bat",
    "content": "@echo off\r\nset PATH=C:\\psyq\\bin\r\nset PSYQ_PATH=C:\\psyq\\bin\r\n\r\n::remove_all:\r\n\tdel obj\\*.obj\r\n\tdel asm\\*.s\r\n@echo on\r\n\r\n::all:\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/d_main.obj  d_main.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/info.obj  info.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/sprinfo.obj  sprinfo.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/g_game.obj  g_game.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/p_base.obj  p_base.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/p_ceilng.obj  p_ceilng.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/p_change.obj  p_change.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/p_doors.obj  p_doors.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/p_enemy.obj  p_enemy.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/p_floor.obj  p_floor.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/p_inter.obj  p_inter.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/p_lights.obj  p_lights.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/p_map.obj  p_map.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/p_maputl.obj  p_maputl.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/p_mobj.obj  p_mobj.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/p_move.obj  p_move.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/p_plats.obj  p_plats.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/p_pspr.obj  p_pspr.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/p_setup.obj  p_setup.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/p_shoot.obj  p_shoot.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/p_sight.obj  p_sight.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/p_slide.obj  p_slide.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/p_spec.obj  p_spec.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/p_switch.obj  p_switch.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/p_telept.obj  p_telept.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/p_tick.obj  p_tick.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/p_user.obj  p_user.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/r_phase1.obj  r_phase1.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/r_phase2.obj  r_phase2.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/r_data.obj  r_data.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/r_main.obj  r_main.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/vsprintf.obj  vsprintf.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/w_wad.obj  w_wad.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/psx_file.obj  psx_file.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/z_zone.obj  z_zone.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/psxmain.obj  psxmain.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/l_main.obj  l_main.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/t_main.obj  t_main.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/m_main.obj  m_main.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/c_main.obj  c_main.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/pw_main.obj  pw_main.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/cf_main.obj  cf_main.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/m_password.obj  m_password.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/st_main.obj  st_main.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/am_main.obj  am_main.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/in_main.obj  in_main.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/f_main.obj  f_main.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/o_main.obj  o_main.c\r\n\t::ccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/m_fixed.obj  m_fixed.c\r\n\tasmpsx /l m_fixed.s,obj\\m_fixed.obj\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/tables.obj  tables.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/psxcd.obj  psxcd.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/s_sound.obj  s_sound.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/psxspu.obj  psxspu.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/psxcmd.obj  psxcmd.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/wessapip.obj  wessapip.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/wessapi.obj  wessapi.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/wessarc.obj  wessarc.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/wessapit.obj  wessapit.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/wessseq.obj  wessseq.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/seqload.obj  seqload.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/lcdload.obj  lcdload.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/wessapim.obj  wessapim.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/seqloadr.obj  seqloadr.c\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj/wessbase.obj  wessbase.c\r\n\tasmpsx /l snmain.s,obj\\snmain.obj\r\n\r\n::child:\r\n\tccpsx -comments-c++ -Wreturn-type -c -O2 -g -o obj\\psxmain.obj  psxmain.c\r\n\tpsylink /m /g /c /q /o$80010000 @main.lnk,main.cpe,main.sym,main.map\r\n\t::cpe2x main.cpe\r\n\tcpe2x_gec main.cpe\r\n\r\n@echo off\r\n::asm:\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\d_main.s d_main.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\info.s info.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\sprinfo.s sprinfo.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\g_game.s g_game.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\p_base.s p_base.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\p_ceilng.s p_ceilng.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\p_change.s p_change.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\p_doors.s p_doors.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\p_enemy.s p_enemy.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\p_floor.s p_floor.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\p_inter.s p_inter.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\p_lights.s p_lights.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\p_map.s p_map.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\p_maputl.s p_maputl.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\p_mobj.s p_mobj.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\p_move.s p_move.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\p_plats.s p_plats.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\p_pspr.s p_pspr.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\p_setup.s p_setup.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\p_shoot.s p_shoot.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\p_sight.s p_sight.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\p_slide.s p_slide.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\p_spec.s p_spec.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\p_switch.s p_switch.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\p_telept.s p_telept.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\p_tick.s p_tick.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\p_user.s p_user.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\r_phase1.s r_phase1.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\r_phase2.s r_phase2.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\r_data.s r_data.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\r_main.s r_main.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\vsprintf.s vsprintf.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\w_wad.s  w_wad.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\psx_file.s  psx_file.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\z_zone.s z_zone.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\psxmain.s psxmain.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\l_main.s l_main.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\t_main.s t_main.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\m_main.s m_main.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\c_main.s c_main.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\pw_main.s pw_main.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\cf_main.s cf_main.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\m_password.s m_password.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\st_main.s st_main.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\am_main.s am_main.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\in_main.s in_main.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\f_main.s f_main.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\o_main.s o_main.c\r\n\t::ccpsx -O2 -S -Xo$80010000 -o asm\\m_fixed.s m_fixed.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\tables.s tables.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\psxcd.s psxcd.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\s_sound.s s_sound.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\psxspu.s psxspu.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\psxcmd.s psxcmd.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\wessapip.s wessapip.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\wessapi.s wessapi.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\wessarc.s wessarc.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\wessapit.s wessapit.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\wessseq.s wessseq.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\seqload.s seqload.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\lcdload.s lcdload.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\wessapim.s wessapim.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\seqloadr.s seqloadr.c\r\n\tccpsx -O2 -S -Xo$80010000 -o asm\\wessbase.s wessbase.c\r\n\r\n@echo on\r\n\r\n@echo off\r\n\tcopy main.exe GAME\r\n@echo on\r\npause\r\n"
  },
  {
    "path": "PSXDOOM/PSXCD.C",
    "content": "// Reconstruido Y Verificado por Erick Vasquez Garcia 16/05/2019 [GEC]\r\n// Update_1 20/10/2019 [GEC]\r\n// Update_2 32/01/2020 [GEC]\r\n\r\n    /*------------------------------------------------------------------*/\r\n    /*\r\n                     Sony CD Architecture Specific Routines\r\n                            by Scott Patterson\r\n\r\n                     development and testing period on this code:\r\n                            4/18/95 - 9/28/95\r\n    */\r\n    /*------------------------------------------------------------------*/\r\n\r\n#include <kernel.h>\r\n#include \"wessapi.h\"\r\n#include \"psxcd.h\"\r\n#include \"psxspu.h\"\r\n\r\n// undeclared SONY prototypes\r\n//extern void CdInit(void);\r\n\r\n#if _CD_VERSION_ == 1\r\n\r\n// CD Stuff\r\n// CD Stuff\r\n// CD Stuff\r\n// CD Stuff\r\n\r\n#if _CD_ABS_OPEN_ == 1\r\n  //lets just put this table in this file\r\n  #include \"psxcdabs.c\"\r\n#endif\r\n\r\n// private variables\r\nstatic volatile int seeking_for_play = 0;\r\nstatic volatile int waiting_for_pause = 0;\r\nstatic volatile int async_on = 0;\r\nstatic CdlLOC sectorbuf_contents = {0,0,0,0};\r\n\r\nstatic void psxcd_memcpy(void *pdest, void *psrc, unsigned long bytestocopy);\r\n\r\n//static void (*cd_pause_callback)(void) = 0;\r\n\r\nstatic u_long cbsyncsave;\r\nstatic u_long cbreadysave;\r\nstatic void cbcomplete(int intr, u_char *result);\r\nstatic void cbready(int intr, u_char *result);\r\n\r\nstatic int psxcd_mode = -1; //initially an undefined mode\r\nstatic int IsCdInit = 0;\r\nstatic int init_pos = 0;\r\n\r\nstatic PsxCd_File cdfile;\r\nstatic CdlLOC cur_io_loc = {0,0,0,0};\r\n\r\nint cb_enable_flag = 0;\r\nint critical_error = 0;\r\nint cdl_intr = 0;\r\nint cdl_errintr = 0;\r\nint cdl_errcount = 0;\r\nunsigned char cdl_stat = 0;\r\nunsigned char cdl_errstat = 0;\r\nunsigned char cdl_com = CdlPause;\r\nunsigned char cdl_errcom = 0;\r\nint readcount = 0;\r\nint playcount = 0;\r\n\r\nchar sectorbuf[CD_ROM_SECTOR_SIZE];\r\n\r\nstatic char cd_param[8] = {0,0,0,0,0,0,0,0};\r\n\r\n// CD ASYNC CHECKING\r\nstatic int  sync_intr = 0;//iGp000007c4 80077BD4\r\nstatic char sync_result[8] = {0,0,0,0,0,0,0,0};//80077bd8\r\nstatic int  check_intr = 0;\r\nstatic char check_result[8] = {0,0,0,0,0,0,0,0};\r\n\r\n// CD ASYNC STUFF\r\n#define PSXCD_COMMAND_END       0\r\n#define PSXCD_COMMAND_COPY      1\r\n#define PSXCD_COMMAND_SEEK      2\r\n#define PSXCD_COMMAND_READ      3\r\n#define PSXCD_COMMAND_READCOPY  4\r\n\r\ntypedef struct PsxCd_Command {\r\n    int     command;\r\n    int     amount; //sectors or bytes\r\n    char   *pdest;  //buffer or direct\r\n    char   *psrc;  //buffer pos\r\n    CdlLOC  io_loc;\r\n}PsxCd_Command;\r\n\r\nstatic int cur_cmd = 0;\r\nstatic PsxCd_Command psxcd_cmd[5];\r\n\r\nstatic void *lastdestptr = 0;\r\nstatic int lastreadbytes = 0;\r\nstatic PsxCd_File newfilestruct;\r\nstatic PsxCd_File lastfilestruct;\r\n\r\n// CD-DA play stuff\r\nstatic int playflag = 0;\r\nstatic int playvol = 0;\r\nstatic int playfadeuptime = 0;\r\nstatic int looptrack = 0;\r\nstatic int loopflag = 0;\r\nstatic int loopvol = 0;\r\nstatic int loopsectoroffset = 0;\r\nstatic int loopfadeuptime = 0;\r\nstatic CdlLOC  cdloc = {0,0,0,0};\r\nstatic CdlATV  cdatv = {0,0,0,0};\r\nstatic CdlLOC  loc[100];\r\nstatic CdlLOC  newloc = {0,0,0,0};\r\nstatic CdlLOC  lastloc = {0,0,0,0};\r\nstatic CdlLOC  beginloc = {0,0,0,0};\r\n\r\nstatic void psxcd_memcpy(void *pdest, void *psrc, unsigned long bytestocopy)//L8003EF70()\r\n{\r\n    while(bytestocopy--)\r\n    {\r\n        *(char *)pdest++ = *(char *)psrc++;\r\n    }\r\n}\r\n\r\nextern volatile unsigned long millicount;\r\n\r\nstatic void psxcd_sync(void)//8003EFA4\r\n{\r\n    unsigned long block;\r\n\r\n    block = millicount;\r\n    block += 8000;\r\n\r\n    while(millicount<block)\r\n    {\r\n        sync_intr = CdSync(1,(u_char *)sync_result);\r\n        if(sync_intr==CdlDiskError)\r\n        {\r\n            CdFlush();\r\n            cdl_errintr = sync_intr + 80; //to give us unique error numbers\r\n            cdl_errcom = cdl_com;\r\n            cdl_errstat = sync_result[0];\r\n            cdl_errcount++;\r\n        }\r\n        if(sync_intr==CdlComplete) return;\r\n    }\r\n}\r\n\r\nstatic int psxcd_critical_sync(void)//8003F060\r\n{\r\n    unsigned long block;\r\n\r\n    block = millicount;\r\n    block += 8000;\r\n\r\n    while(millicount<block)\r\n    {\r\n        sync_intr = CdSync(1,(u_char *)sync_result);\r\n        if(sync_intr==CdlDiskError)\r\n        {\r\n            CdFlush();\r\n            cdl_errintr = sync_intr + 70; //to give us unique error numbers\r\n            cdl_errcom = cdl_com;\r\n            cdl_errstat = sync_result[0];\r\n            cdl_errcount++;\r\n            return(0);\r\n        }\r\n        if(sync_intr==CdlComplete) return(1);\r\n    }\r\n    return(0);\r\n}\r\n\r\nstatic void cbcomplete(int intr, u_char *result)//8003F11C\r\n{\r\n    if(!cb_enable_flag) return;\r\n\r\n    //cdl_intr = intr + 10; //to give us unique error numbers\r\n    //cdl_stat = result[0];\r\n    if(intr == CdlComplete)\r\n    {\r\n        if(cdl_com==CdlSeekP)\r\n        {\r\n            seeking_for_play = 0;\r\n            if(playflag)\r\n            {\r\n                #if _CD_SPU_LINK_ == 1\r\n                 psxspu_setcdmixon();\r\n                 if(playfadeuptime)\r\n                 {\r\n                    psxspu_set_cd_vol(0);\r\n                    psxspu_start_cd_fade(playfadeuptime,playvol);\r\n                    playfadeuptime = 0;\r\n                 } else {\r\n                    psxspu_set_cd_vol(playvol);\r\n                 }\r\n                #endif\r\n\r\n                CdControlF(cdl_com=CdlPlay,0);\r\n            }\r\n        } else if(cdl_com==CdlPause) {\r\n            waiting_for_pause = 0;\r\n        }\r\n    } else {\r\n        // error = intr\r\n        cdl_errintr = intr + 10; //to give us unique error numbers\r\n        cdl_errcom = cdl_com;\r\n        cdl_errstat = result[0];\r\n        cdl_errcount++;\r\n        //if((cdl_com==CdlSeekP)&&(result[0]&2))\r\n        //{\r\n        //    CdControlF(cdl_com=CdlSeekP,(u_char *)&cdloc);\r\n        //}\r\n    }\r\n}\r\n\r\nstatic void cbready(int intr, u_char *result)//8003F200\r\n{\r\n    if(!cb_enable_flag) return;\r\n\r\n    cdl_intr = intr;\r\n    cdl_stat = result[0];\r\n    if((result[0]&CdlStatRead)&&async_on&&(cdl_com==CdlReadN))\r\n    {\r\n        //if shell open, hang till closed then reread\r\n        readcount++;\r\n        if (intr == CdlDataReady)\r\n        {\r\n            switch(psxcd_cmd[cur_cmd].command)\r\n            {\r\n                case PSXCD_COMMAND_READ:\r\n                    //if((!CdGetSector((u_long *)psxcd_cmd[cur_cmd].pdest, 2048/4))||(result[0]!=0x22))\r\n                    //{\r\n                    //    cdl_errintr = 50;\r\n                    //    cdl_errcom = cdl_com;\r\n                    //    cdl_errstat = result[0];\r\n                    //    cdl_errcount++;\r\n                    //    ////reissue the last read command\r\n                    //    //newfilestruct = lastfilestruct;\r\n                    //    //psxcd_async_read(lastdestptr,lastreadbytes,&newfilestruct);\r\n                    //    return;\r\n                    //}\r\n                    // must check for quad align!!!!\r\n                    if((unsigned long)psxcd_cmd[cur_cmd].pdest&3)\r\n                    {\r\n                        CdGetSector((u_long *)sectorbuf, 2048/4);\r\n                        psxcd_memcpy(psxcd_cmd[cur_cmd].pdest,\r\n                                     sectorbuf,\r\n                                     2048);\r\n                    } else {\r\n                        CdGetSector((u_long *)psxcd_cmd[cur_cmd].pdest, 2048/4);\r\n                    }\r\n                    psxcd_cmd[cur_cmd].pdest += 2048;\r\n                    if(!--psxcd_cmd[cur_cmd].amount)\r\n                    {\r\n                        cur_cmd++;\r\n                    }\r\n                    break;\r\n\r\n                case PSXCD_COMMAND_READCOPY:\r\n                    //if((!CdGetSector((u_long *)sectorbuf, 2048/4))||(result[0]!=0x22))\r\n                    //{\r\n                    //    cdl_errintr = 50;\r\n                    //    cdl_errcom = cdl_com;\r\n                    //    cdl_errstat = result[0];\r\n                    //    cdl_errcount++;\r\n                    //    //reissue the last read command\r\n                    //    //newfilestruct = lastfilestruct;\r\n                    //    //psxcd_async_read(lastdestptr,lastreadbytes,&newfilestruct);\r\n                    //    return;\r\n                    //}\r\n                    CdGetSector((u_long *)sectorbuf, 2048/4);\r\n                    psxcd_memcpy(psxcd_cmd[cur_cmd].pdest,\r\n                                 psxcd_cmd[cur_cmd].psrc,\r\n                                 psxcd_cmd[cur_cmd].amount);\r\n                    cur_cmd++;\r\n                    break;\r\n\r\n                default:\r\n                    psxcd_cmd[cur_cmd].command = PSXCD_COMMAND_END;\r\n                    break;\r\n\r\n            }\r\n\r\n            if(psxcd_cmd[cur_cmd].command == PSXCD_COMMAND_END)\r\n            {\r\n                async_on = 0;\r\n                waiting_for_pause = 1;\r\n                CdControlF(cdl_com=CdlPause, 0);\r\n            }\r\n\r\n            return;\r\n        } else {\r\n            // error = intr\r\n            if(intr==CdlDiskError)\r\n            {\r\n                CdFlush();\r\n                critical_error = 1;\r\n            }\r\n            cdl_errintr = intr;\r\n            cdl_errcom = cdl_com;\r\n            cdl_errstat = result[0];\r\n            cdl_errcount++;\r\n\r\n            //reissue the last read command\r\n            //newfilestruct = lastfilestruct;\r\n            //psxcd_async_read(lastdestptr,lastreadbytes,&newfilestruct);\r\n            return;\r\n        }\r\n    }\r\n\r\n\r\n    if(result[0]&CdlStatPlay/*cdl_com==CdlPlay*/)\r\n    {\r\n        //if shell open, hang till closed then restart play\r\n        if (intr == CdlDataReady)\r\n        {\r\n            if ((result[4]&0x80) == 0)\r\n            {\r\n                playcount++;\r\n                newloc.track = btoi(result[1]);\r\n                newloc.minute = result[3];\r\n                newloc.second = result[4];\r\n                newloc.sector = result[5];\r\n                //vol   = (result[6]<<8)|result[7];\r\n            }\r\n\r\n            return;\r\n        } else {\r\n            // error = intr\r\n            // intr==CdlDataEnd means end of track\r\n            if(intr==CdlDataEnd)\r\n            {\r\n                *(int *)&lastloc = 0;\r\n                cdl_com = CdlNop;\r\n                //if playflag and loopflag, play again\r\n                if(playflag||loopflag) //if(playflag&&loopflag)\r\n                {\r\n                    psxcd_play_at_andloop(looptrack, loopvol, loopsectoroffset, loopfadeuptime,\r\n                                           looptrack, loopvol, loopsectoroffset, loopfadeuptime);\r\n                }\r\n            } else {\r\n                if(intr==CdlDiskError)\r\n                {\r\n                    CdFlush();\r\n                }\r\n                cdl_errintr = intr + 20; //to give us unique error numbers\r\n                cdl_errcom = cdl_com;\r\n                cdl_errstat = result[0];\r\n                cdl_errcount++;\r\n            }\r\n\r\n            return;\r\n        }\r\n    }\r\n\r\n    //if(intr==CdlDiskError)\r\n    //{\r\n    //    CdFlush();\r\n    //}\r\n    //we only get here if there is an error\r\n    cdl_errintr = intr + 30; //to give us unique error numbers\r\n    cdl_errcom = cdl_com;\r\n    cdl_errstat = result[0];\r\n    cdl_errcount++;\r\n}\r\n\r\n#endif //_CD_VERSION_\r\n\r\nvoid psxcd_disable_callbacks(void)//8003F604\r\n{\r\n#if _CD_VERSION_ == 1\r\n    cb_enable_flag = 0;\r\n#endif\r\n}\r\n\r\nvoid psxcd_enable_callbacks(void)//8003F610\r\n{\r\n#if _CD_VERSION_ == 1\r\n    cb_enable_flag = 1;\r\n#endif\r\n}\r\n\r\nvoid psxcd_init(void)//8003F620\r\n{\r\n#if _CD_VERSION_ == 1\r\n\r\n    int i,ntoc;\r\n\r\n    if(IsCdInit)\r\n    {\r\n        return;\r\n    }\r\n\r\n    CdInit();\r\n\r\n    IsCdInit = 1;\r\n\r\n    for(i=0;i<100;i++)\r\n    {\r\n        loc[i].minute = 0;\r\n        loc[i].second = 0;\r\n        loc[i].sector = 0;\r\n        loc[i].track = 0;\r\n    }\r\n\r\n    #if _CD_SPU_LINK_ == 1\r\n     psxspu_init();\r\n    #endif\r\n\r\n    if((ntoc=CdGetToc(loc)) == 0)\r\n    {\r\n        //printf(\"No TOC found: please use CD-DA disc...\\n\");\r\n        return;\r\n    }\r\n\r\n    init_pos = 0;\r\n    async_on = 0;\r\n    cbsyncsave = (u_long)CdSyncCallback((CdlCB)cbcomplete);\r\n    cbreadysave = (u_long)CdReadyCallback((CdlCB)cbready);\r\n\r\n    psxcd_enable_callbacks();\r\n\r\n#else\r\n    return;\r\n#endif\r\n}\r\n\r\nvoid psxcd_exit(void)//8003F6FC\r\n{\r\n#if _CD_VERSION_ == 1\r\n    CdSyncCallback((void *)cbsyncsave);\r\n    CdReadyCallback((void *)cbreadysave);\r\n#else\r\n    return;\r\n#endif\r\n}\r\n\r\nvoid psxcd_set_data_mode(void)//8003F72C\r\n{\r\n#if _CD_VERSION_ == 1\r\n    //int millitemp;\r\n\r\n    if(psxcd_mode!=1)\r\n    {\r\n        playflag = 0; // ensure no SeekP callback activity\r\n        loopflag = 0;\r\n        seeking_for_play = 0;\r\n\r\n        #if _CD_SPU_LINK_ == 1\r\n         if(psxspu_get_cd_vol())\r\n         {\r\n             psxspu_start_cd_fade(FADE_TIME,0);\r\n             while(psxspu_get_cd_fade_status());\r\n         }\r\n         psxspu_setcdmixoff();\r\n        #endif\r\n\r\n        psxcd_sync(); // to ensure no pending pauses...\r\n\r\n        cd_param[0] = CdlModeSpeed;  //|CdlModeRept not necessary\r\n\r\n        CdControl(cdl_com=CdlSetmode, cd_param, 0);\r\n\r\n        psxcd_mode = 1;\r\n\r\n        //millitemp = millicount;\r\n        //millitemp += 1500;\r\n        //while(millicount<millitemp);\r\n\r\n        psxcd_sync(); // to ensure no pending pauses...\r\n\r\n        CdControl(cdl_com=CdlPause, 0, 0);\r\n\r\n        psxcd_sync(); // to ensure no pending pauses...\r\n\r\n        CdFlush();\r\n\r\n    } else {\r\n        if(async_on)\r\n        {\r\n            psxcd_async_read_cancel();\r\n        }\r\n\r\n        if(cdl_com!=CdlPause)\r\n        {\r\n            psxcd_sync(); // to ensure no pending pauses...\r\n            CdControl(cdl_com=CdlPause, 0, 0);\r\n        }\r\n\r\n        psxcd_sync(); // to ensure no pending pauses...\r\n\r\n        CdFlush();\r\n\r\n    }\r\n#endif\r\n}\r\n\r\n#if _CD_VERSION_ == 1\r\n\r\n #if _CD_ABS_OPEN_ == 1\r\n\r\n  PsxCd_File *psxcd_open(char *filename)//8003F83C\r\n  {\r\n      //printf(\"filename %d\\n\", (int)filename);\r\n      //printf(\"abs %d\\n\", cdmaptbl[(int)filename].abs);\r\n      //printf(\"size %d\\n\", cdmaptbl[(int)filename].size);\r\n\r\n      CdIntToPos(cdmaptbl[(int)filename].abs,&cdfile.file.pos);\r\n      cdfile.file.size = cdmaptbl[(int)filename].size;\r\n      cdfile.new_io_loc = cdfile.file.pos;\r\n\r\n      cdfile.io_block_offset = 0;\r\n      cdfile.io_result[0] = 0;\r\n      cdfile.io_result[1] = 0;\r\n      cdfile.io_result[2] = 0;\r\n      cdfile.io_result[3] = 0;\r\n      cdfile.io_result[4] = 0;\r\n      cdfile.io_result[5] = 0;\r\n      cdfile.io_result[6] = 0;\r\n      cdfile.io_result[7] = 0;\r\n\r\n      return(&cdfile);\r\n\r\n  }\r\n\r\n #else /* _CD_ABS_OPEN_ */\r\n\r\n  PsxCd_File *psxcd_open(char *filename)\r\n  {\r\n      //int dum;\r\n\r\n      psxcd_set_data_mode();\r\n\r\n      cdfile.file.pos.minute = 0;\r\n      cdfile.file.pos.second = 0;\r\n      cdfile.file.pos.sector = 0;\r\n      cdfile.file.pos.track  = 0;\r\n\r\n      if(!CdSearchFile(&cdfile.file,filename))\r\n      {\r\n          return(0);\r\n      }\r\n\r\n      cdfile.new_io_loc = cdfile.file.pos;\r\n\r\n      cdfile.io_block_offset = 0;\r\n      cdfile.io_result[0] = 0;\r\n      cdfile.io_result[1] = 0;\r\n      cdfile.io_result[2] = 0;\r\n      cdfile.io_result[3] = 0;\r\n      cdfile.io_result[4] = 0;\r\n      cdfile.io_result[5] = 0;\r\n      cdfile.io_result[6] = 0;\r\n      cdfile.io_result[7] = 0;\r\n\r\n      return(&cdfile);\r\n\r\n  }\r\n #endif /* _CD_ABS_OPEN_ */\r\n\r\n#endif /* _CD_VERSION_ */\r\n\r\n\r\nvoid psxcd_init_pos(void)//8003F90C\r\n{\r\n#if _CD_VERSION_ == 1\r\n    init_pos = 0;\r\n    playflag = 0;\r\n    loopflag = 0;\r\n    seeking_for_play = 0;\r\n    waiting_for_pause = 0;\r\n    critical_error = 0;\r\n#endif\r\n}\r\n\r\nint psxcd_async_on(void)//8003F92C\r\n{\r\n#if _CD_VERSION_ == 1\r\n    if(async_on)\r\n    {\r\n        check_intr = CdSync(1,(u_char *)check_result);\r\n        if(critical_error ||\r\n           (check_intr==CdlDiskError) ||\r\n           //(check_result[0] & !(CdlStatSeek|CdlStatRead|CdlStatStandby)) || // This line of code are blocked in Psx Doom\r\n           !(check_result[0] & CdlStatStandby))\r\n        {\r\n            CdFlush();\r\n            critical_error = 0;\r\n            cdl_errintr = check_intr + 100; //to give us unique error numbers\r\n            cdl_errcom = cdl_com;\r\n            cdl_errstat = check_result[0];\r\n            cdl_errcount++;\r\n\r\n            //reissue the last read command\r\n            newfilestruct = lastfilestruct;\r\n            psxcd_async_read(lastdestptr,lastreadbytes,&newfilestruct);\r\n        }\r\n        return(1);\r\n    } else {\r\n        return(0);\r\n    }\r\n#else\r\n    return(0);\r\n#endif\r\n}\r\n\r\nint psxcd_seeking_for_play(void)//8003FA34\r\n{\r\n#if _CD_VERSION_ == 1\r\n    if(seeking_for_play)\r\n    {\r\n        check_intr = CdSync(1,(u_char *)check_result);\r\n        if((check_intr==CdlDiskError) ||\r\n           //(check_result[0] & !(CdlStatSeek|CdlStatPlay|CdlStatStandby)) || // This line of code are blocked in Psx Doom\r\n           !(check_result[0] & CdlStatStandby))\r\n        {\r\n            CdFlush();\r\n            cdl_errintr = check_intr + 110; //to give us unique error numbers\r\n            cdl_errcom = cdl_com;\r\n            cdl_errstat = check_result[0];\r\n            cdl_errcount++;\r\n\r\n            //reissue the last play command\r\n            psxcd_sync();\r\n\r\n            CdControlF(cdl_com=CdlSeekP, (u_char *)&lastloc);\r\n        }\r\n        return(1);\r\n    } else {\r\n        return(0);\r\n    }\r\n#else\r\n    return(0);\r\n#endif\r\n}\r\n\r\nint psxcd_waiting_for_pause(void)//8003FAE4\r\n{\r\n#if _CD_VERSION_ == 1\r\n    if(waiting_for_pause)\r\n    {\r\n        check_intr = CdSync(1,(u_char *)check_result);\r\n        if((check_intr==CdlDiskError) ||\r\n           //(check_result[0] & !(CdlStatSeek|CdlStatRead|CdlStatPlay|CdlStatStandby)) || // This line of code are blocked in Psx Doom\r\n           !(check_result[0] & CdlStatStandby))\r\n        {\r\n            CdFlush();\r\n            cdl_errintr = check_intr + 120; //to give us unique error numbers\r\n            cdl_errcom = cdl_com;\r\n            cdl_errstat = check_result[0];\r\n            cdl_errcount++;\r\n\r\n            //reissue the pause command\r\n            psxcd_sync();\r\n\r\n            CdControlF(cdl_com=CdlPause, 0);\r\n        }\r\n        return(1);\r\n    } else {\r\n        return(0);\r\n    }\r\n#else\r\n    return(0);\r\n#endif\r\n}\r\n\r\nint psxcd_read(void *destptr,int readbytes,PsxCd_File *fileptr)//8003FB90\r\n{\r\n    int retbytes;\r\n\r\n    retbytes = psxcd_async_read(destptr, readbytes, fileptr);\r\n\r\n    // wait for Async\r\n    while(psxcd_async_on());\r\n\r\n    return(retbytes);\r\n}\r\n\r\nvoid psxcd_async_read_cancel(void)//8003FBC8\r\n{\r\n#if _CD_VERSION_ == 1\r\n    if(async_on)\r\n    {\r\n        async_on = 0;\r\n        init_pos = 0;\r\n\r\n        psxcd_sync(); // to ensure no pending pauses...\r\n\r\n        waiting_for_pause = 1;\r\n        CdControlF(cdl_com=CdlPause, 0);\r\n    }\r\n#endif\r\n}\r\n\r\nint psxcd_async_read(void *destptr,int readbytes,PsxCd_File *fileptr)//8003FC14\r\n{\r\n#if _CD_VERSION_ == 1\r\n\r\n    int read_setup_failure;\r\n    int sectors;\r\n    char *pdest;\r\n    unsigned long bytestoread,byteoffset,bytestocopy,bytesofblocks;\r\n\r\n    if(!readbytes)\r\n    {\r\n        return(0);\r\n    }\r\n\r\n    if(*(int *)&fileptr->file.pos==0)\r\n    {\r\n        return(0);\r\n    }\r\n\r\n    do\r\n    {\r\n        sectors = 0;\r\n        read_setup_failure = 0;\r\n\r\n        psxcd_set_data_mode();\r\n\r\n        lastdestptr = destptr;\r\n        lastreadbytes = readbytes;\r\n        lastfilestruct = *fileptr;\r\n\r\n        // pause check is later in this function\r\n\r\n        cur_cmd = 0;\r\n\r\n        pdest = (char *)destptr;\r\n        bytestoread = readbytes;\r\n        byteoffset = fileptr->io_block_offset;\r\n\r\n        // if read begins inside block:\r\n\r\n        if(byteoffset && bytestoread)\r\n        {\r\n            if(!init_pos||(*(long *)&cur_io_loc!=*(long *)&fileptr->new_io_loc))\r\n            {\r\n                psxcd_cmd[cur_cmd].command = PSXCD_COMMAND_SEEK;\r\n                psxcd_cmd[cur_cmd].io_loc = fileptr->new_io_loc;\r\n                cur_cmd++;\r\n\r\n                cur_io_loc = fileptr->new_io_loc;\r\n\r\n                init_pos = 1;\r\n            }\r\n\r\n            bytestocopy = CD_ROM_SECTOR_SIZE-byteoffset;\r\n            if(bytestocopy>bytestoread)\r\n            {\r\n                bytestocopy = bytestoread;\r\n            }\r\n\r\n            if(cur_cmd||(*(long *)&sectorbuf_contents!=*(long *)&cur_io_loc))\r\n            {\r\n                psxcd_cmd[cur_cmd].command = PSXCD_COMMAND_READCOPY;\r\n                psxcd_cmd[cur_cmd].amount = bytestocopy;\r\n                psxcd_cmd[cur_cmd].pdest = pdest;\r\n                psxcd_cmd[cur_cmd].psrc = sectorbuf + byteoffset;\r\n                psxcd_cmd[cur_cmd].io_loc = cur_io_loc;\r\n                cur_cmd++;\r\n\r\n                sectorbuf_contents = cur_io_loc;\r\n            } else {\r\n                psxcd_cmd[cur_cmd].command = PSXCD_COMMAND_COPY;\r\n                psxcd_cmd[cur_cmd].amount = bytestocopy;\r\n                psxcd_cmd[cur_cmd].pdest = pdest;\r\n                psxcd_cmd[cur_cmd].psrc = sectorbuf + byteoffset;\r\n                cur_cmd++;\r\n\r\n            }\r\n\r\n            bytestoread -= bytestocopy;\r\n            pdest += bytestocopy;\r\n            fileptr->io_block_offset = byteoffset + bytestocopy;\r\n            if(fileptr->io_block_offset==CD_ROM_SECTOR_SIZE)\r\n            {\r\n                CdIntToPos(CdPosToInt(&cur_io_loc) + 1,&cur_io_loc);\r\n                fileptr->new_io_loc = cur_io_loc;\r\n                fileptr->io_block_offset = 0;\r\n            }\r\n        }\r\n\r\n        // for block aligned reading:\r\n\r\n        if(bytestoread>=CD_ROM_SECTOR_SIZE)\r\n        {\r\n            sectors = bytestoread/CD_ROM_SECTOR_SIZE;\r\n            bytesofblocks = sectors*CD_ROM_SECTOR_SIZE;\r\n\r\n            if(!init_pos||(*(long *)&cur_io_loc!=*(long *)&fileptr->new_io_loc))\r\n            {\r\n                psxcd_cmd[cur_cmd].command = PSXCD_COMMAND_SEEK;\r\n                psxcd_cmd[cur_cmd].io_loc = fileptr->new_io_loc;\r\n                cur_cmd++;\r\n\r\n                cur_io_loc = fileptr->new_io_loc;\r\n\r\n                init_pos = 1;\r\n            }\r\n\r\n            psxcd_cmd[cur_cmd].command = PSXCD_COMMAND_READ;\r\n            psxcd_cmd[cur_cmd].amount = sectors;\r\n            psxcd_cmd[cur_cmd].pdest = pdest;\r\n            if((unsigned long)pdest&3)\r\n            {\r\n                CdIntToPos(CdPosToInt(&cur_io_loc) + sectors - 1,&sectorbuf_contents);\r\n            }\r\n            psxcd_cmd[cur_cmd].io_loc = cur_io_loc;\r\n            cur_cmd++;\r\n\r\n            pdest += bytesofblocks;\r\n            bytestoread -= bytesofblocks;\r\n\r\n            CdIntToPos(CdPosToInt(&cur_io_loc) + sectors,&cur_io_loc);\r\n\r\n            fileptr->io_block_offset = 0;\r\n            fileptr->new_io_loc = cur_io_loc;\r\n        }\r\n\r\n        // if read ends inside block:\r\n\r\n        if(bytestoread)\r\n        {\r\n            if(!init_pos||(*(long *)&cur_io_loc!=*(long *)&fileptr->new_io_loc))\r\n            {\r\n                psxcd_cmd[cur_cmd].command = PSXCD_COMMAND_SEEK;\r\n                psxcd_cmd[cur_cmd].io_loc = fileptr->new_io_loc;\r\n                cur_cmd++;\r\n\r\n                cur_io_loc = fileptr->new_io_loc;\r\n\r\n                init_pos = 1;\r\n            }\r\n\r\n            psxcd_cmd[cur_cmd].command = PSXCD_COMMAND_READCOPY;\r\n            psxcd_cmd[cur_cmd].amount = bytestoread;\r\n            psxcd_cmd[cur_cmd].pdest = pdest;\r\n            psxcd_cmd[cur_cmd].psrc = sectorbuf;\r\n            psxcd_cmd[cur_cmd].io_loc = cur_io_loc;\r\n            cur_cmd++;\r\n\r\n            sectorbuf_contents = cur_io_loc;\r\n\r\n            fileptr->io_block_offset = bytestoread;\r\n        }\r\n\r\n        psxcd_cmd[cur_cmd].command = PSXCD_COMMAND_END;\r\n        cur_cmd = 0;\r\n\r\n        // if we are just a copy , then skip all the async stuff\r\n        if(psxcd_cmd[cur_cmd].command == PSXCD_COMMAND_COPY)\r\n        {\r\n            // do copy\r\n            psxcd_memcpy(psxcd_cmd[cur_cmd].pdest,\r\n                         psxcd_cmd[cur_cmd].psrc,\r\n                         psxcd_cmd[cur_cmd].amount);\r\n            // increment cur_cmd\r\n            cur_cmd++;\r\n            // set to end\r\n            if(psxcd_cmd[cur_cmd].command == PSXCD_COMMAND_END)\r\n            {\r\n                return(readbytes);\r\n            }\r\n        }\r\n\r\n        // if we seek, start now...\r\n        if(psxcd_cmd[cur_cmd].command == PSXCD_COMMAND_SEEK)\r\n        {\r\n            // do seek\r\n            psxcd_sync();\r\n            CdControl(cdl_com=CdlSetloc,\r\n                      (u_char *)&psxcd_cmd[cur_cmd].io_loc, 0);\r\n            // increment cur_cmd\r\n            cur_cmd++;\r\n            if(psxcd_cmd[cur_cmd].command == PSXCD_COMMAND_END)\r\n            {\r\n                return(readbytes);\r\n            }\r\n        }\r\n\r\n        switch(psxcd_cmd[cur_cmd].command)\r\n        {\r\n            case PSXCD_COMMAND_READ:\r\n            case PSXCD_COMMAND_READCOPY:\r\n                //do read\r\n                if(!psxcd_critical_sync())\r\n                {\r\n                    read_setup_failure = 1;\r\n                    break;\r\n                }\r\n                CdControl(cdl_com=CdlReadN,\r\n                          (u_char *)&psxcd_cmd[cur_cmd].io_loc, 0);\r\n                if(!psxcd_critical_sync())\r\n                {\r\n                    read_setup_failure = 1;\r\n                    break;\r\n                }\r\n                async_on = 1;\r\n                break;\r\n\r\n            case PSXCD_COMMAND_END:\r\n                    return(readbytes);\r\n                break;\r\n\r\n            default:\r\n                    return(0);\r\n                break;\r\n\r\n        }\r\n\r\n        if(read_setup_failure)\r\n        {\r\n            *fileptr = lastfilestruct;\r\n        }\r\n    }while(read_setup_failure);\r\n\r\n    return(readbytes);\r\n\r\n#else\r\n    return(0);\r\n#endif\r\n}\r\n\r\nint psxcd_seek(PsxCd_File *fileptr,int seekpos,int seekmode)//80040444\r\n{\r\n#if _CD_VERSION_ == 1\r\n\r\n    int sector_index;\r\n\r\n    if(*(int *)&fileptr->file.pos==0)\r\n    {\r\n        return(0);\r\n    }\r\n\r\n    if(seekmode==PSXCD_SEEK_SET)\r\n    {\r\n        sector_index = (seekpos / CD_ROM_SECTOR_SIZE) + CdPosToInt(&fileptr->file.pos);\r\n\r\n        CdIntToPos(sector_index,&fileptr->new_io_loc);\r\n        fileptr->io_block_offset = seekpos % CD_ROM_SECTOR_SIZE;\r\n\r\n    } else if(seekmode==PSXCD_SEEK_CUR) {\r\n        sector_index = ((seekpos+fileptr->io_block_offset) / CD_ROM_SECTOR_SIZE) + CdPosToInt(&cur_io_loc);\r\n\r\n        CdIntToPos(sector_index,&fileptr->new_io_loc);\r\n        fileptr->io_block_offset = (seekpos+fileptr->io_block_offset) % CD_ROM_SECTOR_SIZE;\r\n\r\n    } else { //PSXCD_SEEK_END\r\n        sector_index = ((fileptr->file.size-seekpos) / CD_ROM_SECTOR_SIZE) + CdPosToInt(&fileptr->file.pos);\r\n\r\n        CdIntToPos(sector_index,&fileptr->new_io_loc);\r\n        fileptr->io_block_offset = (fileptr->file.size-seekpos) % CD_ROM_SECTOR_SIZE;\r\n    }\r\n    return(0);\r\n\r\n#else\r\n    return(0);\r\n#endif\r\n}\r\n\r\nunsigned long psxcd_tell(PsxCd_File *fileptr)//80040538\r\n{\r\n#if _CD_VERSION_ == 1\r\n\r\n    int sector_index;\r\n\r\n    if(*(int *)&fileptr->file.pos==0)\r\n    {\r\n        return(0);\r\n    }\r\n\r\n    sector_index = CdPosToInt(&fileptr->new_io_loc) - CdPosToInt(&fileptr->file.pos);\r\n    return((sector_index*CD_ROM_SECTOR_SIZE) + fileptr->io_block_offset);\r\n\r\n#else\r\n    return(0);\r\n#endif\r\n}\r\n\r\nvoid psxcd_close(PsxCd_File *fileptr)//800405A0\r\n{\r\n#if _CD_VERSION_ == 1\r\n\r\n#endif\r\n}\r\n\r\nvoid psxcd_set_audio_mode(void)//800405A8\r\n{\r\n#if _CD_VERSION_ == 1\r\n    if(psxcd_mode!=0)\r\n    {\r\n        if(async_on)\r\n        {\r\n            psxcd_async_read_cancel();\r\n        }\r\n\r\n        init_pos = 0; //since we have lost the data position of the CD\r\n        cd_param[0] = CdlModeRept|CdlModeAP|CdlModeDA;\r\n\r\n        CdControl(cdl_com=CdlSetmode, cd_param, 0);\r\n\r\n        psxcd_mode = 0;\r\n\r\n        psxcd_sync();\r\n\r\n        CdControl(cdl_com=CdlPause, 0, 0);\r\n\r\n        psxcd_sync(); // to ensure no pending pauses...\r\n\r\n        CdFlush();\r\n    } else {\r\n        psxcd_sync();\r\n    }\r\n#endif\r\n}\r\n\r\nvoid psxcd_set_loop_volume(int volforloop)//8004064C\r\n{\r\n#if _CD_VERSION_ == 1\r\n    loopvol = volforloop;\r\n#endif\r\n}\r\n\r\nvoid psxcd_play_at_andloop(int track,\r\n                           int vol,\r\n                           int sectoroffset,\r\n                           int fadeuptime,\r\n                           int tracktoloop,\r\n                           int volforloop,\r\n                           int loopstartsectoroffset,\r\n                           int loopstartfadeuptime)//80040658\r\n{\r\n#if _CD_VERSION_ == 1\r\n\r\n    if(*(int *)&loc[track]==0)\r\n    {\r\n        return;\r\n    }\r\n\r\n    psxcd_set_audio_mode();\r\n\r\n    playvol = vol;\r\n\r\n    CdIntToPos((CdPosToInt(&loc[track]) + sectoroffset),&cdloc);\r\n\r\n    playcount = 0;\r\n    playflag = 1;\r\n    loopflag = 1;\r\n    looptrack = tracktoloop;\r\n    loopvol = volforloop;\r\n    loopsectoroffset = loopstartsectoroffset;\r\n    loopfadeuptime = loopstartfadeuptime;\r\n    seeking_for_play = 1;\r\n    playfadeuptime = fadeuptime;\r\n    CdControlF(cdl_com=CdlSeekP, (u_char *)&cdloc);\r\n\r\n    lastloc = loc[track];\r\n    beginloc = lastloc;\r\n    newloc = lastloc;\r\n\r\n#endif\r\n}\r\n\r\nvoid psxcd_play_at(int track, int vol, int sectoroffset)//800407B8\r\n{\r\n#if _CD_VERSION_ == 1\r\n\r\n    if(*(int *)&loc[track]==0)\r\n    {\r\n        return;\r\n    }\r\n\r\n    playflag = 0;\r\n    loopflag = 0;\r\n    seeking_for_play = 0;\r\n\r\n    psxcd_set_audio_mode();\r\n\r\n    playvol = vol;\r\n\r\n    CdIntToPos((CdPosToInt(&loc[track]) + sectoroffset),&cdloc);\r\n\r\n    playcount = 0;\r\n    playflag = 1;\r\n    loopflag = 0;\r\n    seeking_for_play = 1;\r\n    playfadeuptime = 0;\r\n\r\n    CdControlF(cdl_com=CdlSeekP, (u_char *)&cdloc);\r\n\r\n    lastloc = loc[track];\r\n    beginloc = lastloc;\r\n    newloc = lastloc;\r\n\r\n#endif\r\n}\r\n\r\nvoid psxcd_play(int track, int vol)//800408DC\r\n{\r\n    psxcd_play_at(track,vol,0);\r\n}\r\n\r\nvoid psxcd_seek_for_play_at(int track, int sectoroffset)//800408FC\r\n{\r\n#if _CD_VERSION_ == 1\r\n\r\n    if(*(int *)&loc[track]==0)\r\n    {\r\n        return;\r\n    }\r\n\r\n    playflag = 0;\r\n    loopflag = 0;\r\n    seeking_for_play = 0;\r\n\r\n    psxcd_set_audio_mode();\r\n\r\n    CdIntToPos((CdPosToInt(&loc[track]) + sectoroffset),&cdloc);\r\n\r\n    playcount = 0;\r\n    playflag = 0;\r\n    loopflag = 0;\r\n    seeking_for_play = 1;\r\n    CdControlF(cdl_com=CdlSeekP, (u_char *)&cdloc);\r\n\r\n    lastloc = loc[track];\r\n    beginloc = lastloc;\r\n    newloc = lastloc;\r\n\r\n#endif\r\n}\r\n\r\nvoid psxcd_seek_for_play(int track)//80040A10\r\n{\r\n    psxcd_seek_for_play_at(track, 0);\r\n}\r\n\r\nint psxcd_play_status(void)//80040A30\r\n{\r\n#if _CD_VERSION_ == 1\r\n    if((cdl_com==CdlPlay)||(cdl_com==CdlSeekP))\r\n    {\r\n        check_intr = CdSync(1,(u_char *)check_result);\r\n        if((check_intr==CdlDiskError) ||\r\n           //(check_result[0] & !(CdlStatSeek|CdlStatPlay|CdlStatStandby)) || // This line of code are blocked in Psx Doom\r\n           !(check_result[0] & CdlStatStandby))\r\n        {\r\n            CdFlush();\r\n            cdl_errintr = check_intr + 90; //to give us unique error numbers\r\n            cdl_errcom = cdl_com;\r\n            cdl_errstat = check_result[0];\r\n            cdl_errcount++;\r\n\r\n            //report not playing\r\n            return(0);\r\n        }\r\n        return(1);\r\n    } else {\r\n        return(0);\r\n    }\r\n#else\r\n    return(0);\r\n#endif\r\n}\r\n\r\nvoid psxcd_stop(void)//80040AC8\r\n{\r\n#if _CD_VERSION_ == 1\r\n\r\n    playflag = 0; // ensure no SeekP callback activity\r\n    loopflag = 0;\r\n    seeking_for_play = 0;\r\n\r\n    *(int *)&lastloc = 0;\r\n\r\n    #if _CD_SPU_LINK_ == 1\r\n     if(psxspu_get_cd_vol())\r\n     {\r\n         psxspu_start_cd_fade(FADE_TIME,0);\r\n         while(psxspu_get_cd_fade_status());\r\n     }\r\n    #endif\r\n\r\n    psxcd_sync();\r\n\r\n    // pause seems to be better than stop here because\r\n    // play is more stable after a pause\r\n    waiting_for_pause = 1;\r\n    CdControlF(cdl_com=CdlPause, 0);\r\n\r\n#endif\r\n}\r\n\r\nvoid psxcd_pause(void)//80040B40\r\n{\r\n#if _CD_VERSION_ == 1\r\n\r\n    playflag = 0; // ensure no SeekP callback activity\r\n    seeking_for_play = 0;\r\n\r\n    // this check is\r\n    if(*(int *)&lastloc==0)\r\n    {\r\n        return;\r\n    }\r\n\r\n    lastloc = newloc;\r\n\r\n    #if _CD_SPU_LINK_ == 1\r\n    if(psxspu_get_cd_vol())\r\n    {\r\n         psxspu_start_cd_fade(FADE_TIME,0);\r\n         while(psxspu_get_cd_fade_status());\r\n    }\r\n    #endif\r\n\r\n    psxcd_sync();\r\n\r\n    waiting_for_pause = 1;\r\n    CdControlF(cdl_com=CdlPause, 0);\r\n\r\n#endif\r\n}\r\n\r\nvoid psxcd_restart(int vol)//80040BE4\r\n{\r\n#if _CD_VERSION_ == 1\r\n\r\n    if(*(int *)&lastloc==0)\r\n    {\r\n        return;\r\n    }\r\n\r\n    psxcd_set_audio_mode();\r\n\r\n    playvol = vol;\r\n\r\n    cdloc = lastloc;\r\n\r\n    playcount = 0;\r\n    playflag = 1;\r\n    seeking_for_play = 1;\r\n    CdControlF(cdl_com=CdlSeekP, (u_char *)&cdloc);\r\n\r\n#endif\r\n}\r\n\r\nint psxcd_elapsed_sectors(void)//80040C6C\r\n{\r\n#if _CD_VERSION_ == 1\r\n    if(*(int *)&beginloc==0)\r\n    {\r\n        return(0);\r\n    }\r\n    return(CdPosToInt(&newloc)-CdPosToInt(&beginloc));\r\n#else\r\n    return(0);\r\n#endif\r\n}\r\n\r\nvoid psxcd_set_stereo(int stereo_true)//80040CC0\r\n{\r\n#if _CD_VERSION_ == 1\r\n    if(stereo_true)\r\n    {\r\n        cdatv.val0 = 127;\r\n        cdatv.val1 = 0;\r\n        cdatv.val2 = 127;\r\n        cdatv.val3 = 0;\r\n    } else {\r\n        cdatv.val0 = 63;\r\n        cdatv.val1 = 63;\r\n        cdatv.val2 = 63;\r\n        cdatv.val3 = 63;\r\n    }\r\n\r\n    CdMix(&cdatv);\r\n#endif\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "PSXDOOM/PSXCD.H",
    "content": "    /*------------------------------------------------------------------*/\r\n    /*\r\n                     Sony CD Architecture Specific Routines\r\n                            by Scott Patterson\r\n\r\n                     development and testing period on this code:\r\n                            4/18/95 - 9/28/95\r\n    */\r\n    /*------------------------------------------------------------------*/\r\n\r\n#ifndef _PSXCD_H\r\n#define _PSXCD_H\r\n\r\n    /*\r\n        The following functions will pause for a short CD volume fade if\r\n        the CD volume is not zero (and _CD_SPU_LINK_ == 1):\r\n\r\n        psxcd_async_read()\r\n        psxcd_read()\r\n        psxcd_stop()\r\n        psxcd_pause()\r\n\r\n        To asyncronously fade the CD volume beforehand so these functions\r\n        will not have any delays see comments in \"psxspu.h\"\r\n    */\r\n\r\n#include <sys\\types.h>\r\n#include <libcd.h>\r\n\r\n#define _CD_VERSION_  1\r\n#define _CD_SPU_LINK_ 1//para cd tracks\r\n#define _CD_ABS_OPEN_ 1\r\n\r\n#define PSXCD_SEEK_SET    0\r\n#define PSXCD_SEEK_CUR    1\r\n#define PSXCD_SEEK_END    2\r\n\r\n#if _CD_VERSION_ == 0\r\n #include <libsn.h>\r\n#endif\r\n\r\ntypedef struct PsxCd_File {\r\n    CdlFILE       file;\r\n    CdlLOC        new_io_loc;\r\n    unsigned long io_block_offset;\r\n    unsigned char io_result[8];\r\n}PsxCd_File;\r\n\r\n#if _CD_ABS_OPEN_ == 1\r\n\r\ntypedef struct PsxCd_MapTbl {\r\n    int           abs;\r\n    u_long        size;\r\n}PsxCd_MapTbl;\r\n\r\nextern PsxCd_MapTbl cdmaptbl[];\r\n\r\n#endif\r\n\r\n// CD-data read stuff\r\n#define CD_ROM_SECTOR_SIZE 2048\r\n#define SECTORS_PER_SECOND 75\r\n#define SECONDS_PER_MINUTE 60\r\n\r\n/*\r\n    Asyncronous read function: psxcd_async_on()\r\n\r\n    this function returns non-zero during asyncronous reading\r\n\r\n    to code an asyncronous read:\r\n\r\n    psxcd_async_read(destptr,readbytes,fileptr);\r\n\r\n    // do your other shit here\r\n    // (don't mess with the RAM you are reading to!)\r\n\r\n    // to check for completion\r\n    if(!psxcd_async_on())\r\n    {\r\n        // psxcd_async_read is complete\r\n    }\r\n\r\n    // to wait for completion:\r\n    while(psxcd_async_on()); // wait for completion of psxcd_async_read\r\n*/\r\n\r\nextern int           psxcd_async_on(void);\r\n\r\n/*\r\n    CD-DA play seek variable: seeking_for_play\r\n\r\n    after psxcd_seek_for_play(track) call is made\r\n\r\n    this function returns non-zero until seeking is done\r\n*/\r\n\r\nextern int           psxcd_seeking_for_play(void);\r\n\r\n/*\r\n    CD-DA play stop/pause variable: waiting_for_pause\r\n\r\n    after psxcd_stop/psxcd_pause call is made\r\n\r\n    this function returns non-zero until pause operation is done\r\n*/\r\n\r\nextern int           psxcd_waiting_for_pause(void);\r\n\r\nextern int           cdl_insetmode;\r\nextern int           cdl_intr;\r\nextern unsigned char cdl_stat;\r\nextern unsigned char cdl_com;\r\n\r\nextern int           cdl_errcount;\r\nextern int           cdl_errintr;\r\nextern unsigned char cdl_errstat;\r\nextern unsigned char cdl_errcom;\r\nextern int readcount;\r\nextern int playcount;\r\n\r\n// PSX CD-MODE1 DATA commands\r\n\r\nextern void          psxcd_init(void);\r\n\r\nextern void          psxcd_exit(void);\r\n\r\nextern void          psxcd_disable_callbacks(void);\r\n\r\nextern void          psxcd_enable_callbacks(void);\r\n\r\nextern void          psxcd_set_data_mode(void);\r\n\r\nextern PsxCd_File   *psxcd_open(char *filename);\r\n\r\nextern void          psxcd_async_read_cancel(void);\r\n\r\nextern int           psxcd_async_read(void *destptr,int readbytes,PsxCd_File *fileptr);\r\n\r\nextern int           psxcd_read(void *destptr,int readbytes,PsxCd_File *fileptr);\r\n\r\nextern int           psxcd_seek(PsxCd_File *fileptr,int seekpos,int seekmode);\r\n\r\nextern unsigned long psxcd_tell(PsxCd_File *fileptr);\r\n\r\nextern void          psxcd_close(PsxCd_File *fileptr);\r\n\r\n// PSX CD-AUDIO commands\r\n\r\nextern void psxcd_set_stereo(int stereo_true);\r\n\r\nextern void psxcd_set_audio_mode(void);\r\n\r\nextern void psxcd_seek_for_play(int track);\r\n\r\nextern void psxcd_seek_for_play_at(int track,\r\n                                   int sectoroffset);\r\n\r\nextern void psxcd_play(int track, int vol);\r\n\r\nextern void psxcd_play_at(int track,\r\n                          int vol,\r\n                          int sectoroffset);\r\n\r\nextern void psxcd_set_loop_volume(int volforloop);\r\n\r\nextern void psxcd_play_at_andloop(int track,\r\n                                  int vol,\r\n                                  int sectoroffset,\r\n                                  int fadeuptime,\r\n                                  int tracktoloop,\r\n                                  int volforloop,\r\n                                  int loopstartsectoroffset,\r\n                                  int loopstartfadeuptime);\r\n\r\nextern void psxcd_stop(void);\r\n\r\nextern void psxcd_pause(void);\r\n\r\nextern void psxcd_restart(int vol);\r\n\r\nint psxcd_play_status(void);\r\n\r\nint psxcd_elapsed_sectors(void);\r\n\r\n// PSX low level CD extras\r\n\r\nextern char sectorbuf[CD_ROM_SECTOR_SIZE];\r\n\r\nextern void psxcd_init_pos(void);\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "PSXDOOM/PSXCDABS.C",
    "content": "\r\nPsxCd_MapTbl cdmaptbl[] = \r\n{\r\n\t{23,\t68},\r\n\t{24,\t907264},\r\n\t{469,\t32768},\r\n\t{485,\t32768},\r\n\t{501,\t657392},\r\n\t{822,\t3387200},\r\n\t{2272,\t374784},\r\n\t{2455,\t4806088},\r\n\t{4803,\t28196},\r\n\t{4817,\t58304},\r\n\t{4846,\t54552},\r\n\t{4873,\t46124},\r\n\t{4896,\t44844},\r\n\t{4918,\t61588},\r\n\t{4949,\t55100},\r\n\t{4976,\t24416},\r\n\t{4988,\t590344},\r\n\t{5277,\t538668},\r\n\t{5541,\t539124},\r\n\t{5805,\t599804},\r\n\t{6098,\t542608},\r\n\t{6363,\t540092},\r\n\t{6627,\t610152},\r\n\t{6925,\t569128},\r\n\t{7203,\t90744},\r\n\t{7248,\t98652},\r\n\t{7297,\t87032},\r\n\t{7340,\t89728},\r\n\t{7384,\t96636},\r\n\t{7432,\t102092},\r\n\t{7482,\t94632},\r\n\t{7529,\t89024},\r\n\t{7574,\t23512},\r\n\t{7586,\t47200},\r\n\t{7610,\t37120},\r\n\t{7629,\t58980},\r\n\t{7658,\t41452},\r\n\t{7679,\t41744},\r\n\t{7700,\t40452},\r\n\t{7720,\t13212},\r\n\t{7727,\t681400},\r\n\t{8060,\t538364},\r\n\t{8323,\t839084},\r\n\t{8733,\t712692},\r\n\t{9081,\t815644},\r\n\t{9480,\t849720},\r\n\t{9895,\t851488},\r\n\t{10311,\t560564},\r\n\t{10585,\t115168},\r\n\t{10642,\t64668},\r\n\t{10674,\t117700},\r\n\t{10732,\t96036},\r\n\t{10779,\t114880},\r\n\t{10836,\t100588},\r\n\t{10886,\t118028},\r\n\t{10944,\t75608},\r\n\t{10982,\t26192},\r\n\t{10995,\t34844},\r\n\t{11013,\t37460},\r\n\t{11032,\t67584},\r\n\t{11065,\t44536},\r\n\t{11087,\t54204},\r\n\t{11114,\t16240},\r\n\t{11122,\t25256},\r\n\t{11135,\t655924},\r\n\t{11456,\t754608},\r\n\t{11825,\t711920},\r\n\t{12173,\t609232},\r\n\t{12471,\t947256},\r\n\t{12934,\t698412},\r\n\t{13276,\t783292},\r\n\t{13659,\t503360},\r\n\t{13905,\t94700},\r\n\t{13952,\t99824},\r\n\t{14001,\t90168},\r\n\t{14046,\t113084},\r\n\t{14102,\t119052},\r\n\t{14161,\t101824},\r\n\t{14211,\t93508},\r\n\t{14257,\t122260},\r\n\t{14318,\t36092},\r\n\t{14336,\t55228},\r\n\t{14363,\t38620},\r\n\t{14382,\t71392},\r\n\t{14417,\t79124},\r\n\t{14456,\t70688},\r\n\t{14491,\t23548},\r\n\t{14503,\t30096},\r\n\t{14518,\t658696},\r\n\t{14840,\t811608},\r\n\t{15237,\t617220},\r\n\t{15539,\t713644},\r\n\t{15888,\t690772},\r\n\t{16226,\t658504},\r\n\t{16548,\t303772},\r\n\t{16697,\t453732},\r\n\t{16919,\t120520},\r\n\t{16978,\t95616},\r\n\t{17025,\t134144},\r\n\t{17091,\t138792},\r\n\t{17159,\t115788},\r\n\t{17216,\t107636},\r\n\t{17269,\t111304},\r\n\t{17324,\t99928},\r\n\t{17374,\t34424},\r\n\t{17391,\t31812},\r\n\t{17407,\t54264},\r\n\t{17434,\t61796},\r\n\t{17465,\t12760},\r\n\t{17472,\t40412},\r\n\t{17492,\t46432},\r\n\t{17515,\t64972},\r\n\t{17547,\t536376},\r\n\t{17809,\t540772},\r\n\t{18074,\t786920},\r\n\t{18459,\t781336},\r\n\t{18841,\t563728},\r\n\t{19117,\t891472},\r\n\t{19553,\t925360},\r\n\t{20005,\t726232},\r\n\t{20360,\t92832},\r\n\t{20406,\t79672},\r\n\t{20445,\t95636},\r\n\t{20492,\t101916},\r\n\t{20542,\t67744},\r\n\t{20576,\t135548},\r\n\t{20643,\t109668},\r\n\t{20697,\t108968},\r\n\t{20752,\t56652},\r\n\t{20780,\t53028},\r\n\t{20806,\t89220},\r\n\t{20850,\t54560},\r\n\t{20877,\t77656},\r\n\t{20915,\t54032},\r\n\t{20942,\t93852},\r\n\t{20988,\t28216},\r\n\t{21002,\t748724},\r\n\t{21368,\t808468},\r\n\t{21763,\t581464},\r\n\t{22047,\t842888},\r\n\t{22459,\t677172},\r\n\t{22790,\t809260},\r\n\t{23186,\t617784},\r\n\t{23488,\t881152},\r\n\t{23919,\t131496},\r\n\t{23984,\t135640},\r\n\t{24051,\t113068},\r\n\t{24107,\t128592},\r\n\t{24170,\t135508},\r\n\t{24237,\t137308},\r\n\t{24305,\t127780},\r\n\t{24368,\t148004},\r\n\t{24442,\t35168},\r\n\t{24460,\t32840},\r\n\t{24477,\t53120},\r\n\t{24503,\t59788},\r\n\t{24533,\t64036},\r\n\t{24565,\t22640},\r\n\t{24577,\t9828},\r\n\t{24582,\t40960},\r\n\t{24602,\t536716},\r\n\t{24865,\t861136},\r\n\t{25286,\t813132},\r\n\t{25684,\t738880},\r\n\t{26045,\t763852},\r\n\t{26418,\t898916},\r\n\t{26857,\t418288},\r\n\t{27062,\t601328},\r\n\t{27356,\t131980},\r\n\t{27421,\t145340},\r\n\t{27492,\t161620},\r\n\t{27571,\t128848},\r\n\t{27634,\t155948},\r\n\t{27711,\t106412},\r\n\t{27763,\t50408},\r\n\t{27788,\t86568},\r\n\t{27832,\t30796},\r\n\t{27848,\t91964},\r\n\t{27893,\t37592},\r\n\t{27912,\t32768},\r\n\t{27928,\t32768},\r\n\t{27944,\t32768},\r\n\t{27960,\t32768},\r\n\t{27976,\t32768},\r\n\t{27992,\t688812},\r\n\t{28329,\t661156},\r\n\t{28652,\t417300},\r\n\t{28856,\t32768},\r\n\t{28872,\t32768},\r\n\t{28888,\t32768},\r\n\t{28904,\t32768},\r\n\t{28920,\t32768},\r\n\t{28936,\t117464},\r\n\t{28994,\t131544},\r\n\t{29059,\t124532},\r\n\t{29120,\t32768},\r\n\t{29136,\t32768},\r\n\t{29152,\t32768},\r\n\t{29168,\t32768},\r\n\t{29184,\t32768},\r\n\t{29201,\t177104},\r\n\t{29288,\t55502},\r\n\t{29316,\t61232},\r\n\t{29346,\t77280},\r\n\t{29384,\t103120},\r\n\t{29435,\t111968},\r\n\t{29490,\t73968},\r\n\t{29527,\t104656},\r\n\t{29579,\t85488},\r\n\t{29621,\t71008},\r\n\t{29656,\t83584},\r\n\t{29697,\t93136},\r\n\t{29743,\t92528},\r\n\t{29789,\t67280},\r\n\t{29822,\t120992},\r\n\t{29882,\t136496},\r\n\t{29949,\t103328},\r\n\t{30000,\t116512},\r\n\t{30057,\t101168},\r\n\t{30107,\t104528},\r\n\t{30159,\t116944},\r\n\t{30217,\t121216},\r\n\t{30278,\t143632},\r\n\t{30349,\t143312},\r\n\t{30419,\t143312},\r\n\t{30489,\t168112},\r\n\t{30572,\t143312},\r\n\t{30642,\t143312},\r\n\t{30712,\t184160},\r\n\t{30802,\t131872},\r\n\t{30867,\t199920},\r\n\t{30965,\t158576},\r\n\t{31043,\t229632},\r\n\t{31156,\t202112},\r\n\t{31255,\t226912},\r\n\t{31366,\t242960},\r\n\t{31485,\t236304},\r\n\t{31601,\t134800},\r\n\t{31667,\t202384},\r\n\t{31766,\t219632},\r\n\t{31874,\t202112},\r\n\t{31973,\t155664},\r\n\t{32051,\t247024},\r\n\t{32172,\t170960},\r\n\t{32256,\t137200},\r\n\t{32323,\t160832},\r\n\t{32402,\t199920},\r\n\t{32500,\t219632},\r\n\t{32608,\t181248},\r\n\t{32697,\t199920},\r\n\t{32795,\t181248},\r\n\t{32884,\t206496},\r\n\t{32985,\t111456},\r\n\t{33040,\t143312},\r\n\t{33110,\t143312},\r\n\t{33180,\t143312},\r\n\t{33250,\t199920},\r\n\t{33348,\t222544},\r\n\t{33457,\t122240},\r\n\t{33517,\t158352},\r\n\t{33595,\t240768},\r\n\t{33713,\t209920},\r\n\t{33817,\t189056},\r\n\t{33910,\t236480},\r\n\t{34026,\t164176},\r\n\t{34107,\t219792},\r\n\t{34215,\t161536},\r\n\t{34294,\t219904},\r\n\t{34402,\t182400},\r\n\t{34492,\t226480},\r\n\t{34603,\t160832},\r\n\t{34682,\t250064},\r\n\t{34805,\t209216},\r\n\t{34908,\t199920},\r\n\t{35006,\t222544},\r\n\t{35115,\t89712},\r\n\t{35159,\t80992},\r\n\t{35199,\t168112},\r\n\t{35282,\t120416},\r\n\t{35341,\t206496},\r\n\t{35442,\t69888},\r\n\t{35477,\t425904},\r\n\t{0,\t0}\r\n};"
  },
  {
    "path": "PSXDOOM/PSXCDABS.H",
    "content": "#define _SYSTEM_CNF\t0\r\n#define _SLUS_000_77\t1\r\n#define _DEMO1_LMP\t2\r\n#define _DEMO2_LMP\t3\r\n#define _MAPSPR60_IMG\t4\r\n#define _MOVIE_STR\t5\r\n#define _PSXDOOM_EXE\t6\r\n#define _PSXDOOM_WAD\t7\r\n#define _MAP01_WAD\t8\r\n#define _MAP02_WAD\t9\r\n#define _MAP03_WAD\t10\r\n#define _MAP04_WAD\t11\r\n#define _MAP05_WAD\t12\r\n#define _MAP06_WAD\t13\r\n#define _MAP07_WAD\t14\r\n#define _MAP08_WAD\t15\r\n#define _MAPSPR01_IMG\t16\r\n#define _MAPSPR02_IMG\t17\r\n#define _MAPSPR03_IMG\t18\r\n#define _MAPSPR04_IMG\t19\r\n#define _MAPSPR05_IMG\t20\r\n#define _MAPSPR06_IMG\t21\r\n#define _MAPSPR07_IMG\t22\r\n#define _MAPSPR08_IMG\t23\r\n#define _MAPTEX01_IMG\t24\r\n#define _MAPTEX02_IMG\t25\r\n#define _MAPTEX03_IMG\t26\r\n#define _MAPTEX04_IMG\t27\r\n#define _MAPTEX05_IMG\t28\r\n#define _MAPTEX06_IMG\t29\r\n#define _MAPTEX07_IMG\t30\r\n#define _MAPTEX08_IMG\t31\r\n#define _MAP09_WAD\t32\r\n#define _MAP10_WAD\t33\r\n#define _MAP11_WAD\t34\r\n#define _MAP12_WAD\t35\r\n#define _MAP13_WAD\t36\r\n#define _MAP14_WAD\t37\r\n#define _MAP15_WAD\t38\r\n#define _MAP16_WAD\t39\r\n#define _MAPSPR09_IMG\t40\r\n#define _MAPSPR10_IMG\t41\r\n#define _MAPSPR11_IMG\t42\r\n#define _MAPSPR12_IMG\t43\r\n#define _MAPSPR13_IMG\t44\r\n#define _MAPSPR14_IMG\t45\r\n#define _MAPSPR15_IMG\t46\r\n#define _MAPSPR16_IMG\t47\r\n#define _MAPTEX09_IMG\t48\r\n#define _MAPTEX10_IMG\t49\r\n#define _MAPTEX11_IMG\t50\r\n#define _MAPTEX12_IMG\t51\r\n#define _MAPTEX13_IMG\t52\r\n#define _MAPTEX14_IMG\t53\r\n#define _MAPTEX15_IMG\t54\r\n#define _MAPTEX16_IMG\t55\r\n#define _MAP17_WAD\t56\r\n#define _MAP18_WAD\t57\r\n#define _MAP19_WAD\t58\r\n#define _MAP20_WAD\t59\r\n#define _MAP21_WAD\t60\r\n#define _MAP22_WAD\t61\r\n#define _MAP23_WAD\t62\r\n#define _MAP24_WAD\t63\r\n#define _MAPSPR17_IMG\t64\r\n#define _MAPSPR18_IMG\t65\r\n#define _MAPSPR19_IMG\t66\r\n#define _MAPSPR20_IMG\t67\r\n#define _MAPSPR21_IMG\t68\r\n#define _MAPSPR22_IMG\t69\r\n#define _MAPSPR23_IMG\t70\r\n#define _MAPSPR24_IMG\t71\r\n#define _MAPTEX17_IMG\t72\r\n#define _MAPTEX18_IMG\t73\r\n#define _MAPTEX19_IMG\t74\r\n#define _MAPTEX20_IMG\t75\r\n#define _MAPTEX21_IMG\t76\r\n#define _MAPTEX22_IMG\t77\r\n#define _MAPTEX23_IMG\t78\r\n#define _MAPTEX24_IMG\t79\r\n#define _MAP25_WAD\t80\r\n#define _MAP26_WAD\t81\r\n#define _MAP27_WAD\t82\r\n#define _MAP28_WAD\t83\r\n#define _MAP29_WAD\t84\r\n#define _MAP30_WAD\t85\r\n#define _MAP31_WAD\t86\r\n#define _MAP32_WAD\t87\r\n#define _MAPSPR25_IMG\t88\r\n#define _MAPSPR26_IMG\t89\r\n#define _MAPSPR27_IMG\t90\r\n#define _MAPSPR28_IMG\t91\r\n#define _MAPSPR29_IMG\t92\r\n#define _MAPSPR30_IMG\t93\r\n#define _MAPSPR31_IMG\t94\r\n#define _MAPSPR32_IMG\t95\r\n#define _MAPTEX25_IMG\t96\r\n#define _MAPTEX26_IMG\t97\r\n#define _MAPTEX27_IMG\t98\r\n#define _MAPTEX28_IMG\t99\r\n#define _MAPTEX29_IMG\t100\r\n#define _MAPTEX30_IMG\t101\r\n#define _MAPTEX31_IMG\t102\r\n#define _MAPTEX32_IMG\t103\r\n#define _MAP33_WAD\t104\r\n#define _MAP34_WAD\t105\r\n#define _MAP35_WAD\t106\r\n#define _MAP36_WAD\t107\r\n#define _MAP37_WAD\t108\r\n#define _MAP38_WAD\t109\r\n#define _MAP39_WAD\t110\r\n#define _MAP40_WAD\t111\r\n#define _MAPSPR33_IMG\t112\r\n#define _MAPSPR34_IMG\t113\r\n#define _MAPSPR35_IMG\t114\r\n#define _MAPSPR36_IMG\t115\r\n#define _MAPSPR37_IMG\t116\r\n#define _MAPSPR38_IMG\t117\r\n#define _MAPSPR39_IMG\t118\r\n#define _MAPSPR40_IMG\t119\r\n#define _MAPTEX33_IMG\t120\r\n#define _MAPTEX34_IMG\t121\r\n#define _MAPTEX35_IMG\t122\r\n#define _MAPTEX36_IMG\t123\r\n#define _MAPTEX37_IMG\t124\r\n#define _MAPTEX38_IMG\t125\r\n#define _MAPTEX39_IMG\t126\r\n#define _MAPTEX40_IMG\t127\r\n#define _MAP41_WAD\t128\r\n#define _MAP42_WAD\t129\r\n#define _MAP43_WAD\t130\r\n#define _MAP44_WAD\t131\r\n#define _MAP45_WAD\t132\r\n#define _MAP46_WAD\t133\r\n#define _MAP47_WAD\t134\r\n#define _MAP48_WAD\t135\r\n#define _MAPSPR41_IMG\t136\r\n#define _MAPSPR42_IMG\t137\r\n#define _MAPSPR43_IMG\t138\r\n#define _MAPSPR44_IMG\t139\r\n#define _MAPSPR45_IMG\t140\r\n#define _MAPSPR46_IMG\t141\r\n#define _MAPSPR47_IMG\t142\r\n#define _MAPSPR48_IMG\t143\r\n#define _MAPTEX41_IMG\t144\r\n#define _MAPTEX42_IMG\t145\r\n#define _MAPTEX43_IMG\t146\r\n#define _MAPTEX44_IMG\t147\r\n#define _MAPTEX45_IMG\t148\r\n#define _MAPTEX46_IMG\t149\r\n#define _MAPTEX47_IMG\t150\r\n#define _MAPTEX48_IMG\t151\r\n#define _MAP49_WAD\t152\r\n#define _MAP50_WAD\t153\r\n#define _MAP51_WAD\t154\r\n#define _MAP52_WAD\t155\r\n#define _MAP53_WAD\t156\r\n#define _MAP54_WAD\t157\r\n#define _MAP55_WAD\t158\r\n#define _MAP56_WAD\t159\r\n#define _MAPSPR49_IMG\t160\r\n#define _MAPSPR50_IMG\t161\r\n#define _MAPSPR51_IMG\t162\r\n#define _MAPSPR52_IMG\t163\r\n#define _MAPSPR53_IMG\t164\r\n#define _MAPSPR54_IMG\t165\r\n#define _MAPSPR55_IMG\t166\r\n#define _MAPSPR56_IMG\t167\r\n#define _MAPTEX49_IMG\t168\r\n#define _MAPTEX50_IMG\t169\r\n#define _MAPTEX51_IMG\t170\r\n#define _MAPTEX52_IMG\t171\r\n#define _MAPTEX53_IMG\t172\r\n#define _MAPTEX54_IMG\t173\r\n#define _MAPTEX55_IMG\t174\r\n#define _MAPTEX56_IMG\t175\r\n#define _MAP57_WAD\t176\r\n#define _MAP58_WAD\t177\r\n#define _MAP59_WAD\t178\r\n#define _MAP60_PAD\t179\r\n#define _MAP61_PAD\t180\r\n#define _MAP62_PAD\t181\r\n#define _MAP63_PAD\t182\r\n#define _MAP64_PAD\t183\r\n#define _MAPSPR57_IMG\t184\r\n#define _MAPSPR58_IMG\t185\r\n#define _MAPSPR59_IMG\t186\r\n#define _MAPSPR60_PAD\t187\r\n#define _MAPSPR61_PAD\t188\r\n#define _MAPSPR62_PAD\t189\r\n#define _MAPSPR63_PAD\t190\r\n#define _MAPSPR64_PAD\t191\r\n#define _MAPTEX57_IMG\t192\r\n#define _MAPTEX58_IMG\t193\r\n#define _MAPTEX59_IMG\t194\r\n#define _MAPTEX60_PAD\t195\r\n#define _MAPTEX61_PAD\t196\r\n#define _MAPTEX62_PAD\t197\r\n#define _MAPTEX63_PAD\t198\r\n#define _MAPTEX64_PAD\t199\r\n#define _DOOMSFX_LCD\t200\r\n#define _DOOMSND_WMD\t201\r\n#define _MUSLEV1_LCD\t202\r\n#define _MUSLEV10_LCD\t203\r\n#define _MUSLEV11_LCD\t204\r\n#define _MUSLEV12_LCD\t205\r\n#define _MUSLEV13_LCD\t206\r\n#define _MUSLEV14_LCD\t207\r\n#define _MUSLEV15_LCD\t208\r\n#define _MUSLEV16_LCD\t209\r\n#define _MUSLEV17_LCD\t210\r\n#define _MUSLEV18_LCD\t211\r\n#define _MUSLEV19_LCD\t212\r\n#define _MUSLEV2_LCD\t213\r\n#define _MUSLEV20_LCD\t214\r\n#define _MUSLEV3_LCD\t215\r\n#define _MUSLEV4_LCD\t216\r\n#define _MUSLEV5_LCD\t217\r\n#define _MUSLEV6_LCD\t218\r\n#define _MUSLEV7_LCD\t219\r\n#define _MUSLEV8_LCD\t220\r\n#define _MUSLEV9_LCD\t221\r\n#define _MAP01_LCD\t222\r\n#define _MAP02_LCD\t223\r\n#define _MAP03_LCD\t224\r\n#define _MAP04_LCD\t225\r\n#define _MAP05_LCD\t226\r\n#define _MAP06_LCD\t227\r\n#define _MAP07_LCD\t228\r\n#define _MAP08_LCD\t229\r\n#define _MAP09_LCD\t230\r\n#define _MAP10_LCD\t231\r\n#define _MAP11_LCD\t232\r\n#define _MAP12_LCD\t233\r\n#define _MAP13_LCD\t234\r\n#define _MAP14_LCD\t235\r\n#define _MAP15_LCD\t236\r\n#define _MAP16_LCD\t237\r\n#define _MAP17_LCD\t238\r\n#define _MAP18_LCD\t239\r\n#define _MAP19_LCD\t240\r\n#define _MAP20_LCD\t241\r\n#define _MAP21_LCD\t242\r\n#define _MAP22_LCD\t243\r\n#define _MAP23_LCD\t244\r\n#define _MAP24_LCD\t245\r\n#define _MAP25_LCD\t246\r\n#define _MAP26_LCD\t247\r\n#define _MAP27_LCD\t248\r\n#define _MAP28_LCD\t249\r\n#define _MAP29_LCD\t250\r\n#define _MAP30_LCD\t251\r\n#define _MAP31_LCD\t252\r\n#define _MAP32_LCD\t253\r\n#define _MAP33_LCD\t254\r\n#define _MAP34_LCD\t255\r\n#define _MAP35_LCD\t256\r\n#define _MAP36_LCD\t257\r\n#define _MAP37_LCD\t258\r\n#define _MAP38_LCD\t259\r\n#define _MAP39_LCD\t260\r\n#define _MAP40_LCD\t261\r\n#define _MAP41_LCD\t262\r\n#define _MAP42_LCD\t263\r\n#define _MAP43_LCD\t264\r\n#define _MAP44_LCD\t265\r\n#define _MAP45_LCD\t266\r\n#define _MAP46_LCD\t267\r\n#define _MAP47_LCD\t268\r\n#define _MAP48_LCD\t269\r\n#define _MAP49_LCD\t270\r\n#define _MAP50_LCD\t271\r\n#define _MAP51_LCD\t272\r\n#define _MAP52_LCD\t273\r\n#define _MAP53_LCD\t274\r\n#define _MAP54_LCD\t275\r\n#define _MAP55_LCD\t276\r\n#define _MAP56_LCD\t277\r\n#define _MAP57_LCD\t278\r\n#define _MAP58_LCD\t279\r\n#define _MAP59_LCD\t280\r\n#define _MAP60_LCD\t281\r\n#define MAX_ABS_FILES\t282\r\n"
  },
  {
    "path": "PSXDOOM/PSXCMD.C",
    "content": "// Reconstruido por Erick Vasquez Garcia 16/05/2019 [GEC]\r\n// Update_1 20/10/2019 [GEC]\r\n// Update_2 32/01/2020 [GEC]\r\n\r\n#include \"wessseq.h\"\r\n\r\nvoid start_record_music_mute(NoteState *notestate);\r\nvoid end_record_music_mute(void);\r\nvoid add_music_mute_note(unsigned short seq_num, unsigned char track,\r\n                  unsigned char keynum, unsigned char velnum,\r\n                  patchmaps_header *patchmap, patchinfo_header *patchinfo);\r\nvoid wess_set_mute_release(int newrate);\r\nvoid TriggerPSXVoice(voice_status *voice_stat, unsigned char keynum, unsigned char velnum);\r\n\r\nvoid PSX_DriverInit(master_status_structure *pm_stat);\r\nvoid PSX_DriverExit (track_status *ptk_stat);\r\nvoid PSX_DriverEntry1 (track_status *ptk_stat);\r\nvoid PSX_DriverEntry2(track_status *ptk_stat);\r\nvoid PSX_DriverEntry3(track_status *ptk_stat);\r\nvoid PSX_TrkOff(track_status *ptk_stat);\r\nvoid PSX_TrkMute(track_status *ptk_stat);\r\nvoid PSX_PatchChg(track_status *ptk_stat);\r\nvoid PSX_PatchMod(track_status *ptk_stat);\r\nvoid PSX_PitchMod(track_status *ptk_stat);\r\nvoid PSX_ZeroMod(track_status *ptk_stat);\r\nvoid PSX_ModuMod(track_status *ptk_stat);\r\nvoid PSX_VolumeMod(track_status *ptk_stat);\r\nvoid PSX_PanMod(track_status *ptk_stat);\r\nvoid PSX_PedalMod(track_status *ptk_stat);\r\nvoid PSX_ReverbMod(track_status *ptk_stat);\r\nvoid PSX_ChorusMod(track_status *ptk_stat);\r\nvoid PSX_voiceon(voice_status *voice_stat, track_status *ptk_stat,\r\n\t           patchmaps_header *patchmaps, patchinfo_header *patchinfo,\r\n\t           unsigned char keynum, unsigned char velnum);\r\nvoid PSX_voiceparmoff(voice_status *voice_stat);\r\nvoid PSX_voicerelease(voice_status *voice_stat);\r\nvoid PSX_voicenote(track_status *ptk_stat,\r\n\t           patchmaps_header *patchmap, patchinfo_header *patchinfo,\r\n\t           unsigned char keynum, unsigned char velnum);\r\nvoid PSX_NoteOn(track_status *ptk_stat);\r\nvoid PSX_NoteOff(track_status *ptk_stat);\r\n\r\nvoid(*drv_cmds[19])() =\r\n{\r\n\tPSX_DriverInit,         //0x0\r\n\tPSX_DriverExit,         //0x1\r\n\tPSX_DriverEntry1,       //0x2\r\n\tPSX_DriverEntry2,       //0x3\r\n\tPSX_DriverEntry3,       //0x4\r\n\tPSX_TrkOff,             //0x5\r\n\tPSX_TrkMute,            //0x6\r\n\tPSX_PatchChg,           //0x7\r\n\tPSX_PatchMod,           //0x8\r\n\tPSX_PitchMod,           //0x9\r\n\tPSX_ZeroMod,            //0xA\r\n\tPSX_ModuMod,            //0xB\r\n\tPSX_VolumeMod,          //0xC\r\n\tPSX_PanMod,             //0xD\r\n\tPSX_PedalMod,           //0xE\r\n\tPSX_ReverbMod,          //0xF\r\n\tPSX_ChorusMod,          //0x10\r\n\tPSX_NoteOn,             //0x11\r\n\tPSX_NoteOff             //0x12\r\n};\r\n\r\nextern unsigned char                skip_table[72];         //80075930\r\n\r\nextern unsigned char\t            master_sfx_volume;\t    //80075834\r\nextern unsigned char\t            master_mus_volume;\t    //80075835\r\nextern unsigned char\t            pan_status;\t\t\t    //80075836\r\nextern unsigned char\t            release_rate;\t\t\t//80075837\r\n\r\nextern unsigned long\t            voice_flags1;\t\t\t//80075838\r\nextern unsigned long\t            voice_flags2;\t\t\t//8007583C\r\nextern NoteState\t\t            *ptr_notestate;\t\t\t//80075840\r\nextern voice_status\t                *ptr_pvoicestattbl;\t\t//80075844\r\nextern unsigned long\t            priority;\t\t\t    //80075848\r\nextern unsigned long\t            max_pabstime;           //8007584C\r\n\r\nextern master_status_structure\t\t*drv_pmsbase;\t\t\t//8007EF88\r\nextern sequence_status\t\t\t\t*drv_pssbase;\t\t    //8007EF8C\r\nextern track_status\t\t\t\t    *drv_ptsbase;\t\t    //8007EF90\r\nextern unsigned long\t\t\t\tdrv_hwvl;\t\t        //8007EF98\r\nextern patch_group_data\t\t\t    *drv_ppgd;\t\t        //8007EF9C\r\nextern unsigned long\t\t\t\t*drv_pcurabstime;\t\t//8007EFA0\r\nextern patches_header\t\t\t\t*drv_patchesbase;\t\t//8007EFA4\r\nextern patchmaps_header\t\t\t    *drv_patchmapsbase;\t\t//8007EFA8\r\nextern patchinfo_header\t\t\t    *drv_samplesbase;\t\t//8007EFAC\r\nextern char\t\t\t\t\t\t    *drv_drummapsbase;\t\t//8007EFB0\r\nextern SpuVoiceAttr\t\t\t\t    drv_outattr;            //8007EFB4\r\n\r\nextern unsigned char\t\t\t\tdrv_nvst;\t\t        //8007EED0\r\nextern unsigned char\t\t\t\tdrv_npti;               //8007EED4\r\nextern unsigned long\t\t\t\tdrv_cnt;\t\t\t\t//8007EED8\r\nextern voice_status\t\t\t\t    *drv_pvsbase;\t\t    //8007EEDC\r\n\r\nextern voice_status\t\t\t\t    *drv_pcurvs;\t        //8007EF94\r\n\r\nextern unsigned char\t\t\t\tdrv_channels[24];\t\t//8007f00C\r\n\r\nextern void (**CmdFuncArr[10])(track_status *);\r\nextern void(*DrvFunctions[36])();\r\n\r\n//-----------------------------------------------------------\r\n// Sound System\r\n//-----------------------------------------------------------\r\nvoid start_record_music_mute(NoteState *notestate)//L80045750()\r\n{\r\n    ptr_notestate = notestate;\r\n    if (notestate != 0)\r\n    {\r\n        notestate->numnotes = 0;\r\n    }\r\n}\r\n\r\nvoid end_record_music_mute(void)//L8004576C()\r\n{\r\n\tptr_notestate = 0;\r\n}\r\n\r\nvoid add_music_mute_note(unsigned short seq_num, unsigned char track,\r\n                  unsigned char keynum, unsigned char velnum,\r\n                  patchmaps_header *patchmap, patchinfo_header *patchinfo)//L8004577C()\r\n{\r\n\tif (ptr_notestate != 0)\r\n\t{\r\n\t\tptr_notestate->nd[ptr_notestate->numnotes].seq_num = seq_num;\r\n\t\tptr_notestate->nd[ptr_notestate->numnotes].track = track;\r\n\t\tptr_notestate->nd[ptr_notestate->numnotes].keynum = keynum;\r\n\t\tptr_notestate->nd[ptr_notestate->numnotes].velnum = velnum;\r\n\t\tptr_notestate->nd[ptr_notestate->numnotes].patchmap = patchmap;\r\n\t\tptr_notestate->nd[ptr_notestate->numnotes].patchinfo = patchinfo;\r\n\t\tptr_notestate->numnotes++;\r\n\t}\r\n}\r\n\r\nvoid wess_set_mute_release(int newrate)//L80045848()\r\n{\r\n    int maxrate;\r\n\r\n    maxrate = 0x10000000;\r\n    release_rate = 0x1f;\r\n    while ((newrate < maxrate && (release_rate != 0)))\r\n    {\r\n        maxrate >>= 1;\r\n        release_rate -= 1;\r\n    }\r\n    return;\r\n}\r\n\r\nextern unsigned long\t\t\t\tdrv_pitch1;\t\t\t\t//L8007EEB8\r\nextern unsigned long\t\t\t\tdrv_pitch2;\t\t\t\t//L8007EEBC\r\nextern unsigned long\t\t\t\tdrv_pitch3;\t\t\t\t//L8007EEC0\r\nextern unsigned long\t\t\t\tdrv_volume_1;\t\t\t//L8007EEC4\r\nextern track_status\t\t\t\t    *drv_ptrk_stat;\t\t\t//L8007EEC8\r\nextern short\t\t\t\t        drv_pan_1;\t\t\t\t//L8007EECC\r\n\r\nvoid TriggerPSXVoice(voice_status *voice_stat, unsigned char keynum, unsigned char velnum)//L8004587C()\r\n{\r\n\tunsigned long volume;\r\n\tunsigned long pitch;\r\n\r\n\tdrv_outattr.voice = 1 << (voice_stat->refindx & 31);\r\n\tdrv_outattr.mask = (SPU_VOICE_VOLL | SPU_VOICE_VOLR | SPU_VOICE_NOTE | SPU_VOICE_SAMPLE_NOTE | SPU_VOICE_WDSA | SPU_VOICE_ADSR_ADSR1 | SPU_VOICE_ADSR_ADSR2);\r\n    //printf(\"Voice pos %d\\n\",drv_outattr.voice);\r\n\r\n\tdrv_ptrk_stat = (drv_ptsbase+voice_stat->track);\r\n\r\n\tif (drv_ptrk_stat->reverb != 0)\r\n\t{\r\n\t\tif (drv_channels[voice_stat->refindx] == 0)\r\n\t\t{\r\n\t\t\tSpuSetReverbVoice(SPU_ON, drv_outattr.voice);\r\n\t\t\tdrv_channels[voice_stat->refindx] = 0x7f;\r\n\t\t}\r\n\t}\r\n\telse\r\n\t{\r\n\t\tif (drv_channels[voice_stat->refindx] != 0)\r\n\t\t{\r\n\t\t\tSpuSetReverbVoice(SPU_OFF, drv_outattr.voice);\r\n\t\t\tdrv_channels[voice_stat->refindx] = 0;\r\n\t\t}\r\n\t}\r\n\r\n\tif (pan_status != 0)\r\n\t{\r\n\t\tdrv_pan_1 = drv_ptrk_stat->pan_cntrl + voice_stat->patchmaps->pan - 0x40;\r\n\r\n\t\tif (drv_pan_1 < 0)      drv_pan_1 = 0;\r\n        if (drv_pan_1 > 0x7F)\tdrv_pan_1 = 0x7F;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tdrv_pan_1 = 0x40;\r\n\t}\r\n\r\n\t//Volume\r\n\tif (drv_ptrk_stat->sndclass == SNDFX_CLASS)\r\n\t{\r\n\t\tvolume = velnum * voice_stat->patchmaps->volume * drv_ptrk_stat->volume_cntrl * master_sfx_volume;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tvolume = velnum * voice_stat->patchmaps->volume * drv_ptrk_stat->volume_cntrl * master_mus_volume;\r\n\t}\r\n\r\n\tdrv_volume_1 = volume >> 21;\r\n\r\n\t//Pan\r\n\tif (pan_status != 0)\r\n\t{\r\n\t\tif (pan_status != 1)//2\r\n\t\t{\r\n\t\t\tdrv_outattr.volume.right = ((drv_volume_1 << 7) * (0x80 - drv_pan_1)) >> 7;\r\n\t\t\tdrv_outattr.volume.left = ((drv_volume_1 << 7) * (drv_pan_1 + 1)) >> 7;\r\n\t\t}\r\n\t\telse//1\r\n\t\t{\r\n\t\t\tdrv_outattr.volume.left = ((drv_volume_1 << 7) * (0x80 - drv_pan_1)) >> 7;\r\n\t\t\tdrv_outattr.volume.right = ((drv_volume_1 << 7) * (drv_pan_1 + 1)) >> 7;\r\n\t\t}\r\n\t}\r\n\telse//0\r\n\t{\r\n\t\tdrv_outattr.volume.left = drv_outattr.volume.right = drv_volume_1 << 6;\r\n\t}\r\n\r\n\t//Pitch\r\n\tif (drv_ptrk_stat->pitch_cntrl == 0)\r\n    {\r\n\t\tdrv_outattr.note = (voice_stat->keynum << 8);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tif (drv_ptrk_stat->pitch_cntrl < 1)\r\n\t\t{\r\n\t\t\tpitch = drv_ptrk_stat->pitch_cntrl * voice_stat->patchmaps->pitchstep_min;\r\n\r\n\t\t\tdrv_pitch1 = (32 - pitch);\r\n\t\t\tdrv_pitch2 = (drv_pitch1 >> 13) + 1;\r\n\t\t\tdrv_pitch3 = 0x80 - ((drv_pitch1 & 8191) >> 6);\r\n\r\n\t\t\tdrv_outattr.note = (voice_stat->keynum - (drv_pitch2)) << 8 | drv_pitch3 & 0x7F;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tpitch = drv_ptrk_stat->pitch_cntrl * voice_stat->patchmaps->pitchstep_max;\r\n\r\n\t\t\tdrv_pitch1 = (32 + pitch);\r\n\t\t\tdrv_pitch2 = (drv_pitch1 >> 13);\r\n\t\t\tdrv_pitch3 = (drv_pitch1 & 8191) >> 6;\r\n\r\n\t\t\tdrv_outattr.note = (voice_stat->keynum + (drv_pitch2)) << 8 | drv_pitch3 & 0x7F;\r\n\t\t}\r\n\t}\r\n\r\n\tdrv_outattr.sample_note = (voice_stat->patchmaps->root_key << 8) | voice_stat->patchmaps->fine_adj;\r\n\tdrv_outattr.addr = voice_stat->patchinfo->sample_pos;\r\n\tdrv_outattr.adsr1 = voice_stat->patchmaps->adsr1;\r\n\tdrv_outattr.adsr2 = voice_stat->patchmaps->adsr2;\r\n\r\n\tSpuSetKeyOnWithAttr(&drv_outattr);\r\n}\r\n//-----------------------------------------------------------\r\n// Driver System\r\n//-----------------------------------------------------------\r\n\r\nvoid PSX_DriverInit(master_status_structure *pm_stat)//L80045CFC()\r\n{\r\n\tchar *pmem;\r\n\r\n\t//printf(\"PSX_DriverInit\\n\");\r\n\r\n\tdrv_pmsbase = pm_stat;\r\n\tdrv_pcurabstime = pm_stat->pabstime;\r\n\tdrv_pssbase = pm_stat->pseqstattbl;\r\n\tdrv_ptsbase = pm_stat->ptrkstattbl;\r\n\tdrv_pvsbase = pm_stat->pvoicestattbl;\r\n\tdrv_nvst = pm_stat->voices_total;\r\n\r\n\tdrv_cnt = 0;\r\n\r\n\tif (drv_nvst != 0)\r\n\t{\r\n\t\twhile (drv_cnt < drv_nvst)\r\n\t\t{\r\n\t\t\tif ((pm_stat->pvoicestattbl + drv_cnt)->patchtype == 1)\r\n\t\t\t{\r\n\t\t\t\tdrv_pcurvs = (pm_stat->pvoicestattbl + drv_cnt);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tdrv_cnt++;\r\n\t\t}\r\n\t}\r\n\r\n\tdrv_npti = drv_pmsbase->pmod_info->mod_hdr.patch_types_infile;\r\n\r\n\tdrv_cnt = 0;\r\n\tif (drv_npti != 0)\r\n\t{\r\n\t\twhile (drv_cnt < drv_npti)\r\n\t\t{\r\n\t\t\tif ((pm_stat->ppat_info + drv_cnt)->pat_grp_hdr.patch_id == 1)\r\n\t\t\t{\r\n\t\t\t\tdrv_ppgd = (pm_stat->ppat_info + drv_cnt);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tdrv_cnt++;\r\n\t\t}\r\n\t}\r\n\r\n\tdrv_hwvl = drv_ppgd->pat_grp_hdr.hw_voice_limit;\r\n\r\n\tpmem = drv_ppgd->ppat_data; /* pointer math temp */\r\n\tdrv_patchesbase = (patches_header *)pmem;\r\n\r\n\tpmem += (drv_ppgd->pat_grp_hdr.patches * sizeof(patches_header));\r\n\tdrv_patchmapsbase = (patchmaps_header *)pmem;\r\n\r\n\tpmem += (drv_ppgd->pat_grp_hdr.patchmaps * sizeof(patchmaps_header));\r\n\tdrv_samplesbase = (patchinfo_header *)pmem;\r\n\r\n\tpmem += (drv_ppgd->pat_grp_hdr.patchinfo * sizeof(patchinfo_header));\r\n\tdrv_drummapsbase = (char *)pmem;\r\n\r\n\tpsxspu_init();\r\n\r\n\tdrv_cnt = 0;\r\n\tdo\r\n\t{\r\n\t\tdrv_channels[drv_cnt] = 0x7F;\r\n\t\tdrv_cnt++;\r\n\t} while (drv_cnt < 24);\r\n}\r\n\r\nvoid PSX_DriverExit (track_status *ptk_stat)//L80045F24()\r\n{\r\n    //printf(\"PSX_DriverExit\\n\");\r\n\tSpuQuit();\r\n}\r\n\r\nextern unsigned long\t\tdrv_vn;\t\t\t    //8007EEE0\r\nextern unsigned long\t\tdrv_vi;             //8007EEE4\r\nextern unsigned long\t\tdrv_keychannels;    //8007EEE8\r\nextern unsigned long\t\tdrv_keycnt;\t\t\t//8007EEEC\r\nextern voice_status\t\t    *drv_pvs;\t\t\t//8007EEF0\r\nextern unsigned long\t\tdrv_voiceflag;      //8007EEF4\r\nextern char\t\t\t\t    drv_keysstatus[24]; //8007EFF4\r\n\r\nvoid PSX_DriverEntry1 (track_status *ptk_stat)//L80045F44()\r\n{\r\n    //printf(\"PSX_DriverEntry1\\n\");\r\n\tdrv_vn = drv_pmsbase->voices_active;\r\n\r\n\tif (drv_vn != 0)\r\n\t{\r\n\t\tdrv_pvs = drv_pcurvs;\r\n\t\tdrv_vi = drv_hwvl;\r\n\r\n\t\twhile (drv_vi--)\r\n\t\t{\r\n\t\t\tif ((drv_pvs->flags & (VOICE_ACTIVE | VOICE_RELEASE)) == 3)\r\n\t\t\t{\r\n\t\t\t\tif (drv_pvs->pabstime < *drv_pcurabstime)\r\n\t\t\t\t{\r\n\t\t\t\t\tPSX_voiceparmoff(drv_pvs);\r\n\t\t\t\t\tif (!--drv_vn) break;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tdrv_pvs++;\r\n\t\t}\r\n\t}\r\n\r\n\tdrv_voiceflag = 0;\r\n\tif (voice_flags1 != 0)\r\n\t{\r\n\t\tdrv_voiceflag = voice_flags1;\r\n\t\tvoice_flags1 = 0;\r\n\t}\r\n\r\n\tif (voice_flags2 != 0)\r\n\t{\r\n\t\tdrv_outattr.voice = voice_flags2;\r\n\t\tdrv_outattr.mask = (SPU_VOICE_ADSR_RMODE | SPU_VOICE_ADSR_RR);\r\n\t\tdrv_outattr.r_mode = SPU_VOICE_EXPDec;\r\n\t\tdrv_outattr.rr = release_rate;\r\n\t\tSpuSetVoiceAttr(&drv_outattr);\r\n\r\n\t\tdrv_voiceflag |= voice_flags2;\r\n\t\tvoice_flags2 = 0;\r\n\t}\r\n\r\n\tif (drv_voiceflag != 0)\r\n\t{\r\n\t\tSpuSetKey(SPU_OFF, drv_voiceflag);\r\n\t\tdrv_voiceflag = 0;\r\n\t}\r\n\r\n\tSpuGetAllKeysStatus(drv_keysstatus);\r\n\r\n\tdrv_keychannels = 24;\r\n\tdrv_keycnt = 0;\r\n\tdrv_pvs = drv_pcurvs;\r\n\twhile (drv_keychannels--)\r\n\t{\r\n\t\tif ((drv_pvs->flags & VOICE_ACTIVE) != 0)\r\n\t\t{\r\n\t\t\tif (drv_keysstatus[drv_keycnt] == 0)\r\n\t\t\t{\r\n\t\t\t\tPSX_voiceparmoff(drv_pvs);\r\n\t\t\t}\r\n\t\t}\r\n\t\tdrv_pvs++;\r\n\t\tdrv_keycnt++;\r\n\t}\r\n}\r\n\r\nvoid PSX_DriverEntry2(track_status *ptk_stat)//L800461F4()\r\n{\r\n    //printf(\"PSX_DriverEntry2\\n\");\r\n}\r\n\r\nvoid PSX_DriverEntry3(track_status *ptk_stat)//L800461FC()\r\n{\r\n    //printf(\"PSX_DriverEntry3\\n\");\r\n}\r\n\r\nextern sequence_status\t\t\t\t*drv_pss;\t\t//L8007EEF8\r\n\r\nvoid PSX_TrkOff(track_status *ptk_stat)//L80046204()\r\n{\r\n    //printf(\"PSX_TrkOff\\n\");\r\n\tdrv_pss = drv_pssbase + ptk_stat->seq_owner;\r\n\tPSX_TrkMute(ptk_stat);\r\n\r\n\tif (ptk_stat->voices_active != 0)\r\n\t{\r\n\t\tptk_stat->flags |= (TRK_OFF | TRK_STOPPED);\r\n\r\n\t\tif (!drv_pss->tracks_playing--)\r\n\t\t\tdrv_pss->playmode = SEQ_STATE_STOPPED;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tEng_TrkOff(ptk_stat);\r\n\t}\r\n}\r\n\r\nextern unsigned long\t\t\t\tdrv_vn_2;\t\t    //L8007EEFC\r\nextern unsigned long\t\t\t\tdrv_vi_2;\t\t    //L8007EF00\r\nextern voice_status\t\t\t\t   *drv_pvs_2;\t\t\t//L8007EF04\r\nextern sequence_status\t\t\t   *drv_pss_2;\t\t\t//L8007EF08\r\n\r\nvoid PSX_TrkMute(track_status *ptk_stat)//L800462B0()\r\n{\r\n    //printf(\"PSX_TrkMute\\n\");\r\n\tdrv_vn_2 = ptk_stat->voices_active;\r\n\r\n\tif (drv_vn_2 != 0)\r\n\t{\r\n\t\tdrv_pvs_2 = drv_pcurvs;\r\n\t\tdrv_vi_2 = drv_hwvl;\r\n\r\n\t\twhile (drv_vi_2--)\r\n\t\t{\r\n\t\t\tif (((drv_pvs_2->flags & VOICE_ACTIVE) != 0) && (drv_pvs_2->track == ptk_stat->refindx))\r\n\t\t\t{\r\n                if (ptr_notestate != 0 && (!(drv_pvs_2->flags & VOICE_RELEASE) && (ptk_stat->sndclass == MUSIC_CLASS)))\r\n                {\r\n                  drv_pss_2 = (drv_pssbase + ptk_stat->seq_owner);\r\n                  add_music_mute_note(drv_pss_2->seq_num,\r\n                               drv_pvs_2->track,\r\n                               drv_pvs_2->keynum,\r\n                               drv_pvs_2->velnum,\r\n                               drv_pvs_2->patchmaps,\r\n                               drv_pvs_2->patchinfo);\r\n                }\r\n                drv_pvs_2->adsr2 = 0x10000000 >> (0x1f - (unsigned int)release_rate & 0x1f);\r\n                PSX_voicerelease(drv_pvs_2);\r\n                //printf(\"voice_stat->refindx %d\\n\",drv_pvs_2->refindx);\r\n\r\n\t\t\t\tvoice_flags2 = 1 << (drv_pvs_2->refindx & 31) | voice_flags2;\r\n\t\t\t\tif (!--drv_vn_2) break;\r\n\t\t\t}\r\n\r\n\t\t\tdrv_pvs_2++;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nextern unsigned short\t\t\t\tdrv_thepatch;\t\t\t\t//L8007EF0C\r\n\r\nvoid PSX_PatchChg(track_status *ptk_stat)//L8004646C()\r\n{\r\n    //printf(\"PSX_PatchChg\\n\");\r\n\tdrv_thepatch = (*(ptk_stat->ppos + 1) | (*(ptk_stat->ppos + 2) << 8));\r\n\tptk_stat->patchnum = drv_thepatch;\r\n}\r\n\r\nvoid PSX_PatchMod(track_status *ptk_stat)//L80046494()\r\n{\r\n    //printf(\"PSX_PatchMod\\n\");\r\n}\r\n\r\nextern unsigned long\t\t\t\tdrv_voices_active_3;\t\t//L8007EF10\r\nextern unsigned long\t\t\t\tdrv_hwvl_3;\t\t//L8007EF14\r\nextern unsigned long\t\t\t\tdrv_pitch_1;\t\t\t\t//L8007EF18\r\nextern unsigned long\t\t\t\tdrv_pitch_2;\t\t\t\t//L8007EF1C\r\nextern unsigned long\t\t\t\tdrv_pitch_3;\t\t\t\t//L8007EF20\r\nextern voice_status\t\t\t\t    *drv_voice_stat_3;\t\t\t//L8007EF24\r\nextern short\t\t\t\t        drv_pitch_cntrl;\t\t\t//L8007EF28\r\n\r\nvoid PSX_PitchMod(track_status *ptk_stat)//L8004649C()\r\n{\r\n\tunsigned long pitch;\r\n\r\n\t//printf(\"PSX_PitchMod\\n\");\r\n\r\n\tdrv_pitch_cntrl = (*(ptk_stat->ppos + 1) | (*(ptk_stat->ppos + 2) << 8));\r\n\tif (ptk_stat->pitch_cntrl != drv_pitch_cntrl)\r\n\t{\r\n\t\tptk_stat->pitch_cntrl = drv_pitch_cntrl;\r\n\t\tdrv_voices_active_3 = ptk_stat->voices_active;\r\n\r\n\t\tif (drv_voices_active_3 != 0)\r\n\t\t{\r\n\t\t\tdrv_voice_stat_3 = drv_pcurvs;\r\n\t\t\tdrv_hwvl_3 = drv_hwvl;\r\n\r\n\t\t\twhile (drv_hwvl_3--)\r\n\t\t\t{\r\n                if ((drv_voice_stat_3->flags & VOICE_ACTIVE) && (drv_voice_stat_3->track == ptk_stat->refindx))\r\n                {\r\n                    drv_outattr.voice = 1 << (drv_voice_stat_3->refindx & 31);\r\n                    drv_outattr.mask = (SPU_VOICE_NOTE);\r\n\r\n                    if (ptk_stat->pitch_cntrl != 0)\r\n                    {\r\n                        if (ptk_stat->pitch_cntrl <= 0)\r\n                        {\r\n                            pitch = ptk_stat->pitch_cntrl * drv_voice_stat_3->patchmaps->pitchstep_min;\r\n\r\n                            drv_pitch_1 = (32 - pitch);\r\n                            drv_pitch_2 = (drv_pitch_1 >> 13) + 1;\r\n                            drv_pitch_3 = 0x80 - ((drv_pitch_1 & 8191) >> 6);\r\n\r\n                            drv_outattr.note = (drv_voice_stat_3->keynum - (drv_pitch_2)) << 8 | drv_pitch_3 & 0x7F;\r\n                        }\r\n                        else\r\n                        {\r\n                            pitch = ptk_stat->pitch_cntrl * drv_voice_stat_3->patchmaps->pitchstep_max;\r\n\r\n                            drv_pitch_1 = (32 + pitch);\r\n                            drv_pitch_2 = (drv_pitch_1 >> 13);\r\n                            drv_pitch_3 = (drv_pitch_1 & 8191) >> 6;\r\n\r\n                            drv_outattr.note = (drv_voice_stat_3->keynum + (drv_pitch_2)) << 8 | drv_pitch_3 & 0x7F;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        drv_outattr.note = (drv_voice_stat_3->keynum << 8);\r\n                    }\r\n\r\n                    SpuSetVoiceAttr(&drv_outattr);\r\n\r\n                    if (!--drv_voices_active_3) break;\r\n                }\r\n\r\n\t\t\t\tdrv_voice_stat_3++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid PSX_ZeroMod(track_status *ptk_stat)//L800466EC()\r\n{\r\n    //printf(\"PSX_ZeroMod\\n\");\r\n}\r\n\r\nvoid PSX_ModuMod(track_status *ptk_stat)//L800466f4()\r\n{\r\n    //printf(\"PSX_ModuMod\\n\");\r\n}\r\n\r\nextern unsigned long\t\t\t\tdrv_voices_active_4;\t\t//L8007EF2C\r\nextern unsigned long\t\t\t\tdrv_hwvl_4;\t\t//L8007EF30\r\nextern unsigned long\t\t\t\tdrv_volume_2;\t\t\t\t//L8007EF34\r\nextern voice_status\t\t\t\t    *drv_voice_stat_4;\t\t\t//L8007EF38\r\nextern short\t\t\t\t        drv_pan_2;\t\t\t\t\t//L8007EF3C\r\n\r\nvoid PSX_VolumeMod(track_status *ptk_stat)//L800466FC()\r\n{\r\n\tunsigned long volume;\r\n\t//printf(\"PSX_VolumeMod\\n\");\r\n\tptk_stat->volume_cntrl = *(ptk_stat->ppos + 1);\r\n\r\n\tdrv_voices_active_4 = ptk_stat->voices_active;\r\n\tif (drv_voices_active_4 != 0)\r\n\t{\r\n\t\tdrv_voice_stat_4 = drv_pcurvs;\r\n\t\tdrv_hwvl_4 = drv_hwvl;\r\n\r\n\t\twhile (drv_hwvl_4--)\r\n\t\t{\r\n\t\t\tif ((drv_voice_stat_4->flags & VOICE_ACTIVE) && (drv_voice_stat_4->track == ptk_stat->refindx))\r\n\t\t\t{\r\n\t\t\t\tif (pan_status == 0)\r\n\t\t\t\t{\r\n\t\t\t\t\tdrv_pan_2 = 0x40;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tdrv_pan_2 = ptk_stat->pan_cntrl + drv_voice_stat_4->patchmaps->pan - 0x40;\r\n\r\n\t\t\t\t\tif (drv_pan_2 < 0)      drv_pan_2 = 0;\r\n\t\t\t\t\tif (drv_pan_2 > 0x7F)\tdrv_pan_2 = 0x7F;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (ptk_stat->sndclass == SNDFX_CLASS)\r\n\t\t\t\t{\r\n\t\t\t\t\tvolume = drv_voice_stat_4->velnum * drv_voice_stat_4->patchmaps->volume * ptk_stat->volume_cntrl * master_sfx_volume;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tvolume = drv_voice_stat_4->velnum * drv_voice_stat_4->patchmaps->volume * ptk_stat->volume_cntrl * master_mus_volume;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdrv_volume_2 = volume >> 21;\r\n\r\n\t\t\t\tdrv_outattr.voice = 1 << (drv_voice_stat_4->refindx & 31);\r\n\t\t\t\tdrv_outattr.mask = (SPU_VOICE_VOLL | SPU_VOICE_VOLR);\r\n\r\n\t\t\t\tif (pan_status != 0)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (pan_status != 1)//2\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdrv_outattr.volume.right = ((drv_volume_2 << 7) * (0x80 - drv_pan_2)) >> 7;\r\n\t\t\t\t\t\tdrv_outattr.volume.left  = ((drv_volume_2 << 7) * (drv_pan_2 + 1)) >> 7;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse//1\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdrv_outattr.volume.left  = ((drv_volume_2 << 7) * (0x80 - drv_pan_2)) >> 7;\r\n\t\t\t\t\t\tdrv_outattr.volume.right = ((drv_volume_2 << 7) * (drv_pan_2 + 1)) >> 7;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse//0\r\n\t\t\t\t{\r\n\t\t\t\t\tdrv_outattr.volume.left = drv_outattr.volume.right = drv_volume_2 << 6;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tSpuSetVoiceAttr(&drv_outattr);\r\n\r\n\t\t\t\tif (!--drv_voices_active_4) break;\r\n\t\t\t}\r\n\r\n\t\t\tdrv_voice_stat_4++;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nextern unsigned long\t\t\t\tdrv_voices_active_5;\t\t//L8007EF40\r\nextern unsigned long\t\t\t\tdrv_hwvl_5;\t\t//L8007EF44\r\nextern unsigned long\t\t\t\tdrv_volume_3;\t\t\t\t//L8007EF48\r\nextern voice_status\t\t\t\t    *drv_voice_stat_5;\t\t\t//L8007EF4C\r\nextern short\t\t\t\t        drv_pan_3;\t\t\t\t\t//L8007EF50\r\n\r\nvoid PSX_PanMod(track_status *ptk_stat)//L80046A14()\r\n{\r\n\tunsigned long volume;\r\n\t//printf(\"PSX_PanMod\\n\");\r\n\r\n\tptk_stat->pan_cntrl = *(ptk_stat->ppos + 1);\r\n\r\n\tif (pan_status != 0)\r\n\t{\r\n\t\tdrv_voices_active_5 = ptk_stat->voices_active;\r\n\r\n\t\tif (drv_voices_active_5 != 0)\r\n\t\t{\r\n\t\t\tdrv_voice_stat_5 = drv_pcurvs;\r\n\t\t\tdrv_hwvl_5 = drv_hwvl;\r\n\r\n\t\t\twhile (drv_hwvl_5--)\r\n\t\t\t{\r\n\t\t\t\tif ((drv_voice_stat_5->flags & VOICE_ACTIVE) && (drv_voice_stat_5->track == ptk_stat->refindx))\r\n\t\t\t\t{\r\n\t\t\t\t\tdrv_pan_3 = ptk_stat->pan_cntrl + drv_voice_stat_5->patchmaps->pan - 0x40;\r\n\r\n\t\t\t\t\tif (drv_pan_3 < 0)      drv_pan_3 = 0;\r\n                    if (drv_pan_3 > 0x7F)\tdrv_pan_3 = 0x7F;\r\n\r\n\t\t\t\t\tif (ptk_stat->sndclass == SNDFX_CLASS)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tvolume = drv_voice_stat_5->velnum * drv_voice_stat_5->patchmaps->volume * ptk_stat->volume_cntrl * master_sfx_volume;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tvolume = drv_voice_stat_5->velnum * drv_voice_stat_5->patchmaps->volume * ptk_stat->volume_cntrl * master_mus_volume;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tdrv_volume_3 = volume >> 21;\r\n\r\n\t\t\t\t\tdrv_outattr.voice = 1 << (drv_voice_stat_5->refindx & 31);\r\n\t\t\t\t\tdrv_outattr.mask = (SPU_VOICE_VOLL | SPU_VOICE_VOLR);\r\n\r\n\t\t\t\t\tif (pan_status != 1)//2\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdrv_outattr.volume.right = ((drv_volume_3 << 7) * (0x80 - drv_pan_3)) >> 7;\r\n\t\t\t\t\t\tdrv_outattr.volume.left = ((drv_volume_3 << 7) * (drv_pan_3 + 1)) >> 7;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse//1\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdrv_outattr.volume.left = ((drv_volume_3 << 7) * (0x80 - drv_pan_3)) >> 7;\r\n\t\t\t\t\t\tdrv_outattr.volume.right = ((drv_volume_3 << 7) * (drv_pan_3 + 1)) >> 7;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tSpuSetVoiceAttr(&drv_outattr);\r\n\r\n\t\t\t\t\tif (!--drv_voices_active_5) break;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdrv_voice_stat_5++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n//PSX_PedalMod\r\nvoid PSX_PedalMod(track_status *ptk_stat)//L80046CF0()\r\n{\r\n    //printf(\"PSX_PedalMod\\n\");\r\n}\r\n\r\n//PSX_ReverbMod\r\nvoid PSX_ReverbMod(track_status *ptk_stat)//L80046CF8()\r\n{\r\n    //printf(\"PSX_ReverbMod\\n\");\r\n}\r\n\r\n//PSX_ChorusMod\r\nvoid PSX_ChorusMod(track_status *ptk_stat)//L80046D00()\r\n{\r\n    //printf(\"PSX_ChorusMod\\n\");\r\n}\r\n\r\nvoid PSX_voiceon(voice_status *voice_stat, track_status *ptk_stat,\r\n\t           patchmaps_header *patchmaps, patchinfo_header *patchinfo,\r\n\t           unsigned char keynum, unsigned char velnum)//L80046D08()\r\n{\r\n\tint adsr2;\r\n\t//printf(\"PSX_voiceon\\n\");\r\n\r\n\tvoice_stat->flags = (voice_stat->flags | VOICE_ACTIVE) & ~VOICE_RELEASE;\r\n\tvoice_stat->track = ptk_stat->refindx;\r\n\tvoice_stat->keynum = keynum;\r\n\tvoice_stat->velnum = velnum;\r\n\tvoice_stat->sndtype = 0;//no used??\r\n\tvoice_stat->priority = ptk_stat->priority;\r\n\tvoice_stat->patchmaps = patchmaps;\r\n\tvoice_stat->patchinfo = patchinfo;\r\n\tvoice_stat->pabstime = *drv_pcurabstime;\r\n\r\n    if (!(patchmaps->adsr2 & 0x20))\r\n    {\r\n        adsr2 = 0x5dc0000;\r\n    }\r\n    else\r\n    {\r\n        adsr2 = 0x10000000;\r\n    }\r\n    voice_stat->adsr2 = adsr2 >> (0x1f - ((unsigned int)patchmaps->adsr2 & 0x1f) & 0x1f);\r\n\r\n\tptk_stat->voices_active++;\r\n\tdrv_pmsbase->voices_active++;\r\n\r\n\tTriggerPSXVoice(voice_stat, keynum, velnum);//TriggerPSXVoice\r\n}\r\n\r\n\r\nextern track_status\t\t\t\t*drv_ptrk_stat_1;\t\t\t//L8007EF54\r\n\r\nvoid PSX_voiceparmoff(voice_status *voice_stat)//L80046DDC()\r\n{\r\n    //printf(\"PSX_voiceparmoff\\n\");\r\n\tdrv_ptrk_stat_1 = (drv_ptsbase + voice_stat->track);\r\n\r\n\tdrv_pmsbase->voices_active--;\r\n\tdrv_ptrk_stat_1->voices_active--;\r\n\r\n\tif ((drv_ptrk_stat_1->voices_active == 0) && (drv_ptrk_stat_1->flags & TRK_OFF))\r\n\t{\r\n        Eng_TrkOff(drv_ptrk_stat_1);\r\n\t}\r\n\r\n\tvoice_stat->flags &= ~(VOICE_ACTIVE|VOICE_RELEASE);\r\n}\r\n\r\nvoid PSX_voicerelease(voice_status *voice_stat)//L80046EA4()\r\n{\r\n    //printf(\"PSX_voicerelease\\n\");\r\n\tvoice_flags1 = 1 << (voice_stat->refindx & 31) | voice_flags1;\r\n\tvoice_stat->flags |= VOICE_RELEASE;\r\n\tvoice_stat->pabstime = *drv_pcurabstime + voice_stat->adsr2;\r\n}\r\n\r\n\r\nextern unsigned long\t\t\t\tdrv_hwvl_6;\t\t//L8007EF58\r\nextern unsigned long\t\t\t\tdrv_note_stat;\t\t\t\t//L8007EF5C\r\nextern voice_status\t\t\t\t*drv_voice_stat_6;\t\t\t//L8007EF60\r\n\r\nvoid PSX_voicenote(track_status *ptk_stat,\r\n\t           patchmaps_header *patchmap, patchinfo_header *patchinfo,\r\n\t           unsigned char keynum, unsigned char velnum)//L80046EF0()\r\n{\r\n    //printf(\"PSX_voicenote\\n\");\r\n\tdrv_note_stat = 0;\r\n\tdrv_hwvl_6 = drv_hwvl;\r\n\tdrv_voice_stat_6 = drv_pcurvs;\r\n\r\n    while (drv_hwvl_6--)\r\n    {\r\n        if ((drv_voice_stat_6->flags & VOICE_ACTIVE) == 0)\r\n        {\r\n          PSX_voiceon(drv_voice_stat_6, ptk_stat, patchmap, patchinfo, keynum, velnum);\r\n          drv_note_stat = 0;\r\n          break;\r\n        }\r\n        if (drv_voice_stat_6->priority <= ptk_stat->priority)\r\n        {\r\n          if (priority <= drv_voice_stat_6->priority)\r\n          {\r\n            if ((drv_voice_stat_6->flags & VOICE_RELEASE) == 0)\r\n            {\r\n              if ((ptr_pvoicestattbl->flags & VOICE_RELEASE) != 0) goto next_voice;\r\n            }\r\n            else\r\n            {\r\n              if ((ptr_pvoicestattbl->flags & VOICE_RELEASE) == 0) goto set_note_stat;\r\n            }\r\n            if (max_pabstime <= drv_voice_stat_6->pabstime) goto next_voice;\r\n          }\r\n\r\n    set_note_stat:\r\n          drv_note_stat = 1;\r\n          priority = drv_voice_stat_6->priority;\r\n          max_pabstime = drv_voice_stat_6->pabstime;\r\n          ptr_pvoicestattbl = drv_voice_stat_6;\r\n        }\r\n\r\n    next_voice:\r\n        drv_voice_stat_6++;\r\n    }\r\n\r\n    if (drv_note_stat != 0)\r\n    {\r\n        PSX_voiceparmoff(ptr_pvoicestattbl);\r\n        PSX_voiceon(ptr_pvoicestattbl,ptk_stat,patchmap,patchinfo,keynum,velnum);\r\n    }\r\n}\r\n\r\nextern unsigned long\t\t\t\tdrv_patch_cnt;\t\t\t\t//L8007EF64\r\nextern unsigned char\t\t\t\tdrv_byte01;\t\t\t\t\t//L8007EF68\r\nextern unsigned char\t\t\t\tdrv_byte02;\t\t\t\t\t//L8007EF6C\r\nextern unsigned char\t\t\t\tdrv_patchmap_cnt;\t\t\t//L8007EF70\r\nextern patches_header\t\t\t\t*drv_patch_1;\t\t\t\t//L8007EF74\r\nextern patchmaps_header\t\t\t    *drv_patchmap_1;\t\t\t//L8007EF78\r\nextern patchinfo_header\t\t\t    *drv_samplesbase_1;\t\t\t//L8007EF7C\r\n\r\nvoid PSX_NoteOn(track_status *ptk_stat)//L80047104()\r\n{\r\n\tchar *drummaps;\r\n\t//printf(\"PSX_NoteOn\\n\");\r\n\r\n\tdrv_byte01 = *(ptk_stat->ppos + 1);\r\n\tdrv_byte02 = *(ptk_stat->ppos + 2);\r\n\r\n\tif (ptk_stat->sndclass == DRUMS_CLASS)\r\n\t{\r\n\t\tdrummaps = (drv_drummapsbase + (drv_byte01 * sizeof(long)));\r\n\t\tdrv_patch_1 = drv_patchesbase + *(unsigned short*)(drummaps);\r\n\t\tdrv_byte01 = *(drummaps + sizeof(short));\r\n\t}\r\n\telse\r\n\t{\r\n\t\tdrv_patch_1 = drv_patchesbase+ptk_stat->patchnum;\r\n\t}\r\n\r\n\tdrv_patch_cnt = 0;\r\n\tdrv_patchmap_cnt = (char) drv_patch_1->patchmap_cnt;\r\n\r\n\twhile (drv_patchmap_cnt--)\r\n\t{\r\n\t\tdrv_patchmap_1 = drv_patchmapsbase + (drv_patch_1->patchmap_idx + drv_patch_cnt);\r\n\t\tdrv_samplesbase_1 = drv_samplesbase + drv_patchmap_1->sample_id;\r\n\r\n\t\tif (drv_samplesbase_1->sample_pos != 0)\r\n\t\t{\r\n\t\t\tif (drv_patchmap_1->note_min <= drv_byte01)\r\n\t\t\t{\r\n\t\t\t\tif (drv_byte01 <= drv_patchmap_1->note_max)\r\n\t\t\t\t{\r\n\t\t\t\t\tPSX_voicenote(ptk_stat,drv_patchmap_1,\r\n                   drv_samplesbase_1,drv_byte01,drv_byte02);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tdrv_patch_cnt++;\r\n\t}\r\n}\r\n\r\nextern unsigned long\t\t\tdrv_hwvl_7;\t\t    //L8007EF80\r\nextern voice_status\t\t\t\t*drv_voice_stat_7;  //L8007EF84\r\n\r\nvoid PSX_NoteOff(track_status *ptk_stat)//L800472E8()\r\n{\r\n    //printf(\"PSX_NoteOff\\n\");\r\n\tdrv_voice_stat_7 =\r\n\tdrv_pcurvs;\r\n\tdrv_hwvl_7 = drv_hwvl;\r\n\r\n\twhile (drv_hwvl_7--)\r\n\t{\r\n\t\tif (((drv_voice_stat_7->flags & (VOICE_ACTIVE|VOICE_RELEASE)) == VOICE_ACTIVE) &&\r\n\t\t\t(drv_voice_stat_7->keynum == *(ptk_stat->ppos + 1)) &&\r\n\t\t\t(drv_voice_stat_7->track == ptk_stat->refindx))\r\n\t\t{\r\n\t\t\tPSX_voicerelease(drv_voice_stat_7);\r\n\t\t}\r\n\r\n\t\tdrv_voice_stat_7++;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/PSXDOOM.cbp",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n<CodeBlocks_project_file>\n\t<FileVersion major=\"1\" minor=\"6\" />\n\t<Project>\n\t\t<Option title=\"PSXDOOM\" />\n\t\t<Option pch_mode=\"2\" />\n\t\t<Option compiler=\"null\" />\n\t\t<Build>\n\t\t\t<Target title=\"Release\">\n\t\t\t\t<Option output=\"bin/Release/PSXDOOM\" prefix_auto=\"1\" extension_auto=\"1\" />\n\t\t\t\t<Option object_output=\"obj/Release/\" />\n\t\t\t\t<Option type=\"1\" />\n\t\t\t\t<Option compiler=\"null\" />\n\t\t\t</Target>\n\t\t</Build>\n\t\t<Unit filename=\"LCDLOAD.C\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"LCDLOAD.H\" />\n\t\t<Unit filename=\"MAIN.LNK\" />\n\t\t<Unit filename=\"MAKEFILE.bat\" />\n\t\t<Unit filename=\"PSXCD.C\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"PSXCD.H\" />\n\t\t<Unit filename=\"PSXCDABS.C\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"PSXCDABS.H\" />\n\t\t<Unit filename=\"PSXCMD.C\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"PSXSPU.C\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"PSXSPU.H\" />\n\t\t<Unit filename=\"PSX_FILE.C\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"SEQLOAD.C\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"SEQLOAD.H\" />\n\t\t<Unit filename=\"SEQLOADR.C\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"WESSAPI.C\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"WESSAPI.H\" />\n\t\t<Unit filename=\"WESSAPIM.C\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"WESSAPIP.C\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"WESSAPIT.C\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"WESSARC.C\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"WESSARC.H\" />\n\t\t<Unit filename=\"WESSBASE.C\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"WESSSEQ.C\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"WESSSEQ.H\" />\n\t\t<Unit filename=\"am_main.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"c_main.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"cf_main.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"d_main.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"doomdata.h\" />\n\t\t<Unit filename=\"doomdef.h\" />\n\t\t<Unit filename=\"f_main.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"g_game.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"in_main.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"info.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"info.h\" />\n\t\t<Unit filename=\"l_main.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"m_fixed.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"m_fixed.s\" />\n\t\t<Unit filename=\"m_main.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"m_password.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"o_main.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"p_base.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"p_ceilng.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"p_change.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"p_doors.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"p_enemy.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"p_floor.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"p_inter.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"p_lights.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"p_local.h\" />\n\t\t<Unit filename=\"p_map.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"p_maputl.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"p_mobj.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"p_move.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"p_plats.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"p_pspr.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"p_setup.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"p_shoot.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"p_sight.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"p_slide.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"p_spec.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"p_spec.h\" />\n\t\t<Unit filename=\"p_switch.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"p_telept.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"p_tick.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"p_user.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"psxmain.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"psxmain.s\" />\n\t\t<Unit filename=\"pw_main.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"r_data.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"r_local.h\" />\n\t\t<Unit filename=\"r_main.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"r_phase1.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"r_phase2.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"s_sound.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"snmain.s\" />\n\t\t<Unit filename=\"sound.h\" />\n\t\t<Unit filename=\"sounds.h\" />\n\t\t<Unit filename=\"sprinfo.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"st_main.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"st_main.h\" />\n\t\t<Unit filename=\"t_main.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"tables.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"vsprintf.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"w_wad.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Unit filename=\"z_zone.c\">\n\t\t\t<Option compilerVar=\"CC\" />\n\t\t</Unit>\n\t\t<Extensions>\n\t\t\t<code_completion />\n\t\t\t<envvars />\n\t\t\t<debugger />\n\t\t\t<lib_finder disable_auto=\"1\" />\n\t\t</Extensions>\n\t</Project>\n</CodeBlocks_project_file>\n"
  },
  {
    "path": "PSXDOOM/PSXDOOM.layout",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n<CodeBlocks_layout_file>\n\t<FileVersion major=\"1\" minor=\"0\" />\n\t<ActiveTarget name=\"Release\" />\n</CodeBlocks_layout_file>\n"
  },
  {
    "path": "PSXDOOM/PSXSPU.C",
    "content": "// Reconstruido por Erick Vasquez Garcia 16/05/2019 [GEC]\r\n// Update_1 20/10/2019 [GEC]\r\n// Update_2 31/01/2020 [GEC]\r\n\r\n#include <libspu.h>\r\n#include \"psxspu.h\"\r\n#include \"wessapi.h\"\r\n\r\nextern void SpuSetCommonAttr (SpuCommonAttr *attr);\r\n\r\n#define MALLOC_MAX 1\r\nextern char spu_malloc_rec[SPU_MALLOC_RECSIZ * (MALLOC_MAX + 1)];\r\n\r\nextern unsigned int psxspu_initialized;\r\nextern unsigned int psxspu_status;\r\nextern unsigned long end_of_sram;\r\n\r\nextern int psxspu_master_vol;\r\nextern int psxspu_master_fadecount;\r\nextern int psxspu_master_vol_fixed;\r\nextern int psxspu_master_destvol;\r\nextern int psxspu_master_changeval;\r\n\r\nextern int psxspu_cd_vol;\r\nextern int psxspu_cd_fadecount;\r\nextern int psxspu_cd_vol_fixed;\r\nextern int psxspu_cd_destvol;\r\nextern int psxspu_cd_changeval;\r\n\r\nextern SpuReverbAttr rev_attr;//8007EEA4\r\n\r\nunsigned long SpuGetReverbOffsetAddr[10] = // equivale a la función SpuGetReverbOffsetAddr()\r\n{\r\n    520192, 514368, 516288, 505792, 495648,\r\n    479776, 461120, 425920, 425920, 508928\r\n};\r\n\r\n#define END_O_SRAM 520192\r\nvoid psxspu_init_reverb(long  rev_mode, short depthleft, short depthright, long  delay, long  feedback)//80045098\r\n{\r\n    psxspu_status = 0;\r\n\r\n    rev_attr.mask = (SPU_REV_MODE|SPU_REV_DEPTHL|SPU_REV_DEPTHR|SPU_REV_DELAYTIME|SPU_REV_FEEDBACK);\r\n    rev_attr.mode = rev_mode | SPU_REV_MODE_CLEAR_WA;\r\n    rev_attr.depth.left = depthleft;\r\n    rev_attr.depth.right = depthright;\r\n    rev_attr.delay = delay;\r\n    rev_attr.feedback = feedback;\r\n\r\n    SpuSetReverbModeParam (&rev_attr);\r\n    SpuSetReverbDepth (&rev_attr);\r\n\r\n    if(rev_mode == PSXSPU_REV_MODE_OFF)\r\n    {\r\n        SpuSetReverb(SPU_OFF);\r\n        end_of_sram = END_O_SRAM;\r\n    }\r\n    else\r\n    {\r\n        SpuSetReverb(SPU_ON);\r\n        end_of_sram = SpuGetReverbOffsetAddr[rev_mode];//SpuGetReverbOffsetAddr();\r\n    }\r\n\r\n    SpuSetReverbVoice((rev_mode != PSXSPU_REV_MODE_OFF), SPU_ALLCH);\r\n    psxspu_status = 1;\r\n\r\n    //printf(\"End_Of_Sram %d\\n\", end_of_sram);\r\n}\r\n\r\nvoid psxspu_set_reverb_depth(short depthleft,short depthright)//80045178\r\n{\r\n    psxspu_status = 0;\r\n    rev_attr.depth.left = depthleft;\r\n\trev_attr.depth.right = depthright;\r\n\tSpuSetReverbDepth(&rev_attr);\r\n\tpsxspu_status = 1;\r\n\r\n}\r\n\r\nvoid psxspu_init(void)//800451c0\r\n{\r\n    SpuCommonAttr com_attr;\r\n\r\n    if (psxspu_initialized == 0)\r\n\t{\r\n\t    //printf(\"psxspu_init\\n\");\r\n\t\tpsxspu_status = 0;\r\n\t\tpsxspu_initialized = 1;\r\n\r\n\t\tSpuInit();\r\n\t\tSpuInitMalloc(MALLOC_MAX, spu_malloc_rec);\r\n\t\tSpuSetTransMode(SpuTransferByDMA);\r\n\r\n\t\tpsxspu_init_reverb(0, 0, 0, 0, 0);\r\n\r\n\t\tcom_attr.mask = (SPU_COMMON_MVOLL | SPU_COMMON_MVOLR | SPU_COMMON_CDVOLL | SPU_COMMON_CDVOLR | SPU_COMMON_CDVOLR| SPU_COMMON_CDREV | SPU_COMMON_CDMIX);\r\n\t\tcom_attr.mvol.left = MAX_MASTER_VOL;\r\n\t\tcom_attr.mvol.right = MAX_MASTER_VOL;\r\n\t\tcom_attr.cd.volume.left = MAX_CD_VOL;\r\n\t\tcom_attr.cd.volume.right = MAX_CD_VOL;\r\n\t\tcom_attr.cd.reverb = 0;\r\n\t\tcom_attr.cd.mix = 1;\r\n\t\tSpuSetCommonAttr(&com_attr);\r\n\t\tpsxspu_status = 1;\r\n\t}\r\n}\r\n\r\nvoid psxspu_set_master_volume(int vol)//8004526C\r\n{\r\n    SpuCommonAttr com_attr;\r\n\r\n    psxspu_status = 0;\r\n    com_attr.mvol.left = vol;\r\n\tcom_attr.mvol.right = vol;\r\n\tcom_attr.mask = (SPU_COMMON_MVOLL | SPU_COMMON_MVOLR);\r\n\tSpuSetCommonAttr(&com_attr);\r\n\tpsxspu_status = 1;\r\n}\r\n\r\nvoid psxspu_set_cd_volume(int vol)//800452B0\r\n{\r\n    SpuCommonAttr com_attr;\r\n\r\n    psxspu_status = 0;\r\n    com_attr.cd.volume.left = vol;\r\n\tcom_attr.cd.volume.right = vol;\r\n\tcom_attr.mask = (SPU_COMMON_CDVOLL | SPU_COMMON_CDVOLR);\r\n\tSpuSetCommonAttr(&com_attr);\r\n\tpsxspu_status = 1;\r\n}\r\n\r\nvoid psxspu_setcdmixon(void)//800452F4\r\n{\r\n    SpuCommonAttr com_attr;\r\n\r\n    psxspu_status = 0;\r\n\tcom_attr.mask = (SPU_COMMON_CDMIX);\r\n\tcom_attr.cd.mix = 1;\r\n\tSpuSetCommonAttr(&com_attr);\r\n\tpsxspu_status = 1;\r\n}\r\n\r\nvoid psxspu_setcdmixoff(void)//8004533C\r\n{\r\n    SpuCommonAttr com_attr;\r\n\r\n    psxspu_status = 0;\r\n\tcom_attr.mask = (SPU_COMMON_CDMIX);\r\n\tcom_attr.cd.mix = 0;\r\n\tSpuSetCommonAttr(&com_attr);\r\n\tpsxspu_status = 1;\r\n}\r\n\r\nvoid psxspu_fadeengine(void)//8004537C\r\n{\r\n    if (psxspu_status != 0)\r\n\t{\r\n\t\tif (psxspu_cd_fadecount > 0)\r\n\t\t{\r\n\t\t\tpsxspu_cd_fadecount -= 1;\r\n\t\t\tpsxspu_cd_vol_fixed += psxspu_cd_changeval;\r\n\r\n\t\t\tif (psxspu_cd_fadecount == 0)\r\n\t\t\t\tpsxspu_cd_vol_fixed = psxspu_cd_destvol;\r\n\r\n\t\t\tpsxspu_cd_vol = psxspu_cd_vol_fixed >> 16;\r\n\r\n\t\t\tpsxspu_set_cd_volume(psxspu_cd_vol);\r\n\t\t}\r\n\r\n\t\tif (psxspu_master_fadecount > 0)\r\n\t\t{\r\n\t\t\tpsxspu_master_fadecount -= 1;\r\n\t\t\tpsxspu_master_vol_fixed += psxspu_master_changeval;\r\n\r\n\t\t\tif (psxspu_master_fadecount == 0)\r\n\t\t\t\tpsxspu_master_vol_fixed = psxspu_master_destvol;\r\n\r\n\t\t\tpsxspu_master_vol = psxspu_master_vol_fixed >> 16;\r\n\t\t\tpsxspu_set_master_volume(psxspu_master_vol);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid psxspu_set_cd_vol(int vol)//80045490\r\n{\r\n    psxspu_status = 0;\r\n    psxspu_cd_vol = vol;\r\n\tpsxspu_cd_vol_fixed = psxspu_cd_vol << 16;\r\n\tpsxspu_cd_fadecount = 0;\r\n\tpsxspu_set_cd_volume(psxspu_cd_vol);\r\n\tpsxspu_status = 1;\r\n}\r\n\r\nint  psxspu_get_cd_vol(void)//800454EC\r\n{\r\n    return psxspu_cd_vol;\r\n}\r\n\r\nvoid psxspu_start_cd_fade(int msec, int destvol)//800454FC\r\n{\r\n    psxspu_status = 0;\r\n    if (WessTimerActive == 0)\r\n    {\r\n        psxspu_cd_fadecount = 0;\r\n    }\r\n    else\r\n    {\r\n        psxspu_cd_destvol = destvol * 0x10000;\r\n        psxspu_cd_fadecount = (msec * 0x78) / 1000 + 1;\r\n        psxspu_cd_changeval = (psxspu_cd_destvol - psxspu_cd_vol_fixed) / psxspu_cd_fadecount;\r\n    }\r\n    psxspu_status = 1;\r\n}\r\n\r\nvoid psxspu_stop_cd_fade(void)//800455B4\r\n{\r\n    psxspu_status = 0;\r\n\tpsxspu_cd_fadecount = 0;\r\n\tpsxspu_status = 1;\r\n}\r\n\r\nint  psxspu_get_cd_fade_status(void)//800455D8\r\n{\r\n    return (psxspu_cd_fadecount < 2) ^ 1;\r\n}\r\n\r\nvoid psxspu_set_master_vol(int vol)//800455F0\r\n{\r\n    psxspu_status = 0;\r\n    psxspu_master_vol = vol;\r\n\tpsxspu_master_vol_fixed = psxspu_master_vol << 16;\r\n\tpsxspu_master_fadecount = 0;\r\n\tpsxspu_set_master_volume(psxspu_master_vol);\r\n\tpsxspu_status = 1;\r\n}\r\n\r\nint  psxspu_get_master_vol(void)//8004564C\r\n{\r\n    return psxspu_master_vol;\r\n}\r\n\r\nvoid psxspu_start_master_fade(int msec, int destvol)//8004565C\r\n{\r\n    psxspu_status = 0;\r\n\tif (WessTimerActive == 0)\r\n    {\r\n        psxspu_master_fadecount = 0;\r\n    }\r\n    else\r\n    {\r\n        psxspu_master_destvol = destvol * 0x10000;\r\n        psxspu_master_fadecount = (msec * 0x78) / 1000 + 1;\r\n        psxspu_master_changeval = (psxspu_master_destvol - psxspu_master_vol_fixed) / psxspu_master_fadecount;\r\n    }\r\n    psxspu_status = 1;\r\n}\r\n\r\nvoid psxspu_stop_master_fade(void)//80045714\r\n{\r\n    psxspu_status = 0;\r\n\tpsxspu_master_fadecount = 0;\r\n\tpsxspu_status = 1;\r\n}\r\n\r\nint  psxspu_get_master_fade_status(void)//80045738\r\n{\r\n    return (psxspu_master_fadecount < 2) ^ 1;\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/PSXSPU.H",
    "content": "\r\n    /*------------------------------------------------------------------*/\r\n    /*\r\n                     Williams Entertainment Sound System\r\n                            by Scott Patterson\r\n\r\n                     PSX SPU Volume and Reverb controls.\r\n    */\r\n    /*------------------------------------------------------------------*/\r\n\r\n#ifndef _PSXSPU_H\r\n#define _PSXSPU_H\r\n\r\n#define FADE_TIME 250\r\n\r\n    /*\r\n        Notes on fade calls:\r\n\r\n        To do a syncronous fade to zero volume:\r\n\r\n            psxspu_start_cd_fade(FADE_TIME,0);\r\n            while(psxspu_get_cd_fade_status());\r\n\r\n        To do an asyncronous fade to zero volume:\r\n\r\n            psxspu_start_cd_fade(FADE_TIME,0);\r\n            .\r\n            .\r\n            .\r\n            if(!psxspu_get_cd_fade_status())\r\n            {\r\n                //fade is now done\r\n            }\r\n    */\r\n\r\n#define MAX_MASTER_VOL 0x3fff\r\n#define MAX_CD_VOL    0x3cff\r\n#define MED_CD_VOL    0x2fff\r\n#define MIN_CD_VOL    0x1fff\r\n\r\n#define SRAM_ADDRESS_LIMIT 520192\r\n#define SRAM_RESERVED_SIZE 4112\r\n#define SRAM_TO_ALLOC_SPU (SRAM_ADDRESS_LIMIT-SRAM_RESERVED_SIZE)\r\n\r\n#define PSXSPU_REV_MODE_OFF        0\r\n#define PSXSPU_REV_MODE_ROOM       1\r\n#define PSXSPU_REV_MODE_STUDIO_A   2\r\n#define PSXSPU_REV_MODE_STUDIO_B   3\r\n#define PSXSPU_REV_MODE_STUDIO_C   4\r\n#define PSXSPU_REV_MODE_HALL       5\r\n#define PSXSPU_REV_MODE_SPACE      6\r\n#define PSXSPU_REV_MODE_ECHO       7\r\n#define PSXSPU_REV_MODE_DELAY      8\r\n#define PSXSPU_REV_MODE_PIPE       9\r\n\r\nextern unsigned long end_of_sram;\r\n\r\nextern void psxspu_init(void);\r\n\r\nextern void psxspu_init_reverb(long  rev_mode,\r\n                               short depthleft,\r\n                               short depthright,\r\n                               long  delay,\r\n                               long  feedback);\r\n\r\nextern void psxspu_set_reverb_depth(short depthleft,\r\n                                    short depthright);\r\n\r\nextern void psxspu_fadeengine(void);\r\n\r\nextern void psxspu_set_master_vol(int vol);\r\nextern int  psxspu_get_master_vol(void);\r\nextern void psxspu_start_master_fade(int msec,int destvol);\r\nextern void psxspu_stop_master_fade(void);\r\n\r\n//returns zero when fade is done\r\nextern int  psxspu_get_master_fade_status(void);\r\n\r\nextern void psxspu_set_cd_vol(int vol);\r\nextern int  psxspu_get_cd_vol(void);\r\nextern void psxspu_start_cd_fade(int msec,int destvol);\r\nextern void psxspu_stop_cd_fade(void);\r\n\r\n//returns zero when fade is done\r\nextern int  psxspu_get_cd_fade_status(void);\r\n\r\nextern void psxspu_setcdmixon(void);\r\nextern void psxspu_setcdmixoff(void);\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "PSXDOOM/PSX_FILE.C",
    "content": "/* PSX_FILE.c */\r\n\r\n#include \"doomdef.h\"\r\n#include \"r_local.h\"\r\n\r\n/*\r\n============================================================================\r\n\r\nREAD/OPEN/CLOSE/SEEK/CLEAR PSX FILE BASED ROUTINES\r\n\r\n============================================================================\r\n*/\r\n\r\nPsxCd_File\tfiles[4];\t\t//800A9B74 psxdoom\r\n\r\n/*\r\n== == == == == == == == == ==\r\n=\r\n= ClearFiles\r\n=\r\n= Exclusive Psx Doom\r\n== == == == == == == == == ==\r\n*/\r\n\r\nvoid ClearFiles(void)//L80031D84()\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < 4; i++)\r\n\t{\r\n\t\tfiles[i].file.size = 0;\r\n\t}\r\n}\r\n\r\n/*\r\n== == == == == == == == == ==\r\n=\r\n= OpenFile\r\n=\r\n= Exclusive Psx Doom\r\n== == == == == == == == == ==\r\n*/\r\n\r\nint OpenFile(char *filename)//L80031DAC()\r\n{\r\n\tPsxCd_File *fp;\r\n\tint i, j;\r\n\r\n\tfp = psxcd_open(filename);\r\n\r\n\tif (!fp)\r\n\t\tI_Error(\"Cannot open %s\", filename);\r\n\r\n\t//get free file\r\n\tfor (i = 0; i < 4; i++)\r\n\t{\r\n\t\tif (files[i].file.size == 0)\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\tif (!(i < 4))\r\n\t\tI_Error(\"OpenFile: Too many open files!\");\r\n\r\n\t//copy file pointer\r\n\tfiles[i] = *fp;\r\n\treturn i;\r\n}\r\n\r\n/*\r\n== == == == == == == == == ==\r\n=\r\n= CloseFile\r\n=\r\n= Exclusive Psx Doom\r\n== == == == == == == == == ==\r\n*/\r\n\r\nvoid CloseFile(int file_num)//L80031EA8()\r\n{\r\n\tfiles[file_num].file.size = 0;\r\n\tpsxcd_close(&files[file_num]);\r\n}\r\n\r\n/*\r\n== == == == == == == == == ==\r\n=\r\n= SeekFile\r\n=\r\n= Exclusive Psx Doom\r\n== == == == == == == == == ==\r\n*/\r\n\r\nint SeekFile(int file_num, int seekpos, int seekmode)//L80031EF4()\r\n{\r\n    PsxCd_File *fileptr;\r\n    int tell;\r\n\r\n    //printf(\"seekpos %d\\n\",seekpos);\r\n\r\n    fileptr = &files[file_num];\r\n\tpsxcd_seek(fileptr, seekpos, seekmode);\r\n\ttell = psxcd_tell(fileptr);\r\n\t//printf(\"tell %d\\n\",tell);\r\n\treturn tell;\r\n}\r\n\r\n/*\r\n== == == == == == == == == ==\r\n=\r\n= ReadFile\r\n=\r\n= Exclusive Psx Doom\r\n== == == == == == == == == ==\r\n*/\r\n\r\nvoid ReadFile(int file_num, void *destptr, unsigned int readbytes)//L800322F8()\r\n{\r\n\tunsigned long tell;\r\n\tunsigned int rbytes;\r\n\tPsxCd_File *fileptr;\r\n\r\n\tfileptr = &files[file_num];\r\n\t//printf(\"0x%X, [%d]\", (unsigned long)fileptr,  file_num);\r\n\r\n\ttell = psxcd_tell(fileptr);\r\n\r\n\trbytes = readbytes;\r\n\tif (0x2000 < readbytes)\r\n\t\trbytes = 0x2000;\t//max 32 kb\r\n\r\n\tpsxcd_seek(fileptr, 0, PSXCD_SEEK_SET);\r\n\tpsxcd_read(destptr, rbytes, fileptr);\r\n\tpsxcd_seek(fileptr, tell, PSXCD_SEEK_SET);\r\n\r\n\trbytes = psxcd_read(destptr, readbytes, fileptr);\r\n\tif (rbytes != readbytes)\r\n\t\tI_Error(\"ReadFile: error reading %d of %d bytes\\n\", rbytes, readbytes);\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/SEQLOAD.C",
    "content": "// Reconstruido por Erick Vasquez Garcia 16/05/2019 [GEC]\r\n// Update 20/10/2019 [GEC]\r\n\r\n#include \"seqload.h\"\r\n#define _ALIGN4_ 1\r\n\r\n#include <stdio.h>\r\n\r\nextern pmasterstat *pm_stat;\r\n\r\nextern int seq_loader_enable;           //80075790\r\nextern char *loaderfile;\t\t        //80075794\r\nextern pmasterstat *ref_pm_stat;        //80075798\r\nextern int ref_max_seq_num;             //8007579C\r\nextern char Driver_Init;                //800757A0\r\nextern char Reset_Gates;                //800757A1\r\nextern int\topencount;\t\t\t\t    //800757A4\r\nextern int(*Seq_Error_func)(int, int);  //800757A8\r\nextern int Seq_Error_module;            //800757AC\r\nextern Wess_File_IO_Struct *fp_seq_file; //800757B0\r\n\r\nextern track_header scratch_trk_hdr;    //8007EDE8\r\nextern track_header seq_track_header;   //8007EE74\r\nextern track_header base_track_header;  //8007EE8C\r\n\r\nstatic void wess_seq_err(int code)//800444B0\r\n{\r\n    if (Seq_Error_func) {\r\n\t\tSeq_Error_func(Seq_Error_module, code);\r\n\t}\r\n}\r\n\r\nvoid wess_seq_loader_install_error_handler(int (*error_func)(int, int), int module)//800444E8\r\n{\r\n    Seq_Error_func = error_func;\r\n\tSeq_Error_module = module;\r\n}\r\n\r\nint Is_Seq_Seq_Num_Valid(int seqnum)//80044500\r\n{\r\n    if (seqnum >= 0)\r\n    {\r\n        if(ref_max_seq_num <= seqnum)\r\n            return 0;\r\n\r\n        return 1;\r\n    }\r\n    return 0;\r\n}\r\n\r\nint open_sequence_data(void)//8004452C\r\n{\r\n    if (opencount == 0)\r\n    {\r\n        fp_seq_file = (Wess_File_IO_Struct *)module_open(loaderfile);\r\n        if(fp_seq_file == 0)\r\n        {\r\n            wess_seq_err(SEQLOAD_FOPEN);\r\n            return 0;\r\n        }\r\n    }\r\n\r\n    opencount += 1;\r\n    return 1;\r\n}\r\n\r\nvoid close_sequence_data(void)//80044598\r\n{\r\n    if (opencount == 1)\r\n\t{\r\n\t\tmodule_close(fp_seq_file);\r\n\t}\r\n\tif (opencount > 0)\r\n\t{\r\n\t\topencount -= 1;\r\n\t}\r\n}\r\n\r\nint wess_seq_load_sub(int seqnum, void *memptr)//800445EC\r\n{\r\n\tsequence_data *psq_info;\r\n\ttrack_data\t  *ptrk_info;\r\n\tint seqload;\r\n\tint seqread;\r\n\tint seqseek;\r\n\tint numtracks, k, loadit, tracknum, readbytes;\r\n\tchar *pmem;\r\n\r\n\t//printf(\"wess_seq_load_sub\\n\");\r\n\r\n\tpmem = memptr;\r\n\r\n\tif (seq_loader_enable)\r\n\t{\r\n\t\tif (!Is_Seq_Seq_Num_Valid(seqnum))\r\n\t\t\treturn 0;\r\n\r\n\t\tif (!open_sequence_data())\r\n\t\t{\r\n\t\t\twess_seq_err(SEQLOAD_FOPEN);\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\tpsq_info = (ref_pm_stat->pmod_info->pseq_info + seqnum); /* pointer math */\r\n\t\tpsq_info->ptrk_info = (track_data *)pmem;\r\n\r\n\t\tif (psq_info->trkstoload == 0)\r\n\t\t\tpmem += sizeof(track_data);\r\n\t\telse\r\n\t\t\tpmem += (psq_info->trkstoload * sizeof(track_data));\r\n\r\n\t\tseqseek = module_seek(fp_seq_file, psq_info->fileposition, PSXCD_SEEK_SET);\r\n\t\tif (seqseek)\r\n\t\t{\r\n\t\t\twess_seq_err(SEQLOAD_FSEEK);\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\treadbytes = sizeof(seq_header);\r\n\t\tseqread = module_read(&(ref_pm_stat->pmod_info->pseq_info + seqnum)->seq_hdr, readbytes, fp_seq_file);\r\n\r\n\t\tif (seqread != readbytes)\r\n\t\t{\r\n\t\t\twess_seq_err(SEQLOAD_FREAD);\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\tnumtracks = (ref_pm_stat->pmod_info->pseq_info + seqnum)->seq_hdr.tracks;\r\n\r\n\t\ttracknum = 0;\r\n\t\twhile (numtracks--)\r\n\t\t{\r\n\t\t\treadbytes = sizeof(track_header);\r\n\t\t\tseqread = module_read(&seq_track_header, readbytes, fp_seq_file);\r\n\r\n\t\t\tif (seqread != readbytes)\r\n\t\t\t{\r\n\t\t\t\twess_seq_err(SEQLOAD_FREAD);\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\r\n\t\t\tloadit = 0;\r\n\r\n\t\t\tif ((seq_track_header.voices_type == NoSound_ID) ||\r\n\t\t\t\t(seq_track_header.voices_type == GENERIC_ID))\r\n\t\t\t{\r\n\t\t\t\tloadit = 1;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tk = ref_pm_stat->patch_types_loaded;\r\n\t\t\t\twhile (k--)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (((seq_track_header.voices_type == (ref_pm_stat->ppat_info + k)->hw_tl_list.hardware_ID) &&\r\n\t\t\t\t\t\t(((seq_track_header.voices_class == SNDFX_CLASS) && ((ref_pm_stat->ppat_info + k)->hw_tl_list.flags_load & TAG_SOUND_EFFECTS)) ||\r\n\t\t\t\t\t\t((seq_track_header.voices_class == SFXDRUMS_CLASS) && ((ref_pm_stat->ppat_info + k)->hw_tl_list.flags_load & TAG_SOUND_EFFECTS)) ||\r\n\t\t\t\t\t\t\t((seq_track_header.voices_class == MUSIC_CLASS) && ((ref_pm_stat->ppat_info + k)->hw_tl_list.flags_load & TAG_MUSIC)) ||\r\n\t\t\t\t\t\t\t((seq_track_header.voices_class == DRUMS_CLASS) && ((ref_pm_stat->ppat_info + k)->hw_tl_list.flags_load & TAG_DRUMS)))))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tloadit = 1;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (loadit == 0)\r\n\t\t\t{\r\n\t\t\t\tseqseek = module_seek(fp_seq_file, (seq_track_header.labellist_count * sizeof(long)) + seq_track_header.data_size, PSXCD_SEEK_CUR);\r\n\t\t\t\tif (seqseek != 0)\r\n\t\t\t\t{\r\n\t\t\t\t\twess_seq_err(SEQLOAD_FSEEK);\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tptrk_info = ((ref_pm_stat->pmod_info->pseq_info + seqnum)->ptrk_info + tracknum);\r\n\r\n\t\t\t\tmemcpy(&ptrk_info->trk_hdr, &seq_track_header, sizeof(seq_track_header));\r\n\r\n\t\t\t\tif (seq_track_header.voices_type == GENERIC_ID)\r\n\t\t\t\t{\r\n\t\t\t\t\tptrk_info->trk_hdr.voices_type = NoSound_ID;\r\n\r\n\t\t\t\t\tif (seq_track_header.voices_class == SNDFX_CLASS || seq_track_header.voices_class == SFXDRUMS_CLASS)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tfor (k = 0; k < ref_pm_stat->patch_types_loaded; k++)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif ((ref_pm_stat->ppat_info + k)->hw_tl_list.flags_load  & TAG_SOUND_EFFECTS)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tptrk_info->trk_hdr.voices_type = (unsigned char)(pm_stat->ppat_info + k)->hw_tl_list.hardware_ID;\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (scratch_trk_hdr.voices_class == MUSIC_CLASS)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tfor (k = 0; k < ref_pm_stat->patch_types_loaded; k++)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif ((ref_pm_stat->ppat_info + k)->hw_tl_list.flags_load  & TAG_MUSIC)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tptrk_info->trk_hdr.voices_type = (unsigned char)(pm_stat->ppat_info + k)->hw_tl_list.hardware_ID;\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (scratch_trk_hdr.voices_class == DRUMS_CLASS)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tfor (k = 0; k < ref_pm_stat->patch_types_loaded; k++)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif ((ref_pm_stat->ppat_info + k)->hw_tl_list.flags_load  & TAG_DRUMS)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tptrk_info->trk_hdr.voices_type = (unsigned char)(pm_stat->ppat_info + k)->hw_tl_list.hardware_ID;\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tptrk_info->plabellist = (unsigned long *)pmem;\r\n\t\t\t\tpmem += (ptrk_info->trk_hdr.labellist_count * sizeof(long));\r\n\r\n\t\t\t\treadbytes = (ptrk_info->trk_hdr.labellist_count * sizeof(long));\r\n\t\t\t\tseqread = module_read(ptrk_info->plabellist, readbytes, fp_seq_file);\r\n\r\n\t\t\t\tif (seqread != readbytes)\r\n\t\t\t\t{\r\n\t\t\t\t\twess_seq_err(SEQLOAD_FREAD);\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tptrk_info->ptrk_data = (char *)pmem;\r\n\t\t\t\tpmem += (ptrk_info->trk_hdr.data_size);\r\n\r\n#if _ALIGN4_ == 1\r\n\t\t\t\t//force align to word boundary because previous pmem adjust\r\n\t\t\t\t//may wind up with odd address\r\n\t\t\t\tpmem += (unsigned int)pmem & 1;\r\n\t\t\t\tpmem += (unsigned int)pmem & 2;\r\n#endif\r\n\r\n\t\t\t\treadbytes = (ptrk_info->trk_hdr.data_size);\r\n\t\t\t\tseqread = module_read(ptrk_info->ptrk_data, readbytes, fp_seq_file);\r\n\r\n\t\t\t\tif (seqread != readbytes)\r\n\t\t\t\t{\r\n\t\t\t\t\twess_seq_err(SEQLOAD_FREAD);\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\ttracknum++;\r\n\t\t}\r\n\r\n\t\tif (psq_info->trkstoload == 0)\r\n\t\t{\r\n\t\t\tptrk_info = (ref_pm_stat->pmod_info->pseq_info + seqnum)->ptrk_info;\r\n\r\n\t\t\tmemcpy(&ptrk_info->trk_hdr, &base_track_header, sizeof(base_track_header));\r\n\r\n\t\t\tptrk_info->plabellist = (unsigned long *)pmem;\r\n\t\t\tptrk_info->ptrk_data = (char *)pmem;\r\n\r\n\t\t\t*ptrk_info->ptrk_data = Driver_Init;\r\n\t\t\t*(ptrk_info->ptrk_data + 1) = Reset_Gates;\r\n\t\t\tpmem += (ptrk_info->trk_hdr.data_size);\r\n\r\n#if _ALIGN4_ == 1\r\n\t\t//force align to word boundary because previous pmem adjust\r\n\t\t//may wind up with odd address\r\n\t\t\tpmem += (unsigned int)pmem & 1;\r\n\t\t\tpmem += (unsigned int)pmem & 2;\r\n#endif\r\n\t\t\t(ref_pm_stat->pmod_info->pseq_info+seqnum)->seq_hdr.tracks = 1;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t(ref_pm_stat->pmod_info->pseq_info+seqnum)->seq_hdr.tracks = psq_info->trkstoload;\r\n\t\t}\r\n\r\n\t\tclose_sequence_data();\r\n\t}\r\n\r\n\tk = (unsigned int)((unsigned)pmem - (unsigned)memptr);\r\n\treturn k;\r\n}\r\n\r\nint wess_seq_loader_init(void *input_pm_stat, char *seqfile, enum OpenSeqHandleFlag flag)//80044D98\r\n{\r\n    //printf(\"wess_seq_loader_init\\n\");\r\n\r\n    seq_loader_enable = 0;\r\n    loaderfile = seqfile;\r\n    ref_pm_stat = (pmasterstat *)input_pm_stat;\r\n\r\n    if (ref_pm_stat)\r\n    {\r\n\t\tseq_loader_enable = 1;\r\n        ref_max_seq_num = ref_pm_stat->pmod_info->mod_hdr.sequences;\r\n\r\n        base_track_header.priority = 0x80;\r\n        base_track_header.initvolume_cntrl = 0x7f;\r\n        base_track_header.initpan_cntrl = 0x40;\r\n        base_track_header.initppq = 120;\r\n        base_track_header.initqpm = 120;\r\n        base_track_header.voices_type = 0;\r\n        base_track_header.voices_max = 0;\r\n        base_track_header.reverb = 0;\r\n        base_track_header.voices_class = 0;\r\n        base_track_header.initpatchnum = 0;\r\n        base_track_header.initpitch_cntrl = 0;\r\n        base_track_header.substack_count = 0;\r\n        base_track_header.mutebits = 0;\r\n        base_track_header.labellist_count = 0;\r\n        base_track_header.data_size = 2;\r\n\r\n\t\tif (flag == YesOpenSeqHandle)\r\n\t\t{\r\n\t\t\tif (!open_sequence_data())\r\n\t\t\t{\r\n\t\t\t\twess_seq_err(SEQLOAD_FOPEN);\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn 1;\r\n}\r\n\r\nvoid wess_seq_loader_exit(void)//80044EAC\r\n{\r\n    close_sequence_data();\r\n    seq_loader_enable = 0;\r\n}\r\n\r\nint wess_seq_sizeof(int seqnum)//80044ED4\r\n{\r\n    sequence_data *psq_info;\r\n\r\n\tif (seq_loader_enable)\r\n\t{\r\n\t\tif (!Is_Seq_Seq_Num_Valid(seqnum))\r\n\t\t\treturn 0;\r\n\r\n\t\tpsq_info = ref_pm_stat->pmod_info->pseq_info+seqnum; /* pointer math */\r\n\r\n\t\tif (psq_info->ptrk_info)\r\n\t\t\treturn 0;\r\n\r\n\t\treturn (psq_info->trkinfolength);\r\n\t}\r\n\treturn 0;\r\n}\r\n\r\n\r\nint wess_seq_load(int seqnum, void *memptr)//80044F64\r\n{\r\n    if (seq_loader_enable)\r\n\t{\r\n\t\tif (!Is_Seq_Seq_Num_Valid(seqnum))\r\n            return 0;\r\n\r\n\t\tif ((ref_pm_stat->pmod_info->pseq_info+seqnum)->ptrk_info)\r\n\t\t\treturn 0;\r\n\r\n        //printf(\"wess_seq_load %d\\n\", seqnum);\r\n\t\treturn wess_seq_load_sub(seqnum, memptr);\r\n\t}\r\n\r\n\treturn 0;\r\n}\r\n\r\nint wess_seq_free(int seqnum)//80045008\r\n{\r\n    sequence_data *psq_info;\r\n\r\n\tif (seq_loader_enable)\r\n\t{\r\n\t\tif (!Is_Seq_Seq_Num_Valid(seqnum))\r\n\t\t\treturn 0;\r\n\r\n\t\tpsq_info = ref_pm_stat->pmod_info->pseq_info+seqnum; /* pointer math */\r\n\r\n\t\tif (psq_info->ptrk_info)\r\n\t\t{\r\n\t\t\tpsq_info->ptrk_info = 0;\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t}\r\n\treturn 0;\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/SEQLOAD.H",
    "content": "    /*------------------------------------------------------------------*/\r\n    /*\r\n                     The Williams Entertainment Sound System\r\n                            by Scott Patterson\r\n    */\r\n    /*------------------------------------------------------------------*/\r\n\r\n#ifndef _SEQLOAD_H\r\n#define _SEQLOAD_H\r\n\r\n#include <libspu.h>\r\n#include \"wessapi.h\"\r\n#include \"wessarc.h\"\r\n\r\nenum Seq_Load_Error {\r\n\r\n    SEQLOAD_NO_ERROR,\r\n    SEQLOAD_FOPEN,\r\n    SEQLOAD_FREAD,\r\n    SEQLOAD_FSEEK\r\n};\r\n\r\nenum OpenSeqHandleFlag {NoOpenSeqHandle,YesOpenSeqHandle};\r\n\r\n    /*\r\n        routine: wess_seq_loader_init()\r\n\r\n        - this routine must be called before and seq_loader_routines\r\n        - input_pm_stat is returned by wess_get_master_status()\r\n        - seqfile is the .wmd filename\r\n        - flag specifies if the file handle will be opened during init or\r\n          each time file is accessed\r\n    */\r\n\r\n\r\nextern int wess_seq_loader_init(void *input_pm_stat,\r\n                                char *seqfile,\r\n                                enum OpenSeqHandleFlag flag);\r\n\r\n    /*\r\n        routine: wess_seq_loader_exit()\r\n\r\n        - closes file handle if not already closed\r\n        - disables sequence loading calls\r\n    */\r\n\r\nextern void wess_seq_loader_exit(void);\r\n\r\n    /*\r\n        routine: wess_seq_loader_install_error_handler()\r\n\r\n        - for installing an error callback to notify file access errors\r\n        - module is your own ID returned as err_module parameter\r\n        - err_enum is the returned Seq_Load_Error enum parameter\r\n    */\r\n\r\nextern void wess_seq_loader_install_error_handler(int (*error_func)(int, int),\r\n                                                  int module);\r\n\r\n    /*\r\n        general loading guidelines:\r\n\r\n        - sizeof functions return the amount of bytes needed for data\r\n          not already loaded, therefore, when sizeof returns 0, this\r\n          means the data referred to is already loaded\r\n\r\n        - load functions only load data that is not already loaded\r\n          and return the amount of bytes loaded, memory is not allocated\r\n          internally, you must use the sizeof functions and allocate\r\n          memory yourself\r\n\r\n        - free functions mark data as not loaded, memory is not freed\r\n          internally, you must free memory yourself\r\n    */\r\n\r\n    /*\r\n        individual sequence loading\r\n    */\r\n\r\nextern int wess_seq_sizeof(int seqnum);\r\n\r\nextern int wess_seq_load(int seqnum,void *memptr);\r\n\r\nextern int wess_seq_free(int seqnum);\r\n\r\n    /*\r\n        sequence list loading\r\n\r\n        - pass in a list of sequnce numbers to be loaded\r\n        - end this list with the END_SEQ_LIST define\r\n    */\r\n\r\n#define END_SEQ_LIST -1\r\n\r\nextern int wess_seq_list_sizeof(short *seqlist);\r\n\r\nextern int wess_seq_list_load(short *seqlist,void *memptr);\r\n\r\nextern int wess_seq_list_free(short *seqlist);\r\n\r\n    /*\r\n        sequence range loading\r\n\r\n        - specify a number of consecutive sequences to be loaded\r\n    */\r\n\r\nextern int wess_seq_range_sizeof(int seqfirst,int numseqs);\r\n\r\nextern int wess_seq_range_load(int seqfirst,int numseqs,void *memptr);\r\n\r\nextern int wess_seq_range_free(int seqfirst,int numseqs);\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "PSXDOOM/SEQLOADR.C",
    "content": "// Reconstruido por Erick Vasquez Garcia 16/05/2019 [GEC]\r\n// Update 20/10/2019 [GEC]\r\n\r\n#include \"seqload.h\"\r\n#define _ALIGN4_ 1\r\n\r\n#include <stdio.h>\r\n\r\nextern pmasterstat *pm_stat;\r\n\r\nextern int seq_loader_enable;           //80075790\r\nextern char *seqfilename;\t\t        //80075794\r\nextern pmasterstat *seq_pm_stat;        //80075798\r\nextern int seq_maxsequences;            //8007579C\r\nextern char Driver_Init;                //800757A0\r\nextern char Reset_Gates;                //800757A1\r\nextern int\tseqopen;\t\t\t\t    //800757A4\r\nextern int(*Seq_Error_func)(int, int);  //800757A8\r\nextern int Seq_Error_module;            //800757AC\r\nextern Wess_File_IO_Struct *seqfileptr; //800757B0\r\n\r\nextern track_header scratch_trk_hdr;    //8007EDE8\r\nextern track_header seq_track_header;   //8007EE74\r\nextern track_header base_track_header;  //8007EE8C\r\n\r\n\r\nint wess_seq_range_sizeof(int seqfirst, int numseqs)//800497C0\r\n{\r\n    int count;\r\n\r\n\tcount = 0;\r\n\tif (seq_loader_enable)\r\n\t{\r\n\t\tif (numseqs == 0)\r\n\t\t\treturn 0;\r\n\r\n\t\twhile (numseqs--)\r\n\t\t{\r\n\t\t\tcount += wess_seq_sizeof(seqfirst);\r\n\t\t\tseqfirst += 1;\r\n\t\t}\r\n\t}\r\n\treturn (count);\r\n}\r\n\r\nint wess_seq_range_load(int seqfirst, int numseqs, void *memptr)//8004984C\r\n{\r\n    int count;\r\n    char *pmem;\r\n\r\n    pmem = (char *)memptr;\r\n\r\n\tcount = 0;\r\n\tif (seq_loader_enable)\r\n\t{\r\n\t\tif (!open_sequence_data() || !numseqs)\r\n\t\t\treturn 0;\r\n\r\n\t\twhile (numseqs--)\r\n\t\t{\r\n\t\t    //printf(\"----------------------\\n\");\r\n\t\t\tcount += wess_seq_load(seqfirst, pmem+count);\r\n\t\t\tseqfirst += 1;\r\n\t\t}\r\n\r\n\t\tclose_sequence_data();\r\n\t}\r\n\r\n\treturn count;\r\n}\r\n\r\nint wess_seq_range_free(int seqfirst, int numseqs)//80049900\r\n{\r\n    if (seq_loader_enable)\r\n\t{\r\n\t\tif (numseqs == 0)\r\n\t\t\treturn 0;\r\n\r\n\t\twhile (numseqs--)\r\n\t\t{\r\n\t\t\twess_seq_free(seqfirst);\r\n\t\t\tseqfirst += 1;\r\n\t\t}\r\n\t\treturn 1;\r\n\t}\r\n\treturn 0;\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/WESSAPI.C",
    "content": "// Reconstruido por Erick Vasquez Garcia 16/05/2019 [GEC]\r\n// Update_1 20/10/2019 [GEC]\r\n// Update_2 31/01/2020 [GEC]\r\n\r\n    /*-----------------------------------------------------------------*/\r\n    /*\r\n                     The Williams Entertainment Sound System\r\n                    Application Programming Interface Routines\r\n                            by Scott Patterson\r\n    */\r\n    /*----------------------------------------------------------------*/\r\n//#include \"win_port.h\"\r\n\r\n//#ifndef BLOCK_SOUND_WESS\r\n#include \"kernel.h\"\r\n#include \"wessarc.h\"\r\n#include \"wessapi.h\"\r\n#include \"wessseq.h\"\r\n//#include \"wessapix.h\"\r\n\r\n#define MINIMUM_TRACK_INDXS_FOR_A_SEQUENCE 4//10\r\n\r\n#define _ALIGN4_ 1\r\n\r\nstatic int conditional_read(int    readflag,\r\n                            char **ptrtomem,\r\n                            int    readsize);\r\n\r\nstatic void filltrackstat(track_status *ptk_stat,\r\n                          track_data *ptk_info,\r\n                          TriggerPlayAttr *attr);\r\n\r\nstatic void assigntrackstat(track_status *ptk_stat,\r\n                            track_data *ptk_info);\r\n\r\nextern int num_sd;                              //80075714\r\nextern char *wmd_file_ptr;                      //80075718\r\nextern char *wmd_file_ptr2;                     //8007571C\r\nextern Wess_File_IO_Struct *fp_wmd_file;        //80075720\r\nextern int sysinit;                             //80075724\r\nextern int module_loaded;                       //80075728\r\nextern int early_exit;                          //8007572C\r\nextern int max_seq_num;                         //80075730\r\nextern int mem_limit;                           //80075734\r\nextern patch_group_header scratch_pat_grp_hdr;  //8007EDE8\r\nextern track_header scratch_trk_hdr;            //8007EE04\r\nextern int wmd_mem_is_mine;                     //80075738\r\nextern char *wmd_mem;                           //8007573C\r\nextern char *wmd_end;                           //80075740\r\nextern int wmd_size;                            //80075744\r\nextern int (*Error_func)(int, int);             //80075748\r\nextern int Error_module;                        //8007574C\r\nextern pmasterstat *pm_stat;                    //800A8538\r\n\r\n#if 0 /* NO USED */\r\nstatic void err(int code) {\r\n\r\n    if(Error_func) {\r\n        Error_func(Error_module, code);\r\n    }\r\n}\r\n#endif\r\n\r\nstatic void zeroset(char *pdest, unsigned long size)//80041BE8\r\n{\r\n    while(size--) *pdest++ = 0;\r\n}\r\n\r\nvoid wess_install_error_handler(int (*error_func)(int, int), int module)//80041C14\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n    Error_func=error_func;\r\n    Error_module=module;\r\n#endif\r\n}\r\n\r\nvoid * wess_get_master_status (void)//80041C2C\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n\r\n    return pm_stat;\r\n#endif\r\n}\r\n\r\nint Is_System_Active(void)//80041C3C\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n    if(!sysinit)\r\n    {\r\n        return 0;\r\n    }\r\n    return 1;\r\n#endif\r\n}\r\n\r\nint Is_Module_Loaded(void)//80041C4C\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n    if(!module_loaded)\r\n    {\r\n        return 0;\r\n    }\r\n    return 1;\r\n#endif\r\n}\r\n\r\nint Is_Seq_Num_Valid(int seq_num)//80041C5C\r\n{\r\n #ifndef BLOCK_SOUND_WESS\r\n    if((seq_num<0) || (seq_num>=max_seq_num))\r\n    {\r\n        return 0;\r\n    } else if((pm_stat->pmod_info->pseq_info+seq_num)->ptrk_info==NULL) {\r\n        return 0;\r\n    }\r\n    return 1;\r\n#endif\r\n}\r\n\r\nvoid Register_Early_Exit(void)//80041CB8\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n    if(!early_exit)\r\n    {\r\n        early_exit = 1;\r\n    }\r\n#endif\r\n}\r\n\r\nvoid wess_install_handler (void)//80041CDC\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n    init_WessTimer();\r\n#endif\r\n}\r\n\r\nvoid wess_restore_handler (void)//80041CFC\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n    exit_WessTimer();\r\n#endif\r\n}\r\n\r\nint wess_init (void)//80041D1C\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n    int initok;\r\n\r\n    initok = 0;\r\n\r\n    if(!sysinit)\r\n    {\r\n        SeqOn = 0; /* make sure the SeqEngine is disabled */\r\n\r\n        if(!WessTimerActive)\r\n        {\r\n            wess_install_handler();\r\n        }\r\n        wess_low_level_init();\r\n\r\n        sysinit = 1;\r\n        initok = 1;\r\n    }\r\n    return (initok);\r\n#endif\r\n}\r\n\r\nvoid wess_exit (enum RestoreFlag rflag)//80041D80\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n\r\n    if(!Is_System_Active())\r\n    {\r\n        return;\r\n    }\r\n\r\n    if(sysinit)\r\n    {\r\n        if(module_loaded)\r\n        {\r\n            wess_unload_module();\r\n        }\r\n\r\n        wess_low_level_exit();\r\n        sysinit = 0;\r\n        if(rflag|WessTimerActive)\r\n        {\r\n            wess_restore_handler();\r\n        }\r\n    }\r\n#endif\r\n}\r\n\r\n\r\nchar *wess_get_wmd_start(void)//80041E0C\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n    return(wmd_mem);\r\n#endif\r\n}\r\n\r\nchar *wess_get_wmd_end(void)//80041E1C\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n    return(wmd_end);\r\n#endif\r\n}\r\n\r\nstatic void free_mem_if_mine(void)//80041E2C\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n    if(wmd_mem_is_mine)\r\n    {\r\n        if(wmd_mem!=NULL)\r\n        {\r\n            wess_free(wmd_mem);\r\n            wmd_mem=NULL;\r\n        }\r\n        wmd_mem_is_mine = 0;\r\n    }\r\n#endif\r\n}\r\n\r\nvoid wess_unload_module (void)//80041E7C\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n    int ptif,mi;\r\n\r\n    if(module_loaded)\r\n    {\r\n        wess_seq_stopall();\r\n        SeqOn = 0;\r\n\r\n        /* shutdown the loaded drivers and SeqEngine */\r\n\r\n        CmdFuncArr[NoSound_ID][DriverExit]((track_status *)pm_stat);\r\n\r\n        ptif = pm_stat->patch_types_loaded;\r\n        for(mi=0;mi<ptif;mi++)\r\n        {\r\n            if (((pm_stat->ppat_info + mi)->hw_tl_list.flags_load & (TAG_SOUND_EFFECTS| TAG_MUSIC| TAG_DRUMS)) != 0)\r\n            {\r\n                CmdFuncArr[(pm_stat->ppat_info+mi)->hw_tl_list.hardware_ID][DriverExit]((track_status *)pm_stat);\r\n            }\r\n        }\r\n\r\n        free_mem_if_mine();\r\n\r\n        module_loaded = 0;\r\n    }\r\n#endif\r\n}\r\n\r\nstatic void module_memcpy(void *pdest, void *psrc, unsigned long bytestocopy)//80041F88\r\n{\r\n    while(bytestocopy--)\r\n    {\r\n        *(char *)pdest++ = *(char *)psrc++;\r\n    }\r\n}\r\n\r\nint conditional_read(int readflag, char **ptrtomem, int readsize)//80041FBC\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n\r\n    if (readflag)\r\n\t{\r\n\t    //printf(\"conditional_read %d\\n\", readsize);\r\n\t\tmodule_memcpy(*ptrtomem, wmd_file_ptr, readsize);\r\n\t\twmd_file_ptr += readsize;\r\n\t\t*ptrtomem += readsize;\r\n\r\n#if _ALIGN4_ == 1\r\n\t\t//force align to word boundary because previous\r\n\t\t//pmem adjust may wind up with odd address\r\n\t\t*ptrtomem += (unsigned int)*ptrtomem & 1;\r\n\t\t*ptrtomem += (unsigned int)*ptrtomem & 2;\r\n#endif\r\n\t}\r\n\telse\r\n\t{\r\n\t\twmd_file_ptr += readsize;\r\n\t}\r\n\treturn (1);\r\n#endif\r\n}\r\n\r\nint wess_load_module (void *wmd_ptr,\r\n                      char *memory_pointer,\r\n                      int memory_allowance,\r\n                      int **settings_tag_lists)\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n\r\n    int i, j, k, n, z, types, num, indx, loadit;\r\n\tint tracks_toload;\r\n\tint readrequest, readresult;\r\n\tchar max_tracks_inseq, max_voices_intrk, max_substack_intrk;\r\n\tchar *pdest;\r\n\tchar *pmem;\r\n\tunsigned long patfpos, trkinfosize;\r\n\tchar *tempwmd;\r\n\tint setting, flag, flag2;\r\n\r\n\tmem_limit = memory_allowance;\r\n\ttempwmd = wmd_ptr;\r\n\r\n\tif (module_loaded)\r\n\t{\r\n\t\twess_unload_module();\r\n\t}\r\n\r\n\tnum_sd = get_num_Wess_Sound_Drivers(settings_tag_lists);\r\n\t//printf(\"num_sd %d\\n\", num_sd);\r\n\r\n\tif (memory_pointer == NULL)\r\n\t{\r\n\t\twmd_mem_is_mine = 1;\r\n\t\twmd_mem = (char *)wess_malloc(memory_allowance);\r\n\t\tif(wmd_mem == NULL)\r\n\t\t{\r\n\t\t\treturn(module_loaded);\r\n\t\t}\r\n\t}\r\n\telse {\r\n\t\twmd_mem_is_mine = 0;\r\n\t\twmd_mem = memory_pointer;\r\n\t}\r\n\r\n\twmd_size = memory_allowance;\r\n\tzeroset(wmd_mem, wmd_size);\r\n\r\n\tmax_seq_num = 0;\r\n\r\n\tif (!Is_System_Active())\r\n\t{\r\n\t\tfree_mem_if_mine();\r\n\t\treturn (module_loaded);\r\n\t}\r\n\r\n\tif (tempwmd == NULL)\r\n\t{\r\n\t\tfree_mem_if_mine();\r\n\t\treturn (module_loaded);\r\n\t}\r\n\r\n\t/*if (!(fp_wmd_file = module_open(wmd_filename)))\r\n\t{\r\n\t\terr(wess_FOPEN);\r\n\t\tfree_mem_if_mine();\r\n\t\treturn (module_loaded);\r\n\t}*/\r\n\r\n\tmax_tracks_inseq = MINIMUM_TRACK_INDXS_FOR_A_SEQUENCE;\r\n\t//printf(\"max_tracks_inseq %d\\n\", max_tracks_inseq);\r\n\tmax_voices_intrk = 0;\r\n\tmax_substack_intrk = 0;\r\n\r\n\t/* loads a related group of patches and sequences */\r\n\t/* a module has the information necessary to set up sequencer work\r\n\tareas and data areas */\r\n\t/*\r\n\tThe module loading sequence works as follows :\r\n\t*/\r\n\r\n\tpmem = wmd_mem;\r\n\r\n\t/*\r\n\t- allocate space for a master_status_structure\r\n\t- update the pmasterstat pointer\r\n\t*/\r\n\r\n\tpm_stat = (master_status_structure *)pmem;\r\n\tpmem += sizeof(*pm_stat);\r\n\r\n\tpm_stat->fp_module = (int)fp_wmd_file;//falta verificar\r\n\tpm_stat->pabstime = (unsigned long*)&millicount;\r\n\r\n\t/*\r\n\t- allocate for the module_data structure\r\n\t- update the pmod_info pointer\r\n\t*/\r\n\r\n\tpm_stat->pmod_info = (module_data *)pmem;\r\n\tpmem += sizeof(*pm_stat->pmod_info);\r\n\r\n\t/*\r\n\t- read in sizeof(pm_stat->pmod_info->mod_hdr)\r\n\tbytes from the .lmd file into the pm_stat->pmod_info->mod_hdr\r\n\tstructure.\r\n\t*/\r\n\r\n\twmd_file_ptr2 = tempwmd;\r\n\twmd_file_ptr = wmd_file_ptr2;\r\n\r\n\treadrequest = sizeof(pm_stat->pmod_info->mod_hdr);\r\n\t//module_read(&pm_stat->pmod_info->mod_hdr, tempwmd, readrequest);\r\n\tmodule_memcpy(&pm_stat->pmod_info->mod_hdr, tempwmd, readrequest);\r\n\twmd_file_ptr += readrequest;\r\n\r\n\t//readresult = module_read(&pm_stat->pmod_info->mod_hdr, readrequest, fp_wmd_file);\r\n\t/*if (readrequest != readresult)\r\n\t{\r\n\t\t//err(wess_FREAD);\r\n\t\tfree_mem_if_mine();\r\n\t\treturn(0);\r\n\t}*/\r\n\r\n\tif ((pm_stat->pmod_info->mod_hdr.module_id_text != WESS_SSSP_TEXT) ||\r\n\t\t(pm_stat->pmod_info->mod_hdr.module_version != WESS_CORE_VERSION))\r\n\t{\r\n\t\tfree_mem_if_mine();\r\n\t\treturn(0);\r\n\t}\r\n\t//printf(\"WESS_SSSP_TEXT %x\\n\", pm_stat->pmod_info->mod_hdr.module_id_text);\r\n\t//printf(\"WESS_CORE_VERSION %x\\n\", pm_stat->pmod_info->mod_hdr.module_version);\r\n\r\n\t/*\r\n\t--init work structures --------------------------------------------\r\n\t- allocate and initialize space for\r\n\tpmod_info->mod_hdr.seq_work_areas sequence_status structures\r\n\tand update the pmseqstattbl pointer and zero seqs_active.\r\n\t*/\r\n\r\n\tpm_stat->pseqstattbl = (sequence_status *)pmem;\r\n\tpmem += sizeof(*pm_stat->pseqstattbl) *\r\n\t\tpm_stat->pmod_info->mod_hdr.seq_work_areas;\r\n\r\n\t/*\r\n\t- allocate and initialize space for\r\n\tpmod_info->mod_hdr.trk_work_areas track_status structures\r\n\tand update the pmtrkstattbl pointer and zero trks_active.\r\n\t*/\r\n\r\n\tpm_stat->ptrkstattbl = (track_status *)pmem;\r\n\tpmem += sizeof(*pm_stat->ptrkstattbl) *\r\n\t\tpm_stat->pmod_info->mod_hdr.trk_work_areas;\r\n\r\n\t/*\r\n\t--load data structures --------------------------------------------\r\n\t- update pm_stat->patch_types with the sb_num global and\r\n\tallocate and copy in pm_stat->patch_types bytes\r\n\tof the patch_id_list and update the pm_stat->ppat_id_list pointer.\r\n\t*/\r\n\r\n\tpm_stat->patch_types_loaded = num_sd;\r\n\r\n\t/*\r\n\t- allocate and initialize space for master_volumes of each\r\n\tpatch type loaded.\r\n\t*/\r\n\r\n\tpm_stat->pmaster_volume = (char *)pmem;\r\n\tpmem += sizeof(char) * pm_stat->patch_types_loaded;\r\n#if _ALIGN4_ == 1\r\n\t//force align to word boundary because previous pmem adjust\r\n\t//may wind up with odd address\r\n\tpmem += (unsigned int)pmem & 1;\r\n\tpmem += (unsigned int)pmem & 2;\r\n#endif\r\n\r\n\r\n\tpdest = pm_stat->pmaster_volume;\r\n\tn = pm_stat->patch_types_loaded;\r\n\twhile (n--)\r\n\t{\r\n\t\t*pdest++ = 0x80;\r\n\t}\r\n\r\n\r\n\t/*\r\n\t- allocate and initialize space for\r\n\tpm_stat->patch_types patch_group_data structures\r\n\tand update the pm_stat->ppat_info pointer.\r\n\t*/\r\n\r\n\tpm_stat->ppat_info = (patch_group_data *)pmem;\r\n\tpmem += sizeof(*pm_stat->ppat_info) * pm_stat->patch_types_loaded;\r\n\r\n\t//printf(\"here\\n\");\r\n\r\n\tif (settings_tag_lists)\r\n\t{\r\n\t\tk = pm_stat->patch_types_loaded;\r\n\t\t//printf(\"k %d\\n\", k);\r\n\t\twhile (k--)\r\n\t\t{\r\n\t\t\t/* get the settings tags for this patch type */\r\n\r\n\t\t\t/*\r\n\t\t\tcopy settings_tag_lists to the patch's sndhw_tags array\r\n\t\t\t*/\r\n\t\t\tz = 0;\r\n\r\n\t\t\twhile (settings_tag_lists[k][z] != SNDHW_TAG_END)\r\n\t\t\t{\r\n\t\t\t\t(pm_stat->ppat_info + k)->sndhw_tags[z] = settings_tag_lists[k][z];\r\n\t\t\t\t(pm_stat->ppat_info + k)->sndhw_tags[z + 1] = settings_tag_lists[k][z + 1];\r\n\r\n\t\t\t\tif ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_DRIVER_ID)\r\n\t\t\t\t{\r\n\t\t\t\t\t(pm_stat->ppat_info + k)->hw_tl_list.hardware_ID = (pm_stat->ppat_info + k)->sndhw_tags[z + 1];\r\n\t\t\t\t}\r\n\t\t\t\telse if ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_SOUND_EFFECTS)\r\n\t\t\t\t{\r\n\t\t\t\t\tsetting = (pm_stat->ppat_info + k)->sndhw_tags[z + 1];\r\n\t\t\t\t\tflag = (pm_stat->ppat_info + k)->hw_tl_list.flags_load;\r\n\r\n\t\t\t\t\tflag2 = flag & ~TAG_SOUND_EFFECTS;\r\n\t\t\t\t\tflag = (flag & 1 | setting) & 1;\r\n\t\t\t\t\t(pm_stat->ppat_info + k)->hw_tl_list.flags_load = (flag2 | flag);\r\n\t\t\t\t}\r\n\t\t\t\telse if ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_MUSIC)\r\n\t\t\t\t{\r\n\t\t\t\t\tsetting = (pm_stat->ppat_info + k)->sndhw_tags[z + 1];\r\n\t\t\t\t\tflag = (pm_stat->ppat_info + k)->hw_tl_list.flags_load;\r\n\r\n\t\t\t\t\tflag2 = flag & ~TAG_MUSIC;\r\n\t\t\t\t\tflag = ((flag >> 1 & 1 | setting) & 1) << 1;\r\n\t\t\t\t\t(pm_stat->ppat_info + k)->hw_tl_list.flags_load = (flag2 | flag);\r\n\t\t\t\t}\r\n\t\t\t\telse if ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_DRUMS)\r\n\t\t\t\t{\r\n\t\t\t\t\tsetting = (pm_stat->ppat_info + k)->sndhw_tags[z + 1];\r\n\t\t\t\t\tflag = (pm_stat->ppat_info + k)->hw_tl_list.flags_load;\r\n\r\n\t\t\t\t\tflag2 = flag & ~TAG_DRUMS;\r\n\t\t\t\t\tflag = ((flag >> 2 & 1 | setting) & 1) << 2;\r\n\t\t\t\t\t(pm_stat->ppat_info + k)->hw_tl_list.flags_load = (flag2 | flag);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t/*if ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_DRIVER_ID)\r\n\t\t\t\t\t(pm_stat->ppat_info + k)->hw_tl_list.hardware_ID = (pm_stat->ppat_info + k)->sndhw_tags[z + 1];\r\n\t\t\t\telse if ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_SOUND_EFFECTS)\r\n\t\t\t\t\t(pm_stat->ppat_info + k)->hw_tl_list.sfxload |= (pm_stat->ppat_info + k)->sndhw_tags[z + 1];\r\n\t\t\t\telse if ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_MUSIC)\r\n\t\t\t\t\t(pm_stat->ppat_info + k)->hw_tl_list.musload |= (pm_stat->ppat_info + k)->sndhw_tags[z + 1];\r\n\t\t\t\telse if ((pm_stat->ppat_info + k)->sndhw_tags[z] == SNDHW_TAG_DRUMS)\r\n\t\t\t\t\t(pm_stat->ppat_info + k)->hw_tl_list.drmload |= (pm_stat->ppat_info + k)->sndhw_tags[z + 1];*/\r\n\r\n\t\t\t\tz += 2;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//printf(\"z %d\\n\", z);\r\n\r\n\t/*\r\n\t- for pm_stat->patch_types scan through the\r\n\tpm_stat->pmod_info->pmod_hdr.patch_types_infile\r\n\tand load each patch_area with a matching patch_id\r\n\t*/\r\n\r\n\tpm_stat->voices_total = 0;\r\n\r\n\tj = pm_stat->pmod_info->mod_hdr.patch_types_infile;\r\n\twhile (j--)\r\n\t{\r\n\t\treadrequest = sizeof(scratch_pat_grp_hdr);\r\n\t\t//printf(\"readrequest %d\\n\", readrequest);\r\n\t\t//module_read(&scratch_pat_grp_hdr, wmd_file_ptr, readrequest);\r\n\t\tmodule_memcpy(&scratch_pat_grp_hdr, wmd_file_ptr, readrequest);\r\n\t\twmd_file_ptr += readrequest;\r\n\r\n\t\t//printf(\"load_flags %d\\n\", (unsigned int)scratch_pat_grp_hdr.load_flags);\r\n\r\n\t\t/*readresult = module_read(&scratch_pat_grp_hdr, readrequest, fp_wmd_file);\r\n\t\tif (readrequest != readresult)\r\n\t\t{\r\n\t\t\terr(wess_FREAD);\r\n\t\t\tfree_mem_if_mine();\r\n\t\t\treturn(0);\r\n\t\t}*/\r\n\r\n\t\tk = pm_stat->patch_types_loaded;\r\n\t\twhile (k--)\r\n\t\t{\r\n\t\t\tif (scratch_pat_grp_hdr.patch_id == (pm_stat->ppat_info + k)->hw_tl_list.hardware_ID)\r\n\t\t\t{\r\n\t\t\t\tmemcpy(&(pm_stat->ppat_info + k)->pat_grp_hdr,\r\n\t\t\t\t\t&scratch_pat_grp_hdr,\r\n\t\t\t\t\tsizeof(scratch_pat_grp_hdr));\r\n\r\n\t\t\t\t/*(pm_stat->ppat_info + k)->pat_grp_hdr.load_flags = scratch_pat_grp_hdr.load_flags;\r\n\t\t\t\t(pm_stat->ppat_info + k)->pat_grp_hdr.patch_id = scratch_pat_grp_hdr.patch_id;\r\n\t\t\t\t//(pm_stat->ppat_info + k)->pat_grp_hdr.hw_voice_limit = scratch_pat_grp_hdr.hw_voice_limit;//\r\n\t\t\t\t//(pm_stat->ppat_info + k)->pat_grp_hdr.pad1 = scratch_pat_grp_hdr.pad1;//\r\n\t\t\t\t(pm_stat->ppat_info + k)->pat_grp_hdr.patches = scratch_pat_grp_hdr.patches;\r\n\t\t\t\t//(pm_stat->ppat_info + k)->pat_grp_hdr.patch_size = scratch_pat_grp_hdr.patch_size;//\r\n\t\t\t\t(pm_stat->ppat_info + k)->pat_grp_hdr.patchmaps = scratch_pat_grp_hdr.patchmaps;\r\n\t\t\t\t//(pm_stat->ppat_info + k)->pat_grp_hdr.patchmap_size = scratch_pat_grp_hdr.patchmap_size;//\r\n\t\t\t\t(pm_stat->ppat_info + k)->pat_grp_hdr.patchinfo = scratch_pat_grp_hdr.patchinfo;\r\n\t\t\t\t//(pm_stat->ppat_info + k)->pat_grp_hdr.patchinfo_size = scratch_pat_grp_hdr.patchinfo_size;//\r\n\t\t\t\t(pm_stat->ppat_info + k)->pat_grp_hdr.drummaps = scratch_pat_grp_hdr.drummaps;\r\n\t\t\t\t//(pm_stat->ppat_info + k)->pat_grp_hdr.drummap_size = scratch_pat_grp_hdr.drummap_size;//\r\n\t\t\t\t(pm_stat->ppat_info + k)->pat_grp_hdr.extra_data_size = scratch_pat_grp_hdr.extra_data_size;*/\r\n\r\n\t\t\t\tpm_stat->voices_total += scratch_pat_grp_hdr.hw_voice_limit;\r\n\r\n\t\t\t\t(pm_stat->ppat_info + k)->ppat_data = pmem;\r\n\r\n\t\t\t\t//patfpos = module_tell(fp_wmd_file);\r\n\r\n\t\t\t\t//?? Checkear\r\n\t\t\t\tpatfpos = (unsigned long)((unsigned long)wmd_file_ptr - (unsigned long)wmd_file_ptr2);\r\n\t\t\t\t//printf(\"patfpos %d\\n\", patfpos);\r\n\r\n\r\n\t\t\t\t(pm_stat->ppat_info + k)->data_fileposition = patfpos;\r\n\r\n\t\t\t\tif (!conditional_read(scratch_pat_grp_hdr.load_flags & LOAD_PATCHES,\r\n\t\t\t\t\t&pmem,\r\n\t\t\t\t\t(int)scratch_pat_grp_hdr.patches *\r\n\t\t\t\t\t(int)scratch_pat_grp_hdr.patch_size))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn(0);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!conditional_read(scratch_pat_grp_hdr.load_flags & LOAD_PATCHMAPS,\r\n\t\t\t\t\t&pmem,\r\n\t\t\t\t\t(int)scratch_pat_grp_hdr.patchmaps *\r\n\t\t\t\t\t(int)scratch_pat_grp_hdr.patchmap_size))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn(0);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!conditional_read(scratch_pat_grp_hdr.load_flags & LOAD_PATCHINFO,\r\n\t\t\t\t\t&pmem,\r\n\t\t\t\t\t(int)scratch_pat_grp_hdr.patchinfo *\r\n\t\t\t\t\t(int)scratch_pat_grp_hdr.patchinfo_size))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn(0);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!conditional_read(scratch_pat_grp_hdr.load_flags & LOAD_DRUMMAPS,\r\n\t\t\t\t\t&pmem,\r\n\t\t\t\t\t(int)scratch_pat_grp_hdr.drummaps *\r\n\t\t\t\t\t(int)scratch_pat_grp_hdr.drummap_size))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn(0);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!conditional_read(scratch_pat_grp_hdr.load_flags & LOAD_EXTRADATA,\r\n\t\t\t\t\t&pmem,\r\n\t\t\t\t\t(int)scratch_pat_grp_hdr.extra_data_size))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn(0);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/*\r\n\t- allocate and initialize space for\r\n\tvoice_total voice_status structures\r\n\tand update the pmvoicestattbl pointer and zero voices_active.\r\n\t*/\r\n\r\n\tpm_stat->pvoicestattbl = (voice_status *)pmem;\r\n\tpmem += sizeof(*pm_stat->pvoicestattbl) * pm_stat->voices_total;\r\n\r\n\t/*\r\n\t- initialize patch_type parameter for each voice work area.\r\n\tonly the amount of hardware voices possible for each\r\n\tpatch_type loaded will have voice work areas!!!\r\n\tyou will run out of voice work areas for a given patch type\r\n\tat the same time you have run out of hardware polyphony!!!\r\n\teh,eh,this is cool!,eh,eh\r\n\t*/\r\n\r\n\tif (pm_stat->patch_types_loaded)\r\n\t{\r\n\t\ttypes = pm_stat->patch_types_loaded;\r\n\t\tn = 0;\r\n\t\tnum = (pm_stat->ppat_info + n)->pat_grp_hdr.hw_voice_limit;\r\n\t\tindx = 0;\r\n\r\n\t\tfor (i = 0; i<pm_stat->voices_total; i++)\r\n\t\t{\r\n\t\t\tif (types)\r\n\t\t\t{\r\n\t\t\t\tif (num--)\r\n\t\t\t\t{\r\n\t\t\t\t\t(pm_stat->pvoicestattbl + i)->patchtype =\r\n\t\t\t\t\t\t(pm_stat->ppat_info + n)->pat_grp_hdr.patch_id;\r\n\t\t\t\t\t(pm_stat->pvoicestattbl + i)->refindx = indx++;//ó 0\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tn++;\r\n\t\t\t\t\tif (--types)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tnum = (pm_stat->ppat_info + n)->pat_grp_hdr.hw_voice_limit;\r\n\t\t\t\t\t\tindx = 0;\r\n\t\t\t\t\t\tif (num--)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t(pm_stat->pvoicestattbl + i)->patchtype =\r\n\t\t\t\t\t\t\t\t(pm_stat->ppat_info + n)->pat_grp_hdr.patch_id;\r\n\t\t\t\t\t\t\t(pm_stat->pvoicestattbl + i)->refindx = indx++;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/*\r\n\t- allocate and initialize space for\r\n\tpmod_info->mod_hdr.sequences sequence_data structures\r\n\tand update the pmod_info->pseq_info pointer.\r\n\t*/\r\n\r\n\tpm_stat->pmod_info->pseq_info = (sequence_data *)pmem;\r\n\tpmem += sizeof(*pm_stat->pmod_info->pseq_info) *\r\n\t\tpm_stat->pmod_info->mod_hdr.sequences;\r\n\r\n\t/*\r\n\t- for mod_hdr.sequences fill the sequence_data structures :\r\n\tread in pseq_info->seq_hdr,\r\n\tsave fp_wmd_file pointer and\r\n\tscan throuch pseq_info->seq_hdr.tracks of track_headers\r\n\tseeking over the data to get to each header and\r\n\tincrement track_toload for each voice_type matching any\r\n\tmembers of the pm_stat->ppat_id_list\r\n\tupdate pseq_info->ptrk_info pointer and\r\n\tallocate the resultant track_toload track_data structures\r\n\tseek to the saved fp_wmd_file pointer and read in each\r\n\ttrack_hdr with a voice_type matching the pm_stat->ppat_id_list\r\n\tand allocate and read in the corresponding data section :\r\n\tpoint pseq_info->ptrk_info->ptrk_data at this area,\r\n\tread in pseq_info->ptrk_info->data_size to this pointer.\r\n\tseek over non matching tracks.\r\n\tassign pseq_info->tracks = tracks_toload,\r\n\tfor pseq_info->tracks fill the track_data structures that are\r\n\tof correct voices_type :\r\n\tread in sizeof(pseq_info->ptrk_info->trk_hdr),\r\n\tif it is in the tracks_toload the\r\n\tallocate pseq_info->ptrk_info->trk_hdr.voices_max chars,\r\n\tpoint pseq_info->ptrk_info->pvoices_indx at this area,\r\n\tallocate pseq_info->ptrk_info->trk_hdr.substack_size pointers,\r\n\tpoint pseq_info->ptrk_info->psubstack at this area,\r\n\tallocate pseq_info->ptrk_info->trk_hdr.labellist_size pointers,\r\n\tpoint pseq_info->ptrk_info->plabellist at this area,\r\n\tallocate pseq_info->ptrk_info->trk_hdr.data_size chars,\r\n\tupdate pm_stat->pmod_info->pseq_info->seq_hdr.tracks for\r\n\teach sequence with the number of tracks actually loaded.\r\n\t*/\r\n\r\n\tfor (i = 0; i<pm_stat->pmod_info->mod_hdr.sequences; i++)\r\n\t{\r\n\t\tpatfpos = (unsigned long)((unsigned long)wmd_file_ptr - (unsigned long)wmd_file_ptr2);\r\n        //printf(\"--------\\n\");\r\n        //printf(\"num %d\\n\",i);\r\n        //printf(\"patfpos %d\\n\", patfpos);\r\n\t\treadrequest = sizeof(pm_stat->pmod_info->pseq_info->seq_hdr);\r\n\t\t//printf(\"readrequest %d\\n\", readrequest);\r\n\r\n\t\t//module_read(&(pm_stat->pmod_info->pseq_info + i)->seq_hdr, wmd_file_ptr, readrequest);\r\n\t\tmodule_memcpy(&(pm_stat->pmod_info->pseq_info + i)->seq_hdr, wmd_file_ptr, readrequest);\r\n\t\twmd_file_ptr += readrequest;\r\n\r\n\t\t/*patfpos = module_tell(fp_wmd_file);\r\n\r\n\t\treadrequest = sizeof(pm_stat->pmod_info->pseq_info->seq_hdr);\r\n\t\treadresult = module_read(&(pm_stat->pmod_info->pseq_info + i)->seq_hdr, readrequest, fp_wmd_file);\r\n\t\tif (readrequest != readresult)\r\n\t\t{\r\n\t\t\terr(wess_FREAD);\r\n\t\t\tfree_mem_if_mine();\r\n\t\t\treturn(0);\r\n\t\t}*/\r\n\r\n\r\n\t\ttracks_toload = 0;\r\n\t\ttrkinfosize = 0;\r\n\r\n\r\n\t\tj = (pm_stat->pmod_info->pseq_info + i)->seq_hdr.tracks;\r\n\t\t//printf(\"tracks %d\\n\", j);\r\n\t\twhile (j--)\r\n\t\t{\r\n\t\t\treadrequest = sizeof(scratch_trk_hdr);\r\n\t\t\t//printf(\"readrequest %d\\n\", readrequest);\r\n\t\t\t//module_read(&scratch_trk_hdr, wmd_file_ptr, readrequest);\r\n\t\t\tmodule_memcpy(&scratch_trk_hdr, wmd_file_ptr, readrequest);\r\n\r\n\t\t\t/*printf(\"voices_type %d\\n\",scratch_trk_hdr.voices_type);\r\n            printf(\"voices_max %d\\n\",scratch_trk_hdr.voices_max);\r\n            printf(\"priority %d\\n\",scratch_trk_hdr.priority);\r\n            printf(\"lockchannel %d\\n\",scratch_trk_hdr.lockchannel);\r\n            printf(\"voices_class %d\\n\",scratch_trk_hdr.voices_class);\r\n            printf(\"reverb %d\\n\",scratch_trk_hdr.reverb);\r\n            printf(\"initpatchnum %d\\n\",scratch_trk_hdr.initpatchnum);\r\n            printf(\"initpitch_cntrl %d\\n\",scratch_trk_hdr.initpitch_cntrl);\r\n            printf(\"initvolume_cntrl %d\\n\",scratch_trk_hdr.initvolume_cntrl);\r\n            printf(\"initpan_cntrl %d\\n\",scratch_trk_hdr.initpan_cntrl);\r\n            printf(\"substack_count %d\\n\",scratch_trk_hdr.substack_count);\r\n            printf(\"mutebits %d\\n\",scratch_trk_hdr.mutebits);\r\n            printf(\"initppq %d\\n\",scratch_trk_hdr.initppq);\r\n            printf(\"initqpm %d\\n\",scratch_trk_hdr.initqpm);\r\n            printf(\"labellist_count %d\\n\",scratch_trk_hdr.labellist_count);\r\n            printf(\"data_size %d\\n\",scratch_trk_hdr.data_size);*/\r\n\r\n\t\t\twmd_file_ptr += readrequest;\r\n\r\n\t\t\t/*readresult = module_read(&scratch_trk_hdr, readrequest, fp_wmd_file);\r\n\t\t\tif (readrequest != readresult)\r\n\t\t\t{\r\n\t\t\t\terr(wess_FREAD);\r\n\t\t\t\tfree_mem_if_mine();\r\n\t\t\t\treturn(0);\r\n\t\t\t}*/\r\n\r\n\t\t\tloadit = 0;\r\n\t\t\tif ((scratch_trk_hdr.voices_type == NoSound_ID) ||\r\n\t\t\t\t(scratch_trk_hdr.voices_type == GENERIC_ID))\r\n\t\t\t{\r\n\t\t\t\tloadit = 1;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tk = pm_stat->patch_types_loaded;\r\n\t\t\t\twhile (k--)\r\n\t\t\t\t{\r\n\t\t\t\t\t/*if (((scratch_trk_hdr.voices_type == (pm_stat->ppat_info + k)->hw_tl_list.hardware_ID) &&\r\n\t\t\t\t\t\t(((scratch_trk_hdr.voices_class == SNDFX_CLASS) && (pm_stat->ppat_info + k)->hw_tl_list.sfxload) ||\r\n\t\t\t\t\t\t((scratch_trk_hdr.voices_class == SFXDRUMS_CLASS) && (pm_stat->ppat_info + k)->hw_tl_list.sfxload) ||\r\n\t\t\t\t\t\t\t((scratch_trk_hdr.voices_class == MUSIC_CLASS) && (pm_stat->ppat_info + k)->hw_tl_list.musload) ||\r\n\t\t\t\t\t\t\t((scratch_trk_hdr.voices_class == DRUMS_CLASS) && (pm_stat->ppat_info + k)->hw_tl_list.drmload))))*/\r\n\t\t\t\t\tif (((scratch_trk_hdr.voices_type == (pm_stat->ppat_info + k)->hw_tl_list.hardware_ID) &&\r\n\t\t\t\t\t\t(((scratch_trk_hdr.voices_class == SNDFX_CLASS) && ((pm_stat->ppat_info + k)->hw_tl_list.flags_load & TAG_SOUND_EFFECTS)) ||\r\n\t\t\t\t\t\t((scratch_trk_hdr.voices_class == SFXDRUMS_CLASS) && ((pm_stat->ppat_info + k)->hw_tl_list.flags_load & TAG_SOUND_EFFECTS)) ||\r\n\t\t\t\t\t\t\t((scratch_trk_hdr.voices_class == MUSIC_CLASS) && ((pm_stat->ppat_info + k)->hw_tl_list.flags_load & TAG_MUSIC)) ||\r\n\t\t\t\t\t\t\t((scratch_trk_hdr.voices_class == DRUMS_CLASS) && ((pm_stat->ppat_info + k)->hw_tl_list.flags_load & TAG_DRUMS)))))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tloadit = 1;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t//printf(\"loadit %d\\n\", loadit);\r\n\t\t\tif (loadit)\r\n\t\t\t{\r\n\r\n\t\t\t\ttrkinfosize += sizeof(*pm_stat->pmod_info->pseq_info->ptrk_info) +\r\n\t\t\t\t\t(scratch_trk_hdr.labellist_count * sizeof(long)) +\r\n\t\t\t\t\tscratch_trk_hdr.data_size;\r\n\r\n                //printf(\"trkinfosize %d\\n\", trkinfosize);\r\n#if _ALIGN4_ == 1\r\n\t\t\t\t//force align to word boundary because previous size adjust\r\n\t\t\t\t//may wind up with odd address\r\n\t\t\t\ttrkinfosize += trkinfosize & 1;\r\n\t\t\t\ttrkinfosize += trkinfosize & 2;\r\n#endif\r\n\r\n\t\t\t\tif (scratch_trk_hdr.voices_max > max_voices_intrk)\r\n\t\t\t\t{\r\n\t\t\t\t\tmax_voices_intrk = scratch_trk_hdr.voices_max;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (scratch_trk_hdr.substack_count > max_substack_intrk)\r\n\t\t\t\t{\r\n\t\t\t\t\tmax_substack_intrk = scratch_trk_hdr.substack_count;\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttracks_toload++;\r\n\t\t\t}\r\n\r\n\t\t\twmd_file_ptr += (scratch_trk_hdr.labellist_count * sizeof(long)) +\r\n\t\t\t\tscratch_trk_hdr.data_size;\r\n\r\n\t\t\t/*if (module_seek(fp_wmd_file,\r\n\t\t\t\t(scratch_trk_hdr.labellist_count * sizeof(long)) +\r\n\t\t\t\tscratch_trk_hdr.data_size,\r\n\t\t\t\tSEEK_CUR))\r\n\t\t\t{\r\n\t\t\t\terr(wess_FSEEK);\r\n\t\t\t\tfree_mem_if_mine();\r\n\t\t\t\treturn(0);\r\n\t\t\t}*/\r\n\t\t}\r\n\r\n\t\tif (tracks_toload>max_tracks_inseq)\r\n\t\t{\r\n\t\t\tmax_tracks_inseq = tracks_toload;\r\n\t\t}\r\n\r\n\t\tif (tracks_toload == 0)\r\n\t\t{\r\n\t\t\t/* since there are no tracks to load we create area for the\r\n\t\t\ttrack info + 2 (0 delta and TrkEnd) */\r\n\t\t\ttrkinfosize = sizeof(*pm_stat->pmod_info->pseq_info->ptrk_info) + 2;\r\n#if _ALIGN4_ == 1\r\n\t\t\t//force align to word boundary because previous size adjust\r\n\t\t\t//may wind up with odd address\r\n\t\t\ttrkinfosize += trkinfosize & 1;\r\n\t\t\ttrkinfosize += trkinfosize & 2;\r\n#endif\r\n\r\n\t\t}\r\n\r\n\t\t(pm_stat->pmod_info->pseq_info + i)->trkstoload = tracks_toload;\r\n\t\t(pm_stat->pmod_info->pseq_info + i)->trkinfolength = trkinfosize;\r\n\t\t(pm_stat->pmod_info->pseq_info + i)->fileposition = patfpos;\r\n\t}\r\n\r\n\t/* now we dont load the track data anymore */\r\n\t/* now we dont load the track data anymore */\r\n\t/* now we dont load the track data anymore */\r\n\r\n\t/*\r\n\t- allocate pm_stat->max_tracks_inseq chars for the ptrk_indxs\r\n\tpointers in each sequence_status structure.\r\n\tupdate each pointer to each area.\r\n\tinitialize indexes to 0xFF.\r\n\t*/\r\n\r\n\tpm_stat->pcalltable = (callback_status *)pmem;\r\n\tpmem += sizeof(*pm_stat->pcalltable) *\r\n\t\tpm_stat->pmod_info->mod_hdr.callback_areas;\r\n\r\n\tpm_stat->max_trks_perseq = max_tracks_inseq;\r\n\r\n\tfor (i = 0; i<pm_stat->pmod_info->mod_hdr.seq_work_areas; i++)\r\n\t{\r\n\t\t(pm_stat->pseqstattbl + i)->pgates = (char *)pmem;\r\n\t\tpmem += sizeof(char) *\r\n\t\t\tpm_stat->pmod_info->mod_hdr.gates_per_seq;\r\n#if _ALIGN4_ == 1\r\n\t\t//force align to word boundary because previous pmem adjust\r\n\t\t//may wind up with odd address\r\n\t\tpmem += (unsigned int)pmem & 1;\r\n\t\tpmem += (unsigned int)pmem & 2;\r\n#endif\r\n\r\n\r\n\t\t(pm_stat->pseqstattbl + i)->piters = (char *)pmem;\r\n\t\tpmem += sizeof(char) *\r\n\t\t\tpm_stat->pmod_info->mod_hdr.iters_per_seq;\r\n#if _ALIGN4_ == 1\r\n\t\t//force align to word boundary because previous pmem adjust\r\n\t\t//may wind up with odd address\r\n\t\tpmem += (unsigned int)pmem & 1;\r\n\t\tpmem += (unsigned int)pmem & 2;\r\n#endif\r\n\r\n\r\n\t\tj = max_tracks_inseq;//\r\n\t\tpdest = (pm_stat->pseqstattbl + i)->ptrk_indxs = (char *)pmem;\r\n\t\tpmem += sizeof(char) * j;\r\n#if _ALIGN4_ == 1\r\n\t\t//force align to word boundary because previous pmem adjust\r\n\t\t//may wind up with odd address\r\n\t\tpmem += (unsigned int)pmem & 1;\r\n\t\tpmem += (unsigned int)pmem & 2;\r\n#endif\r\n\r\n\t\twhile (j--)\r\n\t\t{\r\n\t\t\t*pdest++ = 0xFF;\r\n\t\t}\r\n\t}\r\n\r\n\t/*\r\n\t- allocate pm_stat->max_voices_intrk chars for the pvoice_indxs\r\n\tpointers in each track_status structure.\r\n\tupdate each pointer to each area.\r\n\tinitialize indexes to 0xFF.\r\n\t*/\r\n\r\n\tpm_stat->max_voices_pertrk = max_voices_intrk;\r\n\r\n\tpm_stat->max_substack_pertrk = max_substack_intrk;\r\n\r\n\tfor (i = 0; i<pm_stat->pmod_info->mod_hdr.trk_work_areas; i++)\r\n\t{\r\n\t\t(pm_stat->ptrkstattbl + i)->refindx = i;\r\n\t\t(pm_stat->ptrkstattbl + i)->psubstack = (unsigned char**)pmem;\r\n\t\t/* (pm_stat->ptrkstattbl+i)->psp is set when sequence is triggered */\r\n\t\tpmem += sizeof(long) * pm_stat->max_substack_pertrk;\r\n\t\t(pm_stat->ptrkstattbl + i)->pstackend = (unsigned char**)pmem;\r\n\t}\r\n\r\n\t/* load the drivers here */\r\n\t/* load the drivers here */\r\n\t/* load the drivers for each patch type and update the CmdFuncArr */\r\n\t/* load the drivers here */\r\n\t/* load the drivers here */\r\n\r\n\t/* initialize the loaded drivers and SeqEngine */\r\n\r\n\tCmdFuncArr[NoSound_ID][DriverInit]((track_status *)pm_stat);\r\n\r\n\tfor (i = 0; i<pm_stat->patch_types_loaded; i++)\r\n\t{\r\n\t\t/*if ((pm_stat->ppat_info + i)->hw_tl_list.sfxload ||\r\n\t\t\t(pm_stat->ppat_info + i)->hw_tl_list.musload ||\r\n\t\t\t(pm_stat->ppat_info + i)->hw_tl_list.drmload)*/\r\n\t\tif (((pm_stat->ppat_info + i)->hw_tl_list.flags_load & (TAG_SOUND_EFFECTS| TAG_MUSIC| TAG_DRUMS)) != 0)\r\n\t\t{\r\n\t\t\tCmdFuncArr[(pm_stat->ppat_info + i)->hw_tl_list.hardware_ID][DriverInit]((track_status *)pm_stat);\r\n\t\t}\r\n\t}\r\n\r\n\t//module_close(fp_wmd_file);\r\n\r\n\tmax_seq_num = pm_stat->pmod_info->mod_hdr.sequences;\r\n\r\n#if _ALIGN4_ == 1\r\n\t//force align to word boundary because previous pmem adjust\r\n\t//may wind up with odd address\r\n\tpmem += (unsigned int)pmem & 1;\r\n\tpmem += (unsigned int)pmem & 2;\r\n#endif\r\n\twmd_end = pmem;\r\n\tmodule_loaded = 1;\r\n\tSeqOn = 1;\r\n\r\n\treturn (1);\r\n#endif\r\n}\r\n\r\nvoid filltrackstat(track_status *ptk_stat, track_data *ptk_info, TriggerPlayAttr *attr)//80042E34\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n\r\n    int tempmask;\r\n\r\n    //printf(\"---------------------------------------\\n\");\r\n\tptk_stat->flags = (ptk_stat->flags | TRK_ACTIVE) & ~(TRK_TIMED | TRK_LOOPED | TRK_SKIP | TRK_OFF);\r\n\tptk_stat->patchtype = ptk_info->trk_hdr.voices_type;\r\n\tptk_stat->priority = ptk_info->trk_hdr.priority;\r\n\tptk_stat->voices_active = 0;\r\n\tptk_stat->sndclass = ptk_info->trk_hdr.voices_class;\r\n\tptk_stat->voices_max = ptk_info->trk_hdr.voices_max;\r\n\tptk_stat->starppi = 0;\r\n\tptk_stat->accppi = 0;\r\n\tptk_stat->totppi = 0;\r\n\tptk_stat->psp = ptk_stat->psubstack;\r\n\tptk_stat->ppq = ptk_info->trk_hdr.initppq;\r\n\tptk_stat->labellist_count = ptk_info->trk_hdr.labellist_count;\r\n\tptk_stat->data_size = ptk_info->trk_hdr.data_size;\r\n\tptk_stat->mutemask = ptk_info->trk_hdr.mutebits;\r\n\r\n\tif ((attr == NULL) || (!attr->mask))\r\n\t{\r\n\t\ttempmask = 0;\r\n\t}\r\n\telse {\r\n\t\ttempmask = attr->mask;\r\n\t}\r\n\r\n\tif(tempmask & TRIGGER_VOLUME) //0x01\r\n    {\r\n        ptk_stat->volume_cntrl = attr->volume;\r\n        //printf(\"T_volume_cntrl %d\\n\", ptk_stat->volume_cntrl);\r\n    } else {\r\n        ptk_stat->volume_cntrl = ptk_info->trk_hdr.initvolume_cntrl;\r\n        //printf(\"volume_cntrl %d\\n\", ptk_stat->volume_cntrl);\r\n    }\r\n\r\n\tif (tempmask & TRIGGER_PAN) //0x02\r\n\t{\r\n\t\tptk_stat->pan_cntrl = attr->pan;\r\n\t\t//printf(\"T_pan_cntrl %d\\n\", ptk_stat->pan_cntrl);\r\n\t}\r\n\telse {\r\n\t\tptk_stat->pan_cntrl = ptk_info->trk_hdr.initpan_cntrl;\r\n\t\t//printf(\"pan_cntrl %d\\n\", ptk_stat->pan_cntrl);\r\n\t}\r\n\r\n\tif (tempmask & TRIGGER_PATCH) //0x04\r\n\t{\r\n\t\tptk_stat->patchnum = attr->patch;\r\n\t\t//printf(\"T_patchnum %d\\n\", ptk_stat->patchnum);\r\n\t}\r\n\telse {\r\n\t\tptk_stat->patchnum = ptk_info->trk_hdr.initpatchnum;\r\n\t\t//printf(\"patchnum %d\\n\", ptk_stat->patchnum);\r\n\t}\r\n\r\n\tif (tempmask & TRIGGER_PITCH) //0x08\r\n\t{\r\n\t\tptk_stat->pitch_cntrl = attr->pitch;\r\n\t\t//printf(\"T_pitch_cntrl %d\\n\", ptk_stat->pitch_cntrl);\r\n\t}\r\n\telse {\r\n\t\tptk_stat->pitch_cntrl = ptk_info->trk_hdr.initpitch_cntrl;\r\n\t\t//printf(\"pitch_cntrl %d\\n\", ptk_stat->pitch_cntrl);\r\n\t}\r\n\r\n\tif (tempmask & TRIGGER_MUTEMODE) //0x10\r\n\t{\r\n\t\tif (ptk_stat->mutemask & (1 << attr->mutemode))\r\n\t\t{\r\n\t\t\t//ptk_stat->mute = 1;\r\n\t\t\tptk_stat->flags |= TRK_MUTE;\r\n\t\t\t//printf(\"T_mute %d\\n\", ptk_stat->flags);\r\n\t\t}\r\n\t\telse {\r\n\t\t\t//ptk_stat->mute = 0;\r\n\t\t\tptk_stat->flags &= ~TRK_MUTE;\r\n\t\t\t//printf(\"T_mute %d\\n\", ptk_stat->flags);\r\n\t\t}\r\n\t}\r\n\telse {\r\n\t\t//ptk_stat->mute = 0;\r\n\t\tptk_stat->flags &= ~TRK_MUTE;\r\n\t\t//printf(\"mute %d\\n\", ptk_stat->flags);\r\n\t}\r\n\r\n\tif (tempmask & TRIGGER_TEMPO) //0x20\r\n\t{\r\n\t\tptk_stat->qpm = attr->tempo;\r\n\t\t//printf(\"T_qpm %d\\n\", ptk_stat->qpm);\r\n\t}\r\n\telse {\r\n\t\tptk_stat->qpm = ptk_info->trk_hdr.initqpm;\r\n\t\t//printf(\"qpm %d\\n\", ptk_stat->qpm);\r\n\t}\r\n\r\n\tptk_stat->ppi = CalcPartsPerInt(GetIntsPerSec(),\r\n\t\t\t\t\t\t\t\t\tptk_stat->ppq,\r\n\t\t\t\t\t\t\t\t\tptk_stat->qpm);\r\n\r\n\t//printf(\"ppi %d\\n\", ptk_stat->ppi);\r\n\r\n\tif (tempmask & TRIGGER_TIMED) //0x40\r\n\t{\r\n\t\tptk_stat->endppi = ptk_stat->totppi + attr->timeppq;\r\n\t\t//ptk_stat->timed = 1;\r\n\t\tptk_stat->flags |= TRK_TIMED;\r\n\t\t//printf(\"T_endppi %d\\n\", ptk_stat->endppi);\r\n\t\t//printf(\"timed %d\\n\", ptk_stat->flags);\r\n\t}\r\n\telse {\r\n\t\t//ptk_stat->timed = 0;\r\n\t\tptk_stat->flags &= ~TRK_TIMED;\r\n\t\t//printf(\"timed %d\\n\", ptk_stat->flags);\r\n\t}\r\n\r\n\tif (tempmask&TRIGGER_LOOPED) //0x80\r\n\t{\r\n\t\t//ptk_stat->looped = 1;\r\n\t\tptk_stat->flags |= TRK_LOOPED;\r\n\t\t//printf(\"T_looped %d\\n\", ptk_stat->flags);\r\n\t}\r\n\telse {\r\n\t\t//ptk_stat->looped = 0;\r\n\t\tptk_stat->flags &= ~TRK_LOOPED;\r\n\t\t//printf(\"looped %d\\n\", ptk_stat->flags);\r\n\t}\r\n\r\n\tif (tempmask & TRIGGER_REVERB) //0x100\r\n\t{\r\n\t\tptk_stat->reverb = attr->reverb;\r\n\t\t//printf(\"T_reverb %d\\n\", ptk_stat->reverb);\r\n\t}\r\n\telse {\r\n\t\tptk_stat->reverb = ptk_info->trk_hdr.reverb;\r\n\t\t//printf(\"reverb %d\\n\", ptk_stat->reverb);\r\n\t}\r\n#endif\r\n}\r\n\r\nvoid assigntrackstat(track_status *ptk_stat, track_data *ptk_info)//800430C0\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n\r\n    ptk_stat->data_space = ptk_info->trk_hdr.data_size;\r\n    ptk_stat->labellist_max = ptk_info->trk_hdr.labellist_count;\r\n    ptk_stat->pstart = ptk_info->ptrk_data;\r\n    ptk_stat->ppos = Read_Vlq(ptk_stat->pstart,&ptk_stat->deltatime);\r\n    ptk_stat->plabellist = ptk_info->plabellist;\r\n\r\n    //printf(\"data_space %d\\n\", ptk_stat->data_space);\r\n    //printf(\"labellist_max %d\\n\", ptk_stat->labellist_max);\r\n    //printf(\"ppos %d\\n\", *ptk_stat->ppos);\r\n    //printf(\"plabellist %d\\n\", *ptk_stat->plabellist);\r\n#endif\r\n}\r\n\r\n/*------------------------------------------------------------------*/\r\n/*\r\n    Sequencer calls.\r\n*/\r\n/*------------------------------------------------------------------*/\r\n\r\nint wess_seq_structrig (sequence_data *psq_info,\r\n                        int seq_num,\r\n                        int seq_type,\r\n                        enum HandleFlag gethandle,\r\n                        TriggerPlayAttr *attr)//80043124\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n\r\n    char i, j, limit;\r\n\tshort n;\r\n\tchar tracksfilled;\r\n\tchar *pdest;\r\n\tsequence_status *psq_stat;\r\n\ttrack_data *ptk_info;\r\n\ttrack_status *ptk_stat;\r\n\r\n\tif (!Is_Seq_Num_Valid(seq_num))\r\n\t{\r\n\t\treturn (0);\r\n\t}\r\n\r\n\t/* runs trigger function and update status structures for api */\r\n\r\n\t/*\r\n\t- save the sequencer information block pointer,\r\n\tif a sequence status structure is free:\r\n\tmark sequence as active,\r\n\tflag to start what tracks can be started,\r\n\tfor each track started update psq_info->ptrk_indxs\r\n\t*/\r\n\r\n\t//    _disable();\r\n\tSeqOn = 0;\r\n\r\n\r\n\t/* find an open sequence structure */\r\n\r\n\tlimit = pm_stat->pmod_info->mod_hdr.seq_work_areas;\r\n\r\n\tfor (i = 0; i<limit; i++)\r\n\t{\r\n\t\tif (!((pm_stat->pseqstattbl + i)->flags & SEQ_ACTIVE))\r\n\t\t{\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\tif (i == limit)\r\n\t{\r\n\t\tSeqOn = 1;\r\n\t\treturn (0); /* no sequence work area available */\r\n\t}\r\n\telse\r\n    {\r\n\t\ttracksfilled = 0; /* used to check if any tracks are started */\r\n\t\t/*\r\n\t\twe found a sequence structure so fill it.\r\n\t\t*/\r\n\r\n\t\tpsq_stat = pm_stat->pseqstattbl + i;          /* pointer math */\r\n\r\n\t\t/*\r\n\t\tfor n tracks in the sequence find and open track structure\r\n\t\tand initialize it.\r\n\t\t*/\r\n\t\tn = psq_info->seq_hdr.tracks;\r\n\t\tlimit = pm_stat->pmod_info->mod_hdr.trk_work_areas;\r\n\t\tpdest = psq_stat->ptrk_indxs;\r\n\t\tfor (j = 0; j<limit; j++)\r\n\t\t{\r\n\t\t\tif (!((pm_stat->ptrkstattbl + j)->flags & TRK_ACTIVE))\r\n\t\t\t{\r\n\t\t\t\tptk_stat = pm_stat->ptrkstattbl + j;  /* pointer math */\r\n\t\t\t\tptk_info = psq_info->ptrk_info + tracksfilled;\r\n\t\t\t\t/* refindx was filled at init time */\r\n\t\t\t\tptk_stat->seq_owner = i;\r\n\r\n\t\t\t\tfilltrackstat(ptk_stat, ptk_info, attr);\r\n\t\t\t\tassigntrackstat(ptk_stat, ptk_info);\r\n\r\n\t\t\t\tif (gethandle)\r\n\t\t\t\t{\r\n\t\t\t\t\tptk_stat->flags |= (TRK_HANDLED | TRK_STOPPED);\r\n\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tptk_stat->flags &= ~(TRK_HANDLED | TRK_STOPPED);\r\n\t\t\t\t\tpsq_stat->tracks_playing++;\r\n\t\t\t\t}\r\n\t\t\t\t//ptk_stat->flags |= TRK_ACTIVE;\r\n\r\n\t\t\t\tpsq_stat->tracks_active++;\r\n\t\t\t\tpm_stat->trks_active++;\r\n\t\t\t\t*pdest++ = j; /* update ptrk_indxs for the sequence */\r\n\t\t\t\ttracksfilled++;\r\n\r\n\t\t\t\tif (!--n) break;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/* if tracks were started, activate the sequence */\r\n\t\tif (tracksfilled)\r\n\t\t{\r\n\t\t\tpsq_stat->seq_num = seq_num;\r\n\t\t\tpsq_stat->seq_type = seq_type;\r\n\t\t\tif (gethandle)\r\n\t\t\t{\r\n\t\t\t\tpsq_stat->flags = SEQ_HANDLE;\r\n\t\t\t\tpsq_stat->playmode = SEQ_STATE_STOPPED;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tpsq_stat->flags &= ~SEQ_HANDLE;\r\n\t\t\t\tpsq_stat->playmode = SEQ_STATE_PLAYING;\r\n\t\t\t}\r\n\t\t\tpsq_stat->volume = 128;\r\n\t\t\tpsq_stat->pan = 64;\r\n\t\t\tpsq_stat->flags |= SEQ_ACTIVE;\r\n\t\t\tpm_stat->seqs_active++;\r\n\t\t}\r\n\t\tSeqOn = 1;\r\n\r\n\t\tif (tracksfilled)\r\n\t\t{\r\n\t\t\treturn (i + 1);\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn (0);\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n\r\n\r\nvoid wess_seq_trigger (int seq_num)//8004341C\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n\r\n    wess_seq_trigger_type (seq_num, 0);\r\n#endif\r\n}\r\n\r\nvoid wess_seq_trigger_special (int              seq_num,\r\n                               TriggerPlayAttr *attr)//8004343C\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n\r\n    wess_seq_trigger_type_special (seq_num, 0, attr);\r\n#endif\r\n}\r\n\r\nint wess_seq_status (int sequence_number)//8004348C\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n\r\n    /* immediate stop of sequence */\r\n\tchar nt;\r\n\tsequence_status *psq_stat;\r\n\tint status;\r\n\r\n\tif (!Is_Seq_Num_Valid(sequence_number))\r\n\t{\r\n\t\treturn(SEQUENCE_INVALID);\r\n\t}\r\n\r\n\tstatus = SEQUENCE_INACTIVE;\r\n\r\n\t/* search for all sequences with this number and turn them off */\r\n\tnt = pm_stat->pmod_info->mod_hdr.seq_work_areas;\r\n\tpsq_stat = pm_stat->pseqstattbl;\r\n\twhile (nt--)\r\n\t{\r\n\t\t//if (psq_stat->active)\r\n\t\tif (psq_stat->flags & SEQ_ACTIVE)\r\n\t\t{\r\n\t\t\tif (psq_stat->seq_num == sequence_number)\r\n\t\t\t{\r\n\t\t\t\tif (psq_stat->playmode == SEQ_STATE_STOPPED)\r\n\t\t\t\t{\r\n\t\t\t\t\tstatus = SEQUENCE_STOPPED;\r\n\t\t\t\t}\r\n\t\t\t\telse if (psq_stat->playmode == SEQ_STATE_PLAYING) {\r\n\t\t\t\t\tstatus = SEQUENCE_PLAYING;\r\n\t\t\t\t}\r\n\t\t\t\tbreak; /* stop looking if we found one */\r\n\t\t\t}\r\n\t\t}\r\n\t\tpsq_stat++;\r\n\t}\r\n\r\n\treturn(status);\r\n#endif\r\n}\r\n\r\nvoid wess_seq_stop (int sequence_number)//80043560\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n\r\n    /* immediate stop of sequence */\r\n\tchar nt, na;\r\n\tsequence_status *psq_stat;\r\n\ttrack_status *ptmp;\r\n\tchar *lpdest;\r\n\tint li, lj;\r\n\r\n\tif (!Is_Seq_Num_Valid(sequence_number))\r\n\t{\r\n\t\treturn;\r\n\t}\r\n\r\n\tSeqOn = 0;\r\n\r\n\t/* search for all sequences with this number and turn them off */\r\n\tnt = pm_stat->pmod_info->mod_hdr.seq_work_areas;\r\n\tna = pm_stat->seqs_active;\r\n\tpsq_stat = pm_stat->pseqstattbl;\r\n\tif (na)\r\n\t{\r\n\t\twhile (nt--)\r\n\t\t{\r\n\t\t\t//if (psq_stat->active)\r\n\t\t\tif (psq_stat->flags & SEQ_ACTIVE)\r\n\t\t\t{\r\n\t\t\t\tif (psq_stat->seq_num == sequence_number)\r\n\t\t\t\t{\r\n\t\t\t\t\tli = psq_stat->tracks_active;\r\n\t\t\t\t\tlj = pm_stat->max_trks_perseq;\r\n\t\t\t\t\t/* *lpdest refers to an active track if not 0xFF */\r\n\t\t\t\t\tlpdest = psq_stat->ptrk_indxs;\r\n\t\t\t\t\twhile (lj--)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (*lpdest != 0xFF)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tptmp = (pm_stat->ptrkstattbl + (*lpdest));\r\n\t\t\t\t\t\t\tCmdFuncArr[ptmp->patchtype][TrkOff](ptmp);\r\n\t\t\t\t\t\t\tif (!--li) break;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tlpdest++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (!--na) break;\r\n\t\t\t}\r\n\t\t\tpsq_stat++;\r\n\t\t}\r\n\t}\r\n\r\n\tSeqOn = 1;\r\n#endif\r\n}\r\n\r\nvoid wess_seq_stopall (void)//800436EC\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n\r\n    char nt, na;\r\n\tsequence_status *psq_stat;\r\n\ttrack_status *ptmp;\r\n\tchar *lpdest;\r\n\tint li, lj;\r\n\r\n\tif (!Is_Module_Loaded())\r\n\t{\r\n\t\treturn;\r\n\t}\r\n\r\n\t/* immediate stop of all sequences */\r\n\tSeqOn = 0;\r\n\r\n\t/* search for all sequences and turn them off */\r\n\tnt = pm_stat->pmod_info->mod_hdr.seq_work_areas;\r\n\tna = pm_stat->seqs_active;\r\n\tpsq_stat = pm_stat->pseqstattbl;\r\n\tif (na)\r\n\t{\r\n\t\twhile (nt--)\r\n\t\t{\r\n\t\t\tif (psq_stat->flags & SEQ_ACTIVE)\r\n\t\t\t{\r\n\t\t\t\tli = psq_stat->tracks_active;\r\n\t\t\t\tlj = pm_stat->max_trks_perseq;\r\n\t\t\t\t/* *lpdest refers to an active track if not 0xFF */\r\n\t\t\t\tlpdest = psq_stat->ptrk_indxs;\r\n\t\t\t\twhile (lj--)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (*lpdest != 0xFF)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tptmp = (pm_stat->ptrkstattbl + (*lpdest));\r\n\t\t\t\t\t\tCmdFuncArr[ptmp->patchtype][TrkOff](ptmp);\r\n\t\t\t\t\t\tif (!--li) break;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlpdest++;\r\n\t\t\t\t}\r\n\t\t\t\tif (!--na) break;\r\n\t\t\t}\r\n\t\t\tpsq_stat++;\r\n\t\t}\r\n\t}\r\n\r\n\tSeqOn = 1;\r\n#endif\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/WESSAPI.H",
    "content": "    /*------------------------------------------------------------------*/\r\n    /*\r\n                     The Williams Entertainment Sound System\r\n                    Application Programming Interface Routines\r\n                            by Scott Patterson\r\n    */\r\n    /*------------------------------------------------------------------*/\r\n\r\n#ifndef _WESSAPI_H\r\n#define _WESSAPI_H\r\n\r\n#include \"wessarc.h\"\r\n    /*------------------------------------------------------------------*/\r\n    /*\r\n        Enumerated types.\r\n    */\r\n    /*------------------------------------------------------------------*/\r\n\r\nenum Wess_Error {\r\n\r\n    wess_NO_ERROR,\r\n    wess_FOPEN,\r\n    wess_FREAD,\r\n    wess_FSEEK\r\n};\r\n\r\n/* used by wess_exit */\r\nenum RestoreFlag {NoRestore,YesRestore};\r\n\r\n/* used by wess pause functions */\r\nenum MuteFlag {NoMute,YesMute};\r\n\r\ntypedef struct NoteData {\r\n    short  seq_num;\t\t\t\t\t//*4\r\n\tshort  track;\t\t\t\t\t//*6\r\n\tchar  keynum;\t\t\t\t\t//*8\r\n\tchar  velnum;\t\t\t\t\t//*9\r\n\tshort   pad1;\t\t\t\t\t//*10\r\n\tpatchmaps_header *patchmap;\t\t//*12\r\n\tpatchinfo_header *patchinfo;\t//*16\r\n}NoteData;\r\n\r\ntypedef struct NoteState {\r\n    int      numnotes;\r\n    NoteData nd[24];\r\n}NoteState;\r\n\r\n/* used by wess_sequence_status function */\r\nenum SequenceStatus {SEQUENCE_INVALID,SEQUENCE_INACTIVE,SEQUENCE_STOPPED,SEQUENCE_PLAYING};\r\n\r\n/* used by wess trigger functions */\r\nenum LoopedFlag {NoLooped,YesLooped};\r\n\r\n/* used by wess trigger functions */\r\nenum HandleFlag {NoHandle,YesHandle};\r\n\r\nextern pmasterstat *pm_stat;\r\n\r\n\r\n    /*------------------------------------------------------------------*/\r\n    /*\r\n        Externs.\r\n    */\r\n    /*------------------------------------------------------------------*/\r\n\r\n    /*\r\n        extern: millicount\r\n\r\n        - a millisecond counter used by the sound system and available\r\n          to programmers for timing measurements\r\n    */\r\n\r\nextern volatile unsigned long millicount;\r\nextern volatile int T1counter;\r\nextern volatile int SeqOn;\r\n\r\n    /*------------------------------------------------------------------*/\r\n    /*\r\n        System Setup and Shutdown Functions.\r\n    */\r\n    /*------------------------------------------------------------------*/\r\n\r\n    /*\r\n        routine: wess_install_error_handler()\r\n\r\n        - for installing an error callback to notify file access errors\r\n        - module is your own ID returned as err_module parameter\r\n        - err_enum is the returned Wess_Error enum parameter\r\n    */\r\n\r\nextern void wess_install_error_handler (int (*error_func)(int err_module, int err_enum),\r\n                                        int   module);\r\n\r\n    /*\r\n        routine: wess_install_handler()\r\n\r\n        - the sound system timing handler can be installed independent\r\n          of the sound system for convenience.\r\n        - this can be useful for having the millicount running before\r\n          sound system initialization by wess_init()\r\n    \t- does not install if already installed.\r\n    */\r\n\r\nextern void wess_install_handler (void);\r\n\r\n    /*\r\n        routine: wess_restore_handler()\r\n\r\n        - restores timing handler to original system control\r\n        - only useful when wess_exit(NoRestore) has been called\r\n        - does not restore if already restored.\r\n    */\r\n\r\nextern void wess_restore_handler (void);\r\n\r\n    /*\r\n        routine: wess_init()\r\n\r\n        - initialize the Williams Entertainment Sound System.\r\n        - wess_install_handler() will be called if it hasn't been\r\n          called previously.\r\n    */\r\n\r\nextern int wess_init (void);\r\n\r\n    /*\r\n        routine: wess_exit()\r\n\r\n        - shuts down the Williams Entertainment Sound System.\r\n        - if a module is loaded, calls wess_unload_module().\r\n        - if wess_exit(YesRestore) is called, wess_restore_handler()\r\n          will be called after the sequencer engine is shutdown\r\n        - to have millicount running after sound system shutdown then\r\n          call wess_exit(NoRestore)\r\n    */\r\n\r\nextern void wess_exit (enum RestoreFlag rflag);\r\n\r\n    /*\r\n        routine: wess_load_module()\r\n\r\n        - loads master table of sounds and sequences\r\n        - returns 0 for failure, 1 for success\r\n        - NULL for memory_pointer results in internal memory allocation\r\n          of memory_allowance bytes\r\n        - if memory_pointer!=NULL then it is assumed to be a pointer\r\n          to memory_allocation bytes of memory for use by the sound system\r\n        - enables sequencer engine\r\n    */\r\n\r\nextern int wess_load_module (void *wmd_ptr,\r\n                             char *memory_pointer,\r\n                             int   memory_allowance,\r\n                             int **settings_tag_lists);\r\n\r\n    /*\r\n        routine: wess_unload_module()\r\n\r\n        - disables sequencer engine\r\n        - frees any allocated memory\r\n    */\r\n\r\nextern void wess_unload_module (void);\r\n\r\n    /*\r\n        routine: wess_get_wmd_start()\r\n\r\n        - after call to wess_load_module is successful, this\r\n          gets the pointer to beginning of module block\r\n    */\r\n\r\nextern char *wess_get_wmd_start (void);\r\n\r\n    /*\r\n        routine: wess_get_wmd_end()\r\n\r\n        - after call to wess_load_module is successful, this\r\n          gets the pointer past end of module block\r\n    */\r\n\r\nextern char *wess_get_wmd_end (void);\r\n\r\n    /*------------------------------------------------------------------*/\r\n    /*\r\n        Sequencer calls.\r\n    */\r\n    /*------------------------------------------------------------------*/\r\n\r\n    /*\r\n        routine: wess_seq_trigger()\r\n\r\n    \t- a sequence is everything from a single sound to a music sequence.\r\n        - multiple sequences can be called simultaneously\r\n        - dynamic sequence, track, and voice allocation is managed\r\n          by the sequencer\r\n        - tracks have priorty assignments and voices triggered by a\r\n          track inheirit its priority\r\n        - you can trigger multiple instances of a sequence with multiple\r\n          trigger calls\r\n    */\r\n\r\n#define TRIGGER_VOLUME   (0x1L<< 0)\r\n#define TRIGGER_PAN      (0x1L<< 1)\r\n#define TRIGGER_PATCH    (0x1L<< 2)\r\n#define TRIGGER_PITCH    (0x1L<< 3)\r\n#define TRIGGER_MUTEMODE (0x1L<< 4)\r\n#define TRIGGER_TEMPO    (0x1L<< 5)\r\n#define TRIGGER_TIMED    (0x1L<< 6)\r\n#define TRIGGER_LOOPED   (0x1L<< 7)\r\n#define TRIGGER_REVERB   (0x1L<< 8)\r\n\r\ntypedef struct  {\r\n                    unsigned long   mask;\r\n                    unsigned char   volume;   /* 0-127 */\r\n                    unsigned char   pan;      /* 0-127, 64 center */\r\n                    short           patch;    /* 0-32767 */\r\n                    short           pitch;    /* -8192 to 8191 */\r\n                    unsigned char   mutemode; /* 0-7 */\r\n                    unsigned char   reverb;\r\n                    unsigned short  tempo;\r\n                    unsigned long   timeppq;\r\n                } TriggerPlayAttr;\r\n\r\n    /* the basic sequence trigger call */\r\n\r\nextern void wess_seq_trigger         (int seq_num);\r\n\r\n    /* override masked sequence parameters */\r\n\r\nextern void wess_seq_trigger_special (int              seq_num,\r\n                                      TriggerPlayAttr *attr);\r\n\r\n    /* set your own type number to the sequence */\r\n\r\nextern void wess_seq_trigger_type         (int           seq_num,\r\n                                           unsigned long seq_type);\r\n\r\n    /* set your own type number to the sequence and\r\n       override masked sequence parameters          */\r\n\r\nextern void wess_seq_trigger_type_special (int              seq_num,\r\n                                           unsigned long    seq_type,\r\n                                           TriggerPlayAttr *attr);\r\n\r\nextern void wess_seq_update_type_special  (unsigned long    seq_type,\r\n                                           TriggerPlayAttr *attr);\r\n\r\n    /*\r\n        routine: wess_seq_status()\r\n\r\n        - find out if any instances of sequences_number are running\r\n        - returns 0 SEQUENCE_INVALID for no such sequence\r\n                  1 SEQUENCE_INACTIVE for is not being processed\r\n                  2 SEQUENCE_STOPPED for sequence is stopped\r\n                  3 SEQUENCE_PLAYING for sequence is playing\r\n    */\r\n\r\nextern int wess_seq_status (int sequence_number);\r\n\r\n    /*\r\n        routine: wess_seq_stop()\r\n\r\n        - stops all instances of a specified sequence\r\n    */\r\n\r\nextern void wess_seq_stop (int sequence_number);\r\n\r\n    /*\r\n        routine: wess_seq_stoploop()\r\n\r\n        - turns off track loops of all instances of a specified sequence\r\n          which were started with wess_seq_trigger_looped\r\n    */\r\n\r\nextern void wess_seq_stoploop (int sequence_number);//no used\r\n\r\n    /*\r\n        routine: wess_seq_stoptype()\r\n\r\n    \t- immediate stop of all sequences that were registered as a certain\r\n          type by wess_seq_trigger_type\r\n    */\r\n\r\nextern void wess_seq_stoptype (unsigned long sequence_type);\r\n\r\n    /*\r\n        routine: wess_seq_stopall()\r\n\r\n        - immediate stop of all sequences\r\n    */\r\n\r\nextern void wess_seq_stopall (void);\r\n\r\n    /*\r\n        routine: wess_seq_pause()\r\n\r\n        - immediately pause a sequence\r\n        - if MuteFlag is YesMute, all playing voices are muted\r\n        - if MuteFlag is NoMute, all playing voices do note decay\r\n    */\r\n\r\nextern void wess_seq_pause (int           sequence_number,\r\n                            enum MuteFlag mflag);\r\n\r\n    /*\r\n        routine: wess_seq_restart()\r\n\r\n        - restarts a paused sequence\r\n    */\r\n\r\nextern void wess_seq_restart (int sequence_number);\r\n\r\n    /*\r\n        routine: wess_seq_stopall()\r\n\r\n        - immediate pause of all sequences\r\n        - if mflag is YesMute, all playing voices are muted\r\n        - if mflag is NoMute, all playing voices remain on\r\n        - if pns is not NULL, any music muting is recorded\r\n    */\r\n\r\nextern void wess_seq_pauseall (enum MuteFlag mflag, NoteState *pns);\r\n\r\n    /* functions used internally for mute status */\r\nextern void start_record_music_mute(NoteState *pns);\r\nextern void end_record_music_mute(void);\r\n\r\n    /*\r\n        routine: wess_seq_stopall()\r\n\r\n        - restart all paused sequences\r\n        - if pns is not NULL, music unmuting is played\r\n    */\r\n\r\nextern void wess_seq_restartall (NoteState *pns);\r\n\r\n    /*\r\n        routine: wess_register_callback()\r\n\r\n        - callbacks are useful for video and program flow synchronization\r\n          with audio.\r\n        - callbacks are called when any track of a playing sequence\r\n          encounters a StatusMark with a registered marker_ID\r\n        - the first parameter of the callback is the marker_ID encountered\r\n        - the second parameter is the StatusMark's data field\r\n    */\r\n\r\nextern void wess_register_callback (char   marker_ID,\r\n                                    void (*function_pointer)(char,short));\r\n\r\n    /*\r\n        routine: wess_delete_callback()\r\n\r\n        - stop any callbacks from a particular marker_ID\r\n    */\r\n\r\nextern void wess_delete_callback (char marker_ID);\r\n\r\n    /*------------------------------------------------------------------*/\r\n    /*\r\n        Master functions get and set global sound parameters.\r\n    */\r\n    /*------------------------------------------------------------------*/\r\n\r\n    /*\r\n        routine: wess_master_sfx_volume_get()\r\n        routine: wess_master_mus_volume_get()\r\n\r\n        - gets the master volume\r\n    */\r\n\r\nextern char wess_master_sfx_volume_get (void);\r\nextern char wess_master_mus_volume_get (void);\r\n\r\n    /*\r\n        routine: wess_master_sfx_vol_set()\r\n        routine: wess_master_mus_vol_set()\r\n\r\n        - sets the master volume\r\n    */\r\n\r\nextern void wess_master_sfx_vol_set (char volume);\r\nextern void wess_master_mus_vol_set (char volume);\r\n\r\n    /*\r\n        routine: wess_pan_mode_get()\r\n\r\n        - gets the pan mode where 0=off, 1=normal, 2=switchLR\r\n    */\r\n\r\nextern char wess_pan_mode_get (void);\r\n\r\n    /*\r\n        routine: wess_pan_mode_set()\r\n\r\n        - sets the pan mode where 0=off, 1=normal, 2=switchLR\r\n    */\r\n\r\nextern void wess_pan_mode_set (char mode);\r\n\r\n    /*\r\n        routine: psx_set_mute_release(millisec)\r\n\r\n        - sets the stop/mute release time given milliseconds\r\n    */\r\n\r\nextern void psx_set_mute_release(int millisec);\r\n\r\n    /*\r\n        routine: wess_master_status()\r\n\r\n        - system status includes drivers loaded, patches loaded, sequences\r\n          loaded, and memory locations.\r\n    */\r\n\r\nextern void * wess_get_master_status (void);\r\n\r\n\r\nextern void wess_low_level_init(void);\r\n\r\n#endif\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "PSXDOOM/WESSAPIM.C",
    "content": "// Reconstruido por Erick Vasquez Garcia 16/05/2019 [GEC]\r\n// Update_1 20/10/2019 [GEC]\r\n// Update_2 31/01/2020 [GEC]\r\n\r\n#include \"kernel.h\"\r\n#include \"wessarc.h\"\r\n#include \"wessapi.h\"\r\n#include \"wessseq.h\"\r\n\r\nextern unsigned char\tmaster_sfx_volume;\t//*L80075834\r\nextern unsigned char\tmaster_mus_volume;\t//*L80075835\r\nextern unsigned char\tpan_status;\t\t\t//*L80075836\r\nextern unsigned char\trelease_rate;\t\t//*L80075837\r\nextern pmasterstat      *pm_stat;           //800A8538\r\nextern int              SeqOn;              //80075778\r\n\r\nchar wess_master_sfx_volume_get (void)//80049548\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n    if (!Is_Module_Loaded())\r\n\t{\r\n\t\treturn 0;\r\n\t}\r\n\r\n\treturn (master_sfx_volume);\r\n#endif\r\n}\r\n\r\nchar wess_master_mus_volume_get (void)//80049578\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n    if (!Is_Module_Loaded())\r\n\t{\r\n\t\treturn 0;\r\n\t}\r\n\r\n\treturn (master_mus_volume);\r\n#endif\r\n}\r\n\r\nvoid wess_master_sfx_vol_set (char volume)//800495A8\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n    if (!Is_Module_Loaded())\r\n\t{\r\n\t\treturn;\r\n\t}\r\n\r\n\tmaster_sfx_volume = volume;\r\n#endif\r\n}\r\nvoid wess_master_mus_vol_set (char volume)//800495E0\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n    char nt, na;\r\n\tsequence_status *psq_stat;\r\n\ttrack_status *ptmp;\r\n\tchar *lpdest;\r\n\tchar *temp;\r\n\tint li, lj;\r\n\tchar action[8];\r\n\r\n\tif (!Is_Module_Loaded())\r\n\t{\r\n\t\treturn;\r\n\t}\r\n\r\n\t/* immediate pause of all sequences */\r\n\tSeqOn = 0;\r\n\r\n\tmaster_mus_volume = volume;\r\n\r\n\t/* search for all sequences with this number and turn them off */\r\n\tnt = pm_stat->pmod_info->mod_hdr.seq_work_areas;\r\n\tna = pm_stat->seqs_active;\r\n\tpsq_stat = pm_stat->pseqstattbl;\r\n\r\n\tif (na)\r\n\t{\r\n\t\twhile (nt--)\r\n\t\t{\r\n\t\t\tif (psq_stat->flags & SEQ_ACTIVE)\r\n\t\t\t{\r\n\t\t\t\tli = psq_stat->tracks_active;\r\n\t\t\t\tlj = pm_stat->max_trks_perseq;\r\n\t\t\t\t/* *lpdest refers to an active track if not 0xFF */\r\n\t\t\t\tlpdest = psq_stat->ptrk_indxs;\r\n\t\t\t\twhile (lj--)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (*lpdest != 0xFF)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tptmp = (pm_stat->ptrkstattbl + (*lpdest));\r\n\r\n\t\t\t\t\t\tif (ptmp->sndclass == MUSIC_CLASS)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t    temp = ptmp->ppos; //copy\r\n\t\t\t\t\t\t\tptmp->ppos = action;//action\r\n\t\t\t\t\t\t\taction[0] = 12;\r\n\t\t\t\t\t\t\tptmp->ppos[1] = ptmp->volume_cntrl;\r\n\t\t\t\t\t\t\tCmdFuncArr[ptmp->patchtype][12](ptmp);\r\n\t\t\t\t\t\t\tptmp->ppos = temp; //restore\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (!--li) break;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlpdest++;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!--na) break;\r\n\t\t\t}\r\n\t\t\tpsq_stat++;\r\n\t\t}\r\n\t}\r\n\r\n\tSeqOn = 1;\r\n#endif\r\n}\r\n\r\nchar wess_pan_mode_get (void)//800497A0\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n    return pan_status;\r\n#endif\r\n}\r\n\r\nvoid wess_pan_mode_set (char mode)//800497B0\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n    pan_status = mode;\r\n#endif\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "PSXDOOM/WESSAPIP.C",
    "content": "// Reconstruido por Erick Vasquez Garcia 16/05/2019 [GEC]\r\n// Update_1 20/10/2019 [GEC]\r\n// Update_2 31/01/2020 [GEC]\r\n\r\n#include \"kernel.h\"\r\n#include \"wessarc.h\"\r\n#include \"wessapi.h\"\r\n#include \"wessseq.h\"\r\n\r\nextern int num_sd;                              //80075714\r\nextern char *wmd_file_ptr;                      //80075718\r\nextern char *wmd_file_ptr2;                     //8007571C\r\nextern Wess_File_IO_Struct *fp_wmd_file;        //80075720\r\nextern int sysinit;                             //80075724\r\nextern int module_loaded;                       //80075728\r\nextern int early_exit;                          //8007572C\r\nextern int max_seq_num;                         //80075730\r\nextern int mem_limit;                           //80075734\r\nextern patch_group_header scratch_pat_grp_hdr;  //8007EDE8\r\nextern track_header scratch_trk_hdr;            //8007EE04\r\nextern int wmd_mem_is_mine;                     //80075738\r\nextern char *wmd_mem;                           //8007573C\r\nextern char *wmd_end;                           //80075740\r\nextern int wmd_size;                            //80075744\r\nextern int (*Error_func)(int, int);             //80075748\r\nextern int Error_module;                        //8007574C\r\nextern pmasterstat *pm_stat;                    //800A8538\r\n\r\nvoid trackstart(track_status *ptmp, sequence_status *psq_stat)//800414A4\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n\r\n\tif (ptmp->flags & TRK_STOPPED)\r\n\t{\r\n\t\tptmp->flags &= ~TRK_STOPPED;\r\n\t\tif (++psq_stat->tracks_playing)\r\n\t\t{\r\n\t\t\tpsq_stat->playmode = SEQ_STATE_PLAYING;\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\nvoid trackstop(track_status *ptmp, sequence_status *psq_stat)//800414E8\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n\r\n\tif (!(ptmp->flags & TRK_STOPPED))\r\n\t{\r\n\t\tptmp->flags |= TRK_STOPPED;\r\n\t\tif (!--psq_stat->tracks_playing)\r\n\t\t{\r\n\t\t\tpsq_stat->playmode = SEQ_STATE_STOPPED;\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n\r\nvoid wess_seq_pause(int sequence_number, enum MuteFlag mflag)//80041528\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n\r\n\tchar nt, na;\r\n\tsequence_status *psq_stat;\r\n\ttrack_status *ptmp;\r\n\tchar *lpdest;\r\n\tint li, lj;\r\n\r\n\tif (!Is_Seq_Num_Valid(sequence_number))\r\n\t{\r\n\t\treturn;\r\n\t}\r\n\r\n\t/* immediate pause of sequence */\r\n\tSeqOn = 0;\r\n\r\n\t/* search for all sequences with this number and turn them off */\r\n\tnt = pm_stat->pmod_info->mod_hdr.seq_work_areas;\r\n\tna = pm_stat->seqs_active;\r\n\tpsq_stat = pm_stat->pseqstattbl;\r\n\tif (na)\r\n\t{\r\n\t\twhile (nt--)\r\n\t\t{\r\n\t\t\tif (psq_stat->flags & SEQ_ACTIVE)\r\n\t\t\t{\r\n\t\t\t\tif (psq_stat->seq_num == sequence_number)\r\n\t\t\t\t{\r\n\t\t\t\t\tli = psq_stat->tracks_active;\r\n\t\t\t\t\tlj = pm_stat->max_trks_perseq;\r\n\t\t\t\t\t/* *lpdest refers to an active track if not 0xFF */\r\n\t\t\t\t\tlpdest = psq_stat->ptrk_indxs;\r\n\t\t\t\t\twhile (lj--)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (*lpdest != 0xFF)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tptmp = (pm_stat->ptrkstattbl + (*lpdest));\r\n\t\t\t\t\t\t\ttrackstop(ptmp, psq_stat);\r\n\t\t\t\t\t\t\tif (mflag == YesMute)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tCmdFuncArr[ptmp->patchtype][TrkMute](ptmp);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (!--li) break;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tlpdest++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (!--na) break;\r\n\t\t\t}\r\n\t\t\tpsq_stat++;\r\n\t\t}\r\n\t}\r\n\r\n\tSeqOn = 1;\r\n#endif\r\n}\r\n\r\nvoid wess_seq_restart(int sequence_number)//800416D0\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n\r\n\tchar nt, na;\r\n\tsequence_status *psq_stat;\r\n\ttrack_status *ptmp;\r\n\tchar *lpdest;\r\n\tint li, lj;\r\n\r\n\tif (!Is_Seq_Num_Valid(sequence_number))\r\n\t{\r\n\t\treturn;\r\n\t}\r\n\r\n\t/* immediate restart of sequence */\r\n\tSeqOn = 0;\r\n\r\n\t/* search for all sequences with this number and turn them off */\r\n\tnt = pm_stat->pmod_info->mod_hdr.seq_work_areas;\r\n\tna = pm_stat->seqs_active;\r\n\tpsq_stat = pm_stat->pseqstattbl;\r\n\tif (na)\r\n\t{\r\n\t\twhile (nt--)\r\n\t\t{\r\n\t\t\tif (psq_stat->flags & SEQ_ACTIVE)\r\n\t\t\t{\r\n\t\t\t\tif (psq_stat->seq_num == sequence_number)\r\n\t\t\t\t{\r\n\t\t\t\t\tli = psq_stat->tracks_active;\r\n\t\t\t\t\tlj = pm_stat->max_trks_perseq;\r\n\t\t\t\t\t/* *lpdest refers to an active track if not 0xFF */\r\n\t\t\t\t\tlpdest = psq_stat->ptrk_indxs;\r\n\t\t\t\t\twhile (lj--)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (*lpdest != 0xFF)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tptmp = (pm_stat->ptrkstattbl + (*lpdest));\r\n\t\t\t\t\t\t\ttrackstart(ptmp, psq_stat);\r\n\t\t\t\t\t\t\tif (!--li) break;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tlpdest++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (!--na) break;\r\n\t\t\t}\r\n\t\t\tpsq_stat++;\r\n\t\t}\r\n\t}\r\n\r\n\tSeqOn = 1;\r\n#endif\r\n}\r\n\r\nvoid wess_seq_pauseall(enum MuteFlag mflag, NoteState *pns)//8004183C\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n\r\n\tchar nt, na;\r\n\tsequence_status *psq_stat;\r\n\ttrack_status *ptmp;\r\n\tchar *lpdest;\r\n\tint li, lj;\r\n\r\n\tif (!Is_Module_Loaded())\r\n\t{\r\n\t\treturn;\r\n\t}\r\n\r\n\t/* immediate pause of all sequences */\r\n\tSeqOn = 0;\r\n\r\n\t//Doom PSX New\r\n\tif (mflag == YesMute)\r\n\t{\r\n\t\tstart_record_music_mute(pns);\r\n\t}\r\n\r\n\t/* search for all sequences with this number and turn them off */\r\n\tnt = pm_stat->pmod_info->mod_hdr.seq_work_areas;\r\n\tna = pm_stat->seqs_active;\r\n\tpsq_stat = pm_stat->pseqstattbl;\r\n\tif (na)\r\n\t{\r\n\t\twhile (nt--)\r\n\t\t{\r\n\t\t\tif (psq_stat->flags & SEQ_ACTIVE)\r\n\t\t\t{\r\n\t\t\t\tli = psq_stat->tracks_active;\r\n\t\t\t\tlj = pm_stat->max_trks_perseq;\r\n\t\t\t\t/* *lpdest refers to an active track if not 0xFF */\r\n\t\t\t\tlpdest = psq_stat->ptrk_indxs;\r\n\t\t\t\twhile (lj--)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (*lpdest != 0xFF)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tptmp = (pm_stat->ptrkstattbl + (*lpdest));\r\n\t\t\t\t\t\tif (mflag == YesMute)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tCmdFuncArr[ptmp->patchtype][TrkMute](ptmp);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\ttrackstop(ptmp, psq_stat);\r\n\t\t\t\t\t\tif (!--li) break;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlpdest++;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!--na) break;\r\n\t\t\t}\r\n\t\t\tpsq_stat++;\r\n\t\t}\r\n\t}\r\n\r\n\t//Doom PSX New\r\n\tif (mflag == YesMute)\r\n\t{\r\n\t\tend_record_music_mute();\r\n\t}\r\n\r\n\tSeqOn = 1;\r\n#endif\r\n}\r\n\r\nvoid wess_seq_restartall(NoteState *pns)//800419f8\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n\r\n\tchar nt, na;\r\n\tsequence_status *psq_stat;\r\n\ttrack_status *ptmp;\r\n\tchar *lpdest;\r\n\tint li, lj, nc;\r\n\r\n\tif (!Is_Module_Loaded())\r\n\t{\r\n\t\treturn;\r\n\t}\r\n\r\n\t/* immediate restart of all sequences */\r\n\tSeqOn = 0;\r\n\r\n\t/* search for all sequences with this number and turn them off */\r\n\tnt = pm_stat->pmod_info->mod_hdr.seq_work_areas;\r\n\tna = pm_stat->seqs_active;\r\n\tpsq_stat = pm_stat->pseqstattbl;\r\n\tif (na)\r\n\t{\r\n\t\twhile (nt--)\r\n\t\t{\r\n\t\t\tif (psq_stat->flags & SEQ_ACTIVE)\r\n\t\t\t{\r\n\t\t\t\tli = psq_stat->tracks_active;\r\n\t\t\t\tlj = pm_stat->max_trks_perseq;\r\n\t\t\t\t/* *lpdest refers to an active track if not 0xFF */\r\n\t\t\t\tlpdest = psq_stat->ptrk_indxs;\r\n\t\t\t\twhile (lj--)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (*lpdest != 0xFF)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tptmp = (pm_stat->ptrkstattbl + (*lpdest));\r\n\t\t\t\t\t\ttrackstart(ptmp, psq_stat);\r\n\r\n\t\t\t\t\t\tif (pns != 0)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tfor (nc = 0; nc < pns->numnotes; nc++)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tif (*lpdest == pns->nd[nc].track)\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tif (psq_stat->seq_num == pns->nd[nc].seq_num)\r\n\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\tPSX_voicenote(ptmp,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  pns->nd[nc].patchmap,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  pns->nd[nc].patchinfo,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  pns->nd[nc].keynum,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  pns->nd[nc].velnum);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (!--li) break;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlpdest++;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!--na) break;\r\n\t\t\t}\r\n\t\t\tpsq_stat++;\r\n\t\t}\r\n\t}\r\n\r\n\tif (pns != 0)\r\n\t{\r\n\t\tpns->numnotes = 0;\r\n\t}\r\n\r\n\tSeqOn = 1;\r\n#endif\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/WESSAPIT.C",
    "content": "// Reconstruido por Erick Vasquez Garcia 16/05/2019 [GEC]\r\n// Update_1 20/10/2019 [GEC]\r\n// Update_2 31/01/2020 [GEC]\r\n\r\n#include \"kernel.h\"\r\n#include \"wessarc.h\"\r\n#include \"wessapi.h\"\r\n#include \"wessseq.h\"\r\n\r\nextern int num_sd;                              //80075714\r\nextern char *wmd_file_ptr;                      //80075718\r\nextern char *wmd_file_ptr2;                     //8007571C\r\nextern Wess_File_IO_Struct *fp_wmd_file;        //80075720\r\nextern int sysinit;                             //80075724\r\nextern int module_loaded;                       //80075728\r\nextern int early_exit;                          //8007572C\r\nextern int max_seq_num;                         //80075730\r\nextern int mem_limit;                           //80075734\r\nextern patch_group_header scratch_pat_grp_hdr;  //8007EDE8\r\nextern track_header scratch_trk_hdr;            //8007EE04\r\nextern int wmd_mem_is_mine;                     //80075738\r\nextern char *wmd_mem;                           //8007573C\r\nextern char *wmd_end;                           //80075740\r\nextern int wmd_size;                            //80075744\r\nextern int (*Error_func)(int, int);             //80075748\r\nextern int Error_module;                        //8007574C\r\nextern pmasterstat *pm_stat;                    //800A8538\r\n\r\nvoid updatetrackstat(track_status *ptk_stat, TriggerPlayAttr *attr)//L80043E08\r\n{\r\n\t//CODE----------------------------------------------------\r\n\tint tempmask;\r\n\tchar *temp;\r\n\tchar action[8];\r\n\r\n\tif ((attr == NULL) || (!attr->mask))\r\n\t\treturn;\r\n\r\n\ttempmask = attr->mask;\r\n\r\n\tif (tempmask & TRIGGER_VOLUME) //0x01\r\n\t{\r\n\t\tptk_stat->volume_cntrl = attr->volume;\r\n\t}\r\n\r\n\tif (tempmask & TRIGGER_PAN) //0x02\r\n\t{\r\n\t\tptk_stat->pan_cntrl = attr->pan;\r\n\t}\r\n\r\n\tif (tempmask & (TRIGGER_VOLUME | TRIGGER_PAN)) //0x03\r\n\t{\r\n\t\tptk_stat->volume_cntrl = attr->volume;\r\n\t\tptk_stat->pan_cntrl = attr->pan;\r\n\r\n\t\ttemp = ptk_stat->ppos; //copy\r\n\t\tptk_stat->ppos = action;  //action\r\n\t\taction[0] = 12;\r\n\t\tptk_stat->ppos[1] = ptk_stat->volume_cntrl;\r\n\t\tCmdFuncArr[ptk_stat->patchtype][12](ptk_stat);\r\n\t\tptk_stat->ppos = temp; //restore\r\n\t}\r\n\telse\r\n\t{\r\n\t\tif (tempmask & TRIGGER_VOLUME) //0x01\r\n\t\t{\r\n\t\t\tptk_stat->volume_cntrl = attr->volume;\r\n\r\n\t\t\ttemp = ptk_stat->ppos; //copy\r\n\t\t\tptk_stat->ppos = action;  //action\r\n\t\t\taction[0] = 12;\r\n\t\t\tptk_stat->ppos[1] = ptk_stat->volume_cntrl;\r\n\t\t\tCmdFuncArr[ptk_stat->patchtype][12](ptk_stat);\r\n\t\t\tptk_stat->ppos = temp; //restore\r\n\t\t}\r\n\t\telse if (tempmask & TRIGGER_PAN)\r\n\t\t{\r\n\t\t\tptk_stat->pan_cntrl = attr->pan;\r\n\r\n\t\t\ttemp = ptk_stat->ppos; //copy\r\n\t\t\tptk_stat->ppos = action;  //action\r\n\t\t\taction[0] = 13;\r\n\t\t\tptk_stat->ppos[1] = ptk_stat->pan_cntrl;\r\n\t\t\tCmdFuncArr[ptk_stat->patchtype][13](ptk_stat);\r\n\t\t\tptk_stat->ppos = temp; //restore\r\n\t\t}\r\n\t}\r\n\r\n\tif (tempmask & TRIGGER_PATCH) //0x04\r\n\t{\r\n\t\tptk_stat->patchnum = attr->patch;\r\n\t}\r\n\r\n\tif (tempmask & TRIGGER_PITCH) //0x08\r\n\t{\r\n\t\tptk_stat->pitch_cntrl = attr->pitch;\r\n\r\n\t\ttemp = ptk_stat->ppos; //copy\r\n\t\tptk_stat->ppos = action;  //action\r\n\t\taction[0] = 9;\r\n\t\tptk_stat->ppos[1] = (char)(ptk_stat->pitch_cntrl & 0xff);\r\n\t\tptk_stat->ppos[2] = (char)(ptk_stat->pitch_cntrl >> 8);\r\n\t\tCmdFuncArr[ptk_stat->patchtype][9](ptk_stat);\r\n\t\tptk_stat->ppos = temp; //restore\r\n\t}\r\n\r\n\tif (tempmask & TRIGGER_MUTEMODE) //0x10\r\n\t{\r\n\t\tif (ptk_stat->mutemask & (1 << attr->mutemode))\r\n\t\t{\r\n\t\t\tptk_stat->flags |= TRK_MUTE;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tptk_stat->flags &= ~TRK_MUTE;\r\n\t\t}\r\n\t}\r\n\r\n\tif (tempmask & TRIGGER_TEMPO) //0x20\r\n\t{\r\n\t\tptk_stat->qpm = attr->tempo;\r\n\t\tptk_stat->ppi = CalcPartsPerInt(GetIntsPerSec(),\r\n\t\t\tptk_stat->ppq,\r\n\t\t\tptk_stat->qpm);\r\n\t}\r\n\r\n\tif (tempmask & TRIGGER_TIMED) //0x40\r\n\t{\r\n\t\tptk_stat->endppi = ptk_stat->totppi + attr->timeppq;\r\n\t\tptk_stat->flags |= TRK_TIMED;\r\n\t}\r\n\r\n\tif (tempmask&TRIGGER_LOOPED) //0x80\r\n\t{\r\n\t\tptk_stat->flags |= TRK_LOOPED;\r\n\t}\r\n}\r\n\r\nvoid wess_seq_trigger_type (int seq_num, unsigned long seq_type)//800440FC\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n\r\n    sequence_data *psq_info;\r\n\r\n    psq_info = pm_stat->pmod_info->pseq_info+seq_num; /* pointer math */\r\n\r\n    wess_seq_structrig (psq_info, seq_num, seq_type, NoHandle, NULL);\r\n#endif\r\n}\r\n\r\nvoid wess_seq_trigger_type_special (int              seq_num,\r\n                                    unsigned long    seq_type,\r\n                                    TriggerPlayAttr *attr)//8004414C\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n\r\n    sequence_data *psq_info;\r\n\r\n    psq_info = pm_stat->pmod_info->pseq_info+seq_num; /* pointer math */\r\n\r\n    wess_seq_structrig (psq_info, seq_num, seq_type, NoHandle, attr);\r\n#endif\r\n}\r\n\r\nvoid wess_seq_update_type_special(unsigned long seq_type, TriggerPlayAttr *attr)//800441A0\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n\r\n\t/* immediate stop of sequence */\r\n\tchar nt, na;\r\n\tsequence_status *psq_stat;\r\n\ttrack_status *ptmp;\r\n\tchar *lpdest;\r\n\tint li, lj;\r\n\r\n\tif (!Is_Module_Loaded())\r\n\t{\r\n\t\treturn;\r\n\t}\r\n\r\n\tSeqOn = 0;\r\n\r\n\t/* search for all sequences with this number and turn them off */\r\n\tnt = pm_stat->pmod_info->mod_hdr.seq_work_areas;\r\n\tna = pm_stat->seqs_active;\r\n\tpsq_stat = pm_stat->pseqstattbl;\r\n\tif (na)\r\n\t{\r\n\t\twhile (nt--)\r\n\t\t{\r\n\t\t\tif (psq_stat->flags & SEQ_ACTIVE)\r\n\t\t\t{\r\n\t\t\t\tif (psq_stat->seq_type == seq_type)\r\n\t\t\t\t{\r\n\t\t\t\t\tli = psq_stat->tracks_active;\r\n\t\t\t\t\tlj = pm_stat->max_trks_perseq;\r\n\t\t\t\t\t/* *lpdest refers to an active track if not 0xFF */\r\n\t\t\t\t\tlpdest = psq_stat->ptrk_indxs;\r\n\t\t\t\t\twhile (lj--)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (*lpdest != 0xFF)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tptmp = (pm_stat->ptrkstattbl + (*lpdest));\r\n\t\t\t\t\t\t\tif (attr != 0)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tupdatetrackstat(ptmp, attr);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (!--li) break;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tlpdest++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (!--na) break;\r\n\t\t\t}\r\n\t\t\tpsq_stat++;\r\n\t\t}\r\n\t}\r\n\r\n\tSeqOn = 1;\r\n#endif\r\n}\r\n\r\nvoid wess_seq_stoptype (unsigned long type_number)//8004431C\r\n{\r\n#ifndef BLOCK_SOUND_WESS\r\n\r\n    /* immediate stop of sequence */\r\n    char nt,na;\r\n    sequence_status *psq_stat;\r\n    track_status *ptmp;\r\n    char *lpdest;\r\n    int li,lj;\r\n\r\n    if(!Is_Module_Loaded())\r\n    {\r\n        return;\r\n    }\r\n\r\n    SeqOn = 0;\r\n\r\n    /* search for all sequences with this number and turn them off */\r\n    nt = pm_stat->pmod_info->mod_hdr.seq_work_areas;\r\n    na = pm_stat->seqs_active;\r\n    psq_stat = pm_stat->pseqstattbl;\r\n    if(na)\r\n    {\r\n        while(nt--)\r\n        {\r\n            if (psq_stat->flags & SEQ_ACTIVE)\r\n            {\r\n                if(psq_stat->seq_type==type_number)\r\n                {\r\n                    li = psq_stat->tracks_active;\r\n                    lj = pm_stat->max_trks_perseq;\r\n                    /* *lpdest refers to an active track if not 0xFF */\r\n                    lpdest = psq_stat->ptrk_indxs;\r\n                    while(lj--)\r\n                    {\r\n                        if(*lpdest!=0xFF)\r\n                        {\r\n                            ptmp = (pm_stat->ptrkstattbl+(*lpdest));\r\n                            CmdFuncArr[ptmp->patchtype][TrkOff](ptmp);\r\n                            if(!--li) break;\r\n                        }\r\n                        lpdest++;\r\n                    }\r\n                }\r\n                if(!--na) break;\r\n            }\r\n            psq_stat++;\r\n        }\r\n    }\r\n\r\n    SeqOn = 1;\r\n#endif\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/WESSARC.C",
    "content": "// Reconstruido por Erick Vasquez Garcia 16/05/2019 [GEC]\r\n// Update_1 20/10/2019 [GEC]\r\n// Update_2 31/01/2020 [GEC]\r\n\r\n    /*------------------------------------------------------------------*/\r\n    /*\r\n                     The Williams Entertainment Sound System\r\n                     Sony Architecture Specific Routines\r\n                            by Scott Patterson\r\n    */\r\n    /*------------------------------------------------------------------*/\r\n\r\n//#include \"win_port.h\"\r\n\r\n\r\n//#define BLOCK_SOUND_WESS\r\n//#ifndef BLOCK_SOUND_WESS\r\n\r\n\r\n#include \"kernel.h\"\r\n#include <libspu.h>\r\n#include \"wessarc.h\"\r\n#include \"wessapi.h\"\r\n#include \"wessseq.h\"\r\n\r\n/*extern long EnableEvent(unsigned long event);\r\nextern long DisableEvent(unsigned long event);\r\nextern long OpenEvent(unsigned long desc,long spec,long mode,long (*func)(void));\r\nextern long CloseEvent(unsigned long event);\r\nextern long SetRCnt(unsigned long spec,unsigned long target,long mode);\r\nextern long StartRCnt(unsigned long spec);*/\r\n\r\n//#include \"psxspu.h\"\r\n#include \"psxcd.h\"\r\n\r\nvoid (**CmdFuncArr[10])(track_status *) = {\r\n    DrvFunctions,\r\n    drv_cmds,\r\n    DrvFunctions,\r\n    DrvFunctions,\r\n    DrvFunctions,\r\n    DrvFunctions,\r\n    DrvFunctions,\r\n    DrvFunctions,\r\n    DrvFunctions,\r\n    DrvFunctions\r\n    };\r\n\r\nshort         GetIntsPerSec(void);\r\nunsigned long CalcPartsPerInt(short ips,short ppq,short qpm);\r\nstatic long WessInterruptHandler(void);\r\nextern void SeqEngine(void);\r\n\r\n/* Movido a WESSBASE.C\r\nint SeqOn = 0;\r\nunsigned long millicount = 0;\r\nunsigned long millisum = 0;\r\n\r\nint WessTimerActive = 0;\r\n\r\nint                     T2counter = 0;\r\n*/\r\nextern volatile int SeqOn;\r\nextern volatile long millisum;\r\nextern volatile int WessTimerActive;\r\nextern volatile int T2counter;\r\n\r\nstatic unsigned long    EV2 = 0;                /* interrupt event var */\r\n\r\n// module loader stuff\r\n\r\nstatic Wess_File_IO_Struct module_fileref;//8007EE20\r\n\r\n// data loader stuff\r\n//static unsigned long addr;\r\n//static unsigned long size;\r\n\r\n//#define MALLOC_MAX 1\r\n//char spu_malloc_rec [SPU_MALLOC_RECSIZ * (MALLOC_MAX + 1)];\r\n\r\nstatic Wess_Data_IO_Struct data_fileref;//8007EE48\r\n\r\n// sram transfer stuff\r\n\r\n#define CHUNKSIZE 2048\r\nextern char chunk[CHUNKSIZE];//80096394\r\nextern char chunk2[CHUNKSIZE];//80096BA4\r\n\r\n#define SRAM_TO_ALLOC 520192\r\n\r\n// while I thought end of sram should be 524288, it seems to be 520192\r\n//#define END_O_SRAM 520192\r\nextern unsigned long end_of_sram;\r\n\r\nvoid wess_low_level_init(void)//80043868\r\n{\r\n    psxspu_init();\r\n}\r\n\r\nvoid wess_low_level_exit(void)//80043888\r\n{\r\n    return;\r\n}\r\n\r\nvoid *wess_malloc(int size)//80043890\r\n{\r\n    return 0;\r\n}\r\n\r\nvoid wess_free(char *mem)//80043898\r\n{\r\n    return;\r\n}\r\n\r\nshort GetIntsPerSec(void)//800438A0\r\n{\r\n    return(120);\r\n}\r\n\r\nunsigned long CalcPartsPerInt(short ips,short ppq,short qpm)//800438A8\r\n{\r\n    unsigned long ppi;\r\n\tppi = ((((unsigned long)qpm*0x10000)+((unsigned long)ips*30)+30)/((unsigned long)ips*60))*(unsigned long)ppq;\r\n\treturn(ppi);\r\n}\r\n\r\nstatic long WessInterruptHandler(void)//800438F8\r\n{\r\n    unsigned int millitemp;\r\n\r\n    //printf(\"millicount %d\\n\",millicount);\r\n    //printf(\"SeqOn %d\\n\",SeqOn);\r\n    //printf(\"WessTimerActive %d\\n\",WessTimerActive);\r\n\r\n    millitemp = millisum + 0x85555;\r\n    T2counter += 1;\r\n    millisum = millitemp & 0xffff;\r\n    millicount += (millitemp >> 0x10);\r\n\r\n    psxspu_fadeengine();\r\n    if (SeqOn)\r\n    {\r\n        //printf(\"SeqOn %d\\n\",SeqOn);\r\n        SeqEngine();\r\n    }\r\n    return (0);\r\n}\r\n\r\nvoid init_WessTimer(void)//8004398C\r\n{\r\n    //printf(\"init_WessTimer\\n\");\r\n\r\n    SeqOn = 0;\r\n\tEnterCriticalSection();\r\n\r\n\tEV2 = OpenEvent(RCntCNT2, EvSpINT, EvMdINTR, WessInterruptHandler);\r\n\tEnableEvent(EV2);\r\n\tSetRCnt(RCntCNT2, 34722, RCntMdINTR);   // 33038 is ~120 Hz\r\n\tStartRCnt(RCntCNT2);\r\n\r\n\tWessTimerActive = 1;\r\n\r\n\tExitCriticalSection();\r\n}\r\n\r\nvoid exit_WessTimer(void)//80043A18\r\n{\r\n    psxspu_set_master_vol(psxspu_get_master_vol());\r\n\tpsxspu_set_cd_vol(psxspu_get_cd_vol());\r\n\r\n\tEnterCriticalSection();\r\n\r\n    WessTimerActive = 0;\r\n\r\n    DisableEvent(EV2);\r\n    CloseEvent(EV2);\r\n\r\n    ExitCriticalSection();\r\n}\r\n\r\n\r\n//static SpuReverbAttr rev_attr;\r\nint Wess_init_for_LoadFileData(char *filename)//80043A88\r\n{\r\n    /*SpuInitMalloc (MALLOC_MAX, spu_malloc_rec);\r\n    rev_attr.mask = SPU_REV_MODE;\r\n    rev_attr.mode = SPU_REV_MODE_OFF;\r\n    SpuSetReverbModeParam (&rev_attr);\r\n    SpuSetReverbVoice (SpuOff, SPU_ALLCH);\r\n    SpuReserveReverbWorkArea(SpuOff);\r\n    SpuSetReverb (SpuOff);\r\n    SpuMalloc (520192);\r\n    SpuSetTransMode (SpuTransferByDMA);*/\r\n    return(1);\r\n}\r\n\r\nWess_File_IO_Struct *module_open(char *filename)//80043A90\r\n{\r\n    Wess_File_IO_Struct *fp;\r\n\r\n    fp = psxcd_open(filename);\r\n\r\n    module_fileref = *fp;\r\n\r\n    return(&module_fileref);\r\n}\r\n\r\nint module_read(void *destptr,int readbytes,Wess_File_IO_Struct *fileptr)//80043B04\r\n{\r\n    return(psxcd_read(destptr,readbytes,fileptr));\r\n}\r\n\r\nint module_seek(Wess_File_IO_Struct *fileptr,int seekpos,int seekmode)//80043B24\r\n{\r\n    return(psxcd_seek(fileptr,seekpos,seekmode));\r\n}\r\n\r\nunsigned long module_tell(Wess_File_IO_Struct *fileptr)//80043B44\r\n{\r\n    return(psxcd_tell(fileptr));\r\n}\r\n\r\nvoid module_close(Wess_File_IO_Struct *fileptr)//80043B64\r\n{\r\n    psxcd_close(fileptr);\r\n}\r\n\r\nint get_num_Wess_Sound_Drivers(int **settings_tag_lists)//80043B84\r\n{\r\n    return(1);\r\n}\r\n\r\nWess_Data_IO_Struct *data_open(char *filename)\r\n{\r\n    Wess_File_IO_Struct *fp;\r\n\r\n    fp = psxcd_open(filename);\r\n\r\n    data_fileref = *fp;\r\n\r\n    return(&data_fileref);\r\n}\r\n\r\nextern int ReadChunk1;//*L8007EE70\r\nextern int ReadChunk2;//*L8007EE1C\r\n\r\nvoid data_read_chunk(Wess_Data_IO_Struct *fileptr, int totaltogo, unsigned long spuptr)//80043C00\r\n{\r\n    if (ReadChunk1)//Read to chunk\r\n\t{\r\n\t\tpsxcd_read(chunk, totaltogo, fileptr);\r\n\t\tSpuSetTransferStartAddr(spuptr);\r\n\t\tSpuWrite(chunk, totaltogo);\r\n\t\tReadChunk2 = 1;\r\n\t\tReadChunk1 = 0;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tif (ReadChunk2)//Read to chunk2\r\n\t\t{\r\n\t\t\tpsxcd_read(chunk2, totaltogo, fileptr);\r\n\t\t\tSpuIsTransferCompleted(SPU_TRANSFER_WAIT);\r\n\t\t\tSpuSetTransferStartAddr(spuptr);\r\n\t\t\tSpuWrite(chunk2, totaltogo);\r\n\t\t\tReadChunk2 = 0;\r\n\t\t}\r\n\t\telse//Read to chunk\r\n\t\t{\r\n\t\t\tpsxcd_read(chunk, totaltogo, fileptr);\r\n\t\t\tSpuIsTransferCompleted(SPU_TRANSFER_WAIT);\r\n\t\t\tSpuSetTransferStartAddr(spuptr);\r\n\t\t\tSpuWrite(chunk, totaltogo);\r\n\t\t\tReadChunk2 = 1;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nint data_read(Wess_Data_IO_Struct *fileptr,void *destptr,int readbytes,int filepos)//80043D1C\r\n{\r\n    int totaltogo;\r\n\tunsigned long spuptr;\r\n\r\n\ttotaltogo = readbytes;\r\n\tspuptr = (unsigned long)destptr;\r\n\r\n\tif ((end_of_sram - spuptr) < readbytes)\r\n\t{\r\n\t\treturn(0);\r\n\t}\r\n\r\n\tpsxcd_seek(fileptr, filepos, PSXCD_SEEK_SET);\r\n\r\n\tReadChunk1 = 1;\r\n\twhile (CHUNKSIZE <= totaltogo)\r\n\t{\r\n\t\tdata_read_chunk(fileptr, CHUNKSIZE, spuptr);\r\n\r\n\t\ttotaltogo -= CHUNKSIZE;\r\n\t\tspuptr += CHUNKSIZE;\r\n\t}\r\n\r\n\tif (totaltogo)\r\n\t{\r\n\t\tdata_read_chunk(fileptr, totaltogo, spuptr);\r\n\t}\r\n\r\n\tSpuIsTransferCompleted(SPU_TRANSFER_WAIT);\r\n\r\n\treturn(readbytes);\r\n}\r\n\r\nvoid data_close(Wess_Data_IO_Struct *fileptr)//80043DE8\r\n{\r\n    psxcd_close(fileptr);\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/WESSARC.H",
    "content": "#ifndef _WESSARC_H\r\n#define _WESSARC_H\r\n\r\n//#include \"psxspu.h\"\r\n#include \"psxcd.h\"\r\n\r\nenum DriverIds {NoSound_ID,PSX_ID,GENERIC_ID=50};\r\n\r\nenum SoundHardwareTags {\r\n    SNDHW_TAG_END,//0\r\n    SNDHW_TAG_DRIVER_ID,//1\r\n    SNDHW_TAG_SOUND_EFFECTS,//2\r\n    SNDHW_TAG_MUSIC,//3\r\n    SNDHW_TAG_DRUMS,//4\r\n    SNDHW_TAG_MAX//5\r\n};\r\n\r\n// Driver/sequencer command ids\r\nenum DriverCmd {\r\n    DriverInit          = 0,\r\n    DriverExit          = 1,\r\n    DriverEntry1        = 2,\r\n    DriverEntry2        = 3,\r\n    DriverEntry3        = 4,\r\n    TrkOff              = 5,\r\n    TrkMute             = 6,\r\n    PatchChg            = 7,\r\n    PatchMod            = 8,\r\n    PitchMod            = 9,\r\n    ZeroMod             = 10,\r\n    ModuMod             = 11,\r\n    VolumeMod           = 12,\r\n    PanMod              = 13,\r\n    PedalMod            = 14,\r\n    ReverbMod           = 15,\r\n    ChorusMod           = 16,\r\n    NoteOn              = 17,\r\n    NoteOff             = 18,\r\n    StatusMark          = 19,\r\n    GateJump            = 20,\r\n    IterJump            = 21,\r\n    ResetGates          = 22,\r\n    ResetIters          = 23,\r\n    WriteIterBox        = 24,\r\n    SeqTempo            = 25,\r\n    SeqGosub            = 26,\r\n    SeqJump             = 27,\r\n    SeqRet              = 28,\r\n    SeqEnd              = 29,\r\n    TrkTempo            = 30,\r\n    TrkGosub            = 31,\r\n    TrkJump             = 32,\r\n    TrkRet              = 33,\r\n    TrkEnd              = 34,\r\n    NullEvent           = 35\r\n};\r\n\r\n//LCD FILE Structs\r\ntypedef struct\r\n{\r\n\tunsigned short\tpatchmap_cnt;\t//r*\r\n\tunsigned short\tpatchmap_idx;\t//r*2\r\n}patches_header;\r\n//int i = sizeof(patches_header);\r\n\r\ntypedef struct\r\n{\r\n\tunsigned char priority;\t\t\t//*\r\n\tunsigned char reverb;\t\t\t//*1\r\n\tunsigned char volume;\t\t\t//*2\r\n\tunsigned char pan;\t\t\t\t//*3\r\n\tunsigned char root_key;\t\t\t//*4\r\n\tunsigned char fine_adj;\t\t\t//*5\r\n\tunsigned char note_min;\t\t\t//*6\r\n\tunsigned char note_max;\t\t\t//*7\r\n\tunsigned char pitchstep_min;\t//*8\r\n\tunsigned char pitchstep_max;\t//*9\r\n\tunsigned short sample_id;\t\t//*10\r\n\tunsigned short adsr1;\t\t\t//*12\r\n\tunsigned short adsr2;\t\t\t//*14\r\n}patchmaps_header;\r\n//int i = sizeof(patchmaps_header);\r\n\r\ntypedef struct\r\n{\r\n\tunsigned int\tsample_offset;\t//r*\r\n\tunsigned int\tsample_size;\t//r*4\r\n\tunsigned long\tsample_pos;\t\t//r*8\r\n}patchinfo_header;\r\n//int i = sizeof(patchinfo_header);\r\n\r\n//*******************************\r\n\r\ntypedef struct\r\n{\r\n\tint\t\t\t\tmodule_id_text;\t\t//*\r\n\tunsigned int\tmodule_version;\t\t//*4\r\n\tunsigned short\tsequences;\t\t\t//*8\r\n\tunsigned char\tpatch_types_infile;\t//*10\r\n\tunsigned char\tseq_work_areas;\t\t//*11\r\n\tunsigned char\ttrk_work_areas;\t\t//*12\r\n\tunsigned char\tgates_per_seq;\t\t//*13\r\n\tunsigned char\titers_per_seq;\t\t//*14\r\n\tunsigned char\tcallback_areas;\t\t//*15\r\n}module_header;\r\n\r\ntypedef struct\r\n{\r\n\tunsigned char\tvoices_type;\t\t//*\r\n\tunsigned char\tvoices_max;\t\t\t//*1\r\n\tunsigned char\tpriority;\t\t\t//*2\r\n\tunsigned char\tlockchannel;\t\t//*3\r\n\tunsigned char\tvoices_class;\t\t//*4\r\n\tunsigned char\treverb;\t\t\t\t//*5\r\n\tunsigned short\tinitpatchnum;\t\t//*6\r\n\tunsigned short\tinitpitch_cntrl;\t//*8\r\n\tunsigned char\tinitvolume_cntrl;\t//*10\r\n\tunsigned char\tinitpan_cntrl;\t\t//*11\r\n\tunsigned char\tsubstack_count;\t\t//*12\r\n\tunsigned char\tmutebits;\t\t\t//*13\r\n\tunsigned short\tinitppq;\t\t\t//*14\r\n\tunsigned short\tinitqpm;\t\t\t//*16\r\n\tunsigned short\tlabellist_count;\t//*18\r\n\tunsigned int\tdata_size;\t\t\t//*20\r\n}track_header;//size 24 bytes\r\n\r\ntypedef struct\r\n{\r\n\ttrack_header\ttrk_hdr;\r\n\tunsigned long   *plabellist;//*24\r\n\tchar\t\t\t*ptrk_data;//*28 ??\r\n}track_data;//32\r\n\r\ntypedef struct\r\n{\r\n\tunsigned short tracks;\t//*\r\n\tunsigned short unk1;\t//*2\r\n}seq_header;\r\n\r\ntypedef struct\r\n{\r\n\tseq_header\t\tseq_hdr;\t\t//*\r\n\ttrack_data\t\t*ptrk_info;\t\t//*4\r\n\tunsigned int\tfileposition;\t//*8\r\n\tunsigned int\ttrkinfolength;\t//*12\r\n\tunsigned int\ttrkstoload;\t\t//*16\r\n}sequence_data;//debe medir 20?\r\n\r\ntypedef struct\r\n{\r\n\tmodule_header\tmod_hdr;\t\t\t//*\r\n\tsequence_data\t*pseq_info;\t\t\t//*16\r\n}module_data;\r\n\r\ntypedef void (*callfunc_t)();\r\ntypedef struct\r\n{\r\n\tunsigned char\tactive;\t\t\t\t//*\r\n\tunsigned char\ttype;\t\t\t\t//*1\r\n\tunsigned short\tcurval;\t\t\t\t//*2\r\n\tcallfunc_t      callfunc;\t\t\t//*4\r\n}callback_status;\r\n\r\ntypedef struct\r\n{\r\n\tunsigned int\tload_flags;\t\t\t//*\r\n\tunsigned char\tpatch_id;\t\t\t//*4\r\n\tunsigned char\thw_voice_limit;\t\t//*5\r\n\tunsigned short\tpad1;\t\t\t\t//*6\r\n\tunsigned short\tpatches;\t\t\t//*8\r\n\tunsigned short\tpatch_size;\t\t\t//*10\r\n\tunsigned short\tpatchmaps;\t\t\t//*12\r\n\tunsigned short\tpatchmap_size;\t\t//*14\r\n\tunsigned short\tpatchinfo;\t\t\t//*16\r\n\tunsigned short\tpatchinfo_size;\t\t//*18\r\n\tunsigned short\tdrummaps;\t\t\t//*20\r\n\tunsigned short\tdrummap_size;\t\t//*22\r\n\tunsigned int\textra_data_size;\t//*24\r\n}patch_group_header;\r\n\r\ntypedef struct\r\n{\r\n\tint hardware_ID;//76\r\n\tint flags_load;//80\r\n}hardware_table_list;\r\n\r\ntypedef struct\r\n{\r\n\tpatch_group_header pat_grp_hdr;\t\t//*\r\n\tchar\t\t\t\t*ppat_data;\t\t//*28\r\n\tint\t\t\t data_fileposition;\t\t//*32\r\n\tint\t\t\t\tsndhw_tags[10];\t\t//*36\r\n\thardware_table_list\thw_tl_list;\t\t//*76\r\n}patch_group_data;//size 84 bytes\r\n\r\n\r\n#define SEQ_STATE_STOPPED 0\r\n#define SEQ_STATE_PLAYING 1\r\n\r\n//track\r\n#define TRK_ACTIVE\t1\r\n#define TRK_MUTE\t2\r\n#define TRK_HANDLED\t4\r\n#define TRK_STOPPED\t8\r\n#define TRK_TIMED\t16\r\n#define TRK_LOOPED\t32\r\n#define TRK_SKIP\t64\r\n#define TRK_OFF\t    128\r\n\r\n//seq\r\n#define SEQ_ACTIVE\t1\r\n#define SEQ_HANDLE\t2\r\n\r\n//voice\r\n#define VOICE_ACTIVE\t1\r\n#define VOICE_RELEASE\t2\r\n\r\ntypedef struct\r\n{\r\n\tunsigned char\tflags;\t\t\t//*\r\n\tunsigned char\tplaymode;\t\t//*1\r\n\tunsigned short\tseq_num;\t\t//*2\r\n\tunsigned char\ttracks_active;\t//*4\r\n\tunsigned char\ttracks_playing;\t//*5\r\n\tunsigned char\tvolume;\t\t\t//*6\r\n\tunsigned char\tpan;\t\t\t//*7\r\n\tunsigned int\tseq_type;\t\t//*8\r\n\tchar\t\t\t*ptrk_indxs;\t//*12\r\n\tchar\t\t\t*pgates;\t\t//*16\r\n\tchar\t\t\t*piters;\t\t//*20\r\n}sequence_status;\r\n\r\ntypedef struct\r\n{\r\n\tunsigned char\tflags;\t        //*     //0\r\n\tunsigned char\trefindx;\t\t//*1\r\n\tunsigned char\tseq_owner;\t\t//*2\r\n\tunsigned char\tpatchtype;\t\t//*3\r\n\tunsigned int\tdeltatime;\t\t//*4    //1\r\n\tunsigned char\tpriority;\t\t//*8    //2\r\n\tunsigned char\treverb;\t\t\t//*9\r\n\tunsigned short\tpatchnum;\t\t//*10\r\n\tunsigned char\tvolume_cntrl;\t//*12   //3\r\n\tunsigned char\tpan_cntrl;\t\t//*13\r\n\tshort\t        pitch_cntrl;\t//*14\r\n\tunsigned char\tvoices_active;\t//*16   //4\r\n\tunsigned char\tvoices_max;\t\t//*17\r\n\tunsigned char\tmutemask;\t\t//*18\r\n\tunsigned char\tsndclass;\t\t//*19\r\n\tunsigned short\tppq;\t\t\t//*20   //5\r\n\tunsigned short\tqpm;\t\t\t//*22\r\n\tunsigned short\tlabellist_count;//*24   //6\r\n\tunsigned short\tlabellist_max;\t//*26\r\n\tunsigned long\tppi;\t\t\t//*28   //7\r\n\tunsigned long\tstarppi;\t\t//*32   //8\r\n\tunsigned int\taccppi;\t\t\t//*36   //9\r\n\tunsigned int\ttotppi;\t\t\t//*40   //10\r\n\tunsigned int\tendppi;\t\t\t//*44   //11\r\n\tunsigned char\t*pstart;\t\t//*48   //12\r\n\tunsigned char\t*ppos;\t\t\t//*52   //13\r\n\tunsigned long   *plabellist;\t//*56   //14\r\n\tunsigned char   **psubstack;\t//*60   //15\r\n\tunsigned char   **psp;\t\t\t//*64   //16\r\n\tunsigned char   **pstackend;\t//*68   //17\r\n\tunsigned int\tdata_size;\t\t//*72   //18\r\n\tunsigned int\tdata_space;\t\t//*76   //19\r\n}track_status;\r\n\r\ntypedef struct\r\n{\r\n\tunsigned char\t    flags;\t\t\t//*     //0\r\n\tunsigned char\t    patchtype;\t\t//*1\r\n\tunsigned char\t    refindx;\t\t//*2\r\n\tunsigned char\t    track;\t\t\t//*3\r\n\tunsigned char\t    priority;\t\t//*4    //1\r\n\tunsigned char\t    keynum;\t\t\t//*5\r\n\tunsigned char\t    velnum;\t\t\t//*6\r\n\tunsigned char\t    sndtype;\t\t\t//*7\r\n\tpatchmaps_header   *patchmaps;\t//*8    //2\r\n\tpatchinfo_header   *patchinfo;\t//*12   //3\r\n\tunsigned long\t    pabstime;\t\t//*16   //4\r\n\tunsigned long\t    adsr2;\t\t\t//*20   //5\r\n}voice_status;//size 24 bytes\r\n\r\ntypedef struct\r\n{\r\n\tunsigned long\t\t*pabstime;\t\t\t\t//*\r\n\tunsigned char\t\tseqs_active;\t\t\t//*4\r\n\tunsigned char\t\ttrks_active;\t\t\t//*5\r\n\tunsigned char\t\tvoices_active;\t\t\t//*6\r\n\tunsigned char\t\tvoices_total;\t\t\t//*7\r\n\tunsigned char\t\tpatch_types_loaded;\t\t//*8\r\n\tunsigned char\t\tunk1;\t\t\t\t\t//*9\r\n\tunsigned char\t\tcallbacks_active;\t\t//*10\r\n\tunsigned char\t\tunk3;\t\t\t\t\t//*11\r\n\tmodule_data\t\t\t*pmod_info;\t\t\t\t//*12\r\n\tcallback_status\t\t*pcalltable;\t\t\t//*16\r\n\tchar\t\t\t\t*pmaster_volume;\t\t//*20\r\n\tpatch_group_data\t*ppat_info;\t\t\t\t//*24\r\n\tunsigned long\t\tmax_trks_perseq;\t\t//*28\r\n\tsequence_status\t\t*pseqstattbl;\t\t\t//*32\r\n\tunsigned long\t\tmax_substack_pertrk;\t//*36\r\n\ttrack_status\t\t*ptrkstattbl;\t\t\t//*40\r\n\tunsigned long\t\tmax_voices_pertrk;\t\t//*44\r\n\tvoice_status\t\t*pvoicestattbl;\t\t\t//*48\r\n\t//char\t\t\t\t*ptr_module;\t\t\t//*52\r\n\tunsigned long\t\tfp_module;\t\t\t    //*52\r\n}master_status_structure;\r\n\r\ntypedef master_status_structure pmasterstat;\r\n\r\n#define WESS_SSSP_TEXT\t\t0x58535053//'SPSX'//0x58535053 //SPSX\r\n#define WESS_CORE_VERSION\t0x01\r\n\r\n#define SNDFX_CLASS\t\t0\r\n#define MUSIC_CLASS\t\t1\r\n#define DRUMS_CLASS\t\t2\r\n#define SFXDRUMS_CLASS\t3\r\n\r\n#define TAG_SOUND_EFFECTS 1\r\n#define TAG_MUSIC         2\r\n#define TAG_DRUMS         4\r\n\r\n#define LOAD_PATCHES\t1\r\n#define LOAD_PATCHMAPS\t2\r\n#define LOAD_PATCHINFO\t4\r\n#define LOAD_DRUMMAPS\t8\r\n#define LOAD_EXTRADATA\t16\r\n\r\n///----------------------------------\r\nextern void (**CmdFuncArr[10])(track_status *);\r\n\r\nextern volatile int SeqOn;\r\nextern volatile unsigned long millicount;\r\nextern volatile int WessTimerActive;\r\n\r\ntypedef PsxCd_File Wess_File_IO_Struct;\r\ntypedef PsxCd_File Wess_Data_IO_Struct;\r\n\r\nextern short GetIntsPerSec(void);\r\nextern unsigned long CalcPartsPerInt(short ips,short ppq,short qpm);\r\n\r\nextern void init_WessTimer(void);\r\nextern void exit_WessTimer(void);\r\n\r\nextern void wess_low_level_exit(void);\r\nextern void *wess_malloc(int size);\r\nextern void wess_free(char *mem);\r\n\r\n#endif // _WESSARC_H\r\n"
  },
  {
    "path": "PSXDOOM/WESSBASE.C",
    "content": "// Reconstruido por Erick Vasquez Garcia 16/05/2019 [GEC]\r\n// Update_1 20/10/2019 [GEC]\r\n// Update_2 31/01/2020 [GEC]\r\n\r\n#include <libspu.h>\r\n#include \"psxspu.h\"\r\n#include \"wessapi.h\"\r\n#include \"wessarc.h\"\r\n#include \"lcdload.h\"\r\n\r\n// Variables Aquí para que funcionen correctamante con WessInterruptHandler\r\n\r\n\r\nint psxsettings[SNDHW_TAG_MAX*2] = //800756EC\r\n{\r\n        SNDHW_TAG_DRIVER_ID, PSX_ID,\r\n        SNDHW_TAG_SOUND_EFFECTS, 1,\r\n        SNDHW_TAG_MUSIC, 1,\r\n        SNDHW_TAG_DRUMS, 1,\r\n        SNDHW_TAG_END, 0\r\n};\r\n\r\nint *settings_list[2] =\r\n{\r\n        psxsettings,\r\n        0\r\n};\r\n\r\nSampleBlock doomsfxblk;//8007eac0\r\nSampleBlock mapsfxblk;//8007ec54\r\n\r\nNoteState tmp_notestate;//0x8007e93c\r\n\r\n\r\n//WESSAPI.C-------------------------------------------\r\nint num_sd = 0;                         //80075714\r\nchar *wmd_file_ptr = 0;                 //80075718\r\nchar *wmd_file_ptr2 = 0;                //8007571C\r\nWess_File_IO_Struct *fp_wmd_file = 0;   //80075720\r\nint sysinit = 0;                        //80075724\r\nint module_loaded = 0;                  //80075728\r\nint early_exit = 0;                     //8007572C\r\nint max_seq_num = 0;                    //80075730\r\nint mem_limit = 0;                      //80075734\r\npatch_group_header scratch_pat_grp_hdr; //8007EDE8\r\ntrack_header scratch_trk_hdr;           //8007EE04\r\nint wmd_mem_is_mine = 0;                //80075738\r\nchar *wmd_mem = 0;                      //8007573C\r\nchar *wmd_end = 0;                      //80075740\r\nint wmd_size = 0;                       //80075744\r\nint (*Error_func)(int, int) = 0;        //80075748\r\nint Error_module = 0;                   //8007574C\r\npmasterstat *pm_stat;                   //800A8538\r\n\r\n//WESSARC.C-------------------------------------------\r\nint SeqOn = 0;\r\nunsigned long millicount = 0;\r\nunsigned long millisum = 0;\r\n\r\nint WessTimerActive = 0;\r\n\r\nint T2counter = 0;\r\n\r\n#define CHUNKSIZE 2048\r\nchar chunk[CHUNKSIZE];//80096394\r\nchar chunk2[CHUNKSIZE];//80096BA4\r\n\r\nint ReadChunk1 = 0;//*L8007EE70\r\nint ReadChunk2 = 0;//*L8007EE1C\r\n\r\n//LCDLOAD.C-------------------------------------------\r\n\r\nint lcd_open = 0;\t                //L800758F4\r\nchar *lcd_ppat_data_patches = 0;    //L800758F8\r\nchar *lcd_ppat_data_patchmaps = 0;  //L800758FC\r\nchar *lcd_ppat_data_patchinfo = 0;  //L80075900\r\nchar *lcd_ppat_data_track = 0;      //L80075904\r\npatch_group_data *lcd_ppat_info = 0;//L80075908;\r\nunsigned long lcd_sample_pos = 0;   //L8007590C\r\nunsigned int lcd_sectorbuf_pos = 0; //L80075910\r\nunsigned int lcd_totaltogo = 0;     //L80075914\r\n\r\nshort lcd_sectorbuf_code = 0;       //L80075918\r\nchar *lcd_sectorbuf;                //L8007591C\r\n\r\nint lcd_cd_status = 0;              //L80075920\r\n\r\nint  lcd_sync_intr = 0;             //L80075924\r\nchar lcd_sync_result[8] = { 0,0,0,0,0,0,0,0 };//0x80075928\r\n\r\nWess_Data_IO_Struct lcd_data_fileref;//0x8007f104\r\n\r\n//SEQLOAD.C-------------------------------------------\r\nint seq_loader_enable = 0;          //80075790\r\nchar *loaderfile = 0;\t\t        //80075794\r\npmasterstat *ref_pm_stat = 0;       //80075798\r\nint ref_max_seq_num = 0;            //8007579C\r\nchar Driver_Init = DriverInit;      //800757A0\r\nchar Reset_Gates = ResetGates;      //800757A1\r\nint\topencount = 0;\t\t\t\t    //800757A4\r\nint(*Seq_Error_func)(int, int) = 0; //800757A8\r\nint Seq_Error_module = 0;           //800757AC\r\nWess_File_IO_Struct *fp_seq_file = 0;//800757B0\r\n\r\ntrack_header seq_track_header;      //8007EE74\r\ntrack_header base_track_header;     //8007EE8C\r\n\r\n//PSXSPU.C-------------------------------------------\r\n#define MALLOC_MAX 1\r\nchar spu_malloc_rec[SPU_MALLOC_RECSIZ * (MALLOC_MAX + 1)];\r\n\r\nunsigned int psxspu_initialized = 0;\r\nunsigned int psxspu_status = 0;\r\nunsigned long end_of_sram = 0x7F000;\r\n\r\nint psxspu_master_vol = 0x3FFF;\r\nint psxspu_master_fadecount = 0;\r\nint psxspu_master_vol_fixed = 0x3FFF0000;\r\nint psxspu_master_destvol = 0;\r\nint psxspu_master_changeval = 0;\r\n\r\nint psxspu_cd_vol = 0x3CFF;\r\nint psxspu_cd_fadecount = 0;\r\nint psxspu_cd_vol_fixed = 0x3FFF0000;\r\nint psxspu_cd_destvol = 0;\r\nint psxspu_cd_changeval =  0;\r\n\r\nSpuReverbAttr rev_attr;//8007EEA4\r\n\r\n//WESSSEQ.C-------------------------------------------\r\nunsigned char skip_table[72] = {\r\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,\r\n0x02, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,\r\n0x02, 0x03, 0x02, 0x04, 0x05, 0x05, 0x02, 0x02,\r\n0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03,\r\n0x03, 0x01, 0x01, 0x01, 0x00, 0x01, 0x02, 0x03,\r\n0x04, 0x07, 0x06, 0x16, 0x17, 0x18, 0x15, 0x1A,\r\n0x1E, 0x19, 0x1B, 0x1D, 0x1C, 0x1F, 0x05, 0x0F,\r\n0x08, 0x09, 0x12, 0x11, 0x10, 0x14, 0x0D, 0x0B,\r\n0x22, 0x23, 0x13, 0x0C, 0x0A, 0x20, 0x21, 0x0E\r\n};\r\n\r\nunsigned char\tmaster_sfx_volume = 0x7f;\t//*L80075834\r\nunsigned char\tmaster_mus_volume = 0x7f;\t//*L80075835\r\nunsigned char\tpan_status = 0x1;\t\t\t//*L80075836\r\nunsigned char\trelease_rate = 0xD;\t\t\t//*L80075837\r\n\r\nunsigned long\tvoice_flags1 = 0;\t\t\t//*L80075838\r\nunsigned long\tvoice_flags2 = 0;\t\t\t//*L8007583C\r\nNoteState\t\t*ptr_notestate = 0;\t\t\t//*L80075840\r\nvoice_status\t*ptr_pvoicestattbl = 0;\t\t//*L80075844\r\nunsigned long\tpriority = 0x100;\t\t\t//*L80075848\r\nunsigned long\tmax_pabstime = 0xFFFFFFFF;  //*L8007584C\r\n\r\n//-----------------------------------------------------------\r\n// Driver System\r\n//-----------------------------------------------------------\r\n\r\nmaster_status_structure\t\t*drv_pmsbase;\t\t\t//L8007EF88\r\nsequence_status\t\t\t\t*drv_pssbase;\t\t    //L8007EF8C\r\ntrack_status\t\t\t\t*drv_ptsbase;\t\t    //L8007EF90\r\nunsigned long\t\t\t\t drv_hwvl;\t\t        //L8007EF98\r\npatch_group_data\t\t\t*drv_ppgd;\t\t        //L8007EF9C\r\nunsigned long\t\t\t\t*drv_pcurabstime;\t\t//L8007EFA0\r\npatches_header\t\t\t\t*drv_patchesbase;\t\t//L8007EFA4\r\npatchmaps_header\t\t\t*drv_patchmapsbase;\t\t//L8007EFA8\r\npatchinfo_header\t\t\t*drv_samplesbase;\t\t//L8007EFAC\r\nchar\t\t\t\t\t\t*drv_drummapsbase;\t\t//L8007EFB0\r\nSpuVoiceAttr\t\t\t\tdrv_outattr;            //L8007EFB4\r\n\r\nunsigned char\t\t\t\tdrv_nvst;\t\t        //L8007EED0\r\nunsigned char\t\t\t\tdrv_npti;\t            //L8007EED4\r\nunsigned long\t\t\t\tdrv_cnt;\t\t\t\t//L8007EED8\r\nvoice_status\t\t\t\t*drv_pvsbase;\t\t    //L8007EEDC\r\n\r\nvoice_status\t\t\t\t*drv_pcurvs;\t        //L8007EF94\r\n\r\nunsigned char\t\t\t\tdrv_channels[24];\t\t//8007f00c\r\n\r\nunsigned long\t\t\t\tdrv_pitch1;\t\t\t\t//L8007EEB8\r\nunsigned long\t\t\t\tdrv_pitch2;\t\t\t\t//L8007EEBC\r\nunsigned long\t\t\t\tdrv_pitch3;\t\t\t\t//L8007EEC0\r\nunsigned long\t\t\t\tdrv_volume_1;\t\t\t//L8007EEC4\r\ntrack_status\t\t\t\t*drv_ptrk_stat;\t\t\t//L8007EEC8\r\nshort\t\t\t\t        drv_pan_1;\t\t\t\t//L8007EECC\r\n\r\nunsigned long\t\t        drv_vn;\t\t\t        //8007EEE0\r\nunsigned long\t\t        drv_vi;                 //8007EEE4\r\nunsigned long\t\t        drv_keychannels;        //8007EEE8\r\nunsigned long\t\t        drv_keycnt;\t\t\t    //8007EEEC\r\nvoice_status\t\t        *drv_pvs;\t\t\t    //8007EEF0\r\nunsigned long\t\t        drv_voiceflag;          //8007EEF4\r\nchar\t\t\t\t        drv_keysstatus[24];     //8007EFF4\r\n\r\nsequence_status\t\t\t\t*drv_pss;\t\t        //L8007EEF8\r\n\r\nunsigned long\t\t\t\tdrv_vn_2;\t\t        //L8007EEFC\r\nunsigned long\t\t\t\tdrv_vi_2;\t\t        //L8007EF00\r\nvoice_status\t\t\t\t*drv_pvs_2;\t\t\t    //L8007EF04\r\nsequence_status\t\t\t\t*drv_pss_2;\t\t\t    //L8007EF08\r\n\r\nunsigned short\t\t\t\tdrv_thepatch;\t\t    //L8007EF0C\r\n\r\nunsigned long\t\t\t\tdrv_voices_active_3;\t//L8007EF10\r\nunsigned long\t\t\t\tdrv_hwvl_3;\t\t        //L8007EF14\r\nunsigned long\t\t\t\tdrv_pitch_1;\t\t\t//L8007EF18\r\nunsigned long\t\t\t\tdrv_pitch_2;\t\t\t//L8007EF1C\r\nunsigned long\t\t\t\tdrv_pitch_3;\t\t\t//L8007EF20\r\nvoice_status\t\t\t\t*drv_voice_stat_3;\t\t//L8007EF24\r\nshort\t\t\t\t        drv_pitch_cntrl;\t\t//L8007EF28\r\n\r\nunsigned long\t\t\t\tdrv_voices_active_4;\t//L8007EF2C\r\nunsigned long\t\t\t\tdrv_hwvl_4;\t\t        //L8007EF30\r\nunsigned long\t\t\t\tdrv_volume_2;\t\t\t//L8007EF34\r\nvoice_status\t\t\t\t*drv_voice_stat_4;\t\t//L8007EF38\r\nshort\t\t\t\t        drv_pan_2;\t\t\t\t//L8007EF3C\r\n\r\nunsigned long\t\t\t\tdrv_voices_active_5;\t//L8007EF40\r\nunsigned long\t\t\t\tdrv_hwvl_5;\t\t        //L8007EF44\r\nunsigned long\t\t\t\tdrv_volume_3;\t\t\t//L8007EF48\r\nvoice_status\t\t\t\t*drv_voice_stat_5;\t\t//L8007EF4C\r\nshort\t\t\t\t        drv_pan_3;\t\t\t\t//L8007EF50\r\n\r\ntrack_status\t\t\t\t*drv_ptrk_stat_1;\t\t//L8007EF54\r\n\r\nunsigned long\t\t\t\tdrv_hwvl_6;\t\t        //L8007EF58\r\nunsigned long\t\t\t\tdrv_note_stat;\t\t\t//L8007EF5C\r\nvoice_status\t\t\t\t*drv_voice_stat_6;\t\t//L8007EF60\r\n\r\nunsigned long\t\t\t\tdrv_patch_cnt;\t\t\t//L8007EF64\r\nunsigned char\t\t\t\tdrv_byte01;\t\t\t\t//L8007EF68\r\nunsigned char\t\t\t\tdrv_byte02;\t\t\t\t//L8007EF6C\r\nunsigned char\t\t\t\tdrv_patchmap_cnt;\t\t//L8007EF70\r\npatches_header\t\t\t\t*drv_patch_1;\t\t\t//L8007EF74\r\npatchmaps_header\t\t\t*drv_patchmap_1;\t\t//L8007EF78\r\npatchinfo_header\t\t\t*drv_samplesbase_1;\t    //L8007EF7C\r\n\r\nunsigned long\t\t\t\tdrv_hwvl_7;\t\t        //L8007EF80\r\nvoice_status\t\t\t    *drv_voice_stat_7;\t\t//L8007EF84\r\n\r\nunsigned int data01;        //L8007F024\r\nunsigned char data02;       //L8007F028\r\n\r\n//-----------------------------------------------------------\r\n// Engine System\r\n//-----------------------------------------------------------\r\n\r\nunsigned char\t\t\t eng_ntwa;\t            //L800758E4\r\ntrack_status\t\t\t*eng_ptsbase;\t        //L800758E8\r\nsequence_status\t\t\t*eng_pssbase;\t        //L800758EC\r\nmaster_status_structure *eng_pmsbase;\t\t    //L800758F0\r\n\r\nsequence_status\t\t\t*eng_seq_stat_1;\t\t//L8007F02C\r\nchar\t\t\t\t\t*eng_ptrk_indxs1;\t\t//L8007F030\r\nunsigned long\t\t\teng_max_trks_perseq1;\t//L8007F034\r\n\r\nunsigned char\t\t\teng_patchnum;\t\t\t//L8007F038\r\nshort\t\t\t        eng_pitch_cntrl;\t\t//L8007F03C\r\n\r\nunsigned char\t\t\teng_volume_cntrl;\t\t//L8007F040\r\n\r\nunsigned char\t\t\teng_pan_cntrl;\t\t\t//L8007F044\r\n\r\nunsigned char\t\t\teng_callback_areas;\t    //L8007F048\r\nunsigned char\t\t\teng_callbacks_active;   //L8007F04C\r\ncallback_status\t\t\t*eng_pcalltable;\t    //L8007F050\r\n\r\nshort\t\t\t        eng_labelnum;\t        //L8007F054\r\nchar\t\t\t\t\t*eng_plabellist;        //L8007F058\r\nchar\t\t\t\t\t*eng_pgates;\t        //L8007F05C\r\n\r\nchar\t\t\t\t\t*eng_piters;\t        //L8007F068\r\nshort\t\t\t        eng_labelnum2;\t        //L8007F060\r\nchar\t\t\t\t\t*eng_plabellist2;       //L8007F064\r\n\r\nunsigned char\t\t\teng_gates_per_seq;\t    //L8007F06C\r\nchar\t\t\t\t\t*eng_pgates2;\t\t    //L8007F070\r\n\r\nunsigned char\t\t\teng_iters_per_seq;\t    //L8007F074\r\nchar\t\t\t\t\t*eng_piters2;\t\t    //L8007F078\r\n\r\nchar\t\t\t\t\t*eng_piters3;\t\t    //L8007F07C\r\n\r\nunsigned short\t\t\teng_tracks;\t\t\t\t//L8007F080\r\nunsigned char\t\t\teng_tracks_active2;\t\t//L8007F084\r\nunsigned char\t\t\t*eng_ptrk_indxs2;\t\t//L8007F088\r\ntrack_status\t\t\t*eng_ptrk_stat_1;\t\t//L8007F08C\r\nsequence_status\t\t\t*eng_seq_stat_2;\t\t//L8007F090\r\n\r\nshort\t\t\t        eng_labelnum3;\t\t\t//L8007F094\r\nunsigned short\t\t\teng_tracks2;\t\t\t//L8007F098\r\nchar\t\t\t\t\t*eng_plabellist3;\t\t//L8007F09C\r\nunsigned char\t\t\teng_tracks_active3;\t\t//L8007F0A0\r\nunsigned char\t\t\t*eng_ptrk_indxs3;\t\t//L8007F0A4\r\ntrack_status\t\t\t*eng_ptrk_stat_2;\t\t//L8007F0A8\r\nsequence_status\t\t\t*eng_seq_stat_3;\t\t//L8007F0AC\r\n\r\nshort\t\t\t        eng_labelnum4;\t\t\t//L8007F0B0\r\nunsigned short\t\t\teng_tracks3;\t\t\t//L8007F0B4\r\nchar\t\t\t\t\t*eng_plabellist4;\t\t//L8007F0B8\r\nunsigned char\t\t\teng_tracks_active4;\t\t//L8007F0BC\r\nunsigned char\t\t\t*eng_ptrk_indxs4;\t\t//L8007F0C0\r\ntrack_status\t\t\t*eng_ptrk_stat_3;\t\t//L8007F0C4\r\nsequence_status\t\t\t*eng_seq_stat_4;\t\t//L8007F0C8\r\n\r\nunsigned short\t\t\teng_tracks4;\t\t\t//L8007F0CC\r\nunsigned char\t\t\teng_tracks_active5;\t\t//L8007F0D0\r\nunsigned char\t\t\t*eng_ptrk_indxs5;\t\t//L8007F0D4\r\ntrack_status\t\t\t*eng_ptrk_stat_4;\t\t//L8007F0D8\r\nsequence_status\t\t\t*eng_seq_stat_5;\t\t//L8007F0DC\r\n\r\nsequence_status\t\t\t*eng_seq_stat_6;\t\t//L8007F0E0\r\ntrack_status\t\t\t*eng_ptrk_stat_5;\t\t//L8007F0E4\r\nunsigned char\t\t\t*eng_ptrk_indxs6;\t\t//L8007F0E8\r\nunsigned char\t\t\teng_tracks_active6;\t\t//L8007F0EC\r\nunsigned long\t\t\teng_max_trks_perseq;\t//L8007F0F0\r\n\r\ntrack_status *eng_tmp_ptrkstattbl;              //L8007F0F4\r\nunsigned int eng_tmp_trks_active;               //L8007F0F8\r\nunsigned int eng_tmp_trk_work_areas;            //L8007F0FC\r\nchar *eng_tmp_ppos;                             //L8007F100\r\n"
  },
  {
    "path": "PSXDOOM/WESSSEQ.C",
    "content": "// Reconstruido por Erick Vasquez Garcia 16/05/2019 [GEC]\r\n// Update_1 20/10/2019 [GEC]\r\n// Update_2 31/01/2020 [GEC]\r\n\r\n#include \"wessseq.h\"\r\n\r\nextern void (**CmdFuncArr[10])(track_status *);\r\nextern void(*DrvFunctions[36])();\r\n\r\nchar *Read_Vlq(char *pstart, void *deltatime);\r\nchar *Write_Vlq(char *dest, unsigned int deltatime);\r\nint Len_Vlq(unsigned int deltatime);\r\n\r\nvoid Eng_DriverInit (master_status_structure *pm_stat);\r\nvoid Eng_DriverExit (track_status *ptk_stat);\r\nvoid Eng_DriverEntry1 (track_status *ptk_stat);\r\nvoid Eng_DriverEntry2 (track_status *ptk_stat);\r\nvoid Eng_DriverEntry3 (track_status *ptk_stat);\r\nvoid Eng_TrkOff (track_status *ptk_stat);\r\nvoid Eng_TrkMute (track_status *ptk_stat);\r\nvoid Eng_PatchChg (track_status *ptk_stat);\r\nvoid Eng_PatchMod (track_status *ptk_stat);\r\nvoid Eng_PitchMod (track_status *ptk_stat);\r\nvoid Eng_ZeroMod (track_status *ptk_stat);\r\nvoid Eng_ModuMod (track_status *ptk_stat);\r\nvoid Eng_VolumeMod (track_status *ptk_stat);\r\nvoid Eng_PanMod (track_status *ptk_stat);\r\nvoid Eng_PedalMod (track_status *ptk_stat);\r\nvoid Eng_ReverbMod (track_status *ptk_stat);\r\nvoid Eng_ChorusMod (track_status *ptk_stat);\r\nvoid Eng_NoteOn (track_status *ptk_stat);\r\nvoid Eng_NoteOff (track_status *ptk_stat);\r\nvoid Eng_StatusMark (track_status *ptk_stat);\r\nvoid Eng_GateJump (track_status *ptk_stat);\r\nvoid Eng_IterJump (track_status *ptk_stat);\r\nvoid Eng_ResetGates (track_status *ptk_stat);\r\nvoid Eng_ResetIters (track_status *ptk_stat);\r\nvoid Eng_WriteIterBox (track_status *ptk_stat);\r\nvoid Eng_SeqTempo (track_status *ptk_stat);\r\nvoid Eng_SeqGosub (track_status *ptk_stat);\r\nvoid Eng_SeqJump (track_status *ptk_stat);\r\nvoid Eng_SeqRet (track_status *ptk_stat);\r\nvoid Eng_SeqEnd (track_status *ptk_stat);\r\nvoid Eng_TrkTempo (track_status *ptk_stat);\r\nvoid Eng_TrkGosub (track_status *ptk_stat);\r\nvoid Eng_TrkJump (track_status *ptk_stat);\r\nvoid Eng_TrkRet (track_status *ptk_stat);\r\nvoid Eng_TrkEnd (track_status *ptk_stat);\r\nvoid Eng_NullEvent (track_status *ptk_stat);\r\n\r\nvoid(*DrvFunctions[36])() =\r\n{\r\n\tEng_DriverInit,\r\n\tEng_DriverExit,\r\n\tEng_DriverEntry1,\r\n\tEng_DriverEntry2,\r\n\tEng_DriverEntry3,\r\n\tEng_TrkOff,\r\n\tEng_TrkMute,\r\n\tEng_PatchChg,\r\n\tEng_PatchMod,\r\n\tEng_PitchMod,\r\n\tEng_ZeroMod,\r\n\tEng_ModuMod,\r\n\tEng_VolumeMod,\r\n\tEng_PanMod,\r\n\tEng_PedalMod,\r\n\tEng_ReverbMod,\r\n\tEng_ChorusMod,\r\n\tEng_NoteOn,\r\n\tEng_NoteOff,\r\n\tEng_StatusMark,     //0x13\r\n\tEng_GateJump,       //0x14\r\n\tEng_IterJump,       //0x15\r\n\tEng_ResetGates,     //0x16\r\n\tEng_ResetIters,     //0x17\r\n\tEng_WriteIterBox,   //0x18\r\n\tEng_SeqTempo,       //0x19\r\n\tEng_SeqGosub,       //0x1A\r\n\tEng_SeqJump,        //0x1B\r\n\tEng_SeqRet,         //0x1C\r\n\t//SeqFunctions ??\r\n\tEng_SeqEnd,         //0x1D\r\n\tEng_TrkTempo,       //0x1E\r\n\tEng_TrkGosub,       //0x1F\r\n\tEng_TrkJump,        //0x20\r\n\tEng_TrkRet,         //0x21\r\n\tEng_TrkEnd,         //0x22\r\n\tEng_NullEvent       //0x23\r\n};\r\n\r\nextern unsigned char                skip_table[72];         //80075930\r\n\r\nextern unsigned char\t            master_sfx_volume;\t    //80075834\r\nextern unsigned char\t            master_mus_volume;\t    //80075835\r\nextern unsigned char\t            pan_status;\t\t\t    //80075836\r\nextern unsigned char\t            release_rate;\t\t\t//80075837\r\n\r\nextern unsigned long\t            voice_flags1;\t\t\t//80075838\r\nextern unsigned long\t            voice_flags2;\t\t\t//8007583C\r\nextern NoteState\t\t            *ptr_notestate;\t\t\t//80075840\r\nextern voice_status\t                *ptr_pvoicestattbl;\t\t//80075844\r\nextern unsigned long\t            priority;\t\t\t    //80075848\r\nextern unsigned long\t            max_pabstime;           //8007584C\r\n\r\nextern master_status_structure\t\t*drv_pmsbase;\t\t\t//8007EF88\r\nextern sequence_status\t\t\t\t*drv_pssbase;\t\t    //8007EF8C\r\nextern track_status\t\t\t\t    *drv_ptsbase;\t\t    //8007EF90\r\nextern unsigned long\t\t\t\tdrv_hwvl;\t\t        //8007EF98\r\nextern patch_group_data\t\t\t    *drv_ppgd;\t\t        //8007EF9C\r\nextern unsigned long\t\t\t\t*drv_pcurabstime;\t\t//8007EFA0\r\nextern patches_header\t\t\t\t*drv_patchesbase;\t\t//8007EFA4\r\nextern patchmaps_header\t\t\t    *drv_patchmapsbase;\t\t//8007EFA8\r\nextern patchinfo_header\t\t\t    *drv_samplesbase;\t\t//8007EFAC\r\nextern char\t\t\t\t\t\t    *drv_drummapsbase;\t\t//8007EFB0\r\nextern SpuVoiceAttr\t\t\t\t    drv_outattr;            //8007EFB4\r\n\r\nextern unsigned char\t\t\t\tdrv_nvst;\t\t        //8007EED0\r\nextern unsigned char\t\t\t\tdrv_npti;\t            //8007EED4\r\nextern unsigned long\t\t\t\tdrv_cnt;\t\t\t\t//8007EED8\r\nextern voice_status\t\t\t\t    *drv_pvsbase;\t\t    //8007EEDC\r\n\r\nextern voice_status\t\t\t\t    *drv_pcurvs;\t        //8007EF94\r\n\r\nextern unsigned char\t\t\t\tdrv_channels[24];\t\t//8007f00c\r\n\r\n//-----------------------------------------------------------\r\n// Vlq System\r\n//-----------------------------------------------------------\r\n\r\nextern unsigned int data01;    //L8007F024\r\nextern unsigned char data02;    //L8007F028\r\n\r\nchar *Read_Vlq(char *pstart, void *deltatime)//L80035F80()\r\n{\r\n\tunsigned int value;\r\n\tchar data2;\r\n\r\n\tvalue = *pstart++;\r\n\tif (value & 0x80)\r\n\t{\r\n\t\tvalue &= 0x7f;\r\n\t\tdo\r\n\t\t{\r\n\t\t\tdata2 = *pstart++;\r\n\t\t\tvalue = (data2 & 0x7f) + (value << 7);\r\n\t\t\tdata02 = data2;\r\n\t\t\tdata01 = value;\r\n\t\t} while (data2 & 0x80);\r\n\t}\r\n\t*(int*)deltatime = value;\r\n\r\n\treturn pstart;\r\n}\r\n\r\nchar *Write_Vlq(char *dest, unsigned int deltatime)//L8004744C()\r\n{\r\n\tchar data[8];\r\n\tchar *ptr;\r\n\r\n    data[0] = (deltatime & 0x7f);\r\n\tptr = (char*)&data+1;\r\n\r\n\tdeltatime >>= 7;\r\n\tif (deltatime)\r\n\t{\r\n\t\tdo\r\n\t\t{\r\n\t\t\t*ptr++ = ((deltatime & 0x7f) | 0x80);\r\n\t\t\tdeltatime >>= 7;\r\n\t\t} while (deltatime);\r\n\t}\r\n\r\n\tdo\r\n\t{\r\n\t\tptr--;\r\n\t\t*dest++ = *ptr;\r\n\t} while (*ptr & 0x80);\r\n\r\n\treturn dest;\r\n}\r\n\r\nint Len_Vlq(unsigned int deltatime)//L800474AC()\r\n{\r\n    char start[8];\r\n    char* end = Write_Vlq(start, deltatime);\r\n    return (int)(end - start);\r\n}\r\n\r\n//-----------------------------------------------------------\r\n// Engine System\r\n//-----------------------------------------------------------\r\n\r\nextern unsigned char\t\t\t eng_ntwa;\t        //L800758E4\r\nextern track_status\t\t\t    *eng_ptsbase;\t//L800758E8\r\nextern sequence_status\t\t\t*eng_pssbase;\t//L800758EC\r\nextern master_status_structure  *eng_pmsbase;\t\t//L800758F0\r\n\r\nvoid Eng_DriverInit (master_status_structure *pm_stat)//L80047518\r\n{\r\n    //printf(\"Eng_DriverInit\\n\");\r\n\teng_pmsbase = pm_stat;\r\n\teng_ptsbase = pm_stat->ptrkstattbl;\r\n\teng_pssbase = pm_stat->pseqstattbl;\r\n\teng_ntwa = pm_stat->pmod_info->mod_hdr.trk_work_areas;\r\n}\r\n\r\nvoid Eng_DriverExit (track_status *ptk_stat)//L80047554()\r\n{\r\n    //printf(\"Eng_DriverExit\\n\");\r\n}\r\n\r\nvoid Eng_DriverEntry1 (track_status *ptk_stat)//L8004755C()\r\n{\r\n    //printf(\"Eng_DriverEntry1\\n\");\r\n}\r\n\r\nvoid Eng_DriverEntry2 (track_status *ptk_stat)//L80047564()\r\n{\r\n    //printf(\"Eng_DriverEntry2\\n\");\r\n}\r\n\r\nvoid Eng_DriverEntry3 (track_status *ptk_stat)//L8004756C()\r\n{\r\n    //printf(\"Eng_DriverEntry3\\n\");\r\n}\r\n\r\nextern sequence_status\t\t\t*eng_seq_stat_1;\t\t//L8007F02C\r\nextern char\t\t\t\t\t    *eng_ptrk_indxs1;\t\t//L8007F030\r\nextern unsigned long\t\t\teng_max_trks_perseq1;\t//L8007F034\r\n\r\nvoid Eng_TrkOff (track_status *ptk_stat)//L80047574()\r\n{\r\n\tsequence_status\t\t\t*seq_stat;\r\n\t//printf(\"Eng_TrkOff\\n\");\r\n\r\n\tseq_stat = (eng_pmsbase->pseqstattbl + ptk_stat->seq_owner);\r\n\teng_seq_stat_1 = seq_stat;\r\n\r\n\tif ((ptk_stat->flags & TRK_STOPPED) == 0)\r\n\t{\r\n\t\tptk_stat->flags |= TRK_STOPPED;\r\n\r\n\t\tseq_stat->tracks_playing--;\r\n\t\tif (seq_stat->tracks_playing == 0)\r\n\t\t{\r\n\t\t\teng_seq_stat_1->playmode = 0;\r\n\t\t}\r\n\t}\r\n\r\n\tif ((ptk_stat->flags & TRK_HANDLED) == 0)\r\n\t{\r\n\t\teng_max_trks_perseq1 = eng_pmsbase->max_trks_perseq;\r\n\t\teng_ptrk_indxs1 = eng_seq_stat_1->ptrk_indxs;\r\n\r\n\t\twhile (eng_max_trks_perseq1--)\r\n\t\t{\r\n\t\t\tif (*eng_ptrk_indxs1 == ptk_stat->refindx)\r\n\t\t\t{\r\n\t\t\t\t*eng_ptrk_indxs1 = 0xFF;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\teng_ptrk_indxs1++;\r\n\t\t}\r\n\r\n\t\tptk_stat->flags &= ~TRK_ACTIVE;\r\n\r\n\t\teng_pmsbase->trks_active--;\r\n\t\teng_seq_stat_1->tracks_active--;\r\n\r\n\t\tif (eng_seq_stat_1->tracks_active == 0)\r\n\t\t{\r\n\t\t\teng_seq_stat_1->flags &= ~SEQ_ACTIVE;\r\n\t\t\teng_pmsbase->seqs_active--;\r\n\t\t}\r\n\t}\r\n\r\n\tptk_stat->flags &= ~TRK_TIMED;\r\n}\r\n\r\nvoid Eng_TrkMute (track_status *ptk_stat)//L80047720()\r\n{\r\n    //printf(\"Eng_TrkMute\\n\");\r\n}\r\n\r\nextern unsigned char\t\t\teng_patchnum;\t\t\t//L8007F038\r\n\r\nvoid Eng_PatchChg (track_status *ptk_stat)//L80047728()\r\n{\r\n    //printf(\"Eng_PatchChg\\n\");\r\n\teng_patchnum = *(ptk_stat->ppos + 1);\r\n\tptk_stat->patchnum = eng_patchnum;\r\n}\r\n\r\n\r\nvoid Eng_PatchMod (track_status *ptk_stat)//L80047750()\r\n{\r\n    //printf(\"Eng_PatchMod\\n\");\r\n}\r\n\r\nextern short\t\t\t        eng_pitch_cntrl;\t\t//L8007F03C\r\n\r\nvoid Eng_PitchMod (track_status *ptk_stat)//L80047758()\r\n{\r\n    //printf(\"Eng_PitchMod\\n\");\r\n\teng_pitch_cntrl = (*(ptk_stat->ppos + 1) | (*(ptk_stat->ppos + 2) << 8));\r\n\tptk_stat->pitch_cntrl = eng_pitch_cntrl;\r\n}\r\n\r\nvoid Eng_ZeroMod (track_status *ptk_stat)//L80047780()\r\n{\r\n    //printf(\"Eng_ZeroMod\\n\");\r\n}\r\n\r\nvoid Eng_ModuMod (track_status *ptk_stat)//L80047788()\r\n{\r\n    //printf(\"Eng_ModuMod\\n\");\r\n}\r\n\r\nextern unsigned char\t\t\teng_volume_cntrl;\t\t//L8007F040\r\n\r\nvoid Eng_VolumeMod (track_status *ptk_stat)//L80047790()\r\n{\r\n    //printf(\"Eng_VolumeMod\\n\");\r\n\teng_volume_cntrl = *(ptk_stat->ppos + 1);\r\n\tptk_stat->volume_cntrl = eng_volume_cntrl;\r\n}\r\n\r\nextern unsigned char\t\t\teng_pan_cntrl;\t\t\t//L8007F044\r\n\r\nvoid Eng_PanMod (track_status *ptk_stat)//L800477B0()\r\n{\r\n    //printf(\"Eng_PanMod\\n\");\r\n\teng_pan_cntrl = *(ptk_stat->ppos + 1);\r\n\tptk_stat->pan_cntrl = eng_pan_cntrl;\r\n}\r\n\r\nvoid Eng_PedalMod (track_status *ptk_stat)//L800477D0()\r\n{\r\n    //printf(\"Eng_PedalMod\\n\");\r\n}\r\n\r\nvoid Eng_ReverbMod (track_status *ptk_stat)//L800477D8()\r\n{\r\n    //printf(\"Eng_ReverbMod\\n\");\r\n}\r\n\r\nvoid Eng_ChorusMod (track_status *ptk_stat)//L800477E0()\r\n{\r\n    //printf(\"Eng_ChorusMod\\n\");\r\n}\r\n\r\nvoid Eng_NoteOn (track_status *ptk_stat)//L800477E8()\r\n{\r\n    //printf(\"Eng_NoteOn\\n\");\r\n}\r\n\r\nvoid Eng_NoteOff (track_status *ptk_stat)//L800477F0()\r\n{\r\n    //printf(\"Eng_NoteOff\\n\");\r\n}\r\n\r\nextern unsigned char\t\t\teng_callback_areas;\t//L8007F048\r\nextern unsigned char\t\t\teng_callbacks_active;//L8007F04C\r\nextern callback_status\t\t\t*eng_pcalltable;\t//L8007F050\r\n\r\nvoid Eng_StatusMark (track_status *ptk_stat)//L800477F8()\r\n{\r\n\tcallback_status *cbs;\r\n\t//printf(\"Eng_StatusMark\\n\");\r\n\r\n\teng_callbacks_active = eng_pmsbase->callbacks_active;\r\n\r\n\tif (eng_callbacks_active)\r\n\t{\r\n\t\teng_pcalltable = eng_pmsbase->pcalltable;\r\n\r\n\t\teng_callback_areas = eng_pmsbase->pmod_info->mod_hdr.callback_areas;\r\n\r\n\t\twhile (eng_callback_areas--)\r\n\t\t{\r\n\t\t\tcbs = eng_pcalltable;\r\n\t\t\tif (cbs->active)\r\n\t\t\t{\r\n\t\t\t\tif (cbs->type == *(ptk_stat->ppos + 1))\r\n\t\t\t\t{\r\n\t\t\t\t\tcbs->curval = (unsigned short)(*(ptk_stat->ppos + 2) | (*(ptk_stat->ppos + 3) << 8));\r\n\t\t\t\t\tcbs->callfunc(cbs->type, cbs->curval);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(!--eng_callbacks_active) break;\r\n\t\t\t}\r\n\r\n\t\t\teng_pcalltable++;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nextern short\t\t\t    eng_labelnum;\t//L8007F054\r\nextern char\t\t\t\t\t*eng_plabellist;//L8007F058\r\nextern char\t\t\t\t\t*eng_pgates;\t//L8007F05C\r\n\r\nvoid Eng_GateJump (track_status *ptk_stat)//L80047914()\r\n{\r\n    //printf(\"Eng_GateJump\\n\");\r\n\teng_pgates = (eng_pssbase + ptk_stat->seq_owner)->pgates + *(ptk_stat->ppos + 1);\r\n\r\n\tif (*eng_pgates != 0)\r\n\t{\r\n\t\tif (*eng_pgates == 0xFF)\r\n\t\t{\r\n\t\t\t*eng_pgates = *(ptk_stat->ppos + 2);\r\n\t\t}\r\n\r\n\t\teng_labelnum = (*(ptk_stat->ppos + 3) | (*(ptk_stat->ppos + 4) << 8));\r\n\r\n\t\tif ((eng_labelnum >= 0) && (eng_labelnum < ptk_stat->labellist_count))\r\n\t\t{\r\n            eng_plabellist = ptk_stat->pstart + *(ptk_stat->plabellist + eng_labelnum);\r\n            ptk_stat->ppos = eng_plabellist;\r\n\t\t}\r\n\t}\r\n\tptk_stat->flags |= TRK_SKIP;\r\n}\r\n\r\nextern char\t\t\t\t\t    *eng_piters;\t//L8007F068\r\nextern short\t\t\t        eng_labelnum2;\t//L8007F060\r\nextern char\t\t\t\t\t    *eng_plabellist2;//L8007F064\r\n\r\nvoid Eng_IterJump (track_status *ptk_stat)//L80047A00()\r\n{\r\n    //printf(\"Eng_IterJump\\n\");\r\n\teng_piters = (eng_pssbase + ptk_stat->seq_owner)->piters + *(ptk_stat->ppos + 1);\r\n\r\n\tif (*eng_piters != 0)\r\n\t{\r\n\t\tif (*eng_piters == 0xFF)\r\n\t\t{\r\n\t\t\t*eng_piters = *(ptk_stat->ppos + 2);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t*eng_piters = *eng_piters + 0xFF;\r\n\t\t}\r\n\r\n\t\teng_labelnum2 = (*(ptk_stat->ppos + 3) | (*(ptk_stat->ppos + 4) << 8));\r\n\r\n\t\tif (eng_labelnum2 >= 0)\r\n\t\t{\r\n\t\t\tif (eng_labelnum2 < ptk_stat->labellist_count)\r\n\t\t\t{\r\n\t\t\t\teng_plabellist2 = ptk_stat->pstart + *(ptk_stat->plabellist + eng_labelnum2);\r\n\t\t\t\tptk_stat->ppos = eng_plabellist2;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tptk_stat->flags |= TRK_SKIP;\r\n}\r\n\r\nextern unsigned char\t\t\teng_gates_per_seq;\t//L8007F06C\r\nextern char\t\t\t\t\t    *eng_pgates2;\t\t//L8007F070\r\n\r\nvoid Eng_ResetGates (track_status *ptk_stat)//L80047AFC()\r\n{\r\n    //printf(\"Eng_ResetGates\\n\");\r\n\tif (*(ptk_stat->ppos + 1) == 0xFF)\r\n\t{\r\n\t\teng_gates_per_seq = eng_pmsbase->pmod_info->mod_hdr.gates_per_seq;\r\n\t\teng_pgates2 = (eng_pssbase + ptk_stat->seq_owner)->pgates;\r\n\r\n        while (eng_gates_per_seq--)\r\n        {\r\n            *eng_pgates2++ = 0xFF;\r\n        }\r\n\t}\r\n    else\r\n    {\r\n        eng_pgates2 = (eng_pssbase + ptk_stat->seq_owner)->pgates + *(ptk_stat->ppos + 1);\r\n        *eng_pgates2 = 0xFF;\r\n    }\r\n}\r\n\r\nextern unsigned char\t\t\teng_iters_per_seq;\t//L8007F074\r\nextern char\t\t\t\t\t    *eng_piters2;\t\t//L8007F078\r\n\r\nvoid Eng_ResetIters (track_status *ptk_stat)//L80047C00()\r\n{\r\n    //printf(\"Eng_ResetIters\\n\");\r\n\tif (*(ptk_stat->ppos + 1) == 0xff)\r\n\t{\r\n\t\teng_iters_per_seq = eng_pmsbase->pmod_info->mod_hdr.iters_per_seq;\r\n\t\teng_piters2 = (eng_pssbase + ptk_stat->seq_owner)->piters;\r\n\r\n        while (eng_iters_per_seq--)\r\n        {\r\n            *eng_piters2++ = 0xff;\r\n        }\r\n\t}\r\n    else\r\n    {\r\n        eng_piters2 = (eng_pssbase + ptk_stat->seq_owner)->piters + *(ptk_stat->ppos + 1);\r\n        *eng_piters2 = 0xff;\r\n    }\r\n}\r\n\r\nextern char\t\t\t\t\t*eng_piters3;\t\t//L8007F07C\r\n\r\nvoid Eng_WriteIterBox (track_status *ptk_stat)//L80047D04()\r\n{\r\n    //printf(\"Eng_WriteIterBox\\n\");\r\n\teng_piters3 = (eng_pssbase + ptk_stat->seq_owner)->piters + *(ptk_stat->ppos + 1);\r\n\t*eng_piters3 = *(ptk_stat->ppos + 2);\r\n}\r\n\r\nextern unsigned short\t\t\teng_tracks;\t\t\t\t//L8007F080\r\nextern unsigned char\t\t\teng_tracks_active2;\t\t//L8007F084\r\nextern unsigned char\t\t\t*eng_ptrk_indxs2;\t\t//L8007F088\r\nextern track_status\t\t\t    *eng_ptrk_stat_1;\t\t//L8007F08C\r\nextern sequence_status\t\t\t*eng_seq_stat_2;\t\t//L8007F090\r\n\r\nvoid Eng_SeqTempo (track_status *ptk_stat)//L80047D48()\r\n{\r\n\t//printf(\"Eng_SeqTempo\\n\");\r\n\r\n\teng_seq_stat_2 = (eng_pssbase + ptk_stat->seq_owner);\r\n\teng_ptrk_indxs2 = eng_seq_stat_2->ptrk_indxs;\r\n\teng_tracks_active2 = eng_seq_stat_2->tracks_active;\r\n\teng_tracks = (eng_pmsbase->pmod_info->pseq_info+eng_seq_stat_2->seq_num)->seq_hdr.tracks;\r\n\r\n    while (eng_tracks--)\r\n\t{\r\n\t\tif (*eng_ptrk_indxs2 != 0xFF)\r\n\t\t{\r\n\t\t\teng_ptrk_stat_1 = (eng_ptsbase+(*eng_ptrk_indxs2));\r\n\r\n\t\t\teng_ptrk_stat_1->qpm = (unsigned short)(*(ptk_stat->ppos + 1) | (*(ptk_stat->ppos + 2) << 8));\r\n\t\t\teng_ptrk_stat_1->ppi = CalcPartsPerInt(GetIntsPerSec(), eng_ptrk_stat_1->ppq, eng_ptrk_stat_1->qpm);\r\n\r\n\t\t\tif (!--eng_tracks_active2) break;\r\n\t\t}\r\n\t\teng_ptrk_indxs2++;\r\n\t}\r\n}\r\n\r\n\r\nextern short\t\t\t        eng_labelnum3;\t\t\t//L8007F094\r\nextern unsigned short\t\t\teng_tracks2;\t\t\t//L8007F098\r\nextern char\t\t\t\t\t    *eng_plabellist3;\t\t//L8007F09C\r\nextern unsigned char\t\t\teng_tracks_active3;\t\t//L8007F0A0\r\nextern unsigned char\t\t\t*eng_ptrk_indxs3;\t\t//L8007F0A4\r\nextern track_status\t\t\t    *eng_ptrk_stat_2;\t\t//L8007F0A8\r\nextern sequence_status\t\t\t*eng_seq_stat_3;\t\t//L8007F0AC\r\n\r\nvoid Eng_SeqGosub (track_status *ptk_stat)//L80047EC8()\r\n{\r\n\t//printf(\"Eng_SeqGosub\\n\");\r\n\r\n\teng_labelnum3 = (*(ptk_stat->ppos + 1) | (*(ptk_stat->ppos + 2) << 8));\r\n\r\n\tif ((eng_labelnum3 >= 0) && (eng_labelnum3 < ptk_stat->labellist_count))\r\n\t{\r\n\t\teng_seq_stat_3 = (eng_pssbase + ptk_stat->seq_owner);\r\n\t\teng_ptrk_indxs3 = eng_seq_stat_3->ptrk_indxs;\r\n\t\teng_tracks_active3 = eng_seq_stat_3->tracks_active;\r\n\t\teng_tracks2 = (eng_pmsbase->pmod_info->pseq_info + eng_seq_stat_3->seq_num)->seq_hdr.tracks;\r\n\r\n\t\twhile (eng_tracks2--)\r\n\t\t{\r\n\t\t\tif (*eng_ptrk_indxs3 != 0xFF)\r\n\t\t\t{\r\n\t\t\t\teng_ptrk_stat_2 = (eng_ptsbase + (*eng_ptrk_indxs3));\r\n\r\n\t\t\t\t*eng_ptrk_stat_2->psp = (eng_ptrk_stat_2->ppos + skip_table[26]);\r\n\t\t\t\teng_ptrk_stat_2->psp++;\r\n\t\t\t\teng_plabellist3 = eng_ptrk_stat_2->pstart + *(eng_ptrk_stat_2->plabellist + eng_labelnum3);\r\n\t\t\t\teng_ptrk_stat_2->ppos = eng_plabellist3;\r\n\r\n\t\t\t\tif (!--eng_tracks_active3) break;\r\n\t\t\t}\r\n\t\t\teng_ptrk_indxs3++;\r\n\t\t}\r\n\t}\r\n\tptk_stat->flags |= TRK_SKIP;\r\n}\r\n\r\nextern short\t\t\t        eng_labelnum4;\t\t\t//L8007F0B0\r\nextern unsigned short\t\t\teng_tracks3;\t\t\t//L8007F0B4\r\nextern char\t\t\t\t\t    *eng_plabellist4;\t\t//L8007F0B8\r\nextern unsigned char\t\t\teng_tracks_active4;\t\t//L8007F0BC\r\nextern unsigned char\t\t\t*eng_ptrk_indxs4;\t\t//L8007F0C0\r\nextern track_status\t\t\t    *eng_ptrk_stat_3;\t\t//L8007F0C4\r\nextern sequence_status\t\t\t*eng_seq_stat_4;\t\t//L8007F0C8\r\n\r\nvoid Eng_SeqJump (track_status *ptk_stat)//L800480A4()\r\n{\r\n\t//printf(\"Eng_SeqJump\\n\");\r\n\r\n\teng_labelnum4 = (*(ptk_stat->ppos + 1) | (*(ptk_stat->ppos + 2) << 8));\r\n\r\n\tif ((eng_labelnum4 >= 0) && (eng_labelnum4 < ptk_stat->labellist_count))\r\n\t{\r\n\t\teng_seq_stat_4 = (eng_pssbase + ptk_stat->seq_owner);\r\n\t\teng_ptrk_indxs4 = eng_seq_stat_4->ptrk_indxs;\r\n\t\teng_tracks_active4 = eng_seq_stat_4->tracks_active;\r\n\t\teng_tracks3 = (eng_pmsbase->pmod_info->pseq_info + eng_seq_stat_4->seq_num)->seq_hdr.tracks;\r\n\r\n\t\twhile (eng_tracks3--)\r\n\t\t{\r\n\t\t\tif (*eng_ptrk_indxs4 != 0xFF)\r\n\t\t\t{\r\n\t\t\t\teng_ptrk_stat_3 = (eng_ptsbase + (*eng_ptrk_indxs4));\r\n\t\t\t\teng_plabellist4 = eng_ptrk_stat_3->pstart + *(eng_ptrk_stat_3->plabellist + eng_labelnum4);\r\n\t\t\t\teng_ptrk_stat_3->ppos = eng_plabellist4;\r\n\r\n\t\t\t\tif (!--eng_tracks_active4) break;\r\n\t\t\t}\r\n\t\t\teng_ptrk_indxs4++;\r\n\t\t}\r\n\t}\r\n\tptk_stat->flags |= TRK_SKIP;\r\n}\r\n\r\nextern unsigned short\t\t\teng_tracks4;\t\t\t//L8007F0CC\r\nextern unsigned char\t\t\teng_tracks_active5;\t\t//L8007F0D0\r\nextern unsigned char\t\t\t*eng_ptrk_indxs5;\t\t//L8007F0D4\r\nextern track_status\t\t\t    *eng_ptrk_stat_4;\t\t//L8007F0D8\r\nextern sequence_status\t\t\t*eng_seq_stat_5;\t\t//L8007F0DC\r\n\r\nvoid Eng_SeqRet (track_status *ptk_stat)//L8004824C()\r\n{\r\n\t//printf(\"Eng_SeqRet\\n\");\r\n\r\n\teng_seq_stat_5 = (eng_pssbase + ptk_stat->seq_owner);\r\n\teng_ptrk_indxs5 = eng_seq_stat_5->ptrk_indxs;\r\n\teng_tracks_active5 = eng_seq_stat_5->tracks_active;\r\n\teng_tracks4 = (eng_pmsbase->pmod_info->pseq_info + eng_seq_stat_5->seq_num)->seq_hdr.tracks;\r\n\r\n\twhile (eng_tracks4--)\r\n\t{\r\n\t\tif (*eng_ptrk_indxs5 != 0xFF)\r\n\t\t{\r\n\t\t\teng_ptrk_stat_4 = (eng_ptsbase + (*eng_ptrk_indxs5));\r\n\t\t\teng_ptrk_stat_4->psp--;\r\n\t\t\teng_ptrk_stat_4->ppos = *eng_ptrk_stat_4->psp;\r\n\r\n\t\t\tif (!--eng_tracks_active5) break;\r\n\t\t}\r\n\t\teng_ptrk_indxs5++;\r\n\t}\r\n\r\n\tptk_stat->flags |= TRK_SKIP;\r\n}\r\n\r\nextern sequence_status\t\t\t*eng_seq_stat_6;\t\t//L8007F0E0\r\nextern track_status\t\t\t    *eng_ptrk_stat_5;\t\t//L8007F0E4\r\nextern unsigned char\t\t\t*eng_ptrk_indxs6;\t\t//L8007F0E8\r\nextern unsigned char\t\t\teng_tracks_active6;\t\t//L8007F0EC\r\nextern unsigned long\t\t\teng_max_trks_perseq;\t//L8007F0F0\r\n\r\nvoid Eng_SeqEnd (track_status *ptk_stat)//L8004839C()\r\n{\r\n\t//printf(\"Eng_SeqEnd\\n\");\r\n\r\n\tif (!(ptk_stat->flags & TRK_HANDLED))\r\n\t{\r\n\t\teng_seq_stat_6 = (eng_pmsbase->pseqstattbl + ptk_stat->seq_owner);\r\n\t\teng_ptrk_indxs6 = eng_seq_stat_6->ptrk_indxs;\r\n\t\teng_tracks_active6 = eng_seq_stat_6->tracks_active;\r\n\t\teng_max_trks_perseq = *(char *)&eng_pmsbase->max_trks_perseq;//char??\r\n\r\n\t\twhile (eng_max_trks_perseq--)\r\n\t\t{\r\n\t\t\tif (*eng_ptrk_indxs6 != 0xFF)\r\n\t\t\t{\r\n\t\t\t\teng_ptrk_stat_5 = (eng_ptsbase + *eng_ptrk_indxs6);\r\n\t\t\t\tCmdFuncArr[eng_ptrk_stat_5->patchtype][TrkOff]((track_status *)eng_ptrk_stat_5);\r\n\r\n\t\t\t\tif (!--eng_tracks_active6) break;\r\n\t\t\t}\r\n\r\n\t\t\teng_ptrk_indxs6++;\r\n\t\t}\r\n\t}\r\n\telse\r\n\t{\r\n\t\teng_seq_stat_6 = (eng_pmsbase->pseqstattbl + ptk_stat->seq_owner);\r\n\t\teng_ptrk_indxs6 = eng_seq_stat_6->ptrk_indxs;\r\n\t\teng_tracks_active6 = eng_seq_stat_6->tracks_active;\r\n\t\teng_max_trks_perseq = *(char *)&eng_pmsbase->max_trks_perseq;//char??\r\n\r\n\t\twhile (eng_max_trks_perseq--)\r\n\t\t{\r\n\t\t\tif (*eng_ptrk_indxs6 != 0xFF)\r\n\t\t\t{\r\n\t\t\t\teng_ptrk_stat_5 = (eng_ptsbase + (*eng_ptrk_indxs6));\r\n\t\t\t\tCmdFuncArr[eng_ptrk_stat_5->patchtype][TrkOff]((track_status *)eng_ptrk_stat_5);\r\n\r\n\t\t\t\tif (!--eng_tracks_active6) break;\r\n\t\t\t}\r\n\r\n\t\t\teng_ptrk_indxs6++;\r\n\t\t}\r\n\r\n\t\tptk_stat->flags |= TRK_SKIP;\r\n\t}\r\n}\r\n\r\nvoid Eng_TrkTempo (track_status *ptk_stat)//L80048644()\r\n{\r\n    //printf(\"Eng_TrkTempo\\n\");\r\n\tptk_stat->qpm = *(ptk_stat->ppos + 1) | (*(ptk_stat->ppos + 2) << 8);\r\n\tptk_stat->ppi = CalcPartsPerInt(GetIntsPerSec(), ptk_stat->ppq, ptk_stat->qpm);\r\n}\r\n\r\nvoid Eng_TrkGosub (track_status *ptk_stat)//L800486A0()\r\n{\r\n\tunsigned int position;\r\n\t//printf(\"Eng_TrkGosub\\n\");\r\n\r\n\tposition = (unsigned int)(*(ptk_stat->ppos + 1) | (*(ptk_stat->ppos + 2) << 8));\r\n\tif ((position >= 0) && (position < ptk_stat->labellist_count))\r\n\t{\r\n\t\t*ptk_stat->psp = (ptk_stat->ppos + skip_table[26]);\r\n\t\tptk_stat->psp++;\r\n\t\tptk_stat->ppos = ptk_stat->pstart + *(ptk_stat->plabellist + position);\r\n\t\tptk_stat->flags |= TRK_SKIP;\r\n\t}\r\n}\r\n\r\nvoid Eng_TrkJump (track_status *ptk_stat)//L80048734()\r\n{\r\n\tunsigned int position;\r\n\r\n\t//printf(\"Eng_Jump\\n\");\r\n\tposition = (unsigned int)(*(ptk_stat->ppos + 1) | (*(ptk_stat->ppos + 2) << 8));\r\n\r\n\tif ((position >= 0) && (position < ptk_stat->labellist_count))\r\n\t{\r\n\t\tptk_stat->ppos = ptk_stat->pstart + *(ptk_stat->plabellist + position);\r\n\t\tptk_stat->deltatime = 0;\r\n\t\tptk_stat->flags |= TRK_SKIP;\r\n\t}\r\n}\r\n\r\nvoid Eng_TrkRet (track_status *ptk_stat)//L800487A4()\r\n{\r\n    //printf(\"Eng_TrkRet\\n\");\r\n\tptk_stat->psp--;\r\n\tptk_stat->ppos = *ptk_stat->psp;\r\n\tptk_stat->ppos = Read_Vlq(ptk_stat->ppos, &ptk_stat->deltatime);\r\n\tptk_stat->flags |= TRK_SKIP;\r\n}\r\n\r\nvoid Eng_TrkEnd (track_status *ptk_stat)//L800487F8()\r\n{\r\n\t//printf(\"Eng_TrkEnd\\n\");\r\n\tif (!(ptk_stat->flags & TRK_HANDLED))\r\n    {\r\n        if (!(ptk_stat->flags & TRK_LOOPED) || (ptk_stat->totppi < 16))\r\n        {\r\n            CmdFuncArr[ptk_stat->patchtype][TrkOff](ptk_stat);\r\n            return;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        if (!(ptk_stat->flags & TRK_LOOPED) || (ptk_stat->totppi < 16))\r\n        {\r\n            CmdFuncArr[ptk_stat->patchtype][TrkOff](ptk_stat);\r\n            ptk_stat->flags |= TRK_SKIP;\r\n            return;\r\n        }\r\n    }\r\n\r\n    ptk_stat->flags |= TRK_SKIP;\r\n    ptk_stat->ppos = ptk_stat->pstart;\r\n    ptk_stat->ppos = Read_Vlq(ptk_stat->pstart, &ptk_stat->deltatime);\r\n}\r\n\r\nvoid Eng_NullEvent (track_status *ptk_stat)//L800488FC()\r\n{\r\n    //printf(\"Eng_NullEvent\\n\");\r\n}\r\n\r\nextern track_status *eng_tmp_ptrkstattbl;      //L8007F0F4\r\nextern unsigned int eng_tmp_trks_active;       //L8007F0F8\r\nextern unsigned int eng_tmp_trk_work_areas;    //L8007F0FC\r\nextern char         *eng_tmp_ppos;             //L8007F100\r\n\r\nvoid SeqEngine(void)//L80048904()\r\n{\r\n    track_status *ptrkstattbl;\r\n\r\n    eng_tmp_trks_active = eng_pmsbase->trks_active;\r\n    if(eng_tmp_trks_active)\r\n    {\r\n        //printf(\"eng_tmp_trks_active %d\\n\",eng_tmp_trks_active);\r\n        eng_tmp_ptrkstattbl = eng_ptsbase;\r\n        eng_tmp_trk_work_areas = eng_ntwa;\r\n\r\n        while(eng_tmp_trk_work_areas--)\r\n        {\r\n            ptrkstattbl = eng_tmp_ptrkstattbl;\r\n            if((ptrkstattbl->flags & TRK_ACTIVE))\r\n            {\r\n                if(!(ptrkstattbl->flags & TRK_STOPPED))\r\n                {\r\n\r\n                    ptrkstattbl->starppi += (ptrkstattbl->ppi);\r\n                    ptrkstattbl->totppi += (ptrkstattbl->starppi >> 0x10);\r\n                    ptrkstattbl->accppi += (ptrkstattbl->starppi >> 0x10);\r\n                    ptrkstattbl->starppi &= 65535;\r\n                    //printf(\"ptrkstattbl->starppi %d\\n\",ptrkstattbl->starppi);\r\n                    //printf(\"ptrkstattbl->totppi %d\\n\",ptrkstattbl->totppi);\r\n                    //printf(\"ptrkstattbl->accppi %d\\n\",ptrkstattbl->accppi);\r\n\r\n                    if(!(ptrkstattbl->flags & TRK_TIMED) || (ptrkstattbl->totppi < ptrkstattbl->endppi))\r\n                    {\r\n                        while(eng_tmp_ptrkstattbl->deltatime <= eng_tmp_ptrkstattbl->accppi &&\r\n                            ((eng_tmp_ptrkstattbl->flags & (TRK_STOPPED|TRK_ACTIVE)) == TRK_ACTIVE))\r\n                        {\r\n                            ptrkstattbl->accppi -= ptrkstattbl->deltatime;\r\n                            eng_tmp_ppos =  (ptrkstattbl->ppos);\r\n\r\n                            if (!(*eng_tmp_ppos < 7) && (*eng_tmp_ppos < 19))\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tCmdFuncArr[ptrkstattbl->patchtype][*eng_tmp_ppos]((track_status *)ptrkstattbl);\r\n\r\n\t\t\t\t\t\t\t\t\tptrkstattbl->ppos += skip_table[*eng_tmp_ppos];\r\n\t\t\t\t\t\t\t\t\tptrkstattbl->ppos = Read_Vlq(ptrkstattbl->ppos, &ptrkstattbl->deltatime);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse if(!(*eng_tmp_ppos < 19) && (*eng_tmp_ppos < 36))\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tDrvFunctions[*eng_tmp_ppos]((track_status *)ptrkstattbl);\r\n\r\n                                if ((ptrkstattbl->flags & (TRK_ACTIVE|TRK_SKIP)) == TRK_ACTIVE)\r\n                                {\r\n                                    ptrkstattbl->ppos += skip_table[*eng_tmp_ppos];\r\n                                    ptrkstattbl->ppos = Read_Vlq(ptrkstattbl->ppos, &ptrkstattbl->deltatime);\r\n                                }\r\n                                else\r\n                                {\r\n                                    ptrkstattbl->flags &= ~TRK_SKIP;\r\n                                }\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tEng_SeqEnd((track_status *)ptrkstattbl);\r\n\t\t\t\t\t\t\t}\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                            CmdFuncArr[ptrkstattbl->patchtype][5]((track_status *)ptrkstattbl);\r\n                    }\r\n                }\r\n\r\n                if(!--eng_tmp_trks_active) break;\r\n            }\r\n\r\n            eng_tmp_ptrkstattbl++;\r\n        }\r\n    }\r\n    CmdFuncArr[eng_ptsbase->patchtype][2]((track_status *)eng_ptsbase);\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/WESSSEQ.H",
    "content": "#ifndef _WESSSEQ_H\r\n#define _WESSSEQ_H\r\n\r\n#include <libspu.h>\r\n#include \"wessapi.h\"\r\n#include \"wessarc.h\"\r\n\r\nextern unsigned char\tmaster_sfx_volume;\r\nextern unsigned char\tmaster_mus_volume;\r\nextern unsigned char\tpan_status;\r\nextern unsigned char\trelease_rate;\r\n\r\nextern char *Read_Vlq(char *pstart, void *deltatime);\r\nextern char *Write_Vlq(char *dest, unsigned int deltatime);\r\nextern int Len_Vlq(unsigned int deltatime);\r\n\r\nextern volatile int SeqOn;\r\nextern void(*drv_cmds[19])();\r\n\r\nextern void add_music_mute_note(unsigned short seq_num, unsigned char track, unsigned char keynum, unsigned char velnum, patchmaps_header *patchmap, patchinfo_header *patchinfo);\r\n\r\nextern void Dvr_NoteSetHandle(voice_status *pvoices_stat);\r\nextern void Dvr_NoteOn(track_status *ptk_stat,\r\n\t           patchmaps_header *patchmap, patchinfo_header *patchinfo,\r\n\t           unsigned char keynum, unsigned char velnum);\r\nextern void Eng_TrkOff();\r\n\r\nextern void(*DrvFunctions[36])();\r\nextern void SeqEngine(void);\r\n\r\n#endif // _WESSSEQ_H\r\n"
  },
  {
    "path": "PSXDOOM/am_main.c",
    "content": "/* am_main.c -- automap */\r\n\r\n#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n\r\n#define STEPVALUE   0x800000\r\n\r\n#define COLOR_RED     0xA40000\r\n#define COLOR_GREEN   0x00C000\r\n#define COLOR_BROWN   0x8A5C30\r\n#define COLOR_YELLOW  0xCCCC00\r\n#define COLOR_GREY    0x808080\r\n#define COLOR_AQUA    0x0080FF\r\n\r\n#define MAXSCALE\t64\r\n#define MINSCALE\t8\r\n\r\n//automap bounding box of level\r\nfixed_t am_maxleft;     //iGp00000c94\r\nfixed_t am_maxright;    //iGp00000ca4\r\nfixed_t am_maxtop;      //iGp00000cac\r\nfixed_t am_maxbottom;   //iGp00000ca0\r\n\r\nvoid AM_DrawLine(int color, int x1, int y1, int x2, int y2);\r\n\r\n\r\n/*================================================================= */\r\n/* */\r\n/* Start up Automap */\r\n/* */\r\n/*================================================================= */\r\nvoid AM_Start(void)//L8003B83C()\r\n{\r\n    am_maxleft = bmaporgx;\r\n    am_maxbottom = bmaporgy;\r\n    am_maxright = (bmapwidth << 23) + bmaporgx;\r\n    am_maxtop = (bmapheight << 23) + bmaporgy;\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= AM_Control\r\n=\r\n= Called by P_PlayerThink before any other player processing\r\n=\r\n= Button bits can be eaten by clearing them in ticbuttons[playernum]\r\n==================\r\n*/\r\n\r\nvoid AM_Control (player_t *player)//L8003B884()\r\n{\r\n\tint buttons, oldbuttons, step;\r\n\r\n\tif (gamepaused)\r\n        return;\r\n\r\n    buttons = ticbuttons[playernum];\r\n    oldbuttons = oldticbuttons[playernum];\r\n\r\n    if ((buttons & PAD_SELECT) && !(oldbuttons & PAD_SELECT))\r\n    {\r\n        player->automapflags ^= AF_ACTIVE;\r\n        player->automapx = player->mo->x;\r\n        player->automapy = player->mo->y;\r\n    }\r\n\r\n    if(!(player->automapflags & AF_ACTIVE))\r\n        return;\r\n\r\n    if (player->playerstate != PST_LIVE)\r\n        return;\r\n\r\n    if (!(buttons & PAD_CROSS))\r\n    {\r\n        player->automapflags &= ~AF_FOLLOW;\r\n        return;\r\n    }\r\n\r\n    if (!(player->automapflags & AF_FOLLOW))\r\n    {\r\n        player->automapflags |= AF_FOLLOW;\r\n        player->automapx = player->mo->x;\r\n        player->automapy = player->mo->y;\r\n    }\r\n\r\n    step = STEPVALUE;\r\n    if (buttons & PAD_SQUARE)\r\n        step *= 2;\r\n\r\n    if (!(player->automapflags & AF_FOLLOW))\r\n        return;\r\n\r\n\r\n    //\r\n    // check bounding box collision\r\n    //\r\n\r\n    if (buttons & PAD_RIGHT)\r\n    {\r\n        player->automapx += step;\r\n\r\n        if (am_maxright < player->automapx)\r\n            player->automapx = am_maxright;\r\n    }\r\n    else if (buttons & PAD_LEFT)\r\n    {\r\n        player->automapx -= step;\r\n\r\n        if (player->automapx < am_maxleft)\r\n            player->automapx = am_maxleft;\r\n    }\r\n\r\n    if (buttons & PAD_UP)\r\n    {\r\n        player->automapy += step;\r\n\r\n        if (am_maxtop < player->automapy)\r\n            player->automapy = am_maxtop;\r\n    }\r\n    else if (buttons & PAD_DOWN)\r\n    {\r\n        player->automapy -= step;\r\n\r\n        if (player->automapy < am_maxbottom)\r\n            player->automapy = am_maxbottom;\r\n    }\r\n\r\n    if (buttons & PAD_R1)\r\n    {\r\n        player->automapscale -= 2;\r\n\r\n        if (player->automapscale < MINSCALE)\r\n            player->automapscale = MINSCALE;\r\n    }\r\n    else if (buttons & PAD_L1)\r\n    {\r\n        player->automapscale += 2;\r\n\r\n        if (MAXSCALE < player->automapscale)\r\n            player->automapscale = MAXSCALE;\r\n    }\r\n\r\n    ticbuttons[playernum] &= ~(PAD_UP | PAD_DOWN | PAD_LEFT | PAD_RIGHT | PAD_R1 | PAD_L1);\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= AM_Drawer\r\n=\r\n= Draws the current frame to workingscreen\r\n==================\r\n*/\r\n\r\nvoid AM_Drawer (void)//L8003BAB0()\r\n{\r\n    int\t\t\ti;\r\n\tplayer_t\t*p;\r\n\tline_t\t\t*line;\r\n\tmobj_t\t\t*mo;\r\n\tmobj_t\t\t*next;\r\n\tfixed_t\t\tx1, y1;\r\n\tfixed_t\t\tx2, y2;\r\n\tfixed_t\t\tox, oy;\r\n\tfixed_t     c;\r\n    fixed_t     s;\r\n\tfixed_t\t\tnx1, ny1;\r\n\tfixed_t\t\tnx2, ny2;\r\n\tfixed_t\t\tnx3, ny3;\r\n\tangle_t     angle;\r\n\tint\t\t\tcolor;\r\n\tint\t\t\tscale;\r\n\r\n\tDrawRender();\r\n\r\n\tp = &players[consoleplayer];\r\n\r\n\tscale = p->automapscale;\r\n\tif (p->automapflags & AF_FOLLOW)\r\n\t{\r\n\t\tox = p->automapx;\r\n\t\toy = p->automapy;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tox = p->mo->x;\r\n\t\toy = p->mo->y;\r\n\t}\r\n\r\n\tline = lines;\r\n\tfor (i = 0; i < numlines; i++, line++)\r\n\t{\r\n\t\tif ((!(line->flags & ML_MAPPED) || // IF NOT MAPPED OR DON'T DRAW\r\n\t\t\tline->flags & ML_DONTDRAW) &&\r\n\t\t\t(!(p->powers[pw_allmap] + (p->cheats & CF_ALLLINES))))\r\n\t\t\tcontinue;\r\n\r\n        #if FIX_ML_DONTDRAW == 1\r\n        if (p->powers[pw_allmap] && !(p->cheats & CF_ALLLINES) && (line->flags & ML_DONTDRAW))\r\n            continue;\r\n        #endif // FIX_ML_DONTDRAW\r\n\r\n\t\tx1 = (scale * (line->v1->x - ox >> 8)) >> 16;\r\n\t\ty1 = (scale * (line->v1->y - oy >> 8)) >> 16;\r\n\t\tx2 = (scale * (line->v2->x - ox >> 8)) >> 16;\r\n\t\ty2 = (scale * (line->v2->y - oy >> 8)) >> 16;\r\n\r\n\t\t//\r\n\t\t// Figure out color\r\n\t\t//\r\n\t\tcolor = COLOR_BROWN;\r\n\r\n\t\tif ((p->powers[pw_allmap] + (p->cheats & CF_ALLLINES)) && // IF COMPMAP && !MAPPED YET\r\n\t\t\t!(line->flags & ML_MAPPED))\r\n\t\t\tcolor = COLOR_GREY;\r\n\t\telse if (line->flags & ML_SECRET)\r\n\t\t\tcolor = COLOR_RED;\r\n\t\telse if (line->special)\r\n\t\t\tcolor = COLOR_YELLOW;\r\n\t\telse if (!(line->flags & ML_TWOSIDED)) // ONE-SIDED LINE\r\n\t\t\tcolor = COLOR_RED;\r\n\r\n\t\tAM_DrawLine(color, x1, y1, x2, y2);\r\n\t}\r\n\r\n\t// SHOW ALL MAP THINGS (CHEAT)\r\n\tif (p->cheats & CF_ALLTHINGS)\r\n\t{\r\n\t\tfor (mo = mobjhead.next; mo != &mobjhead; mo = next)\r\n\t\t{\r\n\t\t\tnext = mo->next;\r\n\r\n\t\t\tif (mo == p->mo)//Ignore player\r\n                continue;\r\n\r\n            angle = mo->angle;\r\n            x1 = mo->x - ox;\r\n            y1 = mo->y - oy;\r\n\r\n            c = finecosine[angle >> ANGLETOFINESHIFT];\r\n            s = finesine[angle >> ANGLETOFINESHIFT];\r\n            nx1 = scale * ((x1 + (c * 24)) >> 8) >> 16;\r\n            ny1 = scale * ((y1 + (s * 24)) >> 8) >> 16;\r\n\r\n            c = finecosine[((angle - ANG90) - ANG45) >> ANGLETOFINESHIFT];\r\n            s = finesine[((angle - ANG90) - ANG45) >> ANGLETOFINESHIFT];\r\n            nx2 = scale * ((x1 + (c * 24)) >> 8) >> 16;\r\n            ny2 = scale * ((y1 + (s * 24)) >> 8) >> 16;\r\n\r\n            c = finecosine[((angle + ANG90) + ANG45) >> ANGLETOFINESHIFT];\r\n            s = finesine[((angle + ANG90) + ANG45) >> ANGLETOFINESHIFT];\r\n            nx3 = scale * ((x1 + (c * 24)) >> 8) >> 16;\r\n            ny3 = scale * ((y1 + (s * 24)) >> 8) >> 16;\r\n\r\n            AM_DrawLine(COLOR_AQUA, nx1, ny1, nx2, ny2);\r\n            AM_DrawLine(COLOR_AQUA, nx2, ny2, nx3, ny3);\r\n            AM_DrawLine(COLOR_AQUA, nx1, ny1, nx3, ny3);\r\n\t\t}\r\n\t}\r\n\r\n    // SHOW PLAYERS\r\n    for (i = 0; i < MAXPLAYERS; i++)\r\n    {\r\n        if ((i != consoleplayer) && (netgame != gt_coop))\r\n            continue;\r\n\r\n        p = &players[i];\r\n\r\n        if (p->playerstate == PST_LIVE && (gametic & 2))\r\n            continue;\r\n\r\n        color = COLOR_GREEN;\r\n        if ((i == consoleplayer) && (netgame == gt_coop))\r\n            color = COLOR_YELLOW;\r\n\r\n        angle = p->mo->angle;\r\n        x1 = p->mo->x - ox;\r\n        y1 = p->mo->y - oy;\r\n\r\n        c = finecosine[angle >> ANGLETOFINESHIFT];\r\n        s = finesine[angle >> ANGLETOFINESHIFT];\r\n        nx1 = scale * ((x1 + (c * 24)) >> 8) >> 16;\r\n        ny1 = scale * ((y1 + (s * 24)) >> 8) >> 16;\r\n\r\n        c = finecosine[((angle - ANG90) - ANG45) >> ANGLETOFINESHIFT];\r\n        s = finesine[((angle - ANG90) - ANG45) >> ANGLETOFINESHIFT];\r\n        nx2 = scale * ((x1 + (c * 24)) >> 8) >> 16;\r\n        ny2 = scale * ((y1 + (s * 24)) >> 8) >> 16;\r\n\r\n        c = finecosine[((angle + ANG90) + ANG45) >> ANGLETOFINESHIFT];\r\n        s = finesine[((angle + ANG90) + ANG45) >> ANGLETOFINESHIFT];\r\n        nx3 = scale * ((x1 + (c * 24)) >> 8) >> 16;\r\n        ny3 = scale * ((y1 + (s * 24)) >> 8) >> 16;\r\n\r\n        AM_DrawLine(color, nx1, ny1, nx2, ny2);\r\n        AM_DrawLine(color, nx2, ny2, nx3, ny3);\r\n        AM_DrawLine(color, nx1, ny1, nx3, ny3);\r\n    }\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= AM_DrawLine\r\n=\r\n==================\r\n*/\r\n\r\n//From StationDoom By BodbDearg\r\ntypedef enum\n{\n\tINSIDE  = 0,\r\n    LEFT    = 1,\r\n    RIGHT\t= 2,\r\n    BOTTOM\t= 4,\r\n    TOP\t    = 8\n} outflags_t;\r\n\r\n//Update OutCode Flags From StationDoom By BodbDearg\r\nvoid AM_DrawLine(int color, int x1, int y1, int x2, int y2)//L8003C16C()\r\n{\r\n    int outcode1, outcode2;\r\n    LINE_F2 *line = (LINE_F2*) getScratchAddr(128);//1F800200\r\n\r\n    outcode1 = (x1 < -128) ? LEFT : INSIDE;\r\n    if (128 < x1 ) {outcode1 |= RIGHT;}\r\n    if (y1 < -100) {outcode1 |= BOTTOM;}\r\n    if (100 < y1 ) {outcode1 |= TOP;}\r\n\r\n    outcode2 = (x2 < -128) ? LEFT : INSIDE;\r\n    if (128 < x2 ) {outcode2 |= RIGHT;}\r\n    if (y2 < -100) {outcode2 |= BOTTOM;}\r\n    if (100 < y2 ) {outcode2 |= TOP;}\r\n\r\n    if (outcode1 & outcode2)\r\n        return;\r\n\r\n    setLineF2(line);\r\n    setRGB0(line, (color >> 16), (color >> 8), color);\r\n    setXY2(line, (x1 + 128), (100 - y1), (x2 + 128) , (100 - y2));\r\n    W_AddPrim(line);\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/asm/tmp.txt",
    "content": "temp file"
  },
  {
    "path": "PSXDOOM/c_main.c",
    "content": "/* c_main.c -- credits intro */\r\n\r\n#include \"doomdef.h\"\r\n#include \"r_local.h\"\r\n\r\npsxobj_t idcredpic[2];  //80097910, 80097930\r\npsxobj_t wmscredpic[2]; //80097950, 80097970\r\n\r\nint c_vframe1 = 0;\t    //80077AFC iGp000006ec\r\nint c_yscroll;\t\t    //80078080 uGp00000c70\r\nint c_next;\t\t        //80077FCC uGp00000bbc\r\n\r\n/*\r\n=======================\r\n=\r\n= C_Start\r\n=\r\n=======================\r\n*/\r\n\r\nvoid C_Start(void)//L800369D8()\r\n{\r\n\tImageToVram(&idcredpic[0], \"IDCRED1\", 0);\r\n\tImageToVram(&idcredpic[1], \"IDCRED2\", 0);\r\n\tImageToVram(&wmscredpic[0], \"WMSCRED1\", 0);\r\n\tImageToVram(&wmscredpic[1], \"WMSCRED2\", 0);\r\n\r\n\tc_yscroll = 240;//80078080\r\n\tc_next = 0;//80077FCC\r\n\r\n\tpsxcd_play_at_andloop(CD_TRACK[cdmusic_credits_demo],CDVolume,0,0,CD_TRACK[cdmusic_credits_demo],CDVolume,0,0);\r\n\tdo {} while (psxcd_elapsed_sectors() == 0);\r\n}\r\n\r\n/*\r\n=======================\r\n=\r\n= C_Stop\r\n=\r\n=======================\r\n*/\r\n\r\nvoid C_Stop(int exit)//L80036AA0()\r\n{\r\n\tpsxcd_stop();\r\n}\r\n\r\n/*\r\n=======================\r\n=\r\n= C_Ticker\r\n=\r\n=======================\r\n*/\r\n\r\nint C_Ticker(void)//L80036AC0()\r\n{\r\n    int exit;\r\n\r\n    exit = ga_nothing;\r\n\r\n    if (ticbuttons[0])\r\n    {\r\n        exit = ga_exit;\r\n    }\r\n    else\r\n    {\r\n        c_vframe1 -= vblsinframe[0];\r\n        if (c_vframe1 <= 0)\r\n        {\r\n            c_vframe1 = 2;\r\n            c_yscroll--;\r\n            if (c_next == 0)\r\n            {\r\n                if (c_yscroll < -182)\r\n                {\r\n                    c_vframe1 = 2;\r\n                    c_next = 1;\r\n                    c_yscroll = 240;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (c_next != 1)\r\n                    c_vframe1 = 2;\r\n\r\n                if (c_yscroll < -228)\r\n                {\r\n                    c_vframe1 = 2;\r\n                    exit = ga_exitdemo;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return exit;\r\n}\r\n\r\n/*\r\n=======================\r\n=\r\n= C_Draw\r\n=\r\n=======================\r\n*/\r\n\r\nvoid C_Draw(void) //L80036B58()\r\n{\r\n    int xpos;\r\n    psxobj_t *pic;\r\n\r\n    NextTextureCacheIdx();\r\n    if (c_next == 0)\r\n    {\r\n        pic = &idcredpic[1];\r\n        DrawStaticImage(&idcredpic[0],0,0,(int)palette[18]);\r\n        xpos = 9;\r\n    }\r\n    else if (c_next == 1)\r\n    {\r\n        pic = &wmscredpic[1];\r\n        DrawStaticImage(&wmscredpic[0],0,0,(int)palette[19]);\r\n        xpos = 7;\r\n    }\r\n\r\n    DrawStaticImage(pic, xpos, c_yscroll, palette[16]);\r\n    UpdateDrawOTag();\r\n    DrawRender();\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/cf_main.c",
    "content": "/* cf_main.c -- configuration menu */\r\n\r\n#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n#include \"st_main.h\"\r\n#include \"r_local.h\"\r\n\r\nchar fuctionsnames[][16] =//80073B9C\r\n{\r\n\t\"Attack\",\r\n\t\"Use\",\r\n\t\"Strafe On\",\r\n\t\"Speed\",\r\n\t\"Strafe Left\",\r\n\t\"Strafe Right\",\r\n\t\"Weapon Backward\",\r\n\t\"Weapon Forward\"\r\n};\r\n\r\n/*\r\n=================\r\n=\r\n= CF_Start\r\n=\r\n=================\r\n*/\r\n\r\nvoid CF_Start(void)//L8003773C()\r\n{\r\n\tS_StartSound(NULL, sfx_pistol);\r\n\tcursorframe = 0;\r\n\tcursorpos[0] = 0;\r\n\tImageToVram(&buttonspic, \"BUTTONS\", 0);\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= CF_Stop\r\n=\r\n=================\r\n*/\r\n\r\nvoid CF_Stop(int exit)//L80037780()\r\n{\r\n\tS_StartSound(NULL, sfx_pistol);\r\n\tcursorpos[0] = options;\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= CF_Ticker\r\n=\r\n=================\r\n*/\r\n\r\nint CF_Ticker(void)//L800377AC()\r\n{\r\n\tunsigned int *tmpcfg;\r\n\tint cnt, buttons;\r\n\r\n    if ((gamevbls < (int)gametic) && ((gametic & 3) == 0))\r\n        cursorframe ^= 1;\r\n\r\n\tbuttons = ticbuttons[0];\r\n\r\n\tif (buttons & PAD_ARROWS)\r\n\t{\r\n        m_vframe1[0] -= vblsinframe[0];\r\n        if (m_vframe1[0] <= 0)\r\n        {\r\n            m_vframe1[0] = TICRATE;\r\n\r\n            if (buttons & PAD_DOWN)\r\n\t\t\t{\r\n\t\t\t\tcursorpos[0]++;\r\n\t\t\t\tif (cursorpos[0] > 8)\r\n\t\t\t\t\tcursorpos[0] = 0;\r\n\r\n\t\t\t\tS_StartSound(NULL, sfx_pstop);\r\n\t\t\t}\r\n\t\t\telse if (buttons & PAD_UP)\r\n\t\t\t{\r\n\t\t\t\tcursorpos[0]--;\r\n\t\t\t\tif (cursorpos[0] < 0)\r\n\t\t\t\t\tcursorpos[0] = 8;\r\n\r\n\t\t\t\tS_StartSound(NULL, sfx_pstop);\r\n\t\t\t}\r\n        }\r\n\t}\r\n\telse\r\n\t{\r\n\t\tm_vframe1[0] = 0;\r\n\t}\r\n\r\n\tif (buttons & (PAD_START | PAD_SELECT))\r\n\t\treturn ga_exit;\r\n\r\n\tif (buttons != oldticbuttons[0])\r\n\t{\r\n\t\tif (cursorpos[0] < 8)\r\n\t\t{\r\n\t\t\ttmpcfg = TempConfiguration;\r\n\t\t\tfor (cnt = 0; cnt < 8; cnt++, tmpcfg++)\r\n\t\t\t{\r\n\t\t\t\tif (buttons & *tmpcfg)\r\n\t\t\t\t{\r\n\t\t\t\t\tActualConfiguration[cursorpos[0]] = *tmpcfg;\r\n\t\t\t\t\tS_StartSound(NULL, sfx_swtchx);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if (buttons & PAD_ACTION) // Set Default Configuration\r\n\t\t{\r\n\t\t\tD_memcpy(&ActualConfiguration, &DefaultConfiguration, sizeof(int) * 8);\r\n\t\t\tS_StartSound(NULL, sfx_swtchx);\r\n\t\t}\r\n\t}\r\n\r\n\treturn ga_nothing;\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= CF_Drawer\r\n=\r\n=================\r\n*/\r\n\r\nvoid CF_Drawer(void)//L80037984()\r\n{\r\n\tint\t\tpicid, cnt, cnt2, xpos, ypos;\r\n\tunsigned int *tmpcfg;\r\n\tunsigned int *actcfg;\r\n\r\n\tNextTextureCacheIdx();\r\n\r\n\t//Draw Backround MARB01 Pic\r\n\tfor (ypos = 0; ypos < 4; ypos++)\r\n\t{\r\n\t\tfor (xpos = 0; xpos < 4; xpos++)\r\n\t\t{\r\n\t\t\tDrawStaticImage(&marb01pic, xpos << 6, ypos << 6, palette[0]);\r\n\t\t}\r\n\t}\r\n\r\n\tST_DrawText(-1, 20, \"Configuration\");//Draw Text\r\n\r\n\t//Draw Skull Selector\r\n\tDrawImage(statuspic.vtpage, palette[16], 10, (cursorpos[0] * 20) + 43, (cursorframe * M_SKULL_W) + M_SKULL_VX, M_SKULL_VY, M_SKULL_W, M_SKULL_H);\r\n\r\n\t//Draw Psx Buttons Graphics\r\n\typos = 45;\r\n\tactcfg = ActualConfiguration;\r\n\tfor (cnt = 0; cnt < 8; cnt++, actcfg++)\r\n\t{\r\n\t\tpicid = 0;\r\n\r\n\t\ttmpcfg = TempConfiguration;\r\n\t\tfor (cnt2 = 0; cnt2 < 8; cnt2++, tmpcfg++)\r\n\t\t{\r\n\t\t\tif(*actcfg == *tmpcfg)\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tpicid++;\r\n\t\t}\r\n\t\t//Draw Buttons PSX\r\n        if (cursorpos[0] != cnt || !(ticon & 8))\r\n            DrawImage(buttonspic.vtpage, palette[0], 32, ypos, buttonspic.vramx + (picid * 16), buttonspic.vramy, 16, 16);\r\n\r\n\t\typos += 20;\r\n\t}\r\n\r\n\t//Draw Options names\r\n\typos = 45;\r\n\tfor (cnt = 0; cnt < 8; cnt++)\r\n\t{\r\n\t\tST_DrawText(70, ypos, fuctionsnames[cnt]);\r\n\t\typos += 20;\r\n\t}\r\n\r\n\t//Draw Default Text\r\n    if (cursorpos[0] != cnt || !(ticon & 8))\r\n        ST_DrawText(70, (cnt * 20) + 45, \"Default\");\r\n\r\n\tUpdateDrawOTag();\r\n\tDrawRender();\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/d_main.c",
    "content": "/* D_main.c  */\r\n\r\n//------------------------------\r\n#include \"doomdef.h\"\r\n#include \"p_spec.h\"\r\n#include \"r_local.h\"\r\n\r\n//global gp para checkear funciones\r\nint _gp = 'D' | ('M' << 8) | ('G' << 16) | ('P' << 24);\r\n\r\nint\t*demo_p = NULL;             //80077418\r\nint\t*demobuffer = NULL;         //8007741C\r\nint SfxVolume = 100;\t        //80077420\r\nint MusVolume = 100;\t        //80077424\r\nint CDVolume = 0x3CFF;\t        //80077428\r\n\r\nint gamevbls;\t\t            //80077DD0 /* may not really be vbls in multiplayer */\r\nint\tgametic;\t\t            //80077E78\r\nint ticsinframe;                //800780C0 /* how many tics since last drawer */\r\nint ticon;\t\t\t            //80077F74\r\n//int frameon;\r\nint ticbuttons[MAXPLAYERS];\t\t//80077D70, 80077D74\r\nint oldticbuttons[MAXPLAYERS];\t//8007803C, 80078040\r\nint\tvblsinframe[MAXPLAYERS];\t//80077de8 /* range from 4 to 8 */\r\n\r\nint\tv_sync;                     //80077CC8\r\n\r\n#define SetVolPsx(vol) ((int)((vol*0x7f)/100))\r\n\r\nskill_t    startskill = sk_medium;  //8007742C\r\nint        startmap   = 1;          //80077430\r\ngametype_t starttype  = gt_single;  //80077434\r\n\r\nbyte tempbuffer[0x10000];\t//80098528 Psx Doom\r\n\r\nmobj_t\temptymobj;  //0x800a9c14\r\n\r\n//Por ahora\r\nint\t\t\tswitchlist[MAXSWITCHES * 2];\r\nbutton_t\tbuttonlist[MAXBUTTONS];//800975B0\r\n\r\nanim_t\t    anims[MAXANIMS];\r\nthinker_t\tthinkercap;\t/* both the head and tail of the thinker list */    //80096378\r\nmobj_t\t\tmobjhead;\t/* head and tail of mobj list */                    //800A8C74,\r\nbuttons_t   *BT_DATA[MAXPLAYERS];//80077DF4, 80077DF8\r\nline_t\t    *linespeciallist[MAXLINEANIMS];//0x800973a4\r\n\r\nvoid D_DoomMain (void) //L80012274()\r\n{\r\n\tbyte\t\t*data;\r\n\tdata = (byte *)tempbuffer;\r\n\r\n\t//printf(\"MASTER EDITION BY GEC\\n\");\r\n\r\n\tPSX_INIT();\r\n\r\n\t/* WMS Sound System Init */\r\n\tPsxSoundInit(SetVolPsx(SfxVolume), SetVolPsx(MusVolume), data);\r\n\r\n\tZ_Init();\r\n\tInit_Vram_Cache();\r\n\tW_Init();\r\n\tR_Init();\r\n\tST_Init();\r\n\r\n\tgamevbls = 0;\r\n\tgametic = 0;\r\n\r\n\tticsinframe = 0;\r\n\tticon = 0;\r\n\r\n\tticbuttons[0] = ticbuttons[1] = 0;\r\n\toldticbuttons[0] = oldticbuttons[1] = 0;\r\n\r\n\twhile (1)\r\n\t{\r\n\t\tif (RunTitle() != ga_exit)\r\n        {\r\n\t\t\tif (RunDemo((char *)_DEMO1_LMP) != ga_exit)\r\n\t\t\t{\r\n\t\t\t\tif (RunCredits() != ga_exit)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (RunDemo((char *)_DEMO2_LMP) != ga_exit)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tdo{} while (RunMenu() != ga_timeout);\r\n\t}\r\n}\r\n\r\nint RunLegal(void)//L800123A4()\r\n{\r\n\tint exit;\r\n\texit = MiniLoop(L_Start, L_Stop, L_Ticker, L_Draw);\r\n\treturn exit;\r\n}\r\n\r\nint RunTitle(void)//L800123E4()\r\n{\r\n\tint exit;\r\n\texit = MiniLoop(T_Start, T_Stop, T_Ticker, T_Draw);\r\n\treturn exit;\r\n}\r\n\r\nint RunDemo(char *demoname)//L80012424()\r\n{\r\n\tint pfile;\r\n\tint exit;\r\n\r\n\tdemo_p = Z_Alloc(0x4000, PU_STATIC, 0);\r\n\r\n\tpfile = OpenFile(demoname);\r\n\tReadFile(pfile, demo_p, 0x4000);\r\n\tCloseFile(pfile);\r\n\r\n\texit = G_PlayDemoPtr();\r\n\tZ_Free(demo_p);\r\n\r\n\treturn exit;\r\n}\r\n\r\nint RunCredits(void)//L800124A8()\r\n{\r\n\tint\t\texit;\r\n\texit = MiniLoop(C_Start, C_Stop, C_Ticker, C_Draw);\r\n\treturn exit;\r\n}\r\n\r\n\r\n#include <stdarg.h> //va_list|va_start|va_end\r\n\r\nint debugX, debugY;//80077E5C|uGp00000a4c, 80077E68|uGp00000a58\r\nextern psxobj_t statuspic;  //800A92CC\r\n\r\nvoid D_DebugSetPrintPos(int x, int y)//L800124E8()\r\n{\r\n\tdebugX = x;\r\n\tdebugY = y;\r\n}\r\n\r\nvoid D_DebugPrint(const char *text, ...)//L800124F8()\r\n{\r\n\tchar buffer[256];\r\n\tva_list args;\r\n\tDR_MODE *drawmode = (DR_MODE*) getScratchAddr(128);//1F800200\r\n\tSPRT    *debugsprite = (SPRT*) getScratchAddr(128);//1F800200\r\n\r\n\tSetDrawMode(drawmode, 0, 0, statuspic.vtpage, NULL);\r\n\tW_AddPrim(drawmode);// add to order table\r\n\r\n\tSetSprt(debugsprite);\r\n\tSetSemiTrans(debugsprite, 0);\r\n\tSetShadeTex(debugsprite, 0);\r\n\r\n\tsetRGB0(debugsprite, 128, 128, 128);\r\n\tdebugsprite->clut = palette[0];\r\n\r\n\tva_start(args, text);\r\n\tD_vsprintf(buffer, text, args);\r\n\tva_end(args);\r\n\r\n\tST_DrawMessage(debugX, debugY, buffer);\r\n\tdebugY += 8;\r\n}\r\n\r\n#define WORDMASK\t3\r\n\r\n/*int abs(int x)\r\n{\r\n\tif (x<0)\r\n\t\treturn -x;\r\n\treturn x;\r\n}*/\r\n\r\n#define abs(x) ((x) < 0 ? -(x) : (x))\r\n\r\n/*\r\n====================\r\n=\r\n= D_memset\r\n=\r\n====================\r\n*/\r\n\r\nvoid D_memset(void *dest, int val, int count)//L80012850()\r\n{\r\n\tbyte\t*p;\r\n\tint\t\t*lp;\r\n\r\n\t/* round up to nearest word */\r\n\tp = dest;\r\n\twhile ((int)p & WORDMASK)\r\n\t{\r\n\t\tif (--count < 0)\r\n\t\t\treturn;\r\n\t\t*p++ = val;\r\n\t}\r\n\r\n\t/* write 32 bytes at a time */\r\n\tlp = (int *)p;\r\n\tval = (val << 24) | (val << 16) | (val << 8) | val;\r\n\twhile (count >= 32)\r\n\t{\r\n\t\tlp[0] = lp[1] = lp[2] = lp[3] = lp[4] = lp[5] = lp[6] = lp[7] = val;\r\n\t\tlp += 8;\r\n\t\tcount -= 32;\r\n\t}\r\n\r\n\t/* finish up */\r\n\tp = (byte *)lp;\r\n\twhile (count--)\r\n\t\t*p++ = val;\r\n}\r\n\r\n\r\nvoid D_memcpy(void *dest, void *src, int count)//L8001290C()\r\n{\r\n\tbyte\t*d, *s;\r\n\r\n\td = (byte *)dest;\r\n\ts = (byte *)src;\r\n\twhile (count--)\r\n\t\t*d++ = *s++;\r\n}\r\n\r\n\r\nvoid D_strncpy(char *dest, char *src, int maxcount)//L80012940()\r\n{\r\n\tbyte\t*p1, *p2;\r\n\tp1 = (byte *)dest;\r\n\tp2 = (byte *)src;\r\n\twhile (maxcount--)\r\n\t\tif (!(*p1++ = *p2++))\r\n\t\t\treturn;\r\n}\r\n\r\nint D_strncasecmp(char *s1, char *s2, int len)//L8001297C()\r\n{\r\n\twhile (*s1 && *s2)\r\n\t{\r\n\t\tif (*s1 != *s2)\r\n\t\t\treturn 1;\r\n\t\ts1++;\r\n\t\ts2++;\r\n\t\tif (!--len)\r\n\t\t\treturn 0;\r\n\t}\r\n\tif (*s1 != *s2)\r\n\t\treturn 1;\r\n\treturn 0;\r\n}\r\n\r\nvoid D_strupr(char *s)//L800129D4()\r\n{\r\n\tchar\tc;\r\n\r\n\twhile ((c = *s) != 0)\r\n\t{\r\n\t\tif (c >= 'a' && c <= 'z')\r\n\t\t\tc -= 'a' - 'A';\r\n\t\t*s++ = c;\r\n\t}\r\n}\r\n\r\n/*\r\n===============\r\n=\r\n= M_Random\r\n=\r\n= Returns a 0-255 number\r\n=\r\n===============\r\n*/\r\n\r\nunsigned char rndtable[256] = { //0x80058888\r\n\t0,   8, 109, 220, 222, 241, 149, 107,  75, 248, 254, 140,  16,  66 ,\r\n\t74,  21, 211,  47,  80, 242, 154,  27, 205, 128, 161,  89,  77,  36 ,\r\n\t95, 110,  85,  48, 212, 140, 211, 249,  22,  79, 200,  50,  28, 188 ,\r\n\t52, 140, 202, 120,  68, 145,  62,  70, 184, 190,  91, 197, 152, 224 ,\r\n\t149, 104,  25, 178, 252, 182, 202, 182, 141, 197,   4,  81, 181, 242 ,\r\n\t145,  42,  39, 227, 156, 198, 225, 193, 219,  93, 122, 175, 249,   0 ,\r\n\t175, 143,  70, 239,  46, 246, 163,  53, 163, 109, 168, 135,   2, 235 ,\r\n\t25,  92,  20, 145, 138,  77,  69, 166,  78, 176, 173, 212, 166, 113 ,\r\n\t94, 161,  41,  50, 239,  49, 111, 164,  70,  60,   2,  37, 171,  75 ,\r\n\t136, 156,  11,  56,  42, 146, 138, 229,  73, 146,  77,  61,  98, 196 ,\r\n\t135, 106,  63, 197, 195,  86,  96, 203, 113, 101, 170, 247, 181, 113 ,\r\n\t80, 250, 108,   7, 255, 237, 129, 226,  79, 107, 112, 166, 103, 241 ,\r\n\t24, 223, 239, 120, 198,  58,  60,  82, 128,   3, 184,  66, 143, 224 ,\r\n\t145, 224,  81, 206, 163,  45,  63,  90, 168, 114,  59,  33, 159,  95 ,\r\n\t28, 139, 123,  98, 125, 196,  15,  70, 194, 253,  54,  14, 109, 226 ,\r\n\t71,  17, 161,  93, 186,  87, 244, 138,  20,  52, 123, 251,  26,  36 ,\r\n\t17,  46,  52, 231, 232,  76,  31, 221,  84,  37, 216, 165, 212, 106 ,\r\n\t197, 242,  98,  43,  39, 175, 254, 145, 190,  84, 118, 222, 187, 136 ,\r\n\t120, 163, 236, 249\r\n};\r\n\r\nint\trndindex = 0;//80077438|uGp0000002c\r\nint prndindex = 0;//8007743C||uGp00000028\r\n\r\nint P_Random(void)//L80012A18()\r\n{\r\n\tprndindex = (prndindex + 1) & 0xff;\r\n\treturn rndtable[prndindex];\r\n}\r\n\r\nint M_Random(void)//L80012A44()\r\n{\r\n\trndindex = (rndindex + 1) & 0xff;\r\n\treturn rndtable[rndindex];\r\n}\r\n\r\nvoid M_ClearRandom(void) // L80012A70()\r\n{\r\n\trndindex = prndindex = 0;\r\n}\r\n\r\nvoid M_ClearBox(fixed_t *box)//L80012A80()\r\n{\r\n\tbox[BOXTOP] = box[BOXRIGHT] = MININT;\r\n\tbox[BOXBOTTOM] = box[BOXLEFT] = MAXINT;\r\n}\r\n\r\nvoid M_AddToBox(fixed_t *box, fixed_t x, fixed_t y)//L80012AA0()\r\n{\r\n\tif (x<box[BOXLEFT])\r\n\t\tbox[BOXLEFT] = x;\r\n\telse if (x>box[BOXRIGHT])\r\n\t\tbox[BOXRIGHT] = x;\r\n\tif (y<box[BOXBOTTOM])\r\n\t\tbox[BOXBOTTOM] = y;\r\n\telse if (y>box[BOXTOP])\r\n\t\tbox[BOXTOP] = y;\r\n}\r\n\r\nvoid M_AddToBox2(fixed_t *box, fixed_t x, fixed_t y)//L80012B10()\r\n{\r\n\tif (x<box[BOXLEFT])\r\n\t\tbox[BOXLEFT] = x;\r\n\tif (x>box[BOXRIGHT])\r\n\t\tbox[BOXRIGHT] = x;\r\n\tif (y<box[BOXBOTTOM])\r\n\t\tbox[BOXBOTTOM] = y;\r\n\tif (y>box[BOXTOP])\r\n\t\tbox[BOXTOP] = y;\r\n}\r\n\r\n\r\n/*\r\n===============\r\n=\r\n= MiniLoop\r\n=\r\n===============\r\n*/\r\n\r\nint MiniLoop(void(*start)(void), void(*stop)(int), int(*ticker)(void), void(*drawer)(void))//80012B78\r\n{\r\n\tint\t\texit;\r\n\tint\t\tbuttons;\r\n\r\n\tif (netgame != gt_single)\r\n\t\tSync_Data_Transmission();\r\n\r\n\tgameaction = ga_nothing;\r\n\tgamevbls = 0;\r\n\tgametic = 0;\r\n\tticon = 0;\r\n\tticsinframe = 0;\r\n\r\n\t/* */\r\n\t/* setup (cache graphics, etc) */\r\n\t/* */\r\n\tstart();\r\n\r\n\tdrawsync1 = 0;\r\n\tdrawsync2 = VSync(-1);\r\n\t//printf(\"RUN Mini Loop\\n\");\r\n\twhile (1)\r\n\t{\r\n\t\tvblsinframe[consoleplayer] = drawsync1;\r\n\r\n\t\t// get buttons for next tic\r\n\t\toldticbuttons[0] = ticbuttons[0];\r\n\t\toldticbuttons[1] = ticbuttons[1];\r\n\r\n\t\tbuttons = PadRead(0);\r\n\t\tticbuttons[consoleplayer] = buttons;\r\n\r\n\t\tif (netgame != gt_single)\r\n\t\t{\r\n\t\t    if (Update_Conection() != 0)\r\n            {\r\n                gameaction = ga_warped;\r\n                exit = ga_warped; // hack for NeXT level reloading and net error\r\n                break;\r\n            }\r\n\t\t}\r\n\t\t//Read|Write demos\r\n\t\telse if (demorecording || demoplayback)\r\n        {\r\n            if (demoplayback)\r\n            {\r\n                if (buttons & PAD_ALL)\r\n                {\r\n                    exit = ga_exit;\r\n                    break;\r\n                }\r\n\r\n                buttons = BIGLONG(*demobuffer++);\r\n                ticbuttons[consoleplayer] = buttons;\r\n            }\r\n\r\n            if (demorecording)\r\n            {\r\n                *demobuffer++ = BIGLONG(buttons);\r\n            }\r\n\r\n            if ((buttons & PAD_START) || ((demobuffer - demo_p) >= 0x4000))\r\n            {\r\n                exit = ga_exitdemo;\r\n                break;\r\n            }\r\n        }\r\n\r\n\t\tticon += vblsinframe[0];\r\n\t\tif (ticsinframe < (ticon >> 2))\r\n\t\t{\r\n\t\t\tgametic+=1;\r\n\t\t\tticsinframe = (ticon >> 2);\r\n\t\t}\r\n\r\n\t\texit = ticker();\r\n\t\tif (exit != ga_nothing)\r\n\t\t\tbreak;\r\n\r\n\t\tdrawer();\r\n\r\n\t\tif (gamevbls < gametic)\r\n\t\t{\r\n\t\t\tS_UpdateSounds();\r\n\t\t}\r\n\r\n\t\tgamevbls = gametic;\r\n\t}\r\n\r\n\tstop(exit);\r\n\r\n\toldticbuttons[1] = ticbuttons[1];\r\n\toldticbuttons[0] = ticbuttons[0];\r\n\r\n\treturn exit;\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/doomdata.h",
    "content": "/* DoomData.h */\n\n/* all external data is defined here */\n/* most of the data is loaded into different structures at run time */\n\n#ifndef __DOOMDATA__\n#define __DOOMDATA__\n\n#ifndef __BYTEBOOL__\n#define __BYTEBOOL__\ntypedef enum {false, true} boolean;\ntypedef unsigned char byte;\n#endif\n\n/*\n===============================================================================\n\n\t\t\t\t\t\tmap level types\n\n===============================================================================\n*/\n\n/* lump order in a map wad */\nenum {ML_LABEL, ML_THINGS, ML_LINEDEFS, ML_SIDEDEFS, ML_VERTEXES, ML_SEGS,\nML_SSECTORS, ML_NODES, ML_SECTORS , ML_REJECT, ML_BLOCKMAP, ML_LEAFS, ENDOFWAD\n};\n\n\ntypedef struct\n{\n\tint x, y; //Psx Doom\n} mapvertex_t;\n\ntypedef struct\n{\n\tshort\t\ttextureoffset;\n\tshort\t\trowoffset;\n\tchar\t\ttoptexture[8], bottomtexture[8], midtexture[8];\n\tshort\t\tsector;\t\t\t\t/* on viewer's side */\n} mapsidedef_t;\n\ntypedef struct\n{\n\tshort\t\tv1, v2;\n\tshort\t\tflags;\n\tshort\t\tspecial, tag;\n\tshort\t\tsidenum[2];\t\t\t/* sidenum[1] will be -1 if one sided */\n} maplinedef_t;\n\n#define\tML_BLOCKING\t\t\t1\n#define\tML_BLOCKMONSTERS\t2\n#define\tML_TWOSIDED\t\t\t4\t\t/* backside will not be present at all  */\n\t\t\t\t\t\t\t\t\t/* if not two sided ???:obsolete */\n\n/* if a texture is pegged, the texture will have the end exposed to air held */\n/* constant at the top or bottom of the texture (stairs or pulled down things) */\n/* and will move with a height change of one of the neighbor sectors */\n/* Unpegged textures allways have the first row of the texture at the top */\n/* pixel of the line for both top and bottom textures (windows) */\n#define\tML_DONTPEGTOP\t\t8\n#define\tML_DONTPEGBOTTOM\t16\n\n#define ML_SECRET\t\t\t32\t/* don't map as two sided: IT'S A SECRET! */\n#define ML_SOUNDBLOCK\t\t64\t/* don't let sound cross two of these */\n#define\tML_DONTDRAW\t\t\t128\t/* don't draw on the automap */\n#define\tML_MAPPED\t\t\t256\t/* set if allready drawn in automap */\n\n// Psx Doom New Flags\n#define ML_MIDMASKED\t\t0x200\r\n#define ML_MIDTRANSLUCENT\t0x400\r\n#define ML_BLOCKPRJECTILE\t0x800\n\ntypedef\tstruct\n{\n\tshort\t\tfloorheight, ceilingheight; //*, *2\n\tchar\t\tfloorpic[8], ceilingpic[8]; //*4 ,*12\n\tchar\t\tlightlevel;                 //*20\r\n\tchar\t\tcolorid;                    //*21\n\tshort\t\tspecial, tag;               //*22, *24\n\tshort\t\tflags;\t                    //Psx Doom *26\n} mapsector_t;\n\ntypedef struct\n{\n\tshort\t\tnumsegs;\n\tshort\t\tfirstseg;\t\t\t/* segs are stored sequentially */\n} mapsubsector_t;\n\ntypedef struct\n{\n\tshort\t\tv1, v2;\n\tshort\t\tangle;\t\t\t/* ???: make this a sidedef? */\n\tshort\t\tlinedef, side;\n\tshort\t\toffset;\n} mapseg_t;\n\nenum {BOXTOP,BOXBOTTOM,BOXLEFT,BOXRIGHT};\t/* bbox coordinates */\n\n#define\tNF_SUBSECTOR\t0x8000\ntypedef struct\n{\n\tshort\t\tx,y,dx,dy;\t\t\t/* partition line */\n\tshort\t\tbbox[2][4];\t\t\t/* bounding box for each child */\n\tunsigned short\tchildren[2];\t\t/* if NF_SUBSECTOR its a subsector */\n} mapnode_t;\n\ntypedef struct\n{\n\tshort\t\tx,y;\n\tshort\t\tangle;\n\tshort\t\ttype;\n\tshort\t\toptions;\n} mapthing_t;\n\n#define\tMTF_EASY\t\t1\n#define\tMTF_NORMAL\t\t2\n#define\tMTF_HARD\t\t4\n#define\tMTF_AMBUSH\t\t8\n//Psx Doom\r\n#define MTF_BLENDMASK1\t0x20\r\n#define MTF_BLENDMASK2\t0x40\r\n#define MTF_BLENDMASK3\t0x80\n\n/*\n===============================================================================\n\n\t\t\t\t\t\ttexture definition\n\n===============================================================================\n*/\n\ntypedef struct\n{\n\tshort\toriginx;\n\tshort\toriginy;\n\tshort\tpatch;\n\tshort\tstepdir;\n\tshort\tcolormap;\n} mappatch_t;\n\ntypedef struct\n{\n\t//char\t\tname[8];\n\t//boolean\t\tmasked;\n\tshort\t\tleftoffset;\n\tshort\t\ttopoffset;\n\tshort\t\twidth;\n\tshort\t\theight;\n\t//void\t\t**columndirectory;\t/* OBSOLETE */\n\t//short\t\tpatchcount;\n\t//mappatch_t\tpatches[1];\n} maptexture_t;\n\n\n/*\n===============================================================================\n\n\t\t\t\t\t\t\tgraphics\n\n===============================================================================\n*/\n\n/* shorts are stored BIG ENDIAN */\n\n\n/* column_t are runs of non masked source pixels */\ntypedef struct\n{\n\tbyte\t\t\ttopdelta;\t/* 0xff is the last post in a column */\n\tbyte\t\t\tlength;\n\tunsigned short\tdataofs;\t/* from data start in patch_t */\n} column_t;\n\n/* a patch holds one or more columns */\n/* patches are used for sprites and all masked pictures */\ntypedef struct\n{\n\tshort\t\twidth;\t\t\t\t/* bounding box size  */\n\tshort\t\theight;\n\tshort\t\tleftoffset;\t\t\t/* pixels to the left of origin  */\n\tshort\t\ttopoffset;\t\t\t/* pixels below the origin  */\n\tunsigned short\tcolumnofs[8];\t/* only [width] used */\n\t\t\t\t\t\t\t\t\t/* the [0] is &columnofs[width]  */\n} patch_t;\n\n\n/*\n===============================================================================\n\n\t\t\t\t\t\t\tstatus\n\n===============================================================================\n*/\n\n\n\n\n#endif\t\t\t/* __DOOMDATA__ */\n\n"
  },
  {
    "path": "PSXDOOM/doomdef.h",
    "content": "/* DoomDef.h */\r\n\r\n/* Fixes and Version Update Here*/\r\n// NEWS (PsyDoom) and ([GEC] Master Edition)\r\n#define SHOWFPS 1\r\n#define ENABLE_NIGHTMARE    1       // Originally Activated in the project [GEC] Master Edition.\r\n#define ENABLE_MOREMAPS\t\t1       // Enable the increase of map limits, important note you need to change the #define LASTLEVEL to the desired value the limit is up to 255.\r\n#define P_FNHF_UPDATE       1       // PsyDoom P_FindNextHighestFloor new code logic.\r\n\r\n\r\n//FIXES\r\n#define FIX_LINEDEFS_DELETION   1   // Fixes for the 'linedef deletion' bug. From PsyDoom.\r\n#define RANGE_CHECKS    1           // Only if necessary to avoid alterations in the game.\r\n#define FIX_ML_DONTDRAW 1           // Automap: fix a PSX DOOM bug where lines flagged with ML_DONTDRAW would draw when the computer map powerup is obtained. From PsyDoom.\r\n#define FIX_PE_SKULL_LIMIT 1        // Fixes code error when limiting lost souls, converting Doom 2 pc function to PsxDoom (based on Jaguar Doom), code is incompatible, fixes based on repair done for Psx Final Doom.\r\n#define FIX_FLATSPANS   1           // Precision fix for large open maps, to prevent cracks at the right of the screen. From PsyDoom.\r\n\r\n//UPDATES\r\n#define GH_UPDATES  1               // Psx Doom Greatest Hits Updates.\r\n\r\n#define\tVINT\tint\r\n\r\n/* SONY LIBRARIES */\r\n#include <sys/types.h>\r\n#include <r3000.h>\r\n#include <asm.h>\r\n#include <kernel.h>\r\n#include <libetc.h>\r\n#include <libgte.h>\r\n#include <libgpu.h>\r\n#include <libsn.h>\r\n#include <libgs.h>\r\n#include <libapi.h>\r\n#include <libcomb.h>\r\n#include <libetc.h>\r\n#include <sys/file.h> /* O_RDONLY|O_WRONLY|O_NOWAIT */\r\n\r\n/* PSX CD INCLUDES */\r\n#include \"psxcd.h\"\r\n#include \"psxcdabs.h\"\r\n\r\n/* WESS API INCLUDES */\r\n#include \"wessapi.h\"\r\n#include \"wessarc.h\"\r\n#include \"psxcd.h\"\r\n#include \"psxspu.h\"\r\n#include \"wessapi.h\"\r\n#include \"seqload.h\"\r\n#include \"lcdload.h\"\r\n\r\n/* NEW GEC */\r\n#define setClutNum(p,num) \\\r\n\t((p)->clut = num)\r\n\r\n/*============================================================================= */\r\n\r\n/* all external data is defined here */\r\n#include \"doomdata.h\"\r\n\r\n/* header generated by multigen utility */\r\n#include \"info.h\"\r\n\r\n#define MAXCHAR ((char)0x7f)\r\n#define MAXSHORT ((short)0x7fff)\r\n#define MAXINT\t((int)0x7fffffff)\t/* max pos 32-bit int */\r\n#define MAXLONG ((long)0x7fffffff)\r\n\r\n#define MINCHAR ((char)0x80)\r\n#define MINSHORT ((short)0x8000)\r\n#define MININT \t((int)0x80000000)\t/* max negative 32-bit integer */\r\n#define MINLONG ((long)0x80000000)\r\n\r\n#ifndef NULL\r\n#define\tNULL\t0\r\n#endif\r\n\r\n// PSX Doom\r\n\r\n#define LASTLEVEL   60  // 60 is defined as it is the last level map entry, it does not contain a specific map, it is used to limit passwords, load sounds for credits.\r\n\r\n/*\r\n// Stores information about a texture, including it's dimensions, lump info and texture cache info\r\nstruct texture_t {\r\n  0 0  2 int16_t                     offsetX;\r\n    2  2 int16_t                     offsetY;\r\n  1 4  2 int16_t                     width;                  // TODO: is this signed or unsigned?\r\n    6  2 int16_t                     height;                 // TODO: is this signed or unsigned?\r\n  2 8  1 uint8_t                     texPageCoordX;          // TODO: COMMENT\r\n    9  1 uint8_t                     texPageCoordY;          // TODO: COMMENT\r\n    10 2 uint16_t                    texPageId;              // TODO: COMMENT\r\n  3 12 2 uint16_t                    widthIn16Blocks;        // Width in 16 pixel increments (rounded up)\r\n    14 2 uint16_t                    heightIn16Blocks;       // Height in 16 pixel increments (rounded up)\r\n  4 16 2 uint16_t                    lumpNum;\r\n    18 2 uint16_t                    __padding;              // TODO: is this actually used?\r\n  5 20 4 VmPtr<VmPtr<texture_t>>     ppTexCacheEntry;        // The texture cache entry for this texture\r\n  6 24 4 uint32_t                    unknown1;               // TODO: what is this?\r\n  7 28 4 uint32_t                    uploadFrameNum;         // What frame the texture was added to the texture cache, used to detect texture cache overflows\r\n};\r\n*/\r\n\r\n//\r\n// Object Data Psx Doom\r\n//\r\ntypedef struct psxobj_s\r\n{\r\n\tshort           x;\t\t// pixels to the left of origin\r\n\tshort           y;\t\t// pixels below the origin\r\n\tshort           w;\t\t// width image\r\n\tshort           h;\t\t// height image\r\n\r\n\tunsigned char   vramx;\t// vram position x\r\n\tunsigned char   vramy;\t// vram position y\r\n\r\n\tunsigned short  vtpage;\t// base tpage info\r\n\tunsigned short  vbasex;\t// base x pos in vram\r\n\tunsigned short  vbasey;\t// base y pos in vram\r\n\tunsigned short  lump;\t// lump number\r\n    unsigned short  pad1;\t// lump number\r\n\tunsigned long   *vptr;\t// ptr to an arry for the tpage??\r\n\tunsigned int    pad2;\r\n\tunsigned int    index;\r\n} psxobj_t;\r\n\r\ntypedef struct\r\n{\r\n\tshort leftoffset;\r\n\tshort topoffset;\r\n\tshort width;\r\n\tshort height;\r\n} patchpsx_t;\r\n\r\n#define FIRESKY_WIDTH\t64\r\n#define FIRESKY_HEIGHT\t128\r\n#define FIREPOS1 ((FIRESKY_WIDTH * FIRESKY_HEIGHT) - FIRESKY_WIDTH)\r\n#define FIREPOS2 ((FIRESKY_WIDTH * FIRESKY_HEIGHT) - 1)\r\n\r\n\r\nextern byte tempbuffer[0x10000];\t//80098528 Psx Doom\r\n\r\nint D_vsprintf(char *string, const char *format, int *argptr);\r\n\r\nvoid D_printf (char *str, ...);\r\n\r\n/*\r\n===============================================================================\r\n\r\n\t\t\t\t\t\tGLOBAL TYPES\r\n\r\n===============================================================================\r\n*/\r\n\r\n#define MAXPLAYERS\t2\r\n#define TICRATE\t\t15\t\t\t/* number of tics / second */\r\n\r\n#define\tFRACBITS\t\t16\r\n#define\tFRACUNIT\t\t(1<<FRACBITS)\r\n#define\tFRACMASK        (FRACUNIT-1)    //Named from Station Doom\r\n\r\ntypedef int fixed_t;\r\n\r\n#define\tANG45\t0x20000000\r\n#define\tANG90\t0x40000000\r\n#define\tANG180\t0x80000000\r\n#define\tANG270\t0xc0000000\r\ntypedef unsigned angle_t;\r\n\r\n#define\tFINEANGLES\t\t\t8192\r\n#define\tFINEMASK\t\t\t(FINEANGLES-1)\r\n#define\tANGLETOFINESHIFT\t19\t/* 0x100000000 to 0x2000 */\r\n\r\nextern\tfixed_t\t\tfinesine[5*FINEANGLES/4];\r\nextern\tfixed_t\t\t*finecosine;\r\n\r\ntypedef enum\r\n{\r\n\tsk_baby,\r\n\tsk_easy,\r\n\tsk_medium,\r\n\tsk_hard,\r\n\tsk_nightmare\r\n} skill_t;\r\n\r\ntypedef enum\r\n{\r\n\tga_nothing,\r\n\tga_died,\r\n\tga_completed,\r\n\tga_secretexit,\r\n\tga_warped,\r\n\tga_exitdemo,\r\n\t//News\r\n\tga_recorddemo,\r\n\tga_timeout,\r\n\tga_restart,\r\n\tga_exit\r\n} gameaction_t;\r\n\r\n\r\n/* */\r\n/* library replacements */\r\n/* */\r\n\r\nvoid D_memset (void *dest, int val, int count);\r\nvoid D_memcpy (void *dest, void *src, int count);\r\nvoid D_strncpy (char *dest, char *src, int maxcount);\r\nint D_strncasecmp (char *s1, char *s2, int len);\r\n\r\n\r\n/*\r\n===============================================================================\r\n\r\n\t\t\t\t\t\t\tMAPOBJ DATA\r\n\r\n===============================================================================\r\n*/\r\n\r\nstruct mobj_s;\r\n\r\n/* think_t is a function pointer to a routine to handle an actor */\r\ntypedef void (*think_t) ();\r\n\r\n/* a latecall is a function that needs to be called after p_base is done */\r\ntypedef void (*latecall_t) (struct mobj_s *mo);\r\n\r\ntypedef struct thinker_s\r\n{\r\n\tstruct\t\tthinker_s\t*prev, *next;\r\n\tthink_t\t\tfunction;\r\n} thinker_t;\r\n\r\nstruct player_s;\r\n\r\ntypedef struct mobj_s\r\n{\r\n/* info for drawing */\r\n\tfixed_t\t\t\tx,y,z;\r\n\tstruct subsector_s\t*subsector;\r\n\tstruct\tmobj_s\t*prev, *next;\r\n\tlatecall_t\t\tlatecall;\t\t\t/* set in p_base if more work needed */\r\n\tstruct\tmobj_s\t*snext, *sprev;\t\t/* links in sector (if needed) */\r\n\tangle_t\t\t\tangle;\r\n\tVINT\t\t\tsprite;\t\t\t\t/* used to find patch_t and flip value */\r\n\tVINT\t\t\tframe;\t\t\t\t/* might be ord with FF_FULLBRIGHT */\r\n\r\n/* interaction info */\r\n\tstruct mobj_s\t*bnext, *bprev;\t\t/* links in blocks (if needed) */\r\n\tfixed_t\t\t\tfloorz, ceilingz;\t/* closest together of contacted secs */\r\n\tfixed_t\t\t\tradius, height;\t\t/* for movement checking */\r\n\tfixed_t\t\t\tmomx, momy, momz;\t/* momentums */\r\n\r\n\tmobjtype_t\t\ttype;\r\n\tmobjinfo_t\t\t*info;\t\t\t\t/* &mobjinfo[mobj->type] */\r\n\tVINT\t\t\ttics;\t\t\t\t/* state tic counter\t */\r\n\tstate_t\t\t\t*state;\r\n\tint\t\t\t\tflags;\r\n\tVINT\t\t\thealth;\r\n\tVINT\t\t\tmovedir;\t\t/* 0-7 */\r\n\tVINT\t\t\tmovecount;\t\t/* when 0, select a new dir */\r\n\tstruct mobj_s\t*target;\t\t/* thing being chased/attacked (or NULL) */\r\n\t\t\t\t\t\t\t\t\t/* also the originator for missiles */\r\n\tVINT\t\t\treactiontime;\t/* if non 0, don't attack yet */\r\n\t\t\t\t\t\t\t\t\t/* used by player to freeze a bit after */\r\n\t\t\t\t\t\t\t\t\t/* teleporting */\r\n\tVINT\t\t\tthreshold;\t\t/* if >0, the target will be chased */\r\n\t\t\t\t\t\t\t\t\t/* no matter what (even if shot) */\r\n\tstruct player_s\t*player;\t\t/* only valid if type == MT_PLAYER */\r\n\tstruct mobj_s   *extramobj;     /* for latecall functions */\r\n\r\n\tshort\t\t\tspawnx, spawny, spawntype,spawnangle;\t/* for deathmatch respawning */\r\n\r\n    struct mobj_s*\ttracer;         /* Thing being chased/attacked for tracers. */\r\n} mobj_t;\r\n\r\n/* each sector has a degenmobj_t in it's center for sound origin purposes */\r\nstruct subsector_s;\r\ntypedef struct\r\n{\r\n\tfixed_t\t\t\tx,y,z;\r\n    struct subsector_s\t*subsec;\t// Psx Doom New\r\n} degenmobj_t;\r\n\r\n\r\n/* */\r\n/* frame flags */\r\n/* */\r\n#define\tFF_FULLBRIGHT\t0x8000\t\t/* flag in thing->frame */\r\n#define FF_FRAMEMASK\t0x7fff\r\n\r\n/* */\r\n/* mobj flags */\r\n/* */\r\n#define\tMF_SPECIAL\t\t1\t\t\t/* call P_SpecialThing when touched */\r\n#define\tMF_SOLID\t\t2\r\n#define\tMF_SHOOTABLE\t4\r\n#define\tMF_NOSECTOR\t\t8\t\t\t/* don't use the sector links */\r\n\t\t\t\t\t\t\t\t\t/* (invisible but touchable)  */\r\n#define\tMF_NOBLOCKMAP\t16\t\t\t/* don't use the blocklinks  */\r\n\t\t\t\t\t\t\t\t\t/* (inert but displayable) */\r\n#define\tMF_AMBUSH\t\t32\r\n#define\tMF_JUSTHIT\t\t64\t\t\t/* try to attack right back */\r\n#define\tMF_JUSTATTACKED\t128\t\t\t/* take at least one step before attacking */\r\n#define\tMF_SPAWNCEILING\t256\t\t\t/* hang from ceiling instead of floor */\r\n#define\tMF_NOGRAVITY\t512\t\t\t/* don't apply gravity every tic */\r\n\r\n/* movement flags */\r\n#define\tMF_DROPOFF\t\t0x400\t\t/* allow jumps from high places */\r\n#define\tMF_PICKUP\t\t0x800\t\t/* for players to pick up items */\r\n#define\tMF_NOCLIP\t\t0x1000\t\t/* player cheat */\r\n#define\tMF_SLIDE\t\t0x2000\t\t/* keep info about sliding along walls */\r\n#define\tMF_FLOAT\t\t0x4000\t\t/* allow moves to any height, no gravity */\r\n#define\tMF_TELEPORT\t\t0x8000\t\t/* don't cross lines or look at heights */\r\n#define MF_MISSILE\t\t0x10000\t\t/* don't hit same species, explode on block */\r\n\r\n#define\tMF_DROPPED\t\t0x20000\t\t/* dropped by a demon, not level spawned */\r\n#define\tMF_SHADOW\t\t0x40000\t\t/* use fuzzy draw (shadow demons / invis) */\r\n#define\tMF_NOBLOOD\t\t0x80000\t\t/* don't bleed when shot (use puff) */\r\n#define\tMF_CORPSE\t\t0x100000\t/* don't stop moving halfway off a step */\r\n#define\tMF_INFLOAT\t\t0x200000\t/* floating to a height for a move, don't */\r\n\t\t\t\t\t\t\t\t\t/* auto float to target's height */\r\n\r\n#define\tMF_COUNTKILL\t0x400000\t/* count towards intermission kill total */\r\n#define\tMF_COUNTITEM\t0x800000\t/* count towards intermission item total */\r\n\r\n#define\tMF_SKULLFLY\t\t0x1000000\t/* skull in flight */\r\n#define\tMF_NOTDMATCH\t0x2000000\t/* don't spawn in death match (key cards) */\r\n\r\n#define\tMF_SEETARGET\t0x4000000\t/* is target visible? */\r\n\r\n/* Exclusive Psx Doom Flags */\r\n#define\tMF_BLENDMASK1\t0x10000000\r\n#define\tMF_BLENDMASK2\t0x20000000\r\n#define\tMF_BLENDMASK3\t0x40000000\r\n#define\tMF_ALL_BLEND_MASKS  (MF_BLENDMASK1 | MF_BLENDMASK2 | MF_BLENDMASK3)\r\n\r\n/*============================================================================= */\r\ntypedef enum\r\n{\r\n\tPST_LIVE,\t\t\t/* playing */\r\n\tPST_DEAD,\t\t\t/* dead on the ground */\r\n\tPST_REBORN\t\t\t/* ready to restart */\r\n} playerstate_t;\r\n\r\n\r\n/* psprites are scaled shapes directly on the view screen */\r\n/* coordinates are given for a 320*200 view screen */\r\ntypedef enum\r\n{\r\n\tps_weapon,\r\n\tps_flash,\r\n\tNUMPSPRITES\r\n} psprnum_t;\r\n\r\ntypedef struct\r\n{\r\n\tstate_t\t*state;\t\t/* a NULL state means not active */\r\n\tint\t\ttics;\r\n\tfixed_t\tsx, sy;\r\n} pspdef_t;\r\n\r\ntypedef enum\r\n{\r\n\tit_redcard,\r\n\tit_bluecard,\r\n\tit_yellowcard,\r\n\tit_redskull,\r\n\tit_blueskull,\r\n\tit_yellowskull,\r\n\tNUMCARDS\r\n} card_t;\r\n\r\ntypedef enum\r\n{\r\n\twp_fist,\r\n\twp_pistol,\r\n\twp_shotgun,\r\n\twp_supershotgun,//psx\r\n\twp_chaingun,\r\n\twp_missile,\r\n\twp_plasma,\r\n\twp_bfg,\r\n\twp_chainsaw,\r\n\tNUMWEAPONS,\r\n\twp_nochange\r\n} weapontype_t;\r\n\r\ntypedef enum\r\n{\r\n\tam_clip,\t\t/* pistol / chaingun */\r\n\tam_shell,\t\t/* shotgun */\r\n\tam_cell,\t\t/* BFG */\r\n\tam_misl,\t\t/* missile launcher */\r\n\tNUMAMMO,\r\n\tam_noammo\t\t/* chainsaw / fist */\r\n} ammotype_t;\r\n\r\n\r\ntypedef struct\r\n{\r\n\tammotype_t\tammo;\r\n\tint\t\t\tupstate;\r\n\tint\t\t\tdownstate;\r\n\tint\t\t\treadystate;\r\n\tint\t\t\tatkstate;\r\n\tint\t\t\tflashstate;\r\n} weaponinfo_t;\r\n\r\nextern\tweaponinfo_t\tweaponinfo[NUMWEAPONS];//80066f24\r\n\r\ntypedef enum\r\n{\r\n\tpw_invulnerability,\r\n\tpw_strength,\r\n\tpw_invisibility,\r\n\tpw_ironfeet,\r\n\tpw_allmap,\r\n\tpw_infrared,\r\n\tNUMPOWERS\r\n} powertype_t;\r\n\r\n#define\tINVULNTICS\t\t(30*15)\r\n#define\tINVISTICS\t\t(60*15)\r\n#define\tINFRATICS\t\t(120*15)\r\n#define\tIRONTICS\t\t(60*15)\r\n\r\n/*\r\n================\r\n=\r\n= player_t\r\n=\r\n================\r\n*/\r\n\r\ntypedef struct player_s\r\n{\r\n\tmobj_t\t\t*mo;\r\n\tplayerstate_t\tplayerstate;\r\n\r\n\tfixed_t\t\tforwardmove, sidemove;\t/* built from ticbuttons */\r\n\tangle_t\t\tangleturn;\t\t\t\t/* built from ticbuttons */\r\n\r\n\tfixed_t\t\tviewz;\t\t\t\t\t/* focal origin above r.z */\r\n\tfixed_t\t\tviewheight;\t\t\t\t/* base height above floor for viewz */\r\n\tfixed_t\t\tdeltaviewheight;\t\t/* squat speed */\r\n\tfixed_t\t\tbob;\t\t\t\t\t/* bounded/scaled total momentum */\r\n\r\n\tint\t\t\thealth;\t\t\t\t\t/* only used between levels, mo->health */\r\n\t\t\t\t\t\t\t\t\t\t/* is used during levels\t */\r\n\tint\t\t\tarmorpoints, armortype;\t/* armor type is 0-2 */\r\n\r\n\tint\t\t\tpowers[NUMPOWERS];\t\t/* invinc and invis are tic counters\t */\r\n\tboolean\t\tcards[NUMCARDS];\r\n\tboolean\t\tbackpack;\r\n\tint\t\t\tfrags;\t\t\t\t\t/* kills of other player */\r\n\tint\t\t\tfragpad;\t/* don't mess up offsets for asm code... */\r\n\tweapontype_t\treadyweapon;\r\n\tweapontype_t\tpendingweapon;\t\t/* wp_nochange if not changing */\r\n\tboolean\t\tweaponowned[NUMWEAPONS];\r\n\tint\t\t\tammo[NUMAMMO];\r\n\tint\t\t\tmaxammo[NUMAMMO];\r\n\tint\t\t\tattackdown, usedown;\t/* true if button down last tic */\r\n\tint\t\t\tcheats;\t\t\t\t\t/* bit flags */\r\n\r\n\tint\t\t\trefire;\t\t\t\t\t/* refired shots are less accurate */\r\n\r\n\tint\t\t\tkillcount, itemcount, secretcount;\t\t/* for intermission */\r\n\tchar\t\t*message;\t\t\t\t/* hint messages */\r\n\tint\t\t\tdamagecount, bonuscount;/* for screen flashing */\r\n\tmobj_t\t\t*attacker;\t\t\t\t/* who did damage (NULL for floors) */\r\n\tint\t\t\textralight;\t\t\t\t/* so gun flashes light up areas */\r\n\tint\t\t\tfixedcolormap;\t\t\t/* can be set to REDCOLORMAP, etc */\r\n\tint\t\t\tcolormap;\t\t\t\t/* 0-3 for which color to draw player */\r\n\tpspdef_t\tpsprites[NUMPSPRITES];\t/* view sprites (gun, etc) */\r\n\tboolean\t\tdidsecret;\t\t\t\t/* true if secret level has been done */\r\n\tvoid\t\t*lastsoundsector;\t\t/* don't flood noise every time */\r\n\r\n\tint\t\t\tautomapx, automapy, automapscale, automapflags;\r\n\tint\t\t\tturnheld;\t\t\t\t/* for accelerative turning */\r\n} player_t;\r\n\r\n#define CF_NOCLIP\t\t1 // no use\r\n#define CF_GODMODE\t\t2\r\n#define CF_ALLLINES\t\t4\r\n#define CF_ALLTHINGS\t8\r\n#define CF_VRAMVIEWER\t16\r\n#define CF_WARPLEVEL\t32\r\n#define CF_NONE\t\t\t64\r\n#define CF_X_RAY\t\t128\r\n#define CF_PAUSE\t\t256\r\n\r\n#define\tAF_ACTIVE\t\t1\t\t\t\t/* automap active */\r\n#define\tAF_FOLLOW\t\t2\r\n#define\tAF_ALLLINES\t\t4\r\n#define\tAF_ALLMOBJ\t\t8\r\n\r\n#define\tAF_OPTIONSACTIVE\t128\t\t\t/* options screen running */\r\n\r\n/*\r\n===============================================================================\r\n\r\n\t\t\t\t\tGLOBAL VARIABLES\r\n\r\n===============================================================================\r\n*/\r\n\r\n/*================================== */\r\n\r\nextern\tint\t\tticsinframe;\t/* how many tics since last drawer */\r\nextern\tint\t\tticon;\r\nextern\tint\t\tframeon;\r\nextern\tint\t\tticbuttons[MAXPLAYERS];\r\nextern\tint\t\toldticbuttons[MAXPLAYERS];\r\n\r\nint MiniLoop ( void (*start)(void),  void (*stop)(int)\r\n\t\t,  int (*ticker)(void), void (*drawer)(void) );\r\n\r\nint\tG_Ticker (void);\r\nvoid G_Drawer (void);\r\nvoid G_RunGame (void);\r\n\r\n/*================================== */\r\n\r\n\r\nextern\tgameaction_t\tgameaction;\r\n\r\n#define\tSBARHEIGHT\t32\t\t\t/* status bar height at bottom of screen */\r\n\r\ntypedef enum\r\n{\r\n\tgt_single,\r\n\tgt_coop,\r\n\tgt_deathmatch\r\n} gametype_t;\r\n\r\nextern\tgametype_t\tnetgame;\r\n\r\nextern\tboolean\t\tplayeringame[MAXPLAYERS];\r\nextern\tint\t\t\tconsoleplayer;\t\t/* player taking events and displaying */\r\nextern\tint\t\t\tdisplayplayer;\r\nextern\tplayer_t\tplayers[MAXPLAYERS];\r\n\r\nextern\tboolean     rendersky;//8007801C\r\n\r\n\r\nextern\tskill_t\t\tgameskill;\r\nextern\tint\t\t\tgamemap;\r\nextern\tint\t\t\tnextmap;\r\nextern\tint\t\t\ttotalkills, totalitems, totalsecret;\t/* for intermission *///80077d4c,80077d58,80077E18\r\n\r\nextern \tint \t\tgametic;\r\n\r\nextern\tmapthing_t\tdeathmatchstarts[10], *deathmatch_p;    //80097e4c,80077e8c\r\nextern\tmapthing_t\tplayerstarts[MAXPLAYERS];//800a8c60\r\n\r\n/*\r\n===============================================================================\r\n\r\n\t\t\t\t\tGLOBAL FUNCTIONS\r\n\r\n===============================================================================\r\n*/\r\n\r\nfixed_t\tFixedMul (fixed_t a, fixed_t b);\r\nfixed_t\tFixedDiv (fixed_t a, fixed_t b);\r\n\r\n#ifndef __BIG_ENDIAN__\r\n#define __BIG_ENDIAN__\r\n#endif\r\n\r\n#ifdef __BIG_ENDIAN__\r\n\r\n#define\tBIGSHORT(x) (x)\r\n#define\tBIGLONG(x) (x)\r\n/*define\tLITTLESHORT(x) ShortSwap(x) */\r\n//#define\tLITTLESHORT(x) (short)((((x)&255)<<8)+(((x)>>8)&255))\r\n//#define\tLITTLELONG(x) LongSwap(x)\r\n\r\n#define\tLITTLESHORT(x) (x)\r\n#define\tLITTLELONG(x) (x)\r\n\r\n#else\r\n\r\nshort ShortSwap(short dat)\r\n{\r\n   return (((unsigned short)dat<<8) + ((unsigned short)dat>>8))&0xffff;\r\n}\r\n\r\nlong LongSwap(long dat)\r\n{\r\n   unsigned    a,b,c,d;\r\n\r\n   a = (dat>>24)&0xff;\r\n   b = (dat>>16)&0xff;\r\n   c = (dat>>8)&0xff;\r\n   d = dat&0xff;\r\n   return (d<<24)+(c<<16)+(b<<8)+a;\r\n}\r\n\r\n#define\tBIGSHORT(x) ShortSwap(x)\r\n#define\tBIGLONG(x) LongSwap(x)\r\n#define\tLITTLESHORT(x) (x)\r\n#define\tLITTLELONG(x) (x)\r\n\r\n#endif\r\n\r\n/*----------- */\r\n/*MEMORY ZONE */\r\n/*----------- */\r\n/* tags < 16 are not overwritten until freed */\r\n#define\tPU_STATIC\t\t1\t\t\t/* static entire execution time */\r\n#define\tPU_LEVEL\t\t2\t\t\t/* static until level exited */\r\n#define\tPU_LEVSPEC\t\t4\t\t\t/* a special thinker in a level */\r\n#define\tPU_ANIMATION\t8\t\t\t/* psx doom */\r\n/* tags >= 16 are purgable whenever needed */\r\n#define\tPU_PURGELEVEL\t16\r\n#define\tPU_CACHE\t\t32\r\n\r\n#define\tZONEID\t0x1d4a\r\n\r\ntypedef struct memblock_s\r\n{\r\n\tint\t\tsize;           /* including the header and possibly tiny fragments */\r\n\tvoid    **user;         /* NULL if a free block */\r\n\tshort   tag;            /* purgelevel */\r\n\tshort   id;             /* should be ZONEID */\r\n\tint\t\tlockframe;\t\t/* don't purge on the same frame */\r\n\tstruct memblock_s   *next;\r\n\tstruct memblock_s\t*prev;\r\n} memblock_t;\r\n\r\ntypedef struct\r\n{\r\n\tint\t\tsize;\t\t\t\t/* total bytes malloced, including header */\r\n\tmemblock_t\t*rover;\r\n\tmemblock_t\tblocklist;\t\t/* start / end cap for linked list */\r\n} memzone_t;\r\n\r\n//extern int framecount;\r\n\r\nextern\tmemzone_t\t*mainzone;\r\n//extern\tmemzone_t\t*refzone;\r\n\r\nvoid\tZ_Init (void);\r\nmemzone_t *Z_InitZone (byte *base, int size);\r\n\r\nvoid \t*Z_Malloc2 (memzone_t *mainzone, int size, int tag, void *ptr);\r\nvoid\t*Z_Alloc2(memzone_t *mainzone, int size, int tag, void *user);//psxdoom\r\ninline void Z_Free2 (memzone_t *mainzone,void *ptr);\r\n\r\n#define Z_Malloc(x,y,z) Z_Malloc2(mainzone,x,y,z)\r\n#define Z_Alloc(x,y,z) Z_Alloc2(mainzone,x,y,z)\r\n#define Z_Free(x) Z_Free2(mainzone,x)\r\n\r\nvoid\tZ_FreeTags(memzone_t *mainzone, int tag);\r\nvoid\tZ_CheckHeap (memzone_t *mainzone);\r\nvoid\tZ_ChangeTag (void *ptr, int tag);\r\nint \tZ_FreeMemory (memzone_t *mainzone);\r\nvoid    Z_DumpHeap(memzone_t *mainzone);\r\n\r\n/*------- */\r\n/*WADFILE */\r\n/*------- */\r\ntypedef struct\r\n{\r\n\tint\t\t\tfilepos;\t\t\t\t\t/* also texture_t * for comp lumps */\r\n\tint\t\t\tsize;\r\n\tchar\t\tname[8];\r\n} lumpinfo_t;\r\n\r\ntypedef struct {\r\n    void       *cache;\r\n} lumpcache_t;\r\n\r\nextern\tint\t\t\twadfilenum;\r\n\r\nextern\tlumpinfo_t\t*lumpinfo;\t\t/* points directly to rom image */\r\nextern\tint\t\t\tnumlumps;\r\nextern\tlumpcache_t\t*lumpcache;\r\nextern\tbyte\t\t*lumpencode;\t// psxdoom\r\nextern\tboolean\t\tdisableload;\t// psxdoom\r\nextern\tbyte\t\t*mapfileptr;\t// psxdoom\r\nextern\tint\t\t\tmapnumlumps;\t// psxdoom\r\nextern\tlumpinfo_t  *maplump;\t\t// psxdoom\r\n\r\nvoid\tW_Init (void);\r\n\r\nint\t\tW_CheckNumForName (char *name);\r\nint\t\tW_GetNumForName (char *name);\r\n\r\nint\t\tW_LumpLength (int lump);\r\nvoid\tW_ReadLump (int lump, void *dest, boolean decodelump);//psxdoom\r\n\r\nvoid\t*W_CacheLumpNum (int lump, int tag, boolean decodelump);//psxdoom\r\nvoid\t*W_CacheLumpName (char *name, int tag, boolean decodelump);//psxdoom\r\n\r\nbyte\t*W_OpenMapWad(char *mapname);//psxdoom\r\nint\t\tW_MapLumpLength(int lump);//psxdoom\r\nint\t\tW_MapGetNumForName(char *name);//psxdoom\r\nvoid\tW_ReadMapLump(int lump, void *dest, int decodelump);//psxdoom\r\n\r\nvoid\tdecode(unsigned char *input, unsigned char *output);//psxdoom\r\nint\t\tdecodedsize(unsigned char *input);//psxdoom\r\n\r\n/*------- */\r\n/*PSX FILE */\r\n/*------- */\r\nvoid\tClearFiles(void);//psxdoom\r\nint\t\tOpenFile(char *filename);//psxdoom\r\nvoid\tCloseFile(int file_num);//psxdoom\r\nint     SeekFile(int file_num, int seekpos, int seekmode);//psxdoom\r\nvoid\tReadFile(int file_num, void *destptr, unsigned int readbytes);//psxdoom\r\n\r\n#define W_POINTLUMPNUM(x) (void*)(wadfileptr+BIGLONG(lumpinfo[x].filepos));\r\n\r\n/*---------- */\r\n/*BASE LEVEL */\r\n/*---------- */\r\nvoid D_DoomMain (void);\r\nvoid D_DoomLoop (void);\r\n\r\nextern\tboolean\tdemoplayback, demorecording;\r\nextern\tint\t\t*demo_p, *demobuffer;\r\n\r\nextern\tskill_t\t\tstartskill;\r\nextern\tint\t\t\tstartmap;\r\nextern\tgametype_t\tstarttype;\r\n\r\n/*--------- */\r\n/*SYSTEM IO */\r\n/*--------- */\r\n#define\tSCREENWIDTH\t\t256\r\n#define\tSCREENHEIGHT\t240\r\n\r\n/*---- */\r\n/*GAME */\r\n/*---- */\r\n\r\nvoid G_DeathMatchSpawnPlayer (int playernum);\r\nvoid G_InitNew (skill_t skill, int map, gametype_t gametype);\r\nvoid G_CompleteLevel (void);\r\nvoid G_RecordDemo (void);\r\nint G_PlayDemoPtr (void);//(int *demo);\r\n\r\n/*----- */\r\n/*PLAY */\r\n/*----- */\r\n\r\nvoid P_SetupLevel (int map, skill_t skill);\r\nvoid P_Init (void);\r\n\r\nvoid P_Start (void);\r\nvoid P_Stop (int exit);\r\nint P_Ticker (void);\r\nvoid P_Drawer (void);\r\n\r\nvoid IN_Start (void);\r\nvoid IN_Stop (int exit);\r\nint IN_Ticker (void);\r\nvoid IN_Drawer (void);\r\n\r\n\r\n//m_main.c\r\ntypedef enum\r\n{\r\n\tgamemode,\r\n\tlevel,\r\n\tdifficulty,\r\n\toptions,\r\n\tNUMMENUITEMS\r\n} menu_t;\r\n\r\n//Skull Graphic On StatusPic\r\n#define\tM_SKULL_W  16\r\n#define\tM_SKULL_H  18\r\n#define\tM_SKULL_VX  132\r\n#define\tM_SKULL_VY  192\r\n\r\nextern int cursorframe;//80078000 00000bf0\r\nextern int cursorpos[MAXPLAYERS];//80077E2C uGp00000a1c,\r\nextern int m_vframe1[MAXPLAYERS]; //80077D24 uGp00000914\r\nextern psxobj_t backpic;//0x800977f0\r\nextern psxobj_t doompic;//0x80097830\r\nextern psxobj_t connectpic;//0x800978F0\r\n\r\nint RunMenu(void);\r\nvoid M_Start (void);\r\nvoid M_Stop (int exit);\r\nint M_Ticker (void);\r\nvoid M_Drawer (void);\r\nvoid M_CrossFadeWipe(void);\r\n\r\n//f_main.c\r\nvoid END1_Start (void);\r\nvoid END1_Stop(int exit);\r\nint END1_Ticker(void);\r\nvoid END1_Drawer(void);\r\n\r\nvoid Cast_Start(void);\r\nvoid Cast_Stop(int exit);\r\nint Cast_Ticker(void);\r\nvoid Cast_Drawer(void);\r\n/*void F_Start (void);\r\nvoid F_Stop (void);\r\nint F_Ticker (void);\r\nvoid F_Drawer (void);*/\r\n\r\nvoid AM_Control (player_t *player);\r\nvoid AM_Drawer (void);\r\nvoid AM_Start (void);\r\n\r\n/*----- */\r\n/*OPTIONS */\r\n/*----- */\r\n\r\nvoid O_Start (void);\r\nvoid O_Stop (int exit);\r\nint O_Ticker (void);\r\nvoid O_Drawer (void);\r\n\r\n/*----- */\r\n/*PASSWORD */\r\n/*----- */\r\n\r\nvoid PW_Start(void);\r\nvoid PW_Stop(int exit);\r\nint PW_Ticker(void);\r\nvoid PW_Drawer(void);\r\nvoid Encode_Password(byte *buff);\r\nint Decode_Password(byte *inbuff, int *levelnum, int *skill, player_t *player);\r\n\r\n/*----- */\r\n/*CONFIGURATION */\r\n/*----- */\r\n\r\nvoid CF_Start (void);\r\nvoid CF_Stop (int exit);\r\nint CF_Ticker (void);\r\nvoid CF_Drawer (void);\r\n\r\n/*----- */\r\n/*STATUS */\r\n/*----- */\r\n\r\nextern psxobj_t statuspic;\r\n\r\nvoid ST_Init (void);\r\nvoid ST_Ticker (void);\r\nvoid ST_Drawer (void);\r\nvoid ST_InitEveryLevel(void);\r\n\r\n/*------- */\r\n/*REFRESH */\r\n/*------- */\r\n\r\nvoid R_RenderPlayerView (void);\r\nvoid R_Init (void);\r\nint\tR_FlatNumForName (char *name);\r\nint\tR_TextureNumForName (char *name);\r\nint\tR_CheckTextureNumForName (char *name);\r\nangle_t R_PointToAngle2 (fixed_t x1, fixed_t y1, fixed_t x2, fixed_t y2);\r\nstruct subsector_s *R_PointInSubsector (fixed_t x, fixed_t y);\r\n\r\n/*---- */\r\n/*MISC */\r\n/*---- */\r\nextern unsigned char rndtable[256];\r\nint M_Random (void);\r\nint P_Random (void);\r\nvoid M_ClearRandom (void);\r\nvoid M_ClearBox (fixed_t *box);\r\nvoid M_AddToBox (fixed_t *box, fixed_t x, fixed_t y);\r\n\r\n\r\n/* header generated by Dave's sound utility */\r\n#include \"sounds.h\"\r\n\r\nextern\tboolean\t\tgamepaused;\r\n\r\nextern\tint\t\tmaxlevel;\t\t\t/* highest level selectable in menu (1-25) */\r\n\r\nextern\tint\t\tgamevbls;\t\t\t/* may not really be vbls in multiplayer */\r\nextern\tint\t\tvblsinframe[MAXPLAYERS];\t\t/* range from 4 to 8 */\r\n\r\n/*----- */\r\n/*PSX Doom */\r\n/*----- */\r\n\r\n/* CONTROL PAD */\r\n#define PAD_UP\t\t\t(1<<12)//4096\r\n#define PAD_DOWN\t\t(1<<14)//16384\r\n#define PAD_LEFT\t\t(1<<15)//32768\r\n#define PAD_RIGHT\t\t(1<<13)//8192\r\n#define PAD_TRIANGLE\t(1<< 4)//16\r\n#define PAD_CROSS\t\t(1<< 6)//64\r\n#define PAD_SQUARE\t\t(1<< 7)//128\r\n#define PAD_CIRCLE\t\t(1<< 5)//32\r\n#define PAD_L1\t\t\t(1<< 2)//4\r\n#define PAD_L2\t\t\t(1<< 0)//1\r\n#define PAD_R1\t\t\t(1<< 3)//8\r\n#define PAD_R2\t\t\t(1<< 1)//2\r\n#define PAD_START\t\t(1<<11)//2048\r\n#define PAD_SELECT\t\t(1<< 8)//256\r\n#define PAD_LR\t\t\t(PAD_L1 | PAD_L2 | PAD_R1 | PAD_R2)//15\r\n#define PAD_ARROWS\t\t(PAD_UP | PAD_RIGHT | PAD_DOWN | PAD_LEFT)//61440\r\n#define PAD_ACTION\t\t(PAD_TRIANGLE | PAD_CIRCLE | PAD_CROSS | PAD_SQUARE)//240\r\n#define PAD_ALL\t\t\t(PAD_ARROWS | PAD_START | PAD_SELECT | PAD_ACTION | PAD_LR)//63999\r\n//MOUSE PAD\r\n#define MOUSE_LEFT\t\t(1<<3)//8\r\n#define MOUSE_RIGHT\t\t(1<<2)//4\r\n\r\n\r\ntypedef struct\r\n{\r\n\tunsigned int BT_ATTACK;\t\t\t//*\r\n\tunsigned int BT_USE;\t\t\t//*4\r\n\tunsigned int BT_STRAFE;\t\t\t//*8\r\n\tunsigned int BT_SPEED;\t\t\t//*12\r\n\tunsigned int BT_STRAFELEFT;\t\t//*16\r\n\tunsigned int BT_STRAFERIGHT;\t//*20\r\n\tunsigned int BT_WEAPONBACKWARD;\t//*24\r\n\tunsigned int BT_WEAPONFORWARD;\t//*28\r\n} buttons_t;\r\n\r\nextern buttons_t *BT_DATA[MAXPLAYERS];//80077DF4, 80077DF8\r\n\r\n/* psxmain.c */\r\n#define MAX_VRAMMEM\t\t\t\t256     // # of entries in manager cache\r\n#define MAX_DYNAMIC_TPAGE\t\t11      // max # of tpages supported for dynamic memory\r\n#define MIN_VRAM_ALLOC_SIZE\t\t16\t\t// each tpage is divided into this many number of squares\r\n#define MIN_VRAM_ALLOC_SHIFT\t4\t\t// shift to simulate the divide of (MIN_VRAM_ALLOC_SIZE)\r\n#define VRAMSIZE (sizeof(int) * MAX_DYNAMIC_TPAGE * MAX_VRAMMEM)\r\n\r\nextern int PageCount;\r\nextern int TextureCacheIdx;\r\nextern int xycount;\r\nextern int xcount;\r\nextern int ycount;\r\nextern int V_PagFlags;\r\n\r\nextern DRAWENV\tdraw[2];\t\t\t\t/* draw environment */      //800A8E90, 800A8EEC\r\nextern DISPENV disp[2];\t\t\t\t\t/* display environment*/    //800a8f48, 800A8F5C\r\nextern long drawside;\r\nextern int\tdrawsync1;//80077FE4\r\nextern int\tdrawsync2;//80077F3C\r\n\r\nvoid I_Error(char *error, ...);\r\nvoid ImageToVram(psxobj_t *pic, char *name, int lump);\r\nvoid DrawStaticImage(psxobj_t *psxobj, int xpos, int ypos, int pal);\r\nvoid DrawImage(int vtpage, int pal, int xpos, int ypos,  char vramx, char vramy, int width, int height);\r\nvoid P_LoadingPlaque(psxobj_t *psxobj, int xpos, int ypos, int pal);\r\nvoid NextTextureCacheIdx(void);\r\nvoid DrawRender(void);\r\nvoid Add_vsync(void);\r\nvoid Init_Vram_Cache(void);\r\nvoid TextureCache (psxobj_t *psxobj);\r\nvoid V_ClearBlock(psxobj_t *psxobj);\r\nvoid Valloc_Init(void);\r\nvoid Vram_Viewer(int page);\r\n\r\nextern boolean cancel_link;\r\nextern unsigned int TempConfiguration[8];\r\nextern unsigned int ActualConfiguration[8];\r\nextern unsigned int DefaultConfiguration[8];\r\nextern unsigned int NewConfiguration[8];\r\n\r\nvoid Link_Conection(void);\r\nboolean Update_Conection(void);\r\nvoid Sync_Data_Transmission(void);\r\nvoid Sync_Read_Write (void);\r\nvoid UpdateDrawOTag(void);\r\nunsigned int Get_CfgCode(unsigned int *cfgdata);\r\nunsigned int *Get_CfgByCode(unsigned int cfgcode);\r\n\r\n/* extras */\r\n//void W_AddPrim (void* prim, unsigned long* addr0, unsigned long* addr1);//OLD VERSION\r\nvoid W_AddPrim (void* prim);\r\nvoid TestRender(void);\r\n\r\nint RunLegal(void);\r\nint RunTitle(void);\r\nint RunDemo(char *demoname);\r\nint RunCredits(void);\r\n\r\n/* l_main.c */\r\nextern int y_scroll;//80077FB8 uGp00000ba8\r\nextern int last_ticon;//80077D38 iGp00000928\r\nextern psxobj_t legalspic;\r\n\r\nvoid L_Start(void);\r\nvoid L_Stop(int exit);\r\nint L_Ticker(void);\r\nvoid L_Draw(void);\r\n\r\n/* c_main.c */\r\nvoid C_Start(void);\r\nvoid C_Stop(int exit);\r\nint C_Ticker(void);\r\nvoid C_Draw(void);\r\n\r\n/* t_main.c */\r\nextern psxobj_t loadingpic;//0x80097870\r\nextern psxobj_t marb01pic;//0x80097890\r\nextern psxobj_t buttonspic;//0x800978B0\r\nextern psxobj_t neterrpic; //0x800978d0\r\nextern psxobj_t pausepic;//0x80097850\r\nextern psxobj_t titlepic;//0x80097810\r\n\r\nvoid T_Start(void);\r\nvoid T_Stop(int exit);\r\nint T_Ticker(void);\r\nvoid T_Draw(void);\r\n\r\n/* Enum for a CD music piece and also an index into the 'CD_Track' array to get an actual track number */\r\nenum cdmusic_t {\r\n    cdmusic_title_screen,\r\n    cdmusic_main_menu,\r\n    cdmusic_credits_demo,\r\n    cdmusic_intermission,\r\n    cdmusic_club_doom,\r\n    cdmusic_finale_doom1,\r\n    cdmusic_finale_doom2,\r\n    NUM_CD_MUSIC_TRACKS\r\n};\r\n\r\nextern int CD_TRACK[NUM_CD_MUSIC_TRACKS];//80073C7C\r\n\r\nvoid S_SetSoundVolume (int volume);\r\nvoid S_SetMusicVolume(int volume);\r\nvoid S_StopMusic(void);\r\nvoid S_StartMusic(void);\r\nvoid S_InitBlock(SampleBlock *sampblk);\r\nvoid S_DoBlockClear(SampleBlock *sampblk);\r\nvoid S_Lcd_Load(int map_indx);\r\nvoid S_Pause(void);\r\nvoid S_Resume(void);\r\nvoid S_StopSound(unsigned long sequence_type);\r\nvoid S_StopAll(void);\r\nvoid S_AdjustSoundParams(mobj_t *origin, int sound_id, TriggerPlayAttr *attr);\r\nvoid S_StartSound(mobj_t *origin, int sound_id);\r\nvoid S_UpdateSounds(void);\r\nvoid PsxSoundInit(int sfx_volume, int mus_volume, void *data);\r\nvoid PsxSoundExit(void);\r\n\r\nextern int SfxVolume;   /* range from 0 to 100 */       //80077420\r\nextern int MusVolume;\t/* range from 0 to 100 */       //80077424\r\nextern int CDVolume;\t/* range from 0 to 0x3CFF */    //80077428\r\n"
  },
  {
    "path": "PSXDOOM/f_main.c",
    "content": "/* f_main.c -- finale */\r\n\r\n#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n#include \"st_main.h\"\r\n#include \"r_local.h\"\r\n\r\n\r\nchar endcluster1[][25] =        //8007466c\r\n{\r\n\t\"you have won!\",\r\n\t\"your victory enabled\",\r\n\t\"humankind to evacuate\",\r\n\t\"earth and escape the\",\r\n\t\"nightmare.\",\r\n\t\"but then earth control\",\r\n\t\"pinpoints the source\",\r\n\t\"of the alien invasion.\",\r\n\t\"you are their only hope.\",\r\n\t\"you painfully get up\",\r\n\t\"and return to the fray.\"\r\n};\r\n\r\nchar endcluster2[][25] =\r\n{\r\n\t\"you did it!\",\r\n\t\"by turning the evil of\",\r\n\t\"the horrors of hell in\",\r\n\t\"upon itself you have\",\r\n\t\"destroyed the power of\",\r\n\t\"the demons.\",\r\n\t\"their dreadful invasion\",\r\n\t\"has been stopped cold!\",\r\n\t\"now you can retire to\",\r\n\t\"a lifetime of frivolity.\",\r\n\t\"congratulations!\"\r\n};\r\n\r\n//\r\n// Character cast strings F_FINALE.C\r\n//\r\n#define CC_ZOMBIE\t\"Zombieman\"\r\n#define CC_SHOTGUN\t\"Shotgun Guy\"\r\n#define CC_HEAVY\t\"Heavy Weapon Dude\"\r\n#define CC_IMP\t\t\"Imp\"\r\n#define CC_DEMON\t\"Demon\"\r\n#define CC_LOST\t\t\"Lost Soul\"\r\n#define CC_CACO\t\t\"Cacodemon\"\r\n#define CC_HELL\t\t\"Hell Knight\"\r\n#define CC_BARON\t\"Baron Of Hell\"\r\n#define CC_ARACH\t\"Arachnotron\"\r\n#define CC_PAIN\t\t\"Pain Elemental\"\r\n#define CC_REVEN\t\"Revenant\"\r\n#define CC_MANCU\t\"Mancubus\"\r\n//#define CC_ARCH\t\t\"Arch-Vile\"\r\n#define CC_SPIDER\t\"The Spider Mastermind\"\r\n#define CC_CYBER\t\"The Cyberdemon\"\r\n#define CC_HERO\t\t\"Our Hero\"\r\n\r\n//\r\n// Final DOOM 2 animation\r\n// Casting by id Software.\r\n// in order of appearance\r\n//\r\ntypedef struct\r\n{\r\n\tchar\t\t*name;\r\n\tmobjtype_t\ttype;\r\n} castinfo_t;\r\n\r\nstatic castinfo_t\tcastorder[] = //80074898\r\n{\r\n\t{ CC_ZOMBIE, MT_POSSESSED },\r\n\t{ CC_SHOTGUN, MT_SHOTGUY },\r\n\t{ CC_HEAVY, MT_CHAINGUY },\r\n\t{ CC_IMP, MT_TROOP },\r\n\t{ CC_DEMON, MT_SERGEANT },\r\n\t{ CC_LOST, MT_SKULL },\r\n\t{ CC_CACO, MT_HEAD },\r\n\t{ CC_HELL, MT_KNIGHT },\r\n\t{ CC_BARON, MT_BRUISER },\r\n\t{ CC_ARACH, MT_BABY },\r\n\t{ CC_PAIN, MT_PAIN },\r\n\t{ CC_REVEN, MT_UNDEAD },\r\n\t{ CC_MANCU, MT_FATSO },\r\n\t//{ CC_ARCH, MT_VILE },\r\n\t{ CC_SPIDER, MT_SPIDER },\r\n\t{ CC_CYBER, MT_CYBORG },\r\n\t{ CC_HERO, MT_PLAYER },\r\n\t{ NULL,0 }\r\n};\r\n\r\ntypedef enum\r\n{\r\n\tF_STAGE_TEXT,\r\n\tF_STAGE_SCROLLTEXT,\r\n\tF_STAGE_CAST,\r\n} finalestage_t;\r\n\r\n\r\nstatic int textline;\t\t\t//80077F38 uGp00000b28\r\nstatic int textcount;\t\t\t//80077D84 uGp00000974\r\nstatic byte text_array[28];\t//L800A8E2C\r\n\r\n/*\r\n=================\r\n=\r\n= END1_Start\r\n=\r\n=================\r\n*/\r\n\r\nvoid END1_Start(void)//L8003D440()\r\n{\r\n\tP_LoadingPlaque(&loadingpic, 95, 109, palette[16]);\r\n\tValloc_Init();\r\n\r\n\tTextureCache(&backpic);\r\n\r\n\ttextline = 0;\r\n\ttextcount = 0;\r\n\ttext_array[0] = '\\0';\r\n\r\n\tpsxcd_play_at_andloop(CD_TRACK[cdmusic_finale_doom1],CDVolume,0,0,CD_TRACK[cdmusic_credits_demo],CDVolume,0,0);\r\n\tdo { } while (psxcd_elapsed_sectors() == 0);\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= END1_Stop\r\n=\r\n=================\r\n*/\r\n\r\nvoid END1_Stop(int exit)//L8003D4E4()\r\n{\r\n\tgamepaused = false;\r\n\tpsxcd_stop();\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= END1_Ticker\r\n=\r\n=================\r\n*/\r\n\r\nint END1_Ticker(void)//L8003D50C()\r\n{\r\n\tint buttons, oldbuttons, exit;\r\n\r\n\tgameaction = ga_nothing;\r\n\r\n\tbuttons = ticbuttons[consoleplayer];\r\n\toldbuttons = oldticbuttons[consoleplayer];\r\n\r\n\tP_CheckCheats();\r\n\r\n\texit = gameaction;\r\n\r\n\tif (gamepaused == false)\r\n\t{\r\n\t    exit = ga_nothing;\r\n        if (textline < 11)\r\n        {\r\n            if ((gamevbls < (int)gametic) && !(gametic & 1))\r\n            {\r\n                if (endcluster1[textline][textcount] == '\\0')\r\n                {\r\n                    textcount = 0;\r\n                    textline++;\r\n                }\r\n                else\r\n                {\r\n                    D_strncpy(text_array, endcluster1[textline], textcount);\r\n                }\r\n                text_array[textcount] = '\\0';\r\n                textcount++;\r\n            }\r\n        }\r\n        else if ((buttons != oldbuttons) && (buttons & PAD_ACTION))\r\n        {\r\n            exit = ga_exit;\r\n        }\r\n\t}\r\n\r\n\treturn exit;\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= END1_Drawer\r\n=\r\n=================\r\n*/\r\n\r\nvoid END1_Drawer(void)//L8003D660()\r\n{\r\n\tint i, ypos;\r\n\r\n\tNextTextureCacheIdx();\r\n\r\n\tDrawStaticImage(&backpic, 0, 0, palette[0]);\r\n\r\n\typos = 45;\r\n\tfor (i = 0; i < textline; i++)\r\n\t{\r\n\t\tST_DrawText(-1, ypos, endcluster1[i]);\r\n\t\typos += 14;\r\n\t}\r\n\r\n\tST_DrawText(-1, ypos, text_array);\r\n\r\n\tif (gamepaused)\r\n\t\tST_CheatDraw();\r\n\r\n\tUpdateDrawOTag();\r\n\tDrawRender();\r\n}\r\n\r\n\r\nstatic psxobj_t demonpic;//0x80097990\r\n\r\n//int             castrotation = 0;//test\r\n\r\nstatic int\t\t\t\tcastnum;\t\t//800780AC uGp00000c9c\r\nstatic int\t\t\t\tcasttics;\t\t//80077CFC uGp000008ec\r\nstatic state_t         *caststate;\t\t//80077DD4 puGp000009c4\r\nstatic boolean\t\t\tcastdeath;\t\t//80077DA4 uGp00000994\r\nstatic int\t\t\t\tcastframes;\t\t//80077EB4 uGp00000aa4\r\nstatic int\t\t\t\tcastonmelee;\t//80077F90 uGp00000b80\r\nstatic int\t\t\t\ttextypos;\t\t//80077D3C uGp0000092c\r\nstatic finalestage_t\tfinalestage;\t//80077F94 uGp00000b84\r\n\r\n/*\r\n=================\r\n=\r\n= Cast_Start\r\n=\r\n=================\r\n*/\r\n\r\nvoid Cast_Start(void)//L8003D734\r\n{\r\n\tP_LoadingPlaque(&loadingpic, 95, 109, palette[16]);\r\n\tValloc_Init();\r\n\r\n\tImageToVram(&demonpic, \"DEMON\", 0);\r\n\r\n\tP_LoadBlocks((char *)_MAPSPR60_IMG);\r\n\r\n\ttext_array[0] = '\\0';\r\n\r\n\tfinalestage = F_STAGE_TEXT;\r\n\ttextline = 0;\r\n\ttextcount = 0;\r\n\tcastnum = 0;\r\n\tcastdeath = false;\r\n\tcastframes = 0;\r\n\tcastonmelee = 0;\r\n\tcaststate = &states[mobjinfo[castorder[castnum].type].seestate];\r\n\tcasttics = states[mobjinfo[castorder[castnum].type].seestate].tics;\r\n\ttextypos = 45;\r\n\r\n\tS_Lcd_Load(LASTLEVEL);\r\n\tpsxcd_play_at_andloop(CD_TRACK[cdmusic_finale_doom2],CDVolume,0,0,CD_TRACK[cdmusic_credits_demo],CDVolume,0,0);\r\n\tdo {} while (psxcd_elapsed_sectors() == 0);\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= Cast_Stop\r\n=\r\n=================\r\n*/\r\n\r\nvoid Cast_Stop(int exit)//L8003D860()\r\n{\r\n\tgamepaused = false;\r\n\tpsxcd_stop();\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= Cast_Ticker\r\n=\r\n=================\r\n*/\r\n\r\nint Cast_Ticker(void)//L8003D888()\r\n{\r\n    int buttons, oldbuttons;\r\n\tint\tst, sfx;\r\n\r\n\tgameaction = ga_nothing;\r\n\r\n\tbuttons = ticbuttons[consoleplayer];\r\n\toldbuttons = oldticbuttons[consoleplayer];\r\n\r\n\tP_CheckCheats();\r\n\r\n\tif (gamepaused != 0)\r\n\t{\r\n\t\treturn gameaction;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tif (finalestage == F_STAGE_TEXT)\r\n\t\t{\r\n\t\t\tif ((gamevbls < (int)gametic) && !(gametic & 1))\r\n            {\r\n                if (endcluster2[textline][textcount] == '\\0')\r\n                {\r\n                    textcount = 0;\r\n                    textline++;\r\n\r\n                    if (textline >= 11)//wait all text\r\n                        finalestage = F_STAGE_SCROLLTEXT;\r\n                }\r\n                else\r\n                {\r\n                    D_strncpy(text_array, endcluster2[textline], textcount);\r\n                }\r\n                text_array[textcount] = '\\0';\r\n                textcount++;\r\n            }\r\n\t\t}\r\n\t\telse if(finalestage == F_STAGE_SCROLLTEXT)\r\n\t\t{\r\n\t\t\ttextypos--;\r\n\r\n\t\t\tif (textypos < -200)\r\n\t\t\t\tfinalestage = F_STAGE_CAST;\r\n\t\t}\r\n\t\telse if (finalestage == F_STAGE_CAST)\r\n\t\t{\r\n\t\t\tif (castdeath == false)\r\n\t\t\t{\r\n\t\t\t\tif ((buttons != oldbuttons) && (buttons & PAD_ACTION))\r\n\t\t\t\t{\r\n\t\t\t\t\tS_StartSound(NULL, sfx_shotgn);\r\n\r\n\t\t\t\t\t// go into death frame\r\n\t\t\t\t\tif (mobjinfo[castorder[castnum].type].deathsound)\r\n\t\t\t\t\t\tS_StartSound(NULL, mobjinfo[castorder[castnum].type].deathsound);\r\n\r\n\t\t\t\t\tcastdeath = true;\r\n\t\t\t\t\tcastframes = 0;\r\n\t\t\t\t\tcaststate = &states[mobjinfo[castorder[castnum].type].deathstate];\r\n\t\t\t\t\tcasttics = caststate->tics;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t//test\r\n\t\t\t\t/*if ((buttons != oldbuttons))\r\n\t\t\t\t{\r\n\t\t\t\t    if(buttons & PAD_LEFT)\r\n                        castrotation = castrotation+1 & 7;\r\n                    else if(buttons & PAD_RIGHT)\r\n                        castrotation = castrotation-1 & 7;\r\n\t\t\t\t}*/\r\n\t\t\t}\r\n\r\n\t\t\tif (gametic > gamevbls)\r\n\t\t\t{\r\n\t\t\t\tif (castdeath && caststate->nextstate == S_NULL)\r\n\t\t\t\t{\r\n\t\t\t\t\t/* switch from deathstate to next monster */\r\n\t\t\t\t\tcastnum++;\r\n\t\t\t\t\tcastdeath = false;\r\n\r\n\t\t\t\t\tif (castorder[castnum].name == NULL)\r\n\t\t\t\t\t\tcastnum = 0;\r\n\r\n\t\t\t\t\tif (mobjinfo[castorder[castnum].type].seesound)\r\n\t\t\t\t\t\tS_StartSound(NULL, mobjinfo[castorder[castnum].type].seesound);\r\n\r\n\t\t\t\t\tcaststate = &states[mobjinfo[castorder[castnum].type].seestate];\r\n\t\t\t\t\tcastframes = 0;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t    /* advance state*/\r\n                    if (--casttics > 0)\r\n                        return ga_nothing;  /* not time to change state yet */\r\n\r\n                    /* sound hacks.... */\r\n                    switch (caststate->nextstate)\r\n                    {\r\n                        case S_PLAY_ATK2:\tsfx = sfx_dshtgn; break;\r\n                        case S_POSS_ATK2:\tsfx = sfx_pistol; break;\r\n                        case S_SPOS_ATK2:\tsfx = sfx_shotgn; break;\r\n                        //case S_VILE_ATK2:\tsfx = sfx_vilatk; break;\r\n                        case S_SKEL_FIST2:\tsfx = sfx_skeswg; break;\r\n                        case S_SKEL_FIST4:\tsfx = sfx_skepch; break;\r\n                        case S_SKEL_MISS2:\tsfx = sfx_skeatk; break;\r\n                        case S_FATT_ATK8:\r\n                        case S_FATT_ATK5:\r\n                        case S_FATT_ATK2:\tsfx = sfx_firsht; break;\r\n                        case S_CPOS_ATK2:\r\n                        case S_CPOS_ATK3:\r\n                        case S_CPOS_ATK4:\tsfx = sfx_pistol; break;\r\n                        case S_TROO_ATK3:\tsfx = sfx_claw; break;\r\n                        case S_SARG_ATK2:\tsfx = sfx_sgtatk; break;\r\n                        case S_BOSS_ATK2:\r\n                        case S_BOS2_ATK2:\r\n                        case S_HEAD_ATK2:\tsfx = sfx_firsht; break;\r\n                        case S_SKULL_ATK2:\tsfx = sfx_sklatk; break;\r\n                        case S_SPID_ATK2:\r\n                        case S_SPID_ATK3:\tsfx = sfx_pistol; break;\r\n                        case S_BSPI_ATK2:\tsfx = sfx_plasma; break;\r\n                        case S_CYBER_ATK2:\r\n                        case S_CYBER_ATK4:\r\n                        case S_CYBER_ATK6:\tsfx = sfx_rlaunc; break;\r\n                        case S_PAIN_ATK3:\tsfx = sfx_sklatk; break;\r\n                        default: sfx = 0; break;\r\n                    }\r\n\r\n                    if (sfx)\r\n                        S_StartSound(NULL, sfx);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tst = caststate->nextstate;\r\n\t\t\t\tcaststate = &states[st];\r\n\t\t\t\tcastframes++;\r\n\r\n\t\t\t\tif (castframes == 12)\r\n\t\t\t\t{   /* go into attack frame */\r\n\t\t\t\t\tif (castonmelee)\r\n\t\t\t\t\t\tcaststate = &states[mobjinfo[castorder[castnum].type].meleestate];\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tcaststate = &states[mobjinfo[castorder[castnum].type].missilestate];\r\n\r\n\t\t\t\t\tcastonmelee ^= 1;\r\n\r\n\t\t\t\t\tif (caststate == &states[S_NULL])\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (castonmelee)\r\n\t\t\t\t\t\t\tcaststate = &states[mobjinfo[castorder[castnum].type].meleestate];\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tcaststate = &states[mobjinfo[castorder[castnum].type].missilestate];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (castframes == 24 || caststate == &states[S_PLAY])\r\n\t\t\t\t{\r\n\t\t\t\t\tcaststate = &states[mobjinfo[castorder[castnum].type].seestate];\r\n\t\t\t\t\tcastframes = 0;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcasttics = caststate->tics;\r\n\t\t\t\tif (casttics == -1)\r\n\t\t\t\t\tcasttics = TICRATE;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn ga_nothing;\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= Cast_Drawer\r\n=\r\n=================\r\n*/\r\nvoid Cast_Drawer(void)//L8003E098()\r\n{\r\n\tspritedef_t*\tsprdef;\r\n\tspriteframe_t*\tsprframe;\r\n\tint\t\t\tlump;\r\n\tboolean\t\tflip;\r\n\tint i, xpos, ypos;\r\n\tpsxobj_t *sprite;\r\n\r\n    POLY_FT4 *spritepoly = (POLY_FT4*) getScratchAddr(128);//1F800200\r\n\r\n\tNextTextureCacheIdx();\r\n\r\n\tDrawStaticImage(&demonpic, 0, 0, palette[0]);\r\n\r\n\tif (finalestage <= (F_STAGE_TEXT + F_STAGE_SCROLLTEXT))\r\n\t{\r\n\t\typos = textypos;\r\n\t\tfor (i = 0; i < textline; i++)\r\n\t\t{\r\n\t\t\tST_DrawText(-1, ypos, endcluster2[i]);\r\n\t\t\typos += 14;\r\n\t\t}\r\n\r\n\t\tST_DrawText(-1, ypos, text_array);\r\n\t}\r\n\telse if (finalestage == F_STAGE_CAST)\r\n\t{\r\n\t\t// draw the current frame in the middle of the screen\r\n\t\tsprdef = &sprites[caststate->sprite];\r\n\t\tsprframe = &sprdef->spriteframes[caststate->frame & FF_FRAMEMASK];\r\n\t\tlump = sprframe->lump[0];\r\n\t\tflip = (boolean)sprframe->flip[0];\r\n\r\n\t\t//lump = sprframe->lump[castrotation];\r\n\t\t//flip = (boolean)sprframe->flip[castrotation];\r\n\r\n\t\tsprite = &texsprites[lump - firstsprite];\r\n\t\tTextureCache(sprite);\r\n\r\n\t\tsetPolyFT4(spritepoly);\r\n\t\tsetShadeTex(spritepoly, 1);\r\n\t\tspritepoly->clut = palette[0];\r\n\t\tspritepoly->tpage = sprite->vtpage;\r\n\r\n\t\typos = 180 - sprite->y;\r\n\r\n\t\tif (!flip)\r\n\t\t{\r\n\t\t\t//setUV4(p,_u0,_v0,_u1,_v1,_u2,_v2,_u3,_v3)\r\n            setUV4(spritepoly,\r\n                   sprite->vramx,                   sprite->vramy,\r\n                   sprite->vramx + sprite->w + -1,  sprite->vramy,\r\n                   sprite->vramx,                   sprite->vramy + sprite->h + -1,\r\n                   sprite->vramx + sprite->w + -1,  sprite->vramy + sprite->h + -1);\r\n\r\n            xpos = 128 - sprite->x;\r\n        }\r\n\t\telse\r\n\t\t{\r\n\t\t\t//setUV4(p,_u0,_v0,_u1,_v1,_u2,_v2,_u3,_v3)\r\n            setUV4(spritepoly,\r\n                   sprite->vramx + sprite->w + -1,  sprite->vramy,\r\n                   sprite->vramx,                   sprite->vramy,\r\n                   sprite->vramx + sprite->w + -1,  sprite->vramy + sprite->h + -1,\r\n                   sprite->vramx,                   sprite->vramy + sprite->h + -1);\r\n\r\n            xpos = sprite->x - (sprite->w - 128);\r\n\t\t}\r\n\r\n\t\t//setXY4(p,_x0,_y0,_x1,_y1,_x2,_y2,_x3,_y3)\r\n        setXY4(spritepoly,\r\n               xpos,                  ypos,\r\n               xpos + sprite->w,      ypos,\r\n               xpos,                  ypos + sprite->h,\r\n               xpos + sprite->w,      ypos + sprite->h);\r\n\r\n\t\tW_AddPrim(spritepoly);// add to order table\r\n\r\n\t\tST_DrawText(-1, 20, \"Cast Of Characters\");\r\n\t\tST_DrawText(-1, 208, castorder[castnum].name);\r\n\t}\r\n\r\n\tif (gamepaused)\r\n\t\tST_CheatDraw();\r\n\r\n\tUpdateDrawOTag();\r\n\tDrawRender();\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/g_game.c",
    "content": "/* G_game.c  */\r\n\r\n#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n\r\nvoid G_PlayerReborn (int player);\r\n\r\nvoid G_DoReborn (int playernum);\r\n\r\nvoid G_DoLoadLevel (void);\r\n\r\n\r\ngameaction_t    gameaction;                 //80077CE0 iGp000008d0\r\nskill_t         gameskill;                  //8007807C uGp00000c6c\r\nint             gamemap;                    //80077E74 uGp00000a64\r\nint\t\t\t\tnextmap;\t\t\t\t    //80077EC4 iGp00000ab4/* the map to go to after the stats */\r\n\r\ngametype_t\t\tnetgame;                    //80077E88 iGp00000a78\r\n\r\nboolean         playeringame[MAXPLAYERS];   //80077ED4 -> uGp00000ac4, 80077ED8 -> uGp00000ac8\r\nplayer_t        players[MAXPLAYERS];        //800A85CC,800A86F8\r\n\r\nint             consoleplayer;          /* player taking events and displaying  */\r\nint             displayplayer;          /* view being displayed  */\r\nint             gametic;\r\nint             totalkills, totalitems, totalsecret;    /* for intermission  */\r\n\r\n//char            demoname[32];\r\nboolean         demorecording;          //80077FD4, uGp00000bc4\r\nboolean         demoplayback;           //80077EAC, uGp00000a9c\r\n\r\n//Hmm por que funciona aqui??\r\nmapthing_t\tdeathmatchstarts[10], *deathmatch_p;//80097e4c, 80077E8C\r\nmapthing_t\tplayerstarts[MAXPLAYERS];//800a8c60\r\n\r\n/*\r\n==============\r\n=\r\n= G_DoLoadLevel\r\n=\r\n==============\r\n*/\r\n\r\nvoid G_DoLoadLevel (void) //L80012E04()\r\n{\r\n\tint i;\r\n\r\n\tP_LoadingPlaque(&loadingpic, 95, 109, palette[16]);\r\n    S_Lcd_Load(gamemap);\r\n\r\n\tfor (i = 0; i < MAXPLAYERS; i++)\r\n\t{\r\n\t\tif (playeringame[i])\r\n\t\t{\r\n\t\t\tif ((gameaction == ga_restart) || (gameaction == ga_warped))\r\n\t\t\t\tplayers[i].playerstate = PST_REBORN;\r\n\t\t\telse if (players[i].playerstate == PST_DEAD)\r\n\t\t\t\tplayers[i].playerstate = PST_REBORN;\r\n\t\t}\r\n\t}\r\n\r\n\tP_SetupLevel(gamemap, gameskill);\r\n\tZ_CheckHeap(mainzone);\r\n\tgameaction = ga_nothing;\r\n\t//printf(\"G_DoLoadLevel\");\r\n}\r\n\r\n\r\n/*\r\n==============================================================================\r\n\r\n\t\t\t\t\t\tPLAYER STRUCTURE FUNCTIONS\r\n\r\nalso see P_SpawnPlayer in P_Mobj\r\n==============================================================================\r\n*/\r\n\r\n/*\r\n====================\r\n=\r\n= G_PlayerFinishLevel\r\n=\r\n= Can when a player completes a level\r\n====================\r\n*/\r\n\r\nvoid G_PlayerFinishLevel (int player)//L80012ED4()\r\n{\r\n\tplayer_t *p;\r\n\r\n\tp = &players[player];\r\n\r\n\tD_memset (p->powers, 0, sizeof (p->powers));\r\n\tD_memset (p->cards, 0, sizeof (p->cards));\r\n\tp->mo->flags &= ~(MF_BLENDMASK1|MF_BLENDMASK2|MF_BLENDMASK3); /* cancel invisibility  */ //PC DOOM ~MF_SHADOW\r\n\tp->extralight = 0;                      /* cancel gun flashes  */\r\n\tp->fixedcolormap = 0;                   /* cancel ir gogles  */\r\n\tp->damagecount = 0;                     /* no palette changes  */\r\n\tp->bonuscount = 0;\r\n}\r\n\r\n/*\r\n====================\r\n=\r\n= G_PlayerReborn\r\n=\r\n= Called after a player dies\r\n= almost everything is cleared and initialized\r\n====================\r\n*/\r\n\r\nvoid G_PlayerReborn (int player) //L80012F5C()\r\n{\r\n\tplayer_t *p;\r\n\tint i;\r\n\tint frags, kills, items, secrets;\r\n\r\n\tp = &players[player];\r\n\tfrags = p->frags;\r\n\tkills = p->killcount;\r\n\titems = p->itemcount;\r\n\tsecrets = p->secretcount;\r\n\tD_memset(p, 0, sizeof(*p));\r\n\tp->health = MAXHEALTH;\r\n\tp->usedown = p->attackdown = true; // don't do anything immediately\r\n\tp->playerstate = PST_LIVE;\r\n\tp->readyweapon = p->pendingweapon = wp_pistol;\r\n\tp->weaponowned[wp_fist] = true;\r\n\tp->weaponowned[wp_pistol] = true;\r\n\tp->ammo[am_clip] = 50;\r\n\tp->frags = frags;\r\n\tp->killcount = kills;\r\n\tp->itemcount = items;\r\n\tp->secretcount = secrets;\r\n\r\n\tfor (i = 0; i < NUMAMMO; i++)\r\n\t\tp->maxammo[i] = maxammo[i];\r\n}\r\n\r\n/*\r\n====================\r\n=\r\n= G_CheckSpot\r\n=\r\n= Returns false if the player cannot be respawned at the given mapthing_t spot\r\n= because something is occupying it\r\n====================\r\n*/\r\n\r\nvoid P_SpawnPlayer (mapthing_t *mthing);\r\n\r\n#if 0\r\nboolean G_CheckSpot (int playernum, mapthing_t *mthing)\r\n{\r\n\tfixed_t         x,y;\r\n\tsubsector_t *ss;\r\n\tint                     an;\r\n\tmobj_t\t\t*mo;\r\n\r\n\tx = mthing->x << FRACBITS;\r\n\ty = mthing->y << FRACBITS;\r\n\r\n\tif (!P_CheckPosition (players[playernum].mo, x, y) )\r\n\t\treturn false;\r\n\r\n\tss = R_PointInSubsector (x,y);\r\n\tan = ( ANG45 * (mthing->angle/45) ) >> ANGLETOFINESHIFT;\r\n\r\n/* spawn a teleport fog  */\r\n\tmo = P_SpawnMobj (x+20*finecosine[an], y+20*finesine[an], ss->sector->floorheight\r\n\t, MT_TFOG);\r\n\tS_StartSound (mo, sfx_telept);\r\n\r\n\treturn true;\r\n}\r\n#endif\r\n\r\n/*\r\n====================\r\n=\r\n= G_DeathMatchSpawnPlayer\r\n=\r\n= Spawns a player at one of the random death match spots\r\n= called at level load and each death\r\n====================\r\n*/\r\n\r\n#if 0\r\nvoid G_DeathMatchSpawnPlayer (int playernum)\r\n{\r\n\tint             i,j;\r\n\tint\t\t\t\tselections;\r\n\r\n\tselections = deathmatch_p - deathmatchstarts;\r\n\tif (selections < 4)\r\n\t\tI_Error (\"Only %i deathmatch spots, 4 required\", selections);\r\n\r\n\tfor (j=0 ; j<20 ; j++)\r\n\t{\r\n\t\ti = P_Random()%selections;\r\n\t\tif (G_CheckSpot (playernum, &deathmatchstarts[i]) )\r\n\t\t{\r\n\t\t\tdeathmatchstarts[i].type = playernum+1;\r\n\t\t\tP_SpawnPlayer (&deathmatchstarts[i]);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\r\n/* no good spot, so the player will probably get stuck  */\r\n\tP_SpawnPlayer (&playerstarts[playernum]);\r\n}\r\n#endif\r\n\r\n/*\r\n====================\r\n=\r\n= G_DoReborn\r\n=\r\n====================\r\n*/\r\n\r\nvoid G_DoReborn (int playernum)//80013044\r\n{\r\n\tint i, j;\r\n\tint selections;\r\n\tfixed_t      x, y;\r\n\tsubsector_t *ss;\r\n\tunsigned int an;\r\n\tmobj_t      *mo;\r\n\tmapthing_t *mthing;\r\n\r\n\tif (!netgame)\r\n\t{\r\n\t\tgameaction = ga_died;\t\t\t/* reload the level from scratch  */\r\n\t\treturn;\r\n\t}\r\n\r\n\t/* */\r\n\t/* respawn this player while the other players keep going */\r\n\t/* */\r\n\tif (players[playernum].mo->player != 0)\r\n\t\tplayers[playernum].mo->player = NULL;   /* dissasociate the corpse  */\r\n\r\n\t/* */\r\n    /* default player spawn point */\r\n    /* */\r\n    mthing = &playerstarts[playernum];\r\n\r\n    /* */\r\n\t/* spawn at random spot if in death match  */\r\n\t/* */\r\n\tif (netgame == gt_deathmatch)\r\n\t{\r\n\t\tselections = (int)(deathmatch_p - deathmatchstarts);\r\n\t\tfor (j = 0; j < 16; j++)\r\n\t\t{\r\n\t\t\ti = P_Random() % selections;\r\n\r\n\t\t\tx = deathmatchstarts[i].x << FRACBITS;\r\n\t\t\ty = deathmatchstarts[i].y << FRACBITS;\r\n\r\n\t\t\tif (P_CheckPosition(players[playernum].mo, x, y))\r\n\t\t\t{\r\n\t\t\t\tmthing = &deathmatchstarts[i];\r\n\t\t\t\tmthing->type = playernum + 1;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\telse\r\n\t{\r\n\t\tx = playerstarts[playernum].x << FRACBITS;\r\n\t\ty = playerstarts[playernum].y << FRACBITS;\r\n\r\n\t\t/* */\r\n\t\t/* try to spawn at one of the other players spots */\r\n\t\t/* */\r\n\t\tif (!P_CheckPosition(players[playernum].mo, x, y))\r\n\t\t{\r\n\t\t\tfor (i = 0; i < MAXPLAYERS; i++)\r\n\t\t\t{\r\n\t\t\t\tx = playerstarts[i].x << FRACBITS;\r\n\t\t\t\ty = playerstarts[i].y << FRACBITS;\r\n\r\n\t\t\t\tif (P_CheckPosition(players[playernum].mo, x, y))\r\n\t\t\t\t{\r\n\t\t\t\t    mthing = &playerstarts[i];\r\n\t\t\t\t\tmthing->type = playernum + 1;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/* */\r\n\t/* he's going to be inside something.  Too bad. */\r\n\t/* */\r\n\tP_SpawnPlayer(mthing);\r\n\r\n\t/* */\r\n\t/* Restore all cooperative starts back to having their previous type, if we modified them. */\r\n    /* The co-op spawn logic assumes the type is correct for the corresponding player index. */\r\n\t/* */\r\n\tfor (i=0 ; i<MAXPLAYERS ; i++)\r\n    {\r\n        playerstarts[i].type = i+1;             /* restore  */\r\n    }\r\n\r\n\tx = mthing->x << FRACBITS;\r\n\ty = mthing->y << FRACBITS;\r\n\r\n\r\n\t/* */\r\n\t/* This mask wraps the fine angle for the map thing and restricts it to the 8 diagonal directions */\r\n    /* */\r\n    #define FINE_ANGLE_MASK (FINEANGLES - (FINEANGLES / 8))\r\n\r\n\tss = R_PointInSubsector(x, y);\r\n\tan = ((ANG45 * (mthing->angle / 45)) >> ANGLETOFINESHIFT) & FINE_ANGLE_MASK;\r\n\r\n\t/* */\r\n\t/* spawn a teleport fog */\r\n\t/* */\r\n\tmo = P_SpawnMobj(x + 20 * finecosine[an], y + 20 * finesine[an], ss->sector->floorheight, MT_TFOG);\r\n\tS_StartSound(mo, sfx_telept);\r\n}\r\n\r\n\r\n/*\r\n====================\r\n=\r\n= G_CompleteLevel\r\n=\r\n====================\r\n*/\r\n\r\nvoid G_CompleteLevel (void)//80013358\r\n{\r\n\tgameaction = ga_completed;\r\n}\r\n\r\n/*============================================================================  */\r\n\r\n/*\r\n====================\r\n=\r\n= G_InitNew\r\n=\r\n====================\r\n*/\r\n\r\nextern mobj_t emptymobj;//0x800a9c14\r\nboolean restarlevel; //80077E20, uGp00000a10\r\n\r\nvoid G_InitNew (skill_t skill, int map, gametype_t gametype) //L80013368()\r\n{\r\n\tint             i;\r\n\r\n\t//printf (\"G_InitNew, skill %d, map %d\\n\", skill, map);\r\n\r\n\trestarlevel = false;\r\n\tV_PagFlags &= 1;\r\n\tValloc_Init();\r\n\tZ_FreeTags(mainzone, (PU_LEVEL | PU_LEVSPEC | PU_ANIMATION | PU_CACHE));\r\n\tM_ClearRandom ();\r\n\r\n/* force players to be initialized upon first level load          */\r\n\t//for (i=0 ; i<MAXPLAYERS ; i++)\r\n\tfor (i=(MAXPLAYERS-1) ; i >= 0 ; i--)\r\n    {\r\n\t\tplayers[i].playerstate = PST_REBORN;\r\n    }\r\n\r\n/* these may be reset by I_NetSetup */\r\n\tgamemap = map;\r\n\tnetgame = gametype;\r\n\tgameskill = skill;\r\n\r\n\tD_memset(&emptymobj, 0, sizeof(emptymobj));\r\n\tplayers[0].mo = players[1].mo = &emptymobj;\t/* for net consistancy checks */\r\n\r\n\tplayeringame[0] = true;\r\n\tif (netgame == gt_single)\r\n\t{\r\n\t    playeringame[1] = false;\r\n\t\tBT_DATA[0] = (buttons_t *)ActualConfiguration;\r\n\t}\r\n\telse if (netgame <= gt_deathmatch)\r\n\t{\r\n\t\tplayeringame[1] = true;\r\n\t}\r\n\r\n\tdemorecording = false;\r\n\tdemoplayback = false;\r\n\r\n\tif (skill == sk_nightmare)\r\n\t{\r\n\t\tstates[S_SARG_ATK1].tics = 2;\r\n\t\tstates[S_SARG_ATK2].tics = 2;\r\n\t\tstates[S_SARG_ATK3].tics = 2;\r\n\t\tmobjinfo[MT_SERGEANT].speed = 15;\r\n\r\n\t\tmobjinfo[MT_BRUISERSHOT].speed = 40*FRACUNIT;\r\n\t\tmobjinfo[MT_HEADSHOT].speed = 40*FRACUNIT;\r\n\t\tmobjinfo[MT_TROOPSHOT].speed = 40*FRACUNIT;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tstates[S_SARG_ATK1].tics = 4;\r\n\t\tstates[S_SARG_ATK2].tics = 4;\r\n\t\tstates[S_SARG_ATK3].tics = 4;\r\n\t\tmobjinfo[MT_SERGEANT].speed = 10;\r\n\r\n\t\tmobjinfo[MT_BRUISERSHOT].speed = 30*FRACUNIT;\r\n\t\tmobjinfo[MT_HEADSHOT].speed = 20*FRACUNIT;\r\n\t\tmobjinfo[MT_TROOPSHOT].speed = 20*FRACUNIT;\r\n\t}\r\n}\r\n\r\n/*============================================================================  */\r\n\r\n/*\r\n=================\r\n=\r\n= G_RunGame\r\n=\r\n= The game should allready have been initialized or laoded\r\n=================\r\n*/\r\n\r\nvoid G_RunGame (void)//L800134FC()\r\n{\r\n\tint\t\ti;\r\n\r\n\twhile (1)\r\n\t{\r\n        /* load a level */\r\n        G_DoLoadLevel ();\r\n\r\n        //printf(\"RUN P_Start\\n\");\r\n\t\t/* run a level until death or completion */\r\n\t\tMiniLoop (P_Start, P_Stop, P_Ticker, P_Drawer);\r\n\r\n\t\trestarlevel = false;\r\n\r\n        if (gameaction == ga_recorddemo)\r\n        {\r\n            G_RecordDemo();\r\n        }\r\n\r\n        if(gameaction == ga_warped)\r\n\t\t\tcontinue; // skip intermission\r\n\r\n        if ((gameaction == ga_died) || (gameaction == ga_restart))\r\n        {\r\n            restarlevel = true;\r\n\t\t\tcontinue;\t\t\t/* died, so restart the level */\r\n        }\r\n\r\n        /* free all animation states graphics*/\r\n        V_PagFlags &= 1;\r\n        Z_FreeTags(mainzone, PU_ANIMATION);\r\n\r\n        if (gameaction == ga_exitdemo)\r\n            return;\r\n\r\n        /* run a stats intermission */\r\n        MiniLoop(IN_Start,IN_Stop,IN_Ticker,IN_Drawer);\r\n\r\n        if ((!netgame && (gamemap == 30)) && (nextmap == 31))\r\n        {\r\n            /* run the finale if needed */\r\n            MiniLoop(END1_Start,END1_Stop,END1_Ticker,END1_Drawer);\r\n\r\n            if(gameaction == ga_warped)\r\n                continue; // skip intermission\r\n\r\n            if(gameaction == ga_restart)\r\n                continue;\r\n            else\r\n            {\r\n                if (gameaction != ga_exitdemo)\r\n                    startmap = 2;\r\n                return;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            if (nextmap > LASTLEVEL)\r\n            {\r\n                /* run the finale if needed */\r\n                MiniLoop(Cast_Start, Cast_Stop, Cast_Ticker, Cast_Drawer);\r\n\r\n                if(gameaction == ga_warped)\r\n                    continue; // skip intermission\r\n\r\n                if(gameaction == ga_restart)\r\n                    continue;\r\n                else\r\n                    return;\r\n            }\r\n\r\n            gamemap = nextmap;\r\n        }\r\n\t}\r\n}\r\n\r\n\r\nint G_PlayDemoPtr (void)//(int *demo) L800136E8()\r\n{\r\n\tint\t\texit;\r\n\tint\t\tskill, map;\r\n\tint\t\tconfig[8];\r\n\r\n\tskill = BIGLONG(demo_p[0]);\r\n\tmap = BIGLONG(demo_p[1]);\r\n\tdemobuffer = demo_p + 2;\r\n\r\n\t//copy key configuration\r\n\tD_memcpy(config, ActualConfiguration, sizeof(config));\r\n\r\n\t//set new key configuration\r\n\tD_memcpy(ActualConfiguration, demobuffer, sizeof(config));\r\n\tdemobuffer += 8;\r\n\r\n\tG_InitNew (skill, map, gt_single);\r\n\tG_DoLoadLevel ();\r\n\tdemoplayback = true;\r\n\texit = MiniLoop (P_Start, P_Stop, P_Ticker, P_Drawer);\r\n\tdemoplayback = false;\r\n\r\n\t//restore key configuration\r\n\tD_memcpy(ActualConfiguration, config, sizeof(config));\r\n\r\n\tV_PagFlags &= 1;\r\n\tZ_FreeTags(mainzone, (PU_LEVEL | PU_LEVSPEC | PU_ANIMATION | PU_CACHE));\r\n\treturn exit;\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= G_RecordDemo\r\n=\r\n=================\r\n*/\r\n\r\nvoid G_RecordDemo (void)//8001380C\r\n{\r\n    #if 0\r\n\tdemo_p = demobuffer = Z_Malloc (0x8000, PU_STATIC, NULL);\r\n\r\n\t*demo_p++ = startskill;\r\n\t*demo_p++ = startmap;\r\n\r\n\tG_InitNew (startskill, startmap, gt_single);\r\n\tG_DoLoadLevel ();\r\n\tdemorecording = true;\r\n\tMiniLoop (P_Start, P_Stop, P_Ticker, P_Drawer);\r\n\tdemorecording = false;\r\n\r\n\tD_printf (\"w %x,%x\",demobuffer,demo_p);\r\n\r\n\twhile (1)\r\n\t{\r\n\t\tG_PlayDemoPtr (demobuffer);\r\n\tD_printf (\"w %x,%x\",demobuffer,demo_p);\r\n\t}\r\n    #endif\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/in_main.c",
    "content": "\n/* in_main.c -- intermission */\n#include \"doomdef.h\"\n#include \"st_main.h\"\r\n#include \"r_local.h\"\n\n#define\tKVALX\t\t\t172\n#define\tKVALY\t\t\t80\n#define\tIVALX\t\t\t172\n#define\tIVALY\t\t\t110\n#define\tSVALX\t\t\t172\n#define\tSVALY\t\t\t140\n#define\tFVALX\t\t\t230\n#define\tFVALY\t\t\t74\n\n#define\tPLAYERONEFACEX\t\t137\n#define\tPLAYERONEFACEY\t\t30\n#define\tPLAYERTWOFACEX\t\t217\n#define\tPLAYERTWOFACEY\t\t30\n\nextern int nextmap;\n\ntypedef struct pstats_s\n{\n\tint\t\tkillpercent;\n\tint\t\titempercent;\n\tint\t\tsecretpercent;\n\tint\t\tfragcount;\n} pstats_t;\n\r\n//psx\r\nchar mapnames[][32] =\r\n{\r\n\t//Ultimate Doom\r\n\t\"Hangar\",\r\n\t\"Plant\",\r\n\t\"Toxin Refinery\",\r\n\t\"Command Control\",\r\n\t\"Phobos Lab\",\r\n\t\"Central Processing\",\r\n\t\"Computer Station\",\r\n\t\"Phobos Anomaly\",\r\n\t\"Deimos Anomaly\",\r\n\t\"Containment Area\",\r\n\t\"Refinery\",\r\n\t\"Deimos Lab\",\r\n\t\"Command Center\",\r\n\t\"Halls of the Damned\",\r\n\t\"Spawning Vats\",\r\n\t\"Hell Gate\",\r\n\t\"Hell Keep\",\r\n\t\"Pandemonium\",\r\n\t\"House of Pain\",\r\n\t\"Unholy Cathedral\",\r\n\t\"Mt. Erebus\",\r\n\t\"Limbo\",\r\n\t\"Tower Of Babel\",\r\n\t\"Hell Beneath\",\r\n\t\"Perfect Hatred\",\r\n\t\"Sever The Wicked\",\r\n\t\"Unruly Evil\",\r\n\t\"Unto The Cruel\",\r\n\t\"Twilight Descends\",\r\n\t\"Threshold of Pain\",\r\n\t//Doom II\r\n\t\"Entryway\",\r\n\t\"Underhalls\",\r\n\t\"The Gantlet\",\r\n\t\"The Focus\",\r\n\t\"The Waste Tunnels\",\r\n\t\"The Crusher\",\r\n\t\"Dead Simple\",\r\n\t\"Tricks And Traps\",\r\n\t\"The Pit\",\r\n\t\"Refueling Base\",\r\n\t\"O of Destruction!\",\r\n\t\"The Factory\",\r\n\t\"The Inmost Dens\",\r\n\t\"Suburbs\",\r\n\t\"Tenements\",\r\n\t\"The Courtyard\",\r\n\t\"The Citadel\",\r\n\t\"Nirvana\",\r\n\t\"The Catacombs\",\r\n\t\"Barrels of Fun\",\r\n\t\"Bloodfalls\",\r\n\t\"The Abandoned Mines\",\r\n\t\"Monster Condo\",\r\n\t\"Redemption Denied\",\r\n\t//Secret Levels\r\n\t\"Fortress of Mystery\",\r\n\t\"The Military Base\",\r\n\t\"The Marshes\",\r\n\t\"The Mansion\",\r\n\t\"Club Doom\"\r\n};\n\npstats_t\tpstats[MAXPLAYERS];//0x80097a04\nint\t\t\tkillvalue[2], itemvalue[2], secretvalue[2], fragvalue[2];//800780C4,800780D0,80077E08,8007808C\n\r\n// used to accelerate or skip a stage\r\nint acceleratestage;//80078100|uGp00000cf0\r\n\r\nextern char *passwordChar;//80073B7C\r\nextern byte Passwordbuff[12];//0x80096388\r\nextern boolean doPassword;//80077A6C\r\n\r\n#if GH_UPDATES == 1\r\nextern int CurPasswordSlot;//80077A70 iGp00000660\r\n#endif // GH_UPDATES\r\n\r\nvoid IN_Start(void)//L8003C4D4()\r\n{\r\n\tint i, l;\r\n\r\n\tValloc_Init();\r\n\tImageToVram(&backpic, \"BACK\", 0);\r\n\r\n\tfor (i = 0; i < MAXPLAYERS; i++)\r\n\t{\r\n\t\tkillvalue[i] = itemvalue[i] = secretvalue[i] = fragvalue[i] = 0;\r\n\r\n\t\tif (totalkills)\r\n\t\t\tpstats[i].killpercent = (players[i].killcount * 100) / totalkills;\r\n\t\telse\r\n\t\t\tpstats[i].killpercent = 100;\r\n\r\n\t\tif (totalitems)\r\n\t\t\tpstats[i].itempercent = (players[i].itemcount * 100) / totalitems;\r\n\t\telse\r\n\t\t\tpstats[i].itempercent = 100;\r\n\r\n\t\tif (totalsecret)\r\n\t\t\tpstats[i].secretpercent = (players[i].secretcount * 100) / totalsecret;\r\n\t\telse\r\n\t\t\tpstats[i].secretpercent = 100;\r\n\r\n\t\tif (netgame == gt_deathmatch)\r\n\t\t\tpstats[i].fragcount = players[i].frags;\r\n\t}\r\n\r\n\tacceleratestage = 0;\r\n\tlast_ticon = ticon;\r\n\r\n\tif (nextmap < LASTLEVEL)\r\n\t{\r\n\t\tEncode_Password(Passwordbuff);\r\n\t\t#if GH_UPDATES == 1\r\n\t\t/* This causes passwords to be kept in the password selection menu and not deleted at the next level. */\r\n\t\tCurPasswordSlot = 10;\r\n\t\t#endif // GH_UPDATES\r\n\t}\r\n\r\n\tpsxcd_play_at_andloop(CD_TRACK[cdmusic_intermission],CDVolume,0,0,CD_TRACK[cdmusic_intermission],CDVolume,0,0);\r\n\tdo {} while (psxcd_elapsed_sectors() == 0);\r\n}\r\n\r\nvoid IN_Stop(int exit)//L8003C7D4()\r\n{\r\n\tIN_Drawer();\r\n\tpsxcd_stop();\r\n}\r\n\r\nint IN_Ticker(void)//L8003C7FC()\r\n{\r\n\tint i, j, playsound;\r\n\tint buttons, oldbuttons;\r\n\r\n\tif ((ticon - last_ticon) > 60)\r\n\t{\r\n\t\tfor (i = 0; i < MAXPLAYERS; i++)\r\n\t\t{\r\n\t\t\tbuttons = ticbuttons[i];\r\n\t\t\toldbuttons = oldticbuttons[i];\r\n\r\n\t\t\tif ((buttons != oldbuttons) && (buttons & PAD_ACTION))\r\n\t\t\t{\r\n                acceleratestage++;\r\n                if (acceleratestage == 1)\r\n                {\r\n                    for (j = 0; j < MAXPLAYERS; j++)\r\n                    {\r\n                        killvalue[j] = pstats[j].killpercent;\r\n                        itemvalue[j] = pstats[j].itempercent;\r\n                        secretvalue[j] = pstats[j].secretpercent;\r\n                        fragvalue[j] = pstats[j].fragcount;\r\n                    }\r\n                    S_StartSound(NULL, sfx_barexp);\r\n                }\r\n\r\n                if (acceleratestage > 1)\r\n                {\r\n                    S_StartSound(NULL, sfx_barexp);\r\n                    return ga_died;\r\n                }\r\n\t\t\t}\r\n\r\n\t\t\tif (netgame == gt_single)\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tplaysound = false;\r\n\r\n\t\tif (gamevbls >= gametic)\r\n\t\t\treturn ga_nothing;\r\n\r\n\t\tfor (i = 0; i < MAXPLAYERS; i++)\r\n\t\t{\r\n\t\t\tif (netgame != gt_deathmatch)\r\n\t\t\t{\r\n\t\t\t\tif (killvalue[i] < pstats[i].killpercent)\r\n\t\t\t\t{\r\n\t\t\t\t\tkillvalue[i] += 2;\r\n\t\t\t\t\tplaysound = true;\r\n\t\t\t\t\tif (killvalue[i] > pstats[i].killpercent)\r\n\t\t\t\t\t\tkillvalue[i] = pstats[i].killpercent;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (itemvalue[i] < pstats[i].itempercent)\r\n\t\t\t\t{\r\n\t\t\t\t\titemvalue[i] += 2;\r\n\t\t\t\t\tplaysound = true;\r\n\t\t\t\t\tif (itemvalue[i] > pstats[i].itempercent)\r\n\t\t\t\t\t\titemvalue[i] = pstats[i].itempercent;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (secretvalue[i] < pstats[i].secretpercent)\r\n\t\t\t\t{\r\n\t\t\t\t\tsecretvalue[i] += 2;\r\n\t\t\t\t\tplaysound = true;\r\n\t\t\t\t\tif (secretvalue[i] > pstats[i].secretpercent)\r\n\t\t\t\t\t\tsecretvalue[i] = pstats[i].secretpercent;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tif (pstats[i].fragcount < 0)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (pstats[i].fragcount < fragvalue[i])\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tfragvalue[i] -= 2;\r\n\t\t\t\t\t\tplaysound = true;\r\n\t\t\t\t\t\tif (pstats[i].fragcount > fragvalue[i])\r\n\t\t\t\t\t\t\tfragvalue[i] = pstats[i].fragcount;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tif (fragvalue[i] < pstats[i].fragcount)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tfragvalue[i] += 2;\r\n\t\t\t\t\t\tplaysound = true;\r\n\t\t\t\t\t\tif (fragvalue[i] > pstats[i].fragcount)\r\n\t\t\t\t\t\t\tfragvalue[i] = pstats[i].fragcount;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Play Sound sfx_barexp\r\n\t\tif (!playsound &&  (acceleratestage == 0))\r\n\t\t{\r\n            acceleratestage = 1;\r\n            S_StartSound(NULL, sfx_barexp);\r\n\t\t}\r\n\r\n\t\t// Play Sound sfx_pistol\r\n\t\tif (!(gametic & 1) && playsound)\r\n\t\t{\r\n            S_StartSound(NULL, sfx_pistol);\r\n\t\t}\r\n\t}\r\n\r\n\treturn ga_nothing;\r\n}\r\n\r\nvoid IN_SingleDrawer(void);\r\nvoid IN_CooperativeDrawer(void);\r\nvoid IN_DeathMachtDrawer(void);\r\n\r\nvoid IN_Drawer(void)//L8003CBE0()\r\n{\r\n\tNextTextureCacheIdx();\r\n\r\n\tif (netgame == gt_coop)\r\n\t\tIN_CooperativeDrawer();\r\n\telse if (netgame == gt_deathmatch)\r\n\t\tIN_DeathMachtDrawer();\r\n\telse\r\n\t\tIN_SingleDrawer();\r\n\r\n\tUpdateDrawOTag();\r\n\tDrawRender();\r\n}\r\n\r\n/* */\n/* Single intermision */\n/* */\r\nvoid IN_SingleDrawer(void)//L8003CC54()\r\n{\r\n\tint i;\r\n\tchar password[16];\r\n\r\n\tDrawStaticImage(&backpic, 0, 0, palette[0]);\r\n\r\n\tST_DrawText(-1, 20, mapnames[gamemap-1]);\r\n\r\n\tST_DrawText(-1, 36, \"Finished\");\r\n\r\n\tST_DrawText(57, 65, \"Kills\");\r\n\tST_DrawText(182, 65, \"%\");\r\n\tST_DrawValue(170, 65, killvalue[0]);\r\n\r\n\tST_DrawText(53, 91, \"Items\");\r\n\tST_DrawText(182, 91, \"%\");\r\n\tST_DrawValue(170, 91, itemvalue[0]);\r\n\r\n\tST_DrawText(26, 117, \"Secrets\");\r\n\tST_DrawText(182, 117, \"%\");\r\n\tST_DrawValue(170, 117, secretvalue[0]);\r\n\r\n\tif (nextmap < LASTLEVEL)\r\n\t{\r\n\t\tST_DrawText(-1, 145, \"Entering\");\r\n\t\tST_DrawText(-1, 161, mapnames[nextmap-1]);\r\n\r\n\t\tST_DrawText(-1, 187, \"Password\");\r\n\r\n\t\tfor (i = 0; i < 10; i++)\r\n\t\t{\r\n\t\t\tpassword[i] = passwordChar[Passwordbuff[i]];\r\n\t\t}\r\n\t\tpassword[i] = 0;\r\n\r\n\t\tST_DrawText(-1, 203, password);\r\n\t}\r\n}\r\n\r\n/* */\n/* Network Cooperative intermission */\n/* */\r\nvoid IN_CooperativeDrawer(void)//L8003CE24()\r\n{\r\n\tint i;\r\n\tchar password[16];\r\n\r\n\tDrawStaticImage(&backpic, 0, 0, palette[0]);\r\n\r\n\tDrawImage(statuspic.vtpage, palette[16], 139, 20, facedata[0].x, facedata[0].y, facedata[0].w, facedata[0].h);\r\n\tST_DrawText(130, 52, \"you\");\r\n\r\n\tDrawImage(statuspic.vtpage, palette[16], 213, 20, facedata[0].x, facedata[0].y, facedata[0].w, facedata[0].h);\r\n\tST_DrawText(208, 52, \"him\");\r\n\r\n\tST_DrawText(57, 79, \"Kills\");\r\n\tST_DrawText(155, 79, \"%\");\r\n\tST_DrawText(228, 79, \"%\");\r\n\tST_DrawValue(143, 79, killvalue[consoleplayer]);\r\n\tST_DrawValue(216, 79, killvalue[(consoleplayer == 0) ? 1 : 0]);\r\n\r\n\tST_DrawText(53, 101, \"Items\");\r\n\tST_DrawText(155, 101, \"%\");\r\n\tST_DrawText(228, 101, \"%\");\r\n\tST_DrawValue(143, 101, itemvalue[consoleplayer]);\r\n\tST_DrawValue(216, 101, itemvalue[(consoleplayer == 0) ? 1 : 0]);\r\n\r\n\tST_DrawText(26, 123, \"Secrets\");\r\n\tST_DrawText(155, 123, \"%\");\r\n\tST_DrawText(228, 123, \"%\");\r\n\tST_DrawValue(143, 123, secretvalue[consoleplayer]);\r\n\tST_DrawValue(216, 123, secretvalue[(consoleplayer == 0) ? 1 : 0]);\r\n\r\n\tif (nextmap < LASTLEVEL)\r\n\t{\r\n\t\tST_DrawText(-1, 149, \"Entering\");\r\n\t\tST_DrawText(-1, 165, mapnames[nextmap-1]);\r\n\r\n\t\tif (players[consoleplayer].health > 0)\r\n\t\t{\r\n\t\t\tST_DrawText(-1, 191, \"Password\");\r\n\r\n\t\t\tfor (i = 0; i < 10; i++)\r\n\t\t\t{\r\n\t\t\t\tpassword[i] = passwordChar[Passwordbuff[i]];\r\n\t\t\t}\r\n\t\t\tpassword[i] = 0;\r\n\r\n\t\t\tST_DrawText(-1, 207, password);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/* */\n/* Network Death Macht intermission */\n/* */\r\nvoid IN_DeathMachtDrawer(void)//L8003D1B8()\r\n{\r\n\tint i;\r\n\tfacedata_t *player1, *player2;\r\n\r\n\tDrawStaticImage(&backpic, 0, 0, palette[0]);\r\n\r\n\tST_DrawText(-1, 20, mapnames[gamemap-1]);\r\n\tST_DrawText(-1, 36, \"Finished\");\r\n\r\n\tif (fragvalue[1] < fragvalue[0])\r\n\t{\r\n\t\tif (consoleplayer == 0)\r\n\t\t{\r\n\t\t\tplayer1 = &facedata[EVILFACE];\r\n\t\t\tplayer2 = &facedata[DEADFACE];\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tplayer1 = &facedata[DEADFACE];\r\n\t\t\tplayer2 = &facedata[EVILFACE];\r\n\t\t}\r\n\t}\r\n\telse if (fragvalue[0] < fragvalue[1])\r\n\t{\r\n\t\tif (consoleplayer == 0)\r\n\t\t{\r\n\t\t\tplayer1 = &facedata[DEADFACE];\r\n\t\t\tplayer2 = &facedata[EVILFACE];\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tplayer1 = &facedata[EVILFACE];\r\n\t\t\tplayer2 = &facedata[DEADFACE];\r\n\t\t}\r\n\t}\r\n\telse if(fragvalue[1] == fragvalue[0])\r\n\t{\r\n\t\tplayer1 = &facedata[0];\r\n\t\tplayer2 = &facedata[0];\r\n\t}\r\n\r\n\tDrawImage(statuspic.vtpage, palette[16], 127, 70, player1->x, player1->y, player1->w, player1->h);\r\n\tST_DrawText(118, 102, \"you\");\r\n\r\n\tDrawImage(statuspic.vtpage, palette[16], 200, 70, player2->x, player2->y, player2->w, player2->h);\r\n\tST_DrawText(195, 102, \"him\");\r\n\r\n\tST_DrawText(35, 139, \"Frags\");\r\n\tST_DrawValue(133, 138, fragvalue[consoleplayer]);\r\n\tST_DrawValue(206, 138, fragvalue[(consoleplayer == 0) ? 1 : 0]);\r\n\r\n\tif (nextmap < LASTLEVEL)\r\n\t{\r\n\t\tST_DrawText(-1, 190, \"Entering\");\r\n\t\tST_DrawText(-1, 206, mapnames[nextmap-1]);\r\n\t}\r\n}\n"
  },
  {
    "path": "PSXDOOM/info.c",
    "content": "#include \"doomdef.h\"\r\n/* generated by multigen */\r\n\r\nchar *sprnames[NUMSPRITES] = {//800778B4\r\n\"TROO\",\"SHTG\",\"PUNG\",\"PISG\",\"PISF\",\"SHTF\",\"SHT2\",\"CHGG\",\"CHGF\",\"MISG\",\r\n\"MISF\",\"SAWG\",\"PLSG\",\"PLSF\",\"BFGG\",\"BFGF\",\"BLUD\",\"PUFF\",\"BAL1\",\"BAL2\",\r\n\"BAL7\",\"PLSS\",\"PLSE\",\"MISL\",\"BFS1\",\"BFE1\",\"BFE2\",\"TFOG\",\"IFOG\",\"PLAY\",\r\n\"POSS\",\"SPOS\",\"FATB\",\"FBXP\",\"SKEL\",\"MANF\",\"FATT\",\"CPOS\",\"SARG\",\"HEAD\",\r\n\"BOSS\",\"BOS2\",\"SKUL\",\"SPID\",\"BSPI\",\"APLS\",\"APBX\",\"CYBR\",\"PAIN\",\"ARM1\",\r\n\"ARM2\",\"BAR1\",\"BEXP\",\"FCAN\",\"BON1\",\"BON2\",\"BKEY\",\"RKEY\",\"YKEY\",\"BSKU\",\r\n\"RSKU\",\"YSKU\",\"STIM\",\"MEDI\",\"SOUL\",\"PINV\",\"PSTR\",\"PINS\",\"MEGA\",\"SUIT\",\r\n\"PMAP\",\"PVIS\",\"CLIP\",\"AMMO\",\"ROCK\",\"BROK\",\"CELL\",\"CELP\",\"SHEL\",\"SBOX\",\r\n\"BPAK\",\"BFUG\",\"MGUN\",\"CSAW\",\"LAUN\",\"PLAS\",\"SHOT\",\"SGN2\",\"COLU\",\"SMT2\",\r\n\"POL2\",\"POL5\",\"POL4\",\"POL1\",\"GOR2\",\"GOR3\",\"GOR4\",\"GOR5\",\"SMIT\",\"COL1\",\r\n\"COL2\",\"COL3\",\"COL4\",\"COL6\",\"CAND\",\"CBRA\",\"TRE1\",\"ELEC\",\"FSKU\",\"SMBT\",\r\n\"SMGT\",\"SMRT\",\"HANC\",\"BLCH\",\"HANL\",\"DED1\",\"DED2\",\"DED3\",\"DED4\",\"DED5\",\r\n\"DED6\",\"TLMP\",\"TLP2\",\"COL5\",\"CEYE\",\"TBLU\",\"TGRN\",\"TRED\",\"GOR1\",\"POL3\",\r\n\"POL6\",\"TRE2\",\"HDB1\",\"HDB2\",\"HDB3\",\"HDB4\",\"HDB5\",\"HDB6\",\"POB1\",\"POB2\",\r\n\"BRS1\"\r\n};\r\n\r\nvoid A_WeaponReady();\r\nvoid A_ReFire();\r\nvoid A_CheckReload();\r\nvoid A_Lower();\r\nvoid A_Raise();\r\nvoid A_GunFlash();\r\nvoid A_Punch();\r\nvoid A_Saw();\r\nvoid A_FireMissile();\r\nvoid A_FireBFG();\r\nvoid A_FirePlasma();\r\nvoid A_FirePistol();\r\nvoid A_FireShotgun();\r\nvoid A_FireShotgun2();\r\nvoid A_FireCGun();\r\nvoid A_Light0();\r\nvoid A_Light1();\r\nvoid A_Light2();\r\nvoid A_BFGSpray();\r\nvoid A_BFGsound();\r\nvoid A_OpenShotgun2();\r\nvoid A_LoadShotgun2();\r\nvoid A_CloseShotgun2();\r\n\r\nvoid A_Look();\r\nvoid A_Chase();\r\nvoid A_FaceTarget();\r\nvoid A_PosAttack();\r\nvoid A_SPosAttack();\r\nvoid A_CPosAttack();\r\nvoid A_CPosRefire();\r\nvoid A_SpidAttack();\r\nvoid A_SpidRefire();\r\nvoid A_BspiAttack();\r\nvoid A_TroopAttack();\r\nvoid A_SargAttack();\r\nvoid A_HeadAttack();\r\nvoid A_CyberAttack();\r\nvoid A_BruisAttack();\r\nvoid A_SkelMissile();\r\nvoid A_Tracer();\r\nvoid A_SkelWhoosh();\r\nvoid A_SkelFist();\r\nvoid A_FatRaise();\r\nvoid A_FatAttack1();\r\nvoid A_FatAttack2();\r\nvoid A_FatAttack3();\r\nvoid A_SkullAttack();\r\nvoid A_PainShootSkull();\r\nvoid A_PainAttack();\r\nvoid A_PainDie();\r\nvoid A_Scream();\r\nvoid A_XScream();\r\nvoid A_Pain();\r\nvoid A_Fall();\r\nvoid A_Explode();\r\nvoid A_BossDeath();\r\nvoid A_Hoof();\r\nvoid A_Metal();\r\nvoid A_BabyMetal();\r\n\r\nstate_t\tstates[NUMSTATES] = //80058BBC\r\n{\r\n\t{ SPR_TROO,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_NULL */\r\n\t{ SPR_SHTG,4,0,A_Light0,S_NULL,0,0 },\t\t\t\t/* S_LIGHTDONE */\r\n\t{ SPR_PUNG,0,1,A_WeaponReady,S_PUNCH,0,0 },\t\t\t/* S_PUNCH */\r\n\t{ SPR_PUNG,0,1,A_Lower,S_PUNCHDOWN,0,0 },\t\t\t/* S_PUNCHDOWN */\r\n\t{ SPR_PUNG,0,1,A_Raise,S_PUNCHUP,0,0 },\t\t\t\t/* S_PUNCHUP */\r\n\t{ SPR_PUNG,1,2,NULL,S_PUNCH2,0,0 },\t\t\t\t\t/* S_PUNCH1 */\r\n\t{ SPR_PUNG,2,2,A_Punch,S_PUNCH3,0,0 },\t\t\t\t/* S_PUNCH2 */\r\n\t{ SPR_PUNG,3,2,NULL,S_PUNCH4,0,0 },\t\t\t\t\t/* S_PUNCH3 */\r\n\t{ SPR_PUNG,2,2,NULL,S_PUNCH5,0,0 },\t\t\t\t\t/* S_PUNCH4 */\r\n\t{ SPR_PUNG,1,2,A_ReFire,S_PUNCH,0,0 },\t\t\t\t/* S_PUNCH5 */\r\n\t{ SPR_PISG,0,1,A_WeaponReady,S_PISTOL,0,0 },\t\t/* S_PISTOL */\r\n\t{ SPR_PISG,0,1,A_Lower,S_PISTOLDOWN,0,0 },\t\t\t/* S_PISTOLDOWN */\r\n\t{ SPR_PISG,0,1,A_Raise,S_PISTOLUP,0,0 },\t\t\t/* S_PISTOLUP */\r\n\t{ SPR_PISG,0,2,NULL,S_PISTOL2,0,0 },\t\t\t\t/* S_PISTOL1 */\r\n\t{ SPR_PISG,1,3,A_FirePistol,S_PISTOL3,0,0 },\t\t/* S_PISTOL2 */\r\n\t{ SPR_PISG,2,3,NULL,S_PISTOL4,0,0 },\t\t\t\t/* S_PISTOL3 */\r\n\t{ SPR_PISG,1,2,A_ReFire,S_PISTOL,0,0 },\t\t\t\t/* S_PISTOL4 */\r\n\t{ SPR_PISF,32768,3,A_Light1,S_LIGHTDONE,0,0 },\t\t/* S_PISTOLFLASH */\r\n\t{ SPR_SHTG,0,1,A_WeaponReady,S_SGUN,0,0 },\t\t\t/* S_SGUN */\r\n\t{ SPR_SHTG,0,1,A_Lower,S_SGUNDOWN,0,0 },\t\t\t/* S_SGUNDOWN */\r\n\t{ SPR_SHTG,0,1,A_Raise,S_SGUNUP,0,0 },\t\t\t\t/* S_SGUNUP */\r\n\t{ SPR_SHTG,0,2,NULL,S_SGUN2,0,0 },\t\t\t\t\t/* S_SGUN1 */\r\n\t{ SPR_SHTG,0,2,A_FireShotgun,S_SGUN3,0,0 },\t\t\t/* S_SGUN2 */\r\n\t{ SPR_SHTG,1,3,NULL,S_SGUN4,0,0 },\t\t\t\t\t/* S_SGUN3 */\r\n\t{ SPR_SHTG,2,2,NULL,S_SGUN5,0,0 },\t\t\t\t\t/* S_SGUN4 */\r\n\t{ SPR_SHTG,3,2,NULL,S_SGUN6,0,0 },\t\t\t\t\t/* S_SGUN5 */\r\n\t{ SPR_SHTG,2,2,NULL,S_SGUN7,0,0 },\t\t\t\t\t/* S_SGUN6 */\r\n\t{ SPR_SHTG,1,2,NULL,S_SGUN8,0,0 },\t\t\t\t\t/* S_SGUN7 */\r\n\t{ SPR_SHTG,0,2,NULL,S_SGUN9,0,0 },\t\t\t\t\t/* S_SGUN8 */\r\n\t{ SPR_SHTG,0,3,A_ReFire,S_SGUN,0,0 },\t\t\t\t/* S_SGUN9 */\r\n\t{ SPR_SHTF,32768,2,A_Light1,S_SGUNFLASH2,0,0 },\t\t/* S_SGUNFLASH1 */\r\n\t{ SPR_SHTF,32769,1,A_Light2,S_LIGHTDONE,0,0 },\t\t/* S_SGUNFLASH2 */\r\n\t{ SPR_SHT2,0,1,A_WeaponReady,S_DSGUN,0,0 },\t\t\t/* S_DSGUN */\r\n\t{ SPR_SHT2,0,1,A_Lower,S_DSGUNDOWN,0,0 },\t\t\t/* S_DSGUNDOWN */\r\n\t{ SPR_SHT2,0,1,A_Raise,S_DSGUNUP,0,0 },\t\t\t\t/* S_DSGUNUP */\r\n\t{ SPR_SHT2,0,2,NULL,S_DSGUN2,0,0 },\t\t\t\t\t/* S_DSGUN1 */\r\n\t{ SPR_SHT2,0,3,A_FireShotgun2,S_DSGUN3,0,0 },\t\t/* S_DSGUN2 */\r\n\t{ SPR_SHT2,1,3,NULL,S_DSGUN4,0,0 },\t\t\t\t\t/* S_DSGUN3 */\r\n\t{ SPR_SHT2,2,3,A_CheckReload,S_DSGUN5,0,0 },\t\t/* S_DSGUN4 */\r\n\t{ SPR_SHT2,3,3,A_OpenShotgun2,S_DSGUN6,0,0 },\t\t/* S_DSGUN5 */\r\n\t{ SPR_SHT2,4,3,NULL,S_DSGUN7,0,0 },\t\t\t\t\t/* S_DSGUN6 */\r\n\t{ SPR_SHT2,5,3,A_LoadShotgun2,S_DSGUN8,0,0 },\t\t/* S_DSGUN7 */\r\n\t{ SPR_SHT2,6,2,NULL,S_DSGUN9,0,0 },\t\t\t\t\t/* S_DSGUN8 */\r\n\t{ SPR_SHT2,7,2,A_CloseShotgun2,S_DSGUN10,0,0 },\t\t/* S_DSGUN9 */\r\n\t{ SPR_SHT2,0,2,A_ReFire,S_DSGUN,0,0 },\t\t\t\t/* S_DSGUN10 */\r\n\t{ SPR_SHT2,1,3,NULL,S_DSNR2,0,0 },\t\t\t\t\t/* S_DSNR1 */\r\n\t{ SPR_SHT2,0,1,NULL,S_DSGUNDOWN,0,0 },\t\t\t\t/* S_DSNR2 */\r\n\t{ SPR_SHT2,32776,2,A_Light1,S_DSGUNFLASH2,0,0 },\t/* S_DSGUNFLASH1 */\r\n\t{ SPR_SHT2,32777,2,A_Light2,S_LIGHTDONE,0,0 },\t\t/* S_DSGUNFLASH2 */\r\n\t{ SPR_CHGG,0,1,A_WeaponReady,S_CHAIN,0,0 },\t\t\t/* S_CHAIN */\r\n\t{ SPR_CHGG,0,1,A_Lower,S_CHAINDOWN,0,0 },\t\t\t/* S_CHAINDOWN */\r\n\t{ SPR_CHGG,0,1,A_Raise,S_CHAINUP,0,0 },\t\t\t\t/* S_CHAINUP */\r\n\t{ SPR_CHGG,0,2,A_FireCGun,S_CHAIN2,0,0 },\t\t\t/* S_CHAIN1 */\r\n\t{ SPR_CHGG,1,2,A_FireCGun,S_CHAIN3,0,0 },\t\t\t/* S_CHAIN2 */\r\n\t{ SPR_CHGG,1,0,A_ReFire,S_CHAIN,0,0 },\t\t\t\t/* S_CHAIN3 */\r\n\t{ SPR_CHGF,32768,3,A_Light1,S_LIGHTDONE,0,0 },\t\t/* S_CHAINFLASH1 */\r\n\t{ SPR_CHGF,32769,2,A_Light2,S_LIGHTDONE,0,0 },\t\t/* S_CHAINFLASH2 */\r\n\t{ SPR_MISG,0,1,A_WeaponReady,S_MISSILE,0,0 },\t\t/* S_MISSILE */\r\n\t{ SPR_MISG,0,1,A_Lower,S_MISSILEDOWN,0,0 },\t\t\t/* S_MISSILEDOWN */\r\n\t{ SPR_MISG,0,1,A_Raise,S_MISSILEUP,0,0 },\t\t\t/* S_MISSILEUP */\r\n\t{ SPR_MISG,1,4,A_GunFlash,S_MISSILE2,0,0 },\t\t\t/* S_MISSILE1 */\r\n\t{ SPR_MISG,1,6,A_FireMissile,S_MISSILE3,0,0 },\t\t/* S_MISSILE2 */\r\n\t{ SPR_MISG,1,0,A_ReFire,S_MISSILE,0,0 },\t\t\t/* S_MISSILE3 */\r\n\t{ SPR_MISF,32768,2,A_Light1,S_MISSILEFLASH2,0,0 },\t/* S_MISSILEFLASH1 */\r\n\t{ SPR_MISF,32769,2,NULL,S_MISSILEFLASH3,0,0 },\t\t/* S_MISSILEFLASH2 */\r\n\t{ SPR_MISF,32770,2,A_Light2,S_MISSILEFLASH4,0,0 },\t/* S_MISSILEFLASH3 */\r\n\t{ SPR_MISF,32771,2,A_Light2,S_LIGHTDONE,0,0 },\t\t/* S_MISSILEFLASH4 */\r\n\t{ SPR_SAWG,2,2,A_WeaponReady,S_SAWB,0,0 },\t\t\t/* S_SAW */\r\n\t{ SPR_SAWG,3,2,A_WeaponReady,S_SAW,0,0 },\t\t\t/* S_SAWB */\r\n\t{ SPR_SAWG,2,1,A_Lower,S_SAWDOWN,0,0 },\t\t\t\t/* S_SAWDOWN */\r\n\t{ SPR_SAWG,2,1,A_Raise,S_SAWUP,0,0 },\t\t\t\t/* S_SAWUP */\r\n\t{ SPR_SAWG,0,2,A_Saw,S_SAW2,0,0 },\t\t\t\t\t/* S_SAW1 */\r\n\t{ SPR_SAWG,1,2,A_Saw,S_SAW3,0,0 },\t\t\t\t\t/* S_SAW2 */\r\n\t{ SPR_SAWG,1,0,A_ReFire,S_SAW,0,0 },\t\t\t\t/* S_SAW3 */\r\n\t{ SPR_PLSG,0,1,A_WeaponReady,S_PLASMA,0,0 },\t\t/* S_PLASMA */\r\n\t{ SPR_PLSG,0,1,A_Lower,S_PLASMADOWN,0,0 },\t\t\t/* S_PLASMADOWN */\r\n\t{ SPR_PLSG,0,1,A_Raise,S_PLASMAUP,0,0 },\t\t\t/* S_PLASMAUP */\r\n\t{ SPR_PLSG,0,2,A_FirePlasma,S_PLASMA2,0,0 },\t\t/* S_PLASMA1 */\r\n\t{ SPR_PLSG,1,10,A_ReFire,S_PLASMA,0,0 },\t\t\t/* S_PLASMA2 */\r\n\t{ SPR_PLSF,32768,2,A_Light1,S_LIGHTDONE,0,0 },\t\t/* S_PLASMAFLASH1 */\r\n\t{ SPR_PLSF,32769,2,A_Light1,S_LIGHTDONE,0,0 },\t\t/* S_PLASMAFLASH2 */\r\n\t{ SPR_BFGG,0,1,A_WeaponReady,S_BFG,0,0 },\t\t\t/* S_BFG */\r\n\t{ SPR_BFGG,0,1,A_Lower,S_BFGDOWN,0,0 },\t\t\t\t/* S_BFGDOWN */\r\n\t{ SPR_BFGG,0,1,A_Raise,S_BFGUP,0,0 },\t\t\t\t/* S_BFGUP */\r\n\t{ SPR_BFGG,0,10,A_BFGsound,S_BFG2,0,0 },\t\t\t/* S_BFG1 */\r\n\t{ SPR_BFGG,1,5,A_GunFlash,S_BFG3,0,0 },\t\t\t\t/* S_BFG2 */\r\n\t{ SPR_BFGG,1,5,A_FireBFG,S_BFG4,0,0 },\t\t\t\t/* S_BFG3 */\r\n\t{ SPR_BFGG,1,10,A_ReFire,S_BFG,0,0 },\t\t\t\t/* S_BFG4 */\r\n\t{ SPR_BFGF,32768,5,A_Light1,S_BFGFLASH2,0,0 },\t\t/* S_BFGFLASH1 */\r\n\t{ SPR_BFGF,32769,3,A_Light2,S_LIGHTDONE,0,0 },\t\t/* S_BFGFLASH2 */\r\n\t{ SPR_BLUD,2,4,NULL,S_BLOOD2,0,0 },\t\t\t\t\t/* S_BLOOD1 */\r\n\t{ SPR_BLUD,1,4,NULL,S_BLOOD3,0,0 },\t\t\t\t\t/* S_BLOOD2 */\r\n\t{ SPR_BLUD,0,4,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_BLOOD3 */\r\n\t{ SPR_PUFF,32768,2,NULL,S_PUFF2,0,0 },\t\t\t\t/* S_PUFF1 */\r\n\t{ SPR_PUFF,1,2,NULL,S_PUFF3,0,0 },\t\t\t\t\t/* S_PUFF2 */\r\n\t{ SPR_PUFF,2,2,NULL,S_PUFF4,0,0 },\t\t\t\t\t/* S_PUFF3 */\r\n\t{ SPR_PUFF,3,2,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_PUFF4 */\r\n\t{ SPR_BAL1,32768,2,NULL,S_TBALL2,0,0 },\t\t\t\t/* S_TBALL1 */\r\n\t{ SPR_BAL1,32769,2,NULL,S_TBALL1,0,0 },\t\t\t\t/* S_TBALL2 */\r\n\t{ SPR_BAL1,32770,3,NULL,S_TBALLX2,0,0 },\t\t\t/* S_TBALLX1 */\r\n\t{ SPR_BAL1,32771,3,NULL,S_TBALLX3,0,0 },\t\t\t/* S_TBALLX2 */\r\n\t{ SPR_BAL1,32772,3,NULL,S_NULL,0,0 },\t\t\t\t/* S_TBALLX3 */\r\n\t{ SPR_BAL2,32768,2,NULL,S_RBALL2,0,0 },\t\t\t\t/* S_RBALL1 */\r\n\t{ SPR_BAL2,32769,2,NULL,S_RBALL1,0,0 },\t\t\t\t/* S_RBALL2 */\r\n\t{ SPR_BAL2,32770,3,NULL,S_RBALLX2,0,0 },\t\t\t/* S_RBALLX1 */\r\n\t{ SPR_BAL2,32771,3,NULL,S_RBALLX3,0,0 },\t\t\t/* S_RBALLX2 */\r\n\t{ SPR_BAL2,32772,3,NULL,S_NULL,0,0 },\t\t\t\t/* S_RBALLX3 */\r\n\t{ SPR_BAL7,32768,2,NULL,S_BRBALL2,0,0 },\t\t\t/* S_BRBALL1 */\r\n\t{ SPR_BAL7,32769,2,NULL,S_BRBALL1,0,0 },\t\t\t/* S_BRBALL2 */\r\n\t{ SPR_BAL7,32770,3,NULL,S_BRBALLX2,0,0 },\t\t\t/* S_BRBALLX1 */\r\n\t{ SPR_BAL7,32771,3,NULL,S_BRBALLX3,0,0 },\t\t\t/* S_BRBALLX2 */\r\n\t{ SPR_BAL7,32772,3,NULL,S_NULL,0,0 },\t\t\t\t/* S_BRBALLX3 */\r\n\t{ SPR_PLSS,32768,3,NULL,S_PLASBALL2,0,0 },\t\t\t/* S_PLASBALL */\r\n\t{ SPR_PLSS,32769,3,NULL,S_PLASBALL,0,0 },\t\t\t/* S_PLASBALL2 */\r\n\t{ SPR_PLSE,32768,2,NULL,S_PLASEXP2,0,0 },\t\t\t/* S_PLASEXP */\r\n\t{ SPR_PLSE,32769,2,NULL,S_PLASEXP3,0,0 },\t\t\t/* S_PLASEXP2 */\r\n\t{ SPR_PLSE,32770,2,NULL,S_PLASEXP4,0,0 },\t\t\t/* S_PLASEXP3 */\r\n\t{ SPR_PLSE,32771,2,NULL,S_PLASEXP5,0,0 },\t\t\t/* S_PLASEXP4 */\r\n\t{ SPR_PLSE,32772,2,NULL,S_NULL,0,0 },\t\t\t\t/* S_PLASEXP5 */\r\n\t{ SPR_MISL,32768,1,NULL,S_ROCKET,0,0 },\t\t\t\t/* S_ROCKET */\r\n\t{ SPR_BFS1,32768,2,NULL,S_BFGSHOT2,0,0 },\t\t\t/* S_BFGSHOT */\r\n\t{ SPR_BFS1,32769,2,NULL,S_BFGSHOT,0,0 },\t\t\t/* S_BFGSHOT2 */\r\n\t{ SPR_BFE1,32768,4,NULL,S_BFGLAND2,0,0 },\t\t\t/* S_BFGLAND */\r\n\t{ SPR_BFE1,32769,4,NULL,S_BFGLAND3,0,0 },\t\t\t/* S_BFGLAND2 */\r\n\t{ SPR_BFE1,32770,4,A_BFGSpray,S_BFGLAND4,0,0 },\t\t/* S_BFGLAND3 */\r\n\t{ SPR_BFE1,32771,4,NULL,S_BFGLAND5,0,0 },\t\t\t/* S_BFGLAND4 */\r\n\t{ SPR_BFE1,32772,4,NULL,S_BFGLAND6,0,0 },\t\t\t/* S_BFGLAND5 */\r\n\t{ SPR_BFE1,32773,4,NULL,S_NULL,0,0 },\t\t\t\t/* S_BFGLAND6 */\r\n\t{ SPR_BFE2,32768,4,NULL,S_BFGEXP2,0,0 },\t\t\t/* S_BFGEXP */\r\n\t{ SPR_BFE2,32769,4,NULL,S_BFGEXP3,0,0 },\t\t\t/* S_BFGEXP2 */\r\n\t{ SPR_BFE2,32770,4,NULL,S_BFGEXP4,0,0 },\t\t\t/* S_BFGEXP3 */\r\n\t{ SPR_BFE2,32771,4,NULL,S_NULL,0,0 },\t\t\t\t/* S_BFGEXP4 */\r\n\t{ SPR_MISL,32769,4,A_Explode,S_EXPLODE2,0,0 },\t\t/* S_EXPLODE1 */\r\n\t{ SPR_MISL,32770,3,NULL,S_EXPLODE3,0,0 },\t\t\t/* S_EXPLODE2 */\r\n\t{ SPR_MISL,32771,2,NULL,S_NULL,0,0 },\t\t\t\t/* S_EXPLODE3 */\r\n\t{ SPR_TFOG,32768,3,NULL,S_TFOG01,0,0 },\t\t\t\t/* S_TFOG */\r\n\t{ SPR_TFOG,32769,3,NULL,S_TFOG02,0,0 },\t\t\t\t/* S_TFOG01 */\r\n\t{ SPR_TFOG,32768,3,NULL,S_TFOG2,0,0 },\t\t\t\t/* S_TFOG02 */\r\n\t{ SPR_TFOG,32769,3,NULL,S_TFOG3,0,0 },\t\t\t\t/* S_TFOG2 */\r\n\t{ SPR_TFOG,32770,3,NULL,S_TFOG4,0,0 },\t\t\t\t/* S_TFOG3 */\r\n\t{ SPR_TFOG,32771,3,NULL,S_TFOG5,0,0 },\t\t\t\t/* S_TFOG4 */\r\n\t{ SPR_TFOG,32772,3,NULL,S_TFOG6,0,0 },\t\t\t\t/* S_TFOG5 */\r\n\t{ SPR_TFOG,32773,3,NULL,S_TFOG7,0,0 },\t\t\t\t/* S_TFOG6 */\r\n\t{ SPR_TFOG,32774,3,NULL,S_TFOG8,0,0 },\t\t\t\t/* S_TFOG7 */\r\n\t{ SPR_TFOG,32775,3,NULL,S_TFOG9,0,0 },\t\t\t\t/* S_TFOG8 */\r\n\t{ SPR_TFOG,32776,3,NULL,S_TFOG10,0,0 },\t\t\t\t/* S_TFOG9 */\r\n\t{ SPR_TFOG,32777,3,NULL,S_NULL,0,0 },\t\t\t\t/* S_TFOG10 */\r\n\t{ SPR_IFOG,32768,3,NULL,S_IFOG01,0,0 },\t\t\t\t/* S_IFOG */\r\n\t{ SPR_IFOG,32769,3,NULL,S_IFOG02,0,0 },\t\t\t\t/* S_IFOG01 */\r\n\t{ SPR_IFOG,32768,3,NULL,S_IFOG2,0,0 },\t\t\t\t/* S_IFOG02 */\r\n\t{ SPR_IFOG,32769,3,NULL,S_IFOG3,0,0 },\t\t\t\t/* S_IFOG2 */\r\n\t{ SPR_IFOG,32770,3,NULL,S_IFOG4,0,0 },\t\t\t\t/* S_IFOG3 */\r\n\t{ SPR_IFOG,32771,3,NULL,S_IFOG5,0,0 },\t\t\t\t/* S_IFOG4 */\r\n\t{ SPR_IFOG,32772,3,NULL,S_NULL,0,0 },\t\t\t\t/* S_IFOG5 */\r\n\t{ SPR_PLAY,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_PLAY */\r\n\t{ SPR_PLAY,0,2,NULL,S_PLAY_RUN2,0,0 },\t\t\t\t/* S_PLAY_RUN1 */\r\n\t{ SPR_PLAY,1,2,NULL,S_PLAY_RUN3,0,0 },\t\t\t\t/* S_PLAY_RUN2 */\r\n\t{ SPR_PLAY,2,2,NULL,S_PLAY_RUN4,0,0 },\t\t\t\t/* S_PLAY_RUN3 */\r\n\t{ SPR_PLAY,3,2,NULL,S_PLAY_RUN1,0,0 },\t\t\t\t/* S_PLAY_RUN4 */\r\n\t{ SPR_PLAY,4,2,NULL,S_PLAY_ATK2,0,0 },\t\t\t\t/* S_PLAY_ATK1 */\r\n\t{ SPR_PLAY,32773,4,NULL,S_PLAY,0,0 },\t\t\t\t/* S_PLAY_ATK2 */\r\n\t{ SPR_PLAY,6,2,NULL,S_PLAY_PAIN2,0,0 },\t\t\t\t/* S_PLAY_PAIN */\r\n\t{ SPR_PLAY,6,2,A_Pain,S_PLAY,0,0 },\t\t\t\t\t/* S_PLAY_PAIN2 */\r\n\t{ SPR_PLAY,7,5,NULL,S_PLAY_DIE2,0,0 },\t\t\t\t/* S_PLAY_DIE1 */\r\n\t{ SPR_PLAY,8,5,A_Scream,S_PLAY_DIE3,0,0 },\t\t\t/* S_PLAY_DIE2 */\r\n\t{ SPR_PLAY,9,5,A_Fall,S_PLAY_DIE4,0,0 },\t\t\t/* S_PLAY_DIE3 */\r\n\t{ SPR_PLAY,10,5,NULL,S_PLAY_DIE5,0,0 },\t\t\t\t/* S_PLAY_DIE4 */\r\n\t{ SPR_PLAY,11,5,NULL,S_PLAY_DIE6,0,0 },\t\t\t\t/* S_PLAY_DIE5 */\r\n\t{ SPR_PLAY,12,5,NULL,S_PLAY_DIE7,0,0 },\t\t\t\t/* S_PLAY_DIE6 */\r\n\t{ SPR_PLAY,13,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_PLAY_DIE7 */\r\n\t{ SPR_PLAY,14,2,NULL,S_PLAY_XDIE2,0,0 },\t\t\t/* S_PLAY_XDIE1 */\r\n\t{ SPR_PLAY,15,2,A_XScream,S_PLAY_XDIE3,0,0 },\t\t/* S_PLAY_XDIE2 */\r\n\t{ SPR_PLAY,16,2,A_Fall,S_PLAY_XDIE4,0,0 },\t\t\t/* S_PLAY_XDIE3 */\r\n\t{ SPR_PLAY,17,2,NULL,S_PLAY_XDIE5,0,0 },\t\t\t/* S_PLAY_XDIE4 */\r\n\t{ SPR_PLAY,18,2,NULL,S_PLAY_XDIE6,0,0 },\t\t\t/* S_PLAY_XDIE5 */\r\n\t{ SPR_PLAY,19,2,NULL,S_PLAY_XDIE7,0,0 },\t\t\t/* S_PLAY_XDIE6 */\r\n\t{ SPR_PLAY,20,2,NULL,S_PLAY_XDIE8,0,0 },\t\t\t/* S_PLAY_XDIE7 */\r\n\t{ SPR_PLAY,21,2,NULL,S_PLAY_XDIE9,0,0 },\t\t\t/* S_PLAY_XDIE8 */\r\n\t{ SPR_PLAY,22,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_PLAY_XDIE9 */\r\n\t{ SPR_POSS,0,5,A_Look,S_POSS_STND2,0,0 },\t\t\t/* S_POSS_STND */\r\n\t{ SPR_POSS,1,5,A_Look,S_POSS_STND,0,0 },\t\t\t/* S_POSS_STND2 */\r\n\t{ SPR_POSS,0,2,A_Chase,S_POSS_RUN2,0,0 },\t\t\t/* S_POSS_RUN1 */\r\n\t{ SPR_POSS,0,2,A_Chase,S_POSS_RUN3,0,0 },\t\t\t/* S_POSS_RUN2 */\r\n\t{ SPR_POSS,1,2,A_Chase,S_POSS_RUN4,0,0 },\t\t\t/* S_POSS_RUN3 */\r\n\t{ SPR_POSS,1,2,A_Chase,S_POSS_RUN5,0,0 },\t\t\t/* S_POSS_RUN4 */\r\n\t{ SPR_POSS,2,2,A_Chase,S_POSS_RUN6,0,0 },\t\t\t/* S_POSS_RUN5 */\r\n\t{ SPR_POSS,2,2,A_Chase,S_POSS_RUN7,0,0 },\t\t\t/* S_POSS_RUN6 */\r\n\t{ SPR_POSS,3,2,A_Chase,S_POSS_RUN8,0,0 },\t\t\t/* S_POSS_RUN7 */\r\n\t{ SPR_POSS,3,2,A_Chase,S_POSS_RUN1,0,0 },\t\t\t/* S_POSS_RUN8 */\r\n\t{ SPR_POSS,4,5,A_FaceTarget,S_POSS_ATK2,0,0 },\t\t/* S_POSS_ATK1 */\r\n\t{ SPR_POSS,5,4,A_PosAttack,S_POSS_ATK3,0,0 },\t\t/* S_POSS_ATK2 */\r\n\t{ SPR_POSS,4,4,NULL,S_POSS_RUN1,0,0 },\t\t\t\t/* S_POSS_ATK3 */\r\n\t{ SPR_POSS,6,1,NULL,S_POSS_PAIN2,0,0 },\t\t\t\t/* S_POSS_PAIN */\r\n\t{ SPR_POSS,6,2,A_Pain,S_POSS_RUN1,0,0 },\t\t\t/* S_POSS_PAIN2 */\r\n\t{ SPR_POSS,7,2,NULL,S_POSS_DIE2,0,0 },\t\t\t\t/* S_POSS_DIE1 */\r\n\t{ SPR_POSS,8,3,A_Scream,S_POSS_DIE3,0,0 },\t\t\t/* S_POSS_DIE2 */\r\n\t{ SPR_POSS,9,2,A_Fall,S_POSS_DIE4,0,0 },\t\t\t/* S_POSS_DIE3 */\r\n\t{ SPR_POSS,10,3,NULL,S_POSS_DIE5,0,0 },\t\t\t\t/* S_POSS_DIE4 */\r\n\t{ SPR_POSS,11,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_POSS_DIE5 */\r\n\t{ SPR_POSS,12,2,NULL,S_POSS_XDIE2,0,0 },\t\t\t/* S_POSS_XDIE1 */\r\n\t{ SPR_POSS,13,3,A_XScream,S_POSS_XDIE3,0,0 },\t\t/* S_POSS_XDIE2 */\r\n\t{ SPR_POSS,14,2,A_Fall,S_POSS_XDIE4,0,0 },\t\t\t/* S_POSS_XDIE3 */\r\n\t{ SPR_POSS,15,3,NULL,S_POSS_XDIE5,0,0 },\t\t\t/* S_POSS_XDIE4 */\r\n\t{ SPR_POSS,16,2,NULL,S_POSS_XDIE6,0,0 },\t\t\t/* S_POSS_XDIE5 */\r\n\t{ SPR_POSS,17,3,NULL,S_POSS_XDIE7,0,0 },\t\t\t/* S_POSS_XDIE6 */\r\n\t{ SPR_POSS,18,2,NULL,S_POSS_XDIE8,0,0 },\t\t\t/* S_POSS_XDIE7 */\r\n\t{ SPR_POSS,19,3,NULL,S_POSS_XDIE9,0,0 },\t\t\t/* S_POSS_XDIE8 */\r\n\t{ SPR_POSS,20,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_POSS_XDIE9 */\r\n\t{ SPR_SPOS,0,5,A_Look,S_SPOS_STND2,0,0 },\t\t\t/* S_SPOS_STND */\r\n\t{ SPR_SPOS,1,5,A_Look,S_SPOS_STND,0,0 },\t\t\t/* S_SPOS_STND2 */\r\n\t{ SPR_SPOS,0,1,A_Chase,S_SPOS_RUN2,0,0 },\t\t\t/* S_SPOS_RUN1 */\r\n\t{ SPR_SPOS,0,2,A_Chase,S_SPOS_RUN3,0,0 },\t\t\t/* S_SPOS_RUN2 */\r\n\t{ SPR_SPOS,1,1,A_Chase,S_SPOS_RUN4,0,0 },\t\t\t/* S_SPOS_RUN3 */\r\n\t{ SPR_SPOS,1,2,A_Chase,S_SPOS_RUN5,0,0 },\t\t\t/* S_SPOS_RUN4 */\r\n\t{ SPR_SPOS,2,1,A_Chase,S_SPOS_RUN6,0,0 },\t\t\t/* S_SPOS_RUN5 */\r\n\t{ SPR_SPOS,2,2,A_Chase,S_SPOS_RUN7,0,0 },\t\t\t/* S_SPOS_RUN6 */\r\n\t{ SPR_SPOS,3,1,A_Chase,S_SPOS_RUN8,0,0 },\t\t\t/* S_SPOS_RUN7 */\r\n\t{ SPR_SPOS,3,2,A_Chase,S_SPOS_RUN1,0,0 },\t\t\t/* S_SPOS_RUN8 */\r\n\t{ SPR_SPOS,4,5,A_FaceTarget,S_SPOS_ATK2,0,0 },\t\t/* S_SPOS_ATK1 */\r\n\t{ SPR_SPOS,32773,5,A_SPosAttack,S_SPOS_ATK3,0,0 },\t/* S_SPOS_ATK2 */\r\n\t{ SPR_SPOS,4,5,NULL,S_SPOS_RUN1,0,0 },\t\t\t\t/* S_SPOS_ATK3 */\r\n\t{ SPR_SPOS,6,1,NULL,S_SPOS_PAIN2,0,0 },\t\t\t\t/* S_SPOS_PAIN */\r\n\t{ SPR_SPOS,6,2,A_Pain,S_SPOS_RUN1,0,0 },\t\t\t/* S_SPOS_PAIN2 */\r\n\t{ SPR_SPOS,7,2,NULL,S_SPOS_DIE2,0,0 },\t\t\t\t/* S_SPOS_DIE1 */\r\n\t{ SPR_SPOS,8,3,A_Scream,S_SPOS_DIE3,0,0 },\t\t\t/* S_SPOS_DIE2 */\r\n\t{ SPR_SPOS,9,2,A_Fall,S_SPOS_DIE4,0,0 },\t\t\t/* S_SPOS_DIE3 */\r\n\t{ SPR_SPOS,10,3,NULL,S_SPOS_DIE5,0,0 },\t\t\t\t/* S_SPOS_DIE4 */\r\n\t{ SPR_SPOS,11,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_SPOS_DIE5 */\r\n\t{ SPR_SPOS,12,2,NULL,S_SPOS_XDIE2,0,0 },\t\t\t/* S_SPOS_XDIE1 */\r\n\t{ SPR_SPOS,13,3,A_XScream,S_SPOS_XDIE3,0,0 },\t\t/* S_SPOS_XDIE2 */\r\n\t{ SPR_SPOS,14,2,A_Fall,S_SPOS_XDIE4,0,0 },\t\t\t/* S_SPOS_XDIE3 */\r\n\t{ SPR_SPOS,15,3,NULL,S_SPOS_XDIE5,0,0 },\t\t\t/* S_SPOS_XDIE4 */\r\n\t{ SPR_SPOS,16,2,NULL,S_SPOS_XDIE6,0,0 },\t\t\t/* S_SPOS_XDIE5 */\r\n\t{ SPR_SPOS,17,3,NULL,S_SPOS_XDIE7,0,0 },\t\t\t/* S_SPOS_XDIE6 */\r\n\t{ SPR_SPOS,18,2,NULL,S_SPOS_XDIE8,0,0 },\t\t\t/* S_SPOS_XDIE7 */\r\n\t{ SPR_SPOS,19,3,NULL,S_SPOS_XDIE9,0,0 },\t\t\t/* S_SPOS_XDIE8 */\r\n\t{ SPR_SPOS,20,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_SPOS_XDIE9 */\r\n\t{ SPR_PUFF,1,2,NULL,S_SMOKE2,0,0 },\t\t\t\t\t/* S_SMOKE1 */\r\n\t{ SPR_PUFF,2,2,NULL,S_SMOKE3,0,0 },\t\t\t\t\t/* S_SMOKE2 */\r\n\t{ SPR_PUFF,1,2,NULL,S_SMOKE4,0,0 },\t\t\t\t\t/* S_SMOKE3 */\r\n\t{ SPR_PUFF,2,2,NULL,S_SMOKE5,0,0 },\t\t\t\t\t/* S_SMOKE4 */\r\n\t{ SPR_PUFF,3,2,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_SMOKE5 */\r\n\t{ SPR_FATB,32768,1,A_Tracer,S_TRACER2,0,0 },\t\t/* S_TRACER */\r\n\t{ SPR_FATB,32769,1,A_Tracer,S_TRACER,0,0 },\t\t\t/* S_TRACER2 */\r\n\t{ SPR_FBXP,32768,4,NULL,S_TRACEEXP2,0,0 },\t\t\t/* S_TRACEEXP1 */\r\n\t{ SPR_FBXP,32769,3,NULL,S_TRACEEXP3,0,0 },\t\t\t/* S_TRACEEXP2 */\r\n\t{ SPR_FBXP,32770,2,NULL,S_NULL,0,0 },\t\t\t\t/* S_TRACEEXP3 */\r\n\t{ SPR_SKEL,0,5,A_Look,S_SKEL_STND2,0,0 },\t\t\t/* S_SKEL_STND */\r\n\t{ SPR_SKEL,1,5,A_Look,S_SKEL_STND,0,0 },\t\t\t/* S_SKEL_STND2 */\r\n\t{ SPR_SKEL,0,2,A_Chase,S_SKEL_RUN2,0,0 },\t\t\t/* S_SKEL_RUN1 */\r\n\t{ SPR_SKEL,0,2,A_Chase,S_SKEL_RUN3,0,0 },\t\t\t/* S_SKEL_RUN2 */\r\n\t{ SPR_SKEL,1,2,A_Chase,S_SKEL_RUN4,0,0 },\t\t\t/* S_SKEL_RUN3 */\r\n\t{ SPR_SKEL,1,2,A_Chase,S_SKEL_RUN5,0,0 },\t\t\t/* S_SKEL_RUN4 */\r\n\t{ SPR_SKEL,2,2,A_Chase,S_SKEL_RUN6,0,0 },\t\t\t/* S_SKEL_RUN5 */\r\n\t{ SPR_SKEL,2,2,A_Chase,S_SKEL_RUN7,0,0 },\t\t\t/* S_SKEL_RUN6 */\r\n\t{ SPR_SKEL,3,2,A_Chase,S_SKEL_RUN8,0,0 },\t\t\t/* S_SKEL_RUN7 */\r\n\t{ SPR_SKEL,3,2,A_Chase,S_SKEL_RUN9,0,0 },\t\t\t/* S_SKEL_RUN8 */\r\n\t{ SPR_SKEL,4,2,A_Chase,S_SKEL_RUN10,0,0 },\t\t\t/* S_SKEL_RUN9 */\r\n\t{ SPR_SKEL,4,2,A_Chase,S_SKEL_RUN11,0,0 },\t\t\t/* S_SKEL_RUN10 */\r\n\t{ SPR_SKEL,5,2,A_Chase,S_SKEL_RUN12,0,0 },\t\t\t/* S_SKEL_RUN11 */\r\n\t{ SPR_SKEL,5,2,A_Chase,S_SKEL_RUN1,0,0 },\t\t\t/* S_SKEL_RUN12 */\r\n\t{ SPR_SKEL,6,0,A_FaceTarget,S_SKEL_FIST2,0,0 },\t\t/* S_SKEL_FIST1 */\r\n\t{ SPR_SKEL,6,3,A_SkelWhoosh,S_SKEL_FIST3,0,0 },\t\t/* S_SKEL_FIST2 */\r\n\t{ SPR_SKEL,7,3,A_FaceTarget,S_SKEL_FIST4,0,0 },\t\t/* S_SKEL_FIST3 */\r\n\t{ SPR_SKEL,8,3,A_SkelFist,S_SKEL_RUN1,0,0 },\t\t/* S_SKEL_FIST4 */\r\n\t{ SPR_SKEL,32777,0,A_FaceTarget,S_SKEL_MISS2,0,0 },\t/* S_SKEL_MISS1 */\r\n\t{ SPR_SKEL,32777,5,A_FaceTarget,S_SKEL_MISS3,0,0 },\t/* S_SKEL_MISS2 */\r\n\t{ SPR_SKEL,10,5,A_SkelMissile,S_SKEL_MISS4,0,0 },\t/* S_SKEL_MISS3 */\r\n\t{ SPR_SKEL,10,5,A_FaceTarget,S_SKEL_RUN1,0,0 },\t\t/* S_SKEL_MISS4 */\r\n\t{ SPR_SKEL,11,2,NULL,S_SKEL_PAIN2,0,0 },\t\t\t/* S_SKEL_PAIN */\r\n\t{ SPR_SKEL,11,2,A_Pain,S_SKEL_RUN1,0,0 },\t\t\t/* S_SKEL_PAIN2 */\r\n\t{ SPR_SKEL,11,3,NULL,S_SKEL_DIE2,0,0 },\t\t\t\t/* S_SKEL_DIE1 */\r\n\t{ SPR_SKEL,12,3,NULL,S_SKEL_DIE3,0,0 },\t\t\t\t/* S_SKEL_DIE2 */\r\n\t{ SPR_SKEL,13,3,A_Scream,S_SKEL_DIE4,0,0 },\t\t\t/* S_SKEL_DIE3 */\r\n\t{ SPR_SKEL,14,3,A_Fall,S_SKEL_DIE5,0,0 },\t\t\t/* S_SKEL_DIE4 */\r\n\t{ SPR_SKEL,15,3,NULL,S_SKEL_DIE6,0,0 },\t\t\t\t/* S_SKEL_DIE5 */\r\n\t{ SPR_SKEL,16,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_SKEL_DIE6 */\r\n\t{ SPR_MANF,32768,2,NULL,S_FATSHOT2,0,0 },\t\t\t/* S_FATSHOT1 */\r\n\t{ SPR_MANF,32769,2,NULL,S_FATSHOT1,0,0 },\t\t\t/* S_FATSHOT2 */\r\n\t{ SPR_MISL,32769,4,NULL,S_FATSHOTX2,0,0 },\t\t\t/* S_FATSHOTX1 */\r\n\t{ SPR_MISL,32770,3,NULL,S_FATSHOTX3,0,0 },\t\t\t/* _FATSHOTX2 */\r\n\t{ SPR_MISL,32771,2,NULL,S_NULL,0,0 },\t\t\t\t/* S_FATSHOTX3 */\r\n\t{ SPR_FATT,0,7,A_Look,S_FATT_STND2,0,0 },\t\t\t/* S_FATT_STND */\r\n\t{ SPR_FATT,1,7,A_Look,S_FATT_STND,0,0 },\t\t\t/* S_FATT_STND2 */\r\n\t{ SPR_FATT,0,2,A_Chase,S_FATT_RUN2,0,0 },\t\t\t/* S_FATT_RUN1 */\r\n\t{ SPR_FATT,0,2,A_Chase,S_FATT_RUN3,0,0 },\t\t\t/* S_FATT_RUN2 */\r\n\t{ SPR_FATT,1,2,A_Chase,S_FATT_RUN4,0,0 },\t\t\t/* S_FATT_RUN3 */\r\n\t{ SPR_FATT,1,2,A_Chase,S_FATT_RUN5,0,0 },\t\t\t/* S_FATT_RUN4 */\r\n\t{ SPR_FATT,2,2,A_Chase,S_FATT_RUN6,0,0 },\t\t\t/* S_FATT_RUN5 */\r\n\t{ SPR_FATT,2,2,A_Chase,S_FATT_RUN7,0,0 },\t\t\t/* S_FATT_RUN6 */\r\n\t{ SPR_FATT,3,2,A_Chase,S_FATT_RUN8,0,0 },\t\t\t/* S_FATT_RUN7 */\r\n\t{ SPR_FATT,3,2,A_Chase,S_FATT_RUN9,0,0 },\t\t\t/* S_FATT_RUN8 */\r\n\t{ SPR_FATT,4,2,A_Chase,S_FATT_RUN10,0,0 },\t\t\t/* S_FATT_RUN9 */\r\n\t{ SPR_FATT,4,2,A_Chase,S_FATT_RUN11,0,0 },\t\t\t/* S_FATT_RUN10 */\r\n\t{ SPR_FATT,5,2,A_Chase,S_FATT_RUN12,0,0 },\t\t\t/* S_FATT_RUN11 */\r\n\t{ SPR_FATT,5,2,A_Chase,S_FATT_RUN1,0,0 },\t\t\t/* S_FATT_RUN12 */\r\n\t{ SPR_FATT,6,10,A_FatRaise,S_FATT_ATK2,0,0 },\t\t/* S_FATT_ATK1 */\r\n\t{ SPR_FATT,32775,5,A_FatAttack1,S_FATT_ATK3,0,0 },\t/* S_FATT_ATK2 */\r\n\t{ SPR_FATT,8,2,A_FaceTarget,S_FATT_ATK4,0,0 },\t\t/* S_FATT_ATK3 */\r\n\t{ SPR_FATT,6,2,A_FaceTarget,S_FATT_ATK5,0,0 },\t\t/* S_FATT_ATK4 */\r\n\t{ SPR_FATT,32775,5,A_FatAttack2,S_FATT_ATK6,0,0 },\t/* S_FATT_ATK5 */\r\n\t{ SPR_FATT,8,2,A_FaceTarget,S_FATT_ATK7,0,0 },\t\t/* S_FATT_ATK6 */\r\n\t{ SPR_FATT,6,2,A_FaceTarget,S_FATT_ATK8,0,0 },\t\t/* S_FATT_ATK7 */\r\n\t{ SPR_FATT,32775,5,A_FatAttack3,S_FATT_ATK9,0,0 },\t/* S_FATT_ATK8 */\r\n\t{ SPR_FATT,8,2,A_FaceTarget,S_FATT_ATK10,0,0 },\t\t/* S_FATT_ATK9 */\r\n\t{ SPR_FATT,6,2,A_FaceTarget,S_FATT_RUN1,0,0 },\t\t/* S_FATT_ATK10 */\r\n\t{ SPR_FATT,9,1,NULL,S_FATT_PAIN2,0,0 },\t\t\t\t/* S_FATT_PAIN */\r\n\t{ SPR_FATT,9,1,A_Pain,S_FATT_RUN1,0,0 },\t\t\t/* S_FATT_PAIN2 */\r\n\t{ SPR_FATT,10,2,NULL,S_FATT_DIE2,0,0 },\t\t\t\t/* S_FATT_DIE1 */\r\n\t{ SPR_FATT,11,2,A_Scream,S_FATT_DIE3,0,0 },\t\t\t/* S_FATT_DIE2 */\r\n\t{ SPR_FATT,12,2,A_Fall,S_FATT_DIE4,0,0 },\t\t\t/* S_FATT_DIE3 */\r\n\t{ SPR_FATT,13,2,NULL,S_FATT_DIE5,0,0 },\t\t\t\t/* S_FATT_DIE4 */\r\n\t{ SPR_FATT,14,2,NULL,S_FATT_DIE6,0,0 },\t\t\t\t/* S_FATT_DIE5 */\r\n\t{ SPR_FATT,15,2,NULL,S_FATT_DIE7,0,0 },\t\t\t\t/* S_FATT_DIE6 */\r\n\t{ SPR_FATT,16,2,NULL,S_FATT_DIE8,0,0 },\t\t\t\t/* S_FATT_DIE7 */\r\n\t{ SPR_FATT,17,2,NULL,S_FATT_DIE9,0,0 },\t\t\t\t/* S_FATT_DIE7 */\r\n\t{ SPR_FATT,18,2,NULL,S_FATT_DIE10,0,0 },\t\t\t/* S_FATT_DIE9 */\r\n\t{ SPR_FATT,19,-1,A_BossDeath,S_NULL,0,0 },\t\t\t/* S_FATT_DIE10 */\r\n\t{ SPR_CPOS,0,5,A_Look,S_CPOS_STND2,0,0 },\t\t\t/* S_CPOS_STND */\r\n\t{ SPR_CPOS,1,5,A_Look,S_CPOS_STND,0,0 },\t\t\t/* S_CPOS_STND2 */\r\n\t{ SPR_CPOS,0,2,A_Chase,S_CPOS_RUN2,0,0 },\t\t\t/* S_CPOS_RUN1 */\r\n\t{ SPR_CPOS,0,2,A_Chase,S_CPOS_RUN3,0,0 },\t\t\t/* S_CPOS_RUN2 */\r\n\t{ SPR_CPOS,1,2,A_Chase,S_CPOS_RUN4,0,0 },\t\t\t/* S_CPOS_RUN3 */\r\n\t{ SPR_CPOS,1,2,A_Chase,S_CPOS_RUN5,0,0 },\t\t\t/* S_CPOS_RUN4 */\r\n\t{ SPR_CPOS,2,2,A_Chase,S_CPOS_RUN6,0,0 },\t\t\t/* S_CPOS_RUN5 */\r\n\t{ SPR_CPOS,2,2,A_Chase,S_CPOS_RUN7,0,0 },\t\t\t/* S_CPOS_RUN6 */\r\n\t{ SPR_CPOS,3,2,A_Chase,S_CPOS_RUN8,0,0 },\t\t\t/* S_CPOS_RUN7 */\r\n\t{ SPR_CPOS,3,2,A_Chase,S_CPOS_RUN1,0,0 },\t\t\t/* S_CPOS_RUN8 */\r\n\t{ SPR_CPOS,4,5,A_FaceTarget,S_CPOS_ATK2,0,0 },\t\t/* S_CPOS_ATK1 */\r\n\t{ SPR_CPOS,32773,2,A_CPosAttack,S_CPOS_ATK3,0,0 },\t/* S_CPOS_ATK2 */\r\n\t{ SPR_CPOS,32772,2,A_CPosAttack,S_CPOS_ATK4,0,0 },\t/* S_CPOS_ATK3 */\r\n\t{ SPR_CPOS,5,0,A_CPosRefire,S_CPOS_ATK2,0,0 },\t\t/* S_CPOS_ATK4 */\r\n\t{ SPR_CPOS,6,1,NULL,S_CPOS_PAIN2,0,0 },\t\t\t\t/* S_CPOS_PAIN */\r\n\t{ SPR_CPOS,6,1,A_Pain,S_CPOS_RUN1,0,0 },\t\t\t/* S_CPOS_PAIN2 */\r\n\t{ SPR_CPOS,7,2,NULL,S_CPOS_DIE2,0,0 },\t\t\t\t/* S_CPOS_DIE1 */\r\n\t{ SPR_CPOS,8,2,A_Scream,S_CPOS_DIE3,0,0 },\t\t\t/* S_CPOS_DIE2 */\r\n\t{ SPR_CPOS,9,2,A_Fall,S_CPOS_DIE4,0,0 },\t\t\t/* S_CPOS_DIE3 */\r\n\t{ SPR_CPOS,10,2,NULL,S_CPOS_DIE5,0,0 },\t\t\t\t/* S_CPOS_DIE4 */\r\n\t{ SPR_CPOS,11,2,NULL,S_CPOS_DIE6,0,0 },\t\t\t\t/* S_CPOS_DIE5 */\r\n\t{ SPR_CPOS,12,2,NULL,S_CPOS_DIE7,0,0 },\t\t\t\t/* S_CPOS_DIE6 */\r\n\t{ SPR_CPOS,13,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_CPOS_DIE7 */\r\n\t{ SPR_CPOS,14,2,NULL,S_CPOS_XDIE2,0,0 },\t\t\t/* S_CPOS_XDIE1 */\r\n\t{ SPR_CPOS,15,2,A_XScream,S_CPOS_XDIE3,0,0 },\t\t/* S_CPOS_XDIE2 */\r\n\t{ SPR_CPOS,16,2,A_Fall,S_CPOS_XDIE4,0,0 },\t\t\t/* S_CPOS_XDIE3 */\r\n\t{ SPR_CPOS,17,2,NULL,S_CPOS_XDIE5,0,0 },\t\t\t/* S_CPOS_XDIE4 */\r\n\t{ SPR_CPOS,18,2,NULL,S_CPOS_XDIE6,0,0 },\t\t\t/* S_CPOS_XDIE5 */\r\n\t{ SPR_CPOS,19,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_CPOS_XDIE6 */\r\n\t{ SPR_TROO,0,5,A_Look,S_TROO_STND2,0,0 },\t\t\t/* S_TROO_STND */\r\n\t{ SPR_TROO,1,5,A_Look,S_TROO_STND,0,0 },\t\t\t/* S_TROO_STND2 */\r\n\t{ SPR_TROO,0,1,A_Chase,S_TROO_RUN2,0,0 },\t\t\t/* S_TROO_RUN1 */\r\n\t{ SPR_TROO,0,2,A_Chase,S_TROO_RUN3,0,0 },\t\t\t/* S_TROO_RUN2 */\r\n\t{ SPR_TROO,1,1,A_Chase,S_TROO_RUN4,0,0 },\t\t\t/* S_TROO_RUN3 */\r\n\t{ SPR_TROO,1,2,A_Chase,S_TROO_RUN5,0,0 },\t\t\t/* S_TROO_RUN4 */\r\n\t{ SPR_TROO,2,1,A_Chase,S_TROO_RUN6,0,0 },\t\t\t/* S_TROO_RUN5 */\r\n\t{ SPR_TROO,2,2,A_Chase,S_TROO_RUN7,0,0 },\t\t\t/* S_TROO_RUN6 */\r\n\t{ SPR_TROO,3,1,A_Chase,S_TROO_RUN8,0,0 },\t\t\t/* S_TROO_RUN7 */\r\n\t{ SPR_TROO,3,2,A_Chase,S_TROO_RUN1,0,0 },\t\t\t/* S_TROO_RUN8 */\r\n\t{ SPR_TROO,4,4,A_FaceTarget,S_TROO_ATK2,0,0 },\t\t/* S_TROO_ATK1 */\r\n\t{ SPR_TROO,5,4,A_FaceTarget,S_TROO_ATK3,0,0 },\t\t/* S_TROO_ATK2 */\r\n\t{ SPR_TROO,6,3,A_TroopAttack,S_TROO_RUN1,0,0 },\t\t/* S_TROO_ATK3 */\r\n\t{ SPR_TROO,7,1,NULL,S_TROO_PAIN2,0,0 },\t\t\t\t/* S_TROO_PAIN */\r\n\t{ SPR_TROO,7,1,A_Pain,S_TROO_RUN1,0,0 },\t\t\t/* S_TROO_PAIN2 */\r\n\t{ SPR_TROO,8,4,NULL,S_TROO_DIE2,0,0 },\t\t\t\t/* S_TROO_DIE1 */\r\n\t{ SPR_TROO,9,4,A_Scream,S_TROO_DIE3,0,0 },\t\t\t/* S_TROO_DIE2 */\r\n\t{ SPR_TROO,10,3,NULL,S_TROO_DIE4,0,0 },\t\t\t\t/* S_TROO_DIE3 */\r\n\t{ SPR_TROO,11,3,A_Fall,S_TROO_DIE5,0,0 },\t\t\t/* S_TROO_DIE4 */\r\n\t{ SPR_TROO,12,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_TROO_DIE5 */\r\n\t{ SPR_TROO,13,2,NULL,S_TROO_XDIE2,0,0 },\t\t\t/* S_TROO_XDIE1 */\r\n\t{ SPR_TROO,14,3,A_XScream,S_TROO_XDIE3,0,0 },\t\t/* S_TROO_XDIE2 */\r\n\t{ SPR_TROO,15,2,NULL,S_TROO_XDIE4,0,0 },\t\t\t/* S_TROO_XDIE3 */\r\n\t{ SPR_TROO,16,3,A_Fall,S_TROO_XDIE5,0,0 },\t\t\t/* S_TROO_XDIE4 */\r\n\t{ SPR_TROO,17,2,NULL,S_TROO_XDIE6,0,0 },\t\t\t/* S_TROO_XDIE5 */\r\n\t{ SPR_TROO,18,3,NULL,S_TROO_XDIE7,0,0 },\t\t\t/* S_TROO_XDIE6 */\r\n\t{ SPR_TROO,19,2,NULL,S_TROO_XDIE8,0,0 },\t\t\t/* S_TROO_XDIE7 */\r\n\t{ SPR_TROO,20,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_TROO_XDIE8 */\r\n\t{ SPR_SARG,0,5,A_Look,S_SARG_STND2,0,0 },\t\t\t/* S_SARG_STND */\r\n\t{ SPR_SARG,1,5,A_Look,S_SARG_STND,0,0 },\t\t\t/* S_SARG_STND2 */\r\n\t{ SPR_SARG,0,1,A_Chase,S_SARG_RUN2,0,0 },\t\t\t/* S_SARG_RUN1 */\r\n\t{ SPR_SARG,0,1,A_Chase,S_SARG_RUN3,0,0 },\t\t\t/* S_SARG_RUN2 */\r\n\t{ SPR_SARG,1,1,A_Chase,S_SARG_RUN4,0,0 },\t\t\t/* S_SARG_RUN3 */\r\n\t{ SPR_SARG,1,1,A_Chase,S_SARG_RUN5,0,0 },\t\t\t/* S_SARG_RUN4 */\r\n\t{ SPR_SARG,2,1,A_Chase,S_SARG_RUN6,0,0 },\t\t\t/* S_SARG_RUN5 */\r\n\t{ SPR_SARG,2,1,A_Chase,S_SARG_RUN7,0,0 },\t\t\t/* S_SARG_RUN6 */\r\n\t{ SPR_SARG,3,1,A_Chase,S_SARG_RUN8,0,0 },\t\t\t/* S_SARG_RUN7 */\r\n\t{ SPR_SARG,3,1,A_Chase,S_SARG_RUN1,0,0 },\t\t\t/* S_SARG_RUN8 */\r\n\t{ SPR_SARG,4,4,A_FaceTarget,S_SARG_ATK2,0,0 },\t\t/* S_SARG_ATK1 */\r\n\t{ SPR_SARG,5,4,A_FaceTarget,S_SARG_ATK3,0,0 },\t\t/* S_SARG_ATK2 */\r\n\t{ SPR_SARG,6,4,A_SargAttack,S_SARG_RUN1,0,0 },\t\t/* S_SARG_ATK3 */\r\n\t{ SPR_SARG,7,1,NULL,S_SARG_PAIN2,0,0 },\t\t\t\t/* S_SARG_PAIN */\r\n\t{ SPR_SARG,7,1,A_Pain,S_SARG_RUN1,0,0 },\t\t\t/* S_SARG_PAIN2 */\r\n\t{ SPR_SARG,8,4,NULL,S_SARG_DIE2,0,0 },\t\t\t\t/* S_SARG_DIE1 */\r\n\t{ SPR_SARG,9,4,A_Scream,S_SARG_DIE3,0,0 },\t\t\t/* S_SARG_DIE2 */\r\n\t{ SPR_SARG,10,2,NULL,S_SARG_DIE4,0,0 },\t\t\t\t/* S_SARG_DIE3 */\r\n\t{ SPR_SARG,11,2,A_Fall,S_SARG_DIE5,0,0 },\t\t\t/* S_SARG_DIE4 */\r\n\t{ SPR_SARG,12,2,NULL,S_SARG_DIE6,0,0 },\t\t\t\t/* S_SARG_DIE5 */\r\n\t{ SPR_SARG,13,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_SARG_DIE6 */\r\n\t{ SPR_HEAD,0,5,A_Look,S_HEAD_STND,0,0 },\t\t\t/* S_HEAD_STND */\r\n\t{ SPR_HEAD,0,2,A_Chase,S_HEAD_RUN1,0,0 },\t\t\t/* S_HEAD_RUN1 */\r\n\t{ SPR_HEAD,1,3,A_FaceTarget,S_HEAD_ATK2,0,0 },\t\t/* S_HEAD_ATK1 */\r\n\t{ SPR_HEAD,2,3,A_FaceTarget,S_HEAD_ATK3,0,0 },\t\t/* S_HEAD_ATK2 */\r\n\t{ SPR_HEAD,32771,3,A_HeadAttack,S_HEAD_RUN1,0,0 },\t/* S_HEAD_ATK3 */\r\n\t{ SPR_HEAD,4,1,NULL,S_HEAD_PAIN2,0,0 },\t\t\t\t/* S_HEAD_PAIN */\r\n\t{ SPR_HEAD,4,2,A_Pain,S_HEAD_PAIN3,0,0 },\t\t\t/* S_HEAD_PAIN2 */\r\n\t{ SPR_HEAD,5,3,NULL,S_HEAD_RUN1,0,0 },\t\t\t\t/* S_HEAD_PAIN3 */\r\n\t{ SPR_HEAD,6,4,NULL,S_HEAD_DIE2,0,0 },\t\t\t\t/* S_HEAD_DIE1 */\r\n\t{ SPR_HEAD,7,4,A_Scream,S_HEAD_DIE3,0,0 },\t\t\t/* S_HEAD_DIE2 */\r\n\t{ SPR_HEAD,8,4,NULL,S_HEAD_DIE4,0,0 },\t\t\t\t/* S_HEAD_DIE3 */\r\n\t{ SPR_HEAD,9,4,NULL,S_HEAD_DIE5,0,0 },\t\t\t\t/* S_HEAD_DIE4 */\r\n\t{ SPR_HEAD,10,4,A_Fall,S_HEAD_DIE6,0,0 },\t\t\t/* S_HEAD_DIE5 */\r\n\t{ SPR_HEAD,11,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_HEAD_DIE6 */\r\n\t{ SPR_BOSS,0,5,A_Look,S_BOSS_STND2,0,0 },\t\t\t/* S_BOSS_STND */\r\n\t{ SPR_BOSS,1,5,A_Look,S_BOSS_STND,0,0 },\t\t\t/* S_BOSS_STND2 */\r\n\t{ SPR_BOSS,0,1,A_Chase,S_BOSS_RUN2,0,0 },\t\t\t/* S_BOSS_RUN1 */\r\n\t{ SPR_BOSS,0,2,A_Chase,S_BOSS_RUN3,0,0 },\t\t\t/* S_BOSS_RUN2 */\r\n\t{ SPR_BOSS,1,1,A_Chase,S_BOSS_RUN4,0,0 },\t\t\t/* S_BOSS_RUN3 */\r\n\t{ SPR_BOSS,1,2,A_Chase,S_BOSS_RUN5,0,0 },\t\t\t/* S_BOSS_RUN4 */\r\n\t{ SPR_BOSS,2,1,A_Chase,S_BOSS_RUN6,0,0 },\t\t\t/* S_BOSS_RUN5 */\r\n\t{ SPR_BOSS,2,2,A_Chase,S_BOSS_RUN7,0,0 },\t\t\t/* S_BOSS_RUN6 */\r\n\t{ SPR_BOSS,3,1,A_Chase,S_BOSS_RUN8,0,0 },\t\t\t/* S_BOSS_RUN7 */\r\n\t{ SPR_BOSS,3,2,A_Chase,S_BOSS_RUN1,0,0 },\t\t\t/* S_BOSS_RUN8 */\r\n\t{ SPR_BOSS,4,4,A_FaceTarget,S_BOSS_ATK2,0,0 },\t\t/* S_BOSS_ATK1 */\r\n\t{ SPR_BOSS,5,4,A_FaceTarget,S_BOSS_ATK3,0,0 },\t\t/* S_BOSS_ATK2 */\r\n\t{ SPR_BOSS,6,4,A_BruisAttack,S_BOSS_RUN1,0,0 },\t\t/* S_BOSS_ATK3 */\r\n\t{ SPR_BOSS,7,1,NULL,S_BOSS_PAIN2,0,0 },\t\t\t\t/* S_BOSS_PAIN */\r\n\t{ SPR_BOSS,7,1,A_Pain,S_BOSS_RUN1,0,0 },\t\t\t/* S_BOSS_PAIN2 */\r\n\t{ SPR_BOSS,8,4,NULL,S_BOSS_DIE2,0,0 },\t\t\t\t/* S_BOSS_DIE1 */\r\n\t{ SPR_BOSS,9,4,A_Scream,S_BOSS_DIE3,0,0 },\t\t\t/* S_BOSS_DIE2 */\r\n\t{ SPR_BOSS,10,4,NULL,S_BOSS_DIE4,0,0 },\t\t\t\t/* S_BOSS_DIE3 */\r\n\t{ SPR_BOSS,11,4,A_Fall,S_BOSS_DIE5,0,0 },\t\t\t/* S_BOSS_DIE4 */\r\n\t{ SPR_BOSS,12,4,NULL,S_BOSS_DIE6,0,0 },\t\t\t\t/* S_BOSS_DIE5 */\r\n\t{ SPR_BOSS,13,4,NULL,S_BOSS_DIE7,0,0 },\t\t\t\t/* S_BOSS_DIE6 */\r\n\t{ SPR_BOSS,14,-1,A_BossDeath,S_NULL,0,0 },\t\t\t/* S_BOSS_DIE7 */\r\n\t{ SPR_BOS2,0,5,A_Look,S_BOS2_STND2,0,0 },\t\t\t/* S_BOS2_STND */\r\n\t{ SPR_BOS2,1,5,A_Look,S_BOS2_STND,0,0 },\t\t\t/* S_BOS2_STND2 */\r\n\t{ SPR_BOS2,0,2,A_Chase,S_BOS2_RUN2,0,0 },\t\t\t/* S_BOS2_RUN1 */\r\n\t{ SPR_BOS2,0,2,A_Chase,S_BOS2_RUN3,0,0 },\t\t\t/* S_BOS2_RUN2 */\r\n\t{ SPR_BOS2,1,2,A_Chase,S_BOS2_RUN4,0,0 },\t\t\t/* S_BOS2_RUN3 */\r\n\t{ SPR_BOS2,1,2,A_Chase,S_BOS2_RUN5,0,0 },\t\t\t/* S_BOS2_RUN4 */\r\n\t{ SPR_BOS2,2,2,A_Chase,S_BOS2_RUN6,0,0 },\t\t\t/* S_BOS2_RUN5 */\r\n\t{ SPR_BOS2,2,2,A_Chase,S_BOS2_RUN7,0,0 },\t\t\t/* S_BOS2_RUN6 */\r\n\t{ SPR_BOS2,3,2,A_Chase,S_BOS2_RUN8,0,0 },\t\t\t/* S_BOS2_RUN7 */\r\n\t{ SPR_BOS2,3,2,A_Chase,S_BOS2_RUN1,0,0 },\t\t\t/* S_BOS2_RUN8 */\r\n\t{ SPR_BOS2,4,4,A_FaceTarget,S_BOS2_ATK2,0,0 },\t\t/* S_BOS2_ATK1 */\r\n\t{ SPR_BOS2,5,4,A_FaceTarget,S_BOS2_ATK3,0,0 },\t\t/* S_BOS2_ATK2 */\r\n\t{ SPR_BOS2,6,4,A_BruisAttack,S_BOS2_RUN1,0,0 },\t\t/* S_BOS2_ATK3 */\r\n\t{ SPR_BOS2,7,1,NULL,S_BOS2_PAIN2,0,0 },\t\t\t\t/* S_BOS2_PAIN */\r\n\t{ SPR_BOS2,7,1,A_Pain,S_BOS2_RUN1,0,0 },\t\t\t/* S_BOS2_PAIN2 */\r\n\t{ SPR_BOS2,8,4,NULL,S_BOS2_DIE2,0,0 },\t\t\t\t/* S_BOS2_DIE1 */\r\n\t{ SPR_BOS2,9,4,A_Scream,S_BOS2_DIE3,0,0 },\t\t\t/* S_BOS2_DIE2 */\r\n\t{ SPR_BOS2,10,4,NULL,S_BOS2_DIE4,0,0 },\t\t\t\t/* S_BOS2_DIE3 */\r\n\t{ SPR_BOS2,11,4,A_Fall,S_BOS2_DIE5,0,0 },\t\t\t/* S_BOS2_DIE4 */\r\n\t{ SPR_BOS2,12,4,NULL,S_BOS2_DIE6,0,0 },\t\t\t\t/* S_BOS2_DIE5 */\r\n\t{ SPR_BOS2,13,4,NULL,S_BOS2_DIE7,0,0 },\t\t\t\t/* S_BOS2_DIE6 */\r\n\t{ SPR_BOS2,14,-1,A_BossDeath,S_NULL,0,0 },\t\t\t/* S_BOS2_DIE7 */\r\n\t{ SPR_SKUL,32768,5,A_Look,S_SKULL_STND2,0,0 },\t\t/* S_SKULL_STND */\r\n\t{ SPR_SKUL,32769,5,A_Look,S_SKULL_STND,0,0 },\t\t/* S_SKULL_STND2 */\r\n\t{ SPR_SKUL,32768,3,A_Chase,S_SKULL_RUN2,0,0 },\t\t/* S_SKULL_RUN1 */\r\n\t{ SPR_SKUL,32769,3,A_Chase,S_SKULL_RUN1,0,0 },\t\t/* S_SKULL_RUN2 */\r\n\t{ SPR_SKUL,32770,5,A_FaceTarget,S_SKULL_ATK2,0,0 },\t/* S_SKULL_ATK1 */\r\n\t{ SPR_SKUL,32771,2,A_SkullAttack,S_SKULL_ATK3,0,0 },/* S_SKULL_ATK2 */\r\n\t{ SPR_SKUL,32770,2,NULL,S_SKULL_ATK4,0,0 },\t\t\t/* S_SKULL_ATK3 */\r\n\t{ SPR_SKUL,32771,2,NULL,S_SKULL_ATK3,0,0 },\t\t\t/* S_SKULL_ATK4 */\r\n\t{ SPR_SKUL,32772,1,NULL,S_SKULL_PAIN2,0,0 },\t\t/* S_SKULL_PAIN */\r\n\t{ SPR_SKUL,32772,2,A_Pain,S_SKULL_RUN1,0,0 },\t\t/* S_SKULL_PAIN2 */\r\n\t{ SPR_SKUL,32773,3,NULL,S_SKULL_DIE2,0,0 },\t\t\t/* S_SKULL_DIE1 */\r\n\t{ SPR_SKUL,32774,3,A_Scream,S_SKULL_DIE3,0,0 },\t\t/* S_SKULL_DIE2 */\r\n\t{ SPR_SKUL,32775,3,NULL,S_SKULL_DIE4,0,0 },\t\t\t/* S_SKULL_DIE3 */\r\n\t{ SPR_SKUL,32776,3,A_Fall,S_SKULL_DIE5,0,0 },\t\t/* S_SKULL_DIE4 */\r\n\t{ SPR_SKUL,9,3,NULL,S_SKULL_DIE6,0,0 },\t\t\t\t/* S_SKULL_DIE5 */\r\n\t{ SPR_SKUL,10,3,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_SKULL_DIE6 */\r\n\t{ SPR_SPID,0,5,A_Look,S_SPID_STND2,0,0 },\t\t\t/* S_SPID_STND */\r\n\t{ SPR_SPID,1,5,A_Look,S_SPID_STND,0,0 },\t\t\t/* S_SPID_STND2 */\r\n\t{ SPR_SPID,0,2,A_Metal,S_SPID_RUN2,0,0 },\t\t\t/* S_SPID_RUN1 */\r\n\t{ SPR_SPID,0,2,A_Chase,S_SPID_RUN3,0,0 },\t\t\t/* S_SPID_RUN2 */\r\n\t{ SPR_SPID,1,2,A_Chase,S_SPID_RUN4,0,0 },\t\t\t/* S_SPID_RUN3 */\r\n\t{ SPR_SPID,1,2,A_Chase,S_SPID_RUN5,0,0 },\t\t\t/* S_SPID_RUN4 */\r\n\t{ SPR_SPID,2,2,A_Metal,S_SPID_RUN6,0,0 },\t\t\t/* S_SPID_RUN5 */\r\n\t{ SPR_SPID,2,2,A_Chase,S_SPID_RUN7,0,0 },\t\t\t/* S_SPID_RUN6 */\r\n\t{ SPR_SPID,3,2,A_Chase,S_SPID_RUN8,0,0 },\t\t\t/* S_SPID_RUN7 */\r\n\t{ SPR_SPID,3,2,A_Chase,S_SPID_RUN9,0,0 },\t\t\t/* S_SPID_RUN8 */\r\n\t{ SPR_SPID,4,2,A_Metal,S_SPID_RUN10,0,0 },\t\t\t/* S_SPID_RUN9 */\r\n\t{ SPR_SPID,4,2,A_Chase,S_SPID_RUN11,0,0 },\t\t\t/* S_SPID_RUN10 */\r\n\t{ SPR_SPID,5,2,A_Chase,S_SPID_RUN12,0,0 },\t\t\t/* S_SPID_RUN11 */\r\n\t{ SPR_SPID,5,2,A_Chase,S_SPID_RUN1,0,0 },\t\t\t/* S_SPID_RUN12 */\r\n\t{ SPR_SPID,32768,10,A_FaceTarget,S_SPID_ATK2,0,0 },\t/* S_SPID_ATK1 */\r\n\t{ SPR_SPID,32774,2,A_SpidAttack,S_SPID_ATK3,0,0 },\t/* S_SPID_ATK2 */\r\n\t{ SPR_SPID,32775,2,A_SpidAttack,S_SPID_ATK4,0,0 },\t/* S_SPID_ATK3 */\r\n\t{ SPR_SPID,32775,1,A_SpidRefire,S_SPID_ATK2,0,0 },\t/* S_SPID_ATK4 */\r\n\t{ SPR_SPID,8,2,NULL,S_SPID_PAIN2,0,0 },\t\t\t\t/* S_SPID_PAIN */\r\n\t{ SPR_SPID,8,2,A_Pain,S_SPID_RUN1,0,0 },\t\t\t/* S_SPID_PAIN2 */\r\n\t{ SPR_SPID,9,8,A_Scream,S_SPID_DIE2,0,0 },\t\t\t/* S_SPID_DIE1 */\r\n\t{ SPR_SPID,10,3,A_Fall,S_SPID_DIE3,0,0 },\t\t\t/* S_SPID_DIE2 */\r\n\t{ SPR_SPID,11,3,NULL,S_SPID_DIE4,0,0 },\t\t\t\t/* S_SPID_DIE3 */\r\n\t{ SPR_SPID,12,3,NULL,S_SPID_DIE5,0,0 },\t\t\t\t/* S_SPID_DIE4 */\r\n\t{ SPR_SPID,13,3,NULL,S_SPID_DIE6,0,0 },\t\t\t\t/* S_SPID_DIE5 */\r\n\t{ SPR_SPID,14,3,NULL,S_SPID_DIE7,0,0 },\t\t\t\t/* S_SPID_DIE6 */\r\n\t{ SPR_SPID,15,3,NULL,S_SPID_DIE8,0,0 },\t\t\t\t/* S_SPID_DIE7 */\r\n\t{ SPR_SPID,16,3,NULL,S_SPID_DIE9,0,0 },\t\t\t\t/* S_SPID_DIE8 */\r\n\t{ SPR_SPID,17,3,NULL,S_SPID_DIE10,0,0 },\t\t\t/* S_SPID_DIE9 */\r\n\t{ SPR_SPID,18,10,NULL,S_SPID_DIE11,0,0 },\t\t\t/* S_SPID_DIE10 */\r\n\t{ SPR_SPID,18,-1,A_BossDeath,S_NULL,0,0 },\t\t\t/* S_SPID_DIE11 */\r\n\t{ SPR_BSPI,0,5,A_Look,S_BSPI_STND2,0,0 },\t\t\t/* S_BSPI_STND */\r\n\t{ SPR_BSPI,1,5,A_Look,S_BSPI_STND,0,0 },\t\t\t/* S_BSPI_STND2 */\r\n\t{ SPR_BSPI,0,10,NULL,S_BSPI_RUN1,0,0 },\t\t\t\t/* S_BSPI_SIGHT */\r\n\t{ SPR_BSPI,0,2,A_BabyMetal,S_BSPI_RUN2,0,0 },\t\t/* S_BSPI_RUN1 */\r\n\t{ SPR_BSPI,0,2,A_Chase,S_BSPI_RUN3,0,0 },\t\t\t/* S_BSPI_RUN2 */\r\n\t{ SPR_BSPI,1,2,A_Chase,S_BSPI_RUN4,0,0 },\t\t\t/* S_BSPI_RUN3 */\r\n\t{ SPR_BSPI,1,2,A_Chase,S_BSPI_RUN5,0,0 },\t\t\t/* S_BSPI_RUN4 */\r\n\t{ SPR_BSPI,2,2,A_Chase,S_BSPI_RUN6,0,0 },\t\t\t/* S_BSPI_RUN5 */\r\n\t{ SPR_BSPI,2,2,A_Chase,S_BSPI_RUN7,0,0 },\t\t\t/* S_BSPI_RUN6 */\r\n\t{ SPR_BSPI,3,2,A_BabyMetal,S_BSPI_RUN8,0,0 },\t\t/* S_BSPI_RUN7 */\r\n\t{ SPR_BSPI,3,2,A_Chase,S_BSPI_RUN9,0,0 },\t\t\t/* S_BSPI_RUN8 */\r\n\t{ SPR_BSPI,4,2,A_Chase,S_BSPI_RUN10,0,0 },\t\t\t/* S_BSPI_RUN9 */\r\n\t{ SPR_BSPI,4,2,A_Chase,S_BSPI_RUN11,0,0 },\t\t\t/* S_BSPI_RUN10 */\r\n\t{ SPR_BSPI,5,2,A_Chase,S_BSPI_RUN12,0,0 },\t\t\t/* S_BSPI_RUN11 */\r\n\t{ SPR_BSPI,5,2,A_Chase,S_BSPI_RUN1,0,0 },\t\t\t/* S_BSPI_RUN12 */\r\n\t{ SPR_BSPI,32768,10,A_FaceTarget,S_BSPI_ATK2,0,0 },\t/* S_BSPI_ATK1 */\r\n\t{ SPR_BSPI,32774,2,A_BspiAttack,S_BSPI_ATK3,0,0 },\t/* S_BSPI_ATK2 */\r\n\t{ SPR_BSPI,32775,2,NULL,S_BSPI_ATK4,0,0 },\t\t\t/* S_BSPI_ATK3 */\r\n\t{ SPR_BSPI,32775,1,A_SpidRefire,S_BSPI_ATK2,0,0 },\t/* S_BSPI_ATK4 */\r\n\t{ SPR_BSPI,8,2,NULL,S_BSPI_PAIN2,0,0 },\t\t\t\t/* S_BSPI_PAIN */\r\n\t{ SPR_BSPI,8,2,A_Pain,S_BSPI_RUN1,0,0 },\t\t\t/* S_BSPI_PAIN2 */\r\n\t{ SPR_BSPI,9,10,A_Scream,S_BSPI_DIE2,0,0 },\t\t\t/* S_BSPI_DIE1 */\r\n\t{ SPR_BSPI,10,3,A_Fall,S_BSPI_DIE3,0,0 },\t\t\t/* S_BSPI_DIE2 */\r\n\t{ SPR_BSPI,11,3,NULL,S_BSPI_DIE4,0,0 },\t\t\t\t/* S_BSPI_DIE3 */\r\n\t{ SPR_BSPI,12,3,NULL,S_BSPI_DIE5,0,0 },\t\t\t\t/* S_BSPI_DIE4 */\r\n\t{ SPR_BSPI,13,3,NULL,S_BSPI_DIE6,0,0 },\t\t\t\t/* S_BSPI_DIE5 */\r\n\t{ SPR_BSPI,14,3,NULL,S_BSPI_DIE7,0,0 },\t\t\t\t/* S_BSPI_DIE6 */\r\n\t{ SPR_BSPI,15,-1,A_BossDeath,S_NULL,0,0 },\t\t\t/* S_BSPI_DIE7 */\r\n\t{ SPR_APLS,32768,2,NULL,S_ARACH_PLAZ2,0,0 },\t\t/* S_ARACH_PLAZ */\r\n\t{ SPR_APLS,32769,2,NULL,S_ARACH_PLAZ,0,0 },\t\t\t/* S_ARACH_PLAZ2 */\r\n\t{ SPR_APBX,32768,2,NULL,S_ARACH_PLEX2,0,0 },\t\t/* S_ARACH_PLEX */\r\n\t{ SPR_APBX,32769,2,NULL,S_ARACH_PLEX3,0,0 },\t\t/* S_ARACH_PLEX2 */\r\n\t{ SPR_APBX,32770,2,NULL,S_ARACH_PLEX4,0,0 },\t\t/* S_ARACH_PLEX3 */\r\n\t{ SPR_APBX,32771,2,NULL,S_ARACH_PLEX5,0,0 },\t\t/* S_ARACH_PLEX4 */\r\n\t{ SPR_APBX,32772,2,NULL,S_NULL,0,0 },\t\t\t\t/* S_ARACH_PLEX5 */\r\n\t{ SPR_CYBR,0,5,A_Look,S_CYBER_STND2,0,0 },\t\t\t/* S_CYBER_STND */\r\n\t{ SPR_CYBR,1,5,A_Look,S_CYBER_STND,0,0 },\t\t\t/* S_CYBER_STND2 */\r\n\t{ SPR_CYBR,0,2,A_Hoof,S_CYBER_RUN2,0,0 },\t\t\t/* S_CYBER_RUN1 */\r\n\t{ SPR_CYBR,0,2,A_Chase,S_CYBER_RUN3,0,0 },\t\t\t/* S_CYBER_RUN2 */\r\n\t{ SPR_CYBR,1,2,A_Chase,S_CYBER_RUN4,0,0 },\t\t\t/* S_CYBER_RUN3 */\r\n\t{ SPR_CYBR,1,2,A_Chase,S_CYBER_RUN5,0,0 },\t\t\t/* S_CYBER_RUN4 */\r\n\t{ SPR_CYBR,2,2,A_Chase,S_CYBER_RUN6,0,0 },\t\t\t/* S_CYBER_RUN5 */\r\n\t{ SPR_CYBR,2,2,A_Chase,S_CYBER_RUN7,0,0 },\t\t\t/* S_CYBER_RUN6 */\r\n\t{ SPR_CYBR,3,2,A_Metal,S_CYBER_RUN8,0,0 },\t\t\t/* S_CYBER_RUN7 */\r\n\t{ SPR_CYBR,3,2,A_Chase,S_CYBER_RUN1,0,0 },\t\t\t/* S_CYBER_RUN8 */\r\n\t{ SPR_CYBR,4,3,A_FaceTarget,S_CYBER_ATK2,0,0 },\t\t/* S_CYBER_ATK1 */\r\n\t{ SPR_CYBR,5,6,A_CyberAttack,S_CYBER_ATK3,0,0 },\t/* S_CYBER_ATK2 */\r\n\t{ SPR_CYBR,4,6,A_FaceTarget,S_CYBER_ATK4,0,0 },\t\t/* S_CYBER_ATK3 */\r\n\t{ SPR_CYBR,5,6,A_CyberAttack,S_CYBER_ATK5,0 },\t\t/* S_CYBER_ATK4 */\r\n\t{ SPR_CYBR,4,6,A_FaceTarget,S_CYBER_ATK6,0,0 },\t\t/* S_CYBER_ATK5 */\r\n\t{ SPR_CYBR,5,6,A_CyberAttack,S_CYBER_RUN1,0,0 },\t/* S_CYBER_ATK6 */\r\n\t{ SPR_CYBR,6,5,A_Pain,S_CYBER_RUN1,0,0 },\t\t\t/* S_CYBER_PAIN */\r\n\t{ SPR_CYBR,7,5,NULL,S_CYBER_DIE2,0,0 },\t\t\t\t/* S_CYBER_DIE1 */\r\n\t{ SPR_CYBR,8,5,A_Scream,S_CYBER_DIE3,0,0 },\t\t\t/* S_CYBER_DIE2 */\r\n\t{ SPR_CYBR,9,5,NULL,S_CYBER_DIE4,0,0 },\t\t\t\t/* S_CYBER_DIE3 */\r\n\t{ SPR_CYBR,10,5,NULL,S_CYBER_DIE5,0,0 },\t\t\t/* S_CYBER_DIE4 */\r\n\t{ SPR_CYBR,11,5,NULL,S_CYBER_DIE6,0,0 },\t\t\t/* S_CYBER_DIE5 */\r\n\t{ SPR_CYBR,12,5,A_Fall,S_CYBER_DIE7,0,0 },\t\t\t/* S_CYBER_DIE6 */\r\n\t{ SPR_CYBR,13,5,NULL,S_CYBER_DIE8,0,0 },\t\t\t/* S_CYBER_DIE7 */\r\n\t{ SPR_CYBR,14,5,NULL,S_CYBER_DIE9,0,0 },\t\t\t/* S_CYBER_DIE8 */\r\n\t{ SPR_CYBR,15,15,NULL,S_CYBER_DIE10,0,0 },\t\t\t/* S_CYBER_DIE9 */\r\n\t{ SPR_CYBR,15,-1,A_BossDeath,S_NULL,0,0 },\t\t\t/* S_CYBER_DIE10 */\r\n\t{ SPR_PAIN,0,5,A_Look,S_PAIN_STND,0,0 },\t\t\t/* S_PAIN_STND */\r\n\t{ SPR_PAIN,0,2,A_Chase,S_PAIN_RUN2,0,0 },\t\t\t/* S_PAIN_RUN1 */\r\n\t{ SPR_PAIN,0,2,A_Chase,S_PAIN_RUN3,0,0 },\t\t\t/* S_PAIN_RUN2 */\r\n\t{ SPR_PAIN,1,2,A_Chase,S_PAIN_RUN4,0,0 },\t\t\t/* S_PAIN_RUN3 */\r\n\t{ SPR_PAIN,1,2,A_Chase,S_PAIN_RUN5,0,0 },\t\t\t/* S_PAIN_RUN4 */\r\n\t{ SPR_PAIN,2,2,A_Chase,S_PAIN_RUN6,0,0 },\t\t\t/* S_PAIN_RUN5 */\r\n\t{ SPR_PAIN,2,2,A_Chase,S_PAIN_RUN1,0,0 },\t\t\t/* S_PAIN_RUN6 */\r\n\t{ SPR_PAIN,3,3,A_FaceTarget,S_PAIN_ATK2,0,0 },\t\t/* S_PAIN_ATK1 */\r\n\t{ SPR_PAIN,4,3,A_FaceTarget,S_PAIN_ATK3,0,0 },\t\t/* S_PAIN_ATK2 */\r\n\t{ SPR_PAIN,32773,3,A_FaceTarget,S_PAIN_ATK4,0,0 },\t/* S_PAIN_ATK3 */\r\n\t{ SPR_PAIN,32773,0,A_PainAttack,S_PAIN_RUN1,0,0 },\t/* S_PAIN_ATK4 */\r\n\t{ SPR_PAIN,6,3,NULL,S_PAIN_PAIN2,0,0 },\t\t\t\t/* S_PAIN_PAIN */\r\n\t{ SPR_PAIN,6,3,A_Pain,S_PAIN_RUN1,0,0 },\t\t\t/* S_PAIN_PAIN2 */\r\n\t{ SPR_PAIN,32775,4,NULL,S_PAIN_DIE2,0,0 },\t\t\t/* S_PAIN_DIE1 */\r\n\t{ SPR_PAIN,32776,4,A_Scream,S_PAIN_DIE3,0,0 },\t\t/* S_PAIN_DIE2 */\r\n\t{ SPR_PAIN,32777,4,NULL,S_PAIN_DIE4,0,0 },\t\t\t/* S_PAIN_DIE3 */\r\n\t{ SPR_PAIN,32778,4,NULL,S_PAIN_DIE5,0,0 },\t\t\t/* S_PAIN_DIE4 */\r\n\t{ SPR_PAIN,32779,4,A_PainDie,S_PAIN_DIE6,0,0 },\t\t/* S_PAIN_DIE5 */\r\n\t{ SPR_PAIN,32780,4,NULL,S_NULL,0,0 },\t\t\t\t/* S_PAIN_DIE6 */\r\n\t{ SPR_ARM1,0,3,NULL,S_ARM1A,0,0 },\t\t\t\t\t/* S_ARM1 */\r\n\t{ SPR_ARM1,32769,3,NULL,S_ARM1,0,0 },\t\t\t\t/* S_ARM1A */\r\n\t{ SPR_ARM2,0,3,NULL,S_ARM2A,0,0 },\t\t\t\t\t/* S_ARM2 */\r\n\t{ SPR_ARM2,32769,3,NULL,S_ARM2,0,0 },\t\t\t\t/* S_ARM2A */\r\n\t{ SPR_BAR1,0,3,NULL,S_BAR2,0,0 },\t\t\t\t\t/* S_BAR1 */\r\n\t{ SPR_BAR1,1,3,NULL,S_BAR1,0,0 },\t\t\t\t\t/* S_BAR2 */\r\n\t{ SPR_BEXP,32768,2,NULL,S_BEXP2,0,0 },\t\t\t\t/* S_BAR2 */\r\n\t{ SPR_BEXP,32769,3,A_Scream,S_BEXP3,0,0 },\t\t\t/* S_BEXP2 */\r\n\t{ SPR_BEXP,32770,3,NULL,S_BEXP4,0,0 },\t\t\t\t/* S_BEXP3 */\r\n\t{ SPR_BEXP,32771,5,A_Explode,S_BEXP5,0,0 },\t\t\t/* S_BEXP4 */\r\n\t{ SPR_BEXP,32772,5,NULL,S_NULL,0,0 },\t\t\t\t/* S_BEXP5 */\r\n\t{ SPR_FCAN,32768,2,NULL,S_BBAR2,0,0 },\t\t\t\t/* S_BBAR1 */\r\n\t{ SPR_FCAN,32769,2,NULL,S_BBAR3,0,0 },\t\t\t\t/* S_BBAR2 */\r\n\t{ SPR_FCAN,32770,2,NULL,S_BBAR1,0,0 },\t\t\t\t/* S_BBAR3 */\r\n\t{ SPR_BON1,0,3,NULL,S_BON1A,0,0 },\t\t\t\t\t/* S_BON1 */\r\n\t{ SPR_BON1,1,3,NULL,S_BON1B,0,0 },\t\t\t\t\t/* S_BON1A */\r\n\t{ SPR_BON1,2,3,NULL,S_BON1C,0,0 },\t\t\t\t\t/* S_BON1B */\r\n\t{ SPR_BON1,3,3,NULL,S_BON1D,0,0 },\t\t\t\t\t/* S_BON1C */\r\n\t{ SPR_BON1,2,3,NULL,S_BON1E,0,0 },\t\t\t\t\t/* S_BON1D */\r\n\t{ SPR_BON1,1,3,NULL,S_BON1,0,0 },\t\t\t\t\t/* S_BON1E */\r\n\t{ SPR_BON2,0,3,NULL,S_BON2A,0,0 },\t\t\t\t\t/* S_BON2 */\r\n\t{ SPR_BON2,1,3,NULL,S_BON2B,0,0 },\t\t\t\t\t/* S_BON2A */\r\n\t{ SPR_BON2,2,3,NULL,S_BON2C,0,0 },\t\t\t\t\t/* S_BON2B */\r\n\t{ SPR_BON2,3,3,NULL,S_BON2D,0,0 },\t\t\t\t\t/* S_BON2C */\r\n\t{ SPR_BON2,2,3,NULL,S_BON2E,0,0 },\t\t\t\t\t/* S_BON2D */\r\n\t{ SPR_BON2,1,3,NULL,S_BON2,0,0 },\t\t\t\t\t/* S_BON2E */\r\n\t{ SPR_BKEY,0,5,NULL,S_BKEY2,0,0 },\t\t\t\t\t/* S_BKEY */\r\n\t{ SPR_BKEY,32769,5,NULL,S_BKEY,0,0 },\t\t\t\t/* S_BKEY2 */\r\n\t{ SPR_RKEY,0,5,NULL,S_RKEY2,0,0 },\t\t\t\t\t/* S_RKEY */\r\n\t{ SPR_RKEY,32769,5,NULL,S_RKEY,0,0 },\t\t\t\t/* S_RKEY2 */\r\n\t{ SPR_YKEY,0,5,NULL,S_YKEY2,0,0 },\t\t\t\t\t/* S_YKEY */\r\n\t{ SPR_YKEY,32769,5,NULL,S_YKEY,0,0 },\t\t\t\t/* S_YKEY2 */\r\n\t{ SPR_BSKU,0,5,NULL,S_BSKULL2,0,0 },\t\t\t\t/* S_BSKULL */\r\n\t{ SPR_BSKU,32769,5,NULL,S_BSKULL,0,0 },\t\t\t\t/* S_BSKULL2 */\r\n\t{ SPR_RSKU,0,5,NULL,S_RSKULL2,0,0 },\t\t\t\t/* S_RSKULL */\r\n\t{ SPR_RSKU,32769,5,NULL,S_RSKULL,0,0 },\t\t\t\t/* S_RSKULL2 */\r\n\t{ SPR_YSKU,0,5,NULL,S_YSKULL2,0,0 },\t\t\t\t/* S_YSKULL */\r\n\t{ SPR_YSKU,32769,5,NULL,S_YSKULL,0,0 },\t\t\t\t/* S_YSKULL2 */\r\n\t{ SPR_STIM,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_STIM */\r\n\t{ SPR_MEDI,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_MEDI */\r\n\t{ SPR_SOUL,32768,3,NULL,S_SOUL2,0,0 },\t\t\t\t/* S_SOUL */\r\n\t{ SPR_SOUL,32769,3,NULL,S_SOUL3,0,0 },\t\t\t\t/* S_SOUL2 */\r\n\t{ SPR_SOUL,32770,3,NULL,S_SOUL4,0,0 },\t\t\t\t/* S_SOUL3 */\r\n\t{ SPR_SOUL,32771,3,NULL,S_SOUL5,0,0 },\t\t\t\t/* S_SOUL4 */\r\n\t{ SPR_SOUL,32770,3,NULL,S_SOUL6,0,0 },\t\t\t\t/* S_SOUL5 */\r\n\t{ SPR_SOUL,32769,3,NULL,S_SOUL,0,0 },\t\t\t\t/* S_SOUL6 */\r\n\t{ SPR_PINV,32768,3,NULL,S_PINV2,0,0 },\t\t\t\t/* S_PINV */\r\n\t{ SPR_PINV,32769,3,NULL,S_PINV3,0,0 },\t\t\t\t/* S_PINV2 */\r\n\t{ SPR_PINV,32770,3,NULL,S_PINV4,0,0 },\t\t\t\t/* S_PINV3 */\r\n\t{ SPR_PINV,32771,3,NULL,S_PINV,0,0 },\t\t\t\t/* S_PINV4 */\r\n\t{ SPR_PSTR,32768,-1,NULL,S_NULL,0,0 },\t\t\t\t/* S_PSTR */\r\n\t{ SPR_PINS,32768,3,NULL,S_PINS2,0,0 },\t\t\t\t/* S_PINS */\r\n\t{ SPR_PINS,32769,3,NULL,S_PINS3,0,0 },\t\t\t\t/* S_PINS2 */\r\n\t{ SPR_PINS,32770,3,NULL,S_PINS4,0,0 },\t\t\t\t/* S_PINS3 */\r\n\t{ SPR_PINS,32771,3,NULL,S_PINS,0,0 },\t\t\t\t/* S_PINS4 */\r\n\t{ SPR_MEGA,32768,6,NULL,S_MEGA2,0,0 },\t\t\t\t/* S_MEGA */\r\n\t{ SPR_MEGA,32769,6,NULL,S_MEGA3,0,0 },\t\t\t\t/* S_MEGA2 */\r\n\t{ SPR_MEGA,32770,6,NULL,S_MEGA4,0,0 },\t\t\t\t/* S_MEGA3 */\r\n\t{ SPR_MEGA,32771,6,NULL,S_MEGA,0,0 },\t\t\t\t/* S_MEGA4 */\r\n\t{ SPR_SUIT,32768,-1,NULL,S_NULL,0,0 },\t\t\t\t/* S_SUIT */\r\n\t{ SPR_PMAP,32768,3,NULL,S_PMAP2,0,0 },\t\t\t\t/* S_PMAP */\r\n\t{ SPR_PMAP,32769,3,NULL,S_PMAP3,0,0 },\t\t\t\t/* S_PMAP2 */\r\n\t{ SPR_PMAP,32770,3,NULL,S_PMAP4,0,0 },\t\t\t\t/* S_PMAP3 */\r\n\t{ SPR_PMAP,32771,3,NULL,S_PMAP5,0,0 },\t\t\t\t/* S_PMAP4 */\r\n\t{ SPR_PMAP,32770,3,NULL,S_PMAP6,0,0 },\t\t\t\t/* S_PMAP5 */\r\n\t{ SPR_PMAP,32769,3,NULL,S_PMAP,0,0 },\t\t\t\t/* S_PMAP6 */\r\n\t{ SPR_PVIS,32768,3,NULL,S_PVIS2,0,0 },\t\t\t\t/* S_PVIS */\r\n\t{ SPR_PVIS,1,3,NULL,S_PVIS,0,0 },\t\t\t\t\t/* S_PVIS2 */\r\n\t{ SPR_CLIP,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_CLIP */\r\n\t{ SPR_AMMO,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_AMMO */\r\n\t{ SPR_ROCK,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_ROCK */\r\n\t{ SPR_BROK,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_BROK */\r\n\t{ SPR_CELL,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_CELL */\r\n\t{ SPR_CELP,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_CELP */\r\n\t{ SPR_SHEL,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_SHEL */\r\n\t{ SPR_SBOX,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_SBOX */\r\n\t{ SPR_BPAK,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_BPAK */\r\n\t{ SPR_BFUG,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_BFUG */\r\n\t{ SPR_MGUN,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_MGUN */\r\n\t{ SPR_CSAW,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_CSAW */\r\n\t{ SPR_LAUN,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_LAUN */\r\n\t{ SPR_PLAS,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_PLAS */\r\n\t{ SPR_SHOT,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_SHOT */\r\n\t{ SPR_SGN2,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_SHOT2 */\r\n\t{ SPR_COLU,32768,-1,NULL,S_NULL,0,0 },\t\t\t\t/* S_COLU */\r\n\t{ SPR_SMT2,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_STALAG */\r\n\t{ SPR_PLAY,13,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_DEADTORSO */\r\n\t{ SPR_PLAY,18,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_DEADBOTTOM */\r\n\t{ SPR_POL2,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_HEADSONSTICK */\r\n\t{ SPR_POL5,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_GIBS */\r\n\t{ SPR_POL4,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_HEADONASTICK */\r\n\t{ SPR_POL1,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_DEADSTICK */\r\n\t{ SPR_GOR2,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_MEAT2 */\r\n\t{ SPR_GOR3,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_MEAT3 */\r\n\t{ SPR_GOR4,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_MEAT4 */\r\n\t{ SPR_GOR5,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_MEAT5 */\r\n\t{ SPR_SMIT,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_STALAGTITE */\r\n\t{ SPR_COL1,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_TALLGRNCOL */\r\n\t{ SPR_COL2,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_SHRTGRNCOL */\r\n\t{ SPR_COL3,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_TALLREDCOL */\r\n\t{ SPR_COL4,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_SHRTREDCOL */\r\n\t{ SPR_COL6,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_SKULLCOL */\r\n\t{ SPR_CAND,32768,-1,NULL,S_NULL,0,0 },\t\t\t\t/* S_CANDLESTIK */\r\n\t{ SPR_CBRA,32768,-1,NULL,S_NULL,0,0 },\t\t\t\t/* S_CANDELABRA */\r\n\t{ SPR_TRE1,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_TORCHTREE */\r\n\t{ SPR_ELEC,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_TECHPILLAR */\r\n\t{ SPR_FSKU,32768,3,NULL,S_FLOATSKULL2,0,0 },\t\t/* S_FLOATSKULL */\r\n\t{ SPR_FSKU,32769,3,NULL,S_FLOATSKULL3,0,0 },\t\t/* S_FLOATSKULL2 */\r\n\t{ SPR_FSKU,32770,3,NULL,S_FLOATSKULL,0,0 },\t\t\t/* S_FLOATSKULL3 */\r\n\t{ SPR_SMBT,32768,2,NULL,S_BTORCHSHRT2,0,0 },\t\t/* S_BTORCHSHRT */\r\n\t{ SPR_SMBT,32769,2,NULL,S_BTORCHSHRT3,0,0 },\t\t/* S_BTORCHSHRT2 */\r\n\t{ SPR_SMBT,32770,2,NULL,S_BTORCHSHRT4,0,0 },\t\t/* S_BTORCHSHRT3 */\r\n\t{ SPR_SMBT,32771,2,NULL,S_BTORCHSHRT,0,0 },\t\t\t/* S_BTORCHSHRT4 */\r\n\t{ SPR_SMGT,32768,2,NULL,S_GTORCHSHRT2,0,0 },\t\t/* S_GTORCHSHRT */\r\n\t{ SPR_SMGT,32769,2,NULL,S_GTORCHSHRT3,0,0 },\t\t/* S_GTORCHSHRT2 */\r\n\t{ SPR_SMGT,32770,2,NULL,S_GTORCHSHRT4,0,0 },\t\t/* S_GTORCHSHRT3 */\r\n\t{ SPR_SMGT,32771,2,NULL,S_GTORCHSHRT,0,0 },\t\t\t/* S_GTORCHSHRT4 */\r\n\t{ SPR_SMRT,32768,2,NULL,S_RTORCHSHRT2,0,0 },\t\t/* S_RTORCHSHRT */\r\n\t{ SPR_SMRT,32769,2,NULL,S_RTORCHSHRT3,0,0 },\t\t/* S_RTORCHSHRT2 */\r\n\t{ SPR_SMRT,32770,2,NULL,S_RTORCHSHRT4,0,0 },\t\t/* S_RTORCHSHRT3 */\r\n\t{ SPR_SMRT,32771,2,NULL,S_RTORCHSHRT,0,0 },\t\t\t/* S_RTORCHSHRT4 */\r\n\t{ SPR_HANC,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_HANGCHAIN */\r\n\t{ SPR_BLCH,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_HANGCBLOOD */\r\n\t{ SPR_HANL,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_HANGLAMP */\r\n\t{ SPR_DED1,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_DEADPLAY */\r\n\t{ SPR_DED2,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_DEADPOSS */\r\n\t{ SPR_DED3,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_DEADSPOS */\r\n\t{ SPR_DED4,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_DEADTROO */\r\n\t{ SPR_DED5,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_DEADSARG */\r\n\t{ SPR_DED6,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_DEADHEAD */\r\n\t{ SPR_TLMP,32768,2,NULL,S_TECHLAMP2,0,0 },\t\t\t/* S_TECHLAMP */\r\n\t{ SPR_TLMP,32769,2,NULL,S_TECHLAMP3,0,0 },\t\t\t/* S_TECHLAMP2 */\r\n\t{ SPR_TLMP,32770,2,NULL,S_TECHLAMP4,0,0 },\t\t\t/* S_TECHLAMP3 */\r\n\t{ SPR_TLMP,32771,2,NULL,S_TECHLAMP,0,0 },\t\t\t/* S_TECHLAMP4 */\r\n\t{ SPR_TLP2,32768,2,NULL,S_TECH2LAMP2,0,0 },\t\t\t/* S_TECH2LAMP */\r\n\t{ SPR_TLP2,32769,2,NULL,S_TECH2LAMP3,0,0 },\t\t\t/* S_TECH2LAMP2 */\r\n\t{ SPR_TLP2,32770,2,NULL,S_TECH2LAMP4,0,0 },\t\t\t/* S_TECH2LAMP3 */\r\n\t{ SPR_TLP2,32771,2,NULL,S_TECH2LAMP,0,0 },\t\t\t/* S_TECH2LAMP4 */\r\n\t{ SPR_COL5,0,7,NULL,S_HEARTCOL2,0,0 },\t\t\t\t/* S_HEARTCOL */\r\n\t{ SPR_COL5,1,7,NULL,S_HEARTCOL,0,0 },\t\t\t\t/* S_HEARTCOL2 */\r\n\t{ SPR_CEYE,32768,3,NULL,S_EVILEYE2,0,0 },\t\t\t/* S_EVILEYE */\r\n\t{ SPR_CEYE,32769,3,NULL,S_EVILEYE3,0,0 },\t\t\t/* S_EVILEYE2 */\r\n\t{ SPR_CEYE,32770,3,NULL,S_EVILEYE4,0,0 },\t\t\t/* S_EVILEYE3 */\r\n\t{ SPR_CEYE,32769,3,NULL,S_EVILEYE,0,0 },\t\t\t/* S_EVILEYE4 */\r\n\t{ SPR_TBLU,32768,2,NULL,S_BLUETORCH2,0,0 },\t\t\t/* S_BLUETORCH */\r\n\t{ SPR_TBLU,32769,2,NULL,S_BLUETORCH3,0,0 },\t\t\t/* S_BLUETORCH2 */\r\n\t{ SPR_TBLU,32770,2,NULL,S_BLUETORCH4,0,0 },\t\t\t/* S_BLUETORCH3 */\r\n\t{ SPR_TBLU,32771,2,NULL,S_BLUETORCH,0,0 },\t\t\t/* S_BLUETORCH4 */\r\n\t{ SPR_TGRN,32768,2,NULL,S_GREENTORCH2,0,0 },\t\t/* S_GREENTORCH */\r\n\t{ SPR_TGRN,32769,2,NULL,S_GREENTORCH3,0,0 },\t\t/* S_GREENTORCH2 */\r\n\t{ SPR_TGRN,32770,2,NULL,S_GREENTORCH4,0,0 },\t\t/* S_GREENTORCH3 */\r\n\t{ SPR_TGRN,32771,2,NULL,S_GREENTORCH,0,0 },\t\t\t/* S_GREENTORCH4 */\r\n\t{ SPR_TRED,32768,2,NULL,S_REDTORCH2,0,0 },\t\t\t/* S_REDTORCH */\r\n\t{ SPR_TRED,32769,2,NULL,S_REDTORCH3,0,0 },\t\t\t/* S_REDTORCH2 */\r\n\t{ SPR_TRED,32770,2,NULL,S_REDTORCH4,0,0 },\t\t\t/* S_REDTORCH3 */\r\n\t{ SPR_TRED,32771,2,NULL,S_REDTORCH,0,0 },\t\t\t/* S_REDTORCH4 */\r\n\t{ SPR_GOR1,0,5,NULL,S_BLOODYTWITCH2,0,0 },\t\t\t/* S_BLOODYTWITCH */\r\n\t{ SPR_GOR1,1,7,NULL,S_BLOODYTWITCH3,0,0 },\t\t\t/* S_BLOODYTWITCH2 */\r\n\t{ SPR_GOR1,2,4,NULL,S_BLOODYTWITCH4,0,0 },\t\t\t/* S_BLOODYTWITCH3 */\r\n\t{ SPR_GOR1,1,3,NULL,S_BLOODYTWITCH,0,0 },\t\t\t/* S_BLOODYTWITCH4 */\r\n\t{ SPR_POL3,32768,3,NULL,S_HEADCANDLES2,0,0 },\t\t/* S_HEADCANDLES */\r\n\t{ SPR_POL3,32769,3,NULL,S_HEADCANDLES,0,0 },\t\t/* S_HEADCANDLES2 */\r\n\t{ SPR_POL6,0,3,NULL,S_LIVESTICK2,0,0 },\t\t\t\t/* S_LIVESTICK */\r\n\t{ SPR_POL6,1,4,NULL,S_LIVESTICK,0,0 },\t\t\t\t/* S_LIVESTICK2 */\r\n\t{ SPR_TRE2,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_BIGTREE */\r\n\t{ SPR_HDB1,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_HANGNOGUTS */\r\n\t{ SPR_HDB2,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_HANGBNOBRAIN */\r\n\t{ SPR_HDB3,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_HANGTLOOKDN */\r\n\t{ SPR_HDB4,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_HANGTSKULL */\r\n\t{ SPR_HDB5,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_HANGTLOOKUP */\r\n\t{ SPR_HDB6,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_HANGTNOBRAIN */\r\n\t{ SPR_POB1,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_COLONGIBS */\r\n\t{ SPR_POB2,0,-1,NULL,S_NULL,0,0 },\t\t\t\t\t/* S_SMALLPOOL */\r\n\t{ SPR_BRS1,0,-1,NULL,S_NULL,0,0 }\t\t\t\t\t/* S_BRAINSTEM */\r\n};\r\n\r\nmobjinfo_t mobjinfo[NUMMOBJTYPES] = //8005DE6C\r\n{\r\n\t{\t/* MT_PLAYER */\r\n\t\t-1,\t\t\t\t/* doomednum */\r\n\t\tS_PLAY,\t\t\t/* spawnstate */\r\n\t\t100,\t\t\t/* spawnhealth */\r\n\t\tS_PLAY_RUN1,\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t0,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_PLAY_PAIN,\t/* painstate */\r\n\t\t255,\t\t\t/* painchance */\r\n\t\tsfx_plpain,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_PLAY_ATK1,\t/* missilestate */\r\n\t\tS_PLAY_DIE1,\t/* deathstate */\r\n\t\tS_PLAY_XDIE1,\t/* xdeathstate */\r\n\t\tsfx_pldeth,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t56 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SHOOTABLE | MF_DROPOFF | MF_PICKUP | MF_NOTDMATCH\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_POSSESSED */\r\n\t\t3004,\t\t\t/* doomednum */\r\n\t\tS_POSS_STND,\t/* spawnstate */\r\n\t\t20,\t\t\t\t/* spawnhealth */\r\n\t\tS_POSS_RUN1,\t/* seestate */\r\n\t\tsfx_posit1,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_pistol,\t\t/* attacksound */\r\n\t\tS_POSS_PAIN,\t/* painstate */\r\n\t\t200,\t\t\t/* painchance */\r\n\t\tsfx_popain,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_POSS_ATK1,\t/* missilestate */\r\n\t\tS_POSS_DIE1,\t/* deathstate */\r\n\t\tS_POSS_XDIE1,\t/* xdeathstate */\r\n\t\tsfx_podth1,\t\t/* deathsound */\r\n\t\t8,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t56 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_posact,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SHOOTABLE | MF_COUNTKILL\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_SHOTGUY */\r\n\t\t9,\t\t\t\t/* doomednum */\r\n\t\tS_SPOS_STND,\t/* spawnstate */\r\n\t\t30,\t\t\t\t/* spawnhealth */\r\n\t\tS_SPOS_RUN1,\t/* seestate */\r\n\t\tsfx_posit2,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_SPOS_PAIN,\t/* painstate */\r\n\t\t170,\t\t\t/* painchance */\r\n\t\tsfx_popain,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_SPOS_ATK1,\t/* missilestate */\r\n\t\tS_SPOS_DIE1,\t/* deathstate */\r\n\t\tS_SPOS_XDIE1,\t/* xdeathstate */\r\n\t\tsfx_podth2,\t\t/* deathsound */\r\n\t\t8,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t56 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_posact,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SHOOTABLE | MF_COUNTKILL\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_UNDEAD */\r\n\t\t66,\t\t\t\t/* doomednum */\r\n\t\tS_SKEL_STND,\t/* spawnstate */\r\n\t\t300,\t\t\t/* spawnhealth */\r\n\t\tS_SKEL_RUN1,\t/* seestate */\r\n\t\tsfx_skesit,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_SKEL_PAIN,\t/* painstate */\r\n\t\t100,\t\t\t/* painchance */\r\n\t\tsfx_popain,\t\t/* painsound */\r\n\t\tS_SKEL_FIST1,\t/* meleestate */\r\n\t\tS_SKEL_MISS1,\t/* missilestate */\r\n\t\tS_SKEL_DIE1,\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_skedth,\t\t/* deathsound */\r\n\t\t10,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t56 * FRACUNIT,\t/* height */\r\n\t\t500,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_skeact,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SHOOTABLE | MF_COUNTKILL\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_TRACER */\r\n\t\t-1,\t\t\t\t/* doomednum */\r\n\t\tS_TRACER,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_skeatk,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_TRACEEXP1,\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_barexp,\t\t/* deathsound */\r\n\t\t10 * FRACUNIT,\t/* speed */\r\n\t\t11 * FRACUNIT,\t/* radius */\r\n\t\t8 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t10,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_NOBLOCKMAP | MF_NOGRAVITY | MF_DROPOFF | MF_MISSILE\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_SMOKE */\r\n\t\t-1,\t\t\t\t/* doomednum */\r\n\t\tS_SMOKE1,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_NOBLOCKMAP | MF_NOGRAVITY\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_FATSO */\r\n\t\t67,\t\t\t\t/* doomednum */\r\n\t\tS_FATT_STND,\t/* spawnstate */\r\n\t\t600,\t\t\t/* spawnhealth */\r\n\t\tS_FATT_RUN1,\t/* seestate */\r\n\t\tsfx_mansit,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_FATT_PAIN,\t/* painstate */\r\n\t\t80,\t\t\t\t/* painchance */\r\n\t\tsfx_mnpain,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_FATT_ATK1,\t/* missilestate */\r\n\t\tS_FATT_DIE1,\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_mandth,\t\t/* deathsound */\r\n\t\t8,\t\t\t\t/* speed */\r\n\t\t48 * FRACUNIT,\t/* radius */\r\n\t\t64 * FRACUNIT,\t/* height */\r\n\t\t1000,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_posact,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SHOOTABLE | MF_COUNTKILL\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_FATSHOT */\r\n\t\t-1,\t\t\t\t/* doomednum */\r\n\t\tS_FATSHOT1,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_firsht,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_FATSHOTX1,\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_firxpl,\t\t/* deathsound */\r\n\t\t30 * FRACUNIT,\t/* speed */\r\n\t\t6 * FRACUNIT,\t/* radius */\r\n\t\t8 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t8,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_NOBLOCKMAP | MF_NOGRAVITY | MF_DROPOFF | MF_MISSILE\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_CHAINGUY */\r\n\t\t65,\t\t\t\t/* doomednum */\r\n\t\tS_CPOS_STND,\t/* spawnstate */\r\n\t\t70,\t\t\t\t/* spawnhealth */\r\n\t\tS_CPOS_RUN1,\t/* seestate */\r\n\t\tsfx_posit2,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_CPOS_PAIN,\t/* painstate */\r\n\t\t170,\t\t\t/* painchance */\r\n\t\tsfx_popain,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_CPOS_ATK1,\t/* missilestate */\r\n\t\tS_CPOS_DIE1,\t/* deathstate */\r\n\t\tS_CPOS_XDIE1,\t/* xdeathstate */\r\n\t\tsfx_podth2,\t\t/* deathsound */\r\n\t\t8,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t56 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_posact,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SHOOTABLE | MF_COUNTKILL\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_TROOP */\r\n\t\t3001,\t\t\t/* doomednum */\r\n\t\tS_TROO_STND,\t/* spawnstate */\r\n\t\t60,\t\t\t\t/* spawnhealth */\r\n\t\tS_TROO_RUN1,\t/* seestate */\r\n\t\tsfx_bgsit1,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_TROO_PAIN,\t/* painstate */\r\n\t\t200,\t\t\t/* painchance */\r\n\t\tsfx_popain,\t\t/* painsound */\r\n\t\tS_TROO_ATK1,\t/* meleestate */\r\n\t\tS_TROO_ATK1,\t/* missilestate */\r\n\t\tS_TROO_DIE1,\t/* deathstate */\r\n\t\tS_TROO_XDIE1,\t/* xdeathstate */\r\n\t\tsfx_bgdth1,\t\t/* deathsound */\r\n\t\t8,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t56 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_bgact,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SHOOTABLE | MF_COUNTKILL\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_SERGEANT */\r\n\t\t3002,\t\t\t/* doomednum */\r\n\t\tS_SARG_STND,\t/* spawnstate */\r\n\t\t150,\t\t\t/* spawnhealth */\r\n\t\tS_SARG_RUN1,\t/* seestate */\r\n\t\tsfx_sgtsit,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_sgtatk,\t\t/* attacksound */\r\n\t\tS_SARG_PAIN,\t/* painstate */\r\n\t\t180,\t\t\t/* painchance */\r\n\t\tsfx_dmpain,\t\t/* painsound */\r\n\t\tS_SARG_ATK1,\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_SARG_DIE1,\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_sgtdth,\t\t/* deathsound */\r\n\t\t10,\t\t\t\t/* speed */\r\n\t\t30 * FRACUNIT,\t/* radius */\r\n\t\t56 * FRACUNIT,\t/* height */\r\n\t\t400,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_dmact,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SHOOTABLE | MF_COUNTKILL\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_HEAD */\r\n\t\t3005,\t\t\t/* doomednum */\r\n\t\tS_HEAD_STND,\t/* spawnstate */\r\n\t\t400,\t\t\t/* spawnhealth */\r\n\t\tS_HEAD_RUN1,\t/* seestate */\r\n\t\tsfx_cacsit,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_HEAD_PAIN,\t/* painstate */\r\n\t\t128,\t\t\t/* painchance */\r\n\t\tsfx_dmpain,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_HEAD_ATK1,\t/* missilestate */\r\n\t\tS_HEAD_DIE1,\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_cacdth,\t\t/* deathsound */\r\n\t\t8,\t\t\t\t/* speed */\r\n\t\t31 * FRACUNIT,\t/* radius */\r\n\t\t56 * FRACUNIT,\t/* height */\r\n\t\t400,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_dmact,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SHOOTABLE | MF_NOGRAVITY | MF_FLOAT | MF_COUNTKILL\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_BRUISER */\r\n\t\t3003,\t\t\t/* doomednum */\r\n\t\tS_BOSS_STND,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_BOSS_RUN1,\t/* seestate */\r\n\t\tsfx_brssit,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_BOSS_PAIN,\t/* painstate */\r\n\t\t50,\t\t\t\t/* painchance */\r\n\t\tsfx_dmpain,\t\t/* painsound */\r\n\t\tS_BOSS_ATK1,\t/* meleestate */\r\n\t\tS_BOSS_ATK1,\t/* missilestate */\r\n\t\tS_BOSS_DIE1,\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_brsdth,\t\t/* deathsound */\r\n\t\t8,\t\t\t\t/* speed */\r\n\t\t24 * FRACUNIT,\t/* radius */\r\n\t\t64 * FRACUNIT,\t/* height */\r\n\t\t1000,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_dmact,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SHOOTABLE | MF_COUNTKILL\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_KNIGHT */\r\n\t\t69,\t\t\t\t/* doomednum */\r\n\t\tS_BOS2_STND,\t/* spawnstate */\r\n\t\t500,\t\t\t/* spawnhealth */\r\n\t\tS_BOS2_RUN1,\t/* seestate */\r\n\t\tsfx_kntsit,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_BOS2_PAIN,\t/* painstate */\r\n\t\t50,\t\t\t\t/* painchance */\r\n\t\tsfx_dmpain,\t\t/* painsound */\r\n\t\tS_BOS2_ATK1,\t/* meleestate */\r\n\t\tS_BOS2_ATK1,\t/* missilestate */\r\n\t\tS_BOS2_DIE1,\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_kntdth,\t\t/* deathsound */\r\n\t\t8,\t\t\t\t/* speed */\r\n\t\t24 * FRACUNIT,\t/* radius */\r\n\t\t64 * FRACUNIT,\t/* height */\r\n\t\t1000,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_dmact,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SHOOTABLE | MF_COUNTKILL\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_SKULL */\r\n\t\t3006,\t\t\t/* doomednum */\r\n\t\tS_SKULL_STND,\t/* spawnstate */\r\n\t\t60,\t\t\t\t/* spawnhealth */\r\n\t\tS_SKULL_RUN1,\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_sklatk,\t\t/* attacksound */\r\n\t\tS_SKULL_PAIN,\t/* painstate */\r\n\t\t256,\t\t\t/* painchance */\r\n\t\tsfx_dmpain,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_SKULL_ATK1,\t/* missilestate */\r\n\t\tS_SKULL_DIE1,\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_firxpl,\t\t/* deathsound */\r\n\t\t8,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t56 * FRACUNIT,\t/* height */\r\n\t\t50,\t\t\t\t/* mass */\r\n\t\t3,\t\t\t\t/* damage */\r\n\t\tsfx_dmact,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SHOOTABLE | MF_NOGRAVITY | MF_FLOAT | MF_COUNTKILL\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_SPIDER */\r\n\t\t7,\t\t\t\t/* doomednum */\r\n\t\tS_SPID_STND,\t/* spawnstate */\r\n\t\t3000,\t\t\t/* spawnhealth */\r\n\t\tS_SPID_RUN1,\t/* seestate */\r\n\t\tsfx_spisit,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_pistol,\t\t/* attacksound */\r\n\t\tS_SPID_PAIN,\t/* painstate */\r\n\t\t40,\t\t\t\t/* painchance */\r\n\t\tsfx_dmpain,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_SPID_ATK1,\t/* missilestate */\r\n\t\tS_SPID_DIE1,\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_spidth,\t\t/* deathsound */\r\n\t\t12,\t\t\t\t/* speed */\r\n\t\t128 * FRACUNIT,\t/* radius */\r\n\t\t100 * FRACUNIT,\t/* height */\r\n\t\t1000,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_dmact,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SHOOTABLE | MF_COUNTKILL\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_BABY */\r\n\t\t68,\t\t\t\t/* doomednum */\r\n\t\tS_BSPI_STND,\t/* spawnstate */\r\n\t\t500,\t\t\t/* spawnhealth */\r\n\t\tS_BSPI_SIGHT,\t/* seestate */\r\n\t\tsfx_bspsit,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_BSPI_PAIN,\t/* painstate */\r\n\t\t128,\t\t\t/* painchance */\r\n\t\tsfx_dmpain,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_BSPI_ATK1,\t/* missilestate */\r\n\t\tS_BSPI_DIE1,\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_bspdth,\t\t/* deathsound */\r\n\t\t12,\t\t\t\t/* speed */\r\n\t\t64 * FRACUNIT,\t/* radius */\r\n\t\t64 * FRACUNIT,\t/* height */\r\n\t\t600,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_bspact,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SHOOTABLE | MF_COUNTKILL\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_CYBORG */\r\n\t\t16,\t\t\t\t/* doomednum */\r\n\t\tS_CYBER_STND,\t/* spawnstate */\r\n\t\t4000,\t\t\t/* spawnhealth */\r\n\t\tS_CYBER_RUN1,\t/* seestate */\r\n\t\tsfx_cybsit,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_CYBER_PAIN,\t/* painstate */\r\n\t\t20,\t\t\t\t/* painchance */\r\n\t\tsfx_dmpain,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_CYBER_ATK1,\t/* missilestate */\r\n\t\tS_CYBER_DIE1,\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_cybdth,\t\t/* deathsound */\r\n\t\t16,\t\t\t\t/* speed */\r\n\t\t40 * FRACUNIT,\t/* radius */\r\n\t\t110 * FRACUNIT,\t/* height */\r\n\t\t1000,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_dmact,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SHOOTABLE | MF_COUNTKILL\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_PAIN */\r\n\t\t71,\t\t\t\t/* doomednum */\r\n\t\tS_PAIN_STND,\t/* spawnstate */\r\n\t\t400,\t\t\t/* spawnhealth */\r\n\t\tS_PAIN_RUN1,\t/* seestate */\r\n\t\tsfx_pesit,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_PAIN_PAIN,\t/* painstate */\r\n\t\t128,\t\t\t/* painchance */\r\n\t\tsfx_pepain,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_PAIN_ATK1,\t/* missilestate */\r\n\t\tS_PAIN_DIE1,\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_pedth,\t\t/* deathsound */\r\n\t\t8,\t\t\t\t/* speed */\r\n\t\t31 * FRACUNIT,\t/* radius */\r\n\t\t56 * FRACUNIT,\t/* height */\r\n\t\t400,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_dmact,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SHOOTABLE | MF_NOGRAVITY | MF_FLOAT | MF_COUNTKILL\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_BARREL */\r\n\t\t2035,\t\t\t/* doomednum */\r\n\t\tS_BAR1,\t\t\t/* spawnstate */\r\n\t\t20,\t\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_BEXP,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_barexp,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t10 * FRACUNIT,\t/* radius */\r\n\t\t42 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SHOOTABLE | MF_NOBLOOD\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_TROOPSHOT */\r\n\t\t-1,\t\t\t\t/* doomednum */\r\n\t\tS_TBALL1,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_firsht,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_TBALLX1,\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_firxpl,\t\t/* deathsound */\r\n\t\t20 * FRACUNIT,\t/* speed */\r\n\t\t6 * FRACUNIT,\t/* radius */\r\n\t\t8 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t3,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_NOBLOCKMAP | MF_NOGRAVITY | MF_DROPOFF | MF_MISSILE\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_HEADSHOT */\r\n\t\t-1,\t\t\t\t/* doomednum */\r\n\t\tS_RBALL1,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_firsht,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_RBALLX1,\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_firxpl,\t\t/* deathsound */\r\n\t\t20 * FRACUNIT,\t/* speed */\r\n\t\t6 * FRACUNIT,\t/* radius */\r\n\t\t8 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t5,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_NOBLOCKMAP | MF_NOGRAVITY | MF_DROPOFF | MF_MISSILE\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_BRUISERSHOT */\r\n\t\t-1,\t\t\t\t/* doomednum */\r\n\t\tS_BRBALL1,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_firsht,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_BRBALLX1,\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_firxpl,\t\t/* deathsound */\r\n\t\t30 * FRACUNIT,\t/* speed */\r\n\t\t6 * FRACUNIT,\t/* radius */\r\n\t\t8 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t8,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_NOBLOCKMAP | MF_NOGRAVITY | MF_DROPOFF | MF_MISSILE\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_ROCKET */\r\n\t\t-1,\t\t\t\t/* doomednum */\r\n\t\tS_ROCKET,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_rlaunc,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_EXPLODE1,\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_barexp,\t\t/* deathsound */\r\n\t\t40 * FRACUNIT,\t/* speed */\r\n\t\t11 * FRACUNIT,\t/* radius */\r\n\t\t8 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t20,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_NOBLOCKMAP | MF_NOGRAVITY | MF_DROPOFF | MF_MISSILE\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_PLASMA */\r\n\t\t-1,\t\t\t\t/* doomednum */\r\n\t\tS_PLASBALL,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_plasma,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_PLASEXP,\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_firxpl,\t\t/* deathsound */\r\n\t\t50 * FRACUNIT,\t/* speed */\r\n\t\t13 * FRACUNIT,\t/* radius */\r\n\t\t8 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t5,\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_NOBLOCKMAP | MF_NOGRAVITY | MF_DROPOFF | MF_MISSILE\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_BFG */\r\n\t\t-1,\t\t\t\t/* doomednum */\r\n\t\tS_BFGSHOT,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_BFGLAND,\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_rxplod,\t\t/* deathsound */\r\n\t\t40 * FRACUNIT,\t/* speed */\r\n\t\t13 * FRACUNIT,\t/* radius */\r\n\t\t8 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t100,\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_NOBLOCKMAP | MF_NOGRAVITY | MF_DROPOFF | MF_MISSILE\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_ARACHPLAZ */\r\n\t\t-1,\t\t\t\t/* doomednum */\r\n\t\tS_ARACH_PLAZ,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_plasma,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_ARACH_PLEX,\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_firxpl,\t\t/* deathsound */\r\n\t\t25 * FRACUNIT,\t/* speed */\r\n\t\t13 * FRACUNIT,\t/* radius */\r\n\t\t8 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t5,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_NOBLOCKMAP | MF_NOGRAVITY | MF_DROPOFF | MF_MISSILE\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_PUFF */\r\n\t\t-1,\t\t\t\t/* doomednum */\r\n\t\tS_PUFF1,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_NOBLOCKMAP | MF_NOGRAVITY | MF_BLENDMASK1 | MF_BLENDMASK2/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_BLOOD */\r\n\t\t-1,\t\t\t\t/* doomednum */\r\n\t\tS_BLOOD1,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_NOBLOCKMAP\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_TFOG */\r\n\t\t-1,\t\t\t\t/* doomednum */\r\n\t\tS_TFOG,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_NOBLOCKMAP | MF_NOGRAVITY | MF_BLENDMASK1 | MF_BLENDMASK2\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_IFOG */\r\n\t\t-1,\t\t\t\t/* doomednum */\r\n\t\tS_IFOG,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_NOBLOCKMAP | MF_NOGRAVITY | MF_BLENDMASK1 | MF_BLENDMASK2\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_TELEPORTMAN */\r\n\t\t14,\t\t\t\t/* doomednum */\r\n\t\tS_NULL,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_NOSECTOR | MF_NOBLOCKMAP\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_EXTRABFG */\r\n\t\t-1,\t\t\t\t/* doomednum */\r\n\t\tS_BFGEXP,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_NOBLOCKMAP | MF_NOGRAVITY\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC0 */\r\n\t\t2018,\t\t\t/* doomednum */\r\n\t\tS_ARM1,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC1 */\r\n\t\t2019,\t\t\t/* doomednum */\r\n\t\tS_ARM2,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC2 */\r\n\t\t2014,\t\t\t/* doomednum */\r\n\t\tS_BON1,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL | MF_COUNTITEM\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC3 */\r\n\t\t2015,\t\t\t/* doomednum */\r\n\t\tS_BON2,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL | MF_COUNTITEM\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC4 */\r\n\t\t5,\t\t\t\t/* doomednum */\r\n\t\tS_BKEY,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL | MF_NOTDMATCH\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC5 */\r\n\t\t13,\t\t\t\t/* doomednum */\r\n\t\tS_RKEY,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL | MF_NOTDMATCH\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC6 */\r\n\t\t6,\t\t\t\t/* doomednum */\r\n\t\tS_YKEY,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL | MF_NOTDMATCH\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC7 */\r\n\t\t39,\t\t\t\t/* doomednum */\r\n\t\tS_YSKULL,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL | MF_NOTDMATCH\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC8 */\r\n\t\t38,\t\t\t\t/* doomednum */\r\n\t\tS_RSKULL,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL | MF_NOTDMATCH\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC9 */\r\n\t\t40,\t\t\t\t/* doomednum */\r\n\t\tS_BSKULL,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL | MF_NOTDMATCH\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC10 */\r\n\t\t2011,\t\t\t/* doomednum */\r\n\t\tS_STIM,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC11 */\r\n\t\t2012,\t\t\t/* doomednum */\r\n\t\tS_MEDI,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC12 */\r\n\t\t2013,\t\t\t/* doomednum */\r\n\t\tS_SOUL,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL | MF_COUNTITEM\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_INV */\r\n\t\t2022,\t\t\t/* doomednum */\r\n\t\tS_PINV,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL | MF_COUNTITEM\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC13 */\r\n\t\t2023,\t\t\t/* doomednum */\r\n\t\tS_PSTR,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL | MF_COUNTITEM\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_INS */\r\n\t\t2024,\t\t\t/* doomednum */\r\n\t\tS_PINS,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL | MF_COUNTITEM\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC14 */\r\n\t\t2025,\t\t\t/* doomednum */\r\n\t\tS_SUIT,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC15 */\r\n\t\t2026,\t\t\t/* doomednum */\r\n\t\tS_PMAP,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL | MF_COUNTITEM\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC16 */\r\n\t\t2045,\t\t\t/* doomednum */\r\n\t\tS_PVIS,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL | MF_COUNTITEM\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MEGA */\r\n\t\t83,\t\t\t\t/* doomednum */\r\n\t\tS_MEGA,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL | MF_COUNTITEM\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_CLIP */\r\n\t\t2007,\t\t\t/* doomednum */\r\n\t\tS_CLIP,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC17 */\r\n\t\t2048,\t\t\t/* doomednum */\r\n\t\tS_AMMO,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC18 */\r\n\t\t2010,\t\t\t/* doomednum */\r\n\t\tS_ROCK,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC19 */\r\n\t\t2046,\t\t\t/* doomednum */\r\n\t\tS_BROK,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC20 */\r\n\t\t2047,\t\t\t/* doomednum */\r\n\t\tS_CELL,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC21 */\r\n\t\t17,\t\t\t\t/* doomednum */\r\n\t\tS_CELP,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC22 */\r\n\t\t2008,\t\t\t/* doomednum */\r\n\t\tS_SHEL,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC23 */\r\n\t\t2049,\t\t\t/* doomednum */\r\n\t\tS_SBOX,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC24 */\r\n\t\t8,\t\t\t\t/* doomednum */\r\n\t\tS_BPAK,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC25 */\r\n\t\t2006,\t\t\t/* doomednum */\r\n\t\tS_BFUG,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_CHAINGUN */\r\n\t\t2002,\t\t\t/* doomednum */\r\n\t\tS_MGUN,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC26 */\r\n\t\t2005,\t\t\t/* doomednum */\r\n\t\tS_CSAW,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC27 */\r\n\t\t2003,\t\t\t/* doomednum */\r\n\t\tS_LAUN,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC28 */\r\n\t\t2004,\t\t\t/* doomednum */\r\n\t\tS_PLAS,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_SHOTGUN */\r\n\t\t2001,\t\t\t/* doomednum */\r\n\t\tS_SHOT,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_SUPERSHOTGUN */\r\n\t\t82,\t\t\t\t/* doomednum */\r\n\t\tS_SHOT2,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPECIAL\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC29 */\r\n\t\t85,\t\t\t\t/* doomednum */\r\n\t\tS_TECHLAMP,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC30 */\r\n\t\t86,\t\t\t\t/* doomednum */\r\n\t\tS_TECH2LAMP,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC31 */\r\n\t\t2028,\t\t\t/* doomednum */\r\n\t\tS_COLU,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC32 */\r\n\t\t30,\t\t\t\t/* doomednum */\r\n\t\tS_TALLGRNCOL,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC33 */\r\n\t\t31,\t\t\t\t/* doomednum */\r\n\t\tS_SHRTGRNCOL,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC34 */\r\n\t\t32,\t\t\t\t/* doomednum */\r\n\t\tS_TALLREDCOL,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC35 */\r\n\t\t33,\t\t\t\t/* doomednum */\r\n\t\tS_SHRTREDCOL,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC36 */\r\n\t\t37,\t\t\t\t/* doomednum */\r\n\t\tS_SKULLCOL,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC37 */\r\n\t\t36,\t\t\t\t/* doomednum */\r\n\t\tS_HEARTCOL,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC38 */\r\n\t\t41,\t\t\t\t/* doomednum */\r\n\t\tS_EVILEYE,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC39 */\r\n\t\t42,\t\t\t\t/* doomednum */\r\n\t\tS_FLOATSKULL,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID | 0\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC40 */\r\n\t\t43,\t\t\t\t/* doomednum */\r\n\t\tS_TORCHTREE,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC41 */\r\n\t\t44,\t\t\t\t/* doomednum */\r\n\t\tS_BLUETORCH,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC42 */\r\n\t\t45,\t\t\t\t/* doomednum */\r\n\t\tS_GREENTORCH,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC43 */\r\n\t\t46,\t\t\t\t/* doomednum */\r\n\t\tS_REDTORCH,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC44 */\r\n\t\t55,\t\t\t\t/* doomednum */\r\n\t\tS_BTORCHSHRT,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC45 */\r\n\t\t56,\t\t\t\t/* doomednum */\r\n\t\tS_GTORCHSHRT,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC46 */\r\n\t\t57,\t\t\t\t/* doomednum */\r\n\t\tS_RTORCHSHRT,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC47 */\r\n\t\t47,\t\t\t\t/* doomednum */\r\n\t\tS_STALAGTITE,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC48 */\r\n\t\t48,\t\t\t\t/* doomednum */\r\n\t\tS_TECHPILLAR,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC49 */\r\n\t\t34,\t\t\t\t/* doomednum */\r\n\t\tS_CANDLESTIK,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\t0\t\t\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC50 */\r\n\t\t35,\t\t\t\t/* doomednum */\r\n\t\tS_CANDELABRA,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC51 */\r\n\t\t49,\t\t\t\t/* doomednum */\r\n\t\tS_BLOODYTWITCH,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t68 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SPAWNCEILING | MF_NOGRAVITY\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC52 */\r\n\t\t50,\t\t\t\t/* doomednum */\r\n\t\tS_MEAT2,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t84 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SPAWNCEILING | MF_NOGRAVITY\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC53 */\r\n\t\t51,\t\t\t\t/* doomednum */\r\n\t\tS_MEAT3,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t84 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SPAWNCEILING | MF_NOGRAVITY\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC54 */\r\n\t\t52,\t\t\t\t/* doomednum */\r\n\t\tS_MEAT4,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t68 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SPAWNCEILING | MF_NOGRAVITY\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC55 */\r\n\t\t59,\t\t\t\t/* doomednum */\r\n\t\tS_MEAT2,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t84 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPAWNCEILING | MF_NOGRAVITY | 0\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC56 */\r\n\t\t60,\t\t\t\t/* doomednum */\r\n\t\tS_MEAT4,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t68 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPAWNCEILING | MF_NOGRAVITY\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC57 */\r\n\t\t61,\t\t\t\t/* doomednum */\r\n\t\tS_MEAT3,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t52 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPAWNCEILING | MF_NOGRAVITY\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC58 */\r\n\t\t53,\t\t\t\t/* doomednum */\r\n\t\tS_MEAT5,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t52 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SPAWNCEILING | MF_NOGRAVITY\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC59 */\r\n\t\t62,\t\t\t\t/* doomednum */\r\n\t\tS_MEAT5,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t52 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPAWNCEILING | MF_NOGRAVITY\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC60 */\r\n\t\t63,\t\t\t\t/* doomednum */\r\n\t\tS_HANGCHAIN,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t13 * FRACUNIT,\t/* radius */\r\n\t\t108 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPAWNCEILING | MF_NOGRAVITY\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC61 */\r\n\t\t64,\t\t\t\t/* doomednum */\r\n\t\tS_HANGCBLOOD,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t13 * FRACUNIT,\t/* radius */\r\n\t\t108 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPAWNCEILING | MF_NOGRAVITY\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC62 */\r\n\t\t90,\t\t\t\t/* doomednum */\t\t/* [GEC] FIXME 65 */\r\n\t\tS_HANGLAMP,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t32 * FRACUNIT,\t/* radius */\r\n\t\t71 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SPAWNCEILING | MF_NOGRAVITY\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC63 */\r\n\t\t22,\t\t\t\t/* doomednum */\r\n\t\tS_DEADHEAD,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\t0\t\t\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC64 */\r\n\t\t18,\t\t\t\t/* doomednum */\r\n\t\tS_DEADPOSS,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\t0\t\t\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC65 */\r\n\t\t21,\t\t\t\t/* doomednum */\r\n\t\tS_DEADSARG,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\t0\t\t\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC66 */\r\n\t\t20,\t\t\t\t/* doomednum */\r\n\t\tS_DEADTROO,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\t0\t\t\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC67 */\r\n\t\t19,\t\t\t\t/* doomednum */\r\n\t\tS_DEADSPOS,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\t0\t\t\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC68 */\r\n\t\t10,\t\t\t\t/* doomednum */\r\n\t\tS_DEADPLAY,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\t0\t\t\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC69 */\r\n\t\t12,\t\t\t\t/* doomednum */\r\n\t\tS_DEADPLAY,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\t0\t\t\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC70 */\r\n\t\t28,\t\t\t\t/* doomednum */\r\n\t\tS_HEADSONSTICK,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC71 */\r\n\t\t29,\t\t\t\t/* doomednum */\r\n\t\tS_HEADCANDLES,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC72 */\r\n\t\t24,\t\t\t\t/* doomednum */\r\n\t\tS_GIBS,\t\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\t0\t\t\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC73 */\r\n\t\t27,\t\t\t\t/* doomednum */\r\n\t\tS_HEADONASTICK,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC74 */\r\n\t\t25,\t\t\t\t/* doomednum */\r\n\t\tS_DEADSTICK,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC75 */\r\n\t\t26,\t\t\t\t/* doomednum */\r\n\t\tS_LIVESTICK,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC76 */\r\n\t\t54,\t\t\t\t/* doomednum */\r\n\t\tS_BIGTREE,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t32 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC77 */\r\n\t\t70,\t\t\t\t/* doomednum */\r\n\t\tS_BBAR1,\t\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID\t\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC78 */\r\n\t\t73,\t\t\t\t/* doomednum */\r\n\t\tS_HANGNOGUTS,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t88 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SPAWNCEILING | MF_NOGRAVITY\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC79 */\r\n\t\t74,\t\t\t\t/* doomednum */\r\n\t\tS_HANGBNOBRAIN,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t88 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SPAWNCEILING | MF_NOGRAVITY\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC80 */\r\n\t\t75,\t\t\t\t/* doomednum */\r\n\t\tS_HANGTLOOKDN,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t64 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SPAWNCEILING | MF_NOGRAVITY\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC81 */\r\n\t\t76,\t\t\t\t/* doomednum */\r\n\t\tS_HANGTSKULL,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t64 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SPAWNCEILING | MF_NOGRAVITY\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC82 */\r\n\t\t77,\t\t\t\t/* doomednum */\r\n\t\tS_HANGTLOOKUP,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t64 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SPAWNCEILING | MF_NOGRAVITY\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC83 */\r\n\t\t78,\t\t\t\t/* doomednum */\r\n\t\tS_HANGTNOBRAIN,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t16 * FRACUNIT,\t/* radius */\r\n\t\t64 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_SOLID | MF_SPAWNCEILING | MF_NOGRAVITY\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC84 */\r\n\t\t79,\t\t\t\t/* doomednum */\r\n\t\tS_COLONGIBS,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_NOBLOCKMAP\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC85 */\r\n\t\t80,\t\t\t\t/* doomednum */\r\n\t\tS_SMALLPOOL,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_NOBLOCKMAP\t/* flags */\r\n\t},\r\n\r\n\t{\t/* MT_MISC86 */\r\n\t\t81,\t\t\t\t/* doomednum */\r\n\t\tS_BRAINSTEM,\t/* spawnstate */\r\n\t\t1000,\t\t\t/* spawnhealth */\r\n\t\tS_NULL,\t\t\t/* seestate */\r\n\t\tsfx_None,\t\t/* seesound */\r\n\t\t8,\t\t\t\t/* reactiontime */\r\n\t\tsfx_None,\t\t/* attacksound */\r\n\t\tS_NULL,\t\t\t/* painstate */\r\n\t\t0,\t\t\t\t/* painchance */\r\n\t\tsfx_None,\t\t/* painsound */\r\n\t\tS_NULL,\t\t\t/* meleestate */\r\n\t\tS_NULL,\t\t\t/* missilestate */\r\n\t\tS_NULL,\t\t\t/* deathstate */\r\n\t\tS_NULL,\t\t\t/* xdeathstate */\r\n\t\tsfx_None,\t\t/* deathsound */\r\n\t\t0,\t\t\t\t/* speed */\r\n\t\t20 * FRACUNIT,\t/* radius */\r\n\t\t16 * FRACUNIT,\t/* height */\r\n\t\t100,\t\t\t/* mass */\r\n\t\t0,\t\t\t\t/* damage */\r\n\t\tsfx_None,\t\t/* activesound */\r\n\t\tMF_NOBLOCKMAP\t/* flags */\r\n\t}\r\n};\r\n\r\n"
  },
  {
    "path": "PSXDOOM/info.h",
    "content": "/* generated by multigen */\n\ntypedef enum {\nSPR_TROO,\nSPR_SHTG,\nSPR_PUNG,\nSPR_PISG,\nSPR_PISF,\nSPR_SHTF,\nSPR_SHT2,\nSPR_CHGG,\nSPR_CHGF,\nSPR_MISG,\nSPR_MISF,\nSPR_SAWG,\nSPR_PLSG,\nSPR_PLSF,\nSPR_BFGG,\nSPR_BFGF,\nSPR_BLUD,\nSPR_PUFF,\nSPR_BAL1,\nSPR_BAL2,\nSPR_BAL7,\nSPR_PLSS,\nSPR_PLSE,\nSPR_MISL,\nSPR_BFS1,\nSPR_BFE1,\nSPR_BFE2,\nSPR_TFOG,\nSPR_IFOG,\nSPR_PLAY,\nSPR_POSS,\nSPR_SPOS,\nSPR_FATB,\nSPR_FBXP,\nSPR_SKEL,\nSPR_MANF,\nSPR_FATT,\nSPR_CPOS,\nSPR_SARG,\nSPR_HEAD,\nSPR_BOSS,\nSPR_BOS2,\nSPR_SKUL,\nSPR_SPID,\nSPR_BSPI,\nSPR_APLS,\nSPR_APBX,\nSPR_CYBR,\nSPR_PAIN,\nSPR_ARM1,\nSPR_ARM2,\nSPR_BAR1,\nSPR_BEXP,\nSPR_FCAN,\nSPR_BON1,\nSPR_BON2,\nSPR_BKEY,\nSPR_RKEY,\nSPR_YKEY,\nSPR_BSKU,\nSPR_RSKU,\nSPR_YSKU,\nSPR_STIM,\nSPR_MEDI,\nSPR_SOUL,\nSPR_PINV,\nSPR_PSTR,\nSPR_PINS,\nSPR_MEGA,\nSPR_SUIT,\nSPR_PMAP,\nSPR_PVIS,\nSPR_CLIP,\nSPR_AMMO,\nSPR_ROCK,\nSPR_BROK,\nSPR_CELL,\nSPR_CELP,\nSPR_SHEL,\nSPR_SBOX,\nSPR_BPAK,\nSPR_BFUG,\nSPR_MGUN,\nSPR_CSAW,\nSPR_LAUN,\nSPR_PLAS,\nSPR_SHOT,\nSPR_SGN2,\nSPR_COLU,\nSPR_SMT2,\nSPR_POL2,\nSPR_POL5,\nSPR_POL4,\nSPR_POL1,\nSPR_GOR2,\nSPR_GOR3,\nSPR_GOR4,\nSPR_GOR5,\nSPR_SMIT,\nSPR_COL1,\nSPR_COL2,\nSPR_COL3,\nSPR_COL4,\nSPR_COL6,\nSPR_CAND,\nSPR_CBRA,\nSPR_TRE1,\nSPR_ELEC,\nSPR_FSKU,\nSPR_SMBT,\nSPR_SMGT,\nSPR_SMRT,\nSPR_HANC,\nSPR_BLCH,\nSPR_HANL,\nSPR_DED1,\nSPR_DED2,\nSPR_DED3,\nSPR_DED4,\nSPR_DED5,\nSPR_DED6,\nSPR_TLMP,\nSPR_TLP2,\nSPR_COL5,\nSPR_CEYE,\nSPR_TBLU,\nSPR_TGRN,\nSPR_TRED,\nSPR_GOR1,\nSPR_POL3,\nSPR_POL6,\nSPR_TRE2,\nSPR_HDB1,\nSPR_HDB2,\nSPR_HDB3,\nSPR_HDB4,\nSPR_HDB5,\nSPR_HDB6,\nSPR_POB1,\nSPR_POB2,\nSPR_BRS1,\nNUMSPRITES\n} spritenum_t;\n\ntypedef enum\r\n{\r\n\tS_NULL,\t\t\t//0\r\n\tS_LIGHTDONE,\t//1\r\n\tS_PUNCH,\t\t//2\r\n\tS_PUNCHDOWN,\t//3\r\n\tS_PUNCHUP,\t\t//4\r\n\tS_PUNCH1,\t\t//5\r\n\tS_PUNCH2,\t\t//6\r\n\tS_PUNCH3,\t\t//7\r\n\tS_PUNCH4,\t\t//8\r\n\tS_PUNCH5,\t\t//9\r\n\tS_PISTOL,\t\t//10\r\n\tS_PISTOLDOWN,\t//11\r\n\tS_PISTOLUP,\t\t//12\r\n\tS_PISTOL1,\t\t//13\r\n\tS_PISTOL2,\t\t//14\r\n\tS_PISTOL3,\t\t//15\r\n\tS_PISTOL4,\t\t//16\r\n\tS_PISTOLFLASH,\t//17\r\n\tS_SGUN,\t\t\t//18\r\n\tS_SGUNDOWN,\t\t//19\r\n\tS_SGUNUP,\t\t//20\r\n\tS_SGUN1,\t\t//21\r\n\tS_SGUN2,\t\t//22\r\n\tS_SGUN3,\t\t//23\r\n\tS_SGUN4,\t\t//24\r\n\tS_SGUN5,\t\t//25\r\n\tS_SGUN6,\t\t//26\r\n\tS_SGUN7,\t\t//27\r\n\tS_SGUN8,\t\t//28\r\n\tS_SGUN9,\t\t//29\r\n\tS_SGUNFLASH1,\t//30\r\n\tS_SGUNFLASH2,\t//31\r\n\tS_DSGUN,\t\t//32\r\n\tS_DSGUNDOWN,\t//33\r\n\tS_DSGUNUP,\t\t//34\r\n\tS_DSGUN1,\t\t//35\r\n\tS_DSGUN2,\t\t//36\r\n\tS_DSGUN3,\t\t//37\r\n\tS_DSGUN4,\t\t//38\r\n\tS_DSGUN5,\t\t//39\r\n\tS_DSGUN6,\t\t//40\r\n\tS_DSGUN7,\t\t//41\r\n\tS_DSGUN8,\t\t//42\r\n\tS_DSGUN9,\t\t//43\r\n\tS_DSGUN10,\t\t//44\r\n\tS_DSNR1,\t\t//45\r\n\tS_DSNR2,\t\t//46\r\n\tS_DSGUNFLASH1,\t//47\r\n\tS_DSGUNFLASH2,\t//48\r\n\tS_CHAIN,\t\t//49\r\n\tS_CHAINDOWN,\t//50\r\n\tS_CHAINUP,\t\t//51\r\n\tS_CHAIN1,\t\t//52\r\n\tS_CHAIN2,\t\t//53\r\n\tS_CHAIN3,\t\t//54\r\n\tS_CHAINFLASH1,\t//55\r\n\tS_CHAINFLASH2,\t//56\r\n\tS_MISSILE,\t\t//57\r\n\tS_MISSILEDOWN,\t//58\r\n\tS_MISSILEUP,\t//59\r\n\tS_MISSILE1,\t\t//60\r\n\tS_MISSILE2,\t\t//61\r\n\tS_MISSILE3,\t\t//62\r\n\tS_MISSILEFLASH1,//63\r\n\tS_MISSILEFLASH2,//64\r\n\tS_MISSILEFLASH3,//65\r\n\tS_MISSILEFLASH4,//66\r\n\tS_SAW,\t\t\t//67\r\n\tS_SAWB,\t\t\t//68\r\n\tS_SAWDOWN,\t\t//69\r\n\tS_SAWUP,\t\t//70\r\n\tS_SAW1,\t\t\t//71\r\n\tS_SAW2,\t\t\t//72\r\n\tS_SAW3,\t\t\t//73\r\n\tS_PLASMA,\t\t//74\r\n\tS_PLASMADOWN,\t//75\r\n\tS_PLASMAUP,\t\t//76\r\n\tS_PLASMA1,\t\t//77\r\n\tS_PLASMA2,\t\t//78\r\n\tS_PLASMAFLASH1,\t//79\r\n\tS_PLASMAFLASH2,\t//80\r\n\tS_BFG,\t\t\t//81\r\n\tS_BFGDOWN,\t\t//82\r\n\tS_BFGUP,\t\t//83\r\n\tS_BFG1,\t\t\t//84\r\n\tS_BFG2,\t\t\t//85\r\n\tS_BFG3,\t\t\t//86\r\n\tS_BFG4,\t\t\t//87\r\n\tS_BFGFLASH1,\t//88\r\n\tS_BFGFLASH2,\t//89\r\n\tS_BLOOD1,\t\t//90\r\n\tS_BLOOD2,\t\t//91\r\n\tS_BLOOD3,\t\t//92\r\n\tS_PUFF1,\t\t//93\r\n\tS_PUFF2,\t\t//94\r\n\tS_PUFF3,\t\t//95\r\n\tS_PUFF4,\t\t//96\r\n\tS_TBALL1,\t\t//97\r\n\tS_TBALL2,\t\t//98\r\n\tS_TBALLX1,\t\t//99\r\n\tS_TBALLX2,\t\t//100\r\n\tS_TBALLX3,\t\t//101\r\n\tS_RBALL1,\t\t//102\r\n\tS_RBALL2,\t\t//103\r\n\tS_RBALLX1,\t\t//104\r\n\tS_RBALLX2,\t\t//105\r\n\tS_RBALLX3,\t\t//106\r\n\tS_BRBALL1,\t\t//107\r\n\tS_BRBALL2,\t\t//108\r\n\tS_BRBALLX1,\t\t//109\r\n\tS_BRBALLX2,\t\t//110\r\n\tS_BRBALLX3,\t\t//111\r\n\tS_PLASBALL,\t\t//112\r\n\tS_PLASBALL2,\t//113\r\n\tS_PLASEXP,\t\t//114\r\n\tS_PLASEXP2,\t\t//115\r\n\tS_PLASEXP3,\t\t//116\r\n\tS_PLASEXP4,\t\t//117\r\n\tS_PLASEXP5,\t\t//118\r\n\tS_ROCKET,\t\t//119\r\n\tS_BFGSHOT,\t\t//120\r\n\tS_BFGSHOT2,\t\t//121\r\n\tS_BFGLAND,\t\t//122\r\n\tS_BFGLAND2,\t\t//123\r\n\tS_BFGLAND3,\t\t//124\r\n\tS_BFGLAND4,\t\t//125\r\n\tS_BFGLAND5,\t\t//126\r\n\tS_BFGLAND6,\t\t//127\r\n\tS_BFGEXP,\t\t//128\r\n\tS_BFGEXP2,\t\t//129\r\n\tS_BFGEXP3,\t\t//130\r\n\tS_BFGEXP4,\t\t//131\r\n\tS_EXPLODE1,\t\t//132\r\n\tS_EXPLODE2,\t\t//133\r\n\tS_EXPLODE3,\t\t//134\r\n\tS_TFOG,\t\t\t//135\r\n\tS_TFOG01,\t\t//136\r\n\tS_TFOG02,\t\t//137\r\n\tS_TFOG2,\t\t//138\r\n\tS_TFOG3,\t\t//139\r\n\tS_TFOG4,\t\t//140\r\n\tS_TFOG5,\t\t//141\r\n\tS_TFOG6,\t\t//142\r\n\tS_TFOG7,\t\t//143\r\n\tS_TFOG8,\t\t//144\r\n\tS_TFOG9,\t\t//145\r\n\tS_TFOG10,\t\t//146\r\n\tS_IFOG,\t\t\t//147\r\n\tS_IFOG01,\t\t//148\r\n\tS_IFOG02,\t\t//149\r\n\tS_IFOG2,\t\t//150\r\n\tS_IFOG3,\t\t//151\r\n\tS_IFOG4,\t\t//152\r\n\tS_IFOG5,\t\t//153\r\n\tS_PLAY,\t\t\t//154\r\n\tS_PLAY_RUN1,\t//155\r\n\tS_PLAY_RUN2,\t//156\r\n\tS_PLAY_RUN3,\t//157\r\n\tS_PLAY_RUN4,\t//158\r\n\tS_PLAY_ATK1,\t//159\r\n\tS_PLAY_ATK2,\t//160\r\n\tS_PLAY_PAIN,\t//161\r\n\tS_PLAY_PAIN2,\t//162\r\n\tS_PLAY_DIE1,\t//163\r\n\tS_PLAY_DIE2,\t//164\r\n\tS_PLAY_DIE3,\t//165\r\n\tS_PLAY_DIE4,\t//166\r\n\tS_PLAY_DIE5,\t//167\r\n\tS_PLAY_DIE6,\t//168\r\n\tS_PLAY_DIE7,\t//169\r\n\tS_PLAY_XDIE1,\t//170\r\n\tS_PLAY_XDIE2,\t//171\r\n\tS_PLAY_XDIE3,\t//172\r\n\tS_PLAY_XDIE4,\t//173\r\n\tS_PLAY_XDIE5,\t//174\r\n\tS_PLAY_XDIE6,\t//175\r\n\tS_PLAY_XDIE7,\t//176\r\n\tS_PLAY_XDIE8,\t//177\r\n\tS_PLAY_XDIE9,\t//178\r\n\tS_POSS_STND,\t//179\r\n\tS_POSS_STND2,\t//180\r\n\tS_POSS_RUN1,\t//181\r\n\tS_POSS_RUN2,\t//182\r\n\tS_POSS_RUN3,\t//183\r\n\tS_POSS_RUN4,\t//184\r\n\tS_POSS_RUN5,\t//185\r\n\tS_POSS_RUN6,\t//186\r\n\tS_POSS_RUN7,\t//187\r\n\tS_POSS_RUN8,\t//188\r\n\tS_POSS_ATK1,\t//189\r\n\tS_POSS_ATK2,\t//190\r\n\tS_POSS_ATK3,\t//191\r\n\tS_POSS_PAIN,\t//192\r\n\tS_POSS_PAIN2,\t//193\r\n\tS_POSS_DIE1,\t//194\r\n\tS_POSS_DIE2,\t//195\r\n\tS_POSS_DIE3,\t//196\r\n\tS_POSS_DIE4,\t//197\r\n\tS_POSS_DIE5,\t//198\r\n\tS_POSS_XDIE1,\t//199\r\n\tS_POSS_XDIE2,\t//200\r\n\tS_POSS_XDIE3,\t//201\r\n\tS_POSS_XDIE4,\t//202\r\n\tS_POSS_XDIE5,\t//203\r\n\tS_POSS_XDIE6,\t//204\r\n\tS_POSS_XDIE7,\t//205\r\n\tS_POSS_XDIE8,\t//206\r\n\tS_POSS_XDIE9,\t//207\r\n\tS_SPOS_STND,\t//208\r\n\tS_SPOS_STND2,\t//209\r\n\tS_SPOS_RUN1,\t//210\r\n\tS_SPOS_RUN2,\t//211\r\n\tS_SPOS_RUN3,\t//212\r\n\tS_SPOS_RUN4,\t//213\r\n\tS_SPOS_RUN5,\t//214\r\n\tS_SPOS_RUN6,\t//215\r\n\tS_SPOS_RUN7,\t//216\r\n\tS_SPOS_RUN8,\t//217\r\n\tS_SPOS_ATK1,\t//218\r\n\tS_SPOS_ATK2,\t//219\r\n\tS_SPOS_ATK3,\t//220\r\n\tS_SPOS_PAIN,\t//221\r\n\tS_SPOS_PAIN2,\t//222\r\n\tS_SPOS_DIE1,\t//223\r\n\tS_SPOS_DIE2,\t//224\r\n\tS_SPOS_DIE3,\t//225\r\n\tS_SPOS_DIE4,\t//226\r\n\tS_SPOS_DIE5,\t//227\r\n\tS_SPOS_XDIE1,\t//228\r\n\tS_SPOS_XDIE2,\t//229\r\n\tS_SPOS_XDIE3,\t//230\r\n\tS_SPOS_XDIE4,\t//231\r\n\tS_SPOS_XDIE5,\t//232\r\n\tS_SPOS_XDIE6,\t//233\r\n\tS_SPOS_XDIE7,\t//234\r\n\tS_SPOS_XDIE8,\t//225\r\n\tS_SPOS_XDIE9,\t//236\r\n\tS_SMOKE1,\t\t//237\r\n\tS_SMOKE2,\t\t//238\r\n\tS_SMOKE3,\t\t//239\r\n\tS_SMOKE4,\t\t//240\r\n\tS_SMOKE5,\t\t//241\r\n\tS_TRACER,\t\t//242\r\n\tS_TRACER2,\t\t//243\r\n\tS_TRACEEXP1,\t//244\r\n\tS_TRACEEXP2,\t//245\r\n\tS_TRACEEXP3,\t//246\r\n\tS_SKEL_STND,\t//247\r\n\tS_SKEL_STND2,\t//248\r\n\tS_SKEL_RUN1,\t//249\r\n\tS_SKEL_RUN2,\t//250\r\n\tS_SKEL_RUN3,\t//251\r\n\tS_SKEL_RUN4,\t//252\r\n\tS_SKEL_RUN5,\t//253\r\n\tS_SKEL_RUN6,\t//254\r\n\tS_SKEL_RUN7,\t//255\r\n\tS_SKEL_RUN8,\t//256\r\n\tS_SKEL_RUN9,\t//257\r\n\tS_SKEL_RUN10,\t//258\r\n\tS_SKEL_RUN11,\t//259\r\n\tS_SKEL_RUN12,\t//260\r\n\tS_SKEL_FIST1,\t//261\r\n\tS_SKEL_FIST2,\t//262\r\n\tS_SKEL_FIST3,\t//263\r\n\tS_SKEL_FIST4,\t//264\r\n\tS_SKEL_MISS1,\t//265\r\n\tS_SKEL_MISS2,\t//266\r\n\tS_SKEL_MISS3,\t//267\r\n\tS_SKEL_MISS4,\t//268\r\n\tS_SKEL_PAIN,\t//269\r\n\tS_SKEL_PAIN2,\t//270\r\n\tS_SKEL_DIE1,\t//271\r\n\tS_SKEL_DIE2,\t//272\r\n\tS_SKEL_DIE3,\t//273\r\n\tS_SKEL_DIE4,\t//274\r\n\tS_SKEL_DIE5,\t//275\r\n\tS_SKEL_DIE6,\t//276\r\n\tS_FATSHOT1,\t\t//277\r\n\tS_FATSHOT2,\t\t//278\r\n\tS_FATSHOTX1,\t//279\r\n\tS_FATSHOTX2,\t//280\r\n\tS_FATSHOTX3,\t//281\r\n\tS_FATT_STND,\t//282\r\n\tS_FATT_STND2,\t//283\r\n\tS_FATT_RUN1,\t//284\r\n\tS_FATT_RUN2,\t//285\r\n\tS_FATT_RUN3,\t//286\r\n\tS_FATT_RUN4,\t//287\r\n\tS_FATT_RUN5,\t//288\r\n\tS_FATT_RUN6,\t//289\r\n\tS_FATT_RUN7,\t//290\r\n\tS_FATT_RUN8,\t//291\r\n\tS_FATT_RUN9,\t//292\r\n\tS_FATT_RUN10,\t//293\r\n\tS_FATT_RUN11,\t//294\r\n\tS_FATT_RUN12,\t//295\r\n\tS_FATT_ATK1,\t//296\r\n\tS_FATT_ATK2,\t//297\r\n\tS_FATT_ATK3,\t//298\r\n\tS_FATT_ATK4,\t//299\r\n\tS_FATT_ATK5,\t//300\r\n\tS_FATT_ATK6,\t//301\r\n\tS_FATT_ATK7,\t//302\r\n\tS_FATT_ATK8,\t//303\r\n\tS_FATT_ATK9,\t//304\r\n\tS_FATT_ATK10,\t//305\r\n\tS_FATT_PAIN,\t//306\r\n\tS_FATT_PAIN2,\t//307\r\n\tS_FATT_DIE1,\t//308\r\n\tS_FATT_DIE2,\t//309\r\n\tS_FATT_DIE3,\t//310\r\n\tS_FATT_DIE4,\t//311\r\n\tS_FATT_DIE5,\t//312\r\n\tS_FATT_DIE6,\t//313\r\n\tS_FATT_DIE7,\t//314\r\n\tS_FATT_DIE8,\t//315\r\n\tS_FATT_DIE9,\t//316\r\n\tS_FATT_DIE10,\t//317\r\n\tS_CPOS_STND,\t//318\r\n\tS_CPOS_STND2,\t//319\r\n\tS_CPOS_RUN1,\t//320\r\n\tS_CPOS_RUN2,\t//321\r\n\tS_CPOS_RUN3,\t//322\r\n\tS_CPOS_RUN4,\t//323\r\n\tS_CPOS_RUN5,\t//324\r\n\tS_CPOS_RUN6,\t//325\r\n\tS_CPOS_RUN7,\t//326\r\n\tS_CPOS_RUN8,\t//327\r\n\tS_CPOS_ATK1,\t//328\r\n\tS_CPOS_ATK2,\t//329\r\n\tS_CPOS_ATK3,\t//330\r\n\tS_CPOS_ATK4,\t//331\r\n\tS_CPOS_PAIN,\t//332\r\n\tS_CPOS_PAIN2,\t//333\r\n\tS_CPOS_DIE1,\t//334\r\n\tS_CPOS_DIE2,\t//335\r\n\tS_CPOS_DIE3,\t//336\r\n\tS_CPOS_DIE4,\t//337\r\n\tS_CPOS_DIE5,\t//338\r\n\tS_CPOS_DIE6,\t//339\r\n\tS_CPOS_DIE7,\t//340\r\n\tS_CPOS_XDIE1,\t//341\r\n\tS_CPOS_XDIE2,\t//342\r\n\tS_CPOS_XDIE3,\t//343\r\n\tS_CPOS_XDIE4,\t//344\r\n\tS_CPOS_XDIE5,\t//345\r\n\tS_CPOS_XDIE6,\t//346\r\n\tS_TROO_STND,\t//347\r\n\tS_TROO_STND2,\t//348\r\n\tS_TROO_RUN1,\t//349\r\n\tS_TROO_RUN2,\t//350\r\n\tS_TROO_RUN3,\t//351\r\n\tS_TROO_RUN4,\t//352\r\n\tS_TROO_RUN5,\t//353\r\n\tS_TROO_RUN6,\t//354\r\n\tS_TROO_RUN7,\t//355\r\n\tS_TROO_RUN8,\t//356\r\n\tS_TROO_ATK1,\t//357\r\n\tS_TROO_ATK2,\t//358\r\n\tS_TROO_ATK3,\t//359\r\n\tS_TROO_PAIN,\t//360\r\n\tS_TROO_PAIN2,\t//361\r\n\tS_TROO_DIE1,\t//362\r\n\tS_TROO_DIE2,\t//363\r\n\tS_TROO_DIE3,\t//364\r\n\tS_TROO_DIE4,\t//365\r\n\tS_TROO_DIE5,\t//366\r\n\tS_TROO_XDIE1,\t//367\r\n\tS_TROO_XDIE2,\t//368\r\n\tS_TROO_XDIE3,\t//369\r\n\tS_TROO_XDIE4,\t//370\r\n\tS_TROO_XDIE5,\t//371\r\n\tS_TROO_XDIE6,\t//372\r\n\tS_TROO_XDIE7,\t//373\r\n\tS_TROO_XDIE8,\t//374\r\n\tS_SARG_STND,\t//375\r\n\tS_SARG_STND2,\t//376\r\n\tS_SARG_RUN1,\t//377\r\n\tS_SARG_RUN2,\t//378\r\n\tS_SARG_RUN3,\t//379\r\n\tS_SARG_RUN4,\t//380\r\n\tS_SARG_RUN5,\t//381\r\n\tS_SARG_RUN6,\t//382\r\n\tS_SARG_RUN7,\t//383\r\n\tS_SARG_RUN8,\t//384\r\n\tS_SARG_ATK1,\t//385\r\n\tS_SARG_ATK2,\t//386\r\n\tS_SARG_ATK3,\t//387\r\n\tS_SARG_PAIN,\t//388\r\n\tS_SARG_PAIN2,\t//389\r\n\tS_SARG_DIE1,\t//390\r\n\tS_SARG_DIE2,\t//391\r\n\tS_SARG_DIE3,\t//392\r\n\tS_SARG_DIE4,\t//393\r\n\tS_SARG_DIE5,\t//394\r\n\tS_SARG_DIE6,\t//395\r\n\tS_HEAD_STND,\t//396\r\n\tS_HEAD_RUN1,\t//397\r\n\tS_HEAD_ATK1,\t//398\r\n\tS_HEAD_ATK2,\t//399\r\n\tS_HEAD_ATK3,\t//400\r\n\tS_HEAD_PAIN,\t//401\r\n\tS_HEAD_PAIN2,\t//402\r\n\tS_HEAD_PAIN3,\t//403\r\n\tS_HEAD_DIE1,\t//404\r\n\tS_HEAD_DIE2,\t//405\r\n\tS_HEAD_DIE3,\t//406\r\n\tS_HEAD_DIE4,\t//407\r\n\tS_HEAD_DIE5,\t//408\r\n\tS_HEAD_DIE6,\t//409\r\n\tS_BOSS_STND,\t//410\r\n\tS_BOSS_STND2,\t//411\r\n\tS_BOSS_RUN1,\t//412\r\n\tS_BOSS_RUN2,\t//413\r\n\tS_BOSS_RUN3,\t//414\r\n\tS_BOSS_RUN4,\t//415\r\n\tS_BOSS_RUN5,\t//416\r\n\tS_BOSS_RUN6,\t//417\r\n\tS_BOSS_RUN7,\t//418\r\n\tS_BOSS_RUN8,\t//419\r\n\tS_BOSS_ATK1,\t//420\r\n\tS_BOSS_ATK2,\t//421\r\n\tS_BOSS_ATK3,\t//422\r\n\tS_BOSS_PAIN,\t//423\r\n\tS_BOSS_PAIN2,\t//424\r\n\tS_BOSS_DIE1,\t//425\r\n\tS_BOSS_DIE2,\t//426\r\n\tS_BOSS_DIE3,\t//427\r\n\tS_BOSS_DIE4,\t//428\r\n\tS_BOSS_DIE5,\t//429\r\n\tS_BOSS_DIE6,\t//430\r\n\tS_BOSS_DIE7,\t//431\r\n\tS_BOS2_STND,\t//432\r\n\tS_BOS2_STND2,\t//433\r\n\tS_BOS2_RUN1,\t//434\r\n\tS_BOS2_RUN2,\t//435\r\n\tS_BOS2_RUN3,\t//436\r\n\tS_BOS2_RUN4,\t//437\r\n\tS_BOS2_RUN5,\t//438\r\n\tS_BOS2_RUN6,\t//439\r\n\tS_BOS2_RUN7,\t//440\r\n\tS_BOS2_RUN8,\t//441\r\n\tS_BOS2_ATK1,\t//442\r\n\tS_BOS2_ATK2,\t//443\r\n\tS_BOS2_ATK3,\t//444\r\n\tS_BOS2_PAIN,\t//445\r\n\tS_BOS2_PAIN2,\t//446\r\n\tS_BOS2_DIE1,\t//447\r\n\tS_BOS2_DIE2,\t//448\r\n\tS_BOS2_DIE3,\t//449\r\n\tS_BOS2_DIE4,\t//450\r\n\tS_BOS2_DIE5,\t//451\r\n\tS_BOS2_DIE6,\t//452\r\n\tS_BOS2_DIE7,\t//453\r\n\tS_SKULL_STND,\t//454\r\n\tS_SKULL_STND2,\t//455\r\n\tS_SKULL_RUN1,\t//456\r\n\tS_SKULL_RUN2,\t//457\r\n\tS_SKULL_ATK1,\t//458\r\n\tS_SKULL_ATK2,\t//459\r\n\tS_SKULL_ATK3,\t//460\r\n\tS_SKULL_ATK4,\t//461\r\n\tS_SKULL_PAIN,\t//462\r\n\tS_SKULL_PAIN2,\t//463\r\n\tS_SKULL_DIE1,\t//464\r\n\tS_SKULL_DIE2,\t//465\r\n\tS_SKULL_DIE3,\t//466\r\n\tS_SKULL_DIE4,\t//467\r\n\tS_SKULL_DIE5,\t//468\r\n\tS_SKULL_DIE6,\t//469\r\n\tS_SPID_STND,\t//470\r\n\tS_SPID_STND2,\t//471\r\n\tS_SPID_RUN1,\t//472\r\n\tS_SPID_RUN2,\t//473\r\n\tS_SPID_RUN3,\t//474\r\n\tS_SPID_RUN4,\t//475\r\n\tS_SPID_RUN5,\t//476\r\n\tS_SPID_RUN6,\t//477\r\n\tS_SPID_RUN7,\t//478\r\n\tS_SPID_RUN8,\t//479\r\n\tS_SPID_RUN9,\t//480\r\n\tS_SPID_RUN10,\t//481\r\n\tS_SPID_RUN11,\t//482\r\n\tS_SPID_RUN12,\t//483\r\n\tS_SPID_ATK1,\t//484\r\n\tS_SPID_ATK2,\t//485\r\n\tS_SPID_ATK3,\t//486\r\n\tS_SPID_ATK4,\t//487\r\n\tS_SPID_PAIN,\t//488\r\n\tS_SPID_PAIN2,\t//489\r\n\tS_SPID_DIE1,\t//490\r\n\tS_SPID_DIE2,\t//491\r\n\tS_SPID_DIE3,\t//492\r\n\tS_SPID_DIE4,\t//493\r\n\tS_SPID_DIE5,\t//494\r\n\tS_SPID_DIE6,\t//495\r\n\tS_SPID_DIE7,\t//496\r\n\tS_SPID_DIE8,\t//497\r\n\tS_SPID_DIE9,\t//498\r\n\tS_SPID_DIE10,\t//499\r\n\tS_SPID_DIE11,\t//500\r\n\tS_BSPI_STND,\t//501\r\n\tS_BSPI_STND2,\t//502\r\n\tS_BSPI_SIGHT,\t//503\r\n\tS_BSPI_RUN1,\t//504\r\n\tS_BSPI_RUN2,\t//505\r\n\tS_BSPI_RUN3,\t//506\r\n\tS_BSPI_RUN4,\t//507\r\n\tS_BSPI_RUN5,\t//508\r\n\tS_BSPI_RUN6,\t//509\r\n\tS_BSPI_RUN7,\t//510\r\n\tS_BSPI_RUN8,\t//511\r\n\tS_BSPI_RUN9,\t//512\r\n\tS_BSPI_RUN10,\t//513\r\n\tS_BSPI_RUN11,\t//514\r\n\tS_BSPI_RUN12,\t//515\r\n\tS_BSPI_ATK1,\t//516\r\n\tS_BSPI_ATK2,\t//517\r\n\tS_BSPI_ATK3,\t//518\r\n\tS_BSPI_ATK4,\t//519\r\n\tS_BSPI_PAIN,\t//520\r\n\tS_BSPI_PAIN2,\t//521\r\n\tS_BSPI_DIE1,\t//522\r\n\tS_BSPI_DIE2,\t//523\r\n\tS_BSPI_DIE3,\t//524\r\n\tS_BSPI_DIE4,\t//525\r\n\tS_BSPI_DIE5,\t//526\r\n\tS_BSPI_DIE6,\t//527\r\n\tS_BSPI_DIE7,\t//528\r\n\tS_ARACH_PLAZ,\t//529\r\n\tS_ARACH_PLAZ2,\t//530\r\n\tS_ARACH_PLEX,\t//531\r\n\tS_ARACH_PLEX2,\t//532\r\n\tS_ARACH_PLEX3,\t//533\r\n\tS_ARACH_PLEX4,\t//534\r\n\tS_ARACH_PLEX5,\t//535\r\n\tS_CYBER_STND,\t//536\r\n\tS_CYBER_STND2,\t//537\r\n\tS_CYBER_RUN1,\t//538\r\n\tS_CYBER_RUN2,\t//539\r\n\tS_CYBER_RUN3,\t//540\r\n\tS_CYBER_RUN4,\t//541\r\n\tS_CYBER_RUN5,\t//542\r\n\tS_CYBER_RUN6,\t//543\r\n\tS_CYBER_RUN7,\t//544\r\n\tS_CYBER_RUN8,\t//545\r\n\tS_CYBER_ATK1,\t//546\r\n\tS_CYBER_ATK2,\t//547\r\n\tS_CYBER_ATK3,\t//548\r\n\tS_CYBER_ATK4,\t//549\r\n\tS_CYBER_ATK5,\t//550\r\n\tS_CYBER_ATK6,\t//551\r\n\tS_CYBER_PAIN,\t//552\r\n\tS_CYBER_DIE1,\t//553\r\n\tS_CYBER_DIE2,\t//554\r\n\tS_CYBER_DIE3,\t//555\r\n\tS_CYBER_DIE4,\t//556\r\n\tS_CYBER_DIE5,\t//557\r\n\tS_CYBER_DIE6,\t//558\r\n\tS_CYBER_DIE7,\t//559\r\n\tS_CYBER_DIE8,\t//560\r\n\tS_CYBER_DIE9,\t//561\r\n\tS_CYBER_DIE10,\t//562\r\n\tS_PAIN_STND,\t//563\r\n\tS_PAIN_RUN1,\t//564\r\n\tS_PAIN_RUN2,\t//565\r\n\tS_PAIN_RUN3,\t//566\r\n\tS_PAIN_RUN4,\t//567\r\n\tS_PAIN_RUN5,\t//568\r\n\tS_PAIN_RUN6,\t//569\r\n\tS_PAIN_ATK1,\t//570\r\n\tS_PAIN_ATK2,\t//571\r\n\tS_PAIN_ATK3,\t//572\r\n\tS_PAIN_ATK4,\t//573\r\n\tS_PAIN_PAIN,\t//574\r\n\tS_PAIN_PAIN2,\t//575\r\n\tS_PAIN_DIE1,\t//576\r\n\tS_PAIN_DIE2,\t//577\r\n\tS_PAIN_DIE3,\t//578\r\n\tS_PAIN_DIE4,\t//579\r\n\tS_PAIN_DIE5,\t//580\r\n\tS_PAIN_DIE6,\t//581\r\n\tS_ARM1,\t\t\t//582\r\n\tS_ARM1A,\t\t//583\r\n\tS_ARM2,\t\t\t//584\r\n\tS_ARM2A,\t\t//585\r\n\tS_BAR1,\t\t\t//586\r\n\tS_BAR2,\t\t\t//587\r\n\tS_BEXP,\t\t\t//588\r\n\tS_BEXP2,\t\t//589\r\n\tS_BEXP3,\t\t//590\r\n\tS_BEXP4,\t\t//591\r\n\tS_BEXP5,\t\t//592\r\n\tS_BBAR1,\t\t//593\r\n\tS_BBAR2,\t\t//594\r\n\tS_BBAR3,\t\t//595\r\n\tS_BON1,\t\t\t//596\r\n\tS_BON1A,\t\t//597\r\n\tS_BON1B,\t\t//598\r\n\tS_BON1C,\t\t//599\r\n\tS_BON1D,\t\t//600\r\n\tS_BON1E,\t\t//601\r\n\tS_BON2,\t\t\t//602\r\n\tS_BON2A,\t\t//603\r\n\tS_BON2B,\t\t//604\r\n\tS_BON2C,\t\t//605\r\n\tS_BON2D,\t\t//606\r\n\tS_BON2E,\t\t//607\r\n\tS_BKEY,\t\t\t//608\r\n\tS_BKEY2,\t\t//609\r\n\tS_RKEY,\t\t\t//610\r\n\tS_RKEY2,\t\t//611\r\n\tS_YKEY,\t\t\t//612\r\n\tS_YKEY2,\t\t//613\r\n\tS_BSKULL,\t\t//614\r\n\tS_BSKULL2,\t\t//615\r\n\tS_RSKULL,\t\t//616\r\n\tS_RSKULL2,\t\t//617\r\n\tS_YSKULL,\t\t//618\r\n\tS_YSKULL2,\t\t//619\r\n\tS_STIM,\t\t\t//620\r\n\tS_MEDI,\t\t\t//621\r\n\tS_SOUL,\t\t\t//622\r\n\tS_SOUL2,\t\t//623\r\n\tS_SOUL3,\t\t//624\r\n\tS_SOUL4,\t\t//625\r\n\tS_SOUL5,\t\t//626\r\n\tS_SOUL6,\t\t//627\r\n\tS_PINV,\t\t\t//628\r\n\tS_PINV2,\t\t//629\r\n\tS_PINV3,\t\t//630\r\n\tS_PINV4,\t\t//631\r\n\tS_PSTR,\t\t\t//632\r\n\tS_PINS,\t\t\t//633\r\n\tS_PINS2,\t\t//634\r\n\tS_PINS3,\t\t//635\r\n\tS_PINS4,\t\t//636\r\n\tS_MEGA,\t\t\t//637\r\n\tS_MEGA2,\t\t//638\r\n\tS_MEGA3,\t\t//639\r\n\tS_MEGA4,\t\t//640\r\n\tS_SUIT,\t\t\t//641\r\n\tS_PMAP,\t\t\t//642\r\n\tS_PMAP2,\t\t//643\r\n\tS_PMAP3,\t\t//644\r\n\tS_PMAP4,\t\t//645\r\n\tS_PMAP5,\t\t//646\r\n\tS_PMAP6,\t\t//647\r\n\tS_PVIS,\t\t\t//648\r\n\tS_PVIS2,\t\t//649\r\n\tS_CLIP,\t\t\t//650\r\n\tS_AMMO,\t\t\t//651\r\n\tS_ROCK,\t\t\t//652\r\n\tS_BROK,\t\t\t//653\r\n\tS_CELL,\t\t\t//654\r\n\tS_CELP,\t\t\t//655\r\n\tS_SHEL,\t\t\t//656\r\n\tS_SBOX,\t\t\t//657\r\n\tS_BPAK,\t\t\t//658\r\n\tS_BFUG,\t\t\t//659\r\n\tS_MGUN,\t\t\t//660\r\n\tS_CSAW,\t\t\t//661\r\n\tS_LAUN,\t\t\t//662\r\n\tS_PLAS,\t\t\t//663\r\n\tS_SHOT,\t\t\t//664\r\n\tS_SHOT2,\t\t//665\r\n\tS_COLU,\t\t\t//666\r\n\tS_STALAG,\t\t//667\r\n\tS_DEADTORSO,\t//668\r\n\tS_DEADBOTTOM,\t//669\r\n\tS_HEADSONSTICK,\t//670\r\n\tS_GIBS,\t\t\t//671\r\n\tS_HEADONASTICK,\t//672\r\n\tS_DEADSTICK,\t//673\r\n\tS_MEAT2,\t\t//674\r\n\tS_MEAT3,\t\t//675\r\n\tS_MEAT4,\t\t//676\r\n\tS_MEAT5,\t\t//677\r\n\tS_STALAGTITE,\t//678\r\n\tS_TALLGRNCOL,\t//679\r\n\tS_SHRTGRNCOL,\t//680\r\n\tS_TALLREDCOL,\t//681\r\n\tS_SHRTREDCOL,\t//682\r\n\tS_SKULLCOL,\t\t//683\r\n\tS_CANDLESTIK,\t//684\r\n\tS_CANDELABRA,\t//685\r\n\tS_TORCHTREE,\t//686\r\n\tS_TECHPILLAR,\t//687\r\n\tS_FLOATSKULL,\t//688\r\n\tS_FLOATSKULL2,\t//689\r\n\tS_FLOATSKULL3,\t//690\r\n\tS_BTORCHSHRT,\t//691\r\n\tS_BTORCHSHRT2,\t//692\r\n\tS_BTORCHSHRT3,\t//693\r\n\tS_BTORCHSHRT4,\t//694\r\n\tS_GTORCHSHRT,\t//695\r\n\tS_GTORCHSHRT2,\t//696\r\n\tS_GTORCHSHRT3,\t//697\r\n\tS_GTORCHSHRT4,\t//698\r\n\tS_RTORCHSHRT,\t//699\r\n\tS_RTORCHSHRT2,\t//700\r\n\tS_RTORCHSHRT3,\t//701\r\n\tS_RTORCHSHRT4,\t//702\r\n\tS_HANGCHAIN,\t//703\r\n\tS_HANGCBLOOD,\t//704\r\n\tS_HANGLAMP,\t\t//705\r\n\tS_DEADPLAY,\t\t//706\r\n\tS_DEADPOSS,\t\t//707\r\n\tS_DEADSPOS,\t\t//708\r\n\tS_DEADTROO,\t\t//709\r\n\tS_DEADSARG,\t\t//710\r\n\tS_DEADHEAD,\t\t//711\r\n\tS_TECHLAMP,\t\t//712\r\n\tS_TECHLAMP2,\t//713\r\n\tS_TECHLAMP3,\t//714\r\n\tS_TECHLAMP4,\t//715\r\n\tS_TECH2LAMP,\t//716\r\n\tS_TECH2LAMP2,\t//717\r\n\tS_TECH2LAMP3,\t//718\r\n\tS_TECH2LAMP4,\t//719\r\n\tS_HEARTCOL,\t\t//720\r\n\tS_HEARTCOL2,\t//721\r\n\tS_EVILEYE,\t\t//722\r\n\tS_EVILEYE2,\t\t//723\r\n\tS_EVILEYE3,\t\t//724\r\n\tS_EVILEYE4,\t\t//725\r\n\tS_BLUETORCH,\t//726\r\n\tS_BLUETORCH2,\t//727\r\n\tS_BLUETORCH3,\t//728\r\n\tS_BLUETORCH4,\t//729\r\n\tS_GREENTORCH,\t//730\r\n\tS_GREENTORCH2,\t//731\r\n\tS_GREENTORCH3,\t//732\r\n\tS_GREENTORCH4,\t//733\r\n\tS_REDTORCH,\t\t//734\r\n\tS_REDTORCH2,\t//735\r\n\tS_REDTORCH3,\t//736\r\n\tS_REDTORCH4,\t//737\r\n\tS_BLOODYTWITCH,\t//738\r\n\tS_BLOODYTWITCH2,//739\r\n\tS_BLOODYTWITCH3,//740\r\n\tS_BLOODYTWITCH4,//741\r\n\tS_HEADCANDLES,\t//742\r\n\tS_HEADCANDLES2,\t//743\r\n\tS_LIVESTICK,\t//744\r\n\tS_LIVESTICK2,\t//745\r\n\tS_BIGTREE,\t\t//746\r\n\tS_HANGNOGUTS,\t//747\r\n\tS_HANGBNOBRAIN, //748\r\n\tS_HANGTLOOKDN,\t//749\r\n\tS_HANGTSKULL,\t//750\r\n\tS_HANGTLOOKUP,\t//751\r\n\tS_HANGTNOBRAIN, //752\r\n\tS_COLONGIBS,\t//753\r\n\tS_SMALLPOOL,\t//754\r\n\tS_BRAINSTEM,\t//755\r\n\tNUMSTATES\r\n} statenum_t;\n\ntypedef struct\n{\n\t spritenum_t\tsprite;\n\t long\t\t\tframe;\n\t long\t\t\ttics;\n\t void\t\t\t(*action) ();\n\t statenum_t\t\tnextstate;\n\t long\t\t\tmisc1, misc2;\n} state_t;\n\nextern state_t\tstates[NUMSTATES];\nextern char *sprnames[NUMSPRITES];\n\ntypedef enum\r\n{\r\n\tMT_PLAYER,\t\t//Player\r\n\tMT_POSSESSED,\t//ZombieMan\r\n\tMT_SHOTGUY,\t\t//ShotgunGuy\r\n\tMT_UNDEAD,\t\t//Revenant\r\n\tMT_TRACER,\t\t//Revenant Tracer\r\n\tMT_SMOKE,\t\t//Revenant Tracer Smoke\r\n\tMT_FATSO,\t\t//Mancubus\r\n\tMT_FATSHOT,\t\t//Mancubus Fireball\r\n\tMT_CHAINGUY,\t//ChaingunGuy\r\n\tMT_TROOP,\t\t//Imp\r\n\tMT_SERGEANT,\t//Pink Demon\r\n\tMT_HEAD,\t\t//Cacodemon\r\n\tMT_BRUISER,\t\t//Baron of Hell\r\n\tMT_KNIGHT,\t\t//Hell Knight\r\n\tMT_SKULL,\t\t//Lost Soul\r\n\tMT_SPIDER,\t\t//SpiderMastermind\r\n\tMT_BABY,\t\t//Arachnotron\r\n\tMT_CYBORG,\t\t//Cyberdemon\r\n\tMT_PAIN,\t\t//Pain Elemental\r\n\tMT_BARREL,\t\t//Barrel\r\n\tMT_TROOPSHOT,\t//Imp Fireball\r\n\tMT_HEADSHOT,\t//Cacodemon Plasma Ball\r\n\tMT_BRUISERSHOT,\t//Baron Slime Ball\r\n\tMT_ROCKET,\t\t//Rocket\r\n\tMT_PLASMA,\t\t//PlasmaBall\r\n\tMT_BFG,\t\t\t//BFGBall\r\n\tMT_ARACHPLAZ,\t//Arachnotron plasma\r\n\tMT_PUFF,\t\t//Bullet puff\r\n\tMT_BLOOD,\t\t//Blood\r\n\tMT_TFOG,\t\t//TeleportFog\r\n\tMT_IFOG,\t\t//ItemFog\r\n\tMT_TELEPORTMAN,\t//TeleportDest\r\n\tMT_EXTRABFG,\t//BFGExtra\r\n\tMT_MISC0,\t\t//Green armor\r\n\tMT_MISC1,\t\t//Blue armor\r\n\tMT_MISC2,\t\t//Health bonus\r\n\tMT_MISC3,\t\t//ArmorBonus\r\n\tMT_MISC4,\t\t//Blue key card\r\n\tMT_MISC5,\t\t//Red key card\r\n\tMT_MISC6,\t\t//Yellow key card\r\n\tMT_MISC7,\t\t//Yellow skull key\r\n\tMT_MISC8,\t\t//Red skull key\r\n\tMT_MISC9,\t\t//Blue skull key\r\n\tMT_MISC10,\t\t//Stimpack\r\n\tMT_MISC11,\t\t//Medikit\r\n\tMT_MISC12,\t\t//Soulsphere\r\n\tMT_INV,\t\t\t//Invulnerability Sphere\r\n\tMT_MISC13,\t\t//Berserk\r\n\tMT_INS,\t\t\t//Invisibility\r\n\tMT_MISC14,\t\t//Radiation suit\r\n\tMT_MISC15,\t\t//Allmap\r\n\tMT_MISC16,\t\t//Infrared\r\n\tMT_MEGA,\t\t//Mega sphere\r\n\tMT_CLIP,\t\t//Clip\r\n\tMT_MISC17,\t\t//Clip box\r\n\tMT_MISC18,\t\t//Rocket\r\n\tMT_MISC19,\t\t//Rocket box\r\n\tMT_MISC20,\t\t//Cell\r\n\tMT_MISC21,\t\t//Cell pack\r\n\tMT_MISC22,\t\t//Shells\r\n\tMT_MISC23,\t\t//Shell box\r\n\tMT_MISC24,\t\t//Backpack\r\n\tMT_MISC25,\t\t//BFG 9000\r\n\tMT_CHAINGUN,\t//Chaingun\r\n\tMT_MISC26,\t\t//Chainsaw\r\n\tMT_MISC27,\t\t//Rocket launcher\r\n\tMT_MISC28,\t\t//Plasma rifle\r\n\tMT_SHOTGUN,\t\t//Shotgun\r\n\tMT_SUPERSHOTGUN,//SuperShotgun\r\n\tMT_MISC29,\t\t//Tech lamp\r\n\tMT_MISC30,\t\t//Tech lamp 2\r\n\tMT_MISC31,\t\t//Column\r\n\tMT_MISC32,\t\t//Tall green column\r\n\tMT_MISC33,\t\t//Short green column\r\n\tMT_MISC34,\t\t//Tall red column\r\n\tMT_MISC35,\t\t//Short red column\r\n\tMT_MISC36,\t\t//Skull column\r\n\tMT_MISC37,\t\t//Heart column\r\n\tMT_MISC38,\t\t//Evil eye\r\n\tMT_MISC39,\t\t//Floating skull\r\n\tMT_MISC40,\t\t//Torch tree\r\n\tMT_MISC41,\t\t//Blue torch\r\n\tMT_MISC42,\t\t//Green torch\r\n\tMT_MISC43,\t\t//Red torch\r\n\tMT_MISC44,\t\t//Short blue torch\r\n\tMT_MISC45,\t\t//Short green torch\r\n\tMT_MISC46,\t\t//Short red torch\r\n\tMT_MISC47,\t\t//Stalagtite\r\n\tMT_MISC48,\t\t//Tech pillar\r\n\tMT_MISC49,\t\t//Candle stick\r\n\tMT_MISC50,\t\t//Candelabra\r\n\tMT_MISC51,\t\t//Bloody twitch\r\n\tMT_MISC52,\t\t//Meat 2\r\n\tMT_MISC53,\t\t//Meat 3\r\n\tMT_MISC54,\t\t//Meat 4\r\n\tMT_MISC55,\t\t//NonsolidMeat2\r\n\tMT_MISC56,\t\t//NonsolidMeat4\r\n\tMT_MISC57,\t\t//NonsolidMeat3\r\n\tMT_MISC58,\t\t//Meat 5\r\n\tMT_MISC59,\t\t//NonsolidMeat5\r\n\tMT_MISC60,\t\t//Gancho\r\n\tMT_MISC61,\t\t//Gancho con sangre\r\n\tMT_MISC62,\t\t//Lampara\r\n\tMT_MISC63,\t\t//Dead cacodemon\r\n\tMT_MISC64,\t\t//Dead zombie man\r\n\tMT_MISC65,\t\t//Dead demon\r\n\tMT_MISC66,\t\t//Dead imp\r\n\tMT_MISC67,\t\t//Dead shotgun guy\r\n\tMT_MISC68,\t\t//Dead marine\r\n\tMT_MISC69,\t\t//Dead marine 2\r\n\tMT_MISC70,\t\t//Heads\r\n\tMT_MISC71,\t\t//Head candles\r\n\tMT_MISC72,\t\t//Gibs\r\n\tMT_MISC73,\t\t//HeadOnAStick\r\n\tMT_MISC74,\t\t//Dead on a stick\r\n\tMT_MISC75,\t\t//Still alive on a stick\r\n\tMT_MISC76,\t\t//Big tree\r\n\tMT_MISC77,\t\t//Burning barrel\r\n\tMT_MISC78,\t\t//Hanging with no guts\r\n\tMT_MISC79,\t\t//Hanging from bottom with no brain\r\n\tMT_MISC80,\t\t//Hanging from top, looking down\r\n\tMT_MISC81,\t\t//Hanging from top, skully\r\n\tMT_MISC82,\t\t//Hanging from top, looking up\r\n\tMT_MISC83,\t\t//Hanging from top without a brain\r\n\tMT_MISC84,\t\t//Colon gibs\r\n\tMT_MISC85,\t\t//Small pool o' blood\r\n\tMT_MISC86,\t\t//brain stem lying on the ground\r\n\tNUMMOBJTYPES\n} mobjtype_t;\n\ntypedef struct {\n\tint\tdoomednum;\n\tint\tspawnstate;\n\tint\tspawnhealth;\n\tint\tseestate;\n\tint\tseesound;\n\tint\treactiontime;\n\tint\tattacksound;\n\tint\tpainstate;\n\tint\tpainchance;\n\tint\tpainsound;\n\tint\tmeleestate;\n\tint\tmissilestate;\n\tint\tdeathstate;\n\tint\txdeathstate;\n\tint\tdeathsound;\n\tint\tspeed;\n\tint\tradius;\n\tint\theight;\n\tint\tmass;\n\tint\tdamage;\n\tint\tactivesound;\n\tint\tflags;\n} mobjinfo_t;\n\nextern mobjinfo_t mobjinfo[NUMMOBJTYPES];\n\n"
  },
  {
    "path": "PSXDOOM/l_main.c",
    "content": "/* l_main.c -- legal intro */\r\n\r\n#include \"doomdef.h\"\r\n#include \"r_local.h\"\r\n\r\nint y_scroll;//80077FB8 uGp00000ba8\r\nint last_ticon;//80077D38 iGp00000928\r\n\r\npsxobj_t legalspic;//0x800979b0\r\n\r\n/*\r\n=======================\r\n=\r\n= L_Start\r\n=\r\n=======================\r\n*/\r\n\r\nvoid L_Start(void)//L80034D5C()\r\n{\r\n\tValloc_Init();\r\n\tImageToVram(&legalspic, \"LEGALS\", 0);\r\n\tS_StartSound(NULL, sfx_sgcock);\r\n\ty_scroll = 240;\r\n}\r\n\r\n/*\r\n=======================\r\n=\r\n= L_Stop\r\n=\r\n=======================\r\n*/\r\n\r\nvoid L_Stop(int exit)//L80034DA8()\r\n{\r\n\tS_StartSound(NULL, sfx_barexp);\r\n\tM_CrossFadeWipe();\r\n}\r\n\r\n/*\r\n=======================\r\n=\r\n= L_Ticker\r\n=\r\n=======================\r\n*/\r\n\r\nint L_Ticker(void)//L80034DD4()\r\n{\r\n    int exit;\r\n\r\n    exit = ga_nothing;\r\n\r\n    if (y_scroll > 0)\r\n    {\r\n        y_scroll--;\r\n\r\n        if (y_scroll == 0)\r\n            last_ticon = ticon;\r\n    }\r\n    else if ((ticon - last_ticon) > 120)\r\n    {\r\n        exit = ga_timeout;\r\n\r\n        if ((ticon - last_ticon) < 180)\r\n            exit = -(unsigned int)(ticbuttons[0] != 0) & ga_exit;\r\n    }\r\n\r\n    return exit;\r\n}\r\n\r\n/*\r\n=======================\r\n=\r\n= L_Draw\r\n=\r\n=======================\r\n*/\r\n\r\nvoid L_Draw(void)//L80034E54()\r\n{\r\n\tNextTextureCacheIdx();\r\n\tDrawStaticImage(&legalspic, 0, y_scroll, palette[16]);\r\n\tUpdateDrawOTag();\r\n\tDrawRender();\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/m_fixed.c",
    "content": "/* Fixed_t.c  */\r\n\r\n#include \"doomdef.h\"\r\n\r\nfixed_t FixedMul(register fixed_t\ta, register fixed_t\tb)//L8003EEA4()\r\n{\r\n\tregister int             sign;\r\n\tregister unsigned    \tc;\r\n\r\n\tsign = a^b;\r\n\r\n\tif (a <= 0)\r\n\t\ta = -a;\r\n\r\n\tif (b <= 0)\r\n\t\tb = -b;\r\n\r\n    //ASM CODE\r\n\t__asm__(\"multu\t%0, %1;\"    \\\r\n\t\t\t\"mfhi   %2;\"\t\t\\\r\n\t\t\t\"mflo   %3;\"\t\t\\\r\n\t\t\t: \"=r\"(a),\t\t\t\\\r\n\t\t\t  \"=r\"(b)\t\t\t\\\r\n\t\t\t: \"r\" (a),\t\t\t\\\r\n\t\t\t  \"r\" (b));\r\n\r\n\tc = (a << 16) + (b >> 16);\r\n    if (sign < 0)\r\n\t\tc = -c;\r\n\r\n\treturn c;\r\n}\r\n\r\nfixed_t FixedDiv(register fixed_t a, register fixed_t b)//L8003EEF0()\r\n{\r\n\tregister unsigned        c;\r\n\tregister unsigned        bit;\r\n\tregister int             sign;\r\n\r\n\tsign = a^b;\r\n\r\n\tif (a <= 0)\r\n\t\ta = -a;\r\n\r\n\tif (b <= 0)\r\n\t\tb = -b;\r\n\r\n\tbit = 0x10000;\r\n\tdo\r\n\t{\r\n\t\tb <<= 1;\r\n\t\tbit <<= 1;\r\n\t} while (b < a);\r\n\r\n\tc = 0;\r\n\tdo\r\n\t{\r\n\t\tif (a >= b)\r\n\t\t{\r\n\t\t\ta -= b;\r\n\t\t\tc |= bit;\r\n\t\t}\r\n\t\ta <<= 1;\r\n\t\tbit >>= 1;\r\n\t} while (bit && a);\r\n\r\n\tif (sign < 0)\r\n\t\tc = -c;\r\n\r\n\treturn c;\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/m_fixed.s",
    "content": "    opt at-,w-,c+,m-\r\n\r\n    section\tasm\r\n\r\n\txdef\tFixedMul,FixedDiv\r\n\r\nFixedMul:\r\n                xor     t0, a0, a1\r\n                bgtz    a0, loc_8003EEB4\r\n                move    v0, a0\r\n                neg     v0, a0\r\n\r\nloc_8003EEB4:\r\n                bgtz    a1, loc_8003EEC0\r\n                move    v1, a1\r\n                neg     v1, a1\r\n\r\nloc_8003EEC0:\r\n                multu   v0, v1\r\n                mfhi    a0\r\n                mflo    a1\r\n                sll     v0, a0, 16\r\n                srl     v1, a1, 16\r\n                nop\r\n                addu    a0, v0, v1\r\n                bgez    t0, locret_8003EEE8\r\n                move    v0, a0\r\n                neg     v0, a0\r\n\r\nlocret_8003EEE8:\r\n                jr      ra\r\n                nop\r\n\r\nFixedDiv:\r\n                xor     t0, a0, a1\r\n                bgtz    a0, loc_8003EF00\r\n                move    v0, a0\r\n                neg     v0, a0\r\n\r\nloc_8003EF00:\r\n                bgtz    a1, loc_8003EF0C\r\n                move    v1, a1\r\n                neg     v1, a1\r\n\r\nloc_8003EF0C:\r\n                lui     a2, 1\r\n                sltu    at, v1, v0\r\n                beqz    at, loc_8003EF30\r\n                and     t2, zero, a2\r\n\r\nloc_8003EF1C:\r\n                sll     v1, 1\r\n                sll     a2, 1\r\n                sltu    at, v1, v0\r\n                bnez    at, loc_8003EF1C\r\n                and     t2, zero, a2\r\n\r\nloc_8003EF30:\r\n\r\n                slt     at, v0, v1\r\n                bnez    at, loc_8003EF44\r\n                nop\r\n                sub     v0, v1\r\n                or      t2, a2\r\n\r\nloc_8003EF44:\r\n                sll     v0, 1\r\n                srl     a2, 1\r\n                beqz    a2, loc_8003EF5C\r\n                nop\r\n                bnez    v0, loc_8003EF30\r\n                nop\r\n\r\nloc_8003EF5C:\r\n                bgez    t0, locret_8003EF68\r\n                move    v0, t2\r\n                neg     v0, t2\r\n\r\nlocret_8003EF68:\r\n                jr      ra\r\n                nop\r\n\tend\r\n"
  },
  {
    "path": "PSXDOOM/m_main.c",
    "content": "/* m_main.c -- main menu */\r\n\r\n#include \"doomdef.h\"\r\n#include \"r_local.h\"\r\n#include \"st_main.h\"\r\n\r\nunsigned short STARTY[4] = {91, 133, 158, 200};//80077A64 sGp00000654\r\n#define CURSORX    50\r\n#define CURSORY(y) (STARTY[y])\r\n\r\nchar gametypenames[][16] = //80073B0C\r\n{\r\n\t\"Single Player\",\r\n\t\"Cooperative\",\r\n\t\"Deathmatch\"\r\n};\r\n\r\nchar skillnames[][16] = //80073B3C\r\n{\r\n\t\"I am a Wimp\",\r\n\t\"Not Too Rough\",\r\n\t\"Hurt Me Plenty\",\r\n\t\"Ultra Violence\",\r\n\t#if ENABLE_NIGHTMARE == 1\r\n\t\"Nightmare\"     //[GEC] Master Edition\r\n\t#endif // ENABLE_NIGHTMARE\r\n};\r\n\r\ntypedef enum\r\n{\r\n\tsingle,\r\n\tcoop,\r\n\tdmatch,\r\n\tNUMMODES\r\n} playmode_t;\r\n\r\n\r\npsxobj_t backpic;//0x800977f0\r\npsxobj_t doompic;//0x80097830\r\npsxobj_t connectpic;//0x800978F0\r\n\r\n/*\r\n=================\r\n=\r\n= RunMenu\r\n=\r\n=================\r\n*/\r\n\r\nint RunMenu(void)//L8003592C()\r\n{\r\n\tdo\r\n    {\r\n\t\tif (MiniLoop(M_Start, M_Stop, M_Ticker, M_Drawer) == ga_timeout)\r\n\t\t\treturn ga_timeout;\r\n\r\n\t\tNextTextureCacheIdx();\r\n\t\tDrawStaticImage(&backpic, 0, 0, palette[0]);\r\n\t\tDrawStaticImage(&doompic, 75, 20, palette[17]);\r\n\t\tUpdateDrawOTag();\r\n\t\tDrawRender();\r\n\r\n\t\tif(starttype == gt_single) break;\r\n\r\n\t\tP_LoadingPlaque(&connectpic, 54, 103, palette[0]);\r\n\t\tLink_Conection();\r\n\t\tNextTextureCacheIdx();\r\n\t\tDrawStaticImage(&backpic, 0, 0, palette[0]);\r\n\t\tDrawStaticImage(&doompic, 75, 20, palette[17]);\r\n\t\tUpdateDrawOTag();\r\n\t\tDrawRender();\r\n\t\tS_StartSound(NULL, sfx_pistol);// SNDPSTOL.mid\r\n\t} while (cancel_link != 0);\r\n\r\n\tG_InitNew(startskill, startmap, starttype);\r\n\tG_RunGame();\r\n\treturn 0;\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= M_Start\r\n=\r\n=================\r\n*/\r\n\r\n\r\nint\tcursorframe/*, cursorcount*/;//80078000 00000bf0\r\nint\tmovecount; //80077FA4 00000b94\r\n//int playermap;\r\n\r\nint\tcursorpos[MAXPLAYERS];//80077E2C uGp00000a1c,\r\nint m_vframe1[MAXPLAYERS]; //80077D24 uGp00000914\r\n\r\nvoid M_Start(void)//L80035A9C()\r\n{\r\n    netgame = 0;\r\n    consoleplayer = 0;\r\n    playeringame[0] = true;\r\n    playeringame[1] = false;\r\n\r\n\tValloc_Init();\r\n\r\n\tImageToVram(&loadingpic, \"LOADING\", 0);\r\n\tP_LoadingPlaque(&loadingpic, 95, 109, palette[16]);\r\n\tS_Lcd_Load(0);\r\n\r\n\tImageToVram(&backpic, \"BACK\", 0);\r\n\tImageToVram(&doompic, \"DOOM\", 0);\r\n\tImageToVram(&connectpic, \"CONNECT\", 0);\r\n\r\n\tcursorframe = 0;\r\n\tcursorpos[0] = 0;\r\n\tm_vframe1[0] = 0;\r\n\r\n\tif (starttype == gt_single)\r\n\t\tmovecount = 2;  // Episode '1' = Ultimate DOOM, '2' = Doom II\r\n    else\r\n        movecount = 54; // For multiplayer any of the normal (non secret) maps can be selected\r\n\r\n\tif (movecount < startmap)\r\n    {\r\n        // Wrap back around if we have to...\r\n\t\tstartmap = 1;\r\n    }\r\n    #if GH_UPDATES == 1\r\n    else if (startmap < 0)\r\n    {\r\n        // Start map or episode will be set to '< 0' when the Doom I is finished.\r\n        // This implies we want to point the user to Doom II:\r\n        startmap = 2;\r\n    }\r\n    #endif // GH_UPDATES\r\n\r\n    psxcd_play_at_andloop(CD_TRACK[cdmusic_main_menu],CDVolume,0,0,CD_TRACK[cdmusic_main_menu],CDVolume,0,0);\r\n\tdo {} while (psxcd_elapsed_sectors() == 0);\r\n\r\n\t//Desactiva la vision en la pantalla\r\n\tdraw[0].isbg = 0;\r\n\tdraw[1].isbg = 0;\r\n\tdrawside ^= 1;\r\n\r\n\t//Draw fake menu\r\n    M_Drawer();\r\n    M_CrossFadeWipe();\r\n\r\n\t//Activa la vision en la pantalla\r\n\tdraw[0].isbg = 1;\r\n\tdraw[1].isbg = 1;\r\n\r\n\tlast_ticon = ticon;\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= M_Stop\r\n=\r\n=================\r\n*/\r\n\r\nvoid M_Stop(int exit)//L80035C40()\r\n{\r\n    S_StartSound(0, sfx_pistol);\r\n    psxcd_stop();\r\n\r\n    if (((exit == ga_exit) && (starttype == gt_single)) && (startmap != 1))\r\n    {\r\n        startmap = 31;\r\n    }\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= M_Ticker\r\n=\r\n=================\r\n*/\r\n\r\nint M_Ticker(void)//L80035CC4()\r\n{\r\n    int buttons;\r\n\r\n    buttons = ticbuttons[0];\r\n\r\n    /* exit menu if button press */\r\n    if (ticbuttons[0] != 0)\r\n        last_ticon = ticon;\r\n\r\n    /* exit menu if time out */\r\n    if ((ticon - last_ticon) > 1800)\r\n        return ga_timeout;\r\n\r\n    /* animate skull */\r\n    if ((gamevbls < (int)gametic) && ((gametic & 3) == 0))\r\n        cursorframe ^= 1;\r\n\r\n    if (ticbuttons[0] != oldticbuttons[0])\r\n    {\r\n        if ((ticbuttons[0] & PAD_START) != 0)\r\n        {\r\n            return ga_exit;\r\n        }\r\n        if ((ticbuttons[0] & PAD_ACTION) && (cursorpos[0] >= gamemode))\r\n        {\r\n            if (cursorpos[0] < options)\r\n            {\r\n                return ga_exit;\r\n            }\r\n            if ((cursorpos[0] == options) && MiniLoop(O_Start,O_Stop,O_Ticker,O_Drawer) == ga_warped)\r\n            {\r\n                return ga_warped;\r\n            }\r\n        }\r\n    }\r\n\r\n    /* check for movement */\r\n    if (!(buttons & PAD_ARROWS))\r\n        m_vframe1[0] = 0;\r\n    else\r\n    {\r\n        m_vframe1[0] -= vblsinframe[0];\r\n        if (m_vframe1[0] <= 0)\r\n        {\r\n            m_vframe1[0] = TICRATE;\r\n\r\n            if (buttons & PAD_DOWN)\r\n            {\r\n                cursorpos[0] += 1;\r\n                if (cursorpos[0] == NUMMENUITEMS)\r\n                    cursorpos[0] = 0;\r\n\r\n                S_StartSound(NULL, sfx_pstop);\r\n            }\r\n            else if (buttons & PAD_UP)\r\n            {\r\n                cursorpos[0] += -1;\r\n                if (cursorpos[0] == -1)\r\n                    cursorpos[0] = NUMMENUITEMS-1;\r\n\r\n                S_StartSound(NULL, sfx_pstop);\r\n            }\r\n\r\n            switch (cursorpos[0])\r\n\t\t\t{\r\n\t\t\t    case\tlevel:\r\n\t\t\t        if (buttons & PAD_RIGHT)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tstartmap++;\r\n                        if (movecount < startmap)\r\n                            startmap = movecount;\r\n                        else\r\n                            S_StartSound(NULL, sfx_swtchx);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (buttons & PAD_LEFT)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tstartmap--;\r\n\t\t\t\t\t\tif (startmap < 1)\r\n                            startmap = 1;\r\n                        else\r\n                            S_StartSound(NULL, sfx_swtchx);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\r\n                case\tdifficulty:\r\n                    if (buttons & PAD_RIGHT)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t    #if ENABLE_NIGHTMARE == 1\r\n\t\t\t\t\t    if (startskill < sk_nightmare)\r\n\t\t\t\t\t    #else\r\n\t\t\t\t\t    if (startskill < sk_hard)\r\n\t\t\t\t\t    #endif // ENABLE_NIGHTMARE\r\n                        {\r\n                            startskill++;\r\n                            S_StartSound(NULL, sfx_swtchx);\r\n                        }\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (buttons & PAD_LEFT)\r\n\t\t\t\t\t{\r\n                        if (startskill != 0)\r\n                        {\r\n                            startskill--;\r\n                            S_StartSound(NULL, sfx_swtchx);\r\n                        }\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n                case\tgamemode:\r\n\t\t\t\t\tif (buttons & PAD_RIGHT)\r\n\t\t\t\t\t{\r\n                        if (starttype < gt_deathmatch)\r\n                        {\r\n\t\t\t\t\t\t\tstarttype++;\r\n\t\t\t\t\t\t\tif(starttype == gt_coop)\r\n                                startmap = 1;\r\n                            S_StartSound(NULL, sfx_swtchx);\r\n                        }\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (buttons & PAD_LEFT)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (starttype != gt_single)\r\n                        {\r\n                            starttype--;\r\n                            if (starttype == gt_single)\r\n                                startmap = 1;\r\n                            S_StartSound(NULL, sfx_swtchx);\r\n                        }\r\n                    }\r\n\r\n                    if (starttype != gt_single)\r\n                        movecount = 54;\r\n                    else\r\n                        movecount = 2;\r\n\r\n                    if (startmap > movecount)\r\n                        startmap = 1;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n        }\r\n    }\r\n    return ga_nothing;\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= M_Drawer\r\n=\r\n=================\r\n*/\r\n\r\nvoid M_Drawer(void)//L80036058()\r\n{\r\n    NextTextureCacheIdx();\r\n    DrawStaticImage(&backpic, 0, 0, palette[0]);\r\n    DrawStaticImage(&doompic, 75, 20, palette[17]);\r\n\r\n    DrawImage(statuspic.vtpage, palette[16], CURSORX, CURSORY(cursorpos[0]) - 2, M_SKULL_VX + (cursorframe * M_SKULL_W), M_SKULL_VY, M_SKULL_W, M_SKULL_H);\r\n\r\n    ST_DrawText(74, STARTY[0], \"Game Mode\");\r\n    ST_DrawText(90, STARTY[0]+20, gametypenames[starttype]);\r\n    if (starttype == 0)\r\n    {\r\n        if (startmap == 1)\r\n            ST_DrawText(74, STARTY[1], \"Ultimate Doom\");\r\n        else\r\n            ST_DrawText(74, STARTY[1], \"Doom II\");\r\n    }\r\n    else\r\n    {\r\n        ST_DrawText(74, STARTY[1], \"Level\");\r\n        if (startmap >= 10)\r\n\t\t\tST_DrawValue(148, STARTY[1], startmap);\r\n\t\telse\r\n            ST_DrawValue(136, STARTY[1], startmap);\r\n    }\r\n\r\n    ST_DrawText(74, STARTY[2], \"Difficulty\");\r\n    ST_DrawText(90, STARTY[2] + 20, skillnames[startskill]);\r\n    ST_DrawText(74, STARTY[3], \"Options\");\r\n\r\n    UpdateDrawOTag();\r\n    DrawRender();\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= M_CrossFadeWipe\r\n=\r\n=================\r\n*/\r\n\r\nvoid M_CrossFadeWipe(void)//L80036248()\r\n{\r\n\tDRAWENV\t    tmp_draw[2];\t\t\t\t\t/* draw environment */\r\n\tDISPENV     tmp_disp[2];\t\t\t\t\t/* display environment*/\r\n\tPOLY_FT4\tpoly[2];\r\n\tint\t\t\tintensity;\r\n\tlong        d_side;\r\n\r\n\tValloc_Init();\r\n\r\n\tSetDefDrawEnv(&tmp_draw[0], 512, 256, 256, 240);\r\n\ttmp_draw[0].isbg = 1;\r\n\ttmp_draw[0].dtd = 0;\r\n\ttmp_draw[0].dfe = 1;\r\n\r\n\tSetDefDrawEnv(&tmp_draw[1], 768, 256, 256, 256);\r\n\ttmp_draw[1].isbg = 1;\r\n\ttmp_draw[1].dtd = 0;\r\n\ttmp_draw[1].dfe = 1;\r\n\r\n\tSetDefDispEnv(&tmp_disp[0], 768, 256, 256, 240);\r\n\tSetDefDispEnv(&tmp_disp[1], 512, 256, 256, 240);\r\n\r\n\tMoveImage(&disp[drawside].disp, 768, 256);\r\n\r\n\tDrawSync(0);\r\n\tVSync(0);\r\n\r\n\tPutDrawEnv(&tmp_draw[0]);\r\n\tPutDispEnv(&tmp_disp[0]);\r\n\r\n\t//Set Layer1\r\n\tsetPolyFT4(&poly[0]);\r\n\tsetUV4(&poly[0], 0, 0, 255, 0, 0, 239, 255, 239);\r\n\tsetXY4(&poly[0], 0, 0, 255, 0, 0, 239, 255, 239);\r\n\r\n\tif (drawside == 0)\r\n\t\tpoly[0].tpage = getTPage(2, 0, 256, 0);\r\n\telse\r\n\t\tpoly[0].tpage = getTPage(2, 0, 0, 0);\r\n\r\n\tpoly[0].clut = 0;\r\n\r\n\t//Set Layer2\r\n\tsetPolyFT4(&poly[1]);\r\n\tsetSemiTrans(&poly[1], 1);\r\n\tsetUV4(&poly[1], 0, 0, 255, 0, 0, 239, 255, 239);\r\n\tsetXY4(&poly[1], 0, 0, 255, 0, 0, 239, 255, 239);\r\n\r\n\tif (drawside != 0)\r\n\t\tpoly[1].tpage = getTPage(2, 0, 256, 0);\r\n\telse\r\n\t\tpoly[1].tpage = getTPage(2, 0, 0, 0);\r\n\r\n\tpoly[1].clut = 0;\r\n\r\n\td_side = 0;\r\n\tintensity = 255;\r\n\tdo\r\n\t{\r\n\t\tsetRGB0(&poly[0], intensity, intensity, intensity);\r\n\t\tW_AddPrim(&poly[0]);// add to order table*/\r\n\r\n\t\tsetRGB0(&poly[1], ~intensity, ~intensity, ~intensity);\r\n\t\tW_AddPrim(&poly[1]);// add to order table*/\r\n\r\n\t\tUpdateDrawOTag();\r\n\r\n\t\t//DrawRender\r\n\t\tDrawSync(0);\r\n\t\tVSync(0);\r\n\r\n\t\td_side ^= 1;\r\n\t\tPutDrawEnv(&tmp_draw[d_side]);\r\n\t\tPutDispEnv(&tmp_disp[d_side]);\r\n\r\n\t\tintensity -= 5;\r\n\t} while (intensity >= 0);\r\n\r\n\tUpdateDrawOTag();\r\n\tDrawRender();\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/m_password.c",
    "content": "/* m_password.c -- password encode/decode */\r\n\r\n#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n#include \"st_main.h\"\r\n#include \"r_local.h\"\r\n\r\n// [GEC] MASTER EDITION NEW FLAGS\r\n#define MAPUP1\t\t0x20\r\n#define MAPUP2\t\t0x40\r\n#define NIGHTMARE\t0x80\r\n\r\nvoid Encode_Password(byte *buff)//L80037BBC()\r\n{\r\n\tint i, j, shift, code, pos;\r\n\tchar tmpbuff[8];\r\n\tplayer_t\t*player;\r\n\tint maxclip, maxshell, maxcell, maxmisl;\r\n\tint val, newval;\r\n\r\n\t#if ENABLE_NIGHTMARE == 1\r\n\tint skillnightmare;\r\n\t#endif // ENABLE_NIGHTMARE\r\n\r\n\tplayer = &players[consoleplayer];\r\n\tD_memset(tmpbuff, 0, 8);\r\n\r\n\t#if ENABLE_NIGHTMARE == 1\r\n\t//Check the nightmare difficulty\r\n\tskillnightmare = 0;\r\n\tif(gameskill == sk_nightmare)\r\n    {\r\n        skillnightmare = sk_nightmare;\r\n    }\r\n    #endif // ENABLE_NIGHTMARE\r\n\r\n\ttmpbuff[0] = ((byte)nextmap & 63) << 2;//map\r\n\ttmpbuff[0] |= (byte)gameskill & 3;//skill\r\n\r\n\t// Weapons\r\n\tfor (i = 0; i < 7; i++)\r\n\t{\r\n\t\tif (player->weaponowned[wp_shotgun + i])\r\n\t\t{\r\n\t\t\ttmpbuff[1] |= (1 << i);\r\n\t\t}\r\n\t}\r\n\r\n\t//Get Maximun Ammo\r\n\tmaxclip = maxammo[am_clip];\r\n\tmaxshell = maxammo[am_shell];\r\n\tmaxcell = maxammo[am_cell];\r\n\tmaxmisl = maxammo[am_misl];\r\n\r\n\t// Backpack\r\n\tif (player->backpack)\r\n\t{\r\n\t\tmaxclip <<= 1;\r\n\t\tmaxshell <<= 1;\r\n\t\tmaxcell <<= 1;\r\n\t\tmaxmisl <<= 1;\r\n\t\ttmpbuff[1] |= 0x80;\r\n\t}\r\n\r\n\t// Clip\r\n\tval = (player->ammo[am_clip] << 3) / maxclip;\r\n\tif ((player->ammo[am_clip] << 3) % maxclip) { val += 1; }\r\n\ttmpbuff[2] = val << 4;\r\n\r\n\t// Shell\r\n\tval = (player->ammo[am_shell] << 3) / maxshell;\r\n\tif ((player->ammo[am_shell] << 3) % maxshell) { val += 1; }\r\n\ttmpbuff[2] |= val;\r\n\r\n\t// Cell\r\n\tval = (player->ammo[am_cell] << 3) / maxcell;\r\n\tif ((player->ammo[am_cell] << 3) % maxcell) { val += 1; }\r\n\ttmpbuff[3] = val << 4;\r\n\r\n\t// Missile\r\n\tval = (player->ammo[am_misl] << 3) / maxmisl;\r\n\tif ((player->ammo[am_misl] << 3) % maxmisl) { val += 1; }\r\n\ttmpbuff[3] |= val;\r\n\r\n\t// Health\r\n\tval = (player->health << 3) / 200;\r\n\tif ((player->health << 3) % 200) { val += 1; }\r\n\ttmpbuff[4] = val << 4;\r\n\r\n\t// Armor\r\n\tval = (player->armorpoints << 3) / 200;\r\n\tif ((player->armorpoints << 3) % 200) { val += 1; }\r\n\ttmpbuff[4] |= val;\r\n\r\n\t// ArmorType\r\n\ttmpbuff[5] = (byte)player->armortype << 3;\r\n\r\n\t#if ENABLE_NIGHTMARE == 1\r\n\t//I used the ArmorType space to add the 0x80 flag to identify that the difficulty is nightmare\r\n\tif(skillnightmare != 0) {\r\n        tmpbuff[5] |= 0x80;\r\n    }\r\n    #endif // ENABLE_NIGHTMARE\r\n\r\n     #if ENABLE_MOREMAPS == 1\r\n    //Enables the possibility of incorporating more maps, maximum 255\r\n    if(nextmap >= 192) {\r\n    \ttmpbuff[5] |= (MAPUP1|MAPUP2);\r\n\t}\r\n\telse if(nextmap >= 128) {\r\n    \ttmpbuff[5] |= MAPUP2;\r\n\t}\r\n\telse if(nextmap >= 64) {\r\n    \ttmpbuff[5] |= MAPUP1;\r\n\t}\r\n\t#endif // ENABLE_MOREMAPS\r\n\r\n\t//Encode Encrypt System\r\n\tfor (i = 0; i < 45;)\r\n\t{\r\n\t\tnewval = 0;\r\n\t\tshift = 16;\r\n\r\n\t\tfor (j = 4; j >= 0; j--)\r\n\t\t{\r\n\t\t\tpos = i;\r\n\t\t\tif (i < 0) { pos = i + 7;}\r\n\r\n\t\t\tpos >>= 3;\r\n\t\t\tcode = tmpbuff[pos] & (0x80 >> (i - (pos << 3)));\r\n\r\n\t\t\tif (code != 0)\r\n\t\t\t\tnewval |= shift;\r\n\r\n\t\t\tshift >>= 1;\r\n\t\t\ti++;\r\n\t\t}\r\n\r\n\t\tpos = ((i - 1) / 5);\r\n\t\tbuff[pos] = newval;\r\n\t}\r\n\r\n\tbuff[9] = 0;\r\n\r\n\tfor (i = 0; i < 9; i++)\r\n\t\tbuff[9] ^= buff[i];\r\n\r\n\tfor (i = 0; i < 9; i++)\r\n\t\tbuff[i] ^= buff[9];\r\n}\r\n\r\nint Decode_Password(byte *inbuff, int *levelnum, int *skill, player_t *player)//L80037FB0()\r\n{\r\n\tint val, newval, i, j, shift, code, pos;\r\n\tbyte decbuff[8];\r\n\tbyte buff[10];\r\n\r\n\tD_memcpy(buff, inbuff, 10);\r\n\r\n\tval = 0;\r\n\r\n\tfor (i = 0; i < 9; i++)\r\n\t\tbuff[i] ^= buff[9];\r\n\r\n\tfor (i = 0; i < 9; i++)\r\n\t\tval ^= buff[i];\r\n\r\n\tif (val == buff[9])\r\n\t{\r\n\t\t//Decode Encrypt System\r\n\t\tfor (i = 0; i < 48;)\r\n\t\t{\r\n\t\t\tnewval = 0;\r\n\t\t\tshift = 0x80;\r\n\r\n\t\t\tfor (j = 7; j >= 0; j--)\r\n\t\t\t{\r\n\t\t\t\tpos = (i / 5);\r\n\t\t\t\tcode = buff[pos] & (16 >> (i - (pos * 5)));\r\n\r\n\t\t\t\tif (code != 0)\r\n\t\t\t\t\tnewval |= shift;\r\n\r\n\t\t\t\tshift >>= 1;\r\n\t\t\t\ti++;\r\n\t\t\t}\r\n\r\n\t\t\tpos = (i - 1);\r\n\t\t\tif (pos < 0) { pos = i + 6; }\r\n\t\t\tpos >>= 3;\r\n\r\n\t\t\tdecbuff[pos] = newval;\r\n\t\t}\r\n\r\n\t\t*levelnum = decbuff[0] >> 2;\r\n\r\n\t\t#if ENABLE_MOREMAPS == 1\r\n\t\tif (decbuff[5] & MAPUP1) {\r\n            decbuff[5] &= ~MAPUP1;\r\n            *levelnum |= 64;\r\n        }\r\n        if (decbuff[5] & MAPUP2) {\r\n            decbuff[5] &= ~MAPUP2;\r\n            *levelnum |= 128;\r\n        }\r\n        #endif // ENABLE_MOREMAPS\r\n\r\n\t\tif (*levelnum != 0 && (*levelnum < LASTLEVEL))\r\n\t\t{\r\n\t\t\t*skill = decbuff[0] & 3;\r\n\r\n\t\t\t#if ENABLE_NIGHTMARE == 1\r\n\t\t\t//Check that the flag is 0x80, add the nightmare difficulty and remove the flag 0x80\r\n\t\t\tif (decbuff[5] & NIGHTMARE)\r\n            {\r\n                decbuff[5] &= ~NIGHTMARE;\r\n                *skill = sk_nightmare;\r\n            }\r\n\t\t\t#endif // ENABLE_NIGHTMARE\r\n\r\n\t\t\t#if GH_UPDATES == 1\r\n\t\t\tif (((decbuff[2] & 15) < 9) &&\t// Shell\r\n\t\t\t\t((decbuff[2] >> 4) < 9) &&\t// Clip\r\n\t\t\t\t((decbuff[3] & 15) < 9) &&\t// Missile\r\n\t\t\t\t((decbuff[3] >> 4) < 9) &&\t// Cell\r\n\t\t\t\t((decbuff[4] & 15) < 9) &&\t// Armor\r\n\t\t\t\t((decbuff[4] >> 4) < 9))\t// Health\r\n            #endif // GH_UPDATES\r\n\t\t\t{\r\n                // ArmorType\r\n                if ((decbuff[5] >> 3) < 3)\r\n                {\r\n                    // Health\r\n                    if ((decbuff[4] >> 4) != 0)\r\n                    {\r\n                        if (player != 0)\r\n                        {\r\n                            // Weapons\r\n                            for (i = 0; i < 7; i++)\r\n                            {\r\n                                if ((decbuff[1] >> i) & 1)\r\n                                {\r\n                                    player->weaponowned[wp_shotgun + i] = 1;\r\n                                }\r\n                            }\r\n\r\n                            // Backpack\r\n                            if (decbuff[1] & 0x80)\r\n                            {\r\n                                if (!player->backpack)\r\n                                {\r\n                                    player->backpack = 1;\r\n\r\n                                    for (i = 0; i < 4; i++)\r\n                                        player->maxammo[i] <<= 1;\r\n                                }\r\n                            }\r\n\r\n                            // Clip\r\n                            val = decbuff[2] >> 4;\r\n                            val *= player->maxammo[am_clip];\r\n                            if (val < 0) { val += 7; }\r\n                            player->ammo[am_clip] = val >> 3;\r\n\r\n                            // Shell\r\n                            val = decbuff[2] & 0xf;\r\n                            val *= player->maxammo[am_shell];\r\n                            if (val < 0) { val += 7; }\r\n                            player->ammo[am_shell] = val >> 3;\r\n\r\n                            // Cell\r\n                            val = decbuff[3] >> 4;\r\n                            val *= player->maxammo[am_cell];\r\n                            if (val < 0) { val += 7; }\r\n                            player->ammo[am_cell] = val >> 3;\r\n\r\n                            // Shell\r\n                            val = decbuff[3] & 0xf;\r\n                            val *= player->maxammo[am_misl];\r\n                            if (val < 0) { val += 7; }\r\n                            player->ammo[am_misl] = val >> 3;\r\n\r\n                            // Health\r\n                            player->health = (decbuff[4] >> 4) * 25;\r\n\r\n                            // Armor\r\n                            player->armorpoints = (decbuff[4] & 15) * 25;\r\n\r\n                            // ArmorType\r\n                            player->armortype = decbuff[5] >> 3;\r\n\r\n                            // Apply Health on mobj_t\r\n                            player->mo->health = player->health;\r\n                        }\r\n\r\n                        return 1;\r\n                    }\r\n                }\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn 0;\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/o_main.c",
    "content": "/* o_main.c -- options menu */\r\n\r\n#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n#include \"st_main.h\"\r\n#include \"r_local.h\"\r\n\r\n#define MOVEWAIT\t5\r\n#define ITEMSPACE\t40\r\n#define SLIDEWIDTH 90\r\n\r\n#define SetVolPsx(vol) ((int)((vol*0x7f)/100))\r\n\r\nchar optionsnames[][16] = //8007491C\r\n{\r\n\t\"Music Volume\",\r\n\t\"Sound Volume\",\r\n\t\"Password\",\r\n\t\"Configuration\",\r\n\t\"Main Menu\",\r\n\t\"Restart Level\"\r\n};\r\n\r\ntypedef struct\r\n{\r\n\tint\tcasepos; //*\r\n\tint x;\t\t //*4\r\n\tint y;\t\t //*8\r\n} menuitem_t;\r\n\r\nmenuitem_t menu_intro[5] = //8007497c\r\n{\r\n\t{ 0, 62, 65 },\r\n\t{ 1, 62, 105 },\r\n\t{ 2, 62, 145 },\r\n\t{ 3, 62, 170 },\r\n\t{ 4, 62, 195 },\r\n};\r\n\r\nmenuitem_t menu_single[6] = //800749B8\r\n{\r\n\t{ 0, 62, 50 },\r\n\t{ 1, 62, 90 },\r\n\t{ 2, 62, 130 },\r\n\t{ 3, 62, 155 },\r\n\t{ 4, 62, 180 },\r\n\t{ 5, 62, 205 },\r\n};\r\n\r\nmenuitem_t menu_net[4] = //80074A00\r\n{\r\n\t{ 0, 62, 70 },\r\n\t{ 1, 62, 110 },\r\n\t{ 4, 62, 150 },\r\n\t{ 5, 62, 175 },\r\n};\r\n\r\nmenuitem_t *menuitem;   //800780E4 puGp00000cd4\r\nint itemlines;          //80077F40 uGp00000b30\r\n\r\n/*\r\n=================\r\n=\r\n= O_Start\r\n=\r\n=================\r\n*/\r\n\r\nvoid O_Start(void)//L8003E680()\r\n{\r\n\tint i;\r\n\r\n\tS_StartSound(NULL, sfx_pistol);\r\n\r\n\tcursorframe = 0;\r\n\r\n\tfor (i = 0; i < MAXPLAYERS; i++)\r\n\t{\r\n\t\tm_vframe1[i] = 0;\r\n\t\tcursorpos[i] = 0;\r\n\t}\r\n\r\n\tif (netgame == gt_single)\r\n    {\r\n        if (gamepaused)\r\n\t\t{\r\n\t\t\tmenuitem = menu_single;\r\n\t\t\titemlines = 6;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tmenuitem = menu_intro;\r\n\t\t\titemlines = 5;\r\n\t\t}\r\n    }\r\n\telse\r\n\t{\r\n\t\tmenuitem = menu_net;\r\n\t\titemlines = 4;\r\n\t}\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= O_Stop\r\n=\r\n=================\r\n*/\r\n\r\nvoid O_Stop(int exit)//L8003E740()\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < MAXPLAYERS; i++)\r\n\t\tcursorpos[i] = 0;\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= O_Ticker\r\n=\r\n=================\r\n*/\r\n\r\nint O_Ticker(void)//L8003E764()\r\n{\r\n\tint i, buttons, oldbuttons;\r\n\r\n    /* animate skull */\r\n    if ((gamevbls < (int)gametic) && ((gametic & 3) == 0))\r\n        cursorframe ^= 1;\r\n\r\n    //for (i = 0; i < MAXPLAYERS; i++)\r\n    for (i=(MAXPLAYERS-1) ; i >= 0 ; i--)\r\n    {\r\n        if (playeringame[i] != 0)\r\n        {\r\n            buttons = ticbuttons[i];\r\n            oldbuttons = oldticbuttons[i];\r\n\r\n            if ((buttons != oldbuttons) && (buttons & (PAD_START|PAD_SELECT)))\r\n            {\r\n                S_StartSound(0, sfx_pistol);\r\n                return ga_exit;\r\n            }\r\n\r\n            /* check for movement */\r\n            if (!(buttons & PAD_ARROWS))\r\n            {\r\n                m_vframe1[i] = 0;\r\n            }\r\n            else\r\n            {\r\n                m_vframe1[i] -= vblsinframe[0];\r\n                if (m_vframe1[i] <= 0)\r\n                {\r\n                    m_vframe1[i] = TICRATE;\r\n\r\n                    if (buttons & PAD_DOWN)\r\n                    {\r\n                        cursorpos[i]++;\r\n                        if ((itemlines - 1) < cursorpos[i])\r\n                            cursorpos[i] = 0;\r\n\r\n                        if (consoleplayer == i)\r\n                            S_StartSound(NULL, sfx_pstop);\r\n                    }\r\n                    else if (buttons & PAD_UP)\r\n                    {\r\n                        cursorpos[i]--;\r\n                        if (cursorpos[i] < 0)\r\n                            cursorpos[i] = (itemlines - 1);\r\n\r\n                        if (consoleplayer == i)\r\n                            S_StartSound(NULL, sfx_pstop);\r\n                    }\r\n                }\r\n            }\r\n\r\n            switch ((menuitem + cursorpos[i])->casepos)\r\n            {\r\n                case 0:\t// music volume\r\n                    if (consoleplayer == i)\r\n                    {\r\n                        if (buttons & PAD_RIGHT)\r\n                        {\r\n                            MusVolume++;\r\n                            if (MusVolume > 100)\r\n                                MusVolume = 100;\r\n                            else\r\n                            {\r\n                                S_SetMusicVolume(SetVolPsx(MusVolume));\r\n\r\n                                if (MusVolume & 1)\r\n                                    S_StartSound(NULL, sfx_stnmov);\r\n                            }\r\n\r\n                            CDVolume = (MusVolume * 0x3cff) / 100;\r\n                        }\r\n                        else if (buttons & PAD_LEFT)\r\n                        {\r\n                            MusVolume--;\r\n                            if (MusVolume < 0)\r\n                                MusVolume = 0;\r\n                            else\r\n                            {\r\n                                S_SetMusicVolume(SetVolPsx(MusVolume));\r\n\r\n                                if (MusVolume & 1)\r\n                                    S_StartSound(NULL, sfx_stnmov);\r\n                            }\r\n\r\n                            CDVolume = (MusVolume * 0x3cff) / 100;\r\n                        }\r\n                    }\r\n                    break;\r\n\r\n                case 1:\t// sound volume\r\n                    if (consoleplayer == i)\r\n                    {\r\n                        if (buttons & PAD_RIGHT)\r\n                        {\r\n                            SfxVolume++;\r\n                            if (SfxVolume > 100)\r\n                                SfxVolume = 100;\r\n                            else\r\n                            {\r\n                                S_SetSoundVolume(SetVolPsx(SfxVolume));\r\n\r\n                                if (SfxVolume & 1)\r\n                                    S_StartSound(NULL, sfx_stnmov);\r\n                            }\r\n                        }\r\n                        else if (buttons & PAD_LEFT)\r\n                        {\r\n                            SfxVolume--;\r\n                            if (SfxVolume < 0)\r\n                                SfxVolume = 0;\r\n                            else\r\n                            {\r\n                                S_SetSoundVolume(SetVolPsx(SfxVolume));\r\n\r\n                                if (SfxVolume & 1)\r\n                                    S_StartSound(NULL, sfx_stnmov);\r\n                            }\r\n                        }\r\n                    }\r\n                    break;\r\n                case 2://Password\r\n                    if (buttons & PAD_ACTION)\r\n                    {\r\n                        if (MiniLoop(PW_Start, PW_Stop, PW_Ticker, PW_Drawer) == ga_warped)\r\n                            return ga_warped;\r\n                    }\r\n                    break;\r\n                case 3://Configuration\r\n                    if (buttons & PAD_ACTION)\r\n                    {\r\n                        MiniLoop(CF_Start, CF_Stop, CF_Ticker, CF_Drawer);\r\n                    }\r\n                    break;\r\n                case 4://Main Menu\r\n                    if (buttons & PAD_ACTION)\r\n                    {\r\n                        S_StartSound(0, sfx_pistol);\r\n                        return ga_exitdemo;\r\n                    }\r\n                    break;\r\n                case 5:// Restar Level\r\n                    if (buttons & PAD_ACTION)\r\n                    {\r\n                        S_StartSound(0, sfx_pistol);\r\n                        return ga_restart;\r\n                    }\r\n                    break;\r\n                default:\r\n                    break;\r\n            }\r\n        }\r\n    }\r\n\treturn ga_nothing;\r\n}\r\n\r\n\r\n/*\r\n=================\r\n=\r\n= O_Drawer\r\n=\r\n=================\r\n*/\r\n\r\nvoid O_Drawer(void)//L8003EC38()\r\n{\r\n\tint i, j;\r\n\tint\txpos, ypos;\r\n\tmenuitem_t *m_item;\r\n\r\n\tNextTextureCacheIdx();\r\n\r\n\t//Draw Backround MARB01 Pic\r\n\tfor (ypos = 0; ypos < 4; ypos++)\r\n\t{\r\n\t\tfor (xpos = 0; xpos < 4; xpos++)\r\n\t\t{\r\n\t\t\tDrawStaticImage(&marb01pic, xpos << 6, ypos << 6, palette[0]);\r\n\t\t}\r\n\t}\r\n\r\n\tif (gameaction == 0)\r\n\t{\r\n\t\tST_DrawText(-1, 20, \"Options\");\r\n\r\n\t\tm_item = menuitem;\r\n\t\tfor (i = 0; i < itemlines; i++)\r\n\t\t{\r\n\t\t\tST_DrawText(m_item->x, m_item->y, optionsnames[m_item->casepos]);\r\n\r\n\t\t\tif (m_item->casepos < 2)\r\n\t\t\t{\r\n\t\t\t\t//Draw Bar Dial\r\n\t\t\t\tDrawImage(statuspic.vtpage, palette[16], m_item->x + 13, m_item->y + 20, 0, 184, 108, 11);\r\n\r\n\t\t\t\tif (m_item->casepos == 0)\r\n\t\t\t\t\tDrawImage(statuspic.vtpage, palette[16], MusVolume + m_item->x + 14, m_item->y + 20, 108, 184, 6, 11);\r\n\t\t\t\telse\r\n\t\t\t\t\tDrawImage(statuspic.vtpage, palette[16], SfxVolume + m_item->x + 14, m_item->y + 20, 108, 184, 6, 11);\r\n\t\t\t}\r\n\r\n\t\t\tm_item++;\r\n\t\t}\r\n\r\n\t\t//Draw Skull\r\n\t\tm_item = menuitem + cursorpos[consoleplayer];\r\n\t\tDrawImage(statuspic.vtpage, palette[16], m_item->x - 24, m_item->y - 2, (cursorframe * M_SKULL_W) + M_SKULL_VX, M_SKULL_VY, M_SKULL_W, M_SKULL_H);\r\n\t}\r\n\r\n\tUpdateDrawOTag();\r\n\tDrawRender();\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/obj/tmp.txt",
    "content": "temp file"
  },
  {
    "path": "PSXDOOM/p_base.c",
    "content": "/* p_base.c */\r\n\r\n#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n\r\n//completo y revisado\r\n\r\nstatic mobj_t *checkthing;\t\t/* Used for PB_CheckThing */    //pmGp00000c60\r\nstatic fixed_t testx, testy;                                    //fGp00000910, fGp0000091c\r\nstatic fixed_t testfloorz, testceilingz, testdropoffz;          //iGp00000984, iGp00000b1c, iGp00000b38\r\nstatic subsector_t *testsubsec;                                 //psGp00000944\r\nstatic line_t *ceilingline;                                     //iGp000009a8\r\nstatic mobj_t *hitthing;                                        //iGp00000b9c\r\nstatic fixed_t testbbox[4];\t\t/* Bounding box for tests */    //800a8e48\r\nstatic int testflags;                                           //uGp00000cc8\r\n\r\n//psx doom new\r\nextern int checkcount; //*L80077DE4\r\n\r\nvoid P_XYMovement(mobj_t *mo);\r\nvoid P_FloatChange(mobj_t *mo);\r\nvoid P_ZMovement(mobj_t *mo);\r\nvoid P_MobjThinker(mobj_t *mobj);\r\nboolean PB_TryMove(int tryx, int tryy);\r\nvoid PB_UnsetThingPosition(mobj_t *thing);\r\nvoid PB_SetThingPosition(mobj_t *thing);\r\nboolean PB_CheckPosition(void);\r\nboolean PB_BoxCrossLine(line_t *ld);\r\nboolean PB_CheckLine(line_t *ld);\r\nboolean PB_CheckThing(mobj_t *thing);\r\nboolean PB_BlockLinesIterator(int x, int y);\r\nboolean PB_BlockThingsIterator(int x, int y);\r\n\r\n/*\r\n=================\r\n=\r\n= P_RunMobjBase\r\n=\r\n= Execute base think logic for the critters every tic\r\n=\r\n=================\r\n*/\r\n\r\nvoid P_RunMobjBase(void)//L80013814()\r\n{\r\n\tcheckcount = 0;\r\n\r\n\tfor (checkthing = mobjhead.next; checkthing != &mobjhead; checkthing = checkthing->next)\r\n\t{\r\n\t\tif (!checkthing->player)\r\n\t\t{\r\n\t\t\tcheckthing->latecall = NULL;\r\n\t\t\tcheckcount++;\r\n\t\t\tP_MobjThinker(checkthing);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/*\r\n===================\r\n=\r\n= P_XYMovement\r\n=\r\n===================\r\n*/\r\n\r\n#define\tSTOPSPEED\t\t0x1000\r\n#define\tFRICTION\t\t0xd200  //Jag 0xd240\r\n\r\nvoid P_XYMovement(mobj_t *mo)//L800138AC()\r\n{\r\n\tfixed_t xleft, yleft;\r\n\tfixed_t xuse, yuse;\r\n\r\n\t//\r\n\t// cut the move into chunks if too large\r\n\t//\r\n\r\n\txleft = xuse = mo->momx & ~7;\r\n\tyleft = yuse = mo->momy & ~7;\r\n\r\n\twhile (xuse > MAXMOVE || xuse < -MAXMOVE\r\n\t\t|| yuse > MAXMOVE || yuse < -MAXMOVE)\r\n\t{\r\n\t\txuse >>= 1;\r\n\t\tyuse >>= 1;\r\n\t}\r\n\r\n\twhile (xleft || yleft)\r\n\t{\r\n\t\txleft -= xuse;\r\n\t\tyleft -= yuse;\r\n\t\tif (!PB_TryMove(mo->x + xuse, mo->y + yuse))\r\n\t\t{\r\n\t\t\t// blocked move\r\n\t\t\tif (mo->flags & MF_SKULLFLY)\r\n\t\t\t{\r\n\t\t\t\tmo->latecall = L_SkullBash;\r\n\t\t\t\tmo->extramobj = hitthing;\r\n\t\t\t}\r\n\r\n\t\t\t// explode a missile\r\n\t\t\tif (mo->flags & MF_MISSILE)\r\n\t\t\t{\r\n\t\t\t\tif (ceilingline && ceilingline->backsector &&\r\n\t\t\t\t\tceilingline->backsector->ceilingpic == -1)// hack to prevent missiles exploding against the sky\r\n\t\t\t\t{\r\n\t\t\t\t\tmo->latecall = P_RemoveMobj;\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tmo->latecall = L_MissileHit;\r\n\t\t\t\tmo->extramobj = hitthing;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tmo->momx = mo->momy = 0;\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\r\n\t//\r\n\t// slow down\r\n\t//\r\n\tif (mo->flags & (MF_MISSILE | MF_SKULLFLY))\r\n\t\treturn;\t\t// no friction for missiles ever\r\n\r\n\tif (mo->z > mo->floorz)\r\n\t\treturn;\t\t// no friction when airborne\r\n\r\n\tif ((mo->flags & MF_CORPSE) && (mo->floorz != mo->subsector->sector->floorheight))\r\n        return;\t\t// don't stop halfway off a step\r\n\r\n\tif (mo->momx > -STOPSPEED && mo->momx < STOPSPEED &&\r\n        mo->momy > -STOPSPEED && mo->momy < STOPSPEED)\r\n    {\r\n\t\tmo->momx = 0;\r\n\t\tmo->momy = 0;\r\n\t}\r\n\telse\r\n    {\r\n\t\tmo->momx = (mo->momx >> 8) * (FRICTION >> 8);\r\n\t\tmo->momy = (mo->momy >> 8) * (FRICTION >> 8);\r\n\t}\r\n}\r\n\r\n/*\r\n===================\r\n=\r\n= P_FloatChange\r\n=\r\n= Float up or down at a set speed, used by flying monsters\r\n=\r\n===================\r\n*/\r\n//inline\r\nvoid P_FloatChange(mobj_t *mo)//L80013B0C()\r\n{\r\n\tmobj_t *target;\r\n\tfixed_t dist, delta;\r\n\tfixed_t dx, dy;\r\n\r\n\ttarget = mo->target;\t\t/* Get the target object */\r\n\r\n\t//inline function ??\r\n\t//dist = P_AproxDistance(target->x - mo->x, target->y - mo->y);\t/* Distance to target */\r\n\tdx = abs(target->x - mo->x);\n\tdy = abs(target->y - mo->y);\r\n\tdist = dx+dy;\n\tif (dx < dy)\n\t\tdist -=(dx>>1);\n\telse\r\n        dist -=(dy>>1);\r\n\r\n    delta = (target->z + (mo->height >> 1)) - mo->z;\t/* Get the height differance */\r\n\tdelta *= 3; /* Mul by 3 for a fudge factor */\r\n\r\n\tif (delta<0)\t\t                /* Delta is signed... */\r\n    {\r\n\t\tif (dist < (-delta))\t        /* Negate */\r\n        {\r\n\t\t\tmo->z -= FLOATSPEED;        /* Adjust the height */\r\n\t\t}\r\n\t}\r\n\telse if (delta>0)\t\t            /* Delta is signed... */\r\n    {\r\n        if (dist < delta)\t\t        /* Normal compare */\r\n        {\r\n            mo->z += FLOATSPEED;\t    /* Adjust the height */\r\n        }\r\n\t}\r\n}\r\n\r\n/*\r\n===================\r\n=\r\n= P_ZMovement\r\n=\r\n= Move a critter in the Z axis\r\n=\r\n===================\r\n*/\r\n\r\nvoid P_ZMovement(mobj_t *mo)//L80013BD4()\r\n{\r\n\r\n\tmo->z += mo->momz;\t\t/* Basic z motion */\r\n\r\n\tif ((mo->flags & MF_FLOAT) && mo->target)   /* float down towards target if too close */\r\n    {\r\n\t\tP_FloatChange(mo);\r\n\t}\r\n\r\n\t//\r\n\t// clip movement\r\n\t//\r\n\tif (mo->z <= mo->floorz)\t// hit the floor\r\n\t{\r\n\t\tif (mo->momz < 0)\r\n\t\t\tmo->momz = 0;\r\n\r\n\t\tmo->z = mo->floorz;\r\n\t\tif (mo->flags & MF_MISSILE)\r\n\t\t{\r\n\t\t\tmo->latecall = P_ExplodeMissile;\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\telse if (!(mo->flags & MF_NOGRAVITY))\r\n\t{\r\n\t\t// apply gravity\r\n\t\tif (mo->momz == 0)\r\n\t\t\tmo->momz = -GRAVITY;\r\n\t\telse\r\n\t\t\tmo->momz -= (GRAVITY/2);\r\n\t}\r\n\r\n\tif (mo->z + mo->height > mo->ceilingz) // hit the ceiling\r\n\t{\r\n\t\tif (mo->momz > 0)\r\n\t\t\tmo->momz = 0;\r\n\r\n\t\tmo->z = mo->ceilingz - mo->height;\r\n\t\tif (mo->flags & MF_MISSILE)\r\n\t\t\tmo->latecall = P_ExplodeMissile;\r\n\t}\r\n}\r\n\r\n/*\r\n===================\r\n=\r\n= P_MobjThinker\r\n=\r\n= Process all the critter logic\r\n=\r\n===================\r\n*/\r\n\r\nvoid P_MobjThinker(mobj_t *mobj)//L80013DB4()\r\n{\r\n\tstate_t *st;\r\n\tstatenum_t state;\r\n\r\n\t// momentum movement\r\n\tif (mobj->momx || mobj->momy)\r\n    {\r\n\t\tP_XYMovement(mobj);\r\n\r\n        // removed or has a special action to perform?\r\n        if (mobj->latecall)\r\n            return;\r\n    }\r\n\r\n\tif (mobj->z != mobj->floorz || mobj->momz)\r\n    {\r\n\t\tP_ZMovement(mobj);\r\n\r\n        // removed or has a special action to perform?\r\n        if (mobj->latecall)\r\n            return;\r\n    }\r\n\r\n\t// cycle through states\r\n\tif (mobj->tics != -1)\r\n\t{\r\n\t\tmobj->tics--;\r\n\r\n\t\t// you can cycle through multiple states in a tic\r\n        if (mobj->tics <= 0)\r\n\t\t{\r\n\t\t\tstate = mobj->state->nextstate;\r\n\t\t\tif (state == S_NULL)\r\n\t\t\t{\r\n\t\t\t\tmobj->latecall = P_RemoveMobj;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tst = &states[state];\r\n\t\t\t\tmobj->state = st;\r\n\t\t\t\tmobj->tics = st->tics;\r\n\t\t\t\tmobj->sprite = st->sprite;\r\n\t\t\t\tmobj->frame = st->frame;\r\n\t\t\t\tmobj->latecall = st->action;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/*\r\n===================\r\n=\r\n= PB_TryMove\r\n=\r\n= Attempt to move to a new position\r\n=\r\n===================\r\n*/\r\n\r\nboolean PB_TryMove(int tryx, int tryy)//L80013ED4()\r\n{\r\n\ttestx = tryx;\r\n\ttesty = tryy;\r\n\r\n\tif (!PB_CheckPosition())\r\n\t\treturn false;\t\t// solid wall or thing\r\n\r\n\tif (testceilingz - testfloorz < checkthing->height)\r\n\t\treturn false;\t\t\t// doesn't fit\r\n\tif (testceilingz - checkthing->z < checkthing->height)\r\n\t\treturn false;\t\t\t// mobj must lower itself to fit\r\n\tif (testfloorz - checkthing->z > 24 * FRACUNIT)\r\n\t\treturn false;\t\t\t// too big a step up\r\n\tif (!(testflags&(MF_DROPOFF | MF_FLOAT)) && testfloorz - testdropoffz > 24 * FRACUNIT)\r\n\t\treturn false;\t\t\t// don't stand over a dropoff\r\n\r\n\t//\r\n\t// the move is ok, so link the thing into its new position\r\n\t//\r\n\r\n\tPB_UnsetThingPosition(checkthing);\r\n\tcheckthing->floorz = testfloorz;\r\n\tcheckthing->ceilingz = testceilingz;\r\n\tcheckthing->x = tryx;\r\n\tcheckthing->y = tryy;\r\n\tPB_SetThingPosition(checkthing);\r\n\treturn true;\r\n}\r\n\r\n/*\r\n===================\r\n=\r\n= PB_UnsetThingPosition\r\n=\r\n===================\r\n*/\r\n\r\nvoid PB_UnsetThingPosition(mobj_t *thing)//L80013FB4()\r\n{\r\n\tint blockx, blocky;\r\n\r\n\t// inert things don't need to be in blockmap\r\n\t// unlink from subsector\r\n\tif (thing->snext)\r\n\t\tthing->snext->sprev = thing->sprev;\r\n\tif (thing->sprev)\r\n\t\tthing->sprev->snext = thing->snext;\r\n\telse\r\n\t\tthing->subsector->sector->thinglist = thing->snext;\r\n\r\n\tif (!(testflags & MF_NOBLOCKMAP))\r\n\t{\r\n\t\t// inert things don't need to be in blockmap\r\n\t\t// unlink from block map\r\n\t\tif (thing->bnext)\r\n\t\t\tthing->bnext->bprev = thing->bprev;\r\n\t\tif (thing->bprev)\r\n\t\t\tthing->bprev->bnext = thing->bnext;\r\n\t\telse\r\n\t\t{\r\n\t\t\tblockx = (thing->x - bmaporgx) >> MAPBLOCKSHIFT;\r\n\t\t\tblocky = (thing->y - bmaporgy) >> MAPBLOCKSHIFT;\r\n\r\n\t\t\t// Prevent buffer overflow if the map object is out of bounds.\r\n            // This is part of the fix for the famous 'linedef deletion' bug.\r\n            // From StationDoom by BodbDearg\r\n\t\t\t#if FIX_LINEDEFS_DELETION\r\n            if (blockx>=0 && blockx < bmapwidth\r\n             && blocky>=0 && blocky <bmapheight)\r\n            {\r\n                blocklinks[blocky*bmapwidth+blockx] = thing->bnext;\r\n            }\r\n            #else\r\n                blocklinks[blocky*bmapwidth+blockx] = thing->bnext;\r\n\t\t\t#endif\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/*\r\n===================\r\n=\r\n= PB_SetThingPosition\r\n=\r\n===================\r\n*/\r\n\r\nvoid PB_SetThingPosition(mobj_t *thing)//L800140B0()\r\n{\r\n\tsector_t     *sec;\r\n\tint           blockx, blocky;\r\n\tmobj_t      **link;\r\n\r\n\t//\r\n\t// link into subsector\r\n\t//\r\n\r\n\tthing->subsector = testsubsec;\r\n\tsec = thing->subsector->sector;\r\n\r\n\tthing->sprev = NULL;\r\n\tthing->snext = sec->thinglist;\r\n\r\n\tif (sec->thinglist)\r\n\t\tsec->thinglist->sprev = thing;\r\n\r\n\tsec->thinglist = thing;\r\n\r\n\t//\r\n\t// link into blockmap\r\n\t//\r\n\tif (!(testflags & MF_NOBLOCKMAP))\r\n\t{\r\n\t\t// inert things don't need to be in blockmap\r\n\t\tblockx = (thing->x - bmaporgx) >> MAPBLOCKSHIFT;\r\n\t\tblocky = (thing->y - bmaporgy) >> MAPBLOCKSHIFT;\r\n\t\tif (blockx >= 0 && blockx < bmapwidth && blocky >= 0 && blocky < bmapheight)\r\n\t\t{\r\n\t\t\tlink = &blocklinks[blocky*bmapwidth + blockx];\r\n\t\t\tthing->bprev = NULL;\r\n\t\t\tthing->bnext = *link;\r\n\t\t\tif (*link)\r\n\t\t\t\t(*link)->bprev = thing;\r\n\t\t\t*link = thing;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t// thing is off the map\r\n\t\t\tthing->bnext = thing->bprev = NULL;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= PB_CheckPosition\r\n=\r\n= This is purely informative, nothing is modified (except things picked up)\r\n\r\nin:\r\nbasething\t\ta mobj_t\r\ntestx,testy\t\ta position to be checked (doesn't need relate to the mobj_t->x,y)\r\n\r\nout:\r\n\r\ntestsubsec\r\nfloorz\r\nceilingz\r\ntestdropoffz\t\tthe lowest point contacted (monsters won't move to a dropoff)\r\nhitthing\r\n\r\n==================\r\n*/\r\n\r\nboolean PB_CheckPosition(void)//L800141B0()\r\n{\r\n\tint\t\t\txl, xh, yl, yh, bx, by;\r\n\tfixed_t\t\tr;\r\n\r\n\ttestflags = checkthing->flags;\r\n\r\n\tr = checkthing->radius;\r\n\r\n\ttestbbox[BOXTOP   ] = testy + r;\r\n\ttestbbox[BOXBOTTOM] = testy - r;\r\n\ttestbbox[BOXRIGHT ] = testx + r;\r\n\ttestbbox[BOXLEFT  ] = testx - r;\r\n\r\n\t//\r\n\t// the base floor / ceiling is from the subsector that contains the\r\n\t// point.  Any contacted lines the step closer together will adjust them\r\n\t//\r\n\ttestsubsec = R_PointInSubsector(testx, testy);\r\n\ttestfloorz = testdropoffz = testsubsec->sector->floorheight;\r\n\ttestceilingz = testsubsec->sector->ceilingheight;\r\n\r\n\t++validcount;\r\n\r\n\tceilingline = NULL;\r\n\thitthing = NULL;\r\n\r\n\t//\r\n\t// the bounding box is extended by MAXRADIUS because mobj_ts are grouped\r\n\t// into mapblocks based on their origin point, and can overlap into adjacent\r\n\t// blocks by up to MAXRADIUS units\r\n\t//\r\n\txl = (testbbox[BOXLEFT] - bmaporgx - MAXRADIUS) >> MAPBLOCKSHIFT;\r\n\txh = (testbbox[BOXRIGHT] - bmaporgx + MAXRADIUS) >> MAPBLOCKSHIFT;\r\n\tyl = (testbbox[BOXBOTTOM] - bmaporgy - MAXRADIUS) >> MAPBLOCKSHIFT;\r\n\tyh = (testbbox[BOXTOP] - bmaporgy + MAXRADIUS) >> MAPBLOCKSHIFT;\r\n\r\n\tif (xl<0)\r\n\t{\r\n\t\txl = 0;\r\n\t}\r\n\tif (yl<0)\r\n\t{\r\n\t\tyl = 0;\r\n\t}\r\n\tif (xh >= bmapwidth)\r\n\t{\r\n\t\txh = bmapwidth - 1;\r\n\t}\r\n\tif (yh >= bmapheight)\r\n\t{\r\n\t\tyh = bmapheight - 1;\r\n\t}\r\n\r\n\tfor (bx = xl; bx <= xh; bx++)\r\n\t{\r\n\t\tfor (by = yl; by <= yh; by++)\r\n        {\r\n\t\t\tif (!PB_BlockLinesIterator(bx, by))\r\n\t\t\t\treturn false;\r\n\t\t\tif (!PB_BlockThingsIterator(bx, by))\r\n\t\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\treturn true;\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= PB_BoxCrossLine\r\n=\r\n=================\r\n*/\r\n\r\n//inline\r\nboolean PB_BoxCrossLine(line_t *ld)//L80014394()\r\n{\r\n\tfixed_t x1, x2;\r\n\tfixed_t lx, ly;\r\n\tfixed_t ldx, ldy;\r\n\tfixed_t dx1, dy1;\r\n\tfixed_t dx2, dy2;\r\n\tboolean side1, side2;\r\n\r\n    // entirely outside bounding box of line?\r\n    if(testbbox[BOXRIGHT ] <= ld->bbox[BOXLEFT  ] ||\r\n       testbbox[BOXLEFT  ] >= ld->bbox[BOXRIGHT ] ||\r\n       testbbox[BOXTOP   ] <= ld->bbox[BOXBOTTOM] ||\r\n       testbbox[BOXBOTTOM] >= ld->bbox[BOXTOP   ])\r\n    {\r\n        return false;\r\n    }\r\n\r\n\tif (ld->slopetype == ST_POSITIVE)\r\n    {\r\n\t\tx1 = testbbox[BOXLEFT];\r\n\t\tx2 = testbbox[BOXRIGHT];\r\n\t}\r\n\telse\r\n\t{\r\n\t\tx1 = testbbox[BOXRIGHT];\r\n\t\tx2 = testbbox[BOXLEFT];\r\n\t}\r\n\r\n\tlx = ld->v1->x;\r\n\tly = ld->v1->y;\r\n\tldx = ld->dx >> FRACBITS;   //ldx = (ld->v2.x - ld->v1.x) >> FRACBITS;\r\n\tldy = ld->dy >> FRACBITS;   //ldy = (ld->v2.y - ld->v1.y) >> FRACBITS;\r\n\r\n\tdx1 = (x1 - lx) >> 16;\r\n\tdy1 = (testbbox[BOXTOP] - ly) >> FRACBITS;\r\n\tdx2 = (x2 - lx) >> 16;\r\n\tdy2 = (testbbox[BOXBOTTOM] - ly) >> FRACBITS;\r\n\r\n\tside1 = ldy*dx1 < dy1*ldx;\r\n\tside2 = ldy*dx2 < dy2*ldx;\r\n\r\n\treturn (side1 != side2);\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= PB_CheckLine\r\n=\r\n= Adjusts testfloorz and testceilingz as lines are contacted\r\n==================\r\n*/\r\n\r\n//inline\r\nboolean PB_CheckLine(line_t *ld)//L800144AC()\r\n{\r\n\tfixed_t opentop, openbottom;\r\n\tfixed_t lowfloor;\r\n\tsector_t\t*front, *back;\r\n\r\n\t/*\r\n\t=\r\n\t= The moving thing's destination position will cross the given line.\r\n\t= If this should not be allowed, return FALSE.\r\n\t*/\r\n\tif (!ld->backsector)\r\n\t\treturn false;\t\t// one sided line\r\n\r\n\tif (!(testflags & MF_MISSILE) && (ld->flags & (ML_BLOCKING | ML_BLOCKMONSTERS)))\r\n\t\treturn false;\t\t// explicitly blocking\r\n\r\n\tif ((ld->flags & ML_BLOCKPRJECTILE)) //psx doom new\r\n\t\treturn false;\r\n\r\n\tfront = ld->frontsector;\r\n\tback = ld->backsector;\r\n\r\n\tif (front->ceilingheight < back->ceilingheight)\r\n\t\topentop = front->ceilingheight;\r\n\telse\r\n\t\topentop = back->ceilingheight;\r\n\r\n\tif (front->floorheight > back->floorheight)\r\n\t{\r\n\t\topenbottom = front->floorheight;\r\n\t\tlowfloor = back->floorheight;\r\n\t}\r\n\telse\r\n\t{\r\n\t\topenbottom = back->floorheight;\r\n\t\tlowfloor = front->floorheight;\r\n\t}\r\n\r\n\t// adjust floor / ceiling heights\r\n\tif (opentop < testceilingz)\r\n\t{\r\n\t\ttestceilingz = opentop;\r\n\t\tceilingline = ld;\r\n\t}\r\n\tif (openbottom > testfloorz)\r\n\t\ttestfloorz = openbottom;\r\n\tif (lowfloor < testdropoffz)\r\n\t\ttestdropoffz = lowfloor;\r\n\r\n\treturn true;\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= PB_CheckThing\r\n=\r\n==================\r\n*/\r\n\r\nboolean PB_CheckThing(mobj_t *thing)//L80014598()\r\n{\r\n\tfixed_t  blockdist;\r\n\tint      delta;\r\n\tmobj_t  *mo;\r\n\r\n\tif (!(thing->flags & MF_SOLID))\r\n\t\treturn true; // not blocking\r\n\r\n\tmo = checkthing;\r\n\r\n\tblockdist = thing->radius + mo->radius;\r\n\r\n\tdelta = thing->x - testx;\r\n\tif (delta < 0)\r\n\t\tdelta = -delta;\r\n\r\n\tif (delta >= blockdist)\r\n\t\treturn true; // didn't hit it\r\n\r\n\tdelta = thing->y - testy;\r\n\tif (delta < 0)\r\n\t\tdelta = -delta;\r\n\r\n\tif (delta >= blockdist)\r\n\t\treturn true; // didn't hit it\r\n\r\n\tif (thing == mo)\r\n\t\treturn true; // don't clip against self\r\n\r\n\t//\r\n\t// check for skulls slamming into things\r\n\t//\r\n\tif (testflags & MF_SKULLFLY)\r\n\t{\r\n\t\thitthing = thing;\r\n\t\treturn false;\t\t// stop moving\r\n\t}\r\n\r\n\t//\r\n\t// missiles can hit other things\r\n\t//\r\n\tif (testflags & MF_MISSILE)\r\n    {\r\n\t\t// see if it went over / under\r\n\t\tif (mo->z > thing->z + thing->height)\r\n\t\t\treturn true;\t\t// overhead\r\n\r\n\t\tif (mo->z + mo->height < thing->z)\r\n\t\t\treturn true;\t\t// underneath\r\n\r\n\t\tif (mo->target->type == thing->type)\t// don't hit same species as originator\r\n        {\r\n\t\t\tif (thing == mo->target)\r\n\t\t\t\treturn true;\t// don't explode on shooter\r\n\r\n\t\t\tif (thing->type != MT_PLAYER)\r\n\t\t\t\treturn false;\t// explode, but do no damage\r\n\t\t\t\t\t\t\t\t// let players missile other players\r\n\t\t}\r\n\t\tif (!(thing->flags & MF_SHOOTABLE))\r\n\t\t\treturn !(thing->flags & MF_SOLID);\t\t// didn't do any damage\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t// damage / explode\r\n\t\thitthing = thing;\r\n\t\treturn false;\t\t\t// don't traverse any more\r\n\t}\r\n\r\n\treturn !(thing->flags & MF_SOLID);\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= PB_BlockLinesIterator\r\n=\r\n==================\r\n*/\r\n\r\nboolean PB_BlockLinesIterator(int x, int y) //L800146C4()\r\n{\r\n\tint     offset;\r\n\tshort  *list;\r\n\tline_t *ld;\r\n\r\n\toffset = y*bmapwidth+x;\r\n\r\n\toffset = *(blockmap + offset);\r\n\r\n\tfor (list = blockmaplump + offset; *list != -1; list++)\r\n\t{\r\n\t\tld = &lines[*list];\r\n\t\tif (ld->validcount == validcount)\r\n\t\t\tcontinue; // line has already been checked\r\n\t\tld->validcount = validcount;\r\n\r\n\t\tif (PB_BoxCrossLine(ld))\r\n\t\t{\r\n\t\t\tif (!PB_CheckLine(ld))\r\n\t\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\treturn true; // everything was checked\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= PB_BlockThingsIterator\r\n=\r\n==================\r\n*/\r\n\r\nboolean PB_BlockThingsIterator(int x, int y)//L8001498C()\r\n{\r\n\tmobj_t *mobj;\r\n\r\n\tfor (mobj = blocklinks[y*bmapwidth+x]; mobj; mobj = mobj->bnext)\r\n\t{\r\n\t\tif (!PB_CheckThing(mobj))\r\n\t\t\treturn false;\r\n\t}\r\n\r\n\treturn true;\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/p_ceilng.c",
    "content": "#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n\r\n/*================================================================== */\r\n/*================================================================== */\r\n/* */\r\n/*\t\t\t\t\t\t\tCEILINGS */\r\n/* */\r\n/*================================================================== */\r\n/*================================================================== */\r\n\r\nceiling_t\t*activeceilings[MAXCEILINGS];//800A9AFC\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tT_MoveCeiling */\r\n/* */\r\n/*================================================================== */\r\nvoid T_MoveCeiling (ceiling_t *ceiling)//L80014A04()\r\n{\r\n\tresult_e\tres;\r\n\r\n\tswitch(ceiling->direction)\r\n\t{\r\n\t\tcase 0:\t\t/* IN STASIS */\r\n\t\t\tbreak;\r\n\t\tcase 1:\t\t/* UP */\r\n\t\t\tres = T_MovePlane(ceiling->sector,ceiling->speed,\r\n\t\t\t\t\tceiling->topheight,false,1,ceiling->direction);\r\n\t\t\tif (!(gametic & 7))\r\n\t\t\t{\r\n\t\t\t\tswitch (ceiling->type)\r\n\t\t\t\t{\r\n\t\t\t\tcase silentCrushAndRaise:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tS_StartSound((mobj_t *)&ceiling->sector->soundorg, sfx_stnmov);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (res == pastdest)\r\n            {\r\n\t\t\t\tswitch(ceiling->type)\r\n\t\t\t\t{\r\n\t\t\t\t\tcase raiseToHighest:\r\n\t\t\t\t\t\tP_RemoveActiveCeiling(ceiling);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase silentCrushAndRaise:\r\n\t\t\t\t\t\tS_StartSound((mobj_t *)&ceiling->sector->soundorg, sfx_pstop);\r\n\t\t\t\t\tcase fastCrushAndRaise:\r\n\t\t\t\t\tcase crushAndRaise:\r\n\t\t\t\t\t\tceiling->direction = -1;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n            }\r\n\t\t\tbreak;\r\n\t\tcase -1:\t/* DOWN */\r\n\t\t\tres = T_MovePlane(ceiling->sector,ceiling->speed,\r\n\t\t\t\tceiling->bottomheight,ceiling->crush,1,ceiling->direction);\r\n\t\t\tif (!(gametic & 7))\r\n\t\t\t{\r\n\t\t\t\tswitch (ceiling->type)\r\n\t\t\t\t{\r\n\t\t\t\tcase silentCrushAndRaise:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tS_StartSound((mobj_t *)&ceiling->sector->soundorg, sfx_stnmov);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (res == pastdest)\r\n            {\r\n\t\t\t\tswitch(ceiling->type)\r\n\t\t\t\t{\r\n\t\t\t\t\tcase silentCrushAndRaise:\r\n\t\t\t\t\t\tS_StartSound((mobj_t *)&ceiling->sector->soundorg, sfx_pstop);\r\n\t\t\t\t\tcase crushAndRaise:\r\n\t\t\t\t\t\tceiling->speed = CEILSPEED;\r\n\t\t\t\t\tcase fastCrushAndRaise:\r\n\t\t\t\t\t\tceiling->direction = 1;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase lowerAndCrush:\r\n\t\t\t\t\tcase lowerToFloor:\r\n\t\t\t\t\t\tP_RemoveActiveCeiling(ceiling);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n            }\r\n\t\t\telse if (res == crushed)\r\n            {\r\n\t\t\t\tswitch(ceiling->type)\r\n\t\t\t\t{\r\n\t\t\t\t\tcase silentCrushAndRaise:\r\n\t\t\t\t\tcase crushAndRaise:\r\n\t\t\t\t\tcase lowerAndCrush:\r\n\t\t\t\t\t\tceiling->speed = CEILSPEED / 8;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n            }\r\n\t\t\tbreak;\r\n\t}\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\t\tEV_DoCeiling */\r\n/*\t\tMove a ceiling up/down and all around! */\r\n/* */\r\n/*================================================================== */\r\nint EV_DoCeiling (line_t *line, ceiling_e  type)//L80014C18()\r\n{\r\n\tint\t\t\tsecnum,rtn;\r\n\tsector_t\t\t*sec;\r\n\tceiling_t\t\t*ceiling;\r\n\r\n\tsecnum = -1;\r\n\trtn = 0;\r\n\r\n\t/* */\r\n\t/*\tReactivate in-stasis ceilings...for certain types. */\r\n\t/* */\r\n\tswitch(type)\r\n\t{\r\n\t\tcase fastCrushAndRaise:\r\n\t\tcase silentCrushAndRaise:\r\n\t\tcase crushAndRaise:\r\n\t\t\tP_ActivateInStasisCeiling(line);\r\n\t\tdefault:\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\twhile ((secnum = P_FindSectorFromLineTag(line,secnum)) >= 0)\r\n\t{\r\n\t\tsec = &sectors[secnum];\r\n\t\tif (sec->specialdata)\r\n\t\t\tcontinue;\r\n\r\n\t\t/* */\r\n\t\t/* new door thinker */\r\n\t\t/* */\r\n\t\trtn = 1;\r\n\t\tceiling = Z_Malloc (sizeof(*ceiling), PU_LEVSPEC, 0);\r\n\t\tP_AddThinker (&ceiling->thinker);\r\n\t\tsec->specialdata = ceiling;\r\n\t\tceiling->thinker.function = T_MoveCeiling;\r\n\t\tceiling->sector = sec;\r\n\t\tceiling->crush = false;\r\n\t\tswitch(type)\r\n\t\t{\r\n\t\t\tcase fastCrushAndRaise:\r\n\t\t\t\tceiling->crush = true;\r\n\t\t\t\tceiling->topheight = sec->ceilingheight;\r\n\t\t\t\tceiling->bottomheight = sec->floorheight + (8*FRACUNIT);\r\n\t\t\t\tceiling->direction = -1;\r\n\t\t\t\tceiling->speed = CEILSPEED * 2;\r\n\t\t\t\tbreak;\r\n\t\t\tcase silentCrushAndRaise:\r\n\t\t\tcase crushAndRaise:\r\n\t\t\t\tceiling->crush = true;\r\n\t\t\t\tceiling->topheight = sec->ceilingheight;\r\n\t\t\tcase lowerAndCrush:\r\n\t\t\tcase lowerToFloor:\r\n\t\t\t\tceiling->bottomheight = sec->floorheight;\r\n\t\t\t\tif (type != lowerToFloor)\r\n                    ceiling->bottomheight += 8*FRACUNIT;\r\n\t\t\t\tceiling->direction = -1;\r\n\t\t\t\tceiling->speed = CEILSPEED;\r\n\t\t\t\tbreak;\r\n\t\t\tcase raiseToHighest:\r\n\t\t\t\tceiling->topheight = P_FindHighestCeilingSurrounding(sec);\r\n\t\t\t\tceiling->direction = 1;\r\n\t\t\t\tceiling->speed = CEILSPEED;\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tceiling->tag = sec->tag;\r\n\t\tceiling->type = type;\r\n\t\tP_AddActiveCeiling(ceiling);\r\n\t}\r\n\treturn rtn;\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\t\tAdd an active ceiling */\r\n/* */\r\n/*================================================================== */\r\nvoid P_AddActiveCeiling(ceiling_t *c)//L80014DEC()\r\n{\r\n\tint\t\ti;\r\n\tfor (i = 0; i < MAXCEILINGS;i++)\r\n    {\r\n\t\tif (activeceilings[i] == NULL)\r\n\t\t{\r\n\t\t\tactiveceilings[i] = c;\r\n\t\t\treturn;\r\n\t\t}\r\n    }\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\t\tRemove a ceiling's thinker */\r\n/* */\r\n/*================================================================== */\r\nvoid P_RemoveActiveCeiling(ceiling_t *c)//L80014E28()\r\n{\r\n\tint\t\ti;\r\n\r\n\tfor (i = 0;i < MAXCEILINGS;i++)\r\n    {\r\n\t\tif (activeceilings[i] == c)\r\n\t\t{\r\n\t\t\tactiveceilings[i]->sector->specialdata = NULL;\r\n\t\t\tP_RemoveThinker (&activeceilings[i]->thinker);\r\n\t\t\tactiveceilings[i] = NULL;\r\n\t\t\tbreak;\r\n\t\t}\r\n    }\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\t\tRestart a ceiling that's in-stasis */\r\n/* */\r\n/*================================================================== */\r\nvoid P_ActivateInStasisCeiling(line_t *line)//L80014E90()\r\n{\r\n\tint\ti;\r\n\r\n\tfor (i = 0;i < MAXCEILINGS;i++)\r\n    {\r\n\t\tif (activeceilings[i] && (activeceilings[i]->tag == line->tag) &&\r\n\t\t\t(activeceilings[i]->direction == 0))\r\n\t\t{\r\n\t\t\tactiveceilings[i]->direction = activeceilings[i]->olddirection;\r\n\t\t\tactiveceilings[i]->thinker.function = T_MoveCeiling;\r\n\t\t}\r\n    }\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\t\tEV_CeilingCrushStop */\r\n/*\t\tStop a ceiling from crushing! */\r\n/* */\r\n/*================================================================== */\r\nint\tEV_CeilingCrushStop(line_t\t*line)//L80014F04()\r\n{\r\n\tint\t\ti;\r\n\tint\t\trtn;\r\n\r\n\trtn = 0;\r\n\tfor (i = 0;i < MAXCEILINGS;i++)\r\n    {\r\n\t\tif (activeceilings[i] && (activeceilings[i]->tag == line->tag) &&\r\n\t\t\t(activeceilings[i]->direction != 0))\r\n\t\t{\r\n\t\t\tactiveceilings[i]->olddirection = activeceilings[i]->direction;\r\n\t\t\tactiveceilings[i]->thinker.function = NULL;\r\n\t\t\tactiveceilings[i]->direction = 0;\t\t/* in-stasis */\r\n\t\t\trtn = 1;\r\n\t\t}\r\n    }\r\n\r\n\treturn rtn;\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/p_change.c",
    "content": "/* p_change.c */\r\n\r\n#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n#include \"st_main.h\"\r\n\r\n//completo y revisado\r\n\r\n/*\r\n==============================================================================\r\n\r\n\t\t\t\t\t\tSECTOR HEIGHT CHANGING\r\n\r\n= After modifying a sectors floor or ceiling height, call this\r\n= routine to adjust the positions of all things that touch the\r\n= sector.\r\n=\r\n= If anything doesn't fit anymore, true will be returned.\r\n= If crunch is true, they will take damage as they are being crushed\r\n= If Crunch is false, you should set the sector height back the way it\r\n= was and call P_ChangeSector again to undo the changes\r\n==============================================================================\r\n*/\r\n\r\nboolean\t\tcrushchange;//iGp000009bc\r\nboolean\t\tnofit;      //uGp000008d8\r\n\r\n/*\r\n==================\r\n=\r\n= P_ThingHeightClip\r\n=\r\n= Takes a valid thing and adjusts the thing->floorz, thing->ceilingz,\r\n= anf possibly thing->z\r\n=\r\n= This is called for all nearby monsters whenever a sector changes height\r\n=\r\n= If the thing doesn't fit, the z will be set to the lowest value and\r\n= false will be returned\r\n==================\r\n*/\r\n//inline\r\nboolean P_ThingHeightClip (mobj_t *thing)//L80014F78()\r\n{\r\n\tboolean\t\tonfloor;\r\n\r\n\tonfloor = (thing->z == thing->floorz);\r\n\r\n\tP_CheckPosition (thing, thing->x, thing->y);\r\n\t/* what about stranding a monster partially off an edge? */\r\n\r\n\tthing->floorz = tmfloorz;\r\n\tthing->ceilingz = tmceilingz;\r\n\r\n\tif (onfloor)\r\n\t/* walking monsters rise and fall with the floor */\r\n\t\tthing->z = thing->floorz;\r\n\telse\r\n\t{\t/* don't adjust a floating monster unless forced to */\r\n\t\tif (thing->z+thing->height > thing->ceilingz)\r\n\t\t\tthing->z = thing->ceilingz - thing->height;\r\n\t}\r\n\r\n\tif (thing->ceilingz - thing->floorz < thing->height)\r\n\t\treturn false;\r\n\r\n\treturn true;\r\n}\r\n\r\n\r\n/*\r\n===============\r\n=\r\n= PIT_ChangeSector\r\n=\r\n===============\r\n*/\r\n\r\nboolean PIT_ChangeSector (mobj_t *thing)//L80015020()\r\n{\r\n\tmobj_t\t\t*mo;\r\n\r\n\tif (P_ThingHeightClip (thing))\r\n\t\treturn true;\t\t/* keep checking */\r\n\r\n\t/* crunch bodies to giblets */\r\n\tif (thing->health <= 0)\r\n\t{\r\n\t\tP_SetMobjState (thing, S_GIBS);\r\n\t\tS_StartSound(thing,sfx_slop);\r\n\t\tthing->height = 0;\r\n\t\tthing->radius = 0;\r\n\r\n\t\tif (thing->player == &players[consoleplayer])\r\n\t\t\tstbar.gotgibbed = true;\r\n\r\n\t\treturn true;\t\t/* keep checking */\r\n\t}\r\n\r\n\t/* crunch dropped items */\r\n\tif (thing->flags & MF_DROPPED)\r\n\t{\r\n\t\tP_RemoveMobj (thing);\r\n\t\treturn true;\t\t/* keep checking */\r\n\t}\r\n\r\n\tif (! (thing->flags & MF_SHOOTABLE) )\r\n\t\treturn true;\t\t\t\t/* assume it is bloody gibs or something */\r\n\r\n\tnofit = true;\r\n\tif (crushchange && !(gametic&3) )\r\n\t{\r\n\t\tP_DamageMobj(thing,NULL,NULL,10);\r\n\t\t/* spray blood in a random direction */\r\n\t\tmo = P_SpawnMobj (thing->x, thing->y, thing->z + thing->height/2, MT_BLOOD);\r\n\t\tmo->momx = (P_Random() - P_Random ())<<12;\r\n\t\tmo->momy = (P_Random() - P_Random ())<<12;\r\n\t}\r\n\r\n\treturn true;\t\t/* keep checking (crush other things)\t */\r\n}\r\n\r\n/*\r\n===============\r\n=\r\n= P_ChangeSector\r\n=\r\n===============\r\n*/\r\n\r\nboolean P_ChangeSector (sector_t *sector, boolean crunch)//L8001520C()\r\n{\r\n\tint x,y;\r\n\tint i;\r\n\r\n\t/* force next sound to reflood */\r\n\t//for (i=0 ; i<MAXPLAYERS ; i++)\r\n\tfor (i=(MAXPLAYERS-1) ; i >= 0 ; i--)\r\n\t\tplayers[i].lastsoundsector = NULL;\r\n\r\n\tnofit = false;\r\n\tcrushchange = crunch;\r\n\r\n\t/* recheck heights for all things near the moving sector */\r\n\tfor (x = sector->blockbox[BOXLEFT]; x <= sector->blockbox[BOXRIGHT]; x++)\r\n\t{\r\n\t\tfor (y = sector->blockbox[BOXBOTTOM]; y <= sector->blockbox[BOXTOP]; y++)\r\n        {\r\n\t\t\tP_BlockThingsIterator(x, y, PIT_ChangeSector);\r\n        }\r\n\t}\r\n\r\n\treturn nofit;\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "PSXDOOM/p_doors.c",
    "content": "#include \"doomdef.h\"\n#include \"p_local.h\"\n#include \"st_main.h\"\n\n/*================================================================== */\n/*================================================================== */\n/* */\n/*\t\t\t\t\t\t\tVERTICAL DOORS */\n/* */\n/*================================================================== */\n/*================================================================== */\n\n/*================================================================== */\n/* */\n/*\tT_VerticalDoor */\n/* */\n/*================================================================== */\nvoid T_VerticalDoor (vldoor_t *door)//L800152D0()\n{\n\tresult_e\tres;\n\n\tswitch(door->direction)\n\t{\n\t\tcase 0:\t\t/* WAITING */\n\t\t\tif (!--door->topcountdown)\r\n            {\n\t\t\t\tswitch(door->type)\n\t\t\t\t{\n\t\t\t\t\tcase BlazeRaise:\r\n\t\t\t\t\t\tdoor->direction = -1; /* time to go back down */\r\n\t\t\t\t\t\tS_StartSound((mobj_t *)&door->sector->soundorg, sfx_bdcls);\r\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase Normal:\n\t\t\t\t\t\tdoor->direction = -1; /* time to go back down */\n\t\t\t\t\t\tS_StartSound((mobj_t *)&door->sector->soundorg,sfx_dorcls);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase Close30ThenOpen:\n\t\t\t\t\t\tdoor->direction = 1;\n\t\t\t\t\t\tS_StartSound((mobj_t *)&door->sector->soundorg,sfx_doropn);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\r\n            }\n\t\t\tbreak;\n\t\tcase 2:\t\t/*  INITIAL WAIT */\n\t\t\tif (!--door->topcountdown)\r\n            {\n\t\t\t\tswitch(door->type)\n\t\t\t\t{\n\t\t\t\t\tcase RaiseIn5Mins:\n\t\t\t\t\t\tdoor->direction = 1;\n\t\t\t\t\t\tdoor->type = Normal;\n\t\t\t\t\t\tS_StartSound((mobj_t *)&door->sector->soundorg,sfx_doropn);\n\t\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\r\n            }\n\t\t\tbreak;\n\t\tcase -1:\t/* DOWN */\n\t\t\tres = T_MovePlane(door->sector,door->speed,\n\t\t\t\tdoor->sector->floorheight,false,1,door->direction);\n\t\t\tif (res == pastdest)\r\n            {\n\t\t\t\tswitch(door->type)\n\t\t\t\t{\n\t\t\t\t\tcase BlazeRaise:\r\n\t\t\t\t\tcase BlazeClose:\r\n\t\t\t\t\t\tdoor->sector->specialdata = NULL;\r\n\t\t\t\t\t\tP_RemoveThinker(&door->thinker);  /* unlink and free */\r\n\t\t\t\t\t\tS_StartSound((mobj_t *)&door->sector->soundorg, sfx_bdcls);\r\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase Normal:\n\t\t\t\t\tcase Close:\n\t\t\t\t\t\tdoor->sector->specialdata = NULL;\n\t\t\t\t\t\tP_RemoveThinker (&door->thinker);  /* unlink and free */\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase Close30ThenOpen:\n\t\t\t\t\t\tdoor->direction = 0;\n\t\t\t\t\t\tdoor->topcountdown = TICRATE*30;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\r\n            }\n\t\t\telse if (res == crushed)\n\t\t\t{\n\t\t\t\tswitch (door->type)\r\n\t\t\t\t{\r\n\t\t\t\tcase BlazeClose:\r\n\t\t\t\tcase Close:\t\t/* DO NOT GO BACK UP! */\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tdoor->direction = 1;\r\n\t\t\t\t\tS_StartSound((mobj_t *)&door->sector->soundorg, sfx_doropn);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 1:\t\t/* UP */\n\t\t\tres = T_MovePlane(door->sector,door->speed,\n\t\t\t\tdoor->topheight,false,1,door->direction);\n\t\t\tif (res == pastdest)\r\n            {\n\t\t\t\tswitch(door->type)\n\t\t\t\t{\n\t\t\t\t\tcase BlazeRaise:\n\t\t\t\t\tcase Normal:\n\t\t\t\t\t\tdoor->direction = 0; /* wait at top */\n\t\t\t\t\t\tdoor->topcountdown = door->topwait;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase Close30ThenOpen:\n\t\t\t\t\tcase BlazeOpen:\n\t\t\t\t\tcase Open:\n\t\t\t\t\t\tdoor->sector->specialdata = NULL;\n\t\t\t\t\t\tP_RemoveThinker (&door->thinker);  /* unlink and free */\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\r\n            }\n\t\t\tbreak;\n\t}\n}\n\n/*================================================================== */\n/* */\n/*\t\tP_CheckKeyLock */\n/*\t\tExclusive Psx Doom */\n/*\t\tCheck for locks */\n/* */\n/*================================================================== */\n\nboolean P_CheckKeyLock(line_t *line, mobj_t *thing)//L80015514()\n{\n\tplayer_t *player;\r\n\r\n\tplayer = thing->player;\r\n\r\n\tif (!player)\r\n\t\treturn false;\r\n\r\n\tswitch (line->special)\r\n\t{\r\n\tcase 26:\t\t/* Blue Card Lock */\r\n\tcase 32:\r\n\tcase 99:\r\n\tcase 133:\r\n\t\tif (!player->cards[it_bluecard] && !player->cards[it_blueskull])\r\n\t\t{\r\n\t\t\tplayer->message = \"You need a blue key.\";\r\n\t\t\tS_StartSound(thing, sfx_oof);\r\n\t\t\tif (player == &players[consoleplayer])\r\n            {\r\n                #if GH_UPDATES ==  1\r\n                stbar.tryopen[MapBlueKeyType] = true;\r\n                #else\r\n                stbar.tryopen[it_bluecard] = true;\r\n                #endif // GH_UPDATES\r\n            }\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase 27:\t\t/* Yellow Card Lock */\r\n\tcase 34:\r\n\tcase 136:\r\n\tcase 137:\r\n\t\tif (!player->cards[it_yellowcard] && !player->cards[it_yellowskull])\r\n\t\t{\r\n\t\t\tplayer->message = \"You need a yellow key.\";\r\n\t\t\tS_StartSound(thing, sfx_oof);\r\n\t\t\tif (player == &players[consoleplayer])\r\n            {\r\n                #if GH_UPDATES ==  1\r\n                stbar.tryopen[MapYellowKeyType] = true;\r\n                #else\r\n                stbar.tryopen[it_yellowcard] = true;\r\n                #endif // GH_UPDATES\r\n            }\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase 28:\t\t/* Red Card Lock */\r\n\tcase 33:\r\n\tcase 134:\r\n\tcase 135:\r\n\t\tif (!player->cards[it_redcard] && !player->cards[it_redskull])\r\n\t\t{\r\n\t\t\tplayer->message = \"You need a red key.\";\r\n\t\t\tS_StartSound(thing, sfx_oof);\r\n\t\t\tif (player == &players[consoleplayer])\r\n            {\r\n                #if GH_UPDATES ==  1\r\n                stbar.tryopen[MapRedKeyType] = true;\r\n                #else\r\n                stbar.tryopen[it_redcard] = true;\r\n                #endif // GH_UPDATES\r\n            }\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tbreak;\r\n\t}\r\n\r\n\treturn true;\n}\n\n\n/*================================================================== */\n/* */\n/*\t\tEV_DoDoor */\n/*\t\tMove a door up/down and all around! */\n/* */\n/*================================================================== */\nint EV_DoDoor (line_t *line, vldoor_e  type)//L800156FC()\n{\n\tint\t\t\tsecnum,rtn;\n\tsector_t\t\t*sec;\n\tvldoor_t\t\t*door;\n\n\tsecnum = -1;\n\trtn = 0;\n\twhile ((secnum = P_FindSectorFromLineTag(line,secnum)) >= 0)\n\t{\n\t\tsec = &sectors[secnum];\n\t\tif (sec->specialdata)\n\t\t\tcontinue;\n\n\t\t/* */\n\t\t/* new door thinker */\n\t\t/* */\n\t\trtn = 1;\n\t\tdoor = Z_Malloc (sizeof(*door), PU_LEVSPEC, 0);\n\t\tP_AddThinker (&door->thinker);\n\t\tsec->specialdata = door;\n\t\tdoor->thinker.function = T_VerticalDoor;\n\t\tdoor->topwait = VDOORWAIT;\r\n\t\tdoor->speed = VDOORSPEED;\n\t\tdoor->sector = sec;\n\t\tdoor->type = type;\n\n\t\tswitch(type)\n\t\t{\n\t\t\tcase BlazeClose:\r\n\t\t\t\tdoor->topheight = P_FindLowestCeilingSurrounding(sec);\r\n\t\t\t\tdoor->topheight -= 4 * FRACUNIT;\r\n\t\t\t\tdoor->direction = -1;\r\n\t\t\t\tdoor->speed = VDOORSPEED * 4;\r\n\t\t\t\tS_StartSound((mobj_t *)&door->sector->soundorg, sfx_bdcls);\r\n\t\t\t\tbreak;\n\t\t\tcase Close:\n\t\t\t\tdoor->topheight = P_FindLowestCeilingSurrounding(sec);\n\t\t\t\tdoor->topheight -= 4*FRACUNIT;\n\t\t\t\tdoor->direction = -1;\n\t\t\t\tS_StartSound((mobj_t *)&door->sector->soundorg,sfx_dorcls);\n\t\t\t\tbreak;\n\t\t\tcase Close30ThenOpen:\n\t\t\t\tdoor->topheight = sec->ceilingheight;\n\t\t\t\tdoor->direction = -1;\n\t\t\t\tS_StartSound((mobj_t *)&door->sector->soundorg,sfx_dorcls);\n\t\t\t\tbreak;\n\t\t\tcase BlazeRaise:\r\n\t\t\tcase BlazeOpen:\r\n\t\t\t\tdoor->direction = 1;\r\n\t\t\t\tdoor->topheight = P_FindLowestCeilingSurrounding(sec);\r\n\t\t\t\tdoor->topheight -= 4 * FRACUNIT;\r\n\t\t\t\tdoor->speed = VDOORSPEED * 4;\r\n\t\t\t\tif (door->topheight != sec->ceilingheight)\r\n\t\t\t\t\tS_StartSound((mobj_t *)&door->sector->soundorg, sfx_bdopn);\r\n\t\t\t\tbreak;\n\t\t\tcase Normal:\n\t\t\tcase Open:\n\t\t\t\tdoor->direction = 1;\n\t\t\t\tdoor->topheight = P_FindLowestCeilingSurrounding(sec);\n\t\t\t\tdoor->topheight -= 4*FRACUNIT;\n\t\t\t\tif (door->topheight != sec->ceilingheight)\n\t\t\t\t\tS_StartSound((mobj_t *)&door->sector->soundorg,sfx_doropn);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn rtn;\n}\n\n\n/*================================================================== */\n/* */\n/*\tEV_VerticalDoor : open a door manually, no tag value */\n/* */\n/*================================================================== */\nvoid EV_VerticalDoor (line_t *line, mobj_t *thing)//L80015920()\n{\n\tplayer_t\t\t*player;\n\tint\t\t\t\tsecnum;\n\tsector_t\t\t*sec;\n\tvldoor_t\t\t*door;\n\tint\t\t\t\tside;\n\n\tside = 0;\t\t\t/* only front sides can be used */\n\n\t/* if the sector has an active thinker, use it */\n\tsec = sides[ line->sidenum[side^1]] .sector;\n\tsecnum = sec-sectors;\n\tif (sec->specialdata)\n\t{\n\t\tdoor = sec->specialdata;\n\t\tswitch(line->special)\n\t\t{\n\t\t\tcase 1:\t\t/* ONLY FOR \"RAISE\" DOORS, NOT \"OPEN\"s */\n\t\t\tcase 26:\n\t\t\tcase 27:\n\t\t\tcase 28:\n\t\t\tcase 117:\n\t\t\t\tif (door->direction == -1)\n\t\t\t\t\tdoor->direction = 1;\t/* go back up */\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (!thing->player)\n\t\t\t\t\t\treturn;\t\t\t\t/* JDC: bad guys never close doors */\n\t\t\t\t\tdoor->direction = -1;\t/* start going down immediately */\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\t/* for proper sound */\n\tswitch(line->special)\n\t{\n\t\tcase 1:\t\t/* NORMAL DOOR SOUND */\n\t\tcase 31:\n\t\t\tS_StartSound((mobj_t *)&sec->soundorg,sfx_doropn);\n\t\t\tbreak;\n\t\tcase 117:\t/* BLAZING DOOR RAISE */\r\n\t\tcase 118:\t/* BLAZING DOOR OPEN */\r\n\t\t\tS_StartSound((mobj_t *)&sec->soundorg, sfx_bdopn);\r\n\t\t\tbreak;\n\t\tdefault:\t/* LOCKED DOOR SOUND */\n\t\t\tS_StartSound((mobj_t *)&sec->soundorg,sfx_doropn);\n\t\t\tbreak;\n\t}\n\n\t/* */\n\t/* new door thinker */\n\t/* */\n\tdoor = Z_Malloc (sizeof(*door), PU_LEVSPEC, 0);\n\tP_AddThinker (&door->thinker);\n\tsec->specialdata = door;\n\tdoor->thinker.function = T_VerticalDoor;\n\tdoor->speed = VDOORSPEED;\n\tdoor->sector = sec;\n\tdoor->direction = 1;\n\tdoor->topwait = VDOORWAIT;\n\n\tswitch(line->special)\n\t{\n\t\tcase 1:\n\t\tcase 26:\n\t\tcase 27:\n\t\tcase 28:\n\t\t\tdoor->type = Normal;\n\t\t\tbreak;\n\t\tcase 31:\n\t\tcase 32:\n\t\tcase 33:\n\t\tcase 34:\n\t\t\tdoor->type = Open;\n\t\t\tline->special = 0;\n\t\t\tbreak;\n\t\tcase 117:\t/* blazing door raise */\r\n\t\t\tdoor->type = BlazeRaise;\r\n\t\t\tdoor->speed = VDOORSPEED * 4;\r\n\t\t\tbreak;\r\n\t\tcase 118:\t/* blazing door open */\r\n\t\t\tdoor->type = BlazeOpen;\r\n\t\t\tdoor->speed = VDOORSPEED * 4;\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\n\t}\n\n\t/* */\n\t/* find the top and bottom of the movement range */\n\t/* */\n\tdoor->topheight = P_FindLowestCeilingSurrounding(sec);\n\tdoor->topheight -= 4*FRACUNIT;\n}\n\n/*================================================================== */\n/* */\n/*\tSpawn a door that closes after 30 seconds */\n/* */\n/*================================================================== */\nvoid P_SpawnDoorCloseIn30 (sector_t *sec)//L80015B1C()\n{\n\tvldoor_t\t*door;\n\n\tdoor = Z_Malloc ( sizeof(*door), PU_LEVSPEC, 0);\n\tP_AddThinker (&door->thinker);\n\tsec->specialdata = door;\n\tsec->special = 0;\n\tdoor->thinker.function = T_VerticalDoor;\n\tdoor->sector = sec;\n\tdoor->direction = 0;\n\tdoor->type = Normal;\n\tdoor->speed = VDOORSPEED;\n\tdoor->topcountdown = 30 * TICRATE;\n}\n\n/*================================================================== */\n/* */\n/*\tSpawn a door that opens after 5 minutes */\n/* */\n/*================================================================== */\nvoid P_SpawnDoorRaiseIn5Mins (sector_t *sec, int secnum)//L80015B9C()\n{\n\tvldoor_t\t*door;\n\n\tdoor = Z_Malloc ( sizeof(*door), PU_LEVSPEC, 0);\n\tP_AddThinker (&door->thinker);\n\tsec->specialdata = door;\n\tsec->special = 0;\n\tdoor->thinker.function = T_VerticalDoor;\n\tdoor->sector = sec;\n\tdoor->direction = 2;\n\tdoor->type = RaiseIn5Mins;\n\tdoor->speed = VDOORSPEED;\n\tdoor->topheight = P_FindLowestCeilingSurrounding(sec);\n\tdoor->topheight -= 4*FRACUNIT;\n\tdoor->topwait = VDOORWAIT;\n\tdoor->topcountdown = 5 * 60 * TICRATE;\n}\n\n"
  },
  {
    "path": "PSXDOOM/p_enemy.c",
    "content": "/* P_enemy.c */\r\n\r\n#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n\r\nvoid A_Fall (mobj_t *actor);\r\n\r\n/*\r\n===============================================================================\r\n\r\n\t\t\t\t\t\t\tENEMY THINKING\r\n\r\nenemies are allways spawned with targetplayer = -1, threshold = 0\r\nMost monsters are spawned unaware of all players, but some can be made preaware\r\n\r\n===============================================================================\r\n*/\r\n\r\n/*\r\n================\r\n=\r\n= P_CheckMeleeRange\r\n=\r\n================\r\n*/\r\n//inline\r\nboolean P_CheckMeleeRange (mobj_t *actor)//L80015C40()\r\n{\r\n\tmobj_t\t\t*pl;\r\n\tfixed_t\t\tdist;\r\n\r\n\tif (!(actor->flags&MF_SEETARGET))\r\n\t\treturn false;\r\n\r\n\tif (!actor->target)\r\n\t\treturn false;\r\n\r\n\tpl = actor->target;\r\n\tdist = P_AproxDistance (pl->x-actor->x, pl->y-actor->y);\r\n\tif (dist >= MELEERANGE)\r\n\t\treturn false;\r\n\r\n\treturn true;\r\n}\r\n\r\n/*\r\n================\r\n=\r\n= P_CheckMissileRange\r\n=\r\n================\r\n*/\r\n//inline\r\nboolean P_CheckMissileRange (mobj_t *actor)//L80015CB4()\r\n{\r\n\tfixed_t\t\tdist;\r\n\r\n\tif (!(actor->flags & MF_SEETARGET))\r\n\t\treturn false;\r\n\r\n\tif (actor->flags & MF_JUSTHIT)\r\n\t{\t/* the target just hit the enemy, so fight back! */\r\n\t\tactor->flags &= ~MF_JUSTHIT;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tif (actor->reactiontime)\r\n\t\treturn false;\t\t/* don't attack yet */\r\n\r\n\tdist = P_AproxDistance ( actor->x-actor->target->x, actor->y-actor->target->y) - 64*FRACUNIT;\r\n\tif (!actor->info->meleestate)\r\n\t\tdist -= 128*FRACUNIT;\t\t/* no melee attack, so fire more */\r\n\r\n\tdist >>= 16;\r\n\r\n\tif (actor->type == MT_SKULL)\r\n\t\tdist >>= 1;\r\n\r\n\tif (dist > 200)\r\n\t\tdist = 200;\r\n\r\n\tif (P_Random() < dist)\r\n\t\treturn false;\r\n\r\n\treturn true;\r\n}\r\n\r\n\r\n/*\r\n================\r\n=\r\n= P_Move\r\n=\r\n= Move in the current direction\r\n= returns false if the move is blocked\r\n================\r\n*/\r\n\r\nfixed_t\txspeed[8] = {FRACUNIT,47000,0,-47000,-FRACUNIT,-47000,0,47000};//80066e90\r\nfixed_t yspeed[8] = {0,47000,FRACUNIT,47000,0,-47000,-FRACUNIT,-47000};//80066eb0\r\n\r\nextern\tline_t *blockline;//8007806c\r\n\r\nboolean P_Move (mobj_t *actor)//L80015D98()\r\n{\r\n\tfixed_t\ttryx, tryy;\r\n\tboolean\t\tgood;\r\n\tline_t\t\t*blkline;\r\n\r\n\tif (actor->movedir == DI_NODIR)\r\n\t\treturn false;\r\n\r\n\ttryx = actor->x + actor->info->speed * xspeed[actor->movedir];\r\n\ttryy = actor->y + actor->info->speed * yspeed[actor->movedir];\r\n\r\n\tif (!P_TryMove (actor, tryx, tryy) )\r\n\t{\t/* open any specials */\r\n\t\tif (actor->flags & MF_FLOAT && floatok)\r\n\t\t{\t/* must adjust height */\r\n\t\t\tif (actor->z < tmfloorz)\r\n\t\t\t\tactor->z += FLOATSPEED;\r\n\t\t\telse\r\n\t\t\t\tactor->z -= FLOATSPEED;\r\n\r\n\t\t\tactor->flags |= MF_INFLOAT;\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tblkline = blockline;//(line_t *)DSPRead (&blockline);\r\n\t\tif (!blkline || !blkline->special)\r\n\t\t\treturn false;\r\n\r\n\t\tactor->movedir = DI_NODIR;\r\n\t\tgood = false;\r\n        /* if the special isn't a door that can be opened, return false */\r\n\t\tif (P_UseSpecialLine (actor, blkline))\r\n\t\t\tgood = true;\r\n\t\treturn good;\r\n\t}\r\n\telse\r\n\t\tactor->flags &= ~MF_INFLOAT;\r\n\r\n\tif (!(actor->flags & MF_FLOAT))\r\n\t\tactor->z = actor->floorz;\r\n\treturn true;\r\n}\r\n\r\n\r\n/*\r\n==================================\r\n=\r\n= TryWalk\r\n=\r\n= Attempts to move actoron in its current (ob->moveangle) direction.\r\n=\r\n= If blocked by either a wall or an actor returns FALSE\r\n= If move is either clear or blocked only by a door, returns TRUE and sets\r\n= If a door is in the way, an OpenDoor call is made to start it opening.\r\n=\r\n==================================\r\n*/\r\n//inline\r\nboolean P_TryWalk (mobj_t *actor)//L80015F00()\r\n{\r\n\tif (!P_Move (actor))\r\n\t\treturn false;\r\n\r\n\tactor->movecount = P_Random()&15;\r\n\treturn true;\r\n}\r\n\r\n\r\n/*\r\n================\r\n=\r\n= P_NewChaseDir\r\n=\r\n================\r\n*/\r\n\r\ndirtype_t opposite[] = //80066ed0\r\n{DI_WEST, DI_SOUTHWEST, DI_SOUTH, DI_SOUTHEAST, DI_EAST, DI_NORTHEAST,\r\nDI_NORTH, DI_NORTHWEST, DI_NODIR};\r\n\r\ndirtype_t diags[] = {DI_NORTHWEST,DI_NORTHEAST,DI_SOUTHWEST,DI_SOUTHEAST};//80066ef4\r\n\r\nvoid P_NewChaseDir (mobj_t *actor)//L80015F4C()\r\n{\r\n\tfixed_t\t\tdeltax,deltay;\r\n\tdirtype_t\td[3];\r\n\tdirtype_t\ttdir, olddir, turnaround;\r\n\r\n\tif (!actor->target)\r\n\t\tI_Error (\"P_NewChaseDir: called with no target\");\r\n\r\n\tolddir = actor->movedir;\r\n\tturnaround=opposite[olddir];\r\n\r\n\tdeltax = actor->target->x - actor->x;\r\n\tdeltay = actor->target->y - actor->y;\r\n\r\n\tif (deltax>10*FRACUNIT)\r\n\t\td[1]= DI_EAST;\r\n\telse if (deltax<-10*FRACUNIT)\r\n\t\td[1]= DI_WEST;\r\n\telse\r\n\t\td[1]=DI_NODIR;\r\n\r\n\tif (deltay<-10*FRACUNIT)\r\n\t\td[2]= DI_SOUTH;\r\n\telse if (deltay>10*FRACUNIT)\r\n\t\td[2]= DI_NORTH;\r\n\telse\r\n\t\td[2]=DI_NODIR;\r\n\r\n/* try direct route */\r\n\tif (d[1] != DI_NODIR && d[2] != DI_NODIR)\r\n\t{\r\n\t\tactor->movedir = diags[((deltay<0)<<1)+(deltax>0)];\r\n\t\tif (actor->movedir != turnaround && P_TryWalk(actor))\r\n\t\t\treturn;\r\n\t}\r\n\r\n/* try other directions */\r\n\tif (P_Random() > 200 ||  abs(deltay)>abs(deltax))\r\n\t{\r\n\t\ttdir=d[1];\r\n\t\td[1]=d[2];\r\n\t\td[2]=tdir;\r\n\t}\r\n\r\n\tif (d[1]==turnaround)\r\n\t\td[1]=DI_NODIR;\r\n\r\n\tif (d[2]==turnaround)\r\n\t\td[2]=DI_NODIR;\r\n\r\n\tif (d[1]!=DI_NODIR)\r\n\t{\r\n\t\tactor->movedir = d[1];\r\n\t\tif (P_TryWalk(actor))\r\n\t\t\treturn;     /*either moved forward or attacked*/\r\n\t}\r\n\r\n\tif (d[2]!=DI_NODIR)\r\n\t{\r\n\t\tactor->movedir =d[2];\r\n\t\tif (P_TryWalk(actor))\r\n\t\t\treturn;\r\n\t}\r\n\r\n/* there is no direct path to the player, so pick another direction */\r\n\r\n\tif (olddir!=DI_NODIR)\r\n\t{\r\n\t\tactor->movedir =olddir;\r\n\t\tif (P_TryWalk(actor))\r\n\t\t\treturn;\r\n\t}\r\n\r\n\tif (P_Random()&1) \t/*randomly determine direction of search*/\r\n\t{\r\n\t\tfor (tdir=DI_EAST ; tdir<=DI_SOUTHEAST ; tdir++)\r\n\t\t{\r\n\t\t\tif (tdir!=turnaround)\r\n\t\t\t{\r\n\t\t\t\tactor->movedir =tdir;\r\n\t\t\t\tif ( P_TryWalk(actor) )\r\n\t\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\telse\r\n\t{\r\n\t\tfor (tdir=DI_SOUTHEAST ; (int)tdir >= (int)DI_EAST;tdir--)\r\n\t\t{\r\n\t\t\tif (tdir!=turnaround)\r\n\t\t\t{\r\n\t\t\t\tactor->movedir =tdir;\r\n\t\t\t\tif ( P_TryWalk(actor) )\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (turnaround !=  DI_NODIR)\r\n\t{\r\n\t\tactor->movedir =turnaround;\r\n\t\tif ( P_TryWalk(actor) )\r\n\t\t\treturn;\r\n\t}\r\n\r\n\tactor->movedir = DI_NODIR;\t\t/* can't move */\r\n}\r\n\r\n\r\n/*\r\n================\r\n=\r\n= P_LookForPlayers\r\n=\r\n= If allaround is false, only look 180 degrees in front\r\n= returns true if a player is targeted\r\n================\r\n*/\r\n\r\nboolean P_LookForPlayers (mobj_t *actor, boolean allaround)//L800162CC()\r\n{\r\n\tangle_t\t\tan;\r\n\tfixed_t\t\tdist;\r\n\tmobj_t\t\t*mo;\r\n\tint\t\t plyrnd;\r\n\r\n\tif (!(actor->flags & MF_SEETARGET))\r\n\t{\t/* pick another player as target if possible */\r\nnewtarget:\r\n\t\t/*if (playeringame[1] && actor->target == players[0].mo)\r\n\t\t\tactor->target = players[1].mo;\r\n\t\telse\r\n\t\t\tactor->target = players[0].mo;\r\n\t\treturn false;*/\r\n\r\n\t\tplyrnd = 0;\r\n\t\tif (playeringame[1])\r\n\t\t{\r\n\t\t\tplyrnd = P_Random() & 1;\r\n\t\t\tif (players[plyrnd].health <= 0)\r\n\t\t\t{\r\n\t\t\t\tplyrnd = plyrnd ^ 1;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tactor->target = players[plyrnd].mo;\r\n\t\treturn false;\r\n\t}\r\n\r\n\tmo = actor->target;\r\n\tif (!mo || mo->health <= 0)\r\n\t\tgoto newtarget;\r\n\r\n\tif (actor->subsector->sector->soundtarget == actor->target)\r\n\t\tallaround = true;\t\t/* ambush guys will turn around on a shot */\r\n\r\n\tif (!allaround)\r\n\t{\r\n\t\tan = R_PointToAngle2 (actor->x, actor->y, mo->x, mo->y) - actor->angle;\r\n\t\tif (an > ANG90 && an < ANG270)\r\n\t\t{\r\n\t\t\tdist = P_AproxDistance (mo->x - actor->x, mo->y - actor->y);\r\n\t\t\t/* if real close, react anyway */\r\n\t\t\tif (dist > MELEERANGE)\r\n\t\t\t\treturn false;\t\t/* behind back */\r\n\t\t}\r\n\t}\r\n\r\n\t//actor->threshold = 60;\r\n\treturn true;\r\n}\r\n\r\n\r\n/*\r\n===============================================================================\r\n\r\n\t\t\t\t\t\tACTION ROUTINES\r\n\r\n===============================================================================\r\n*/\r\n\r\n/*\r\n==============\r\n=\r\n= A_Look\r\n=\r\n= Stay in state until a player is sighted\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_Look (mobj_t *actor)//L8001644C()\r\n{\r\n\tmobj_t\t*targ;\r\n\tint\t\tsound;\r\n\r\n\t/* if current target is visible, start attacking */\r\n\tif (!P_LookForPlayers(actor, false))\r\n\t{\r\n\t\t/* if the sector has a living soundtarget, make that the new target */\r\n\t\tactor->threshold = 0;\t\t/* any shot will wake up */\r\n\t\ttarg = actor->subsector->sector->soundtarget;\r\n\t\tif (targ == NULL || !(targ->flags & MF_SHOOTABLE) || (actor->flags & MF_AMBUSH))\r\n\t\t\treturn;\r\n\t\tactor->target = targ;\r\n\t}\r\n\r\n\t/* go into chase state */\r\n\tif (actor->info->seesound)\r\n\t{\r\n\t\tswitch (actor->info->seesound)\r\n\t\t{\r\n\t\tcase sfx_posit1:\r\n\t\tcase sfx_posit2:\r\n\t\tcase sfx_posit3:\r\n\t\t\tsound = sfx_posit1+(P_Random()&1);\r\n\t\t\tbreak;\r\n\t\tcase sfx_bgsit1:\r\n\t\tcase sfx_bgsit2:\r\n\t\t\tsound = sfx_bgsit1+(P_Random()&1);\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tsound = actor->info->seesound;\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tif (actor->type == MT_SPIDER || actor->type == MT_CYBORG)\r\n\t\t\tS_StartSound(NULL, sound);\t// full volume\r\n\t\telse\r\n\t\t\tS_StartSound(actor, sound);\r\n\t}\r\n\r\n\tP_SetMobjState (actor, actor->info->seestate);\r\n}\r\n\r\n\r\n/*\r\n==============\r\n=\r\n= A_Chase\r\n=\r\n= Actor has a melee attack, so it tries to close as fast as possible\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_Chase (mobj_t *actor)//L80016578()\r\n{\r\n\tint\t\tdelta;\r\n\r\n\tif (actor->reactiontime)\r\n\t\tactor->reactiontime--;\r\n\r\n\t/* */\r\n\t/* modify target threshold */\r\n\t/* */\r\n\tif  (actor->threshold)\r\n\t\tactor->threshold--;\r\n\r\n\t/* */\r\n\t/* turn towards movement direction if not there yet */\r\n\t/* */\r\n\tif (actor->movedir < 8)\r\n\t{\r\n\t\tactor->angle &= (7<<29);\r\n\t\tdelta = actor->angle - (actor->movedir << 29);\r\n\t\tif (delta > 0)\r\n\t\t\tactor->angle -= ANG90/2;\r\n\t\telse if (delta < 0)\r\n\t\t\tactor->angle += ANG90/2;\r\n\t}\r\n\r\n\tif (!actor->target || !(actor->target->flags&MF_SHOOTABLE))\r\n\t{\t/* look for a new target */\r\n\t\tif (P_LookForPlayers(actor,true))\r\n\t\t\treturn;\t\t/* got a new target */\r\n\t\tP_SetMobjState (actor, actor->info->spawnstate);\r\n\t\treturn;\r\n\t}\r\n\r\n\t/* */\r\n\t/* don't attack twice in a row */\r\n\t/* */\r\n\tif (actor->flags & MF_JUSTATTACKED)\r\n\t{\r\n\t\tactor->flags &= ~MF_JUSTATTACKED;\r\n\t\tP_NewChaseDir (actor);\r\n\t\treturn;\r\n\t}\r\n\r\n\t/* */\r\n\t/* check for melee attack */\r\n\t/* */\r\n\tif (actor->info->meleestate && P_CheckMeleeRange (actor))\r\n\t{\r\n\t\tif (actor->info->attacksound)\r\n\t\t\tS_StartSound (actor, actor->info->attacksound);\r\n\t\tP_SetMobjState (actor, actor->info->meleestate);\r\n\t\treturn;\r\n\t}\r\n\r\n\t/* */\r\n\t/* check for missile attack */\r\n\t/* */\r\n\tif ( (gameskill == sk_nightmare || !actor->movecount) && actor->info->missilestate\r\n\t&& P_CheckMissileRange (actor))\r\n\t{\r\n\t\tP_SetMobjState (actor, actor->info->missilestate);\r\n\t\tif (gameskill != sk_nightmare)\r\n\t\t\tactor->flags |= MF_JUSTATTACKED;\r\n\t\treturn;\r\n\t}\r\n\r\n\t/* */\r\n\t/* chase towards player */\r\n\t/* */\r\n\tif (--actor->movecount<0 || !P_Move (actor))\r\n\t\tP_NewChaseDir (actor);\r\n\r\n\t/* */\r\n\t/* make active sound */\r\n\t/* */\r\n\tif (actor->info->activesound && P_Random () < 3)\r\n\t\tS_StartSound (actor, actor->info->activesound);\r\n}\r\n\r\n/*============================================================================= */\r\n\r\n/*\r\n==============\r\n=\r\n= A_FaceTarget\r\n=\r\n==============\r\n*/\r\n//inline\r\nvoid A_FaceTarget (mobj_t *actor)//L800168C0()\r\n{\r\n\tif (!actor->target)\r\n\t\treturn;\r\n\r\n\tactor->flags &= ~MF_AMBUSH;\r\n\tactor->angle = R_PointToAngle2 (actor->x, actor->y , actor->target->x, actor->target->y);\r\n\r\n\tif (actor->target->flags & (MF_BLENDMASK1 | MF_BLENDMASK2 | MF_BLENDMASK3))\r\n\t\tactor->angle += (P_Random() - P_Random()) << 21;\r\n}\r\n\r\n\r\n/*\r\n==============\r\n=\r\n= A_PosAttack\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_PosAttack (mobj_t *actor)//L80016964()\r\n{\r\n\tint\t\tangle, damage;\r\n\r\n\tif (!actor->target)\r\n\t\treturn;\r\n\r\n\tA_FaceTarget (actor);\r\n\tangle = actor->angle;\r\n\r\n\tS_StartSound (actor, sfx_pistol);\r\n\tangle += (P_Random()-P_Random())<<20;\r\n\tdamage = ((P_Random()&7)+1)*3;\r\n\tP_LineAttack (actor, angle, MISSILERANGE, MAXINT, damage);\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_SPosAttack\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_SPosAttack (mobj_t *actor)//L80016A6C()\r\n{\r\n\tint\t\ti;\r\n\tint\t\tangle, bangle, damage;\r\n\r\n\tif (!actor->target)\r\n\t\treturn;\r\n\r\n\tS_StartSound (actor, sfx_shotgn);\r\n\tA_FaceTarget (actor);\r\n\tbangle = actor->angle;\r\n\r\n\tfor (i=0 ; i<3 ; i++)\r\n\t{\r\n\t\tangle = bangle + ((P_Random()-P_Random())<<20);\r\n\t\tdamage = ((P_Random() % 5) + 1) * 3;\r\n\t\tP_LineAttack (actor, angle, MISSILERANGE, MAXINT, damage);\r\n\t}\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_CPosAttack\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_CPosAttack(mobj_t* actor)//L80016BBC()\r\n{\r\n\tint\t\tangle;\r\n\tint\t\tbangle;\r\n\tint\t\tdamage;\r\n\tint\t\tslope;\r\n\r\n\tif (!actor->target)\r\n\t\treturn;\r\n\r\n\tS_StartSound(actor, sfx_pistol);\r\n\tA_FaceTarget(actor);\r\n\tbangle = actor->angle;\r\n\r\n\tslope = P_AimLineAttack(actor, bangle, MISSILERANGE);\r\n\r\n\tangle = bangle + ((P_Random() - P_Random()) << 20);\r\n\tdamage = ((P_Random() % 5) + 1) * 3;\r\n\tP_LineAttack(actor, angle, MISSILERANGE, slope, damage);\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_CPosRefire\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_CPosRefire(mobj_t* actor)//L80016D08()\r\n{\r\n\tA_FaceTarget(actor);\r\n\r\n\tif (P_Random() < 40)\r\n\t\treturn;\r\n\r\n\tif (!actor->target || actor->target->health <= 0\r\n\t\t|| !P_CheckSight(actor, actor->target))\r\n\t{\r\n\t\tP_SetMobjState(actor, actor->info->seestate);\r\n\t}\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_SpidAttack\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_SpidAttack(mobj_t *actor)//L80016E04()\r\n{\r\n\tint i;\r\n\tint angle, bangle, damage;\r\n\r\n\tif (!actor->target)\r\n\t\treturn;\r\n\r\n\tS_StartSound(actor, sfx_pistol);\r\n\tA_FaceTarget(actor);\r\n\tbangle = actor->angle;\r\n\r\n\tfor (i = 0; i < 3; i++)\r\n\t{\r\n\t\tangle = bangle + ((P_Random() - P_Random()) << 20);\r\n\t\tdamage = ((P_Random() % 5) + 1) * 3;\r\n\t\tP_LineAttack(actor, angle, MISSILERANGE, MAXINT, damage);\r\n\t}\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_SpidRefire\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_SpidRefire (mobj_t *actor)//L80016F54()\r\n{\r\n/* keep firing unless target got out of sight */\r\n\tA_FaceTarget (actor);\r\n\tif (P_Random () < 10)\r\n\t\treturn;\r\n\tif (!actor->target || actor->target->health <= 0 || !(actor->flags&MF_SEETARGET) )\r\n\t\tP_SetMobjState (actor, actor->info->seestate);\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_BspiAttack\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_BspiAttack(mobj_t *actor)//L80017054()\r\n{\r\n\tif (!actor->target)\r\n\t\treturn;\r\n\r\n\tA_FaceTarget(actor);\r\n\r\n\t// launch a missile\r\n\tP_SpawnMissile(actor, actor->target, MT_ARACHPLAZ);\r\n}\r\n\r\n\r\n/*\r\n==============\r\n=\r\n= A_TroopAttack\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_TroopAttack (mobj_t *actor)//L80017108()\r\n{\r\n\tint\t\tdamage;\r\n\r\n\tif (!actor->target)\r\n\t\treturn;\r\n\r\n\tA_FaceTarget (actor);\r\n\tif (P_CheckMeleeRange (actor))\r\n\t{\r\n\t\tS_StartSound (actor, sfx_claw);\r\n\t\tdamage = ((P_Random()&7)+1)*3;\r\n\t\tP_DamageMobj (actor->target, actor, actor, damage);\r\n\t\treturn;\r\n\t}\r\n/* */\r\n/* launch a missile */\r\n/* */\r\n\tP_SpawnMissile (actor, actor->target, MT_TROOPSHOT);\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_SargAttack\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_SargAttack (mobj_t *actor)//L80017248()\r\n{\r\n\tint\t\tdamage;\r\n\r\n\tif (!actor->target)\r\n\t\treturn;\r\n\r\n\tA_FaceTarget (actor);\r\n\tdamage = ((P_Random()&7)+1)*4;\r\n\tP_LineAttack (actor, actor->angle, MELEERANGE, 0, damage);\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_HeadAttack\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_HeadAttack (mobj_t *actor)//L80017318()\r\n{\r\n\tint\t\tdamage;\r\n\r\n\tif (!actor->target)\r\n\t\treturn;\r\n\r\n\tA_FaceTarget (actor);\r\n\tif (P_CheckMeleeRange (actor))\r\n\t{\r\n\t\tdamage = ((P_Random()&7)+1)*8;\r\n\t\tP_DamageMobj (actor->target, actor, actor, damage);\r\n\t\treturn;\r\n\t}\r\n/* */\r\n/* launch a missile */\r\n/* */\r\n\tP_SpawnMissile (actor, actor->target, MT_HEADSHOT);\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_CyberAttack\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_CyberAttack (mobj_t *actor)//L8001744C()\r\n{\r\n\tif (!actor->target)\r\n\t\treturn;\r\n\r\n\tA_FaceTarget (actor);\r\n\tP_SpawnMissile (actor, actor->target, MT_ROCKET);\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_BruisAttack\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_BruisAttack (mobj_t *actor)//L80017500()\r\n{\r\n\tint\t\tdamage;\r\n\r\n\tif (!actor->target)\r\n\t\treturn;\r\n\r\n\tif (P_CheckMeleeRange (actor))\r\n\t{\r\n\t\tS_StartSound (actor, sfx_claw);\r\n\t\tdamage = ((P_Random()&7)+1)*11;\r\n\t\tP_DamageMobj (actor->target, actor, actor, damage);\r\n\t\treturn;\r\n\t}\r\n/* */\r\n/* launch a missile */\r\n/* */\r\n\tP_SpawnMissile (actor, actor->target, MT_BRUISERSHOT);\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_SkelMissile\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_SkelMissile(mobj_t *actor) //L800175C8()\r\n{\r\n\tmobj_t*\tmo;\r\n\r\n\tif (!actor->target)\r\n\t\treturn;\r\n\r\n\tA_FaceTarget(actor);\r\n\tactor->z += 16 * FRACUNIT;\t// so missile spawns higher\r\n\tmo = P_SpawnMissile(actor, actor->target, MT_TRACER);\r\n\tactor->z -= 16 * FRACUNIT;\t// back to normal\r\n\r\n\tmo->x += mo->momx;\r\n\tmo->y += mo->momy;\r\n\tmo->tracer = actor->target;\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_Tracer\r\n=\r\n==============\r\n*/\r\n\r\n#define\tTRACEANGLE 0xC000000\r\n\r\nvoid A_Tracer(mobj_t *actor) //L800176C8()\r\n{\r\n\tangle_t\texact;\r\n\tfixed_t\tdist;\r\n\tfixed_t\tslope;\r\n\tmobj_t *dest;\r\n\tmobj_t *th;\r\n\r\n\tif (!(gametic & 3))\r\n\t{\r\n\t\t// spawn a puff of smoke behind the rocket\r\n\t\tP_SpawnPuff(actor->x, actor->y, actor->z);\r\n\r\n\t\tth = P_SpawnMobj(actor->x - actor->momx, actor->y - actor->momy, actor->z, MT_SMOKE);\r\n\r\n\t\tth->momz = FRACUNIT;\r\n\t\tth->tics -= P_Random() & 3;\r\n\r\n\t\tif (th->tics < 1)\r\n\t\t\tth->tics = 1;\r\n\r\n\t\t// adjust direction\r\n\t\tdest = actor->tracer;\r\n\r\n\t\tif (!dest || dest->health <= 0)\r\n\t\t\treturn;\r\n\r\n\t\t// change angle\r\n\t\texact = R_PointToAngle2(actor->x, actor->y, dest->x, dest->y);\r\n\r\n\t\tif (exact != actor->angle)\r\n\t\t{\r\n\t\t\tif (exact - actor->angle > 0x80000000)\r\n\t\t\t{\r\n\t\t\t\tactor->angle -= TRACEANGLE;\r\n\t\t\t\tif (exact - actor->angle < 0x80000000)\r\n\t\t\t\t\tactor->angle = exact;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tactor->angle += TRACEANGLE;\r\n\t\t\t\tif (exact - actor->angle > 0x80000000)\r\n\t\t\t\t\tactor->angle = exact;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\texact = actor->angle >> ANGLETOFINESHIFT;\r\n\t\tactor->momx = FixedMul(actor->info->speed, finecosine[exact]);\r\n\t\tactor->momy = FixedMul(actor->info->speed, finesine[exact]);\r\n\r\n\t\t// change slope\r\n\t\tdist = P_AproxDistance(dest->x - actor->x, dest->y - actor->y);\r\n\t\tdist = dist / actor->info->speed;\r\n\r\n\t\tif (dist <= 0)\r\n\t\t\tdist = 1;\r\n\r\n\t\t//slope = (dest->z + 40 * FRACUNIT - actor->z) / dist;\r\n\t\tslope = (dest->z - (actor->z + -(40 * FRACUNIT)))/ dist;\r\n\r\n\t\tif (slope < actor->momz)\r\n\t\t\tactor->momz -= FRACUNIT / 8;\r\n\t\telse\r\n\t\t\tactor->momz += FRACUNIT / 8;\r\n\t}\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_SkelWhoosh\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_SkelWhoosh(mobj_t* actor) //L80017918()\r\n{\r\n\tif (!actor->target)\r\n\t\treturn;\r\n\tA_FaceTarget(actor);\r\n\tS_StartSound(actor, sfx_skeswg);\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_SkelFist\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_SkelFist(mobj_t*\tactor) //L800179C8()\r\n{\r\n\tint\tdamage;\r\n\r\n\tif (!actor->target)\r\n\t\treturn;\r\n\r\n\tA_FaceTarget(actor);\r\n\r\n\tif (P_CheckMeleeRange(actor))\r\n\t{\r\n\t\tdamage = ((P_Random() % 10) + 1) * 6;\r\n\t\tS_StartSound(actor, sfx_skepch);\r\n\t\tP_DamageMobj(actor->target, actor, actor, damage);\r\n\t}\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_FatRaise\r\n=\r\n==============\r\n*/\r\n\r\n#define\tFATSPREAD\t(ANG90/8)\r\n\r\nvoid A_FatRaise(mobj_t *actor)//L80017B28()\r\n{\r\n\tA_FaceTarget(actor);\r\n\tS_StartSound(actor, sfx_manatk);\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_FatAttack1\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_FatAttack1(mobj_t *actor)//L80017BD8()\r\n{\r\n\tmobj_t  *mo;\r\n\tmobj_t  *target;\r\n\tint\t    an;\r\n\r\n\tA_FaceTarget(actor);\r\n\r\n\t// Change direction  to ...\r\n\ttarget = actor->target;\r\n\tactor->angle += FATSPREAD;\r\n\tP_SpawnMissile(actor, target, MT_FATSHOT);\r\n\r\n\tmo = P_SpawnMissile(actor, target, MT_FATSHOT);\r\n\tmo->angle += FATSPREAD;\r\n\tan = mo->angle >> ANGLETOFINESHIFT;\r\n\tmo->momx = FixedMul(mo->info->speed, finecosine[an]);\r\n\tmo->momy = FixedMul(mo->info->speed, finesine[an]);\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_FatAttack2\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_FatAttack2(mobj_t *actor)//L80017D14()\r\n{\r\n    mobj_t  *mo;\r\n\tmobj_t  *target;\r\n\tint\t    an;\r\n\r\n\tA_FaceTarget(actor);\r\n\r\n\t// Now here choose opposite deviation.\r\n\ttarget = actor->target;\r\n\tactor->angle -= FATSPREAD;\r\n\tP_SpawnMissile(actor, target, MT_FATSHOT);\r\n\r\n\tmo = P_SpawnMissile(actor, target, MT_FATSHOT);\r\n\tmo->angle -= FATSPREAD * 2;\r\n\tan = mo->angle >> ANGLETOFINESHIFT;\r\n\tmo->momx = FixedMul(mo->info->speed, finecosine[an]);\r\n\tmo->momy = FixedMul(mo->info->speed, finesine[an]);\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_FatAttack3\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_FatAttack3(mobj_t *actor)//L80017E50()\r\n{\r\n    mobj_t  *mo;\r\n\tmobj_t  *target;\r\n\tint\t    an;\r\n\r\n\tA_FaceTarget(actor);\r\n\ttarget = actor->target; // [9/2/2021] haleyjd: add missing assignment\r\n\r\n\tmo = P_SpawnMissile(actor, target, MT_FATSHOT);\r\n\tmo->angle -= FATSPREAD / 2;\r\n\tan = mo->angle >> ANGLETOFINESHIFT;\r\n\tmo->momx = FixedMul(mo->info->speed, finecosine[an]);\r\n\tmo->momy = FixedMul(mo->info->speed, finesine[an]);\r\n\r\n\tmo = P_SpawnMissile(actor, target, MT_FATSHOT);\r\n\tmo->angle += FATSPREAD / 2;\r\n\tan = mo->angle >> ANGLETOFINESHIFT;\r\n\tmo->momx = FixedMul(mo->info->speed, finecosine[an]);\r\n\tmo->momy = FixedMul(mo->info->speed, finesine[an]);\r\n}\r\n\r\n\r\n/*\r\n==================\r\n=\r\n= SkullAttack\r\n=\r\n= Fly at the player like a missile\r\n=\r\n==================\r\n*/\r\n\r\n#define\tSKULLSPEED\t\t(40*FRACUNIT)\r\n\r\nvoid A_SkullAttack (mobj_t *actor)//L80017FE4()\r\n{\r\n\tmobj_t\t\t\t*dest;\r\n\tangle_t\t\t\tan;\r\n\tint\t\t\t\tdist;\r\n\r\n\tif (!actor->target)\r\n\t\treturn;\r\n\r\n\tdest = actor->target;\r\n\tactor->flags |= MF_SKULLFLY;\r\n\r\n\tS_StartSound (actor, actor->info->attacksound);\r\n\tA_FaceTarget (actor);\r\n\tan = actor->angle >> ANGLETOFINESHIFT;\r\n\tactor->momx = FixedMul (SKULLSPEED, finecosine[an]);\r\n\tactor->momy = FixedMul (SKULLSPEED, finesine[an]);\r\n\tdist = P_AproxDistance (dest->x - actor->x, dest->y - actor->y);\r\n\tdist = dist / SKULLSPEED;\r\n\tif (dist < 1)\r\n\t\tdist = 1;\r\n\tactor->momz = (dest->z+(dest->height>>1) - actor->z) / dist;\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_PainShootSkull\r\n=\r\n==============\r\n*/\r\n//inline\r\nvoid A_PainShootSkull(mobj_t *actor, angle_t angle)//L80018194()\r\n{\r\n\tfixed_t\tx;\r\n\tfixed_t\ty;\r\n\tfixed_t\tz;\r\n\r\n\tmobj_t*\tnewmobj;\r\n\tangle_t\tan;\r\n\tint\t\tprestep;\r\n\tint\t\tcount;\r\n\r\n\t#if FIX_PE_SKULL_LIMIT == 1\r\n\tmobj_t\t*mo;\r\n\t#else\r\n\tthinker_t*\tcurrentthinker;\r\n\t#endif // FIX_PE_SKULL_LIMIT\r\n\r\n\r\n\t// count total number of skull currently on the level\r\n\tcount = 0;\r\n\t#if FIX_PE_SKULL_LIMIT == 1\r\n\tfor (mo=mobjhead.next ; mo != &mobjhead ; mo=mo->next)\r\n\t{\r\n\t\tif ((mo->type == MT_SKULL))\r\n        {\r\n            count++;\r\n        }\r\n\t}\r\n\r\n\t#else\r\n\tcurrentthinker = thinkercap.next;\r\n\twhile (currentthinker != &thinkercap)\r\n\t{\r\n\t\tif ((currentthinker->function == P_MobjThinker) && ((mobj_t *)currentthinker)->type == MT_SKULL)\r\n        {\r\n\t\t\tcount++;\r\n        }\r\n\t\tcurrentthinker = currentthinker->next;\r\n\t}\r\n\t#endif // FIX_PE_SKULL_LIMIT\r\n\r\n\t// if there are allready 20 skulls on the level,\r\n\t// don't spit another one\r\n\tif (count > 20)\r\n\t\treturn;\r\n\r\n\t// okay, there's playe for another one\r\n\tan = angle >> ANGLETOFINESHIFT;\r\n\r\n\tprestep = mobjinfo[MT_SKULL].radius + (4 * FRACUNIT) + actor->info->radius;\r\n\t//r16 = *L8005E37C + 262144 + *(*(r18 + 88) + 64);\r\n\t//prestep = 4 * FRACUNIT + 3 * (actor->info->radius + mobjinfo[MT_SKULL].radius) / 2;\r\n\r\n\tx = actor->x + FixedMul(prestep, finecosine[an]);\r\n\ty = actor->y + FixedMul(prestep, finesine[an]);\r\n\tz = actor->z + 8 * FRACUNIT;\r\n\r\n\tnewmobj = P_SpawnMobj(x, y, z, MT_SKULL);\r\n\r\n\t// Check for movements.\r\n\tif (!P_TryMove(newmobj, newmobj->x, newmobj->y))\r\n\t{\r\n\t\t// kill it immediately\r\n\t\tP_DamageMobj(newmobj, actor, actor, 10000);\r\n\t\treturn;\r\n\t}\r\n\r\n\tnewmobj->target = actor->target;\r\n\tA_SkullAttack(newmobj);\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_PainAttack\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_PainAttack(mobj_t *actor)//L800182E8()\r\n{\r\n\tif (!actor->target)\r\n\t\treturn;\r\n\r\n\tA_FaceTarget(actor);\r\n\tA_PainShootSkull(actor, actor->angle);\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_PainDie\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_PainDie(mobj_t *actor)//L800184B8()\r\n{\r\n\tA_Fall(actor);\r\n\tA_PainShootSkull(actor, actor->angle + ANG90);\r\n\tA_PainShootSkull(actor, actor->angle + ANG180);\r\n\tA_PainShootSkull(actor, actor->angle + ANG270);\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_Scream\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_Scream (mobj_t *actor)//L800188BC()\r\n{\r\n\tint\t\tsound;\r\n\r\n\tswitch (actor->info->deathsound)\r\n\t{\r\n\tcase 0:\r\n\t\treturn;\r\n\r\n\tcase sfx_podth1:\r\n\tcase sfx_podth2:\r\n\tcase sfx_podth3:\r\n\t\tsound = sfx_podth1 + (P_Random ()&1);\r\n\t\tbreak;\r\n\r\n\tcase sfx_bgdth1:\r\n\tcase sfx_bgdth2:\r\n\t\tsound = sfx_bgdth1 + (P_Random ()&1);\r\n\t\tbreak;\r\n\r\n\tdefault:\r\n\t\tsound = actor->info->deathsound;\r\n\t\tbreak;\r\n\t}\r\n\r\n\t// Check for bosses.\r\n\tif (actor->type == MT_SPIDER || actor->type == MT_CYBORG)\r\n\t{\r\n\t\t// full volume\r\n\t\tS_StartSound(NULL, sound);\r\n\t}\r\n\telse\r\n\t\tS_StartSound(actor, sound);\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_XScream\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_XScream (mobj_t *actor)//L8001892C()\r\n{\r\n\tS_StartSound (actor, sfx_slop);\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_Pain\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_Pain (mobj_t *actor)//L8001894C()\r\n{\r\n\tif (actor->info->painsound)\r\n\t\tS_StartSound (actor, actor->info->painsound);\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= A_Fall\r\n=\r\n==============\r\n*/\r\n\r\nvoid A_Fall (mobj_t *actor)//L80018984()\r\n{\r\n/* actor is on ground, it can be walked over */\r\n\tactor->flags &= ~MF_SOLID;\r\n}\r\n\r\n\r\n/*\r\n================\r\n=\r\n= A_Explode\r\n=\r\n================\r\n*/\r\n\r\nvoid A_Explode (mobj_t *thingy)//L80018998()\r\n{\r\n\tP_RadiusAttack(thingy, thingy->target, 128);\r\n}\r\n\r\n\r\n/*\r\n================\r\n=\r\n= A_BossDeath\r\n=\r\n= Possibly trigger special effects\r\n================\r\n*/\r\nextern int enemyspecial;   //80077DB4\r\n\r\nvoid A_BossDeath (mobj_t *mo)//L800189BC()\r\n{\r\n\tmobj_t\t\t*mo2;\r\n\tline_t\t\tjunk;\r\n\r\n\tif (enemyspecial & 1)\r\n\t{\r\n\t\tjunk.tag = 666;\r\n\t\tif (mo->type == MT_FATSO)\r\n\t\t\tgoto RunAction;\r\n\t}\r\n\tif (enemyspecial & 2)\r\n\t{\r\n\t\tjunk.tag = 667;\r\n\t\tif (mo->type == MT_BABY)\r\n\t\t\tgoto RunAction;\r\n\t}\r\n\tif (enemyspecial & 4)\r\n\t{\r\n\t\tjunk.tag = 668;\r\n\t\tif (mo->type == MT_SPIDER)\r\n\t\t\tgoto RunAction;\r\n\t}\r\n\tif (enemyspecial & 8)\r\n\t{\r\n\t\tjunk.tag = 669;\r\n\t\tif (mo->type == MT_KNIGHT)\r\n\t\t\tgoto RunAction;\r\n\t}\r\n\tif (enemyspecial & 16)\r\n\t{\r\n\t\tjunk.tag = 670;\r\n\t\tif (mo->type == MT_CYBORG)\r\n\t\t\tgoto RunAction;\r\n\t}\r\n\tif (enemyspecial & 32)\r\n\t{\r\n\t\tjunk.tag = 671;\r\n\t\tif (mo->type == MT_BRUISER)\r\n\t\t\tgoto RunAction;\r\n\t}\r\n\r\n\t//No Find Enemy Special Flag\r\n\treturn;\r\n\r\nRunAction:\r\n\t/* */\r\n\t/* scan the remaining thinkers to see if all bosses are dead */\r\n\t/* */\r\n\r\n\t/* FIXME */\r\n\tfor (mo2=mobjhead.next ; mo2 != &mobjhead ; mo2=mo2->next)\r\n\t{\r\n\t\tif ((mo2 != mo) && (mo2->type == mo->type) && (mo2->health > 0))\r\n\t\t\treturn;\t\t/* other boss not dead */\r\n\t}\r\n\r\n\t/* */\r\n\t/* victory! */\r\n\t/* */\r\n\tswitch (junk.tag)// Get case number\r\n\t{\r\n\tcase 666:\r\n\t\tenemyspecial &= ~1;\r\n\t\tEV_DoFloor(&junk, lowerFloorToLowest);\r\n\t\tbreak;\r\n\tcase 667:\r\n\t\tenemyspecial &= ~2;\r\n\t\tEV_DoFloor(&junk, raiseFloor24);\r\n\t\tbreak;\r\n\tcase 668:\r\n\t\tenemyspecial &= ~4;\r\n\t\tEV_DoFloor(&junk, lowerFloorToLowest);\r\n\t\tbreak;\r\n\tcase 669:\r\n\t\tenemyspecial &= ~8;\r\n\t\tEV_DoFloor(&junk, lowerFloorToLowest);\r\n\t\tbreak;\r\n\tcase 670:\r\n\t\tenemyspecial &= ~16;\r\n\t\tEV_DoDoor(&junk, Open);\r\n\t\tbreak;\r\n\tcase 671:\r\n\t\tenemyspecial &= ~32;\r\n\t\tEV_DoFloor(&junk, lowerFloorToLowest);\r\n\t\tbreak;\r\n\tdefault:\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\n/*\r\n================\r\n=\r\n= A_Hoof\r\n=\r\n================\r\n*/\r\n\r\nvoid A_Hoof (mobj_t *mo)//L80018BDC()\r\n{\r\n\tS_StartSound(mo, sfx_hoof);\r\n\tA_Chase(mo);\r\n}\r\n\r\n/*\r\n================\r\n=\r\n= A_Metal\r\n=\r\n================\r\n*/\r\n\r\nvoid A_Metal (mobj_t *mo)//L80018C10()\r\n{\r\n\tS_StartSound(mo, sfx_metal);\r\n\tA_Chase(mo);\r\n}\r\n\r\n/*\r\n================\r\n=\r\n= A_BabyMetal\r\n=\r\n================\r\n*/\r\n\r\nvoid A_BabyMetal(mobj_t* mo)//L80018C44()\r\n{\r\n\tS_StartSound(mo, sfx_bspwlk);\r\n\tA_Chase(mo);\r\n}\r\n\r\n/*============================================================================= */\r\n\r\n/* a move in p_base.c crossed a special line */\r\n#if 0\r\nvoid L_CrossSpecial (mobj_t *mo)\r\n{\r\n\tline_t\t*line;\r\n\r\n\tline = (line_t *)(mo->extradata & ~1);\r\n\r\n\tP_CrossSpecialLine (line, mo);\r\n}\r\n#endif\r\n\r\n/*\r\n================\r\n=\r\n= L_MissileHit\r\n=\r\n================\r\n*/\r\n\r\n/* a move in p_base.c caused a missile to hit another thing or wall */\r\nvoid L_MissileHit (mobj_t *mo)//L80018C78()\r\n{\r\n\tint\tdamage;\r\n\tmobj_t\t*missilething;\r\n\r\n\tmissilething = mo->extramobj;\r\n\tif (missilething)\r\n\t{\r\n\t\tdamage = ((P_Random()&7)+1)*mo->info->damage;\r\n\t\tP_DamageMobj (missilething, mo, mo->target, damage);\r\n\t}\r\n\tP_ExplodeMissile (mo);\r\n}\r\n\r\n/*\r\n================\r\n=\r\n= L_SkullBash\r\n=\r\n================\r\n*/\r\n\r\n/* a move in p_base.c caused a flying skull to hit another thing or a wall */\r\nvoid L_SkullBash (mobj_t *mo)//L80018CEC()\r\n{\r\n\tint\tdamage;\r\n\tmobj_t\t*skullthing;\r\n\r\n\tskullthing = mo->extramobj;\r\n\r\n\tif (skullthing)\r\n\t{\r\n\t\tdamage = ((P_Random()&7)+1)*mo->info->damage;\r\n\t\tP_DamageMobj (skullthing, mo, mo, damage);\r\n\t}\r\n\r\n\tmo->flags &= ~MF_SKULLFLY;\r\n\tmo->momx = mo->momy = mo->momz = 0;\r\n\tP_SetMobjState (mo, mo->info->spawnstate);\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/p_floor.c",
    "content": "#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n\r\n/*================================================================== */\r\n/*================================================================== */\r\n/* */\r\n/*\t\t\t\t\t\t\t\tFLOORS */\r\n/* */\r\n/*================================================================== */\r\n/*================================================================== */\r\n\r\n\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tMove a plane (floor or ceiling) and check for crushing */\r\n/* */\r\n/*================================================================== */\r\nresult_e\tT_MovePlane(sector_t *sector,fixed_t speed,\r\n\t\t\tfixed_t dest,boolean crush,int floorOrCeiling,int direction)//L80018D88()\r\n{\r\n\tboolean\tflag;\r\n\tfixed_t\tlastpos;\r\n\r\n\tswitch(floorOrCeiling)\r\n\t{\r\n\t\tcase 0:\t\t/* FLOOR */\r\n\t\t\tswitch(direction)\r\n\t\t\t{\r\n\t\t\t\tcase -1:\t/* DOWN */\r\n\t\t\t\t\tif (sector->floorheight - speed < dest)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tlastpos = sector->floorheight;\r\n\t\t\t\t\t\tsector->floorheight = dest;\r\n\t\t\t\t\t\tflag = P_ChangeSector(sector,crush);\r\n\t\t\t\t\t\tif (flag == true)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tsector->floorheight =lastpos;\r\n\t\t\t\t\t\t\tP_ChangeSector(sector,crush);\r\n\t\t\t\t\t\t\t/*return crushed; */\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn pastdest;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tlastpos = sector->floorheight;\r\n\t\t\t\t\t\tsector->floorheight -= speed;\r\n\t\t\t\t\t\tflag = P_ChangeSector(sector,crush);\r\n\t\t\t\t\t\tif (flag == true)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tsector->floorheight = lastpos;\r\n\t\t\t\t\t\t\tP_ChangeSector(sector,crush);\r\n\t\t\t\t\t\t\treturn crushed;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 1:\t\t/* UP */\r\n\t\t\t\t\tif (sector->floorheight + speed > dest)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tlastpos = sector->floorheight;\r\n\t\t\t\t\t\tsector->floorheight = dest;\r\n\t\t\t\t\t\tflag = P_ChangeSector(sector,crush);\r\n\t\t\t\t\t\tif (flag == true)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tsector->floorheight = lastpos;\r\n\t\t\t\t\t\t\tP_ChangeSector(sector,crush);\r\n\t\t\t\t\t\t\treturn crushed; /*return crushed; */\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn pastdest;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\t/* COULD GET CRUSHED */\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tlastpos = sector->floorheight;\r\n\t\t\t\t\t\tsector->floorheight += speed;\r\n\t\t\t\t\t\tflag = P_ChangeSector(sector,crush);\r\n\t\t\t\t\t\tif (flag == true)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif (crush == true)\r\n\t\t\t\t\t\t\t\treturn crushed;\r\n\t\t\t\t\t\t\tsector->floorheight = lastpos;\r\n\t\t\t\t\t\t\tP_ChangeSector(sector,crush);\r\n\t\t\t\t\t\t\treturn crushed;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\r\n\t\tcase 1:\t\t/* CEILING */\r\n\t\t\tswitch(direction)\r\n\t\t\t{\r\n\t\t\t\tcase -1:\t/* DOWN */\r\n\t\t\t\t\tif (sector->ceilingheight - speed < dest)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tlastpos = sector->ceilingheight;\r\n\t\t\t\t\t\tsector->ceilingheight = dest;\r\n\t\t\t\t\t\tflag = P_ChangeSector(sector,crush);\r\n\t\t\t\t\t\tif (flag == true)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tsector->ceilingheight = lastpos;\r\n\t\t\t\t\t\t\tP_ChangeSector(sector,crush);\r\n\t\t\t\t\t\t\t/*return crushed; */\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn pastdest;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\t/* COULD GET CRUSHED */\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tlastpos = sector->ceilingheight;\r\n\t\t\t\t\t\tsector->ceilingheight -= speed;\r\n\t\t\t\t\t\tflag = P_ChangeSector(sector,crush);\r\n\t\t\t\t\t\tif (flag == true)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif (crush == true)\r\n\t\t\t\t\t\t\t\treturn crushed;\r\n\t\t\t\t\t\t\tsector->ceilingheight = lastpos;\r\n\t\t\t\t\t\t\tP_ChangeSector(sector,crush);\r\n\t\t\t\t\t\t\treturn crushed;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 1:\t\t/* UP */\r\n\t\t\t\t\tif (sector->ceilingheight + speed > dest)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tlastpos = sector->ceilingheight;\r\n\t\t\t\t\t\tsector->ceilingheight = dest;\r\n\t\t\t\t\t\tflag = P_ChangeSector(sector,crush);\r\n\t\t\t\t\t\tif (flag == true)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tsector->ceilingheight = lastpos;\r\n\t\t\t\t\t\t\tP_ChangeSector(sector,crush);\r\n\t\t\t\t\t\t\t/*return crushed; */\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn pastdest;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tlastpos = sector->ceilingheight;\r\n\t\t\t\t\t\tsector->ceilingheight += speed;\r\n\t\t\t\t\t\tflag = P_ChangeSector(sector,crush);\r\n\t\t\t\t\t\t#if 0\r\n\t\t\t\t\t\tif (flag == true)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tsector->ceilingheight = lastpos;\r\n\t\t\t\t\t\t\tP_ChangeSector(sector,crush);\r\n\t\t\t\t\t\t\treturn crushed;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t#endif\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\r\n\t}\r\n\treturn ok;\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tMOVE A FLOOR TO IT'S DESTINATION (UP OR DOWN) */\r\n/* */\r\n/*================================================================== */\r\nvoid T_MoveFloor(floormove_t *floor)//L80018FA8()\r\n{\r\n\tresult_e\tres;\r\n\r\n\tres = T_MovePlane(floor->sector,floor->speed,\r\n\t\t\tfloor->floordestheight,floor->crush,0,floor->direction);\r\n\tif (!(gametic&3))\r\n\t\tS_StartSound((mobj_t *)&floor->sector->soundorg,sfx_stnmov);\r\n\tif (res == pastdest)\r\n\t{\r\n\t\tfloor->sector->specialdata = NULL;\r\n\t\tif (floor->direction == 1)\r\n        {\r\n\t\t\tswitch(floor->type)\r\n\t\t\t{\r\n\t\t\t\tcase donutRaise:\r\n\t\t\t\t\tfloor->sector->special = floor->newspecial;\r\n\t\t\t\t\tfloor->sector->floorpic = floor->texture;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n        }\r\n\t\telse if (floor->direction == -1)\r\n        {\r\n\t\t\tswitch(floor->type)\r\n\t\t\t{\r\n\t\t\t\tcase lowerAndChange:\r\n\t\t\t\t\tfloor->sector->special = floor->newspecial;\r\n\t\t\t\t\tfloor->sector->floorpic = floor->texture;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n        }\r\n\t\tP_RemoveThinker(&floor->thinker);\r\n\t}\r\n\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tHANDLE FLOOR TYPES */\r\n/* */\r\n/*================================================================== */\r\nint EV_DoFloor(line_t *line,floor_e floortype)//L80019098()\r\n{\r\n\tint\t\t\tsecnum;\r\n\tint\t\t\trtn;\r\n\tint\t\t\ti;\r\n\tsector_t\t*sec;\r\n\tfloormove_t\t*floor;\r\n\r\n\tsecnum = -1;\r\n\trtn = 0;\r\n\twhile ((secnum = P_FindSectorFromLineTag(line,secnum)) >= 0)\r\n\t{\r\n\t\tsec = &sectors[secnum];\r\n\r\n\t\t/*\tALREADY MOVING?  IF SO, KEEP GOING... */\r\n\t\tif (sec->specialdata)\r\n\t\t\tcontinue;\r\n\r\n\t\t/* */\r\n\t\t/*\tnew floor thinker */\r\n\t\t/* */\r\n\t\trtn = 1;\r\n\t\tfloor = Z_Malloc (sizeof(*floor), PU_LEVSPEC, 0);\r\n\t\tP_AddThinker (&floor->thinker);\r\n\t\tsec->specialdata = floor;\r\n\t\tfloor->thinker.function = T_MoveFloor;\r\n\t\tfloor->type = floortype;\r\n\t\tfloor->crush = false;\r\n\r\n\t\tswitch(floortype)\r\n\t\t{\r\n\t\t\tcase lowerFloor:\r\n\t\t\t\tfloor->direction = -1;\r\n\t\t\t\tfloor->sector = sec;\r\n\t\t\t\tfloor->speed = FLOORSPEED;\r\n\t\t\t\tfloor->floordestheight = P_FindHighestFloorSurrounding(sec);\r\n\t\t\t\tbreak;\r\n\t\t\tcase lowerFloorToLowest:\r\n\t\t\t\tfloor->direction = -1;\r\n\t\t\t\tfloor->sector = sec;\r\n\t\t\t\tfloor->speed = FLOORSPEED;\r\n\t\t\t\tfloor->floordestheight = P_FindLowestFloorSurrounding(sec);\r\n\t\t\t\tbreak;\r\n\t\t\tcase turboLower:\r\n\t\t\t\tfloor->direction = -1;\r\n\t\t\t\tfloor->sector = sec;\r\n\t\t\t\tfloor->speed = FLOORSPEED * 4;\r\n\t\t\t\tfloor->floordestheight = P_FindHighestFloorSurrounding(sec);\r\n\t\t\t\tif (floor->floordestheight != sec->floorheight)\r\n\t\t\t\t\tfloor->floordestheight += 8 * FRACUNIT;\r\n\t\t\t\tbreak;\r\n\t\t\tcase raiseFloorCrush:\r\n\t\t\t\tfloor->crush = true;\r\n\t\t\tcase raiseFloor:\r\n\t\t\t\tfloor->direction = 1;\r\n\t\t\t\tfloor->sector = sec;\r\n\t\t\t\tfloor->speed = FLOORSPEED;\r\n\t\t\t\tfloor->floordestheight = P_FindLowestCeilingSurrounding(sec);\r\n\t\t\t\tif (floor->floordestheight > sec->ceilingheight)\r\n\t\t\t\t\tfloor->floordestheight = sec->ceilingheight;\r\n\r\n\t\t\t\tif (floortype == raiseFloorCrush)\r\n\t\t\t\t\tfloor->floordestheight -= (8 * FRACUNIT);\r\n\t\t\t\tbreak;\r\n\t\t\tcase raiseFloorToNearest:\r\n\t\t\t\tfloor->direction = 1;\r\n\t\t\t\tfloor->sector = sec;\r\n\t\t\t\tfloor->speed = FLOORSPEED;\r\n\t\t\t\tfloor->floordestheight = P_FindNextHighestFloor(sec,sec->floorheight);\r\n\t\t\t\tbreak;\r\n\t\t\tcase raiseFloor24:\r\n\t\t\t\tfloor->direction = 1;\r\n\t\t\t\tfloor->sector = sec;\r\n\t\t\t\tfloor->speed = FLOORSPEED;\r\n\t\t\t\tfloor->floordestheight = floor->sector->floorheight + 24 * FRACUNIT;\r\n\t\t\t\tbreak;\r\n\t\t\tcase raiseFloor24AndChange:\r\n\t\t\t\tfloor->direction = 1;\r\n\t\t\t\tfloor->sector = sec;\r\n\t\t\t\tfloor->speed = FLOORSPEED;\r\n\t\t\t\tfloor->floordestheight = floor->sector->floorheight + 24 * FRACUNIT;\r\n\t\t\t\tsec->floorpic = line->frontsector->floorpic;\r\n\t\t\t\tsec->special = line->frontsector->special;\r\n\t\t\t\tbreak;\r\n\t\t\tcase raiseToTexture:\r\n\t\t\t\t{\r\n\t\t\t\t\tint\tminsize = MAXINT;\r\n\t\t\t\t\tside_t\t*side;\r\n\r\n\t\t\t\t\tfloor->direction = 1;\r\n\t\t\t\t\tfloor->sector = sec;\r\n\t\t\t\t\tfloor->speed = FLOORSPEED;\r\n\t\t\t\t\tfor (i = 0; i < sec->linecount; i++)\r\n                    {\r\n\t\t\t\t\t\tif (twoSided (secnum, i) )\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tside = getSide(secnum,i,0);\r\n\t\t\t\t\t\t\tif (side->bottomtexture >= 0)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tif ((textures[side->bottomtexture].h << FRACBITS) < minsize)\r\n\t\t\t\t\t\t\t\t\tminsize = (textures[side->bottomtexture].h << FRACBITS);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tside = getSide(secnum,i,1);\r\n\t\t\t\t\t\t\tif (side->bottomtexture >= 0)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tif ((textures[side->bottomtexture].h << FRACBITS) < minsize)\r\n\t\t\t\t\t\t\t\t\tminsize = (textures[side->bottomtexture].h << FRACBITS);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n                    }\r\n\t\t\t\t\tfloor->floordestheight = floor->sector->floorheight + minsize;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase lowerAndChange:\r\n\t\t\t\tfloor->direction = -1;\r\n\t\t\t\tfloor->sector = sec;\r\n\t\t\t\tfloor->speed = FLOORSPEED;\r\n\t\t\t\tfloor->floordestheight = P_FindLowestFloorSurrounding(sec);\r\n\t\t\t\tfloor->texture = sec->floorpic;\r\n\t\t\t\tfor (i = 0; i < sec->linecount; i++)\r\n                {\r\n\t\t\t\t\tif ( twoSided(secnum, i) )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (getSide(secnum,i,0)->sector-sectors == secnum)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tsec = getSector(secnum,i,1);\r\n\t\t\t\t\t\t\tfloor->texture = sec->floorpic;\r\n\t\t\t\t\t\t\tfloor->newspecial = sec->special;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tsec = getSector(secnum,i,0);\r\n\t\t\t\t\t\t\tfloor->texture = sec->floorpic;\r\n\t\t\t\t\t\t\tfloor->newspecial = sec->special;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n                }\r\n\t\t\tdefault:\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\treturn rtn;\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tBUILD A STAIRCASE! */\r\n/* */\r\n/*================================================================== */\r\nint EV_BuildStairs(line_t *line, stair_e type)//L800194E0()\r\n{\r\n\tint\t\tsecnum;\r\n\tint\t\theight;\r\n\tint\t\ti;\r\n\tint\t\tnewsecnum;\r\n\tint\t\ttexture;\r\n\tint\t\tok;\r\n\tint\t\trtn;\r\n\tfixed_t\tstairsize;\r\n    fixed_t\tspeed;\r\n\tsector_t\t*sec, *tsec;\r\n\tfloormove_t\t*floor;\r\n\r\n\r\n\tsecnum = -1;\r\n\trtn = 0;\r\n\twhile ((secnum = P_FindSectorFromLineTag(line,secnum)) >= 0)\r\n\t{\r\n\t\tsec = &sectors[secnum];\r\n\r\n\t\t/* ALREADY MOVING?  IF SO, KEEP GOING... */\r\n\t\tif (sec->specialdata)\r\n\t\t\tcontinue;\r\n\r\n\t\t/* */\r\n\t\t/* new floor thinker */\r\n\t\t/* */\r\n\t\trtn = 1;\r\n\t\tfloor = Z_Malloc (sizeof(*floor), PU_LEVSPEC, 0);\r\n\t\tP_AddThinker (&floor->thinker);\r\n\t\tsec->specialdata = floor;\r\n\t\tfloor->thinker.function = T_MoveFloor;\r\n\t\tfloor->direction = 1;\r\n\t\tfloor->sector = sec;\r\n\r\n\t\tswitch (type)\r\n\t\t{\r\n\t\tcase build8:\r\n\t\t\tspeed = FLOORSPEED / 2;\r\n\t\t\tstairsize = 8 * FRACUNIT;\r\n\t\t\tbreak;\r\n\t\tcase turbo16:\r\n\t\t\tspeed = FLOORSPEED * 2;\r\n\t\t\tstairsize = 16 * FRACUNIT;\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tfloor->speed = speed;\r\n\t\theight = sec->floorheight + stairsize;\r\n\t\tfloor->floordestheight = height;\r\n\r\n\t\ttexture = sec->floorpic;\r\n\r\n\t\t/* */\r\n\t\t/* Find next sector to raise */\r\n\t\t/* 1.\tFind 2-sided line with same sector side[0] */\r\n\t\t/* 2.\tOther side is the next sector to raise */\r\n\t\t/* */\r\n\t\tdo\r\n\t\t{\r\n\t\t\tok = 0;\r\n\t\t\tfor (i = 0;i < sec->linecount;i++)\r\n\t\t\t{\r\n\t\t\t\tif ( !((sec->lines[i])->flags & ML_TWOSIDED) )\r\n\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\ttsec = (sec->lines[i])->frontsector;\r\n\t\t\t\tnewsecnum = tsec-sectors;\r\n\t\t\t\tif (secnum != newsecnum)\r\n\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\ttsec = (sec->lines[i])->backsector;\r\n\t\t\t\tnewsecnum = tsec - sectors;\r\n\t\t\t\tif (tsec->floorpic != texture)\r\n\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\theight += stairsize;\r\n\t\t\t\tif (tsec->specialdata)\r\n\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\tsec = tsec;\r\n\t\t\t\tsecnum = newsecnum;\r\n\t\t\t\tfloor = Z_Malloc (sizeof(*floor), PU_LEVSPEC, 0);\r\n\t\t\t\tP_AddThinker (&floor->thinker);\r\n\t\t\t\tsec->specialdata = floor;\r\n\t\t\t\tfloor->thinker.function = T_MoveFloor;\r\n\t\t\t\tfloor->direction = 1;\r\n\t\t\t\tfloor->sector = sec;\r\n\t\t\t\tfloor->speed = speed;\r\n\t\t\t\tfloor->floordestheight = height;\r\n\t\t\t\tok = 1;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t} while(ok);\r\n\t}\r\n\treturn rtn;\r\n}\r\n\r\n"
  },
  {
    "path": "PSXDOOM/p_inter.c",
    "content": "/* P_inter.c */\r\n\r\n\r\n#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n#include \"st_main.h\"\r\n\r\n#define\tBONUSADD\t\t4\r\n\r\n/* a weapon is found with two clip loads, a big item has five clip loads */\r\nint\t\tmaxammo[NUMAMMO] = {200, 50, 300, 50};//80066F04\r\nint\t\tclipammo[NUMAMMO] = {10, 4, 20, 1};//80066f14\r\n\r\n/*\r\n===============================================================================\r\n\r\n\t\t\t\t\t\t\tGET STUFF\r\n\r\n===============================================================================\r\n*/\r\n\r\n/*\r\n===================\r\n=\r\n= P_GiveAmmo\r\n=\r\n= Num is the number of clip loads, not the individual count (0= 1/2 clip)\r\n= Returns false if the ammo can't be picked up at all\r\n===================\r\n*/\r\n\r\nboolean P_GiveAmmo (player_t *player, ammotype_t ammo, int num)//L8001973C()\r\n{\r\n\tint\t\toldammo;\r\n\r\n\tif (ammo == am_noammo)\r\n\t\treturn false;\r\n\r\n\tif (ammo > NUMAMMO)\r\n\t\tI_Error (\"P_GiveAmmo: bad type %i\", ammo);\r\n\r\n\tif ( player->ammo[ammo] == player->maxammo[ammo]  )\r\n\t\treturn false;\r\n\r\n\tif (num)\r\n\t\tnum *= clipammo[ammo];\r\n\telse\r\n\t\tnum = clipammo[ammo]/2;\r\n\r\n\tif (gameskill == sk_baby)\r\n\t\tnum <<= 1;\t\t\t/* give double ammo in trainer mode */\r\n\r\n\toldammo = player->ammo[ammo];\r\n\tplayer->ammo[ammo] += num;\r\n\tif (player->ammo[ammo] > player->maxammo[ammo])\r\n\t\tplayer->ammo[ammo] = player->maxammo[ammo];\r\n\r\n\tif (oldammo)\r\n\t\treturn true;\t\t/* don't change up weapons, player was lower on */\r\n\t\t\t\t\t\t\t/* purpose */\r\n\r\n\tswitch (ammo)\r\n\t{\r\n\tcase am_clip:\r\n\t\tif (player->readyweapon == wp_fist)\r\n\t\t{\r\n\t\t\tif (player->weaponowned[wp_chaingun])\r\n\t\t\t\tplayer->pendingweapon = wp_chaingun;\r\n\t\t\telse\r\n\t\t\t\tplayer->pendingweapon = wp_pistol;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase am_shell:\r\n\t\tif (player->readyweapon == wp_fist || player->readyweapon == wp_pistol)\r\n\t\t{\r\n\t\t\tif (player->weaponowned[wp_shotgun])\r\n\t\t\t\tplayer->pendingweapon = wp_shotgun;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase am_cell:\r\n\t\tif (player->readyweapon == wp_fist || player->readyweapon == wp_pistol)\r\n\t\t{\r\n\t\t\tif (player->weaponowned[wp_plasma])\r\n\t\t\t\tplayer->pendingweapon = wp_plasma;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase am_misl:\r\n\t\tif (player->readyweapon == wp_fist)\r\n\t\t{\r\n\t\t\tif (player->weaponowned[wp_missile])\r\n\t\t\t\tplayer->pendingweapon = wp_missile;\r\n\t\t}\r\n\tdefault:\r\n\t\tbreak;\r\n\t}\r\n\r\n\treturn true;\r\n}\r\n\r\n\r\n/*\r\n===================\r\n=\r\n= P_GiveWeapon\r\n=\r\n= The weapon name may have a MF_DROPPED flag ored in\r\n===================\r\n*/\r\n\r\nboolean P_GiveWeapon (player_t *player, weapontype_t weapon, boolean dropped)//L80019924()\r\n{\r\n\tboolean\t\tgaveammo, gaveweapon;\r\n\r\n\tif (netgame == gt_coop && !dropped)\r\n\t{\t/* leave placed weapons forever on cooperative net games */\r\n\t\tif (player->weaponowned[weapon])\r\n\t\t\treturn false;\r\n\t\tplayer->weaponowned[weapon] = true;\r\n\t\tP_GiveAmmo (player, weaponinfo[weapon].ammo, 2);\r\n\t\tplayer->pendingweapon = weapon;\r\n\t\tS_StartSound (player->mo, sfx_wpnup);\r\n\t\treturn false;\r\n\t}\r\n\r\n\tif (weaponinfo[weapon].ammo != am_noammo)\r\n\t{\t/* give one clip with a dropped weapon, two clips with a found weapon */\r\n\t\tif (dropped)\r\n\t\t\tgaveammo = P_GiveAmmo (player, weaponinfo[weapon].ammo, 1);\r\n\t\telse\r\n\t\t\tgaveammo = P_GiveAmmo (player, weaponinfo[weapon].ammo, 2);\r\n\t}\r\n\telse\r\n\t\tgaveammo = false;\r\n\r\n\tif (player->weaponowned[weapon])\r\n\t\tgaveweapon = false;\r\n\telse\r\n\t{\r\n\t\tgaveweapon = true;\r\n\t\tplayer->weaponowned[weapon] = true;\r\n\t\tplayer->pendingweapon = weapon;\r\n\t\tif (player == &players[consoleplayer])\r\n\t\t\tstbar.specialFace = f_gotgat;\r\n\t}\r\n\r\n\treturn gaveweapon || gaveammo;\r\n}\r\n\r\n\r\n\r\n/*\r\n===================\r\n=\r\n= P_GiveBody\r\n=\r\n= Returns false if the body isn't needed at all\r\n===================\r\n*/\r\n//inline\r\nboolean P_GiveBody (player_t *player, int num)//L80019A8C()\r\n{\r\n\tif (player->health >= MAXHEALTH)\r\n\t\treturn false;\r\n\r\n\tplayer->health += num;\r\n\tif (player->health > MAXHEALTH)\r\n\t\tplayer->health = MAXHEALTH;\r\n\tplayer->mo->health = player->health;\r\n\r\n\treturn true;\r\n}\r\n\r\n\r\n/*\r\n===================\r\n=\r\n= P_GiveArmor\r\n=\r\n= Returns false if the armor is worse than the current armor\r\n===================\r\n*/\r\n//inline\r\nboolean P_GiveArmor (player_t *player, int armortype)//L80019AD8()\r\n{\r\n\tint\t\thits;\r\n\r\n\thits = armortype*100;\r\n\tif (player->armorpoints >= hits)\r\n\t\treturn false;\t\t/* don't pick up */\r\n\r\n\tplayer->armortype = armortype;\r\n\tplayer->armorpoints = hits;\r\n\r\n\treturn true;\r\n}\r\n\r\n\r\n/*\r\n===================\r\n=\r\n= P_GiveCard\r\n=\r\n===================\r\n*/\r\n//inline\r\nvoid P_GiveCard (player_t *player, card_t card)//L80019B14()\r\n{\r\n\tif (player->cards[card])\r\n\t\treturn;\r\n\tplayer->bonuscount = BONUSADD;\r\n\tplayer->cards[card] = true;\r\n}\r\n\r\n\r\n/*\r\n===================\r\n=\r\n= P_GivePower\r\n=\r\n===================\r\n*/\r\n//inline\r\nboolean P_GivePower (player_t *player, powertype_t power)//L80019B40()\r\n{\r\n    if(power >= NUMPOWERS)\r\n        return false;\r\n\r\n\tswitch (power)\r\n\t{\r\n\tcase pw_invulnerability:\r\n\t\tplayer->powers[power] = INVULNTICS;\r\n\t\treturn true;\r\n\tcase pw_invisibility:\r\n\t\tplayer->powers[power] = INVISTICS;\r\n\t\tplayer->mo->flags |= (MF_BLENDMASK1 | MF_BLENDMASK2 | MF_BLENDMASK3);\r\n\t\treturn true;\r\n\tcase pw_infrared:\r\n\t\tplayer->powers[power] = INFRATICS;\r\n\t\treturn true;\r\n\tcase pw_ironfeet:\r\n\t\tplayer->powers[power] = IRONTICS;\r\n\t\treturn true;\r\n\tcase pw_strength:\r\n\t\tP_GiveBody(player, 100);\r\n\t\tplayer->powers[power] = 1;\r\n\t\treturn true;\r\n\tdefault:\r\n\t\tbreak;\r\n\t}\r\n    //pw_allmap\r\n\tif (player->powers[power])\r\n\t\treturn false;\t\t/* already got it */\r\n\r\n\tplayer->powers[power] = 1;\r\n\treturn true;\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= P_TouchSpecialThing\r\n=\r\n==================\r\n*/\r\n\r\nvoid P_TouchSpecialThing (mobj_t *special, mobj_t *toucher)//L80019C24()\r\n{\r\n\tplayer_t\t*player;\r\n\tint\t\t\ti;\r\n\tfixed_t\t\tdelta;\r\n\tint\t\t\tsound;\r\n\r\n\tdelta = special->z - toucher->z;\r\n\tif (delta > toucher->height || delta < -8*FRACUNIT)\r\n\t\treturn;\t\t\t/* out of reach */\r\n\r\n\tsound = sfx_itemup;\r\n\tplayer = toucher->player;\r\n\tif (toucher->health <= 0)\r\n\t\treturn;\t\t\t\t\t\t/* can happen with a sliding player corpse */\r\n\r\n\tswitch (special->sprite)\r\n\t{\r\n\t/* */\r\n\t/* bonus items */\r\n\t/* */\r\n\tcase SPR_BON1:\r\n\t\tplayer->health+=2;\t\t/* can go over 100% */\r\n\t\tif (player->health > 200)\r\n\t\t\tplayer->health = 200;\r\n\t\tplayer->mo->health = player->health;\r\n\t\tplayer->message = \"You pick up a health bonus.\";\r\n\t\tbreak;\r\n\tcase SPR_BON2:\r\n\t\tplayer->armorpoints+=2;\t\t/* can go over 100% */\r\n\t\tif (player->armorpoints > 200)\r\n\t\t\tplayer->armorpoints = 200;\r\n\t\tif (!player->armortype)\r\n\t\t\tplayer->armortype = 1;\r\n\t\tplayer->message = \"You pick up an armor bonus.\";\r\n\t\tbreak;\r\n\tcase SPR_SOUL:\r\n\t\tplayer->health += 100;\r\n\t\tif (player->health > 200)\r\n\t\t\tplayer->health = 200;\r\n\t\tplayer->mo->health = player->health;\r\n\t\tplayer->message = \"Supercharge!\";\r\n\t\tsound = sfx_getpow;\r\n\t\tbreak;\r\n\tcase SPR_MEGA:\r\n\t\tplayer->health = 200;\r\n\t\tplayer->mo->health = 200;\r\n\t\tP_GiveArmor(player, 2);\r\n\t\tplayer->message = \"Mega Sphere!\";\r\n\t\tsound = sfx_getpow;\r\n\t\tbreak;\r\n\r\n\t/* */\r\n\t/* ammo */\r\n\t/* */\r\n\tcase SPR_CLIP:\r\n\t\tif (special->flags & MF_DROPPED)\r\n\t\t{\r\n\t\t\tif (!P_GiveAmmo (player,am_clip,0))\r\n\t\t\t\treturn;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif (!P_GiveAmmo (player,am_clip,1))\r\n\t\t\t\treturn;\r\n\t\t}\r\n\t\tplayer->message = \"Picked up a clip.\";\r\n\t\tbreak;\r\n\tcase SPR_AMMO:\r\n\t\tif (!P_GiveAmmo (player, am_clip,5))\r\n\t\t\treturn;\r\n\t\tplayer->message = \"Picked up a box of bullets.\";\r\n\t\tbreak;\r\n\tcase SPR_ROCK:\r\n\t\tif (!P_GiveAmmo (player, am_misl,1))\r\n\t\t\treturn;\r\n\t\tplayer->message = \"Picked up a rocket.\";\r\n\t\tbreak;\r\n\tcase SPR_BROK:\r\n\t\tif (!P_GiveAmmo (player, am_misl,5))\r\n\t\t\treturn;\r\n\t\tplayer->message = \"Picked up a box of rockets.\";\r\n\t\tbreak;\r\n\tcase SPR_CELL:\r\n\t\tif (!P_GiveAmmo (player, am_cell,1))\r\n\t\t\treturn;\r\n\t\tplayer->message = \"Picked up an energy cell.\";\r\n\t\tbreak;\r\n\tcase SPR_CELP:\r\n\t\tif (!P_GiveAmmo (player, am_cell,5))\r\n\t\t\treturn;\r\n\t\tplayer->message = \"Picked up an energy cell pack.\";\r\n\t\tbreak;\r\n\tcase SPR_SHEL:\r\n\t\tif (!P_GiveAmmo (player, am_shell,1))\r\n\t\t\treturn;\r\n\t\tplayer->message = \"Picked up 4 shotgun shells.\";\r\n\t\tbreak;\r\n\tcase SPR_SBOX:\r\n\t\tif (!P_GiveAmmo (player, am_shell,5))\r\n\t\t\treturn;\r\n\t\tplayer->message = \"Picked up a box of shells.\";\r\n\t\tbreak;\r\n\tcase SPR_BPAK:\r\n\t\tif (!player->backpack)\r\n\t\t{\r\n\t\t\tfor (i=0 ; i<NUMAMMO ; i++)\r\n\t\t\t\tplayer->maxammo[i] *= 2;\r\n\t\t\tplayer->backpack = true;\r\n\t\t}\r\n\t\tfor (i=0 ; i<NUMAMMO ; i++)\r\n\t\t\tP_GiveAmmo (player, i, 1);\r\n\t\tplayer->message = \"You got the backpack!\";\r\n\t\tbreak;\r\n\r\n\r\n\t/* */\r\n\t/* weapons */\r\n\t/* */\r\n\tcase SPR_BFUG:\r\n\t\tif (!P_GiveWeapon (player, wp_bfg, false) )\r\n\t\t\treturn;\r\n\t\tplayer->message = \"You got the BFG9000!  Oh, yes.\";\r\n\t\tsound = sfx_wpnup;\r\n\t\tbreak;\r\n\tcase SPR_MGUN:\r\n\t\tif (!P_GiveWeapon (player, wp_chaingun, special->flags&MF_DROPPED) )\r\n\t\t\treturn;\r\n\t\tplayer->message = \"You got the chaingun!\";\r\n\t\tsound = sfx_wpnup;\r\n\t\tbreak;\r\n\tcase SPR_CSAW:\r\n\t\tif (!P_GiveWeapon (player, wp_chainsaw, false) )\r\n\t\t\treturn;\r\n\t\tplayer->message = \"A chainsaw!  Find some meat!\";\r\n\t\tsound = sfx_wpnup;\r\n\t\tbreak;\r\n\tcase SPR_LAUN:\r\n\t\tif (!P_GiveWeapon (player, wp_missile, false) )\r\n\t\t\treturn;\r\n\t\tplayer->message = \"You got the rocket launcher!\";\r\n\t\tsound = sfx_wpnup;\r\n\t\tbreak;\r\n\tcase SPR_PLAS:\r\n\t\tif (!P_GiveWeapon (player, wp_plasma, false) )\r\n\t\t\treturn;\r\n\t\tplayer->message = \"You got the plasma gun!\";\r\n\t\tsound = sfx_wpnup;\r\n\t\tbreak;\r\n\tcase SPR_SHOT:\r\n\t\tif (!P_GiveWeapon (player, wp_shotgun, special->flags&MF_DROPPED ) )\r\n\t\t\treturn;\r\n\t\tplayer->message = \"You got the shotgun!\";\r\n\t\tsound = sfx_wpnup;\r\n\t\tbreak;\r\n\tcase SPR_SGN2:\r\n\t\tif (!P_GiveWeapon(player, wp_supershotgun, special->flags&MF_DROPPED))\r\n\t\t\treturn;\r\n\t\tplayer->message = \"You got the super shotgun!\";\r\n\t\tsound = sfx_wpnup;\r\n\t\tbreak;\r\n\r\n\t\t/* */\r\n\t\t/* armor */\r\n\t\t/* */\r\n\tcase SPR_ARM1:\r\n\t\tif (!P_GiveArmor(player, 1))\r\n\t\t\treturn;\r\n\t\tplayer->message = \"You pick up the armor.\";\r\n\t\tbreak;\r\n\r\n\tcase SPR_ARM2:\r\n\t\tif (!P_GiveArmor(player, 2))\r\n\t\t\treturn;\r\n\t\tplayer->message = \"You got the MegaArmor!\";\r\n\t\tbreak;\r\n\r\n\t\t/* */\r\n\t\t/* cards */\r\n\t\t/* leave cards for everyone */\r\n\t\t/* */\r\n\tcase SPR_BKEY:\r\n\t\tif (!player->cards[it_bluecard])\r\n\t\t\tplayer->message = \"You pick up a blue keycard.\";\r\n\t\tP_GiveCard(player, it_bluecard);\r\n\t\tif (!netgame)\r\n\t\t\tbreak;\r\n\t\treturn;\r\n    case SPR_RKEY:\r\n\t\tif (!player->cards[it_redcard])\r\n\t\t\tplayer->message = \"You pick up a red keycard.\";\r\n\t\tP_GiveCard(player, it_redcard);\r\n\t\tif (!netgame)\r\n\t\t\tbreak;\r\n\t\treturn;\r\n\tcase SPR_YKEY:\r\n\t\tif (!player->cards[it_yellowcard])\r\n\t\t\tplayer->message = \"You pick up a yellow keycard.\";\r\n\t\tP_GiveCard(player, it_yellowcard);\r\n\t\tif (!netgame)\r\n\t\t\tbreak;\r\n\t\treturn;\r\n\tcase SPR_BSKU:\r\n\t\tif (!player->cards[it_blueskull])\r\n\t\t\tplayer->message = \"You pick up a blue skull key.\";\r\n\t\tP_GiveCard(player, it_blueskull);\r\n\t\tif (!netgame)\r\n\t\t\tbreak;\r\n\t\treturn;\r\n    case SPR_RSKU:\r\n\t\tif (!player->cards[it_redskull])\r\n\t\t\tplayer->message = \"You pick up a red skull key.\";\r\n\t\tP_GiveCard(player, it_redskull);\r\n\t\tif (!netgame)\r\n\t\t\tbreak;\r\n\t\treturn;\r\n\tcase SPR_YSKU:\r\n\t\tif (!player->cards[it_yellowskull])\r\n\t\t\tplayer->message = \"You pick up a yellow skull key.\";\r\n\t\tP_GiveCard(player, it_yellowskull);\r\n\t\tif (!netgame)\r\n\t\t\tbreak;\r\n\t\treturn;\r\n\r\n\t\t/* */\r\n\t\t/* heals */\r\n\t\t/* */\r\n\tcase SPR_STIM:\r\n\t\tif (!P_GiveBody(player, 10))\r\n\t\t\treturn;\r\n\t\tplayer->message = \"You pick up a stimpack.\";\r\n\t\tbreak;\r\n\tcase SPR_MEDI:\r\n\t\tif (!P_GiveBody(player, 25))\r\n\t\t\treturn;\r\n\t\tif (player->health < 25)\r\n\t\t\tplayer->message = \"You pick up a medikit that you REALLY need!\";\r\n\t\telse\r\n\t\t\tplayer->message = \"You pick up a medikit.\";\r\n\t\tbreak;\r\n\r\n\t\t/* */\r\n\t\t/* power ups */\r\n\t\t/* */\r\n\tcase SPR_PINV:\r\n\t\tP_GivePower(player, pw_invulnerability);\r\n\t\tplayer->message = \"Invulnerability!\";\r\n\t\tsound = sfx_getpow;\r\n\t\tbreak;\r\n\tcase SPR_PSTR:\r\n\t\tP_GivePower(player, pw_strength);\r\n\t\tplayer->message = \"Berserk!\";\r\n\t\tif (player->readyweapon != wp_fist)\r\n\t\t\tplayer->pendingweapon = wp_fist;\r\n\t\tsound = sfx_getpow;\r\n\t\tbreak;\r\n\tcase SPR_PINS:\r\n\t\tP_GivePower(player, pw_invisibility);\r\n\t\tplayer->message = \"Partial Invisibility!\";\r\n\t\tsound = sfx_getpow;\r\n\t\tbreak;\r\n\tcase SPR_SUIT:\r\n\t\tP_GivePower(player, pw_ironfeet);\r\n\t\tplayer->message = \"Radiation Shielding Suit\";\r\n\t\tsound = sfx_getpow;\r\n\t\tbreak;\r\n\tcase SPR_PMAP:\r\n\t\tif (!P_GivePower(player, pw_allmap))\r\n\t\t\treturn;\r\n\t\tplayer->message = \"Computer Area Map\";\r\n\t\tsound = sfx_getpow;\r\n\t\tbreak;\r\n\tcase SPR_PVIS:\r\n\t\tP_GivePower(player, pw_infrared);\r\n\t\tplayer->message = \"Light Amplification Goggles\";\r\n\t\tsound = sfx_getpow;\r\n\t\tbreak;\r\n\r\n\tdefault:\r\n\t\t//I_Error(\"P_SpecialThing: Unknown gettable thing\");\r\n\t\tbreak;\r\n\t}\r\n\r\n\tif (special->flags & MF_COUNTITEM)\r\n\t\tplayer->itemcount++;\r\n\r\n\tP_RemoveMobj (special);\r\n\tplayer->bonuscount += BONUSADD;\r\n\r\n\t//[GEC] Info: (NULL parameter) This is the reason why items always sound echo when picked up.\r\n\tif (player == &players[consoleplayer])\r\n\t\tS_StartSound(NULL, sound);//S_StartSound (toucher, sound);\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= KillMobj\r\n=\r\n==============\r\n*/\r\n\r\nvoid P_KillMobj (mobj_t *source, mobj_t *target)//L8001A514()\r\n{\r\n\tmobjtype_t\t\titem;\r\n\tmobj_t\t\t\t*mo;\r\n\tboolean         forceXdeath;\r\n\r\n\ttarget->flags &= ~(MF_SHOOTABLE|MF_FLOAT|MF_SKULLFLY);\r\n\r\n\tif (target->type != MT_SKULL)\r\n\t\ttarget->flags &= ~MF_NOGRAVITY;\r\n\r\n\ttarget->flags |= MF_CORPSE|MF_DROPOFF;\r\n\ttarget->height >>= 2;\r\n\r\n\tforceXdeath = false;    //New PsxDoom\r\n\r\n\tif (target->player)\r\n\t{\t/* a frag of one sort or another */\r\n\t\tif (!source || !source->player || source->player == target->player)\r\n\t\t{\t/* killed self somehow */\r\n\t\t\ttarget->player->frags--;\r\n\t\t\t//if (target->player->frags < 0)\r\n\t\t\t\t//target->player->frags = 0;\r\n\t\t}\r\n\t\telse\r\n\t\t{\t/* killed by other player */\r\n\t\t\tsource->player->frags++;\r\n\t\t}\r\n\r\n\t\t/* else just killed by a monster */\r\n\t}\r\n\telse if (source && source->player && (target->flags & MF_COUNTKILL) )\r\n\t{\t/* a deliberate kill by a player */\r\n\t\tsource->player->killcount++;\t\t/* count for intermission */\r\n\t}\r\n\telse if (!netgame && (target->flags & MF_COUNTKILL) )\r\n\t\tplayers[0].killcount++;\t\t\t/* count all monster deaths, even */\r\n\t\t\t\t\t\t\t\t\t\t/* those caused by other monsters */\r\n\r\n\tif (target->player)\r\n\t{\r\n\t\ttarget->flags &= ~MF_SOLID;\r\n\t\ttarget->player->playerstate = PST_DEAD;\r\n\t\tP_DropWeapon (target->player);\r\n\t\tif (target->health < -50)\r\n\t\t{\r\n\t\t    forceXdeath = true; //Force the player to the state of Xdeath\r\n\r\n\t\t\tif (target->player == &players[consoleplayer])\r\n\t\t\t\tstbar.gotgibbed = true;\r\n\t\t\tS_StartSound (target, sfx_slop);\r\n\t\t}\r\n\t\telse\r\n\t\t\tS_StartSound (target, sfx_pldeth);\r\n\r\n\t\t// Psx Doom New\r\n\t\tif (playercounttarget >= MAXTARGET)\r\n\t\t\tP_RemoveMobj(playertarget[playercounttarget & (MAXTARGET-1)]);\r\n\r\n\t\tplayertarget[playercounttarget & (MAXTARGET-1)] = target;\r\n\t\tplayercounttarget++;\r\n\t}\r\n\r\n\tif (forceXdeath || (target->health < -target->info->spawnhealth) && target->info->xdeathstate)\r\n\t\tP_SetMobjState (target, target->info->xdeathstate);\r\n\telse\r\n\t\tP_SetMobjState (target, target->info->deathstate);\r\n\r\n\ttarget->tics -= P_Random()&1;\r\n\tif (target->tics < 1)\r\n\t\ttarget->tics = 1;\r\n\r\n\t/* */\r\n\t/* drop stuff */\r\n\t/* */\r\n\tswitch (target->type)\r\n\t{\r\n\tcase MT_POSSESSED:\r\n\t\titem = MT_CLIP;\r\n\t\tbreak;\r\n\tcase MT_SHOTGUY:\r\n\t\titem = MT_SHOTGUN;\r\n\t\tbreak;\r\n\tcase MT_CHAINGUY:\r\n\t\titem = MT_CHAINGUN;\r\n\t\tbreak;\r\n\tdefault:\r\n\t\treturn;\r\n\t}\r\n\r\n\tmo = P_SpawnMobj (target->x,target->y,ONFLOORZ, item);\r\n\tmo->flags |= MF_DROPPED;\t\t/* special versions of items */\r\n}\r\n\r\n\r\n\r\n/*\r\n=================\r\n=\r\n= P_DamageMobj\r\n=\r\n= Damages both enemies and players\r\n= inflictor is the thing that caused the damage\r\n= \t\tcreature or missile, can be NULL (slime, etc)\r\n= source is the thing to target after taking damage\r\n=\t\tcreature or NULL\r\n= Source and inflictor are the same for melee attacks\r\n= source can be null for barrel explosions and other environmental stuff\r\n==================\r\n*/\r\n\r\nvoid P_DamageMobj (mobj_t *target, mobj_t *inflictor, mobj_t *source, int damage)//L8001A838()\r\n{\r\n\tunsigned\tang, an;\r\n\tint\t\t\tsaved;\r\n\tplayer_t\t*player;\r\n\tfixed_t\t\tthrust;\r\n\r\n\tif (!(target->flags & MF_SHOOTABLE))\r\n\t\treturn;\t\t\t\t\t\t/* shouldn't happen... */\r\n\r\n\tif (target->health <= 0)\r\n\t\treturn;\r\n\r\n\tif (target->flags & MF_SKULLFLY)\r\n\t{\r\n\t\ttarget->momx = target->momy = target->momz = 0;\r\n\t}\r\n\r\n\tplayer = target->player;\r\n\tif (player && gameskill == sk_baby)\r\n\t\tdamage >>= 1;\t\t\t\t/* take half damage in trainer mode */\r\n\r\n\tif (player && (damage > 30) && player == &players[consoleplayer])\r\n\t\tstbar.specialFace = f_hurtbad;\r\n\t/* */\r\n\t/* kick away unless using the chainsaw */\r\n\t/* */\r\n\tif (inflictor && (!source || !source->player || source->player->readyweapon != wp_chainsaw))\r\n\t{\r\n\t\tang = R_PointToAngle2 (inflictor->x, inflictor->y, target->x, target->y);\r\n\r\n\t\tthrust = (damage * ((FRACUNIT >> 2) * 100)) / target->info->mass;\r\n\r\n\t\t/* make fall forwards sometimes */\r\n\t\tif ( (damage < 40) && (damage > target->health) && (target->z - inflictor->z > (64*FRACUNIT)) && (P_Random ()&1))\r\n\t\t{\r\n\t\t\tang += ANG180;\r\n\t\t\tthrust *= 4;\r\n\t\t}\r\n\r\n\t\tan = ang >> ANGLETOFINESHIFT;\r\n\t\tthrust >>= 16;\r\n\t\ttarget->momx += thrust * finecosine[an];\r\n\t\ttarget->momy += thrust * finesine[an];\r\n\r\n\t\tif (target->player)//psx new\r\n\t\t{\r\n            if (target->momx > MAXMOVE)\r\n                target->momx = MAXMOVE;\r\n            else if (target->momx < -MAXMOVE)\r\n                target->momx = -MAXMOVE;\r\n\r\n            if (target->momy > MAXMOVE)\r\n                target->momy = MAXMOVE;\r\n            else if (target->momy < -MAXMOVE)\r\n                target->momy = -MAXMOVE;\r\n\t\t}\r\n\t}\r\n\telse\r\n    {\r\n\t\tang = target->angle;\r\n    }\r\n\r\n\t/* */\r\n\t/* player specific */\r\n\t/* */\r\n\tif (player)\r\n\t{\r\n\t\tif ((player->cheats&CF_GODMODE) || player->powers[pw_invulnerability])\r\n\t\t\treturn;\r\n\r\n\t\tif (player == &players[consoleplayer])\r\n\t\t{\r\n\t\t\tang -= target->angle;\r\n\t\t\tif (ang > 0x30000000 && ang <0x80000000)\r\n\t\t\t\tstbar.specialFace = f_faceright;\r\n\t\t\telse if (ang >0x80000000 && ang < 0xd0000000)\r\n\t\t\t\tstbar.specialFace = f_faceleft;\r\n\t\t}\r\n\t\tif (player->armortype)\r\n\t\t{\r\n\t\t\tif (player->armortype == 1)\r\n\t\t\t\tsaved = damage/3;\r\n\t\t\telse\r\n\t\t\t\tsaved = damage/2;\r\n\t\t\tif (player->armorpoints <= saved)\r\n\t\t\t{\t/* armor is used up */\r\n\t\t\t\tsaved = player->armorpoints;\r\n\t\t\t\tplayer->armortype = 0;\r\n\t\t\t}\r\n\t\t\tplayer->armorpoints -= saved;\r\n\t\t\tdamage -= saved;\r\n\t\t}\r\n\t\tS_StartSound (target,sfx_plpain);\r\n\t\tplayer->health -= damage;\t\t/* mirror mobj health here for Dave */\r\n\t\tif (player->health < 0)\r\n\t\t\tplayer->health = 0;\r\n\t\tplayer->attacker = source;\r\n\r\n\t\t// Tweak made in PSX version: add '1' here so that all damage causes a palette flash\r\n        player->damagecount += 1 + (damage>>1);\t/* add damage after armor / invuln */\r\n\t}\r\n\r\n\t/* */\r\n\t/* do the damage */\r\n\t/* */\r\n\ttarget->health -= damage;\r\n\tif (target->health <= 0)\r\n\t{\r\n\t\tP_KillMobj (source, target);\r\n\t\treturn;\r\n\t}\r\n\r\n\tif ( (P_Random () < target->info->painchance) && !(target->flags&MF_SKULLFLY) )\r\n\t{\r\n\t\ttarget->flags |= MF_JUSTHIT;\t\t/* fight back! */\r\n\t\tP_SetMobjState (target, target->info->painstate);\r\n\t}\r\n\r\n\ttarget->reactiontime = 0;\t\t/* we're awake now...\t */\r\n\tif (!target->threshold && source)\r\n\t{\t/* if not intent on another player, chase after this one */\r\n\t\ttarget->target = source;\r\n\t\ttarget->threshold = BASETHRESHOLD;\r\n\t\tif (target->state == &states[target->info->spawnstate] && target->info->seestate != S_NULL)\r\n        {\r\n\t\t\tP_SetMobjState (target, target->info->seestate);\r\n        }\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "PSXDOOM/p_lights.c",
    "content": "#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n\r\n/*================================================================== */\r\n/*================================================================== */\r\n/* */\r\n/*\t\t\t\t\t\t\tBROKEN LIGHT FLASHING */\r\n/* */\r\n/*================================================================== */\r\n/*================================================================== */\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tT_FireFlicker */\r\n/* */\r\n/*\tExclusive Psx Doom From PC Doom */\r\n/* */\r\n/*================================================================== */\r\n\r\nvoid T_FireFlicker(fireflicker_t *flick)//L8001AD0C()\r\n{\r\n\tint\tamount;\r\n\r\n\tif (--flick->count)\r\n\t\treturn;\r\n\r\n\tamount = (P_Random() & 3) * 16;\r\n\r\n\tif (flick->sector->lightlevel - amount < flick->minlight)\r\n\t\tflick->sector->lightlevel = flick->minlight;\r\n\telse\r\n\t\tflick->sector->lightlevel = flick->maxlight - amount;\r\n\r\n\tflick->count = 3;\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tP_SpawnFireFlicker */\r\n/* */\r\n/*\tExclusive Psx Doom From PC Doom */\r\n/* */\r\n/*================================================================== */\r\n\r\nvoid P_SpawnFireFlicker(sector_t *sector)//L8001AD98()\r\n{\r\n\tfireflicker_t *flick;\r\n\r\n\tsector->special = 0; /* nothing special about it during gameplay */\r\n\r\n\tflick = Z_Malloc(sizeof(*flick), PU_LEVSPEC, 0);\r\n\tP_AddThinker(&flick->thinker);\r\n\tflick->thinker.function = T_FireFlicker;\r\n\tflick->sector = sector;\r\n\tflick->maxlight = sector->lightlevel;\r\n\tflick->minlight = P_FindMinSurroundingLight(sector, sector->lightlevel) + 16;\r\n\tflick->count = 3;\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tT_LightFlash */\r\n/* */\r\n/*\tAfter the map has been loaded, scan each sector for specials */\r\n/*\tthat spawn thinkers */\r\n/* */\r\n/*================================================================== */\r\nvoid T_LightFlash (lightflash_t *flash)//L8001AE24()\r\n{\r\n\tif (--flash->count)\r\n\t\treturn;\r\n\r\n\tif (flash->sector->lightlevel == flash->maxlight)\r\n\t{\r\n\t\tflash-> sector->lightlevel = flash->minlight;\r\n\t\tflash->count = (P_Random()&flash->mintime)+1;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tflash-> sector->lightlevel = flash->maxlight;\r\n\t\tflash->count = (P_Random()&flash->maxtime)+1;\r\n\t}\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tP_SpawnLightFlash */\r\n/* */\r\n/*\tAfter the map has been loaded, scan each sector for specials that spawn thinkers */\r\n/* */\r\n/*================================================================== */\r\nvoid P_SpawnLightFlash (sector_t *sector)//L8001AEAC()\r\n{\r\n\tlightflash_t\t*flash;\r\n\r\n\tsector->special = 0;\t\t/* nothing special about it during gameplay */\r\n\r\n\tflash = Z_Malloc ( sizeof(*flash), PU_LEVSPEC, 0);\r\n\tP_AddThinker (&flash->thinker);\r\n\tflash->thinker.function = T_LightFlash;\r\n\tflash->sector = sector;\r\n\tflash->maxlight = sector->lightlevel;\r\n\r\n\tflash->minlight = P_FindMinSurroundingLight(sector,sector->lightlevel);\r\n\tflash->maxtime = 64;\r\n\tflash->mintime = 7;\r\n\tflash->count = (P_Random()&flash->maxtime)+1;\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\t\t\t\t\t\t\tSTROBE LIGHT FLASHING */\r\n/* */\r\n/*================================================================== */\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tT_StrobeFlash */\r\n/* */\r\n/*\tAfter the map has been loaded, scan each sector for specials that spawn thinkers */\r\n/* */\r\n/*================================================================== */\r\nvoid T_StrobeFlash (strobe_t *flash)//L8001AF54()\r\n{\r\n\tif (--flash->count)\r\n\t\treturn;\r\n\r\n\tif (flash->sector->lightlevel == flash->minlight)\r\n\t{\r\n\t\tflash-> sector->lightlevel = flash->maxlight;\r\n\t\tflash->count = flash->brighttime;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tflash-> sector->lightlevel = flash->minlight;\r\n\t\tflash->count =flash->darktime;\r\n\t}\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tP_SpawnLightFlash */\r\n/* */\r\n/*\tAfter the map has been loaded, scan each sector for specials that spawn thinkers */\r\n/* */\r\n/*================================================================== */\r\n//inline\r\nvoid P_SpawnStrobeFlash (sector_t *sector,int fastOrSlow, int inSync)//L8001AFB8()\r\n{\r\n\tstrobe_t\t*flash;\r\n\r\n\tflash = Z_Malloc ( sizeof(*flash), PU_LEVSPEC, 0);\r\n\tP_AddThinker (&flash->thinker);\r\n\tflash->sector = sector;\r\n\tflash->darktime = fastOrSlow;\r\n\tflash->brighttime = STROBEBRIGHT;\r\n\tflash->thinker.function = T_StrobeFlash;\r\n\tflash->maxlight = sector->lightlevel;\r\n\tflash->minlight = P_FindMinSurroundingLight(sector, sector->lightlevel);\r\n\r\n\tif (flash->minlight == flash->maxlight)\r\n\t\tflash->minlight = 0;\r\n\tsector->special = 0;\t\t/* nothing special about it during gameplay */\r\n\r\n\tif (!inSync)\r\n\t\tflash->count = (P_Random()&7)+1;\r\n\telse\r\n\t\tflash->count = 1;\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tP_SpawnLightFlash */\r\n/* */\r\n/*\tExclusive Psx Doom */\r\n/*\tAfter the map has been loaded, scan each sector for specials that spawn thinkers */\r\n/* */\r\n/*================================================================== */\r\nvoid P_SpawnStrobeFlashFast(sector_t *sector)//L8001B08C()\r\n{\r\n\tstrobe_t\t*flash;\r\n\r\n\tflash = Z_Malloc(sizeof(*flash), PU_LEVSPEC, 0);\r\n\tP_AddThinker(&flash->thinker);\r\n\tflash->sector = sector;\r\n\tflash->darktime = 1;\r\n\tflash->brighttime = 1;\r\n\tflash->thinker.function = T_StrobeFlash;\r\n\tflash->minlight = 10;\r\n\tflash->maxlight = sector->lightlevel;\r\n\tflash->count = 1;\r\n\r\n\tif (flash->minlight == flash->maxlight)\r\n\t\tflash->minlight = 0;\r\n\tsector->special = 0;\t\t/* nothing special about it during gameplay */\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tStart strobing lights (usually from a trigger) */\r\n/* */\r\n/*================================================================== */\r\nvoid EV_StartLightStrobing(line_t *line)//L8001B120()\r\n{\r\n\tint\tsecnum;\r\n\tsector_t\t*sec;\r\n\r\n\tsecnum = -1;\r\n\twhile ((secnum = P_FindSectorFromLineTag(line,secnum)) >= 0)\r\n\t{\r\n\t\tsec = &sectors[secnum];\r\n\t\tif (sec->specialdata)\r\n\t\t\tcontinue;\r\n\r\n\t\t//inline function\r\n\t\tP_SpawnStrobeFlash (sec,SLOWDARK, 0);\r\n\t}\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tTURN LINE'S TAG LIGHTS OFF */\r\n/* */\r\n/*================================================================== */\r\nvoid EV_TurnTagLightsOff(line_t\t*line)//L8001B230()\r\n{\r\n\tint\t\t\ti;\r\n\tint\t\t\tj;\r\n\tint\t\t\tmin;\r\n\tsector_t\t*sector;\r\n\tsector_t\t*tsec;\r\n\tline_t\t\t*templine;\r\n\r\n\tsector = sectors;\r\n\tfor (j = 0;j < numsectors; j++, sector++)\r\n    {\r\n\t\tif (sector->tag == line->tag)\r\n\t\t{\r\n\t\t\tmin = sector->lightlevel;\r\n\t\t\tfor (i = 0;i < sector->linecount; i++)\r\n\t\t\t{\r\n\t\t\t\ttempline = sector->lines[i];\r\n\t\t\t\ttsec = getNextSector(templine,sector);\r\n\t\t\t\tif (!tsec)\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\tif (tsec->lightlevel < min)\r\n\t\t\t\t\tmin = tsec->lightlevel;\r\n\t\t\t}\r\n\t\t\tsector->lightlevel = min;\r\n\t\t}\r\n    }\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tTURN LINE'S TAG LIGHTS ON */\r\n/* */\r\n/*================================================================== */\r\nvoid EV_LightTurnOn(line_t *line, int bright)//L8001B32C()\r\n{\r\n\tint\t\t\ti;\r\n\tint\t\t\tj;\r\n\tsector_t\t*sector;\r\n\tsector_t\t*temp;\r\n\tline_t\t\t*templine;\r\n\r\n\tsector = sectors;\r\n\r\n\tfor (i = 0; i < numsectors; i++, sector++)\r\n\t{\r\n\t\tif (sector->tag == line->tag)\r\n\t\t{\r\n\t\t\t/* */\r\n\t\t\t/* bright = 0 means to search for highest */\r\n\t\t\t/* light level surrounding sector */\r\n\t\t\t/* */\r\n\t\t\tif (!bright)\r\n\t\t\t{\r\n\t\t\t\tfor (j = 0; j < sector->linecount; j++)\r\n\t\t\t\t{\r\n\t\t\t\t\ttempline = sector->lines[j];\r\n\t\t\t\t\ttemp = getNextSector(templine, sector);\r\n\t\t\t\t\tif (!temp)\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\tif (temp->lightlevel > bright)\r\n\t\t\t\t\t\tbright = temp->lightlevel;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tsector->lightlevel = bright;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tSpawn glowing light */\r\n/* */\r\n/*================================================================== */\r\nvoid T_Glow(glow_t *g)//L8001B438()\r\n{\r\n\tswitch(g->direction)\r\n\t{\r\n\t\tcase -1:\t\t/* DOWN */\r\n\t\t\tg->sector->lightlevel -= GLOWSPEED;\r\n\t\t\tif (g->sector->lightlevel < g->minlight)\r\n\t\t\t{\r\n\t\t\t\tg->sector->lightlevel = g->minlight;\r\n\t\t\t\tg->direction = 1;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 1:\t\t\t/* UP */\r\n\t\t\tg->sector->lightlevel += GLOWSPEED;\r\n\t\t\tif (g->maxlight < g->sector->lightlevel)\r\n\t\t\t{\r\n\t\t\t\tg->sector->lightlevel = g->maxlight;\r\n\t\t\t\tg->direction = -1;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid P_SpawnGlowingLight(sector_t *sector, glowtype_e type)//L8001B4F0()\r\n{\r\n\tglow_t *g;\r\n\r\n\tg = Z_Malloc(sizeof(*g), PU_LEVSPEC, 0);\r\n\tP_AddThinker(&g->thinker);\r\n\tg->sector = sector;\r\n\tg->thinker.function = T_Glow;\r\n\r\n\tswitch (type)\r\n\t{\r\n\tcase glowtolower:\t//special == 8\r\n\t\tg->minlight = P_FindMinSurroundingLight(sector, sector->lightlevel);\r\n\t\tg->maxlight = sector->lightlevel;\r\n\t\tg->direction = -1;\r\n\t\tbreak;\r\n\tcase glowto10:\t\t//special == 200\r\n\t\tg->minlight = 10;\r\n\t\tg->maxlight = sector->lightlevel;\r\n\t\tg->direction = -1;\r\n\t\tbreak;\r\n\tcase glowto255:\t\t//special == 201\r\n\t\tg->minlight = sector->lightlevel;\r\n\t\tg->maxlight = 255;\r\n\t\tg->direction = 1;\r\n\t\tbreak;\r\n\t}\r\n\r\n\tsector->special = 0;\r\n}\r\n\r\n"
  },
  {
    "path": "PSXDOOM/p_local.h",
    "content": "/* P_local.h */\n\n#ifndef __P_LOCAL__\n#define __P_LOCAL__\n\n#ifndef __R_LOCAL__\n#include \"r_local.h\"\n#endif\n\n#define\tFLOATSPEED\t\t(FRACUNIT*8)\n\n#define\tGRAVITY\t\t\t(FRACUNIT*4)    //like JagDoom\n#define\tMAXMOVE\t\t\t(16*FRACUNIT)\n\n\n#define\tMAXHEALTH\t\t\t100\n#define\tVIEWHEIGHT\t\t\t(41*FRACUNIT)\n\n/* mapblocks are used to check movement against lines and things */\n#define MAPBLOCKUNITS\t128\n#define\tMAPBLOCKSIZE\t(MAPBLOCKUNITS*FRACUNIT)\n#define\tMAPBLOCKSHIFT\t(FRACBITS+7)\n#define\tMAPBMASK\t\t(MAPBLOCKSIZE-1)\n#define\tMAPBTOFRAC\t\t(MAPBLOCKSHIFT-FRACBITS)\n\n\n/* player radius for movement checking */\n#define\tPLAYERRADIUS\t16*FRACUNIT\n\n/* MAXRADIUS is for precalculated sector block boxes */\n/* the spider demon is larger, but we don't have any moving sectors */\n/* nearby */\n#define\tMAXRADIUS\t\t32*FRACUNIT\n\n\n#define\tUSERANGE\t\t(70*FRACUNIT)\n#define\tMELEERANGE\t\t(70*FRACUNIT)\n#define\tMISSILERANGE\t(32*64*FRACUNIT)\n\n\ntypedef enum\n{\n\tDI_EAST,\n\tDI_NORTHEAST,\n\tDI_NORTH,\n\tDI_NORTHWEST,\n\tDI_WEST,\n\tDI_SOUTHWEST,\n\tDI_SOUTH,\n\tDI_SOUTHEAST,\n\tDI_NODIR,\n\tNUMDIRS\n} dirtype_t;\n\n#define\tBASETHRESHOLD\t100\t\t/* follow a player exlusively for 3 seconds */\n\n\n\n/*\n===============================================================================\n\n\t\t\t\t\t\t\tP_TICK\n\n===============================================================================\n*/\n\nextern\tthinker_t\tthinkercap;\t/* both the head and tail of the thinker list */\n\n\nvoid P_InitThinkers (void);\nvoid P_AddThinker (thinker_t *thinker);\nvoid P_RemoveThinker (thinker_t *thinker);\n\n/*\n===============================================================================\n\n\t\t\t\t\t\t\tP_PSPR\n\n===============================================================================\n*/\n\nvoid P_SetupPsprites (int curplayer); //(player_t *curplayer);\nvoid P_MovePsprites (player_t *curplayer);\n\nvoid P_DropWeapon (player_t *player);\n\n/*\n===============================================================================\n\n\t\t\t\t\t\t\tP_USER\n\n===============================================================================\n*/\n\nvoid\tP_PlayerThink (player_t *player);\n\n\n/*\n===============================================================================\n\n\t\t\t\t\t\t\tP_MOBJ\n\n===============================================================================\n*/\n\nextern\tmobj_t\tmobjhead;\n\nextern\tint\t\t\tactivethinkers;\t/* debug count */\nextern\tint\t\t\tactivemobjs;\t/* debug count */\n\n#define ONFLOORZ\tMININT\n#define\tONCEILINGZ\tMAXINT\n\ninline mobj_t *P_SpawnMobj (fixed_t x, fixed_t y, fixed_t z, mobjtype_t type);\n\nvoid \tP_RemoveMobj (mobj_t *th);\nboolean\tP_SetMobjState (mobj_t *mobj, statenum_t state);\nvoid \tP_MobjThinker (mobj_t *mobj);\n\nvoid\tP_SpawnPuff (fixed_t x, fixed_t y, fixed_t z);\nvoid \tP_SpawnBlood (fixed_t x, fixed_t y, fixed_t z, int damage);\nmobj_t *P_SpawnMissile (mobj_t *source, mobj_t *dest, mobjtype_t type);\nvoid\tP_SpawnPlayerMissile (mobj_t *source, mobjtype_t type);\n\nvoid\tP_RunMobjBase (void);//P_RunMobjBase2 (void);\nvoid\tP_RunMobjExtra (void);\n\nvoid L_SkullBash (mobj_t *mo);\nvoid L_MissileHit (mobj_t *mo);\nvoid L_CrossSpecial (mobj_t *mo);\n\nvoid P_ExplodeMissile (mobj_t *mo);\n\n/*\n===============================================================================\n\n\t\t\t\t\t\t\tP_ENEMY\n\n===============================================================================\n*/\n\nvoid A_MissileExplode (mobj_t *mo);\nvoid A_SkullBash (mobj_t *mo);\n\n/*\n===============================================================================\n\n\t\t\t\t\t\t\tP_MAPUTL\n\n===============================================================================\n*/\n\n/*typedef struct\n{\n\tfixed_t\tx,y, dx, dy;\n} divline_t;*/\n\n\nfixed_t P_AproxDistance (fixed_t dx, fixed_t dy);\nint \tP_PointOnLineSide (fixed_t x, fixed_t y, line_t *line);\nint \tP_PointOnDivlineSide (fixed_t x, fixed_t y, divline_t *line);\nvoid \tP_MakeDivline (line_t *li, divline_t *dl);\ninline fixed_t P_InterceptVector (divline_t *v2, divline_t *v1);\nint \tP_BoxOnLineSide (fixed_t *tmbox, line_t *ld);\n\nextern\tfixed_t opentop, openbottom, openrange;//,,800780A0\nextern\tfixed_t\tlowfloor;\nvoid \tP_LineOpening (line_t *linedef);\n\nboolean P_BlockLinesIterator (int x, int y, boolean(*func)(line_t*) );\nboolean P_BlockThingsIterator (int x, int y, boolean(*func)(mobj_t*) );\n\nextern\tdivline_t \ttrace;\n\nvoid \tP_UnsetThingPosition (mobj_t *thing);\nvoid\tP_SetThingPosition (mobj_t *thing);\n\nvoid\tP_PlayerLand (mobj_t *mo);\n\n/*\n===============================================================================\n\n\t\t\t\t\t\t\tP_MAP\n\n===============================================================================\n*/\n\nextern\tboolean\t\tfloatok;\t\t\t\t/* if true, move would be ok if */  //80077ea8\nextern\tfixed_t\t\ttmfloorz, tmceilingz;\t/* within tmfloorz - tmceilingz */  //80078010, 80077d30\n\nextern\tline_t\t*specialline;//80077dc8\nextern\tmobj_t\t*movething;\n\n\nboolean P_CheckPosition (mobj_t *thing, fixed_t x, fixed_t y);\nboolean P_TryMove (mobj_t *thing, fixed_t x, fixed_t y);\nboolean P_CheckSight (mobj_t *t1, mobj_t *t2);\nvoid \tP_UseLines (player_t *player);\n\nboolean P_ChangeSector (sector_t *sector, boolean crunch);\n\nextern\tmobj_t\t\t*linetarget;\t\t\t/* who got hit (or NULL) */\nfixed_t P_AimLineAttack (mobj_t *t1, angle_t angle, fixed_t distance);\n\nvoid P_LineAttack (mobj_t *t1, angle_t angle, fixed_t distance, fixed_t slope, int damage);\n\nvoid P_RadiusAttack (mobj_t *spot, mobj_t *source, int damage);\n\n/*\n===============================================================================\n\n\t\t\t\t\t\t\tP_SETUP\n\n===============================================================================\n*/\n\nextern\tbyte\t\t*rejectmatrix;\t\t\t/* for fast sight rejection */\nextern\tshort\t\t*blockmaplump;\t\t/* offsets in blockmap are from here */\nextern\tshort\t\t*blockmap;\nextern\tint\t\t\tbmapwidth, bmapheight;\t/* in mapblocks */\nextern\tfixed_t\t\tbmaporgx, bmaporgy;\t\t/* origin of block map */\nextern\tmobj_t\t\t**blocklinks;\t\t\t/* for thing chains */\n\n/*\n===============================================================================\n\n\t\t\t\t\t\t\tP_INTER\n\n===============================================================================\n*/\n\nextern\tint\t\tmaxammo[NUMAMMO];\nextern\tint\t\tclipammo[NUMAMMO];\n\nvoid P_TouchSpecialThing (mobj_t *special, mobj_t *toucher);\n\nvoid P_DamageMobj (mobj_t *target, mobj_t *inflictor, mobj_t *source, int damage);\n\n#include \"p_spec.h\"\n\nextern\tint\t\t\tiquehead, iquetail;\r\n\r\n#define MAXTARGET 32\r\nextern\tmobj_t   *playertarget[MAXTARGET];\t//Psx Doom New\t800A854C\r\nextern\tint      playercounttarget;\t        //Psx Doom New\t80077E3C\n\nextern\tint playernum;//80078110, iGp00000d00\n\nvoid P_RespawnSpecials (void);\n\n\n/*\n===============================================================================\n\n\t\t\t\t\t\t\tP_MOVE\n\n===============================================================================\n*/\n\n//PSX NEW\r\n#define MAXTHINGSPEC 8\r\nextern line_t  *thingspec[8];\r\nextern int\t\tnumthingspec;//80077ee8\n\nextern mobj_t  *tmthing;\r\nextern fixed_t  tmx, tmy;\r\nextern boolean  checkposonly;\n\nvoid\tP_TryMove2(void);\r\nint     PM_PointOnLineSide(fixed_t x, fixed_t y, line_t *line);\nvoid\tPM_UnsetThingPosition(mobj_t *thing);\nvoid\tPM_SetThingPosition(mobj_t *thing);\nvoid\tPM_CheckPosition(void);\nboolean PM_BoxCrossLine(line_t *ld);\n\nboolean PIT_CheckLine(line_t *ld);\nboolean PIT_CheckThing(mobj_t *thing);\nboolean PM_BlockLinesIterator(int x, int y);\nboolean PM_BlockThingsIterator(int x, int y);\r\n\r\n\r\n/*\n===============================================================================\n\n\t\t\t\t\t\t\tP_SHOOT\n\n===============================================================================\n*/\r\n\r\nvoid P_Shoot2(void);\r\nboolean PA_DoIntercept(void *value, boolean isline, int frac);\r\nboolean\tPA_ShootLine(line_t *li, fixed_t interceptfrac);\r\nboolean PA_ShootThing(mobj_t *th, fixed_t interceptfrac);\r\nfixed_t PA_SightCrossLine(line_t *line);\r\nboolean PA_CrossSubsector(subsector_t *sub);\r\nint PA_DivlineSide(fixed_t x, fixed_t y, divline_t *line);\r\nboolean PA_CrossBSPNode(int bspnum);\r\n\r\n/*\n===============================================================================\n\n\t\t\t\t\t\t\tP_SIGHT\n\n===============================================================================\n*/\r\n\r\nvoid P_CheckSights(void);\r\nboolean P_CheckSight(mobj_t *t1, mobj_t *t2);\r\nboolean PS_CrossBSPNode(int bspnum);\r\nboolean PS_CrossSubsector(subsector_t *sub);\r\nfixed_t PS_SightCrossLine (line_t *line);\n\n#endif\t/* __P_LOCAL__ */\n\n\n"
  },
  {
    "path": "PSXDOOM/p_map.c",
    "content": "/* P_map.c */\r\n\r\n#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n\r\n//int DSPRead (void volatile *adr);\r\n\r\n/*============================================================================= */\r\n\r\n/*================== */\r\n/* */\r\n/* in */\r\n/* */\r\n/*================== */\r\n\r\nmobj_t  *tmthing;\t\t//80077EB8  ||pmGp00000aa8\r\nfixed_t  tmx, tmy;\t\t//80077F78 , 80077F7C       ||fGp00000b68, fGp00000b6c\r\nboolean  checkposonly;\t//80077F10  || Gp00000b00\r\n\r\n/*================== */\r\n/* */\r\n/* out */\r\n/* */\r\n/*================== */\r\nextern\tboolean\t\ttrymove2;           //80077f64\r\n\r\nextern\tboolean\t\tfloatok;\t\t\t\t/* if true, move would be ok if */\r\n\t\t\t\t\t\t\t\t\t\t\t/* within tmfloorz - tmceilingz */\r\n\r\nextern\tfixed_t\t\ttmfloorz, tmceilingz, tmdropoffz;\r\n\r\nextern\tmobj_t\t*movething;             //800780E8\r\n\r\n/*============================================================================= */\r\n\r\n/*\r\n===================\r\n=\r\n= P_TryMove\r\n=\r\nin:\r\ntmthing\t\ta mobj_t (can be valid or invalid)\r\ntmx,tmy\t\ta position to be checked (doesn't need relate to the mobj_t->x,y)\r\n\r\nout:\r\n\r\nnewsubsec\r\nfloatok\t\t\tif true, move would be ok if within tmfloorz - tmceilingz\r\nfloorz\r\nceilingz\r\ntmdropoffz\t\tthe lowest point contacted (monsters won't move to a dropoff)\r\n\r\nmovething\r\n\r\n==================\r\n*/\r\n\r\nvoid P_TryMove2 (void);\r\n\r\n//int checkpostics;\r\n\r\nboolean P_CheckPosition (mobj_t *thing, fixed_t x, fixed_t y)//L8001B5D8()\r\n{\r\n    checkposonly = true;\r\n\r\n\ttmthing = thing;\r\n\ttmx = x;\r\n\ttmy = y;\r\n\r\n\tP_TryMove2 ();\r\n\r\n\treturn trymove2;\r\n}\r\n\r\n\r\nboolean P_TryMove (mobj_t *thing, fixed_t x, fixed_t y)//L8001B614()\r\n{\r\n\tint\t\tdamage;\r\n\tmobj_t\t*latchedmovething;\r\n\r\n\ttmthing = thing;\r\n\ttmx = x;\r\n\ttmy = y;\r\n\r\n\tP_TryMove2 ();\r\n\r\n\t/* */\r\n\t/* pick up the specials */\r\n\t/* */\r\n\tlatchedmovething = movething;\r\n\r\n\tif (latchedmovething)\r\n\t{\r\n\t\tif (thing->flags & MF_MISSILE)\r\n\t\t{\t/* missile bash into a monster */\r\n\t\t\tdamage = ((P_Random()&7)+1)*thing->info->damage;\r\n\t\t\tP_DamageMobj (latchedmovething, thing, thing->target, damage);\r\n\t\t}\r\n\t\telse if (thing->flags & MF_SKULLFLY)\r\n\t\t{\t/* skull bash into a monster */\r\n\t\t\tdamage = ((P_Random()&7)+1)*thing->info->damage;\r\n\t\t\tP_DamageMobj (latchedmovething, thing, thing, damage);\r\n\t\t\tthing->flags &= ~MF_SKULLFLY;\r\n\t\t\tthing->momx = thing->momy = thing->momz = 0;\r\n\t\t\tP_SetMobjState (thing, thing->info->spawnstate);\r\n\t\t}\r\n\t\telse\t/* pick up  */\r\n\t\t\tP_TouchSpecialThing (latchedmovething, thing);\r\n\t}\r\n\r\n\treturn trymove2;\r\n}\r\n\r\n\r\n/*\r\n==============================================================================\r\n\r\n\t\t\t\t\t\t\tUSE LINES\r\n\r\n==============================================================================\r\n*/\r\n\r\nint\t\t\tusebbox[4]; //800a853c\r\ndivline_t\tuseline;    //800A8528\r\n\r\nline_t\t\t*closeline; //plGp00000c88\r\nfixed_t\t\tclosedist;  //iGp00000cbc\r\n\r\n/*\r\n===============\r\n=\r\n= P_InterceptVector\r\n=\r\n= Returns the fractional intercept point along the first divline\r\n=\r\n===============\r\n*/\r\n//inline\r\nfixed_t P_InterceptVector (divline_t *v2, divline_t *v1)//L8001B73C()\r\n{\r\n\tfixed_t\tfrac, num, den;\r\n\r\n\tden = (v1->dy>>16)*(v2->dx>>16) - (v1->dx>>16)*(v2->dy>>16);\r\n\r\n\tif (den == 0)\r\n\t\treturn -1;\r\n\r\n\tnum = ((v1->x-v2->x)>>16) *(v1->dy>>16) + ((v2->y-v1->y)>>16) * (v1->dx>>16);\r\n\r\n\tfrac = (num<<16) / den;\r\n\r\n\treturn frac;\r\n}\r\n\r\n\r\n/*\r\n================\r\n=\r\n= PIT_UseLines\r\n=\r\n================\r\n*/\r\n\r\nboolean\tPIT_UseLines (line_t *li)//L8001B7E0()\r\n{\r\n\tdivline_t\tdl;\r\n\tfixed_t\t\tfrac;\r\n\r\n\t/* */\r\n\t/* check bounding box first */\r\n\t/* */\r\n\tif (usebbox[BOXRIGHT] <= li->bbox[BOXLEFT]\r\n\t||\tusebbox[BOXLEFT] >= li->bbox[BOXRIGHT]\r\n\t||\tusebbox[BOXTOP] <= li->bbox[BOXBOTTOM]\r\n\t||\tusebbox[BOXBOTTOM] >= li->bbox[BOXTOP] )\r\n\t\treturn true;\r\n\r\n\t/* */\r\n\t/* find distance along usetrace */\r\n\t/* */\r\n\tP_MakeDivline (li, &dl);\r\n\tfrac = P_InterceptVector (&useline, &dl);\r\n\tif (frac < 0)\r\n\t\treturn true;\t\t/* behind source */\r\n\tif (frac > closedist)\r\n\t\treturn true;\t\t/* too far away */\r\n\r\n\t/* */\r\n\t/* the line is actually hit, find the distance  */\r\n\t/* */\r\n\tif (!li->special)\r\n\t{\r\n\t\tP_LineOpening (li);\r\n\t\tif (openrange > 0)\r\n\t\t\treturn true;\t/* keep going */\r\n\t}\r\n\r\n\tcloseline = li;\r\n\tclosedist = frac;\r\n\r\n\treturn true;\t\t\t/* can't use for than one special line in a row */\r\n}\r\n\r\n\r\n/*\r\n================\r\n=\r\n= P_UseLines\r\n=\r\n= Looks for special lines in front of the player to activate\r\n================\r\n*/\r\n\r\nvoid P_UseLines (player_t *player) //L8001B98C()\r\n{\r\n\tint\t\t\tangle;\r\n\tfixed_t\t\tx1, y1, x2, y2;\r\n\tint\t\t\tx,y, xl, xh, yl, yh;\r\n\r\n\tangle = player->mo->angle >> ANGLETOFINESHIFT;\r\n\tx1 = player->mo->x;\r\n\ty1 = player->mo->y;\r\n\tx2 = x1 + (USERANGE>>FRACBITS)*finecosine[angle];\r\n\ty2 = y1 + (USERANGE>>FRACBITS)*finesine[angle];\r\n\r\n\tuseline.x = x1;\r\n\tuseline.y = y1;\r\n\tuseline.dx = x2-x1;\r\n\tuseline.dy = y2-y1;\r\n\r\n\tif (useline.dx > 0)\r\n\t{\r\n\t\tusebbox[BOXRIGHT ] = x2;\r\n\t\tusebbox[BOXLEFT  ] = x1;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tusebbox[BOXRIGHT ] = x1;\r\n\t\tusebbox[BOXLEFT  ] = x2;\r\n\t}\r\n\r\n\tif (useline.dy > 0)\r\n\t{\r\n\t\tusebbox[BOXTOP   ] = y2;\r\n\t\tusebbox[BOXBOTTOM] = y1;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tusebbox[BOXTOP   ] = y1;\r\n\t\tusebbox[BOXBOTTOM] = y2;\r\n\t}\r\n\r\n\tyh = (usebbox[BOXTOP   ] - bmaporgy) >> MAPBLOCKSHIFT;\r\n\tyl = (usebbox[BOXBOTTOM] - bmaporgy) >> MAPBLOCKSHIFT;\r\n\txh = (usebbox[BOXRIGHT ] - bmaporgx) >> MAPBLOCKSHIFT;\r\n\txl = (usebbox[BOXLEFT  ] - bmaporgx) >> MAPBLOCKSHIFT;\r\n\r\n\t// Clamp these coords to the valid range of the blockmap to avoid potential undefined behavior near map edges\r\n\t#if RANGE_CHECKS == 1\r\n    if (xl<0)\r\n        xl = 0;\r\n    if (yl<0)\r\n        yl = 0;\r\n\r\n    if (xh>= bmapwidth)\r\n        xh = bmapwidth -1;\r\n\r\n    if (yh>= bmapheight)\r\n        yh = bmapheight -1;\r\n    #endif // RANGE_CHECKS\r\n\r\n\tcloseline = NULL;\r\n\tclosedist = FRACUNIT;\r\n\tvalidcount++;\r\n\r\n\tfor (y = yl; y <= yh; y++)\r\n\t{\r\n\t\tfor (x = xl; x <= xh; x++)\r\n        {\r\n\t\t\tP_BlockLinesIterator(x, y, PIT_UseLines);\r\n        }\r\n\t}\r\n\r\n\t/* */\r\n\t/* check closest line */\r\n\t/* */\r\n\tif (!closeline)\r\n\t\treturn;\r\n\r\n\tif (!closeline->special)\r\n\t\tS_StartSound (player->mo, sfx_noway);\r\n\telse\r\n\t\tP_UseSpecialLine (player->mo, closeline);\r\n}\r\n\r\n\r\n\r\n/*\r\n==============================================================================\r\n\r\n\t\t\t\t\t\t\tRADIUS ATTACK\r\n\r\n==============================================================================\r\n*/\r\n\r\nmobj_t\t\t*bombsource;    //pmGp0000090c\r\nmobj_t\t\t*bombspot;      //pmGp00000bb8\r\nint\t\t\tbombdamage;     //iGp000008b4\r\n\r\n/*\r\n=================\r\n=\r\n= PIT_RadiusAttack\r\n=\r\n= Source is the creature that casued the explosion at spot\r\n=================\r\n*/\r\n\r\nboolean PIT_RadiusAttack (mobj_t *thing)//L8001BBC8()\r\n{\r\n\tfixed_t\t\tdx, dy, dist;\r\n\r\n\tif (!(thing->flags & MF_SHOOTABLE))\r\n\t\treturn true;\r\n\r\n    if ((thing->type == MT_CYBORG) || (thing->type == MT_SPIDER))\r\n\t\treturn true;\r\n\r\n\tdx = abs(thing->x - bombspot->x);\r\n\tdy = abs(thing->y - bombspot->y);\r\n\r\n\tdist = dx>dy ? dx : dy;\r\n\tdist = dist - thing->radius >> FRACBITS;\r\n\r\n\tif (dist < 0)\r\n\t\tdist = 0;\r\n\r\n\tif (dist >= bombdamage)\r\n\t\treturn true;\t\t/* out of range */\r\n\r\n\tif (P_CheckSight(thing, bombspot) != 0) // must be in direct path */\r\n    {\r\n\t\tP_DamageMobj(thing, bombspot, bombsource, bombdamage - dist);\r\n    }\r\n\r\n\treturn true;\r\n}\r\n\r\n\r\n/*\r\n=================\r\n=\r\n= P_RadiusAttack\r\n=\r\n= Source is the creature that casued the explosion at spot\r\n=================\r\n*/\r\n\r\nvoid P_RadiusAttack (mobj_t *spot, mobj_t *source, int damage)//L8001BCBC()\r\n{\r\n\tint\t\t\tx,y, xl, xh, yl, yh;\r\n\tfixed_t\t\tdist;\r\n\r\n\tdist = (damage/*+MAXRADIUS*/)<<FRACBITS;\r\n\r\n\tyh = (spot->y + dist - bmaporgy)>>MAPBLOCKSHIFT;\r\n\tyl = (spot->y - dist - bmaporgy)>>MAPBLOCKSHIFT;\r\n\txh = (spot->x + dist - bmaporgx)>>MAPBLOCKSHIFT;\r\n\txl = (spot->x - dist - bmaporgx)>>MAPBLOCKSHIFT;\r\n\r\n\t// Clamp these coords to the valid range of the blockmap to avoid potential undefined behavior near map edges\r\n\t#if RANGE_CHECKS == 1\r\n    if (xl<0)\r\n        xl = 0;\r\n    if (yl<0)\r\n        yl = 0;\r\n\r\n    if (xh>= bmapwidth)\r\n        xh = bmapwidth -1;\r\n\r\n    if (yh>= bmapheight)\r\n        yh = bmapheight -1;\r\n    #endif // RANGE_CHECKS\r\n\r\n\tbombspot = spot;\r\n\tbombsource = source;\r\n\tbombdamage = damage;\r\n\r\n\tfor (y = yl; y <= yh; y++)\r\n\t{\r\n\t\tfor (x = xl; x <= xh; x++)\r\n        {\r\n\t\t\tP_BlockThingsIterator(x, y, PIT_RadiusAttack);\r\n        }\r\n\t}\r\n}\r\n\r\n\r\n/*============================================================================ */\r\n\r\n//int\t\t\tsightcounts[2];\r\n\r\n/*=================== */\r\n/* */\r\n/* IN */\r\n/* */\r\n/* A line will be traced from the middle of shooter in the direction of */\r\n/* attackangle until either a shootable mobj is within the visible */\r\n/* aimtopslope / aimbottomslope range, or a solid wall blocks further */\r\n/* tracing.  If no thing is targeted along the entire range, the first line */\r\n/* that blocks the midpoint of the trace will be hit. */\r\n/*=================== */\r\n\r\nmobj_t\t\t*shooter;       //pmGp00000acc\r\nangle_t\t\tattackangle;    //aGp0000099c\r\nfixed_t\t\tattackrange;    //fGp000009b4\r\nfixed_t\t\taimtopslope;    //uGp00000a14\r\nfixed_t\t\taimbottomslope; //uGp00000d0c\r\n\r\n/*=================== */\r\n/* */\r\n/* OUT */\r\n/* */\r\n/*=================== */\r\n\r\nextern\tline_t\t\t*shootline;                 //800780f4\r\nextern\tmobj_t\t\t*shootmobj;                 //800780f8\r\nextern\tfixed_t\t\tshootslope;\t\t\t\t\t/* between aimtop and aimbottom */  //80077d78\r\nextern\tfixed_t\t\tshootx, shooty, shootz;\t\t/* location for puff/blood */       //80077DF0,80077DFC,80077e00\r\n\r\nmobj_t\t*linetarget;\t\t\t/* shootmobj latched in main memory */  //iGp00000904   80077d14\r\n\r\n//int\t\tshoottics;\r\n\r\n/*\r\n=================\r\n=\r\n= P_AimLineAttack\r\n=\r\n=================\r\n*/\r\n\r\nfixed_t P_AimLineAttack (mobj_t *t1, angle_t angle, fixed_t distance)//L8001BD9C()\r\n{\r\n    aimtopslope = 100*FRACUNIT/160;\t/* can't shoot outside view angles */\r\n    aimbottomslope = -100*FRACUNIT/160;\r\n\r\n    validcount++;\r\n\r\n    attackangle = angle;\r\n    attackrange = distance;\r\n    shooter = t1;\r\n\r\n\tP_Shoot2 ();\r\n\r\n\tlinetarget = shootmobj;\r\n\r\n\tif (shootmobj)\r\n\t\treturn shootslope;\r\n\treturn 0;\r\n}\r\n\r\n\r\n/*\r\n=================\r\n=\r\n= P_LineAttack\r\n=\r\n= If slope == MAXINT, use screen bounds for attacking\r\n=\r\n=================\r\n*/\r\n\r\nvoid P_LineAttack (mobj_t *t1, angle_t angle, fixed_t distance, fixed_t slope, int damage)//L8001BE10()\r\n{\r\n\tline_t\t*shootline2;\r\n\tint\t\tshootx2, shooty2, shootz2;\r\n\r\n    if (slope == MAXINT)\r\n    {\r\n        aimtopslope = 100*FRACUNIT/160;\t/* can't shoot outside view angles */\r\n\t\taimbottomslope = -100*FRACUNIT/160;\r\n    }\r\n    else\r\n    {\r\n        aimtopslope = slope+1;\r\n        aimbottomslope = slope-1;\r\n    }\r\n\r\n    validcount++;\r\n\r\n    attackangle = angle;\r\n    attackrange = distance;\r\n    shooter = t1;\r\n\r\n\tP_Shoot2 ();\r\n\r\n\tshootline2 = shootline;\r\n\tshootx2 = shootx;\r\n\tshooty2 = shooty;\r\n\tshootz2 = shootz;\r\n\tlinetarget = shootmobj;\r\n\r\n\t/* */\r\n\t/* shoot thing */\r\n\t/* */\r\n\tif (linetarget)\r\n\t{\r\n\t\tif (linetarget->flags & MF_NOBLOOD)\r\n\t\t\tP_SpawnPuff (shootx2,shooty2,shootz2);\r\n\t\telse\r\n\t\t\tP_SpawnBlood (shootx2,shooty2,shootz2, damage);\r\n\r\n\t\tP_DamageMobj (linetarget, t1, t1, damage);\r\n\t\treturn;\r\n\t}\r\n\r\n\t/* */\r\n\t/* shoot wall */\r\n\t/* */\r\n\tif (shootline2)\r\n\t{\r\n\t\tif (shootline2->special)\r\n\t\t\tP_ShootSpecialLine (t1, shootline2);\r\n\r\n\t\tif (shootline2->frontsector->ceilingpic == -1)\r\n\t\t{\r\n\t\t\tif (shootz2 > shootline2->frontsector->ceilingheight)\r\n\t\t\t\treturn;\t\t/* don't shoot the sky! */\r\n\t\t\tif (shootline2->backsector && shootline2->backsector->ceilingpic == -1)\r\n\t\t\t\treturn;\t\t/* it's a sky hack wall */\r\n\t\t}\r\n\r\n\t\tP_SpawnPuff (shootx2,shooty2,shootz2);\r\n\t}\r\n}\r\n\r\n\r\n\r\n"
  },
  {
    "path": "PSXDOOM/p_maputl.c",
    "content": "\n/* P_maputl.c */\n\n#include \"doomdef.h\"\n#include \"p_local.h\"\n\n\n/*\n===================\n=\n= P_AproxDistance\n=\n= Gives an estimation of distance (not exact)\n=\n===================\n*/\n\nfixed_t P_AproxDistance (fixed_t dx, fixed_t dy)//L8001BFC8()\n{\n\tdx = abs(dx);\n\tdy = abs(dy);\n\tif (dx < dy)\n\t\treturn dx+dy-(dx>>1);\n\treturn dx+dy-(dy>>1);\n}\n\n\n/*\n==================\n=\n= P_PointOnLineSide\n=\n= Returns 0 or 1\n==================\n*/\n\nint P_PointOnLineSide (fixed_t x, fixed_t y, line_t *line)//L8001C000()\n{\n\tfixed_t\tdx,dy;\n\tfixed_t\tleft, right;\n\n\tif (!line->dx)\n\t{\n\t\tif (x <= line->v1->x)\n\t\t\treturn line->dy > 0;\n\t\treturn line->dy < 0;\n\t}\n\tif (!line->dy)\n\t{\n\t\tif (y <= line->v1->y)\n\t\t\treturn line->dx < 0;\n\t\treturn line->dx > 0;\n\t}\n\n\tdx = (x - line->v1->x);\n\tdy = (y - line->v1->y);\n\n\tleft = (line->dy>>16) * (dx>>16);\n\tright = (dy>>16) * (line->dx>>16);\n\n\tif (right < left)\n\t\treturn 0;\t\t/* front side */\n\treturn 1;\t\t\t/* back side */\n}\n\n\n/*\n==================\n=\n= P_PointOnDivlineSide\n=\n= Returns 0 or 1\n==================\n*/\n\nint P_PointOnDivlineSide (fixed_t x, fixed_t y, divline_t *line)//L8001C0C0()\n{\n\tfixed_t\tdx,dy;\n\tfixed_t\tleft, right;\n\n\tif (!line->dx)\n\t{\n\t\tif (x <= line->x)\n\t\t\treturn line->dy > 0;\n\t\treturn line->dy < 0;\n\t}\n\tif (!line->dy)\n\t{\n\t\tif (y <= line->y)\n\t\t\treturn line->dx < 0;\n\t\treturn line->dx > 0;\n\t}\n\n\tdx = (x - line->x);\n\tdy = (y - line->y);\n\n/* try to quickly decide by looking at sign bits */\n\tif ( (line->dy ^ line->dx ^ dx ^ dy)&0x80000000 )\n\t{\n\t\tif ( (line->dy ^ dx) & 0x80000000 )\n\t\t\treturn 1;\t/* (left is negative) */\n\t\treturn 0;\n\t}\n\n\tleft  = FixedMul ( line->dy>>8, dx>>8 );\n\tright = FixedMul ( dy>>8 , line->dx>>8 );\n\n\tif (right < left)\n\t\treturn 0;\t\t/* front side */\n\treturn 1;\t\t\t/* back side */\n}\n\n\n\n/*\n==============\n=\n= P_MakeDivline\n=\n==============\n*/\n\nvoid P_MakeDivline (line_t *li, divline_t *dl)//L8001C1B4()\n{\n\tdl->x = li->v1->x;\n\tdl->y = li->v1->y;\n\tdl->dx = li->dx;\n\tdl->dy = li->dy;\n}\n\n\n/*\n==================\n=\n= P_LineOpening\n=\n= Sets opentop and openbottom to the window through a two sided line\n= OPTIMIZE: keep this precalculated\n==================\n*/\n\nfixed_t opentop, openbottom, openrange;//80077EE4, 80077D5C, 800780A0 || iGp00000ad4,iGp0000094c,iGp00000c90\nfixed_t\tlowfloor;//80078004||fGp00000bf4\n\nvoid P_LineOpening (line_t *linedef)//L8001C1F4()\n{\n\tsector_t\t*front, *back;\n\n\tif (linedef->sidenum[1] == -1)\n\t{\t/* single sided line */\n\t\topenrange = 0;\n\t\treturn;\n\t}\n\n\tfront = linedef->frontsector;\n\tback = linedef->backsector;\n\n\tif (front->ceilingheight < back->ceilingheight)\n\t\topentop = front->ceilingheight;\n\telse\n\t\topentop = back->ceilingheight;\n\tif (front->floorheight > back->floorheight)\n\t{\n\t\topenbottom = front->floorheight;\n\t\tlowfloor = back->floorheight;\n\t}\n\telse\n\t{\n\t\topenbottom = back->floorheight;\n\t\tlowfloor = front->floorheight;\n\t}\n\n\topenrange = opentop - openbottom;\n}\n\n/*\n===============================================================================\n\n\t\t\t\t\t\tTHING POSITION SETTING\n\n===============================================================================\n*/\n\n/*\n===================\n=\n= P_UnsetThingPosition\n=\n= Unlinks a thing from block map and sectors\n=\n===================\n*/\n\nvoid P_UnsetThingPosition (mobj_t *thing)//L8001C290()\n{\n\tint blockx, blocky;\n\n\tif (!(thing->flags & MF_NOSECTOR))\n\t{\t/* inert things don't need to be in blockmap */\n\t\t/* unlink from subsector */\n\t\tif (thing->snext)\n\t\t\tthing->snext->sprev = thing->sprev;\n\t\tif (thing->sprev)\n\t\t\tthing->sprev->snext = thing->snext;\n\t\telse\n\t\t\tthing->subsector->sector->thinglist = thing->snext;\n\t}\n\n\tif (!(thing->flags & MF_NOBLOCKMAP))\n\t{\t/* inert things don't need to be in blockmap */\n\t\t/* unlink from block map */\n\t\tif (thing->bnext)\n\t\t\tthing->bnext->bprev = thing->bprev;\n\t\tif (thing->bprev)\n\t\t\tthing->bprev->bnext = thing->bnext;\n\t\telse\n\t\t{\n\t\t\tblockx = (thing->x - bmaporgx)>>MAPBLOCKSHIFT;\n\t\t\tblocky = (thing->y - bmaporgy)>>MAPBLOCKSHIFT;\r\n\r\n\t\t\t// Prevent buffer overflow if the map object is out of bounds.\r\n            // This is part of the fix for the famous 'linedef deletion' bug.\r\n            // From StationDoom by BodbDearg\r\n\t\t\t#if FIX_LINEDEFS_DELETION\r\n            if (blockx>=0 && blockx < bmapwidth\r\n             && blocky>=0 && blocky <bmapheight)\r\n            {\r\n                blocklinks[blocky*bmapwidth+blockx] = thing->bnext;\r\n            }\r\n            #else\r\n                blocklinks[blocky*bmapwidth+blockx] = thing->bnext;\r\n\t\t\t#endif\n\t\t}\n\t}\n}\n\n\n/*\n===================\n=\n= P_SetThingPosition\n=\n= Links a thing into both a block and a subsector based on it's x y\n= Sets thing->subsector properly\n=\n===================\n*/\n\nvoid P_SetThingPosition (mobj_t *thing)//L8001C3A0()\n{\n\tsubsector_t  *ss;\r\n    sector_t     *sec;\r\n    int           blockx, blocky;\r\n    mobj_t      **link;\r\n\r\n    /* */\r\n    /* link into subsector */\r\n    /* */\r\n    ss = R_PointInSubsector (thing->x,thing->y);\r\n    thing->subsector = ss;\r\n    if(!(thing->flags & MF_NOSECTOR))\r\n    {\r\n        /* invisible things don't go into the sector links */\r\n        sec = ss->sector;\r\n\r\n        thing->sprev = NULL;\r\n        thing->snext = sec->thinglist;\r\n        if(sec->thinglist)\r\n         sec->thinglist->sprev = thing;\r\n        sec->thinglist = thing;\r\n    }\r\n\r\n    /* */\r\n    /* link into blockmap */\r\n    /* */\r\n    if(!(thing->flags & MF_NOBLOCKMAP))\r\n    {\r\n        /* inert things don't need to be in blockmap */\r\n        blockx = (thing->x - bmaporgx)>>MAPBLOCKSHIFT;\r\n        blocky = (thing->y - bmaporgy)>>MAPBLOCKSHIFT;\r\n        if(blockx >= 0 && blockx < bmapwidth && blocky >= 0 && blocky < bmapheight)\r\n        {\r\n            link = &blocklinks[blocky*bmapwidth+blockx];\r\n            thing->bprev = NULL;\r\n            thing->bnext = *link;\r\n            if (*link)\r\n                (*link)->bprev = thing;\r\n            *link = thing;\r\n        }\r\n        else\r\n        {\r\n            /* thing is off the map */\r\n            thing->bnext = thing->bprev = NULL;\r\n        }\r\n    }\n}\n\n\n\n/*\n===============================================================================\n\n\t\t\t\t\t\tBLOCK MAP ITERATORS\n\nFor each line/thing in the given mapblock, call the passed function.\nIf the function returns false, exit with false without checking anything else.\n\n===============================================================================\n*/\n\n/*\n==================\n=\n= P_BlockLinesIterator\n=\n= The validcount flags are used to avoid checking lines\n= that are marked in multiple mapblocks, so increment validcount before\n= the first call to P_BlockLinesIterator, then make one or more calls to it\n===================\n*/\n\nboolean P_BlockLinesIterator (int x, int y, boolean(*func)(line_t*) )//L8001C4D8()\n{\n\tint\t\t\toffset;\n\tshort\t\t*list;\n\tline_t\t\t*ld;\n\n\tif (x<0 || y<0 || x>=bmapwidth || y>=bmapheight)\n\t\treturn true;\n\toffset = y*bmapwidth+x;\n\n\toffset = *(blockmap+offset);\n\n\tfor ( list = blockmaplump+offset ; *list != -1 ; list++)\n\t{\n\t\tld = &lines[*list];\n\t\tif (ld->validcount == validcount)\n\t\t\tcontinue;\t\t/* line has already been checked */\n\t\tld->validcount = validcount;\n\n\t\tif ( !func(ld) )\n\t\t\treturn false;\n\t}\n\n\treturn true;\t\t/* everything was checked */\n}\n\n\n/*\n==================\n=\n= P_BlockThingsIterator\n=\n==================\n*/\n\nboolean P_BlockThingsIterator (int x, int y, boolean(*func)(mobj_t*) )//L8001C5F8()\n{\n\tmobj_t\t\t*mobj;\n\n\tif (x<0 || y<0 || x>=bmapwidth || y>=bmapheight)\n\t\treturn true;\n\n\tfor (mobj = blocklinks[y*bmapwidth+x] ; mobj ; mobj = mobj->bnext)\r\n    {\n\t\tif (!func( mobj ) )\n\t\t\treturn false;\r\n    }\n\n\treturn true;\n}\n\n"
  },
  {
    "path": "PSXDOOM/p_mobj.c",
    "content": "/* P_mobj.c */\r\n\r\n#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n#include \"sounds.h\"\r\n\r\nvoid G_PlayerReborn (int player);\r\n\r\n#define\t\tITEMQUESIZE\t64\r\nmapthing_t\titemrespawnque[ITEMQUESIZE];//80085f54\r\nint\t\t\titemrespawntime[ITEMQUESIZE];//800976f0\r\nint\t\t\tiquehead, iquetail;//80077F60,80077FA8  ||uGp00000b50,uGp00000b98\r\n\r\n#define MAXTARGET 32\r\nmobj_t   *playertarget[MAXTARGET];\t//Psx Doom New\t800A854C\r\nint      playercounttarget;\t        //Psx Doom New\t80077E3C\r\n\r\n/*\r\n===============\r\n=\r\n= P_RemoveMobj\r\n=\r\n===============\r\n*/\r\n//inline\r\nvoid P_RemoveMobj (mobj_t *mobj)//L8001C6BC()\r\n{\r\n\tint\t\tspot;\r\n\r\n\t/* add to the respawnque for altdeath mode */\r\n\r\n\tif ((mobj->flags & MF_SPECIAL) &&\r\n\t\t!(mobj->flags & MF_DROPPED) &&\r\n\t\t(mobj->type != MT_INV) &&\r\n\t\t(mobj->type != MT_INS))\r\n\t{\r\n\t\tspot = iquehead&(ITEMQUESIZE-1);\r\n\r\n\t\titemrespawnque[spot].x = mobj->spawnx;\r\n\t\titemrespawnque[spot].y = mobj->spawny;\r\n\t\titemrespawnque[spot].type = mobj->spawntype;\r\n\t\titemrespawnque[spot].angle = mobj->spawnangle;\r\n\t\titemrespawntime[spot] = ticon;\r\n\t\tiquehead++;\r\n\t}\r\n\r\n\t/* unlink from sector and block lists */\r\n\tP_UnsetThingPosition (mobj);\r\n\r\n\t/* unlink from mobj list */\r\n\tmobj->next->prev = mobj->prev;\r\n\tmobj->prev->next = mobj->next;\r\n\tZ_Free (mobj);\r\n}\r\n\r\n\r\n/*\r\n===============\r\n=\r\n= P_RespawnSpecials\r\n=\r\n===============\r\n*/\r\n\r\nvoid P_RespawnSpecials (void)//L8001C7D0()\r\n{\r\n\tfixed_t         x,y,z;\r\n\tsubsector_t \t*ss;\r\n\tmobj_t\t\t\t*mo;\r\n\tmapthing_t\t\t*mthing;\r\n\tint\t\t\t\ti;\r\n\tint\t\t\t\tspot;\r\n\r\n\tif (netgame != gt_deathmatch)\r\n\t\treturn;\r\n\r\n\tif (iquehead == iquetail)\r\n\t\treturn;\t\t\t/* nothing left to respawn */\r\n\r\n\tif (iquehead - iquetail > ITEMQUESIZE)\r\n\t\tiquetail = iquehead - ITEMQUESIZE;\t/* loose some off the que */\r\n\r\n\tspot = iquetail&(ITEMQUESIZE-1);\r\n\r\n\tif (ticon - itemrespawntime[spot] < 120*15)\r\n\t\treturn;\t\t\t/* wait at least 120 seconds */\r\n\r\n\tmthing = &itemrespawnque[spot];\r\n\r\n\tx = mthing->x << FRACBITS;\r\n\ty = mthing->y << FRACBITS;\r\n\r\n\t/* spawn a teleport fog at the new spot */\r\n\tss = R_PointInSubsector (x,y);\r\n\tmo = P_SpawnMobj (x, y, ss->sector->floorheight , MT_IFOG);\r\n\r\n\tS_StartSound (mo, sfx_itmbk);\r\n\r\n\t/* find which type to spawn */\r\n\tfor (i=0 ; i< NUMMOBJTYPES ; i++)\r\n    {\r\n\t\tif (mthing->type == mobjinfo[i].doomednum)\r\n\t\t\tbreak;\r\n    }\r\n\r\n\t/* spawn it */\r\n\tif (mobjinfo[i].flags & MF_SPAWNCEILING)\r\n\t\tz = ONCEILINGZ;\r\n\telse\r\n\t\tz = ONFLOORZ;\r\n\tmo = P_SpawnMobj (x,y,z, i);\r\n\tmo->angle = ANG45 * (mthing->angle/45);\r\n\tmo->spawnx = mthing->x;\r\n\tmo->spawny = mthing->y;\r\n\tmo->spawntype = mthing->type;\r\n\tmo->spawnangle = mthing->angle;\r\n\r\n\t/* pull it from the que */\r\n\tiquetail++;\r\n}\r\n\r\n\r\n/*\r\n================\r\n=\r\n= P_SetMobjState\r\n=\r\n= Returns true if the mobj is still present\r\n================\r\n*/\r\n\r\nboolean P_SetMobjState (mobj_t *mobj, statenum_t state)//L8001C9B0()\r\n{\r\n\tstate_t\t*st;\r\n\r\n\tif (state == S_NULL)\r\n\t{\r\n\t\tmobj->state = S_NULL;\r\n\t\tP_RemoveMobj (mobj);\r\n\t\treturn false;\r\n\t}\r\n\r\n\tst = &states[state];\r\n\r\n\tmobj->state = st;\r\n\tmobj->tics = st->tics;\r\n\tmobj->sprite = st->sprite;\r\n\tmobj->frame = st->frame;\r\n\r\n\tif (st->action)\t\t/* call action functions when the state is set */\r\n\t\tst->action (mobj);\r\n\r\n\tmobj->latecall = NULL;\t/* make sure it doesn't come back to life... */\r\n\r\n\treturn true;\r\n}\r\n\r\n/*\r\n===================\r\n=\r\n= P_ExplodeMissile\r\n=\r\n===================\r\n*/\r\n//inline\r\nvoid P_ExplodeMissile (mobj_t *mo)//L8001CB34()\r\n{\r\n\tmo->momx = mo->momy = mo->momz = 0;\r\n\tP_SetMobjState (mo, mobjinfo[mo->type].deathstate);\r\n\r\n\tmo->tics -= P_Random()&1;\r\n\tif (mo->tics < 1)\r\n\t\tmo->tics = 1;\r\n\r\n\tmo->flags &= ~MF_MISSILE;\r\n\tif (mo->info->deathsound)\r\n\t{\r\n\t\tS_StopSound((unsigned long)mo->target);\r\n\t\tS_StartSound(mo, mo->info->deathsound);\r\n\t}\r\n}\r\n\r\n\r\n/*\r\n===============\r\n=\r\n= P_SpawnMobj\r\n=\r\n===============\r\n*/\r\n\r\n//int zonetics;\r\n//inline\r\nmobj_t *P_SpawnMobj (fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)//L8001CC00()\r\n{\r\n\tmobj_t\t\t*mobj;\r\n\tstate_t\t\t*st;\r\n\tmobjinfo_t\t*info;\r\n\r\n\tmobj = Z_Malloc (sizeof(*mobj), PU_LEVEL, NULL);\r\n\r\n\tD_memset (mobj, 0, sizeof (*mobj));\r\n\tinfo = &mobjinfo[type];\r\n\r\n\tmobj->type = type;\r\n\tmobj->info = info;\r\n\tmobj->x = x;\r\n\tmobj->y = y;\r\n\tmobj->radius = info->radius;\r\n\tmobj->height = info->height;\r\n\tmobj->flags = info->flags;\r\n\tmobj->health = info->spawnhealth;\r\n\tmobj->reactiontime = info->reactiontime;\r\n\r\n\t/* do not set the state with P_SetMobjState, because action routines can't */\r\n\t/* be called yet */\r\n\tst = &states[info->spawnstate];\r\n\r\n\tmobj->state = st;\r\n\tmobj->tics = st->tics;\r\n\tmobj->sprite = st->sprite;\r\n\tmobj->frame = st->frame;\r\n\r\n\t/* set subsector and/or block links */\r\n\tP_SetThingPosition (mobj);\r\n\r\n\tmobj->floorz = mobj->subsector->sector->floorheight;\r\n\tmobj->ceilingz = mobj->subsector->sector->ceilingheight;\r\n\tif (z == ONFLOORZ)\r\n\t\tmobj->z = mobj->floorz;\r\n\telse if (z == ONCEILINGZ)\r\n\t\tmobj->z = mobj->ceilingz - mobj->info->height;\r\n\telse\r\n\t\tmobj->z = z;\r\n\r\n\t/* */\r\n\t/* link into the mobj list */\r\n\t/* */\r\n\tmobjhead.prev->next = mobj;\r\n\tmobj->next = &mobjhead;\r\n\tmobj->prev = mobjhead.prev;\r\n\tmobjhead.prev = mobj;\r\n\r\n\treturn mobj;\r\n}\r\n\r\n\r\n/*============================================================================= */\r\n\r\n\r\n/*\r\n============\r\n=\r\n= P_SpawnPlayer\r\n=\r\n= Called when a player is spawned on the level\r\n= Most of the player structure stays unchanged between levels\r\n============\r\n*/\r\n\r\nextern byte Passwordbuff[12];//0x80096388\r\nextern boolean doPassword;//80077A6C\r\n\r\nvoid P_SpawnPlayer (mapthing_t *mthing)//L8001CDD8()\r\n{\r\n\tplayer_t\t*p;\r\n\tfixed_t\t\tx,y,z;\r\n\tmobj_t\t\t*mobj;\r\n\tint\ti;\r\n\tint levelnum;\r\n\tint skill;\r\n\r\n\tif (!playeringame[mthing->type-1])\r\n\t\treturn;\t\t\t\t\t\t/* not playing */\r\n\r\n\tp = &players[mthing->type-1];\r\n\r\n\tif (p->playerstate == PST_REBORN)\r\n\t\tG_PlayerReborn (mthing->type-1);\r\n\r\n\tx = mthing->x << FRACBITS;\r\n\ty = mthing->y << FRACBITS;\r\n\r\n\tz = ONFLOORZ;\r\n\tmobj = P_SpawnMobj (x,y,z, MT_PLAYER);\r\n\r\n\tmobj->angle = ANG45 * (mthing->angle/45);\r\n\r\n\tmobj->player = p;\r\n\tmobj->health = p->health;\r\n\tp->mo = mobj;\r\n\tp->playerstate = PST_LIVE;\r\n\tp->refire = 0;\r\n\tp->message = NULL;\r\n\tp->damagecount = 0;\r\n\tp->bonuscount = 0;\r\n\tp->extralight = 0;\r\n\tp->fixedcolormap = 0;\r\n\tp->viewheight = VIEWHEIGHT;\r\n\tp->automapscale = 36;\r\n\tp->viewz = mobj->z + VIEWHEIGHT;        //new line psxdoom\r\n\tP_SetupPsprites (mthing->type-1);\t\t/* setup gun psprite\t */\r\n\r\n\tif (netgame == gt_deathmatch)\r\n\t{\r\n\t\tfor (i = 0; i < NUMCARDS; i++)\r\n\t\t\tp->cards[i] = true;\t\t/* give all cards in death match mode\t\t\t */\r\n\t}\r\n\r\n    if (netgame == gt_single)\r\n    {\r\n        if ((mthing->type-1) != consoleplayer)\r\n            return;\r\n\r\n        if (doPassword != 0)\r\n        {\r\n            Decode_Password(Passwordbuff, &levelnum, &skill, p);\r\n\t\t\tdoPassword = false;\r\n        }\r\n    }\r\n\r\n    if ((mthing->type-1) == consoleplayer)\r\n    {\r\n        ST_InitEveryLevel();\r\n        ST_doPaletteStuff();\r\n    }\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= P_SpawnMapThing\r\n=\r\n= The fields of the mapthing should already be in host byte order\r\n==================\r\n*/\r\n\r\nvoid P_SpawnMapThing (mapthing_t *mthing)//L8001D11C()\r\n{\r\n\tint\t\t\ti, bit;\r\n\tmobj_t\t\t*mobj;\r\n\tfixed_t\t\tx,y,z;\r\n\r\n\t//printf(\"P_SpawnMapThing %d\\n\",mthing->type);\r\n\r\n\t/* save spots for respawning in network games */\r\n\tif (mthing->type <= MAXPLAYERS)\r\n\t{\r\n\t\tplayerstarts[mthing->type-1] = *mthing;\r\n\t\treturn;\r\n\t}\r\n\r\n\t/* count deathmatch start positions */\r\n\tif (mthing->type == 11)\r\n\t{\r\n\t\tif (deathmatch_p < &deathmatchstarts[10])\r\n\t\t\tD_memcpy (deathmatch_p, mthing, sizeof(*mthing));\r\n\t\tdeathmatch_p++;\r\n\t\treturn;\r\n\t}\r\n\r\n\t/* check for players specially */\r\n\r\n#if 0\r\nif (mthing->type > 4)\r\nreturn;\t/*DEBUG */\r\n\r\n\r\n\tif (mthing->type <= 4)\r\n\t{\r\n\t\t/* save spots for respawning in network games */\r\n\t\tif (mthing->type <= MAXPLAYERS)\r\n\t\t{\r\n\t\t\tplayerstarts[mthing->type-1] = *mthing;\r\n\t\t\tif (netgame != gt_deathmatch)\r\n\t\t\t\tP_SpawnPlayer (mthing);\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n#endif\r\n\r\n\t/* check for apropriate skill level */\r\n\tif ( (netgame != gt_deathmatch) && (mthing->options & 16) )\r\n\t\treturn;\r\n\r\n\tif (gameskill == sk_baby)\r\n\t\tbit = 1;\r\n\telse if (gameskill == sk_nightmare)\r\n\t\tbit = 4;\r\n\telse\r\n\t\tbit = 1<<(gameskill-1);\r\n\r\n\tif (!(mthing->options & bit) )\r\n\t\treturn;\r\n\r\n\t/* find which type to spawn */\r\n\tfor (i = 0; i < NUMMOBJTYPES; i++)\r\n\t{\r\n\t\tif (mthing->type == mobjinfo[i].doomednum)\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\tif (i==NUMMOBJTYPES)\r\n    {\r\n\t\tI_Error (\"P_SpawnMapThing: Unknown type %i at (%i, %i)\",mthing->type , mthing->x, mthing->y);\r\n    }\r\n\r\n\t/* don't spawn keycards and players in deathmatch */\r\n\tif (netgame == gt_deathmatch && mobjinfo[i].flags & (MF_NOTDMATCH|MF_COUNTKILL) )\r\n\t\treturn;\r\n\r\n\t/* spawn it */\r\n\tx = mthing->x << FRACBITS;\r\n\ty = mthing->y << FRACBITS;\r\n\tif (mobjinfo[i].flags & MF_SPAWNCEILING)\r\n\t\tz = ONCEILINGZ;\r\n\telse\r\n\t\tz = ONFLOORZ;\r\n\r\n\tmobj = P_SpawnMobj (x,y,z, i);\r\n\tif (mobj->tics > 0)\r\n\t\tmobj->tics = 1 + (P_Random () % mobj->tics);\r\n\tif (mobj->flags & MF_COUNTKILL)\r\n\t\ttotalkills++;\r\n\tif (mobj->flags & MF_COUNTITEM)\r\n\t\ttotalitems++;\r\n\r\n\tmobj->angle = ANG45 * (mthing->angle/45);\r\n\tmobj->spawnx = mthing->x;\r\n\tmobj->spawny = mthing->y;\r\n\tmobj->spawntype = mthing->type;\r\n\tmobj->spawnangle = mthing->angle;\r\n\r\n\tif (mthing->options & MTF_AMBUSH)\r\n\t\tmobj->flags |= MF_AMBUSH;\r\n\r\n\t//Set Blend Mask\r\n\tmobj->flags |= (mthing->options & (MTF_BLENDMASK1 | MTF_BLENDMASK2 | MTF_BLENDMASK3)) << 23;\r\n\r\n\t//Check Nightmare Monster\r\n\tif ((mobj->flags & (MF_BLENDMASK1 | MF_BLENDMASK2 | MF_BLENDMASK3)) == (MF_BLENDMASK1 | MF_BLENDMASK3))\r\n\t{\r\n\t\tmobj->health *= 2;\r\n\t}\r\n}\r\n\r\n\r\n/*\r\n===============================================================================\r\n\r\n\t\t\t\t\t\tGAME SPAWN FUNCTIONS\r\n\r\n===============================================================================\r\n*/\r\n\r\n/*\r\n================\r\n=\r\n= P_SpawnPuff\r\n=\r\n================\r\n*/\r\n\r\nextern fixed_t attackrange;//80077dc4\r\n\r\nvoid P_SpawnPuff (fixed_t x, fixed_t y, fixed_t z)//L8001D69C()\r\n{\r\n\tmobj_t\t*th;\r\n\r\n\tz += ((P_Random()-P_Random())<<10);\r\n\tth = P_SpawnMobj (x,y,z, MT_PUFF);\r\n\tth->momz = FRACUNIT;\r\n\tth->tics -= P_Random()&1;\r\n\tif (th->tics < 1)\r\n\t\tth->tics = 1;\r\n\r\n/* don't make punches spark on the wall */\r\n\tif (attackrange == MELEERANGE)\r\n\t\tP_SetMobjState (th, S_PUFF3);\r\n}\r\n\r\n\r\n/*\r\n================\r\n=\r\n= P_SpawnBlood\r\n=\r\n================\r\n*/\r\n\r\nvoid P_SpawnBlood (fixed_t x, fixed_t y, fixed_t z, int damage)//L8001D8C8()\r\n{\r\n\tmobj_t\t*th;\r\n\r\n\tz += ((P_Random()-P_Random())<<10);\r\n\tth = P_SpawnMobj (x,y,z, MT_BLOOD);\r\n\tth->momz = FRACUNIT*2;\r\n\tth->tics -= P_Random()&1;\r\n\tif (th->tics<1)\r\n\t\tth->tics = 1;\r\n\tif (damage <= 12 && damage >= 9)\r\n\t\tP_SetMobjState (th,S_BLOOD2);\r\n\telse if (damage < 9)\r\n\t\tP_SetMobjState (th,S_BLOOD3);\r\n}\r\n\r\n/*\r\n================\r\n=\r\n= P_CheckMissileSpawn\r\n=\r\n= Moves the missile forward a bit and possibly explodes it right there\r\n=\r\n================\r\n*/\r\n//inline\r\nvoid P_CheckMissileSpawn (mobj_t *th)//L8001DB10()\r\n{\r\n\tth->x += (th->momx>>1);\r\n\tth->y += (th->momy>>1);\t/* move a little forward so an angle can */\r\n\t\t\t\t\t\t\t/* be computed if it immediately explodes */\r\n\tth->z += (th->momz>>1);\r\n\tif (!P_TryMove (th, th->x, th->y))\r\n\t\tP_ExplodeMissile (th);\r\n}\r\n\r\n/*\r\n================\r\n=\r\n= P_SpawnMissile\r\n=\r\n================\r\n*/\r\n\r\nmobj_t *P_SpawnMissile (mobj_t *source, mobj_t *dest, mobjtype_t type)//L8001DC2C()\r\n{\r\n\tmobj_t\t\t*th;\r\n\tangle_t\t\tan;\r\n\tint\t\t\tdist;\r\n\tint\t\t\tspeed;\r\n\r\n\tth = P_SpawnMobj (source->x,source->y, source->z + 4*8*FRACUNIT, type);\r\n\tif (th->info->seesound)\r\n\t\tS_StartSound (source, th->info->seesound);\r\n\tth->target = source;\t\t/* where it came from */\r\n\tan = R_PointToAngle2 (source->x, source->y, dest->x, dest->y);\r\n\r\n\tif (dest->flags & (MF_BLENDMASK1 | MF_BLENDMASK2 | MF_BLENDMASK3))\r\n\t\tan = an + (P_Random() - P_Random() << 20);\r\n\r\n\tth->angle = an;\r\n\tan >>= ANGLETOFINESHIFT;\r\n\tspeed = th->info->speed >> 16;\r\n\tth->momx = speed * finecosine[an];\r\n\tth->momy = speed * finesine[an];\r\n\r\n\tdist = P_AproxDistance (dest->x - source->x, dest->y - source->y);\r\n\tdist = dist / th->info->speed;\r\n\tif (dist < 1)\r\n\t\tdist = 1;\r\n\tth->momz = (dest->z - source->z) / dist;\r\n\tP_CheckMissileSpawn (th);\r\n\r\n\treturn th;\r\n}\r\n\r\n\r\n/*\r\n================\r\n=\r\n= P_SpawnPlayerMissile\r\n=\r\n= Tries to aim at a nearby monster\r\n================\r\n*/\r\n\r\nvoid P_SpawnPlayerMissile (mobj_t *source, mobjtype_t type)//L8001E08C()\r\n{\r\n\tmobj_t\t\t\t*th;\r\n\tangle_t\t\t\tan;\r\n\tfixed_t\t\t\tx,y,z, slope;\r\n\tint\t\t\t\tspeed;\r\n\r\n\t/* */\r\n\t/* see which target is to be aimed at */\r\n\t/* */\r\n\tan = source->angle;\r\n\tslope = P_AimLineAttack (source, an, 16*64*FRACUNIT);\r\n\tif (!linetarget)\r\n\t{\r\n\t\tan += 1<<26;\r\n\t\tslope = P_AimLineAttack (source, an, 16*64*FRACUNIT);\r\n\t\tif (!linetarget)\r\n\t\t{\r\n\t\t\tan -= 2<<26;\r\n\t\t\tslope = P_AimLineAttack (source, an, 16*64*FRACUNIT);\r\n\t\t}\r\n\t\tif (!linetarget)\r\n\t\t{\r\n\t\t\tan = source->angle;\r\n\t\t\tslope = 0;\r\n\t\t}\r\n\t}\r\n\r\n\tx = source->x;\r\n\ty = source->y;\r\n\tz = source->z + 4*8*FRACUNIT;\r\n\r\n\tth = P_SpawnMobj (x,y,z, type);\r\n\tif (th->info->seesound)\r\n\t\tS_StartSound (source, th->info->seesound);\r\n\tth->target = source;\r\n\tth->angle = an;\r\n\r\n\tspeed = th->info->speed >> 16;\r\n\r\n\tth->momx = speed * finecosine[an>>ANGLETOFINESHIFT];\r\n\tth->momy = speed * finesine[an>>ANGLETOFINESHIFT];\r\n\tth->momz = speed * slope;\r\n\r\n\tP_CheckMissileSpawn (th);\r\n}\r\n\r\n"
  },
  {
    "path": "PSXDOOM/p_move.c",
    "content": "#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n\r\n/*================== */\r\n/* */\r\n/* out */\r\n/* */\r\n/*================== */\r\n\r\nextern\tmobj_t  *tmthing;\t\t//80077EB8\r\nextern\tfixed_t  tmx, tmy;\t\t//80077F78 , 80077F7C\r\nextern\tboolean  checkposonly;\t//80077F10\r\n\r\n/*================== */\r\n/* */\r\n/* in */\r\n/* */\r\n/*================== */\r\n\r\nboolean trymove2;\t\t//80077F64|iGp00000b54\t/* Result from P_TryMove2 */\r\nboolean floatok;\t\t//80077EA8|uGp00000a98\t/* if true, move would be ok if within tmfloorz - tmceilingz */\r\nfixed_t tmfloorz;\t\t//80078010|fGp00000c00\t/* Current floor z for P_TryMove2 */\r\nfixed_t tmceilingz;\t\t//80077D30|fGp00000920\t/* Current ceiling z for P_TryMove2 */\r\nmobj_t *movething;\t\t//800780E8|uGp00000cd8  /* Either a skull/missile target or a special pickup */\r\nline_t *blockline;\t\t//8007806C|uGp00000c5c\t/* Might be a door that can be opened */\r\n\r\nfixed_t\t\toldx, oldy;\t//80078064, 80078068    ||fGp00000c54,fGp00000c58\r\nfixed_t\t\ttmbbox[4];  //800979f0\r\nint\t\t\ttmflags;\t//80077EA4|uGp00000a94\r\nfixed_t\t\ttmdropoffz;\t//80077D68|fGp00000958  /* Lowest point contacted */\r\nsubsector_t\t*newsubsec;\t//800780E0|psGp00000cd0\t/* Dest subsector */\r\n\r\n//PSX NEW\r\nline_t *thingspec[8];\t\t//800A8d0C\r\nint\t\tnumthingspec;\t\t//80077EE8|iGp00000ad8\r\n\r\n/*\r\n===================\r\n=\r\n= P_TryMove2\r\n=\r\n= Attempt to move to a new position, crossing special lines unless MF_TELEPORT\r\n= is set\r\n=\r\n===================\r\n*/\r\n\r\nvoid P_TryMove2(void)//L8001E48C()\r\n{\r\n\tint\t\tside;\r\n\tint\t\toldside;\r\n\tline_t\t*line;\r\n\r\n\ttrymove2 = false;\t\t// until proven otherwise\r\n\tfloatok = false;\r\n\r\n\toldx = tmthing->x;\r\n\toldy = tmthing->y;\r\n\r\n\tPM_CheckPosition();\r\n\r\n\tif (checkposonly)\r\n    {\r\n\t\tcheckposonly = false;\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (!trymove2)\r\n\t\treturn;\r\n\r\n\tif (!(tmthing->flags & MF_NOCLIP))\r\n    {\r\n\t\ttrymove2 = false;\r\n\r\n\t\tif (tmceilingz - tmfloorz < tmthing->height)\r\n\t\t\treturn;\t\t\t// doesn't fit\r\n\t\tfloatok = true;\r\n\t\tif ( !(tmthing->flags&MF_TELEPORT) &&tmceilingz - tmthing->z < tmthing->height)\r\n\t\t\treturn;\t\t\t// mobj must lower itself to fit\r\n\t\tif ( !(tmthing->flags&MF_TELEPORT) && tmfloorz - tmthing->z > 24*FRACUNIT )\r\n\t\t\treturn;\t\t\t// too big a step up\r\n\t\tif ( !(tmthing->flags&(MF_DROPOFF|MF_FLOAT)) && tmfloorz - tmdropoffz > 24*FRACUNIT )\r\n\t\t\treturn;\t\t\t// don't stand over a dropoff\r\n\t}\r\n\r\n\t//\r\n\t// the move is ok, so link the thing into its new position\r\n\t//\r\n\tPM_UnsetThingPosition(tmthing);\r\n\r\n\ttmthing->floorz = tmfloorz;\r\n\ttmthing->ceilingz = tmceilingz;\r\n\ttmthing->x = tmx;\r\n\ttmthing->y = tmy;\r\n\r\n\tPM_SetThingPosition(tmthing);\r\n\r\n\tif (!tmthing->player && !(tmthing->flags & (MF_NOCLIP | MF_TELEPORT)))\r\n\t{\r\n\t\twhile (numthingspec > 0)\r\n\t\t{\r\n\t\t\tnumthingspec--;\r\n\t\t\tline = thingspec[numthingspec];\r\n\r\n\t\t\tside = P_PointOnLineSide(tmthing->x, tmthing->y, line);\r\n\t\t\toldside = P_PointOnLineSide(oldx, oldy, line);\r\n\r\n\t\t\tif (side != oldside)\r\n\t\t\t\tP_CrossSpecialLine(line, tmthing);\r\n\t\t}\r\n\t}\r\n\r\n\ttrymove2 = true;\r\n\r\n\treturn;\r\n}\r\n\r\n#if 0\r\nstatic boolean PM_CrossCheck(line_t *ld)\r\n{\r\n\tif (PM_BoxCrossLine (ld))\t{\r\n\t\tif (!PIT_CheckLine(ld)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\treturn false;\r\n}\r\n#endif\r\n\r\n/*\r\n==================\r\n=\r\n= PM_PointOnLineSide\r\n= Exclusive Psx Doom\r\n=\r\n= Returns 0 or 1\r\n=\r\n==================\r\n*/\r\n//inline\r\nint PM_PointOnLineSide(fixed_t x, fixed_t y, line_t *line)//L8001E6B8()\r\n{\r\n\tfixed_t dx, dy;\r\n\tfixed_t left, right;\r\n\r\n\tdx = (x - line->v1->x);\r\n\tdy = (y - line->v1->y);\r\n\r\n\tleft  = (line->dy >> 16) * (dx >> 16);\r\n\tright = (dy >> 16) *(line->dx >> 16);\r\n\r\n\tif (right < left)\r\n\t\treturn 0; /* front side */\r\n\treturn 1;    /* back side */\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= PM_UnsetThingPosition\r\n= Exclusive Psx Doom\r\n=\r\n= Unlinks a thing from block map and sectors\r\n=\r\n=================\r\n*/\r\n\r\nvoid PM_UnsetThingPosition(mobj_t *thing)//L8001E704()\r\n{\r\n\tint blockx, blocky;\r\n\r\n\t/* inert things don't need to be in blockmap */\r\n\t/* unlink from subsector */\r\n\tif (thing->snext)\r\n\t\tthing->snext->sprev = thing->sprev;\r\n\tif (thing->sprev)\r\n\t\tthing->sprev->snext = thing->snext;\r\n\telse\r\n\t\tthing->subsector->sector->thinglist = thing->snext;\r\n\r\n\tif (!(thing->flags & MF_NOBLOCKMAP))\r\n\t{\r\n\t\t/* inert things don't need to be in blockmap */\r\n\t\t/* unlink from block map */\r\n\t\tif (thing->bnext)\r\n\t\t\tthing->bnext->bprev = thing->bprev;\r\n\t\tif (thing->bprev)\r\n\t\t\tthing->bprev->bnext = thing->bnext;\r\n\t\telse\r\n\t\t{\r\n\t\t\tblockx = (thing->x - bmaporgx) >> MAPBLOCKSHIFT;\r\n\t\t\tblocky = (thing->y - bmaporgy) >> MAPBLOCKSHIFT;\r\n\r\n\t\t\t// Prevent buffer overflow if the map object is out of bounds.\r\n            // This is part of the fix for the famous 'linedef deletion' bug.\r\n            // From StationDoom by BodbDearg\r\n\t\t\t#if FIX_LINEDEFS_DELETION\r\n            if (blockx>=0 && blockx < bmapwidth\r\n             && blocky>=0 && blocky <bmapheight)\r\n            {\r\n                blocklinks[blocky*bmapwidth+blockx] = thing->bnext;\r\n            }\r\n            #else\r\n                blocklinks[blocky*bmapwidth+blockx] = thing->bnext;\r\n\t\t\t#endif\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= PM_SetThingPosition\r\n= Exclusive Psx Doom\r\n=\r\n= Links a thing into both a block and a subsector based on it's x y\r\n= Sets thing->subsector properly\r\n=\r\n=================\r\n*/\r\n\r\nvoid PM_SetThingPosition(mobj_t *thing)//L8001E800()\r\n{\r\n\tsector_t     *sec;\r\n\tint           blockx, blocky;\r\n\tmobj_t      **link;\r\n\r\n\t/* */\r\n\t/* link into subsector */\r\n\t/* */\r\n\tthing->subsector = newsubsec;\r\n\tif (!(thing->flags & MF_NOSECTOR))\r\n\t{\r\n\t\t/* invisible things don't go into the sector links */\r\n\t\tsec = newsubsec->sector;\r\n\r\n\t\tthing->sprev = NULL;\r\n\t\tthing->snext = sec->thinglist;\r\n\t\tif (sec->thinglist)\r\n\t\t\tsec->thinglist->sprev = thing;\r\n\t\tsec->thinglist = thing;\r\n\t}\r\n\r\n\t/* */\r\n\t/* link into blockmap */\r\n\t/* */\r\n\tif (!(thing->flags & MF_NOBLOCKMAP))\r\n\t{\r\n\t\t/* inert things don't need to be in blockmap */\r\n\t\tblockx = (thing->x - bmaporgx) >> MAPBLOCKSHIFT;\r\n\t\tblocky = (thing->y - bmaporgy) >> MAPBLOCKSHIFT;\r\n\t\tif (blockx >= 0 && blockx < bmapwidth && blocky >= 0 && blocky < bmapheight)\r\n\t\t{\r\n\t\t\tlink = &blocklinks[blocky*bmapwidth + blockx];\r\n\t\t\tthing->bprev = NULL;\r\n\t\t\tthing->bnext = *link;\r\n\t\t\tif (*link)\r\n\t\t\t\t(*link)->bprev = thing;\r\n\t\t\t*link = thing;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t/* thing is off the map */\r\n\t\t\tthing->bnext = thing->bprev = NULL;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= PM_CheckPosition\r\n=\r\n= This is purely informative, nothing is modified (except things picked up)\r\n\r\nin:\r\ntmthing\t\ta mobj_t (can be valid or invalid)\r\ntmx,tmy\t\ta position to be checked (doesn't need relate to the mobj_t->x,y)\r\n\r\nout:\r\n\r\nnewsubsec\r\nfloorz\r\nceilingz\r\ntmdropoffz\t\tthe lowest point contacted (monsters won't move to a dropoff)\r\nmovething\r\n\r\n==================\r\n*/\r\n\r\nvoid PM_CheckPosition (void) //L8001E910()\r\n{\r\n\tint\t\t\txl,xh,yl,yh,bx,by;\r\n\r\n\ttmflags = tmthing->flags;\r\n\r\n\ttmbbox[BOXTOP] = tmy + tmthing->radius;\r\n\ttmbbox[BOXBOTTOM] = tmy - tmthing->radius;\r\n\ttmbbox[BOXRIGHT] = tmx + tmthing->radius;\r\n\ttmbbox[BOXLEFT] = tmx - tmthing->radius;\r\n\r\n\tnewsubsec = R_PointInSubsector(tmx,tmy);\r\n\r\n\t//\r\n\t// the base floor / ceiling is from the subsector that contains the\r\n\t// point.  Any contacted lines the step closer together will adjust them\r\n\t//\r\n\ttmfloorz = tmdropoffz = newsubsec->sector->floorheight;\r\n\ttmceilingz = newsubsec->sector->ceilingheight;\r\n\r\n\t++validcount;\r\n\r\n\tnumthingspec = 0;//PSX\r\n\tmovething = 0;\r\n\tblockline = 0;\r\n\r\n\tif ( tmflags & MF_NOCLIP )\r\n\t{\r\n\t\ttrymove2 = true;\r\n\t\treturn;\r\n\t}\r\n\r\n\t//\r\n\t// check things first, possibly picking things up\r\n\t// the bounding box is extended by MAXRADIUS because mobj_ts are grouped\r\n\t// into mapblocks based on their origin point, and can overlap into adjacent\r\n\t// blocks by up to MAXRADIUS units\r\n\t//\r\n\txl = (tmbbox[BOXLEFT] - bmaporgx - MAXRADIUS)>>MAPBLOCKSHIFT;\r\n\txh = (tmbbox[BOXRIGHT] - bmaporgx + MAXRADIUS)>>MAPBLOCKSHIFT;\r\n\tyl = (tmbbox[BOXBOTTOM] - bmaporgy - MAXRADIUS)>>MAPBLOCKSHIFT;\r\n\tyh = (tmbbox[BOXTOP] - bmaporgy + MAXRADIUS)>>MAPBLOCKSHIFT;\r\n\r\n\tif (xl<0)\r\n\t\txl = 0;\r\n\tif (yl<0)\r\n\t\tyl = 0;\r\n\tif (xh>= bmapwidth)\r\n\t\txh = bmapwidth -1;\r\n\tif (yh>= bmapheight)\r\n\t\tyh = bmapheight -1;\r\n\r\n\tfor (bx = xl; bx <= xh; bx++)\r\n\t{\r\n\t\tfor (by = yl; by <= yh; by++)\r\n\t\t{\r\n\t\t\tif (!PM_BlockThingsIterator(bx, by))\r\n\t\t\t{\r\n\t\t\t\ttrymove2 = false;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//\r\n\t// check lines\r\n\t//\r\n\txl = (tmbbox[BOXLEFT] - bmaporgx)>>MAPBLOCKSHIFT;\r\n\txh = (tmbbox[BOXRIGHT] - bmaporgx)>>MAPBLOCKSHIFT;\r\n\tyl = (tmbbox[BOXBOTTOM] - bmaporgy)>>MAPBLOCKSHIFT;\r\n\tyh = (tmbbox[BOXTOP] - bmaporgy)>>MAPBLOCKSHIFT;\r\n\r\n\tif (xl<0)\r\n\t\txl = 0;\r\n\tif (yl<0)\r\n\t\tyl = 0;\r\n\tif (xh>= bmapwidth)\r\n\t\txh = bmapwidth -1;\r\n\tif (yh>= bmapheight)\r\n\t\tyh = bmapheight -1;\r\n\r\n\tfor (bx = xl; bx <= xh; bx++)\r\n\t{\r\n\t\tfor (by = yl; by <= yh; by++)\r\n\t\t{\r\n\t\t\tif (!PM_BlockLinesIterator(bx, by))\r\n\t\t\t{\r\n\t\t\t\ttrymove2 = false;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\ttrymove2 = true;\r\n\treturn;\r\n}\r\n\r\n//=============================================================================\r\n\r\n\r\n/*\r\n=================\r\n=\r\n= PM_BoxCrossLine\r\n=\r\n=================\r\n*/\r\n//inlne\r\nboolean PM_BoxCrossLine (line_t *ld)//L8001EC00()\r\n{\r\n\tfixed_t\t\tx1, y1, x2, y2;\r\n\tfixed_t\t\tlx, ly;\r\n\tfixed_t\t\tldx, ldy;\r\n\tfixed_t\t\tdx1,dy1;\r\n\tfixed_t\t\tdx2,dy2;\r\n\tboolean\t\tside1, side2;\r\n\r\n\tif (tmbbox[BOXRIGHT] <= ld->bbox[BOXLEFT]\r\n\t||\ttmbbox[BOXLEFT] >= ld->bbox[BOXRIGHT]\r\n\t||\ttmbbox[BOXTOP] <= ld->bbox[BOXBOTTOM]\r\n\t||\ttmbbox[BOXBOTTOM] >= ld->bbox[BOXTOP] )\r\n\t\treturn false;\r\n\r\n\ty1 = tmbbox[BOXTOP];\r\n\ty2 = tmbbox[BOXBOTTOM];\r\n\r\n\tif (ld->slopetype == ST_POSITIVE)\r\n    {\r\n\t\tx1 = tmbbox[BOXLEFT];\r\n\t\tx2 = tmbbox[BOXRIGHT];\r\n\t} else\r\n\t{\r\n\t\tx1 = tmbbox[BOXRIGHT];\r\n\t\tx2 = tmbbox[BOXLEFT];\r\n\t}\r\n\r\n\tlx = ld->v1->x;\r\n\tly = ld->v1->y;\r\n\tldx = ld->dx >> FRACBITS;\t//(ld->v2->x - lx) >> FRACBITS;\r\n\tldy = ld->dy >> FRACBITS;\t//(ld->v2->y - ly) >> FRACBITS;\r\n\r\n\tdx1 = (x1 - lx) >> FRACBITS;\r\n\tdy1 = (y1 - ly) >> FRACBITS;\r\n\tdx2 = (x2 - lx) >> FRACBITS;\r\n\tdy2 = (y2 - ly) >> FRACBITS;\r\n\r\n\tside1 = ldy*dx1 < dy1*ldx;\r\n\tside2 = ldy*dx2 < dy2*ldx;\r\n\r\n\treturn (side1 != side2);\r\n}\r\n\r\n//=============================================================================\r\n\r\n\r\n/*\r\n==================\r\n=\r\n= PIT_CheckLine\r\n=\r\n= Adjusts tmfloorz and tmceilingz as lines are contacted\r\n==================\r\n*/\r\n\r\nboolean PIT_CheckLine (line_t *ld)//L8001ED0C()\r\n{\r\n\tfixed_t\t\tpm_opentop, pm_openbottom;\r\n\tfixed_t\t\tpm_lowfloor;\r\n\tsector_t\t*front, *back;\r\n\r\n\t// a line has been hit\r\n\r\n\t/*\r\n\t=\r\n\t= The moving thing's destination position will cross the given line.\r\n\t= If this should not be allowed, return false.\r\n\t*/\r\n\tif (!ld->backsector)\r\n\t\treturn false;\t\t// one sided line\r\n\r\n\tif (!(tmthing->flags & MF_MISSILE) )\r\n\t{\r\n\t\tif ( ld->flags & ML_BLOCKING )\r\n\t\t\treturn false;\t\t// explicitly blocking everything\r\n\t\tif ( !tmthing->player && ld->flags & ML_BLOCKMONSTERS )\r\n\t\t\treturn false;\t\t// block monsters only\r\n\t}\r\n\r\n\tfront = ld->frontsector;\r\n\tback = ld->backsector;\r\n\r\n\tif (front->ceilingheight == front->floorheight\r\n\t|| back->ceilingheight == back->floorheight)\r\n\t{\r\n\t\tblockline = ld;\r\n\t\treturn false;\t\t\t// probably a closed door\r\n\t}\r\n\r\n\tif (front->ceilingheight < back->ceilingheight)\r\n\t\tpm_opentop = front->ceilingheight;\r\n\telse\r\n\t\tpm_opentop = back->ceilingheight;\r\n\r\n\tif (front->floorheight > back->floorheight)\r\n\t{\r\n\t\tpm_openbottom = front->floorheight;\r\n\t\tpm_lowfloor = back->floorheight;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tpm_openbottom = back->floorheight;\r\n\t\tpm_lowfloor = front->floorheight;\r\n\t}\r\n\r\n\t// adjust floor / ceiling heights\r\n\tif (pm_opentop < tmceilingz)\r\n\t\ttmceilingz = pm_opentop;\r\n\tif (pm_openbottom > tmfloorz)\r\n\t\ttmfloorz = pm_openbottom;\r\n\tif (pm_lowfloor < tmdropoffz)\r\n\t\ttmdropoffz = pm_lowfloor;\r\n\r\n\tif (ld->special != 0)\r\n\t{\r\n\t    //New Psx Doom\r\n\t\tif (numthingspec < MAXTHINGSPEC)\r\n\t\t{\r\n\t\t\tthingspec[numthingspec] = ld;\r\n\t\t\tnumthingspec++;\r\n\t\t}\r\n\t}\r\n\r\n\treturn true;\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= PIT_CheckThing\r\n=\r\n==================\r\n*/\r\n\r\nboolean PIT_CheckThing(mobj_t *thing)//L8001EE5C()\r\n{\r\n\tfixed_t blockdist;\r\n\tint\t\t\tdelta;\r\n\r\n\tif (!(thing->flags & (MF_SOLID|MF_SPECIAL|MF_SHOOTABLE) ))\r\n\t\treturn true;\r\n\tblockdist = thing->radius + tmthing->radius;\r\n\r\n\tdelta = thing->x - tmx;\r\n\tif (delta < 0)\r\n\t\tdelta = -delta;\r\n\tif (delta >= blockdist)\r\n\t\treturn true;\t\t// didn't hit it\r\n\r\n\tdelta = thing->y - tmy;\r\n\tif (delta < 0)\r\n\t\tdelta = -delta;\r\n\tif (delta >= blockdist)\r\n\t\treturn true;\t\t// didn't hit it\r\n\r\n\tif (thing == tmthing)\r\n\t\treturn true;\t\t// don't clip against self\r\n\r\n\t//\r\n\t// check for skulls slamming into things\r\n\t//\r\n\tif (tmthing->flags & MF_SKULLFLY)\r\n\t{\r\n\t\tmovething = thing;\r\n\t\treturn false;\t\t// stop moving\r\n\t}\r\n\r\n\t//\r\n\t// missiles can hit other things\r\n\t//\r\n\tif (tmthing->flags & MF_MISSILE)\r\n\t{\r\n\t\t// see if it went over / under\r\n\t\tif (tmthing->z > thing->z + thing->height)\r\n\t\t\treturn true;\t\t// overhead\r\n\t\tif (tmthing->z+tmthing->height < thing->z)\r\n\t\t\treturn true;\t\t// underneath\r\n\t\tif (tmthing->target->type == thing->type) // don't hit same species as originator\r\n\t\t{\r\n\t\t\tif (thing == tmthing->target)\r\n\t\t\t\treturn true;\r\n\t\t\tif (thing->type != MT_PLAYER/*&mobjinfo[MT_PLAYER]*/) // let players missile other players\r\n\t\t\t\treturn false;\t// explode, but do no damage\r\n\t\t}\r\n\t\tif (! (thing->flags & MF_SHOOTABLE) )\r\n\t\t\treturn !(thing->flags & MF_SOLID);\t\t// didn't do any damage\r\n\r\n\t\t// damage / explode\r\n\t\tmovething = thing;\r\n\t\treturn false;\t\t\t// don't traverse any more\r\n\t}\r\n\r\n\t//\r\n\t// check for special pickup\r\n\t//\r\n\tif ((thing->flags&MF_SPECIAL) && (tmflags&MF_PICKUP) )\r\n\t{\r\n\t\tmovething = thing;\r\n\t\treturn true;\r\n\t}\r\n\r\n\treturn !(thing->flags & MF_SOLID);\r\n}\r\n\r\n/*\r\n===============================================================================\r\n\r\nBLOCK MAP ITERATORS\r\n\r\nFor each line/thing in the given mapblock, call the passed function.\r\nIf the function returns false, exit with false without checking anything else.\r\n\r\n===============================================================================\r\n*/\r\n\r\n/*\r\n==================\r\n=\r\n= PM_BlockLinesIterator\r\n= Exclusive Psx Doom\r\n=\r\n= The validcount flags are used to avoid checking lines\r\n= that are marked in multiple mapblocks, so increment validcount before\r\n= the first call to PM_BlockLinesIterator, then make one or more calls to it\r\n=\r\n==================\r\n*/\r\n\r\nboolean PM_BlockLinesIterator(int x, int y)//L8001EFC0()\r\n{\r\n\tint     offset;\r\n\tshort  *list;\r\n\tline_t *ld;\r\n\r\n\toffset = (y*bmapwidth)+x;\r\n\toffset = *(blockmap + offset);\r\n\r\n\tfor (list = blockmaplump + offset; *list != -1; list++)\r\n\t{\r\n\t\tld = &lines[*list];\r\n\t\tif (ld->validcount == validcount)\r\n\t\t\tcontinue; /* line has already been checked */\r\n\t\tld->validcount = validcount;\r\n\r\n\t\tif (PM_BoxCrossLine(ld))\r\n\t\t{\r\n\t\t\tif (!PIT_CheckLine(ld))\r\n\t\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\treturn true; /* everything was checked */\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= PM_BlockThingsIterator\r\n= Exclusive Psx Doom\r\n=\r\n==================\r\n*/\r\n\r\nboolean PM_BlockThingsIterator(int x, int y)//L8001F1A0()\r\n{\r\n\tmobj_t *mobj;\r\n\r\n\tfor (mobj = blocklinks[y * bmapwidth + x]; mobj; mobj = mobj->bnext)\r\n\t{\r\n\t\tif (!PIT_CheckThing(mobj))\r\n\t\t\treturn false;\r\n\t}\r\n\r\n\treturn true;\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/p_plats.c",
    "content": "/*================================================================== */\n/*================================================================== */\n/* */\n/*\t\t\t\t\t\t\tPLATFORM RAISING */\n/* */\n/*================================================================== */\n/*================================================================== */\n#include \"doomdef.h\"\n#include \"p_local.h\"\n\nplat_t\t*activeplats[MAXPLATS];//80097a24\n\n/*================================================================== */\n/* */\n/*\tMove a plat up and down */\n/* */\n/*================================================================== */\nvoid\tT_PlatRaise(plat_t\t*plat)//L8001F218()\n{\n\tresult_e\tres;\n\n\tswitch(plat->status)\n\t{\n\t\tcase\tup:\n\t\t\tres = T_MovePlane(plat->sector,plat->speed, plat->high,plat->crush,0,1);\n\n\t\t\tif (plat->type == raiseAndChange || plat->type == raiseToNearestAndChange)\r\n            {\n\t\t\t\tif (!(gametic&7))\n\t\t\t\t\tS_StartSound((mobj_t *)&plat->sector->soundorg,sfx_stnmov);\r\n            }\n\n\t\t\tif (res == crushed && (!plat->crush))\n\t\t\t{\n\t\t\t\tplat->count = plat->wait;\n\t\t\t\tplat->status = down;\n\t\t\t\tS_StartSound((mobj_t *)&plat->sector->soundorg,sfx_pstart);\n\t\t\t}\n\t\t\telse\r\n            {\n                if (res == pastdest)\n                {\n                    plat->count = plat->wait;\n                    plat->status = waiting;\n                    S_StartSound((mobj_t *)&plat->sector->soundorg,sfx_pstop);\n                    switch(plat->type)\n                    {\n                        case downWaitUpStay:\n                            P_RemoveActivePlat(plat);\n                            break;\n                        case raiseAndChange:\n                            P_RemoveActivePlat(plat);\n                            break;\n                        case blazeDWUS:\n                            P_RemoveActivePlat(plat);\n                            break;\n                        default:\n                            break;\n                    }\n                }\r\n            }\n\t\t\tbreak;\n\t\tcase\tdown:\n\t\t\tres = T_MovePlane(plat->sector,plat->speed,plat->low,false,0,-1);\n\t\t\tif (res == pastdest)\n\t\t\t{\n\t\t\t\tplat->count = plat->wait;\n\t\t\t\tplat->status = waiting;\n\t\t\t\tS_StartSound((mobj_t *)&plat->sector->soundorg,sfx_pstop);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase\twaiting:\n\t\t\tif (!--plat->count)\n\t\t\t{\n\t\t\t\tif (plat->sector->floorheight == plat->low)\n\t\t\t\t\tplat->status = up;\n\t\t\t\telse\n\t\t\t\t\tplat->status = down;\n\t\t\t\tS_StartSound((mobj_t *)&plat->sector->soundorg,sfx_pstart);\n\t\t\t}\n\t\tcase\tin_stasis:\n\t\t\tbreak;\n\t}\n}\n\n/*================================================================== */\n/* */\n/*\tDo Platforms */\n/*\t\"amount\" is only used for SOME platforms. */\n/* */\n/*================================================================== */\nint\tEV_DoPlat(line_t *line,plattype_e type,int amount)//L8001F3FC()\n{\n\tplat_t\t\t*plat;\n\tint\t\t\tsecnum;\n\tint\t\t\trtn;\n\tsector_t\t*sec;\n\n\tsecnum = -1;\n\trtn = 0;\n\n\t/* */\n\t/*\tActivate all <type> plats that are in_stasis */\n\t/* */\n\tswitch(type)\n\t{\n\t\tcase perpetualRaise:\n\t\t\tP_ActivateInStasis(line->tag);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\twhile ((secnum = P_FindSectorFromLineTag(line,secnum)) >= 0)\n\t{\n\t\tsec = &sectors[secnum];\n\t\tif (sec->specialdata)\n\t\t\tcontinue;\n\n\t\t/* */\n\t\t/* Find lowest & highest floors around sector */\n\t\t/* */\n\t\trtn = 1;\n\t\tplat = Z_Malloc( sizeof(*plat), PU_LEVSPEC, 0);\n\t\tP_AddThinker(&plat->thinker);\n\n\t\tplat->type = type;\n\t\tplat->sector = sec;\n\t\tplat->sector->specialdata = plat;\n\t\tplat->thinker.function = T_PlatRaise;\n\t\tplat->crush = false;\n\t\tplat->tag = line->tag;\n\t\tswitch(type)\n\t\t{\n\t\t\tcase raiseToNearestAndChange:\n\t\t\t\tplat->speed = PLATSPEED/2;\n\t\t\t\tsec->floorpic = sides[line->sidenum[0]].sector->floorpic;\n\t\t\t\tplat->high = P_FindNextHighestFloor(sec,sec->floorheight);\n\t\t\t\tplat->wait = 0;\n\t\t\t\tplat->status = up;\n\t\t\t\tsec->special = 0;\t\t/* NO MORE DAMAGE, IF APPLICABLE */\n\t\t\t\tS_StartSound((mobj_t *)&sec->soundorg,sfx_stnmov);\n\t\t\t\tbreak;\n\t\t\tcase raiseAndChange:\n\t\t\t\tplat->speed = PLATSPEED/2;\n\t\t\t\tsec->floorpic = sides[line->sidenum[0]].sector->floorpic;\n\t\t\t\tplat->high = sec->floorheight + amount*FRACUNIT;\n\t\t\t\tplat->wait = 0;\n\t\t\t\tplat->status = up;\n\t\t\t\tS_StartSound((mobj_t *)&sec->soundorg,sfx_stnmov);\n\t\t\t\tbreak;\n\t\t\tcase downWaitUpStay:\n\t\t\t\tplat->speed = PLATSPEED * 4;\n\t\t\t\tplat->low = P_FindLowestFloorSurrounding(sec);\n\t\t\t\tif (plat->low > sec->floorheight)\n\t\t\t\t\tplat->low = sec->floorheight;\n\t\t\t\tplat->high = sec->floorheight;\n\t\t\t\tplat->wait = 15*PLATWAIT;\n\t\t\t\tplat->status = down;\n\t\t\t\tS_StartSound((mobj_t *)&sec->soundorg,sfx_pstart);\n\t\t\t\tbreak;\n\t\t\tcase blazeDWUS:\r\n\t\t\t\tplat->speed = PLATSPEED * 8;\r\n\t\t\t\tplat->low = P_FindLowestFloorSurrounding(sec);\r\n\r\n\t\t\t\tif (plat->low > sec->floorheight)\r\n\t\t\t\t\tplat->low = sec->floorheight;\r\n\r\n\t\t\t\tplat->high = sec->floorheight;\r\n\t\t\t\tplat->wait = 15 * PLATWAIT;\r\n\t\t\t\tplat->status = down;\r\n\t\t\t\tS_StartSound((mobj_t *)&sec->soundorg, sfx_pstart);\r\n\t\t\t\tbreak;\n\t\t\tcase perpetualRaise:\n\t\t\t\tplat->speed = PLATSPEED;\n\t\t\t\tplat->low = P_FindLowestFloorSurrounding(sec);\n\t\t\t\tif (plat->low > sec->floorheight)\n\t\t\t\t\tplat->low = sec->floorheight;\n\t\t\t\tplat->high = P_FindHighestFloorSurrounding(sec);\n\t\t\t\tif (plat->high < sec->floorheight)\n\t\t\t\t\tplat->high = sec->floorheight;\n\t\t\t\tplat->wait = 15*PLATWAIT;\n\t\t\t\tplat->status = P_Random()&1;\n\t\t\t\tS_StartSound((mobj_t *)&sec->soundorg,sfx_pstart);\n\t\t\t\tbreak;\n\t\t}\n\t\tP_AddActivePlat(plat);\n\t}\n\treturn rtn;\n}\n\nvoid P_ActivateInStasis(int tag)//L8001F6F8()\n{\n\tint\t\ti;\n\n\tfor (i = 0;i < MAXPLATS;i++)\n\t\tif (activeplats[i] &&\n\t\t\t(activeplats[i])->tag == tag &&\n\t\t\t(activeplats[i])->status == in_stasis)\n\t\t{\n\t\t\t(activeplats[i])->status = (activeplats[i])->oldstatus;\n\t\t\t(activeplats[i])->thinker.function = T_PlatRaise;\n\t\t}\n}\n\nvoid EV_StopPlat(line_t *line)//L8001F76C()\n{\n\tint\t\tj;\n\n\tfor (j = 0; j < MAXPLATS; j++)\n\t{\n\t\tif (activeplats[j] && ((activeplats[j])->status != in_stasis) &&\n\t\t\t((activeplats[j])->tag == line->tag))\n\t\t{\n\t\t\t(activeplats[j])->oldstatus = (activeplats[j])->status;\n\t\t\t(activeplats[j])->status = in_stasis;\n\t\t\t(activeplats[j])->thinker.function = NULL;\n\t\t}\n\t}\n}\n\nvoid P_AddActivePlat(plat_t *plat)//L8001F7E0()\n{\n\tint\t\ti;\n\tfor (i = 0;i < MAXPLATS;i++)\r\n    {\n\t\tif (activeplats[i] == NULL)\n\t\t{\n\t\t\tactiveplats[i] = plat;\n\t\t\treturn;\n\t\t}\r\n    }\n\tI_Error (\"P_AddActivePlat: no more plats!\");\n}\n\nvoid P_RemoveActivePlat(plat_t *plat)//L8001F838()\n{\n\tint\t\ti;\n\tfor (i = 0;i < MAXPLATS;i++)\r\n    {\n\t\tif (plat == activeplats[i])\n\t\t{\n\t\t\t(activeplats[i])->sector->specialdata = NULL;\n\t\t\tP_RemoveThinker(&(activeplats[i])->thinker);\n\t\t\tactiveplats[i] = NULL;\n\t\t\treturn;\n\t\t}\r\n    }\n\tI_Error (\"P_RemoveActivePlat: can't find plat!\");\n}\n"
  },
  {
    "path": "PSXDOOM/p_pspr.c",
    "content": "/* P_pspr.c */\r\n\r\n#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n\r\n#define\tLOWERSPEED\t\tFRACUNIT*12\r\n#define\tRAISESPEED\t\tFRACUNIT*12\r\n\r\n#define\tWEAPONX\t\t    FRACUNIT\r\n#define WEAPONBOTTOM\t(96)*FRACUNIT\t//old 128\r\n#define WEAPONTOP\t\t(0)*FRACUNIT\t//old 32\r\n\r\n#define\tBFGCELLS\t\t40\t\t\t/* plasma cells for a bfg attack */\r\n\r\n/*\r\n=================\r\n=\r\n= P_NoiseAlert\r\n=\r\n= If a monster yells at a player, it will alert other monsters to the player\r\n=\r\n=================\r\n*/\r\n\r\nmobj_t *soundtarget;//pmGp00000a18\r\n\r\n//inline\r\nvoid P_RecursiveSound (sector_t *sec, int soundblocks)//L8001F8B0()\r\n{\r\n\tint\t\t\ti;\r\n\tline_t\t\t*check;\r\n\tsector_t\t*other;\r\n\tsector_t\t*front, *back;\r\n\r\n\t/* wake up all monsters in this sector */\r\n\tif (sec->validcount == validcount && sec->soundtraversed <= soundblocks+1)\r\n\t\treturn;\t\t/* already flooded */\r\n\r\n\tsec->validcount = validcount;\r\n\tsec->soundtraversed = soundblocks+1;\r\n\tsec->soundtarget = soundtarget;\r\n\r\n\tfor (i=0 ;i<sec->linecount ; i++)\r\n\t{\r\n\t\tcheck = sec->lines[i];\r\n\t\tback = check->backsector;\r\n\t\tif (!back)\r\n\t\t\tcontinue;\t\t/* single sided */\r\n\r\n\t\tfront = check->frontsector;\r\n\t\tif (front->floorheight >= back->ceilingheight || front->ceilingheight <= back->floorheight)\r\n\t\t\tcontinue;\t\t/* closed door */\r\n\r\n\t\tif ( front == sec)\r\n\t\t\tother = back;\r\n\t\telse\r\n\t\t\tother = front;\r\n\r\n\t\tif (check->flags & ML_SOUNDBLOCK)\r\n\t\t{\r\n\t\t\tif (!soundblocks)\r\n\t\t\t\tP_RecursiveSound (other, 1);\r\n\t\t}\r\n\t\telse\r\n\t\t\tP_RecursiveSound (other, soundblocks);\r\n\t}\r\n}\r\n\r\n\r\n/*\r\n=================\r\n=\r\n= P_NoiseAlert\r\n=\r\n=================\r\n*/\r\n\r\n//inline\r\nvoid P_NoiseAlert (player_t *player)//L8001F9CC()\r\n{\r\n\tsector_t\t*sec;\r\n\r\n\tsec = player->mo->subsector->sector;\r\n\r\n\tif (player->lastsoundsector == (void *)sec)\r\n\t\treturn;\t\t/* don't bother doing it again here */\r\n\r\n    soundtarget = player->mo;\r\n\tplayer->lastsoundsector = (void *)sec;\r\n\r\n\tvalidcount++;\r\n\tP_RecursiveSound (sec, 0);\r\n}\r\n\r\n\r\n/*\r\n==================\r\n=\r\n= P_SetPsprite\r\n=\r\n==================\r\n*/\r\n\r\n//inline\r\nvoid P_SetPsprite (player_t *player, int position, statenum_t stnum) //L8001FB08()\r\n{\r\n\tpspdef_t\t*psp;\r\n\tstate_t\t*state;\r\n\r\n\tpsp = &player->psprites[position];\r\n\r\n\tdo\r\n\t{\r\n\t\tif (!stnum)\r\n\t\t{\r\n\t\t\tpsp->state = NULL;\r\n\t\t\tbreak;\t\t/* object removed itself */\r\n\t\t}\r\n\t\tstate = &states[stnum];\r\n\t\tpsp->state = state;\r\n\t\tpsp->tics = state->tics;  /* could be 0 */\r\n\r\n\t\t/* call action routine */\r\n\t\tif (state->action)\r\n\t\t{\r\n\t\t\tstate->action (player, psp);\r\n\t\t\tif (!psp->state)\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\tstnum = psp->state->nextstate;\r\n\t} while (!psp->tics);\t/* an initial state of 0 could cycle through */\r\n}\r\n\r\n\r\n/*\r\n===============================================================================\r\n\r\n\t\t\t\t\t\tPSPRITE ACTIONS\r\n\r\n===============================================================================\r\n*/\r\n\r\nweaponinfo_t\tweaponinfo[NUMWEAPONS] = //80066f24\r\n{\r\n\t{\t/* fist */\r\n/* ammo \t\t*/\tam_noammo,\r\n/* upstate \t\t*/\tS_PUNCHUP,\r\n/* downstate \t*/\tS_PUNCHDOWN,\r\n/* readystate \t*/\tS_PUNCH,\r\n/* atkstate \t*/\tS_PUNCH1,\r\n/* flashstate \t*/\tS_NULL\r\n\t},\r\n\r\n\t{\t/* pistol */\r\n/* ammo \t\t*/\tam_clip,\r\n/* upstate \t\t*/\tS_PISTOLUP,\r\n/* downstate \t*/\tS_PISTOLDOWN,\r\n/* readystate \t*/\tS_PISTOL,\r\n/* atkstate \t*/\tS_PISTOL2,\r\n/* flashstate \t*/\tS_PISTOLFLASH\r\n\t},\r\n\r\n\t{\t/* shotgun */\r\n/* ammo \t\t*/\tam_shell,\r\n/* upstate \t\t*/\tS_SGUNUP,\r\n/* downstate \t*/\tS_SGUNDOWN,\r\n/* readystate \t*/\tS_SGUN,\r\n/* atkstate \t*/\tS_SGUN2,\r\n/* flashstate \t*/\tS_SGUNFLASH1\r\n\t},\r\n\r\n    {\t/* super shotgun */\r\n/* ammo \t\t*/\tam_shell,\r\n/* upstate \t\t*/\tS_DSGUNUP,\r\n/* downstate \t*/\tS_DSGUNDOWN,\r\n/* readystate \t*/\tS_DSGUN,\r\n/* atkstate \t*/\tS_DSGUN1,\r\n/* flashstate \t*/\tS_DSGUNFLASH1\r\n    },\r\n\r\n\t{\t/* chaingun */\r\n/* ammo \t\t*/\tam_clip,\r\n/* upstate \t\t*/\tS_CHAINUP,\r\n/* downstate \t*/\tS_CHAINDOWN,\r\n/* readystate \t*/\tS_CHAIN,\r\n/* atkstate \t*/\tS_CHAIN1,\r\n/* flashstate \t*/\tS_CHAINFLASH1\r\n\t},\r\n\r\n\t{\t/* missile */\r\n/* ammo \t\t*/\tam_misl,\r\n/* upstate \t\t*/\tS_MISSILEUP,\r\n/* downstate \t*/\tS_MISSILEDOWN,\r\n/* readystate \t*/\tS_MISSILE,\r\n/* atkstate \t*/\tS_MISSILE1,\r\n/* flashstate \t*/\tS_MISSILEFLASH1\r\n\t},\r\n\r\n\t{\t/* plasma */\r\n/* ammo \t\t*/\tam_cell,\r\n/* upstate \t\t*/\tS_PLASMAUP,\r\n/* downstate \t*/\tS_PLASMADOWN,\r\n/* readystate \t*/\tS_PLASMA,\r\n/* atkstate \t*/\tS_PLASMA1,\r\n/* flashstate \t*/\tS_PLASMAFLASH1\r\n\t},\r\n\r\n\t{\t/* bfg */\r\n/* ammo \t\t*/\tam_cell,\r\n/* upstate \t\t*/\tS_BFGUP,\r\n/* downstate \t*/\tS_BFGDOWN,\r\n/* readystate \t*/\tS_BFG,\r\n/* atkstate \t*/\tS_BFG1,\r\n/* flashstate \t*/\tS_BFGFLASH1\r\n\t},\r\n\r\n\t{\t/* saw */\r\n/* ammo \t\t*/\tam_noammo,\r\n/* upstate \t\t*/\tS_SAWUP,\r\n/* downstate \t*/\tS_SAWDOWN,\r\n/* readystate \t*/\tS_SAW,\r\n/* atkstate \t*/\tS_SAW1,\r\n/* flashstate \t*/\tS_NULL\r\n\t}\r\n};\r\n\r\n\r\n/*\r\n================\r\n=\r\n= P_BringUpWeapon\r\n=\r\n= Starts bringing the pending weapon up from the bottom of the screen\r\n= Uses player\r\n================\r\n*/\r\n\r\n//inline\r\nvoid P_BringUpWeapon (player_t *player)//L8001FBB0()\r\n{\r\n\tstatenum_t\tnew;\r\n\r\n\tif (player->pendingweapon == wp_nochange)\r\n\t\tplayer->pendingweapon = player->readyweapon;\r\n\r\n\tif (player->pendingweapon == wp_chainsaw)\r\n\t{\r\n\t\tif(disableload)// Psx Doom\r\n\t\t\tS_StartSound(player->mo, sfx_sawup);\r\n\t}\r\n\r\n\tnew = weaponinfo[player->pendingweapon].upstate;\r\n\r\n\tplayer->pendingweapon = wp_nochange;\r\n\tplayer->psprites[ps_weapon].sx = WEAPONX;\r\n\tplayer->psprites[ps_weapon].sy = WEAPONBOTTOM;\r\n\tP_SetPsprite (player, ps_weapon, new);\r\n}\r\n\r\n/*\r\n================\r\n=\r\n= P_CheckAmmo\r\n=\r\n= returns true if there is enough ammo to shoot\r\n= if not, selects the next weapon to use\r\n================\r\n*/\r\n\r\nboolean P_CheckAmmo (player_t *player)//L8001FCE4()\r\n{\r\n\tammotype_t\tammo;\r\n\tint\t\t\tcount;\r\n\r\n\tammo = weaponinfo[player->readyweapon].ammo;\r\n\tif (player->readyweapon == wp_bfg)\r\n\t\tcount = BFGCELLS;\r\n\telse if (player->readyweapon == wp_supershotgun)\r\n\t\tcount = 2;\t// Double barrel.\r\n\telse\r\n\t\tcount = 1;\r\n\tif (ammo == am_noammo || player->ammo[ammo] >= count)\r\n\t\treturn true;\r\n\r\n\t/* out of ammo, pick a weapon to change to */\r\n\tdo\r\n\t{\r\n\t\tif (player->weaponowned[wp_plasma] && player->ammo[am_cell])\r\n\t\t\tplayer->pendingweapon = wp_plasma;\r\n\t\telse if (player->weaponowned[wp_supershotgun] && player->ammo[am_shell] > 2)\r\n\t\t\tplayer->pendingweapon = wp_supershotgun;\r\n\t\telse if (player->weaponowned[wp_chaingun] && player->ammo[am_clip])\r\n\t\t\tplayer->pendingweapon = wp_chaingun;\r\n\t\telse if (player->weaponowned[wp_shotgun] && player->ammo[am_shell])\r\n\t\t\tplayer->pendingweapon = wp_shotgun;\r\n\t\telse if (player->ammo[am_clip])\r\n\t\t\tplayer->pendingweapon = wp_pistol;\r\n\t\telse if (player->weaponowned[wp_chainsaw])\r\n\t\t\tplayer->pendingweapon = wp_chainsaw;\r\n\t\telse if (player->weaponowned[wp_missile] && player->ammo[am_misl])\r\n\t\t\tplayer->pendingweapon = wp_missile;\r\n\t\telse if (player->weaponowned[wp_bfg] && player->ammo[am_cell]>40)\r\n\t\t\tplayer->pendingweapon = wp_bfg;\r\n\t\telse\r\n\t\t\tplayer->pendingweapon = wp_fist;\r\n\t} while (player->pendingweapon == wp_nochange);\r\n\r\n\tP_SetPsprite (player, ps_weapon, weaponinfo[player->readyweapon].downstate);\r\n\r\n\treturn false;\r\n}\r\n\r\n\r\n/*\r\n================\r\n=\r\n= P_FireWeapon\r\n=\r\n================\r\n*/\r\n\r\nvoid P_FireWeapon (player_t *player)//L8001FF54()\r\n{\r\n\tstatenum_t\tnew;\r\n\r\n\tif (!P_CheckAmmo (player))\r\n\t\treturn;\r\n\r\n\tP_SetMobjState (player->mo, S_PLAY_ATK1);\r\n\r\n\tplayer->psprites[ps_weapon].sx = WEAPONX;\r\n\tplayer->psprites[ps_weapon].sy = WEAPONTOP;\r\n\tnew = weaponinfo[player->readyweapon].atkstate;\r\n\tP_SetPsprite (player, ps_weapon, new);\r\n\tP_NoiseAlert (player);\r\n}\r\n\r\n\r\n/*\r\n================\r\n=\r\n= P_DropWeapon\r\n=\r\n= Player died, so put the weapon away\r\n================\r\n*/\r\n\r\nvoid P_DropWeapon (player_t *player)//L8002015C()\r\n{\r\n\tP_SetPsprite (player, ps_weapon, weaponinfo[player->readyweapon].downstate);\r\n}\r\n\r\n\r\n/*\r\n=================\r\n=\r\n= A_WeaponReady\r\n=\r\n= The player can fire the weapon or change to another weapon at this time\r\n=\r\n=================\r\n*/\r\n\r\nvoid A_WeaponReady (player_t *player, pspdef_t *psp)//L80020230()\r\n{\r\n\tstatenum_t\tnew;\r\n\tint\t\t\tangle;\r\n\r\n\tif (player->readyweapon == wp_chainsaw && psp->state == &states[S_SAW])\r\n    {\r\n\t\tS_StartSound (player->mo, sfx_sawidl);\r\n    }\r\n\r\n\t/* */\r\n\t/* check for change */\r\n\t/*  if player is dead, put the weapon away */\r\n\t/* */\r\n\tif (player->pendingweapon != wp_nochange || !player->health)\r\n\t{\r\n\t/* change weapon (pending weapon should allready be validated) */\r\n\t\tnew = weaponinfo[player->readyweapon].downstate;\r\n\t\tP_SetPsprite (player, ps_weapon, new);\r\n\t\treturn;\r\n\t}\r\n\r\n\t/* */\r\n\t/* check for fire */\r\n\t/* */\r\n\t/* the missile launcher and bfg do not auto fire */\r\n\tif (ticbuttons[playernum] & BT_DATA[playernum]->BT_ATTACK)\r\n\t{\r\n\t\tP_FireWeapon (player);\r\n\t\treturn;\r\n\t}\r\n\r\n\t/* */\r\n\t/* bob the weapon based on movement speed */\r\n\t/* */\r\n\t//angle = (64*gamevbls)&(FINEANGLES-1);\r\n\tangle = (64*ticon)&(FINEANGLES-1);//PsxDoom use ticon no gamevbls\r\n\tpsp->sx = WEAPONX + (player->bob>>16) * finecosine[angle];\r\n\tangle &= FINEANGLES/2-1;\r\n\tpsp->sy = WEAPONTOP + (player->bob>>16) * finesine[angle];\r\n}\r\n\r\n\r\n/*\r\n=================\r\n=\r\n= A_ReFire\r\n=\r\n= The player can re fire the weapon without lowering it entirely\r\n=\r\n=================\r\n*/\r\n\r\n//inline\r\nvoid A_ReFire (player_t *player, pspdef_t *psp)//L80020418()\r\n{\r\n\t/* */\r\n\t/* check for fire (if a weaponchange is pending, let it go through instead) */\r\n\t/* */\r\n\tif ((ticbuttons[playernum] & BT_DATA[playernum]->BT_ATTACK)\r\n\t&& player->pendingweapon == wp_nochange && player->health)\r\n\t{\r\n\t\tplayer->refire++;\r\n\t\tP_FireWeapon (player);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tplayer->refire = 0;\r\n\t\tP_CheckAmmo (player);\r\n\t}\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= A_CheckReload\r\n=\r\n=================\r\n*/\r\n\r\nvoid A_CheckReload(player_t *player, pspdef_t *psp)//L800204B4()\r\n{\r\n\tP_CheckAmmo(player);\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= A_Lower\r\n=\r\n=================\r\n*/\r\n\r\nvoid A_Lower (player_t *player, pspdef_t *psp)//L800204D4()\r\n{\r\n\tpsp->sy += LOWERSPEED;\r\n\tif (psp->sy < WEAPONBOTTOM )\r\n\t\treturn;\r\n\tif (player->playerstate == PST_DEAD)\r\n\t{\r\n\t\tpsp->sy = WEAPONBOTTOM;\r\n\t\treturn;\t\t/* don't bring weapon back up */\r\n\t}\r\n\r\n\t/* */\r\n\t/* The old weapon has been lowered off the screen, so change the weapon */\r\n\t/* and start raising it */\r\n\t/* */\r\n\tif (!player->health)\r\n\t{\t/* player is dead, so keep the weapon off screen */\r\n\t\tP_SetPsprite (player,  ps_weapon, S_NULL);\r\n\t\treturn;\r\n\t}\r\n\r\n\tplayer->readyweapon = player->pendingweapon;\r\n\r\n\tP_BringUpWeapon (player);\r\n}\r\n\r\n\r\n/*\r\n=================\r\n=\r\n= A_Raise\r\n=\r\n=================\r\n*/\r\n\r\nvoid A_Raise (player_t *player, pspdef_t *psp)//L8002064C()\r\n{\r\n\tstatenum_t\tnew;\r\n\r\n\tpsp->sy -= RAISESPEED;\r\n\r\n\tif (psp->sy > WEAPONTOP )\r\n\t\treturn;\r\n\r\n\tpsp->sy = WEAPONTOP;\r\n\r\n\t/* */\r\n\t/* the weapon has been raised all the way, so change to the ready state */\r\n\t/* */\r\n\tnew = weaponinfo[player->readyweapon].readystate;\r\n\r\n\tP_SetPsprite (player, ps_weapon, new);\r\n}\r\n\r\n\r\n/*\r\n================\r\n=\r\n= A_GunFlash\r\n=\r\n=================\r\n*/\r\n\r\nvoid A_GunFlash (player_t *player, pspdef_t *psp) //L80020738()\r\n{\r\n\tP_SetPsprite (player,ps_flash,weaponinfo[player->readyweapon].flashstate);\r\n}\r\n\r\n\r\n/*\r\n===============================================================================\r\n\r\n\t\t\t\t\t\tWEAPON ATTACKS\r\n\r\n===============================================================================\r\n*/\r\n\r\n\r\n/*\r\n==================\r\n=\r\n= A_Punch\r\n=\r\n==================\r\n*/\r\n\r\nvoid A_Punch (player_t *player, pspdef_t *psp) //L8002080C()\r\n{\r\n\tangle_t\t\tangle;\r\n\tint\t\t\tdamage;\r\n\r\n\tdamage = ((P_Random ()&7)+1)*3;\r\n\tif (player->powers[pw_strength])\r\n\t\tdamage *= 10;\r\n\tangle = player->mo->angle;\r\n\tangle += (angle_t)(P_Random()-P_Random())<<18;\r\n\tP_LineAttack (player->mo, angle, MELEERANGE, MAXINT, damage);\r\n    /* turn to face target */\r\n\tif (linetarget)\r\n\t{\r\n\t    S_StartSound(player->mo, sfx_punch);\r\n\t\tplayer->mo->angle = R_PointToAngle2 (player->mo->x, player->mo->y, linetarget->x, linetarget->y);\r\n\t}\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= A_Saw\r\n=\r\n==================\r\n*/\r\n\r\nvoid A_Saw (player_t *player, pspdef_t *psp) //L80020904()\r\n{\r\n\tangle_t\t\tangle;\r\n\tint\t\t\tdamage;\r\n\r\n\r\n\tdamage = ((P_Random ()&7)+1)*3;\r\n\tangle = player->mo->angle;\r\n\tangle += (angle_t)(P_Random()-P_Random())<<18;\r\n\t/* use meleerange + 1 se the puff doesn't skip the flash */\r\n\tP_LineAttack (player->mo, angle, MELEERANGE+1, MAXINT, damage);\r\n\tif (!linetarget)\r\n\t{\r\n\t\tS_StartSound (player->mo, sfx_sawful);\r\n\t\treturn;\r\n\t}\r\n\tS_StartSound (player->mo, sfx_sawhit);\r\n\r\n\t/* turn to face target */\r\n\tangle = R_PointToAngle2 (player->mo->x, player->mo->y, linetarget->x, linetarget->y);\r\n\tif (angle - player->mo->angle > ANG180)\r\n\t{\r\n\t\tif (angle - player->mo->angle < -ANG90/20)\r\n\t\t\tplayer->mo->angle = angle + ANG90/21;\r\n\t\telse\r\n\t\t\tplayer->mo->angle -= ANG90/20;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tif (angle - player->mo->angle > ANG90/20)\r\n\t\t\tplayer->mo->angle = angle - ANG90/21;\r\n\t\telse\r\n\t\t\tplayer->mo->angle += ANG90/20;\r\n\t}\r\n\tplayer->mo->flags |= MF_JUSTATTACKED;\r\n}\r\n\r\n\r\n/*\r\n==================\r\n=\r\n= A_FireMissile\r\n=\r\n==================\r\n*/\r\n\r\nvoid A_FireMissile (player_t *player, pspdef_t *psp) //L80020A7C()\r\n{\r\n\tplayer->ammo[weaponinfo[player->readyweapon].ammo]--;\r\n\tP_SpawnPlayerMissile (player->mo, MT_ROCKET);\r\n}\r\n\r\n\r\n/*\r\n==================\r\n=\r\n= A_FireBFG\r\n=\r\n==================\r\n*/\r\n\r\nvoid A_FireBFG (player_t *player, pspdef_t *psp) //L80020AE0()\r\n{\r\n\tplayer->ammo[weaponinfo[player->readyweapon].ammo] -= BFGCELLS;\r\n\tP_SpawnPlayerMissile (player->mo, MT_BFG);\r\n}\r\n\r\n\r\n/*\r\n==================\r\n=\r\n= A_FirePlasma\r\n=\r\n==================\r\n*/\r\n\r\nvoid A_FirePlasma (player_t *player, pspdef_t *psp) //L80020B44()\r\n{\r\n\tplayer->ammo[weaponinfo[player->readyweapon].ammo]--;\r\n\tP_SetPsprite (player,ps_flash,weaponinfo[player->readyweapon].flashstate+(P_Random ()&1) );\r\n\tP_SpawnPlayerMissile (player->mo, MT_PLASMA);\r\n}\r\n\r\n/*\r\n===============\r\n=\r\n= P_BulletSlope\r\n=\r\n===============\r\n*/\r\n\r\nfixed_t bulletslope;   //fGp00000a0c\r\n//inline\r\nvoid P_BulletSlope(mobj_t*\tmo)//L80020C6C()\r\n{\r\n\tangle_t\tan;\r\n\r\n\t// see which target is to be aimed at\r\n\tan = mo->angle;\r\n\tbulletslope = P_AimLineAttack(mo, an, 16 * 64 * FRACUNIT);\r\n\r\n\tif (!linetarget)\r\n\t{\r\n\t\tan += 1 << 26;\r\n\t\tbulletslope = P_AimLineAttack(mo, an, 16 * 64 * FRACUNIT);\r\n\t\tif (!linetarget)\r\n\t\t{\r\n\t\t\tan -= 2 << 26;\r\n\t\t\tbulletslope = P_AimLineAttack(mo, an, 16 * 64 * FRACUNIT);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/*\r\n===============\r\n=\r\n= P_GunShot\r\n=\r\n===============\r\n*/\r\n//inline\r\nvoid P_GunShot (mobj_t *mo, boolean accurate)//L80020CF8()\r\n{\r\n\tangle_t\t\tangle;\r\n\tint\t\t\tdamage;\r\n\r\n\tdamage = ((P_Random ()&3)+1)*4;\r\n\tangle = mo->angle;\r\n\tif (!accurate)\r\n\t\tangle += (P_Random()-P_Random())<<18;\r\n\tP_LineAttack (mo, angle, MISSILERANGE, MAXINT, damage);\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= A_FirePistol\r\n=\r\n==================\r\n*/\r\n\r\nvoid A_FirePistol (player_t *player, pspdef_t *psp) //L80020D88()\r\n{\r\n\tS_StartSound (player->mo, sfx_pistol);\r\n\r\n\tplayer->ammo[weaponinfo[player->readyweapon].ammo]--;\r\n\tP_SetPsprite (player,ps_flash,weaponinfo[player->readyweapon].flashstate);\r\n\r\n\tP_GunShot (player->mo, !player->refire);\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= A_FireShotgun\r\n=\r\n==================\r\n*/\r\n\r\nvoid A_FireShotgun (player_t *player, pspdef_t *psp) //L80020F14()\r\n{\r\n\tangle_t\t\tangle;\r\n\tint\t\t\tdamage;\r\n\tint\t\t\ti;\r\n\tint\t\t\tslope;\r\n\r\n\tS_StartSound (player->mo, sfx_shotgn);\r\n\r\n\tplayer->ammo[weaponinfo[player->readyweapon].ammo]--;\r\n\tP_SetPsprite (player,ps_flash,weaponinfo[player->readyweapon].flashstate);\r\n\r\n\tslope = P_AimLineAttack (player->mo, player->mo->angle, MISSILERANGE);\r\n\r\n/* shotgun pellets all go at a fixed slope */\r\n\r\n\tfor (i=0 ; i<7 ; i++)\r\n\t{\r\n\t\tdamage = ((P_Random ()&3)+1)*4;\r\n\t\tangle = player->mo->angle;\r\n\t\tangle += (P_Random()-P_Random())<<18;\r\n\t\tP_LineAttack (player->mo, angle, MISSILERANGE, slope, damage);\r\n\t}\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= A_FireShotgun2\r\n=\r\n==================\r\n*/\r\n\r\nvoid A_FireShotgun2(player_t *player, pspdef_t *psp)//L800210C4()\r\n{\r\n    angle_t\t\tangle;\r\n\tint\t\t\tdamage;\r\n\tint\t\t\ti;\r\n\r\n\tS_StartSound(player->mo, sfx_dshtgn);\r\n\tP_SetMobjState(player->mo, S_PLAY_ATK2);\r\n\r\n\tplayer->ammo[weaponinfo[player->readyweapon].ammo] -= 2;\r\n\tP_SetPsprite(player, ps_flash, weaponinfo[player->readyweapon].flashstate);\r\n\r\n\tP_BulletSlope(player->mo);\r\n\r\n\tfor (i = 0; i<20; i++)\r\n\t{\r\n\t\tdamage = 5 * (P_Random() % 3 + 1);\r\n\t\tangle = player->mo->angle;\r\n\t\tangle += (P_Random() - P_Random()) << 19;\r\n\t\tP_LineAttack(player->mo, angle, MISSILERANGE, bulletslope + ((P_Random() - P_Random()) << 5), damage);\r\n\t}\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= A_CockSgun\r\n=\r\n==================\r\n*/\r\n#if 0 //No Used In PSX Doom\r\nvoid A_CockSgun (player_t *player, pspdef_t *psp)\r\n{\r\n\tS_StartSound (player->mo, sfx_sgcock);\r\n}\r\n#endif // 0\r\n\r\n/*\r\n==================\r\n=\r\n= A_FireCGun\r\n=\r\n==================\r\n*/\r\n\r\nvoid A_FireCGun (player_t *player, pspdef_t *psp) //L8002130C()\r\n{\r\n\tS_StartSound (player->mo, sfx_pistol);\r\n\r\n\tif (!player->ammo[weaponinfo[player->readyweapon].ammo])\r\n\t\treturn;\r\n\r\n\tplayer->ammo[weaponinfo[player->readyweapon].ammo]--;\r\n\r\n\tP_SetPsprite (player,ps_flash,weaponinfo[player->readyweapon].flashstate + psp->state - &states[S_CHAIN1]);\r\n\r\n\tP_GunShot (player->mo, !player->refire);\r\n}\r\n\r\n\r\n/*============================================================================= */\r\n\r\n\r\nvoid A_Light0 (player_t *player, pspdef_t *psp)//L800214F4()\r\n{\r\n\tplayer->extralight = 0;\r\n}\r\n\r\nvoid A_Light1 (player_t *player, pspdef_t *psp)//L800214FC()\r\n{\r\n\tplayer->extralight = 8;\r\n}\r\n\r\nvoid A_Light2 (player_t *player, pspdef_t *psp)//L80021508()\r\n{\r\n\tplayer->extralight = 16;\r\n}\r\n\r\n/*\r\n================\r\n=\r\n= A_BFGSpray\r\n=\r\n= Spawn a BFG explosion on every monster in view\r\n=\r\n=================\r\n*/\r\n//inline\r\nvoid A_BFGSpray (mobj_t *mo) //L80021514()\r\n{\r\n\tint\t\t\ti, j, damage;\r\n\tangle_t\t\tan;\r\n\r\n\t/* offset angles from its attack angle */\r\n\tfor (i=0 ; i<40 ; i++)\r\n\t{\r\n\t\tan = mo->angle - ANG90/2 + ANG90/40*i;\r\n\t\t/* mo->target is the originator (player) of the missile */\r\n\t\tP_AimLineAttack (mo->target, an, 16*64*FRACUNIT);\r\n\t\tif (!linetarget)\r\n\t\t\tcontinue;\r\n\t\tP_SpawnMobj (linetarget->x, linetarget->y, linetarget->z + (linetarget->height>>2), MT_EXTRABFG);\r\n\t\tdamage = 0;\r\n\t\tfor (j=0;j<15;j++)\r\n        {\r\n\t\t\tdamage += (P_Random()&7) + 1;\r\n        }\r\n\t\tP_DamageMobj (linetarget, mo->target,mo->target, damage);\r\n\t}\r\n}\r\n\r\n/*\r\n================\r\n=\r\n= A_BFGsound\r\n=\r\n=================\r\n*/\r\n\r\nvoid A_BFGsound (player_t *player, pspdef_t *psp)//L80021604()\r\n{\r\n\tS_StartSound (player->mo, sfx_bfg);\r\n}\r\n\r\n/*\r\n================\r\n=\r\n= A_OpenShotgun2\r\n=\r\n=================\r\n*/\r\n\r\nvoid A_OpenShotgun2(player_t *player, pspdef_t *psp)//L80021628()\r\n{\r\n\tS_StartSound(player->mo, sfx_dbopn);\r\n}\r\n\r\n/*\r\n================\r\n=\r\n= A_LoadShotgun2\r\n=\r\n=================\r\n*/\r\n\r\nvoid A_LoadShotgun2(player_t *player, pspdef_t *psp)//L8002164C()\r\n{\r\n\tS_StartSound(player->mo, sfx_dbload);\r\n}\r\n\r\n/*\r\n================\r\n=\r\n= A_CloseShotgun2\r\n=\r\n=================\r\n*/\r\n\r\nvoid A_CloseShotgun2(player_t *player, pspdef_t *psp)//L80021670()\r\n{\r\n\tS_StartSound(player->mo, sfx_dbcls);\r\n\tA_ReFire(player, psp);\r\n}\r\n\r\n/*============================================================================= */\r\n\r\nint\t\tticremainder[MAXPLAYERS];//0x80077ebc\r\n\r\n/*\r\n==================\r\n=\r\n= P_SetupPsprites\r\n=\r\n= Called at start of level for each player\r\n==================\r\n*/\r\n\r\nvoid P_SetupPsprites (int curplayer) //L8002172C() //(player_t *player)\r\n{\r\n\tint\ti;\r\n\tplayer_t *player;\r\n\r\n\tticremainder[curplayer] = 0;\r\n\tplayer = &players[curplayer];\r\n\r\n\t/* remove all psprites */\r\n\r\n\tfor (i=0 ; i<NUMPSPRITES ; i++)\r\n\t\tplayer->psprites[i].state = NULL;\r\n\r\n\t/* spawn the gun */\r\n\tplayer->pendingweapon = player->readyweapon;\r\n\tP_BringUpWeapon (player);\r\n}\r\n\r\n\r\n\r\n/*\r\n==================\r\n=\r\n= P_MovePsprites\r\n=\r\n= Called every tic by player thinking routine\r\n==================\r\n*/\r\n\r\nvoid P_MovePsprites (player_t *player) //L800218A4()\r\n{\r\n\tint\t\t\ti;\r\n\tpspdef_t\t*psp;\r\n\tstate_t\t\t*state;\r\n\r\n\tticremainder[playernum] += vblsinframe[playernum];\r\n\r\n\twhile (ticremainder[playernum] >= 4)\r\n\t{\r\n\t\tticremainder[playernum] -= 4;\r\n\r\n\t\tpsp = &player->psprites[0];\r\n\t\tfor (i=0 ; i<NUMPSPRITES ; i++, psp++)\r\n\t\t{\r\n\t\t\tif ( (state = psp->state) != 0)\t\t/* a null state means not active */\r\n\t\t\t{\r\n\t\t\t/* drop tic count and possibly change state */\r\n\t\t\t\tif (psp->tics != -1)\t/* a -1 tic count never changes */\r\n\t\t\t\t{\r\n\t\t\t\t\tpsp->tics--;\r\n\t\t\t\t\tif (!psp->tics)\r\n\t\t\t\t\t\tP_SetPsprite (player, i, psp->state->nextstate);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tplayer->psprites[ps_flash].sx = player->psprites[ps_weapon].sx;\r\n\tplayer->psprites[ps_flash].sy = player->psprites[ps_weapon].sy;\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "PSXDOOM/p_setup.c",
    "content": "/* P_main.c */\r\n\r\n#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n\r\nvoid\tP_SpawnMapThing (mapthing_t *mthing);\r\nvoid\tP_Init(void);\r\nvoid\tP_SetupLevel(int map, skill_t skill);\r\nvoid\tP_LoadBlocks(char *filename);\r\nvoid\tP_CacheSprite(spritedef_t *sprdef);\r\nvoid\tP_LoadTextureByWidth(int width);\r\n\r\nint\t\t\tnumvertexes;\t//80077E44|uGp00000a34\r\nvertex_t\t*vertexes;\t\t//8007800C|puGp00000bfc\r\n\r\nint\t\t\tnumsegs;\t\t//80077ECC\r\nseg_t\t\t*segs;\t\t\t//8007805C\r\n\r\nint\t\t\tnumsectors;\t\t//80077D80\r\nsector_t\t*sectors;\t\t//80077ED0\r\n\r\nint\t\t\tnumsubsectors;\t//80078048\r\nsubsector_t\t*subsectors;\t//80077D6C\r\n\r\nint\t\t\tnumnodes;\t\t//80077FE0\r\nnode_t\t\t*nodes;\t\t\t//80077CD0\r\n\r\nint\t\t\tnumlines;\t\t//80077FF0\r\nline_t\t\t*lines;\t\t\t//80077CDC\r\n\r\nint\t\t\tnumsides;\t\t//80077FDC\r\nside_t\t\t*sides;\t\t\t//80077CCC\r\n\r\nint\t\t\tnumleafs;\t\t//80077D90\r\nleaf_t\t\t*leafs;\t\t\t//80077F34\r\n\r\nshort\t\t*blockmaplump;\t\t\t//80077EEC /* offsets in blockmap are from here */\r\nshort\t\t*blockmap;\r\nint\t\t\tbmapwidth, bmapheight;\t/* in mapblocks */ //800780A8, 80077CE4\r\nfixed_t\t\tbmaporgx, bmaporgy;\t\t/* origin of block map */ //80077FB4,80077FBC\r\nmobj_t\t\t**blocklinks;\t\t\t/* for thing chains */ //80077D08\r\n\r\nbyte\t\t*rejectmatrix;\t\t\t/* for fast sight rejection */\r\n\r\n//mapthing_t\tdeathmatchstarts[10], *deathmatch_p;//80097e4c, 80077E8C\r\n//mapthing_t\tplayerstarts[MAXPLAYERS];//800a8c60\r\n\r\n/*\r\n=================\r\n=\r\n= P_LoadVertexes\r\n=\r\n=================\r\n*/\r\n//inline\r\nvoid P_LoadVertexes (int lump)//L80021A64()\r\n{\r\n\tbyte\t\t*data;\r\n\tint\t\t\ti, lumpSize;\r\n\tmapvertex_t\t*ml;\r\n\tvertex_t\t*li;\r\n\r\n\tif (W_MapLumpLength(lump) > 65536)\r\n\t\tI_Error(\"P_LoadVertexes: lump > 64K\");\r\n\r\n\tnumvertexes = W_MapLumpLength(lump) / sizeof(mapvertex_t);\r\n\tvertexes = Z_Malloc (numvertexes*sizeof(vertex_t),PU_LEVEL,0);\r\n\r\n\tdata = (byte *)tempbuffer;\r\n\tW_ReadMapLump(lump, data, true);\r\n\r\n\tml = (mapvertex_t *)data;\r\n\tli = vertexes;\r\n\tfor (i=0 ; i<numvertexes ; i++, li++, ml++)\r\n\t{\r\n\t\tli->x = LITTLELONG(ml->x);\r\n\t\tli->y = LITTLELONG(ml->y);\r\n\t\tli->index = 0;\r\n\t}\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= P_LoadSegs\r\n=\r\n=================\r\n*/\r\n\r\nvoid P_LoadSegs (int lump)//L80021B38()\r\n{\r\n\tbyte\t\t*data;\r\n\tint\t\t\ti;\r\n\tmapseg_t\t*ml;\r\n\tseg_t\t\t*li;\r\n\tline_t\t\t*ldef;\r\n\tint\t\t\tlinedef, side;\r\n\r\n\tif (W_MapLumpLength(lump) > 65536)\r\n\t\tI_Error(\"P_LoadSegs: lump > 64K\");\r\n\r\n\tnumsegs = W_MapLumpLength(lump) / sizeof(mapseg_t);\r\n\tsegs = Z_Malloc (numsegs*sizeof(seg_t),PU_LEVEL,0);\r\n\tD_memset (segs, 0, numsegs*sizeof(seg_t));\r\n\r\n\tdata = (byte *)tempbuffer;\r\n\tW_ReadMapLump(lump, data, true);\r\n\r\n\tml = (mapseg_t *)data;\r\n\tli = segs;\r\n\tfor (i=0 ; i<numsegs ; i++, li++, ml++)\r\n\t{\r\n\t\tli->v1 = &vertexes[LITTLESHORT(ml->v1)];\r\n\t\tli->v2 = &vertexes[LITTLESHORT(ml->v2)];\r\n\r\n\t\tli->angle = (LITTLESHORT(ml->angle)) << FRACBITS;\r\n\t\tli->offset = (LITTLESHORT(ml->offset)) << FRACBITS;\r\n\r\n\t\tlinedef = LITTLESHORT(ml->linedef);\r\n\t\tldef = &lines[linedef];\r\n\t\tli->linedef = ldef;\r\n\r\n\t\tside = LITTLESHORT(ml->side);\r\n\t\tli->sidedef = &sides[ldef->sidenum[side]];\r\n\r\n\t\tli->frontsector = sides[ldef->sidenum[side]].sector;\r\n\r\n\t\tif (ldef-> flags & ML_TWOSIDED)\r\n\t\t\tli->backsector = sides[ldef->sidenum[side^1]].sector;\r\n\t\telse\r\n\t\t\tli->backsector = 0;\r\n\r\n\t\tif (ldef->v1 == li->v1)\r\n\t\t\tldef->fineangle = li->angle >> ANGLETOFINESHIFT;\r\n\t}\r\n}\r\n\r\n\r\n/*\r\n=================\r\n=\r\n= P_LoadSubsectors\r\n=\r\n=================\r\n*/\r\n//inline\r\nvoid P_LoadSubsectors (int lump)//L80021D70()\r\n{\r\n\tbyte\t\t\t*data;\r\n\tint\t\t\t\ti;\r\n\tmapsubsector_t\t*ms;\r\n\tsubsector_t\t\t*ss;\r\n\r\n\tif (W_MapLumpLength(lump) > 65536)\r\n\t\tI_Error(\"P_LoadSubsectors: lump > 64K\");\r\n\r\n\tnumsubsectors = W_MapLumpLength (lump) / sizeof(mapsubsector_t);\r\n\tsubsectors = Z_Malloc (numsubsectors*sizeof(subsector_t),PU_LEVEL,0);\r\n\tD_memset (subsectors,0, numsubsectors*sizeof(subsector_t));\r\n\r\n\tdata = (byte *)tempbuffer;\r\n\tW_ReadMapLump(lump, data, true);\r\n\r\n\tms = (mapsubsector_t *)data;\r\n\tss = subsectors;\r\n\tfor (i=0 ; i<numsubsectors ; i++, ss++, ms++)\r\n\t{\r\n\t\tss->numlines = LITTLESHORT(ms->numsegs);\r\n\t\tss->firstline = LITTLESHORT(ms->firstseg);\r\n\t\tss->numleafs = 0;\r\n\t\tss->leaf = 0;\r\n\t}\r\n}\r\n\r\n\r\n/*\r\n=================\r\n=\r\n= P_LoadSectors\r\n=\r\n=================\r\n*/\r\n\r\nvoid P_LoadSectors (int lump)//L80021E5C()\r\n{\r\n\tbyte\t\t\t*data;\r\n\tint\t\t\t\ti;\r\n\tmapsector_t\t\t*ms;\r\n\tsector_t\t\t*ss;\r\n\tint\t\t\t\tskytexture;\r\n\tchar\t\t    skyname[16];\r\n\tskyname[0] = 'S';\r\n\tskyname[1] = 'K';\r\n\tskyname[2] = 'Y';\r\n\tskyname[3] = 0;\r\n\tskyname[4] = 0;\r\n\tskyname[5] = 0;\r\n\r\n\tif (W_MapLumpLength(lump) > 65536)\r\n\t\tI_Error(\"P_LoadSectors: lump > 64K\");\r\n\r\n\tnumsectors = W_MapLumpLength(lump) / sizeof(mapsector_t);\r\n\tsectors = Z_Malloc (numsectors*sizeof(sector_t),PU_LEVEL,0);\r\n\tD_memset (sectors, 0, numsectors*sizeof(sector_t));\r\n\r\n\tdata = (byte *)tempbuffer;\r\n\tW_ReadMapLump(lump, data, true);\r\n\r\n\tms = (mapsector_t *)data;\r\n\tss = sectors;\r\n\tfor (i=0 ; i<numsectors ; i++, ss++, ms++)\r\n\t{\r\n\t\tss->floorheight = LITTLESHORT(ms->floorheight)<<FRACBITS;\r\n\t\tss->ceilingheight = LITTLESHORT(ms->ceilingheight)<<FRACBITS;\r\n\t\tss->colorid = ms->colorid;\r\n\t\tss->lightlevel = ms->lightlevel;\r\n\t\tss->special = LITTLESHORT(ms->special);\r\n\t\tss->thinglist = NULL;\r\n\t\tss->tag = LITTLESHORT(ms->tag);\r\n\t\tss->flags = LITTLELONG(ms->flags);\r\n\r\n\t\tss->floorpic = R_FlatNumForName(ms->floorpic);\r\n\t\tif (!D_strncasecmp(ms->ceilingpic, \"F_SKY\", 5))\r\n\t\t{\r\n\t\t\tss->ceilingpic = -1;\r\n\t\t\tskyname[3] = ms->ceilingpic[5];\r\n\t\t\tskyname[4] = ms->ceilingpic[6];\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tss->ceilingpic = R_FlatNumForName(ms->ceilingpic);\r\n\t\t}\r\n\t}\r\n\r\n\tskytexturep = NULL;\r\n\tif (skyname[3] != 0)\r\n\t{\r\n\t\tskytexture = R_TextureNumForName(skyname);\r\n\t\tskytexturep = &textures[skytexture];\r\n\t}\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= P_LoadNodes\r\n=\r\n=================\r\n*/\r\n\r\nvoid P_LoadNodes (int lump)//L8002209C()\r\n{\r\n\tbyte\t\t*data;\r\n\tint\t\t\ti,j,k;\r\n\tmapnode_t\t*mn;\r\n\tnode_t\t\t*no;\r\n\r\n\tif (W_MapLumpLength(lump) > 65536)\r\n\t\tI_Error(\"P_LoadNodes: lump > 64K\");\r\n\r\n\tnumnodes = W_MapLumpLength(lump) / sizeof(mapnode_t);\r\n\tnodes = Z_Malloc (numnodes*sizeof(node_t),PU_LEVEL,0);\r\n\r\n\tdata = (byte *)tempbuffer;\r\n\tW_ReadMapLump(lump, data, true);\r\n\r\n\tmn = (mapnode_t *)data;\r\n\tno = nodes;\r\n\tfor (i=0 ; i<numnodes ; i++, no++, mn++)\r\n\t{\r\n\t\tno->line.x = LITTLESHORT(mn->x) << FRACBITS;\r\n\t\tno->line.y = LITTLESHORT(mn->y) << FRACBITS;\r\n\t\tno->line.dx = LITTLESHORT(mn->dx) << FRACBITS;\r\n\t\tno->line.dy = LITTLESHORT(mn->dy) << FRACBITS;\r\n\t\tfor (j=0 ; j<2 ; j++)\r\n\t\t{\r\n\t\t\tno->children[j] = (unsigned short)LITTLESHORT(mn->children[j]);\r\n\t\t\tfor (k=0 ; k<4 ; k++)\r\n\t\t\t\tno->bbox[j][k] = LITTLESHORT(mn->bbox[j][k]) << FRACBITS;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= P_LoadThings\r\n=\r\n=================\r\n*/\r\n//inline\r\nvoid P_LoadThings (int lump)//L80022210()\r\n{\r\n\tbyte\t\t\t*data;\r\n\tint\t\t\t\ti;\r\n\tmapthing_t\t\t*mt;\r\n\tint\t\t\t\tnumthings;\r\n\r\n\tif (W_MapLumpLength(lump) > 65536)\r\n\t\tI_Error(\"P_LoadThings: lump > 64K\");\r\n\r\n\tdata = (byte *)tempbuffer;\r\n\tW_ReadMapLump(lump, data, true);\r\n\r\n\tnumthings = W_MapLumpLength(lump) / sizeof(mapthing_t);\r\n\r\n\tmt = (mapthing_t *)data;\r\n\tfor (i=0 ; i<numthings ; i++, mt++)\r\n\t{\r\n\t\tmt->x = LITTLESHORT(mt->x);\r\n\t\tmt->y = LITTLESHORT(mt->y);\r\n\t\tmt->angle = LITTLESHORT(mt->angle);\r\n\t\tmt->type = LITTLESHORT(mt->type);\r\n\t\tmt->options = LITTLESHORT(mt->options);\r\n\t\tP_SpawnMapThing (mt);\r\n\r\n\t\tif (mt->type >= 4096)\r\n\t\t\tI_Error(\"P_LoadThings: doomednum:%d >= 4096\", mt->type);\r\n\t}\r\n}\r\n\r\n\r\n\r\n/*\r\n=================\r\n=\r\n= P_LoadLineDefs\r\n=\r\n= Also counts secret lines for intermissions\r\n=================\r\n*/\r\n\r\nvoid P_LoadLineDefs (int lump)//L80022314()\r\n{\r\n\tbyte\t\t\t*data;\r\n\tint\t\t\t\ti;\r\n\tmaplinedef_t\t*mld;\r\n\tline_t\t\t\t*ld;\r\n\tvertex_t\t\t*v1, *v2;\r\n\r\n\tif (W_MapLumpLength(lump) > 65536)\r\n\t\tI_Error(\"P_LoadLineDefs: lump > 64K\");\r\n\r\n\tnumlines = W_MapLumpLength(lump) / sizeof(maplinedef_t);\r\n\tlines = Z_Malloc (numlines*sizeof(line_t),PU_LEVEL,0);\r\n\tD_memset (lines, 0, numlines*sizeof(line_t));\r\n\r\n\tdata = (byte *)tempbuffer;\r\n\tW_ReadMapLump(lump, data, true);\r\n\r\n\tmld = (maplinedef_t *)data;\r\n\tld = lines;\r\n\tfor (i=0 ; i<numlines ; i++, mld++, ld++)\r\n\t{\r\n\t\tld->flags = LITTLESHORT(mld->flags);\r\n\t\tld->special = LITTLESHORT(mld->special);\r\n\t\tld->tag = LITTLESHORT(mld->tag);\r\n\r\n\t\tv1 = ld->v1 = &vertexes[LITTLESHORT(mld->v1)];\r\n\t\tv2 = ld->v2 = &vertexes[LITTLESHORT(mld->v2)];\r\n\r\n\t\tld->dx = (v2->x - v1->x);\r\n\t\tld->dy = (v2->y - v1->y);\r\n\r\n\t\tif (!ld->dx)\r\n\t\t\tld->slopetype = ST_VERTICAL;\r\n\t\telse if (!ld->dy)\r\n\t\t\tld->slopetype = ST_HORIZONTAL;\r\n\t\telse\r\n\t\t{\r\n\t\t\tif (FixedDiv (ld->dy , ld->dx) > 0)\r\n\t\t\t\tld->slopetype = ST_POSITIVE;\r\n\t\t\telse\r\n\t\t\t\tld->slopetype = ST_NEGATIVE;\r\n\t\t}\r\n\r\n\t\tif (v1->x < v2->x)\r\n\t\t{\r\n\t\t\tld->bbox[BOXLEFT] = v1->x;\r\n\t\t\tld->bbox[BOXRIGHT] = v2->x;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tld->bbox[BOXLEFT] = v2->x;\r\n\t\t\tld->bbox[BOXRIGHT] = v1->x;\r\n\t\t}\r\n\r\n\t\tif (v1->y < v2->y)\r\n\t\t{\r\n\t\t\tld->bbox[BOXBOTTOM] = v1->y;\r\n\t\t\tld->bbox[BOXTOP] = v2->y;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tld->bbox[BOXBOTTOM] = v2->y;\r\n\t\t\tld->bbox[BOXTOP] = v1->y;\r\n\t\t}\r\n\r\n\t\tld->sidenum[0] = LITTLESHORT(mld->sidenum[0]);\r\n\t\tld->sidenum[1] = LITTLESHORT(mld->sidenum[1]);\r\n\r\n\t\tif (ld->sidenum[0] != -1)\r\n\t\t\tld->frontsector = sides[ld->sidenum[0]].sector;\r\n\t\telse\r\n\t\t\tld->frontsector = 0;\r\n\r\n\t\tif (ld->sidenum[1] != -1)\r\n\t\t\tld->backsector = sides[ld->sidenum[1]].sector;\r\n\t\telse\r\n\t\t\tld->backsector = 0;\r\n\t}\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= P_LoadSideDefs\r\n=\r\n=================\r\n*/\r\n\r\nvoid P_LoadSideDefs (int lump)//L800225E8()\r\n{\r\n\tbyte\t\t\t*data;\r\n\tint\t\t\t\ti;\r\n\tmapsidedef_t\t*msd;\r\n\tside_t\t\t\t*sd;\r\n\r\n\tif (W_MapLumpLength(lump) > 65536)\r\n\t\tI_Error(\"P_LoadSideDefs: lump > 64K\");\r\n\r\n\tnumsides = W_MapLumpLength(lump) / sizeof(mapsidedef_t);\r\n\tsides = Z_Malloc (numsides*sizeof(side_t),PU_LEVEL,0);\r\n\tD_memset (sides, 0, numsides*sizeof(side_t));\r\n\r\n\tdata = (byte *)tempbuffer;\r\n\tW_ReadMapLump(lump, data, true);\r\n\r\n\tmsd = (mapsidedef_t *)data;\r\n\tsd = sides;\r\n\tfor (i=0 ; i<numsides ; i++, msd++, sd++)\r\n\t{\r\n\t\tsd->textureoffset = LITTLESHORT(msd->textureoffset)<<FRACBITS;\r\n\t\tsd->rowoffset = LITTLESHORT(msd->rowoffset)<<FRACBITS;\r\n\t\tsd->sector = &sectors[LITTLESHORT(msd->sector)];\r\n\r\n\t\tsd->toptexture = R_TextureNumForName(msd->toptexture);\r\n\t\tsd->midtexture = R_TextureNumForName(msd->midtexture);\r\n\t\tsd->bottomtexture = R_TextureNumForName(msd->bottomtexture);\r\n\t}\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= P_LoadBlockMap\r\n=\r\n=================\r\n*/\r\n\r\nvoid P_LoadBlockMap (int lump)//L80022764()\r\n{\r\n\tint\t\tcount;\r\n\tint\t\ti;\r\n\tint     length;\r\n\r\n\tlength = W_MapLumpLength(lump);\r\n\tblockmaplump = Z_Malloc(length, PU_LEVEL, 0);\r\n\tW_ReadMapLump(lump, blockmaplump, true);\r\n\r\n\tblockmap = blockmaplump+4;//skip blockmap header\r\n\tcount = W_MapLumpLength(lump)/2;\r\n\tfor (i=0 ; i<count ; i++)\r\n\t\tblockmaplump[i] = LITTLESHORT(blockmaplump[i]);\r\n\r\n\tbmapwidth = blockmaplump[2];\r\n\tbmapheight = blockmaplump[3];\r\n\tbmaporgx = blockmaplump[0]<<FRACBITS;\r\n\tbmaporgy = blockmaplump[1]<<FRACBITS;\r\n\r\n\t/* clear out mobj chains */\r\n\tcount = sizeof(*blocklinks)* bmapwidth*bmapheight;\r\n\tblocklinks = Z_Malloc (count,PU_LEVEL, 0);\r\n\tD_memset (blocklinks, 0, count);\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= P_LoadReject\r\n= Include On Psx Doom\r\n=\r\n=================\r\n*/\r\n//inline\r\nvoid P_LoadReject(int lump)//L80022864()\r\n{\r\n\tint length;\r\n\r\n\tlength = W_MapLumpLength(lump);\r\n\trejectmatrix = (byte*)Z_Malloc(length, PU_LEVEL, 0);\r\n\tW_ReadMapLump(lump, rejectmatrix, true);\r\n}\r\n\r\n\r\n/*\r\n=================\r\n=\r\n= P_LoadLeafs\r\n= Exclusive Psx Doom\r\n=\r\n=================\r\n*/\r\n\r\nvoid P_LoadLeafs(int lump)//L800228B8()\r\n{\r\n\tint         i, j;\r\n\tint         length, size, count;\r\n\tint\t\t\tvertex, seg;\r\n\tsubsector_t *ss;\r\n\tleaf_t      *lf;\r\n\tbyte\t\t*data;\r\n\tshort       *mlf;\r\n\r\n    if (W_MapLumpLength(lump) > 65536)\r\n\t\tI_Error(\"P_LoadLeafs: lump > 64K\");\r\n\r\n    data = tempbuffer;\r\n    W_ReadMapLump(lump, data, true);\r\n\r\n    size = 0;\r\n    count = 0;\r\n    mlf = (short *)data;\r\n    length = W_MapLumpLength(lump);\r\n    while ((int)mlf < (int)(data + length))\r\n    {\r\n        count += 1;\r\n        size += (int)*mlf;\r\n        mlf += (int)(*mlf << 1) + 1;\r\n    }\r\n\r\n    if (count != numsubsectors)\r\n\t\tI_Error(\"P_LoadLeafs: leaf/subsector inconsistancy\\n\");\r\n\r\n\tleafs = Z_Malloc(size * sizeof(leaf_t), PU_LEVEL, 0);//plGp00000b24 = leafs;\r\n\r\n    lf = leafs;\r\n    ss = subsectors;\r\n\r\n\tnumleafs = 0;\r\n    mlf = (short *)data;\r\n\tfor (i = 0; i < count; i++, ss++)\r\n\t{\r\n        ss->numleafs = LITTLESHORT(*mlf++);\r\n\t\tss->leaf = (short)numleafs;\r\n\r\n\t\tfor (j = 0; j < (int)ss->numleafs; j++, lf++)\r\n        {\r\n            vertex = LITTLESHORT(*mlf++);\r\n\r\n\t\t\tif (vertex >= numvertexes)\r\n\t\t\t\tI_Error(\"P_LoadLeafs: vertex out of range\\n\");\r\n\r\n\t\t\tlf->vertex = &vertexes[vertex];\r\n\r\n\t\t\tseg = LITTLESHORT(*mlf++);\r\n\t\t\tif (seg != -1)\r\n\t\t\t{\r\n\t\t\t\tif (seg >= numsegs)\r\n\t\t\t\t\tI_Error(\"P_LoadLeafs: seg out of range\\n\");\r\n\r\n\t\t\t\tlf->seg = &segs[seg];\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tlf->seg = NULL;\r\n\t\t\t}\r\n        }\r\n        numleafs += (int)ss->numleafs;\r\n\t}\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= P_GroupLines\r\n=\r\n= Builds sector line lists and subsector sector numbers\r\n= Finds block bounding boxes for sectors\r\n=================\r\n*/\r\n\r\nvoid P_GroupLines (void)//L80022AF0()\r\n{\r\n\tline_t\t\t**linebuffer;\r\n\tint\t\t\ti, j, total;\r\n\tsector_t\t*sector;\r\n\tsubsector_t\t*ss;\r\n\tseg_t\t\t*seg;\r\n\tint\t\t\tblock;\r\n\tline_t\t\t*li;\r\n\tfixed_t\t\tbbox[4];\r\n\r\n/* look up sector number for each subsector */\r\n\tss = subsectors;\r\n\tfor (i=0 ; i<numsubsectors ; i++, ss++)\r\n\t{\r\n\t\tseg = &segs[ss->firstline];\r\n\t\tss->sector = seg->sidedef->sector;\r\n\t}\r\n\r\n/* count number of lines in each sector */\r\n\tli = lines;\r\n\ttotal = 0;\r\n\tfor (i=0 ; i<numlines ; i++, li++)\r\n\t{\r\n\t\ttotal++;\r\n\t\tli->frontsector->linecount++;\r\n\t\tif (li->backsector && li->backsector != li->frontsector)\r\n\t\t{\r\n\t\t\tli->backsector->linecount++;\r\n\t\t\ttotal++;\r\n\t\t}\r\n\t}\r\n\r\n/* build line tables for each sector\t */\r\n\tlinebuffer = Z_Malloc (total*4, PU_LEVEL, 0);\r\n\tsector = sectors;\r\n\tfor (i=0 ; i<numsectors ; i++, sector++)\r\n\t{\r\n\t\tM_ClearBox (bbox);\r\n\t\tsector->lines = linebuffer;\r\n\t\tli = lines;\r\n\t\tfor (j=0 ; j<numlines ; j++, li++)\r\n\t\t{\r\n\t\t\tif (li->frontsector == sector || li->backsector == sector)\r\n\t\t\t{\r\n\t\t\t\t*linebuffer++ = li;\r\n\t\t\t\tM_AddToBox (bbox, li->v1->x, li->v1->y);\r\n\t\t\t\tM_AddToBox (bbox, li->v2->x, li->v2->y);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (linebuffer - sector->lines != sector->linecount)\r\n\t\t\tI_Error (\"P_GroupLines: miscounted\");\r\n\r\n\t\t/* set the degenmobj_t to the middle of the bounding box */\r\n\t\tsector->soundorg.x = (bbox[BOXRIGHT]+bbox[BOXLEFT])/2;\r\n\t\tsector->soundorg.y = (bbox[BOXTOP]+bbox[BOXBOTTOM])/2;\r\n\t\t//sector->soundorg.z = (sector->floorheight + sector->ceilingheight) / 2;\r\n\r\n\t\t/* link into subsector */\r\n\t\tsector->soundorg.subsec = R_PointInSubsector(sector->soundorg.x, sector->soundorg.y);\r\n\r\n\t\t/* adjust bounding box to map blocks */\r\n\t\tblock = (bbox[BOXTOP]-bmaporgy+MAXRADIUS)>>MAPBLOCKSHIFT;\r\n\t\tblock = (block >= bmapheight) ? bmapheight-1 : block;\r\n\t\tsector->blockbox[BOXTOP]=block;\r\n\r\n\t\tblock = (bbox[BOXBOTTOM]-bmaporgy-MAXRADIUS)>>MAPBLOCKSHIFT;\r\n\t\tblock = (block < 0) ? 0 : block;\r\n\t\tsector->blockbox[BOXBOTTOM]=block;\r\n\r\n\t\tblock = (bbox[BOXRIGHT]-bmaporgx+MAXRADIUS)>>MAPBLOCKSHIFT;\r\n\t\tblock = (block >= bmapwidth) ? bmapwidth-1 : block;\r\n\t\tsector->blockbox[BOXRIGHT]=block;\r\n\r\n\t\tblock = (bbox[BOXLEFT]-bmaporgx-MAXRADIUS)>>MAPBLOCKSHIFT;\r\n\t\tblock = (block < 0) ? 0 : block;\r\n\t\tsector->blockbox[BOXLEFT]=block;\r\n\t}\r\n}\r\n\r\n/*============================================================================= */\r\n\r\n/*\r\n=================\r\n=\r\n= P_Init\r\n=\r\n=================\r\n*/\r\n\r\nvoid P_Init (void)//L80022E00()\r\n{\r\n\tint i;\r\n\tsector_t    *sector;\r\n\tside_t      *sd;\r\n\r\n\tsector = sectors;\r\n\tfor (i = 0; i < numsectors; i++, sector++)\r\n\t{\r\n\t\tif ((sector->ceilingpic != -1) && (texflats[sector->ceilingpic].vtpage == 0))\r\n\t\t{\r\n            TextureCache(&texflats[sector->ceilingpic]);\r\n\t\t}\r\n\r\n\t\tif (texflats[sector->floorpic].vtpage == 0)\r\n\t\t{\r\n\t\t\tTextureCache(&texflats[sector->floorpic]);\r\n\t\t}\r\n\t}\r\n\r\n\t//V_pages\r\n\tPageCount = 2;\r\n\txcount = 0;\r\n\tycount = 0;\r\n\txycount = 0;\r\n\tV_PagFlags|= 2;//sky valloc\r\n\r\n\tspreadfire = NULL;\r\n\tskypalette = palette[0];\r\n\r\n\tif (skytexturep)\r\n\t{\r\n\t\tif (lumpinfo[skytexturep->lump].name[4] == '9')// initialize fire sky\r\n\t\t{\r\n\t\t\tW_CacheLumpNum(skytexturep->lump, PU_ANIMATION, true);\r\n\r\n\t\t\tspreadfire = P_FireSky;\r\n\t\t\tskypalette = palette[15];\r\n\r\n\t\t\tfor (i = 0; i < 64; i++)\r\n\t\t\t\tP_FireSky(skytexturep);\r\n\t\t}\r\n\r\n\t\tTextureCache(skytexturep);\r\n\t}\r\n\r\n\tP_LoadTextureByWidth(16);\r\n\tP_LoadTextureByWidth(64);\r\n\tP_InitSwitchList();\r\n\tP_LoadTextureByWidth(128);\r\n\r\n\tsd = sides;\r\n\tfor (i = 0; i < numsides; i++, sd++)\r\n\t{\r\n\t\tif (sd->toptexture == -1)\r\n\t\t\tsd->toptexture = 0;\r\n\r\n\t\tif (sd->midtexture == -1)\r\n\t\t\tsd->midtexture = 0;\r\n\r\n\t\tif (sd->bottomtexture == -1)\r\n\t\t\tsd->bottomtexture = 0;\r\n\t}\r\n\r\n\t//V_pages\r\n\tPageCount = 5;\r\n\txcount = 0;\r\n\tycount = 0;\r\n\txycount = 0;\r\n\tV_PagFlags|= 28;//sprites valloc\r\n\tZ_FreeTags(mainzone, PU_CACHE);\r\n\r\n\tP_InitPicAnims();\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= P_SetupLevel\r\n=\r\n=================\r\n*/\r\n\r\nextern boolean restarlevel;\r\n\r\nvoid P_SetupLevel(int map, skill_t skill)//L8002306C()\r\n{\r\n\tint\t\ti, memory;\r\n\tint\t\tmap_file, map_index, map_folder;\r\n\tbyte\t*map_ptr;\r\n\tint\t\tlumpnum;\r\n\tmobj_t\t*mobj;\r\n\tchar\tlumpname[16];\r\n\r\n\tZ_FreeTags(mainzone, PU_CACHE|PU_LEVSPEC|PU_LEVEL);\r\n\r\n\tif (!restarlevel)\r\n\t{\r\n\t\tV_PagFlags &= 1;\r\n\t\tZ_FreeTags(mainzone, PU_ANIMATION);\r\n\t}\r\n\r\n\tValloc_Init();\r\n\tZ_CheckHeap(mainzone);\r\n\tM_ClearRandom();\r\n\r\n\t//printf(\"P_SetupLevel(%i,%i)\\n\", map, skill);\r\n\r\n\ttotalkills = totalitems = totalsecret = 0;\r\n\tfor (i = 0; i<MAXPLAYERS; i++)\r\n\t{\r\n\t\tplayers[i].killcount = 0;\r\n\t\tplayers[i].secretcount = 0;\r\n\t\tplayers[i].itemcount = 0;\r\n\t\tplayers[i].frags = 0;\r\n\t}\r\n\r\n\t//P_InitThinkers();\r\n\tthinkercap.prev = thinkercap.next = &thinkercap;\r\n\tmobjhead.next = mobjhead.prev = &mobjhead;\r\n\r\n\tiquehead = 0;\r\n\tiquetail = 0;\r\n\tplayercounttarget = 0;\r\n\r\n\tmap_index = map-1;\r\n    if (map_index < 0)\r\n        map_folder = map + 6;\r\n    else\r\n        map_folder = map_index;\r\n\r\n    map_file = (map_index + ((map_folder / 8) * 16));\r\n\r\n\tmap_ptr = W_OpenMapWad((char *)map_file + _MAP01_WAD /*8*/);//MAP%%.WAD\r\n\r\n\t/* */\r\n\t/* look for a regular (development) map first */\r\n\t/* */\r\n\tlumpname[0] = 'M';\r\n\tlumpname[1] = 'A';\r\n\tlumpname[2] = 'P';\r\n\tlumpname[3] = '0' + map / 10;\r\n\tlumpname[4] = '0' + map % 10;\r\n\tlumpname[5] = 0;\r\n\r\n\tlumpnum = W_MapGetNumForName(lumpname);\r\n\r\n    if (lumpnum == -1)\r\n    {\r\n        I_Error(\"P_SetupLevel: %s not found\",lumpname);\r\n    }\r\n\r\n\t/* note: most of this ordering is important\t */\r\n\tP_LoadBlockMap(lumpnum + ML_BLOCKMAP);\r\n\tP_LoadVertexes(lumpnum + ML_VERTEXES);\r\n\tP_LoadSectors(lumpnum + ML_SECTORS);\r\n\tP_LoadSideDefs(lumpnum + ML_SIDEDEFS);\r\n\tP_LoadLineDefs(lumpnum + ML_LINEDEFS);\r\n\tP_LoadSubsectors(lumpnum + ML_SSECTORS);\r\n\tP_LoadNodes(lumpnum + ML_NODES);\r\n\tP_LoadSegs(lumpnum + ML_SEGS);\r\n\tP_LoadLeafs(lumpnum + ML_LEAFS);\r\n\tP_LoadReject(lumpnum + ML_REJECT);\r\n\r\n\tP_GroupLines();\r\n\r\n\t/* */\r\n\t/* Link deathmatch starts*/\r\n\t/* */\r\n\tdeathmatch_p = deathmatchstarts;\r\n\r\n\tP_LoadThings(lumpnum + ML_THINGS);\r\n\r\n\t/* set up world state */\r\n\tP_SpawnSpecials();\r\n\tZ_Free(map_ptr);\r\n\r\n\tif (!restarlevel)\r\n\t{\r\n\t\tP_LoadBlocks((char*)map_file + _MAPTEX01_IMG/*24*/);//MAPTEX%%.IMG\r\n\t\tP_Init();\r\n\t\tP_LoadBlocks((char*)map_file + _MAPSPR01_IMG/*16*/);//MAPSPR%%.IMG\r\n\t}\r\n\r\n\tmemory = Z_FreeMemory(mainzone);\r\n\tif (memory < 0xc000)\r\n\t{\r\n\t\tZ_DumpHeap(mainzone);\r\n\t\tI_Error(\"P_SetupLevel: not enough free memory %d\", memory);\r\n\t}\r\n\r\n\t/* */\r\n\t/* randomly spawn the active players */\r\n\t/* */\r\n\tif (netgame != gt_single)\r\n\t{\r\n\t\tSync_Data_Transmission();\r\n\r\n\t\tfor (i = 0; i < MAXPLAYERS; i++)\r\n\t\t{\r\n\t\t\tmobj = P_SpawnMobj(playerstarts[0].x << 16, playerstarts[0].y << 16, 0, MT_PLAYER);\r\n\t\t\tplayers[i].mo = mobj;\r\n\t\t\tG_DoReborn(i);\r\n\t\t\tP_RemoveMobj(mobj);\r\n\t\t}\r\n\t}\r\n\telse\r\n\t{\r\n\t\tP_SpawnPlayer(&playerstarts[0]);\r\n\t}\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= P_LoadBlocks\r\n= Exclusive Psx Doom\r\n= Loads a list of memory blocks containing WAD lumps from the given file.\r\n=\r\n=================\r\n*/\r\n\r\nenum compressFlags {Decode,NoDecode,Error};\r\ntypedef struct psxblock_s\r\n{\r\n\tint     size;               //*     including the header and possibly tiny fragments */\r\n\tvoid    **user;             //*4    NULL if a free block */\r\n\tshort   tag;                //*8    purgelevel */\r\n\tshort   id;                 //*10   should be ZONEID */\r\n\tshort   lump;               //*12\r\n\tshort   flags;              //*14   0 = Decode || 1 = NoDecode || >2 = Error\r\n\tstruct psxblock_s   *next;  //*16\r\n\tstruct psxblock_s\t*prev;  //*20\r\n} psxblock_t;\r\n\r\nvoid P_LoadBlocks(char *filename)//L80023698()\r\n{\r\n    #if 1 /*New Version*/\r\n    // Try and load the memory blocks containing lumps from the given file.\r\n    // Retry this a number of times before giving up, if the initial load attempt fails.\r\n    // Presumably this was to try and recover from a bad CD...\r\n\r\n\tpsxblock_t\theader, *base, *block;\r\n\tint i, file_num, data_size, size;\r\n\tboolean loaded_ok;\r\n\tbyte *ptr;\r\n\r\n\ti = 0;\r\n\twhile (true)\r\n    {\r\n        // If there have been too many failed load attempts then issue an error\r\n        if (i >= 4)\r\n\t\t\tI_Error(\"P_LoadBlocks: Data Failure\");\r\n        i++;\r\n\r\n        // Open the blocks file and get it's size\r\n        file_num = OpenFile(filename);\r\n        data_size = SeekFile(file_num, 0, PSXCD_SEEK_END);\r\n\r\n        ptr = (byte *)Z_Malloc(data_size - sizeof(psxblock_t), PU_STATIC, 0);\r\n\r\n        base = (psxblock_t *)((byte *)ptr - sizeof(psxblock_t));\r\n        header = *base;\r\n\r\n        // Read the file contents\r\n        SeekFile(file_num, 0, PSXCD_SEEK_SET);\r\n        ReadFile(file_num, (byte *)base, data_size);\r\n        CloseFile(file_num);\r\n\r\n        // Process all of the memory blocks in the file and make sure they are ok.\r\n        // Once they are verified then we can start linking them in with other memory blocks in the heap:\r\n        loaded_ok = true;\r\n\r\n        block = base;\r\n        size = data_size;\r\n        do\r\n        {\r\n            if ((((block->id != ZONEID) ||      // Verify the block has a valid zoneid\r\n                  (block->lump >= numlumps)) || // Verify the lump number is valid\r\n                  (block->flags >= Error)) ||   // Verify the compression mode is valid\r\n                  (block->flags == Decode &&    // Verify the decompressed size is valid\r\n                  (decodedsize((byte *)block + sizeof(psxblock_t)) != lumpinfo[block->lump].size)))\r\n\t\t\t{\r\n\t\t\t\tloaded_ok = false;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\t// Advance onto the next block and make sure we haven't gone past the end of the data\r\n            size -= block->size;\r\n            if (size < 0)\r\n            {\r\n                loaded_ok = false;\r\n\t\t\t\tbreak;\r\n            }\r\n\r\n            (byte *)block += block->size;\r\n        } while (size != 0);\r\n\r\n        // If everything was loaded ok then link the first block into the heap block list and finish up.\r\n        // Will do the rest of the linking in the loop below:\r\n        if (loaded_ok)\r\n        {\r\n            base->prev = header.prev;\r\n            break;\r\n        }\r\n\r\n        // Load failed: restore the old alloc header and free the memory block.\r\n        // Will try again a certain number of times to try and counteract unreliable CDs.\r\n        base = &header;\r\n        Z_Free((byte *)ptr);\r\n    }\r\n\r\n    // Once all the blocks are loaded and verified then setup all of the block links.\r\n    // Also mark blocks for lumps that are already loaded as freeable.\r\n    do\r\n    {\r\n        // Check if this lump is already loaded\r\n        if (lumpcache[base->lump].cache == NULL)\r\n        {\r\n            // Lump not loaded, set the lump cache entry to point to the newly loaded data.\r\n            // Also save whether the lump is compressed or not:\r\n            base->user = (void *)&lumpcache[base->lump];\r\n            lumpcache[base->lump].cache = (void *)((byte *)base + sizeof(memblock_t));\r\n            lumpencode[base->lump] = base->flags;\r\n        }\r\n        else\r\n        {\r\n            // If the lump is already loaded then mark this memory block as freeable\r\n            base->user = NULL;\r\n            base->tag = 0;\r\n            base->id = 0;\r\n        }\r\n\r\n        // Is this the last loade block in the file?\r\n        // If it is then set the size based on where the next block in the heap starts, otherwise just use the size defined in the file.\r\n        data_size -= base->size;\r\n        if (data_size == 0)\r\n        {\r\n            if (header.next)\r\n                base->size = ((int)header.next - (int)base);\r\n\r\n            base->next = header.next;\r\n        }\r\n        else\r\n        {\r\n            base->next = (psxblock_t *)((byte *)base + base->size);\r\n        }\r\n\r\n        // Set backlinks for the next block\r\n        if (base->next)\r\n            base->next->prev = base;\r\n\r\n        // Move onto the next block loaded\r\n        base = base->next;\r\n\r\n    } while (data_size != 0);\r\n\r\n    // After all that is done, make sure the heap is valid\r\n    Z_CheckHeap(mainzone);\r\n\r\n    #else /*Old Version*/\r\n    psxblock_t\theader, *base, *block, *next, *prev;\r\n\tint i, file_num, data_size, size;\r\n\tboolean error;\r\n\tbyte *ptr;\r\n\r\n\ti = 0;\r\n\twhile (true)\r\n    {\r\n        if (i >= 4)\r\n\t\t\tI_Error(\"P_LoadBlocks: Data Failure\");\r\n        i++;\r\n\r\n        error = false;\r\n\r\n        file_num = OpenFile(filename);\r\n        data_size = SeekFile(file_num, 0, PSXCD_SEEK_END);\r\n\r\n        ptr = (byte *)Z_Malloc(data_size - sizeof(psxblock_t), PU_STATIC, 0);\r\n\r\n        base = (psxblock_t *)((byte *)ptr - sizeof(psxblock_t));\r\n        header.size = base->size;\r\n        header.user = base->user;\r\n        header.tag = base->tag;\r\n        header.id = base->id;\r\n        header.lump = base->lump;\r\n        header.flags = base->flags;\r\n        header.next = base->next;\r\n        header.prev = base->prev;\r\n\r\n        prev = base->prev;\r\n        next = base->next;\r\n\r\n        SeekFile(file_num, 0, PSXCD_SEEK_SET);\r\n\t\tReadFile(file_num, (byte *)base, data_size);\r\n\t\tCloseFile(file_num);\r\n        block = base;\r\n        size = data_size;\r\n\r\n        do\r\n        {\r\n            if ((((block->id != ZONEID) || (block->lump >= numlumps)) || (block->flags > NoDecode)) ||\r\n                (block->flags == Decode &&\r\n                (decodedsize((byte *)block + sizeof(psxblock_t)) != lumpinfo[block->lump].size)))\r\n\t\t\t{\r\n            error_:\r\n\t\t\t\terror = true;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n            size -= block->size;\r\n            if (size < 0) goto error_;\r\n\r\n            (byte *)block = (byte *)block + block->size;\r\n        } while (size != 0);\r\n\r\n        if (!error)\r\n        {\r\n            base->prev = prev;\r\n            do\r\n            {\r\n                if (lumpcache[base->lump].cache == NULL)\r\n                {\r\n                    base->user = (void *)&lumpcache[base->lump];\r\n                    lumpcache[base->lump].cache = (void *)((byte *)base + sizeof(memblock_t));\r\n                    lumpencode[base->lump] = base->flags;\r\n                }\r\n                else\r\n                {\r\n                    base->user = NULL;\r\n                    base->tag = 0;\r\n                    base->id = 0;\r\n                }\r\n\r\n                data_size -= base->size;\r\n                if (data_size == 0)\r\n                {\r\n                    if (next)\r\n                        *(psxblock_t **)&base->size = (psxblock_t *)((int)next - (int)base);\r\n\r\n                    base->next = next;\r\n                }\r\n                else\r\n                {\r\n                    base->next = (psxblock_t *)((int)&base->size + base->size);\r\n                }\r\n\r\n                if (base->next)\r\n                    base->next->prev = base;\r\n\r\n                base = base->next;\r\n\r\n            } while (data_size != 0);\r\n            Z_CheckHeap(mainzone);\r\n            return;\r\n        }\r\n\r\n        base->size = header.size;\r\n        base->user = header.user;\r\n        base->tag = header.tag;\r\n        base->id = header.id;\r\n        base->lump = header.lump;\r\n        base->flags = header.flags;\r\n        base->next = header.next;\r\n        base->prev = header.prev;\r\n        Z_Free((byte *)ptr);\r\n    }\r\n    #endif\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= P_CacheSprite\r\n= Exclusive Psx Doom\r\n=\r\n=================\r\n*/\r\n\r\nvoid P_CacheSprite(spritedef_t *sprdef)//L80023970()\r\n{\r\n\tint i, j, lump;\r\n\tspriteframe_t *sprframe;\r\n\r\n\tsprframe = sprdef->spriteframes;\r\n\tfor (i = 0; i < sprdef->numframes; i++)\r\n\t{\r\n\t\tfor (j = 0; j < 8; j++)\r\n\t\t{\r\n\t\t\tlump = sprframe->lump[j];\r\n\r\n\t\t\tif ((lump < firstsprite) || (lastsprite < lump))\r\n\t\t\t\t\tI_Error(\"CacheSprite: invalid sprite lump %d\", lump);\r\n\r\n\t\t\tW_CacheLumpNum(lump, PU_ANIMATION, false);\r\n\r\n\t\t\tif (sprframe->rotate == false)\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\tsprframe++;\r\n\t}\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= P_LoadTextureByWidth\r\n= Exclusive Psx Doom\r\n=\r\n=================\r\n*/\r\n\r\nvoid P_LoadTextureByWidth(int width)//L80023A60()\r\n{\r\n    side_t *sd;\r\n\tint i, w;\r\n\r\n    if (width < 0)\r\n        width += 15;\r\n\r\n    xcount = (xcount-1) + (width/16) & -(width/16);\r\n\r\n\tsd = sides;\r\n\tfor (i = 0; i < numsides; i++, sd++)\r\n\t{\r\n\t\tif (sd->toptexture != -1)\r\n\t\t{\r\n\t\t\tif ((textures[sd->toptexture].w == width) && (textures[sd->toptexture].vtpage == 0))\r\n\t\t\t\tTextureCache(&textures[sd->toptexture]);\r\n\t\t}\r\n\r\n\t\tif (sd->midtexture != -1)\r\n\t\t{\r\n\t\t\tif ((textures[sd->midtexture].w == width) && (textures[sd->midtexture].vtpage == 0))\r\n\t\t\t\tTextureCache(&textures[sd->midtexture]);\r\n\t\t}\r\n\r\n\t\tif (sd->bottomtexture != -1)\r\n\t\t{\r\n\t\t\tif ((textures[sd->bottomtexture].w == width) && (textures[sd->bottomtexture].vtpage == 0))\r\n\t\t\t\tTextureCache(&textures[sd->bottomtexture]);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/p_shoot.c",
    "content": "#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n\r\n//===================\r\n//\r\n// IN\r\n//\r\n// A line will be shootdivd from the middle of shooter in the direction of\r\n// attackangle until either a shootable mobj is within the visible\r\n// aimtopslope / aimbottomslope range, or a solid wall blocks further\r\n// tracing.  If no thing is targeted along the entire range, the first line\r\n// that blocks the midpoint of the shootdiv will be hit.\r\n//===================\r\n\r\nline_t *shootline;      //iGp00000ce4\r\nmobj_t *shootmobj;      //iGp00000ce8\r\nfixed_t shootslope;\t\t\t\t\t// between aimtop and aimbottom //iGp00000968\r\nfixed_t shootx, shooty, shootz;\t\t// location for puff/blood      //iGp000009e0, iGp000009ec, iGp000009f0\r\n\r\n//===================\r\n//\r\n// TEMPS\r\n//\r\n//===================\r\n\r\nfixed_t aimmidslope;         // for detecting first wall hit     iGp000009c8\r\ndivline_t shootdiv;          //800a8e58\r\nfixed_t shootx2, shooty2;    //iGp00000a54,iGp00000a60\r\nfixed_t firstlinefrac;       //iGp00000be8\r\n\r\nint shootdivpositive;        //uGp00000a88\r\n\r\nfixed_t old_frac;            //uGp00000b44\r\nvoid\t*old_value;             //pvGp00000c74\r\nboolean old_isline;          //bGp000008e4\r\nint ssx1,ssy1,ssx2,ssy2;     //iGp00000c08, iGp00000c18, iGp00000c14, iGp00000c24\r\n\r\ntypedef\tstruct\r\n{\r\n    vertex_t v1, v2;\r\n} thingline_t;\r\n\r\nstatic thingline_t thingline;//800A8824*/\r\nstatic vertex_t *thing_line[2] = {&thingline.v1, &thingline.v2};//iGp00000534, iGp00000538\r\n\r\nextern mobj_t  *shooter;//*(r28 + 2764)\r\nextern angle_t  attackangle;//*(r28 + 2484)\r\nextern fixed_t  attackrange;//*(r28 + 2460)\r\nextern fixed_t  aimtopslope;//*(r28 + 2580)\r\nextern fixed_t  aimbottomslope;//*(r28 + 3340)\r\n\r\n/*\r\n=====================\r\n=\r\n= P_Shoot2\r\n=\r\n=====================\r\n*/\r\n\r\nvoid P_Shoot2(void)//L80023BCC()\r\n{\r\n\tmobj_t\t\t*t1;\r\n\tunsigned\tangle;\r\n\r\n\tt1 = shooter;\r\n\r\n\tshootline = 0;\r\n\tshootmobj = 0;\r\n\r\n\tangle = attackangle >> ANGLETOFINESHIFT;\r\n\r\n\tshootdiv.x = t1->x;\r\n\tshootdiv.y = t1->y;\r\n\tshootx2 = t1->x + (attackrange>>FRACBITS)*finecosine[angle];\r\n\tshooty2 = t1->y + (attackrange>>FRACBITS)*finesine[angle];\r\n\tshootdiv.dx = shootx2 - shootdiv.x;\r\n\tshootdiv.dy = shooty2 - shootdiv.y;\r\n\tshootz = t1->z + (t1->height>>1) + 8*FRACUNIT;\r\n\r\n\tshootdivpositive = (shootdiv.dx ^ shootdiv.dy)>0;\r\n\r\n\tssx1 = shootdiv.x >> 16;\r\n\tssy1 = shootdiv.y >> 16;\r\n\tssx2 = shootx2 >> 16;\r\n\tssy2 = shooty2 >> 16;\r\n\r\n\taimmidslope = (aimtopslope + aimbottomslope)>>1;\r\n\r\n\t//\r\n\t// cross everything\r\n\t//\r\n\told_frac = 0;\r\n\r\n\tPA_CrossBSPNode(numnodes-1);\r\n\r\n\t// check the last intercept if needed\r\n\tif (!shootmobj)\r\n\t\tPA_DoIntercept(0, false, FRACUNIT);\r\n\r\n\t//\r\n\t// post process\r\n\t//\r\n\tif (shootmobj)\r\n\t\treturn;\r\n\r\n\tif (!shootline)\r\n\t\treturn;\r\n\r\n\t//\r\n\t// calculate the intercept point for the first line hit\r\n\t//\r\n\t// position a bit closer\r\n\tfirstlinefrac -= FixedDiv(4*FRACUNIT,attackrange);\r\n\r\n\tshootx  = shootdiv.x + FixedMul(shootdiv.dx, firstlinefrac);\r\n\tshooty  = shootdiv.y + FixedMul(shootdiv.dy, firstlinefrac);\r\n\tshootz += FixedMul(aimmidslope, FixedMul(firstlinefrac,attackrange));\r\n}\r\n\r\n\r\n/*\r\n==================\r\n=\r\n= PA_DoIntercept\r\n=\r\n==================\r\n*/\r\n//inline\r\nboolean PA_DoIntercept(void *value, boolean isline, int frac)//L80023DD4()\r\n{\r\n    void   *value_;\r\n    int     frac_;\r\n    boolean isline_;\r\n\r\n    isline_ = isline;\r\n    value_ = value;\r\n    frac_ = frac;\r\n\r\n\tif (old_frac < frac)\r\n\t{\r\n        isline_ = old_isline;\r\n        value_ = old_value;\r\n        frac_ = old_frac;\r\n\r\n        old_isline = isline;\r\n        old_frac = frac;\r\n        old_value = value;\r\n\t}\r\n\r\n\tif (frac_ == 0 || (0xffff < frac_))//frac >= FRACUNIT)\r\n\t\treturn true;\r\n\r\n\tif (isline_)\r\n\t\treturn PA_ShootLine ((line_t *)value_, frac_);\r\n    else\r\n        return PA_ShootThing ((mobj_t *)value_, frac_);\r\n}\r\n\r\n\r\n/*\r\n==============================================================================\r\n=\r\n= PA_ShootLine\r\n=\r\n==============================================================================\r\n*/\r\n\r\nboolean\tPA_ShootLine(line_t *li, fixed_t interceptfrac)//L80023E5C()\r\n{\r\n\tfixed_t\t\tslope;\r\n\tfixed_t\t\tdist;\r\n\tsector_t\t*front, *back;\r\n\tstatic fixed_t opentop,openbottom;//80077ee4, 80077d5c\r\n\r\n\tif ( !(li->flags & ML_TWOSIDED) )\r\n\t{\r\n\t\tif (!shootline)\r\n\t\t{\r\n\t\t\tshootline = li;\r\n\t\t\tfirstlinefrac = interceptfrac;\r\n\t\t}\r\n\t\told_frac = 0;\t// don't shoot anything past this\r\n\t\treturn false;\r\n\t}\r\n\r\n\t//\r\n\t// crosses a two sided line\r\n\t//\r\n\tfront = li->frontsector;\r\n\tback = li->backsector;\r\n\r\n\tif (front->ceilingheight < back->ceilingheight)\r\n\t\topentop = front->ceilingheight;\r\n\telse\r\n\t\topentop = back->ceilingheight;\r\n\tif (front->floorheight > back->floorheight)\r\n\t\topenbottom = front->floorheight;\r\n\telse\r\n\t\topenbottom = back->floorheight;\r\n\r\n\tdist = FixedMul(attackrange,interceptfrac);\r\n\r\n\tif (li->frontsector->floorheight != li->backsector->floorheight)\r\n\t{\r\n\t\tslope = FixedDiv(openbottom - shootz , dist);\r\n\t\tif (slope >= aimmidslope && !shootline)\r\n\t\t{\r\n\t\t\tshootline = li;\r\n\t\t\tfirstlinefrac = interceptfrac;\r\n\t\t}\r\n\t\tif (slope > aimbottomslope)\r\n\t\t\taimbottomslope = slope;\r\n\t}\r\n\r\n\tif (li->frontsector->ceilingheight != li->backsector->ceilingheight)\r\n\t{\r\n\t\tslope = FixedDiv(opentop - shootz , dist);\r\n\t\tif (slope <= aimmidslope && !shootline)\r\n\t\t{\r\n\t\t\tshootline = li;\r\n\t\t\tfirstlinefrac = interceptfrac;\r\n\t\t}\r\n\t\tif (slope < aimtopslope)\r\n\t\t\taimtopslope = slope;\r\n\t}\r\n\r\n\tif (aimtopslope <= aimbottomslope)\r\n\t\treturn false;\t\t// stop\r\n\r\n\treturn true;\t\t// shot continues\r\n}\r\n\r\n/*\r\n==============================================================================\r\n=\r\n= PA_ShootThing\r\n=\r\n==============================================================================\r\n*/\r\n\r\nboolean PA_ShootThing(mobj_t *th, fixed_t interceptfrac)//L80024054()\r\n{\r\n\tfixed_t\t\tfrac;\r\n\tfixed_t\t\tdist;\r\n\tfixed_t\t\tthingaimtopslope, thingaimbottomslope;\r\n\r\n\tif (th == shooter)\r\n\t\treturn true;\t\t// can't shoot self\r\n\tif (!(th->flags&MF_SHOOTABLE))\r\n\t\treturn true;\t\t// corpse or something\r\n\r\n\t// check angles to see if the thing can be aimed at\r\n\tdist = FixedMul(attackrange, interceptfrac);\r\n\r\n\tthingaimtopslope =  FixedDiv(th->z+th->height - shootz , dist);\r\n\tif (thingaimtopslope < aimbottomslope)\r\n\t\treturn true;\t\t// shot over the thing\r\n\r\n\tthingaimbottomslope =  FixedDiv(th->z - shootz, dist);\r\n\tif (thingaimbottomslope > aimtopslope)\r\n\t\treturn true;\t\t// shot under the thing\r\n\r\n\t//\r\n\t// this thing can be hit!\r\n\t//\r\n\tif (thingaimtopslope > aimtopslope)\r\n\t\tthingaimtopslope = aimtopslope;\r\n\tif (thingaimbottomslope < aimbottomslope)\r\n\t\tthingaimbottomslope = aimbottomslope;\r\n\r\n\t// shoot midway in the visible part of the thing\r\n\tshootslope = (thingaimtopslope+thingaimbottomslope)/2;\r\n\r\n\tshootmobj = th;\r\n\r\n\t// position a bit closer\r\n\tfrac = interceptfrac - FixedDiv(10*FRACUNIT,attackrange);\r\n\tshootx = shootdiv.x + FixedMul(shootdiv.dx, frac);\r\n\tshooty = shootdiv.y + FixedMul(shootdiv.dy, frac);\r\n\tshootz = shootz + FixedMul(shootslope, FixedMul(frac,attackrange));\r\n\r\n\treturn false;\t\t\t// don't go any farther\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= PA_SightCrossLine\r\n=\r\n= First checks the endpoints of the line to make sure that they cross the\r\n= sight trace treated as an infinite line.\r\n=\r\n= If so, it calculates the fractional distance along the sight trace that\r\n= the intersection occurs at.  If 0 < intercept < 1.0, the line will block\r\n= the sight.\r\n=================\r\n*/\r\n\r\n//inline\r\nfixed_t PA_SightCrossLine(line_t *line)//L800241F4()\r\n{\r\n\tint\ts1, s2;\r\n\tint\tp1x,p1y,p2x,p2y,p3x,p3y,p4x,p4y,dx,dy,ndx,ndy;\r\n\r\n\t// p1, p2 are line endpoints\r\n\tp1x = line->v1->x >> FRACBITS;\r\n\tp1y = line->v1->y >> FRACBITS;\r\n\tp2x = line->v2->x >> FRACBITS;\r\n\tp2y = line->v2->y >> FRACBITS;\r\n\r\n\t// p3, p4 are sight endpoints\r\n\tp3x = ssx1;\r\n\tp3y = ssy1;\r\n\tp4x = ssx2;\r\n\tp4y = ssy2;\r\n\r\n\tdx = p2x - p3x;\r\n\tdy = p2y - p3y;\r\n\r\n\tndx = p4x - p3x;\t\t// this can be precomputed if worthwhile\r\n\tndy = p4y - p3y;\r\n\r\n\ts1 =  (ndy * dx) <  (dy * ndx);\r\n\r\n\tdx = p1x - p3x;\r\n\tdy = p1y - p3y;\r\n\r\n\ts2 =  (ndy * dx) <  (dy * ndx);\r\n\r\n\tif (s1 == s2)\r\n\t\treturn -1;\t\t\t// line isn't crossed\r\n\r\n\tndx = p1y - p2y;\t\t// vector normal to world line\r\n\tndy = p2x - p1x;\r\n\r\n\ts1 = ndx*dx + ndy*dy;\t// distance projected onto normal\r\n\r\n\tdx = p4x - p1x;\r\n\tdy = p4y - p1y;\r\n\r\n\ts2 = ndx*dx + ndy*dy;\t// distance projected onto normal\r\n\r\n\ts2 = FixedDiv(s1,(s1+s2));\r\n\r\n\treturn s2;\r\n}\r\n\r\n\r\n\r\n/*\r\n=================\r\n=\r\n= PA_CrossSubsectorPass\r\n=\r\n= Returns true if strace crosses the given subsector successfuly\r\n=================\r\n*/\r\n\r\nboolean PA_CrossSubsector(subsector_t *sub)//L800242CC\r\n{\r\n\tseg_t\t\t*seg;\r\n\tline_t\t\t*line;\r\n\tint\t\t\tcount;\r\n\tfixed_t\t\tfrac;\r\n\tmobj_t\t\t*thing;\r\n\r\n\t//\r\n\t// check things\r\n\t//\r\n\tfor (thing = sub->sector->thinglist ; thing ; thing = thing->snext )\r\n\t{\r\n\t\tif (thing->subsector != sub)\r\n\t\t\tcontinue;\r\n\r\n\t\t// check a corner to corner crossection for hit\r\n\r\n\t\tif (shootdivpositive)\r\n        {\r\n            thingline.v1.x = thing->x - thing->radius;\r\n            thingline.v1.y = thing->y + thing->radius;\r\n            thingline.v2.x = thing->x + thing->radius;\r\n            thingline.v2.y = thing->y - thing->radius;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n            thingline.v1.x = thing->x - thing->radius;\r\n            thingline.v1.y = thing->y - thing->radius;\r\n            thingline.v2.x = thing->x + thing->radius;\r\n            thingline.v2.y = thing->y + thing->radius;\r\n\t\t}\r\n\r\n\t\t// inline function\r\n\t\tfrac = PA_SightCrossLine ((line_t *)&thing_line);\r\n\r\n\t\tif (frac < 0 || frac > FRACUNIT) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\t// inline function\r\n\t\tif (!PA_DoIntercept (thing, false, frac))\r\n        {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\t//\r\n\t// check lines\r\n\t//\r\n\tcount = sub->numlines;\r\n\tseg = &segs[sub->firstline];\r\n\r\n\tfor ( ; count ; seg++, count--)\r\n\t{\r\n\t\tline = seg->linedef;\r\n\r\n\t\tif (line->validcount == validcount)\r\n\t\t\tcontinue;\t\t// already checked other side\r\n\t\tline->validcount = validcount;\r\n\r\n\t\t// inline function\r\n\t\tfrac = PA_SightCrossLine (line);\r\n\r\n\t\tif (frac < 0 || frac > FRACUNIT)\r\n\t\t\tcontinue;\r\n\r\n        // inline function\r\n\t\tif (!PA_DoIntercept (line, true, frac))\r\n        {\r\n\t\t\treturn false;\r\n        }\r\n\t}\r\n\r\n\treturn true;    // passed the subsector ok\r\n}\r\n\r\n/*\r\n=====================\r\n=\r\n= PA_DivlineSide\r\n=\r\n=====================\r\n*/\r\n//inline\r\nint PA_DivlineSide(fixed_t x, fixed_t y, divline_t *line)//L800246F0()\r\n{\r\n\tfixed_t dx, dy;\r\n\r\n\tx = (x - line->x) >> FRACBITS;\r\n\ty = (y - line->y) >> FRACBITS;\r\n\r\n\tdx = x * (line->dy >> FRACBITS);\r\n\tdy = y * (line->dx >> FRACBITS);\r\n\r\n\treturn dy < dx ^ 1;\r\n}\r\n\r\n/**********************************\r\n\r\nReturns true if strace crosses the given node successfuly\r\n\r\n**********************************/\r\n\r\nboolean PA_CrossBSPNode(int bspnum)//L80024734()\r\n{\r\n\tnode_t *bsp;\r\n\tint bsp_num, side;\r\n\r\n    if (bspnum & NF_SUBSECTOR)\r\n    {\r\n        bsp_num = (bspnum & ~NF_SUBSECTOR);\r\n        if (bsp_num >= numsubsectors)\r\n        {\r\n            I_Error(\"PA_CrossSubsector: ss %i with numss = %i\", bsp_num, numsubsectors);\r\n        }\r\n\r\n        return PA_CrossSubsector(&subsectors[bsp_num]);\r\n    }\r\n\r\n    bsp = &nodes[bspnum];\r\n\r\n    //\r\n    // decide which side the start point is on\r\n    //\r\n    side = PA_DivlineSide(shootdiv.x, shootdiv.y, &bsp->line);\r\n\r\n    // cross the starting side\r\n\r\n    if (!PA_CrossBSPNode(bsp->children[side]))\r\n        return false;\r\n\r\n    // the partition plane is crossed here\r\n    if (side == PA_DivlineSide(shootx2, shooty2, &bsp->line))\r\n        return true;    // the line doesn't touch the other side\r\n\r\n    // cross the ending side\r\n\treturn PA_CrossBSPNode(bsp->children[side ^ 1]);\r\n}\r\n\r\n"
  },
  {
    "path": "PSXDOOM/p_sight.c",
    "content": "#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n\r\n//iGp00000a3c\r\nfixed_t sightzstart;\t\t\t\t//80077E4C // eye z of looker\r\n//iGp00000bf8, iGp00000a24\r\nfixed_t topslope, bottomslope;\t//80078008 ,80077E34 // slopes to top and bottom of target\r\n\r\ndivline_t strace;\t\t\t\t//800979E0 // from t1 to t2\r\nfixed_t t2x, t2y;\t\t\t\t//80077F28,80077F2C || uGp00000b18, uGp00000b20\r\n\r\n//iGp00000c10,iGp00000c20,iGp00000c1c,iGp00000c28\r\nint t1xs,t1ys,t2xs,t2ys;\t\t\t//80078020,80078030,8007802C,80078038\r\n\r\n\r\n/*\r\n===============\r\n=\r\n= P_CheckSights\r\n=\r\n= Check sights of all mobj thinkers that are going to change state this\r\n= tic and have MF_COUNTKILL set\r\n===============\r\n*/\r\n\r\nvoid P_CheckSights(void)//L800248A0()\r\n{\r\n\tmobj_t *mobj;\r\n\r\n\tfor (mobj = mobjhead.next; mobj != &mobjhead; mobj = mobj->next)\r\n\t{\r\n\t\t// must be killable\r\n\t\tif (!(mobj->flags & MF_COUNTKILL))\r\n\t\t\tcontinue;\r\n\r\n\t\t// must be about to change states\r\n\t\tif (mobj->tics != 1)\r\n\t\t\tcontinue;\r\n\r\n\t\tmobj->flags &= ~MF_SEETARGET;\r\n\r\n\t\t// must have a target\r\n\t\tif (!mobj->target)\r\n\t\t\tcontinue;\r\n\r\n\t\tif (P_CheckSight(mobj, mobj->target))\r\n\t\t\tmobj->flags |= MF_SEETARGET;\r\n\t}\r\n}\r\n\r\n\r\n/**********************************\r\n\r\nReturns true if a straight line between t1 and t2 is unobstructed\r\n\r\n**********************************/\r\n\r\nboolean P_CheckSight(mobj_t *t1, mobj_t *t2)//L8002494C()\r\n{\r\n\tint\ts1, s2;\r\n\tint\tpnum, bytenum, bitnum;\r\n\r\n\t//\r\n\t// check for trivial rejection\r\n\t//\r\n\ts1 = (t1->subsector->sector - sectors)/* * (int)0xE9BD37A7*/;\r\n\ts2 = (t2->subsector->sector - sectors)/* * (int)0xE9BD37A7*/;\r\n\tpnum = s1*numsectors + s2;\r\n\tbytenum = pnum >> 3;\r\n\tbitnum = 1 << (pnum & 7);\r\n\r\n\tif (rejectmatrix[bytenum] & bitnum) {\r\n\t\treturn false;\t// can't possibly be connected\r\n\t}\r\n\r\n\t// look from eyes of t1 to any part of t2\r\n\r\n\t++validcount;\r\n\r\n\t// make sure it never lies exactly on a vertex coordinate\r\n\r\n\tstrace.x = (t1->x & ~0x1ffff) | 0x10000;\r\n\tstrace.y = (t1->y & ~0x1ffff) | 0x10000;\r\n\tt2x = (t2->x & ~0x1ffff) | 0x10000;\r\n\tt2y = (t2->y & ~0x1ffff) | 0x10000;\r\n\tstrace.dx = t2x - strace.x;\r\n\tstrace.dy = t2y - strace.y;\r\n\r\n\tt1xs = strace.x >> FRACBITS;\r\n\tt1ys = strace.y >> FRACBITS;\r\n\tt2xs = t2x >> FRACBITS;\r\n\tt2ys = t2y >> FRACBITS;\r\n\r\n\tsightzstart = (t1->z + t1->height) - (t1->height >> 2);\r\n\ttopslope = (t2->z + t2->height) - sightzstart;\r\n\tbottomslope = (t2->z) - sightzstart;\r\n\r\n\treturn PS_CrossBSPNode(numnodes - 1);\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= PS_SightCrossLine\r\n=\r\n= First checks the endpoints of the line to make sure that they cross the\r\n= sight trace treated as an infinite line.\r\n=\r\n= If so, it calculates the fractional distance along the sight trace that\r\n= the intersection occurs at.  If 0 < intercept < 1.0, the line will block\r\n= the sight.\r\n=================\r\n*/\r\n\r\n//inline\r\nfixed_t PS_SightCrossLine (line_t *line)//L80024AD4()\r\n{\r\n\tint\t\t\ts1, s2;\r\n\tint\t\t\tp1x,p1y,p2x,p2y,p3x,p3y,p4x,p4y,dx,dy,ndx,ndy;\r\n\r\n\t// p1, p2 are line endpoints\r\n\tp1x = line->v1->x >> FRACBITS;\r\n\tp1y = line->v1->y >> FRACBITS;\r\n\tp2x = line->v2->x >> FRACBITS;\r\n\tp2y = line->v2->y >> FRACBITS;\r\n\r\n\t// p3, p4 are sight endpoints\r\n\tp3x = t1xs;\r\n\tp3y = t1ys;\r\n\tp4x = t2xs;\r\n\tp4y = t2ys;\r\n\r\n\tdx = p2x - p3x;\r\n\tdy = p2y - p3y;\r\n\r\n\tndx = p4x - p3x;\t\t// this can be precomputed if worthwhile\r\n\tndy = p4y - p3y;\r\n\r\n\ts1 =  (ndy * dx) <  (dy * ndx);\r\n\r\n\tdx = p1x - p3x;\r\n\tdy = p1y - p3y;\r\n\r\n\ts2 =  (ndy * dx) <  (dy * ndx);\r\n\r\n\tif (s1 == s2)\r\n\t\treturn -1;\t\t\t// line isn't crossed\r\n\r\n\tndx = p1y - p2y;\t\t// vector normal to world line\r\n\tndy = p2x - p1x;\r\n\r\n\ts1 = ndx*dx + ndy*dy;\t// distance projected onto normal\r\n\r\n\tdx = p4x - p1x;\r\n\tdy = p4y - p1y;\r\n\r\n\ts2 = ndx*dx + ndy*dy;\t// distance projected onto normal\r\n\r\n\ts2 = FixedDiv(s1,(s1+s2));\r\n\r\n\treturn s2;\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= PS_CrossSubsector\r\n=\r\n= Returns true if strace crosses the given subsector successfuly\r\n=================\r\n*/\r\n\r\nboolean PS_CrossSubsector(subsector_t *sub)//L80024BAC()\r\n{\r\n\tseg_t\t\t*seg;\r\n\tline_t\t\t*line;\r\n\tint\t\t\tcount;\r\n\tsector_t\t*front, *back;\r\n\tfixed_t\t\topentop, openbottom;\r\n\tfixed_t\t\tfrac, slope;\r\n\r\n\t//\r\n\t// check lines\r\n\t//\r\n\tcount = sub->numlines;\r\n\tseg = &segs[sub->firstline];\r\n\r\n\tfor ( ; count ; seg++, count--)\r\n\t{\r\n\t\tline = seg->linedef;\r\n\r\n\t\tif (line->validcount == validcount)\r\n\t\t\tcontinue;\t\t// allready checked other side\r\n\t\tline->validcount = validcount;\r\n\r\n\t\tfrac = PS_SightCrossLine (line);\r\n\r\n\t\tif (frac < 4 || frac > FRACUNIT)\r\n\t\t\tcontinue;\r\n\r\n\t\t//\r\n\t\t// crosses line\r\n\t\t//\r\n\t\tback = line->backsector;\r\n\t\tif (!back)\r\n\t\t\treturn false;\t// one sided line\r\n\t\tfront = line->frontsector;\r\n\r\n\t\tif (front->floorheight == back->floorheight\r\n\t\t&& front->ceilingheight == back->ceilingheight)\r\n\t\t\tcontinue;\t\t// no wall to block sight with\r\n\r\n\t\tif (front->ceilingheight < back->ceilingheight)\r\n\t\t\topentop = front->ceilingheight;\r\n\t\telse\r\n\t\t\topentop = back->ceilingheight;\r\n\t\tif (front->floorheight > back->floorheight)\r\n\t\t\topenbottom = front->floorheight;\r\n\t\telse\r\n\t\t\topenbottom = back->floorheight;\r\n\r\n\t\tif (openbottom >= opentop)\t// quick test for totally closed doors\r\n\t\t\treturn false;\t// stop\r\n\r\n\t\tfrac >>= 2;\r\n\r\n\t\tif (front->floorheight != back->floorheight)\r\n\t\t{\r\n\t\t\tslope =  (((openbottom - sightzstart)<<6) / frac) << 8;\r\n\t\t\tif (slope > bottomslope)\r\n\t\t\t\tbottomslope = slope;\r\n\t\t}\r\n\r\n\t\tif (front->ceilingheight != back->ceilingheight)\r\n\t\t{\r\n\t\t\tslope = (((opentop - sightzstart)<<6) / frac) << 8;\r\n\t\t\tif (slope < topslope)\r\n\t\t\t\ttopslope = slope;\r\n\t\t}\r\n\r\n\t\tif (topslope <= bottomslope)\r\n\t\t\treturn false;\t// stop\r\n\t}\r\n\r\n\treturn true;\t\t\t// passed the subsector ok\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= PS_CrossBSPNode\r\n=\r\n= Returns true if strace crosses the given node successfuly\r\n=================\r\n*/\r\n\r\nboolean PS_CrossBSPNode(int bspnum)//L80024E58()\r\n{\r\n\tnode_t *bsp;\r\n\tint side;\r\n\tint bsp_num;\r\n\r\n\tif (bspnum & NF_SUBSECTOR)\r\n\t{\r\n\t\tbsp_num = (bspnum & ~NF_SUBSECTOR);\r\n\t\tif (bsp_num >= numsubsectors)\r\n\t\t{\r\n\t\t\tI_Error(\"PS_CrossSubsector: ss %i with numss = %i\", bsp_num, numsubsectors);\r\n\t\t}\r\n\r\n\t\treturn PS_CrossSubsector(&subsectors[bsp_num]);\r\n\t}\r\n\r\n\tbsp = &nodes[bspnum];\r\n\r\n\t// decide which side the start point is on\r\n\t// inline function ??\r\n\tside = PA_DivlineSide(strace.x, strace.y, &bsp->line);\r\n\r\n\t// cross the starting side\r\n\tif (!PS_CrossBSPNode(bsp->children[side]))\r\n\t\treturn false;\r\n\r\n\t// the partition plane is crossed here\r\n\t// inline function ??\r\n\tif (side == PA_DivlineSide(t2x, t2y, &bsp->line))\r\n\t\treturn true; // the line doesn't touch the other side\r\n\r\n\t// cross the ending side\r\n\treturn PS_CrossBSPNode(bsp->children[side ^ 1]);\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/p_slide.c",
    "content": "#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n\r\n#define\tCLIPRADIUS\t23\r\n#define SIDE_ON\t0\r\n#define\tSIDE_FRONT\t1\r\n#define\tSIDE_BACK\t-1\r\n\r\nfixed_t slidex, slidey;\t\t// the final position       //80077DBC|fGp000009ac, 80077DC0|fGp000009b0\r\nline_t *specialline;\t\t//80077DC8, uGp000009b8\r\n\r\nfixed_t\t\tslidedx, slidedy;\t\t// current move for completablefrac //80077E9C|fGp00000a8c, 80077EA0|fGp00000a90\r\n\r\nfixed_t\t\tendbox[4];\t\t\t\t// final proposed position //800979d0\r\n\r\nfixed_t blockfrac;\t\t\t// the fraction of move that gets completed //8007804C|iGp00000c3c\r\nfixed_t blocknvx, blocknvy;\t// the vector of the line that blocks move //80077FD0|fGp00000bc0, 80077FD8|fGp00000bc8\r\n\r\n// p1, p2 are line endpoints\r\n// p3, p4 are move endpoints\r\n/*iGp00000ae4, iGp00000aec*///p1x, p1y\r\n/*iGp00000ae8, iGp00000af8*///p2x, p2y\r\n/*iGp00000af4, iGp00000b0c*///p3x, p3y\r\n/*iGp00000b08, iGp00000b14*///p4x, p4y\r\n\r\nint p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y;\r\nfixed_t\tnvx, nvy;\t\t\t\t// normalized line vector //fGp00000b70, fGp00000b74\r\n\r\nextern mobj_t *slidething;//80077D04\r\n\r\n\r\nfixed_t P_CompletableFrac(fixed_t dx, fixed_t dy);\r\nint SL_PointOnSide(fixed_t x, fixed_t y);\r\nfixed_t SL_CrossFrac (void);\r\nboolean CheckLineEnds (void);\r\nvoid SL_ClipToLine( void );\r\nboolean SL_CheckLine(line_t *ld);\r\nint\tSL_PointOnSide2(fixed_t x1, fixed_t y1, fixed_t x2, fixed_t y2, fixed_t x3, fixed_t y3);\r\nvoid SL_CheckSpecialLines (fixed_t x1, fixed_t y1, fixed_t x2, fixed_t y2);\r\n\r\n/*\r\n===================\r\n=\r\n= P_SlideMove\r\n=\r\n===================\r\n*/\r\n\r\nvoid P_SlideMove(void)//L80024FC4()\r\n{\r\n    fixed_t dx, dy, rx, ry;\r\n    fixed_t frac, slide;\r\n    int i;\r\n\r\n\tdx = slidething->momx;\r\n\tdy = slidething->momy;\r\n\tslidex = slidething->x;\r\n\tslidey = slidething->y;\r\n\r\n\tif (slidething->flags & MF_NOCLIP)//Psx Doom\r\n    {\r\n        frac = FRACUNIT;\r\n        goto Skip_P_CompletableFrac;\r\n    }\r\n\r\n    // perform a maximum of three bumps\r\n    for (i = 0; i < 3; i++)\r\n    {\r\n        frac = P_CompletableFrac(dx, dy);\r\n\r\n        if (frac != FRACUNIT)\r\n            frac -= 0x1000;\r\n\r\n        if (frac < 0)\r\n            frac = 0;\r\n\r\n    Skip_P_CompletableFrac:\r\n        rx = FixedMul(frac, dx);\r\n        ry = FixedMul(frac, dy);\r\n\r\n        slidex += rx;\r\n        slidey += ry;\r\n\r\n        // made it the entire way\r\n        if (frac == FRACUNIT)\r\n        {\r\n            slidething->momx = dx;\r\n            slidething->momy = dy;\r\n            SL_CheckSpecialLines(slidething->x, slidething->y, slidex, slidey);\r\n            return;\r\n        }\r\n\r\n        // project the remaining move along the line that blocked movement\r\n        dx -= rx;\r\n        dy -= ry;\r\n        slide = FixedMul(dx, blocknvx) + FixedMul(dy, blocknvy);\r\n\r\n        dx = FixedMul(slide, blocknvx);\r\n        dy = FixedMul(slide, blocknvy);\r\n    }\r\n\r\n\t// some hideous situation has happened that won't let the player slide\r\n\tslidex = slidething->x;\r\n\tslidey = slidething->y;\r\n\tslidething->momx = slidething->momy = 0;\r\n}\r\n\r\n\r\n/*\r\n===================\r\n=\r\n= P_CompletableFrac\r\n=\r\n= Returns the fraction of the move that is completable\r\n===================\r\n*/\r\n\r\nfixed_t P_CompletableFrac(fixed_t dx, fixed_t dy)//L80025154()\r\n{\r\n\tint\txl,xh,yl,yh,bx,by;\r\n\tint\t\t\toffset;\r\n    short\t\t*list;\r\n    line_t\t\t*ld;\r\n\r\n\tblockfrac = FRACUNIT;\t\t// the entire dist until shown otherwise\r\n\tslidedx = dx;\r\n\tslidedy = dy;\r\n\r\n\tendbox[BOXTOP   ] = slidey + CLIPRADIUS*FRACUNIT;\r\n\tendbox[BOXBOTTOM] = slidey - CLIPRADIUS*FRACUNIT;\r\n\tendbox[BOXRIGHT ] = slidex + CLIPRADIUS*FRACUNIT;\r\n\tendbox[BOXLEFT  ] = slidex - CLIPRADIUS*FRACUNIT;\r\n\r\n\tif (dx > 0)\r\n\t\tendbox[BOXRIGHT ] += dx;\r\n\telse\r\n\t\tendbox[BOXLEFT  ] += dx;\r\n\r\n\tif (dy > 0)\r\n\t\tendbox[BOXTOP   ] += dy;\r\n\telse\r\n\t\tendbox[BOXBOTTOM] += dy;\r\n\r\n\t++validcount;\r\n\r\n\t//\r\n\t// check lines\r\n\t//\r\n\txl = (endbox[BOXLEFT  ] - bmaporgx) >> MAPBLOCKSHIFT;\r\n\txh = (endbox[BOXRIGHT ] - bmaporgx) >> MAPBLOCKSHIFT;\r\n\tyl = (endbox[BOXBOTTOM] - bmaporgy) >> MAPBLOCKSHIFT;\r\n\tyh = (endbox[BOXTOP   ] - bmaporgy) >> MAPBLOCKSHIFT;\r\n\r\n\tif (xl<0)\r\n\t\txl = 0;\r\n\tif (yl<0)\r\n\t\tyl = 0;\r\n\r\n\tif (xh>= bmapwidth)\r\n\t\txh = bmapwidth -1;\r\n\r\n\tif (yh>= bmapheight)\r\n\t\tyh = bmapheight -1;\r\n\r\n\tfor (bx = xl; bx <= xh; bx++)\r\n\t{\r\n\t\tfor (by = yl; by <= yh; by++)\r\n\t\t{\r\n\t\t    /*inline ??*/\r\n\t\t\t//P_BlockLinesIterator(bx, by, SL_CheckLine);\r\n\r\n            offset = by*bmapwidth+bx;\r\n\r\n            offset = *(blockmap+offset);\r\n\r\n            for ( list = blockmaplump+offset ; *list != -1 ; list++)\r\n            {\r\n                ld = &lines[*list];\r\n\r\n                if (ld->validcount != validcount)\r\n                {\r\n                    ld->validcount = validcount;\r\n                    SL_CheckLine(ld);\r\n                }\r\n            }\r\n\t\t}\r\n\t}\r\n\r\n\t//\r\n\t// examine results\r\n\t//\r\n\tif (blockfrac < 0x1000)\r\n\t{\r\n\t\tblockfrac = 0;\r\n\t\tspecialline = 0;\t// can't cross anything on a bad move\r\n\t\treturn 0;\t\t\t// solid wall or thing\r\n\t}\r\n\r\n\treturn blockfrac;\r\n}\r\n\r\n//inline\r\nint SL_PointOnSide(fixed_t x, fixed_t y)//L800253F8()\r\n{\r\n    //checked\r\n    fixed_t\tdx, dy, dist;\r\n\r\n    dx = x - p1x;\r\n    dy = y - p1y;\r\n    dist = FixedMul(dx,nvx) + FixedMul(dy,nvy);\r\n\r\n    if(dist > FRACUNIT)\r\n        return SIDE_FRONT;\r\n    else if(dist < -FRACUNIT)\r\n        return SIDE_BACK;\r\n    else\r\n        return SIDE_ON;\r\n}\r\n\r\n//inline\r\nfixed_t SL_CrossFrac (void)//L80025468()\r\n{\r\n    //checked\r\n    fixed_t\tdx, dy, dist1, dist2, frac;\r\n\r\n    // project move start and end points onto line normal\r\n    dx = p3x - p1x;\r\n    dy = p3y - p1y;\r\n\r\n    dist1 = FixedMul(dx,nvx) + FixedMul(dy,nvy);\r\n\r\n    dx = p4x - p1x;\r\n    dy = p4y - p1y;\r\n    dist2 = FixedMul(dx,nvx) + FixedMul(dy,nvy);\r\n\r\n    if ((dist1 < 0) == (dist2 < 0))\r\n\t\treturn FRACUNIT;\t\t// doesn't cross\r\n\r\n\tfrac = FixedDiv(dist1, dist1 - dist2 );\r\n\r\n\treturn frac;\r\n}\r\n\r\n\r\nboolean CheckLineEnds (void)//L80025520()\r\n{\r\n    //checked\r\n    fixed_t\t\tsnx, sny;\t\t// sight normals\r\n    fixed_t\t\tdist1, dist2;\r\n    fixed_t\t\tdx, dy;\r\n\r\n    snx = p4y - p3y;\r\n    sny = p3x - p4x;\r\n\r\n    dx = p1x - p3x;\r\n    dy = p1y - p3y;\r\n\r\n    dist1 = FixedMul(dx,snx) + FixedMul(dy,sny);\r\n\r\n    dx = p2x - p3x;\r\n    dy = p2y - p3y;\r\n\r\n    dist2 = FixedMul(dx,snx) + FixedMul(dy,sny);\r\n\r\n    return ((dist1 < 0)^(dist2 < 0));\r\n\r\n    /*\r\n    if ( (dist1<0) == (dist2<0) )\r\n\t\treturn false;\r\n\r\n\treturn true;\r\n    */\r\n}\r\n\r\n\r\n/*\r\n====================\r\n=\r\n= SL_ClipToLine\r\n=\r\n= Call with p1 and p2 set to the endpoints\r\n= and nvx, nvy set to normalized vector\r\n= Assumes the start point is definately on the front side of the line\r\n= returns the fraction of the current move that crosses the line segment\r\n====================\r\n*/\r\n\r\nvoid SL_ClipToLine( void )//L800255E0()\r\n{\r\n    fixed_t frac;\r\n    int     side2, side3;\r\n\r\n    // adjust start so it will be the first point contacted on the player circle\r\n    // p3, p4 are move endpoints\r\n\r\n    p3x = slidex - CLIPRADIUS * nvx;\r\n    p3y = slidey - CLIPRADIUS * nvy;\r\n    p4x = p3x + slidedx;\r\n    p4y = p3y + slidedy;\r\n\r\n    // if the adjusted point is on the other side of the line, the endpoint must\r\n    // be checked.\r\n    side2 = SL_PointOnSide(p3x, p3y);\r\n    if(side2 == SIDE_BACK)\r\n        return; // ClipToPoint and slide along normal to line\r\n\r\n    side3 = SL_PointOnSide(p4x, p4y);\r\n    if(side3 == SIDE_ON)\r\n        return; // the move goes flush with the wall\r\n    else if(side3 == SIDE_FRONT)\r\n        return; // move doesn't cross line\r\n\r\n    if(side2 == SIDE_ON)\r\n    {\r\n        frac = 0; // moves toward the line\r\n        goto blockmove;\r\n    }\r\n\r\n    // the line endpoints must be on opposite sides of the move trace\r\n\r\n    // find the fractional intercept\r\n    frac = SL_CrossFrac();\r\n\r\n    if(frac < blockfrac)\r\n    {\r\n        blockmove:\r\n        blockfrac =  frac;\r\n        blocknvx  = -nvy;\r\n        blocknvy  =  nvx;\r\n    }\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= SL_CheckLine\r\n=\r\n==================\r\n*/\r\n\r\n\r\nboolean SL_CheckLine(line_t *ld)//L800257D8()\r\n{\r\n\tfixed_t\t\topentop, openbottom;\r\n\tsector_t\t*front, *back;\r\n\tint\t\t\tside1, temp;\r\n\r\n\t// check bbox first\r\n\tif (endbox[BOXRIGHT ] < ld->bbox[BOXLEFT  ]\r\n\t||\tendbox[BOXLEFT  ] > ld->bbox[BOXRIGHT ]\r\n\t||\tendbox[BOXTOP   ] < ld->bbox[BOXBOTTOM]\r\n\t||\tendbox[BOXBOTTOM] > ld->bbox[BOXTOP   ] )\r\n\t\treturn true;\r\n\r\n\t// see if it can possibly block movement\r\n\tif (!ld->backsector || ld->flags & ML_BLOCKING)\r\n\t\tgoto findfrac;\t\t// explicitly blocking\r\n\r\n\tfront = ld->frontsector;\r\n\tback = ld->backsector;\r\n\r\n\tif (front->floorheight > back->floorheight)\r\n\t\topenbottom = front->floorheight;\r\n\telse\r\n\t\topenbottom = back->floorheight;\r\n\r\n\tif (openbottom - slidething->z > 24*FRACUNIT)\r\n\t\tgoto findfrac;\t\t// too big of a step up\r\n\r\n\tif (front->ceilingheight < back->ceilingheight)\r\n\t\topentop = front->ceilingheight;\r\n\telse\r\n\t\topentop = back->ceilingheight;\r\n\r\n\tif (opentop - openbottom >= 56*FRACUNIT)\r\n\t\treturn true;\t\t// the line doesn't block movement\r\n\r\n\t// the line definately blocks movement\r\nfindfrac:\r\n\t// p1, p2 are line endpoints\r\n\tp1x = ld->v1->x;\r\n\tp1y = ld->v1->y;\r\n\tp2x = ld->v2->x;\r\n\tp2y = ld->v2->y;\r\n\r\n\tnvx = finesine[ld->fineangle];\r\n\tnvy = -finecosine[ld->fineangle];\r\n\r\n\tside1 = SL_PointOnSide (slidex, slidey);\r\n\tif (side1 == SIDE_ON)\r\n\t\treturn true;\r\n\tif (side1 == SIDE_BACK)\r\n\t{\r\n\t\tif (!ld->backsector)\r\n\t\t\treturn true;\t\t\t// don't clip to backs of one sided lines\r\n\t\ttemp = p1x;\r\n\t\tp1x = p2x;\r\n\t\tp2x = temp;\r\n\t\ttemp = p1y;\r\n\t\tp1y = p2y;\r\n\t\tp2y = temp;\r\n\t\tnvx = -nvx;\r\n\t\tnvy = -nvy;\r\n\t}\r\n\r\n\tSL_ClipToLine();\r\n\treturn true;\r\n}\r\n\r\nint\tSL_PointOnSide2(fixed_t x1, fixed_t y1, fixed_t x2, fixed_t y2, fixed_t x3, fixed_t y3)//L80025A24()\r\n{\r\n    //checked\r\n\tfixed_t\tnx, ny;\r\n\tfixed_t dist;\r\n\r\n\tx1 = (x1 - x2);\r\n\ty1 = (y1 - y2);\r\n\r\n\tnx = (y3 - y2);\r\n\tny = (x2 - x3);\r\n\r\n\tdist = FixedMul(x1, nx) + FixedMul(y1, ny);\r\n\r\n\tif (dist < 0)\r\n\t\treturn SIDE_BACK;\r\n\treturn SIDE_FRONT;\r\n}\r\n\r\nstatic short    *list_;     //80078074|psGp00000c64\r\nstatic line_t   *ld_;       //80077E48|plGp00000a38\r\nstatic int      offset_;    //80077DB0|iGp000009a0\r\n\r\nvoid SL_CheckSpecialLines (fixed_t x1, fixed_t y1, fixed_t x2, fixed_t y2)//L80025A94()\r\n{\r\n\tfixed_t\t\t\tbx, by, xl, xh, yl, yh, bxl, bxh, byl, byh;\r\n\tfixed_t\t\t\tx3,y3,x4,y4;\r\n\tint\t\t\t    side1, side2;\r\n\r\n\tif (x1<x2) {\r\n\t\txl = x1;\r\n\t\txh = x2;\r\n\t} else {\r\n\t\txl = x2;\r\n\t\txh = x1;\r\n\t}\r\n\tif (y1<y2) {\r\n\t\tyl = y1;\r\n\t\tyh = y2;\r\n\t} else {\r\n\t\tyl = y2;\r\n\t\tyh = y1;\r\n\t}\r\n\r\n\tbxl = (xl - bmaporgx)>>MAPBLOCKSHIFT;\r\n\tbxh = (xh - bmaporgx)>>MAPBLOCKSHIFT;\r\n\tbyl = (yl - bmaporgy)>>MAPBLOCKSHIFT;\r\n\tbyh = (yh - bmaporgy)>>MAPBLOCKSHIFT;\r\n\r\n\tif (bxl<0)\r\n\t\tbxl = 0;\r\n\tif (byl<0)\r\n\t\tbyl = 0;\r\n\tif (bxh>= bmapwidth)\r\n\t\tbxh = bmapwidth -1;\r\n\tif (byh>= bmapheight)\r\n\t\tbyh = bmapheight -1;\r\n\r\n\tspecialline = 0;\r\n\t++validcount;\r\n\r\n\tfor (bx = bxl; bx <= bxh; bx++)\r\n\t{\r\n\t\tfor (by = byl; by <= byh; by++)\r\n\t\t{\r\n\t\t\toffset_ = (by*bmapwidth) + bx;\r\n\t\t\toffset_ = *(blockmap + offset_);\r\n\r\n\t\t\tfor (list_ = blockmaplump + offset_; *list_ != -1; list_++)\r\n\t\t\t{\r\n\t\t\t\tld_ = &lines[*list_];\r\n\r\n\t\t\t\tif (!ld_->special)\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\tif (ld_->validcount == validcount)\r\n\t\t\t\t\tcontinue;\t\t// line has already been checked\r\n\r\n\t\t\t\tld_->validcount = validcount;\r\n\r\n\t\t\t\tif (xh < ld_->bbox[BOXLEFT]\r\n\t\t\t\t\t|| xl > ld_->bbox[BOXRIGHT]\r\n\t\t\t\t\t|| yh < ld_->bbox[BOXBOTTOM]\r\n\t\t\t\t\t|| yl > ld_->bbox[BOXTOP])\r\n\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\tx3 = ld_->v1->x;\r\n\t\t\t\ty3 = ld_->v1->y;\r\n\t\t\t\tx4 = ld_->v2->x;\r\n\t\t\t\ty4 = ld_->v2->y;\r\n\r\n\t\t\t\tside1 = SL_PointOnSide2(x1, y1, x3, y3, x4, y4);\r\n\t\t\t\tside2 = SL_PointOnSide2(x2, y2, x3, y3, x4, y4);\r\n\r\n\t\t\t\tif (side1 == side2)\r\n\t\t\t\t\tcontinue;\t\t// move doesn't cross line\r\n\r\n\t\t\t\tside1 = SL_PointOnSide2(x3, y3, x1, y1, x2, y2);\r\n\t\t\t\tside2 = SL_PointOnSide2(x4, y4, x1, y1, x2, y2);\r\n\r\n\t\t\t\tif (side1 == side2)\r\n\t\t\t\t\tcontinue;\t\t// line doesn't cross move\r\n\r\n\t\t\t\tspecialline = ld_;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/p_spec.c",
    "content": "/* P_Spec.c */\r\n#include \"doomdef.h\"\r\n#include \"r_local.h\"\r\n#include \"p_local.h\"\r\n#include \"st_main.h\"\r\n\r\n/*\r\n===================\r\n=\r\n= P_InitPicAnims\r\n=\r\n===================\r\n*/\r\n\r\nanimdef_t\t\tanimdefs[MAXANIMS] =//0x80067074\r\n{\r\n\t{ false, \"BLOOD1\", \"BLOOD3\", 3 },\r\n\t{ false, \"BSLIME01\", \"BSLIME04\", 3 },\r\n\t{ false, \"CSLIME01\", \"CSLIME04\", 3 },\r\n\t{ false, \"ENERG01\", \"ENERG04\", 3 },\r\n\t{ false, \"LAVA01\", \"LAVA04\", 3 },\r\n\t{ false, \"WATER01\", \"WATER04\", 3 },\r\n\t{ false, \"SLIME01\", \"SLIME03\", 3 },\r\n\t{ true, \"BFALL1\", \"BFALL1\", 3 },\r\n\t{ true, \"ENERGY01\", \"ENERGY04\", 3 },\r\n\t{ true, \"FIRE01\", \"FIRE02\", 3 },\r\n\t{ true, \"FLAME01\", \"FLAME03\", 3 },\r\n\t{ true, \"LAVWAL01\", \"LAVWAL03\", 3 },\r\n\t{ true, \"SFALL1\", \"SFALL4\", 3 },\r\n\t{ true, \"SLIM01\", \"SLIM04\", 3 },\r\n\t{ true, \"TVSNOW01\", \"TVSNOW03\", 1 },\r\n\t{ true, \"WARN01\", \"WARN02\", 3 }\r\n};\r\n\r\nanim_t\t/*anims[MAXANIMS],*/ *lastanim;//800861d4, ||80077F8C, pbGp00000b7c\r\n\r\nvoid P_InitPicAnims (void)//L80025EDC()\r\n{\r\n\tint\t\ti, lump;\r\n\r\n\t/* */\r\n\t/*\tInit animation */\r\n\t/* */\r\n\tlastanim = anims;\r\n\tfor (i=0 ; i < MAXANIMS ; i++)\r\n\t{\r\n\t\tif (animdefs[i].istexture)\r\n\t\t{\r\n\t\t\tlastanim->basepic = R_TextureNumForName (animdefs[i].startname);\r\n\t\t\tlastanim->picnum = R_TextureNumForName(animdefs[i].endname);\r\n\r\n\t\t\tif (textures[lastanim->basepic].vtpage ==  NULL)\r\n                continue;\r\n\r\n            for(lump = lastanim->basepic; lump <= lastanim->picnum; lump++)\r\n            {\r\n                W_CacheLumpNum(lump + firsttex, PU_ANIMATION, false);\r\n                textures[lump].vramx = textures[lastanim->basepic].vramx;\r\n                textures[lump].vramy = textures[lastanim->basepic].vramy;\r\n                textures[lump].vtpage = textures[lastanim->basepic].vtpage;\r\n                textures[lump].vptr = textures[lastanim->basepic].vptr;\r\n            }\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tlastanim->basepic = R_FlatNumForName (animdefs[i].startname);\r\n\t\t\tlastanim->picnum = R_FlatNumForName(animdefs[i].endname);\r\n\r\n\t\t\tif (texflats[lastanim->basepic].vtpage ==  NULL)\r\n                continue;\r\n\r\n            for (lump = lastanim->basepic; lump <= lastanim->picnum; lump++)\r\n            {\r\n                W_CacheLumpNum(lump + firstflat, PU_ANIMATION, false);\r\n\r\n                texflats[lump].vramx = texflats[lastanim->basepic].vramx;\r\n                texflats[lump].vramy = texflats[lastanim->basepic].vramy;\r\n                texflats[lump].vtpage = texflats[lastanim->basepic].vtpage;\r\n                texflats[lump].vptr = texflats[lastanim->basepic].vptr;\r\n            }\r\n\t\t}\r\n\r\n\t\tlastanim->istexture = animdefs[i].istexture;\r\n        lastanim->current = lastanim->basepic;\r\n        lastanim->numpics = (lastanim->picnum - lastanim->basepic) + 1;\r\n        lastanim->tics = animdefs[i].speed;\r\n#if 0\r\n/* FIXME */\r\n\t\tif (lastanim->numpics < 2)\r\n\t\t\tI_Error (\"P_InitPicAnims: bad cycle from %s to %s\"\r\n\t\t\t, animdefs[i].startname, animdefs[i].endname);\r\n#endif\r\n\t\tlastanim++;\r\n\t}\r\n}\r\n\r\n\r\n/*\r\n==============================================================================\r\n\r\n\t\t\t\t\t\t\tUTILITIES\r\n\r\n==============================================================================\r\n*/\r\n\r\n/* */\r\n/*\tWill return a side_t* given the number of the current sector, */\r\n/*\t\tthe line number, and the side (0/1) that you want. */\r\n/* */\r\nside_t *getSide(int currentSector,int line, int side)//L800261BC()\r\n{\r\n\treturn &sides[ (sectors[currentSector].lines[line])->sidenum[side] ];\r\n}\r\n\r\n/* */\r\n/*\tWill return a sector_t* given the number of the current sector, */\r\n/*\t\tthe line number and the side (0/1) that you want. */\r\n/* */\r\nsector_t *getSector(int currentSector,int line,int side)//L80026218()\r\n{\r\n\treturn sides[ (sectors[currentSector].lines[line])->sidenum[side] ].sector;\r\n}\r\n\r\n/* */\r\n/*\tGiven the sector number and the line number, will tell you whether */\r\n/*\t\tthe line is two-sided or not. */\r\n/* */\r\nint\ttwoSided(int sector,int line)//L8002627C()\r\n{\r\n\treturn (sectors[sector].lines[line])->flags & ML_TWOSIDED;\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tReturn sector_t * of sector next to current. NULL if not two-sided line */\r\n/* */\r\n/*================================================================== */\r\nsector_t *getNextSector(line_t *line,sector_t *sec)//L800262BC()\r\n{\r\n\tif (!(line->flags & ML_TWOSIDED))\r\n\t\treturn NULL;\r\n\r\n\tif (line->frontsector == sec)\r\n\t\treturn line->backsector;\r\n\r\n\treturn line->frontsector;\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tFIND LOWEST FLOOR HEIGHT IN SURROUNDING SECTORS */\r\n/* */\r\n/*================================================================== */\r\nfixed_t\tP_FindLowestFloorSurrounding(sector_t *sec)//L800262EC()\r\n{\r\n\tint\t\t\ti;\r\n\tline_t\t\t*check;\r\n\tsector_t\t*other;\r\n\tfixed_t\t\tfloor = sec->floorheight;\r\n\r\n\tfor (i=0 ;i < sec->linecount ; i++)\r\n\t{\r\n\t\tcheck = sec->lines[i];\r\n\t\tother = getNextSector(check,sec);\r\n\t\tif (!other)\r\n\t\t\tcontinue;\r\n\t\tif (other->floorheight < floor)\r\n\t\t\tfloor = other->floorheight;\r\n\t}\r\n\treturn floor;\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tFIND HIGHEST FLOOR HEIGHT IN SURROUNDING SECTORS */\r\n/* */\r\n/*================================================================== */\r\nfixed_t\tP_FindHighestFloorSurrounding(sector_t *sec)//L80026380()\r\n{\r\n\tint\t\t\ti;\r\n\tline_t\t\t*check;\r\n\tsector_t\t*other;\r\n\tfixed_t\t\tfloor = -500*FRACUNIT;\r\n\r\n\tfor (i=0 ;i < sec->linecount ; i++)\r\n\t{\r\n\t\tcheck = sec->lines[i];\r\n\t\tother = getNextSector(check,sec);\r\n\t\tif (!other)\r\n\t\t\tcontinue;\r\n\t\tif (other->floorheight > floor)\r\n\t\t\tfloor = other->floorheight;\r\n\t}\r\n\treturn floor;\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tFIND NEXT HIGHEST FLOOR IN SURROUNDING SECTORS */\r\n/* */\r\n/*================================================================== */\r\nfixed_t\tP_FindNextHighestFloor(sector_t *sec,int currentheight)//L80026418()\r\n{\r\n    #if P_FNHF_UPDATE == 1\r\n    // PSYDOOM: rewrite this to eliminate potential buffer overflow and also an undefined answer when there is no next higher floor\r\n    int         lineIdx;\r\n    line_t      *line;\r\n    sector_t    *pNextSector;\r\n    fixed_t     floorH;\r\n    fixed_t     nextHighestFloor = MAXINT;\r\n\r\n    for (lineIdx = 0; lineIdx < sec->linecount; ++lineIdx)\r\n    {\r\n        line = sec->lines[lineIdx];\r\n        pNextSector = getNextSector(line, sec);\r\n\r\n        if (!pNextSector)\r\n            continue;\r\n\r\n        floorH = pNextSector->floorheight;\r\n\r\n        if ((floorH > currentheight) && (floorH < nextHighestFloor))\r\n        {\r\n            nextHighestFloor = floorH;\r\n        }\r\n    }\r\n\r\n    // If there is no next highest floor return the input height rather than something undefined\r\n    return (nextHighestFloor != MAXINT) ? nextHighestFloor : currentheight;\r\n    #else\r\n\tint\t\t\ti;\r\n\tint\t\t\th;\r\n\tint\t\t\tmin;\r\n\tline_t\t\t*check;\r\n\tsector_t\t*other;\r\n\tfixed_t\t\theight = currentheight;\r\n\tfixed_t\t\theightlist[20];\t\t/* 20 adjoining sectors max! */\r\n\r\n\tfor (i =0,h = 0 ;i < sec->linecount ; i++)\r\n\t{\r\n\t\tcheck = sec->lines[i];\r\n\t\tother = getNextSector(check,sec);\r\n\t\tif (!other)\r\n\t\t\tcontinue;\r\n\t\tif (other->floorheight > height)\r\n\t\t\theightlist[h++] = other->floorheight;\r\n\t}\r\n\r\n\t/* */\r\n\t/* Find lowest height in list */\r\n\t/* */\r\n\tmin = heightlist[0];\r\n\tfor (i = 1;i < h;i++)\r\n\t\tif (heightlist[i] < min)\r\n\t\t\tmin = heightlist[i];\r\n\r\n\treturn min;\r\n\t#endif //P_FNHF_UPDATE\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tFIND LOWEST CEILING IN THE SURROUNDING SECTORS */\r\n/* */\r\n/*================================================================== */\r\nfixed_t\tP_FindLowestCeilingSurrounding(sector_t *sec)//L800264FC()\r\n{\r\n\tint\t\t\ti;\r\n\tline_t\t\t*check;\r\n\tsector_t\t*other;\r\n\tfixed_t\t\theight = MAXINT;\r\n\r\n\tfor (i=0 ;i < sec->linecount ; i++)\r\n\t{\r\n\t\tcheck = sec->lines[i];\r\n\t\tother = getNextSector(check,sec);\r\n\t\tif (!other)\r\n\t\t\tcontinue;\r\n\t\tif (other->ceilingheight < height)\r\n\t\t\theight = other->ceilingheight;\r\n\t}\r\n\treturn height;\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tFIND HIGHEST CEILING IN THE SURROUNDING SECTORS */\r\n/* */\r\n/*================================================================== */\r\nfixed_t\tP_FindHighestCeilingSurrounding(sector_t *sec)//L80026598()\r\n{\r\n\tint\ti;\r\n\tline_t\t*check;\r\n\tsector_t\t*other;\r\n\tfixed_t\theight = 0;\r\n\r\n\tfor (i=0 ;i < sec->linecount ; i++)\r\n\t{\r\n\t\tcheck = sec->lines[i];\r\n\t\tother = getNextSector(check,sec);\r\n\t\tif (!other)\r\n\t\t\tcontinue;\r\n\t\tif (other->ceilingheight > height)\r\n\t\t\theight = other->ceilingheight;\r\n\t}\r\n\treturn height;\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tRETURN NEXT SECTOR # THAT LINE TAG REFERS TO */\r\n/* */\r\n/*================================================================== */\r\nint\tP_FindSectorFromLineTag(line_t\t*line,int start)//L80026630()\r\n{\r\n\tint\ti;\r\n\r\n\tfor (i=start+1;i<numsectors;i++)\r\n\t\tif (sectors[i].tag == line->tag)\r\n\t\t\treturn i;\r\n\treturn -1;\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tFind minimum light from an adjacent sector */\r\n/* */\r\n/*================================================================== */\r\nint\tP_FindMinSurroundingLight(sector_t *sector,int max)//L80026698()\r\n{\r\n\tint\t\t\ti;\r\n\tint\t\t\tmin;\r\n\tline_t\t\t*line;\r\n\tsector_t\t*check;\r\n\r\n\tmin = max;\r\n\tfor (i=0 ; i < sector->linecount ; i++)\r\n\t{\r\n\t\tline = sector->lines[i];\r\n\t\tcheck = getNextSector(line,sector);\r\n\t\tif (!check)\r\n\t\t\tcontinue;\r\n\t\tif (check->lightlevel < min)\r\n\t\t\tmin = check->lightlevel;\r\n\t}\r\n\treturn min;\r\n}\r\n\r\n/*\r\n==============================================================================\r\n\r\n\t\t\t\t\t\t\tEVENTS\r\n\r\nEvents are operations triggered by using, crossing, or shooting special lines, or by timed thinkers\r\n\r\n==============================================================================\r\n*/\r\n\r\n\r\n\r\n/*\r\n===============================================================================\r\n=\r\n= P_CrossSpecialLine - TRIGGER\r\n=\r\n= Called every time a thing origin is about to cross\r\n= a line with a non 0 special\r\n=\r\n===============================================================================\r\n*/\r\n\r\nvoid P_CrossSpecialLine (line_t *line, mobj_t *thing)//L8002672C()\r\n{\r\n\tint\t\t\tok;\r\n\r\n\t/* */\r\n\t/*\tTriggers that other things can activate */\r\n\t/* */\r\n\tif (!thing->player)\r\n\t{\r\n\t\tif ((thing->type >= MT_TROOPSHOT) && (thing->type < MT_ARACHPLAZ))\r\n\t\t\treturn;\r\n\r\n\t\tok = 0;\r\n\t\tswitch(line->special)\r\n\t\t{\r\n\t\t\tcase 39:\t/* TELEPORT TRIGGER */\r\n\t\t\tcase 97:\t/* TELEPORT RETRIGGER */\r\n\t\t\tcase 125:\t/* TELEPORT MONSTERONLY TRIGGER */\r\n\t\t\tcase 126:\t/* TELEPORT MONSTERONLY RETRIGGER */\r\n\t\t\tcase 4:\t\t/* RAISE DOOR */\r\n\t\t\tcase 10:\t/* PLAT DOWN-WAIT-UP-STAY TRIGGER */\r\n\t\t\tcase 88:\t/* PLAT DOWN-WAIT-UP-STAY RETRIGGER */\r\n\t\t\t\tok = 1;\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tif (!ok)\r\n\t\t\treturn;\r\n\t}\r\n\r\n\tswitch (line->special)\r\n\t{\r\n\t\t/*==================================================== */\r\n\t\t/* TRIGGERS */\r\n\t\t/*==================================================== */\r\n\t\tcase 2:\t\t\t/* Open Door */\r\n\t\t\tEV_DoDoor(line, Open);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 3:\t\t\t/* Close Door */\r\n\t\t\tEV_DoDoor(line, Close);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 4:\t\t\t/* Raise Door */\r\n\t\t\tEV_DoDoor(line, Normal);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 5:\t\t\t/* Raise Floor */\r\n\t\t\tEV_DoFloor(line, raiseFloor);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 6:\t\t\t/* Fast Ceiling Crush & Raise */\r\n\t\t\tEV_DoCeiling(line, fastCrushAndRaise);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 8:\t\t\t/* Build Stairs */\r\n\t\t\tEV_BuildStairs(line, build8);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 10:\t\t/* PlatDownWaitUp */\r\n\t\t\tEV_DoPlat(line, downWaitUpStay, 0);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 12:\t\t/* Light Turn On - brightest near */\r\n\t\t\tEV_LightTurnOn(line, 0);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 13:\t\t/* Light Turn On 255 */\r\n\t\t\tEV_LightTurnOn(line, 255);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 16:\t\t/* Close Door 30 */\r\n\t\t\tEV_DoDoor(line, Close30ThenOpen);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 17:\t\t/* Start Light Strobing */\r\n\t\t\tEV_StartLightStrobing(line);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 19:\t\t/* Lower Floor */\r\n\t\t\tEV_DoFloor(line, lowerFloor);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 22:\t\t/* Raise floor to nearest height and change texture */\r\n\t\t\tEV_DoPlat(line, raiseToNearestAndChange, 0);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 25:\t\t/* Ceiling Crush and Raise */\r\n\t\t\tEV_DoCeiling(line, crushAndRaise);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 30:\t\t/* Raise floor to shortest texture height on either side of lines */\r\n\t\t\tEV_DoFloor(line, raiseToTexture);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 35:\t\t/* Lights Very Dark */\r\n\t\t\tEV_LightTurnOn(line, 35);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 36:\t\t/* Lower Floor (TURBO) */\r\n\t\t\tEV_DoFloor(line, turboLower);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 37:\t\t/* LowerAndChange */\r\n\t\t\tEV_DoFloor(line, lowerAndChange);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 38:\t\t/* Lower Floor To Lowest */\r\n\t\t\tEV_DoFloor(line, lowerFloorToLowest);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 39:\t\t/* TELEPORT! */\r\n\t\t\tEV_Teleport(line, thing);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 40:\t\t/* RaiseCeilingLowerFloor */\r\n\t\t\tEV_DoCeiling(line, raiseToHighest);\r\n\t\t\tEV_DoFloor(line, lowerFloorToLowest);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 44:\t\t/* Ceiling Crush */\r\n\t\t\tEV_DoCeiling(line, lowerAndCrush);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 52:\t\t/* EXIT! */\r\n\t\t\tP_ExitLevel();\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 53:\t\t/* Perpetual Platform Raise */\r\n\t\t\tEV_DoPlat(line, perpetualRaise, 0);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 54:\t\t/* Platform Stop */\r\n\t\t\tEV_StopPlat(line);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 56:\t\t/* Raise Floor Crush */\r\n\t\t\tEV_DoFloor(line, raiseFloorCrush);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 57:\t\t/* Ceiling Crush Stop */\r\n\t\t\tEV_CeilingCrushStop(line);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 58:\t\t/* Raise Floor 24 */\r\n\t\t\tEV_DoFloor(line, raiseFloor24);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 59:\t\t/* Raise Floor 24 And Change */\r\n\t\t\tEV_DoFloor(line, raiseFloor24AndChange);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 104:\t\t/* Turn lights off in sector(tag) */\r\n\t\t\tEV_TurnTagLightsOff(line);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 108:\t\t/*  Blazing Door Raise (faster than TURBO!) */\r\n\t\t\tEV_DoDoor(line, BlazeRaise);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 109:\t\t/*  Blazing Door Open (faster than TURBO!) */\r\n\t\t\tEV_DoDoor(line, BlazeOpen);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 100:\t\t/* Build Stairs Turbo 16 */\r\n\t\t\tEV_BuildStairs(line, turbo16);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 110:\t\t/*  Blazing Door Close (faster than TURBO!) */\r\n\t\t\tEV_DoDoor(line, BlazeClose);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 119:\t\t/*  Raise floor to nearest surr. floor */\r\n\t\t\tEV_DoFloor(line, raiseFloorToNearest);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 121:\t\t/*  Blazing PlatDownWaitUpStay */\r\n\t\t\tEV_DoPlat(line, blazeDWUS, 0);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 124:\t\t/* Secret EXIT */\r\n\t\t\tP_SecretExitLevel(line->tag);\r\n\t\t\tbreak;\r\n\t\tcase 125:\t\t/* TELEPORT MonsterONLY */\r\n\t\t\tif (!thing->player)\r\n\t\t\t{\r\n\t\t\t\tEV_Teleport(line, thing);\r\n\t\t\t\tline->special = 0;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 141:\t\t/* Silent Ceiling Crush & Raise */\r\n\t\t\tEV_DoCeiling(line, silentCrushAndRaise);\r\n\t\t\tline->special = 0;\r\n\t\t\tbreak;\r\n\t\tcase 142:\t\t/* Play Track Club Doom PSX DOOM EXCLUSIVE */\r\n            S_StopMusic();\r\n            psxcd_play_at_andloop(CD_TRACK[cdmusic_club_doom],CDVolume,0,0,CD_TRACK[cdmusic_club_doom],CDVolume,0,0);\r\n            line->special = 0;\r\n\t\t\tbreak;\r\n\t/*==================================================== */\r\n\t/* RE-DOABLE TRIGGERS */\r\n\t/*==================================================== */\r\n\t\tcase 72:\t\t/* Ceiling Crush */\r\n\t\t\tEV_DoCeiling(line, lowerAndCrush);\r\n\t\t\tbreak;\r\n\t\tcase 73:\t\t/* Ceiling Crush and Raise */\r\n\t\t\tEV_DoCeiling(line, crushAndRaise);\r\n\t\t\tbreak;\r\n\t\tcase 74:\t\t/* Ceiling Crush Stop */\r\n\t\t\tEV_CeilingCrushStop(line);\r\n\t\t\tbreak;\r\n\t\tcase 75:\t\t/* Close Door */\r\n\t\t\tEV_DoDoor(line, Close);\r\n\t\t\tbreak;\r\n\t\tcase 76:\t\t/* Close Door 30 */\r\n\t\t\tEV_DoDoor(line, Close30ThenOpen);\r\n\t\t\tbreak;\r\n\t\tcase 77:\t\t/* Fast Ceiling Crush & Raise */\r\n\t\t\tEV_DoCeiling(line, fastCrushAndRaise);\r\n\t\t\tbreak;\r\n\t\tcase 79:\t\t/* Lights Very Dark */\r\n\t\t\tEV_LightTurnOn(line, 35);\r\n\t\t\tbreak;\r\n\t\tcase 80:\t\t/* Light Turn On - brightest near */\r\n\t\t\tEV_LightTurnOn(line, 0);\r\n\t\t\tbreak;\r\n\t\tcase 81:\t\t/* Light Turn On 255 */\r\n\t\t\tEV_LightTurnOn(line, 255);\r\n\t\t\tbreak;\r\n\t\tcase 82:\t\t/* Lower Floor To Lowest */\r\n\t\t\tEV_DoFloor(line, lowerFloorToLowest);\r\n\t\t\tbreak;\r\n\t\tcase 83:\t\t/* Lower Floor */\r\n\t\t\tEV_DoFloor(line, lowerFloor);\r\n\t\t\tbreak;\r\n\t\tcase 84:\t\t/* LowerAndChange */\r\n\t\t\tEV_DoFloor(line, lowerAndChange);\r\n\t\t\tbreak;\r\n\t\tcase 86:\t\t/* Open Door */\r\n\t\t\tEV_DoDoor(line, Open);\r\n\t\t\tbreak;\r\n\t\tcase 87:\t\t/* Perpetual Platform Raise */\r\n\t\t\tEV_DoPlat(line, perpetualRaise, 0);\r\n\t\t\tbreak;\r\n\t\tcase 88:\t\t/* PlatDownWaitUp */\r\n\t\t\tEV_DoPlat(line, downWaitUpStay, 0);\r\n\t\t\tbreak;\r\n\t\tcase 89:\t\t/* Platform Stop */\r\n\t\t\tEV_StopPlat(line);\r\n\t\t\tbreak;\r\n\t\tcase 90:\t\t/* Raise Door */\r\n\t\t\tEV_DoDoor(line, Normal);\r\n\t\t\tbreak;\r\n\t\tcase 91:\t\t/* Raise Floor */\r\n\t\t\tEV_DoFloor(line, raiseFloor);\r\n\t\t\tbreak;\r\n\t\tcase 92:\t\t/* Raise Floor 24 */\r\n\t\t\tEV_DoFloor(line, raiseFloor24);\r\n\t\t\tbreak;\r\n\t\tcase 93:\t\t/* Raise Floor 24 And Change */\r\n\t\t\tEV_DoFloor(line, raiseFloor24AndChange);\r\n\t\t\tbreak;\r\n\t\tcase 94:\t\t/* Raise Floor Crush */\r\n\t\t\tEV_DoFloor(line, raiseFloorCrush);\r\n\t\t\tbreak;\r\n\t\tcase 95:\t\t/* Raise floor to nearest height and change texture */\r\n\t\t\tEV_DoPlat(line, raiseToNearestAndChange, 0);\r\n\t\t\tbreak;\r\n\t\tcase 96:\t\t/* Raise floor to shortest texture height on either side of lines */\r\n\t\t\tEV_DoFloor(line, raiseToTexture);\r\n\t\t\tbreak;\r\n\t\tcase 97:\t\t/* TELEPORT! */\r\n\t\t\tEV_Teleport(line, thing);\r\n\t\t\tbreak;\r\n\t\tcase 98:\t\t/* Lower Floor (TURBO) */\r\n\t\t\tEV_DoFloor(line, turboLower);\r\n\t\t\tbreak;\r\n\t\tcase 105:\t\t/* Blazing Door Raise (faster than TURBO!) */\r\n\t\t\tEV_DoDoor(line, BlazeRaise);\r\n\t\t\tbreak;\r\n\t\tcase 106:\t\t/* Blazing Door Open (faster than TURBO!) */\r\n\t\t\tEV_DoDoor(line, BlazeOpen);\r\n\t\t\tbreak;\r\n\t\tcase 107:\t\t/* Blazing Door Close (faster than TURBO!) */\r\n\t\t\tEV_DoDoor(line, BlazeClose);\r\n\t\t\tbreak;\r\n\t\tcase 120:\t\t/* Blazing PlatDownWaitUpStay */\r\n\t\t\tEV_DoPlat(line, blazeDWUS, 0);\r\n\t\t\tbreak;\r\n\t\tcase 126:\t\t/* TELEPORT MonsterONLY */\r\n\t\t\tif (!thing->player)\r\n\t\t\t\tEV_Teleport(line, thing);\r\n\t\t\tbreak;\r\n\t}\r\n}\r\n\r\n/*\r\n===============================================================================\r\n=\r\n= P_ShootSpecialLine - IMPACT SPECIALS\r\n=\r\n= Called when a thing shoots a special line\r\n=\r\n===============================================================================\r\n*/\r\n\r\nvoid\tP_ShootSpecialLine ( mobj_t *thing, line_t *line)//L80026CD8()\r\n{\r\n\tint\t\tok;\r\n\r\n\t/* */\r\n\t/*\tImpacts that other things can activate */\r\n\t/* */\r\n\tif (!thing->player)\r\n\t{\r\n\t\tok = 0;\r\n\t\tswitch(line->special)\r\n\t\t{\r\n\t\t\tcase 46:\t\t/* OPEN DOOR IMPACT */\r\n\t\t\t\tok = 1;\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\tif (!ok)\r\n\t\t\treturn;\r\n\t}\r\n\r\n\tswitch(line->special)\r\n\t{\r\n\t\tcase 24:\t\t/* RAISE FLOOR */\r\n\t\t\tif(EV_DoFloor(line,raiseFloor))\r\n\t\t\t\tP_ChangeSwitchTexture(line,0);\r\n\t\t\tbreak;\r\n\t\tcase 46:\t\t/* OPEN DOOR */\r\n\t\t\tif(EV_DoDoor(line,Open))\r\n\t\t\t\tP_ChangeSwitchTexture(line,1);\r\n\t\t\tbreak;\r\n\t\tcase 47:\t\t/* RAISE FLOOR NEAR AND CHANGE */\r\n\t\t\tif(EV_DoPlat(line,raiseToNearestAndChange,0))\r\n\t\t\t\tP_ChangeSwitchTexture(line,0);\r\n\t\t\tbreak;\r\n\t}\r\n}\r\n\r\n\r\n/*\r\n===============================================================================\r\n=\r\n= P_PlayerInSpecialSector\r\n=\r\n= Called every tic frame that the player origin is in a special sector\r\n=\r\n===============================================================================\r\n*/\r\n\r\nvoid P_PlayerInSpecialSector (player_t *player)//L80026DA0()\r\n{\r\n\tsector_t\t*sector;\r\n\r\n\tsector = player->mo->subsector->sector;\r\n\tif (player->mo->z != sector->floorheight)\r\n\t\treturn;\t\t/* not all the way down yet */\r\n\r\n\tswitch (sector->special)\r\n\t{\r\n\t\tcase 5:\t\t/* HELLSLIME DAMAGE */\r\n\t\t\tif (!player->powers[pw_ironfeet])\r\n\t\t\t{\r\n\t\t\t\tstbar.specialFace = f_mowdown;\r\n\r\n\t\t\t\tif ((gamevbls < (int)gametic) && !(gametic & 0xf))\r\n                  P_DamageMobj(player->mo, NULL, NULL, 10);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 7:\t\t/* NUKAGE DAMAGE */\r\n\t\t\tif (!player->powers[pw_ironfeet])\r\n\t\t\t{\r\n\t\t\t\tstbar.specialFace = f_mowdown;\r\n\r\n\t\t\t\tif ((gamevbls < (int)gametic) && !(gametic & 0xf))\r\n                  P_DamageMobj(player->mo, NULL, NULL, 5);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 16:\t/* SUPER HELLSLIME DAMAGE */\r\n\t\tcase 4:\t\t/* STROBE HURT */\r\n\t\t\tif (!player->powers[pw_ironfeet] || (P_Random() < 5))\r\n\t\t\t{\r\n\t\t\t\tstbar.specialFace = f_mowdown;\r\n\r\n                if ((gamevbls < (int)gametic) && !(gametic & 0xf))\r\n                  P_DamageMobj(player->mo, NULL, NULL, 20);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\r\n\t\tcase 9:\t\t/* SECRET SECTOR */\r\n\t\t\tplayer->secretcount++;\r\n\t\t\tsector->special = 0;\r\n\t\t\tbreak;\r\n\r\n\t\tdefault:\r\n\t\t\tI_Error (\"P_PlayerInSpecialSector: unknown special %i\", sector->special);\r\n\t};\r\n}\r\n\r\n\r\n/*\r\n===============================================================================\r\n=\r\n= P_UpdateSpecials\r\n=\r\n= Animate planes, scroll walls, etc\r\n===============================================================================\r\n*/\r\n\r\n#define SCROLLLIMIT (FRACUNIT*-129)\r\n\r\nint\t\tnumlinespecials;//0x80077D7C, iGp0000096c\r\n//line_t\t*linespeciallist[MAXLINEANIMS];//0x800973a4\r\n\r\nfiresky_t spreadfire;   //80077964, pcGp00000554\r\n\r\nvoid P_UpdateSpecials (void)//L80026F60()\r\n{\r\n\tanim_t\t\t*anim;\r\n\tint\t\t\ti;\r\n\tline_t\t\t*line;\r\n\tpsxobj_t\t*animtex;\r\n\r\n\r\n\t/* */\r\n\t/*\tANIMATE FLATS AND TEXTURES GLOBALY */\r\n\t/* */\r\n\tfor (anim = anims ; anim < lastanim ; anim++)\r\n\t{\r\n\t\tif (!(gametic & anim->tics))//leveltime\r\n\t\t{\r\n\t\t\tif (!anim->istexture)\r\n\t\t\t{\r\n\t\t\t\tanim->current++;\r\n\t\t\t\tif (anim->picnum < anim->current)\r\n\t\t\t\t\tanim->current = anim->basepic;\r\n\r\n\t\t\t\tflattranslation[anim->basepic] = anim->current;\r\n\t\t\t\tanimtex = &texflats[anim->current];\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tanim->current++;\r\n\t\t\t\tif (anim->picnum < anim->current)\r\n\t\t\t\t\tanim->current = anim->basepic;\r\n\r\n\t\t\t\ttexturetranslation[anim->basepic] = anim->current;\r\n\t\t\t\tanimtex = &textures[anim->current];\r\n\t\t\t}\r\n\t\t\tanimtex->index = -1;\r\n\t\t}\r\n\t}\r\n\r\n\t/* */\r\n\t/*\tANIMATE LINE SPECIALS */\r\n\t/* */\r\n\tfor (i = 0; i < numlinespecials; i++)\r\n\t{\r\n\t\tline = linespeciallist[i];\r\n\t\tswitch(line->special)\r\n\t\t{\r\n\t\t\tcase 200:\t/* EFFECT SCROLL LEFT*/\r\n\t\t\t\tsides[line->sidenum[0]].textureoffset += FRACUNIT;\r\n\t\t\t\tsides[line->sidenum[0]].textureoffset &= SCROLLLIMIT;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 201:\t/* EFFECT SCROLL RIGHT*/\r\n\t\t\t\tsides[line->sidenum[0]].textureoffset -= FRACUNIT;\r\n\t\t\t\tsides[line->sidenum[0]].textureoffset &= SCROLLLIMIT;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 202:\t/* EFFECT SCROLL UP*/\r\n\t\t\t\tsides[line->sidenum[0]].rowoffset += FRACUNIT;\r\n\t\t\t\tsides[line->sidenum[0]].rowoffset &= SCROLLLIMIT;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 203:\t/* EFFECT SCROLL DOWN*/\r\n\t\t\t\tsides[line->sidenum[0]].rowoffset -= FRACUNIT;\r\n\t\t\t\tsides[line->sidenum[0]].rowoffset &= SCROLLLIMIT;\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\t/* */\r\n\t/*\tDO BUTTONS */\r\n\t/* */\r\n\tfor (i = 0; i < MAXBUTTONS; i++)\r\n\t{\r\n\t\tif (buttonlist[i].btimer > 0)\r\n\t\t{\r\n\t\t\tbuttonlist[i].btimer -= vblsinframe[consoleplayer];\r\n\r\n\t\t\tif (buttonlist[i].btimer <= 0)\r\n\t\t\t{\r\n\t\t\t\tswitch (buttonlist[i].where)\r\n\t\t\t\t{\r\n\t\t\t\tcase top:\r\n\t\t\t\t\tsides[buttonlist[i].line->sidenum[0]].toptexture = buttonlist[i].btexture;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase middle:\r\n\t\t\t\t\tsides[buttonlist[i].line->sidenum[0]].midtexture = buttonlist[i].btexture;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase bottom:\r\n\t\t\t\t\tsides[buttonlist[i].line->sidenum[0]].bottomtexture = buttonlist[i].btexture;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tS_StartSound((mobj_t *)buttonlist[i].soundorg, sfx_swtchn);\r\n\t\t\t\tD_memset(&buttonlist[i], 0, sizeof(button_t));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//Update spread fire\r\n\tif (rendersky && spreadfire)\r\n        spreadfire(skytexturep);\r\n}\r\n\r\n/*============================================================ */\r\n/* */\r\n/*\tSpecial Stuff that can't be categorized */\r\n/* */\r\n/*============================================================ */\r\nint EV_DoDonut(line_t *line)//L800273F4()\r\n{\r\n\tsector_t\t*s1;\r\n\tsector_t\t*s2;\r\n\tsector_t\t*s3;\r\n\tint\t\t\tsecnum;\r\n\tint\t\t\trtn;\r\n\tint\t\t\ti;\r\n\tfloormove_t\t\t*floor;\r\n\r\n\tsecnum = -1;\r\n\trtn = 0;\r\n\twhile ((secnum = P_FindSectorFromLineTag(line,secnum)) >= 0)\r\n\t{\r\n\t\ts1 = &sectors[secnum];\r\n\r\n\t\t/*\tALREADY MOVING?  IF SO, KEEP GOING... */\r\n\t\tif (s1->specialdata)\r\n\t\t\tcontinue;\r\n\r\n\t\trtn = 1;\r\n\t\ts2 = getNextSector(s1->lines[0],s1);\r\n\t\tfor (i = 0;i < s2->linecount;i++)\r\n\t\t{\r\n\t\t\tif (//(!s2->lines[i]->flags & ML_TWOSIDED) ||\r\n\t\t\t\t(s2->lines[i]->backsector == s1))\r\n\t\t\t\tcontinue;\r\n\t\t\ts3 = s2->lines[i]->backsector;\r\n\r\n\t\t\t/* */\r\n\t\t\t/*\tSpawn rising slime */\r\n\t\t\t/* */\r\n\t\t\tfloor = Z_Malloc (sizeof(*floor), PU_LEVSPEC, 0);\r\n\t\t\tP_AddThinker (&floor->thinker);\r\n\t\t\ts2->specialdata = floor;\r\n\t\t\tfloor->thinker.function = T_MoveFloor;\r\n\t\t\tfloor->type = donutRaise;\r\n\t\t\tfloor->crush = false;\r\n\t\t\tfloor->direction = 1;\r\n\t\t\tfloor->sector = s2;\r\n\t\t\tfloor->speed = FLOORSPEED / 2;\r\n\t\t\tfloor->texture = s3->floorpic;\r\n\t\t\tfloor->newspecial = 0;\r\n\t\t\tfloor->floordestheight = s3->floorheight;\r\n\r\n\t\t\t/* */\r\n\t\t\t/*\tSpawn lowering donut-hole */\r\n\t\t\t/* */\r\n\t\t\tfloor = Z_Malloc (sizeof(*floor), PU_LEVSPEC, 0);\r\n\t\t\tP_AddThinker (&floor->thinker);\r\n\t\t\ts1->specialdata = floor;\r\n\t\t\tfloor->thinker.function = T_MoveFloor;\r\n\t\t\tfloor->type = lowerFloor;\r\n\t\t\tfloor->crush = false;\r\n\t\t\tfloor->direction = -1;\r\n\t\t\tfloor->sector = s1;\r\n\t\t\tfloor->speed = FLOORSPEED / 2;\r\n\t\t\tfloor->floordestheight = s3->floorheight;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\treturn rtn;\r\n}\r\n\r\n/*\r\n==============================================================================\r\n\r\n\t\t\t\t\t\t\t   EXIT DELAY\r\n\r\n==============================================================================\r\n*/\r\n\r\n/*\r\n================================================================================\r\n= P_SpawnDelayTimer\r\n=\r\n= Exclusive Psx Doom\r\n=\r\n===============================================================================\r\n*/\r\n\r\nvoid P_SpawnDelayTimer(int tics, void(*action)())//L80027640()\r\n{\r\n\tdelay_t *timer;\r\n\r\n\ttimer = Z_Malloc(sizeof(*timer), PU_LEVSPEC, 0);\r\n\tP_AddThinker(&timer->thinker);\r\n\ttimer->thinker.function = T_CountdownTimer;\r\n\ttimer->tics = tics;\r\n\ttimer->finishfunc = action;\r\n}\r\n\r\n/*\r\n================================================================================\r\n= T_CountdownTimer\r\n=\r\n= Exclusive Psx Doom\r\n=\r\n===============================================================================\r\n*/\r\n\r\nvoid T_CountdownTimer(delay_t *timer)//L800276B0()\r\n{\r\n\tif ((timer->tics--) <= 0)\r\n\t{\r\n\t\ttimer->finishfunc();\r\n\t\tP_RemoveThinker(&timer->thinker);\r\n\t\treturn;\r\n\t}\r\n}\r\n\r\n/*\r\n================================================================================\r\n= P_ExitLevel\r\n=\r\n= Exclusive Psx Doom\r\n=\r\n===============================================================================\r\n*/\r\n\r\nvoid P_ExitLevel(void)//L80027700()\r\n{\r\n\tnextmap = gamemap + 1;\r\n\tP_SpawnDelayTimer(4, G_CompleteLevel);\r\n}\r\n\r\n/*\r\n================================================================================\r\n= P_SecretExitLevel\r\n=\r\n= Exclusive Psx Doom\r\n=\r\n===============================================================================\r\n*/\r\n\r\nvoid P_SecretExitLevel(int map)//L80027778()\r\n{\r\n\tnextmap = map;\r\n\tP_SpawnDelayTimer(4, G_CompleteLevel);\r\n}\r\n\r\n/*\r\n==============================================================================\r\n\r\n\t\t\t\t\t\t\tSPECIAL SPAWNING\r\n\r\n==============================================================================\r\n*/\r\n/*\r\n================================================================================\r\n= P_SpawnSpecials\r\n=\r\n= After the map has been loaded, scan for specials that\r\n= spawn thinkers\r\n=\r\n===============================================================================\r\n*/\r\n\r\n#if GH_UPDATES ==  1\r\ncard_t   MapBlueKeyType;     //0x80077E9C\r\ncard_t   MapRedKeyType;      //0x8007821C\r\ncard_t   MapYellowKeyType;   //0x800780A0\r\n#endif // GH_UPDATES\r\nint      enemyspecial;   //80077DB4\r\n\r\nvoid P_SpawnSpecials (void)//L800277E4()\r\n{\r\n\tsector_t\t*sector;\r\n\tint\t\ti;\r\n\r\n\t#if GH_UPDATES ==  1\r\n\tmobj_t      *mo;\r\n\t#endif // GH_UPDATES\r\n\r\n\t/* */\r\n\t/*\tInit special SECTORs */\r\n\t/* */\r\n\tsector = sectors;\r\n\tfor (i = 0; i < numsectors; i++, sector++)\r\n\t{\r\n\t\tif (!sector->special)\r\n\t\t\tcontinue;\r\n\r\n\t\tswitch (sector->special)\r\n\t\t{\r\n\t\tcase 1:\t\t/* FLICKERING LIGHTS */\r\n\t\t\tP_SpawnLightFlash(sector);\r\n\t\t\tbreak;\r\n\t\tcase 2:\t\t/* STROBE FAST */\r\n\t\t\tP_SpawnStrobeFlash(sector, FASTDARK, 0);\r\n\t\t\tbreak;\r\n\t\tcase 3:\t\t/* STROBE SLOW */\r\n\t\t\tP_SpawnStrobeFlash(sector, SLOWDARK, 0);\r\n\t\t\tbreak;\r\n\t\tcase 8:\t\t/* GLOWING LIGHT */\r\n\t\t\tP_SpawnGlowingLight(sector, glowtolower);\r\n\t\t\tbreak;\r\n\t\tcase 9:\t\t/* SECRET SECTOR */\r\n\t\t\ttotalsecret++;\r\n\t\t\tbreak;\r\n\t\tcase 10:\t/* DOOR CLOSE IN 30 SECONDS */\r\n\t\t\tP_SpawnDoorCloseIn30(sector);\r\n\t\t\tbreak;\r\n\t\tcase 12:\t/* SYNC STROBE SLOW */\r\n\t\t\tP_SpawnStrobeFlash(sector, SLOWDARK, 1);\r\n\t\t\tbreak;\r\n\t\tcase 13:\t/* SYNC STROBE FAST */\r\n\t\t\tP_SpawnStrobeFlash(sector, FASTDARK, 1);\r\n\t\t\tbreak;\r\n\t\tcase 14:\t/* DOOR RAISE IN 5 MINUTES */\r\n\t\t\tP_SpawnDoorRaiseIn5Mins(sector, i);\r\n\t\t\tbreak;\r\n\t\tcase 17:    /* FIRE FLICKER */\r\n\t\t\tP_SpawnFireFlicker(sector);\r\n\t\t\tbreak;\r\n\t\tcase 200:   /* GLOW TO DARK */\r\n\t\t\tP_SpawnGlowingLight(sector, glowto10);\r\n\t\t\tbreak;\r\n\t\tcase 201:   /* GLOW TO BRIGHT */\r\n\t\t\tP_SpawnGlowingLight(sector, glowto255);\r\n\t\t\tbreak;\r\n\t\tcase 202:   /* RAPID STROBE FLASH (PSX ADDITION) */\r\n\t\t\tP_SpawnStrobeFlashFast(sector);\r\n\t\t\tbreak;\r\n\t\tcase 204:   /* STROBE FLASH */\r\n\t\t\tP_SpawnStrobeFlash(sector, TURBODARK, 0);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\t/* */\r\n\t/*\tInit line EFFECTs */\r\n\t/* */\r\n\tnumlinespecials = 0;\r\n\tfor (i = 0;i < numlines; i++)\r\n    {\r\n\t\tswitch(lines[i].special)\r\n\t\t{\r\n\t\t\t//case 48:\t/* EFFECT FIRSTCOL SCROLL+ */\r\n\t\t\tcase 200:   /* EFFECT: SCROLL LEFT */\r\n\t\t\tcase 201:   /* EFFECT: SCROLL RIGHT */\r\n\t\t\tcase 202:   /* EFFECT: SCROLL UP */\r\n\t\t\tcase 203:   /* EFFECT: SCROLL DOWN */\r\n\t\t\t    if(numlinespecials < MAXLINEANIMS)\r\n                {\r\n                    linespeciallist[numlinespecials] = &lines[i];\r\n                    numlinespecials++;\r\n                }\r\n\t\t\t\tbreak;\r\n\t\t}\r\n    }\r\n\r\n\t/* */\r\n\t/* Init Enemy Special Death Flags */\r\n\t/* Exclusive Psx Doom */\r\n\t/* */\r\n\tenemyspecial = 0;\r\n\tsector = sectors;\r\n\tfor (i = 0; i < numsectors; i++, sector++)\r\n\t{\r\n\t\tswitch (sector->tag)\r\n\t\t{\r\n\t\tcase 666:\r\n\t\t\tenemyspecial |= 1;\t// \"Mancubus\"\r\n\t\t\tbreak;\r\n\t\tcase 667:\r\n\t\t\tenemyspecial |= 2;\t// \"Arachnotron\",\r\n\t\t\tbreak;\r\n\t\tcase 668:\r\n\t\t\tenemyspecial |= 4;\t// \"SpiderMastermind\",\r\n\t\t\tbreak;\r\n\t\tcase 669:\r\n\t\t\tenemyspecial |= 8;\t// \"Hell Knight\",\r\n\t\t\tbreak;\r\n\t\tcase 670:\r\n\t\t\tenemyspecial |= 16;\t// \"Cyberdemon\",\r\n\t\t\tbreak;\r\n\t\tcase 671:\r\n\t\t\tenemyspecial |= 32;\t// \"Baron of Hell\",\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\t#if GH_UPDATES ==  1\r\n\t/* */\r\n\t/* Info From PsyDoom */\r\n\t/* Run through all map objects to see if any skull keys are being used instead of keycards. */\r\n    /* This is required for the correct sprite to be used for HUD key flashes (skull vs card). */\r\n    /* */\r\n    MapRedKeyType = it_redcard;\r\n    MapBlueKeyType = it_bluecard;\r\n    MapYellowKeyType = it_yellowcard;\r\n\r\n    for (mo = mobjhead.next ; mo != &mobjhead ; mo = mo->next)\r\n    {\r\n        switch (mo->type)\r\n        {\r\n            case MT_MISC7:  MapYellowKeyType  = it_yellowskull;   break;\r\n            case MT_MISC8:  MapRedKeyType     = it_redskull;      break;\r\n            case MT_MISC9:  MapBlueKeyType    = it_blueskull;     break;\r\n        }\r\n    }\r\n    #endif // GH_UPDATES\r\n\r\n\t/* */\r\n\t/*\tInit other misc stuff */\r\n\t/* */\r\n\tD_memset(activeceilings, 0, MAXCEILINGS * sizeof(ceiling_t*));\r\n\tD_memset(activeplats, 0, MAXPLATS * sizeof(plat_t*));\r\n\tD_memset(buttonlist, 0, MAXBUTTONS * sizeof(button_t));\r\n}\r\n\r\n\r\n/*\r\n================================================================================\r\n= P_FireSky\r\n=\r\n= Exclusive Psx Doom Fire Sequence\r\n=\r\n===============================================================================\r\n*/\r\n\r\nint frndindex = 0;//*(r28 + 1368) 80077968\r\n\r\nvoid P_FireSky(psxobj_t *psxobj)//L80027B90()\r\n{\r\n    byte *src, *srcoffset;\r\n\tbyte randIdx1, randIdx2;\r\n\tint width, height;\r\n\tint pixel, counter;\r\n\r\n\tsrc = (byte *)(lumpcache[psxobj->lump].cache) + (FIRESKY_WIDTH + 8);//8 = skip header texture data\r\n\r\n\twidth = 0;\r\n\tdo // width\r\n\t{\r\n\t\theight = 1;\r\n\t\tcounter = width + 1;\r\n\r\n\t\tsrcoffset = src + width;\r\n\t\tdo // height\r\n\t\t{\r\n\t\t\tpixel = *(byte*)srcoffset;\r\n\t\t\tif (pixel != 0)\r\n\t\t\t{\r\n\t\t\t\trandIdx1 = rndtable[(frndindex & 0xff)];\r\n\t\t\t\trandIdx2 = rndtable[(frndindex + 1) & 0xff];\r\n\t\t\t\tfrndindex = ((frndindex + 2) & 0xff);\r\n\r\n\t\t\t\t*(byte*)((counter - (randIdx1 & 3) & (FIRESKY_WIDTH - 1)) + src - FIRESKY_WIDTH) = pixel - ((randIdx2 & 1));\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\t*(byte*)(srcoffset - FIRESKY_WIDTH) = 0;\r\n\t\t\t}\r\n\r\n\t\t\tsrcoffset += FIRESKY_WIDTH;\r\n\t\t\tsrc += FIRESKY_WIDTH;\r\n\t\t\theight++;\r\n\t\t} while (height < FIRESKY_HEIGHT);\r\n\r\n\t\tsrc -= ((FIRESKY_WIDTH*FIRESKY_HEIGHT) - FIRESKY_WIDTH);\r\n\t\twidth++;\r\n\t} while (width < FIRESKY_WIDTH);\r\n\r\n\tpsxobj->index = -1;\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/p_spec.h",
    "content": "/* P_spec.h */\r\n\r\n#include \"r_local.h\"\n\n/*\n===============================================================================\n\n\t\t\t\t\t\t\tP_SPEC\n\n===============================================================================\n*/\n\n/* */\n/*\tAnimating textures and planes */\n/* */\ntypedef struct\n{\n\tboolean\tistexture;\t//*\n\tint\t\tpicnum;\t\t//*4\n\tint\t\tbasepic;\t//*8\n\tint\t\tnumpics;\t//*12\n\tint\t\tcurrent;\t//*16\n\tint\t\ttics;\t\t//*20\n} anim_t;\n\n/* */\n/*\tsource animation definition */\n/* */\ntypedef struct\n{\n\tboolean\tistexture;\t\t/* if false, it's a flat */\n\tchar\tstartname[9];\t//*4 endname\n\tchar\tendname[9];\t\t//*13 startname\n\tint\t\tspeed;\t\t\t//*24\n} animdef_t;\n\n#define\tMAXANIMS\t\t16  //[psx] change to 16\n\nextern\tanim_t\tanims[MAXANIMS], *lastanim;\r\n\r\n#if GH_UPDATES ==  1\r\nextern card_t   MapBlueKeyType;\r\nextern card_t   MapRedKeyType;\r\nextern card_t   MapYellowKeyType;\r\n#endif // GH_UPDATES\r\nextern int enemyspecial;   //80077DB4\r\n\n/* */\n/*\tAnimating line specials */\n/* */\n#define\tMAXLINEANIMS\t\t32  //[psx] change to 32\nextern\tint\t\tnumlinespecials;\nextern\tline_t\t*linespeciallist[MAXLINEANIMS];\n\n\n/*\tDefine values for map objects */\n#define\tMO_TELEPORTMAN\t\t14\n\n\n/* at game start */\nvoid\tP_InitPicAnims (void);\n\n/* psx doom exit delay */\ntypedef struct\r\n{\r\n\tthinker_t  thinker;\r\n\tint tics;\r\n\tvoid(*finishfunc)(void);\r\n}delay_t;\n\nvoid P_SpawnDelayTimer(int tics, void(*action)());\nvoid T_CountdownTimer(delay_t *timer);\nvoid P_ExitLevel(void);\nvoid P_SecretExitLevel(int map);\n\n/* at map load */\nvoid\tP_SpawnSpecials (void);\n\n/* psx doom fire sky */\r\ntypedef void(*firesky_t)(psxobj_t *psxobj);\r\nextern firesky_t spreadfire;   //80077964, pcGp00000554\r\n\n#define FIRESKY_WIDTH\t64\r\n#define FIRESKY_HEIGHT\t128\r\nextern int frndindex;\nvoid P_FireSky(psxobj_t *psxobj);\r\n\n\n/* every tic */\nvoid \tP_UpdateSpecials (void);\n\n/* when needed */\nboolean\tP_UseSpecialLine ( mobj_t *thing, line_t *line);\nvoid\tP_ShootSpecialLine ( mobj_t *thing, line_t *line);\nvoid P_CrossSpecialLine (line_t *line,mobj_t *thing);\n\nvoid \tP_PlayerInSpecialSector (player_t *player);\n\nint\t\ttwoSided(int sector,int line);\nsector_t *getSector(int currentSector,int line,int side);\nside_t\t*getSide(int currentSector,int line, int side);\nfixed_t\tP_FindLowestFloorSurrounding(sector_t *sec);\nfixed_t\tP_FindHighestFloorSurrounding(sector_t *sec);\nfixed_t\tP_FindNextHighestFloor(sector_t *sec,int currentheight);\nfixed_t\tP_FindLowestCeilingSurrounding(sector_t *sec);\nfixed_t\tP_FindHighestCeilingSurrounding(sector_t *sec);\nint\t\tP_FindSectorFromLineTag(line_t\t*line,int start);\nint\t\tP_FindMinSurroundingLight(sector_t *sector,int max);\nsector_t *getNextSector(line_t *line,sector_t *sec);\n\n/* */\n/*\tSPECIAL */\n/* */\nint EV_DoDonut(line_t *line);\n\n/*\n===============================================================================\n\n\t\t\t\t\t\t\tP_LIGHTS\n\n===============================================================================\n*/\n\n// Psx Doom New From PC Doom\ntypedef struct\r\n{\r\n\tthinker_t\tthinker;\t//8\r\n\tsector_t    *sector;\t\t//12\r\n\tint\t\t    count;\t\t\t//16\r\n\tint\t\t    maxlight;\t\t//20\r\n\tint\t\t    minlight;\t\t//24\r\n} fireflicker_t;\n\ntypedef struct\n{\n\tthinker_t\tthinker;\n\tsector_t\t*sector;\n\tint\t\t\tcount;\n\tint\t\t\tmaxlight;\n\tint\t\t\tminlight;\n\tint\t\t\tmaxtime;\n\tint\t\t\tmintime;\n} lightflash_t;\n\ntypedef struct\n{\n\tthinker_t\tthinker;\n\tsector_t\t*sector;\n\tint\t\t\tcount;\n\tint\t\t\tminlight;\n\tint\t\t\tmaxlight;\n\tint\t\t\tdarktime;\n\tint\t\t\tbrighttime;\n} strobe_t;\n\n\ntypedef enum\n{\n\tglowtolower,\n\tglowto10,\n\tglowto255\n} glowtype_e;//Psx Doom\n\ntypedef struct\n{\n\tthinker_t\tthinker;\n\tsector_t\t*sector;\n\tint\t\t\tminlight;\n\tint\t\t\tmaxlight;\n\tint\t\t\tdirection;\n} glow_t;\n\n#define GLOWSPEED\t\t3\t//old 16\n#define\tSTROBEBRIGHT\t3\r\n#define\tTURBODARK\t\t4\n#define\tFASTDARK\t\t8\n#define\tSLOWDARK\t\t15\n\nvoid\tT_FireFlicker(fireflicker_t *flick);// PSX DOOM\r\nvoid\tP_SpawnFireFlicker(sector_t *sector);// PSX DOOM\nvoid\tT_LightFlash (lightflash_t *flash);\nvoid\tP_SpawnLightFlash (sector_t *sector);\nvoid\tT_StrobeFlash (strobe_t *flash);\nvoid \tP_SpawnStrobeFlash (sector_t *sector, int fastOrSlow, int inSync);\nvoid\tP_SpawnStrobeFlashFast(sector_t *sector);// PSX DOOM\nvoid\tEV_StartLightStrobing(line_t *line);\nvoid\tEV_TurnTagLightsOff(line_t\t*line);\nvoid\tEV_LightTurnOn(line_t *line, int bright);\nvoid\tT_Glow(glow_t *g);\nvoid\tP_SpawnGlowingLight(sector_t *sector, glowtype_e type);\n\n/*\n===============================================================================\n\n\t\t\t\t\t\t\tP_SWITCH\n\n===============================================================================\n*/\ntypedef struct\n{\n\tchar\tname1[9];\n\tchar\tname2[9];\n} switchlist_t;\n\ntypedef enum\n{\n\ttop,\n\tmiddle,\n\tbottom\n} bwhere_e;\n\ntypedef struct\n{\n\tline_t\t\t*line;\n\tbwhere_e\twhere;\n\tint\t\t\tbtexture;\n\tint\t\t\tbtimer;\n\tmobj_t\t\t*soundorg;\n} button_t;\n\n#define\tMAXSWITCHES\t50\t\t/* max # of wall switches in a level */\n#define\tMAXBUTTONS\t16\t\t/* 4 players, 4 buttons each at once, max. */\n#define BUTTONTIME\t15\t\t/* 1 second */\n\nextern\tbutton_t\tbuttonlist[MAXBUTTONS];\r\nextern\tint\t\t\tswitchlist[MAXSWITCHES * 2];\n\nvoid\tP_ChangeSwitchTexture(line_t *line,int useAgain);\nvoid \tP_InitSwitchList(void);\n\n/*\n===============================================================================\n\n\t\t\t\t\t\t\tP_PLATS\n\n===============================================================================\n*/\ntypedef enum\n{\n\tup,\n\tdown,\n\twaiting,\n\tin_stasis\n} plat_e;\n\ntypedef enum\n{\n\tperpetualRaise,\n\tdownWaitUpStay,\n\traiseAndChange,\n\traiseToNearestAndChange,\n\tblazeDWUS\n} plattype_e;\n\ntypedef struct\n{\n\tthinker_t\tthinker;\n\tsector_t\t*sector;\n\tfixed_t\t\tspeed;\n\tfixed_t\t\tlow;\n\tfixed_t\t\thigh;\n\tint\t\t\twait;\n\tint\t\t\tcount;\n\tplat_e\t\tstatus;\n\tplat_e\t\toldstatus;\n\tboolean\t\tcrush;\n\tint\t\t\ttag;\n\tplattype_e\ttype;\n} plat_t;\n\n#define\tPLATWAIT\t3\t\t\t/* seconds */\n#define\tPLATSPEED\t(FRACUNIT*2)\n#define\tMAXPLATS\t30\n\nextern\tplat_t\t*activeplats[MAXPLATS];\n\nvoid\tT_PlatRaise(plat_t\t*plat);\nint\t\tEV_DoPlat(line_t *line,plattype_e type,int amount);\nvoid\tP_AddActivePlat(plat_t *plat);\nvoid\tP_RemoveActivePlat(plat_t *plat);\nvoid\tEV_StopPlat(line_t *line);\nvoid\tP_ActivateInStasis(int tag);\n\n/*\n===============================================================================\n\n\t\t\t\t\t\t\tP_DOORS\n\n===============================================================================\n*/\ntypedef enum\n{\n\tNormal,\n\tClose30ThenOpen,\n\tClose,\n\tOpen,\n\tRaiseIn5Mins,\n\tBlazeRaise,\r\n\tBlazeOpen,\r\n\tBlazeClose\n} vldoor_e;\n\ntypedef struct\n{\n\tthinker_t\tthinker;\n\tvldoor_e\ttype;\n\tsector_t\t*sector;\n\tfixed_t\t\ttopheight;\n\tfixed_t\t\tspeed;\n\tint\t\t\tdirection;\t\t/* 1 = up, 0 = waiting at top, -1 = down */\n\tint\t\t\ttopwait;\t\t/* tics to wait at the top */\n\t\t\t\t\t\t\t\t/* (keep in case a door going down is reset) */\n\tint\t\t\ttopcountdown;\t/* when it reaches 0, start going down */\n} vldoor_t;\n\n#define\tVDOORSPEED\tFRACUNIT*6\n#define\tVDOORWAIT\t\t70\n\nvoid\tEV_VerticalDoor (line_t *line, mobj_t *thing);\nboolean P_CheckKeyLock(line_t *line, mobj_t *thing);  // Psx Doom New\nint\t\tEV_DoDoor (line_t *line, vldoor_e  type);\nvoid\tT_VerticalDoor (vldoor_t *door);\nvoid\tP_SpawnDoorCloseIn30 (sector_t *sec);\nvoid\tP_SpawnDoorRaiseIn5Mins (sector_t *sec, int secnum);\n\n/*\n===============================================================================\n\n\t\t\t\t\t\t\tP_CEILNG\n\n===============================================================================\n*/\ntypedef enum\n{\n\tlowerToFloor,\r\n\traiseToHighest,\r\n\tlowerAndCrush,\r\n\tcrushAndRaise,\r\n\tfastCrushAndRaise,\r\n\tsilentCrushAndRaise,\n} ceiling_e;\r\n\ntypedef struct\n{\n\tthinker_t\tthinker;\n\tceiling_e\ttype;\n\tsector_t\t*sector;\n\tfixed_t\t\tbottomheight, topheight;\n\tfixed_t\t\tspeed;\n\tboolean\t\tcrush;\n\tint\t\t\tdirection;\t\t/* 1 = up, 0 = waiting, -1 = down */\n\tint\t\t\ttag;\t\t\t/* ID */\n\tint\t\t\tolddirection;\n} ceiling_t;\n\n#define\tCEILSPEED\t\tFRACUNIT*2\n#define MAXCEILINGS\t\t30\n\nextern\tceiling_t\t*activeceilings[MAXCEILINGS];\n\nint\t\tEV_DoCeiling (line_t *line, ceiling_e  type);\nvoid\tT_MoveCeiling (ceiling_t *ceiling);\nvoid\tP_AddActiveCeiling(ceiling_t *c);\nvoid\tP_RemoveActiveCeiling(ceiling_t *c);\nint\t\tEV_CeilingCrushStop(line_t\t*line);\nvoid\tP_ActivateInStasisCeiling(line_t *line);\n\n/*\n===============================================================================\n\n\t\t\t\t\t\t\tP_FLOOR\n\n===============================================================================\n*/\ntypedef enum\n{\n\tlowerFloor,\t\t\t/* lower floor to highest surrounding floor */\n\tlowerFloorToLowest,\t/* lower floor to lowest surrounding floor */\n\tturboLower,\t\t\t/* lower floor to highest surrounding floor VERY FAST */\n\traiseFloor,\t\t\t/* raise floor to lowest surrounding CEILING */\n\traiseFloorToNearest,\t/* raise floor to next highest surrounding floor */\n\traiseToTexture,\t\t/* raise floor to shortest height texture around it */\n\tlowerAndChange,\t\t/* lower floor to lowest surrounding floor and change */\n\t\t\t\t\t\t/* floorpic */\n\traiseFloor24,\n\traiseFloor24AndChange,\n\traiseFloorCrush,\n\tdonutRaise\n} floor_e;\n\ntypedef enum\r\n{\r\n\tbuild8,\t// slowly build by 8\r\n\tturbo16\t// quickly build by 16\r\n} stair_e;\n\ntypedef struct\n{\n\tthinker_t\tthinker;\n\tfloor_e\t\ttype;\n\tboolean\t\tcrush;\n\tsector_t\t*sector;\n\tint\t\t\tdirection;\n\tint\t\t\tnewspecial;\n\tshort\t\ttexture;\n\tfixed_t\t\tfloordestheight;\n\tfixed_t\t\tspeed;\n} floormove_t;\n\n#define\tFLOORSPEED\tFRACUNIT*3\n\ntypedef enum\n{\n\tok,\n\tcrushed,\n\tpastdest\n} result_e;\n\nresult_e\tT_MovePlane(sector_t *sector,fixed_t speed,\n\t\t\tfixed_t dest,boolean crush,int floorOrCeiling,int direction);\n\nint\t\tEV_BuildStairs(line_t *line, stair_e type);\nint\t\tEV_DoFloor(line_t *line,floor_e floortype);\nvoid\tT_MoveFloor(floormove_t *floor);\n\n/*\n===============================================================================\n\n\t\t\t\t\t\t\tP_TELEPT\n\n===============================================================================\n*/\nint\t\tEV_Teleport( line_t *line,mobj_t *thing );\n\n"
  },
  {
    "path": "PSXDOOM/p_switch.c",
    "content": "#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tCHANGE THE TEXTURE OF A WALL SWITCH TO ITS OPPOSITE */\r\n/* */\r\n/*================================================================== */\r\n\r\n#define     numswitches 49\r\nswitchlist_t alphSwitchList[numswitches] = //80067234\r\n{\r\n\t{ \"SW1BMET\",\t\"SW2BMET\" },\r\n\t{ \"SW1BRICK\",\t\"SW2BRICK\" },\r\n\t{ \"SW1BRNZ\",\t\"SW2BRNZ\" },\r\n\t{ \"SW1BROWN\",\t\"SW2BROWN\" },\r\n\t{ \"SW1MARB\",\t\"SW2MARB\" },\r\n\t{ \"SW1MET\",\t\t\"SW2MET\" },\r\n\t{ \"SW1METAL\",\t\"SW2METAL\" },\r\n\t{ \"SW1NEW02\",\t\"SW2NEW02\" },\r\n\t{ \"SW1NEW03\",\t\"SW2NEW03\" },\r\n\t{ \"SW1NEW04\",\t\"SW2NEW04\" },\r\n\t{ \"SW1NEW05\",\t\"SW2NEW05\" },\r\n\t{ \"SW1NEW06\",\t\"SW2NEW06\" },\r\n\t{ \"SW1NEW10\",\t\"SW2NEW10\" },\r\n\t{ \"SW1NEW11\",\t\"SW2NEW11\" },\r\n\t{ \"SW1NEW13\",\t\"SW2NEW13\" },\r\n\t{ \"SW1NEW14\",\t\"SW2NEW14\" },\r\n\t{ \"SW1NEW20\",\t\"SW2NEW20\" },\r\n\t{ \"SW1NEW25\",\t\"SW2NEW25\" },\r\n\t{ \"SW1NEW26\",\t\"SW2NEW26\" },\r\n\t{ \"SW1NEW28\",\t\"SW2NEW28\" },\r\n\t{ \"SW1NEW29\",\t\"SW2NEW29\" },\r\n\t{ \"SW1NEW30\",\t\"SW2NEW30\" },\r\n\t{ \"SW1NEW31\",\t\"SW2NEW31\" },\r\n\t{ \"SW1NEW32\",\t\"SW2NEW32\" },\r\n\t{ \"SW1NEW33\",\t\"SW2NEW33\" },\r\n\t{ \"SW1NEW34\",\t\"SW2NEW34\" },\r\n\t{ \"SW1NEW35\",\t\"SW2NEW35\" },\r\n\t{ \"SW1NEW36\",\t\"SW2NEW36\" },\r\n\t{ \"SW1NEW39\",\t\"SW2NEW39\" },\r\n\t{ \"SW1NEW40\",\t\"SW2NEW40\" },\r\n\t{ \"SW1NEW41\",\t\"SW2NEW41\" },\r\n\t{ \"SW1NEW42\",\t\"SW2NEW42\" },\r\n\t{ \"SW1NEW45\",\t\"SW2NEW45\" },\r\n\t{ \"SW1NEW46\",\t\"SW2NEW46\" },\r\n\t{ \"SW1NEW47\",\t\"SW2NEW47\" },\r\n\t{ \"SW1NEW51\",\t\"SW2NEW51\" },\r\n\t{ \"SW1NEW57\",\t\"SW2NEW57\" },\r\n\t{ \"SW1NEW60\",\t\"SW2NEW60\" },\r\n\t{ \"SW1NEW63\",\t\"SW2NEW63\" },\r\n\t{ \"SW1NEW65\",\t\"SW2NEW65\" },\r\n\t{ \"SW1NEW66\",\t\"SW2NEW66\" },\r\n\t{ \"SW1NEW68\",\t\"SW2NEW68\" },\r\n\t{ \"SW1NEW69\",\t\"SW2NEW69\" },\r\n\t{ \"SW1NEW70\",\t\"SW2NEW70\" },\r\n\t{ \"SW1RED\",\t\t\"SW2RED\" },\r\n\t{ \"SW1RUST\",\t\"SW2RUST\" },\r\n\t{ \"SW1SKULL\",\t\"SW2SKULL\" },\r\n\t{ \"SW1STAR\",\t\"SW2STAR\" },\r\n\t{ \"SW1STEEL\",\t\"SW2STEEL\" },\r\n};\r\n\r\n//int\t\t\tswitchlist[MAXSWITCHES * 2];//80097424\r\n//int\t\t\tnumswitches;\r\n//button_t\t    buttonlist[MAXBUTTONS];//800975B0\r\n\r\n\r\n/*\r\n===============\r\n=\r\n= P_InitSwitchList\r\n=\r\n= Only called at game initialization\r\n=\r\n===============\r\n*/\r\n\r\nvoid P_InitSwitchList(void)//L80027C64()\r\n{\r\n\tint\t\ti;\r\n\tint\t\tindex;\r\n\tint\t\ttex1, tex2;\r\n\r\n\t//numswitches = sizeof(alphSwitchList)/sizeof(alphSwitchList[0]);\r\n\r\n\tfor (index = 0,i = 0;i < numswitches;i++)\r\n\t{\r\n\t\t//if (!alphSwitchList[i].name1[0])\r\n\t\t\t//break;\r\n\r\n\t\ttex1 = R_TextureNumForName(alphSwitchList[i].name1);\r\n\t\ttex2 = R_TextureNumForName(alphSwitchList[i].name2);\r\n\r\n\t\tif (textures[tex1].vtpage != 0 && textures[tex2].vtpage == 0)\r\n\t\t\tTextureCache(&textures[tex2]);\r\n\r\n\t\tif (textures[tex2].vtpage != 0 && textures[tex1].vtpage == 0)\r\n\t\t\tTextureCache(&textures[tex1]);\r\n\r\n\t\tswitchlist[index] = tex1;\r\n\t\tindex++;\r\n\t\tswitchlist[index] = tex2;\r\n\t\tindex++;\r\n\t}\r\n\r\n\t//switchlist[index] = -1;\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tStart a button counting down till it turns off. */\r\n/* */\r\n/*================================================================== */\r\nvoid P_StartButton(line_t *line,bwhere_e w,int texture,int time)//80027D88\r\n{\r\n\tint\t\ti;\r\n\r\n\tfor (i = 0;i < MAXBUTTONS;i++)\r\n    {\r\n\t\tif (buttonlist[i].btimer == 0)\r\n\t\t{\r\n\t\t\tbuttonlist[i].line = line;\r\n\t\t\tbuttonlist[i].where = w;\r\n\t\t\tbuttonlist[i].btexture = texture;\r\n\t\t\tbuttonlist[i].btimer = time;\r\n\t\t\tbuttonlist[i].soundorg = (mobj_t *)&line->frontsector->soundorg;\r\n\t\t\treturn;\r\n\t\t}\r\n    }\r\n\r\n\t//I_Error(\"P_StartButton: no button slots left!\");\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/*\tFunction that changes wall texture. */\r\n/*\tTell it if switch is ok to use again (1=yes, it's a button). */\r\n/* */\r\n/*================================================================== */\r\nvoid P_ChangeSwitchTexture(line_t *line,int useAgain)//L80027E1C()\r\n{\r\n\tint\ttexTop;\r\n\tint\ttexMid;\r\n\tint\ttexBot;\r\n\tint\ti;\r\n\tint\tsound;\r\n\r\n\tif (!useAgain)\r\n\t\tline->special = 0;\r\n\r\n\ttexTop = sides[line->sidenum[0]].toptexture;\r\n\ttexMid = sides[line->sidenum[0]].midtexture;\r\n\ttexBot = sides[line->sidenum[0]].bottomtexture;\r\n\r\n\tsound = sfx_swtchn;\r\n\tif (line->special == 11)\t\t/* EXIT SWITCH? */\r\n\t\tsound = sfx_swtchx;\r\n\r\n\tfor (i = 0;i < numswitches*2;i++)\r\n    {\r\n\t\tif (switchlist[i] == texTop)\r\n\t\t{\r\n\t\t\tS_StartSound(buttonlist->soundorg,sound);\r\n\t\t\tsides[line->sidenum[0]].toptexture = switchlist[i^1];\r\n\t\t\tif (useAgain)\r\n\t\t\t\tP_StartButton(line,top,switchlist[i],BUTTONTIME);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\telse if (switchlist[i] == texMid)\r\n\t\t{\r\n\t\t\tS_StartSound(buttonlist->soundorg,sound);\r\n\t\t\tsides[line->sidenum[0]].midtexture = switchlist[i^1];\r\n\t\t\tif (useAgain)\r\n\t\t\t\tP_StartButton(line, middle,switchlist[i],BUTTONTIME);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\telse if (switchlist[i] == texBot)\r\n\t\t{\r\n\t\t\tS_StartSound(buttonlist->soundorg,sound);\r\n\t\t\tsides[line->sidenum[0]].bottomtexture = switchlist[i^1];\r\n\t\t\tif (useAgain)\r\n\t\t\t\tP_StartButton(line, bottom,switchlist[i],BUTTONTIME);\r\n\t\t\treturn;\r\n        }\r\n    }\r\n}\r\n\r\n/*\r\n==============================================================================\r\n=\r\n= P_UseSpecialLine\r\n=\r\n= Called when a thing uses a special line\r\n= Only the front sides of lines are usable\r\n===============================================================================\r\n*/\r\n\r\nboolean P_UseSpecialLine ( mobj_t *thing, line_t *line)//L8002810C()\r\n{\r\n\t/* */\r\n\t/*\tSwitches that other things can activate */\r\n\t/* */\r\n\tif (!thing->player)\r\n\t{\r\n\t\tif (line->flags & ML_SECRET)\r\n\t\t\treturn false;\t\t/* never open secret doors */\r\n\t\tswitch(line->special)\r\n\t\t{\r\n\t\t\tcase 1:\t\t/* MANUAL DOOR RAISE */\r\n/*\t\t\tcase 32:\t// MANUAL BLUE */\r\n/*\t\t\tcase 33:\t// MANUAL RED */\r\n/*\t\t\tcase 34:\t// MANUAL YELLOW */\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\t/* */\r\n\t/* do something */\r\n\t/*\t*/\r\n\tswitch (line->special)\r\n\t{\r\n\t\t/*=============================================== */\r\n\t\t/*\tMANUALS */\r\n\t\t/*=============================================== */\r\n\t\tcase 26:\t\t/* Blue Door Raise */\r\n\t\tcase 27:\t\t/* Yellow Door Raise */\r\n\t\tcase 28:\t\t/* Red Door Raise */\r\n\t\tcase 32:\t\t/* Blue Door Open */\r\n\t\tcase 33:\t\t/* Red Door Open */\r\n\t\tcase 34:\t\t/* Yellow Door open */\r\n\t\t\tif (P_CheckKeyLock(line,thing))\r\n\t\t\t\tEV_VerticalDoor(line, thing);\r\n\t\t\tbreak;\r\n\t\tcase 1:\t\t\t/* Vertical Door */\r\n\t\tcase 31:\t\t/* Manual Door Open */\r\n\t\tcase 117:\t\t/* Blazing Door Raise */\r\n\t\tcase 118:\t\t/* Blazing Door Open */\r\n\t\t\t\tEV_VerticalDoor(line, thing);\r\n\t\t\tbreak;\r\n\t\tcase 99:\t\t/* Blue Blazing Door Open */\r\n\t\tcase 134:\t\t/* Red Blazing Door Open */\r\n\t\tcase 136:\t\t/* Yellow Blazing Door open */\r\n\t\t\tif (P_CheckKeyLock(line,thing))\r\n\t\t\t{\r\n\t\t\t\tif (EV_DoDoor(line, BlazeOpen))\r\n\t\t\t\t\tP_ChangeSwitchTexture(line, 1);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 133:\t\t/* Blue Blazing Door Open */\r\n\t\tcase 135:\t\t/* Red Blazing Door Open */\r\n\t\tcase 137:\t\t/* Yellow Blazing Door open */\r\n\t\t\tif (P_CheckKeyLock(line,thing))\r\n\t\t\t{\r\n\t\t\t\tif (EV_DoDoor(line, BlazeOpen))\r\n\t\t\t\t\tP_ChangeSwitchTexture(line, 1);//[GEC] Bug?? DoomPc is 0\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t/*=============================================== */\r\n\t\t/*\tBUTTONS */\r\n\t\t/*=============================================== */\r\n\t\tcase 42:\t\t/* Close Door */\r\n\t\t\tif (EV_DoDoor(line, Close))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 1);\r\n\t\t\tbreak;\r\n\t\tcase 43:\t\t/* Lower Ceiling to Floor */\r\n\t\t\tif (EV_DoCeiling(line, lowerToFloor))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 1);\r\n\t\t\tbreak;\r\n\t\tcase 45:\t\t/* Lower Floor to Surrounding floor height */\r\n\t\t\tif (EV_DoFloor(line, lowerFloor))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 1);\r\n\t\t\tbreak;\r\n\t\tcase 60:\t\t/* Lower Floor to Lowest */\r\n\t\t\tif (EV_DoFloor(line, lowerFloorToLowest))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 1);\r\n\t\t\tbreak;\r\n\t\tcase 61:\t\t/* Open Door */\r\n\t\t\tif (EV_DoDoor(line, Open))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 1);\r\n\t\t\tbreak;\r\n\t\tcase 62:\t\t/* PlatDownWaitUpStay */\r\n\t\t\tif (EV_DoPlat(line, downWaitUpStay, 1))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 1);\r\n\t\t\tbreak;\r\n\t\tcase 63:\t\t/* Raise Door */\r\n\t\t\tif (EV_DoDoor(line, Normal))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 1);\r\n\t\t\tbreak;\r\n\t\tcase 64:\t\t/* Raise Floor to ceiling */\r\n\t\t\tif (EV_DoFloor(line, raiseFloor))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 1);\r\n\t\t\tbreak;\r\n        case 65:\t\t/* Raise Floor Crush */\r\n\t\t\tif (EV_DoFloor(line, raiseFloorCrush))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 1);\r\n\t\t\tbreak;\r\n\t\tcase 66:\t\t/* Raise Floor 24 and change texture */\r\n\t\t\tif (EV_DoPlat(line, raiseAndChange, 24))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 1);\r\n\t\t\tbreak;\r\n\t\tcase 67:\t\t/* Raise Floor 32 and change texture */\r\n\t\t\tif (EV_DoPlat(line, raiseAndChange, 32))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 1);\r\n\t\t\tbreak;\r\n\t\tcase 68:\t\t/* Raise Plat to next highest floor and change texture */\r\n\t\t\tif (EV_DoPlat(line, raiseToNearestAndChange, 0))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 1);\r\n\t\t\tbreak;\r\n\t\tcase 69:\t\t/* Raise Floor to next highest floor */\r\n\t\t\tif (EV_DoFloor(line, raiseFloorToNearest))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 1);\r\n\t\t\tbreak;\r\n\t\tcase 70:\t\t/* Turbo Lower Floor */\r\n\t\t\tif (EV_DoFloor(line, turboLower))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 1);\r\n\t\t\tbreak;\r\n\t\tcase 114:\t\t/* Blazing Door Raise (faster than TURBO!) */\r\n\t\t\tif (EV_DoDoor(line, BlazeRaise))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 1);\r\n\t\t\tbreak;\r\n\t\tcase 115:\t\t/* Blazing Door Open (faster than TURBO!) */\r\n\t\t\tif (EV_DoDoor(line, BlazeOpen))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 1);\r\n\t\t\tbreak;\r\n\t\tcase 116:\t\t/* Blazing Door Close (faster than TURBO!) */\r\n\t\t\tif (EV_DoDoor(line, BlazeClose))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 1);\r\n\t\t\tbreak;\r\n\t\tcase 123:\t\t/* Blazing PlatDownWaitUpStay */\r\n\t\t\tif (EV_DoPlat(line, blazeDWUS, 0))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 1);\r\n\t\t\tbreak;\r\n\t\tcase 138:\t\t/* Light Turn On */\r\n\t\t\tEV_LightTurnOn(line, 255);\r\n\t\t\tP_ChangeSwitchTexture(line, 1);\r\n\t\t\tbreak;\r\n\t\tcase 139:\t\t/* Light Turn Off */\r\n\t\t\tEV_LightTurnOn(line, 35);\r\n\t\t\tP_ChangeSwitchTexture(line, 1);\r\n\t\t\tbreak;\r\n\r\n\t\t/*=============================================== */\r\n\t\t/*\tSWITCHES */\r\n\t\t/*=============================================== */\r\n\t\tcase 7:\t\t\t/* Build Stairs */\r\n\t\t\tif (EV_BuildStairs(line, build8))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 0);\r\n\t\t\tbreak;\r\n\t\tcase 9:\t\t\t/* Change Donut */\r\n\t\t\tif (EV_DoDonut(line))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 0);\r\n\t\t\tbreak;\r\n\t\tcase 11:\t\t/* Exit level */\r\n            P_ExitLevel();\r\n            P_ChangeSwitchTexture(line, 0);\r\n\t\t\tbreak;\r\n\t\tcase 14:\t\t/* Raise Floor 32 and change texture */\r\n\t\t\tif (EV_DoPlat(line, raiseAndChange, 32))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 0);\r\n\t\t\tbreak;\r\n\t\tcase 15:\t\t/* Raise Floor 24 and change texture */\r\n\t\t\tif (EV_DoPlat(line, raiseAndChange, 24))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 0);\r\n\t\t\tbreak;\r\n\t\tcase 18:\t\t/* Raise Floor to next highest floor */\r\n\t\t\tif (EV_DoFloor(line, raiseFloorToNearest))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 0);\r\n\t\t\tbreak;\r\n\t\tcase 20:\t\t/* Raise Plat next highest floor and change texture */\r\n\t\t\tif (EV_DoPlat(line, raiseToNearestAndChange, 0))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 0);\r\n\t\t\tbreak;\r\n\t\tcase 21:\t\t/* PlatDownWaitUpStay */\r\n\t\t\tif (EV_DoPlat(line, downWaitUpStay, 0))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 0);\r\n\t\t\tbreak;\r\n\t\tcase 23:\t\t/* Lower Floor to Lowest */\r\n\t\t\tif (EV_DoFloor(line, lowerFloorToLowest))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 0);\r\n\t\t\tbreak;\r\n\t\tcase 29:\t\t/* Raise Door */\r\n\t\t\tif (EV_DoDoor(line, Normal))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 0);\r\n\t\t\tbreak;\r\n\t\tcase 41:\t\t/* Lower Ceiling to Floor */\r\n\t\t\tif (EV_DoCeiling(line, lowerToFloor))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 0);\r\n\t\t\tbreak;\r\n\t\tcase 49:\t\t/* Ceiling Crush And Raise */\r\n\t\t\tif (EV_DoCeiling(line, crushAndRaise))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 0);\r\n\t\t\tbreak;\r\n\t\tcase 50:\t\t/* Close Door */\r\n\t\t\tif (EV_DoDoor(line, Close))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 0);\r\n\t\t\tbreak;\r\n\t\tcase 51:\t\t/* Secret EXIT */\r\n\t\t\tP_SecretExitLevel(line->tag);\r\n\t\t\tP_ChangeSwitchTexture(line, 0);\r\n\t\t\tbreak;\r\n\t\tcase 55:\t\t/* Raise Floor Crush */\r\n\t\t\tif (EV_DoFloor(line, raiseFloorCrush))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 0);\r\n\t\t\tbreak;\r\n        case 71:\t\t/* Turbo Lower Floor */\r\n\t\t\tif (EV_DoFloor(line, turboLower))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 0);\r\n            break;\r\n\t\tcase 101:\t\t/* Raise Floor */\r\n\t\t\tif (EV_DoFloor(line, raiseFloor))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 0);\r\n\t\t\tbreak;\r\n\t\tcase 102:\t\t/* Lower Floor to Surrounding floor height */\r\n\t\t\tif (EV_DoFloor(line, lowerFloor))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 0);\r\n\t\t\tbreak;\r\n\t\tcase 103:\t\t/* Open Door */\r\n\t\t\tif (EV_DoDoor(line, Open))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 0);\r\n\t\t\tbreak;\r\n        case 111:\t/* Blazing Door Raise (faster than TURBO!) */\r\n\t\t\tif (EV_DoDoor(line, BlazeRaise))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 0);\r\n\t\t\tbreak;\r\n\t\tcase 112:\t\t/* Blazing Door Open (faster than TURBO!) */\r\n\t\t\tif (EV_DoDoor(line, BlazeOpen))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 0);\r\n\t\t\tbreak;\r\n\t\tcase 113:\t\t/* Blazing Door Close (faster than TURBO!) */\r\n\t\t\tif (EV_DoDoor(line, BlazeClose))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 0);\r\n\t\t\tbreak;\r\n\t\tcase 122:\t\t/* Blazing PlatDownWaitUpStay */\r\n\t\t\tif (EV_DoPlat(line, blazeDWUS, 0))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 0);\r\n\t\t\tbreak;\r\n\t\tcase 127:\t\t/* Build Stairs Turbo 16 */\r\n\t\t\tif (EV_BuildStairs(line, turbo16))\r\n\t\t\t\tP_ChangeSwitchTexture(line, 0);\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\treturn true;\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/p_telept.c",
    "content": "#include \"doomdef.h\"\n#include \"p_local.h\"\n\n/*\n==============\n=\n= P_Telefrag\n=\n= Kill all monsters around the given spot\n=\n==============\n*/\n//inline\nvoid P_Telefrag (mobj_t *thing, fixed_t x, fixed_t y)//L80028700()\n{\n\tint\t\tdelta;\n\tint\t\tsize;\n\tmobj_t\t*m;\n\n\tfor (m=mobjhead.next ; m != &mobjhead ; m=m->next)\n\t{\n\t\tif (!(m->flags & MF_SHOOTABLE) )\n\t\t\tcontinue;\t\t/* not shootable */\n\t\tsize = m->radius + thing->radius + 4*FRACUNIT;\n\t\tdelta = m->x - x;\n\t\tif (delta < - size || delta > size)\n\t\t\tcontinue;\n\t\tdelta = m->y - y;\n\t\tif (delta < -size || delta > size)\n\t\t\tcontinue;\n\t\tP_DamageMobj (m, thing, thing, 10000);\n\t\tm->flags &= ~(MF_SOLID|MF_SHOOTABLE);\n\t}\n}\n\n\n/*================================================================== */\n/* */\n/*\t\t\t\t\t\tTELEPORTATION */\n/* */\n/*================================================================== */\nint\tEV_Teleport( line_t *line,mobj_t *thing )//L800287F8()\n{\n\tint\t\ti;\n\tint\t\ttag;\n\tboolean\t\tflag;\n\tmobj_t\t\t*m,*fog;\n\tunsigned\tan;\n\tsector_t\t*sector;\n\tfixed_t\t\toldx, oldy, oldz;\n\tint\t\tside;\r\n\r\n\t//printf(\"EV_Teleport\\n\");\n\n\tside = !P_PointOnLineSide (thing->x, thing->y, line);\n\n\tif (thing->flags & MF_MISSILE)\n\t\treturn 0;\t\t\t/* don't teleport missiles */\n\n\tif (side == 1)\t\t/* don't teleport if hit back of line, */\n\t\treturn 0;\t\t/* so you can get out of teleporter */\n\n\ttag = line->tag;\n\tfor (i = 0; i < numsectors; i++)\r\n    {\n\t\tif (sectors[ i ].tag == tag )\n\t\t{\n\t\t\tfor (m=mobjhead.next ; m != &mobjhead ; m=m->next)\n\t\t\t{\n\t\t\t\tif (m->type != MT_TELEPORTMAN )\n\t\t\t\t\tcontinue;\t\t/* not a teleportman */\n\n\t\t\t\t//sector = (m->subsector->sector - sectors) * (int)(0xE9BD37A7);\n\t\t\t\t//if ((sector >> 2) != i)\r\n\t\t\t\t//if((*(int *)m->subsector - (int)sectors) * -0x1642c859 >> 2 == i)\r\n\t\t\t\tsector = m->subsector->sector;\r\n                if(sector-sectors != i )\n\t\t\t\t\tcontinue;\t\t/* wrong sector */\n\n\t\t\t\toldx = thing->x;\n\t\t\t\toldy = thing->y;\n\t\t\t\toldz = thing->z;\n\t\t\t\tthing->flags |= MF_TELEPORT;\n\t\t\t\tnumthingspec = 0;\n\n\t\t\t\tif (thing->player)\n\t\t\t\t\tP_Telefrag (thing, m->x, m->y);\n\n\t\t\t\tflag = P_TryMove (thing, m->x, m->y);\n\t\t\t\tthing->flags &= ~MF_TELEPORT;\n\t\t\t\tif (!flag)\n\t\t\t\t\treturn 0;\t/* move is blocked */\n\t\t\t\tthing->z = thing->floorz;\n\n\t\t\t\t/* spawn teleport fog at source and destination */\n\t\t\t\tfog = P_SpawnMobj (oldx, oldy, oldz, MT_TFOG);\n\t\t\t\tS_StartSound (fog, sfx_telept);\n\t\t\t\tan = m->angle >> ANGLETOFINESHIFT;\n\t\t\t\tfog = P_SpawnMobj (m->x+20*finecosine[an], m->y+20*finesine[an]\n\t\t\t\t\t, thing->z, MT_TFOG);\n\t\t\t\tS_StartSound (fog, sfx_telept);\n\t\t\t\tif (thing->player)\n\t\t\t\t\tthing->reactiontime = 9;\t/* don't move for a bit */ //[psx] changed to 9\n\t\t\t\tthing->angle = m->angle;\n\t\t\t\tthing->momx = thing->momy = thing->momz = 0;\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t}\r\n    }\n\treturn 0;\n}\n\n"
  },
  {
    "path": "PSXDOOM/p_tick.c",
    "content": "#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n#include \"st_main.h\"\r\n\r\nint\tplayertics, thinkertics, sighttics, basetics, latetics;\r\nint\ttictics;\r\n\r\nboolean\t\tgamepaused; //80077CEC, iGp000008dc\r\n//jagobj_t\t*pausepic;\r\n\r\n/*\r\n===============================================================================\r\n\r\n\t\t\t\t\t\t\t\tTHINKERS\r\n\r\nAll thinkers should be allocated by Z_Malloc so they can be operated on uniformly.  The actual\r\nstructures will vary in size, but the first element must be thinker_t.\r\n\r\nMobjs are similar to thinkers, but kept seperate for more optimal list\r\nprocessing\r\n===============================================================================\r\n*/\r\n\r\n//thinker_t\tthinkercap;\t/* both the head and tail of the thinker list */    //80096378\r\n//mobj_t\t\tmobjhead;\t/* head and tail of mobj list */                //800A8C74,\r\nint\t\t\tactivethinkers;\t/* debug count */                               //80078118, iGp00000d08\r\nint\t\t\tactivemobjs;\t/* debug count */\r\n\r\n/*\r\n===============\r\n=\r\n= P_InitThinkers\r\n=\r\n===============\r\n*/\r\n#if 0\r\nvoid P_InitThinkers (void)\r\n{\r\n\tthinkercap.prev = thinkercap.next  = &thinkercap;\r\n\tmobjhead.next = mobjhead.prev = &mobjhead;\r\n}\r\n#endif // 0\r\n\r\n/*\r\n===============\r\n=\r\n= P_AddThinker\r\n=\r\n= Adds a new thinker at the end of the list\r\n=\r\n===============\r\n*/\r\n\r\nvoid P_AddThinker (thinker_t *thinker)//L80028B18()\r\n{\r\n\tthinkercap.prev->next = thinker;\r\n\tthinker->next = &thinkercap;\r\n\tthinker->prev = thinkercap.prev;\r\n\tthinkercap.prev = thinker;\r\n}\r\n\r\n/*\r\n===============\r\n=\r\n= P_RemoveThinker\r\n=\r\n= Deallocation is lazy -- it will not actually be freed until its\r\n= thinking turn comes up\r\n=\r\n===============\r\n*/\r\n\r\nvoid P_RemoveThinker (thinker_t *thinker)//L80028B48()\r\n{\r\n\tthinker->function = (think_t)-1;\r\n}\r\n\r\n/*\r\n===============\r\n=\r\n= P_RunThinkers\r\n=\r\n===============\r\n*/\r\n//inline\r\nvoid P_RunThinkers (void)//L80028B54()\r\n{\r\n\tthinker_t\t*currentthinker;\r\n\r\n\tactivethinkers = 0;\r\n\r\n\tcurrentthinker = thinkercap.next;\r\n\tif (thinkercap.next != &thinkercap)\r\n    {\r\n        while (currentthinker != &thinkercap)\r\n        {\r\n            if (currentthinker->function == (think_t)-1)\r\n            {\t// time to remove it\r\n                currentthinker->next->prev = currentthinker->prev;\r\n                currentthinker->prev->next = currentthinker->next;\r\n                Z_Free (currentthinker);\r\n            }\r\n            else\r\n            {\r\n                if (currentthinker->function)\r\n                {\r\n                    currentthinker->function (currentthinker);\r\n                }\r\n                activethinkers++;\r\n            }\r\n            currentthinker = currentthinker->next;\r\n        }\r\n\t}\r\n}\r\n\r\n/*\r\n===================\r\n=\r\n= P_RunMobjLate\r\n=\r\n= Run stuff that doesn't happen every tick\r\n===================\r\n*/\r\n\r\n//inline\r\nvoid P_RunMobjLate (void)//L80028C10()\r\n{\r\n\tmobj_t\t*mo;\r\n\tmobj_t\t*next;\r\n\r\n\tfor (mo=mobjhead.next ; mo != &mobjhead ; mo=next)\r\n\t{\r\n\t\tnext = mo->next;\t/* in case mo is removed this time */\r\n\t\tif (mo->latecall)\r\n\t\t{\r\n\t\t\tmo->latecall(mo);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= P_CheckCheats\r\n=\r\n==============\r\n*/\r\n\r\nint\t\tcodepos;                //80077E10, iGp00000a00\r\nshort\tcodetmp[8];             //800a8f88\r\nint\t\tm_vframe1[MAXPLAYERS];\t//80077D24\r\nint\t\tcht_ticon;              //800780FC\r\nint \twarpmap;                //80078094, iGp00000c84\r\nint     Vram_page;              //80077D00, iGp000008f0\r\n\r\ntypedef enum\r\n{\r\n\tCH_ALLLINES,\t//0\r\n\tCH_ALLTHINGS,\t//1\r\n\tCH_GODMODE,\t\t//2\r\n\tCH_AMMOWEAPONS,\t//3\r\n\tCH_NOCLIP,\t\t//4 Enabled in Station Doom\r\n\tCH_WARPLEVEL,\t//5\r\n\tCH_NULL2,\t\t//6\r\n\tCH_VRAMVIEWER,\t//7 Enabled in GEC Master Edition\r\n\tCH_NULL3,\t\t//8\r\n\tCH_X_RAY,\t\t//9\r\n\tCH_NULL4,\t\t//10\r\n\tCH_NULL5,\t\t//11\r\n\tNUMCHEATS\r\n} cheatnum_t;\r\n\r\nshort\tcheatcodes[NUMCHEATS][8] = //800675A8\r\n{\r\n\t{ PAD_TRIANGLE, PAD_TRIANGLE, PAD_L2, PAD_R2, PAD_L2, PAD_R2, PAD_R1, PAD_SQUARE },\r\n\t{ PAD_TRIANGLE, PAD_TRIANGLE, PAD_L2, PAD_R2, PAD_L2, PAD_R2, PAD_R1, PAD_CIRCLE },\r\n\t{ PAD_DOWN, PAD_L2, PAD_SQUARE, PAD_R1, PAD_RIGHT, PAD_L1, PAD_LEFT, PAD_CIRCLE },\r\n\t{ PAD_CROSS, PAD_TRIANGLE, PAD_L1, PAD_UP, PAD_DOWN, PAD_R2, PAD_LEFT, PAD_LEFT },\r\n\t{ PAD_UP, PAD_UP, PAD_UP, PAD_UP, PAD_UP, PAD_UP, PAD_UP, PAD_R1 },\r\n\t{ PAD_RIGHT, PAD_LEFT, PAD_R2, PAD_R1, PAD_TRIANGLE, PAD_L1, PAD_CIRCLE, PAD_CROSS },\r\n\t{ PAD_LEFT, PAD_LEFT, PAD_LEFT, PAD_LEFT, PAD_LEFT, PAD_LEFT, PAD_LEFT, PAD_LEFT },\r\n\t{ PAD_TRIANGLE, PAD_SQUARE, PAD_UP, PAD_LEFT, PAD_DOWN, PAD_RIGHT, PAD_CROSS, PAD_CIRCLE },\r\n\t{ PAD_CROSS, PAD_CROSS, PAD_CROSS, PAD_CROSS, PAD_CROSS, PAD_CROSS, PAD_CROSS, PAD_CROSS },\r\n\t{ PAD_L1, PAD_R2, PAD_L2, PAD_R1, PAD_RIGHT, PAD_TRIANGLE, PAD_CROSS, PAD_RIGHT },\r\n\t{ PAD_CIRCLE, PAD_CIRCLE, PAD_CIRCLE, PAD_CIRCLE, PAD_CIRCLE, PAD_CIRCLE, PAD_CIRCLE, PAD_CIRCLE },\r\n\t{ PAD_SQUARE, PAD_SQUARE, PAD_SQUARE, PAD_SQUARE, PAD_SQUARE, PAD_SQUARE, PAD_SQUARE, PAD_SQUARE },\r\n};\r\n\r\nvoid P_CheckCheats (void)//L80028C74()\r\n{\r\n\tint\t\t buttons, oldbuttons;\r\n\tint\t\t i, j;\r\n\tint\t\t action;\r\n\tplayer_t *p;\r\n\tmobj_t\t *m;\r\n\r\n\tfor (i=(MAXPLAYERS-1) ; i >= 0 ; i--)\r\n\t{\r\n\t\tif (!playeringame[i])\r\n\t\t\tcontinue;\r\n\r\n\t\tbuttons = ticbuttons[i];\r\n\t\toldbuttons = oldticbuttons[i];\r\n\r\n\t\tif ((buttons & PAD_START) && !(oldbuttons & PAD_START))\r\n\t\t{\r\n\t\t\tgamepaused ^= 1;\r\n\r\n\t\t\tif (gamepaused)\r\n\t\t\t{\r\n\t\t\t\tpsxcd_pause();\r\n\t\t\t\t#if GH_UPDATES == 1\r\n\t\t\t\t//Only PSX (FINAL DOOM / DOOM Greatest Hits)\r\n                wess_seq_stop(sfx_sawful);\r\n                wess_seq_stop(sfx_sawhit);\r\n\t\t\t\t#endif // GH_UPDATES\r\n\t\t\t\tS_Pause();\r\n\t\t\t\tcodepos = 0;\r\n\t\t\t\tcht_ticon = ticon;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n            psxcd_restart(0);\r\n            do {} while (psxcd_seeking_for_play() != 0);\r\n            psxspu_start_cd_fade((FADE_TIME*2), CDVolume);\r\n            S_Resume();\r\n            players[0].cheats &= ~(CF_WARPLEVEL | CF_VRAMVIEWER);\r\n            ticon = cht_ticon;\r\n            ticsinframe = cht_ticon >> 2;\r\n\t\t}\r\n\r\n\t\tp = &players[i];\r\n\t\tif (((buttons & PAD_SELECT) && !(oldbuttons & PAD_SELECT)) && gamepaused)\r\n\t\t{\r\n\t\t\tp->cheats &= ~(CF_WARPLEVEL | CF_VRAMVIEWER);\r\n\r\n\t\t\tDrawRender();\r\n\r\n\t\t\taction = MiniLoop(O_Start,O_Stop,O_Ticker,O_Drawer);\r\n\t\t\tif(action == ga_exit)\r\n                return;\r\n\r\n            gameaction = action;\r\n            if (gameaction == ga_restart || gameaction == ga_exitdemo)\r\n            {\r\n                O_Drawer();\r\n                return;\r\n            }\r\n\t\t}\r\n\t}\r\n\r\n\tif (netgame != gt_single)\r\n\t\treturn;\r\n\r\n\tif (buttons == 0)\r\n\t\tm_vframe1[0] = 0;\r\n\r\n\tif (p->cheats & CF_WARPLEVEL)\r\n\t{\r\n\t\tm_vframe1[0] -= vblsinframe[0];\r\n\t\tif (m_vframe1[0] <= 0)\r\n\t\t{\r\n\t\t\tif (buttons & PAD_LEFT)\r\n\t\t\t{\r\n\t\t\t\twarpmap -= 1;\r\n\r\n\t\t\t\tif (warpmap <= 0)\r\n\t\t\t\t\twarpmap = 1;\r\n\r\n\t\t\t\tm_vframe1[0] = TICRATE;\r\n\t\t\t}\r\n\t\t\telse if (buttons & PAD_RIGHT)\r\n\t\t\t{\r\n\t\t\t\twarpmap += 1;\r\n\r\n\t\t\t\tif (warpmap >= 55)\r\n\t\t\t\t\twarpmap = 54;\r\n\r\n\t\t\t\tm_vframe1[0] = TICRATE;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ((buttons != oldbuttons) && (buttons & PAD_ACTION))\r\n\t\t{\r\n            gameaction = ga_warped;\r\n            p->cheats &= ~CF_WARPLEVEL;\r\n            gamemap = startmap = warpmap;\r\n\t\t}\r\n\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (p->cheats & CF_VRAMVIEWER)\r\n\t{\r\n\t\tif (buttons != oldbuttons)\r\n\t\t{\r\n\t\t\tif (buttons & PAD_LEFT)\r\n\t\t\t{\r\n\t\t\t\tVram_page -= 1;\r\n\t\t\t\tif (Vram_page < 0)\r\n\t\t\t\t\tVram_page = 0;\r\n\t\t\t}\r\n\t\t\telse if (buttons & PAD_RIGHT)\r\n\t\t\t{\r\n\t\t\t\tVram_page += 1;\r\n\t\t\t\tif (Vram_page >= MAX_DYNAMIC_TPAGE)\r\n\t\t\t\t\tVram_page = (MAX_DYNAMIC_TPAGE-1);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn;\r\n\t}\r\n\r\n    if (!gamepaused)\r\n        return;\r\n\r\n    if (buttons == 0)\r\n        return;\r\n\r\n    if (buttons == oldbuttons)\r\n        return;\r\n\r\n    codetmp[codepos] = buttons;\r\n    codepos += 1;\r\n\r\n    //Check code\r\n    for (i = 0; i < NUMCHEATS; i++)\r\n    {\r\n        for (j = 0; j < codepos; j++)\r\n        {\r\n            if (cheatcodes[i][j] != codetmp[j])\r\n                break;\r\n        }\r\n\r\n        //Cycle Code Complete\r\n        if (j >= 8)\r\n        {\r\n            switch (i)// Get case number\r\n            {\r\n            case CH_ALLLINES:\r\n                p->cheats ^= CF_ALLLINES;\r\n                stbar.messagedelay = 1;\r\n\r\n                if (p->cheats & CF_ALLLINES)\r\n                {\r\n                    stbar.message = \"Map All Lines ON.\";\r\n                }\r\n                else\r\n                {\r\n                    stbar.message = \"Map All Lines OFF.\";\r\n                }\r\n                break;\r\n\r\n            case CH_ALLTHINGS:\r\n                p->cheats ^= CF_ALLTHINGS;\r\n                stbar.messagedelay = 1;\r\n\r\n                if (p->cheats & CF_ALLTHINGS)\r\n                {\r\n                    stbar.message = \"Map All Things ON.\";\r\n                }\r\n                else\r\n                {\r\n                    stbar.message = \"Map All Things OFF.\";\r\n                }\r\n                break;\r\n\r\n            case CH_GODMODE:\r\n                p->cheats ^= CF_GODMODE;\r\n                stbar.messagedelay = 1;\r\n\r\n                if (p->cheats & CF_GODMODE)\r\n                {\r\n                    stbar.message = \"All Powerful Mode ON.\";\r\n                    p->health = 100;\r\n                    p->mo->health = 100;\r\n                }\r\n                else\r\n                {\r\n                    stbar.message = \"All Powerful Mode OFF.\";\r\n                }\r\n                break;\r\n\r\n            case CH_AMMOWEAPONS:\r\n                for (m = mobjhead.next; m != &mobjhead; m = m->next)\r\n                {\r\n                    switch (m->type)\r\n                    {\r\n                    case MT_MISC4:\r\n                        p->cards[it_bluecard] = true;\r\n                        break;\r\n                    case MT_MISC5:\r\n                        p->cards[it_redcard] = true;\r\n                        break;\r\n                    case MT_MISC6:\r\n                        p->cards[it_yellowcard] = true;\r\n                        break;\r\n                    case MT_MISC7:\r\n                        p->cards[it_yellowskull] = true;\r\n                        break;\r\n                    case MT_MISC8:\r\n                        p->cards[it_redskull] = true;\r\n                        break;\r\n                    case MT_MISC9:\r\n                        p->cards[it_blueskull] = true;\r\n                        break;\r\n                    default:\r\n                        break;\r\n                    }\r\n                }\r\n                p->armorpoints = 200;\r\n                p->armortype = 2;\r\n                for (i = 0; i<NUMWEAPONS; i++) {p->weaponowned[i] = true;}\r\n                for (i = 0; i<NUMAMMO; i++) {p->ammo[i] = p->maxammo[i];}\r\n\r\n                stbar.messagedelay = 1;\r\n                stbar.message = \"Lots Of Goodies!\";\r\n                break;\r\n            case CH_WARPLEVEL:\r\n                p->cheats |= CF_WARPLEVEL;\r\n\r\n                if (warpmap >= 55)\r\n                    warpmap = 54;\r\n                else\r\n                    warpmap = gamemap;\r\n                break;\r\n            case CH_X_RAY:\r\n                p->cheats ^= CF_X_RAY;\r\n                break;\r\n\r\n            case CH_VRAMVIEWER: //Enabled in [GEC] Master Edition\r\n                p->cheats ^= CF_VRAMVIEWER;\r\n                break;\r\n\r\n            case CH_NOCLIP: //Enabled in Station Doom\r\n                p->mo->flags ^= MF_NOCLIP;\r\n                stbar.messagedelay = 1;\r\n\r\n                if (p->mo->flags & MF_NOCLIP)\r\n                {\r\n                    stbar.message = \"No Clip ON.\";\r\n                }\r\n                else\r\n                {\r\n                    stbar.message = \"No Clip OFF.\";\r\n                }\r\n                break;\r\n            }\r\n\r\n            break;//break for i\r\n        }\r\n    }\r\n\r\n    i = codepos;\r\n    if (codepos < 0) i = codepos + 7;\r\n    codepos = codepos - ((i/8) * 8);\r\n}\r\n\r\nint playernum;//80078110, iGp00000d00\r\n\r\nvoid G_DoReborn (int playernum);//extern\r\n\r\n/*\r\n=================\r\n=\r\n= P_Ticker\r\n=\r\n=================\r\n*/\r\n\r\n//int\t\tticphase;\r\n\r\n//psx doom new\r\nint checkcount; //*L80077DE4\r\n\r\n//extern functions\r\nvoid P_CheckSights (void);\r\nvoid P_RunMobjBase (void);\r\n\r\nint P_Ticker (void)//800292E4\r\n{\r\n\tplayer_t *pl;\r\n\r\n\tgameaction = ga_nothing;\r\n\r\n\t//\r\n\t// check for pause and cheats\r\n\t//\r\n\tP_CheckCheats();\r\n\r\n\tif ((!gamepaused) && (gamevbls < gametic))\r\n\t{\r\n\t    P_RunThinkers();\r\n\t\tP_CheckSights();\r\n\t\tP_RunMobjBase();\r\n\t\tP_RunMobjLate();\r\n\r\n\t\tP_UpdateSpecials();\r\n\t\tP_RespawnSpecials();\r\n\t\tST_Ticker(); // update status bar\r\n\t}\r\n\r\n\t//\r\n\t// run player actions\r\n\t//\r\n\tfor (playernum = 0, pl = players; playernum < MAXPLAYERS; playernum++, pl++)\r\n\t{\r\n\t\tif (playeringame[playernum])\r\n\t\t{\r\n\t\t\tif (pl->playerstate == PST_REBORN)\r\n            {\r\n\t\t\t\tG_DoReborn(playernum);\r\n            }\r\n\t\t\tAM_Control(pl);\r\n\t\t\tP_PlayerThink(pl);\r\n\t\t}\r\n\t}\r\n\r\n\treturn gameaction; // may have been set to ga_died, ga_completed, or ga_secretexit\r\n}\r\n\r\n/*\r\n=============\r\n=\r\n= P_Drawer\r\n=\r\n= draw current display\r\n=============\r\n*/\r\n\r\n\r\n\r\nvoid P_Drawer (void) //L800294CC()\r\n{\r\n\tNextTextureCacheIdx();\r\n\r\n\tif (players[consoleplayer].automapflags & AF_ACTIVE)\r\n        AM_Drawer();\r\n\telse\r\n\t\tR_RenderPlayerView();\r\n\r\n\tST_Drawer();\r\n\tUpdateDrawOTag();\r\n}\r\n\r\n//extern\t int\t\tticremainder[2];\r\n\r\nvoid P_Start (void)//L80029554()\r\n{\r\n\tgamepaused = false;\r\n\tvalidcount = 1;\r\n\r\n\tAM_Start();\r\n\tM_ClearRandom();\r\n\r\n\tdisableload = true;\r\n\r\n\tif (demoplayback)\r\n\t\tpsxcd_play_at_andloop(CD_TRACK[cdmusic_credits_demo],CDVolume,0,0,CD_TRACK[cdmusic_credits_demo],CDVolume,0,0);\r\n\telse\r\n\t\tS_StartMusic();\r\n}\r\n\r\nvoid P_Stop (int exit)//L800295EC()\r\n{\r\n\tint i;\r\n\r\n\tDrawSync(0);\r\n\tS_StopAll();\r\n\tpsxcd_stop();\r\n\tS_StopMusic();\r\n\r\n\tgamepaused = false;\r\n\tdisableload = false;\r\n\r\n\tfor (i = 0; i < MAXPLAYERS; i++)\r\n\t{\r\n\t\tif (playeringame[i])\r\n\t\t{\r\n\t\t\tG_PlayerFinishLevel(i);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "PSXDOOM/p_user.c",
    "content": "/* P_user.c */\r\n\r\n#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n#include \"st_main.h\"\r\n\r\n\r\nfixed_t \t\tforwardmove[2] = {0x40000, 0x60000};//80067668\r\nfixed_t \t\tsidemove[2] = {0x38000, 0x58000}; //80067670\r\n\r\n#define SLOWTURNTICS    10\r\nfixed_t\t\t\tangleturn[] = //80067678\r\n\t{300,300,500,500,600,700,800,900,900,1000};\r\nfixed_t\t\t\tfastangleturn[] = //800676A0\r\n\t{800,800,900,1000,1000,1200,1200,1300,1300,1400};\r\n\r\n\r\n/*============================================================================= */\r\n\r\nmobj_t          *slidething;    //80077D04, pmGp000008f4\r\nextern\tfixed_t\tslidex, slidey; //80077dbc || 80077dc0\r\nextern\tline_t\t*specialline;   //80077dc8\r\n\r\nvoid P_SlideMove ();\r\n\r\nvoid P_PlayerMove (mobj_t *mo)//L80029670()\r\n{\r\n\tfixed_t\t\tmomx, momy;\r\n\tline_t\t\t*latchedline;\r\n\tfixed_t\t\tlatchedx, latchedy;\r\n\r\n\tmomx = vblsinframe[playernum] * (mo->momx>>2);\r\n\tmomy = vblsinframe[playernum] * (mo->momy>>2);\r\n\r\n\tslidething = mo;\r\n\r\n\tP_SlideMove ();\r\n\r\n\tlatchedline = (line_t *)specialline;\r\n\tlatchedx = slidex;\r\n\tlatchedy = slidey;\r\n\r\n\tif ((latchedx == mo->x) && (latchedy == mo->y))\r\n\t\tgoto stairstep;\r\n\r\n\tif (P_TryMove (mo, latchedx, latchedy))\r\n\t\tgoto dospecial;\r\n\r\nstairstep:\r\n\r\n\tif (momx > MAXMOVE)\r\n\t\tmomx = MAXMOVE;\r\n\telse if (momx < -MAXMOVE)\r\n\t\tmomx = -MAXMOVE;\r\n\r\n\tif (momy > MAXMOVE)\r\n\t\tmomy = MAXMOVE;\r\n\telse if (momy < -MAXMOVE)\r\n\t\tmomy = -MAXMOVE;\r\n\r\n\t/* something fucked up in slidemove, so stairstep */\r\n\r\n\tif (P_TryMove (mo, mo->x, mo->y + momy))\r\n\t{\r\n\t\tmo->momx = 0;\r\n\t\tmo->momy = momy;\r\n\t\tgoto dospecial;\r\n\t}\r\n\r\n\tif (P_TryMove (mo, mo->x + momx, mo->y))\r\n\t{\r\n\t\tmo->momx = momx;\r\n\t\tmo->momy = 0;\r\n\t\tgoto dospecial;\r\n\t}\r\n\r\n\tmo->momx = mo->momy = 0;\r\n\r\ndospecial:\r\n\tif (latchedline)\r\n\t\tP_CrossSpecialLine (latchedline, mo);\r\n}\r\n\r\n\r\n/*\r\n===================\r\n=\r\n= P_PlayerXYMovement\r\n=\r\n===================\r\n*/\r\n\r\n#define\tSTOPSPEED\t\t0x1000\r\n#define\tFRICTION\t\t0xd200  //Jag 0xd240\r\n//inline\r\nvoid P_PlayerXYMovement (mobj_t *mo)//L800297E8()\r\n{\r\n\tP_PlayerMove (mo);\r\n\r\n\t/* */\r\n\t/* slow down */\r\n\t/* */\r\n\tif (mo->z > mo->floorz)\r\n\t\treturn;\t\t/* no friction when airborne */\r\n\r\n\tif (mo->flags & MF_CORPSE)\r\n\t\tif (mo->floorz != mo->subsector->sector->floorheight)\r\n\t\t\treturn;\t\t\t/* don't stop halfway off a step */\r\n\r\n\tif (mo->momx > -STOPSPEED && mo->momx < STOPSPEED\r\n\t&& mo->momy > -STOPSPEED && mo->momy < STOPSPEED)\r\n\t{\r\n\t\tmo->momx = 0;\r\n\t\tmo->momy = 0;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tmo->momx = (mo->momx>>8)*(FRICTION>>8);\r\n\t\tmo->momy = (mo->momy>>8)*(FRICTION>>8);\r\n\t}\r\n}\r\n\r\n\r\n/*\r\n===============\r\n=\r\n= P_PlayerZMovement\r\n=\r\n===============\r\n*/\r\n//inline\r\nvoid P_PlayerZMovement (mobj_t *mo)//L800298D8()\r\n{\r\n\t/* */\r\n\t/* check for smooth step up */\r\n\t/* */\r\n\tif (mo->z < mo->floorz)\r\n\t{\r\n\t\tmo->player->viewheight -= (mo->floorz - mo->z);\r\n\t\tmo->player->deltaviewheight = (VIEWHEIGHT - mo->player->viewheight) >> 2;\r\n\t}\r\n\r\n\t/* */\r\n\t/* adjust height */\r\n\t/* */\r\n\tmo->z += mo->momz;\r\n\r\n\t/* */\r\n\t/* clip movement */\r\n\t/* */\r\n\tif (mo->z <= mo->floorz)\r\n\t{\t/* hit the floor */\r\n\t\tif (mo->momz < 0)\r\n\t\t{\r\n\t\t\tif (mo->momz < -(GRAVITY*2))\t/* squat down */\r\n\t\t\t{\r\n\t\t\t\tmo->player->deltaviewheight = mo->momz>>3;\r\n\t\t\t\tS_StartSound (mo, sfx_oof);\r\n\t\t\t}\r\n\t\t\tmo->momz = 0;\r\n\t\t}\r\n\t\tmo->z = mo->floorz;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tif (mo->momz == 0)\r\n\t\t\tmo->momz = -GRAVITY;\r\n\t\telse\r\n\t\t\tmo->momz -= (GRAVITY/2);\r\n\t}\r\n\r\n\tif (mo->z + mo->height > mo->ceilingz)\r\n\t{\t/* hit the ceiling */\r\n\t\tif (mo->momz > 0)\r\n\t\t\tmo->momz = 0;\r\n\t\tmo->z = mo->ceilingz - mo->height;\r\n\t}\r\n}\r\n\r\n\r\n/*\r\n================\r\n=\r\n= P_PlayerMobjThink\r\n=\r\n================\r\n*/\r\n\r\nvoid P_PlayerMobjThink (mobj_t *mobj)//L80029A08()\r\n{\r\n\tstate_t\t*st;\r\n\tint\t\tstate;\r\n\r\n\t/* */\r\n\t/* momentum movement */\r\n\t/* */\r\n\tif (mobj->momx || mobj->momy)\r\n\t\tP_PlayerXYMovement (mobj);\r\n\r\n\tif ( (mobj->z != mobj->floorz) || mobj->momz)\r\n\t\tP_PlayerZMovement (mobj);\r\n\r\n\t/* */\r\n\t/* cycle through states, calling action functions at transitions */\r\n\t/* */\r\n\tif (mobj->tics == -1)\r\n\t\treturn;\t\t\t\t/* never cycle */\r\n\r\n\tmobj->tics--;\r\n\r\n\tif (mobj->tics > 0)\r\n\t\treturn;\t\t\t\t/* not time to cycle yet */\r\n\r\n\tstate = mobj->state->nextstate;\r\n\tst = &states[state];\r\n\r\n\tmobj->state = st;\r\n\tmobj->tics = st->tics;\r\n\tmobj->sprite = st->sprite;\r\n\tmobj->frame = st->frame;\r\n}\r\n\r\n/*============================================================================= */\r\n\r\n\r\n/*\r\n====================\r\n=\r\n= P_BuildMove\r\n=\r\n====================\r\n*/\r\n\r\nvoid P_BuildMove (player_t *player) //L80029CA4()\r\n{\r\n\tint         speed;\r\n\tint\t\t\tbuttons, oldbuttons;\r\n\tmobj_t\t\t*mo;\r\n\tbuttons_t\t*cbutton;\r\n\tfixed_t\t\tForwardMove, SideMove;\r\n\tangle_t\t\tAngleTurn;\r\n\r\n\tcbutton = BT_DATA[playernum];\r\n\tbuttons = ticbuttons[playernum];\r\n\toldbuttons = oldticbuttons[playernum];\r\n\r\n\tspeed = (buttons & cbutton->BT_SPEED) > 0;\r\n\r\n\t/*  */\r\n\t/* use two stage accelerative turning on the joypad  */\r\n\t/*  */\r\n\tif (((buttons & PAD_LEFT) && (oldbuttons & PAD_LEFT)) || ((buttons & PAD_RIGHT) && (oldbuttons & PAD_RIGHT)))\r\n\t\tplayer->turnheld++;\r\n\telse\r\n\t\tplayer->turnheld = 0;\r\n\r\n\tif (player->turnheld >= SLOWTURNTICS)\r\n\t\tplayer->turnheld = SLOWTURNTICS-1;\r\n\r\n\tplayer->forwardmove = player->sidemove = player->angleturn = 0;\r\n\r\n\tif (buttons & cbutton->BT_STRAFELEFT)\r\n\t{\r\n\t\tSideMove = -vblsinframe[playernum] * sidemove[speed];\r\n\t\tif (SideMove < 0) { SideMove += 3; }\r\n\r\n\t\tplayer->sidemove = (SideMove >> 2);\r\n\t}\r\n\telse if (buttons & cbutton->BT_STRAFERIGHT)\r\n\t{\r\n\t\tSideMove = vblsinframe[playernum] * sidemove[speed];\r\n\t\tif (SideMove < 0) { SideMove += 3; }\r\n\r\n\t\tplayer->sidemove = (SideMove >> 2);\r\n\t}\r\n\r\n    if (buttons & cbutton->BT_STRAFE)\r\n\t{\r\n\t\tif (buttons & PAD_LEFT)\r\n\t\t{\r\n\t\t\tSideMove = -vblsinframe[playernum] * sidemove[speed];\r\n\t\t\tif (SideMove < 0) { SideMove += 3; }\r\n\r\n\t\t\tplayer->sidemove = (SideMove >> 2);\r\n\t\t}\r\n\t\telse if (buttons & PAD_RIGHT)\r\n\t\t{\r\n\t\t\tSideMove = vblsinframe[playernum] * sidemove[speed];\r\n\t\t\tif (SideMove < 0) { SideMove += 3; }\r\n\r\n\t\t\tplayer->sidemove = (SideMove >> 2);\r\n\t\t}\r\n\t}\r\n\telse\r\n\t{\r\n\t\tif (speed && !(buttons & (PAD_UP| PAD_DOWN)))\r\n\t\t{\r\n\t\t\tif (buttons & PAD_LEFT)\r\n\t\t\t{\r\n\t\t\t\tAngleTurn =  vblsinframe[playernum] * fastangleturn[player->turnheld];\r\n\t\t\t\tif (AngleTurn < 0) { AngleTurn += 3; }\r\n\t\t\t\tAngleTurn >>= 2;\r\n\r\n\t\t\t\tplayer->angleturn = AngleTurn << 17;\r\n\t\t\t}\r\n\t\t\telse if (buttons & PAD_RIGHT)\r\n\t\t\t{\r\n\t\t\t\tAngleTurn = vblsinframe[playernum] * fastangleturn[player->turnheld];\r\n\t\t\t\tif (AngleTurn < 0) { AngleTurn += 3; }\r\n\t\t\t\tAngleTurn >>= 2;\r\n\r\n\t\t\t\tplayer->angleturn = -AngleTurn << 17;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif (buttons & PAD_LEFT)\r\n\t\t\t{\r\n\t\t\t\tAngleTurn = vblsinframe[playernum] * angleturn[player->turnheld];\r\n\t\t\t\tif (AngleTurn < 0) { AngleTurn += 3; }\r\n\t\t\t\tAngleTurn >>= 2;\r\n\r\n\t\t\t\tplayer->angleturn = AngleTurn << 17;\r\n\t\t\t}\r\n\t\t\telse if (buttons & PAD_RIGHT)\r\n\t\t\t{\r\n\t\t\t\tAngleTurn = vblsinframe[playernum] * angleturn[player->turnheld];\r\n\t\t\t\tif (AngleTurn < 0) { AngleTurn += 3; }\r\n\t\t\t\tAngleTurn >>= 2;\r\n\r\n\t\t\t\tplayer->angleturn = -AngleTurn << 17;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (buttons & PAD_UP)\r\n\t{\r\n\t\tForwardMove = vblsinframe[playernum] * forwardmove[speed];\r\n\t\tif (ForwardMove < 0) { ForwardMove += 3; }\r\n\r\n\t\tplayer->forwardmove = (ForwardMove >> 2);\r\n\t}\r\n\telse if (buttons & PAD_DOWN)\r\n\t{\r\n\t\tForwardMove = -vblsinframe[playernum] * forwardmove[speed];\r\n\t\tif (ForwardMove < 0) { ForwardMove += 3; }\r\n\r\n\t\tplayer->forwardmove = (ForwardMove >> 2);\r\n\t}\r\n\r\n\t/* */\r\n\t/* if slowed down to a stop, change to a standing frame */\r\n\t/* */\r\n\tmo = player->mo;\r\n\r\n\tif (!mo->momx && !mo->momy && player->forwardmove == 0 && player->sidemove == 0 )\r\n\t{\t/* if in a walking frame, stop moving */\r\n\t\tif (mo->state == &states[S_PLAY_RUN1]\r\n\t\t|| mo->state == &states[S_PLAY_RUN2]\r\n\t\t|| mo->state == &states[S_PLAY_RUN3]\r\n\t\t|| mo->state == &states[S_PLAY_RUN4])\r\n\t\t\tP_SetMobjState (mo, S_PLAY);\r\n\t}\r\n}\r\n\r\n\r\n/*\r\n===============================================================================\r\n\r\n\t\t\t\t\t\tmovement\r\n\r\n===============================================================================\r\n*/\r\n\r\n#define MAXBOB\t\t\t0x100000\t\t/* 16 pixels of bob */\r\n\r\nboolean\t\tonground;//80077FF4, iGp00000be4\r\n\r\n/*\r\n==================\r\n=\r\n= P_Thrust\r\n=\r\n= moves the given origin along a given angle\r\n=\r\n==================\r\n*/\r\n//inline\r\nvoid P_Thrust (player_t *player, angle_t angle, fixed_t move) //L8002A188()\r\n{\r\n\tangle >>= ANGLETOFINESHIFT;\r\n\tplayer->mo->momx += (move >> 8)*(finecosine[angle] >> 8);\r\n\tplayer->mo->momy += (move >> 8)*(finesine[angle] >> 8);\r\n}\r\n\r\n\r\n\r\n/*\r\n==================\r\n=\r\n= P_CalcHeight\r\n=\r\n= Calculate the walking / running height adjustment\r\n=\r\n==================\r\n*/\r\n\r\nvoid P_CalcHeight (player_t *player) //L8002A1FC()\r\n{\r\n\tint\t\t\tangle;\r\n\tfixed_t\t\tbob;\r\n\tfixed_t\t\tval;\r\n\r\n\t/* */\r\n\t/* regular movement bobbing (needs to be calculated for gun swing even */\r\n\t/* if not on ground) */\r\n\t/* OPTIMIZE: tablify angle  */\r\n\t/* */\r\n\tval = player->mo->momx>>8;\r\n\tplayer->bob = val*val;\r\n\tval = player->mo->momy>>8;\r\n\tplayer->bob += val*val;\r\n\r\n\tplayer->bob >>= 4;\r\n\tif (player->bob > MAXBOB)\r\n\t{\r\n\t\tplayer->bob = MAXBOB;\r\n\t}\r\n\r\n\tif (!onground)\r\n\t{\r\n\t\tplayer->viewz = player->mo->z + VIEWHEIGHT;\r\n\t\tif (player->viewz > player->mo->ceilingz-4*FRACUNIT)\r\n\t\t\tplayer->viewz = player->mo->ceilingz-4*FRACUNIT;\r\n\t\treturn;\r\n\t}\r\n\r\n\t//angle = (FINEANGLES/40*gamevbls)&(FINEANGLES-1);\r\n\tangle = (FINEANGLES/40*ticon)&(FINEANGLES-1);\r\n\tbob = (player->bob >> 17) * finesine[angle];\r\n\r\n\t/* */\r\n\t/* move viewheight */\r\n\t/* */\r\n\tif (player->playerstate == PST_LIVE)\r\n\t{\r\n\t\tplayer->viewheight += player->deltaviewheight;\r\n\t\tif (player->viewheight > VIEWHEIGHT)\r\n\t\t{\r\n\t\t\tplayer->viewheight = VIEWHEIGHT;\r\n\t\t\tplayer->deltaviewheight = 0;\r\n\t\t}\r\n\t\tif (player->viewheight < VIEWHEIGHT/2)\r\n\t\t{\r\n\t\t\tplayer->viewheight = VIEWHEIGHT/2;\r\n\t\t\tif (player->deltaviewheight <= 0)\r\n\t\t\t\tplayer->deltaviewheight = 1;\r\n\t\t}\r\n\r\n\t\tif (player->deltaviewheight)\r\n\t\t{\r\n\t\t\tplayer->deltaviewheight += FRACUNIT/2;\r\n\t\t\tif (!player->deltaviewheight)\r\n\t\t\t\tplayer->deltaviewheight = 1;\r\n\t\t}\r\n\t}\r\n\tplayer->viewz = player->mo->z + player->viewheight + bob;\r\n\tif (player->viewz > player->mo->ceilingz-4*FRACUNIT)\r\n\t\tplayer->viewz = player->mo->ceilingz-4*FRACUNIT;\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= P_MovePlayer\r\n=\r\n=================\r\n*/\r\n\r\nvoid P_MovePlayer (player_t *player)//L8002A3B8()\r\n{\r\n\tplayer->mo->angle += player->angleturn;\r\n\r\n\t/* don't let the player control movement if not onground */\r\n\tonground = (player->mo->z <= player->mo->floorz);\r\n\r\n\tif (player->forwardmove && onground)\r\n\t\tP_Thrust (player, player->mo->angle, player->forwardmove);\r\n\tif (player->sidemove && onground)\r\n        P_Thrust (player, player->mo->angle-ANG90, player->sidemove);\r\n\r\n\tif ((player->forwardmove || player->sidemove) && player->mo->state == &states[S_PLAY])\r\n\t\tP_SetMobjState (player->mo, S_PLAY_RUN1);\r\n}\r\n\r\n\r\n/*\r\n=================\r\n=\r\n= P_DeathThink\r\n=\r\n=================\r\n*/\r\n\r\n#define\t\tANG5\t(ANG90/18)\r\n\r\nvoid P_DeathThink (player_t *player)//L8002A570()\r\n{\r\n\tangle_t\t\tangle, delta;\r\n\r\n\tP_MovePsprites (player);\r\n\r\n\t/* fall to the ground */\r\n\tif (player->viewheight > 8*FRACUNIT)\r\n\t\tplayer->viewheight -= FRACUNIT;\r\n\tonground = (player->mo->z <= player->mo->floorz);\r\n\tP_CalcHeight (player);\r\n\r\n\tif (player->attacker && player->attacker != player->mo)\r\n\t{\r\n\t\tangle = R_PointToAngle2 (player->mo->x, player->mo->y, player->attacker->x, player->attacker->y);\r\n\t\tdelta = angle - player->mo->angle;\r\n\t\tif (delta < ANG5 || delta > (unsigned)-ANG5)\r\n\t\t{\t/* looking at killer, so fade damage flash down */\r\n\t\t\tplayer->mo->angle = angle;\r\n\t\t\tif (player->damagecount)\r\n\t\t\t\tplayer->damagecount--;\r\n\t\t}\r\n\t\telse if (delta < ANG180)\r\n\t\t\tplayer->mo->angle += ANG5;\r\n\t\telse\r\n\t\t\tplayer->mo->angle -= ANG5;\r\n\t}\r\n\telse if (player->damagecount)\r\n\t\tplayer->damagecount--;\r\n\r\n\r\n\tif (((byte)ticbuttons[playernum] != 0) && (player->viewheight <= 8*FRACUNIT))\r\n    {\r\n\t\tplayer->playerstate = PST_REBORN;\r\n    }\r\n}\r\n\r\n\r\n\r\n/*\r\n=================\r\n=\r\n= P_PlayerThink\r\n=\r\n=================\r\n*/\r\n\r\n//extern int ticphase;\r\n\r\nvoid P_PlayerThink (player_t *player)//L8002A6C8()\r\n{\r\n\tint\t\t     buttons, oldbuttons;\r\n\tbuttons_t    *cbutton;\r\n\tweapontype_t weapon, lastweapon;\r\n\r\n\tbuttons = ticbuttons[playernum];\r\n\toldbuttons = oldticbuttons[playernum];\r\n\tcbutton = BT_DATA[playernum];\r\n\r\n\t/* */\r\n\t/* check for weapon change */\r\n\t/* */\r\n\tif (player->playerstate == PST_LIVE)\r\n\t{\r\n\t\tweapon = player->pendingweapon;\r\n\t\tif (weapon == wp_nochange)\r\n\t\t\tweapon = player->readyweapon;\r\n\r\n\t\tlastweapon = weaponowned[weapon];\r\n\t\tweapon = lastweapon;\r\n\t\tif ((buttons & cbutton->BT_WEAPONBACKWARD) && !(oldbuttons & cbutton->BT_WEAPONBACKWARD))\r\n\t\t{\r\n\t\t\tif (!lastweapon && player->weaponowned[wp_chainsaw])\r\n\t\t\t{\r\n\t\t\t\tlastweapon = wp_pistol;\r\n\t\t\t}\r\n\t\t\telse if(lastweapon > wp_fist)\r\n\t\t\t{\r\n\t\t\t    weapon -= 1;\r\n\t\t\t\tif (!player->weaponowned[weapon] && (weapon > wp_fist))\r\n\t\t\t\t{\r\n                    weapon -= 1;\r\n                    while (!player->weaponowned[weapon] && (weapon > wp_fist))\r\n                    {\r\n                        weapon -= 1;\r\n                    }\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if ((buttons & cbutton->BT_WEAPONFORWARD) && !(oldbuttons & cbutton->BT_WEAPONFORWARD))\r\n\t\t{\r\n\t\t\tif (lastweapon < wp_chainsaw)\r\n\t\t\t{\r\n\t\t\t\tweapon += 1;\r\n\t\t\t\tif (!player->weaponowned[weapon] && (weapon < wp_chainsaw))\r\n\t\t\t\t{\r\n\t\t\t\t\tweapon += 1;\r\n\t\t\t\t\twhile (!player->weaponowned[weapon] && (weapon < wp_chainsaw))\r\n                    {\r\n                        weapon += 1;\r\n                    }\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (weapon == wp_chainsaw)\r\n\t\t\t{\r\n\t\t\t\tweapon = wp_bfg;\r\n\t\t\t\tif (!player->weaponowned[wp_bfg])\r\n\t\t\t\t{\r\n\t\t\t\t\tdo\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tweapon -= 1;\r\n\t\t\t\t\t} while (!player->weaponowned[weapon]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (weapon != lastweapon)\r\n\t\t{\r\n\t\t\tif ((weapon == wp_fist) && (player->readyweapon != wp_chainsaw))\r\n\t\t\t{\r\n\t\t\t\tweapon = (player->weaponowned[wp_chainsaw] > 0) << 3;\r\n\t\t\t}\r\n\t\t\tplayer->pendingweapon = weapon;\r\n\t\t}\r\n\t}\r\n\r\n\tif (!gamepaused)\r\n\t{\r\n\t\tP_PlayerMobjThink(player->mo);\r\n\t\tP_BuildMove(player);\r\n\r\n\t\tif (player->playerstate == PST_DEAD)\r\n\t\t{\r\n\t\t\tP_DeathThink(player);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/* */\r\n\t\t/* chain saw run forward */\r\n\t\t/* */\r\n\t\tif (player->mo->flags & MF_JUSTATTACKED)\r\n\t\t{\r\n\t\t\tplayer->angleturn = 0;\r\n\t\t\tplayer->forwardmove = 0xc800;\r\n\t\t\tplayer->sidemove = 0;\r\n\t\t\tplayer->mo->flags &= ~MF_JUSTATTACKED;\r\n\t\t}\r\n\r\n\t\t/* */\r\n\t\t/* move around */\r\n\t\t/* reactiontime is used to prevent movement for a bit after a teleport */\r\n\t\t/* */\r\n\r\n\t\tif (player->mo->reactiontime)\r\n\t\t\tplayer->mo->reactiontime--;\r\n\t\telse\r\n\t\t\tP_MovePlayer(player);\r\n\r\n\t\tP_CalcHeight(player);\r\n\t\tif (player->mo->subsector->sector->special)\r\n\t\t{\r\n\t\t\tP_PlayerInSpecialSector(player);\r\n\r\n\t\t\tif (player->playerstate == PST_DEAD)\r\n\t\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/* */\r\n\t\t/* check for use */\r\n\t\t/* */\r\n\r\n\t\tif (buttons & cbutton->BT_USE)\r\n\t\t{\r\n\t\t\tif (player->usedown == false)\r\n\t\t\t{\r\n\t\t\t\tP_UseLines(player);\r\n\t\t\t\tplayer->usedown = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t\tplayer->usedown = false;\r\n\r\n\t\tif (buttons & cbutton->BT_ATTACK)\r\n\t\t{\r\n\t\t\tP_SetMobjState(player->mo, S_PLAY_ATK1);\r\n\r\n\t\t\tplayer->attackdown++;\r\n\t\t\tif (player->attackdown > 30 && playernum == consoleplayer &&\r\n               (player->readyweapon == wp_chaingun || player->readyweapon == wp_plasma))\r\n            {\r\n                stbar.specialFace = f_mowdown;\r\n            }\r\n\t\t}\r\n\t\telse\r\n\t\t\tplayer->attackdown = 0;\r\n\r\n\t\t/* */\r\n\t\t/* cycle psprites */\r\n\t\t/* */\r\n\r\n\t\tP_MovePsprites(player);\r\n\r\n\t\t/* */\r\n\t\t/* counters */\r\n\t\t/* */\r\n\r\n\t\tif (gamevbls < gametic)\r\n\t\t{\r\n\t\t\tif (player->powers[pw_strength])\r\n\t\t\t\tplayer->powers[pw_strength]++;\t/* strength counts up to diminish fade */\r\n\r\n\t\t\tif (player->powers[pw_invulnerability])\r\n\t\t\t\tplayer->powers[pw_invulnerability]--;\r\n\r\n\t\t\tif (player->powers[pw_invisibility])\r\n\t\t\t{\r\n\t\t\t\tplayer->powers[pw_invisibility]--;\r\n\t\t\t\tif (!player->powers[pw_invisibility])\r\n\t\t\t\t{\r\n\t\t\t\t\tplayer->mo->flags &= ~(MF_BLENDMASK1 | MF_BLENDMASK2 | MF_BLENDMASK3);\r\n\t\t\t\t}\r\n\t\t\t\telse if ((player->powers[pw_invisibility] < 61) && !(player->powers[pw_invisibility] & 7))\r\n                {\r\n                    player->mo->flags ^= (MF_BLENDMASK1 | MF_BLENDMASK2 | MF_BLENDMASK3);\r\n                }\r\n\t\t\t}\r\n\r\n            if (player->powers[pw_infrared])\r\n                player->powers[pw_infrared]--;\r\n\r\n            if (player->powers[pw_ironfeet])\r\n                player->powers[pw_ironfeet]--;\r\n\r\n            if (player->damagecount)\r\n                player->damagecount--;\r\n\r\n            if (player->bonuscount)\r\n                player->bonuscount--;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "PSXDOOM/psxmain.c",
    "content": "/*-------------------------------------------------**\r\n**                                                 **\r\n**-------------------------------------------------*/\r\n\r\n/* SONY LIBRARIES */\r\n#include <sys/types.h>\r\n#include <r3000.h>\r\n#include <asm.h>\r\n#include <kernel.h>\r\n#include <libetc.h>\r\n#include <libgte.h>\r\n#include <libgpu.h>\r\n#include <libsn.h>\r\n#include <libgs.h>\r\n#include <libapi.h>\r\n#include <libcomb.h>\r\n#include <libetc.h>\r\n#include <sys/file.h> //O_RDONLY|O_WRONLY|O_NOWAIT\r\n#include <sys/ioctl.h>\r\n\r\n//---------------------------------------\r\n\r\n#include \"doomdef.h\"\r\n#include \"r_local.h\"\r\n\r\nDRAWENV\tdraw[2];\t\t\t\t\t/* draw environment */      //800A8E90, 800A8EEC\r\nDISPENV disp[2];\t\t\t\t\t/* display environment*/    //800a8f48, 800A8F5C\r\n\r\nlong drawside;//80077F20\r\n\r\nint\tdrawsync1;//80077FE4\r\nint\tdrawsync2;//80077F3C\r\nextern int\tv_sync;//80077CC8\r\n\r\n#define OTSIZE\t(1<<14)//16384\r\nunsigned long\tot[OTSIZE];//80086378 psxdoom ot\r\nunsigned long\t*sys_ot[2] = {ot, ot};//off_80077A44[0], off_80077A48[1]\r\n\r\n#define\tBUFFSIZE\t(8)\r\nstatic long fr, fw;//80078058, 80077D40\r\nstatic unsigned long ev_r, ev_w, ev_e;\t//read/write/error event descriptor //80077D50, 80077E6C,\r\nstatic char recbuf[BUFFSIZE];//0x80077cd4\r\nstatic char senbuf[BUFFSIZE];//0x80077ddc\r\n\r\n// Vram\r\nunsigned int PagesXY[12][2] =\r\n{\r\n\t//0x80073aac, 0x80073ab0\r\n\t{ 512 ,  0  },\r\n\t{ 640 ,  0  },\r\n\t{ 768 ,  0  },\r\n\t{ 896 ,  0  },\r\n\t{  0  , 256 },\r\n\t{ 128 , 256 },\r\n\t{ 256 , 256 },\r\n\t{ 384 , 256 },\r\n\t{ 512 , 256 },\r\n\t{ 640 , 256 },\r\n\t{ 768 , 256 },\r\n\t{ 896 , 256 },\r\n};\r\n//unsigned char *vram_cache;//80077DA0\r\n\r\nint PageCount = 0;//*(r28 + 2628)\r\nint TextureCacheIdx = 0;//80077A40\r\nint xycount = 0;  //*(r28 + 3212);\r\nint xcount = 0;   //*(r28 + 3320)\r\nint ycount = 0;   //*(r28 + 3324)\r\nint V_PagFlags = 0;//*(r28 + 1576)//80077A38\r\n\r\nint main()\r\n{\r\n\tD_DoomMain ();\r\n\treturn (0);\r\n}\r\n\r\nvoid PSX_INIT(void)//L80032804()\r\n{\r\n    ResetCallback();\r\n    PadInit(0);\r\n    ResetGraph(0);\r\n    SetGraphDebug(0);\r\n\r\n    InitGeom();\r\n    SetGeomScreen(128);\r\n    SetGeomOffset(128, 100);\r\n\r\n    SetDefDrawEnv(&draw[0], 0, 0, 256, 240);\r\n    draw[0].isbg = 1;\r\n    draw[0].dtd = 0;\r\n    SetDefDrawEnv(&draw[1], 256, 0, 256, 240);\r\n    draw[1].isbg = 1;\r\n    draw[1].dtd = 0;\r\n    SetDefDispEnv(&disp[0], 256, 0, 256, 240);\r\n    SetDefDispEnv(&disp[1], 0, 0, 256, 240);\r\n\r\n    drawside = 0;\r\n\r\n    EnterCriticalSection();\r\n    //__asm__(\"nop\");\r\n    ExitCriticalSection();\r\n\r\n    /* Initialize link cable communications */\r\n    {\r\n        /* attacth the SIO driver to the kernel */\r\n        AddCOMB();\r\n\r\n        /* open an event to detect the end of read operation */\r\n        ev_r = OpenEvent(HwSIO, EvSpIOER, EvMdNOINTR, NULL);\r\n        EnableEvent(ev_r);\r\n\r\n        /* open an event to detect the end of write operation */\r\n        ev_w = OpenEvent(HwSIO, EvSpIOEW, EvMdNOINTR, NULL);\r\n        EnableEvent(ev_w);\r\n\r\n        /* open stream for writing */\r\n        fw = open(\"sio:\", O_WRONLY);\r\n\r\n        /* open stream for reading */\r\n        fr = open(\"sio:\", O_RDONLY|O_NOWAIT);\r\n\r\n        /* set comminucation rate */\r\n        CombSetBPS(38400);\r\n    }\r\n\r\n    DrawRender();\r\n    DrawRender();\r\n\r\n    SetDispMask(1);\r\n}\r\n\r\n#include <stdarg.h> //va_list|va_start|va_end\r\nvoid I_Error(char *error, ...)//L800329BC\r\n{\r\n    int Fnt;\r\n    char buffer[256];\r\n\tva_list args;\r\n\tva_start (args, error);\r\n\tD_vsprintf (buffer, error, args);\r\n\tva_end (args);\r\n\tDrawRender();\r\n\r\n\tFntLoad(960, 256); // load the font from the BIOS into the framebuffer\r\n\tFnt = FntOpen(0, 0, 256, 200, 0, 256);\r\n\tSetDumpFnt(Fnt); // screen X,Y | max text length X,Y | autmatic background clear 0,1 | max characters\r\n\r\n\tFntPrint(\"\\n\\n\\n %s\", buffer);\r\n\tFntFlush(Fnt);// refresh the font\r\n\tDrawRender();\r\n\twhile (1){} // draw and display forever\r\n}\r\n\r\nvoid ImageToVram(psxobj_t *pic, char *name, int lump)//L80032A68()\r\n{\r\n\tint w, h;\r\n\tbyte *data;\r\n\r\n\tif (name) {\r\n\t\tlump = W_GetNumForName(name);\r\n\t}\r\n\r\n\tdata = (byte *)W_CacheLumpNum(lump, PU_CACHE, false);\r\n\r\n\tif (!lumpencode[lump]) {\r\n\t\tdecode(data, tempbuffer);\r\n\t\tdata = (byte *)&tempbuffer;\r\n\t}\r\n\r\n\t/* vram xy_wh */\r\n\tpic->x = BIGSHORT(((patchpsx_t*)data)->leftoffset);\r\n\tpic->y = BIGSHORT(((patchpsx_t*)data)->topoffset);\r\n\tpic->w = BIGSHORT(((patchpsx_t*)data)->width);\r\n\tpic->h = BIGSHORT(((patchpsx_t*)data)->height);\r\n\r\n\t/* vram base x */\r\n\tw = (int)BIGSHORT(((patchpsx_t*)data)->width) + 0xf;\r\n\tif (w < 0) {\r\n\t\tw = (int)BIGSHORT(((patchpsx_t*)data)->width) + 0x1e;\r\n\t}\r\n\tpic->vbasex = (short)(w >> 4);\r\n\r\n\t/* vram base y */\r\n\th = (int)BIGSHORT(((patchpsx_t*)data)->height) + 0xf;\r\n\tif (h < 0) {\r\n\t\th = (int)BIGSHORT(((patchpsx_t*)data)->height) + 0x1e;\r\n\t}\r\n\tpic->vbasey = (short)(h >> 4);\r\n\r\n\t/* vram tpage */\r\n\tpic->vtpage = 0;\r\n\r\n\t/* vram lump */\r\n\tpic->lump = (short)lump;\r\n\r\n\tTextureCache(pic);\r\n}\r\n\r\nvoid DrawStaticImage(psxobj_t *psxobj, int xpos, int ypos, int pal)//L80032B78()\r\n{\r\n\tTextureCache(psxobj);\r\n\tDrawImage(psxobj->vtpage, pal, xpos, ypos, psxobj->vramx, psxobj->vramy, psxobj->w, psxobj->h);\r\n}\r\n\r\nvoid DrawImage(int vtpage, int pal, int xpos, int ypos,  char vramx, char vramy, int width, int height)//L80032BF8()\r\n{\r\n\tDR_MODE *drawmode = (DR_MODE*) getScratchAddr(128);//1F800200\r\n\tSPRT *pic = (SPRT*) getScratchAddr(128);//1F800200\r\n\r\n\tSetDrawMode(drawmode, 0, 0, vtpage, NULL);\r\n\tW_AddPrim(drawmode);// add to order table\r\n\r\n\tsetSprt(pic);\r\n\tsetRGB0(pic, 128, 128, 128);\r\n\tsetUV0(pic, vramx, vramy);\r\n\tsetWH(pic, width, height);\r\n\tsetXY0(pic, xpos, ypos);\r\n\tpic->clut = pal;\r\n\tW_AddPrim(pic);// add to order table\r\n}\r\n\r\nvoid P_LoadingPlaque(psxobj_t *psxobj, int xpos, int ypos, int pal)//L80033154()\r\n{\r\n\tDrawSync(0);\r\n\tMoveImage(&disp[drawside].disp, disp[drawside^1].disp.x, disp[drawside^1].disp.y);\r\n\r\n\t//Setup Loading Image Obj\r\n\tNextTextureCacheIdx();\r\n\tTextureCache(psxobj);\r\n\r\n\tDrawImage(psxobj->vtpage, pal, xpos, ypos, psxobj->vramx, psxobj->vramy, psxobj->w, psxobj->h);\r\n\r\n\tUpdateDrawOTag();\r\n\tDrawRender();\r\n}\r\n\r\nvoid NextTextureCacheIdx(void)//L8003324C()\r\n{\r\n    TextureCacheIdx += 1;\r\n}\r\n\r\n#if SHOWFPS\r\nint fps;\r\n#endif // SHOWFPS\r\n\r\nvoid DrawRender(void)//80033264\r\n{\r\n\tDrawSync(0);\r\n\r\n\t#if SHOWFPS\r\n    fps = VSync(0);\r\n    #else\r\n    VSync(0);\r\n    #endif // SHOWFPS\r\n\r\n\tdrawside ^= 1;\r\n\r\n\tPutDrawEnv(&draw[drawside]);\r\n\tPutDispEnv(&disp[drawside]);\r\n\r\n\tdo\r\n    {\r\n\t\tv_sync = VSync(-1);\r\n\t\tdrawsync1 = v_sync - drawsync2;\r\n\t} while(drawsync1 < 2);\r\n\r\n    if (demoplayback || demorecording)\r\n    {\r\n        do\r\n        {\r\n            v_sync = VSync(-1);\r\n            drawsync1 = v_sync - drawsync2;\r\n        } while(drawsync1 < 4);\r\n        drawsync1 = 4;\r\n    }\r\n\r\n    drawsync2 = v_sync;\r\n}\r\n\r\nvoid Add_vsync(void)//L80033380()\r\n{\r\n    v_sync++;\r\n}\r\n\r\n/* VRAM memory allocation structure */\r\ntypedef struct v_vrammem\r\n{\r\n\tpsxobj_t *imgobj[MAX_VRAMMEM];\t\t\t// ptr to start addr of image\r\n} VRAMMEM;\r\n\r\nVRAMMEM *vram_cache;//80077DA0\r\n\r\n//uGp00000628\tV_PagFlags\r\n//iGp00000990\tvram_cache\r\n//uGp00000a44\tPageCount\r\n//uGp00000c8c\txycount\r\n//uGp00000cf8\txcount\r\n//uGp00000cfc\tycount\r\n//uGp00000630\tTextureCacheIdx\r\n\r\nvoid Init_Vram_Cache(void)//800333A0\r\n{\r\n\tvram_cache = (VRAMMEM *)Z_Malloc((sizeof(VRAMMEM) * MAX_DYNAMIC_TPAGE), PU_STATIC, 0);\r\n\tD_memset(vram_cache, 0, (sizeof(VRAMMEM)  *MAX_DYNAMIC_TPAGE));\r\n\tValloc_Init();\r\n}\r\n\r\nvoid TextureCache(psxobj_t *psxobj)\r\n{\r\n\tRECT\t\t\tframe;\r\n\tpsxobj_t\t    **imgobj;\r\n\tunsigned long\t*vram, *vram2;\r\n\tbyte\t\t\t*tmp;\r\n\tpsxobj_t\t\t*psxobj1;\r\n\tbyte\t\t\t*data;\r\n\tunsigned int\tlastpage;\r\n\tint             x, y;\r\n\tshort\t\t    xs, ys;\r\n\r\n\tlastpage = PageCount;\r\n\tpsxobj->index = TextureCacheIdx;\r\n\r\n\tif (psxobj->vtpage == 0)\r\n\t{\r\n\tcheck_again:\r\n\t\tif ((psxobj->vbasex + xcount) > MIN_VRAM_ALLOC_SIZE)\r\n\t\t{\r\n\t\t\tycount += xycount;\r\n\t\t\txcount = 0;\r\n\t\t\txycount = 0;\r\n\t\t}\r\n\r\n\t\tif ((psxobj->vbasey + ycount) > MIN_VRAM_ALLOC_SIZE)\r\n\t\t{\r\n\t\t\tdo\r\n\t\t\t{\r\n\t\t\t\tPageCount = (PageCount + 1) % MAX_DYNAMIC_TPAGE;\r\n\t\t\t} while ((V_PagFlags >> (PageCount & 0x1f) & 1U) != 0);\r\n\r\n\t\t\tif (PageCount == lastpage)\r\n\t\t\t{\r\n\t\t\t\tI_Error(\"Texture Cache Overflow\\n\");\r\n\t\t\t}\r\n\t\t\txcount = 0;\r\n\t\t\tycount = 0;\r\n\t\t\txycount = 0;\r\n\t\t}\r\n\r\n\t\timgobj = &vram_cache[PageCount].imgobj[(ycount * MIN_VRAM_ALLOC_SIZE) + xcount];\r\n\r\n\t\tvram = (unsigned long*)imgobj;\r\n\t\txs = psxobj->vbasex;\t// xsize of alloc block\r\n\t\tys = psxobj->vbasey;\t// ysize of alloc block\r\n\r\n\t\t// copy address object into the block\r\n\t\tfor (y = 0; y < ys; y++, vram += (MIN_VRAM_ALLOC_SIZE - xs))\r\n\t\t{\r\n\t\t\tfor (x = 0; x < xs; x++, vram++)\r\n\t\t\t{\r\n\t\t\t\tpsxobj1 = (psxobj_t *)*(unsigned long*)vram;//get address obj on vram\r\n\r\n\t\t\t\tif (psxobj1 != 0)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (psxobj1->index == TextureCacheIdx)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\txcount += psxobj1->vbasex;\r\n\t\t\t\t\t\tif (xycount < psxobj1->vbasey)\r\n\t\t\t\t\t\t\txycount = psxobj1->vbasey;\r\n\t\t\t\t\t\tgoto check_again;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tV_ClearBlock(psxobj1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvram2 = (unsigned long*)imgobj;\r\n\t\txs = psxobj->vbasex;\t// xsize of alloc block\r\n\t\tys = psxobj->vbasey;\t// ysize of alloc block\r\n\r\n\t\t// copy address object into the block\r\n\t\tfor (y = 0; y < ys; y++, vram2 += (MIN_VRAM_ALLOC_SIZE - xs))\r\n\t\t{\r\n\t\t\tfor (x = 0; x < xs; x++, vram2++)\r\n\t\t\t{\r\n\t\t\t\t*(unsigned long *)vram2 = (unsigned long)(void*)psxobj;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tdata = (byte *)W_CacheLumpNum(psxobj->lump, PU_CACHE, false);\r\n\t\tif (lumpencode[psxobj->lump] == 0)\r\n\t\t{\r\n\t\t\ttmp = (byte *)tempbuffer;\r\n\t\t\tdecode(data, tmp);\r\n\t\t\tdata = tmp;\r\n\t\t}\r\n\r\n\t\t// copy address vram into the object\r\n\t\tpsxobj->vptr = (unsigned long*)imgobj;\r\n\r\n\t\tframe.x = PagesXY[PageCount][0] + (xcount << 3);\r\n\t\tframe.y = PagesXY[PageCount][1] + (ycount << 4);\r\n\t\tframe.w = ((psxobj->w) << 16) >> 17;\r\n\t\tframe.h = psxobj->h;\r\n\t\tLoadImage(&frame, (unsigned long*)(byte*)(data + 8));\r\n\r\n\t\tpsxobj->vramx = (xcount << 4);\r\n\t\tpsxobj->vramy = (ycount << 4);\r\n\t\tpsxobj->vtpage = GetTPage(1, 0, (PageCount + 4) * 128, PagesXY[PageCount][1]);\r\n\r\n\t\txcount += psxobj->vbasex;\r\n\t\tif (xycount < psxobj->vbasey)\r\n\t\t\txycount = psxobj->vbasey;\r\n\t}\r\n}\r\n\r\nvoid V_ClearBlock(psxobj_t *psxobj)\r\n{\r\n\tunsigned long   *vmptr;\r\n\tint             x, y;\r\n\tshort\t\t    xs, ys;\r\n\r\n\tvmptr = (unsigned long *)psxobj->vptr;\r\n\r\n\tpsxobj->vtpage = 0;\t\t// erase texture page ID.\r\n\txs = psxobj->vbasex;\t// xsize of alloc block\r\n\tys = psxobj->vbasey;\t// ysize of alloc block\r\n\r\n\t// erase address block\r\n\tfor (y = 0; y < ys; y++, vmptr += (MIN_VRAM_ALLOC_SIZE - xs))\r\n\t{\r\n\t\tfor (x = 0; x < xs; x++, vmptr++)\r\n\t\t{\r\n\t\t\t*vmptr = 0; // zero block\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid Valloc_Init(void)\r\n{\r\n\tint\t\t\t    obj, j, i;\r\n\tshort\t\t    xs, ys;\r\n\tpsxobj_t\t    *psxobj;\r\n\tpsxobj_t\t    **imgobj;\r\n\tunsigned long   *vmptr;\r\n\tunsigned int    page;\r\n\tunsigned int    pagenum;\r\n\tunsigned int    flags;\r\n\r\n\tfor (page = 0; page < MAX_DYNAMIC_TPAGE; page = pagenum + 1)\r\n\t{\r\n\t\tdo\r\n\t\t{\r\n\t\t\tpagenum = page;\r\n\t\t\tpage = pagenum + 1;\r\n\t\t} while ((V_PagFlags >> (pagenum & 0x1f)) & 1U);\r\n\r\n\t\timgobj = vram_cache[pagenum].imgobj;\r\n\r\n\t\tfor (obj = 0; obj < MAX_VRAMMEM; obj++, imgobj++)\r\n\t\t{\r\n\t\t\tpsxobj = *imgobj;\r\n\t\t\tif (psxobj != 0)\r\n\t\t\t{\r\n\t\t\t\tvmptr = (unsigned long *)psxobj->vptr;\r\n\r\n\t\t\t\tpsxobj->vtpage = 0;\t\t// erase texture page ID.\r\n\t\t\t\txs = psxobj->vbasex;\t// xsize of alloc block\r\n\t\t\t\tys = psxobj->vbasey;\t// ysize of alloc block\r\n\r\n\t\t\t\t// erase address block\r\n\t\t\t\tfor (j = 0; j < ys; j++, vmptr += (MIN_VRAM_ALLOC_SIZE - xs))\r\n\t\t\t\t{\r\n\t\t\t\t\tfor (i = 0; i < xs; i++, vmptr++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t*vmptr = 0; // zero block\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Set Page Position\r\n\tPageCount = 0;\r\n\r\n\tflags = V_PagFlags & 1;\r\n\twhile (flags != 0)\r\n\t{\r\n\t\tPageCount = (PageCount + 1) % MAX_DYNAMIC_TPAGE;\r\n\t\tflags = V_PagFlags >> (PageCount & MAX_DYNAMIC_TPAGE) & 1;\r\n\t}\r\n\r\n\t//Reset Positions\r\n\txycount = 0;\r\n\txcount = 0;\r\n\tycount = 0;\r\n}\r\n\r\nvoid Vram_Viewer(int page)//80033938\r\n{\r\n    psxobj_t    **imgobj;\r\n\tpsxobj_t    *psxobj;\r\n\tint         i, xpos, ypos, w, y, h, obj;\r\n\tPOLY_FT4    *pagepic = (POLY_FT4*) getScratchAddr(128);//1F800200\r\n\tLINE_F2     *line = (LINE_F2*) getScratchAddr(128);//1F800200\r\n\r\n\tsetPolyFT4(pagepic);\r\n\tsetRGB0(pagepic, 128, 128, 128);\r\n\tsetXYWH(pagepic, 0, 0, 256, 240);\r\n\tsetUVWH(pagepic, 0, 0, 255, 255);\r\n\tpagepic->tpage = GetTPage(1, 0, (page + 4) * 128, PagesXY[page][1]);\r\n\tpagepic->clut =palette[0];\r\n\tW_AddPrim (pagepic);\r\n\r\n\timgobj = vram_cache[page].imgobj;\r\n\r\n\tfor (obj = 0; obj < MAX_VRAMMEM; obj++, imgobj++)\r\n\t{\r\n\t\tpsxobj = *imgobj;\r\n\r\n\t\tif(psxobj)\r\n\t\t{\r\n\t\t\ty = psxobj->vramy;\r\n\t\t\txpos = psxobj->vramx;\r\n\r\n\t\t\ty = (y << 4) - y << 4;\r\n\t\t\tif(y < 0)\r\n\t\t\t{\r\n\t\t\t\ty += 255;\r\n\t\t\t}\r\n\r\n\t\t\th = psxobj->h;\r\n\t\t\tw = psxobj->w;\r\n\r\n\t\t\th = (h << 4) - h << 4;\r\n\t\t\typos = y >> 8;\r\n\t\t\tif(h < 0)\r\n\t\t\t{\r\n\t\t\t\th += 255;\r\n\t\t\t}\r\n\t\t\th = (h >> 8);\r\n\r\n\t\t\tsetLineF2(line);\r\n\t\t\tsetRGB0(line, 255, 0, 0);\r\n\r\n\t\t\t//top line\r\n\t\t\tsetXY2(line, xpos, ypos, xpos + w, ypos);\r\n\t\t\tW_AddPrim (line);\r\n\r\n\t\t\t//right line\r\n\t\t\tsetXY2(line, xpos + w, ypos, xpos + w, ypos + h);\r\n\t\t\tW_AddPrim (line);\r\n\r\n\t\t\t//bottom line\r\n\t\t\tsetXY2(line, xpos + w, ypos + h, xpos, ypos + h);\r\n\t\t\tW_AddPrim (line);\r\n\r\n\t\t\t//left line\r\n\t\t\tsetXY2(line, xpos, ypos + h, xpos, ypos);\r\n\t\t\tW_AddPrim (line);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nboolean cancel_link; //0x80077A3C *(r28 + 1580)\r\n\r\nunsigned int TempConfiguration[8] = { PAD_TRIANGLE, PAD_CIRCLE, PAD_CROSS, PAD_SQUARE, PAD_L1, PAD_R1, PAD_L2, PAD_R2 };//80073c1c\r\nunsigned int ActualConfiguration[8] = { PAD_TRIANGLE, PAD_CIRCLE, PAD_CROSS, PAD_SQUARE, PAD_L1, PAD_R1, PAD_L2, PAD_R2 };\t//80073c3c\r\nunsigned int DefaultConfiguration[8] = { PAD_TRIANGLE, PAD_CIRCLE, PAD_CROSS, PAD_SQUARE, PAD_L1, PAD_R1, PAD_L2, PAD_R2 };\t//80073C5C\r\nunsigned int NewConfiguration[8];//0x80078120\r\n\r\nvoid Link_Conection(void)//L800345A0()\r\n{\r\n\t/* The following lines enclosed by square brackets are necessary for the current PSYQ SDK libcomb.lib */\r\n\t/* This is due to the version of libcomb.lib library used in the original PSXDOOM, it worked differently. */\r\n\t/* Also the CompaCTS macros were added as it is the current way to create links between two consoles */\r\n\t{\r\n\t    /* wait for DSR and CTS line to be asserted */\r\n        /* wait for other PlayStation to be powered-up */\r\n        while((CombSioStatus() & (COMB_DSR|COMB_CTS)) == 0x180 )\r\n        {\r\n            if (PadRead(0) & PAD_SELECT)\r\n            {\r\n                cancel_link = true;\r\n                CombCancelRead(); // Cancel async read request\r\n                return;\r\n            }\r\n        };\r\n\t}\r\n\r\n\t//if (_comb_control(3,0,0) != 0)\t//Original line\r\n\tif(CombCTS() == 0)  /* Return status of CTS */\r\n    {\r\n        consoleplayer = 0;\r\n        read(fr, recbuf, BUFFSIZE);\r\n        do\r\n        {\r\n            if (PadRead(0) & PAD_SELECT)\r\n\t\t\t{\r\n\t\t\t\tcancel_link = true;\r\n\t\t\t\tCombCancelRead(); // Cancel async read request\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n        } while (TestEvent(ev_r) == 0);\r\n\r\n        //do {} while (_comb_control(3,0,0) == 0);   //Original line\r\n        do {} while (CombCTS() == 0);   /* Return status of CTS */\r\n\r\n        write(fw, senbuf, BUFFSIZE);\r\n    }\r\n    else\r\n    {\r\n        consoleplayer = 1;\r\n        write(fw, senbuf, BUFFSIZE);\r\n        read(fr, recbuf, BUFFSIZE);\r\n        do\r\n        {\r\n            if (PadRead(0) & PAD_SELECT)\r\n\t\t\t{\r\n\t\t\t\tcancel_link = true;\r\n\t\t\t\tCombCancelRead(); // Cancel async read request\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n        } while (TestEvent(ev_r) == 0);\r\n    }\r\n\r\n\tSync_Data_Transmission();\r\n\r\n\tif (consoleplayer == 0)\r\n\t{\r\n\t\tsenbuf[1] = (char)starttype;\r\n\t\tsenbuf[2] = (char)startskill;\r\n\t\tsenbuf[3] = (char)startmap;\r\n\t\t*(int*)&senbuf[4] = Get_CfgCode(ActualConfiguration);\r\n\r\n\t\t//do {} while (_comb_control(3,0,0) == 0);   //Original line\r\n\t\tdo {} while (CombCTS() == 0);/* Return status of CTS */\r\n\r\n\t\twrite(fw, senbuf, BUFFSIZE);\r\n\t\tread(fr, recbuf, BUFFSIZE);\r\n\r\n\t\tdo {} while (TestEvent(ev_r) == 0);\r\n\r\n\t\tBT_DATA[0] = (buttons_t *)ActualConfiguration;\r\n\t\tBT_DATA[1] = (buttons_t *)Get_CfgByCode(*(int*)&recbuf[4]);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tread(fr, recbuf, BUFFSIZE);\r\n\r\n\t\tdo {} while (TestEvent(ev_r) == 0);\r\n\r\n\t\tstarttype = recbuf[1];\r\n\t\tstartskill = recbuf[2];\r\n\t\tstartmap = recbuf[3];\r\n\r\n\t\tBT_DATA[1] = (buttons_t *)ActualConfiguration;\r\n\t\tBT_DATA[0] = (buttons_t *)Get_CfgByCode(*(int*)&recbuf[4]);\r\n\r\n\t\t*(int*)&senbuf[4] = Get_CfgCode(ActualConfiguration);\r\n\r\n\t\t//do {} while (_comb_control(3,0,0) == 0);   //Original line\r\n\t\tdo {} while (CombCTS() == 0);/* Return status of CTS */\r\n\t\twrite(fw, senbuf, BUFFSIZE);\r\n\t}\r\n\tcancel_link = false;\r\n}\r\n\r\nboolean Update_Conection(void)//L80034868()\r\n{\r\n\tunsigned char up1, up2;\r\n\tlong side;\r\n\tboolean conection;\r\n\r\n\tup1 = players[0].mo->x ^ players[0].mo->y ^ players[1].mo->x ^ players[1].mo->y;\r\n    up2 = up1 ^ (up1 >> 8);\r\n    up2 = up2 ^ (up1 >> 16);\r\n\r\n\tsenbuf[0] = 170;//171 on final doom\r\n\tsenbuf[1] = up2;\r\n    senbuf[2] = *(char *)(vblsinframe + consoleplayer);\r\n\t*(int*)&senbuf[4] = ticbuttons[consoleplayer];\r\n\r\n\tSync_Read_Write();\r\n\r\n\tif (recbuf[0] == 170 && (recbuf[1] == senbuf[1]))//171 on final doom\r\n\t{\r\n        if (consoleplayer == 0)\r\n        {\r\n            ticbuttons[1] = *(int*)&recbuf[4];\r\n        }\r\n        else\r\n        {\r\n            ticbuttons[0] = *(int*)&recbuf[4];\r\n        }\r\n\r\n        if (consoleplayer == 0)\r\n            vblsinframe[1] = recbuf[2];\r\n        else\r\n            vblsinframe[0] = recbuf[2];\r\n\r\n        conection = false;\r\n\t}\r\n    else\r\n    {\r\n        DrawSync(0);\r\n\r\n        side = drawside ^ 1;\r\n        MoveImage(&disp[drawside].disp, disp[side].disp.x, disp[side].disp.y);\r\n\r\n        //Setup Net Error image obj\r\n        NextTextureCacheIdx();\r\n        TextureCache(&neterrpic);\r\n\r\n        DrawImage(neterrpic.vtpage, palette[16], 84, 109, neterrpic.vramx, neterrpic.vramy, neterrpic.w, neterrpic.h);\r\n\r\n        UpdateDrawOTag();\r\n        DrawRender();\r\n        Sync_Data_Transmission();\r\n\r\n        ticbuttons[1] = 0;\r\n        oldticbuttons[0] = 0;\r\n        ticbuttons[1] = 0;\r\n        oldticbuttons[0] = 0;\r\n\r\n        conection = true;\r\n    }\r\n\r\n    return conection;\r\n}\r\n\r\nvoid Sync_Data_Transmission(void) //L80034AC0()\r\n{\r\n\tint cnt;\r\n\r\n    cnt = 0;\r\n    Again:\r\n    do\r\n    {\r\n        senbuf[0] = (char)cnt;\r\n\r\n        /* Data transmission */\r\n        Sync_Read_Write();\r\n\r\n        if (recbuf[0] == senbuf[0])\r\n        {\r\n            cnt += 1;\r\n            if (cnt < 8) goto Again;\r\n        }\r\n\r\n        if (!(cnt < 8)) return;\r\n        cnt = 0;\r\n    } while( true );\r\n}\r\n\r\nvoid Sync_Read_Write (void) //L80034B1C()\r\n{\r\n\tint sync;\r\n\r\n\tdo\r\n\t{\r\n\t\tif (consoleplayer == 0)\r\n        {\r\n\t\t\t//do {} while (_comb_control(3,0,0) == 0);   //Original line\r\n\t\t\tdo {} while (CombCTS() == 0);   /* Return status of CTS */\r\n\r\n\t\t\twrite(fw, &senbuf, BUFFSIZE);\r\n\t\t\tread(fr, &recbuf, BUFFSIZE);\r\n\r\n\t\t\tsync = VSync(-1);\r\n\t\t\tdo\r\n            {\r\n\t\t\t\tif (TestEvent(ev_r) != 0) return;\r\n\r\n\t\t\t} while ((VSync(-1) - sync) < 300);\r\n\t\t}\r\n\t\telse\r\n        {\r\n\t\t\tread(fr, &recbuf, BUFFSIZE);\r\n\r\n\t\t\tsync = VSync(-1);\r\n\t\t\tdo\r\n            {\r\n\t\t\t\tif (TestEvent(ev_r) != 0)\r\n                {\r\n\t\t\t\t\t//do {} while (_comb_control(3,0,0) == 0);   //Original line\r\n\t\t\t\t\tdo {} while (CombCTS() == 0);   /* Return status of CTS */\r\n\t\t\t\t\twrite(fw, &senbuf, BUFFSIZE);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t} while ((VSync(-1) - sync) < 300);\r\n\t\t}\r\n\r\n\t\tCombResetError();   /* Reset error bits */\r\n\t} while( true );\r\n}\r\n\r\nvoid UpdateDrawOTag(void)//80034C60\r\n{\r\n\tif(sys_ot[0] != sys_ot[1])\r\n\t{\r\n\t\t*sys_ot[1] = 0xffffff;\r\n\t\tDrawOTag(sys_ot[0]);\r\n\t}\r\n\tsys_ot[0] = ot;\r\n\tsys_ot[1] = ot;\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= Get_CfgCode\r\n=\r\n= Encodes the buttons flags to send them to the link connection\r\n=\r\n==============\r\n*/\r\n\r\nunsigned int Get_CfgCode(unsigned int *cfgdata)//L80034CAC\r\n{\r\n    unsigned int *tmpcfg;\r\n\tint i, j, cfgcode;\r\n\r\n\ttmpcfg = TempConfiguration;\r\n\tcfgcode = 0;\r\n\r\n\tfor(i = 0; i < 8; i++, cfgdata++)\r\n\t{\r\n\t\tfor(j = 0; j < 8; j++, tmpcfg++)\r\n\t\t{\r\n\t\t\tif (*cfgdata == *tmpcfg)\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tcfgcode |= (j << (i << 2));\r\n\t}\r\n\r\n\treturn cfgcode;\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= Get_CfgByCode\r\n=\r\n= Decodes the value received from the link connection and turn them into the buttons flags\r\n=\r\n==============\r\n*/\r\n\r\nunsigned int *Get_CfgByCode(unsigned int cfgcode)//L80034D0C\r\n{\r\n\tunsigned int *tmpcfg;\r\n\tunsigned int *newcfg;\r\n\tunsigned int i, code;\r\n\r\n\ttmpcfg = TempConfiguration;\r\n\tnewcfg = NewConfiguration;\r\n\r\n\tfor(i = 0; i < 8; i++)\r\n\t{\r\n        code = (cfgcode >> (i << 2)) & 0xF;\r\n        *newcfg++ = *(tmpcfg + code);\r\n\t}\r\n\r\n\treturn NewConfiguration;\r\n}\r\n\r\n/*================================================================== */\r\n/* */\r\n/* W_AddPrim: Add primitive polygons to the buffer (ot), created by williams. */\r\n/* This function does not exist in the code as a function, it should have been a macro define. */\r\n/* */\r\n/*================================================================== */\r\n\r\n#define  GP0_GPUREAD ((unsigned long*)  getScratchAddr(1540))\r\n#define  GP1_GPUSTAT ((unsigned long*)  getScratchAddr(1541))\r\n\r\nvoid W_AddPrim (void* prim)\r\n{\r\n\tunsigned long *entry, *entry1;\r\n\tint length;\r\n\r\n\tentry1 = sys_ot[1];\r\n    do\r\n    {\r\n        length = getlen(prim);\r\n        entry = sys_ot[1];\r\n\r\n        if(sys_ot[1] >= sys_ot[0])\r\n        {\r\n            if((((length+1) + entry) < (ot + (OTSIZE))))\r\n            {\r\n            addprim:\r\n                entry = (length+1) + sys_ot[1];\r\n                sys_ot[1] = entry;\r\n\r\n                catPrim(entry1, sys_ot[1]);\r\n                setlen(entry1, length);\r\n                entry = (unsigned long *)prim+1;//skip prim->tag\r\n\r\n                //Copy prim to ot\r\n                while (length--)\r\n                {\r\n                    entry1++;\r\n                    *entry1 = *entry++;\r\n                }\r\n\r\n                while (sys_ot[0] != sys_ot[1])\r\n                {\r\n                    if((*GP1_GPUSTAT & 0x4000000) == 0)  {break;}\r\n\r\n                    entry = sys_ot[0];\r\n                    length = getlen(entry);\r\n                    sys_ot[0] = nextPrim(entry);\r\n\r\n                    //Copy address\r\n                    while (length--)\r\n                    {\r\n                        entry++;\r\n                        *GP0_GPUREAD = *entry;\r\n                    }\r\n                }\r\n                return;\r\n            }\r\n\r\n            sys_ot[1] = ot;\r\n            catPrim(entry1, sys_ot[1]);\r\n            setlen(entry1, 0);\r\n\r\n            entry1 = sys_ot[1];\r\n        }\r\n\r\n        if (((length+1) + entry) < sys_ot[0]) goto addprim;\r\n\r\n        while (sys_ot[0] != sys_ot[1])\r\n        {\r\n            if((*GP1_GPUSTAT & 0x4000000) == 0)  {break;}\r\n\r\n            entry = sys_ot[0];\r\n            length = getlen(entry);\r\n            sys_ot[0] = nextPrim(entry);\r\n\r\n            //Copy address\r\n            while (length--)\r\n            {\r\n                entry++;\r\n                *GP0_GPUREAD = *entry;\r\n            }\r\n        }\r\n    } while(1);\r\n}\r\n\r\n#if 0 //OLD VERSION\r\nvoid W_AddPrim (void* prim, unsigned long* addr0, unsigned long* addr1)\r\n{\r\n\tunsigned long *entry, *entry1;\r\n\tint length;\r\n\r\n\tentry1 = sys_ot[1];\r\n    do\r\n    {\r\n        length = getlen(prim);\r\n        entry = sys_ot[1];\r\n\r\n        if(sys_ot[1] >= sys_ot[0])\r\n        {\r\n            if((((length+1) + entry) < (ot + (OTSIZE))))\r\n            {\r\n            addprim:\r\n                entry = (length+1) + sys_ot[1];\r\n                sys_ot[1] = entry;\r\n\r\n                catPrim(entry1, sys_ot[1]);\r\n                setlen(entry1, length);\r\n                entry = (unsigned long *)prim+1;//skip prim->tag\r\n\r\n                //Copy prim to ot\r\n                while (length--)\r\n                {\r\n                    entry1++;\r\n                    *entry1 = *entry++;\r\n                }\r\n\r\n                if(sys_ot[0] != sys_ot[1])\r\n                {\r\n                    do {\r\n                        if((*addr1 & 0x4000000) == 0)  {break;}\r\n\r\n                        entry = sys_ot[0];\r\n                        length = getlen(entry);\r\n                        sys_ot[0] = nextPrim(entry);\r\n\r\n                        //Copy address\r\n                        while (length--)\r\n                        {\r\n                            entry++;\r\n                            *addr0 = *entry;\r\n                        }\r\n\r\n                    } while(sys_ot[0] != sys_ot[1]);\r\n                }\r\n                return;\r\n            }\r\n\r\n            sys_ot[1] = ot;\r\n            catPrim(entry1, sys_ot[1]);\r\n            setlen(entry1, 0);\r\n\r\n            entry1 = sys_ot[1];\r\n        }\r\n\r\n        if (((length+1) + entry) < sys_ot[0]) goto addprim;\r\n\r\n        if(sys_ot[0] != sys_ot[1])\r\n        {\r\n            do\r\n            {\r\n                if((*addr1 & 0x4000000) == 0)  {break;}\r\n\r\n                entry = sys_ot[0];\r\n                length = getlen(entry);\r\n                sys_ot[0] = nextPrim(entry);\r\n\r\n                //Copy address\r\n                while (length--)\r\n                {\r\n                    entry++;\r\n                    *addr0 = *entry;\r\n                }\r\n            } while (sys_ot[0] != sys_ot[1]);\r\n        }\r\n\r\n    } while(1);\r\n}\r\n#endif // 0\r\n/******************END OF MAIN.C*************************/\r\n"
  },
  {
    "path": "PSXDOOM/pw_main.c",
    "content": "/* pw_main.c -- password menu */\r\n\r\n#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n#include \"st_main.h\"\r\n#include \"r_local.h\"\r\n\r\n\r\nchar *passwordChar = \"bcdfghjklmnpqrstvwxyz0123456789!\";//80073B7C\r\nbyte Passwordbuff[12];//0x80096388\r\n\r\nint CurPasswordSlot = 0;//80077A70 iGp00000660\r\nint PassInvalidTic;//80077E58 uGp00000a48\r\nint PassCodePos;//80077F9C uGp00000b8c\r\n\r\nboolean doPassword = false;//80077A6C\r\n\r\n/*\r\n=================\r\n=\r\n= PW_Start\r\n=\r\n=================\r\n*/\r\n\r\nvoid PW_Start(void)//L80036C1C()\r\n{\r\n\tS_StartSound(NULL, sfx_pistol);\r\n\r\n\toldticbuttons[0] = ticbuttons[0];\r\n\toldticbuttons[1] = ticbuttons[1];\r\n\tm_vframe1[0] = 0;\r\n\tPassInvalidTic = 0;\r\n    PassCodePos = 0;\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= PW_Stop\r\n=\r\n=================\r\n*/\r\n\r\nvoid PW_Stop(int exit)//L80036C1C()\r\n{\r\n\tS_StartSound(NULL, 7);// SNDPSTOL.mid\r\n\tPassCodePos = 32;\r\n\tPW_Drawer();\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= PW_Ticker\r\n=\r\n=================\r\n*/\r\n\r\nint PW_Ticker(void)//L80036CA0()\r\n{\r\n    int buttons, levelnum, skill;\r\n\r\n    if(PassInvalidTic && (gamevbls < (int)gametic))\r\n    {\r\n        PassInvalidTic--;\r\n        if((PassInvalidTic & 7) == 4)\r\n            S_StartSound(0,0x18);\r\n    }\r\n\r\n    buttons = ticbuttons[0];\r\n\r\n    if (buttons & PAD_ARROWS)\r\n\t{\r\n        m_vframe1[0] -= vblsinframe[0];\r\n        if (m_vframe1[0] <= 0)\r\n        {\r\n            m_vframe1[0] = TICRATE;\r\n\r\n            if (buttons & PAD_DOWN)\r\n\t\t\t{\r\n\t\t\t\tif (PassCodePos < 24)\r\n                {\r\n                    PassCodePos += 8;\r\n                    S_StartSound(NULL, sfx_pstop);\r\n                }\r\n\t\t\t}\r\n\t\t\telse if (buttons & PAD_UP)\r\n\t\t\t{\r\n\t\t\t\tif (PassCodePos >= 8)\r\n                {\r\n\t\t\t\t    PassCodePos -= 8;\r\n                    S_StartSound(NULL, sfx_pstop);\r\n                }\r\n\t\t\t}\r\n\r\n\t\t\tif (buttons & PAD_RIGHT)\r\n\t\t\t{\r\n                PassCodePos += 1;\r\n                if (PassCodePos >= 32)\r\n                    PassCodePos = 31;\r\n                else\r\n                    S_StartSound(NULL, sfx_pstop);\r\n\t\t\t}\r\n\t\t\telse if (buttons & PAD_LEFT)\r\n\t\t\t{\r\n\t\t\t\tPassCodePos -= 1;\r\n                if (PassCodePos < 0)\r\n                    PassCodePos = 0;\r\n                else\r\n                    S_StartSound(NULL, sfx_pstop);\r\n\t\t\t}\r\n        }\r\n\t}\r\n\telse\r\n\t{\r\n\t\tm_vframe1[0] = 0;\r\n\t}\r\n\r\n\tif (buttons & (PAD_START | PAD_SELECT))\r\n\t\treturn ga_exit;// exit\r\n\r\n    if (buttons != oldticbuttons[0])\r\n\t{\r\n        if (buttons & (PAD_SQUARE | PAD_CROSS| PAD_CIRCLE))\r\n        {\r\n            S_StartSound(NULL, sfx_swtchx);\r\n            if (CurPasswordSlot < 10)\r\n            {\r\n                Passwordbuff[CurPasswordSlot] = PassCodePos;\r\n                CurPasswordSlot++;\r\n                if (CurPasswordSlot < 10)\r\n                    return ga_nothing;\r\n            }\r\n\r\n            if(Decode_Password(Passwordbuff, &levelnum, &skill, NULL))\r\n            {\r\n                startskill = skill;\r\n                startmap = levelnum;\r\n                gamemap = levelnum;\r\n                gameskill = skill;\r\n                doPassword = true; //80077A6C\r\n\r\n                //I_Error(\"startskill: %d\\n startmap: %d\", startskill, startmap);\r\n                return ga_warped;\r\n            }\r\n\r\n            PassInvalidTic = 16;\r\n        }\r\n        else if(buttons & PAD_TRIANGLE)\r\n        {\r\n            S_StartSound(NULL, sfx_swtchx);\r\n            CurPasswordSlot--;\r\n            if (CurPasswordSlot < 0)\r\n                CurPasswordSlot = 0;\r\n        }\r\n\r\n        Passwordbuff[CurPasswordSlot] = 0;\r\n\t}\r\n\r\n    return ga_nothing;\r\n}\r\n\r\n/*\r\n=================\r\n=\r\n= PW_Drawer\r\n=\r\n=================\r\n*/\r\n\r\nvoid PW_Drawer(void) //L80036F34()\r\n{\r\n    byte\tpass[2] = {0,0};\r\n\tbyte\tc;\r\n\tint\t\ttexid, cnt;\r\n\tint\t\txpos, ypos, pos1, pos2;\r\n\r\n\tDR_MODE *drawmode = (DR_MODE*) getScratchAddr(128);//1F800200\r\n\tSPRT *textsprite = (SPRT*) getScratchAddr(128);//1F800200\r\n\r\n\tNextTextureCacheIdx();\r\n\r\n\t//Draw Backround MARB01 Pic\r\n\tfor (ypos = 0; ypos < 4; ypos++)\r\n\t{\r\n\t\tfor (xpos = 0; xpos < 4; xpos++)\r\n\t\t{\r\n\t\t\tDrawStaticImage(&marb01pic, xpos << 6, ypos << 6, palette[0]);\r\n\t\t}\r\n\t}\r\n\r\n\tSetDrawMode(drawmode, 0, 0, statuspic.vtpage, NULL);\r\n\tW_AddPrim(drawmode);// add to order table\r\n\r\n\tsetSprt(textsprite);\r\n\ttextsprite->clut = palette[16];\r\n\r\n\tfor (cnt = 0; cnt < 32; cnt++)\r\n\t{\r\n\t    setRGB0(textsprite, 128, 128, 128);\r\n\r\n        pos1 = cnt;\r\n        if (cnt < 0)\r\n          pos1 = cnt + 7;\r\n\r\n        pos1 >>= 3;\r\n        pos2 = cnt - (pos1 << 3);\r\n\r\n        xpos = (pos2 * 20) + 48;\r\n        ypos = (pos1 * 20) + 60;\r\n\r\n        if (PassCodePos == cnt)\r\n\t\t{\r\n\t\t\tif (!(ticon & 4)) continue;\r\n\t\t\tsetRGB0(textsprite, 255, 0, 0);\r\n\t\t}\r\n\r\n        c = passwordChar[cnt];\r\n        if ((byte)(c - 'a') < 26)\r\n        {\r\n            texid = (byte)(c - 57);\r\n            ypos = (pos1 * 20) + 63;\r\n        }\r\n        else\r\n        {\r\n            if ((byte)(c - '0') < 10)\r\n\t\t\t{\r\n\t\t\t\ttexid = (byte)(c - '0');\r\n\t\t\t}\r\n\t\t\telse if (c == '!')\r\n\t\t\t{\r\n\t\t\t\ttexid = 12;\r\n\t\t\t}\r\n        }\r\n\r\n        setXY0(textsprite, xpos, ypos);\r\n        setUV0(textsprite, symboldata[texid].x, symboldata[texid].y);\r\n        setWH(textsprite, symboldata[texid].w, symboldata[texid].h);\r\n\r\n        W_AddPrim(textsprite);// add to order table\r\n\t}\r\n\r\n\tST_DrawText(-1,20,\"Password\");\r\n\r\n\txpos = 58;\r\n\typos = 160;\r\n\tfor (cnt = 0; cnt < CurPasswordSlot; cnt++)\r\n\t{\r\n\t    pass[0] = passwordChar[Passwordbuff[cnt]];\r\n\t\tST_DrawText(xpos, ypos, pass);//Draw Text\r\n\t\txpos += 14;\r\n\t}\r\n\r\n\tif (cnt < 10)\r\n\t{\r\n\t\txpos = (cnt * 14) + 58;\r\n\t\tdo\r\n\t\t{\r\n\t\t\tST_DrawText(xpos, ypos, \".\");//Draw Text\r\n\t\t\txpos += 14;\r\n\t\t\tcnt++;\r\n\t\t} while (cnt < 10);\r\n\t}\r\n\r\n\tif (PassInvalidTic & 4)//80077E58\r\n\t{\r\n\t\tST_DrawText(-1, 200, \"Invalid Password\");//Draw Text\r\n\t}\r\n\r\n\tUpdateDrawOTag();\r\n\tDrawRender();\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/r_data.c",
    "content": "/* R_data.c */\r\n\r\n#include \"doomdef.h\"\r\n#include \"r_local.h\"\r\n#include \"p_local.h\"\r\n\r\nint\t\t\tfirstflat;              //800780DC|iGp00000ccc\r\nint\t\t\tlastflat;               //80077F98|iGp00000b88\r\nint\t\t\tnumflats;               //80077FE8|iGp00000bd8\r\npsxobj_t\t*texflats;\t\t\t\t//80077F4C|puGp00000b3c\r\n\r\nint\t\t\tfirsttex;\t\t\t\t//80078104|iGp00000cf4\r\nint\t\t\tlasttex;\t\t\t\t//80077FC4|iGp00000bb4\r\nint\t\t\tnumtextures;\t\t\t//80077FFC|iGp00000bec\r\npsxobj_t\t*textures;\t\t\t\t//80077F50|puGp00000b40\r\n\r\nint\t\t\tfirstsprite;\t\t\t//80077E40|iGp00000a30\r\nint\t\t\tlastsprite;\t\t\t\t//80077D64|iGp00000954\r\nint\t\t\tnumsprites;\t\t\t\t//80077D88|iGp00000978\r\npsxobj_t\t*texsprites;\t\t\t//80077CF0|puGp000008e0\r\n\r\nint\t\t\t*flattranslation;\t\t//80077D8C|puGp00000988 /* for global animation */\r\nint\t\t\t*texturetranslation;\t//80077D98|puGp0000097c /* for global animation */\r\n\r\nshort\t\tskypalette;\t\t\t\t//800780F0 psx doom\r\npsxobj_t\t*skytexturep;\t\t\t//80077E7C\r\n\r\n#define MAX_PALETTES 20\r\nextern light_t *lights;\t\t\t    //80077E94\r\nextern short palette[MAX_PALETTES];\t//800A8E68\r\nextern short palettebase;\t\t\t//80077DA8\r\n\r\nvoid R_InitTextures(void);\r\nvoid R_InitFlats(void);\r\nvoid R_InitSprite(void);\r\nvoid R_InitPalettes(void);\r\n/*============================================================================ */\r\n\r\n/*\r\n================\r\n=\r\n= R_InitData\r\n=\r\n= Locates all the lumps that will be used by all views\r\n= Must be called after W_Init\r\n=================\r\n*/\r\n\r\nvoid R_InitData (void)//L8002B878()\r\n{\r\n    //printf(\"\\nR_InitData\\n\");\r\n\tR_InitPalettes();\r\n\tR_InitTextures();\r\n\tR_InitFlats();\r\n\tR_InitSprite();\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= R_InitTextures\r\n=\r\n= Initializes the texture list with the textures from the world map\r\n=\r\n==================\r\n*/\r\n\r\nvoid R_InitTextures(void)//L8002B8B0()\r\n{\r\n\tmaptexture_t\t*mtexture;\r\n\tpsxobj_t\t\t*texture;\r\n\tbyte\t        *data;\r\n\tint\t\t\t\twidth, height, lump, i;\r\n\r\n\tfirsttex = W_GetNumForName(\"T_START\") + 1;\r\n\tlasttex = W_GetNumForName(\"T_END\") - 1;\r\n\tnumtextures = (lasttex - firsttex) + 1;\r\n\r\n\ttextures = Z_Malloc(numtextures * (sizeof(psxobj_t) + sizeof(int)), PU_STATIC, 0);\r\n\ttexturetranslation = (int *) textures + (numtextures * (sizeof(psxobj_t)/4));\r\n\r\n\tdata = (byte *)W_CacheLumpName(\"TEXTURE1\", PU_CACHE, true);\r\n\ttexture = textures;\r\n\r\n\tmtexture = (maptexture_t *)data;\r\n\tfor (lump = firsttex; lump <= lasttex; lump++)\r\n\t{\r\n\t\ttexture->lump = lump;\r\n\t\ttexture->vtpage = 0;\r\n\r\n\t\ttexture->w = BIGSHORT(mtexture->width);\r\n\t\ttexture->h = BIGSHORT(mtexture->height);\r\n\r\n\t\twidth = texture->w + 15;\r\n\t\tif (width < 0) { width = texture->w + 30; }\r\n\r\n\t\theight = texture->h + 15;\r\n\t\tif (height < 0) { height = texture->h + 30; }\r\n\r\n\t\ttexture->vbasex = width >> 4;\r\n\t\ttexture->vbasey = height >> 4;\r\n\r\n\t\tmtexture++;\r\n\t\ttexture++;\r\n\t}\r\n\tZ_Free(data);\r\n\r\n\t/* */\r\n\t/* translation table for global animation */\r\n\t/* */\r\n\tfor (i = 0; i<numtextures; i++)\r\n\t\ttexturetranslation[i] = i;\r\n\r\n\tZ_FreeTags(mainzone, PU_CACHE);\r\n}\r\n\r\n/*\r\n================\r\n=\r\n= R_InitFlats\r\n=\r\n=================\r\n*/\r\n\r\nvoid R_InitFlats(void)//L8002BA20()\r\n{\r\n\tpsxobj_t    *flat;\r\n\tint\t\t\tlump, i;\r\n\r\n\tfirstflat = W_GetNumForName(\"F_START\") + 1;\r\n\tlastflat = W_GetNumForName(\"F_END\") - 1;\r\n\tnumflats = (lastflat - firstflat) + 1;\r\n\r\n\ttexflats = Z_Malloc(numflats * (sizeof(psxobj_t) + sizeof(int)), PU_STATIC, 0);\r\n\tflattranslation = (int *) texflats + (numflats * (sizeof(psxobj_t)/4));\r\n\r\n\tflat = texflats;\r\n\tfor (lump = firstflat; lump <= lastflat; lump++)\r\n\t{\r\n\t\tflat->lump = lump;\r\n\t\tflat->w = 64;\r\n\t\tflat->h = 64;\r\n\t\tflat->vtpage = 0;\r\n\t\tflat->vbasex = 4;\r\n\t\tflat->vbasey = 4;\r\n\t\tflat++;\r\n\t}\r\n\r\n\t/* translation table for global animation */\r\n\tfor (i = 0; i<numflats; i++)\r\n\t\tflattranslation[i] = i;\r\n}\r\n\r\n/*\r\n================\r\n=\r\n= R_InitSprite\r\n=\r\n= Exclusive Psx Doom\r\n=================\r\n*/\r\n\r\nvoid R_InitSprite(void)//L8002BB24()\r\n{\r\n\tmaptexture_t\t*msprite;\r\n\tpsxobj_t\t\t*sprite;\r\n\tbyte\t        *data;\r\n\tint\t\t\t\twidth, height, lump, i;\r\n\r\n\tfirstsprite = W_GetNumForName(\"S_START\") + 1;\r\n\tlastsprite = W_GetNumForName(\"S_END\") - 1;\r\n\tnumsprites = (lastsprite - firstsprite) + 1;\r\n\r\n\ttexsprites = Z_Malloc(numsprites * sizeof(psxobj_t), PU_STATIC, 0);\r\n\r\n\tdata = (byte *)W_CacheLumpName(\"SPRITE1\", PU_CACHE, true);\r\n\r\n\tsprite = texsprites;\r\n\tmsprite = (maptexture_t *)data;\r\n\tfor (lump = firstsprite; lump <= lastsprite; lump++)\r\n\t{\r\n\t\tsprite->lump = lump;\r\n\t\tsprite->vtpage = 0;\r\n\r\n\t\tsprite->x = BIGSHORT(msprite->leftoffset);\r\n\t\tsprite->y = BIGSHORT(msprite->topoffset);\r\n\r\n\t\tsprite->w = BIGSHORT(msprite->width);\r\n\t\tsprite->h = BIGSHORT(msprite->height);\r\n\r\n\t\twidth = sprite->w + 15;\r\n\t\tif (width < 0) { width = sprite->w + 30; }\r\n\r\n\t\theight = sprite->h + 15;\r\n\t\tif (height < 0) { height = sprite->h + 30; }\r\n\r\n\t\tsprite->vbasex = width >> 4;\r\n\t\tsprite->vbasey = height >> 4;\r\n\r\n\t\tmsprite++;\r\n\t\tsprite++;\r\n\t}\r\n\r\n\tZ_Free(data);\r\n\tZ_FreeTags(mainzone, PU_CACHE);\r\n}\r\n\r\n/*============================================================================= */\r\n\r\n#define HIBIT (1<<7)\r\n\r\n/*\r\n================\r\n=\r\n= R_TextureNumForName\r\n=\r\n================\r\n*/\r\n\r\nint\tR_TextureNumForName(char *name)//L8002BC74()\r\n{\r\n#if 0\r\n\tint\t\ti;\r\n\r\n\ti = R_CheckTextureNumForName(name);\r\n\tif (i == -1)\r\n\t\tI_Error(\"R_TextureNumForName: %s not found\", name);\r\n\r\n\treturn i;\r\n#endif\r\n\r\n\tint\t\t\ti;\r\n\tlumpinfo_t\t*lump_p;\r\n\tchar\tname8[8];\r\n\tint\t\tv1, v2;\r\n\tint\t\tc;\r\n\r\n\t/* make the name into two integers for easy compares */\r\n\t*(int *)&name8[0] = 0;\r\n\t*(int *)&name8[4] = 0;\r\n\tfor (i = 0; i<8 && name[i]; i++)\r\n\t{\r\n\t\tc = name[i];\r\n\t\tif (c >= 'a' && c <= 'z')\r\n\t\t\tc -= 'a' - 'A';\r\n\t\tname8[i] = c;\r\n\t}\r\n\r\n\tv1 = *(int *)&name8[0];\r\n\tv2 = *(int *)&name8[4];\r\n\r\n\tlump_p = &lumpinfo[firsttex];\r\n\tfor (i = 0; i<numtextures; i++, lump_p++)\r\n\t{\r\n\t\tif ((*(int *)&lump_p->name[4] == v2) &&\r\n           ((*(int *)&lump_p->name[0] & ~HIBIT) == v1))\r\n\t\t\treturn i;\r\n\t}\r\n\r\n\t//I_Error(\"R_TextureNumForName: %s not found\", name);\r\n\treturn -1;\r\n}\r\n\r\n/*\r\n================\r\n=\r\n= R_FlatNumForName\r\n=\r\n================\r\n*/\r\n\r\nint\tR_FlatNumForName (char *name)//L8002BD38()\r\n{\r\n\tint\t\t\ti;\r\n\tlumpinfo_t\t*lump_p;\r\n\tchar\tname8[8];\r\n\tint\t\tv1,v2;\r\n\tint\t\tc;\r\n\r\n\t/* make the name into two integers for easy compares */\r\n\t*(int *)&name8[0] = 0;\r\n\t*(int *)&name8[4] = 0;\r\n\tfor (i=0 ; i<8 && name[i] ; i++)\r\n\t{\r\n\t\tc = name[i];\r\n\t\tif (c == 0) break;\r\n\t\tif (c >= 'a' && c <= 'z')\r\n\t\t\tc -= 'a'-'A';\r\n\t\tname8[i] = c;\r\n\t}\r\n\r\n\tv1 = *(int *)&name8[0];\r\n\tv2 = *(int *)&name8[4];\r\n\r\n\tlump_p = &lumpinfo[firstflat];\r\n\tfor (i=0 ; i<numflats; i++, lump_p++)\r\n\t{\r\n\t\tif ((*(int *)&lump_p->name[4] == v2) &&\r\n           ((*(int *)&lump_p->name[0] & ~HIBIT) == v1))\r\n\t\t\treturn i;\r\n\t}\r\n\t//I_Error (\"R_FlatNumForName: %s not found\",name);\r\n\treturn 0;\t/* FIXME -1; */\r\n}\r\n\r\n/*\r\n================\r\n=\r\n= R_InitPalettes\r\n=\r\n= Exclusive Psx Doom\r\n================\r\n*/\r\n\r\nvoid R_InitPalettes(void)//L8002BDFC()\r\n{\r\n\tint lump, i, x, y;\r\n\tbyte *paldata;\r\n\tRECT rect;\r\n\tlight_t *light;\r\n\r\n\t//printf(\"R_InitPalettes\\n\");\r\n\r\n\tlights = (light_t*)W_CacheLumpName(\"LIGHTS\", PU_STATIC, true);\r\n\tlights[0].r = 0xff;\r\n\tlights[0].g = 0xff;\r\n\tlights[0].b = 0xff;\r\n\r\n\tlump = W_GetNumForName(\"PLAYPAL\");\r\n\r\n\tpaldata = (byte *)W_CacheLumpNum(lump, PU_CACHE, true);\r\n\r\n\tif ((W_LumpLength(lump) / 512) != MAX_PALETTES)\r\n\t{\r\n\t\tI_Error(\"R_InitPalettes: palette foulup\\n\");\r\n\t}\r\n\r\n\trect.w = 256;\r\n\trect.h = 1;\r\n\tfor (i = 0; i < MAX_PALETTES; i++)\r\n\t{\r\n\t\ty = i;\r\n\t\tif (y < 0) { y = i + 0xf; }\r\n\r\n\t\ty = y >> 4;\r\n\t\tx = y << 8;\r\n\r\n\t\trect.x = x;\r\n\t\trect.y = i - (y << 4) + 240;\r\n\r\n\t\tLoadImage(&rect, (unsigned long *)paldata);\r\n\t\tpalette[i] = getClut(rect.x, rect.y);\r\n\r\n\t\tpaldata += 512;\r\n\t}\r\n\r\n\tpalettebase = palette[0];\r\n\r\n\tZ_FreeTags(mainzone, PU_CACHE);\r\n}\r\n\r\n\r\n/*\r\n================\r\n=\r\n= R_CheckTextureNumForName\r\n=\r\n================\r\n*/\r\n\r\n#if 0 //dont use on Psx Doom\r\nint\tR_CheckTextureNumForName (char *name)\r\n{\r\n\tint\t\ti,c;\r\n\tchar\ttemp[8];\r\n\tint\t\tv1, v2;\r\n\ttexture_t\t*texture_p;\r\n\r\n\tif (name[0] == '-')\t\t/* no texture marker */\r\n\t\treturn 0;\r\n\r\n\t*(int *)&temp[0] = 0;\r\n\t*(int *)&temp[4] = 0;\r\n\r\n\tfor (i=0 ; i<8 && name[i] ; i++)\r\n\t{\r\n\t\tc = name[i];\r\n\t\tif (c >= 'a' && c<='z')\r\n\t\t\tc -= ('a'-'A');\r\n\t\ttemp[i] = c;\r\n\t}\r\n\r\n\tv1 = *(int *)temp;\r\n\tv2 = *(int *)&temp[4];\r\n\r\n\ttexture_p = textures;\r\n\r\n\tfor (i=0 ; i<numtextures ; i++,texture_p++)\r\n\t\tif (*(int *)&texture_p->name[4] == v2\r\n\t\t&&  (*(int *)texture_p->name) == v1)\r\n\t\t\treturn i;\r\n\r\n\treturn 0;\t/* FIXME -1; */\r\n}\r\n#endif\r\n"
  },
  {
    "path": "PSXDOOM/r_local.h",
    "content": "/* R_local.h */\r\n\r\n#ifndef __R_LOCAL__\r\n#define __R_LOCAL__\r\n\r\n/* proper screen size would be 160*100, stretched to 224 is 2.2 scale */\r\n#define\tSTRETCH\t\t\t\t(22*FRACUNIT/10)\r\n\r\n#define\tCENTERX\t\t\t\t(SCREENWIDTH/2)\r\n#define\tCENTERY\t\t\t\t(SCREENHEIGHT/2)\r\n#define\tCENTERXFRAC\t\t\t(SCREENWIDTH/2*FRACUNIT)\r\n#define\tCENTERYFRAC\t\t\t(SCREENHEIGHT/2*FRACUNIT)\r\n#define\tPROJECTION\t\t\tCENTERXFRAC\r\n\r\n#define\tANGLETOSKYSHIFT\t\t22\t\t/* sky map is 256*128*4 maps */\r\n\r\n#define\tBASEYCENTER\t\t\t100\r\n\r\n#define\tCENTERY\t\t\t\t(SCREENHEIGHT/2)\r\n#define\tWINDOWHEIGHT\t\t(SCREENHEIGHT-SBARHEIGHT)\r\n\r\n#define\tMINZ\t\t\t\t4//(FRACUNIT*4)\r\n\r\n#define\tFIELDOFVIEW\t\t\t2048   /* fineangles in the SCREENWIDTH wide window */\r\n\r\n/* */\r\n/* Seg flags */\r\n/* */\r\n#define SGF_VISIBLE_COLS    1       /* The seg has at least 1 visible (non fully occluded column) */\r\n\r\n\r\n/* */\r\n/* lighting constants */\r\n/* */\r\n#define\tLIGHTLEVELS\t\t\t256\t\t/* number of diminishing */\r\n#define\tINVERSECOLORMAP\t\t255\r\n\r\n/*\r\n==============================================================================\r\n\r\n\t\t\t\t\tINTERNAL MAP TYPES\r\n\r\n==============================================================================\r\n*/\r\n\r\n/*================ used by play and refresh */\r\n\r\ntypedef struct\n{\n\tfixed_t\tx, y, dx, dy;\n} divline_t;\r\n\r\ntypedef struct\r\n{\r\n\tfixed_t\t\tx,y;//*, *4\r\n\tint yy;//*8\r\n\tint vx;//*12\r\n\tint vy;//*16\r\n\tint xx;//*20\r\n\tint index; //*24\r\n} vertex_t;\r\n\r\nstruct line_s;\r\nstruct subsector_s;\r\n\r\ntypedef\tstruct\r\n{\r\n\tfixed_t\t\tfloorheight, ceilingheight;\r\n\tVINT\t\tfloorpic, ceilingpic;\t/* if ceilingpic == -1,draw sky */\r\n\tshort\t\tcolorid;\t\t\t// Psx Doom New\r\n\tshort\t\tlightlevel;\r\n\tVINT\t\tspecial, tag;\r\n\r\n\tVINT\t\tsoundtraversed;\t\t/* 0 = untraversed, 1,2 = sndlines -1 */\r\n\tmobj_t\t\t*soundtarget;\t\t/* thing that made a sound (or null) */\r\n\r\n\tVINT\t    flags;\t            // Psx Doom New\r\n\tVINT\t\tblockbox[4];\t\t/* mapblock bounding box for height changes */\r\n\tdegenmobj_t\tsoundorg;\t\t\t/* for any sounds played by the sector */\r\n\r\n\tint\t\t\tvalidcount;\t\t\t/* if == validcount, already checked */\r\n\tmobj_t\t\t*thinglist;\t\t\t/* list of mobjs in sector */\r\n\tvoid\t\t*specialdata;\t\t/* thinker_t for reversable actions */\r\n\tVINT\t\tlinecount;\r\n\tstruct line_s\t**lines;\t\t\t/* [linecount] size */\r\n\r\n} sector_t;\r\n\r\ntypedef struct\r\n{\r\n\tfixed_t\t\ttextureoffset;\t\t/* add this to the calculated texture col */\r\n\tfixed_t\t\trowoffset;\t\t\t/* add this to the calculated texture top */\r\n\tVINT\t\ttoptexture, bottomtexture, midtexture;\r\n\tsector_t\t*sector;\r\n} side_t;\r\n\r\ntypedef enum {ST_HORIZONTAL, ST_VERTICAL, ST_POSITIVE, ST_NEGATIVE} slopetype_t;\r\n\r\ntypedef struct line_s\r\n{\r\n\tvertex_t\t*v1, *v2;\r\n\tfixed_t\t\tdx,dy;\t\t\t\t/* v2 - v1 for side checking */\r\n\tVINT\t\tflags;\r\n\tVINT\t\tspecial, tag;\r\n\tVINT\t\tsidenum[2];\t\t\t/* sidenum[1] will be -1 if one sided */\r\n\tfixed_t\t\tbbox[4];\r\n\tslopetype_t\tslopetype;\t\t\t/* to aid move clipping */\r\n\tsector_t\t*frontsector, *backsector;\r\n\tint\t\t\tvalidcount;\t\t\t/* if == validcount, already checked */\r\n\tvoid\t\t*specialdata;\t\t/* thinker_t for reversable actions */\r\n\tint\t\t\tfineangle;\t\t\t/* to get sine / cosine for sliding */\r\n} line_t;\r\n\r\ntypedef struct subsector_s\r\n{\r\n\tsector_t\t*sector;\t//*\r\n\tshort\t\tnumlines;\t//*4\r\n\tshort\t\tfirstline;\t//*6\r\n\t//Psx Doom\r\n\tshort       numleafs;\t//*8\r\n\tshort       leaf;\t\t//*10\r\n    short       unk1;\t\t//*12\r\n\tshort       unk2;\t\t//*14\r\n} subsector_t;\r\n\r\ntypedef struct seg_s\r\n{\r\n\tvertex_t\t*v1, *v2;\r\n\tfixed_t\t\toffset;\r\n\tangle_t\t\tangle;\t\t\t\t/* this is not used (keep for padding) */\r\n\tside_t\t\t*sidedef;\r\n\tline_t\t\t*linedef;\r\n\tsector_t\t*frontsector;\r\n\tsector_t\t*backsector;\t\t/* NULL for one sided lines */\r\n\t//New PsxDoom\r\n\tshort       flag;\r\n\tshort       xpos1;\r\n\tshort       xpos2;\r\n\tshort       pad1;\r\n} seg_t;\r\n\r\ntypedef struct\r\n{\r\n\t//fixed_t\t\tx,y,dx,dy;\t\t//old\r\n\tdivline_t\tline;\t\t\t\t/* partition line */\r\n\tfixed_t\t\tbbox[2][4];\t\t\t/* bounding box for each child */\r\n\tint\t\t\tchildren[2];\t\t/* if NF_SUBSECTOR its a subsector */\r\n} node_t;\r\n\r\ntypedef struct {\r\n\tvertex_t    *vertex;\r\n\tseg_t       *seg;//*(A24 + 4)\r\n} leaf_t;\r\n\r\n#if 0\r\ntypedef struct\r\n{\r\n\tchar\t\tname[8];\t\t/* for switch changing, etc */\r\n\tint\t\t\twidth;\r\n\tint\t\t\theight;\r\n\tpixel_t\t\t*data;\t\t\t/* cached data to draw from */\r\n\tint\t\t\tlumpnum;\r\n\tint\t\t\tusecount;\t\t/* for precaching */\r\n\tint\t\t\tpad;\r\n} texture_t;\r\n#endif // 0\r\n\r\n//\r\n// Light Data Psx Doom\r\n//\r\ntypedef struct {\r\n\tunsigned char r;\r\n\tunsigned char g;\r\n\tunsigned char b;\r\n\tunsigned char pad1;\r\n} light_t;\r\n\r\n/*\r\n==============================================================================\r\n\r\n\t\t\t\t\t\tOTHER TYPES\r\n\r\n==============================================================================\r\n*/\r\n\r\n/* Sprites are patches with a special naming convention so they can be  */\r\n/* recognized by R_InitSprites.  The sprite and frame specified by a  */\r\n/* thing_t is range checked at run time. */\r\n/* a sprite is a patch_t that is assumed to represent a three dimensional */\r\n/* object and may have multiple rotations pre drawn.  Horizontal flipping  */\r\n/* is used to save space. Some sprites will only have one picture used */\r\n/* for all views.   */\r\n\r\n#ifdef MARS\r\n\r\nint spritelump[NUMSPRITES];\t/* no rotations, so just add frame num... */\r\n\r\n#else\r\n\r\ntypedef struct\r\n{\r\n\tboolean\t\trotate;\t\t/* if false use 0 for any position */\r\n\tint\t\t\tlump[8];\t/* lump to use for view angles 0-7 */\r\n\tbyte\t\tflip[8];\t/* flip (1 = flip) to use for view angles 0-7 */\r\n} spriteframe_t;\r\n\r\ntypedef struct\r\n{\r\n\tint\t\t\t\tnumframes;\r\n\tspriteframe_t\t*spriteframes;\r\n} spritedef_t;\r\n\r\nextern\tspritedef_t\t\tsprites[NUMSPRITES];\r\n\r\n#endif\r\n\r\n/*\r\n===============================================================================\r\n\r\n\t\t\t\t\t\t\tMAP DATA\r\n\r\n===============================================================================\r\n*/\r\n\r\nextern\tint\t\t\tnumvertexes;\r\nextern\tvertex_t\t*vertexes;\r\n\r\nextern\tint\t\t\tnumsegs;\r\nextern\tseg_t\t\t*segs;\r\n\r\nextern\tint\t\t\tnumsectors;\r\nextern\tsector_t\t*sectors;\r\n\r\nextern\tint\t\t\tnumsubsectors;\r\nextern\tsubsector_t\t*subsectors;\r\n\r\nextern\tint\t\t\tnumnodes;\r\nextern\tnode_t\t\t*nodes;\r\n\r\nextern\tint\t\t\tnumlines;\r\nextern\tline_t\t\t*lines;\r\n\r\nextern\tint\t\t\tnumsides;\r\nextern\tside_t\t\t*sides;\r\n\r\nextern\tint\t\t\tnumleafs;\r\nextern\tleaf_t\t\t*leafs;\r\n\r\n/*============================================================================= */\r\n\r\n/*------*/\r\n/*R_main*/\r\n/*------*/\r\nextern light_t      *baselight; //*(r28 + 2672) L80077E80\r\nextern unsigned int base_r;\t//*(r28 + 2220) L80077CBC//r\r\nextern unsigned int base_g;\t//*(r28 + 2640) L80077E60//g\r\nextern unsigned int base_b;\t//*(r28 + 2444) L80077D9C//b\r\nextern boolean      viewlighting;    //80078088\r\nextern sector_t     *frontsector;\t//80077E38 //psGp00000a28\r\n\r\n/*------*/\r\n/*R_data*/\r\n/*------*/\r\nvoid\tR_InitData (void);\r\n//void\tR_InitSpriteDefs (char **namelist);\r\n\r\n/*--------*/\r\n/*r_phase1*/\r\n/*--------*/\r\nvoid\tR_BSP (void);\r\nvoid\tR_RenderBSPNode (int bspnum);\r\n\r\n/*--------*/\r\n/*r_phase2*/\r\n/*--------*/\r\nvoid R_RenderSKY(void);\r\nvoid R_Render_Hud_Weapons(void);\r\n\r\n\r\n/* to get a global angle from cartesian coordinates, the coordinates are */\r\n/* flipped until they are in the first octant of the coordinate system, then */\r\n/* the y (<=x) is scaled and divided by x to get a tangent (slope) value */\r\n/* which is looked up in the tantoangle[] table.  The +1 size is to handle */\r\n/* the case when x==y without additional checking. */\r\n#define\tSLOPERANGE\t2048\r\n#define\tSLOPEBITS\t11\r\n#define\tDBITS\t\t(FRACBITS-SLOPEBITS)\r\n\r\nextern\tint\ttantoangle[SLOPERANGE+1];\r\n\r\n\r\n#define\tVIEW_3D_H 200\r\nextern\tfixed_t\tyslope[VIEW_3D_H];\r\n\r\n#define\tHEIGHTBITS\t\t\t6\r\n#define\tSCALEBITS\t\t\t9\r\n\r\n#define\tFIXEDTOSCALE\t\t(FRACBITS-SCALEBITS)\r\n#define\tFIXEDTOHEIGHT\t\t(FRACBITS-HEIGHTBITS)\r\n\r\n\r\n#define\tHALF_SCREEN_W       (SCREENWIDTH/2)\r\n\r\nextern\tfixed_t\t\tviewx, viewy, viewz;    //80077D0C, 80077D10, 80077D18\r\nextern\tangle_t\t\tviewangle;              //800780B8\r\nextern\tfixed_t\t\tviewcos, viewsin;       //80077EC8, 80077EE0\r\n\r\nextern\tplayer_t\t*viewplayer;            //80077D60\r\n\r\nextern\tfixed_t\t\tfinetangent[FINEANGLES/2];\r\n\r\nextern\tint\t\t\tvalidcount; //800779F4\r\n//extern\tint\t\t\tframecount;\r\n\r\n/* */\r\n/* R_data.c */\r\n/* */\r\n\r\n#define\tMAXSUBSECTORS\t192\t\t/* Maximum number of subsectors to scan */\r\n\r\nextern\tshort\t\tskypalette;\r\nextern\tpsxobj_t\t*skytexturep;\r\n\r\nextern\tint\t\t\tfirsttex, lasttex, numtextures;\r\nextern\tpsxobj_t\t*textures;\r\n\r\nextern\tint\t\t\t*flattranslation;\t\t/* for global animation */\r\nextern\tint\t\t\t*texturetranslation;\t/* for global animation */\r\n\r\nextern\tint\t\t\tfirstflat, lastflat,  numflats;\r\nextern\tpsxobj_t\t*texflats;\r\n\r\nextern\tint\t\t\tfirstsprite, lastsprite, numsprites;\r\nextern\tpsxobj_t\t*texsprites;\r\n\r\n\r\n#define MAX_PALETTES 20\r\nextern\tshort palette[MAX_PALETTES];\r\nextern\tshort palettebase;\r\nextern\tlight_t\t\t*lights;\r\n\r\n#endif\t\t/* __R_LOCAL__ */\r\n\r\n"
  },
  {
    "path": "PSXDOOM/r_main.c",
    "content": "/* r_main.c */\r\n\r\n#include \"doomdef.h\"\r\n#include \"r_local.h\"\r\n\r\n/*===================================== */\r\n\r\n/* */\r\n/* subsectors */\r\n/* */\r\n//subsector_t\t\t*vissubsectors[MAXVISSSEC], **lastvissubsector;\r\n\r\n/* */\r\n/* walls */\r\n/* */\r\n//viswall_t\tviswalls[MAXWALLCMDS], *lastwallcmd;\r\n\r\n/* */\r\n/* planes */\r\n/* */\r\n//visplane_t\tvisplanes[MAXVISPLANES], *lastvisplane;\r\n\r\n/* */\r\n/* sprites */\r\n/* */\r\n//vissprite_t\tvissprites[MAXVISSPRITES], *lastsprite_p, *vissprite_p;\r\n\r\n/* */\r\n/* openings / misc refresh memory */\r\n/* */\r\n//unsigned short\topenings[MAXOPENINGS], *lastopening;\r\n\r\n\r\n/*===================================== */\r\n\r\n//boolean\t\tphase1completed;\r\n\r\n//pixel_t\t\t*workingscreen;\r\n\r\n\r\nfixed_t\t\tviewx, viewy, viewz;    //80077D0C|uGp000008fc, 80077D10|uGp00000900, 80077D18|uGp00000908\r\nangle_t\t\tviewangle;              //800780B8|uGp00000ca8\r\nfixed_t\t\tviewcos, viewsin;       //80077EC8|iGp00000ab8, 80077EE0|iGp00000ad0\r\nplayer_t\t*viewplayer;            //80077D60|ppGp00000950\r\n\r\nint\t\t\tvalidcount = 1;\t\t/* increment every time a check is made */ //800779F4\r\n//int\t\t\tframecount;\t\t    /* incremented every frame */\r\n\r\n/* */\r\n/* sky mapping */\r\n/* */\r\nboolean     rendersky;//8007801C|iGp00000c0c\r\n\r\nsubsector_t *solidsubsectors[MAXSUBSECTORS];\t//800A8F98                  /* List of valid ranges to scan through */\r\nsubsector_t **endsubsector;\t\t\t\t        //80077E90|ppsGp00000a80    /* Pointer to the first free entry */\r\nint numdrawsubsectors;                          //80077F14|iGp00000b04\r\n\r\nbyte solidcols[256];\t\t\t\t    //800A8D2C psxdoom\r\n\r\n/* */\r\n/* precalculated math */\r\n/* */\r\nfixed_t\t\t*finecosine = &finesine[FINEANGLES/4];//80077A00\r\n\r\n\r\n/* */\r\n/* News */\r\n/* */\r\nlight_t         *baselight;             //pbGp00000a70 L80077E80\r\nunsigned int    base_r;\t                //iGp000008ac L80077CBC//r\r\nunsigned int    base_g;\t                //iGp00000a50 L80077E60//g\r\nunsigned int    base_b;\t                //iGp0000098c L80077D9C//b\r\nboolean         viewlighting;           //80078088|iGp00000c78\r\nsector_t        *frontsector;\t        //80077E38|psGp00000a28\r\nlight_t         *lights;\t\t        //80077E94|pbGp00000a84\r\nshort           palette[MAX_PALETTES];\t//800A8E68\r\nshort           palettebase;            //80077DA8\r\n\r\n/*============================================================================= */\r\n\r\n/*\r\n==============\r\n=\r\n= R_Init\r\n=\r\n==============\r\n*/\r\n\r\nstatic MATRIX R_Matrix;//80086358\r\n\r\nvoid R_Init (void) //L80030480()\r\n{\r\n    R_InitData ();\r\n\r\n\t//Initialize Matrix\r\n\tR_Matrix.t[0] = 0;\r\n\tR_Matrix.t[1] = 0;\r\n\tR_Matrix.t[2] = 0;\r\n\tSetTransMatrix(&R_Matrix);\r\n\r\n\tR_Matrix.m[0][0] = 0;\r\n\tR_Matrix.m[0][1] = 0;\r\n\tR_Matrix.m[0][2] = 0;\r\n\tR_Matrix.m[1][0] = 0;\r\n\tR_Matrix.m[1][1] = 4096;\r\n\tR_Matrix.m[1][2] = 0;\r\n\tR_Matrix.m[2][0] = 0;\r\n\tR_Matrix.m[2][1] = 0;\r\n\tR_Matrix.m[2][2] = 0;\r\n\tSetRotMatrix(&R_Matrix);\r\n}\r\n\r\n/*\r\n==============\r\n=\r\n= R_RenderView\r\n=\r\n==============\r\n*/\r\n\r\nvoid R_RenderPlayerView(void)//L80030504()\r\n{\r\n\tRECT    area;\r\n\tangle_t angle;\r\n\tDR_TWIN *texwindow = (DR_TWIN*) getScratchAddr(128);//1F800200\r\n\r\n\tif (!viewlighting)\r\n    {\r\n\t\tbase_r = 128;\r\n\t\tbase_g = 128;\r\n\t\tbase_b = 128;\r\n\t\tbaselight = &lights[0];\r\n\t}\r\n\r\n\tviewplayer = &players[consoleplayer];\r\n\r\n\tviewx = viewplayer->mo->x & (~FRACMASK);\r\n\tviewy = viewplayer->mo->y & (~FRACMASK);\r\n\tviewz = viewplayer->viewz & (~FRACMASK);\r\n\r\n\tviewangle = viewplayer->mo->angle;\r\n\tviewcos = finecosine[viewangle >> ANGLETOFINESHIFT];\r\n\tviewsin = finesine[viewangle >> ANGLETOFINESHIFT];\r\n\r\n\tR_Matrix.m[0][0] =  viewsin >> 4;\r\n\tR_Matrix.m[0][2] = -viewcos >> 4;\r\n\tR_Matrix.m[2][0] =  viewcos >> 4;\r\n\tR_Matrix.m[2][2] =  viewsin >> 4;\r\n\tSetRotMatrix(&R_Matrix);\r\n\r\n\tR_BSP();\r\n\r\n\tnumdrawsubsectors = (endsubsector - solidsubsectors);\r\n\r\n\tDrawRender();\r\n\r\n\tif (rendersky)\r\n\t\tR_RenderSKY();\r\n\r\n    while (endsubsector--, (solidsubsectors-1) < endsubsector)\r\n    {\r\n        frontsector = (*endsubsector)->sector;\r\n\r\n        if (viewlighting)\r\n        {\r\n            baselight = &lights[frontsector->colorid];\r\n\r\n            base_r = (frontsector->lightlevel * baselight->r) >> 8;\r\n            base_g = (frontsector->lightlevel * baselight->g) >> 8;\r\n            base_b = (frontsector->lightlevel * baselight->b) >> 8;\r\n\r\n            if (viewplayer->extralight != 0)\r\n            {\r\n                base_r += viewplayer->extralight;\r\n                base_g += viewplayer->extralight;\r\n                base_b += viewplayer->extralight;\r\n\r\n                if (base_r > 255) { base_r = 255; }\r\n                if (base_g > 255) { base_g = 255; }\r\n                if (base_b > 255) { base_b = 255; }\r\n            }\r\n        }\r\n\r\n        R_RenderAll(*endsubsector);\r\n    }\r\n\r\n\tR_Render_Hud_Weapons();\r\n\r\n\tsetRECT(&area, 0, 0, 0, 0);\r\n\tSetTexWindow(texwindow, &area);\r\n\tW_AddPrim(texwindow);   /* add to order table*/\r\n}\r\n\r\n/*============================================================================= */\r\n\r\n/*\r\n===============================================================================\r\n=\r\n= R_PointToAngle\r\n=\r\n===============================================================================\r\n*/\r\n\r\nextern\tint\ttantoangle[SLOPERANGE + 1];\r\n\r\ninline int SlopeDiv(unsigned num, unsigned den)//L80030A28()\r\n{\r\n\tunsigned ans;\r\n\tif (den < 512)\r\n\t\treturn SLOPERANGE;\r\n\tans = (num << 3) / (den >> 8);\r\n\treturn ans <= SLOPERANGE ? ans : SLOPERANGE;\r\n}\r\n\r\nangle_t R_PointToAngle2(fixed_t x1, fixed_t y1, fixed_t x2, fixed_t y2)//L80030A70()\r\n{\r\n\tint\t\tx;\r\n\tint\t\ty;\r\n\r\n\tx = x2 - x1;\r\n\ty = y2 - y1;\r\n\r\n\tif ((!x) && (!y))\r\n\t\treturn 0;\r\n\r\n\tif (x >= 0)\r\n\t{\t/* x >=0 */\r\n\t\tif (y >= 0)\r\n\t\t{\t/* y>= 0 */\r\n\t\t\tif (x>y)\r\n\t\t\t\treturn tantoangle[SlopeDiv(y, x)];     /* octant 0 */\r\n\t\t\telse\r\n\t\t\t\treturn ANG90 - 1 - tantoangle[SlopeDiv(x, y)];  /* octant 1 */\r\n\t\t}\r\n\t\telse\r\n\t\t{\t/* y<0 */\r\n\t\t\ty = -y;\r\n\t\t\tif (x>y)\r\n\t\t\t\treturn -tantoangle[SlopeDiv(y, x)];  /* octant 8 */\r\n\t\t\telse\r\n\t\t\t\treturn ANG270 + tantoangle[SlopeDiv(x, y)];  /* octant 7 */\r\n\t\t}\r\n\t}\r\n\telse\r\n\t{\t/* x<0 */\r\n\t\tx = -x;\r\n\t\tif (y >= 0)\r\n\t\t{\t/* y>= 0 */\r\n\t\t\tif (x>y)\r\n\t\t\t\treturn ANG180 - 1 - tantoangle[SlopeDiv(y, x)]; /* octant 3 */\r\n\t\t\telse\r\n\t\t\t\treturn ANG90 + tantoangle[SlopeDiv(x, y)];  /* octant 2 */\r\n\t\t}\r\n\t\telse\r\n\t\t{\t/* y<0 */\r\n\t\t\ty = -y;\r\n\t\t\tif (x>y)\r\n\t\t\t\treturn ANG180 + tantoangle[SlopeDiv(y, x)];  /* octant 4 */\r\n\t\t\telse\r\n\t\t\t\treturn ANG270 - 1 - tantoangle[SlopeDiv(x, y)];  /* octant 5 */\r\n\t\t}\r\n\t}\r\n}\r\n\r\n\r\n/*\r\n===============================================================================\r\n=\r\n= R_PointOnSide\r\n=\r\n= Returns side 0 (front) or 1 (back)\r\n===============================================================================\r\n*/\r\ninline int\tR_PointOnSide(int x, int y, node_t *node)//L80030D84()\r\n{\r\n\tfixed_t\tdx, dy;\r\n\tfixed_t\tleft, right;\r\n\r\n\tif (!node->line.dx)\r\n\t{\r\n\t\tif (x <= node->line.x)\r\n\t\t\treturn node->line.dy > 0;\r\n\t\treturn node->line.dy < 0;\r\n\t}\r\n\tif (!node->line.dy)\r\n\t{\r\n\t\tif (y <= node->line.y)\r\n\t\t\treturn node->line.dx < 0;\r\n\t\treturn node->line.dx > 0;\r\n\t}\r\n\r\n\tdx = (x - node->line.x);\r\n\tdy = (y - node->line.y);\r\n\r\n\tleft = (node->line.dy >> 16) * (dx >> 16);\r\n\tright = (dy >> 16) * (node->line.dx >> 16);\r\n\r\n\tif (right < left)\r\n\t\treturn 0;\t\t/* front side */\r\n\treturn 1;\t\t\t/* back side */\r\n}\r\n\r\n\r\n\r\n/*\r\n==============\r\n=\r\n= R_PointInSubsector\r\n=\r\n==============\r\n*/\r\nstruct subsector_s *R_PointInSubsector(fixed_t x, fixed_t y)//L80030E2C()\r\n{\r\n\tnode_t\t*node;\r\n\tint\t\tside, nodenum;\r\n\r\n\tif (!numnodes)\t\t\t\t/* single subsector is a special case */\r\n\t\treturn subsectors;\r\n\r\n\tnodenum = numnodes - 1;\r\n\r\n\twhile (!(nodenum & NF_SUBSECTOR))\r\n\t{\r\n\t\tnode = &nodes[nodenum];\r\n\t\tside = R_PointOnSide(x, y, node);\r\n\t\tnodenum = node->children[side];\r\n\t}\r\n\r\n\treturn &subsectors[nodenum & ~NF_SUBSECTOR];\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/r_phase1.c",
    "content": "\r\n//Renderer phase 1 - BSP traversal\r\n\r\n#include \"doomdef.h\"\r\n#include \"r_local.h\"\r\n\r\nint checkcoord[12][4] =\t\t\t\t//800676C8\r\n{\r\n\t{ 3, 0, 2, 1 },/* Above,Left */\r\n\t{ 3, 0, 2, 0 },/* Above,Center */\r\n\t{ 3, 1, 2, 0 },/* Above,Right */\r\n\t{ 0, 0, 0, 0 },\r\n\t{ 2, 0, 2, 1 },/* Center,Left */\r\n\t{ 0, 0, 0, 0 },/* Center,Center */\r\n\t{ 3, 1, 3, 0 },/* Center,Right */\r\n\t{ 0, 0, 0, 0 },\r\n\t{ 2, 0, 3, 1 },/* Below,Left */\r\n\t{ 2, 1, 3, 1 },/* Below,Center */\r\n\t{ 2, 1, 3, 0 },/* Below,Right */\r\n\t{ 0, 0, 0, 0 }\r\n};\r\n\r\nextern subsector_t *solidsubsectors[MAXSUBSECTORS];\t//800A8F98 /* List of valid ranges to scan through */\r\nextern subsector_t **endsubsector;\t\t\t\t    //80077E90|ppsGp00000a80 /* Pointer to the first free entry */\r\nextern byte solidcols[256];\t\t\t\t            //800A8D2C psxdoom\r\n\r\nvoid\tR_RenderBSPNode(int bspnum);\r\nboolean R_CheckBBox(fixed_t bspcoord[4]);\r\nvoid\tR_Subsector(int num);\r\nvoid\tR_AddLine(seg_t *line);\r\n\r\n//\r\n// Kick off the rendering process by initializing the solidsubsectors array and then\r\n// starting the BSP traversal.\r\n//\r\n\r\nvoid R_BSP(void) //L8002ABB8()\r\n{\r\n\tendsubsector = solidsubsectors; /* Init the free memory pointer */\r\n\tD_memset(solidcols, 0, 256);\r\n\trendersky = false;\r\n\tR_RenderBSPNode(numnodes - 1);  /* Begin traversing the BSP tree for all walls in render range */\r\n}\r\n\r\n//\r\n// Recursively descend through the BSP, classifying nodes according to the\r\n// player's point of view, and render subsectors in view.\r\n//\r\n\r\nvoid R_RenderBSPNode(int bspnum)//L8002AC0C()\r\n{\r\n\tnode_t *bsp;\r\n\t//int     side;\r\n\tfixed_t\tdx, dy;\r\n\tfixed_t\tleft, right;\r\n\r\n\t//printf(\"R_RenderBSPNode\\n\");\r\n\r\n\tif (bspnum & NF_SUBSECTOR) // reached a subsector leaf?\r\n\t{\r\n\t\tif (bspnum == -1)\r\n        {\r\n\t\t\tR_Subsector(0);\r\n        }\r\n\t\telse\r\n        {\r\n\t\t\tR_Subsector(bspnum & ~NF_SUBSECTOR);\r\n        }\r\n\t}\r\n    else\r\n    {\r\n        bsp = &nodes[bspnum];\r\n\r\n        //decide which side the view point is on\r\n        //side = R_PointOnSide(viewx, viewy, bsp);\r\n        dx = (viewx - bsp->line.x);\r\n        dy = (viewy - bsp->line.y);\r\n\r\n        left = (bsp->line.dy >> 16) * (dx >> 16);\r\n        right = (dy >> 16) * (bsp->line.dx >> 16);\r\n\r\n        // Depending on which side of the halfspace we are on, reverse the traversal order:\r\n        if (right < left)\r\n        {\r\n            if (R_CheckBBox(bsp->bbox[0]))\r\n                R_RenderBSPNode(bsp->children[0]);\r\n\r\n            if (R_CheckBBox(bsp->bbox[1]))\r\n                R_RenderBSPNode(bsp->children[1]);\r\n        }\r\n        else\r\n        {\r\n            if (R_CheckBBox(bsp->bbox[1]))\r\n                R_RenderBSPNode(bsp->children[1]);\r\n\r\n            if (R_CheckBBox(bsp->bbox[0]))\r\n                R_RenderBSPNode(bsp->children[0]);\r\n        }\r\n        #if 0\r\n        if (right < left)\r\n            side = 0;\t\t/* front side */\r\n        else\r\n            side = 1;\t\t/* back side */\r\n\r\n        // recursively render front space\r\n        if (R_CheckBBox(bsp->bbox[side]))\r\n            R_RenderBSPNode(bsp->children[side]);\r\n\r\n        // possibly divide back space\r\n        if (R_CheckBBox(bsp->bbox[side ^ 1]))\r\n            R_RenderBSPNode(bsp->children[side ^ 1]);\r\n        #endif // 0\r\n    }\r\n}\r\n\r\n//\r\n// Checks BSP node/subtree bounding box. Returns true if some part of the bbox\r\n// might be visible.\r\n//\r\n#define SKIPVIS_FUDGE (FRACUNIT * 2)\r\n\r\nboolean R_CheckBBox(fixed_t bspcoord[4])//L8002AD44()\r\n{\r\n\tint boxx;\r\n\tint boxy;\r\n\tint boxpos;\r\n\r\n\tfixed_t x1, y1, x2, y2;\r\n\tbyte *solid_cols;\r\n\tSVECTOR v0;\r\n\tVECTOR v1;\r\n\tlong flag[4];\r\n\tfixed_t vp1, vp2;\r\n\tlong vx1, vy1, vx2, vy2, delta;\r\n\tlong Xstart, Xend;\r\n\tboolean skipvischeck;\r\n\r\n\t// find the corners of the box that define the edges from current viewpoint\r\n\tif (viewx < bspcoord[BOXLEFT])//if (viewx <= bspcoord[BOXLEFT])\r\n\t\tboxx = 0;\r\n\telse if (viewx <= bspcoord[BOXRIGHT])//if (viewx < bspcoord[BOXRIGHT])\r\n\t\tboxx = 1;\r\n\telse\r\n\t\tboxx = 2;\r\n\r\n\tif (viewy > bspcoord[BOXTOP])//if (viewy >= bspcoord[BOXTOP])\r\n\t\tboxy = 0;\r\n\telse if (viewy >= bspcoord[BOXBOTTOM])//if (viewy > bspcoord[BOXBOTTOM])\r\n\t\tboxy = 1;\r\n\telse\r\n\t\tboxy = 2;\r\n\r\n\tboxpos = (boxy << 2) + boxx;\r\n\tif (boxpos == 5)\r\n\t\treturn true;\r\n\r\n\tx1 = bspcoord[checkcoord[boxpos][0]];\r\n\ty1 = bspcoord[checkcoord[boxpos][1]];\r\n\tx2 = bspcoord[checkcoord[boxpos][2]];\r\n\ty2 = bspcoord[checkcoord[boxpos][3]];\r\n\r\n\tif (boxpos != 4)\r\n    {\r\n        if (boxpos < 5)\r\n        {\r\n            if (boxpos == 1)\r\n            {\r\n                // Above, Inside\r\n                skipvischeck = (viewy - y1 <= SKIPVIS_FUDGE);\r\n            } else\r\n            {\r\n                // Above, Left or Right\r\n                skipvischeck = false;\r\n            }\r\n        }\r\n        else if (boxpos == 6)\r\n        {\r\n            // Inside, Right\r\n            skipvischeck = (viewx - x1 <= SKIPVIS_FUDGE);\r\n        }\r\n        else if (boxpos == 9)\r\n        {\r\n            // Below, Inside\r\n            skipvischeck = (viewy - y1 >= -SKIPVIS_FUDGE);\r\n        }\r\n        else\r\n        {\r\n            // Below, Left or Right\r\n            skipvischeck = false;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        // Inside, Left\r\n        skipvischeck = (viewx - x1 >= -SKIPVIS_FUDGE);\r\n    }\r\n\r\n    // If we decided to skip the check just assume the node is visible\r\n    if (skipvischeck)\r\n        return true;\r\n\r\n    v0.vy = 0;\r\n    v0.vx = (short)((x1 - viewx) >> 16);\r\n    v0.vz = (short)((y1 - viewy) >> 16);\r\n    RotTrans(&v0,&v1,flag);\r\n\r\n    vy1 = v1.vz;\r\n    vx1 = v1.vx;\r\n\r\n    v0.vy = 0;\r\n    v0.vx = (short)((x2 - viewx) >> 16);\r\n    v0.vz = (short)((y2 - viewy) >> 16);\r\n    RotTrans(&v0,&v1,flag);\r\n\r\n    vy2 = v1.vz;\r\n    vx2 = v1.vx;\r\n\r\n    if ((vx1 < -vy1) && (vx2 < -vy2))\r\n        return false;\r\n\r\n    if ((vy1 < vx1) && (vy2 < vx2))\r\n        return false;\r\n\r\n    if ((vx1 < -vy1) && (-vy2 < vx2))\r\n    {\r\n        delta = (vx1 + vy1);\r\n        delta = (delta << 16) / ((delta - vx2) - vy2);\r\n        delta = delta * (vy2 - vy1);\r\n\r\n        vy1 += (delta >> 16);\r\n        vx1 = -vy1;\r\n    }\r\n\r\n    if ((vx1 < vy1) && (vy2 < vx2))\r\n    {\r\n        delta = (vx1 - vy1);\r\n        delta = (delta << 16) / ((delta - vx2) + vy2);\r\n        delta = delta * (vy2 - vy1);\r\n\r\n        vy2 = vy1 + (delta >> 16);\r\n        vx2 = vy2;\r\n    }\r\n\r\n    if ((vy1 < 0) && (vy2 < 0))\r\n        return false;\r\n\r\n    if ((vy1 < 2) && (vy2 < 2))\r\n        return true;\r\n\r\n    if (vy1 < 1)\r\n        vy1 = 1;\r\n\r\n    if (vy2 < 1)\r\n        vy2 = 1;\r\n\r\n    Xstart  = (((vx1 << 7) / vy1) + 0x80);\r\n    Xend    = (((vx2 << 7) / vy2) + 0x80);\r\n\r\n    if (Xstart < 0)\r\n        Xstart = 0;\r\n\r\n    if (Xend > 256)\r\n        Xend = 256;\r\n\r\n    solid_cols = &solidcols[Xstart];\r\n    while (Xstart < Xend)\r\n    {\r\n        if (*solid_cols == 0)\r\n            return true;\r\n        solid_cols++;\r\n        Xstart++;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\n//\r\n// Determine floor/ceiling planes, add sprites of things in sector,\r\n// draw one or more segments.\r\n//\r\n\r\nvoid R_Subsector(int num)//L8002B1A8()\r\n{\r\n\tsubsector_t *sub;\r\n\tseg_t       *line;\r\n\tint          count;\r\n\r\n\tif (num >= numsubsectors)\r\n\t{\r\n\t\tI_Error(\"R_Subsector: ss %i with numss = %i\", num, numsubsectors);\r\n\t}\r\n\r\n\tif ((endsubsector - solidsubsectors) < MAXSUBSECTORS)\r\n\t{\r\n\t\tsub = &subsectors[num];\r\n\t\tfrontsector = sub->sector;\r\n\r\n\t\t*endsubsector = sub;//copy subsector\r\n\t\tendsubsector++;\r\n\r\n\t\tline = &segs[sub->firstline];\r\n\t\tcount = sub->numlines;\r\n        do\r\n        {\r\n            R_AddLine(line);\t/* Render each line */\r\n            ++line;\t\t\t\t/* Inc the line pointer */\r\n        } while (--count);\t\t/* All done? */\r\n\t}\r\n}\r\n\r\n//\r\n// Clips the given segment and adds any visible pieces to the line list.\r\n//\r\n\r\nvoid R_AddLine(seg_t *line)//L8002B288\r\n{\r\n\tsector_t    *backsector;\r\n\tvertex_t    *vrt, *vrt2;\r\n\tint         x1, y1, x2, y2, xpos1, xpos2, count;\r\n\tlong        Xstart, Xend, delta;\r\n\tbyte        *solid_cols;\r\n\tSVECTOR     v0;\r\n\tVECTOR      v1;\r\n\tlong\t    flag[4];\r\n\r\n\tline->flag &= ~1;\r\n\r\n\tvrt = line->v1;\r\n\tif (vrt->index != TextureCacheIdx)\r\n\t{\r\n        v0.vy = 0;\r\n        v0.vx = (short)((vrt->x - viewx) >> 16);\r\n        v0.vz = (short)((vrt->y - viewy) >> 16);\r\n        RotTrans(&v0,&v1,flag);\r\n\r\n        vrt->vx = v1.vx;\r\n        vrt->vy = v1.vz;\r\n\r\n\t\tif (vrt->vy >= 4)\r\n        {\r\n            vrt->yy = 0x800000 / vrt->vy;\r\n            vrt->xx = ((vrt->vx * (0x800000 / vrt->vy)) >> 16) + 0x80;\r\n        }\r\n\r\n\t\tvrt->index = TextureCacheIdx;\r\n\r\n        y1 = vrt->vy;\r\n        x1 = vrt->vx;\r\n\t}\r\n\telse\r\n\t{\r\n        x1 = vrt->vx;\r\n        y1 = vrt->vy;\r\n\t}\r\n\r\n\tvrt2 = line->v2;\r\n\tif (vrt2->index != TextureCacheIdx)\r\n\t{\r\n        v0.vy = 0;\r\n        v0.vx = (short)((vrt2->x - viewx) >> 16);\r\n        v0.vz = (short)((vrt2->y - viewy) >> 16);\r\n        RotTrans(&v0,&v1,flag);\r\n\r\n        vrt2->vx = v1.vx;\r\n        vrt2->vy = v1.vz;\r\n\r\n\t\tif (vrt2->vy >= 4)\r\n\t\t{\r\n            vrt2->yy = 0x800000 / vrt2->vy;\r\n            vrt2->xx = ((vrt2->vx * (0x800000 / vrt2->vy)) >> 16) + 0x80;\r\n\t\t}\r\n\r\n\t\tvrt2->index = TextureCacheIdx;\r\n\r\n\t\ty2 = vrt2->vy;\r\n        x2 = vrt2->vx;\r\n\t}\r\n\telse\r\n\t{\r\n        x2 = vrt2->vx;\r\n        y2 = vrt2->vy;\r\n\t}\r\n\r\n\tif ((x1 >= -y1) || (x2 >= -y2))\r\n    {\r\n        if ((y1 < x1) && (y2 < x2))\r\n            return;\r\n\r\n\t\tif (((x2 * y1) - (x1 * y2)) > 0)\r\n        {\r\n\r\n            if ((x1 < -y1) && (-y2 < x2))\r\n\t\t\t{\r\n                delta = (x1 + y1);\r\n                delta = (delta << 16) / ((delta - x2) - y2);\r\n                delta = delta * (y2 - y1);\r\n\r\n                y1 += (delta >> 16);\r\n                x1 = -y1;\r\n\t\t\t}\r\n\r\n\t\t\tif ((x1 < y1) && (y2 < x2))\r\n\t\t\t{\r\n                delta = (x1 - y1);\r\n                delta = (delta << 16) / ((delta - x2) + y2);\r\n                delta = delta * (y2 - y1);\r\n\r\n                y2 = y1 + (delta >> 16);\r\n                x2 = y2;\r\n\t\t\t}\r\n\r\n\t\t\tif ((y1 >= 3) || (y2 >= 3))\r\n            {\r\n                if ((y1 < 2) && (y2 > 2))\r\n\t\t\t\t{\r\n\t\t\t\t\tdelta = (2 - y1);\r\n\t\t\t\t\tdelta = (delta << 16) / (y2 - y1);\r\n\t\t\t\t\tdelta = delta * (x2 - x1);\r\n\r\n\t\t\t\t\ty1 = 2;\r\n\t\t\t\t\tx1 += (delta >> 16);\r\n\t\t\t\t}\r\n\t\t\t\telse if ((y2 < 2) && (y1 > 2))\r\n\t\t\t\t{\r\n\t\t\t\t\tdelta = (2 - y2);\r\n\t\t\t\t\tdelta = (delta << 16) / (y1 - y2);\r\n\t\t\t\t\tdelta = delta * (x1 - x2);\r\n\r\n\t\t\t\t\ty2 = 2;\r\n\t\t\t\t\tx2 += (delta >> 16);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tXstart  = (((x1 << 7) / y1) + 0x80);\r\n\t\t\t\tXend    = (((x2 << 7) / y2) + 0x80);\r\n\r\n                if (Xstart != Xend)\r\n                {\r\n                    if (frontsector->ceilingpic == -1)\r\n                        rendersky = true;\r\n\r\n                    if (Xstart < 0)\r\n                        Xstart = 0;\r\n\r\n                    if (Xend > 256)\r\n                        Xend = 256;\r\n\r\n                    solid_cols = &solidcols[Xstart];\r\n                    count = Xstart;\r\n                    xpos1 = 256;\r\n                    while (count < Xend)\r\n                    {\r\n                        xpos1 = count;\r\n                        if (*solid_cols == 0) break;\r\n                        solid_cols++;\r\n                        count++;\r\n                    }\r\n\r\n                    solid_cols = &solidcols[Xend-1];\r\n                    count = Xend;\r\n                    xpos2 = 0;\r\n                    while (count >= Xstart)\r\n                    {\r\n                        xpos2 = count;\r\n                        if (*solid_cols == 0) break;\r\n                        solid_cols--;\r\n                        count--;\r\n                    }\r\n\r\n                    if (xpos1 <= xpos2)\r\n                    {\r\n                        line->xpos1 = (short)xpos1 - 1;\r\n                        line->xpos2 = (short)xpos2 + 1;\r\n                        line->flag |= 1;\r\n                    }\r\n\r\n                    if (!(line->linedef->flags & ML_MIDMASKED))\r\n                    {\r\n                        backsector = line->backsector;\r\n\r\n                        if(!backsector ||\r\n                            backsector->ceilingheight <= frontsector->floorheight ||\r\n                            backsector->floorheight   >= frontsector->ceilingheight)\r\n                        {\r\n                            solid_cols = &solidcols[Xstart];\r\n                            while (Xstart < Xend)\r\n                            {\r\n                                *solid_cols = 1;\r\n                                Xstart += 1;\r\n                                solid_cols++;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/r_phase2.c",
    "content": "\r\n//Renderer phase 2\r\n\r\n#include \"doomdef.h\"\r\n#include \"r_local.h\"\r\n\r\nvoid R_RenderSKY(void)//L8002BF4C\r\n{\r\n\tRECT    rect;\r\n\tDR_MODE *drawmode = (DR_MODE*) getScratchAddr(128);//1F800200\r\n\tSPRT    *skysprt = (SPRT*) getScratchAddr(128);//1F800200\r\n\r\n\tif (skytexturep->index == -1)\r\n\t{\r\n\t\trect.x = (skytexturep->vramx >> 1) + (skytexturep->vtpage & 15) * 64;\r\n\t\trect.y = (skytexturep->vramy) + (skytexturep->vtpage & 16) * 16;\r\n\t\trect.w = 32;\r\n\t\trect.h = 128;\r\n\t\tLoadImage(&rect, (unsigned long *)(byte*)(lumpcache[skytexturep->lump].cache+8));\r\n\t\tskytexturep->index = TextureCacheIdx;\r\n\t}\r\n\r\n\tsetRECT(&rect, skytexturep->vramx, skytexturep->vramy, skytexturep->w, 128);\r\n\tSetDrawMode(drawmode, 0, 0, skytexturep->vtpage, &rect);\r\n\tW_AddPrim(drawmode);// add to order table\r\n\r\n\t/* make sprite sky*/\r\n\tsetSprt(skysprt);\r\n\tsetShadeTex(skysprt, 1);\r\n\tsetXY0(skysprt, 0, 0);\r\n\tsetWH(skysprt, 256, skytexturep->h);\r\n\tsetUV0(skysprt, skytexturep->vramx - (char)(viewangle >> ANGLETOSKYSHIFT), skytexturep->vramy);\r\n\tskysprt->clut = skypalette;\r\n\r\n\tW_AddPrim(skysprt);// add to order table\r\n}\r\n\r\n#define VERTEXES 32\r\nvertex_t newvertexes[VERTEXES];//0x80097acc\r\nint numnewvertexes; //80078044, uGp00000c34\r\n\r\n#define MAXLEAF 21\r\ntypedef struct\r\n{\r\n\tint num_leafs;\t    //*\r\n\tleaf_t lf[MAXLEAF];\t//*4\r\n} vleaf_t;\r\n\r\n#define SKIP_NUM_LEAFS (sizeof(int)/4)\r\n#define V_LEAF_SIZE (sizeof(vleaf_t)/4)\r\n\r\nvoid R_FrontZClip(vleaf_t *vlf_in, vleaf_t **vlf_out);\r\nint R_EdgeClipSide(int mode, vleaf_t **vlf);\r\nint R_LeftEdgeClip(vleaf_t *vlf_in, vleaf_t **vlf_out);\r\nint R_RightEdgeClip(vleaf_t *vlf_in, vleaf_t **vlf_out);\r\n\r\n/*WALL*/\r\nvoid R_WallPrep(leaf_t *lf);\r\nvoid R_Render_Wall(leaf_t *lf, psxobj_t *texture, int topheight, int bottomheight, int top_V, int bottom_V, boolean translucent);\r\n\r\n/*PLANE*/\r\ntypedef enum PlaneType {FLOOR, CEILING} PlaneType;\r\nvoid R_PlanePrep(vleaf_t *vlf1, PlaneType mode);\r\nvoid R_Render_Plane(vleaf_t *vlf1, int zheight, psxobj_t *psxobj);\r\n\r\n/*SPRITE*/\r\nvoid R_Render_Sprite(subsector_t *sub);\r\n\r\n/*WEAPON*/\r\nvoid R_Render_Hud_Weapons(void);\r\n\r\n\r\nvoid R_RenderAll(subsector_t *sub)//L8002C5C8\r\n{\r\n\tSVECTOR\t\t v0;\r\n\tVECTOR\t\t v1;\r\n\tlong\t\t flag[4];\r\n\tleaf_t\t\t *lf;\r\n\tleaf_t\t\t *leafs_ptr;//0x1F8000AC\r\n\tvleaf_t\t\t *leafs_side[2], *leafs_s;//0x1F8000A8\r\n\tvertex_t\t *vrt;\r\n\tint\t\t\t i, sideclip, num_leafs, side;\r\n\tunsigned long *memaddr;\r\n\r\n\tmemaddr = (unsigned long *)getScratchAddr(42);//0x1F8000A8\r\n\r\n\tleafs_ptr =     (leaf_t  *)(memaddr + SKIP_NUM_LEAFS); //0x1F8000AC    Memory leafs_side[0]->lf\r\n\tleafs_side[0] = (vleaf_t *)(memaddr);\t\t           //0x1F8000A8    Memory Base1\r\n\tleafs_side[1] = (vleaf_t *)(memaddr + V_LEAF_SIZE);\t   //0x1F800154    Memory Base2\r\n\r\n\tnum_leafs = sub->numleafs;\r\n\r\n\tlf = &leafs[sub->leaf];\r\n\tfor (i = 0; i < num_leafs; i++)\r\n\t{\r\n\t\tvrt = lf->vertex;\r\n\r\n        leafs_ptr->seg = lf->seg;\r\n        leafs_ptr->vertex = vrt;\r\n\r\n\t\tif (vrt->index != TextureCacheIdx)\r\n\t\t{\r\n\t\t\tv0.vy = 0;\r\n\t\t\tv0.vx = (vrt->x - viewx) >> 16;\r\n\t\t\tv0.vz = (vrt->y - viewy) >> 16;\r\n\t\t\tRotTrans(&v0, &v1, flag);\r\n\r\n            vrt->vx = v1.vx;\r\n            vrt->vy = v1.vz;\r\n\r\n            if (v1.vz > 3)\r\n\t\t\t{\r\n                vrt->yy = 0x800000 / v1.vz;\r\n                vrt->xx = ((0x800000 / v1.vz) * vrt->vx >> 0x10) + 0x80;\r\n\t\t\t}\r\n\r\n\t\t\tvrt->index = TextureCacheIdx;\r\n\t\t}\r\n\r\n        lf++;\r\n        leafs_ptr++;\r\n\t}\r\n\r\n\tleafs_side[0]->num_leafs = num_leafs; //initial count leafs\r\n\r\n\tnumnewvertexes = 0;\r\n\tside = 0;\r\n\r\n\tlf = leafs_side[0]->lf;\r\n\tfor (i = 0; i < leafs_side[0]->num_leafs; i++)\r\n\t{\r\n\t\tif (lf->vertex->vy < 4)\r\n\t\t{\r\n\t\t    if (side == 0)\r\n                leafs_s = leafs_side[1];\r\n            else\r\n                leafs_s = leafs_side[0];\r\n\r\n            R_FrontZClip(leafs_side[0], &leafs_s);\r\n            side ^= 1;\r\n            break;\r\n\t\t}\r\n\t\tlf++;\r\n\t}\r\n\r\n\tsideclip = R_EdgeClipSide(0, &leafs_side[side]);\r\n\tif (sideclip > -1)\r\n    {\r\n        if (sideclip > 0)\r\n        {\r\n            if (side == 0)\r\n                leafs_s = leafs_side[1];\r\n            else\r\n                leafs_s = leafs_side[0];\r\n\r\n            sideclip = R_LeftEdgeClip(leafs_side[side], &leafs_s);\r\n            side ^= 1;\r\n            if (sideclip < 3)\r\n                return;\r\n        }\r\n\r\n        sideclip = R_EdgeClipSide(1, &leafs_side[side]);\r\n        if (sideclip > -1)\r\n        {\r\n            if (sideclip > 0)\r\n            {\r\n\r\n                if (side == 0)\r\n                    leafs_s = leafs_side[1];\r\n                else\r\n                    leafs_s = leafs_side[0];\r\n\r\n                sideclip = R_RightEdgeClip(leafs_side[side], &leafs_s);\r\n                side ^= 1;\r\n                if (sideclip < 3)\r\n                    return;\r\n            }\r\n\r\n            //Walls\r\n            leafs_s = leafs_side[side];\r\n            lf = leafs_s->lf;\r\n            lf[leafs_s->num_leafs].vertex = leafs_s->lf[0].vertex;\r\n            lf[leafs_s->num_leafs].seg = leafs_s->lf[0].seg;\r\n\r\n            for (i = 0; i < leafs_s->num_leafs; i++)\r\n            {\r\n                if ((lf->seg) && (lf->seg->flag & 1))\r\n                {\r\n                    R_WallPrep(lf);\r\n                }\r\n                lf++;\r\n            }\r\n\r\n            if (frontsector->floorheight < viewz)\r\n            {\r\n                R_PlanePrep(leafs_side[side],FLOOR);\r\n            }\r\n\r\n            if ((frontsector->ceilingpic != -1) && (viewz < frontsector->ceilingheight))\r\n            {\r\n                R_PlanePrep(leafs_side[side],CEILING);\r\n            }\r\n\r\n            //Sprites*/\r\n            R_Render_Sprite(sub);\r\n        }\r\n    }\r\n}\r\n\r\nvoid R_FrontZClip(vleaf_t *vlf_in, vleaf_t **vlf_out)//L8002C95C()\r\n{\r\n\tvertex_t    *vrt;\r\n    leaf_t      *lfin, *lfout, *lfnext;\r\n\tint num_leafs, leafs_cnt, i;\r\n\tint delta, y1, y2;\r\n\tvleaf_t *vlf;\r\n\r\n    lfin = vlf_in->lf;\r\n    lfout = (*vlf_out)->lf;\r\n\r\n\tnum_leafs = vlf_in->num_leafs;\r\n\tleafs_cnt = 0;\r\n\r\n\tfor (i = 0; i < num_leafs; i++)\r\n\t{\r\n        if (i == (num_leafs-1))\r\n            lfnext = vlf_in->lf;\r\n\t\telse\r\n\t\t\tlfnext = (lfin+1);\r\n\r\n        y1 = 4 - lfin->vertex->vy;\r\n        y2 = 4 - lfnext->vertex->vy;\r\n\r\n        if (y1 == 0)\r\n        {\r\n\t\t\tlfout->vertex = lfin->vertex;\r\n\t\t\tlfout->seg = lfin->seg;\r\n\r\n        checkpoint:\r\n\t\t\tleafs_cnt += 1;\r\n            lfout++;\r\n            if (leafs_cnt >= MAXLEAF)\r\n                I_Error(\"FrontZClip: Point Overflow\");\r\n        }\r\n        else\r\n        {\r\n            if (y1 < 0)\r\n            {\r\n                lfout->vertex = lfin->vertex;\r\n                lfout->seg = lfin->seg;\r\n\r\n                leafs_cnt += 1;\r\n                lfout++;\r\n                if (leafs_cnt >= MAXLEAF)\r\n                    I_Error(\"FrontZClip: Point Overflow\");\r\n            }\r\n\r\n            if ((y2 != 0) && (~y2 >> 31 == y1 >> 31))\r\n            {\r\n                vrt = &newvertexes[numnewvertexes];\r\n                numnewvertexes++;\r\n\r\n                if (numnewvertexes >= VERTEXES)\r\n                    I_Error(\"FrontZClip: exceeded max new vertexes\\n\");\r\n\r\n                delta = (y1 << 16) / (y1 - y2);\r\n\r\n                vrt->vy = 4;\r\n                vrt->vx = ((delta * (lfnext->vertex->vx - lfin->vertex->vx)) >> 16) + lfin->vertex->vx;\r\n\r\n                vrt->x = ((delta * (lfnext->vertex->x - lfin->vertex->x)) >> 16) + lfin->vertex->x;\r\n                vrt->y = ((delta * (lfnext->vertex->y - lfin->vertex->y)) >> 16) + lfin->vertex->y;\r\n\r\n                vrt->yy = (0x800000 / vrt->vy);\r\n                vrt->xx = ((vrt->yy * vrt->vx) >> 16) + 128;\r\n\r\n                vrt->index = TextureCacheIdx;\r\n\r\n                if ((y1 < 1) || (y2 > -1))\r\n                    lfout->seg = NULL;\r\n                else\r\n                    lfout->seg = lfin->seg;\r\n\r\n                lfout->vertex = vrt;\r\n\r\n                goto checkpoint;\r\n            }\r\n        }\r\n\r\n        lfin++;\r\n\t}\r\n\r\n\t(*vlf_out)->num_leafs = leafs_cnt;\r\n}\r\n\r\nint R_EdgeClipSide(int mode, vleaf_t **vlf)//L8002CC38()\r\n{\r\n\tleaf_t\t*lf;\r\n\tint num_leafs, leafcnt, i, side;\r\n\tunsigned long *addr;\r\n\r\n    lf = (*vlf)->lf;\r\n    addr = (unsigned long *)getScratchAddr(0);\t//0x1F800000\r\n    num_leafs = (*vlf)->num_leafs;\r\n    leafcnt = 0;\r\n\r\n\tif (mode == 0)\r\n\t{\r\n\t\tfor (i = 0; i < num_leafs; i++)\r\n\t\t{\r\n\t\t    if (lf->vertex->vx >= -lf->vertex->vy)\r\n\t\t\t{\r\n\t\t\t\taddr[0] = 0;\r\n                leafcnt++;\r\n\t\t\t}\r\n\t\t\telse\r\n            {\r\n\t\t\t\taddr[0] = 1;\r\n                leafcnt--;\r\n\t\t\t}\r\n            lf++;\r\n            addr++;\r\n\t\t}\r\n\t}\r\n\telse\r\n\t{\r\n\t\tfor (i = 0; i < num_leafs; i++)\r\n\t\t{\r\n\t\t    if (lf->vertex->vy >= lf->vertex->vx)\r\n\t\t\t{\r\n\t\t\t\taddr[0] = 0;\r\n                leafcnt++;\r\n\t\t\t}\r\n\t\t\telse\r\n            {\r\n\t\t\t\taddr[0] = 1;\r\n                leafcnt--;\r\n\t\t\t}\r\n\r\n            lf++;\r\n            addr++;\r\n\t\t}\r\n\t}\r\n\r\n\taddr[0] = *getScratchAddr(0);\t//*0x1F800000\r\n\r\n    if (leafcnt == num_leafs)\r\n        side = 0;\r\n    else if (leafcnt != -num_leafs)\r\n        side = 1;\r\n    else\r\n        side = -1;\r\n\r\n    return side;\r\n}\r\n\r\nint R_LeftEdgeClip(vleaf_t *vlf_in, vleaf_t **vlf_out)//L8002CD38()\r\n{\r\n    vertex_t    *vrt;\r\n\tleaf_t      *lfin, *lfout, *lfnext;\r\n\tint num_leafs, leafs_cnt, i;\r\n\tunsigned long *addr;\r\n\tint vx1, vx2, vy1, delta;\r\n\r\n\tlfout = (*vlf_out)->lf;\r\n\tlfin = vlf_in->lf;\r\n\r\n    leafs_cnt = 0;\r\n\tnum_leafs = vlf_in->num_leafs;\r\n\r\n\taddr = (unsigned long *)getScratchAddr(0);\t//0x1F800000\r\n\r\n\tfor (i = 0; i < num_leafs; i++)\r\n\t{\r\n        if (addr[0] == 0)\r\n        {\r\n            lfout->vertex = lfin->vertex;\r\n            lfout->seg = lfin->seg;\r\n            lfout++;\r\n            leafs_cnt++;\r\n        }\r\n\r\n        if (addr[0] == 0)\r\n        {\r\n            if (addr[1] == 1)\r\n            {\r\n            checknext:\r\n\r\n                if (i < (num_leafs-1))\r\n                    lfnext = (lfin+1);\r\n                else\r\n                    lfnext = vlf_in->lf;\r\n\r\n                vrt = &newvertexes[numnewvertexes];\r\n                numnewvertexes++;\r\n\r\n                if (numnewvertexes >= VERTEXES)\r\n                    I_Error(\"LeftEdgeClip: exceeded max new vertexes\\n\");\r\n\r\n                vx1 = (lfin->vertex->vx + lfin->vertex->vy) << 16;\r\n                vx2 = (lfin->vertex->vx + lfin->vertex->vy) - (lfnext->vertex->vx + lfnext->vertex->vy);\r\n                delta = (vx1 / vx2);\r\n\r\n                vy1 = ((delta * (lfnext->vertex->vy - lfin->vertex->vy)) >> 16) + lfin->vertex->vy;\r\n                vrt->vy = vy1;\r\n                vrt->vx = -vy1;\r\n\r\n                vrt->x = ((delta * (lfnext->vertex->x - lfin->vertex->x)) >> 16) + lfin->vertex->x;\r\n                vrt->y = ((delta * (lfnext->vertex->y - lfin->vertex->y)) >> 16) + lfin->vertex->y;\r\n\r\n                vrt->yy = (0x800000 / vrt->vy);\r\n                vrt->xx = ((vrt->yy * vrt->vx) >> 16) + 128;\r\n\r\n                vrt->index = TextureCacheIdx;\r\n\r\n                lfout->vertex = vrt;\r\n                lfout->seg = lfin->seg;\r\n                lfout++;\r\n\r\n                leafs_cnt++;\r\n                if (leafs_cnt >= MAXLEAF)\r\n                    I_Error(\"LeftEdgeClip: Point Overflow\");\r\n            }\r\n        }\r\n        else if (addr[1] == 0) goto checknext;\r\n\r\n        lfin++;\r\n        addr++;\r\n\t}\r\n\r\n    (*vlf_out)->num_leafs = leafs_cnt;\r\n\r\n    return leafs_cnt;\r\n}\r\n\r\nint R_RightEdgeClip(vleaf_t *vlf_in, vleaf_t **vlf_out)//L8002CFDC()\r\n{\r\n    vertex_t    *vrt;\r\n\tleaf_t      * lfin, *lfout, *lfnext;\r\n\tint num_leafs, leafs_cnt, i;\r\n\tunsigned long *addr;\r\n\tint vx1, vx2, vy1, delta;\r\n\r\n\tlfout = (*vlf_out)->lf;\r\n\tlfin = vlf_in->lf;\r\n\r\n    leafs_cnt = 0;\r\n\tnum_leafs = vlf_in->num_leafs;\r\n\r\n\taddr = (unsigned long *)getScratchAddr(0);\t//0x1F800000\r\n\r\n\tfor (i = 0; i < num_leafs; i++)\r\n\t{\r\n        if (addr[0] == 0)\r\n        {\r\n            lfout->vertex = lfin->vertex;\r\n            lfout->seg = lfin->seg;\r\n            lfout++;\r\n            leafs_cnt++;\r\n        }\r\n\r\n        if (addr[0] == 0)\r\n        {\r\n            if (addr[1] == 1)\r\n            {\r\n            checknext:\r\n\r\n                if (i < (num_leafs-1))\r\n                    lfnext = (lfin+1);\r\n                else\r\n                    lfnext = vlf_in->lf;\r\n\r\n                vrt = &newvertexes[numnewvertexes];\r\n                numnewvertexes++;\r\n\r\n                if (numnewvertexes >= VERTEXES)\r\n                    I_Error(\"RightEdgeClip: exceeded max new vertexes\\n\");\r\n\r\n                vx1 = (lfin->vertex->vx - lfin->vertex->vy) << 16;\r\n                vx2 = (lfin->vertex->vx - lfin->vertex->vy) - (lfnext->vertex->vx - lfnext->vertex->vy);\r\n                delta = (vx1 / vx2);\r\n\r\n                vy1 = ((delta * (lfnext->vertex->vy - lfin->vertex->vy)) >> 16) + lfin->vertex->vy;\r\n                vrt->vy = vy1;\r\n                vrt->vx = vy1;\r\n\r\n                vrt->x = ((delta * (lfnext->vertex->x - lfin->vertex->x)) >> 16) + lfin->vertex->x;\r\n                vrt->y = ((delta * (lfnext->vertex->y - lfin->vertex->y)) >> 16) + lfin->vertex->y;\r\n\r\n                vrt->yy = (0x800000 / vrt->vy) + 1;\r\n                vrt->xx = ((vrt->yy * vrt->vx) >> 16) + 128;\r\n\r\n                vrt->index = TextureCacheIdx;\r\n\r\n                lfout->vertex = vrt;\r\n                lfout->seg = lfin->seg;\r\n                lfout++;\r\n\r\n                leafs_cnt++;\r\n                if (leafs_cnt >= MAXLEAF)\r\n                    I_Error(\"RightEdgeClip: Point Overflow\");\r\n            }\r\n        }\r\n        else if (addr[1] == 0) goto checknext;\r\n\r\n        lfin++;\r\n        addr++;\r\n\t}\r\n\r\n    (*vlf_out)->num_leafs = leafs_cnt;\r\n\r\n    return leafs_cnt;\r\n}\r\n\r\n//--------------------------------------\r\n\r\nvoid R_WallPrep(leaf_t *lf)//L8002D27C\r\n{\r\n\tpsxobj_t *texture;\r\n\tsector_t *back_sector;\r\n\tseg_t\t*seg;\r\n\tline_t   *li;\r\n\tfixed_t f_ceilingheight;\r\n\tfixed_t f_floorheight;\r\n\tfixed_t b_ceilingheight;\r\n\tfixed_t b_floorheight;\r\n\tfixed_t m_top;\r\n\tfixed_t m_bottom;\r\n\tfixed_t height;\r\n\tfixed_t top_V, bottom_V;\r\n\r\n\tseg = lf->seg;\r\n\tli = seg->linedef;\r\n\r\n    f_ceilingheight = (viewz - frontsector->ceilingheight) >> 16;\r\n\tf_floorheight = (viewz - frontsector->floorheight) >> 16;\r\n\r\n\tm_top = f_ceilingheight;//set middle top\r\n\tm_bottom = f_floorheight;//set middle bottom\r\n\r\n\tli->flags |= ML_MAPPED;\r\n\r\n\tback_sector = seg->backsector;\r\n\tif (back_sector)\r\n\t{\r\n\t\tb_ceilingheight = (viewz - back_sector->ceilingheight) >> 16;\r\n\t\tb_floorheight = (viewz - back_sector->floorheight) >> 16;\r\n\r\n\t\tif (back_sector->ceilingheight < frontsector->ceilingheight)\r\n\t\t{\r\n\t\t\tif (back_sector->ceilingpic != -1)\r\n\t\t\t{\r\n\t\t\t\theight = b_ceilingheight - f_ceilingheight;\r\n\r\n\t\t\t\tif (height >= 256)\r\n\t\t\t\t\theight = 255;\r\n\r\n\t\t\t\tif (li->flags & ML_DONTPEGTOP)\r\n\t\t\t\t{\r\n\t\t\t\t\ttop_V = (seg->sidedef->rowoffset >> FRACBITS);\r\n\t\t\t\t\tbottom_V = top_V + height;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tbottom_V = (seg->sidedef->rowoffset >> FRACBITS) + 255;\r\n\t\t\t\t\ttop_V = bottom_V - height;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tm_top = b_ceilingheight;//clip middle top height\r\n\r\n\t\t\t\ttexture = &textures[texturetranslation[seg->sidedef->toptexture]];\r\n\t\t\t\tR_Render_Wall(lf, texture, f_ceilingheight, b_ceilingheight, top_V, bottom_V, false);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (frontsector->floorheight < back_sector->floorheight)\r\n\t\t{\r\n\t\t\theight = f_floorheight - b_floorheight;\r\n\r\n\t\t\tif (height >= 256)\r\n                height = 255;\r\n\r\n\t\t\tif (li->flags & ML_DONTPEGBOTTOM)\r\n\t\t\t{\r\n\t\t\t\ttop_V = ((b_floorheight - f_ceilingheight) + (seg->sidedef->rowoffset >> FRACBITS)) & ~128;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\ttop_V = (seg->sidedef->rowoffset >> FRACBITS);\r\n\t\t\t}\r\n\t\t\tbottom_V = top_V + height;\r\n\r\n\t\t\tm_bottom = b_floorheight;//clip middle bottom height\r\n\r\n\t\t\ttexture = &textures[texturetranslation[seg->sidedef->bottomtexture]];\r\n\t\t\tR_Render_Wall(lf, texture, b_floorheight, f_floorheight, top_V, bottom_V, false);\r\n\t\t}\r\n\r\n\t\tif (!(li->flags & (ML_MIDTRANSLUCENT| ML_MIDMASKED)))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\r\n\theight = m_bottom - m_top;\r\n\tif (height >= 256)\r\n        height = 255;\r\n\r\n\t// handle unpegging (bottom of texture at bottom, or top of texture at top)\r\n\tif (li->flags & ML_DONTPEGBOTTOM)\r\n\t{\r\n\t\tbottom_V = (seg->sidedef->rowoffset >> FRACBITS) + 255;\r\n\t\ttop_V = bottom_V - height;\r\n\t}\r\n\telse\r\n\t{\r\n\t\ttop_V = (seg->sidedef->rowoffset >> FRACBITS);\r\n\t\tbottom_V = top_V + height;\r\n\t}\r\n\r\n\ttexture = &textures[texturetranslation[seg->sidedef->midtexture]];\r\n\tR_Render_Wall(lf, texture, m_top, m_bottom, top_V, bottom_V, (li->flags & ML_MIDTRANSLUCENT));\r\n}\r\n\r\n//L8002D554\r\nvoid R_Render_Wall(leaf_t *lf, psxobj_t *texture, int topheight, int bottomheight, int top_V, int bottom_V, boolean translucent)\r\n{\r\n\tRECT rect;\r\n\tvertex_t  *vrt;\r\n\tseg_t     *seg;\r\n\tangle_t   angle;\r\n\r\n\tint xx, x1, x2;\r\n\tint yy, y1, y2;\r\n\r\n\tint ztop, zbot;\r\n\tint ystep1, ystep2, xstep1, xstep2, zstep1;\r\n\tint vcos, vsin, vx, vy, vstep1, vstep2, vd, vs1, vs2;\r\n\r\n\tint intensity, r, g, b;\r\n\tint v0, v1, u0, vd1, vd2, upos;\r\n\tint deltax, deltay, ypos1, ypos2;\r\n\r\n\tDR_TWIN *texwindow = (DR_TWIN*) getScratchAddr(128);//1F800200\r\n\tPOLY_FT3 *wallpoly = (POLY_FT3*) getScratchAddr(128);//1F800200\r\n\r\n\tvrt = lf->vertex;\r\n\r\n\tx1 = vrt->xx;\r\n\tx2 = (lf[1].vertex)->xx;\r\n\txx = (unsigned)(x2 - x1);\r\n\r\n\tif (xx > 0)\r\n\t{\r\n\t\tif (viewplayer->cheats & CF_X_RAY)\r\n\t\t\ttranslucent = true;\r\n\r\n\t\tif (texture->index == -1)\r\n\t\t{\r\n\t\t\tdecode(lumpcache[texture->lump].cache, tempbuffer);\r\n\r\n\t\t\trect.x = (texture->vramx >> 1) + (texture->vtpage & 15) * 64;\r\n\t\t\trect.y = texture->vramy + (texture->vtpage & 16) * 16;\r\n\t\t\trect.w = 32;\r\n\t\t\trect.h = 128;\r\n\t\t\tLoadImage(&rect, (unsigned long *)(byte*)(tempbuffer + 8));\r\n\t\t\ttexture->index = TextureCacheIdx;\r\n\t\t}\r\n\r\n\t\tsetRECT(&rect, texture->vramx, texture->vramy, texture->w, texture->h);\r\n\t\tSetTexWindow(texwindow, &rect);\r\n\t\tW_AddPrim(texwindow);// add to order table\r\n\r\n        //Setup Wall Primitive Polygon\r\n\t\tsetPolyFT3(wallpoly);\r\n\r\n\t\tif (translucent)\r\n        {\r\n\t\t\tsetSemiTrans(wallpoly, 1);\r\n        }\r\n\r\n\t\twallpoly->clut = palettebase;\r\n\t\twallpoly->tpage = texture->vtpage;\r\n\r\n        y1 = lf->vertex->yy;\r\n        y2 = (lf[1].vertex)->yy;\r\n        yy = (unsigned)(y2 - y1);\r\n\r\n        ztop = (topheight * y2) - (topheight * y1);\r\n        zbot = (bottomheight * y2) - (bottomheight * y1);\r\n\r\n        seg = lf->seg;\r\n        angle = seg->angle >> ANGLETOFINESHIFT;\r\n\r\n        vsin = finesine[angle];\r\n\t\tvcos = finecosine[angle];\r\n\r\n\t\tvx = (seg->v1->x - viewx) >> 8;\r\n\t\tvy = (seg->v1->y - viewy) >> 8;\r\n\r\n\t\tangle = ((seg->angle - viewangle) + ANG90) >> ANGLETOFINESHIFT;\r\n\r\n\t\tvd = ((vx * (vsin >> 8)) - (vy * (vcos >> 8))) >> 8;\r\n\r\n\t\tvstep1 = (vd * (finecosine[angle] >> 8)) >> 4;\r\n\t\tvstep2 = finesine[angle] >> 12;\r\n\r\n        ystep1 = (topheight * y1) + (100 * FRACUNIT);\r\n        ystep2 = (bottomheight * y1) + (100 * FRACUNIT);\r\n\r\n        vs1 = ((x1 - 0x80) * vstep1) + ((vd * 8) * (finesine[angle] >> 8));\r\n        vs2 = ((x1 - 0x80) * vstep2) - ((finecosine[angle] >> 8) * 8);\r\n\r\n        deltax = (seg->xpos1 - x1);\r\n        if (x1 < seg->xpos1)\r\n        {\r\n            ystep1 += deltax * (ztop / xx);\r\n            ystep2 += deltax * (zbot / xx);\r\n            vs1 += deltax * vstep1;\r\n            vs2 += deltax * vstep2;\r\n            x1 = seg->xpos1;\r\n        }\r\n\r\n        if (seg->xpos2 < x2)\r\n            x2 = seg->xpos2;\r\n\r\n        while(x1 < x2)\r\n\t\t{\r\n            ypos1 = (ystep1 >> 16);\r\n            ypos2 = (ystep2 >> 16);\r\n\r\n            if ((ypos1 <= 200) && (ypos2 >= 0))\r\n            {\r\n                upos = 0;\r\n                if (vs2 != 0)\r\n                {\r\n                    upos = ((((seg->offset + FRACUNIT + seg->sidedef->textureoffset) -\r\n                                  ((vx * (vcos >> 8)) + (vy * (vsin >> 8))) >> 8) + (vs1 / vs2)) >> 8);\r\n                }\r\n\r\n                v0 = top_V;\r\n\t\t\t\tv1 = bottom_V;\r\n\r\n                deltay = (ypos2 - ypos1);\r\n\r\n                if ((deltay > 509))\r\n                {\r\n                    vd = (100 - ypos1) << 16;\r\n\r\n                    vd1 = v0 + (((vd/ deltay) * (v1 - v0)) >> 16);\r\n                    vd2 = ((((100 * FRACUNIT) / deltay) * (v1 - v0)) >> 16);\r\n\r\n                    if (ypos1 < 0)\r\n                    {\r\n                        ypos1 = 0;\r\n                        v0 = vd1 - vd2;\r\n                    }\r\n                    if (ypos2 >= 201)\r\n                    {\r\n                        ypos2 = 200;\r\n                        v1 = vd1 + vd2;\r\n                    }\r\n                }\r\n\r\n                if (!viewlighting)\r\n                {\r\n                    r = base_r;\r\n\t\t\t\t\tg = base_g;\r\n\t\t\t\t\tb = base_b;\r\n                }\r\n                else\r\n                {\r\n                    intensity = y1 >> 8;\r\n\r\n                    if (intensity < 64)\r\n                        intensity = 64;\r\n                    else if (intensity > 160)\r\n                        intensity = 160;\r\n\r\n                    r = (intensity * base_r) >> 7;\r\n                    g = (intensity * base_g) >> 7;\r\n                    b = (intensity * base_b) >> 7;\r\n\r\n                    if (r > 255) { r = 255; }\r\n                    if (g > 255) { g = 255; }\r\n                    if (b > 255) { b = 255; }\r\n                }\r\n\r\n                setRGB0(wallpoly, r, g, b);\r\n\r\n                //setXY3(p,_x0,_y0,_x1,_y1,_x2,_y2)\r\n\t\t\t\tsetXY3(wallpoly,\r\n\t\t\t\t\tx1  , ypos1-1,\r\n\t\t\t\t\tx1+1, ypos2+1,\r\n\t\t\t\t\tx1  , ypos2+1);\r\n\r\n                //setUV3(p,_u0,_v0,_u1,_v1,_u2,_v2)\r\n\t\t\t\tsetUV3(wallpoly,\r\n                        upos, v0,\r\n                        upos, v1,\r\n                        upos, v1);\r\n\r\n                W_AddPrim(wallpoly);// add to order table\r\n            }\r\n\r\n            x1 += 1;\r\n            y1 += (yy / xx);\r\n\r\n            vs1 += vstep1;\r\n            vs2 += vstep2;\r\n\r\n            ystep1 += (ztop / xx);\r\n            ystep2 += (zbot / xx);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid R_PlanePrep(vleaf_t *vlf1, PlaneType planeType)//L8002E178\r\n{\r\n\tRECT rect;\r\n\tint pic;\r\n\tfixed_t zheight;\r\n\tpsxobj_t *psxobj;\r\n\tbyte *data;\r\n\tDR_TWIN *texwindow = (DR_TWIN*) getScratchAddr(128);//1F800200\r\n\r\n    if (planeType == FLOOR)\r\n    {\r\n        pic = frontsector->floorpic;\r\n    }\r\n    //ceiling\r\n    else\r\n    {\r\n        pic = frontsector->ceilingpic;\r\n    }\r\n\r\n    //printf(\"flattranslation[pic] %d\\n\",flattranslation[pic]);\r\n\tpsxobj = &texflats[flattranslation[pic]];\r\n\r\n\tif (psxobj->index == -1)\r\n\t{\r\n\t\tif (lumpencode[psxobj->lump] == 0)\r\n\t\t{\r\n\t\t    data = (byte *)tempbuffer;\r\n\t\t\tdecode(lumpcache[psxobj->lump].cache, tempbuffer);\r\n\t\t}\r\n\t\telse\r\n        {\r\n            data = (byte *)lumpcache[psxobj->lump].cache;\r\n        }\r\n\r\n\t\trect.x = (psxobj->vramx >> 1) + (psxobj->vtpage & 15) * 64;\r\n\t\trect.y = psxobj->vramy + (psxobj->vtpage & 16) * 16;\r\n\t\trect.w = 32;\r\n\t\trect.h = 64;\r\n\t\tLoadImage(&rect, (unsigned long *)(byte*)(data + 8));\r\n\t\tpsxobj->index = TextureCacheIdx;\r\n\t}\r\n\r\n\tsetRECT(&rect, psxobj->vramx, psxobj->vramy, 64, 64);\r\n\tSetTexWindow(texwindow, &rect);\r\n\tW_AddPrim(texwindow);// add to order table\r\n\r\n    if (planeType == FLOOR)\r\n    {\r\n        zheight = (frontsector->floorheight - viewz);\r\n    }\r\n    //ceiling\r\n    else\r\n    {\r\n        zheight = (frontsector->ceilingheight - viewz);\r\n    }\r\n\r\n\t//R_Render_Plane\r\n\tR_Render_Plane(vlf1, zheight >> FRACBITS, psxobj);\r\n}\r\n\r\ntypedef struct\r\n{\r\n\tunsigned int x_pos[2];\t//*, 4\r\n} xpos_t;\r\n\r\nxpos_t x_table[200];//0x80097eb0\r\n\r\n//L8002E5E4\r\nvoid R_Render_Plane(vleaf_t *vlf1, int zheight, psxobj_t *psxobj)\r\n{\r\n\tleaf_t* lf1;\r\n\tint num_leafs, i, j, v_index1, v_index2;\r\n\tangle_t angle;\r\n\tint yy1, yy2;\r\n\tint x1, x2, y1, y2, side, tmp, xpos, ypos, linecnt;\r\n\tint vcos, vsin, vx, vy;\r\n\tint dx1, dx2, dx3, dx4;\r\n\tint vx1, vx2, vy1, vy2;\r\n\tint intensity, r, g, b;\r\n\tint delta, delta1, delta2, delta3;\r\n\tunsigned long *v_xx;\r\n\tunsigned long *v_yy;\r\n\txpos_t *xtable;\r\n\r\n\t#if FIX_FLATSPANS == 1\r\n        int origSpanR;\r\n        int origSpanUR;\r\n        int origSpanVR;\r\n    #endif\r\n\r\n\tPOLY_FT3 *planepoly = (POLY_FT3*) getScratchAddr(128);//1F800200\r\n\r\n\tlf1 = vlf1->lf;\r\n\r\n\tv_xx = (unsigned long *)getScratchAddr(160);\r\n\tv_yy = (unsigned long *)getScratchAddr(160+MAXLEAF);\r\n\r\n\tnum_leafs = vlf1->num_leafs;\r\n\r\n\tfor (i = 0; i < num_leafs; i++)\r\n\t{\r\n\t\tv_xx[i] = lf1->vertex->xx;\r\n\t\tv_yy[i] = 99 - ((zheight * lf1->vertex->yy) >> 16);\r\n\t\tlf1++;\r\n\t}\r\n\r\n\tyy1 = 200;\r\n\tyy2 = 0;\r\n\r\n\tfor (i = 0; i < num_leafs; i++)\r\n\t{\r\n\t\tif (i == (num_leafs - 1))\r\n\t\t\tv_index1 = 0;\r\n\t\telse\r\n            v_index1 = (i + 1);\r\n\r\n\t\tif (v_yy[v_index1] != v_yy[i])\r\n\t\t{\r\n\t\t\tif ((int)v_yy[i] < (int)v_yy[v_index1])\r\n\t\t\t{\r\n\t\t\t    v_index2 = i;\r\n\t\t\t    side = 1;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tv_index2 = v_index1;\r\n\t\t\t\tv_index1 = i;\r\n\t\t\t\tside = 0;\r\n\t\t\t}\r\n\r\n\t\t\ty1 = v_yy[v_index2];\r\n\t\t\ty2 = v_yy[v_index1];\r\n\t\t\tx1 = v_xx[v_index2] << 16;\r\n\t\t\tx2 = v_xx[v_index1] << 16;\r\n\r\n\t\t\tdelta = ((x2-x1)/(y2-y1));\r\n\r\n\t\t\tif (y1 < 0)\r\n\t\t\t{\r\n\t\t\t\tx1 -= (y1 * delta);\r\n\t\t\t\ty1 = 0;\r\n\t\t\t}\r\n\r\n\t\t\tif (y2 > 200)\r\n\t\t\t\ty2 = 200;\r\n\r\n\t\t\tif (y1 < yy1)\r\n\t\t\t\tyy1 = y1;\r\n\r\n\t\t\tif (yy2 < y2)\r\n\t\t\t\tyy2 = y2;\r\n\r\n            xtable = &x_table[y1];\r\n\t\t\twhile (y1 < y2)\r\n\t\t\t{\r\n\t\t\t    xtable->x_pos[side] = (x1 >> 16);\r\n\t\t\t    xtable++;\r\n\t\t\t\tx1 += delta;\r\n\t\t\t\ty1 += 1;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tsetPolyFT3(planepoly);\r\n\tplanepoly->clut = palettebase;\r\n\tplanepoly->tpage = psxobj->vtpage;\r\n\r\n\txtable = &x_table[yy1];\r\n\twhile (yy1 < yy2)\r\n\t{\r\n\t\tx1 = xtable->x_pos[0];\r\n\t\tx2 = xtable->x_pos[1];\r\n\t\txtable++;\r\n\r\n\t\tif (x1 != x2)\r\n\t\t{\r\n            tmp = x1;\r\n            if (x2 < x1)\r\n            {\r\n                x1 = x2;\r\n                x2 = tmp;\r\n            }\r\n\r\n\t\t\tangle = (zheight * yslope[yy1]) >> 16;\r\n\r\n\t\t\tvcos = (angle * viewcos);\r\n\t\t\tvsin = (angle * viewsin);\r\n\r\n\t\t\tx1 -= 2;\r\n\t\t\tx2 += 2;\r\n\r\n\t\t\tvy = vsin + viewy;\r\n\t\t\tvx = vcos + viewx;\r\n\r\n\t\t\tif (vsin < 0)\r\n\t\t\t\tvsin += 127;\r\n\r\n\t\t\tvcos = (-viewcos * angle);\r\n\t\t\tif (vcos < 0)\r\n\t\t\t\tvcos += 127;\r\n\r\n\t\t\tdx1 = ((x1 - 128) * (vsin >> 7));\r\n\t\t\tdx2 = ((x1 - 128) * (vcos >> 7));\r\n\t\t\tdx3 = ((x2 - 128) * (vsin >> 7));\r\n\t\t\tdx4 = ((x2 - 128) * (vcos >> 7));\r\n\r\n\t\t\tvx1 = (vx + dx1) >> 16;\r\n\t\t\tvx2 = (vx + dx3) >> 16;\r\n\t\t\tvy2 = (vy + dx4) >> 16;\r\n\t\t\tvy1 = (vy + dx2) >> 16;\r\n\t\t\t//------------------\r\n\r\n\t\t\tif (vx1 < vx2)\r\n\t\t\t{\r\n\t\t\t\ttmp = (vx1 & -64);\r\n\t\t\t\tvx1 -= tmp;\r\n\t\t\t\tvx2 -= tmp;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\ttmp = (vx2 & -64);\r\n\t\t\t\tvx2 -= tmp;\r\n\t\t\t\tvx1 -= tmp;\r\n\t\t\t}\r\n\r\n\t\t\tif (vy1 < vy2)\r\n\t\t\t{\r\n\t\t\t\ttmp = (vy1 & -64);\r\n\t\t\t\tvy1 -= tmp;\r\n\t\t\t\tvy2 -= tmp;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\ttmp = (vy2 & -64);\r\n\t\t\t\tvy2 -= tmp;\r\n\t\t\t\tvy1 -= tmp;\r\n\t\t\t}\r\n\r\n\t\t\tif (!viewlighting)\r\n            {\r\n                r = base_r;\r\n\t\t\t\tg = base_g;\r\n\t\t\t\tb = base_b;\r\n            }\r\n            else\r\n\t\t\t{\r\n\t\t\t\tangle >>= 1;\r\n\r\n\t\t\t\tintensity = 160;\r\n\t\t\t\tintensity -= angle;\r\n\r\n\t\t\t\tif (intensity < 64)\r\n\t\t\t\t{\r\n\t\t\t\t\tintensity = 64;\r\n\t\t\t\t}\r\n\t\t\t\telse if (intensity >= 161)\r\n\t\t\t\t{\r\n\t\t\t\t\tintensity = 160;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tr = (intensity * base_r) >> 7;\r\n\t\t\t\tg = (intensity * base_g) >> 7;\r\n\t\t\t\tb = (intensity * base_b) >> 7;\r\n\r\n\t\t\t\tif (r > 255) { r = 255; }\r\n\t\t\t\tif (g > 255) { g = 255; }\r\n\t\t\t\tif (b > 255) { b = 255; }\r\n\r\n\t\t\t}\r\n\r\n\t\t\tsetRGB0(planepoly, r, g, b);\r\n\r\n\t\t\tlinecnt = 0;\r\n\r\n\t\t\tif((vx1 < 256) == 0 || (vx2 < 256) == 0 || (vy1 < 256) == 0 || (vy2 < 256) == 0)\r\n            {\r\n                xpos = (vx2 - vx1);\r\n                if (xpos < 0)\r\n                    xpos = -xpos;\r\n\r\n                xpos >>= 7;\r\n\r\n                ypos = (vy2 - vy1);\r\n                if (ypos < 0)\r\n                    ypos = -ypos;\r\n\r\n                ypos >>= 7;\r\n\r\n                if (linecnt < ypos)\r\n                    linecnt = ypos;\r\n                else\r\n                    linecnt = xpos;\r\n            }\r\n\r\n\t\t\tif (linecnt == 0)\r\n\t\t\t{\r\n\t\t\t\t//setXY3(p,_x0,_y0,_x1,_y1,_x2,_y2)\r\n\t\t\t\tsetXY3(planepoly,\r\n\t\t\t\t\tx1, yy1,\r\n\t\t\t\t\tx2, yy1,\r\n\t\t\t\t\tx2, yy1+1);\r\n\r\n\t\t\t\t//setUV3(p,_u0,_v0,_u1,_v1,_u2,_v2)\r\n\t\t\t\tsetUV3(planepoly,\r\n\t\t\t\t\tvx1, vy1,\r\n\t\t\t\t\tvx2, vy2,\r\n\t\t\t\t\tvx2, vy2);\r\n\r\n\t\t\t\tW_AddPrim(planepoly);// add to order table\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tlinecnt += 1;\r\n\t\t\t\tdelta1 = ((x2 - x1) / linecnt);\r\n\t\t\t\tdelta2 = ((vx2 - vx1) / linecnt);\r\n\t\t\t\tdelta3 = ((vy2 - vy1) / linecnt);\r\n\r\n\t\t\t\t// From PsyDoom: precision fix to prevent cracks at the right side of the screen on large open maps like 'Tower Of Babel'.\r\n                // Store the coords where the last span should end, and use those for the right side of the last span instead of\r\n                // the somewhat truncated/imprecise stepped coords.\r\n                //\r\n                // TODO: make this tweak configurable according to user prefs.\r\n                #if FIX_FLATSPANS == 1\r\n                    origSpanR = x2;\r\n                    origSpanUR = vx2;\r\n                    origSpanVR = vy2;\r\n                #endif\r\n\r\n\t\t\t\tfor (j = 0; j < linecnt; j++)\r\n\t\t\t\t{\r\n\t\t\t\t\tx2 = (x1 + delta1);\r\n\t\t\t\t\tvx2 = (vx1 + delta2);\r\n\t\t\t\t\tvy2 = (vy1 + delta3);\r\n\r\n\t\t\t\t\t// From PsyDoom: precision fix to prevent cracks at the right side of the screen on large open maps like 'Tower Of Babel'.\r\n                    // TODO: make this tweak configurable according to user prefs.\r\n                    #if FIX_FLATSPANS == 1\r\n                        if ((j + 1) >= linecnt)\r\n                        {\r\n                            x2 = origSpanR;\r\n                            vx2 = origSpanUR;\r\n                            vy2 = origSpanVR;\r\n                        }\r\n                    #endif\r\n\r\n\t\t\t\t\txpos = 0;\r\n\t\t\t\t\tif ((vx1 < vx2) && (vx2 < 256) == 0)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\txpos = vx1 & -128;\r\n\t\t\t\t\t\tvx1 -= xpos;\r\n\t\t\t\t\t\tvx2 -= xpos;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if((vx2 < vx1) && (vx1 < 256 == 0))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\txpos = vx2 & -128;\r\n\t\t\t\t\t\tvx2 -= xpos;\r\n\t\t\t\t\t\tvx1 -= xpos;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\typos = 0;\r\n\t\t\t\t\tif ((vy1 < vy2) && (vy2 < 256) == 0)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\typos = vy1 & -128;\r\n\t\t\t\t\t\tvy1 -= ypos;\r\n\t\t\t\t\t\tvy2 -= ypos;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if ((vy2 < vy1) && (vy1 < 256) == 0)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\typos = vy2 & -128;\r\n\t\t\t\t\t\tvy2 -= ypos;\r\n\t\t\t\t\t\tvy1 -= ypos;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t//setXY3(p,_x0,_y0,_x1,_y1,_x2,_y2)\r\n\t\t\t\t\tsetXY3(planepoly,\r\n\t\t\t\t\t\tx1, yy1,\r\n\t\t\t\t\t\tx2, yy1,\r\n\t\t\t\t\t\tx2, yy1 + 1);\r\n\r\n\t\t\t\t\t//setUV3(p,_u0,_v0,_u1,_v1,_u2,_v2)\r\n\t\t\t\t\tsetUV3(planepoly,\r\n\t\t\t\t\t\tvx1, vy1,\r\n\t\t\t\t\t\tvx2, vy2,\r\n\t\t\t\t\t\tvx2, vy2);\r\n\r\n\t\t\t\t\tW_AddPrim(planepoly);// add to order table\r\n\r\n\t\t\t\t\tx1 = x2;\r\n\t\t\t\t\tvx1 = vx2 + xpos;\r\n\t\t\t\t\tvy1 = vy2 + ypos;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tyy1++;\r\n\t}\r\n}\r\n\r\n// A vissprite_t is a thing that will be drawn during a refresh\r\ntypedef struct vissprite_s\r\n{\r\n\tint     x;\r\n\tint     z;\r\n\tmobj_t  *thing;\r\n\tstruct vissprite_s *next;//800A886C || L80096BA0 on tmp\r\n} vissprite_t;\r\n\r\n#define MAXVISSPRITES 64\r\nvissprite_t vissprites[MAXVISSPRITES];//800a8860\r\nvissprite_t visspritehead;//80096b94\r\n\r\n#define ASPECT_CORRECT ((FRACUNIT * 4) / 5)\r\n\r\nvoid R_Render_Sprite(subsector_t *sub)//L8002F200\r\n{\r\n\tmobj_t  *thing;\r\n\tfixed_t tx, tz;\r\n\tspritedef_t\t\t*sprdef;\r\n\tspriteframe_t\t*sprframe;\r\n\r\n\tvissprite_t *vissprite_p;\r\n\tvissprite_t *vissprite_p2;\r\n\r\n\tangle_t      ang;\r\n\tunsigned int rot;\r\n\tboolean      flip;\r\n\tint          lump;\r\n\tint\t\t\t blendflags ;\r\n\r\n\tint x, y, w, h;\r\n\r\n\tpsxobj_t\t*spr;\r\n\tRECT\t\tarea;\r\n\tSVECTOR\t\tv0;\r\n\tVECTOR\t\tv1;\r\n\tlong\t\tflag[4];\r\n\r\n\tint count;\r\n\r\n\tDR_TWIN *texwindow = (DR_TWIN*) getScratchAddr(128);//1F800200\r\n\tPOLY_FT4 *spritepoly = (POLY_FT4*) getScratchAddr(128);//1F800200\r\n\r\n\tvisspritehead.next = &visspritehead;\r\n\tvissprite_p = vissprites;\r\n\r\n\tcount = 0;\r\n\tfor (thing = sub->sector->thinglist; thing; thing = thing->snext)\r\n\t{\r\n\t\tif (thing->subsector != sub)\r\n\t\t\tcontinue;\r\n\r\n\t\t// transform origin relative to viewpoint\r\n        v0.vy = 0;\r\n        v0.vx = (short)((unsigned int)(thing->x - viewx) >> 0x10);\r\n        v0.vz = (short)((unsigned int)(thing->y - viewy) >> 0x10);\r\n        RotTrans(&v0,&v1,flag);\r\n\r\n\t\ttz = v1.vz;\r\n\r\n\t\t// thing is behind view plane?\r\n\t\tif (tz < MINZ)\r\n\t\t\tcontinue;\r\n\r\n\t\ttx = v1.vx;\r\n\r\n\t\t// too far off the side?\r\n\t\tif (tx > (tz << 1) || tx < -(tz << 1))\r\n\t\t\tcontinue;\r\n\r\n\t\tvissprite_p->x = tx;\r\n\t\tvissprite_p->z = 0x800000 / tz;\r\n\t\tvissprite_p->thing = thing;\r\n\r\n\t\tvissprite_p2 = &visspritehead;\r\n\t\tif (vissprite_p2->next != &visspritehead)\r\n\t\t{\r\n\t\t\tdo\r\n            {\r\n\t\t\t\tif (vissprite_p->z <= vissprite_p2->next->z)\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tvissprite_p2 = vissprite_p2->next;\r\n\t\t\t} while (vissprite_p2->next != &visspritehead);\r\n\t\t}\r\n\r\n\t\tvissprite_p->next = vissprite_p2->next;\r\n\t\tvissprite_p2->next = vissprite_p;\r\n\t\tvissprite_p++;\r\n\r\n\t\tcount++;\r\n\t\tif (count >= MAXVISSPRITES)\r\n        {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tif (count != 0)\r\n\t{\r\n\t\tsetRECT(&area, 0, 0, 0, 0);\r\n\t\tSetTexWindow(texwindow, &area);\r\n\t\tW_AddPrim(texwindow);// add to order table\r\n\r\n\t\tsetPolyFT4(spritepoly);\r\n\t\tspritepoly->clut = palettebase;\r\n\r\n\t\tvissprite_p = visspritehead.next;\r\n\t\tif (vissprite_p != &visspritehead)\r\n\t\t{\r\n\t\t\tdo\r\n            {\r\n\t\t\t\tthing = vissprite_p->thing;\r\n\r\n\t\t\t\tsprdef = &sprites[thing->sprite];\r\n\t\t\t\tsprframe = &sprdef->spriteframes[thing->frame & FF_FRAMEMASK];\r\n\r\n\t\t\t\tif (sprframe->rotate != 0)\r\n\t\t\t\t{\r\n\t\t\t\t\tang = R_PointToAngle2(viewx, viewy, thing->x, thing->y);\r\n\t\t\t\t\trot = (ang - thing->angle + (unsigned int)(ANG45 / 2) * 9) >> 29;\r\n\t\t\t\t\tlump = sprframe->lump[rot];\r\n\t\t\t\t\tflip = (boolean)(sprframe->flip[rot]);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tlump = sprframe->lump[0];\r\n\t\t\t\t\tflip = (boolean)(sprframe->flip[0]);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlump = lump - firstsprite;\r\n\t\t\t\tspr = &texsprites[lump];\r\n\r\n\t\t\t\tTextureCache(spr);\r\n\r\n\t\t\t\tblendflags = (thing->flags & MF_ALL_BLEND_MASKS) >> 28;\r\n\t\t\t\tif (blendflags  != 0)\r\n\t\t\t\t{\r\n                    setSemiTrans(spritepoly, true);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tsetSemiTrans(spritepoly, false);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t//Blend Translucent\r\n\t\t\t\tspritepoly->tpage = spr->vtpage | getTPage(0, blendflags >> 1, 0, 0);\r\n\r\n\t\t\t\tif (thing->frame & FF_FULLBRIGHT)\r\n\t\t\t\t{\r\n\t\t\t\t\tsetRGB0(spritepoly, 160, 160, 160);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tsetRGB0(spritepoly, base_r, base_g, base_b);\r\n\t\t\t\t}\r\n\r\n                y = -vissprite_p->z * ((thing->z - viewz >> 16) + spr->y);\r\n\t\t\t\ty = (y >> 16) + 100;\r\n\r\n                w = ((((spr->w * ASPECT_CORRECT) >> 16) * vissprite_p->z) >> 16);\r\n                h = ((spr->h * vissprite_p->z) >> 16);\r\n\r\n                if (flip == 0)\r\n                {\r\n                    //setUV4(p,_u0,_v0,_u1,_v1,_u2,_v2,_u3,_v3)\r\n\t\t\t\t\tsetUV4(spritepoly,\r\n\t\t\t\t\t\tspr->vramx             , spr->vramy,\r\n\t\t\t\t\t\tspr->vramx + spr->w - 1, spr->vramy,\r\n\t\t\t\t\t\tspr->vramx             , spr->vramy + spr->h - 1,\r\n\t\t\t\t\t\tspr->vramx + spr->w - 1, spr->vramy + spr->h - 1);\r\n\r\n                    x = (vissprite_p->x - ((spr->x * ASPECT_CORRECT) >> 16)) * vissprite_p->z;\r\n\t\t\t\t\tx = (x >> 16) + 128;\r\n                }\r\n                else\r\n                {\r\n                    //setUV4(p,_u0,_v0,_u1,_v1,_u2,_v2,_u3,_v3)\r\n                    setUV4(spritepoly,\r\n\t\t\t\t\t\tspr->vramx + spr->w - 1, spr->vramy,\r\n\t\t\t\t\t\tspr->vramx             , spr->vramy,\r\n\t\t\t\t\t\tspr->vramx + spr->w - 1, spr->vramy + spr->h - 1,\r\n\t\t\t\t\t\tspr->vramx             , spr->vramy + spr->h - 1);\r\n\r\n                    x = (vissprite_p->x + ((spr->x * ASPECT_CORRECT) >> 16)) * vissprite_p->z;\r\n\t\t\t\t\tx = (x >> 16) - (w - 128);\r\n                }\r\n\r\n                //setXY4(p,_x0,_y0,_x1,_y1,_x2,_y2,_x3,_y3)\r\n\t\t\t\tsetXY4(spritepoly,\r\n\t\t\t\t\tx     , y,\r\n\t\t\t\t\tx + w , y,\r\n\t\t\t\t\tx     , y + h,\r\n\t\t\t\t\tx + w , y + h);\r\n\r\n\t\t\t\tW_AddPrim(spritepoly);// add to order table\r\n\r\n\t\t\t\tvissprite_p = vissprite_p->next;\r\n\t\t\t} while (vissprite_p != &visspritehead);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid R_Render_Hud_Weapons(void)//L8002FD04\r\n{\r\n\tint\t\t\t\ti;\r\n\tpspdef_t\t\t*psp;\r\n\tstate_t\t\t\t*state;\r\n\tspritedef_t\t\t*sprdef;\r\n\tspriteframe_t\t*sprframe;\r\n\tint\t\t\t\tlump;\r\n\tint\t\t\t\tflagtranslucent;\r\n\r\n\tunsigned short\tcontrol_tpage;\r\n\tbyte\t\t\tr, g, b;\r\n\tpsxobj_t\t\t*spr;\r\n\tRECT\t\t\tarea;\r\n\r\n\tDR_MODE         *drawmode = (DR_MODE*) getScratchAddr(128);//1F800200\r\n\tSPRT            *weaponpic = (SPRT*) getScratchAddr(128);//1F800200\r\n\r\n\tpsp = &viewplayer->psprites[0];\r\n\r\n\tfor (i = 0; i < NUMPSPRITES; i++, psp++)\r\n\t{\r\n\t\tif ((state = psp->state) != 0) /* a null state means not active */\r\n\t\t{\r\n\t\t\tsprdef = &sprites[state->sprite];\r\n\t\t\tsprframe = &sprdef->spriteframes[state->frame & FF_FRAMEMASK];\r\n\t\t\tlump = sprframe->lump[0];\r\n\r\n\t\t\tlump = lump - firstsprite;\r\n            spr = &texsprites[lump];\r\n\r\n\t\t\tTextureCache(spr);\r\n\r\n\t\t\t/* change default tpage directive */\r\n\t\t\tsetRECT(&area, 0, 0, 0, 0);\r\n\t\t\tflagtranslucent = (viewplayer->mo->flags & (MF_BLENDMASK1 | MF_BLENDMASK2 | MF_BLENDMASK3)) != 0;\r\n\t\t\tcontrol_tpage = spr->vtpage | flagtranslucent << 5;\r\n\t\t\tSetDrawMode(drawmode, 0, 0, control_tpage, &area);\r\n\t\t\tW_AddPrim(drawmode);// add to order table\r\n\r\n\t\t\t/* make sprite hud*/\r\n\t\t\tsetSprt(weaponpic);\r\n\t\t\tif (flagtranslucent)\r\n\t\t\t{\r\n\t\t\t\tsetSemiTrans(weaponpic, 1);\r\n\t\t\t}\r\n\t\t\tsetXY0(weaponpic, ((psp->sx >> 16) + 128) - spr->x, ((psp->sy >> 16) + 199) - spr->y);\r\n\t\t\tsetWH(weaponpic, spr->w, spr->h);\r\n\t\t\tsetUV0(weaponpic, spr->vramx, spr->vramy);\r\n\t\t\tweaponpic->clut = palettebase;\r\n\r\n\t\t\tif (psp->state->frame & FF_FULLBRIGHT)\r\n\t\t\t{\r\n\t\t\t\tr = (baselight->r * 5) / 8;\r\n\t\t\t\tg = (baselight->g * 5) / 8;\r\n\t\t\t\tb = (baselight->b * 5) / 8;\r\n\t\t\t\tsetRGB0(weaponpic, r, g, b);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tsetRGB0(weaponpic, base_r, base_g, base_b);\r\n\t\t\t}\r\n\r\n\t\t\tW_AddPrim(weaponpic);// add to order table\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/s_sound.c",
    "content": "/* s_sound.c */\r\n#include \"doomdef.h\"\r\n#include \"p_local.h\"\r\n\r\n#define abs(x) ((x)<0 ? -(x) : (x))\r\n\r\nint CD_TRACK[NUM_CD_MUSIC_TRACKS] = { //80073C7C\r\n    2,      // cdmusic_title_screen\r\n    3,      // cdmusic_main_menu\r\n    4,      // cdmusic_credits_demo\r\n    5,      // cdmusic_intermission\r\n    6,      // cdmusic_club_doom\r\n    7,      // cdmusic_finale_doom1\r\n    8       // cdmusic_finale_doom2\r\n};\r\n\r\ntypedef struct mapaudio_s\r\n{\r\n\tint   Sfx_lcd_indx;\r\n\tint   music_indx;\r\n}mapaudio_t;\r\n\r\ntypedef struct music_s\r\n{\r\n\tint   lcd_indx;\r\n\tint   midi_indx;\r\n\tint   rev_mode;\r\n\tshort depthleft;\r\n\tshort depthright;\r\n}music_t;\r\n\r\nenum Musics\r\n{\r\n    NO_MUSIC,\r\n    MUSAMB01,\r\n    MUSAMB02,\r\n    MUSAMB03,\r\n    MUSAMB04,\r\n    MUSAMB05,\r\n    MUSAMB06,\r\n    MUSAMB07,\r\n    MUSAMB08,\r\n    MUSAMB09,\r\n    MUSAMB10,\r\n    MUSAMB11,\r\n    MUSAMB12,\r\n    MUSAMB13,\r\n    MUSAMB14,\r\n    MUSAMB15,\r\n    MUSAMB16,\r\n    MUSAMB17,\r\n    MUSAMB18,\r\n    MUSAMB19,\r\n    MUSAMB20,\r\n    MUSAMB21,\r\n    MUSAMB22,\r\n    MUSAMB23,\r\n    MUSAMB24,\r\n    MUSAMB25,\r\n    MUSAMB26,\r\n    MUSAMB27,\r\n    MUSAMB28,\r\n    MUSAMB29\r\n};\r\n\r\nstatic mapaudio_t Map_Audio[62] =  //800754FC\r\n{\r\n    { 0             , NO_MUSIC },\r\n    { _MAP01_LCD    , MUSAMB01 },\r\n    { _MAP02_LCD    , MUSAMB02 },\r\n    { _MAP03_LCD    , MUSAMB03 },\r\n    { _MAP04_LCD    , MUSAMB04 },\r\n    { _MAP05_LCD    , MUSAMB05 },\r\n    { _MAP06_LCD    , MUSAMB06 },\r\n    { _MAP07_LCD    , MUSAMB07 },\r\n    { _MAP08_LCD    , MUSAMB08 },\r\n    { _MAP09_LCD    , MUSAMB11 },\r\n    { _MAP10_LCD    , MUSAMB09 },\r\n    { _MAP11_LCD    , MUSAMB15 },\r\n    { _MAP12_LCD    , MUSAMB10 },\r\n    { _MAP13_LCD    , MUSAMB21 },\r\n    { _MAP14_LCD    , MUSAMB22 },\r\n    { _MAP15_LCD    , MUSAMB23 },\r\n    { _MAP16_LCD    , MUSAMB12 },\r\n    { _MAP17_LCD    , MUSAMB16 },\r\n    { _MAP18_LCD    , MUSAMB17 },\r\n    { _MAP19_LCD    , MUSAMB06 },\r\n    { _MAP20_LCD    , MUSAMB18 },\r\n    { _MAP21_LCD    , MUSAMB24 },\r\n    { _MAP22_LCD    , MUSAMB14 },\r\n    { _MAP23_LCD    , MUSAMB03 },\r\n    { _MAP24_LCD    , MUSAMB20 },\r\n    { _MAP25_LCD    , MUSAMB11 },\r\n    { _MAP26_LCD    , MUSAMB25 },\r\n    { _MAP27_LCD    , MUSAMB04 },\r\n    { _MAP28_LCD    , MUSAMB05 },\r\n    { _MAP29_LCD    , MUSAMB10 },\r\n    { _MAP30_LCD    , MUSAMB19 },\r\n    { _MAP31_LCD    , MUSAMB01 },\r\n    { _MAP32_LCD    , MUSAMB09 },\r\n    { _MAP33_LCD    , MUSAMB14 },\r\n    { _MAP34_LCD    , MUSAMB12 },\r\n    { _MAP35_LCD    , MUSAMB08 },\r\n    { _MAP36_LCD    , MUSAMB13 },\r\n    { _MAP37_LCD    , MUSAMB18 },\r\n    { _MAP38_LCD    , MUSAMB20 },\r\n    { _MAP39_LCD    , MUSAMB15 },\r\n    { _MAP40_LCD    , MUSAMB19 },\r\n    { _MAP41_LCD    , MUSAMB11 },\r\n    { _MAP42_LCD    , MUSAMB26 },\r\n    { _MAP43_LCD    , MUSAMB12 },\r\n    { _MAP44_LCD    , MUSAMB29 },\r\n    { _MAP45_LCD    , MUSAMB06 },\r\n    { _MAP46_LCD    , MUSAMB27 },\r\n    { _MAP47_LCD    , MUSAMB09 },\r\n    { _MAP48_LCD    , MUSAMB22 },\r\n    { _MAP49_LCD    , MUSAMB03 },\r\n    { _MAP50_LCD    , MUSAMB28 },\r\n    { _MAP51_LCD    , MUSAMB07 },\r\n    { _MAP52_LCD    , MUSAMB08 },\r\n    { _MAP53_LCD    , MUSAMB15 },\r\n    { _MAP54_LCD    , MUSAMB04 },\r\n    { _MAP55_LCD    , MUSAMB17 },\r\n    { _MAP56_LCD    , MUSAMB18 },\r\n    { _MAP57_LCD    , MUSAMB10 },\r\n    { _MAP58_LCD    , MUSAMB16 },\r\n    { _MAP59_LCD    , MUSAMB13 },\r\n    { _MAP60_LCD    , NO_MUSIC },\r\n    { 0             , NO_MUSIC }\r\n};\r\n\r\nstatic music_t Music[31] = //8007530C\r\n{\r\n\t{ 0  , 0  , PSXSPU_REV_MODE_OFF     , 0    , 0 },// No Music\r\n\t{ _MUSLEV1_LCD, 90 , PSXSPU_REV_MODE_SPACE   , 4095 , 4095 },// MUSAMB01\r\n\t{ _MUSLEV2_LCD, 91 , PSXSPU_REV_MODE_SPACE   , 4095 , 4095 },// MUSAMB02\r\n\t{ _MUSLEV3_LCD, 92 , PSXSPU_REV_MODE_STUDIO_B, 10239, 10239 },// MUSAMB03\r\n\t{ _MUSLEV4_LCD, 93 , PSXSPU_REV_MODE_HALL    , 6143 , 6143 },// MUSAMB04\r\n\t{ _MUSLEV5_LCD, 94 , PSXSPU_REV_MODE_STUDIO_A, 9215 , 9215 },// MUSAMB05\r\n\t{ _MUSLEV6_LCD, 95 , PSXSPU_REV_MODE_HALL    , 8191 , 8191 },// MUSAMB06\r\n\t{ _MUSLEV7_LCD, 96 , PSXSPU_REV_MODE_STUDIO_C, 9983 , 9983 },// MUSAMB07\r\n\t{ _MUSLEV8_LCD, 97 , PSXSPU_REV_MODE_STUDIO_B, 11775, 11775 },// MUSAMB08\r\n\t{ _MUSLEV9_LCD, 98 , PSXSPU_REV_MODE_STUDIO_C, 12287, 12287 },// MUSAMB09\r\n\t{ _MUSLEV10_LCD, 99 , PSXSPU_REV_MODE_SPACE   , 4095 , 4095 },// MUSAMB10\r\n\t{ _MUSLEV11_LCD, 100, PSXSPU_REV_MODE_HALL    , 8191 , 8191 },// MUSAMB11\r\n\t{ _MUSLEV12_LCD, 101, PSXSPU_REV_MODE_HALL    , 8191 , 8191 },// MUSAMB12\r\n\t{ _MUSLEV13_LCD, 102, PSXSPU_REV_MODE_SPACE   , 4095 , 4095 },// MUSAMB13\r\n\t{ _MUSLEV14_LCD, 103, PSXSPU_REV_MODE_HALL    , 8191 , 8191 },// MUSAMB14\r\n\t{ _MUSLEV15_LCD, 104, PSXSPU_REV_MODE_STUDIO_B, 10239, 10239 },// MUSAMB15\r\n\t{ _MUSLEV16_LCD, 105, PSXSPU_REV_MODE_SPACE   , 4095 , 4095 },// MUSAMB16\r\n\t{ _MUSLEV17_LCD, 106, PSXSPU_REV_MODE_HALL    , 8191 , 8191 },// MUSAMB17\r\n\t{ _MUSLEV18_LCD, 107, PSXSPU_REV_MODE_SPACE   , 4095 , 4095 },// MUSAMB18\r\n\t{ _MUSLEV19_LCD, 108, PSXSPU_REV_MODE_HALL    , 8191 , 8191 },// MUSAMB19\r\n\t{ _MUSLEV20_LCD, 109, PSXSPU_REV_MODE_STUDIO_C, 12287, 12287 },// MUSAMB20\r\n\t{ _MUSLEV19_LCD, 108, PSXSPU_REV_MODE_STUDIO_C, 12287, 12287 },// MUSAMB19\r\n\t{ _MUSLEV2_LCD, 91 , PSXSPU_REV_MODE_HALL    , 8191 , 8191 },// MUSAMB02\r\n\t{ _MUSLEV1_LCD, 90 , PSXSPU_REV_MODE_HALL    , 8191 , 8191 },// MUSAMB01\r\n\t{ _MUSLEV13_LCD, 102, PSXSPU_REV_MODE_HALL    , 8191 , 8191 },// MUSAMB13\r\n\t{ _MUSLEV7_LCD, 96 , PSXSPU_REV_MODE_STUDIO_B, 10239, 10239 },// MUSAMB07\r\n\t{ _MUSLEV16_LCD, 105, PSXSPU_REV_MODE_HALL    , 8191 , 8191 },// MUSAMB16\r\n\t{ _MUSLEV5_LCD, 94 , PSXSPU_REV_MODE_STUDIO_C, 12287, 12287 },// MUSAMB05\r\n\t{ _MUSLEV1_LCD, 90 , PSXSPU_REV_MODE_STUDIO_C, 12287, 12287 },// MUSAMB01\r\n\t{ _MUSLEV17_LCD, 106, PSXSPU_REV_MODE_STUDIO_C, 12287, 12287 },// MUSAMB17\r\n\t{ 0  , 0  , PSXSPU_REV_MODE_OFF     , 0    , 0 },// No Music\r\n};\r\n\r\n/*//FINAL DOOM\r\nmusic_t Music[30] = //80075310\r\n{\r\n\t{ 0, 0, 0, 0, 0,\r\n\t{ _MUSLEV23, 112, 5, 8191 , 8191 },// MUSAMB23\r\n\t{ _MUSLEV29, 118, 4, 9983 , 9983 },// MUSAMB29\r\n\t{ _MUSLEV24, 113, 6, 8191 , 8191 },// MUSAMB24\r\n\t{ _MUSLEV30, 119, 6, 4095 , 4095 },// MUSAMB30\r\n\t{ _MUSLEV21, 110, 6, 8191 , 8191 },// MUSAMB21\r\n\t{ _MUSLEV27, 116, 5, 8191 , 8191 },// MUSAMB27\r\n\t{ _MUSLEV25, 114, 6, 4095 , 4095 },// MUSAMB25\r\n\t{ _MUSLEV28, 117, 5, 8191 , 8191 },// MUSAMB28\r\n\t{ _MUSLEV22, 111, 6, 8191 , 8191 },// MUSAMB22\r\n\t{ _MUSLEV26, 115, 6, 4095 , 4095 },// MUSAMB26\r\n\t{ _MUSLEV1 , 90 , 6, 4095 , 4095 },// MUSAMB01\r\n\t{ _MUSLEV2 , 91 , 6, 4095 , 4095 },// MUSAMB02\r\n\t{ _MUSLEV3 , 92 , 3, 10239, 10239},// MUSAMB03\r\n\t{ _MUSLEV4 , 93 , 5, 6143 , 6143 },// MUSAMB04\r\n\t{ _MUSLEV5 , 94 , 2, 9215 , 9215 },// MUSAMB05\r\n\t{ _MUSLEV6 , 95 , 5, 8191 , 8191 },// MUSAMB06\r\n\t{ _MUSLEV7 , 96 , 4, 9983 , 9983 },// MUSAMB07\r\n\t{ _MUSLEV8 , 97 , 3, 11775, 11775},// MUSAMB08\r\n\t{ _MUSLEV9 , 98 , 4, 12287, 12287},// MUSAMB09\r\n\t{ _MUSLEV10, 99 , 3, 10239, 10239},// MUSAMB10\r\n\t{ _MUSLEV11, 100, 5, 8191 , 8191 },// MUSAMB11\r\n\t{ _MUSLEV12, 101, 4, 12287, 12287},// MUSAMB12\r\n\t{ _MUSLEV13, 102, 6, 4095 , 4095 },// MUSAMB13\r\n\t{ _MUSLEV14, 103, 5, 8191 , 8191 },// MUSAMB14\r\n\t{ _MUSLEV15, 104, 3, 10239, 10239},// MUSAMB15\r\n\t{ _MUSLEV16, 105, 6, 4095 , 4095 },// MUSAMB16\r\n\t{ _MUSLEV17, 106, 5, 8191 , 8191 },// MUSAMB17\r\n\t{ _MUSLEV18, 107, 6, 4095 , 4095 },// MUSAMB18\r\n\t{ _MUSLEV22, 111, 4, 12287, 12287},// MUSAMB22\r\n\t{ _MUSLEV26, 115, 4, 12287, 12287},// MUSAMB26\r\n};\r\n*/\r\n\r\nextern int psxsettings[SNDHW_TAG_MAX*2];\r\nextern int *settings_list[2];\r\n\r\nextern SampleBlock doomsfxblk;//8007eac0\r\nextern SampleBlock mapsfxblk;//8007ec54\r\n\r\nextern NoteState tmp_notestate;//0x8007e93c\r\n\r\n#define WMD_SIZE 26000\r\nstatic int  mem_size = WMD_SIZE;//80077C34\r\nstatic char mem_pntr[WMD_SIZE];//800783ac\r\n\r\n#define SRAM_START 4112\r\nint sram_pos = SRAM_START; //80077C48\r\nint sram_load = 0;//80077C50\r\n\r\nvoid *trackptr; //80077C4C\r\n\r\nstatic int lcd_file_indx = 0;//80077C40\r\nstatic int music_indx = 0;  //80077C44\r\n\r\nstatic int snd_vol = 0;//80077C54 iGp00000844\r\nstatic int snd_pan = 0;//80077C58 iGp00000848\r\n\r\nstatic int update_snd = 0; //80077C5C\r\n\r\n/*\r\n==================\r\n=\r\n= S_SetSoundVolume\r\n=\r\n==================\r\n*/\r\n\r\nvoid S_SetSoundVolume (int volume) //80040D1C\r\n{\r\n    wess_master_sfx_vol_set(volume);\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= S_SetMusicVolume\r\n=\r\n==================\r\n*/\r\n\r\nvoid S_SetMusicVolume(int volume)//80040D3C\r\n{\r\n    int cd_volume;\r\n\r\n\twess_master_mus_vol_set(volume);\r\n\r\n    cd_volume = volume << 7;\r\n    if (0x3cff < cd_volume)\r\n        cd_volume = 0x3cff;\r\n\r\n\tpsxspu_set_cd_vol(cd_volume);\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= S_StopMusic\r\n=\r\n==================\r\n*/\r\n\r\nvoid S_StopMusic(void)//80040D84\r\n{\r\n\tif (music_indx != 0)\r\n\t\twess_seq_stop(Music[music_indx].midi_indx);\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= S_StartMusic\r\n=\r\n==================\r\n*/\r\n\r\nvoid S_StartMusic(void)//80040DC0\r\n{\r\n\tS_StopMusic();\r\n\tif (music_indx != 0)\r\n\t\twess_seq_trigger(Music[music_indx].midi_indx);\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= S_InitBlock\r\n=\r\n==================\r\n*/\r\n\r\nvoid S_InitBlock(SampleBlock *sampblk)//80040E08\r\n{\r\n    sampblk->numsamps = 0;\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= S_DoBlockClear\r\n=\r\n==================\r\n*/\r\n\r\nvoid S_DoBlockClear(SampleBlock *sampblk)//80040E10\r\n{\r\n    while(sampblk->numsamps)\r\n\t{\r\n\t\tsampblk->numsamps--;\r\n\r\n\t\t//if no other buffers have the sound, clear position\r\n\t\twess_dig_set_sample_position(sampblk->sampindx[sampblk->numsamps], (char *)0);\r\n\t}\r\n}\r\n\r\nvoid S_Lcd_Load(int map_indx)//80040E88\r\n{\r\n\tint sram_pos_tmp;\r\n\tif (lcd_file_indx != map_indx)\r\n\t{\r\n\t\tif (lcd_file_indx != 0)\r\n\t\t{\r\n\t\t\tif (music_indx != 0)\r\n\t\t\t{\r\n\t\t\t\tS_StopMusic();\r\n\t\t\t\tdo{} while (wess_seq_status(Music[music_indx].midi_indx) != SEQUENCE_INACTIVE);\r\n\t\t\t\twess_seq_range_free(90, 20);\r\n\t\t\t}\r\n\t\t\tS_DoBlockClear(&mapsfxblk);\r\n\t\t}\r\n\t\tif (map_indx == LASTLEVEL)\r\n\t\t{\r\n\t\t\tS_DoBlockClear(&doomsfxblk);\r\n\t\t\tsram_load = 0;\r\n\t\t\tsram_pos = SRAM_START;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif (sram_load == 0)\r\n\t\t\t{\r\n\t\t\t\tsram_pos = wess_dig_lcd_load((char *)_DOOMSFX_LCD, (void *)SRAM_START, &doomsfxblk, 0);\r\n\t\t\t\tsram_pos += SRAM_START;\r\n\t\t\t\tsram_load = 1;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsram_pos_tmp = sram_pos;\r\n\r\n\t\tmusic_indx = Map_Audio[map_indx].music_indx;\r\n\t\tif (music_indx == 0)\r\n\t\t{\r\n\t\t\tpsxspu_init_reverb(0, 0, 0, 0, 0);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tpsxspu_init_reverb(Music[music_indx].rev_mode, Music[music_indx].depthleft, Music[music_indx].depthright, 0, 0);\r\n\t\t\twess_seq_load(Music[music_indx].midi_indx, trackptr);\r\n\t\t\tsram_pos_tmp += wess_dig_lcd_load((char *)Music[music_indx].lcd_indx, (void *)sram_pos_tmp, &mapsfxblk, 0);\r\n\t\t}\r\n\r\n\t\tlcd_file_indx = map_indx;\r\n\t\tif ((char *)Map_Audio[map_indx].Sfx_lcd_indx != (char *)0x0)\r\n\t\t{\r\n\t\t\twess_dig_lcd_load((char *)Map_Audio[map_indx].Sfx_lcd_indx, (void *)sram_pos_tmp, &mapsfxblk, 0);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= S_Pause\r\n=\r\n==================\r\n*/\r\n\r\nvoid S_Pause(void)//80041088\r\n{\r\n    wess_seq_pauseall (YesMute, &tmp_notestate);\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= S_Resume\r\n=\r\n==================\r\n*/\r\n\r\nvoid S_Resume(void)//800410B0\r\n{\r\n    wess_seq_restartall (&tmp_notestate);\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= S_StopSound\r\n=\r\n==================\r\n*/\r\n\r\nvoid S_StopSound(unsigned long sequence_type)//800410D8\r\n{\r\n    wess_seq_stoptype(sequence_type);\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= S_StopAll\r\n=\r\n==================\r\n*/\r\n\r\nvoid S_StopAll(void)//800410F8\r\n{\r\n    wess_seq_stopall();\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= S_AdjustSoundParams\r\n=\r\n= Exclusive Psx Doom\r\n==================\r\n*/\r\n\r\n// when to clip out sounds\r\n// Does not fit the large outdoor areas.\r\n#define S_CLIPPING_DIST (1124<<FRACBITS)\t/* Clip sounds beyond this distance */\r\n#define S_CLOSE_DIST (100 << FRACBITS)\t\t/* Too close! */\r\n#define S_ATTENUATOR ((S_CLIPPING_DIST-S_CLOSE_DIST)>>FRACBITS)\r\n\r\n#define REVERB_OFF\t1\r\n\r\nint volume; //80077C54\r\nint pan; //80077C54\r\nvoid S_AdjustSoundParams(mobj_t *origin, int sound_id, TriggerPlayAttr *attr)//80041118\r\n{\r\n\tfixed_t    dx, dy;\r\n\tfixed_t    dist_approx;\r\n\tchar       vol;\r\n\tchar       pan;\r\n\tangle_t    angle;\r\n\tmobj_t*    listener;\r\n\tTriggerPlayAttr t_attr;\r\n\r\n    if ((NUMSFX-1) < sound_id)\r\n        return;\r\n\r\n    listener = players[consoleplayer].mo;\r\n\r\n    vol = 127;\r\n\r\n    if (origin == NULL)\r\n    {\r\n       pan = 64;\r\n    }\r\n    else\r\n    {\r\n        pan = 64;\r\n        if (origin != listener)\r\n        {\r\n            dx = abs(origin->x - listener->x);\r\n            dy = abs(origin->y - listener->y);\r\n            dist_approx = (dx + dy) - ((dx < dy ? dx : dy) >> 1);\r\n\r\n            if(dist_approx > S_CLIPPING_DIST)\r\n                return;\r\n\r\n            // angle of source to listener\r\n            angle = R_PointToAngle2(listener->x, listener->y, origin->x, origin->y);\r\n\r\n            if (angle <= listener->angle)\r\n                angle += 0xffffffff;\r\n\r\n            angle -= listener->angle;\r\n\r\n            // stereo separation\r\n            pan = 128 - ((finesine[angle >> ANGLETOFINESHIFT] * 96) >> FRACBITS) >> 1;\r\n\r\n            // volume calculation\r\n            if(dist_approx < S_CLOSE_DIST)\r\n                vol = 127;\r\n            else\r\n                vol = (((S_CLIPPING_DIST - dist_approx) >> FRACBITS) * 127) / S_ATTENUATOR;\r\n\r\n            if ((origin->x == listener->x) && (origin->y == listener->y))\r\n                pan = 64;\r\n\r\n            if (!(vol > 0))\r\n                return;\r\n        }\r\n    }\r\n\r\n    //Check Reverb Flag Sector\r\n    if (origin && (origin->subsector->sector->flags & REVERB_OFF))\r\n        t_attr.reverb = 0;\r\n    else\r\n        t_attr.reverb = 127;\r\n\r\n    t_attr.mask = (TRIGGER_VOLUME|TRIGGER_PAN|TRIGGER_REVERB);\r\n    t_attr.volume = vol;\r\n    t_attr.pan = pan;\r\n    attr = &t_attr;\r\n    snd_vol = vol;\r\n    snd_pan = pan;\r\n    wess_seq_trigger_type_special(sound_id, (unsigned long)origin, attr);\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= S_StartSound\r\n=\r\n==================\r\n*/\r\n\r\nvoid S_StartSound(mobj_t *origin, int sound_id)//80041324\r\n{\r\n\tS_AdjustSoundParams(origin, sound_id, 0);\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= S_UpdateSounds\r\n=\r\n==================\r\n*/\r\n\r\nvoid S_UpdateSounds(void) //80041344\r\n{\r\n  update_snd += 1;\r\n}\r\n\r\n/*\r\n==================\r\n=\r\n= PsxSoundInit\r\n=\r\n==================\r\n*/\r\n\r\nvoid PsxSoundInit(int sfx_volume, int mus_volume, void *data)//8004135C\r\n{\r\n    PsxCd_File *fileptr;\r\n    //char *wmd_data;\r\n\r\n    wess_init();\r\n    psxcd_init();\r\n\r\n    fileptr = psxcd_open((char*)_DOOMSND_WMD);\r\n\r\n    psxcd_read(data, fileptr->file.size, fileptr);\r\n\tpsxcd_close(fileptr);\r\n\r\n\tS_InitBlock(&doomsfxblk);\r\n\tS_InitBlock(&mapsfxblk);\r\n\r\n\t//Init wmd_data\r\n\t//wmd_data = Z_Alloc(0x1e000, PU_STATIC, 0);\r\n\twess_load_module(data, mem_pntr, mem_size, settings_list);\r\n\r\n\t//printf(\"wess_dig_lcd_loader_init\\n\");\r\n\twess_dig_lcd_loader_init(wess_get_master_status());\r\n\r\n\t//printf(\"wess_seq_loader_init\\n\");\r\n\twess_seq_loader_init(wess_get_master_status(), (char*)_DOOMSND_WMD, YesOpenSeqHandle);\r\n\r\n\t//printf(\"wess_seq_range_load\\n\");\r\n\t//printf(\"wess_get_wmd_end %X\\n\", (int)wess_get_wmd_end);\r\n\ttrackptr = wess_get_wmd_end();\r\n\ttrackptr += wess_seq_range_load(0, 90, wess_get_wmd_end());\r\n\t//printf(\"trackptr %X\\n\", (int)trackptr);\r\n\r\n    //Free wmd_data tmp\r\n    //Z_Free(wmd_data);\r\n\r\n    S_SetSoundVolume(sfx_volume);\r\n    S_SetMusicVolume(mus_volume);\r\n\r\n    sram_load = 0;\r\n    sram_pos += wess_dig_lcd_load((char *)_DOOMSFX_LCD,(void *)SRAM_START, &doomsfxblk, 0);\r\n    //printf(\"sram_pos %d\\n\",sram_pos);\r\n    sram_load = 1;\r\n}\r\n\r\n\r\n/*\r\n==================\r\n=\r\n= PsxSoundExit\r\n=\r\n==================\r\n*/\r\n\r\nvoid PsxSoundExit (void)//8004149C\r\n{\r\n\treturn;\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/snmain.s",
    "content": ";\tSN Systems replacement for main module\r\n;\tin API lib\r\n\r\n\topt\tc+\r\n\r\nDIPSW\tequ\t$1F802040\t;byte, read only\r\n\r\n\tsection\t.rdata\r\n\tsection\t.text\r\n\tsection\t.ctors\r\n\tsection\t.dtors\r\n\tsection\t.data\r\n\tsection\t.sdata\r\n\tsection\t.sbss\r\n\tsection\t.bss\r\n\r\n\txdef\t__SN_ENTRY_POINT,__main,__do_global_dtors\r\n\txdef    _stacksize,_ramsize,_bbsstart\r\n\txdef\t__heapbase,__heapsize\r\n\txdef\t__text,__textlen\r\n\txdef\t__data,__datalen\r\n\txdef\t__bss,__bsslen\r\n\r\n\txref\tInitHeap,main\r\n\r\n\tsection\t.text\r\n\r\n;_stacksize dw\t$00008000\t; /* set 32K stack */\r\n;_ramsize\tdw $00200000\t\t; /* and 2MB CD ROM ram  */\r\n\r\n;\r\n; This is the program entry point.\r\n; 1) Clear program BSS section to zero\r\n; 2) Set stack and heap\r\n; 3) Call user entry point i.e. main()\r\n; 4) Jmp back to downloader stub (should be call exit() or something?)\r\n;\r\n; Note:\tdefault ram size is 8 Megabytes\r\n;\tdefault stack size is 32K\r\n;\tstack position is top of RAM\r\n;\theap is all of RAM from end of prog to lowest stack addr\r\n;\r\n; Use can override these settings by declaring suitable values\r\n; for these variables in his C code module along with main().\r\n; e.g.\r\n;\t_stacksize=0x00002000; /* set 8K stack */\r\n;\t  _ramsize=0x00100000; /* and 1MB ram  */\r\n;\r\n; If user does not specify override valuse for these variables then\r\n; the default values will be loaded from the SNDEF module in LIBSN.LIB\r\n;\r\n__SN_ENTRY_POINT:\r\n\r\n\tla\tv0,sect(.sbss)\r\n\tla\tv1,sectend(.bss)\r\n@clrit:\r\n\topt\tat-\r\n\tsw\tzero,0(v0)\r\n\taddiu\tv0,v0,4\r\n\tsltu\tat,v0,v1\r\n\tbne\tat,zero,@clrit\r\n\tnop\r\n\topt\tat+\r\n\r\n; This was the old way to set ram-top. Read mem config from DIP switches.\r\n;\r\n;\tlui\ta0,DIPSW>>16\r\n;\tlb\tv0,DIPSW&$FFFF(a0)\t;read dip settings\r\n;\tnop\r\n;\tandi\tv0,v0,%00110000\t;mem size in bits 4 & 5\r\n;\tsrl\tv0,v0,2\r\n;\tla\ta0,MemSizes\r\n;\taddu\ta0,a0,v0\r\n;\tlw\tv0,0(a0)\t;put stack at top of RAM\r\n;\tnop\r\n\r\n\tlw\tv0,_ramsize\t;this is the new way; because there\r\n\tnop\t\t; are no switches on new hardware.\r\n\r\n\taddi\tv0,v0,-8\t;but leave room for two parameters\r\n\tlui\tt0,$8000\t;(mem seg for kernel cached RAM)\r\n\tor\tsp,v0,t0\t;set stack in kseg0\r\n\r\n\tla\ta0,sectend(.bss)\t; a0 = heap base\r\n\tsll\ta0,a0,3\r\n\tsrl\ta0,a0,3\t;remove mem seg bits\r\n\tlw\tv1,_stacksize\r\n\tnop\r\n\tsubu\ta1,v0,v1\t;calc a1 = top of heap\r\n\tsubu\ta1,a1,a0\t; -heap base, => a1 = size of heap\r\n\tor\ta0,a0,t0\t;heap in kseg0\r\n\r\n\tsw\tra,__ra_temp\r\n\tla\tgp,sect(.sdata)\r\n\tmove\tfp,sp\r\n\tjal\tInitHeap\r\n\taddi\ta0,a0,4\t;don't know why they do this.\r\n\r\n\tlw\tra,__ra_temp\r\n\tnop\r\n\r\n\tjal\tmain\r\n\tnop\r\n\r\n; Will fall through here if main() returns. Fall into debugger stub.\r\n\tbreak\t$1\t;for want of something better\r\n\r\n;MemSizes\tdw\t$00100000\t; 1 Megabyte\r\n;\tdw\t$00200000\t; 2 Megabytes\r\n;\tdw\t$00800000\t; 8 Megabytes ** default for MW 3.0\r\n;\tdw\t$01000000\t;16 Megabytes\r\n\r\n__main\tlw\tt0,__initialised\r\n\r\n\taddiu\tsp,sp,-16\r\n\r\n\tsw\ts0,4(sp)\r\n\tsw\ts1,8(sp)\r\n\tsw\tra,12(sp)\r\n\r\n\tbne\tt0,zero,@exit\r\n\tli\tt0,1\r\n\r\n\tsw\tt0,__initialised\r\n\r\n\tla\ts0,sect(.ctors)\r\n\tla\ts1,(sectend(.ctors)-sect(.ctors))/4\r\n\tbeq\ts1,zero,@exit\r\n\tnop\r\n\r\n@loop\tlw\tt0,0(s0)\r\n\taddiu\ts0,s0,4\r\n\r\n\tjalr\tt0\r\n\taddiu\ts1,s1,-1\r\n\r\n\tbne\ts1,zero,@loop\r\n\tnop\r\n\r\n@exit\tlw\tra,12(sp)\r\n\tlw\ts1,8(sp)\r\n\tlw\ts0,4(sp)\r\n\r\n\taddiu\tsp,sp,16\r\n\r\n\tjr\tra\r\n\tnop\r\n\r\n__do_global_dtors\r\n\r\n\tlw\tt0,__initialised\r\n\r\n\taddiu\tsp,sp,-16\r\n\r\n\tsw\ts0,4(sp)\r\n\tsw\ts1,8(sp)\r\n\tsw\tra,12(sp)\r\n\r\n\tbeq\tt0,zero,@exit\r\n\tnop\r\n\r\n\tla\ts0,sect(.dtors)\r\n\tla\ts1,(sectend(.dtors)-sect(.dtors))/4\r\n\tbeq\ts1,zero,@exit\r\n\tnop\r\n\r\n@loop\tlw\tt0,0(s0)\r\n\taddiu\ts0,s0,4\r\n\r\n\tjalr\tt0\r\n\taddiu\ts1,s1,-1\r\n\r\n\tbne\ts1,zero,@loop\r\n\tnop\r\n\r\n@exit\tlw\tra,12(sp)\r\n\tlw\ts1,8(sp)\r\n\tlw\ts0,4(sp)\r\n\r\n\taddiu\tsp,sp,16\r\n\r\n\tjr\tra\r\n\tnop\r\n\r\n\tsection\t.data\r\n\r\n\tcnop\t0,4\t;longword align\r\n\r\n_ramsize\tdw\t$00200000\t; 2 Megabytes\r\n_stacksize\tdw\t$00008000\t; default stack is 32k\r\n_bbsstart\tdw\tsectend(.bss)\r\n_gpstart\tdw\t0\r\n\r\n__heapbase\tdw\t0\r\n__heapsize\tdw\t0\r\n__text\t\tdw\tsect(.text)\r\n__textlen\tdw\tsectend(.text)-sect(.text)\r\n__data\t\tdw\tsect(.data)\r\n__datalen\tdw\tsectend(.data)-sect(.data)\r\n__bss\t\tdw\tsect(.bss)\r\n__bsslen\tdw\tsectend(.bss)-sect(.bss)\r\n\r\n__initialised\tdw\t0\r\n\r\n\tsection\t.sbss\r\n\r\n__ra_temp\tdsw\t1\r\n\r\n\tend\r\n\r\n"
  },
  {
    "path": "PSXDOOM/sounds.h",
    "content": "#ifndef __SOUNDSH__\n#define __SOUNDSH__\n\n/*\n *  Identifiers for all sfx in game.\n */\n\ntypedef enum\r\n{\r\n\tsfx_None,\r\n\tsfx_sgcock,\r\n\tsfx_punch,\r\n\tsfx_itmbk,\r\n\tsfx_firsht2,\r\n\tsfx_barexp,\r\n\tsfx_firxpl,\r\n\tsfx_pistol,\r\n\tsfx_shotgn,\r\n\tsfx_plasma,\r\n\tsfx_bfg,\r\n\tsfx_sawup,\r\n\tsfx_sawidl,\r\n\tsfx_sawful,\r\n\tsfx_sawhit,\r\n\tsfx_rlaunc,\r\n\tsfx_rxplod,\r\n\tsfx_pstart,\r\n\tsfx_pstop,\r\n\tsfx_doropn,\r\n\tsfx_dorcls,\r\n\tsfx_stnmov,\r\n\tsfx_swtchn,\r\n\tsfx_swtchx,\r\n\tsfx_itemup,\r\n\tsfx_wpnup,\r\n\tsfx_oof,\r\n\tsfx_telept,\r\n\tsfx_noway,\r\n\tsfx_dshtgn,\r\n\tsfx_dbopn,\r\n\tsfx_dbload,\r\n\tsfx_dbcls,\r\n\tsfx_plpain,\r\n\tsfx_pldeth,\r\n\tsfx_slop,\r\n\tsfx_posit1,\r\n\tsfx_posit2,\r\n\tsfx_posit3,\r\n\tsfx_podth1,\r\n\tsfx_podth2,\r\n\tsfx_podth3,\r\n\tsfx_posact,\r\n\tsfx_popain,\r\n\tsfx_dmpain,\r\n\tsfx_dmact,\r\n\tsfx_claw,\r\n\tsfx_bgsit1,\r\n\tsfx_bgsit2,\r\n\tsfx_bgdth1,\r\n\tsfx_bgdth2,\r\n\tsfx_bgact,\r\n\tsfx_sgtsit,\r\n\tsfx_sgtatk,\r\n\tsfx_sgtdth,\r\n\tsfx_brssit,\r\n\tsfx_brsdth,\r\n\tsfx_cacsit,\r\n\tsfx_cacdth,\r\n\tsfx_sklatk,\r\n\tsfx_skldth,\r\n\tsfx_kntsit,\r\n\tsfx_kntdth,\r\n\tsfx_pesit,\r\n\tsfx_pepain,\r\n\tsfx_pedth,\r\n\tsfx_bspsit,\r\n\tsfx_bspdth,\r\n\tsfx_bspact,\r\n\tsfx_bspwlk,\r\n\tsfx_manatk,\r\n\tsfx_mansit,\r\n\tsfx_mnpain,\r\n\tsfx_mandth,\r\n\tsfx_firsht,\r\n\tsfx_skesit,\r\n\tsfx_skedth,\r\n\tsfx_skeact,\r\n\tsfx_skeatk,\r\n\tsfx_skeswg,\r\n\tsfx_skepch,\r\n\tsfx_cybsit,\r\n\tsfx_cybdth,\r\n\tsfx_hoof,\r\n\tsfx_metal,\r\n\tsfx_spisit,\r\n\tsfx_spidth,\r\n\tsfx_bdopn,\r\n\tsfx_bdcls,\r\n\tsfx_getpow,\r\n\tNUMSFX\r\n} sfxenum_t;\n\n#endif\n\n"
  },
  {
    "path": "PSXDOOM/soundst.h",
    "content": "/* newsfx.h */\n\r\n#if 0\ntypedef struct\n{\n    int     samples;\n    int     loop_start;\n    int     loop_end;\n    int     info;\n    int     unity;\n\tint\t\tpitch_correction;\n\tint\t\tdecay_step;\n    unsigned char data[1];\n} sfx_t;\n\ntypedef struct sfxinfo_s\n{\n\tchar\t*name;\t\t/* up to 6-character name */\n\tboolean singularity;\t/* Sfx singularity (only one at a time) */\n\tint\t\tpriority;\t\t/* Sfx priority */\n\tstruct sfxinfo_s *link;\t/* referenced sound if a link */\n\tint\t\tpitch;\t\t/* pitch if a link */\n\tint\t\tvolume;\t\t/* volume if a link */\n\tsfx_t\t*md_data;\t/* machine-dependent sound data */\n} sfxinfo_t;\n\ntypedef struct\n{\n  char *name;\t\t/* up to 6-character name */\n  void *md_data;\t/* machine-dependent music data */\n} musicinfo_t;\n\n/*============================================================================ */\n\n#define\tINTERNALQUADS\t256\t\t\t/* 4k / 16 bytes per quad (64 bits) */\n#define\tEXTERNALQUADS\t512\t\t\t/* 16k  / 32 bytes per quad (16 bits+music) */\n#define\tSFXCHANNELS\t\t4\n\ntypedef struct\n{\n\tunsigned\t*source;\t\t\t/* work in groups of 4 8 bit samples */\n\tint\t\t\tstartquad;\n\tint\t\t\tstopquad;\n\tint\t\t\tvolume;\t\t\t\t/* range from 0-32k */\n\tsfxinfo_t\t*sfx;\n\tmobj_t\t\t*origin;\n} sfxchannel_t;\n\nextern\tsfxchannel_t\tsfxchannels[SFXCHANNELS];\n\nextern\tint\t\tfinalquad;\t\t\t/* the last quad mixed by update. */\n\nextern\tint\t\tsfxvolume;\t\t\t/* range 0 - 255 */\nextern\tint \tmusicvolume;\t\t/* range 0 - 255 */\nextern\tint\t\toldsfxvolume;\t\t/* to detect transition to sound off */\n\nextern\tint\t\tsoundtics;\t\t\t/* time spent mixing sounds */\nextern\tint\t\tsoundstarttics;\t\t/* time S_Update started */\n\nextern\tint\t\tsfxsample;\t\t\t/* the sample about to be output */\n\t\t\t\t\t\t\t\t\t/* by S_WriteOutSamples */\n\n/* external buffer for sfx and music */\nextern\tint\t\tsoundbuffer[EXTERNALQUADS*16];\n\nextern\tint\t\tsamplecount;\t\t/* 22khz sample counter in DSP memory */\n\r\n#endif\n/*============================================================================ */\n\nvoid S_Init(void);\nvoid S_Clear (void);\nvoid S_StartSound(mobj_t *origin, int sound_id);\nvoid S_UpdateSounds(void);\n\n"
  },
  {
    "path": "PSXDOOM/sprinfo.c",
    "content": "/* sprinfo.c -- generated by sprgen */\n\n#include \"doomdef.h\"\n#include \"r_local.h\"\n\r\nspriteframe_t spriteframes[] = {//80060A10\r\n{1, {857,858,859,860,861,860,859,858}, {0,0,0,0,0,1,1,1}},\r\n{1, {862,863,864,865,866,865,864,863}, {0,0,0,0,0,1,1,1}},\r\n{1, {867,868,869,870,871,870,869,868}, {0,0,0,0,0,1,1,1}},\r\n{1, {872,873,874,875,876,875,874,873}, {0,0,0,0,0,1,1,1}},\r\n{1, {877,878,879,880,881,880,879,878}, {0,0,0,0,0,1,1,1}},\r\n{1, {882,883,884,885,886,885,884,883}, {0,0,0,0,0,1,1,1}},\r\n{1, {887,888,889,890,891,890,889,888}, {0,0,0,0,0,1,1,1}},\r\n{1, {892,893,894,895,896,895,894,893}, {0,0,0,0,0,1,1,1}},\r\n{0, {897,897,897,897,897,897,897,897}, {0,0,0,0,0,0,0,0}},\r\n{0, {898,898,898,898,898,898,898,898}, {0,0,0,0,0,0,0,0}},\r\n{0, {899,899,899,899,899,899,899,899}, {0,0,0,0,0,0,0,0}},\r\n{0, {900,900,900,900,900,900,900,900}, {0,0,0,0,0,0,0,0}},\r\n{0, {901,901,901,901,901,901,901,901}, {0,0,0,0,0,0,0,0}},\r\n{0, {902,902,902,902,902,902,902,902}, {0,0,0,0,0,0,0,0}},\r\n{0, {903,903,903,903,903,903,903,903}, {0,0,0,0,0,0,0,0}},\r\n{0, {904,904,904,904,904,904,904,904}, {0,0,0,0,0,0,0,0}},\r\n{0, {905,905,905,905,905,905,905,905}, {0,0,0,0,0,0,0,0}},\r\n{0, {906,906,906,906,906,906,906,906}, {0,0,0,0,0,0,0,0}},\r\n{0, {907,907,907,907,907,907,907,907}, {0,0,0,0,0,0,0,0}},\r\n{0, {908,908,908,908,908,908,908,908}, {0,0,0,0,0,0,0,0}},\r\n{0, {909,909,909,909,909,909,909,909}, {0,0,0,0,0,0,0,0}},\r\n{0, {14,14,14,14,14,14,14,14}, {0,0,0,0,0,0,0,0}},\r\n{0, {15,15,15,15,15,15,15,15}, {0,0,0,0,0,0,0,0}},\r\n{0, {16,16,16,16,16,16,16,16}, {0,0,0,0,0,0,0,0}},\r\n{0, {17,17,17,17,17,17,17,17}, {0,0,0,0,0,0,0,0}},\r\n{0, {4,4,4,4,4,4,4,4}, {0,0,0,0,0,0,0,0}},\r\n{0, {5,5,5,5,5,5,5,5}, {0,0,0,0,0,0,0,0}},\r\n{0, {6,6,6,6,6,6,6,6}, {0,0,0,0,0,0,0,0}},\r\n{0, {7,7,7,7,7,7,7,7}, {0,0,0,0,0,0,0,0}},\r\n{0, {8,8,8,8,8,8,8,8}, {0,0,0,0,0,0,0,0}},\r\n{0, {9,9,9,9,9,9,9,9}, {0,0,0,0,0,0,0,0}},\r\n{0, {10,10,10,10,10,10,10,10}, {0,0,0,0,0,0,0,0}},\r\n{0, {11,11,11,11,11,11,11,11}, {0,0,0,0,0,0,0,0}},\r\n{0, {12,12,12,12,12,12,12,12}, {0,0,0,0,0,0,0,0}},\r\n{0, {13,13,13,13,13,13,13,13}, {0,0,0,0,0,0,0,0}},\r\n{0, {18,18,18,18,18,18,18,18}, {0,0,0,0,0,0,0,0}},\r\n{0, {19,19,19,19,19,19,19,19}, {0,0,0,0,0,0,0,0}},\r\n{0, {20,20,20,20,20,20,20,20}, {0,0,0,0,0,0,0,0}},\r\n{0, {21,21,21,21,21,21,21,21}, {0,0,0,0,0,0,0,0}},\r\n{0, {22,22,22,22,22,22,22,22}, {0,0,0,0,0,0,0,0}},\r\n{0, {23,23,23,23,23,23,23,23}, {0,0,0,0,0,0,0,0}},\r\n{0, {24,24,24,24,24,24,24,24}, {0,0,0,0,0,0,0,0}},\r\n{0, {25,25,25,25,25,25,25,25}, {0,0,0,0,0,0,0,0}},\r\n{0, {26,26,26,26,26,26,26,26}, {0,0,0,0,0,0,0,0}},\r\n{0, {27,27,27,27,27,27,27,27}, {0,0,0,0,0,0,0,0}},\r\n{0, {28,28,28,28,28,28,28,28}, {0,0,0,0,0,0,0,0}},\r\n{0, {29,29,29,29,29,29,29,29}, {0,0,0,0,0,0,0,0}},\r\n{0, {30,30,30,30,30,30,30,30}, {0,0,0,0,0,0,0,0}},\r\n{0, {31,31,31,31,31,31,31,31}, {0,0,0,0,0,0,0,0}},\r\n{0, {32,32,32,32,32,32,32,32}, {0,0,0,0,0,0,0,0}},\r\n{0, {33,33,33,33,33,33,33,33}, {0,0,0,0,0,0,0,0}},\r\n{0, {34,34,34,34,34,34,34,34}, {0,0,0,0,0,0,0,0}},\r\n{0, {35,35,35,35,35,35,35,35}, {0,0,0,0,0,0,0,0}},\r\n{0, {36,36,36,36,36,36,36,36}, {0,0,0,0,0,0,0,0}},\r\n{0, {37,37,37,37,37,37,37,37}, {0,0,0,0,0,0,0,0}},\r\n{0, {38,38,38,38,38,38,38,38}, {0,0,0,0,0,0,0,0}},\r\n{0, {39,39,39,39,39,39,39,39}, {0,0,0,0,0,0,0,0}},\r\n{0, {40,40,40,40,40,40,40,40}, {0,0,0,0,0,0,0,0}},\r\n{0, {41,41,41,41,41,41,41,41}, {0,0,0,0,0,0,0,0}},\r\n{0, {42,42,42,42,42,42,42,42}, {0,0,0,0,0,0,0,0}},\r\n{0, {43,43,43,43,43,43,43,43}, {0,0,0,0,0,0,0,0}},\r\n{0, {44,44,44,44,44,44,44,44}, {0,0,0,0,0,0,0,0}},\r\n{0, {45,45,45,45,45,45,45,45}, {0,0,0,0,0,0,0,0}},\r\n{0, {46,46,46,46,46,46,46,46}, {0,0,0,0,0,0,0,0}},\r\n{0, {47,47,47,47,47,47,47,47}, {0,0,0,0,0,0,0,0}},\r\n{0, {48,48,48,48,48,48,48,48}, {0,0,0,0,0,0,0,0}},\r\n{0, {49,49,49,49,49,49,49,49}, {0,0,0,0,0,0,0,0}},\r\n{0, {50,50,50,50,50,50,50,50}, {0,0,0,0,0,0,0,0}},\r\n{0, {51,51,51,51,51,51,51,51}, {0,0,0,0,0,0,0,0}},\r\n{0, {52,52,52,52,52,52,52,52}, {0,0,0,0,0,0,0,0}},\r\n{0, {966,966,966,966,966,966,966,966}, {0,0,0,0,0,0,0,0}},\r\n{0, {967,967,967,967,967,967,967,967}, {0,0,0,0,0,0,0,0}},\r\n{0, {968,968,968,968,968,968,968,968}, {0,0,0,0,0,0,0,0}},\r\n{0, {1101,1101,1101,1101,1101,1101,1101,1101}, {0,0,0,0,0,0,0,0}},\r\n{0, {1102,1102,1102,1102,1102,1102,1102,1102}, {0,0,0,0,0,0,0,0}},\r\n{0, {1103,1103,1103,1103,1103,1103,1103,1103}, {0,0,0,0,0,0,0,0}},\r\n{0, {1104,1104,1104,1104,1104,1104,1104,1104}, {0,0,0,0,0,0,0,0}},\r\n{0, {922,922,922,922,922,922,922,922}, {0,0,0,0,0,0,0,0}},\r\n{0, {923,923,923,923,923,923,923,923}, {0,0,0,0,0,0,0,0}},\r\n{0, {924,924,924,924,924,924,924,924}, {0,0,0,0,0,0,0,0}},\r\n{0, {925,925,925,925,925,925,925,925}, {0,0,0,0,0,0,0,0}},\r\n{0, {926,926,926,926,926,926,926,926}, {0,0,0,0,0,0,0,0}},\r\n{0, {927,927,927,927,927,927,927,927}, {0,0,0,0,0,0,0,0}},\r\n{0, {928,928,928,928,928,928,928,928}, {0,0,0,0,0,0,0,0}},\r\n{0, {929,929,929,929,929,929,929,929}, {0,0,0,0,0,0,0,0}},\r\n{0, {930,930,930,930,930,930,930,930}, {0,0,0,0,0,0,0,0}},\r\n{0, {931,931,931,931,931,931,931,931}, {0,0,0,0,0,0,0,0}},\r\n{1, {932,933,934,935,932,935,934,933}, {0,0,0,0,1,1,1,1}},\r\n{1, {936,937,938,939,936,939,938,937}, {0,0,0,0,1,1,1,1}},\r\n{0, {940,940,940,940,940,940,940,940}, {0,0,0,0,0,0,0,0}},\r\n{0, {941,941,941,941,941,941,941,941}, {0,0,0,0,0,0,0,0}},\r\n{0, {942,942,942,942,942,942,942,942}, {0,0,0,0,0,0,0,0}},\r\n{0, {1084,1084,1084,1084,1084,1084,1084,1084}, {0,0,0,0,0,0,0,0}},\r\n{0, {1085,1085,1085,1085,1085,1085,1085,1085}, {0,0,0,0,0,0,0,0}},\r\n{0, {1079,1079,1079,1079,1079,1079,1079,1079}, {0,0,0,0,0,0,0,0}},\r\n{0, {1080,1080,1080,1080,1080,1080,1080,1080}, {0,0,0,0,0,0,0,0}},\r\n{0, {1081,1081,1081,1081,1081,1081,1081,1081}, {0,0,0,0,0,0,0,0}},\r\n{0, {1082,1082,1082,1082,1082,1082,1082,1082}, {0,0,0,0,0,0,0,0}},\r\n{0, {1083,1083,1083,1083,1083,1083,1083,1083}, {0,0,0,0,0,0,0,0}},\r\n{1, {1062,1066,1065,1064,1063,1064,1065,1066}, {0,1,1,1,0,0,0,0}},\r\n{0, {1067,1067,1067,1067,1067,1067,1067,1067}, {0,0,0,0,0,0,0,0}},\r\n{0, {1068,1068,1068,1068,1068,1068,1068,1068}, {0,0,0,0,0,0,0,0}},\r\n{0, {1069,1069,1069,1069,1069,1069,1069,1069}, {0,0,0,0,0,0,0,0}},\r\n{0, {960,960,960,960,960,960,960,960}, {0,0,0,0,0,0,0,0}},\r\n{0, {961,961,961,961,961,961,961,961}, {0,0,0,0,0,0,0,0}},\r\n{0, {950,950,950,950,950,950,950,950}, {0,0,0,0,0,0,0,0}},\r\n{0, {951,951,951,951,951,951,951,951}, {0,0,0,0,0,0,0,0}},\r\n{0, {952,952,952,952,952,952,952,952}, {0,0,0,0,0,0,0,0}},\r\n{0, {953,953,953,953,953,953,953,953}, {0,0,0,0,0,0,0,0}},\r\n{0, {954,954,954,954,954,954,954,954}, {0,0,0,0,0,0,0,0}},\r\n{0, {955,955,955,955,955,955,955,955}, {0,0,0,0,0,0,0,0}},\r\n{0, {956,956,956,956,956,956,956,956}, {0,0,0,0,0,0,0,0}},\r\n{0, {957,957,957,957,957,957,957,957}, {0,0,0,0,0,0,0,0}},\r\n{0, {958,958,958,958,958,958,958,958}, {0,0,0,0,0,0,0,0}},\r\n{0, {959,959,959,959,959,959,959,959}, {0,0,0,0,0,0,0,0}},\r\n{0, {1148,1148,1148,1148,1148,1148,1148,1148}, {0,0,0,0,0,0,0,0}},\r\n{0, {1149,1149,1149,1149,1149,1149,1149,1149}, {0,0,0,0,0,0,0,0}},\r\n{0, {1150,1150,1150,1150,1150,1150,1150,1150}, {0,0,0,0,0,0,0,0}},\r\n{0, {1151,1151,1151,1151,1151,1151,1151,1151}, {0,0,0,0,0,0,0,0}},\r\n{0, {1152,1152,1152,1152,1152,1152,1152,1152}, {0,0,0,0,0,0,0,0}},\r\n{0, {1153,1153,1153,1153,1153,1153,1153,1153}, {0,0,0,0,0,0,0,0}},\r\n{0, {1154,1154,1154,1154,1154,1154,1154,1154}, {0,0,0,0,0,0,0,0}},\r\n{0, {1155,1155,1155,1155,1155,1155,1155,1155}, {0,0,0,0,0,0,0,0}},\r\n{0, {1156,1156,1156,1156,1156,1156,1156,1156}, {0,0,0,0,0,0,0,0}},\r\n{0, {1157,1157,1157,1157,1157,1157,1157,1157}, {0,0,0,0,0,0,0,0}},\r\n{0, {1040,1040,1040,1040,1040,1040,1040,1040}, {0,0,0,0,0,0,0,0}},\r\n{0, {1041,1041,1041,1041,1041,1041,1041,1041}, {0,0,0,0,0,0,0,0}},\r\n{0, {1042,1042,1042,1042,1042,1042,1042,1042}, {0,0,0,0,0,0,0,0}},\r\n{0, {1043,1043,1043,1043,1043,1043,1043,1043}, {0,0,0,0,0,0,0,0}},\r\n{0, {1044,1044,1044,1044,1044,1044,1044,1044}, {0,0,0,0,0,0,0,0}},\r\n{1, {490,491,492,493,494,493,492,491}, {0,0,0,0,0,1,1,1}},\r\n{1, {495,496,497,498,499,498,497,496}, {0,0,0,0,0,1,1,1}},\r\n{1, {500,501,502,503,504,503,502,501}, {0,0,0,0,0,1,1,1}},\r\n{1, {505,506,507,508,509,508,507,506}, {0,0,0,0,0,1,1,1}},\r\n{1, {510,511,512,513,514,513,512,511}, {0,0,0,0,0,1,1,1}},\r\n{1, {515,516,517,518,519,518,517,516}, {0,0,0,0,0,1,1,1}},\r\n{1, {520,521,522,523,524,523,522,521}, {0,0,0,0,0,1,1,1}},\r\n{0, {525,525,525,525,525,525,525,525}, {0,0,0,0,0,0,0,0}},\r\n{0, {526,526,526,526,526,526,526,526}, {0,0,0,0,0,0,0,0}},\r\n{0, {527,527,527,527,527,527,527,527}, {0,0,0,0,0,0,0,0}},\r\n{0, {528,528,528,528,528,528,528,528}, {0,0,0,0,0,0,0,0}},\r\n{0, {529,529,529,529,529,529,529,529}, {0,0,0,0,0,0,0,0}},\r\n{0, {530,530,530,530,530,530,530,530}, {0,0,0,0,0,0,0,0}},\r\n{0, {531,531,531,531,531,531,531,531}, {0,0,0,0,0,0,0,0}},\r\n{0, {532,532,532,532,532,532,532,532}, {0,0,0,0,0,0,0,0}},\r\n{0, {533,533,533,533,533,533,533,533}, {0,0,0,0,0,0,0,0}},\r\n{0, {534,534,534,534,534,534,534,534}, {0,0,0,0,0,0,0,0}},\r\n{0, {535,535,535,535,535,535,535,535}, {0,0,0,0,0,0,0,0}},\r\n{0, {536,536,536,536,536,536,536,536}, {0,0,0,0,0,0,0,0}},\r\n{0, {537,537,537,537,537,537,537,537}, {0,0,0,0,0,0,0,0}},\r\n{0, {538,538,538,538,538,538,538,538}, {0,0,0,0,0,0,0,0}},\r\n{0, {539,539,539,539,539,539,539,539}, {0,0,0,0,0,0,0,0}},\r\n{0, {540,540,540,540,540,540,540,540}, {0,0,0,0,0,0,0,0}},\r\n{1, {541,542,543,544,545,544,543,542}, {0,0,0,0,0,1,1,1}},\r\n{1, {546,547,548,549,550,549,548,547}, {0,0,0,0,0,1,1,1}},\r\n{1, {551,552,553,554,555,554,553,552}, {0,0,0,0,0,1,1,1}},\r\n{1, {556,557,558,559,560,559,558,557}, {0,0,0,0,0,1,1,1}},\r\n{1, {561,562,563,564,565,564,563,562}, {0,0,0,0,0,1,1,1}},\r\n{1, {566,567,568,569,570,569,568,567}, {0,0,0,0,0,1,1,1}},\r\n{1, {571,572,573,574,575,574,573,572}, {0,0,0,0,0,1,1,1}},\r\n{0, {576,576,576,576,576,576,576,576}, {0,0,0,0,0,0,0,0}},\r\n{0, {577,577,577,577,577,577,577,577}, {0,0,0,0,0,0,0,0}},\r\n{0, {578,578,578,578,578,578,578,578}, {0,0,0,0,0,0,0,0}},\r\n{0, {579,579,579,579,579,579,579,579}, {0,0,0,0,0,0,0,0}},\r\n{0, {580,580,580,580,580,580,580,580}, {0,0,0,0,0,0,0,0}},\r\n{0, {581,581,581,581,581,581,581,581}, {0,0,0,0,0,0,0,0}},\r\n{0, {582,582,582,582,582,582,582,582}, {0,0,0,0,0,0,0,0}},\r\n{0, {583,583,583,583,583,583,583,583}, {0,0,0,0,0,0,0,0}},\r\n{0, {584,584,584,584,584,584,584,584}, {0,0,0,0,0,0,0,0}},\r\n{0, {585,585,585,585,585,585,585,585}, {0,0,0,0,0,0,0,0}},\r\n{0, {586,586,586,586,586,586,586,586}, {0,0,0,0,0,0,0,0}},\r\n{0, {587,587,587,587,587,587,587,587}, {0,0,0,0,0,0,0,0}},\r\n{0, {588,588,588,588,588,588,588,588}, {0,0,0,0,0,0,0,0}},\r\n{0, {589,589,589,589,589,589,589,589}, {0,0,0,0,0,0,0,0}},\r\n{1, {700,701,702,703,704,703,702,701}, {0,0,0,0,0,1,1,1}},\r\n{1, {705,706,707,708,709,708,707,706}, {0,0,0,0,0,1,1,1}},\r\n{1, {710,711,712,713,714,713,712,711}, {0,0,0,0,0,1,1,1}},\r\n{1, {715,716,717,718,719,718,717,716}, {0,0,0,0,0,1,1,1}},\r\n{1, {720,721,722,723,724,723,722,721}, {0,0,0,0,0,1,1,1}},\r\n{1, {725,726,727,728,729,728,727,726}, {0,0,0,0,0,1,1,1}},\r\n{1, {730,731,732,733,734,733,732,731}, {0,0,0,0,0,1,1,1}},\r\n{0, {735,735,735,735,735,735,735,735}, {0,0,0,0,0,0,0,0}},\r\n{0, {736,736,736,736,736,736,736,736}, {0,0,0,0,0,0,0,0}},\r\n{0, {737,737,737,737,737,737,737,737}, {0,0,0,0,0,0,0,0}},\r\n{0, {738,738,738,738,738,738,738,738}, {0,0,0,0,0,0,0,0}},\r\n{0, {739,739,739,739,739,739,739,739}, {0,0,0,0,0,0,0,0}},\r\n{0, {740,740,740,740,740,740,740,740}, {0,0,0,0,0,0,0,0}},\r\n{0, {741,741,741,741,741,741,741,741}, {0,0,0,0,0,0,0,0}},\r\n{0, {742,742,742,742,742,742,742,742}, {0,0,0,0,0,0,0,0}},\r\n{0, {743,743,743,743,743,743,743,743}, {0,0,0,0,0,0,0,0}},\r\n{0, {744,744,744,744,744,744,744,744}, {0,0,0,0,0,0,0,0}},\r\n{0, {745,745,745,745,745,745,745,745}, {0,0,0,0,0,0,0,0}},\r\n{0, {746,746,746,746,746,746,746,746}, {0,0,0,0,0,0,0,0}},\r\n{0, {747,747,747,747,747,747,747,747}, {0,0,0,0,0,0,0,0}},\r\n{0, {748,748,748,748,748,748,748,748}, {0,0,0,0,0,0,0,0}},\r\n{1, {1006,1007,1008,1009,1010,1009,1008,1007}, {0,0,0,0,0,1,1,1}},\r\n{1, {1011,1012,1013,1014,1015,1014,1013,1012}, {0,0,0,0,0,1,1,1}},\r\n{0, {1016,1016,1016,1016,1016,1016,1016,1016}, {0,0,0,0,0,0,0,0}},\r\n{0, {1017,1017,1017,1017,1017,1017,1017,1017}, {0,0,0,0,0,0,0,0}},\r\n{0, {1018,1018,1018,1018,1018,1018,1018,1018}, {0,0,0,0,0,0,0,0}},\r\n{1, {749,750,751,752,753,754,755,756}, {0,0,0,0,0,0,0,0}},\r\n{1, {757,758,759,760,761,762,763,764}, {0,0,0,0,0,0,0,0}},\r\n{1, {765,766,767,768,769,770,771,772}, {0,0,0,0,0,0,0,0}},\r\n{1, {749,756,755,754,753,752,751,750}, {1,1,1,1,1,1,1,1}},\r\n{1, {757,764,763,762,761,760,759,758}, {1,1,1,1,1,1,1,1}},\r\n{1, {765,772,771,770,769,768,767,766}, {1,1,1,1,1,1,1,1}},\r\n{1, {773,774,775,776,777,778,779,780}, {0,0,0,0,0,0,0,0}},\r\n{1, {781,782,783,784,785,786,787,788}, {0,0,0,0,0,0,0,0}},\r\n{1, {789,790,791,792,793,794,795,796}, {0,0,0,0,0,0,0,0}},\r\n{1, {797,798,799,800,801,802,803,804}, {0,0,0,0,0,0,0,0}},\r\n{1, {805,806,807,808,809,810,811,812}, {0,0,0,0,0,0,0,0}},\r\n{1, {813,814,815,816,817,818,819,820}, {0,0,0,0,0,0,0,0}},\r\n{0, {821,821,821,821,821,821,821,821}, {0,0,0,0,0,0,0,0}},\r\n{0, {822,822,822,822,822,822,822,822}, {0,0,0,0,0,0,0,0}},\r\n{0, {823,823,823,823,823,823,823,823}, {0,0,0,0,0,0,0,0}},\r\n{0, {824,824,824,824,824,824,824,824}, {0,0,0,0,0,0,0,0}},\r\n{0, {825,825,825,825,825,825,825,825}, {0,0,0,0,0,0,0,0}},\r\n{1, {1046,1050,1049,1048,1047,1048,1049,1050}, {0,1,1,1,0,0,0,0}},\r\n{1, {1051,1055,1054,1053,1052,1053,1054,1055}, {0,1,1,1,0,0,0,0}},\r\n{1, {350,351,352,353,354,353,352,351}, {0,0,0,0,0,1,1,1}},\r\n{1, {355,356,357,358,359,358,357,356}, {0,0,0,0,0,1,1,1}},\r\n{1, {360,361,362,363,364,363,362,361}, {0,0,0,0,0,1,1,1}},\r\n{1, {365,366,367,368,369,368,367,366}, {0,0,0,0,0,1,1,1}},\r\n{1, {370,371,372,373,374,373,372,371}, {0,0,0,0,0,1,1,1}},\r\n{1, {375,376,377,378,379,378,377,376}, {0,0,0,0,0,1,1,1}},\r\n{1, {380,381,382,383,384,383,382,381}, {0,0,0,0,0,1,1,1}},\r\n{1, {385,386,387,388,389,388,387,386}, {0,0,0,0,0,1,1,1}},\r\n{1, {390,391,392,393,394,393,392,391}, {0,0,0,0,0,1,1,1}},\r\n{1, {395,396,397,398,399,400,401,402}, {0,0,0,0,0,0,0,0}},\r\n{0, {403,403,403,403,403,403,403,403}, {0,0,0,0,0,0,0,0}},\r\n{0, {404,404,404,404,404,404,404,404}, {0,0,0,0,0,0,0,0}},\r\n{0, {405,405,405,405,405,405,405,405}, {0,0,0,0,0,0,0,0}},\r\n{0, {406,406,406,406,406,406,406,406}, {0,0,0,0,0,0,0,0}},\r\n{0, {407,407,407,407,407,407,407,407}, {0,0,0,0,0,0,0,0}},\r\n{0, {408,408,408,408,408,408,408,408}, {0,0,0,0,0,0,0,0}},\r\n{0, {409,409,409,409,409,409,409,409}, {0,0,0,0,0,0,0,0}},\r\n{0, {410,410,410,410,410,410,410,410}, {0,0,0,0,0,0,0,0}},\r\n{0, {411,411,411,411,411,411,411,411}, {0,0,0,0,0,0,0,0}},\r\n{0, {412,412,412,412,412,412,412,412}, {0,0,0,0,0,0,0,0}},\r\n{1, {216,217,218,219,220,221,222,223}, {0,0,0,0,0,0,0,0}},\r\n{1, {224,225,226,227,228,229,230,231}, {0,0,0,0,0,0,0,0}},\r\n{1, {232,233,234,235,236,237,238,239}, {0,0,0,0,0,0,0,0}},\r\n{1, {240,241,242,243,244,245,246,247}, {0,0,0,0,0,0,0,0}},\r\n{1, {248,249,250,251,252,253,254,255}, {0,0,0,0,0,0,0,0}},\r\n{1, {256,257,258,259,260,261,262,263}, {0,0,0,0,0,0,0,0}},\r\n{1, {264,265,266,267,268,269,270,271}, {0,0,0,0,0,0,0,0}},\r\n{0, {272,272,272,272,272,272,272,272}, {0,0,0,0,0,0,0,0}},\r\n{0, {273,273,273,273,273,273,273,273}, {0,0,0,0,0,0,0,0}},\r\n{0, {274,274,274,274,274,274,274,274}, {0,0,0,0,0,0,0,0}},\r\n{0, {275,275,275,275,275,275,275,275}, {0,0,0,0,0,0,0,0}},\r\n{0, {276,276,276,276,276,276,276,276}, {0,0,0,0,0,0,0,0}},\r\n{0, {277,277,277,277,277,277,277,277}, {0,0,0,0,0,0,0,0}},\r\n{0, {278,278,278,278,278,278,278,278}, {0,0,0,0,0,0,0,0}},\r\n{0, {279,279,279,279,279,279,279,279}, {0,0,0,0,0,0,0,0}},\r\n{0, {280,280,280,280,280,280,280,280}, {0,0,0,0,0,0,0,0}},\r\n{0, {281,281,281,281,281,281,281,281}, {0,0,0,0,0,0,0,0}},\r\n{0, {282,282,282,282,282,282,282,282}, {0,0,0,0,0,0,0,0}},\r\n{0, {283,283,283,283,283,283,283,283}, {0,0,0,0,0,0,0,0}},\r\n{0, {284,284,284,284,284,284,284,284}, {0,0,0,0,0,0,0,0}},\r\n{1, {590,591,592,593,594,593,592,591}, {0,0,0,0,0,1,1,1}},\r\n{1, {595,596,597,598,599,598,597,596}, {0,0,0,0,0,1,1,1}},\r\n{1, {600,601,602,603,604,603,602,601}, {0,0,0,0,0,1,1,1}},\r\n{1, {605,606,607,608,609,608,607,606}, {0,0,0,0,0,1,1,1}},\r\n{1, {610,611,612,613,614,615,616,617}, {0,0,0,0,0,0,0,0}},\r\n{1, {618,619,620,621,622,623,624,625}, {0,0,0,0,0,0,0,0}},\r\n{1, {626,627,628,629,630,631,632,633}, {0,0,0,0,0,0,0,0}},\r\n{1, {634,635,636,637,638,639,640,641}, {0,0,0,0,0,0,0,0}},\r\n{0, {642,642,642,642,642,642,642,642}, {0,0,0,0,0,0,0,0}},\r\n{0, {643,643,643,643,643,643,643,643}, {0,0,0,0,0,0,0,0}},\r\n{0, {644,644,644,644,644,644,644,644}, {0,0,0,0,0,0,0,0}},\r\n{0, {645,645,645,645,645,645,645,645}, {0,0,0,0,0,0,0,0}},\r\n{0, {646,646,646,646,646,646,646,646}, {0,0,0,0,0,0,0,0}},\r\n{0, {647,647,647,647,647,647,647,647}, {0,0,0,0,0,0,0,0}},\r\n{1, {413,414,415,416,417,416,415,414}, {0,0,0,0,0,1,1,1}},\r\n{1, {418,421,424,427,430,427,424,421}, {0,0,0,0,0,1,1,1}},\r\n{1, {419,422,425,428,431,428,425,422}, {0,0,0,0,0,1,1,1}},\r\n{1, {420,423,426,429,432,429,426,423}, {0,0,0,0,0,1,1,1}},\r\n{1, {433,436,438,440,442,440,438,436}, {0,0,0,0,0,1,1,1}},\r\n{1, {434,437,439,441,443,441,439,437}, {0,0,0,0,0,1,1,1}},\r\n{0, {435,435,435,435,435,435,435,435}, {0,0,0,0,0,0,0,0}},\r\n{0, {444,444,444,444,444,444,444,444}, {0,0,0,0,0,0,0,0}},\r\n{0, {445,445,445,445,445,445,445,445}, {0,0,0,0,0,0,0,0}},\r\n{0, {446,446,446,446,446,446,446,446}, {0,0,0,0,0,0,0,0}},\r\n{0, {447,447,447,447,447,447,447,447}, {0,0,0,0,0,0,0,0}},\r\n{0, {448,448,448,448,448,448,448,448}, {0,0,0,0,0,0,0,0}},\r\n{1, {108,109,110,111,112,111,110,109}, {0,0,0,0,0,1,1,1}},\r\n{1, {113,114,115,116,117,116,115,114}, {0,0,0,0,0,1,1,1}},\r\n{1, {118,119,120,121,122,121,120,119}, {0,0,0,0,0,1,1,1}},\r\n{1, {123,124,125,126,127,126,125,124}, {0,0,0,0,0,1,1,1}},\r\n{1, {128,129,130,131,132,133,134,135}, {0,0,0,0,0,0,0,0}},\r\n{1, {136,137,138,139,140,141,142,143}, {0,0,0,0,0,0,0,0}},\r\n{1, {144,145,146,147,148,149,150,151}, {0,0,0,0,0,0,0,0}},\r\n{1, {152,153,154,155,156,157,158,159}, {0,0,0,0,0,0,0,0}},\r\n{0, {160,160,160,160,160,160,160,160}, {0,0,0,0,0,0,0,0}},\r\n{0, {161,161,161,161,161,161,161,161}, {0,0,0,0,0,0,0,0}},\r\n{0, {162,162,162,162,162,162,162,162}, {0,0,0,0,0,0,0,0}},\r\n{0, {163,163,163,163,163,163,163,163}, {0,0,0,0,0,0,0,0}},\r\n{0, {164,164,164,164,164,164,164,164}, {0,0,0,0,0,0,0,0}},\r\n{0, {165,165,165,165,165,165,165,165}, {0,0,0,0,0,0,0,0}},\r\n{0, {166,166,166,166,166,166,166,166}, {0,0,0,0,0,0,0,0}},\r\n{1, {53,54,55,56,57,58,59,60}, {0,0,0,0,0,0,0,0}},\r\n{1, {61,62,63,64,65,66,67,68}, {0,0,0,0,0,0,0,0}},\r\n{1, {53,60,59,58,57,56,55,54}, {1,1,1,1,1,1,1,1}},\r\n{1, {61,68,67,66,65,64,63,62}, {1,1,1,1,1,1,1,1}},\r\n{1, {69,70,71,72,73,74,75,76}, {0,0,0,0,0,0,0,0}},\r\n{1, {77,78,79,80,81,82,83,84}, {0,0,0,0,0,0,0,0}},\r\n{1, {85,86,87,88,89,90,91,92}, {0,0,0,0,0,0,0,0}},\r\n{1, {93,94,95,96,97,98,99,100}, {0,0,0,0,0,0,0,0}},\r\n{0, {101,101,101,101,101,101,101,101}, {0,0,0,0,0,0,0,0}},\r\n{0, {102,102,102,102,102,102,102,102}, {0,0,0,0,0,0,0,0}},\r\n{0, {103,103,103,103,103,103,103,103}, {0,0,0,0,0,0,0,0}},\r\n{0, {104,104,104,104,104,104,104,104}, {0,0,0,0,0,0,0,0}},\r\n{0, {105,105,105,105,105,105,105,105}, {0,0,0,0,0,0,0,0}},\r\n{0, {106,106,106,106,106,106,106,106}, {0,0,0,0,0,0,0,0}},\r\n{0, {107,107,107,107,107,107,107,107}, {0,0,0,0,0,0,0,0}},\r\n{1, {826,827,828,829,830,829,828,827}, {0,1,1,1,0,0,0,0}},\r\n{1, {831,832,833,834,835,834,833,832}, {0,1,1,1,0,0,0,0}},\r\n{1, {836,837,838,839,840,839,838,837}, {0,1,1,1,0,0,0,0}},\r\n{1, {841,842,843,844,845,844,843,842}, {0,1,1,1,0,0,0,0}},\r\n{1, {846,847,848,849,850,849,848,847}, {0,1,1,1,0,0,0,0}},\r\n{0, {851,851,851,851,851,851,851,851}, {0,0,0,0,0,0,0,0}},\r\n{0, {852,852,852,852,852,852,852,852}, {0,0,0,0,0,0,0,0}},\r\n{0, {853,853,853,853,853,853,853,853}, {0,0,0,0,0,0,0,0}},\r\n{0, {854,854,854,854,854,854,854,854}, {0,0,0,0,0,0,0,0}},\r\n{0, {855,855,855,855,855,855,855,855}, {0,0,0,0,0,0,0,0}},\r\n{0, {856,856,856,856,856,856,856,856}, {0,0,0,0,0,0,0,0}},\r\n{1, {648,649,650,651,652,651,650,649}, {0,0,0,0,0,1,1,1}},\r\n{1, {653,654,655,656,657,656,655,654}, {0,0,0,0,0,1,1,1}},\r\n{1, {658,659,660,661,662,661,660,659}, {0,0,0,0,0,1,1,1}},\r\n{1, {648,663,664,665,652,665,664,663}, {1,0,0,0,1,1,1,1}},\r\n{1, {653,666,667,668,657,668,667,666}, {1,0,0,0,1,1,1,1}},\r\n{1, {658,669,670,671,662,671,670,669}, {1,0,0,0,1,1,1,1}},\r\n{1, {672,673,674,675,676,675,674,673}, {0,0,0,0,0,1,1,1}},\r\n{1, {677,678,679,680,681,680,679,678}, {0,0,0,0,0,1,1,1}},\r\n{1, {682,683,684,685,686,687,688,689}, {0,0,0,0,0,0,0,0}},\r\n{0, {690,690,690,690,690,690,690,690}, {0,0,0,0,0,0,0,0}},\r\n{0, {691,691,691,691,691,691,691,691}, {0,0,0,0,0,0,0,0}},\r\n{0, {692,692,692,692,692,692,692,692}, {0,0,0,0,0,0,0,0}},\r\n{0, {693,693,693,693,693,693,693,693}, {0,0,0,0,0,0,0,0}},\r\n{0, {694,694,694,694,694,694,694,694}, {0,0,0,0,0,0,0,0}},\r\n{0, {695,695,695,695,695,695,695,695}, {0,0,0,0,0,0,0,0}},\r\n{0, {696,696,696,696,696,696,696,696}, {0,0,0,0,0,0,0,0}},\r\n{0, {697,697,697,697,697,697,697,697}, {0,0,0,0,0,0,0,0}},\r\n{0, {698,698,698,698,698,698,698,698}, {0,0,0,0,0,0,0,0}},\r\n{0, {699,699,699,699,699,699,699,699}, {0,0,0,0,0,0,0,0}},\r\n{1, {167,168,169,170,171,170,169,168}, {0,0,0,0,0,1,1,1}},\r\n{1, {172,173,174,175,176,175,174,173}, {0,0,0,0,0,1,1,1}},\r\n{1, {177,178,179,180,181,180,179,178}, {0,0,0,0,0,1,1,1}},\r\n{1, {167,182,183,184,171,184,183,182}, {1,0,0,0,1,1,1,1}},\r\n{1, {172,185,186,187,176,187,186,185}, {1,0,0,0,1,1,1,1}},\r\n{1, {177,188,189,190,181,190,189,188}, {1,0,0,0,1,1,1,1}},\r\n{1, {191,192,193,194,195,194,193,192}, {0,0,0,0,0,1,1,1}},\r\n{1, {196,197,198,199,200,199,198,197}, {0,0,0,0,0,1,1,1}},\r\n{1, {201,202,203,204,205,206,207,208}, {0,0,0,0,0,0,0,0}},\r\n{0, {209,209,209,209,209,209,209,209}, {0,0,0,0,0,0,0,0}},\r\n{0, {210,210,210,210,210,210,210,210}, {0,0,0,0,0,0,0,0}},\r\n{0, {211,211,211,211,211,211,211,211}, {0,0,0,0,0,0,0,0}},\r\n{0, {212,212,212,212,212,212,212,212}, {0,0,0,0,0,0,0,0}},\r\n{0, {213,213,213,213,213,213,213,213}, {0,0,0,0,0,0,0,0}},\r\n{0, {214,214,214,214,214,214,214,214}, {0,0,0,0,0,0,0,0}},\r\n{0, {215,215,215,215,215,215,215,215}, {0,0,0,0,0,0,0,0}},\r\n{0, {916,916,916,916,916,916,916,916}, {0,0,0,0,0,0,0,0}},\r\n{0, {917,917,917,917,917,917,917,917}, {0,0,0,0,0,0,0,0}},\r\n{0, {911,911,911,911,911,911,911,911}, {0,0,0,0,0,0,0,0}},\r\n{0, {912,912,912,912,912,912,912,912}, {0,0,0,0,0,0,0,0}},\r\n{0, {913,913,913,913,913,913,913,913}, {0,0,0,0,0,0,0,0}},\r\n{0, {914,914,914,914,914,914,914,914}, {0,0,0,0,0,0,0,0}},\r\n{0, {915,915,915,915,915,915,915,915}, {0,0,0,0,0,0,0,0}},\r\n{1, {285,286,287,288,289,290,291,292}, {0,0,0,0,0,0,0,0}},\r\n{1, {293,294,295,296,297,298,299,300}, {0,0,0,0,0,0,0,0}},\r\n{1, {301,302,303,304,305,306,307,308}, {0,0,0,0,0,0,0,0}},\r\n{1, {309,310,311,312,313,314,315,316}, {0,0,0,0,0,0,0,0}},\r\n{1, {317,318,319,320,321,322,323,324}, {0,0,0,0,0,0,0,0}},\r\n{1, {325,326,327,328,329,330,331,332}, {0,0,0,0,0,0,0,0}},\r\n{1, {333,334,335,336,337,338,339,340}, {0,0,0,0,0,0,0,0}},\r\n{0, {341,341,341,341,341,341,341,341}, {0,0,0,0,0,0,0,0}},\r\n{0, {342,342,342,342,342,342,342,342}, {0,0,0,0,0,0,0,0}},\r\n{0, {343,343,343,343,343,343,343,343}, {0,0,0,0,0,0,0,0}},\r\n{0, {344,344,344,344,344,344,344,344}, {0,0,0,0,0,0,0,0}},\r\n{0, {345,345,345,345,345,345,345,345}, {0,0,0,0,0,0,0,0}},\r\n{0, {346,346,346,346,346,346,346,346}, {0,0,0,0,0,0,0,0}},\r\n{0, {347,347,347,347,347,347,347,347}, {0,0,0,0,0,0,0,0}},\r\n{0, {348,348,348,348,348,348,348,348}, {0,0,0,0,0,0,0,0}},\r\n{0, {349,349,349,349,349,349,349,349}, {0,0,0,0,0,0,0,0}},\r\n{1, {449,450,451,452,453,452,451,450}, {0,0,0,0,0,1,1,1}},\r\n{1, {454,455,456,457,458,457,456,455}, {0,0,0,0,0,1,1,1}},\r\n{1, {459,460,461,462,463,462,461,460}, {0,0,0,0,0,1,1,1}},\r\n{1, {464,465,466,467,468,467,466,465}, {0,0,0,0,0,1,1,1}},\r\n{1, {469,470,471,472,473,472,471,470}, {0,0,0,0,0,1,1,1}},\r\n{1, {474,475,476,477,478,477,476,475}, {0,0,0,0,0,1,1,1}},\r\n{1, {479,480,481,482,483,482,481,480}, {0,0,0,0,0,1,1,1}},\r\n{0, {484,484,484,484,484,484,484,484}, {0,0,0,0,0,0,0,0}},\r\n{0, {485,485,485,485,485,485,485,485}, {0,0,0,0,0,0,0,0}},\r\n{0, {486,486,486,486,486,486,486,486}, {0,0,0,0,0,0,0,0}},\r\n{0, {487,487,487,487,487,487,487,487}, {0,0,0,0,0,0,0,0}},\r\n{0, {488,488,488,488,488,488,488,488}, {0,0,0,0,0,0,0,0}},\r\n{0, {489,489,489,489,489,489,489,489}, {0,0,0,0,0,0,0,0}},\r\n{0, {918,918,918,918,918,918,918,918}, {0,0,0,0,0,0,0,0}},\r\n{0, {919,919,919,919,919,919,919,919}, {0,0,0,0,0,0,0,0}},\r\n{0, {920,920,920,920,920,920,920,920}, {0,0,0,0,0,0,0,0}},\r\n{0, {921,921,921,921,921,921,921,921}, {0,0,0,0,0,0,0,0}},\r\n{0, {943,943,943,943,943,943,943,943}, {0,0,0,0,0,0,0,0}},\r\n{0, {944,944,944,944,944,944,944,944}, {0,0,0,0,0,0,0,0}},\r\n{0, {945,945,945,945,945,945,945,945}, {0,0,0,0,0,0,0,0}},\r\n{0, {946,946,946,946,946,946,946,946}, {0,0,0,0,0,0,0,0}},\r\n{0, {947,947,947,947,947,947,947,947}, {0,0,0,0,0,0,0,0}},\r\n{0, {948,948,948,948,948,948,948,948}, {0,0,0,0,0,0,0,0}},\r\n{0, {949,949,949,949,949,949,949,949}, {0,0,0,0,0,0,0,0}},\r\n{0, {1019,1019,1019,1019,1019,1019,1019,1019}, {0,0,0,0,0,0,0,0}},\r\n{0, {1020,1020,1020,1020,1020,1020,1020,1020}, {0,0,0,0,0,0,0,0}},\r\n{0, {1021,1021,1021,1021,1021,1021,1021,1021}, {0,0,0,0,0,0,0,0}},\r\n{0, {969,969,969,969,969,969,969,969}, {0,0,0,0,0,0,0,0}},\r\n{0, {970,970,970,970,970,970,970,970}, {0,0,0,0,0,0,0,0}},\r\n{0, {971,971,971,971,971,971,971,971}, {0,0,0,0,0,0,0,0}},\r\n{0, {972,972,972,972,972,972,972,972}, {0,0,0,0,0,0,0,0}},\r\n{0, {973,973,973,973,973,973,973,973}, {0,0,0,0,0,0,0,0}},\r\n{0, {974,974,974,974,974,974,974,974}, {0,0,0,0,0,0,0,0}},\r\n{0, {975,975,975,975,975,975,975,975}, {0,0,0,0,0,0,0,0}},\r\n{0, {976,976,976,976,976,976,976,976}, {0,0,0,0,0,0,0,0}},\r\n{0, {963,963,963,963,963,963,963,963}, {0,0,0,0,0,0,0,0}},\r\n{0, {964,964,964,964,964,964,964,964}, {0,0,0,0,0,0,0,0}},\r\n{0, {1107,1107,1107,1107,1107,1107,1107,1107}, {0,0,0,0,0,0,0,0}},\r\n{0, {1108,1108,1108,1108,1108,1108,1108,1108}, {0,0,0,0,0,0,0,0}},\r\n{0, {1168,1168,1168,1168,1168,1168,1168,1168}, {0,0,0,0,0,0,0,0}},\r\n{0, {1169,1169,1169,1169,1169,1169,1169,1169}, {0,0,0,0,0,0,0,0}},\r\n{0, {980,980,980,980,980,980,980,980}, {0,0,0,0,0,0,0,0}},\r\n{0, {981,981,981,981,981,981,981,981}, {0,0,0,0,0,0,0,0}},\r\n{0, {1110,1110,1110,1110,1110,1110,1110,1110}, {0,0,0,0,0,0,0,0}},\r\n{0, {1111,1111,1111,1111,1111,1111,1111,1111}, {0,0,0,0,0,0,0,0}},\r\n{0, {1170,1170,1170,1170,1170,1170,1170,1170}, {0,0,0,0,0,0,0,0}},\r\n{0, {1171,1171,1171,1171,1171,1171,1171,1171}, {0,0,0,0,0,0,0,0}},\r\n{0, {1134,1134,1134,1134,1134,1134,1134,1134}, {0,0,0,0,0,0,0,0}},\r\n{0, {1056,1056,1056,1056,1056,1056,1056,1056}, {0,0,0,0,0,0,0,0}},\r\n{0, {1130,1130,1130,1130,1130,1130,1130,1130}, {0,0,0,0,0,0,0,0}},\r\n{0, {1131,1131,1131,1131,1131,1131,1131,1131}, {0,0,0,0,0,0,0,0}},\r\n{0, {1132,1132,1132,1132,1132,1132,1132,1132}, {0,0,0,0,0,0,0,0}},\r\n{0, {1133,1133,1133,1133,1133,1133,1133,1133}, {0,0,0,0,0,0,0,0}},\r\n{0, {1074,1074,1074,1074,1074,1074,1074,1074}, {0,0,0,0,0,0,0,0}},\r\n{0, {1075,1075,1075,1075,1075,1075,1075,1075}, {0,0,0,0,0,0,0,0}},\r\n{0, {1076,1076,1076,1076,1076,1076,1076,1076}, {0,0,0,0,0,0,0,0}},\r\n{0, {1077,1077,1077,1077,1077,1077,1077,1077}, {0,0,0,0,0,0,0,0}},\r\n{0, {1100,1100,1100,1100,1100,1100,1100,1100}, {0,0,0,0,0,0,0,0}},\r\n{0, {1070,1070,1070,1070,1070,1070,1070,1070}, {0,0,0,0,0,0,0,0}},\r\n{0, {1071,1071,1071,1071,1071,1071,1071,1071}, {0,0,0,0,0,0,0,0}},\r\n{0, {1072,1072,1072,1072,1072,1072,1072,1072}, {0,0,0,0,0,0,0,0}},\r\n{0, {1073,1073,1073,1073,1073,1073,1073,1073}, {0,0,0,0,0,0,0,0}},\r\n{0, {1057,1057,1057,1057,1057,1057,1057,1057}, {0,0,0,0,0,0,0,0}},\r\n{0, {1058,1058,1058,1058,1058,1058,1058,1058}, {0,0,0,0,0,0,0,0}},\r\n{0, {1059,1059,1059,1059,1059,1059,1059,1059}, {0,0,0,0,0,0,0,0}},\r\n{0, {1060,1060,1060,1060,1060,1060,1060,1060}, {0,0,0,0,0,0,0,0}},\r\n{0, {1135,1135,1135,1135,1135,1135,1135,1135}, {0,0,0,0,0,0,0,0}},\r\n{0, {1086,1086,1086,1086,1086,1086,1086,1086}, {0,0,0,0,0,0,0,0}},\r\n{0, {1087,1087,1087,1087,1087,1087,1087,1087}, {0,0,0,0,0,0,0,0}},\r\n{0, {1088,1088,1088,1088,1088,1088,1088,1088}, {0,0,0,0,0,0,0,0}},\r\n{0, {1089,1089,1089,1089,1089,1089,1089,1089}, {0,0,0,0,0,0,0,0}},\r\n{0, {1105,1105,1105,1105,1105,1105,1105,1105}, {0,0,0,0,0,0,0,0}},\r\n{0, {1106,1106,1106,1106,1106,1106,1106,1106}, {0,0,0,0,0,0,0,0}},\r\n{0, {989,989,989,989,989,989,989,989}, {0,0,0,0,0,0,0,0}},\r\n{0, {910,910,910,910,910,910,910,910}, {0,0,0,0,0,0,0,0}},\r\n{0, {1109,1109,1109,1109,1109,1109,1109,1109}, {0,0,0,0,0,0,0,0}},\r\n{0, {978,978,978,978,978,978,978,978}, {0,0,0,0,0,0,0,0}},\r\n{0, {984,984,984,984,984,984,984,984}, {0,0,0,0,0,0,0,0}},\r\n{0, {985,985,985,985,985,985,985,985}, {0,0,0,0,0,0,0,0}},\r\n{0, {1114,1114,1114,1114,1114,1114,1114,1114}, {0,0,0,0,0,0,0,0}},\r\n{0, {1112,1112,1112,1112,1112,1112,1112,1112}, {0,0,0,0,0,0,0,0}},\r\n{0, {977,977,977,977,977,977,977,977}, {0,0,0,0,0,0,0,0}},\r\n{0, {962,962,962,962,962,962,962,962}, {0,0,0,0,0,0,0,0}},\r\n{0, {1061,1061,1061,1061,1061,1061,1061,1061}, {0,0,0,0,0,0,0,0}},\r\n{0, {998,998,998,998,998,998,998,998}, {0,0,0,0,0,0,0,0}},\r\n{0, {1045,1045,1045,1045,1045,1045,1045,1045}, {0,0,0,0,0,0,0,0}},\r\n{0, {1078,1078,1078,1078,1078,1078,1078,1078}, {0,0,0,0,0,0,0,0}},\r\n{0, {1115,1115,1115,1115,1115,1115,1115,1115}, {0,0,0,0,0,0,0,0}},\r\n{0, {1113,1113,1113,1113,1113,1113,1113,1113}, {0,0,0,0,0,0,0,0}},\r\n{0, {997,997,997,997,997,997,997,997}, {0,0,0,0,0,0,0,0}},\r\n{0, {1129,1129,1129,1129,1129,1129,1129,1129}, {0,0,0,0,0,0,0,0}},\r\n{0, {1093,1093,1093,1093,1093,1093,1093,1093}, {0,0,0,0,0,0,0,0}},\r\n{0, {1097,1097,1097,1097,1097,1097,1097,1097}, {0,0,0,0,0,0,0,0}},\r\n{0, {1096,1096,1096,1096,1096,1096,1096,1096}, {0,0,0,0,0,0,0,0}},\r\n{0, {1092,1092,1092,1092,1092,1092,1092,1092}, {0,0,0,0,0,0,0,0}},\r\n{0, {1028,1028,1028,1028,1028,1028,1028,1028}, {0,0,0,0,0,0,0,0}},\r\n{0, {1029,1029,1029,1029,1029,1029,1029,1029}, {0,0,0,0,0,0,0,0}},\r\n{0, {1030,1030,1030,1030,1030,1030,1030,1030}, {0,0,0,0,0,0,0,0}},\r\n{0, {1031,1031,1031,1031,1031,1031,1031,1031}, {0,0,0,0,0,0,0,0}},\r\n{0, {1124,1124,1124,1124,1124,1124,1124,1124}, {0,0,0,0,0,0,0,0}},\r\n{0, {990,990,990,990,990,990,990,990}, {0,0,0,0,0,0,0,0}},\r\n{0, {991,991,991,991,991,991,991,991}, {0,0,0,0,0,0,0,0}},\r\n{0, {992,992,992,992,992,992,992,992}, {0,0,0,0,0,0,0,0}},\r\n{0, {993,993,993,993,993,993,993,993}, {0,0,0,0,0,0,0,0}},\r\n{0, {996,996,996,996,996,996,996,996}, {0,0,0,0,0,0,0,0}},\r\n{0, {982,982,982,982,982,982,982,982}, {0,0,0,0,0,0,0,0}},\r\n{0, {983,983,983,983,983,983,983,983}, {0,0,0,0,0,0,0,0}},\r\n{0, {1166,1166,1166,1166,1166,1166,1166,1166}, {0,0,0,0,0,0,0,0}},\r\n{0, {1005,1005,1005,1005,1005,1005,1005,1005}, {0,0,0,0,0,0,0,0}},\r\n{0, {1022,1022,1022,1022,1022,1022,1022,1022}, {0,0,0,0,0,0,0,0}},\r\n{0, {1023,1023,1023,1023,1023,1023,1023,1023}, {0,0,0,0,0,0,0,0}},\r\n{0, {1024,1024,1024,1024,1024,1024,1024,1024}, {0,0,0,0,0,0,0,0}},\r\n{0, {1116,1116,1116,1116,1116,1116,1116,1116}, {0,0,0,0,0,0,0,0}},\r\n{0, {1117,1117,1117,1117,1117,1117,1117,1117}, {0,0,0,0,0,0,0,0}},\r\n{0, {1118,1118,1118,1118,1118,1118,1118,1118}, {0,0,0,0,0,0,0,0}},\r\n{0, {1119,1119,1119,1119,1119,1119,1119,1119}, {0,0,0,0,0,0,0,0}},\r\n{0, {1120,1120,1120,1120,1120,1120,1120,1120}, {0,0,0,0,0,0,0,0}},\r\n{0, {1121,1121,1121,1121,1121,1121,1121,1121}, {0,0,0,0,0,0,0,0}},\r\n{0, {1122,1122,1122,1122,1122,1122,1122,1122}, {0,0,0,0,0,0,0,0}},\r\n{0, {1123,1123,1123,1123,1123,1123,1123,1123}, {0,0,0,0,0,0,0,0}},\r\n{0, {1125,1125,1125,1125,1125,1125,1125,1125}, {0,0,0,0,0,0,0,0}},\r\n{0, {1126,1126,1126,1126,1126,1126,1126,1126}, {0,0,0,0,0,0,0,0}},\r\n{0, {1127,1127,1127,1127,1127,1127,1127,1127}, {0,0,0,0,0,0,0,0}},\r\n{0, {1128,1128,1128,1128,1128,1128,1128,1128}, {0,0,0,0,0,0,0,0}},\r\n{0, {1032,1032,1032,1032,1032,1032,1032,1032}, {0,0,0,0,0,0,0,0}},\r\n{0, {965,965,965,965,965,965,965,965}, {0,0,0,0,0,0,0,0}},\r\n{0, {1033,1033,1033,1033,1033,1033,1033,1033}, {0,0,0,0,0,0,0,0}},\r\n{0, {999,999,999,999,999,999,999,999}, {0,0,0,0,0,0,0,0}},\r\n{0, {1000,1000,1000,1000,1000,1000,1000,1000}, {0,0,0,0,0,0,0,0}},\r\n{0, {1001,1001,1001,1001,1001,1001,1001,1001}, {0,0,0,0,0,0,0,0}},\r\n{0, {1002,1002,1002,1002,1002,1002,1002,1002}, {0,0,0,0,0,0,0,0}},\r\n{0, {1003,1003,1003,1003,1003,1003,1003,1003}, {0,0,0,0,0,0,0,0}},\r\n{0, {1004,1004,1004,1004,1004,1004,1004,1004}, {0,0,0,0,0,0,0,0}},\r\n{0, {1158,1158,1158,1158,1158,1158,1158,1158}, {0,0,0,0,0,0,0,0}},\r\n{0, {1159,1159,1159,1159,1159,1159,1159,1159}, {0,0,0,0,0,0,0,0}},\r\n{0, {1160,1160,1160,1160,1160,1160,1160,1160}, {0,0,0,0,0,0,0,0}},\r\n{0, {1161,1161,1161,1161,1161,1161,1161,1161}, {0,0,0,0,0,0,0,0}},\r\n{0, {1162,1162,1162,1162,1162,1162,1162,1162}, {0,0,0,0,0,0,0,0}},\r\n{0, {1163,1163,1163,1163,1163,1163,1163,1163}, {0,0,0,0,0,0,0,0}},\r\n{0, {1164,1164,1164,1164,1164,1164,1164,1164}, {0,0,0,0,0,0,0,0}},\r\n{0, {1165,1165,1165,1165,1165,1165,1165,1165}, {0,0,0,0,0,0,0,0}},\r\n{0, {994,994,994,994,994,994,994,994}, {0,0,0,0,0,0,0,0}},\r\n{0, {995,995,995,995,995,995,995,995}, {0,0,0,0,0,0,0,0}},\r\n{0, {986,986,986,986,986,986,986,986}, {0,0,0,0,0,0,0,0}},\r\n{0, {987,987,987,987,987,987,987,987}, {0,0,0,0,0,0,0,0}},\r\n{0, {988,988,988,988,988,988,988,988}, {0,0,0,0,0,0,0,0}},\r\n{0, {1136,1136,1136,1136,1136,1136,1136,1136}, {0,0,0,0,0,0,0,0}},\r\n{0, {1137,1137,1137,1137,1137,1137,1137,1137}, {0,0,0,0,0,0,0,0}},\r\n{0, {1138,1138,1138,1138,1138,1138,1138,1138}, {0,0,0,0,0,0,0,0}},\r\n{0, {1139,1139,1139,1139,1139,1139,1139,1139}, {0,0,0,0,0,0,0,0}},\r\n{0, {1140,1140,1140,1140,1140,1140,1140,1140}, {0,0,0,0,0,0,0,0}},\r\n{0, {1141,1141,1141,1141,1141,1141,1141,1141}, {0,0,0,0,0,0,0,0}},\r\n{0, {1142,1142,1142,1142,1142,1142,1142,1142}, {0,0,0,0,0,0,0,0}},\r\n{0, {1143,1143,1143,1143,1143,1143,1143,1143}, {0,0,0,0,0,0,0,0}},\r\n{0, {1144,1144,1144,1144,1144,1144,1144,1144}, {0,0,0,0,0,0,0,0}},\r\n{0, {1145,1145,1145,1145,1145,1145,1145,1145}, {0,0,0,0,0,0,0,0}},\r\n{0, {1146,1146,1146,1146,1146,1146,1146,1146}, {0,0,0,0,0,0,0,0}},\r\n{0, {1147,1147,1147,1147,1147,1147,1147,1147}, {0,0,0,0,0,0,0,0}},\r\n{0, {1025,1025,1025,1025,1025,1025,1025,1025}, {0,0,0,0,0,0,0,0}},\r\n{0, {1026,1026,1026,1026,1026,1026,1026,1026}, {0,0,0,0,0,0,0,0}},\r\n{0, {1027,1027,1027,1027,1027,1027,1027,1027}, {0,0,0,0,0,0,0,0}},\r\n{0, {1094,1094,1094,1094,1094,1094,1094,1094}, {0,0,0,0,0,0,0,0}},\r\n{0, {1095,1095,1095,1095,1095,1095,1095,1095}, {0,0,0,0,0,0,0,0}},\r\n{0, {1098,1098,1098,1098,1098,1098,1098,1098}, {0,0,0,0,0,0,0,0}},\r\n{0, {1099,1099,1099,1099,1099,1099,1099,1099}, {0,0,0,0,0,0,0,0}},\r\n{0, {1167,1167,1167,1167,1167,1167,1167,1167}, {0,0,0,0,0,0,0,0}},\r\n{0, {1034,1034,1034,1034,1034,1034,1034,1034}, {0,0,0,0,0,0,0,0}},\r\n{0, {1035,1035,1035,1035,1035,1035,1035,1035}, {0,0,0,0,0,0,0,0}},\r\n{0, {1036,1036,1036,1036,1036,1036,1036,1036}, {0,0,0,0,0,0,0,0}},\r\n{0, {1037,1037,1037,1037,1037,1037,1037,1037}, {0,0,0,0,0,0,0,0}},\r\n{0, {1038,1038,1038,1038,1038,1038,1038,1038}, {0,0,0,0,0,0,0,0}},\r\n{0, {1039,1039,1039,1039,1039,1039,1039,1039}, {0,0,0,0,0,0,0,0}},\r\n{0, {1090,1090,1090,1090,1090,1090,1090,1090}, {0,0,0,0,0,0,0,0}},\r\n{0, {1091,1091,1091,1091,1091,1091,1091,1091}, {0,0,0,0,0,0,0,0}},\r\n{0, {979,979,979,979,979,979,979,979}, {0,0,0,0,0,0,0,0}}\r\n};\r\n\r\nspritedef_t sprites[] = {//80066A28\r\n{21, &spriteframes[0]},\r\n{4, &spriteframes[21]},\r\n{4, &spriteframes[25]},\r\n{5, &spriteframes[29]},\r\n{1, &spriteframes[34]},\r\n{2, &spriteframes[35]},\r\n{10, &spriteframes[37]},\r\n{2, &spriteframes[47]},\r\n{2, &spriteframes[49]},\r\n{2, &spriteframes[51]},\r\n{4, &spriteframes[53]},\r\n{4, &spriteframes[57]},\r\n{2, &spriteframes[61]},\r\n{2, &spriteframes[63]},\r\n{3, &spriteframes[65]},\r\n{2, &spriteframes[68]},\r\n{3, &spriteframes[70]},\r\n{4, &spriteframes[73]},\r\n{5, &spriteframes[77]},\r\n{5, &spriteframes[82]},\r\n{5, &spriteframes[87]},\r\n{2, &spriteframes[92]},\r\n{5, &spriteframes[94]},\r\n{4, &spriteframes[99]},\r\n{2, &spriteframes[103]},\r\n{6, &spriteframes[105]},\r\n{4, &spriteframes[111]},\r\n{10, &spriteframes[115]},\r\n{5, &spriteframes[125]},\r\n{23, &spriteframes[130]},\r\n{21, &spriteframes[153]},\r\n{21, &spriteframes[174]},\r\n{2, &spriteframes[195]},\r\n{3, &spriteframes[197]},\r\n{17, &spriteframes[200]},\r\n{2, &spriteframes[217]},\r\n{20, &spriteframes[219]},\r\n{20, &spriteframes[239]},\r\n{14, &spriteframes[259]},\r\n{12, &spriteframes[273]},\r\n{15, &spriteframes[285]},\r\n{15, &spriteframes[300]},\r\n{11, &spriteframes[315]},\r\n{19, &spriteframes[326]},\r\n{16, &spriteframes[345]},\r\n{2, &spriteframes[361]},\r\n{5, &spriteframes[363]},\r\n{16, &spriteframes[368]},\r\n{13, &spriteframes[384]},\r\n{2, &spriteframes[397]},\r\n{2, &spriteframes[399]},\r\n{2, &spriteframes[401]},\r\n{5, &spriteframes[403]},\r\n{3, &spriteframes[408]},\r\n{4, &spriteframes[411]},\r\n{4, &spriteframes[415]},\r\n{2, &spriteframes[419]},\r\n{2, &spriteframes[421]},\r\n{2, &spriteframes[423]},\r\n{2, &spriteframes[425]},\r\n{2, &spriteframes[427]},\r\n{2, &spriteframes[429]},\r\n{1, &spriteframes[431]},\r\n{1, &spriteframes[432]},\r\n{4, &spriteframes[433]},\r\n{4, &spriteframes[437]},\r\n{1, &spriteframes[441]},\r\n{4, &spriteframes[442]},\r\n{4, &spriteframes[446]},\r\n{1, &spriteframes[450]},\r\n{4, &spriteframes[451]},\r\n{2, &spriteframes[455]},\r\n{1, &spriteframes[457]},\r\n{1, &spriteframes[458]},\r\n{1, &spriteframes[459]},\r\n{1, &spriteframes[460]},\r\n{1, &spriteframes[461]},\r\n{1, &spriteframes[462]},\r\n{1, &spriteframes[463]},\r\n{1, &spriteframes[464]},\r\n{1, &spriteframes[465]},\r\n{1, &spriteframes[466]},\r\n{1, &spriteframes[467]},\r\n{1, &spriteframes[468]},\r\n{1, &spriteframes[469]},\r\n{1, &spriteframes[470]},\r\n{1, &spriteframes[471]},\r\n{1, &spriteframes[472]},\r\n{1, &spriteframes[473]},\r\n{1, &spriteframes[474]},\r\n{1, &spriteframes[475]},\r\n{1, &spriteframes[476]},\r\n{1, &spriteframes[477]},\r\n{1, &spriteframes[478]},\r\n{1, &spriteframes[479]},\r\n{1, &spriteframes[480]},\r\n{1, &spriteframes[481]},\r\n{1, &spriteframes[482]},\r\n{1, &spriteframes[483]},\r\n{1, &spriteframes[484]},\r\n{1, &spriteframes[485]},\r\n{1, &spriteframes[486]},\r\n{1, &spriteframes[487]},\r\n{1, &spriteframes[488]},\r\n{1, &spriteframes[489]},\r\n{1, &spriteframes[490]},\r\n{1, &spriteframes[491]},\r\n{1, &spriteframes[492]},\r\n{3, &spriteframes[493]},\r\n{4, &spriteframes[496]},\r\n{4, &spriteframes[500]},\r\n{4, &spriteframes[504]},\r\n{1, &spriteframes[508]},\r\n{1, &spriteframes[509]},\r\n{1, &spriteframes[510]},\r\n{1, &spriteframes[511]},\r\n{1, &spriteframes[512]},\r\n{1, &spriteframes[513]},\r\n{1, &spriteframes[514]},\r\n{1, &spriteframes[515]},\r\n{1, &spriteframes[516]},\r\n{4, &spriteframes[517]},\r\n{4, &spriteframes[521]},\r\n{2, &spriteframes[525]},\r\n{3, &spriteframes[527]},\r\n{4, &spriteframes[530]},\r\n{4, &spriteframes[534]},\r\n{4, &spriteframes[538]},\r\n{3, &spriteframes[542]},\r\n{2, &spriteframes[545]},\r\n{2, &spriteframes[547]},\r\n{1, &spriteframes[549]},\r\n{1, &spriteframes[550]},\r\n{1, &spriteframes[551]},\r\n{1, &spriteframes[552]},\r\n{1, &spriteframes[553]},\r\n{1, &spriteframes[554]},\r\n{1, &spriteframes[555]},\r\n{1, &spriteframes[556]},\r\n{1, &spriteframes[557]},\r\n{1, &spriteframes[558]}\r\n};\n"
  },
  {
    "path": "PSXDOOM/st_main.c",
    "content": "/* st_main.c -- status bar */\r\n\r\n#include \"doomdef.h\"\r\n#include \"st_main.h\"\r\n#include \"r_local.h\"\r\n\r\nstbar_t\tstbar; //800984F4\r\npsxobj_t statuspic;//0x800a92cc\r\n\r\nint     weaponowned[NUMWEAPONS] = {0, 1, 2, 3, 4, 5, 6, 7, 0};  //80073ebc\r\nshort\tmicronums_x[NUMMICROS] = { 199, 212, 225, 238, 199, 212, 225, 238 };//80073ee0\r\nshort\tmicronums_y[NUMMICROS] = { 204, 204, 204, 204, 216, 216, 216, 216 };//80073ef0\r\nshort\tcard_y[NUMCARDS] = { 204, 212, 220, 204, 212, 220 };//80073f00\r\n\r\nsbflash_t\tflashCards[NUMCARDS];\t/* INFO FOR FLASHING CARDS & SKULLS */  //800a9298\r\n\r\nboolean facedraw;           //uGp00000b48\r\nint\t\tfacetics;           //uGp00000b4c\r\nint\t\tnewface;            //uGp00000a40\r\nboolean\tgibdraw;            //uGp00000a74\r\nboolean doSpclFace;         //uGp000008e8\r\nspclface_e\tspclFaceType;   //sGp00000924\r\nfacedata_t *facegraphic;    //0x80078054|puGp00000c44\r\n\r\nfacedata_t facedata[NUMFACES] = //0x80073c98\r\n{\r\n\t{ 118, 202,   0,  41, 19, 29 }, // STFST01  - 0\r\n\t{ 118, 202,  20,  41, 19, 29 }, // STFST02  - 1\r\n\t{ 118, 202, 234, 137, 19, 29 }, // STFST00  - 2\r\n\t{ 118, 202,  40,  41, 21, 31 }, // STFTL00  - 3\r\n\t{ 118, 202,  62,  41, 21, 31 }, // STFTR00  - 4\r\n\t{ 118, 202,  84,  41, 19, 31 }, // STFOUCH0 - 5\r\n\t{ 118, 202, 104,  41, 19, 31 }, // STFEVL0  - 6 (EVILFACE)\r\n\t{ 118, 202, 124,  41, 19, 31 }, // STFKILL0 - 7\r\n\t{ 118, 202, 144,  41, 19, 31 }, // STFST11  - 8\r\n\t{ 118, 202, 164,  41, 19, 31 }, // STFST10  - 9\r\n\t{ 118, 202, 184,  41, 19, 31 }, // STFST12  - 10\r\n\t{ 118, 202, 204,  41, 20, 31 }, // STFTL10  - 11\r\n\t{ 118, 202, 226,  41, 21, 31 }, // STFTR10  - 12\r\n\t{ 118, 202,   0,  73, 19, 31 }, // STFOUCH1 - 13\r\n\t{ 118, 202,  20,  73, 19, 31 }, // STFEVL1  - 14\r\n\t{ 118, 202,  40,  73, 19, 31 }, // STFKILL1 - 15\r\n\t{ 118, 202,  60,  73, 19, 31 }, // STFST21  - 16\r\n\t{ 118, 202,  80,  73, 19, 31 }, // STFST20  - 17\r\n\t{ 118, 202, 100,  73, 19, 31 }, // STFST22  - 18\r\n\t{ 118, 202, 120,  73, 22, 31 }, // STFTL20  - 19\r\n\t{ 118, 202, 142,  73, 22, 31 }, // STFTR20  - 20\r\n\t{ 118, 202, 166,  73, 19, 31 }, // STFOUCH2 - 21\r\n\t{ 118, 202, 186,  73, 19, 31 }, // STFEVL2  - 22\r\n\t{ 118, 202, 206,  73, 19, 31 }, // STFKILL2 - 23\r\n\t{ 118, 202, 226,  73, 19, 31 }, // STFST31  - 24\r\n\t{ 118, 202,   0, 105, 19, 31 }, // STFST30  - 25\r\n\t{ 118, 202,  20, 105, 19, 31 }, // STFST32  - 26\r\n\t{ 118, 202,  40, 105, 23, 31 }, // STFTL30  - 27\r\n\t{ 118, 202,  64, 105, 23, 31 }, // STFTR30  - 28\r\n\t{ 118, 202,  88, 105, 19, 31 }, // STFOUCH3 - 29\r\n\t{ 118, 202, 108, 105, 19, 31 }, // STFEVL3  - 30\r\n\t{ 118, 202, 128, 105, 19, 31 }, // STFKILL3 - 31\r\n\t{ 118, 202, 148, 105, 19, 31 }, // STFST41  - 32\r\n\t{ 118, 202, 168, 105, 19, 31 }, // STFST40  - 33\r\n\t{ 118, 202, 188, 105, 19, 31 }, // STFST42  - 34\r\n\t{ 118, 202, 208, 105, 24, 31 }, // STFTL40  - 35\r\n\t{ 118, 202, 232, 105, 23, 31 }, // STFTR40  - 36\r\n\t{ 118, 202,   0, 137, 18, 31 }, // STFOUCH4 - 37\r\n\t{ 118, 202,  20, 137, 19, 31 }, // STFEVL4  - 38\r\n\t{ 118, 202,  40, 137, 19, 31 }, // STFKILL4 - 39\r\n\t{ 118, 202,  60, 137, 19, 31 }, // STFGOD0  - 40 (GODFACE)\r\n\t{ 118, 202,  80, 137, 19, 31 }, // STFDEAD0 - 41 (DEADFACE)\r\n\t{ 118, 202, 100, 137, 19, 30 }, // STSPLAT0 - 42 (FIRSTSPLAT)\r\n\t{ 114, 201, 120, 137, 27, 30 }, // STSPLAT1 - 43\r\n\t{ 114, 204, 148, 137, 28, 30 }, // STSPLAT2 - 44\r\n\t{ 114, 204, 176, 137, 28, 30 }, // STSPLAT3 - 45\r\n\t{ 114, 204, 204, 137, 28, 30 }  // STSPLAT4 - 46\r\n};\r\n\r\nsymboldata_t symboldata[] = // 80073db4\r\n{\r\n\t{   0, 195,  11,  16 }, // 0 - 0\r\n\t{  12, 195,  11,  16 }, // 1 - 1\r\n\t{  24, 195,  11,  16 }, // 2 - 2\r\n\t{  36, 195,  11,  16 }, // 3 - 3\r\n\t{  48, 195,  11,  16 }, // 4 - 4\r\n\t{  60, 195,  11,  16 }, // 5 - 5\r\n\t{  72, 195,  11,  16 }, // 6 - 6\r\n\t{  84, 195,  11,  16 }, // 7 - 7\r\n\t{  96, 195,  11,  16 }, // 8 - 8\r\n\t{ 108, 195,  11,  16 }, // 9 - 9\r\n\t{ 232, 195,  11,  16 }, // - - 10\r\n\t{ 120, 195,  11,  15 }, // % - 11\r\n\t{   0, 211,   7,  16 }, // ! - 12\r\n\t{   8, 211,   7,  16 }, // . - 13\r\n\t{  16, 211,  15,  16 }, // A - 14\r\n\t{  32, 211,  13,  16 }, // B - 15\r\n\t{  46, 211,  12,  16 }, // C - 16\r\n\t{  60, 211,  13,  16 }, // D - 17\r\n\t{  74, 211,  13,  16 }, // E - 18\r\n\t{  88, 211,  13,  16 }, // F - 19\r\n\t{ 102, 211,  13,  16 }, // G - 20\r\n\t{ 116, 211,  13,  16 }, // H - 21\r\n\t{ 130, 211,   6,  16 }, // I - 22\r\n\t{ 136, 211,  12,  16 }, // J - 23\r\n\t{ 148, 211,  14,  16 }, // K - 24\r\n\t{ 162, 211,  13,  16 }, // L - 25\r\n\t{ 176, 211,  15,  16 }, // M - 26\r\n\t{ 192, 211,  15,  16 }, // N - 27\r\n\t{ 208, 211,  13,  16 }, // O - 28\r\n\t{ 222, 211,  13,  16 }, // P - 29\r\n\t{ 236, 211,  13,  16 }, // Q - 30\r\n\t{   0, 227,  13,  16 }, // R - 31\r\n\t{  14, 227,  13,  16 }, // S - 32\r\n\t{  28, 227,  14,  16 }, // T - 33\r\n\t{  42, 227,  13,  16 }, // U - 34\r\n\t{  56, 227,  15,  16 }, // V - 35\r\n\t{  72, 227,  15,  16 }, // W - 36\r\n\t{  88, 227,  15,  16 }, // X - 37\r\n\t{ 104, 227,  13,  16 }, // Y - 38\r\n\t{ 118, 227,  13,  16 }, // Z - 39\r\n\t{ 132, 230,  13,  13 }, // a - 40\r\n\t{ 146, 230,  12,  13 }, // b - 41\r\n\t{ 158, 230,  11,  13 }, // c - 42\r\n\t{ 170, 230,  11,  13 }, // d - 43\r\n\t{ 182, 230,  10,  13 }, // e - 44\r\n\t{ 192, 230,  11,  13 }, // f - 45\r\n\t{ 204, 230,  11,  13 }, // g - 46\r\n\t{ 216, 230,  12,  13 }, // h - 47\r\n\t{ 228, 230,   5,  13 }, // i - 48\r\n\t{ 234, 230,  10,  13 }, // j - 49\r\n\t{   0, 243,  12,  13 }, // k - 50\r\n\t{  12, 243,   9,  13 }, // l - 51\r\n\t{  22, 243,  13,  13 }, // m - 52\r\n\t{  36, 243,  13,  13 }, // n - 53\r\n\t{  50, 243,  11,  13 }, // o - 54\r\n\t{  62, 243,  11,  13 }, // p - 55\r\n\t{  74, 243,  11,  13 }, // q - 56\r\n\t{  86, 243,  11,  13 }, // r - 57\r\n\t{  98, 243,  12,  13 }, // s - 58\r\n\t{ 112, 243,  11,  13 }, // t - 59\r\n\t{ 124, 243,  11,  13 }, // u - 60\r\n\t{ 136, 243,  13,  13 }, // v - 61\r\n\t{ 150, 243,  13,  13 }, // w - 62\r\n\t{ 164, 243,  13,  13 }, // x - 63\r\n\t{ 178, 243,  13,  13 }, // y - 64\r\n\t{ 192, 243,  13,  13 }  // z - 65\r\n};\r\n\r\n/*\r\n====================\r\n=\r\n= ST_Init\r\n=\r\n= Locate and load all needed graphics\r\n====================\r\n*/\r\n\r\nvoid ST_Init (void)//L800382D4()\r\n{\r\n    if (PageCount != 0)\r\n\t\tI_Error(\"ST_Init: initial texture cache foulup\\n\");\r\n\r\n\tImageToVram(&statuspic, \"STATUS\", 0);\r\n\r\n\tif (PageCount != 0)\r\n\t\tI_Error(\"ST_Init: final texture cache foulup\\n\");\r\n\r\n\txcount = 0;\r\n\tycount = 0;\r\n\tPageCount = 1;\r\n\txycount = 0;\r\n\tV_PagFlags |= 1;// vram page pos\r\n\r\n\tZ_FreeTags(mainzone, PU_CACHE);\r\n\r\n\t//printf(\"ST_Init: DONE\\n\");\r\n}\r\n\r\n/*================================================== */\r\n/* */\r\n/*  Init this stuff EVERY LEVEL */\r\n/* */\r\n/*================================================== */\r\nvoid ST_InitEveryLevel(void)//L8003838C()\r\n{\r\n\tint\t\ti;\r\n\r\n\tstbar.gotgibbed = false;\r\n\tstbar.specialFace = f_none;\r\n\tstbar.messagedelay = 0;\r\n\r\n\tfor (i = 0; i < NUMCARDS; i++)\r\n\t{\r\n\t\tstbar.tryopen[i] = false;\r\n\t\tflashCards[i].active = false;\r\n\t}\r\n\r\n\tdoSpclFace = false;\r\n\tgibdraw = false;\t/* DON'T DRAW GIBBED HEAD SEQUENCE */\r\n\r\n\t/* force everything to be updated on next ST_Update */\r\n\tfacedraw = true;\r\n\tfacetics = 0;\r\n\tfacegraphic = &facedata[0];\r\n}\r\n\r\n\r\n/*\r\n====================\r\n=\r\n= ST_Ticker\r\n=\r\n====================\r\n*/\r\n\r\nvoid ST_Ticker (void)//L80038404()\r\n{\r\n\tplayer_t    *player;\r\n\tint\t\t    ind, base;\r\n\r\n\tplayer = &players[consoleplayer];\r\n\r\n\t/* */\r\n\t/* Animate face */\r\n\t/* */\r\n\tif (--facetics <= 0)\r\n\t{\r\n\t\tfacetics = M_Random() & 15;\r\n\t\tnewface = M_Random() & 3;\r\n\t\tif (newface == 3)\r\n\t\t\tnewface = 1;\r\n\t\tdoSpclFace = false;\r\n\t}\r\n\r\n\t/* */\r\n\t/* Draw special face? */\r\n\t/* */\r\n\tif (stbar.specialFace)\r\n\t{\r\n\t\tdoSpclFace = true;\r\n\t\tspclFaceType = stbar.specialFace;\r\n\t\tfacetics = TICRATE;\r\n\t\tstbar.specialFace = f_none;\r\n\t}\r\n\r\n\t/* */\r\n\t/* Did we get gibbed? */\r\n\t/* */\r\n\tif (stbar.gotgibbed)\r\n\t{\r\n        stbar.gibdelay = GIBTIME;\r\n        stbar.gibframe = 0;\r\n        stbar.gotgibbed = false;\r\n        gibdraw = true;\r\n\t}\r\n\r\n\t/* */\r\n\t/* Animate gibbed face */\r\n\t/* */\r\n    if (gibdraw && (--stbar.gibdelay <= 0))\r\n    {\r\n        stbar.gibdelay = GIBTIME;\r\n        stbar.gibframe += 1;\r\n        if (stbar.gibframe >= 5)\r\n        {\r\n            gibdraw = false;\r\n            facedraw = false;\r\n        }\r\n    }\r\n\r\n\t/* */\r\n\t/* Message initialization */\r\n\t/* */\r\n    if (player->message)\r\n    {\r\n        stbar.message = player->message;\r\n        stbar.messagedelay = 75;\r\n        player->message = NULL;\r\n    }\r\n\r\n    /* */\r\n\t/* Countdown time for the message */\r\n\t/* */\r\n    if (stbar.messagedelay)\r\n        stbar.messagedelay--;\r\n\r\n\t/* */\r\n\t/* Tried to open a CARD or SKULL door? */\r\n\t/* */\r\n\tfor (ind = 0; ind < NUMCARDS; ind++)\r\n\t{\r\n\t\t/* CHECK FOR INITIALIZATION */\r\n\t\tif (stbar.tryopen[ind])\r\n\t\t{\r\n\t\t\tstbar.tryopen[ind] = false;\r\n\t\t\tflashCards[ind].active = true;\r\n\t\t\tflashCards[ind].delay = FLASHDELAY;\r\n\t\t\tflashCards[ind].times = FLASHTIMES+1;\r\n\t\t\tflashCards[ind].doDraw = false;\r\n\t\t}\r\n\t\t/* MIGHT AS WELL DO TICKING IN THE SAME LOOP! */\r\n\t\telse if (flashCards[ind].active && !--flashCards[ind].delay)\r\n\t\t{\r\n\t\t\tflashCards[ind].delay = FLASHDELAY;\r\n\t\t\tflashCards[ind].doDraw ^= 1;\r\n\t\t\tif (!--flashCards[ind].times)\r\n\t\t\t\tflashCards[ind].active = false;\r\n\t\t\tif (flashCards[ind].doDraw && flashCards[ind].active)\r\n\t\t\t\tS_StartSound(NULL,sfx_itemup);\r\n\t\t}\r\n\t}\r\n\r\n\t/* */\r\n\t/* God mode cheat */\r\n\t/* */\r\n\tif ((player->cheats & CF_GODMODE) || player->powers[pw_invulnerability])\r\n\t{\r\n\t\tstbar.face = GODFACE;\r\n\t}\r\n\telse\r\n\t{\r\n\t    /* */\r\n\t    /* Draw gibbed head */\r\n\t    /* */\r\n\t\tif (gibdraw)\r\n\t\t{\r\n\t\t\tstbar.face = stbar.gibframe + FIRSTSPLAT;\r\n\t\t}\r\n\t\t/* */\r\n        /* face change */\r\n        /* */\r\n\t\telse\r\n\t\t{\r\n\t\t\tif (player->health)\r\n\t\t\t{\r\n\t\t\t\tif (doSpclFace)\r\n\t\t\t\t{\r\n\t\t\t\t\tbase = player->health / 20;\r\n\t\t\t\t\tbase = (base < 4) ? (4 - base) * 8 : 0;\r\n\t\t\t\t\tstbar.face = spclFaceType + base;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tbase = player->health / 20;\r\n\t\t\t\t\tbase = (base < 4) ? (4 - base) * 8 : 0;\r\n\t\t\t\t\tstbar.face = newface + base;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tstbar.face = DEADFACE;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfacegraphic = &facedata[stbar.face];\r\n\r\n\t/* */\r\n\t/* Do red-/gold-shifts from damage/items */\r\n\t/* */\r\n\tST_doPaletteStuff();\r\n}\r\n\r\n\r\n/*\r\n====================\r\n=\r\n= ST_Drawer\r\n=\r\n====================\r\n*/\r\nextern char mapnames[][32];\r\n\r\n#if SHOWFPS == 1\r\nextern int fps;\r\n#endif // _SHOWFPS\r\n\r\nvoid ST_Drawer (void)//L80038888();\r\n{\r\n\tchar\t\ttext[64];\r\n\tplayer_t\t*player;\r\n\tweapontype_t weapon;\r\n\tint ammo, ind, xpos, ypos;\r\n\r\n\tDR_MODE *drawmode = (DR_MODE*) getScratchAddr(128);//1F800200\r\n\tSPRT    *sprtstat = (SPRT*) getScratchAddr(128);//1F800200\r\n\r\n\tplayer = &players[consoleplayer];\r\n\r\n\tSetDrawMode(drawmode, 0, 0, statuspic.vtpage, NULL);\r\n\tW_AddPrim(drawmode);// add to order table\r\n\r\n\t/* */\r\n\t/* make sprite status */\r\n\t/* */\r\n\tsetSprt(sprtstat);\r\n\tsetShadeTex(sprtstat, 1);\r\n\tsprtstat->clut = palette[16];\r\n\r\n\t/* */\r\n\t/* Draw Text Message */\r\n\t/* */\r\n\tif (stbar.messagedelay > 0)\r\n\t{\r\n\t    \t//In Psx Doom Greatest Hits and Final Doom, the value of position X was changed to 7\r\n\t    \t#if GH_UPDATES == 1\r\n\t\tST_DrawMessage(7, 193, stbar.message);\r\n\t\t#else\r\n\t\tST_DrawMessage(2, 193, stbar.message);\r\n\t\t#endif // GH_UPDATES\r\n\t}\r\n\telse if (player->automapflags & AF_ACTIVE)\r\n\t{\r\n\t\t/* */\r\n\t\t/* Draw Map Name Message */\r\n\t\t/* */\r\n\t\tsprintf(text, \"LEVEL %d:%s\", gamemap, mapnames[gamemap-1]);\r\n\t\t//In Psx Doom Greatest Hits and Final Doom, the value of position X was changed to 7\r\n\t   \t #if GH_UPDATES == 1\r\n\t\tST_DrawMessage(7, 193, text);\r\n\t\t#else\r\n\t\tST_DrawMessage(2, 193, text);\r\n\t\t#endif // GH_UPDATES\r\n\t}\r\n\r\n\t/* */\r\n\t/* Draw StatusBar Graphic */\r\n\t/* */\r\n\tsetXY0(sprtstat, 0, 200);\r\n\tsetUV0(sprtstat, 0, 0);\r\n\tsetWH(sprtstat, 256, 40);\r\n\tW_AddPrim(sprtstat);// add to order table\r\n\r\n\tweapon = player->pendingweapon;\r\n\r\n\tif (weapon == wp_nochange)\r\n\t\tweapon = player->readyweapon;\r\n\r\n\tif (weaponinfo[weapon].ammo == am_noammo)\r\n\t\tammo = 0;\r\n\telse\r\n\t\tammo = player->ammo[weaponinfo[weapon].ammo];\r\n\r\n\t/* */\r\n\t/* Ammo */\r\n\t/* */\r\n\tST_DrawValue(28, 204, ammo);\r\n\r\n\t/* */\r\n\t/* Health */\r\n\t/* */\r\n\tST_DrawValue(71, 204, player->health);\r\n\r\n\t/* */\r\n\t/* Armor */\r\n\t/* */\r\n\tST_DrawValue(168, 204, player->armorpoints);\r\n\r\n\t/* */\r\n\t/* Cards & skulls */\r\n\t/* */\r\n\txpos = 114;\r\n\typos = 184;\r\n\tfor (ind = 0; ind < NUMCARDS; ind++)\r\n\t{\r\n        if (player->cards[ind] || (flashCards[ind].active && flashCards[ind].doDraw))\r\n        {\r\n            /* */\r\n            /* Draw Keys Graphics */\r\n            /* */\r\n            setXY0(sprtstat, 100, card_y[ind]);\r\n            setUV0(sprtstat, xpos, ypos);\r\n            setWH(sprtstat, 11, 8);\r\n            W_AddPrim(sprtstat);// add to order table\r\n        }\r\n\t\txpos += 11;\r\n\t}\r\n\r\n\t/* */\r\n\t/* Weapons & level */\r\n\t/* */\r\n\tif (netgame != gt_deathmatch)\r\n\t{\r\n\t    /* */\r\n\t\t/* Number Box Graphic */\r\n\t\t/* */\r\n\t\tsetXY0(sprtstat, 200, 205);\r\n\t\tsetUV0(sprtstat, 180, 184);\r\n\t\tsetWH(sprtstat, 51, 23);\r\n\t\tW_AddPrim(sprtstat);// add to order table\r\n\r\n\t\t/* */\r\n\t\t/* Numbers Graphic */\r\n\t\t/* */\r\n\t\txpos = 232;\r\n\t\typos = 184;\r\n\t\tfor (ind = wp_shotgun; ind < NUMMICROS; ind++)\r\n\t\t{\r\n\t\t\tif (player->weaponowned[ind])\r\n\t\t\t{\r\n\t\t\t\tsetXY0(sprtstat, micronums_x[ind] + 5, micronums_y[ind] + 3);\r\n\t\t\t\tsetUV0(sprtstat, xpos, ypos);\r\n\t\t\t\tsetWH(sprtstat, 4, 6);\r\n\t\t\t\tW_AddPrim(sprtstat);// add to order table\r\n\t\t\t}\r\n\t\t\txpos += 4;\r\n\t\t}\r\n\r\n\t\t/* */\r\n\t\t/* White Selector Box Graphic */\r\n\t\t/* */\r\n\t\tsetXY0(sprtstat, micronums_x[weaponowned[weapon]], micronums_y[weaponowned[weapon]]);\r\n\t\tsetUV0(sprtstat, 164, 192);\r\n\t\tsetWH(sprtstat, 12, 12);\r\n\t\tW_AddPrim(sprtstat);// add to order table\r\n\t}\r\n\t/* */\r\n\t/* Or, frag counts! */\r\n\t/* */\r\n\telse\r\n\t{\r\n\t    /* */\r\n\t\t/* Frags Graphic */\r\n\t\t/* */\r\n\t\tsetXY0(sprtstat, 209, 221);\r\n\t\tsetUV0(sprtstat, 208, 243);\r\n\t\tsetWH(sprtstat, 33, 8);\r\n\t\tW_AddPrim(sprtstat);// add to order table\r\n\r\n\t\t/* */\r\n\t\t/* Frag Count */\r\n\t\t/* */\r\n\t\tST_DrawValue(225, 204, player->frags);\r\n\t}\r\n\r\n\t/* */\r\n\t/* face change */\r\n\t/* */\r\n\tif (facedraw)\r\n\t{\r\n\t    /* */\r\n\t\t/* Face Graphic */\r\n\t\t/* */\r\n\t\tsetXY0(sprtstat, facegraphic->xpos, facegraphic->ypos);\r\n\t\tsetUV0(sprtstat, facegraphic->x, facegraphic->y);\r\n\t\tsetWH(sprtstat, facegraphic->w, facegraphic->h);\r\n\t\tW_AddPrim(sprtstat);// add to order table\r\n\t}\r\n\r\n\t/* */\r\n\t/* Drawing cheat \"Warp To Level and Vram_Viewer\" */\r\n\t/* */\r\n\tif (gamepaused)\r\n\t\tST_CheatDraw();\r\n\r\n\r\n    #if SHOWFPS == 1\r\n    fps = (60-((fps)/60));\r\n    fps = fps > 0? fps:0;\r\n    D_DebugSetPrintPos(10, 10);\r\n    D_DebugPrint(\"fps %d\", fps);\r\n    #endif // SHOWFPS\r\n}\r\n\r\n\r\nvoid ST_DrawValue(int x, int y, int value)//L8003A144()\r\n{\r\n\tint index, i;\r\n\tunsigned char number[16];\r\n\tboolean minus;\r\n\tint xpos;\r\n\tSPRT    *sprtstat = (SPRT*) getScratchAddr(128);//1F800200\r\n\r\n\tminus = false;\r\n\r\n\tif (value < 0)\r\n\t{\r\n\t\tminus = true;\r\n\t\tvalue = -value;// absolute value\r\n\t}\r\n\r\n\tfor (index = 0; index < 16; index++)\r\n\t{\r\n\t\tnumber[index] = value % 10;\r\n\t\tvalue /= 10;\r\n\t\tif (!value) break;\r\n\t}\r\n\r\n\tsetWH(sprtstat, 11, 16);\r\n\r\n\txpos = x;\r\n\tfor (i = 0; i <= index; i++)\r\n\t{\r\n\t\tsetXY0(sprtstat, xpos, y);\r\n\t\tsetUV0(sprtstat, symboldata[number[i]].x, 195);\r\n\t\tW_AddPrim(sprtstat);// add to order table\r\n\t\txpos -= 11;\r\n\t}\r\n\r\n\tif (minus)\r\n\t{\r\n\t\tsetXY0(sprtstat, xpos, y);\r\n\t\tsetUV0(sprtstat, symboldata[10].x, 195);\r\n\t\tW_AddPrim(sprtstat);// add to order table\r\n\t}\r\n}\r\n\r\nvoid ST_DrawMessage(int x, int y, char *text)//L8003A750()\r\n{\r\n\tunsigned int c,cc;\r\n\tunsigned int vx, vy, xpos;\r\n\tSPRT    *sprtstat = (SPRT*) getScratchAddr(128);//1F800200\r\n\r\n\tsetWH(sprtstat, 8, 8);\r\n\r\n\twhile (*text != 0)\r\n\t{\r\n\t\tc = *text;\r\n\r\n\t\tif ((byte)(c - 'a') < 26) { c -= 32; }\r\n\r\n\t\tcc = c - 33;\r\n\t\tif (cc < '@')\r\n\t\t{\r\n\t\t\tvy = cc;\r\n\t\t\tif (cc < 0) { vy = cc - 2; }\r\n\r\n\t\t\tvx = cc << 3;\r\n\t\t\tvy = ((vy >> 5) << 3) + 168;\r\n\r\n\t\t\tsetXY0(sprtstat, x, y);\r\n\t\t\tsetUV0(sprtstat, vx, vy);\r\n\t\t\tW_AddPrim(sprtstat);// add to order table\r\n\t\t}\r\n\r\n\t\ttext++;\r\n\t\tx += 8;\r\n\t}\r\n}\r\n\r\nextern int \twarpmap;        //80078094, iGp00000c84\r\nextern int  Vram_page;      //80077D00, iGp000008f0\r\n\r\nvoid ST_CheatDraw(void)//L8003AA80()\r\n{\r\n\tchar\t\ttext[64];\r\n\tplayer_t\t*p;\r\n\tPOLY_F4     *backgroud = (POLY_F4*) getScratchAddr(128);//1F800200\r\n\r\n\tp = &players[consoleplayer];\r\n\r\n\t//Draw Pause Graphic\r\n\tif (!(p->cheats & CF_PAUSE) )\r\n\t{\r\n\t\tDrawStaticImage(&pausepic, 107, 108, palette[0]);\r\n\t}\r\n\r\n\tif (p->cheats & CF_WARPLEVEL)\r\n\t{\r\n\t\tsprintf(text, \"warp to level %d\", warpmap);\r\n\t\tST_DrawText(-1, 40, text);\r\n\t\tST_DrawText(-1, 60, mapnames[warpmap-1]);\r\n\t}\r\n\telse if (p->cheats & CF_VRAMVIEWER)\r\n\t{\r\n\t\t//Black Background for Vram_Viewer\r\n\t\tsetPolyF4(backgroud);\r\n\t\tsetRGB0(backgroud, 0, 0, 0);\r\n\t\tsetXY4(backgroud, 0, 0, 256, 0, 0, 240, 256, 240);\r\n\t\tW_AddPrim(backgroud);// add to order table\r\n\r\n\t\tVram_Viewer(Vram_page);\r\n\t}\r\n}\r\n\r\n// Palette indices.\r\n// For damage/bonus red-/gold-shifts\r\n#define STARTREDPALS\t\t1\r\n#define STARTBONUSPALS\t\t9\r\n#define NUMREDPALS\t\t\t8\r\n#define NUMBONUSPALS\t\t4\r\n// Radiation suit, green shift.\r\n#define RADIATIONPAL\t\t13\r\n#define INVULNERABILITYPAL\t14\t//Doom psx\r\n\r\nvoid ST_doPaletteStuff(void)//L8003AE6C()\r\n{\r\n\tint\t\tpalette_;\r\n\tint\t\tcnt;\r\n\tint\t\tbzc;\r\n\tplayer_t\t*plyr;\r\n\r\n\tplyr = &players[consoleplayer];\r\n\r\n\tcnt = plyr->damagecount;\r\n\r\n\tif (plyr->powers[pw_strength])\r\n\t{\r\n\t\t// slowly fade the berzerk out\r\n\t\tbzc = 12 - (plyr->powers[pw_strength] >> 6);\r\n\r\n\t\tif (bzc > cnt)\r\n\t\t\tcnt = bzc;\r\n\t}\r\n\r\n\t//Normal Palette\r\n\tpalette_ = 0;\r\n\r\n\t// Handling colormaps.\r\n\tviewlighting = true;\r\n\r\n\tif (plyr->powers[pw_infrared] >= 61 || plyr->powers[pw_infrared] & 8)\r\n\t{\r\n\t\tviewlighting = false;\r\n\t}\r\n\r\n\tif (plyr->powers[pw_invulnerability] >= 61 || plyr->powers[pw_invulnerability] & 8)\r\n\t{\r\n\t\tviewlighting = false;\r\n\t\tpalette_ = INVULNERABILITYPAL;\r\n\t}\r\n\telse if (cnt)\r\n\t{\r\n\t\tpalette_ = (cnt + 7) >> 3;\r\n\r\n\t\tif (palette_ >= NUMREDPALS)\r\n\t\t\tpalette_ = NUMREDPALS - 1;\r\n\r\n\t\tpalette_ += STARTREDPALS;\r\n\t}\r\n\telse if(plyr->powers[pw_ironfeet] >= 61 || plyr->powers[pw_ironfeet] & 8)\r\n\t{\r\n\t\tpalette_ = RADIATIONPAL;\r\n\t}\r\n\telse if (plyr->bonuscount)\r\n\t{\r\n\t\tpalette_ = (plyr->bonuscount + 7) >> 3;\r\n\r\n\t\tif (palette_ >= NUMBONUSPALS)\r\n\t\t\tpalette_ = NUMBONUSPALS - 1;\r\n\r\n\t\tpalette_ += STARTBONUSPALS;\r\n\t}\r\n\r\n\tpalettebase = palette[palette_];\r\n}\r\n\r\nint ST_GetTextCenterX(char *text)//L8003AFB4()\r\n{\r\n\tint c;\r\n\tint width;\r\n\r\n\twidth = 0;\r\n\twhile (*text)\r\n\t{\r\n\t\tc = *text;\r\n\r\n\t\tif ((byte)(c - 'A') < 26)\r\n\t\t{\r\n\t\t\tc -= 51;\r\n\t\t}\r\n\t\telse if ((byte)(c - 'a') < 26)\r\n\t\t{\r\n\t\t\tc -= 57;\r\n\t\t}\r\n\t\telse if ((byte)(c - '0') < 10)\r\n\t\t{\r\n\t\t\tc -= '0';\r\n\t\t}\r\n\t\telse if (c == '%')\r\n\t\t{\r\n\t\t\tc = 11;\r\n\t\t}\r\n\t\telse if (c == '!')\r\n\t\t{\r\n\t\t\tc = 12;\r\n\t\t}\r\n\t\telse if (c == '.')\r\n\t\t{\r\n\t\t\tc = 13;\r\n\t\t}\r\n\t\telse if (c == '-')\r\n\t\t{\r\n\t\t\tc = 10;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\twidth += 6; // space\r\n\t\t\ttext++;\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\twidth += symboldata[c].w;\r\n\t\ttext++;\r\n\t}\r\n\r\n\treturn (((256 - width) * 128) / 256);\r\n}\r\n\r\nvoid ST_DrawText(int x, int y, char *text)//L8003B0A0()\r\n{\r\n\tint\t\txpos;\r\n\tint\t\typos;\r\n\tint\t\tc;\r\n\r\n\tDR_MODE *drawmode = (DR_MODE*) getScratchAddr(128);//1F800200\r\n\tSPRT    *sprtstat = (SPRT*) getScratchAddr(128);//1F800200\r\n\r\n\tSetDrawMode(drawmode, 0, 0, statuspic.vtpage, NULL);\r\n\tW_AddPrim(drawmode);// add to order table\r\n\r\n\t/* make sprite status*/\r\n\tSetSprt(sprtstat);\r\n\tsetShadeTex(sprtstat, 1);\r\n\tsprtstat->clut = palette[16];\r\n\r\n\txpos = x;\r\n\tif (xpos == -1)//Get Center Text Position\r\n\t{\r\n\t\txpos = ST_GetTextCenterX(text);\r\n\t}\r\n\r\n\twhile (*text)\r\n\t{\r\n\t\tc = *text;\r\n\t\typos = y;\r\n\r\n\t\tif ((byte)(c - 'A') < 26)\r\n\t\t{\r\n\t\t\tc -= 51;\r\n\t\t}\r\n\t\telse if ((byte)(c - 'a') < 26)\r\n\t\t{\r\n\t\t\tc -= 57;\r\n\t\t\typos = y + 3;\r\n\t\t}\r\n\t\telse if ((byte)(c - '0') < 10)\r\n\t\t{\r\n\t\t\tc -= '0';\r\n\t\t}\r\n\t\telse if (c == '%')\r\n\t\t{\r\n\t\t\tc = 11;\r\n\t\t}\r\n\t\telse if (c == '!')\r\n\t\t{\r\n\t\t\tc = 12;\r\n\t\t}\r\n\t\telse if (c == '.')\r\n\t\t{\r\n\t\t\tc = 13;\r\n\t\t}\r\n\t\telse if (c == '-')\r\n\t\t{\r\n\t\t\tc = 10;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\txpos += 6; // space\r\n\t\t\ttext++;\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tsetWH(sprtstat, symboldata[c].w, symboldata[c].h);\r\n\t\tsetXY0(sprtstat, xpos, ypos);\r\n\t\tsetUV0(sprtstat, symboldata[c].x, symboldata[c].y);\r\n\t\tW_AddPrim(sprtstat);// add to order table\r\n\r\n\t\txpos += symboldata[c].w;\r\n\t\ttext++;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/st_main.h",
    "content": "/* the status bar consists of two 8 bit color objects: */\n/* the static background pic and a transparent foreground object that */\n/* all the stats are drawn onto when they change */\n/* coordinates are status bar relative (0 is first line of sbar) */\n\n#define\tFLASHDELAY\t4\t\t/* # of tics delay (1/30 sec) */\n#define FLASHTIMES\t6\t\t/* # of times to flash new frag amount (EVEN!) */\n\n#define AMMOX\t\t52\n#define AMMOY\t\t14\n\n#define HEALTHX\t\t104\n#define HEALTHY\t\tAMMOY\n\n#define KEYX\t\t124\n#define REDKEYY\t\t3\n#define BLUKEYY\t\t15\n#define YELKEYY\t\t27\n#define KEYW\t\t16\n#define KEYH\t\t11\n\n#define FACEX\t\t144\n#define FACEY\t\t5\n\n#define ARMORX\t\t226\n#define ARMORY\t\tHEALTHY\n\n#define MAPX\t\t316\n#define MAPY\t\tHEALTHY\n\n#define HISFRAGX\tMAPX\n#define HISFRAGY\tHEALTHY\n\n#define YOURFRAGX\t278\n#define YOURFRAGY\tHEALTHY\n\ntypedef enum\n{\n\tf_none,\n\tf_unk1,\n\tf_unk2,\n\tf_faceleft,\t\t/* turn face left */\n\tf_faceright,\t/* turn face right */\n\tf_hurtbad,\t\t/* surprised look when slammed hard */\n\tf_gotgat,\t\t/* picked up a weapon smile */\n\tf_mowdown,\t\t/* grimace while continuous firing */\n\tNUMSPCLFACES\n} spclface_e;\n\n#define\tNUMFACES\t47  //[PSX] Change 48 to 47\r\n#define\tEVILFACE    6\n#define\tGODFACE\t\t40\n#define DEADFACE \t41\n#define FIRSTSPLAT\t42\r\n\n#define GIBTIME\t\t2   //[PSX] Change 4 to 2\n#define NUMSPLATS\t6\n#define\tNUMMICROS\t8\t/* amount of micro-sized #'s (weapon armed) */\r\n\r\ntypedef struct\r\n{\r\n\tbyte xpos;\r\n\tbyte ypos;\r\n\tbyte x;\r\n\tbyte y;\r\n\tbyte w;\r\n\tbyte h;\r\n} facedata_t;\r\n\r\nextern facedata_t facedata[NUMFACES];//0x80073c98\n\ntypedef enum\n{\n\tsb_minus,\n\tsb_0,\n\tsb_percent = 11,\n\tsb_card_b,\n\tsb_card_y,\n\tsb_card_r,\n\tsb_skul_b,\n\tsb_skul_y,\n\tsb_skul_r,\n\tNUMSBOBJ\n} sbobj_e;\n\ntypedef struct\n{\n\tshort\tactive; //*\n\tshort\tdoDraw; //2\n\tshort   delay;  //4\n\tshort\ttimes;  //6\n} sbflash_t;\n\ntypedef struct\n{\n\tint\t\t    face;               //800984F4\r\n\t/* Messaging */\r\n\tspclface_e\tspecialFace;\t    //800984F8  /* Which type of special face to make */\r\n\tboolean     tryopen[NUMCARDS];\t//800984FC  /* Tried to open a card or skull door */\r\n\tboolean\t    gotgibbed;          //80098514  /* Got gibbed */\r\n\tint         gibframe;           //80098518\r\n\tint         gibdelay;           //8009851C\r\n\tchar        *message;           //80098520\r\n    int         messagedelay;       //80098524\n} stbar_t;\n\nextern\tstbar_t\tstbar; //800984F4\r\nextern  psxobj_t statuspic;\r\nextern\tint     weaponowned[NUMWEAPONS];  //80073ebc\r\nextern\tshort\tmicronums_x[NUMMICROS];//80073ee0\r\nextern\tshort\tmicronums_y[NUMMICROS];//80073ef0\r\nextern\tshort\tcard_y[NUMCARDS];//80073f00\r\n\r\ntypedef struct {\r\n\tbyte x;\r\n\tbyte y;\r\n\tbyte w;\r\n\tbyte h;\r\n} symboldata_t;\r\n\r\nextern symboldata_t symboldata[];//80073e16\r\n\r\nvoid ST_Init (void);\r\nvoid ST_InitEveryLevel(void);\r\nvoid ST_Ticker (void);\r\nvoid ST_Drawer (void);\r\nvoid ST_DrawValue(int x, int y, int value);\r\nvoid ST_DrawMessage(int x, int y, char *text);\r\nvoid ST_CheatDraw(void);\r\nvoid ST_doPaletteStuff(void);\r\nint ST_GetTextCenterX(char *text);\r\nvoid ST_DrawText(int x, int y, char *text);\n\n\n"
  },
  {
    "path": "PSXDOOM/t_main.c",
    "content": "/* t_main.c -- title intro */\r\n\r\n#include \"doomdef.h\"\r\n#include \"p_spec.h\"\r\n#include \"r_local.h\"\r\n\r\nint vframe1 = 0; //80077AB4 iGp000006a4\r\nint vframe2 = 0; //80077AB8 iGp000006a8\r\n\r\npsxobj_t loadingpic;//0x80097870\r\npsxobj_t marb01pic;//0x80097890\r\npsxobj_t buttonspic;//0x800978B0\r\npsxobj_t neterrpic; //0x800978d0\r\npsxobj_t pausepic;//0x80097850\r\npsxobj_t titlepic;//0x80097810\r\n\r\n/*\r\n=======================\r\n=\r\n= T_Start\r\n=\r\n=======================\r\n*/\r\n\r\nvoid T_Start(void)//L80034EA0()\r\n{\r\n\tint lump;\r\n\r\n\tValloc_Init();\r\n\tZ_FreeTags(mainzone,PU_CACHE);//test\r\n\r\n\tW_CacheLumpName(\"LOADING\", PU_STATIC, 0);\r\n\tImageToVram(&loadingpic, \"LOADING\", 0);\r\n\tP_LoadingPlaque(&loadingpic, 95, 109, palette[16]);\r\n\tS_Lcd_Load(0);\r\n\r\n\tW_CacheLumpName(\"MARB01\", PU_STATIC, 0);\r\n\tW_CacheLumpName(\"BUTTONS\", PU_STATIC, 0);\r\n\tW_CacheLumpName(\"NETERR\", PU_STATIC, 0);\r\n\tW_CacheLumpName(\"PAUSE\", PU_STATIC, 0);\r\n\r\n\tImageToVram(&marb01pic, \"MARB01\", 0);\r\n\tImageToVram(&buttonspic, \"BUTTONS\", 0);\r\n\tImageToVram(&neterrpic, \"NETERR\", 0);\r\n\tImageToVram(&pausepic, \"PAUSE\", 0);\r\n\tImageToVram(&titlepic, \"TITLE\", 0);\r\n\r\n\tlump = R_TextureNumForName(\"SKY09\");\r\n\tskytexturep = &textures[lump];\r\n\tskypalette = palette[15];\r\n\r\n\tW_CacheLumpNum(skytexturep->lump, PU_CACHE, true);\r\n\r\n\tTextureCache(skytexturep);\r\n\r\n\ty_scroll = 250;\r\n\r\n\tpsxcd_play(CD_TRACK[cdmusic_title_screen], CDVolume);\r\n\tdo {} while(psxcd_elapsed_sectors() == 0);\r\n}\r\n\r\n/*\r\n=======================\r\n=\r\n= T_Stop\r\n=\r\n=======================\r\n*/\r\n\r\nvoid T_Stop(int exit)//L80035070()\r\n{\r\n\tS_StartSound(NULL, sfx_barexp);\r\n\tpsxcd_stop();\r\n}\r\n\r\n/*\r\n=======================\r\n=\r\n= T_Ticker\r\n=\r\n=======================\r\n*/\r\n\r\nint T_Ticker(void)//L8003509C()\r\n{\r\n    byte *cache, *cachetmp;\r\n    int exit, pixel, cnt, i;\r\n\r\n    exit = ga_nothing;\r\n\r\n    if (ticbuttons[0] != 0)\r\n    {\r\n        exit = ga_exit;\r\n    }\r\n    else\r\n    {\r\n        vframe1 -= vblsinframe[consoleplayer];\r\n        if (vframe1 <= 0)\r\n        {\r\n            vframe1 = 2;\r\n            if (y_scroll != 0)\r\n            {\r\n                y_scroll--;\r\n                if (y_scroll == 0)\r\n                    last_ticon = ticon;\r\n            }\r\n        }\r\n\r\n        vframe2 -= vblsinframe[consoleplayer];\r\n        if (vframe2 <= 0)\r\n        {\r\n            vframe2 = 2;\r\n\r\n            //Fire Out\r\n            if (((y_scroll < 50) & (y_scroll ^ 1) & 1) != 0)\r\n            {\r\n                cache = (byte *)(lumpcache[skytexturep->lump].cache) + 8;\r\n\r\n                pixel = *(cache + FIREPOS1) - 1;\r\n                if (pixel < 0)\r\n                    pixel = 0;\r\n\r\n                cachetmp = (cache + FIREPOS2);\r\n                for (i = (FIRESKY_WIDTH - 1); i >= 0; i--)\r\n                    *cachetmp-- = pixel;\r\n            }\r\n            P_FireSky(skytexturep);\r\n        }\r\n\r\n        if (y_scroll == 0)\r\n            exit = -((unsigned int)(ticon - last_ticon < 1800) ^ 1) & 7;\r\n    }\r\n\r\n    return exit;\r\n}\r\n\r\n/*\r\n=======================\r\n=\r\n= T_Draw\r\n=\r\n=======================\r\n*/\r\n\r\n#if FIX_TITLE_FYRE_WITH == 1\r\n#define SKY_W 64\r\n#else\r\n#define SKY_W 63\r\n#endif // FIX_TITLE_FYRE_WITH\r\n\r\nvoid T_Draw(void)//L80035214()\r\n{\r\n\tPOLY_FT4 poly1;\r\n\tRECT rect;\r\n\tint i;\r\n\tbyte *cache;\r\n\r\n\tNextTextureCacheIdx();\r\n\r\n\t// Draw Title Textures\r\n\tsetPolyFT4(&poly1);\r\n\tsetRGB0(&poly1, 128, 128, 128);\r\n\r\n\t//setUV4(p,_u0,_v0,_u1,_v1,_u2,_v2,_u3,_v3)\r\n\tsetUV4(&poly1,\r\n\t\t0  , 0  ,\r\n\t\t255, 0  ,\r\n\t\t0  , 239,\r\n\t\t255, 239);\r\n\r\n\t//setXY4(p,_x0,_y0,_x1,_y1,_x2,_y2,_x3,_y3)\r\n\tsetXY4(&poly1,\r\n\t\t0  , y_scroll,\r\n\t\t255, y_scroll,\r\n\t\t0  , y_scroll + 239,\r\n\t\t255, y_scroll + 239);\r\n\r\n\tpoly1.tpage = titlepic.vtpage;\r\n\tpoly1.clut = palette[17];\r\n\r\n\tW_AddPrim(&poly1);// add to order table\r\n\r\n\t// Draw 4 Fire Textures\r\n\tif (skytexturep->index == -1)\r\n\t{\r\n\t\trect.x = (skytexturep->vramx >> 1) + ((skytexturep->vtpage & 15) << 6);\r\n\t\trect.y = (skytexturep->vramy) + ((skytexturep->vtpage & 16) << 4);\r\n\t\trect.w = 32;\r\n\t\trect.h = 128;\r\n\t\tcache = (byte *)(lumpcache[skytexturep->lump].cache) + 8;\r\n\t\tLoadImage(&rect, (unsigned long *)(byte*)(cache));\r\n\t\tskytexturep->index = TextureCacheIdx;\r\n\t}\r\n\r\n\tsetPolyFT4(&poly1);\r\n\tsetRGB0(&poly1, 128, 128, 128);\r\n\r\n\t//setUV4(p,_u0,_v0,_u1,_v1,_u2,_v2,_u3,_v3)\r\n\tsetUV4(&poly1,\r\n\t\tskytexturep->vramx     , skytexturep->vramy,\r\n\t\tskytexturep->vramx + SKY_W, skytexturep->vramy,\r\n\t\tskytexturep->vramx     , skytexturep->vramy + 127,\r\n\t\tskytexturep->vramx + SKY_W, skytexturep->vramy + 127);\r\n\r\n\t//setXY4(p,_x0,_y0,_x1,_y1,_x2,_y2,_x3,_y3)\r\n\tsetXY4(&poly1,\r\n\t\t0, 116,\r\n\t\tSKY_W, 116,\r\n\t\t0, 243,\r\n\t\tSKY_W, 243);\r\n\r\n\tpoly1.tpage = skytexturep->vtpage;\r\n\tpoly1.clut = skypalette;\r\n\r\n\tfor (i = 0; i < 4; i++)\r\n\t{\r\n\t\tW_AddPrim(&poly1);// add to order table\r\n\t\tpoly1.x0 += SKY_W;\r\n\t\tpoly1.x1 += SKY_W;\r\n\t\tpoly1.x2 += SKY_W;\r\n\t\tpoly1.x3 += SKY_W;\r\n\t}\r\n\r\n\tUpdateDrawOTag();\r\n\tDrawRender();\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/tables.c",
    "content": "#include \"doomdef.h\"\n\nint finesine[10240] = {//80067788\n25,75,125,175,226,276,326,376,\n427,477,527,578,628,678,728,779,\n829,879,929,980,1030,1080,1130,1181,\n1231,1281,1331,1382,1432,1482,1532,1583,\n1633,1683,1733,1784,1834,1884,1934,1985,\n2035,2085,2135,2186,2236,2286,2336,2387,\n2437,2487,2537,2587,2638,2688,2738,2788,\n2839,2889,2939,2989,3039,3090,3140,3190,\n3240,3291,3341,3391,3441,3491,3541,3592,\n3642,3692,3742,3792,3843,3893,3943,3993,\n4043,4093,4144,4194,4244,4294,4344,4394,\n4445,4495,4545,4595,4645,4695,4745,4796,\n4846,4896,4946,4996,5046,5096,5146,5197,\n5247,5297,5347,5397,5447,5497,5547,5597,\n5647,5697,5748,5798,5848,5898,5948,5998,\n6048,6098,6148,6198,6248,6298,6348,6398,\n6448,6498,6548,6598,6648,6698,6748,6798,\n6848,6898,6948,6998,7048,7098,7148,7198,\n7248,7298,7348,7398,7448,7498,7548,7598,\n7648,7697,7747,7797,7847,7897,7947,7997,\n8047,8097,8147,8196,8246,8296,8346,8396,\n8446,8496,8545,8595,8645,8695,8745,8794,\n8844,8894,8944,8994,9043,9093,9143,9193,\n9243,9292,9342,9392,9442,9491,9541,9591,\n9640,9690,9740,9790,9839,9889,9939,9988,\n10038,10088,10137,10187,10237,10286,10336,10386,\n10435,10485,10534,10584,10634,10683,10733,10782,\n10832,10882,10931,10981,11030,11080,11129,11179,\n11228,11278,11327,11377,11426,11476,11525,11575,\n11624,11674,11723,11773,11822,11872,11921,11970,\n12020,12069,12119,12168,12218,12267,12316,12366,\n12415,12464,12514,12563,12612,12662,12711,12760,\n12810,12859,12908,12957,13007,13056,13105,13154,\n13204,13253,13302,13351,13401,13450,13499,13548,\n13597,13647,13696,13745,13794,13843,13892,13941,\n13990,14040,14089,14138,14187,14236,14285,14334,\n14383,14432,14481,14530,14579,14628,14677,14726,\n14775,14824,14873,14922,14971,15020,15069,15118,\n15167,15215,15264,15313,15362,15411,15460,15509,\n15557,15606,15655,15704,15753,15802,15850,15899,\n15948,15997,16045,16094,16143,16191,16240,16289,\n16338,16386,16435,16484,16532,16581,16629,16678,\n16727,16775,16824,16872,16921,16970,17018,17067,\n17115,17164,17212,17261,17309,17358,17406,17455,\n17503,17551,17600,17648,17697,17745,17793,17842,\n17890,17939,17987,18035,18084,18132,18180,18228,\n18277,18325,18373,18421,18470,18518,18566,18614,\n18663,18711,18759,18807,18855,18903,18951,19000,\n19048,19096,19144,19192,19240,19288,19336,19384,\n19432,19480,19528,19576,19624,19672,19720,19768,\n19816,19864,19912,19959,20007,20055,20103,20151,\n20199,20246,20294,20342,20390,20438,20485,20533,\n20581,20629,20676,20724,20772,20819,20867,20915,\n20962,21010,21057,21105,21153,21200,21248,21295,\n21343,21390,21438,21485,21533,21580,21628,21675,\n21723,21770,21817,21865,21912,21960,22007,22054,\n22102,22149,22196,22243,22291,22338,22385,22433,\n22480,22527,22574,22621,22668,22716,22763,22810,\n22857,22904,22951,22998,23045,23092,23139,23186,\n23233,23280,23327,23374,23421,23468,23515,23562,\n23609,23656,23703,23750,23796,23843,23890,23937,\n23984,24030,24077,24124,24171,24217,24264,24311,\n24357,24404,24451,24497,24544,24591,24637,24684,\n24730,24777,24823,24870,24916,24963,25009,25056,\n25102,25149,25195,25241,25288,25334,25381,25427,\n25473,25520,25566,25612,25658,25705,25751,25797,\n25843,25889,25936,25982,26028,26074,26120,26166,\n26212,26258,26304,26350,26396,26442,26488,26534,\n26580,26626,26672,26718,26764,26810,26856,26902,\n26947,26993,27039,27085,27131,27176,27222,27268,\n27313,27359,27405,27450,27496,27542,27587,27633,\n27678,27724,27770,27815,27861,27906,27952,27997,\n28042,28088,28133,28179,28224,28269,28315,28360,\n28405,28451,28496,28541,28586,28632,28677,28722,\n28767,28812,28858,28903,28948,28993,29038,29083,\n29128,29173,29218,29263,29308,29353,29398,29443,\n29488,29533,29577,29622,29667,29712,29757,29801,\n29846,29891,29936,29980,30025,30070,30114,30159,\n30204,30248,30293,30337,30382,30426,30471,30515,\n30560,30604,30649,30693,30738,30782,30826,30871,\n30915,30959,31004,31048,31092,31136,31181,31225,\n31269,31313,31357,31402,31446,31490,31534,31578,\n31622,31666,31710,31754,31798,31842,31886,31930,\n31974,32017,32061,32105,32149,32193,32236,32280,\n32324,32368,32411,32455,32499,32542,32586,32630,\n32673,32717,32760,32804,32847,32891,32934,32978,\n33021,33065,33108,33151,33195,33238,33281,33325,\n33368,33411,33454,33498,33541,33584,33627,33670,\n33713,33756,33799,33843,33886,33929,33972,34015,\n34057,34100,34143,34186,34229,34272,34315,34358,\n34400,34443,34486,34529,34571,34614,34657,34699,\n34742,34785,34827,34870,34912,34955,34997,35040,\n35082,35125,35167,35210,35252,35294,35337,35379,\n35421,35464,35506,35548,35590,35633,35675,35717,\n35759,35801,35843,35885,35927,35969,36011,36053,\n36095,36137,36179,36221,36263,36305,36347,36388,\n36430,36472,36514,36555,36597,36639,36681,36722,\n36764,36805,36847,36889,36930,36972,37013,37055,\n37096,37137,37179,37220,37262,37303,37344,37386,\n37427,37468,37509,37551,37592,37633,37674,37715,\n37756,37797,37838,37879,37920,37961,38002,38043,\n38084,38125,38166,38207,38248,38288,38329,38370,\n38411,38451,38492,38533,38573,38614,38655,38695,\n38736,38776,38817,38857,38898,38938,38979,39019,\n39059,39100,39140,39180,39221,39261,39301,39341,\n39382,39422,39462,39502,39542,39582,39622,39662,\n39702,39742,39782,39822,39862,39902,39942,39982,\n40021,40061,40101,40141,40180,40220,40260,40300,\n40339,40379,40418,40458,40497,40537,40576,40616,\n40655,40695,40734,40773,40813,40852,40891,40931,\n40970,41009,41048,41087,41127,41166,41205,41244,\n41283,41322,41361,41400,41439,41478,41517,41556,\n41595,41633,41672,41711,41750,41788,41827,41866,\n41904,41943,41982,42020,42059,42097,42136,42174,\n42213,42251,42290,42328,42366,42405,42443,42481,\n42520,42558,42596,42634,42672,42711,42749,42787,\n42825,42863,42901,42939,42977,43015,43053,43091,\n43128,43166,43204,43242,43280,43317,43355,43393,\n43430,43468,43506,43543,43581,43618,43656,43693,\n43731,43768,43806,43843,43880,43918,43955,43992,\n44029,44067,44104,44141,44178,44215,44252,44289,\n44326,44363,44400,44437,44474,44511,44548,44585,\n44622,44659,44695,44732,44769,44806,44842,44879,\n44915,44952,44989,45025,45062,45098,45135,45171,\n45207,45244,45280,45316,45353,45389,45425,45462,\n45498,45534,45570,45606,45642,45678,45714,45750,\n45786,45822,45858,45894,45930,45966,46002,46037,\n46073,46109,46145,46180,46216,46252,46287,46323,\n46358,46394,46429,46465,46500,46536,46571,46606,\n46642,46677,46712,46747,46783,46818,46853,46888,\n46923,46958,46993,47028,47063,47098,47133,47168,\n47203,47238,47273,47308,47342,47377,47412,47446,\n47481,47516,47550,47585,47619,47654,47688,47723,\n47757,47792,47826,47860,47895,47929,47963,47998,\n48032,48066,48100,48134,48168,48202,48237,48271,\n48305,48338,48372,48406,48440,48474,48508,48542,\n48575,48609,48643,48676,48710,48744,48777,48811,\n48844,48878,48911,48945,48978,49012,49045,49078,\n49112,49145,49178,49211,49244,49278,49311,49344,\n49377,49410,49443,49476,49509,49542,49575,49608,\n49640,49673,49706,49739,49771,49804,49837,49869,\n49902,49935,49967,50000,50032,50065,50097,50129,\n50162,50194,50226,50259,50291,50323,50355,50387,\n50420,50452,50484,50516,50548,50580,50612,50644,\n50675,50707,50739,50771,50803,50834,50866,50898,\n50929,50961,50993,51024,51056,51087,51119,51150,\n51182,51213,51244,51276,51307,51338,51369,51401,\n51432,51463,51494,51525,51556,51587,51618,51649,\n51680,51711,51742,51773,51803,51834,51865,51896,\n51926,51957,51988,52018,52049,52079,52110,52140,\n52171,52201,52231,52262,52292,52322,52353,52383,\n52413,52443,52473,52503,52534,52564,52594,52624,\n52653,52683,52713,52743,52773,52803,52832,52862,\n52892,52922,52951,52981,53010,53040,53069,53099,\n53128,53158,53187,53216,53246,53275,53304,53334,\n53363,53392,53421,53450,53479,53508,53537,53566,\n53595,53624,53653,53682,53711,53739,53768,53797,\n53826,53854,53883,53911,53940,53969,53997,54026,\n54054,54082,54111,54139,54167,54196,54224,54252,\n54280,54308,54337,54365,54393,54421,54449,54477,\n54505,54533,54560,54588,54616,54644,54672,54699,\n54727,54755,54782,54810,54837,54865,54892,54920,\n54947,54974,55002,55029,55056,55084,55111,55138,\n55165,55192,55219,55246,55274,55300,55327,55354,\n55381,55408,55435,55462,55489,55515,55542,55569,\n55595,55622,55648,55675,55701,55728,55754,55781,\n55807,55833,55860,55886,55912,55938,55965,55991,\n56017,56043,56069,56095,56121,56147,56173,56199,\n56225,56250,56276,56302,56328,56353,56379,56404,\n56430,56456,56481,56507,56532,56557,56583,56608,\n56633,56659,56684,56709,56734,56760,56785,56810,\n56835,56860,56885,56910,56935,56959,56984,57009,\n57034,57059,57083,57108,57133,57157,57182,57206,\n57231,57255,57280,57304,57329,57353,57377,57402,\n57426,57450,57474,57498,57522,57546,57570,57594,\n57618,57642,57666,57690,57714,57738,57762,57785,\n57809,57833,57856,57880,57903,57927,57950,57974,\n57997,58021,58044,58067,58091,58114,58137,58160,\n58183,58207,58230,58253,58276,58299,58322,58345,\n58367,58390,58413,58436,58459,58481,58504,58527,\n58549,58572,58594,58617,58639,58662,58684,58706,\n58729,58751,58773,58795,58818,58840,58862,58884,\n58906,58928,58950,58972,58994,59016,59038,59059,\n59081,59103,59125,59146,59168,59190,59211,59233,\n59254,59276,59297,59318,59340,59361,59382,59404,\n59425,59446,59467,59488,59509,59530,59551,59572,\n59593,59614,59635,59656,59677,59697,59718,59739,\n59759,59780,59801,59821,59842,59862,59883,59903,\n59923,59944,59964,59984,60004,60025,60045,60065,\n60085,60105,60125,60145,60165,60185,60205,60225,\n60244,60264,60284,60304,60323,60343,60363,60382,\n60402,60421,60441,60460,60479,60499,60518,60537,\n60556,60576,60595,60614,60633,60652,60671,60690,\n60709,60728,60747,60766,60785,60803,60822,60841,\n60859,60878,60897,60915,60934,60952,60971,60989,\n61007,61026,61044,61062,61081,61099,61117,61135,\n61153,61171,61189,61207,61225,61243,61261,61279,\n61297,61314,61332,61350,61367,61385,61403,61420,\n61438,61455,61473,61490,61507,61525,61542,61559,\n61577,61594,61611,61628,61645,61662,61679,61696,\n61713,61730,61747,61764,61780,61797,61814,61831,\n61847,61864,61880,61897,61913,61930,61946,61963,\n61979,61995,62012,62028,62044,62060,62076,62092,\n62108,62125,62141,62156,62172,62188,62204,62220,\n62236,62251,62267,62283,62298,62314,62329,62345,\n62360,62376,62391,62407,62422,62437,62453,62468,\n62483,62498,62513,62528,62543,62558,62573,62588,\n62603,62618,62633,62648,62662,62677,62692,62706,\n62721,62735,62750,62764,62779,62793,62808,62822,\n62836,62850,62865,62879,62893,62907,62921,62935,\n62949,62963,62977,62991,63005,63019,63032,63046,\n63060,63074,63087,63101,63114,63128,63141,63155,\n63168,63182,63195,63208,63221,63235,63248,63261,\n63274,63287,63300,63313,63326,63339,63352,63365,\n63378,63390,63403,63416,63429,63441,63454,63466,\n63479,63491,63504,63516,63528,63541,63553,63565,\n63578,63590,63602,63614,63626,63638,63650,63662,\n63674,63686,63698,63709,63721,63733,63745,63756,\n63768,63779,63791,63803,63814,63825,63837,63848,\n63859,63871,63882,63893,63904,63915,63927,63938,\n63949,63960,63971,63981,63992,64003,64014,64025,\n64035,64046,64057,64067,64078,64088,64099,64109,\n64120,64130,64140,64151,64161,64171,64181,64192,\n64202,64212,64222,64232,64242,64252,64261,64271,\n64281,64291,64301,64310,64320,64330,64339,64349,\n64358,64368,64377,64387,64396,64405,64414,64424,\n64433,64442,64451,64460,64469,64478,64487,64496,\n64505,64514,64523,64532,64540,64549,64558,64566,\n64575,64584,64592,64601,64609,64617,64626,64634,\n64642,64651,64659,64667,64675,64683,64691,64699,\n64707,64715,64723,64731,64739,64747,64754,64762,\n64770,64777,64785,64793,64800,64808,64815,64822,\n64830,64837,64844,64852,64859,64866,64873,64880,\n64887,64895,64902,64908,64915,64922,64929,64936,\n64943,64949,64956,64963,64969,64976,64982,64989,\n64995,65002,65008,65015,65021,65027,65033,65040,\n65046,65052,65058,65064,65070,65076,65082,65088,\n65094,65099,65105,65111,65117,65122,65128,65133,\n65139,65144,65150,65155,65161,65166,65171,65177,\n65182,65187,65192,65197,65202,65207,65212,65217,\n65222,65227,65232,65237,65242,65246,65251,65256,\n65260,65265,65270,65274,65279,65283,65287,65292,\n65296,65300,65305,65309,65313,65317,65321,65325,\n65329,65333,65337,65341,65345,65349,65352,65356,\n65360,65363,65367,65371,65374,65378,65381,65385,\n65388,65391,65395,65398,65401,65404,65408,65411,\n65414,65417,65420,65423,65426,65429,65431,65434,\n65437,65440,65442,65445,65448,65450,65453,65455,\n65458,65460,65463,65465,65467,65470,65472,65474,\n65476,65478,65480,65482,65484,65486,65488,65490,\n65492,65494,65496,65497,65499,65501,65502,65504,\n65505,65507,65508,65510,65511,65513,65514,65515,\n65516,65518,65519,65520,65521,65522,65523,65524,\n65525,65526,65527,65527,65528,65529,65530,65530,\n65531,65531,65532,65532,65533,65533,65534,65534,\n65534,65535,65535,65535,65535,65535,65535,65535,\n65535,65535,65535,65535,65535,65535,65535,65534,\n65534,65534,65533,65533,65532,65532,65531,65531,\n65530,65530,65529,65528,65527,65527,65526,65525,\n65524,65523,65522,65521,65520,65519,65518,65516,\n65515,65514,65513,65511,65510,65508,65507,65505,\n65504,65502,65501,65499,65497,65496,65494,65492,\n65490,65488,65486,65484,65482,65480,65478,65476,\n65474,65472,65470,65467,65465,65463,65460,65458,\n65455,65453,65450,65448,65445,65442,65440,65437,\n65434,65431,65429,65426,65423,65420,65417,65414,\n65411,65408,65404,65401,65398,65395,65391,65388,\n65385,65381,65378,65374,65371,65367,65363,65360,\n65356,65352,65349,65345,65341,65337,65333,65329,\n65325,65321,65317,65313,65309,65305,65300,65296,\n65292,65287,65283,65279,65274,65270,65265,65260,\n65256,65251,65246,65242,65237,65232,65227,65222,\n65217,65212,65207,65202,65197,65192,65187,65182,\n65177,65171,65166,65161,65155,65150,65144,65139,\n65133,65128,65122,65117,65111,65105,65099,65094,\n65088,65082,65076,65070,65064,65058,65052,65046,\n65040,65033,65027,65021,65015,65008,65002,64995,\n64989,64982,64976,64969,64963,64956,64949,64943,\n64936,64929,64922,64915,64908,64902,64895,64887,\n64880,64873,64866,64859,64852,64844,64837,64830,\n64822,64815,64808,64800,64793,64785,64777,64770,\n64762,64754,64747,64739,64731,64723,64715,64707,\n64699,64691,64683,64675,64667,64659,64651,64642,\n64634,64626,64617,64609,64600,64592,64584,64575,\n64566,64558,64549,64540,64532,64523,64514,64505,\n64496,64487,64478,64469,64460,64451,64442,64433,\n64424,64414,64405,64396,64387,64377,64368,64358,\n64349,64339,64330,64320,64310,64301,64291,64281,\n64271,64261,64252,64242,64232,64222,64212,64202,\n64192,64181,64171,64161,64151,64140,64130,64120,\n64109,64099,64088,64078,64067,64057,64046,64035,\n64025,64014,64003,63992,63981,63971,63960,63949,\n63938,63927,63915,63904,63893,63882,63871,63859,\n63848,63837,63825,63814,63803,63791,63779,63768,\n63756,63745,63733,63721,63709,63698,63686,63674,\n63662,63650,63638,63626,63614,63602,63590,63578,\n63565,63553,63541,63528,63516,63504,63491,63479,\n63466,63454,63441,63429,63416,63403,63390,63378,\n63365,63352,63339,63326,63313,63300,63287,63274,\n63261,63248,63235,63221,63208,63195,63182,63168,\n63155,63141,63128,63114,63101,63087,63074,63060,\n63046,63032,63019,63005,62991,62977,62963,62949,\n62935,62921,62907,62893,62879,62865,62850,62836,\n62822,62808,62793,62779,62764,62750,62735,62721,\n62706,62692,62677,62662,62648,62633,62618,62603,\n62588,62573,62558,62543,62528,62513,62498,62483,\n62468,62453,62437,62422,62407,62391,62376,62360,\n62345,62329,62314,62298,62283,62267,62251,62236,\n62220,62204,62188,62172,62156,62141,62125,62108,\n62092,62076,62060,62044,62028,62012,61995,61979,\n61963,61946,61930,61913,61897,61880,61864,61847,\n61831,61814,61797,61780,61764,61747,61730,61713,\n61696,61679,61662,61645,61628,61611,61594,61577,\n61559,61542,61525,61507,61490,61473,61455,61438,\n61420,61403,61385,61367,61350,61332,61314,61297,\n61279,61261,61243,61225,61207,61189,61171,61153,\n61135,61117,61099,61081,61062,61044,61026,61007,\n60989,60971,60952,60934,60915,60897,60878,60859,\n60841,60822,60803,60785,60766,60747,60728,60709,\n60690,60671,60652,60633,60614,60595,60576,60556,\n60537,60518,60499,60479,60460,60441,60421,60402,\n60382,60363,60343,60323,60304,60284,60264,60244,\n60225,60205,60185,60165,60145,60125,60105,60085,\n60065,60045,60025,60004,59984,59964,59944,59923,\n59903,59883,59862,59842,59821,59801,59780,59759,\n59739,59718,59697,59677,59656,59635,59614,59593,\n59572,59551,59530,59509,59488,59467,59446,59425,\n59404,59382,59361,59340,59318,59297,59276,59254,\n59233,59211,59190,59168,59146,59125,59103,59081,\n59059,59038,59016,58994,58972,58950,58928,58906,\n58884,58862,58840,58818,58795,58773,58751,58729,\n58706,58684,58662,58639,58617,58594,58572,58549,\n58527,58504,58481,58459,58436,58413,58390,58367,\n58345,58322,58299,58276,58253,58230,58207,58183,\n58160,58137,58114,58091,58067,58044,58021,57997,\n57974,57950,57927,57903,57880,57856,57833,57809,\n57785,57762,57738,57714,57690,57666,57642,57618,\n57594,57570,57546,57522,57498,57474,57450,57426,\n57402,57377,57353,57329,57304,57280,57255,57231,\n57206,57182,57157,57133,57108,57083,57059,57034,\n57009,56984,56959,56935,56910,56885,56860,56835,\n56810,56785,56760,56734,56709,56684,56659,56633,\n56608,56583,56557,56532,56507,56481,56456,56430,\n56404,56379,56353,56328,56302,56276,56250,56225,\n56199,56173,56147,56121,56095,56069,56043,56017,\n55991,55965,55938,55912,55886,55860,55833,55807,\n55781,55754,55728,55701,55675,55648,55622,55595,\n55569,55542,55515,55489,55462,55435,55408,55381,\n55354,55327,55300,55274,55246,55219,55192,55165,\n55138,55111,55084,55056,55029,55002,54974,54947,\n54920,54892,54865,54837,54810,54782,54755,54727,\n54699,54672,54644,54616,54588,54560,54533,54505,\n54477,54449,54421,54393,54365,54337,54308,54280,\n54252,54224,54196,54167,54139,54111,54082,54054,\n54026,53997,53969,53940,53911,53883,53854,53826,\n53797,53768,53739,53711,53682,53653,53624,53595,\n53566,53537,53508,53479,53450,53421,53392,53363,\n53334,53304,53275,53246,53216,53187,53158,53128,\n53099,53069,53040,53010,52981,52951,52922,52892,\n52862,52832,52803,52773,52743,52713,52683,52653,\n52624,52594,52564,52534,52503,52473,52443,52413,\n52383,52353,52322,52292,52262,52231,52201,52171,\n52140,52110,52079,52049,52018,51988,51957,51926,\n51896,51865,51834,51803,51773,51742,51711,51680,\n51649,51618,51587,51556,51525,51494,51463,51432,\n51401,51369,51338,51307,51276,51244,51213,51182,\n51150,51119,51087,51056,51024,50993,50961,50929,\n50898,50866,50834,50803,50771,50739,50707,50675,\n50644,50612,50580,50548,50516,50484,50452,50420,\n50387,50355,50323,50291,50259,50226,50194,50162,\n50129,50097,50065,50032,50000,49967,49935,49902,\n49869,49837,49804,49771,49739,49706,49673,49640,\n49608,49575,49542,49509,49476,49443,49410,49377,\n49344,49311,49278,49244,49211,49178,49145,49112,\n49078,49045,49012,48978,48945,48911,48878,48844,\n48811,48777,48744,48710,48676,48643,48609,48575,\n48542,48508,48474,48440,48406,48372,48338,48304,\n48271,48237,48202,48168,48134,48100,48066,48032,\n47998,47963,47929,47895,47860,47826,47792,47757,\n47723,47688,47654,47619,47585,47550,47516,47481,\n47446,47412,47377,47342,47308,47273,47238,47203,\n47168,47133,47098,47063,47028,46993,46958,46923,\n46888,46853,46818,46783,46747,46712,46677,46642,\n46606,46571,46536,46500,46465,46429,46394,46358,\n46323,46287,46252,46216,46180,46145,46109,46073,\n46037,46002,45966,45930,45894,45858,45822,45786,\n45750,45714,45678,45642,45606,45570,45534,45498,\n45462,45425,45389,45353,45316,45280,45244,45207,\n45171,45135,45098,45062,45025,44989,44952,44915,\n44879,44842,44806,44769,44732,44695,44659,44622,\n44585,44548,44511,44474,44437,44400,44363,44326,\n44289,44252,44215,44178,44141,44104,44067,44029,\n43992,43955,43918,43880,43843,43806,43768,43731,\n43693,43656,43618,43581,43543,43506,43468,43430,\n43393,43355,43317,43280,43242,43204,43166,43128,\n43091,43053,43015,42977,42939,42901,42863,42825,\n42787,42749,42711,42672,42634,42596,42558,42520,\n42481,42443,42405,42366,42328,42290,42251,42213,\n42174,42136,42097,42059,42020,41982,41943,41904,\n41866,41827,41788,41750,41711,41672,41633,41595,\n41556,41517,41478,41439,41400,41361,41322,41283,\n41244,41205,41166,41127,41088,41048,41009,40970,\n40931,40891,40852,40813,40773,40734,40695,40655,\n40616,40576,40537,40497,40458,40418,40379,40339,\n40300,40260,40220,40180,40141,40101,40061,40021,\n39982,39942,39902,39862,39822,39782,39742,39702,\n39662,39622,39582,39542,39502,39462,39422,39382,\n39341,39301,39261,39221,39180,39140,39100,39059,\n39019,38979,38938,38898,38857,38817,38776,38736,\n38695,38655,38614,38573,38533,38492,38451,38411,\n38370,38329,38288,38248,38207,38166,38125,38084,\n38043,38002,37961,37920,37879,37838,37797,37756,\n37715,37674,37633,37592,37551,37509,37468,37427,\n37386,37344,37303,37262,37220,37179,37137,37096,\n37055,37013,36972,36930,36889,36847,36805,36764,\n36722,36681,36639,36597,36556,36514,36472,36430,\n36388,36347,36305,36263,36221,36179,36137,36095,\n36053,36011,35969,35927,35885,35843,35801,35759,\n35717,35675,35633,35590,35548,35506,35464,35421,\n35379,35337,35294,35252,35210,35167,35125,35082,\n35040,34997,34955,34912,34870,34827,34785,34742,\n34699,34657,34614,34571,34529,34486,34443,34400,\n34358,34315,34272,34229,34186,34143,34100,34057,\n34015,33972,33929,33886,33843,33799,33756,33713,\n33670,33627,33584,33541,33498,33454,33411,33368,\n33325,33281,33238,33195,33151,33108,33065,33021,\n32978,32934,32891,32847,32804,32760,32717,32673,\n32630,32586,32542,32499,32455,32411,32368,32324,\n32280,32236,32193,32149,32105,32061,32017,31974,\n31930,31886,31842,31798,31754,31710,31666,31622,\n31578,31534,31490,31446,31402,31357,31313,31269,\n31225,31181,31136,31092,31048,31004,30959,30915,\n30871,30826,30782,30738,30693,30649,30604,30560,\n30515,30471,30426,30382,30337,30293,30248,30204,\n30159,30114,30070,30025,29980,29936,29891,29846,\n29801,29757,29712,29667,29622,29577,29533,29488,\n29443,29398,29353,29308,29263,29218,29173,29128,\n29083,29038,28993,28948,28903,28858,28812,28767,\n28722,28677,28632,28586,28541,28496,28451,28405,\n28360,28315,28269,28224,28179,28133,28088,28042,\n27997,27952,27906,27861,27815,27770,27724,27678,\n27633,27587,27542,27496,27450,27405,27359,27313,\n27268,27222,27176,27131,27085,27039,26993,26947,\n26902,26856,26810,26764,26718,26672,26626,26580,\n26534,26488,26442,26396,26350,26304,26258,26212,\n26166,26120,26074,26028,25982,25936,25889,25843,\n25797,25751,25705,25658,25612,25566,25520,25473,\n25427,25381,25334,25288,25241,25195,25149,25102,\n25056,25009,24963,24916,24870,24823,24777,24730,\n24684,24637,24591,24544,24497,24451,24404,24357,\n24311,24264,24217,24171,24124,24077,24030,23984,\n23937,23890,23843,23796,23750,23703,23656,23609,\n23562,23515,23468,23421,23374,23327,23280,23233,\n23186,23139,23092,23045,22998,22951,22904,22857,\n22810,22763,22716,22668,22621,22574,22527,22480,\n22433,22385,22338,22291,22243,22196,22149,22102,\n22054,22007,21960,21912,21865,21817,21770,21723,\n21675,21628,21580,21533,21485,21438,21390,21343,\n21295,21248,21200,21153,21105,21057,21010,20962,\n20915,20867,20819,20772,20724,20676,20629,20581,\n20533,20485,20438,20390,20342,20294,20246,20199,\n20151,20103,20055,20007,19959,19912,19864,19816,\n19768,19720,19672,19624,19576,19528,19480,19432,\n19384,19336,19288,19240,19192,19144,19096,19048,\n19000,18951,18903,18855,18807,18759,18711,18663,\n18614,18566,18518,18470,18421,18373,18325,18277,\n18228,18180,18132,18084,18035,17987,17939,17890,\n17842,17793,17745,17697,17648,17600,17551,17503,\n17455,17406,17358,17309,17261,17212,17164,17115,\n17067,17018,16970,16921,16872,16824,16775,16727,\n16678,16629,16581,16532,16484,16435,16386,16338,\n16289,16240,16191,16143,16094,16045,15997,15948,\n15899,15850,15802,15753,15704,15655,15606,15557,\n15509,15460,15411,15362,15313,15264,15215,15167,\n15118,15069,15020,14971,14922,14873,14824,14775,\n14726,14677,14628,14579,14530,14481,14432,14383,\n14334,14285,14236,14187,14138,14089,14040,13990,\n13941,13892,13843,13794,13745,13696,13646,13597,\n13548,13499,13450,13401,13351,13302,13253,13204,\n13154,13105,13056,13007,12957,12908,12859,12810,\n12760,12711,12662,12612,12563,12514,12464,12415,\n12366,12316,12267,12218,12168,12119,12069,12020,\n11970,11921,11872,11822,11773,11723,11674,11624,\n11575,11525,11476,11426,11377,11327,11278,11228,\n11179,11129,11080,11030,10981,10931,10882,10832,\n10782,10733,10683,10634,10584,10534,10485,10435,\n10386,10336,10286,10237,10187,10137,10088,10038,\n9988,9939,9889,9839,9790,9740,9690,9640,\n9591,9541,9491,9442,9392,9342,9292,9243,\n9193,9143,9093,9043,8994,8944,8894,8844,\n8794,8745,8695,8645,8595,8545,8496,8446,\n8396,8346,8296,8246,8196,8147,8097,8047,\n7997,7947,7897,7847,7797,7747,7697,7648,\n7598,7548,7498,7448,7398,7348,7298,7248,\n7198,7148,7098,7048,6998,6948,6898,6848,\n6798,6748,6698,6648,6598,6548,6498,6448,\n6398,6348,6298,6248,6198,6148,6098,6048,\n5998,5948,5898,5848,5798,5748,5697,5647,\n5597,5547,5497,5447,5397,5347,5297,5247,\n5197,5146,5096,5046,4996,4946,4896,4846,\n4796,4745,4695,4645,4595,4545,4495,4445,\n4394,4344,4294,4244,4194,4144,4093,4043,\n3993,3943,3893,3843,3792,3742,3692,3642,\n3592,3541,3491,3441,3391,3341,3291,3240,\n3190,3140,3090,3039,2989,2939,2889,2839,\n2788,2738,2688,2638,2587,2537,2487,2437,\n2387,2336,2286,2236,2186,2135,2085,2035,\n1985,1934,1884,1834,1784,1733,1683,1633,\n1583,1532,1482,1432,1382,1331,1281,1231,\n1181,1130,1080,1030,980,929,879,829,\n779,728,678,628,578,527,477,427,\n376,326,276,226,175,125,75,25,\n-25,-75,-125,-175,-226,-276,-326,-376,\n-427,-477,-527,-578,-628,-678,-728,-779,\n-829,-879,-929,-980,-1030,-1080,-1130,-1181,\n-1231,-1281,-1331,-1382,-1432,-1482,-1532,-1583,\n-1633,-1683,-1733,-1784,-1834,-1884,-1934,-1985,\n-2035,-2085,-2135,-2186,-2236,-2286,-2336,-2387,\n-2437,-2487,-2537,-2588,-2638,-2688,-2738,-2788,\n-2839,-2889,-2939,-2989,-3039,-3090,-3140,-3190,\n-3240,-3291,-3341,-3391,-3441,-3491,-3541,-3592,\n-3642,-3692,-3742,-3792,-3843,-3893,-3943,-3993,\n-4043,-4093,-4144,-4194,-4244,-4294,-4344,-4394,\n-4445,-4495,-4545,-4595,-4645,-4695,-4745,-4796,\n-4846,-4896,-4946,-4996,-5046,-5096,-5146,-5197,\n-5247,-5297,-5347,-5397,-5447,-5497,-5547,-5597,\n-5647,-5697,-5748,-5798,-5848,-5898,-5948,-5998,\n-6048,-6098,-6148,-6198,-6248,-6298,-6348,-6398,\n-6448,-6498,-6548,-6598,-6648,-6698,-6748,-6798,\n-6848,-6898,-6948,-6998,-7048,-7098,-7148,-7198,\n-7248,-7298,-7348,-7398,-7448,-7498,-7548,-7598,\n-7648,-7697,-7747,-7797,-7847,-7897,-7947,-7997,\n-8047,-8097,-8147,-8196,-8246,-8296,-8346,-8396,\n-8446,-8496,-8545,-8595,-8645,-8695,-8745,-8794,\n-8844,-8894,-8944,-8994,-9043,-9093,-9143,-9193,\n-9243,-9292,-9342,-9392,-9442,-9491,-9541,-9591,\n-9640,-9690,-9740,-9790,-9839,-9889,-9939,-9988,\n-10038,-10088,-10137,-10187,-10237,-10286,-10336,-10386,\n-10435,-10485,-10534,-10584,-10634,-10683,-10733,-10782,\n-10832,-10882,-10931,-10981,-11030,-11080,-11129,-11179,\n-11228,-11278,-11327,-11377,-11426,-11476,-11525,-11575,\n-11624,-11674,-11723,-11773,-11822,-11872,-11921,-11970,\n-12020,-12069,-12119,-12168,-12218,-12267,-12316,-12366,\n-12415,-12464,-12514,-12563,-12612,-12662,-12711,-12760,\n-12810,-12859,-12908,-12957,-13007,-13056,-13105,-13154,\n-13204,-13253,-13302,-13351,-13401,-13450,-13499,-13548,\n-13597,-13647,-13696,-13745,-13794,-13843,-13892,-13941,\n-13990,-14040,-14089,-14138,-14187,-14236,-14285,-14334,\n-14383,-14432,-14481,-14530,-14579,-14628,-14677,-14726,\n-14775,-14824,-14873,-14922,-14971,-15020,-15069,-15118,\n-15167,-15215,-15264,-15313,-15362,-15411,-15460,-15509,\n-15557,-15606,-15655,-15704,-15753,-15802,-15850,-15899,\n-15948,-15997,-16045,-16094,-16143,-16191,-16240,-16289,\n-16338,-16386,-16435,-16484,-16532,-16581,-16629,-16678,\n-16727,-16775,-16824,-16872,-16921,-16970,-17018,-17067,\n-17115,-17164,-17212,-17261,-17309,-17358,-17406,-17455,\n-17503,-17551,-17600,-17648,-17697,-17745,-17793,-17842,\n-17890,-17939,-17987,-18035,-18084,-18132,-18180,-18228,\n-18277,-18325,-18373,-18421,-18470,-18518,-18566,-18614,\n-18663,-18711,-18759,-18807,-18855,-18903,-18951,-19000,\n-19048,-19096,-19144,-19192,-19240,-19288,-19336,-19384,\n-19432,-19480,-19528,-19576,-19624,-19672,-19720,-19768,\n-19816,-19864,-19912,-19959,-20007,-20055,-20103,-20151,\n-20199,-20246,-20294,-20342,-20390,-20438,-20485,-20533,\n-20581,-20629,-20676,-20724,-20772,-20819,-20867,-20915,\n-20962,-21010,-21057,-21105,-21153,-21200,-21248,-21295,\n-21343,-21390,-21438,-21485,-21533,-21580,-21628,-21675,\n-21723,-21770,-21817,-21865,-21912,-21960,-22007,-22054,\n-22102,-22149,-22196,-22243,-22291,-22338,-22385,-22433,\n-22480,-22527,-22574,-22621,-22668,-22716,-22763,-22810,\n-22857,-22904,-22951,-22998,-23045,-23092,-23139,-23186,\n-23233,-23280,-23327,-23374,-23421,-23468,-23515,-23562,\n-23609,-23656,-23703,-23750,-23796,-23843,-23890,-23937,\n-23984,-24030,-24077,-24124,-24171,-24217,-24264,-24311,\n-24357,-24404,-24451,-24497,-24544,-24591,-24637,-24684,\n-24730,-24777,-24823,-24870,-24916,-24963,-25009,-25056,\n-25102,-25149,-25195,-25241,-25288,-25334,-25381,-25427,\n-25473,-25520,-25566,-25612,-25658,-25705,-25751,-25797,\n-25843,-25889,-25936,-25982,-26028,-26074,-26120,-26166,\n-26212,-26258,-26304,-26350,-26396,-26442,-26488,-26534,\n-26580,-26626,-26672,-26718,-26764,-26810,-26856,-26902,\n-26947,-26993,-27039,-27085,-27131,-27176,-27222,-27268,\n-27313,-27359,-27405,-27450,-27496,-27542,-27587,-27633,\n-27678,-27724,-27770,-27815,-27861,-27906,-27952,-27997,\n-28042,-28088,-28133,-28179,-28224,-28269,-28315,-28360,\n-28405,-28451,-28496,-28541,-28586,-28632,-28677,-28722,\n-28767,-28812,-28858,-28903,-28948,-28993,-29038,-29083,\n-29128,-29173,-29218,-29263,-29308,-29353,-29398,-29443,\n-29488,-29533,-29577,-29622,-29667,-29712,-29757,-29801,\n-29846,-29891,-29936,-29980,-30025,-30070,-30114,-30159,\n-30204,-30248,-30293,-30337,-30382,-30426,-30471,-30515,\n-30560,-30604,-30649,-30693,-30738,-30782,-30826,-30871,\n-30915,-30959,-31004,-31048,-31092,-31136,-31181,-31225,\n-31269,-31313,-31357,-31402,-31446,-31490,-31534,-31578,\n-31622,-31666,-31710,-31754,-31798,-31842,-31886,-31930,\n-31974,-32017,-32061,-32105,-32149,-32193,-32236,-32280,\n-32324,-32368,-32411,-32455,-32499,-32542,-32586,-32630,\n-32673,-32717,-32760,-32804,-32847,-32891,-32934,-32978,\n-33021,-33065,-33108,-33151,-33195,-33238,-33281,-33325,\n-33368,-33411,-33454,-33498,-33541,-33584,-33627,-33670,\n-33713,-33756,-33799,-33843,-33886,-33929,-33972,-34015,\n-34057,-34100,-34143,-34186,-34229,-34272,-34315,-34358,\n-34400,-34443,-34486,-34529,-34571,-34614,-34657,-34699,\n-34742,-34785,-34827,-34870,-34912,-34955,-34997,-35040,\n-35082,-35125,-35167,-35210,-35252,-35294,-35337,-35379,\n-35421,-35464,-35506,-35548,-35590,-35633,-35675,-35717,\n-35759,-35801,-35843,-35885,-35927,-35969,-36011,-36053,\n-36095,-36137,-36179,-36221,-36263,-36305,-36347,-36388,\n-36430,-36472,-36514,-36555,-36597,-36639,-36681,-36722,\n-36764,-36805,-36847,-36889,-36930,-36972,-37013,-37055,\n-37096,-37137,-37179,-37220,-37262,-37303,-37344,-37386,\n-37427,-37468,-37509,-37551,-37592,-37633,-37674,-37715,\n-37756,-37797,-37838,-37879,-37920,-37961,-38002,-38043,\n-38084,-38125,-38166,-38207,-38248,-38288,-38329,-38370,\n-38411,-38451,-38492,-38533,-38573,-38614,-38655,-38695,\n-38736,-38776,-38817,-38857,-38898,-38938,-38979,-39019,\n-39059,-39100,-39140,-39180,-39221,-39261,-39301,-39341,\n-39382,-39422,-39462,-39502,-39542,-39582,-39622,-39662,\n-39702,-39742,-39782,-39822,-39862,-39902,-39942,-39982,\n-40021,-40061,-40101,-40141,-40180,-40220,-40260,-40299,\n-40339,-40379,-40418,-40458,-40497,-40537,-40576,-40616,\n-40655,-40695,-40734,-40773,-40813,-40852,-40891,-40931,\n-40970,-41009,-41048,-41087,-41127,-41166,-41205,-41244,\n-41283,-41322,-41361,-41400,-41439,-41478,-41517,-41556,\n-41595,-41633,-41672,-41711,-41750,-41788,-41827,-41866,\n-41904,-41943,-41982,-42020,-42059,-42097,-42136,-42174,\n-42213,-42251,-42290,-42328,-42366,-42405,-42443,-42481,\n-42520,-42558,-42596,-42634,-42672,-42711,-42749,-42787,\n-42825,-42863,-42901,-42939,-42977,-43015,-43053,-43091,\n-43128,-43166,-43204,-43242,-43280,-43317,-43355,-43393,\n-43430,-43468,-43506,-43543,-43581,-43618,-43656,-43693,\n-43731,-43768,-43806,-43843,-43880,-43918,-43955,-43992,\n-44029,-44067,-44104,-44141,-44178,-44215,-44252,-44289,\n-44326,-44363,-44400,-44437,-44474,-44511,-44548,-44585,\n-44622,-44659,-44695,-44732,-44769,-44806,-44842,-44879,\n-44915,-44952,-44989,-45025,-45062,-45098,-45135,-45171,\n-45207,-45244,-45280,-45316,-45353,-45389,-45425,-45462,\n-45498,-45534,-45570,-45606,-45642,-45678,-45714,-45750,\n-45786,-45822,-45858,-45894,-45930,-45966,-46002,-46037,\n-46073,-46109,-46145,-46180,-46216,-46252,-46287,-46323,\n-46358,-46394,-46429,-46465,-46500,-46536,-46571,-46606,\n-46642,-46677,-46712,-46747,-46783,-46818,-46853,-46888,\n-46923,-46958,-46993,-47028,-47063,-47098,-47133,-47168,\n-47203,-47238,-47273,-47308,-47342,-47377,-47412,-47446,\n-47481,-47516,-47550,-47585,-47619,-47654,-47688,-47723,\n-47757,-47792,-47826,-47860,-47895,-47929,-47963,-47998,\n-48032,-48066,-48100,-48134,-48168,-48202,-48236,-48271,\n-48304,-48338,-48372,-48406,-48440,-48474,-48508,-48542,\n-48575,-48609,-48643,-48676,-48710,-48744,-48777,-48811,\n-48844,-48878,-48911,-48945,-48978,-49012,-49045,-49078,\n-49112,-49145,-49178,-49211,-49244,-49278,-49311,-49344,\n-49377,-49410,-49443,-49476,-49509,-49542,-49575,-49608,\n-49640,-49673,-49706,-49739,-49771,-49804,-49837,-49869,\n-49902,-49935,-49967,-50000,-50032,-50065,-50097,-50129,\n-50162,-50194,-50226,-50259,-50291,-50323,-50355,-50387,\n-50420,-50452,-50484,-50516,-50548,-50580,-50612,-50644,\n-50675,-50707,-50739,-50771,-50803,-50834,-50866,-50898,\n-50929,-50961,-50993,-51024,-51056,-51087,-51119,-51150,\n-51182,-51213,-51244,-51276,-51307,-51338,-51369,-51401,\n-51432,-51463,-51494,-51525,-51556,-51587,-51618,-51649,\n-51680,-51711,-51742,-51773,-51803,-51834,-51865,-51896,\n-51926,-51957,-51988,-52018,-52049,-52079,-52110,-52140,\n-52171,-52201,-52231,-52262,-52292,-52322,-52353,-52383,\n-52413,-52443,-52473,-52503,-52534,-52564,-52594,-52624,\n-52653,-52683,-52713,-52743,-52773,-52803,-52832,-52862,\n-52892,-52922,-52951,-52981,-53010,-53040,-53069,-53099,\n-53128,-53158,-53187,-53216,-53246,-53275,-53304,-53334,\n-53363,-53392,-53421,-53450,-53479,-53508,-53537,-53566,\n-53595,-53624,-53653,-53682,-53711,-53739,-53768,-53797,\n-53826,-53854,-53883,-53911,-53940,-53969,-53997,-54026,\n-54054,-54082,-54111,-54139,-54167,-54196,-54224,-54252,\n-54280,-54308,-54337,-54365,-54393,-54421,-54449,-54477,\n-54505,-54533,-54560,-54588,-54616,-54644,-54672,-54699,\n-54727,-54755,-54782,-54810,-54837,-54865,-54892,-54920,\n-54947,-54974,-55002,-55029,-55056,-55084,-55111,-55138,\n-55165,-55192,-55219,-55246,-55274,-55300,-55327,-55354,\n-55381,-55408,-55435,-55462,-55489,-55515,-55542,-55569,\n-55595,-55622,-55648,-55675,-55701,-55728,-55754,-55781,\n-55807,-55833,-55860,-55886,-55912,-55938,-55965,-55991,\n-56017,-56043,-56069,-56095,-56121,-56147,-56173,-56199,\n-56225,-56250,-56276,-56302,-56328,-56353,-56379,-56404,\n-56430,-56456,-56481,-56507,-56532,-56557,-56583,-56608,\n-56633,-56659,-56684,-56709,-56734,-56760,-56785,-56810,\n-56835,-56860,-56885,-56910,-56935,-56959,-56984,-57009,\n-57034,-57059,-57083,-57108,-57133,-57157,-57182,-57206,\n-57231,-57255,-57280,-57304,-57329,-57353,-57377,-57402,\n-57426,-57450,-57474,-57498,-57522,-57546,-57570,-57594,\n-57618,-57642,-57666,-57690,-57714,-57738,-57762,-57785,\n-57809,-57833,-57856,-57880,-57903,-57927,-57950,-57974,\n-57997,-58021,-58044,-58067,-58091,-58114,-58137,-58160,\n-58183,-58207,-58230,-58253,-58276,-58299,-58322,-58345,\n-58367,-58390,-58413,-58436,-58459,-58481,-58504,-58527,\n-58549,-58572,-58594,-58617,-58639,-58662,-58684,-58706,\n-58729,-58751,-58773,-58795,-58818,-58840,-58862,-58884,\n-58906,-58928,-58950,-58972,-58994,-59016,-59038,-59059,\n-59081,-59103,-59125,-59146,-59168,-59190,-59211,-59233,\n-59254,-59276,-59297,-59318,-59340,-59361,-59382,-59404,\n-59425,-59446,-59467,-59488,-59509,-59530,-59551,-59572,\n-59593,-59614,-59635,-59656,-59677,-59697,-59718,-59739,\n-59759,-59780,-59801,-59821,-59842,-59862,-59883,-59903,\n-59923,-59944,-59964,-59984,-60004,-60025,-60045,-60065,\n-60085,-60105,-60125,-60145,-60165,-60185,-60205,-60225,\n-60244,-60264,-60284,-60304,-60323,-60343,-60363,-60382,\n-60402,-60421,-60441,-60460,-60479,-60499,-60518,-60537,\n-60556,-60576,-60595,-60614,-60633,-60652,-60671,-60690,\n-60709,-60728,-60747,-60766,-60785,-60803,-60822,-60841,\n-60859,-60878,-60897,-60915,-60934,-60952,-60971,-60989,\n-61007,-61026,-61044,-61062,-61081,-61099,-61117,-61135,\n-61153,-61171,-61189,-61207,-61225,-61243,-61261,-61279,\n-61297,-61314,-61332,-61350,-61367,-61385,-61403,-61420,\n-61438,-61455,-61473,-61490,-61507,-61525,-61542,-61559,\n-61577,-61594,-61611,-61628,-61645,-61662,-61679,-61696,\n-61713,-61730,-61747,-61764,-61780,-61797,-61814,-61831,\n-61847,-61864,-61880,-61897,-61913,-61930,-61946,-61963,\n-61979,-61995,-62012,-62028,-62044,-62060,-62076,-62092,\n-62108,-62125,-62141,-62156,-62172,-62188,-62204,-62220,\n-62236,-62251,-62267,-62283,-62298,-62314,-62329,-62345,\n-62360,-62376,-62391,-62407,-62422,-62437,-62453,-62468,\n-62483,-62498,-62513,-62528,-62543,-62558,-62573,-62588,\n-62603,-62618,-62633,-62648,-62662,-62677,-62692,-62706,\n-62721,-62735,-62750,-62764,-62779,-62793,-62808,-62822,\n-62836,-62850,-62865,-62879,-62893,-62907,-62921,-62935,\n-62949,-62963,-62977,-62991,-63005,-63019,-63032,-63046,\n-63060,-63074,-63087,-63101,-63114,-63128,-63141,-63155,\n-63168,-63182,-63195,-63208,-63221,-63235,-63248,-63261,\n-63274,-63287,-63300,-63313,-63326,-63339,-63352,-63365,\n-63378,-63390,-63403,-63416,-63429,-63441,-63454,-63466,\n-63479,-63491,-63504,-63516,-63528,-63541,-63553,-63565,\n-63578,-63590,-63602,-63614,-63626,-63638,-63650,-63662,\n-63674,-63686,-63698,-63709,-63721,-63733,-63745,-63756,\n-63768,-63779,-63791,-63803,-63814,-63825,-63837,-63848,\n-63859,-63871,-63882,-63893,-63904,-63915,-63927,-63938,\n-63949,-63960,-63971,-63981,-63992,-64003,-64014,-64025,\n-64035,-64046,-64057,-64067,-64078,-64088,-64099,-64109,\n-64120,-64130,-64140,-64151,-64161,-64171,-64181,-64192,\n-64202,-64212,-64222,-64232,-64242,-64252,-64261,-64271,\n-64281,-64291,-64301,-64310,-64320,-64330,-64339,-64349,\n-64358,-64368,-64377,-64387,-64396,-64405,-64414,-64424,\n-64433,-64442,-64451,-64460,-64469,-64478,-64487,-64496,\n-64505,-64514,-64523,-64532,-64540,-64549,-64558,-64566,\n-64575,-64584,-64592,-64601,-64609,-64617,-64626,-64634,\n-64642,-64651,-64659,-64667,-64675,-64683,-64691,-64699,\n-64707,-64715,-64723,-64731,-64739,-64747,-64754,-64762,\n-64770,-64777,-64785,-64793,-64800,-64808,-64815,-64822,\n-64830,-64837,-64844,-64852,-64859,-64866,-64873,-64880,\n-64887,-64895,-64902,-64908,-64915,-64922,-64929,-64936,\n-64943,-64949,-64956,-64963,-64969,-64976,-64982,-64989,\n-64995,-65002,-65008,-65015,-65021,-65027,-65033,-65040,\n-65046,-65052,-65058,-65064,-65070,-65076,-65082,-65088,\n-65094,-65099,-65105,-65111,-65117,-65122,-65128,-65133,\n-65139,-65144,-65150,-65155,-65161,-65166,-65171,-65177,\n-65182,-65187,-65192,-65197,-65202,-65207,-65212,-65217,\n-65222,-65227,-65232,-65237,-65242,-65246,-65251,-65256,\n-65260,-65265,-65270,-65274,-65279,-65283,-65287,-65292,\n-65296,-65300,-65305,-65309,-65313,-65317,-65321,-65325,\n-65329,-65333,-65337,-65341,-65345,-65349,-65352,-65356,\n-65360,-65363,-65367,-65371,-65374,-65378,-65381,-65385,\n-65388,-65391,-65395,-65398,-65401,-65404,-65408,-65411,\n-65414,-65417,-65420,-65423,-65426,-65429,-65431,-65434,\n-65437,-65440,-65442,-65445,-65448,-65450,-65453,-65455,\n-65458,-65460,-65463,-65465,-65467,-65470,-65472,-65474,\n-65476,-65478,-65480,-65482,-65484,-65486,-65488,-65490,\n-65492,-65494,-65496,-65497,-65499,-65501,-65502,-65504,\n-65505,-65507,-65508,-65510,-65511,-65513,-65514,-65515,\n-65516,-65518,-65519,-65520,-65521,-65522,-65523,-65524,\n-65525,-65526,-65527,-65527,-65528,-65529,-65530,-65530,\n-65531,-65531,-65532,-65532,-65533,-65533,-65534,-65534,\n-65534,-65535,-65535,-65535,-65535,-65535,-65535,-65535,\n-65535,-65535,-65535,-65535,-65535,-65535,-65535,-65534,\n-65534,-65534,-65533,-65533,-65532,-65532,-65531,-65531,\n-65530,-65530,-65529,-65528,-65527,-65527,-65526,-65525,\n-65524,-65523,-65522,-65521,-65520,-65519,-65518,-65516,\n-65515,-65514,-65513,-65511,-65510,-65508,-65507,-65505,\n-65504,-65502,-65501,-65499,-65497,-65496,-65494,-65492,\n-65490,-65488,-65486,-65484,-65482,-65480,-65478,-65476,\n-65474,-65472,-65470,-65467,-65465,-65463,-65460,-65458,\n-65455,-65453,-65450,-65448,-65445,-65442,-65440,-65437,\n-65434,-65431,-65429,-65426,-65423,-65420,-65417,-65414,\n-65411,-65408,-65404,-65401,-65398,-65395,-65391,-65388,\n-65385,-65381,-65378,-65374,-65371,-65367,-65363,-65360,\n-65356,-65352,-65349,-65345,-65341,-65337,-65333,-65329,\n-65325,-65321,-65317,-65313,-65309,-65305,-65300,-65296,\n-65292,-65287,-65283,-65279,-65274,-65270,-65265,-65260,\n-65256,-65251,-65246,-65242,-65237,-65232,-65227,-65222,\n-65217,-65212,-65207,-65202,-65197,-65192,-65187,-65182,\n-65177,-65171,-65166,-65161,-65155,-65150,-65144,-65139,\n-65133,-65128,-65122,-65117,-65111,-65105,-65099,-65094,\n-65088,-65082,-65076,-65070,-65064,-65058,-65052,-65046,\n-65040,-65033,-65027,-65021,-65015,-65008,-65002,-64995,\n-64989,-64982,-64976,-64969,-64963,-64956,-64949,-64943,\n-64936,-64929,-64922,-64915,-64908,-64902,-64895,-64887,\n-64880,-64873,-64866,-64859,-64852,-64844,-64837,-64830,\n-64822,-64815,-64808,-64800,-64793,-64785,-64777,-64770,\n-64762,-64754,-64747,-64739,-64731,-64723,-64715,-64707,\n-64699,-64691,-64683,-64675,-64667,-64659,-64651,-64642,\n-64634,-64626,-64617,-64609,-64601,-64592,-64584,-64575,\n-64566,-64558,-64549,-64540,-64532,-64523,-64514,-64505,\n-64496,-64487,-64478,-64469,-64460,-64451,-64442,-64433,\n-64424,-64414,-64405,-64396,-64387,-64377,-64368,-64358,\n-64349,-64339,-64330,-64320,-64310,-64301,-64291,-64281,\n-64271,-64261,-64252,-64242,-64232,-64222,-64212,-64202,\n-64192,-64181,-64171,-64161,-64151,-64140,-64130,-64120,\n-64109,-64099,-64088,-64078,-64067,-64057,-64046,-64035,\n-64025,-64014,-64003,-63992,-63981,-63971,-63960,-63949,\n-63938,-63927,-63915,-63904,-63893,-63882,-63871,-63859,\n-63848,-63837,-63825,-63814,-63803,-63791,-63779,-63768,\n-63756,-63745,-63733,-63721,-63709,-63698,-63686,-63674,\n-63662,-63650,-63638,-63626,-63614,-63602,-63590,-63578,\n-63565,-63553,-63541,-63528,-63516,-63504,-63491,-63479,\n-63466,-63454,-63441,-63429,-63416,-63403,-63390,-63378,\n-63365,-63352,-63339,-63326,-63313,-63300,-63287,-63274,\n-63261,-63248,-63235,-63221,-63208,-63195,-63182,-63168,\n-63155,-63141,-63128,-63114,-63101,-63087,-63074,-63060,\n-63046,-63032,-63019,-63005,-62991,-62977,-62963,-62949,\n-62935,-62921,-62907,-62893,-62879,-62865,-62850,-62836,\n-62822,-62808,-62793,-62779,-62764,-62750,-62735,-62721,\n-62706,-62692,-62677,-62662,-62648,-62633,-62618,-62603,\n-62588,-62573,-62558,-62543,-62528,-62513,-62498,-62483,\n-62468,-62453,-62437,-62422,-62407,-62391,-62376,-62360,\n-62345,-62329,-62314,-62298,-62283,-62267,-62251,-62236,\n-62220,-62204,-62188,-62172,-62156,-62141,-62125,-62108,\n-62092,-62076,-62060,-62044,-62028,-62012,-61995,-61979,\n-61963,-61946,-61930,-61913,-61897,-61880,-61864,-61847,\n-61831,-61814,-61797,-61780,-61764,-61747,-61730,-61713,\n-61696,-61679,-61662,-61645,-61628,-61611,-61594,-61577,\n-61559,-61542,-61525,-61507,-61490,-61473,-61455,-61438,\n-61420,-61403,-61385,-61367,-61350,-61332,-61314,-61297,\n-61279,-61261,-61243,-61225,-61207,-61189,-61171,-61153,\n-61135,-61117,-61099,-61081,-61062,-61044,-61026,-61007,\n-60989,-60971,-60952,-60934,-60915,-60897,-60878,-60859,\n-60841,-60822,-60803,-60785,-60766,-60747,-60728,-60709,\n-60690,-60671,-60652,-60633,-60614,-60595,-60576,-60556,\n-60537,-60518,-60499,-60479,-60460,-60441,-60421,-60402,\n-60382,-60363,-60343,-60323,-60304,-60284,-60264,-60244,\n-60225,-60205,-60185,-60165,-60145,-60125,-60105,-60085,\n-60065,-60045,-60025,-60004,-59984,-59964,-59944,-59923,\n-59903,-59883,-59862,-59842,-59821,-59801,-59780,-59759,\n-59739,-59718,-59697,-59677,-59656,-59635,-59614,-59593,\n-59572,-59551,-59530,-59509,-59488,-59467,-59446,-59425,\n-59404,-59382,-59361,-59340,-59318,-59297,-59276,-59254,\n-59233,-59211,-59189,-59168,-59146,-59125,-59103,-59081,\n-59059,-59038,-59016,-58994,-58972,-58950,-58928,-58906,\n-58884,-58862,-58840,-58818,-58795,-58773,-58751,-58729,\n-58706,-58684,-58662,-58639,-58617,-58594,-58572,-58549,\n-58527,-58504,-58481,-58459,-58436,-58413,-58390,-58367,\n-58345,-58322,-58299,-58276,-58253,-58230,-58207,-58183,\n-58160,-58137,-58114,-58091,-58067,-58044,-58021,-57997,\n-57974,-57950,-57927,-57903,-57880,-57856,-57833,-57809,\n-57785,-57762,-57738,-57714,-57690,-57666,-57642,-57618,\n-57594,-57570,-57546,-57522,-57498,-57474,-57450,-57426,\n-57402,-57377,-57353,-57329,-57304,-57280,-57255,-57231,\n-57206,-57182,-57157,-57133,-57108,-57083,-57059,-57034,\n-57009,-56984,-56959,-56935,-56910,-56885,-56860,-56835,\n-56810,-56785,-56760,-56734,-56709,-56684,-56659,-56633,\n-56608,-56583,-56557,-56532,-56507,-56481,-56456,-56430,\n-56404,-56379,-56353,-56328,-56302,-56276,-56250,-56225,\n-56199,-56173,-56147,-56121,-56095,-56069,-56043,-56017,\n-55991,-55965,-55938,-55912,-55886,-55860,-55833,-55807,\n-55781,-55754,-55728,-55701,-55675,-55648,-55622,-55595,\n-55569,-55542,-55515,-55489,-55462,-55435,-55408,-55381,\n-55354,-55327,-55300,-55274,-55246,-55219,-55192,-55165,\n-55138,-55111,-55084,-55056,-55029,-55002,-54974,-54947,\n-54920,-54892,-54865,-54837,-54810,-54782,-54755,-54727,\n-54699,-54672,-54644,-54616,-54588,-54560,-54533,-54505,\n-54477,-54449,-54421,-54393,-54365,-54337,-54308,-54280,\n-54252,-54224,-54196,-54167,-54139,-54111,-54082,-54054,\n-54026,-53997,-53969,-53940,-53911,-53883,-53854,-53826,\n-53797,-53768,-53739,-53711,-53682,-53653,-53624,-53595,\n-53566,-53537,-53508,-53479,-53450,-53421,-53392,-53363,\n-53334,-53304,-53275,-53246,-53216,-53187,-53158,-53128,\n-53099,-53069,-53040,-53010,-52981,-52951,-52922,-52892,\n-52862,-52832,-52803,-52773,-52743,-52713,-52683,-52653,\n-52624,-52594,-52564,-52534,-52503,-52473,-52443,-52413,\n-52383,-52353,-52322,-52292,-52262,-52231,-52201,-52171,\n-52140,-52110,-52079,-52049,-52018,-51988,-51957,-51926,\n-51896,-51865,-51834,-51803,-51773,-51742,-51711,-51680,\n-51649,-51618,-51587,-51556,-51525,-51494,-51463,-51432,\n-51401,-51369,-51338,-51307,-51276,-51244,-51213,-51182,\n-51150,-51119,-51087,-51056,-51024,-50993,-50961,-50929,\n-50898,-50866,-50834,-50803,-50771,-50739,-50707,-50675,\n-50644,-50612,-50580,-50548,-50516,-50484,-50452,-50420,\n-50387,-50355,-50323,-50291,-50259,-50226,-50194,-50162,\n-50129,-50097,-50065,-50032,-50000,-49967,-49935,-49902,\n-49869,-49837,-49804,-49771,-49739,-49706,-49673,-49640,\n-49608,-49575,-49542,-49509,-49476,-49443,-49410,-49377,\n-49344,-49311,-49278,-49244,-49211,-49178,-49145,-49112,\n-49078,-49045,-49012,-48978,-48945,-48911,-48878,-48844,\n-48811,-48777,-48744,-48710,-48676,-48643,-48609,-48575,\n-48542,-48508,-48474,-48440,-48406,-48372,-48338,-48305,\n-48271,-48237,-48202,-48168,-48134,-48100,-48066,-48032,\n-47998,-47963,-47929,-47895,-47860,-47826,-47792,-47757,\n-47723,-47688,-47654,-47619,-47585,-47550,-47516,-47481,\n-47446,-47412,-47377,-47342,-47307,-47273,-47238,-47203,\n-47168,-47133,-47098,-47063,-47028,-46993,-46958,-46923,\n-46888,-46853,-46818,-46783,-46747,-46712,-46677,-46642,\n-46606,-46571,-46536,-46500,-46465,-46429,-46394,-46358,\n-46323,-46287,-46251,-46216,-46180,-46145,-46109,-46073,\n-46037,-46002,-45966,-45930,-45894,-45858,-45822,-45786,\n-45750,-45714,-45678,-45642,-45606,-45570,-45534,-45498,\n-45462,-45425,-45389,-45353,-45316,-45280,-45244,-45207,\n-45171,-45135,-45098,-45062,-45025,-44989,-44952,-44915,\n-44879,-44842,-44806,-44769,-44732,-44695,-44659,-44622,\n-44585,-44548,-44511,-44474,-44437,-44400,-44363,-44326,\n-44289,-44252,-44215,-44178,-44141,-44104,-44067,-44029,\n-43992,-43955,-43918,-43880,-43843,-43806,-43768,-43731,\n-43693,-43656,-43618,-43581,-43543,-43506,-43468,-43430,\n-43393,-43355,-43317,-43280,-43242,-43204,-43166,-43128,\n-43091,-43053,-43015,-42977,-42939,-42901,-42863,-42825,\n-42787,-42749,-42711,-42672,-42634,-42596,-42558,-42520,\n-42481,-42443,-42405,-42366,-42328,-42290,-42251,-42213,\n-42174,-42136,-42097,-42059,-42020,-41982,-41943,-41904,\n-41866,-41827,-41788,-41750,-41711,-41672,-41633,-41595,\n-41556,-41517,-41478,-41439,-41400,-41361,-41322,-41283,\n-41244,-41205,-41166,-41127,-41087,-41048,-41009,-40970,\n-40931,-40891,-40852,-40813,-40773,-40734,-40695,-40655,\n-40616,-40576,-40537,-40497,-40458,-40418,-40379,-40339,\n-40299,-40260,-40220,-40180,-40141,-40101,-40061,-40021,\n-39982,-39942,-39902,-39862,-39822,-39782,-39742,-39702,\n-39662,-39622,-39582,-39542,-39502,-39462,-39422,-39382,\n-39341,-39301,-39261,-39221,-39180,-39140,-39100,-39059,\n-39019,-38979,-38938,-38898,-38857,-38817,-38776,-38736,\n-38695,-38655,-38614,-38573,-38533,-38492,-38451,-38411,\n-38370,-38329,-38288,-38248,-38207,-38166,-38125,-38084,\n-38043,-38002,-37961,-37920,-37879,-37838,-37797,-37756,\n-37715,-37674,-37633,-37592,-37550,-37509,-37468,-37427,\n-37386,-37344,-37303,-37262,-37220,-37179,-37137,-37096,\n-37055,-37013,-36972,-36930,-36889,-36847,-36805,-36764,\n-36722,-36681,-36639,-36597,-36556,-36514,-36472,-36430,\n-36388,-36347,-36305,-36263,-36221,-36179,-36137,-36095,\n-36053,-36011,-35969,-35927,-35885,-35843,-35801,-35759,\n-35717,-35675,-35633,-35590,-35548,-35506,-35464,-35421,\n-35379,-35337,-35294,-35252,-35210,-35167,-35125,-35082,\n-35040,-34997,-34955,-34912,-34870,-34827,-34785,-34742,\n-34699,-34657,-34614,-34571,-34529,-34486,-34443,-34400,\n-34358,-34315,-34272,-34229,-34186,-34143,-34100,-34057,\n-34015,-33972,-33929,-33886,-33843,-33799,-33756,-33713,\n-33670,-33627,-33584,-33541,-33498,-33454,-33411,-33368,\n-33325,-33281,-33238,-33195,-33151,-33108,-33065,-33021,\n-32978,-32934,-32891,-32847,-32804,-32760,-32717,-32673,\n-32630,-32586,-32542,-32499,-32455,-32411,-32368,-32324,\n-32280,-32236,-32193,-32149,-32105,-32061,-32017,-31974,\n-31930,-31886,-31842,-31798,-31754,-31710,-31666,-31622,\n-31578,-31534,-31490,-31446,-31402,-31357,-31313,-31269,\n-31225,-31181,-31136,-31092,-31048,-31004,-30959,-30915,\n-30871,-30826,-30782,-30738,-30693,-30649,-30604,-30560,\n-30515,-30471,-30426,-30382,-30337,-30293,-30248,-30204,\n-30159,-30114,-30070,-30025,-29980,-29936,-29891,-29846,\n-29801,-29757,-29712,-29667,-29622,-29577,-29533,-29488,\n-29443,-29398,-29353,-29308,-29263,-29218,-29173,-29128,\n-29083,-29038,-28993,-28948,-28903,-28858,-28812,-28767,\n-28722,-28677,-28632,-28586,-28541,-28496,-28451,-28405,\n-28360,-28315,-28269,-28224,-28179,-28133,-28088,-28042,\n-27997,-27952,-27906,-27861,-27815,-27770,-27724,-27678,\n-27633,-27587,-27542,-27496,-27450,-27405,-27359,-27313,\n-27268,-27222,-27176,-27131,-27085,-27039,-26993,-26947,\n-26902,-26856,-26810,-26764,-26718,-26672,-26626,-26580,\n-26534,-26488,-26442,-26396,-26350,-26304,-26258,-26212,\n-26166,-26120,-26074,-26028,-25982,-25936,-25889,-25843,\n-25797,-25751,-25705,-25658,-25612,-25566,-25520,-25473,\n-25427,-25381,-25334,-25288,-25241,-25195,-25149,-25102,\n-25056,-25009,-24963,-24916,-24870,-24823,-24777,-24730,\n-24684,-24637,-24591,-24544,-24497,-24451,-24404,-24357,\n-24311,-24264,-24217,-24171,-24124,-24077,-24030,-23984,\n-23937,-23890,-23843,-23796,-23750,-23703,-23656,-23609,\n-23562,-23515,-23468,-23421,-23374,-23327,-23280,-23233,\n-23186,-23139,-23092,-23045,-22998,-22951,-22904,-22857,\n-22810,-22763,-22716,-22668,-22621,-22574,-22527,-22480,\n-22432,-22385,-22338,-22291,-22243,-22196,-22149,-22102,\n-22054,-22007,-21960,-21912,-21865,-21817,-21770,-21723,\n-21675,-21628,-21580,-21533,-21485,-21438,-21390,-21343,\n-21295,-21248,-21200,-21153,-21105,-21057,-21010,-20962,\n-20915,-20867,-20819,-20772,-20724,-20676,-20629,-20581,\n-20533,-20485,-20438,-20390,-20342,-20294,-20246,-20199,\n-20151,-20103,-20055,-20007,-19959,-19912,-19864,-19816,\n-19768,-19720,-19672,-19624,-19576,-19528,-19480,-19432,\n-19384,-19336,-19288,-19240,-19192,-19144,-19096,-19048,\n-19000,-18951,-18903,-18855,-18807,-18759,-18711,-18663,\n-18614,-18566,-18518,-18470,-18421,-18373,-18325,-18277,\n-18228,-18180,-18132,-18084,-18035,-17987,-17939,-17890,\n-17842,-17793,-17745,-17697,-17648,-17600,-17551,-17503,\n-17455,-17406,-17358,-17309,-17261,-17212,-17164,-17115,\n-17067,-17018,-16970,-16921,-16872,-16824,-16775,-16727,\n-16678,-16629,-16581,-16532,-16484,-16435,-16386,-16338,\n-16289,-16240,-16191,-16143,-16094,-16045,-15997,-15948,\n-15899,-15850,-15802,-15753,-15704,-15655,-15606,-15557,\n-15509,-15460,-15411,-15362,-15313,-15264,-15215,-15167,\n-15118,-15069,-15020,-14971,-14922,-14873,-14824,-14775,\n-14726,-14677,-14628,-14579,-14530,-14481,-14432,-14383,\n-14334,-14285,-14236,-14187,-14138,-14089,-14040,-13990,\n-13941,-13892,-13843,-13794,-13745,-13696,-13647,-13597,\n-13548,-13499,-13450,-13401,-13351,-13302,-13253,-13204,\n-13154,-13105,-13056,-13007,-12957,-12908,-12859,-12810,\n-12760,-12711,-12662,-12612,-12563,-12514,-12464,-12415,\n-12366,-12316,-12267,-12217,-12168,-12119,-12069,-12020,\n-11970,-11921,-11872,-11822,-11773,-11723,-11674,-11624,\n-11575,-11525,-11476,-11426,-11377,-11327,-11278,-11228,\n-11179,-11129,-11080,-11030,-10981,-10931,-10882,-10832,\n-10782,-10733,-10683,-10634,-10584,-10534,-10485,-10435,\n-10386,-10336,-10286,-10237,-10187,-10137,-10088,-10038,\n-9988,-9939,-9889,-9839,-9790,-9740,-9690,-9640,\n-9591,-9541,-9491,-9442,-9392,-9342,-9292,-9243,\n-9193,-9143,-9093,-9043,-8994,-8944,-8894,-8844,\n-8794,-8745,-8695,-8645,-8595,-8545,-8496,-8446,\n-8396,-8346,-8296,-8246,-8196,-8147,-8097,-8047,\n-7997,-7947,-7897,-7847,-7797,-7747,-7697,-7648,\n-7598,-7548,-7498,-7448,-7398,-7348,-7298,-7248,\n-7198,-7148,-7098,-7048,-6998,-6948,-6898,-6848,\n-6798,-6748,-6698,-6648,-6598,-6548,-6498,-6448,\n-6398,-6348,-6298,-6248,-6198,-6148,-6098,-6048,\n-5998,-5948,-5898,-5848,-5798,-5747,-5697,-5647,\n-5597,-5547,-5497,-5447,-5397,-5347,-5297,-5247,\n-5197,-5146,-5096,-5046,-4996,-4946,-4896,-4846,\n-4796,-4745,-4695,-4645,-4595,-4545,-4495,-4445,\n-4394,-4344,-4294,-4244,-4194,-4144,-4093,-4043,\n-3993,-3943,-3893,-3843,-3792,-3742,-3692,-3642,\n-3592,-3541,-3491,-3441,-3391,-3341,-3291,-3240,\n-3190,-3140,-3090,-3039,-2989,-2939,-2889,-2839,\n-2788,-2738,-2688,-2638,-2588,-2537,-2487,-2437,\n-2387,-2336,-2286,-2236,-2186,-2135,-2085,-2035,\n-1985,-1934,-1884,-1834,-1784,-1733,-1683,-1633,\n-1583,-1532,-1482,-1432,-1382,-1331,-1281,-1231,\n-1181,-1130,-1080,-1030,-980,-929,-879,-829,\n-779,-728,-678,-628,-578,-527,-477,-427,\n-376,-326,-276,-226,-175,-125,-75,-25,\n25,75,125,175,226,276,326,376,\n427,477,527,578,628,678,728,779,\n829,879,929,980,1030,1080,1130,1181,\n1231,1281,1331,1382,1432,1482,1532,1583,\n1633,1683,1733,1784,1834,1884,1934,1985,\n2035,2085,2135,2186,2236,2286,2336,2387,\n2437,2487,2537,2587,2638,2688,2738,2788,\n2839,2889,2939,2989,3039,3090,3140,3190,\n3240,3291,3341,3391,3441,3491,3542,3592,\n3642,3692,3742,3792,3843,3893,3943,3993,\n4043,4093,4144,4194,4244,4294,4344,4394,\n4445,4495,4545,4595,4645,4695,4745,4796,\n4846,4896,4946,4996,5046,5096,5146,5197,\n5247,5297,5347,5397,5447,5497,5547,5597,\n5647,5697,5747,5798,5848,5898,5948,5998,\n6048,6098,6148,6198,6248,6298,6348,6398,\n6448,6498,6548,6598,6648,6698,6748,6798,\n6848,6898,6948,6998,7048,7098,7148,7198,\n7248,7298,7348,7398,7448,7498,7548,7598,\n7648,7697,7747,7797,7847,7897,7947,7997,\n8047,8097,8147,8196,8246,8296,8346,8396,\n8446,8496,8545,8595,8645,8695,8745,8794,\n8844,8894,8944,8994,9043,9093,9143,9193,\n9243,9292,9342,9392,9442,9491,9541,9591,\n9640,9690,9740,9790,9839,9889,9939,9988,\n10038,10088,10137,10187,10237,10286,10336,10386,\n10435,10485,10534,10584,10634,10683,10733,10782,\n10832,10882,10931,10981,11030,11080,11129,11179,\n11228,11278,11327,11377,11426,11476,11525,11575,\n11624,11674,11723,11773,11822,11872,11921,11970,\n12020,12069,12119,12168,12218,12267,12316,12366,\n12415,12464,12514,12563,12612,12662,12711,12760,\n12810,12859,12908,12957,13007,13056,13105,13154,\n13204,13253,13302,13351,13401,13450,13499,13548,\n13597,13647,13696,13745,13794,13843,13892,13941,\n13990,14040,14089,14138,14187,14236,14285,14334,\n14383,14432,14481,14530,14579,14628,14677,14726,\n14775,14824,14873,14922,14971,15020,15069,15118,\n15167,15215,15264,15313,15362,15411,15460,15509,\n15557,15606,15655,15704,15753,15802,15850,15899,\n15948,15997,16045,16094,16143,16191,16240,16289,\n16338,16386,16435,16484,16532,16581,16629,16678,\n16727,16775,16824,16872,16921,16970,17018,17067,\n17115,17164,17212,17261,17309,17358,17406,17455,\n17503,17551,17600,17648,17697,17745,17793,17842,\n17890,17939,17987,18035,18084,18132,18180,18228,\n18277,18325,18373,18421,18470,18518,18566,18614,\n18663,18711,18759,18807,18855,18903,18951,19000,\n19048,19096,19144,19192,19240,19288,19336,19384,\n19432,19480,19528,19576,19624,19672,19720,19768,\n19816,19864,19912,19959,20007,20055,20103,20151,\n20199,20246,20294,20342,20390,20438,20485,20533,\n20581,20629,20676,20724,20772,20819,20867,20915,\n20962,21010,21057,21105,21153,21200,21248,21295,\n21343,21390,21438,21485,21533,21580,21628,21675,\n21723,21770,21817,21865,21912,21960,22007,22054,\n22102,22149,22196,22243,22291,22338,22385,22432,\n22480,22527,22574,22621,22668,22716,22763,22810,\n22857,22904,22951,22998,23045,23092,23139,23186,\n23233,23280,23327,23374,23421,23468,23515,23562,\n23609,23656,23703,23750,23796,23843,23890,23937,\n23984,24030,24077,24124,24171,24217,24264,24311,\n24357,24404,24451,24497,24544,24591,24637,24684,\n24730,24777,24823,24870,24916,24963,25009,25056,\n25102,25149,25195,25241,25288,25334,25381,25427,\n25473,25520,25566,25612,25658,25705,25751,25797,\n25843,25889,25936,25982,26028,26074,26120,26166,\n26212,26258,26304,26350,26396,26442,26488,26534,\n26580,26626,26672,26718,26764,26810,26856,26902,\n26947,26993,27039,27085,27131,27176,27222,27268,\n27313,27359,27405,27450,27496,27542,27587,27633,\n27678,27724,27770,27815,27861,27906,27952,27997,\n28042,28088,28133,28179,28224,28269,28315,28360,\n28405,28451,28496,28541,28586,28632,28677,28722,\n28767,28812,28858,28903,28948,28993,29038,29083,\n29128,29173,29218,29263,29308,29353,29398,29443,\n29488,29533,29577,29622,29667,29712,29757,29801,\n29846,29891,29936,29980,30025,30070,30114,30159,\n30204,30248,30293,30337,30382,30427,30471,30516,\n30560,30604,30649,30693,30738,30782,30826,30871,\n30915,30959,31004,31048,31092,31136,31181,31225,\n31269,31313,31357,31402,31446,31490,31534,31578,\n31622,31666,31710,31754,31798,31842,31886,31930,\n31974,32017,32061,32105,32149,32193,32236,32280,\n32324,32368,32411,32455,32499,32542,32586,32630,\n32673,32717,32760,32804,32847,32891,32934,32978,\n33021,33065,33108,33151,33195,33238,33281,33325,\n33368,33411,33454,33498,33541,33584,33627,33670,\n33713,33756,33799,33843,33886,33929,33972,34015,\n34057,34100,34143,34186,34229,34272,34315,34358,\n34400,34443,34486,34529,34571,34614,34657,34699,\n34742,34785,34827,34870,34912,34955,34997,35040,\n35082,35125,35167,35210,35252,35294,35337,35379,\n35421,35464,35506,35548,35590,35633,35675,35717,\n35759,35801,35843,35885,35927,35969,36011,36053,\n36095,36137,36179,36221,36263,36305,36347,36388,\n36430,36472,36514,36556,36597,36639,36681,36722,\n36764,36805,36847,36889,36930,36972,37013,37055,\n37096,37137,37179,37220,37262,37303,37344,37386,\n37427,37468,37509,37551,37592,37633,37674,37715,\n37756,37797,37838,37879,37920,37961,38002,38043,\n38084,38125,38166,38207,38248,38288,38329,38370,\n38411,38451,38492,38533,38573,38614,38655,38695,\n38736,38776,38817,38857,38898,38938,38979,39019,\n39059,39100,39140,39180,39221,39261,39301,39341,\n39382,39422,39462,39502,39542,39582,39622,39662,\n39702,39742,39782,39822,39862,39902,39942,39982,\n40021,40061,40101,40141,40180,40220,40260,40299,\n40339,40379,40418,40458,40497,40537,40576,40616,\n40655,40695,40734,40773,40813,40852,40891,40931,\n40970,41009,41048,41087,41127,41166,41205,41244,\n41283,41322,41361,41400,41439,41478,41517,41556,\n41595,41633,41672,41711,41750,41788,41827,41866,\n41904,41943,41982,42020,42059,42097,42136,42174,\n42213,42251,42290,42328,42366,42405,42443,42481,\n42520,42558,42596,42634,42672,42711,42749,42787,\n42825,42863,42901,42939,42977,43015,43053,43091,\n43128,43166,43204,43242,43280,43317,43355,43393,\n43430,43468,43506,43543,43581,43618,43656,43693,\n43731,43768,43806,43843,43880,43918,43955,43992,\n44029,44067,44104,44141,44178,44215,44252,44289,\n44326,44363,44400,44437,44474,44511,44548,44585,\n44622,44659,44695,44732,44769,44806,44842,44879,\n44915,44952,44989,45025,45062,45098,45135,45171,\n45207,45244,45280,45316,45353,45389,45425,45462,\n45498,45534,45570,45606,45642,45678,45714,45750,\n45786,45822,45858,45894,45930,45966,46002,46037,\n46073,46109,46145,46180,46216,46252,46287,46323,\n46358,46394,46429,46465,46500,46536,46571,46606,\n46642,46677,46712,46747,46783,46818,46853,46888,\n46923,46958,46993,47028,47063,47098,47133,47168,\n47203,47238,47273,47308,47342,47377,47412,47446,\n47481,47516,47550,47585,47619,47654,47688,47723,\n47757,47792,47826,47861,47895,47929,47963,47998,\n48032,48066,48100,48134,48168,48202,48237,48271,\n48305,48338,48372,48406,48440,48474,48508,48542,\n48575,48609,48643,48676,48710,48744,48777,48811,\n48844,48878,48911,48945,48978,49012,49045,49078,\n49112,49145,49178,49211,49244,49278,49311,49344,\n49377,49410,49443,49476,49509,49542,49575,49608,\n49640,49673,49706,49739,49771,49804,49837,49869,\n49902,49935,49967,50000,50032,50064,50097,50129,\n50162,50194,50226,50259,50291,50323,50355,50387,\n50420,50452,50484,50516,50548,50580,50612,50644,\n50675,50707,50739,50771,50803,50834,50866,50898,\n50929,50961,50993,51024,51056,51087,51119,51150,\n51182,51213,51244,51276,51307,51338,51369,51401,\n51432,51463,51494,51525,51556,51587,51618,51649,\n51680,51711,51742,51773,51803,51834,51865,51896,\n51926,51957,51988,52018,52049,52079,52110,52140,\n52171,52201,52231,52262,52292,52322,52353,52383,\n52413,52443,52473,52503,52534,52564,52594,52624,\n52653,52683,52713,52743,52773,52803,52832,52862,\n52892,52922,52951,52981,53010,53040,53069,53099,\n53128,53158,53187,53216,53246,53275,53304,53334,\n53363,53392,53421,53450,53479,53508,53537,53566,\n53595,53624,53653,53682,53711,53739,53768,53797,\n53826,53854,53883,53912,53940,53969,53997,54026,\n54054,54082,54111,54139,54167,54196,54224,54252,\n54280,54309,54337,54365,54393,54421,54449,54477,\n54505,54533,54560,54588,54616,54644,54672,54699,\n54727,54755,54782,54810,54837,54865,54892,54920,\n54947,54974,55002,55029,55056,55084,55111,55138,\n55165,55192,55219,55246,55274,55300,55327,55354,\n55381,55408,55435,55462,55489,55515,55542,55569,\n55595,55622,55648,55675,55701,55728,55754,55781,\n55807,55833,55860,55886,55912,55938,55965,55991,\n56017,56043,56069,56095,56121,56147,56173,56199,\n56225,56250,56276,56302,56328,56353,56379,56404,\n56430,56456,56481,56507,56532,56557,56583,56608,\n56633,56659,56684,56709,56734,56760,56785,56810,\n56835,56860,56885,56910,56935,56959,56984,57009,\n57034,57059,57083,57108,57133,57157,57182,57206,\n57231,57255,57280,57304,57329,57353,57377,57402,\n57426,57450,57474,57498,57522,57546,57570,57594,\n57618,57642,57666,57690,57714,57738,57762,57785,\n57809,57833,57856,57880,57903,57927,57950,57974,\n57997,58021,58044,58067,58091,58114,58137,58160,\n58183,58207,58230,58253,58276,58299,58322,58345,\n58367,58390,58413,58436,58459,58481,58504,58527,\n58549,58572,58594,58617,58639,58662,58684,58706,\n58729,58751,58773,58795,58818,58840,58862,58884,\n58906,58928,58950,58972,58994,59016,59038,59059,\n59081,59103,59125,59146,59168,59190,59211,59233,\n59254,59276,59297,59318,59340,59361,59382,59404,\n59425,59446,59467,59488,59509,59530,59551,59572,\n59593,59614,59635,59656,59677,59697,59718,59739,\n59759,59780,59801,59821,59842,59862,59883,59903,\n59923,59944,59964,59984,60004,60025,60045,60065,\n60085,60105,60125,60145,60165,60185,60205,60225,\n60244,60264,60284,60304,60323,60343,60363,60382,\n60402,60421,60441,60460,60479,60499,60518,60537,\n60556,60576,60595,60614,60633,60652,60671,60690,\n60709,60728,60747,60766,60785,60803,60822,60841,\n60859,60878,60897,60915,60934,60952,60971,60989,\n61007,61026,61044,61062,61081,61099,61117,61135,\n61153,61171,61189,61207,61225,61243,61261,61279,\n61297,61314,61332,61350,61367,61385,61403,61420,\n61438,61455,61473,61490,61507,61525,61542,61559,\n61577,61594,61611,61628,61645,61662,61679,61696,\n61713,61730,61747,61764,61780,61797,61814,61831,\n61847,61864,61880,61897,61913,61930,61946,61963,\n61979,61995,62012,62028,62044,62060,62076,62092,\n62108,62125,62141,62156,62172,62188,62204,62220,\n62236,62251,62267,62283,62298,62314,62329,62345,\n62360,62376,62391,62407,62422,62437,62453,62468,\n62483,62498,62513,62528,62543,62558,62573,62588,\n62603,62618,62633,62648,62662,62677,62692,62706,\n62721,62735,62750,62764,62779,62793,62808,62822,\n62836,62850,62865,62879,62893,62907,62921,62935,\n62949,62963,62977,62991,63005,63019,63032,63046,\n63060,63074,63087,63101,63114,63128,63141,63155,\n63168,63182,63195,63208,63221,63235,63248,63261,\n63274,63287,63300,63313,63326,63339,63352,63365,\n63378,63390,63403,63416,63429,63441,63454,63466,\n63479,63491,63504,63516,63528,63541,63553,63565,\n63578,63590,63602,63614,63626,63638,63650,63662,\n63674,63686,63698,63709,63721,63733,63745,63756,\n63768,63779,63791,63803,63814,63825,63837,63848,\n63859,63871,63882,63893,63904,63915,63927,63938,\n63949,63960,63971,63981,63992,64003,64014,64025,\n64035,64046,64057,64067,64078,64088,64099,64109,\n64120,64130,64140,64151,64161,64171,64181,64192,\n64202,64212,64222,64232,64242,64252,64261,64271,\n64281,64291,64301,64310,64320,64330,64339,64349,\n64358,64368,64377,64387,64396,64405,64414,64424,\n64433,64442,64451,64460,64469,64478,64487,64496,\n64505,64514,64523,64532,64540,64549,64558,64566,\n64575,64584,64592,64600,64609,64617,64626,64634,\n64642,64651,64659,64667,64675,64683,64691,64699,\n64707,64715,64723,64731,64739,64747,64754,64762,\n64770,64777,64785,64793,64800,64808,64815,64822,\n64830,64837,64844,64852,64859,64866,64873,64880,\n64887,64895,64902,64908,64915,64922,64929,64936,\n64943,64949,64956,64963,64969,64976,64982,64989,\n64995,65002,65008,65015,65021,65027,65033,65040,\n65046,65052,65058,65064,65070,65076,65082,65088,\n65094,65099,65105,65111,65117,65122,65128,65133,\n65139,65144,65150,65155,65161,65166,65171,65177,\n65182,65187,65192,65197,65202,65207,65212,65217,\n65222,65227,65232,65237,65242,65246,65251,65256,\n65260,65265,65270,65274,65279,65283,65287,65292,\n65296,65300,65305,65309,65313,65317,65321,65325,\n65329,65333,65337,65341,65345,65349,65352,65356,\n65360,65363,65367,65371,65374,65378,65381,65385,\n65388,65391,65395,65398,65401,65404,65408,65411,\n65414,65417,65420,65423,65426,65429,65431,65434,\n65437,65440,65442,65445,65448,65450,65453,65455,\n65458,65460,65463,65465,65467,65470,65472,65474,\n65476,65478,65480,65482,65484,65486,65488,65490,\n65492,65494,65496,65497,65499,65501,65502,65504,\n65505,65507,65508,65510,65511,65513,65514,65515,\n65516,65518,65519,65520,65521,65522,65523,65524,\n65525,65526,65527,65527,65528,65529,65530,65530,\n65531,65531,65532,65532,65533,65533,65534,65534,\n65534,65535,65535,65535,65535,65535,65535,65535\n};\n\nint tantoangle[2049] = {//80071788\n0,333772,667544,1001315,1335086,1668857,2002626,2336395,\n2670163,3003929,3337694,3671457,4005219,4338979,4672736,5006492,\n5340245,5673995,6007743,6341488,6675230,7008968,7342704,7676435,\n8010164,8343888,8677609,9011325,9345037,9678744,10012447,10346145,\n10679838,11013526,11347209,11680887,12014558,12348225,12681885,13015539,\n13349187,13682829,14016464,14350092,14683714,15017328,15350936,15684536,\n16018129,16351714,16685291,17018860,17352422,17685974,18019518,18353054,\n18686582,19020100,19353610,19687110,20020600,20354080,20687552,21021014,\n21354466,21687906,22021338,22354758,22688168,23021568,23354956,23688332,\n24021698,24355052,24688396,25021726,25355046,25688352,26021648,26354930,\n26688200,27021456,27354702,27687932,28021150,28354356,28687548,29020724,\n29353888,29687038,30020174,30353296,30686404,31019496,31352574,31685636,\n32018684,32351718,32684734,33017736,33350722,33683692,34016648,34349584,\n34682508,35015412,35348300,35681172,36014028,36346868,36679688,37012492,\n37345276,37678044,38010792,38343524,38676240,39008936,39341612,39674272,\n40006912,40339532,40672132,41004716,41337276,41669820,42002344,42334848,\n42667332,42999796,43332236,43664660,43997060,44329444,44661800,44994140,\n45326456,45658752,45991028,46323280,46655512,46987720,47319908,47652072,\n47984212,48316332,48648428,48980500,49312548,49644576,49976580,50308556,\n50640512,50972444,51304352,51636236,51968096,52299928,52631740,52963524,\n53295284,53627020,53958728,54290412,54622068,54953704,55285308,55616888,\n55948444,56279972,56611472,56942948,57274396,57605816,57937212,58268576,\n58599916,58931228,59262512,59593768,59924992,60256192,60587364,60918508,\n61249620,61580704,61911760,62242788,62573788,62904756,63235692,63566604,\n63897480,64228332,64559148,64889940,65220696,65551424,65882120,66212788,\n66543420,66874024,67204600,67535136,67865648,68196120,68526568,68856984,\n69187360,69517712,69848024,70178304,70508560,70838776,71168960,71499112,\n71829224,72159312,72489360,72819376,73149360,73479304,73809216,74139096,\n74468936,74798744,75128520,75458264,75787968,76117632,76447264,76776864,\n77106424,77435952,77765440,78094888,78424304,78753688,79083032,79412336,\n79741608,80070840,80400032,80729192,81058312,81387392,81716432,82045440,\n82374408,82703336,83032224,83361080,83689896,84018664,84347400,84676096,\n85004760,85333376,85661952,85990488,86318984,86647448,86975864,87304240,\n87632576,87960872,88289128,88617344,88945520,89273648,89601736,89929792,\n90257792,90585760,90913688,91241568,91569408,91897200,92224960,92552672,\n92880336,93207968,93535552,93863088,94190584,94518040,94845448,95172816,\n95500136,95827416,96154648,96481832,96808976,97136080,97463136,97790144,\n98117112,98444032,98770904,99097736,99424520,99751256,100077944,100404592,\n100731192,101057744,101384248,101710712,102037128,102363488,102689808,103016080,\n103342312,103668488,103994616,104320696,104646736,104972720,105298656,105624552,\n105950392,106276184,106601928,106927624,107253272,107578872,107904416,108229920,\n108555368,108880768,109206120,109531416,109856664,110181872,110507016,110832120,\n111157168,111482168,111807112,112132008,112456856,112781648,113106392,113431080,\n113755720,114080312,114404848,114729328,115053760,115378136,115702464,116026744,\n116350960,116675128,116999248,117323312,117647320,117971272,118295176,118619024,\n118942816,119266560,119590248,119913880,120237456,120560984,120884456,121207864,\n121531224,121854528,122177784,122500976,122824112,123147200,123470224,123793200,\n124116120,124438976,124761784,125084528,125407224,125729856,126052432,126374960,\n126697424,127019832,127342184,127664472,127986712,128308888,128631008,128953072,\n129275080,129597024,129918912,130240744,130562520,130884232,131205888,131527480,\n131849016,132170496,132491912,132813272,133134576,133455816,133776992,134098120,\n134419184,134740176,135061120,135382000,135702816,136023584,136344272,136664912,\n136985488,137306016,137626464,137946864,138267184,138587456,138907664,139227808,\n139547904,139867920,140187888,140507776,140827616,141147392,141467104,141786752,\n142106336,142425856,142745312,143064720,143384048,143703312,144022512,144341664,\n144660736,144979744,145298704,145617584,145936400,146255168,146573856,146892480,\n147211040,147529536,147847968,148166336,148484640,148802880,149121056,149439152,\n149757200,150075168,150393072,150710912,151028688,151346400,151664048,151981616,\n152299136,152616576,152933952,153251264,153568496,153885680,154202784,154519824,\n154836784,155153696,155470528,155787296,156104000,156420624,156737200,157053696,\n157370112,157686480,158002768,158318976,158635136,158951216,159267232,159583168,\n159899040,160214848,160530592,160846256,161161840,161477376,161792832,162108208,\n162423520,162738768,163053952,163369040,163684080,163999040,164313936,164628752,\n164943504,165258176,165572784,165887312,166201776,166516160,166830480,167144736,\n167458912,167773008,168087040,168400992,168714880,169028688,169342432,169656096,\n169969696,170283216,170596672,170910032,171223344,171536576,171849728,172162800,\n172475808,172788736,173101600,173414384,173727104,174039728,174352288,174664784,\n174977200,175289536,175601792,175913984,176226096,176538144,176850096,177161984,\n177473792,177785536,178097200,178408784,178720288,179031728,179343088,179654368,\n179965568,180276704,180587744,180898720,181209616,181520448,181831184,182141856,\n182452448,182762960,183073408,183383760,183694048,184004240,184314368,184624416,\n184934400,185244288,185554096,185863840,186173504,186483072,186792576,187102000,\n187411344,187720608,188029808,188338912,188647936,188956896,189265760,189574560,\n189883264,190191904,190500448,190808928,191117312,191425632,191733872,192042016,\n192350096,192658096,192966000,193273840,193581584,193889264,194196848,194504352,\n194811792,195119136,195426400,195733584,196040688,196347712,196654656,196961520,\n197268304,197574992,197881616,198188144,198494592,198800960,199107248,199413456,\n199719584,200025616,200331584,200637456,200943248,201248960,201554576,201860128,\n202165584,202470960,202776256,203081456,203386592,203691632,203996592,204301472,\n204606256,204910976,205215600,205520144,205824592,206128960,206433248,206737456,\n207041584,207345616,207649568,207953424,208257216,208560912,208864512,209168048,\n209471488,209774832,210078112,210381296,210684384,210987408,211290336,211593184,\n211895936,212198608,212501184,212803680,213106096,213408432,213710672,214012816,\n214314880,214616864,214918768,215220576,215522288,215823920,216125472,216426928,\n216728304,217029584,217330784,217631904,217932928,218233856,218534704,218835472,\n219136144,219436720,219737216,220037632,220337952,220638192,220938336,221238384,\n221538352,221838240,222138032,222437728,222737344,223036880,223336304,223635664,\n223934912,224234096,224533168,224832160,225131072,225429872,225728608,226027232,\n226325776,226624240,226922608,227220880,227519056,227817152,228115168,228413088,\n228710912,229008640,229306288,229603840,229901312,230198688,230495968,230793152,\n231090256,231387280,231684192,231981024,232277760,232574416,232870960,233167440,\n233463808,233760096,234056288,234352384,234648384,234944304,235240128,235535872,\n235831504,236127056,236422512,236717888,237013152,237308336,237603424,237898416,\n238193328,238488144,238782864,239077488,239372016,239666464,239960816,240255072,\n240549232,240843312,241137280,241431168,241724960,242018656,242312256,242605776,\n242899200,243192512,243485744,243778896,244071936,244364880,244657744,244950496,\n245243168,245535744,245828224,246120608,246412912,246705104,246997216,247289216,\n247581136,247872960,248164688,248456320,248747856,249039296,249330640,249621904,\n249913056,250204128,250495088,250785968,251076736,251367424,251658016,251948512,\n252238912,252529200,252819408,253109520,253399536,253689456,253979280,254269008,\n254558640,254848176,255137632,255426976,255716224,256005376,256294432,256583392,\n256872256,257161024,257449696,257738272,258026752,258315136,258603424,258891600,\n259179696,259467696,259755600,260043392,260331104,260618704,260906224,261193632,\n261480960,261768176,262055296,262342320,262629248,262916080,263202816,263489456,\n263776000,264062432,264348784,264635024,264921168,265207216,265493168,265779024,\n266064784,266350448,266636000,266921472,267206832,267492096,267777264,268062336,\n268347312,268632192,268916960,269201632,269486208,269770688,270055072,270339360,\n270623552,270907616,271191616,271475488,271759296,272042976,272326560,272610048,\n272893440,273176736,273459936,273743040,274026048,274308928,274591744,274874432,\n275157024,275439520,275721920,276004224,276286432,276568512,276850528,277132416,\n277414240,277695936,277977536,278259040,278540448,278821728,279102944,279384032,\n279665056,279945952,280226752,280507456,280788064,281068544,281348960,281629248,\n281909472,282189568,282469568,282749440,283029248,283308960,283588544,283868032,\n284147424,284426720,284705920,284985024,285264000,285542912,285821696,286100384,\n286378976,286657440,286935840,287214112,287492320,287770400,288048384,288326240,\n288604032,288881696,289159264,289436768,289714112,289991392,290268576,290545632,\n290822592,291099456,291376224,291652896,291929440,292205888,292482272,292758528,\n293034656,293310720,293586656,293862496,294138240,294413888,294689440,294964864,\n295240192,295515424,295790560,296065600,296340512,296615360,296890080,297164704,\n297439200,297713632,297987936,298262144,298536256,298810240,299084160,299357952,\n299631648,299905248,300178720,300452128,300725408,300998592,301271680,301544640,\n301817536,302090304,302362976,302635520,302908000,303180352,303452608,303724768,\n303996800,304268768,304540608,304812320,305083968,305355520,305626944,305898272,\n306169472,306440608,306711616,306982528,307253344,307524064,307794656,308065152,\n308335552,308605856,308876032,309146112,309416096,309685984,309955744,310225408,\n310494976,310764448,311033824,311303072,311572224,311841280,312110208,312379040,\n312647776,312916416,313184960,313453376,313721696,313989920,314258016,314526016,\n314793920,315061728,315329408,315597024,315864512,316131872,316399168,316666336,\n316933408,317200384,317467232,317733984,318000640,318267200,318533632,318799968,\n319066208,319332352,319598368,319864288,320130112,320395808,320661408,320926912,\n321192320,321457632,321722816,321987904,322252864,322517760,322782528,323047200,\n323311744,323576192,323840544,324104800,324368928,324632992,324896928,325160736,\n325424448,325688096,325951584,326215008,326478304,326741504,327004608,327267584,\n327530464,327793248,328055904,328318496,328580960,328843296,329105568,329367712,\n329629760,329891680,330153536,330415264,330676864,330938400,331199808,331461120,\n331722304,331983392,332244384,332505280,332766048,333026752,333287296,333547776,\n333808128,334068384,334328544,334588576,334848512,335108352,335368064,335627712,\n335887200,336146624,336405920,336665120,336924224,337183200,337442112,337700864,\n337959552,338218112,338476576,338734944,338993184,339251328,339509376,339767296,\n340025120,340282848,340540480,340797984,341055392,341312704,341569888,341826976,\n342083968,342340832,342597600,342854272,343110848,343367296,343623648,343879904,\n344136032,344392064,344648000,344903808,345159520,345415136,345670656,345926048,\n346181344,346436512,346691616,346946592,347201440,347456224,347710880,347965440,\n348219872,348474208,348728448,348982592,349236608,349490528,349744320,349998048,\n350251648,350505152,350758528,351011808,351264992,351518048,351771040,352023872,\n352276640,352529280,352781824,353034272,353286592,353538816,353790944,354042944,\n354294880,354546656,354798368,355049952,355301440,355552800,355804096,356055264,\n356306304,356557280,356808128,357058848,357309504,357560032,357810464,358060768,\n358311008,358561088,358811104,359060992,359310784,359560480,359810048,360059520,\n360308896,360558144,360807296,361056352,361305312,361554144,361802880,362051488,\n362300032,362548448,362796736,363044960,363293056,363541024,363788928,364036704,\n364284384,364531936,364779392,365026752,365274016,365521152,365768192,366015136,\n366261952,366508672,366755296,367001792,367248192,367494496,367740704,367986784,\n368232768,368478656,368724416,368970080,369215648,369461088,369706432,369951680,\n370196800,370441824,370686752,370931584,371176288,371420896,371665408,371909792,\n372154080,372398272,372642336,372886304,373130176,373373952,373617600,373861152,\n374104608,374347936,374591168,374834304,375077312,375320224,375563040,375805760,\n376048352,376290848,376533248,376775520,377017696,377259776,377501728,377743584,\n377985344,378227008,378468544,378709984,378951328,379192544,379433664,379674688,\n379915584,380156416,380397088,380637696,380878176,381118560,381358848,381599040,\n381839104,382079072,382318912,382558656,382798304,383037856,383277280,383516640,\n383755840,383994976,384233984,384472896,384711712,384950400,385188992,385427488,\n385665888,385904160,386142336,386380384,386618368,386856224,387093984,387331616,\n387569152,387806592,388043936,388281152,388518272,388755296,388992224,389229024,\n389465728,389702336,389938816,390175200,390411488,390647680,390883744,391119712,\n391355584,391591328,391826976,392062528,392297984,392533312,392768544,393003680,\n393238720,393473632,393708448,393943168,394177760,394412256,394646656,394880960,\n395115136,395349216,395583200,395817088,396050848,396284512,396518080,396751520,\n396984864,397218112,397451264,397684288,397917248,398150080,398382784,398615424,\n398847936,399080320,399312640,399544832,399776928,400008928,400240832,400472608,\n400704288,400935872,401167328,401398720,401629984,401861120,402092192,402323136,\n402553984,402784736,403015360,403245888,403476320,403706656,403936896,404167008,\n404397024,404626944,404856736,405086432,405316032,405545536,405774912,406004224,\n406233408,406462464,406691456,406920320,407149088,407377760,407606336,407834784,\n408063136,408291392,408519520,408747584,408975520,409203360,409431072,409658720,\n409886240,410113664,410340992,410568192,410795296,411022304,411249216,411476032,\n411702720,411929312,412155808,412382176,412608480,412834656,413060736,413286720,\n413512576,413738336,413964000,414189568,414415040,414640384,414865632,415090784,\n415315840,415540800,415765632,415990368,416215008,416439552,416663968,416888288,\n417112512,417336640,417560672,417784576,418008384,418232096,418455712,418679200,\n418902624,419125920,419349120,419572192,419795200,420018080,420240864,420463552,\n420686144,420908608,421130976,421353280,421575424,421797504,422019488,422241344,\n422463104,422684768,422906336,423127776,423349120,423570400,423791520,424012576,\n424233536,424454368,424675104,424895744,425116288,425336736,425557056,425777280,\n425997408,426217440,426437376,426657184,426876928,427096544,427316064,427535488,\n427754784,427974016,428193120,428412128,428631040,428849856,429068544,429287168,\n429505664,429724064,429942368,430160576,430378656,430596672,430814560,431032352,\n431250048,431467616,431685120,431902496,432119808,432336992,432554080,432771040,\n432987936,433204736,433421408,433637984,433854464,434070848,434287104,434503296,\n434719360,434935360,435151232,435367008,435582656,435798240,436013696,436229088,\n436444352,436659520,436874592,437089568,437304416,437519200,437733856,437948416,\n438162880,438377248,438591520,438805696,439019744,439233728,439447584,439661344,\n439875008,440088576,440302048,440515392,440728672,440941824,441154880,441367872,\n441580736,441793472,442006144,442218720,442431168,442643552,442855808,443067968,\n443280032,443492000,443703872,443915648,444127296,444338880,444550336,444761696,\n444972992,445184160,445395232,445606176,445817056,446027840,446238496,446449088,\n446659552,446869920,447080192,447290400,447500448,447710432,447920320,448130112,\n448339776,448549376,448758848,448968224,449177536,449386720,449595808,449804800,\n450013664,450222464,450431168,450639776,450848256,451056640,451264960,451473152,\n451681248,451889248,452097152,452304960,452512672,452720288,452927808,453135232,\n453342528,453549760,453756864,453963904,454170816,454377632,454584384,454791008,\n454997536,455203968,455410304,455616544,455822688,456028704,456234656,456440512,\n456646240,456851904,457057472,457262912,457468256,457673536,457878688,458083744,\n458288736,458493600,458698368,458903040,459107616,459312096,459516480,459720768,\n459924960,460129056,460333056,460536960,460740736,460944448,461148064,461351584,\n461554976,461758304,461961536,462164640,462367680,462570592,462773440,462976160,\n463178816,463381344,463583776,463786144,463988384,464190560,464392608,464594560,\n464796448,464998208,465199872,465401472,465602944,465804320,466005600,466206816,\n466407904,466608896,466809824,467010624,467211328,467411936,467612480,467812896,\n468013216,468213440,468413600,468613632,468813568,469013440,469213184,469412832,\n469612416,469811872,470011232,470210528,470409696,470608800,470807776,471006688,\n471205472,471404192,471602784,471801312,471999712,472198048,472396288,472594400,\n472792448,472990400,473188256,473385984,473583648,473781216,473978688,474176064,\n474373344,474570528,474767616,474964608,475161504,475358336,475555040,475751648,\n475948192,476144608,476340928,476537184,476733312,476929376,477125344,477321184,\n477516960,477712640,477908224,478103712,478299104,478494400,478689600,478884704,\n479079744,479274656,479469504,479664224,479858880,480053408,480247872,480442240,\n480636512,480830656,481024736,481218752,481412640,481606432,481800128,481993760,\n482187264,482380704,482574016,482767264,482960416,483153472,483346432,483539296,\n483732064,483924768,484117344,484309856,484502240,484694560,484886784,485078912,\n485270944,485462880,485654720,485846464,486038144,486229696,486421184,486612576,\n486803840,486995040,487186176,487377184,487568096,487758912,487949664,488140320,\n488330880,488521312,488711712,488901984,489092160,489282240,489472256,489662176,\n489851968,490041696,490231328,490420896,490610336,490799712,490988960,491178144,\n491367232,491556224,491745120,491933920,492122656,492311264,492499808,492688256,\n492876608,493064864,493253056,493441120,493629120,493817024,494004832,494192544,\n494380160,494567712,494755136,494942496,495129760,495316928,495504000,495691008,\n495877888,496064704,496251424,496438048,496624608,496811040,496997408,497183680,\n497369856,497555936,497741920,497927840,498113632,498299360,498484992,498670560,\n498856000,499041376,499226656,499411840,499596928,499781920,499966848,500151680,\n500336416,500521056,500705600,500890080,501074464,501258752,501442944,501627040,\n501811072,501995008,502178848,502362592,502546240,502729824,502913312,503096704,\n503280000,503463232,503646368,503829408,504012352,504195200,504377984,504560672,\n504743264,504925760,505108192,505290496,505472736,505654912,505836960,506018944,\n506200832,506382624,506564320,506745952,506927488,507108928,507290272,507471552,\n507652736,507833824,508014816,508195744,508376576,508557312,508737952,508918528,\n509099008,509279392,509459680,509639904,509820032,510000064,510180000,510359872,\n510539648,510719328,510898944,511078432,511257856,511437216,511616448,511795616,\n511974688,512153664,512332576,512511392,512690112,512868768,513047296,513225792,\n513404160,513582432,513760640,513938784,514116800,514294752,514472608,514650368,\n514828064,515005664,515183168,515360608,515537952,515715200,515892352,516069440,\n516246432,516423328,516600160,516776896,516953536,517130112,517306592,517482976,\n517659264,517835488,518011616,518187680,518363648,518539520,518715296,518891008,\n519066624,519242144,519417600,519592960,519768256,519943424,520118528,520293568,\n520468480,520643328,520818112,520992800,521167392,521341888,521516320,521690656,\n521864896,522039072,522213152,522387168,522561056,522734912,522908640,523082304,\n523255872,523429376,523602784,523776096,523949312,524122464,524295552,524468512,\n524641440,524814240,524986976,525159616,525332192,525504640,525677056,525849344,\n526021568,526193728,526365792,526537760,526709632,526881440,527053152,527224800,\n527396352,527567840,527739200,527910528,528081728,528252864,528423936,528594880,\n528765760,528936576,529107296,529277920,529448480,529618944,529789344,529959648,\n530129856,530300000,530470048,530640000,530809888,530979712,531149440,531319072,\n531488608,531658080,531827488,531996800,532166016,532335168,532504224,532673184,\n532842080,533010912,533179616,533348288,533516832,533685312,533853728,534022048,\n534190272,534358432,534526496,534694496,534862400,535030240,535197984,535365632,\n535533216,535700704,535868128,536035456,536202720,536369888,536536992,536704000,\n536870912\n};\n\r\n#define\tVIEW_3D_H 200\r\nfixed_t yslope[VIEW_3D_H] = //8007378C\r\n{\r\n\t83886, 84733, 85598, 86480, 87381,\r\n\t88301, 89240, 90200, 91180, 92182,\r\n\t93206, 94254, 95325, 96420, 97541,\r\n\t98689, 99864, 101067, 102300, 103563,\r\n\t104857, 106184, 107546, 108942, 110376,\r\n\t111848, 113359, 114912, 116508, 118149,\r\n\t119837, 121574, 123361, 125203, 127100,\r\n\t129055, 131072, 133152, 135300, 137518,\r\n\t139810, 142179, 144631, 147168, 149796,\r\n\t152520, 155344, 158275, 161319, 164482,\r\n\t167772, 171196, 174762, 178481, 182361,\r\n\t186413, 190650, 195083, 199728, 204600,\r\n\t209715, 215092, 220752, 226719, 233016,\r\n\t239674, 246723, 254200, 262144, 270600,\r\n\t279620, 289262, 299593, 310689, 322638,\r\n\t335544, 349525, 364722, 381300, 399457,\r\n\t419430, 441505, 466033, 493447, 524288,\r\n\t559240, 599186, 645277, 699050, 762600,\r\n\t838860, 932067, 1048576, 1198372, 1398101,\r\n\t1677721, 2097152, 2796202, 4194304, 8388608,\r\n\t0,\r\n\t-8388608, -4194304, -2796202, -2097152, -1677721,\r\n\t-1398101, -1198372, -1048576, -932067, -838860,\r\n\t-762600, -699050, -645277, -599186, -559240,\r\n\t-524288, -493447, -466033, -441505, -419430,\r\n\t-399457, -381300, -364722, -349525, -335544,\r\n\t-322638, -310689, -299593, -289262, -279620,\r\n\t-270600, -262144, -254200, -246723, -239674,\r\n\t-233016, -226719, -220752, -215092, -209715,\r\n\t-204600, -199728, -195083, -190650, -186413,\r\n\t-182361, -178481, -174762, -171196, -167772,\r\n\t-164482, -161319, -158275, -155344, -152520,\r\n\t-149796, -147168, -144631, -142179, -139810,\r\n\t-137518, -135300, -133152, -131072, -129055,\r\n\t-127100, -125203, -123361, -121574, -119837,\r\n\t-118149, -116508, -114912, -113359, -111848,\r\n\t-110376, -108942, -107546, -106184, -104857,\r\n\t-103563, -102300, -101067, -99864, -98689,\r\n\t-97541, -96420, -95325, -94254, -93206,\r\n\t-92182, -91180, -90200, -89240, -88301,\r\n\t-87381, -86480, -85598, -84733\r\n};\r\n"
  },
  {
    "path": "PSXDOOM/vsprintf.c",
    "content": "\r\n//inline\r\nint mystrlen(char *string)//80030F58\r\n{\r\n  int rc = 0;\r\n  if (string) while (*(string++)) rc++;\r\n  else rc = -1;\r\n  return rc;\r\n}\r\n\r\nint D_vsprintf(char *string, const char *format, int *argptr)//80030F98\r\n{\r\n  int len, i, div, uselong;\r\n  int fieldsize;\r\n  unsigned long num;\r\n  long snum;\r\n  char padchar;\r\n  char *str;\r\n  char *origstring = string;\r\n\r\n  while (*format)\r\n  {\r\n    if (*format != '%') *(string++) = *(format++);\r\n    else\r\n    {\r\n      format++;\r\n\r\n      /* set field pad character to 0 if necessary */\r\n      if (*format == '0')\r\n      {\r\n        padchar = '0';\r\n        format++;\r\n      }\r\n      else padchar = ' ';\r\n\r\n      /* get the fieldwidth if any */\r\n      fieldsize = 0;\r\n      while (*format >= '0' && *format <= '9')\r\n\tfieldsize = fieldsize * 10 + *(format++) - '0';\r\n\r\n      /* get rid of 'l' if present */\r\n      if (*format == 'l')\r\n      {\r\n        uselong = 1;\r\n        format++;\r\n      } else uselong = 0;\r\n\r\n      div = 10;\r\n      if (*format == 'c')\r\n      {\r\n\t*(string++) = *argptr++;\r\n\tformat++;\r\n      }\r\n      else if (*format == 's')\r\n      {\r\n\tstr = (char *)*argptr++;\r\n\tlen = mystrlen(str);\r\n\twhile (fieldsize-- > len) *(string++) = padchar; /* do field pad */\r\n\twhile (*str) *(string++) = *(str++); /* copy string */\r\n\tformat++;\r\n      }\r\n      else\r\n      {\r\n        if (*format == 'o') /* octal */\r\n        {\r\n          div = 8;\r\n          if (uselong)\r\n\t    num = *argptr++;\r\n\t  else\r\n\t    num = *argptr++;\r\n/*\t  printf(\"o=0%o\\n\", num); */\r\n        }\r\n        else if (*format == 'x' || *format == 'X')  /* hex */\r\n        {\r\n          div = 16;\r\n          if (uselong)\r\n\t    num = *argptr++;\r\n\t  else\r\n\t    num = *argptr++;\r\n/*\t  printf(\"x=%x\\n\", num); */\r\n\t}\r\n        else if (*format == 'i' || *format == 'd' || *format == 'u') /* decimal */\r\n        {\r\n          div = 10;\r\n          if (uselong)\r\n\t    snum = *argptr++;\r\n\t  else\r\n\t    snum = *argptr++;\r\n\t  if (snum < 0 && *format != 'u') /* handle negative %i or %d */\r\n\t  {\r\n\t    *(string++) = '-';\r\n\t    num = -snum;\r\n\t    if (fieldsize) fieldsize--;\r\n\t  } else num = snum;\r\n\t}\r\n\telse return -1; /* unrecognized format specifier */\r\n\r\n\t/* print any decimal or hex integer */\r\n\tlen = 0;\r\n\twhile (num || fieldsize || !len)\r\n\t{\r\n\t  for (i=len ; i ; i--) string[i] = string[i-1]; /* shift right */\r\n\t  if (len && fieldsize && !num) *string = padchar; /* pad out */\r\n\t  else\r\n\t  {\r\n\t    /* put in a hex or decimal digit */\r\n\t    *string = num % div;\r\n\t    *string += *string > 9 ? 'A'-10 : '0';\r\n/*\t    printf(\"d = %c\\n\", *string); */\r\n\t    num /= div;\r\n\t  }\r\n\t  len++;\r\n\t  if (fieldsize) fieldsize--;\r\n\t}\r\n\tstring += len;\r\n\tformat++;\r\n      }\r\n    }\r\n  }\r\n  *string = 0;\r\n\r\n  return origstring - string;\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/w_wad.c",
    "content": "/* W_wad.c */\r\n\r\n#include \"doomdef.h\"\r\n#include \"r_local.h\"\r\n\r\n/*=============== */\r\n/*   TYPES */\r\n/*=============== */\r\n\r\n\r\ntypedef struct\r\n{\r\n\tchar\t\tidentification[4];\t\t/* should be IWAD */\r\n\tint\t\t\tnumlumps;\r\n\tint\t\t\tinfotableofs;\r\n} wadinfo_t;\r\n\r\nint\t\t\twadfilenum;\t//80078078\r\n\r\n/*============= */\r\n/* GLOBALS */\r\n/*============= */\r\n\r\nlumpinfo_t\t*lumpinfo;\t\t\t\t//80077FEC /* points directly to rom image */\r\nint\t\t\tnumlumps;\t\t\t\t//80078014\r\nlumpcache_t\t*lumpcache;\t\t\t\t//80078060\r\nbyte\t\t*lumpencode;\t\t\t//80078114 psxdoom\r\nboolean\t\tdisableload = false;\t//80077A14 psxdoom\r\nbyte\t\t*mapfileptr;\t\t\t//80077D44 psxdoom\r\nint\t\t\tmapnumlumps;\t\t\t//80077F44 psxdoom\r\nlumpinfo_t  *maplump;\t\t\t\t//80077EF0 psxdoom\r\n\r\n#define WINDOW_SIZE\t4096\r\n#define LOOKAHEAD_SIZE\t16\r\n\r\n#define LENSHIFT 4\t\t/* this must be log2(LOOKAHEAD_SIZE) */\r\n\r\nunsigned char *decomp_input;\r\nunsigned char *decomp_output;\r\nextern int decomp_start;\r\n\r\n/*\r\n============================================================================\r\n\r\n\t\t\t\t\t\tLUMP BASED ROUTINES\r\n\r\n============================================================================\r\n*/\r\n\r\n/*\r\n====================\r\n=\r\n= W_Init\r\n=\r\n====================\r\n*/\r\n\r\nvoid W_Init (void)//L80031264()\r\n{\r\n\tbyte *wadfileptr;\r\n\tint infotableofs, i;\r\n\r\n\tClearFiles();\r\n\twadfilenum = OpenFile((char*)_PSXDOOM_WAD);\r\n\r\n\tReadFile(wadfilenum, wadfileptr, sizeof(wadinfo_t));\r\n\r\n\tif (D_strncasecmp(((wadinfo_t*)wadfileptr)->identification, \"IWAD\", 4))\r\n\t\tI_Error(\"W_Init: invalid main IWAD id\");\r\n\r\n\tnumlumps = BIGLONG(((wadinfo_t*)wadfileptr)->numlumps);\r\n\tlumpinfo = (lumpinfo_t *) Z_Malloc(numlumps * sizeof(lumpinfo_t), PU_STATIC, 0);\r\n\r\n\tinfotableofs = BIGLONG(((wadinfo_t*)wadfileptr)->infotableofs);\r\n\r\n\tSeekFile(wadfilenum, infotableofs, PSXCD_SEEK_SET);\r\n\tReadFile(wadfilenum, lumpinfo, numlumps * sizeof(lumpinfo_t));\r\n\r\n\tlumpcache = (lumpcache_t *) Z_Malloc(numlumps * sizeof(lumpcache_t), PU_STATIC, 0);\r\n\tlumpencode = (byte *) Z_Malloc(numlumps, PU_STATIC, 0);\r\n\r\n\tD_memset(lumpcache, NULL, numlumps * sizeof(lumpcache_t));\r\n\tD_memset(lumpencode, 0, numlumps);\r\n}\r\n\r\n/*\r\n====================\r\n=\r\n= W_CheckNumForName\r\n=\r\n= Returns -1 if name not found\r\n=\r\n====================\r\n*/\r\n\r\nint\tW_CheckNumForName (char *name)//L80031374()\r\n{\r\n\tchar\tname8[12];\r\n\tint\t\tv1,v2;\r\n\tlumpinfo_t\t*lump_p;\r\n\r\n\t/* make the name into two integers for easy compares */\r\n\tD_memset (name8,0,sizeof(name8));\r\n\tD_strncpy (name8,name,8);\r\n\tname8[8] = 0;\t\t\t/* in case the name was a full 8 chars */\r\n\tD_strupr(name8);\t\t/* case insensitive */\r\n\r\n\tv1 = *(int *)name8;\r\n\tv2 = *(int *)&name8[4];\r\n\r\n\r\n\t/* scan backwards so patch lump files take precedence */\r\n\r\n\tlump_p = lumpinfo + numlumps;\r\n\r\n\t/* used for stripping out the hi bit of the first character of the */\r\n\t/* name of the lump */\r\n\r\n#define HIBIT (1<<7)\r\n\r\n\twhile (lump_p-- != lumpinfo)\r\n\t\tif (*(int *)&lump_p->name[4] == v2\r\n\t\t&&  (*(int *)lump_p->name & ~HIBIT) == v1)\r\n\t\t\treturn lump_p - lumpinfo;\r\n\r\n\r\n\treturn -1;\r\n}\r\n\r\n/*\r\n====================\r\n=\r\n= W_GetNumForName\r\n=\r\n= Calls W_CheckNumForName, but bombs out if not found\r\n=\r\n====================\r\n*/\r\n\r\nint\tW_GetNumForName (char *name)//L80031428()\r\n{\r\n\tint\ti;\r\n\r\n\ti = W_CheckNumForName (name);\r\n\tif (i != -1)\r\n\t\treturn i;\r\n\r\n\tI_Error (\"W_GetNumForName: %s not found!\",name);\r\n\treturn -1;\r\n}\r\n\r\n/*\r\n====================\r\n=\r\n= W_LumpLength\r\n=\r\n= Returns the buffer size needed to load the given lump\r\n=\r\n====================\r\n*/\r\n\r\nint W_LumpLength (int lump)//L80031518()\r\n{\r\n\tif (lump >= numlumps)\r\n\t\tI_Error (\"W_LumpLength: %i >= numlumps\",lump);\r\n\treturn BIGLONG(lumpinfo[lump].size);\r\n}\r\n\r\n/*\r\n====================\r\n=\r\n= W_ReadLump\r\n=\r\n= Loads the lump into the given buffer, which must be >= W_LumpLength()\r\n=\r\n====================\r\n*/\r\n//inline\r\nvoid W_ReadLump (int lump, void *dest, boolean decodelump)//L80031568()\r\n{\r\n\t/*byte *input;\r\n\tlumpinfo_t\t*l;\r\n\tint lumpsize;\r\n\r\n\tif (lump >= numlumps)\r\n\t\tI_Error (\"W_ReadLump: %i >= numlumps\",lump);\r\n\r\n\tl = lumpinfo + lump;\r\n\tif(decodelump)\r\n\t{\r\n\t\tif ((l->name[0] & 0x80))\r\n\t\t{\r\n\t\t\tinput = Z_Alloc(BIGLONG(l->size), PU_STATIC, 0);\r\n\r\n\t\t\tlumpsize = BIGLONG(lumpinfo[lump + 1].filepos) - BIGLONG(l->filepos);\r\n\t\t\tSeekFile(wadfilenum, BIGLONG(l->filepos), PSXCD_SEEK_SET);\r\n\t\t\tReadFile(wadfilenum, input, lumpsize);\r\n\r\n\t\t\tdecode((unsigned char *)input, (unsigned char *)dest);\r\n\r\n\t\t\tZ_Free(input);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\r\n\tlumpsize = BIGLONG(lumpinfo[lump + 1].filepos) - BIGLONG(l->filepos);\r\n\tSeekFile(wadfilenum, BIGLONG(l->filepos), PSXCD_SEEK_SET);\r\n\tReadFile(wadfilenum, dest, lumpsize);*/\r\n\r\n\tlumpinfo_t\t*l;\r\n\tbyte\t\t*input;\r\n\tint\t\t\tlumpsize;\r\n\r\n\tif (numlumps <= lump)\r\n\t\tI_Error(\"W_ReadLump: %i >= numlumps\", lump);\r\n\r\n\tl = &lumpinfo[lump];\r\n\tif ((decodelump == 0) ||/*&&*/ ((l->name[0] & 0x80) == 0))\r\n\t{\r\n\t\tlumpsize = BIGLONG(lumpinfo[lump + 1].filepos) - BIGLONG(l->filepos);\r\n\t\t//printf(\"no comp SeekFile[%d] lumpsize[%d]\", BIGLONG(l->filepos),lumpsize);\r\n\t\tSeekFile(wadfilenum, BIGLONG(l->filepos), PSXCD_SEEK_SET);\r\n\t\tReadFile(wadfilenum, dest, lumpsize);\r\n\t}\r\n\telse /* compressed */\r\n\t{\r\n\t\tinput = Z_Alloc(BIGLONG(l->size), PU_STATIC, 0);\r\n\r\n\t\tlumpsize = BIGLONG(lumpinfo[lump + 1].filepos) - BIGLONG(l->filepos);\r\n\t\t//printf(\"comp SeekFile[%d] lumpsize[%d]\", BIGLONG(l->filepos),lumpsize);\r\n\t\tSeekFile(wadfilenum, BIGLONG(l->filepos), PSXCD_SEEK_SET);\r\n\t\tReadFile(wadfilenum, input, lumpsize);\r\n\r\n\t\tdecode((unsigned char *)input, (unsigned char *)dest);\r\n\r\n\t\tZ_Free2(mainzone, input);\r\n\t}\r\n}\r\n\r\n/*\r\n====================\r\n=\r\n= W_CacheLumpNum\r\n=\r\n====================\r\n*/\r\n\r\nvoid\t*W_CacheLumpNum (int lump, int tag, boolean decodelump)//L8003167C()\r\n{\r\n    int lumpsize;\r\n    lumpcache_t *lc;\r\n\r\n\tif (numlumps <= (unsigned)lump)\r\n\t\tI_Error(\"W_CacheLumpNum: %i >= numlumps\", lump);\r\n\r\n\tlc = &lumpcache[lump];\r\n\tif (!lc->cache)\r\n\t{\t/* read the lump in */\r\n\r\n\t\t//if (disableload != 0)\r\n\t\t\t//I_Error(\"cache miss on lump %i\", lump);\r\n\r\n\t\tif (decodelump == 0)\r\n\t\t\tlumpsize = BIGLONG(lumpinfo[lump + 1].filepos) - BIGLONG(lumpinfo[lump].filepos);\r\n\t\telse\r\n\t\t\tlumpsize = BIGLONG(lumpinfo[lump].size);\r\n\r\n\t\tZ_Malloc(lumpsize, tag, &lc->cache);\r\n\r\n\t\tW_ReadLump(lump, lc->cache, decodelump);\r\n\r\n\t\tif ((lumpinfo[lump].name[0] & 0x80) == 0)\r\n\t\t\tlumpencode[lump] = 1;\r\n\t\telse\r\n\t\t\tlumpencode[lump] = (byte)decodelump;\r\n\t}\r\n\r\n\treturn lc->cache;\r\n}\r\n\r\n/*\r\n====================\r\n=\r\n= W_CacheLumpName\r\n=\r\n====================\r\n*/\r\n\r\nvoid\t*W_CacheLumpName (char *name, int tag, boolean decodelump)//L800318B4()\r\n{\r\n\treturn W_CacheLumpNum (W_GetNumForName(name), tag, decodelump);\r\n}\r\n\r\n\r\n/*\r\n============================================================================\r\n\r\nMAP LUMP BASED ROUTINES\r\n\r\n============================================================================\r\n*/\r\n\r\n/*\r\n====================\r\n=\r\n= W_OpenMapWad\r\n=\r\n= Exclusive Psx Doom\r\n====================\r\n*/\r\n\r\nbyte *W_OpenMapWad(char *mapname)//L800319D4()\r\n{\r\n\tint mapfile, mapsize, infotableofs;\r\n\r\n\tmapfile = OpenFile(mapname);\r\n\tmapsize = SeekFile(mapfile, 0, PSXCD_SEEK_END);\r\n\r\n\tmapfileptr = Z_Alloc(mapsize, PU_STATIC, 0);\r\n\r\n\tSeekFile(mapfile, 0, PSXCD_SEEK_SET);\r\n\tReadFile(mapfile, mapfileptr, mapsize);\r\n\tCloseFile(mapfile);\r\n\r\n\tif (D_strncasecmp(((wadinfo_t*)mapfileptr)->identification, \"IWAD\", 4))\r\n\t\tI_Error(\"W_OpenMapWad: invalid map IWAD id\");\r\n\r\n\tmapnumlumps = BIGLONG(((wadinfo_t*)mapfileptr)->numlumps);\r\n\tinfotableofs = BIGLONG(((wadinfo_t*)mapfileptr)->infotableofs);\r\n\r\n\tmaplump = (lumpinfo_t*)(mapfileptr + infotableofs);\r\n\r\n\treturn mapfileptr;\r\n}\r\n\r\n/*\r\n====================\r\n=\r\n= W_MapLumpLength\r\n=\r\n= Exclusive Psx Doom\r\n====================\r\n*/\r\n\r\nint W_MapLumpLength(int lump)//L80031AA4()\r\n{\r\n\tif (lump >= mapnumlumps)\r\n\t\tI_Error(\"W_MapLumpLength: %i out of range\", lump);\r\n\r\n\treturn maplump[lump].size;\r\n}\r\n\r\n/*\r\n====================\r\n=\r\n= W_MapGetNumForName\r\n=\r\n= Exclusive Psx Doom\r\n====================\r\n*/\r\n\r\nint W_MapGetNumForName(char *name)//L80031AF4()\r\n{\r\n\tchar\tname8[16];\r\n\tint\t\tv1, v2;\r\n\tlumpinfo_t\t*lump_p;\r\n\r\n\t/* make the name into two integers for easy compares */\r\n\tD_memset(name8, 0, sizeof(name8));\r\n\tD_strncpy(name8, name, 8);\r\n\tname8[8] = 0;\t\t\t/* in case the name was a full 8 chars */\r\n\tD_strupr(name8);\t\t/* case insensitive */\r\n\r\n\tv1 = *(int *)name8;\r\n\tv2 = *(int *)&name8[4];\r\n\r\n\t/* scan backwards so patch lump files take precedence */\r\n\r\n\tlump_p = &maplump[mapnumlumps];\r\n\r\n\t/* used for stripping out the hi bit of the first character of the */\r\n\t/* name of the lump */\r\n\r\n#define HIBIT (1<<7)\r\n\r\n\twhile (lump_p-- != maplump)\r\n\t\tif (*(int *)&lump_p->name[4] == v2\r\n\t\t\t&& (*(int *)lump_p->name & ~HIBIT) == v1)\r\n\t\t\treturn lump_p - maplump;\r\n\r\n\treturn -1;\r\n}\r\n\r\n/*\r\n====================\r\n=\r\n= W_ReadMapLump\r\n=\r\n= Exclusive Psx Doom\r\n====================\r\n*/\r\n\r\nvoid W_ReadMapLump(int lump, void *dest, int decodelump)//L80031BB0()\r\n{\r\n\tlumpinfo_t *l;\r\n\tint lumpsize;\r\n\r\n\tif (lump >= mapnumlumps)\r\n\t\tI_Error(\"W_ReadMapLump: lump %d out of range\", mapnumlumps);\r\n\r\n\tl = &maplump[lump];\r\n\r\n\tif (decodelump)\r\n\t{\r\n\t\tif (l->name[0] & 0x80) // compressed\r\n\t\t{\r\n\t\t\tdecode((unsigned char *)(mapfileptr + BIGLONG(l->filepos)), (unsigned char *)dest);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\r\n\tlumpsize = BIGLONG((l + 1)->filepos) - BIGLONG(l->filepos);\r\n\tD_memcpy(dest, mapfileptr + BIGLONG(l->filepos), lumpsize);\r\n}\r\n\r\n\r\n/*\r\n============================================================================\r\n\r\nDECODE BASED ROUTINES\r\n\r\n============================================================================\r\n*/\r\n\r\n/*\r\n== == == == == == == == == ==\r\n=\r\n= decode\r\n=\r\n= Exclusive Psx Doom from Jaguar Doom\r\n== == == == == == == == == ==\r\n*/\r\n\r\nvoid decode(unsigned char *input, unsigned char *output)//L80031C60()\r\n{\r\n\tint getidbyte = 0;\r\n\tint len;\r\n\tint pos;\r\n\tint i;\r\n\tunsigned char *source;\r\n\tint idbyte = 0;\r\n\r\n\twhile (1)\r\n\t{\r\n\r\n\t\t/* get a new idbyte if necessary */\r\n\t\tif (!getidbyte) idbyte = *input++;\r\n\t\tgetidbyte = (getidbyte + 1) & 7;\r\n\r\n\t\tif (idbyte & 1)\r\n\t\t{\r\n\t\t\t/* decompress */\r\n\t\t\tpos = *input++ << LENSHIFT;\r\n\t\t\tpos = pos | (*input >> LENSHIFT);\r\n\t\t\tsource = output - pos - 1;\r\n\t\t\tlen = (*input++ & 0xf) + 1;\r\n\t\t\tif (len == 1) break;\r\n\t\t\tfor (i = 0; i<len; i++)\r\n\t\t\t\t*output++ = *source++;\r\n\t\t}\r\n\t\telse {\r\n\t\t\t*output++ = *input++;\r\n\t\t}\r\n\r\n\t\tidbyte = idbyte >> 1;\r\n\t}\r\n}\r\n\r\n/*\r\n== == == == == == == == == ==\r\n=\r\n= decodedsize\r\n=\r\n= Exclusive Psx Doom\r\n== == == == == == == == == ==\r\n*/\r\n\r\nint decodedsize(unsigned char *input)//L80031D18()\r\n{\r\n\tint getidbyte = 0;\r\n\tint len;\r\n\tbyte idbyte;\r\n\tint accum = 0;\r\n\r\n\twhile (1)\r\n\t{\r\n\t\t/* get a new idbyte if necessary */\r\n\t\tif (!getidbyte) idbyte = *input++;\r\n\t\tgetidbyte = (getidbyte + 1) & 7;\r\n\r\n\t\tif (idbyte & 1)\r\n\t\t{\r\n\t\t\t/* decompress */\r\n\t\t\tinput++;\r\n\t\t\tlen = (*input++ & 0xf) + 1;\r\n\t\t\tif (len == 1) break;\r\n\t\t\taccum += len;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\taccum++;\r\n\t\t\tinput++;\r\n\t\t}\r\n\r\n\t\tidbyte = idbyte >> 1;\r\n\t}\r\n\r\n\treturn accum;\r\n}\r\n"
  },
  {
    "path": "PSXDOOM/z_zone.c",
    "content": "/* Z_zone.c */\r\n\r\n#include \"doomdef.h\"\r\n\r\n/*\r\n==============================================================================\r\n\r\n\t\t\t\t\t\tZONE MEMORY ALLOCATION\r\n\r\nThere is never any space between memblocks, and there will never be two\r\ncontiguous free memblocks.\r\n\r\nThe rover can be left pointing at a non-empty block\r\n\r\nIt is of no value to free a cachable block, because it will get overwritten\r\nautomatically if needed\r\n\r\n==============================================================================\r\n*/\r\n\r\n#define DEBUG 0\r\n\r\nmemzone_t\t*mainzone;\r\n\r\n/*\r\n========================\r\n=\r\n= Z_Init\r\n=\r\n========================\r\n*/\r\n\r\n\r\nextern unsigned int _bbsstart;      // bss start free memory ram\r\nextern unsigned long _ramsize;      // megabytes of RAM\r\nextern unsigned long _stacksize;    // kilobytes of stack\r\n\r\nunsigned int _bbsstart2 = 0x800A9CA8;//tmp addres\r\nvoid Z_Init (void)//L80032014()\r\n{\r\n\tbyte\t*mem;\r\n\tint\t\tsize;\r\n\r\n\tmem = (byte *)((_bbsstart2 + 3) & ~3);\r\n\tsize = (((_ramsize - _stacksize) - (((_bbsstart2 + 3) & ~3) & 0x1FFFFFFF)) + 3) & ~3;\r\n\t//printf(\"Mem __bss %X\\n\", _bbsstart);\r\n\t//printf(\"Mem size %d\\n\", size);\r\n\r\n\t/* mars doesn't have a refzone */\r\n\tmainzone = Z_InitZone (mem, size);\r\n}\r\n\r\n/*\r\n========================\r\n=\r\n= Z_InitZone\r\n=\r\n========================\r\n*/\r\n\r\nmemzone_t *Z_InitZone(byte *base, int size)//L8003206C()\r\n{\r\n\tmemzone_t *zone;\r\n\r\n\tzone = (memzone_t *)base;\r\n\r\n\tzone->size = size;\r\n\tzone->rover = &zone->blocklist;\r\n\tzone->blocklist.size = size - (int)((byte *)&zone->blocklist - (byte *)zone);\r\n\tzone->blocklist.user = NULL;\r\n\tzone->blocklist.tag = 0;\r\n\tzone->blocklist.id = ZONEID;\r\n\tzone->blocklist.next = NULL;\r\n\tzone->blocklist.prev = NULL;\r\n\t//zone->blocklist.lockframe = -1;\r\n\r\n\treturn zone;\r\n}\r\n\r\n/*\r\n========================\r\n=\r\n= Z_Malloc2\r\n=\r\n= You can pass a NULL user if the tag is < PU_PURGELEVEL\r\n========================\r\n*/\r\n\r\n#define MINFRAGMENT\t64\r\n\r\nvoid *Z_Malloc2 (memzone_t *mainzone, int size, int tag, void *user)//L800320A0()\r\n{\r\n\tint\t\textra;\r\n\tmemblock_t\t*start, *rover, *newblock, *base;\r\n\r\n    #if DEBUG\r\n    Z_CheckHeap (mainzone);\t/* DEBUG */\r\n    #endif\r\n\r\n\t/* */\r\n\t/* scan through the block list looking for the first free block */\r\n\t/* of sufficient size, throwing out any purgable blocks along the way */\r\n\t/* */\r\n\r\n\tsize += sizeof(memblock_t);\t/* account for size of block header */\r\n\tsize = (size+3) & ~3;\t\t/* phrase align everything */\r\n\r\n\tstart = base = mainzone->rover;\r\n\r\n\twhile (base->user || base->size < size)\r\n\t{\r\n\t\tif (base->user)\r\n\t\t\trover = base;\r\n\t\telse\r\n\t\t\trover = base->next;\r\n\r\n\t\tif (!rover)\r\n\t\t\tgoto backtostart;\r\n\r\n\t\tif (rover->user)\r\n\t\t{\r\n\t\t\tif (rover->tag < PU_PURGELEVEL)\r\n\t\t\t{\r\n\t\t\t\t/* hit an in use block, so move base past it */\r\n\t\t\t\tbase = rover->next;\r\n\t\t\t\tif (!base)\r\n\t\t\t\t{\r\n\t\t\t\tbacktostart:\r\n\t\t\t\t\tbase = &mainzone->blocklist;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (base == start)\t/* scaned all the way around the list */\r\n                {\r\n                    Z_DumpHeap(mainzone);\r\n\t\t\t\t\tI_Error(\"Z_Malloc: failed allocation on %i\", size);\r\n                }\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n            /* */\r\n            /* free the rover block (adding the size to base) */\r\n            /* */\r\n            Z_Free((byte *)rover + sizeof(memblock_t)); /* mark as free */\r\n\t\t}\r\n\r\n\t\tif (base != rover)\r\n\t\t{\t/* merge with base */\r\n\t\t\tbase->size += rover->size;\r\n\t\t\tbase->next = rover->next;\r\n\t\t\tif (rover->next)\r\n\t\t\t\trover->next->prev = base;\r\n\t\t}\r\n\t}\r\n\r\n\t/* */\r\n\t/* found a block big enough */\r\n\t/* */\r\n\textra = base->size - size;\r\n\tif (extra >  MINFRAGMENT)\r\n\t{\t/* there will be a free fragment after the allocated block */\r\n\t\tnewblock = (memblock_t *) ((byte *)base + size );\r\n\t\tnewblock->prev = base;\r\n\t\tnewblock->next = base->next;\r\n\t\tif (newblock->next)\r\n\t\t\tnewblock->next->prev = newblock;\r\n\r\n        base->next = newblock;\r\n\t\tbase->size = size;\r\n\r\n\t\tnewblock->size = extra;\r\n\t\tnewblock->user = NULL;\t\t/* free block */\r\n\t\tnewblock->tag = 0;\r\n\t\t//printf(\"size %d\\n\",size);\r\n\t}\r\n\r\n\tif (user)\r\n\t{\r\n\t\tbase->user = user;\t\t\t/* mark as an in use block */\r\n\t\t*(void **)user = (void *)((byte *)base + sizeof(memblock_t));\r\n\t\t//printf(\"base->user_M %d\\n\",base->user);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tif (tag >= PU_PURGELEVEL)\r\n\t\t\tI_Error (\"Z_Malloc: an owner is required for purgable blocks\");\r\n\t\tbase->user = (void *)1;\t\t/* mark as in use, but unowned\t */\r\n\t}\r\n\r\n\tbase->tag = tag;\r\n\tbase->id = ZONEID;\r\n\r\n\tmainzone->rover = base->next;\t/* next allocation will start looking here */\r\n\tif (!mainzone->rover)\r\n\t\tmainzone->rover = &mainzone->blocklist;\r\n\r\n    #if DEBUG\r\n    Z_CheckHeap (mainzone);\t/* DEBUG */\r\n    #endif\r\n\r\n\treturn (void *) ((byte *)base + sizeof(memblock_t));\r\n}\r\n\r\n\r\n/*\r\n========================\r\n=\r\n= Z_Alloc2\r\n=\r\n= You can pass a NULL user if the tag is < PU_PURGELEVEL\r\n= Exclusive Psx Doom\r\n========================\r\n*/\r\n\r\nvoid *Z_Alloc2(memzone_t *mainzone, int size, int tag, void *user)//L80032298()\r\n{\r\n\tint\t\textra;\r\n\tmemblock_t\t*rover, *newblock, *base, *block;\r\n\r\n\t/* */\r\n\t/* scan through the block list looking for the first free block */\r\n\t/* of sufficient size, throwing out any purgable blocks along the way */\r\n\t/* */\r\n\r\n\t#if DEBUG\r\n    Z_CheckHeap (mainzone);\t/* DEBUG */\r\n    #endif\r\n\r\n    base = &mainzone->blocklist;\r\n\r\n    while (base->next)\r\n    {\r\n        base = base->next;\r\n    }\r\n\t/*\r\n\tfor (block = mainzone->blocklist.next; block; block = base->next)\r\n\t{\r\n\t\tbase = base->next;\r\n\t}*/\r\n\r\n\tsize += sizeof(memblock_t);\t/* account for size of block header */\r\n\tsize = (size + 3)&~3;\t\t\t/* phrase align everything */\r\n\r\n\twhile (base->user || base->size < size)\r\n\t{\r\n\t\tif (base->user)\r\n\t\t\trover = base;\r\n\t\telse\r\n\t\t{\r\n\t\t\t/* hit an in use block, so move base past it */\r\n\t\t\trover = base->prev;\r\n\t\t\tif (!rover)\r\n\t\t\t\tI_Error(\"Z_Alloc: failed allocation on %i\", size);//FIXME Change Z_Malloc To Z_Alloc\r\n\t\t}\r\n\r\n\t\tif (rover->user)\r\n\t\t{\r\n\t\t\tif (rover->tag < PU_PURGELEVEL)\r\n\t\t\t{\r\n\t\t\t\t/* hit an in use block, so move base past it */\r\n\t\t\t\tbase = rover->prev;\r\n\t\t\t\tif (!base)\r\n\t\t\t\t\tI_Error(\"Z_Alloc: failed allocation on %i\", size);//FIXME Change Z_Malloc To Z_Alloc\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t/* */\r\n            /* free the rover block (adding the size to base) */\r\n            /* */\r\n            Z_Free((byte *)rover + sizeof(memblock_t)); /* mark as free */\r\n\t\t}\r\n\r\n\t\tif (base != rover)\r\n\t\t{\t/* merge with base */\r\n\t\t\trover->size += base->size;\r\n\t\t\trover->next = base->next;\r\n\r\n\t\t\tif (base->next)\r\n\t\t\t\tbase->next->prev = rover;\r\n\r\n            base = rover;\r\n\t\t}\r\n\t}\r\n\r\n\t/* */\r\n\t/* found a block big enough */\r\n\t/* */\r\n\textra = base->size - size;\r\n\tnewblock = base;\r\n\r\n\tif (extra >  MINFRAGMENT)\r\n\t{\t/* there will be a free fragment after the allocated block */\r\n\t\tbase = (memblock_t *)((byte *)base + extra);\r\n\t\tbase->size = size;\r\n\t\tbase->prev = newblock;\r\n\t\tbase->next = newblock->next;\r\n\r\n\t\tif (newblock->next)\r\n\t\t\tnewblock->next->prev = base;\r\n\r\n\t\tnewblock->next = base;\r\n\t\tnewblock->size = extra;\r\n\t\tnewblock->user = NULL; // free block\r\n\t\tnewblock->tag = 0;\r\n\t}\r\n\r\n\tif (user)\r\n\t{\r\n\t\tbase->user = user;\t\t\t/* mark as an in use block */\r\n\t\t*(void **)user = (void *)((byte *)base + sizeof(memblock_t));\r\n\t}\r\n\telse\r\n\t{\r\n\t\tif (tag >= PU_PURGELEVEL)\r\n\t\t\tI_Error(\"Z_Alloc: an owner is required for purgable blocks\");//FIXME Change Z_Malloc To Z_Alloc\r\n\t\tbase->user = (void *)1;\t\t/* mark as in use, but unowned\t */\r\n\t}\r\n\r\n\tbase->id = ZONEID;\r\n\tbase->tag = tag;\r\n\tmainzone->rover = &mainzone->blocklist;\r\n\r\n\t#if DEBUG\r\n    Z_CheckHeap (mainzone);\t/* DEBUG */\r\n    #endif\r\n\r\n\treturn (void *)((byte *)base + sizeof(memblock_t));\r\n}\r\n\r\n\r\n/*\r\n========================\r\n=\r\n= Z_Free2\r\n=\r\n========================\r\n*/\r\n\r\ninline void Z_Free2(memzone_t *mainzone, void *ptr)//L800324A8()\r\n{\r\n\tmemblock_t\t*block;\r\n\r\n\tblock = (memblock_t *)((byte *)ptr - sizeof(memblock_t));\r\n\tif (block->id != ZONEID)\r\n\t\tI_Error(\"Z_Free: freed a pointer without ZONEID\");\r\n\r\n\tif (block->user > (void **)0x100)\t/* smaller values are not pointers */\r\n\t\t*block->user = 0;\t\t/* clear the user's mark */\r\n\tblock->user = NULL;\t/* mark as free */\r\n\tblock->tag = 0;\r\n\tblock->id = 0;\r\n}\r\n\r\n/*\r\n========================\r\n=\r\n= Z_FreeTags\r\n=\r\n========================\r\n*/\r\n\r\nvoid Z_FreeTags (memzone_t *mainzone, int tag)//L80032510()\r\n{\r\n\tmemblock_t\t*block, *next;\r\n\r\n\tfor (block = &mainzone->blocklist ; block ; block = next)\r\n\t{\r\n\t\tnext = block->next;\t\t/* get link before freeing */\r\n\t\tif (!block->user)\r\n\t\t\tcontinue;\t\t\t/* free block */\r\n\t\tif (block->tag & tag)\r\n\t\t{\r\n\t\t    Z_Free2(mainzone, (byte *)block + sizeof(memblock_t));\r\n\t\t}\r\n\t}\r\n\r\n\tfor (block = &mainzone->blocklist; block; block = next)\r\n\t{\r\n\t\tnext = block->next; // get link before freeing\r\n\t\tif (!block->user && next && !next->user)\r\n\t\t{\r\n\t\t\tblock->size += next->size;\r\n\t\t\tblock->next = next->next;\r\n\t\t\tif (next->next) // <- Final Doom, Doom GH, Eup Jap\r\n                next->next->prev = block;\r\n            next = block;\r\n\t\t}\r\n\t}\r\n    mainzone->rover = &mainzone->blocklist;\r\n}\r\n\r\n\r\n/*\r\n========================\r\n=\r\n= Z_CheckHeap\r\n=\r\n========================\r\n*/\r\n\r\nvoid Z_CheckHeap (memzone_t *mainzone)//L80032640()\r\n{\r\n\tmemblock_t *checkblock;\r\n\r\n\tfor (checkblock = &mainzone->blocklist ; checkblock; checkblock = checkblock->next)\r\n\t{\r\n\t\tif (!checkblock->next)\r\n\t\t{\r\n\t\t\tif ((byte *)checkblock + checkblock->size - (byte *)mainzone != mainzone->size)\r\n\t\t\t\tI_Error (\"Z_CheckHeap: zone size changed\\n\");\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tif ( (byte *)checkblock + checkblock->size != (byte *)checkblock->next)\r\n\t\t\tI_Error (\"Z_CheckHeap: block size does not touch the next block\\n\");\r\n\t\tif ( checkblock->next->prev != checkblock)\r\n\t\t\tI_Error (\"Z_CheckHeap: next block doesn't have proper back link\\n\");\r\n\t}\r\n\r\n\t#if DEBUG\r\n\tZ_DumpHeap(mainzone);\r\n\t#endif\r\n}\r\n\r\n\r\n/*\r\n========================\r\n=\r\n= Z_ChangeTag\r\n=\r\n========================\r\n*/\r\n\r\nvoid Z_ChangeTag (void *ptr, int tag)//L80032708()\r\n{\r\n\tmemblock_t\t*block;\r\n\r\n\tblock = (memblock_t *) ( (byte *)ptr - sizeof(memblock_t));\r\n\tif (block->id != ZONEID)\r\n\t\tI_Error (\"Z_ChangeTag: freed a pointer without ZONEID\");\r\n\tif (tag >= PU_PURGELEVEL && (int)block->user < 0x100)\r\n\t\tI_Error (\"Z_ChangeTag: an owner is required for purgable blocks\");\r\n\tblock->tag = tag;\r\n}\r\n\r\n\r\n/*\r\n========================\r\n=\r\n= Z_FreeMemory\r\n=\r\n========================\r\n*/\r\n\r\nint Z_FreeMemory (memzone_t *mainzone)//L80032794()\r\n{\r\n\tmemblock_t\t*block;\r\n\tint\t\t\tfree;\r\n\r\n\tfree = 0;\r\n\tfor (block = &mainzone->blocklist ; block ; block = block->next)\r\n    {\r\n\t\tif (!block->user)\r\n\t\t\tfree += block->size;\r\n    }\r\n\r\n\treturn free;\r\n}\r\n\r\n/*\r\n========================\r\n=\r\n= Z_DumpHeap\r\n=\r\n========================\r\n*/\r\n\r\nvoid Z_DumpHeap(memzone_t *mainzone)//L800327D4()\r\n{\r\n#if DEBUG\r\n\tmemblock_t\t*block;\r\n\r\n\tprintf(\"zone size: %i  location: %p\\n\", mainzone->size, mainzone);\r\n\r\n\tfor (block = &mainzone->blocklist; block; block = block->next)\r\n\t{\r\n\t\tprintf(\"block:%p    size:%7i    user:%p    tag:%3i    frame:%i\\n\",\r\n\t\t\tblock, block->size, block->user, block->tag, block->lockframe);\r\n\r\n\t\tif (!block->next)\r\n\t\t\tcontinue;\r\n\r\n\t\tif ((byte *)block + block->size != (byte *)block->next)\r\n\t\t\tprintf(\"ERROR: block size does not touch the next block\\n\");\r\n\t\tif (block->next->prev != block)\r\n\t\t\tprintf(\"ERROR: next block doesn't have proper back link\\n\");\r\n\t}\r\n#endif\r\n}\r\n\r\n"
  },
  {
    "path": "PSYQ/README.txt",
    "content": "Replace these files once the PSYQ SDK is installed, copy them to the following address C:\\psyq\\bin\r\n\r\nCPE2X.EXE \tOriginally from Orion http://onorisoft.free.fr/\r\ncpe2x_gec.exe \tA modified version of Orion"
  },
  {
    "path": "README.md",
    "content": "# PSXDOOM-RE\r\n\r\nWelcome to the complete reverse engineering of PSX Doom by [GEC], this effort took about 2 and a half years to complete, now with the departure of **[PsyDoom](https://github.com/BodbDearg/PsyDoom)** the objective is to collaborate with Psx Doom PC BackPort in addition to correcting and sharing information on both projects.\r\n\r\nYou need to download and install the Psy-Q SDK http://www.psxdev.net/downloads.html\r\n\r\nIt is necessary to visit this page for installation since it is a very old software, frequently presenting failures in modern Windows\r\nhttp://www.psxdev.net/help/psyq_install.html\r\n\r\nOnce you have completed the installation process, go to copy the files in the PSYQ folder and it is necessary for the compilation.\r\n\r\n\r\nNow everything is complete, copy the PSXDOOM-RE folder to the root \"C:\" of your hard drive.\r\n\r\nYou need to copy the PSXDOOM SLUS_000.77 game files, with everything and their folders, the MOVIE.STR file is impossible to copy in Windows, it is the only file that is previously in the ABIN folder.\r\n\r\nYou run the MAKEFILE.bat to compile and create the main.exe file, it will be automatically copied to the GAME folder.\r\n\r\nIn the GAME folder, you run the MAKE_CD.bat file, it will create the CD image, and it will also create 2 necessary files that are \"PSXCDABS.C and PSXCDABS.H\" these are automatically copied to the previous folder, this is essential since if you modify the code or the files of the game these will change your LBA address and the file size, which requires compiling it again to avoid getting loading errors.\r\n\r\n\r\nNotes:\r\nThe project is created with CodeBlocks, although it does not serve to compile, but to have the code in order and verification.\r\n\r\nThe mkpsxiso.exe program is originally created by lameguy64, but the present version is modified by me, to create the files \"PSXCDABS.C and PSXCDABS.H\".\r\nhttps://github.com/Lameguy64/mkpsxiso by lameguy64\r\n\r\n\r\nSpecial thanks to my brothers for the help to the community in DoomWorld and Kaiser since he is the only one to see the progress of my work and helps me in several occasions.\r\n\r\nNews:\r\n* No clip cheat code from PsyDoom.\r\n* VRAM Viewer added from Master Edition PsxDoom.\r\n* FPS Counter that can be deactivate/activate in the code itself.\r\n"
  }
]