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…
Reference in a new issue