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>
107 lines
5.9 KiB
C#
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
|
|
}
|
|
}
|