Files
SVSimServer/SVSim.BattleEngine/Shim/UnityEngine/UnityRuntime.cs
gamer147 2b506574e7 feat(battle-engine-port): M2 step 1 — SingleBattleMgr constructs headless
First green of the M2 go/no-go probe: `new SingleBattleMgr(StandardBattleMgr-
ContentsCreator)` now builds the two-player pair fully headless against the shim,
no Unity runtime. Verdict: headless construction is feasible; every blocker was a
mechanical no-op shim fill or data seam, not a Unity/logic wall.

Shim fills (authored):
- GameMgr: lazy non-null DataMgr/PrefabMgr/InputMgr/SoundMgr/BattleControl.
- GameObject: lazy cached component model so GetComponent<T>/AddComponent<T> return
  non-null no-op instances for Component-derived T (F1: unguarded view touches).
- Resources.Load(string): cached non-null GameObject so the prefab->Instantiate->
  GetComponent chain (UnityEventAgent) yields a real object.
- ClassBattleCardViewBase: re-attach dropped IClassBattleCardView (no-op members);
  ClassBattleCardBase.Setup casts the created view to it.

Engine copy (DP1/DP3 mis-cut fix):
- CardIconControl.cs copied verbatim (manifested) + generated null-stub deleted.
  SplitAndCompleteIconStr is pure string logic on the resolution path that M1 had
  wrongly stubbed as "View" -> null deref in SkillCreator.CreateBuildInfo.

Test harness (SVSim.BattleEngine.Tests, authored fixture):
- HeadlessContentsCreator/HeadlessPhaseCreator: deterministic replica of the solo
  practice init (StandardBattleMgrContentsCreator + SingleBattlePhaseCreator) with
  no-op recovery/replay managers.
- HeadlessCardMaster: reflects the loader cards.json dump into CardMaster.
- HeadlessMasterData: minimal Data.Master (class-character list, empty collections)
  + Data.Load + player/enemy chara ids.
- ConstructionProbeTests.SingleBattleMgr_constructs_headless — GREEN.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-06 01:36:22 -04:00

107 lines
5.9 KiB
C#

// AUTHORED SHIM (not copied). Input / Random / Resources statics + the full KeyCode
// enum. Referenced almost entirely by non-battle UI/input files swept into the closure;
// headless we never pump input and never load resources, so all of this is inert.
using System;
namespace UnityEngine
{
public static partial class Input
{
public static Vector3 mousePosition => Vector3.zero;
public static Vector2 mouseScrollDelta => Vector2.zero;
public static int touchCount => 0;
public static Touch[] touches => new Touch[0];
public static Touch GetTouch(int i) => default;
public static bool anyKey => false;
public static bool anyKeyDown => false;
public static bool mousePresent => false;
public static bool GetMouseButton(int b) => false;
public static bool GetMouseButtonDown(int b) => false;
public static bool GetMouseButtonUp(int b) => false;
public static bool GetKey(KeyCode k) => false;
public static bool GetKey(string n) => false;
public static bool GetKeyDown(KeyCode k) => false;
public static bool GetKeyDown(string n) => false;
public static bool GetKeyUp(KeyCode k) => false;
public static bool GetButton(string n) => false;
public static bool GetButtonDown(string n) => false;
public static float GetAxis(string n) => 0f;
public static float GetAxisRaw(string n) => 0f;
public static string inputString => "";
public static bool multiTouchEnabled { get; set; }
}
public static class Random
{
public static float value => 0f;
public static int Range(int minInclusive, int maxExclusive) => minInclusive;
public static float Range(float min, float max) => min;
public static Vector2 insideUnitCircle => Vector2.zero;
public static Vector3 insideUnitSphere => Vector3.zero;
public static Vector3 onUnitSphere => Vector3.up;
public static Quaternion rotation => Quaternion.identity;
public static Quaternion rotationUniform => Quaternion.identity;
public static int seed { get; set; }
public static void InitState(int s) { }
public static Color ColorHSV() => Color.white;
}
public static partial class Resources
{
public static T Load<T>(string path) where T : Object => null;
public static T Load<T>(string path, Type t) where T : Object => null;
// Headless: the non-generic Load is used by the copied PrefabMgr to back a prefab
// dictionary that the resolution-path ctor then Instantiate()s + GetComponent()s
// (e.g. Prefab/Game/UnityEventAgent). Return a cached no-op GameObject per path so that
// chain yields a non-null object. Typed asset loads go through the generic Load<T> (null).
private static readonly System.Collections.Generic.Dictionary<string, GameObject> _loaded
= new System.Collections.Generic.Dictionary<string, GameObject>();
public static Object Load(string path)
{
if (string.IsNullOrEmpty(path)) return null;
if (!_loaded.TryGetValue(path, out var go)) { go = new GameObject(path); _loaded[path] = go; }
return go;
}
public static Object Load(string path, Type t) => Load(path);
public static T[] LoadAll<T>(string path) where T : Object => new T[0];
public static Object[] LoadAll(string path) => new Object[0];
public static ResourceRequest LoadAsync<T>(string path) where T : Object => null;
public static ResourceRequest LoadAsync(string path) => null;
public static void UnloadAsset(Object o) { }
public static AsyncOperation UnloadUnusedAssets() => null;
}
public class ResourceRequest : AsyncOperation { public Object asset => null; }
public enum KeyCode
{
None = 0,
Backspace = 8, Tab = 9, Clear = 12, Return = 13, Pause = 19, Escape = 27, Space = 32,
Exclaim = 33, DoubleQuote = 34, Hash = 35, Dollar = 36, Ampersand = 38, Quote = 39,
LeftParen = 40, RightParen = 41, Asterisk = 42, Plus = 43, Comma = 44, Minus = 45,
Period = 46, Slash = 47,
Alpha0 = 48, Alpha1, Alpha2, Alpha3, Alpha4, Alpha5, Alpha6, Alpha7, Alpha8, Alpha9,
Colon = 58, Semicolon = 59, Less = 60, Equals = 61, Greater = 62, Question = 63, At = 64,
LeftBracket = 91, Backslash = 92, RightBracket = 93, Caret = 94, Underscore = 95, BackQuote = 96,
A = 97, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
LeftCurlyBracket = 123, Pipe = 124, RightCurlyBracket = 125, Tilde = 126, Delete = 127,
Keypad0 = 256, Keypad1, Keypad2, Keypad3, Keypad4, Keypad5, Keypad6, Keypad7, Keypad8, Keypad9,
KeypadPeriod = 266, KeypadDivide = 267, KeypadMultiply = 268, KeypadMinus = 269,
KeypadPlus = 270, KeypadEnter = 271, KeypadEquals = 272,
UpArrow = 273, DownArrow = 274, RightArrow = 275, LeftArrow = 276,
Insert = 277, Home = 278, End = 279, PageUp = 280, PageDown = 281,
F1 = 282, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15,
Numlock = 300, CapsLock = 301, ScrollLock = 302,
RightShift = 303, LeftShift = 304, RightControl = 305, LeftControl = 306,
RightAlt = 307, LeftAlt = 308, RightCommand = 309, LeftCommand = 310,
LeftWindows = 311, RightWindows = 312, AltGr = 313,
Help = 315, Print = 316, SysReq = 317, Break = 318, Menu = 319,
Mouse0 = 323, Mouse1, Mouse2, Mouse3, Mouse4, Mouse5, Mouse6,
JoystickButton0 = 330, JoystickButton1, JoystickButton2, JoystickButton3,
JoystickButton4, JoystickButton5, JoystickButton6, JoystickButton7,
JoystickButton8, JoystickButton9, JoystickButton10, JoystickButton11,
JoystickButton12, JoystickButton13, JoystickButton14, JoystickButton15,
JoystickButton16, JoystickButton17, JoystickButton18, JoystickButton19
}
}