vault backup: 2023-02-04 14:56:18
This commit is contained in:
		
							parent
							
								
									51d39cbbe4
								
							
						
					
					
						commit
						65f5a81960
					
				
					 20 changed files with 97213 additions and 0 deletions
				
			
		
							
								
								
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| .obsidian  | ||||
							
								
								
									
										1
									
								
								Appendix.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								Appendix.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| # Appendix | ||||
							
								
								
									
										140
									
								
								Chunked.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								Chunked.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,140 @@ | |||
| # Chunked Formats | ||||
| 
 | ||||
| # General Block format | ||||
| 
 | ||||
| ```cpp | ||||
| struct Block { | ||||
|     unsigned char block_id[4], | ||||
|     uint32_t size, | ||||
|     unsigned char data[size], | ||||
| } | ||||
| 
 | ||||
| template<typename T> | ||||
| struct Block { | ||||
|     unsigned char block_id[4], | ||||
|     uint32_t size, | ||||
|     T data, | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| # Block IDs | ||||
| 
 | ||||
|  File ID | Chunk IDs                                                                       | ||||
|  ------- | ------------------------------------------------------------------------------  | ||||
|  AMC     | AMC, CMSH, QUAD                                                                 | ||||
|  CM3     | ANI, CM3, EVA, NAE, NAM, SCN                                                    | ||||
|  DUM     | DUM, INI                                                                        | ||||
|  EMI     | EMI, LFVF, MAP, MAT, TRI                                                        | ||||
|  SM3     | ANI, CAM, INI, LFVF, LUZ, MAP, MAT, MD3D, NAE, NAM, PORT, SCN, SM3, SPR3, SUEL  | ||||
| 
 | ||||
| Read types: | ||||
| 
 | ||||
| - `i`: 4-byte unsigned integer | ||||
| - `s`: 4-byte signed integer | ||||
| - `p`: length prefixed string | ||||
| - `f`: 4-byte float | ||||
| - `3f`: array of 3 4-byte floats | ||||
| - `3i`: array of 3 4-byte unsigned integers | ||||
| 
 | ||||
|  Chunk ID | Description                 | Reads                     | ||||
|  -------- | --------------------------- | ------------------------  | ||||
|  AMC      | Collision Data              |                           | ||||
|  ANI      | Animation data?             |                           | ||||
|  CAM      | Camera info?                |                           | ||||
|  CMSH     | Collision Mesh Data         |                           | ||||
|  DUM      | Dummy (map object) data     |                           | ||||
|  INI      | INI-Configuration data      |                           | ||||
|  LFVF     | FVF Vertex Data             |                           | ||||
|  LUZ      | Lighting information        |                           | ||||
|  MAP      | UV Map?                     |                           | ||||
|  MAT      | Material information        |                           | ||||
|  NAE      | Animation Data?             |                           | ||||
|  NAM      | Animation Data?             |                           | ||||
|  PORT     | Map portals?                | i==1, i, i, 4, 4          | ||||
|  QUAD     | Mesh data?                  |                           | ||||
|  SCN      | Scene data?                 |                           | ||||
|  SUEL     | Ground plane?               | 0x18, 0xc, 4, 4, 4, 0x18  | ||||
|  TRI      | Triangle strip definitions? |                           | ||||
|  MD3D     | 3D Model definition?        |                           | ||||
| 
 | ||||
| # Format of Specific chunks | ||||
| 
 | ||||
| ## INI | ||||
| 
 | ||||
| Configuration Data | ||||
| 
 | ||||
| ```cpp | ||||
| struct INI { | ||||
|     uint32_t num_sections; | ||||
|     struct { | ||||
|         uint32_t num_lines; | ||||
|         struct { | ||||
|             uint32_t num_chars; | ||||
|             char line[num_chars] | ||||
|         } lines[num_lines]; | ||||
|     } sections[num_sections]; | ||||
| }; | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
| ## LFVF | ||||
| 
 | ||||
| DirectX Flexible Vertex Format Data | ||||
| 
 | ||||
| ```cpp | ||||
| struct Vertex { // fields according to flags | ||||
|     float position[3]; // D3DFVF_XYZ | D3DFVF_XYZRHW | D3DFVF_XYZB* | ||||
|     float rhw; // D3DFVF_XYZRHW | ||||
|     float weights[3]; // D3DFVF_XYZB* | ||||
|     float normal[3]; // D3DFVF_NORMAL | ||||
|     float point_size; // D3DFVF_PSIZE | ||||
|     uint32_t diffuse; // D3DFVF_DIFFUSE, RGBA | ||||
|     uint32_t specular; //D3DFVF_SPECULAR, RGBA | ||||
|     float tex_coords[D3DFVF_TEXTUREFORMAT][D3DFVF_TEX]; // D3DFVF_TEX* and D3DFVF_TEXTUREFORMAT* | ||||
| }; | ||||
| 
 | ||||
| struct LFVF { | ||||
|     uint32_t unk; | ||||
|     uint32_t num_entries; | ||||
|     struct { | ||||
|         uint32_t FVF; // FVF vertex data configuration | ||||
|         uint32_t vert_size; //?, | ||||
|         uint32_t num_verts; | ||||
|         Vertex vertices[num_vers]; | ||||
|     } entry[num_entries]; | ||||
| }; | ||||
| ``` | ||||
| 
 | ||||
| ## DUM | ||||
| 
 | ||||
| Map object data | ||||
| 
 | ||||
| ```cpp | ||||
| struct DUM { | ||||
|     uint32_t unk_1; | ||||
|     uint32_t num_dummies; | ||||
|     uint32_t unk_2; | ||||
|     struct { | ||||
|         uint32_t name_length; | ||||
|         char name[name_length]; | ||||
|         float position[3]; | ||||
|         float rotation[3]; | ||||
|         uint32_t has_ini; | ||||
|         if (has_ini) { | ||||
|             Block<INI> ini; | ||||
|         }; | ||||
|         uint32_t unk_1; // has_next? | ||||
|     } sections[num_sections]; | ||||
| }; | ||||
| ``` | ||||
| 
 | ||||
| ## MAP | ||||
| 
 | ||||
| ```cpp | ||||
| struct MAP { | ||||
|     uint32_t version; | ||||
|     uint32_t tex_name_len; | ||||
|     char tex_name[tex_name_len]; | ||||
|     // TODO: rest | ||||
| } | ||||
| ``` | ||||
							
								
								
									
										130
									
								
								Classes.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								Classes.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,130 @@ | |||
| # Classes | ||||
| 
 | ||||
| <!-- TODO: autogenerate? --> | ||||
| 
 | ||||
| `new()` @ 0x415ca0 | ||||
| 
 | ||||
| `delete()` @ 0x415cb0 | ||||
| 
 | ||||
| > Lots of constructor calls at `0x68367b` | ||||
| 
 | ||||
| |      Name       |  Size  | Constructor |   VMT    | Inherits From | | ||||
| | --------------- | ------ | ----------- | -------- | ------------- | | ||||
| | Action          | 0xc    | 0x584d50    | 0x790fe0 |               | | ||||
| | ActionClassList | 0x724  | 0x582eb0    | 0x790fb4 |               | | ||||
| | App             | ???    | 0x4023e0    | 0x78b4d8 |               | | ||||
| | Cam             | 0x13c  | 0x4b1210    | 0x78d2d8 | Entity        | | ||||
| | CamPath         | 0x1788 | 0x4b1a50    | 0x78d340 | Cam           | | ||||
| | Car             | 0x970  | 0x49b300    | 0x78cd40 | WithLife      | | ||||
| | Entity          | 0x7c   | 0x4e97e0    | 0x78da88 |               | | ||||
| | EntityList      | 0xa4   | 0x474d70    | ???      |               | | ||||
| | FCam            | 0x274  | 0x4b28e0    | 0x78d3a8 | Cam           | | ||||
| | Missile         | 0x9a4  | 0x4ec120    | 0x78db90 | WithLife      | | ||||
| | Obj             | 0x288  | 0x4efa40    | 0x78dca8 | Entity        | | ||||
| | SaveVar         | 0xc    | 0x416540    |          |               | | ||||
| | WalkChar        | 0x760  | 0x4cdf90    | 0x78d4d8 | WithLife      | | ||||
| | Window          | 0x88   | 0x4010e0    | 0x78b480 | App           | | ||||
| | WithLife        | 0x544  | 0x4f2a60    | 0x78de00 | Obj           | | ||||
| | World           | 0x225c | 0x479870    | 0x78cc6c |               | | ||||
| | item            | 0x458  | 0x4ea790    | 0x78dad8 | Obj           | | ||||
| | Py_Entity       | ????   | ???         | ???      |               | | ||||
| 
 | ||||
| ## Class Inheritance | ||||
| 
 | ||||
| ```mermaid | ||||
| graph LR | ||||
|     World | ||||
|     ActionClassList | ||||
|     SaveVar | ||||
|     App --> Window | ||||
|     Cam --> CamPath | ||||
|     Entity --> Cam | ||||
|     Cam --> FCam | ||||
|     Entity --> Obj | ||||
|     Obj --> item | ||||
|     Obj --> WithLife | ||||
|     WithLife --> Car | ||||
|     WithLife --> WalkChar | ||||
|     WithLife --> Missile | ||||
| ``` | ||||
| 
 | ||||
| # Attributes (VMT index 16,17,18 for accessor functions) | ||||
| 
 | ||||
| ## Entity | ||||
| 
 | ||||
| - LLogic | ||||
| - Name | ||||
| - Type | ||||
| - EntityList | ||||
| - NextInSlot | ||||
| - NextInList | ||||
| 
 | ||||
| ## FCam | ||||
| 
 | ||||
| - OnSwitch | ||||
| - QuakeFactor | ||||
| - MainTarget | ||||
| - Target | ||||
| - EntityLink | ||||
| - QuakeFactor | ||||
| - QuakeTime | ||||
| - HSpeed | ||||
| - VSpeed | ||||
| - RetSpd | ||||
| - CamDist | ||||
| - CamAng | ||||
| - CamRot | ||||
| - AddTurn | ||||
| - AddTurnSpeed | ||||
| 
 | ||||
| ## Cam | ||||
| 
 | ||||
| - Fov | ||||
| - clipNear | ||||
| - clipFar | ||||
| -  | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ## Obj | ||||
| 
 | ||||
| - OnEndMove | ||||
| - CamName | ||||
| - NetRes | ||||
| - OnObjSlot | ||||
| - LinkModel? | ||||
| 
 | ||||
| ## item  | ||||
| 
 | ||||
| - TakeSound | ||||
| - OnReset | ||||
| - OnTake | ||||
| - Owner | ||||
| - TgTypeMarker | ||||
| 
 | ||||
| ## Car | ||||
| 
 | ||||
| - Traf | ||||
| - Model | ||||
| - Target | ||||
| 
 | ||||
| ## WithLife | ||||
| 
 | ||||
| - Descriptor | ||||
| - Attacker | ||||
| - ActCtrl | ||||
| - HeadModel | ||||
| - Pyromaniac | ||||
| - OnDeath | ||||
| - Hit? | ||||
| - OnDamage | ||||
| - CanPhoto | ||||
| - AlwaysUse | ||||
| - ArrowCanView | ||||
| - ArrowCanMission | ||||
| - ArrowCanUse | ||||
| - ArrnOpt | ||||
| - ArriOpt | ||||
| - UseAngSel | ||||
| - UseMapCheck | ||||
| - UseAbsAngSel | ||||
							
								
								
									
										18
									
								
								File.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								File.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,18 @@ | |||
| # File Formats | ||||
| 
 | ||||
| 
 | ||||
|  File Extension | Description              | Chunked  | ||||
|  -------------- | ------------------------ | -------  | ||||
|  .packed        | Game Data Archive        | n        | ||||
|  .cm3           | Animation file           | y        | ||||
|  .sm3           | 3d model file            | y        | ||||
|  .dum           | Dummy (map object) file  | y        | ||||
|  .pth           | AI Path                  | n        | ||||
|  .emi           | Emission maps/Materials? | y        | ||||
|  .amc           | Collision Data           | y        | ||||
|  .ini           | Configuration            | n        | ||||
|  .txa           | Texture Animation Config | n        | ||||
| 
 | ||||
| - [Chunked](Chunked.md) | ||||
| - [Packed](Packed.md) | ||||
| - [AI Pathfinding Graph](Nodegraph.md) | ||||
							
								
								
									
										1
									
								
								File_Formats.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								File_Formats.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| # File Formats | ||||
							
								
								
									
										17
									
								
								MultiSpriteTable.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								MultiSpriteTable.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,17 @@ | |||
| # MultiSpriteTable | ||||
| 
 | ||||
| ```cpp | ||||
| struct Tile { | ||||
|     uint16_t pos[2]; | ||||
|     uint16_t size[2]; | ||||
| } | ||||
| 
 | ||||
| struct MST { | ||||
|     char magic[4]; // always "MST\0" | ||||
|     uint32_t data_size; | ||||
|     uint32_t version; // should be 100 | ||||
|     uint32_t image_size[2]; // width and height of base image | ||||
|     uint32_t num_tiles; // number of tiles/subsprites | ||||
|     Tile tiles[num_tiles]; | ||||
| } | ||||
| ``` | ||||
							
								
								
									
										75
									
								
								Netplay/Netplay.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								Netplay/Netplay.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,75 @@ | |||
| # Encryption (v1.1) | ||||
| 
 | ||||
| Fixed Key: `020406080a0c0e10121416181a1c1e20222426282a2c2e30323436383a3c3e40` | ||||
| Packet Structure: | ||||
| ``` | ||||
| [0..nonce_len]: nonce | ||||
| [nonce_len..(16-nonce_len%16)]: padding | ||||
| [16..ciphertext_len]: Ciphertext | ||||
| [nonce_len+(16-nonce_len%16)+ciphertext_len] | ||||
| 
 | ||||
| 
 | ||||
|       00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ||||
| 0000  ED C9 C2 F4 7C 6D F2 54 42 EF 46 F6 00 00 00 00  ....|m.TB.F..... | ||||
| 0010  68 13 5C 9A 2B 18 DB 9C 76 BE A0 8A 3E 49 79 3C  h.\.+...v...>Iy< | ||||
| 0020  8D 7A C4 4C 8B B0 A4 94 E5 B5 89 54 A6 ED 6D 75  .z.L.......T..mu | ||||
| 0030  1A CA A8 4B 22 B5 03 84 F7 3C DE 4E B0 30 81 29  ...K"....<.N.0.) | ||||
| 0040  3B 70 45 15 33 C0 97 67 85 6B 28 EF 2E 2E D1 83  ;pE.3..g.k(..... | ||||
| 0050  E6 56 A7 81 53 89 3E 52 D8 82 CF 77 92 CF C2 D6  .V..S.>R...w.... | ||||
| 0060  9F 37 C5 DE EE 14 4D 3F 1F 82 32 7E 00 00 00 00  .7....M?..2~.... | ||||
| 0070  0C 00 00 00 00 00 00 00 5C 00 00 00 00 00 00 00  ........\....... | ||||
| 0080  89 7A A8 32 93 56 B6 68 24 E0 58 63 7F 70 5A D2  .z.2.V.h$.Xc.pZ. | ||||
| ``` | ||||
| Decrypted: | ||||
| ``` | ||||
|       00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ||||
| 0000  BA CE 01 01 8B 6D 06 00 00 00 01 4D 53 45 31 3A  .....m.....MSE1: | ||||
| 0010  20 46 6C 61 67 20 48 75 6E 74 20 32 2D 36 00 05   Flag Hunt 2-6.. | ||||
| 0020  00 00 00 00 00 05 18 01 88 AA 9B 46 6C 61 67 48  ...........FlagH | ||||
| 0030  75 6E 74 00 54 A9 2F 05 F0 B4 4F 43 41 00 00 00  unt.T./...OCA... | ||||
| 0040  4D 07 18 01 60 A3 00 05 00 00 80 3F 20 4A DA 3D  M...`......? J.= | ||||
| 0050  68 F8 8F 01 19 6A 71 77 20 8B FB 76              h....jqw ..v | ||||
| ``` | ||||
| 
 | ||||
| # Netplay | ||||
| 
 | ||||
| Game Info Packet | ||||
| 
 | ||||
| ``` | ||||
| Server 'B':FZ (0/10) Ver 1.0 at 192.168.99.1:28086 | ||||
| [0-2] ID (0xbace) | ||||
| [2-4] Version | ||||
| [4-5] port (16-bit) | ||||
| [6-7] max_players (16-bit) | ||||
| [8-9] curr_player (16-bit) | ||||
| [10-x] server name (char*) | ||||
| 
 | ||||
|            0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  0123456789ABCDEF | ||||
| 0019fdc0  ba ce 00 01 b6 6d 0a 00 00 00 42 00 30 fe 19 00  .....m....B.0... | ||||
| 0019fdd0  ff ff ff ff 27 2b b3 9b c7 3e bb 00 9c af 29 00  ....'+...>....). | ||||
| 0019fde0  db 69 00 00 00 00 00 00 00 00 44 65 61 74 68 4d  .i........DeathM | ||||
| 0019fdf0  61 74 63 68 00 00 00 00 ff ff 46 5a 00 4a 91 f0  atch......FZ.J.. | ||||
| 0019fe00  92 8b 57 4e 7f 00 00 00 10 21 fe 38 0d ae 00 00  ..WN.....!.8.... | ||||
| 0019fe10  f0 ce f3 36 a0 e8 0b 77 a0 e8                    ...6...w.. | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
| Player Join Packet | ||||
| 
 | ||||
| ``` | ||||
| [0-3] header/ID? | ||||
| [6-x] Player name | ||||
| 
 | ||||
|            0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  0123456789ABCDEF | ||||
| 09c9dfe8  7f 47 00 00 00 0e 55 6e 6e 61 6d 65 64 20 50 6c  .G....Unnamed Pl | ||||
| 09c9dff8  61 79 65 72 06 53 42 6f 73 73 31 b9 00 07 50 5f  ayer.SBoss1...P_ | ||||
| 09c9e008  42 65 74 74 79 06 4d 42 4f 53 53 31 06 4d 42 4f  Betty.MBOSS1.MBO | ||||
| 09c9e018  53 53 31 00 00 10 30 2c 31 35 2c 30 2c 30 2c 31  SS1...0,15,0,0,1 | ||||
| 09c9e028  35 2c 31 35 2c 31 02 00 00 00                    5,15,1.... | ||||
| ``` | ||||
| 
 | ||||
|  Message                                  | Description                                                        | ||||
|  ---------------------------------------- | -----------------------------------------------------------------  | ||||
|  `5c68625c32383230395c73637261706c616e64` | "Scrapland Server" announcement broadcast (`\hb\28209\scrapland`)  | ||||
|  `7f01000007`                             | Retrieve Game info                                                 | ||||
|  `48423d35323932322c3235363a323830383600` | Connection Information (`HB=52922,256:28086`)                      | ||||
							
								
								
									
										146
									
								
								Netplay/Protocol.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								Netplay/Protocol.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,146 @@ | |||
| # Protocol notes | ||||
| 
 | ||||
| Raw UDP Payload: | ||||
| 
 | ||||
| ``` | ||||
| 0f0000020007007544b3c59018374774c6b246009805000009955f3c00067134 | ||||
| 0281062c090900001d007f5e0e22c6ddf52247cce2b64655163b8c8e0b4a272f | ||||
| 44e7afc745ef91354600000000000000000008155f8300035186005100e9fb08 | ||||
| 050040007e5700ffff6301000010ff2365f96e1e00000002000000105f000006 | ||||
| 21e000daf7b1f73a0000c800ff7544b3c59018374774c6b24697f5d702000000 | ||||
| 00000000000000000000000000000000002c2502159ba419d1c4012d3c47252d | ||||
| af465359899e7745e6531142b96009c4ffff2402159e7f005800b5ff20f1f019 | ||||
| 04210bd5f5ffff2302159f4a6cd1c44625314792e5b04614cb45d6da5c26aa4e | ||||
| 44a2ca72c5cdb4edc3ffff2202159e7e0014009efff6e8c89f0822fc8ff3ffff | ||||
| ``` | ||||
| 
 | ||||
| Hexdump: | ||||
| 
 | ||||
| ``` | ||||
| 0000  0F 00 00 02 00 07 00 75 44 B3 C5 90 18 37 47 74  .......uD....7Gt | ||||
| 0010  C6 B2 46 00 98 05 00 00 09 95 5F 3C 00 06 71 34  ..F......._<..q4 | ||||
| 0020  02 81 06 2C 09 09 00 00 1D 00 7F 5E 0E 22 C6 DD  ...,.......^.".. | ||||
| 0030  F5 22 47 CC E2 B6 46 55 16 3B 8C 8E 0B 4A 27 2F  ."G...FU.;...J'/ | ||||
| 0040  44 E7 AF C7 45 EF 91 35 46 00 00 00 00 00 00 00  D...E..5F....... | ||||
| 0050  00 00 08 15 5F 83 00 03 51 86 00 51 00 E9 FB 08  ...._...Q..Q.... | ||||
| 0060  05 00 40 00 7E 57 00 FF FF 63 01 00 00 10 FF 23  ..@.~W...c.....# | ||||
| 0070  65 F9 6E 1E 00 00 00 02 00 00 00 10 5F 00 00 06  e.n........._... | ||||
| 0080  21 E0 00 DA F7 B1 F7 3A 00 00 C8 00 FF 75 44 B3  !......:.....uD. | ||||
| 0090  C5 90 18 37 47 74 C6 B2 46 97 F5 D7 02 00 00 00  ...7Gt..F....... | ||||
| 00a0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ | ||||
| 00b0  00 2C 25 02 15 9B A4 19 D1 C4 01 2D 3C 47 25 2D  .,%........-<G%- | ||||
| 00c0  AF 46 53 59 89 9E 77 45 E6 53 11 42 B9 60 09 C4  .FSY..wE.S.B.`.. | ||||
| 00d0  FF FF 24 02 15 9E 7F 00 58 00 B5 FF 20 F1 F0 19  ..$.....X... ... | ||||
| 00e0  04 21 0B D5 F5 FF FF 23 02 15 9F 4A 6C D1 C4 46  .!.....#...Jl..F | ||||
| 00f0  25 31 47 92 E5 B0 46 14 CB 45 D6 DA 5C 26 AA 4E  %1G...F..E..\&.N | ||||
| 0100  44 A2 CA 72 C5 CD B4 ED C3 FF FF 22 02 15 9E 7E  D..r......."...~ | ||||
| 0110  00 14 00 9E FF F6 E8 C8 9F 08 22 FC 8F F3 FF FF  .........."..... | ||||
| ``` | ||||
| 
 | ||||
| Split up into chunks: | ||||
| 
 | ||||
| ``` | ||||
| 0f 00 0002 0007 00 7544b3c5 90183747 74c6b246 0098 | ||||
| 
 | ||||
| 0500 00 09955f3c000671340281062c090900001d007f5e0e22c6ddf52247cce2b64655163b8c8e0b4a272f44e7afc745ef913546000000000000 | ||||
| 0000 00 08155f8300035186005100e9fb08050040007e5700ffff6301000010ff2365f96e1e000000 | ||||
| 0200 00 00105f00000621e000daf7b1f73a0000c800ff7544b3c59018374774c6b24697f5d70200000000000000000000000000000000000000002c | ||||
| 2502 15 9ba419d1c4012d3c47252daf465359899e7745e6531142b96009c4ffff | ||||
| 2402 15 9e7f005800b5ff20f1f01904210bd5f5ffff | ||||
| 2302 15 9f4a6cd1c44625314792e5b04614cb45d6da5c26aa4e44a2ca72c5cdb4edc3ffff | ||||
| 2202 15 9e7e0014009efff6e8c89f0822fc8ff3ffff | ||||
| ``` | ||||
| 
 | ||||
| Log message: | ||||
| 
 | ||||
| ``` | ||||
| Size: 0285   PlyId: 002   NumVals: 007 | ||||
|   ( 0:'net  5'-00) 09955f3c000671340281062c090900001d007f5e0e22c6ddf52247cce2b64655163b8c8e0b4a272f44e7afc745ef913546000000000000 | ||||
|   ( 1:'net  0'-00) 08155f8300035186005100e9fb08050040007e5700ffff6301000010ff2365f96e1e000000 | ||||
|   ( 2:'net  2'-00) 00105f00000621e000daf7b1f73a0000c800ff7544b3c59018374774c6b24697f5d70200000000000000000000000000000000000000002c | ||||
|   ( 3:'net549'-15) 9ba419d1c4012d3c47252daf465359899e7745e6531142b96009c4ffff | ||||
|   ( 4:'net548'-15) 9e7f005800b5ff20f1f01904210bd5f5ffff | ||||
|   ( 5:'net547'-15) 9f4a6cd1c44625314792e5b04614cb45d6da5c26aa4e44a2ca72c5cdb4edc3ffff | ||||
|   ( 6:'net546'-15) 9e7e0014009efff6e8c89f0822fc8ff3ffff | ||||
| ``` | ||||
| 
 | ||||
| Structure: | ||||
| 
 | ||||
| ``` | ||||
| 
 | ||||
| 0f00 # Unk | ||||
| 0002 # PlayerID | ||||
| 0007 # Num Vals | ||||
| 00 # Unk | ||||
| 7544b3c5 # Pos.X | ||||
| 90183747 # Pos.Y | ||||
| 74c6b246 # Pos.Z | ||||
| 00 # Player Index | ||||
| 98 # Rtt | ||||
| 0500 00 09955f3c000671340281062c090900001d007f5e0e22c6ddf52247cce2b64655163b8c8e0b4a272f44e7afc745ef913546000000000000 | ||||
| 0000 00 08155f8300035186005100e9fb08050040007e5700ffff6301000010ff2365f96e1e000000 | ||||
| 0200 00 00105f00000621e000daf7b1f73a0000c800ff7544b3c59018374774c6b24697f5d70200000000000000000000000000000000000000002c | ||||
| 2502 15 9ba419d1c4012d3c47252daf465359899e7745e6531142b96009c4ffff | ||||
| 2402 15 9e7f005800b5ff20f1f01904210bd5f5ffff | ||||
| 2302 15 9f4a6cd1c44625314792e5b04614cb45d6da5c26aa4e44a2ca72c5cdb4edc3ffff | ||||
| 2202 15 9e7e0014009efff6e8c89f0822fc8ff3ffff | ||||
| 
 | ||||
| ``` | ||||
| 
 | ||||
| ```c | ||||
| #pragma endian big | ||||
| 
 | ||||
| struct NetValue { | ||||
|     le u16 entity_index; | ||||
|     u8 entity_type; | ||||
|     char data[?]; // TODO: how is length determined? | ||||
| }; | ||||
| 
 | ||||
| struct NetData { | ||||
|     le u16 unk; | ||||
|     u16 player_id; | ||||
|     u16 num_vals; | ||||
|     u8 unk_2; | ||||
|     le float pos[3]; | ||||
|     u8 player_idx; | ||||
|     u8 rtt_ms; | ||||
|     NetValue values[num_vals]; | ||||
| }; | ||||
| 
 | ||||
| ``` | ||||
| 
 | ||||
| Packets are split into Data packets (map change, resources, chat message, etc) and entity (position?) updates | ||||
| 
 | ||||
| ## Packet types | ||||
| 
 | ||||
| - 00: MapChange: | ||||
|   - str map_name | ||||
|   - str game_mode | ||||
| 
 | ||||
| - 01: Resource: | ||||
|   - u8: unk | ||||
|   - u16?: num_resources | ||||
|   - [str: resource_name]*num_resources | ||||
| 
 | ||||
| - 02: Unknown (Keepalive?) | ||||
| 
 | ||||
| - 03: ChatMessage | ||||
|   - str: message | ||||
| 
 | ||||
| - 04: UsrString: | ||||
|   - str: data | ||||
| 
 | ||||
| - 05: Player join: | ||||
|   - u8: player_id | ||||
|   - str: player_name | ||||
|   - str: ship_model | ||||
|   - u16: max_health | ||||
|   - str[4]: engine_models | ||||
|   - str: pilot_model | ||||
|   - str: loadout | ||||
|   - u32: unknown | ||||
| 
 | ||||
| - 06: unknown | ||||
|   - u8: ent_index | ||||
| 
 | ||||
| - 07: unknown (reload?) | ||||
							
								
								
									
										26
									
								
								Nodegraph.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								Nodegraph.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,26 @@ | |||
| # AI Nodegraph | ||||
| 
 | ||||
| Used for pathfinding using the A*-Algorithm. | ||||
| 
 | ||||
| ```cpp | ||||
| // n= number of dimension (3 or 2) | ||||
| 
 | ||||
| template<size_t n> | ||||
| struct Node { | ||||
|     float pos[n]; | ||||
| }; | ||||
| 
 | ||||
| template<size_t n> | ||||
| struct Edge { | ||||
|     uint32_t num_edge_nodes; | ||||
|     Node<n> nodes[]; | ||||
| }; | ||||
| 
 | ||||
| template<size_t n> | ||||
| struct Graph { | ||||
|     uint32_t num_nodes; | ||||
|     Node<n> nodes[]; | ||||
|     uint32_t num_edges; | ||||
|     Edge<n> edges[]; | ||||
| }; | ||||
| ``` | ||||
							
								
								
									
										6
									
								
								Overview.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								Overview.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,6 @@ | |||
| # Overview | ||||
| 
 | ||||
| - Developer Studio: Mercury Steam | ||||
| - Engine: [ScrapEngine](./ScrapEngine.md) | ||||
| - Scripting System: embedded Python 1.5.2 interpreter | ||||
| - Game Data Archive Format: [.packed](./packed.md) | ||||
							
								
								
									
										92561
									
								
								PE_metadata.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										92561
									
								
								PE_metadata.md
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										15
									
								
								Packed.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Packed.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | |||
| # Packed | ||||
| 
 | ||||
| ```cpp | ||||
| struct Header { | ||||
|     unsigned char magic[4]; // always BFPK | ||||
|     uint32_t version; | ||||
|     uint32_t number_of_files; | ||||
|     struct File { | ||||
|         uint32_t path_length; | ||||
|         char path[]; // latin1 encoding | ||||
|         uint32_t data_size; | ||||
|         uint32_t data_offset; // offset includes header size so it can be used directly in a seek() call | ||||
|     } files[]; | ||||
| }; | ||||
| ``` | ||||
							
								
								
									
										1
									
								
								Python_API.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								Python_API.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| # Python API | ||||
							
								
								
									
										2369
									
								
								Python_Modules.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										2369
									
								
								Python_Modules.md
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										18
									
								
								SUMMARY.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								SUMMARY.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,18 @@ | |||
| # Summary | ||||
| 
 | ||||
| - [Overview](./Overview.md) | ||||
| - [ScrapEngine](./ScrapEngine.md) | ||||
|     - [Engine Variables](./Variables.md) | ||||
|     - [Classes](./Classes.md) | ||||
|       - [World](./World.md) | ||||
|     - [Netplay](Netplay.md) | ||||
|     - [Python API](./Python_API.md) | ||||
|       - [Modules](./Python_Modules.md) | ||||
|     - [File Formats](./File_Formats.md) | ||||
|       - [Chunked Formats](./Chunked.md) | ||||
|       - [Packed](./Packed.md) | ||||
|       - [AI Nodegraph](./Nodegraph.md) | ||||
|       - [MultiSpriteTable](MultiSpriteTable.md) | ||||
| - [ScrapHacks](./ScrapHacks.md) | ||||
| - [Appendix](./Appendix.md) | ||||
|   - [PE Metadata](./PE_metadata.md) | ||||
							
								
								
									
										89
									
								
								ScrapEngine.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								ScrapEngine.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,89 @@ | |||
| # ScrapEngine | ||||
| 
 | ||||
| - Based on Mercury Engine | ||||
| - Ingame Scripting Language: Python 1.5.2 | ||||
| 
 | ||||
| ## Launch options | ||||
| 
 | ||||
| Checked in `0x00401010` | ||||
| 
 | ||||
| - `-console`: open external console window on start | ||||
| - `-inifile`: *unknown* some kind of `.ini` file, seems to be related to `m3d.ini` in `Data.packed` | ||||
| 
 | ||||
| Checked in `0x004039b0` | ||||
| 
 | ||||
| - `-build`: Rebuild `Data.packed` (needs a `filelist.2Bpack`) | ||||
| - `-dedicated`: start in multiplayer dedicated server mode (needs to be used with `-server`) | ||||
| - `-server`: start in multiplayer server mode | ||||
| - `-<var_name>:<var_value>`: override engine variable (example: `-debug:10`) | ||||
| 
 | ||||
| Checked in `0x00401180` | ||||
| 
 | ||||
| - `-wideWindow`: start game in widescreen mode | ||||
| 
 | ||||
| 
 | ||||
| ## Files | ||||
| 
 | ||||
| - `engine.txt`: Contains engine commands? Lexer/Parser @ `0x6168a0` | ||||
|   - Errors get printed to Scene graph debugging console | ||||
|   - Command buffer @ `0x8c1b30` | ||||
|   - Commands: | ||||
|     - `Load`: Load Model? | ||||
|     - `AddAnim`: Load Animation data? | ||||
|     - `PlayAnim`: Play Animation? | ||||
|     - `PivotPos`: ? | ||||
|     - `FUNDIR_NODOS`: ? | ||||
|     - `EFEC_MALLA`: ? | ||||
|   - Values: | ||||
|     - `true` | ||||
|     - `false` | ||||
| - `engine.log`: Created when `engine.txt` exists | ||||
| 
 | ||||
| `engine.txt` containing `Load("Models/Vehicles/Ships/SBoss1/SBoss1.SM3", 1)` results in error `D:\Games\Deep Silver\Scrapland\engine.txt (1): Error: missing a ( character` | ||||
| 
 | ||||
| 
 | ||||
| ## Ingame-Console | ||||
| 
 | ||||
| (Ctrl+\^ or right click on window title bar and select "switch console") (Handler @ `0x402190`) | ||||
| 
 | ||||
| * `<Code>`: Evaluate Python code | ||||
| * `:<Var>`: Get Game Engine Variable | ||||
| * `:<Var> <Val>`: Set Game Engine Variable | ||||
| * `?`: Show all Game Engine Variables | ||||
| * `?<String>`: Show all Game Engine Variables matching `<String>` | ||||
| * `/<command>`: Run Command defined in `QuickConsole.py` | ||||
|   * Expands to `import quickconsole;quickconsole.%s()` | ||||
| * `/<command> <arg>,<arg>`: Run function in `QuickConsole.py` with argument(s) | ||||
|   * Expands to `import quickconsole;quickconsole.%s(%s)` | ||||
| 
 | ||||
| ## External Console | ||||
| 
 | ||||
| (Scene graph debugging?) (Handler @ `0x5f9520`) | ||||
| 
 | ||||
| * `listar luces` List lights in scene | ||||
| * `listar` list models in scene | ||||
| * `arbol <model_name>` show details for model | ||||
| * `mem` (doesn't do anything?) | ||||
| * `ver uniones`  | ||||
| * Easter Eggs: | ||||
|   * `imbecil` | ||||
|   * `idiota` | ||||
|   * `capullo` | ||||
| 
 | ||||
| ## Window Messages | ||||
| 
 | ||||
| **TODO** | ||||
| 
 | ||||
| ## Other interesting Memory Addresses | ||||
| 
 | ||||
| - `0x852914`: D3D8-Device pointer | ||||
| - `0x7FCC00`: number of opened `.packed` files | ||||
| - `0x84cb64`: pointer to console command handler | ||||
| - `0x7fac84`: pointer to C++ callback list structure | ||||
| - `0x80b2cc`: pointer to ActionClassList (???) | ||||
| - `0x807a20`: pointer to SScorer (ingame GUI/Menu/Text system) structure (???) | ||||
| - `0x80a398`: pointer to SoundSystem (???) | ||||
| - `0x8b18f0`: pointer to Models Data (can be dumped using scene graph debugging console) | ||||
| - `0x8b18f4`: pointer to Scenes Data (can be dumped using scene graph debugging console) | ||||
| - `0x8b18f8`: pointer to active Models Data (can be dumped using scene graph debugging console) | ||||
| - for more see `config.yml` | ||||
							
								
								
									
										1
									
								
								ScrapHacks.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								ScrapHacks.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| # ScrapHacks | ||||
							
								
								
									
										1512
									
								
								Variables.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1512
									
								
								Variables.md
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										86
									
								
								World.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								World.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,86 @@ | |||
| # World | ||||
| 
 | ||||
| ## Game World/State Pointer @ `0x7fe944` | ||||
| 
 | ||||
| Object size: `0x225c` bytes | ||||
| 
 | ||||
| Constructor Address: `0x479870` | ||||
| 
 | ||||
| Points to World struct | ||||
| 
 | ||||
| 
 | ||||
| | Offset |           Type           |              Description               | | ||||
| | ------ | ------------------------ | -------------------------------------- | | ||||
| | 0x0000 | `void**`                 | Virtual Method Table                   | | ||||
| | 0x0004 | `uint32_t`               | Slots in Entity Hashtable              | | ||||
| | 0x0008 | `void**`                 | Pointer to Entity Hashtable            | | ||||
| | 0x00B0 | `??`                     | Pointer to Ground Object (?)           | | ||||
| | 0x0288 | `pyEntity*`              | UsrEntity_0                           | | ||||
| | 0x028C | `pyEntity*`              | UsrEntity_1                           | | ||||
| | 0x0290 | `pyEntity*`              | UsrEntity_2                           | | ||||
| | 0x0294 | `pyEntity*`              | UsrEntity_3                           | | ||||
| | 0x0298 | `uint32_t`               | Slots in Model Hashtable               | | ||||
| | 0x029C | `void**`                 | Pointer to Model Hashtable             | | ||||
| | 0x02B8 | `uint32_t`               | Slots in Entity lists Hashtable        | | ||||
| | 0x02BC | `void**`                 | Pointer to Entity list Hashtable       | | ||||
| | 0x0330 | `float[3]`               | Time (why 3 times?)                    | | ||||
| | 0x1C6C | `float`                  | Alarm level                            | | ||||
| | 0x1C68 | `float`                  | Alarm Grow Level                       | | ||||
| | 0x2158 | `float`                  | Used in `World_Init`                   | | ||||
| | 0x2170 | `???`                    | Used in `World_Init`                   | | ||||
| | 0x2180 | `float`                  | Used in `World_Init`                   | | ||||
| | 0x2188 | `void*`                  | Used in `World_Init`                   | | ||||
| | 0x218C | `void*`                  | Used in `World_Init`                   | | ||||
| | 0x2190 | `float`                  | Used in `World_Init`                   | | ||||
| | 0x2198 | `void*`                  | Used in `World_Init`                   | | ||||
| | 0x219C | `void*`                  | Used in `World_Init`                   | | ||||
| | 0x21A0 | `void**`                 | Used in `World_Init` (VTable pointer?) | | ||||
| | 0x21B4 | `void**`                 | Used in `World_Init` (VTable pointer?) | | ||||
| | 0x21C8 | `???`                    | Used in `World_Init`                   | | ||||
| | 0x2204 | `uint32_t` or `uint16_t` | Used in `World_Init`                   | | ||||
| | 0x2230 | `float`                  | Used in `World_Init`                   | | ||||
| | 0x2238 | `???`                    | Used in `World_Init`                   | | ||||
| | 0x2254 | `float`                  | Used in `World_Init`                   | | ||||
| 
 | ||||
| 
 | ||||
| ## cPyEntity structure | ||||
| 
 | ||||
| Offset |   Type   |     Description | ||||
| ------ | -------- | -------------------- | ||||
| 0x0000 | `void**` | Virtual Method Table | ||||
| 0x0004 | `char*`  | Name | ||||
| 0x0008 | `void*`  | ??? | ||||
| 
 | ||||
| 
 | ||||
| ## Entity Hash Table | ||||
| 
 | ||||
| Hash-function used: [PJW](https://en.wikipedia.org/wiki/PJW_hash_function) (Same parameters as the example implementation) | ||||
| 
 | ||||
| Entry format: | ||||
| 
 | ||||
| ```cpp | ||||
| struct HT_Entry { | ||||
|   void* data; | ||||
|   const char* key; | ||||
|   HT_Entry* next; | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| Data format: | ||||
| 
 | ||||
| Offset |     Type      |       Description | ||||
| ------ | ------------- | ------------------------ | ||||
| 0x0    | `void**`      | Virtual Method Table (?) | ||||
| 0x4    | `const char*` | name as string | ||||
| 0x14   | `void*`       | pointer to self (why?) | ||||
| 0x28   | `float[3]`    | Position in Game World | ||||
| 
 | ||||
| ## EntityList Hash Table | ||||
| 
 | ||||
| Attributes: | ||||
| - `Near` | ||||
| - `First` | ||||
| - `Num` | ||||
| - `OnDeath` | ||||
| - `OnDamage` | ||||
| - ... | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue