Splatlogger 1.2.4__tar.gz → 1.3.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {splatlogger-1.2.4/src/Splatlogger.egg-info → splatlogger-1.3.1}/PKG-INFO +12 -20
- {splatlogger-1.2.4 → splatlogger-1.3.1}/README.md +11 -19
- {splatlogger-1.2.4 → splatlogger-1.3.1}/pyproject.toml +1 -1
- {splatlogger-1.2.4 → splatlogger-1.3.1/src/Splatlogger.egg-info}/PKG-INFO +12 -20
- {splatlogger-1.2.4 → splatlogger-1.3.1}/src/splatlogger/__init__.py +1 -1
- {splatlogger-1.2.4 → splatlogger-1.3.1}/src/splatlogger/__main__.py +0 -1
- {splatlogger-1.2.4 → splatlogger-1.3.1}/src/splatlogger/cemu_gecko.py +0 -2
- {splatlogger-1.2.4 → splatlogger-1.3.1}/src/splatlogger/cli.py +17 -26
- splatlogger-1.3.1/src/splatlogger/enums.py +137 -0
- {splatlogger-1.2.4 → splatlogger-1.3.1}/src/splatlogger/match_logger.py +167 -114
- {splatlogger-1.2.4 → splatlogger-1.3.1}/src/splatlogger/resources/names.json +3 -4
- {splatlogger-1.2.4 → splatlogger-1.3.1}/src/splatlogger/splatlogger.py +68 -44
- {splatlogger-1.2.4 → splatlogger-1.3.1}/src/splatlogger/tcpgecko.py +9 -0
- {splatlogger-1.2.4 → splatlogger-1.3.1}/src/splatlogger/tuples.py +19 -1
- {splatlogger-1.2.4 → splatlogger-1.3.1}/src/splatlogger/utility_functions.py +55 -37
- splatlogger-1.2.4/src/splatlogger/enums.py +0 -81
- {splatlogger-1.2.4 → splatlogger-1.3.1}/LICENSE +0 -0
- {splatlogger-1.2.4 → splatlogger-1.3.1}/setup.cfg +0 -0
- {splatlogger-1.2.4 → splatlogger-1.3.1}/src/Splatlogger.egg-info/SOURCES.txt +0 -0
- {splatlogger-1.2.4 → splatlogger-1.3.1}/src/Splatlogger.egg-info/dependency_links.txt +0 -0
- {splatlogger-1.2.4 → splatlogger-1.3.1}/src/Splatlogger.egg-info/entry_points.txt +0 -0
- {splatlogger-1.2.4 → splatlogger-1.3.1}/src/Splatlogger.egg-info/requires.txt +0 -0
- {splatlogger-1.2.4 → splatlogger-1.3.1}/src/Splatlogger.egg-info/top_level.txt +0 -0
- {splatlogger-1.2.4 → splatlogger-1.3.1}/src/splatlogger/errors.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: Splatlogger
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.3.1
|
|
4
4
|
Summary: PID Grabber and player/match information logging tool for Splatoon
|
|
5
5
|
Author-email: Shadow Doggo <shadowdoggo@protonmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -50,8 +50,13 @@ or any other app with the TCPGecko server.
|
|
|
50
50
|
On Aroma, use [TCPGecko-Plugin](https://github.com/PinkDiamondTeam/TCPGecko-Plugin).
|
|
51
51
|
|
|
52
52
|
## Usage
|
|
53
|
+
Splatlogger uses a command-line interface (CLI), you will need to run it within a terminal.
|
|
54
|
+
|
|
55
|
+
On Windows, it's best to use [Windows Terminal](https://learn.microsoft.com/en-us/windows/terminal/install)
|
|
56
|
+
or [PowerShell](https://learn.microsoft.com/en-us/powershell/scripting/install/install-powershell-on-windows), as the Command Prompt can't properly display certain characters.
|
|
57
|
+
|
|
53
58
|
### Running the executable
|
|
54
|
-
Windows and
|
|
59
|
+
Executables for Windows, Linux and macOS are provided on the [Releases](https://codeberg.org/ShadowDoggo/Splatlogger/releases/latest) page.
|
|
55
60
|
|
|
56
61
|
Run Splatlogger with:
|
|
57
62
|
```
|
|
@@ -60,9 +65,9 @@ path/to/Splatlogger-executable --ip IP [options] / --cemu [PID] [options]
|
|
|
60
65
|
Use the `--ip` target where `IP` is your Wii U's LAN IP address,
|
|
61
66
|
or the `-c` / `--cemu` target to enable Cemu mode where `PID` is the process ID of the Cemu process (optional, should be detected automatically).
|
|
62
67
|
|
|
63
|
-
|
|
68
|
+
Drag the executable into the terminal window to automatically get the path.
|
|
64
69
|
|
|
65
|
-
On Linux, you might need to make the file executable first with `chmod +x path/to/Splatlogger-executable`
|
|
70
|
+
On Linux and macOS, you might need to make the file executable first with `chmod +x path/to/Splatlogger-executable`
|
|
66
71
|
|
|
67
72
|
### Running with Python
|
|
68
73
|
You can install Splatlogger as a package from PyPI:
|
|
@@ -103,7 +108,7 @@ python -m splatlogger --ip IP [options] / --cemu [PID] [options]
|
|
|
103
108
|
- `none` - Don't create a log file.
|
|
104
109
|
- `standard` - Log only basic player information, the same as what's printed to the console (default).
|
|
105
110
|
- `extended` - Log all player information and additional match information.
|
|
106
|
-
- `
|
|
111
|
+
- `full` - Same as above with the addition of player stats (points, K/D, win/lose), disconnect detection, and match results.
|
|
107
112
|
Requires the match to end to finish logging; if it ends abruptly, the stats won't be logged.
|
|
108
113
|
|
|
109
114
|
- `--service` - Choose which network service you're using.
|
|
@@ -118,11 +123,6 @@ Also allows you to view information about the lobby/gathering while on the match
|
|
|
118
123
|
|
|
119
124
|
(These options don't affect anything if the log level is set to `none`)
|
|
120
125
|
|
|
121
|
-
- `--stack Address (in hex)` - (Cemu only, optional) Beginning address of the stack space for Default Core 1 (Debug > View PPC threads).
|
|
122
|
-
Only required for logging stats. If the default values don't work, you'll need to specify this manually.
|
|
123
|
-
|
|
124
|
-
<img src="assets/stack.png" width="600" alt="(example)">
|
|
125
|
-
|
|
126
126
|
- `-sl`, `--single-log` - Enable single log mode. When enabled, only one log file will be created for each day and logging will resume in that file
|
|
127
127
|
instead of creating a new one for each logging session (default behavior for `--auto latest`).
|
|
128
128
|
|
|
@@ -150,7 +150,7 @@ ip = "192.168.1.50"
|
|
|
150
150
|
# Target network service: "pretendo", "altendo", or "none"
|
|
151
151
|
service = "pretendo"
|
|
152
152
|
|
|
153
|
-
# Log level: "standard", "extended", "
|
|
153
|
+
# Log level: "standard", "extended", "full", or "none"
|
|
154
154
|
log_level = "extended"
|
|
155
155
|
|
|
156
156
|
# Auto logging: "all", "latest" (omit for manual logging)
|
|
@@ -169,9 +169,6 @@ single_log = true
|
|
|
169
169
|
# Cemu process ID (set to -1 to find automatically)
|
|
170
170
|
# Uncomment this option to enable Cemu mode
|
|
171
171
|
# cemu = -1
|
|
172
|
-
|
|
173
|
-
# Beginning address of the stack space for Default Core 1 (set only if stat logging doesn't work by default)
|
|
174
|
-
# stack = "0xE101440"
|
|
175
172
|
```
|
|
176
173
|
|
|
177
174
|
### Troubleshooting
|
|
@@ -182,9 +179,6 @@ If it keeps failing to connect, make sure that:
|
|
|
182
179
|
- Port 7331 isn't blocked by the firewall.
|
|
183
180
|
- TCPGecko is running.
|
|
184
181
|
|
|
185
|
-
There's an issue with TCPGecko where opening an applet such as the Friend List and going back into the game causes memory
|
|
186
|
-
reads to fail. If auto-logging is enabled, you'll need to restart Splatlogger after returning to the game.
|
|
187
|
-
|
|
188
182
|
For Cemu users on Linux, if you have ptrace protection enabled, you'll need to run Python as root.
|
|
189
183
|
In that case, it's best to run the package from source or use the executable instead.
|
|
190
184
|
|
|
@@ -208,9 +202,7 @@ python scripts/build.py [--upx-dir path/to/upx]
|
|
|
208
202
|
```
|
|
209
203
|
use `--upx-dir` if you're using UPX to compress the executable.
|
|
210
204
|
|
|
211
|
-
You can also use `build.bat` on Windows and `build.sh` on Linux to handle everything automatically.
|
|
212
|
-
|
|
213
|
-
(No builds or build script are provided for macOS as I don't have a Mac to test, and my attempts at virtualizing macOS have been unsuccessful.)
|
|
205
|
+
You can also use `build.bat` on Windows and `build.sh` on Linux/macOS to handle everything automatically.
|
|
214
206
|
|
|
215
207
|
## Acknowledgments
|
|
216
208
|
- NWPlayer123 for the reference implementation of a TCPGecko library.
|
|
@@ -25,8 +25,13 @@ or any other app with the TCPGecko server.
|
|
|
25
25
|
On Aroma, use [TCPGecko-Plugin](https://github.com/PinkDiamondTeam/TCPGecko-Plugin).
|
|
26
26
|
|
|
27
27
|
## Usage
|
|
28
|
+
Splatlogger uses a command-line interface (CLI), you will need to run it within a terminal.
|
|
29
|
+
|
|
30
|
+
On Windows, it's best to use [Windows Terminal](https://learn.microsoft.com/en-us/windows/terminal/install)
|
|
31
|
+
or [PowerShell](https://learn.microsoft.com/en-us/powershell/scripting/install/install-powershell-on-windows), as the Command Prompt can't properly display certain characters.
|
|
32
|
+
|
|
28
33
|
### Running the executable
|
|
29
|
-
Windows and
|
|
34
|
+
Executables for Windows, Linux and macOS are provided on the [Releases](https://codeberg.org/ShadowDoggo/Splatlogger/releases/latest) page.
|
|
30
35
|
|
|
31
36
|
Run Splatlogger with:
|
|
32
37
|
```
|
|
@@ -35,9 +40,9 @@ path/to/Splatlogger-executable --ip IP [options] / --cemu [PID] [options]
|
|
|
35
40
|
Use the `--ip` target where `IP` is your Wii U's LAN IP address,
|
|
36
41
|
or the `-c` / `--cemu` target to enable Cemu mode where `PID` is the process ID of the Cemu process (optional, should be detected automatically).
|
|
37
42
|
|
|
38
|
-
|
|
43
|
+
Drag the executable into the terminal window to automatically get the path.
|
|
39
44
|
|
|
40
|
-
On Linux, you might need to make the file executable first with `chmod +x path/to/Splatlogger-executable`
|
|
45
|
+
On Linux and macOS, you might need to make the file executable first with `chmod +x path/to/Splatlogger-executable`
|
|
41
46
|
|
|
42
47
|
### Running with Python
|
|
43
48
|
You can install Splatlogger as a package from PyPI:
|
|
@@ -78,7 +83,7 @@ python -m splatlogger --ip IP [options] / --cemu [PID] [options]
|
|
|
78
83
|
- `none` - Don't create a log file.
|
|
79
84
|
- `standard` - Log only basic player information, the same as what's printed to the console (default).
|
|
80
85
|
- `extended` - Log all player information and additional match information.
|
|
81
|
-
- `
|
|
86
|
+
- `full` - Same as above with the addition of player stats (points, K/D, win/lose), disconnect detection, and match results.
|
|
82
87
|
Requires the match to end to finish logging; if it ends abruptly, the stats won't be logged.
|
|
83
88
|
|
|
84
89
|
- `--service` - Choose which network service you're using.
|
|
@@ -93,11 +98,6 @@ Also allows you to view information about the lobby/gathering while on the match
|
|
|
93
98
|
|
|
94
99
|
(These options don't affect anything if the log level is set to `none`)
|
|
95
100
|
|
|
96
|
-
- `--stack Address (in hex)` - (Cemu only, optional) Beginning address of the stack space for Default Core 1 (Debug > View PPC threads).
|
|
97
|
-
Only required for logging stats. If the default values don't work, you'll need to specify this manually.
|
|
98
|
-
|
|
99
|
-
<img src="assets/stack.png" width="600" alt="(example)">
|
|
100
|
-
|
|
101
101
|
- `-sl`, `--single-log` - Enable single log mode. When enabled, only one log file will be created for each day and logging will resume in that file
|
|
102
102
|
instead of creating a new one for each logging session (default behavior for `--auto latest`).
|
|
103
103
|
|
|
@@ -125,7 +125,7 @@ ip = "192.168.1.50"
|
|
|
125
125
|
# Target network service: "pretendo", "altendo", or "none"
|
|
126
126
|
service = "pretendo"
|
|
127
127
|
|
|
128
|
-
# Log level: "standard", "extended", "
|
|
128
|
+
# Log level: "standard", "extended", "full", or "none"
|
|
129
129
|
log_level = "extended"
|
|
130
130
|
|
|
131
131
|
# Auto logging: "all", "latest" (omit for manual logging)
|
|
@@ -144,9 +144,6 @@ single_log = true
|
|
|
144
144
|
# Cemu process ID (set to -1 to find automatically)
|
|
145
145
|
# Uncomment this option to enable Cemu mode
|
|
146
146
|
# cemu = -1
|
|
147
|
-
|
|
148
|
-
# Beginning address of the stack space for Default Core 1 (set only if stat logging doesn't work by default)
|
|
149
|
-
# stack = "0xE101440"
|
|
150
147
|
```
|
|
151
148
|
|
|
152
149
|
### Troubleshooting
|
|
@@ -157,9 +154,6 @@ If it keeps failing to connect, make sure that:
|
|
|
157
154
|
- Port 7331 isn't blocked by the firewall.
|
|
158
155
|
- TCPGecko is running.
|
|
159
156
|
|
|
160
|
-
There's an issue with TCPGecko where opening an applet such as the Friend List and going back into the game causes memory
|
|
161
|
-
reads to fail. If auto-logging is enabled, you'll need to restart Splatlogger after returning to the game.
|
|
162
|
-
|
|
163
157
|
For Cemu users on Linux, if you have ptrace protection enabled, you'll need to run Python as root.
|
|
164
158
|
In that case, it's best to run the package from source or use the executable instead.
|
|
165
159
|
|
|
@@ -183,9 +177,7 @@ python scripts/build.py [--upx-dir path/to/upx]
|
|
|
183
177
|
```
|
|
184
178
|
use `--upx-dir` if you're using UPX to compress the executable.
|
|
185
179
|
|
|
186
|
-
You can also use `build.bat` on Windows and `build.sh` on Linux to handle everything automatically.
|
|
187
|
-
|
|
188
|
-
(No builds or build script are provided for macOS as I don't have a Mac to test, and my attempts at virtualizing macOS have been unsuccessful.)
|
|
180
|
+
You can also use `build.bat` on Windows and `build.sh` on Linux/macOS to handle everything automatically.
|
|
189
181
|
|
|
190
182
|
## Acknowledgments
|
|
191
183
|
- NWPlayer123 for the reference implementation of a TCPGecko library.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: Splatlogger
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.3.1
|
|
4
4
|
Summary: PID Grabber and player/match information logging tool for Splatoon
|
|
5
5
|
Author-email: Shadow Doggo <shadowdoggo@protonmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -50,8 +50,13 @@ or any other app with the TCPGecko server.
|
|
|
50
50
|
On Aroma, use [TCPGecko-Plugin](https://github.com/PinkDiamondTeam/TCPGecko-Plugin).
|
|
51
51
|
|
|
52
52
|
## Usage
|
|
53
|
+
Splatlogger uses a command-line interface (CLI), you will need to run it within a terminal.
|
|
54
|
+
|
|
55
|
+
On Windows, it's best to use [Windows Terminal](https://learn.microsoft.com/en-us/windows/terminal/install)
|
|
56
|
+
or [PowerShell](https://learn.microsoft.com/en-us/powershell/scripting/install/install-powershell-on-windows), as the Command Prompt can't properly display certain characters.
|
|
57
|
+
|
|
53
58
|
### Running the executable
|
|
54
|
-
Windows and
|
|
59
|
+
Executables for Windows, Linux and macOS are provided on the [Releases](https://codeberg.org/ShadowDoggo/Splatlogger/releases/latest) page.
|
|
55
60
|
|
|
56
61
|
Run Splatlogger with:
|
|
57
62
|
```
|
|
@@ -60,9 +65,9 @@ path/to/Splatlogger-executable --ip IP [options] / --cemu [PID] [options]
|
|
|
60
65
|
Use the `--ip` target where `IP` is your Wii U's LAN IP address,
|
|
61
66
|
or the `-c` / `--cemu` target to enable Cemu mode where `PID` is the process ID of the Cemu process (optional, should be detected automatically).
|
|
62
67
|
|
|
63
|
-
|
|
68
|
+
Drag the executable into the terminal window to automatically get the path.
|
|
64
69
|
|
|
65
|
-
On Linux, you might need to make the file executable first with `chmod +x path/to/Splatlogger-executable`
|
|
70
|
+
On Linux and macOS, you might need to make the file executable first with `chmod +x path/to/Splatlogger-executable`
|
|
66
71
|
|
|
67
72
|
### Running with Python
|
|
68
73
|
You can install Splatlogger as a package from PyPI:
|
|
@@ -103,7 +108,7 @@ python -m splatlogger --ip IP [options] / --cemu [PID] [options]
|
|
|
103
108
|
- `none` - Don't create a log file.
|
|
104
109
|
- `standard` - Log only basic player information, the same as what's printed to the console (default).
|
|
105
110
|
- `extended` - Log all player information and additional match information.
|
|
106
|
-
- `
|
|
111
|
+
- `full` - Same as above with the addition of player stats (points, K/D, win/lose), disconnect detection, and match results.
|
|
107
112
|
Requires the match to end to finish logging; if it ends abruptly, the stats won't be logged.
|
|
108
113
|
|
|
109
114
|
- `--service` - Choose which network service you're using.
|
|
@@ -118,11 +123,6 @@ Also allows you to view information about the lobby/gathering while on the match
|
|
|
118
123
|
|
|
119
124
|
(These options don't affect anything if the log level is set to `none`)
|
|
120
125
|
|
|
121
|
-
- `--stack Address (in hex)` - (Cemu only, optional) Beginning address of the stack space for Default Core 1 (Debug > View PPC threads).
|
|
122
|
-
Only required for logging stats. If the default values don't work, you'll need to specify this manually.
|
|
123
|
-
|
|
124
|
-
<img src="assets/stack.png" width="600" alt="(example)">
|
|
125
|
-
|
|
126
126
|
- `-sl`, `--single-log` - Enable single log mode. When enabled, only one log file will be created for each day and logging will resume in that file
|
|
127
127
|
instead of creating a new one for each logging session (default behavior for `--auto latest`).
|
|
128
128
|
|
|
@@ -150,7 +150,7 @@ ip = "192.168.1.50"
|
|
|
150
150
|
# Target network service: "pretendo", "altendo", or "none"
|
|
151
151
|
service = "pretendo"
|
|
152
152
|
|
|
153
|
-
# Log level: "standard", "extended", "
|
|
153
|
+
# Log level: "standard", "extended", "full", or "none"
|
|
154
154
|
log_level = "extended"
|
|
155
155
|
|
|
156
156
|
# Auto logging: "all", "latest" (omit for manual logging)
|
|
@@ -169,9 +169,6 @@ single_log = true
|
|
|
169
169
|
# Cemu process ID (set to -1 to find automatically)
|
|
170
170
|
# Uncomment this option to enable Cemu mode
|
|
171
171
|
# cemu = -1
|
|
172
|
-
|
|
173
|
-
# Beginning address of the stack space for Default Core 1 (set only if stat logging doesn't work by default)
|
|
174
|
-
# stack = "0xE101440"
|
|
175
172
|
```
|
|
176
173
|
|
|
177
174
|
### Troubleshooting
|
|
@@ -182,9 +179,6 @@ If it keeps failing to connect, make sure that:
|
|
|
182
179
|
- Port 7331 isn't blocked by the firewall.
|
|
183
180
|
- TCPGecko is running.
|
|
184
181
|
|
|
185
|
-
There's an issue with TCPGecko where opening an applet such as the Friend List and going back into the game causes memory
|
|
186
|
-
reads to fail. If auto-logging is enabled, you'll need to restart Splatlogger after returning to the game.
|
|
187
|
-
|
|
188
182
|
For Cemu users on Linux, if you have ptrace protection enabled, you'll need to run Python as root.
|
|
189
183
|
In that case, it's best to run the package from source or use the executable instead.
|
|
190
184
|
|
|
@@ -208,9 +202,7 @@ python scripts/build.py [--upx-dir path/to/upx]
|
|
|
208
202
|
```
|
|
209
203
|
use `--upx-dir` if you're using UPX to compress the executable.
|
|
210
204
|
|
|
211
|
-
You can also use `build.bat` on Windows and `build.sh` on Linux to handle everything automatically.
|
|
212
|
-
|
|
213
|
-
(No builds or build script are provided for macOS as I don't have a Mac to test, and my attempts at virtualizing macOS have been unsuccessful.)
|
|
205
|
+
You can also use `build.bat` on Windows and `build.sh` on Linux/macOS to handle everything automatically.
|
|
214
206
|
|
|
215
207
|
## Acknowledgments
|
|
216
208
|
- NWPlayer123 for the reference implementation of a TCPGecko library.
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
__version__ = "1.
|
|
1
|
+
__version__ = "1.3.1"
|
|
2
2
|
__author__ = "Shadow Doggo"
|
|
@@ -74,11 +74,9 @@ class CemuGecko:
|
|
|
74
74
|
def resolve_pointer_chain(self, base_address: int, offsets: list[int]) -> int:
|
|
75
75
|
"""Follow a pointer chain to its destination address starting from base_address and applying offsets."""
|
|
76
76
|
current_address = self.peek32(base_address)
|
|
77
|
-
|
|
78
77
|
for offset in offsets[:-1]:
|
|
79
78
|
if current_address == 0:
|
|
80
79
|
return 0
|
|
81
|
-
|
|
82
80
|
current_address = self.peek32(current_address + offset)
|
|
83
81
|
|
|
84
82
|
if current_address != 0 and offsets:
|
|
@@ -7,7 +7,7 @@ import webbrowser
|
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
|
|
9
9
|
import userpaths
|
|
10
|
-
from colorama import
|
|
10
|
+
from colorama import just_fix_windows_console
|
|
11
11
|
from prompt_toolkit import PromptSession
|
|
12
12
|
from prompt_toolkit.patch_stdout import patch_stdout
|
|
13
13
|
|
|
@@ -70,7 +70,7 @@ def command_listener(ctx: AppContext) -> None:
|
|
|
70
70
|
|
|
71
71
|
|
|
72
72
|
def parse_args() -> Options:
|
|
73
|
-
parser = argparse.ArgumentParser(description="PID
|
|
73
|
+
parser = argparse.ArgumentParser(description="PID Grabber and player/match information logging tool for Splatoon")
|
|
74
74
|
add_parser_arguments(parser)
|
|
75
75
|
|
|
76
76
|
config_path = Path(userpaths.get_my_documents()) / "Splatlogger/config.toml"
|
|
@@ -83,28 +83,25 @@ def parse_args() -> Options:
|
|
|
83
83
|
args = parser.parse_args()
|
|
84
84
|
|
|
85
85
|
if not args.ip and not args.cemu:
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
"\nWould you like to open the README? (y/n)")
|
|
86
|
+
uf.print_warning("No target (IP address or Cemu mode) was provided. Run \"splatlogger -h\" for help.\n")
|
|
87
|
+
print("Would you like to open the README? (y/n)")
|
|
89
88
|
if input().lower() in ("y", "yes"):
|
|
90
89
|
webbrowser.open("https://codeberg.org/ShadowDoggo/Splatlogger/src/branch/main/README.md")
|
|
91
90
|
sys.exit()
|
|
92
91
|
|
|
93
|
-
stack_addr: int | None = None
|
|
94
|
-
if args.stack and args.cemu:
|
|
95
|
-
try:
|
|
96
|
-
stack_addr = int(args.stack, 16)
|
|
97
|
-
except ValueError:
|
|
98
|
-
uf.print_error("Invalid stack address. Please provide a valid hex value.")
|
|
99
|
-
sys.exit()
|
|
100
|
-
|
|
101
92
|
if args.log_level == "none" and args.silent:
|
|
102
|
-
uf.print_warning("
|
|
103
|
-
"Are you sure this wasn't a mistake?\n")
|
|
93
|
+
uf.print_warning("Silent mode is enabled and no log level is set. No information will be logged.\n")
|
|
104
94
|
|
|
105
|
-
return Options(
|
|
106
|
-
|
|
107
|
-
|
|
95
|
+
return Options(
|
|
96
|
+
ip=args.ip,
|
|
97
|
+
log_level=args.log_level,
|
|
98
|
+
auto_logging=args.auto in ("all", "latest"),
|
|
99
|
+
log_latest=args.auto == "latest",
|
|
100
|
+
platform="cemu" if args.cemu else "wiiu", cemu_pid=args.cemu,
|
|
101
|
+
service=args.service,
|
|
102
|
+
silent_logging=args.silent,
|
|
103
|
+
single_log=args.single_log
|
|
104
|
+
)
|
|
108
105
|
|
|
109
106
|
|
|
110
107
|
def add_parser_arguments(parser: argparse.ArgumentParser) -> None:
|
|
@@ -113,15 +110,12 @@ def add_parser_arguments(parser: argparse.ArgumentParser) -> None:
|
|
|
113
110
|
help="Switch to Cemu mode (optional: PID of the Cemu process).", metavar="PID",
|
|
114
111
|
nargs="?", const=-1)
|
|
115
112
|
parser.add_argument("--log-level", help="Set how much data should be logged (see README).",
|
|
116
|
-
choices=["none", "standard", "extended", "
|
|
113
|
+
choices=["none", "standard", "extended", "full"], default="standard")
|
|
117
114
|
parser.add_argument("--service", help="Choose which network service you're using (Pretendo by default).",
|
|
118
115
|
choices=["none", "pretendo", "altendo"], default="pretendo")
|
|
119
116
|
parser.add_argument("-a", "--auto",
|
|
120
117
|
help="Enable auto logging (see README).",
|
|
121
118
|
choices=["all", "latest"], nargs="?", const="all")
|
|
122
|
-
parser.add_argument("--stack",
|
|
123
|
-
help="Beginning address of the stack space for Default Core 1 (Cemu only, see README).",
|
|
124
|
-
metavar="Address (in hex)")
|
|
125
119
|
parser.add_argument("-sl", "--single-log", help="Enable single log file mode.", action="store_true")
|
|
126
120
|
parser.add_argument("-s", "--silent", help="Disable printing logs to the console.", action="store_true")
|
|
127
121
|
|
|
@@ -136,7 +130,7 @@ CONFIG_TEMPLATE = """# Splatlogger Configuration
|
|
|
136
130
|
# Target network service: "pretendo", "altendo", or "none"
|
|
137
131
|
# service = "pretendo"
|
|
138
132
|
|
|
139
|
-
# Log level: "standard", "extended", "
|
|
133
|
+
# Log level: "standard", "extended", "full", or "none"
|
|
140
134
|
# log_level = "standard"
|
|
141
135
|
|
|
142
136
|
# Auto logging: "all", "latest" (omit for manual logging)
|
|
@@ -155,9 +149,6 @@ CONFIG_TEMPLATE = """# Splatlogger Configuration
|
|
|
155
149
|
# Cemu process ID (set to -1 to find automatically)
|
|
156
150
|
# Uncomment this option to enable Cemu mode
|
|
157
151
|
# cemu = -1
|
|
158
|
-
|
|
159
|
-
# Beginning address of the stack space for Default Core 1 (set only if stat logging doesn't work by default)
|
|
160
|
-
# stack = "0xE101440"
|
|
161
152
|
"""
|
|
162
153
|
|
|
163
154
|
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Splatlogger (c) 2025 Shadow Doggo.
|
|
2
|
+
|
|
3
|
+
from enum import Enum, IntEnum
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Pointers(IntEnum):
|
|
7
|
+
SESSION = 0x101E8980
|
|
8
|
+
STATIC_MEM = 0x101DD330
|
|
9
|
+
MAIN_MGR_BASE = 0x101E2814
|
|
10
|
+
MAIN_MGR_VS_GAME = 0x101E4FF8
|
|
11
|
+
FRAMEWORK = 0x101E80A8
|
|
12
|
+
|
|
13
|
+
def convert(self, platform: str) -> int:
|
|
14
|
+
return self.value + Offsets.WIIU_BSS_OFFSET if platform == "wiiu" else self.value
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class Offsets(IntEnum):
|
|
18
|
+
WIIU_BSS_OFFSET = 0x503000
|
|
19
|
+
SESSION_ID_IDX = 0xBD
|
|
20
|
+
SESSION_ID = 0xCC
|
|
21
|
+
SESSION_ACTIVE_STATION_LIST_SENTINEL = 0xD8
|
|
22
|
+
SESSION_ACTIVE_STATION_LIST_FIRST_NODE_PTR = 0xDC
|
|
23
|
+
SESSION_ACTIVE_STATION_LIST_COUNT = 0xE0
|
|
24
|
+
SESSION_STATION_NODE_CAPACITY = 0xFC
|
|
25
|
+
STATION_LIST_NODE_PREV_PTR = 0x0
|
|
26
|
+
STATION_LIST_NODE_NEXT_PTR = 0x4
|
|
27
|
+
STATION_LIST_NODE_STATION_ID = 0x8
|
|
28
|
+
STATION_LIST_NODE_SIZE = 0x10
|
|
29
|
+
MAINMGR_PLAYER_MGR_PTR = 0x268
|
|
30
|
+
PLAYERMGR_PLAYER_COUNT = 0x320
|
|
31
|
+
MAINMGR_VS_GAME_SEQ_MGR_VS_GAME_PTR = 0x2A4
|
|
32
|
+
MAINMGR_VS_GAME_PAGE_HANDLER_PTR = 0x2D8
|
|
33
|
+
SEQ_MGR_VS_GAME_FINAL_RESULT_PTR = 0xAA8
|
|
34
|
+
SEQ_MGR_VS_GAME_FINAL_RESULT_SCORE_PTR = 0x294
|
|
35
|
+
SCORE_OBJECT_TEAM_RESULTS_ARY_PTR = 0x10
|
|
36
|
+
TEAM_RESULTS_ARY_SIZE_REGULAR = 0x18
|
|
37
|
+
TEAM_RESULTS_ARY_SIZE_RANKED = 0x2C
|
|
38
|
+
TEAM_RESULTS_PAINT_PC = 0x4
|
|
39
|
+
TEAM_RESULTS_WON = 0xC
|
|
40
|
+
TEAM_RESULTS_RANKED_OBJ_COUNT = 0x10
|
|
41
|
+
TEAM_RESULTS_POINTS = 0x14
|
|
42
|
+
PAGE_HANDLER_RESULTS_PAGE_PTR = 0x118
|
|
43
|
+
PAGE_HANDLER_LEADERBOARD_PAGE_PTR = 0x11C
|
|
44
|
+
RESULTS_PAGE_PHASE = 0x1E8
|
|
45
|
+
LEADERBOARD_PAGE_SLOTS = 0x214
|
|
46
|
+
LEADERBOARD_PAGE_ROWS_PTR = 0x218
|
|
47
|
+
ROWS_PLAYER_STRIDE = 0x20
|
|
48
|
+
ROWS_PLAYER_IDX = 0x0
|
|
49
|
+
ROWS_PLAYER_PLAYERINFO_PTR = 0x4
|
|
50
|
+
ROWS_PLAYER_TEAM = 0x8
|
|
51
|
+
ROWS_PLAYER_POINTS = 0xC
|
|
52
|
+
ROWS_PLAYER_KILLS = 0x10
|
|
53
|
+
ROWS_PLAYER_DEATHS = 0x14
|
|
54
|
+
ROWS_PLAYER_LOCAL_PLAYER_FLAG = 0x1C
|
|
55
|
+
FRAMEWORK_PEER_MGR_PTR = 0x14
|
|
56
|
+
PEER_MGR_ID_MGR_PTR = 0x84
|
|
57
|
+
ID_MGR_SLOT_ARY_PTR = 0x8
|
|
58
|
+
SLOT_SIZE = 0x14
|
|
59
|
+
SLOT_STATE = 0x0
|
|
60
|
+
SLOT_PID = 0x4
|
|
61
|
+
SLOT_PLAYER_ID = 0x12
|
|
62
|
+
STATICMEM_PLAYER_INFO_ARY_PTR = 0x10
|
|
63
|
+
STATICMEM_STAGE = 0x28
|
|
64
|
+
STATICMEM_MATCH_HOUR = 0x234
|
|
65
|
+
STATICMEM_VERSUS_MODE = 0x238
|
|
66
|
+
STATICMEM_VERSUS_RULE = 0x23C
|
|
67
|
+
PLAYER_INFO_NAME = 0x6
|
|
68
|
+
PLAYER_INFO_NAME_LENGTH = 0x20
|
|
69
|
+
PLAYER_INFO_REGION = 0x2C
|
|
70
|
+
PLAYER_INFO_TEAM = 0x33
|
|
71
|
+
PLAYER_INFO_GENDER = 0x37
|
|
72
|
+
PLAYER_INFO_SKIN_TONE = 0x3B
|
|
73
|
+
PLAYER_INFO_EYE_COLOR = 0x3F
|
|
74
|
+
PLAYER_INFO_WEAPON_SET = 0x42
|
|
75
|
+
PLAYER_INFO_MAIN_WEAPON = 0x46
|
|
76
|
+
PLAYER_INFO_SUB_WEAPON = 0x4A
|
|
77
|
+
PLAYER_INFO_SPECIAL_WEAPON = 0x4F
|
|
78
|
+
PLAYER_INFO_SHOES = 0x54
|
|
79
|
+
PLAYER_INFO_CLOTHES = 0x70
|
|
80
|
+
PLAYER_INFO_HEADGEAR = 0x8C
|
|
81
|
+
PLAYER_INFO_INK_TANK = 0xAA
|
|
82
|
+
PLAYER_INFO_LEVEL = 0xAF
|
|
83
|
+
PLAYER_INFO_RANK = 0xB3
|
|
84
|
+
PLAYER_INFO_FEST_TEAM = 0xB7
|
|
85
|
+
PLAYER_INFO_FEST_ID = 0xBA
|
|
86
|
+
PLAYER_INFO_FEST_RANK = 0xBF
|
|
87
|
+
PLAYER_INFO_PID = 0xD0
|
|
88
|
+
PLAYER_INFO_FEST_POWER = 0xD6
|
|
89
|
+
PLAYER_INFO_SIZE = 0xD8
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
class OffsetChains(Enum):
|
|
93
|
+
ID_MANAGER = (
|
|
94
|
+
Offsets.FRAMEWORK_PEER_MGR_PTR,
|
|
95
|
+
Offsets.PEER_MGR_ID_MGR_PTR,
|
|
96
|
+
0
|
|
97
|
+
)
|
|
98
|
+
ID_MANAGER_SLOT_ARRAY = (
|
|
99
|
+
Offsets.ID_MGR_SLOT_ARY_PTR,
|
|
100
|
+
0
|
|
101
|
+
)
|
|
102
|
+
RESULTS_PHASE_ADDRESS = (
|
|
103
|
+
Offsets.MAINMGR_VS_GAME_PAGE_HANDLER_PTR,
|
|
104
|
+
Offsets.PAGE_HANDLER_RESULTS_PAGE_PTR,
|
|
105
|
+
Offsets.RESULTS_PAGE_PHASE
|
|
106
|
+
)
|
|
107
|
+
LEADERBOARD_PAGE = (
|
|
108
|
+
Offsets.MAINMGR_VS_GAME_PAGE_HANDLER_PTR,
|
|
109
|
+
Offsets.PAGE_HANDLER_LEADERBOARD_PAGE_PTR,
|
|
110
|
+
0
|
|
111
|
+
)
|
|
112
|
+
TEAM_RESULTS_ARRAY = (
|
|
113
|
+
Offsets.MAINMGR_VS_GAME_SEQ_MGR_VS_GAME_PTR,
|
|
114
|
+
Offsets.SEQ_MGR_VS_GAME_FINAL_RESULT_PTR,
|
|
115
|
+
Offsets.SEQ_MGR_VS_GAME_FINAL_RESULT_SCORE_PTR,
|
|
116
|
+
Offsets.SCORE_OBJECT_TEAM_RESULTS_ARY_PTR,
|
|
117
|
+
0
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
@property
|
|
121
|
+
def offsets(self) -> list[int]:
|
|
122
|
+
return list(self.value)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
class VSMode(IntEnum):
|
|
126
|
+
REGULAR = 0
|
|
127
|
+
GACHI = 1
|
|
128
|
+
FEST = 2
|
|
129
|
+
PRIVATE = 3
|
|
130
|
+
PARTY = 4
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
class VSRule(IntEnum):
|
|
134
|
+
TURF = 0
|
|
135
|
+
RAINMAKER = 1
|
|
136
|
+
ZONES = 2
|
|
137
|
+
TOWER = 3
|