Difference between revisions of "PRODUCT.DAT"

From UFOpaedia
Jump to navigation Jump to search
m (fixed links to hatfarm's website)
m
 
(14 intermediate revisions by 6 users not shown)
Line 2: Line 2:
  
 
Most (if not all) of this info was obtained from [http://www.stonepool.com/xcom/hacking/product.html Hatfarm's] website. There are still values that are unknown in their function.
 
Most (if not all) of this info was obtained from [http://www.stonepool.com/xcom/hacking/product.html Hatfarm's] website. There are still values that are unknown in their function.
 +
 +
The PRODUCT.DAT data can also be found at offset 355600 in the vanilla 1.4 [[GEOSCAPE.EXE]].
  
 
==Structure==
 
==Structure==
Each entry is 18 bytes long with 35 entries totaling 630 bytes.
+
Each entry is 18 bytes long with 35 entries totaling 630 bytes. Values are presented according to byte offset (0 to 17).
 +
 
 +
'''0-3 (4 Bytes):''' Cost to manufacture item, in low-to-high byte format ([0] x 1, [1] x 256, [2] x 256<sup>2</sup>, [3] x 256<sup>3</sup>). This is the cost shown on the Build screen. Byte 3 is always 0; the most costly item requires 900k (256<sup>3</sup> = 16.8 million).
 +
 
 +
'''4-5 (2 Bytes):''' Engineering Hours needed to complete one item (low byte, high byte)
 +
 
 +
'''6-7 (2 Bytes):''' Work space needed (low byte, high byte). It's conjecture that Byte 7 is the high byte for Byte 6; it's always 0. No item comes close to needing 256 work spaces (36 is the max).
  
* Offset '''0 (4 Bytes)''' - Unit price for the item
+
'''8-13 (6 Bytes):''' An odd data-packing scheme to show manufacturing prerequisites. Bytes 8-10 show the prequisite; the matching Bytes 11-13 show how many are needed. Here, "matching" means whether it's the 1st, 2nd, or 3rd byte. Possible values for prerequisites (Bytes 8-10) - indexes into [[BASE.DAT]]:
 +
:*60 = E115
 +
:*88 = Alloys
 +
:*80 = Power Source
 +
:*81 = Navigation
 +
:*255 = null (no prereq)
 +
:For example, the Avenger's bytes 8-13 read: 88, 80, 81, 120, 2, 1. It needs 120 Alloys, 2 PSs, and 1 Nav.
  
* Offset '''4 (2 Bytes)''' - Engineering Hours needed to complete 1 item
+
:This is an odd packing scheme because they used 6 bytes to show values for only 4 possible prerequisites. They could've just used 4 bytes, with each one specific to the four prereq types. Possibly they were originally thinking of having many more types of prequisites (but any one item could only have a max of 3 prerequisites). Perhaps e.g. TFTD has more prereqs. In any event, it's interesting inasmuch as it's a rare(?) example of X-COM packing data that should have been in an external list (per relational database rules) into its parent flat file. A somewhat similar example can be found with ammo requirements in bytes 25-28 of [[OBDATA.DAT]].
  
* Offset '''6 (1 Byte?)''' - Work space needed
+
:Note that these bytes are also the cause of the [[Manufacturing_Profitability#Laser_Cannons_vs._Fusion_Ball_Launchers|Fusion Ball Launcher (FBL) manufacturing "bug"]]. The FBL does not require an Alien Alloy for the first FBL made (as shown on the Build screen), but subsequent FBLs made in the same batch run ''do'' require an Alloy. For the FBL (the first Product in this file), bytes 8-13 read: 255, 88, 255, 0, 1, 0. It is the '''only''' PRODUCT.DAT item that does not have all its prerequisites shifted to the left (i.e., byte 8 is never null if there is a prequisite, for everything but the FBL). Apparently the Build screen itself (and the first item made) is coded to stop checking prerequisites as soon as it finds a null prereq - but subsequently the manufacturing code ''does'' check all 3 prerequisite columns. Editing PRODUCT.DAT to shift the Alloy prereq "left" fixes the problem (the first FBL shows, and uses, one Alloy). This fix only affects new production jobs; current jobs are stored in BPROD.DAT. Also note that the source data for PRODUCT.DAT is stored in the .EXE; you'd have to edit the executable to permanently fix the bug. Or just consider it a tiny gift from the programmers - one Alloy saved for each FBL manufacturing job - and get back to work saving the world. ''Courtesy of Zombie:'' The Executable's source bytes for PRODUCT.DAT's FBL are 459821-459838 in [[HackerTools|MS-Edit]] with 100 columns or 459720-459737 normally. Just look for 255, 88, 255 and that'll be the start of the mess. This is for the CE executable. If you have the DOS version, simply search for the three numbers above and you should find it near the end of Geoscape.exe.
  
* Offset '''11 (1 Byte)''' - [[Alien Alloys]] Needed
+
'''14 (1 Byte):''' Item type manufactured. This is a record index (not byte index) into the Stores section of [[BASE.DAT]]. To convert this value to a byte offset into BASE.DAT, x 2 (Stores section record length = 2 bytes) and add 16 (BASE.DAT header length = 16 bytes).
  
* Offset '''12 (1 Byte)''' - [[Elerium-115]] Needed
+
'''15 (1 Byte):''' Unknown - always 1? [Not used]
  
* Offset '''16 (1 Byte?)''' - Build flag
+
'''16 (1 Byte?):''' Researched / Can Build flag. At the start of game, all values are set to 1.
** 0 - Can be built
+
:* 0 - Can be built
** 1 - Cannot be built (needs research)
+
:* 1 - Cannot be built (yet; needs research)
 +
 
 +
'''17 (1 Byte):''' Unknown - always 0? [Not used]
  
 
==List of Entries==
 
==List of Entries==
 
Again ripped from [http://www.stonepool.com/xcom/hacking/product.html Hatfarm's] website
 
Again ripped from [http://www.stonepool.com/xcom/hacking/product.html Hatfarm's] website
  
1 - Fusion Ball Launcher
+
  1 - Fusion Ball Launcher
2 - Laser Cannon
+
  2 - Laser Cannon
3 - Plasma Cannon
+
  3 - Plasma Cannon
4 - Fusion Ball
+
  4 - Fusion Ball
5 - Tank/Laser Cannon
+
  5 - Tank/Laser Cannon
6 - Hovertank/Plasma
+
  6 - Hovertank/Plasma
7 - Hovertank/Launcher
+
  7 - Hovertank/Launcher
8 - HWP Fusion Bomb
+
  8 - HWP Fusion Bomb
9 - Laser Pistol
+
  9 - Laser Pistol
 
  10 - Laser Rifle
 
  10 - Laser Rifle
 
  11 - Heavy Laser
 
  11 - Heavy Laser
Line 58: Line 74:
 
  34 - LIGHTNING
 
  34 - LIGHTNING
 
  35 - AVENGER
 
  35 - AVENGER
 +
 +
==See Also==
 +
* [[BASE.DAT]] - Contains the quantity of these and other items at each base
 +
* [[BPROD.DAT]] - Current production at bases
 +
* [[OBDATA.DAT]] - Statistics for most items (not crafts, craft weapons, armor, or alloys)
 +
* [[Saved Game Files]]
 +
[[Category:Game Files]]
 +
[[Category:Enemy Unknown/UFO Defense]]

Latest revision as of 04:35, 23 July 2013

Product.dat holds information on the manufacturable items in the game, such as the time needed to build. To modify the stats of items made here look at OBDATA.DAT.

Most (if not all) of this info was obtained from Hatfarm's website. There are still values that are unknown in their function.

The PRODUCT.DAT data can also be found at offset 355600 in the vanilla 1.4 GEOSCAPE.EXE.

Structure

Each entry is 18 bytes long with 35 entries totaling 630 bytes. Values are presented according to byte offset (0 to 17).

0-3 (4 Bytes): Cost to manufacture item, in low-to-high byte format ([0] x 1, [1] x 256, [2] x 2562, [3] x 2563). This is the cost shown on the Build screen. Byte 3 is always 0; the most costly item requires 900k (2563 = 16.8 million).

4-5 (2 Bytes): Engineering Hours needed to complete one item (low byte, high byte)

6-7 (2 Bytes): Work space needed (low byte, high byte). It's conjecture that Byte 7 is the high byte for Byte 6; it's always 0. No item comes close to needing 256 work spaces (36 is the max).

8-13 (6 Bytes): An odd data-packing scheme to show manufacturing prerequisites. Bytes 8-10 show the prequisite; the matching Bytes 11-13 show how many are needed. Here, "matching" means whether it's the 1st, 2nd, or 3rd byte. Possible values for prerequisites (Bytes 8-10) - indexes into BASE.DAT:

  • 60 = E115
  • 88 = Alloys
  • 80 = Power Source
  • 81 = Navigation
  • 255 = null (no prereq)
For example, the Avenger's bytes 8-13 read: 88, 80, 81, 120, 2, 1. It needs 120 Alloys, 2 PSs, and 1 Nav.
This is an odd packing scheme because they used 6 bytes to show values for only 4 possible prerequisites. They could've just used 4 bytes, with each one specific to the four prereq types. Possibly they were originally thinking of having many more types of prequisites (but any one item could only have a max of 3 prerequisites). Perhaps e.g. TFTD has more prereqs. In any event, it's interesting inasmuch as it's a rare(?) example of X-COM packing data that should have been in an external list (per relational database rules) into its parent flat file. A somewhat similar example can be found with ammo requirements in bytes 25-28 of OBDATA.DAT.
Note that these bytes are also the cause of the Fusion Ball Launcher (FBL) manufacturing "bug". The FBL does not require an Alien Alloy for the first FBL made (as shown on the Build screen), but subsequent FBLs made in the same batch run do require an Alloy. For the FBL (the first Product in this file), bytes 8-13 read: 255, 88, 255, 0, 1, 0. It is the only PRODUCT.DAT item that does not have all its prerequisites shifted to the left (i.e., byte 8 is never null if there is a prequisite, for everything but the FBL). Apparently the Build screen itself (and the first item made) is coded to stop checking prerequisites as soon as it finds a null prereq - but subsequently the manufacturing code does check all 3 prerequisite columns. Editing PRODUCT.DAT to shift the Alloy prereq "left" fixes the problem (the first FBL shows, and uses, one Alloy). This fix only affects new production jobs; current jobs are stored in BPROD.DAT. Also note that the source data for PRODUCT.DAT is stored in the .EXE; you'd have to edit the executable to permanently fix the bug. Or just consider it a tiny gift from the programmers - one Alloy saved for each FBL manufacturing job - and get back to work saving the world. Courtesy of Zombie: The Executable's source bytes for PRODUCT.DAT's FBL are 459821-459838 in MS-Edit with 100 columns or 459720-459737 normally. Just look for 255, 88, 255 and that'll be the start of the mess. This is for the CE executable. If you have the DOS version, simply search for the three numbers above and you should find it near the end of Geoscape.exe.

14 (1 Byte): Item type manufactured. This is a record index (not byte index) into the Stores section of BASE.DAT. To convert this value to a byte offset into BASE.DAT, x 2 (Stores section record length = 2 bytes) and add 16 (BASE.DAT header length = 16 bytes).

15 (1 Byte): Unknown - always 1? [Not used]

16 (1 Byte?): Researched / Can Build flag. At the start of game, all values are set to 1.

  • 0 - Can be built
  • 1 - Cannot be built (yet; needs research)

17 (1 Byte): Unknown - always 0? [Not used]

List of Entries

Again ripped from Hatfarm's website

 1 - Fusion Ball Launcher
 2 - Laser Cannon
 3 - Plasma Cannon
 4 - Fusion Ball
 5 - Tank/Laser Cannon
 6 - Hovertank/Plasma
 7 - Hovertank/Launcher
 8 - HWP Fusion Bomb
 9 - Laser Pistol
10 - Laser Rifle
11 - Heavy Laser
12 - Motion Scanner
13 - Medi-kit
14 - Psi-Amp
15 - Heavy Plasma
16 - Heavy Plasma Clip
17 - Plasma Rifle
18 - Plasma Rifle Clip
19 - Plasma Pistol
20 - Plasma Pistol Clip
21 - Blaster Launcher
22 - Blaster Bomb
23 - Small Launcher
24 - Stun Bomb
25 - Alien Grenade
26 - Mind Probe
27 - Personal Armour
28 - Power Suit
29 - Flying Suit
30 - Alien Alloys
31 - UFO Power Source
32 - UFO Navigation
33 - FIRESTORM
34 - LIGHTNING
35 - AVENGER

See Also