Skip to content

Commit

Permalink
add: add config reader
Browse files Browse the repository at this point in the history
  • Loading branch information
xxCherry committed Feb 27, 2024
1 parent 358f0e6 commit d6be694
Show file tree
Hide file tree
Showing 5 changed files with 254 additions and 26 deletions.
197 changes: 178 additions & 19 deletions packages/tosu/src/entities/AllTimesData/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
import { Process } from 'tsprocess/dist/process';

import { DataRepo } from '@/entities/DataRepoList';

import { AbstractEntity } from '../AbstractEntity';
import { Settings } from '../Settings';

interface ConfigBindable {
type: 'bool' | 'byte' | 'int' | 'double' | 'string' | 'bstring' | 'enum';
setValue: (settings: Settings, value: any) => void;
}

export class AllTimesData extends AbstractEntity {
Status: number = 0;
Expand All @@ -13,10 +21,173 @@ export class AllTimesData extends AbstractEntity {
ShowInterface: boolean = false;
IsWatchingReplay: number = 0;

private configList: Record<string, ConfigBindable> = {
VolumeUniversal: {
type: 'int',
setValue: (settings, value) => {
settings.volume.master = value;
}
},
VolumeEffect: {
type: 'int',
setValue: (settings, value) => {
settings.volume.effect = value;
}
},
VolumeMusic: {
type: 'int',
setValue: (settings, value) => {
settings.volume.music = value;
}
},
_ReleaseStream: {
type: 'enum',
setValue: (settings, value) => {
settings.client.branch = value;
}
},
DimLevel: {
type: 'int',
setValue: (settings, value) => {
settings.background.dim = value;
}
},
ShowStoryboard: {
type: 'bool',
setValue: (settings, value) => {
settings.background.storyboard = value;
}
},
ShowInterface: {
type: 'bool',
setValue: (settings, value) => {
settings.showInterface = value;
}
},
BeatmapDirectory: {
type: 'bstring',
setValue: (settings, value) => {
settings.songsFolder = value;
}
},
ScoreMeter: {
type: 'enum',
setValue: (settings, value) => {
settings.scoreMeter.type = value;
}
},
ScoreMeterScale: {
type: 'double',
setValue: (settings, value) => {
settings.scoreMeter.size = value;
}
},
Offset: {
type: 'int',
setValue: (settings, value) => {
settings.offset.universal = value;
}
},
CursorSize: {
type: 'double',
setValue: (settings, value) => {
settings.cursor.size = value;
}
},
MouseSpeed: {
type: 'double',
setValue: (settings, value) => {
settings.mouse.sensitivity = value;
}
},
Fullscreen: {
type: 'bool',
setValue: (settings, value) => {
settings.window.fullscreen = value;
}
},
Width: {
type: 'int',
setValue: (settings, value) => {
settings.window.width = value;
}
},
Height: {
type: 'int',
setValue: (settings, value) => {
settings.window.height = value;
}
},
WidthFullscreen: {
type: 'int',
setValue: (settings, value) => {
settings.window.widthFullscreen = value;
}
},
HeightFullscreen: {
type: 'int',
setValue: (settings, value) => {
settings.window.heightFullscreen = value;
}
}
};

constructor(services: DataRepo) {
super(services);
}

async updateConfigState(
process: Process,
settings: Settings,
configurationAddr: number
) {
const items = process.readInt(configurationAddr + 0x8);
const size = process.readInt(configurationAddr + 0x1c);

for (let i = 0; i < size; i++) {
const current = items + 0x8 + 0x10 * i;

const key = process.readSharpString(process.readInt(current));
const bindable = process.readInt(current + 0x4);

const configBindable = this.configList[key];

if (configBindable !== undefined) {
let value: any;

switch (configBindable.type) {
case 'byte':
value = process.readByte(bindable + 0xc);
break;
case 'bool':
value = process.readByte(bindable + 0xc) == 1;
break;
case 'int':
case 'double':
value = process.readDouble(bindable + 0x4);
break;
case 'string':
value = process.readSharpString(
process.readInt(current + 0x4)
);
break;
case 'bstring':
value = process.readSharpString(
process.readInt(bindable + 0x4)
);
break;
case 'enum':
value = process.readInt(bindable + 0xc);
break;
default:
return;
}

configBindable.setValue(settings, value);
}
}
}

async updateState() {
const { process, patterns, settings } = this.services.getServices([
'process',
Expand All @@ -30,7 +201,7 @@ export class AllTimesData extends AbstractEntity {
menuModsPtr,
chatCheckerAddr,
skinDataAddr,
settingsClassAddr,
configurationAddr,
canRunSlowlyAddr,
gameTimePtr
} = patterns.getPatterns([
Expand All @@ -39,7 +210,7 @@ export class AllTimesData extends AbstractEntity {
'menuModsPtr',
'chatCheckerAddr',
'skinDataAddr',
'settingsClassAddr',
'configurationAddr',
'canRunSlowlyAddr',
'gameTimePtr'
]);
Expand All @@ -62,26 +233,14 @@ export class AllTimesData extends AbstractEntity {
this.SkinFolder = process.readSharpString(
process.readInt(skinOsuBase + 0x44)
);
// [[SettingsClass + 0x8] + 0x4] + 0xC
this.ShowInterface = Boolean(
process.readByte(
process.readInt(
process.readInt(settingsClassAddr + 0x8) + 0x4
) + 0xc
)
);
this.SongsFolder = process.readSharpString(
process.readInt(
process.readInt(
process.readInt(settingsClassAddr + 0x8) + 0xb8
) + 0x4
)
);

this.IsWatchingReplay = process.readByte(
process.readInt(canRunSlowlyAddr + 0x46)
);

settings.setShowInterface(this.ShowInterface);
this.updateConfigState(
process,
settings,
process.readPointer(configurationAddr)
);
}
}
69 changes: 69 additions & 0 deletions packages/tosu/src/entities/Settings/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,73 @@
enum ReleaseStream {
CuttingEdge,
Stable,
Beta,
Fallback
}

enum ScoreMeterType {
None,
Colour,
Error
}

interface Volume {
master: number;
music: number;
effect: number;
}

interface Background {
dim: number;
video: boolean;
storyboard: boolean;
}

interface Client {
branch: ReleaseStream;
}

interface Window {
fullscreen: boolean;
width: number;
height: number;
widthFullscreen: number;
heightFullscreen: number;
}

interface ScoreMeter {
type: ScoreMeterType;
size: number;
}

interface Offset {
universal: number;
}

interface Cursor {
size: number;
}

interface Mouse {
sensitivity: number;
}

export class Settings {
volume: Volume = { master: 0, music: 0, effect: 0 };
background: Background = { dim: 0, video: false, storyboard: false };
client: Client = { branch: 0 };
window: Window = {
fullscreen: false,
width: 0,
height: 0,
widthFullscreen: 0,
heightFullscreen: 0
};
scoreMeter: ScoreMeter = { type: ScoreMeterType.None, size: 0 };
offset: Offset = { universal: 0 };
cursor: Cursor = { size: 0 };
mouse: Mouse = { sensitivity: 0 };

showInterface: boolean = false;
gameFolder: string = '';
skinFolder: string = '';
Expand Down
6 changes: 3 additions & 3 deletions packages/tosu/src/objects/instanceManager/osuInstance.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,12 @@ const SCAN_PATTERNS: {
chatCheckerAddr: {
pattern: '0A D7 23 3C 00 00 ?? 01'
},

skinDataAddr: {
pattern: '74 2C 85 FF 75 28 A1 ?? ?? ?? ?? 8D 15'
},
settingsClassAddr: {
pattern: '83 E0 20 85 C0 7E 2F'
configurationAddr: {
pattern: '8B 0D ?? ?? ?? ?? 39 09 E8 ?? ?? ?? ?? 85 C0 7E',
offset: 0x2
},
rulesetsAddr: {
pattern: '7D 15 A1 ?? ?? ?? ?? 85 C0'
Expand Down
4 changes: 2 additions & 2 deletions packages/tosu/src/objects/memoryBase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export interface BaseData {
playTimeAddr: number;
chatCheckerAddr: number;
skinDataAddr: number;
settingsClassAddr: number;
configurationAddr: number;
rulesetsAddr: number;
canRunSlowlyAddr: number;
getAudioLengthAddr: number;
Expand All @@ -32,7 +32,7 @@ export class MemoryBase {
playTimeAddr: 0,
chatCheckerAddr: 0,
skinDataAddr: 0,
settingsClassAddr: 0,
configurationAddr: 0,
rulesetsAddr: 0,
canRunSlowlyAddr: 0,
getAudioLengthAddr: 0,
Expand Down
4 changes: 2 additions & 2 deletions packages/tosu/src/objects/memoryPatterns.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ export interface PatternData {
playTimeAddr: number;
chatCheckerAddr: number;
skinDataAddr: number;
settingsClassAddr: number;
configurationAddr: number;
rulesetsAddr: number;
canRunSlowlyAddr: number;
statusPtr: number;
Expand All @@ -28,7 +28,7 @@ export class MemoryPatterns {
playTimeAddr: 0,
chatCheckerAddr: 0,
skinDataAddr: 0,
settingsClassAddr: 0,
configurationAddr: 0,
rulesetsAddr: 0,
canRunSlowlyAddr: 0,
statusPtr: 0,
Expand Down

0 comments on commit d6be694

Please sign in to comment.