Added // 🔶 UNVERIFIED comments to all API calls that need in-game testing:
- SpeedControlScreen (Pause/Unpause/SetSpeed signatures)
- CircuitManager (GetCircuits, property names)
- ConduitFlow (GetContents, property names)
- PrintingPod (IsReady, GetCurrentOffers, SelectOffer)
- Door (Lock/Unlock)
- Operational (SetFlag)
- Storage (DropAll)
- CameraController (Instance, position, zoom)
- ScreenCapture (CaptureScreenshot)
- SaveLoader (Save/Load/GetActiveSaveFilePath)
- Research (QueueResearch, CancelResearch, GetActiveResearchTechnologies)
- OverlayManager (currentOverlay)
- Grid.Germs
- Sensor components (threshold property)
- BuildingDefs collection
- Nullable serialization
Build script + annotate_apis.py included for verification workflow.
141 lines
6.5 KiB
Python
141 lines
6.5 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Annotate uncertain C# APIs in the Mod source with verification markers.
|
|
Reads ONIAgentBridge.cs, adds // 🔶 UNVERIFIED: comments on uncertain API calls,
|
|
and writes back with all annotations.
|
|
"""
|
|
|
|
import re
|
|
|
|
with open('mod/ONIAgentBridge.cs', 'r') as f:
|
|
content = f.read()
|
|
lines = content.split('\n')
|
|
|
|
annotations = {}
|
|
# Track by line number (1-indexed)
|
|
for i, line in enumerate(lines, 1):
|
|
s = line.strip()
|
|
|
|
# Skip comments and using directives
|
|
if s.startswith('//') or s.startswith('/*') or s.startswith('using ') or s.startswith('#') or s.startswith('*'):
|
|
continue
|
|
|
|
# === SpeedControlScreen ===
|
|
if 'SpeedControlScreen.Instance' in s and ('Pause(' in s or 'Unpause(' in s or 'SetSpeed(' in s):
|
|
annotations[i] = '🔶 UNVERIFIED: Pause/Unpause/SetSpeed method signatures on SpeedControlScreen'
|
|
|
|
# === Circuit Manager ===
|
|
if 'circuitManager' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: Game.Instance.circuitManager — may be electricalManager'
|
|
if 'mgr.GetCircuits()' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: circuitManager.GetCircuits() method may not exist'
|
|
if 'circuit.WattsUsed' in s or 'circuit.WattsGenerated' in s or 'circuit.MaxWatts' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: Circuit property names may differ'
|
|
if 'gen.WattageRating' in s or 'gen.CircuitID' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: Generator property names may differ'
|
|
|
|
# === Pipes ===
|
|
if 'Game.Instance?.liquidConduitFlow' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: Game.Instance.liquidConduitFlow — may be different conduit system'
|
|
if 'Game.Instance?.gasConduitFlow' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: Game.Instance.gasConduitFlow — may be different conduit system'
|
|
if 'flow.GetContents(' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: ConduitFlow.GetContents() method and return type'
|
|
if 'contents.element' in s or 'contents.mass' in s or 'contents.temperature' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: ConduitContents property names'
|
|
if 'Components.LiquidConduits' in s or 'Components.GasConduits' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: Components.LiquidConduits / GasConduits may not exist'
|
|
if 'conduit.GetCell()' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: Conduit.GetCell() method'
|
|
|
|
# === Printing Pod ===
|
|
if 'pod.IsReady()' in s or 'pod.CyclesUntilReady()' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: PrintingPod methods IsReady/CyclesUntilReady — may differ'
|
|
if 'pod.GetCurrentOffers()' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: PrintingPod.GetCurrentOffers() return type'
|
|
if 'offer.GetName()' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: CarePackage/PrintingPodOffer.GetName() method'
|
|
if 'pod.SelectOffer(' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: PrintingPod.SelectOffer(int) method'
|
|
if 'ImmuneSystemMonitor.Instance' in s and ('IsReadyToPrint' in s or 'GetCyclesUntilNextPrint' in s):
|
|
annotations[i] = '🔶 UNVERIFIED: ImmuneSystemMonitor methods may not exist'
|
|
|
|
# === Door ===
|
|
if 'door.Lock()' in s or 'door.Unlock()' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: Door.Lock()/Unlock() methods may not exist'
|
|
|
|
# === Operational/Toggle ===
|
|
if 'oper.SetFlag(Operational.ActiveFlag,' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: Operational.SetFlag signature — may need different approach'
|
|
|
|
# === Storage ===
|
|
if 'storage.DropAll(' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: Storage.DropAll() parameters may differ'
|
|
|
|
# === Camera ===
|
|
if 'CameraController.Instance' in s and 'SetPosition' not in s:
|
|
annotations[i] = '🔶 UNVERIFIED: CameraController.Instance may not be the correct singleton'
|
|
if 'Camera.main?.orthographicSize' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: Camera.main.orthographicSize setter may not work in ONI'
|
|
if 'cam.transform.position' in s and '= new Vector3' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: Setting camera transform.position directly may not work'
|
|
|
|
# === Screenshot ===
|
|
if 'ScreenCapture.CaptureScreenshot' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: ScreenCapture may not be available in ONI Unity version'
|
|
|
|
# === Save/Load ===
|
|
if 'SaveLoader.Save(' in s or 'SaveLoader.Load(' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: SaveLoader.Save/Load method signatures'
|
|
if 'SaveLoader.GetActiveSaveFilePath()' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: SaveLoader.GetActiveSaveFilePath() may not exist'
|
|
|
|
# === Research ===
|
|
if 'Research.Instance?.GetActiveResearchTechnologies' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: Research.GetActiveResearchTechnologies() method'
|
|
if 'Research.Instance?.QueueResearch(' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: Research.QueueResearch(Tech) method'
|
|
if 'Research.Instance?.CancelResearch(' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: Research.CancelResearch(Tech) method'
|
|
if 'tech.pointsForCompletion' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: Tech.pointsForCompletion property'
|
|
|
|
# === Overlay ===
|
|
if 'simOverlayManager' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: Game.Instance.simOverlayManager may not exist'
|
|
if 'currentOverlay' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: currentOverlay.ToString() may not yield expected overlay names'
|
|
|
|
# === Buildings ===
|
|
if 'Assets.BuildingDefs' in s and 'GetBuildingDef' not in s:
|
|
annotations[i] = '🔶 UNVERIFIED: Assets.BuildingDefs may not be a collection'
|
|
|
|
# === Grid ===
|
|
if 'Grid.Germs' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: Grid.Germs API — may not exist or have different type'
|
|
|
|
# === DTO class ===
|
|
if 'public int? x2' in s or 'public int? y2' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: Nullable parameters may not serialize correctly'
|
|
|
|
# === Buildings detail ===
|
|
if 'health?.GetHealth()' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: Health component GetHealth()/GetMaxHealth() methods'
|
|
|
|
# === Sensor ===
|
|
if 'AtmoSensor' in s and '?.threshold' in s:
|
|
annotations[i] = '🔶 UNVERIFIED: AtmoSensor/ThermoSensor/HydroSensor threshold property'
|
|
|
|
# Apply annotations — add comment after the line
|
|
annotated = 0
|
|
for lineno in sorted(annotations.keys(), reverse=True):
|
|
idx = lineno - 1
|
|
comment = ' // ' + annotations[lineno]
|
|
lines[idx] = lines[idx] + comment
|
|
annotated += 1
|
|
|
|
with open('mod/ONIAgentBridge.cs', 'w') as f:
|
|
f.write('\n'.join(lines))
|
|
|
|
print(f"Annotated {annotated} lines with verification markers")
|