|
|
(13 intermediate revisions by the same user not shown) |
Line 2: |
Line 2: |
| | | |
| ==[[UFOextender|UFO Extender]]== | | ==[[UFOextender|UFO Extender]]== |
− | This is the original program created by [[user:seb76|Seb76]] for use with ''Enemy Unknown''. Check out the [[UFOextender|UFO Extender's Information Page]]. You can download the latest version and patches here: [[:file:UFOLoader.zip|UFOextender]]. | + | This is the original program created by [[user:seb76|Seb76]] for use with ''Enemy Unknown''. Check out the [[UFOextender|UFO Extender's Information Page]]. You can download the latest version and patches here: [[:file:UFOLoader.zip|UFO Extender]]. |
| | | |
− | If you interested in the source code, it is available here: [[Image:UFOExtender-src.zip]]. | + | If you're interested in the source code, it is available. Be warned you'll need to decompile the executable and be familiar with disassembly terminology to understand a lot of what the Extender does, since it inserts new lines into preexisting code. The source files for the Extender are here: [[Image:UFOExtender-src.zip]]. |
| | | |
| ==[[TFTDextender|TFTD Extender]]== | | ==[[TFTDextender|TFTD Extender]]== |
− | This is the conversion from UFOloader. It adds a lot of functionality and fixes to the Collector's Edition (MS Windows version) of ''Terror from the Deep''. Click on the title to get to the information page.
| + | It adds a lot of functionality and fixes to the Collector's Edition (MS Windows version) of ''Terror from the Deep''. Click on the title to get to the information page. |
| | | |
| For those interested, here is the [[:File:TFTDextender-src.zip| source code]] for the Extender. | | For those interested, here is the [[:File:TFTDextender-src.zip| source code]] for the Extender. |
| | | |
− | ==Modding the Tank/Cannon into a Tank/Chaingun==
| + | ==Other information== |
− | | |
− | Many people have questions about this. It's fairly easy to change the ammo type of the Tank/Cannon turrent and damage into a AP/rifle and then giving the turret autofire. The real problem is changing the amount of ammo in the tank and not cause problems with the amount of ammo in your base stores. In the executable there are various places that handle updating the amount of ammo for the various events: adding a tank onto a craft(checking if the base has the proper amount of ammo for the tank and removing that amount from base stores, if so), removing the tank from a craft (adding the ammo back to base stores), post-tactical (adding the remaining ammo from the tank into base stores and attempting to add the tank back onto the craft), and post base-defense (adding the remaining ammo to base stores.) In addition, there is the line that sets the amount of ammo for the tank in unitref.dat. If you miss any of these areas, your ammo supply quickly spirals out of control or you get no benefit for the changes you have made.
| |
− | | |
− | This was my initial experiment with Assembly before I learned about Seb's Extender. All of this was done by modifying the bytes of code directly and rearranging them to get my changes to fit.
| |
− | | |
− | The DOS version of the game makes it much simpler to adjust the stats, but I have lost the notes on the offsets. The problem with the CE version is the way the compiler wrote the calculations. In the code, the value was calculated by using multiples of five with bit-shifts to get to 30. This means you can't choose any amount for your ammo. I rewrote these lines to make it simpler to understand and give more freedom to choose the value(Feel free to use these changes. I gave my tank 60 rounds {3Ch}. However, unless you want to deduce for yourself how to modify the proper locatins, don't increase the amount of ammo over 63. [This has to do with how the game uses bit-shifts to calculate remaining ammo during the post-tatical phase]):
| |
− |
| |
− | <nowiki>TANK/CANNON AMMO ALTERATION
| |
− | POST-TACTICAL PHASE BASE/CRAFT INVENTORY UPDATE
| |
− | 0x449C53: B8 3C 00 00 00 0F AF C2 90 90 3B F0 7D 2C 66 0F B6 D2 66 01 17 B8 89 88 88 88 F7 EE 03 D6 C7 44 24 10 01 00 00 00 C1 FA 05 8B C2 C1 E8 1F 03 D0 88 55 2C 66 0F B6
| |
− | D2 66 29 17 66 0F B6 45 00 8B D0 C1 E2 0B 2B D0 C1 E2 04 03 D0 C1 E2 02 66 02 91 1A 01 00 00 90 90
| |
− | | |
− | .text:00449C53 mov eax, 3Ch
| |
− | .text:00449C58 imul eax, edx
| |
− | .text:00449C5B nop
| |
− | .text:00449C5C nop
| |
− | .text:00449C5D cmp esi, eax
| |
− | .text:00449C5F jge short loc_449C8D
| |
− | .text:00449C61 movzx dx, dl
| |
− | .text:00449C65 add [edi], dx
| |
− | .text:00449C68 mov eax, 88888889h
| |
− | .text:00449C6D imul esi
| |
− | .text:00449C6F add edx, esi
| |
− | .text:00449C71 mov [esp+30h+var_20], 1
| |
− | .text:00449C79 sar edx, 5
| |
− | .text:00449C7C mov eax, edx
| |
− | .text:00449C7E shr eax, 1Fh
| |
− | .text:00449C81 add edx, eax
| |
− | .text:00449C83 mov [ebp+2Ch], dl
| |
− | .text:00449C86 movzx dx, dl
| |
− | .text:00449C8A sub [edi], dx
| |
− | .text:00449C8D movzx ax, byte ptr [ebp+0]
| |
− | .text:00449C92 mov edx, eax
| |
− | .text:00449C94 shl edx, 0Bh
| |
− | .text:00449C97 sub edx, eax
| |
− | .text:00449C99 shl edx, 4
| |
− | .text:00449C9C add edx, eax
| |
− | .text:00449C9E shl edx, 2
| |
− | .text:00449CA1 db 66h
| |
− | .text:00449CA1 add dl, [ecx+11Ah]
| |
− | .text:00449CA8 nop
| |
− | .text:00449CA9 nop
| |
− | | |
− | 0x449DFA: B8 3C 00 00 00 0F AF C2 3B F0 7D 2E 90 90 66 0F B6 D2 66 01 17 B8 89 88 88 88 F7 EE 03 D6 C7 44 24 10 01 00 00 00 C1 FA 05 8B C2 C1 E8 1F 03 D0 88 55 00 66 0F B6
| |
− | D2 66 29 17 66 0F B6 45 00 8B D0 C1 E2 0B 2B D0 C1 E2 04 03 D0 C1 E2 02 66 01 91 1A 01 00 00 90 90
| |
− | | |
− | .text:00449DFA mov eax, 3Ch
| |
− | .text:00449DFF imul eax, edx
| |
− | .text:00449E02 cmp esi, eax
| |
− | .text:00449E04 jge short loc_449E34
| |
− | .text:00449E06 nop
| |
− | .text:00449E07 nop
| |
− | .text:00449E08 movzx dx, dl
| |
− | .text:00449E0C add [edi], dx
| |
− | .text:00449E0F mov eax, 88888889h
| |
− | .text:00449E14 imul esi
| |
− | .text:00449E16 add edx, esi
| |
− | .text:00449E18 mov [esp+30h+var_20], 1
| |
− | .text:00449E20 sar edx, 5
| |
− | .text:00449E23 mov eax, edx
| |
− | .text:00449E25 shr eax, 1Fh
| |
− | .text:00449E28 add edx, eax
| |
− | .text:00449E2A mov [ebp+0], dl
| |
− | .text:00449E2D movzx dx, dl
| |
− | .text:00449E31 sub [edi], dx
| |
− | .text:00449E34 movzx ax, byte ptr [ebp+0]
| |
− | .text:00449E39 mov edx, eax
| |
− | .text:00449E3B shl edx, 0Bh
| |
− | .text:00449E3E sub edx, eax
| |
− | .text:00449E40 shl edx, 4
| |
− | .text:00449E43 add edx, eax
| |
− | .text:00449E45 shl edx, 2
| |
− | .text:00449E48 add [ecx+11Ah], dx
| |
− | .text:00449E4F nop
| |
− | .text:00449E50 nop
| |
− | | |
− | [TANK/CHAINGUN AMMO AMOUNT SET WHEN GEOSCAPE UPDATES UNITREF.DAT FOR NEXT BATTLE]
| |
− | 0x44ED27: C6 45 76 3C
| |
− | | |
− | .text:0044ED27 mov byte ptr [ebp+76h], 3Ch
| |
− | | |
− | [TANK/CHAINGUN AMMO CHECK IN BASE INVENTORY AND ALTERATION OF AMOUNT]
| |
− | 0x456410: 66 83 84 90 1A 01 00 00 3C
| |
− | | |
− | .text:00456410 add word ptr [eax+edx*4+11Ah], 3Ch
| |
− | 0x4564F1: 66 83 F9 3C
| |
− | .text:004564F1 cmp cx, 3Ch
| |
− | 0x456512: 83 C1 C4
| |
− | .text:00456512 add ecx, 0FFFFFFC4h (add ecx, -3Ch)
| |
− | | |
− | [Alternate option]
| |
− | 0x456512: 83 E9 3C
| |
− | .text:00456512 sub ecx, 3Ch
| |
− | | |
− | | |
− | TANK STATS start at offset 47573B
| |
− | | |
− | TANK UFOpaedia info 4752B0~4752CF
| |
− | </nowiki>
| |
− | | |
− | ==Comparison of Damage routines==
| |
− | [[File:xcraft-dam-routine.GIF]]
| |
− | | |
− | | |
− | To explain, first the memory address of the Xcraft weapon is loaded to eax. Then the damage value is read from (eax+6) and loaded into bx. This value is sent to the random function where the value generated is returned through eax. Thereafter, the base value (ebx) is added to the random value (eax) for a range of 100-200%. The value of eax has edx subtracted from it (which would take into account an odd number, so edx would be at most 1 but is usually zero). eax is divided by two (bit-shifted to the right {sar/shr} once) and the final amount added to the amount of damage the craft has sustained (edi+0Ah) {edi is the target UFO's memory offset}. The result is that Xcraft weapons do 50-100% damage.
| |
− | | |
− | [[File:UFO-dam-routine.GIF]]
| |
− | | |
− | In the UFO case: the memory location for the UFO stats are set in ecx. Then the UFO weapon power is read (ecx+16h) and put into dx. Then this value is sent to the random funtion and again returned through eax (or ax as is the case here). ecx is set to zero and the random value is checked to see if zero was generated [cmp(compare) ax, cx]. If this is true, the program jumps past the section to assign damage to the Xcraft.
| |
− | | |
− | | |
− | | |
− | | |
− | *The main routine for interdiction in DOS1.4 version is from 330B0~336A8.
| |
− | | |
− | ==Table of Battlescape sound calls==
| |
− | The following is a list of how most events in TACTICAL generate sounds. This data is scattered throughout the executable in various data arrays. First an event number is passed to the sound subroutine. The program then compares the event with its corresponding entry in another section to determine how to play that sound. 06 is the standard method. 01 plays the sound uninterrupted by other sounds.
| |
− | Here is the link for [[SOUND|SAMPLE2.CAT]] references.
| |
− | <nowiki>
| |
− | Play CAT
| |
− | Evt# Setting reference Description
| |
− | 00 00 -- Normal bipedal movement. Routine refers to tileset and alternates between 1 and 2.
| |
− | 01 01 0E normal tank move
| |
− | 02 01 00 snakeman move
| |
− | 03 02 --
| |
− | 04 01 0F Flying unit move
| |
− | 05 01 10 Celatid move
| |
− | 06 01 2F Silacoid move
| |
− | 07 02 --
| |
− | 08 02 --
| |
− | 09 02 --
| |
− | 0A 01 28 hovertank/cyberdisk move
| |
− | 0B 06 04 rifle/pistol shoot
| |
− | 0C 06 16 bullet hit
| |
− | 0D 03 14 sliding door opens. Routine randomly plays 1 of the 2 entries in SAMPLE2.
| |
− | 0E 06 03 normal door opens
| |
− | 0F 02 --
| |
− | 10 06 0C big gun shoots
| |
− | 11 06 0D big gun hits
| |
− | 12 06 0B laser gun shoots
| |
− | 13 06 13 laser shot hits
| |
− | 14 06 12 plasma gun shoots
| |
− | 15 06 13 plasma shot hits
| |
− | 16 06 34 rocket launches
| |
− | 17 06 35 blaster bomb/stun launcher shoots
| |
− | 18 06 0C small explosion (problem: zombie move)
| |
− | 19 06 05 big explosion
| |
− | 1A 02 -- stun rod (*problem*)
| |
− | 1B 06 24 psi attack
| |
− | 1C 06 06 mind probe use*
| |
− | 1D 06 11 reload weapon
| |
− | 1E 06 26 place an item
| |
− | 1F 02 --
| |
− | 20 04 -- death of a male. Routine randomly plays 1 of the 3 sounds in SAMPLE2.
| |
− | 21 06 17 tank destroyed
| |
− | 22 06 0A sectoid death
| |
− | 23 06 08 snakeman death
| |
− | 24 06 09 etheral death
| |
− | 25 06 06 muton death
| |
− | 26 06 0A floater death
| |
− | 27 06 07 celatid death
| |
− | 28 06 08 silacoid death
| |
− | 29 06 09 chryssalid death
| |
− | 2A 06 0A reaper death
| |
− | 2B 06 17 sectopod death
| |
− | 2C 06 17 cyberdisk death
| |
− | 2D 06 30 zombie & reaper attack
| |
− | 2E 06 31 chryssalid attack
| |
− | 2F 06 32 silacoid attack
| |
− | 30 06 30 celatid attack
| |
− | 31 06 27 throw an item
| |
− | 32 05 -- death of a female. Routine randomly plays 1 of the 3 sounds in SAMPLE2.
| |
− | 33 02 --
| |
− | 34 02
| |
− | 35 02
| |
− | 36 02
| |
− | 37 02
| |
− | </nowiki>
| |
− | | |
− | ==Other Random Sound Information== | |
− | <nowiki>
| |
− | | |
− | 406100-subroutine for melee attacks
| |
− | 406110- set default melee sound event to 1A
| |
− | (4067C8)data base of melee attacks
| |
− | value offset sound event #
| |
− | 00 461B2 2F
| |
− | 01 461BC 2E
| |
− | 02 461C6 2D
| |
− | 03 461E7 skip
| |
− | 04 461E7 skip
| |
− | 05 461E7 skip
| |
− | 06 461E7 skip
| |
− | 07 461C6 2D
| |
− | | |
− | Reference points for unit movement sound event IDs. [this word referenced]
| |
− | .data:0046D1A0 00 00 00 00 01 00 01 00 00 00 00 00 [00 00] 00 00
| |
− | .data:0046D1B0 [00 00] 00 00 [00 00] 00 00 [01 00] 01 00 [00 00] 00 00
| |
− | .data:0046D1C0 [02 00] 01 00 [00 00] 00 00 [00 00] 00 00 [04 00] 01 00
| |
− | .data:0046D1D0 [05 00] 01 00 [06 00] 01 00 [00 00] 00 00 [00 00] 00 00
| |
− | .data:0046D1E0 [00 00] 00 00 [0A 00] 01 00 [00 00] 00 00 [00 00] 00 00
| |
− | .data:0046D1F0 [18 00] 01 00 01 00 00 00 01 00 0B 00 0C 00 01 00
| |
− |
| |
− | data set for death scream per unit.
| |
− | 0.data:0046B644 word_46B644 dw 20h ; DATA XREF: sub_40E450+55�r
| |
− | 1.data:0046B646 db 20h
| |
− | 2.data:0046B648 db 20h
| |
− | 3.data:0046B64A db 21h
| |
− | 4.data:0046B64C db 22h
| |
− | 5.data:0046B64E db 23h
| |
− | 6.data:0046B650 db 24h
| |
− | 7.data:0046B652 db 25h
| |
− | 8.data:0046B654 db 26h
| |
− | 9.data:0046B656 db 27h
| |
− | A.data:0046B658 db 28h
| |
− | B.data:0046B65A db 29h
| |
− | C.data:0046B65C db 2Ah
| |
− | D.data:0046B65E db 2Bh
| |
− | E.data:0046B660 db 2Ch
| |
− | F.data:0046B662 db 20h
| |
− | 10.data:0046B664 db 32h
| |
− | 11.data:0046B666 db 20h
| |
− | | |
− | | |
− | SUBROUTINE USED FOR
| |
− | | |
− | 404650+1AE PSI ATTACK EFX
| |
− | 406100+4F9 TERRORIST MELEE ATTACK EFX
| |
− | 40B420+111 EXPLOSION EFX
| |
− | 40B420+24F EXPLOSION EFX?
| |
− | 40E450+73 DEATH SCREAM EFX
| |
− | 40F2C0+285 PLACE ITEM EFX
| |
− | 4110E0+E0 ITEM USE EFX
| |
− | 4110E0+901 SHOT HIT EFX
| |
− | 419660+1A5 PLACE ITEM (INVENTORY) EFX
| |
− | 419660+346 RELOAD EFX
| |
− | 41DCC0+D1 STUN ROD ATTACK EFX
| |
− | 41EE10+8C PSI ATTACK EFX
| |
− | 41F0F0+8C PSI ATTACK EFX
| |
− | 41FD10+8B MIND PROBE EFX
| |
− | 421140+13 DOORS EFX
| |
− | 4247D0+27A NON-WALK MOVE EFX
| |
− | 4247D0+4D4 WALK MOVE EFX
| |
− | 42A630+B7 GMTATICS.MID
| |
− | 42A6F0+18 GMLOSE.MID
| |
− | 42B6F0+E9 GMWIN.MID
| |
− | 43D8C0+E GEOSCAPE OPEN WINDOW EFX
| |
− | 4407D0+2E ?
| |
− | 4407D0+9C GMGEOx.MID
| |
− | 445B00+BC GMINTER.MID
| |
− | 4467C0+1C1 X-COM CRAFT LEFT WEAPON EFX
| |
− | 4467C0+233 X-COM CRAFT RIGHT WEAPON EFX
| |
− | 446DA0+267 UFO HIT EFX
| |
− | 4470B0+F2 UNKNOWN INTERCEPTION EVENT (CRAFT CRASH EFX?)
| |
− | 447EE0+32 GMSTORY.MID
| |
− | 448390+28F ??
| |
− | 448390+2DD BASE DEFENSE (EVENT 9)
| |
− | 448390+3DC ?0A (BASE DEFENSE?)
| |
− | 448390+3F1 ?0A
| |
− | 448390+406 ?0A
| |
− | 44A220+15 GMSTORY.MID
| |
− | 44C940+10 GMDEFEND.MID
| |
− | 44CD40+26 GMBASE.MID
| |
− | 44D030+D GMDEFEND.MID
| |
− | 44D3C0+E GMMARS.MID
| |
− | 44D690+10 GMMARS.MID
| |
− | 44DACO+10 GMBASE.MID
| |
− | 450F10+91 BLEEP (1)
| |
− | 45DCA0+17 ??
| |
− | </nowiki>
| |
− | | |
− | ==Functions used in UFOextender's new interception routines==
| |
− | For those that might want to know how accuracy is calculated with the new options for interception turned on:
| |
− | | |
− | X-Craft Accuracy
| |
− | | |
− | [(1+((3-(.5*(difficulty level-1)))/UFOsize)/2 ] * Weapon Accuracy ....... [beginner=1..superhuman=5]
| |
− | <nowiki>Diff Ship Sizes
| |
− | VS S M L VL
| |
− | begin 0.8 0.875 1 1.25 2
| |
− | exp 0.75 0.8125 0.91667 1.125 1.75
| |
− | vet 0.7 0.75 0.83333 1 1.5
| |
− | Genius 0.65 0.6875 0.75 0.875 1.25
| |
− | Super 0.6 0.625 0.66667 0.75 1</nowiki>
| |
− |
| |
− | | |
− | UFO Accuracy
| |
− | | |
− | 60 + ((difficulty level-1)*3) - [Cautious Mode bonus (10)]
| |
− | | |
− | ==X-COM and the role of the Extenders==
| |
− | | |
− | :"The aliens attempt to exterminate all humanity, destroying cities and poisoning the air and sea. The resistance of earth armies is futile in the face of vastly superior technology."
| |
− | | |
− | :X-COM was incomplete and falls short of what the Gallops ultimately wanted.
| |
− | After all my experience with the reviewing the code for the Extender and the list of known bugs in both games, I firmly believe this great game was never finished the way that the Gallops had envisioned. By today's standards, the code that was released back in 1994 would be considered merely a stable alpha build. The history of X-COM's creation is the first evidence: The Gallops were required to create a completely new strategic layer for their Laser-Squad sequel, it's initial cancellation by Micropose, and then sudden reactivation. The Gallops were only allowed a short amount of time to accomplish everything. Also, the Gallops admitted, in future interviews, that they were under-staffed (being only themselves coding the game). All this means that corners had to be cut in order to get a finished product by the deadline. As such, the finished product is the best they could do with the man-power and time they had. One only has to look at the laundry list of bugs in the game, the number of outrageous exploits, and logical discrepancies as further proof of how incomplete the game actually was (but is a credit to them at how awesome the game still is.)
| |
− | | |
− | I hope to make the game closer to what the Gallops would have released if they had been given the time to develop the game further and to balance many things within the strategic layer. Therefore, I want to close as many bugs and exploits as possible and make the game more challenging in a logical manner (and not making changes just for the sake of difficulty.) Genius level should challenge veteran players. Superhuman should be very difficult to win.
| |
− | | |
− | :The aliens attempt to exterminate all humanity, destroying cities and poisoning the air and sea. The resistance of earth armies is futile in the face of vastly superior technology." - opening lines of the failed game message.
| |
− | | |
− | X-COM is NOT a StarCraft, Ender's Game, or StarShip Troopers-esque game of the humans adapting alien technology to hold off and eventually defeat the alien armada with a small human fleet of powerful warships and super soldiers. X-COM is "Independence Day" or "The Battle of Yavin": The humans take advantage of a single weakness in their enemy's organization and have one chance to deliver the fatal blow before they are overwhelmed. That is why the player only gets once chance at Cydonia. The humans reveal the extent of their knowledge and advances to the aliens and, if they fail, the aliens no longer want to capture the Earth intact. The game doesn't continue further with a higher rate of alien activity. The aliens turn all their resources to outright attacking the planet and the game is over.
| |
− | | |
− | In X-COM there is only one game winning strategy: Get to Mars ASAP. How you get to that point should be up to the player.
| |
− | | |
− | In the future, many of the changes could be tied to the difficulty of the game and not available to enable/disable in the INI. At some point the Extender will probably stop being compatible with XcomUtil. I make decisions and write code only from the reviewing the vanilla code. If this occurs, I would be interested in knowing what features people are missing and see if its possible to incorporate something similar into the Extender.
| |
− | | |
− | ==Other Information==
| |