unity-mcp/TestProjects/UnityMCPTests/Assets/Scripts/LongUnityScriptClaudeTest.cs

2038 lines
32 KiB
C#
Raw Normal View History

Claude‑friendly edit tools + framed transport + live Unity NL test framework (#243) * CI: gate desktop-parity on Anthropic key; pass anthropic_api_key like NL suite * Add quickprobe prompt and CI workflow (mcp-quickprobe.md, unity-mcp-quickprobe.yml) * strictier tool use to prevent subagent spawning and force mcp tools * update workflow filesto reduce likelihood of subagent spawning * improve permissions for claude agent, fix mcpbridge timeout/token issue * increase max turns to 10 * ci: align NL suite to new permissions schema; prevent subagent drift * ci: NL suite -> mini prompt for e2e; add full NL/T prompt; server: ctx optional + project_root fallback; workflows: set UNITY_PROJECT_ROOT for CI * ci: add checks:write; revert local project hardcodes (manifest, ProjectVersion.txt) * tools: text-edit routing fixes (anchor_insert via text, CRLF calc); prompts: mini NL/T clarifications * ci: use absolute UNITY_PROJECT_ROOT; prompts target TestProjects; server: accept relative UNITY_PROJECT_ROOT and bare spec URI * ci: ignore Unity test project's packages-lock.json; remove from repo to avoid absolute paths * CI: start persistent Unity Editor for MCP (guarded by license) + allow batch-mode bridge via UNITY_MCP_ALLOW_BATCH * CI: hide license and pass via env to docker; fix invalid ref format * CI: readiness probe uses handshake on Unity MCP port (deterministic) * CI: fix YAML; use TCP handshake readiness probe (FRAMING=1) * CI: prime Unity license via game-ci; mount ULF into container; extend readiness timeout * CI: use ULF write + mount for Unity licensing; remove serial/email/pass from container * CI: entitlement activation (UNITY_SERIAL=''); verify host ULF cache; keep mount * CI: write ULF from secret and verify; drop entitlement activation step * CI: detect any licensing path; GameCI prime; status dir env; log+probe readiness; fix YAML * CI: add GameCI license prime; conditional ULF write; one-shot license validation; explicit status dir + license env * CI: fix YAML (inline python), add Anthropic key detect via GITHUB_ENV; ready to run happy path * CI: mount Unity token/ulf/cache dirs into container to share host license; create dirs before start * CI: fix YAML indentation; write ULF on host; activate in container with shared mounts; mount .config and .cache too * CI: gate Claude via outputs; mount all Unity license dirs; fix inline probe python; stabilize licensing flow * CI: normalize detect to step outputs; ensure license dirs mounted and validated; fix indentation * Bridge: honor UNITY_MCP_STATUS_DIR for heartbeat/status file (CI-friendly) * CI: guard project path for activation/start; align tool allowlist; run MCP server with python; tighten secret scoping * CI: finalize Unity licensing mounts + status dir; mode-detect (ULF/EBL); readiness logs+probe; Claude gating via outputs * CI: fix YAML probe (inline python -c) and finalize happy-path Unity licensing and MCP/Claude wiring * CI: inline python probe; unify Unity image and cache mounts; ready to test * CI: fix docker run IMAGE placement; ignore cache find perms; keep same editor image * CI: pass -manualLicenseFile to persistent Editor; keep mounts and single image * CI: mount full GameCI cache to /root in persistent Unity; set HOME=/root; add optional license check * CI: make -manualLicenseFile conditional; keep full /root mount and license check * CI: set HOME=/github/home; mount GameCI cache there; adjust manualLicenseFile path; expand license check * CI: EBL sign-in for persistent Unity (email/password/serial); revert HOME=/root and full /root mount; keep conditional manualLicenseFile and improved readiness * CI: run full NL/T suite prompt (nl-unity-suite-full.md) instead of mini * NL/T: require unified diffs + explicit verdicts in JUnit; CI: remove short sanity step, publish JUnit, upload artifacts * NL/T prompt: require CDATA wrapping for JUnit XML fields; guidance for splitting embedded ]]>; keep VERDICT in CDATA only * CI: remove in-container license check step; keep readiness and full suite * NL/T prompt: add version header, stricter JUnit schema, hashing/normalization, anchors, statuses, atomic semantics, tool logging * CI: increase Claude NL/T suite timeout to 30 minutes * CI: pre-create reports dir and result files to avoid tool approval prompts * CI: skip wait if container not running; skip Editor start if project missing; broaden MCP deps detection; expand allowed tools * fixies to harden ManageScript * CI: sanitize NL/T markdown report to avoid NUL/encoding issues * revert breaking yyaml changes * CI: prime license, robust Unity start/wait, sanitize markdown via heredoc * Resolve merge: accept upstream renames/installer (fix/installer-cleanup-v2) and keep local framing/script-editing - Restored upstream server.py, EditorWindow, uv.lock\n- Preserved ManageScript editing/validation; switched to atomic write + debounced refresh\n- Updated tools/__init__.py to keep script_edits/resources and adopt new logger name\n- All Python tests via uv: 7 passed, 6 skipped, 9 xpassed; Unity compile OK * Fix Claude Desktop config path and atomic write issues - Fix macOS path for Claude Desktop config: use ~/Library/Application Support/Claude/ instead of ~/.config/Claude/ - Improve atomic write pattern with backup/restore safety - Replace File.Replace() with File.Move() for better macOS compatibility - Add proper error handling and cleanup for file operations - Resolves issue where installer couldn't find Claude Desktop config on macOS * Editor: use macConfigPath on macOS for MCP client config writes (Claude Desktop, etc.). Fallback to linuxConfigPath only if mac path missing. * Models: add macConfigPath to McpClient for macOS config path selection (fixes CS1061 in editor window). * Editor: on macOS, prefer macConfigPath in ManualConfigEditorWindow (fallback to linux path); Linux/Windows unchanged. * Fix McpClient: align with upstream/main, prep for framing split * NL suite: shard workflow; tighten bridge readiness; add MCP preflight; use env-based shard vars * NL suite: fix shard step indentation; move shard vars to env; remove invalid inputs * MCP clients: split VSCode Copilot config paths into macConfigPath and linuxConfigPath * Unity bridge: clean stale status; bind host; robust wait probe with IPv4/IPv6 + diagnostics * CI: use MCPForUnity.Editor.MCPForUnityBridge.StartAutoConnect as executeMethod * Action wiring: inline mcpServers in settings for all shards; remove redundant .claude/mcp.json step * CI: embed mcpServers in settings for all shards; fix startup sanity step; lint clean * CI: pin claude-code-base-action to e6f32c8; use claude_args --mcp-config; switch to allowed_tools; ensure MCP config per step * CI: unpin claude-code-base-action to @beta (commit ref not found) * CI: align with claude-code-base-action @beta; pass MCP via claude_args and allowedTools * Editor: Fix apply_text_edits heuristic when edits shift positions; recompute method span on candidate text with fallback delta adjustment * CI: unify MCP wiring across workflows; write .claude/mcp.json; switch to claude_args with --mcp-config/--allowedTools; remove unsupported inputs * CI: collapse NL suite shards into a single run to avoid repeated test execution * CI: minimize allowedTools for NL suite to essential Unity MCP + Bash("git:*") + Write * CI: mkdir -p reports before run; remove unsupported --timeout-minutes from claude_args * CI: broaden allowedTools to include find_in_file and mcp__unity__* * CI: enable use_node_cache and switch NL suite model to claude-3-7-haiku-20250219 * CI: disable use_node_cache to avoid setup-node lockfile error * CI: set NL suite model to claude-3-haiku-20240307 * CI: cap Haiku output with --max-tokens 2048 for NL suite * CI: switch to claude-3-7-sonnet-latest and remove unsupported --max-tokens * CI: update allowedTools to Bash(*) and explicit Unity MCP tool list * CI: update NL suite workflow (latest tweaks) * Tests: tighten NL suite prompt for logging, hash discipline, stale retry, evidence windows, diff cap, and VERDICT line * Add disallowed tools to NL suite workflow * docs: clarify stale write retry * Add fallback JUnit report and adjust publisher * Indent fallback JUnit XML in workflow * fix: correct fallback JUnit report generation * Update mcp-quickprobe.md Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * Update mcp-quickprobe.md Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * Update Response.cs Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * Update MCPForUnityBridge.cs Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * fix: correct McpTypes reference * Add directory existence checks for symlink and XDG paths * fix: only set installation flag after successful server install * Update resource_tools.py Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * fix: respect mac config paths * Use File.Replace for atomic config write * Remove unused imports in manage_script * bump server version * Tests: update NL suite prompt and workflows; remove deprecated smoke/desktop-parity; quickprobe tidy * Editor: atomic config write via File.Replace fallback; remove redundant backups and racey exists checks * CI: harden NL suite - idempotent docker, gate on unity_ok, safer port probe, least-priv perms * Editor: make atomic config write restoration safe (flag writeDone; copy-overwrite restore; cleanup in finally) * CI: fix fallback JUnit heredoc by using printf lines (no EOF delimiter issues) * CI: switch NL suite to mini prompt; mini prompt honors / and NL discipline * CI: replace claude_args with allowed_tools/model/mcp_config per action schema * CI: expand UNITY_PROJECT_ROOT via in MCP config heredoc * EditorWindow: add cross-platform fallback for File.Replace; macOS-insensitive PathsEqual; safer uv resolve; honor macConfigPath * CI: strengthen JUnit publishing for NL mini suite (normalize, debug list, publish both, fail_on_parse_error) * CI: set job-wide JUNIT_OUT/MD_OUT; normalization uses env; publish references env and ungroup reports * CI: publish a single normalized JUnit (reports/junit-for-actions.xml); fallback writes same; avoid checkName/reportPaths mismatch * CI: align mini prompt report filenames; redact Unity log tail in diagnostics * chore: sync workflow and mini prompt; redacted logs; JUnit normalization/publish tweaks * CI: redact sensitive tokens in Stop Unity; docs: CI usage + edit tools * prompts: update nl-unity-suite-full (mini-style setup + reporting discipline); remove obsolete prompts * CI: harden NL workflows (timeout_minutes, robust normalization); prompts: unify JUnit suite name and reporting discipline * prompts: add guarded write pattern (LF hash, stale_file retry) to full suite * prompts: enforce continue-on-failure, driver flow, and status handling in full suite * Make test list more explicit in prompt. Get rid of old test prompts for hygeine. * prompts: add stale fast-retry (server hash) + in-memory buf guidance * CI: standardize JUNIT_OUT to reports/junit-nl-suite.xml; fix artifact upload indentation; prompt copy cleanups * prompts: reporting discipline — append-only fragments, batch writes, no model round-trip * prompts: stale fast-retry preference, buffer/sha carry, snapshot revert, essential logging * workflows(nl-suite): precreate report skeletons, assemble junit, synthesize markdown; restrict allowed_tools to append-only Bash + MCP tools * thsis too * Update README-DEV.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update .github/workflows/claude-nl-suite-mini.yml Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update .github/workflows/claude-nl-suite.yml Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * workflows(nl-mini): fix YAML indentation/trailing spaces under with: and cleanup heredoc spacing * workflows(nl-suite): fix indentation on docker logs redaction line (YAML lint) * Add write to allowlist * nl-suite: harden reporting discipline (fragment-only writes, forbid alt paths); workflow: clean stray junit-*updated*.xml * nl-suite: enforce end-of-suite single Write (no bash redirection); workflow: restrict allowed_tools to Write+MCP only * prompts(nl-full): end-of-suite results must be valid XML with single <cases> root and only <testcase> children; no raw text outside CDATA * workflows(nl-suite): make Claude step non-fatal; tolerant normalizer extracts <testcase> via regex on bad fragments * nl-suite: fix stale classname to UnityMCP.NL-T in mini fallback; prompt: require re-read after every revert; correct PLAN/PROGRESS to 15 * nl-suite: fix fallback JUnit classname to UnityMCP.NL-T; prompt: forbid create_script and env/mkdir checks, enforce single baseline-byte revert flow and post-revert re-read; add corruption-handling guidance * prompts(nl-full): after each write re-read raw bytes to refresh pre_sha; prefer script_apply_edits for anchors; avoid header/using changes * prompts(nl-full): canonicalize outputs to /; allow small fragment appends via Write or Bash(printf/echo); forbid wrappers and full-file round-trips * prompts(nl-full): finalize markdown formatting for guarded write, execution order, specs, status * workflows(nl-suite, mini): header/lint fixes and constrained Bash append path; align allowed_tools * prompts(nl-full): format Fast Restore, Guarded Write, Execution, Specs, Status as proper markdown lists and code fences * workflows(nl-suite): keep header tidy and append-path alignment with prompt * minor fix * workflows(nl-suite): fix indentation and dispatch; align allowed_tools and revert helper * prompts(nl-full): switch to read_resource for buf/sha; re-read only when needed; convert 'Print this once' to heading; note snapshot helper creates parent dirs * workflows(nl-suite): normalize step removes bootstrap when real testcases present; recompute tests/failures * workflows(nl-suite): enrich Markdown summary by extracting per-test <system-out> blocks (truncated) * clarify prompt resilience instructions * ci(nl-suite): revert prompt and workflow to known-good e0f8a72 for green run; remove extra MD details * ci(nl-suite): minimal fixes — no-mkdir guard in prompt; drop bootstrap and recompute JUnit counts * ci(nl-suite): richer JUnit→Markdown report (per-test system-out) * Small guard to incorret asset read call. * ci(nl-suite): refine MD builder — unescape XML entities, safe code fences, PASS/FAIL badges * Update UnityMcpBridge/UnityMcpServer~/src/tools/resource_tools.py Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update UnityMcpBridge/UnityMcpServer~/src/unity_connection.py Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update UnityMcpBridge/UnityMcpServer~/src/tools/manage_script_edits.py Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update .github/scripts/mark_skipped.py Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update .github/scripts/mark_skipped.py Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update .github/scripts/mark_skipped.py Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * server(manage_script): robust URI handling — percent-decode file://, normalize, strip host/leading slashes, return Assets-relative if present * Update .claude/prompts/nl-unity-suite-full.md Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * tests(framing): reduce handshake poll window, nonblocking peek to avoid disconnect race; still enforce pre-handshake data drop * tests(manage_script): add _split_uri tests for unity://path, file:// URLs (decoded/Assets-relative), and plain paths * server+tests: fix handshake syntax error; robust file:// URI normalization in manage_script; add _split_uri tests; adjust stdout scan to ignore venv/site-packages * bridge(framing): accept zero-length frames (treat as empty keepalive) * tests(logging): use errors='replace' on decode fallback to avoid silent drops * resources(list): restrict to Assets/, resolve symlinks, enforce .cs; add traversal/outside-path tests * Update .claude/prompts/nl-unity-suite-full.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update UnityMcpBridge/UnityMcpServer~/src/unity_connection.py Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * misc: framing keepalive (zero-length), regex preview consistency, resource.list hardening, URI parsing, legacy update routing, test cleanups * docs(tools): richer MCP tool descriptions; tests accept decorator kwargs; resource URI parsing hardened * Update .claude/prompts/nl-unity-suite-full.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update UnityMcpBridge/UnityMcpServer~/src/tools/resource_tools.py Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update UnityMcpBridge/UnityMcpServer~/src/unity_connection.py Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * net+docs: hard-reject zero-length frames; TCP_NODELAY on connect; Assets detection case-insensitive; NL prompt statuses aligned * prompt(nl-suite): constrain Write destinations under reports/, forbid traversal * prompt+net: harden Write path rules; use monotonic deadline and plain-text advisory for non-framed peers * unity_connection: restore recv timeout via try/finally; make global connection getter thread-safe with module lock and double-checked init * NL/T prompt: pin structured edit ops for T-D/T-E; add schema-error guarded write behavior; keep existing path/URI and revert rules * unity_connection: add FRAMED_MAX; use ValueError for framed length violations; lower framed receive log to debug; serialize connect() with per-instance lock * ManageScript: use UTF8Encoding(without BOM) for atomic writes in ApplyTextEdits/EditScript to align with Create/Update and avoid BOM-related diffs/hash mismatches * NL/T prompt: make helper deletion regex multiline-safe ((?ms) so ^ anchors line starts) * ManageScript: emit structured overlap status {status:"overlap"} for overlapping edit ranges in apply_text_edits and edit paths * NL/T prompt: clarify fallback vs failure — fallback only for unsupported/missing_field; treat bad_request as failure; note unsupported after fallback as failure * NL/T prompt: pin deterministic overlap probe (apply_text_edits two ranges from same snapshot); gate too_large behind RUN_TOO_LARGE env hint * TB update * NL/T prompt: harden Output Rules — constrain Bash(printf|echo) to stdout-only; forbid redirection/here-docs/tee; only scripts/nlt-revert.sh may mutate FS * Prompt: enumerate allowed script_apply_edits ops; add manage_editor/read_console guidance; fix T‑F atomic batch to single script_apply_edits. ManageScript: regex timeout for diagnostics; symlink ancestor guard; complete allowed-modes list. * Fixes * ManageScript: add rich overlap diagnostics (conflicts + hint) for both text range and structured batch paths * ManageScript: return structured {status:"validation_failed"} diagnostics in create/update/edits and validate before commit * ManageScript: echo canonical uri in responses (create/read/update/apply_text_edits/structured edits) to reinforce resource identity * improve clarity of capabilities message * Framing: allow zero-length frames on both ends (C# bridge, Python server). Prompt: harden T-F to single text-range apply_text_edits batch (descending order, one snapshot). URI: normalize file:// outside Assets by stripping leading slash. * ManageScript: include new sha256 in success payload for apply_text_edits; harden TryResolveUnderAssets by rejecting symlinked ancestors up to Assets/. * remove claudetest dir * manage_script_edits: normalize method-anchored anchor_insert to insert_method (map text->replacement); improves CI compatibility for T‑A/T‑E without changing Editor behavior. * tighten testing protocol around mkdir * manage_script: validate create_script inputs (Assets/.cs/name/no traversal); add Assets/ guard to delete_script; validate level+Assets in validate_script; make legacy manage_script optional params; harden legacy update routing with base64 reuse and payload size preflight. * Tighten prompt for testing * Update .claude/prompts/nl-unity-suite-full.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update .claude/prompts/nl-unity-suite-full.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update UnityMcpBridge/Editor/Tools/ManageScript.cs Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * manage_script_edits: honor ignore_case on anchor_insert and regex_replace in both direct and text-conversion paths (MULTILINE|IGNORECASE). * remove extra file * workflow: use python3 for inline scripts and port detection on ubuntu-latest. * Tighten prompt + manage_script * Update UnityMcpBridge/UnityMcpServer~/src/tools/manage_script_edits.py Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update UnityMcpBridge/UnityMcpServer~/src/tools/manage_script_edits.py Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update .claude/prompts/nl-unity-suite-full.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update UnityMcpBridge/Editor/Tools/ManageScript.cs Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update .claude/prompts/nl-unity-suite-full.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * manage_script: improve file:// UNC handling; preserve POSIX absolute semantics internally; keep test-expected slash stripping for non-Assets paths. * ManageScript.cs: add TimeSpan timeouts to all Regex uses (IsMatch/Match/new Regex) and keep CultureInvariant/Multiline options; reduces risk of catastrophic backtracking stalls. * workflow: ensure reports/ exists in markdown build step to avoid FileNotFoundError when writing MD_OUT. * fix brace * manage_script_edits: expand backrefs for regex_replace in preview->text conversion and translate to \g<n> in local apply; keeps previews and actual edits consistent. * anchor_insert: default to position=after, normalize surrounding newlines in Python conversion paths; C# path ensures trailing newline and skips duplicate insertion within class. * feat(mcp): add get_sha tool; apply_text_edits normalization+overlap preflight+strict; no-op evidence in C#; update NL suite prompt; add unit tests * feat(frames): accept zero-length heartbeat frames in client; add heartbeat test * feat(edits): guard destructive regex_replace with structural preflight; add robust tests; prompt uses delete_method for temp helper * feat(frames): bound heartbeat loop with timeout/threshold; align zero-length response with C#; update test * SDK hardening: atomic multi-span text edits; stop forcing sequential for structured ops; forward options on apply_text_edits; add validate=relaxed support and scoped checks; update NL/T prompt; add tests for options forwarding, relaxed mode, and atomic batches * Router: default applyMode=atomic for multi-span apply_text_edits; add tests * CI prompt: pass options.validate=relaxed for T-B/C; options.applyMode=atomic for T-F; emphasize always writing testcase and restoring on errors * Validation & DX: add validate=syntax (scoped), standardize evidence windows; early regex compile with hints; debug_preview for apply_text_edits * Update UnityMcpBridge/Editor/Windows/MCPForUnityEditorWindow.cs Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * NL/T suite-driven edits: LongUnityScriptClaudeTest, bridge helpers, server_version; prepare framing tests * Fix duplicate macConfigPath field in McpClient to resolve CS0102 * Editor threading: run EnsureServerInstalled on main thread; marshal EditorPrefs/DeleteKey + logging via delayCall * Docs(apply_text_edits): strengthen guidance on 1-based positions, verify-before-edit, and recommend anchors/structured edits * Docs(script_apply_edits): add safety guidance (anchors, method ops, validators) and recommended practices * Framed VerifyBridgePing in editor window; docs hardening for apply_text_edits and script_apply_edits --------- Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-08-31 00:55:38 +08:00
using UnityEngine;
using System.Collections.Generic;
// Standalone, dependency-free long script for Claude NL/T editing tests.
// Intentionally verbose to simulate a complex gameplay script without external packages.
public class LongUnityScriptClaudeTest : MonoBehaviour
{
[Header("Core References")]
public Transform reachOrigin;
public Animator animator;
[Header("State")]
private Transform currentTarget;
private Transform previousTarget;
private float lastTargetFoundTime;
[Header("Held Objects")]
private readonly List<Transform> heldObjects = new List<Transform>();
// Accumulators used by padding methods to avoid complete no-ops
private int padAccumulator = 0;
private Vector3 padVector = Vector3.zero;
[Header("Tuning")]
public float maxReachDistance = 2f;
public float maxHorizontalDistance = 1.0f;
public float maxVerticalDistance = 1.0f;
// Public accessors used by NL tests
public bool HasTarget() { return currentTarget != null; }
public Transform GetCurrentTarget() => currentTarget;
// Simple selection logic (self-contained)
private Transform FindBestTarget()
{
if (reachOrigin == null) return null;
// Dummy: prefer previously seen target within distance
if (currentTarget != null && Vector3.Distance(reachOrigin.position, currentTarget.position) <= maxReachDistance)
return currentTarget;
return null;
}
private void HandleTargetSwitch(Transform next)
{
if (next == currentTarget) return;
previousTarget = currentTarget;
currentTarget = next;
lastTargetFoundTime = Time.time;
}
private void LateUpdate()
{
// Keep file long with harmless per-frame work
if (currentTarget == null && previousTarget != null)
{
// decay previous reference over time
if (Time.time - lastTargetFoundTime > 0.5f) previousTarget = null;
}
}
// NL tests sometimes add comments above Update() as an anchor
private void Update()
{
if (reachOrigin == null) return;
var best = FindBestTarget();
if (best != null) HandleTargetSwitch(best);
}
// Dummy reach/hold API (no external deps)
public void OnObjectHeld(Transform t)
{
if (t == null) return;
if (!heldObjects.Contains(t)) heldObjects.Add(t);
animator?.SetInteger("objectsHeld", heldObjects.Count);
}
public void OnObjectPlaced()
{
if (heldObjects.Count == 0) return;
heldObjects.RemoveAt(heldObjects.Count - 1);
animator?.SetInteger("objectsHeld", heldObjects.Count);
}
// More padding: repetitive blocks with slight variations
#region Padding Blocks
private Vector3 AccumulateBlend(Transform t)
{
if (t == null || reachOrigin == null) return Vector3.zero;
Vector3 local = reachOrigin.InverseTransformPoint(t.position);
float bx = Mathf.Clamp(local.x / Mathf.Max(0.001f, maxHorizontalDistance), -1f, 1f);
float by = Mathf.Clamp(local.y / Mathf.Max(0.001f, maxVerticalDistance), -1f, 1f);
return new Vector3(bx, by, 0f);
}
private void ApplyBlend(Vector3 blend)
{
if (animator == null) return;
animator.SetFloat("reachX", blend.x);
animator.SetFloat("reachY", blend.y);
}
public void TickBlendOnce()
{
var b = AccumulateBlend(currentTarget);
ApplyBlend(b);
}
// A long series of small no-op methods to bulk up the file without adding deps
private void Step001() { }
private void Step002() { }
private void Step003() { }
private void Step004() { }
private void Step005() { }
private void Step006() { }
private void Step007() { }
private void Step008() { }
private void Step009() { }
private void Step010() { }
private void Step011() { }
private void Step012() { }
private void Step013() { }
private void Step014() { }
private void Step015() { }
private void Step016() { }
private void Step017() { }
private void Step018() { }
private void Step019() { }
private void Step020() { }
private void Step021() { }
private void Step022() { }
private void Step023() { }
private void Step024() { }
private void Step025() { }
private void Step026() { }
private void Step027() { }
private void Step028() { }
private void Step029() { }
private void Step030() { }
private void Step031() { }
private void Step032() { }
private void Step033() { }
private void Step034() { }
private void Step035() { }
private void Step036() { }
private void Step037() { }
private void Step038() { }
private void Step039() { }
private void Step040() { }
private void Step041() { }
private void Step042() { }
private void Step043() { }
private void Step044() { }
private void Step045() { }
private void Step046() { }
private void Step047() { }
private void Step048() { }
private void Step049() { }
private void Step050() { }
#endregion
#region MassivePadding
private void Pad0051()
{
}
private void Pad0052()
{
}
private void Pad0053()
{
}
private void Pad0054()
{
}
private void Pad0055()
{
}
private void Pad0056()
{
}
private void Pad0057()
{
}
private void Pad0058()
{
}
private void Pad0059()
{
}
private void Pad0060()
{
}
private void Pad0061()
{
}
private void Pad0062()
{
}
private void Pad0063()
{
}
private void Pad0064()
{
}
private void Pad0065()
{
}
private void Pad0066()
{
}
private void Pad0067()
{
}
private void Pad0068()
{
}
private void Pad0069()
{
}
private void Pad0070()
{
}
private void Pad0071()
{
}
private void Pad0072()
{
}
private void Pad0073()
{
}
private void Pad0074()
{
}
private void Pad0075()
{
}
private void Pad0076()
{
}
private void Pad0077()
{
}
private void Pad0078()
{
}
private void Pad0079()
{
}
private void Pad0080()
{
}
private void Pad0081()
{
}
private void Pad0082()
{
}
private void Pad0083()
{
}
private void Pad0084()
{
}
private void Pad0085()
{
}
private void Pad0086()
{
}
private void Pad0087()
{
}
private void Pad0088()
{
}
private void Pad0089()
{
}
private void Pad0090()
{
}
private void Pad0091()
{
}
private void Pad0092()
{
}
private void Pad0093()
{
}
private void Pad0094()
{
}
private void Pad0095()
{
}
private void Pad0096()
{
}
private void Pad0097()
{
}
private void Pad0098()
{
}
private void Pad0099()
{
}
private void Pad0100()
{
// lightweight math to give this padding method some substance
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 100) & 0x7fffffff;
float t = (padAccumulator % 1000) * 0.001f;
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
padVector.z = 0f;
}
private void Pad0101()
{
}
private void Pad0102()
{
}
private void Pad0103()
{
}
private void Pad0104()
{
}
private void Pad0105()
{
}
private void Pad0106()
{
}
private void Pad0107()
{
}
private void Pad0108()
{
}
private void Pad0109()
{
}
private void Pad0110()
{
}
private void Pad0111()
{
}
private void Pad0112()
{
}
private void Pad0113()
{
}
private void Pad0114()
{
}
private void Pad0115()
{
}
private void Pad0116()
{
}
private void Pad0117()
{
}
private void Pad0118()
{
}
private void Pad0119()
{
}
private void Pad0120()
{
}
private void Pad0121()
{
}
private void Pad0122()
{
}
private void Pad0123()
{
}
private void Pad0124()
{
}
private void Pad0125()
{
}
private void Pad0126()
{
}
private void Pad0127()
{
}
private void Pad0128()
{
}
private void Pad0129()
{
}
private void Pad0130()
{
}
private void Pad0131()
{
}
private void Pad0132()
{
}
private void Pad0133()
{
}
private void Pad0134()
{
}
private void Pad0135()
{
}
private void Pad0136()
{
}
private void Pad0137()
{
}
private void Pad0138()
{
}
private void Pad0139()
{
}
private void Pad0140()
{
}
private void Pad0141()
{
}
private void Pad0142()
{
}
private void Pad0143()
{
}
private void Pad0144()
{
}
private void Pad0145()
{
}
private void Pad0146()
{
}
private void Pad0147()
{
}
private void Pad0148()
{
}
private void Pad0149()
{
}
private void Pad0150()
{
// lightweight math to give this padding method some substance
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 150) & 0x7fffffff;
float t = (padAccumulator % 1000) * 0.001f;
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
padVector.z = 0f;
}
private void Pad0151()
{
}
private void Pad0152()
{
}
private void Pad0153()
{
}
private void Pad0154()
{
}
private void Pad0155()
{
}
private void Pad0156()
{
}
private void Pad0157()
{
}
private void Pad0158()
{
}
private void Pad0159()
{
}
private void Pad0160()
{
}
private void Pad0161()
{
}
private void Pad0162()
{
}
private void Pad0163()
{
}
private void Pad0164()
{
}
private void Pad0165()
{
}
private void Pad0166()
{
}
private void Pad0167()
{
}
private void Pad0168()
{
}
private void Pad0169()
{
}
private void Pad0170()
{
}
private void Pad0171()
{
}
private void Pad0172()
{
}
private void Pad0173()
{
}
private void Pad0174()
{
}
private void Pad0175()
{
}
private void Pad0176()
{
}
private void Pad0177()
{
}
private void Pad0178()
{
}
private void Pad0179()
{
}
private void Pad0180()
{
}
private void Pad0181()
{
}
private void Pad0182()
{
}
private void Pad0183()
{
}
private void Pad0184()
{
}
private void Pad0185()
{
}
private void Pad0186()
{
}
private void Pad0187()
{
}
private void Pad0188()
{
}
private void Pad0189()
{
}
private void Pad0190()
{
}
private void Pad0191()
{
}
private void Pad0192()
{
}
private void Pad0193()
{
}
private void Pad0194()
{
}
private void Pad0195()
{
}
private void Pad0196()
{
}
private void Pad0197()
{
}
private void Pad0198()
{
}
private void Pad0199()
{
}
private void Pad0200()
{
// lightweight math to give this padding method some substance
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 200) & 0x7fffffff;
float t = (padAccumulator % 1000) * 0.001f;
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
padVector.z = 0f;
}
private void Pad0201()
{
}
private void Pad0202()
{
}
private void Pad0203()
{
}
private void Pad0204()
{
}
private void Pad0205()
{
}
private void Pad0206()
{
}
private void Pad0207()
{
}
private void Pad0208()
{
}
private void Pad0209()
{
}
private void Pad0210()
{
}
private void Pad0211()
{
}
private void Pad0212()
{
}
private void Pad0213()
{
}
private void Pad0214()
{
}
private void Pad0215()
{
}
private void Pad0216()
{
}
private void Pad0217()
{
}
private void Pad0218()
{
}
private void Pad0219()
{
}
private void Pad0220()
{
}
private void Pad0221()
{
}
private void Pad0222()
{
}
private void Pad0223()
{
}
private void Pad0224()
{
}
private void Pad0225()
{
}
private void Pad0226()
{
}
private void Pad0227()
{
}
private void Pad0228()
{
}
private void Pad0229()
{
}
private void Pad0230()
{
}
private void Pad0231()
{
}
private void Pad0232()
{
}
private void Pad0233()
{
}
private void Pad0234()
{
}
private void Pad0235()
{
}
private void Pad0236()
{
}
private void Pad0237()
{
}
private void Pad0238()
{
}
private void Pad0239()
{
}
private void Pad0240()
{
}
private void Pad0241()
{
}
private void Pad0242()
{
}
private void Pad0243()
{
}
private void Pad0244()
{
}
private void Pad0245()
{
}
private void Pad0246()
{
}
private void Pad0247()
{
}
private void Pad0248()
{
}
private void Pad0249()
{
}
private void Pad0250()
{
// lightweight math to give this padding method some substance
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 250) & 0x7fffffff;
float t = (padAccumulator % 1000) * 0.001f;
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
padVector.z = 0f;
}
private void Pad0251()
{
}
private void Pad0252()
{
}
private void Pad0253()
{
}
private void Pad0254()
{
}
private void Pad0255()
{
}
private void Pad0256()
{
}
private void Pad0257()
{
}
private void Pad0258()
{
}
private void Pad0259()
{
}
private void Pad0260()
{
}
private void Pad0261()
{
}
private void Pad0262()
{
}
private void Pad0263()
{
}
private void Pad0264()
{
}
private void Pad0265()
{
}
private void Pad0266()
{
}
private void Pad0267()
{
}
private void Pad0268()
{
}
private void Pad0269()
{
}
private void Pad0270()
{
}
private void Pad0271()
{
}
private void Pad0272()
{
}
private void Pad0273()
{
}
private void Pad0274()
{
}
private void Pad0275()
{
}
private void Pad0276()
{
}
private void Pad0277()
{
}
private void Pad0278()
{
}
private void Pad0279()
{
}
private void Pad0280()
{
}
private void Pad0281()
{
}
private void Pad0282()
{
}
private void Pad0283()
{
}
private void Pad0284()
{
}
private void Pad0285()
{
}
private void Pad0286()
{
}
private void Pad0287()
{
}
private void Pad0288()
{
}
private void Pad0289()
{
}
private void Pad0290()
{
}
private void Pad0291()
{
}
private void Pad0292()
{
}
private void Pad0293()
{
}
private void Pad0294()
{
}
private void Pad0295()
{
}
private void Pad0296()
{
}
private void Pad0297()
{
}
private void Pad0298()
{
}
private void Pad0299()
{
}
private void Pad0300()
{
// lightweight math to give this padding method some substance
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 300) & 0x7fffffff;
float t = (padAccumulator % 1000) * 0.001f;
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
padVector.z = 0f;
}
private void Pad0301()
{
}
private void Pad0302()
{
}
private void Pad0303()
{
}
private void Pad0304()
{
}
private void Pad0305()
{
}
private void Pad0306()
{
}
private void Pad0307()
{
}
private void Pad0308()
{
}
private void Pad0309()
{
}
private void Pad0310()
{
}
private void Pad0311()
{
}
private void Pad0312()
{
}
private void Pad0313()
{
}
private void Pad0314()
{
}
private void Pad0315()
{
}
private void Pad0316()
{
}
private void Pad0317()
{
}
private void Pad0318()
{
}
private void Pad0319()
{
}
private void Pad0320()
{
}
private void Pad0321()
{
}
private void Pad0322()
{
}
private void Pad0323()
{
}
private void Pad0324()
{
}
private void Pad0325()
{
}
private void Pad0326()
{
}
private void Pad0327()
{
}
private void Pad0328()
{
}
private void Pad0329()
{
}
private void Pad0330()
{
}
private void Pad0331()
{
}
private void Pad0332()
{
}
private void Pad0333()
{
}
private void Pad0334()
{
}
private void Pad0335()
{
}
private void Pad0336()
{
}
private void Pad0337()
{
}
private void Pad0338()
{
}
private void Pad0339()
{
}
private void Pad0340()
{
}
private void Pad0341()
{
}
private void Pad0342()
{
}
private void Pad0343()
{
}
private void Pad0344()
{
}
private void Pad0345()
{
}
private void Pad0346()
{
}
private void Pad0347()
{
}
private void Pad0348()
{
}
private void Pad0349()
{
}
private void Pad0350()
{
// lightweight math to give this padding method some substance
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 350) & 0x7fffffff;
float t = (padAccumulator % 1000) * 0.001f;
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
padVector.z = 0f;
}
private void Pad0351()
{
}
private void Pad0352()
{
}
private void Pad0353()
{
}
private void Pad0354()
{
}
private void Pad0355()
{
}
private void Pad0356()
{
}
private void Pad0357()
{
}
private void Pad0358()
{
}
private void Pad0359()
{
}
private void Pad0360()
{
}
private void Pad0361()
{
}
private void Pad0362()
{
}
private void Pad0363()
{
}
private void Pad0364()
{
}
private void Pad0365()
{
}
private void Pad0366()
{
}
private void Pad0367()
{
}
private void Pad0368()
{
}
private void Pad0369()
{
}
private void Pad0370()
{
}
private void Pad0371()
{
}
private void Pad0372()
{
}
private void Pad0373()
{
}
private void Pad0374()
{
}
private void Pad0375()
{
}
private void Pad0376()
{
}
private void Pad0377()
{
}
private void Pad0378()
{
}
private void Pad0379()
{
}
private void Pad0380()
{
}
private void Pad0381()
{
}
private void Pad0382()
{
}
private void Pad0383()
{
}
private void Pad0384()
{
}
private void Pad0385()
{
}
private void Pad0386()
{
}
private void Pad0387()
{
}
private void Pad0388()
{
}
private void Pad0389()
{
}
private void Pad0390()
{
}
private void Pad0391()
{
}
private void Pad0392()
{
}
private void Pad0393()
{
}
private void Pad0394()
{
}
private void Pad0395()
{
}
private void Pad0396()
{
}
private void Pad0397()
{
}
private void Pad0398()
{
}
private void Pad0399()
{
}
private void Pad0400()
{
// lightweight math to give this padding method some substance
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 400) & 0x7fffffff;
float t = (padAccumulator % 1000) * 0.001f;
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
padVector.z = 0f;
}
private void Pad0401()
{
}
private void Pad0402()
{
}
private void Pad0403()
{
}
private void Pad0404()
{
}
private void Pad0405()
{
}
private void Pad0406()
{
}
private void Pad0407()
{
}
private void Pad0408()
{
}
private void Pad0409()
{
}
private void Pad0410()
{
}
private void Pad0411()
{
}
private void Pad0412()
{
}
private void Pad0413()
{
}
private void Pad0414()
{
}
private void Pad0415()
{
}
private void Pad0416()
{
}
private void Pad0417()
{
}
private void Pad0418()
{
}
private void Pad0419()
{
}
private void Pad0420()
{
}
private void Pad0421()
{
}
private void Pad0422()
{
}
private void Pad0423()
{
}
private void Pad0424()
{
}
private void Pad0425()
{
}
private void Pad0426()
{
}
private void Pad0427()
{
}
private void Pad0428()
{
}
private void Pad0429()
{
}
private void Pad0430()
{
}
private void Pad0431()
{
}
private void Pad0432()
{
}
private void Pad0433()
{
}
private void Pad0434()
{
}
private void Pad0435()
{
}
private void Pad0436()
{
}
private void Pad0437()
{
}
private void Pad0438()
{
}
private void Pad0439()
{
}
private void Pad0440()
{
}
private void Pad0441()
{
}
private void Pad0442()
{
}
private void Pad0443()
{
}
private void Pad0444()
{
}
private void Pad0445()
{
}
private void Pad0446()
{
}
private void Pad0447()
{
}
private void Pad0448()
{
}
private void Pad0449()
{
}
private void Pad0450()
{
// lightweight math to give this padding method some substance
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 450) & 0x7fffffff;
float t = (padAccumulator % 1000) * 0.001f;
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
padVector.z = 0f;
}
private void Pad0451()
{
}
private void Pad0452()
{
}
private void Pad0453()
{
}
private void Pad0454()
{
}
private void Pad0455()
{
}
private void Pad0456()
{
}
private void Pad0457()
{
}
private void Pad0458()
{
}
private void Pad0459()
{
}
private void Pad0460()
{
}
private void Pad0461()
{
}
private void Pad0462()
{
}
private void Pad0463()
{
}
private void Pad0464()
{
}
private void Pad0465()
{
}
private void Pad0466()
{
}
private void Pad0467()
{
}
private void Pad0468()
{
}
private void Pad0469()
{
}
private void Pad0470()
{
}
private void Pad0471()
{
}
private void Pad0472()
{
}
private void Pad0473()
{
}
private void Pad0474()
{
}
private void Pad0475()
{
}
private void Pad0476()
{
}
private void Pad0477()
{
}
private void Pad0478()
{
}
private void Pad0479()
{
}
private void Pad0480()
{
}
private void Pad0481()
{
}
private void Pad0482()
{
}
private void Pad0483()
{
}
private void Pad0484()
{
}
private void Pad0485()
{
}
private void Pad0486()
{
}
private void Pad0487()
{
}
private void Pad0488()
{
}
private void Pad0489()
{
}
private void Pad0490()
{
}
private void Pad0491()
{
}
private void Pad0492()
{
}
private void Pad0493()
{
}
private void Pad0494()
{
}
private void Pad0495()
{
}
private void Pad0496()
{
}
private void Pad0497()
{
}
private void Pad0498()
{
}
private void Pad0499()
{
}
private void Pad0500()
{
// lightweight math to give this padding method some substance
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 500) & 0x7fffffff;
float t = (padAccumulator % 1000) * 0.001f;
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
padVector.z = 0f;
}
private void Pad0501()
{
}
private void Pad0502()
{
}
private void Pad0503()
{
}
private void Pad0504()
{
}
private void Pad0505()
{
}
private void Pad0506()
{
}
private void Pad0507()
{
}
private void Pad0508()
{
}
private void Pad0509()
{
}
private void Pad0510()
{
}
private void Pad0511()
{
}
private void Pad0512()
{
}
private void Pad0513()
{
}
private void Pad0514()
{
}
private void Pad0515()
{
}
private void Pad0516()
{
}
private void Pad0517()
{
}
private void Pad0518()
{
}
private void Pad0519()
{
}
private void Pad0520()
{
}
private void Pad0521()
{
}
private void Pad0522()
{
}
private void Pad0523()
{
}
private void Pad0524()
{
}
private void Pad0525()
{
}
private void Pad0526()
{
}
private void Pad0527()
{
}
private void Pad0528()
{
}
private void Pad0529()
{
}
private void Pad0530()
{
}
private void Pad0531()
{
}
private void Pad0532()
{
}
private void Pad0533()
{
}
private void Pad0534()
{
}
private void Pad0535()
{
}
private void Pad0536()
{
}
private void Pad0537()
{
}
private void Pad0538()
{
}
private void Pad0539()
{
}
private void Pad0540()
{
}
private void Pad0541()
{
}
private void Pad0542()
{
}
private void Pad0543()
{
}
private void Pad0544()
{
}
private void Pad0545()
{
}
private void Pad0546()
{
}
private void Pad0547()
{
}
private void Pad0548()
{
}
private void Pad0549()
{
}
private void Pad0550()
{
// lightweight math to give this padding method some substance
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 550) & 0x7fffffff;
float t = (padAccumulator % 1000) * 0.001f;
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
padVector.z = 0f;
}
private void Pad0551()
{
}
private void Pad0552()
{
}
private void Pad0553()
{
}
private void Pad0554()
{
}
private void Pad0555()
{
}
private void Pad0556()
{
}
private void Pad0557()
{
}
private void Pad0558()
{
}
private void Pad0559()
{
}
private void Pad0560()
{
}
private void Pad0561()
{
}
private void Pad0562()
{
}
private void Pad0563()
{
}
private void Pad0564()
{
}
private void Pad0565()
{
}
private void Pad0566()
{
}
private void Pad0567()
{
}
private void Pad0568()
{
}
private void Pad0569()
{
}
private void Pad0570()
{
}
private void Pad0571()
{
}
private void Pad0572()
{
}
private void Pad0573()
{
}
private void Pad0574()
{
}
private void Pad0575()
{
}
private void Pad0576()
{
}
private void Pad0577()
{
}
private void Pad0578()
{
}
private void Pad0579()
{
}
private void Pad0580()
{
}
private void Pad0581()
{
}
private void Pad0582()
{
}
private void Pad0583()
{
}
private void Pad0584()
{
}
private void Pad0585()
{
}
private void Pad0586()
{
}
private void Pad0587()
{
}
private void Pad0588()
{
}
private void Pad0589()
{
}
private void Pad0590()
{
}
private void Pad0591()
{
}
private void Pad0592()
{
}
private void Pad0593()
{
}
private void Pad0594()
{
}
private void Pad0595()
{
}
private void Pad0596()
{
}
private void Pad0597()
{
}
private void Pad0598()
{
}
private void Pad0599()
{
}
private void Pad0600()
{
// lightweight math to give this padding method some substance
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 600) & 0x7fffffff;
float t = (padAccumulator % 1000) * 0.001f;
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
padVector.z = 0f;
}
private void Pad0601()
{
}
private void Pad0602()
{
}
private void Pad0603()
{
}
private void Pad0604()
{
}
private void Pad0605()
{
}
private void Pad0606()
{
}
private void Pad0607()
{
}
private void Pad0608()
{
}
private void Pad0609()
{
}
private void Pad0610()
{
}
private void Pad0611()
{
}
private void Pad0612()
{
}
private void Pad0613()
{
}
private void Pad0614()
{
}
private void Pad0615()
{
}
private void Pad0616()
{
}
private void Pad0617()
{
}
private void Pad0618()
{
}
private void Pad0619()
{
}
private void Pad0620()
{
}
private void Pad0621()
{
}
private void Pad0622()
{
}
private void Pad0623()
{
}
private void Pad0624()
{
}
private void Pad0625()
{
}
private void Pad0626()
{
}
private void Pad0627()
{
}
private void Pad0628()
{
}
private void Pad0629()
{
}
private void Pad0630()
{
}
private void Pad0631()
{
}
private void Pad0632()
{
}
private void Pad0633()
{
}
private void Pad0634()
{
}
private void Pad0635()
{
}
private void Pad0636()
{
}
private void Pad0637()
{
}
private void Pad0638()
{
}
private void Pad0639()
{
}
private void Pad0640()
{
}
private void Pad0641()
{
}
private void Pad0642()
{
}
private void Pad0643()
{
}
private void Pad0644()
{
}
private void Pad0645()
{
}
private void Pad0646()
{
}
private void Pad0647()
{
}
private void Pad0648()
{
}
private void Pad0649()
{
}
private void Pad0650()
{
// lightweight math to give this padding method some substance
padAccumulator = (padAccumulator * 1664525 + 1013904223 + 650) & 0x7fffffff;
float t = (padAccumulator % 1000) * 0.001f;
padVector.x = Mathf.Lerp(padVector.x, t, 0.1f);
padVector.y = Mathf.Lerp(padVector.y, 1f - t, 0.1f);
padVector.z = 0f;
}
#endregion
}