Update notes
This commit is contained in:
parent
7afdfb5869
commit
88737f29e4
14 changed files with 94675 additions and 70 deletions
|
@ -4,22 +4,14 @@ language = "en"
|
||||||
multilingual = false
|
multilingual = false
|
||||||
src = "src"
|
src = "src"
|
||||||
title = "Scrapland Reverse Engineering Notes"
|
title = "Scrapland Reverse Engineering Notes"
|
||||||
|
[output.linkcheck]
|
||||||
|
|
||||||
[output.html]
|
[output.html]
|
||||||
preferred-dark-theme = "ayu"
|
preferred-dark-theme = "rust"
|
||||||
mathjax-support = true
|
mathjax-support = true
|
||||||
|
additional-js = ["mermaid.min.js", "mermaid-init.js"]
|
||||||
|
site-url = "https://earthnuker.keybase.pub/ScrapHacks/"
|
||||||
|
|
||||||
# [preprocessor.graphviz]
|
|
||||||
# command = "mdbook-graphviz"
|
|
||||||
|
|
||||||
[preprocessor.svgbob]
|
[preprocessor.mermaid]
|
||||||
text_width = 8.0
|
command = "mdbook-mermaid"
|
||||||
text_height = 16.0
|
|
||||||
class = "bob"
|
|
||||||
font_family = "arial"
|
|
||||||
font_size = 14.0
|
|
||||||
stroke_width = 2.0
|
|
||||||
# there's using css-variables from theme:
|
|
||||||
stroke_color = "var(--fg)" # see default theme / variables.css
|
|
||||||
background_color = "transparent" # also useful `var(--bg)`
|
|
||||||
# all properties are optional.
|
|
||||||
|
|
3
notes/mermaid-init.js
Normal file
3
notes/mermaid-init.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
mermaid.initialize({
|
||||||
|
startOnLoad:true,
|
||||||
|
});
|
32
notes/mermaid.min.js
vendored
Normal file
32
notes/mermaid.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
notes/src/Appendix.md
Normal file
1
notes/src/Appendix.md
Normal file
|
@ -0,0 +1 @@
|
||||||
|
# Appendix
|
130
notes/src/Classes.md
Normal file
130
notes/src/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
|
|
@ -1 +0,0 @@
|
||||||
# Entities
|
|
17
notes/src/MultiSpriteTable.md
Normal file
17
notes/src/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];
|
||||||
|
}
|
||||||
|
```
|
|
@ -1 +1,6 @@
|
||||||
# Overview
|
# 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
notes/src/PE_metadata.md
Normal file
92561
notes/src/PE_metadata.md
Normal file
File diff suppressed because it is too large
Load diff
|
@ -3,9 +3,9 @@
|
||||||
## SScorer
|
## SScorer
|
||||||
|
|
||||||
- *SetCursor*: `<built-in function SetCursor>`
|
- *SetCursor*: `<built-in function SetCursor>`
|
||||||
```
|
|
||||||
SetCursor(playernumber,CursorName) : pone un item del scorer como cursor
|
SetCursor(playernumber,CursorName) : pone un item del scorer como cursor
|
||||||
```
|
|
||||||
- *Show*: `<built-in function Show>`
|
- *Show*: `<built-in function Show>`
|
||||||
```
|
```
|
||||||
Show(playernumber) : Activa el scorer.
|
Show(playernumber) : Activa el scorer.
|
|
@ -2,12 +2,17 @@
|
||||||
|
|
||||||
- [Overview](./Overview.md)
|
- [Overview](./Overview.md)
|
||||||
- [ScrapEngine](./ScrapEngine.md)
|
- [ScrapEngine](./ScrapEngine.md)
|
||||||
- [World](./World.md)
|
- [Engine Variables](./Variables.md)
|
||||||
- [Entities](./Entities.md)
|
- [Classes](./Classes.md)
|
||||||
|
- [World](./World.md)
|
||||||
- [Netplay](./Netplay.md)
|
- [Netplay](./Netplay.md)
|
||||||
- [Python API](./Python_API.md)
|
- [Python API](./Python_API.md)
|
||||||
|
- [Modules](./Python_Modules.md)
|
||||||
- [File Formats](./File_Formats.md)
|
- [File Formats](./File_Formats.md)
|
||||||
- [Chunked Formats](./Chunked.md)
|
- [Chunked Formats](./Chunked.md)
|
||||||
- [Packed](./Packed.md)
|
- [Packed](./Packed.md)
|
||||||
- [AI Nodegraph](./Nodegraph.md)
|
- [AI Nodegraph](./Nodegraph.md)
|
||||||
|
- [MultiSpriteTable](MultiSpriteTable.md)
|
||||||
- [ScrapHacks](./ScrapHacks.md)
|
- [ScrapHacks](./ScrapHacks.md)
|
||||||
|
- [Appendix](./Appendix.md)
|
||||||
|
- [PE Metadata](./PE_metadata.md)
|
|
@ -1,15 +1,45 @@
|
||||||
# ScrapEngine
|
# ScrapEngine
|
||||||
|
|
||||||
|
- Based on Mercury Engine
|
||||||
- Ingame Scripting Language: Python 1.5.2
|
- Ingame Scripting Language: Python 1.5.2
|
||||||
- Interesting memory locations and functions are noted in `config.yml`
|
|
||||||
|
|
||||||
## Launch options
|
## Launch options
|
||||||
|
|
||||||
|
Checked in `0x00401010`
|
||||||
|
|
||||||
- `-console`: open external console window on start
|
- `-console`: open external console window on start
|
||||||
- `-wideWindow`: start game in widescreen mode
|
- `-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`)
|
- `-dedicated`: start in multiplayer dedicated server mode (needs to be used with `-server`)
|
||||||
- `-server`: start in multiplayer server mode
|
- `-server`: start in multiplayer server mode
|
||||||
- `-build`: Rebuild `Data.packed` (needs a `filelist.2Bpack`)
|
|
||||||
|
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
|
## Ingame-Console
|
||||||
|
|
||||||
|
@ -21,9 +51,9 @@
|
||||||
* `?`: Show all Game Engine Variables
|
* `?`: Show all Game Engine Variables
|
||||||
* `?<String>`: Show all Game Engine Variables matching `<String>`
|
* `?<String>`: Show all Game Engine Variables matching `<String>`
|
||||||
* `/<command>`: Run Command defined in `QuickConsole.py`
|
* `/<command>`: Run Command defined in `QuickConsole.py`
|
||||||
* `import quickconsole;quickconsole.%s()`
|
* Expands to `import quickconsole;quickconsole.%s()`
|
||||||
* `/<command> <arg>,<arg>`: Run function in `QuickConsole.py` with argument(s)
|
* `/<command> <arg>,<arg>`: Run function in `QuickConsole.py` with argument(s)
|
||||||
* `import quickconsole;quickconsole.%s(%s)`
|
* Expands to `import quickconsole;quickconsole.%s(%s)`
|
||||||
|
|
||||||
## External Console
|
## External Console
|
||||||
|
|
||||||
|
@ -52,3 +82,4 @@
|
||||||
- `0x8b18f0`: pointer to Models Data (can be dumped using scene graph debugging console)
|
- `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)
|
- `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)
|
- `0x8b18f8`: pointer to active Models Data (can be dumped using scene graph debugging console)
|
||||||
|
- for more see `config.yml`
|
||||||
|
|
1823
notes/src/Variables.md
Normal file
1823
notes/src/Variables.md
Normal file
File diff suppressed because it is too large
Load diff
|
@ -2,48 +2,54 @@
|
||||||
|
|
||||||
## Game World/State Pointer @ `0x7fe944`
|
## Game World/State Pointer @ `0x7fe944`
|
||||||
|
|
||||||
|
Object size: `0x225c` bytes
|
||||||
|
|
||||||
|
Constructor Address: `0x479870`
|
||||||
|
|
||||||
Points to World struct
|
Points to World struct
|
||||||
|
|
||||||
Offset | Type | Description
|
|
||||||
------ | ------------------------ | --------------------------------------
|
| Offset | Type | Description |
|
||||||
0x0000 | `void**` | Virtual Method Table
|
| ------ | ------------------------ | -------------------------------------- |
|
||||||
0x0004 | `uint32_t` | Slots in Entity Hashtable
|
| 0x0000 | `void**` | Virtual Method Table |
|
||||||
0x0008 | `void**` | Pointer to Entity Hashtable
|
| 0x0004 | `uint32_t` | Slots in Entity Hashtable |
|
||||||
0x00B0 | `??` | Pointer to Ground Object (?)
|
| 0x0008 | `void**` | Pointer to Entity Hashtable |
|
||||||
0x0288 | `pyEntity*` | UsrEntity[0]
|
| 0x00B0 | `??` | Pointer to Ground Object (?) |
|
||||||
0x028C | `pyEntity*` | UsrEntity[1]
|
| 0x0288 | `pyEntity*` | UsrEntity_0 |
|
||||||
0x0290 | `pyEntity*` | UsrEntity[2]
|
| 0x028C | `pyEntity*` | UsrEntity_1 |
|
||||||
0x0294 | `pyEntity*` | UsrEntity[3]
|
| 0x0290 | `pyEntity*` | UsrEntity_2 |
|
||||||
0x0298 | `uint32_t` | Slots in Model Hashtable
|
| 0x0294 | `pyEntity*` | UsrEntity_3 |
|
||||||
0x029C | `void**` | Pointer to Model Hashtable
|
| 0x0298 | `uint32_t` | Slots in Model Hashtable |
|
||||||
0x02B8 | `uint32_t` | Slots in Entity lists Hashtable
|
| 0x029C | `void**` | Pointer to Model Hashtable |
|
||||||
0x02BC | `void**` | Pointer to Entity list Hashtable
|
| 0x02B8 | `uint32_t` | Slots in Entity lists Hashtable |
|
||||||
0x0330 | `float[3]` | Time (why 3 times?)
|
| 0x02BC | `void**` | Pointer to Entity list Hashtable |
|
||||||
0x1C6C | `float` | Alarm level
|
| 0x0330 | `float[3]` | Time (why 3 times?) |
|
||||||
0x1C68 | `float` | Alarm Grow Level
|
| 0x1C6C | `float` | Alarm level |
|
||||||
0x2158 | `float` | Used in `World_Init`
|
| 0x1C68 | `float` | Alarm Grow Level |
|
||||||
0x2170 | `???` | Used in `World_Init`
|
| 0x2158 | `float` | Used in `World_Init` |
|
||||||
0x2180 | `float` | Used in `World_Init`
|
| 0x2170 | `???` | Used in `World_Init` |
|
||||||
0x2188 | `void*` | Used in `World_Init`
|
| 0x2180 | `float` | Used in `World_Init` |
|
||||||
0x218C | `void*` | Used in `World_Init`
|
| 0x2188 | `void*` | Used in `World_Init` |
|
||||||
0x2190 | `float` | Used in `World_Init`
|
| 0x218C | `void*` | Used in `World_Init` |
|
||||||
0x2198 | `void*` | Used in `World_Init`
|
| 0x2190 | `float` | Used in `World_Init` |
|
||||||
0x219C | `void*` | Used in `World_Init`
|
| 0x2198 | `void*` | Used in `World_Init` |
|
||||||
0x21A0 | `void**` | Used in `World_Init` (VTable pointer?)
|
| 0x219C | `void*` | Used in `World_Init` |
|
||||||
0x21B4 | `void**` | Used in `World_Init` (VTable pointer?)
|
| 0x21A0 | `void**` | Used in `World_Init` (VTable pointer?) |
|
||||||
0x21C8 | `???` | Used in `World_Init`
|
| 0x21B4 | `void**` | Used in `World_Init` (VTable pointer?) |
|
||||||
0x2204 | `uint32_t` or `uint16_t` | Used in `World_Init`
|
| 0x21C8 | `???` | Used in `World_Init` |
|
||||||
0x2230 | `float` | Used in `World_Init`
|
| 0x2204 | `uint32_t` or `uint16_t` | Used in `World_Init` |
|
||||||
0x2238 | `???` | Used in `World_Init`
|
| 0x2230 | `float` | Used in `World_Init` |
|
||||||
0x2254 | `float` | Used in `World_Init`
|
| 0x2238 | `???` | Used in `World_Init` |
|
||||||
|
| 0x2254 | `float` | Used in `World_Init` |
|
||||||
|
|
||||||
|
|
||||||
## cPyEntity structure
|
## cPyEntity structure
|
||||||
|
|
||||||
Offset | Type | Description
|
Offset | Type | Description
|
||||||
------ | -------- | --------------------
|
------ | -------- | --------------------
|
||||||
0x0000 | `void**` | Virtual Method Table
|
0x0000 | `void**` | Virtual Method Table
|
||||||
0x0004 | `char*` | Name
|
0x0004 | `char*` | Name
|
||||||
0x0008 | `void*` | ???
|
0x0008 | `void*` | ???
|
||||||
|
|
||||||
|
|
||||||
## Entity Hash Table
|
## Entity Hash Table
|
||||||
|
@ -62,12 +68,12 @@ struct HT_Entry {
|
||||||
|
|
||||||
Data format:
|
Data format:
|
||||||
|
|
||||||
Offset | Type | Description
|
Offset | Type | Description
|
||||||
------ | ------------- | ------------------------
|
------ | ------------- | ------------------------
|
||||||
0x0 | `void**` | Virtual Method Table (?)
|
0x0 | `void**` | Virtual Method Table (?)
|
||||||
0x4 | `const char*` | name as string
|
0x4 | `const char*` | name as string
|
||||||
0x14 | `void*` | pointer to self (why?)
|
0x14 | `void*` | pointer to self (why?)
|
||||||
0x28 | `float[3]` | Position in Game World
|
0x28 | `float[3]` | Position in Game World
|
||||||
|
|
||||||
## EntityList Hash Table
|
## EntityList Hash Table
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue