Files
bigmak94andClaude Opus 5.5 b5f400bbbd AstroQuest 0.11: ASTRO BOT Rescue Mission in VR on Meta Quest 3 and PC VR
On top of the shadps4-arm64 core imported in the previous commit:

- PlayStation VR emulation: headset, tracker, reprojection, camera and social screen; the
  player's seat and view reset; head velocity for head-butts; field of view settings
- Sound: a native Ngs2 engine (samplers, submixers, effects), the Audio3d spatializer, virtual
  surround for headset speakers, microphone pass-through; libSceJson2; libSceFiber on FEX
- Fixes for CUSA12392 under emulation: real-time step, pace and resolution governor, larger
  render sizes on the PC, save loading at start
- Renderer: geometry shaders fed with fans/polygons/loops, cube-array layers of light probes,
  sample-count mismatches on Adreno, timeline semaphore hang, FXAA in place of the MSAA
  resolve, sharpening, VR frame export
- quest-host: the Quest app (OpenXR host that runs the glibc core as a child process, frames
  through AHardwareBuffers, DualSense mapping, hand-tracked controller placement, KGSL shim)
- PC: in-process OpenXR host (Virtual Desktop or any OpenXR runtime), Touch controllers as the
  gamepad, launcher with a settings window; vendored OpenXR SDK 1.1.63
- Builds keep the build machine's folders out of the binaries (-ffile-prefix-map); machine
  settings (Python, headset serial, signing key) live in git-ignored tools/*.local files
- tools: build, packaging and test scripts for Windows and the headset
- README with installation, license (GPL-2.0-or-later), third-party notices and thanks

No game files are part of the repository; .gitignore only lets listed paths in.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 15:00:43 +02:00

42 lines
1.5 KiB
JavaScript

// Condenses an emulator log: one line per distinct message (numbers folded), in order of first
// appearance, with how often it occurred.
// node logsum.mjs <log> [--from <regex>] [--skip <regex>] [--only <regex>] [--max <n>]
import { readFileSync } from "node:fs";
const args = process.argv.slice(2);
const file = args.shift();
const opt = (name) => {
const i = args.indexOf(name);
return i >= 0 ? args[i + 1] : undefined;
};
const from = opt("--from") ? new RegExp(opt("--from")) : null;
const only = opt("--only") ? new RegExp(opt("--only")) : null;
const skip = new RegExp(
opt("--skip") ??
"^\\[Core\\.Linker\\] <(Info|Warning)>|^\\[Config\\]|BACHATA_|FRAME_SLOT|GET_RENDER_FRAME|Skipped \\d+ duplicate",
);
const max = Number(opt("--max") ?? 200);
const seen = new Map();
let started = !from;
for (const raw of readFileSync(file, "latin1").split(/\r?\n/)) {
if (!started) {
if (!from.test(raw)) continue;
started = true;
}
if (!raw || skip.test(raw) || (only && !only.test(raw))) continue;
const line = raw.replace(/^\[([^\]]+)\] <(\w+)> \(([^)]*)\) /, "[$1|$2|$3] ");
const key = line.replace(/0x[0-9a-fA-F]+/g, "0x#").replace(/\d+(\.\d+)?/g, "#");
const entry = seen.get(key);
if (entry) entry.count++;
else seen.set(key, { line, count: 1 });
}
let shown = 0;
for (const { line, count } of seen.values()) {
if (shown++ >= max) {
console.log(`... ${seen.size - max} more distinct lines`);
break;
}
console.log(`${String(count).padStart(6)}x ${line.slice(0, 250)}`);
}