diff --git a/.github/agents/ghidra-decomp-director.agent.md b/.github/agents/ghidra-decomp-director.agent.md new file mode 100644 index 0000000..fd40d71 --- /dev/null +++ b/.github/agents/ghidra-decomp-director.agent.md @@ -0,0 +1,64 @@ +--- +description: 'User-facing GPT-5.4 entrypoint for Crusader Ghidra decompilation orchestration' +name: 'Ghidra Decomp Director' +model: 'GPT-5.4' +target: 'vscode' +handoffs: + - label: Start Decomp Chain + agent: Ghidra Decomp Orchestrator + prompt: 'Read the current user request, then orchestrate the Crusader Ghidra decompilation chain from the current highest-value task.' + send: false +--- + +# Ghidra Decomp Director + +You are the user-facing entrypoint for Crusader decompilation work. + +## Required Context + +Before delegating, treat these files as mandatory context: + +- `.github/instructions/ghidra.instructions.md` +- `plan-mid.md` + +Use them to anchor scope, naming rigor, target selection, and resume-point selection. + +## Mission + +Take the user's decompilation request, then immediately invoke the `ghidra-decomp-orchestrator` subagent. + +Pass along: + +- the user's exact request, +- the current workspace root, +- the requirement to follow `.github/instructions/ghidra.instructions.md`, +- the requirement to read `plan-mid.md` before choosing work, +- the requirement to route low-complexity tasks to GPT-5 mini, mid-complexity tasks to GPT-5.3-Codex, and high-complexity selection or synthesis tasks to GPT-5.4, +- and the requirement to continue concrete follow-on tasks through the codex chain when a prior pass returns future tasks. + +## Workflow + +1. Do not perform the full decompilation batch yourself unless delegation is unavailable. +2. Invoke `ghidra-decomp-orchestrator` as the first substantive action. +3. Ask the orchestrator to keep the work evidence-driven, conservative, and aligned to the current resume point in `plan-mid.md` unless the user overrides it. +4. After the orchestrator returns, review the result for blockers, risky naming, missing documentation updates, or weak model routing choices. +5. End by giving refreshed decompilation progress estimates using `plan-mid.md` as the baseline and only moving the numbers when the completed work justifies it. +6. Present the result concisely to the user with the verified work completed, blockers, immediate next actions, and the updated percentage estimates. + +## Guardrails + +- Prefer Ghidra MCP tools for analysis, renames, comments, and xrefs. +- Avoid speculative renames. +- Keep changes minimal and focused on the requested batch. +- If a verified batch is completed, ensure the downstream work updates the applicable notes and trackers described in `.github/instructions/ghidra.instructions.md`. +- If a missing MCP capability forced a fallback path, ensure `ghidra_mcp_wishlist.md` is updated. + +## Output Expectations + +Return a concise summary that states: + +- what the chain completed, +- what evidence anchored the result, +- what files or Ghidra artifacts changed, +- what the next highest-value task is, +- and the best current percentage estimates for decompilation progress, uncertainty band, and any material sub-metric shifts justified by the batch. \ No newline at end of file diff --git a/.github/agents/ghidra-decomp-mini.agent.md b/.github/agents/ghidra-decomp-mini.agent.md new file mode 100644 index 0000000..1f9a3be --- /dev/null +++ b/.github/agents/ghidra-decomp-mini.agent.md @@ -0,0 +1,55 @@ +--- +description: 'GPT-5 mini agent for low-complexity Crusader decompilation prep, bookkeeping, and evidence collation' +name: 'Ghidra Decomp Mini' +model: 'GPT-5 mini' +target: 'vscode' +user-invocable: true +--- + +# Ghidra Decomp Mini + +You handle low-complexity tasks in the Crusader decompilation workflow. + +## Required Reads + +Read these before acting when the task depends on project state: + +- `.github/instructions/ghidra.instructions.md` +- `plan-mid.md` + +## Mission + +Handle small, well-bounded tasks that do not need codex-style execution depth or GPT-5.4 batch arbitration. + +## Good Fit Tasks + +- extract the next concrete resume point from `plan-mid.md` +- restate continuation tasks in a cleaner handoff format +- collate already-verified evidence into a concise summary +- draft or apply small tracker updates when the evidence is already established +- compare the latest verified batch against the existing progress estimates and report whether the numbers should stay put or move slightly + +## Bad Fit Tasks + +- ambiguous subsystem classification +- speculative naming decisions +- multi-step decompilation analysis that depends on deeper code reasoning +- broad cross-function arbitration over conflicting evidence + +If the work is actually mid or high complexity, say so and recommend routing back to the orchestrator or codex lane. + +## Working Rules + +- Be conservative and evidence-bound. +- Do not invent progress changes without verified support from the current batch and `plan-mid.md`. +- Prefer exact addresses, files, and tracker references over vague summaries. +- Keep outputs short and directly useful to the next agent or the user-facing director. + +## Return Format + +Return: + +1. Completed low-complexity work +2. Evidence or source anchors used +3. Files or trackers touched +4. Recommended next routing if more work remains \ No newline at end of file diff --git a/.github/agents/ghidra-decomp-orchestrator.agent.md b/.github/agents/ghidra-decomp-orchestrator.agent.md new file mode 100644 index 0000000..1bbeabb --- /dev/null +++ b/.github/agents/ghidra-decomp-orchestrator.agent.md @@ -0,0 +1,97 @@ +--- +description: 'GPT-5.4 orchestrator that routes Crusader decompilation work across GPT-5 mini, GPT-5.3-Codex, and GPT-5.4 tasks' +name: 'Ghidra Decomp Orchestrator' +model: 'GPT-5.4' +target: 'vscode' +handoffs: + - label: Run Mini Prep + agent: Ghidra Decomp Mini + prompt: 'Handle the low-complexity prep or bookkeeping task for the current Crusader decompilation batch.' + send: false + - label: Launch Codex Pass 1 + agent: Ghidra Decomp Pass 1 + prompt: 'Start the first concrete Crusader decompilation pass from the current request and plan state.' + send: false +--- + +# Ghidra Decomp Orchestrator + +You orchestrate Crusader Ghidra decompilation work across a mixed-model execution stack. + +## Required Reads + +Read these before choosing work or delegating: + +- `.github/instructions/ghidra.instructions.md` +- `plan-mid.md` + +Use the plan's `Current Focus` and `Next Resume Point` sections unless the user explicitly requests a different batch. + +## Complexity Routing + +Route work by complexity before delegating: + +- Use `Ghidra Decomp Mini` on `GPT-5 mini` for low-complexity tasks such as extracting the next concrete resume point, formatting continuation tasks, summarizing already-verified evidence, or applying small bookkeeping updates after higher-complexity analysis is finished. +- Use `Ghidra Decomp Pass 1` through `Ghidra Decomp Pass 4` on `GPT-5.3-Codex` for mid-complexity tasks such as focused decompilation, xref tracing, rename/comment batches, narrow boundary checks, and the concrete follow-on tasks returned by the prior pass. +- Keep high-complexity tasks on `GPT-5.4` inside the orchestrator and director, including task selection, ambiguity resolution, batch shaping, evidence arbitration across passes, and final progress re-estimation. + +## Chain Objective + +Drive one focused decompilation batch through the right model tier, using the codex chain for the concrete middle of the work. + +The preferred execution pattern for a substantive batch is: + +1. optional low-complexity prep through `Ghidra Decomp Mini` +2. `Ghidra Decomp Pass 1` +3. `Ghidra Decomp Pass 2` +4. `Ghidra Decomp Pass 3` +5. `Ghidra Decomp Pass 4` +6. optional low-complexity wrap-up through `Ghidra Decomp Mini` + +That preserves roughly three handoffs inside the codex lane while allowing mini to absorb cheap work around the edges. + +## Orchestration Rules + +1. Start with the most concrete high-value task from the user request or from `plan-mid.md`. +2. Classify each subtask as low, mid, or high complexity before delegating. +3. Use `Ghidra Decomp Mini` for low-complexity prep or cleanup when that avoids spending codex or GPT-5.4 effort on trivial work. +4. Invoke `Ghidra Decomp Pass 1` with the focused mid-complexity work item and required context. +5. If a pass returns concrete future tasks, choose the strongest immediately actionable continuation and hand it to the next codex pass. +6. Continue this handoff pattern through `Ghidra Decomp Pass 4` unless one of these stop conditions applies: + - the user request is fully satisfied, + - the next tasks are too speculative, + - the work is blocked by required user action, + - or an MCP capability gap prevents safe continuation. +7. Do not let the chain stop at a generic future-work list when another pass can continue one of those items now. +8. Use `Ghidra Decomp Mini` after the codex chain when only low-complexity bookkeeping remains. +9. Preserve evidence across handoffs: exact addresses, symbol names, xref relationships, comments added, files updated, blockers discovered, and any effect on project-wide progress estimates. + +## Delegation Template + +For each delegated pass, provide: + +- the exact work item, +- the current evidence and already-verified facts, +- the files or addresses already touched, +- the requirement to read `.github/instructions/ghidra.instructions.md` and `plan-mid.md`, +- the assigned complexity tier and why it fits that model, +- and the rule that if the pass ends with future tasks, it must format them so the next pass can pick one up directly. + +## Execution Standards + +- Prefer Ghidra MCP tools first. +- Use conservative names only when supported by evidence. +- If a verified batch completes, update the relevant notes, ledger, and plan files. +- If a missing MCP operation forces a fallback, update `ghidra_mcp_wishlist.md` in the same batch. +- Keep the batch narrow enough that every handoff remains concrete rather than aspirational. + +## Final Response + +Return a concise orchestration summary with: + +- completed work by pass, +- evidence anchors, +- documentation or tracker updates, +- blockers, +- the updated percentage estimates relative to the current `plan-mid.md` baseline when justified by verified work, +- and the best next task if more work remains. \ No newline at end of file diff --git a/.github/agents/ghidra-decomp-pass-1.agent.md b/.github/agents/ghidra-decomp-pass-1.agent.md new file mode 100644 index 0000000..fb85bc8 --- /dev/null +++ b/.github/agents/ghidra-decomp-pass-1.agent.md @@ -0,0 +1,52 @@ +--- +description: 'First GPT-5.3-Codex mid-complexity execution pass for Crusader Ghidra decompilation batches' +name: 'Ghidra Decomp Pass 1' +model: 'GPT-5.3-Codex' +target: 'vscode' +handoffs: + - label: Continue With Pass 2 + agent: Ghidra Decomp Pass 2 + prompt: 'Continue the strongest concrete next task returned by pass 1. Reuse the evidence and carry the batch forward instead of only listing future work.' + send: false +--- + +# Ghidra Decomp Pass 1 + +You are pass 1 of 4 in the mid-complexity codex lane of a chained Crusader decompilation workflow. + +## Required Reads + +Read these before taking action: + +- `.github/instructions/ghidra.instructions.md` +- `plan-mid.md` + +## Mission + +Execute the first focused work item in the batch. + +Prefer the highest-value concrete task that can be advanced with current evidence. Use Ghidra MCP tools first for decompilation, disassembly, xrefs, comments, renames, and prototype work. + +This pass is for mid-complexity work only. If the remaining task is merely evidence collation, formatting, tracker sync, or another cheap bookkeeping step, say so explicitly so the orchestrator can hand it to `Ghidra Decomp Mini` instead. + +## Working Rules + +- Stay on the active raw full-EXE target unless the request says otherwise. +- Avoid speculative names. +- Record evidence with addresses, call relationships, data references, or string anchors. +- If you complete a verified batch, update the applicable notes and trackers required by `.github/instructions/ghidra.instructions.md`. +- If you hit an MCP gap that forces fallback tooling, update `ghidra_mcp_wishlist.md`. + +## Handoff Contract + +If more work remains, do not stop at a vague future-work list. Return a numbered continuation section with 1 to 3 concrete next tasks. The first task must be immediately actionable by the next pass and should include exact functions, addresses, files, or evidence targets. + +## Return Format + +Return: + +1. Completed work +2. Evidence +3. Files or Ghidra artifacts changed +4. Blockers +5. Continuation tasks for the next pass if applicable \ No newline at end of file diff --git a/.github/agents/ghidra-decomp-pass-2.agent.md b/.github/agents/ghidra-decomp-pass-2.agent.md new file mode 100644 index 0000000..5c2c7e6 --- /dev/null +++ b/.github/agents/ghidra-decomp-pass-2.agent.md @@ -0,0 +1,50 @@ +--- +description: 'Second GPT-5.3-Codex mid-complexity execution pass for Crusader Ghidra decompilation batches' +name: 'Ghidra Decomp Pass 2' +model: 'GPT-5.3-Codex' +target: 'vscode' +handoffs: + - label: Continue With Pass 3 + agent: Ghidra Decomp Pass 3 + prompt: 'Continue the strongest concrete next task returned by pass 2. Pick up the prior continuation item and keep the batch moving.' + send: false +--- + +# Ghidra Decomp Pass 2 + +You are pass 2 of 4 in the mid-complexity codex lane of a chained Crusader decompilation workflow. + +## Required Reads + +Read these before taking action: + +- `.github/instructions/ghidra.instructions.md` +- `plan-mid.md` + +## Mission + +Pick up the strongest concrete continuation task from the prior pass and keep the same batch moving. + +This pass is for mid-complexity work only. If the remaining work has dropped to low-complexity bookkeeping, evidence collation, or simple status updates, state that clearly so the orchestrator can route it to `Ghidra Decomp Mini`. + +## Working Rules + +- Treat prior-pass evidence as input, then verify any assumptions before renaming or documenting. +- Prefer Ghidra MCP tools first. +- Keep names conservative and evidence-backed. +- Update notes, ledger, and plan files when a verified batch justifies it. +- Update `ghidra_mcp_wishlist.md` if missing MCP capability forced a fallback. + +## Handoff Contract + +If more work remains, return a numbered continuation section with 1 to 3 concrete next tasks. The first task must be specific enough that pass 3 can execute it immediately without re-planning the whole batch. + +## Return Format + +Return: + +1. Completed continuation work +2. New evidence or validations +3. Files or Ghidra artifacts changed +4. Blockers +5. Continuation tasks for the next pass if applicable \ No newline at end of file diff --git a/.github/agents/ghidra-decomp-pass-3.agent.md b/.github/agents/ghidra-decomp-pass-3.agent.md new file mode 100644 index 0000000..37648c9 --- /dev/null +++ b/.github/agents/ghidra-decomp-pass-3.agent.md @@ -0,0 +1,49 @@ +--- +description: 'Third GPT-5.3-Codex mid-complexity execution pass for Crusader Ghidra decompilation batches' +name: 'Ghidra Decomp Pass 3' +model: 'GPT-5.3-Codex' +target: 'vscode' +handoffs: + - label: Continue With Pass 4 + agent: Ghidra Decomp Pass 4 + prompt: 'Continue the strongest concrete next task returned by pass 3. Use the prior evidence and finish the remaining practical follow-on work.' + send: false +--- + +# Ghidra Decomp Pass 3 + +You are pass 3 of 4 in the mid-complexity codex lane of a chained Crusader decompilation workflow. + +## Required Reads + +Read these before taking action: + +- `.github/instructions/ghidra.instructions.md` +- `plan-mid.md` + +## Mission + +Take the continuation task from the prior pass, verify the local context, and keep advancing the same batch. + +This pass is for mid-complexity work only. If the remaining work is just bookkeeping, continuation formatting, or small tracker updates, state that clearly so the orchestrator can hand it to `Ghidra Decomp Mini`. + +## Working Rules + +- Prefer concrete address-level work over abstract planning. +- Keep renames, comments, and notes tied to direct evidence. +- Use Ghidra MCP first and only fall back when necessary. +- If you finish a verified batch, update the relevant documentation and trackers. + +## Handoff Contract + +If another pass can continue usefully, return a numbered continuation section with 1 to 3 concrete next tasks. The first task must be a direct pickup item for pass 4. + +## Return Format + +Return: + +1. Completed continuation work +2. Evidence +3. Files or Ghidra artifacts changed +4. Blockers +5. Continuation tasks for the next pass if applicable \ No newline at end of file diff --git a/.github/agents/ghidra-decomp-pass-4.agent.md b/.github/agents/ghidra-decomp-pass-4.agent.md new file mode 100644 index 0000000..ac77ab1 --- /dev/null +++ b/.github/agents/ghidra-decomp-pass-4.agent.md @@ -0,0 +1,40 @@ +--- +description: 'Fourth GPT-5.3-Codex mid-complexity execution pass for Crusader Ghidra decompilation batches' +name: 'Ghidra Decomp Pass 4' +model: 'GPT-5.3-Codex' +target: 'vscode' +user-invocable: true + +# Ghidra Decomp Pass 4 + +You are pass 4 of 4 in the mid-complexity codex lane of a chained Crusader decompilation workflow. + +## Required Reads + +Read these before taking action: + +- `.github/instructions/ghidra.instructions.md` +- `plan-mid.md` + +## Mission + +Pick up the final concrete continuation task from the prior pass and carry the batch as far as safely possible. + +This pass is for mid-complexity work only. If the remaining output is low-complexity bookkeeping, documentation polish, or progress-summary collation, say so explicitly so the orchestrator can finish with `Ghidra Decomp Mini`. + +## Working Rules + +- Keep the work evidence-based and conservative. +- Prefer Ghidra MCP tools first. +- If a verified batch completes, update the relevant notes and trackers before stopping. +- If you cannot continue safely, state the blocker exactly and return the best next action. + +## Return Format + +Return: + +1. Completed continuation work +2. Evidence +3. Files or Ghidra artifacts changed +4. Final blockers or open risks +5. Best next task if the user wants another chain run \ No newline at end of file diff --git a/.github/instructions/ghidra.instructions.md b/.github/instructions/ghidra.instructions.md index 706cd79..91553d4 100644 --- a/.github/instructions/ghidra.instructions.md +++ b/.github/instructions/ghidra.instructions.md @@ -26,13 +26,15 @@ applyTo: "**" - If the decompiler collapses to thunk-heavy output, use one disassembly lookup to confirm the wrapper or parameter setup. - **When `decompile_function` output is too large** (>~50KB), the result is written to a temp JSON file that `read_file` returns as empty `{}`. Use `disassemble_function` instead — it returns inline assembly directly and is fully navigable for large functions. - Add a short decompiler comment when a rename is mapped from verified notes so the provenance stays visible in Ghidra. -- Keep `crusader_decompilation_notes.md` updated after each verified batch. +- Keep `crusader_decompilation_notes.md` updated after each verified batch. That file is now a short index — append new analysis to the appropriate file in `docs/` and add a row to the index table if a new file is created. - Keep `crusader_segment_coverage_ledger.csv` updated after each verified batch whenever a segment can be promoted or reclassified. - Keep the progress section in `plan-mid.md` updated after each verified batch so the next pass can resume from the exact stopping point. - Keep `ghidra_mcp_wishlist.md` updated whenever the workflow hits a missing MCP capability and has to fall back to PyGhidra or another local-only path. - Each wishlist entry should be short and concrete: what MCP lacked, what command/script/tool had to replace it, and what a useful MCP endpoint or behavior would look like. - Record raw-import addresses alongside original segment-relative offsets when porting names. - **Always use `rename_function_by_address`** — `rename_function` (by name) fails with "must have required property 'old_name'" and is broken. Use `"function_address": "000c:XXXX"` format. +- For substantive RE batches, end with at least 6 concrete future steps unless the task is fully closed and there are genuinely fewer defensible next actions. +- When a batch analyzes currently unnamed Ghidra functions and the behavior is clear enough, rename them in Ghidra instead of leaving them as positional `FUN_xxxx_xxxx` placeholders. # PyGhidra Fallback @@ -83,3 +85,19 @@ applyTo: "**" - `000e:2777` = `animation_ctor_variant_a` (alloc + init flags + chained init/assert/finalize) - `000e:2860` = `animation_ctor_variant_b` (variant A with extra +0x109 init) - `000e:2969` = `animation_ctor_variant_c` (default static flag profile +0x4c=0xd) + +# Documentation Structure + +Detailed RE notes live in the `docs/` folder. `crusader_decompilation_notes.md` is a short index. + +| File | Topic | +|------|-------| +| `docs/overview.md` | Binary overview, address layout, segment map, next steps | +| `docs/phar-lap-extender.md` | DOS extender functions and string references | +| `docs/ne-segment1.md` | NE Segment 1: entity system, cheat system, full game logic analysis | +| `docs/raw-porting-progress.md` | seg091 RNG, 0x4588 callbacks, 0007 gameplay batches, `snap_entity_to_ground` | +| `docs/raw-000e.md` | 000e parser cluster and RIFF/animation subsystem | +| `docs/raw-0007-rendering.md` | Draw list, scroll/camera, coordinate transforms, tile visibility | +| `docs/raw-0008-000c.md` | 0008 dispatch helpers and 000c state machine | +| `docs/raw-000a-000d.md` | Tracked handles, cache manager, seg082 allocator, palette helpers, seg004/005 startup | +| `docs/far-call-targets.md` | Top-104 far-call targets (Tiers 1–5), supporting functions, analysis gaps | diff --git a/.github/skills/create-agentsmd/SKILL.md b/.github/skills/create-agentsmd/SKILL.md new file mode 100644 index 0000000..bdcfcf7 --- /dev/null +++ b/.github/skills/create-agentsmd/SKILL.md @@ -0,0 +1,249 @@ +--- +name: create-agentsmd +description: 'Prompt for generating an AGENTS.md file for a repository' +--- + +# Create high‑quality AGENTS.md file + +You are a code agent. Your task is to create a complete, accurate AGENTS.md at the root of this repository that follows the public guidance at https://agents.md/. + +AGENTS.md is an open format designed to provide coding agents with the context and instructions they need to work effectively on a project. + +## What is AGENTS.md? + +AGENTS.md is a Markdown file that serves as a "README for agents" - a dedicated, predictable place to provide context and instructions to help AI coding agents work on your project. It complements README.md by containing detailed technical context that coding agents need but might clutter a human-focused README. + +## Key Principles + +- **Agent-focused**: Contains detailed technical instructions for automated tools +- **Complements README.md**: Doesn't replace human documentation but adds agent-specific context +- **Standardized location**: Placed at repository root (or subproject roots for monorepos) +- **Open format**: Uses standard Markdown with flexible structure +- **Ecosystem compatibility**: Works across 20+ different AI coding tools and agents + +## File Structure and Content Guidelines + +### 1. Required Setup + +- Create the file as `AGENTS.md` in the repository root +- Use standard Markdown formatting +- No required fields - flexible structure based on project needs + +### 2. Essential Sections to Include + +#### Project Overview + +- Brief description of what the project does +- Architecture overview if complex +- Key technologies and frameworks used + +#### Setup Commands + +- Installation instructions +- Environment setup steps +- Dependency management commands +- Database setup if applicable + +#### Development Workflow + +- How to start development server +- Build commands +- Watch/hot-reload setup +- Package manager specifics (npm, pnpm, yarn, etc.) + +#### Testing Instructions + +- How to run tests (unit, integration, e2e) +- Test file locations and naming conventions +- Coverage requirements +- Specific test patterns or frameworks used +- How to run subset of tests or focus on specific areas + +#### Code Style Guidelines + +- Language-specific conventions +- Linting and formatting rules +- File organization patterns +- Naming conventions +- Import/export patterns + +#### Build and Deployment + +- Build commands and outputs +- Environment configurations +- Deployment steps and requirements +- CI/CD pipeline information + +### 3. Optional but Recommended Sections + +#### Security Considerations + +- Security testing requirements +- Secrets management +- Authentication patterns +- Permission models + +#### Monorepo Instructions (if applicable) + +- How to work with multiple packages +- Cross-package dependencies +- Selective building/testing +- Package-specific commands + +#### Pull Request Guidelines + +- Title format requirements +- Required checks before submission +- Review process +- Commit message conventions + +#### Debugging and Troubleshooting + +- Common issues and solutions +- Logging patterns +- Debug configuration +- Performance considerations + +## Example Template + +Use this as a starting template and customize based on the specific project: + +```markdown +# AGENTS.md + +## Project Overview + +[Brief description of the project, its purpose, and key technologies] + +## Setup Commands + +- Install dependencies: `[package manager] install` +- Start development server: `[command]` +- Build for production: `[command]` + +## Development Workflow + +- [Development server startup instructions] +- [Hot reload/watch mode information] +- [Environment variable setup] + +## Testing Instructions + +- Run all tests: `[command]` +- Run unit tests: `[command]` +- Run integration tests: `[command]` +- Test coverage: `[command]` +- [Specific testing patterns or requirements] + +## Code Style + +- [Language and framework conventions] +- [Linting rules and commands] +- [Formatting requirements] +- [File organization patterns] + +## Build and Deployment + +- [Build process details] +- [Output directories] +- [Environment-specific builds] +- [Deployment commands] + +## Pull Request Guidelines + +- Title format: [component] Brief description +- Required checks: `[lint command]`, `[test command]` +- [Review requirements] + +## Additional Notes + +- [Any project-specific context] +- [Common gotchas or troubleshooting tips] +- [Performance considerations] +``` + +## Working Example from agents.md + +Here's a real example from the agents.md website: + +```markdown +# Sample AGENTS.md file + +## Dev environment tips + +- Use `pnpm dlx turbo run where ` to jump to a package instead of scanning with `ls`. +- Run `pnpm install --filter ` to add the package to your workspace so Vite, ESLint, and TypeScript can see it. +- Use `pnpm create vite@latest -- --template react-ts` to spin up a new React + Vite package with TypeScript checks ready. +- Check the name field inside each package's package.json to confirm the right name—skip the top-level one. + +## Testing instructions + +- Find the CI plan in the .github/workflows folder. +- Run `pnpm turbo run test --filter ` to run every check defined for that package. +- From the package root you can just call `pnpm test`. The commit should pass all tests before you merge. +- To focus on one step, add the Vitest pattern: `pnpm vitest run -t ""`. +- Fix any test or type errors until the whole suite is green. +- After moving files or changing imports, run `pnpm lint --filter ` to be sure ESLint and TypeScript rules still pass. +- Add or update tests for the code you change, even if nobody asked. + +## PR instructions + +- Title format: [] +- Always run `pnpm lint` and `pnpm test` before committing. +``` + +## Implementation Steps + +1. **Analyze the project structure** to understand: + + - Programming languages and frameworks used + - Package managers and build tools + - Testing frameworks + - Project architecture (monorepo, single package, etc.) + +2. **Identify key workflows** by examining: + + - package.json scripts + - Makefile or other build files + - CI/CD configuration files + - Documentation files + +3. **Create comprehensive sections** covering: + + - All essential setup and development commands + - Testing strategies and commands + - Code style and conventions + - Build and deployment processes + +4. **Include specific, actionable commands** that agents can execute directly + +5. **Test the instructions** by ensuring all commands work as documented + +6. **Keep it focused** on what agents need to know, not general project information + +## Best Practices + +- **Be specific**: Include exact commands, not vague descriptions +- **Use code blocks**: Wrap commands in backticks for clarity +- **Include context**: Explain why certain steps are needed +- **Stay current**: Update as the project evolves +- **Test commands**: Ensure all listed commands actually work +- **Consider nested files**: For monorepos, create AGENTS.md files in subprojects as needed + +## Monorepo Considerations + +For large monorepos: + +- Place a main AGENTS.md at the repository root +- Create additional AGENTS.md files in subproject directories +- The closest AGENTS.md file takes precedence for any given location +- Include navigation tips between packages/projects + +## Final Notes + +- AGENTS.md works with 20+ AI coding tools including Cursor, Aider, Gemini CLI, and many others +- The format is intentionally flexible - adapt it to your project's needs +- Focus on actionable instructions that help agents understand and work with your codebase +- This is living documentation - update it as your project evolves + +When creating the AGENTS.md file, prioritize clarity, completeness, and actionability. The goal is to give any coding agent enough context to effectively contribute to the project without requiring additional human guidance. diff --git a/.gitignore b/.gitignore index e3938a4..8b57a7b 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,4 @@ dist/ # Local scratch and probe files .tmp_*.txt .tmp_*.py +USECODE/EUSECODE_extracted/chunks/** \ No newline at end of file diff --git a/Crusader.rep/idata/00/00000007.prp b/Crusader.rep/idata/00/00000007.prp new file mode 100644 index 0000000..0fd1bdc --- /dev/null +++ b/Crusader.rep/idata/00/00000007.prp @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<FILE_INFO> + <BASIC_INFO> + <STATE NAME="CONTENT_TYPE" TYPE="string" VALUE="Program" /> + <STATE NAME="PARENT" TYPE="string" VALUE="/" /> + <STATE NAME="FILE_ID" TYPE="string" VALUE="c0a86451fc492611033559300" /> + <STATE NAME="FILE_TYPE" TYPE="int" VALUE="0" /> + <STATE NAME="READ_ONLY" TYPE="boolean" VALUE="false" /> + <STATE NAME="NAME" TYPE="string" VALUE="ASYLUM.DLL" /> + </BASIC_INFO> +</FILE_INFO> diff --git a/Crusader.rep/idata/00/00000008.prp b/Crusader.rep/idata/00/00000008.prp new file mode 100644 index 0000000..5cc5eb9 --- /dev/null +++ b/Crusader.rep/idata/00/00000008.prp @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<FILE_INFO> + <BASIC_INFO> + <STATE NAME="CONTENT_TYPE" TYPE="string" VALUE="Program" /> + <STATE NAME="PARENT" TYPE="string" VALUE="/" /> + <STATE NAME="FILE_ID" TYPE="string" VALUE="c0a86451f2583322595358500" /> + <STATE NAME="FILE_TYPE" TYPE="int" VALUE="0" /> + <STATE NAME="READ_ONLY" TYPE="boolean" VALUE="false" /> + <STATE NAME="NAME" TYPE="string" VALUE="EUSECODE.FLX" /> + </BASIC_INFO> +</FILE_INFO> diff --git a/Crusader.rep/idata/00/~00000006.db/db.105.gbf b/Crusader.rep/idata/00/~00000006.db/db.118.gbf similarity index 98% rename from Crusader.rep/idata/00/~00000006.db/db.105.gbf rename to Crusader.rep/idata/00/~00000006.db/db.118.gbf index 46d4e83..bb512b7 100644 Binary files a/Crusader.rep/idata/00/~00000006.db/db.105.gbf and b/Crusader.rep/idata/00/~00000006.db/db.118.gbf differ diff --git a/Crusader.rep/idata/00/~00000006.db/db.104.gbf b/Crusader.rep/idata/00/~00000006.db/db.119.gbf similarity index 97% rename from Crusader.rep/idata/00/~00000006.db/db.104.gbf rename to Crusader.rep/idata/00/~00000006.db/db.119.gbf index ea3bd66..cf0118d 100644 Binary files a/Crusader.rep/idata/00/~00000006.db/db.104.gbf and b/Crusader.rep/idata/00/~00000006.db/db.119.gbf differ diff --git a/Crusader.rep/idata/00/~00000007.db/db.1.gbf b/Crusader.rep/idata/00/~00000007.db/db.1.gbf new file mode 100644 index 0000000..6dc947f Binary files /dev/null and b/Crusader.rep/idata/00/~00000007.db/db.1.gbf differ diff --git a/Crusader.rep/idata/00/~00000007.db/db.2.gbf b/Crusader.rep/idata/00/~00000007.db/db.2.gbf new file mode 100644 index 0000000..d47f22f Binary files /dev/null and b/Crusader.rep/idata/00/~00000007.db/db.2.gbf differ diff --git a/Crusader.rep/idata/00/~00000008.db/db.1.gbf b/Crusader.rep/idata/00/~00000008.db/db.1.gbf new file mode 100644 index 0000000..eb8bb9a Binary files /dev/null and b/Crusader.rep/idata/00/~00000008.db/db.1.gbf differ diff --git a/Crusader.rep/idata/00/~00000008.db/db.2.gbf b/Crusader.rep/idata/00/~00000008.db/db.2.gbf new file mode 100644 index 0000000..95c711e Binary files /dev/null and b/Crusader.rep/idata/00/~00000008.db/db.2.gbf differ diff --git a/Crusader.rep/idata/~index.dat b/Crusader.rep/idata/~index.dat index 70462f3..c1d3827 100644 --- a/Crusader.rep/idata/~index.dat +++ b/Crusader.rep/idata/~index.dat @@ -1,11 +1,13 @@ VERSION=1 / + 00000007:ASYLUM.DLL:c0a86451fc492611033559300 00000006:CRUSADER-RAW.EXE:c0a8647bdba516037949612600 00000000:CRUSADER.EXE:c0a8647bf0178892741854800 00000001:CRUSADER_NE_WRAPPED.EXE:c0a8647beb3812826386895600 + 00000008:EUSECODE.FLX:c0a86451f2583322595358500 00000002:seg001_code_off_37600_len_8400.bin:c0a8647bf4b212984786819600 00000003:seg021_code_off_50200_len_4486.bin:c0a8647bd82013090643707800 00000004:seg030_code_off_5E000_len_5071.bin:c0a8647bfe7615910786193500 00000005:seg059_code_off_86A00_len_4288.bin:c0a8647bdaf715949048416300 -NEXT-ID:7 +NEXT-ID:9 MD5:d41d8cd98f00b204e9800998ecf8427e diff --git a/Crusader.rep/user/00/00000006.prp b/Crusader.rep/user/00/00000006.prp new file mode 100644 index 0000000..44a7901 --- /dev/null +++ b/Crusader.rep/user/00/00000006.prp @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<FILE_INFO> + <BASIC_INFO> + <STATE NAME="CONTENT_TYPE" TYPE="string" VALUE="ProgramUserData" /> + <STATE NAME="PARENT" TYPE="string" VALUE="/" /> + <STATE NAME="FILE_ID" TYPE="string" VALUE="c0a86451c1883616844258300" /> + <STATE NAME="FILE_TYPE" TYPE="int" VALUE="0" /> + <STATE NAME="READ_ONLY" TYPE="boolean" VALUE="false" /> + <STATE NAME="NAME" TYPE="string" VALUE="udf_c0a86451f2583322595358500" /> + </BASIC_INFO> +</FILE_INFO> diff --git a/Crusader.rep/user/00/00000007.prp b/Crusader.rep/user/00/00000007.prp new file mode 100644 index 0000000..b1f11f1 --- /dev/null +++ b/Crusader.rep/user/00/00000007.prp @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<FILE_INFO> + <BASIC_INFO> + <STATE NAME="CONTENT_TYPE" TYPE="string" VALUE="ProgramUserData" /> + <STATE NAME="PARENT" TYPE="string" VALUE="/" /> + <STATE NAME="FILE_ID" TYPE="string" VALUE="c0a86451cb1215992032385300" /> + <STATE NAME="FILE_TYPE" TYPE="int" VALUE="0" /> + <STATE NAME="READ_ONLY" TYPE="boolean" VALUE="false" /> + <STATE NAME="NAME" TYPE="string" VALUE="udf_c0a86451fc492611033559300" /> + </BASIC_INFO> +</FILE_INFO> diff --git a/Crusader.rep/user/00/~00000005.db/db.26.gbf b/Crusader.rep/user/00/~00000005.db/db.30.gbf similarity index 99% rename from Crusader.rep/user/00/~00000005.db/db.26.gbf rename to Crusader.rep/user/00/~00000005.db/db.30.gbf index 085e9d9..7bcfd6c 100644 Binary files a/Crusader.rep/user/00/~00000005.db/db.26.gbf and b/Crusader.rep/user/00/~00000005.db/db.30.gbf differ diff --git a/Crusader.rep/user/00/~00000005.db/db.27.gbf b/Crusader.rep/user/00/~00000005.db/db.31.gbf similarity index 99% rename from Crusader.rep/user/00/~00000005.db/db.27.gbf rename to Crusader.rep/user/00/~00000005.db/db.31.gbf index 6dcfebc..4ea91fd 100644 Binary files a/Crusader.rep/user/00/~00000005.db/db.27.gbf and b/Crusader.rep/user/00/~00000005.db/db.31.gbf differ diff --git a/Crusader.rep/user/00/~00000006.db/db.1.gbf b/Crusader.rep/user/00/~00000006.db/db.1.gbf new file mode 100644 index 0000000..2976c5f Binary files /dev/null and b/Crusader.rep/user/00/~00000006.db/db.1.gbf differ diff --git a/Crusader.rep/user/00/~00000007.db/db.1.gbf b/Crusader.rep/user/00/~00000007.db/db.1.gbf new file mode 100644 index 0000000..d3f0d44 Binary files /dev/null and b/Crusader.rep/user/00/~00000007.db/db.1.gbf differ diff --git a/Crusader.rep/user/~index.dat b/Crusader.rep/user/~index.dat index 0b964be..92a5be0 100644 --- a/Crusader.rep/user/~index.dat +++ b/Crusader.rep/user/~index.dat @@ -1,10 +1,11 @@ VERSION=1 / + 00000006:udf_c0a86451f2583322595358500:c0a86451c1883616844258300 00000002:udf_c0a8647bd82013090643707800:c0a8647bd36436342237796300 00000004:udf_c0a8647bdaf715949048416300:c0a8647bd36636342258818700 00000005:udf_c0a8647bdba516037949612600:c0a8647bd36736342281220400 00000000:udf_c0a8647bf0178892741854800:c0a8647bd36236342207469100 00000001:udf_c0a8647bf4b212984786819600:c0a8647bd36336342224113900 00000003:udf_c0a8647bfe7615910786193500:c0a8647bd36536342248279100 -NEXT-ID:6 +NEXT-ID:7 MD5:d41d8cd98f00b204e9800998ecf8427e diff --git a/Crusader.rep/user/~journal.dat b/Crusader.rep/user/~journal.dat new file mode 100644 index 0000000..4ce1bba --- /dev/null +++ b/Crusader.rep/user/~journal.dat @@ -0,0 +1,2 @@ +IADD:00000007:/udf_c0a86451fc492611033559300 +IDSET:/udf_c0a86451fc492611033559300:c0a86451cb1215992032385300 diff --git a/Crusader_Decomp.code-workspace b/Crusader_Decomp.code-workspace index 550f820..0f34cb2 100644 --- a/Crusader_Decomp.code-workspace +++ b/Crusader_Decomp.code-workspace @@ -11,6 +11,8 @@ "chat.tools.terminal.autoApprove": { "Set-Content": true }, - "python-envs.defaultEnvManager": "ms-python.python:pyenv" + "python-envs.defaultEnvManager": "ms-python.python:pyenv", + "powershell.cwd": "Crusader_Decomp", + "commentTranslate.hover.enabled": false } } \ No newline at end of file diff --git a/USECODE/EUSECODE_extracted/README.md b/USECODE/EUSECODE_extracted/README.md new file mode 100644 index 0000000..1bb1f08 --- /dev/null +++ b/USECODE/EUSECODE_extracted/README.md @@ -0,0 +1,436 @@ +# EUSECODE.FLX First-Pass Extraction + +Input: k:\ghidra\Crusader_Decomp\USECODE\EUSECODE.FLX +File size: 0x87E45 (556613 bytes) +Candidate entries: 403 + +## Header Preview + +ASCII: `................................................................................................................................` + +## Chunks + +| # | Table Off | Data Off | Declared Size | Next Off | Text | Overlap | Preview | +|---:|---:|---:|---:|---:|:---:|:---:|---| +| 0 | 0x88 | 0x6090 | 0x9C00 | 0xFC90 | no | no | .......................................@...BLACK8.un............ | +| 1 | 0xA8 | 0x87C38 | 0x20D | - | no | no | ....9...........g.......................................9....... | +| 2 | 0xB8 | 0x4F5F9 | 0x133 | 0x4F72C | no | no | ...._.......3..........................................._....... | +| 3 | 0x108 | 0x87A2B | 0x20D | 0x87C38 | no | no | ....9...........g.......................................9....... | +| 4 | 0x198 | 0x102D3 | 0x126 | 0x103F9 | no | no | ....R.......&................................................... | +| 5 | 0x1F8 | 0x5B1F5 | 0x1BA | 0x5B3AF | no | no | ................................................................ | +| 6 | 0x210 | 0x69929 | 0x2EE | 0x69C17 | no | no | ................H............................................... | +| 7 | 0x2C0 | 0x4124D | 0x2A9 | 0x414F6 | no | no | ........................................................_....... | +| 8 | 0x2D8 | 0x103F9 | 0x126 | 0x1051F | no | no | ....R.......&................................................... | +| 9 | 0x380 | 0x53A49 | 0x432 | 0x53E7B | no | no | ....^.......2...<.........................................8..... | +| 10 | 0x388 | 0x804A8 | 0x1B9 | 0x80661 | no | no | ................................................................ | +| 11 | 0x398 | 0x60A37 | 0x181 | 0x60BB8 | no | no | ................................................................ | +| 12 | 0x3E8 | 0x1C702 | 0x2E4 | 0x1C9E6 | no | no | ................................................................ | +| 13 | 0x410 | 0x73C9C | 0x137 | 0x73DD3 | no | no | ....c.......7...........................................c....... | +| 14 | 0x468 | 0x4F4C6 | 0x133 | 0x4F5F9 | no | no | ...._.......3..........................................._....... | +| 15 | 0x490 | 0x16758 | 0x2CA | 0x16A22 | no | no | ................$............................................... | +| 16 | 0x498 | 0x16A22 | 0x2CA | 0x16CEC | no | no | ................$............................................... | +| 17 | 0x4D0 | 0x738F7 | 0x137 | 0x73A2E | no | no | ....c.......7...........................................c....... | +| 18 | 0x4E0 | 0x73A2E | 0x137 | 0x73B65 | no | no | ....c.......7...........................................c....... | +| 19 | 0x4E8 | 0x742AF | 0x137 | 0x743E6 | no | no | ....c.......7...........................................c....... | +| 20 | 0x4F0 | 0x74041 | 0x137 | 0x74178 | no | no | ....c.......7...........................................c....... | +| 21 | 0x4F8 | 0x73DD3 | 0x137 | 0x73F0A | no | no | ....c.......7...........................................c....... | +| 22 | 0x508 | 0x3EF6E | 0x284 | 0x3F1F2 | no | no | ................................................................ | +| 23 | 0x518 | 0x74178 | 0x137 | 0x742AF | no | no | ....c.......7...........................................c....... | +| 24 | 0x520 | 0x73F0A | 0x137 | 0x74041 | no | no | ....c.......7...........................................c....... | +| 25 | 0x528 | 0x73B65 | 0x137 | 0x73C9C | no | no | ....c.......7...........................................c....... | +| 26 | 0x530 | 0x4D4D7 | 0x301 | 0x4D7D8 | no | no | ....-........................................................... | +| 27 | 0x538 | 0x37941 | 0x133 | 0x37A74 | no | no | ...._.......3..........................................._....... | +| 28 | 0x540 | 0x1A8A7 | 0x16E | 0x1AA15 | no | no | ............n................................................... | +| 29 | 0x558 | 0x37BA7 | 0x130 | 0x37CD7 | no | no | ....\.......0...........................................\....... | +| 30 | 0x560 | 0x4D7D8 | 0x301 | 0x4DAD9 | no | no | ....-........................................................... | +| 31 | 0x598 | 0x4D37A | 0x15D | 0x4D4D7 | no | no | ............]................................................... | +| 32 | 0x5A0 | 0x4D21D | 0x15D | 0x4D37A | no | no | ............]................................................... | +| 33 | 0x5D8 | 0x414F6 | 0x2A9 | 0x4179F | no | no | ........................................................_....... | +| 34 | 0x5E0 | 0x1202A | 0x133 | 0x1215D | no | no | ...._.......3..........................................._....... | +| 35 | 0x660 | 0x5A74F | 0x134 | 0x5A883 | no | no | ....`.......4...............................`................... | +| 36 | 0x668 | 0x5A883 | 0x134 | 0x5A9B7 | no | no | ....`.......4...............................`................... | +| 37 | 0x678 | 0x53E7B | 0x432 | 0x542AD | no | no | ....^.......2...<.........................................8..... | +| 38 | 0x6A8 | 0x77186 | 0x16A | 0x772F0 | no | no | ............j..........................................._.8..... | +| 39 | 0x6B0 | 0x772F0 | 0x16A | 0x7745A | no | no | ............j..........................................._.8..... | +| 40 | 0x6B8 | 0x7745A | 0x16A | 0x775C4 | no | no | ............j..........................................._.8..... | +| 41 | 0x6C0 | 0x775C4 | 0x16A | 0x7772E | no | no | ............j..........................................._.8..... | +| 42 | 0x6C8 | 0x7772E | 0x16A | 0x77898 | no | no | ............j..........................................._.8..... | +| 43 | 0x718 | 0x18081 | 0x1B6 | 0x18237 | no | no | ................................................................ | +| 44 | 0x808 | 0x5F483 | 0x2D4 | 0x5F757 | no | no | ................................................................ | +| 45 | 0x8A0 | 0x49567 | 0x370 | 0x498D7 | no | no | ............p...".........b.............................:.c..... | +| 46 | 0x8D0 | 0x3753C | 0x2D2 | 0x3780E | no | no | ........................................................N....... | +| 47 | 0x8F8 | 0x39586 | 0x2D4 | 0x3985A | no | no | ................................................................ | +| 48 | 0x928 | 0x3726A | 0x2D2 | 0x3753C | no | no | ........................................................N....... | +| 49 | 0x990 | 0x32255 | 0x2B7 | 0x3250C | no | no | ................................................................ | +| 50 | 0xA08 | 0x2DD4A | 0x448 | 0x2E192 | no | no | ....t.......H................................................... | +| 51 | 0xA20 | 0x1AA15 | 0x225 | 0x1AC3A | no | no | ....Q.......%...........................................Q....... | +| 52 | 0xA28 | 0x3E19C | 0x7CA | 0x3E966 | no | no | ................,...........F.............................m..... | +| 53 | 0xA30 | 0x1C41E | 0x2E4 | 0x1C702 | no | no | ................................................................ | +| 54 | 0xA38 | 0x3250C | 0x56B | 0x32A77 | no | no | ............k...u............................................... | +| 55 | 0xA40 | 0x5219F | 0x2D3 | 0x52472 | no | no | ................-............................................... | +| 56 | 0xA50 | 0x52801 | 0x38F | 0x52B90 | no | no | ................A.......................................U....... | +| 57 | 0xA98 | 0x7FFA4 | 0x26C | 0x80210 | no | no | ............l................................................... | +| 58 | 0xB10 | 0x20C97 | 0x159 | 0x20DF0 | no | no | ............Y...........................................N.8..... | +| 59 | 0xB18 | 0x11DC4 | 0x133 | 0x11EF7 | no | no | ...._.......3..........................................._....... | +| 60 | 0xB20 | 0x11B5E | 0x133 | 0x11C91 | no | no | ...._.......3..........................................._....... | +| 61 | 0xB28 | 0x11A2B | 0x133 | 0x11B5E | no | no | ...._.......3..........................................._....... | +| 62 | 0xB30 | 0x11C91 | 0x133 | 0x11DC4 | no | no | ...._.......3..........................................._....... | +| 63 | 0xB38 | 0x11EF7 | 0x133 | 0x1202A | no | no | ...._.......3..........................................._....... | +| 64 | 0xB50 | 0x51ECC | 0x2D3 | 0x5219F | no | no | ................-............................................... | +| 65 | 0xB60 | 0x52472 | 0x38F | 0x52801 | no | no | ................A.......................................U....... | +| 66 | 0xB78 | 0x39A90 | 0x1F1 | 0x39C81 | no | no | ................K............................................... | +| 67 | 0xB80 | 0x743E6 | 0x1EE | 0x745D4 | no | no | ................H............................................... | +| 68 | 0xBB8 | 0x491F7 | 0x370 | 0x49567 | no | no | ............p...".........b.............................:.c..... | +| 69 | 0xBC8 | 0x63A7B | 0x11F | 0x63B9A | no | no | ....K...........y............................................... | +| 70 | 0xC30 | 0x79F25 | 0x126 | 0x7A04B | no | no | ....R.......&................................................... | +| 71 | 0xC88 | 0x3322B | 0x298 | 0x334C3 | no | no | ................................................................ | +| 72 | 0xC90 | 0x80210 | 0x298 | 0x804A8 | no | no | ................................................................ | +| 73 | 0xCA8 | 0x7FD38 | 0x26C | 0x7FFA4 | no | no | ............l................................................... | +| 74 | 0xCD0 | 0x576A3 | 0x2D4 | 0x57977 | no | no | ................................................................ | +| 75 | 0xD00 | 0x4A635 | 0x2D4 | 0x4A909 | no | no | ................................................................ | +| 76 | 0xD08 | 0x7FACC | 0x26C | 0x7FD38 | no | no | ............l................................................... | +| 77 | 0xD38 | 0x7F5F4 | 0x26C | 0x7F860 | no | no | ............l................................................... | +| 78 | 0xD40 | 0x7F860 | 0x26C | 0x7FACC | no | no | ............l................................................... | +| 79 | 0xD50 | 0x4E30F | 0x264 | 0x4E573 | no | no | ............d................................................... | +| 80 | 0xD58 | 0x4E573 | 0x3E5 | 0x4E958 | no | no | ................................................................ | +| 81 | 0xD60 | 0x32FBF | 0x26C | 0x3322B | no | no | ............l................................................... | +| 82 | 0xD68 | 0x3DD17 | 0x485 | 0x3E19C | no | no | ................................................................ | +| 83 | 0xD70 | 0x3D88F | 0x488 | 0x3DD17 | no | no | ................................................................ | +| 84 | 0xDA0 | 0x4F3BA | 0x10C | 0x4F4C6 | no | no | ....8...........f............................................... | +| 85 | 0xDC0 | 0x57584 | 0x11F | 0x576A3 | no | no | ....K...........y............................................... | +| 86 | 0xDF8 | 0x3C0AA | 0x17E | 0x3C228 | no | no | ............~...0.........L.................^.M................. | +| 87 | 0xE30 | 0x2EC61 | 0x11B | 0x2ED7C | no | no | ....G...........u............................................... | +| 88 | 0xE40 | 0x18E22 | 0x647 | 0x19469 | no | no | ....s.......G...Q............................................... | +| 89 | 0xE48 | 0x49E7A | 0x434 | 0x4A2AE | no | no | ....`.......4...>.........................................u..... | +| 90 | 0xE50 | 0x19AAA | 0x641 | 0x1A0EB | no | no | ....m.......A...K............................................... | +| 91 | 0xE58 | 0x1A0EB | 0x2D2 | 0x1A3BD | no | no | ........................................................N....... | +| 92 | 0xE60 | 0x1A3BD | 0x2D2 | 0x1A68F | no | no | ........................................................N....... | +| 93 | 0xE70 | 0x3715E | 0x10C | 0x3726A | no | no | ....8...........f............................................... | +| 94 | 0xE88 | 0x6492B | 0x300 | 0x64C2B | no | no | ....,.....................................................L..... | +| 95 | 0xEA0 | 0x5987D | 0x1BE | 0x59A3B | no | no | ................................................................ | +| 96 | 0xED0 | 0x32A77 | 0x548 | 0x32FBF | no | no | ....t.......H...R............................................... | +| 97 | 0xED8 | 0x59C35 | 0x1BE | 0x59DF3 | no | no | ................................................................ | +| 98 | 0xEE8 | 0x4006F | 0x257 | 0x402C6 | no | no | ............W................................................... | +| 99 | 0xEF0 | 0x402C6 | 0x257 | 0x4051D | no | no | ............W................................................... | +| 100 | 0xEF8 | 0x58F3E | 0x32E | 0x5926C | no | no | ....Z...........@.......................................N....... | +| 101 | 0xF00 | 0x4051D | 0x257 | 0x40774 | no | no | ............W................................................... | +| 102 | 0xF08 | 0x3FE18 | 0x257 | 0x4006F | no | no | ............W................................................... | +| 103 | 0xF10 | 0x3F713 | 0x257 | 0x3F96A | no | no | ............W................................................... | +| 104 | 0xF18 | 0x3F96A | 0x257 | 0x3FBC1 | no | no | ............W................................................... | +| 105 | 0xF20 | 0x3FBC1 | 0x257 | 0x3FE18 | no | no | ............W................................................... | +| 106 | 0xF28 | 0x3F4BC | 0x257 | 0x3F713 | no | no | ............W................................................... | +| 107 | 0xF30 | 0x40E97 | 0x1DB | 0x41072 | no | no | ................5............................................... | +| 108 | 0xF38 | 0x3D103 | 0x2CC | 0x3D3CF | no | no | ................&............................................... | +| 109 | 0xF40 | 0x18867 | 0x2A8 | 0x18B0F | no | no | ................Z............................................... | +| 110 | 0xF48 | 0x19469 | 0x641 | 0x19AAA | no | no | ....m.......A...K............................................... | +| 111 | 0xF68 | 0x86E9D | 0xB8E | 0x87A2B | no | no | ..........................................................M..... | +| 112 | 0xF70 | 0x41072 | 0x1DB | 0x4124D | no | no | ................5............................................... | +| 113 | 0xF78 | 0x4088F | 0x379 | 0x40C08 | no | no | ............y...+................................."............. | +| 114 | 0xFA0 | 0x60D39 | 0x2AA | 0x60FE3 | no | no | ................................................................ | +| 115 | 0x1020 | 0x61188 | 0x1A5 | 0x6132D | no | no | ................................................................ | +| 116 | 0x1028 | 0x60FE3 | 0x1A5 | 0x61188 | no | no | ................................................................ | +| 117 | 0x1038 | 0x1215D | 0x4A7 | 0x12604 | no | no | ................Y............................................... | +| 118 | 0x1068 | 0x5AF4B | 0x2AA | 0x5B1F5 | no | no | ................................................................ | +| 119 | 0x1088 | 0x41D58 | 0x168 | 0x41EC0 | no | no | ............h................................................... | +| 120 | 0x1090 | 0x41BF0 | 0x168 | 0x41D58 | no | no | ............h................................................... | +| 121 | 0x1120 | 0x57D7A | 0x403 | 0x5817D | no | no | ..../...........]............................................... | +| 122 | 0x1128 | 0x57977 | 0x403 | 0x57D7A | no | no | ..../...........]............................................... | +| 123 | 0x1178 | 0x13158 | 0x173 | 0x132CB | no | no | ............s................................................... | +| 124 | 0x1180 | 0x2CD6A | 0xFE0 | 0x2DD4A | no | no | ........................................................u....... | +| 125 | 0x11C8 | 0x209E5 | 0x159 | 0x20B3E | no | no | ............Y...........................................N.8..... | +| 126 | 0x11D0 | 0x20B3E | 0x159 | 0x20C97 | no | no | ............Y...........................................N.8..... | +| 127 | 0x11E8 | 0x29C98 | 0x170 | 0x29E08 | no | no | ............p................................................... | +| 128 | 0x11F0 | 0x1C9E6 | 0x2E4 | 0x1CCCA | no | no | ................................................................ | +| 129 | 0x11F8 | 0x4DF86 | 0x389 | 0x4E30F | no | no | ................;............................................... | +| 130 | 0x1318 | 0x69770 | 0x1B9 | 0x69929 | no | no | ................k...........................j................... | +| 131 | 0x1330 | 0x5E523 | 0x159 | 0x5E67C | no | no | ............Y...........................................[....... | +| 132 | 0x1348 | 0x13917 | 0x1B4 | 0x13ACB | no | no | ................f............................................... | +| 133 | 0x1350 | 0x13763 | 0x1B4 | 0x13917 | no | no | ................f............................................... | +| 134 | 0x1388 | 0x31B60 | 0x2E1 | 0x31E41 | no | no | ........................................................]....... | +| 135 | 0x1390 | 0x3188E | 0x2D2 | 0x31B60 | no | no | ........................................................N....... | +| 136 | 0x1418 | 0x79DFF | 0x126 | 0x79F25 | no | no | ....R.......&................................................... | +| 137 | 0x1468 | 0x37E09 | 0x351 | 0x3815A | no | no | ....}.......Q...........................................}....... | +| 138 | 0x1510 | 0x2EF77 | 0x1FB | 0x2F172 | no | no | ....'........................................................... | +| 139 | 0x1520 | 0x1CFAE | 0x2E4 | 0x1D292 | no | no | ................................................................ | +| 140 | 0x1528 | 0x1CCCA | 0x2E4 | 0x1CFAE | no | no | ................................................................ | +| 141 | 0x1530 | 0x42064 | 0x1A4 | 0x42208 | no | no | ................................................................ | +| 142 | 0x1580 | 0x42208 | 0x152 | 0x4235A | no | no | ....~.......R.....................................I............. | +| 143 | 0x1588 | 0x3483F | 0x21D | 0x34A5C | no | no | ....I...........w.......................................I....... | +| 144 | 0x15A8 | 0x60BB8 | 0x181 | 0x60D39 | no | no | ................................................................ | +| 145 | 0x15E8 | 0x3B90A | 0x253 | 0x3BB5D | no | no | ............S................................................... | +| 146 | 0x15F8 | 0x3BB5D | 0x253 | 0x3BDB0 | no | no | ............S................................................... | +| 147 | 0x1600 | 0x41EC0 | 0x1A4 | 0x42064 | no | no | ................................................................ | +| 148 | 0x1628 | 0x5CBA1 | 0x215 | 0x5CDB6 | no | no | ....A...........o.......................................A....... | +| 149 | 0x16A8 | 0x14D32 | 0x316 | 0x15048 | no | no | ....B...........(.................................^.....^....... | +| 150 | 0x16B0 | 0x14A1C | 0x316 | 0x14D32 | no | no | ....B...........(.................................^.....^....... | +| 151 | 0x16D8 | 0x132CB | 0x27C | 0x13547 | no | no | ............/.............................................9..... | +| 152 | 0x16E0 | 0x5CDB6 | 0x215 | 0x5CFCB | no | no | ....A...........o.......................................A....... | +| 153 | 0x16E8 | 0x542AD | 0x13F | 0x543EC | no | no | ....k.......?................................................... | +| 154 | 0x1770 | 0x5E11B | 0x2AF | 0x5E3CA | no | no | ................................................................ | +| 155 | 0x1780 | 0x3E966 | 0x133 | 0x3EA99 | no | no | ...._.......3..........................................._....... | +| 156 | 0x1788 | 0x1BEC8 | 0x11B | 0x1BFE3 | no | no | ....G...........u............................................... | +| 157 | 0x1790 | 0x5A491 | 0x2BE | 0x5A74F | no | no | ................................................................ | +| 158 | 0x1798 | 0x59FED | 0x4A4 | 0x5A491 | no | no | ................V.......................................j....... | +| 159 | 0x17B8 | 0x4E958 | 0x376 | 0x4ECCE | no | no | ............v...(............................................... | +| 160 | 0x17C8 | 0x4F044 | 0x376 | 0x4F3BA | no | no | ............v...(............................................... | +| 161 | 0x17D0 | 0x4ECCE | 0x376 | 0x4F044 | no | no | ............v...(............................................... | +| 162 | 0x1810 | 0x6B1AF | 0x2D2 | 0x6B481 | no | no | ........................................................N....... | +| 163 | 0x1828 | 0x3815A | 0x351 | 0x384AB | no | no | ....}.......Q...........................................}....... | +| 164 | 0x1838 | 0x40774 | 0x11B | 0x4088F | no | no | ....G...........u............................................... | +| 165 | 0x1840 | 0x1AF19 | 0x11B | 0x1B034 | no | no | ....G...........u............................................... | +| 166 | 0x1848 | 0x4CAD8 | 0x11B | 0x4CBF3 | no | no | ....G...........u............................................... | +| 167 | 0x1878 | 0x3985A | 0x11B | 0x39975 | no | no | ....G...........u............................................... | +| 168 | 0x18E0 | 0x37A74 | 0x133 | 0x37BA7 | no | no | ...._.......3..........................................._....... | +| 169 | 0x18E8 | 0x3780E | 0x133 | 0x37941 | no | no | ...._.......3..........................................._....... | +| 170 | 0x1928 | 0x13547 | 0x21C | 0x13763 | no | no | ....H...........v.......................................H....... | +| 171 | 0x1930 | 0x1082E | 0x599 | 0x10DC7 | no | no | ................................................................ | +| 172 | 0x1940 | 0x18237 | 0x630 | 0x18867 | no | no | ....\.......0...:............................................... | +| 173 | 0x1950 | 0x1DB7A | 0x2DE | 0x1DE58 | no | no | ................8............................................... | +| 174 | 0x1958 | 0x39975 | 0x11B | 0x39A90 | no | no | ....G...........u............................................... | +| 175 | 0x1978 | 0x1A79B | 0x10C | 0x1A8A7 | no | no | ....8...........f.........8..................................... | +| 176 | 0x1980 | 0x1A68F | 0x10C | 0x1A79B | no | no | ....8...........f.........8..................................... | +| 177 | 0x19D8 | 0x31548 | 0x1A3 | 0x316EB | no | no | ................................................................ | +| 178 | 0x19E0 | 0x316EB | 0x1A3 | 0x3188E | no | no | ................................................................ | +| 179 | 0x1A40 | 0x2ED7C | 0x1FB | 0x2EF77 | no | no | ....'........................................................... | +| 180 | 0x1A48 | 0x72184 | 0x6C2 | 0x72846 | no | no | ................$.......................................a.S..... | +| 181 | 0x1A50 | 0x63B9A | 0x13F | 0x63CD9 | no | no | ....k.......?................................................... | +| 182 | 0x1A58 | 0x2A6DB | 0x251 | 0x2A92C | no | no | ....}.......Q.............d..................................... | +| 183 | 0x1A70 | 0x4C9DA | 0xFE | 0x4CAD8 | no | no | ....*...........X............................................... | +| 184 | 0x1AA8 | 0x391EF | 0x164 | 0x39353 | no | no | ............d.....................................H.I...H....... | +| 185 | 0x1AB0 | 0x58A3D | 0x11B | 0x58B58 | no | no | ....G...........u............................................... | +| 186 | 0x1AC0 | 0x56920 | 0xC64 | 0x57584 | no | no | ............d...v.................................a.$.....;..... | +| 187 | 0x1AF8 | 0x50111 | 0x366 | 0x50477 | no | no | ............f................................................... | +| 188 | 0x1B18 | 0x4179F | 0x20C | 0x419AB | no | no | ....8...........f.........8..................................... | +| 189 | 0x1B90 | 0x1D610 | 0x56A | 0x1DB7A | no | no | ............j...t............................................... | +| 190 | 0x1B98 | 0x2F49E | 0x20AA | 0x31548 | no | no | ............. ...!.............................................. | +| 191 | 0x1BA8 | 0x4C347 | 0x3A8 | 0x4C6EF | no | no | ................Z............................................... | +| 192 | 0x1BB0 | 0x4DC8C | 0x1FC | 0x4DE88 | no | no | ....(...........V.......................................(....... | +| 193 | 0x1BB8 | 0x1DE58 | 0x34B | 0x1E1A3 | no | no | ....w.......K...........................................w....... | +| 194 | 0x1BC0 | 0x4C6EF | 0x2EB | 0x4C9DA | no | no | ................E............................................... | +| 195 | 0x1BC8 | 0x6AA63 | 0x47A | 0x6AEDD | no | no | ............z................................................... | +| 196 | 0x1C18 | 0x5F757 | 0x11B | 0x5F872 | no | no | ....G...........u............................................... | +| 197 | 0x1C28 | 0x6AEDD | 0x2D2 | 0x6B1AF | no | no | ........................................................N....... | +| 198 | 0x1C88 | 0x5E3CA | 0x159 | 0x5E523 | no | no | ............Y...........................................[....... | +| 199 | 0x1CA0 | 0x11169 | 0x34D | 0x114B6 | no | no | ....y.......M................................................... | +| 200 | 0x1CA8 | 0x10713 | 0x11B | 0x1082E | no | no | ....G...........u............................................... | +| 201 | 0x1CB0 | 0x5B3AF | 0x11B | 0x5B4CA | no | no | ....G...........u............................................... | +| 202 | 0x1CB8 | 0x1ADEF | 0x12A | 0x1AF19 | no | no | ....V.......*................................................... | +| 203 | 0x1D18 | 0x5C9F4 | 0x1AD | 0x5CBA1 | no | no | ..................................................I.....[.6..... | +| 204 | 0x1D48 | 0x5C86A | 0x18A | 0x5C9F4 | no | no | ................<............................................... | +| 205 | 0x1D58 | 0x38E1F | 0x2D2 | 0x390F1 | no | no | ........................................................N....... | +| 206 | 0x1D60 | 0x3CADA | 0x629 | 0x3D103 | no | no | ....U.......)................................................... | +| 207 | 0x1D68 | 0x15048 | 0x106A | 0x160B2 | no | no | ............j................................................... | +| 208 | 0x1D70 | 0x3695E | 0x800 | 0x3715E | no | no | ....,...........Z.........,..................................... | +| 209 | 0x1D98 | 0x38B4D | 0x2D2 | 0x38E1F | no | no | ........................................................N....... | +| 210 | 0x1DC0 | 0x2BCD2 | 0x1E2 | 0x2BEB4 | no | no | ................................................................ | +| 211 | 0x1DE0 | 0x5B4CA | 0x15B | 0x5B625 | no | no | ............[................................................... | +| 212 | 0x1DF0 | 0x6A21A | 0x132 | 0x6A34C | no | no | ....^.......2................................................... | +| 213 | 0x1E08 | 0x76E65 | 0x154 | 0x76FB9 | no | no | ............T................................................... | +| 214 | 0x1E10 | 0x749D0 | 0x154 | 0x74B24 | no | no | ............T................................................... | +| 215 | 0x1E18 | 0x7487C | 0x154 | 0x749D0 | no | no | ............T................................................... | +| 216 | 0x1E30 | 0x745D4 | 0x154 | 0x74728 | no | no | ............T................................................... | +| 217 | 0x1E38 | 0x74728 | 0x154 | 0x7487C | no | no | ............T................................................... | +| 218 | 0x1E40 | 0x76D11 | 0x154 | 0x76E65 | no | no | ............T................................................... | +| 219 | 0x1E68 | 0x419AB | 0x245 | 0x41BF0 | no | no | ....q.......E.............q..................................... | +| 220 | 0x1E70 | 0x4CE26 | 0x3F7 | 0x4D21D | no | no | ....#...........Q.........#..................................... | +| 221 | 0x1E98 | 0x37CD7 | 0x132 | 0x37E09 | no | no | ....^.......2...........................................^....... | +| 222 | 0x1F00 | 0x53246 | 0x401 | 0x53647 | no | no | ....-........................................................... | +| 223 | 0x1F28 | 0x53647 | 0x402 | 0x53A49 | no | no | ................................................................ | +| 224 | 0x1FC8 | 0x73294 | 0x1D7 | 0x7346B | no | no | ..........................................................8..... | +| 225 | 0x1FD0 | 0x730B0 | 0x1E4 | 0x73294 | no | no | ..........................................................8..... | +| 226 | 0x1FF8 | 0x4F72C | 0x41F | 0x4FB4B | no | no | ....K...........y.........K..................................... | +| 227 | 0x2050 | 0x58C88 | 0x130 | 0x58DB8 | no | no | ....\.......0...........................................\....... | +| 228 | 0x2088 | 0x58B58 | 0x130 | 0x58C88 | no | no | ....\.......0...........................................\....... | +| 229 | 0x20A8 | 0x33B37 | 0x790 | 0x342C7 | no | no | ................................................................ | +| 230 | 0x2128 | 0x2BEB4 | 0x1E2 | 0x2C096 | no | no | ................................................................ | +| 231 | 0x2220 | 0x40C08 | 0x28F | 0x40E97 | no | no | ................................................................ | +| 232 | 0x2228 | 0x1D292 | 0x1BF | 0x1D451 | no | no | ................................................................ | +| 233 | 0x2230 | 0x1D451 | 0x1BF | 0x1D610 | no | no | ................................................................ | +| 234 | 0x2238 | 0x7C2AD | 0x1A2 | 0x7C44F | no | no | ................................................................ | +| 235 | 0x2268 | 0x33867 | 0x168 | 0x339CF | no | no | ............h...........................................].8..... | +| 236 | 0x2278 | 0x517FA | 0x6D2 | 0x51ECC | no | no | ........................................................6....... | +| 237 | 0x2280 | 0x4AA07 | 0x487 | 0x4AE8E | no | no | ................................................................ | +| 238 | 0x22A0 | 0x69C17 | 0x603 | 0x6A21A | no | no | ..../........................................................... | +| 239 | 0x22A8 | 0x14134 | 0x8E8 | 0x14A1C | no | no | ..................................................^.....^....... | +| 240 | 0x22B0 | 0x4FF09 | 0x208 | 0x50111 | no | no | ....4...........b............................................... | +| 241 | 0x22C8 | 0x6934F | 0x2A9 | 0x695F8 | no | no | ................................................................ | +| 242 | 0x22E8 | 0x3C73F | 0x1EF | 0x3C92E | no | no | ................I............................................... | +| 243 | 0x22F0 | 0x3C550 | 0x1EF | 0x3C73F | no | no | ................I............................................... | +| 244 | 0x22F8 | 0x72C7B | 0x435 | 0x730B0 | no | no | ....a.......5...?.......................................p....... | +| 245 | 0x2300 | 0x72846 | 0x435 | 0x72C7B | no | no | ....a.......5...?.......................................p....... | +| 246 | 0x2308 | 0x2E2D1 | 0x6B2 | 0x2E983 | no | no | ..........................r..................................... | +| 247 | 0x2320 | 0x5D873 | 0x8A8 | 0x5E11B | no | no | ................Z.........L..................................... | +| 248 | 0x2348 | 0x5CFCB | 0x8A8 | 0x5D873 | no | no | ................Z.........L..................................... | +| 249 | 0x2358 | 0x59DF3 | 0x1FA | 0x59FED | no | no | ....&........................................................... | +| 250 | 0x2360 | 0x59A3B | 0x1FA | 0x59C35 | no | no | ....&........................................................... | +| 251 | 0x2368 | 0x864BF | 0x4B6 | 0x86975 | no | no | ..........................*..................................... | +| 252 | 0x2370 | 0x6A34C | 0x5ED | 0x6A939 | no | no | ................................................................ | +| 253 | 0x2378 | 0x7C7D7 | 0x13F | 0x7C916 | no | no | ....k.......?................................................... | +| 254 | 0x23C0 | 0x3F1F2 | 0x165 | 0x3F357 | no | no | ............e................................................... | +| 255 | 0x23C8 | 0x3F357 | 0x165 | 0x3F4BC | no | no | ............e................................................... | +| 256 | 0x2448 | 0xFC90 | 0x3E4 | 0x10074 | no | no | ................................................................ | +| 257 | 0x2650 | 0x160B2 | 0x189 | 0x1623B | no | no | ................................................................ | +| 258 | 0x2658 | 0x29E08 | 0x257 | 0x2A05F | no | no | ............W.............d. ................................... | +| 259 | 0x2660 | 0x2A05F | 0x257 | 0x2A2B6 | no | no | ............W.............d. ................................... | +| 260 | 0x2668 | 0x2ACE1 | 0x257 | 0x2AF38 | no | no | ............W.............d. ................................... | +| 261 | 0x2670 | 0x2AF38 | 0x257 | 0x2B18F | no | no | ............W.............d. ................................... | +| 262 | 0x2678 | 0x2B18F | 0x257 | 0x2B3E6 | no | no | ............W.............d. ................................... | +| 263 | 0x2680 | 0x2B63D | 0x257 | 0x2B894 | no | no | ............W.............d. ................................... | +| 264 | 0x2688 | 0x2B3E6 | 0x257 | 0x2B63D | no | no | ............W.............d. ................................... | +| 265 | 0x2690 | 0x2BB9A | 0x138 | 0x2BCD2 | no | no | ....d.......8.............d..................................... | +| 266 | 0x26A0 | 0x2A2B6 | 0x1CE | 0x2A484 | no | no | ................(............................................... | +| 267 | 0x26B0 | 0x2B894 | 0x1CE | 0x2BA62 | no | no | ................(............................................... | +| 268 | 0x26B8 | 0x2BA62 | 0x138 | 0x2BB9A | no | no | ....d.......8.............d..................................... | +| 269 | 0x26C0 | 0x5F872 | 0xD6E | 0x605E0 | no | no | ............n...(.........Q..................................... | +| 270 | 0x26D0 | 0x12604 | 0x442 | 0x12A46 | no | no | ....n.......B...T.......................................N....... | +| 271 | 0x26D8 | 0x643D9 | 0x552 | 0x6492B | no | no | ....x.......R................................................... | +| 272 | 0x26E0 | 0x5B625 | 0x80E | 0x5BE33 | no | no | ................................................................ | +| 273 | 0x26F8 | 0x68FF3 | 0x35C | 0x6934F | no | no | ............\................................................... | +| 274 | 0x2710 | 0x498D7 | 0x5A3 | 0x49E7A | no | no | ................U............................................... | +| 275 | 0x2718 | 0x2E192 | 0x13F | 0x2E2D1 | no | no | ....k.......?................................................... | +| 276 | 0x2720 | 0x2A484 | 0x257 | 0x2A6DB | no | no | ............W.............d. ................................... | +| 277 | 0x2728 | 0x3BFAC | 0xFE | 0x3C0AA | no | no | ....*...........X.........*..................................... | +| 278 | 0x2730 | 0x1EB10 | 0x1488 | 0x1FF98 | no | no | ................................................................ | +| 279 | 0x2738 | 0x5ACB7 | 0x294 | 0x5AF4B | no | no | ................F............................................... | +| 280 | 0x2740 | 0x3BEAE | 0xFE | 0x3BFAC | no | no | ....*...........X.........*..................................... | +| 281 | 0x2758 | 0x39C81 | 0x162 | 0x39DE3 | no | no | ............b................................................... | +| 282 | 0x2760 | 0x2ABA9 | 0x138 | 0x2ACE1 | no | no | ....d.......8.............d..................................... | +| 283 | 0x2768 | 0x52B90 | 0x6B6 | 0x53246 | no | no | ................................................................ | +| 284 | 0x2780 | 0x8575F | 0xD60 | 0x864BF | no | no | ....z.......`................................................... | +| 285 | 0x27A0 | 0x5926C | 0x18C | 0x593F8 | no | no | ................................................................ | +| 286 | 0x27A8 | 0x5A9B7 | 0x300 | 0x5ACB7 | no | no | ....,...........Z............................................... | +| 287 | 0x27B0 | 0x2A92C | 0x27D | 0x2ABA9 | no | no | ............}.../........... ................................... | +| 288 | 0x27C0 | 0x6A939 | 0x12A | 0x6AA63 | no | no | ....V.......*................................................... | +| 289 | 0x27C8 | 0x1FF98 | 0x29F | 0x20237 | no | no | ................................................................ | +| 290 | 0x27F0 | 0x5152D | 0x2CD | 0x517FA | no | no | ................................................................ | +| 291 | 0x2808 | 0x1623B | 0x51D | 0x16758 | no | no | ....I........................................................... | +| 292 | 0x2810 | 0x3B6B7 | 0x253 | 0x3B90A | no | no | ............S................................................... | +| 293 | 0x2860 | 0x5E9D0 | 0x168 | 0x5EB38 | no | no | ............h...........................................].8..... | +| 294 | 0x2870 | 0x31E41 | 0x414 | 0x32255 | no | no | ....:........................................................... | +| 295 | 0x2888 | 0x4DAD9 | 0x1B3 | 0x4DC8C | no | no | ................................................................ | +| 296 | 0x2890 | 0x5ECA0 | 0x7E3 | 0x5F483 | no | no | ................................................................ | +| 297 | 0x28E0 | 0x339CF | 0x168 | 0x33B37 | no | no | ............h...........................................].8..... | +| 298 | 0x2918 | 0x5EB38 | 0x168 | 0x5ECA0 | no | no | ............h...........................................].8..... | +| 299 | 0x2940 | 0x7BB06 | 0x168 | 0x7BC6E | no | no | ............h...........................................].8..... | +| 300 | 0x29B8 | 0x7BC6E | 0x215 | 0x7BE83 | no | no | ....A...........o.......................................A....... | +| 301 | 0x29C0 | 0x7C098 | 0x215 | 0x7C2AD | no | no | ....A...........o.......................................A....... | +| 302 | 0x29C8 | 0x7BE83 | 0x215 | 0x7C098 | no | no | ....A...........o.......................................A....... | +| 303 | 0x29D0 | 0x2C096 | 0x13F | 0x2C1D5 | no | no | ....k.......?................................................... | +| 304 | 0x29F8 | 0x58766 | 0x2D7 | 0x58A3D | no | no | ..........................w..................................... | +| 305 | 0x2A00 | 0x3BDB0 | 0xFE | 0x3BEAE | no | no | ....*...........X.........*..................................... | +| 306 | 0x2A08 | 0x4DE88 | 0xFE | 0x4DF86 | no | no | ....*...........X.........*..................................... | +| 307 | 0x2A10 | 0x390F1 | 0xFE | 0x391EF | no | no | ....*...........X.........*..................................... | +| 308 | 0x2A98 | 0x384AB | 0x351 | 0x387FC | no | no | ....}.......Q...........................................}....... | +| 309 | 0x2AA0 | 0x387FC | 0x351 | 0x38B4D | no | no | ....}.......Q...........................................}....... | +| 310 | 0x2AB0 | 0x4FB4B | 0x27C | 0x4FDC7 | no | no | ............/................................................... | +| 311 | 0x2AB8 | 0x4FDC7 | 0x142 | 0x4FF09 | no | no | ....n.......B...............................n................... | +| 312 | 0x2AD8 | 0x5817D | 0x5E9 | 0x58766 | no | no | ................C............................................... | +| 313 | 0x2AE0 | 0x1BCD6 | 0x1F2 | 0x1BEC8 | no | no | ..........................f..................................... | +| 314 | 0x2AE8 | 0x1BAE4 | 0x1F2 | 0x1BCD6 | no | no | ..........................f..................................... | +| 315 | 0x2AF8 | 0x7CCF5 | 0x257 | 0x7CF4C | no | no | ............W.............d. ................................... | +| 316 | 0x2B08 | 0x1B577 | 0x56D | 0x1BAE4 | no | no | ............m.............w.#..........................."....... | +| 317 | 0x2B10 | 0x1B034 | 0x543 | 0x1B577 | no | no | ....o.......C.............M.#..........................."....... | +| 318 | 0x2B78 | 0x7C916 | 0x257 | 0x7CB6D | no | no | ............W.............d. ................................... | +| 319 | 0x2B88 | 0x20DF0 | 0x4C4 | 0x212B4 | no | no | ................................................................ | +| 320 | 0x2B90 | 0x1E1A3 | 0x96D | 0x1EB10 | no | no | ............m...w...........J.....................I............. | +| 321 | 0x2B98 | 0x10074 | 0x25F | 0x102D3 | no | no | ............_................................................... | +| 322 | 0x2BB0 | 0x2F308 | 0x196 | 0x2F49E | no | no | ................................................................ | +| 323 | 0x2BB8 | 0x2F172 | 0x196 | 0x2F308 | no | no | ................................................................ | +| 324 | 0x2BC0 | 0x64059 | 0x380 | 0x643D9 | no | no | ................................................................ | +| 325 | 0x2BC8 | 0x63CD9 | 0x380 | 0x64059 | no | no | ................................................................ | +| 326 | 0x2BF0 | 0x55CBC | 0xC64 | 0x56920 | no | no | ............d...v.................................a.$.....;..... | +| 327 | 0x2C40 | 0x3C92E | 0x1AC | 0x3CADA | no | no | ................^............................................... | +| 328 | 0x2C98 | 0x1051F | 0x1F4 | 0x10713 | no | no | .... ...........N............................................... | +| 329 | 0x2CA0 | 0x2E983 | 0x2DE | 0x2EC61 | no | no | ................8............................................... | +| 330 | 0x2CC0 | 0x55058 | 0xC64 | 0x55CBC | no | no | ............d...v.................................a.$.....;..... | +| 331 | 0x2CE8 | 0x543EC | 0xC6C | 0x55058 | no | no | ............l...~.................................a.,.....C..... | +| 332 | 0x2D08 | 0x76A01 | 0x188 | 0x76B89 | no | no | ................:............................................... | +| 333 | 0x2D40 | 0x76B89 | 0x188 | 0x76D11 | no | no | ................:............................................... | +| 334 | 0x2D70 | 0x7CB6D | 0x188 | 0x7CCF5 | no | no | ................:............................................... | +| 335 | 0x2D80 | 0x80661 | 0x159 | 0x807BA | no | no | ............Y...........................................N.8..... | +| 336 | 0x2D88 | 0x7C44F | 0x1C4 | 0x7C613 | no | no | ................................................................ | +| 337 | 0x2D90 | 0x7C613 | 0x1C4 | 0x7C7D7 | no | no | ................................................................ | +| 338 | 0x2DA0 | 0x807BA | 0x159 | 0x80913 | no | no | ............Y...........................................N.8..... | +| 339 | 0x4098 | 0x10DC7 | 0x3A2 | 0x11169 | no | no | ....................*.+...*.................Z.U................. | +| 340 | 0x4890 | 0x64C2B | 0x228 | 0x64E53 | no | no | ....T.......(................................................... | +| 341 | 0x4898 | 0x4CBF3 | 0x233 | 0x4CE26 | no | no | ...._.......3................................................... | +| 342 | 0x48A0 | 0x342C7 | 0x578 | 0x3483F | no | no | ............x...*............................................... | +| 343 | 0x48A8 | 0x4A2AE | 0x387 | 0x4A635 | no | no | ................9.............................................L. | +| 344 | 0x48B0 | 0x1AC3A | 0x1B5 | 0x1ADEF | no | no | ................................................................ | +| 345 | 0x48B8 | 0x18B0F | 0x313 | 0x18E22 | no | no | ....?........................................................... | +| 346 | 0x48C0 | 0x58DB8 | 0x186 | 0x58F3E | no | no | ................................................................ | +| 347 | 0x48C8 | 0x50477 | 0x10B6 | 0x5152D | no | no | ............................................Q................... | +| 348 | 0x48D0 | 0x6132D | 0x222 | 0x6154F | no | no | ....N.......".../.............................................N. | +| 349 | 0x48D8 | 0x39353 | 0x233 | 0x39586 | no | no | ...._.......3................................................._. | +| 350 | 0x48E0 | 0x29A1A | 0x27E | 0x29C98 | no | no | ............~.................................................I. | +| 351 | 0x48E8 | 0x12FE6 | 0x172 | 0x13158 | no | no | ............r................................................... | +| 352 | 0x48F0 | 0x3D700 | 0x18F | 0x3D88F | no | no | ................................................................ | +| 353 | 0x48F8 | 0x4331A | 0x1483 | 0x4479D | no | no | ..............................................^................. | +| 354 | 0x4900 | 0x4479D | 0x22DC | 0x46A79 | no | no | .....!......."...'..........................3.................3. | +| 355 | 0x4908 | 0x46A79 | 0x21F | 0x46C98 | no | no | ....K.......................................3................... | +| 356 | 0x4910 | 0x46C98 | 0x2A2 | 0x46F3A | no | no | ..............................................9...............f. | +| 357 | 0x4918 | 0x46F3A | 0xA64 | 0x4799E | no | no | ............d...n...........................3.................l. | +| 358 | 0x4920 | 0x4799E | 0x7D5 | 0x48173 | no | no | ................7...........................3................... | +| 359 | 0x4928 | 0x48173 | 0x13E | 0x482B1 | no | no | ....j.......>...............................j................... | +| 360 | 0x4930 | 0x482B1 | 0x949 | 0x48BFA | no | no | ....o.......I...S...........................3.................c. | +| 361 | 0x4938 | 0x48BFA | 0x5FD | 0x491F7 | no | no | ....#.......................................3.................c. | +| 362 | 0x4940 | 0x4235A | 0x1B2 | 0x4250C | no | no | ................d...........................3................... | +| 363 | 0x4948 | 0x4250C | 0x1D8 | 0x426E4 | no | no | ............................................3................... | +| 364 | 0x4950 | 0x426E4 | 0x1FB | 0x428DF | no | no | ....'.......................................3................... | +| 365 | 0x4958 | 0x428DF | 0x690 | 0x42F6F | no | no | ............................................3.................u. | +| 366 | 0x4960 | 0x42F6F | 0x3AB | 0x4331A | no | no | ................].............................Y...............X. | +| 367 | 0x4968 | 0x86975 | 0x528 | 0x86E9D | no | no | ....T.......(................................................... | +| 368 | 0x4970 | 0x4A909 | 0xFE | 0x4AA07 | no | no | ....*...........X.............................................*. | +| 369 | 0x4978 | 0x76FB9 | 0x1CD | 0x77186 | no | no | ................'............................................... | +| 370 | 0x5090 | 0x114B6 | 0x575 | 0x11A2B | no | no | ............u................................................... | +| 371 | 0x5098 | 0x12A46 | 0x5A0 | 0x12FE6 | no | no | ................................................................ | +| 372 | 0x50A0 | 0x13ACB | 0x669 | 0x14134 | no | no | ............i................................................... | +| 373 | 0x50A8 | 0x16CEC | 0x1395 | 0x18081 | no | no | ................................................................ | +| 374 | 0x50B0 | 0x1BFE3 | 0x43B | 0x1C41E | no | no | ....a.......;................................................... | +| 375 | 0x50B8 | 0x20237 | 0x7AE | 0x209E5 | no | no | ................................................................ | +| 376 | 0x50C0 | 0x212B4 | 0x2128 | 0x233DC | no | no | ....< ......(!...".............................................. | +| 377 | 0x50C8 | 0x233DC | 0x41EF | 0x275CB | no | no | )...%@.......A...P.............................................. | +| 378 | 0x50D0 | 0x275CB | 0x244F | 0x29A1A | no | no | ....3#......O$..q(.............................................. | +| 379 | 0x50D8 | 0x2C1D5 | 0xB95 | 0x2CD6A | no | no | ................................................................ | +| 380 | 0x50E0 | 0x334C3 | 0xD4 | 0x33597 | no | no | ................................................................ | +| 381 | 0x50E8 | 0x33597 | 0x2D0 | 0x33867 | no | no | ................................................................ | +| 382 | 0x50F0 | 0x34A5C | 0x1F02 | 0x3695E | no | no | "...b............*.............................................. | +| 383 | 0x50F8 | 0x39DE3 | 0x18D4 | 0x3B6B7 | no | no | ................................................................ | +| 384 | 0x5100 | 0x3C228 | 0x328 | 0x3C550 | no | no | ....N.......(................................................... | +| 385 | 0x5108 | 0x3D3CF | 0x331 | 0x3D700 | no | no | ....W.......1................................................... | +| 386 | 0x5110 | 0x3EA99 | 0x4D5 | 0x3EF6E | no | no | ................................................................ | +| 387 | 0x5118 | 0x4AE8E | 0x13E5 | 0x4C273 | no | no | ................g............................................... | +| 388 | 0x5120 | 0x4C273 | 0xD4 | 0x4C347 | no | no | ................................................................ | +| 389 | 0x5128 | 0x593F8 | 0x485 | 0x5987D | no | no | ................7............................................... | +| 390 | 0x5130 | 0x5BE33 | 0xA37 | 0x5C86A | no | no | ....Q.......7...A............................................... | +| 391 | 0x5138 | 0x5E67C | 0x354 | 0x5E9D0 | no | no | ....t.......T................................................... | +| 392 | 0x5140 | 0x605E0 | 0x457 | 0x60A37 | no | no | ....w.......W................................................... | +| 393 | 0x5148 | 0x6154F | 0x252C | 0x63A7B | yes | no | ....@$......,%...&.............................................. | +| 394 | 0x5150 | 0x64E53 | 0x41A0 | 0x68FF3 | no | no | .....@.......A...F.............................................. | +| 395 | 0x5158 | 0x695F8 | 0x178 | 0x69770 | no | no | ............x................................................... | +| 396 | 0x5160 | 0x6B481 | 0x6D03 | 0x72184 | no | no | ,...'k.......m..%/.............................................. | +| 397 | 0x5168 | 0x7346B | 0x48C | 0x738F7 | no | no | ................................................................ | +| 398 | 0x5170 | 0x74B24 | 0x1EDD | 0x76A01 | no | no | ................................................................ | +| 399 | 0x5178 | 0x77898 | 0x2567 | 0x79DFF | yes | no | .....$......g%...%.............................................. | +| 400 | 0x5180 | 0x7A04B | 0x1ABB | 0x7BB06 | no | no | ................................................................ | +| 401 | 0x5188 | 0x7CF4C | 0x26A8 | 0x7F5F4 | yes | no | .....%.......&...'.............................................. | +| 402 | 0x5190 | 0x80913 | 0x4E4C | 0x8575F | no | no | ....lM......LN...N.............................................. | + +## Notes + +- The extractor now parses the validated FLX table directly: entry count at `0x54`, table at `0x80`, 8 bytes per entry. +- Overlapping declared sizes likely mean some entries are counts or record spans rather than exact chunk lengths. +- `.strings.txt` files are the main human-readable output for now; `.txt` files are emitted only for chunks that look text-like. +- `descriptor_index.tsv` summarizes guessed class labels, field names, and compact tag patterns for descriptor-like chunks. +- `descriptor_neighborhoods.tsv` captures local table neighborhoods around trigger/event-related classes such as `JELYHACK`, `NPCTRIG`, `CRUZTRIG`, `TRIGPAD`, and `SPECIAL`. +- `referent_anchor_event_graph.tsv` groups referent-bearing descriptors with nearby event-bearing neighbors so the attachment model can be inspected without ad hoc grepping. +- `jelyhack_island_graph.md` renders the first focused graph view for the `JELYHACK` / `JELYH2` neighborhood, marking likely event-bearing attachments such as `REE_BOOT`, `SURCAMEW`, and `SFXTRIG` when they appear within the local table window. +- `jelyhack_descriptor_compare.tsv` captures the first 16 header words, first 8 dwords, and a few odd printable markers for the core JELYHACK-island descriptors so structural similarity can be compared without raw hex dumps. +- `event_island_graph.md` renders the denser `EVENT` / `COR_BOOT` / `NPCTRIG` / `ROLL_NS` / `CRUZTRIG` island, which currently looks like the strongest event-explicit neighborhood outside the JELYHACK anchor case. +- `event_descriptor_compare.tsv` captures the same header-word and printable-marker comparison for the `EVENT` island so large event-bearing descriptors can be contrasted with neighboring trigger and referent records. +- `boot_frontier_graph.md` renders the upstream referent neighborhood feeding `AND_BOOT` / `BRO_BOOT`, which is currently the clearest unexplored boot-event frontier. +- `boot_family_compare.tsv` compares the five `_BOOT` event cores (`AND_BOOT`, `BRO_BOOT`, `COR_BOOT`, `VAR_BOOT`, `REE_BOOT`) by header words, markers, and field tags. +- `environmental_event_graph.md` renders the three hazard/event islands centered on `FLAMEBOX`, `NOSTRIL`, and `STEAMBOX`, each surrounded by its own referent-heavy local neighborhood. +- `environmental_family_compare.tsv` compares the environmental event trio so the shared hazard pattern (`referent,event,<hazard>,<hazard2>,direction,count`) can be contrasted directly. +- `callback_trigger_compare.tsv` compares `SURCAMNS` and `SURCAMEW` directly so the callback-only `eventTrigger` lane can be checked against the active `event` families without raw hex dumps. +- `event_family_index.tsv` and `event_family_summary.md` classify all current `event` and `eventTrigger` descriptors into reusable families such as boot-event cores, minimal event cores, environmental events, and callback-only surveillance triggers. diff --git a/USECODE/EUSECODE_extracted/all_strings.txt b/USECODE/EUSECODE_extracted/all_strings.txt new file mode 100644 index 0000000..10f8e21 --- /dev/null +++ b/USECODE/EUSECODE_extracted/all_strings.txt @@ -0,0 +1,11018 @@ +BLACK8 +RDOOR_N +BLACK16 +ALARM_EW +SMALLTAB +VALVE +MDOOR_E +ALARM_NS +RFANEW +FALLINGC +SWITCHEW +CONVEY_N +YR2X6EW +RDOOR_E +BOX_EW +BOX_NS +YR16X6EW +YR16X6NS +YR8X6NS +YR4X6NS +YR2X6NS +LUGGAGE +YR8X6EW +YR4X6EW +YR1X1 +uniB +PEPSIEW +GDOOR_E2 +CATWALK1 +GDOOR_N2 +PEPSINS +PANELNS +PANELEW +MDOOR_N +BARRELUP +SIGNEW +SIGNNS +RFANNS +RDOOR1_E +RDOOR2_E +RDOOR3_E +RDOOR4_E +RDOOR5_E +BROKENCW +STELEPAD +MONITNS +GATGUNNS +GTELEPAD +GATGUNEW +FASTSKIL +ELEVPLAT +CATWALK2 +LIFT +CONVEY_E +FFFLOOR +RECHAGNS +RECHFLNS +FIGHT_N2 +DEATHFL3 +BARRELS +BARRELNS +BARRELEW +BARRELNW +BARRELSE +RECHAGEW +RECHFLEW +G_POOL +Y_POOL +MONITEW +THERM +MALRM_NS +FIGHT_NS +FIGHT_N3 +FIGHT_N1 +RTELEPAD +MTELEPAD +FIGHT_E3 +FIGHT_E1 +FIGHT_E2 +PPLATE +PPLATE2 +FIGHT_EW +LAZERNS +LAZEREW +RADAR +RSTATION +JOHN +ENFORCER +CAMERACO +MOTION +CAMERANS +CAM_EW +CAM_NS +FUSREACT +TRANSFOR +SHOCKEW +FFFLOOR2 +SHOCKNS +L_NS-2 +L_NS-4 +SENTRY +L_NS-8 +L_NS-16 +L_EW-2 +L_EW-4 +L_EW-8 +L_EW-16 +MDESKEW +LASERI +BUBBLE +CAMERAEW +TELEPAD +MDESKNS +MBARREL +S_CHAIR +TARGETNS +TARGETEW +BART +SMALCHAI +MFAN_NS +MFAN_EW +SAFE_NS +SAFE_EW +BETTY +uni@ +ELEVATOR +DEATHFL1 +DEATHFL2 +D_BARREL +CONVFLR +PODBOY +VALUEBOX +STATICNS +BIGCOMNS +BIGCOMEW +EYECAMNS +EYECAMEW +MALRM_EW +GLASS_EW +ESPACE2 +CONV_NL +CONV_EL +MGR_NS +MINELET +FLORMINE +SWITCHNS +HOVER_EW +HOVER_NS +MGR_EW +SSBOX_EW +BLASERNS +BLASEREW +BETTYUP +SSBOX_NS +ROAMING +STABLE +LIFTPIT +CONGRESS +SICBOXNS +SICBFLNS +PRISBENC +PRISSIT +PRISLEAN +WALGUNNS +GLASS_NS +MAINTMAN +CHEMSUIT +OFFWORK +GUARD +GDOOR_N +GDOOR_E +BIGCAN +AND_BOOT +BRO_BOOT +CRUMORPH +GUARDSQ +CARD_NS +CARD_EW +EWALLEW +EWALLNS +ESPACE +WINDSURF +THERMATR +D_GUARD +OBSERVER +GRENADE +SCIENTIS +ROLL_NS +REB_COUP +MEDIKIT +COR_BOOT +EVENT +NPCTRIG +CRUZTRIG +NPC_ONLY +VMAIL +STORMTRO +WALGUNEW +STATICEW +BARDUDES +ANDROID +SOLDIER +CHEDITRO +SPIDWALK +SPIDPAD +GOVGUNNS +LANDMINE +BLASTPAC +FUSPAC +GOVGUNEW +EBRIDGE +SPANEL +VARGAS +SL_NS-16 +SL_NS-8 +SL_NS-4 +SL_EW-4 +SL_EW-8 +SL_EW-16 +MELF +GENERATR +RFANBADE +RFANBADN +WVENTNS +WVENTEW +REBEL_TV +SDOOR_N +SDOOR_E +FLAMEBOX +EBRIDGE2 +MCRATE +COPY_EW +COPY_NS +FLAME1 +REB_PAD +NOSTRIL +VARDESK +BLASER1 +REB_BOOT +UPPLATE +KEYPADNS +KEYPADEW +WSHOCKNS +WSHOCKEW +ELYDESK +SSWITCHN +SSWITCHE +SHOCKNS1 +SHOCKEW1 +WEA_BOOT +VAR_BOOT +COURIER +LWPLATE4 +LWPLATE8 +ALARMBOX +BLOOD +uniB +D_CHEM +D_CONG +D_MAINT +D_OWORK +D_SCIEN +D_STORM +D_SOLD +D_VARG +D_COUR +D_SUSAN +D_THERM +SURCAMNS +BASEGUN +TIMER +SPECIAL +TRIGPAD +MONSTER +ELITE +uniB +D_ESTORM +JELYHACK +DATALINK +SLIDEFLR +JELYH2 +HOFFMAN +D_HOFFMA +REE_BOOT +SURCAMEW +SFXTRIG +SKILLBOX +D_GURDSQ +VETRON +DEATHBOX +REB_GAR +BOUNCBOX +HOVER1 +STEAM1 +FADE +PHIR +STEAMBOX +FLAME2 +STEAM2 +FLAMELP +BBOX +GBOX_NS +GBOX_EW +EGRENADE +SCANNER +IONIC +PLASMA +GRAVITON +GLDIV_EW +GLDIV_NS +REBSNOR +REBWORK +SATARG +CHEST_ON +CHEST_OE +D_GRENAD +CHEST_NS +CHEST_EW +D_ENFORC +DETPAC +CRU_SPID +ALARMHAT +ETWALLNS +ETWALLEW +THRMBCKN +THRMBCKE +ROLL_EW +KORESH +ALRMTRIG +ENERGY +ROLLB_NS +ROLLB_EW +D_PLASMA +D_SKELET +D_EM_GUY +DEATHFL4 +DAMNLUGG +DAMNMCR8 +DEATHFL5 +AVATAR +TRIGEGG +ONCEEGG +FLOOR1 +MTAREGG +CHANGER +CAMERA +SECRTEGG +REB_EGG +TEST +GRENEGG +DOOREGG +BBTRIP +LAZEREGG +MISS1EGG +MISS2 +MISS3 +MISS4 +MISS5 +MISS6 +MISS7 +MISS8 +MISS9 +MISS10 +MISS11 +MISS12 +MISS13 +MISS14 +MISS15 +MUSIC +STEAMEGG +BARREL +BBETTY +BLASER +BRIDGE +CONVEYOR +DEATHFL +DOOR +DOOR2 +DOOR3 +ELEVAT +FLAGS +FLAME +FREE +HOVER +KEYPAD +LAZER +LITEWALL +NPCS +SHOCKER +SPIDER +STEAM +SWITCH +TEXTFILE +TRIGGER +VALBOX +WALLGUN +YELRAIL +NPCDEATH +TEXTFIL1 +ITEM +TEXTFIL2 +FLICTEST +ALARMBOX +referent +ALARMBOX +wx[: +ALARMBOX +referent +item +ALARMBOX +wx[X +]0QO +ALARMBOX +ALARMBOX +referent +ALARMHAT +t$t=t@[ +ALARMHAT +t$t=t:[# +t$t=t@[- +ALARMHAT +referent +item +ALARM_EW +referent +ALARM_NS +referent +ALRMTRIG +wx[ +ALRMTRIG +ALRMTRIG +ALRMTRIG +ALRMTRIG +referent +ANDROID +referent +AND_BOOT +AND_BOOT +AND_BOOT +AND_BOOT +AND_BOOT +AND_BOOT +AND_BOOT +AND_BOOT +referent +event +counter +AND_BOOT +$4Qb +t$t=t@[U +t% + + + +t$t=t@[` +t% + + + +AND_BOOT +AND_BOOT +AND_BOOT +AND_BOOT +AND_BOOT +referent +item +counter +AND_BOOT +referent +AVATAR +wx[E +referent +AVATAR +referent +AVATAR +referent +item +slot +counter +AVATAR +wx[_ +AVATAR +^ + $Q +^ + $Q +referent +BARDUDES +BARDUDES +BARDUDES +^ +2,Q +BARDUDES +BARDUDES +BARDUDES + + *Q@ +BARDUDES +BARDUDES +BARDUDES +referent +counter +BARREL +Y +d? +BARREL +ma0Q3 +$4Q + +$4Q + +$4Q + +$4Q + +$4Q + +BARREL +BARREL +BARREL +BARREL +BARREL +BARREL +BARREL +BARREL +referent +barrel +item2 +isYellowBarrel +isStandingBarrel +link +BARRELEW +BARRELEW +referent +BARRELNS +BARRELNS +referent +BARRELNW +BARRELNW +referent +BARRELS +BARRELS +referent +BARRELSE +BARRELSE +referent +BARRELUP +BARRELUP +referent +BART +BART +BART +BART +referent +counter +BART +wxS\ +BART +^ +2,Q +BART +BART +BART +BART +BART +BART +BART +BART +referent +counter +counter2 +rndNum +BASEGUN +referent +BASEGUN +referent +BASEGUN +wx[' +referent +BASEGUN +wx[. +referent +BASEGUN +wx[4 +BASEGUN +Y? +N< +BASEGUN +referent +BASEGUN +wx[@ + + $[F +$4Q~ +BASEGUN +referent +item +BBETTY +BBETTY +referent +item +counter +counter2 +total +zZ \ +BBETTY +BBETTY +BBETTY +BBETTY +referent +counter +item3 +BBETTY +referent +BBTRIP +wxt$t=t@[ +t% +2 + +^0Q& +BBTRIP +referent +item +bbetty +BETTY +? +QF +referent +BETTYUP +referent +BETTYUP +BETTYUP +ma0Q +referent +item +BETTYUP +wx[/ +? +QF +referent +BIGCAN +BIGCAN +BIGCAN +referent +fram +BIGCOMEW +BIGCOMEW +referent +fram +BIGCOMEW +referent +BIGCOMNS +BIGCOMNS +referent +fram +BIGCOMNS +referent +BLASER + +2 + +$2Q( +BLASER +referent +laserList +item +inFastArea +count +link +BLASER +BLASER +BLASER +referent +BLASER1 +referent +BLASER1 +wx[$ +referent +BLASER1 +wx[4 +referent +BLASER1 +wx[; +referent +BLASER1 +wx[@ +BLASER1 +referent +BLASER1 +wx[E +BLASER1 +referent +BLASER1 +t$t=t@[W +t% +F + +$2QI +BLASER1 +referent +laserList +item +inFastArea +count +link +BLASER1 +BLASER1 +BLASER1 +referent +BLASEREW +referent +BLASEREW +referent +BLASEREW +wx[, +referent +BLASEREW +wx[5 +referent +BLASEREW +wx[: +BLASEREW +referent +BLASEREW +wx[? +BLASEREW +referent +BLASERNS +referent +BLASERNS +referent +BLASERNS +wx[+ +referent +BLASERNS +wx[3 +referent +BLASERNS +wx[8 +BLASERNS +referent +BLASERNS +wx[= +BLASERNS +referent +BLASTPAC +BLASTPAC +t$t=t@[ +62Q^ +BLASTPAC +BLASTPAC +] + $Q +] + +$Q +] + $Q +] +(y< +BLASTPAC +BLASTPAC +BLASTPAC +] +)y< +BLASTPAC +BLASTPAC +BLASTPAC +BLASTPAC +BLASTPAC +referent +InCrouch +Blastpac +target +item +counter +lastAnim +xOff +yOff +mine + BLASTPAC +BLASTPAC +BLASTPAC + +3K + +BLASTPAC +BLASTPAC +t$t=t@[ +t% +2 + +BLASTPAC +t$t=t@[ +t% +2 + +BLASTPAC +BLASTPAC +t$t=t@[ +t% +2 + +BLASTPAC +BLASTPAC +BLASTPAC +t$t=t@[ +t% +2 + +BLASTPAC +Y + + + +BLASTPAC +BLASTPAC +BLASTPAC + +2 + +BLASTPAC +t$t=t@[ +t% +2 + +t$t=t@[ +t% +2 + +BLASTPAC +t$[& +tB[' + +2 + +BLASTPAC +BLASTPAC +t$t=t@[4 +t% +2 + +BLASTPAC +BLASTPAC +BLASTPAC +BLASTPAC +t$[L +tB[M + +2 + +BLASTPAC +t$t=t@[[ +t% +2 + +BLASTPAC +t$t=t@[b +t% +2 + +BLASTPAC +t$t=t@[n +t% +2 + +BLASTPAC +t$t=t@[x +t% +2 + +BLASTPAC +referent +item +counter +therm +thermTop +radar +radarPart +BLOOD +^ + $@ +$4Q1 +BLOOD +referent +BOUNCBOX + + (2Q, +BOUNCBOX + + ,? +(4Q +(2Q +(2Q + + ,? +(2Q +BOUNCBOX +referent +item +item2 +ammo +BOUNCBOX +referent +BOX_EW +BOX_EW +BOX_EW +BOX_EW +BOX_EW +BOX_EW +BOX_EW +referent +counter +BOX_NS +BOX_NS +BOX_NS +BOX_NS +BOX_NS +BOX_NS +BOX_NS +referent +counter +BRIDGE +BRIDGE +BRIDGE +BRIDGE +BRIDGE +referent +BRIDGE +item +newtype +item2 +BRIDGE +wt$[Z +tB[[ + +F + +? +$Q +referent +start +item +BRIDGE +t$[r +tB[s + +F + +? +$Q& + +F + +? +$Q& + +F + + +F + +referent +start +item +BRIDGE + +F + +? +$Q +? +(Q + +F + +BRIDGE +BRIDGE +referent +start +item +bridgeitems +bridgemax +BRIDGE + +F + +? +$Q +t$[" +tB[# + +F + +? +$Q +? +(Q +? +6Q +t$[A +tB[B + +F + +t$[P +tB[Q + +F + +BRIDGE +BRIDGE +$2Qc +t$t=t@[w +BRIDGE +$2Qc +t$t=t@[ +BRIDGE +referent +start +item +bridgeitems +bridgemax +item2 +item3 +BRIDGE + +F + +? +$Q +? +(Q + +F + +BRIDGE +BRIDGE +BRIDGE +BRIDGE +BRIDGE +BRIDGE +BRIDGE +BRIDGE +referent +start +item +bridgeitems +bridgemax +cycletype +delay +retry +item2 +BROKENCW +wxt$[ +$2Q3 +BROKENCW +referent +item +BRO_BOOT +^ + +$Q +^ + 6Q@ +BRO_BOOT +BRO_BOOT +BRO_BOOT +BRO_BOOT +BRO_BOOT +BRO_BOOT + + $Q0 +BRO_BOOT + + +$Q1 +BRO_BOOT + + *QC +BRO_BOOT +referent +event +counter +BRO_BOOT + + $4N + + +$4Qb +t$t=t@[a +t% + + + +t$t=t@[m +t% + + + +BRO_BOOT +BRO_BOOT +BRO_BOOT +BRO_BOOT +BRO_BOOT +referent +item +counter +BRO_BOOT +referent +BUBBLE +wxS\c +BUBBLE +BUBBLE +BUBBLE +BUBBLE +BUBBLE +referent +counter +BUBBLE +wx[> +referent +CAMERA +referent +CAMERA +referent +CAMERACO +]0Q) +CAMERACO +CAMERACO +]0Q) +CAMERACO +CAMERACO +902Qj +CAMERACO +CAMERACO +CAMERACO +CAMERACO +CAMERACO +CAMERACO +referent +delay +iSeeYou +trackedEnough +fram +counter +sawCrusader +movement +target +range +CAMERACO +referent +CAMERACO +62Qj +CAMERACO +CAMERACO +referent +CAMERAEW +^ + $Q +]0Q) +CAMERAEW +CAMERAEW +]0Q) +CAMERAEW +CAMERAEW +902Qj +CAMERAEW +CAMERAEW +CAMERAEW +CAMERAEW +CAMERAEW +CAMERAEW +referent +delay +iSeeYou +trackedEnough +fram +counter +sawCrusader +movement +target +range +CAMERAEW +referent +CAMERAEW +^ + 62Qj +CAMERAEW +CAMERAEW +referent +CAMERANS +^ + $Q +]0Q) +CAMERANS +CAMERANS +]0Q) +CAMERANS +CAMERANS +902Qj +CAMERANS +CAMERANS +CAMERANS +CAMERANS +CAMERANS +CAMERANS +referent +delay +iSeeYou +trackedEnough +fram +counter +sawCrusader +movement +target +range +CAMERANS +referent +CAMERANS +^ + 62Qj +CAMERANS +CAMERANS +referent +CAM_EW +referent +CAM_EW +referent +CAM_EW +wx[( +referent +CAM_EW +wx[0 +referent +CAM_EW +wx[6 +CAM_EW +Y? +N< +CAM_EW +referent +CAM_NS +referent +CAM_NS +referent +CAM_NS +wx[( +referent +CAM_NS +wx[0 +referent +CAM_NS +wx[7 +CAM_NS +Y? +N< +CAM_NS +referent +CARD_EW +referent +CARD_NS +referent +CATWALK1 +CATWALK1 +referent +CATWALK2 +CATWALK2 +referent +item +CHANGER + +d + +referent +roof +doorQuality +roofQuality +eggNum +CHEDITRO +referent +CHEMSUIT +referent +CHEST_EW +Y +(? +CHEST_EW +ma0Q3 +CHEST_EW +referent +fram +CHEST_EW +wx[7 + + *Q@ +CHEST_EW +CHEST_EW +CHEST_EW +t$t=t@[n +^ + +$[x +$4[y +$4[z +^ + $4Q + +($Q) +CHEST_EW +referent +item +item2 +counter +CHEST_NS +Y +(? +CHEST_NS +ma0Q3 +CHEST_NS +referent +fram +zZ +\8 +CHEST_NS +wx[7 + + *Q@ +CHEST_NS +CHEST_NS +CHEST_NS +t$t=t@[p +^ + +$[z +$4[{ +$4[| +^ + $4Q + +($Q% +CHEST_NS +referent +item +item2 +counter +CHEST_OE +^ + +(QM +CHEST_OE +referent +CHEST_OE +wx[( +^ + ,Q +referent +CHEST_ON +^ + +(QM +CHEST_ON +referent +CHEST_ON +wx[' +^ + ,Q +referent +CONGRESS +wx[ +referent +CONVEYOR +CONVEYOR +]0Q, +CONVEYOR +referent +_xdir +_ydir +counter +areThereItems +cargo_item +CONVEYOR +wx[{ +referent +CONVEY_E +referent +CONVEY_E +wx[% +CONVEY_E +referent +xdir +ydir +item +CONVEY_N +referent +CONVEY_N +wx[% +CONVEY_N +referent +xdir +ydir +item +CONVFLR +referent +CONVFLR +wx[% +CONVFLR +referent +xdir +ydir +item +CONV_EL +referent +CONV_EL +wx[% +CONV_EL +referent +xdir +ydir +item +CONV_NL +referent +CONV_NL +wx[$ +CONV_NL +referent +xdir +ydir +item +COPY_EW +COPY_EW +^$Q +referent +fram +coolfram +COPY_NS +COPY_NS +^$Q +referent +fram +coolfram +COR_BOOT +^ + +$Q +^ + 6Q@ +COR_BOOT +COR_BOOT +COR_BOOT +COR_BOOT +COR_BOOT + + *QC +COR_BOOT +referent +event +counter +COR_BOOT +$4Qb +t$t=t@[P +t% + + + +t$t=t@[\ +t% + + + +COR_BOOT +COR_BOOT +COR_BOOT +COR_BOOT +COR_BOOT +referent +item +counter +COR_BOOT +referent +CRUMORPH +wxt$t=t:[ +^$Qt +CRUMORPH +CRUMORPH +CRUMORPH +CRUMORPH +CRUMORPH +referent +lastAct +CRUZTRIG +CRUZTRIG +CRUZTRIG +CRUZTRIG +CRUZTRIG +CRUZTRIG +t$t=t@[3 +t%[4 +CRUZTRIG +CRUZTRIG +referent +item +elev +CRU_SPID +referent +CRU_SPID +^ +($Q4 +CRU_SPID +] + $Q +] + +$Q +] + $Q +] +(y< +CRU_SPID +]0Qx +] +)y< +CRU_SPID + + *Q@ +CRU_SPID +referent +mine +InCrouch +Cru_Spider +target +item +counter +lastAnim +xOff +yOff +CRU_SPID +] + $4Q +] + +$y< +] + $4Q +]0QK +]0Q( +,2QW +CRU_SPID +CRU_SPID +referent +counter +xOff +yOff +counter2 +item +spider +DATALINK +MISSION OBJECTIVES:^* +$4Q; +mva1 +DATALINK +^)Gain keycard from rebel informant. +^)Locate Thermal Coupler on level four and destroy objective with BlastPac. +^)Locate telepad on fourth level and return to rebel base. +$4Qh +^)PFC. Andrews to confirm coordinates before teleportation into prison area. +^)Locate and free rebel soldiers. +^Prisoners rumored to be held for experimentation +in Dr. Hoffman's lab. +^)Locate telepad on prison level and return to rebel base. +$4QX +mva3a +DATALINK +^)PFC. Cardova to confirm coordinates before teleportation into industrial complex. +^)Locate PHIR computer and download latest prototypes' plans. +^)Locate telepad on level 1 and return to rebel base. +$4QU +mva4 +DATALINK +^)PFC. Andrews to bring down defense screens before objective can be reached. +^)Locate SORC computer on level 3 and destroy it with a BlastPac. +^)Locate telepad on level 4 and return to rebel base. +RD y< +^ + $y< +^ + +$4QI +mva5a +S\& DATALINK +^)Gain keycard from rebel informant. +^)Locate MELF computer in Science Wing, level 5 and download Cypher chip plans. +^)Locate telepad in Science Wing, level 4 and return to rebel base. +$4Qi +mva6 +DATALINK +^)Sgt. Brooks to confirm teleportation coordinates into government complex. +^)Locate office of Senator Everett Snell on level 2. +Transport the senator back to Central for questioning. +^)Return to rebel base. +RV +y< +^ + $y< +mva7 +S\9 +DATALINK +^)Locate EEOD nerve gas containment unit on level 7. +Destroy objective with FusionPac. +^)Locate teleporter on level 7 and return to rebel base. +R2 y< +mva8 + DATALINK +^)Liberate Professor Willmar from WEC prison. +^)Locate teleporter on level 3 and return to rebel base. +mva9 +DATALINK +^)Infiltrate governement complex and spy on congressional meeting. +^)Return to your original telepad for extraction back to rebel base. +$4Q3 +mva10 +DATALINK +^)Locate plans for new experimental weapon in Dr. Hoffman's lab. +^)Destroy as many of the experimental Silencer prototypes as possible. +^Locate telepad on level 3 to return to rebel base. +$4Q; +mva11a +DATALINK +^)PFC. Cardova to bring down teleport defense screens. +^)Locate OPTS computer and download plans to the Vigilance Platform. +^)Locate teleporter on level 4 and return to rebel base. +mva12a +DATALINK +^)Locate OPC computer and upload new targeting coordinates. +^)Locate teleporter on level 3 and return to rebel base. +mva13 +DATALINK +^)Rescue Col. Ely from WEC prison. +^)Locate teleporter and return to rebel base. +mva14 +DATALINK +^)Locate shuttle to Vigilance Platform.^)Await troop transfer.^)Lead hit squad to Vigilance Platform. +^)Take shuttle to Vigilance Platform. +mva15a +DATALINK +^)Locate and deactivate SATARG system, then destroy weapon control system. +$2Qu +mva15c +DATALINK +^)Locate and destroy Lithium Power Core with BlastPac. +^)Locate escape pod on level 10 and escape Vigilance Platform. +DATALINK +referent +textFile +DEATHBOX +DEATHBOX +DEATHBOX +t$t=t@[! + +0t% + +^ + +$Q +$2QN +DEATHBOX +DEATHBOX +referent +sswitch +counter +DEATHFL +DEATHFL +t$[H +DEATHFL +t$[_ +DEATHFL +t$[v +DEATHFL +$4Q +DEATHFL +DEATHFL +referent +item +item2 +counter +spoogeType +DEATHFL1 +referent +DEATHFL1 +referent +DEATHFL2 +referent +DEATHFL2 +referent +DEATHFL3 +referent +DEATHFL3 +referent +DETPAC +^ +($Q4 +DETPAC +] + $Q +] + +$Q +] + $Q +] +(y< +DETPAC +] +)y< +DETPAC +referent +InCrouch +Bomb +item +lastAnim +xOff +yOff +mine +DOOR +DOOR +maQ +DOOR +referent +DOOR +DOOR +? +[5 +DOOR +? +[< +t$t=t@[> +^$Q& +DOOR +? +[L +DOOR +maQ + + +F$Q +? +[W +DOOR +? +[^ +t$t=t@[` +^$Q& +DOOR +? +[n +DOOR +maQ + +? +[y +DOOR +maQ + +DOOR +maQ + +DOOR +maQ + +DOOR +maQ + +DOOR +t$t=t@[ +^$Q& +DOOR +DOOR +maQ + + +{$Q +DOOR +t$t=t@[ +^$Q& +DOOR +DOOR +maQ + +DOOR +maQ + +DOOR +maQ + +? +[ +DOOR +maQ + + DOOR +maQ + +? +[# +Rj [& +S\X DOOR +maQ + +R< R9 ? +? +[/ + DOOR +maQ + +? +[; +DOOR +maQ + +? +[G +DOOR +maQ + +? +[V +DOOR +maQ + +? +[a +DOOR +maQ + +? +[l +DOOR +maQ + +? +[w +DOOR +maQ + + +DOOR +maQ + +Rm +[ +S\[ +DOOR +maQ + +R? +R< +? + +DOOR +maQ + + DOOR +maQ + +Rn [ +S\\ DOOR +maQ + +R@ R= ? + DOOR +maQ + +DOOR +maQ + +DOOR +maQ + +DOOR +maQ + +DOOR +maQ + +DOOR +maQ + +DOOR +maQ + +DOOR +maQ + +? +[" +DOOR +maQ + +? +[- +DOOR +maQ + +? +[8 +DOOR +maQ + +? +[C +DOOR +maQ + +? +[N +DOOR +maQ + +? +[Y +DOOR +maQ + +? +[d +DOOR +maQ + +? +[t +DOOR +maQ + +DOOR +maQ + +DOOR +maQ + +DOOR +maQ + +DOOR +ma0Q + +DOOR +maQ + +DOOR +maQ + +DOOR +maQ + +DOOR +maQ + + +3$QL +DOOR +maQ + +DOOR +maQ + + +l$QL +DOOR +maQ + +DOOR +maQ + +referent +doorType +ewall +zZ +\ +DOOR + + + + +t$[+ +tF[. + +d + +referent +roof +count +doorParam +doorQuality +roofQuality +zZ +\ +DOOR +$4[O + + +$4Q +DOOR +ma0QS +t$t=t@[q +t% +2 + +^$Qf +DOOR +DOOR +DOOR +^ +{$Q +DOOR +DOOR +^ +F$Q +DOOR +DOOR +DOOR +DOOR +DOOR +DOOR +DOOR +DOOR +referent +deathBox +item +item2 +hitMe +damagePoints +DOOR2 +DOOR2 +DOOR2 +referent +doorList +counter +maxFrame +DOOR2 +DOOR2 +DOOR2 +referent +doorList +counter +maxFrame +DOOR2 +DOOR2 + +F +U +X[g + +e +d +c[h +DOOR2 +referent +doorList +counter +maxFrame +DOOR2 + +F +U +X[ + +e +d +c[ +DOOR2 +DOOR2 +referent +doorList +counter +counter2 +maxFrame +DOOR2 +DOOR2 +DOOR2 +referent +counter +maxFrame +DOOR2 +DOOR2 +DOOR2 +referent +counter +counter2 +maxFrame +DOOR2 +DOOR2 +DOOR2 +referent +counter +maxFrame +DOOR2 +DOOR2 +DOOR2 +referent +counter +counter2 +maxFrame +DOOR2 +DOOR2 +DOOR2 +referent +doorList +counter +maxFrame +DOOR2 +DOOR2 +DOOR2 +referent +doorList +counter +maxFrame +DOOR2 +DOOR2 +DOOR2 +referent +doorList +counter +maxFrame +DOOR2 +DOOR2 +DOOR2 +referent +doorList +counter +maxFrame +DOOR2 +DOOR2 +DOOR2 +referent +counter +maxFrame +DOOR2 +DOOR2 +DOOR2 +referent +counter +maxFrame +DOOR2 +DOOR2 +DOOR2 +referent +counter +maxFrame +DOOR2 +DOOR2 +DOOR2 +referent +counter +maxFrame +DOOR2 +DOOR2 +t$t=t@[: +t% + + + +t$t=t@[? +t% + + + +DOOR2 +referent +doorList +doorList2 +counter +door1 +door2 +item +maxFrame +DOOR2 +t$t=t@[g +t% + + + +t$t=t@[l +t% + + + +02Q? +DOOR2 +DOOR2 +DOOR2 +referent +doorList +doorList2 +counter +counter2 +door1 +door2 +item +nonLegalDoor1 +nonLegalDoor2 +bool +maxFrame +DOOR2 +DOOR2 +t$t=t@[ +t% + + + +t$t=t@[ +t% + + + +DOOR2 +referent +doorList +doorList2 +counter +door1 +door2 +item +maxFrame +DOOR2 +t$t=t@[ +t% + + + +t$t=t@[ +t% + + + +02Q? +DOOR2 +DOOR2 +DOOR2 +referent +doorList +doorList2 +counter +counter2 +door1 +door2 +item +nonLegalDoor1 +nonLegalDoor2 +bool +maxFrame +zZ +\Z +DOOR2 +DOOR2 +DOOR2 +referent +counter +maxFrame +link +item +item2 +zZ \C +DOOR2 +t$t=t@[q +t%[r +DOOR2 +DOOR2 +referent +item +item2 +item3 +prisDoor +counter +maxFrame +link +zZ +\Z +DOOR2 +DOOR2 +DOOR2 +referent +counter +maxFrame +link +item +item2 +DOOR2 +t$t=t@[ +DOOR2 +DOOR2 +referent +item +item2 +prisDoor +counter +maxFrame +link +DOOR2 +DOOR2 +DOOR2 +referent +counter +DOOR2 +DOOR2 +referent +counter +DOOR2 +DOOR2 +DOOR2 +referent +counter +DOOR2 +DOOR2 +referent +counter +DOOR2 + + *Q@ +DOOR2 +^ + $Q + + *QC +DOOR2 +referent +counter +DOOR2 +DOOR2 +DOOR2 +referent +counter +item +DOOR2 +]0Q + +t$t=t@[ +]0QD +DOOR2 +referent +counter +item +DOOR2 +DOOR2 +DOOR2 +referent +counter +item +DOOR2 +]0Q + +t$t=t@[ +]0QD +DOOR2 +referent +counter +item +DOOR2 +DOOR2 +DOOR2 +referent +counter +item +DOOR2 +]0Q + +DOOR2 +referent +counter +item +DOOR2 +DOOR2 +DOOR2 +referent +counter +item +DOOR2 +]0Q + +DOOR2 +referent +counter +item +DOOR2 +DOOR2 +DOOR2 +referent +counter +newFrame +item +DOOR2 +^0Q + +]0Q + +DOOR2 +referent +counter +newFrame +item +DOOR2 +DOOR2 +DOOR2 +referent +counter +newFrame +item +DOOR2 +^0Q + +]0Q + +DOOR2 +referent +counter +newFrame +item +Z +\a +DOOR3 +DOOR3 +DOOR3 +DOOR3 +referent +doorList +doorList2 +counter +door2 +maxFrame +DOOR3 +t$t=t@[O +t% + + + +t$t=t@[T +t% + + + +02QO +02QB +DOOR3 +$2QL +DOOR3 +referent +doorList2 +doorList +counter +counter2 +door1 +door2 +item +nonLegalDoor1 +nonLegalDoor2 +bool +maxFrame +zZ +\a +DOOR3 +DOOR3 +DOOR3 +DOOR3 +referent +doorList2 +doorList +counter +door2 +maxFrame +DOOR3 +t$t=t@[ +t% + + + +t$t=t@[ +t% + + + +02QO +02QB +DOOR3 +$2QL +DOOR3 +referent +doorList +doorList2 +counter +counter2 +door1 +door2 +item +nonLegalDoor1 +nonLegalDoor2 +bool +maxFrame +zZ +\9 +DOOR3 +DOOR3 +DOOR3 +DOOR3 +referent +doorList +doorList2 +counter +door2 +maxFrame +DOOR3 +t$t=t@[ +t% + + + +t$t=t@[ +t% + + + +02QL +02QB +DOOR3 +$2QL +DOOR3 +referent +doorList2 +doorList +counter +counter2 +door1 +door2 +item +nonLegalDoor1 +nonLegalDoor2 +bool +maxFrame +zZ +\6 +DOOR3 +DOOR3 +DOOR3 +DOOR3 +referent +doorList +doorList2 +counter +door2 +maxFrame +DOOR3 +t$t=t@[p +t% + + + +t$t=t@[u +t% + + + +02QL +02QB +DOOR3 +$2QL +DOOR3 +referent +doorList +doorList2 +counter +counter2 +door1 +door2 +item +nonLegalDoor1 +nonLegalDoor2 +bool +maxFrame +DOOR3 +DOOR3 +DOOR3 +referent +counter +maxFrame +DOOR3 +DOOR3 +DOOR3 +referent +counter +maxFrame +DOOR3 +DOOR3 +DOOR3 +referent +counter +maxFrame +DOOR3 +DOOR3 +DOOR3 +referent +counter +maxFrame +DOOREGG +DOOREGG +referent +DOOREGG +DOOREGG +referent +DOOREGG +wt$t=t:[ +t% + + + +referent +door +DOOREGG +wt$t=t:[- +t% + + + +referent +door +D_BARREL +referent +D_CHEM +^ + +.Q +referent +goods +D_CHEM +wx[1 +referent +D_CONG +^ + +.Q +referent +goods +D_CONG +wx[1 +referent +D_COUR +^ +2,Q +D_COUR +D_COUR +D_COUR +referent +goods +D_ESTORM +^ + +.Q +referent +goods +D_ESTORM +wx[1 +referent +D_GUARD +referent +goods +D_GUARD +wx[0 +referent +D_GURDSQ +^ + ,Q +referent +goods +D_GURDSQ +wx[1 +D_GURDSQ +referent +D_HOFFMA +referent +D_MAINT +^ + ,Q +referent +goods +D_MAINT +wx[1 +referent +D_OWORK +^ + ,Q +referent +goods +D_OWORK +wx[0 +referent +D_SCIEN +^ + ,Q +referent +goods +D_SCIEN +wx[0 +referent +D_SOLD +^ + ,Q +referent +goods +D_SOLD +wx[0 +referent +D_STORM +^ + ,Q +referent +goods +D_STORM +wx[0 +referent +D_SUSAN +^ +2,Q +D_SUSAN +D_SUSAN +D_SUSAN +referent +goods +D_THERM +referent +D_VARG +referent +EBRIDGE +EBRIDGE +referent +EBRIDGE +wx[% +Y? +@ +EBRIDGE +referent +EBRIDGE2 +EBRIDGE2 +referent +EBRIDGE2 +wx[$ +Y? +@ +EBRIDGE2 +referent +EGRENADE +referent +ELEVAT +^(Q" +ELEVAT +ELEVAT +referent +ELEVAT +referent +ELEVAT +referent +ELEVAT +ELEVAT +referent +cargoUp +existCargo +counter +height +maxLimit +maxLimitCount +counter2 +total +ELEVAT +ELEVAT +ELEVAT +ELEVAT +referent +counter +counter2 +height +minLimit +minLimitCount +cargoDown +total2 +ELEVAT +t$t=t@[ +(2Q" +ELEVAT +ELEVAT +ELEVAT +referent +liftpit +pitCounter +totFrames +checkX +checkY +ELEVATOR +ELEVATOR +] +)y< +ELEVATOR +62[I +62[J +62[K +62[L +62[M +62[N +62[O +62[Q +62[R +62[S +62[T +62[V +62[W +62[X +62[Y +62[[ +62[\ +62[] +62[^ +62[` +62[a +62[b +62[c +ELEVATOR +ELEVATOR +ELEVATOR +ELEVATOR +ELEVATOR +referent +item +lowQuality +direction +\L ELEVATOR +wt$[ + + + + +ELEVATOR +ELEVATOR +ELEVATOR +ELEVATOR +ELEVATOR +ELEVATOR +ELEVATOR +ELEVATOR +ELEVATOR +ELEVATOR +ELEVATOR +ELEVATOR +ELEVATOR +ELEVATOR +ELEVATOR +ELEVATOR +ELEVATOR +ELEVATOR +ELEVATOR +t$t=t@[# +t% + + + +ELEVATOR +ELEVATOR +ELEVATOR +ELEVATOR +t$[3 +tB[4 + + + + +t$[: +tB[; + + + + +ELEVATOR +ELEVATOR +ELEVATOR +ELEVATOR +ELEVATOR +t$[p +tB[q + + + + +ELEVATOR +ELEVATOR +ELEVATOR +ELEVATOR +referent +mapNum +eggNum +post1 +post2 +item +counter +door +door1 +ELEVATOR +ELEVATOR + + + + +ELEVATOR +referent +item +door +ELEVPLAT +]0Q? +](Q# +referent +cargo +ELEVPLAT +wx[+ + +X$? + +X(Q +? +Qa +? +(Q +? +,Q +? +$Q +ELEVPLAT +t$t=t:[h +ELEVPLAT +referent +ELEVPLAT +wx[s +referent +ELEVPLAT +wx[y +^ +e$Q+ +ELEVPLAT +referent +ELITE +referent +ELYDESK +ELYDESK +ELYDESK +ELYDESK +ELYDESK +ELYDESK +ELYDESK +ELYDESK +ELYDESK +ELYDESK + + $Q0 +ELYDESK +t$t=t@[L +ELYDESK +referent +counter +item +ELYDESK +wx[d +^ + +$Q +ELYDESK +ELYDESK +^0QO +ELYDESK +^ +2,QU +ELYDESK + + *Q@ +ELYDESK +ELYDESK +ELYDESK +referent +counter +ELYDESK +referent +ENERGY +^.Qb +ENERGY +^(QJ +ENERGY +ENERGY +ENERGY +referent +maxLimit +fule +item +ENFORCER +wx[ +referent +ESPACE +ESPACE +referent +ESPACE +wx[+ +Y? +@ +ESPACE +referent +ESPACE2 +ESPACE2 +referent +ESPACE2 +wx[+ +Y? +@ +ESPACE2 +referent +ETWALLEW +referent +ETWALLEW +referent +ETWALLEW +referent +ETWALLNS +referent +ETWALLNS +referent +ETWALLNS +referent +EVENT +wx[4 +EVENT +EVENT +EVENT +EVENT +EVENT +EVENT +EVENT +EVENT +EVENT +EVENT +EVENT +EVENT +EVENT +? + + $Q +t$t=t:[ +62Q( +? + + +$Q= +t$t=t@[ +t% +d + +t$t=t@[ +t% +d + +EVENT +? + +($Q +]0Qo +EVENT +EVENT +? + +)$Q +EVENT +EVENT +EVENT +EVENT +EVENT +EVENT +t$t=t@[ +EVENT +EVENT +EVENT +EVENT +EVENT +? + +-$Q +^ +2,4Q +t$t=t:[5 +t% +2 + +EVENT +EVENT +EVENT +EVENT +EVENT +? + +.$Q +^ +2,4[W +t$t=t:[^ +t% +2 + +EVENT +EVENT +EVENT +EVENT +EVENT +? + +/$Qf +EVENT +EVENT +EVENT +EVENT +EVENT +EVENT +EVENT +EVENT +EVENT +? + +0$Q/ +EVENT +EVENT +EVENT +EVENT +? + +1$Qg + EVENT + EVENT +S\f EVENT + EVENT +EVENT +? + +2$QU + +d + +^ +d$Q +EVENT +? + +3$Q +t$t=t@[ + + + + + + + + +EVENT + +EVENT + +EVENT +S\V +EVENT + +EVENT + EVENT +t$[2 +tB[3 + + + + + EVENT +S\m EVENT +R] ? + +4$Q +t$t=t:[G +t% + + +^$Q. +EVENT +? + +5$Q +t$t=t@[` +t% + + +EVENT +? + +6$QO +t$t=t@[p +t% + + +? + +7$Q +EVENT +EVENT +EVENT +EVENT +? + +K$Qk +t$t=t:[ +t% +d + +^$Q& +Y + + + +EVENT +? + +U$Q +^ +2,4Q +t$t=t:[ +t% +2 + +EVENT +EVENT +EVENT +EVENT +EVENT +? + +X$Q +EVENT +EVENT +? + +a$Q +]0Q) +EVENT +? + +b$Q7 +t$t=t@[ +? + +c$Q7 +t$t=t@[ +? + +d$QP +EVENT +EVENT +mva3b +EVENT +EVENT +EVENT +EVENT +EVENT +EVENT +EVENT +EVENT +EVENT +referent +event +item +source +dest +door +counter +counter2 +link +time +post1 +post2 +floor +flicMan +EWALLEW +referent +EWALLEW +referent +EWALLEW +wx[! +referent +EWALLNS +referent +EWALLNS +referent +EWALLNS +wx[" +referent +EYECAMEW +referent +EYECAMEW +referent +EYECAMEW +wx[( +referent +EYECAMEW +wx[0 +referent +EYECAMEW +wx[7 +EYECAMEW +Y? +N< +EYECAMEW +referent +EYECAMNS +referent +EYECAMNS +referent +EYECAMNS +wx[( +referent +EYECAMNS +wx[2 +referent +EYECAMNS +wx[: +EYECAMNS +Y? +N< +EYECAMNS +referent +FADE +FADE +FADE +FADE +FADE +FADE +Y +? +( +? +? +? +FADE +? + + $Q +? + + +$Q +referent +FADE +FADE +FADE +FADE +]0QC +FADE +referent +loop +loop2 +FASTSKIL +FASTSKIL +FASTSKIL +FASTSKIL +FASTSKIL +FASTSKIL +FASTSKIL +referent +skill +FFFLOOR +t$t=t@[ +FFFLOOR +t$t=t@[ +FFFLOOR +t$t=t@[- +FFFLOOR +t$t=t@[6 +FFFLOOR +t$t=t@[> +t$t=t@[G +referent +fffloor +FFFLOOR +wx[V +t$t=t:[[ +FFFLOOR +referent +item +FFFLOOR +wx[n +FFFLOOR +FFFLOOR +referent +FFFLOOR2 +t$t=t@[ +t$t=t@[ +FFFLOOR2 +t$t=t@[, +FFFLOOR2 +t$t=t@[6 +FFFLOOR2 +t$t=t@[> +t$t=t@[F +referent +fffloor +FFFLOOR2 +wx[T +t$t=t:[Y +FFFLOOR2 +referent +item +FFFLOOR2 +wx[k +FFFLOOR2 +FFFLOOR2 +referent +FIGHT_EW +FIGHT_EW +ma0Q3 +t$[/ +tD[1 +^0Qb +referent +item +FIGHT_NS +FIGHT_NS +ma0Q3 +t$[/ +tD[1 + + + + +$4Q5 +FIGHT_NS +FIGHT_NS +referent +item +FLAME +FLAME +t$t=t:[ +FLAME +referent +item +detect +FLAME +FLAME +referent +FLAME1 +referent +FLAME1 +Y? +@ +FLAME1 +referent +FLAME2 +referent +FLAME2 +Y? +@ +FLAME2 +referent +FLAMEBOX +wx? + + +tD[ + + + +t$[> +tB[? + + + +referent +event +flame +flame2 +direction +FLAMEBOX +$2Q) +FLAMEBOX +referent +flame +direction +count +flame2 +FLAMEBOX +$4QN +$2Q) +FLAMEBOX +$2Q) +FLAMEBOX +$2Q) +FLAMEBOX +FLAMEBOX +referent +flame +direction +count +flame2 +newType +FLOOR1 +FLOOR1 +t$[% +tB[& + +# + +(2QM +]0Q +FLOOR1 +FLOOR1 +FLOOR1 +FLOOR1 +FLOOR1 +referent +counter +item +item2 +highNumber +lowNumber +tempNumber +floorItems +wantToStop +foundFloor +onTime +FLOOR1 +referent +FLORMINE +^62[- +referent +hType +item +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +FREE +flick +localFlick +FREE +,2Q +,2Q +,2Q +FREE +,2Q +,2Q +,2Q +item1 +item2 +avatarMap +npc1 +npc2 +FREE +ref1 +ref2 +dist +FREE +t$t=t@[B +? +$Q2 +range +item +closestItem +closest +dist +FREE +@$Q +FREE +FREE +item +zZ +\ +FREE +phold +item +zZ +\ +FREE +addType +phold +item +FREE +addType +fram +phold +item +zZ +\Z +FREE +FREE +item +phold +FREE +FREE +time +oldTick +newTick +FREE +ptype +FREE +*2[P +.2y< +FREE +list +member +count +FREE +list +line +temp +FREE +list +lines +temp +FREE +list +line +FREE +list +lines +line +FREE +list +member +count +FREE +$4y< +^ + $4y< +^ + $4y< +$4y< +$4Q + +$4y< +$4y< +$4y< +^ + +$y< +$4y< +FREE +FREE +$ + + + +$4 + + + +$4 + + + +$4 + + + +FREE +FREE +t$t=t@[ +t% +2 + +FREE +FREE +FREE +FREE +^ +2,Q +t$t=t@[A +t% +< + +FREE +counter +alarm +item +notAlarmed +FREE +FREE + +2(Q& +FREE + +<,Q +FREE +FREE + +<,Q' +FREE +FREE +FREE + +<,Q' +FREE +item +rndVoice +FREE +FREE +FREE +FREE +]0QC +source +item +leftOvers +FREE +wt$[ + +2 + +item +FUSPAC +FUSPAC +t$t=t@[ +62Q^ +FUSPAC +FUSPAC +] + $Q +] + +$Q +] + $Q +FUSPAC +] +(y< +FUSPAC +FUSPAC +FUSPAC +t$t=t@[ +t% +d + +^ +!$Q + +2 + +^ + +$Q + +{tA[ + +2 + +^ + +$Q& +FUSPAC +t$t=t@[ +^ +/$2Q +FUSPAC +referent +InCrouch +droppedPac +Fusionpac +target +item +counter +lastAnim +xOff +yOff +mine +door +FUSREACT +referent +GATGUNEW +referent +GATGUNEW +referent +GATGUNEW +wx[' +referent +GATGUNEW +wx[/ +referent +GATGUNEW +wx[6 +GATGUNEW +Y? +N< +GATGUNEW +referent +GATGUNNS +referent +GATGUNNS +referent +GATGUNNS +wx[' +referent +GATGUNNS +wx[/ +referent +GATGUNNS +wx[6 +GATGUNNS +Y? +N< +GATGUNNS +referent +GDOOR_E +GDOOR_E +referent +GDOOR_E2 +GDOOR_E2 +referent +GDOOR_N +GDOOR_N +referent +GDOOR_N2 +wxY? +GDOOR_N2 +referent +GENERATR +wxY + +GENERATR +referent +GLASS_EW +GLASS_EW +ma0Q3 +GLASS_EW +^0Q^ +GLASS_EW +referent +item +shot +counter +door +GLASS_NS +GLASS_NS +ma0Q3 +GLASS_NS +^0Q^ +GLASS_NS +referent +item +shot +counter +door +GLDIV_EW +GLDIV_EW +ma0Q3 +GLDIV_EW +^0Q^ +GLDIV_EW +referent +item +shot +counter +door +GLDIV_NS +GLDIV_NS +ma0Q3 +GLDIV_NS +^0Q^ +GLDIV_NS +referent +item +shot +counter +door +GOVGUNEW +referent +GOVGUNEW +referent +GOVGUNEW +wx[' +referent +GOVGUNEW +wx[/ +referent +GOVGUNEW +wx[5 +GOVGUNEW +Y? +N< +GOVGUNEW +referent +GOVGUNNS +referent +GOVGUNNS +referent +GOVGUNNS +wx[' +referent +GOVGUNNS +wx[1 +referent +GOVGUNNS +wx[7 +GOVGUNNS +Y? +N< +GOVGUNNS +referent +GRAVITON +wx[7 +referent +GRENADE +referent +GRENADE +referent +GRENEGG +wxt$t=t@[ +t% +d + +t$t=t@[ +t% +d + +referent +item +source +dest +counter +GTELEPAD +t$t=t:[ +referent +item +GTELEPAD +wx[1 +GTELEPAD +t$t=t@[5 +t$t=t:[< +GTELEPAD +referent +tele +GUARD +wx[ +referent +GUARDSQ +referent +G_POOL +G_POOL +^62Q +G_POOL +referent +item +HOFFMAN +referent +hoffy +deathBox +deadGuy +item +ZB\1 HOVER +,2Q0 +,2Q + +`-Q% +`-Q% + +HOVER +HOVER +HOVER +,2Q0 +,2Q + +`-Q% +`-Q% +HOVER +HOVER +HOVER +,2Q + +`-Q% +`-Q% +HOVER +HOVER +HOVER +referent +total +counter +cargo +hover +xacc +yacc +zacc +xfract +yfract +zfract +HOVER +HOVER +t$t=t@[ +t% +d + +^$4Q> +HOVER +HOVER +HOVER +HOVER +HOVER +referent +firstEgg +targetEgg +time +oldqhi +link +hover +item +HOVER +HOVER +HOVER +HOVER +HOVER +HOVER +referent +HOVER +t$t=t@[ +t% +d + +^$4Q +referent +check +cargo +item +hover +firstEgg +link +HOVER +t$t=t@[ +^$4Q +referent +cargo +item +hover +firstEgg +link +HOVER1 +HOVER1 +referent +HOVER1 +Y? +@ +HOVER1 +referent +HOVER1 +^ + 9 + +referent +HOVER1 +wx[- +^ +@9 + +referent +HOVER_EW +HOVER_EW +referent +HOVER_EW +Y? +@ +HOVER_EW +referent +HOVER_EW +^ + 9 + +referent +HOVER_EW +wx[- +^ +@9 + +referent +HOVER_NS +HOVER_NS +referent +HOVER_NS +Y? +@ +HOVER_NS +referent +HOVER_NS +^ + 9 + +referent +HOVER_NS +wx[, +^ +@9 + +referent +IONIC +wx[5 +referent +JELYH2 +referent +JELYHACK +referent +JOHN +referent +JOHN +referent +fram +KEYPAD +t$t=t@[5 +t% +d + +^$Q$ +KEYPAD +KEYPAD +KEYPAD +KEYPAD +referent +valueBox +boxesInArea +linkedWithSwitch +wrongCode +userInput +boxPasscode +keycode +KEYPADEW +KEYPADEW +KEYPADEW +KEYPADEW +referent +alreadyPassed +KEYPADNS +KEYPADNS +KEYPADNS +KEYPADNS +referent +alreadyPassed +KORESH +referent +KORESH +KORESH +referent +LANDMINE +^ +($Q4 +LANDMINE +] + $Q +] + +$Q +] + $Q +] +3y< +LANDMINE +] +4y< +LANDMINE +] +4y< +LANDMINE +LANDMINE +referent +InCrouch +landMine +item +xOff +yOff +mine +LANDMINE +referent +hType +item +LASERI +Y +2? +LASERI +t$[$ +tH[( + +2 + +LASERI +LASERI +LASERI +referent +laser +hType +LAZER + + + +t$t=t:[( +^6Qh +LAZER +t$[_ +tH[c + + + +referent +item +monster +LAZEREGG +t$t=t@[" +t% + + + +LAZEREGG +referent +laser +LAZEREW +LAZEREW +LAZEREW +LAZEREW +referent +fram +item +LAZEREW +wx[S +referent +LAZEREW +wx[\ +LAZEREW +referent +LAZERNS +LAZERNS +LAZERNS +LAZERNS +referent +fram +item +LAZERNS +wx[X +referent +LAZERNS +wx[a +LAZERNS +referent +LIFT +LIFT +LIFT +LIFT +LIFT +referent +LIFT +wx[2 +LIFT +LIFT +LIFT +LIFT +LIFT +LIFT +LIFT +^ + +$Q +LIFT +LIFT +LIFT +LIFT +LIFT +LIFT +referent +item +LIFT +^ + +$QL +LIFT +LIFT +LIFT +referent +LIFT + +/*Q +LIFT +referent +counter +total +cargo +cargoType +LIFTPIT +^62Q +referent +LITEWALL +? +w[ +LITEWALL +LITEWALL +LITEWALL +referent +wall +tempType +realType +counter +LITEWALL +^ +0$4[W +^ +1$4Q +t$[Z +tD[\ + + + + +*2Qj +LITEWALL +referent +stepper +item +wall +wallList +dist +aSet +aSet1 +aSet2 +aSet3 +LUGGAGE +Y +d? +LUGGAGE +ma0Q0 +LUGGAGE +referent +item +LWPLATE4 +Y? +@ +LWPLATE4 +referent +item +LWPLATE8 +Y? +@ +LWPLATE8 +referent +item +L_EW-16 +^$Q[ +L_EW-16 +L_EW-16 +referent +L_EW-16 +referent +L_EW-16 +wx[% +referent +_num +L_EW-16 +wx[. +referent +_num +L_EW-2 +^$Q[ +L_EW-2 +L_EW-2 +referent +L_EW-2 +referent +L_EW-2 +wx[& +referent +_num +L_EW-2 +wx[/ +referent +_num +L_EW-4 +^$Q[ +L_EW-4 +L_EW-4 +referent +L_EW-4 +referent +L_EW-4 +wx[& +referent +_num +L_EW-4 +wx[/ +referent +_num +L_EW-8 +^$Q[ +L_EW-8 +L_EW-8 +referent +L_EW-8 +referent +L_EW-8 +wx[% +referent +_num +L_EW-8 +wx[. +referent +_num +L_NS-16 +^$Q[ +L_NS-16 +L_NS-16 +referent +L_NS-16 +referent +L_NS-16 +wx[& +referent +_num +L_NS-16 +wx[/ +referent +_num +L_NS-2 +^$Q[ +L_NS-2 +L_NS-2 +referent +L_NS-2 +referent +L_NS-2 +wx[& +referent +_num +L_NS-2 +wx[/ +referent +_num +L_NS-4 +^$Q[ +L_NS-4 +L_NS-4 +referent +L_NS-4 +referent +L_NS-4 +wx[& +referent +_num +L_NS-4 +wx[/ +referent +_num +L_NS-8 +^$Q[ +L_NS-8 +L_NS-8 +referent +L_NS-8 +referent +L_NS-8 +wx[' +referent +_num +L_NS-8 +wx[0 +referent +_num +MAINTMAN +referent +MBARREL +Y +d? +MBARREL +ma0Q3 +MBARREL +referent +item +item2 +zZ +\ +MBARREL +wx[; + + +.Q +MBARREL +referent +item +item2 +MCRATE +Y +d? +MCRATE +ma0Q0 +MCRATE +MCRATE +referent +item +MDESKEW +MDESKEW +referent +fram +item +MDESKNS +MDESKNS +referent +fram +item +MDOOR_E +referent +item +MDOOR_E +MDOOR_E +referent +MDOOR_E +wx[ +MDOOR_E +referent +_num +item +item2 +door +MDOOR_N +referent +item +MDOOR_N +MDOOR_N +referent +MDOOR_N +wx[ +MDOOR_N +referent +_num +item +item2 +door +MEDIKIT +MEDIKIT + +Py< +MEDIKIT +MEDIKIT +MEDIKIT +referent +item +MELF +MELF +mva5b +MELF +MELF +MELF +tA[ + +2 + +^ +"$Q% +referent +item +MFAN_EW +MFAN_EW +referent +MFAN_NS +MFAN_NS +referent +MGR_EW +MGR_EW +referent +MGR_NS +MGR_NS +referent +MINELET +referent +MINELET +referent +MISS10 +referent +MISS10 +MISS10 +referent +item +MISS11 +referent +MISS11 +MISS11 +MISS11 +referent +MISS12 +referent +MISS12 +MISS12 +MISS12 +referent +item +MISS13 +referent +MISS13 +MISS13 +referent +MISS13 +MISS13 +t$t=t@[E +t% +2 + +t$t=t@[J +MISS13 +t$t=t@[Y +62Q^ +MISS13 +MISS13 +MISS13 +MISS13 +MISS13 +MISS13 +MISS13 +MISS13 +MISS13 +MISS13 +MISS13 +MISS13 +MISS13 +t$[z +tB[{ +MISS13 +MISS13 +MISS13 +MISS13 +MISS13 +referent +counter +item +wench +npcWench +door +MISS14 +MISS14 +MISS14 +MISS14 +MISS14 +MISS14 +MISS14 +MISS14 +MISS14 +referent +counter +MISS14 +wx[J +referent +item +MISS1EGG +MISS1EGG +t$t=t@[: +MISS1EGG +MISS1EGG +referent +item +pad2 +buster +slot +MISS1EGG +MISS1EGG +MISS1EGG +t$t=t@[f +t% +2 + +t$[l +tB[m + +d + +MISS1EGG +MISS1EGG +MISS1EGG +MISS1EGG + +(y< +MISS1EGG +t$t=t@[| +t%N< + +)y< +MISS1EGG +MISS1EGG +MISS1EGG +MISS1EGG +MISS1EGG +MISS1EGG +MISS1EGG +t$t=t@[ +t% +2 + +MISS1EGG +t$t=t@[ +t% +2 + +MISS1EGG +MISS1EGG +t$t=t@[ +t% +2 + +MISS1EGG +MISS1EGG +t$t=t@[ +t% +2 + +MISS1EGG +Y + + + +MISS1EGG +MISS1EGG +MISS1EGG +referent +eTrigger +item +counter +MISS1EGG +MISS1EGG +t$t=t@[ +referent +buster +MISS1EGG +? +w[ +MISS1EGG +MISS1EGG +MISS1EGG +(2Q4 +MISS1EGG +MISS1EGG +$2Q' +MISS1EGG +MISS1EGG +$4Q +referent +buster +rubberSuit +counter +zZ +\` +MISS1EGG +t$t=t@[ +t% +2 + +MISS1EGG +t$t=t@[ + +{t% +2 + +MISS1EGG +MISS1EGG +MISS1EGG +MISS1EGG +t$t=t@[6 +t% +2 + +MISS1EGG +referent +item +pathegg +guardBoy +door +MISS1EGG +MISS1EGG +t$t=t@[N +t% +2 + +MISS1EGG +MISS1EGG +MISS1EGG +referent +door +MISS1EGG +MISS1EGG +MISS1EGG +MISS1EGG +MISS1EGG +MISS1EGG +referent +MISS1EGG +wx[t +MISS1EGG +` y< +MISS1EGG +MISS1EGG +MISS1EGG +` y< +MISS1EGG +MISS1EGG +referent +item +pad2 +counter +slot +MISS2 +referent +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +referent +MISS2 +t$t=t@[L +t% +d + +MISS2 +counter +item +MISS2 +MISS2 +MISS2 +MISS2 +^ + 6QX +^ + 6Q@ +MISS2 +MISS2 +MISS2 +item +MISS2 +$4Q3 +t$t=t@[ +t% +d + +MISS2 +MISS2 +done0 +done1 +done2 +activate +item +MISS2 +MISS2 +counter +zZ \P +MISS2 + +=y< +MISS2 + +d + +^0Q +MISS2 +MISS2 +MISS2 +item +counter +itemNum +zZ \ +MISS2 +tB[ + +d + +$2QH +MISS2 +position +item +counter +itemNum +turn +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +t$[~ +] +`,K +/R,? +S(2? +D(2? +@,2QX +t$t=t@[ +t% +< + +t$t=t@[ + +Ft% + + + +62Qd + MISS2 + MISS2 +S\j MISS2 + MISS2 +MISS2 +t$t=t@[ +t% +2 + +62Q^ +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 + +MISS2 +t$t=t@[ +^ + $QI + +MISS2 +S\h +MISS2 +S\5 +MISS2 + +MISS2 +t$t=t@[ +t% +d + +S\{ MISS2 +S\U MISS2 +S\3 MISS2 +t$t=t@[ +t% +d + +MISS2 +MISS2 +t$t=t@[ +MISS2 +MISS2 +MISS2 +MISS2 +t$t=t@[ +t% + + + +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +t$t=t@[+ +t% + + + +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +t$t=t@[> +t% + + + +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +t$t=t@[U +t% + + + +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +t$t=t@[ +^ + $Q +MISS2 +referent +counter +item +body +door +door1 +door2 +door3 +hoffman +pathEgg +MISS2 +MISS2 +MISS2 +t$t=t@[ +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +MISS2 +referent +counter +item +vargas +MISS2 +MISS2 +MISS2 +referent +item +MISS2 +MISS2 +referent +MISS3 +referent +MISS3 +MISS3 +MISS3 +MISS3 +referent +MISS4 +MISS4 +referent +MISS4 +MISS4 +MISS4 +t$[) +tB[* + + + +referent +item +MISS4 +wx[7 +MISS4 +referent +item +MISS5 +referent +MISS5 +MISS5 +referent +MISS5 +MISS5 +MISS5 +t$t=t@[< +MISS5 +MISS5 +MISS5 +t$t=t@[Z +t$t=t@[c +t$[j +tB[k + + + + +t$[q +tB[r + + + + +MISS5 +MISS5 +MISS5 +MISS5 +MISS5 + + + + +MISS5 +MISS5 +MISS5 +MISS5 +MISS5 +MISS5 +MISS5 +MISS5 +MISS5 +MISS5 +MISS5 +MISS5 +MISS5 +MISS5 +MISS5 +MISS5 +MISS5 +MISS5 +referent +counter +item +door +willmar +post1 +post2 +floor +MISS6 +referent +MISS6 +MISS6 +MISS6 +referent +zZ +\ +MISS6 +MISS6 +t$t=t@[> +t% +2 + +MISS6 +t$t=t@[M +t% +2 + +MISS6 +t$t=t@[[ +MISS6 +MISS6 +MISS6 +MISS6 +MISS6 +MISS6 +MISS6 +MISS6 +MISS6 +MISS6 +MISS6 +MISS6 +MISS6 +MISS6 +MISS6 +MISS6 +MISS6 +MISS6 +MISS6 +MISS6 +MISS6 +MISS6 +referent +snell +item +door +doorX +MISS6 +MISS6 +referent +MISS7 +referent +item +MISS8 +referent +MISS8 +MISS8 +referent +MISS8 +MISS8 +t$t=t@[7 +t% +( + +MISS8 +MISS8 +MISS8 +MISS8 +MISS8 +MISS8 +MISS8 +MISS8 +MISS8 +MISS8 +MISS8 +MISS8 +MISS8 +MISS8 +MISS8 +MISS8 +MISS8 +MISS8 +MISS8 + +%*Q@ +MISS8 +MISS8 + +%*QC +MISS8 +MISS8 + +(*Q@ +MISS8 +t$t=t@[ +MISS8 +t$t=t@[ +$2Q +MISS8 +referent +willmar +counter +item +cardReader +telebeam +telepad +MISS9 +referent +MISS9 +MISS9 +referent +zZ +\B +MISS9 +MISS9 +MISS9 +t$t=t@[5 +t% +2 + +t$t=t@[: +t% +2 + +^ +c$Q +t$t=t@[C +t% +2 + +t$t=t@[J +t% +2 + +62Q^ +MISS9 +MISS9 +MISS9 +MISS9 +MISS9 +MISS9 +MISS9 +MISS9 +MISS9 +MISS9 +t$t=t@[p +MISS9 +referent +target +station +screen +item +counter +MONITEW +t$t=t@[ +$4QY +MONITEW +MONITEW +t$t=t@[4 +t% +d + +There is more than one Value box in range with the same link +MONITEW +referent +textFile +valueBox +passcode +link +boxCounter +MONITEW +wx[Q +referent +MONITNS +t$t=t@[# +$4QY +MONITNS +MONITNS +t$t=t@[7 +t% +d + +There is more than one Value box in range with the same link +MONITNS +referent +textFile +valueBox +passcode +link +boxCounter +MONITNS +wx[S +referent +MONSTER +wx[! +MONSTER +referent +zZ +\ +MONSTER +wx[0 +$? + + +$4? + + +$4? + + +$4Q( +Y? +? +MONSTER +? + + +$? + + +$4Qb +t$t=t:[G +? + + + + +t$t=t:[U +MONSTER +maQ~ +Y? +? +MONSTER +MONSTER +$? + + $4Q2 +? + + + +Y? +? +MONSTER +$? + + +$4? + + +$4? + + +t$t=t:[u +t% +2 + +Y? +? +MONSTER +? + +2$? + +3$4? + +4$4? + +5$4QH +? + +2 +Y? +? +MONSTER +? + +P$? + +Q$4Q +t$t=t:[ +? + +P +Y? +? +MONSTER +referent +monster1 +door +newNpc +MOTION +MOTION +MOTION +MOTION +MOTION +referent +trackedEnough +fram +movement +foundTarget +delay +iSeeYou +MOTION +wx[P +referent +MOTION +wx[V +$4[Y +62Qu +MOTION +MOTION +referent +MTAREGG +t$[# +referent +item +hiValue +loValue +MTAREGG +? +w[H +MTAREGG +referent +_ref +_dir +_num +MTELEPAD +t$t=t:[ +referent +item +MTELEPAD +wx[3 +MTELEPAD +t$t=t@[7 +t$t=t:[> +MTELEPAD +referent +tele +MUSIC +wx[M +referent +NOSTRIL +wx? + + +t$t=t@[ +referent +event +fire +NOSTRIL +NOSTRIL +NOSTRIL +referent +fire +count +fire2 +NOSTRIL +NOSTRIL +^ + +6Q) +NOSTRIL +NOSTRIL +referent +fire +fire2 +count +referent +item +? +0Q +? +*Q] +$2Q. +referent +counter +referent +^ +(62Q +t$[O +tB[P +t$[W +tD[Y + +0y< + +0y< +referent +item +padDir +] +)y< + +4y< + +4y< + +4y< +referent +item +padDir +referent +toDir +]0Q +]0QH +]0Q' +referent +toDir +stepNum +counter +wx[% +? + + +$Q +referent + +p$Q + +q$Q + +r$Q +referent +referent +referent +referent +phrase +$4Q +referent +referent +damageSource +^6Qq +$2Q% +referent +damageSource +aSet +referent +NPCTRIG +wx[ +NPCTRIG +NPCTRIG +NPCTRIG +NPCTRIG +NPCTRIG +referent +event +item +item2 +NPCTRIG +wt$t=t@[S +t% + + +NPCTRIG +referent +typeNpc +item +item2 +NPC_ONLY +^$4Q +^$Qh +NPC_ONLY +NPC_ONLY +$2Q) +NPC_ONLY +NPC_ONLY +NPC_ONLY +referent +item +link +OBSERVER +wx[# +referent +OFFWORK +wx[ +referent +ONCEEGG +ONCEEGG +referent +item +ONCEEGG +ONCEEGG +referent +item +mva11b +]0Q- +t$t=t@[& +^ +c$Q' +mva12b +t$t=t@[; +referent +item +PANELEW +PANELEW +referent +PANELNS +wx[ +PANELNS +referent +Z \k +PEPSIEW +^ +2,Q +PEPSIEW +t$t=t@[ +PEPSIEW +PEPSIEW +referent +item +PEPSIEW +wx[3 +PEPSIEW +referent +Z \k +PEPSINS +^ +2,Q +PEPSINS +t$t=t@[ +PEPSINS +PEPSINS +referent +item +PEPSINS +wx[4 +PEPSINS +referent +PHIR +PHIR +PHIR +PHIR +referent + + + + +K +referent +item +PLASMA +wx[7 +referent +PODBOY +PODBOY +item +spooge +fram +counter +PODBOY +PODBOY + + +*QF +PODBOY +referent +fram +counter +item +PPLATE +PPLATE +PPLATE +PPLATE +^0Q +referent +item +PPLATE2 +PPLATE2 +PPLATE2 +PPLATE2 +PPLATE2 +referent +PPLATE2 +wx[# +PPLATE2 +PPLATE2 +PPLATE2 +PPLATE2 +referent +item +PRISBENC +PRISBENC +PRISBENC +Y +d +d +PRISBENC +PRISBENC +Y +d +d +PRISBENC +PRISBENC +PRISBENC +Y +d +d +PRISBENC +PRISBENC +referent +counter +PRISBENC +wx[@ +referent +PRISLEAN +PRISLEAN +PRISLEAN +Y +d +d +PRISLEAN +PRISLEAN +Y +d +d +PRISLEAN +PRISLEAN +PRISLEAN +Y +d +d +PRISLEAN +PRISLEAN +referent +counter +PRISLEAN +wx[@ +referent +PRISSIT +PRISSIT +PRISSIT +Y +d +d +PRISSIT +PRISSIT +Y +d +d +PRISSIT +PRISSIT +PRISSIT +Y +d +d +PRISSIT +PRISSIT +referent +counter +PRISSIT +wx[@ +referent +RADAR +referent +RDOOR_E +RDOOR_E +referent +RDOOR_N +wx[ +RDOOR_N +referent +REBEL_TV +wxY + +REBEL_TV +REBEL_TV +REBEL_TV +REBEL_TV +REBEL_TV +REBEL_TV +REBEL_TV +REBEL_TV + + $Q0 +REBEL_TV + + +$Q0 +REBEL_TV +REBEL_TV +REBEL_TV + + $Q1 +REBEL_TV +REBEL_TV +referent +REBSNOR +REBSNOR +REBSNOR +REBSNOR +REBSNOR +referent +counter +REBSNOR +wx[6 +referent +REBWORK +referent +REB_BOOT +wxS\ +REB_BOOT +REB_BOOT +REB_BOOT +REB_BOOT +REB_BOOT +referent +counter +REB_COUP +wxS\ +REB_COUP +Y +< + +REB_COUP +REB_COUP +Y +< + +REB_COUP +REB_COUP +referent +counter +REB_COUP +wx[- + + *Q@ +REB_COUP + + *QC +REB_COUP +referent +counter +REB_EGG +referent +REB_EGG +wx[ +^ +)$QG +t$t=t@[! +t% + + + +referent +item +zZ \ + REB_EGG +wx[7 +Rm [> + + $Qg +S\) REB_EGG +REB_EGG + + (Q: +REB_EGG +^ +)$Q +t$t=t@[^ +t$t=t@[c + + (2Q +REB_EGG +t$t=t@[ +t% +2 + +t$t=t@[ +t% +2 + + + +$N +t$t=t@[ +t% +2 + +t$t=t@[ +t% +2 + +S\ REB_EGG + + $4Qp +t$t=t@[ +t% +2 + +t$t=t@[ +t% +2 + +REB_EGG +REB_EGG +REB_EGG +REB_EGG +REB_EGG + +d + + +2 + +REB_EGG +REB_EGG +REB_EGG +REB_EGG +|By< +t$t=t@[ +t% +2 + +REB_EGG +REB_EGG +REB_EGG +REB_EGG +|By< +t$t=t@[0 +t% +2 + +REB_EGG +REB_EGG + + +$N + + +$Q1 +REB_EGG +REB_EGG +REB_EGG +REB_EGG +|By< +t$t=t@[S +t% +2 + +REB_EGG +REB_EGG +REB_EGG +REB_EGG +REB_EGG +REB_EGG +REB_EGG +REB_EGG +REB_EGG +REB_EGG +REB_EGG +REB_EGG +REB_EGG +t$t=t@[y +t% +d + +referent +item +door +moreVideo +REB_EGG +wt$t=t@[ +t% +d + +t$t=t@[ +referent +chest +phold +counter +counter2 +REB_GAR +referent +REB_GAR +REB_GAR +REB_GAR +REB_GAR +REB_GAR +REB_GAR +referent +counter +REB_PAD +REB_PAD +]04[% +t$t=t@[1 +t% + + + + + $Q + + +$Q + + $Q +referent +item +pad2 +REB_PAD +REB_PAD +REB_PAD +REB_PAD +REB_PAD +REB_PAD +REB_PAD +REB_PAD +referent +mapNum +eggNum +zZ +\ +REB_PAD +t$t=t:[ + + +t% +REB_PAD +t$t=t@[ +t% +x + +referent +phold +gunHold +counter +counter2 +RECHAGEW +Y +d? +RECHAGEW +ma0Q +RECHAGEW +t$t=t@[ +t$t=t@[( +t$t=t@[, +t$t=t@[0 +referent +item +RECHAGNS +Y +d? +RECHAGNS +ma0Q +RECHAGNS +t$t=t@[ +t$t=t@[( +t$t=t@[, +t$t=t@[0 +referent +item +RECHFLEW +RECHFLEW +RECHFLEW +t$t=t@[+ +RECHFLEW +RECHFLEW +t$t=t@[> +referent +item +RECHFLEW +wx[O +referent +item +RECHFLNS +RECHFLNS +RECHFLNS +t$t=t@[* +RECHFLNS +RECHFLNS +t$t=t@[< +referent +item +RECHFLNS +wx[M +referent +item +REE_BOOT +REE_BOOT +REE_BOOT +REE_BOOT +REE_BOOT +REE_BOOT +REE_BOOT + + $Q0 +REE_BOOT +REE_BOOT +REE_BOOT + + $Q1 +REE_BOOT +REE_BOOT +referent +event +counter +REE_BOOT + + $4N + + $4Qb +t$t=t@[j +t% + + + +t$t=t@[v +t% + + + +REE_BOOT +REE_BOOT +REE_BOOT +REE_BOOT +REE_BOOT +referent +item +counter +REE_BOOT +referent +RFANBADE +t$t=t@[ +referent +item +fart +fart2 +zZ +\ +RFANBADE +wx[, +? +Q} +RFANBADE +t$t=t@[E +referent +fram +counter +counter2 +item +wind +RFANBADN +t$t=t@[ +referent +item +fart +fart2 +zZ +\ +RFANBADN +wx[, +? +Q~ +RFANBADN +t$t=t@[E +referent +fram +counter +counter2 +item +wind +RFANEW +referent +RFANEW +t$t=t@[ +referent +item +fart +fart2 +zZ +\ +RFANEW +wx[* +RFANEW +RFANEW +t$t=t@[I +^$Q& +RFANEW +referent +fram +counter +counter2 +item +wind +RFANNS +referent +RFANNS +t$t=t@[ +referent +item +fart +fart2 +zZ +\ +RFANNS +wx[+ +RFANNS +RFANNS +t$t=t@[J +^$Q& +RFANNS +referent +fram +counter +counter2 +item +wind +ROAMING +referent +ROLLB_EW +Y? +@ +ROLLB_EW +referent +ROLLB_EW +wx[$ +referent +ROLLB_EW +ROLLB_EW + + 9Q) + +@9Q* +ROLLB_EW +referent +item +item2 +riderList +ROLLB_EW + + 9Q +ROLLB_EW +ROLLB_EW +ROLLB_EW +ROLLB_EW +ROLLB_EW +ROLLB_EW +ROLLB_EW +ROLLB_EW +ROLLB_EW +ROLLB_EW +ROLLB_EW +ROLLB_EW +referent +time +total +counter +oldz +cargo +zCheck +zMax +ROLLB_EW +wx[R +Y +d? +ROLLB_EW +ma0Q6 +ROLLB_EW +referent +ROLLB_EW +wx[p +referent +ROLLB_NS +Y? +@ +ROLLB_NS +referent +ROLLB_NS +wx[$ +referent +ROLLB_NS +ROLLB_NS + + 9Q) + +@9Q* +ROLLB_NS +referent +item +item2 +riderList +ROLLB_NS + + 9Q +ROLLB_NS +ROLLB_NS +ROLLB_NS +ROLLB_NS +ROLLB_NS +ROLLB_NS +ROLLB_NS +ROLLB_NS +ROLLB_NS +ROLLB_NS +ROLLB_NS +ROLLB_NS +referent +time +total +counter +oldz +cargo +zCheck +zMax +ROLLB_NS +wx[; +Y +d? +ROLLB_NS +ma0Q6 +ROLLB_NS +referent +ROLLB_NS +wx[Y +referent +ROLL_EW +Y? +@ +ROLL_EW +referent +ROLL_EW +wx[$ +referent +ROLL_EW +ROLL_EW + + 9Q) + +@9Q* +ROLL_EW +referent +item +item2 +riderList +ROLL_EW + + 9Q +ROLL_EW +ROLL_EW +ROLL_EW +ROLL_EW +ROLL_EW +ROLL_EW +ROLL_EW +ROLL_EW +ROLL_EW +ROLL_EW +ROLL_EW +ROLL_EW +referent +time +total +counter +oldz +cargo +zCheck +zMax +ROLL_EW +wx[: +Y +d? +ROLL_EW +ma0Q6 +ROLL_EW +referent +ROLL_EW +wx[X +referent +ROLL_NS +Y? +@ +ROLL_NS +referent +ROLL_NS +wx[$ +referent +ROLL_NS +ROLL_NS + + 9Q) + +@9Q* +ROLL_NS +referent +item +item2 +riderList +ROLL_NS + + 9Q +ROLL_NS +ROLL_NS +ROLL_NS +ROLL_NS +ROLL_NS +ROLL_NS +ROLL_NS +ROLL_NS +ROLL_NS +ROLL_NS +ROLL_NS +ROLL_NS +referent +time +total +counter +oldz +cargo +zCheck +zMax +ROLL_NS +wx[Q +Y +d? +ROLL_NS +ma0Q6 +ROLL_NS +referent +ROLL_NS +wx[o +referent +RSTATION +referent +RTELEPAD +t$t=t:[ +referent +item +RTELEPAD +wx[1 +RTELEPAD +t$t=t@[5 +t$t=t:[< +RTELEPAD +referent +tele +SAFE_EW +? +QC +SAFE_EW +SAFE_EW +t$t=t@[( +t% + + + +^ + +$[2 +$4[3 +$4[4 +^ + $4QZ +]0QB +SAFE_EW +SAFE_EW +SAFE_EW +SAFE_EW +SAFE_EW +referent +item +item2 +counter +SAFE_NS +? +QC +SAFE_NS +SAFE_NS +t$t=t@[& +t% + + + +^ + +$[0 +$4[1 +$4[2 +^ + $4QZ +]0QB +SAFE_NS +SAFE_NS +SAFE_NS +SAFE_NS +SAFE_NS +referent +item +item2 +counter +SATARG +SATARG +SATARG +SATARG +SATARG +mva15b +SATARG +SATARG +SATARG +t$t=t@[0 +SATARG +t$t=t@[9 +SATARG +Y +( + +SATARG +t$t=t@[C +SATARG +Y +2 + +SATARG +SATARG +SATARG +SATARG +SATARG +SATARG +SATARG +SATARG +t$t=t@[\ +referent +item +counter +SCANNER +SCANNER +SCANNER +t$t=t:[ +t% + + +^62Q" +SCANNER +SCANNER +referent +SCANNER +referent +SCIENTIS +wx[ +referent +SDOOR_E +wxY? +SDOOR_E +referent +SDOOR_N +wxY? +SDOOR_N +referent +SECRTEGG +referent +item +door +range +SENTRY +referent +SENTRY +referent +SENTRY +wx[( +referent +SENTRY +wx[/ +referent +SENTRY +wx[5 +SENTRY +Y? +N< +SENTRY +referent +SENTRY +wx[A +referent +SFXTRIG +SFXTRIG +referent +event +SHOCKER +SHOCKER +SHOCKER +SHOCKER +SHOCKER +referent +randNum +duration +skill +kernelCheck +counter +SHOCKER +SHOCKER +SHOCKER +t$t=t:[t +(2Q[ +SHOCKER +SHOCKER +referent +monster +SHOCKEW +? +Q +referent +SHOCKEW +referent +SHOCKEW +referent +SHOCKEW1 +? +Q +SHOCKEW1 +referent +SHOCKEW1 +referent +SHOCKEW1 +wx[" +referent +SHOCKNS +? +Q +referent +SHOCKNS +referent +SHOCKNS +referent +SHOCKNS1 +? +Q +SHOCKNS1 +referent +SHOCKNS1 +referent +SHOCKNS1 +wx[" +referent +SICBFLNS +SICBFLNS +SICBFLNS +t$t=t@[* +t$t=t@[1 +t$t=t@[8 +SICBFLNS +t$t=t@[I +t$t=t@[Q +t$t=t@[Y +referent +item +SICBFLNS +wx[j +referent +item +SICBOXNS +Y +d? +SICBOXNS +ma0Q +t$t=t@[ +t$t=t@[+ +t$t=t@[/ +t$t=t@[3 +referent +item +SIGNEW +^ + $Q +referent +SIGNNS +referent +SKILLBOX +SKILLBOX +SKILLBOX +SKILLBOX +SKILLBOX +SKILLBOX +SKILLBOX +SKILLBOX +referent +skill +SLIDEFLR +^ + $QU +SLIDEFLR +SLIDEFLR +referent +SLIDEFLR +^ + 6QU +^ + 6Q@ +SLIDEFLR +SLIDEFLR +referent +SMALCHAI +SMALCHAI +SMALCHAI +referent +fram +item +count +spin +direction +SMALLTAB +SMALLTAB +referent +item +SOLDIER +referent +SPANEL +^ +((Q +SPANEL +referent +SPECIAL +referent +SPECIAL +w? + + +.4Q' +SPECIAL +(2Q' +SPECIAL +SPECIAL +SPECIAL +SPECIAL +t$t=t:[U +t% +2 + +SPECIAL +SPECIAL +t$t=t:[f +t% +2 + +SPECIAL +SPECIAL +? + + $Q] +SPECIAL +referent +phase +SPECIAL +SPECIAL +SPECIAL +SPECIAL +referent +counter +time +phase1 +phase2 +SPECIAL +SPECIAL +SPECIAL +SPECIAL +SPECIAL +referent +mapNum +npcNum +SPECIAL +SPECIAL +SPECIAL +referent +SPIDER +? +0Q + + +.Q + +SPIDER +(4Q) +SPIDER +,4Q# +SPIDER + + *Q@ +SPIDER +SPIDER +SPIDER +? + +c(Q +referent +spiderType +spider +target +dest +count +targetLoop +SPIDER +? +w[ +SPIDER +SPIDER +referent +spider +targetLoop +target +zZ&\ +SPIDER +SPIDER +SPIDER +]0Q + +]0Q + +]0Q + +referent +destX +destY +destZ +currentP +counter +minor +oabs +ovel +axis +ztarg +zcur +SPIDPAD +referent +SPIDPAD +referent +SPIDWALK +referent +SPIDWALK +referent +SPIDWALK +wx[# +referent +SSBOX_EW +^0Q> +SSBOX_EW +Y +d? +SSBOX_EW +ma0Q0 +SSBOX_EW +SSBOX_EW +referent +SSBOX_NS +^0Q> +SSBOX_NS +Y +d? +SSBOX_NS +ma0Q0 +SSBOX_NS +SSBOX_NS +referent +SSWITCHE +SSWITCHE +referent +SSWITCHE +SSWITCHE +SSWITCHE +t$t=t@[7 +t$t=t@[R +t% +2 + +t$t=t@[ +SSWITCHE +t$t=t@[ +SSWITCHE +t$t=t@[ +SSWITCHE +SSWITCHE +SSWITCHE +referent +sswitch +switch1 +switch2 +switch3 +timer +sswitch2 +switch21 +switch22 +switch23 +counter +SSWITCHN +SSWITCHN +referent +SSWITCHN +SSWITCHN +SSWITCHN +t$t=t@[6 +t$t=t@[Q +t% +2 + +t$t=t@[ +SSWITCHN +t$t=t@[ +SSWITCHN +t$t=t@[ +SSWITCHN +SSWITCHN +SSWITCHN +referent +sswitch +switch1 +switch2 +switch3 +timer +sswitch2 +switch21 +switch22 +switch23 +counter +STABLE +t$t=t@[ +STABLE +t$t=t@[& + + (QW +referent +fram +item +thing +STATICEW +wx[ +referent +STATICEW +referent +STATICNS +wx[ +referent +STATICNS +referent +STEAM +wS\ +STEAM +STEAM +t$t=t:[ +^6Q: +]0Q# +referent +item +detect +STEAM +STEAM +^$Q* +]0Q% +referent +STEAM1 +referent +STEAM1 +Y? +@ +STEAM1 +referent +STEAM2 +referent +STEAM2 +Y? +@ +STEAM2 +referent +STEAMBOX +wx? + + + + + +t$t=t@[: +t% + + +referent +event +steam +steam2 +direction +STEAMBOX +^ +'6K + +$2Qg +STEAMBOX +STEAMBOX +referent +steam +direction +count +steam2 +STEAMBOX +$4QN +^ +'6@ +$2Q) +STEAMBOX +$2Q) +STEAMBOX +STEAMBOX +$2Q) +STEAMBOX +STEAMBOX +referent +steam +direction +count +steam2 +STELEPAD +t$t=t:[ +referent +item +STELEPAD +wx[2 +STELEPAD +t$t=t@[6 +t$t=t:[= +STELEPAD +referent +tele +STORMTRO +referent +SURCAMNS +referent +SURCAMNS +wx[% +referent +SURCAMNS +t$t=t@[= +$4QW +SURCAMNS +SURCAMNS +SURCAMNS +SURCAMNS +t$t=t@[V +t% +d + +SURCAMNS +SURCAMNS +referent +textFile +monit +valueBox +passcode +link +code +SURCAMNS +SURCAMNS +t$t=t@[ +^$Qi +SURCAMNS +SURCAMNS +t$t=t@[ +t% +( + +^$Q +SURCAMNS +SURCAMNS +SURCAMNS +]0Q) +SURCAMNS +SURCAMNS +SURCAMNS +SURCAMNS +SURCAMNS +SURCAMNS +SURCAMNS +SURCAMNS +SURCAMNS +]0Q) +SURCAMNS +SURCAMNS +SURCAMNS +referent +screen +cameraEgg +trueRef +therma +SURCAMNS +wt$[0 +tB[1 + +2 + +SURCAMNS +SURCAMNS +SURCAMNS +referent +eventTrigger +foundGun +SWITCH +SWITCH +SWITCH +referent +counter +SWITCH +SWITCH +SWITCH +SWITCH +SWITCH +^ +2,Q +SWITCH +SWITCH +SWITCH +SWITCH +SWITCH +referent +okay +SWITCHEW +SWITCHEW +SWITCHEW +referent +SWITCHNS +SWITCHNS +SWITCHNS +referent +S_CHAIR +S_CHAIR +S_CHAIR +referent +fram +item +count +spin +direction +TARGETEW +TARGETEW +referent +item +TARGETNS +TARGETNS +referent +item +TEST +TEST +TEST +TEST +TEST +referent +TEXTFILE +referent +_textFile +TEXTFILE + +n.Q + +<.Q +referent +linkNum +msgNum +TEXTFILE +TEXTFILE +TEXTFILE +referent +\)"TEXTFILE + +n.Q + +<.Q +Due to recent rebel activity, the T-300 lines have failed. *^Do NOT attempt to access the WEC network at this time.^END OF MESSAGE... +The use of WEC equipment for playing computerized entertainment software is strictly prohibited!* Return to work IMMEDIATELY!*** +All workers must display their badges at ALL TIMES!* Failure to comply will result in immediate termination!*^ +Report all unauthorized use of WEC equipment immediately! Remember, your co-workers could be rebel sympathizers! Collect big cash rewards too!* +Unauthorized access of this terminal constitutes a violation of WEC security code 1701-D. Please report yourself to the nearest WEC security officer for correctional measures IMMEDIATELY.*^ +The WEC network is exp*erien^*cing*^ slight dif^*ficulties.^Please st$#@**%^#@!*)(*^%$#^ +The carrying of unregistered radiation detection devices is strictly prohibited by the WEC. Register yours today. Remember, the WEC is just like family, and we care about you! +WEC T-300/SYS out of disk space^ + + $Q +Consortium-wide meeting tomorrow at 1330. WedgeRoom 1501. This is a mandatory meeting! All Branch Leaders must attend! + + +$Q +The WEC Regulatory Commission requires reports of your daily activities. Failure to submit these reports may result in immediate termination. +The WEC network is experiencing slight difficulties.^Please stand by*.*.*.^ +Doors have been opened.^ +Force field deactivated.^ +Electronic bridge extended.^ +Security systems activated.^ +Security systems de-activated.^ + + $4Q8 +All alarm systems have been de-activated.^ + + +$Q +From: Security^______________^Due to recent rebel activity, the code to operations has been changed to +^Remember, delete this message! Spies are everywhere! +Security Cartel HQD^___________________^*^Accessing system:*.*.*.*^^Thresher Cannon: *ACTIVE +To all Refinery Ops^2nd Class Tech Stokes has once again started a fire in the thermalcoupler area.^We ask again that all employees smoke only in the authorized areas. + + $Q +To all Refinery Ops^3rd Class Tech Brandt has contaminated the fifth level with dangerous^plutonium isotopes again. Be careful where you step.^ +Security Cartel:^________________^Remote viewing facility.^*Thermal Coupler power system.^^Watch Station: ^*<NOW ACTIVE> +Refinery Operations:^____________________^Now interfacing with remote service droid...*^Thermatron ZC90201^^Unit is now *-ONLINE-. +Security Cartel: ^^Remote alarm panel^User ID <TZ81664>^*^Area is secured:*^Stand down from alert. +Security Cartel:^__________________^Remote Operations^Watch Station: ^*<NOW ACTIVE> +From: DBEYER^______________^Due to the alert, I have hidden my keycard. Do not open the safe unless it's of absolute ^importance, for there could be rebel saboteurs about. Keep in mind that this may not be a drill, this could be for real this time.^ + is this week's passcode. +From: MGREENE^______________^*You will have to learn to write down the new passcodes.^I can't keep giving these out!^ + is this week's passcode. +^This is the last time, Philbert!^ +NOTICE:^^To: All Personnel^Please remember to keep your keycards with you at all times.^ +Security Cartel: ^Operations Center.^User ID T*Z*1*6*^^Area is secured:*^Stand down from Alert. +Security Cartel: ^Operations Center.*^User ID T*Z*1*6*^^Due to malfunctions within the security grid, the telepad is inoperative. Please use the backup telepad in the west wing. +Phase one of the impassable laser field has been de-activated. +NOTICE: To all Techs - ^The passcode to Dr. Hoffman's lab has been changed to^ +.^*End of Message < +$4Q, +Mission 2 Generic Message 0-9^ +Attention Plant Workers:^There has been a change in security procedures. The security passcode has been changed to +.^*End of Message < +Thermatron Assembly Line:^_____________^Now interfacing with remote droid *.*.*.^<Thermatron> VTK944^^Unit is now *-ONLINE-. + + $Q; +Thermatron Manufacturing Plant:^_____________ + +!$Qg +Refinery Operations:^____________^Remote viewing facility.^*Restricted Access*^Granted + +"$Qk +Security Cartel:^________________^Remote viewing facility.^*Production Line^*<DEACTIVATED> + +#$Q +Security Cartel:^________________^*Auxiliary Production Line^*<ACTIVE>^Shut down requires Security Card Clearance +Rh ? + +$$Q< +Thermatron Auxiliary Production Line:^________ +R$ ? + +%$QN +Security Cartel:^________________^*Laser Field^*<DEACTIVATED> + +&$Q +Security Cartel:^________________^Remote viewing facility.^*Laser Field^*<ACTIVE>^Security card clearance required to de-activate + +'$Q +Thermatron Assembly Line Vault:^____To access the Thermatron design plans, use the new security code +^Memorize the code and delete this message immediately! < + +($QN +Security Cartel:^________________^*Laser Field^*<DEACTIVATED> + +)$Q +Remote Security Op:^_____________^Now interfacing with remote droid *.*.*.^<Thermatron> ATK656^^Unit is now *-ONLINE-. + +*$QN +^Security Control:^_______________^^*Laser Field^*<ACTIVATED> +R* +? + ++$Qm +Security Cartel HQD^___________________^*^Accessing system:*.*.*.*^^Thresher Cannon: *ACTIVE + +,$Q +Security Cartel HQD^___________________^*^Accessing system:*.*.*.*^^SORC Monitoring station security field:^^*<DEACTIVATED> +R! ? + +-$Q +Security Station 5:^^The passcode to the Sector Y15 blast door has been changed to: +*.*.*. +^^Spies are everywhere so be alert! + +.$Q +^* WEC Email^^To: Prof. Coulson^^From: Sev Dorren,^Security Chief^^Professor, I have installed a force-field at the entrance to the SORC station as you instructed. If there is anything further required please let me know. ^PS: The only way to access the force-field is through the central computer, so I am sure it will be quite safe from any saboteurs. .^*End of Message < + +/$Q +^*Private Journal:^Sev Dorren^^Note to remind myself about the SORC station. I have changed the force field access code to: +^*End of Message < + +0$QL +Security code to Level 4 express elevator is: + +1$QG +Code to Security Station forcebridge is: + +2$Q +Matt - Since you're new, and most likely unfamiliar with all of these new numbers, I thought I'd give you this one for free. It's +. J.J. +WEC SECURITY SYSTEM:^^Remote Camera: ACTIVE* + +4$Q +Dr. Watson:^Since we no longer produce the 37x18 Chip at the Snell Memorial Science Center, you can expect to receive the remaining chips for meltdown this afternoon. See that no chips find their way out of your facility.^L. Probst^End of Message < + +5$Q +Ms. Ashcraft - *It has come to my attention that you have had problems with your platform elevator. Just put an Out of Order sign on it, and I'll send a maintenance worker out to fix it A.S.A.P. Larson + +6$QN +WEC SECURITY SYSTEM:^^Remote Camera: ACTIVE*^M.E.L.F. Station + +8$QX +WEC SECURITY SYSTEM:^^Remote Camera: *ACTIVE^Teleporter Room^Level Four + +9$QU +WEC SECURITY SYSTEM:^^Remote Camera: ACTIVE*^Security System^*ACTIVE + +:$Q\ +? +[ + +Dear Dr. Soose:^A new keypad for your very own safe I have now put in its very own place With its very own numbers^ And its very own code ( +Now you can store your very own load! +WEC SECURITY SYSTEM:^Remote Camera: ACTIVE*^Security System^*ACTIVE^Forcefield Deactivated +referent +linkNum +msgNum +passcode +textFile +rnge +THERM +referent +THERMATR +referent +THRMBCKE +wx[ +? +QQ +THRMBCKE +THRMBCKE +THRMBCKE +t$[! +tB[" +t$[) +tD[* +THRMBCKE +THRMBCKE +referent +ewall +therma +THRMBCKN +wx[ +? +QQ +THRMBCKN +THRMBCKN +THRMBCKN +t$[! +tB[" +t$[) +tD[* +THRMBCKN +THRMBCKN +referent +ewall +therma +TIMER +referent +TIMER +wx[" +referent +TIMER +wx[- +referent +TIMER +TIMER +$4Q+ +TIMER +TIMER +TIMER +$4Qa +TIMER +TIMER +referent +time +phase2 +TRANSFOR +referent +TRANSFOR + +d(QP +TRANSFOR +t$[J +tB[K +TRANSFOR +referent +fram +damagePoints +item +TRIGEGG +TRIGEGG +referent +item +TRIGEGG +TRIGEGG +referent +item +TRIGGER +TRIGGER + +dO@ +TRIGGER +TRIGGER +TRIGGER +TRIGGER +TRIGGER +TRIGGER +TRIGGER +TRIGGER +TRIGGER +t$t=t@[ +TRIGGER +TRIGGER +referent +phase +lowPriorityTriggers +cmdphase +npcNum +mapNum +item +aitem +baseLink +newLink +searchtype +newphase +TRIGGER +TRIGGER +TRIGGER +TRIGGER +TRIGGER +TRIGGER +TRIGGER +TRIGGER +TRIGGER +TRIGGER +referent +npcNum +mapNum +searchtype +aitem +baseLink +newLink +TRIGGER +TRIGGER +TRIGGER +referent +door +TRIGGER +t$t=t@[ +t%N@ +t$t=t@[ +t%N@ +t$t=t@[ +t%N@ +t$t=t@[ +t%N@ +t$t=t@[ +t%N@ +TRIGGER +TRIGGER +t$t=t@[< +t%N@ +t$t=t@[K +t%N@ +t$t=t@[i +t%N@ +TRIGGER +referent +npcNum +mapNum +baseLink +searchtype +scmd +item +aitem +newLink +item2 +TRIGGER +t$t=t:[ +t%N@ +t$t=t:[ +t%N@ +t$t=t:[ +t%N@ +t$t=t@[ +t%N@ +t$t=t:[ +t%N@ +TRIGGER +TRIGGER +t$t=t:[ +t%N@ + +d$Q + +t$t=t:[& +t$t=t@[D +t%N@ +TRIGGER +referent +npcNum +mapNum +baseLink +searchtype +scmd +item +aitem +newLink +distance +item2 +TRIGGER +t$t=t@[x +t%N@ +t$t=t@[ +t%N@ +t$t=t@[ +t%N@ +t$t=t@[ +t%N@ +t$t=t@[ +t%N@ +TRIGGER +TRIGGER +t$t=t@[ +t%N@ +t$t=t@[ +t%N@ +t$t=t@[ +t%N@ +TRIGGER +referent +npcNum +mapNum +baseLink +searchtype +scmd +item +aitem +newLink +item2 +TRIGGER +t$t=t@[/ +t%N@ +t$t=t@[; +t%N@ +t$t=t@[G +t%N@ +t$t=t@[Y +t%N@ +t$t=t@[l +t%N@ +TRIGGER +TRIGGER +t$t=t@[ +t%N@ +t$t=t@[ +t%N@ +t$t=t@[ +t%N@ +TRIGGER +referent +npcNum +mapNum +baseLink +searchtype +scmd +item +aitem +newLink +item2 +TRIGGER +t$t=t:[ +t%N@ +t$t=t:[ +t%N@ +t$t=t:[ +t%N@ +t$t=t@[ +t%N@ +t$t=t:[& +t%N@ +TRIGGER +TRIGGER +t$t=t:[L +t%N@ + +d$Q + +t$t=t:[c +t$t=t@[~ +t%N@ +TRIGGER +referent +npcNum +mapNum +baseLink +searchtype +scmd +item +aitem +newLink +distance +item2 +TRIGGER +t$t=t@[ +t%N@ +t$t=t@[ +t%N@ +t$t=t@[ +t%N@ +t$t=t@[ +t%N@ +t$t=t@[ +t%N@ +TRIGGER +TRIGGER +t$t=t@[ +t%N@ +t$t=t@[ +t%N@ +t$t=t@[# +t%N@ +TRIGGER +referent +npcNum +mapNum +baseLink +searchtype +scmd +item +aitem +newLink +item2 +TRIGGER +t$t=t@[W +t%N@ +TRIGGER +TRIGGER +TRIGGER +TRIGGER +TRIGGER +TRIGGER +t$t=t@[ +t%N@ +t$t=t@[ +t%N@ +t$t=t@[ +t%N@ +t$t=t@[ +t%N@ +TRIGGER +t$t=t@[ +t%N@ +TRIGGER +t$t=t@[ +t%N@ +TRIGGER +t$t=t@[ +t%N@ +t$t=t@[ +t%N@ +referent +npcNum +mapNum +baseLink +searchtype +scmd +aitem +counter +TRIGGER +t$t=t@[' +t%N@ +TRIGGER +TRIGGER +TRIGGER +TRIGGER +TRIGGER +TRIGGER +t$t=t@[X +t%N@ +t$t=t@[a +t%N@ +t$t=t@[q +t%N@ +t$t=t@[ +t%N@ +TRIGGER +t$t=t@[ +t%N@ +TRIGGER +t$t=t@[ +t%N@ +TRIGGER +t$t=t@[ +t%N@ +t$t=t@[ +t%N@ +referent +npcNum +mapNum +baseLink +searchtype +scmd +aitem +counter +TRIGGER +t$t=t:[ +t%N@ +TRIGGER +TRIGGER +TRIGGER +TRIGGER +TRIGGER +TRIGGER +t$t=t:[ +t%N@ +t$t=t:[ +t%N@ +t$t=t:[4 +t%N@ +t$t=t:[U +t%N@ +TRIGGER +t$t=t:[f +t%N@ +TRIGGER +t$t=t:[w +t%N@ +TRIGGER +t$t=t:[ +t%N@ +t$t=t:[ +t%N@ +referent +npcNum +mapNum +baseLink +searchtype +scmd +aitem +counter +TRIGPAD +TRIGPAD +TRIGPAD +TRIGPAD +TRIGPAD +TRIGPAD +t$t=t@[7 +t%[8 +TRIGPAD +TRIGPAD +referent +item +elev +UPPLATE +wx[ +UPPLATE +UPPLATE +UPPLATE +UPPLATE +UPPLATE +referent +item +VALBOX +referent +lowByte +highByte +keypadCode +VALUEBOX +wx[" +referent +randNum +VALUEBOX +referent +rand +lowByte +highByte +VALVE +VALVE +VALVE +VALVE +VALVE +VALVE +VALVE +VALVE +referent +counter +item +VARDESK +VARDESK +VARDESK + + $Q0 +VARDESK + + +$Q1 +VARDESK +VARDESK +VARDESK + + $Q1 +VARDESK +VARDESK +t$t=t@[A +VARDESK +referent +item +counter +VARDESK +wx[[ +VARDESK +VARDESK +^0QO +VARDESK +^ +2,QU +VARDESK +VARDESK +VARDESK +referent +counter +VARDESK +referent +VARGAS +wx[ +referent +VAR_BOOT +VAR_BOOT +VAR_BOOT +VAR_BOOT +VAR_BOOT +VAR_BOOT +VAR_BOOT + + $Q0 +VAR_BOOT +VAR_BOOT +referent +event +counter +VAR_BOOT + + $4Qb +t$t=t@[Z +t% + + + +t$t=t@[f +t% + + + +VAR_BOOT +VAR_BOOT +VAR_BOOT +VAR_BOOT +VAR_BOOT +referent +item +counter +VAR_BOOT +referent +VETRON +referent +VMAIL +VMAIL +KILL BOARD:^-----------^Guards: +^Soldiers: +^Storm troopers: +^Elite troopers: +^Enforcers: +^^Androids: +^Thermatrons: +^Vetrons: +^Solartrons: +VMAIL +VMAIL +VMAIL +VMAIL +VMAIL +VMAIL +VMAIL +VMAIL +referent +textFile +WALGUNEW +referent +WALGUNEW +referent +WALGUNEW +wx[( +referent +WALGUNEW +wx[0 +referent +WALGUNEW +wx[6 +WALGUNEW +Y? +N< +WALGUNEW +referent +WALGUNNS +referent +WALGUNNS +referent +WALGUNNS +wx[( +referent +WALGUNNS +wx[0 +referent +WALGUNNS +wx[6 +WALGUNNS +Y? +N< +WALGUNNS +referent +WALLGUN + +c,Q + +referent +WALLGUN + +c,Q + +referent +WALLGUN +referent +WALLGUN +? + + + +referent +WALLGUN + +Z(? + +c,4Q8 + +Z$Q + +[$Q + +\$Q +referent +target +WALLGUN +$4? + +$4Q& +$4Q, + + $Q +referent +WALLGUN +WALLGUN +referent +WALLGUN +WALLGUN +WALLGUN +referent +WALLGUN + +c,Q + + +c$? +WALLGUN +WALLGUN + + $Q" +WALLGUN +Y? +@ +WALLGUN + + +$Q& +Y? +@ +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +Y? +@ +WALLGUN + + $Q& +Y? +@ +WALLGUN +Y? +@ +WALLGUN +Y? +@ +WALLGUN +WALLGUN +maQ( +WALLGUN +WALLGUN +WALLGUN +referent +target +brain +delay +WALLGUN +referent +WALLGUN +referent +WALLGUN +referent +WALLGUN +referent +zZ +\t +WALLGUN +(2Q) +(2Q) + + .2[ +referent +target +targItem +coordToCoordDir +left +right +zZ \) +WALLGUN +^ +c,Q +referent +target +targetNpc +WALLGUN +WALLGUN +*2[B + +.*24Q +referent +target +brain +delay +dist +WALLGUN +WALLGUN +referent +delay +WALLGUN +WALLGUN +WALLGUN +WALLGUN +$2Q. +WALLGUN +referent +target +brain +left +right +panRight +panLeft +isTurret +zZ \ +WALLGUN +WALLGUN +WALLGUN +WALLGUN +$2Q. +WALLGUN +Y? +@ +WALLGUN +referent +target +left +right +panRight +panLeft +isTurret +delay +zZ \ +WALLGUN +WALLGUN +WALLGUN +WALLGUN +$2Q. +Y? +@ +WALLGUN +WALLGUN +referent +target +left +right +panRight +panLeft +isTurret +delay +WALLGUN +WALLGUN +WALLGUN +62Q +WALLGUN +referent +left +right +panRight +isTurret +delay +WALLGUN +WALLGUN +WALLGUN +62Q +WALLGUN +referent +left +right +panLeft +isTurret +delay +zZ \Z +WALLGUN +WALLGUN +WALLGUN +WALLGUN +$2Q. +WALLGUN +referent +left +right +panRight +panLeft +isTurret +delay +zZ \] +WALLGUN +WALLGUN +WALLGUN +WALLGUN +$2Q. +WALLGUN +referent +left +right +panRight +panLeft +isTurret +delay +zZ \h +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +Y? +@ +WALLGUN +referent +target +left +right +panRight +panLeft +isTurret +delay +zZ \h +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +Y? +@ +WALLGUN +referent +target +left +right +panRight +panLeft +isTurret +delay +zZ \ +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +Y? +@ +WALLGUN +referent +target +left +right +panRight +panLeft +isTurret +delay +zZ \ +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +Y? +@ +WALLGUN +referent +target +left +right +panRight +panLeft +isTurret +delay +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +referent +target +brain +left +right +isTurret +WALLGUN +WALLGUN +WALLGUN +*2[x + +.*24Q( +WALLGUN +referent +target +brain +dist + WALLGUN +> + + +$Q +> + + $Q +> + + +$Q +> + + $Q +> + + $Q +> + + +$Q +> + + $Q +> + + +$Q +> + + $Q +> + + $Q +> + + +$Q +> + + $Q +> + + $Q +> + + +$Q +> + + $Q +referent +\) WALLGUN +> + + +$Q +> + + $Q +> + + +$Q +> + + $Q +> + + $Q +> + + +$Q +> + + $Q +> + + +$Q +> + + $Q +> + + $Q +> + + +$Q +> + + $Q +> + + $Q +> + + +$Q +> + + $Q +referent +WALLGUN +$> + + +referent +WALLGUN +> + + $Q +> + + +$Q +> + + $Q +referent +WALLGUN + > + + +[ > + + +[ + > + + + > + + + > + + +[ > + + + > + + + > + + + > + + + > + + $Q + > + + +$Q + > + + + > + + + > + + $Q + > + + + > + + +referent +WALLGUN +[ [ +^[ +[! + +[% + +[' P +referent +WALLGUN +[. @ +[2 [1 [0 ? +$4[1 ? +[3 + +[6 + +[8 P +referent +WALLGUN +w[= Y + +WALLGUN +[> @ +[A + +[B @ +[C @ +[E @ +[F ? +[H + +[J Y@ +WALLGUN +[L @ +[N ? +@ +[P R +[S ? +[U ? +[W R +[Z ? + +.,Q +[\ R +[f ? +[g > +[h Y + +WALLGUN +[i @ +[j Y + +WALLGUN +[l ? +[m > +[n Y + +WALLGUN +[o @ +[p Y + +WALLGUN +[r ? +[s > +[t Y + +WALLGUN +[u @ +[v Y + +WALLGUN +[} > +$4Q_ +WALLGUN +$4Qw +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +$4QR +WALLGUN +WALLGUN +referent +target +brain +dist +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +$4Q_ +WALLGUN +$4Qw +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +$4QR +[ +Y + +WALLGUN +WALLGUN +referent +target +dist +WALLGUN +WALLGUN +[ +> + + + +[! +> +@ +[" +> +@ +[# +> +@ +[% +? +[& +? +[( +@ +[* +> +@ +[+ +> +@ +[, +> +@ +[. + + +[1 +[0 +@ +^[1 + +[2 + + +[8 + + +[: +P +referent +ammo +WALLGUN +$4Q + +[G + +d +$4Q + +[L + +d +$4Q + +[Q + +2 +[` + +d +[g +[f +Y? +WALLGUN +ma0Q +[h + + +[j + +&@ +[n + +'@ +[s +@ +[t +@ +[v +? +[w +? +[y +? +[z +? +[| + + +[~ +P +referent +maxHit +turn +fire +WALLGUN +^ +c,QA +WALLGUN +ma0Q +WALLGUN +WALLGUN +WALLGUN +WALLGUN +$4Q8 +^ + 6Q +WALLGUN + + + @ +$4Qe + + + + + + +WALLGUN +WALLGUN +$4QU +WALLGUN +^ +4(Q +WALLGUN +t$t=t@[ +^ +4(Q +WALLGUN +referent +gun2 +broken +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +$4Q_ +WALLGUN +$4Qw +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +WALLGUN +$4QR +WALLGUN +WALLGUN +referent +target +dist +WALLGUN +WALLGUN +referent +ammo +WINDSURF +referent +item +WINDSURF +wxt$[, +referent +item +WINDSURF +wx[< + + $Q + + +$Q + + $Q +WINDSURF +WINDSURF +WINDSURF +WINDSURF +referent +item +xoff +yoff +speed +param +WINDSURF +referent +WSHOCKEW +t$t=t:[ +referent +item +WSHOCKEW +wx[# +WSHOCKEW +WSHOCKEW +WSHOCKEW +referent +item +shocker +shockCount +WSHOCKEW +wx[_ +referent +WSHOCKNS +t$t=t:[ +referent +item +WSHOCKNS +wx[# +WSHOCKNS +WSHOCKNS +WSHOCKNS +referent +item +shocker +shockCount +WSHOCKNS +wx[_ +referent +WVENTEW +referent +WVENTEW +t$t=t@[! +t%[" + + + + +referent +fram +windsurf +WVENTNS +referent +WVENTNS +t$t=t@[ + + + + +referent +fram +windsurf +YELRAIL + + +$4Q +^ +2,Q +$4Q2 +$4Q2 +$4Q) +^0Q +^ +p$Q +referent +shotRef +item +damage +YR16X6EW +YR16X6EW +referent +YR16X6NS +YR16X6NS +referent +YR1X1 +YR1X1 +referent +YR2X6EW +YR2X6EW +referent +YR2X6NS +YR2X6NS +referent +YR4X6EW +YR4X6EW +referent +YR4X6NS +YR4X6NS +referent +YR8X6EW +YR8X6EW +referent +YR8X6NS +YR8X6NS +referent +Y_POOL +wx? + +Y_POOL +^62Q +Y_POOL +referent +item +SL_EW-4 +referent +_num +SL_EW-4 +referent +_num +SL_EW-8 +referent +_num +SL_EW-8 +referent +_num +SL_NS-4 +referent +_num +SL_NS-4 +referent +_num +SL_NS-8 +referent +_num +SL_NS-8 +referent +_num +Z$\H +NPCDEATH +NPCDEATH +t$t=t@[8 +t% +d + +NPCDEATH +$4[` +$4[a +$4[b +$4[c +$4QR +NPCDEATH +R' +K +Rq K +R: K + +NPCDEATH +R{ +R +S\? +NPCDEATH + +NPCDEATH + NPCDEATH +S\, NPCDEATH +t$[ +NPCDEATH +NPCDEATH +^ +2,Q + + *Q@ +NPCDEATH +NPCDEATH +NPCDEATH +referent +link +NpcContents +deathBox +param +hits +keyCard +item +deadGuy +goods +counter +spillBlood +spillOil +spillCoolant +newDir +flipIt +newType +NPCDEATH +t$[Z + + +$Q +referent +item +goods +zZ +\ + NPCDEATH +$4QZ +^ +b,Q +^ +b,Q +^ +P? +^ +P? +,2Q +^ +P,Q +^ +b,Q +^ +Z? +,2Q +^ +P? +,2Q +^ +Z,Q +^ +b,Q +^ +b,Q +^ +b,Q +^ +F? +^ +F? +^ +Z? +^ +P,Q +^ +b,Q +^ +F? +^ +K,Q +^ +2,Q +^ +b,Q +^ +b,Q +^ +Z,Q +^ +_,Q +^ +U? +^ +_,Q +^ +P? +^ +P,Q +^ +b,Q + +d +K +^ +B,Q +^ +<? +^ +2(2Q +referent +item +counter +skill +sLevel +wimp +fullOfShit +D_PLASMA +referent +D_PLASMA +D_PLASMA +referent +D_SKELET +referent +D_SKELET +D_SKELET +referent +SL_EW-16 +referent +_num +SL_EW-16 +referent +_num +SL_NS-16 +referent +_num +SL_NS-16 +referent +_num +STEAMEGG +t$t=t@[ +t% +2 + +STEAMEGG +STEAMEGG +STEAMEGG +referent +sBox +RDOOR1_E +referent +RDOOR1_E +RDOOR1_E +referent +RDOOR2_E +referent +RDOOR2_E +RDOOR2_E +referent +RDOOR3_E +referent +RDOOR3_E +RDOOR3_E +referent +RDOOR4_E +referent +RDOOR4_E +RDOOR4_E +referent +RDOOR5_E +referent +RDOOR5_E +RDOOR5_E +referent +\H$TEXTFIL1 + +<$Q7 +To: Senator Templin^From: Security^Due to recent rebel threats Senator Manderfeld's office has changed his teleportation coordinates.^Your Speed-Tele will have to be reprogrammed to: +.^*And Have a Nice Day. +Congressional Office Security^ + +=$Q* +? +[Y +To: Senator Manderfeld^From: Security^Due to recent rebel threats, the Courtroom has changed its teleportation coordinates.^Your Speed-Tele will have to be reprogrammed to: +.^*And Have a Nice Day. +Congressional Office Security^ +Rs!? + +>$QD +To: Senator Sheffield^ From: Congressional Security^ Due to recent rebel threats, the Clerical Division has changed its teleportation coordinates. Your Speed-Tele will have to be reprogrammed to: +^*And ** Have a Nice Day.< +Congressional Office Security^ +R' ? + +?$QA +To: Senator Blayne^ From: Congressional Security^^Per your request for additional security, we have changed your teleportation coordinates to the auditorium. Your Speed-Tele has been reprogrammed to: +.^Have a Nice Day.< +Congressional Office Security^ + +@$Q +To: all WEC Secretaries, G Level^ From: Senator Snell^ To maintain a high security rating, and to protect all of *YOU* people from spies and saboteurs, we have added a few more security precautions. Vetrons have been added to the usual security forces. They are here only as an added protective measure. Be very careful, and wear your security badges at ALL times.^Moreover, anyone entering a secure area without proper ID will be terminated on the spot.^Have a nice day... + +A$Qj +Due to rebel infiltration, the combination to the safe has been changed to: + +B$? + +C$4? + +D$4? + +E$4Q +To: All Senators^ From: Congressional Security^ ^Due to recent rebel threats,^ the passcode has been changed^ to +.^*And ** Have a Nice Day.< +.^*End of Message < +Congressional Office Security^ + +F$QI +WEC Security System * EEOD Nerve Gas Storage Facility + +G$Q +Karl, I know it sounds silly, but I forgot the passcode to the EEOD Facility. Isn't it +?^ Darrin ^*End of Message < + +H$Q& +The Cheese Man Cometh... + +I$Q +Tony, I've found that standing too close to the EEOD for extended time periods does funny things to my hair. Have you had any problems lately? ^Phil + +K$Q +Phil, the only problem I've been having is that my hair is kinda hard and falls off at a certain length. It's sorta like a porcupine,whatever that is. ^Tony + +L$Q +Warning: It has recently been discovered that prolonged exposure to the EEOD may cause bad hair problems. Limit time spent in the area, please. WECHC^ + +M$? + +N$4? + +O$4Q +Bad command or file name...^Message is out of range. + +P$QE +Phase One of Three of Laser Beam deactivation initiated + +Q$Q@ +Alarm Deactivated. Security system will now reset. + +R$Q7 +All system alarms are currently inactive. + +S$QP +Retrieving remote location security access.^* * * ^Access cleared. + +T$QE +Security camera for level 4 firing range now activated. + +U$QW +Security camera for level 2 information and briefing center now activated + +V$Q3 +Level 1 Security Access now activated + +W$QE +Phase Two of Three of Laser Beam deactivation initiated + +X$QG +Phase Three of Three of Laser Beam deactivation initiated + +Y$Q7 +Storage Facility Security now deactivated + +Z$Qx +Senator Spector: I had Maintenance install a new security keypad in the secret entrance to the Detention Hall. The passcode is +Please keep this to yourself. +^Richard +^*End of Message < +The WEC T305i is currently off-line, and will not be back on-line until 0300 hours. WECTS^ + +[$Q +? +[ +Tony, I think that the WECTS changed all passcodes in this building. AGAIN. I think yours is now +. Jassica +WEC SECURITY SYSTEM:^Remote Camera: ACTIVE** Schmooze Room + +\$Q@ +? +[N +Hey, John. Since you're doing security again tonight, you'll need to know today's passcode. It's +. I don't think it'll change until sometime +tomorrow or the next day. Ted +WEC SECURITY SYSTEM:^^Remote Camera: ACTIVE*^*WEC Detention Hall + +]$QW +WEC SECURITY SYSTEM:^^Remote Camera: ACTIVE*^Office of Senator B. Pete + +^$Q +To all Departmental Supervisors: I am requiring individual meetings with each of you today. The passcode to my office is +.^*End of Message < +To all Departmental Supervisors: According to new WEC Policy #7461, We are now requiring that all teleporters be deactivated during the new 16 hour work schedule. We believe that this will increase productivity, as we will be able to prohibit extraneous teleporting between the hours of 6:00am and 10:00pm. D. + +_$Q +? +[ +*Security Shield *DEACTIVATED +To all Supervisors: Please keep in mind that no employees are to leave the building between the hours of 6:00am and 10:00pm Thank you. L.P. + +`$Q" +? +[G +*Security Shield *DEACTIVATED Please re-activate immediately +Maire -^We've got to quit playing that experimental music over the system. It's only causing more troubles in my sector. Do you know if there's anything that can be done? Laura B. + +a$Q +*Security Shield *DEACTIVATED +Laura - No, we can't stop that music. Draygan has made it a mandatory treatment to go along with those new glass barriers. I guess it's just some more of that mind control stuff he likes so much. Maire + +b$Q +OSI Writer, Ver 121.c^*The Tale of Rancid ^Rancid the swamprat was a big pain and especially fond of his wonderful drain. But rats of this sort should not boast quite like that, for just entering the sewer was a swampcat! With a growl and a hiss, the cat made his leap - and Rancid the swamprat ran back to his keep. A huffing and puffing, the swampcat did blow, but Rancid the swamprat knew where to go! + +c$Q +So up to the gutter, a few feet away, he ran and he ran, as the cat made his play, 'Forget this chasing, it's just not for me, a gun's more my style, and much easier you see,' And as he pulled the trigger, there was a huge flash, that smoked and caught fire, and singed that cats' ass! 'Ha Ha, Ha ha,' laughed swamprat, 'You are so fun! 'Cause not every cat can shoot a capgun!'*^hmmm...this is pretty bad. Maybe I won't send it to everyone... + +d$Q +? +[M +DECLAN! The passcode hasn't changed! It's STILL +. ^Now QUIT bugging me! +^ Alec +WEC SECURITY SYSTEM:^^Remote Camera: ACTIVE*^Cloning Studio #1A + +e$QQ +WEC SECURITY SYSTEM:^^Remote Camera: ACTIVE*^Incubation Room #1A + +f$Q% +Okay, Declan, it seems you keep relying on me to supply you with the passcode for Cloning Studio #1A. It is +. Please don't forget it again. + ^Alec +WEC SECURITY SYSTEM:^^Remote Camera: ACTIVE*^Hatching Chamber + +g$QP +WEC SECURITY SYSTEM:^Remote Camera: ACTIVE*^Incubation Room #2A + +h$Q +Dr. Rosillos,^I have good news about my latest endeavor. I now have several pods in the hatching chamber, and I believe they will soon reach their final term and be ready for testing within days.^^You should come see them. ^Gregor + +i$Q +Guardsman on duty: ^Keep watch over the hatching chambers and Dr. Hoffman. Nothing is to happen to any of the new prototype Enforcers, or to Dr. Hoffman. Monitor him frequently.^Cptn. Quince + +j$Q +Troopers: ^It is imperative that we maintain security in this area. My new experiment is in a delicate stage of development and simply cannot be disturbed. ^Thank you, ^Dr. Gregor Hoffman + +k$QI +Dr. Seiler - ^Greetings! I think our new weapon will prove to be fatal to those nasty rebels. I now have the equivalent to a small army nearing completion, and hope to unleash them very soon. I think they're my greatest creation yet. Isn't it fascinating what one can do with just a few tiny human cells? ^Gregor + +l$Q +Guardsman on Duty: ^We are currently under alert due to suspected rebel activity in the area. Under no circumstance is there to be rebel infiltration of this installation.^Cpt. Ayers + +m$QN +WEC SECURITY SYSTEM:^^Remote Camera: ACTIVE*^Hatching Chamber +Bad command or file name...^File is out of range. +referent +linkNum +msgNum +passcode +textFile +MALRM_EW +referent +MALRM_NS +referent +ITEM +referent +destx +desty +truncate +ITEM +? +QI +t$[* +referent +targetRef +targetItem +item +ITEM +? +9Q +? +;@ +referent +newStatus +ITEM +referent +newStatus +ITEM +? +;@ +referent +newStatus +zZ&\| +ITEM +ITEM +]0Q + +]0Q + +]0Q + +referent +destX +destY +destZ +currentP +counter +minor +oabs +ovel +axis +ztarg +zcur +zZ!\ +ITEM +ITEM +referent +destX +destY +destZ +counter +minor +oabs +ovel +axis +ztarg +zcur +ITEM +@6Q + +referent +damageRef +maxHits +damagePoints +currentHits +newHits +zZ \ +ITEM +referent +boomType +selfDestruct +item +origin +bigBomb +ITEM +wt$[ + + + + + +_$[ +$4Q +$4Q +referent +item +onSomething +failTest +theType +ITEM +ITEM +ma0Q +^ +( + +^ +( + +referent +item +onFloor +burn +ITEM +ITEM +^ + 6@ +$2Q) +ITEM +^ + 6@ +$2Q) +ITEM +^ + 6@ +$2Q) +ITEM +referent +burn +burn2 +ITEM +wt$[ +$2Q + +referent +ITEM +t$t=t@[ +$4Q{ +t$t=t:[ +(2Q + +ITEM +ITEM +$4Q. +referent +egg1 +monster1 +monster2 +link +newNpc +ITEM +ITEM +referent +ref1 +ref2 +item1 +item2 +FLAMELP +referent +FLAMELP +Y? +@ +FLAMELP +referent +BBOX +^0Q> +BBOX +Y +d? +BBOX +ma0Q0 +BBOX +BBOX +referent +GBOX_EW +^0Q> +GBOX_EW +Y +d? +GBOX_EW +ma0Q0 +GBOX_EW +GBOX_EW +referent +GBOX_NS +^0Q> +GBOX_NS +Y +d? +GBOX_NS +ma0Q0 +GBOX_NS +GBOX_NS +referent +referent +fram +DAMNLUGG +Y +d? +DAMNLUGG +ma0Q0 +DAMNLUGG +DAMNLUGG +referent +DAMNMCR8 +Y +d? +DAMNMCR8 +ma0Q0 +DAMNMCR8 +DAMNMCR8 +referent +COURIER +referent +D_ENFORC +^ + +.Q +referent +goods +D_ENFORC +wx[1 +referent +D_EM_GUY +referent +D_EM_GUY +D_EM_GUY +referent +D_GRENAD +^ + +.Q +referent +goods +D_GRENAD +wx[1 +referent +%TEXTFIL2 + +n$Qe +WARNING:^The laser field has been deactivated for thirty seconds. ^*End of Message < + +o$Q +? +[0 +ALERT:^Code to deactivate laser barrier in quadrant two:^ +^Priority Yellow alert issued. +^*End of Message < +Kimball Research Facility + +p$Q +? +[o +Code to deactivate Laser barrier in quadrant one: +*^WARNING, WARNING: +^Access to facility unimpeded. +Priority RED alert issued. +Kimball Research Facility + +q$Q +The code to the force fields has been changed. The new code is:^ +Kimball Research Facility +R2"? + +r$Q +The access code to the computer storage room has been changed to: +.^*End of Message < + +s$Qa +^** dleckl... code to security safe is: +.^**Message < +R@!? + +t$Q +From: Marcus Watten, ^Chief of Security To: Bleys Ochoa We've had to restructure the whole system. As of 0530 today, the new passcode to the security room is: +Rw ? + +t$? + +u$4Q +? +[R +Dr. Tyrell, I have finished for the night and have locked up the lab. I changed the code to + keep the other employees from pilfering. +.^^J.F.S +Kimball Research Facility^ + +v$QQ +Force field^blocking access^to telepad 5 ^has been deactivated. + +w$Q: +Access to^restricted area^has been granted. +Bad command or file name...^File is out of range. + +x$QJ +To: All Employees^From: OWP Security^The OWP Research Facility is under a maximum security threat from rebel forces.Take note, the newest security code is +.^This message will be deleted in 24 hours < +.^*End of Message < +The OWP Research Facility^ + +y$Q +OWP Operations:^____________________^Now interfacing with remote service droid...*^Unit ZC90201^^Now *-ONLINE-. + +z$Q +OWP Operations:^____________________^Now interfacing with remote service droid...*^Unit MXZ2391^^Now *-ONLINE-. + +{$? + +|$4Q( +The OWP Research Facility^ + +}$Q3 +Maximum Security Systems:^*Activated. + +~$? +$4QK +? +[u +To: All Employees^From: OWP Security^The OWP Research Facility is under a maximum security threat from rebel forces. Take note, the newest security code is +.^This message will be deleted in 24 hours ^< +.*End of Message < +The OWP Research Facility^ +Draygan Correctional Institution^ +Surveillance Central^ +Maximum Security Surveillance Tower^Open Access +Enforcer Barracks^Open Access +Draygan Correctional Institution^Maximum Security Cell: 1^*Secure +Lift: *^ACTIVATED^ +Force Wall De-activated^ +Draygan Correctional Institution^Maximum Security Cell: 1^*Security deactivated +Receiving WEC transmision^Establishing vid-link** +Draygan Correctional Institution^ +Door is now ajar.^ Have a nice day.^*End of Message < +Welcome to:^ The Asylum BBS^^ ///^ o o^ --m--U--m--^ |Your Sysop:|^ | E--- |^ ----------- ^ / &^ ~ ~^ +The power to the electric walls is now off. +Electric walls re-activated. +ATTENTION ALL GUARDS:^The passcode to the office area has been changed to: +.^*End of Message < +Professor T. Rooney:^I need to talk to you right away. Come to my office.^The code is: +^Signed:^Senator J.W. Gault III^ +^*End of Message < +NOTICE:^The impassable laser field has been activated. All guards needing to get through can use passcode: +.^*End of Message < +WARNING:^Computer Security Failure.^Alerting all guards and security systems.^^*End of Message < +The New Extra-Special Super Secret passcode is now : +.^*End of Message < +Welcome to Hell.^Here comes the Cheese! +From: Station Security:*^Due to a possible infiltrator, the passcode to the Enforcers' quarters has been changed to + to prevent +disloyal workers from gaining weapons! ^<EOM> +From: Station Security:*^Due to a possible saboteur, the passcode to the senators' conference room has been changed to + to prevent +possible assassins from gaining access! +Security Cartel ^Droid Manual Overide:*^Networking to *<XHT1138>*Overide of servomech confirmed...^*^*Happy Hunting... +Security Cartel Network Base:^^Alpha Alarm Overide...Alarms triggered in this area were a result of a substandard networking interface.^Area is secured. No threats or breaches reported.* +Though there is no need for panic, everyone must head for the nearest life pod by which to evacuate the space station.^Obey WEC protocol. Congressmen and Senators first! +Security Cartel: ^Auxiliary Command Terminal.^Force field control system.^Field will remain intact, unless auxiliary code is *NOT re-entered via Primary Command terminal. +Command Terminal:^Due to Security Level Alpha ^the engineering defenses are now active.^*For safety, keep a 10 meter distance from blast area. +^Auxiliary Command Terminal.^*Netlink connected to barracks 1029-B.^*Accessing connecting passage... +Rp ? +^Auxiliary Command Terminal.^*Netlink connected to Engineering Nine.^*Passcode: 512-555-2788...^*Accessing connecting passage... +^Auxiliary Command Terminal:^Due to high levels of radioactive output, excessive durations within the containment room are not advisable. +WEC SECURITY SYSTEM:^Alternate^Security^System^^Remote Vetron:*.*.*. ALL SYSTEMS ACTIVE +? +[7 +The passcode for the North Entrance Incubation Room #3A is now +, because too +many people were sharing passcodes. +Remember, keep it to yourself! +WEC SECURITY SYSTEM:^^Remote Camera: ACTIVE*^Incubation Room #3A +? +[z +Earl - The new passcode reader for the East Entrance to Incubation Room #3A isn't working well. I know it's +, but I can't get +it to open all the time. Could you fix it? +Norma +WEC SECURITY SYSTEM:^^Remote Camera: ACTIVE*^Incubation Room #4A +R= ? +WEC SECURITY SYSTEM:^^Remote Camera: ACTIVE*^BioWaste Reclamation Center +^Doyle, this new breed of Silencer does not have any of the 'morality' problems of the previous generation. Soon the WEC will be able to crush the pitiful resistance! *^*Oh, due to a possible rebel invasion the passcode is changed to +Audrey, Please come to my private chamber. I've got a new, larger specimen to show you. You will be most pleased! - Greggy +Accessing Security Com 2341 ^*Please Wait ^Security Shields Down ^*Chrysalis Chambers Now Open +From: M. Galway^To: R. Renteria^You're not cool enough to to have Sonex panels. Return them immediately! Or else! +From: DSNELL^______________^*You're Fired!^*^*^Turn in your badge and collect your things! +Security Cartel:^______________^Due to a possible infiltrator in the refinery, Alpha level will remain in effect.All high clearance areas will only be accessible via the network. ^<End of Message> +From: HSMITH^______________^I think some one at the head office has screwed up again.^ + is still this week's passcode. +^It would serve them right if the rebels got in here... +WEC Central Co*mma*@^#$%.*.*.*^^RESISTNET: *^Welcome, Rebel...^We have hidden some items for you in the safe.^Keep up the good work...^ The Designers +Refinery Operations:^____________________^Now interfacing with remote service droid...*^<Roaming Susan>^^Unit is now *-ONLINE-. +Security Operations:^____________________^Lithium Power Core*^Level Nine +SATELLITE TARGETING:^____________________<SATARG>*^^Weapons Operations^Level Seven +Security Cartel:^________________^*Production Line^*<ACTIVATED> +Security Cartel:^________________^*Production Line Force Barrier^*<DEACTIVATED> +NOTICE:^The impassable laser field has been activated. The laser fields must be reactivated after use.^*End of Message +WEC SECURITY SYSTEM:^^Remote Camera: ACTIVE* +Bad command or file name...^File is out of range. +Bad command or file name...^File is out of range. +referent +linkNum +msgNum +passcode +textFile +FIGHT_E1 +FIGHT_E1 +ma0Q3 +t$[/ +tD[1 +^0Qb +referent +item +FIGHT_E2 +FIGHT_E2 +ma0Q3 +t$[0 +tD[2 +^0Qb +referent +item +FIGHT_E3 +FIGHT_E3 +ma0Q3 +t$[/ +tD[1 +^0Qb +referent +item +FIGHT_N1 +FIGHT_N1 +ma0Q3 +t$[/ +tD[1 + + + + +^0Qb +referent +item +FIGHT_N2 +FIGHT_N2 +ma0Q3 +t$[/ +tD[1 + + + + +^0Qb +referent +item +FIGHT_N3 +FIGHT_N3 +ma0Q3 +t$[. +tD[0 + + + + +$4Q5 +FIGHT_N3 +FIGHT_N3 +referent +item +FALLINGC +wxt$ + +_$Q +$2Q3 +FALLINGC +referent +item +DEATHFL4 +referent +DEATHFL4 +referent +DEATHFL5 +referent +DEATHFL5 +referent +&FLICTEST +S\Q&FLICTEST +RA&? +&FLICTEST +%FLICTEST +%FLICTEST +S\m%FLICTEST +R]%? +S\4%FLICTEST +R$%? +$FLICTEST +$FLICTEST + + $Q1 +$FLICTEST +Ry$? + + +$Q1 +S\P$FLICTEST +R@$? +$FLICTEST +#FLICTEST + + $Q1 +#FLICTEST +S\l#FLICTEST +R\#? +S\3#FLICTEST +R##? +"FLICTEST +"FLICTEST +"FLICTEST +Rx"? +S\O"FLICTEST +R?"? +"FLICTEST +!FLICTEST +!FLICTEST +S\k!FLICTEST +R[!? +S\2!FLICTEST +R"!? + FLICTEST + FLICTEST + FLICTEST +Rw ? +S\N FLICTEST +R> ? + FLICTEST +FLICTEST +FLICTEST + + $Q1 +FLICTEST + +!$Q1 +FLICTEST + +"$Q1 +FLICTEST + +#$Q1 +FLICTEST + +$$Q1 +FLICTEST + +%$Q1 +FLICTEST + +&$Q1 +FLICTEST + +'$Q1 +FLICTEST + +($Q1 +FLICTEST + +)$Q1 +FLICTEST + +*$Q1 +FLICTEST + ++$Q1 +FLICTEST + +,$Q1 +FLICTEST + +-$Q1 +FLICTEST + +.$Q1 +FLICTEST + +/$Q1 +FLICTEST + +0$Q1 +FLICTEST + +1$Q1 +FLICTEST + +2$Q1 +FLICTEST + +3$Q1 +FLICTEST + +4$Q1 +FLICTEST + +5$Q1 +FLICTEST + +6$Q1 +FLICTEST + +7$Q1 +FLICTEST + +8$Q1 +FLICTEST + +9$Q1 +FLICTEST + +:$Q1 +FLICTEST + +;$Q1 +FLICTEST + +<$Q1 +FLICTEST + +=$Q1 +FLICTEST + +>$Q1 +FLICTEST + +?$Q1 +FLICTEST + +@$Q1 +FLICTEST + +A$Q1 +FLICTEST + +B$Q1 +FLICTEST + +C$Q1 +FLICTEST + +D$Q1 +FLICTEST + +E$Q1 +FLICTEST + +F$Q1 +FLICTEST + +G$Q1 +FLICTEST + +H$Q1 +FLICTEST + +I$Q1 +FLICTEST + +J$Q1 +FLICTEST + +K$Q1 +FLICTEST + +L$Q1 +FLICTEST + +M$Q1 +FLICTEST + +N$Q1 +FLICTEST + +O$Q1 +FLICTEST + +P$Q1 +FLICTEST + +Q$Q1 +FLICTEST + +R$Q1 +FLICTEST + +S$Q1 +FLICTEST + +T$Q1 +FLICTEST + +U$Q1 +FLICTEST + +V$Q1 +FLICTEST + +W$Q1 +FLICTEST + +X$Q1 +FLICTEST + +Y$Q1 +FLICTEST + +Z$Q1 +FLICTEST + +[$Q1 +FLICTEST + +\$Q1 +FLICTEST + +]$Q1 +FLICTEST + +^$Q1 +FLICTEST + +_$Q1 +FLICTEST + +`$Q1 +FLICTEST + +a$Q1 +FLICTEST + +b$Q1 +FLICTEST + +c$Q1 +FLICTEST + +d$Q1 +FLICTEST + +e$Q1 +FLICTEST + +f$Q1 +FLICTEST + +g$Q1 +FLICTEST + +h$Q1 +FLICTEST + +i$Q1 +FLICTEST + +j$Q1 +FLICTEST + +k$Q1 +FLICTEST + +l$Q1 +FLICTEST + +m$Q1 +FLICTEST + +n$Q1 +FLICTEST + +o$Q1 + FLICTEST + +p$Q1 + FLICTEST + +q$Q1 +S\a FLICTEST +RQ ? + +r$Q1 +S\( FLICTEST + +s$Q1 +FLICTEST + +t$Q1 +FLICTEST + +u$Q1 +FLICTEST + +v$Q1 +FLICTEST + +w$Q1 +FLICTEST + +x$Q1 +FLICTEST + +y$Q1 +FLICTEST + +z$Q1 +FLICTEST + +{$Q1 +FLICTEST + +|$Q1 + +FLICTEST + +}$Q1 + +FLICTEST + +~$Q1 +S\| +FLICTEST +Rl +? +S\C +FLICTEST +R3 +? +S\ +FLICTEST + FLICTEST + FLICTEST +S\[ FLICTEST +RK ? +S\! FLICTEST +FLICTEST +FLICTEST +FLICTEST +hideoutx +FLICTEST +FLICTEST +FLICTEST +mva01 +FLICTEST +mva03a +FLICTEST +mva03b +FLICTEST +mva04 +FLICTEST +mva05a +FLICTEST +mva05b +FLICTEST +mva06 +FLICTEST +mva07 +FLICTEST +mva08 +FLICTEST +mva09 +FLICTEST +mva10 +FLICTEST +mva11a +FLICTEST +mva11b +FLICTEST +mva12a +FLICTEST +mva12b +FLICTEST +mva13 +FLICTEST +mva14 +FLICTEST +mva15a +FLICTEST +mva15b +FLICTEST +mva15c +FLICTEST +FLICTEST +FLICTEST +FLICTEST +FLICTEST +t02-03es +FLICTEST +FLICTEST +test +FLICTEST +FLICTEST +FLICTEST +FLICTEST +FLICTEST +FLICTEST +FLICTEST +referent +keycode +&FLICTEST +w? + + +S\Q&FLICTEST +RA&? + + +&FLICTEST +&? + + +%FLICTEST +%? + + +%FLICTEST +%? + + +S\m%FLICTEST +R]%? + + +S\4%FLICTEST +R$%? + + +$FLICTEST +$? + + +$FLICTEST +$? + + $Q1 +$FLICTEST +Ry$? + + +$Q1 +S\P$FLICTEST +R@$? + + +$FLICTEST +$? + + +#FLICTEST +#? + + $Q1 +#FLICTEST +#? + + +S\l#FLICTEST +R\#? + + +S\3#FLICTEST +R##? + + +"FLICTEST +"? + + +"FLICTEST +"? + + +"FLICTEST +Rx"? + + +S\O"FLICTEST +R?"? + + +"FLICTEST +"? + + +!FLICTEST +!? + + +!FLICTEST +!? + + +S\k!FLICTEST +R[!? + + +S\2!FLICTEST +R"!? + + + FLICTEST + ? + + + FLICTEST + ? + + + FLICTEST +Rw ? + + +S\N FLICTEST +R> ? + + + FLICTEST + ? + + +FLICTEST +FLICTEST +? + + $Q1 +FLICTEST +? + +!$Q1 +FLICTEST +? + +"$Q1 +FLICTEST +? + +#$Q1 +FLICTEST +? + +$$Q1 +FLICTEST +? + +%$Q1 +FLICTEST +? + +&$Q1 +FLICTEST +? + +'$Q1 +FLICTEST +? + +($Q1 +FLICTEST +? + +)$Q1 +FLICTEST +? + +*$Q1 +FLICTEST +? + ++$Q1 +FLICTEST +? + +,$Q1 +FLICTEST +? + +-$Q1 +FLICTEST +? + +.$Q1 +FLICTEST +? + +/$Q1 +FLICTEST +? + +0$Q1 +FLICTEST +? + +;$Q1 +FLICTEST +? + +2$Q1 +FLICTEST +? + +3$Q1 +FLICTEST +? + +4$Q1 +FLICTEST +? + +5$Q1 +FLICTEST +? + +6$Q1 +FLICTEST +? + +7$Q1 +FLICTEST +? + +8$Q1 +FLICTEST +? + +9$Q1 +FLICTEST +? + +:$Q1 +FLICTEST +? + +;$Q1 +FLICTEST +? + +<$Q1 +FLICTEST +? + +=$Q1 +FLICTEST +? + +>$Q1 +FLICTEST +? + +?$Q1 +FLICTEST +? + +@$Q1 +FLICTEST +? + +A$Q1 +FLICTEST +? + +B$Q1 +FLICTEST +? + +C$Q1 +FLICTEST +? + +D$Q1 +FLICTEST +? + +E$Q1 +FLICTEST +? + +F$Q1 +FLICTEST +? + +G$Q1 +FLICTEST +? + +H$Q1 +FLICTEST +? + +I$Q1 +FLICTEST +? + +J$Q1 +FLICTEST +? + +K$Q1 +FLICTEST +? + +L$Q1 +FLICTEST +? + +M$Q1 +FLICTEST +? + +N$Q1 +FLICTEST +? + +O$Q1 +FLICTEST +? + +P$Q1 +FLICTEST +? + +Q$Q1 +FLICTEST +? + +R$Q1 +FLICTEST +? + +S$Q1 +FLICTEST +? + +T$Q1 +FLICTEST +? + +U$Q1 +FLICTEST +? + +V$Q1 +FLICTEST +? + +W$Q1 +FLICTEST +? + +X$Q1 +FLICTEST +? + +Y$Q1 +FLICTEST +? + +Z$Q1 +FLICTEST +? + +[$Q1 +FLICTEST +? + +\$Q1 +FLICTEST +? + +]$Q1 +FLICTEST +? + +^$Q1 +FLICTEST +? + +_$Q1 +FLICTEST +? + +`$Q1 +FLICTEST +? + +a$Q1 +FLICTEST +? + +b$Q1 +FLICTEST +? + +c$Q1 +FLICTEST +? + +d$Q1 +FLICTEST +? + +e$Q1 +FLICTEST +? + +f$Q1 +FLICTEST +? + +g$Q1 +FLICTEST +? + +h$Q1 +FLICTEST +? + +i$Q1 +FLICTEST +? + +j$Q1 +FLICTEST +? + +k$Q1 +FLICTEST +? + +l$Q1 +FLICTEST +? + +m$Q1 +FLICTEST +? + +n$Q1 +FLICTEST + ? + +o$Q1 + FLICTEST + ? + +p$Q1 + FLICTEST + ? + +q$Q1 +S\a FLICTEST +RQ ? + +r$Q1 +S\( FLICTEST + ? + +s$Q1 +FLICTEST +? + +t$Q1 +FLICTEST +? + +u$Q1 +FLICTEST +? + +v$Q1 +FLICTEST +? + +w$Q1 +FLICTEST +? + +x$Q1 +FLICTEST +? + +y$Q1 +FLICTEST +? + +z$Q1 +FLICTEST +? + +{$Q1 +FLICTEST +? + +|$Q1 + +FLICTEST + +? + +}$Q1 + +FLICTEST + +? + +~$Q1 +S\| +FLICTEST +Rl +? + + +S\C +FLICTEST +R3 +? + +S\ +FLICTEST + FLICTEST + FLICTEST +S\[ FLICTEST +RK ? + +S\! FLICTEST +FLICTEST +FLICTEST +FLICTEST +hideoutx +FLICTEST +FLICTEST +FLICTEST +mva01 +FLICTEST +mva03a +FLICTEST +mva03b +FLICTEST +mva04 +FLICTEST +mva05a +FLICTEST +mva05b +FLICTEST +mva06 +FLICTEST +mva07 +FLICTEST +mva08 +FLICTEST +mva09 +FLICTEST +mva10 +FLICTEST +mva11a +FLICTEST +mva11b +FLICTEST +mva12a +FLICTEST +mva12b +FLICTEST +mva13 +FLICTEST +mva14 +FLICTEST +mva15a +FLICTEST +mva15b +FLICTEST +mva15c +FLICTEST +FLICTEST +FLICTEST +FLICTEST +FLICTEST +t02-03es +FLICTEST +FLICTEST +test +FLICTEST +FLICTEST +FLICTEST +FLICTEST +FLICTEST +FLICTEST +FLICTEST +referent +SURCAMEW +referent +SURCAMEW +wx[% +SURCAMEW +SURCAMEW +referent +SURCAMEW +t$t=t@[O +$4QW +SURCAMEW +SURCAMEW +SURCAMEW +SURCAMEW +t$t=t@[h +t% +d + +SURCAMEW +SURCAMEW +referent +textFile +monit +valueBox +passcode +link +code +SURCAMEW +SURCAMEW +t$t=t@[ +SURCAMEW +SURCAMEW +t$t=t@[ +t% +( + +^$Q +SURCAMEW +]0Q) +SURCAMEW +SURCAMEW +SURCAMEW +SURCAMEW +SURCAMEW +SURCAMEW +SURCAMEW +SURCAMEW +SURCAMEW +]0Q) +SURCAMEW +SURCAMEW +SURCAMEW +referent +screen +cameraEgg +trueRef +therma +SURCAMEW +wt$[1 +tB[2 + +2 + +SURCAMEW +SURCAMEW +SURCAMEW +referent +eventTrigger +foundGun +WEA_BOOT +WEA_BOOT +WEA_BOOT +WEA_BOOT +referent +counter +WEA_BOOT +wx[Y +referent +WEA_BOOT +wx[` +WEA_BOOT +WEA_BOOT +WEA_BOOT +^0QO +WEA_BOOT +^ +2,Q +WEA_BOOT +WEA_BOOT +referent +counter +WEA_BOOT +referent +MISS15 +referent +item +MISS15 +MISS15 +MISS15 +MISS15 +MISS15 +t$t=t@[5 + +3t% + +MISS15 +MISS15 +MISS15 +MISS15 +MISS15 +MISS15 +MISS15 +MISS15 +MISS15 +MISS15 +MISS15 +MISS15 +t$t=t@[Y +referent +item +counter +door +TELEPAD +wx[) +referent +zZ +\r +TELEPAD +wx[3 +TELEPAD +t$t=t:[I +$2Q/ +(2Q" + +E +E@ + + $Q + +!$Q + +#$Q + +d$Q + +e$Q +referent +item +pad2 +theQual +TELEPAD +TELEPAD +? + +E6QA +^? +6Q +TELEPAD +? + +($Q +TELEPAD +TELEPAD +TELEPAD +TELEPAD +^ + $QO +TELEPAD +TELEPAD +TELEPAD +? + +)$Q +TELEPAD +TELEPAD +TELEPAD +? +Q" +TELEPAD +TELEPAD +TELEPAD +TELEPAD + +E$Q +t$t=t@[2 +t$t=t@[8 +t% + + + +TELEPAD + +(*Q[ +TELEPAD + + +$Q +referent +mapNum +eggNum +newx +newy +newz +counter +floor +item +telebeam +TELEPAD +wxt$t=t:[_ +referent +onPad +BLACK16 +$4[ +$4[! +referent +item +BLACK8 +$4[ +referent +item diff --git a/USECODE/EUSECODE_extracted/boot_family_compare.tsv b/USECODE/EUSECODE_extracted/boot_family_compare.tsv new file mode 100644 index 0000000..d62e0b7 --- /dev/null +++ b/USECODE/EUSECODE_extracted/boot_family_compare.tsv @@ -0,0 +1,16 @@ +entry_index label role data_offset declared_size header_u16 header_u32 printable_markers field_tags +171 AND_BOOT event-bearing 0x1082E 0x599 0x0000,0x0000,0x04C5,0x0000,0x00D4,0x0000,0x0599,0x0000,0x06A3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 0x00000000,0x000004C5,0x000000D4,0x00000599,0x000006A3,0x00000000,0x00000000,0x00000000 wx[|$Q0|t$t=t@[U|^$Q|t$t=t@[` 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter +172 BRO_BOOT event-bearing 0x18237 0x630 0x0000,0x0000,0x055C,0x0000,0x00D4,0x0000,0x0630,0x0000,0x073A,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 0x00000000,0x0000055C,0x000000D4,0x00000630,0x0000073A,0x00000000,0x00000000,0x00000000 wx[|^ + +$Q|$Q0| + $Q0| + +$Q1|t$t=t@[a|^$Q|t$t=t@[m 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter +189 COR_BOOT event-bearing 0x1D610 0x56A 0x0000,0x0000,0x0496,0x0000,0x00D4,0x0000,0x056A,0x0000,0x0674,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 0x00000000,0x00000496,0x000000D4,0x0000056A,0x00000674,0x00000000,0x00000000,0x00000000 wx[|^ + +$Q|$Q0|$Q1|t$t=t@[P|^$Q|t$t=t@[\ 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter +252 VAR_BOOT event-bearing 0x6A34C 0x5ED 0x0000,0x0000,0x0519,0x0000,0x00D4,0x0000,0x05ED,0x0000,0x06F7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 0x00000000,0x00000519,0x000000D4,0x000005ED,0x000006F7,0x00000000,0x00000000,0x00000000 wx[|$Q0| + $Q0|t$t=t@[Z|^$Q|t$t=t@[f 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter +283 REE_BOOT event-bearing 0x52B90 0x6B6 0x0000,0x0000,0x05E2,0x0000,0x00D4,0x0000,0x06B6,0x0000,0x07C0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 0x00000000,0x000005E2,0x000000D4,0x000006B6,0x000007C0,0x00000000,0x00000000,0x00000000 wx[|$Q0| + $Q0|$Q1| + $Q1|t$t=t@[j|^$Q|t$t=t@[v 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter diff --git a/USECODE/EUSECODE_extracted/boot_frontier_graph.md b/USECODE/EUSECODE_extracted/boot_frontier_graph.md new file mode 100644 index 0000000..74fa3b6 --- /dev/null +++ b/USECODE/EUSECODE_extracted/boot_frontier_graph.md @@ -0,0 +1,49 @@ +# AND/BRO Boot Frontier Graph + +## Nodes + +| Index | Label | Role | Fields | Event Evidence | +|---:|---|---|---|---| +| 165 | CHEMSUIT | referent-neighbor | referent | - | +| 166 | OFFWORK | referent-neighbor | referent | - | +| 167 | GUARD | referent-neighbor | referent | - | +| 168 | GDOOR_N | referent-neighbor | referent | - | +| 169 | GDOOR_E | referent-neighbor | referent | - | +| 170 | BIGCAN | referent-neighbor | referent,fram | - | +| 171 | AND_BOOT | event-bearing | referent,event,counter,item | field:event,tag:69:0A00->event | +| 172 | BRO_BOOT | event-bearing | referent,event,counter,item | field:event,tag:69:0A00->event | +| 173 | CRUMORPH | referent-neighbor | referent,lastAct | - | +| 174 | GUARDSQ | referent-neighbor | referent | - | +| 175 | CARD_NS | referent-neighbor | referent | - | +| 176 | CARD_EW | referent-neighbor | referent | - | +| 177 | EWALLEW | referent-neighbor | referent | - | +| 178 | EWALLNS | referent-neighbor | referent | - | + +## Edges + +| Source | Relation | Target | Evidence | +|---|---|---|---| +| AND_BOOT (171) | table-neighbor(-6) | CHEMSUIT (165) | same local extraction neighborhood | +| AND_BOOT (171) | table-neighbor(-5) | OFFWORK (166) | same local extraction neighborhood | +| AND_BOOT (171) | table-neighbor(-4) | GUARD (167) | same local extraction neighborhood | +| AND_BOOT (171) | table-neighbor(-3) | GDOOR_N (168) | same local extraction neighborhood | +| AND_BOOT (171) | table-neighbor(-2) | GDOOR_E (169) | same local extraction neighborhood | +| AND_BOOT (171) | table-neighbor(-1) | BIGCAN (170) | same local extraction neighborhood | +| AND_BOOT (171) | possible-event-attachment(+1) | BRO_BOOT (172) | field:event,tag:69:0A00->event | +| AND_BOOT (171) | table-neighbor(+2) | CRUMORPH (173) | same local extraction neighborhood | +| AND_BOOT (171) | table-neighbor(+3) | GUARDSQ (174) | same local extraction neighborhood | +| AND_BOOT (171) | table-neighbor(+4) | CARD_NS (175) | same local extraction neighborhood | +| AND_BOOT (171) | table-neighbor(+5) | CARD_EW (176) | same local extraction neighborhood | +| AND_BOOT (171) | table-neighbor(+6) | EWALLEW (177) | same local extraction neighborhood | +| BRO_BOOT (172) | table-neighbor(-6) | OFFWORK (166) | same local extraction neighborhood | +| BRO_BOOT (172) | table-neighbor(-5) | GUARD (167) | same local extraction neighborhood | +| BRO_BOOT (172) | table-neighbor(-4) | GDOOR_N (168) | same local extraction neighborhood | +| BRO_BOOT (172) | table-neighbor(-3) | GDOOR_E (169) | same local extraction neighborhood | +| BRO_BOOT (172) | table-neighbor(-2) | BIGCAN (170) | same local extraction neighborhood | +| BRO_BOOT (172) | possible-event-attachment(-1) | AND_BOOT (171) | field:event,tag:69:0A00->event | +| BRO_BOOT (172) | table-neighbor(+1) | CRUMORPH (173) | same local extraction neighborhood | +| BRO_BOOT (172) | table-neighbor(+2) | GUARDSQ (174) | same local extraction neighborhood | +| BRO_BOOT (172) | table-neighbor(+3) | CARD_NS (175) | same local extraction neighborhood | +| BRO_BOOT (172) | table-neighbor(+4) | CARD_EW (176) | same local extraction neighborhood | +| BRO_BOOT (172) | table-neighbor(+5) | EWALLEW (177) | same local extraction neighborhood | +| BRO_BOOT (172) | table-neighbor(+6) | EWALLNS (178) | same local extraction neighborhood | diff --git a/USECODE/EUSECODE_extracted/callback_trigger_compare.tsv b/USECODE/EUSECODE_extracted/callback_trigger_compare.tsv new file mode 100644 index 0000000..aa86fa1 --- /dev/null +++ b/USECODE/EUSECODE_extracted/callback_trigger_compare.tsv @@ -0,0 +1,7 @@ +entry_index label role data_offset declared_size header_u16 header_u32 printable_markers field_tags +269 SURCAMNS event-bearing 0x5F872 0xD6E 0x0003,0x0000,0x0C88,0x0000,0x00E6,0x0000,0x0D6E,0x0000,0x0F28,0x0000,0x0000,0x0000,0x0000,0x0051,0x00D2,0x0000 0x00000003,0x00000C88,0x000000E6,0x00000D6E,0x00000F28,0x00000000,0x00510000,0x000000D2 wx[|? + +|$Q?|wx[%|t$t=t@[=|t$t=t@[V|t$t=t@[|^$Qi 24:0A02->eventTrigger,24:F102->therma,24:FA02->valueBox,24:FC02->cameraEgg,24:FC02->monit,24:FE02->screen,61:7373->code,62:F500->code,62:FD00->foundGun,69:0000->referent,69:F600->link,69:F800->passcode,69:FA00->trueRef,73:FE00->textFile +284 SURCAMEW event-bearing 0x8575F 0xD60 0x0003,0x0000,0x0C7A,0x0000,0x00E6,0x0000,0x0D60,0x0000,0x0F1A,0x0000,0x0000,0x0000,0x0000,0x00F7,0x00D2,0x0000 0x00000003,0x00000C7A,0x000000E6,0x00000D60,0x00000F1A,0x00000000,0x00F70000,0x000000D2 wx[|? + +|$Q?|wx[%|$Q^|t$t=t@[O|t$t=t@[h|t$t=t@[ 24:0A02->eventTrigger,24:F602->therma,24:FA02->valueBox,24:FC02->cameraEgg,24:FC02->monit,24:FE02->screen,61:7373->code,62:F500->code,62:FD00->foundGun,69:0000->referent,69:F600->link,69:F800->passcode,69:FA00->trueRef,73:FE00->textFile diff --git a/USECODE/EUSECODE_extracted/descriptor_index.tsv b/USECODE/EUSECODE_extracted/descriptor_index.tsv new file mode 100644 index 0000000..bf60693 --- /dev/null +++ b/USECODE/EUSECODE_extracted/descriptor_index.tsv @@ -0,0 +1,409 @@ +entry_index primary_label field_names field_tags data_offset declared_size +0 ALARMBOX uniB 4F:4400->uniB,54:4500->uniB,58:3100->uniB 0x6090 0x9C00 +1 BLACK8 referent,item 24:FE02->item,69:0000->referent 0x87C38 0x20D +2 RDOOR_N referent 69:0000->referent 0x4F5F9 0x133 +3 BLACK16 referent,item 24:FE02->item,69:0000->referent 0x87A2B 0x20D +4 ALARM_EW referent 69:0000->referent 0x102D3 0x126 +5 SMALLTAB referent,item 24:FE02->item,69:0000->referent 0x5B1F5 0x1BA +6 VALVE referent,counter,item 24:FC02->item,69:0000->referent,69:FE00->counter 0x69929 0x2EE +7 MDOOR_E referent,item,item2,door 24:FA02->door,24:FC02->item,24:FC02->item2,24:FE02->item,69:0000->referent 0x4124D 0x2A9 +8 ALARM_NS referent 69:0000->referent 0x103F9 0x126 +9 RFANEW referent,item,fart,fart2,fram,counter,counter2,wind 24:F602->wind,24:F802->item,24:FE02->item,69:0000->referent,69:FA00->counter,69:FA00->counter2,69:FA00->fart,69:FA00->fart2,69:FC00->counter,69:FC00->fart,69:FE00->fram 0x53A49 0x432 +10 FALLINGC referent,item 24:FE02->item,69:0000->referent 0x804A8 0x1B9 +11 SWITCHEW referent 69:0000->referent 0x60A37 0x181 +12 CONVEY_N referent,xdir,ydir,item 24:FC02->item,62:FE00->ydir,62:FF00->xdir,69:0000->referent 0x1C702 0x2E4 +13 YR2X6EW referent 69:0000->referent 0x73C9C 0x137 +14 RDOOR_E referent 69:0000->referent 0x4F4C6 0x133 +15 BOX_EW referent,counter 69:0000->referent,69:FE00->counter 0x16758 0x2CA +16 BOX_NS referent,counter 69:0000->referent,69:FE00->counter 0x16A22 0x2CA +17 YR16X6EW referent 69:0000->referent 0x738F7 0x137 +18 YR16X6NS referent 69:0000->referent 0x73A2E 0x137 +19 YR8X6NS referent 69:0000->referent 0x742AF 0x137 +20 YR4X6NS referent 69:0000->referent 0x74041 0x137 +21 YR2X6NS referent 69:0000->referent 0x73DD3 0x137 +22 LUGGAGE ma0Q0,referent,item 24:FE02->item,45:0000->ma0Q0,69:0000->referent 0x3EF6E 0x284 +23 YR8X6EW referent 69:0000->referent 0x74178 0x137 +24 YR4X6EW referent 69:0000->referent 0x73F0A 0x137 +25 YR1X1 referent 69:0000->referent 0x73B65 0x137 +26 PEPSIEW referent,item 24:FE02->item,69:0000->referent 0x4D4D7 0x301 +27 GDOOR_E2 referent 69:0000->referent 0x37941 0x133 +28 CATWALK1 referent 69:0000->referent 0x1A8A7 0x16E +29 GDOOR_N2 referent 69:0000->referent 0x37BA7 0x130 +30 PEPSINS referent,item 24:FE02->item,69:0000->referent 0x4D7D8 0x301 +31 PANELNS referent 69:0000->referent 0x4D37A 0x15D +32 PANELEW referent 69:0000->referent 0x4D21D 0x15D +33 MDOOR_N referent,item,item2,door 24:FA02->door,24:FC02->item,24:FC02->item2,24:FE02->item,69:0000->referent 0x414F6 0x2A9 +34 BARRELUP referent 69:0000->referent 0x1202A 0x133 +35 SIGNEW referent 69:0000->referent 0x5A74F 0x134 +36 SIGNNS referent 69:0000->referent 0x5A883 0x134 +37 RFANNS referent,item,fart,fart2,fram,counter,counter2,wind 24:F602->wind,24:F802->item,24:FE02->item,69:0000->referent,69:FA00->counter,69:FA00->counter2,69:FA00->fart,69:FA00->fart2,69:FC00->counter,69:FC00->fart,69:FE00->fram 0x53E7B 0x432 +38 RDOOR1_E referent 69:0000->referent 0x77186 0x16A +39 RDOOR2_E referent 69:0000->referent 0x772F0 0x16A +40 RDOOR3_E referent 69:0000->referent 0x7745A 0x16A +41 RDOOR4_E referent 69:0000->referent 0x775C4 0x16A +42 RDOOR5_E referent 69:0000->referent 0x7772E 0x16A +43 BROKENCW referent,item 24:FE02->item,69:0000->referent 0x18081 0x1B6 +44 STELEPAD referent,item,tele 24:FE02->item,24:FE02->tele,69:0000->referent 0x5F483 0x2D4 +45 MONITNS referent,textFile,valueBox,passcode,link,boxCounter 24:FC02->valueBox,69:0000->referent,69:F600->boxCounter,69:F800->link,69:FA00->passcode,6D:6520->link,73:FE00->textFile 0x49567 0x370 +46 GATGUNNS referent 69:0000->referent 0x3753C 0x2D2 +47 GTELEPAD referent,item,tele 24:FE02->item,24:FE02->tele,69:0000->referent 0x39586 0x2D4 +48 GATGUNEW referent 69:0000->referent 0x3726A 0x2D2 +49 FASTSKIL referent,skill 69:0000->referent,69:FE00->skill 0x32255 0x2B7 +50 ELEVPLAT referent,cargo 24:FE02->cargo,69:0000->referent 0x2DD4A 0x448 +51 CATWALK2 referent,item 24:FE02->item,69:0000->referent 0x1AA15 0x225 +52 LIFT referent,item,counter,total,cargo,cargoType 24:F302->cargo,24:FE02->item,69:0000->referent,69:F100->cargo,69:F100->cargoType,69:FC00->total,69:FE00->counter 0x3E19C 0x7CA +53 CONVEY_E referent,xdir,ydir,item 24:FC02->item,62:FE00->ydir,62:FF00->xdir,69:0000->referent 0x1C41E 0x2E4 +54 FFFLOOR referent,fffloor,item 24:FC02->fffloor,24:FE02->item,69:0000->referent 0x3250C 0x56B +55 RECHAGNS ma0Q,referent,item 24:FE02->item,4E:5300->ma0Q,69:0000->referent 0x5219F 0x2D3 +56 RECHFLNS referent,item 24:FE02->item,69:0000->referent 0x52801 0x38F +57 FIGHT_N2 ma0Q3,referent,item 24:FE02->item,4E:3200->ma0Q3,69:0000->referent 0x7FFA4 0x26C +58 DEATHFL3 referent 69:0000->referent 0x20C97 0x159 +59 BARRELS referent 69:0000->referent 0x11DC4 0x133 +60 BARRELNS referent 69:0000->referent 0x11B5E 0x133 +61 BARRELEW referent 69:0000->referent 0x11A2B 0x133 +62 BARRELNW referent 69:0000->referent 0x11C91 0x133 +63 BARRELSE referent 69:0000->referent 0x11EF7 0x133 +64 RECHAGEW ma0Q,referent,item 24:FE02->item,45:5700->ma0Q,69:0000->referent 0x51ECC 0x2D3 +65 RECHFLEW referent,item 24:FE02->item,69:0000->referent 0x52472 0x38F +66 G_POOL referent,item 24:FE02->item,69:0000->referent 0x39A90 0x1F1 +67 Y_POOL referent,item 24:FE02->item,69:0000->referent 0x743E6 0x1EE +68 MONITEW referent,textFile,valueBox,passcode,link,boxCounter 24:FC02->valueBox,69:0000->referent,69:F600->boxCounter,69:F800->link,69:FA00->passcode,6D:6520->link,73:FE00->textFile 0x491F7 0x370 +69 THERM referent 69:0000->referent 0x63A7B 0x11F +70 MALRM_NS referent 69:0000->referent 0x79F25 0x126 +71 FIGHT_NS ma0Q3,referent,item 24:FE02->item,4E:5300->ma0Q3,69:0000->referent 0x3322B 0x298 +72 FIGHT_N3 ma0Q3,referent,item 24:FE02->item,4E:3300->ma0Q3,69:0000->referent 0x80210 0x298 +73 FIGHT_N1 ma0Q3,referent,item 24:FE02->item,4E:3100->ma0Q3,69:0000->referent 0x7FD38 0x26C +74 RTELEPAD referent,item,tele 24:FE02->item,24:FE02->tele,69:0000->referent 0x576A3 0x2D4 +75 MTELEPAD referent,item,tele 24:FE02->item,24:FE02->tele,69:0000->referent 0x4A635 0x2D4 +76 FIGHT_E3 ma0Q3,referent,item 24:FE02->item,45:3300->ma0Q3,69:0000->referent 0x7FACC 0x26C +77 FIGHT_E1 ma0Q3,referent,item 24:FE02->item,45:3100->ma0Q3,69:0000->referent 0x7F5F4 0x26C +78 FIGHT_E2 ma0Q3,referent,item 24:FE02->item,45:3200->ma0Q3,69:0000->referent 0x7F860 0x26C +79 PPLATE referent,item 24:FE02->item,69:0000->referent 0x4E30F 0x264 +80 PPLATE2 referent,item 24:FC02->item,69:0000->referent 0x4E573 0x3E5 +81 FIGHT_EW ma0Q3,referent,item 24:FE02->item,45:5700->ma0Q3,69:0000->referent 0x32FBF 0x26C +82 LAZERNS referent,fram,item 24:FC02->item,69:0000->referent,69:FE00->fram 0x3DD17 0x485 +83 LAZEREW referent,fram,item 24:FC02->item,69:0000->referent,69:FE00->fram 0x3D88F 0x488 +84 RADAR referent 69:0000->referent 0x4F3BA 0x10C +85 RSTATION referent 69:0000->referent 0x57584 0x11F +86 JOHN referent,fram 69:0000->referent,69:FE00->fram 0x3C0AA 0x17E +87 ENFORCER referent 69:0000->referent 0x2EC61 0x11B +88 CAMERACO referent,delay,iSeeYou,trackedEnough,fram,counter,sawCrusader,movement,target,range 24:F002->target,69:0000->referent,69:EE00->range,69:F200->movement,69:F400->sawCrusader,69:F600->counter,69:F800->fram,69:FA00->trackedEnough,69:FC00->iSeeYou,69:FE00->delay 0x18E22 0x647 +89 MOTION referent,trackedEnough,fram,movement,foundTarget,delay,iSeeYou 62:F900->foundTarget,69:0000->referent,69:F500->iSeeYou,69:F700->delay,69:FA00->movement,69:FC00->fram,69:FE00->trackedEnough 0x49E7A 0x434 +90 CAMERANS referent,delay,iSeeYou,trackedEnough,fram,counter,sawCrusader,movement,target,range 24:F002->target,69:0000->referent,69:EE00->range,69:F200->movement,69:F400->sawCrusader,69:F600->counter,69:F800->fram,69:FA00->trackedEnough,69:FC00->iSeeYou,69:FE00->delay 0x19AAA 0x641 +91 CAM_EW referent 69:0000->referent 0x1A0EB 0x2D2 +92 CAM_NS referent 69:0000->referent 0x1A3BD 0x2D2 +93 FUSREACT referent 69:0000->referent 0x3715E 0x10C +94 TRANSFOR referent,fram,damagePoints,item 24:FA02->item,69:0000->referent,69:FC00->damagePoints,69:FE00->fram 0x6492B 0x300 +95 SHOCKEW referent 69:0000->referent 0x5987D 0x1BE +96 FFFLOOR2 referent,fffloor,item 24:FC02->fffloor,24:FE02->item,69:0000->referent 0x32A77 0x548 +97 SHOCKNS referent 69:0000->referent 0x59C35 0x1BE +98 L_NS-2 referent 69:0000->referent 0x4006F 0x257 +99 L_NS-4 referent 69:0000->referent 0x402C6 0x257 +100 SENTRY referent 69:0000->referent 0x58F3E 0x32E +101 L_NS-8 referent 69:0000->referent 0x4051D 0x257 +102 L_NS-16 referent 69:0000->referent 0x3FE18 0x257 +103 L_EW-2 referent 69:0000->referent 0x3F713 0x257 +104 L_EW-4 referent 69:0000->referent 0x3F96A 0x257 +105 L_EW-8 referent 69:0000->referent 0x3FBC1 0x257 +106 L_EW-16 referent 69:0000->referent 0x3F4BC 0x257 +107 MDESKEW referent,fram,item 24:FC02->item,69:0000->referent,69:FE00->fram 0x40E97 0x1DB +108 LASERI referent,laser,hType 24:FE02->laser,69:0000->referent,69:FC00->hType 0x3D103 0x2CC +109 BUBBLE referent,counter 69:0000->referent,69:FE00->counter 0x18867 0x2A8 +110 CAMERAEW referent,delay,iSeeYou,trackedEnough,fram,counter,sawCrusader,movement,target,range 24:F002->target,69:0000->referent,69:EE00->range,69:F200->movement,69:F400->sawCrusader,69:F600->counter,69:F800->fram,69:FA00->trackedEnough,69:FC00->iSeeYou,69:FE00->delay 0x19469 0x641 +111 TELEPAD referent,item,pad2,theQual,mapNum,eggNum,newx,newy,newz,counter,floor,telebeam,onPad 24:F302->telebeam,24:F502->item,24:F702->floor,24:FA02->pad2,24:FE02->item,62:FB00->newz,62:FD00->onPad,69:0000->referent,69:0A00->mapNum,69:0C00->eggNum,69:F800->theQual,69:F900->counter,69:FC00->newy,69:FE00->newx 0x86E9D 0xB8E +112 MDESKNS referent,fram,item 24:FC02->item,69:0000->referent,69:FE00->fram 0x41072 0x1DB +113 MBARREL ma0Q3,referent,item,item2 24:FA02->item,24:FA02->item2,24:FC02->item,24:FC02->item2,24:FE02->item,4C:0000->ma0Q3,69:0000->referent 0x4088F 0x379 +114 S_CHAIR referent,fram,item,count,spin,direction 24:FC02->item,69:0000->referent,69:F600->direction,69:F800->spin,69:FA00->count,69:FE00->fram 0x60D39 0x2AA +115 TARGETNS referent,item 24:FE02->item,69:0000->referent 0x61188 0x1A5 +116 TARGETEW referent,item 24:FE02->item,69:0000->referent 0x60FE3 0x1A5 +117 BART referent,counter,counter2,rndNum 69:0000->referent,69:FA00->rndNum,69:FC00->counter,69:FC00->counter2,69:FE00->counter 0x1215D 0x4A7 +118 SMALCHAI referent,fram,item,count,spin,direction 24:FC02->item,69:0000->referent,69:F600->direction,69:F800->spin,69:FA00->count,69:FE00->fram 0x5AF4B 0x2AA +119 MFAN_NS referent 69:0000->referent 0x41D58 0x168 +120 MFAN_EW referent 69:0000->referent 0x41BF0 0x168 +121 SAFE_NS referent,item,item2,counter 24:FC02->item,24:FC02->item2,24:FE02->item,69:0000->referent,69:FA00->counter 0x57D7A 0x403 +122 SAFE_EW referent,item,item2,counter 24:FC02->item,24:FC02->item2,24:FE02->item,69:0000->referent,69:FA00->counter 0x57977 0x403 +123 ? +QF referent 69:0000->referent 0x13158 0x173 +124 ELEVATOR referent,item,lowQuality,direction,mapNum,eggNum,post1,post2,counter,door,door1 24:F402->door,24:F402->door1,24:F602->door,24:FA02->door,24:FA02->item,24:FC02->item,24:FC02->post2,24:FE02->item,24:FE02->post1,69:0000->referent,69:0C00->mapNum,69:0E00->eggNum,69:F800->counter,69:FA00->direction,69:FC00->lowQuality 0x2CD6A 0xFE0 +125 DEATHFL1 referent 69:0000->referent 0x209E5 0x159 +126 DEATHFL2 referent 69:0000->referent 0x20B3E 0x159 +127 D_BARREL referent 69:0000->referent 0x29C98 0x170 +128 CONVFLR referent,xdir,ydir,item 24:FC02->item,62:FE00->ydir,62:FF00->xdir,69:0000->referent 0x1C9E6 0x2E4 +129 PODBOY item,spooge,fram,counter,referent 24:FA02->item,24:FC02->spooge,24:FE02->item,69:0000->referent,69:F800->counter,69:FA00->fram,69:FC00->counter,69:FE00->fram 0x4DF86 0x389 +130 VALUEBOX referent,randNum,rand,lowByte,highByte 69:0000->referent,69:0A00->rand,69:FC00->highByte,69:FE00->lowByte,69:FE00->rand,69:FE00->randNum 0x69770 0x1B9 +131 STATICNS referent 69:0000->referent 0x5E523 0x159 +132 BIGCOMNS referent,fram 69:0000->referent,69:FE00->fram 0x13917 0x1B4 +133 BIGCOMEW referent,fram 69:0000->referent,69:FE00->fram 0x13763 0x1B4 +134 EYECAMNS referent 69:0000->referent 0x31B60 0x2E1 +135 EYECAMEW referent 69:0000->referent 0x3188E 0x2D2 +136 MALRM_EW referent 69:0000->referent 0x79DFF 0x126 +137 GLASS_EW ma0Q3,referent,item,shot,counter,door 24:F802->door,24:FC02->shot,24:FE02->item,45:5700->ma0Q3,69:0000->referent,69:FA00->counter 0x37E09 0x351 +138 ESPACE2 referent 69:0000->referent 0x2EF77 0x1FB +139 CONV_NL referent,xdir,ydir,item 24:FC02->item,62:FE00->ydir,62:FF00->xdir,69:0000->referent 0x1CFAE 0x2E4 +140 CONV_EL referent,xdir,ydir,item 24:FC02->item,62:FE00->ydir,62:FF00->xdir,69:0000->referent 0x1CCCA 0x2E4 +141 MGR_NS referent 69:0000->referent 0x42064 0x1A4 +142 MINELET referent 69:0000->referent 0x42208 0x152 +143 FLORMINE referent,hType,item 24:FC02->item,69:0000->referent,69:FE00->hType 0x3483F 0x21D +144 SWITCHNS referent 69:0000->referent 0x60BB8 0x181 +145 HOVER_EW referent 69:0000->referent 0x3B90A 0x253 +146 HOVER_NS referent 69:0000->referent 0x3BB5D 0x253 +147 MGR_EW referent 69:0000->referent 0x41EC0 0x1A4 +148 SSBOX_EW ma0Q0,referent 45:5700->ma0Q0,69:0000->referent 0x5CBA1 0x215 +149 BLASERNS referent 69:0000->referent 0x14D32 0x316 +150 BLASEREW referent 69:0000->referent 0x14A1C 0x316 +151 BETTYUP referent,ma0Q,item 24:FE02->item,50:0000->ma0Q,69:0000->referent 0x132CB 0x27C +152 SSBOX_NS ma0Q0,referent 4E:5300->ma0Q0,69:0000->referent 0x5CDB6 0x215 +153 ROAMING referent 69:0000->referent 0x542AD 0x13F +154 STABLE referent,fram,item,thing 24:FA02->thing,24:FC02->item,69:0000->referent,69:FE00->fram 0x5E11B 0x2AF +155 LIFTPIT referent 69:0000->referent 0x3E966 0x133 +156 CONGRESS referent 69:0000->referent 0x1BEC8 0x11B +157 SICBOXNS ma0Q,referent,item 24:FE02->item,4E:5300->ma0Q,69:0000->referent 0x5A491 0x2BE +158 SICBFLNS referent,item 24:FE02->item,69:0000->referent 0x59FED 0x4A4 +159 PRISBENC referent,counter 69:0000->referent,69:FE00->counter 0x4E958 0x376 +160 PRISSIT referent,counter 69:0000->referent,69:FE00->counter 0x4F044 0x376 +161 PRISLEAN referent,counter 69:0000->referent,69:FE00->counter 0x4ECCE 0x376 +162 WALGUNNS referent 69:0000->referent 0x6B1AF 0x2D2 +163 GLASS_NS ma0Q3,referent,item,shot,counter,door 24:F802->door,24:FC02->shot,24:FE02->item,4E:5300->ma0Q3,69:0000->referent,69:FA00->counter 0x3815A 0x351 +164 MAINTMAN referent 69:0000->referent 0x40774 0x11B +165 CHEMSUIT referent 69:0000->referent 0x1AF19 0x11B +166 OFFWORK referent 69:0000->referent 0x4CAD8 0x11B +167 GUARD referent 69:0000->referent 0x3985A 0x11B +168 GDOOR_N referent 69:0000->referent 0x37A74 0x133 +169 GDOOR_E referent 69:0000->referent 0x3780E 0x133 +170 BIGCAN referent,fram 69:0000->referent,69:FE00->fram 0x13547 0x21C +171 AND_BOOT referent,event,counter,item 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter 0x1082E 0x599 +172 BRO_BOOT referent,event,counter,item 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter 0x18237 0x630 +173 CRUMORPH referent,lastAct 69:0000->referent,69:FC00->lastAct 0x1DB7A 0x2DE +174 GUARDSQ referent 69:0000->referent 0x39975 0x11B +175 CARD_NS referent 69:0000->referent 0x1A79B 0x10C +176 CARD_EW referent 69:0000->referent 0x1A68F 0x10C +177 EWALLEW referent 69:0000->referent 0x31548 0x1A3 +178 EWALLNS referent 69:0000->referent 0x316EB 0x1A3 +179 ESPACE referent 69:0000->referent 0x2ED7C 0x1FB +180 WINDSURF referent,item,xoff,yoff,speed,param 24:FE02->item,69:0000->referent,69:EF00->param,69:F800->speed,69:FA00->yoff,69:FC00->xoff 0x72184 0x6C2 +181 THERMATR referent 69:0000->referent 0x63B9A 0x13F +182 D_GUARD referent,goods 24:FE02->goods,69:0000->referent 0x2A6DB 0x251 +183 OBSERVER referent 69:0000->referent 0x4C9DA 0xFE +184 GRENADE referent 69:0000->referent 0x391EF 0x164 +185 SCIENTIS referent 69:0000->referent 0x58A3D 0x11B +186 ROLL_NS referent,item,item2,riderList,time,total,counter,oldz,cargo,zCheck,zMax,ma0Q6 24:EB02->cargo,24:FC02->item,24:FC02->item2,24:FE02->item,53:0000->ma0Q6,62:E800->zMax,69:0000->referent,69:E900->zCheck,69:F200->oldz,69:F600->counter,69:F800->total,69:FE00->time,6C:FA02->riderList 0x56920 0xC64 +187 REB_COUP referent,counter 69:0000->referent,69:FE00->counter 0x50111 0x366 +188 MEDIKIT referent,item 24:FE02->item,69:0000->referent 0x4179F 0x20C +189 COR_BOOT referent,event,counter,item 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter 0x1D610 0x56A +190 EVENT mva3b,referent,event,item,source,dest,door,counter,counter2,link,time,post1,post2,floor,flicMan 0D:0500->mva3b,24:D102->flicMan,24:D702->floor,24:D902->post2,24:DB02->post1,24:F802->door,24:FA02->dest,24:FC02->source,24:FE02->item,69:0000->referent,69:0A00->event,69:E100->time,69:EB00->link,69:EF00->counter,69:EF00->counter2,69:F100->counter 0x2F49E 0x20AA +191 NPCTRIG referent,event,item,item2,typeNpc 24:FA02->item,24:FA02->item2,24:FC02->item,24:FC02->item2,24:FE02->item,69:0000->referent,69:0A00->event,69:0A00->typeNpc 0x4C347 0x3A8 +192 + + + +K referent,item 24:FE02->item,69:0000->referent 0x4DC8C 0x1FC +193 CRUZTRIG referent,item,elev 24:FC02->elev,24:FE02->item,69:0000->referent 0x1DE58 0x34B +194 NPC_ONLY referent,item,link 24:FE02->item,69:0000->referent,69:FA00->link 0x4C6EF 0x2EB +195 VMAIL referent,textFile 69:0000->referent,73:FE00->textFile 0x6AA63 0x47A +196 STORMTRO referent 69:0000->referent 0x5F757 0x11B +197 WALGUNEW referent 69:0000->referent 0x6AEDD 0x2D2 +198 STATICEW referent 69:0000->referent 0x5E3CA 0x159 +199 BARDUDES referent,counter 69:0000->referent,69:FE00->counter 0x11169 0x34D +200 ANDROID referent 69:0000->referent 0x10713 0x11B +201 SOLDIER referent 69:0000->referent 0x5B3AF 0x11B +202 CHEDITRO referent 69:0000->referent 0x1ADEF 0x12A +203 SPIDWALK referent 69:0000->referent 0x5C9F4 0x1AD +204 SPIDPAD referent 69:0000->referent 0x5C86A 0x18A +205 GOVGUNNS referent 69:0000->referent 0x38E1F 0x2D2 +206 LANDMINE referent,landMine,item,xOff,yOff,mine,hType 24:F502->mine,24:FB02->item,24:FC02->item,24:FD02->landMine,69:0000->referent,69:F700->yOff,69:F900->xOff,69:FE00->hType 0x3CADA 0x629 +207 BLASTPAC referent,target,item,counter,lastAnim,xOff,yOff,mine,therm,thermTop,radar,radarPart 24:EF02->mine,24:F402->radar,24:F402->radarPart,24:F602->radar,24:F802->therm,24:F802->thermTop,24:F902->item,24:FA02->therm,24:FB02->target,24:FE02->item,69:0000->referent,69:F100->yOff,69:F300->xOff,69:F500->lastAnim,69:F700->counter,69:FC00->counter 0x15048 0x106A +208 FUSPAC referent,droppedPac,target,item,counter,lastAnim,xOff,yOff,mine,door 24:EC02->door,24:EE02->mine,24:F802->item,24:FA02->target,62:FE00->droppedPac,69:0000->referent,69:F000->yOff,69:F200->xOff,69:F400->lastAnim,69:F600->counter 0x3695E 0x800 +209 GOVGUNEW referent 69:0000->referent 0x38B4D 0x2D2 +210 EBRIDGE referent 69:0000->referent 0x2BCD2 0x1E2 +211 SPANEL referent 69:0000->referent 0x5B4CA 0x15B +212 VARGAS referent 69:0000->referent 0x6A21A 0x132 +213 SL_NS-16 referent 69:0000->referent 0x76E65 0x154 +214 SL_NS-8 referent 69:0000->referent 0x749D0 0x154 +215 SL_NS-4 referent 69:0000->referent 0x7487C 0x154 +216 SL_EW-4 referent 69:0000->referent 0x745D4 0x154 +217 SL_EW-8 referent 69:0000->referent 0x74728 0x154 +218 SL_EW-16 referent 69:0000->referent 0x76D11 0x154 +219 MELF mva5b,referent,item 0D:0500->mva5b,24:FE02->item,69:0000->referent 0x419AB 0x245 +220 ]0Q- mva11b,mva12b,referent,item 0D:0600->mva11b,0D:0600->mva12b,24:FE02->item,69:0000->referent 0x4CE26 0x3F7 +221 GENERATR referent 69:0000->referent 0x37CD7 0x132 +222 RFANBADE referent,item,fart,fart2,fram,counter,counter2,wind 24:F602->wind,24:F802->item,24:FE02->item,69:0000->referent,69:FA00->counter,69:FA00->counter2,69:FA00->fart,69:FA00->fart2,69:FC00->counter,69:FC00->fart,69:FE00->fram 0x53246 0x401 +223 RFANBADN referent,item,fart,fart2,fram,counter,counter2,wind 24:F602->wind,24:F802->item,24:FE02->item,69:0000->referent,69:FA00->counter,69:FA00->counter2,69:FA00->fart,69:FA00->fart2,69:FC00->counter,69:FC00->fart,69:FE00->fram 0x53647 0x402 +224 WVENTNS referent,fram,windsurf 24:FC02->windsurf,69:0000->referent,69:FE00->fram 0x73294 0x1D7 +225 WVENTEW referent,fram,windsurf 24:FC02->windsurf,69:0000->referent,69:FE00->fram 0x730B0 0x1E4 +226 REBEL_TV referent 69:0000->referent 0x4F72C 0x41F +227 SDOOR_N referent 69:0000->referent 0x58C88 0x130 +228 SDOOR_E referent 69:0000->referent 0x58B58 0x130 +229 FLAMEBOX referent,event,flame,flame2,direction,count,newType 24:0A02->flame,24:FC02->flame,24:FC02->flame2,24:FE02->flame,69:0000->referent,69:0A00->event,69:0C00->direction,69:FA00->direction,69:FA00->newType,69:FE00->count 0x33B37 0x790 +230 EBRIDGE2 referent 69:0000->referent 0x2BEB4 0x1E2 +231 MCRATE ma0Q0,referent,item 00:0000->ma0Q0,24:F902->item,69:0000->referent 0x40C08 0x28F +232 COPY_EW referent,fram,coolfram 69:0000->referent,69:FC00->coolfram,69:FE00->fram,6F:6F6C->fram 0x1D292 0x1BF +233 COPY_NS referent,fram,coolfram 69:0000->referent,69:FC00->coolfram,69:FE00->fram,6F:6F6C->fram 0x1D451 0x1BF +234 referent,fram 69:0000->referent,69:FE00->fram 0x7C2AD 0x1A2 +235 FLAME1 referent 69:0000->referent 0x33867 0x168 +236 REB_PAD referent,item,pad2,mapNum,eggNum,phold,gunHold,counter,counter2 24:FA02->gunHold,24:FA02->pad2,24:FC02->phold,24:FE02->item,69:0000->referent,69:0A00->mapNum,69:0C00->eggNum,69:F600->counter,69:F600->counter2,69:F800->counter 0x517FA 0x6D2 +237 NOSTRIL referent,event,fire,count,fire2 24:0A02->fire,24:FC02->fire,24:FC02->fire2,24:FE02->fire,69:0000->referent,69:0A00->event,69:FA00->count,69:FE00->count 0x4AA07 0x487 +238 VARDESK referent,item,counter 24:FE02->item,69:0000->referent,69:FC00->counter,69:FE00->counter 0x69C17 0x603 +239 BLASER1 referent,laserList,item,inFastArea,count,link 24:F702->item,69:0000->referent,69:EB00->link,69:F300->count,69:F500->inFastArea,6C:F902->laserList 0x14134 0x8E8 +240 REB_BOOT referent,counter 69:0000->referent,69:FE00->counter 0x4FF09 0x208 +241 UPPLATE referent,item 24:FE02->item,69:0000->referent 0x6934F 0x2A9 +242 KEYPADNS referent,alreadyPassed 62:FF00->alreadyPassed,69:0000->referent 0x3C73F 0x1EF +243 KEYPADEW referent,alreadyPassed 62:FF00->alreadyPassed,69:0000->referent 0x3C550 0x1EF +244 WSHOCKNS referent,item,shocker,shockCount 24:F002->shocker,24:FE02->item,69:0000->referent,69:E400->shockCount 0x72C7B 0x435 +245 WSHOCKEW referent,item,shocker,shockCount 24:F002->shocker,24:FE02->item,69:0000->referent,69:E400->shockCount 0x72846 0x435 +246 ELYDESK referent,counter,item 24:FC02->item,69:0000->referent,69:FE00->counter 0x2E2D1 0x6B2 +247 SSWITCHN referent,sswitch,switch1,switch2,switch3,timer,sswitch2,switch21,switch22,switch23,counter 24:E902->switch2,24:E902->switch23,24:EB02->switch2,24:EB02->switch22,24:ED02->switch2,24:ED02->switch21,24:EF02->sswitch,24:EF02->sswitch2,24:F102->timer,24:F302->switch3,24:F502->switch2,24:F702->switch1,24:F902->sswitch,69:0000->referent,69:E700->counter,EF:0273->switch2 0x5D873 0x8A8 +248 SSWITCHE referent,sswitch,switch1,switch2,switch3,timer,sswitch2,switch21,switch22,switch23,counter 24:E902->switch2,24:E902->switch23,24:EB02->switch2,24:EB02->switch22,24:ED02->switch2,24:ED02->switch21,24:EF02->sswitch,24:EF02->sswitch2,24:F102->timer,24:F302->switch3,24:F502->switch2,24:F702->switch1,24:F902->sswitch,69:0000->referent,69:E700->counter,EF:0273->switch2 0x5CFCB 0x8A8 +249 SHOCKNS1 referent 69:0000->referent 0x59DF3 0x1FA +250 SHOCKEW1 referent 69:0000->referent 0x59A3B 0x1FA +251 WEA_BOOT referent,counter 69:0000->referent,69:FE00->counter 0x864BF 0x4B6 +252 VAR_BOOT referent,event,counter,item 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter 0x6A34C 0x5ED +253 COURIER referent 69:0000->referent 0x7C7D7 0x13F +254 LWPLATE4 referent,item 24:FE02->item,69:0000->referent 0x3F1F2 0x165 +255 LWPLATE8 referent,item 24:FE02->item,69:0000->referent 0x3F357 0x165 +256 ALARMBOX referent,item 24:FE02->item,69:0000->referent 0xFC90 0x3E4 +257 BLOOD referent 69:0000->referent 0x160B2 0x189 +258 D_CHEM referent,goods 24:FE02->goods,69:0000->referent 0x29E08 0x257 +259 D_CONG referent,goods 24:FE02->goods,69:0000->referent 0x2A05F 0x257 +260 D_MAINT referent,goods 24:FE02->goods,69:0000->referent 0x2ACE1 0x257 +261 D_OWORK referent,goods 24:FE02->goods,69:0000->referent 0x2AF38 0x257 +262 D_SCIEN referent,goods 24:FE02->goods,69:0000->referent 0x2B18F 0x257 +263 D_STORM referent,goods 24:FE02->goods,69:0000->referent 0x2B63D 0x257 +264 D_SOLD referent,goods 24:FE02->goods,69:0000->referent 0x2B3E6 0x257 +265 D_VARG referent 69:0000->referent 0x2BB9A 0x138 +266 D_COUR referent,goods 24:FE02->goods,69:0000->referent 0x2A2B6 0x1CE +267 D_SUSAN referent,goods 24:FE02->goods,69:0000->referent 0x2B894 0x1CE +268 D_THERM referent 69:0000->referent 0x2BA62 0x138 +269 SURCAMNS referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun 24:0A02->eventTrigger,24:F102->therma,24:FA02->valueBox,24:FC02->cameraEgg,24:FC02->monit,24:FE02->screen,61:7373->code,62:F500->code,62:FD00->foundGun,69:0000->referent,69:F600->link,69:F800->passcode,69:FA00->trueRef,73:FE00->textFile 0x5F872 0xD6E +270 BASEGUN referent,item 24:F802->item,69:0000->referent 0x12604 0x442 +271 TIMER referent,time,phase2 69:0000->referent,69:FA00->phase2,69:FC00->time 0x643D9 0x552 +272 SPECIAL referent,phase,counter,time,phase1,phase2,mapNum,npcNum 69:0000->referent,69:0C00->phase,69:F800->phase,69:F800->phase2,69:FA00->phase,69:FA00->phase1,69:FC00->npcNum,69:FC00->time,69:FE00->counter,69:FE00->mapNum 0x5B625 0x80E +273 TRIGPAD referent,item,elev 24:FA02->elev,24:FC02->item,69:0000->referent 0x68FF3 0x35C +274 MONSTER referent,monster1,door,newNpc 24:F602->newNpc,24:F802->door,24:FE02->monster1,69:0000->referent 0x498D7 0x5A3 +275 ELITE referent 69:0000->referent 0x2E192 0x13F +276 D_ESTORM referent,goods 24:FE02->goods,69:0000->referent 0x2A484 0x257 +277 JELYHACK referent 69:0000->referent 0x3BFAC 0xFE +278 DATALINK mva1,mva3a,mva4,mva5a,mva6,mva7,mva8,mva9,mva10,mva11a,mva12a,mva13,mva14,mva15a,mva15c,referent,textFile 0D:0400->mva1,0D:0400->mva4,0D:0400->mva6,0D:0400->mva7,0D:0400->mva8,0D:0400->mva9,0D:0500->mva1,0D:0500->mva10,0D:0500->mva13,0D:0500->mva14,0D:0500->mva3a,0D:0500->mva5a,0D:0600->mva1,0D:0600->mva11a,0D:0600->mva12a,0D:0600->mva15a,0D:0600->mva15c,69:0000->referent,73:FE00->textFile 0x1EB10 0x1488 +279 SLIDEFLR referent 69:0000->referent 0x5ACB7 0x294 +280 JELYH2 referent 69:0000->referent 0x3BEAE 0xFE +281 HOFFMAN referent,hoffy,deathBox,deadGuy,item 24:F802->item,24:FA02->deadGuy,24:FC02->deathBox,24:FE02->hoffy,69:0000->referent 0x39C81 0x162 +282 D_HOFFMA referent 69:0000->referent 0x2ABA9 0x138 +283 REE_BOOT referent,event,counter,item 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter 0x52B90 0x6B6 +284 SURCAMEW referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun 24:0A02->eventTrigger,24:F602->therma,24:FA02->valueBox,24:FC02->cameraEgg,24:FC02->monit,24:FE02->screen,61:7373->code,62:F500->code,62:FD00->foundGun,69:0000->referent,69:F600->link,69:F800->passcode,69:FA00->trueRef,73:FE00->textFile 0x8575F 0xD60 +285 SFXTRIG referent,event 69:0000->referent,69:0A00->event 0x5926C 0x18C +286 SKILLBOX referent,skill 69:0000->referent,69:FE00->skill 0x5A9B7 0x300 +287 D_GURDSQ referent,goods 24:FE02->goods,69:0000->referent 0x2A92C 0x27D +288 VETRON referent 69:0000->referent 0x6A939 0x12A +289 DEATHBOX referent,sswitch,counter 24:FE02->sswitch,69:0000->referent,69:F900->counter 0x1FF98 0x29F +290 REB_GAR referent,counter 69:0000->referent,69:FE00->counter 0x5152D 0x2CD +291 BOUNCBOX referent,item,item2,ammo 24:F602->item,24:F602->item2,24:F802->item,69:0000->referent,69:F000->ammo 0x1623B 0x51D +292 HOVER1 referent 69:0000->referent 0x3B6B7 0x253 +293 STEAM1 referent 69:0000->referent 0x5E9D0 0x168 +294 FADE referent,loop,loop2 69:0000->referent,69:FC00->loop,69:FC00->loop2,69:FE00->loop 0x31E41 0x414 +295 PHIR referent 69:0000->referent 0x4DAD9 0x1B3 +296 STEAMBOX referent,event,steam,steam2,direction,count 24:0A02->steam,24:FC02->steam,24:FC02->steam2,24:FE02->steam,69:0000->referent,69:0A00->event,69:0C00->direction,69:FA00->direction,69:FE00->count 0x5ECA0 0x7E3 +297 FLAME2 referent 69:0000->referent 0x339CF 0x168 +298 STEAM2 referent 69:0000->referent 0x5EB38 0x168 +299 FLAMELP referent 69:0000->referent 0x7BB06 0x168 +300 BBOX ma0Q0,referent 00:0000->ma0Q0,69:0000->referent 0x7BC6E 0x215 +301 GBOX_NS ma0Q0,referent 53:0000->ma0Q0,69:0000->referent 0x7C098 0x215 +302 GBOX_EW ma0Q0,referent 57:0000->ma0Q0,69:0000->referent 0x7BE83 0x215 +303 EGRENADE referent 69:0000->referent 0x2C096 0x13F +304 SCANNER referent 69:0000->referent 0x58766 0x2D7 +305 IONIC referent 69:0000->referent 0x3BDB0 0xFE +306 PLASMA referent 69:0000->referent 0x4DE88 0xFE +307 GRAVITON referent 69:0000->referent 0x390F1 0xFE +308 GLDIV_EW ma0Q3,referent,item,shot,counter,door 24:F802->door,24:FC02->shot,24:FE02->item,45:5700->ma0Q3,69:0000->referent,69:FA00->counter 0x384AB 0x351 +309 GLDIV_NS ma0Q3,referent,item,shot,counter,door 24:F802->door,24:FC02->shot,24:FE02->item,4E:5300->ma0Q3,69:0000->referent,69:FA00->counter 0x387FC 0x351 +310 REBSNOR referent,counter 69:0000->referent,69:FE00->counter 0x4FB4B 0x27C +311 REBWORK referent 69:0000->referent 0x4FDC7 0x142 +312 SATARG mva15b,referent,item,counter 0D:0600->mva15b,24:FE02->item,69:0000->referent,69:FC00->counter 0x5817D 0x5E9 +313 CHEST_ON referent 69:0000->referent 0x1BCD6 0x1F2 +314 CHEST_OE referent 69:0000->referent 0x1BAE4 0x1F2 +315 D_GRENAD referent,goods 24:FE02->goods,69:0000->referent 0x7CCF5 0x257 +316 CHEST_NS ma0Q3,referent,fram,item,item2,counter 24:FC02->item,24:FC02->item2,24:FE02->item,4E:5300->ma0Q3,69:0000->referent,69:FA00->counter,69:FE00->fram 0x1B577 0x56D +317 CHEST_EW ma0Q3,referent,fram,item,item2,counter 24:FC02->item,24:FC02->item2,24:FE02->item,45:5700->ma0Q3,69:0000->referent,69:FA00->counter,69:FE00->fram 0x1B034 0x543 +318 D_ENFORC referent,goods 24:FE02->goods,69:0000->referent 0x7C916 0x257 +319 DETPAC referent,item,lastAnim,xOff,yOff,mine 24:F302->mine,24:FB02->item,69:0000->referent,69:F500->yOff,69:F700->xOff,69:F900->lastAnim 0x20DF0 0x4C4 +320 CRU_SPID referent,mine,target,item,counter,lastAnim,xOff,yOff,counter2,spider 24:EF02->spider,24:F102->item,24:F702->item,24:F902->target,24:FE02->mine,69:0000->referent,69:EF00->yOff,69:F100->xOff,69:F300->lastAnim,69:F500->counter,69:F800->counter,69:F800->counter2,69:FA00->yOff,69:FC00->xOff,69:FE00->counter 0x1E1A3 0x96D +321 ALARMHAT referent,item 24:FE02->item,69:0000->referent 0x10074 0x25F +322 ETWALLNS referent 69:0000->referent 0x2F308 0x196 +323 ETWALLEW referent 69:0000->referent 0x2F172 0x196 +324 THRMBCKN referent,ewall,therma 24:FC02->therma,24:FE02->ewall,69:0000->referent 0x64059 0x380 +325 THRMBCKE referent,ewall,therma 24:FC02->therma,24:FE02->ewall,69:0000->referent 0x63CD9 0x380 +326 ROLL_EW referent,item,item2,riderList,time,total,counter,oldz,cargo,zCheck,zMax,ma0Q6 24:EB02->cargo,24:FC02->item,24:FC02->item2,24:FE02->item,57:0000->ma0Q6,62:E800->zMax,69:0000->referent,69:E900->zCheck,69:F200->oldz,69:F600->counter,69:F800->total,69:FE00->time,6C:FA02->riderList 0x55CBC 0xC64 +327 KORESH referent 69:0000->referent 0x3C92E 0x1AC +328 ALRMTRIG referent 69:0000->referent 0x1051F 0x1F4 +329 ENERGY referent,maxLimit,fule,item 24:FA02->item,69:0000->referent,69:FC00->fule,69:FE00->maxLimit 0x2E983 0x2DE +330 ROLLB_NS referent,item,item2,riderList,time,total,counter,oldz,cargo,zCheck,zMax,ma0Q6 24:EB02->cargo,24:FC02->item,24:FC02->item2,24:FE02->item,4E:5300->ma0Q6,62:E800->zMax,69:0000->referent,69:E900->zCheck,69:F200->oldz,69:F600->counter,69:F800->total,69:FE00->time,6C:FA02->riderList 0x55058 0xC64 +331 ROLLB_EW referent,item,item2,riderList,time,total,counter,oldz,cargo,zCheck,zMax,ma0Q6 24:EB02->cargo,24:FC02->item,24:FC02->item2,24:FE02->item,45:5700->ma0Q6,62:E800->zMax,69:0000->referent,69:E900->zCheck,69:F200->oldz,69:F600->counter,69:F800->total,69:FE00->time,6C:FA02->riderList 0x543EC 0xC6C +332 D_PLASMA referent 69:0000->referent 0x76A01 0x188 +333 D_SKELET referent 69:0000->referent 0x76B89 0x188 +334 D_EM_GUY referent 69:0000->referent 0x7CB6D 0x188 +335 DEATHFL4 referent 69:0000->referent 0x80661 0x159 +336 DAMNLUGG ma0Q0,referent 47:4700->ma0Q0,69:0000->referent 0x7C44F 0x1C4 +337 DAMNMCR8 ma0Q0,referent 52:3800->ma0Q0,69:0000->referent 0x7C613 0x1C4 +338 DEATHFL5 referent 69:0000->referent 0x807BA 0x159 +339 AVATAR referent,item,slot,counter 24:FE02->item,69:0000->referent,69:FA00->counter,69:FC00->slot 0x10DC7 0x3A2 +340 TRIGEGG referent,item 24:FE02->item,69:0000->referent 0x64C2B 0x228 +341 ONCEEGG referent,item 24:FE02->item,69:0000->referent 0x4CBF3 0x233 +342 FLOOR1 referent,counter,item,item2,highNumber,lowNumber,tempNumber,floorItems,wantToStop,foundFloor,onTime 24:FA02->item,24:FA02->item2,24:FC02->item,69:0000->referent,69:EC00->onTime,69:EE00->foundFloor,69:F000->wantToStop,69:F400->tempNumber,69:F600->lowNumber,69:F800->highNumber,69:FE00->counter,6C:F202->floorItems 0x342C7 0x578 +343 MTAREGG referent,item,hiValue,loValue 24:FE02->item,69:0000->referent,69:F800->loValue,69:FA00->hiValue 0x4A2AE 0x387 +344 CHANGER referent,roof,doorQuality,roofQuality,eggNum 24:FE02->roof,69:0000->referent,69:F800->eggNum,69:FA00->roof,69:FA00->roofQuality,69:FC00->doorQuality 0x1AC3A 0x1B5 +345 CAMERA referent 69:0000->referent 0x18B0F 0x313 +346 SECRTEGG referent,item,door,range 24:FC02->door,24:FE02->item,69:0000->referent,69:F800->range 0x58DB8 0x186 +347 REB_EGG referent,item,door,moreVideo,chest,phold,counter,counter2 24:F802->door,24:FC02->phold,24:FE02->chest,24:FE02->item,62:F700->moreVideo,69:0000->referent,69:F800->counter,69:F800->counter2,69:FA00->counter 0x50477 0x10B6 +348 TEST referent 69:0000->referent 0x6132D 0x222 +349 GRENEGG referent,item,source,dest,counter 24:FA02->dest,24:FC02->source,24:FE02->item,69:0000->referent,69:F800->counter 0x39353 0x233 +350 DOOREGG referent,door 24:FE02->door,69:0000->referent 0x29A1A 0x27E +351 BBTRIP referent,item,bbetty 24:FC02->bbetty,24:FE02->item,69:0000->referent 0x12FE6 0x172 +352 LAZEREGG referent,laser 24:FE02->laser,69:0000->referent 0x3D700 0x18F +353 MISS1EGG referent,item,pad2,buster,slot,eTrigger,counter,rubberSuit,pathegg,guardBoy,door 24:F602->door,24:F802->guardBoy,24:FA02->buster,24:FA02->item,24:FC02->eTrigger,24:FC02->pad2,24:FC02->pathegg,24:FE02->buster,24:FE02->door,24:FE02->item,24:FE02->rubberSuit,69:0000->referent,69:0A00->buster,69:F800->counter,69:F800->slot,69:FA00->counter,69:FC00->counter 0x4331A 0x1483 +354 MISS2 referent,counter,item,done0,done1,done2,activate,itemNum,position,turn,body,door,door1,door2,door3,hoffman,pathEgg,vargas 24:0602->item,24:E602->pathEgg,24:EC02->hoffman,24:F002->door,24:F002->door3,24:F202->door,24:F202->door2,24:F402->door,24:F402->door1,24:F602->door,24:F802->vargas,24:FA02->body,24:FA02->item,24:FC02->item,24:FE02->item,62:FC00->activate,62:FD00->done2,62:FE00->done1,62:FF00->done0,69:0000->referent,69:0600->counter,69:0600->position,69:F300->item,69:F300->itemNum,69:F300->turn,69:F500->item,69:F500->itemNum,69:F700->counter,69:FE00->counter 0x4479D 0x22DC +355 MISS3 referent 69:0000->referent 0x46A79 0x21F +356 MISS4 referent,item 24:FE02->item,69:0000->referent 0x46C98 0x2A2 +357 MISS5 referent,counter,item,door,willmar,post1,post2,floor 24:F002->floor,24:F202->post2,24:F402->post1,24:F602->willmar,24:FA02->door,24:FC02->item,69:0000->referent,69:FE00->counter 0x46F3A 0xA64 +358 MISS6 referent,snell,item,door,doorX 24:F802->door,24:FA02->item,24:FE02->snell,69:0000->referent,69:F600->door,69:F600->doorX 0x4799E 0x7D5 +359 MISS7 referent,item 24:FE02->item,69:0000->referent 0x48173 0x13E +360 MISS8 referent,willmar,counter,item,cardReader,telebeam,telepad 24:F402->telepad,24:F602->telebeam,24:F802->cardReader,24:FA02->item,24:FE02->willmar,69:0000->referent,69:FC00->counter 0x482B1 0x949 +361 MISS9 referent,target,station,screen,item,counter 24:F802->item,24:FA02->screen,24:FC02->station,24:FE02->target,69:0000->referent,69:F600->counter 0x48BFA 0x5FD +362 MISS10 referent,item 24:FE02->item,69:0000->referent 0x4235A 0x1B2 +363 MISS11 referent 69:0000->referent 0x4250C 0x1D8 +364 MISS12 referent,item 24:FE02->item,69:0000->referent 0x426E4 0x1FB +365 MISS13 referent,counter,item,wench,npcWench,door 24:F402->door,24:F602->npcWench,24:F802->wench,24:FC02->item,69:0000->referent,69:FE00->counter 0x428DF 0x690 +366 MISS14 referent,counter,item 24:FE02->item,69:0000->referent,69:FE00->counter 0x42F6F 0x3AB +367 MISS15 referent,item,counter,door 24:FA02->door,24:FE02->item,69:0000->referent,69:FC00->counter 0x86975 0x528 +368 MUSIC referent 69:0000->referent 0x4A909 0xFE +369 STEAMEGG referent,sBox 24:FE02->sBox,69:0000->referent 0x76FB9 0x1CD +370 BARREL ma0Q3,referent,barrel,item2,isYellowBarrel,isStandingBarrel,link 00:0000->ma0Q3,24:FC02->item2,24:FE02->barrel,62:FA00->isStandingBarrel,62:FB00->isYellowBarrel,69:0000->referent,69:F800->link 0x114B6 0x575 +371 BBETTY referent,item,counter,counter2,total,item3 24:F302->item,24:F302->item3,24:FE02->item,69:0000->referent,69:F600->counter,69:F800->total,69:FA00->counter,69:FA00->counter2,69:FC00->counter 0x12A46 0x5A0 +372 BLASER referent,laserList,item,inFastArea,count,link 24:F702->item,69:0000->referent,69:ED00->link,69:F100->count,69:F500->inFastArea,6C:F902->laserList 0x13ACB 0x669 +373 BRIDGE referent,item,newtype,item2,start,bridgeitems,bridgemax,item3,cycletype,delay,retry 24:0602->item,24:E302->item,24:E302->item2,24:F002->item,24:F002->item3,24:F202->item,24:F202->item2,24:FC02->item,24:FC02->item2,24:FE02->item,64:6765->item,69:0000->referent,69:0800->newtype,69:0A00->start,69:EA00->retry,69:EC00->delay,69:EE00->cycletype,69:F800->bridgemax,69:FA00->bridgemax,6C:FA02->bridgeitems,6C:FC02->bridgeitems 0x16CEC 0x1395 +374 CONVEYOR referent,counter,areThereItems,cargo_item 24:FB02->cargo_item,62:FD00->areThereItems,69:0000->referent,69:FE00->counter 0x1BFE3 0x43B +375 DEATHFL referent,item,item2,counter,spoogeType 24:FC02->item,24:FC02->item2,24:FE02->item,69:0000->referent,69:EC00->spoogeType,69:FA00->counter 0x20237 0x7AE +376 DOOR referent,doorType,ewall,roof,count,doorParam,doorQuality,roofQuality,ma0QS,deathBox,item,item2,hitMe,damagePoints 00:0000->ma0QS,24:FA02->item,24:FA02->item2,24:FC02->ewall,24:FC02->item,24:FE02->deathBox,24:FE02->roof,69:0000->referent,69:F600->damagePoints,69:F600->roof,69:F600->roofQuality,69:F800->doorQuality,69:F800->hitMe,69:FA00->doorParam,69:FC00->count,69:FE00->doorType 0x212B4 0x2128 +377 DOOR2 referent,doorList,counter,maxFrame,counter2,doorList2,door1,door2,item,nonLegalDoor1,nonLegalDoor2,bool,link,item2,item3,prisDoor,newFrame 24:F202->item,24:F402->door2,24:F402->item,24:F602->door1,24:F602->door2,24:F602->item,24:F602->item2,24:F802->door1,24:F802->item,24:F802->prisDoor,24:FA02->item,24:FA02->item3,24:FA02->prisDoor,24:FC02->item,24:FC02->item2,24:FE02->item,62:EF00->bool,62:F000->nonLegalDoor2,62:F100->nonLegalDoor1,69:0000->referent,69:E000->link,69:E200->link,69:ED00->maxFrame,69:F200->maxFrame,69:F400->maxFrame,69:F600->counter,69:F600->maxFrame,69:F800->counter,69:F800->counter2,69:F800->maxFrame,69:FA00->counter,69:FA00->counter2,69:FA00->link,69:FA00->maxFrame,69:FC00->counter,69:FC00->counter2,69:FC00->maxFrame,69:FC00->newFrame,69:FE00->counter,6C:FC02->doorList,6C:FC02->doorList2,6C:FE02->doorList 0x233DC 0x41EF +378 DOOR3 referent,doorList,doorList2,counter,door2,maxFrame,counter2,door1,item,nonLegalDoor1,nonLegalDoor2,bool 24:F202->item,24:F402->door2,24:F602->door1,24:F802->door2,62:EF00->bool,62:F000->nonLegalDoor2,62:F100->nonLegalDoor1,69:0000->referent,69:ED00->maxFrame,69:F600->maxFrame,69:F800->counter,69:F800->counter2,69:FA00->counter,69:FC00->maxFrame,69:FE00->counter,6C:FC02->doorList,6C:FC02->doorList2,6C:FE02->doorList,6C:FE02->doorList2 0x275CB 0x244F +379 ELEVAT referent,cargoUp,existCargo,counter,height,maxLimit,maxLimitCount,counter2,total,minLimit,minLimitCount,cargoDown,total2,liftpit,pitCounter,totFrames,checkX,checkY 24:F502->cargoDown,24:FE02->cargoUp,24:FE02->liftpit,62:FA00->height,62:FB00->height,62:FC00->totFrames,62:FD00->existCargo,62:FD00->pitCounter,69:0000->referent,69:E800->total,69:E800->total2,69:F200->total,69:F400->counter,69:F400->counter2,69:F600->maxLimit,69:F600->maxLimitCount,69:F700->minLimit,69:F700->minLimitCount,69:F800->checkY,69:F800->maxLimit,69:F900->minLimit,69:FA00->checkX,69:FB00->counter,69:FC00->counter,69:FC00->counter2,69:FE00->counter 0x2C1D5 0xB95 +381 FLAME referent,item,detect 24:FE02->item,62:FD00->detect,69:0000->referent 0x33597 0x2D0 +382 FREE flick,localFlick,item1,item2,avatarMap,npc1,npc2,ref1,ref2,dist,range,item,closestItem,closest,phold,addType,fram,time,oldTick,newTick,ptype,list,member,count,line,temp,lines,counter,alarm,notAlarmed,rndVoice,source,leftOvers 24:F602->npc2,24:F802->npc1,24:FA02->item,24:FC02->closest,24:FC02->closestItem,24:FC02->item,24:FC02->item2,24:FC02->phold,24:FE02->item,24:FE02->item1,24:FE02->phold,62:F500->notAlarmed,62:FD00->leftOvers,64:F800->newTick,64:FC00->oldTick,69:0600->range,69:0600->ref1,69:0600->source,69:0600->time,69:0800->addType,69:0800->ptype,69:0800->ref2,69:0A00->fram,69:F800->dist,69:FA00->avatarMap,69:FA00->closest,69:FA00->rndVoice,69:FC00->alarm,69:FC00->count,69:FE00->count,69:FE00->counter,69:FE00->dist,69:FE00->member,6C:0602->list,73:0600->flick,73:0800->line,73:FE00->line,73:FE00->localFlick,73:FE00->member,7A:0602->list,7A:0802->line,7A:0802->lines,7A:FE02->temp 0x34A5C 0x1F02 +383 HOVER referent,total,counter,cargo,hover,xacc,yacc,zacc,xfract,yfract,zfract,firstEgg,targetEgg,time,oldqhi,link,item,check 24:E702->hover,24:E902->cargo,24:EB02->item,24:ED02->hover,24:FA02->hover,24:FC02->item,24:FE02->cargo,62:0C00->check,64:C400->zfract,64:C800->yfract,64:CC00->xfract,64:D000->zacc,64:D400->yacc,64:D800->xacc,69:0000->referent,69:F000->link,69:F200->firstEgg,69:F400->link,69:F600->oldqhi,69:F700->counter,69:F800->time,69:F900->total,69:FA00->targetEgg,69:FC00->firstEgg 0x39DE3 0x18D4 +384 KEYPAD referent,valueBox,boxesInArea,linkedWithSwitch,wrongCode,userInput,boxPasscode,keycode 24:FE02->valueBox,62:FA00->wrongCode,62:FB00->linkedWithSwitch,69:0000->referent,69:F400->keycode,69:F600->boxPasscode,69:F800->userInput,69:FC00->boxesInArea 0x3C228 0x328 +385 LAZER referent,item,monster 24:FC02->monster,24:FE02->item,69:0000->referent 0x3D3CF 0x331 +386 LITEWALL referent,wall,tempType,realType,counter,stepper,item,wallList,dist,aSet,aSet1,aSet2,aSet3 24:FA02->wall,24:FC02->item,24:FE02->stepper,24:FE02->wall,69:0000->referent,69:E900->aSet,69:E900->aSet3,69:EB00->aSet,69:EB00->aSet2,69:ED00->aSet,69:ED00->aSet1,69:EF00->aSet,69:F100->dist,69:F800->counter,69:FA00->realType,69:FC00->tempType,6C:F802->wall,6C:F802->wallList 0x3EA99 0x4D5 +387 $2Q% referent,item,counter,padDir,toDir,stepNum,phrase,damageSource,aSet 24:FE02->item,69:0000->referent,69:0A00->damageSource,69:0A00->phrase,69:0C00->toDir,69:0E00->stepNum,69:F200->counter,69:FA00->padDir,69:FE00->aSet,69:FE00->counter 0x4AE8E 0x13E5 +389 SHOCKER referent,randNum,duration,skill,kernelCheck,counter,monster 24:FE02->monster,69:0000->referent,69:F400->counter,69:F600->kernelCheck,69:F800->skill,69:FA00->duration,69:FE00->randNum 0x593F8 0x485 +390 SPIDER referent,spiderType,spider,target,dest,count,targetLoop,destX,destY,destZ,currentP,counter,minor,oabs,ovel,axis,ztarg,zcur 24:F705->dest,24:FB05->currentP,24:FC02->target,24:FE02->spider,24:FE02->target,62:0E00->dest,62:0E00->destZ,69:0000->referent,69:0A00->dest,69:0A00->destX,69:0A00->spider,69:0A00->spiderType,69:0C00->dest,69:0C00->destY,69:0E00->target,69:0E00->targetLoop,69:DC00->zcur,69:DE00->ztarg,69:E000->axis,69:E400->ovel,69:E800->oabs,69:EE00->minor,69:F000->count,69:F000->counter,69:F300->target,69:F300->targetLoop,69:F500->count 0x5BE33 0xA37 +391 STEAM referent,item,detect 24:FE02->item,62:FD00->detect,69:0000->referent 0x5E67C 0x354 +392 SWITCH referent,counter,okay 62:FF00->okay,69:0000->referent,69:FE00->counter 0x605E0 0x457 +393 TEXTFILE referent,linkNum,msgNum,passcode,textFile,rnge 0A:005F->textFile,27:7320->passcode,65:7720->passcode,68:6520->passcode,69:0000->referent,69:0A00->linkNum,69:0C00->msgNum,69:0E00->passcode,69:FC00->rnge,73:FE00->textFile,74:7920->passcode 0x6154F 0x252C +394 TRIGGER referent,phase,lowPriorityTriggers,cmdphase,npcNum,mapNum,item,aitem,baseLink,newLink,searchtype,newphase,door,scmd,item2,distance,counter 24:EA02->item,24:EA02->item2,24:EC02->item,24:EC02->item2,24:F002->aitem,24:F202->aitem,24:F202->item,24:F402->aitem,24:F402->item,24:FE02->door,63:6D64->phase,69:0000->referent,69:0C00->phase,69:0E00->npcNum,69:1000->mapNum,69:1200->baseLink,69:1400->searchtype,69:E800->counter,69:EA00->newphase,69:EC00->distance,69:EC00->searchtype,69:EE00->counter,69:EE00->newLink,69:F000->baseLink,69:F000->newLink,69:F200->baseLink,69:F600->mapNum,69:F600->searchtype,69:F800->mapNum,69:F800->npcNum,69:FA00->npcNum,69:FC00->cmdphase,69:FE00->scmd,6C:FE02->lowPriorityTriggers,6E:6577->phase,F0:0261->item,F2:0261->item,F4:0261->item 0x64E53 0x41A0 +395 VALBOX referent,lowByte,highByte,keypadCode 69:0000->referent,69:FA00->keypadCode,69:FC00->highByte,69:FE00->lowByte 0x695F8 0x178 +396 WALLGUN referent,target,brain,delay,targItem,coordToCoordDir,left,right,targetNpc,dist,panRight,panLeft,isTurret,ammo,ma0Q,maxHit,turn,fire,gun2,broken 24:F302->target,24:F302->targetNpc,24:FC02->gun2,24:FE02->targItem,4E:0000->ma0Q,62:F500->isTurret,62:F600->isTurret,62:F600->panLeft,62:F700->panLeft,62:F700->panRight,69:0000->referent,69:0A00->target,69:0C00->brain,69:F300->delay,69:F400->ammo,69:F400->delay,69:F400->isTurret,69:F800->right,69:FA00->broken,69:FA00->dist,69:FA00->fire,69:FA00->left,69:FA00->right,69:FC00->coordToCoordDir,69:FC00->delay,69:FC00->dist,69:FC00->left,69:FC00->right,69:FC00->turn,69:FD00->dist,69:FE00->delay,69:FE00->left,69:FE00->maxHit 0x6B481 0x6D03 +397 $4Q2 referent,shotRef,item,damage 24:FE02->item,69:0000->referent,69:0C00->shotRef,69:FC00->damage 0x7346B 0x48C +398 NPCDEATH referent,link,deathBox,param,hits,keyCard,item,deadGuy,goods,counter,spillBlood,spillOil,spillCoolant,newDir,flipIt,newType,skill,sLevel,wimp,fullOfShit 24:0A02->item,24:ED02->goods,24:EF02->deadGuy,24:F102->item,24:F502->keyCard,24:FB02->deathBox,24:FE02->goods,24:FE02->item,62:DE00->flipIt,62:E800->spillCoolant,62:E900->spillOil,62:EA00->spillBlood,62:F600->fullOfShit,62:F700->wimp,69:0000->referent,69:0C00->link,69:DC00->newType,69:DF00->newDir,69:EB00->counter,69:F700->hits,69:F800->sLevel,69:F900->param,69:FA00->skill,69:FC00->counter 0x74B24 0x1EDD +399 +<$Q7 referent,linkNum,msgNum,passcode,textFile 27:7320->passcode,68:6520->passcode,69:0000->referent,69:0A00->linkNum,69:0C00->msgNum,69:0E00->passcode,6C:6C20->passcode,73:FE00->textFile 0x77898 0x2567 +400 ITEM referent,destx,desty,truncate,targetRef,targetItem,item,newStatus,destX,destY,destZ,currentP,counter,minor,oabs,ovel,axis,ztarg,zcur,damageRef,maxHits,damagePoints,currentHits,newHits,boomType,selfDestruct,origin,bigBomb,onSomething,failTest,theType,ma0Q,onFloor,burn,burn2,egg1,monster1,monster2,link,newNpc,ref1,ref2,item1,item2 00:0000->ma0Q,24:F502->burn,24:F602->newNpc,24:FB05->currentP,24:FC02->burn,24:FC02->burn2,24:FC02->item,24:FC02->item2,24:FC02->monster2,24:FC02->origin,24:FE02->burn,24:FE02->item,24:FE02->item1,24:FE02->monster1,24:FE02->targetItem,62:0C00->selfDestruct,62:0E00->destZ,62:0E00->truncate,62:F600->failTest,62:F700->onSomething,62:FB00->bigBomb,62:FD00->onFloor,69:0000->referent,69:0A00->boomType,69:0A00->damageRef,69:0A00->destX,69:0A00->destx,69:0A00->egg1,69:0A00->newStatus,69:0A00->ref1,69:0A00->targetRef,69:0C00->destY,69:0C00->desty,69:0C00->ref2,69:0E00->maxHits,69:DC00->zcur,69:DE00->ztarg,69:E000->axis,69:E100->zcur,69:E300->ztarg,69:E400->ovel,69:E500->axis,69:E800->oabs,69:E900->ovel,69:ED00->oabs,69:EE00->minor,69:F000->counter,69:F300->minor,69:F400->theType,69:F500->counter,69:FA00->link,69:FA00->newHits,69:FC00->currentHits,69:FE00->damagePoints 0x7A04B 0x1ABB +401 +|$4Q( referent,linkNum,msgNum,passcode,textFile 27:7320->passcode,65:7420->passcode,65:7720->passcode,68:6520->passcode,69:0000->referent,69:0A00->linkNum,69:0C00->msgNum,69:0E00->passcode,6E:6720->passcode,73:6520->passcode,73:FE00->textFile 0x7CF4C 0x26A8 +402 FLICTEST hideoutx,mva01,mva03a,mva03b,mva04,mva05a,mva05b,mva06,mva07,mva08,mva09,mva10,mva11a,mva11b,mva12a,mva12b,mva13,mva14,mva15a,mva15b,mva15c,test,referent,keycode 0D:0400->test,0D:0500->mva01,0D:0500->mva04,0D:0500->mva06,0D:0500->mva07,0D:0500->mva08,0D:0500->mva09,0D:0500->mva10,0D:0500->mva13,0D:0500->mva14,0D:0600->mva03a,0D:0600->mva03b,0D:0600->mva05a,0D:0600->mva05b,0D:0600->mva11a,0D:0600->mva11b,0D:0600->mva12a,0D:0600->mva12b,0D:0600->mva15a,0D:0600->mva15b,0D:0600->mva15c,0D:0800->hideoutx,69:0000->referent,69:FE00->keycode 0x80913 0x4E4C diff --git a/USECODE/EUSECODE_extracted/descriptor_neighborhoods.tsv b/USECODE/EUSECODE_extracted/descriptor_neighborhoods.tsv new file mode 100644 index 0000000..1942469 --- /dev/null +++ b/USECODE/EUSECODE_extracted/descriptor_neighborhoods.tsv @@ -0,0 +1,85 @@ +center_index neighbor_index primary_label field_names field_tags +190 186 ROLL_NS referent,item,item2,riderList,time,total,counter,oldz,cargo,zCheck,zMax,ma0Q6 24:EB02->cargo,24:FC02->item,24:FC02->item2,24:FE02->item,53:0000->ma0Q6,62:E800->zMax,69:0000->referent,69:E900->zCheck,69:F200->oldz,69:F600->counter,69:F800->total,69:FE00->time,6C:FA02->riderList +190 187 REB_COUP referent,counter 69:0000->referent,69:FE00->counter +190 188 MEDIKIT referent,item 24:FE02->item,69:0000->referent +190 189 COR_BOOT referent,event,counter,item 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter +190 190 EVENT mva3b,referent,event,item,source,dest,door,counter,counter2,link,time,post1,post2,floor,flicMan 0D:0500->mva3b,24:D102->flicMan,24:D702->floor,24:D902->post2,24:DB02->post1,24:F802->door,24:FA02->dest,24:FC02->source,24:FE02->item,69:0000->referent,69:0A00->event,69:E100->time,69:EB00->link,69:EF00->counter,69:EF00->counter2,69:F100->counter +190 191 NPCTRIG referent,event,item,item2,typeNpc 24:FA02->item,24:FA02->item2,24:FC02->item,24:FC02->item2,24:FE02->item,69:0000->referent,69:0A00->event,69:0A00->typeNpc +190 192 + + + +K referent,item 24:FE02->item,69:0000->referent +190 193 CRUZTRIG referent,item,elev 24:FC02->elev,24:FE02->item,69:0000->referent +190 194 NPC_ONLY referent,item,link 24:FE02->item,69:0000->referent,69:FA00->link +191 187 REB_COUP referent,counter 69:0000->referent,69:FE00->counter +191 188 MEDIKIT referent,item 24:FE02->item,69:0000->referent +191 189 COR_BOOT referent,event,counter,item 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter +191 190 EVENT mva3b,referent,event,item,source,dest,door,counter,counter2,link,time,post1,post2,floor,flicMan 0D:0500->mva3b,24:D102->flicMan,24:D702->floor,24:D902->post2,24:DB02->post1,24:F802->door,24:FA02->dest,24:FC02->source,24:FE02->item,69:0000->referent,69:0A00->event,69:E100->time,69:EB00->link,69:EF00->counter,69:EF00->counter2,69:F100->counter +191 191 NPCTRIG referent,event,item,item2,typeNpc 24:FA02->item,24:FA02->item2,24:FC02->item,24:FC02->item2,24:FE02->item,69:0000->referent,69:0A00->event,69:0A00->typeNpc +191 192 + + + +K referent,item 24:FE02->item,69:0000->referent +191 193 CRUZTRIG referent,item,elev 24:FC02->elev,24:FE02->item,69:0000->referent +191 194 NPC_ONLY referent,item,link 24:FE02->item,69:0000->referent,69:FA00->link +191 195 VMAIL referent,textFile 69:0000->referent,73:FE00->textFile +193 189 COR_BOOT referent,event,counter,item 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter +193 190 EVENT mva3b,referent,event,item,source,dest,door,counter,counter2,link,time,post1,post2,floor,flicMan 0D:0500->mva3b,24:D102->flicMan,24:D702->floor,24:D902->post2,24:DB02->post1,24:F802->door,24:FA02->dest,24:FC02->source,24:FE02->item,69:0000->referent,69:0A00->event,69:E100->time,69:EB00->link,69:EF00->counter,69:EF00->counter2,69:F100->counter +193 191 NPCTRIG referent,event,item,item2,typeNpc 24:FA02->item,24:FA02->item2,24:FC02->item,24:FC02->item2,24:FE02->item,69:0000->referent,69:0A00->event,69:0A00->typeNpc +193 192 + + + +K referent,item 24:FE02->item,69:0000->referent +193 193 CRUZTRIG referent,item,elev 24:FC02->elev,24:FE02->item,69:0000->referent +193 194 NPC_ONLY referent,item,link 24:FE02->item,69:0000->referent,69:FA00->link +193 195 VMAIL referent,textFile 69:0000->referent,73:FE00->textFile +193 196 STORMTRO referent 69:0000->referent +193 197 WALGUNEW referent 69:0000->referent +272 268 D_THERM referent 69:0000->referent +272 269 SURCAMNS referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun 24:0A02->eventTrigger,24:F102->therma,24:FA02->valueBox,24:FC02->cameraEgg,24:FC02->monit,24:FE02->screen,61:7373->code,62:F500->code,62:FD00->foundGun,69:0000->referent,69:F600->link,69:F800->passcode,69:FA00->trueRef,73:FE00->textFile +272 270 BASEGUN referent,item 24:F802->item,69:0000->referent +272 271 TIMER referent,time,phase2 69:0000->referent,69:FA00->phase2,69:FC00->time +272 272 SPECIAL referent,phase,counter,time,phase1,phase2,mapNum,npcNum 69:0000->referent,69:0C00->phase,69:F800->phase,69:F800->phase2,69:FA00->phase,69:FA00->phase1,69:FC00->npcNum,69:FC00->time,69:FE00->counter,69:FE00->mapNum +272 273 TRIGPAD referent,item,elev 24:FA02->elev,24:FC02->item,69:0000->referent +272 274 MONSTER referent,monster1,door,newNpc 24:F602->newNpc,24:F802->door,24:FE02->monster1,69:0000->referent +272 275 ELITE referent 69:0000->referent +272 276 D_ESTORM referent,goods 24:FE02->goods,69:0000->referent +273 269 SURCAMNS referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun 24:0A02->eventTrigger,24:F102->therma,24:FA02->valueBox,24:FC02->cameraEgg,24:FC02->monit,24:FE02->screen,61:7373->code,62:F500->code,62:FD00->foundGun,69:0000->referent,69:F600->link,69:F800->passcode,69:FA00->trueRef,73:FE00->textFile +273 270 BASEGUN referent,item 24:F802->item,69:0000->referent +273 271 TIMER referent,time,phase2 69:0000->referent,69:FA00->phase2,69:FC00->time +273 272 SPECIAL referent,phase,counter,time,phase1,phase2,mapNum,npcNum 69:0000->referent,69:0C00->phase,69:F800->phase,69:F800->phase2,69:FA00->phase,69:FA00->phase1,69:FC00->npcNum,69:FC00->time,69:FE00->counter,69:FE00->mapNum +273 273 TRIGPAD referent,item,elev 24:FA02->elev,24:FC02->item,69:0000->referent +273 274 MONSTER referent,monster1,door,newNpc 24:F602->newNpc,24:F802->door,24:FE02->monster1,69:0000->referent +273 275 ELITE referent 69:0000->referent +273 276 D_ESTORM referent,goods 24:FE02->goods,69:0000->referent +273 277 JELYHACK referent 69:0000->referent +277 273 TRIGPAD referent,item,elev 24:FA02->elev,24:FC02->item,69:0000->referent +277 274 MONSTER referent,monster1,door,newNpc 24:F602->newNpc,24:F802->door,24:FE02->monster1,69:0000->referent +277 275 ELITE referent 69:0000->referent +277 276 D_ESTORM referent,goods 24:FE02->goods,69:0000->referent +277 277 JELYHACK referent 69:0000->referent +277 278 DATALINK mva1,mva3a,mva4,mva5a,mva6,mva7,mva8,mva9,mva10,mva11a,mva12a,mva13,mva14,mva15a,mva15c,referent,textFile 0D:0400->mva1,0D:0400->mva4,0D:0400->mva6,0D:0400->mva7,0D:0400->mva8,0D:0400->mva9,0D:0500->mva1,0D:0500->mva10,0D:0500->mva13,0D:0500->mva14,0D:0500->mva3a,0D:0500->mva5a,0D:0600->mva1,0D:0600->mva11a,0D:0600->mva12a,0D:0600->mva15a,0D:0600->mva15c,69:0000->referent,73:FE00->textFile +277 279 SLIDEFLR referent 69:0000->referent +277 280 JELYH2 referent 69:0000->referent +277 281 HOFFMAN referent,hoffy,deathBox,deadGuy,item 24:F802->item,24:FA02->deadGuy,24:FC02->deathBox,24:FE02->hoffy,69:0000->referent +280 276 D_ESTORM referent,goods 24:FE02->goods,69:0000->referent +280 277 JELYHACK referent 69:0000->referent +280 278 DATALINK mva1,mva3a,mva4,mva5a,mva6,mva7,mva8,mva9,mva10,mva11a,mva12a,mva13,mva14,mva15a,mva15c,referent,textFile 0D:0400->mva1,0D:0400->mva4,0D:0400->mva6,0D:0400->mva7,0D:0400->mva8,0D:0400->mva9,0D:0500->mva1,0D:0500->mva10,0D:0500->mva13,0D:0500->mva14,0D:0500->mva3a,0D:0500->mva5a,0D:0600->mva1,0D:0600->mva11a,0D:0600->mva12a,0D:0600->mva15a,0D:0600->mva15c,69:0000->referent,73:FE00->textFile +280 279 SLIDEFLR referent 69:0000->referent +280 280 JELYH2 referent 69:0000->referent +280 281 HOFFMAN referent,hoffy,deathBox,deadGuy,item 24:F802->item,24:FA02->deadGuy,24:FC02->deathBox,24:FE02->hoffy,69:0000->referent +280 282 D_HOFFMA referent 69:0000->referent +280 283 REE_BOOT referent,event,counter,item 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter +280 284 SURCAMEW referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun 24:0A02->eventTrigger,24:F602->therma,24:FA02->valueBox,24:FC02->cameraEgg,24:FC02->monit,24:FE02->screen,61:7373->code,62:F500->code,62:FD00->foundGun,69:0000->referent,69:F600->link,69:F800->passcode,69:FA00->trueRef,73:FE00->textFile +285 281 HOFFMAN referent,hoffy,deathBox,deadGuy,item 24:F802->item,24:FA02->deadGuy,24:FC02->deathBox,24:FE02->hoffy,69:0000->referent +285 282 D_HOFFMA referent 69:0000->referent +285 283 REE_BOOT referent,event,counter,item 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter +285 284 SURCAMEW referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun 24:0A02->eventTrigger,24:F602->therma,24:FA02->valueBox,24:FC02->cameraEgg,24:FC02->monit,24:FE02->screen,61:7373->code,62:F500->code,62:FD00->foundGun,69:0000->referent,69:F600->link,69:F800->passcode,69:FA00->trueRef,73:FE00->textFile +285 285 SFXTRIG referent,event 69:0000->referent,69:0A00->event +285 286 SKILLBOX referent,skill 69:0000->referent,69:FE00->skill +285 287 D_GURDSQ referent,goods 24:FE02->goods,69:0000->referent +285 288 VETRON referent 69:0000->referent +285 289 DEATHBOX referent,sswitch,counter 24:FE02->sswitch,69:0000->referent,69:F900->counter diff --git a/USECODE/EUSECODE_extracted/entry_index.tsv b/USECODE/EUSECODE_extracted/entry_index.tsv new file mode 100644 index 0000000..e80bff1 --- /dev/null +++ b/USECODE/EUSECODE_extracted/entry_index.tsv @@ -0,0 +1,411 @@ +entry_index table_offset data_offset declared_size extracted_size text_like printable_ratio zero_ratio overlap_with_next primary_label field_names field_tags preview +0 0x88 0x6090 0x9C00 0x9C00 0 0.0857 0.9063 0 ALARMBOX uniB 4F:4400->uniB,54:4500->uniB,58:3100->uniB .......................................@...BLACK8.un............ +1 0xA8 0x87C38 0x20D 0x20D 0 0.2971 0.5067 0 BLACK8 referent,item 24:FE02->item,69:0000->referent ....9...........g.......................................9....... +2 0xB8 0x4F5F9 0x133 0x133 0 0.1987 0.7264 0 RDOOR_N referent 69:0000->referent ...._.......3..........................................._....... +3 0x108 0x87A2B 0x20D 0x20D 0 0.3029 0.5048 0 BLACK16 referent,item 24:FE02->item,69:0000->referent ....9...........g.......................................9....... +4 0x198 0x102D3 0x126 0x126 0 0.1463 0.7551 0 ALARM_EW referent 69:0000->referent ....R.......&................................................... +5 0x1F8 0x5B1F5 0x1BA 0x1BA 0 0.2715 0.5407 0 SMALLTAB referent,item 24:FE02->item,69:0000->referent ................................................................ +6 0x210 0x69929 0x2EE 0x2EE 0 0.3320 0.4240 0 VALVE referent,counter,item 24:FC02->item,69:0000->referent,69:FE00->counter ................H............................................... +7 0x2C0 0x4124D 0x2A9 0x2A9 0 0.3510 0.4097 0 MDOOR_E referent,item,item2,door 24:FA02->door,24:FC02->item,24:FC02->item2,24:FE02->item,69:0000->referent ........................................................_....... +8 0x2D8 0x103F9 0x126 0x126 0 0.1463 0.7551 0 ALARM_NS referent 69:0000->referent ....R.......&................................................... +9 0x380 0x53A49 0x432 0x432 0 0.4050 0.3343 0 RFANEW referent,item,fart,fart2,fram,counter,counter2,wind 24:F602->wind,24:F802->item,24:FE02->item,69:0000->referent,69:FA00->counter,69:FA00->counter2,69:FA00->fart,69:FA00->fart2,69:FC00->counter,69:FC00->fart,69:FE00->fram ....^.......2...<.........................................8..... +10 0x388 0x804A8 0x1B9 0x1B9 0 0.2653 0.5578 0 FALLINGC referent,item 24:FE02->item,69:0000->referent ................................................................ +11 0x398 0x60A37 0x181 0x181 0 0.2494 0.6026 0 SWITCHEW referent 69:0000->referent ................................................................ +12 0x3E8 0x1C702 0x2E4 0x2E4 0 0.3608 0.4176 0 CONVEY_N referent,xdir,ydir,item 24:FC02->item,62:FE00->ydir,62:FF00->xdir,69:0000->referent ................................................................ +13 0x410 0x73C9C 0x137 0x137 0 0.1994 0.7170 0 YR2X6EW referent 69:0000->referent ....c.......7...........................................c....... +14 0x468 0x4F4C6 0x133 0x133 0 0.1954 0.7264 0 RDOOR_E referent 69:0000->referent ...._.......3..........................................._....... +15 0x490 0x16758 0x2CA 0x2CA 0 0.3319 0.4328 0 BOX_EW referent,counter 69:0000->referent,69:FE00->counter ................$............................................... +16 0x498 0x16A22 0x2CA 0x2CA 0 0.3319 0.4328 0 BOX_NS referent,counter 69:0000->referent,69:FE00->counter ................$............................................... +17 0x4D0 0x738F7 0x137 0x137 0 0.2058 0.7106 0 YR16X6EW referent 69:0000->referent ....c.......7...........................................c....... +18 0x4E0 0x73A2E 0x137 0x137 0 0.2058 0.7106 0 YR16X6NS referent 69:0000->referent ....c.......7...........................................c....... +19 0x4E8 0x742AF 0x137 0x137 0 0.1994 0.7170 0 YR8X6NS referent 69:0000->referent ....c.......7...........................................c....... +20 0x4F0 0x74041 0x137 0x137 0 0.1994 0.7170 0 YR4X6NS referent 69:0000->referent ....c.......7...........................................c....... +21 0x4F8 0x73DD3 0x137 0x137 0 0.1994 0.7170 0 YR2X6NS referent 69:0000->referent ....c.......7...........................................c....... +22 0x508 0x3EF6E 0x284 0x284 0 0.3121 0.4208 0 LUGGAGE ma0Q0,referent,item 24:FE02->item,45:0000->ma0Q0,69:0000->referent ................................................................ +23 0x518 0x74178 0x137 0x137 0 0.1994 0.7170 0 YR8X6EW referent 69:0000->referent ....c.......7...........................................c....... +24 0x520 0x73F0A 0x137 0x137 0 0.1994 0.7170 0 YR4X6EW referent 69:0000->referent ....c.......7...........................................c....... +25 0x528 0x73B65 0x137 0x137 0 0.1865 0.7299 0 YR1X1 referent 69:0000->referent ....c.......7...........................................c....... +26 0x530 0x4D4D7 0x301 0x301 0 0.3641 0.3862 0 PEPSIEW referent,item 24:FE02->item,69:0000->referent ....-........................................................... +27 0x538 0x37941 0x133 0x133 0 0.2020 0.7199 0 GDOOR_E2 referent 69:0000->referent ...._.......3..........................................._....... +28 0x540 0x1A8A7 0x16E 0x16E 0 0.2240 0.6503 0 CATWALK1 referent 69:0000->referent ............n................................................... +29 0x558 0x37BA7 0x130 0x130 0 0.2007 0.7237 0 GDOOR_N2 referent 69:0000->referent ....\.......0...........................................\....... +30 0x560 0x4D7D8 0x301 0x301 0 0.3654 0.3875 0 PEPSINS referent,item 24:FE02->item,69:0000->referent ....-........................................................... +31 0x598 0x4D37A 0x15D 0x15D 0 0.1977 0.6648 0 PANELNS referent 69:0000->referent ............]................................................... +32 0x5A0 0x4D21D 0x15D 0x15D 0 0.1948 0.6648 0 PANELEW referent 69:0000->referent ............]................................................... +33 0x5D8 0x414F6 0x2A9 0x2A9 0 0.3510 0.4112 0 MDOOR_N referent,item,item2,door 24:FA02->door,24:FC02->item,24:FC02->item2,24:FE02->item,69:0000->referent ........................................................_....... +34 0x5E0 0x1202A 0x133 0x133 0 0.2020 0.7231 0 BARRELUP referent 69:0000->referent ...._.......3..........................................._....... +35 0x660 0x5A74F 0x134 0x134 0 0.1688 0.7273 0 SIGNEW referent 69:0000->referent ....`.......4...............................`................... +36 0x668 0x5A883 0x134 0x134 0 0.1656 0.7273 0 SIGNNS referent 69:0000->referent ....`.......4...............................`................... +37 0x678 0x53E7B 0x432 0x432 0 0.4060 0.3343 0 RFANNS referent,item,fart,fart2,fram,counter,counter2,wind 24:F602->wind,24:F802->item,24:FE02->item,69:0000->referent,69:FA00->counter,69:FA00->counter2,69:FA00->fart,69:FA00->fart2,69:FC00->counter,69:FC00->fart,69:FE00->fram ....^.......2...<.........................................8..... +38 0x6A8 0x77186 0x16A 0x16A 0 0.2652 0.6298 0 RDOOR1_E referent 69:0000->referent ............j..........................................._.8..... +39 0x6B0 0x772F0 0x16A 0x16A 0 0.2652 0.6298 0 RDOOR2_E referent 69:0000->referent ............j..........................................._.8..... +40 0x6B8 0x7745A 0x16A 0x16A 0 0.2652 0.6298 0 RDOOR3_E referent 69:0000->referent ............j..........................................._.8..... +41 0x6C0 0x775C4 0x16A 0x16A 0 0.2652 0.6298 0 RDOOR4_E referent 69:0000->referent ............j..........................................._.8..... +42 0x6C8 0x7772E 0x16A 0x16A 0 0.2652 0.6298 0 RDOOR5_E referent 69:0000->referent ............j..........................................._.8..... +43 0x718 0x18081 0x1B6 0x1B6 0 0.2603 0.5616 0 BROKENCW referent,item 24:FE02->item,69:0000->referent ................................................................ +44 0x808 0x5F483 0x2D4 0x2D4 0 0.3812 0.4116 0 STELEPAD referent,item,tele 24:FE02->item,24:FE02->tele,69:0000->referent ................................................................ +45 0x8A0 0x49567 0x370 0x370 0 0.4523 0.3364 0 MONITNS referent,textFile,valueBox,passcode,link,boxCounter 24:FC02->valueBox,69:0000->referent,69:F600->boxCounter,69:F800->link,69:FA00->passcode,6D:6520->link,73:FE00->textFile ............p...".........b.............................:.c..... +46 0x8D0 0x3753C 0x2D2 0x2D2 0 0.4114 0.3961 0 GATGUNNS referent 69:0000->referent ........................................................N....... +47 0x8F8 0x39586 0x2D4 0x2D4 0 0.3812 0.4116 0 GTELEPAD referent,item,tele 24:FE02->item,24:FE02->tele,69:0000->referent ................................................................ +48 0x928 0x3726A 0x2D2 0x2D2 0 0.4114 0.3961 0 GATGUNEW referent 69:0000->referent ........................................................N....... +49 0x990 0x32255 0x2B7 0x2B7 0 0.3683 0.4029 0 FASTSKIL referent,skill 69:0000->referent,69:FE00->skill ................................................................ +50 0xA08 0x2DD4A 0x448 0x448 0 0.4416 0.3330 0 ELEVPLAT referent,cargo 24:FE02->cargo,69:0000->referent ....t.......H................................................... +51 0xA20 0x1AA15 0x225 0x225 0 0.2787 0.4791 0 CATWALK2 referent,item 24:FE02->item,69:0000->referent ....Q.......%...........................................Q....... +52 0xA28 0x3E19C 0x7CA 0x7CA 0 0.4147 0.3074 0 LIFT referent,item,counter,total,cargo,cargoType 24:F302->cargo,24:FE02->item,69:0000->referent,69:F100->cargo,69:F100->cargoType,69:FC00->total,69:FE00->counter ................,...........F.............................m..... +53 0xA30 0x1C41E 0x2E4 0x2E4 0 0.3608 0.4176 0 CONVEY_E referent,xdir,ydir,item 24:FC02->item,62:FE00->ydir,62:FF00->xdir,69:0000->referent ................................................................ +54 0xA38 0x3250C 0x56B 0x56B 0 0.4636 0.2884 0 FFFLOOR referent,fffloor,item 24:FC02->fffloor,24:FE02->item,69:0000->referent ............k...u............................................... +55 0xA40 0x5219F 0x2D3 0x2D3 0 0.3790 0.3721 0 RECHAGNS ma0Q,referent,item 24:FE02->item,4E:5300->ma0Q,69:0000->referent ................-............................................... +56 0xA50 0x52801 0x38F 0x38F 0 0.4029 0.3480 0 RECHFLNS referent,item 24:FE02->item,69:0000->referent ................A.......................................U....... +57 0xA98 0x7FFA4 0x26C 0x26C 0 0.3306 0.4403 0 FIGHT_N2 ma0Q3,referent,item 24:FE02->item,4E:3200->ma0Q3,69:0000->referent ............l................................................... +58 0xB10 0x20C97 0x159 0x159 0 0.2406 0.6551 0 DEATHFL3 referent 69:0000->referent ............Y...........................................N.8..... +59 0xB18 0x11DC4 0x133 0x133 0 0.1954 0.7296 0 BARRELS referent 69:0000->referent ...._.......3..........................................._....... +60 0xB20 0x11B5E 0x133 0x133 0 0.2020 0.7231 0 BARRELNS referent 69:0000->referent ...._.......3..........................................._....... +61 0xB28 0x11A2B 0x133 0x133 0 0.2020 0.7231 0 BARRELEW referent 69:0000->referent ...._.......3..........................................._....... +62 0xB30 0x11C91 0x133 0x133 0 0.2020 0.7231 0 BARRELNW referent 69:0000->referent ...._.......3..........................................._....... +63 0xB38 0x11EF7 0x133 0x133 0 0.2020 0.7231 0 BARRELSE referent 69:0000->referent ...._.......3..........................................._....... +64 0xB50 0x51ECC 0x2D3 0x2D3 0 0.3790 0.3721 0 RECHAGEW ma0Q,referent,item 24:FE02->item,45:5700->ma0Q,69:0000->referent ................-............................................... +65 0xB60 0x52472 0x38F 0x38F 0 0.4029 0.3480 0 RECHFLEW referent,item 24:FE02->item,69:0000->referent ................A.......................................U....... +66 0xB78 0x39A90 0x1F1 0x1F1 0 0.2998 0.5332 0 G_POOL referent,item 24:FE02->item,69:0000->referent ................K............................................... +67 0xB80 0x743E6 0x1EE 0x1EE 0 0.2996 0.5324 0 Y_POOL referent,item 24:FE02->item,69:0000->referent ................H............................................... +68 0xBB8 0x491F7 0x370 0x370 0 0.4511 0.3364 0 MONITEW referent,textFile,valueBox,passcode,link,boxCounter 24:FC02->valueBox,69:0000->referent,69:F600->boxCounter,69:F800->link,69:FA00->passcode,6D:6520->link,73:FE00->textFile ............p...".........b.............................:.c..... +69 0xBC8 0x63A7B 0x11F 0x11F 0 0.1324 0.7700 0 THERM referent 69:0000->referent ....K...........y............................................... +70 0xC30 0x79F25 0x126 0x126 0 0.1531 0.7551 0 MALRM_NS referent 69:0000->referent ....R.......&................................................... +71 0xC88 0x3322B 0x298 0x298 0 0.3614 0.4157 0 FIGHT_NS ma0Q3,referent,item 24:FE02->item,4E:5300->ma0Q3,69:0000->referent ................................................................ +72 0xC90 0x80210 0x298 0x298 0 0.3599 0.4157 0 FIGHT_N3 ma0Q3,referent,item 24:FE02->item,4E:3300->ma0Q3,69:0000->referent ................................................................ +73 0xCA8 0x7FD38 0x26C 0x26C 0 0.3306 0.4403 0 FIGHT_N1 ma0Q3,referent,item 24:FE02->item,4E:3100->ma0Q3,69:0000->referent ............l................................................... +74 0xCD0 0x576A3 0x2D4 0x2D4 0 0.3812 0.4116 0 RTELEPAD referent,item,tele 24:FE02->item,24:FE02->tele,69:0000->referent ................................................................ +75 0xD00 0x4A635 0x2D4 0x2D4 0 0.3812 0.4116 0 MTELEPAD referent,item,tele 24:FE02->item,24:FE02->tele,69:0000->referent ................................................................ +76 0xD08 0x7FACC 0x26C 0x26C 0 0.3258 0.4403 0 FIGHT_E3 ma0Q3,referent,item 24:FE02->item,45:3300->ma0Q3,69:0000->referent ............l................................................... +77 0xD38 0x7F5F4 0x26C 0x26C 0 0.3258 0.4403 0 FIGHT_E1 ma0Q3,referent,item 24:FE02->item,45:3100->ma0Q3,69:0000->referent ............l................................................... +78 0xD40 0x7F860 0x26C 0x26C 0 0.3274 0.4403 0 FIGHT_E2 ma0Q3,referent,item 24:FE02->item,45:3200->ma0Q3,69:0000->referent ............l................................................... +79 0xD50 0x4E30F 0x264 0x264 0 0.3268 0.4641 0 PPLATE referent,item 24:FE02->item,69:0000->referent ............d................................................... +80 0xD58 0x4E573 0x3E5 0x3E5 0 0.4032 0.3551 0 PPLATE2 referent,item 24:FC02->item,69:0000->referent ................................................................ +81 0xD60 0x32FBF 0x26C 0x26C 0 0.3258 0.4403 0 FIGHT_EW ma0Q3,referent,item 24:FE02->item,45:5700->ma0Q3,69:0000->referent ............l................................................... +82 0xD68 0x3DD17 0x485 0x485 0 0.3786 0.3155 0 LAZERNS referent,fram,item 24:FC02->item,69:0000->referent,69:FE00->fram ................................................................ +83 0xD70 0x3D88F 0x488 0x488 0 0.3810 0.3164 0 LAZEREW referent,fram,item 24:FC02->item,69:0000->referent,69:FE00->fram ................................................................ +84 0xDA0 0x4F3BA 0x10C 0x10C 0 0.1157 0.8097 0 RADAR referent 69:0000->referent ....8...........f............................................... +85 0xDC0 0x57584 0x11F 0x11F 0 0.1429 0.7596 0 RSTATION referent 69:0000->referent ....K...........y............................................... +86 0xDF8 0x3C0AA 0x17E 0x17E 0 0.2225 0.6283 0 JOHN referent,fram 69:0000->referent,69:FE00->fram ............~...0.........L.................^.M................. +87 0xE30 0x2EC61 0x11B 0x11B 0 0.1519 0.7562 0 ENFORCER referent 69:0000->referent ....G...........u............................................... +88 0xE40 0x18E22 0x647 0x647 0 0.4449 0.2862 0 CAMERACO referent,delay,iSeeYou,trackedEnough,fram,counter,sawCrusader,movement,target,range 24:F002->target,69:0000->referent,69:EE00->range,69:F200->movement,69:F400->sawCrusader,69:F600->counter,69:F800->fram,69:FA00->trackedEnough,69:FC00->iSeeYou,69:FE00->delay ....s.......G...Q............................................... +89 0xE48 0x49E7A 0x434 0x434 0 0.4275 0.3467 0 MOTION referent,trackedEnough,fram,movement,foundTarget,delay,iSeeYou 62:F900->foundTarget,69:0000->referent,69:F500->iSeeYou,69:F700->delay,69:FA00->movement,69:FC00->fram,69:FE00->trackedEnough ....`.......4...>.........................................u..... +90 0xE50 0x19AAA 0x641 0x641 0 0.4466 0.2867 0 CAMERANS referent,delay,iSeeYou,trackedEnough,fram,counter,sawCrusader,movement,target,range 24:F002->target,69:0000->referent,69:EE00->range,69:F200->movement,69:F400->sawCrusader,69:F600->counter,69:F800->fram,69:FA00->trackedEnough,69:FC00->iSeeYou,69:FE00->delay ....m.......A...K............................................... +91 0xE58 0x1A0EB 0x2D2 0x2D2 0 0.3934 0.4155 0 CAM_EW referent 69:0000->referent ........................................................N....... +92 0xE60 0x1A3BD 0x2D2 0x2D2 0 0.3934 0.4155 0 CAM_NS referent 69:0000->referent ........................................................N....... +93 0xE70 0x3715E 0x10C 0x10C 0 0.1269 0.7985 0 FUSREACT referent 69:0000->referent ....8...........f............................................... +94 0xE88 0x6492B 0x300 0x300 0 0.3854 0.3880 0 TRANSFOR referent,fram,damagePoints,item 24:FA02->item,69:0000->referent,69:FC00->damagePoints,69:FE00->fram ....,.....................................................L..... +95 0xEA0 0x5987D 0x1BE 0x1BE 0 0.2937 0.5448 0 SHOCKEW referent 69:0000->referent ................................................................ +96 0xED0 0x32A77 0x548 0x548 0 0.4667 0.2833 0 FFFLOOR2 referent,fffloor,item 24:FC02->fffloor,24:FE02->item,69:0000->referent ....t.......H...R............................................... +97 0xED8 0x59C35 0x1BE 0x1BE 0 0.2937 0.5448 0 SHOCKNS referent 69:0000->referent ................................................................ +98 0xEE8 0x4006F 0x257 0x257 0 0.3539 0.4775 0 L_NS-2 referent 69:0000->referent ............W................................................... +99 0xEF0 0x402C6 0x257 0x257 0 0.3539 0.4775 0 L_NS-4 referent 69:0000->referent ............W................................................... +100 0xEF8 0x58F3E 0x32E 0x32E 0 0.4115 0.3870 0 SENTRY referent 69:0000->referent ....Z...........@.......................................N....... +101 0xF00 0x4051D 0x257 0x257 0 0.3539 0.4775 0 L_NS-8 referent 69:0000->referent ............W................................................... +102 0xF08 0x3FE18 0x257 0x257 0 0.3639 0.4674 0 L_NS-16 referent 69:0000->referent ............W................................................... +103 0xF10 0x3F713 0x257 0x257 0 0.3539 0.4775 0 L_EW-2 referent 69:0000->referent ............W................................................... +104 0xF18 0x3F96A 0x257 0x257 0 0.3539 0.4775 0 L_EW-4 referent 69:0000->referent ............W................................................... +105 0xF20 0x3FBC1 0x257 0x257 0 0.3539 0.4775 0 L_EW-8 referent 69:0000->referent ............W................................................... +106 0xF28 0x3F4BC 0x257 0x257 0 0.3623 0.4674 0 L_EW-16 referent 69:0000->referent ............W................................................... +107 0xF30 0x40E97 0x1DB 0x1DB 0 0.2821 0.5200 0 MDESKEW referent,fram,item 24:FC02->item,69:0000->referent,69:FE00->fram ................5............................................... +108 0xF38 0x3D103 0x2CC 0x2CC 0 0.3589 0.4106 0 LASERI referent,laser,hType 24:FE02->laser,69:0000->referent,69:FC00->hType ................&............................................... +109 0xF40 0x18867 0x2A8 0x2A8 0 0.3515 0.4324 0 BUBBLE referent,counter 69:0000->referent,69:FE00->counter ................Z............................................... +110 0xF48 0x19469 0x641 0x641 0 0.4460 0.2873 0 CAMERAEW referent,delay,iSeeYou,trackedEnough,fram,counter,sawCrusader,movement,target,range 24:F002->target,69:0000->referent,69:EE00->range,69:F200->movement,69:F400->sawCrusader,69:F600->counter,69:F800->fram,69:FA00->trackedEnough,69:FC00->iSeeYou,69:FE00->delay ....m.......A...K............................................... +111 0xF68 0x86E9D 0xB8E 0xB8E 0 0.4533 0.2302 0 TELEPAD referent,item,pad2,theQual,mapNum,eggNum,newx,newy,newz,counter,floor,telebeam,onPad 24:F302->telebeam,24:F502->item,24:F702->floor,24:FA02->pad2,24:FE02->item,62:FB00->newz,62:FD00->onPad,69:0000->referent,69:0A00->mapNum,69:0C00->eggNum,69:F800->theQual,69:F900->counter,69:FC00->newy,69:FE00->newx ..........................................................M..... +112 0xF70 0x41072 0x1DB 0x1DB 0 0.2821 0.5200 0 MDESKNS referent,fram,item 24:FC02->item,69:0000->referent,69:FE00->fram ................5............................................... +113 0xF78 0x4088F 0x379 0x379 0 0.3825 0.3723 0 MBARREL ma0Q3,referent,item,item2 24:FA02->item,24:FA02->item2,24:FC02->item,24:FC02->item2,24:FE02->item,4C:0000->ma0Q3,69:0000->referent ............y...+................................."............. +114 0xFA0 0x60D39 0x2AA 0x2AA 0 0.3402 0.4326 0 S_CHAIR referent,fram,item,count,spin,direction 24:FC02->item,69:0000->referent,69:F600->direction,69:F800->spin,69:FA00->count,69:FE00->fram ................................................................ +115 0x1020 0x61188 0x1A5 0x1A5 0 0.2589 0.5724 0 TARGETNS referent,item 24:FE02->item,69:0000->referent ................................................................ +116 0x1028 0x60FE3 0x1A5 0x1A5 0 0.2589 0.5724 0 TARGETEW referent,item 24:FE02->item,69:0000->referent ................................................................ +117 0x1038 0x1215D 0x4A7 0x4A7 0 0.3812 0.3619 0 BART referent,counter,counter2,rndNum 69:0000->referent,69:FA00->rndNum,69:FC00->counter,69:FC00->counter2,69:FE00->counter ................Y............................................... +118 0x1068 0x5AF4B 0x2AA 0x2AA 0 0.3446 0.4282 0 SMALCHAI referent,fram,item,count,spin,direction 24:FC02->item,69:0000->referent,69:F600->direction,69:F800->spin,69:FA00->count,69:FE00->fram ................................................................ +119 0x1088 0x41D58 0x168 0x168 0 0.2250 0.6444 0 MFAN_NS referent 69:0000->referent ............h................................................... +120 0x1090 0x41BF0 0x168 0x168 0 0.2250 0.6444 0 MFAN_EW referent 69:0000->referent ............h................................................... +121 0x1120 0x57D7A 0x403 0x403 0 0.4138 0.3330 0 SAFE_NS referent,item,item2,counter 24:FC02->item,24:FC02->item2,24:FE02->item,69:0000->referent,69:FA00->counter ..../...........]............................................... +122 0x1128 0x57977 0x403 0x403 0 0.4109 0.3330 0 SAFE_EW referent,item,item2,counter 24:FC02->item,24:FC02->item2,24:FE02->item,69:0000->referent,69:FA00->counter ..../...........]............................................... +123 0x1178 0x13158 0x173 0x173 0 0.1968 0.6442 0 ? +QF referent 69:0000->referent ............s................................................... +124 0x1180 0x2CD6A 0xFE0 0xFE0 0 0.4820 0.1919 0 ELEVATOR referent,item,lowQuality,direction,mapNum,eggNum,post1,post2,counter,door,door1 24:F402->door,24:F402->door1,24:F602->door,24:FA02->door,24:FA02->item,24:FC02->item,24:FC02->post2,24:FE02->item,24:FE02->post1,69:0000->referent,69:0C00->mapNum,69:0E00->eggNum,69:F800->counter,69:FA00->direction,69:FC00->lowQuality ........................................................u....... +125 0x11C8 0x209E5 0x159 0x159 0 0.2406 0.6551 0 DEATHFL1 referent 69:0000->referent ............Y...........................................N.8..... +126 0x11D0 0x20B3E 0x159 0x159 0 0.2406 0.6551 0 DEATHFL2 referent 69:0000->referent ............Y...........................................N.8..... +127 0x11E8 0x29C98 0x170 0x170 0 0.2255 0.6359 0 D_BARREL referent 69:0000->referent ............p................................................... +128 0x11F0 0x1C9E6 0x2E4 0x2E4 0 0.3568 0.4216 0 CONVFLR referent,xdir,ydir,item 24:FC02->item,62:FE00->ydir,62:FF00->xdir,69:0000->referent ................................................................ +129 0x11F8 0x4DF86 0x389 0x389 0 0.3569 0.3724 0 PODBOY item,spooge,fram,counter,referent 24:FA02->item,24:FC02->spooge,24:FE02->item,69:0000->referent,69:F800->counter,69:FA00->fram,69:FC00->counter,69:FE00->fram ................;............................................... +130 0x1318 0x69770 0x1B9 0x1B9 0 0.3107 0.5578 0 VALUEBOX referent,randNum,rand,lowByte,highByte 69:0000->referent,69:0A00->rand,69:FC00->highByte,69:FE00->lowByte,69:FE00->rand,69:FE00->randNum ................k...........................j................... +131 0x1330 0x5E523 0x159 0x159 0 0.2348 0.6580 0 STATICNS referent 69:0000->referent ............Y...........................................[....... +132 0x1348 0x13917 0x1B4 0x1B4 0 0.2821 0.5573 0 BIGCOMNS referent,fram 69:0000->referent,69:FE00->fram ................f............................................... +133 0x1350 0x13763 0x1B4 0x1B4 0 0.2821 0.5573 0 BIGCOMEW referent,fram 69:0000->referent,69:FE00->fram ................f............................................... +134 0x1388 0x31B60 0x2E1 0x2E1 0 0.4111 0.3921 0 EYECAMNS referent 69:0000->referent ........................................................]....... +135 0x1390 0x3188E 0x2D2 0x2D2 0 0.4114 0.3961 0 EYECAMEW referent 69:0000->referent ........................................................N....... +136 0x1418 0x79DFF 0x126 0x126 0 0.1531 0.7551 0 MALRM_EW referent 69:0000->referent ....R.......&................................................... +137 0x1468 0x37E09 0x351 0x351 0 0.3746 0.3534 0 GLASS_EW ma0Q3,referent,item,shot,counter,door 24:F802->door,24:FC02->shot,24:FE02->item,45:5700->ma0Q3,69:0000->referent,69:FA00->counter ....}.......Q...........................................}....... +138 0x1510 0x2EF77 0x1FB 0x1FB 0 0.3116 0.5089 0 ESPACE2 referent 69:0000->referent ....'........................................................... +139 0x1520 0x1CFAE 0x2E4 0x2E4 0 0.3568 0.4216 0 CONV_NL referent,xdir,ydir,item 24:FC02->item,62:FE00->ydir,62:FF00->xdir,69:0000->referent ................................................................ +140 0x1528 0x1CCCA 0x2E4 0x2E4 0 0.3568 0.4216 0 CONV_EL referent,xdir,ydir,item 24:FC02->item,62:FE00->ydir,62:FF00->xdir,69:0000->referent ................................................................ +141 0x1530 0x42064 0x1A4 0x1A4 0 0.2262 0.6000 0 MGR_NS referent 69:0000->referent ................................................................ +142 0x1580 0x42208 0x152 0x152 0 0.2219 0.6775 0 MINELET referent 69:0000->referent ....~.......R.....................................I............. +143 0x1588 0x3483F 0x21D 0x21D 0 0.3031 0.4954 0 FLORMINE referent,hType,item 24:FC02->item,69:0000->referent,69:FE00->hType ....I...........w.......................................I....... +144 0x15A8 0x60BB8 0x181 0x181 0 0.2494 0.6026 0 SWITCHNS referent 69:0000->referent ................................................................ +145 0x15E8 0x3B90A 0x253 0x253 0 0.3882 0.4471 0 HOVER_EW referent 69:0000->referent ............S................................................... +146 0x15F8 0x3BB5D 0x253 0x253 0 0.3882 0.4471 0 HOVER_NS referent 69:0000->referent ............S................................................... +147 0x1600 0x41EC0 0x1A4 0x1A4 0 0.2262 0.6000 0 MGR_EW referent 69:0000->referent ................................................................ +148 0x1628 0x5CBA1 0x215 0x215 0 0.3377 0.4784 0 SSBOX_EW ma0Q0,referent 45:5700->ma0Q0,69:0000->referent ....A...........o.......................................A....... +149 0x16A8 0x14D32 0x316 0x316 0 0.4342 0.3722 0 BLASERNS referent 69:0000->referent ....B...........(.................................^.....^....... +150 0x16B0 0x14A1C 0x316 0x316 0 0.4342 0.3722 0 BLASEREW referent 69:0000->referent ....B...........(.................................^.....^....... +151 0x16D8 0x132CB 0x27C 0x27C 0 0.3491 0.4403 0 BETTYUP referent,ma0Q,item 24:FE02->item,50:0000->ma0Q,69:0000->referent ............|.............................................9..... +152 0x16E0 0x5CDB6 0x215 0x215 0 0.3377 0.4784 0 SSBOX_NS ma0Q0,referent 4E:5300->ma0Q0,69:0000->referent ....A...........o.......................................A....... +153 0x16E8 0x542AD 0x13F 0x13F 0 0.1724 0.6928 0 ROAMING referent 69:0000->referent ....k.......?................................................... +154 0x1770 0x5E11B 0x2AF 0x2AF 0 0.3624 0.3916 0 STABLE referent,fram,item,thing 24:FA02->thing,24:FC02->item,69:0000->referent,69:FE00->fram ................................................................ +155 0x1780 0x3E966 0x133 0x133 0 0.1759 0.7362 0 LIFTPIT referent 69:0000->referent ...._.......3..........................................._....... +156 0x1788 0x1BEC8 0x11B 0x11B 0 0.1519 0.7562 0 CONGRESS referent 69:0000->referent ....G...........u............................................... +157 0x1790 0x5A491 0x2BE 0x2BE 0 0.3604 0.3775 0 SICBOXNS ma0Q,referent,item 24:FE02->item,4E:5300->ma0Q,69:0000->referent ................................................................ +158 0x1798 0x59FED 0x4A4 0x4A4 0 0.4251 0.2938 0 SICBFLNS referent,item 24:FE02->item,69:0000->referent ................V.......................................j....... +159 0x17B8 0x4E958 0x376 0x376 0 0.4029 0.3578 0 PRISBENC referent,counter 69:0000->referent,69:FE00->counter ............v...(............................................... +160 0x17C8 0x4F044 0x376 0x376 0 0.3905 0.3702 0 PRISSIT referent,counter 69:0000->referent,69:FE00->counter ............v...(............................................... +161 0x17D0 0x4ECCE 0x376 0x376 0 0.4029 0.3578 0 PRISLEAN referent,counter 69:0000->referent,69:FE00->counter ............v...(............................................... +162 0x1810 0x6B1AF 0x2D2 0x2D2 0 0.4127 0.3947 0 WALGUNNS referent 69:0000->referent ........................................................N....... +163 0x1828 0x3815A 0x351 0x351 0 0.3710 0.3534 0 GLASS_NS ma0Q3,referent,item,shot,counter,door 24:F802->door,24:FC02->shot,24:FE02->item,4E:5300->ma0Q3,69:0000->referent,69:FA00->counter ....}.......Q...........................................}....... +164 0x1838 0x40774 0x11B 0x11B 0 0.1519 0.7562 0 MAINTMAN referent 69:0000->referent ....G...........u............................................... +165 0x1840 0x1AF19 0x11B 0x11B 0 0.1484 0.7562 0 CHEMSUIT referent 69:0000->referent ....G...........u............................................... +166 0x1848 0x4CAD8 0x11B 0x11B 0 0.1484 0.7597 0 OFFWORK referent 69:0000->referent ....G...........u............................................... +167 0x1878 0x3985A 0x11B 0x11B 0 0.1413 0.7668 0 GUARD referent 69:0000->referent ....G...........u............................................... +168 0x18E0 0x37A74 0x133 0x133 0 0.1954 0.7264 0 GDOOR_N referent 69:0000->referent ...._.......3..........................................._....... +169 0x18E8 0x3780E 0x133 0x133 0 0.1954 0.7264 0 GDOOR_E referent 69:0000->referent ...._.......3..........................................._....... +170 0x1928 0x13547 0x21C 0x21C 0 0.2981 0.4889 0 BIGCAN referent,fram 69:0000->referent,69:FE00->fram ....H...........v.......................................H....... +171 0x1930 0x1082E 0x599 0x599 0 0.4306 0.2861 0 AND_BOOT referent,event,counter,item 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter ................................................................ +172 0x1940 0x18237 0x630 0x630 0 0.4451 0.2734 0 BRO_BOOT referent,event,counter,item 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter ....\.......0...:............................................... +173 0x1950 0x1DB7A 0x2DE 0x2DE 0 0.3787 0.3951 0 CRUMORPH referent,lastAct 69:0000->referent,69:FC00->lastAct ................8............................................... +174 0x1958 0x39975 0x11B 0x11B 0 0.1484 0.7597 0 GUARDSQ referent 69:0000->referent ....G...........u............................................... +175 0x1978 0x1A79B 0x10C 0x10C 0 0.1343 0.8022 0 CARD_NS referent 69:0000->referent ....8...........f.........8..................................... +176 0x1980 0x1A68F 0x10C 0x10C 0 0.1343 0.8022 0 CARD_EW referent 69:0000->referent ....8...........f.........8..................................... +177 0x19D8 0x31548 0x1A3 0x1A3 0 0.2959 0.5728 0 EWALLEW referent 69:0000->referent ................................................................ +178 0x19E0 0x316EB 0x1A3 0x1A3 0 0.2959 0.5728 0 EWALLNS referent 69:0000->referent ................................................................ +179 0x1A40 0x2ED7C 0x1FB 0x1FB 0 0.3037 0.5168 0 ESPACE referent 69:0000->referent ....'........................................................... +180 0x1A48 0x72184 0x6C2 0x6C2 0 0.4220 0.2659 0 WINDSURF referent,item,xoff,yoff,speed,param 24:FE02->item,69:0000->referent,69:EF00->param,69:F800->speed,69:FA00->yoff,69:FC00->xoff ................$.......................................a.S..... +181 0x1A50 0x63B9A 0x13F 0x13F 0 0.1755 0.6897 0 THERMATR referent 69:0000->referent ....k.......?................................................... +182 0x1A58 0x2A6DB 0x251 0x251 0 0.3103 0.4604 0 D_GUARD referent,goods 24:FE02->goods,69:0000->referent ....}.......Q.............d..................................... +183 0x1A70 0x4C9DA 0xFE 0xFE 0 0.1181 0.8346 0 OBSERVER referent 69:0000->referent ....*...........X............................................... +184 0x1AA8 0x391EF 0x164 0x164 0 0.2303 0.6573 0 GRENADE referent 69:0000->referent ............d.....................................H.I...H....... +185 0x1AB0 0x58A3D 0x11B 0x11B 0 0.1519 0.7562 0 SCIENTIS referent 69:0000->referent ....G...........u............................................... +186 0x1AC0 0x56920 0xC64 0xC64 0 0.4439 0.2267 0 ROLL_NS referent,item,item2,riderList,time,total,counter,oldz,cargo,zCheck,zMax,ma0Q6 24:EB02->cargo,24:FC02->item,24:FC02->item2,24:FE02->item,53:0000->ma0Q6,62:E800->zMax,69:0000->referent,69:E900->zCheck,69:F200->oldz,69:F600->counter,69:F800->total,69:FE00->time,6C:FA02->riderList ............d...v.................................a.$.....;..... +187 0x1AF8 0x50111 0x366 0x366 0 0.4011 0.3678 0 REB_COUP referent,counter 69:0000->referent,69:FE00->counter ............f................................................... +188 0x1B18 0x4179F 0x20C 0x20C 0 0.2901 0.5363 0 MEDIKIT referent,item 24:FE02->item,69:0000->referent ....8...........f.........8..................................... +189 0x1B90 0x1D610 0x56A 0x56A 0 0.4437 0.2893 0 COR_BOOT referent,event,counter,item 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter ............j...t............................................... +190 0x1B98 0x2F49E 0x20AA 0x20AA 0 0.4513 0.1809 0 EVENT mva3b,referent,event,item,source,dest,door,counter,counter2,link,time,post1,post2,floor,flicMan 0D:0500->mva3b,24:D102->flicMan,24:D702->floor,24:D902->post2,24:DB02->post1,24:F802->door,24:FA02->dest,24:FC02->source,24:FE02->item,69:0000->referent,69:0A00->event,69:E100->time,69:EB00->link,69:EF00->counter,69:EF00->counter2,69:F100->counter ............. ...!.............................................. +191 0x1BA8 0x4C347 0x3A8 0x3A8 0 0.4156 0.3536 0 NPCTRIG referent,event,item,item2,typeNpc 24:FA02->item,24:FA02->item2,24:FC02->item,24:FC02->item2,24:FE02->item,69:0000->referent,69:0A00->event,69:0A00->typeNpc ................Z............................................... +192 0x1BB0 0x4DC8C 0x1FC 0x1FC 0 0.2717 0.5394 0 + + + +K referent,item 24:FE02->item,69:0000->referent ....(...........V.......................................(....... +193 0x1BB8 0x1DE58 0x34B 0x34B 0 0.4045 0.3760 0 CRUZTRIG referent,item,elev 24:FC02->elev,24:FE02->item,69:0000->referent ....w.......K...........................................w....... +194 0x1BC0 0x4C6EF 0x2EB 0x2EB 0 0.3735 0.4096 0 NPC_ONLY referent,item,link 24:FE02->item,69:0000->referent,69:FA00->link ................E............................................... +195 0x1BC8 0x6AA63 0x47A 0x47A 0 0.4162 0.3307 0 VMAIL referent,textFile 69:0000->referent,73:FE00->textFile ............z................................................... +196 0x1C18 0x5F757 0x11B 0x11B 0 0.1484 0.7562 0 STORMTRO referent 69:0000->referent ....G...........u............................................... +197 0x1C28 0x6AEDD 0x2D2 0x2D2 0 0.4127 0.3947 0 WALGUNEW referent 69:0000->referent ........................................................N....... +198 0x1C88 0x5E3CA 0x159 0x159 0 0.2348 0.6580 0 STATICEW referent 69:0000->referent ............Y...........................................[....... +199 0x1CA0 0x11169 0x34D 0x34D 0 0.3988 0.3704 0 BARDUDES referent,counter 69:0000->referent,69:FE00->counter ....y.......M................................................... +200 0x1CA8 0x10713 0x11B 0x11B 0 0.1449 0.7597 0 ANDROID referent 69:0000->referent ....G...........u............................................... +201 0x1CB0 0x5B3AF 0x11B 0x11B 0 0.1484 0.7597 0 SOLDIER referent 69:0000->referent ....G...........u............................................... +202 0x1CB8 0x1ADEF 0x12A 0x12A 0 0.1577 0.7248 0 CHEDITRO referent 69:0000->referent ....V.......*................................................... +203 0x1D18 0x5C9F4 0x1AD 0x1AD 0 0.2984 0.5664 0 SPIDWALK referent 69:0000->referent ..................................................I.....[.6..... +204 0x1D48 0x5C86A 0x18A 0x18A 0 0.2563 0.5964 0 SPIDPAD referent 69:0000->referent ................<............................................... +205 0x1D58 0x38E1F 0x2D2 0x2D2 0 0.4114 0.3961 0 GOVGUNNS referent 69:0000->referent ........................................................N....... +206 0x1D60 0x3CADA 0x629 0x629 0 0.4027 0.2904 0 LANDMINE referent,landMine,item,xOff,yOff,mine,hType 24:F502->mine,24:FB02->item,24:FC02->item,24:FD02->landMine,69:0000->referent,69:F700->yOff,69:F900->xOff,69:FE00->hType ....U.......)................................................... +207 0x1D68 0x15048 0x106A 0x106A 0 0.4731 0.1992 0 BLASTPAC referent,target,item,counter,lastAnim,xOff,yOff,mine,therm,thermTop,radar,radarPart 24:EF02->mine,24:F402->radar,24:F402->radarPart,24:F602->radar,24:F802->therm,24:F802->thermTop,24:F902->item,24:FA02->therm,24:FB02->target,24:FE02->item,69:0000->referent,69:F100->yOff,69:F300->xOff,69:F500->lastAnim,69:F700->counter,69:FC00->counter ............j................................................... +208 0x1D70 0x3695E 0x800 0x800 0 0.4150 0.2642 0 FUSPAC referent,droppedPac,target,item,counter,lastAnim,xOff,yOff,mine,door 24:EC02->door,24:EE02->mine,24:F802->item,24:FA02->target,62:FE00->droppedPac,69:0000->referent,69:F000->yOff,69:F200->xOff,69:F400->lastAnim,69:F600->counter ....,...........Z.........,..................................... +209 0x1D98 0x38B4D 0x2D2 0x2D2 0 0.4114 0.3961 0 GOVGUNEW referent 69:0000->referent ........................................................N....... +210 0x1DC0 0x2BCD2 0x1E2 0x1E2 0 0.3112 0.5228 0 EBRIDGE referent 69:0000->referent ................................................................ +211 0x1DE0 0x5B4CA 0x15B 0x15B 0 0.1960 0.6686 0 SPANEL referent 69:0000->referent ............[................................................... +212 0x1DF0 0x6A21A 0x132 0x132 0 0.1667 0.7190 0 VARGAS referent 69:0000->referent ....^.......2................................................... +213 0x1E08 0x76E65 0x154 0x154 0 0.2382 0.6647 0 SL_NS-16 referent 69:0000->referent ............T................................................... +214 0x1E10 0x749D0 0x154 0x154 0 0.2324 0.6706 0 SL_NS-8 referent 69:0000->referent ............T................................................... +215 0x1E18 0x7487C 0x154 0x154 0 0.2324 0.6706 0 SL_NS-4 referent 69:0000->referent ............T................................................... +216 0x1E30 0x745D4 0x154 0x154 0 0.2324 0.6706 0 SL_EW-4 referent 69:0000->referent ............T................................................... +217 0x1E38 0x74728 0x154 0x154 0 0.2324 0.6706 0 SL_EW-8 referent 69:0000->referent ............T................................................... +218 0x1E40 0x76D11 0x154 0x154 0 0.2382 0.6647 0 SL_EW-16 referent 69:0000->referent ............T................................................... +219 0x1E68 0x419AB 0x245 0x245 0 0.3064 0.4802 0 MELF mva5b,referent,item 0D:0500->mva5b,24:FE02->item,69:0000->referent ....q.......E.............q..................................... +220 0x1E70 0x4CE26 0x3F7 0x3F7 0 0.3596 0.3852 0 ]0Q- mva11b,mva12b,referent,item 0D:0600->mva11b,0D:0600->mva12b,24:FE02->item,69:0000->referent ....#...........Q.........#..................................... +221 0x1E98 0x37CD7 0x132 0x132 0 0.1993 0.7222 0 GENERATR referent 69:0000->referent ....^.......2...........................................^....... +222 0x1F00 0x53246 0x401 0x401 0 0.3990 0.3346 0 RFANBADE referent,item,fart,fart2,fram,counter,counter2,wind 24:F602->wind,24:F802->item,24:FE02->item,69:0000->referent,69:FA00->counter,69:FA00->counter2,69:FA00->fart,69:FA00->fart2,69:FC00->counter,69:FC00->fart,69:FE00->fram ....-........................................................... +223 0x1F28 0x53647 0x402 0x402 0 0.3977 0.3353 0 RFANBADN referent,item,fart,fart2,fram,counter,counter2,wind 24:F602->wind,24:F802->item,24:FE02->item,69:0000->referent,69:FA00->counter,69:FA00->counter2,69:FA00->fart,69:FA00->fart2,69:FC00->counter,69:FC00->fart,69:FE00->fram ................................................................ +224 0x1FC8 0x73294 0x1D7 0x1D7 0 0.3079 0.5244 0 WVENTNS referent,fram,windsurf 24:FC02->windsurf,69:0000->referent,69:FE00->fram ..........................................................8..... +225 0x1FD0 0x730B0 0x1E4 0x1E4 0 0.3161 0.5145 0 WVENTEW referent,fram,windsurf 24:FC02->windsurf,69:0000->referent,69:FE00->fram ..........................................................8..... +226 0x1FF8 0x4F72C 0x41F 0x41F 0 0.4076 0.3251 0 REBEL_TV referent 69:0000->referent ....K...........y.........K..................................... +227 0x2050 0x58C88 0x130 0x130 0 0.1941 0.7303 0 SDOOR_N referent 69:0000->referent ....\.......0...........................................\....... +228 0x2088 0x58B58 0x130 0x130 0 0.1941 0.7303 0 SDOOR_E referent 69:0000->referent ....\.......0...........................................\....... +229 0x20A8 0x33B37 0x790 0x790 0 0.4256 0.2624 0 FLAMEBOX referent,event,flame,flame2,direction,count,newType 24:0A02->flame,24:FC02->flame,24:FC02->flame2,24:FE02->flame,69:0000->referent,69:0A00->event,69:0C00->direction,69:FA00->direction,69:FA00->newType,69:FE00->count ................................................................ +230 0x2128 0x2BEB4 0x1E2 0x1E2 0 0.3174 0.5145 0 EBRIDGE2 referent 69:0000->referent ................................................................ +231 0x2220 0x40C08 0x28F 0x28F 0 0.3313 0.4351 0 MCRATE ma0Q0,referent,item 00:0000->ma0Q0,24:F902->item,69:0000->referent ................................................................ +232 0x2228 0x1D292 0x1BF 0x1BF 0 0.2662 0.5570 0 COPY_EW referent,fram,coolfram 69:0000->referent,69:FC00->coolfram,69:FE00->fram,6F:6F6C->fram ................................................................ +233 0x2230 0x1D451 0x1BF 0x1BF 0 0.2662 0.5570 0 COPY_NS referent,fram,coolfram 69:0000->referent,69:FC00->coolfram,69:FE00->fram,6F:6F6C->fram ................................................................ +234 0x2238 0x7C2AD 0x1A2 0x1A2 0 0.2321 0.6124 0 referent,fram 69:0000->referent,69:FE00->fram ................................................................ +235 0x2268 0x33867 0x168 0x168 0 0.2472 0.6500 0 FLAME1 referent 69:0000->referent ............h...........................................].8..... +236 0x2278 0x517FA 0x6D2 0x6D2 0 0.4393 0.2743 0 REB_PAD referent,item,pad2,mapNum,eggNum,phold,gunHold,counter,counter2 24:FA02->gunHold,24:FA02->pad2,24:FC02->phold,24:FE02->item,69:0000->referent,69:0A00->mapNum,69:0C00->eggNum,69:F600->counter,69:F600->counter2,69:F800->counter ........................................................6....... +237 0x2280 0x4AA07 0x487 0x487 0 0.3986 0.3374 0 NOSTRIL referent,event,fire,count,fire2 24:0A02->fire,24:FC02->fire,24:FC02->fire2,24:FE02->fire,69:0000->referent,69:0A00->event,69:FA00->count,69:FE00->count ................................................................ +238 0x22A0 0x69C17 0x603 0x603 0 0.4386 0.2885 0 VARDESK referent,item,counter 24:FE02->item,69:0000->referent,69:FC00->counter,69:FE00->counter ..../........................................................... +239 0x22A8 0x14134 0x8E8 0x8E8 0 0.4377 0.2456 0 BLASER1 referent,laserList,item,inFastArea,count,link 24:F702->item,69:0000->referent,69:EB00->link,69:F300->count,69:F500->inFastArea,6C:F902->laserList ..................................................^.....^....... +240 0x22B0 0x4FF09 0x208 0x208 0 0.3135 0.5000 0 REB_BOOT referent,counter 69:0000->referent,69:FE00->counter ....4...........b............................................... +241 0x22C8 0x6934F 0x2A9 0x2A9 0 0.3583 0.4376 0 UPPLATE referent,item 24:FE02->item,69:0000->referent ................................................................ +242 0x22E8 0x3C73F 0x1EF 0x1EF 0 0.3111 0.5192 0 KEYPADNS referent,alreadyPassed 62:FF00->alreadyPassed,69:0000->referent ................I............................................... +243 0x22F0 0x3C550 0x1EF 0x1EF 0 0.3111 0.5192 0 KEYPADEW referent,alreadyPassed 62:FF00->alreadyPassed,69:0000->referent ................I............................................... +244 0x22F8 0x72C7B 0x435 0x435 0 0.4039 0.3333 0 WSHOCKNS referent,item,shocker,shockCount 24:F002->shocker,24:FE02->item,69:0000->referent,69:E400->shockCount ....a.......5...?.......................................p....... +245 0x2300 0x72846 0x435 0x435 0 0.4030 0.3333 0 WSHOCKEW referent,item,shocker,shockCount 24:F002->shocker,24:FE02->item,69:0000->referent,69:E400->shockCount ....a.......5...?.......................................p....... +246 0x2308 0x2E2D1 0x6B2 0x6B2 0 0.4387 0.2777 0 ELYDESK referent,counter,item 24:FC02->item,69:0000->referent,69:FE00->counter ..........................r..................................... +247 0x2320 0x5D873 0x8A8 0x8A8 0 0.4404 0.2649 0 SSWITCHN referent,sswitch,switch1,switch2,switch3,timer,sswitch2,switch21,switch22,switch23,counter 24:E902->switch2,24:E902->switch23,24:EB02->switch2,24:EB02->switch22,24:ED02->switch2,24:ED02->switch21,24:EF02->sswitch,24:EF02->sswitch2,24:F102->timer,24:F302->switch3,24:F502->switch2,24:F702->switch1,24:F902->sswitch,69:0000->referent,69:E700->counter,EF:0273->switch2 ................Z.........L..................................... +248 0x2348 0x5CFCB 0x8A8 0x8A8 0 0.4409 0.2649 0 SSWITCHE referent,sswitch,switch1,switch2,switch3,timer,sswitch2,switch21,switch22,switch23,counter 24:E902->switch2,24:E902->switch23,24:EB02->switch2,24:EB02->switch22,24:ED02->switch2,24:ED02->switch21,24:EF02->sswitch,24:EF02->sswitch2,24:F102->timer,24:F302->switch3,24:F502->switch2,24:F702->switch1,24:F902->sswitch,69:0000->referent,69:E700->counter,EF:0273->switch2 ................Z.........L..................................... +249 0x2358 0x59DF3 0x1FA 0x1FA 0 0.3221 0.4960 0 SHOCKNS1 referent 69:0000->referent ....&........................................................... +250 0x2360 0x59A3B 0x1FA 0x1FA 0 0.3221 0.4960 0 SHOCKEW1 referent 69:0000->referent ....&........................................................... +251 0x2368 0x864BF 0x4B6 0x4B6 0 0.4279 0.3085 0 WEA_BOOT referent,counter 69:0000->referent,69:FE00->counter ..........................*..................................... +252 0x2370 0x6A34C 0x5ED 0x5ED 0 0.4397 0.2788 0 VAR_BOOT referent,event,counter,item 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter ................................................................ +253 0x2378 0x7C7D7 0x13F 0x13F 0 0.1724 0.6928 0 COURIER referent 69:0000->referent ....k.......?................................................... +254 0x23C0 0x3F1F2 0x165 0x165 0 0.2381 0.6471 0 LWPLATE4 referent,item 24:FE02->item,69:0000->referent ............e................................................... +255 0x23C8 0x3F357 0x165 0x165 0 0.2381 0.6471 0 LWPLATE8 referent,item 24:FE02->item,69:0000->referent ............e................................................... +256 0x2448 0xFC90 0x3E4 0x3E4 0 0.3715 0.3655 0 ALARMBOX referent,item 24:FE02->item,69:0000->referent ................................................................ +257 0x2650 0x160B2 0x189 0x189 0 0.2239 0.6234 0 BLOOD referent 69:0000->referent ................................................................ +258 0x2658 0x29E08 0x257 0x257 0 0.3139 0.4608 0 D_CHEM referent,goods 24:FE02->goods,69:0000->referent ............W.............d. ................................... +259 0x2660 0x2A05F 0x257 0x257 0 0.3139 0.4608 0 D_CONG referent,goods 24:FE02->goods,69:0000->referent ............W.............d. ................................... +260 0x2668 0x2ACE1 0x257 0x257 0 0.3172 0.4574 0 D_MAINT referent,goods 24:FE02->goods,69:0000->referent ............W.............d. ................................... +261 0x2670 0x2AF38 0x257 0x257 0 0.3172 0.4574 0 D_OWORK referent,goods 24:FE02->goods,69:0000->referent ............W.............d. ................................... +262 0x2678 0x2B18F 0x257 0x257 0 0.3172 0.4574 0 D_SCIEN referent,goods 24:FE02->goods,69:0000->referent ............W.............d. ................................... +263 0x2680 0x2B63D 0x257 0x257 0 0.3172 0.4574 0 D_STORM referent,goods 24:FE02->goods,69:0000->referent ............W.............d. ................................... +264 0x2688 0x2B3E6 0x257 0x257 0 0.3139 0.4608 0 D_SOLD referent,goods 24:FE02->goods,69:0000->referent ............W.............d. ................................... +265 0x2690 0x2BB9A 0x138 0x138 0 0.1603 0.7212 0 D_VARG referent 69:0000->referent ....d.......8.............d..................................... +266 0x26A0 0x2A2B6 0x1CE 0x1CE 0 0.2684 0.5628 0 D_COUR referent,goods 24:FE02->goods,69:0000->referent ................(............................................... +267 0x26B0 0x2B894 0x1CE 0x1CE 0 0.2771 0.5541 0 D_SUSAN referent,goods 24:FE02->goods,69:0000->referent ................(............................................... +268 0x26B8 0x2BA62 0x138 0x138 0 0.1635 0.7179 0 D_THERM referent 69:0000->referent ....d.......8.............d..................................... +269 0x26C0 0x5F872 0xD6E 0xD6E 0 0.4508 0.2347 0 SURCAMNS referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun 24:0A02->eventTrigger,24:F102->therma,24:FA02->valueBox,24:FC02->cameraEgg,24:FC02->monit,24:FE02->screen,61:7373->code,62:F500->code,62:FD00->foundGun,69:0000->referent,69:F600->link,69:F800->passcode,69:FA00->trueRef,73:FE00->textFile ............n...(.........Q..................................... +270 0x26D0 0x12604 0x442 0x442 0 0.4367 0.3183 0 BASEGUN referent,item 24:F802->item,69:0000->referent ....n.......B...T.......................................N....... +271 0x26D8 0x643D9 0x552 0x552 0 0.4119 0.3267 0 TIMER referent,time,phase2 69:0000->referent,69:FA00->phase2,69:FC00->time ....x.......R................................................... +272 0x26E0 0x5B625 0x80E 0x80E 0 0.4719 0.2556 0 SPECIAL referent,phase,counter,time,phase1,phase2,mapNum,npcNum 69:0000->referent,69:0C00->phase,69:F800->phase,69:F800->phase2,69:FA00->phase,69:FA00->phase1,69:FC00->npcNum,69:FC00->time,69:FE00->counter,69:FE00->mapNum ................................................................ +273 0x26F8 0x68FF3 0x35C 0x35C 0 0.3977 0.3814 0 TRIGPAD referent,item,elev 24:FA02->elev,24:FC02->item,69:0000->referent ............\................................................... +274 0x2710 0x498D7 0x5A3 0x5A3 0 0.4948 0.2606 0 MONSTER referent,monster1,door,newNpc 24:F602->newNpc,24:F802->door,24:FE02->monster1,69:0000->referent ................U............................................... +275 0x2718 0x2E192 0x13F 0x13F 0 0.1661 0.6991 0 ELITE referent 69:0000->referent ....k.......?................................................... +276 0x2720 0x2A484 0x257 0x257 0 0.3205 0.4541 0 D_ESTORM referent,goods 24:FE02->goods,69:0000->referent ............W.............d. ................................... +277 0x2728 0x3BFAC 0xFE 0xFE 0 0.1142 0.8346 0 JELYHACK referent 69:0000->referent ....*...........X.........*..................................... +278 0x2730 0x1EB10 0x1488 0x1488 0 0.7150 0.1172 0 DATALINK mva1,mva3a,mva4,mva5a,mva6,mva7,mva8,mva9,mva10,mva11a,mva12a,mva13,mva14,mva15a,mva15c,referent,textFile 0D:0400->mva1,0D:0400->mva4,0D:0400->mva6,0D:0400->mva7,0D:0400->mva8,0D:0400->mva9,0D:0500->mva1,0D:0500->mva10,0D:0500->mva13,0D:0500->mva14,0D:0500->mva3a,0D:0500->mva5a,0D:0600->mva1,0D:0600->mva11a,0D:0600->mva12a,0D:0600->mva15a,0D:0600->mva15c,69:0000->referent,73:FE00->textFile ................................................................ +279 0x2738 0x5ACB7 0x294 0x294 0 0.3561 0.4348 0 SLIDEFLR referent 69:0000->referent ................F............................................... +280 0x2740 0x3BEAE 0xFE 0xFE 0 0.1063 0.8425 0 JELYH2 referent 69:0000->referent ....*...........X.........*..................................... +281 0x2758 0x39C81 0x162 0x162 0 0.2203 0.6412 0 HOFFMAN referent,hoffy,deathBox,deadGuy,item 24:F802->item,24:FA02->deadGuy,24:FC02->deathBox,24:FE02->hoffy,69:0000->referent ............b................................................... +282 0x2760 0x2ABA9 0x138 0x138 0 0.1667 0.7147 0 D_HOFFMA referent 69:0000->referent ....d.......8.............d..................................... +283 0x2768 0x52B90 0x6B6 0x6B6 0 0.4476 0.2637 0 REE_BOOT referent,event,counter,item 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter ................................................................ +284 0x2780 0x8575F 0xD60 0xD60 0 0.4541 0.2298 0 SURCAMEW referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun 24:0A02->eventTrigger,24:F602->therma,24:FA02->valueBox,24:FC02->cameraEgg,24:FC02->monit,24:FE02->screen,61:7373->code,62:F500->code,62:FD00->foundGun,69:0000->referent,69:F600->link,69:F800->passcode,69:FA00->trueRef,73:FE00->textFile ....z.......`................................................... +285 0x27A0 0x5926C 0x18C 0x18C 0 0.2222 0.6162 0 SFXTRIG referent,event 69:0000->referent,69:0A00->event ................................................................ +286 0x27A8 0x5A9B7 0x300 0x300 0 0.3919 0.3763 0 SKILLBOX referent,skill 69:0000->referent,69:FE00->skill ....,...........Z............................................... +287 0x27B0 0x2A92C 0x27D 0x27D 0 0.3344 0.4411 0 D_GURDSQ referent,goods 24:FE02->goods,69:0000->referent ............}.../........... ................................... +288 0x27C0 0x6A939 0x12A 0x12A 0 0.1510 0.7315 0 VETRON referent 69:0000->referent ....V.......*................................................... +289 0x27C8 0x1FF98 0x29F 0x29F 0 0.3621 0.4367 0 DEATHBOX referent,sswitch,counter 24:FE02->sswitch,69:0000->referent,69:F900->counter ................................................................ +290 0x27F0 0x5152D 0x2CD 0x2CD 0 0.3487 0.4073 0 REB_GAR referent,counter 69:0000->referent,69:FE00->counter ................................................................ +291 0x2808 0x1623B 0x51D 0x51D 0 0.4194 0.2911 0 BOUNCBOX referent,item,item2,ammo 24:F602->item,24:F602->item2,24:F802->item,69:0000->referent,69:F000->ammo ....I........................................................... +292 0x2810 0x3B6B7 0x253 0x253 0 0.3681 0.4672 0 HOVER1 referent 69:0000->referent ............S................................................... +293 0x2860 0x5E9D0 0x168 0x168 0 0.2444 0.6500 0 STEAM1 referent 69:0000->referent ............h...........................................].8..... +294 0x2870 0x31E41 0x414 0x414 0 0.4109 0.3879 0 FADE referent,loop,loop2 69:0000->referent,69:FC00->loop,69:FC00->loop2,69:FE00->loop ....:........................................................... +295 0x2888 0x4DAD9 0x1B3 0x1B3 0 0.2276 0.6115 0 PHIR referent 69:0000->referent ................................................................ +296 0x2890 0x5ECA0 0x7E3 0x7E3 0 0.4250 0.2620 0 STEAMBOX referent,event,steam,steam2,direction,count 24:0A02->steam,24:FC02->steam,24:FC02->steam2,24:FE02->steam,69:0000->referent,69:0A00->event,69:0C00->direction,69:FA00->direction,69:FE00->count ................................................................ +297 0x28E0 0x339CF 0x168 0x168 0 0.2472 0.6500 0 FLAME2 referent 69:0000->referent ............h...........................................].8..... +298 0x2918 0x5EB38 0x168 0x168 0 0.2444 0.6500 0 STEAM2 referent 69:0000->referent ............h...........................................].8..... +299 0x2940 0x7BB06 0x168 0x168 0 0.2556 0.6417 0 FLAMELP referent 69:0000->referent ............h...........................................].8..... +300 0x29B8 0x7BC6E 0x215 0x215 0 0.3002 0.5159 0 BBOX ma0Q0,referent 00:0000->ma0Q0,69:0000->referent ....A...........o.......................................A....... +301 0x29C0 0x7C098 0x215 0x215 0 0.3283 0.4878 0 GBOX_NS ma0Q0,referent 53:0000->ma0Q0,69:0000->referent ....A...........o.......................................A....... +302 0x29C8 0x7BE83 0x215 0x215 0 0.3283 0.4878 0 GBOX_EW ma0Q0,referent 57:0000->ma0Q0,69:0000->referent ....A...........o.......................................A....... +303 0x29D0 0x2C096 0x13F 0x13F 0 0.1755 0.6897 0 EGRENADE referent 69:0000->referent ....k.......?................................................... +304 0x29F8 0x58766 0x2D7 0x2D7 0 0.3480 0.4305 0 SCANNER referent 69:0000->referent ..........................w..................................... +305 0x2A00 0x3BDB0 0xFE 0xFE 0 0.1063 0.8465 0 IONIC referent 69:0000->referent ....*...........X.........*..................................... +306 0x2A08 0x4DE88 0xFE 0xFE 0 0.1102 0.8425 0 PLASMA referent 69:0000->referent ....*...........X.........*..................................... +307 0x2A10 0x390F1 0xFE 0xFE 0 0.1181 0.8346 0 GRAVITON referent 69:0000->referent ....*...........X.........*..................................... +308 0x2A98 0x384AB 0x351 0x351 0 0.3710 0.3534 0 GLDIV_EW ma0Q3,referent,item,shot,counter,door 24:F802->door,24:FC02->shot,24:FE02->item,45:5700->ma0Q3,69:0000->referent,69:FA00->counter ....}.......Q...........................................}....... +309 0x2AA0 0x387FC 0x351 0x351 0 0.3698 0.3534 0 GLDIV_NS ma0Q3,referent,item,shot,counter,door 24:F802->door,24:FC02->shot,24:FE02->item,4E:5300->ma0Q3,69:0000->referent,69:FA00->counter ....}.......Q...........................................}....... +310 0x2AB0 0x4FB4B 0x27C 0x27C 0 0.3412 0.4481 0 REBSNOR referent,counter 69:0000->referent,69:FE00->counter ............|................................................... +311 0x2AB8 0x4FDC7 0x142 0x142 0 0.1832 0.7019 0 REBWORK referent 69:0000->referent ....n.......B...............................n................... +312 0x2AD8 0x5817D 0x5E9 0x5E9 0 0.4270 0.3120 0 SATARG mva15b,referent,item,counter 0D:0600->mva15b,24:FE02->item,69:0000->referent,69:FC00->counter ................C............................................... +313 0x2AE0 0x1BCD6 0x1F2 0x1F2 0 0.3173 0.5120 0 CHEST_ON referent 69:0000->referent ..........................f..................................... +314 0x2AE8 0x1BAE4 0x1F2 0x1F2 0 0.3173 0.5120 0 CHEST_OE referent 69:0000->referent ..........................f..................................... +315 0x2AF8 0x7CCF5 0x257 0x257 0 0.3205 0.4541 0 D_GRENAD referent,goods 24:FE02->goods,69:0000->referent ............W.............d. ................................... +316 0x2B08 0x1B577 0x56D 0x56D 0 0.4269 0.2880 0 CHEST_NS ma0Q3,referent,fram,item,item2,counter 24:FC02->item,24:FC02->item2,24:FE02->item,4E:5300->ma0Q3,69:0000->referent,69:FA00->counter,69:FE00->fram ............m.............w.#..........................."....... +317 0x2B10 0x1B034 0x543 0x543 0 0.4276 0.2903 0 CHEST_EW ma0Q3,referent,fram,item,item2,counter 24:FC02->item,24:FC02->item2,24:FE02->item,45:5700->ma0Q3,69:0000->referent,69:FA00->counter,69:FE00->fram ....o.......C.............M.#..........................."....... +318 0x2B78 0x7C916 0x257 0x257 0 0.3205 0.4541 0 D_ENFORC referent,goods 24:FE02->goods,69:0000->referent ............W.............d. ................................... +319 0x2B88 0x20DF0 0x4C4 0x4C4 0 0.3738 0.3238 0 DETPAC referent,item,lastAnim,xOff,yOff,mine 24:F302->mine,24:FB02->item,69:0000->referent,69:F500->yOff,69:F700->xOff,69:F900->lastAnim ................................................................ +320 0x2B90 0x1E1A3 0x96D 0x96D 0 0.4186 0.2495 0 CRU_SPID referent,mine,target,item,counter,lastAnim,xOff,yOff,counter2,spider 24:EF02->spider,24:F102->item,24:F702->item,24:F902->target,24:FE02->mine,69:0000->referent,69:EF00->yOff,69:F100->xOff,69:F300->lastAnim,69:F500->counter,69:F800->counter,69:F800->counter2,69:FA00->yOff,69:FC00->xOff,69:FE00->counter ............m...w...........J.....................I............. +321 0x2B98 0x10074 0x25F 0x25F 0 0.3591 0.4267 0 ALARMHAT referent,item 24:FE02->item,69:0000->referent ............_................................................... +322 0x2BB0 0x2F308 0x196 0x196 0 0.2906 0.5788 0 ETWALLNS referent 69:0000->referent ................................................................ +323 0x2BB8 0x2F172 0x196 0x196 0 0.2906 0.5788 0 ETWALLEW referent 69:0000->referent ................................................................ +324 0x2BC0 0x64059 0x380 0x380 0 0.3772 0.3638 0 THRMBCKN referent,ewall,therma 24:FC02->therma,24:FE02->ewall,69:0000->referent ................................................................ +325 0x2BC8 0x63CD9 0x380 0x380 0 0.3772 0.3638 0 THRMBCKE referent,ewall,therma 24:FC02->therma,24:FE02->ewall,69:0000->referent ................................................................ +326 0x2BF0 0x55CBC 0xC64 0xC64 0 0.4404 0.2320 0 ROLL_EW referent,item,item2,riderList,time,total,counter,oldz,cargo,zCheck,zMax,ma0Q6 24:EB02->cargo,24:FC02->item,24:FC02->item2,24:FE02->item,57:0000->ma0Q6,62:E800->zMax,69:0000->referent,69:E900->zCheck,69:F200->oldz,69:F600->counter,69:F800->total,69:FE00->time,6C:FA02->riderList ............d...v.................................a.$.....;..... +327 0x2C40 0x3C92E 0x1AC 0x1AC 0 0.2570 0.5678 0 KORESH referent 69:0000->referent ................^............................................... +328 0x2C98 0x1051F 0x1F4 0x1F4 0 0.3260 0.5060 0 ALRMTRIG referent 69:0000->referent .... ...........N............................................... +329 0x2CA0 0x2E983 0x2DE 0x2DE 0 0.3297 0.4510 0 ENERGY referent,maxLimit,fule,item 24:FA02->item,69:0000->referent,69:FC00->fule,69:FE00->maxLimit ................8............................................... +330 0x2CC0 0x55058 0xC64 0xC64 0 0.4442 0.2245 0 ROLLB_NS referent,item,item2,riderList,time,total,counter,oldz,cargo,zCheck,zMax,ma0Q6 24:EB02->cargo,24:FC02->item,24:FC02->item2,24:FE02->item,4E:5300->ma0Q6,62:E800->zMax,69:0000->referent,69:E900->zCheck,69:F200->oldz,69:F600->counter,69:F800->total,69:FE00->time,6C:FA02->riderList ............d...v.................................a.$.....;..... +331 0x2CE8 0x543EC 0xC6C 0xC6C 0 0.4484 0.2192 0 ROLLB_EW referent,item,item2,riderList,time,total,counter,oldz,cargo,zCheck,zMax,ma0Q6 24:EB02->cargo,24:FC02->item,24:FC02->item2,24:FE02->item,45:5700->ma0Q6,62:E800->zMax,69:0000->referent,69:E900->zCheck,69:F200->oldz,69:F600->counter,69:F800->total,69:FE00->time,6C:FA02->riderList ............l...~.................................a.,.....C..... +332 0x2D08 0x76A01 0x188 0x188 0 0.2602 0.5893 0 D_PLASMA referent 69:0000->referent ................:............................................... +333 0x2D40 0x76B89 0x188 0x188 0 0.2602 0.5893 0 D_SKELET referent 69:0000->referent ................:............................................... +334 0x2D70 0x7CB6D 0x188 0x188 0 0.2602 0.5893 0 D_EM_GUY referent 69:0000->referent ................:............................................... +335 0x2D80 0x80661 0x159 0x159 0 0.2406 0.6551 0 DEATHFL4 referent 69:0000->referent ............Y...........................................N.8..... +336 0x2D88 0x7C44F 0x1C4 0x1C4 0 0.3031 0.5420 0 DAMNLUGG ma0Q0,referent 47:4700->ma0Q0,69:0000->referent ................................................................ +337 0x2D90 0x7C613 0x1C4 0x1C4 0 0.3031 0.5420 0 DAMNMCR8 ma0Q0,referent 52:3800->ma0Q0,69:0000->referent ................................................................ +338 0x2DA0 0x807BA 0x159 0x159 0 0.2406 0.6551 0 DEATHFL5 referent 69:0000->referent ............Y...........................................N.8..... +339 0x4098 0x10DC7 0x3A2 0x3A2 0 0.3516 0.3301 0 AVATAR referent,item,slot,counter 24:FE02->item,69:0000->referent,69:FA00->counter,69:FC00->slot ....................*.+...*.................Z.U................. +340 0x4890 0x64C2B 0x228 0x228 0 0.3062 0.4746 0 TRIGEGG referent,item 24:FE02->item,69:0000->referent ....T.......(................................................... +341 0x4898 0x4CBF3 0x233 0x233 0 0.3091 0.4689 0 ONCEEGG referent,item 24:FE02->item,69:0000->referent ...._.......3................................................... +342 0x48A0 0x342C7 0x578 0x578 0 0.4229 0.3050 0 FLOOR1 referent,counter,item,item2,highNumber,lowNumber,tempNumber,floorItems,wantToStop,foundFloor,onTime 24:FA02->item,24:FA02->item2,24:FC02->item,69:0000->referent,69:EC00->onTime,69:EE00->foundFloor,69:F000->wantToStop,69:F400->tempNumber,69:F600->lowNumber,69:F800->highNumber,69:FE00->counter,6C:F202->floorItems ............x...*............................................... +343 0x48A8 0x4A2AE 0x387 0x387 0 0.3920 0.3699 0 MTAREGG referent,item,hiValue,loValue 24:FE02->item,69:0000->referent,69:F800->loValue,69:FA00->hiValue ................9.............................................L. +344 0x48B0 0x1AC3A 0x1B5 0x1B5 0 0.2563 0.5492 0 CHANGER referent,roof,doorQuality,roofQuality,eggNum 24:FE02->roof,69:0000->referent,69:F800->eggNum,69:FA00->roof,69:FA00->roofQuality,69:FC00->doorQuality ................................................................ +345 0x48B8 0x18B0F 0x313 0x313 0 0.3291 0.3875 0 CAMERA referent 69:0000->referent ....?........................................................... +346 0x48C0 0x58DB8 0x186 0x186 0 0.2333 0.6026 0 SECRTEGG referent,item,door,range 24:FC02->door,24:FE02->item,69:0000->referent,69:F800->range ................................................................ +347 0x48C8 0x50477 0x10B6 0x10B6 0 0.4741 0.1889 0 REB_EGG referent,item,door,moreVideo,chest,phold,counter,counter2 24:F802->door,24:FC02->phold,24:FE02->chest,24:FE02->item,62:F700->moreVideo,69:0000->referent,69:F800->counter,69:F800->counter2,69:FA00->counter ............................................Q................... +348 0x48D0 0x6132D 0x222 0x222 0 0.2857 0.5440 0 TEST referent 69:0000->referent ....N......."...|.............................................N. +349 0x48D8 0x39353 0x233 0x233 0 0.3179 0.4547 0 GRENEGG referent,item,source,dest,counter 24:FA02->dest,24:FC02->source,24:FE02->item,69:0000->referent,69:F800->counter ...._.......3................................................._. +350 0x48E0 0x29A1A 0x27E 0x27E 0 0.3966 0.4310 0 DOOREGG referent,door 24:FE02->door,69:0000->referent ............~.................................................I. +351 0x48E8 0x12FE6 0x172 0x172 0 0.2324 0.6243 0 BBTRIP referent,item,bbetty 24:FC02->bbetty,24:FE02->item,69:0000->referent ............r................................................... +352 0x48F0 0x3D700 0x18F 0x18F 0 0.2607 0.5965 0 LAZEREGG referent,laser 24:FE02->laser,69:0000->referent ................................................................ +353 0x48F8 0x4331A 0x1483 0x1483 0 0.4927 0.1859 0 MISS1EGG referent,item,pad2,buster,slot,eTrigger,counter,rubberSuit,pathegg,guardBoy,door 24:F602->door,24:F802->guardBoy,24:FA02->buster,24:FA02->item,24:FC02->eTrigger,24:FC02->pad2,24:FC02->pathegg,24:FE02->buster,24:FE02->door,24:FE02->item,24:FE02->rubberSuit,69:0000->referent,69:0A00->buster,69:F800->counter,69:F800->slot,69:FA00->counter,69:FC00->counter ..............................................^................. +354 0x4900 0x4479D 0x22DC 0x22DC 0 0.4545 0.2038 0 MISS2 referent,counter,item,done0,done1,done2,activate,itemNum,position,turn,body,door,door1,door2,door3,hoffman,pathEgg,vargas 24:0602->item,24:E602->pathEgg,24:EC02->hoffman,24:F002->door,24:F002->door3,24:F202->door,24:F202->door2,24:F402->door,24:F402->door1,24:F602->door,24:F802->vargas,24:FA02->body,24:FA02->item,24:FC02->item,24:FE02->item,62:FC00->activate,62:FD00->done2,62:FE00->done1,62:FF00->done0,69:0000->referent,69:0600->counter,69:0600->position,69:F300->item,69:F300->itemNum,69:F300->turn,69:F500->item,69:F500->itemNum,69:F700->counter,69:FE00->counter .....!......."...'..........................3.................3. +355 0x4908 0x46A79 0x21F 0x21F 0 0.3094 0.5304 0 MISS3 referent 69:0000->referent ....K.......................................3................... +356 0x4910 0x46C98 0x2A2 0x2A2 0 0.3457 0.4733 0 MISS4 referent,item 24:FE02->item,69:0000->referent ..............................................9...............f. +357 0x4918 0x46F3A 0xA64 0xA64 0 0.4184 0.2643 0 MISS5 referent,counter,item,door,willmar,post1,post2,floor 24:F002->floor,24:F202->post2,24:F402->post1,24:F602->willmar,24:FA02->door,24:FC02->item,69:0000->referent,69:FE00->counter ............d...n...........................3.................l. +358 0x4920 0x4799E 0x7D5 0x7D5 0 0.4474 0.2918 0 MISS6 referent,snell,item,door,doorX 24:F802->door,24:FA02->item,24:FE02->snell,69:0000->referent,69:F600->door,69:F600->doorX ................7...........................3................... +359 0x4928 0x48173 0x13E 0x13E 0 0.1604 0.7170 0 MISS7 referent,item 24:FE02->item,69:0000->referent ....j.......>...............................j................... +360 0x4930 0x482B1 0x949 0x949 0 0.4279 0.2722 0 MISS8 referent,willmar,counter,item,cardReader,telebeam,telepad 24:F402->telepad,24:F602->telebeam,24:F802->cardReader,24:FA02->item,24:FE02->willmar,69:0000->referent,69:FC00->counter ....o.......I...S...........................3.................c. +361 0x4938 0x48BFA 0x5FD 0x5FD 0 0.4371 0.3125 0 MISS9 referent,target,station,screen,item,counter 24:F802->item,24:FA02->screen,24:FC02->station,24:FE02->target,69:0000->referent,69:F600->counter ....#.......................................3.................c. +362 0x4940 0x4235A 0x1B2 0x1B2 0 0.2811 0.5806 0 MISS10 referent,item 24:FE02->item,69:0000->referent ................d...........................3................... +363 0x4948 0x4250C 0x1D8 0x1D8 0 0.2881 0.5614 0 MISS11 referent 69:0000->referent ............................................3................... +364 0x4950 0x426E4 0x1FB 0x1FB 0 0.2919 0.5247 0 MISS12 referent,item 24:FE02->item,69:0000->referent ....'.......................................3................... +365 0x4958 0x428DF 0x690 0x690 0 0.4577 0.2810 0 MISS13 referent,counter,item,wench,npcWench,door 24:F402->door,24:F602->npcWench,24:F802->wench,24:FC02->item,69:0000->referent,69:FE00->counter ............................................3.................u. +366 0x4960 0x42F6F 0x3AB 0x3AB 0 0.3813 0.3813 0 MISS14 referent,counter,item 24:FE02->item,69:0000->referent,69:FE00->counter ................].............................Y...............X. +367 0x4968 0x86975 0x528 0x528 0 0.4258 0.3182 0 MISS15 referent,item,counter,door 24:FA02->door,24:FE02->item,69:0000->referent,69:FC00->counter ....T.......(................................................... +368 0x4970 0x4A909 0xFE 0xFE 0 0.1063 0.8465 0 MUSIC referent 69:0000->referent ....*...........X.............................................*. +369 0x4978 0x76FB9 0x1CD 0x1CD 0 0.2842 0.5336 0 STEAMEGG referent,sBox 24:FE02->sBox,69:0000->referent ................'............................................... +370 0x5090 0x114B6 0x575 0x575 0 0.4037 0.3193 0 BARREL ma0Q3,referent,barrel,item2,isYellowBarrel,isStandingBarrel,link 00:0000->ma0Q3,24:FC02->item2,24:FE02->barrel,62:FA00->isStandingBarrel,62:FB00->isYellowBarrel,69:0000->referent,69:F800->link ............u................................................... +371 0x5098 0x12A46 0x5A0 0x5A0 0 0.3812 0.3021 0 BBETTY referent,item,counter,counter2,total,item3 24:F302->item,24:F302->item3,24:FE02->item,69:0000->referent,69:F600->counter,69:F800->total,69:FA00->counter,69:FA00->counter2,69:FC00->counter ................................................................ +372 0x50A0 0x13ACB 0x669 0x669 0 0.3924 0.2864 0 BLASER referent,laserList,item,inFastArea,count,link 24:F702->item,69:0000->referent,69:ED00->link,69:F100->count,69:F500->inFastArea,6C:F902->laserList ............i................................................... +373 0x50A8 0x16CEC 0x1395 0x1395 0 0.4482 0.1753 0 BRIDGE referent,item,newtype,item2,start,bridgeitems,bridgemax,item3,cycletype,delay,retry 24:0602->item,24:E302->item,24:E302->item2,24:F002->item,24:F002->item3,24:F202->item,24:F202->item2,24:FC02->item,24:FC02->item2,24:FE02->item,64:6765->item,69:0000->referent,69:0800->newtype,69:0A00->start,69:EA00->retry,69:EC00->delay,69:EE00->cycletype,69:F800->bridgemax,69:FA00->bridgemax,6C:FA02->bridgeitems,6C:FC02->bridgeitems ................................................................ +374 0x50B0 0x1BFE3 0x43B 0x43B 0 0.4238 0.3398 0 CONVEYOR referent,counter,areThereItems,cargo_item 24:FB02->cargo_item,62:FD00->areThereItems,69:0000->referent,69:FE00->counter ....a.......;................................................... +375 0x50B8 0x20237 0x7AE 0x7AE 0 0.3896 0.2579 0 DEATHFL referent,item,item2,counter,spoogeType 24:FC02->item,24:FC02->item2,24:FE02->item,69:0000->referent,69:EC00->spoogeType,69:FA00->counter ................................................................ +376 0x50C0 0x212B4 0x2128 0x2128 0 0.4807 0.1714 0 DOOR referent,doorType,ewall,roof,count,doorParam,doorQuality,roofQuality,ma0QS,deathBox,item,item2,hitMe,damagePoints 00:0000->ma0QS,24:FA02->item,24:FA02->item2,24:FC02->ewall,24:FC02->item,24:FE02->deathBox,24:FE02->roof,69:0000->referent,69:F600->damagePoints,69:F600->roof,69:F600->roofQuality,69:F800->doorQuality,69:F800->hitMe,69:FA00->doorParam,69:FC00->count,69:FE00->doorType ....< ......(!...".............................................. +377 0x50C8 0x233DC 0x41EF 0x41EF 0 0.4478 0.1674 0 DOOR2 referent,doorList,counter,maxFrame,counter2,doorList2,door1,door2,item,nonLegalDoor1,nonLegalDoor2,bool,link,item2,item3,prisDoor,newFrame 24:F202->item,24:F402->door2,24:F402->item,24:F602->door1,24:F602->door2,24:F602->item,24:F602->item2,24:F802->door1,24:F802->item,24:F802->prisDoor,24:FA02->item,24:FA02->item3,24:FA02->prisDoor,24:FC02->item,24:FC02->item2,24:FE02->item,62:EF00->bool,62:F000->nonLegalDoor2,62:F100->nonLegalDoor1,69:0000->referent,69:E000->link,69:E200->link,69:ED00->maxFrame,69:F200->maxFrame,69:F400->maxFrame,69:F600->counter,69:F600->maxFrame,69:F800->counter,69:F800->counter2,69:F800->maxFrame,69:FA00->counter,69:FA00->counter2,69:FA00->link,69:FA00->maxFrame,69:FC00->counter,69:FC00->counter2,69:FC00->maxFrame,69:FC00->newFrame,69:FE00->counter,6C:FC02->doorList,6C:FC02->doorList2,6C:FE02->doorList )...%@.......A...P.............................................. +378 0x50D0 0x275CB 0x244F 0x244F 0 0.4454 0.1635 0 DOOR3 referent,doorList,doorList2,counter,door2,maxFrame,counter2,door1,item,nonLegalDoor1,nonLegalDoor2,bool 24:F202->item,24:F402->door2,24:F602->door1,24:F802->door2,62:EF00->bool,62:F000->nonLegalDoor2,62:F100->nonLegalDoor1,69:0000->referent,69:ED00->maxFrame,69:F600->maxFrame,69:F800->counter,69:F800->counter2,69:FA00->counter,69:FC00->maxFrame,69:FE00->counter,6C:FC02->doorList,6C:FC02->doorList2,6C:FE02->doorList,6C:FE02->doorList2 ....3#......O$..q(.............................................. +379 0x50D8 0x2C1D5 0xB95 0xB95 0 0.4216 0.2395 0 ELEVAT referent,cargoUp,existCargo,counter,height,maxLimit,maxLimitCount,counter2,total,minLimit,minLimitCount,cargoDown,total2,liftpit,pitCounter,totFrames,checkX,checkY 24:F502->cargoDown,24:FE02->cargoUp,24:FE02->liftpit,62:FA00->height,62:FB00->height,62:FC00->totFrames,62:FD00->existCargo,62:FD00->pitCounter,69:0000->referent,69:E800->total,69:E800->total2,69:F200->total,69:F400->counter,69:F400->counter2,69:F600->maxLimit,69:F600->maxLimitCount,69:F700->minLimit,69:F700->minLimitCount,69:F800->checkY,69:F800->maxLimit,69:F900->minLimit,69:FA00->checkX,69:FB00->counter,69:FC00->counter,69:FC00->counter2,69:FE00->counter ................................................................ +380 0x50E0 0x334C3 0xD4 0xD4 0 0.0000 0.9811 0 ................................................................ +381 0x50E8 0x33597 0x2D0 0x2D0 0 0.3542 0.4472 0 FLAME referent,item,detect 24:FE02->item,62:FD00->detect,69:0000->referent ................................................................ +382 0x50F0 0x34A5C 0x1F02 0x1F02 0 0.4248 0.2372 0 FREE flick,localFlick,item1,item2,avatarMap,npc1,npc2,ref1,ref2,dist,range,item,closestItem,closest,phold,addType,fram,time,oldTick,newTick,ptype,list,member,count,line,temp,lines,counter,alarm,notAlarmed,rndVoice,source,leftOvers 24:F602->npc2,24:F802->npc1,24:FA02->item,24:FC02->closest,24:FC02->closestItem,24:FC02->item,24:FC02->item2,24:FC02->phold,24:FE02->item,24:FE02->item1,24:FE02->phold,62:F500->notAlarmed,62:FD00->leftOvers,64:F800->newTick,64:FC00->oldTick,69:0600->range,69:0600->ref1,69:0600->source,69:0600->time,69:0800->addType,69:0800->ptype,69:0800->ref2,69:0A00->fram,69:F800->dist,69:FA00->avatarMap,69:FA00->closest,69:FA00->rndVoice,69:FC00->alarm,69:FC00->count,69:FE00->count,69:FE00->counter,69:FE00->dist,69:FE00->member,6C:0602->list,73:0600->flick,73:0800->line,73:FE00->line,73:FE00->localFlick,73:FE00->member,7A:0602->list,7A:0802->line,7A:0802->lines,7A:FE02->temp "...b............*.............................................. +383 0x50F8 0x39DE3 0x18D4 0x18D4 0 0.4246 0.1723 0 HOVER referent,total,counter,cargo,hover,xacc,yacc,zacc,xfract,yfract,zfract,firstEgg,targetEgg,time,oldqhi,link,item,check 24:E702->hover,24:E902->cargo,24:EB02->item,24:ED02->hover,24:FA02->hover,24:FC02->item,24:FE02->cargo,62:0C00->check,64:C400->zfract,64:C800->yfract,64:CC00->xfract,64:D000->zacc,64:D400->yacc,64:D800->xacc,69:0000->referent,69:F000->link,69:F200->firstEgg,69:F400->link,69:F600->oldqhi,69:F700->counter,69:F800->time,69:F900->total,69:FA00->targetEgg,69:FC00->firstEgg ................................................................ +384 0x5100 0x3C228 0x328 0x328 0 0.3985 0.4072 0 KEYPAD referent,valueBox,boxesInArea,linkedWithSwitch,wrongCode,userInput,boxPasscode,keycode 24:FE02->valueBox,62:FA00->wrongCode,62:FB00->linkedWithSwitch,69:0000->referent,69:F400->keycode,69:F600->boxPasscode,69:F800->userInput,69:FC00->boxesInArea ....N.......(................................................... +385 0x5108 0x3D3CF 0x331 0x331 0 0.3378 0.3721 0 LAZER referent,item,monster 24:FC02->monster,24:FE02->item,69:0000->referent ....W.......1................................................... +386 0x5110 0x3EA99 0x4D5 0x4D5 0 0.4155 0.3185 0 LITEWALL referent,wall,tempType,realType,counter,stepper,item,wallList,dist,aSet,aSet1,aSet2,aSet3 24:FA02->wall,24:FC02->item,24:FE02->stepper,24:FE02->wall,69:0000->referent,69:E900->aSet,69:E900->aSet3,69:EB00->aSet,69:EB00->aSet2,69:ED00->aSet,69:ED00->aSet1,69:EF00->aSet,69:F100->dist,69:F800->counter,69:FA00->realType,69:FC00->tempType,6C:F802->wall,6C:F802->wallList ................................................................ +387 0x5118 0x4AE8E 0x13E5 0x13E5 0 0.4212 0.2490 0 $2Q% referent,item,counter,padDir,toDir,stepNum,phrase,damageSource,aSet 24:FE02->item,69:0000->referent,69:0A00->damageSource,69:0A00->phrase,69:0C00->toDir,69:0E00->stepNum,69:F200->counter,69:FA00->padDir,69:FE00->aSet,69:FE00->counter ................g............................................... +388 0x5120 0x4C273 0xD4 0xD4 0 0.0000 0.9811 0 ................................................................ +389 0x5128 0x593F8 0x485 0x485 0 0.4201 0.3302 0 SHOCKER referent,randNum,duration,skill,kernelCheck,counter,monster 24:FE02->monster,69:0000->referent,69:F400->counter,69:F600->kernelCheck,69:F800->skill,69:FA00->duration,69:FE00->randNum ................7............................................... +390 0x5130 0x5BE33 0xA37 0xA37 0 0.4207 0.2474 0 SPIDER referent,spiderType,spider,target,dest,count,targetLoop,destX,destY,destZ,currentP,counter,minor,oabs,ovel,axis,ztarg,zcur 24:F705->dest,24:FB05->currentP,24:FC02->target,24:FE02->spider,24:FE02->target,62:0E00->dest,62:0E00->destZ,69:0000->referent,69:0A00->dest,69:0A00->destX,69:0A00->spider,69:0A00->spiderType,69:0C00->dest,69:0C00->destY,69:0E00->target,69:0E00->targetLoop,69:DC00->zcur,69:DE00->ztarg,69:E000->axis,69:E400->ovel,69:E800->oabs,69:EE00->minor,69:F000->count,69:F000->counter,69:F300->target,69:F300->targetLoop,69:F500->count ....Q.......7...A............................................... +391 0x5138 0x5E67C 0x354 0x354 0 0.3697 0.4038 0 STEAM referent,item,detect 24:FE02->item,62:FD00->detect,69:0000->referent ....t.......T................................................... +392 0x5140 0x605E0 0x457 0x457 0 0.3798 0.3645 0 SWITCH referent,counter,okay 62:FF00->okay,69:0000->referent,69:FE00->counter ....w.......W................................................... +393 0x5148 0x6154F 0x252C 0x252C 1 0.8459 0.0612 0 TEXTFILE referent,linkNum,msgNum,passcode,textFile,rnge 0A:005F->textFile,27:7320->passcode,65:7720->passcode,68:6520->passcode,69:0000->referent,69:0A00->linkNum,69:0C00->msgNum,69:0E00->passcode,69:FC00->rnge,73:FE00->textFile,74:7920->passcode ....@$......,%...&.............................................. +394 0x5150 0x64E53 0x41A0 0x41A0 0 0.4873 0.1230 0 TRIGGER referent,phase,lowPriorityTriggers,cmdphase,npcNum,mapNum,item,aitem,baseLink,newLink,searchtype,newphase,door,scmd,item2,distance,counter 24:EA02->item,24:EA02->item2,24:EC02->item,24:EC02->item2,24:F002->aitem,24:F202->aitem,24:F202->item,24:F402->aitem,24:F402->item,24:FE02->door,63:6D64->phase,69:0000->referent,69:0C00->phase,69:0E00->npcNum,69:1000->mapNum,69:1200->baseLink,69:1400->searchtype,69:E800->counter,69:EA00->newphase,69:EC00->distance,69:EC00->searchtype,69:EE00->counter,69:EE00->newLink,69:F000->baseLink,69:F000->newLink,69:F200->baseLink,69:F600->mapNum,69:F600->searchtype,69:F800->mapNum,69:F800->npcNum,69:FA00->npcNum,69:FC00->cmdphase,69:FE00->scmd,6C:FE02->lowPriorityTriggers,6E:6577->phase,F0:0261->item,F2:0261->item,F4:0261->item .....@.......A...F.............................................. +395 0x5158 0x695F8 0x178 0x178 0 0.2261 0.6383 0 VALBOX referent,lowByte,highByte,keypadCode 69:0000->referent,69:FA00->keypadCode,69:FC00->highByte,69:FE00->lowByte ............x................................................... +396 0x5160 0x6B481 0x6D03 0x6D03 0 0.5022 0.1464 0 WALLGUN referent,target,brain,delay,targItem,coordToCoordDir,left,right,targetNpc,dist,panRight,panLeft,isTurret,ammo,ma0Q,maxHit,turn,fire,gun2,broken 24:F302->target,24:F302->targetNpc,24:FC02->gun2,24:FE02->targItem,4E:0000->ma0Q,62:F500->isTurret,62:F600->isTurret,62:F600->panLeft,62:F700->panLeft,62:F700->panRight,69:0000->referent,69:0A00->target,69:0C00->brain,69:F300->delay,69:F400->ammo,69:F400->delay,69:F400->isTurret,69:F800->right,69:FA00->broken,69:FA00->dist,69:FA00->fire,69:FA00->left,69:FA00->right,69:FC00->coordToCoordDir,69:FC00->delay,69:FC00->dist,69:FC00->left,69:FC00->right,69:FC00->turn,69:FD00->dist,69:FE00->delay,69:FE00->left,69:FE00->maxHit ,...'k.......m..%|.............................................. +397 0x5168 0x7346B 0x48C 0x48C 0 0.3600 0.3247 0 $4Q2 referent,shotRef,item,damage 24:FE02->item,69:0000->referent,69:0C00->shotRef,69:FC00->damage ................................................................ +398 0x5170 0x74B24 0x1EDD 0x1EDD 0 0.4287 0.1429 0 NPCDEATH referent,link,deathBox,param,hits,keyCard,item,deadGuy,goods,counter,spillBlood,spillOil,spillCoolant,newDir,flipIt,newType,skill,sLevel,wimp,fullOfShit 24:0A02->item,24:ED02->goods,24:EF02->deadGuy,24:F102->item,24:F502->keyCard,24:FB02->deathBox,24:FE02->goods,24:FE02->item,62:DE00->flipIt,62:E800->spillCoolant,62:E900->spillOil,62:EA00->spillBlood,62:F600->fullOfShit,62:F700->wimp,69:0000->referent,69:0C00->link,69:DC00->newType,69:DF00->newDir,69:EB00->counter,69:F700->hits,69:F800->sLevel,69:F900->param,69:FA00->skill,69:FC00->counter ................................................................ +399 0x5178 0x77898 0x2567 0x2567 1 0.8651 0.0489 0 +<$Q7 referent,linkNum,msgNum,passcode,textFile 27:7320->passcode,68:6520->passcode,69:0000->referent,69:0A00->linkNum,69:0C00->msgNum,69:0E00->passcode,6C:6C20->passcode,73:FE00->textFile .....$......g%...%.............................................. +400 0x5180 0x7A04B 0x1ABB 0x1ABB 0 0.4421 0.1873 0 ITEM referent,destx,desty,truncate,targetRef,targetItem,item,newStatus,destX,destY,destZ,currentP,counter,minor,oabs,ovel,axis,ztarg,zcur,damageRef,maxHits,damagePoints,currentHits,newHits,boomType,selfDestruct,origin,bigBomb,onSomething,failTest,theType,ma0Q,onFloor,burn,burn2,egg1,monster1,monster2,link,newNpc,ref1,ref2,item1,item2 00:0000->ma0Q,24:F502->burn,24:F602->newNpc,24:FB05->currentP,24:FC02->burn,24:FC02->burn2,24:FC02->item,24:FC02->item2,24:FC02->monster2,24:FC02->origin,24:FE02->burn,24:FE02->item,24:FE02->item1,24:FE02->monster1,24:FE02->targetItem,62:0C00->selfDestruct,62:0E00->destZ,62:0E00->truncate,62:F600->failTest,62:F700->onSomething,62:FB00->bigBomb,62:FD00->onFloor,69:0000->referent,69:0A00->boomType,69:0A00->damageRef,69:0A00->destX,69:0A00->destx,69:0A00->egg1,69:0A00->newStatus,69:0A00->ref1,69:0A00->targetRef,69:0C00->destY,69:0C00->desty,69:0C00->ref2,69:0E00->maxHits,69:DC00->zcur,69:DE00->ztarg,69:E000->axis,69:E100->zcur,69:E300->ztarg,69:E400->ovel,69:E500->axis,69:E800->oabs,69:E900->ovel,69:ED00->oabs,69:EE00->minor,69:F000->counter,69:F300->minor,69:F400->theType,69:F500->counter,69:FA00->link,69:FA00->newHits,69:FC00->currentHits,69:FE00->damagePoints ................................................................ +401 0x5188 0x7CF4C 0x26A8 0x26A8 1 0.8269 0.0614 0 +|$4Q( referent,linkNum,msgNum,passcode,textFile 27:7320->passcode,65:7420->passcode,65:7720->passcode,68:6520->passcode,69:0000->referent,69:0A00->linkNum,69:0C00->msgNum,69:0E00->passcode,6E:6720->passcode,73:6520->passcode,73:FE00->textFile .....%.......&...'.............................................. +402 0x5190 0x80913 0x4E4C 0x4E4C 0 0.5313 0.1394 0 FLICTEST hideoutx,mva01,mva03a,mva03b,mva04,mva05a,mva05b,mva06,mva07,mva08,mva09,mva10,mva11a,mva11b,mva12a,mva12b,mva13,mva14,mva15a,mva15b,mva15c,test,referent,keycode 0D:0400->test,0D:0500->mva01,0D:0500->mva04,0D:0500->mva06,0D:0500->mva07,0D:0500->mva08,0D:0500->mva09,0D:0500->mva10,0D:0500->mva13,0D:0500->mva14,0D:0600->mva03a,0D:0600->mva03b,0D:0600->mva05a,0D:0600->mva05b,0D:0600->mva11a,0D:0600->mva11b,0D:0600->mva12a,0D:0600->mva12b,0D:0600->mva15a,0D:0600->mva15b,0D:0600->mva15c,0D:0800->hideoutx,69:0000->referent,69:FE00->keycode ....lM......LN...N.............................................. diff --git a/USECODE/EUSECODE_extracted/environmental_event_graph.md b/USECODE/EUSECODE_extracted/environmental_event_graph.md new file mode 100644 index 0000000..915960f --- /dev/null +++ b/USECODE/EUSECODE_extracted/environmental_event_graph.md @@ -0,0 +1,71 @@ +# Environmental Event Graph + +## Nodes + +| Index | Label | Role | Fields | Event Evidence | +|---:|---|---|---|---| +| 224 | WVENTNS | referent-neighbor | referent,fram,windsurf | - | +| 225 | WVENTEW | referent-neighbor | referent,fram,windsurf | - | +| 226 | REBEL_TV | referent-neighbor | referent | - | +| 227 | SDOOR_N | referent-neighbor | referent | - | +| 228 | SDOOR_E | referent-neighbor | referent | - | +| 229 | FLAMEBOX | event-bearing | referent,event,flame,flame2,direction,count,newType | field:event,tag:69:0A00->event | +| 230 | EBRIDGE2 | referent-neighbor | referent | - | +| 231 | MCRATE | referent-neighbor | ma0Q0,referent,item | - | +| 232 | COPY_EW | referent-neighbor | referent,fram,coolfram | - | +| 233 | COPY_NS | referent-neighbor | referent,fram,coolfram | - | +| 234 | | referent-neighbor | referent,fram | - | +| 235 | FLAME1 | referent-neighbor | referent | - | +| 236 | REB_PAD | referent-neighbor | referent,item,pad2,mapNum,eggNum,phold,gunHold,counter,counter2 | - | +| 237 | NOSTRIL | event-bearing | referent,event,fire,count,fire2 | field:event,tag:69:0A00->event | +| 238 | VARDESK | referent-neighbor | referent,item,counter | - | +| 239 | BLASER1 | referent-neighbor | referent,laserList,item,inFastArea,count,link | - | +| 240 | REB_BOOT | referent-neighbor | referent,counter | - | +| 241 | UPPLATE | referent-neighbor | referent,item | - | +| 242 | KEYPADNS | referent-neighbor | referent,alreadyPassed | - | +| 291 | BOUNCBOX | referent-neighbor | referent,item,item2,ammo | - | +| 292 | HOVER1 | referent-neighbor | referent | - | +| 293 | STEAM1 | referent-neighbor | referent | - | +| 294 | FADE | referent-neighbor | referent,loop,loop2 | - | +| 295 | PHIR | referent-neighbor | referent | - | +| 296 | STEAMBOX | event-bearing | referent,event,steam,steam2,direction,count | field:event,tag:69:0A00->event | +| 297 | FLAME2 | referent-neighbor | referent | - | +| 298 | STEAM2 | referent-neighbor | referent | - | +| 299 | FLAMELP | referent-neighbor | referent | - | +| 300 | BBOX | referent-neighbor | ma0Q0,referent | - | +| 301 | GBOX_NS | referent-neighbor | ma0Q0,referent | - | + +## Edges + +| Source | Relation | Target | Evidence | +|---|---|---|---| +| FLAMEBOX (229) | table-neighbor(-5) | WVENTNS (224) | same local extraction neighborhood | +| FLAMEBOX (229) | table-neighbor(-4) | WVENTEW (225) | same local extraction neighborhood | +| FLAMEBOX (229) | table-neighbor(-3) | REBEL_TV (226) | same local extraction neighborhood | +| FLAMEBOX (229) | table-neighbor(-2) | SDOOR_N (227) | same local extraction neighborhood | +| FLAMEBOX (229) | table-neighbor(-1) | SDOOR_E (228) | same local extraction neighborhood | +| FLAMEBOX (229) | table-neighbor(+1) | EBRIDGE2 (230) | same local extraction neighborhood | +| FLAMEBOX (229) | table-neighbor(+2) | MCRATE (231) | same local extraction neighborhood | +| FLAMEBOX (229) | table-neighbor(+3) | COPY_EW (232) | same local extraction neighborhood | +| FLAMEBOX (229) | table-neighbor(+4) | COPY_NS (233) | same local extraction neighborhood | +| FLAMEBOX (229) | table-neighbor(+5) | (234) | same local extraction neighborhood | +| NOSTRIL (237) | table-neighbor(-5) | COPY_EW (232) | same local extraction neighborhood | +| NOSTRIL (237) | table-neighbor(-4) | COPY_NS (233) | same local extraction neighborhood | +| NOSTRIL (237) | table-neighbor(-3) | (234) | same local extraction neighborhood | +| NOSTRIL (237) | table-neighbor(-2) | FLAME1 (235) | same local extraction neighborhood | +| NOSTRIL (237) | table-neighbor(-1) | REB_PAD (236) | same local extraction neighborhood | +| NOSTRIL (237) | table-neighbor(+1) | VARDESK (238) | same local extraction neighborhood | +| NOSTRIL (237) | table-neighbor(+2) | BLASER1 (239) | same local extraction neighborhood | +| NOSTRIL (237) | table-neighbor(+3) | REB_BOOT (240) | same local extraction neighborhood | +| NOSTRIL (237) | table-neighbor(+4) | UPPLATE (241) | same local extraction neighborhood | +| NOSTRIL (237) | table-neighbor(+5) | KEYPADNS (242) | same local extraction neighborhood | +| STEAMBOX (296) | table-neighbor(-5) | BOUNCBOX (291) | same local extraction neighborhood | +| STEAMBOX (296) | table-neighbor(-4) | HOVER1 (292) | same local extraction neighborhood | +| STEAMBOX (296) | table-neighbor(-3) | STEAM1 (293) | same local extraction neighborhood | +| STEAMBOX (296) | table-neighbor(-2) | FADE (294) | same local extraction neighborhood | +| STEAMBOX (296) | table-neighbor(-1) | PHIR (295) | same local extraction neighborhood | +| STEAMBOX (296) | table-neighbor(+1) | FLAME2 (297) | same local extraction neighborhood | +| STEAMBOX (296) | table-neighbor(+2) | STEAM2 (298) | same local extraction neighborhood | +| STEAMBOX (296) | table-neighbor(+3) | FLAMELP (299) | same local extraction neighborhood | +| STEAMBOX (296) | table-neighbor(+4) | BBOX (300) | same local extraction neighborhood | +| STEAMBOX (296) | table-neighbor(+5) | GBOX_NS (301) | same local extraction neighborhood | diff --git a/USECODE/EUSECODE_extracted/environmental_family_compare.tsv b/USECODE/EUSECODE_extracted/environmental_family_compare.tsv new file mode 100644 index 0000000..63e3232 --- /dev/null +++ b/USECODE/EUSECODE_extracted/environmental_family_compare.tsv @@ -0,0 +1,16 @@ +entry_index label role data_offset declared_size header_u16 header_u32 printable_markers field_tags +229 FLAMEBOX event-bearing 0x33B37 0x790 0x0002,0x0000,0x06B0,0x0000,0x00E0,0x0000,0x0790,0x0000,0x089A,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 0x00000002,0x000006B0,0x000000E0,0x00000790,0x0000089A,0x00000000,0x00000000,0x00000000 wx? + +|^$Q|? + +|$Q2|$Qe|$Q1 24:0A02->flame,24:FC02->flame,24:FC02->flame2,24:FE02->flame,69:0000->referent,69:0A00->event,69:0C00->direction,69:FA00->direction,69:FA00->newType,69:FE00->count +237 NOSTRIL event-bearing 0x4AA07 0x487 0x0002,0x0000,0x03A7,0x0000,0x00E0,0x0000,0x0487,0x0000,0x0591,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 0x00000002,0x000003A7,0x000000E0,0x00000487,0x00000591,0x00000000,0x00000000,0x00000000 wx? + +|$Q:|t$t=t@[|? + +|$Q9 24:0A02->fire,24:FC02->fire,24:FC02->fire2,24:FE02->fire,69:0000->referent,69:0A00->event,69:FA00->count,69:FE00->count +296 STEAMBOX event-bearing 0x5ECA0 0x7E3 0x0002,0x0000,0x0703,0x0000,0x00E0,0x0000,0x07E3,0x0000,0x08ED,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 0x00000002,0x00000703,0x000000E0,0x000007E3,0x000008ED,0x00000000,0x00000000,0x00000000 wx? + +|^$Q|? + +|$Q.|t$t=t@[:|$Qe|$Q)|$Q1 24:0A02->steam,24:FC02->steam,24:FC02->steam2,24:FE02->steam,69:0000->referent,69:0A00->event,69:0C00->direction,69:FA00->direction,69:FE00->count diff --git a/USECODE/EUSECODE_extracted/event_descriptor_compare.tsv b/USECODE/EUSECODE_extracted/event_descriptor_compare.tsv new file mode 100644 index 0000000..6ea0e04 --- /dev/null +++ b/USECODE/EUSECODE_extracted/event_descriptor_compare.tsv @@ -0,0 +1,24 @@ +entry_index label role data_offset declared_size header_u16 header_u32 printable_markers field_tags +186 ROLL_NS referent-neighbor 0x56920 0xC64 0x0002,0x0000,0x0B84,0x0000,0x00E0,0x0000,0x0C64,0x0000,0x0E76,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 0x00000002,0x00000B84,0x000000E0,0x00000C64,0x00000E76,0x00000000,0x00000000,0x00000000 wx[|Y? +@|wx[$|? + +|$Q*|$Q5|$Qt|$QM 24:EB02->cargo,24:FC02->item,24:FC02->item2,24:FE02->item,53:0000->ma0Q6,62:E800->zMax,69:0000->referent,69:E900->zCheck,69:F200->oldz,69:F600->counter,69:F800->total,69:FE00->time,6C:FA02->riderList +189 COR_BOOT event-bearing 0x1D610 0x56A 0x0000,0x0000,0x0496,0x0000,0x00D4,0x0000,0x056A,0x0000,0x0674,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 0x00000000,0x00000496,0x000000D4,0x0000056A,0x00000674,0x00000000,0x00000000,0x00000000 wx[|^ + +$Q|$Q0|$Q1|t$t=t@[P|^$Q|t$t=t@[\ 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter +190 EVENT event-bearing 0x2F49E 0x20AA 0x0000,0x0000,0x1FD6,0x0000,0x00D4,0x0000,0x20AA,0x0000,0x2104,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 0x00000000,0x00001FD6,0x000000D4,0x000020AA,0x00002104,0x00000000,0x00000000,0x00000000 wx[4|? + +|$Q*|$Q<|$Q[|$Q.|? + + $Q|? + + +$Q= 0D:0500->mva3b,24:D102->flicMan,24:D702->floor,24:D902->post2,24:DB02->post1,24:F802->door,24:FA02->dest,24:FC02->source,24:FE02->item,69:0000->referent,69:0A00->event,69:E100->time,69:EB00->link,69:EF00->counter,69:EF00->counter2,69:F100->counter +191 NPCTRIG event-bearing 0x4C347 0x3A8 0x0001,0x0000,0x02CE,0x0000,0x00DA,0x0000,0x03A8,0x0000,0x045A,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 0x00000001,0x000002CE,0x000000DA,0x000003A8,0x0000045A,0x00000000,0x00000000,0x00000000 wx[ |? + +|$Q'|wt$t=t@[S|? +K 24:FA02->item,24:FA02->item2,24:FC02->item,24:FC02->item2,24:FE02->item,69:0000->referent,69:0A00->event,69:0A00->typeNpc +193 CRUZTRIG referent-neighbor 0x1DE58 0x34B 0x0000,0x0000,0x0277,0x0000,0x00D4,0x0000,0x034B,0x0000,0x03A5,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 0x00000000,0x00000277,0x000000D4,0x0000034B,0x000003A5,0x00000000,0x00000000,0x00000000 wx[|t$t=t@[3 24:FC02->elev,24:FE02->item,69:0000->referent +194 NPC_ONLY referent-neighbor 0x4C6EF 0x2EB 0x0000,0x0000,0x0217,0x0000,0x00D4,0x0000,0x02EB,0x0000,0x0345,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 0x00000000,0x00000217,0x000000D4,0x000002EB,0x00000345,0x00000000,0x00000000,0x00000000 wx[|,? +|^$Qh 24:FE02->item,69:0000->referent,69:FA00->link +195 VMAIL referent-neighbor 0x6AA63 0x47A 0x0000,0x0000,0x03A6,0x0000,0x00D4,0x0000,0x047A,0x0000,0x04D4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 0x00000000,0x000003A6,0x000000D4,0x0000047A,0x000004D4,0x00000000,0x00000000,0x00000000 wx[|$Q0|$Q1 69:0000->referent,73:FE00->textFile diff --git a/USECODE/EUSECODE_extracted/event_family_index.tsv b/USECODE/EUSECODE_extracted/event_family_index.tsv new file mode 100644 index 0000000..4d8e67e --- /dev/null +++ b/USECODE/EUSECODE_extracted/event_family_index.tsv @@ -0,0 +1,14 @@ +entry_index label family tag_kind role field_count field_names field_tags data_offset declared_size local_event_neighbors +171 AND_BOOT boot-event-core event event-bearing 4 referent,event,counter,item 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter 0x1082E 0x599 1 +172 BRO_BOOT boot-event-core event event-bearing 4 referent,event,counter,item 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter 0x18237 0x630 1 +189 COR_BOOT boot-event-core event event-bearing 4 referent,event,counter,item 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter 0x1D610 0x56A 2 +190 EVENT event-hub event event-bearing 15 mva3b,referent,event,item,source,dest,door,counter,counter2,link,time,post1,post2,floor,flicMan 0D:0500->mva3b,24:D102->flicMan,24:D702->floor,24:D902->post2,24:DB02->post1,24:F802->door,24:FA02->dest,24:FC02->source,24:FE02->item,69:0000->referent,69:0A00->event,69:E100->time,69:EB00->link,69:EF00->counter,69:EF00->counter2,69:F100->counter 0x2F49E 0x20AA 2 +191 NPCTRIG npc-trigger event event-bearing 5 referent,event,item,item2,typeNpc 24:FA02->item,24:FA02->item2,24:FC02->item,24:FC02->item2,24:FE02->item,69:0000->referent,69:0A00->event,69:0A00->typeNpc 0x4C347 0x3A8 2 +229 FLAMEBOX environmental-event event event-bearing 7 referent,event,flame,flame2,direction,count,newType 24:0A02->flame,24:FC02->flame,24:FC02->flame2,24:FE02->flame,69:0000->referent,69:0A00->event,69:0C00->direction,69:FA00->direction,69:FA00->newType,69:FE00->count 0x33B37 0x790 0 +237 NOSTRIL environmental-event event event-bearing 5 referent,event,fire,count,fire2 24:0A02->fire,24:FC02->fire,24:FC02->fire2,24:FE02->fire,69:0000->referent,69:0A00->event,69:FA00->count,69:FE00->count 0x4AA07 0x487 0 +252 VAR_BOOT boot-event-core event event-bearing 4 referent,event,counter,item 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter 0x6A34C 0x5ED 0 +269 SURCAMNS callback-eventtrigger eventTrigger event-bearing 13 referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun 24:0A02->eventTrigger,24:F102->therma,24:FA02->valueBox,24:FC02->cameraEgg,24:FC02->monit,24:FE02->screen,61:7373->code,62:F500->code,62:FD00->foundGun,69:0000->referent,69:F600->link,69:F800->passcode,69:FA00->trueRef,73:FE00->textFile 0x5F872 0xD6E 0 +283 REE_BOOT boot-event-core event event-bearing 4 referent,event,counter,item 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter 0x52B90 0x6B6 2 +284 SURCAMEW callback-eventtrigger eventTrigger event-bearing 13 referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun 24:0A02->eventTrigger,24:F602->therma,24:FA02->valueBox,24:FC02->cameraEgg,24:FC02->monit,24:FE02->screen,61:7373->code,62:F500->code,62:FD00->foundGun,69:0000->referent,69:F600->link,69:F800->passcode,69:FA00->trueRef,73:FE00->textFile 0x8575F 0xD60 2 +285 SFXTRIG minimal-event-core event event-bearing 2 referent,event 69:0000->referent,69:0A00->event 0x5926C 0x18C 2 +296 STEAMBOX environmental-event event event-bearing 6 referent,event,steam,steam2,direction,count 24:0A02->steam,24:FC02->steam,24:FC02->steam2,24:FE02->steam,69:0000->referent,69:0A00->event,69:0C00->direction,69:FA00->direction,69:FE00->count 0x5ECA0 0x7E3 0 diff --git a/USECODE/EUSECODE_extracted/event_family_summary.md b/USECODE/EUSECODE_extracted/event_family_summary.md new file mode 100644 index 0000000..f2864d2 --- /dev/null +++ b/USECODE/EUSECODE_extracted/event_family_summary.md @@ -0,0 +1,44 @@ +# Event Family Summary + +## event-hub + +| Index | Label | Tag Kind | Fields | Size | Local Event Neighbors | +|---:|---|---|---|---:|---:| +| 190 | EVENT | event | mva3b,referent,event,item,source,dest,door,counter,counter2,link,time,post1,post2,floor,flicMan | 0x20AA | 2 | + +## boot-event-core + +| Index | Label | Tag Kind | Fields | Size | Local Event Neighbors | +|---:|---|---|---|---:|---:| +| 171 | AND_BOOT | event | referent,event,counter,item | 0x599 | 1 | +| 172 | BRO_BOOT | event | referent,event,counter,item | 0x630 | 1 | +| 189 | COR_BOOT | event | referent,event,counter,item | 0x56A | 2 | +| 252 | VAR_BOOT | event | referent,event,counter,item | 0x5ED | 0 | +| 283 | REE_BOOT | event | referent,event,counter,item | 0x6B6 | 2 | + +## npc-trigger + +| Index | Label | Tag Kind | Fields | Size | Local Event Neighbors | +|---:|---|---|---|---:|---:| +| 191 | NPCTRIG | event | referent,event,item,item2,typeNpc | 0x3A8 | 2 | + +## minimal-event-core + +| Index | Label | Tag Kind | Fields | Size | Local Event Neighbors | +|---:|---|---|---|---:|---:| +| 285 | SFXTRIG | event | referent,event | 0x18C | 2 | + +## environmental-event + +| Index | Label | Tag Kind | Fields | Size | Local Event Neighbors | +|---:|---|---|---|---:|---:| +| 229 | FLAMEBOX | event | referent,event,flame,flame2,direction,count,newType | 0x790 | 0 | +| 237 | NOSTRIL | event | referent,event,fire,count,fire2 | 0x487 | 0 | +| 296 | STEAMBOX | event | referent,event,steam,steam2,direction,count | 0x7E3 | 0 | + +## callback-eventtrigger + +| Index | Label | Tag Kind | Fields | Size | Local Event Neighbors | +|---:|---|---|---|---:|---:| +| 269 | SURCAMNS | eventTrigger | referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun | 0xD6E | 0 | +| 284 | SURCAMEW | eventTrigger | referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun | 0xD60 | 2 | diff --git a/USECODE/EUSECODE_extracted/event_island_graph.md b/USECODE/EUSECODE_extracted/event_island_graph.md new file mode 100644 index 0000000..63ee242 --- /dev/null +++ b/USECODE/EUSECODE_extracted/event_island_graph.md @@ -0,0 +1,99 @@ +# EVENT Cluster Graph + +## Nodes + +| Index | Label | Role | Fields | Event Evidence | +|---:|---|---|---|---| +| 181 | THERMATR | referent-neighbor | referent | - | +| 182 | D_GUARD | referent-neighbor | referent,goods | - | +| 183 | OBSERVER | referent-neighbor | referent | - | +| 184 | GRENADE | referent-neighbor | referent | - | +| 185 | SCIENTIS | referent-neighbor | referent | - | +| 186 | ROLL_NS | referent-neighbor | referent,item,item2,riderList,time,total,counter,oldz,cargo,zCheck,zMax,ma0Q6 | - | +| 187 | REB_COUP | referent-neighbor | referent,counter | - | +| 188 | MEDIKIT | referent-neighbor | referent,item | - | +| 189 | COR_BOOT | event-bearing | referent,event,counter,item | field:event,tag:69:0A00->event | +| 190 | EVENT | event-bearing | mva3b,referent,event,item,source,dest,door,counter,counter2,link,time,post1,post2,floor,flicMan | field:event,tag:69:0A00->event | +| 191 | NPCTRIG | event-bearing | referent,event,item,item2,typeNpc | field:event,tag:69:0A00->event | +| 192 | + + + +K | referent-neighbor | referent,item | - | +| 193 | CRUZTRIG | referent-neighbor | referent,item,elev | - | +| 194 | NPC_ONLY | referent-neighbor | referent,item,link | - | +| 195 | VMAIL | referent-neighbor | referent,textFile | - | +| 196 | STORMTRO | referent-neighbor | referent | - | +| 197 | WALGUNEW | referent-neighbor | referent | - | +| 198 | STATICEW | referent-neighbor | referent | - | + +## Edges + +| Source | Relation | Target | Evidence | +|---|---|---|---| +| ROLL_NS (186) | table-neighbor(-5) | THERMATR (181) | same local extraction neighborhood | +| ROLL_NS (186) | table-neighbor(-4) | D_GUARD (182) | same local extraction neighborhood | +| ROLL_NS (186) | table-neighbor(-3) | OBSERVER (183) | same local extraction neighborhood | +| ROLL_NS (186) | table-neighbor(-2) | GRENADE (184) | same local extraction neighborhood | +| ROLL_NS (186) | table-neighbor(-1) | SCIENTIS (185) | same local extraction neighborhood | +| ROLL_NS (186) | table-neighbor(+1) | REB_COUP (187) | same local extraction neighborhood | +| ROLL_NS (186) | table-neighbor(+2) | MEDIKIT (188) | same local extraction neighborhood | +| ROLL_NS (186) | possible-event-attachment(+3) | COR_BOOT (189) | field:event,tag:69:0A00->event | +| ROLL_NS (186) | possible-event-attachment(+4) | EVENT (190) | field:event,tag:69:0A00->event | +| ROLL_NS (186) | possible-event-attachment(+5) | NPCTRIG (191) | field:event,tag:69:0A00->event | +| COR_BOOT (189) | table-neighbor(-5) | GRENADE (184) | same local extraction neighborhood | +| COR_BOOT (189) | table-neighbor(-4) | SCIENTIS (185) | same local extraction neighborhood | +| COR_BOOT (189) | table-neighbor(-3) | ROLL_NS (186) | same local extraction neighborhood | +| COR_BOOT (189) | table-neighbor(-2) | REB_COUP (187) | same local extraction neighborhood | +| COR_BOOT (189) | table-neighbor(-1) | MEDIKIT (188) | same local extraction neighborhood | +| COR_BOOT (189) | possible-event-attachment(+1) | EVENT (190) | field:event,tag:69:0A00->event | +| COR_BOOT (189) | possible-event-attachment(+2) | NPCTRIG (191) | field:event,tag:69:0A00->event | +| COR_BOOT (189) | table-neighbor(+3) | + + + +K (192) | same local extraction neighborhood | +| COR_BOOT (189) | table-neighbor(+4) | CRUZTRIG (193) | same local extraction neighborhood | +| COR_BOOT (189) | table-neighbor(+5) | NPC_ONLY (194) | same local extraction neighborhood | +| EVENT (190) | table-neighbor(-5) | SCIENTIS (185) | same local extraction neighborhood | +| EVENT (190) | table-neighbor(-4) | ROLL_NS (186) | same local extraction neighborhood | +| EVENT (190) | table-neighbor(-3) | REB_COUP (187) | same local extraction neighborhood | +| EVENT (190) | table-neighbor(-2) | MEDIKIT (188) | same local extraction neighborhood | +| EVENT (190) | possible-event-attachment(-1) | COR_BOOT (189) | field:event,tag:69:0A00->event | +| EVENT (190) | possible-event-attachment(+1) | NPCTRIG (191) | field:event,tag:69:0A00->event | +| EVENT (190) | table-neighbor(+2) | + + + +K (192) | same local extraction neighborhood | +| EVENT (190) | table-neighbor(+3) | CRUZTRIG (193) | same local extraction neighborhood | +| EVENT (190) | table-neighbor(+4) | NPC_ONLY (194) | same local extraction neighborhood | +| EVENT (190) | table-neighbor(+5) | VMAIL (195) | same local extraction neighborhood | +| NPCTRIG (191) | table-neighbor(-5) | ROLL_NS (186) | same local extraction neighborhood | +| NPCTRIG (191) | table-neighbor(-4) | REB_COUP (187) | same local extraction neighborhood | +| NPCTRIG (191) | table-neighbor(-3) | MEDIKIT (188) | same local extraction neighborhood | +| NPCTRIG (191) | possible-event-attachment(-2) | COR_BOOT (189) | field:event,tag:69:0A00->event | +| NPCTRIG (191) | possible-event-attachment(-1) | EVENT (190) | field:event,tag:69:0A00->event | +| NPCTRIG (191) | table-neighbor(+1) | + + + +K (192) | same local extraction neighborhood | +| NPCTRIG (191) | table-neighbor(+2) | CRUZTRIG (193) | same local extraction neighborhood | +| NPCTRIG (191) | table-neighbor(+3) | NPC_ONLY (194) | same local extraction neighborhood | +| NPCTRIG (191) | table-neighbor(+4) | VMAIL (195) | same local extraction neighborhood | +| NPCTRIG (191) | table-neighbor(+5) | STORMTRO (196) | same local extraction neighborhood | +| CRUZTRIG (193) | table-neighbor(-5) | MEDIKIT (188) | same local extraction neighborhood | +| CRUZTRIG (193) | possible-event-attachment(-4) | COR_BOOT (189) | field:event,tag:69:0A00->event | +| CRUZTRIG (193) | possible-event-attachment(-3) | EVENT (190) | field:event,tag:69:0A00->event | +| CRUZTRIG (193) | possible-event-attachment(-2) | NPCTRIG (191) | field:event,tag:69:0A00->event | +| CRUZTRIG (193) | table-neighbor(-1) | + + + +K (192) | same local extraction neighborhood | +| CRUZTRIG (193) | table-neighbor(+1) | NPC_ONLY (194) | same local extraction neighborhood | +| CRUZTRIG (193) | table-neighbor(+2) | VMAIL (195) | same local extraction neighborhood | +| CRUZTRIG (193) | table-neighbor(+3) | STORMTRO (196) | same local extraction neighborhood | +| CRUZTRIG (193) | table-neighbor(+4) | WALGUNEW (197) | same local extraction neighborhood | +| CRUZTRIG (193) | table-neighbor(+5) | STATICEW (198) | same local extraction neighborhood | diff --git a/USECODE/EUSECODE_extracted/jelyhack_descriptor_compare.tsv b/USECODE/EUSECODE_extracted/jelyhack_descriptor_compare.tsv new file mode 100644 index 0000000..fb7b676 --- /dev/null +++ b/USECODE/EUSECODE_extracted/jelyhack_descriptor_compare.tsv @@ -0,0 +1,11 @@ +entry_index label role data_offset declared_size header_u16 header_u32 printable_markers field_tags +277 JELYHACK referent-anchor 0x3BFAC 0xFE 0x0000,0x0000,0x002A,0x0000,0x00D4,0x0000,0x00FE,0x0000,0x0158,0x0000,0x0000,0x0000,0x0000,0x002A,0x0001,0x0000 0x00000000,0x0000002A,0x000000D4,0x000000FE,0x00000158,0x00000000,0x002A0000,0x00000001 wx[ 69:0000->referent +280 JELYH2 referent-anchor 0x3BEAE 0xFE 0x0000,0x0000,0x002A,0x0000,0x00D4,0x0000,0x00FE,0x0000,0x0158,0x0000,0x0000,0x0000,0x0000,0x002A,0x0001,0x0000 0x00000000,0x0000002A,0x000000D4,0x000000FE,0x00000158,0x00000000,0x002A0000,0x00000001 wx[ 69:0000->referent +283 REE_BOOT event-bearing 0x52B90 0x6B6 0x0000,0x0000,0x05E2,0x0000,0x00D4,0x0000,0x06B6,0x0000,0x07C0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 0x00000000,0x000005E2,0x000000D4,0x000006B6,0x000007C0,0x00000000,0x00000000,0x00000000 wx[|$Q0| + $Q0|$Q1| + $Q1|t$t=t@[j|^$Q|t$t=t@[v 24:FE02->item,69:0000->referent,69:0A00->event,69:FC00->counter,69:FE00->counter +284 SURCAMEW event-bearing 0x8575F 0xD60 0x0003,0x0000,0x0C7A,0x0000,0x00E6,0x0000,0x0D60,0x0000,0x0F1A,0x0000,0x0000,0x0000,0x0000,0x00F7,0x00D2,0x0000 0x00000003,0x00000C7A,0x000000E6,0x00000D60,0x00000F1A,0x00000000,0x00F70000,0x000000D2 wx[|? + +|$Q?|wx[%|$Q^|t$t=t@[O|t$t=t@[h|t$t=t@[ 24:0A02->eventTrigger,24:F602->therma,24:FA02->valueBox,24:FC02->cameraEgg,24:FC02->monit,24:FE02->screen,61:7373->code,62:F500->code,62:FD00->foundGun,69:0000->referent,69:F600->link,69:F800->passcode,69:FA00->trueRef,73:FE00->textFile +285 SFXTRIG event-bearing 0x5926C 0x18C 0x0000,0x0000,0x00B8,0x0000,0x00D4,0x0000,0x018C,0x0000,0x01E6,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 0x00000000,0x000000B8,0x000000D4,0x0000018C,0x000001E6,0x00000000,0x00000000,0x00000000 wx[|? +@ 69:0000->referent,69:0A00->event diff --git a/USECODE/EUSECODE_extracted/jelyhack_island_graph.md b/USECODE/EUSECODE_extracted/jelyhack_island_graph.md new file mode 100644 index 0000000..d80836f --- /dev/null +++ b/USECODE/EUSECODE_extracted/jelyhack_island_graph.md @@ -0,0 +1,45 @@ +# JELYHACK Island Graph + +## Nodes + +| Index | Label | Role | Fields | Event Evidence | +|---:|---|---|---|---| +| 272 | SPECIAL | referent-neighbor | referent,phase,counter,time,phase1,phase2,mapNum,npcNum | - | +| 273 | TRIGPAD | referent-neighbor | referent,item,elev | - | +| 274 | MONSTER | referent-neighbor | referent,monster1,door,newNpc | - | +| 275 | ELITE | referent-neighbor | referent | - | +| 276 | D_ESTORM | referent-neighbor | referent,goods | - | +| 277 | JELYHACK | referent-anchor | referent | - | +| 278 | DATALINK | referent-neighbor | mva1,mva3a,mva4,mva5a,mva6,mva7,mva8,mva9,mva10,mva11a,mva12a,mva13,mva14,mva15a,mva15c,referent,textFile | - | +| 279 | SLIDEFLR | referent-neighbor | referent | - | +| 280 | JELYH2 | referent-anchor | referent | - | +| 281 | HOFFMAN | referent-neighbor | referent,hoffy,deathBox,deadGuy,item | - | +| 282 | D_HOFFMA | referent-neighbor | referent | - | +| 283 | REE_BOOT | event-bearing | referent,event,counter,item | field:event,tag:69:0A00->event | +| 284 | SURCAMEW | event-bearing | referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun | field:eventTrigger,tag:24:0A02->eventTrigger | +| 285 | SFXTRIG | event-bearing | referent,event | field:event,tag:69:0A00->event | + +## Edges + +| Source | Relation | Target | Evidence | +|---|---|---|---| +| JELYHACK (277) | table-neighbor(-5) | SPECIAL (272) | same local extraction neighborhood | +| JELYHACK (277) | table-neighbor(-4) | TRIGPAD (273) | same local extraction neighborhood | +| JELYHACK (277) | table-neighbor(-3) | MONSTER (274) | same local extraction neighborhood | +| JELYHACK (277) | table-neighbor(-2) | ELITE (275) | same local extraction neighborhood | +| JELYHACK (277) | table-neighbor(-1) | D_ESTORM (276) | same local extraction neighborhood | +| JELYHACK (277) | table-neighbor(+1) | DATALINK (278) | same local extraction neighborhood | +| JELYHACK (277) | table-neighbor(+2) | SLIDEFLR (279) | same local extraction neighborhood | +| JELYHACK (277) | table-neighbor(+3) | JELYH2 (280) | same local extraction neighborhood | +| JELYHACK (277) | table-neighbor(+4) | HOFFMAN (281) | same local extraction neighborhood | +| JELYHACK (277) | table-neighbor(+5) | D_HOFFMA (282) | same local extraction neighborhood | +| JELYH2 (280) | table-neighbor(-5) | ELITE (275) | same local extraction neighborhood | +| JELYH2 (280) | table-neighbor(-4) | D_ESTORM (276) | same local extraction neighborhood | +| JELYH2 (280) | table-neighbor(-3) | JELYHACK (277) | same local extraction neighborhood | +| JELYH2 (280) | table-neighbor(-2) | DATALINK (278) | same local extraction neighborhood | +| JELYH2 (280) | table-neighbor(-1) | SLIDEFLR (279) | same local extraction neighborhood | +| JELYH2 (280) | table-neighbor(+1) | HOFFMAN (281) | same local extraction neighborhood | +| JELYH2 (280) | table-neighbor(+2) | D_HOFFMA (282) | same local extraction neighborhood | +| JELYH2 (280) | possible-event-attachment(+3) | REE_BOOT (283) | field:event,tag:69:0A00->event | +| JELYH2 (280) | possible-event-attachment(+4) | SURCAMEW (284) | field:eventTrigger,tag:24:0A02->eventTrigger | +| JELYH2 (280) | possible-event-attachment(+5) | SFXTRIG (285) | field:event,tag:69:0A00->event | diff --git a/USECODE/EUSECODE_extracted/referent_anchor_event_graph.tsv b/USECODE/EUSECODE_extracted/referent_anchor_event_graph.tsv new file mode 100644 index 0000000..e5fcd79 --- /dev/null +++ b/USECODE/EUSECODE_extracted/referent_anchor_event_graph.tsv @@ -0,0 +1,141 @@ +anchor_index anchor_label anchor_fields neighbor_index distance neighbor_label neighbor_fields neighbor_role event_evidence +166 OFFWORK referent 171 +5 AND_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +167 GUARD referent 171 +4 AND_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +167 GUARD referent 172 +5 BRO_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +168 GDOOR_N referent 171 +3 AND_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +168 GDOOR_N referent 172 +4 BRO_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +169 GDOOR_E referent 171 +2 AND_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +169 GDOOR_E referent 172 +3 BRO_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +170 BIGCAN referent,fram 171 +1 AND_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +170 BIGCAN referent,fram 172 +2 BRO_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +171 AND_BOOT referent,event,counter,item 172 +1 BRO_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +172 BRO_BOOT referent,event,counter,item 171 -1 AND_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +173 CRUMORPH referent,lastAct 171 -2 AND_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +173 CRUMORPH referent,lastAct 172 -1 BRO_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +174 GUARDSQ referent 171 -3 AND_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +174 GUARDSQ referent 172 -2 BRO_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +175 CARD_NS referent 171 -4 AND_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +175 CARD_NS referent 172 -3 BRO_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +176 CARD_EW referent 171 -5 AND_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +176 CARD_EW referent 172 -4 BRO_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +177 EWALLEW referent 172 -5 BRO_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +184 GRENADE referent 189 +5 COR_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +185 SCIENTIS referent 189 +4 COR_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +185 SCIENTIS referent 190 +5 EVENT mva3b,referent,event,item,source,dest,door,counter,counter2,link,time,post1,post2,floor,flicMan event-bearing field:event,tag:69:0A00->event +186 ROLL_NS referent,item,item2,riderList,time,total,counter,oldz,cargo,zCheck,zMax,ma0Q6 189 +3 COR_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +186 ROLL_NS referent,item,item2,riderList,time,total,counter,oldz,cargo,zCheck,zMax,ma0Q6 190 +4 EVENT mva3b,referent,event,item,source,dest,door,counter,counter2,link,time,post1,post2,floor,flicMan event-bearing field:event,tag:69:0A00->event +186 ROLL_NS referent,item,item2,riderList,time,total,counter,oldz,cargo,zCheck,zMax,ma0Q6 191 +5 NPCTRIG referent,event,item,item2,typeNpc event-bearing field:event,tag:69:0A00->event +187 REB_COUP referent,counter 189 +2 COR_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +187 REB_COUP referent,counter 190 +3 EVENT mva3b,referent,event,item,source,dest,door,counter,counter2,link,time,post1,post2,floor,flicMan event-bearing field:event,tag:69:0A00->event +187 REB_COUP referent,counter 191 +4 NPCTRIG referent,event,item,item2,typeNpc event-bearing field:event,tag:69:0A00->event +188 MEDIKIT referent,item 189 +1 COR_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +188 MEDIKIT referent,item 190 +2 EVENT mva3b,referent,event,item,source,dest,door,counter,counter2,link,time,post1,post2,floor,flicMan event-bearing field:event,tag:69:0A00->event +188 MEDIKIT referent,item 191 +3 NPCTRIG referent,event,item,item2,typeNpc event-bearing field:event,tag:69:0A00->event +189 COR_BOOT referent,event,counter,item 190 +1 EVENT mva3b,referent,event,item,source,dest,door,counter,counter2,link,time,post1,post2,floor,flicMan event-bearing field:event,tag:69:0A00->event +189 COR_BOOT referent,event,counter,item 191 +2 NPCTRIG referent,event,item,item2,typeNpc event-bearing field:event,tag:69:0A00->event +190 EVENT mva3b,referent,event,item,source,dest,door,counter,counter2,link,time,post1,post2,floor,flicMan 189 -1 COR_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +190 EVENT mva3b,referent,event,item,source,dest,door,counter,counter2,link,time,post1,post2,floor,flicMan 191 +1 NPCTRIG referent,event,item,item2,typeNpc event-bearing field:event,tag:69:0A00->event +191 NPCTRIG referent,event,item,item2,typeNpc 189 -2 COR_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +191 NPCTRIG referent,event,item,item2,typeNpc 190 -1 EVENT mva3b,referent,event,item,source,dest,door,counter,counter2,link,time,post1,post2,floor,flicMan event-bearing field:event,tag:69:0A00->event +192 + + + +K referent,item 189 -3 COR_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +192 + + + +K referent,item 190 -2 EVENT mva3b,referent,event,item,source,dest,door,counter,counter2,link,time,post1,post2,floor,flicMan event-bearing field:event,tag:69:0A00->event +192 + + + +K referent,item 191 -1 NPCTRIG referent,event,item,item2,typeNpc event-bearing field:event,tag:69:0A00->event +193 CRUZTRIG referent,item,elev 189 -4 COR_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +193 CRUZTRIG referent,item,elev 190 -3 EVENT mva3b,referent,event,item,source,dest,door,counter,counter2,link,time,post1,post2,floor,flicMan event-bearing field:event,tag:69:0A00->event +193 CRUZTRIG referent,item,elev 191 -2 NPCTRIG referent,event,item,item2,typeNpc event-bearing field:event,tag:69:0A00->event +194 NPC_ONLY referent,item,link 189 -5 COR_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +194 NPC_ONLY referent,item,link 190 -4 EVENT mva3b,referent,event,item,source,dest,door,counter,counter2,link,time,post1,post2,floor,flicMan event-bearing field:event,tag:69:0A00->event +194 NPC_ONLY referent,item,link 191 -3 NPCTRIG referent,event,item,item2,typeNpc event-bearing field:event,tag:69:0A00->event +195 VMAIL referent,textFile 190 -5 EVENT mva3b,referent,event,item,source,dest,door,counter,counter2,link,time,post1,post2,floor,flicMan event-bearing field:event,tag:69:0A00->event +195 VMAIL referent,textFile 191 -4 NPCTRIG referent,event,item,item2,typeNpc event-bearing field:event,tag:69:0A00->event +196 STORMTRO referent 191 -5 NPCTRIG referent,event,item,item2,typeNpc event-bearing field:event,tag:69:0A00->event +224 WVENTNS referent,fram,windsurf 229 +5 FLAMEBOX referent,event,flame,flame2,direction,count,newType event-bearing field:event,tag:69:0A00->event +225 WVENTEW referent,fram,windsurf 229 +4 FLAMEBOX referent,event,flame,flame2,direction,count,newType event-bearing field:event,tag:69:0A00->event +226 REBEL_TV referent 229 +3 FLAMEBOX referent,event,flame,flame2,direction,count,newType event-bearing field:event,tag:69:0A00->event +227 SDOOR_N referent 229 +2 FLAMEBOX referent,event,flame,flame2,direction,count,newType event-bearing field:event,tag:69:0A00->event +228 SDOOR_E referent 229 +1 FLAMEBOX referent,event,flame,flame2,direction,count,newType event-bearing field:event,tag:69:0A00->event +230 EBRIDGE2 referent 229 -1 FLAMEBOX referent,event,flame,flame2,direction,count,newType event-bearing field:event,tag:69:0A00->event +231 MCRATE ma0Q0,referent,item 229 -2 FLAMEBOX referent,event,flame,flame2,direction,count,newType event-bearing field:event,tag:69:0A00->event +232 COPY_EW referent,fram,coolfram 229 -3 FLAMEBOX referent,event,flame,flame2,direction,count,newType event-bearing field:event,tag:69:0A00->event +232 COPY_EW referent,fram,coolfram 237 +5 NOSTRIL referent,event,fire,count,fire2 event-bearing field:event,tag:69:0A00->event +233 COPY_NS referent,fram,coolfram 229 -4 FLAMEBOX referent,event,flame,flame2,direction,count,newType event-bearing field:event,tag:69:0A00->event +233 COPY_NS referent,fram,coolfram 237 +4 NOSTRIL referent,event,fire,count,fire2 event-bearing field:event,tag:69:0A00->event +235 FLAME1 referent 237 +2 NOSTRIL referent,event,fire,count,fire2 event-bearing field:event,tag:69:0A00->event +236 REB_PAD referent,item,pad2,mapNum,eggNum,phold,gunHold,counter,counter2 237 +1 NOSTRIL referent,event,fire,count,fire2 event-bearing field:event,tag:69:0A00->event +238 VARDESK referent,item,counter 237 -1 NOSTRIL referent,event,fire,count,fire2 event-bearing field:event,tag:69:0A00->event +239 BLASER1 referent,laserList,item,inFastArea,count,link 237 -2 NOSTRIL referent,event,fire,count,fire2 event-bearing field:event,tag:69:0A00->event +240 REB_BOOT referent,counter 237 -3 NOSTRIL referent,event,fire,count,fire2 event-bearing field:event,tag:69:0A00->event +241 UPPLATE referent,item 237 -4 NOSTRIL referent,event,fire,count,fire2 event-bearing field:event,tag:69:0A00->event +242 KEYPADNS referent,alreadyPassed 237 -5 NOSTRIL referent,event,fire,count,fire2 event-bearing field:event,tag:69:0A00->event +247 SSWITCHN referent,sswitch,switch1,switch2,switch3,timer,sswitch2,switch21,switch22,switch23,counter 252 +5 VAR_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +248 SSWITCHE referent,sswitch,switch1,switch2,switch3,timer,sswitch2,switch21,switch22,switch23,counter 252 +4 VAR_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +249 SHOCKNS1 referent 252 +3 VAR_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +250 SHOCKEW1 referent 252 +2 VAR_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +251 WEA_BOOT referent,counter 252 +1 VAR_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +253 COURIER referent 252 -1 VAR_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +254 LWPLATE4 referent,item 252 -2 VAR_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +255 LWPLATE8 referent,item 252 -3 VAR_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +256 ALARMBOX referent,item 252 -4 VAR_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +257 BLOOD referent 252 -5 VAR_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +264 D_SOLD referent,goods 269 +5 SURCAMNS referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun event-bearing field:eventTrigger,tag:24:0A02->eventTrigger +265 D_VARG referent 269 +4 SURCAMNS referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun event-bearing field:eventTrigger,tag:24:0A02->eventTrigger +266 D_COUR referent,goods 269 +3 SURCAMNS referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun event-bearing field:eventTrigger,tag:24:0A02->eventTrigger +267 D_SUSAN referent,goods 269 +2 SURCAMNS referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun event-bearing field:eventTrigger,tag:24:0A02->eventTrigger +268 D_THERM referent 269 +1 SURCAMNS referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun event-bearing field:eventTrigger,tag:24:0A02->eventTrigger +270 BASEGUN referent,item 269 -1 SURCAMNS referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun event-bearing field:eventTrigger,tag:24:0A02->eventTrigger +271 TIMER referent,time,phase2 269 -2 SURCAMNS referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun event-bearing field:eventTrigger,tag:24:0A02->eventTrigger +272 SPECIAL referent,phase,counter,time,phase1,phase2,mapNum,npcNum 269 -3 SURCAMNS referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun event-bearing field:eventTrigger,tag:24:0A02->eventTrigger +273 TRIGPAD referent,item,elev 269 -4 SURCAMNS referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun event-bearing field:eventTrigger,tag:24:0A02->eventTrigger +274 MONSTER referent,monster1,door,newNpc 269 -5 SURCAMNS referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun event-bearing field:eventTrigger,tag:24:0A02->eventTrigger +278 DATALINK mva1,mva3a,mva4,mva5a,mva6,mva7,mva8,mva9,mva10,mva11a,mva12a,mva13,mva14,mva15a,mva15c,referent,textFile 283 +5 REE_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +279 SLIDEFLR referent 283 +4 REE_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +279 SLIDEFLR referent 284 +5 SURCAMEW referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun event-bearing field:eventTrigger,tag:24:0A02->eventTrigger +280 JELYH2 referent 283 +3 REE_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +280 JELYH2 referent 284 +4 SURCAMEW referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun event-bearing field:eventTrigger,tag:24:0A02->eventTrigger +280 JELYH2 referent 285 +5 SFXTRIG referent,event event-bearing field:event,tag:69:0A00->event +281 HOFFMAN referent,hoffy,deathBox,deadGuy,item 283 +2 REE_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +281 HOFFMAN referent,hoffy,deathBox,deadGuy,item 284 +3 SURCAMEW referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun event-bearing field:eventTrigger,tag:24:0A02->eventTrigger +281 HOFFMAN referent,hoffy,deathBox,deadGuy,item 285 +4 SFXTRIG referent,event event-bearing field:event,tag:69:0A00->event +282 D_HOFFMA referent 283 +1 REE_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +282 D_HOFFMA referent 284 +2 SURCAMEW referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun event-bearing field:eventTrigger,tag:24:0A02->eventTrigger +282 D_HOFFMA referent 285 +3 SFXTRIG referent,event event-bearing field:event,tag:69:0A00->event +283 REE_BOOT referent,event,counter,item 284 +1 SURCAMEW referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun event-bearing field:eventTrigger,tag:24:0A02->eventTrigger +283 REE_BOOT referent,event,counter,item 285 +2 SFXTRIG referent,event event-bearing field:event,tag:69:0A00->event +284 SURCAMEW referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun 283 -1 REE_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +284 SURCAMEW referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun 285 +1 SFXTRIG referent,event event-bearing field:event,tag:69:0A00->event +285 SFXTRIG referent,event 283 -2 REE_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +285 SFXTRIG referent,event 284 -1 SURCAMEW referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun event-bearing field:eventTrigger,tag:24:0A02->eventTrigger +286 SKILLBOX referent,skill 283 -3 REE_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +286 SKILLBOX referent,skill 284 -2 SURCAMEW referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun event-bearing field:eventTrigger,tag:24:0A02->eventTrigger +286 SKILLBOX referent,skill 285 -1 SFXTRIG referent,event event-bearing field:event,tag:69:0A00->event +287 D_GURDSQ referent,goods 283 -4 REE_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +287 D_GURDSQ referent,goods 284 -3 SURCAMEW referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun event-bearing field:eventTrigger,tag:24:0A02->eventTrigger +287 D_GURDSQ referent,goods 285 -2 SFXTRIG referent,event event-bearing field:event,tag:69:0A00->event +288 VETRON referent 283 -5 REE_BOOT referent,event,counter,item event-bearing field:event,tag:69:0A00->event +288 VETRON referent 284 -4 SURCAMEW referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun event-bearing field:eventTrigger,tag:24:0A02->eventTrigger +288 VETRON referent 285 -3 SFXTRIG referent,event event-bearing field:event,tag:69:0A00->event +289 DEATHBOX referent,sswitch,counter 284 -5 SURCAMEW referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun event-bearing field:eventTrigger,tag:24:0A02->eventTrigger +289 DEATHBOX referent,sswitch,counter 285 -4 SFXTRIG referent,event event-bearing field:event,tag:69:0A00->event +290 REB_GAR referent,counter 285 -5 SFXTRIG referent,event event-bearing field:event,tag:69:0A00->event +291 BOUNCBOX referent,item,item2,ammo 296 +5 STEAMBOX referent,event,steam,steam2,direction,count event-bearing field:event,tag:69:0A00->event +292 HOVER1 referent 296 +4 STEAMBOX referent,event,steam,steam2,direction,count event-bearing field:event,tag:69:0A00->event +293 STEAM1 referent 296 +3 STEAMBOX referent,event,steam,steam2,direction,count event-bearing field:event,tag:69:0A00->event +294 FADE referent,loop,loop2 296 +2 STEAMBOX referent,event,steam,steam2,direction,count event-bearing field:event,tag:69:0A00->event +295 PHIR referent 296 +1 STEAMBOX referent,event,steam,steam2,direction,count event-bearing field:event,tag:69:0A00->event +297 FLAME2 referent 296 -1 STEAMBOX referent,event,steam,steam2,direction,count event-bearing field:event,tag:69:0A00->event +298 STEAM2 referent 296 -2 STEAMBOX referent,event,steam,steam2,direction,count event-bearing field:event,tag:69:0A00->event +299 FLAMELP referent 296 -3 STEAMBOX referent,event,steam,steam2,direction,count event-bearing field:event,tag:69:0A00->event +300 BBOX ma0Q0,referent 296 -4 STEAMBOX referent,event,steam,steam2,direction,count event-bearing field:event,tag:69:0A00->event +301 GBOX_NS ma0Q0,referent 296 -5 STEAMBOX referent,event,steam,steam2,direction,count event-bearing field:event,tag:69:0A00->event diff --git a/USECODE/EUSECODE_extracted/summary.json b/USECODE/EUSECODE_extracted/summary.json new file mode 100644 index 0000000..a9b4cda --- /dev/null +++ b/USECODE/EUSECODE_extracted/summary.json @@ -0,0 +1,13590 @@ +{ + "input_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE.FLX", + "file_size": 556613, + "header_preview_hex": "1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a0000020c000001000000000000000000000000000000000000000000000000000000000000000000000000000000", + "header_preview_ascii": "................................................................................................................................", + "candidate_entries": [ + { + "table_offset": 136, + "data_offset": 24720, + "declared_size": 39936 + }, + { + "table_offset": 168, + "data_offset": 556088, + "declared_size": 525 + }, + { + "table_offset": 184, + "data_offset": 325113, + "declared_size": 307 + }, + { + "table_offset": 264, + "data_offset": 555563, + "declared_size": 525 + }, + { + "table_offset": 408, + "data_offset": 66259, + "declared_size": 294 + }, + { + "table_offset": 504, + "data_offset": 373237, + "declared_size": 442 + }, + { + "table_offset": 528, + "data_offset": 432425, + "declared_size": 750 + }, + { + "table_offset": 704, + "data_offset": 266829, + "declared_size": 681 + }, + { + "table_offset": 728, + "data_offset": 66553, + "declared_size": 294 + }, + { + "table_offset": 896, + "data_offset": 342601, + "declared_size": 1074 + }, + { + "table_offset": 904, + "data_offset": 525480, + "declared_size": 441 + }, + { + "table_offset": 920, + "data_offset": 395831, + "declared_size": 385 + }, + { + "table_offset": 1000, + "data_offset": 116482, + "declared_size": 740 + }, + { + "table_offset": 1040, + "data_offset": 474268, + "declared_size": 311 + }, + { + "table_offset": 1128, + "data_offset": 324806, + "declared_size": 307 + }, + { + "table_offset": 1168, + "data_offset": 91992, + "declared_size": 714 + }, + { + "table_offset": 1176, + "data_offset": 92706, + "declared_size": 714 + }, + { + "table_offset": 1232, + "data_offset": 473335, + "declared_size": 311 + }, + { + "table_offset": 1248, + "data_offset": 473646, + "declared_size": 311 + }, + { + "table_offset": 1256, + "data_offset": 475823, + "declared_size": 311 + }, + { + "table_offset": 1264, + "data_offset": 475201, + "declared_size": 311 + }, + { + "table_offset": 1272, + "data_offset": 474579, + "declared_size": 311 + }, + { + "table_offset": 1288, + "data_offset": 257902, + "declared_size": 644 + }, + { + "table_offset": 1304, + "data_offset": 475512, + "declared_size": 311 + }, + { + "table_offset": 1312, + "data_offset": 474890, + "declared_size": 311 + }, + { + "table_offset": 1320, + "data_offset": 473957, + "declared_size": 311 + }, + { + "table_offset": 1328, + "data_offset": 316631, + "declared_size": 769 + }, + { + "table_offset": 1336, + "data_offset": 227649, + "declared_size": 307 + }, + { + "table_offset": 1344, + "data_offset": 108711, + "declared_size": 366 + }, + { + "table_offset": 1368, + "data_offset": 228263, + "declared_size": 304 + }, + { + "table_offset": 1376, + "data_offset": 317400, + "declared_size": 769 + }, + { + "table_offset": 1432, + "data_offset": 316282, + "declared_size": 349 + }, + { + "table_offset": 1440, + "data_offset": 315933, + "declared_size": 349 + }, + { + "table_offset": 1496, + "data_offset": 267510, + "declared_size": 681 + }, + { + "table_offset": 1504, + "data_offset": 73770, + "declared_size": 307 + }, + { + "table_offset": 1632, + "data_offset": 370511, + "declared_size": 308 + }, + { + "table_offset": 1640, + "data_offset": 370819, + "declared_size": 308 + }, + { + "table_offset": 1656, + "data_offset": 343675, + "declared_size": 1074 + }, + { + "table_offset": 1704, + "data_offset": 487814, + "declared_size": 362 + }, + { + "table_offset": 1712, + "data_offset": 488176, + "declared_size": 362 + }, + { + "table_offset": 1720, + "data_offset": 488538, + "declared_size": 362 + }, + { + "table_offset": 1728, + "data_offset": 488900, + "declared_size": 362 + }, + { + "table_offset": 1736, + "data_offset": 489262, + "declared_size": 362 + }, + { + "table_offset": 1816, + "data_offset": 98433, + "declared_size": 438 + }, + { + "table_offset": 2056, + "data_offset": 390275, + "declared_size": 724 + }, + { + "table_offset": 2208, + "data_offset": 300391, + "declared_size": 880 + }, + { + "table_offset": 2256, + "data_offset": 226620, + "declared_size": 722 + }, + { + "table_offset": 2296, + "data_offset": 234886, + "declared_size": 724 + }, + { + "table_offset": 2344, + "data_offset": 225898, + "declared_size": 722 + }, + { + "table_offset": 2448, + "data_offset": 205397, + "declared_size": 695 + }, + { + "table_offset": 2568, + "data_offset": 187722, + "declared_size": 1096 + }, + { + "table_offset": 2592, + "data_offset": 109077, + "declared_size": 549 + }, + { + "table_offset": 2600, + "data_offset": 254364, + "declared_size": 1994 + }, + { + "table_offset": 2608, + "data_offset": 115742, + "declared_size": 740 + }, + { + "table_offset": 2616, + "data_offset": 206092, + "declared_size": 1387 + }, + { + "table_offset": 2624, + "data_offset": 336287, + "declared_size": 723 + }, + { + "table_offset": 2640, + "data_offset": 337921, + "declared_size": 911 + }, + { + "table_offset": 2712, + "data_offset": 524196, + "declared_size": 620 + }, + { + "table_offset": 2832, + "data_offset": 134295, + "declared_size": 345 + }, + { + "table_offset": 2840, + "data_offset": 73156, + "declared_size": 307 + }, + { + "table_offset": 2848, + "data_offset": 72542, + "declared_size": 307 + }, + { + "table_offset": 2856, + "data_offset": 72235, + "declared_size": 307 + }, + { + "table_offset": 2864, + "data_offset": 72849, + "declared_size": 307 + }, + { + "table_offset": 2872, + "data_offset": 73463, + "declared_size": 307 + }, + { + "table_offset": 2896, + "data_offset": 335564, + "declared_size": 723 + }, + { + "table_offset": 2912, + "data_offset": 337010, + "declared_size": 911 + }, + { + "table_offset": 2936, + "data_offset": 236176, + "declared_size": 497 + }, + { + "table_offset": 2944, + "data_offset": 476134, + "declared_size": 494 + }, + { + "table_offset": 3000, + "data_offset": 299511, + "declared_size": 880 + }, + { + "table_offset": 3016, + "data_offset": 408187, + "declared_size": 287 + }, + { + "table_offset": 3120, + "data_offset": 499493, + "declared_size": 294 + }, + { + "table_offset": 3208, + "data_offset": 209451, + "declared_size": 664 + }, + { + "table_offset": 3216, + "data_offset": 524816, + "declared_size": 664 + }, + { + "table_offset": 3240, + "data_offset": 523576, + "declared_size": 620 + }, + { + "table_offset": 3280, + "data_offset": 358051, + "declared_size": 724 + }, + { + "table_offset": 3328, + "data_offset": 304693, + "declared_size": 724 + }, + { + "table_offset": 3336, + "data_offset": 522956, + "declared_size": 620 + }, + { + "table_offset": 3384, + "data_offset": 521716, + "declared_size": 620 + }, + { + "table_offset": 3392, + "data_offset": 522336, + "declared_size": 620 + }, + { + "table_offset": 3408, + "data_offset": 320271, + "declared_size": 612 + }, + { + "table_offset": 3416, + "data_offset": 320883, + "declared_size": 997 + }, + { + "table_offset": 3424, + "data_offset": 208831, + "declared_size": 620 + }, + { + "table_offset": 3432, + "data_offset": 253207, + "declared_size": 1157 + }, + { + "table_offset": 3440, + "data_offset": 252047, + "declared_size": 1160 + }, + { + "table_offset": 3488, + "data_offset": 324538, + "declared_size": 268 + }, + { + "table_offset": 3520, + "data_offset": 357764, + "declared_size": 287 + }, + { + "table_offset": 3576, + "data_offset": 245930, + "declared_size": 382 + }, + { + "table_offset": 3632, + "data_offset": 191585, + "declared_size": 283 + }, + { + "table_offset": 3648, + "data_offset": 101922, + "declared_size": 1607 + }, + { + "table_offset": 3656, + "data_offset": 302714, + "declared_size": 1076 + }, + { + "table_offset": 3664, + "data_offset": 105130, + "declared_size": 1601 + }, + { + "table_offset": 3672, + "data_offset": 106731, + "declared_size": 722 + }, + { + "table_offset": 3680, + "data_offset": 107453, + "declared_size": 722 + }, + { + "table_offset": 3696, + "data_offset": 225630, + "declared_size": 268 + }, + { + "table_offset": 3720, + "data_offset": 411947, + "declared_size": 768 + }, + { + "table_offset": 3744, + "data_offset": 366717, + "declared_size": 446 + }, + { + "table_offset": 3792, + "data_offset": 207479, + "declared_size": 1352 + }, + { + "table_offset": 3800, + "data_offset": 367669, + "declared_size": 446 + }, + { + "table_offset": 3816, + "data_offset": 262255, + "declared_size": 599 + }, + { + "table_offset": 3824, + "data_offset": 262854, + "declared_size": 599 + }, + { + "table_offset": 3832, + "data_offset": 364350, + "declared_size": 814 + }, + { + "table_offset": 3840, + "data_offset": 263453, + "declared_size": 599 + }, + { + "table_offset": 3848, + "data_offset": 261656, + "declared_size": 599 + }, + { + "table_offset": 3856, + "data_offset": 259859, + "declared_size": 599 + }, + { + "table_offset": 3864, + "data_offset": 260458, + "declared_size": 599 + }, + { + "table_offset": 3872, + "data_offset": 261057, + "declared_size": 599 + }, + { + "table_offset": 3880, + "data_offset": 259260, + "declared_size": 599 + }, + { + "table_offset": 3888, + "data_offset": 265879, + "declared_size": 475 + }, + { + "table_offset": 3896, + "data_offset": 250115, + "declared_size": 716 + }, + { + "table_offset": 3904, + "data_offset": 100455, + "declared_size": 680 + }, + { + "table_offset": 3912, + "data_offset": 103529, + "declared_size": 1601 + }, + { + "table_offset": 3944, + "data_offset": 552605, + "declared_size": 2958 + }, + { + "table_offset": 3952, + "data_offset": 266354, + "declared_size": 475 + }, + { + "table_offset": 3960, + "data_offset": 264335, + "declared_size": 889 + }, + { + "table_offset": 4000, + "data_offset": 396601, + "declared_size": 682 + }, + { + "table_offset": 4128, + "data_offset": 397704, + "declared_size": 421 + }, + { + "table_offset": 4136, + "data_offset": 397283, + "declared_size": 421 + }, + { + "table_offset": 4152, + "data_offset": 74077, + "declared_size": 1191 + }, + { + "table_offset": 4200, + "data_offset": 372555, + "declared_size": 682 + }, + { + "table_offset": 4232, + "data_offset": 269656, + "declared_size": 360 + }, + { + "table_offset": 4240, + "data_offset": 269296, + "declared_size": 360 + }, + { + "table_offset": 4384, + "data_offset": 359802, + "declared_size": 1027 + }, + { + "table_offset": 4392, + "data_offset": 358775, + "declared_size": 1027 + }, + { + "table_offset": 4472, + "data_offset": 78168, + "declared_size": 371 + }, + { + "table_offset": 4480, + "data_offset": 183658, + "declared_size": 4064 + }, + { + "table_offset": 4552, + "data_offset": 133605, + "declared_size": 345 + }, + { + "table_offset": 4560, + "data_offset": 133950, + "declared_size": 345 + }, + { + "table_offset": 4584, + "data_offset": 171160, + "declared_size": 368 + }, + { + "table_offset": 4592, + "data_offset": 117222, + "declared_size": 740 + }, + { + "table_offset": 4600, + "data_offset": 319366, + "declared_size": 905 + }, + { + "table_offset": 4888, + "data_offset": 431984, + "declared_size": 441 + }, + { + "table_offset": 4912, + "data_offset": 386339, + "declared_size": 345 + }, + { + "table_offset": 4936, + "data_offset": 80151, + "declared_size": 436 + }, + { + "table_offset": 4944, + "data_offset": 79715, + "declared_size": 436 + }, + { + "table_offset": 5000, + "data_offset": 203616, + "declared_size": 737 + }, + { + "table_offset": 5008, + "data_offset": 202894, + "declared_size": 722 + }, + { + "table_offset": 5144, + "data_offset": 499199, + "declared_size": 294 + }, + { + "table_offset": 5224, + "data_offset": 228873, + "declared_size": 849 + }, + { + "table_offset": 5392, + "data_offset": 192375, + "declared_size": 507 + }, + { + "table_offset": 5408, + "data_offset": 118702, + "declared_size": 740 + }, + { + "table_offset": 5416, + "data_offset": 117962, + "declared_size": 740 + }, + { + "table_offset": 5424, + "data_offset": 270436, + "declared_size": 420 + }, + { + "table_offset": 5504, + "data_offset": 270856, + "declared_size": 338 + }, + { + "table_offset": 5512, + "data_offset": 215103, + "declared_size": 541 + }, + { + "table_offset": 5544, + "data_offset": 396216, + "declared_size": 385 + }, + { + "table_offset": 5608, + "data_offset": 243978, + "declared_size": 595 + }, + { + "table_offset": 5624, + "data_offset": 244573, + "declared_size": 595 + }, + { + "table_offset": 5632, + "data_offset": 270016, + "declared_size": 420 + }, + { + "table_offset": 5672, + "data_offset": 379809, + "declared_size": 533 + }, + { + "table_offset": 5800, + "data_offset": 85298, + "declared_size": 790 + }, + { + "table_offset": 5808, + "data_offset": 84508, + "declared_size": 790 + }, + { + "table_offset": 5848, + "data_offset": 78539, + "declared_size": 636 + }, + { + "table_offset": 5856, + "data_offset": 380342, + "declared_size": 533 + }, + { + "table_offset": 5864, + "data_offset": 344749, + "declared_size": 319 + }, + { + "table_offset": 6000, + "data_offset": 385307, + "declared_size": 687 + }, + { + "table_offset": 6016, + "data_offset": 256358, + "declared_size": 307 + }, + { + "table_offset": 6024, + "data_offset": 114376, + "declared_size": 283 + }, + { + "table_offset": 6032, + "data_offset": 369809, + "declared_size": 702 + }, + { + "table_offset": 6040, + "data_offset": 368621, + "declared_size": 1188 + }, + { + "table_offset": 6072, + "data_offset": 321880, + "declared_size": 886 + }, + { + "table_offset": 6088, + "data_offset": 323652, + "declared_size": 886 + }, + { + "table_offset": 6096, + "data_offset": 322766, + "declared_size": 886 + }, + { + "table_offset": 6160, + "data_offset": 438703, + "declared_size": 722 + }, + { + "table_offset": 6184, + "data_offset": 229722, + "declared_size": 849 + }, + { + "table_offset": 6200, + "data_offset": 264052, + "declared_size": 283 + }, + { + "table_offset": 6208, + "data_offset": 110361, + "declared_size": 283 + }, + { + "table_offset": 6216, + "data_offset": 314072, + "declared_size": 283 + }, + { + "table_offset": 6264, + "data_offset": 235610, + "declared_size": 283 + }, + { + "table_offset": 6368, + "data_offset": 227956, + "declared_size": 307 + }, + { + "table_offset": 6376, + "data_offset": 227342, + "declared_size": 307 + }, + { + "table_offset": 6440, + "data_offset": 79175, + "declared_size": 540 + }, + { + "table_offset": 6448, + "data_offset": 67630, + "declared_size": 1433 + }, + { + "table_offset": 6464, + "data_offset": 98871, + "declared_size": 1584 + }, + { + "table_offset": 6480, + "data_offset": 121722, + "declared_size": 734 + }, + { + "table_offset": 6488, + "data_offset": 235893, + "declared_size": 283 + }, + { + "table_offset": 6520, + "data_offset": 108443, + "declared_size": 268 + }, + { + "table_offset": 6528, + "data_offset": 108175, + "declared_size": 268 + }, + { + "table_offset": 6616, + "data_offset": 202056, + "declared_size": 419 + }, + { + "table_offset": 6624, + "data_offset": 202475, + "declared_size": 419 + }, + { + "table_offset": 6720, + "data_offset": 191868, + "declared_size": 507 + }, + { + "table_offset": 6728, + "data_offset": 467332, + "declared_size": 1730 + }, + { + "table_offset": 6736, + "data_offset": 408474, + "declared_size": 319 + }, + { + "table_offset": 6744, + "data_offset": 173787, + "declared_size": 593 + }, + { + "table_offset": 6768, + "data_offset": 313818, + "declared_size": 254 + }, + { + "table_offset": 6824, + "data_offset": 233967, + "declared_size": 356 + }, + { + "table_offset": 6832, + "data_offset": 363069, + "declared_size": 283 + }, + { + "table_offset": 6848, + "data_offset": 354592, + "declared_size": 3172 + }, + { + "table_offset": 6904, + "data_offset": 327953, + "declared_size": 870 + }, + { + "table_offset": 6936, + "data_offset": 268191, + "declared_size": 524 + }, + { + "table_offset": 7056, + "data_offset": 120336, + "declared_size": 1386 + }, + { + "table_offset": 7064, + "data_offset": 193694, + "declared_size": 8362 + }, + { + "table_offset": 7080, + "data_offset": 312135, + "declared_size": 936 + }, + { + "table_offset": 7088, + "data_offset": 318604, + "declared_size": 508 + }, + { + "table_offset": 7096, + "data_offset": 122456, + "declared_size": 843 + }, + { + "table_offset": 7104, + "data_offset": 313071, + "declared_size": 747 + }, + { + "table_offset": 7112, + "data_offset": 436835, + "declared_size": 1146 + }, + { + "table_offset": 7192, + "data_offset": 390999, + "declared_size": 283 + }, + { + "table_offset": 7208, + "data_offset": 437981, + "declared_size": 722 + }, + { + "table_offset": 7304, + "data_offset": 385994, + "declared_size": 345 + }, + { + "table_offset": 7328, + "data_offset": 69993, + "declared_size": 845 + }, + { + "table_offset": 7336, + "data_offset": 67347, + "declared_size": 283 + }, + { + "table_offset": 7344, + "data_offset": 373679, + "declared_size": 283 + }, + { + "table_offset": 7352, + "data_offset": 110063, + "declared_size": 298 + }, + { + "table_offset": 7448, + "data_offset": 379380, + "declared_size": 429 + }, + { + "table_offset": 7496, + "data_offset": 378986, + "declared_size": 394 + }, + { + "table_offset": 7512, + "data_offset": 232991, + "declared_size": 722 + }, + { + "table_offset": 7520, + "data_offset": 248538, + "declared_size": 1577 + }, + { + "table_offset": 7528, + "data_offset": 86088, + "declared_size": 4202 + }, + { + "table_offset": 7536, + "data_offset": 223582, + "declared_size": 2048 + }, + { + "table_offset": 7576, + "data_offset": 232269, + "declared_size": 722 + }, + { + "table_offset": 7616, + "data_offset": 179410, + "declared_size": 482 + }, + { + "table_offset": 7648, + "data_offset": 373962, + "declared_size": 347 + }, + { + "table_offset": 7664, + "data_offset": 434714, + "declared_size": 306 + }, + { + "table_offset": 7688, + "data_offset": 487013, + "declared_size": 340 + }, + { + "table_offset": 7696, + "data_offset": 477648, + "declared_size": 340 + }, + { + "table_offset": 7704, + "data_offset": 477308, + "declared_size": 340 + }, + { + "table_offset": 7728, + "data_offset": 476628, + "declared_size": 340 + }, + { + "table_offset": 7736, + "data_offset": 476968, + "declared_size": 340 + }, + { + "table_offset": 7744, + "data_offset": 486673, + "declared_size": 340 + }, + { + "table_offset": 7784, + "data_offset": 268715, + "declared_size": 581 + }, + { + "table_offset": 7792, + "data_offset": 314918, + "declared_size": 1015 + }, + { + "table_offset": 7832, + "data_offset": 228567, + "declared_size": 306 + }, + { + "table_offset": 7936, + "data_offset": 340550, + "declared_size": 1025 + }, + { + "table_offset": 7976, + "data_offset": 341575, + "declared_size": 1026 + }, + { + "table_offset": 8136, + "data_offset": 471700, + "declared_size": 471 + }, + { + "table_offset": 8144, + "data_offset": 471216, + "declared_size": 484 + }, + { + "table_offset": 8184, + "data_offset": 325420, + "declared_size": 1055 + }, + { + "table_offset": 8272, + "data_offset": 363656, + "declared_size": 304 + }, + { + "table_offset": 8328, + "data_offset": 363352, + "declared_size": 304 + }, + { + "table_offset": 8360, + "data_offset": 211767, + "declared_size": 1936 + }, + { + "table_offset": 8488, + "data_offset": 179892, + "declared_size": 482 + }, + { + "table_offset": 8736, + "data_offset": 265224, + "declared_size": 655 + }, + { + "table_offset": 8744, + "data_offset": 119442, + "declared_size": 447 + }, + { + "table_offset": 8752, + "data_offset": 119889, + "declared_size": 447 + }, + { + "table_offset": 8760, + "data_offset": 508589, + "declared_size": 418 + }, + { + "table_offset": 8808, + "data_offset": 211047, + "declared_size": 360 + }, + { + "table_offset": 8824, + "data_offset": 333818, + "declared_size": 1746 + }, + { + "table_offset": 8832, + "data_offset": 305671, + "declared_size": 1159 + }, + { + "table_offset": 8864, + "data_offset": 433175, + "declared_size": 1539 + }, + { + "table_offset": 8872, + "data_offset": 82228, + "declared_size": 2280 + }, + { + "table_offset": 8880, + "data_offset": 327433, + "declared_size": 520 + }, + { + "table_offset": 8904, + "data_offset": 430927, + "declared_size": 681 + }, + { + "table_offset": 8936, + "data_offset": 247615, + "declared_size": 495 + }, + { + "table_offset": 8944, + "data_offset": 247120, + "declared_size": 495 + }, + { + "table_offset": 8952, + "data_offset": 470139, + "declared_size": 1077 + }, + { + "table_offset": 8960, + "data_offset": 469062, + "declared_size": 1077 + }, + { + "table_offset": 8968, + "data_offset": 189137, + "declared_size": 1714 + }, + { + "table_offset": 8992, + "data_offset": 383091, + "declared_size": 2216 + }, + { + "table_offset": 9032, + "data_offset": 380875, + "declared_size": 2216 + }, + { + "table_offset": 9048, + "data_offset": 368115, + "declared_size": 506 + }, + { + "table_offset": 9056, + "data_offset": 367163, + "declared_size": 506 + }, + { + "table_offset": 9064, + "data_offset": 550079, + "declared_size": 1206 + }, + { + "table_offset": 9072, + "data_offset": 435020, + "declared_size": 1517 + }, + { + "table_offset": 9080, + "data_offset": 509911, + "declared_size": 319 + }, + { + "table_offset": 9152, + "data_offset": 258546, + "declared_size": 357 + }, + { + "table_offset": 9160, + "data_offset": 258903, + "declared_size": 357 + }, + { + "table_offset": 9288, + "data_offset": 64656, + "declared_size": 996 + }, + { + "table_offset": 9808, + "data_offset": 90290, + "declared_size": 393 + }, + { + "table_offset": 9816, + "data_offset": 171528, + "declared_size": 599 + }, + { + "table_offset": 9824, + "data_offset": 172127, + "declared_size": 599 + }, + { + "table_offset": 9832, + "data_offset": 175329, + "declared_size": 599 + }, + { + "table_offset": 9840, + "data_offset": 175928, + "declared_size": 599 + }, + { + "table_offset": 9848, + "data_offset": 176527, + "declared_size": 599 + }, + { + "table_offset": 9856, + "data_offset": 177725, + "declared_size": 599 + }, + { + "table_offset": 9864, + "data_offset": 177126, + "declared_size": 599 + }, + { + "table_offset": 9872, + "data_offset": 179098, + "declared_size": 312 + }, + { + "table_offset": 9888, + "data_offset": 172726, + "declared_size": 462 + }, + { + "table_offset": 9904, + "data_offset": 178324, + "declared_size": 462 + }, + { + "table_offset": 9912, + "data_offset": 178786, + "declared_size": 312 + }, + { + "table_offset": 9920, + "data_offset": 391282, + "declared_size": 3438 + }, + { + "table_offset": 9936, + "data_offset": 75268, + "declared_size": 1090 + }, + { + "table_offset": 9944, + "data_offset": 410585, + "declared_size": 1362 + }, + { + "table_offset": 9952, + "data_offset": 374309, + "declared_size": 2062 + }, + { + "table_offset": 9976, + "data_offset": 430067, + "declared_size": 860 + }, + { + "table_offset": 10000, + "data_offset": 301271, + "declared_size": 1443 + }, + { + "table_offset": 10008, + "data_offset": 188818, + "declared_size": 319 + }, + { + "table_offset": 10016, + "data_offset": 173188, + "declared_size": 599 + }, + { + "table_offset": 10024, + "data_offset": 245676, + "declared_size": 254 + }, + { + "table_offset": 10032, + "data_offset": 125712, + "declared_size": 5256 + }, + { + "table_offset": 10040, + "data_offset": 371895, + "declared_size": 660 + }, + { + "table_offset": 10048, + "data_offset": 245422, + "declared_size": 254 + }, + { + "table_offset": 10072, + "data_offset": 236673, + "declared_size": 354 + }, + { + "table_offset": 10080, + "data_offset": 175017, + "declared_size": 312 + }, + { + "table_offset": 10088, + "data_offset": 338832, + "declared_size": 1718 + }, + { + "table_offset": 10112, + "data_offset": 546655, + "declared_size": 3424 + }, + { + "table_offset": 10144, + "data_offset": 365164, + "declared_size": 396 + }, + { + "table_offset": 10152, + "data_offset": 371127, + "declared_size": 768 + }, + { + "table_offset": 10160, + "data_offset": 174380, + "declared_size": 637 + }, + { + "table_offset": 10176, + "data_offset": 436537, + "declared_size": 298 + }, + { + "table_offset": 10184, + "data_offset": 130968, + "declared_size": 671 + }, + { + "table_offset": 10224, + "data_offset": 333101, + "declared_size": 717 + }, + { + "table_offset": 10248, + "data_offset": 90683, + "declared_size": 1309 + }, + { + "table_offset": 10256, + "data_offset": 243383, + "declared_size": 595 + }, + { + "table_offset": 10336, + "data_offset": 387536, + "declared_size": 360 + }, + { + "table_offset": 10352, + "data_offset": 204353, + "declared_size": 1044 + }, + { + "table_offset": 10376, + "data_offset": 318169, + "declared_size": 435 + }, + { + "table_offset": 10384, + "data_offset": 388256, + "declared_size": 2019 + }, + { + "table_offset": 10464, + "data_offset": 211407, + "declared_size": 360 + }, + { + "table_offset": 10520, + "data_offset": 387896, + "declared_size": 360 + }, + { + "table_offset": 10560, + "data_offset": 506630, + "declared_size": 360 + }, + { + "table_offset": 10680, + "data_offset": 506990, + "declared_size": 533 + }, + { + "table_offset": 10688, + "data_offset": 508056, + "declared_size": 533 + }, + { + "table_offset": 10696, + "data_offset": 507523, + "declared_size": 533 + }, + { + "table_offset": 10704, + "data_offset": 180374, + "declared_size": 319 + }, + { + "table_offset": 10744, + "data_offset": 362342, + "declared_size": 727 + }, + { + "table_offset": 10752, + "data_offset": 245168, + "declared_size": 254 + }, + { + "table_offset": 10760, + "data_offset": 319112, + "declared_size": 254 + }, + { + "table_offset": 10768, + "data_offset": 233713, + "declared_size": 254 + }, + { + "table_offset": 10904, + "data_offset": 230571, + "declared_size": 849 + }, + { + "table_offset": 10912, + "data_offset": 231420, + "declared_size": 849 + }, + { + "table_offset": 10928, + "data_offset": 326475, + "declared_size": 636 + }, + { + "table_offset": 10936, + "data_offset": 327111, + "declared_size": 322 + }, + { + "table_offset": 10968, + "data_offset": 360829, + "declared_size": 1513 + }, + { + "table_offset": 10976, + "data_offset": 113878, + "declared_size": 498 + }, + { + "table_offset": 10984, + "data_offset": 113380, + "declared_size": 498 + }, + { + "table_offset": 11000, + "data_offset": 511221, + "declared_size": 599 + }, + { + "table_offset": 11016, + "data_offset": 111991, + "declared_size": 1389 + }, + { + "table_offset": 11024, + "data_offset": 110644, + "declared_size": 1347 + }, + { + "table_offset": 11128, + "data_offset": 510230, + "declared_size": 599 + }, + { + "table_offset": 11144, + "data_offset": 134640, + "declared_size": 1220 + }, + { + "table_offset": 11152, + "data_offset": 123299, + "declared_size": 2413 + }, + { + "table_offset": 11160, + "data_offset": 65652, + "declared_size": 607 + }, + { + "table_offset": 11184, + "data_offset": 193288, + "declared_size": 406 + }, + { + "table_offset": 11192, + "data_offset": 192882, + "declared_size": 406 + }, + { + "table_offset": 11200, + "data_offset": 409689, + "declared_size": 896 + }, + { + "table_offset": 11208, + "data_offset": 408793, + "declared_size": 896 + }, + { + "table_offset": 11248, + "data_offset": 351420, + "declared_size": 3172 + }, + { + "table_offset": 11328, + "data_offset": 248110, + "declared_size": 428 + }, + { + "table_offset": 11416, + "data_offset": 66847, + "declared_size": 500 + }, + { + "table_offset": 11424, + "data_offset": 190851, + "declared_size": 734 + }, + { + "table_offset": 11456, + "data_offset": 348248, + "declared_size": 3172 + }, + { + "table_offset": 11496, + "data_offset": 345068, + "declared_size": 3180 + }, + { + "table_offset": 11528, + "data_offset": 485889, + "declared_size": 392 + }, + { + "table_offset": 11584, + "data_offset": 486281, + "declared_size": 392 + }, + { + "table_offset": 11632, + "data_offset": 510829, + "declared_size": 392 + }, + { + "table_offset": 11648, + "data_offset": 525921, + "declared_size": 345 + }, + { + "table_offset": 11656, + "data_offset": 509007, + "declared_size": 452 + }, + { + "table_offset": 11664, + "data_offset": 509459, + "declared_size": 452 + }, + { + "table_offset": 11680, + "data_offset": 526266, + "declared_size": 345 + }, + { + "table_offset": 16536, + "data_offset": 69063, + "declared_size": 930 + }, + { + "table_offset": 18576, + "data_offset": 412715, + "declared_size": 552 + }, + { + "table_offset": 18584, + "data_offset": 314355, + "declared_size": 563 + }, + { + "table_offset": 18592, + "data_offset": 213703, + "declared_size": 1400 + }, + { + "table_offset": 18600, + "data_offset": 303790, + "declared_size": 903 + }, + { + "table_offset": 18608, + "data_offset": 109626, + "declared_size": 437 + }, + { + "table_offset": 18616, + "data_offset": 101135, + "declared_size": 787 + }, + { + "table_offset": 18624, + "data_offset": 363960, + "declared_size": 390 + }, + { + "table_offset": 18632, + "data_offset": 328823, + "declared_size": 4278 + }, + { + "table_offset": 18640, + "data_offset": 398125, + "declared_size": 546 + }, + { + "table_offset": 18648, + "data_offset": 234323, + "declared_size": 563 + }, + { + "table_offset": 18656, + "data_offset": 170522, + "declared_size": 638 + }, + { + "table_offset": 18664, + "data_offset": 77798, + "declared_size": 370 + }, + { + "table_offset": 18672, + "data_offset": 251648, + "declared_size": 399 + }, + { + "table_offset": 18680, + "data_offset": 275226, + "declared_size": 5251 + }, + { + "table_offset": 18688, + "data_offset": 280477, + "declared_size": 8924 + }, + { + "table_offset": 18696, + "data_offset": 289401, + "declared_size": 543 + }, + { + "table_offset": 18704, + "data_offset": 289944, + "declared_size": 674 + }, + { + "table_offset": 18712, + "data_offset": 290618, + "declared_size": 2660 + }, + { + "table_offset": 18720, + "data_offset": 293278, + "declared_size": 2005 + }, + { + "table_offset": 18728, + "data_offset": 295283, + "declared_size": 318 + }, + { + "table_offset": 18736, + "data_offset": 295601, + "declared_size": 2377 + }, + { + "table_offset": 18744, + "data_offset": 297978, + "declared_size": 1533 + }, + { + "table_offset": 18752, + "data_offset": 271194, + "declared_size": 434 + }, + { + "table_offset": 18760, + "data_offset": 271628, + "declared_size": 472 + }, + { + "table_offset": 18768, + "data_offset": 272100, + "declared_size": 507 + }, + { + "table_offset": 18776, + "data_offset": 272607, + "declared_size": 1680 + }, + { + "table_offset": 18784, + "data_offset": 274287, + "declared_size": 939 + }, + { + "table_offset": 18792, + "data_offset": 551285, + "declared_size": 1320 + }, + { + "table_offset": 18800, + "data_offset": 305417, + "declared_size": 254 + }, + { + "table_offset": 18808, + "data_offset": 487353, + "declared_size": 461 + }, + { + "table_offset": 20624, + "data_offset": 70838, + "declared_size": 1397 + }, + { + "table_offset": 20632, + "data_offset": 76358, + "declared_size": 1440 + }, + { + "table_offset": 20640, + "data_offset": 80587, + "declared_size": 1641 + }, + { + "table_offset": 20648, + "data_offset": 93420, + "declared_size": 5013 + }, + { + "table_offset": 20656, + "data_offset": 114659, + "declared_size": 1083 + }, + { + "table_offset": 20664, + "data_offset": 131639, + "declared_size": 1966 + }, + { + "table_offset": 20672, + "data_offset": 135860, + "declared_size": 8488 + }, + { + "table_offset": 20680, + "data_offset": 144348, + "declared_size": 16879 + }, + { + "table_offset": 20688, + "data_offset": 161227, + "declared_size": 9295 + }, + { + "table_offset": 20696, + "data_offset": 180693, + "declared_size": 2965 + }, + { + "table_offset": 20704, + "data_offset": 210115, + "declared_size": 212 + }, + { + "table_offset": 20712, + "data_offset": 210327, + "declared_size": 720 + }, + { + "table_offset": 20720, + "data_offset": 215644, + "declared_size": 7938 + }, + { + "table_offset": 20728, + "data_offset": 237027, + "declared_size": 6356 + }, + { + "table_offset": 20736, + "data_offset": 246312, + "declared_size": 808 + }, + { + "table_offset": 20744, + "data_offset": 250831, + "declared_size": 817 + }, + { + "table_offset": 20752, + "data_offset": 256665, + "declared_size": 1237 + }, + { + "table_offset": 20760, + "data_offset": 306830, + "declared_size": 5093 + }, + { + "table_offset": 20768, + "data_offset": 311923, + "declared_size": 212 + }, + { + "table_offset": 20776, + "data_offset": 365560, + "declared_size": 1157 + }, + { + "table_offset": 20784, + "data_offset": 376371, + "declared_size": 2615 + }, + { + "table_offset": 20792, + "data_offset": 386684, + "declared_size": 852 + }, + { + "table_offset": 20800, + "data_offset": 394720, + "declared_size": 1111 + }, + { + "table_offset": 20808, + "data_offset": 398671, + "declared_size": 9516 + }, + { + "table_offset": 20816, + "data_offset": 413267, + "declared_size": 16800 + }, + { + "table_offset": 20824, + "data_offset": 431608, + "declared_size": 376 + }, + { + "table_offset": 20832, + "data_offset": 439425, + "declared_size": 27907 + }, + { + "table_offset": 20840, + "data_offset": 472171, + "declared_size": 1164 + }, + { + "table_offset": 20848, + "data_offset": 477988, + "declared_size": 7901 + }, + { + "table_offset": 20856, + "data_offset": 489624, + "declared_size": 9575 + }, + { + "table_offset": 20864, + "data_offset": 499787, + "declared_size": 6843 + }, + { + "table_offset": 20872, + "data_offset": 511820, + "declared_size": 9896 + }, + { + "table_offset": 20880, + "data_offset": 526611, + "declared_size": 20044 + } + ], + "chunks": [ + { + "index": 0, + "table_offset": 136, + "data_offset": 24720, + "declared_size": 39936, + "next_offset": 64656, + "extracted_size": 39936, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.0857, + "zero_ratio": 0.9063, + "preview": ".......................................@...BLACK8.un............", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_000_table_0088_off_006090_len_009C00.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_000_table_0088_off_006090_len_009C00.strings.txt", + "text_path": null, + "primary_label": "ALARMBOX", + "field_names": [ + "uniB" + ], + "field_tags": [ + "4F:4400->uniB", + "54:4500->uniB", + "58:3100->uniB" + ] + }, + { + "index": 1, + "table_offset": 168, + "data_offset": 556088, + "declared_size": 525, + "next_offset": null, + "extracted_size": 525, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2971, + "zero_ratio": 0.5067, + "preview": "....9...........g.......................................9.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_001_table_00A8_off_087C38_len_00020D.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_001_table_00A8_off_087C38_len_00020D.strings.txt", + "text_path": null, + "primary_label": "BLACK8", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 2, + "table_offset": 184, + "data_offset": 325113, + "declared_size": 307, + "next_offset": 325420, + "extracted_size": 307, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1987, + "zero_ratio": 0.7264, + "preview": "...._.......3..........................................._.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_002_table_00B8_off_04F5F9_len_000133.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_002_table_00B8_off_04F5F9_len_000133.strings.txt", + "text_path": null, + "primary_label": "RDOOR_N", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 3, + "table_offset": 264, + "data_offset": 555563, + "declared_size": 525, + "next_offset": 556088, + "extracted_size": 525, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3029, + "zero_ratio": 0.5048, + "preview": "....9...........g.......................................9.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_003_table_0108_off_087A2B_len_00020D.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_003_table_0108_off_087A2B_len_00020D.strings.txt", + "text_path": null, + "primary_label": "BLACK16", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 4, + "table_offset": 408, + "data_offset": 66259, + "declared_size": 294, + "next_offset": 66553, + "extracted_size": 294, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1463, + "zero_ratio": 0.7551, + "preview": "....R.......&...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_004_table_0198_off_0102D3_len_000126.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_004_table_0198_off_0102D3_len_000126.strings.txt", + "text_path": null, + "primary_label": "ALARM_EW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 5, + "table_offset": 504, + "data_offset": 373237, + "declared_size": 442, + "next_offset": 373679, + "extracted_size": 442, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2715, + "zero_ratio": 0.5407, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_005_table_01F8_off_05B1F5_len_0001BA.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_005_table_01F8_off_05B1F5_len_0001BA.strings.txt", + "text_path": null, + "primary_label": "SMALLTAB", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 6, + "table_offset": 528, + "data_offset": 432425, + "declared_size": 750, + "next_offset": 433175, + "extracted_size": 750, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.332, + "zero_ratio": 0.424, + "preview": "................H...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_006_table_0210_off_069929_len_0002EE.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_006_table_0210_off_069929_len_0002EE.strings.txt", + "text_path": null, + "primary_label": "VALVE", + "field_names": [ + "referent", + "counter", + "item" + ], + "field_tags": [ + "24:FC02->item", + "69:0000->referent", + "69:FE00->counter" + ] + }, + { + "index": 7, + "table_offset": 704, + "data_offset": 266829, + "declared_size": 681, + "next_offset": 267510, + "extracted_size": 681, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.351, + "zero_ratio": 0.4097, + "preview": "........................................................_.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_007_table_02C0_off_04124D_len_0002A9.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_007_table_02C0_off_04124D_len_0002A9.strings.txt", + "text_path": null, + "primary_label": "MDOOR_E", + "field_names": [ + "referent", + "item", + "item2", + "door" + ], + "field_tags": [ + "24:FA02->door", + "24:FC02->item", + "24:FC02->item2", + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 8, + "table_offset": 728, + "data_offset": 66553, + "declared_size": 294, + "next_offset": 66847, + "extracted_size": 294, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1463, + "zero_ratio": 0.7551, + "preview": "....R.......&...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_008_table_02D8_off_0103F9_len_000126.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_008_table_02D8_off_0103F9_len_000126.strings.txt", + "text_path": null, + "primary_label": "ALARM_NS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 9, + "table_offset": 896, + "data_offset": 342601, + "declared_size": 1074, + "next_offset": 343675, + "extracted_size": 1074, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.405, + "zero_ratio": 0.3343, + "preview": "....^.......2...<.........................................8.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_009_table_0380_off_053A49_len_000432.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_009_table_0380_off_053A49_len_000432.strings.txt", + "text_path": null, + "primary_label": "RFANEW", + "field_names": [ + "referent", + "item", + "fart", + "fart2", + "fram", + "counter", + "counter2", + "wind" + ], + "field_tags": [ + "24:F602->wind", + "24:F802->item", + "24:FE02->item", + "69:0000->referent", + "69:FA00->counter", + "69:FA00->counter2", + "69:FA00->fart", + "69:FA00->fart2", + "69:FC00->counter", + "69:FC00->fart", + "69:FE00->fram" + ] + }, + { + "index": 10, + "table_offset": 904, + "data_offset": 525480, + "declared_size": 441, + "next_offset": 525921, + "extracted_size": 441, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2653, + "zero_ratio": 0.5578, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_010_table_0388_off_0804A8_len_0001B9.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_010_table_0388_off_0804A8_len_0001B9.strings.txt", + "text_path": null, + "primary_label": "FALLINGC", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 11, + "table_offset": 920, + "data_offset": 395831, + "declared_size": 385, + "next_offset": 396216, + "extracted_size": 385, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2494, + "zero_ratio": 0.6026, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_011_table_0398_off_060A37_len_000181.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_011_table_0398_off_060A37_len_000181.strings.txt", + "text_path": null, + "primary_label": "SWITCHEW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 12, + "table_offset": 1000, + "data_offset": 116482, + "declared_size": 740, + "next_offset": 117222, + "extracted_size": 740, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3608, + "zero_ratio": 0.4176, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_012_table_03E8_off_01C702_len_0002E4.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_012_table_03E8_off_01C702_len_0002E4.strings.txt", + "text_path": null, + "primary_label": "CONVEY_N", + "field_names": [ + "referent", + "xdir", + "ydir", + "item" + ], + "field_tags": [ + "24:FC02->item", + "62:FE00->ydir", + "62:FF00->xdir", + "69:0000->referent" + ] + }, + { + "index": 13, + "table_offset": 1040, + "data_offset": 474268, + "declared_size": 311, + "next_offset": 474579, + "extracted_size": 311, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1994, + "zero_ratio": 0.717, + "preview": "....c.......7...........................................c.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_013_table_0410_off_073C9C_len_000137.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_013_table_0410_off_073C9C_len_000137.strings.txt", + "text_path": null, + "primary_label": "YR2X6EW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 14, + "table_offset": 1128, + "data_offset": 324806, + "declared_size": 307, + "next_offset": 325113, + "extracted_size": 307, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1954, + "zero_ratio": 0.7264, + "preview": "...._.......3..........................................._.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_014_table_0468_off_04F4C6_len_000133.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_014_table_0468_off_04F4C6_len_000133.strings.txt", + "text_path": null, + "primary_label": "RDOOR_E", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 15, + "table_offset": 1168, + "data_offset": 91992, + "declared_size": 714, + "next_offset": 92706, + "extracted_size": 714, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3319, + "zero_ratio": 0.4328, + "preview": "................$...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_015_table_0490_off_016758_len_0002CA.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_015_table_0490_off_016758_len_0002CA.strings.txt", + "text_path": null, + "primary_label": "BOX_EW", + "field_names": [ + "referent", + "counter" + ], + "field_tags": [ + "69:0000->referent", + "69:FE00->counter" + ] + }, + { + "index": 16, + "table_offset": 1176, + "data_offset": 92706, + "declared_size": 714, + "next_offset": 93420, + "extracted_size": 714, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3319, + "zero_ratio": 0.4328, + "preview": "................$...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_016_table_0498_off_016A22_len_0002CA.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_016_table_0498_off_016A22_len_0002CA.strings.txt", + "text_path": null, + "primary_label": "BOX_NS", + "field_names": [ + "referent", + "counter" + ], + "field_tags": [ + "69:0000->referent", + "69:FE00->counter" + ] + }, + { + "index": 17, + "table_offset": 1232, + "data_offset": 473335, + "declared_size": 311, + "next_offset": 473646, + "extracted_size": 311, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2058, + "zero_ratio": 0.7106, + "preview": "....c.......7...........................................c.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_017_table_04D0_off_0738F7_len_000137.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_017_table_04D0_off_0738F7_len_000137.strings.txt", + "text_path": null, + "primary_label": "YR16X6EW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 18, + "table_offset": 1248, + "data_offset": 473646, + "declared_size": 311, + "next_offset": 473957, + "extracted_size": 311, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2058, + "zero_ratio": 0.7106, + "preview": "....c.......7...........................................c.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_018_table_04E0_off_073A2E_len_000137.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_018_table_04E0_off_073A2E_len_000137.strings.txt", + "text_path": null, + "primary_label": "YR16X6NS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 19, + "table_offset": 1256, + "data_offset": 475823, + "declared_size": 311, + "next_offset": 476134, + "extracted_size": 311, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1994, + "zero_ratio": 0.717, + "preview": "....c.......7...........................................c.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_019_table_04E8_off_0742AF_len_000137.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_019_table_04E8_off_0742AF_len_000137.strings.txt", + "text_path": null, + "primary_label": "YR8X6NS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 20, + "table_offset": 1264, + "data_offset": 475201, + "declared_size": 311, + "next_offset": 475512, + "extracted_size": 311, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1994, + "zero_ratio": 0.717, + "preview": "....c.......7...........................................c.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_020_table_04F0_off_074041_len_000137.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_020_table_04F0_off_074041_len_000137.strings.txt", + "text_path": null, + "primary_label": "YR4X6NS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 21, + "table_offset": 1272, + "data_offset": 474579, + "declared_size": 311, + "next_offset": 474890, + "extracted_size": 311, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1994, + "zero_ratio": 0.717, + "preview": "....c.......7...........................................c.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_021_table_04F8_off_073DD3_len_000137.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_021_table_04F8_off_073DD3_len_000137.strings.txt", + "text_path": null, + "primary_label": "YR2X6NS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 22, + "table_offset": 1288, + "data_offset": 257902, + "declared_size": 644, + "next_offset": 258546, + "extracted_size": 644, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3121, + "zero_ratio": 0.4208, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_022_table_0508_off_03EF6E_len_000284.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_022_table_0508_off_03EF6E_len_000284.strings.txt", + "text_path": null, + "primary_label": "LUGGAGE", + "field_names": [ + "ma0Q0", + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "45:0000->ma0Q0", + "69:0000->referent" + ] + }, + { + "index": 23, + "table_offset": 1304, + "data_offset": 475512, + "declared_size": 311, + "next_offset": 475823, + "extracted_size": 311, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1994, + "zero_ratio": 0.717, + "preview": "....c.......7...........................................c.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_023_table_0518_off_074178_len_000137.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_023_table_0518_off_074178_len_000137.strings.txt", + "text_path": null, + "primary_label": "YR8X6EW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 24, + "table_offset": 1312, + "data_offset": 474890, + "declared_size": 311, + "next_offset": 475201, + "extracted_size": 311, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1994, + "zero_ratio": 0.717, + "preview": "....c.......7...........................................c.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_024_table_0520_off_073F0A_len_000137.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_024_table_0520_off_073F0A_len_000137.strings.txt", + "text_path": null, + "primary_label": "YR4X6EW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 25, + "table_offset": 1320, + "data_offset": 473957, + "declared_size": 311, + "next_offset": 474268, + "extracted_size": 311, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1865, + "zero_ratio": 0.7299, + "preview": "....c.......7...........................................c.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_025_table_0528_off_073B65_len_000137.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_025_table_0528_off_073B65_len_000137.strings.txt", + "text_path": null, + "primary_label": "YR1X1", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 26, + "table_offset": 1328, + "data_offset": 316631, + "declared_size": 769, + "next_offset": 317400, + "extracted_size": 769, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3641, + "zero_ratio": 0.3862, + "preview": "....-...........................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_026_table_0530_off_04D4D7_len_000301.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_026_table_0530_off_04D4D7_len_000301.strings.txt", + "text_path": null, + "primary_label": "PEPSIEW", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 27, + "table_offset": 1336, + "data_offset": 227649, + "declared_size": 307, + "next_offset": 227956, + "extracted_size": 307, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.202, + "zero_ratio": 0.7199, + "preview": "...._.......3..........................................._.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_027_table_0538_off_037941_len_000133.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_027_table_0538_off_037941_len_000133.strings.txt", + "text_path": null, + "primary_label": "GDOOR_E2", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 28, + "table_offset": 1344, + "data_offset": 108711, + "declared_size": 366, + "next_offset": 109077, + "extracted_size": 366, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.224, + "zero_ratio": 0.6503, + "preview": "............n...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_028_table_0540_off_01A8A7_len_00016E.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_028_table_0540_off_01A8A7_len_00016E.strings.txt", + "text_path": null, + "primary_label": "CATWALK1", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 29, + "table_offset": 1368, + "data_offset": 228263, + "declared_size": 304, + "next_offset": 228567, + "extracted_size": 304, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2007, + "zero_ratio": 0.7237, + "preview": "....\\.......0...........................................\\.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_029_table_0558_off_037BA7_len_000130.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_029_table_0558_off_037BA7_len_000130.strings.txt", + "text_path": null, + "primary_label": "GDOOR_N2", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 30, + "table_offset": 1376, + "data_offset": 317400, + "declared_size": 769, + "next_offset": 318169, + "extracted_size": 769, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3654, + "zero_ratio": 0.3875, + "preview": "....-...........................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_030_table_0560_off_04D7D8_len_000301.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_030_table_0560_off_04D7D8_len_000301.strings.txt", + "text_path": null, + "primary_label": "PEPSINS", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 31, + "table_offset": 1432, + "data_offset": 316282, + "declared_size": 349, + "next_offset": 316631, + "extracted_size": 349, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1977, + "zero_ratio": 0.6648, + "preview": "............]...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_031_table_0598_off_04D37A_len_00015D.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_031_table_0598_off_04D37A_len_00015D.strings.txt", + "text_path": null, + "primary_label": "PANELNS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 32, + "table_offset": 1440, + "data_offset": 315933, + "declared_size": 349, + "next_offset": 316282, + "extracted_size": 349, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1948, + "zero_ratio": 0.6648, + "preview": "............]...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_032_table_05A0_off_04D21D_len_00015D.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_032_table_05A0_off_04D21D_len_00015D.strings.txt", + "text_path": null, + "primary_label": "PANELEW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 33, + "table_offset": 1496, + "data_offset": 267510, + "declared_size": 681, + "next_offset": 268191, + "extracted_size": 681, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.351, + "zero_ratio": 0.4112, + "preview": "........................................................_.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_033_table_05D8_off_0414F6_len_0002A9.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_033_table_05D8_off_0414F6_len_0002A9.strings.txt", + "text_path": null, + "primary_label": "MDOOR_N", + "field_names": [ + "referent", + "item", + "item2", + "door" + ], + "field_tags": [ + "24:FA02->door", + "24:FC02->item", + "24:FC02->item2", + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 34, + "table_offset": 1504, + "data_offset": 73770, + "declared_size": 307, + "next_offset": 74077, + "extracted_size": 307, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.202, + "zero_ratio": 0.7231, + "preview": "...._.......3..........................................._.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_034_table_05E0_off_01202A_len_000133.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_034_table_05E0_off_01202A_len_000133.strings.txt", + "text_path": null, + "primary_label": "BARRELUP", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 35, + "table_offset": 1632, + "data_offset": 370511, + "declared_size": 308, + "next_offset": 370819, + "extracted_size": 308, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1688, + "zero_ratio": 0.7273, + "preview": "....`.......4...............................`...................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_035_table_0660_off_05A74F_len_000134.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_035_table_0660_off_05A74F_len_000134.strings.txt", + "text_path": null, + "primary_label": "SIGNEW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 36, + "table_offset": 1640, + "data_offset": 370819, + "declared_size": 308, + "next_offset": 371127, + "extracted_size": 308, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1656, + "zero_ratio": 0.7273, + "preview": "....`.......4...............................`...................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_036_table_0668_off_05A883_len_000134.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_036_table_0668_off_05A883_len_000134.strings.txt", + "text_path": null, + "primary_label": "SIGNNS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 37, + "table_offset": 1656, + "data_offset": 343675, + "declared_size": 1074, + "next_offset": 344749, + "extracted_size": 1074, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.406, + "zero_ratio": 0.3343, + "preview": "....^.......2...<.........................................8.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_037_table_0678_off_053E7B_len_000432.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_037_table_0678_off_053E7B_len_000432.strings.txt", + "text_path": null, + "primary_label": "RFANNS", + "field_names": [ + "referent", + "item", + "fart", + "fart2", + "fram", + "counter", + "counter2", + "wind" + ], + "field_tags": [ + "24:F602->wind", + "24:F802->item", + "24:FE02->item", + "69:0000->referent", + "69:FA00->counter", + "69:FA00->counter2", + "69:FA00->fart", + "69:FA00->fart2", + "69:FC00->counter", + "69:FC00->fart", + "69:FE00->fram" + ] + }, + { + "index": 38, + "table_offset": 1704, + "data_offset": 487814, + "declared_size": 362, + "next_offset": 488176, + "extracted_size": 362, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2652, + "zero_ratio": 0.6298, + "preview": "............j..........................................._.8.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_038_table_06A8_off_077186_len_00016A.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_038_table_06A8_off_077186_len_00016A.strings.txt", + "text_path": null, + "primary_label": "RDOOR1_E", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 39, + "table_offset": 1712, + "data_offset": 488176, + "declared_size": 362, + "next_offset": 488538, + "extracted_size": 362, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2652, + "zero_ratio": 0.6298, + "preview": "............j..........................................._.8.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_039_table_06B0_off_0772F0_len_00016A.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_039_table_06B0_off_0772F0_len_00016A.strings.txt", + "text_path": null, + "primary_label": "RDOOR2_E", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 40, + "table_offset": 1720, + "data_offset": 488538, + "declared_size": 362, + "next_offset": 488900, + "extracted_size": 362, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2652, + "zero_ratio": 0.6298, + "preview": "............j..........................................._.8.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_040_table_06B8_off_07745A_len_00016A.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_040_table_06B8_off_07745A_len_00016A.strings.txt", + "text_path": null, + "primary_label": "RDOOR3_E", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 41, + "table_offset": 1728, + "data_offset": 488900, + "declared_size": 362, + "next_offset": 489262, + "extracted_size": 362, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2652, + "zero_ratio": 0.6298, + "preview": "............j..........................................._.8.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_041_table_06C0_off_0775C4_len_00016A.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_041_table_06C0_off_0775C4_len_00016A.strings.txt", + "text_path": null, + "primary_label": "RDOOR4_E", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 42, + "table_offset": 1736, + "data_offset": 489262, + "declared_size": 362, + "next_offset": 489624, + "extracted_size": 362, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2652, + "zero_ratio": 0.6298, + "preview": "............j..........................................._.8.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_042_table_06C8_off_07772E_len_00016A.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_042_table_06C8_off_07772E_len_00016A.strings.txt", + "text_path": null, + "primary_label": "RDOOR5_E", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 43, + "table_offset": 1816, + "data_offset": 98433, + "declared_size": 438, + "next_offset": 98871, + "extracted_size": 438, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2603, + "zero_ratio": 0.5616, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_043_table_0718_off_018081_len_0001B6.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_043_table_0718_off_018081_len_0001B6.strings.txt", + "text_path": null, + "primary_label": "BROKENCW", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 44, + "table_offset": 2056, + "data_offset": 390275, + "declared_size": 724, + "next_offset": 390999, + "extracted_size": 724, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3812, + "zero_ratio": 0.4116, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_044_table_0808_off_05F483_len_0002D4.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_044_table_0808_off_05F483_len_0002D4.strings.txt", + "text_path": null, + "primary_label": "STELEPAD", + "field_names": [ + "referent", + "item", + "tele" + ], + "field_tags": [ + "24:FE02->item", + "24:FE02->tele", + "69:0000->referent" + ] + }, + { + "index": 45, + "table_offset": 2208, + "data_offset": 300391, + "declared_size": 880, + "next_offset": 301271, + "extracted_size": 880, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4523, + "zero_ratio": 0.3364, + "preview": "............p...\".........b.............................:.c.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_045_table_08A0_off_049567_len_000370.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_045_table_08A0_off_049567_len_000370.strings.txt", + "text_path": null, + "primary_label": "MONITNS", + "field_names": [ + "referent", + "textFile", + "valueBox", + "passcode", + "link", + "boxCounter" + ], + "field_tags": [ + "24:FC02->valueBox", + "69:0000->referent", + "69:F600->boxCounter", + "69:F800->link", + "69:FA00->passcode", + "6D:6520->link", + "73:FE00->textFile" + ] + }, + { + "index": 46, + "table_offset": 2256, + "data_offset": 226620, + "declared_size": 722, + "next_offset": 227342, + "extracted_size": 722, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4114, + "zero_ratio": 0.3961, + "preview": "........................................................N.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_046_table_08D0_off_03753C_len_0002D2.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_046_table_08D0_off_03753C_len_0002D2.strings.txt", + "text_path": null, + "primary_label": "GATGUNNS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 47, + "table_offset": 2296, + "data_offset": 234886, + "declared_size": 724, + "next_offset": 235610, + "extracted_size": 724, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3812, + "zero_ratio": 0.4116, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_047_table_08F8_off_039586_len_0002D4.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_047_table_08F8_off_039586_len_0002D4.strings.txt", + "text_path": null, + "primary_label": "GTELEPAD", + "field_names": [ + "referent", + "item", + "tele" + ], + "field_tags": [ + "24:FE02->item", + "24:FE02->tele", + "69:0000->referent" + ] + }, + { + "index": 48, + "table_offset": 2344, + "data_offset": 225898, + "declared_size": 722, + "next_offset": 226620, + "extracted_size": 722, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4114, + "zero_ratio": 0.3961, + "preview": "........................................................N.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_048_table_0928_off_03726A_len_0002D2.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_048_table_0928_off_03726A_len_0002D2.strings.txt", + "text_path": null, + "primary_label": "GATGUNEW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 49, + "table_offset": 2448, + "data_offset": 205397, + "declared_size": 695, + "next_offset": 206092, + "extracted_size": 695, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3683, + "zero_ratio": 0.4029, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_049_table_0990_off_032255_len_0002B7.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_049_table_0990_off_032255_len_0002B7.strings.txt", + "text_path": null, + "primary_label": "FASTSKIL", + "field_names": [ + "referent", + "skill" + ], + "field_tags": [ + "69:0000->referent", + "69:FE00->skill" + ] + }, + { + "index": 50, + "table_offset": 2568, + "data_offset": 187722, + "declared_size": 1096, + "next_offset": 188818, + "extracted_size": 1096, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4416, + "zero_ratio": 0.333, + "preview": "....t.......H...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_050_table_0A08_off_02DD4A_len_000448.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_050_table_0A08_off_02DD4A_len_000448.strings.txt", + "text_path": null, + "primary_label": "ELEVPLAT", + "field_names": [ + "referent", + "cargo" + ], + "field_tags": [ + "24:FE02->cargo", + "69:0000->referent" + ] + }, + { + "index": 51, + "table_offset": 2592, + "data_offset": 109077, + "declared_size": 549, + "next_offset": 109626, + "extracted_size": 549, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2787, + "zero_ratio": 0.4791, + "preview": "....Q.......%...........................................Q.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_051_table_0A20_off_01AA15_len_000225.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_051_table_0A20_off_01AA15_len_000225.strings.txt", + "text_path": null, + "primary_label": "CATWALK2", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 52, + "table_offset": 2600, + "data_offset": 254364, + "declared_size": 1994, + "next_offset": 256358, + "extracted_size": 1994, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4147, + "zero_ratio": 0.3074, + "preview": "................,...........F.............................m.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_052_table_0A28_off_03E19C_len_0007CA.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_052_table_0A28_off_03E19C_len_0007CA.strings.txt", + "text_path": null, + "primary_label": "LIFT", + "field_names": [ + "referent", + "item", + "counter", + "total", + "cargo", + "cargoType" + ], + "field_tags": [ + "24:F302->cargo", + "24:FE02->item", + "69:0000->referent", + "69:F100->cargo", + "69:F100->cargoType", + "69:FC00->total", + "69:FE00->counter" + ] + }, + { + "index": 53, + "table_offset": 2608, + "data_offset": 115742, + "declared_size": 740, + "next_offset": 116482, + "extracted_size": 740, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3608, + "zero_ratio": 0.4176, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_053_table_0A30_off_01C41E_len_0002E4.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_053_table_0A30_off_01C41E_len_0002E4.strings.txt", + "text_path": null, + "primary_label": "CONVEY_E", + "field_names": [ + "referent", + "xdir", + "ydir", + "item" + ], + "field_tags": [ + "24:FC02->item", + "62:FE00->ydir", + "62:FF00->xdir", + "69:0000->referent" + ] + }, + { + "index": 54, + "table_offset": 2616, + "data_offset": 206092, + "declared_size": 1387, + "next_offset": 207479, + "extracted_size": 1387, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4636, + "zero_ratio": 0.2884, + "preview": "............k...u...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_054_table_0A38_off_03250C_len_00056B.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_054_table_0A38_off_03250C_len_00056B.strings.txt", + "text_path": null, + "primary_label": "FFFLOOR", + "field_names": [ + "referent", + "fffloor", + "item" + ], + "field_tags": [ + "24:FC02->fffloor", + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 55, + "table_offset": 2624, + "data_offset": 336287, + "declared_size": 723, + "next_offset": 337010, + "extracted_size": 723, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.379, + "zero_ratio": 0.3721, + "preview": "................-...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_055_table_0A40_off_05219F_len_0002D3.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_055_table_0A40_off_05219F_len_0002D3.strings.txt", + "text_path": null, + "primary_label": "RECHAGNS", + "field_names": [ + "ma0Q", + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "4E:5300->ma0Q", + "69:0000->referent" + ] + }, + { + "index": 56, + "table_offset": 2640, + "data_offset": 337921, + "declared_size": 911, + "next_offset": 338832, + "extracted_size": 911, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4029, + "zero_ratio": 0.348, + "preview": "................A.......................................U.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_056_table_0A50_off_052801_len_00038F.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_056_table_0A50_off_052801_len_00038F.strings.txt", + "text_path": null, + "primary_label": "RECHFLNS", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 57, + "table_offset": 2712, + "data_offset": 524196, + "declared_size": 620, + "next_offset": 524816, + "extracted_size": 620, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3306, + "zero_ratio": 0.4403, + "preview": "............l...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_057_table_0A98_off_07FFA4_len_00026C.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_057_table_0A98_off_07FFA4_len_00026C.strings.txt", + "text_path": null, + "primary_label": "FIGHT_N2", + "field_names": [ + "ma0Q3", + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "4E:3200->ma0Q3", + "69:0000->referent" + ] + }, + { + "index": 58, + "table_offset": 2832, + "data_offset": 134295, + "declared_size": 345, + "next_offset": 134640, + "extracted_size": 345, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2406, + "zero_ratio": 0.6551, + "preview": "............Y...........................................N.8.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_058_table_0B10_off_020C97_len_000159.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_058_table_0B10_off_020C97_len_000159.strings.txt", + "text_path": null, + "primary_label": "DEATHFL3", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 59, + "table_offset": 2840, + "data_offset": 73156, + "declared_size": 307, + "next_offset": 73463, + "extracted_size": 307, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1954, + "zero_ratio": 0.7296, + "preview": "...._.......3..........................................._.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_059_table_0B18_off_011DC4_len_000133.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_059_table_0B18_off_011DC4_len_000133.strings.txt", + "text_path": null, + "primary_label": "BARRELS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 60, + "table_offset": 2848, + "data_offset": 72542, + "declared_size": 307, + "next_offset": 72849, + "extracted_size": 307, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.202, + "zero_ratio": 0.7231, + "preview": "...._.......3..........................................._.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_060_table_0B20_off_011B5E_len_000133.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_060_table_0B20_off_011B5E_len_000133.strings.txt", + "text_path": null, + "primary_label": "BARRELNS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 61, + "table_offset": 2856, + "data_offset": 72235, + "declared_size": 307, + "next_offset": 72542, + "extracted_size": 307, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.202, + "zero_ratio": 0.7231, + "preview": "...._.......3..........................................._.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_061_table_0B28_off_011A2B_len_000133.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_061_table_0B28_off_011A2B_len_000133.strings.txt", + "text_path": null, + "primary_label": "BARRELEW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 62, + "table_offset": 2864, + "data_offset": 72849, + "declared_size": 307, + "next_offset": 73156, + "extracted_size": 307, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.202, + "zero_ratio": 0.7231, + "preview": "...._.......3..........................................._.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_062_table_0B30_off_011C91_len_000133.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_062_table_0B30_off_011C91_len_000133.strings.txt", + "text_path": null, + "primary_label": "BARRELNW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 63, + "table_offset": 2872, + "data_offset": 73463, + "declared_size": 307, + "next_offset": 73770, + "extracted_size": 307, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.202, + "zero_ratio": 0.7231, + "preview": "...._.......3..........................................._.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_063_table_0B38_off_011EF7_len_000133.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_063_table_0B38_off_011EF7_len_000133.strings.txt", + "text_path": null, + "primary_label": "BARRELSE", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 64, + "table_offset": 2896, + "data_offset": 335564, + "declared_size": 723, + "next_offset": 336287, + "extracted_size": 723, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.379, + "zero_ratio": 0.3721, + "preview": "................-...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_064_table_0B50_off_051ECC_len_0002D3.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_064_table_0B50_off_051ECC_len_0002D3.strings.txt", + "text_path": null, + "primary_label": "RECHAGEW", + "field_names": [ + "ma0Q", + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "45:5700->ma0Q", + "69:0000->referent" + ] + }, + { + "index": 65, + "table_offset": 2912, + "data_offset": 337010, + "declared_size": 911, + "next_offset": 337921, + "extracted_size": 911, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4029, + "zero_ratio": 0.348, + "preview": "................A.......................................U.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_065_table_0B60_off_052472_len_00038F.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_065_table_0B60_off_052472_len_00038F.strings.txt", + "text_path": null, + "primary_label": "RECHFLEW", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 66, + "table_offset": 2936, + "data_offset": 236176, + "declared_size": 497, + "next_offset": 236673, + "extracted_size": 497, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2998, + "zero_ratio": 0.5332, + "preview": "................K...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_066_table_0B78_off_039A90_len_0001F1.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_066_table_0B78_off_039A90_len_0001F1.strings.txt", + "text_path": null, + "primary_label": "G_POOL", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 67, + "table_offset": 2944, + "data_offset": 476134, + "declared_size": 494, + "next_offset": 476628, + "extracted_size": 494, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2996, + "zero_ratio": 0.5324, + "preview": "................H...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_067_table_0B80_off_0743E6_len_0001EE.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_067_table_0B80_off_0743E6_len_0001EE.strings.txt", + "text_path": null, + "primary_label": "Y_POOL", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 68, + "table_offset": 3000, + "data_offset": 299511, + "declared_size": 880, + "next_offset": 300391, + "extracted_size": 880, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4511, + "zero_ratio": 0.3364, + "preview": "............p...\".........b.............................:.c.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_068_table_0BB8_off_0491F7_len_000370.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_068_table_0BB8_off_0491F7_len_000370.strings.txt", + "text_path": null, + "primary_label": "MONITEW", + "field_names": [ + "referent", + "textFile", + "valueBox", + "passcode", + "link", + "boxCounter" + ], + "field_tags": [ + "24:FC02->valueBox", + "69:0000->referent", + "69:F600->boxCounter", + "69:F800->link", + "69:FA00->passcode", + "6D:6520->link", + "73:FE00->textFile" + ] + }, + { + "index": 69, + "table_offset": 3016, + "data_offset": 408187, + "declared_size": 287, + "next_offset": 408474, + "extracted_size": 287, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1324, + "zero_ratio": 0.77, + "preview": "....K...........y...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_069_table_0BC8_off_063A7B_len_00011F.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_069_table_0BC8_off_063A7B_len_00011F.strings.txt", + "text_path": null, + "primary_label": "THERM", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 70, + "table_offset": 3120, + "data_offset": 499493, + "declared_size": 294, + "next_offset": 499787, + "extracted_size": 294, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1531, + "zero_ratio": 0.7551, + "preview": "....R.......&...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_070_table_0C30_off_079F25_len_000126.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_070_table_0C30_off_079F25_len_000126.strings.txt", + "text_path": null, + "primary_label": "MALRM_NS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 71, + "table_offset": 3208, + "data_offset": 209451, + "declared_size": 664, + "next_offset": 210115, + "extracted_size": 664, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3614, + "zero_ratio": 0.4157, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_071_table_0C88_off_03322B_len_000298.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_071_table_0C88_off_03322B_len_000298.strings.txt", + "text_path": null, + "primary_label": "FIGHT_NS", + "field_names": [ + "ma0Q3", + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "4E:5300->ma0Q3", + "69:0000->referent" + ] + }, + { + "index": 72, + "table_offset": 3216, + "data_offset": 524816, + "declared_size": 664, + "next_offset": 525480, + "extracted_size": 664, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3599, + "zero_ratio": 0.4157, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_072_table_0C90_off_080210_len_000298.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_072_table_0C90_off_080210_len_000298.strings.txt", + "text_path": null, + "primary_label": "FIGHT_N3", + "field_names": [ + "ma0Q3", + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "4E:3300->ma0Q3", + "69:0000->referent" + ] + }, + { + "index": 73, + "table_offset": 3240, + "data_offset": 523576, + "declared_size": 620, + "next_offset": 524196, + "extracted_size": 620, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3306, + "zero_ratio": 0.4403, + "preview": "............l...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_073_table_0CA8_off_07FD38_len_00026C.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_073_table_0CA8_off_07FD38_len_00026C.strings.txt", + "text_path": null, + "primary_label": "FIGHT_N1", + "field_names": [ + "ma0Q3", + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "4E:3100->ma0Q3", + "69:0000->referent" + ] + }, + { + "index": 74, + "table_offset": 3280, + "data_offset": 358051, + "declared_size": 724, + "next_offset": 358775, + "extracted_size": 724, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3812, + "zero_ratio": 0.4116, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_074_table_0CD0_off_0576A3_len_0002D4.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_074_table_0CD0_off_0576A3_len_0002D4.strings.txt", + "text_path": null, + "primary_label": "RTELEPAD", + "field_names": [ + "referent", + "item", + "tele" + ], + "field_tags": [ + "24:FE02->item", + "24:FE02->tele", + "69:0000->referent" + ] + }, + { + "index": 75, + "table_offset": 3328, + "data_offset": 304693, + "declared_size": 724, + "next_offset": 305417, + "extracted_size": 724, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3812, + "zero_ratio": 0.4116, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_075_table_0D00_off_04A635_len_0002D4.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_075_table_0D00_off_04A635_len_0002D4.strings.txt", + "text_path": null, + "primary_label": "MTELEPAD", + "field_names": [ + "referent", + "item", + "tele" + ], + "field_tags": [ + "24:FE02->item", + "24:FE02->tele", + "69:0000->referent" + ] + }, + { + "index": 76, + "table_offset": 3336, + "data_offset": 522956, + "declared_size": 620, + "next_offset": 523576, + "extracted_size": 620, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3258, + "zero_ratio": 0.4403, + "preview": "............l...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_076_table_0D08_off_07FACC_len_00026C.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_076_table_0D08_off_07FACC_len_00026C.strings.txt", + "text_path": null, + "primary_label": "FIGHT_E3", + "field_names": [ + "ma0Q3", + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "45:3300->ma0Q3", + "69:0000->referent" + ] + }, + { + "index": 77, + "table_offset": 3384, + "data_offset": 521716, + "declared_size": 620, + "next_offset": 522336, + "extracted_size": 620, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3258, + "zero_ratio": 0.4403, + "preview": "............l...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_077_table_0D38_off_07F5F4_len_00026C.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_077_table_0D38_off_07F5F4_len_00026C.strings.txt", + "text_path": null, + "primary_label": "FIGHT_E1", + "field_names": [ + "ma0Q3", + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "45:3100->ma0Q3", + "69:0000->referent" + ] + }, + { + "index": 78, + "table_offset": 3392, + "data_offset": 522336, + "declared_size": 620, + "next_offset": 522956, + "extracted_size": 620, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3274, + "zero_ratio": 0.4403, + "preview": "............l...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_078_table_0D40_off_07F860_len_00026C.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_078_table_0D40_off_07F860_len_00026C.strings.txt", + "text_path": null, + "primary_label": "FIGHT_E2", + "field_names": [ + "ma0Q3", + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "45:3200->ma0Q3", + "69:0000->referent" + ] + }, + { + "index": 79, + "table_offset": 3408, + "data_offset": 320271, + "declared_size": 612, + "next_offset": 320883, + "extracted_size": 612, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3268, + "zero_ratio": 0.4641, + "preview": "............d...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_079_table_0D50_off_04E30F_len_000264.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_079_table_0D50_off_04E30F_len_000264.strings.txt", + "text_path": null, + "primary_label": "PPLATE", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 80, + "table_offset": 3416, + "data_offset": 320883, + "declared_size": 997, + "next_offset": 321880, + "extracted_size": 997, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4032, + "zero_ratio": 0.3551, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_080_table_0D58_off_04E573_len_0003E5.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_080_table_0D58_off_04E573_len_0003E5.strings.txt", + "text_path": null, + "primary_label": "PPLATE2", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FC02->item", + "69:0000->referent" + ] + }, + { + "index": 81, + "table_offset": 3424, + "data_offset": 208831, + "declared_size": 620, + "next_offset": 209451, + "extracted_size": 620, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3258, + "zero_ratio": 0.4403, + "preview": "............l...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_081_table_0D60_off_032FBF_len_00026C.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_081_table_0D60_off_032FBF_len_00026C.strings.txt", + "text_path": null, + "primary_label": "FIGHT_EW", + "field_names": [ + "ma0Q3", + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "45:5700->ma0Q3", + "69:0000->referent" + ] + }, + { + "index": 82, + "table_offset": 3432, + "data_offset": 253207, + "declared_size": 1157, + "next_offset": 254364, + "extracted_size": 1157, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3786, + "zero_ratio": 0.3155, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_082_table_0D68_off_03DD17_len_000485.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_082_table_0D68_off_03DD17_len_000485.strings.txt", + "text_path": null, + "primary_label": "LAZERNS", + "field_names": [ + "referent", + "fram", + "item" + ], + "field_tags": [ + "24:FC02->item", + "69:0000->referent", + "69:FE00->fram" + ] + }, + { + "index": 83, + "table_offset": 3440, + "data_offset": 252047, + "declared_size": 1160, + "next_offset": 253207, + "extracted_size": 1160, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.381, + "zero_ratio": 0.3164, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_083_table_0D70_off_03D88F_len_000488.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_083_table_0D70_off_03D88F_len_000488.strings.txt", + "text_path": null, + "primary_label": "LAZEREW", + "field_names": [ + "referent", + "fram", + "item" + ], + "field_tags": [ + "24:FC02->item", + "69:0000->referent", + "69:FE00->fram" + ] + }, + { + "index": 84, + "table_offset": 3488, + "data_offset": 324538, + "declared_size": 268, + "next_offset": 324806, + "extracted_size": 268, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1157, + "zero_ratio": 0.8097, + "preview": "....8...........f...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_084_table_0DA0_off_04F3BA_len_00010C.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_084_table_0DA0_off_04F3BA_len_00010C.strings.txt", + "text_path": null, + "primary_label": "RADAR", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 85, + "table_offset": 3520, + "data_offset": 357764, + "declared_size": 287, + "next_offset": 358051, + "extracted_size": 287, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1429, + "zero_ratio": 0.7596, + "preview": "....K...........y...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_085_table_0DC0_off_057584_len_00011F.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_085_table_0DC0_off_057584_len_00011F.strings.txt", + "text_path": null, + "primary_label": "RSTATION", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 86, + "table_offset": 3576, + "data_offset": 245930, + "declared_size": 382, + "next_offset": 246312, + "extracted_size": 382, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2225, + "zero_ratio": 0.6283, + "preview": "............~...0.........L.................^.M.................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_086_table_0DF8_off_03C0AA_len_00017E.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_086_table_0DF8_off_03C0AA_len_00017E.strings.txt", + "text_path": null, + "primary_label": "JOHN", + "field_names": [ + "referent", + "fram" + ], + "field_tags": [ + "69:0000->referent", + "69:FE00->fram" + ] + }, + { + "index": 87, + "table_offset": 3632, + "data_offset": 191585, + "declared_size": 283, + "next_offset": 191868, + "extracted_size": 283, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1519, + "zero_ratio": 0.7562, + "preview": "....G...........u...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_087_table_0E30_off_02EC61_len_00011B.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_087_table_0E30_off_02EC61_len_00011B.strings.txt", + "text_path": null, + "primary_label": "ENFORCER", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 88, + "table_offset": 3648, + "data_offset": 101922, + "declared_size": 1607, + "next_offset": 103529, + "extracted_size": 1607, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4449, + "zero_ratio": 0.2862, + "preview": "....s.......G...Q...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_088_table_0E40_off_018E22_len_000647.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_088_table_0E40_off_018E22_len_000647.strings.txt", + "text_path": null, + "primary_label": "CAMERACO", + "field_names": [ + "referent", + "delay", + "iSeeYou", + "trackedEnough", + "fram", + "counter", + "sawCrusader", + "movement", + "target", + "range" + ], + "field_tags": [ + "24:F002->target", + "69:0000->referent", + "69:EE00->range", + "69:F200->movement", + "69:F400->sawCrusader", + "69:F600->counter", + "69:F800->fram", + "69:FA00->trackedEnough", + "69:FC00->iSeeYou", + "69:FE00->delay" + ] + }, + { + "index": 89, + "table_offset": 3656, + "data_offset": 302714, + "declared_size": 1076, + "next_offset": 303790, + "extracted_size": 1076, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4275, + "zero_ratio": 0.3467, + "preview": "....`.......4...>.........................................u.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_089_table_0E48_off_049E7A_len_000434.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_089_table_0E48_off_049E7A_len_000434.strings.txt", + "text_path": null, + "primary_label": "MOTION", + "field_names": [ + "referent", + "trackedEnough", + "fram", + "movement", + "foundTarget", + "delay", + "iSeeYou" + ], + "field_tags": [ + "62:F900->foundTarget", + "69:0000->referent", + "69:F500->iSeeYou", + "69:F700->delay", + "69:FA00->movement", + "69:FC00->fram", + "69:FE00->trackedEnough" + ] + }, + { + "index": 90, + "table_offset": 3664, + "data_offset": 105130, + "declared_size": 1601, + "next_offset": 106731, + "extracted_size": 1601, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4466, + "zero_ratio": 0.2867, + "preview": "....m.......A...K...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_090_table_0E50_off_019AAA_len_000641.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_090_table_0E50_off_019AAA_len_000641.strings.txt", + "text_path": null, + "primary_label": "CAMERANS", + "field_names": [ + "referent", + "delay", + "iSeeYou", + "trackedEnough", + "fram", + "counter", + "sawCrusader", + "movement", + "target", + "range" + ], + "field_tags": [ + "24:F002->target", + "69:0000->referent", + "69:EE00->range", + "69:F200->movement", + "69:F400->sawCrusader", + "69:F600->counter", + "69:F800->fram", + "69:FA00->trackedEnough", + "69:FC00->iSeeYou", + "69:FE00->delay" + ] + }, + { + "index": 91, + "table_offset": 3672, + "data_offset": 106731, + "declared_size": 722, + "next_offset": 107453, + "extracted_size": 722, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3934, + "zero_ratio": 0.4155, + "preview": "........................................................N.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_091_table_0E58_off_01A0EB_len_0002D2.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_091_table_0E58_off_01A0EB_len_0002D2.strings.txt", + "text_path": null, + "primary_label": "CAM_EW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 92, + "table_offset": 3680, + "data_offset": 107453, + "declared_size": 722, + "next_offset": 108175, + "extracted_size": 722, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3934, + "zero_ratio": 0.4155, + "preview": "........................................................N.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_092_table_0E60_off_01A3BD_len_0002D2.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_092_table_0E60_off_01A3BD_len_0002D2.strings.txt", + "text_path": null, + "primary_label": "CAM_NS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 93, + "table_offset": 3696, + "data_offset": 225630, + "declared_size": 268, + "next_offset": 225898, + "extracted_size": 268, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1269, + "zero_ratio": 0.7985, + "preview": "....8...........f...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_093_table_0E70_off_03715E_len_00010C.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_093_table_0E70_off_03715E_len_00010C.strings.txt", + "text_path": null, + "primary_label": "FUSREACT", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 94, + "table_offset": 3720, + "data_offset": 411947, + "declared_size": 768, + "next_offset": 412715, + "extracted_size": 768, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3854, + "zero_ratio": 0.388, + "preview": "....,.....................................................L.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_094_table_0E88_off_06492B_len_000300.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_094_table_0E88_off_06492B_len_000300.strings.txt", + "text_path": null, + "primary_label": "TRANSFOR", + "field_names": [ + "referent", + "fram", + "damagePoints", + "item" + ], + "field_tags": [ + "24:FA02->item", + "69:0000->referent", + "69:FC00->damagePoints", + "69:FE00->fram" + ] + }, + { + "index": 95, + "table_offset": 3744, + "data_offset": 366717, + "declared_size": 446, + "next_offset": 367163, + "extracted_size": 446, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2937, + "zero_ratio": 0.5448, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_095_table_0EA0_off_05987D_len_0001BE.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_095_table_0EA0_off_05987D_len_0001BE.strings.txt", + "text_path": null, + "primary_label": "SHOCKEW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 96, + "table_offset": 3792, + "data_offset": 207479, + "declared_size": 1352, + "next_offset": 208831, + "extracted_size": 1352, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4667, + "zero_ratio": 0.2833, + "preview": "....t.......H...R...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_096_table_0ED0_off_032A77_len_000548.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_096_table_0ED0_off_032A77_len_000548.strings.txt", + "text_path": null, + "primary_label": "FFFLOOR2", + "field_names": [ + "referent", + "fffloor", + "item" + ], + "field_tags": [ + "24:FC02->fffloor", + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 97, + "table_offset": 3800, + "data_offset": 367669, + "declared_size": 446, + "next_offset": 368115, + "extracted_size": 446, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2937, + "zero_ratio": 0.5448, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_097_table_0ED8_off_059C35_len_0001BE.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_097_table_0ED8_off_059C35_len_0001BE.strings.txt", + "text_path": null, + "primary_label": "SHOCKNS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 98, + "table_offset": 3816, + "data_offset": 262255, + "declared_size": 599, + "next_offset": 262854, + "extracted_size": 599, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3539, + "zero_ratio": 0.4775, + "preview": "............W...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_098_table_0EE8_off_04006F_len_000257.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_098_table_0EE8_off_04006F_len_000257.strings.txt", + "text_path": null, + "primary_label": "L_NS-2", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 99, + "table_offset": 3824, + "data_offset": 262854, + "declared_size": 599, + "next_offset": 263453, + "extracted_size": 599, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3539, + "zero_ratio": 0.4775, + "preview": "............W...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_099_table_0EF0_off_0402C6_len_000257.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_099_table_0EF0_off_0402C6_len_000257.strings.txt", + "text_path": null, + "primary_label": "L_NS-4", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 100, + "table_offset": 3832, + "data_offset": 364350, + "declared_size": 814, + "next_offset": 365164, + "extracted_size": 814, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4115, + "zero_ratio": 0.387, + "preview": "....Z...........@.......................................N.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_100_table_0EF8_off_058F3E_len_00032E.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_100_table_0EF8_off_058F3E_len_00032E.strings.txt", + "text_path": null, + "primary_label": "SENTRY", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 101, + "table_offset": 3840, + "data_offset": 263453, + "declared_size": 599, + "next_offset": 264052, + "extracted_size": 599, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3539, + "zero_ratio": 0.4775, + "preview": "............W...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_101_table_0F00_off_04051D_len_000257.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_101_table_0F00_off_04051D_len_000257.strings.txt", + "text_path": null, + "primary_label": "L_NS-8", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 102, + "table_offset": 3848, + "data_offset": 261656, + "declared_size": 599, + "next_offset": 262255, + "extracted_size": 599, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3639, + "zero_ratio": 0.4674, + "preview": "............W...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_102_table_0F08_off_03FE18_len_000257.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_102_table_0F08_off_03FE18_len_000257.strings.txt", + "text_path": null, + "primary_label": "L_NS-16", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 103, + "table_offset": 3856, + "data_offset": 259859, + "declared_size": 599, + "next_offset": 260458, + "extracted_size": 599, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3539, + "zero_ratio": 0.4775, + "preview": "............W...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_103_table_0F10_off_03F713_len_000257.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_103_table_0F10_off_03F713_len_000257.strings.txt", + "text_path": null, + "primary_label": "L_EW-2", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 104, + "table_offset": 3864, + "data_offset": 260458, + "declared_size": 599, + "next_offset": 261057, + "extracted_size": 599, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3539, + "zero_ratio": 0.4775, + "preview": "............W...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_104_table_0F18_off_03F96A_len_000257.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_104_table_0F18_off_03F96A_len_000257.strings.txt", + "text_path": null, + "primary_label": "L_EW-4", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 105, + "table_offset": 3872, + "data_offset": 261057, + "declared_size": 599, + "next_offset": 261656, + "extracted_size": 599, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3539, + "zero_ratio": 0.4775, + "preview": "............W...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_105_table_0F20_off_03FBC1_len_000257.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_105_table_0F20_off_03FBC1_len_000257.strings.txt", + "text_path": null, + "primary_label": "L_EW-8", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 106, + "table_offset": 3880, + "data_offset": 259260, + "declared_size": 599, + "next_offset": 259859, + "extracted_size": 599, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3623, + "zero_ratio": 0.4674, + "preview": "............W...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_106_table_0F28_off_03F4BC_len_000257.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_106_table_0F28_off_03F4BC_len_000257.strings.txt", + "text_path": null, + "primary_label": "L_EW-16", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 107, + "table_offset": 3888, + "data_offset": 265879, + "declared_size": 475, + "next_offset": 266354, + "extracted_size": 475, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2821, + "zero_ratio": 0.52, + "preview": "................5...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_107_table_0F30_off_040E97_len_0001DB.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_107_table_0F30_off_040E97_len_0001DB.strings.txt", + "text_path": null, + "primary_label": "MDESKEW", + "field_names": [ + "referent", + "fram", + "item" + ], + "field_tags": [ + "24:FC02->item", + "69:0000->referent", + "69:FE00->fram" + ] + }, + { + "index": 108, + "table_offset": 3896, + "data_offset": 250115, + "declared_size": 716, + "next_offset": 250831, + "extracted_size": 716, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3589, + "zero_ratio": 0.4106, + "preview": "................&...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_108_table_0F38_off_03D103_len_0002CC.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_108_table_0F38_off_03D103_len_0002CC.strings.txt", + "text_path": null, + "primary_label": "LASERI", + "field_names": [ + "referent", + "laser", + "hType" + ], + "field_tags": [ + "24:FE02->laser", + "69:0000->referent", + "69:FC00->hType" + ] + }, + { + "index": 109, + "table_offset": 3904, + "data_offset": 100455, + "declared_size": 680, + "next_offset": 101135, + "extracted_size": 680, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3515, + "zero_ratio": 0.4324, + "preview": "................Z...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_109_table_0F40_off_018867_len_0002A8.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_109_table_0F40_off_018867_len_0002A8.strings.txt", + "text_path": null, + "primary_label": "BUBBLE", + "field_names": [ + "referent", + "counter" + ], + "field_tags": [ + "69:0000->referent", + "69:FE00->counter" + ] + }, + { + "index": 110, + "table_offset": 3912, + "data_offset": 103529, + "declared_size": 1601, + "next_offset": 105130, + "extracted_size": 1601, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.446, + "zero_ratio": 0.2873, + "preview": "....m.......A...K...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_110_table_0F48_off_019469_len_000641.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_110_table_0F48_off_019469_len_000641.strings.txt", + "text_path": null, + "primary_label": "CAMERAEW", + "field_names": [ + "referent", + "delay", + "iSeeYou", + "trackedEnough", + "fram", + "counter", + "sawCrusader", + "movement", + "target", + "range" + ], + "field_tags": [ + "24:F002->target", + "69:0000->referent", + "69:EE00->range", + "69:F200->movement", + "69:F400->sawCrusader", + "69:F600->counter", + "69:F800->fram", + "69:FA00->trackedEnough", + "69:FC00->iSeeYou", + "69:FE00->delay" + ] + }, + { + "index": 111, + "table_offset": 3944, + "data_offset": 552605, + "declared_size": 2958, + "next_offset": 555563, + "extracted_size": 2958, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4533, + "zero_ratio": 0.2302, + "preview": "..........................................................M.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_111_table_0F68_off_086E9D_len_000B8E.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_111_table_0F68_off_086E9D_len_000B8E.strings.txt", + "text_path": null, + "primary_label": "TELEPAD", + "field_names": [ + "referent", + "item", + "pad2", + "theQual", + "mapNum", + "eggNum", + "newx", + "newy", + "newz", + "counter", + "floor", + "telebeam", + "onPad" + ], + "field_tags": [ + "24:F302->telebeam", + "24:F502->item", + "24:F702->floor", + "24:FA02->pad2", + "24:FE02->item", + "62:FB00->newz", + "62:FD00->onPad", + "69:0000->referent", + "69:0A00->mapNum", + "69:0C00->eggNum", + "69:F800->theQual", + "69:F900->counter", + "69:FC00->newy", + "69:FE00->newx" + ] + }, + { + "index": 112, + "table_offset": 3952, + "data_offset": 266354, + "declared_size": 475, + "next_offset": 266829, + "extracted_size": 475, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2821, + "zero_ratio": 0.52, + "preview": "................5...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_112_table_0F70_off_041072_len_0001DB.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_112_table_0F70_off_041072_len_0001DB.strings.txt", + "text_path": null, + "primary_label": "MDESKNS", + "field_names": [ + "referent", + "fram", + "item" + ], + "field_tags": [ + "24:FC02->item", + "69:0000->referent", + "69:FE00->fram" + ] + }, + { + "index": 113, + "table_offset": 3960, + "data_offset": 264335, + "declared_size": 889, + "next_offset": 265224, + "extracted_size": 889, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3825, + "zero_ratio": 0.3723, + "preview": "............y...+.................................\".............", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_113_table_0F78_off_04088F_len_000379.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_113_table_0F78_off_04088F_len_000379.strings.txt", + "text_path": null, + "primary_label": "MBARREL", + "field_names": [ + "ma0Q3", + "referent", + "item", + "item2" + ], + "field_tags": [ + "24:FA02->item", + "24:FA02->item2", + "24:FC02->item", + "24:FC02->item2", + "24:FE02->item", + "4C:0000->ma0Q3", + "69:0000->referent" + ] + }, + { + "index": 114, + "table_offset": 4000, + "data_offset": 396601, + "declared_size": 682, + "next_offset": 397283, + "extracted_size": 682, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3402, + "zero_ratio": 0.4326, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_114_table_0FA0_off_060D39_len_0002AA.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_114_table_0FA0_off_060D39_len_0002AA.strings.txt", + "text_path": null, + "primary_label": "S_CHAIR", + "field_names": [ + "referent", + "fram", + "item", + "count", + "spin", + "direction" + ], + "field_tags": [ + "24:FC02->item", + "69:0000->referent", + "69:F600->direction", + "69:F800->spin", + "69:FA00->count", + "69:FE00->fram" + ] + }, + { + "index": 115, + "table_offset": 4128, + "data_offset": 397704, + "declared_size": 421, + "next_offset": 398125, + "extracted_size": 421, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2589, + "zero_ratio": 0.5724, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_115_table_1020_off_061188_len_0001A5.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_115_table_1020_off_061188_len_0001A5.strings.txt", + "text_path": null, + "primary_label": "TARGETNS", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 116, + "table_offset": 4136, + "data_offset": 397283, + "declared_size": 421, + "next_offset": 397704, + "extracted_size": 421, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2589, + "zero_ratio": 0.5724, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_116_table_1028_off_060FE3_len_0001A5.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_116_table_1028_off_060FE3_len_0001A5.strings.txt", + "text_path": null, + "primary_label": "TARGETEW", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 117, + "table_offset": 4152, + "data_offset": 74077, + "declared_size": 1191, + "next_offset": 75268, + "extracted_size": 1191, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3812, + "zero_ratio": 0.3619, + "preview": "................Y...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_117_table_1038_off_01215D_len_0004A7.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_117_table_1038_off_01215D_len_0004A7.strings.txt", + "text_path": null, + "primary_label": "BART", + "field_names": [ + "referent", + "counter", + "counter2", + "rndNum" + ], + "field_tags": [ + "69:0000->referent", + "69:FA00->rndNum", + "69:FC00->counter", + "69:FC00->counter2", + "69:FE00->counter" + ] + }, + { + "index": 118, + "table_offset": 4200, + "data_offset": 372555, + "declared_size": 682, + "next_offset": 373237, + "extracted_size": 682, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3446, + "zero_ratio": 0.4282, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_118_table_1068_off_05AF4B_len_0002AA.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_118_table_1068_off_05AF4B_len_0002AA.strings.txt", + "text_path": null, + "primary_label": "SMALCHAI", + "field_names": [ + "referent", + "fram", + "item", + "count", + "spin", + "direction" + ], + "field_tags": [ + "24:FC02->item", + "69:0000->referent", + "69:F600->direction", + "69:F800->spin", + "69:FA00->count", + "69:FE00->fram" + ] + }, + { + "index": 119, + "table_offset": 4232, + "data_offset": 269656, + "declared_size": 360, + "next_offset": 270016, + "extracted_size": 360, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.225, + "zero_ratio": 0.6444, + "preview": "............h...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_119_table_1088_off_041D58_len_000168.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_119_table_1088_off_041D58_len_000168.strings.txt", + "text_path": null, + "primary_label": "MFAN_NS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 120, + "table_offset": 4240, + "data_offset": 269296, + "declared_size": 360, + "next_offset": 269656, + "extracted_size": 360, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.225, + "zero_ratio": 0.6444, + "preview": "............h...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_120_table_1090_off_041BF0_len_000168.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_120_table_1090_off_041BF0_len_000168.strings.txt", + "text_path": null, + "primary_label": "MFAN_EW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 121, + "table_offset": 4384, + "data_offset": 359802, + "declared_size": 1027, + "next_offset": 360829, + "extracted_size": 1027, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4138, + "zero_ratio": 0.333, + "preview": "..../...........]...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_121_table_1120_off_057D7A_len_000403.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_121_table_1120_off_057D7A_len_000403.strings.txt", + "text_path": null, + "primary_label": "SAFE_NS", + "field_names": [ + "referent", + "item", + "item2", + "counter" + ], + "field_tags": [ + "24:FC02->item", + "24:FC02->item2", + "24:FE02->item", + "69:0000->referent", + "69:FA00->counter" + ] + }, + { + "index": 122, + "table_offset": 4392, + "data_offset": 358775, + "declared_size": 1027, + "next_offset": 359802, + "extracted_size": 1027, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4109, + "zero_ratio": 0.333, + "preview": "..../...........]...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_122_table_1128_off_057977_len_000403.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_122_table_1128_off_057977_len_000403.strings.txt", + "text_path": null, + "primary_label": "SAFE_EW", + "field_names": [ + "referent", + "item", + "item2", + "counter" + ], + "field_tags": [ + "24:FC02->item", + "24:FC02->item2", + "24:FE02->item", + "69:0000->referent", + "69:FA00->counter" + ] + }, + { + "index": 123, + "table_offset": 4472, + "data_offset": 78168, + "declared_size": 371, + "next_offset": 78539, + "extracted_size": 371, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1968, + "zero_ratio": 0.6442, + "preview": "............s...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_123_table_1178_off_013158_len_000173.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_123_table_1178_off_013158_len_000173.strings.txt", + "text_path": null, + "primary_label": "?\nQF", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 124, + "table_offset": 4480, + "data_offset": 183658, + "declared_size": 4064, + "next_offset": 187722, + "extracted_size": 4064, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.482, + "zero_ratio": 0.1919, + "preview": "........................................................u.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_124_table_1180_off_02CD6A_len_000FE0.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_124_table_1180_off_02CD6A_len_000FE0.strings.txt", + "text_path": null, + "primary_label": "ELEVATOR", + "field_names": [ + "referent", + "item", + "lowQuality", + "direction", + "mapNum", + "eggNum", + "post1", + "post2", + "counter", + "door", + "door1" + ], + "field_tags": [ + "24:F402->door", + "24:F402->door1", + "24:F602->door", + "24:FA02->door", + "24:FA02->item", + "24:FC02->item", + "24:FC02->post2", + "24:FE02->item", + "24:FE02->post1", + "69:0000->referent", + "69:0C00->mapNum", + "69:0E00->eggNum", + "69:F800->counter", + "69:FA00->direction", + "69:FC00->lowQuality" + ] + }, + { + "index": 125, + "table_offset": 4552, + "data_offset": 133605, + "declared_size": 345, + "next_offset": 133950, + "extracted_size": 345, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2406, + "zero_ratio": 0.6551, + "preview": "............Y...........................................N.8.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_125_table_11C8_off_0209E5_len_000159.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_125_table_11C8_off_0209E5_len_000159.strings.txt", + "text_path": null, + "primary_label": "DEATHFL1", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 126, + "table_offset": 4560, + "data_offset": 133950, + "declared_size": 345, + "next_offset": 134295, + "extracted_size": 345, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2406, + "zero_ratio": 0.6551, + "preview": "............Y...........................................N.8.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_126_table_11D0_off_020B3E_len_000159.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_126_table_11D0_off_020B3E_len_000159.strings.txt", + "text_path": null, + "primary_label": "DEATHFL2", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 127, + "table_offset": 4584, + "data_offset": 171160, + "declared_size": 368, + "next_offset": 171528, + "extracted_size": 368, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2255, + "zero_ratio": 0.6359, + "preview": "............p...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_127_table_11E8_off_029C98_len_000170.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_127_table_11E8_off_029C98_len_000170.strings.txt", + "text_path": null, + "primary_label": "D_BARREL", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 128, + "table_offset": 4592, + "data_offset": 117222, + "declared_size": 740, + "next_offset": 117962, + "extracted_size": 740, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3568, + "zero_ratio": 0.4216, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_128_table_11F0_off_01C9E6_len_0002E4.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_128_table_11F0_off_01C9E6_len_0002E4.strings.txt", + "text_path": null, + "primary_label": "CONVFLR", + "field_names": [ + "referent", + "xdir", + "ydir", + "item" + ], + "field_tags": [ + "24:FC02->item", + "62:FE00->ydir", + "62:FF00->xdir", + "69:0000->referent" + ] + }, + { + "index": 129, + "table_offset": 4600, + "data_offset": 319366, + "declared_size": 905, + "next_offset": 320271, + "extracted_size": 905, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3569, + "zero_ratio": 0.3724, + "preview": "................;...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_129_table_11F8_off_04DF86_len_000389.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_129_table_11F8_off_04DF86_len_000389.strings.txt", + "text_path": null, + "primary_label": "PODBOY", + "field_names": [ + "item", + "spooge", + "fram", + "counter", + "referent" + ], + "field_tags": [ + "24:FA02->item", + "24:FC02->spooge", + "24:FE02->item", + "69:0000->referent", + "69:F800->counter", + "69:FA00->fram", + "69:FC00->counter", + "69:FE00->fram" + ] + }, + { + "index": 130, + "table_offset": 4888, + "data_offset": 431984, + "declared_size": 441, + "next_offset": 432425, + "extracted_size": 441, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3107, + "zero_ratio": 0.5578, + "preview": "................k...........................j...................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_130_table_1318_off_069770_len_0001B9.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_130_table_1318_off_069770_len_0001B9.strings.txt", + "text_path": null, + "primary_label": "VALUEBOX", + "field_names": [ + "referent", + "randNum", + "rand", + "lowByte", + "highByte" + ], + "field_tags": [ + "69:0000->referent", + "69:0A00->rand", + "69:FC00->highByte", + "69:FE00->lowByte", + "69:FE00->rand", + "69:FE00->randNum" + ] + }, + { + "index": 131, + "table_offset": 4912, + "data_offset": 386339, + "declared_size": 345, + "next_offset": 386684, + "extracted_size": 345, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2348, + "zero_ratio": 0.658, + "preview": "............Y...........................................[.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_131_table_1330_off_05E523_len_000159.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_131_table_1330_off_05E523_len_000159.strings.txt", + "text_path": null, + "primary_label": "STATICNS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 132, + "table_offset": 4936, + "data_offset": 80151, + "declared_size": 436, + "next_offset": 80587, + "extracted_size": 436, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2821, + "zero_ratio": 0.5573, + "preview": "................f...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_132_table_1348_off_013917_len_0001B4.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_132_table_1348_off_013917_len_0001B4.strings.txt", + "text_path": null, + "primary_label": "BIGCOMNS", + "field_names": [ + "referent", + "fram" + ], + "field_tags": [ + "69:0000->referent", + "69:FE00->fram" + ] + }, + { + "index": 133, + "table_offset": 4944, + "data_offset": 79715, + "declared_size": 436, + "next_offset": 80151, + "extracted_size": 436, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2821, + "zero_ratio": 0.5573, + "preview": "................f...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_133_table_1350_off_013763_len_0001B4.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_133_table_1350_off_013763_len_0001B4.strings.txt", + "text_path": null, + "primary_label": "BIGCOMEW", + "field_names": [ + "referent", + "fram" + ], + "field_tags": [ + "69:0000->referent", + "69:FE00->fram" + ] + }, + { + "index": 134, + "table_offset": 5000, + "data_offset": 203616, + "declared_size": 737, + "next_offset": 204353, + "extracted_size": 737, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4111, + "zero_ratio": 0.3921, + "preview": "........................................................].......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_134_table_1388_off_031B60_len_0002E1.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_134_table_1388_off_031B60_len_0002E1.strings.txt", + "text_path": null, + "primary_label": "EYECAMNS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 135, + "table_offset": 5008, + "data_offset": 202894, + "declared_size": 722, + "next_offset": 203616, + "extracted_size": 722, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4114, + "zero_ratio": 0.3961, + "preview": "........................................................N.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_135_table_1390_off_03188E_len_0002D2.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_135_table_1390_off_03188E_len_0002D2.strings.txt", + "text_path": null, + "primary_label": "EYECAMEW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 136, + "table_offset": 5144, + "data_offset": 499199, + "declared_size": 294, + "next_offset": 499493, + "extracted_size": 294, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1531, + "zero_ratio": 0.7551, + "preview": "....R.......&...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_136_table_1418_off_079DFF_len_000126.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_136_table_1418_off_079DFF_len_000126.strings.txt", + "text_path": null, + "primary_label": "MALRM_EW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 137, + "table_offset": 5224, + "data_offset": 228873, + "declared_size": 849, + "next_offset": 229722, + "extracted_size": 849, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3746, + "zero_ratio": 0.3534, + "preview": "....}.......Q...........................................}.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_137_table_1468_off_037E09_len_000351.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_137_table_1468_off_037E09_len_000351.strings.txt", + "text_path": null, + "primary_label": "GLASS_EW", + "field_names": [ + "ma0Q3", + "referent", + "item", + "shot", + "counter", + "door" + ], + "field_tags": [ + "24:F802->door", + "24:FC02->shot", + "24:FE02->item", + "45:5700->ma0Q3", + "69:0000->referent", + "69:FA00->counter" + ] + }, + { + "index": 138, + "table_offset": 5392, + "data_offset": 192375, + "declared_size": 507, + "next_offset": 192882, + "extracted_size": 507, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3116, + "zero_ratio": 0.5089, + "preview": "....'...........................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_138_table_1510_off_02EF77_len_0001FB.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_138_table_1510_off_02EF77_len_0001FB.strings.txt", + "text_path": null, + "primary_label": "ESPACE2", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 139, + "table_offset": 5408, + "data_offset": 118702, + "declared_size": 740, + "next_offset": 119442, + "extracted_size": 740, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3568, + "zero_ratio": 0.4216, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_139_table_1520_off_01CFAE_len_0002E4.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_139_table_1520_off_01CFAE_len_0002E4.strings.txt", + "text_path": null, + "primary_label": "CONV_NL", + "field_names": [ + "referent", + "xdir", + "ydir", + "item" + ], + "field_tags": [ + "24:FC02->item", + "62:FE00->ydir", + "62:FF00->xdir", + "69:0000->referent" + ] + }, + { + "index": 140, + "table_offset": 5416, + "data_offset": 117962, + "declared_size": 740, + "next_offset": 118702, + "extracted_size": 740, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3568, + "zero_ratio": 0.4216, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_140_table_1528_off_01CCCA_len_0002E4.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_140_table_1528_off_01CCCA_len_0002E4.strings.txt", + "text_path": null, + "primary_label": "CONV_EL", + "field_names": [ + "referent", + "xdir", + "ydir", + "item" + ], + "field_tags": [ + "24:FC02->item", + "62:FE00->ydir", + "62:FF00->xdir", + "69:0000->referent" + ] + }, + { + "index": 141, + "table_offset": 5424, + "data_offset": 270436, + "declared_size": 420, + "next_offset": 270856, + "extracted_size": 420, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2262, + "zero_ratio": 0.6, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_141_table_1530_off_042064_len_0001A4.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_141_table_1530_off_042064_len_0001A4.strings.txt", + "text_path": null, + "primary_label": "MGR_NS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 142, + "table_offset": 5504, + "data_offset": 270856, + "declared_size": 338, + "next_offset": 271194, + "extracted_size": 338, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2219, + "zero_ratio": 0.6775, + "preview": "....~.......R.....................................I.............", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_142_table_1580_off_042208_len_000152.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_142_table_1580_off_042208_len_000152.strings.txt", + "text_path": null, + "primary_label": "MINELET", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 143, + "table_offset": 5512, + "data_offset": 215103, + "declared_size": 541, + "next_offset": 215644, + "extracted_size": 541, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3031, + "zero_ratio": 0.4954, + "preview": "....I...........w.......................................I.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_143_table_1588_off_03483F_len_00021D.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_143_table_1588_off_03483F_len_00021D.strings.txt", + "text_path": null, + "primary_label": "FLORMINE", + "field_names": [ + "referent", + "hType", + "item" + ], + "field_tags": [ + "24:FC02->item", + "69:0000->referent", + "69:FE00->hType" + ] + }, + { + "index": 144, + "table_offset": 5544, + "data_offset": 396216, + "declared_size": 385, + "next_offset": 396601, + "extracted_size": 385, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2494, + "zero_ratio": 0.6026, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_144_table_15A8_off_060BB8_len_000181.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_144_table_15A8_off_060BB8_len_000181.strings.txt", + "text_path": null, + "primary_label": "SWITCHNS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 145, + "table_offset": 5608, + "data_offset": 243978, + "declared_size": 595, + "next_offset": 244573, + "extracted_size": 595, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3882, + "zero_ratio": 0.4471, + "preview": "............S...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_145_table_15E8_off_03B90A_len_000253.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_145_table_15E8_off_03B90A_len_000253.strings.txt", + "text_path": null, + "primary_label": "HOVER_EW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 146, + "table_offset": 5624, + "data_offset": 244573, + "declared_size": 595, + "next_offset": 245168, + "extracted_size": 595, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3882, + "zero_ratio": 0.4471, + "preview": "............S...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_146_table_15F8_off_03BB5D_len_000253.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_146_table_15F8_off_03BB5D_len_000253.strings.txt", + "text_path": null, + "primary_label": "HOVER_NS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 147, + "table_offset": 5632, + "data_offset": 270016, + "declared_size": 420, + "next_offset": 270436, + "extracted_size": 420, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2262, + "zero_ratio": 0.6, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_147_table_1600_off_041EC0_len_0001A4.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_147_table_1600_off_041EC0_len_0001A4.strings.txt", + "text_path": null, + "primary_label": "MGR_EW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 148, + "table_offset": 5672, + "data_offset": 379809, + "declared_size": 533, + "next_offset": 380342, + "extracted_size": 533, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3377, + "zero_ratio": 0.4784, + "preview": "....A...........o.......................................A.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_148_table_1628_off_05CBA1_len_000215.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_148_table_1628_off_05CBA1_len_000215.strings.txt", + "text_path": null, + "primary_label": "SSBOX_EW", + "field_names": [ + "ma0Q0", + "referent" + ], + "field_tags": [ + "45:5700->ma0Q0", + "69:0000->referent" + ] + }, + { + "index": 149, + "table_offset": 5800, + "data_offset": 85298, + "declared_size": 790, + "next_offset": 86088, + "extracted_size": 790, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4342, + "zero_ratio": 0.3722, + "preview": "....B...........(.................................^.....^.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_149_table_16A8_off_014D32_len_000316.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_149_table_16A8_off_014D32_len_000316.strings.txt", + "text_path": null, + "primary_label": "BLASERNS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 150, + "table_offset": 5808, + "data_offset": 84508, + "declared_size": 790, + "next_offset": 85298, + "extracted_size": 790, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4342, + "zero_ratio": 0.3722, + "preview": "....B...........(.................................^.....^.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_150_table_16B0_off_014A1C_len_000316.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_150_table_16B0_off_014A1C_len_000316.strings.txt", + "text_path": null, + "primary_label": "BLASEREW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 151, + "table_offset": 5848, + "data_offset": 78539, + "declared_size": 636, + "next_offset": 79175, + "extracted_size": 636, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3491, + "zero_ratio": 0.4403, + "preview": "............|.............................................9.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_151_table_16D8_off_0132CB_len_00027C.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_151_table_16D8_off_0132CB_len_00027C.strings.txt", + "text_path": null, + "primary_label": "BETTYUP", + "field_names": [ + "referent", + "ma0Q", + "item" + ], + "field_tags": [ + "24:FE02->item", + "50:0000->ma0Q", + "69:0000->referent" + ] + }, + { + "index": 152, + "table_offset": 5856, + "data_offset": 380342, + "declared_size": 533, + "next_offset": 380875, + "extracted_size": 533, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3377, + "zero_ratio": 0.4784, + "preview": "....A...........o.......................................A.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_152_table_16E0_off_05CDB6_len_000215.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_152_table_16E0_off_05CDB6_len_000215.strings.txt", + "text_path": null, + "primary_label": "SSBOX_NS", + "field_names": [ + "ma0Q0", + "referent" + ], + "field_tags": [ + "4E:5300->ma0Q0", + "69:0000->referent" + ] + }, + { + "index": 153, + "table_offset": 5864, + "data_offset": 344749, + "declared_size": 319, + "next_offset": 345068, + "extracted_size": 319, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1724, + "zero_ratio": 0.6928, + "preview": "....k.......?...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_153_table_16E8_off_0542AD_len_00013F.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_153_table_16E8_off_0542AD_len_00013F.strings.txt", + "text_path": null, + "primary_label": "ROAMING", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 154, + "table_offset": 6000, + "data_offset": 385307, + "declared_size": 687, + "next_offset": 385994, + "extracted_size": 687, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3624, + "zero_ratio": 0.3916, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_154_table_1770_off_05E11B_len_0002AF.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_154_table_1770_off_05E11B_len_0002AF.strings.txt", + "text_path": null, + "primary_label": "STABLE", + "field_names": [ + "referent", + "fram", + "item", + "thing" + ], + "field_tags": [ + "24:FA02->thing", + "24:FC02->item", + "69:0000->referent", + "69:FE00->fram" + ] + }, + { + "index": 155, + "table_offset": 6016, + "data_offset": 256358, + "declared_size": 307, + "next_offset": 256665, + "extracted_size": 307, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1759, + "zero_ratio": 0.7362, + "preview": "...._.......3..........................................._.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_155_table_1780_off_03E966_len_000133.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_155_table_1780_off_03E966_len_000133.strings.txt", + "text_path": null, + "primary_label": "LIFTPIT", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 156, + "table_offset": 6024, + "data_offset": 114376, + "declared_size": 283, + "next_offset": 114659, + "extracted_size": 283, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1519, + "zero_ratio": 0.7562, + "preview": "....G...........u...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_156_table_1788_off_01BEC8_len_00011B.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_156_table_1788_off_01BEC8_len_00011B.strings.txt", + "text_path": null, + "primary_label": "CONGRESS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 157, + "table_offset": 6032, + "data_offset": 369809, + "declared_size": 702, + "next_offset": 370511, + "extracted_size": 702, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3604, + "zero_ratio": 0.3775, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_157_table_1790_off_05A491_len_0002BE.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_157_table_1790_off_05A491_len_0002BE.strings.txt", + "text_path": null, + "primary_label": "SICBOXNS", + "field_names": [ + "ma0Q", + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "4E:5300->ma0Q", + "69:0000->referent" + ] + }, + { + "index": 158, + "table_offset": 6040, + "data_offset": 368621, + "declared_size": 1188, + "next_offset": 369809, + "extracted_size": 1188, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4251, + "zero_ratio": 0.2938, + "preview": "................V.......................................j.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_158_table_1798_off_059FED_len_0004A4.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_158_table_1798_off_059FED_len_0004A4.strings.txt", + "text_path": null, + "primary_label": "SICBFLNS", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 159, + "table_offset": 6072, + "data_offset": 321880, + "declared_size": 886, + "next_offset": 322766, + "extracted_size": 886, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4029, + "zero_ratio": 0.3578, + "preview": "............v...(...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_159_table_17B8_off_04E958_len_000376.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_159_table_17B8_off_04E958_len_000376.strings.txt", + "text_path": null, + "primary_label": "PRISBENC", + "field_names": [ + "referent", + "counter" + ], + "field_tags": [ + "69:0000->referent", + "69:FE00->counter" + ] + }, + { + "index": 160, + "table_offset": 6088, + "data_offset": 323652, + "declared_size": 886, + "next_offset": 324538, + "extracted_size": 886, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3905, + "zero_ratio": 0.3702, + "preview": "............v...(...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_160_table_17C8_off_04F044_len_000376.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_160_table_17C8_off_04F044_len_000376.strings.txt", + "text_path": null, + "primary_label": "PRISSIT", + "field_names": [ + "referent", + "counter" + ], + "field_tags": [ + "69:0000->referent", + "69:FE00->counter" + ] + }, + { + "index": 161, + "table_offset": 6096, + "data_offset": 322766, + "declared_size": 886, + "next_offset": 323652, + "extracted_size": 886, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4029, + "zero_ratio": 0.3578, + "preview": "............v...(...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_161_table_17D0_off_04ECCE_len_000376.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_161_table_17D0_off_04ECCE_len_000376.strings.txt", + "text_path": null, + "primary_label": "PRISLEAN", + "field_names": [ + "referent", + "counter" + ], + "field_tags": [ + "69:0000->referent", + "69:FE00->counter" + ] + }, + { + "index": 162, + "table_offset": 6160, + "data_offset": 438703, + "declared_size": 722, + "next_offset": 439425, + "extracted_size": 722, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4127, + "zero_ratio": 0.3947, + "preview": "........................................................N.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_162_table_1810_off_06B1AF_len_0002D2.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_162_table_1810_off_06B1AF_len_0002D2.strings.txt", + "text_path": null, + "primary_label": "WALGUNNS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 163, + "table_offset": 6184, + "data_offset": 229722, + "declared_size": 849, + "next_offset": 230571, + "extracted_size": 849, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.371, + "zero_ratio": 0.3534, + "preview": "....}.......Q...........................................}.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_163_table_1828_off_03815A_len_000351.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_163_table_1828_off_03815A_len_000351.strings.txt", + "text_path": null, + "primary_label": "GLASS_NS", + "field_names": [ + "ma0Q3", + "referent", + "item", + "shot", + "counter", + "door" + ], + "field_tags": [ + "24:F802->door", + "24:FC02->shot", + "24:FE02->item", + "4E:5300->ma0Q3", + "69:0000->referent", + "69:FA00->counter" + ] + }, + { + "index": 164, + "table_offset": 6200, + "data_offset": 264052, + "declared_size": 283, + "next_offset": 264335, + "extracted_size": 283, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1519, + "zero_ratio": 0.7562, + "preview": "....G...........u...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_164_table_1838_off_040774_len_00011B.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_164_table_1838_off_040774_len_00011B.strings.txt", + "text_path": null, + "primary_label": "MAINTMAN", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 165, + "table_offset": 6208, + "data_offset": 110361, + "declared_size": 283, + "next_offset": 110644, + "extracted_size": 283, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1484, + "zero_ratio": 0.7562, + "preview": "....G...........u...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_165_table_1840_off_01AF19_len_00011B.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_165_table_1840_off_01AF19_len_00011B.strings.txt", + "text_path": null, + "primary_label": "CHEMSUIT", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 166, + "table_offset": 6216, + "data_offset": 314072, + "declared_size": 283, + "next_offset": 314355, + "extracted_size": 283, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1484, + "zero_ratio": 0.7597, + "preview": "....G...........u...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_166_table_1848_off_04CAD8_len_00011B.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_166_table_1848_off_04CAD8_len_00011B.strings.txt", + "text_path": null, + "primary_label": "OFFWORK", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 167, + "table_offset": 6264, + "data_offset": 235610, + "declared_size": 283, + "next_offset": 235893, + "extracted_size": 283, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1413, + "zero_ratio": 0.7668, + "preview": "....G...........u...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_167_table_1878_off_03985A_len_00011B.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_167_table_1878_off_03985A_len_00011B.strings.txt", + "text_path": null, + "primary_label": "GUARD", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 168, + "table_offset": 6368, + "data_offset": 227956, + "declared_size": 307, + "next_offset": 228263, + "extracted_size": 307, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1954, + "zero_ratio": 0.7264, + "preview": "...._.......3..........................................._.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_168_table_18E0_off_037A74_len_000133.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_168_table_18E0_off_037A74_len_000133.strings.txt", + "text_path": null, + "primary_label": "GDOOR_N", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 169, + "table_offset": 6376, + "data_offset": 227342, + "declared_size": 307, + "next_offset": 227649, + "extracted_size": 307, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1954, + "zero_ratio": 0.7264, + "preview": "...._.......3..........................................._.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_169_table_18E8_off_03780E_len_000133.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_169_table_18E8_off_03780E_len_000133.strings.txt", + "text_path": null, + "primary_label": "GDOOR_E", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 170, + "table_offset": 6440, + "data_offset": 79175, + "declared_size": 540, + "next_offset": 79715, + "extracted_size": 540, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2981, + "zero_ratio": 0.4889, + "preview": "....H...........v.......................................H.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_170_table_1928_off_013547_len_00021C.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_170_table_1928_off_013547_len_00021C.strings.txt", + "text_path": null, + "primary_label": "BIGCAN", + "field_names": [ + "referent", + "fram" + ], + "field_tags": [ + "69:0000->referent", + "69:FE00->fram" + ] + }, + { + "index": 171, + "table_offset": 6448, + "data_offset": 67630, + "declared_size": 1433, + "next_offset": 69063, + "extracted_size": 1433, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4306, + "zero_ratio": 0.2861, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_171_table_1930_off_01082E_len_000599.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_171_table_1930_off_01082E_len_000599.strings.txt", + "text_path": null, + "primary_label": "AND_BOOT", + "field_names": [ + "referent", + "event", + "counter", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent", + "69:0A00->event", + "69:FC00->counter", + "69:FE00->counter" + ] + }, + { + "index": 172, + "table_offset": 6464, + "data_offset": 98871, + "declared_size": 1584, + "next_offset": 100455, + "extracted_size": 1584, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4451, + "zero_ratio": 0.2734, + "preview": "....\\.......0...:...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_172_table_1940_off_018237_len_000630.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_172_table_1940_off_018237_len_000630.strings.txt", + "text_path": null, + "primary_label": "BRO_BOOT", + "field_names": [ + "referent", + "event", + "counter", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent", + "69:0A00->event", + "69:FC00->counter", + "69:FE00->counter" + ] + }, + { + "index": 173, + "table_offset": 6480, + "data_offset": 121722, + "declared_size": 734, + "next_offset": 122456, + "extracted_size": 734, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3787, + "zero_ratio": 0.3951, + "preview": "................8...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_173_table_1950_off_01DB7A_len_0002DE.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_173_table_1950_off_01DB7A_len_0002DE.strings.txt", + "text_path": null, + "primary_label": "CRUMORPH", + "field_names": [ + "referent", + "lastAct" + ], + "field_tags": [ + "69:0000->referent", + "69:FC00->lastAct" + ] + }, + { + "index": 174, + "table_offset": 6488, + "data_offset": 235893, + "declared_size": 283, + "next_offset": 236176, + "extracted_size": 283, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1484, + "zero_ratio": 0.7597, + "preview": "....G...........u...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_174_table_1958_off_039975_len_00011B.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_174_table_1958_off_039975_len_00011B.strings.txt", + "text_path": null, + "primary_label": "GUARDSQ", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 175, + "table_offset": 6520, + "data_offset": 108443, + "declared_size": 268, + "next_offset": 108711, + "extracted_size": 268, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1343, + "zero_ratio": 0.8022, + "preview": "....8...........f.........8.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_175_table_1978_off_01A79B_len_00010C.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_175_table_1978_off_01A79B_len_00010C.strings.txt", + "text_path": null, + "primary_label": "CARD_NS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 176, + "table_offset": 6528, + "data_offset": 108175, + "declared_size": 268, + "next_offset": 108443, + "extracted_size": 268, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1343, + "zero_ratio": 0.8022, + "preview": "....8...........f.........8.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_176_table_1980_off_01A68F_len_00010C.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_176_table_1980_off_01A68F_len_00010C.strings.txt", + "text_path": null, + "primary_label": "CARD_EW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 177, + "table_offset": 6616, + "data_offset": 202056, + "declared_size": 419, + "next_offset": 202475, + "extracted_size": 419, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2959, + "zero_ratio": 0.5728, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_177_table_19D8_off_031548_len_0001A3.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_177_table_19D8_off_031548_len_0001A3.strings.txt", + "text_path": null, + "primary_label": "EWALLEW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 178, + "table_offset": 6624, + "data_offset": 202475, + "declared_size": 419, + "next_offset": 202894, + "extracted_size": 419, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2959, + "zero_ratio": 0.5728, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_178_table_19E0_off_0316EB_len_0001A3.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_178_table_19E0_off_0316EB_len_0001A3.strings.txt", + "text_path": null, + "primary_label": "EWALLNS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 179, + "table_offset": 6720, + "data_offset": 191868, + "declared_size": 507, + "next_offset": 192375, + "extracted_size": 507, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3037, + "zero_ratio": 0.5168, + "preview": "....'...........................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_179_table_1A40_off_02ED7C_len_0001FB.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_179_table_1A40_off_02ED7C_len_0001FB.strings.txt", + "text_path": null, + "primary_label": "ESPACE", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 180, + "table_offset": 6728, + "data_offset": 467332, + "declared_size": 1730, + "next_offset": 469062, + "extracted_size": 1730, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.422, + "zero_ratio": 0.2659, + "preview": "................$.......................................a.S.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_180_table_1A48_off_072184_len_0006C2.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_180_table_1A48_off_072184_len_0006C2.strings.txt", + "text_path": null, + "primary_label": "WINDSURF", + "field_names": [ + "referent", + "item", + "xoff", + "yoff", + "speed", + "param" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent", + "69:EF00->param", + "69:F800->speed", + "69:FA00->yoff", + "69:FC00->xoff" + ] + }, + { + "index": 181, + "table_offset": 6736, + "data_offset": 408474, + "declared_size": 319, + "next_offset": 408793, + "extracted_size": 319, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1755, + "zero_ratio": 0.6897, + "preview": "....k.......?...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_181_table_1A50_off_063B9A_len_00013F.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_181_table_1A50_off_063B9A_len_00013F.strings.txt", + "text_path": null, + "primary_label": "THERMATR", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 182, + "table_offset": 6744, + "data_offset": 173787, + "declared_size": 593, + "next_offset": 174380, + "extracted_size": 593, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3103, + "zero_ratio": 0.4604, + "preview": "....}.......Q.............d.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_182_table_1A58_off_02A6DB_len_000251.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_182_table_1A58_off_02A6DB_len_000251.strings.txt", + "text_path": null, + "primary_label": "D_GUARD", + "field_names": [ + "referent", + "goods" + ], + "field_tags": [ + "24:FE02->goods", + "69:0000->referent" + ] + }, + { + "index": 183, + "table_offset": 6768, + "data_offset": 313818, + "declared_size": 254, + "next_offset": 314072, + "extracted_size": 254, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1181, + "zero_ratio": 0.8346, + "preview": "....*...........X...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_183_table_1A70_off_04C9DA_len_0000FE.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_183_table_1A70_off_04C9DA_len_0000FE.strings.txt", + "text_path": null, + "primary_label": "OBSERVER", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 184, + "table_offset": 6824, + "data_offset": 233967, + "declared_size": 356, + "next_offset": 234323, + "extracted_size": 356, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2303, + "zero_ratio": 0.6573, + "preview": "............d.....................................H.I...H.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_184_table_1AA8_off_0391EF_len_000164.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_184_table_1AA8_off_0391EF_len_000164.strings.txt", + "text_path": null, + "primary_label": "GRENADE", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 185, + "table_offset": 6832, + "data_offset": 363069, + "declared_size": 283, + "next_offset": 363352, + "extracted_size": 283, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1519, + "zero_ratio": 0.7562, + "preview": "....G...........u...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_185_table_1AB0_off_058A3D_len_00011B.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_185_table_1AB0_off_058A3D_len_00011B.strings.txt", + "text_path": null, + "primary_label": "SCIENTIS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 186, + "table_offset": 6848, + "data_offset": 354592, + "declared_size": 3172, + "next_offset": 357764, + "extracted_size": 3172, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4439, + "zero_ratio": 0.2267, + "preview": "............d...v.................................a.$.....;.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_186_table_1AC0_off_056920_len_000C64.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_186_table_1AC0_off_056920_len_000C64.strings.txt", + "text_path": null, + "primary_label": "ROLL_NS", + "field_names": [ + "referent", + "item", + "item2", + "riderList", + "time", + "total", + "counter", + "oldz", + "cargo", + "zCheck", + "zMax", + "ma0Q6" + ], + "field_tags": [ + "24:EB02->cargo", + "24:FC02->item", + "24:FC02->item2", + "24:FE02->item", + "53:0000->ma0Q6", + "62:E800->zMax", + "69:0000->referent", + "69:E900->zCheck", + "69:F200->oldz", + "69:F600->counter", + "69:F800->total", + "69:FE00->time", + "6C:FA02->riderList" + ] + }, + { + "index": 187, + "table_offset": 6904, + "data_offset": 327953, + "declared_size": 870, + "next_offset": 328823, + "extracted_size": 870, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4011, + "zero_ratio": 0.3678, + "preview": "............f...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_187_table_1AF8_off_050111_len_000366.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_187_table_1AF8_off_050111_len_000366.strings.txt", + "text_path": null, + "primary_label": "REB_COUP", + "field_names": [ + "referent", + "counter" + ], + "field_tags": [ + "69:0000->referent", + "69:FE00->counter" + ] + }, + { + "index": 188, + "table_offset": 6936, + "data_offset": 268191, + "declared_size": 524, + "next_offset": 268715, + "extracted_size": 524, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2901, + "zero_ratio": 0.5363, + "preview": "....8...........f.........8.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_188_table_1B18_off_04179F_len_00020C.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_188_table_1B18_off_04179F_len_00020C.strings.txt", + "text_path": null, + "primary_label": "MEDIKIT", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 189, + "table_offset": 7056, + "data_offset": 120336, + "declared_size": 1386, + "next_offset": 121722, + "extracted_size": 1386, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4437, + "zero_ratio": 0.2893, + "preview": "............j...t...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_189_table_1B90_off_01D610_len_00056A.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_189_table_1B90_off_01D610_len_00056A.strings.txt", + "text_path": null, + "primary_label": "COR_BOOT", + "field_names": [ + "referent", + "event", + "counter", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent", + "69:0A00->event", + "69:FC00->counter", + "69:FE00->counter" + ] + }, + { + "index": 190, + "table_offset": 7064, + "data_offset": 193694, + "declared_size": 8362, + "next_offset": 202056, + "extracted_size": 8362, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4513, + "zero_ratio": 0.1809, + "preview": "............. ...!..............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_190_table_1B98_off_02F49E_len_0020AA.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_190_table_1B98_off_02F49E_len_0020AA.strings.txt", + "text_path": null, + "primary_label": "EVENT", + "field_names": [ + "mva3b", + "referent", + "event", + "item", + "source", + "dest", + "door", + "counter", + "counter2", + "link", + "time", + "post1", + "post2", + "floor", + "flicMan" + ], + "field_tags": [ + "0D:0500->mva3b", + "24:D102->flicMan", + "24:D702->floor", + "24:D902->post2", + "24:DB02->post1", + "24:F802->door", + "24:FA02->dest", + "24:FC02->source", + "24:FE02->item", + "69:0000->referent", + "69:0A00->event", + "69:E100->time", + "69:EB00->link", + "69:EF00->counter", + "69:EF00->counter2", + "69:F100->counter" + ] + }, + { + "index": 191, + "table_offset": 7080, + "data_offset": 312135, + "declared_size": 936, + "next_offset": 313071, + "extracted_size": 936, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4156, + "zero_ratio": 0.3536, + "preview": "................Z...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_191_table_1BA8_off_04C347_len_0003A8.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_191_table_1BA8_off_04C347_len_0003A8.strings.txt", + "text_path": null, + "primary_label": "NPCTRIG", + "field_names": [ + "referent", + "event", + "item", + "item2", + "typeNpc" + ], + "field_tags": [ + "24:FA02->item", + "24:FA02->item2", + "24:FC02->item", + "24:FC02->item2", + "24:FE02->item", + "69:0000->referent", + "69:0A00->event", + "69:0A00->typeNpc" + ] + }, + { + "index": 192, + "table_offset": 7088, + "data_offset": 318604, + "declared_size": 508, + "next_offset": 319112, + "extracted_size": 508, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2717, + "zero_ratio": 0.5394, + "preview": "....(...........V.......................................(.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_192_table_1BB0_off_04DC8C_len_0001FC.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_192_table_1BB0_off_04DC8C_len_0001FC.strings.txt", + "text_path": null, + "primary_label": "\n\n\n\nK", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 193, + "table_offset": 7096, + "data_offset": 122456, + "declared_size": 843, + "next_offset": 123299, + "extracted_size": 843, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4045, + "zero_ratio": 0.376, + "preview": "....w.......K...........................................w.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_193_table_1BB8_off_01DE58_len_00034B.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_193_table_1BB8_off_01DE58_len_00034B.strings.txt", + "text_path": null, + "primary_label": "CRUZTRIG", + "field_names": [ + "referent", + "item", + "elev" + ], + "field_tags": [ + "24:FC02->elev", + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 194, + "table_offset": 7104, + "data_offset": 313071, + "declared_size": 747, + "next_offset": 313818, + "extracted_size": 747, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3735, + "zero_ratio": 0.4096, + "preview": "................E...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_194_table_1BC0_off_04C6EF_len_0002EB.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_194_table_1BC0_off_04C6EF_len_0002EB.strings.txt", + "text_path": null, + "primary_label": "NPC_ONLY", + "field_names": [ + "referent", + "item", + "link" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent", + "69:FA00->link" + ] + }, + { + "index": 195, + "table_offset": 7112, + "data_offset": 436835, + "declared_size": 1146, + "next_offset": 437981, + "extracted_size": 1146, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4162, + "zero_ratio": 0.3307, + "preview": "............z...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_195_table_1BC8_off_06AA63_len_00047A.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_195_table_1BC8_off_06AA63_len_00047A.strings.txt", + "text_path": null, + "primary_label": "VMAIL", + "field_names": [ + "referent", + "textFile" + ], + "field_tags": [ + "69:0000->referent", + "73:FE00->textFile" + ] + }, + { + "index": 196, + "table_offset": 7192, + "data_offset": 390999, + "declared_size": 283, + "next_offset": 391282, + "extracted_size": 283, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1484, + "zero_ratio": 0.7562, + "preview": "....G...........u...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_196_table_1C18_off_05F757_len_00011B.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_196_table_1C18_off_05F757_len_00011B.strings.txt", + "text_path": null, + "primary_label": "STORMTRO", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 197, + "table_offset": 7208, + "data_offset": 437981, + "declared_size": 722, + "next_offset": 438703, + "extracted_size": 722, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4127, + "zero_ratio": 0.3947, + "preview": "........................................................N.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_197_table_1C28_off_06AEDD_len_0002D2.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_197_table_1C28_off_06AEDD_len_0002D2.strings.txt", + "text_path": null, + "primary_label": "WALGUNEW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 198, + "table_offset": 7304, + "data_offset": 385994, + "declared_size": 345, + "next_offset": 386339, + "extracted_size": 345, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2348, + "zero_ratio": 0.658, + "preview": "............Y...........................................[.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_198_table_1C88_off_05E3CA_len_000159.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_198_table_1C88_off_05E3CA_len_000159.strings.txt", + "text_path": null, + "primary_label": "STATICEW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 199, + "table_offset": 7328, + "data_offset": 69993, + "declared_size": 845, + "next_offset": 70838, + "extracted_size": 845, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3988, + "zero_ratio": 0.3704, + "preview": "....y.......M...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_199_table_1CA0_off_011169_len_00034D.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_199_table_1CA0_off_011169_len_00034D.strings.txt", + "text_path": null, + "primary_label": "BARDUDES", + "field_names": [ + "referent", + "counter" + ], + "field_tags": [ + "69:0000->referent", + "69:FE00->counter" + ] + }, + { + "index": 200, + "table_offset": 7336, + "data_offset": 67347, + "declared_size": 283, + "next_offset": 67630, + "extracted_size": 283, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1449, + "zero_ratio": 0.7597, + "preview": "....G...........u...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_200_table_1CA8_off_010713_len_00011B.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_200_table_1CA8_off_010713_len_00011B.strings.txt", + "text_path": null, + "primary_label": "ANDROID", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 201, + "table_offset": 7344, + "data_offset": 373679, + "declared_size": 283, + "next_offset": 373962, + "extracted_size": 283, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1484, + "zero_ratio": 0.7597, + "preview": "....G...........u...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_201_table_1CB0_off_05B3AF_len_00011B.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_201_table_1CB0_off_05B3AF_len_00011B.strings.txt", + "text_path": null, + "primary_label": "SOLDIER", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 202, + "table_offset": 7352, + "data_offset": 110063, + "declared_size": 298, + "next_offset": 110361, + "extracted_size": 298, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1577, + "zero_ratio": 0.7248, + "preview": "....V.......*...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_202_table_1CB8_off_01ADEF_len_00012A.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_202_table_1CB8_off_01ADEF_len_00012A.strings.txt", + "text_path": null, + "primary_label": "CHEDITRO", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 203, + "table_offset": 7448, + "data_offset": 379380, + "declared_size": 429, + "next_offset": 379809, + "extracted_size": 429, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2984, + "zero_ratio": 0.5664, + "preview": "..................................................I.....[.6.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_203_table_1D18_off_05C9F4_len_0001AD.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_203_table_1D18_off_05C9F4_len_0001AD.strings.txt", + "text_path": null, + "primary_label": "SPIDWALK", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 204, + "table_offset": 7496, + "data_offset": 378986, + "declared_size": 394, + "next_offset": 379380, + "extracted_size": 394, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2563, + "zero_ratio": 0.5964, + "preview": "................<...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_204_table_1D48_off_05C86A_len_00018A.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_204_table_1D48_off_05C86A_len_00018A.strings.txt", + "text_path": null, + "primary_label": "SPIDPAD", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 205, + "table_offset": 7512, + "data_offset": 232991, + "declared_size": 722, + "next_offset": 233713, + "extracted_size": 722, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4114, + "zero_ratio": 0.3961, + "preview": "........................................................N.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_205_table_1D58_off_038E1F_len_0002D2.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_205_table_1D58_off_038E1F_len_0002D2.strings.txt", + "text_path": null, + "primary_label": "GOVGUNNS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 206, + "table_offset": 7520, + "data_offset": 248538, + "declared_size": 1577, + "next_offset": 250115, + "extracted_size": 1577, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4027, + "zero_ratio": 0.2904, + "preview": "....U.......)...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_206_table_1D60_off_03CADA_len_000629.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_206_table_1D60_off_03CADA_len_000629.strings.txt", + "text_path": null, + "primary_label": "LANDMINE", + "field_names": [ + "referent", + "landMine", + "item", + "xOff", + "yOff", + "mine", + "hType" + ], + "field_tags": [ + "24:F502->mine", + "24:FB02->item", + "24:FC02->item", + "24:FD02->landMine", + "69:0000->referent", + "69:F700->yOff", + "69:F900->xOff", + "69:FE00->hType" + ] + }, + { + "index": 207, + "table_offset": 7528, + "data_offset": 86088, + "declared_size": 4202, + "next_offset": 90290, + "extracted_size": 4202, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4731, + "zero_ratio": 0.1992, + "preview": "............j...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_207_table_1D68_off_015048_len_00106A.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_207_table_1D68_off_015048_len_00106A.strings.txt", + "text_path": null, + "primary_label": "BLASTPAC", + "field_names": [ + "referent", + "target", + "item", + "counter", + "lastAnim", + "xOff", + "yOff", + "mine", + "therm", + "thermTop", + "radar", + "radarPart" + ], + "field_tags": [ + "24:EF02->mine", + "24:F402->radar", + "24:F402->radarPart", + "24:F602->radar", + "24:F802->therm", + "24:F802->thermTop", + "24:F902->item", + "24:FA02->therm", + "24:FB02->target", + "24:FE02->item", + "69:0000->referent", + "69:F100->yOff", + "69:F300->xOff", + "69:F500->lastAnim", + "69:F700->counter", + "69:FC00->counter" + ] + }, + { + "index": 208, + "table_offset": 7536, + "data_offset": 223582, + "declared_size": 2048, + "next_offset": 225630, + "extracted_size": 2048, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.415, + "zero_ratio": 0.2642, + "preview": "....,...........Z.........,.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_208_table_1D70_off_03695E_len_000800.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_208_table_1D70_off_03695E_len_000800.strings.txt", + "text_path": null, + "primary_label": "FUSPAC", + "field_names": [ + "referent", + "droppedPac", + "target", + "item", + "counter", + "lastAnim", + "xOff", + "yOff", + "mine", + "door" + ], + "field_tags": [ + "24:EC02->door", + "24:EE02->mine", + "24:F802->item", + "24:FA02->target", + "62:FE00->droppedPac", + "69:0000->referent", + "69:F000->yOff", + "69:F200->xOff", + "69:F400->lastAnim", + "69:F600->counter" + ] + }, + { + "index": 209, + "table_offset": 7576, + "data_offset": 232269, + "declared_size": 722, + "next_offset": 232991, + "extracted_size": 722, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4114, + "zero_ratio": 0.3961, + "preview": "........................................................N.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_209_table_1D98_off_038B4D_len_0002D2.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_209_table_1D98_off_038B4D_len_0002D2.strings.txt", + "text_path": null, + "primary_label": "GOVGUNEW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 210, + "table_offset": 7616, + "data_offset": 179410, + "declared_size": 482, + "next_offset": 179892, + "extracted_size": 482, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3112, + "zero_ratio": 0.5228, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_210_table_1DC0_off_02BCD2_len_0001E2.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_210_table_1DC0_off_02BCD2_len_0001E2.strings.txt", + "text_path": null, + "primary_label": "EBRIDGE", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 211, + "table_offset": 7648, + "data_offset": 373962, + "declared_size": 347, + "next_offset": 374309, + "extracted_size": 347, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.196, + "zero_ratio": 0.6686, + "preview": "............[...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_211_table_1DE0_off_05B4CA_len_00015B.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_211_table_1DE0_off_05B4CA_len_00015B.strings.txt", + "text_path": null, + "primary_label": "SPANEL", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 212, + "table_offset": 7664, + "data_offset": 434714, + "declared_size": 306, + "next_offset": 435020, + "extracted_size": 306, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1667, + "zero_ratio": 0.719, + "preview": "....^.......2...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_212_table_1DF0_off_06A21A_len_000132.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_212_table_1DF0_off_06A21A_len_000132.strings.txt", + "text_path": null, + "primary_label": "VARGAS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 213, + "table_offset": 7688, + "data_offset": 487013, + "declared_size": 340, + "next_offset": 487353, + "extracted_size": 340, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2382, + "zero_ratio": 0.6647, + "preview": "............T...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_213_table_1E08_off_076E65_len_000154.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_213_table_1E08_off_076E65_len_000154.strings.txt", + "text_path": null, + "primary_label": "SL_NS-16", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 214, + "table_offset": 7696, + "data_offset": 477648, + "declared_size": 340, + "next_offset": 477988, + "extracted_size": 340, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2324, + "zero_ratio": 0.6706, + "preview": "............T...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_214_table_1E10_off_0749D0_len_000154.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_214_table_1E10_off_0749D0_len_000154.strings.txt", + "text_path": null, + "primary_label": "SL_NS-8", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 215, + "table_offset": 7704, + "data_offset": 477308, + "declared_size": 340, + "next_offset": 477648, + "extracted_size": 340, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2324, + "zero_ratio": 0.6706, + "preview": "............T...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_215_table_1E18_off_07487C_len_000154.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_215_table_1E18_off_07487C_len_000154.strings.txt", + "text_path": null, + "primary_label": "SL_NS-4", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 216, + "table_offset": 7728, + "data_offset": 476628, + "declared_size": 340, + "next_offset": 476968, + "extracted_size": 340, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2324, + "zero_ratio": 0.6706, + "preview": "............T...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_216_table_1E30_off_0745D4_len_000154.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_216_table_1E30_off_0745D4_len_000154.strings.txt", + "text_path": null, + "primary_label": "SL_EW-4", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 217, + "table_offset": 7736, + "data_offset": 476968, + "declared_size": 340, + "next_offset": 477308, + "extracted_size": 340, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2324, + "zero_ratio": 0.6706, + "preview": "............T...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_217_table_1E38_off_074728_len_000154.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_217_table_1E38_off_074728_len_000154.strings.txt", + "text_path": null, + "primary_label": "SL_EW-8", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 218, + "table_offset": 7744, + "data_offset": 486673, + "declared_size": 340, + "next_offset": 487013, + "extracted_size": 340, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2382, + "zero_ratio": 0.6647, + "preview": "............T...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_218_table_1E40_off_076D11_len_000154.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_218_table_1E40_off_076D11_len_000154.strings.txt", + "text_path": null, + "primary_label": "SL_EW-16", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 219, + "table_offset": 7784, + "data_offset": 268715, + "declared_size": 581, + "next_offset": 269296, + "extracted_size": 581, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3064, + "zero_ratio": 0.4802, + "preview": "....q.......E.............q.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_219_table_1E68_off_0419AB_len_000245.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_219_table_1E68_off_0419AB_len_000245.strings.txt", + "text_path": null, + "primary_label": "MELF", + "field_names": [ + "mva5b", + "referent", + "item" + ], + "field_tags": [ + "0D:0500->mva5b", + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 220, + "table_offset": 7792, + "data_offset": 314918, + "declared_size": 1015, + "next_offset": 315933, + "extracted_size": 1015, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3596, + "zero_ratio": 0.3852, + "preview": "....#...........Q.........#.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_220_table_1E70_off_04CE26_len_0003F7.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_220_table_1E70_off_04CE26_len_0003F7.strings.txt", + "text_path": null, + "primary_label": "]0Q-", + "field_names": [ + "mva11b", + "mva12b", + "referent", + "item" + ], + "field_tags": [ + "0D:0600->mva11b", + "0D:0600->mva12b", + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 221, + "table_offset": 7832, + "data_offset": 228567, + "declared_size": 306, + "next_offset": 228873, + "extracted_size": 306, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1993, + "zero_ratio": 0.7222, + "preview": "....^.......2...........................................^.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_221_table_1E98_off_037CD7_len_000132.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_221_table_1E98_off_037CD7_len_000132.strings.txt", + "text_path": null, + "primary_label": "GENERATR", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 222, + "table_offset": 7936, + "data_offset": 340550, + "declared_size": 1025, + "next_offset": 341575, + "extracted_size": 1025, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.399, + "zero_ratio": 0.3346, + "preview": "....-...........................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_222_table_1F00_off_053246_len_000401.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_222_table_1F00_off_053246_len_000401.strings.txt", + "text_path": null, + "primary_label": "RFANBADE", + "field_names": [ + "referent", + "item", + "fart", + "fart2", + "fram", + "counter", + "counter2", + "wind" + ], + "field_tags": [ + "24:F602->wind", + "24:F802->item", + "24:FE02->item", + "69:0000->referent", + "69:FA00->counter", + "69:FA00->counter2", + "69:FA00->fart", + "69:FA00->fart2", + "69:FC00->counter", + "69:FC00->fart", + "69:FE00->fram" + ] + }, + { + "index": 223, + "table_offset": 7976, + "data_offset": 341575, + "declared_size": 1026, + "next_offset": 342601, + "extracted_size": 1026, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3977, + "zero_ratio": 0.3353, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_223_table_1F28_off_053647_len_000402.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_223_table_1F28_off_053647_len_000402.strings.txt", + "text_path": null, + "primary_label": "RFANBADN", + "field_names": [ + "referent", + "item", + "fart", + "fart2", + "fram", + "counter", + "counter2", + "wind" + ], + "field_tags": [ + "24:F602->wind", + "24:F802->item", + "24:FE02->item", + "69:0000->referent", + "69:FA00->counter", + "69:FA00->counter2", + "69:FA00->fart", + "69:FA00->fart2", + "69:FC00->counter", + "69:FC00->fart", + "69:FE00->fram" + ] + }, + { + "index": 224, + "table_offset": 8136, + "data_offset": 471700, + "declared_size": 471, + "next_offset": 472171, + "extracted_size": 471, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3079, + "zero_ratio": 0.5244, + "preview": "..........................................................8.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_224_table_1FC8_off_073294_len_0001D7.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_224_table_1FC8_off_073294_len_0001D7.strings.txt", + "text_path": null, + "primary_label": "WVENTNS", + "field_names": [ + "referent", + "fram", + "windsurf" + ], + "field_tags": [ + "24:FC02->windsurf", + "69:0000->referent", + "69:FE00->fram" + ] + }, + { + "index": 225, + "table_offset": 8144, + "data_offset": 471216, + "declared_size": 484, + "next_offset": 471700, + "extracted_size": 484, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3161, + "zero_ratio": 0.5145, + "preview": "..........................................................8.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_225_table_1FD0_off_0730B0_len_0001E4.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_225_table_1FD0_off_0730B0_len_0001E4.strings.txt", + "text_path": null, + "primary_label": "WVENTEW", + "field_names": [ + "referent", + "fram", + "windsurf" + ], + "field_tags": [ + "24:FC02->windsurf", + "69:0000->referent", + "69:FE00->fram" + ] + }, + { + "index": 226, + "table_offset": 8184, + "data_offset": 325420, + "declared_size": 1055, + "next_offset": 326475, + "extracted_size": 1055, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4076, + "zero_ratio": 0.3251, + "preview": "....K...........y.........K.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_226_table_1FF8_off_04F72C_len_00041F.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_226_table_1FF8_off_04F72C_len_00041F.strings.txt", + "text_path": null, + "primary_label": "REBEL_TV", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 227, + "table_offset": 8272, + "data_offset": 363656, + "declared_size": 304, + "next_offset": 363960, + "extracted_size": 304, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1941, + "zero_ratio": 0.7303, + "preview": "....\\.......0...........................................\\.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_227_table_2050_off_058C88_len_000130.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_227_table_2050_off_058C88_len_000130.strings.txt", + "text_path": null, + "primary_label": "SDOOR_N", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 228, + "table_offset": 8328, + "data_offset": 363352, + "declared_size": 304, + "next_offset": 363656, + "extracted_size": 304, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1941, + "zero_ratio": 0.7303, + "preview": "....\\.......0...........................................\\.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_228_table_2088_off_058B58_len_000130.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_228_table_2088_off_058B58_len_000130.strings.txt", + "text_path": null, + "primary_label": "SDOOR_E", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 229, + "table_offset": 8360, + "data_offset": 211767, + "declared_size": 1936, + "next_offset": 213703, + "extracted_size": 1936, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4256, + "zero_ratio": 0.2624, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_229_table_20A8_off_033B37_len_000790.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_229_table_20A8_off_033B37_len_000790.strings.txt", + "text_path": null, + "primary_label": "FLAMEBOX", + "field_names": [ + "referent", + "event", + "flame", + "flame2", + "direction", + "count", + "newType" + ], + "field_tags": [ + "24:0A02->flame", + "24:FC02->flame", + "24:FC02->flame2", + "24:FE02->flame", + "69:0000->referent", + "69:0A00->event", + "69:0C00->direction", + "69:FA00->direction", + "69:FA00->newType", + "69:FE00->count" + ] + }, + { + "index": 230, + "table_offset": 8488, + "data_offset": 179892, + "declared_size": 482, + "next_offset": 180374, + "extracted_size": 482, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3174, + "zero_ratio": 0.5145, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_230_table_2128_off_02BEB4_len_0001E2.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_230_table_2128_off_02BEB4_len_0001E2.strings.txt", + "text_path": null, + "primary_label": "EBRIDGE2", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 231, + "table_offset": 8736, + "data_offset": 265224, + "declared_size": 655, + "next_offset": 265879, + "extracted_size": 655, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3313, + "zero_ratio": 0.4351, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_231_table_2220_off_040C08_len_00028F.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_231_table_2220_off_040C08_len_00028F.strings.txt", + "text_path": null, + "primary_label": "MCRATE", + "field_names": [ + "ma0Q0", + "referent", + "item" + ], + "field_tags": [ + "00:0000->ma0Q0", + "24:F902->item", + "69:0000->referent" + ] + }, + { + "index": 232, + "table_offset": 8744, + "data_offset": 119442, + "declared_size": 447, + "next_offset": 119889, + "extracted_size": 447, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2662, + "zero_ratio": 0.557, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_232_table_2228_off_01D292_len_0001BF.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_232_table_2228_off_01D292_len_0001BF.strings.txt", + "text_path": null, + "primary_label": "COPY_EW", + "field_names": [ + "referent", + "fram", + "coolfram" + ], + "field_tags": [ + "69:0000->referent", + "69:FC00->coolfram", + "69:FE00->fram", + "6F:6F6C->fram" + ] + }, + { + "index": 233, + "table_offset": 8752, + "data_offset": 119889, + "declared_size": 447, + "next_offset": 120336, + "extracted_size": 447, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2662, + "zero_ratio": 0.557, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_233_table_2230_off_01D451_len_0001BF.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_233_table_2230_off_01D451_len_0001BF.strings.txt", + "text_path": null, + "primary_label": "COPY_NS", + "field_names": [ + "referent", + "fram", + "coolfram" + ], + "field_tags": [ + "69:0000->referent", + "69:FC00->coolfram", + "69:FE00->fram", + "6F:6F6C->fram" + ] + }, + { + "index": 234, + "table_offset": 8760, + "data_offset": 508589, + "declared_size": 418, + "next_offset": 509007, + "extracted_size": 418, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2321, + "zero_ratio": 0.6124, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_234_table_2238_off_07C2AD_len_0001A2.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_234_table_2238_off_07C2AD_len_0001A2.strings.txt", + "text_path": null, + "primary_label": null, + "field_names": [ + "referent", + "fram" + ], + "field_tags": [ + "69:0000->referent", + "69:FE00->fram" + ] + }, + { + "index": 235, + "table_offset": 8808, + "data_offset": 211047, + "declared_size": 360, + "next_offset": 211407, + "extracted_size": 360, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2472, + "zero_ratio": 0.65, + "preview": "............h...........................................].8.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_235_table_2268_off_033867_len_000168.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_235_table_2268_off_033867_len_000168.strings.txt", + "text_path": null, + "primary_label": "FLAME1", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 236, + "table_offset": 8824, + "data_offset": 333818, + "declared_size": 1746, + "next_offset": 335564, + "extracted_size": 1746, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4393, + "zero_ratio": 0.2743, + "preview": "........................................................6.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_236_table_2278_off_0517FA_len_0006D2.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_236_table_2278_off_0517FA_len_0006D2.strings.txt", + "text_path": null, + "primary_label": "REB_PAD", + "field_names": [ + "referent", + "item", + "pad2", + "mapNum", + "eggNum", + "phold", + "gunHold", + "counter", + "counter2" + ], + "field_tags": [ + "24:FA02->gunHold", + "24:FA02->pad2", + "24:FC02->phold", + "24:FE02->item", + "69:0000->referent", + "69:0A00->mapNum", + "69:0C00->eggNum", + "69:F600->counter", + "69:F600->counter2", + "69:F800->counter" + ] + }, + { + "index": 237, + "table_offset": 8832, + "data_offset": 305671, + "declared_size": 1159, + "next_offset": 306830, + "extracted_size": 1159, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3986, + "zero_ratio": 0.3374, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_237_table_2280_off_04AA07_len_000487.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_237_table_2280_off_04AA07_len_000487.strings.txt", + "text_path": null, + "primary_label": "NOSTRIL", + "field_names": [ + "referent", + "event", + "fire", + "count", + "fire2" + ], + "field_tags": [ + "24:0A02->fire", + "24:FC02->fire", + "24:FC02->fire2", + "24:FE02->fire", + "69:0000->referent", + "69:0A00->event", + "69:FA00->count", + "69:FE00->count" + ] + }, + { + "index": 238, + "table_offset": 8864, + "data_offset": 433175, + "declared_size": 1539, + "next_offset": 434714, + "extracted_size": 1539, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4386, + "zero_ratio": 0.2885, + "preview": "..../...........................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_238_table_22A0_off_069C17_len_000603.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_238_table_22A0_off_069C17_len_000603.strings.txt", + "text_path": null, + "primary_label": "VARDESK", + "field_names": [ + "referent", + "item", + "counter" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent", + "69:FC00->counter", + "69:FE00->counter" + ] + }, + { + "index": 239, + "table_offset": 8872, + "data_offset": 82228, + "declared_size": 2280, + "next_offset": 84508, + "extracted_size": 2280, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4377, + "zero_ratio": 0.2456, + "preview": "..................................................^.....^.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_239_table_22A8_off_014134_len_0008E8.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_239_table_22A8_off_014134_len_0008E8.strings.txt", + "text_path": null, + "primary_label": "BLASER1", + "field_names": [ + "referent", + "laserList", + "item", + "inFastArea", + "count", + "link" + ], + "field_tags": [ + "24:F702->item", + "69:0000->referent", + "69:EB00->link", + "69:F300->count", + "69:F500->inFastArea", + "6C:F902->laserList" + ] + }, + { + "index": 240, + "table_offset": 8880, + "data_offset": 327433, + "declared_size": 520, + "next_offset": 327953, + "extracted_size": 520, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3135, + "zero_ratio": 0.5, + "preview": "....4...........b...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_240_table_22B0_off_04FF09_len_000208.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_240_table_22B0_off_04FF09_len_000208.strings.txt", + "text_path": null, + "primary_label": "REB_BOOT", + "field_names": [ + "referent", + "counter" + ], + "field_tags": [ + "69:0000->referent", + "69:FE00->counter" + ] + }, + { + "index": 241, + "table_offset": 8904, + "data_offset": 430927, + "declared_size": 681, + "next_offset": 431608, + "extracted_size": 681, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3583, + "zero_ratio": 0.4376, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_241_table_22C8_off_06934F_len_0002A9.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_241_table_22C8_off_06934F_len_0002A9.strings.txt", + "text_path": null, + "primary_label": "UPPLATE", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 242, + "table_offset": 8936, + "data_offset": 247615, + "declared_size": 495, + "next_offset": 248110, + "extracted_size": 495, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3111, + "zero_ratio": 0.5192, + "preview": "................I...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_242_table_22E8_off_03C73F_len_0001EF.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_242_table_22E8_off_03C73F_len_0001EF.strings.txt", + "text_path": null, + "primary_label": "KEYPADNS", + "field_names": [ + "referent", + "alreadyPassed" + ], + "field_tags": [ + "62:FF00->alreadyPassed", + "69:0000->referent" + ] + }, + { + "index": 243, + "table_offset": 8944, + "data_offset": 247120, + "declared_size": 495, + "next_offset": 247615, + "extracted_size": 495, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3111, + "zero_ratio": 0.5192, + "preview": "................I...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_243_table_22F0_off_03C550_len_0001EF.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_243_table_22F0_off_03C550_len_0001EF.strings.txt", + "text_path": null, + "primary_label": "KEYPADEW", + "field_names": [ + "referent", + "alreadyPassed" + ], + "field_tags": [ + "62:FF00->alreadyPassed", + "69:0000->referent" + ] + }, + { + "index": 244, + "table_offset": 8952, + "data_offset": 470139, + "declared_size": 1077, + "next_offset": 471216, + "extracted_size": 1077, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4039, + "zero_ratio": 0.3333, + "preview": "....a.......5...?.......................................p.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_244_table_22F8_off_072C7B_len_000435.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_244_table_22F8_off_072C7B_len_000435.strings.txt", + "text_path": null, + "primary_label": "WSHOCKNS", + "field_names": [ + "referent", + "item", + "shocker", + "shockCount" + ], + "field_tags": [ + "24:F002->shocker", + "24:FE02->item", + "69:0000->referent", + "69:E400->shockCount" + ] + }, + { + "index": 245, + "table_offset": 8960, + "data_offset": 469062, + "declared_size": 1077, + "next_offset": 470139, + "extracted_size": 1077, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.403, + "zero_ratio": 0.3333, + "preview": "....a.......5...?.......................................p.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_245_table_2300_off_072846_len_000435.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_245_table_2300_off_072846_len_000435.strings.txt", + "text_path": null, + "primary_label": "WSHOCKEW", + "field_names": [ + "referent", + "item", + "shocker", + "shockCount" + ], + "field_tags": [ + "24:F002->shocker", + "24:FE02->item", + "69:0000->referent", + "69:E400->shockCount" + ] + }, + { + "index": 246, + "table_offset": 8968, + "data_offset": 189137, + "declared_size": 1714, + "next_offset": 190851, + "extracted_size": 1714, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4387, + "zero_ratio": 0.2777, + "preview": "..........................r.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_246_table_2308_off_02E2D1_len_0006B2.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_246_table_2308_off_02E2D1_len_0006B2.strings.txt", + "text_path": null, + "primary_label": "ELYDESK", + "field_names": [ + "referent", + "counter", + "item" + ], + "field_tags": [ + "24:FC02->item", + "69:0000->referent", + "69:FE00->counter" + ] + }, + { + "index": 247, + "table_offset": 8992, + "data_offset": 383091, + "declared_size": 2216, + "next_offset": 385307, + "extracted_size": 2216, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4404, + "zero_ratio": 0.2649, + "preview": "................Z.........L.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_247_table_2320_off_05D873_len_0008A8.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_247_table_2320_off_05D873_len_0008A8.strings.txt", + "text_path": null, + "primary_label": "SSWITCHN", + "field_names": [ + "referent", + "sswitch", + "switch1", + "switch2", + "switch3", + "timer", + "sswitch2", + "switch21", + "switch22", + "switch23", + "counter" + ], + "field_tags": [ + "24:E902->switch2", + "24:E902->switch23", + "24:EB02->switch2", + "24:EB02->switch22", + "24:ED02->switch2", + "24:ED02->switch21", + "24:EF02->sswitch", + "24:EF02->sswitch2", + "24:F102->timer", + "24:F302->switch3", + "24:F502->switch2", + "24:F702->switch1", + "24:F902->sswitch", + "69:0000->referent", + "69:E700->counter", + "EF:0273->switch2" + ] + }, + { + "index": 248, + "table_offset": 9032, + "data_offset": 380875, + "declared_size": 2216, + "next_offset": 383091, + "extracted_size": 2216, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4409, + "zero_ratio": 0.2649, + "preview": "................Z.........L.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_248_table_2348_off_05CFCB_len_0008A8.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_248_table_2348_off_05CFCB_len_0008A8.strings.txt", + "text_path": null, + "primary_label": "SSWITCHE", + "field_names": [ + "referent", + "sswitch", + "switch1", + "switch2", + "switch3", + "timer", + "sswitch2", + "switch21", + "switch22", + "switch23", + "counter" + ], + "field_tags": [ + "24:E902->switch2", + "24:E902->switch23", + "24:EB02->switch2", + "24:EB02->switch22", + "24:ED02->switch2", + "24:ED02->switch21", + "24:EF02->sswitch", + "24:EF02->sswitch2", + "24:F102->timer", + "24:F302->switch3", + "24:F502->switch2", + "24:F702->switch1", + "24:F902->sswitch", + "69:0000->referent", + "69:E700->counter", + "EF:0273->switch2" + ] + }, + { + "index": 249, + "table_offset": 9048, + "data_offset": 368115, + "declared_size": 506, + "next_offset": 368621, + "extracted_size": 506, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3221, + "zero_ratio": 0.496, + "preview": "....&...........................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_249_table_2358_off_059DF3_len_0001FA.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_249_table_2358_off_059DF3_len_0001FA.strings.txt", + "text_path": null, + "primary_label": "SHOCKNS1", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 250, + "table_offset": 9056, + "data_offset": 367163, + "declared_size": 506, + "next_offset": 367669, + "extracted_size": 506, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3221, + "zero_ratio": 0.496, + "preview": "....&...........................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_250_table_2360_off_059A3B_len_0001FA.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_250_table_2360_off_059A3B_len_0001FA.strings.txt", + "text_path": null, + "primary_label": "SHOCKEW1", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 251, + "table_offset": 9064, + "data_offset": 550079, + "declared_size": 1206, + "next_offset": 551285, + "extracted_size": 1206, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4279, + "zero_ratio": 0.3085, + "preview": "..........................*.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_251_table_2368_off_0864BF_len_0004B6.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_251_table_2368_off_0864BF_len_0004B6.strings.txt", + "text_path": null, + "primary_label": "WEA_BOOT", + "field_names": [ + "referent", + "counter" + ], + "field_tags": [ + "69:0000->referent", + "69:FE00->counter" + ] + }, + { + "index": 252, + "table_offset": 9072, + "data_offset": 435020, + "declared_size": 1517, + "next_offset": 436537, + "extracted_size": 1517, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4397, + "zero_ratio": 0.2788, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_252_table_2370_off_06A34C_len_0005ED.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_252_table_2370_off_06A34C_len_0005ED.strings.txt", + "text_path": null, + "primary_label": "VAR_BOOT", + "field_names": [ + "referent", + "event", + "counter", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent", + "69:0A00->event", + "69:FC00->counter", + "69:FE00->counter" + ] + }, + { + "index": 253, + "table_offset": 9080, + "data_offset": 509911, + "declared_size": 319, + "next_offset": 510230, + "extracted_size": 319, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1724, + "zero_ratio": 0.6928, + "preview": "....k.......?...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_253_table_2378_off_07C7D7_len_00013F.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_253_table_2378_off_07C7D7_len_00013F.strings.txt", + "text_path": null, + "primary_label": "COURIER", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 254, + "table_offset": 9152, + "data_offset": 258546, + "declared_size": 357, + "next_offset": 258903, + "extracted_size": 357, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2381, + "zero_ratio": 0.6471, + "preview": "............e...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_254_table_23C0_off_03F1F2_len_000165.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_254_table_23C0_off_03F1F2_len_000165.strings.txt", + "text_path": null, + "primary_label": "LWPLATE4", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 255, + "table_offset": 9160, + "data_offset": 258903, + "declared_size": 357, + "next_offset": 259260, + "extracted_size": 357, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2381, + "zero_ratio": 0.6471, + "preview": "............e...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_255_table_23C8_off_03F357_len_000165.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_255_table_23C8_off_03F357_len_000165.strings.txt", + "text_path": null, + "primary_label": "LWPLATE8", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 256, + "table_offset": 9288, + "data_offset": 64656, + "declared_size": 996, + "next_offset": 65652, + "extracted_size": 996, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3715, + "zero_ratio": 0.3655, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_256_table_2448_off_00FC90_len_0003E4.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_256_table_2448_off_00FC90_len_0003E4.strings.txt", + "text_path": null, + "primary_label": "ALARMBOX", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 257, + "table_offset": 9808, + "data_offset": 90290, + "declared_size": 393, + "next_offset": 90683, + "extracted_size": 393, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2239, + "zero_ratio": 0.6234, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_257_table_2650_off_0160B2_len_000189.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_257_table_2650_off_0160B2_len_000189.strings.txt", + "text_path": null, + "primary_label": "BLOOD", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 258, + "table_offset": 9816, + "data_offset": 171528, + "declared_size": 599, + "next_offset": 172127, + "extracted_size": 599, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3139, + "zero_ratio": 0.4608, + "preview": "............W.............d. ...................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_258_table_2658_off_029E08_len_000257.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_258_table_2658_off_029E08_len_000257.strings.txt", + "text_path": null, + "primary_label": "D_CHEM", + "field_names": [ + "referent", + "goods" + ], + "field_tags": [ + "24:FE02->goods", + "69:0000->referent" + ] + }, + { + "index": 259, + "table_offset": 9824, + "data_offset": 172127, + "declared_size": 599, + "next_offset": 172726, + "extracted_size": 599, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3139, + "zero_ratio": 0.4608, + "preview": "............W.............d. ...................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_259_table_2660_off_02A05F_len_000257.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_259_table_2660_off_02A05F_len_000257.strings.txt", + "text_path": null, + "primary_label": "D_CONG", + "field_names": [ + "referent", + "goods" + ], + "field_tags": [ + "24:FE02->goods", + "69:0000->referent" + ] + }, + { + "index": 260, + "table_offset": 9832, + "data_offset": 175329, + "declared_size": 599, + "next_offset": 175928, + "extracted_size": 599, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3172, + "zero_ratio": 0.4574, + "preview": "............W.............d. ...................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_260_table_2668_off_02ACE1_len_000257.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_260_table_2668_off_02ACE1_len_000257.strings.txt", + "text_path": null, + "primary_label": "D_MAINT", + "field_names": [ + "referent", + "goods" + ], + "field_tags": [ + "24:FE02->goods", + "69:0000->referent" + ] + }, + { + "index": 261, + "table_offset": 9840, + "data_offset": 175928, + "declared_size": 599, + "next_offset": 176527, + "extracted_size": 599, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3172, + "zero_ratio": 0.4574, + "preview": "............W.............d. ...................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_261_table_2670_off_02AF38_len_000257.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_261_table_2670_off_02AF38_len_000257.strings.txt", + "text_path": null, + "primary_label": "D_OWORK", + "field_names": [ + "referent", + "goods" + ], + "field_tags": [ + "24:FE02->goods", + "69:0000->referent" + ] + }, + { + "index": 262, + "table_offset": 9848, + "data_offset": 176527, + "declared_size": 599, + "next_offset": 177126, + "extracted_size": 599, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3172, + "zero_ratio": 0.4574, + "preview": "............W.............d. ...................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_262_table_2678_off_02B18F_len_000257.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_262_table_2678_off_02B18F_len_000257.strings.txt", + "text_path": null, + "primary_label": "D_SCIEN", + "field_names": [ + "referent", + "goods" + ], + "field_tags": [ + "24:FE02->goods", + "69:0000->referent" + ] + }, + { + "index": 263, + "table_offset": 9856, + "data_offset": 177725, + "declared_size": 599, + "next_offset": 178324, + "extracted_size": 599, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3172, + "zero_ratio": 0.4574, + "preview": "............W.............d. ...................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_263_table_2680_off_02B63D_len_000257.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_263_table_2680_off_02B63D_len_000257.strings.txt", + "text_path": null, + "primary_label": "D_STORM", + "field_names": [ + "referent", + "goods" + ], + "field_tags": [ + "24:FE02->goods", + "69:0000->referent" + ] + }, + { + "index": 264, + "table_offset": 9864, + "data_offset": 177126, + "declared_size": 599, + "next_offset": 177725, + "extracted_size": 599, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3139, + "zero_ratio": 0.4608, + "preview": "............W.............d. ...................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_264_table_2688_off_02B3E6_len_000257.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_264_table_2688_off_02B3E6_len_000257.strings.txt", + "text_path": null, + "primary_label": "D_SOLD", + "field_names": [ + "referent", + "goods" + ], + "field_tags": [ + "24:FE02->goods", + "69:0000->referent" + ] + }, + { + "index": 265, + "table_offset": 9872, + "data_offset": 179098, + "declared_size": 312, + "next_offset": 179410, + "extracted_size": 312, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1603, + "zero_ratio": 0.7212, + "preview": "....d.......8.............d.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_265_table_2690_off_02BB9A_len_000138.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_265_table_2690_off_02BB9A_len_000138.strings.txt", + "text_path": null, + "primary_label": "D_VARG", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 266, + "table_offset": 9888, + "data_offset": 172726, + "declared_size": 462, + "next_offset": 173188, + "extracted_size": 462, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2684, + "zero_ratio": 0.5628, + "preview": "................(...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_266_table_26A0_off_02A2B6_len_0001CE.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_266_table_26A0_off_02A2B6_len_0001CE.strings.txt", + "text_path": null, + "primary_label": "D_COUR", + "field_names": [ + "referent", + "goods" + ], + "field_tags": [ + "24:FE02->goods", + "69:0000->referent" + ] + }, + { + "index": 267, + "table_offset": 9904, + "data_offset": 178324, + "declared_size": 462, + "next_offset": 178786, + "extracted_size": 462, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2771, + "zero_ratio": 0.5541, + "preview": "................(...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_267_table_26B0_off_02B894_len_0001CE.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_267_table_26B0_off_02B894_len_0001CE.strings.txt", + "text_path": null, + "primary_label": "D_SUSAN", + "field_names": [ + "referent", + "goods" + ], + "field_tags": [ + "24:FE02->goods", + "69:0000->referent" + ] + }, + { + "index": 268, + "table_offset": 9912, + "data_offset": 178786, + "declared_size": 312, + "next_offset": 179098, + "extracted_size": 312, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1635, + "zero_ratio": 0.7179, + "preview": "....d.......8.............d.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_268_table_26B8_off_02BA62_len_000138.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_268_table_26B8_off_02BA62_len_000138.strings.txt", + "text_path": null, + "primary_label": "D_THERM", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 269, + "table_offset": 9920, + "data_offset": 391282, + "declared_size": 3438, + "next_offset": 394720, + "extracted_size": 3438, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4508, + "zero_ratio": 0.2347, + "preview": "............n...(.........Q.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_269_table_26C0_off_05F872_len_000D6E.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_269_table_26C0_off_05F872_len_000D6E.strings.txt", + "text_path": null, + "primary_label": "SURCAMNS", + "field_names": [ + "referent", + "textFile", + "monit", + "valueBox", + "passcode", + "link", + "code", + "screen", + "cameraEgg", + "trueRef", + "therma", + "eventTrigger", + "foundGun" + ], + "field_tags": [ + "24:0A02->eventTrigger", + "24:F102->therma", + "24:FA02->valueBox", + "24:FC02->cameraEgg", + "24:FC02->monit", + "24:FE02->screen", + "61:7373->code", + "62:F500->code", + "62:FD00->foundGun", + "69:0000->referent", + "69:F600->link", + "69:F800->passcode", + "69:FA00->trueRef", + "73:FE00->textFile" + ] + }, + { + "index": 270, + "table_offset": 9936, + "data_offset": 75268, + "declared_size": 1090, + "next_offset": 76358, + "extracted_size": 1090, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4367, + "zero_ratio": 0.3183, + "preview": "....n.......B...T.......................................N.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_270_table_26D0_off_012604_len_000442.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_270_table_26D0_off_012604_len_000442.strings.txt", + "text_path": null, + "primary_label": "BASEGUN", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:F802->item", + "69:0000->referent" + ] + }, + { + "index": 271, + "table_offset": 9944, + "data_offset": 410585, + "declared_size": 1362, + "next_offset": 411947, + "extracted_size": 1362, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4119, + "zero_ratio": 0.3267, + "preview": "....x.......R...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_271_table_26D8_off_0643D9_len_000552.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_271_table_26D8_off_0643D9_len_000552.strings.txt", + "text_path": null, + "primary_label": "TIMER", + "field_names": [ + "referent", + "time", + "phase2" + ], + "field_tags": [ + "69:0000->referent", + "69:FA00->phase2", + "69:FC00->time" + ] + }, + { + "index": 272, + "table_offset": 9952, + "data_offset": 374309, + "declared_size": 2062, + "next_offset": 376371, + "extracted_size": 2062, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4719, + "zero_ratio": 0.2556, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_272_table_26E0_off_05B625_len_00080E.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_272_table_26E0_off_05B625_len_00080E.strings.txt", + "text_path": null, + "primary_label": "SPECIAL", + "field_names": [ + "referent", + "phase", + "counter", + "time", + "phase1", + "phase2", + "mapNum", + "npcNum" + ], + "field_tags": [ + "69:0000->referent", + "69:0C00->phase", + "69:F800->phase", + "69:F800->phase2", + "69:FA00->phase", + "69:FA00->phase1", + "69:FC00->npcNum", + "69:FC00->time", + "69:FE00->counter", + "69:FE00->mapNum" + ] + }, + { + "index": 273, + "table_offset": 9976, + "data_offset": 430067, + "declared_size": 860, + "next_offset": 430927, + "extracted_size": 860, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3977, + "zero_ratio": 0.3814, + "preview": "............\\...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_273_table_26F8_off_068FF3_len_00035C.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_273_table_26F8_off_068FF3_len_00035C.strings.txt", + "text_path": null, + "primary_label": "TRIGPAD", + "field_names": [ + "referent", + "item", + "elev" + ], + "field_tags": [ + "24:FA02->elev", + "24:FC02->item", + "69:0000->referent" + ] + }, + { + "index": 274, + "table_offset": 10000, + "data_offset": 301271, + "declared_size": 1443, + "next_offset": 302714, + "extracted_size": 1443, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4948, + "zero_ratio": 0.2606, + "preview": "................U...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_274_table_2710_off_0498D7_len_0005A3.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_274_table_2710_off_0498D7_len_0005A3.strings.txt", + "text_path": null, + "primary_label": "MONSTER", + "field_names": [ + "referent", + "monster1", + "door", + "newNpc" + ], + "field_tags": [ + "24:F602->newNpc", + "24:F802->door", + "24:FE02->monster1", + "69:0000->referent" + ] + }, + { + "index": 275, + "table_offset": 10008, + "data_offset": 188818, + "declared_size": 319, + "next_offset": 189137, + "extracted_size": 319, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1661, + "zero_ratio": 0.6991, + "preview": "....k.......?...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_275_table_2718_off_02E192_len_00013F.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_275_table_2718_off_02E192_len_00013F.strings.txt", + "text_path": null, + "primary_label": "ELITE", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 276, + "table_offset": 10016, + "data_offset": 173188, + "declared_size": 599, + "next_offset": 173787, + "extracted_size": 599, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3205, + "zero_ratio": 0.4541, + "preview": "............W.............d. ...................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_276_table_2720_off_02A484_len_000257.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_276_table_2720_off_02A484_len_000257.strings.txt", + "text_path": null, + "primary_label": "D_ESTORM", + "field_names": [ + "referent", + "goods" + ], + "field_tags": [ + "24:FE02->goods", + "69:0000->referent" + ] + }, + { + "index": 277, + "table_offset": 10024, + "data_offset": 245676, + "declared_size": 254, + "next_offset": 245930, + "extracted_size": 254, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1142, + "zero_ratio": 0.8346, + "preview": "....*...........X.........*.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_277_table_2728_off_03BFAC_len_0000FE.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_277_table_2728_off_03BFAC_len_0000FE.strings.txt", + "text_path": null, + "primary_label": "JELYHACK", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 278, + "table_offset": 10032, + "data_offset": 125712, + "declared_size": 5256, + "next_offset": 130968, + "extracted_size": 5256, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.715, + "zero_ratio": 0.1172, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_278_table_2730_off_01EB10_len_001488.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_278_table_2730_off_01EB10_len_001488.strings.txt", + "text_path": null, + "primary_label": "DATALINK", + "field_names": [ + "mva1", + "mva3a", + "mva4", + "mva5a", + "mva6", + "mva7", + "mva8", + "mva9", + "mva10", + "mva11a", + "mva12a", + "mva13", + "mva14", + "mva15a", + "mva15c", + "referent", + "textFile" + ], + "field_tags": [ + "0D:0400->mva1", + "0D:0400->mva4", + "0D:0400->mva6", + "0D:0400->mva7", + "0D:0400->mva8", + "0D:0400->mva9", + "0D:0500->mva1", + "0D:0500->mva10", + "0D:0500->mva13", + "0D:0500->mva14", + "0D:0500->mva3a", + "0D:0500->mva5a", + "0D:0600->mva1", + "0D:0600->mva11a", + "0D:0600->mva12a", + "0D:0600->mva15a", + "0D:0600->mva15c", + "69:0000->referent", + "73:FE00->textFile" + ] + }, + { + "index": 279, + "table_offset": 10040, + "data_offset": 371895, + "declared_size": 660, + "next_offset": 372555, + "extracted_size": 660, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3561, + "zero_ratio": 0.4348, + "preview": "................F...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_279_table_2738_off_05ACB7_len_000294.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_279_table_2738_off_05ACB7_len_000294.strings.txt", + "text_path": null, + "primary_label": "SLIDEFLR", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 280, + "table_offset": 10048, + "data_offset": 245422, + "declared_size": 254, + "next_offset": 245676, + "extracted_size": 254, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1063, + "zero_ratio": 0.8425, + "preview": "....*...........X.........*.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_280_table_2740_off_03BEAE_len_0000FE.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_280_table_2740_off_03BEAE_len_0000FE.strings.txt", + "text_path": null, + "primary_label": "JELYH2", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 281, + "table_offset": 10072, + "data_offset": 236673, + "declared_size": 354, + "next_offset": 237027, + "extracted_size": 354, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2203, + "zero_ratio": 0.6412, + "preview": "............b...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_281_table_2758_off_039C81_len_000162.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_281_table_2758_off_039C81_len_000162.strings.txt", + "text_path": null, + "primary_label": "HOFFMAN", + "field_names": [ + "referent", + "hoffy", + "deathBox", + "deadGuy", + "item" + ], + "field_tags": [ + "24:F802->item", + "24:FA02->deadGuy", + "24:FC02->deathBox", + "24:FE02->hoffy", + "69:0000->referent" + ] + }, + { + "index": 282, + "table_offset": 10080, + "data_offset": 175017, + "declared_size": 312, + "next_offset": 175329, + "extracted_size": 312, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1667, + "zero_ratio": 0.7147, + "preview": "....d.......8.............d.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_282_table_2760_off_02ABA9_len_000138.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_282_table_2760_off_02ABA9_len_000138.strings.txt", + "text_path": null, + "primary_label": "D_HOFFMA", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 283, + "table_offset": 10088, + "data_offset": 338832, + "declared_size": 1718, + "next_offset": 340550, + "extracted_size": 1718, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4476, + "zero_ratio": 0.2637, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_283_table_2768_off_052B90_len_0006B6.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_283_table_2768_off_052B90_len_0006B6.strings.txt", + "text_path": null, + "primary_label": "REE_BOOT", + "field_names": [ + "referent", + "event", + "counter", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent", + "69:0A00->event", + "69:FC00->counter", + "69:FE00->counter" + ] + }, + { + "index": 284, + "table_offset": 10112, + "data_offset": 546655, + "declared_size": 3424, + "next_offset": 550079, + "extracted_size": 3424, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4541, + "zero_ratio": 0.2298, + "preview": "....z.......`...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_284_table_2780_off_08575F_len_000D60.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_284_table_2780_off_08575F_len_000D60.strings.txt", + "text_path": null, + "primary_label": "SURCAMEW", + "field_names": [ + "referent", + "textFile", + "monit", + "valueBox", + "passcode", + "link", + "code", + "screen", + "cameraEgg", + "trueRef", + "therma", + "eventTrigger", + "foundGun" + ], + "field_tags": [ + "24:0A02->eventTrigger", + "24:F602->therma", + "24:FA02->valueBox", + "24:FC02->cameraEgg", + "24:FC02->monit", + "24:FE02->screen", + "61:7373->code", + "62:F500->code", + "62:FD00->foundGun", + "69:0000->referent", + "69:F600->link", + "69:F800->passcode", + "69:FA00->trueRef", + "73:FE00->textFile" + ] + }, + { + "index": 285, + "table_offset": 10144, + "data_offset": 365164, + "declared_size": 396, + "next_offset": 365560, + "extracted_size": 396, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2222, + "zero_ratio": 0.6162, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_285_table_27A0_off_05926C_len_00018C.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_285_table_27A0_off_05926C_len_00018C.strings.txt", + "text_path": null, + "primary_label": "SFXTRIG", + "field_names": [ + "referent", + "event" + ], + "field_tags": [ + "69:0000->referent", + "69:0A00->event" + ] + }, + { + "index": 286, + "table_offset": 10152, + "data_offset": 371127, + "declared_size": 768, + "next_offset": 371895, + "extracted_size": 768, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3919, + "zero_ratio": 0.3763, + "preview": "....,...........Z...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_286_table_27A8_off_05A9B7_len_000300.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_286_table_27A8_off_05A9B7_len_000300.strings.txt", + "text_path": null, + "primary_label": "SKILLBOX", + "field_names": [ + "referent", + "skill" + ], + "field_tags": [ + "69:0000->referent", + "69:FE00->skill" + ] + }, + { + "index": 287, + "table_offset": 10160, + "data_offset": 174380, + "declared_size": 637, + "next_offset": 175017, + "extracted_size": 637, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3344, + "zero_ratio": 0.4411, + "preview": "............}.../........... ...................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_287_table_27B0_off_02A92C_len_00027D.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_287_table_27B0_off_02A92C_len_00027D.strings.txt", + "text_path": null, + "primary_label": "D_GURDSQ", + "field_names": [ + "referent", + "goods" + ], + "field_tags": [ + "24:FE02->goods", + "69:0000->referent" + ] + }, + { + "index": 288, + "table_offset": 10176, + "data_offset": 436537, + "declared_size": 298, + "next_offset": 436835, + "extracted_size": 298, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.151, + "zero_ratio": 0.7315, + "preview": "....V.......*...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_288_table_27C0_off_06A939_len_00012A.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_288_table_27C0_off_06A939_len_00012A.strings.txt", + "text_path": null, + "primary_label": "VETRON", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 289, + "table_offset": 10184, + "data_offset": 130968, + "declared_size": 671, + "next_offset": 131639, + "extracted_size": 671, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3621, + "zero_ratio": 0.4367, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_289_table_27C8_off_01FF98_len_00029F.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_289_table_27C8_off_01FF98_len_00029F.strings.txt", + "text_path": null, + "primary_label": "DEATHBOX", + "field_names": [ + "referent", + "sswitch", + "counter" + ], + "field_tags": [ + "24:FE02->sswitch", + "69:0000->referent", + "69:F900->counter" + ] + }, + { + "index": 290, + "table_offset": 10224, + "data_offset": 333101, + "declared_size": 717, + "next_offset": 333818, + "extracted_size": 717, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3487, + "zero_ratio": 0.4073, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_290_table_27F0_off_05152D_len_0002CD.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_290_table_27F0_off_05152D_len_0002CD.strings.txt", + "text_path": null, + "primary_label": "REB_GAR", + "field_names": [ + "referent", + "counter" + ], + "field_tags": [ + "69:0000->referent", + "69:FE00->counter" + ] + }, + { + "index": 291, + "table_offset": 10248, + "data_offset": 90683, + "declared_size": 1309, + "next_offset": 91992, + "extracted_size": 1309, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4194, + "zero_ratio": 0.2911, + "preview": "....I...........................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_291_table_2808_off_01623B_len_00051D.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_291_table_2808_off_01623B_len_00051D.strings.txt", + "text_path": null, + "primary_label": "BOUNCBOX", + "field_names": [ + "referent", + "item", + "item2", + "ammo" + ], + "field_tags": [ + "24:F602->item", + "24:F602->item2", + "24:F802->item", + "69:0000->referent", + "69:F000->ammo" + ] + }, + { + "index": 292, + "table_offset": 10256, + "data_offset": 243383, + "declared_size": 595, + "next_offset": 243978, + "extracted_size": 595, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3681, + "zero_ratio": 0.4672, + "preview": "............S...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_292_table_2810_off_03B6B7_len_000253.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_292_table_2810_off_03B6B7_len_000253.strings.txt", + "text_path": null, + "primary_label": "HOVER1", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 293, + "table_offset": 10336, + "data_offset": 387536, + "declared_size": 360, + "next_offset": 387896, + "extracted_size": 360, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2444, + "zero_ratio": 0.65, + "preview": "............h...........................................].8.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_293_table_2860_off_05E9D0_len_000168.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_293_table_2860_off_05E9D0_len_000168.strings.txt", + "text_path": null, + "primary_label": "STEAM1", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 294, + "table_offset": 10352, + "data_offset": 204353, + "declared_size": 1044, + "next_offset": 205397, + "extracted_size": 1044, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4109, + "zero_ratio": 0.3879, + "preview": "....:...........................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_294_table_2870_off_031E41_len_000414.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_294_table_2870_off_031E41_len_000414.strings.txt", + "text_path": null, + "primary_label": "FADE", + "field_names": [ + "referent", + "loop", + "loop2" + ], + "field_tags": [ + "69:0000->referent", + "69:FC00->loop", + "69:FC00->loop2", + "69:FE00->loop" + ] + }, + { + "index": 295, + "table_offset": 10376, + "data_offset": 318169, + "declared_size": 435, + "next_offset": 318604, + "extracted_size": 435, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2276, + "zero_ratio": 0.6115, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_295_table_2888_off_04DAD9_len_0001B3.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_295_table_2888_off_04DAD9_len_0001B3.strings.txt", + "text_path": null, + "primary_label": "PHIR", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 296, + "table_offset": 10384, + "data_offset": 388256, + "declared_size": 2019, + "next_offset": 390275, + "extracted_size": 2019, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.425, + "zero_ratio": 0.262, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_296_table_2890_off_05ECA0_len_0007E3.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_296_table_2890_off_05ECA0_len_0007E3.strings.txt", + "text_path": null, + "primary_label": "STEAMBOX", + "field_names": [ + "referent", + "event", + "steam", + "steam2", + "direction", + "count" + ], + "field_tags": [ + "24:0A02->steam", + "24:FC02->steam", + "24:FC02->steam2", + "24:FE02->steam", + "69:0000->referent", + "69:0A00->event", + "69:0C00->direction", + "69:FA00->direction", + "69:FE00->count" + ] + }, + { + "index": 297, + "table_offset": 10464, + "data_offset": 211407, + "declared_size": 360, + "next_offset": 211767, + "extracted_size": 360, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2472, + "zero_ratio": 0.65, + "preview": "............h...........................................].8.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_297_table_28E0_off_0339CF_len_000168.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_297_table_28E0_off_0339CF_len_000168.strings.txt", + "text_path": null, + "primary_label": "FLAME2", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 298, + "table_offset": 10520, + "data_offset": 387896, + "declared_size": 360, + "next_offset": 388256, + "extracted_size": 360, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2444, + "zero_ratio": 0.65, + "preview": "............h...........................................].8.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_298_table_2918_off_05EB38_len_000168.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_298_table_2918_off_05EB38_len_000168.strings.txt", + "text_path": null, + "primary_label": "STEAM2", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 299, + "table_offset": 10560, + "data_offset": 506630, + "declared_size": 360, + "next_offset": 506990, + "extracted_size": 360, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2556, + "zero_ratio": 0.6417, + "preview": "............h...........................................].8.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_299_table_2940_off_07BB06_len_000168.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_299_table_2940_off_07BB06_len_000168.strings.txt", + "text_path": null, + "primary_label": "FLAMELP", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 300, + "table_offset": 10680, + "data_offset": 506990, + "declared_size": 533, + "next_offset": 507523, + "extracted_size": 533, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3002, + "zero_ratio": 0.5159, + "preview": "....A...........o.......................................A.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_300_table_29B8_off_07BC6E_len_000215.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_300_table_29B8_off_07BC6E_len_000215.strings.txt", + "text_path": null, + "primary_label": "BBOX", + "field_names": [ + "ma0Q0", + "referent" + ], + "field_tags": [ + "00:0000->ma0Q0", + "69:0000->referent" + ] + }, + { + "index": 301, + "table_offset": 10688, + "data_offset": 508056, + "declared_size": 533, + "next_offset": 508589, + "extracted_size": 533, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3283, + "zero_ratio": 0.4878, + "preview": "....A...........o.......................................A.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_301_table_29C0_off_07C098_len_000215.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_301_table_29C0_off_07C098_len_000215.strings.txt", + "text_path": null, + "primary_label": "GBOX_NS", + "field_names": [ + "ma0Q0", + "referent" + ], + "field_tags": [ + "53:0000->ma0Q0", + "69:0000->referent" + ] + }, + { + "index": 302, + "table_offset": 10696, + "data_offset": 507523, + "declared_size": 533, + "next_offset": 508056, + "extracted_size": 533, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3283, + "zero_ratio": 0.4878, + "preview": "....A...........o.......................................A.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_302_table_29C8_off_07BE83_len_000215.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_302_table_29C8_off_07BE83_len_000215.strings.txt", + "text_path": null, + "primary_label": "GBOX_EW", + "field_names": [ + "ma0Q0", + "referent" + ], + "field_tags": [ + "57:0000->ma0Q0", + "69:0000->referent" + ] + }, + { + "index": 303, + "table_offset": 10704, + "data_offset": 180374, + "declared_size": 319, + "next_offset": 180693, + "extracted_size": 319, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1755, + "zero_ratio": 0.6897, + "preview": "....k.......?...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_303_table_29D0_off_02C096_len_00013F.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_303_table_29D0_off_02C096_len_00013F.strings.txt", + "text_path": null, + "primary_label": "EGRENADE", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 304, + "table_offset": 10744, + "data_offset": 362342, + "declared_size": 727, + "next_offset": 363069, + "extracted_size": 727, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.348, + "zero_ratio": 0.4305, + "preview": "..........................w.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_304_table_29F8_off_058766_len_0002D7.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_304_table_29F8_off_058766_len_0002D7.strings.txt", + "text_path": null, + "primary_label": "SCANNER", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 305, + "table_offset": 10752, + "data_offset": 245168, + "declared_size": 254, + "next_offset": 245422, + "extracted_size": 254, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1063, + "zero_ratio": 0.8465, + "preview": "....*...........X.........*.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_305_table_2A00_off_03BDB0_len_0000FE.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_305_table_2A00_off_03BDB0_len_0000FE.strings.txt", + "text_path": null, + "primary_label": "IONIC", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 306, + "table_offset": 10760, + "data_offset": 319112, + "declared_size": 254, + "next_offset": 319366, + "extracted_size": 254, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1102, + "zero_ratio": 0.8425, + "preview": "....*...........X.........*.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_306_table_2A08_off_04DE88_len_0000FE.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_306_table_2A08_off_04DE88_len_0000FE.strings.txt", + "text_path": null, + "primary_label": "PLASMA", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 307, + "table_offset": 10768, + "data_offset": 233713, + "declared_size": 254, + "next_offset": 233967, + "extracted_size": 254, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1181, + "zero_ratio": 0.8346, + "preview": "....*...........X.........*.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_307_table_2A10_off_0390F1_len_0000FE.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_307_table_2A10_off_0390F1_len_0000FE.strings.txt", + "text_path": null, + "primary_label": "GRAVITON", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 308, + "table_offset": 10904, + "data_offset": 230571, + "declared_size": 849, + "next_offset": 231420, + "extracted_size": 849, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.371, + "zero_ratio": 0.3534, + "preview": "....}.......Q...........................................}.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_308_table_2A98_off_0384AB_len_000351.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_308_table_2A98_off_0384AB_len_000351.strings.txt", + "text_path": null, + "primary_label": "GLDIV_EW", + "field_names": [ + "ma0Q3", + "referent", + "item", + "shot", + "counter", + "door" + ], + "field_tags": [ + "24:F802->door", + "24:FC02->shot", + "24:FE02->item", + "45:5700->ma0Q3", + "69:0000->referent", + "69:FA00->counter" + ] + }, + { + "index": 309, + "table_offset": 10912, + "data_offset": 231420, + "declared_size": 849, + "next_offset": 232269, + "extracted_size": 849, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3698, + "zero_ratio": 0.3534, + "preview": "....}.......Q...........................................}.......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_309_table_2AA0_off_0387FC_len_000351.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_309_table_2AA0_off_0387FC_len_000351.strings.txt", + "text_path": null, + "primary_label": "GLDIV_NS", + "field_names": [ + "ma0Q3", + "referent", + "item", + "shot", + "counter", + "door" + ], + "field_tags": [ + "24:F802->door", + "24:FC02->shot", + "24:FE02->item", + "4E:5300->ma0Q3", + "69:0000->referent", + "69:FA00->counter" + ] + }, + { + "index": 310, + "table_offset": 10928, + "data_offset": 326475, + "declared_size": 636, + "next_offset": 327111, + "extracted_size": 636, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3412, + "zero_ratio": 0.4481, + "preview": "............|...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_310_table_2AB0_off_04FB4B_len_00027C.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_310_table_2AB0_off_04FB4B_len_00027C.strings.txt", + "text_path": null, + "primary_label": "REBSNOR", + "field_names": [ + "referent", + "counter" + ], + "field_tags": [ + "69:0000->referent", + "69:FE00->counter" + ] + }, + { + "index": 311, + "table_offset": 10936, + "data_offset": 327111, + "declared_size": 322, + "next_offset": 327433, + "extracted_size": 322, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1832, + "zero_ratio": 0.7019, + "preview": "....n.......B...............................n...................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_311_table_2AB8_off_04FDC7_len_000142.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_311_table_2AB8_off_04FDC7_len_000142.strings.txt", + "text_path": null, + "primary_label": "REBWORK", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 312, + "table_offset": 10968, + "data_offset": 360829, + "declared_size": 1513, + "next_offset": 362342, + "extracted_size": 1513, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.427, + "zero_ratio": 0.312, + "preview": "................C...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_312_table_2AD8_off_05817D_len_0005E9.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_312_table_2AD8_off_05817D_len_0005E9.strings.txt", + "text_path": null, + "primary_label": "SATARG", + "field_names": [ + "mva15b", + "referent", + "item", + "counter" + ], + "field_tags": [ + "0D:0600->mva15b", + "24:FE02->item", + "69:0000->referent", + "69:FC00->counter" + ] + }, + { + "index": 313, + "table_offset": 10976, + "data_offset": 113878, + "declared_size": 498, + "next_offset": 114376, + "extracted_size": 498, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3173, + "zero_ratio": 0.512, + "preview": "..........................f.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_313_table_2AE0_off_01BCD6_len_0001F2.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_313_table_2AE0_off_01BCD6_len_0001F2.strings.txt", + "text_path": null, + "primary_label": "CHEST_ON", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 314, + "table_offset": 10984, + "data_offset": 113380, + "declared_size": 498, + "next_offset": 113878, + "extracted_size": 498, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3173, + "zero_ratio": 0.512, + "preview": "..........................f.....................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_314_table_2AE8_off_01BAE4_len_0001F2.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_314_table_2AE8_off_01BAE4_len_0001F2.strings.txt", + "text_path": null, + "primary_label": "CHEST_OE", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 315, + "table_offset": 11000, + "data_offset": 511221, + "declared_size": 599, + "next_offset": 511820, + "extracted_size": 599, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3205, + "zero_ratio": 0.4541, + "preview": "............W.............d. ...................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_315_table_2AF8_off_07CCF5_len_000257.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_315_table_2AF8_off_07CCF5_len_000257.strings.txt", + "text_path": null, + "primary_label": "D_GRENAD", + "field_names": [ + "referent", + "goods" + ], + "field_tags": [ + "24:FE02->goods", + "69:0000->referent" + ] + }, + { + "index": 316, + "table_offset": 11016, + "data_offset": 111991, + "declared_size": 1389, + "next_offset": 113380, + "extracted_size": 1389, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4269, + "zero_ratio": 0.288, + "preview": "............m.............w.#...........................\".......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_316_table_2B08_off_01B577_len_00056D.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_316_table_2B08_off_01B577_len_00056D.strings.txt", + "text_path": null, + "primary_label": "CHEST_NS", + "field_names": [ + "ma0Q3", + "referent", + "fram", + "item", + "item2", + "counter" + ], + "field_tags": [ + "24:FC02->item", + "24:FC02->item2", + "24:FE02->item", + "4E:5300->ma0Q3", + "69:0000->referent", + "69:FA00->counter", + "69:FE00->fram" + ] + }, + { + "index": 317, + "table_offset": 11024, + "data_offset": 110644, + "declared_size": 1347, + "next_offset": 111991, + "extracted_size": 1347, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4276, + "zero_ratio": 0.2903, + "preview": "....o.......C.............M.#...........................\".......", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_317_table_2B10_off_01B034_len_000543.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_317_table_2B10_off_01B034_len_000543.strings.txt", + "text_path": null, + "primary_label": "CHEST_EW", + "field_names": [ + "ma0Q3", + "referent", + "fram", + "item", + "item2", + "counter" + ], + "field_tags": [ + "24:FC02->item", + "24:FC02->item2", + "24:FE02->item", + "45:5700->ma0Q3", + "69:0000->referent", + "69:FA00->counter", + "69:FE00->fram" + ] + }, + { + "index": 318, + "table_offset": 11128, + "data_offset": 510230, + "declared_size": 599, + "next_offset": 510829, + "extracted_size": 599, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3205, + "zero_ratio": 0.4541, + "preview": "............W.............d. ...................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_318_table_2B78_off_07C916_len_000257.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_318_table_2B78_off_07C916_len_000257.strings.txt", + "text_path": null, + "primary_label": "D_ENFORC", + "field_names": [ + "referent", + "goods" + ], + "field_tags": [ + "24:FE02->goods", + "69:0000->referent" + ] + }, + { + "index": 319, + "table_offset": 11144, + "data_offset": 134640, + "declared_size": 1220, + "next_offset": 135860, + "extracted_size": 1220, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3738, + "zero_ratio": 0.3238, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_319_table_2B88_off_020DF0_len_0004C4.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_319_table_2B88_off_020DF0_len_0004C4.strings.txt", + "text_path": null, + "primary_label": "DETPAC", + "field_names": [ + "referent", + "item", + "lastAnim", + "xOff", + "yOff", + "mine" + ], + "field_tags": [ + "24:F302->mine", + "24:FB02->item", + "69:0000->referent", + "69:F500->yOff", + "69:F700->xOff", + "69:F900->lastAnim" + ] + }, + { + "index": 320, + "table_offset": 11152, + "data_offset": 123299, + "declared_size": 2413, + "next_offset": 125712, + "extracted_size": 2413, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4186, + "zero_ratio": 0.2495, + "preview": "............m...w...........J.....................I.............", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_320_table_2B90_off_01E1A3_len_00096D.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_320_table_2B90_off_01E1A3_len_00096D.strings.txt", + "text_path": null, + "primary_label": "CRU_SPID", + "field_names": [ + "referent", + "mine", + "target", + "item", + "counter", + "lastAnim", + "xOff", + "yOff", + "counter2", + "spider" + ], + "field_tags": [ + "24:EF02->spider", + "24:F102->item", + "24:F702->item", + "24:F902->target", + "24:FE02->mine", + "69:0000->referent", + "69:EF00->yOff", + "69:F100->xOff", + "69:F300->lastAnim", + "69:F500->counter", + "69:F800->counter", + "69:F800->counter2", + "69:FA00->yOff", + "69:FC00->xOff", + "69:FE00->counter" + ] + }, + { + "index": 321, + "table_offset": 11160, + "data_offset": 65652, + "declared_size": 607, + "next_offset": 66259, + "extracted_size": 607, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3591, + "zero_ratio": 0.4267, + "preview": "............_...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_321_table_2B98_off_010074_len_00025F.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_321_table_2B98_off_010074_len_00025F.strings.txt", + "text_path": null, + "primary_label": "ALARMHAT", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 322, + "table_offset": 11184, + "data_offset": 193288, + "declared_size": 406, + "next_offset": 193694, + "extracted_size": 406, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2906, + "zero_ratio": 0.5788, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_322_table_2BB0_off_02F308_len_000196.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_322_table_2BB0_off_02F308_len_000196.strings.txt", + "text_path": null, + "primary_label": "ETWALLNS", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 323, + "table_offset": 11192, + "data_offset": 192882, + "declared_size": 406, + "next_offset": 193288, + "extracted_size": 406, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2906, + "zero_ratio": 0.5788, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_323_table_2BB8_off_02F172_len_000196.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_323_table_2BB8_off_02F172_len_000196.strings.txt", + "text_path": null, + "primary_label": "ETWALLEW", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 324, + "table_offset": 11200, + "data_offset": 409689, + "declared_size": 896, + "next_offset": 410585, + "extracted_size": 896, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3772, + "zero_ratio": 0.3638, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_324_table_2BC0_off_064059_len_000380.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_324_table_2BC0_off_064059_len_000380.strings.txt", + "text_path": null, + "primary_label": "THRMBCKN", + "field_names": [ + "referent", + "ewall", + "therma" + ], + "field_tags": [ + "24:FC02->therma", + "24:FE02->ewall", + "69:0000->referent" + ] + }, + { + "index": 325, + "table_offset": 11208, + "data_offset": 408793, + "declared_size": 896, + "next_offset": 409689, + "extracted_size": 896, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3772, + "zero_ratio": 0.3638, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_325_table_2BC8_off_063CD9_len_000380.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_325_table_2BC8_off_063CD9_len_000380.strings.txt", + "text_path": null, + "primary_label": "THRMBCKE", + "field_names": [ + "referent", + "ewall", + "therma" + ], + "field_tags": [ + "24:FC02->therma", + "24:FE02->ewall", + "69:0000->referent" + ] + }, + { + "index": 326, + "table_offset": 11248, + "data_offset": 351420, + "declared_size": 3172, + "next_offset": 354592, + "extracted_size": 3172, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4404, + "zero_ratio": 0.232, + "preview": "............d...v.................................a.$.....;.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_326_table_2BF0_off_055CBC_len_000C64.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_326_table_2BF0_off_055CBC_len_000C64.strings.txt", + "text_path": null, + "primary_label": "ROLL_EW", + "field_names": [ + "referent", + "item", + "item2", + "riderList", + "time", + "total", + "counter", + "oldz", + "cargo", + "zCheck", + "zMax", + "ma0Q6" + ], + "field_tags": [ + "24:EB02->cargo", + "24:FC02->item", + "24:FC02->item2", + "24:FE02->item", + "57:0000->ma0Q6", + "62:E800->zMax", + "69:0000->referent", + "69:E900->zCheck", + "69:F200->oldz", + "69:F600->counter", + "69:F800->total", + "69:FE00->time", + "6C:FA02->riderList" + ] + }, + { + "index": 327, + "table_offset": 11328, + "data_offset": 248110, + "declared_size": 428, + "next_offset": 248538, + "extracted_size": 428, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.257, + "zero_ratio": 0.5678, + "preview": "................^...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_327_table_2C40_off_03C92E_len_0001AC.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_327_table_2C40_off_03C92E_len_0001AC.strings.txt", + "text_path": null, + "primary_label": "KORESH", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 328, + "table_offset": 11416, + "data_offset": 66847, + "declared_size": 500, + "next_offset": 67347, + "extracted_size": 500, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.326, + "zero_ratio": 0.506, + "preview": ".... ...........N...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_328_table_2C98_off_01051F_len_0001F4.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_328_table_2C98_off_01051F_len_0001F4.strings.txt", + "text_path": null, + "primary_label": "ALRMTRIG", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 329, + "table_offset": 11424, + "data_offset": 190851, + "declared_size": 734, + "next_offset": 191585, + "extracted_size": 734, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3297, + "zero_ratio": 0.451, + "preview": "................8...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_329_table_2CA0_off_02E983_len_0002DE.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_329_table_2CA0_off_02E983_len_0002DE.strings.txt", + "text_path": null, + "primary_label": "ENERGY", + "field_names": [ + "referent", + "maxLimit", + "fule", + "item" + ], + "field_tags": [ + "24:FA02->item", + "69:0000->referent", + "69:FC00->fule", + "69:FE00->maxLimit" + ] + }, + { + "index": 330, + "table_offset": 11456, + "data_offset": 348248, + "declared_size": 3172, + "next_offset": 351420, + "extracted_size": 3172, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4442, + "zero_ratio": 0.2245, + "preview": "............d...v.................................a.$.....;.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_330_table_2CC0_off_055058_len_000C64.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_330_table_2CC0_off_055058_len_000C64.strings.txt", + "text_path": null, + "primary_label": "ROLLB_NS", + "field_names": [ + "referent", + "item", + "item2", + "riderList", + "time", + "total", + "counter", + "oldz", + "cargo", + "zCheck", + "zMax", + "ma0Q6" + ], + "field_tags": [ + "24:EB02->cargo", + "24:FC02->item", + "24:FC02->item2", + "24:FE02->item", + "4E:5300->ma0Q6", + "62:E800->zMax", + "69:0000->referent", + "69:E900->zCheck", + "69:F200->oldz", + "69:F600->counter", + "69:F800->total", + "69:FE00->time", + "6C:FA02->riderList" + ] + }, + { + "index": 331, + "table_offset": 11496, + "data_offset": 345068, + "declared_size": 3180, + "next_offset": 348248, + "extracted_size": 3180, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4484, + "zero_ratio": 0.2192, + "preview": "............l...~.................................a.,.....C.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_331_table_2CE8_off_0543EC_len_000C6C.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_331_table_2CE8_off_0543EC_len_000C6C.strings.txt", + "text_path": null, + "primary_label": "ROLLB_EW", + "field_names": [ + "referent", + "item", + "item2", + "riderList", + "time", + "total", + "counter", + "oldz", + "cargo", + "zCheck", + "zMax", + "ma0Q6" + ], + "field_tags": [ + "24:EB02->cargo", + "24:FC02->item", + "24:FC02->item2", + "24:FE02->item", + "45:5700->ma0Q6", + "62:E800->zMax", + "69:0000->referent", + "69:E900->zCheck", + "69:F200->oldz", + "69:F600->counter", + "69:F800->total", + "69:FE00->time", + "6C:FA02->riderList" + ] + }, + { + "index": 332, + "table_offset": 11528, + "data_offset": 485889, + "declared_size": 392, + "next_offset": 486281, + "extracted_size": 392, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2602, + "zero_ratio": 0.5893, + "preview": "................:...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_332_table_2D08_off_076A01_len_000188.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_332_table_2D08_off_076A01_len_000188.strings.txt", + "text_path": null, + "primary_label": "D_PLASMA", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 333, + "table_offset": 11584, + "data_offset": 486281, + "declared_size": 392, + "next_offset": 486673, + "extracted_size": 392, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2602, + "zero_ratio": 0.5893, + "preview": "................:...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_333_table_2D40_off_076B89_len_000188.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_333_table_2D40_off_076B89_len_000188.strings.txt", + "text_path": null, + "primary_label": "D_SKELET", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 334, + "table_offset": 11632, + "data_offset": 510829, + "declared_size": 392, + "next_offset": 511221, + "extracted_size": 392, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2602, + "zero_ratio": 0.5893, + "preview": "................:...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_334_table_2D70_off_07CB6D_len_000188.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_334_table_2D70_off_07CB6D_len_000188.strings.txt", + "text_path": null, + "primary_label": "D_EM_GUY", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 335, + "table_offset": 11648, + "data_offset": 525921, + "declared_size": 345, + "next_offset": 526266, + "extracted_size": 345, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2406, + "zero_ratio": 0.6551, + "preview": "............Y...........................................N.8.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_335_table_2D80_off_080661_len_000159.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_335_table_2D80_off_080661_len_000159.strings.txt", + "text_path": null, + "primary_label": "DEATHFL4", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 336, + "table_offset": 11656, + "data_offset": 509007, + "declared_size": 452, + "next_offset": 509459, + "extracted_size": 452, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3031, + "zero_ratio": 0.542, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_336_table_2D88_off_07C44F_len_0001C4.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_336_table_2D88_off_07C44F_len_0001C4.strings.txt", + "text_path": null, + "primary_label": "DAMNLUGG", + "field_names": [ + "ma0Q0", + "referent" + ], + "field_tags": [ + "47:4700->ma0Q0", + "69:0000->referent" + ] + }, + { + "index": 337, + "table_offset": 11664, + "data_offset": 509459, + "declared_size": 452, + "next_offset": 509911, + "extracted_size": 452, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3031, + "zero_ratio": 0.542, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_337_table_2D90_off_07C613_len_0001C4.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_337_table_2D90_off_07C613_len_0001C4.strings.txt", + "text_path": null, + "primary_label": "DAMNMCR8", + "field_names": [ + "ma0Q0", + "referent" + ], + "field_tags": [ + "52:3800->ma0Q0", + "69:0000->referent" + ] + }, + { + "index": 338, + "table_offset": 11680, + "data_offset": 526266, + "declared_size": 345, + "next_offset": 526611, + "extracted_size": 345, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2406, + "zero_ratio": 0.6551, + "preview": "............Y...........................................N.8.....", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_338_table_2DA0_off_0807BA_len_000159.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_338_table_2DA0_off_0807BA_len_000159.strings.txt", + "text_path": null, + "primary_label": "DEATHFL5", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 339, + "table_offset": 16536, + "data_offset": 69063, + "declared_size": 930, + "next_offset": 69993, + "extracted_size": 930, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3516, + "zero_ratio": 0.3301, + "preview": "....................*.+...*.................Z.U.................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_339_table_4098_off_010DC7_len_0003A2.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_339_table_4098_off_010DC7_len_0003A2.strings.txt", + "text_path": null, + "primary_label": "AVATAR", + "field_names": [ + "referent", + "item", + "slot", + "counter" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent", + "69:FA00->counter", + "69:FC00->slot" + ] + }, + { + "index": 340, + "table_offset": 18576, + "data_offset": 412715, + "declared_size": 552, + "next_offset": 413267, + "extracted_size": 552, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3062, + "zero_ratio": 0.4746, + "preview": "....T.......(...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_340_table_4890_off_064C2B_len_000228.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_340_table_4890_off_064C2B_len_000228.strings.txt", + "text_path": null, + "primary_label": "TRIGEGG", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 341, + "table_offset": 18584, + "data_offset": 314355, + "declared_size": 563, + "next_offset": 314918, + "extracted_size": 563, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3091, + "zero_ratio": 0.4689, + "preview": "...._.......3...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_341_table_4898_off_04CBF3_len_000233.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_341_table_4898_off_04CBF3_len_000233.strings.txt", + "text_path": null, + "primary_label": "ONCEEGG", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 342, + "table_offset": 18592, + "data_offset": 213703, + "declared_size": 1400, + "next_offset": 215103, + "extracted_size": 1400, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4229, + "zero_ratio": 0.305, + "preview": "............x...*...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_342_table_48A0_off_0342C7_len_000578.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_342_table_48A0_off_0342C7_len_000578.strings.txt", + "text_path": null, + "primary_label": "FLOOR1", + "field_names": [ + "referent", + "counter", + "item", + "item2", + "highNumber", + "lowNumber", + "tempNumber", + "floorItems", + "wantToStop", + "foundFloor", + "onTime" + ], + "field_tags": [ + "24:FA02->item", + "24:FA02->item2", + "24:FC02->item", + "69:0000->referent", + "69:EC00->onTime", + "69:EE00->foundFloor", + "69:F000->wantToStop", + "69:F400->tempNumber", + "69:F600->lowNumber", + "69:F800->highNumber", + "69:FE00->counter", + "6C:F202->floorItems" + ] + }, + { + "index": 343, + "table_offset": 18600, + "data_offset": 303790, + "declared_size": 903, + "next_offset": 304693, + "extracted_size": 903, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.392, + "zero_ratio": 0.3699, + "preview": "................9.............................................L.", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_343_table_48A8_off_04A2AE_len_000387.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_343_table_48A8_off_04A2AE_len_000387.strings.txt", + "text_path": null, + "primary_label": "MTAREGG", + "field_names": [ + "referent", + "item", + "hiValue", + "loValue" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent", + "69:F800->loValue", + "69:FA00->hiValue" + ] + }, + { + "index": 344, + "table_offset": 18608, + "data_offset": 109626, + "declared_size": 437, + "next_offset": 110063, + "extracted_size": 437, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2563, + "zero_ratio": 0.5492, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_344_table_48B0_off_01AC3A_len_0001B5.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_344_table_48B0_off_01AC3A_len_0001B5.strings.txt", + "text_path": null, + "primary_label": "CHANGER", + "field_names": [ + "referent", + "roof", + "doorQuality", + "roofQuality", + "eggNum" + ], + "field_tags": [ + "24:FE02->roof", + "69:0000->referent", + "69:F800->eggNum", + "69:FA00->roof", + "69:FA00->roofQuality", + "69:FC00->doorQuality" + ] + }, + { + "index": 345, + "table_offset": 18616, + "data_offset": 101135, + "declared_size": 787, + "next_offset": 101922, + "extracted_size": 787, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3291, + "zero_ratio": 0.3875, + "preview": "....?...........................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_345_table_48B8_off_018B0F_len_000313.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_345_table_48B8_off_018B0F_len_000313.strings.txt", + "text_path": null, + "primary_label": "CAMERA", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 346, + "table_offset": 18624, + "data_offset": 363960, + "declared_size": 390, + "next_offset": 364350, + "extracted_size": 390, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2333, + "zero_ratio": 0.6026, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_346_table_48C0_off_058DB8_len_000186.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_346_table_48C0_off_058DB8_len_000186.strings.txt", + "text_path": null, + "primary_label": "SECRTEGG", + "field_names": [ + "referent", + "item", + "door", + "range" + ], + "field_tags": [ + "24:FC02->door", + "24:FE02->item", + "69:0000->referent", + "69:F800->range" + ] + }, + { + "index": 347, + "table_offset": 18632, + "data_offset": 328823, + "declared_size": 4278, + "next_offset": 333101, + "extracted_size": 4278, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4741, + "zero_ratio": 0.1889, + "preview": "............................................Q...................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_347_table_48C8_off_050477_len_0010B6.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_347_table_48C8_off_050477_len_0010B6.strings.txt", + "text_path": null, + "primary_label": "REB_EGG", + "field_names": [ + "referent", + "item", + "door", + "moreVideo", + "chest", + "phold", + "counter", + "counter2" + ], + "field_tags": [ + "24:F802->door", + "24:FC02->phold", + "24:FE02->chest", + "24:FE02->item", + "62:F700->moreVideo", + "69:0000->referent", + "69:F800->counter", + "69:F800->counter2", + "69:FA00->counter" + ] + }, + { + "index": 348, + "table_offset": 18640, + "data_offset": 398125, + "declared_size": 546, + "next_offset": 398671, + "extracted_size": 546, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2857, + "zero_ratio": 0.544, + "preview": "....N.......\"...|.............................................N.", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_348_table_48D0_off_06132D_len_000222.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_348_table_48D0_off_06132D_len_000222.strings.txt", + "text_path": null, + "primary_label": "TEST", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 349, + "table_offset": 18648, + "data_offset": 234323, + "declared_size": 563, + "next_offset": 234886, + "extracted_size": 563, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3179, + "zero_ratio": 0.4547, + "preview": "...._.......3................................................._.", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_349_table_48D8_off_039353_len_000233.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_349_table_48D8_off_039353_len_000233.strings.txt", + "text_path": null, + "primary_label": "GRENEGG", + "field_names": [ + "referent", + "item", + "source", + "dest", + "counter" + ], + "field_tags": [ + "24:FA02->dest", + "24:FC02->source", + "24:FE02->item", + "69:0000->referent", + "69:F800->counter" + ] + }, + { + "index": 350, + "table_offset": 18656, + "data_offset": 170522, + "declared_size": 638, + "next_offset": 171160, + "extracted_size": 638, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3966, + "zero_ratio": 0.431, + "preview": "............~.................................................I.", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_350_table_48E0_off_029A1A_len_00027E.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_350_table_48E0_off_029A1A_len_00027E.strings.txt", + "text_path": null, + "primary_label": "DOOREGG", + "field_names": [ + "referent", + "door" + ], + "field_tags": [ + "24:FE02->door", + "69:0000->referent" + ] + }, + { + "index": 351, + "table_offset": 18664, + "data_offset": 77798, + "declared_size": 370, + "next_offset": 78168, + "extracted_size": 370, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2324, + "zero_ratio": 0.6243, + "preview": "............r...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_351_table_48E8_off_012FE6_len_000172.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_351_table_48E8_off_012FE6_len_000172.strings.txt", + "text_path": null, + "primary_label": "BBTRIP", + "field_names": [ + "referent", + "item", + "bbetty" + ], + "field_tags": [ + "24:FC02->bbetty", + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 352, + "table_offset": 18672, + "data_offset": 251648, + "declared_size": 399, + "next_offset": 252047, + "extracted_size": 399, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2607, + "zero_ratio": 0.5965, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_352_table_48F0_off_03D700_len_00018F.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_352_table_48F0_off_03D700_len_00018F.strings.txt", + "text_path": null, + "primary_label": "LAZEREGG", + "field_names": [ + "referent", + "laser" + ], + "field_tags": [ + "24:FE02->laser", + "69:0000->referent" + ] + }, + { + "index": 353, + "table_offset": 18680, + "data_offset": 275226, + "declared_size": 5251, + "next_offset": 280477, + "extracted_size": 5251, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4927, + "zero_ratio": 0.1859, + "preview": "..............................................^.................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_353_table_48F8_off_04331A_len_001483.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_353_table_48F8_off_04331A_len_001483.strings.txt", + "text_path": null, + "primary_label": "MISS1EGG", + "field_names": [ + "referent", + "item", + "pad2", + "buster", + "slot", + "eTrigger", + "counter", + "rubberSuit", + "pathegg", + "guardBoy", + "door" + ], + "field_tags": [ + "24:F602->door", + "24:F802->guardBoy", + "24:FA02->buster", + "24:FA02->item", + "24:FC02->eTrigger", + "24:FC02->pad2", + "24:FC02->pathegg", + "24:FE02->buster", + "24:FE02->door", + "24:FE02->item", + "24:FE02->rubberSuit", + "69:0000->referent", + "69:0A00->buster", + "69:F800->counter", + "69:F800->slot", + "69:FA00->counter", + "69:FC00->counter" + ] + }, + { + "index": 354, + "table_offset": 18688, + "data_offset": 280477, + "declared_size": 8924, + "next_offset": 289401, + "extracted_size": 8924, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4545, + "zero_ratio": 0.2038, + "preview": ".....!.......\"...'..........................3.................3.", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_354_table_4900_off_04479D_len_0022DC.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_354_table_4900_off_04479D_len_0022DC.strings.txt", + "text_path": null, + "primary_label": "MISS2", + "field_names": [ + "referent", + "counter", + "item", + "done0", + "done1", + "done2", + "activate", + "itemNum", + "position", + "turn", + "body", + "door", + "door1", + "door2", + "door3", + "hoffman", + "pathEgg", + "vargas" + ], + "field_tags": [ + "24:0602->item", + "24:E602->pathEgg", + "24:EC02->hoffman", + "24:F002->door", + "24:F002->door3", + "24:F202->door", + "24:F202->door2", + "24:F402->door", + "24:F402->door1", + "24:F602->door", + "24:F802->vargas", + "24:FA02->body", + "24:FA02->item", + "24:FC02->item", + "24:FE02->item", + "62:FC00->activate", + "62:FD00->done2", + "62:FE00->done1", + "62:FF00->done0", + "69:0000->referent", + "69:0600->counter", + "69:0600->position", + "69:F300->item", + "69:F300->itemNum", + "69:F300->turn", + "69:F500->item", + "69:F500->itemNum", + "69:F700->counter", + "69:FE00->counter" + ] + }, + { + "index": 355, + "table_offset": 18696, + "data_offset": 289401, + "declared_size": 543, + "next_offset": 289944, + "extracted_size": 543, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3094, + "zero_ratio": 0.5304, + "preview": "....K.......................................3...................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_355_table_4908_off_046A79_len_00021F.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_355_table_4908_off_046A79_len_00021F.strings.txt", + "text_path": null, + "primary_label": "MISS3", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 356, + "table_offset": 18704, + "data_offset": 289944, + "declared_size": 674, + "next_offset": 290618, + "extracted_size": 674, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3457, + "zero_ratio": 0.4733, + "preview": "..............................................9...............f.", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_356_table_4910_off_046C98_len_0002A2.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_356_table_4910_off_046C98_len_0002A2.strings.txt", + "text_path": null, + "primary_label": "MISS4", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 357, + "table_offset": 18712, + "data_offset": 290618, + "declared_size": 2660, + "next_offset": 293278, + "extracted_size": 2660, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4184, + "zero_ratio": 0.2643, + "preview": "............d...n...........................3.................l.", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_357_table_4918_off_046F3A_len_000A64.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_357_table_4918_off_046F3A_len_000A64.strings.txt", + "text_path": null, + "primary_label": "MISS5", + "field_names": [ + "referent", + "counter", + "item", + "door", + "willmar", + "post1", + "post2", + "floor" + ], + "field_tags": [ + "24:F002->floor", + "24:F202->post2", + "24:F402->post1", + "24:F602->willmar", + "24:FA02->door", + "24:FC02->item", + "69:0000->referent", + "69:FE00->counter" + ] + }, + { + "index": 358, + "table_offset": 18720, + "data_offset": 293278, + "declared_size": 2005, + "next_offset": 295283, + "extracted_size": 2005, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4474, + "zero_ratio": 0.2918, + "preview": "................7...........................3...................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_358_table_4920_off_04799E_len_0007D5.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_358_table_4920_off_04799E_len_0007D5.strings.txt", + "text_path": null, + "primary_label": "MISS6", + "field_names": [ + "referent", + "snell", + "item", + "door", + "doorX" + ], + "field_tags": [ + "24:F802->door", + "24:FA02->item", + "24:FE02->snell", + "69:0000->referent", + "69:F600->door", + "69:F600->doorX" + ] + }, + { + "index": 359, + "table_offset": 18728, + "data_offset": 295283, + "declared_size": 318, + "next_offset": 295601, + "extracted_size": 318, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1604, + "zero_ratio": 0.717, + "preview": "....j.......>...............................j...................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_359_table_4928_off_048173_len_00013E.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_359_table_4928_off_048173_len_00013E.strings.txt", + "text_path": null, + "primary_label": "MISS7", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 360, + "table_offset": 18736, + "data_offset": 295601, + "declared_size": 2377, + "next_offset": 297978, + "extracted_size": 2377, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4279, + "zero_ratio": 0.2722, + "preview": "....o.......I...S...........................3.................c.", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_360_table_4930_off_0482B1_len_000949.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_360_table_4930_off_0482B1_len_000949.strings.txt", + "text_path": null, + "primary_label": "MISS8", + "field_names": [ + "referent", + "willmar", + "counter", + "item", + "cardReader", + "telebeam", + "telepad" + ], + "field_tags": [ + "24:F402->telepad", + "24:F602->telebeam", + "24:F802->cardReader", + "24:FA02->item", + "24:FE02->willmar", + "69:0000->referent", + "69:FC00->counter" + ] + }, + { + "index": 361, + "table_offset": 18744, + "data_offset": 297978, + "declared_size": 1533, + "next_offset": 299511, + "extracted_size": 1533, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4371, + "zero_ratio": 0.3125, + "preview": "....#.......................................3.................c.", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_361_table_4938_off_048BFA_len_0005FD.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_361_table_4938_off_048BFA_len_0005FD.strings.txt", + "text_path": null, + "primary_label": "MISS9", + "field_names": [ + "referent", + "target", + "station", + "screen", + "item", + "counter" + ], + "field_tags": [ + "24:F802->item", + "24:FA02->screen", + "24:FC02->station", + "24:FE02->target", + "69:0000->referent", + "69:F600->counter" + ] + }, + { + "index": 362, + "table_offset": 18752, + "data_offset": 271194, + "declared_size": 434, + "next_offset": 271628, + "extracted_size": 434, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2811, + "zero_ratio": 0.5806, + "preview": "................d...........................3...................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_362_table_4940_off_04235A_len_0001B2.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_362_table_4940_off_04235A_len_0001B2.strings.txt", + "text_path": null, + "primary_label": "MISS10", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 363, + "table_offset": 18760, + "data_offset": 271628, + "declared_size": 472, + "next_offset": 272100, + "extracted_size": 472, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2881, + "zero_ratio": 0.5614, + "preview": "............................................3...................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_363_table_4948_off_04250C_len_0001D8.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_363_table_4948_off_04250C_len_0001D8.strings.txt", + "text_path": null, + "primary_label": "MISS11", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 364, + "table_offset": 18768, + "data_offset": 272100, + "declared_size": 507, + "next_offset": 272607, + "extracted_size": 507, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2919, + "zero_ratio": 0.5247, + "preview": "....'.......................................3...................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_364_table_4950_off_0426E4_len_0001FB.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_364_table_4950_off_0426E4_len_0001FB.strings.txt", + "text_path": null, + "primary_label": "MISS12", + "field_names": [ + "referent", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 365, + "table_offset": 18776, + "data_offset": 272607, + "declared_size": 1680, + "next_offset": 274287, + "extracted_size": 1680, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4577, + "zero_ratio": 0.281, + "preview": "............................................3.................u.", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_365_table_4958_off_0428DF_len_000690.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_365_table_4958_off_0428DF_len_000690.strings.txt", + "text_path": null, + "primary_label": "MISS13", + "field_names": [ + "referent", + "counter", + "item", + "wench", + "npcWench", + "door" + ], + "field_tags": [ + "24:F402->door", + "24:F602->npcWench", + "24:F802->wench", + "24:FC02->item", + "69:0000->referent", + "69:FE00->counter" + ] + }, + { + "index": 366, + "table_offset": 18784, + "data_offset": 274287, + "declared_size": 939, + "next_offset": 275226, + "extracted_size": 939, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3813, + "zero_ratio": 0.3813, + "preview": "................].............................Y...............X.", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_366_table_4960_off_042F6F_len_0003AB.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_366_table_4960_off_042F6F_len_0003AB.strings.txt", + "text_path": null, + "primary_label": "MISS14", + "field_names": [ + "referent", + "counter", + "item" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent", + "69:FE00->counter" + ] + }, + { + "index": 367, + "table_offset": 18792, + "data_offset": 551285, + "declared_size": 1320, + "next_offset": 552605, + "extracted_size": 1320, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4258, + "zero_ratio": 0.3182, + "preview": "....T.......(...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_367_table_4968_off_086975_len_000528.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_367_table_4968_off_086975_len_000528.strings.txt", + "text_path": null, + "primary_label": "MISS15", + "field_names": [ + "referent", + "item", + "counter", + "door" + ], + "field_tags": [ + "24:FA02->door", + "24:FE02->item", + "69:0000->referent", + "69:FC00->counter" + ] + }, + { + "index": 368, + "table_offset": 18800, + "data_offset": 305417, + "declared_size": 254, + "next_offset": 305671, + "extracted_size": 254, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.1063, + "zero_ratio": 0.8465, + "preview": "....*...........X.............................................*.", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_368_table_4970_off_04A909_len_0000FE.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_368_table_4970_off_04A909_len_0000FE.strings.txt", + "text_path": null, + "primary_label": "MUSIC", + "field_names": [ + "referent" + ], + "field_tags": [ + "69:0000->referent" + ] + }, + { + "index": 369, + "table_offset": 18808, + "data_offset": 487353, + "declared_size": 461, + "next_offset": 487814, + "extracted_size": 461, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2842, + "zero_ratio": 0.5336, + "preview": "................'...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_369_table_4978_off_076FB9_len_0001CD.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_369_table_4978_off_076FB9_len_0001CD.strings.txt", + "text_path": null, + "primary_label": "STEAMEGG", + "field_names": [ + "referent", + "sBox" + ], + "field_tags": [ + "24:FE02->sBox", + "69:0000->referent" + ] + }, + { + "index": 370, + "table_offset": 20624, + "data_offset": 70838, + "declared_size": 1397, + "next_offset": 72235, + "extracted_size": 1397, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4037, + "zero_ratio": 0.3193, + "preview": "............u...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_370_table_5090_off_0114B6_len_000575.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_370_table_5090_off_0114B6_len_000575.strings.txt", + "text_path": null, + "primary_label": "BARREL", + "field_names": [ + "ma0Q3", + "referent", + "barrel", + "item2", + "isYellowBarrel", + "isStandingBarrel", + "link" + ], + "field_tags": [ + "00:0000->ma0Q3", + "24:FC02->item2", + "24:FE02->barrel", + "62:FA00->isStandingBarrel", + "62:FB00->isYellowBarrel", + "69:0000->referent", + "69:F800->link" + ] + }, + { + "index": 371, + "table_offset": 20632, + "data_offset": 76358, + "declared_size": 1440, + "next_offset": 77798, + "extracted_size": 1440, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3812, + "zero_ratio": 0.3021, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_371_table_5098_off_012A46_len_0005A0.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_371_table_5098_off_012A46_len_0005A0.strings.txt", + "text_path": null, + "primary_label": "BBETTY", + "field_names": [ + "referent", + "item", + "counter", + "counter2", + "total", + "item3" + ], + "field_tags": [ + "24:F302->item", + "24:F302->item3", + "24:FE02->item", + "69:0000->referent", + "69:F600->counter", + "69:F800->total", + "69:FA00->counter", + "69:FA00->counter2", + "69:FC00->counter" + ] + }, + { + "index": 372, + "table_offset": 20640, + "data_offset": 80587, + "declared_size": 1641, + "next_offset": 82228, + "extracted_size": 1641, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3924, + "zero_ratio": 0.2864, + "preview": "............i...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_372_table_50A0_off_013ACB_len_000669.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_372_table_50A0_off_013ACB_len_000669.strings.txt", + "text_path": null, + "primary_label": "BLASER", + "field_names": [ + "referent", + "laserList", + "item", + "inFastArea", + "count", + "link" + ], + "field_tags": [ + "24:F702->item", + "69:0000->referent", + "69:ED00->link", + "69:F100->count", + "69:F500->inFastArea", + "6C:F902->laserList" + ] + }, + { + "index": 373, + "table_offset": 20648, + "data_offset": 93420, + "declared_size": 5013, + "next_offset": 98433, + "extracted_size": 5013, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4482, + "zero_ratio": 0.1753, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_373_table_50A8_off_016CEC_len_001395.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_373_table_50A8_off_016CEC_len_001395.strings.txt", + "text_path": null, + "primary_label": "BRIDGE", + "field_names": [ + "referent", + "item", + "newtype", + "item2", + "start", + "bridgeitems", + "bridgemax", + "item3", + "cycletype", + "delay", + "retry" + ], + "field_tags": [ + "24:0602->item", + "24:E302->item", + "24:E302->item2", + "24:F002->item", + "24:F002->item3", + "24:F202->item", + "24:F202->item2", + "24:FC02->item", + "24:FC02->item2", + "24:FE02->item", + "64:6765->item", + "69:0000->referent", + "69:0800->newtype", + "69:0A00->start", + "69:EA00->retry", + "69:EC00->delay", + "69:EE00->cycletype", + "69:F800->bridgemax", + "69:FA00->bridgemax", + "6C:FA02->bridgeitems", + "6C:FC02->bridgeitems" + ] + }, + { + "index": 374, + "table_offset": 20656, + "data_offset": 114659, + "declared_size": 1083, + "next_offset": 115742, + "extracted_size": 1083, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4238, + "zero_ratio": 0.3398, + "preview": "....a.......;...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_374_table_50B0_off_01BFE3_len_00043B.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_374_table_50B0_off_01BFE3_len_00043B.strings.txt", + "text_path": null, + "primary_label": "CONVEYOR", + "field_names": [ + "referent", + "counter", + "areThereItems", + "cargo_item" + ], + "field_tags": [ + "24:FB02->cargo_item", + "62:FD00->areThereItems", + "69:0000->referent", + "69:FE00->counter" + ] + }, + { + "index": 375, + "table_offset": 20664, + "data_offset": 131639, + "declared_size": 1966, + "next_offset": 133605, + "extracted_size": 1966, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3896, + "zero_ratio": 0.2579, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_375_table_50B8_off_020237_len_0007AE.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_375_table_50B8_off_020237_len_0007AE.strings.txt", + "text_path": null, + "primary_label": "DEATHFL", + "field_names": [ + "referent", + "item", + "item2", + "counter", + "spoogeType" + ], + "field_tags": [ + "24:FC02->item", + "24:FC02->item2", + "24:FE02->item", + "69:0000->referent", + "69:EC00->spoogeType", + "69:FA00->counter" + ] + }, + { + "index": 376, + "table_offset": 20672, + "data_offset": 135860, + "declared_size": 8488, + "next_offset": 144348, + "extracted_size": 8488, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4807, + "zero_ratio": 0.1714, + "preview": "....< ......(!...\"..............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_376_table_50C0_off_0212B4_len_002128.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_376_table_50C0_off_0212B4_len_002128.strings.txt", + "text_path": null, + "primary_label": "DOOR", + "field_names": [ + "referent", + "doorType", + "ewall", + "roof", + "count", + "doorParam", + "doorQuality", + "roofQuality", + "ma0QS", + "deathBox", + "item", + "item2", + "hitMe", + "damagePoints" + ], + "field_tags": [ + "00:0000->ma0QS", + "24:FA02->item", + "24:FA02->item2", + "24:FC02->ewall", + "24:FC02->item", + "24:FE02->deathBox", + "24:FE02->roof", + "69:0000->referent", + "69:F600->damagePoints", + "69:F600->roof", + "69:F600->roofQuality", + "69:F800->doorQuality", + "69:F800->hitMe", + "69:FA00->doorParam", + "69:FC00->count", + "69:FE00->doorType" + ] + }, + { + "index": 377, + "table_offset": 20680, + "data_offset": 144348, + "declared_size": 16879, + "next_offset": 161227, + "extracted_size": 16879, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4478, + "zero_ratio": 0.1674, + "preview": ")...%@.......A...P..............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_377_table_50C8_off_0233DC_len_0041EF.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_377_table_50C8_off_0233DC_len_0041EF.strings.txt", + "text_path": null, + "primary_label": "DOOR2", + "field_names": [ + "referent", + "doorList", + "counter", + "maxFrame", + "counter2", + "doorList2", + "door1", + "door2", + "item", + "nonLegalDoor1", + "nonLegalDoor2", + "bool", + "link", + "item2", + "item3", + "prisDoor", + "newFrame" + ], + "field_tags": [ + "24:F202->item", + "24:F402->door2", + "24:F402->item", + "24:F602->door1", + "24:F602->door2", + "24:F602->item", + "24:F602->item2", + "24:F802->door1", + "24:F802->item", + "24:F802->prisDoor", + "24:FA02->item", + "24:FA02->item3", + "24:FA02->prisDoor", + "24:FC02->item", + "24:FC02->item2", + "24:FE02->item", + "62:EF00->bool", + "62:F000->nonLegalDoor2", + "62:F100->nonLegalDoor1", + "69:0000->referent", + "69:E000->link", + "69:E200->link", + "69:ED00->maxFrame", + "69:F200->maxFrame", + "69:F400->maxFrame", + "69:F600->counter", + "69:F600->maxFrame", + "69:F800->counter", + "69:F800->counter2", + "69:F800->maxFrame", + "69:FA00->counter", + "69:FA00->counter2", + "69:FA00->link", + "69:FA00->maxFrame", + "69:FC00->counter", + "69:FC00->counter2", + "69:FC00->maxFrame", + "69:FC00->newFrame", + "69:FE00->counter", + "6C:FC02->doorList", + "6C:FC02->doorList2", + "6C:FE02->doorList" + ] + }, + { + "index": 378, + "table_offset": 20688, + "data_offset": 161227, + "declared_size": 9295, + "next_offset": 170522, + "extracted_size": 9295, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4454, + "zero_ratio": 0.1635, + "preview": "....3#......O$..q(..............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_378_table_50D0_off_0275CB_len_00244F.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_378_table_50D0_off_0275CB_len_00244F.strings.txt", + "text_path": null, + "primary_label": "DOOR3", + "field_names": [ + "referent", + "doorList", + "doorList2", + "counter", + "door2", + "maxFrame", + "counter2", + "door1", + "item", + "nonLegalDoor1", + "nonLegalDoor2", + "bool" + ], + "field_tags": [ + "24:F202->item", + "24:F402->door2", + "24:F602->door1", + "24:F802->door2", + "62:EF00->bool", + "62:F000->nonLegalDoor2", + "62:F100->nonLegalDoor1", + "69:0000->referent", + "69:ED00->maxFrame", + "69:F600->maxFrame", + "69:F800->counter", + "69:F800->counter2", + "69:FA00->counter", + "69:FC00->maxFrame", + "69:FE00->counter", + "6C:FC02->doorList", + "6C:FC02->doorList2", + "6C:FE02->doorList", + "6C:FE02->doorList2" + ] + }, + { + "index": 379, + "table_offset": 20696, + "data_offset": 180693, + "declared_size": 2965, + "next_offset": 183658, + "extracted_size": 2965, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4216, + "zero_ratio": 0.2395, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_379_table_50D8_off_02C1D5_len_000B95.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_379_table_50D8_off_02C1D5_len_000B95.strings.txt", + "text_path": null, + "primary_label": "ELEVAT", + "field_names": [ + "referent", + "cargoUp", + "existCargo", + "counter", + "height", + "maxLimit", + "maxLimitCount", + "counter2", + "total", + "minLimit", + "minLimitCount", + "cargoDown", + "total2", + "liftpit", + "pitCounter", + "totFrames", + "checkX", + "checkY" + ], + "field_tags": [ + "24:F502->cargoDown", + "24:FE02->cargoUp", + "24:FE02->liftpit", + "62:FA00->height", + "62:FB00->height", + "62:FC00->totFrames", + "62:FD00->existCargo", + "62:FD00->pitCounter", + "69:0000->referent", + "69:E800->total", + "69:E800->total2", + "69:F200->total", + "69:F400->counter", + "69:F400->counter2", + "69:F600->maxLimit", + "69:F600->maxLimitCount", + "69:F700->minLimit", + "69:F700->minLimitCount", + "69:F800->checkY", + "69:F800->maxLimit", + "69:F900->minLimit", + "69:FA00->checkX", + "69:FB00->counter", + "69:FC00->counter", + "69:FC00->counter2", + "69:FE00->counter" + ] + }, + { + "index": 380, + "table_offset": 20704, + "data_offset": 210115, + "declared_size": 212, + "next_offset": 210327, + "extracted_size": 212, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.0, + "zero_ratio": 0.9811, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_380_table_50E0_off_0334C3_len_0000D4.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_380_table_50E0_off_0334C3_len_0000D4.strings.txt", + "text_path": null, + "primary_label": null, + "field_names": [], + "field_tags": [] + }, + { + "index": 381, + "table_offset": 20712, + "data_offset": 210327, + "declared_size": 720, + "next_offset": 211047, + "extracted_size": 720, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3542, + "zero_ratio": 0.4472, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_381_table_50E8_off_033597_len_0002D0.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_381_table_50E8_off_033597_len_0002D0.strings.txt", + "text_path": null, + "primary_label": "FLAME", + "field_names": [ + "referent", + "item", + "detect" + ], + "field_tags": [ + "24:FE02->item", + "62:FD00->detect", + "69:0000->referent" + ] + }, + { + "index": 382, + "table_offset": 20720, + "data_offset": 215644, + "declared_size": 7938, + "next_offset": 223582, + "extracted_size": 7938, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4248, + "zero_ratio": 0.2372, + "preview": "\"...b............*..............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_382_table_50F0_off_034A5C_len_001F02.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_382_table_50F0_off_034A5C_len_001F02.strings.txt", + "text_path": null, + "primary_label": "FREE", + "field_names": [ + "flick", + "localFlick", + "item1", + "item2", + "avatarMap", + "npc1", + "npc2", + "ref1", + "ref2", + "dist", + "range", + "item", + "closestItem", + "closest", + "phold", + "addType", + "fram", + "time", + "oldTick", + "newTick", + "ptype", + "list", + "member", + "count", + "line", + "temp", + "lines", + "counter", + "alarm", + "notAlarmed", + "rndVoice", + "source", + "leftOvers" + ], + "field_tags": [ + "24:F602->npc2", + "24:F802->npc1", + "24:FA02->item", + "24:FC02->closest", + "24:FC02->closestItem", + "24:FC02->item", + "24:FC02->item2", + "24:FC02->phold", + "24:FE02->item", + "24:FE02->item1", + "24:FE02->phold", + "62:F500->notAlarmed", + "62:FD00->leftOvers", + "64:F800->newTick", + "64:FC00->oldTick", + "69:0600->range", + "69:0600->ref1", + "69:0600->source", + "69:0600->time", + "69:0800->addType", + "69:0800->ptype", + "69:0800->ref2", + "69:0A00->fram", + "69:F800->dist", + "69:FA00->avatarMap", + "69:FA00->closest", + "69:FA00->rndVoice", + "69:FC00->alarm", + "69:FC00->count", + "69:FE00->count", + "69:FE00->counter", + "69:FE00->dist", + "69:FE00->member", + "6C:0602->list", + "73:0600->flick", + "73:0800->line", + "73:FE00->line", + "73:FE00->localFlick", + "73:FE00->member", + "7A:0602->list", + "7A:0802->line", + "7A:0802->lines", + "7A:FE02->temp" + ] + }, + { + "index": 383, + "table_offset": 20728, + "data_offset": 237027, + "declared_size": 6356, + "next_offset": 243383, + "extracted_size": 6356, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4246, + "zero_ratio": 0.1723, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_383_table_50F8_off_039DE3_len_0018D4.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_383_table_50F8_off_039DE3_len_0018D4.strings.txt", + "text_path": null, + "primary_label": "HOVER", + "field_names": [ + "referent", + "total", + "counter", + "cargo", + "hover", + "xacc", + "yacc", + "zacc", + "xfract", + "yfract", + "zfract", + "firstEgg", + "targetEgg", + "time", + "oldqhi", + "link", + "item", + "check" + ], + "field_tags": [ + "24:E702->hover", + "24:E902->cargo", + "24:EB02->item", + "24:ED02->hover", + "24:FA02->hover", + "24:FC02->item", + "24:FE02->cargo", + "62:0C00->check", + "64:C400->zfract", + "64:C800->yfract", + "64:CC00->xfract", + "64:D000->zacc", + "64:D400->yacc", + "64:D800->xacc", + "69:0000->referent", + "69:F000->link", + "69:F200->firstEgg", + "69:F400->link", + "69:F600->oldqhi", + "69:F700->counter", + "69:F800->time", + "69:F900->total", + "69:FA00->targetEgg", + "69:FC00->firstEgg" + ] + }, + { + "index": 384, + "table_offset": 20736, + "data_offset": 246312, + "declared_size": 808, + "next_offset": 247120, + "extracted_size": 808, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3985, + "zero_ratio": 0.4072, + "preview": "....N.......(...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_384_table_5100_off_03C228_len_000328.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_384_table_5100_off_03C228_len_000328.strings.txt", + "text_path": null, + "primary_label": "KEYPAD", + "field_names": [ + "referent", + "valueBox", + "boxesInArea", + "linkedWithSwitch", + "wrongCode", + "userInput", + "boxPasscode", + "keycode" + ], + "field_tags": [ + "24:FE02->valueBox", + "62:FA00->wrongCode", + "62:FB00->linkedWithSwitch", + "69:0000->referent", + "69:F400->keycode", + "69:F600->boxPasscode", + "69:F800->userInput", + "69:FC00->boxesInArea" + ] + }, + { + "index": 385, + "table_offset": 20744, + "data_offset": 250831, + "declared_size": 817, + "next_offset": 251648, + "extracted_size": 817, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3378, + "zero_ratio": 0.3721, + "preview": "....W.......1...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_385_table_5108_off_03D3CF_len_000331.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_385_table_5108_off_03D3CF_len_000331.strings.txt", + "text_path": null, + "primary_label": "LAZER", + "field_names": [ + "referent", + "item", + "monster" + ], + "field_tags": [ + "24:FC02->monster", + "24:FE02->item", + "69:0000->referent" + ] + }, + { + "index": 386, + "table_offset": 20752, + "data_offset": 256665, + "declared_size": 1237, + "next_offset": 257902, + "extracted_size": 1237, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4155, + "zero_ratio": 0.3185, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_386_table_5110_off_03EA99_len_0004D5.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_386_table_5110_off_03EA99_len_0004D5.strings.txt", + "text_path": null, + "primary_label": "LITEWALL", + "field_names": [ + "referent", + "wall", + "tempType", + "realType", + "counter", + "stepper", + "item", + "wallList", + "dist", + "aSet", + "aSet1", + "aSet2", + "aSet3" + ], + "field_tags": [ + "24:FA02->wall", + "24:FC02->item", + "24:FE02->stepper", + "24:FE02->wall", + "69:0000->referent", + "69:E900->aSet", + "69:E900->aSet3", + "69:EB00->aSet", + "69:EB00->aSet2", + "69:ED00->aSet", + "69:ED00->aSet1", + "69:EF00->aSet", + "69:F100->dist", + "69:F800->counter", + "69:FA00->realType", + "69:FC00->tempType", + "6C:F802->wall", + "6C:F802->wallList" + ] + }, + { + "index": 387, + "table_offset": 20760, + "data_offset": 306830, + "declared_size": 5093, + "next_offset": 311923, + "extracted_size": 5093, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4212, + "zero_ratio": 0.249, + "preview": "................g...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_387_table_5118_off_04AE8E_len_0013E5.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_387_table_5118_off_04AE8E_len_0013E5.strings.txt", + "text_path": null, + "primary_label": "$2Q%", + "field_names": [ + "referent", + "item", + "counter", + "padDir", + "toDir", + "stepNum", + "phrase", + "damageSource", + "aSet" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent", + "69:0A00->damageSource", + "69:0A00->phrase", + "69:0C00->toDir", + "69:0E00->stepNum", + "69:F200->counter", + "69:FA00->padDir", + "69:FE00->aSet", + "69:FE00->counter" + ] + }, + { + "index": 388, + "table_offset": 20768, + "data_offset": 311923, + "declared_size": 212, + "next_offset": 312135, + "extracted_size": 212, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.0, + "zero_ratio": 0.9811, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_388_table_5120_off_04C273_len_0000D4.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_388_table_5120_off_04C273_len_0000D4.strings.txt", + "text_path": null, + "primary_label": null, + "field_names": [], + "field_tags": [] + }, + { + "index": 389, + "table_offset": 20776, + "data_offset": 365560, + "declared_size": 1157, + "next_offset": 366717, + "extracted_size": 1157, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4201, + "zero_ratio": 0.3302, + "preview": "................7...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_389_table_5128_off_0593F8_len_000485.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_389_table_5128_off_0593F8_len_000485.strings.txt", + "text_path": null, + "primary_label": "SHOCKER", + "field_names": [ + "referent", + "randNum", + "duration", + "skill", + "kernelCheck", + "counter", + "monster" + ], + "field_tags": [ + "24:FE02->monster", + "69:0000->referent", + "69:F400->counter", + "69:F600->kernelCheck", + "69:F800->skill", + "69:FA00->duration", + "69:FE00->randNum" + ] + }, + { + "index": 390, + "table_offset": 20784, + "data_offset": 376371, + "declared_size": 2615, + "next_offset": 378986, + "extracted_size": 2615, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4207, + "zero_ratio": 0.2474, + "preview": "....Q.......7...A...............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_390_table_5130_off_05BE33_len_000A37.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_390_table_5130_off_05BE33_len_000A37.strings.txt", + "text_path": null, + "primary_label": "SPIDER", + "field_names": [ + "referent", + "spiderType", + "spider", + "target", + "dest", + "count", + "targetLoop", + "destX", + "destY", + "destZ", + "currentP", + "counter", + "minor", + "oabs", + "ovel", + "axis", + "ztarg", + "zcur" + ], + "field_tags": [ + "24:F705->dest", + "24:FB05->currentP", + "24:FC02->target", + "24:FE02->spider", + "24:FE02->target", + "62:0E00->dest", + "62:0E00->destZ", + "69:0000->referent", + "69:0A00->dest", + "69:0A00->destX", + "69:0A00->spider", + "69:0A00->spiderType", + "69:0C00->dest", + "69:0C00->destY", + "69:0E00->target", + "69:0E00->targetLoop", + "69:DC00->zcur", + "69:DE00->ztarg", + "69:E000->axis", + "69:E400->ovel", + "69:E800->oabs", + "69:EE00->minor", + "69:F000->count", + "69:F000->counter", + "69:F300->target", + "69:F300->targetLoop", + "69:F500->count" + ] + }, + { + "index": 391, + "table_offset": 20792, + "data_offset": 386684, + "declared_size": 852, + "next_offset": 387536, + "extracted_size": 852, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3697, + "zero_ratio": 0.4038, + "preview": "....t.......T...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_391_table_5138_off_05E67C_len_000354.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_391_table_5138_off_05E67C_len_000354.strings.txt", + "text_path": null, + "primary_label": "STEAM", + "field_names": [ + "referent", + "item", + "detect" + ], + "field_tags": [ + "24:FE02->item", + "62:FD00->detect", + "69:0000->referent" + ] + }, + { + "index": 392, + "table_offset": 20800, + "data_offset": 394720, + "declared_size": 1111, + "next_offset": 395831, + "extracted_size": 1111, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.3798, + "zero_ratio": 0.3645, + "preview": "....w.......W...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_392_table_5140_off_0605E0_len_000457.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_392_table_5140_off_0605E0_len_000457.strings.txt", + "text_path": null, + "primary_label": "SWITCH", + "field_names": [ + "referent", + "counter", + "okay" + ], + "field_tags": [ + "62:FF00->okay", + "69:0000->referent", + "69:FE00->counter" + ] + }, + { + "index": 393, + "table_offset": 20808, + "data_offset": 398671, + "declared_size": 9516, + "next_offset": 408187, + "extracted_size": 9516, + "overlap_with_next": false, + "text_like": true, + "printable_ratio": 0.8459, + "zero_ratio": 0.0612, + "preview": "....@$......,%...&..............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_393_table_5148_off_06154F_len_00252C.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_393_table_5148_off_06154F_len_00252C.strings.txt", + "text_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_393_table_5148_off_06154F_len_00252C.txt", + "primary_label": "TEXTFILE", + "field_names": [ + "referent", + "linkNum", + "msgNum", + "passcode", + "textFile", + "rnge" + ], + "field_tags": [ + "0A:005F->textFile", + "27:7320->passcode", + "65:7720->passcode", + "68:6520->passcode", + "69:0000->referent", + "69:0A00->linkNum", + "69:0C00->msgNum", + "69:0E00->passcode", + "69:FC00->rnge", + "73:FE00->textFile", + "74:7920->passcode" + ] + }, + { + "index": 394, + "table_offset": 20816, + "data_offset": 413267, + "declared_size": 16800, + "next_offset": 430067, + "extracted_size": 16800, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4873, + "zero_ratio": 0.123, + "preview": ".....@.......A...F..............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_394_table_5150_off_064E53_len_0041A0.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_394_table_5150_off_064E53_len_0041A0.strings.txt", + "text_path": null, + "primary_label": "TRIGGER", + "field_names": [ + "referent", + "phase", + "lowPriorityTriggers", + "cmdphase", + "npcNum", + "mapNum", + "item", + "aitem", + "baseLink", + "newLink", + "searchtype", + "newphase", + "door", + "scmd", + "item2", + "distance", + "counter" + ], + "field_tags": [ + "24:EA02->item", + "24:EA02->item2", + "24:EC02->item", + "24:EC02->item2", + "24:F002->aitem", + "24:F202->aitem", + "24:F202->item", + "24:F402->aitem", + "24:F402->item", + "24:FE02->door", + "63:6D64->phase", + "69:0000->referent", + "69:0C00->phase", + "69:0E00->npcNum", + "69:1000->mapNum", + "69:1200->baseLink", + "69:1400->searchtype", + "69:E800->counter", + "69:EA00->newphase", + "69:EC00->distance", + "69:EC00->searchtype", + "69:EE00->counter", + "69:EE00->newLink", + "69:F000->baseLink", + "69:F000->newLink", + "69:F200->baseLink", + "69:F600->mapNum", + "69:F600->searchtype", + "69:F800->mapNum", + "69:F800->npcNum", + "69:FA00->npcNum", + "69:FC00->cmdphase", + "69:FE00->scmd", + "6C:FE02->lowPriorityTriggers", + "6E:6577->phase", + "F0:0261->item", + "F2:0261->item", + "F4:0261->item" + ] + }, + { + "index": 395, + "table_offset": 20824, + "data_offset": 431608, + "declared_size": 376, + "next_offset": 431984, + "extracted_size": 376, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.2261, + "zero_ratio": 0.6383, + "preview": "............x...................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_395_table_5158_off_0695F8_len_000178.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_395_table_5158_off_0695F8_len_000178.strings.txt", + "text_path": null, + "primary_label": "VALBOX", + "field_names": [ + "referent", + "lowByte", + "highByte", + "keypadCode" + ], + "field_tags": [ + "69:0000->referent", + "69:FA00->keypadCode", + "69:FC00->highByte", + "69:FE00->lowByte" + ] + }, + { + "index": 396, + "table_offset": 20832, + "data_offset": 439425, + "declared_size": 27907, + "next_offset": 467332, + "extracted_size": 27907, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.5022, + "zero_ratio": 0.1464, + "preview": ",...'k.......m..%|..............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_396_table_5160_off_06B481_len_006D03.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_396_table_5160_off_06B481_len_006D03.strings.txt", + "text_path": null, + "primary_label": "WALLGUN", + "field_names": [ + "referent", + "target", + "brain", + "delay", + "targItem", + "coordToCoordDir", + "left", + "right", + "targetNpc", + "dist", + "panRight", + "panLeft", + "isTurret", + "ammo", + "ma0Q", + "maxHit", + "turn", + "fire", + "gun2", + "broken" + ], + "field_tags": [ + "24:F302->target", + "24:F302->targetNpc", + "24:FC02->gun2", + "24:FE02->targItem", + "4E:0000->ma0Q", + "62:F500->isTurret", + "62:F600->isTurret", + "62:F600->panLeft", + "62:F700->panLeft", + "62:F700->panRight", + "69:0000->referent", + "69:0A00->target", + "69:0C00->brain", + "69:F300->delay", + "69:F400->ammo", + "69:F400->delay", + "69:F400->isTurret", + "69:F800->right", + "69:FA00->broken", + "69:FA00->dist", + "69:FA00->fire", + "69:FA00->left", + "69:FA00->right", + "69:FC00->coordToCoordDir", + "69:FC00->delay", + "69:FC00->dist", + "69:FC00->left", + "69:FC00->right", + "69:FC00->turn", + "69:FD00->dist", + "69:FE00->delay", + "69:FE00->left", + "69:FE00->maxHit" + ] + }, + { + "index": 397, + "table_offset": 20840, + "data_offset": 472171, + "declared_size": 1164, + "next_offset": 473335, + "extracted_size": 1164, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.36, + "zero_ratio": 0.3247, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_397_table_5168_off_07346B_len_00048C.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_397_table_5168_off_07346B_len_00048C.strings.txt", + "text_path": null, + "primary_label": "$4Q2", + "field_names": [ + "referent", + "shotRef", + "item", + "damage" + ], + "field_tags": [ + "24:FE02->item", + "69:0000->referent", + "69:0C00->shotRef", + "69:FC00->damage" + ] + }, + { + "index": 398, + "table_offset": 20848, + "data_offset": 477988, + "declared_size": 7901, + "next_offset": 485889, + "extracted_size": 7901, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4287, + "zero_ratio": 0.1429, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_398_table_5170_off_074B24_len_001EDD.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_398_table_5170_off_074B24_len_001EDD.strings.txt", + "text_path": null, + "primary_label": "NPCDEATH", + "field_names": [ + "referent", + "link", + "deathBox", + "param", + "hits", + "keyCard", + "item", + "deadGuy", + "goods", + "counter", + "spillBlood", + "spillOil", + "spillCoolant", + "newDir", + "flipIt", + "newType", + "skill", + "sLevel", + "wimp", + "fullOfShit" + ], + "field_tags": [ + "24:0A02->item", + "24:ED02->goods", + "24:EF02->deadGuy", + "24:F102->item", + "24:F502->keyCard", + "24:FB02->deathBox", + "24:FE02->goods", + "24:FE02->item", + "62:DE00->flipIt", + "62:E800->spillCoolant", + "62:E900->spillOil", + "62:EA00->spillBlood", + "62:F600->fullOfShit", + "62:F700->wimp", + "69:0000->referent", + "69:0C00->link", + "69:DC00->newType", + "69:DF00->newDir", + "69:EB00->counter", + "69:F700->hits", + "69:F800->sLevel", + "69:F900->param", + "69:FA00->skill", + "69:FC00->counter" + ] + }, + { + "index": 399, + "table_offset": 20856, + "data_offset": 489624, + "declared_size": 9575, + "next_offset": 499199, + "extracted_size": 9575, + "overlap_with_next": false, + "text_like": true, + "printable_ratio": 0.8651, + "zero_ratio": 0.0489, + "preview": ".....$......g%...%..............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_399_table_5178_off_077898_len_002567.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_399_table_5178_off_077898_len_002567.strings.txt", + "text_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_399_table_5178_off_077898_len_002567.txt", + "primary_label": "\n<$Q7", + "field_names": [ + "referent", + "linkNum", + "msgNum", + "passcode", + "textFile" + ], + "field_tags": [ + "27:7320->passcode", + "68:6520->passcode", + "69:0000->referent", + "69:0A00->linkNum", + "69:0C00->msgNum", + "69:0E00->passcode", + "6C:6C20->passcode", + "73:FE00->textFile" + ] + }, + { + "index": 400, + "table_offset": 20864, + "data_offset": 499787, + "declared_size": 6843, + "next_offset": 506630, + "extracted_size": 6843, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.4421, + "zero_ratio": 0.1873, + "preview": "................................................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_400_table_5180_off_07A04B_len_001ABB.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_400_table_5180_off_07A04B_len_001ABB.strings.txt", + "text_path": null, + "primary_label": "ITEM", + "field_names": [ + "referent", + "destx", + "desty", + "truncate", + "targetRef", + "targetItem", + "item", + "newStatus", + "destX", + "destY", + "destZ", + "currentP", + "counter", + "minor", + "oabs", + "ovel", + "axis", + "ztarg", + "zcur", + "damageRef", + "maxHits", + "damagePoints", + "currentHits", + "newHits", + "boomType", + "selfDestruct", + "origin", + "bigBomb", + "onSomething", + "failTest", + "theType", + "ma0Q", + "onFloor", + "burn", + "burn2", + "egg1", + "monster1", + "monster2", + "link", + "newNpc", + "ref1", + "ref2", + "item1", + "item2" + ], + "field_tags": [ + "00:0000->ma0Q", + "24:F502->burn", + "24:F602->newNpc", + "24:FB05->currentP", + "24:FC02->burn", + "24:FC02->burn2", + "24:FC02->item", + "24:FC02->item2", + "24:FC02->monster2", + "24:FC02->origin", + "24:FE02->burn", + "24:FE02->item", + "24:FE02->item1", + "24:FE02->monster1", + "24:FE02->targetItem", + "62:0C00->selfDestruct", + "62:0E00->destZ", + "62:0E00->truncate", + "62:F600->failTest", + "62:F700->onSomething", + "62:FB00->bigBomb", + "62:FD00->onFloor", + "69:0000->referent", + "69:0A00->boomType", + "69:0A00->damageRef", + "69:0A00->destX", + "69:0A00->destx", + "69:0A00->egg1", + "69:0A00->newStatus", + "69:0A00->ref1", + "69:0A00->targetRef", + "69:0C00->destY", + "69:0C00->desty", + "69:0C00->ref2", + "69:0E00->maxHits", + "69:DC00->zcur", + "69:DE00->ztarg", + "69:E000->axis", + "69:E100->zcur", + "69:E300->ztarg", + "69:E400->ovel", + "69:E500->axis", + "69:E800->oabs", + "69:E900->ovel", + "69:ED00->oabs", + "69:EE00->minor", + "69:F000->counter", + "69:F300->minor", + "69:F400->theType", + "69:F500->counter", + "69:FA00->link", + "69:FA00->newHits", + "69:FC00->currentHits", + "69:FE00->damagePoints" + ] + }, + { + "index": 401, + "table_offset": 20872, + "data_offset": 511820, + "declared_size": 9896, + "next_offset": 521716, + "extracted_size": 9896, + "overlap_with_next": false, + "text_like": true, + "printable_ratio": 0.8269, + "zero_ratio": 0.0614, + "preview": ".....%.......&...'..............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_401_table_5188_off_07CF4C_len_0026A8.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_401_table_5188_off_07CF4C_len_0026A8.strings.txt", + "text_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_401_table_5188_off_07CF4C_len_0026A8.txt", + "primary_label": "\n|$4Q(", + "field_names": [ + "referent", + "linkNum", + "msgNum", + "passcode", + "textFile" + ], + "field_tags": [ + "27:7320->passcode", + "65:7420->passcode", + "65:7720->passcode", + "68:6520->passcode", + "69:0000->referent", + "69:0A00->linkNum", + "69:0C00->msgNum", + "69:0E00->passcode", + "6E:6720->passcode", + "73:6520->passcode", + "73:FE00->textFile" + ] + }, + { + "index": 402, + "table_offset": 20880, + "data_offset": 526611, + "declared_size": 20044, + "next_offset": 546655, + "extracted_size": 20044, + "overlap_with_next": false, + "text_like": false, + "printable_ratio": 0.5313, + "zero_ratio": 0.1394, + "preview": "....lM......LN...N..............................................", + "raw_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_402_table_5190_off_080913_len_004E4C.bin", + "strings_path": "k:\\ghidra\\Crusader_Decomp\\USECODE\\EUSECODE_extracted\\chunks\\chunk_402_table_5190_off_080913_len_004E4C.strings.txt", + "text_path": null, + "primary_label": "FLICTEST", + "field_names": [ + "hideoutx", + "mva01", + "mva03a", + "mva03b", + "mva04", + "mva05a", + "mva05b", + "mva06", + "mva07", + "mva08", + "mva09", + "mva10", + "mva11a", + "mva11b", + "mva12a", + "mva12b", + "mva13", + "mva14", + "mva15a", + "mva15b", + "mva15c", + "test", + "referent", + "keycode" + ], + "field_tags": [ + "0D:0400->test", + "0D:0500->mva01", + "0D:0500->mva04", + "0D:0500->mva06", + "0D:0500->mva07", + "0D:0500->mva08", + "0D:0500->mva09", + "0D:0500->mva10", + "0D:0500->mva13", + "0D:0500->mva14", + "0D:0600->mva03a", + "0D:0600->mva03b", + "0D:0600->mva05a", + "0D:0600->mva05b", + "0D:0600->mva11a", + "0D:0600->mva11b", + "0D:0600->mva12a", + "0D:0600->mva12b", + "0D:0600->mva15a", + "0D:0600->mva15b", + "0D:0600->mva15c", + "0D:0800->hideoutx", + "69:0000->referent", + "69:FE00->keycode" + ] + } + ] +} \ No newline at end of file diff --git a/crusader_decompilation_notes.md b/crusader_decompilation_notes.md index 4c617b8..c3ee128 100644 --- a/crusader_decompilation_notes.md +++ b/crusader_decompilation_notes.md @@ -1,2478 +1,17 @@ -# Crusader: No Remorse - Decompilation Notes - -## Binary Overview - -- **Game**: Crusader: No Remorse (Origin Systems, 1995) -- **Platform**: DOS (16-bit protected mode) -- **DOS Extender**: Phar Lap 286 DOS-Extender (RUN286) -- **Executable Format**: Bound `MZ -> NE` executable with Phar Lap DOS-extender code -- **Entry Point**: `10da:7c40` - -## Installed Copy Findings - -- No standalone `.EXP` file exists in `F:\Apps\Crusader No Remorse`. -- `CRUSADER.EXE` is the original game binary and contains a valid internal `NE` header. -- Outer DOS `MZ` header points to `e_lfanew = 0x36F70`. -- Internal header at `0x36F70` starts with `NE` and describes **145 segments**. -- The NE segment table references data from the original file directly, so there is no separate embedded payload that needs to be carved out first. -- `CNRCEXP.EXE` is a modern Win32 helper tool, not part of the original DOS execution path. - -## Raw Full-EXE Import Mapping - -- A separate raw-binary import of the full executable (`crusader-raw.exe`) is usable: Ghidra discovers thousands of functions across a single flat `ram` block. -- Direct `file_offset -> flat_address` mapping from the standalone segment extracts is not reliable for porting names into that raw import. -- The extracted `segNNN_*.bin` files match `CRUSADER_NE.EXE`, but the raw full-EXE import must be mapped by verified byte signatures / known function bodies. -- Verified segment bases in the raw full-EXE import: - - `seg001` base = `0x6E570` (`cursor_update_hover` at `0006:e5d0`, rel `0x0060`) - - `seg021` base = `0x87170` (`entity_count_by_type_a` at `0008:7377`, rel `0x0207`) -- Porting rule for these verified segments: - - `raw_full_exe_flat = verified_segment_base + standalone_segment_relative_offset` -- Naming note: - - `seg001` and `seg021` both contain a keyboard handler; in the full program database, the seg001 copy is named `seg001_input_keyboard_handler` to avoid a symbol collision with seg021 `input_keyboard_handler`. - -### Address Space Layout in the Raw Import - -Ghidra segment:offset `SSSS:OOOO` = flat address `SSSS * 0x10000 + OOOO`. - -| Flat range | Content | -|---|---| -| `0x00000`–`0x36F6F` | Phar Lap 286 DOS extender (outer MZ stub code) | -| `0x36F70` | NE header (145-segment game image begins here in file) | -| `0x6E570`+ | NE game segments at their Phar Lap linear load addresses | - -Mapping rule (verified for seg001 and seg021): -``` -runtime_flat_base = NE_segment_file_offset + 0x36F70 -``` -Example: seg004 at file `0x40A00` → runtime `0x77970` → Ghidra `0007:7970`. - -Functions at Ghidra `0003:XXXX` / `0004:XXXX` are **Phar Lap extender code** (flat < `0x40000` is below any game segment). Functions at `0006:E570`+ are game NE segments. - -### `0000:ffff` — NE Fixup Placeholder (not a dispatcher) - -`unresolved_far_thunk_dispatch` at `0000:ffff` is NOT a runtime function. Every `CALLF 0x0000:ffff` in the original NE image is a **different** external or inter-segment call patched by the NE loader at runtime. The body at `0000:ffff` is just fixup placeholder data, so decompiling it as a function is meaningless. - -Repair status in `CRUSADER-RAW.EXE`: -- A PyGhidra repair pass now applies the verified NE relocation table directly to the raw-program bytes for literal internal `CALLF 9A ptr16:16` sites, then re-disassembles each patched instruction. -- Current verified batch results: - - `8851` internal literal `CALLF` sites patched to their real segment:offset targets. - - `2841` far-pointer relocation entries skipped because they were not literal `CALLF` instructions (data or other non-call uses). - - `119` import callsites annotated as `NE IMPORT -> module.symbol`. -- Remaining xrefs to `0000:ffff` should now mostly be import callsites or non-literal far-pointer cases rather than unresolved intra-game far calls. - -Known call-site classifications (by argument pattern): -- `PUSH DS; PUSH imm_ordinal; CALLF` — Phar Lap extender calling a runtime-imported procedure by ordinal -- `PUSH ptr_seg; PUSH ptr_off; CALLF` — inter-NE-segment function call (intra-game far call) -- Multiple typed pushes then CALLF — external C runtime / game subsystem call with normal args - -### Latest Raw Full-EXE Porting Progress - -- Newly ported and renamed into `CRUSADER-RAW.EXE` from verified `seg001` mapping (`base 0x6E570`): - - `0007:28ce` = `shot_entity_alloc` (`seg001 + 0x435e`) - - `0007:2a19` = `shot_entity_free` (`seg001 + 0x44a9`) - - `0007:2bc9` = `projectile_init_vector` (`seg001 + 0x4659`) - - `0007:3001` = `entity_fire_weapon` (`seg001 + 0x4a91`) - - `0007:3088` = `fire_weapon_from_cursor` (`seg001 + 0x4b18`) - - `0007:30e8` = `projectile_check_hit` (`seg001 + 0x4b78`) - - `0007:319e` = `projectile_step_update` (`seg001 + 0x4c2e`) - - `0007:3298` = `projectile_trace_ray` (`seg001 + 0x4d28`) - - `0007:371d` = `projectile_update_tick` (`seg001 + 0x51ad`) - - `0007:4009` = `projectile_apply_hit` (`seg001 + 0x5a99`) -- Decompiler comments were added on key raw-import projectile functions to preserve provenance for later passes. -- Quick verification from current raw import: - - `entity_fire_weapon` currently decompiles as a thin wrapper that calls `projectile_init_vector`. - - `fire_weapon_from_cursor` still decompiles poorly in the raw import, but disassembly shows it begins by pushing cursor sprite/state data from the `0x27d6` area, consistent with the existing seg001 notes. - -### Raw seg091 Boundary Recovery (init/context + RNG helpers) - -- Conservative PyGhidra boundary repair created the missing seg091 functions in `CRUSADER-RAW.EXE`: - - `000a:44fd` = `seg091_func_00fd`, body `000a:44fd-000a:454c` - - `000a:454d` = `seg091_func_014d`, body `000a:454d-000a:45fd` - - `000a:48a0` = `rng_advance_state`, body `000a:48a0-000a:48e2` - - `000a:48ff` = `rng_next_modulo`, body `000a:48ff-000a:4912` -- Additional adjacent helper identified directly in the raw import: - - `000a:48e3` = `rng_set_seed` -- Verified current behavior from the raw import: - - `seg091_func_00fd` shares runtime flag `0x44a4` with `runtime_init_or_abort`; if the flag is clear it sets it and dispatches through an unresolved far thunk, then falls into a second unresolved thunk path that Ghidra currently marks as non-returning. - - `seg091_func_014d` also shares flag `0x44a4`; it checks an optional long argument against the global context/cookie at `0x45a6`, zeroes the pointed byte when the argument is null, then dispatches through an unresolved far thunk. Keep the positional name until caller-side analysis resolves the thunk target and full signature. - - `rng_set_seed` writes the 32-bit RNG seed/state pair at `0x4584:0x4586` and forces the low word odd. - - `rng_advance_state` updates the same 32-bit state with a simple multiply/add step. - - `rng_next_modulo` advances the RNG state and returns the result modulo the requested bound, or `0` when the bound is zero. -- Short decompiler comments were added in Ghidra at all five seg091 entries so the current evidence stays attached to the raw database. - -### Raw 0x4588 Runtime Callback Lifecycle Batch (direct MCP analysis) - -- New conservative runtime-callback lifecycle renames (direct analysis): - - `000a:4913` = `runtime_callback_object_init_once` - - `000a:4a56` = `runtime_callback_object_teardown_once` - - `0009:b1c3` = `runtime_callback_object_phase_finalize` -- Boundary repair applied with MCP edit-plan API: - - Rebuilt `000a:b988` as `sprite_node_get_or_traverse` with full body `000a:b988-000a:bab5`. - - This repair absorbs both callback-state sync callsites at `000a:b9e5` and `000a:ba66` that were previously in a no-function gap. -- Verified callback-object behavior from this pass: - - `runtime_callback_object_init_once` sets one-time guard `0x4594`, snapshots state words (`0x458c`/`0x4590`) via `video_bios_state_snapshot`, installs the object FAR pointer at `0x4588`, and ensures fallback buffer allocation at `0x45a6`. - - `runtime_callback_object_teardown_once` sets one-time guard `0x4595`, clears `0x4588`, conditionally emits vtable `+0x0c` callback when current/previous state differ, then calls vtable `+0x04` release path. - - `runtime_callback_object_phase_finalize` invokes vtable `+0x08` twice and sweeps table entries via `allocator_head_finalize_sweep`. - - Large caller `FUN_000d_9afd` contains both additional vtable `+0x0c` callsites (`000d:9d5e` and `000d:a3b7`) and remains the best next target for concrete subsystem naming. -- Short decompiler comments were added at the three renamed lifecycle functions to preserve current evidence. - -### Raw 0x4588 Follow-up Batch (allocator/video helper clarification) - -- New conservative helper renames from direct disassembly/decompile evidence: - - `0009:a961` = `allocator_head_finalize_sweep` - - `000a:4a1f` = `video_bios_state_snapshot` -- Verified behavior anchors: - - `allocator_head_finalize_sweep` performs per-head chain compaction/finalize work over allocator table entries used by `runtime_callback_object_phase_finalize`. - - `video_bios_state_snapshot` executes BIOS video interrupts (`INT 10h` with `AX=4F03` and `AX=1130,BH=3`) and returns packed state in `DX:AX`; callers store/compare this pair around callback emissions. -- Decompiler comments were updated so downstream analysis sees the new helper names directly. - -### Raw 0x4588 Follow-up Batch 2 (cleanup + mode-state wrapper) - -- New conservative structural renames (direct decompile/disassembly evidence): - - `000a:4972` = `video_mode_set_and_record_state` - - `000d:9afd` = `entity_cleanup_resources_and_dispatch` -- Verified behavior anchors: - - `video_mode_set_and_record_state` stores requested mode/state to `0x4590`, handles VBE-style mode values (`0x101`/`0x103`/`0x105`) via helper checks, and falls back to `INT 10h` mode path for other values. - - `entity_cleanup_resources_and_dispatch` is a large teardown/finalize path for an entity-like object: it clears flags, frees multiple owned buffers/palette handles, performs conditional callback dispatch through `0x4588` vtable `+0x0c`, then destroys object word-list structures. -- Decompiler comments were added at both renamed addresses to preserve this provenance. - -### Raw 0x4588 Follow-up Batch 3 (cleanup-callee helper classification) - -- New conservative helper renames from direct MCP decompile evidence: - - `0009:7853` = `palette_buffer_alloc_and_init_256` - - `0009:1c3a` = `file_handle_alloc_init_and_open` - - `0009:1d6a` = `file_handle_open_with_mode` - - `0009:8d7b` = `surface_release_internal` - - `0009:8e0a` = `surface_release_and_maybe_free` - - `000d:9231` = `sprite_redraw_global_if_active` -- Verified behavior anchors: - - `palette_buffer_alloc_and_init_256` ensures a caller-provided far buffer exists, allocates/initializes a `0x100`-entry palette/work block, and fills it from static table data. - - `file_handle_alloc_init_and_open` allocates a handle structure on demand, seeds sentinels, then delegates to `file_handle_open_with_mode`. - - `file_handle_open_with_mode` performs path/open initialization with optional pre-delete behavior and stores DOS open result metadata into the handle structure. - - `surface_release_and_maybe_free` wraps `surface_release_internal` and conditionally frees memory when `(flags & 1) != 0`. - - `sprite_redraw_global_if_active` redraws the global sprite/object pointer at `0x4f38` only when the global gate byte `0x68e5` is enabled. -- `entity_cleanup_resources_and_dispatch` now has direct named callees for file/surface/palette cleanup paths, reducing the remaining ambiguity to callback-object role naming and the `000d:7e00` event-dispatch constructor path. -- Short decompiler comments were added at all six renamed helpers to preserve evidence provenance in-database. - -### Raw 0x4588 Follow-up Batch 4 (function-object recovery around `000d:7e00`) - -- Missing function objects recovered from direct disassembly boundaries: - - `000d:7e00-000d:8077` created and renamed to `entity_dispatch_entry_init_runtime_state` - - `000d:8078-000d:819f` renamed to `entity_dispatch_entry_release_runtime_state` - - `0003:a880-0003:a896` created as `FUN_0003_a880` (arithmetic helper; decompiler currently simplifies it) - - `0003:b8e2-0003:bb39` created and renamed to `far_buffer_alloc_with_mode_flags` -- Verified behavior anchors: - - `entity_dispatch_entry_init_runtime_state` is a constructor-side helper that initializes runtime fields (`+0x41/+0x42/+0x44`), clears and allocates paired work/palette buffers (`+0x46/+0x48` and `+0x4a/+0x4c`), applies event/setup calls through seg061 helpers, then finalizes activation. - - `entity_dispatch_entry_release_runtime_state` is the destructor-side pair: it frees the same paired buffers, propagates active-state changes via global `0x6828`, and destroys embedded word-list members. - - `far_buffer_alloc_with_mode_flags` is a low-level far-buffer utility that allocates/reuses a destination pointer and dispatches mode-dependent copy/fill behavior via an internal flag table. -- This resolves the previous `000d:7e00` "missing function object" blocker and improves readability for `entity_cleanup_resources_and_dispatch` callback/setup paths. - -### Raw 0x4588 Follow-up Batch 5 (seg061/064/076 helper stabilization) - -- New conservative helper renames: - - `0009:6ec7` = `vga_palette_read` - - `0008:d3ba` = `timer_entity_enable_wrapper` -- Additional evidence-preserving decompiler comments were added (without speculative renames) on: - - `0008:eb43` - - `0008:ebe7` - - `0008:eac8` - - `0008:ec23` -- Verified behavior anchors: - - `vga_palette_read` mirrors `vga_palette_write` and reads DAC entries through ports `0x3c7/0x3c9` into a far palette buffer. - - `timer_entity_enable_wrapper` is a thin forwarder to `timer_entity_enable` and is widely used in lifecycle/setup paths. - - The seg064 gate helpers (`0008:eb43`/`0008:ebe7`/`0008:ec23`) control one-shot global flag transitions at `0x3b72/0x3b73`, then dispatch via unresolved thunk paths; names remain intentionally conservative pending stronger subsystem identity. -- Callback callsite clarification retained: - - `entity_cleanup_resources_and_dispatch` vtable `+0x0c` call at `000d:9d5e` passes object fields `+0x12d/+0x12f`. - - Matching vtable `+0x0c` call at `000d:a3b7` passes object fields `+0x74f/+0x751`. - - These pairs appear to be state/coordinate-like payloads for the runtime callback object at `0x4588`. - -### Raw 0x4588 Follow-up Batch 6 (constructor lane naming + callback globals) - -- New conservative helper renames: - - `0008:d27e` = `entity_set_update_period_and_reschedule` - - `0009:7905` = `palette_buffer_alloc_copy_from_source` -- Verified behavior anchors: - - `entity_set_update_period_and_reschedule` stores timing/update-period fields (`+0x36/+0x38/+0x3a`), clears deferred fields (`+0x3c/+0x3e`), then triggers timer recompute/reschedule helpers. - - `palette_buffer_alloc_copy_from_source` allocates/replaces destination palette buffer metadata and copies RGB triplets from a source far pointer (`entry_count * 3` bytes). -- Disassembly annotations added on both callback emit callsites so payload provenance remains attached in-database: - - `000d:9d5e` -> vtable `+0x0c` payload from `+0x12d/+0x12f` - - `000d:a3b7` -> vtable `+0x0c` payload from `+0x74f/+0x751` -- Global data labels were promoted for the callback lane (where symbolization applies in decompiler views): - - `g_active_dispatch_entry_farptr` at `0x6828` - - callback-state/object globals at `0x4588/0x458c/0x4590/0x4594/0x4595/0x45a6` - - dispatch callback-table pointer at `0x39ca` - -### Raw 0007 Gameplay Helper Batch (entity/tile aux state) - -- New conservative gameplay-side helper renames (direct analysis from field writes and call structure): - - `0007:85f6` = `entity_sync_tile_aux_state` - - `0007:8865` = `entity_sync_tile_aux_if_linked` - - `0007:8709` = `entity_mark_dirty_and_sync_tile_aux` -- Current verified behavior: - - `entity_sync_tile_aux_state` reads entity tile index at `+0x4`, toggles bit `0x04` in tile record `+0x59` based on entity byte `+0x54`, and copies entity word `+0x55` into tile record `+0x0d`. - - `entity_sync_tile_aux_if_linked` only performs the sync when entity link/pointer `+0x50/+0x52` is non-null. - - `entity_mark_dirty_and_sync_tile_aux` calls the linked-sync helper, sets entity flag bit `0x04` at `+0x42`, then calls through `0000:ffff` with args `(SS:&tile_index, entity[+0x57])` — annotated at `0007:8666` as `entity_tile_type_notify(tile_index_ptr, type_byte)`. -- New entity field found this pass: - - `entity[+0x57]` (byte) = entity type/class byte (passed to tile-type notification; meaning not yet fully established — adjacent to named fields `+0x54`/`+0x55`) - -### Raw 0007 Gameplay Helper Batch (facing/direction) - -- New gameplay helper rename (direct analysis): - - `0007:8bd9` = `entity_set_facing_direction` -- Current verified behavior: - - Updates entity facing byte `+0x38` using incoming direction/event code values (notably `0x10/0x11/0x12`) with parity-aware adjustment. - - Uses entity flags at `+0x4d` to select increment/decrement behavior for clockwise/counterclockwise facing updates. - - Called from the large gameplay update state machine at `0007:5b9a` inside `FUN_0007_5b6f`. - -### Raw 0007 Gameplay Helper Deep Dive: snap_entity_to_ground - -- Function: `0007:2207` = `snap_entity_to_ground` -- Caller in gameplay flow: `spawn_entity_checked` (`0007:22de`, call at `0007:2366`) -- Purpose (high confidence): pre-spawn position adjustment for a small allow-list of entity types so they land on valid ground/height context before normal spawn allocation. - -#### Variable replacement pass (applied in Ghidra) - -- `param_1` -> `entity_type` -- `local_48` -> `snap_entity_type_table` -- `local_34` -> `snap_dispatch_seg_table` -- `local_20` -> `snap_dispatch_off_table` -- `local_c` -> `entity_type_cursor` -- `local_4` -> `dispatch_index` - -#### What the function does structurally - -1. Copies three 10-entry static tables into stack-local scratch buffers: - - from `0x2910` into `snap_dispatch_off_table` - - from `0x2924` into `snap_dispatch_seg_table` - - from `0x2938` into `snap_entity_type_table` -2. Performs a linear scan across 10 entity IDs in `snap_entity_type_table`. -3. If `entity_type` matches an entry, it calls into the unresolved shared FAR thunk target (`0000:ffff`) with spawn coordinate-derived arguments. -4. If no table entry matches, it exits without modifying the request. - -#### Why this is "snap to ground" behavior - -- The only known caller (`spawn_entity_checked`) gates this function behind: - - global mode flag `*(char *)0x27fe != 0` - - a hardcoded list of exactly 10 entity IDs (`0x31c`, `0x31f`, `0x320`, `0x321`, `0x322`, `0x323`, `0x324`, `0x325`, `0x326`, `0x327`) -- That caller prepares local spawn position values, calls `snap_entity_to_ground`, then proceeds to spawn logic. This pattern strongly indicates pre-placement correction rather than generic AI or render logic. -- The segment/offset companion tables strongly suggest per-entity handler dispatch metadata (or per-entity parameter blocks) used by the thunked path. - -#### Current limitation in raw import - -- The placeholder at `0000:ffff` still exists as a symbol, but the relevant internal literal `CALLF` sites are no longer the best source of truth: they have been patched in-place to their real NE targets. -- For `snap_entity_to_ground`, the formerly unresolved call at `0007:2261` now disassembles to `CALLF 0004:e7bd`, i.e. `world_to_screen_coords`. -- Remaining `0000:ffff` sightings in the raw import are now primarily import calls or non-literal far-pointer cases, not evidence that this gameplay helper still dispatches through a single shared runtime function. - -#### Working pseudocode (behavioral) - -```c -void snap_entity_to_ground(entity_type, spawn_x, spawn_y, spawn_layer) { - copy_10_words(local_off_table, DATA_2910); - copy_10_words(local_seg_table, DATA_2924); - copy_10_words(local_type_table, DATA_2938); - - for (dispatch_index = 0; dispatch_index < 10; dispatch_index++) { - if (local_type_table[dispatch_index] == entity_type) { - // Through unresolved FAR thunk in raw import. - // Uses spawn position context to compute a ground-aligned placement. - call_thunk_with_spawn_context(spawn_x, spawn_y, ...); - } - } -} -``` - -#### Architectural Resolution: `unresolved_far_thunk_dispatch` / `0000:ffff` - -**`unresolved_far_thunk_dispatch` is NOT a real dispatcher.** It is the NE binary fixup placeholder. - -- In a Phar Lap 286 NE executable, inter-segment and external far calls are stored in the binary as `CALLF 0x0000:ffff` (or similar invalid sentinel values). -- The Phar Lap NE loader patches each of these call sites to the real segment:offset at load time using the per-segment relocation records in the NE file. -- In Ghidra's raw import, those fixups are never applied. Every unresolved far call collapses to the same `0000:ffff` stub, where the decompiler produces garbled output (it's reading fixup-chain data, not real instructions). -- **Each `CALLF 0x0000:ffff` in the binary is a DIFFERENT call with a DIFFERENT actual target.** Identifying the target requires either parsing the NE relocation table or cross-matching with the resolved standalone segment extracts. - -Address layout in the raw import (flat_address = `SSSS:OOOO` where flat = `SSSS * 0x10000 + OOOO`): -- `0000:` – `0003:` (flat < `0x40000`) = Phar Lap 286 DOS extender code (the outer MZ stub portion) -- `0006:E570` onwards = NE game segments (seg001+ at their Phar Lap-assigned linear addresses) -- Mapping rule verified: `runtime_flat = NE_segment_file_offset + 0x36F70` (the NE header offset in the EXE) - -Decompiler comment added to `0000:ffff` in Ghidra documenting this. - -#### Next RE targets for `snap_entity_to_ground` - -- The repaired call at `0007:2261` now lands at `world_to_screen_coords` (`0004:e7bd`), so the next step is to reinterpret the helper with the real callee in view rather than through the old `0000:ffff` placeholder model. - -### Raw 0007 Gameplay Helper Follow-up: AI sweep + checked spawn path - -- Additional gameplay-side annotation pass completed directly in `CRUSADER-RAW.EXE`. - -#### `spawn_entity_checked` (`0007:22de`) refinements - -- Function signature was expanded to 7 arguments in Ghidra so stack arguments remain visible in decompile: - - `entity_type`, `spawn_flags_a`, `spawn_flags_b`, `spawn_flags_c`, `spawn_x`, `spawn_y`, `spawn_layer_arg` -- Parameter/local naming pass applied for readability in decompiled output. -- New comments added at key control-flow points: - - `0007:22f8`: allow-list gate for ground-snap mode (`0x27fe != 0` + entity IDs `0x31c..0x327` subset) - - `0007:2366`: explicit `snap_entity_to_ground(entity_type, &spawn_x, &spawn_y, &spawn_layer)` handoff - - `0007:247e`: fallback path that calls core `entity_spawn` with original arguments -- Current caveat: - - Decompiler still aliases the temporary y/layer scratch region imperfectly around the thunked call site, but disassembly confirms the call setup uses local `x/y/layer` temporaries (`[bp-6]`, `[bp-8]`, `[bp-9]`) before spawn. - -#### `entity_ai_update_loop` (`0007:0fb6`) structural recovery - -- Added disassembly + decompiler comments capturing stable behavior: - - Reads player entity FAR pointer from global `0x2de4`. - - Copies player world position fields (`+0x40`, `+0x42`) into globals `0x27e7` / `0x27e9` (AI focus position cache used by downstream logic). - - Iterates entity IDs from `2` through `255` and dispatches per-entity processing through two sequential thunked calls per entity. -- After the NE far-call repair pass, the first call at `0007:101c` now disassembles and decompiles directly as `entity_resolve_slot_ptr` (`0005:0466`) instead of `CALLF 0000:ffff`. -- The repaired call chain now exposes several concrete helpers used by the sweep: - - `0005:42c8` = `entity_projected_bbox_overlaps_viewport` — projects the entity slot via `world_to_screen_coords`, subtracts entity height from `0x7df5[slot]`, derives sprite/flag context, and returns `bbox_overlap_test` against the active viewport rectangle referenced from global `0x4014`. - - `0005:3cf5` = `entity_class_has_flag2000` — class-word flag test over `entity_get_class_word(slot) & 0x2000`. - - `0005:ff2d` = `entity_class_get_flag8` — returns bit `0x08` from entity-class detail byte `0x7e1e[type*0x79 + 0x59]`. - - `0006:1305` = `entity_class_get_word_02` — raw accessor for word `+0x02` in the `0x7e1e` class-detail record. - - `0006:0ca4` = `entity_class_get_word_0a` — raw accessor for word `+0x0a` in the same class-detail record. - - `0006:11a1` = `entity_class_clear_flag8_and_dispatch` — clears bit `0x08` in class-detail byte `+0x59`, then performs follow-up entity/type checks and callback dispatch. Name intentionally stays flag-centric until the downstream side effects are fully mapped. -- New disassembly comments added at both dispatch call sites: - - `0007:101c`: `entity_slot_fetch(SS:&entity_id)` — first call; resolves entity slot/pointer from loop ID - - `0007:1093`: `entity_tick_dispatch(SS:&entity_id, g_0x27c8)` — second call; per-entity AI tick with global `0x27c8` mode/context word -- Global `0x27c8` is now confirmed as the current targeted/current entity handle: `entity_is_type_match` compares against it directly, and both spawn helpers `map_find_spawn_point` / `enemy_spawn_at_position` snapshot it before their thunked core paths. - -### Raw 0007 Gameplay Logic: animation / range / command globals - -#### `is_player_in_range` (`0007:0f79`) — fully recoverable - -- Prototype updated in Ghidra: `int is_player_in_range(int entity_x, int entity_y)` -- Reads player world position from `g_player_entity_farptr` (`0x2de4`, fields `+0x40` (x) and `+0x42` (y)`. -- Computes unsigned delta from AI focus globals `g_ai_focus_pos_x` (`0x27e7`) / `g_ai_focus_pos_y` (`0x27e9`). -- Returns 1 if player Y delta == 0 AND player X delta < 0xF0 (240 world units), else 0. -- Only confirmed caller so far: `0007:0bcb` (in unanalyzed function region). - -#### `entity_animation_frame_update` (`0007:26e2`) — fully decompiled - -- Prototype updated: `void entity_animation_frame_update(int *entity_ptr)` -- Key globals read: - - `g_anim_tick_counter` (`0x3a00`) — frame timing tick counter. - - `g_anim_tick_overdrive_flag` (`0x3a02`) — if set, forces max-advance (4 steps). - - `g_speed_double_flag` (`0x27fd`) — doubles speed_factor to 2 when set (fast game mode). -- Local variables renamed: `speed_factor` (1 or 2) and `advance_steps` (0–4, number of frame advances this tick). -- Entity struct fields confirmed (relative to `entity_ptr` as `int*`): - - `[0x1b]` (byte `+0x36`) = frame_min (backward direction counter) - - `[0x1c]` (byte `+0x38`) = frame_max - - `[0x1d]` (byte `+0x3a`) = current_frame - - `[0x1e]` (byte `+0x3c`) = loop_flag (0 = animation disabled) - - `[0x1f]` (byte `+0x3e`) = reverse_direction_flag / double-speed flag - - `+0x3f` (word, byte-offset) = completion handle/sentinel (`-1` = none, `0x2802` = player entity) - - `+0x00` (far ptr) = vtable pointer -- New disassembly comments added at all three `CALLF 0x0000:ffff` sites and the vtable indirect call: - - `0007:27dc`: `entity_completion_callback(handle)` — fires when loop wraps; skips player handle - - `0007:27fd`: vtable indirect `entity->vtable[+8](entity, 0, 0)` — `on_loop_complete` virtual method - - `0007:281e`: `notify_frame_progress(handle, current_frame)` — per-frame notification - - `0007:2851`: `entity_sprite_advance(entity_far_ptr, advance_amount, 0)` — core frame-advance call; advance_amount = `entity[+0x3c] * (steps+1) * speed_factor` - -#### `entity_command_dispatch` (`0007:0990`) — partially decompiled - -- Prototype: `void entity_command_dispatch(int entity_handle, int target_seg, int command_type, byte absolute_pos_flag)` -- When `absolute_pos_flag == 0`: computes player-relative delta using `g_player_entity_farptr` and stores result: - - delta_x → `g_player_delta_x` (`0x27f5`) - - delta_y → `g_player_delta_y` (`0x27f7`) - - Clears cached origin globals `g_cmd_effect_origin_x` (`0x27f1`) and `g_cmd_effect_origin_y` (`0x27f3`) after use. -- Dispatches entity command through shared thunk; actual command table data not yet resolved. -- No incoming XREFs found in the raw import (likely called via table or vtable dispatch). - -#### Enemy spawn helper cluster (`0007:505d`, `0007:5259`, `0007:5275`, `0007:5291`) - -- Existing raw names align with prior standalone seg001 notes: - - `0007:505d` = `map_find_spawn_point` (`seg001 + 0x6aed`) - - `0007:5259` = `enemy_spawn_with_target` (`seg001 + 0x6ce9`) - - `0007:5275` = `enemy_spawn_no_target` (`seg001 + 0x6d05`) - - `0007:5291` = `enemy_spawn_at_position` (`seg001 + 0x6d21`) -- Current verified raw-import behavior: - - `enemy_spawn_with_target` is a thin wrapper over `enemy_spawn_at_position(..., target_player_flag = 1)`. - - `enemy_spawn_no_target` is the same wrapper but passes `target_player_flag = 0`. - - `map_find_spawn_point` and `enemy_spawn_at_position` both copy DS:`0x27c8` into locals before entering their unresolved thunk body, matching the standalone notes that treat `0x27c8` as the current targeted/current entity handle. -- Short decompiler comments were added in Ghidra on the raw spawn helpers to preserve this provenance. - -#### Global map additions (renamed in Ghidra) - -| Address | Name | Evidence | -|---------|------|---------| -| `0x27c8` | `g_current_entity_handle` | Compared directly by `entity_is_type_match`; also captured by `entity_ai_update_loop`, `map_find_spawn_point`, and `enemy_spawn_at_position` as the current targeted/current entity handle | -| `0x2de4` | `g_player_entity_farptr` | FAR ptr to player entity; `+0x40`/`+0x42` are world X/Y | -| `0x27e7` | `g_ai_focus_pos_x` | Set by `entity_ai_update_loop` from player entity `+0x40` | -| `0x27e9` | `g_ai_focus_pos_y` | Set by `entity_ai_update_loop` from player entity `+0x42` | -| `0x27f1` | `g_cmd_effect_origin_x` | Cached effect origin X, cleared after delta in `entity_command_dispatch` | -| `0x27f3` | `g_cmd_effect_origin_y` | Cached effect origin Y | -| `0x27f5` | `g_player_delta_x` | Player X delta from last effect origin | -| `0x27f7` | `g_player_delta_y` | Player Y delta from last effect origin | -| `0x27fd` | `g_speed_double_flag` | 0 = normal, 1 = double speed animation | -| `0x27fe` | `g_ground_snap_mode_flag` | Non-zero = ground-snap prepass active for placements | -| `0x27d0` | `g_entity_update_max_id` | Max entity ID used by `entity_ai_update_loop` sweep | -| `0x3a00` | `g_anim_tick_counter` | Animation tick counter for frame-advance step budget | -| `0x3a02` | `g_anim_tick_overdrive_flag` | 0 = normal, non-zero = force max frame advance step | -| `0x2802` | `g_player_entity_handle` | Player entity handle (used as sentinel in animation completion checks) | - -### Raw 000e Parser Helper Cluster - -- A small helper cluster in the raw `000e:` area now appears to implement a fixed-size CRLF record parser/table builder, likely used by startup/config or script-ish text data. -- Newly renamed helpers: - - `000e:345e` = `record_table_init` - - `000e:34cc` = `record_table_destroy` - - `000e:35c6` = `record_table_release_buffer` - - `000e:35ef` = `record_table_next_slot` - - `000e:3639` = `record_table_parse_buffer` - - `000e:3798` = `record_parser_read_line` - - `000e:38a0` = `record_parser_seek_next_marker` - - `000e:38f8` = `record_parser_find_marker` - - `000e:39cc` = `record_parser_dispatch_at_directive` -- Current behavior read from raw-import decompilation/disassembly: - - `record_table_init` clears the table header and zeroes 300 words of inline storage. - - `record_table_parse_buffer` walks a CRLF-separated text buffer, captures each line, splits around a marker helper path, and stores parsed entry state into 0x0c-byte records. - - `record_parser_read_line` advances to the next CRLF-delimited line, rejects lines that start with `@` or with non-identifier punctuation, and terminates the line in-place with `0`. - - `record_parser_seek_next_marker` updates the parser's current marker cursor at `+0x18/+0x1a` by calling `record_parser_find_marker`; returns 1 if another marker was found, 0 at end-of-data. - - `record_parser_find_marker` scans forward until an `@` marker or end-of-data; optionally consumes the remaining length from the parser state. - - `record_parser_dispatch_at_directive` returns `0` unless the current substring begins with `@`; in the `@` case, it advances by 7 bytes and dispatches through a FAR thunk (`0000:ffff`). - -### Raw 000e RIFF/Animation Cluster - -The `000e:` segment contains a RIFF/AVI streaming animation subsystem. Animation objects have a confirmed field layout (offsets relative to the object base pointer). - -**Animation object field map:** -- `+0xb0` = active/valid flag -- `+0xb4`, `+0xb6`, `+0xb8`, `+0xba`, `+0xbc`, `+0xbe`, `+0xc0`, `+0xc2` = constructor-initialized flags -- `+0xd4` = alive sentinel (must be `-1` for "alive") -- `+0xe4` = paused flag (0 = running) -- `+0xeaf` / `+0xeb1` = far pointer to current RIFF chunk -- `+0xedb` = animation frame stack depth counter (max 9) -- `+0xee1` = frame data from current chunk `+4` -- `+0xeef` = current subframe index -- `+0x1b3` = subframe count -- `+0xef1` = audio completion flag -- `+0x11b` = ring buffer write pointer -- `+0x11f` = ring buffer read pointer -- `+0x117` = ring buffer base -- `+0x123` = ring buffer end (capacity boundary) -- `+0x102` = resource pointer -- `+0xde` = some entry index (multiplied by `0x30` to reach per-entry data at `+0x1c7`) - -**RIFF format notes:** Game uses standard RIFF/IFF: LIST and RIFF header magic (`0x5453494c` = `"LIST"`, `0x46464952` = `"RIFF"`), `"movi"` FourCC subchunk for frames. Audio frames tagged `"01wb"` (`0x62773130`), video frames in a separate path. - -**Newly renamed functions:** - -| Address | Name | Evidence | -|---------|------|---------| -| `000e:2a28` | `riff_find_chunk_by_type` | Walks RIFF LIST/RIFF chunk list; compares each node's FourCC at `+8` vs `param_2`; returns pointer to matching chunk or NULL | -| `000e:2104` | `animation_start` | Finds `"movi"` chunk via `riff_find_chunk_by_type`, inits ring buffer ptrs at `+0x11b` from `+0x117 + duration`, calls `animation_advance_frame`, loops `anim_load_audio_frame` and a second frame-loader thunk path per subframe | -| `000e:12f4` | `animation_advance_frame` | Fixed-point `0x1000` timer arithmetic; checks `+0xe4` (paused), advances ring buffer `+0x11b`/`+0x11f`/`+0x117`/`+0x123`; calls advance thunk | -| `000e:103f` | `animation_tick` | Guard wrapper: checks `param_1+0xd4 != -1`, then calls `animation_advance_frame(param_1, 0)` | -| `000e:06f7` | `anim_load_audio_frame` | Checks chunk tag == `0x62773130` (`"01wb"` = audio stream 1); computes ring buffer free space; copies chunk payload via `0x0000:ffff` thunk; increments subframe index at `+0xeef`; resets at subframe count `+0x1b3` | -| `000e:053d` | `anim_load_video_frame_wrapper` | Called once per subframe in `animation_start` immediately after `anim_load_audio_frame`; thin wrapper that forwards to `000e:ffb0` | - -**Unresolved callee:** -- `000e:ffb0` remains unresolved (decompiles garbled due to overlapping instructions at `000f:0085`/`000f:0086`). Current evidence from `animation_start` loop suggests this path is the video-side subframe loader paired with `anim_load_audio_frame`. - -**Constructor pattern (`000e:2777`, `000e:2860`, `000e:2969`):** -All three follow the same layout: -1. Call `FUN_000e_e935` (allocator — produces garbled 11KB decompile, not renamed) -2. Set fields `+0xb4` through `+0xc2` on the result -3. Call `000d:ebe3` (multi-step chain initializer: calls `177c`, `1acb`, `0988`, `22bc`, `1d4a`, `2104` in sequence) -4. Call `assert_alive_sentinel` (assertion: checks `+0xd4 != -1`) -5. Call `func_0x000eec83` - -The chain at `000d:ebe3` steps through VM opcode handlers (`000d:177c`, `000d:1acb`, `000d:0988`) that operate on a bytecode VM object with stack pointer at `+0xcc` (decremented by 2 per push) and segment base at `+0xce`. - -**Constructor variant renames (direct analysis):** -- `000e:223d` = `assert_alive_sentinel` -- `000e:2777` = `animation_ctor_variant_a` -- `000e:2860` = `animation_ctor_variant_b` -- `000e:2969` = `animation_ctor_variant_c` - -## Segment Map - -| Segment | Address Range | Purpose | -|---------|--------------|---------| -| CODE_0 | `1000:0000 - 1000:01ff` | Interrupt dispatch table / thunks | -| CODE_1 | `1020:0000 - 1020:0b9f` | Low-level interrupt handlers, mode switching | -| CODE_2 | `10da:0000 - 10da:25ef` | **Main runtime** — C library, I/O, formatting, entry point | -| CODE_3 | `1339:0000 - 1339:0c2f` | **DOS/DPMI services** — INT 21h/31h wrappers, interrupt vector mgmt, fast memcpy | -| CODE_4 | `13fc:0000 - 13fc:27af` | **String data & runtime constants** — error messages, format strings, Phar Lap ID | -| CODE_5 | `1677:0000 - 1677:0e8f` | **EMS/XMS memory management** — expanded memory handlers | -| CODE_6 | `1760:0000 - 1760:7ccd` | **DOS Extender core** — EXP loader, command-line parser, memory management, system init | -| DATA | `1760:7cd0 - 1760:7cdf` | Global data | -| HEADER | `HEADER::0000 - HEADER::044f` | MZ/P2 file header | - -## Named Functions - -### Entry & Startup -| Address | Name | Description | -|---------|------|-------------| -| `10da:7c40` | `entry` | Program entry point — checks CPU, parses command line, launches game | -| `10da:1816` | `main_init_and_run` | Main initialization — loads child EXP, sets up subsystems, runs game | -| `1760:1432` | `parse_cmdline_and_run` | Parses command-line args and invokes main_init_and_run | -| `1760:42fa` | `init_dos_extender` | Initializes Phar Lap 286 DOS extender (CPU check, VCPI/DPMI setup) | - -### Executable Loading -| Address | Name | Description | -|---------|------|-------------| -| `1760:2cdf` | `load_exp_file` | Loads .EXP executable — opens file, reads headers, allocates memory | -| `1760:1dfc` | `load_executable_image` | Parses P2/MZ headers, loads segments, creates LDT entries | -| `1760:24a6` | `apply_relocations` | Applies segment relocations to loaded executable | -| `1760:5eca` | `exec_child_process` | Executes child process with command-line arguments | -| `1760:5fee` | `exec_program_with_args` | Builds command line, locates and executes a program | -| `10da:1f7e` | `load_and_run_child` | Wrapper: loads child EXP and initializes it | - -### System Services -| Address | Name | Description | -|---------|------|-------------| -| `10da:2330` | `dos_exit` | Calls INT 21h AH=4Ch (terminate program) | -| `1760:42aa` | `detect_cpu_type` | Detects CPU: 0=8086, 2=286, 3=386+ | -| `1339:04a6` | `dpmi_set_interrupt_vector` | INT 31h — DPMI set interrupt vector | -| `1339:06ca` | `switch_to_real_mode` | Switches CPU from protected to real mode | -| `1339:06f2` | `switch_to_protected_mode` | Switches CPU from real to protected mode | -| `1339:0076` | `setup_interrupt_handlers` | Configures interrupt vectors via INT 21h | -| `1339:0a38` | `dos_int21h_wrapper` | Simple INT 21h call wrapper | -| `1339:0a82` | `dos_int21h_with_regs` | INT 21h call with register parameters | -| `10da:2360` | `get_flags_register` | Returns CPU FLAGS register | -| `10da:2363` | `set_flags_register` | Sets CPU FLAGS register | - -### Memory Management -| Address | Name | Description | -|---------|------|-------------| -| `1677:0d12` | `cleanup_ems_memory` | Frees EMS (INT 67h) memory handles | -| `10da:14fc` | `init_stack_fill_cc` | Fills stack with 0xCC (INT 3) for debugging/guard | -| `10da:1706` | `get_segment_base_addr` | Computes linear base address from segment descriptor | - -### Task Management -| Address | Name | Description | -|---------|------|-------------| -| `10da:19ca` | `task_switch_to_child` | Context switch to child process | -| `10da:1946` | `task_switch_from_child` | Context switch back from child process | -| `10da:1af4` | `call_termination_handler` | Calls registered termination callback | - -### I/O & Output -| Address | Name | Description | -|---------|------|-------------| -| `10da:00d6` | `flush_output_buffer` | Flushes buffered output via function pointer | -| `10da:0132` | `putchar_buffered` | Writes character to buffer, flushes on newline | -| `10da:0808` | `memcopy_to_buffer` | Copies N bytes from source to destination buffer | -| `10da:178c` | `print_error_message` | Formats and prints load error (references "not loaded: %s") | -| `10da:09e4` | `print_fatal_error` | Prints "Fatal Error" prefix + message | -| `10da:192a` | `print_internal_error` | Prints "Internal Error" message | - -### Interrupt Management -| Address | Name | Description | -|---------|------|-------------| -| `10da:1ec0` | `restore_interrupt_vectors` | Restores INT 2Fh and INT 67h vectors | -| `10da:2249` | `restore_int_2f_67` | Restores INT 15h vector if saved | -| `1760:3d86` | `init_system_check` | Validates system (CPU, DOS version, VCPI/DPMI, memory) | - -### Utility -| Address | Name | Description | -|---------|------|-------------| -| `10da:15ea` | `check_ds_segment` | Returns true if DS == 0x10 (checks data segment selector) | -| `1760:3c9e` | `nop_stub` | Always returns 0 (unused hook) | - -## Key String References - -| Address | String | Context | -|---------|--------|---------| -| `13fc:0016` | `$Id: comhighc.c 1.1 91/08/06...` | Phar Lap C runtime source ID | -| `13fc:0048` | `$Id: comutils.c 1.1 91/08/06...` | Phar Lap utility functions source ID | -| `13fc:0078` | `Serial Number ` | DOS extender serial validation | -| `13fc:14ca` | `Internal Error` | Error class prefix | -| `13fc:14da` | `Fatal Error` | Fatal error class prefix | -| `13fc:156a-1628` | File error messages | Not found, bad format, no memory, etc. | -| `1760:665c` | `Copyright (C) 1986-93 Phar Lap Software, Inc.` | DOS extender copyright | -| `1760:73da` | `-LDTSIZE 4096 -EXTHIGH D0_0000h -NI 18 -ISTKSIZE 3` | Default extender config | -| `1760:76fc-7c5a` | Numbered error messages | System requirement errors (1000-2170) | - -## Architecture Notes - -### Correction: The Game Ships As A Bound NE Executable -**Important**: The installed copy does **not** contain a separate `.EXP` file. `CRUSADER.EXE` is a bound executable with an outer DOS `MZ` stub and an internal `NE` executable image. The Phar Lap loader/runtime code and the game's real segment layout are both described inside this same file. - -The flow is: -1. `entry` → checks DOS version, CPU type -2. `init_dos_extender` → sets up protected mode (VCPI/DPMI) -3. `load_exp_file` → opens the game's `.EXP` file -4. `load_executable_image` → parses P2/MZ headers, creates segments, applies relocations -5. `task_switch_to_child` → transfers control to the actual game code - -For the installed retail copy, this means the currently loaded Ghidra program is only one interpretation of `CRUSADER.EXE`. The next import should target the **NE layer of the same file**, not a missing external `.EXP`. - -### NE Import Details -- File to import: `F:\Apps\Crusader No Remorse\CRUSADER.EXE` -- Outer DOS header: `MZ` -- `e_lfanew`: `0x36F70` -- Internal executable header: `NE` -- Segment count: `145` -- Initial `CS:IP`: `0001:0000` -- Initial `SS:SP`: `0091:2000` - -The currently analyzed protected-mode code at addresses like `10da:7c40` is consistent with the Phar Lap runtime/loader path. To reach the rest of the program, import `CRUSADER.EXE` again using an **NE-aware loader** or a workflow that starts from the internal NE header rather than the outer DOS stub. - -### Segment 1339: Fast Memory Operations -`FUN_1339_02a8` contains an unrolled loop (Duff's device pattern with 57 iterations) — a hand-optimized **fast memory fill/add** routine, typical in DOS game graphics engines. - -### EMS Memory (Segment 1677) -The game uses **EMS (Expanded Memory Specification)** via INT 67h for additional memory beyond the 1MB real-mode limit. Functions in segment 1677 manage EMS page frames and handle allocation/deallocation. - -## NE Segment 1 Analysis — Game Logic Functions (seg001_code_off_37600_len_8400.bin) - -This segment was imported as Raw Binary at base `0x0000`, language `x86:LE:16:Protected Mode`. -All 35+ identified functions renamed and annotated in Ghidra. - -### Cursor Subsystem (0x0060–0x0d5f) - -| Address | Name | Description | -|----------|---------------------------|-------------| -| `0x0060` | `cursor_update_hover` | Hover update: if mouse active & entity set, calls cursor_set_target | -| `0x00e9` | `cursor_set_target` | Positions cursor on entity, updates sprite + direction visual | -| `0x0322` | `cursor_shutdown` | Frees cursor resources, resets state | -| `0x0398` | `cursor_animation_update` | Angle-based cursor rotation (0x27d4, 0-359 → 0x168=360). Sprite at 0x27d6 | -| `0x050f` | `cursor_draw_tick` | Per-frame cursor draw (calls cursor_animation_update if dirty) | -| `0x0c24` | `action_key_valid` | Returns 1 if action code (param_1) is a valid game action key | -| `0x0d5f` | `cursor_direction_input` | Arrow-key input: rotates cursor angle, updates direction sprite | - -### Input Handling - -| Address | Name | Description | -|----------|-------------------------|-------------| -| `0x0526` | `input_keyboard_handler`| Key dispatch: 0x01=LMB, 0x0D/0x0C=scroll, 0x2C=save, 0x44=load | - -### Cursor State Data (at DS:0x27xx) -| Address | Field | Meaning | -|---------|-------|---------| -| `0x27c4` | cursor_sel1 | Selection counter 1 | -| `0x27c6` | cursor_sel2 | Selection counter 2 | -| `0x27c8` | current_entity | Handle to currently targeted entity | -| `0x27ca–0x27ce` | cursor_state | Cursor interaction state bytes | -| `0x27d0` | cursor_entity_type | Current entity type index | -| `0x27d2` | z_offset | Z-height offset for terrain adjustment | -| `0x27d4` | cursor_angle | Rotation angle (0–359) | -| `0x27d6` | cursor_sprite | Sprite handle for cursor visual | -| `0x27d8` | cursor_dirty | Set when cursor needs redraw | -| `0x27d9` | cursor_active | Master cursor enabled flag | -| `0x27da` | cursor_no_turn | Flag disabling cursor rotation | -| `0x27ed` | difficulty | Enemy accuracy divisor (used in projectile_init_vector) | -| `0x27fd` | hard_mode | Two-step mode (combat vs. explore) | -| `0x27fe` | move_mode | Movement phase flag | -| `0x27ff` | mouse_active | Mouse/input system active | -| `0x2800`–`0x2811` | various | UI state: active sprite, facing byte, cur entity handle | -| `0x283f`/`0x2841` | menu_obj_ptr | Active menu/dialog object far pointer | -| `0x2844` | in_save | In-progress save game flag | -| `0x290e` | entity_count | Number of active entities | -| `0x2910`–`0x2947` | snap_type_ids[10] | Entity types that snap-to-ground in snap_entity_to_ground | - -### Input / Action Dispatch - -| Address | Name | Description | -|----------|---------------------------|-------------| -| `0x2420` | `entity_command_dispatch` | Dispatches player commands to target entity; reads 0x27d0, 0x2de4, sends events 0x14/0xf, handles state machine 0x27ca/0x27cd/0x27ce | -| `0x279a` | `cheat_code_check` | Checks entity byte+1 against a five-byte event-code table at 0x2833 (`50 80 3e fd 27 00`, counter 0x283d); on full match, toggles 0x844/0x6045, emits helper/event code `0x103`, and takes one of two local success-side dispatch paths based on the new toggle state | - -### Follow-up: `cheat_code_check` internals - -- Direct raw-EXE recovery now tightens the cheat path substantially: - - `cheat_code_check` in `CRUSADER-RAW.EXE` is `0007:0d0a-0007:0e08`. - - It has exactly one direct caller in this build: `FUN_0007_04dc` at `0007:0511`, which prepares a small local event record and then calls `cheat_code_check` before continuing normal input dispatch. - - The byte compared on each call is `entity_or_event_record[+1]`, not a character fetched from a typed string buffer. - - Ghidra-side cleanup is now applied inside the function too: the decompiler shows `input_event_record`, `input_event_offset`, `new_cheat_enabled`, and `cheat_status_display_root`, plus a function comment describing the matched sequence and the cheat-toggle side effects. -- Variable and constant roles from the recovered body: - - `0x2833` is a local byte table, not an ASCII string in the raw EXE. The first five bytes are `50 80 3e fd 27`, followed by a `0x00` terminator. The checker walks that table one byte at a time. - - `0x283d` is the current match index into that byte table. On a successful byte match it increments; on mismatch it resets to zero and immediately retries the current input byte against the first table byte, so overlapping prefixes still work. - - `entity[+1]` is the compared input/event token. Because the cheat table is non-ASCII bytes, this path is matching higher-level input/event codes rather than literal typed letters. - - `0x844` is the main cheat-enable flag. The success path toggles it by converting the current byte to a boolean and negating it (`0 -> 1`, non-zero -> `0`). - - `0x6045` is written with the same post-toggle value as `0x844`, so it is a mirrored or secondary cheat-state latch rather than an independent control. - - Constant `0x103` is pushed into the shared helper at `000a:5276` immediately after the toggle. Existing notes already tie that constant to event `0x42f`; the local meaning is “emit the cheat-toggle side effect” rather than part of the matcher itself. - - `0x8c52` is forced to `1` on success before the side-effect path continues. -- Success-path structure: - - After a full table match, the code resets `0x283d` to zero, sets `0x8c52 = 1`, toggles `0x844` and `0x6045`, and calls the shared `0x103` helper. - - It then branches on the new cheat state. The `cheats-on` path uses local code pointer `DS:0x287b`; the `cheats-off` path uses `DS:0x2892`. - - Those values are not text strings and not vtable IDs. They land inside local helper code around `entity_registry_decrement` (`0007:286d`) and `entity_sprite_move_delta` (`0007:2884`), then pass through `display_null_check_dispatch` (`000b:1446`) and `sprite_node_get_or_traverse` (`000a:b988`). The exact UI/presentation object built by that path is still open, but it is clearly a local success-side dispatch path rather than “spawn vtable 0x287b/0x2892”. -- Conservative conclusion: - - `cheat_code_check` is a compact stateful matcher over event-code bytes, not text input. - - The interesting remaining question is what upstream input normalization turns user actions into the five-byte sequence `50 80 3e fd 27`, and what exact presentation object or notification path the two success-side helper targets construct for cheats-on versus cheats-off. - -### Follow-up: cheat-enable sources and verified cheat-only actions - -- Two independent cheat-enable sources are now verified in this build: - - The hidden input matcher in `cheat_code_check` toggles `0x844` and `0x6045` after matching the five-byte event-code table at `0x2833`. - - The command-line parser at `0004:635c-0004:63b8` recognizes the literal switch `-laurie` and directly sets `0x844 = 1` before taking a local notification path. This is the clearest readable cheat-enabler in the raw EXE. -- `jassica16` is still not directly visible in the raw EXE: - - No literal `jassica` string is present in the current string table, while `-laurie` is present as plain text. - - The matcher table remains the raw byte sequence `50 80 3e fd 27 00`, so if `jassica16` is a real player-facing input for this build it must be produced by an upstream normalization/compression step rather than stored as literal text. - - That upstream producer is still open; current evidence does not justify claiming a direct byte-for-character correspondence. -- A plain `F10` cheat action is now verified in the low-level keyboard path: - - `seg001_input_keyboard_handler` at `0006:ec29` handles input byte `0x44` and immediately returns unless cheats are enabled through `0x6045`. - - That branch does not test a modifier bit before the cheat action, so the code currently supports “plain F10 when cheats are enabled” much more strongly than “Ctrl+F10”. - - The branch emits event `0x261`, refreshes the active `0x7e22` entity/object lane, rebuilds or destroys several linked entities, and fires the follow-up event batch `0x33d`, `0x33f`, `0x340`, `0x341`, `0x33e` before re-enabling channels `4`, `1`, and `0`. - - The exact gameplay-side names of those follow-up events are still open, but this is consistent with a substantial restore/reset path such as the reported full-heal/resurrect action. No separate god-mode latch has been found in this branch. -- `FUN_0007_04dc` exposes a second cluster of cheat-only hotkeys once the same cheat gate is open: - - Confirmed byte tests in the caller-side dispatch are `0x37`, `0x4a`, `0x4e`, `0x52`, `0x53`, `0x0f`, `0x24`, plus the already-visible character events `'9'` and `'R'`. - - `0x37` calls `000c:8072`, while `0x4a` calls the neighboring helper at `000c:81c0`. - - `000c:8072` cycles a small `1..5` selector, writes that choice into the per-entity `0x7e1e` table at field `+0x15` through `FUN_0006_162d`, chooses one of the small sprite/state IDs `0x2e`, `0x2f`, `0x24`, `0x25`, and then calls `entity_table_set_sprite` at `0007:14af`. - - `000c:81c0` walks a broader `0x0b..0x19` selector range and writes the chosen value into the same per-entity table at field `+0x19` through `FUN_0006_1671`. - - Together these two helpers look like cheat/debug selector tooling tied to the current `0x7e22` object lane, not to health, invulnerability, or the cheat-enable toggle itself. - - `0x4e`, `0x52`, and `0x53` all route through the same object-method dispatch on the currently selected `0x49fb` entry after building a shared argument block with `func_0x000b2e00`, which again looks like debug/view tooling rather than a passive status flag. -- The UI/event layer also exposes multiple cheat-gated overlay or visualizer toggles behind internal event codes: - - Event `0x441` reaches `000c:8e16` and toggles byte `0xee0` before refreshing the `0x2bd8` controller object. - - Event `0x241` reaches `000c:8e46` and toggles byte `0x2bc9` before the same refresh. - - Event `0x141` reaches `000c:8e72` and toggles byte `0x2bca` before the same refresh. - - Event `0x410` reaches `000c:9703` and toggles byte `0x604f`, then takes one of two display/notification paths. - - Events `0x142` and `0x143` also dispatch into large cheat-gated view-building paths at `000c:9154` and `000c:92cd`; they clearly redraw substantial display state, but their exact user-facing names remain open. -- Current bottom line on the folklore claims: - - “Cheats can be enabled with `-laurie`” is directly verified. - - “There is a hidden input-sequence cheat enabler” is directly verified, but its exact human-readable spelling is still unresolved at the binary level. - - “F10 performs a large cheat-only restore/reset action” is directly verified. - - “Ctrl+F10 enables god mode” is not supported by the current code path; the verified F10 branch does not require a modifier and no dedicated god-mode latch has been recovered yet. - - “Other cheat-only debug visualizers/tools exist” is directly verified, though several are still known only by internal event codes or selector helpers rather than final user-facing names. - -### Menu / Event Callbacks - -| Address | Name | Description | -|----------|---------------------------|-------------| -| `0x2e53` | `cursor_event_notify_a` | Vtable thunk: forwards event to 0x27ca area handler | -| `0x2e96` | `cursor_event_notify_b` | Vtable thunk: forwards event to 0x27ca area handler (alt path) | -| `0x2ed9` | `menu_event_notify_a` | Vtable thunk: forwards event to 0x2843 (near menu object) | -| `0x2f0c` | `menu_event_notify_b` | Vtable thunk: forwards event to 0x2843 (alt path) | -| `0x2ff3` | `stub_noop_2ff3` | Empty stub, noop | -| `0x2ff8` | `entity_collision_callback_a` | Calls touch handler then func(entity+0x1e, seg, 2); opt: extra func if param_3&1 | -| `0x3046` | `set_active_menu` | Writes param_1/param_2 to 0x283f/0x2841 (active menu far pointer) | -| `0x3058` | `entity_collision_callback_b` | Same as entity_collision_callback_a (second vtable entry) | - -### Entity System (0x2401–0x5a50) - -| Address | Name | Description | -|----------|------------------------------|-------------| -| `0x2401` | `clear_cursor_selection` | Zeros 0x27c4/0x27c6 (selection counters) | -| `0x2899` | `cursor_switch_target_entity`| Switches cursor target: unloads old entity, loads new, re-registers | -| `0x29d8` | `get_z_offset` | Returns func() + *(0x27d2) = adjusted Z/height | -| `0x2a09` | `is_player_in_range` | Checks if entity is at player (0x2de4) X/Y +/-0xf0 range | -| `0x2a46` | `entity_ai_update_loop` | Loops entities 2–255, checks visibility, triggers fire/move | -| `0x2c36` | `ui_update_callback` | Calls cursor_state_clear then vtable[2] on menu object | -| `0x2c6b` | `cursor_state_clear` | Clears cursor state bytes 0x27ca–0x27ce, clears entity flag bit1 | -| `0x2c92` | `dialog_spawn` | Allocates dialog object, vtable=0x28b5, registers callback at 0x39ca | -| `0x2d47` | `entity_pick_handler` | Handles entity selection or save-game trigger (type 0x38d) | -| `0x2df9` | `clear_active_menu` | Zeros 0x283f/0x2841 (active menu far pointer) | -| `0x2e18` | `game_mode_init` | Initializes game mode state, resets sprite/cursor/menu state | -| `0x2f3f` | `entity_table_set_sprite` | Reads 0x7df9+slot*2; writes entity type table 0x7e1e[slot*0x79+0x0d]=param_2, +0x10=0 | -| `0x3c97` | `snap_entity_to_ground` | If entity type in snap_type_ids[10], resets Z to 0xf0 and adjusts XY | -| `0x3d6e` | `spawn_entity_checked` | Spawns entity with explosion pool limit check (0x84c0, 0x84c2) | -| `0x3f2f` | `entity_spawn` | Allocates entity, vtable=0x29aa/0x39ca, positions it | -| `0x40d4` | `entity_remove` | Removes entity: destroys sprites, clears 0x2802/0x2804 if needed | -| `0x4172` | `entity_animation_frame_update`| Advances/retreats anim frame ([+0x1d]) toward target [+0x1c/0x1b] based on quality | -| `0x42f8` | `stub_noop_42f8` | Empty stub, noop | -| `0x42fd` | `entity_registry_decrement` | Calls cleanup func then decrements entity count at 0x290e | -| `0x4314` | `entity_sprite_move_delta` | Updates shot sprite handle (entity+0x3f) position by adding delta params | -| `0x4552` | `entity_set_position` | Sets entity+0x3e (type_handle), world_x/y (entity+0x45/47), base_x/y (entity+0x4f/51) | -| `0x452b` | `shot_set_spawn_pos` | Calls entity_set_position then sets entity+0xbe = param_3 (extra spawn field) | -| `0x4591` | `entity_try_place` | entity_set_position with validation — position only set if placement succeeds | -| `0x5092` | `entity_deactivate` | Calls vtable[2] to deactivate, or finds in registry and removes | -| `0x5a50` | `entity_list_contains` | Checks if entity ptr exists in active entity list at 0x294c | -| `0x5b05` | `stub_noop_5b05` | Empty stub, noop | - -### Entity Object Layout (NE Segment 1 entities) -| Offset | Field | Meaning | -|--------|-------|---------| -| `+0x00` | vtable_ptr | Vtable pointer (0x29aa for generic, 0x2a57 for debris) | -| `+0x02` | slot_index | Entity slot index (used for registry at 0x39ca) | -| `+0x04` | entity_type | Entity type ID | -| `+0x19`/`+0x1a` | flags | Entity flags (bit0=debris, bit1=cleared by cursor_state_clear, bit6=active, bit8=valid) | -| `+0x1b` | vel_x | X velocity (clamped ±0x20) | -| `+0x1c` | vel_y | Y velocity (clamped ±0x20) | -| `+0x1d` | vel_z | Z velocity (clamped ±0x10) | -| `+0x1e` | fire_handle | Weapon/fire handle | -| `+0x1f` | is_enemy | 1 if entity is an enemy type | -| `+0x20`/`+0x21` | pos_frac_x/y | Fractional position (sub-tile) for movement | -| `+0x22` | pos_frac_z | Fractional Z | -| `+0x36` | weapon_type | Active weapon type ID | -| `+0x38` | facing | Current facing direction (0–15) | -| `+0x3c` | sprite_handle | Sprite for this entity | -| `+0x3f` | shot_sprite | Sprite handle for active projectile (0xFFFF = none) | -| `+0x45`/`+0x47`/`+0x49` | world_x/y/z | Current world position (integer) | -| `+0x4f`/`+0x51`/`+0x53` | base_x/y/z | Base/spawn position | -| `+0x54`/`+0x56`/`+0x58` | prev_x/y/z | Previous frame position | -| `+0x59` | attack_active | Attack in progress flag | -| `+0x5a` | at_target | Reached target flag | -| `+0x5e`–`+0x65` | delta_x/y/z/high | Per-step movement deltas (fixed point) | -| `+0x66`/`+0x68` | step_active | Stepping active (1=yes, 0=off) | -| `+0x6a`/`+0x6c` | weapon_slot/dist | Weapon slot and total travel distance | -| `+0x6e` | delta_z | Alt Z delta | -| `+0x70` | projectile_type | Projectile class (2/0xD=splash, 3=spread, 5=homing, 0xE=chain) | -| `+0x72`/`+0x74`/`+0x76` | target_x/y/z | Target position with deviation | -| `+0x77` | target_entity | Target entity handle | -| `+0x79` | secondary_pos | Secondary position struct pointer | -| `+0xad` | owner_entity | Owning entity handle | -| `+0xaf` | shot_owner_flags | Shot owner (entity/player) | -| `+0xb1` | bounce_count | Bounce counter (used with homing, type 5) | -| `+0xb3` | has_bounce | Has bounce trajectory active | -| `+0xbd` | actor_type | Actor type byte (used for direction table lookups) | - -### Shot Entity Lifecycle (0x435e–0x44a9) - -| Address | Name | Description | -|----------|----------------------------|-------------| -| `0x435e` | `shot_entity_alloc` | Alloc/init shot entity: vtable=0x297e, registry vtable=0x2969, zeros all state, copies player pos to +0xb5/b7 | -| `0x44a9` | `shot_entity_free` | Cleans up shot entity: frees sprite at +0x3c if valid (set to 0xFFFF), clears callbacks; optional full free if flag&1 | - -### Projectile / Combat (0x4659–0x5a99) - -| Address | Name | Description | -|----------|----------------------------|-------------| -| `0x4659` | `projectile_init_vector` | Sets up shot trajectory: target XY±deviation, step rate from weapon table at 0x2536 | -| `0x4a91` | `entity_fire_weapon` | Fires weapon from entity using 0x129b/0x12ac direction offset tables | -| `0x4b18` | `fire_weapon_from_cursor` | Gets cursor angle sprites, fires projectile at cursor target | -| `0x4b78` | `projectile_check_hit` | Hit test: if entity_type==0 uses bbox+0x79; else full 3D range; copies +0xa0→+0x77 (hit entity) | -| `0x4c2e` | `projectile_step_update` | Advances projectile one step; type 3 spawns sub-shots via spawn_entity_checked | -| `0x4d28` | `projectile_trace_ray` | Interpolated path trace: divides distance/0x10 into steps, collision checks each step; on hit calls projectile_apply_hit + entity_deactivate | -| `0x51ad` | `projectile_update_tick` | Full projectile tick: move, check reach target, bounce, call projectile_check_hit | -| `0x5a99` | `projectile_apply_hit` | Applies hit effects: if impacted obj byte+6 non-zero, calls damage func with weapon_slot/type/target/owner | - -### Weapon Type Table (0x2536) -- Each entry is 0x11 bytes (17), accessed as `weapon_type * 0x11` -- `[0]` = step divisor for distance calculation -- `[0x19]` = max range threshold (used in projectile_update_tick) - -### Direction Tables (0x129b / 0x12ac) -- Indexed by facing (0–15): dx offsets at 0x129b, dy offsets at 0x12ac -- Values are multiplied by distance (e.g. `*0x500`) for projectile spawn offsets - -### Collision Detection (0x60c1–0x621e) - -| Address | Name | Description | -|----------|----------------|-------------| -| `0x60c1` | `aabb_overlaps_3d` | 3D AABB overlap test — box layout [xmin,ymin,zmin,_,_,xmax,_,ymax,_,zmax] | -| `0x621e` | `bbox_translate` | Translates a 3D bounding box by (dx, dy, dz) — both min and max points | - -### Enemy AI / Spawning (0x6aed–0x6d21) - -| Address | Name | Description | -|----------|----------------------------|-------------| -| `0x6aed` | `map_find_spawn_point` | Finds map tile matching entity conditions; returns packed XYZ tile coords | -| `0x6bfc` | `actor_find_in_view` | Finds actor visible in current view frustum (temp data at 0x7eca) | -| `0x6ce9` | `enemy_spawn_with_target` | Wrapper: spawns enemy with player as target (param5=1) | -| `0x6d05` | `enemy_spawn_no_target` | Wrapper: spawns enemy without targeting player (param5=0) | -| `0x6d21` | `enemy_spawn_at_position` | Full enemy spawn: activates entity, assigns velocity from direction table (0x2a00/4/A) | - -### Player / HUD - -| Address | Name | Description | -|----------|-------------------------------|-------------| -| `0x50ee` | `player_position_update` | Updates player position from direction data; clamps to screen bounds | -| `0x6ff7` | `player_health_update_and_effect` | Encodes player HP into RGB bitfields at 0x7e46+0x1bec, spawns effect | - -### Destruction / Death (0x7490–0x75ff) - -| Address | Name | Description | -|----------|---------------|-------------| -| `0x7490` | `debris_spawn`| Spawns debris/fragment: vtable=0x2a57/0x2a1a, velocity, facing, linked list | -| `0x75ff` | `entity_die` | Death handler: spawns 1–4 debris objects, picks best explosion direction | - -### Entity Type Constants (weapon_type/entity class) -| Value | Entity Class | -|--------|--------------| -| `0x17` | Robot/mech type A | -| `0x18` | Robot/mech type B | -| `0x1` through `0x3c` | Various entity/weapon types | -| `0x3d` | Robot/mech type C | -| `0x3e` | Robot/mech type D | -| `0x2f5`–`0x2f7` | Special movement entity | -| `0x595`/`0x597` | Platform/elevator entities | -| `0x31c`/`0x322`–`0x327` | Explosive/effect entities | -| `0x38d` | Save game trigger entity | -| `0x426` | Spark/scatter sub-shot | -| `0x59a` | Player cursor/select indicator | - -### Entity Data Table at 0x7e1e -- Stride: `0x79` bytes (121 bytes per entry) -- Indexed by entity type (integer) or entity slot -- `+0x59` offset = class-detail flags byte (`entity_class_get_flag8` returns bit `0x08`; other callers also clear bit `0x10` here during at-target facing updates) -- `+0x5a` offset = flags byte (bit4 = special entity flag, bit3 = armor/shield flag) -- `+0x68` = targeting flag - -### Map / Resource Tables -| Address | Content | -|---------|---------| -| `0x2833` | Cheat code input sequence (null-terminated) | -| `0x283d` | Cheat sequence match position counter | -| `0x7ded` | Map X coordinate array (2 bytes per entry) | -| `0x7df1` | Map Y coordinate array (2 bytes per entry) | -| `0x7df5` | Map Z array (1 byte per entry) | -| `0x7df9` | Entity state array (2 bytes per slot) | -| `0x7e46` | Player state block far pointer | -| `0x7e1e` | Entity type table (stride 0x79) | - -### Entity Vtable Index (NE Segment 1) -| Address | Entity Class | -|---------|-------------| -| `0x28b5` | Dialog/menu object vtable | -| `0x287b` | Cheat-spawned entity (cheat ON) vtable | -| `0x2892` | Cheat-spawned entity (cheat OFF) vtable | -| `0x2969` | Entity registry vtable (stored at 0x39ca+slot*4, not entity's own vtable) | -| `0x297e` | Shot/projectile entity vtable | -| `0x29aa` | Generic/AI entity vtable | -| `0x2a1a` | Corpse entity vtable (variant) | -| `0x2a33` | Actor/corpse entity vtable | -| `0x2a57` | Debris fragment entity vtable | - -## Next Steps - -1. ✅ **NE Segment 1 imported and analyzed** — all 58 identified functions renamed and annotated -2. **Import additional NE segments** — priority: segments 22, 30, 59, 86 (segment 21 complete) -3. **Analyze additional segments** — apply same decompile→rename→annotate workflow -4. **Map file format loaders** — `.FLX`, `.SHP`, `.MAP`, `.TNT` resource formats -5. **Cross-reference entity type constants** with game entities (robots, platforms, triggers) -6. **Identify external segment calls** — the `func_0x0000ffff()` placeholders are all cross-segment calls; resolving them requires importing the referenced segments - -1. ✅ **NE Segment 1 imported and analyzed** — all 58 identified functions renamed and annotated -2. ✅ **Raw 0007 segment analyzed** — rendering, camera/scroll, save slot, and scroll region subsystems documented (~60 functions renamed and annotated) -3. **Import additional NE segments** — priority: segments 22, 30, 59, 86 (segment 21 complete) -4. **Analyze raw 0007 draw helper cluster** — `FUN_0007_03b4`, `FUN_0007_04b8`, `FUN_0007_04dc`, `FUN_0007_057f`, `FUN_0007_0614`; called by sprite/draw list functions -5. **Analyze `FUN_0007_4cdf`** — large 15-case animation/movement dispatcher; overlapping instruction warnings; cases 0, 2, 3, 6, 9, 0xa, 0xe are clean -6. **Map file format loaders** — `.FLX`, `.SHP`, `.MAP`, `.TNT` resource formats -7. **Cross-reference entity type constants** with game entities (robots, platforms, triggers) -8. **Identify external segment calls** — the `func_0x0000ffff()` placeholders are all cross-segment calls; resolving them requires importing the referenced segments - -## Raw 0007 Rendering & Sprite Draw List Subsystem (new) - -A complete sprite draw list and tile-based visibility system was recovered from the `0007:e000–0007:fe00` flat range (above seg001, separate segment loaded at `0x7E000+`). - -### Isometric Coordinate Transform - -| Address | Name | Evidence | -|---------|------|---------| -| `0007:be67` | `world_to_screen_isometric` | Classic 2:1 isometric formula: `screen_x = (wx + sx) + (wy + sy)*2`, `screen_y = (wy + sy)*2 - (wx + sx)`. Scroll globals: `0x2bb7` (X), `0x2bb9` (Y). Output to `*param_3`, `*param_4`. | -| `0007:be9e` | `world_to_screen_isometric_wrapper` | Thin wrapper — calls `world_to_screen_isometric` with args shifted by one | - -### Draw List Node Format -Sprite/draw node (size `0x18` = 24 bytes from pool, allocated by `linked_list_pop_2cc3`): -| Offset | Field | Notes | -|--------|-------|-------| -| `+0x0` | vtable | Function ptr for render callback (vtable[0] = draw) | -| `+0x8` | dep_from_list | Near ptr to list of sprites that depend ON this | -| `+0xa` | dep_to_list | Near ptr to list of sprites this depends ON | -| `+0xc` | bbox_xmin | Screen bounding box (4 ints) | -| `+0xe` | bbox_ymin | | -| `+0x10` | bbox_xmax | | -| `+0x12` | bbox_ymax | | -| `+0x14` | flags | bit 0=queued in draw list, bit 5=visible/rendered, bit 6=root sentinel, bit 7=must-redraw | -| `+0x15` | z_depth | int; sort key for painter's algorithm. 1 = root sentinel | -| `+0x17` | order_flag | if set, propagates must-redraw to dependent sprites | -| `+0x18` | tile_index | sparse tile index (for dirty bitmask bit addressing) | - -### Draw List Functions - -| Address | Name | Evidence | -|---------|------|---------| -| `0007:eb36` | `drawlist_pool_init` | Inits free pool: 1500 nodes × `0x2a` (42) bytes from base `0x2cc7`. Sets `0x2ccf = 1500` (count), `0x2cc3` = linked list head. Copies `0x2cc9` → `0x2cae`. | -| `0007:eb12` | `linked_list_push_2cc3` | LIFO push: `node->next = head_2cc3; head = node; count_2ccf++`. | -| `0007:eada` | `linked_list_pop_2cc3` | LIFO pop: dequeues node from `0x2cc3` head, decrements `0x2ccf` count. | -| `0007:ebd9` | `linked_list_dequeue_headtail` | FIFO dequeue from head/tail pair list; calls `FUN_0007_03ec` after dequeue. | -| `0007:ec2c` | `drawlist_enqueue` | FIFO enqueue: appends node to draw list (head if empty, tail always updated). | -| `0007:ec63` | `drawlist_remove_node` | Unlinks specific node from head or tail position; calls `FUN_0007_03ec`. | -| `0007:eca8` | `drawlist_process_and_render` | **Two-stage render pass.** Stage 1: drains `0x8442` (pending), viewport-tests each sprite, moves in-bounds to `0x8446` (visible). Stage 2: drains `0x8446`, calls sprite vtable[0] to draw. Recursive re-run if `0x2cb2` defer flag set. | -| `0007:edfa` | `drawlist_enqueue_sprite_children` | Enqueues all child sprites at node `+8` linkage to draw pending list if not already queued or rendered. Skips if `+0x15` z-depth == 1. | -| `0007:ef3d` | `sprite_add_draw_dependency` | Links sprites A and B with z-order dependency. Allocates link node via `FUN_0007_057f`. Stores in A's `+10` and B's `+8`. Sets must-redraw on B if A has `+0x17` set. | -| `0007:ef9f` | `sprite_enqueue_for_draw` | Null-guard; sets node `+0x14 \|= 1`, enqueues to `0x8442`. | -| `0007:efca` | `sprite_invalidate_and_unlink` | Full sprite removal: re-enqueues all dependents, frees link nodes via `FUN_0007_0614`, clears `+8/+10` lists, dequeues self from `0x8442`. | -| `0007:f2a0` | `sprite_sort_by_depth_and_link` | Compares `+0x15` z-depth of two sprites; calls `sprite_add_draw_dependency` in the correct order (lower z first). Handles equal-depth via thunk. | -| `0007:f654` | `drawlist_init` | Full draw system init: `drawlist_pool_init`, init full-screen viewport (`0x844a..0x8450 = 0..639, 0..screen_h`), allocate root sentinel node (vtable `FUN_0000_2ce4`, z-depth=1, flag=0x40), stored at `0x846a`. | -| `0007:ea00` | `bbox_intersect` | In-place 2D rect intersection: max of mins, min of maxes. Input/output: 4-int array `[xmin,ymin,xmax,ymax]`. | -| `0007:ea6d` | `bbox_union` | In-place 2D rect union: min of mins, max of maxes. | -| `0007:ee5a` | `viewport_update_from_sprite_bounds` | Subtracts scroll offsets from sprite bbox; clips to screen rect (`0x2ca6..0x2cac`); calls `bbox_intersect`; stores updated viewport at `0x844a..0x8450`; dispatches to render. | - -### Tile-Based Visibility System - -The rendering system uses a **6×5 tile grid** at DS:`0x846a` (30 entries × 2 bytes each =60 bytes). Tiles represent screen regions of approximately 128 screen pixels per tile. Each tile holds a near pointer to a linked list of sprite nodes overlapping that tile. Bitmasks track dirty and renderable tiles. - -| Address | Name | Evidence | -|---------|------|---------| -| `0007:f9e2` | `drawlist_mark_dirty_tiles` | Converts bbox to tile grid coords (divide by 128, clamp to 6×5). Walks all sprites in overlapping tiles' spatial buckets; re-enqueues overlapping sprites. Sets bits in dirty bitmask `0x2cbb`. | -| `0007:fb53` | `tile_visibility_update` | Iterates redraw bitmask (`0x2cbb`, up to 10240 tiles). For each dirty tile with a sprite, computes isometric screen position from map X/Y/Z. Checks sprite dimension bitfields at `pbVar8+2..+3` against 640×480 viewport. Sets corresponding bit in render bitmask `0x2cb7`. Clears dirty bitmask after processing. | -| `0007:fd98` | `tilemap_draw_if_dirty` | Guard: if render bitmask `0x2cb7` non-zero, calls `thunk_FUN_0007_001d` to trigger tilemap draw. | - -### Draw List / Viewport Globals - -| Address | Name | Notes | -|---------|------|-------| -| `0x2bb7` | `g_scroll_offset_x` | World-to-screen X offset (scroll) | -| `0x2bb9` | `g_scroll_offset_y` | World-to-screen Y offset (scroll) | -| `0x2ca6..0x2cac` | `g_screen_clip_rect` | Screen clip rectangle [xmin,ymin,xmax,ymax] | -| `0x2cae` | `g_draw_segment` | DS segment for draw node far pointers | -| `0x2cb0` | `g_free_pool_seg` | Segment for node free pool far calls | -| `0x2cb2` | `g_render_defer_flag` | If set, defers current render pass | -| `0x2cb7` | `g_render_tile_bitmask` | Far ptr to bitmask of tiles ready to render | -| `0x2cbb` | `g_dirty_tile_bitmask` | Far ptr to bitmask of dirty/changed tiles | -| `0x2cbf` | `g_tile_origin_x` | Tile grid world origin X (for tile coordinate math) | -| `0x2cc1` | `g_tile_origin_y` | Tile grid world origin Y | -| `0x2cc3` | `g_free_pool_head` | Free node pool linked list head | -| `0x2ccf` | `g_free_pool_count` | Free node pool remaining count (max 1500) | -| `0x8442` | `g_draw_pending_list` | Draw pending list head/tail (near ptrs) | -| `0x8446` | `g_draw_visible_list` | Draw visible list head/tail (near ptrs) | -| `0x844a..0x8450` | `g_viewport_rect` | Current viewport [xmin,ymin,xmax,ymax] | -| `0x846a` | `g_tile_grid_base` | 6×5 tile grid spatial index (near ptr per tile) | - -## Raw 0007 Map Scroll / Camera Subsystem (new) - -A scroll/camera management cluster found in the `0007:bxxx–0007:dxxx` range. - -### Entity State Transition Helper - -| Address | Name | Evidence | -|---------|------|---------| -| `0007:5b6f` | internal block only *(no function after repair)* | Direct raw-analysis behavior remains useful as a local label: this block sets entity `+0x3a = 1` (arrived flag), calls `entity_set_facing_direction`, clears bit `0x10` from entity type table `0x7e1e[type*0x79+0x59]`, then tail-calls onward. After the PyGhidra boundary repair, `0007:5b6f` is no longer a function entry and should be treated only as an internal control-flow label inside the first repaired seg043 routine. | - -### seg043 Standalone Boundary Recovery - -- Direct disassembly of `NE_segments/seg043_code_off_75A00_len_336F.bin` shows the first non-zero bytes at offset `0x0090`; offsets `0x0000..0x008f` are all zero in the standalone extract. -- The first three clean 16-bit prologues in seg043 are at: - - `seg043:0090` -> raw `0007:5a90` - - `seg043:017a` -> raw `0007:5b7a` - - `seg043:021c` -> raw `0007:5c1c` -- The first recovered standalone function spans `0x0090..0x0179`, which means raw `0007:5b6f` falls inside the tail of that routine and overlaps the true return at raw `0007:5b79`. -- Repair status: applied in `CRUSADER-RAW.EXE` via the local PyGhidra toolkit. The bad function object at `0007:5b6f` was removed, and three conservative replacement functions were created: - - `0007:5a90` = `seg043_func_0090` with body `0007:5a90..0007:5b79` - - `0007:5b7a` = `entity_set_at_target_update_facing` with body `0007:5b7a..0007:5c1b` - - `0007:5c1c` = `seg043_func_021c` with body `0007:5c1c..0007:5c80` -- Follow-up re-decompilation now supports one real behavioral rename: `0007:5b7a` sets entity `+0x3a` to 1, calls `entity_set_facing_direction`, clears class-detail bit `0x10` at `0x7e1e[type*0x79+0x59]`, then continues into downstream dispatch, so the repaired middle function has been renamed `entity_set_at_target_update_facing`. -- `0007:5a90` now has a stronger structural read from standalone disassembly: it allocates an object when the incoming far pointer is null (literal `0x98`), runs a far setup helper using DS:`0x4b48..0x4b4e` and the second incoming far pointer, writes `0x4c13` at the object base, calls `entity_set_at_target_update_facing` with the third incoming far pointer, then adjusts the nested object at `+0x38` using extents read from the object at `+0x34` before returning the object pointer. -- `0007:5c1c` also has a stronger structural read: it optionally calls a virtual method through `[object->vtable + 0x4c]` when `object+0x44/+0x46` is non-null, passes a local stack word through `entity_class_get_flag20`, then dispatches one or two downstream far helpers using `object+0x48`, gated by a local status byte at `[bp-0xe]`. -- `0007:5a90` and `0007:5c1c` remain intentionally positional because their current decompiles still collapse into unresolved thunk dispatches and do not yet support safe behavioral names. - -### Entity Class Flag Helper - -| Address | Name | Evidence | -|---------|------|---------| -| `0006:02cc` | `entity_class_get_flag20` | Returns `((class_detail[type*0x79 + 0x59] & 0x20) >> 5)`. Conservative raw-analysis name; bit meaning still unknown, so the helper is named after the observed flag mask rather than a guessed behavior. | - -### Animation Start Frame Helper - -| Address | Name | Evidence | -|---------|------|---------| -| `0007:71b2` | `entity_set_anim_start_frame_from_flags` | Reads entity `+0x4b` flags. If bit 1 set: uses type table `+0x59 & 4` (attack active) to select last frame (`+0x39 - 1`), zero, or half-frame (`+0x39 >> 1`). Writes computed value to type table `+0x10`. If bit 2 set without bit 1: dispatch thunk. | - -### Combat Helper - -| Address | Name | Evidence | -|---------|------|---------| -| `0007:894b` | `entity_check_attack_flags_and_dispatch` | Guards on entity `+0x4b` bit 1 AND target object `+5` bits `0x1c`. If both set: dispatches thunk attack event. | - -### Vtable Dispatch Helpers - -| Address | Name | Evidence | -|---------|------|---------| -| `0007:8920` | `entity_call_vtable_slot0c` | Calls `(*param_1)[vtable+0xc]()`. | -| `0007:8cb8` | `entity_call_vtable_slot08` | Calls `(*param_1)[vtable+0x8]()`. | -| `0007:ccf1` | `entity_call_vtable_slot28` | Calls `(*param_1)[vtable+0x28]()`. | - -### Active Flag / Counter - -| Address | Name | Evidence | -|---------|------|---------| -| `0007:8854` | `entity_set_active_flag` | Sets entity `+0x40 = 1` (active); increments global `0x2800`. | - -### Dispatch Table Lookup - -| Address | Name | Evidence | -|---------|------|---------| -| `0007:8508` | `entity_table_lookup_and_dispatch` | Searches 1-entry table at `0x2b46` for `(param_3, param_4)` key pair; on match, calls the entry's function pointer at `[2]`. | - -### Scroll/Camera Functions - -| Address | Name | Evidence | -|---------|------|---------| -| `0007:ba00` | `watch_entity_controller_create_global` | Thin global-create wrapper around `watch_entity_controller_create`; allocates default controller object and stores it at `0x2bd8`. | -| `0007:ba13` | `watch_entity_controller_dispatch_if_present` | If `0x2bd8` is non-null, calls controller vtable slots `+0x2c` and `+0x30`. | -| `0007:ba45` | `watch_entity_controller_create` | Allocates/initializes a type `0x2c2b` controller object, stores it at `0x2bd8`, sets event type `0x0219`, and installs callback-table entry `0x2be4` through `0x39ca`. | -| `0007:bab5` | `entity_set_watch_ptr` | Legacy name still in place, but newer constructor evidence now shows `0x2bd8` is a controller object lane rather than just a raw watched-entity FAR pointer. | -| `0007:baea` | `camera_update_and_check_player_scroll` | Calls watch entity vtable `+0x24`; if `0x2bd1` flag clear checks if player position (from `g_player_entity_farptr+0x40`) has moved > 32 units since `0x2be0`; if so, updates `0x2be0` and conditionally dispatches scroll event via `0x45aa`. | -| `0007:c6ba` | `scroll_camera_set_state_params` | Stores word params to `0x8354`, `0x8356`, byte to `0x8358`; dispatches. | -| `0007:cd56` | `dispatch_if_flag_2bd3_set` | Returns unless `0x2bd3` non-zero. | -| `0007:cfef` | `dispatch_if_mode_flags_set` | Two-flag check: dispatches if `0x2bca` or `0xee0` is non-zero. | -| `0007:d0f6` | `scroll_call_set_params_unless_blocked` | Calls `scroll_camera_set_state_params` only if `0x2bbb == 0`. | -| `0007:d119` | `scroll_update_direction_tracking` | Guards on `0x2bd3`. Calls `scroll_call_set_params_unless_blocked`. Compares direction bytes from `0x2cf4/0x2cf5` against cached `0x2bbd/0x2bbe`; if changed, clears `0x2bbc`. Dispatches. | -| `0007:d4a5` | `scroll_set_option_value` | Sets `0x2bc6 = param_1`. | -| `0007:d4b0` | `scroll_set_params_default` | Unconditional call to `scroll_camera_set_state_params`. | -| `0007:d4d3` | `scroll_set_map_index_validated` | If `param_1` in `[0..250]` and differs from `0x2bbf`, updates `0x2bbf` and clears `0x2bbc/0x2bbb`. | -| `0007:d655` | `map_position_has_changed` | Compares map arrays `0x7ded/0x7df1/0x7df5` at index `0x2bc6` against cached `0x2bc1/0x2bc3/0x2bc5`. Returns 1 if changed, 0 if same. | -| `0007:d6b1` | `scroll_clear_dirty_flags_and_dispatch` | Clears `0x2bbb = 0` and `0x2bbc = 0`; dispatches. | -| `0007:de57` | `entity_check_player_range_and_update` | Reads player world position (`g_player_entity_farptr+0x40`); if moved > 59 units from `entity+0x32` (cached pos), updates cache and calls `scrollregion_find_and_dispatch`. | - -### Scroll Region Table (`0x835a`) -8 entries × `0x19` (25) bytes = 200 bytes. Entry layout: -| Offset | Field | Notes | -|--------|-------|-------| -| `+0x0/+0x2` | key pair | Matched by scroll region key lookup | -| `+0x8` | refcount | Reference count (incremented on match) | -| `+0xe` | count2 | Secondary counter | -| `+0x10` | active | Non-zero when region is live | -| `+0x11/+0x13` | x_start/x_end | Bounding X coordinates | -| `+0x15/+0x17` | y_start/y_end | Bounding Y coordinates | - -| Address | Name | Evidence | -|---------|------|---------| -| `0007:e194` | `scrollregion_process_active` | Iterates active scroll entries (key non-zero AND `+0x10 != 0`), reads bounding box fields `+0x11/+0x13/+0x15/+0x17`, dispatches with bounds args. | -| `0007:e214` | `scrollregion_find_and_dispatch` | Finds empty scroll entry (zero key) and dispatches. | -| `0007:e29c` | `scrollregion_register` | Finds or allocates scroll region entry. Existing match: bump refcount / set active. New: init via `scrollregion_entry_init`. Special key `0x4ed`: thunk dispatch instead. | -| `0007:e50f` | `scrollregion_entry_init` | Null-guards param_1; zeroes output param_2, param_3, param_4; dispatches continuation. | -| `0007:e74a` | (unnamed) | Sets up call to walk `0x835a` table (8 entries, stride `0x19`, filter `0x968`), with callback return label `e763`. | - -### Save Slot System (`0x8337` + `0x2ba3`) - -10 save slots, each `0x400` (1024) bytes. Handle table at `0x8337` (10 words). Slot buffer base at FAR ptr `0x2ba3`. - -| Address | Name | Evidence | -|---------|------|---------| -| `0007:ac13` | `saveslot_table_clear` | Fills `0x8337..0x834b` (10 words) with `0xFFFF` (all slots empty). | -| `0007:acab` | `saveslot_free_if_empty` | Scans slot `0x2ba3[param_1*0x400]` for non-zero data; if empty, sets handle `0x8337[param_1] = 0xFFFF`. | -| `0007:ad47` | `saveslot_find_index_by_id` | Linear scan of 10-word handle table `0x8337`; returns index of matching word or `-1`. | -| `0007:ad79` | (unnamed) | Finds a free (0xFFFF) slot index. Complement of `saveslot_find_index_by_id`. | -| `0007:afd4` | `saveslot_get_or_alloc` | Gets slot pointer: calls `saveslot_find_index_by_id`; if not found calls `ad79` to get free slot; returns `0x2ba3 + slot * 0x400`. Returns 0 if no free slot. | -| `0007:b02c` | `saveslot_write_entry` | Navigates to `slot_base[param_3 * 4]`; dispatches thunk paths for write (existing, overwrite, new). | -| `0007:b0de` | `saveslot_read_entry_flags` | Reads from slot entry far pointer at `slot_base[param_3*4]`; extracts 4-byte packed bitfield from `+4..+7` in entry record into `*param_1`. Bit-by-bit extraction loop for 4 bytes. | - -### String & Memory Utilities - -| Address | Name | Evidence | -|---------|------|---------| -| `0007:a96d` | `entity_copy_string_truncated80` | Strlen(param_3) ≤ 0x50 guard; copies string word-by-word from param_3 into `param_2+8`. | -| `0007:b813` | `memcpy_4words` | Copies 4 words (8 bytes) from `param_2` to `param_1`. | -| `0007:b46d` | `entity_dispatch_if_slot82e2_valid` | Guard: if `*(int *)0x82e2 != -1`, calls dispatch thunk. | - -### Linked List Utilities (draw pool + sprite) - -| Address | Name | Evidence | -|---------|------|---------| -| `0007:ea00` | `bbox_intersect` | In-place rect intersection: `[xmin,ymin,xmax,ymax]` = max(mins) × min(maxes). | -| `0007:ea6d` | `bbox_union` | In-place rect union: `[xmin,ymin,xmax,ymax]` = min(mins) × max(maxes). | - -### Scroll/Camera Globals - -| Address | Name | Notes | -|---------|------|-------| -| `0x2bb7` | `g_scroll_offset_x` | Isometric scroll X — added to world_x in screen transform | -| `0x2bb9` | `g_scroll_offset_y` | Isometric scroll Y | -| `0x2bbb` | `g_scroll_blocked` | If non-zero, blocks `scroll_camera_set_state_params` call | -| `0x2bbc` | `g_scroll_dirty` | Scroll direction changed flag (cleared when direction tracks) | -| `0x2bbd` | `g_scroll_dir_x` | Cached scroll direction X | -| `0x2bbe` | `g_scroll_dir_y` | Cached scroll direction Y | -| `0x2bbf` | `g_map_index` | Current map/level index `[0..250]` | -| `0x2bc1/0x2bc3/0x2bc5` | `g_map_entry_x/y/z` | Cached map entry X/Y/Z (vs. live map arrays) | -| `0x2bc6` | `g_map_slot_index` | Index into `0x7ded/0x7df1/0x7df5` arrays for current map slot | -| `0x2bca/0x2bc9` | `g_option_toggle_state` | UI option toggle state flags | -| `0x2bd1` | `g_scroll_block_flag` | Blocks camera update path if non-zero | -| `0x2bd3` | `g_scroll_active` | Non-zero = scroll system active | -| `0x2bd8` | `g_watch_entity_controller_farptr` | FAR ptr to the watch/camera controller object created by `watch_entity_controller_create`; older notes treating it as a raw entity pointer were too narrow | -| `0x2be0` | `g_player_scroll_pos` | Cached player world X+Y (ulong) for scroll threshold detection | -| `0x8354..0x8358` | `g_scroll_state_params` | Three scroll state params (word, word, byte) | - - -## Raw 0008 Gameplay Dispatch Helper Batch (new) - -Small conservative rename batch from direct field-write behavior in the `0008:ba00-0008:be05` cluster. - -### Newly renamed functions - -| Address | Name | Evidence | -|---------|------|---------| -| `0008:ba00` | `entity_dispatch_entry_init` | Constructor-style init: optional alloc (`0x32` bytes), vtable/list-link setup (`0x3b06`, `0x2d10`, `0x3afe`), zeroes state fields, seeds group from global active layer `0x39c9` via `entity_set_group_id` | -| `0008:bbb6` | `entity_set_source_type` | Writes entry word field `+0x04` from incoming parameter, then dispatches through FAR thunk path | -| `0008:bc27` | `entity_set_event_type_checked` | Writes entry word field `+0x06`; when source field `+0x04` is non-zero, validates old/new event transition, including special checks for `0xF0-0xF7` and upper bound `<= 0x0FFF` | -| `0008:bca8` | `entity_set_group_id` | Validates group id range `1..31`, writes low 5-bit group in byte `+0x08`, decrements old per-group counter and increments new one via counter table pointed to by `0x39c5` | -| `0008:bd53` | `entity_dispatch_entry_unlink` | Clears bit `0x1000` in flags2 at `+0x18` and zeroes the four link/state words at `+0x0a..+0x10`; used as the common unlink/reset tail in the local dispatch-entry pruning path | -| `0008:be05` | `entity_increment_group_id` | Computes `((entry+0x08)&0x1F)+1`, validates against active-layer assumptions (`0x39c9`), then applies through `entity_set_group_id` | - -### Verified call/xref notes - -- `entity_set_group_id` is called from: - - `entity_dispatch_entry_init` at `0008:bae4` - - `entity_increment_group_id` at `0008:be57` -- `entity_set_source_type` is used from at least: - - `FUN_0008_c92f` (`0008:c94d`, `0008:c96d`) - - `FUN_0008_ca18` (`0008:ca36`, `0008:ca56`) - -### Gameplay relevance - -- This cluster appears to manage core dispatch-entry metadata (`source_type`, `event_type`, group/layer byte and counters) that feeds the seg021 scheduler/event system previously documented. -- The field offsets match the current seg021 entity/dispatch layout notes (`+0x04`, `+0x06`, `+0x08`), strengthening confidence in cross-function struct consistency. -- Follow-up on the same cluster: - - `0008:bd79` remains positional, but current decompiler evidence shows it compares an entry extent/position tuple against the player world position (`g_player_entity_farptr + 0x40/+0x42`), optionally fires the vtable callback at `+0x28` when flag `0x100` is armed, then calls `entity_dispatch_entry_unlink`. - -## Raw 0008 Pair-Sync Helper Batch (new) - -Conservative directional rename batch from the `0008:c7f1-0008:cad7` cluster. -These functions are clearly paired and structurally symmetric, but final gameplay semantics are still partial due to FAR-thunk heavy internals. - -### Newly renamed functions - -| Address | Name | Evidence | -|---------|------|---------| -| `0008:c7f1` | `entity_pair_update_link_slot_a` | Guards on entry flags (`+0x16` must not include `0x4000`), then dispatches through FAR thunk using entry local struct at `+0x28` and partner-side key/id input | -| `0008:c890` | `entity_pair_update_link_slot_b` | Twin of `entity_pair_update_link_slot_a` with identical call shape and guard behavior; used in opposite order by pair-sync wrappers | -| `0008:c92f` | `entity_pair_sync_a` | If either side has unset `source_type` (`+0x04`), copies from partner via `entity_set_source_type`; then calls link-slot helpers in A-order and ends in FAR thunk using first side `+0x1e` data | -| `0008:ca18` | `entity_pair_sync_b` | Mirror of `entity_pair_sync_a` with reversed side/order for helper calls and final thunk argument ordering | -| `0008:c9ee` | `entity_pair_mark_and_sync_a` | Sets bit `0x10` in entry flags at `+0x16`, then calls `entity_pair_sync_a` | -| `0008:cad7` | `entity_pair_mark_and_sync_b` | Sets bit `0x10` in entry flags at `+0x16`, then calls `entity_pair_sync_b` | - -### Verified call/xref notes - -- `entity_pair_sync_a` is called from `entity_pair_mark_and_sync_a` (`0008:ca10`). -- `entity_pair_sync_b` is called from `entity_pair_mark_and_sync_b` (`0008:caf9`). -- Shared helper use inside pair sync wrappers: - - `entity_pair_update_link_slot_b` at `0008:c981` and `0008:ca6a` - - `entity_pair_update_link_slot_a` at `0008:c995` and `0008:ca7e` - -### Gameplay relevance - -- This cluster likely handles directional two-entity relationship synchronization in the scheduler/entity-dispatch layer (source/type propagation plus paired link-slot updates). -- Offsets used here (`+0x04`, `+0x16`, `+0x1e`, `+0x28`) align with the existing seg021 object-field and linker/list usage patterns, which increases confidence while preserving conservative naming. - -## Raw 0008 Flag-0x20 Target-State Helpers (new) - -Two complementary helpers near the pair-sync cluster were renamed using strict field/bit behavior only. - -| Address | Name | Evidence | -|---------|------|---------| -| `0008:cb2c` | `entity_flag20_clear_and_update_target` | Clears bit `0x20` at entry flags `+0x16`; if non-null target args are provided, writes far-pointer target fields `+0x12/+0x14`; then calls shared refresh helper `0008:c01d` | -| `0008:cb5c` | `entity_flag20_set_and_init_target` | Sets bit `0x20` at entry flags `+0x16`; initializes target far-pointer fields `+0x12/+0x14` only when currently zero; then calls shared refresh helper `0008:c01d` | - -Notes: -- Naming intentionally stays flag-centric because high-level gameplay meaning of bit `0x20` is not yet fully resolved. -- Both helpers share the same post-update refresh path (`0008:c01d`), suggesting they are two state transitions in one target/link-management subsystem. - -## Raw 0008 Dispatch Refresh Pipeline (new) - -Follow-up rename batch for the shared refresh node used by the new flag-0x20 helpers. - -| Address | Name | Evidence | -|---------|------|---------| -| `0008:c01d` | `entity_refresh_dispatch_state` | Early-exit when flags at `+0x16` indicate dead (`0x8`) or already refreshed (`0x4000`); otherwise runs pre-clear, sets `0x4000`, calls update vfunc path, then runs flag-conditioned handlers | -| `0008:bfb2` | `entity_clear_status_bits_from_flags` | Clears specific bits in status word at `+0x32` based on state flags (`+0x16:0x400`, `+0x18:0x40/0x80`) | -| `0008:bf8e` | `entity_call_update_vfunc14` | Calls helper `0008:be6b`, then dispatches entity vtable call at offset `+0x14` | -| `0008:beee` | `entity_run_flagged_handlers` | Executes handler calls gated by flags (`+0x16:0x400/0x4`, `+0x18:0x40/0x80`) and then dispatches via FAR thunk using entry slot/index (`+0x2`) | - -Verified xref context: -- `entity_refresh_dispatch_state` is directly called from: - - `entity_flag20_clear_and_update_target` (`0008:cb54`) - - `entity_flag20_set_and_init_target` (`0008:cb86`) - -Gameplay relevance: -- This establishes a concrete state pipeline for dispatch entries after target/link changes: flag-gated status clear -> mark refreshed (`0x4000`) -> vtable update callback -> flag-conditioned subsystem handlers. - -## Raw 0008 Flag-0x100 and Constructor-Variant Batch (new) - -Additional conservative renames from the `0008:d1a4-0008:d27d` cluster. - -| Address | Name | Evidence | -|---------|------|---------| -| `0008:d1a4` | `entity_set_flag100_in_flags2` | Gate-checked setter: ORs bit `0x100` into entry word at `+0x18` | -| `0008:d1dc` | `entity_clear_flag100_in_flags2` | Gate-checked clearer: ANDs entry word at `+0x18` with `0xFEFF` (clears bit `0x100`) | -| `0008:cefb` | `entity_dispatch_entry_ctor_vtbl_3ad2` | Constructor variant: allocates if null, reinitializes via `entity_dispatch_entry_init`, sets vtable `0x3ad2`, sets flag `0x100` at `+0x16`, and zeroes the extension words at `+0x32/+0x34` | -| `0008:d214` | `entity_dispatch_entry_ctor_vtbl_3aa6` | Constructor variant: allocates `0x40` bytes if null, reinitializes via `0008:cefb`, sets vtable to `0x3aa6`, sets flag `0x200` at `+0x16`, zeroes fields `+0x38..+0x3e` | - -Notes: -- The `entity_set_flag100_in_flags2` / `entity_clear_flag100_in_flags2` pair is a verified complementary toggle with identical gate logic (`0x39a8/0x39f9/0x3991` check path). -- Constructor naming is intentionally vtable-centric (`0x3ad2`, `0x3aa6`) until more direct gameplay semantics are recovered from their callback dispatch paths. - -## Raw 0008 Periodic/Counter Helpers (new) - -Follow-up renames from the `0008:d313-0008:d47d` cluster tied to the `0x3aa6` constructor branch. - -| Address | Name | Evidence | -|---------|------|---------| -| `0008:d313` | `entity_periodic_accumulate_and_dispatch` | Adds global delta (`0x39d0/0x39d2`) into entry accumulator (`+0x3c/+0x3e`), wraps against period (`+0x38/+0x3a`), and on wrap invokes entry vtable callback at `+0x28` with reentrancy guard bit `0x400` in `+0x18` | -| `0008:d3e6` | `entity_set_flag2000_and_update_active_counters` | Atomic (CLI/PUSHF) set of bit `0x2000` in `+0x16`; if bit `0x400` is set, decrements global counter `0x39f6` and increments `0x39f4` | -| `0008:d433` | `entity_clear_flag2000_and_update_active_counters` | Atomic clear of bit `0x2000` in `+0x16`; if bit `0x400` is set, decrements `0x39f4` and increments `0x39f6` | - -Gameplay relevance: -- This identifies a concrete periodic dispatch mechanism (accumulator+wrap callback) and a paired active/inactive counter transition path around flag `0x2000`. -- The `0x39f4/0x39f6` counter swap strongly suggests global bookkeeping for a scheduler subset associated with these entries. - -## Raw 0008 Word-List Management Batch (new) - -Verified helper cluster for entry-owned word-list storage (sentinel-terminated with `0x0408`). - -| Address | Name | Evidence | -|---------|------|---------| -| `0008:da00` | `entity_word_list_set_0408_terminated` | Rebuilds/replaces entry list from stack-provided words terminated by `0x0408`; frees prior list pointer at `+0x06/+0x08`; allocates and populates new list | -| `0008:dba3` | `entity_word_list_free_existing` | Validates list pointer exists, then frees old list buffer referenced by `+0x06/+0x08` | -| `0008:dbec` | `entity_word_list_destroy` | Resets vtable to `0x2d10`, frees list if present via `entity_word_list_free_existing`, and optionally frees object when destroy flag bit `1` is set | -| `0008:dc38` | `entity_word_list_ensure_contains` | Scans existing list for a given word; if missing, appends through `entity_word_list_append_unique` | -| `0008:dcab` | `entity_word_list_append_unique` | Allocates larger list, copies existing words, appends new word plus `0x0408` terminator, frees old list, then rebuilds via `entity_word_list_set_0408_terminated` | - -Notes: -- Entry fields used by this subsystem: count at `+0x02`, list far pointer at `+0x06/+0x08`. -- The explicit `0x0408` terminator appears both in scanner/build logic and append path, making it a reliable list format marker. - -## Raw 0008 Word-List Access/Mutation Batch (new) - -Follow-up renames extending the same list subsystem. - -| Address | Name | Evidence | -|---------|------|---------| -| `0008:deea` | `entity_word_list_get_at` | Bounds-checks index against count (`+0x02`) and returns word from list pointer (`+0x06/+0x08`, stride 2) | -| `0008:df1b` | `entity_word_list_set_at` | Bounds-checks index then writes value into list element (`+0x06/+0x08`, stride 2) | -| `0008:dfa1` | `entity_word_list_find_unflagged_by_id10` | Scans list and returns first value satisfying `(value & 0x400)==0` and `(value & 0x3ff)==requested_id`; writes `0` when not found | -| `0008:ddaf` | `entity_word_list_remove_value` | Removes matching value(s) by counting survivors, rebuilding compact storage for non-matching entries, freeing old list storage, and updating list state | - -Notes: -- `entity_word_list_find_unflagged_by_id10` implies list entries pack a 10-bit id plus flag bits (`0x400` observed). -- This further supports that the `0008:da00..dfa1` region is a compact encoded-ID list manager used by gameplay dispatch entries. - -## Raw Import Note: `0000:ffff` Thunk Target (new) - -Requested deep-dive on `FUN_0000_ffff`: - -- Renamed to `unresolved_far_thunk_dispatch`. -- Current raw-import evidence indicates this is **not valid local executable logic** in this program view: - - Decompiler emits overlapping-instruction warnings and bad-control-flow warnings. - - Disassembly from `0000:ffff` into `0001:xxxx` is nonsensical/misaligned (mixed data/code artifacts). - - The body is heavily shared as a call sink from many segments, consistent with unresolved inter-segment thunking in this import mode. - -Practical interpretation: -- Treat calls to `unresolved_far_thunk_dispatch` as unresolved external/indirect dispatch edges, not as meaningful function internals to recover in the raw flat import. -- Semantic recovery should continue from call-site argument setup and local field effects (the workflow used in recent 0008 batches). - -## Raw 0008 Gate-Callback Wrapper Batch (new) - -Conservative renames for callback wrappers sharing the same global gate condition. - -| Address | Name | Evidence | -|---------|------|---------| -| `0008:d00e` | `entity_gate_callback_wrapper_a` | Gate check on globals `0x39a8/0x39f9/0x3991`; on pass dispatches callback through unresolved thunk using entry `+0x2` and `[0x3b32:0x3b34] + 0x32` | -| `0008:d05f` | `entity_gate_callback_wrapper_b` | Same gate pattern; callback wrapper variant via unresolved thunk | -| `0008:d0b0` | `entity_gate_callback_wrapper_c` | Same gate pattern; passthrough-style callback wrapper | -| `0008:d0ed` | `entity_gate_callback_wrapper_d` | Same gate pattern; passthrough-style callback wrapper | -| `0008:d12a` | `entity_gate_callback_wrapper_e` | Same gate pattern; passthrough-style callback wrapper | -| `0008:d167` | `entity_gate_callback_wrapper_f` | Same gate pattern; passthrough-style callback wrapper | -| `0008:d3d2` | `entity_slot_callback_wrapper` | Thin wrapper: pushes entry slot/index (`+0x2`) and dispatches through unresolved thunk | - -Notes: -- Names remain wrapper-oriented because target callbacks are unresolved in this raw-import model. -- These wrappers are now easier to track from call sites while preserving conservative semantics. - -## Additional Unresolved Thunk Stubs (new) - -Follow-up thunk census after inspecting `0000:ffff` behavior. - -### Confirmed trampoline-only stubs - -All of the following are single-instruction wrappers (`CALLF 0000:ffff`) and were given unique labels: - -| Address | New Name | Observed Caller(s) | -|---------|----------|--------------------| -| `0004:2592` | `thunk_callf_0000_ffff_0004_2592` | `0004:262d` (`FUN_0004_2620`) | -| `000b:f924` | `thunk_callf_0000_ffff_000b_f924` | `000b:0144` (`FUN_000b_010b`) | -| `000c:827d` | `thunk_callf_0000_ffff_000c_827d` | `000c:8985`, `000c:8f96` (`FUN_000c_88b4`) | -| `000c:82f9` | `thunk_callf_0000_ffff_000c_82f9` | `000c:8a10`, `000c:8f79`, `000c:9052` | -| `000c:8356` | `thunk_callf_0000_ffff_000c_8356` | `000c:84a9` (`FUN_000c_84a5`) | -| `000c:e4f9` | `thunk_callf_0000_ffff_000c_e4f9` | `000c:e4f5` (`FUN_000c_e4e0`) | - -Notes: -- This confirms `unresolved_far_thunk_dispatch` is represented by multiple local trampoline copies in different segment regions. -- Separating them by address improves call-graph navigation and makes subsystem-specific tracing less ambiguous. - -## Raw 000c State-Dispatch Helper Cluster (new) - -After separating thunk stubs, a coherent local state/chain management cluster was lifted in `000c:ab32-000c:ac8f`. - -| Address | Name | Evidence | -|---------|------|---------| -| `000c:ab32` | `entity_state_tick_dispatch` | Core state tick helper using fields `+0x38/+0x39/+0x3b/+0x3d/+0x5b`; clears mode bit `0x100` when `+0x38==0`, may call cleanup helper `000c:ac55`, calls `000c:7730(state,1)`, and conditionally advances chain | -| `000c:ab96` | `entity_state_reset_and_tick_dispatch` | Reset wrapper: zeroes `+0x38` and `+0x39` then calls `entity_state_tick_dispatch` | -| `000c:abb4` | `entity_state_advance_next_or_fallback_a` | Advance path A: when `+0x49!=0`, follows node-next pointers from `+0x3b/+0x3d` using offsets `+2/+4`; when exhausted, either clears active flag and re-dispatches, or falls back to backup pointer `+0x41/+0x43` | -| `000c:ac8f` | `entity_state_advance_next_or_fallback_b` | Advance path B: same structure as A but follows alternate node offsets `+6/+8` and fallback pointer `+0x45/+0x47` | - -Notes: -- This cluster gives a concrete local interpretation for part of the large `000c:88b4` control flow without relying on unresolved thunk internals. -- Naming remains direction/path based (`a`/`b`) where high-level gameplay meaning is still pending. - -## Raw 000c State-Flag Guard / Input Handler Batch (new) - -Second sweep through `000c` adjacent helpers — gated thunk wrappers and input/animation tick handlers. - -| Address | Name | Evidence | -|---------|------|---------| -| `000c:9f74` | `entity_state_flag100_check_and_dispatch` | Init latch guard at `[0x6053]`; clears `[0x8c55]` on first call; checks `[ptr+0x5b]` bits `0x100` and `0x40`; three-path thunk dispatch | -| `000c:a1ad` | `entity_state_clear_flag40_and_dispatch` | Skips if `[ptr+0x5b]` has `0x180` bits set; if `0x40` set, clears it and calls far ptr at `[0x5e82/0x5e84]`; then dispatches twice with args `(0x0b,0x10,0x1,0x0)` (record/state-key pattern) | -| `000c:a74e` | `entity_state_dispatch_if_flag_bit2` | Tests `[ptr+0x5b]` bit `0x2`; if set pushes extra arg + ptr and dispatches via thunk | -| `000c:84c3` | `entity_state_set_byte40_at_global_ptr` | Sets byte `[DAT_0000_6828 ptr + 0x40] = 1` then calls thunk unconditionally; enables global entity flag | -| `000c:ac55` | `entity_state_fire_if_handle_valid` | Guard: fires thunk dispatch only when `[0x6054] != -1`; no-op otherwise | -| `000c:ac6d` | `entity_state_fire_with_args_if_handle_valid` | 3-arg variant: pushes `[BP+0xe]` (byte), `[BP+0xc]`, `[BP+0xa]`, handle `[0x6054]`, then `CALLF 0000:ffff` | -| `000c:afa5` | `entity_state_check_field49_and_call_vfunc3c` | Checks field `[ptr+0x49]`: −1→reset to 0 return 1; 2→call `vtable[0x3c]` return 0; else thunk dispatch | -| `000c:b153` | `entity_state_animation_done_tick` | Checks `[param_2+0x14+0xa]` animation-complete flag; if zero increments `field49` and calls `entity_state_check_field49_and_call_vfunc3c`; if set calls `vtable[0x3c]` | -| `000c:b199` | `entity_state_input_key_handler` | Full input dispatcher: ESC/x/X → `vtable[0x3c]` (cancel); Left/Right arrows `0x14b`/`0x148` → prev state; n/N/0x14d/0x150 → next state; e/E → set `field47=1`; `-` with counter → trigger at 4. Manages `field47` and `field49` | -| `000c:b2c3` | `stub_noop_000c_b2c3` | Empty stub; returns immediately | -| `000c:b2c8` | `entity_state_dispatch_if_field49_eq4` | Fires thunk only when `[ptr+0x49]==4` | -| `000c:b349` | `entity_state_dispatch_if_far_ptr_nonzero_a` | Fires thunk if far-pointer args non-zero | -| `000c:b383` | `entity_state_set_field3f_and_dispatch` | If non-NULL: writes `&DAT_0000_2d18` to `[ptr+0x3f]`, then dispatches | -| `000c:b3d8` | `entity_state_dispatch_if_far_ptr_nonzero_b` | Same null-guard pattern as `b349`, variant b | - -Patterns confirmed in this batch: -- `field49` = state-sequence index; 0=reset, 2=vtable callback, 4=triggered end -- `field47` = keystroke-combo counter -- `field3f` = linked data pointer (event/record reference) -- Global `[0x6054]` = current entity handle; `[0x6828]` = another global entity far pointer -- Bits in `[ptr+0x5b]`: `0x1=init`, `0x2=active/event`, `0x40=pending dispatch`, `0x100=flag100`, `0x180=skip-all mask` - - -## Raw 000c Palette Fade + Entity VM Cluster (new) - -Two distinct subsystems identified in `000c:cdde-000c:f98b`. - -### VGA Palette Fade (000c:cdde, 000c:ce57) -| Address | Name | Evidence | -|---------|------|---------| -| `000c:cdde` | `palette_fade_step_down` | Writes (R−offset, G−offset, B−offset) clamped to 0 to VGA I/O `0x3c8`/`0x3c9`; decrements `[0x630d]` by step `[0x6316]`; clears active at `[0x630a]` when black | -| `000c:ce57` | `palette_fade_step_up` | Same loop, adds offset, clamps at 63 (0x3f full VGA). Clears `[0x630a]` when fully bright | - -Globals used: `[0x6312]`=start index, `[0x6314]`=count, `[0x630e]`=palette src ptr, `[0x630d]`=brightness offset, `[0x6316]`=step, `[0x630a]`=active flag. - -### Entity Mini-VM / Record-Player Context (000c:f6b8-000c:f98b) -| Address | Name | Evidence | -|---------|------|---------| -| `000c:f6b8` | `record_table_get_by_index` | Bounds check `param < [0x8c88]`; return `word at [0x8c84 + param*4]`. Table at 0x8c84 | -| `000c:f6e8` | `entity_vm_stack_init_with_data` | Init stack ptrs at `[ptr+0xcc..+0xd4]` pointing to self; max depth 199; copies optional initial data | -| `000c:f772` | `entity_vm_state_copy` | Copies 200 bytes (100 words from `[src+4]` to `[dst+4]`), then copies 4 words at `+0xcc..+0xd2` | -| `000c:f7c7` | `entity_vm_stack_push_frame` | Push call-frame: saves ret offset at `[ptr+0xd4]`, decrements `[ptr+0xcc]` by param_size, zeroes new frame | -| `000c:f844` | `entity_vm_context_setup` | Calls `entity_vm_stack_init_with_data`, then sets `+0xd6..+0xe3` with position/dimension/state params | -| `000c:f600` | `entity_vm_pair_stack_push` | Push (word_a, word_b) onto 31-entry array at `[ptr+0x80]` (count); error if full | -| `000c:f63c` | `entity_vm_pair_stack_pop` | Pop and return word from pair stack; error if empty | -| `000c:f94f` | `entity_vm_counter_add` | `[ptr+0xd6] += param_2`; simple accumulator | -| `000c:f98b` | `entity_vm_set_field_da_to_global` | Writes `[param_2+0xda far-ptr + 2]` into `[0x8c94]` | - -Notes: -- Field offsets `+0xcc`=VM stack ptr, `+0xce/+0xd0`=segment regs, `+0xd2`=base, `+0xd4`=frame depth, `+0xd6`=counter, `+0xd8/+0xda/+0xdc`=VM position/bounds. -- The 200-byte body region at `[ptr+4..+0xcc]` holds 100 words of script/state payload. -- The pair-stack (field `+0x80`) is separate — likely pass/return value stack for the mini-script. - -## Raw 000c Cursor Zone / Slot Array / String Queue Batch (new) - -Three utility subsystems identified in `000c:e6d9-000c:eadd`, plus companion slot array API. - -### Cursor / Directional Zone Classifier -| Address | Name | Evidence | -|---------|------|---------| -| `000c:e6d9` | `cursor_zone_quadrant_classify` | Splits screen by `[0x63d6]/2` and `[0x63d8]/2` vs bounds `[0x8c6c..0x8c72]`; returns directional code from 9-word table at `0x6401` | - -Zone table layout (9 entries): NW/N/NE / W/Center/E / SW/S/SE based on horizontal threshold at `0x8c6c/0x8c70` and vertical at `0x8c6e/0x8c72`. - -### Slot Array System (000c:ea53-000c:ee44) -A complete 29-slot menu/choice array with fixed stride 0x15 bytes, base at `[ptr+0x67]`, count at `[ptr+0x7a]`: - -| Address | Name | Evidence | -|---------|------|---------| -| `000c:ea53` | `entity_slot_count_update_and_notify` | Sets `[ptr+0x72]=param-1`; calls `slot_array_get_current_entry` and `slot_array_find_and_dispatch`; calls `vtable[0]()` when `+0x75` flags set | -| `000c:eba5` | `slot_array_dispatch_matching` | Walks 0xb-stride array from `[ptr+4]`; calls thunk for each entry where `[entry+9]==param_4` | -| `000c:ec30` | `slot_array_dispatch_if_nonempty` | Returns `0xffff` if count < 1; else dispatches | -| `000c:ec9e` | `slot_array_find_and_dispatch` | Searches 0xb-stride array for `[entry+9]==param_4`; calls thunk on first match | -| `000c:ecf5` | `slot_array_push_entry` | Copies named string to `[base+0xc]`; writes 6 param words at `+0x12..0x20`; increments count | -| `000c:edb0` | `slot_array_push_raw` | Copies 0x15-byte raw entry from `param_2`; increments count | -| `000c:edf7` | `slot_array_pop` | Decrements `[ptr+0x7a]`; asserts `>= 0` | -| `000c:ee19` | `slot_array_init` | Sets `[ptr+0x78]=0`, `[ptr+0x76]=0`, `[ptr+0x75]=1` (active flag) | -| `000c:ee32` | `slot_array_clear_flags` | Clears `[ptr+0x74]=0`, `[ptr+0x75]=0` | -| `000c:ee44` | `slot_array_get_current_entry` | Returns `ptr + [ptr+0x7a]*0x15 + 0x67` (current entry ptr); 0 if count <= 0 | - -### String Queue -| Address | Name | Evidence | -|---------|------|---------| -| `000c:eadd` | `string_queue_push` | Appends string to 10-entry queue at `[ptr+4]`; count at `[ptr+2]`; sets `[ptr+0xd]=param_4` | - -### Additional VM-Adjacent Helpers -| Address | Name | Evidence | -|---------|------|---------| -| `000c:f2e7` | `entity_call_vtable_entry_10_if_valid` | Null-guard: calls `(*[ptr+8+0x10])()` if param_1 non-null | -| `000c:f39f` | `string_table_lookup` | Searches `[0x65bc/0x65be]` table by key string; returns matching words to out-params | - -## Raw 000c Cursor Nav Dispatcher / State Reset Batch - -Cursor navigation subsystem in `000c:d3e9–000c:db68`. Manages directional zone changes, mouse button reads, keyboard scancodes, and entity vtable dispatch for interactive UI cursors. - -### Cursor Navigation Fields (entity object offsets) -| Offset | Purpose | -|--------|---------| -| `+0x32` | Current zone code (0–8) | -| `+0x33` | Previous zone code | -| `+0x37–+0x3a` | Directional booleans: N/S/W/E | -| `+0x3f–+0x42` | Mouse button flags | -| `+0x45` | Last keyboard scancode | -| `+0x47` | Navigation index | - -Globals: `[0x63da]` = mouse button state, `[0x63d6]/[0x63d8]` = cursor X/Y, `[0x638e]` and `[0x6346]` = reference data tables. - -### Functions -| Address | Name | Evidence | -|---------|------|---------| -| `000c:dac1` | `cursor_nav_state_reset` | Zeros all directional/button flags; sets `[+0x32/+0x33]=0xff`, `[+0x47]=0xffff` | - -## Top-40 Most-Called Far-Call Targets (NE Fixup Resolution) - -Named via systematic analysis of 11,692 NE relocation fixup entries. These are the functions most frequently called through the `CALLF 0x0000:ffff` thunk mechanism. - -### Tier 1: Top 20 (73+ callers) - -| Rank | Address | Name | Calls | Description | -|------|---------|------|-------|-------------| -| 1 | `000a:44fd` | `seg091_func_00fd` | 331 | Recovered boundary. Shares init flag `0x44a4` with `runtime_init_or_abort`; thunk-heavy non-returning wrapper. | -| 2 | `0003:ac7e` | `mem_alloc` | 272 | Allocation wrapper → seg082:0000 (`0009:a200`) | -| 3 | `0008:dbec` | `entity_word_list_destroy` | 238 | Already named. Frees entity word-list buffer. | -| 4 | `0003:a751` | `mem_free` | 207 | Free wrapper → seg082:007a (`0009:a27a` = `mem_free_checked`) | -| 5 | `0008:bb4f` | `mem_alloc_far` | 174 | Thin wrapper → `mem_alloc` | -| 6 | `0003:a897` | `far_memcpy` | 165 | REP MOVSW + trailing MOVSB | -| 7 | `0005:088f` | `entity_get_type_word` | 130 | Returns type word from table 0x7df9 indexed by slot | -| 8 | `000b:358d` | `sprite_tree_accumulate_pos` | 122 | Recursively sums X/Y offsets (+0x21/+0x23) through linked child nodes (+0x19/+0x1b), copies 8-byte position block via far_memcpy | -| 9 | `0008:ce3d` | `entity_call_two_vtables` | 118 | Calls vtable[+4] at entity+0x1e and +0x28 | -| 10 | `0004:26cd` | `nop_void_stub` | 118 | Empty function, returns void | -| 11 | `0008:ce00` | `entity_call_two_vtables_base` | 117 | Calls vtable[0] at entity+0x1e and +0x28 | -| 12 | `0008:bb8c` | `entity_check_flag_0x4000` | 115 | Short-circuits if flag 0x4000 set at +0x16 | -| 13 | `0008:cda7` | `entity_free_both_word_lists` | 115 | Frees word lists at entity+0x1e and +0x28 if optional pointers at +0x24/+0x26 and +0x2e/+0x30 non-null. Both call `entity_word_list_free_existing`. | -| 14 | `0004:26d2` | `nop_void_stub_b` | 111 | Empty function, returns void | -| 15 | `000a:45fe` | `runtime_init_or_abort` | 108 | Reentrancy-guarded init. Flag at 0x44a4; flushes via FUN_000a_4a56, then calls `crt_exit_wrapper(1)`. Hidden code gap 0x4616-0x4643. | -| 16 | `0004:3324` | `nop_return_zero` | 95 | Returns 0 | -| 17 | `0009:c563` | `event_queue_push` | 82 | Circular buffer enqueue. Ring index (+0xe) masked 0x3f, slot masked 0xfff8. Writes event type word + data byte pair. | -| 18 | `0005:c448` | `list_remove_and_free` | 74 | Unlinks node from linked list via FUN_0005_c495, optionally calls `mem_free` if bit 0 of flags set | -| 19 | `000b:2e00` | *(no function in Ghidra)* | 74 | Analysis gap at seg109:0000. Needs manual function creation. | -| 20 | `0009:1f12` | `dos_file_lseek` | 73 | DOS LSEEK (INT 21h AH=42h) wrapper with error reporting to 0x867a | - -### Tier 2: Ranks 21-40 (56-73 callers) - -| Rank | Address | Name | Calls | Description | -|------|---------|------|-------|-------------| -| 21 | `0009:3600` | `rotating_buffer_advance` | 73 | Advances 5-slot circular counter at 0x3eb6, zeros pointer in table at 0x867c, dispatches via jump table | -| 22 | `0009:943a` | `entity_rect_compare_and_dispatch` | 68 | Compares bounding rectangles of two entities, dispatches based on flag bits 4/2/1 at +0x16 | -| 23 | `0009:1e61` | `dos_file_close` | 65 | DOS file close (INT 21h), error reporting, sets handle to -1 | -| 24 | `0005:e252` | *(unnamed — unclear)* | 65 | Copies 11 words from Phar Lap extender area (FUN_0000_12c6+5), then calls thunk. Interrupt/trampoline setup? | -| 25 | `0003:dbcc` | `crt_format_string` | 64 | MetaWare High C formatting wrapper. Calls FUN_0003_bb92 with runtime format dispatch table. | -| 26 | `0007:5a00` | *(no function in Ghidra)* | 64 | High-traffic raw target at `seg043:0000`. Earlier `debris_spawn` / seg001 mapping was rejected after checking relocation labels. Still needs manual function creation and direct analysis. | -| 27 | `000a:4742` | `assert_buffer_valid` | 63 | Validates handle: asserts param_2 == cookie at 0x45a6 and param_1 < limit at 0x87e0 | -| 28 | `0009:9216` | `entity_conditional_render_dispatch` | 63 | Checks entity flag bits 4 and 1 at +0x16, dispatches to vtable[+0xc] or thunk | -| 29 | `0008:cb2c` | `entity_flag20_clear_and_update_target` | 61 | *(already named)* Clears flag bit 0x20, writes target +0x12/+0x14, calls refresh | -| 30 | `0008:cb5c` | `entity_flag20_set_and_init_target` | 61 | *(already named)* Sets flag bit 0x20, inits target if zero, calls refresh | -| 31 | `0007:7306` | `entity_create_stack_object` | 58 | Allocates 0xCC bytes on stack, inits via `object_init_zero_fields` (0005:c400), calls thunk | -| 32 | `0007:8709` | `entity_mark_dirty_and_sync_tile_aux` | 58 | *(already named)* Syncs tile aux, sets flag bit 0x04 at +0x42 | -| 33 | `0007:87c5` | `entity_set_flag20_from_field42` | 58 | Reads entity+0x42/+0x44, calls `entity_flag20_set_and_init_target` with those values | -| 34 | `0007:8508` | `entity_table_lookup_and_dispatch` | 58 | *(already named)* Searches table at 0x2b46, dispatches via indirect jump | -| 35 | `0007:8920` | `entity_call_vtable_slot0c` | 58 | *(already named)* Calls vtable entry at +0x0c | -| 36 | `000a:b988` | `sprite_node_get_or_traverse` | 57 | If child pointer at +0x19/+0x1b non-null, traverses; otherwise returns leaf value | -| 37 | `0003:a98b` | `crt_signed_div32` | 56 | Entry: adjusts near→far stack, sets CX=0 (signed quotient), jumps to `crt_div32_impl` | -| 38 | `000a:7b44` | `nop_return_void_a` | 56 | Empty function (default vtable slot?) | -| 39 | `000a:7b49` | `nop_return_void_b` | 56 | Empty function (default vtable slot?) | -| 40 | `000a:7b53` | `nop_return_void_c` | 56 | Empty function (default vtable slot?) | - -### Supporting Functions Discovered - -| Address | Name | Description | -|---------|------|-------------| -| `000b:3a00` | `sprite_tree_sum_x_offset` | Recursive: sums field +0x21 through child chain +0x19/+0x1b | -| `000b:3a35` | `sprite_tree_sum_y_offset` | Recursive: sums field +0x23 through child chain +0x19/+0x1b | -| `0003:a845` | `crt_exit_wrapper` | Calls `crt_exit_impl(param,0,0)` | -| `0003:a7ee` | `crt_exit_impl` | Full C exit: atexit handlers, stdio flush, MetaWare runtime cleanup | -| `0003:a9a8` | `crt_div32_impl` | 32-bit division core. CX flags: bit0=unsigned, bit1=modulo, bit2=negate | -| `0005:c400` | `object_init_zero_fields` | Zeros fields +0x25, +0x29, +0x31, +0x32 of a struct. Returns pointer. | -| `000a:4440` | `joystick_read_axes_and_buttons` | Reads PC game port 0x201. Times axis responses, reads button nibble to 0x44a2 | -| `000b:3380` | `sprite_node_is_dirty` | Checks flags at obj+0x29 & 3 == 1 or 3 → returns bool | -| `000b:33a6` | `sprite_node_mark_dirty` | If not dirty, calls FUN_000b_3965 with mode=3 to invalidate | - -### Tier 3: Ranks 41-60 (42-56 callers) - -| Rank | Address | Name | Calls | Description | -|------|---------|------|-------|-------------| -| 41 | `000a:7b58` | `nop_return_zero_b` | 56 | Returns 0 (default vtable slot) | -| 42 | `000b:3ab2` | `sprite_node_dispatch_event` | 56 | Large event dispatch: checks event type (2/4/8/0x100), updates global focus ptr at [0x4fd0:4fd2], dispatches via vtable methods [+0x14/+0x18/+0x20/+0x24] by event code. Switch table for 16 event types. | -| 43 | `000a:48ff` | `rng_next_modulo` | 55 | Advances seg091 RNG state and returns the result modulo the requested bound; returns 0 when bound is 0. | -| 44 | `000b:3362` | `sprite_tree_unwind_check` | 55 | Validates SS == param_2 (stack segment guard), then decrements global counter at [0x4fd6] | -| 45 | `000b:40ee` | `sprite_node_update_and_dispatch` | 55 | If `sprite_node_is_dirty` returns false: marks dirty, calcs accumulated bounds via `sprite_tree_get_accumulated_bounds` (3ed8), then dispatches via thunk | -| 46 | `000a:7b5f` | `vtable_stub_trampoline` | 55 | Calls through fixup thunk (forwarder to another function) | -| 47 | `000a:7b78` | `nop_return_void_e` | 55 | Empty function (default vtable slot) | -| 48 | `000a:7b7d` | `nop_return_void_f` | 55 | Empty function (default vtable slot) | -| 49 | `000a:7b4e` | `nop_return_void_d` | 54 | Empty function (default vtable slot) | -| 50 | `000b:330c` | `sprite_tree_dispatch_wrapper` | 52 | Pure thunk wrapper: calls through fixup | -| 51 | `0009:2034` | `dos_file_seek` | 51 | INT 21h AH=42h (LSEEK). Takes file object ptr, extracts handle at obj+4, seeks to offset param. Error reporting to [0x867a]. | -| 52 | `0005:0466` | `entity_resolve_slot_ptr` | 50 | *(already named)* | -| 53 | `0003:a880` | *(no function in Ghidra)* | 49 | Analysis gap in CRT segment | -| 54 | `0006:170c` | `tile_class_get_byte` | 47 | Looks up class data: indexes into table at [0x7e1e] by (*param_1 * 0x79), returns byte at offset +0xc | -| 55 | `000b:4097` | `sprite_dispatch_with_event` | 45 | Pushes event params + global [0x49c2:0x49c4], calls thunk | -| 56 | `0005:02c1` | `entity_is_type_match` | 43 | Compares *param_1 against global at [0x27c8], returns 1 if equal, 0 otherwise | -| 57 | `0003:ad75` | *(no function in Ghidra)* | 43 | Analysis gap in CRT segment | -| 58 | `000a:e709` | `render_dispatch_by_flag` | 43 | Dispatches between two thunk paths based on boolean flag at stack+0x10 | -| 59 | `0003:d0ff` | `crt_sprintf_wrapper` | 42 | Calls FUN_0003_bb92 (format engine) with rearranged params and string constant at 0x67ac | -| 60 | `000b:326e` | `sprite_node_destroy` | 42 | Destructor: sets vtable ptr to 0x501a, clears global [0x4fd0:4fd2] if self, releases child nodes, calls mem_free via thunk | - -### Updated Analysis Gaps - -`0007:5a00` / `0007:5b6f` reconciliation: -- The earlier standalone seg001 port hypothesis in this subrange was wrong. -- Relocation data places raw `0007:5a00` at `seg043:0000`, and the already-named helper at `0007:5b6f` sits at `seg043:016f`. -- Because of that segment placement, standalone seg001 names such as `debris_spawn` (`0x7490`) and `entity_die` (`0x75ff`) should NOT be ported into this raw range. -- `0007:5b6f` no longer exists as a function after the PyGhidra repair pass. Its old raw-analysis behavior now lines up with the repaired function `0007:5b7a = entity_set_at_target_update_facing`, so `0007:5b6f` should be treated only as an internal control-flow location inside that function. -- Additional resolved call targets inside the missing seg043 block were annotated in Ghidra from relocation data: - - `0007:5a8a` -> `entity_set_event_type_checked` - - `0007:5a98` -> `FUN_0008_cc01` (timer-related flag/event helper; tests `+0x16 & 0x2`, sets `+0x16 |= 0x800`, copies event field `+0x06` to `+0x22`, checks `0x1000`, then conditionally dispatches) - - `0007:5b36` -> `entity_get_type_word` - - `0007:5b44` -> `saveslot_read_entry_flags` - - `0007:5bb8` -> `entity_is_type_match` - - `0007:5c49` -> `entity_class_get_flag20` - - `0007:5c8b` -> `mem_alloc_far` -- Current boundary state: - - The seg043 split has now been repaired in Ghidra. Verified temporary functions exist at raw `0007:5a90`, `0007:5b7a`, and `0007:5c1c`. - - The repaired middle function at `0007:5b7a` has now been promoted from a positional label to `entity_set_at_target_update_facing` based on direct decompile/disassembly behavior. - - The remaining repaired functions at `0007:5a90` and `0007:5c1c` should keep their positional names until a later pass resolves the thunk-heavy bodies more clearly. - - The next pass on this region should continue re-decompiling `seg043_func_0090` and `seg043_func_021c`, resolve the still-unknown far thunks they call, and replace the positional names only when their behavior is directly supported. - -| Address | NE Segment | Callers | Notes | -|---------|-----------|---------|-------| -| `000a:44fd` | seg091:00fd | 331 | Recovered as `seg091_func_00fd`; thunk-heavy init wrapper sharing flag `0x44a4`. | -| `000b:2e00` | seg109:0000 | 74 | Start of segment 109. | -| `0007:5a00` | seg043:0000 | 64 | Start of segment 43. Earlier seg001 `debris_spawn` port was rejected; still needs manual function creation and direct analysis. | -| `000a:48ff` | seg091:04ff | 55 | Recovered as `rng_next_modulo`; bounded wrapper around seg091 RNG state advance. | -| `0003:a880` | seg005:0880 | 49 | In CRT segment near `far_memcpy`. | -| `0003:ad75` | seg005:0d75 | 43 | In CRT segment near `mem_alloc`. | -| `000a:454d` | seg091:014d | 32 | Recovered as `seg091_func_014d`; init/context helper using the `0x45a6` cookie/context global. | - -### Tier 4: Ranks 61-80 (29-42 callers) - -| Rank | Address | Name | Calls | Description | -|------|---------|------|-------|-------------| -| 61 | `000b:30a5` | `sprite_tree_forward_wrapper` | 42 | Pure thunk forwarder | -| 62 | `0008:bc27` | `entity_set_event_type_checked` | 41 | *(pre-existing name)* Sets event code at +0x06 with range/timer checks | -| 63 | `0008:d214` | `entity_dispatch_entry_ctor_vtbl_3aa6` | 40 | *(pre-existing name)* Constructor: alloc 0x40, vtbl 3AA6, flag 0x200 | -| 64 | `0005:1565` | `entity_action_by_type_dispatch` | 39 | Checks entity type against whitelist (0x432,0x5a0,0x1fd,0x1fe,0x8f,0x59f,0x2b3,0x2ca), dispatches by flags at [0xc76] and [0x85f] | -| 65 | `0008:4bba` | `channel_slot_enable` | 39 | Sets enable byte=1 in 5-slot table at 0x84ca (slot * 0xd stride) | -| 66 | `0009:6f5a` | `vga_palette_write` | 38 | Writes RGB triplets to VGA DAC (port 0x3C8/0x3C9). Range param_2..param_3 from palette data at *param_1 | -| 67 | `0009:8ef6` | `line_draw_dispatch` | 38 | Compares abs(dx) vs abs(dy) to determine major axis, dispatches to appropriate line draw routine | -| 68 | `000a:7b30` | `nop_return_void_g` | 38 | Empty function (default vtable slot) | -| 69 | `000a:7b3f` | `nop_return_void_h` | 38 | Empty function (default vtable slot) | -| 70 | `0009:6e7f` | `palette_free_if_set` | 35 | Frees existing palette data if ptr non-null, checks alignment | -| 71 | `000a:7b35` | `nop_return_void_i` | 35 | Empty function (default vtable slot) | -| 72 | `0009:c433` | `event_queue_align_index` | 34 | Returns `param_1 & 0xFFF8` — aligns ring index to 8-byte event slot boundary | -| 73 | `0009:2156` | `dos_file_get_size` | 33 | Saves file position, does INT 21h AH=42h AL=02 (seek to end), restores position. Returns file size in DX:AX | -| 74 | `000a:2c41` | `list_iterate_next` | 33 | Linked list iterator: if *out==0 returns first from obj+2; else follows next at ptr+2/+4. Returns bool (has more) | -| 75 | `000a:454d` | `seg091_func_014d` | 32 | Recovered boundary. Shares flag `0x44a4`; checks optional long argument against the `0x45a6` cookie/context global. | -| 76 | `000b:2446` | `sprite_clear_redraw_flag` | 31 | Clears flag at obj+0x17e, then dispatches via thunk | -| 77 | `0005:1238` | `entity_get_class_word` | 30 | Looks up table at [0x7e01] indexed by *param_1 * 2, returns word. Sister of `entity_get_type_word` (which uses [0x7df9]) | -| 78 | `000b:1446` | `display_null_check_dispatch` | 30 | Null-checks far ptr params, dispatches to different thunks based on result | -| 79 | `000d:85da` | `map_object_set_dirty_flag` | 29 | Sets byte at global_obj[0x6828]+0x40 = 1 if global non-null, then calls thunk | -| 80 | `0005:1511` | `entity_destroy_trampoline` | 29 | Pure thunk forwarder to entity destruction | - ---- - -## Deep Analysis: Coordinate Transform System - -### `world_to_screen_coords` at `0004:e7bd` (NE seg018:07bd) - -**Signature:** -```c -void world_to_screen_coords(int world_x, int world_y, int *screen_x, int *screen_y) -``` - -**Isometric Projection Math:** -``` -screen_x = (world_x - world_y) / 2 - camera_x // SAR 1 (signed divide) -screen_y = (world_x + world_y) / 4 - camera_y // SHR 2 (unsigned divide) -``` - -Camera globals: `g_scroll_offset_x` (DS:0x2bb7), `g_scroll_offset_y` (DS:0x2bb9). - -**Assembly detail:** -- `SAR AX, 1` for screen_x — signed arithmetic shift preserves sign for negative (world_x - world_y) differences -- `SHR AX, 2` for screen_y — unsigned logical shift (sum world_x + world_y is always positive) -- The 2:1 ratio (÷2 for X, ÷4 for Y) produces the classic 2:1 isometric diamond tile shape - -**Coordinate axes on screen:** -- World X axis → lower-right on screen (+0.5 screen_x, +0.25 screen_y per world unit) -- World Y axis → lower-left on screen (-0.5 screen_x, +0.25 screen_y per world unit) -- Camera subtraction converts absolute world-space to viewport-relative screen coordinates - -**Callers (17 across 8 NE segments):** - -| Call site | NE Segment | Context | -|-----------|-----------|---------| -| `0004:7d6f` | seg012 | Map/tile rendering | -| `0005:0305` | seg021 | Entity system | -| `0005:432f` | seg021 | Entity placement | -| `0005:4457` | seg021 | Entity placement | -| `0005:6f8f` | seg022 | Entity rendering | -| `0005:7263` | seg022 | Entity rendering | -| `0007:2262` | seg040 | `snap_entity_to_ground` — ground alignment | -| `0007:237d` | seg040 | Ground snap dispatch | -| `0007:cf4e` | seg049 | Entity positioning | -| `0007:d039` | seg049 | Entity positioning | -| `0007:d43f` | seg049 | Entity positioning | -| `0007:d6fe` | seg049 | Entity positioning | -| `0008:3223` | seg053 | Entity-to-screen render setup | -| `0008:32e7` | seg053 | Entity-to-screen render setup | -| `0008:334b` | seg053 | Entity-to-screen render setup | -| `000b:858b` | seg115 | Sprite system | -| `000b:f100` | seg120 | Sprite system | - -**Entity struct layout (from seg053 caller at `0008:31f6`):** -``` -entity_array_base = far ptr at [DS:0x2cff] -entity_struct_size = 19 bytes (0x13) -entity.world_x = offset +0x0a (word) -entity.world_y = offset +0x0c (word) -``` - -### Comparison: Two Coordinate Transform Functions - -| Property | `world_to_screen_coords` (0004:e7bd) | `world_to_screen_isometric` (0007:be67) | -|----------|---------------------------------------|----------------------------------------| -| Input type | Fine-grained world units (entity positions) | Coarse tile-grid units (map rendering) | -| screen_x | `(wx - wy) / 2 - cam_x` | `(wx + sx) + (wy + sy) * 2` | -| screen_y | `(wx + wy) / 4 - cam_y` | `(wy + sy) * 2 - (wx + sx)` | -| Camera handling | Subtracted after transform | Added before transform | -| Operations | Division (SAR/SHR) | Multiplication (SHL) | -| Aspect ratio | 2:1 (from /2 : /4) | 2:1 (from 1 : 2 multipliers) | - -Both functions implement the same 2:1 isometric projection but at different coordinate scales. `world_to_screen_coords` divides down from fine world units while `world_to_screen_isometric` multiplies up from coarse tile units. - -### Adjacent Function: `map_position_equal` at `0004:e784` - -Compares two 5-byte `map_position` structs: `{ x:word, y:word, layer:byte }`. Returns 1 (AL) if all three fields match, 0 otherwise. Located immediately before `world_to_screen_coords` in seg018. - ---- - -### Tier 5: Ranks 81-100 (25-29 callers) - -| Rank | Address | Name | Calls | Description | -|------|---------|------|-------|-------------| -| 81 | `0009:1c00` | `dos_file_handle_init` | 29 | Inits 6-byte file handle struct: dword=0, word+4=0xFFFF (invalid). Aborts on null ptr | -| 82 | `0008:75f3` | `entity_get_ptr` | 29 | *(pre-existing)* Looks up entity far ptr from table at DS:0x39b0, indexed by id*4 | -| 83 | `0006:0208` | `entity_class_get_flag4` | 29 | Returns bit 2 of classinfo byte at [0x7e1e]+*p1*0x79+0x13 → 0 or 1 | -| 84 | `000a:30d7` | `list_node_set_if_context` | 29 | Sets node fields +2/+4 if params match context globals at 0x45a6/0x45a8 | -| 85 | `0009:c45f` | `object_init_and_get_next` | 29 | Calls `object_init_zero_fields` then returns *(result+2) — init+accessor combo | -| 86 | `0004:d7a0` | `object_deref_get_word4` | 28 | Dereferences far ptr chain: returns word at *(*(param_1)+4) | -| 87 | `000a:5276` | `debug_check_flag_45aa` | 28 | If byte at DS:0x45aa non-zero, calls thunk (diagnostic/assert check) | -| 88 | `0003:d94f` | `far_memset` | 28 | Wrapper reordering params for CRT memset impl at 0003:d92b (odd-aligned, word-fill loop) | -| 89 | `000a:7b3a` | `nop_return_void_j` | 28 | Empty function (default vtable slot) | -| 90 | `0008:ca18` | `entity_pair_sync_b` | 27 | *(pre-existing)* Pairwise sync wrapper direction B | -| 91 | `0008:bd20` | `entity_sprite_set_target_pos` | 27 | *(pre-existing)* Sets flag 0x1000, copies player pos to entity +0x0a/+0x0c | -| 92 | `0009:3ceb` | `buffer_release_and_dispatch` | 27 | Frees far ptr at obj+0x3b if set, nulls it; conditionally dispatches on bit 0 | -| 93 | `0005:09b4` | `entity_get_flags_byte` | 27 | Reads byte from [0x7dfd]+id, conditionally extends with classinfo byte at [0x7e1e]+id*0x79+0xf | -| 94 | `0005:0fbb` | `entity_lookup_sprite_word` | 27 | Returns word from [0x7e05]+*p1*2 — sprite/visual index table | -| 95 | `0008:d27e` | `entity_dispatch_trampoline_b` | 26 | Pure forwarder thunk (CALLF thunk only) | -| 96 | `0005:0376` | `entity_resolve_base_type` | 26 | Walks entity class hierarchy (bit 8 in [0x7e01]) via [0x7ded], returns base type from [0x7df1] | -| 97 | `000b:2492` | `sprite_redraw_if_needed` | 26 | If redraw flag at +0x17e is clear, calls update routine + thunk | -| 98 | `0003:e4d3` | `dos_file_open_wrapper` | 26 | Zeros output byte, delegates to file open impl at 0003:bb92 | -| 99 | `0005:033e` | `entity_resolve_base_parent` | 25 | Same hierarchy walk as `entity_resolve_base_type` but returns parent from [0x7ded] | -| 100 | `000a:87fd` | `render_clip_rect_to_viewport` | 25 | Clips 4 rect params to viewport bounds at [0x4014], sets dirty flag at 0x8a16, increments draw counter at 0x4716 | -| 101 | `0005:3cf5` | `entity_class_has_flag2000` | 25 | Returns `(entity_get_class_word(slot) & 0x2000) != 0` | -| 102 | `0009:80db` | `bbox_overlap_test` | 25 | Boolean rectangle overlap test for two 4-word bbox structs; unlike `bbox_intersect`, it does not write back an intersection | -| 103 | `000d:cc00` | `entity_compute_proximity_or_visibility_bucket` | 25 | Returns `0x40` if entity is null or projected bbox overlaps viewport; otherwise buckets world-distance from current reference entity (`0x7e22`) into `0x32/0x20/0x10/0x08` | -| 104 | `000d:d413` | `entity_refresh_recent_proximity_or_visibility_buckets` | 24 | Recomputes bucket values for the last four active entries in `0x69ac` and notifies backing handles via `000a:6343` when a bucket changes | - -## Raw 000d Proximity/Visibility Bucket Cluster (new) - -Small conservative rename batch from the `000d:cc00-d413` region after the far-call repair exposed the viewport helper in live decompilation. - -| Address | Name | Evidence | -|---------|------|---------| -| `000d:cc00` | `entity_compute_proximity_or_visibility_bucket` | Returns bucket `0x40` for null or on-screen entities (`entity_projected_bbox_overlaps_viewport`), else computes a distance bucket from the current reference entity at `0x7e22` with thresholds `0x17d`, `0x281`, `0x3c1` mapping to `0x32`, `0x20`, `0x10`, `0x08` | -| `000d:d413` | `entity_refresh_recent_proximity_or_visibility_buckets` | Walks the last four active records in the `0x69ac` array, recomputes the same bucket, stores it back to each entry, and calls `000a:6343` when the bucket changes | -| `000d:cdd0` | `tracked_entity_bucket_prune_invalid_entries` | Walks the `0x69ac` array, validates backing handles through `000a:637a`, and clears entry handles to `0xffff` when the backing object is gone | -| `000d:cd62` | `tracked_entity_bucket_find_free_main_slot` | Finds the first free entry in the main portion of the `0x69ac` array (`0 .. count-4`) | -| `000d:cd9a` | `tracked_entity_bucket_find_free_aux_slot` | Finds the first free entry in the auxiliary tail portion of the `0x69ac` array (`count-4 .. count-1`) | - -Supporting caller notes: -- `000d:ce1e` populates one `0x69ac` entry by reserving a free slot, computing the initial bucket through `entity_compute_proximity_or_visibility_bucket`, storing both current and previous bucket fields, then allocating/linking the backing handle through `000a:5f36`. -- `000d:d409` is a thin wrapper that only calls `entity_refresh_recent_proximity_or_visibility_buckets`. -- `000d:cfad` is an update-or-allocate helper for `(param_1,param_2)` pairs: it tries to update an existing tracked entry through `000a:606a`, clears dead entries, and falls back to `000d:ce1e` allocation when no live match remains. -- `000d:cec5` is the auxiliary-slot allocator: it prunes invalid entries, uses `tracked_entity_bucket_find_free_aux_slot`, tags the new entry with byte `+0x0a = 1`, and seeds its handle via `000a:5f36(..., flag=1)`. -- `000a:606a` = `tracked_entity_bucket_handle_update_or_alloc` — updates the backing handle for an existing tracked bucket entry when possible, or falls back to allocation via `000a:5f36` if the handle has gone stale. -- `000d:d350` = `tracked_entity_bucket_set_value` — finds a tracked `(entity_id, entity_ref)` entry in `0x69ac` and pushes a new bucket value into its backing handle through `000a:6343`. -- `000d:d10b` = `tracked_entity_bucket_clear_ref_field` — clears only the `+0x02` reference field for all matching entries. -- `000d:d151` = `tracked_entity_bucket_remove_by_ref` — marks matching entries' backing handles for removal and clears the local entry handle/reference fields. -- `000d:d1b1` = `tracked_entity_bucket_remove_tagged_by_ref` — same removal path, but only for entries whose byte `+0x0a` tag is set. - -## Raw 000a Tracked-Handle Table (new) - -The `0x4673` table now reads as the backing handle registry for the `0x69ac` tracked-entry bucket subsystem. -That client layer sits on top of a separate generic cache manager rooted at `0x4688..0x46b7`, so the current `tracked_entity_*` names should be read as client-side structure names rather than names for the cache internals themselves. - -| Address | Name | Evidence | -|---------|------|---------| -| `000a:5f02` | `tracked_entity_handle_find_slot` | Linear scan over 12 entries in the `0x4673` table for a matching 32-bit handle id | -| `000a:602b` | `tracked_entity_handle_is_live` | Returns true only when a handle exists in `0x4673` and its flag word at `+0x0a` does not have bit `0x0002` set | -| `000a:60eb` | `tracked_entity_handle_mark_remove` | Sets bit `0x0002` in the handle-table flag word and dispatches through the unresolved cleanup path | -| `000a:612e` | `tracked_entity_handle_mark_remove_all` | Iterates all 12 handle-table entries and marks each live handle for removal | -| `000a:6167` | `tracked_entity_handle_alloc_slot` | Allocates a slot in one of two ranges (`0..7` or `8..11`) depending on the aux flag; when full, wraps in a ring and evicts via `tracked_entity_handle_mark_remove` before reusing the slot | -| `000a:6228` | `tracked_entity_handle_prune_removed` | Reaps entries previously marked with bit `0x0002`, clears dead slots, and refreshes high-index entries through `000a:6b2d` | -| `000a:63bc` | `tracked_entity_handle_find_by_entity` | Finds the first live handle-table entry whose key/entity word at `+0x04` matches the requested entity id | - -Current structural read of one `0x4673` entry (stride `0x0c`): -- `+0x00` = 32-bit handle id -- `+0x04` = key/entity id -- `+0x06` = class/group/source-style selector passed in from tracked-entry allocation -- `+0x08` = current bucket/value -- `+0x0a` = flags (`bit0` set by aux-slot allocation, `bit1` = pending removal) - -Thin public wrappers on top of the tracked-handle client layer: -- `000a:5276` = `entity_bucket_track_default_main` — gated by `0x45aa`; creates or refreshes a main-slot tracked handle with bucket `0x40` and selector `0xff`. -- `000a:5294` = `entity_bucket_track_main` — same path, but takes the bucket value as an argument for the main-slot range. -- `000a:52d0` = `entity_bucket_track_default_aux` — aux-slot variant with default bucket `0x40`. -- `000a:52ee` = `entity_bucket_track_aux` — aux-slot variant with explicit bucket argument. - -## Raw 000a Generic Cache Manager (new) - -Follow-up analysis of `000a:6b2d` and the `0x4688..0x46b7` globals shows that this region is a generic cache manager used by the tracked-handle layer, not part of the tracked-entity subsystem itself. - -| Address | Name | Evidence | -|---------|------|---------| -| `000a:6b2d` | `cache_lookup_or_load_entry_by_id` | Fast-paths the last id via `0x46af/0x46b1`, otherwise searches `0x469d`, evicts older cache slots until there is room under byte budget `0x46a5`, allocates a block from the free-list, clears/initializes the payload, records the id, and dispatches through the loader interface at `0x468c` | -| `000a:6a95` | `cache_release_entry_by_slot` | Releases a cached slot by index, clears any client references through `000a:62d8`, frees its backing block through `cache_free_block_by_slot`, and marks the slot id in `0x469d` as unused (`0xffff`) | -| `000a:6d07` | `cache_alloc_block_for_slot` | Allocates or splits a block from the free-list anchored at `0x4688`, tags it with the owning cache slot index, and updates the in-use byte count at `0x46a9` | -| `000a:6f4d` | `cache_free_block_by_slot` | Finds the free-list node for a cache slot, marks it free, subtracts its size from `0x46a9`, and coalesces adjacent free blocks | -| `000a:67d9` | `cache_shutdown` | Tears down the generic cache manager: flushes/reset state, frees slot arrays at `0x4699/0x469d/0x46b3`, frees the free-list container at `0x4688`, and closes backing state at `0x4691` | -| `000a:6898` | `cache_set_loader_interface` | Installs the backend loader/callback interface pointer at `0x468c` | - -Current structural read of the cache globals: -- `0x4688` = intrusive free-list / block-list head used by `cache_alloc_block_for_slot` and `cache_free_block_by_slot` -- `0x468c` = backend loader interface / callback table; `+0x34` returns the payload size for an id and `+0x0c` loads or binds a block after allocation -- `0x4695` = base pointer for the raw cache payload arena -- `0x4699` = per-slot payload-pointer table -- `0x469d` = per-slot cached id table (`0xffff` = unused) -- `0x46a5` = cache byte budget / arena capacity -- `0x46a9` = current bytes in use -- `0x46af` / `0x46b1` = one-entry fast-path cache of the last requested id and slot index -- `0x46b3` = per-slot block metadata pointer mirror used when releasing or refreshing slots - -### Follow-up: caller resolution for the public bucket wrappers - -- `0005:3b34` = `tracked_entity_bucket_alloc_main_if_enabled` and `0005:3b53` = `tracked_entity_bucket_alloc_aux_if_enabled`; these are the two thin gate wrappers that feed the `0x69ac` tracked-entry layer. -- `0005:3b72` = `tracked_entity_bucket_remove_by_entity_and_ref_if_enabled`, which forwards into `000d:d086 = tracked_entity_bucket_remove_by_entity_and_ref` when `0x45aa` is set. -- `0006:d404` is not a standalone function entry; it is the tail call inside the unnamed destructor block immediately before `0006:d414`. That block tears down a `0x2774` dispatch-entry object, pushes `(entity_id = 0xdb, entity_ref = *0x7e22)`, and removes the matching aux tracked bucket entry. -- `0006:d5ae` is the analogous tail call immediately before `0006:d5be`. It tears down the sibling `0x2750` dispatch-entry object, pushes `(entity_id = 0xa4, entity_ref = *0x7e22)`, and removes the matching aux tracked bucket entry. -- The matching constructor sides are `0006:d370` and `0006:d51a`: both allocate/init a dispatch entry, stamp source type `8`, seed a per-object field from the current reference entity at `0x7e22`, and then call `tracked_entity_bucket_alloc_aux_if_enabled`. -- `0007:cce8` is the tail call at the end of `scroll_camera_set_state_params`. After the camera scroll state is updated and the new screen-space origin is committed to `0x2bb7/0x2bb9`, it refreshes the recent proximity/visibility buckets through `000d:d409` when `0x45aa` is enabled. - -### Follow-up: `0x45aa` gate and cache loader installation - -- `0x45aa` now reads as `tracked_entity_bucket_system_enabled`, not a one-off debug/test flag. It gates all three public wrapper helpers above and the camera-side refresh in `scroll_camera_set_state_params`. -- The enable bit is set only by the unlabeled init block around `000a:51d0..5222`: that code stores the incoming backend/interface pointer into `0x45ab/0x45ad`, installs it into `0x468c` via `cache_set_loader_interface`, allocates the tracked-handle table (`000a:5e00`) and the 32-entry bucket array (`000d:cca3(0x20)`), then sets `0x45aa = 1`. -- The matching unlabeled shutdown block starts at `000a:5223`: it checks `0x45aa`, tears down the tracked-handle table through `000a:5e59`, frees the bucket array through `000d:ccec`, and only then clears/uses the backend pointer state at `0x45ab`. -- `0x468c` remains best named as a generic `cache_loader_interface`: the current verified evidence is a cache backend callback table (`+0x34` = size query, `+0x0c` = load/bind callback) shared by the tracked-entry service. The newly traced gameplay callers prove this service participates in camera/entity-interest updates, but they are not yet strong enough to justify an audio-specific or resource-specific subsystem rename. - -### Follow-up: init/shutdown entry points around `000a:51xx` - -- `000a:5186` = `tracked_entity_bucket_system_init`. -- `000a:538e` = `tracked_entity_bucket_system_init_if_configured`; it only calls the init routine when config/feature gate `0x89f4` is non-zero. -- `000a:5223` = `tracked_entity_bucket_system_shutdown`. -- `0x45ab/0x45ad` now read as `tracked_entity_bucket_backend_object`, a cached backend/interface object pointer used by init/shutdown in addition to the lower-level `cache_loader_interface` callback table at `0x468c`. -- `tracked_entity_bucket_system_init` first allocates a rotating buffer via `0009:3600`, lazily creates `tracked_entity_bucket_backend_object` through `0009:5600` when absent, installs that object into `cache_loader_interface`, allocates the tracked handle table via the missing function entry at `000a:5e00`, allocates the 32-entry `0x69ac` bucket array via `000d:cca3(0x20)`, then sets `tracked_entity_bucket_system_enabled`. -- `tracked_entity_bucket_system_shutdown` is called from the wider engine teardown routine at `0004:621b`; it tears down the tracked handle table, frees the `0x69ac` bucket array, calls backend-object vtable slot `+0x38` with `(3, backend_object)`, and clears `tracked_entity_bucket_backend_object`. - -### Follow-up: backend object constructor at `0009:5600` - -- The missing raw-import function entry at `0009:5600` has now been recovered in-place as `cache_backend_object_init` with body `0009:5600-0009:57b9`. -- Current verified behavior is still structural, but stronger than before: - - Allocates a `0x20`-byte object when the caller passes null. - - Initializes embedded DOS file-handle state via `dos_file_handle_init` (`0009:1c00`). - - Seeds internal method-table / state fields at object offsets `+0x08`, `+0x0c`, `+0x10`, `+0x14`, `+0x16`, `+0x18`, and `+0x1c`. - - Dispatches through the object method table during construction and returns the object pointer later cached at `0x45ab/0x45ad`. -- This is enough to justify the structural `cache_backend_object_init` name, but not yet enough to promote the backend object to a file-, audio-, or resource-specific subsystem name. -- Verified callback roles inside `cache_lookup_or_load_entry_by_id`: - - backend vtable `+0x34` = size query callback for a cache entry id (used before allocation/eviction). - - backend vtable `+0x0c` = load/bind callback that populates the newly allocated slot buffer for the requested id. - -### Follow-up: missing function entry at `000a:5e00` - -- The missing raw-import function entry at `000a:5e00` has now been recovered in-place as `tracked_entity_handle_table_init` with body `000a:5e00-000a:5e58`. -- Verified behavior: if `0x4672` is clear, it allocates `0x90` bytes at `0x4673/0x4675`, aborts through `runtime_init_or_abort` on allocation failure, calls `000a:577d` and local helper `000a:5e95`, then sets `0x4672 = 1`. -- Matching teardown helper promoted alongside it: `000a:5e59` = `tracked_entity_handle_table_shutdown`. -- Current structural names for that local state: - - `0x4672` = `tracked_entity_handle_table_active` - - `0x4673/0x4675` = `tracked_entity_handle_table` -- This matches the existing client-layer interpretation: `0x4673` holds 12 handle entries (`12 * 0x0c = 0x90` bytes), and `000a:5e00` is the table allocator/initializer used by the tracked bucket subsystem startup path. - -### Follow-up: missing function entry at `000a:6600` - -- The missing raw-import function entry at `000a:6600` has now been recovered in-place as `cache_init` with body `000a:6600-000a:67d8`. -- Verified behavior from the repaired body: - - Stores the requested slot count in `0x46ad`. - - Allocates the per-slot payload-pointer table at `0x4699` (`count * 4`) and aborts on failure. - - Seeds each slot with allocator-returned pointers / zero low words before running local pointer normalization helpers (`0009:c496`, `0009:c400`, `0009:c6ae`). - - Queries/derives the cache arena size, subtracts `0x1000`, and stores the byte budget in `0x46a5`. - - Allocates the arena backing object at `0x4691`, derives the payload base pointer `0x4695`, and aborts through `seg091_func_00fd` on failure. - - Allocates the per-slot block-metadata mirror at `0x46b3` (`count * 4`) and per-slot cached-id table at `0x469d` (`count * 2`). - - Allocates and initializes the free-list head object at `0x4688`, then calls local helper `000a:68aa` before returning. - -### Follow-up: cache reset / handle-table helpers - -- `000a:68aa` = `cache_reset_runtime_state`. -- Verified role: shared cache reset/bootstrap helper called from `cache_init`, `cache_shutdown`, and one wider external reset path. It allocates per-slot arena-header / metadata nodes, rebinds slot pointers to the arena base, clears the cached-id table, seeds the free-list head, and resets `0x46a9` (bytes in use) plus `0x46af` (last-id fast path). -- `000a:703e` = `cache_compact_arena_blocks`. -- Verified role: compacts live cache arena blocks into earlier free holes when `cache_alloc_block_for_slot` cannot find a large-enough free block, updates per-slot payload pointers, and merges adjacent free-list headers afterward. -- `000a:5e95` = `tracked_entity_handle_table_clear_and_dispatch`. -- Verified role: when `tracked_entity_handle_table_active` is set, it zeroes the full `0x90`-byte handle table at `0x4673`, resets adjacent local state at `0x4677/0x4679/0x467b`, then dispatches through the remaining thunked follow-up path. -- `000a:5339` = `tracked_entity_handle_mark_remove_all_if_enabled`. -- Verified role: thin gate wrapper that only forwards to `tracked_entity_handle_mark_remove_all` when `tracked_entity_bucket_system_enabled` is set. - -### Follow-up: external reset paths using the cache/tracked-handle layer - -- The unlabeled path around `0004:25a9` now has enough local evidence to classify as an external reset sequence: it calls `cache_reset_runtime_state`, then `tracked_entity_handle_table_clear_and_dispatch`, then continues through additional tracked-entry/cache-side refresh helpers (`000d:cd22`, `000d:44b3`, `0006:ae66`, `0006:ae00`, etc.). -- The unlabeled path around `0004:eb80` is a conditional tracked-bucket reset/update sequence: when `tracked_entity_bucket_system_enabled` is set, it calls `tracked_entity_handle_mark_remove_all_if_enabled`, then `tracked_entity_handle_table_clear_and_dispatch`, then `cache_compact_arena_blocks`, before resuming its outer flow. -- These caller sites strengthen the current interpretation that the `0x45aa` / `0x4673` / `0x4688..46b7` layer is a shared runtime cache service used by gameplay/system reset flows, but they still do not expose a resource-specific subsystem name by themselves. - -### Follow-up: repaired seg004 reset-path function objects - -- `0004:2592` had been mis-modeled as a one-instruction thunk body. It has now been repaired to the full body `0004:2592-25de` and renamed `runtime_cache_reset_sequence`. -- Current verified behavior for `runtime_cache_reset_sequence`: - - Calls `0008:7bfe`. - - Calls `game_mode_init(*(0x27c4))`. - - Calls an import-resolved follow-up site at `0004:25a4`, now annotated as `NE IMPORT -> ASYLUM.24`. - - Then resets cache runtime state, clears tracked handles, refreshes tracked-entry/cache helpers, and resumes the wider runtime reset flow. -- Known caller so far: `0004:262d` inside the tiny wrapper at `0004:2620`, which sets byte `+0x40` on the object at `0x6828` before invoking the reset sequence. -- `0004:eb1f` had also been truncated. It has now been repaired to the full body `0004:eb1f-eb9b` and renamed `entity_dispatch_entry_ctor_0f3a_with_cache_reset`. -- Verified behavior for `entity_dispatch_entry_ctor_0f3a_with_cache_reset`: - - Allocates/initializes an entity dispatch entry when needed. - - Stamps entry type `0x0f3a`. - - Stores its two word payload fields from the incoming args. - - Runs local setup through the embedded helper at `0004:ebf4`, which dispatches `entity_dispatch_reset_all(*0x7e22, 0x00f0)` and, when the local flag plus global `0x0ee1` allow it, allocates a type `0x0f5e` dispatch entry and passes it to `entity_pair_sync_b`. - - When `tracked_entity_bucket_system_enabled` is set, performs the tracked-handle removal / clear / cache-compaction sequence before finalizing through `0009:b1c3` in phase `0`. -- The sibling at `0004:eb9c` remains separate and valid; it builds the same `0x0f3a` entry type without the extra cache-reset tail, so the repaired `0004:eb1f` boundary stops cleanly at `0004:eb9b`. - -### Follow-up: new local helper classification around the repaired seg004 path - -- `0004:ea00` is now a real function object named `entity_dispatch_entry_alloc_type_0f5e` with body `0004:ea00-0004:ea46`. -- Verified behavior for `entity_dispatch_entry_alloc_type_0f5e`: - - Reuses the incoming FAR pointer when non-null; otherwise allocates `0x33` bytes through `mem_alloc_far`. - - Initializes the entry through `entity_dispatch_entry_init`. - - Stamps the entry type word at `+0x00` to `0x0f5e` before returning it. -- `0009:b1c3` is now renamed `allocator_phase_finalize_pass` and remains intentionally allocator-scoped rather than subsystem-specific: - - Both known call sites pass only phase bytes `0` or `1`. - - It forwards that byte twice to the object rooted at `0x4588` through vtable slot `+0x08`. - - It then sweeps the allocator head table at `0x8724` up to the active head count at `0x879c`, calling `allocator_head_finalize_sweep` on each entry. -- That evidence is strong enough for the allocator-side rename, but not yet enough to promote `0x4588` to a more specific subsystem name. - -### Follow-up: seg082 allocator cluster (`0009:a229`, `0009:af87`, `0009:b06b`, `0009:b1c3`) - -- `0009:a229` is now verified as the public size-only wrapper around the seg082 allocator path. -- Caller evidence: - - `saveslot_table_clear` requests `0x2800` bytes through `0009:a229`, stores the returned FAR pointer at `0x2ba3/0x2ba5`, then zeroes the result in `0x400`-byte chunks. - - The wrapper lazily initializes the allocator on first use through `0009:bcb9`, then calls `allocator_try_alloc_from_head_table(size, default_tag, 0xff)`. -- `0009:bcb9` is now annotated as the one-time lazy initializer for this path. - - It parses an optional `-x` tuning value from the PSP command line, clamps the derived percentage into `0x14..0x50`, then seeds local seg082 helpers before setting init flag `0x4096 = 1`. -- Table structure around `0x8724` is tighter now: - - `0x8724` is an array of `0x0c`-byte allocator heads. - - `0x879c` is the active head count / table limit. - - The per-node size/value encoding used under each head is manipulated through `0009:c628` and `0009:c6ae`, which read/write a packed 32-bit quantity split across `word + byte + byte` fields. -- `0009:af87` is now annotated as the free-space probe for the same cluster. - - It walks the node chain rooted at `0x8724`. - - For each node, it accumulates `node_size - 9` into a running total and tracks the largest single free block. - - Known callers include `cache_init` and the seg013 path at `0004:833b`, both of which use it to size subsequent allocation work. -- `0009:b06b` is now renamed `allocator_try_alloc_from_head_table`. - - It validates the requested size, reserves a temporary work token through `0009:e15f`, and scans the `0x8724` allocator head table in `0x0c`-byte entries via the local helper at `0009:a336`. - - On a successful fit, it commits the result through `0009:e2b4`, clears failure flag `0x4098`, and returns the allocated FAR pointer. - - When a pass does not find a fit, it interleaves up to two finalize phases through `allocator_phase_finalize_pass(phase)` before the final retry, then releases the work token through `0009:e1f6`. -- The formerly missing callee at `0009:a336` has now been recovered in-place as `allocator_head_try_alloc_block` with body `0009:a336-0009:a5d0`. - - It is the per-head first-fit allocator helper used by `allocator_try_alloc_from_head_table` while sweeping the `0x8724` allocator head table. - - It normalizes the requested size (rounds odd small requests up, page-aligns large non-page-aligned requests), adds the local `0x0a` node header overhead, and enforces a minimum allocation size of `0x10` bytes. - - It walks the node chain for one allocator head until it finds a free span large enough. - - On success it unlinks the chosen free node, either consumes it whole or splits off a remainder node when at least `0x10` bytes remain, stores the owner/tag word, and returns `payload_ptr + 0x0a`. - - On failure for that head it returns `0`, which matches the calling pattern in `allocator_try_alloc_from_head_table`. -- Boundary follow-up from the same read-only scan: - - The adjacent missing body at `0009:a5d1` has now also been recovered in-place as `allocator_head_free_block` with body `0009:a5d1-0009:a960`. - - It is the per-head free helper paired with `allocator_head_try_alloc_block`. - - It rebuilds the node header from a payload pointer (`payload - 0x0a`), validates the owner/tag word against the expected caller-supplied tag, reinserts the block into one allocator head, and coalesces with adjacent free neighbors when possible. - - Its earlier branch targets `0009:a7a1` and `0009:a7b8` are now confirmed to be internal labels, not separate function entries. -- `0009:a961` is now better constrained as the per-head finalize sweep used by `allocator_phase_finalize_pass`. - - It walks one `0x8724` head's node chain, skips odd-tagged spans, coalesces or rewrites eligible spans, and updates head/back-pointer links when deferred space needs to be merged back into the chain. - - This strengthens the current interpretation that `allocator_phase_finalize_pass` is allocator-side callback/finalize glue rather than a cache-specific public API. -- `0009:b224` is now named `allocator_free_block_by_ptr`. - - Current verified behavior: converts the payload pointer back through the local header helpers, scans the `0x8724` head table for the owning range, dispatches to `allocator_head_free_block`, and aborts if no owning head is found. - - Known wrappers `0009:a24f` and `0009:a27a` are now clearly small checked entry points into this free-by-pointer path. -- With both recovered bodies in place, the seg082 cluster now has a verified alloc/free pair at the per-head level: - - `allocator_head_try_alloc_block` (`0009:a336`) - - `allocator_head_free_block` (`0009:a5d1`) - - `allocator_free_block_by_ptr` (`0009:b224`) -- `allocator_phase_finalize_pass` now has a corrected single-byte phase parameter in Ghidra; the object at `0x4588` is still left unnamed because its subsystem role is not yet strong enough. -- This narrows the remaining ambiguity around `allocator_phase_finalize_pass`: the unresolved part is now the role of the object at `0x4588`, not the local allocator mechanics around `0x8724`. `ASYLUM.24` is still not identified from the current evidence. - -### Follow-up: `0x4588` object-role evidence (Priority 1 start) - -- A direct instruction scan found real uses of `0x4588` / `0x458a` even though normal static reference APIs were not materializing them. -- Current verified behavior from those uses: - - `entity_conditional_render_dispatch` (`0009:9216`) calls through the runtime-installed object at `0x4588` via vtable slot `+0x0c` when the entity flags allow the alternate path and `param_2 == 0`. - - `000a:4a56` is a one-shot teardown/reset path for the same object: it checks a local once-flag at `0x4595`, clears `0x4588` when non-null, optionally performs a vtable `+0x0c` callback when `0x4590 != 0x458c`, then calls vtable slot `+0x04` followed by `FUN_0009_0d30()`. - - The two callback sync sites inside `sprite_node_get_or_traverse` (`000a:b9e5` and `000a:ba66`) only emit vtable `+0x0c` when the candidate two-word pair differs from the current pair, then immediately mirror that pair through `000b:1e39` using global sprite/object pointer `0x4f38/0x4f3a`. - - A read-only data probe of `0x4588` in the current database returned all zero bytes, so the object pointer is null-initialized statically and likely installed later at runtime. -- Conservative conclusion: - - The `0x4588` object now looks like a runtime-installed callback / dispatch object that participates in conditional render or presentation-side flow and has an explicit teardown path. - - That is enough for comments and ledger progress, but still not enough to safely rename `0009:b1c3` or the global itself to a concrete subsystem name. - -### Follow-up: `0x4588` install/clear windows from the no-function hit list - -- A read-only PyGhidra instruction-window pass against an unlocked project clone confirmed that the planned no-function hit list is real code, not aligned data. -- New verified lifecycle evidence: - - `000a:4932` and `000a:4936` store the same incoming dword into `0x4590` and `0x458c`, then `000a:493e` stores the incoming FAR object pointer into `0x4588`. - - `0004:5b8c` and `0004:5bbf` both clear `0x4588` immediately before the fatal/reporting-style seg091 call through `000a:454d`. - - `0004:5ea7` and `0004:6430` both clear `0x4588` and then immediately run the one-shot teardown path `000a:4a56(1)`. - - `000a:b9e5`, `000a:ba66`, `000d:9d5e`, and `000d:a3b7` all push a two-word value pair followed by the `0x4588` FAR pointer and call the object's vtable slot `+0x0c`. - - `entity_conditional_render_dispatch` remains the only named caller found so far for the same slot, but it passes a single literal `0x0101` argument instead of a two-word pair. -- Conservative conclusion after the window pass: - - `0x4588` is definitely a nullable runtime-installed FAR object with explicit install, clear, callback, and teardown transitions. - - The unresolved part is now its concrete subsystem identity, not whether the object lifecycle is real. - - The best next cheap win is no longer broad instruction searching; it is caller-side recovery around the still-unbounded `000a:b9e5` / `000a:ba66` and `000d:9d5e` / `000d:a3b7` windows. - -### Follow-up: seg138 caller-side dispatch-entry emission helper - -- `FUN_000d_938c` is now confirmed as a real caller-side helper with body `000d:938c-000d:9583`, and an evidence-preserving decompiler comment was added in Ghidra instead of forcing a speculative rename. -- Current verified behavior from direct MCP decompile/disassembly: - - When the mode/global gate is not already in the `0x13:0x0008` state and entity byte `+0x33` is clear, it allocates a scratch palette buffer, constructs a dispatch entry, sets type `0x051e`, and initializes runtime state through `entity_dispatch_entry_init_runtime_state` with entry kind `0x3c`. - - Later in the same helper it constructs a second dispatch entry from the current palette globals at `0x4e4:0x4e6`, again sets type `0x051e`, and initializes runtime state with entry kind `0x14` and active-state parameters `(1,0,1)`. - - Both created entries are polled until their runtime flag word clears bit `0x0002`, after which the helper redraws the global sprite path, syncs display-state byte `0x58e` from the entity when the global display object exists, calls `FUN_0006_16e1`, clears `g_active_dispatch_entry_farptr[+0x40]`, and finally dispatches through the input object's vtable slot `+0x08`. -- Conservative conclusion: - - seg138 now has one more verified caller tying `entity_dispatch_entry_init_runtime_state` to palette/presentation-side emission work around entity cleanup and redraw flow. - - This narrows the open question from "is the dispatch-entry lane real?" to "what exact presentation/event subsystem does this lane belong to?" - -### Follow-up: seg137 palette and dispatch-entry helper family - -- A larger direct MCP rename batch now stabilizes a coherent seg137 palette helper family: - - `000d:82ea` = `dispatch_entry_create_black_palette_state_active` - - `000d:83be` = `dispatch_entry_create_grayscale_palette_state_active` - - `000d:85da` = `vga_palette_set_all_black` - - `000d:8653` = `vga_palette_set_all_white` - - `000d:86cc` = `vga_palette_set_all_rgb` - - `000d:875d` = `dispatch_entry_create_solid_palette_state_active` - - `000d:88b2` = `dispatch_entry_create_solid_palette_state` - - `000d:8a47` = `dispatch_entry_create_black_palette_state` -- Current verified behavior from direct MCP decompile/disassembly: - - `vga_palette_set_all_black` corrects the earlier overreach rename at `000d:85da`: it allocates a `0x100`-entry palette buffer filled with zero RGB triplets, writes it to VGA, and frees the scratch buffer. The previous `map_object_set_dirty_flag` name was not supported by the recovered body. - - `vga_palette_set_all_white` is the same helper shape with all three RGB components initialized to `0x3f`, then written through `vga_palette_write`. - - `vga_palette_set_all_rgb` takes caller-supplied RGB bytes, replicates them across a `0x100`-entry palette buffer, writes the result to VGA, and frees the scratch palette. - - `dispatch_entry_create_black_palette_state_active` and `dispatch_entry_create_black_palette_state` both build a runtime-state dispatch entry of type `0x051e` from a black `0x100`-entry palette buffer; the `_active` form first sets `g_active_dispatch_entry_farptr[+0x40] = 1`, while the quiet form does not. - - `dispatch_entry_create_grayscale_palette_state_active` reads the current VGA palette, normalizes each triplet by copying the first channel across all three RGB bytes, then builds a runtime-state dispatch entry from that grayscale palette while marking the active dispatch entry. - - `dispatch_entry_create_solid_palette_state_active` and `dispatch_entry_create_solid_palette_state` validate `0..0x3f` RGB inputs, fill a scratch `0x100`-entry palette buffer with that solid color, and build the same `0x051e` runtime-state dispatch entry, again split into active-marking and quiet variants. -- Additional caller-side comments were added instead of speculative renames on: - - `000d:84f4` (current-palette dispatch entry paired with a second object of type `0x68bf` through `entity_pair_sync_b`) - - `000d:89c6` (parameterized current-palette runtime-state wrapper with active-state flags) -- Conservative conclusion: - - seg137 is now materially beyond a foothold: it contains a coherent palette-write and palette-backed dispatch-entry emission family tied to the same runtime-state constructor lane. - - The remaining uncertainty is higher-level script/event meaning, especially the paired `0x68bf` object and the exact role of the `0004:5ad4-5b6e` caller sequence, not the local palette-helper mechanics. - -### Follow-up: seg005 startup/display orchestration and seg136 active dispatch entry - -- A new direct MCP recovery pass stabilized one high-value handoff path and its nearby active-dispatch helpers: - - `0004:60c0-0004:621a` recovered as `FUN_0004_60c0` with a decompiler comment summarizing the orchestration flow. - - `000d:7600-000d:760d` created and renamed to `active_dispatch_entry_mark_enabled`. - - `000d:760e` renamed to `active_dispatch_entry_mark_disabled`. - - `000d:761c` renamed to `active_dispatch_entry_create_default`. -- Current verified behavior from direct MCP decompile/disassembly: - - `FUN_0004_60c0` is a recovered startup/display orchestration path: it performs broad setup calls, reads the live VGA palette, validates a caller-provided object through vtable slot `+0x0c`, drives the sprite/object lane through `0x4f38`, runs the seg137 palette and dispatch-entry helper family, creates the default active dispatch entry through `active_dispatch_entry_create_default`, programs mouse interrupt state via seg056 `INT 33h` wrappers, then hands off into the still-unrecovered `0004:1e00` routine. - - The old `0004:5ad4-5b6e` caller sequence is now confirmed as one internal sub-sequence within that larger recovered function rather than an isolated orphan. - - `active_dispatch_entry_create_default` allocates or reuses a `0x42`-byte dispatch entry, stamps type `0x687f`, installs a callback-table pointer through `0x39ca`, sets event type `0x248`, sets update period `0x1e`, marks the entry as the global active dispatch entry at `0x6828`, toggles the local `+0x40` state byte through `active_dispatch_entry_mark_enabled` and `active_dispatch_entry_mark_disabled`, then enables the timer wrapper. - - `active_dispatch_entry_mark_enabled` and `active_dispatch_entry_mark_disabled` are tiny helpers that set or clear `g_active_dispatch_entry_farptr[+0x40]` respectively. -- Conservative conclusion: - - seg005 now has its first strong high-value foothold in a startup/display handoff path, even though the downstream `0004:1e00` target still needs recovery and naming. - - seg136 now has a concrete active-dispatch-entry foothold rather than being empty ledger space. - -### Follow-up: seg005 large runtime/display handoff body recovered at `0004:1e00` - -- `0004:1e00-0004:2420` has now been recovered as a real function object in Ghidra as `FUN_0004_1e00` with an evidence-preserving comment, replacing the earlier no-function gap. -- Current verified behavior from the recovered body: - - It begins by forcing an all-black palette through `vga_palette_set_all_black`, then performs several startup/display setup calls before manipulating the active dispatch entry at `0x6828`. - - It constructs two animation-side objects through `animation_ctor_variant_b` (`000e:2860`) using DS-local descriptors at `0x04ae` and `0x04b2`, then waits on global words around `0x8a94-0x8a98` when the alternate startup flag path is active. - - It conditionally calls `sprite_node_get_or_traverse` (`000a:b988`) after a seg122 helper path, toggles seg064 gate helpers, and then enters a larger resource/object processing region that uses globals rooted at `0x4aa`, `0x4ac`, and `0x7e22`. - - The mid-body is now better classified as a non-return transition driver rather than a generic handoff stub: it branches on the returned `SI` state after the sprite/object traversal, with one path performing the fuller runtime/display setup, one path taking a small local special-case handler (`0004:2661`), and one path marking the active dispatch entry before calling `runtime_callback_object_teardown_once(1)`. - - The `SI == 2` special-case branch is now slightly tighter: its local helper `0004:2661` forwards into `FUN_0004_25df`, which is a small type-stamped dispatch-entry constructor that allocates when needed, runs `entity_dispatch_entry_init`, stamps type `0x04b6`, and stores the caller-supplied mode/state word at `+0x32`. - - The fuller setup path clears and restores active-dispatch state, calls through the `0x2bd8` object vtable, restores the live palette through `0009:6f5a`, re-runs render/dispatch rectangle helpers (`entity_conditional_render_dispatch`, `entity_rect_compare_and_dispatch`), and finishes through the seg126 trampoline `thunk_callf_0000_ffff_000c_82f9`. - - The recovered tail confirms a clean end at `0004:2420`, with the next separate function beginning at `0004:2421`. -- Conservative conclusion: - - The main blocker on seg005 is no longer structural recovery; it is naming the exact state entered by this now-navigable startup/display transition driver. - - The presence of `animation_ctor_variant_b`, palette forcing, active-dispatch toggles, sprite-node traversal, and the `0x2bd8` vtable lane makes this look more like a real mode/state transition than a one-off helper, but the exact gameplay, intro, or front-end label still needs one more caller/data pass. - -### Follow-up: seg126 wrappers feeding the `0004:1e00` transition lane - -- Two previously unbounded seg126 callers around the recovered seg005 handoff are now real functions in Ghidra: - - `FUN_000c_7412` (`000c:7412-000c:7432`) - - `transition_preentry_run_until_complete_or_abort` (`000c:c9f4-000c:ca1c`) -- The larger fallthrough body rooted at `000c:c890` is now also recovered as a real function object: `transition_preentry_release_resources` (`000c:c890-000c:c9f3`). -- The previously blocked seg126 helpers are now also recovered as standalone functions after overlap repair in the surrounding namespace: - - `transition_preentry_setup_resources` (`000c:c63a-000c:c88f`) - - `transition_preentry_step_script` (`000c:ca1d-000c:cd52`) -- Current verified behavior from direct MCP recovery/decompile: - - `FUN_000c_7412` is a compact wrapper into the seg005 transition lane: it clears the redraw state on the sprite/object pair rooted at `0x5e82:0x5e84`, forces a black palette through `vga_palette_set_all_black`, runs seg126 pre-entry state prep through `FUN_000c_c9f4`, then tail-calls `FUN_0004_1e00`. - - `transition_preentry_run_until_complete_or_abort` is the short pre-entry state wrapper: it runs local seg126 setup helpers, repeatedly executes a local prep loop while local ready byte `0x62fe` is clear and external gate word `0x31a2` remains zero, ticks the local palette-fade controller on each pass, then dispatches into `transition_preentry_release_resources` before returning to callers that continue into `FUN_0004_1e00`. - - `transition_preentry_release_resources` is the cleanup/finalize body behind that wrapper: it releases the paired temporary presenter objects at `0x8c5c` and `0x8c60`, conditionally frees the local stream buffer at `0x6301:0x6303`, runs palette/render reset, conditionally constructs animation state through `animation_ctor_variant_a` on local storage `DS:0x6341` when `0x844` and `0x62fe` are both set, then immediately marks byte `+0x40` on the shared global owner at `0x6828`, marks the active dispatch entry, primes sprite redraw state, drains the event queue, and zeroes `0x8a94-0x8a98` before returning. - - `wait_for_vga_vertical_retrace` (`000c:c62c-000c:c639`) is now recovered as a real helper: it polls VGA status port `0x3da` until the vertical-retrace edge and is called from both the seg126 pre-entry loop and nearby fade/update paths. - - `transition_preentry_setup_resources` captures baseline coordinates into `0x8c58:0x8c5a`, constructs two paired temporary presenter objects at `0x8c5c:0x8c5e` and `0x8c60:0x8c62` through `000a:9748` with preset IDs `0x10` and `0x11`, stages the local stream buffer at `0x6301:0x6303`, seeds palette/render state, and resets the neighboring control globals at `0x62fa-0x6318` before returning. - - The shared seg088 helpers behind that object family are now tighter too: `text_renderer_measure_string_width` (`000a:30aa`) returns width through the object's virtual measure path, and `text_renderer_draw_string_at` (`000a:30d7`) stores x/y into the object and draws a null-terminated string. That is enough to reclassify `0x8c5c` and `0x8c60` as a paired temporary text-renderer lane rather than generic sprite/object state. - - `transition_preentry_step_script` early-outs while fade state `0x630a` is active or when the tracked object position at `0x2de4+0x40/+0x42` is unchanged, decrements the local countdown at `0x62fa:0x62fc`, interprets the `0x6301` byte stream with control values including `0x21`, `0x23`, `0x24`, `0x26`, `0x2a`, `0x40`, and `0x5e`, uses `0x62ff` as the stream cursor, uses the temporary text-renderer objects at `0x8c5c` and `0x8c60` for layout/render work, sets ready flag `0x62fe` on the `0x23` case, uses `0x6305` as a one-shot redraw latch around the `0x26`/`0x2a` control path, and leaves `0x630a` / `0x630b` to the neighboring palette-fade controller. - - Direct follow-up on the old `0x31a2` ambiguity now points away from local script state: `event_queue_state_reset` at `0008:89c1` clears `0x31a2`, interrupt-side queue code around `0008:a283` / `0008:a314` increments and decrements it, and several busy-wait helpers (`000c:e4d8`, `000c:e546`, `000c:e5c6`) spin on it. In the seg126 wrapper this makes `0x31a2` a plausible external input/event break gate rather than part of the local pre-entry bytecode interpreter. - - The seg136 owner flag at `g_active_dispatch_entry_farptr[+0x40]` is now less abstract too. `active_dispatch_entry_mark_enabled` / `active_dispatch_entry_mark_disabled` still force it high or low during entry setup, but nearby seg136 helpers also copy it into fresh entries, clear it when the current owner becomes inactive, and decrement it only while `0x31a2 > 0`. That ties the `0x6828` owner lane more directly to the same external input/event gate that seg126 polls. - - The same segment now also has a clearer transition-control shell around that prep body: - - `thunk_callf_0000_ffff_000c_827d` is the pre-transition side that restores redraw/event state, runs the `0x2bd8` controller callbacks, redraws the `0x5e82:0x5e84` sprite/object pair, and leaves local state bytes set for the subsequent `FUN_0004_1e00` call. - - `thunk_callf_0000_ffff_000c_82f9` is the post-transition side that resets the slot table through `FUN_0008_39e9`, clears local state bytes, runs the `0x5e82:0x5e84` cleanup path, and returns the lane to its quiescent state. - - `FUN_000c_834a` is a small guard wrapper that conditionally calls `FUN_000c_8231()` when gate byte `0x85f` is set; this same helper is used at the start of `FUN_0004_1e00` and in the local seg126 caller family. - - This is now enough to tie the seg076 caller at `000c:742c` to the same startup/display transition lane already reached from `FUN_0004_60c0`. -- Conservative conclusion: - - seg126 is now beyond a mere foothold: it contains a coherent transition-entry and transition-exit control lane around the seg005 startup/display state, with pre-entry prep, guarded entry, post-transition cleanup, and local state/fade integration. - - The unresolved part is the exact higher-level UI/transition role of the paired text-renderer lanes at `0x8c5c` and `0x8c60`, the precise event semantics of external gate `0x31a2`, and the exact relationship between local animation storage `DS:0x6341` and the shared global owner at `0x6828` whose `+0x40` byte follows that same gate, not whether the transition lane itself is real. - -### Follow-up: seg127 palette fade controller tied to the same transition lane - -- The nearby seg127 state/fade controller is now anchored by verified functions in Ghidra: - - `palette_fade_begin_full_up` (`000c:c600-000c:c615`) - - `palette_fade_begin_full_down` (`000c:c616-000c:c62b`) - - `transition_palette_fade_tick` (`000c:cd53-000c:cd75`) - - `transition_palette_fade_begin` (`000c:cd76-000c:cddd`) - - `transition_palette_fade_out_step` (`000c:cdde-000c:ce56`) and `transition_palette_fade_in_step` (`000c:ce57-000c:cecb`) -- Current verified behavior from direct MCP recovery/decompile: - - `palette_fade_begin_full_up` and `palette_fade_begin_full_down` are fixed-range wrappers over `transition_palette_fade_begin`: both use the full `0x80`-entry palette range with step size `4`, differing only in direction/state (`2` for up, `1` for down). - - The current local callers are now visible too: `000c:cd1a` invokes `palette_fade_begin_full_up` for the `ES:[DI] == 0x26` case and sets `0x6305 = 1`, while `000c:cd3f` and `000c:cb06` invoke `palette_fade_begin_full_down` when the fade controller is idle. - - `transition_palette_fade_begin` takes a palette source pointer, start index, count, step amount, and direction/state, stores them into local controller state at `0x630e-0x6316`, sets active flag byte `0x630a = 1`, stores the direction/state word at `0x630b`, then runs the local prep helper and one immediate fade step. - - `transition_palette_fade_tick` is the small controller gate over that state: it returns when inactive, dispatches to `transition_palette_fade_out_step` when `0x630b == 1`, and to `transition_palette_fade_in_step` when `0x630b == 2`. - - `transition_palette_fade_out_step` and `transition_palette_fade_in_step` iterate over palette range `[0x6312 .. 0x6312 + 0x6314)`, writing VGA DAC entries through ports `0x3c8/0x3c9` from the source palette at `0x630e:0x6310` while updating brightness offset byte `0x630d` by step `0x6316`; both clear active flag `0x630a` when the fade reaches its terminal black or full-bright state. - - This controller is tied directly into the transition lane already under study: `transition_preentry_run_until_complete_or_abort` calls `transition_palette_fade_tick`, and `transition_preentry_setup_resources` seeds the neighboring seg126 controller state at `0x62fa-0x6318` before the script interpreter starts using it. -- Conservative conclusion: - - seg127 is no longer just a foothold; it is a real palette fade controller subsystem adjacent to the same startup/display entry path, with verified initializer, dispatcher, step bodies, fixed-range wrappers, and caller-side state gating. - - The remaining question is not the local fade mechanics, but which exact transition states and tracked objects choose the fade direction and palette source. - -### Follow-up: seg049 watch/camera controller object at `0x2bd8` - -- The longstanding `0x2bd8` watch/camera lane is now tighter and partially corrected from older notes: it is not just a raw watched-entity pointer, but a real controller object lane. -- Current verified behavior from direct MCP recovery/decompile: - - `watch_entity_controller_create` (`0007:ba45`) allocates or reuses an object, runs the local constructor path at `000a:8627`, stamps type `0x2c2b`, stores the resulting FAR pointer globally at `0x2bd8`, sets event type `0x0219`, and installs callback target `0x2be4` through the callback table at `0x39ca`. - - `watch_entity_controller_create_global` (`0007:ba00`) is a thin wrapper that constructs the default global controller and stores the returned FAR pointer at `0x2bd8:0x2bda`. - - `watch_entity_controller_dispatch_if_present` (`0007:ba13`) is the paired non-null dispatcher that calls controller vtable slots `+0x2c` and `+0x30` when the global exists. - - Existing callers in the seg005 transition lane (`FUN_0004_1e00`) call through the same `0x2bd8` vtable `+0x2c` slot before palette restore and post-transition redraw prep, which strengthens the interpretation that this is a real watch/camera-side controller object participating in display-state transitions. -- Conservative conclusion: - - seg049 now has a real foothold in the watch/camera controller subsystem. - - The remaining ambiguity is the exact distinction between the controller object at `0x2bd8` and the ultimately watched entity or map object it may point at or manage, not whether the controller itself is real. - -### Follow-up: seg108 sprite/object flag lane at `0x4f38` - -- The global sprite/object lane at `0x4f38:0x4f3a` now has two recovered flag helpers in addition to the existing redraw/timer sync evidence: - - `sprite_object_clear_flag40_if_present` (`000b:2b08-000b:2b1f`) - - `sprite_object_set_flag40_if_present` (`000b:2b20-000b:2b37`) -- Current verified behavior from direct MCP recovery/decompile: - - `sprite_object_clear_flag40_if_present` checks whether the global sprite/object FAR pointer at `0x4f38` is non-null and clears bit `0x40` in the word at object offset `+0x32`. - - `sprite_object_set_flag40_if_present` performs the same guard and sets bit `0x40` at that same `+0x32` word. - - This fits the already-confirmed sync behavior in `sprite_node_get_or_traverse`, where `0x4588` callback emissions are immediately mirrored through `FUN_000b_1e39` using the global sprite/object pointer. Together, that narrows `0x4f38` to an active sprite/object instance whose state bits are toggled during the same startup/display transition path that uses `FUN_0004_60c0` and `FUN_0004_1e00`. -- Conservative conclusion: - - seg108 now has a real foothold in the active sprite/object state lane. - - The remaining ambiguity is what bit `0x40` means semantically and how the `0x4f38` object relates at a higher level to the `0x2bd8` watch/camera controller and the `0x4588` callback object. - -### Follow-up: `ASYLUM.24` vs nearby `ASYLUM` ordinals - -- `ASYLUM.24` remains unresolved by name, but its call pattern is now narrower. - - In `runtime_cache_reset_sequence` (`0004:2592`), it is a parameterless import call placed after `game_mode_init(*(0x27c4))` and before `cache_reset_runtime_state` plus the tracked-handle/cache-side reset tail. - - That makes it look like a module-level reset/init hook rather than a per-object method. -- Nearby `ASYLUM` ordinals in the seg011 caller at `0004:6f15` show a different pattern: - - `ASYLUM.36` returns an object-like handle that is used immediately through indirect vtable calls. - - `ASYLUM.37` is then called with explicit arguments against that object flow. -- Current conservative conclusion: - - `ASYLUM.24` is probably from the same external module family, but it does not currently match the object-construction / object-method calling pattern observed for `ASYLUM.36` and `ASYLUM.37`. - - Keep the import unresolved by name until another caller or string anchor narrows the exact module role. - -### Repair note: overlapping bad function body - -- Recovery of `cache_init` required a conservative boundary repair: a stray function object `FUN_000a_eee3` had incorrectly claimed body range `000a:6710-000a:fe79`, blocking creation of the real `cache_init` body. -- The bad overlap was removed, `cache_init` was created at `000a:6600-67d8`, and `FUN_000a_eee3` was recreated conservatively as the contiguous visible body `000a:eee3-f00b`. - -Current interpretation of the `0x69ac` / `0x4673` client layer: -- It is an entity-linked consumer of the generic cache manager. -- Its bucket values (`0x40`, `0x32`, `0x20`, `0x10`, `0x08`) still look attenuation- or priority-like rather than purely visibility-like. -- That is enough to keep the structural names, but not enough yet to safely promote the subsystem to a concrete audio/effect name. - -**Entity Table Pointers (DS-relative, discovered in tier 5):** - -| DS Offset | Type | Stride | Purpose | -|-----------|------|--------|---------| -| `0x7dfd` | byte[] | 1 | Entity flags byte (entity_get_flags_byte) | -| `0x7e01` | word[] | 2 | Entity class flags (bit 8 = has parent in hierarchy) | -| `0x7e05` | word[] | 2 | Entity sprite/visual index | -| `0x7ded` | word[] | 2 | Entity parent/hierarchy index | -| `0x7df1` | word[] | 2 | Entity base type word | -| `0x7e1e` | struct[] | 0x79 | Entity class detail records (121 bytes per class) | - -### Recent Manual Boundary Repairs - -Recent high-traffic addresses recovered with manual function creation in Ghidra/PyGhidra: - -| Address | NE Segment | Callers | Notes | -|---------|-----------|---------|-------| -| `000a:48ff` | seg091:04ff | 55 | Recovered as `rng_next_modulo`; manual boundary repair narrowed to `000a:48ff-000a:4912`. | -| `000b:2e00` | seg109:0000 | 74 | Start of segment 109. | -| `0007:5a00` | seg043:0000 | 64 | Start of segment 43. Earlier seg001 `debris_spawn` port was rejected; still needs manual function creation and direct analysis. | -| `0009:a200` | seg082:0000 | - | Target of `mem_alloc`. Start of segment 82. | -| `000c:db68` | `cursor_nav_update_and_dispatch` | Calls `cursor_zone_quadrant_classify`; updates `[+0x37..+0x3a]`; reads `[0x63da]`; switch on direction (0–8); maps scancodes 0x48/0x50/0x4b/0x4d/0x39 | -| `000c:d3e9` | `cursor_set_ref_and_dispatch` | Null-checks param; sets `*param_1 = &DAT_0000_638e`; calls dispatch | -| `000c:d710` | `cursor_set_ref2_and_dispatch` | Same pattern; sets `*param_1 = &DAT_0000_6346` | -| `000c:d75e` | `entity_call_vtable_1e_via_ptr` | Calls `(*[*param_1 + 0x3c])()` — vtable offset 0x1e | -| `000c:d775` | `entity_call_vtable_1e_via_ptr_b` | Near-identical to `d75e`; duplicate generated by compiler | -| `000c:d7c6` | `stub_noop_000c_d7c6` | Empty stub | -| `000c:d7cb` | `stub_noop_000c_d7cb` | Empty stub | - -Direction code mapping (from `cursor_nav_update_and_dispatch` switch): -- 0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW, 8=Center - -### Timer Rate Sync (cursor subsystem) -| Address | Name | Evidence | -|---------|------|---------| -| `000c:e4e0` | `cursor_timer_rate_sync` | If `[0x63e0]` (cursor active) non-zero: copies PIT rate `[0x39ce]` into entity object at `[0x4458+0x24]`, clears `+0x26/+0x27`, then calls far thunk. Called from `cursor_nav_update_and_dispatch` at `000c:db97`. | - -## Raw 000c UI Listbox Event Handler Batch - -Analysis of `000c:880c` and `000c:88b4` — the primary UI event-dispatch island in segment `000c`. - -### Overview -`ui_listbox_event_handler` (`000c:88b4`) is a **large UI widget event handler** (~8KB of code, `88b4` through `9daa`). It takes the signature `(entity_far_ptr, seg, event_far_ptr)` and is stored as a far-pointer vtable entry (no direct code xrefs found; referenced from data). It dispatches on the event code at `[event+0x6]` (keystroke/mouse codes) and updates entity fields to drive menu/listbox navigation state. - -Guard function `entity_state_if_flag80_call_thunk` (`000c:880c`) sits just before the handler: it checks entity flag bit `0x80` at `[param_1+0x5b]` and gates a far thunk call. - -### Functions - -| Address | Name | Evidence | -|---------|------|---------| -| `000c:88b4` | `ui_listbox_event_handler` | Dispatches on event code `[event+0x6]`: confirm keys `0xd`/`0x20`/`0x152` → `entity_state_tick_dispatch`; nav keys `0x148`/`0x14b`/`0x14d`/`0x150` → same; list-prev `0x2c`/`0x3c`/`0x55` → `entity_state_advance_next_or_fallback_b`; list-next `0x2e`/`0x3e`/`0x53`/`0x73`/`0x75` → `entity_state_advance_next_or_fallback_a`; Esc `0x1b` → tick dispatch; comma `0x2c`/`0x3c` → `ac8f`; misc UI events `0x6f`/`0x7e`/`0x13b–0x143`/`0x241`/`0x410`/`0x420`/`0x426`/`0x42f`/`0x432`/`0x441` → various paths. Guards: `[BX+0x5b] & 0x80` (active), `& 0x100` (modal lock from `[0x604b]`, `[0x844]`). Large scan loop `0x100..0x27ff` at `000c:a80f` for option/device enumeration. Falls through to common retf at `9da7`. | -| `000c:880c` | `entity_state_if_flag80_call_thunk` | Guard: tests entity `[param_1+0x5b] & 0x80`; returns if clear; else calls far thunk. Active/visible gate for forwarding display/tick calls. | -| `000c:ace5` | `display_fullscreen_blit_with_entity` | If coords (param_2:param_1) are 0:0, calls wait thunk (`0x48c`=1164ms?); loads display object at `[0x4cd0]`, reads byte `[+0x5]` (video mode/palette), builds full-screen 640×480 rect (`0`..`0x27f`=639, `0`..`0x1df`=479), then calls far display function with entity + position params. Returns display-space coordinate pair in DX:AX. | - -### Key Globals in this Handler -| Address | Meaning | -|---------|---------| -| `[0x7e22]` | String/resource pointer used as data context (`[0x7e24]` = flag) | -| `[0x604b]` | Modal active lock (nonzero = block most events) | -| `[0x844]` | Engine/game-ready flag (0 = block hardware toggle events) | -| `[0x604f]` | Toggle state for event `0x410` | -| `[0x6045]` | Toggle state for event `0x7e` | -| `[0x8638]` | Counter for event `0x432` (wraps 0x11→0x12..0x14→0x0) | -| `[0x5e82/0x5e84]` | Far pointer called when entity flag `0x40` is cleared | -| `[0x4cd0]` | Display/screen manager object far pointer | - -### Event Code Reference Table (partial) -| Code | Meaning | -|------|---------| -| `0x0d` / `0x20` | Enter / Space (confirm) | -| `0x1b` | Escape (cancel) | -| `0x2c` / `0x3c` | Comma / `<` (prev in list) | -| `0x2e` / `0x3e` / `0x53` / `0x73` | Period / `>` / S / s (next in list) | -| `0x55` / `0x75` | U / u (up action with far-ptr check) | -| `0x6f` | o (some option panel event) | -| `0x7e` | `~` (toggle event, gates on `[0x844]` and `[0x6045]`) | -| `0x13b` | Shift+F1 area | -| `0x13c` | Jump-to-display event | -| `0x13e` | Blanked event (gates on `[0x604b]`) | -| `0x141` / `0x142` / `0x143` | Option toggles (gate on `[0x844]`, `[0x2bca/0x2bc9]`) | -| `0x148` / `0x14b` / `0x14d` / `0x150` | Arrow keys (Up/Left/Right/Down) | -| `0x152` | Insert key (alias confirm) | -| `0x241` | Display position query → `display_fullscreen_blit_with_entity` | -| `0x410` | Toggle event with `[0x604f]`, gates on `[0x844]` | -| `0x420` | List-scan init (loop 0x100..0x27ff) | -| `0x426` | String-push event (calls DS:[0x7e22]) | -| `0x42f` | Push `0x103` thunk event | -| `0x432` | Counter cycle event (`[0x8638]` wrap 0x11→0x12, 0x14→0x0) | -| `0x441` | Pattern-fill loop event | - -## NE Segment 21 Analysis — Timer/Event Dispatch System - -**File**: `seg021_code_off_50200_len_4486.bin` | **File Offset**: 0x50200 | **Length**: 0x4486 bytes -**Ghidra Load**: RAM `0000:0000 – 0000:4485`, x86 16-bit Protected Mode, base 0x0000 -**Functions**: 88 total (87 renamed + `input_keyboard_handler` pre-existing) - -### Subsystem Summary - -Segment 21 implements the **hardware-level timer interrupt and entity event dispatch system** — Crusader's real-time task scheduler. Key responsibilities: - -- Programs and services the Intel 8253 **PIT timer** (I/O ports 0x40/0x43) -- Manages three **entity dispatch lists**: timer list (0x39d4), input list (0x39e3), render list (0x3a10) -- Maintains the **entity pool** at 0x39b0 (same pool as seg001; these segments share DS) -- Provides **event queue** (32-slot circular buffer at 0x31cc) -- Handles **save/load** serialization of the entire entity system -- Controls **keyboard/interrupt locks** and deferred scheduling - -### Function Groups - -#### Entity Pool Management (0x0207–0x0483) -| Address | Name | Notes | -|---------|------|-------| -| `0x0207` | `entity_count_by_type_a` | Count entities matching type+event; filters DEAD flag (0x8) | -| `0x0297` | `entity_count_by_type_b` | Identical logic to 0x0207 (compiler duplicate) | -| `0x0327` | `entity_find_free_slot` | Scan pool for null entry; calls panic if full; returns slot or 0xFFFF | -| `0x038f` | `entity_register` | Write far ptr to entity_list, group to entity_data, vtable to registry; inc count | -| `0x044d` | `entity_get_ptr_raw` | Read entity far ptr from pool slot (may be null) | -| `0x0483` | `entity_get_ptr` | Safe wrapper: verifies non-null, returns offset only | - -#### Event Dispatch (0x04f3–0x08be) -| Address | Name | Notes | -|---------|------|-------| -| `0x04f3` | `entity_dispatch_reset_all` | Fires event code 0x21 (reset/init) to all entities | -| `0x050d` | `entity_clear_deferred_flags` | Clears DEFERRED bit (0x200) from up to N=0x3998 entities | -| `0x059e` | `entity_fire_event_broadcast` | Dispatch event to all matching entities; calls vtable[6]; respects 0x200 deferred flag | -| `0x06f4` | `entity_fire_event_type_include` | Fire only entities whose type IS in given list (up to 10, 0x0d=end) | -| `0x08be` | `entity_fire_event_type_exclude` | Fire only entities whose type is NOT in given list | -| `0x0a8e` | `input_keyboard_handler` | (pre-existing) OS-level key router: 0x0d=scroll+, 0x01=action, 0x2c=save, 0x44=load | - -#### Entity Iterator / Linker (0x0bb7–0x106b) -| Address | Name | Notes | -|---------|------|-------| -| `0x0bb7` | `entity_link` | Cross-link two entities; skips if flag 0x400 set | -| `0x0c34` | `entity_find_first` | Init iterator 0x39fa=3; find first entity matching saved type/event at 0x399a/0x399c | -| `0x0cec` | `entity_find_next` | Continue iterator from 0x39fa cursor | -| `0x0dad` | `timer_entity_find_by_event` | Find entity handling event in range 0xf0-0xf7; checks bit 0x1000; writes to 0x3993 | -| `0x0e82` | `entity_find_by_priority` | Walk priority chain at 0x39d4; find entity matching source/event at 0x3993 | -| `0x0fc8` | `entity_set_cursor` | Validate flag 0x800; set cursor 0x3993 = param_1 (slot) | -| `0x100c` | `entity_get_cursor` | Return entity at 0x39bf if valid and not dead | -| `0x106b` | `entity_relink` | Re-link: find by event, walk priority chain, call set-link vtable funcs | - -#### Entity Lifecycle (0x1133–0x131d) -| Address | Name | Notes | -|---------|------|-------| -| `0x1133` | `entity_unregister` | Full removal: dec sprite type count, vtable cleanup, dec total, update masks | -| `0x1202` | `entity_slot_clear` | Zero pool slot (0x39b0), registry slot (0x39ca), group data (0x39b4) | -| `0x1245` | `entity_layer_set` | Write 0x39c9 (active layer ID) if changed; set dirty flag 0x39a2 | -| `0x125d` | `entity_check_overdue` | If entity_is_overdue: set bit 0x40 on entity+0x16 | -| `0x127c` | `entity_is_overdue` | Return 1 if entity index > 0x39bf and flag 0x39c2 set | -| `0x129b` | `entity_list_call_update` | For all entities where entity+0x0e & param_3 != 0: call vtable[8] | -| `0x131d` | `entity_set_pending` | Write param to 0x3995 (next entity to register); error if already set | - -#### Entity System Init/Shutdown (0x133e–0x1705) -| Address | Name | Notes | -|---------|------|-------| -| `0x133e` | `entity_system_init` | Alloc all entity pool buffers (see decompiler comment); init three lists; clear event state | -| `0x14bc` | `entity_system_flush_normal` | Finalize (vtable[10]) then free all non-deferred active entities | -| `0x158d` | `entity_system_flush_deferred` | Same as flush_normal for deferred entities | -| `0x165c` | `entity_process_pending_deletes` | Free entities marked DEAD (flag & 0x8); dec 0x399e counter | -| `0x1705` | `entity_system_shutdown` | Full shutdown: flush normal, flush deferred, process deletes, free all pools | - -#### Save / Load (0x1851–0x1d21) -| Address | Name | Notes | -|---------|------|-------| -| `0x1851` | `event_queue_state_reset` | Zero ring buffer state tables (0x334e, 0x364e), queue ptrs (0x31c8/0x31ca) | -| `0x18ce` | `level_load` | Full level load: shutdown + reinit + deserialize all entities via vtable[12] | -| `0x1d21` | `save_game` | Serialize entity system: arrays + each entity via vtable[14]; magic check 0x3a21==0xed | - -#### PIT Timer / Hardware (0x2300–0x2975) -| Address | Name | Notes | -|---------|------|-------| -| `0x2300` | `pit_timer_program` | OUT 0x43, 0x36; OUT 0x40, lo; OUT 0x40, hi — raw PIT channel 0 program | -| `0x2316` | `pit_timer_set_hz` | Validates divisor <= 0xd688; stores at 0x39ce; calls pit_timer_program | -| `0x23a5` | `pit_timer_tick_handler` | Timer ISR: iterates 0x39d4 timer list, fires vtable callbacks per layer/mode | -| `0x25fc` | `timer_entity_active` | Check 0x3987/0x398b for active timer entity (mode-dependent) | -| `0x264c` | `timer_entity_get_current` | Get ptr from 0x3987 or 0x398b based on 0x3991 mode flag | -| `0x2668` | `timer_entity_enable` | Set ENABLED flag (0x400), inc counter, insert into timer list, reprograms PIT | -| `0x2745` | `timer_entity_disable` | Clear ENABLED, dec counter, reprograms PIT; if list empty calls interrupt_request_cancel | -| `0x2975` | `timer_recompute_hz` | Scan timer list; find smallest time_period (+0x38/+0x3a); call pit_timer_set_hz | - -#### Interrupt / Lock Control (0x283a–0x294b) -| Address | Name | Notes | -|---------|------|-------| -| `0x283a` | `interrupt_lock_acquire` | Re-entrant acquire on 0x31c7 (interrupt lock) | -| `0x2870` | `interrupt_lock_release` | Release 0x31c7 | -| `0x289b` | `entity_lock_acquire` | Re-entrant acquire on 0x39aa (entity system lock) | -| `0x28d5` | `entity_lock_release` | Release 0x39aa | -| `0x290d` | `interrupt_request_schedule` | Set deferred IRQ flags 0x39ab and 0x398f (or 0x39a9 in sync mode) | -| `0x294b` | `interrupt_request_cancel` | Clear IRQ request flags | - -#### Timer Loop / Deferred State (0x2a5f–0x2ad8) -| Address | Name | Notes | -|---------|------|-------| -| `0x2a5f` | `timer_event_loop` | **Main game loop**: polls player tick counter at 0x2de4; busy-waits; fires optional callback; stores delta to 0x3a00/0x3a02 | -| `0x2ac2` | `timer_deferred_reschedule` | If deferred mode flag 0x39b8 set, call reschedule | -| `0x2ad8` | `timer_snapshot_deferred` | Copy 0x39a9 → 0x39b8; call interrupt handler if 0x39a9 set | - -#### Event Queue (0x2c73–0x3364) -| Address | Name | Notes | -|---------|------|-------| -| `0x2c73` | `event_queue_drain` | Drain circular queue; call event_queue_dequeue while 0x31c8 != 0x31ca; reset state | -| `0x2ca2` | `mouse_button_check` | Return 1 if BIOS 0x31a4 bit 0x10 set AND 0x39af (mouse enable) set | -| `0x2cbc` | `stub_noop_2cbc` | Empty stub function | -| `0x2cd7` | `bios_keyboard_flags_write` | Write param to 0x400:0017 (BIOS keyboard flags at segment 0x40, offset 0x17) | -| `0x2cf2` | `input_event_dispatch` | Dispatch display event 0x10 to input list entities with flag 0x100 and 0xc bits set | -| `0x2dc3` | `event_queue_push` | Push event to circular queue (write ptr 0x31ca); calls event_queue_is_full check | -| `0x3276` | `keyboard_state_read` | INT 16h AX=0: read raw keyboard state into 0x31a4 | -| `0x328b` | `keyboard_acquire` | If not locked (0x31c6): INT lock, read keyboard, set lock flag | -| `0x32cc` | `keyboard_release` | If locked: unlock, clear 0x31c6 | -| `0x3304` | `event_queue_count` | Count pending events: 0x31ca - 0x31c8 (circular) | -| `0x333d` | `event_queue_is_full` | Return 1 if ((0x31ca+1) mod 32) == 0x31c8 | -| `0x3364` | `event_queue_dequeue` | Read from ring buffer (0x31cc + 0x31c8*0xc, entry size 0xc), advance read ptr | - -#### Event Subscription and Bitmask Helpers (0x34dd–0x3878) -| Address | Name | Notes | -|---------|------|-------| -| `0x34dd` | `event_queue_process_all` | Drain queue; for each event find listener entities in 0x39e3; call vtable[0x14] | -| `0x35e9` | `event_queue_set_mode` | Write low 2 bits to 0x334c; call keyboard_interrupt_call | -| `0x35fb` | `event_queue_set_param` | Write low 5 bits to 0x334d; call keyboard_interrupt_call | -| `0x360d` | `keyboard_interrupt_call` | INT 16h (raw BIOS keyboard services call) | -| `0x3630` | `entity_validate_indices` | Debug assert: verify entity+0x02 (slot_index) == pool position for all entities | -| `0x369b` | `typemask_set_bit` | Set bit at 0x3a04 + (param>>3), bit (param & 7) — entity type present bitmask | -| `0x36d4` | `typemask_clear_bit` | Clear bit in 0x3a04 bitmask | -| `0x370f` | `typemask_update` | If entity type has listeners (entity_find_first != 0): set bit; else clear | -| `0x3744` | `typemask_test_bit` | Test bit in 0x3a04; return 1 if entity type has registered listeners | -| `0x377d` | `event_subscription_set` | Set subscription bit in 0x3a08 buffer | -| `0x37b2` | `event_subscription_clear` | Clear subscription bit in 0x3a08 buffer | -| `0x37e9` | `event_subscription_update` | If entity has listeners: set bit; else clear (driven by entity_find_first result) | -| `0x3825` | `event_subscription_test` | Test subscription bit in 0x3a08; return 1 if subscribed | -| `0x3864` | `event_state_clear` | Zero entire 0x3a0c event use-count buffer (0x4000 bytes = 8192 uint16s) | -| `0x3878` | `event_use_count_increment` | Increment 64-bit counter at 0x3a0c[entity_event_type*4] | - -#### Input / Render List (0x38c2–0x3ae9) -| Address | Name | Notes | -|---------|------|-------| -| `0x38c2` | `input_event_broadcast` | Dispatch input event 0x40 to all render-list entities with flag 0x40; uses counter 0x39ad | -| `0x39a1` | `subscribe_to_render_list` | Add entity to 0x3a10 list; set flag bit 0x40; inc 0x3a1f | -| `0x3a13` | `unsubscribe_from_render_list` | Remove entity from 0x3a10; clear bit 0x40; dec 0x3a1f | -| `0x3404` | `subscribe_to_input_list` | Add entity to 0x39e3 list; check flag 0x100; set bit 0x80; inc 0x39c3 | -| `0x3477` | `unsubscribe_from_input_list` | Remove entity from 0x39e3; clear bit 0x80; dec 0x39c3 | -| `0x3a78` | `entity_lists_init` | Init three linked lists with sentinel vtable 0x3a89; write head vtable 0x2d10 | -| `0x3ae9` | `entity_lists_reset` | Call external reset + reinit 0x39e3 and 0x39d4 lists | - -### Entity Object Field Layout (as used in Seg21) - -| Offset | Field | Type | Description | -|--------|-------|------|-------------| -| `+0x00` | vtable_ptr | far ptr | Pointer to entity's vtable dispatch table | -| `+0x02` | slot_index | uint16 | Entity's own slot number in pool | -| `+0x04` | source_type | uint16 | Source/owner entity type (event matching) | -| `+0x06` | event_type | uint16 | Event type this entity handles | -| `+0x08` | flags_byte | uint8 | Low 5 bits = sprite group ID | -| `+0x0e` | capability_mask | uint16 | Bitmask of supported event capabilities | -| `+0x16` | state_flags | uint16 | bit3=DEAD, bit8=REGISTERED, bit9=ACTIVE, bit10=ENABLED, bit11=HAS_TIMER, bit13=IS_IRQ_HANDLER | -| `+0x18` | flags2 | uint16 | bit6=IN_RENDER_LIST, bit7=IN_INPUT_LIST, bit9=DEFERRED | -| `+0x1e` | priority_chain | far ptr | Priority chain entries (entity_find_by_priority) | -| `+0x20` | priority_count | uint16 | Count of priority chain entries | -| `+0x38` | time_period_lo | uint16 | Timer period low word (PIT frequency calc) | -| `+0x3a` | time_period_hi | uint16 | Timer period high word | - -### Vtable Layout (Seg21 usage) - -| Slot | Byte offset | Prototype | Purpose | -|------|-------------|-----------|---------| -| [6] | `+0x0c` | `handle_event(entity, CS, type, param)` | Event callback | -| [8] | `+0x10` | `update(entity, CS, capability_mask)` | Per-tick update | -| [10] | `+0x14` | `finalize(entity, CS)` | Cleanup/shutdown | -| [12] | `+0x18` | `load(entity, CS, file_ptr, CS)` | Deserialize from save | -| [14] | `+0x1c` | `save(entity, CS, file_ptr, CS)` | Serialize to save | -| [16] | `+0x20` | `set_backref(entity, CS, list_ptr)` | Set back-reference | -| [20] | `+0x28` | `dispatch_callback(entity, CS, event_id, 0, data_ptr)` | Generic dispatch | - -### Key Global Data (Seg21 — additions to DS) - -| Address | Name | Description | -|---------|------|-------------| -| `0x31a4` | bios_key_state | Raw INT 16h keyboard state | -| `0x31c6` | keyboard_lock | Keyboard acquired flag | -| `0x31c7` | interrupt_lock | Interrupt lock flag (re-entrant) | -| `0x31c8` | queue_read_ptr | Event queue read index (0–31) | -| `0x31ca` | queue_write_ptr | Event queue write index | -| `0x31cc` | event_queue_base | Ring buffer, 32 entries × 0xc bytes | -| `0x334c` | queue_mode | Event queue mode bits (0–1) | -| `0x334d` | queue_param | Event queue param bits (0–4) | -| `0x39b0` | entity_list | Far ptr to entity far-ptr array (count×4) — **shared with seg001** | -| `0x39b4` | entity_data | Far ptr to group/sprite-ID array (count×2) | -| `0x39b9` | entity_max_count | Max capacity of entity pool | -| `0x39bb` | entity_count | Total registered entity count | -| `0x39c9` | active_layer | Current active entity layer/group ID | -| `0x39ca` | entity_registry | Far ptr to vtable dispatch array (count×4) — **shared with seg001** | -| `0x39ce` | pit_divisor | Current PIT timer divisor | -| `0x39d4` | timer_list | Intrusive linked list: timer-dispatch entities | -| `0x39e3` | input_list | Intrusive linked list: input-handler entities | -| `0x3a04` | typemask_buf | Far ptr to entity type present bitmask (0x480 bytes) | -| `0x3a08` | evt_sub_buf | Far ptr to event subscription bitmask (0x2400 bytes) | -| `0x3a0c` | evt_state_buf | Far ptr to event use-count table (0x4000 bytes) | -| `0x3a10` | render_list | Intrusive linked list: render-callback entities | -| `0x3a21` | save_magic | Must be 0xed (-0x13) for valid save | -| `0x3a70` | default_registry_vtable | Default vtable written to entity_registry slots on register | -| `0x3a89` | list_sentinel_vtable | Sentinel vtable written to list head nodes | - ---- +# Crusader: No Remorse — Decompilation Notes + +This file is an index. Detailed notes have been split into the `docs/` folder by topic. + +## Documentation Structure + +| File | Contents | +|------|----------| +| [docs/overview.md](docs/overview.md) | Binary overview, installed copy findings, address space layout, NE fixup placeholder, segment map, NE import details, next steps | +| [docs/phar-lap-extender.md](docs/phar-lap-extender.md) | DOS extender architecture, named functions (entry, loading, memory, I/O, interrupts), key string references | +| [docs/ne-segment1.md](docs/ne-segment1.md) | NE Segment 1 full analysis: cursor, input, entity system, shot lifecycle, combat, weapons, AI, player/HUD, destruction, entity constants, vtable index, cheat system | +| [docs/raw-porting-progress.md](docs/raw-porting-progress.md) | seg091 RNG, 0x4588 callback lifecycle batches 1-6, 0007 gameplay helper batches, snap_entity_to_ground, AI sweep, animation/range/command globals, seg043 boundary recovery | +| [docs/raw-000e.md](docs/raw-000e.md) | 000e parser helper cluster (record table init/parse/dispatch), 000e RIFF/animation cluster (animation object field map, RIFF format, constructor variants) | +| [docs/raw-0007-rendering.md](docs/raw-0007-rendering.md) | Draw list node format and functions, world-to-screen isometric, tile visibility system, scroll/camera functions, scroll region table, save slot system, string/memory utilities, coordinate transform deep analysis | +| [docs/raw-0008-000c.md](docs/raw-0008-000c.md) | 0008 dispatch helpers (init, pair-sync, flag helpers, word-list, gate-callbacks) and 000c state machine (tick dispatch, flag guards, palette fade, mini-VM, cursor nav) | +| [docs/raw-000a-000d.md](docs/raw-000a-000d.md) | 000d proximity/visibility buckets, 000a tracked handles, cache manager, init/shutdown, seg082 allocator, seg137/138 palette helpers, seg004/005 startup, 0x4588 object-role evidence | +| [docs/far-call-targets.md](docs/far-call-targets.md) | Top-104 most-called far-call targets (Tiers 1-5, ranks 1-104), supporting functions discovered, analysis gaps and seg043 reconciliation | diff --git a/docs/far-call-targets.md b/docs/far-call-targets.md new file mode 100644 index 0000000..440fea1 --- /dev/null +++ b/docs/far-call-targets.md @@ -0,0 +1,179 @@ +# Far-Call Targets: Top-104 Most-Called Functions + +Content extracted from `crusader_decompilation_notes.md`. Named via systematic analysis of 11,692 NE relocation fixup entries — the functions most frequently called through the `CALLF 0x0000:ffff` thunk mechanism. + +--- + +## Tier 1: Ranks 1–20 (73+ callers) + +| Rank | Address | Name | Calls | Description | +|------|---------|------|-------|-------------| +| 1 | `000a:44fd` | `seg091_func_00fd` | 331 | Recovered boundary. Shares init flag `0x44a4` with `runtime_init_or_abort`; thunk-heavy non-returning wrapper. | +| 2 | `0003:ac7e` | `mem_alloc` | 272 | Allocation wrapper → seg082:0000 (`0009:a200`) | +| 3 | `0008:dbec` | `entity_word_list_destroy` | 238 | Frees entity word-list buffer. | +| 4 | `0003:a751` | `mem_free` | 207 | Free wrapper → seg082:007a (`0009:a27a` = `mem_free_checked`) | +| 5 | `0008:bb4f` | `mem_alloc_far` | 174 | Thin wrapper → `mem_alloc` | +| 6 | `0003:a897` | `far_memcpy` | 165 | REP MOVSW + trailing MOVSB | +| 7 | `0005:088f` | `entity_get_type_word` | 130 | Returns type word from table `0x7df9` indexed by slot | +| 8 | `000b:358d` | `sprite_tree_accumulate_pos` | 122 | Recursively sums X/Y offsets (`+0x21/+0x23`) through linked child nodes (`+0x19/+0x1b`), copies 8-byte position block via `far_memcpy` | +| 9 | `0008:ce3d` | `entity_call_two_vtables` | 118 | Calls vtable[`+4`] at entity+`0x1e` and `+0x28` | +| 10 | `0004:26cd` | `nop_void_stub` | 118 | Empty function, returns void | +| 11 | `0008:ce00` | `entity_call_two_vtables_base` | 117 | Calls vtable[0] at entity+`0x1e` and `+0x28` | +| 12 | `0008:bb8c` | `entity_check_flag_0x4000` | 115 | Short-circuits if flag `0x4000` set at `+0x16` | +| 13 | `0008:cda7` | `entity_free_both_word_lists` | 115 | Frees word lists at entity+`0x1e` and `+0x28` if optional pointers at `+0x24/+0x26` and `+0x2e/+0x30` non-null. Both call `entity_word_list_free_existing`. | +| 14 | `0004:26d2` | `nop_void_stub_b` | 111 | Empty function, returns void | +| 15 | `000a:45fe` | `runtime_init_or_abort` | 108 | Reentrancy-guarded init. Flag at `0x44a4`; flushes via `FUN_000a_4a56`, then calls `crt_exit_wrapper(1)`. Hidden code gap `0x4616-0x4643`. | +| 16 | `0004:3324` | `nop_return_zero` | 95 | Returns 0 | +| 17 | `0009:c563` | `event_queue_push` | 82 | Circular buffer enqueue. Ring index (`+0xe`) masked `0x3f`, slot masked `0xfff8`. Writes event type word + data byte pair. | +| 18 | `0005:c448` | `list_remove_and_free` | 74 | Unlinks node from linked list via `FUN_0005_c495`, optionally calls `mem_free` if bit 0 of flags set | +| 19 | `000b:2e00` | *(no function in Ghidra)* | 74 | Analysis gap at seg109:0000. Needs manual function creation. | +| 20 | `0009:1f12` | `dos_file_lseek` | 73 | DOS LSEEK (INT 21h AH=42h) wrapper with error reporting to `0x867a` | + +--- + +## Tier 2: Ranks 21–40 (56–73 callers) + +| Rank | Address | Name | Calls | Description | +|------|---------|------|-------|-------------| +| 21 | `0009:3600` | `rotating_buffer_advance` | 73 | Advances 5-slot circular counter at `0x3eb6`, zeros pointer in table at `0x867c`, dispatches via jump table | +| 22 | `0009:943a` | `entity_rect_compare_and_dispatch` | 68 | Compares bounding rectangles of two entities, dispatches based on flag bits `4/2/1` at `+0x16` | +| 23 | `0009:1e61` | `dos_file_close` | 65 | DOS file close (INT 21h), error reporting, sets handle to `-1` | +| 24 | `0005:e252` | *(unnamed — unclear)* | 65 | Copies 11 words from Phar Lap extender area (`FUN_0000_12c6+5`), then calls thunk. Interrupt/trampoline setup? | +| 25 | `0003:dbcc` | `crt_format_string` | 64 | MetaWare High C formatting wrapper. Calls `FUN_0003_bb92` with runtime format dispatch table. | +| 26 | `0007:5a00` | *(no function in Ghidra)* | 64 | High-traffic raw target at `seg043:0000`. Earlier `debris_spawn` / seg001 mapping was rejected after checking relocation labels. Still needs manual function creation and direct analysis. | +| 27 | `000a:4742` | `assert_buffer_valid` | 63 | Validates handle: asserts `param_2 == cookie` at `0x45a6` and `param_1 < limit` at `0x87e0` | +| 28 | `0009:9216` | `entity_conditional_render_dispatch` | 63 | Checks entity flag bits 4 and 1 at `+0x16`, dispatches to vtable[`+0xc`] or thunk | +| 29 | `0008:cb2c` | `entity_flag20_clear_and_update_target` | 61 | Clears flag bit `0x20`, writes target `+0x12/+0x14`, calls refresh | +| 30 | `0008:cb5c` | `entity_flag20_set_and_init_target` | 61 | Sets flag bit `0x20`, inits target if zero, calls refresh | +| 31 | `0007:7306` | `entity_create_stack_object` | 58 | Allocates `0xCC` bytes on stack, inits via `object_init_zero_fields` (`0005:c400`), calls thunk | +| 32 | `0007:8709` | `entity_mark_dirty_and_sync_tile_aux` | 58 | Syncs tile aux, sets flag bit `0x04` at `+0x42` | +| 33 | `0007:87c5` | `entity_set_flag20_from_field42` | 58 | Reads entity `+0x42/+0x44`, calls `entity_flag20_set_and_init_target` with those values | +| 34 | `0007:8508` | `entity_table_lookup_and_dispatch` | 58 | Searches table at `0x2b46`, dispatches via indirect jump | +| 35 | `0007:8920` | `entity_call_vtable_slot0c` | 58 | Calls vtable entry at `+0x0c` | +| 36 | `000a:b988` | `sprite_node_get_or_traverse` | 57 | If child pointer at `+0x19/+0x1b` non-null, traverses; otherwise returns leaf value | +| 37 | `0003:a98b` | `crt_signed_div32` | 56 | Entry: adjusts near→far stack, sets `CX=0` (signed quotient), jumps to `crt_div32_impl` | +| 38 | `000a:7b44` | `nop_return_void_a` | 56 | Empty function (default vtable slot?) | +| 39 | `000a:7b49` | `nop_return_void_b` | 56 | Empty function (default vtable slot?) | +| 40 | `000a:7b53` | `nop_return_void_c` | 56 | Empty function (default vtable slot?) | + +--- + +## Supporting Functions Discovered + +| Address | Name | Description | +|---------|------|-------------| +| `000b:3a00` | `sprite_tree_sum_x_offset` | Recursive: sums field `+0x21` through child chain `+0x19/+0x1b` | +| `000b:3a35` | `sprite_tree_sum_y_offset` | Recursive: sums field `+0x23` through child chain `+0x19/+0x1b` | +| `0003:a845` | `crt_exit_wrapper` | Calls `crt_exit_impl(param,0,0)` | +| `0003:a7ee` | `crt_exit_impl` | Full C exit: atexit handlers, stdio flush, MetaWare runtime cleanup | +| `0003:a9a8` | `crt_div32_impl` | 32-bit division core. CX flags: bit0=unsigned, bit1=modulo, bit2=negate | +| `0005:c400` | `object_init_zero_fields` | Zeros fields `+0x25`, `+0x29`, `+0x31`, `+0x32` of a struct. Returns pointer. | +| `000a:4440` | `joystick_read_axes_and_buttons` | Reads PC game port `0x201`. Times axis responses, reads button nibble to `0x44a2` | +| `000b:3380` | `sprite_node_is_dirty` | Checks flags at `obj+0x29 & 3 == 1 or 3` → returns bool | +| `000b:33a6` | `sprite_node_mark_dirty` | If not dirty, calls `FUN_000b_3965` with `mode=3` to invalidate | + +--- + +## Tier 3: Ranks 41–60 (42–56 callers) + +| Rank | Address | Name | Calls | Description | +|------|---------|------|-------|-------------| +| 41 | `000a:7b58` | `nop_return_zero_b` | 56 | Returns 0 (default vtable slot) | +| 42 | `000b:3ab2` | `sprite_node_dispatch_event` | 56 | Large event dispatch: checks event type (`2/4/8/0x100`), updates global focus ptr at `[0x4fd0:4fd2]`, dispatches via vtable methods `[+0x14/+0x18/+0x20/+0x24]` by event code. Switch table for 16 event types. | +| 43 | `000a:48ff` | `rng_next_modulo` | 55 | Advances seg091 RNG state and returns the result modulo the requested bound; returns 0 when bound is 0. | +| 44 | `000b:3362` | `sprite_tree_unwind_check` | 55 | Validates `SS == param_2` (stack segment guard), then decrements global counter at `[0x4fd6]` | +| 45 | `000b:40ee` | `sprite_node_update_and_dispatch` | 55 | If `sprite_node_is_dirty` returns false: marks dirty, calcs accumulated bounds via `sprite_tree_get_accumulated_bounds` (`3ed8`), then dispatches via thunk | +| 46 | `000a:7b5f` | `vtable_stub_trampoline` | 55 | Calls through fixup thunk (forwarder to another function) | +| 47 | `000a:7b78` | `nop_return_void_e` | 55 | Empty function (default vtable slot) | +| 48 | `000a:7b7d` | `nop_return_void_f` | 55 | Empty function (default vtable slot) | +| 49 | `000a:7b4e` | `nop_return_void_d` | 54 | Empty function (default vtable slot) | +| 50 | `000b:330c` | `sprite_tree_dispatch_wrapper` | 52 | Pure thunk wrapper: calls through fixup | +| 51 | `0009:2034` | `dos_file_seek` | 51 | INT 21h AH=42h (LSEEK). Takes file object ptr, extracts handle at `obj+4`, seeks to offset param. Error reporting to `[0x867a]`. | +| 52 | `0005:0466` | `entity_resolve_slot_ptr` | 50 | *(pre-existing name)* | +| 53 | `0003:a880` | *(no function in Ghidra)* | 49 | Analysis gap in CRT segment | +| 54 | `0006:170c` | `tile_class_get_byte` | 47 | Looks up class data: indexes into table at `[0x7e1e]` by `(*param_1 * 0x79)`, returns byte at offset `+0xc` | +| 55 | `000b:4097` | `sprite_dispatch_with_event` | 45 | Pushes event params + global `[0x49c2:0x49c4]`, calls thunk | +| 56 | `0005:02c1` | `entity_is_type_match` | 43 | Compares `*param_1` against global at `[0x27c8]`, returns 1 if equal, 0 otherwise | +| 57 | `0003:ad75` | *(no function in Ghidra)* | 43 | Analysis gap in CRT segment | +| 58 | `000a:e709` | `render_dispatch_by_flag` | 43 | Dispatches between two thunk paths based on boolean flag at `stack+0x10` | +| 59 | `0003:d0ff` | `crt_sprintf_wrapper` | 42 | Calls `FUN_0003_bb92` (format engine) with rearranged params and string constant at `0x67ac` | +| 60 | `000b:326e` | `sprite_node_destroy` | 42 | Destructor: sets vtable ptr to `0x501a`, clears global `[0x4fd0:4fd2]` if self, releases child nodes, calls `mem_free` via thunk | + +--- + +## Analysis Gaps + +| Address | NE Segment | Callers | Notes | +|---------|-----------|---------|-------| +| `000a:44fd` | seg091:00fd | 331 | Recovered as `seg091_func_00fd`; thunk-heavy init wrapper sharing flag `0x44a4`. | +| `000b:2e00` | seg109:0000 | 74 | Start of segment 109. | +| `0007:5a00` | seg043:0000 | 64 | Start of segment 43. Earlier seg001 `debris_spawn` port was rejected; still needs manual function creation and direct analysis. | +| `000a:48ff` | seg091:04ff | 55 | Recovered as `rng_next_modulo`; bounded wrapper around seg091 RNG state advance. | +| `0003:a880` | seg005:0880 | 49 | In CRT segment near `far_memcpy`. | +| `0003:ad75` | seg005:0d75 | 43 | In CRT segment near `mem_alloc`. | +| `000a:454d` | seg091:014d | 32 | Recovered as `seg091_func_014d`; init/context helper using the `0x45a6` cookie/context global. | + +**seg043 reconciliation:** +- The earlier standalone seg001 port hypothesis in this subrange was wrong. +- Relocation data places raw `0007:5a00` at `seg043:0000`, and the named helper at `0007:5b6f` sits at `seg043:016f`. +- Because of that segment placement, standalone seg001 names such as `debris_spawn` (`0x7490`) and `entity_die` (`0x75ff`) should NOT be ported into this raw range. +- `0007:5b6f` no longer exists as a function after the PyGhidra repair pass. Its behavior now lines up with the repaired function `0007:5b7a = entity_set_at_target_update_facing`. +- The currently repaired functions at `0007:5a90` and `0007:5c1c` should keep their positional names until a later pass resolves the thunk-heavy bodies more clearly. + +--- + +## Tier 4: Ranks 61–80 (29–42 callers) + +| Rank | Address | Name | Calls | Description | +|------|---------|------|-------|-------------| +| 61 | `000b:30a5` | `sprite_tree_forward_wrapper` | 42 | Pure thunk forwarder | +| 62 | `0008:bc27` | `entity_set_event_type_checked` | 41 | Sets event code at `+0x06` with range/timer checks | +| 63 | `0008:d214` | `entity_dispatch_entry_ctor_vtbl_3aa6` | 40 | Constructor: alloc `0x40`, vtbl `3AA6`, flag `0x200` | +| 64 | `0005:1565` | `entity_action_by_type_dispatch` | 39 | Checks entity type against whitelist (`0x432,0x5a0,0x1fd,0x1fe,0x8f,0x59f,0x2b3,0x2ca`), dispatches by flags at `[0xc76]` and `[0x85f]` | +| 65 | `0008:4bba` | `channel_slot_enable` | 39 | Sets enable byte=1 in 5-slot table at `0x84ca` (slot * `0xd` stride) | +| 66 | `0009:6f5a` | `vga_palette_write` | 38 | Writes RGB triplets to VGA DAC (port `0x3C8/0x3C9`). Range `param_2..param_3` from palette data at `*param_1` | +| 67 | `0009:8ef6` | `line_draw_dispatch` | 38 | Compares `abs(dx)` vs `abs(dy)` to determine major axis, dispatches to appropriate line draw routine | +| 68 | `000a:7b30` | `nop_return_void_g` | 38 | Empty function (default vtable slot) | +| 69 | `000a:7b3f` | `nop_return_void_h` | 38 | Empty function (default vtable slot) | +| 70 | `0009:6e7f` | `palette_free_if_set` | 35 | Frees existing palette data if ptr non-null, checks alignment | +| 71 | `000a:7b35` | `nop_return_void_i` | 35 | Empty function (default vtable slot) | +| 72 | `0009:c433` | `event_queue_align_index` | 34 | Returns `param_1 & 0xFFF8` — aligns ring index to 8-byte event slot boundary | +| 73 | `0009:2156` | `dos_file_get_size` | 33 | Saves file position, does INT 21h AH=42h AL=02 (seek to end), restores position. Returns file size in DX:AX | +| 74 | `000a:2c41` | `list_iterate_next` | 33 | Linked list iterator: if `*out==0` returns first from `obj+2`; else follows next at `ptr+2/+4`. Returns bool (has more) | +| 75 | `000a:454d` | `seg091_func_014d` | 32 | Recovered boundary. Shares flag `0x44a4`; checks optional long argument against the `0x45a6` cookie/context global. | +| 76 | `000b:2446` | `sprite_clear_redraw_flag` | 31 | Clears flag at `obj+0x17e`, then dispatches via thunk | +| 77 | `0005:1238` | `entity_get_class_word` | 30 | Looks up table at `[0x7e01]` indexed by `*param_1 * 2`, returns word. Sister of `entity_get_type_word` (which uses `[0x7df9]`) | +| 78 | `000b:1446` | `display_null_check_dispatch` | 30 | Null-checks far ptr params, dispatches to different thunks based on result | +| 79 | `000d:85da` | `vga_palette_set_all_black` | 29 | Sets byte at `global_obj[0x6828]+0x40 = 1` if global non-null, then calls thunk. *(Note: earlier name `map_object_set_dirty_flag` was incorrect; corrected in seg137 analysis.)* | +| 80 | `0005:1511` | `entity_destroy_trampoline` | 29 | Pure thunk forwarder to entity destruction | + +--- + +## Tier 5: Ranks 81–104 (24–29 callers) + +| Rank | Address | Name | Calls | Description | +|------|---------|------|-------|-------------| +| 81 | `0009:1c00` | `dos_file_handle_init` | 29 | Inits 6-byte file handle struct: dword=0, word+4=`0xFFFF` (invalid). Aborts on null ptr | +| 82 | `0008:75f3` | `entity_get_ptr` | 29 | Looks up entity far ptr from table at `DS:0x39b0`, indexed by `id*4` | +| 83 | `0006:0208` | `entity_class_get_flag4` | 29 | Returns bit 2 of classinfo byte at `[0x7e1e]+*p1*0x79+0x13` → 0 or 1 | +| 84 | `000a:30d7` | `list_node_set_if_context` | 29 | Sets node fields `+2/+4` if params match context globals at `0x45a6/0x45a8` | +| 85 | `0009:c45f` | `object_init_and_get_next` | 29 | Calls `object_init_zero_fields` then returns `*(result+2)` — init+accessor combo | +| 86 | `0004:d7a0` | `object_deref_get_word4` | 28 | Dereferences far ptr chain: returns word at `*(*(param_1)+4)` | +| 87 | `000a:5276` | `debug_check_flag_45aa` | 28 | If byte at `DS:0x45aa` non-zero, calls thunk (diagnostic/assert check) | +| 88 | `0003:d94f` | `far_memset` | 28 | Wrapper reordering params for CRT memset impl at `0003:d92b` (odd-aligned, word-fill loop) | +| 89 | `000a:7b3a` | `nop_return_void_j` | 28 | Empty function (default vtable slot) | +| 90 | `0008:ca18` | `entity_pair_sync_b` | 27 | Pairwise sync wrapper direction B | +| 91 | `0008:bd20` | `entity_sprite_set_target_pos` | 27 | Sets flag `0x1000`, copies player pos to entity `+0x0a/+0x0c` | +| 92 | `0009:3ceb` | `buffer_release_and_dispatch` | 27 | Frees far ptr at `obj+0x3b` if set, nulls it; conditionally dispatches on bit 0 | +| 93 | `0005:09b4` | `entity_get_flags_byte` | 27 | Reads byte from `[0x7dfd]+id`, conditionally extends with classinfo byte at `[0x7e1e]+id*0x79+0xf` | +| 94 | `0005:0fbb` | `entity_lookup_sprite_word` | 27 | Returns word from `[0x7e05]+*p1*2` — sprite/visual index table | +| 95 | `0008:d27e` | `entity_dispatch_trampoline_b` | 26 | Pure forwarder thunk (CALLF thunk only) | +| 96 | `0005:0376` | `entity_resolve_base_type` | 26 | Walks entity class hierarchy (bit 8 in `[0x7e01]`) via `[0x7ded]`, returns base type from `[0x7df1]` | +| 97 | `000b:2492` | `sprite_redraw_if_needed` | 26 | If redraw flag at `+0x17e` is clear, calls update routine + thunk | +| 98 | `0003:e4d3` | `dos_file_open_wrapper` | 26 | Zeros output byte, delegates to file open impl at `0003:bb92` | +| 99 | `0005:033e` | `entity_resolve_base_parent` | 25 | Same hierarchy walk as `entity_resolve_base_type` but returns parent from `[0x7ded]` | +| 100 | `000a:87fd` | `render_clip_rect_to_viewport` | 25 | Clips 4 rect params to viewport bounds at `[0x4014]`, sets dirty flag at `0x8a16`, increments draw counter at `0x4716` | +| 101 | `0005:3cf5` | `entity_class_has_flag2000` | 25 | Returns `(entity_get_class_word(slot) & 0x2000) != 0` | +| 102 | `0009:80db` | `bbox_overlap_test` | 25 | Boolean rectangle overlap test for two 4-word bbox structs; unlike `bbox_intersect`, it does not write back an intersection | +| 103 | `000d:cc00` | `entity_compute_proximity_or_visibility_bucket` | 25 | Returns `0x40` if entity is null or projected bbox overlaps viewport; otherwise buckets world-distance from current reference entity (`0x7e22`) into `0x32/0x20/0x10/0x08` | +| 104 | `000d:d413` | `entity_refresh_recent_proximity_or_visibility_buckets` | 24 | Recomputes bucket values for the last four active entries in `0x69ac` and notifies backing handles via `000a:6343` when a bucket changes | diff --git a/docs/ne-segment1.md b/docs/ne-segment1.md new file mode 100644 index 0000000..41c80e8 --- /dev/null +++ b/docs/ne-segment1.md @@ -0,0 +1,392 @@ +# Crusader: No Remorse — NE Segment 1 Game Logic + +This file covers the standalone analysis of NE Segment 1 (`seg001_code_off_37600_len_8400.bin`), imported as a raw binary at base `0x0000`, language `x86:LE:16:Protected Mode`. All 35+ identified functions have been renamed and annotated in Ghidra. + +## Cursor Subsystem (0x0060–0x0d5f) + +| Address | Name | Description | +|----------|---------------------------|-------------| +| `0x0060` | `cursor_update_hover` | Hover update: if mouse active & entity set, calls cursor_set_target | +| `0x00e9` | `cursor_set_target` | Positions cursor on entity, updates sprite + direction visual | +| `0x0322` | `cursor_shutdown` | Frees cursor resources, resets state | +| `0x0398` | `cursor_animation_update` | Angle-based cursor rotation (0x27d4, 0-359 → 0x168=360). Sprite at 0x27d6 | +| `0x050f` | `cursor_draw_tick` | Per-frame cursor draw (calls cursor_animation_update if dirty) | +| `0x0c24` | `action_key_valid` | Returns 1 if action code (param_1) is a valid game action key | +| `0x0d5f` | `cursor_direction_input` | Arrow-key input: rotates cursor angle, updates direction sprite | + +## Input Handling + +| Address | Name | Description | +|----------|-------------------------|-------------| +| `0x0526` | `input_keyboard_handler`| Key dispatch: 0x01=LMB, 0x0D/0x0C=scroll, 0x2C=save, 0x44=load | + +## Cursor State Data (at DS:0x27xx) +| Address | Field | Meaning | +|---------|-------|---------| +| `0x27c4` | cursor_sel1 | Selection counter 1 | +| `0x27c6` | cursor_sel2 | Selection counter 2 | +| `0x27c8` | current_entity | Handle to currently targeted entity | +| `0x27ca–0x27ce` | cursor_state | Cursor interaction state bytes | +| `0x27d0` | cursor_entity_type | Current entity type index | +| `0x27d2` | z_offset | Z-height offset for terrain adjustment | +| `0x27d4` | cursor_angle | Rotation angle (0–359) | +| `0x27d6` | cursor_sprite | Sprite handle for cursor visual | +| `0x27d8` | cursor_dirty | Set when cursor needs redraw | +| `0x27d9` | cursor_active | Master cursor enabled flag | +| `0x27da` | cursor_no_turn | Flag disabling cursor rotation | +| `0x27ed` | difficulty | Enemy accuracy divisor (used in projectile_init_vector) | +| `0x27fd` | hard_mode | Two-step mode (combat vs. explore) | +| `0x27fe` | move_mode | Movement phase flag | +| `0x27ff` | mouse_active | Mouse/input system active | +| `0x2800`–`0x2811` | various | UI state: active sprite, facing byte, cur entity handle | +| `0x283f`/`0x2841` | menu_obj_ptr | Active menu/dialog object far pointer | +| `0x2844` | in_save | In-progress save game flag | +| `0x290e` | entity_count | Number of active entities | +| `0x2910`–`0x2947` | snap_type_ids[10] | Entity types that snap-to-ground in snap_entity_to_ground | + +## Input / Action Dispatch + +| Address | Name | Description | +|----------|---------------------------|-------------| +| `0x2420` | `entity_command_dispatch` | Dispatches player commands to target entity; reads 0x27d0, 0x2de4, sends events 0x14/0xf, handles state machine 0x27ca/0x27cd/0x27ce | +| `0x279a` | `cheat_code_check` | Checks input record byte+1 against five bytes starting at `0x2833`; toggles `0x844`/`0x6045`, emits helper/event code `0x103` | + +## Menu / Event Callbacks + +| Address | Name | Description | +|----------|---------------------------|-------------| +| `0x2e53` | `cursor_event_notify_a` | Vtable thunk: forwards event to 0x27ca area handler | +| `0x2e96` | `cursor_event_notify_b` | Vtable thunk: forwards event to 0x27ca area handler (alt path) | +| `0x2ed9` | `menu_event_notify_a` | Vtable thunk: forwards event to 0x2843 (near menu object) | +| `0x2f0c` | `menu_event_notify_b` | Vtable thunk: forwards event to 0x2843 (alt path) | +| `0x2ff3` | `stub_noop_2ff3` | Empty stub, noop | +| `0x2ff8` | `entity_collision_callback_a` | Calls touch handler then func(entity+0x1e, seg, 2); opt: extra func if param_3&1 | +| `0x3046` | `set_active_menu` | Writes param_1/param_2 to 0x283f/0x2841 (active menu far pointer) | +| `0x3058` | `entity_collision_callback_b` | Same as entity_collision_callback_a (second vtable entry) | + +## Entity System (0x2401–0x5a50) + +| Address | Name | Description | +|----------|------------------------------|-------------| +| `0x2401` | `clear_cursor_selection` | Zeros 0x27c4/0x27c6 (selection counters) | +| `0x2899` | `cursor_switch_target_entity`| Switches cursor target: unloads old entity, loads new, re-registers | +| `0x29d8` | `get_z_offset` | Returns func() + *(0x27d2) = adjusted Z/height | +| `0x2a09` | `is_player_in_range` | Checks if entity is at player (0x2de4) X/Y +/-0xf0 range | +| `0x2a46` | `entity_ai_update_loop` | Loops entities 2–255, checks visibility, triggers fire/move | +| `0x2c36` | `ui_update_callback` | Calls cursor_state_clear then vtable[2] on menu object | +| `0x2c6b` | `cursor_state_clear` | Clears cursor state bytes 0x27ca–0x27ce, clears entity flag bit1 | +| `0x2c92` | `dialog_spawn` | Allocates dialog object, vtable=0x28b5, registers callback at 0x39ca | +| `0x2d47` | `entity_pick_handler` | Handles entity selection or save-game trigger (type 0x38d) | +| `0x2df9` | `clear_active_menu` | Zeros 0x283f/0x2841 (active menu far pointer) | +| `0x2e18` | `game_mode_init` | Initializes game mode state, resets sprite/cursor/menu state | +| `0x2f3f` | `entity_table_set_sprite` | Reads 0x7df9+slot*2; writes entity type table 0x7e1e[slot*0x79+0x0d]=param_2, +0x10=0 | +| `0x3c97` | `snap_entity_to_ground` | If entity type in snap_type_ids[10], resets Z to 0xf0 and adjusts XY | +| `0x3d6e` | `spawn_entity_checked` | Spawns entity with explosion pool limit check (0x84c0, 0x84c2) | +| `0x3f2f` | `entity_spawn` | Allocates entity, vtable=0x29aa/0x39ca, positions it | +| `0x40d4` | `entity_remove` | Removes entity: destroys sprites, clears 0x2802/0x2804 if needed | +| `0x4172` | `entity_animation_frame_update`| Advances/retreats anim frame ([+0x1d]) toward target [+0x1c/0x1b] based on quality | +| `0x42f8` | `stub_noop_42f8` | Empty stub, noop | +| `0x42fd` | `entity_registry_decrement` | Calls cleanup func then decrements entity count at 0x290e | +| `0x4314` | `entity_sprite_move_delta` | Updates shot sprite handle (entity+0x3f) position by adding delta params | +| `0x4552` | `entity_set_position` | Sets entity+0x3e (type_handle), world_x/y (entity+0x45/47), base_x/y (entity+0x4f/51) | +| `0x452b` | `shot_set_spawn_pos` | Calls entity_set_position then sets entity+0xbe = param_3 (extra spawn field) | +| `0x4591` | `entity_try_place` | entity_set_position with validation — position only set if placement succeeds | +| `0x5092` | `entity_deactivate` | Calls vtable[2] to deactivate, or finds in registry and removes | +| `0x5a50` | `entity_list_contains` | Checks if entity ptr exists in active entity list at 0x294c | +| `0x5b05` | `stub_noop_5b05` | Empty stub, noop | + +## Entity Object Layout (NE Segment 1 entities) +| Offset | Field | Meaning | +|--------|-------|---------| +| `+0x00` | vtable_ptr | Vtable pointer (0x29aa for generic, 0x2a57 for debris) | +| `+0x02` | slot_index | Entity slot index (used for registry at 0x39ca) | +| `+0x04` | entity_type | Entity type ID | +| `+0x19`/`+0x1a` | flags | Entity flags (bit0=debris, bit1=cleared by cursor_state_clear, bit6=active, bit8=valid) | +| `+0x1b` | vel_x | X velocity (clamped ±0x20) | +| `+0x1c` | vel_y | Y velocity (clamped ±0x20) | +| `+0x1d` | vel_z | Z velocity (clamped ±0x10) | +| `+0x1e` | fire_handle | Weapon/fire handle | +| `+0x1f` | is_enemy | 1 if entity is an enemy type | +| `+0x20`/`+0x21` | pos_frac_x/y | Fractional position (sub-tile) for movement | +| `+0x22` | pos_frac_z | Fractional Z | +| `+0x36` | weapon_type | Active weapon type ID | +| `+0x38` | facing | Current facing direction (0–15) | +| `+0x3c` | sprite_handle | Sprite for this entity | +| `+0x3f` | shot_sprite | Sprite handle for active projectile (0xFFFF = none) | +| `+0x45`/`+0x47`/`+0x49` | world_x/y/z | Current world position (integer) | +| `+0x4f`/`+0x51`/`+0x53` | base_x/y/z | Base/spawn position | +| `+0x54`/`+0x56`/`+0x58` | prev_x/y/z | Previous frame position | +| `+0x59` | attack_active | Attack in progress flag | +| `+0x5a` | at_target | Reached target flag | +| `+0x5e`–`+0x65` | delta_x/y/z/high | Per-step movement deltas (fixed point) | +| `+0x66`/`+0x68` | step_active | Stepping active (1=yes, 0=off) | +| `+0x6a`/`+0x6c` | weapon_slot/dist | Weapon slot and total travel distance | +| `+0x6e` | delta_z | Alt Z delta | +| `+0x70` | projectile_type | Projectile class (2/0xD=splash, 3=spread, 5=homing, 0xE=chain) | +| `+0x72`/`+0x74`/`+0x76` | target_x/y/z | Target position with deviation | +| `+0x77` | target_entity | Target entity handle | +| `+0x79` | secondary_pos | Secondary position struct pointer | +| `+0xad` | owner_entity | Owning entity handle | +| `+0xaf` | shot_owner_flags | Shot owner (entity/player) | +| `+0xb1` | bounce_count | Bounce counter (used with homing, type 5) | +| `+0xb3` | has_bounce | Has bounce trajectory active | +| `+0xbd` | actor_type | Actor type byte (used for direction table lookups) | + +## Shot Entity Lifecycle (0x435e–0x44a9) + +| Address | Name | Description | +|----------|----------------------------|-------------| +| `0x435e` | `shot_entity_alloc` | Alloc/init shot entity: vtable=0x297e, registry vtable=0x2969, zeros all state, copies player pos to +0xb5/b7 | +| `0x44a9` | `shot_entity_free` | Cleans up shot entity: frees sprite at +0x3c if valid (set to 0xFFFF), clears callbacks; optional full free if flag&1 | + +## Projectile / Combat (0x4659–0x5a99) + +| Address | Name | Description | +|----------|----------------------------|-------------| +| `0x4659` | `projectile_init_vector` | Sets up shot trajectory: target XY±deviation, step rate from weapon table at 0x2536 | +| `0x4a91` | `entity_fire_weapon` | Fires weapon from entity using 0x129b/0x12ac direction offset tables | +| `0x4b18` | `fire_weapon_from_cursor` | Gets cursor angle sprites, fires projectile at cursor target | +| `0x4b78` | `projectile_check_hit` | Hit test: if entity_type==0 uses bbox+0x79; else full 3D range; copies +0xa0→+0x77 (hit entity) | +| `0x4c2e` | `projectile_step_update` | Advances projectile one step; type 3 spawns sub-shots via spawn_entity_checked | +| `0x4d28` | `projectile_trace_ray` | Interpolated path trace: divides distance/0x10 into steps, collision checks each step; on hit calls projectile_apply_hit + entity_deactivate | +| `0x51ad` | `projectile_update_tick` | Full projectile tick: move, check reach target, bounce, call projectile_check_hit | +| `0x5a99` | `projectile_apply_hit` | Applies hit effects: if impacted obj byte+6 non-zero, calls damage func with weapon_slot/type/target/owner | + +## Weapon Type Table (0x2536) +- Each entry is 0x11 bytes (17), accessed as `weapon_type * 0x11` +- `[0]` = step divisor for distance calculation +- `[0x19]` = max range threshold (used in projectile_update_tick) + +## Direction Tables (0x129b / 0x12ac) +- Indexed by facing (0–15): dx offsets at 0x129b, dy offsets at 0x12ac +- Values are multiplied by distance (e.g. `*0x500`) for projectile spawn offsets + +## Collision Detection (0x60c1–0x621e) + +| Address | Name | Description | +|----------|----------------|-------------| +| `0x60c1` | `aabb_overlaps_3d` | 3D AABB overlap test — box layout [xmin,ymin,zmin,_,_,xmax,_,ymax,_,zmax] | +| `0x621e` | `bbox_translate` | Translates a 3D bounding box by (dx, dy, dz) — both min and max points | + +## Enemy AI / Spawning (0x6aed–0x6d21) + +| Address | Name | Description | +|----------|----------------------------|-------------| +| `0x6aed` | `map_find_spawn_point` | Finds map tile matching entity conditions; returns packed XYZ tile coords | +| `0x6bfc` | `actor_find_in_view` | Finds actor visible in current view frustum (temp data at 0x7eca) | +| `0x6ce9` | `enemy_spawn_with_target` | Wrapper: spawns enemy with player as target (param5=1) | +| `0x6d05` | `enemy_spawn_no_target` | Wrapper: spawns enemy without targeting player (param5=0) | +| `0x6d21` | `enemy_spawn_at_position` | Full enemy spawn: activates entity, assigns velocity from direction table (0x2a00/4/A) | + +## Player / HUD + +| Address | Name | Description | +|----------|-------------------------------|-------------| +| `0x50ee` | `player_position_update` | Updates player position from direction data; clamps to screen bounds | +| `0x6ff7` | `player_health_update_and_effect` | Encodes player HP into RGB bitfields at 0x7e46+0x1bec, spawns effect | + +## Destruction / Death (0x7490–0x75ff) + +| Address | Name | Description | +|----------|---------------|-------------| +| `0x7490` | `debris_spawn`| Spawns debris/fragment: vtable=0x2a57/0x2a1a, velocity, facing, linked list | +| `0x75ff` | `entity_die` | Death handler: spawns 1–4 debris objects, picks best explosion direction | + +## Entity Type Constants (weapon_type/entity class) +| Value | Entity Class | +|--------|--------------| +| `0x17` | Robot/mech type A | +| `0x18` | Robot/mech type B | +| `0x1` through `0x3c` | Various entity/weapon types | +| `0x3d` | Robot/mech type C | +| `0x3e` | Robot/mech type D | +| `0x2f5`–`0x2f7` | Special movement entity | +| `0x595`/`0x597` | Platform/elevator entities | +| `0x31c`/`0x322`–`0x327` | Explosive/effect entities | +| `0x38d` | Save game trigger entity | +| `0x426` | Spark/scatter sub-shot | +| `0x59a` | Player cursor/select indicator | + +## Entity Data Table at 0x7e1e +- Stride: `0x79` bytes (121 bytes per entry) +- Indexed by entity type (integer) or entity slot +- `+0x59` offset = class-detail flags byte (`entity_class_get_flag8` returns bit `0x08`; other callers also clear bit `0x10` here during at-target facing updates) +- `+0x5a` offset = flags byte (bit4 = special entity flag, bit3 = armor/shield flag) +- `+0x68` = targeting flag + +## Map / Resource Tables +| Address | Content | +|---------|---------| +| `0x2833` | Cheat code input sequence (null-terminated) | +| `0x283d` | Cheat sequence match position counter | +| `0x7ded` | Map X coordinate array (2 bytes per entry) | +| `0x7df1` | Map Y coordinate array (2 bytes per entry) | +| `0x7df5` | Map Z array (1 byte per entry) | +| `0x7df9` | Entity state array (2 bytes per slot) | +| `0x7e46` | Player state block far pointer | +| `0x7e1e` | Entity type table (stride 0x79) | + +## Entity Vtable Index (NE Segment 1) +| Address | Entity Class | +|---------|-------------| +| `0x28b5` | Dialog/menu object vtable | +| `0x287b` | Cheat-spawned entity (cheat ON) vtable | +| `0x2892` | Cheat-spawned entity (cheat OFF) vtable | +| `0x2969` | Entity registry vtable (stored at 0x39ca+slot*4, not entity's own vtable) | +| `0x297e` | Shot/projectile entity vtable | +| `0x29aa` | Generic/AI entity vtable | +| `0x2a1a` | Corpse entity vtable (variant) | +| `0x2a33` | Actor/corpse entity vtable | +| `0x2a57` | Debris fragment entity vtable | + +--- + +## Cheat System Analysis + +### `cheat_code_check` internals + +- Direct raw-EXE recovery: `cheat_code_check` in `CRUSADER-RAW.EXE` is `0007:0d0a-0007:0e08`. +- It has exactly one direct caller in this build: `FUN_0007_04dc` at `0007:0511`, which prepares a small local event record and then calls `cheat_code_check` before continuing normal input dispatch. +- `FUN_0007_04dc` itself is not only a low keyboard-queue consumer: `drawlist_init` at `0007:f654` calls it directly during higher-level setup, so the cheat-dispatch body can be reached from at least one non-ISR path in this build. + +Variable and constant roles from the recovered body: +- `0x2833` is not a clean dedicated data object in this raw EXE — raw bytes and surrounding disassembly show that it lands in the middle of `entity_animation_frame_update` (`0007:26e2-0007:2867`). Starting on `PUSH AX; CMP byte ptr [0x27fd],0; ...` the first five bytes are `50 80 3e fd 27` followed by a `0x00`. +- `0x283d` is the current match index into that byte table. On a successful byte match it increments; on mismatch it resets to zero and immediately retries the current input byte against the first table byte (overlapping prefixes still work). +- `input_event_record[+1]` is the compared input/event token. +- `0x844` is the main cheat-enable flag. The success path toggles it by converting the current byte to a boolean and negating it (`0 -> 1`, non-zero -> `0`). +- `0x6045` is written with the same post-toggle value as `0x844` — a mirrored cheat-state latch. +- Constant `0x103` is pushed into the shared helper at `000a:5276` immediately after the toggle (emit the cheat-toggle side effect). +- `0x8c52` is forced to `1` on success before the side-effect path continues. + +After a full table match, the code resets `0x283d` to zero, sets `0x8c52 = 1`, toggles `0x844` and `0x6045`, and calls the shared `0x103` helper. It then branches on the new cheat state: cheats-on uses `DS:0x287b`; cheats-off uses `DS:0x2892`. + +### Cheat-enable sources + +Two independent cheat-enable sources verified: +1. The hidden input matcher in `cheat_code_check` toggles `0x844` and `0x6045` after matching the five-byte event-code table at `0x2833`. +2. The command-line parser at `0004:635c-0004:63b8` recognizes the literal switch `-laurie` and directly sets `0x844 = 1`. This path does **not** write `0x6045`. + +Current model for the two cheat bytes: +- `0x844` = master cheat-permitted / cheat-framework-enabled flag. +- `0x6045` = live cheat-active mirror latch used by low-level keyboard handling. +- The hidden five-byte matcher enables both at once, but `-laurie` only enables the master flag. +- The separate event-`0x7e` path at `000c:942d` requires `0x844 != 0`, flips `0x6045`, and displays one of two local notification messages (`0x6087` vs `0x6091`). + +`jassica16` status: +- No literal `jassica` string is present in the current string table, while `-laurie` is present as plain text. +- The ordinary keyboard ISR producer still does not support the old byte-for-character model cleanly: it feeds normalized scan-code-style values into record byte `+1`, while the matcher source at `0x2833` is a live code-byte sequence with two values (`0x80`, `0xfd`) that do not fit that ISR path. +- The direct call `drawlist_init -> FUN_0007_04dc` is the first concrete static evidence for a higher-level path in this build. + +F10 key behavior (verified in raw build): +- `seg001_input_keyboard_handler` at `0006:ec29` handles input byte `0x44` and immediately returns unless cheats are enabled through `0x6045`. +- "Plain F10 when cheats are enabled" is verified; "Ctrl+F10 enables god mode" is **not** supported by the current code path. +- When a current `0x7e22` entity exists, the branch resolves the current selection and refreshes per-entity bookkeeping. +- In the `local_4 == 1` case the branch becomes a large restore/reset routine that tears down and rebuilds multiple linked objects around `0x7e22`, retries dispatch up to `0x14` times per stage, and fires the event batch `0x33d`, `0x33f`, `0x340`, `0x341`, `0x33e` before re-enabling channels `4`, `1`, and `0`. + +### Cheat-related string table (seg014 / `000e:xxxx`) + +| Address | String | Notes | +|-------------|-------------------------------------------------|-------| +| `000e:9c5e` | `"FART ...TRY... -laurie (Have fun, Jely)"` | Dev Easter-egg comment; no static code xref | +| `000e:9c87` | `"CHEATS ON"` | Cheat-on status string | +| `000e:9c91` | `"CHEATS OFF"` | Cheat-off status string | +| `000e:9c9c` | `"TARGETING RETICLE ACTIVE."` | Correlates to event `0x441` / byte `0xee0` toggle | +| `000e:9cb6` | `"TARGETING RETICLE INACTIVE."` | Paired off-state | +| `000e:9cd2` | `"CD TRANSFER DISPLAY ACTIVE."` | Correlates to event `0x241` / `0x141` toggle area | +| `000e:9cee` | `"CD TRANSFER DISPLAY INACTIVE."` | Paired off-state | +| `000e:9dff` | `"HACK MOVER ON"` | No static code xref; USECODE/scripting layer | +| `000e:9e0d` | `"HACK MOVER OFF"` | No static code xref; USECODE/scripting layer | +| `000e:6450` | `"Immortality disabled."` | No static code xref; USECODE/scripting layer | +| `000e:6466` | `"Immortality enabled."` | No static code xref; USECODE/scripting layer | +| `000e:647b` | `"Cheats are now active."` | Shown in `-laurie` startup path | +| `000e:6492` | `"Cheats are now inactive."` | Paired off-state | + +### Cheat event dispatch summary (000c segment) + +All cheat-related event case-handlers reside as shared-frame case bodies within a large event dispatch function in segment 000c. Each body inherits BP from the enclosing prologue and exits via `POP DI; POP SI; LEAVE; RETF`. + +| Address | Symbol | Event | Action | +|-------------|------------------------------------------------|---------|--------| +| `000c:8e16` | `event_0x441_cheat_debug_overlay_toggle` | `0x441` | Toggles `DS:0xee0` (boolean-NOT); calls `[0x2bd8]` vtable `+0x2c`; gate = `DS:0x844` | +| `000c:8e46` | `event_0x241_cheat_debug_overlay_toggle` | `0x241` | Toggles `DS:0x2bc9` (1-current); same vtable dispatch; gate = `DS:0x844` | +| `000c:8e72` | `event_0x141_cheat_debug_overlay_toggle` | `0x141` | Toggles `DS:0x2bca` (1-current); same vtable dispatch; gate = `DS:0x844` | +| `000c:942d` | `event_0x7e_cheat_latch_runtime_toggle` | `0x7e` | Requires `0x844 != 0`; flips live latch `DS:0x6045`; notification at `DS:0x6087` (on) or `DS:0x6091` (off) | +| `000c:9154` | `event_0x142_cheat_fullscreen_mode1_refresh` | `0x142` | Gate = `DS:0x604b`; palette-black, seg126 shell, mode-1 `000c:3c0e`, tail `0004:70f1` | +| `000c:92cd` | `event_0x143_cheat_fullscreen_mode0_refresh` | `0x143` | Same as `0x142` but mode-0 `000c:3c0e`, tail `0004:6f15` | +| `000c:9703` | `event_0x410_cheat_flag_604f_toggle` | `0x410` | Toggles `DS:0x604f` (boolean-NOT); notification at `DS:0x60d2` (on) or `DS:0x60ee` (off); gate = `DS:0x844` | + +### Cheat-dispatch keyboard functions (seg007) + +| Address | Name | Description | +|-------------|-----------------------------------------------|-------------| +| `0007:04dc` | `keyboard_input_cheat_dispatch` | Processes one keyboard event: calls `cheat_code_check`, then dispatches on raw scan-code `[record+1]`. Tab/J (0x0f/0x24) → context-sensitive entity action via FUN_0005_e119/252; KP* (0x37) → `cheat_entity_slot_cycle_and_update_sprite`; Space (0x39) → movement/entity_command_dispatch; KP- (0x4a) → `cheat_anim_type_cycle_and_refresh`; KP+/KP0/KPDel (0x4e/0x52/0x53) → selected object vtable `+0x18`(0xb,...) dispatch. ASCII H (0x48) absent; HACK MOVER comes from a higher scripting layer. | +| `0007:0d0a` | `cheat_code_check` | Five-byte stateful matcher at `DS:0x2833`; toggles `0x844`+`0x6045`; cheats-on notification via `display_null_check_dispatch(..., 0x287b)`; cheats-off via `display_null_check_dispatch(..., 0x2892)`. | + +### Cheat-dispatch helpers (000c:81xx) + +| Address | Name | Description | +|-------------|-----------------------------------------------|-------------| +| `000c:8072` | `cheat_entity_slot_cycle_and_update_sprite` | Cycles slot 1..5 for `0x7e22` entity; picks sprite ID by class flags; calls `entity_table_set_sprite`. | +| `000c:81c0` | `cheat_anim_type_cycle_and_refresh` | Cycles animation-type 0x0b..0x19 for `0x7e22`; writes per-entity `+0x19`; calls `0008:4bba(0x20)`. | +| `000c:8221` | `cheat_flag_6050_clear` | Clears `DS:0x6050` to 0. | +| `000c:8227` | `cheat_flag_6050_read` | Returns `DS:0x6050` in AL. | +| `000c:822b` | `cheat_flag_6050_set` | Sets `DS:0x6050` to 1. | + +### Additional cheat-dispatch hotkeys in `keyboard_input_cheat_dispatch` + +Verified byte tests in the caller-side dispatch: +- `0x37` calls `000c:8072` (`cheat_entity_slot_cycle_and_update_sprite`) +- `0x4a` calls `000c:81c0` (`cheat_anim_type_cycle_and_refresh`) +- `0x0f` and `0x24` share a context-sensitive branch via `FUN_0005_e252` with event IDs `0x3a`, `0x38`, or `0x0b` +- `0x39` and `0x52` share a branch computing a queued delta via `entity_command_dispatch` +- `0x4e` and `0x53` are separate guarded selected-object lanes dispatching through the selected object's method table + +### Immortality mechanics (event 0x410 / flag 0x604f) + +**How immortality works at the C level:** + +`DS:0x604f` is the Immortality flag. It is toggled by `event_0x410_cheat_flag_604f_toggle` at `000c:9703`. +The sole gameplay read site is `player_receive_damage_and_dispatch_effects` (`0004:c055`) at `0004:c205`. + +When `0x604f != 0` (Immortality **ON**), the damage path in `0004:c205` does: +1. `CALLF 0009:9ea1` — begin hit-effect lock (animation gating sequence) +2. `CALLF 0003:c368(0x10001)` — arm anim-stagger mode (seg001:4d68 path) +3. `IDIV 0x40000` — divide the 32-bit incoming damage value by **262,144** → result is effectively 0 for any realistic HP scale +4. Apply the negligible reduced damage via `CALLF 0003:dbcc` +5. Spin on `DS:0x31a2 != 0` event-break gate before re-enabling channels + +When `0x604f == 0` (Immortality **OFF**, normal path): +- Jump to `0004:c25b` → `CALLF 0003:ac7e` (seg001:367e) — full damage / death dispatch + +The hit stagger **still plays** in immortality mode (the Silencer visually flinches). Technically HP decreases by 0 per hit (integer truncation from /262144), so there is no true invulnerability flag that bypasses all HP accounting, just extreme attenuation. + +**What sends event 0x410 to toggle it:** + +The 000c event handler at `000c:9703` is entered via the large cheat-event dispatch switch at `000c:8c56-000c:8d16`. That switch is driven by the seg021 event scheduler, not by the static keyboard dispatch in `keyboard_input_cheat_dispatch`. + +Key negative result: no function in the compiled C code directly pushes the value `0x410` into the game's event broadcast path. All three occurrences of the immediate `0x410` in the disassembly are: (a) the `CMP BX,0x410` comparison inside the 000c switch, (b) a multi-event subscription list at `000b:b5cb` (registering to receive the event), and (c) an abort-function error code at `000d:5290` unrelated to the cheat. + +Conclusion: event 0x410 is generated exclusively by the **interpreted USECODE lane** (centered on `EUSECODE.FLX`), not by any static keyboard-level scan-code path in the compiled binary. The F10 keyboard branch in `seg001_input_keyboard_handler` is a separate `0x44` path gated by `0x6045`, not by `0x410`. Separate follow-up work on the imported `ASYLUM.DLL` shows that DLL exports `ASS_*` audio routines, so it should not be conflated with the immortality toggle path. The in-game trigger is still best modeled as a USECODE item or controller script, consistent with the surrounding string evidence (`000e:6337 "CruHealer"`, `000e:6341 "BatteryCharger"`, `000e:6445 "Controller"`, `000e:64ab "AutoFirer"` — these are USECODE process class names bracketing the Immortality string). + +**Secondary handler (000b:b62c):** + +`000b:b62c` subscribes to event 0x410 via the registration at `000b:b5cb`. When event 0x410 is received by this handler, it writes state code `0xe` (decimal 14) into the event object's field `+0x6` and passes it to `000b:b7f3` for processing. This is a parallel state-machine path that runs alongside the 000c toggle; likely it drives an associated USECODE process or animation object into state 14. + +| Address | Symbol | Role | +|-------------|-------------------------------|------| +| `0004:c055` | `player_receive_damage_and_dispatch_effects` | Renamed. Contains the `0x604f` immortality gate at `0004:c205`. | +| `DS:0x604f` | Immortality flag | Set/cleared by event `0x410`. Read only at `0004:c205`. | +| `DS:0x60d2` | Immortality-on notification ptr | Near pointer in DS; resolves to far ptr → "Immortality enabled." display. | +| `DS:0x60ee` | Immortality-off notification ptr | Near pointer in DS; resolves to far ptr → "Immortality disabled." display. | +| `000a:b988` | `video_bios_state_snapshot` | Called after notification display in the 0x410 toggle to refresh screen state. | + +### Conservative folklore verification + +- "Cheats can be enabled with `-laurie`" is **directly verified**. +- "There is a hidden five-byte matcher that toggles cheats" is **directly verified**. +- "F10 performs a large cheat-only restore/reset action" is **directly verified**. +- "Ctrl+F10 enables god mode" is **not supported** — the verified F10 branch does not require a modifier. +- "H enables hack mover" is **real at runtime** (strings confirmed), but not found in the static low-level byte dispatch; the activation comes from the USECODE scripting layer. +- "Immortality makes the player invincible" is **partially verified**: damage is divided by 262,144, making HP loss negligible; the hit stagger still plays. There is no bypass of the HP system entirely. +- "Immortality is toggled with a keyboard combo" is **not supported in compiled C code**: event 0x410 has no static keyboard dispatch path. It is USECODE-triggered. +- The hidden five-byte matcher compares bytes from live code at `0007:2833`, and the ordinary keyboard ISR producer does not naturally emit byte values `0x80` and `0xfd` into record byte `+1`. diff --git a/docs/overview.md b/docs/overview.md new file mode 100644 index 0000000..b41680a --- /dev/null +++ b/docs/overview.md @@ -0,0 +1,122 @@ +# Crusader: No Remorse — Binary Overview + +## Binary Overview + +- **Game**: Crusader: No Remorse (Origin Systems, 1995) +- **Platform**: DOS (16-bit protected mode) +- **DOS Extender**: Phar Lap 286 DOS-Extender (RUN286) +- **Executable Format**: Bound `MZ -> NE` executable with Phar Lap DOS-extender code +- **Entry Point**: `10da:7c40` + +## Installed Copy Findings + +- No standalone `.EXP` file exists in `F:\Apps\Crusader No Remorse`. +- `CRUSADER.EXE` is the original game binary and contains a valid internal `NE` header. +- Outer DOS `MZ` header points to `e_lfanew = 0x36F70`. +- Internal header at `0x36F70` starts with `NE` and describes **145 segments**. +- The NE segment table references data from the original file directly, so there is no separate embedded payload that needs to be carved out first. +- `CNRCEXP.EXE` is a modern Win32 helper tool, not part of the original DOS execution path. + +## Raw Full-EXE Import Mapping + +- A separate raw-binary import of the full executable (`crusader-raw.exe`) is usable: Ghidra discovers thousands of functions across a single flat `ram` block. +- Direct `file_offset -> flat_address` mapping from the standalone segment extracts is not reliable for porting names into that raw import. +- The extracted `segNNN_*.bin` files match `CRUSADER_NE.EXE`, but the raw full-EXE import must be mapped by verified byte signatures / known function bodies. +- Verified segment bases in the raw full-EXE import: + - `seg001` base = `0x6E570` (`cursor_update_hover` at `0006:e5d0`, rel `0x0060`) + - `seg021` base = `0x87170` (`entity_count_by_type_a` at `0008:7377`, rel `0x0207`) +- Porting rule for these verified segments: + - `raw_full_exe_flat = verified_segment_base + standalone_segment_relative_offset` +- Naming note: + - `seg001` and `seg021` both contain a keyboard handler; in the full program database, the seg001 copy is named `seg001_input_keyboard_handler` to avoid a symbol collision with seg021 `input_keyboard_handler`. + +### Address Space Layout in the Raw Import + +Ghidra segment:offset `SSSS:OOOO` = flat address `SSSS * 0x10000 + OOOO`. + +| Flat range | Content | +|---|---| +| `0x00000`–`0x36F6F` | Phar Lap 286 DOS extender (outer MZ stub code) | +| `0x36F70` | NE header (145-segment game image begins here in file) | +| `0x6E570`+ | NE game segments at their Phar Lap linear load addresses | + +Mapping rule (verified for seg001 and seg021): +``` +runtime_flat_base = NE_segment_file_offset + 0x36F70 +``` +Example: seg004 at file `0x40A00` → runtime `0x77970` → Ghidra `0007:7970`. + +Functions at Ghidra `0003:XXXX` / `0004:XXXX` are **Phar Lap extender code** (flat < `0x40000` is below any game segment). Functions at `0006:E570`+ are game NE segments. + +### `0000:ffff` — NE Fixup Placeholder (not a dispatcher) + +`unresolved_far_thunk_dispatch` at `0000:ffff` is NOT a runtime function. Every `CALLF 0x0000:ffff` in the original NE image is a **different** external or inter-segment call patched by the NE loader at runtime. The body at `0000:ffff` is just fixup placeholder data, so decompiling it as a function is meaningless. + +**`unresolved_far_thunk_dispatch` is NOT a real dispatcher.** It is the NE binary fixup placeholder. + +- In a Phar Lap 286 NE executable, inter-segment and external far calls are stored in the binary as `CALLF 0x0000:ffff` (or similar invalid sentinel values). +- The Phar Lap NE loader patches each of these call sites to the real segment:offset at load time using the per-segment relocation records in the NE file. +- In Ghidra's raw import, those fixups are never applied. Every unresolved far call collapses to the same `0000:ffff` stub. +- **Each `CALLF 0x0000:ffff` in the binary is a DIFFERENT call with a DIFFERENT actual target.** + +Repair status in `CRUSADER-RAW.EXE`: +- A PyGhidra repair pass now applies the verified NE relocation table directly to the raw-program bytes for literal internal `CALLF 9A ptr16:16` sites, then re-disassembles each patched instruction. +- Current verified batch results: + - `8851` internal literal `CALLF` sites patched to their real segment:offset targets. + - `2841` far-pointer relocation entries skipped because they were not literal `CALLF` instructions (data or other non-call uses). + - `119` import callsites annotated as `NE IMPORT -> module.symbol`. + +Known call-site classifications (by argument pattern): +- `PUSH DS; PUSH imm_ordinal; CALLF` — Phar Lap extender calling a runtime-imported procedure by ordinal +- `PUSH ptr_seg; PUSH ptr_off; CALLF` — inter-NE-segment function call (intra-game far call) +- Multiple typed pushes then CALLF — external C runtime / game subsystem call with normal args + +### Latest Raw Full-EXE Porting Progress + +Newly ported and renamed into `CRUSADER-RAW.EXE` from verified `seg001` mapping (`base 0x6E570`): +- `0007:28ce` = `shot_entity_alloc` (`seg001 + 0x435e`) +- `0007:2a19` = `shot_entity_free` (`seg001 + 0x44a9`) +- `0007:2bc9` = `projectile_init_vector` (`seg001 + 0x4659`) +- `0007:3001` = `entity_fire_weapon` (`seg001 + 0x4a91`) +- `0007:3088` = `fire_weapon_from_cursor` (`seg001 + 0x4b18`) +- `0007:30e8` = `projectile_check_hit` (`seg001 + 0x4b78`) +- `0007:319e` = `projectile_step_update` (`seg001 + 0x4c2e`) +- `0007:3298` = `projectile_trace_ray` (`seg001 + 0x4d28`) +- `0007:371d` = `projectile_update_tick` (`seg001 + 0x51ad`) +- `0007:4009` = `projectile_apply_hit` (`seg001 + 0x5a99`) + +## Segment Map + +| Segment | Address Range | Purpose | +|---------|--------------|---------| +| CODE_0 | `1000:0000 - 1000:01ff` | Interrupt dispatch table / thunks | +| CODE_1 | `1020:0000 - 1020:0b9f` | Low-level interrupt handlers, mode switching | +| CODE_2 | `10da:0000 - 10da:25ef` | **Main runtime** — C library, I/O, formatting, entry point | +| CODE_3 | `1339:0000 - 1339:0c2f` | **DOS/DPMI services** — INT 21h/31h wrappers, interrupt vector mgmt, fast memcpy | +| CODE_4 | `13fc:0000 - 13fc:27af` | **String data & runtime constants** — error messages, format strings, Phar Lap ID | +| CODE_5 | `1677:0000 - 1677:0e8f` | **EMS/XMS memory management** — expanded memory handlers | +| CODE_6 | `1760:0000 - 1760:7ccd` | **DOS Extender core** — EXP loader, command-line parser, memory management, system init | +| DATA | `1760:7cd0 - 1760:7cdf` | Global data | +| HEADER | `HEADER::0000 - HEADER::044f` | MZ/P2 file header | + +## NE Import Details +- File to import: `F:\Apps\Crusader No Remorse\CRUSADER.EXE` +- Outer DOS header: `MZ` +- `e_lfanew`: `0x36F70` +- Internal executable header: `NE` +- Segment count: `145` +- Initial `CS:IP`: `0001:0000` +- Initial `SS:SP`: `0091:2000` + +The currently analyzed protected-mode code at addresses like `10da:7c40` is consistent with the Phar Lap runtime/loader path. To reach the rest of the program, import `CRUSADER.EXE` again using an **NE-aware loader** or a workflow that starts from the internal NE header rather than the outer DOS stub. + +## Next Steps + +1. ✅ **NE Segment 1 imported and analyzed** — all 58 identified functions renamed and annotated +2. ✅ **Raw 0007 segment analyzed** — rendering, camera/scroll, save slot, and scroll region subsystems documented (~60 functions renamed and annotated) +3. **Import additional NE segments** — priority: segments 22, 30, 59, 86 (segment 21 complete) +4. **Analyze raw 0007 draw helper cluster** — `FUN_0007_03b4`, `FUN_0007_04b8`, `FUN_0007_04dc`, `FUN_0007_057f`, `FUN_0007_0614`; called by sprite/draw list functions +5. **Analyze `FUN_0007_4cdf`** — large 15-case animation/movement dispatcher; overlapping instruction warnings; cases 0, 2, 3, 6, 9, 0xa, 0xe are clean +6. **Map file format loaders** — `.FLX`, `.SHP`, `.MAP`, `.TNT` resource formats +7. **Cross-reference entity type constants** with game entities (robots, platforms, triggers) +8. **Identify external segment calls** — the `func_0x0000ffff()` placeholders are all cross-segment calls; resolving them requires importing the referenced segments diff --git a/docs/phar-lap-extender.md b/docs/phar-lap-extender.md new file mode 100644 index 0000000..2a0c1c5 --- /dev/null +++ b/docs/phar-lap-extender.md @@ -0,0 +1,108 @@ +# Crusader: No Remorse — Phar Lap DOS Extender Analysis + +This file covers the Phar Lap 286 DOS extender code portion of `CRUSADER.EXE` — the outer MZ/P2 stub that bootstraps the NE game image. + +## Architecture Notes + +### Correction: The Game Ships As A Bound NE Executable +**Important**: The installed copy does **not** contain a separate `.EXP` file. `CRUSADER.EXE` is a bound executable with an outer DOS `MZ` stub and an internal `NE` executable image. The Phar Lap loader/runtime code and the game's real segment layout are both described inside this same file. + +The flow is: +1. `entry` → checks DOS version, CPU type +2. `init_dos_extender` → sets up protected mode (VCPI/DPMI) +3. `load_exp_file` → opens the game's `.EXP` file +4. `load_executable_image` → parses P2/MZ headers, creates segments, applies relocations +5. `task_switch_to_child` → transfers control to the actual game code + +For the installed retail copy, this means the currently loaded Ghidra program is only one interpretation of `CRUSADER.EXE`. The next import should target the **NE layer of the same file**, not a missing external `.EXP`. + +### Segment 1339: Fast Memory Operations +`FUN_1339_02a8` contains an unrolled loop (Duff's device pattern with 57 iterations) — a hand-optimized **fast memory fill/add** routine, typical in DOS game graphics engines. + +### EMS Memory (Segment 1677) +The game uses **EMS (Expanded Memory Specification)** via INT 67h for additional memory beyond the 1MB real-mode limit. Functions in segment 1677 manage EMS page frames and handle allocation/deallocation. + +## Named Functions + +### Entry & Startup +| Address | Name | Description | +|---------|------|-------------| +| `10da:7c40` | `entry` | Program entry point — checks CPU, parses command line, launches game | +| `10da:1816` | `main_init_and_run` | Main initialization — loads child EXP, sets up subsystems, runs game | +| `1760:1432` | `parse_cmdline_and_run` | Parses command-line args and invokes main_init_and_run | +| `1760:42fa` | `init_dos_extender` | Initializes Phar Lap 286 DOS extender (CPU check, VCPI/DPMI setup) | + +### Executable Loading +| Address | Name | Description | +|---------|------|-------------| +| `1760:2cdf` | `load_exp_file` | Loads .EXP executable — opens file, reads headers, allocates memory | +| `1760:1dfc` | `load_executable_image` | Parses P2/MZ headers, loads segments, creates LDT entries | +| `1760:24a6` | `apply_relocations` | Applies segment relocations to loaded executable | +| `1760:5eca` | `exec_child_process` | Executes child process with command-line arguments | +| `1760:5fee` | `exec_program_with_args` | Builds command line, locates and executes a program | +| `10da:1f7e` | `load_and_run_child` | Wrapper: loads child EXP and initializes it | + +### System Services +| Address | Name | Description | +|---------|------|-------------| +| `10da:2330` | `dos_exit` | Calls INT 21h AH=4Ch (terminate program) | +| `1760:42aa` | `detect_cpu_type` | Detects CPU: 0=8086, 2=286, 3=386+ | +| `1339:04a6` | `dpmi_set_interrupt_vector` | INT 31h — DPMI set interrupt vector | +| `1339:06ca` | `switch_to_real_mode` | Switches CPU from protected to real mode | +| `1339:06f2` | `switch_to_protected_mode` | Switches CPU from real to protected mode | +| `1339:0076` | `setup_interrupt_handlers` | Configures interrupt vectors via INT 21h | +| `1339:0a38` | `dos_int21h_wrapper` | Simple INT 21h call wrapper | +| `1339:0a82` | `dos_int21h_with_regs` | INT 21h call with register parameters | +| `10da:2360` | `get_flags_register` | Returns CPU FLAGS register | +| `10da:2363` | `set_flags_register` | Sets CPU FLAGS register | + +### Memory Management +| Address | Name | Description | +|---------|------|-------------| +| `1677:0d12` | `cleanup_ems_memory` | Frees EMS (INT 67h) memory handles | +| `10da:14fc` | `init_stack_fill_cc` | Fills stack with 0xCC (INT 3) for debugging/guard | +| `10da:1706` | `get_segment_base_addr` | Computes linear base address from segment descriptor | + +### Task Management +| Address | Name | Description | +|---------|------|-------------| +| `10da:19ca` | `task_switch_to_child` | Context switch to child process | +| `10da:1946` | `task_switch_from_child` | Context switch back from child process | +| `10da:1af4` | `call_termination_handler` | Calls registered termination callback | + +### I/O & Output +| Address | Name | Description | +|---------|------|-------------| +| `10da:00d6` | `flush_output_buffer` | Flushes buffered output via function pointer | +| `10da:0132` | `putchar_buffered` | Writes character to buffer, flushes on newline | +| `10da:0808` | `memcopy_to_buffer` | Copies N bytes from source to destination buffer | +| `10da:178c` | `print_error_message` | Formats and prints load error (references "not loaded: %s") | +| `10da:09e4` | `print_fatal_error` | Prints "Fatal Error" prefix + message | +| `10da:192a` | `print_internal_error` | Prints "Internal Error" message | + +### Interrupt Management +| Address | Name | Description | +|---------|------|-------------| +| `10da:1ec0` | `restore_interrupt_vectors` | Restores INT 2Fh and INT 67h vectors | +| `10da:2249` | `restore_int_2f_67` | Restores INT 15h vector if saved | +| `1760:3d86` | `init_system_check` | Validates system (CPU, DOS version, VCPI/DPMI, memory) | + +### Utility +| Address | Name | Description | +|---------|------|-------------| +| `10da:15ea` | `check_ds_segment` | Returns true if DS == 0x10 (checks data segment selector) | +| `1760:3c9e` | `nop_stub` | Always returns 0 (unused hook) | + +## Key String References + +| Address | String | Context | +|---------|--------|---------| +| `13fc:0016` | `$Id: comhighc.c 1.1 91/08/06...` | Phar Lap C runtime source ID | +| `13fc:0048` | `$Id: comutils.c 1.1 91/08/06...` | Phar Lap utility functions source ID | +| `13fc:0078` | `Serial Number ` | DOS extender serial validation | +| `13fc:14ca` | `Internal Error` | Error class prefix | +| `13fc:14da` | `Fatal Error` | Fatal error class prefix | +| `13fc:156a-1628` | File error messages | Not found, bad format, no memory, etc. | +| `1760:665c` | `Copyright (C) 1986-93 Phar Lap Software, Inc.` | DOS extender copyright | +| `1760:73da` | `-LDTSIZE 4096 -EXTHIGH D0_0000h -NI 18 -ISTKSIZE 3` | Default extender config | +| `1760:76fc-7c5a` | Numbered error messages | System requirement errors (1000-2170) | diff --git a/docs/raw-0007-rendering.md b/docs/raw-0007-rendering.md new file mode 100644 index 0000000..abcf517 --- /dev/null +++ b/docs/raw-0007-rendering.md @@ -0,0 +1,247 @@ +# Raw 0007: Rendering, Scroll/Camera & Coordinate Transforms + +Content extracted from `crusader_decompilation_notes.md`. Covers the sprite draw list subsystem, tile-based visibility, map scroll/camera, and the isometric coordinate transform system. + +--- + +## Raw 0007 Rendering & Sprite Draw List Subsystem + +### Draw List Node Format + +Each draw node is `0x2a` (42) bytes. The free pool holds 1500 nodes based at `0x2cc7`. + +| Offset | Field | +|--------|-------| +| `+8` | child link (for `drawlist_enqueue_sprite_children`) | +| `+10` | z-order dependency forward link | +| `+0x14` | enqueued flag (bit 0) | +| `+0x15` | z-depth (1 = root sentinel) | +| `+0x16` | flags/type byte | +| `+0x17` | redraw must-flag | + +### Draw List Functions + +| Address | Name | Evidence | +|---------|------|---------| +| `0007:eb36` | `drawlist_pool_init` | Inits free pool: 1500 nodes × `0x2a` bytes from base `0x2cc7`. Sets `0x2ccf = 1500` (count), `0x2cc3` = linked list head. Copies `0x2cc9` → `0x2cae`. | +| `0007:eb12` | `linked_list_push_2cc3` | LIFO push: `node->next = head_2cc3; head = node; count_2ccf++`. | +| `0007:eada` | `linked_list_pop_2cc3` | LIFO pop: dequeues node from `0x2cc3` head, decrements `0x2ccf` count. | +| `0007:ebd9` | `linked_list_dequeue_headtail` | FIFO dequeue from head/tail pair list; calls `FUN_0007_03ec` after dequeue. | +| `0007:ec2c` | `drawlist_enqueue` | FIFO enqueue: appends node to draw list (head if empty, tail always updated). | +| `0007:ec63` | `drawlist_remove_node` | Unlinks specific node from head or tail position; calls `FUN_0007_03ec`. | +| `0007:eca8` | `drawlist_process_and_render` | **Two-stage render pass.** Stage 1: drains `0x8442` (pending), viewport-tests each sprite, moves in-bounds to `0x8446` (visible). Stage 2: drains `0x8446`, calls sprite vtable[0] to draw. Recursive re-run if `0x2cb2` defer flag set. | +| `0007:edfa` | `drawlist_enqueue_sprite_children` | Enqueues all child sprites at node `+8` linkage to draw pending list if not already queued or rendered. Skips if `+0x15` z-depth == 1. | +| `0007:ef3d` | `sprite_add_draw_dependency` | Links sprites A and B with z-order dependency. Allocates link node via `FUN_0007_057f`. Stores in A's `+10` and B's `+8`. Sets must-redraw on B if A has `+0x17` set. | +| `0007:ef9f` | `sprite_enqueue_for_draw` | Null-guard; sets node `+0x14 \|= 1`, enqueues to `0x8442`. | +| `0007:efca` | `sprite_invalidate_and_unlink` | Full sprite removal: re-enqueues all dependents, frees link nodes via `FUN_0007_0614`, clears `+8/+10` lists, dequeues self from `0x8442`. | +| `0007:f2a0` | `sprite_sort_by_depth_and_link` | Compares `+0x15` z-depth of two sprites; calls `sprite_add_draw_dependency` in the correct order (lower z first). Handles equal-depth via thunk. | +| `0007:f654` | `drawlist_init` | Full draw system init: `drawlist_pool_init`, init full-screen viewport (`0x844a..0x8450 = 0..639, 0..screen_h`), allocate root sentinel node (vtable `FUN_0000_2ce4`, z-depth=1, flag=0x40), stored at `0x846a`. | +| `0007:ea00` | `bbox_intersect` | In-place 2D rect intersection: max of mins, min of maxes. Input/output: 4-int array `[xmin,ymin,xmax,ymax]`. | +| `0007:ea6d` | `bbox_union` | In-place 2D rect union: min of mins, max of maxes. | +| `0007:ee5a` | `viewport_update_from_sprite_bounds` | Subtracts scroll offsets from sprite bbox; clips to screen rect (`0x2ca6..0x2cac`); calls `bbox_intersect`; stores updated viewport at `0x844a..0x8450`; dispatches to render. | + +### Isometric Coordinate Transform (draw list side) + +| Address | Name | Evidence | +|---------|------|---------| +| `0007:be67` | `world_to_screen_isometric` | Coarse tile-grid → screen transform. Uses `(wx+sx) + (wy+sy)*2` for screen_x, `(wy+sy)*2 - (wx+sx)` for screen_y. Camera (`sx`, `sy`) added before transform. | +| `0007:bef8` | `world_to_screen_isometric_wrapper` | Thin wrapper around `world_to_screen_isometric`. | + +--- + +## Tile-Based Visibility System + +The rendering system uses a **6×5 tile grid** at DS:`0x846a` (30 entries × 2 bytes each = 60 bytes). Tiles represent screen regions of approximately 128 screen pixels per tile. Each tile holds a near pointer to a linked list of sprite nodes overlapping that tile. Bitmasks track dirty and renderable tiles. + +| Address | Name | Evidence | +|---------|------|---------| +| `0007:f9e2` | `drawlist_mark_dirty_tiles` | Converts bbox to tile grid coords (divide by 128, clamp to 6×5). Walks all sprites in overlapping tiles' spatial buckets; re-enqueues overlapping sprites. Sets bits in dirty bitmask `0x2cbb`. | +| `0007:fb53` | `tile_visibility_update` | Iterates redraw bitmask (`0x2cbb`, up to 10240 tiles). For each dirty tile with a sprite, computes isometric screen position from map X/Y/Z. Checks sprite dimension bitfields at `pbVar8+2..+3` against 640×480 viewport. Sets corresponding bit in render bitmask `0x2cb7`. Clears dirty bitmask after processing. | +| `0007:fd98` | `tilemap_draw_if_dirty` | Guard: if render bitmask `0x2cb7` non-zero, calls `thunk_FUN_0007_001d` to trigger tilemap draw. | + +### Draw List / Viewport Globals + +| Address | Name | Notes | +|---------|------|-------| +| `0x2bb7` | `g_scroll_offset_x` | World-to-screen X offset (scroll) | +| `0x2bb9` | `g_scroll_offset_y` | World-to-screen Y offset (scroll) | +| `0x2ca6..0x2cac` | `g_screen_clip_rect` | Screen clip rectangle `[xmin,ymin,xmax,ymax]` | +| `0x2cae` | `g_draw_segment` | DS segment for draw node far pointers | +| `0x2cb0` | `g_free_pool_seg` | Segment for node free pool far calls | +| `0x2cb2` | `g_render_defer_flag` | If set, defers current render pass | +| `0x2cb7` | `g_render_tile_bitmask` | Far ptr to bitmask of tiles ready to render | +| `0x2cbb` | `g_dirty_tile_bitmask` | Far ptr to bitmask of dirty/changed tiles | +| `0x2cbf` | `g_tile_origin_x` | Tile grid world origin X (for tile coordinate math) | +| `0x2cc1` | `g_tile_origin_y` | Tile grid world origin Y | +| `0x2cc3` | `g_free_pool_head` | Free node pool linked list head | +| `0x2ccf` | `g_free_pool_count` | Free node pool remaining count (max 1500) | +| `0x8442` | `g_draw_pending_list` | Draw pending list head/tail (near ptrs) | +| `0x8446` | `g_draw_visible_list` | Draw visible list head/tail (near ptrs) | +| `0x844a..0x8450` | `g_viewport_rect` | Current viewport `[xmin,ymin,xmax,ymax]` | +| `0x846a` | `g_tile_grid_base` | 6×5 tile grid spatial index (near ptr per tile) | + +--- + +## Raw 0007 Map Scroll / Camera Subsystem + +A scroll/camera management cluster found in the `0007:bxxx–0007:dxxx` range. + +### Scroll/Camera Functions + +| Address | Name | Evidence | +|---------|------|---------| +| `0007:ba00` | `watch_entity_controller_create_global` | Thin global-create wrapper around `watch_entity_controller_create`; allocates default controller object and stores it at `0x2bd8`. | +| `0007:ba13` | `watch_entity_controller_dispatch_if_present` | If `0x2bd8` is non-null, calls controller vtable slots `+0x2c` and `+0x30`. | +| `0007:ba45` | `watch_entity_controller_create` | Allocates/initializes a type `0x2c2b` controller object, stores it at `0x2bd8`, sets event type `0x0219`, and installs callback-table entry `0x2be4` through `0x39ca`. | +| `0007:bab5` | `entity_set_watch_ptr` | Legacy name still in place, but newer constructor evidence now shows `0x2bd8` is a controller object lane rather than just a raw watched-entity FAR pointer. | +| `0007:baea` | `camera_update_and_check_player_scroll` | Calls watch entity vtable `+0x24`; if `0x2bd1` flag clear checks if player position (from `g_player_entity_farptr+0x40`) has moved > 32 units since `0x2be0`; if so, updates `0x2be0` and conditionally dispatches scroll event via `0x45aa`. | +| `0007:c6ba` | `scroll_camera_set_state_params` | Stores word params to `0x8354`, `0x8356`, byte to `0x8358`; dispatches. | +| `0007:cd56` | `dispatch_if_flag_2bd3_set` | Returns unless `0x2bd3` non-zero. | +| `0007:cfef` | `dispatch_if_mode_flags_set` | Two-flag check: dispatches if `0x2bca` or `0xee0` is non-zero. | +| `0007:d0f6` | `scroll_call_set_params_unless_blocked` | Calls `scroll_camera_set_state_params` only if `0x2bbb == 0`. | +| `0007:d119` | `scroll_update_direction_tracking` | Guards on `0x2bd3`. Calls `scroll_call_set_params_unless_blocked`. Compares direction bytes from `0x2cf4/0x2cf5` against cached `0x2bbd/0x2bbe`; if changed, clears `0x2bbc`. Dispatches. | +| `0007:d4a5` | `scroll_set_option_value` | Sets `0x2bc6 = param_1`. | +| `0007:d4b0` | `scroll_set_params_default` | Unconditional call to `scroll_camera_set_state_params`. | +| `0007:d4d3` | `scroll_set_map_index_validated` | If `param_1` in `[0..250]` and differs from `0x2bbf`, updates `0x2bbf` and clears `0x2bbc/0x2bbb`. | +| `0007:d655` | `map_position_has_changed` | Compares map arrays `0x7ded/0x7df1/0x7df5` at index `0x2bc6` against cached `0x2bc1/0x2bc3/0x2bc5`. Returns 1 if changed, 0 if same. | +| `0007:d6b1` | `scroll_clear_dirty_flags_and_dispatch` | Clears `0x2bbb = 0` and `0x2bbc = 0`; dispatches. | +| `0007:de57` | `entity_check_player_range_and_update` | Reads player world position (`g_player_entity_farptr+0x40`); if moved > 59 units from `entity+0x32` (cached pos), updates cache and calls `scrollregion_find_and_dispatch`. | + +### Scroll Region Table (`0x835a`) + +8 entries × `0x19` (25) bytes = 200 bytes. + +| Offset | Field | Notes | +|--------|-------|-------| +| `+0x0/+0x2` | key pair | Matched by scroll region key lookup | +| `+0x8` | refcount | Reference count (incremented on match) | +| `+0xe` | count2 | Secondary counter | +| `+0x10` | active | Non-zero when region is live | +| `+0x11/+0x13` | x_start/x_end | Bounding X coordinates | +| `+0x15/+0x17` | y_start/y_end | Bounding Y coordinates | + +| Address | Name | Evidence | +|---------|------|---------| +| `0007:e194` | `scrollregion_process_active` | Iterates active scroll entries (key non-zero AND `+0x10 != 0`), reads bounding box fields `+0x11/+0x13/+0x15/+0x17`, dispatches with bounds args. | +| `0007:e214` | `scrollregion_find_and_dispatch` | Finds empty scroll entry (zero key) and dispatches. | +| `0007:e29c` | `scrollregion_register` | Finds or allocates scroll region entry. Existing match: bump refcount / set active. New: init via `scrollregion_entry_init`. Special key `0x4ed`: thunk dispatch instead. | +| `0007:e50f` | `scrollregion_entry_init` | Null-guards param_1; zeroes output param_2, param_3, param_4; dispatches continuation. | +| `0007:e74a` | *(unnamed)* | Sets up call to walk `0x835a` table (8 entries, stride `0x19`, filter `0x968`), with callback return label `e763`. | + +### Save Slot System (`0x8337` + `0x2ba3`) + +10 save slots, each `0x400` (1024) bytes. Handle table at `0x8337` (10 words). Slot buffer base at FAR ptr `0x2ba3`. + +| Address | Name | Evidence | +|---------|------|---------| +| `0007:ac13` | `saveslot_table_clear` | Fills `0x8337..0x834b` (10 words) with `0xFFFF` (all slots empty). | +| `0007:acab` | `saveslot_free_if_empty` | Scans slot `0x2ba3[param_1*0x400]` for non-zero data; if empty, sets handle `0x8337[param_1] = 0xFFFF`. | +| `0007:ad47` | `saveslot_find_index_by_id` | Linear scan of 10-word handle table `0x8337`; returns index of matching word or `-1`. | +| `0007:ad79` | *(unnamed)* | Finds a free (`0xFFFF`) slot index. Complement of `saveslot_find_index_by_id`. | +| `0007:afd4` | `saveslot_get_or_alloc` | Gets slot pointer: calls `saveslot_find_index_by_id`; if not found calls `ad79` to get free slot; returns `0x2ba3 + slot * 0x400`. Returns 0 if no free slot. | +| `0007:b02c` | `saveslot_write_entry` | Navigates to `slot_base[param_3 * 4]`; dispatches thunk paths for write (existing, overwrite, new). | +| `0007:b0de` | `saveslot_read_entry_flags` | Reads from slot entry far pointer at `slot_base[param_3*4]`; extracts 4-byte packed bitfield from `+4..+7` in entry record into `*param_1`. Bit-by-bit extraction loop for 4 bytes. | + +### String & Memory Utilities + +| Address | Name | Evidence | +|---------|------|---------| +| `0007:a96d` | `entity_copy_string_truncated80` | Strlen(param_3) ≤ `0x50` guard; copies string word-by-word from param_3 into `param_2+8`. | +| `0007:b813` | `memcpy_4words` | Copies 4 words (8 bytes) from `param_2` to `param_1`. | +| `0007:b46d` | `entity_dispatch_if_slot82e2_valid` | Guard: if `*(int *)0x82e2 != -1`, calls dispatch thunk. | + +### Scroll/Camera Globals + +| Address | Name | Notes | +|---------|------|-------| +| `0x2bb7` | `g_scroll_offset_x` | Isometric scroll X — added to world_x in screen transform | +| `0x2bb9` | `g_scroll_offset_y` | Isometric scroll Y | +| `0x2bbb` | `g_scroll_blocked` | If non-zero, blocks `scroll_camera_set_state_params` call | +| `0x2bbc` | `g_scroll_dirty` | Scroll direction changed flag (cleared when direction tracks) | +| `0x2bbd` | `g_scroll_dir_x` | Cached scroll direction X | +| `0x2bbe` | `g_scroll_dir_y` | Cached scroll direction Y | +| `0x2bbf` | `g_map_index` | Current map/level index `[0..250]` | +| `0x2bc1/0x2bc3/0x2bc5` | `g_map_entry_x/y/z` | Cached map entry X/Y/Z (vs. live map arrays) | +| `0x2bc6` | `g_map_slot_index` | Index into `0x7ded/0x7df1/0x7df5` arrays for current map slot | +| `0x2bca/0x2bc9` | `g_option_toggle_state` | UI option toggle state flags | +| `0x2bd1` | `g_scroll_block_flag` | Blocks camera update path if non-zero | +| `0x2bd3` | `g_scroll_active` | Non-zero = scroll system active | +| `0x2bd8` | `g_watch_entity_controller_farptr` | FAR ptr to the watch/camera controller object | +| `0x2be0` | `g_player_scroll_pos` | Cached player world X+Y (ulong) for scroll threshold detection | +| `0x8354..0x8358` | `g_scroll_state_params` | Three scroll state params (word, word, byte) | + +--- + +## Deep Analysis: Coordinate Transform System + +### `world_to_screen_coords` at `0004:e7bd` (NE seg018:07bd) + +**Signature:** +```c +void world_to_screen_coords(int world_x, int world_y, int *screen_x, int *screen_y) +``` + +**Isometric Projection Math:** +``` +screen_x = (world_x - world_y) / 2 - camera_x // SAR 1 (signed divide) +screen_y = (world_x + world_y) / 4 - camera_y // SHR 2 (unsigned divide) +``` + +Camera globals: `g_scroll_offset_x` (DS:`0x2bb7`), `g_scroll_offset_y` (DS:`0x2bb9`). + +**Assembly detail:** +- `SAR AX, 1` for screen_x — signed arithmetic shift preserves sign for negative (world_x - world_y) differences +- `SHR AX, 2` for screen_y — unsigned logical shift (sum world_x + world_y is always positive) +- The 2:1 ratio (÷2 for X, ÷4 for Y) produces the classic 2:1 isometric diamond tile shape + +**Coordinate axes on screen:** +- World X axis → lower-right on screen (+0.5 screen_x, +0.25 screen_y per world unit) +- World Y axis → lower-left on screen (-0.5 screen_x, +0.25 screen_y per world unit) +- Camera subtraction converts absolute world-space to viewport-relative screen coordinates + +**Callers (17 across 8 NE segments):** + +| Call site | NE Segment | Context | +|-----------|-----------|---------| +| `0004:7d6f` | seg012 | Map/tile rendering | +| `0005:0305` | seg021 | Entity system | +| `0005:432f` | seg021 | Entity placement | +| `0005:4457` | seg021 | Entity placement | +| `0005:6f8f` | seg022 | Entity rendering | +| `0005:7263` | seg022 | Entity rendering | +| `0007:2262` | seg040 | `snap_entity_to_ground` — ground alignment | +| `0007:237d` | seg040 | Ground snap dispatch | +| `0007:cf4e` | seg049 | Entity positioning | +| `0007:d039` | seg049 | Entity positioning | +| `0007:d43f` | seg049 | Entity positioning | +| `0007:d6fe` | seg049 | Entity positioning | +| `0008:3223` | seg053 | Entity-to-screen render setup | +| `0008:32e7` | seg053 | Entity-to-screen render setup | +| `0008:334b` | seg053 | Entity-to-screen render setup | +| `000b:858b` | seg115 | Sprite system | +| `000b:f100` | seg120 | Sprite system | + +**Entity struct layout (from seg053 caller at `0008:31f6`):** +``` +entity_array_base = far ptr at [DS:0x2cff] +entity_struct_size = 19 bytes (0x13) +entity.world_x = offset +0x0a (word) +entity.world_y = offset +0x0c (word) +``` + +### Comparison: Two Coordinate Transform Functions + +| Property | `world_to_screen_coords` (`0004:e7bd`) | `world_to_screen_isometric` (`0007:be67`) | +|----------|---------------------------------------|----------------------------------------| +| Input type | Fine-grained world units (entity positions) | Coarse tile-grid units (map rendering) | +| screen_x | `(wx - wy) / 2 - cam_x` | `(wx + sx) + (wy + sy) * 2` | +| screen_y | `(wx + wy) / 4 - cam_y` | `(wy + sy) * 2 - (wx + sx)` | +| Camera handling | Subtracted after transform | Added before transform | +| Operations | Division (SAR/SHR) | Multiplication (SHL) | +| Aspect ratio | 2:1 (from /2 : /4) | 2:1 (from 1 : 2 multipliers) | + +Both functions implement the same 2:1 isometric projection but at different coordinate scales. `world_to_screen_coords` divides down from fine world units while `world_to_screen_isometric` multiplies up from coarse tile units. + +### Adjacent Function: `map_position_equal` at `0004:e784` + +Compares two 5-byte `map_position` structs: `{ x:word, y:word, layer:byte }`. Returns 1 (AL) if all three fields match, 0 otherwise. Located immediately before `world_to_screen_coords` in seg018. diff --git a/docs/raw-0008-000c.md b/docs/raw-0008-000c.md new file mode 100644 index 0000000..906fa53 --- /dev/null +++ b/docs/raw-0008-000c.md @@ -0,0 +1,361 @@ +# Raw 0008 & 000c: Dispatch Helpers & State Machine + +Content extracted from `crusader_decompilation_notes.md`. Covers the 0008 gameplay dispatch helper cluster and all 000c state machine helpers. + +--- + +## Raw 0008 Gameplay Dispatch Helper Batch + +Small conservative rename batch from direct field-write behavior in the `0008:ba00-0008:be05` cluster. + +### Newly renamed functions + +| Address | Name | Evidence | +|---------|------|---------| +| `0008:ba00` | `entity_dispatch_entry_init` | Constructor-style init: optional alloc (`0x32` bytes), vtable/list-link setup (`0x3b06`, `0x2d10`, `0x3afe`), zeroes state fields, seeds group from global active layer `0x39c9` via `entity_set_group_id` | +| `0008:bbb6` | `entity_set_source_type` | Writes entry word field `+0x04` from incoming parameter, then dispatches through FAR thunk path | +| `0008:bc27` | `entity_set_event_type_checked` | Writes entry word field `+0x06`; when source field `+0x04` is non-zero, validates old/new event transition, including special checks for `0xF0-0xF7` and upper bound `<= 0x0FFF` | +| `0008:bca8` | `entity_set_group_id` | Validates group id range `1..31`, writes low 5-bit group in byte `+0x08`, decrements old per-group counter and increments new one via counter table pointed to by `0x39c5` | +| `0008:bd53` | `entity_dispatch_entry_unlink` | Clears bit `0x1000` in flags2 at `+0x18` and zeroes the four link/state words at `+0x0a..+0x10`; used as the common unlink/reset tail in the local dispatch-entry pruning path | +| `0008:be05` | `entity_increment_group_id` | Computes `((entry+0x08)&0x1F)+1`, validates against active-layer assumptions (`0x39c9`), then applies through `entity_set_group_id` | + +### Verified call/xref notes + +- `entity_set_group_id` is called from `entity_dispatch_entry_init` (`0008:bae4`) and `entity_increment_group_id` (`0008:be57`). +- `entity_set_source_type` is used from `FUN_0008_c92f` (`0008:c94d`, `0008:c96d`) and `FUN_0008_ca18` (`0008:ca36`, `0008:ca56`). +- `0008:bd79` remains positional, but current evidence shows it compares an entry extent/position tuple against the player world position (`g_player_entity_farptr + 0x40/+0x42`), optionally fires the vtable callback at `+0x28` when flag `0x100` is armed, then calls `entity_dispatch_entry_unlink`. + +### Gameplay relevance + +This cluster manages core dispatch-entry metadata (`source_type`, `event_type`, group/layer byte and counters) that feeds the seg021 scheduler/event system. The field offsets match the current seg021 entity/dispatch layout notes (`+0x04`, `+0x06`, `+0x08`). + +--- + +## Raw 0008 Pair-Sync Helper Batch + +Conservative directional rename batch from the `0008:c7f1-0008:cad7` cluster. These functions are clearly paired and structurally symmetric, but final gameplay semantics are still partial due to FAR-thunk heavy internals. + +### Newly renamed functions + +| Address | Name | Evidence | +|---------|------|---------| +| `0008:c7f1` | `entity_pair_update_link_slot_a` | Guards on entry flags (`+0x16` must not include `0x4000`), then dispatches through FAR thunk using entry local struct at `+0x28` and partner-side key/id input | +| `0008:c890` | `entity_pair_update_link_slot_b` | Twin of `entity_pair_update_link_slot_a` with identical call shape and guard behavior; used in opposite order by pair-sync wrappers | +| `0008:c92f` | `entity_pair_sync_a` | If either side has unset `source_type` (`+0x04`), copies from partner via `entity_set_source_type`; then calls link-slot helpers in A-order and ends in FAR thunk using first side `+0x1e` data | +| `0008:ca18` | `entity_pair_sync_b` | Mirror of `entity_pair_sync_a` with reversed side/order for helper calls and final thunk argument ordering | +| `0008:c9ee` | `entity_pair_mark_and_sync_a` | Sets bit `0x10` in entry flags at `+0x16`, then calls `entity_pair_sync_a` | +| `0008:cad7` | `entity_pair_mark_and_sync_b` | Sets bit `0x10` in entry flags at `+0x16`, then calls `entity_pair_sync_b` | + +--- + +## Raw 0008 Flag-0x20 Target-State Helpers + +Two complementary helpers near the pair-sync cluster. + +| Address | Name | Evidence | +|---------|------|---------| +| `0008:cb2c` | `entity_flag20_clear_and_update_target` | Clears bit `0x20` at entry flags `+0x16`; if non-null target args are provided, writes far-pointer target fields `+0x12/+0x14`; then calls shared refresh helper `0008:c01d` | +| `0008:cb5c` | `entity_flag20_set_and_init_target` | Sets bit `0x20` at entry flags `+0x16`; initializes target far-pointer fields `+0x12/+0x14` only when currently zero; then calls shared refresh helper `0008:c01d` | + +Both helpers share the same post-update refresh path (`0008:c01d`), suggesting they are two state transitions in one target/link-management subsystem. + +--- + +## Raw 0008 Dispatch Refresh Pipeline + +Follow-up rename batch for the shared refresh node used by the flag-0x20 helpers. + +| Address | Name | Evidence | +|---------|------|---------| +| `0008:c01d` | `entity_refresh_dispatch_state` | Early-exit when flags at `+0x16` indicate dead (`0x8`) or already refreshed (`0x4000`); otherwise runs pre-clear, sets `0x4000`, calls update vfunc path, then runs flag-conditioned handlers | +| `0008:bfb2` | `entity_clear_status_bits_from_flags` | Clears specific bits in status word at `+0x32` based on state flags (`+0x16:0x400`, `+0x18:0x40/0x80`) | +| `0008:bf8e` | `entity_call_update_vfunc14` | Calls helper `0008:be6b`, then dispatches entity vtable call at offset `+0x14` | +| `0008:beee` | `entity_run_flagged_handlers` | Executes handler calls gated by flags (`+0x16:0x400/0x4`, `+0x18:0x40/0x80`) and then dispatches via FAR thunk using entry slot/index (`+0x2`) | + +State pipeline after target/link changes: flag-gated status clear → mark refreshed (`0x4000`) → vtable update callback → flag-conditioned subsystem handlers. + +--- + +## Raw Import Note: `0000:ffff` Thunk Target + +`FUN_0000_ffff` renamed to `unresolved_far_thunk_dispatch`. Current raw-import evidence indicates this is **not valid local executable logic** in this program view: +- Decompiler emits overlapping-instruction warnings and bad-control-flow warnings. +- Disassembly from `0000:ffff` into `0001:xxxx` is nonsensical/misaligned (mixed data/code artifacts). +- The body is heavily shared as a call sink from many segments, consistent with unresolved inter-segment thunking in this import mode. + +Treat calls to `unresolved_far_thunk_dispatch` as unresolved external/indirect dispatch edges. Semantic recovery should continue from call-site argument setup and local field effects. + +--- + +## Raw 0008 Flag-0x100 and Constructor-Variant Batch + +| Address | Name | Evidence | +|---------|------|---------| +| `0008:d1a4` | `entity_set_flag100_in_flags2` | Gate-checked setter: ORs bit `0x100` into entry word at `+0x18` | +| `0008:d1dc` | `entity_clear_flag100_in_flags2` | Gate-checked clearer: ANDs entry word at `+0x18` with `0xFEFF` (clears bit `0x100`) | +| `0008:cefb` | `entity_dispatch_entry_ctor_vtbl_3ad2` | Constructor variant: allocates if null, reinitializes via `entity_dispatch_entry_init`, sets vtable `0x3ad2`, sets flag `0x100` at `+0x16`, and zeroes the extension words at `+0x32/+0x34` | +| `0008:d214` | `entity_dispatch_entry_ctor_vtbl_3aa6` | Constructor variant: allocates `0x40` bytes if null, reinitializes via `0008:cefb`, sets vtable to `0x3aa6`, sets flag `0x200` at `+0x16`, zeroes fields `+0x38..+0x3e` | + +--- + +## Raw 0008 Periodic/Counter Helpers + +Follow-up renames from the `0008:d313-0008:d47d` cluster tied to the `0x3aa6` constructor branch. + +| Address | Name | Evidence | +|---------|------|---------| +| `0008:d313` | `entity_periodic_accumulate_and_dispatch` | Adds global delta (`0x39d0/0x39d2`) into entry accumulator (`+0x3c/+0x3e`), wraps against period (`+0x38/+0x3a`), and on wrap invokes entry vtable callback at `+0x28` with reentrancy guard bit `0x400` in `+0x18` | +| `0008:d3e6` | `entity_set_flag2000_and_update_active_counters` | Atomic (CLI/PUSHF) set of bit `0x2000` in `+0x16`; if bit `0x400` is set, decrements global counter `0x39f6` and increments `0x39f4` | +| `0008:d433` | `entity_clear_flag2000_and_update_active_counters` | Atomic clear of bit `0x2000` in `+0x16`; if bit `0x400` is set, decrements `0x39f4` and increments `0x39f6` | + +The `0x39f4/0x39f6` counter swap implies global bookkeeping for a scheduler subset associated with these entries. + +--- + +## Raw 0008 Word-List Management Batch + +Verified helper cluster for entry-owned word-list storage (sentinel-terminated with `0x0408`). + +| Address | Name | Evidence | +|---------|------|---------| +| `0008:da00` | `entity_word_list_set_0408_terminated` | Rebuilds/replaces entry list from stack-provided words terminated by `0x0408`; frees prior list pointer at `+0x06/+0x08`; allocates and populates new list | +| `0008:dba3` | `entity_word_list_free_existing` | Validates list pointer exists, then frees old list buffer referenced by `+0x06/+0x08` | +| `0008:dbec` | `entity_word_list_destroy` | Resets vtable to `0x2d10`, frees list if present via `entity_word_list_free_existing`, and optionally frees object when destroy flag bit `1` is set | +| `0008:dc38` | `entity_word_list_ensure_contains` | Scans existing list for a given word; if missing, appends through `entity_word_list_append_unique` | +| `0008:dcab` | `entity_word_list_append_unique` | Allocates larger list, copies existing words, appends new word plus `0x0408` terminator, frees old list, then rebuilds via `entity_word_list_set_0408_terminated` | + +Entry fields used by this subsystem: count at `+0x02`, list far pointer at `+0x06/+0x08`. The explicit `0x0408` terminator appears in both scanner/build logic and append path. + +--- + +## Raw 0008 Word-List Access/Mutation Batch + +Follow-up renames extending the same list subsystem. + +| Address | Name | Evidence | +|---------|------|---------| +| `0008:deea` | `entity_word_list_get_at` | Bounds-checks index against count (`+0x02`) and returns word from list pointer (`+0x06/+0x08`, stride 2) | +| `0008:df1b` | `entity_word_list_set_at` | Bounds-checks index then writes value into list element (`+0x06/+0x08`, stride 2) | +| `0008:dfa1` | `entity_word_list_find_unflagged_by_id10` | Scans list and returns first value satisfying `(value & 0x400)==0` and `(value & 0x3ff)==requested_id`; writes `0` when not found | +| `0008:ddaf` | `entity_word_list_remove_value` | Removes matching value(s) by counting survivors, rebuilding compact storage for non-matching entries, freeing old list storage, and updating list state | + +List entries pack a 10-bit id plus flag bits (`0x400` observed). + +--- + +## Raw 0008 Gate-Callback Wrapper Batch + +Conservative renames for callback wrappers sharing the same global gate condition. + +| Address | Name | Evidence | +|---------|------|---------| +| `0008:d00e` | `entity_gate_callback_wrapper_a` | Gate check on globals `0x39a8/0x39f9/0x3991`; on pass dispatches callback through unresolved thunk using entry `+0x2` and `[0x3b32:0x3b34] + 0x32` | +| `0008:d05f` | `entity_gate_callback_wrapper_b` | Same gate pattern; callback wrapper variant via unresolved thunk | +| `0008:d0b0` | `entity_gate_callback_wrapper_c` | Same gate pattern; passthrough-style callback wrapper | +| `0008:d0ed` | `entity_gate_callback_wrapper_d` | Same gate pattern; passthrough-style callback wrapper | +| `0008:d12a` | `entity_gate_callback_wrapper_e` | Same gate pattern; passthrough-style callback wrapper | +| `0008:d167` | `entity_gate_callback_wrapper_f` | Same gate pattern; passthrough-style callback wrapper | +| `0008:d3d2` | `entity_slot_callback_wrapper` | Thin wrapper: pushes entry slot/index (`+0x2`) and dispatches through unresolved thunk | + +--- + +## Additional Unresolved Thunk Stubs + +Follow-up thunk census after inspecting `0000:ffff` behavior. All of the following are single-instruction wrappers (`CALLF 0000:ffff`): + +| Address | New Name | Observed Caller(s) | +|---------|----------|--------------------| +| `0004:2592` | `thunk_callf_0000_ffff_0004_2592` | `0004:262d` (`FUN_0004_2620`) | +| `000b:f924` | `thunk_callf_0000_ffff_000b_f924` | `000b:0144` (`FUN_000b_010b`) | +| `000c:827d` | `thunk_callf_0000_ffff_000c_827d` | `000c:8985`, `000c:8f96` (`FUN_000c_88b4`) | +| `000c:82f9` | `thunk_callf_0000_ffff_000c_82f9` | `000c:8a10`, `000c:8f79`, `000c:9052` | +| `000c:8356` | `thunk_callf_0000_ffff_000c_8356` | `000c:84a9` (`FUN_000c_84a5`) | +| `000c:e4f9` | `thunk_callf_0000_ffff_000c_e4f9` | `000c:e4f5` (`FUN_000c_e4e0`) | + +`unresolved_far_thunk_dispatch` is represented by multiple local trampoline copies in different segment regions. Separating them by address improves call-graph navigation. + +--- + +## Raw 000c State-Dispatch Helper Cluster + +After separating thunk stubs, a coherent local state/chain management cluster was lifted in `000c:ab32-000c:ac8f`. + +| Address | Name | Evidence | +|---------|------|---------| +| `000c:ab32` | `entity_state_tick_dispatch` | Core state tick helper using fields `+0x38/+0x39/+0x3b/+0x3d/+0x5b`; clears mode bit `0x100` when `+0x38==0`, may call cleanup helper `000c:ac55`, calls `000c:7730(state,1)`, and conditionally advances chain | +| `000c:ab96` | `entity_state_reset_and_tick_dispatch` | Reset wrapper: zeroes `+0x38` and `+0x39` then calls `entity_state_tick_dispatch` | +| `000c:abb4` | `entity_state_advance_next_or_fallback_a` | Advance path A: when `+0x49!=0`, follows node-next pointers from `+0x3b/+0x3d` using offsets `+2/+4`; when exhausted, either clears active flag and re-dispatches, or falls back to backup pointer `+0x41/+0x43` | +| `000c:ac8f` | `entity_state_advance_next_or_fallback_b` | Advance path B: same structure as A but follows alternate node offsets `+6/+8` and fallback pointer `+0x45/+0x47` | + +--- + +## Raw 000c State-Flag Guard / Input Handler Batch + +Second sweep through `000c` adjacent helpers — gated thunk wrappers and input/animation tick handlers. + +| Address | Name | Evidence | +|---------|------|---------| +| `000c:9f74` | `entity_state_flag100_check_and_dispatch` | Init latch guard at `[0x6053]`; clears `[0x8c55]` on first call; checks `[ptr+0x5b]` bits `0x100` and `0x40`; three-path thunk dispatch | +| `000c:a1ad` | `entity_state_clear_flag40_and_dispatch` | Skips if `[ptr+0x5b]` has `0x180` bits set; if `0x40` set, clears it and calls far ptr at `[0x5e82/0x5e84]`; then dispatches twice with args `(0x0b,0x10,0x1,0x0)` (record/state-key pattern) | +| `000c:a74e` | `entity_state_dispatch_if_flag_bit2` | Tests `[ptr+0x5b]` bit `0x2`; if set pushes extra arg + ptr and dispatches via thunk | +| `000c:84c3` | `entity_state_set_byte40_at_global_ptr` | Sets byte `[DAT_0000_6828 ptr + 0x40] = 1` then calls thunk unconditionally; enables global entity flag | +| `000c:ac55` | `entity_state_fire_if_handle_valid` | Guard: fires thunk dispatch only when `[0x6054] != -1`; no-op otherwise | +| `000c:ac6d` | `entity_state_fire_with_args_if_handle_valid` | 3-arg variant: pushes `[BP+0xe]` (byte), `[BP+0xc]`, `[BP+0xa]`, handle `[0x6054]`, then `CALLF 0000:ffff` | +| `000c:afa5` | `entity_state_check_field49_and_call_vfunc3c` | Checks field `[ptr+0x49]`: −1→reset to 0 return 1; 2→call `vtable[0x3c]` return 0; else thunk dispatch | +| `000c:b153` | `entity_state_animation_done_tick` | Checks `[param_2+0x14+0xa]` animation-complete flag; if zero increments `field49` and calls `entity_state_check_field49_and_call_vfunc3c`; if set calls `vtable[0x3c]` | +| `000c:b199` | `entity_state_input_key_handler` | Full input dispatcher: ESC/x/X → `vtable[0x3c]` (cancel); Left/Right arrows `0x14b/0x148` → prev state; n/N/`0x14d/0x150` → next state; e/E → set `field47=1`; `-` with counter → trigger at 4. Manages `field47` and `field49` | +| `000c:b2c3` | `stub_noop_000c_b2c3` | Empty stub; returns immediately | +| `000c:b2c8` | `entity_state_dispatch_if_field49_eq4` | Fires thunk only when `[ptr+0x49]==4` | +| `000c:b349` | `entity_state_dispatch_if_far_ptr_nonzero_a` | Fires thunk if far-pointer args non-zero | +| `000c:b383` | `entity_state_set_field3f_and_dispatch` | If non-NULL: writes `&DAT_0000_2d18` to `[ptr+0x3f]`, then dispatches | +| `000c:b3d8` | `entity_state_dispatch_if_far_ptr_nonzero_b` | Same null-guard pattern as `b349`, variant b | + +**Patterns confirmed:** +- `field49` = state-sequence index; 0=reset, 2=vtable callback, 4=triggered end +- `field47` = keystroke-combo counter +- `field3f` = linked data pointer (event/record reference) +- `[0x6054]` = current entity handle; `[0x6828]` = another global entity far pointer +- Bits in `[ptr+0x5b]`: `0x1=init`, `0x2=active/event`, `0x40=pending dispatch`, `0x100=flag100`, `0x180=skip-all mask` + +--- + +## Raw 000c Palette Fade + Entity VM Cluster + +### VGA Palette Fade + +| Address | Name | Evidence | +|---------|------|---------| +| `000c:cdde` | `palette_fade_step_down` | Writes (R−offset, G−offset, B−offset) clamped to 0 to VGA I/O `0x3c8/0x3c9`; decrements `[0x630d]` by step `[0x6316]`; clears active at `[0x630a]` when black | +| `000c:ce57` | `palette_fade_step_up` | Same loop, adds offset, clamps at 63 (`0x3f` full VGA). Clears `[0x630a]` when fully bright | + +Globals used: `[0x6312]`=start index, `[0x6314]`=count, `[0x630e]`=palette src ptr, `[0x630d]`=brightness offset, `[0x6316]`=step, `[0x630a]`=active flag. + +### Entity Mini-VM / Record-Player Context + +| Address | Name | Evidence | +|---------|------|---------| +| `000c:f6b8` | `record_table_get_by_index` | Bounds check `param < [0x8c88]`; return `word at [0x8c84 + param*4]`. Table at `0x8c84` | +| `000c:f6e8` | `entity_vm_stack_init_with_data` | Init stack ptrs at `[ptr+0xcc..+0xd4]` pointing to self; max depth 199; copies optional initial data | +| `000c:f772` | `entity_vm_state_copy` | Copies 200 bytes (100 words from `[src+4]` to `[dst+4]`), then copies 4 words at `+0xcc..+0xd2` | +| `000c:f7c7` | `entity_vm_stack_push_frame` | Push call-frame: saves ret offset at `[ptr+0xd4]`, decrements `[ptr+0xcc]` by param_size, zeroes new frame | + +### Current EUSECODE / event bridge notes + + +- `entity_vm_set_value_from_slot_plus_offset` (`000c:f95f`) now provides a concrete bridge from the `000c` mini-VM cluster into the `000d` event/countdown lane: + - it calls `FUN_000d_5572(*(word *)0x6611, *(word *)0x6613, param_3, param_4, 0, 0)` + - then stores the returned far pair into target object fields `+0xd6/+0xd8` +- `entity_vm_slot_load_value_plus_offset` (`000d:5572`) is a thin wrapper over `entity_vm_slot_load_value` (`000d:51fd`), and `entity_vm_slot_load_value` contains a verified `PUSH 0x410` path at `000d:5290` before calling the unresolved seg091 event/abort lane at `000a:44fd`. +- This is not enough yet to say that `entity_vm_set_value_from_slot_plus_offset` is the immortality trigger, but it does show that the `000c` mini-VM / record-player cluster can hand work directly into a `000d` helper that emits event `0x410`. +- Supporting renamed helpers in the same lane now include: + - `entity_vm_slot_find_or_select` (`000d:4e7c`): scans 0x26-byte slot records, returns a matching slot id when present, and tracks one fallback slot for reuse/eviction + - `entity_vm_slot_decrement_use_count` (`000d:558d`): decrements one slot-use counter and traps on underflow + - `entity_vm_slot_release_value` (`000d:5617`): releases one slot value, restores the owner's `0x1300/0x1302` budget pair, writes the slot state back to `-1`, and notifies through `000a:2b9d` + - `entity_vm_opcode_finish` (`000d:3350`): shared VM opcode epilogue used by the `000d:039f`, `000d:08a2`, `000d:0988`, `000d:177c`, and `000d:1acb` handlers; if the local result slot is non-zero it writes the current referent id to `0x8c94`, optionally pops one `slot_array` frame through `0x659c/0x659e`, and returns the opcode result from local state + - `entity_vm_referent_chain_remove_matching_from` (`000d:6a9a`): destructive chain-difference helper used by the `0x1a/0x1b` opcode path in `000d:0988`; it walks one source chain against a destination chain, removes matching entries in place, and frees removed registry nodes / indirect payloads + - `entity_vm_referent_chain_set_entry_data_at` (`000d:6cf6`): finds one chain entry by index and overwrites its payload in place, including indirect/string cleanup when the chain uses indirect storage +- The surrounding runtime/context family is now materially clearer too: + - `entity_vm_runtime_create` / `entity_vm_runtime_init_slots` / `entity_vm_runtime_release_slots` / `entity_vm_runtime_destroy` (`000d:4c99`, `000d:4d36`, `000d:4d75`, `000d:4e01`) are the global `0x6611` owner for this lane; they allocate the 0x2040-byte runtime body, clear the 0x80-entry slot table, manage the runtime budget/default fields at `+0x1300..+0x1314`, and retain one owner/resource object at `+0x1315/+0x1317` returned by `000d:7000` + - `entity_vm_slot_index_from_entity` (`000d:45c5`) computes one slot index from a gameplay entity by branching on seg021 class/type helpers and then adding one of the current runtime base offsets `0x8c7c/0x8c7e/0x8c80` + - `entity_vm_context_try_create_masked_for_entity` (`000d:463a`) uses that slot index to test one owner-side mask entry before it creates a context, which is the strongest current bridge from gameplay entities into this VM lane + - `entity_vm_context_create_from_slot_index` (`000d:46ec`) allocates one `0x6714` context object, seeds its `+0xd6/+0xd8` lane through `entity_vm_slot_load_value_plus_offset`, initializes the local mini-VM state, and can prepend caller data into the backward-growing buffer at `+0x102` + - `entity_vm_context_sync_global_value_and_dispatch` (`000d:48da`) is the current context-side runner/sync point: it marks the context busy at `+0x123`, calls `entity_vm_set_field_da_to_global`, optionally writes the current value through `+0x11b/+0x11d`, and dispatches through the context vtable on success + - `entity_vm_context_save` / `entity_vm_context_load` / `entity_vm_context_destroy` / `entity_vm_context_free_buffer` (`000d:498f`, `000d:4a78`, `000d:4962`, `000d:48b6`) now pin down the lifecycle of this object family rather than leaving the whole `000d:45xx..4exx` island anonymous +- `entity_vm_context_try_create_masked_for_entity` is now better constrained at the return-value level too: after the runtime-disable check at `0x6610` and the owner-side slot-mask test succeed, it reports two distinct success shapes. Immediate-flagged contexts (`+0x16 & 0x0008`) clear the caller output word, while object-backed contexts return the created object's low word. That makes the helper a typed bridge from gameplay entities into VM-backed object results, not only a yes/no mask probe. +- The first opcode-level behavior split inside that runtime is now visible in the `000d:0988` family: + - one branch calls `entity_vm_referent_chain_append_unique_from`, which looks like an attach/union operation on the current referent payload chain + - the `0x1a/0x1b` branch instead calls `entity_vm_referent_chain_remove_matching_from`, which looks like the inverse operation and makes the opcode family materially closer to a graph-editing script VM than a flat event list + - both paths return through `entity_vm_opcode_finish`, so the referent-global write to `0x8c94` is now better understood as a shared interpreter epilogue rather than a unique quirk of one helper +- One additional runtime layer is now named under that context family: the referent registry at `0x8c8c/0x8c8e/0x8c90/0x8c94`. + - `entity_vm_referent_registry_init` / `entity_vm_referent_registry_destroy` (`000d:6000`, `000d:60bf`) allocate and free the registry buffer, seed the free-list/root metadata, and clear the current referent id at `0x8c94` + - `entity_vm_referent_registry_alloc` (`000d:613e`) allocates one registry node from the free list and stores the current referent id from `0x8c94` into node field `+0x04` + - `entity_vm_referent_registry_release_by_id` / `entity_vm_referent_registry_free_node` (`000d:6251`, `000d:62ac`) release all live nodes for one referent id and coalesce adjacent free nodes + - this makes `entity_vm_set_field_da_to_global` more important than it first looked: it writes `0x8c94` from the current context `+0xda` lane and then immediately enters the still-misaligned `000c:3350` body, so the referent selected by the context is now visibly feeding runtime registry state + - the registry nodes are not flat scalars only; the surrounding container helpers are now named too: + - `entity_vm_referent_chain_copy` / `entity_vm_referent_chain_append_unique_from` (`000d:6694`, `000d:68c3`) build deep-copied or deduplicated chains of referent-linked payloads + - `entity_vm_referent_chain_destroy`, `entity_vm_referent_chain_next`, and `entity_vm_referent_chain_append_node` (`000d:6602`, `000d:6651`, `000d:687b`) provide the list management shell + - `entity_vm_referent_chain_contains_entry`, `entity_vm_referent_chain_get_entry_data_at`, and `entity_vm_referent_chain_get_indirect_data` (`000d:6c31`, `000d:67f2`, `000d:6860`) show that some chains carry fixed-size inline payloads while others carry indirect string-like payload nodes +- This matters for script readability: the current runtime model is no longer only "one referent id hits one event." It now supports a more useful intermediate representation where one referent anchor can own one or more payload chains, and neighboring event-bearing descriptors can attach behavior to that anchor without duplicating the anchor's own record. +- Nearby descriptor work on `EUSECODE.FLX` is consistent with that model: event-bearing classes (`EVENT`, `NPCTRIG`, `SFXTRIG`, several `*_BOOT` records) use a stable `69:0A00 -> event` tag, while `JELYHACK` / `JELYH2` remain referent-only descriptors in a neighborhood that includes `TRIGPAD`, `SPECIAL`, `REE_BOOT`, `SURCAMEW`, and `SFXTRIG`. +- The strongest current callsites into this context-construction path are the large `000d:208b` and `000d:21ed` bodies, which both feed per-object stream/data state from `+0xcc/+0xce` into `entity_vm_context_create_from_slot_index` before continuing bytecode-style reads from the newly seeded `+0xd6/+0xd8` lane. That makes the `000d` interpreter/object lane a better current immortality target than the older `000e` text-parser hypothesis. +- The immediate producer chain for that `+0xcc/+0xce` stream state is now one layer tighter: + - `entity_vm_context_create_from_slot_index` (`000d:46ec`) allocates the `0x6714` context, then calls `entity_vm_context_setup` (`000c:f844`) on the embedded mini-VM object at context `+0x36`. + - `entity_vm_context_setup` delegates to `entity_vm_stack_init_with_data` (`000c:f6e8`), which seeds `[mini_vm+0xcc..+0xd2]` to point into the object's own payload area and optionally prepends caller-owned inline bytes by moving the stack pointer backward. + - `entity_vm_state_copy` (`000c:f772`) copies that same `+0xcc..+0xd2` stream/base quartet verbatim when one mini-VM object is cloned. + - Upstream of the setup helper, `000d:46ec` derives the source payload from the runtime owner table behind `0x6611 -> +0x1315/+0x1317`: with slot index `SI`, it walks owner table `*(owner+0x10/+0x12) + 0x0d*SI + 4`, passes that far pointer into `000c:f844`, and mirrors the resulting per-slot source into `0x39ca[slot]`. +- This sharpens the current JELYHACK-side model rather than overturning it: the code-side producer recovered in this batch is still a generic slot-backed VM source object keyed by gameplay-entity slot selection and owner-side mask bits, not a direct hard-coded descriptor-class switch on `JELYHACK` or `JELYH2`. Combined with the extractor evidence that `JELYHACK` / `JELYH2` remain referent-only while `REE_BOOT` / `SFXTRIG` keep active `event` tags and `SURCAMEW` keeps `eventTrigger`, the better fit is still `referent anchor -> slot-backed payload chain -> neighboring event-bearing attachment`. +- One exact numeric collision is now ruled out as unrelated noise rather than a second VM source: `000e:0953` in the animation/audio lane pushes literal `0x410` into imported `ASYLUM.27` immediately after setting the local audio-completion byte at `+0xef1`. Because `ASYLUM.DLL` is the `ASS_*` audio/media library, this does not weaken the attribution of gameplay event `0x410` to the `000d` VM/USECODE lane. +- Current best JELYHACK reading after this pass: `JELYHACK` itself still looks like a referent-only map/object descriptor, but that no longer makes it inert. A referent-only record can still matter by supplying the referent id that populates the VM referent registry, while neighboring classes such as `REE_BOOT`, `SURCAMEW`, and `SFXTRIG` supply the event-bearing logic attached to the same local object island. +| `000c:f844` | `entity_vm_context_setup` | Calls `entity_vm_stack_init_with_data`, then sets `+0xd6..+0xe3` with position/dimension/state params | +| `000c:f600` | `entity_vm_pair_stack_push` | Push (word_a, word_b) onto 31-entry array at `[ptr+0x80]` (count); error if full | +| `000c:f63c` | `entity_vm_pair_stack_pop` | Pop and return word from pair stack; error if empty | +| `000c:f94f` | `entity_vm_counter_add` | `[ptr+0xd6] += param_2`; simple accumulator | +| `000c:f95f` | `entity_vm_set_value_from_slot_plus_offset` | Calls `entity_vm_slot_load_value_plus_offset` and writes the resulting 32-bit value into `[ptr+0xd6/+0xd8]` | +| `000c:f98b` | `entity_vm_set_field_da_to_global` | Writes `[param_2+0xda far-ptr + 2]` into `[0x8c94]` | + +**VM field offsets:** `+0xcc`=VM stack ptr, `+0xce/+0xd0`=segment regs, `+0xd2`=base, `+0xd4`=frame depth, `+0xd6/+0xd8`=32-bit VM value/counter lane, `+0xda/+0xdc`=additional VM pointer/bounds lane. The 200-byte body region at `[ptr+4..+0xcc]` holds 100 words of script/state payload. The pair-stack (field `+0x80`) is separate — likely pass/return value stack for the mini-script. + +--- + +## Raw 000c Cursor Zone / Slot Array / String Queue Batch + +### Cursor / Directional Zone Classifier + +| Address | Name | Evidence | +|---------|------|---------| +| `000c:e6d9` | `cursor_zone_quadrant_classify` | Splits screen by `[0x63d6]/2` and `[0x63d8]/2` vs bounds `[0x8c6c..0x8c72]`; returns directional code from 9-word table at `0x6401` | + +Zone table layout (9 entries): NW/N/NE / W/Center/E / SW/S/SE based on horizontal threshold at `0x8c6c/0x8c70` and vertical at `0x8c6e/0x8c72`. + +### Slot Array System + +A complete 29-slot menu/choice array with fixed stride `0x15` bytes, base at `[ptr+0x67]`, count at `[ptr+0x7a]`: + +| Address | Name | Evidence | +|---------|------|---------| +| `000c:ea53` | `entity_slot_count_update_and_notify` | Sets `[ptr+0x72]=param-1`; calls `slot_array_get_current_entry` and `slot_array_find_and_dispatch`; calls `vtable[0]()` when `+0x75` flags set | +| `000c:eba5` | `slot_array_dispatch_matching` | Walks `0xb`-stride array from `[ptr+4]`; calls thunk for each entry where `[entry+9]==param_4` | +| `000c:ec30` | `slot_array_dispatch_if_nonempty` | Returns `0xffff` if count < 1; else dispatches | +| `000c:ec9e` | `slot_array_find_and_dispatch` | Searches `0xb`-stride array for `[entry+9]==param_4`; calls thunk on first match | +| `000c:ecf5` | `slot_array_push_entry` | Copies named string to `[base+0xc]`; writes 6 param words at `+0x12..0x20`; increments count | +| `000c:edb0` | `slot_array_push_raw` | Copies `0x15`-byte raw entry from `param_2`; increments count | +| `000c:edf7` | `slot_array_pop` | Decrements `[ptr+0x7a]`; asserts `>= 0` | +| `000c:ee19` | `slot_array_init` | Sets `[ptr+0x78]=0`, `[ptr+0x76]=0`, `[ptr+0x75]=1` (active flag) | +| `000c:ee32` | `slot_array_clear_flags` | Clears `[ptr+0x74]=0`, `[ptr+0x75]=0` | +| `000c:ee44` | `slot_array_get_current_entry` | Returns `ptr + [ptr+0x7a]*0x15 + 0x67` (current entry ptr); 0 if count <= 0 | + +### String Queue + +| Address | Name | Evidence | +|---------|------|---------| +| `000c:eadd` | `string_queue_push` | Appends string to 10-entry queue at `[ptr+4]`; count at `[ptr+2]`; sets `[ptr+0xd]=param_4` | + +### Additional VM-Adjacent Helpers + +| Address | Name | Evidence | +|---------|------|---------| +| `000c:f2e7` | `entity_call_vtable_entry_10_if_valid` | Null-guard: calls `(*[ptr+8+0x10])()` if `param_1` non-null | +| `000c:f39f` | `string_table_lookup` | Searches `[0x65bc/0x65be]` table by key string; returns matching words to out-params | + +--- + +## Raw 000c Cursor Nav Dispatcher / State Reset Batch + +Cursor navigation subsystem in `000c:d3e9–000c:db68`. Manages directional zone changes, mouse button reads, keyboard scancodes, and entity vtable dispatch for interactive UI cursors. + +### Cursor Navigation Fields (entity object offsets) + +| Offset | Purpose | +|--------|---------| +| `+0x32` | Current zone code (0–8) | +| `+0x33` | Previous zone code | +| `+0x37–+0x3a` | Directional booleans: N/S/W/E | +| `+0x3f–+0x42` | Mouse button flags | +| `+0x45` | Last keyboard scancode | +| `+0x47` | Navigation index | + +Globals: `[0x63da]` = mouse button state, `[0x63d6]/[0x63d8]` = cursor X/Y, `[0x638e]` and `[0x6346]` = reference data tables. + +| Address | Name | Evidence | +|---------|------|---------| +| `000c:dac1` | `cursor_nav_state_reset` | Zeros all directional/button flags; sets `[+0x32/+0x33]=0xff`, `[+0x47]=0xffff` | diff --git a/docs/raw-000a-000d.md b/docs/raw-000a-000d.md new file mode 100644 index 0000000..87c0258 --- /dev/null +++ b/docs/raw-000a-000d.md @@ -0,0 +1,257 @@ +# Raw 000a & 000d: Tracked Handles, Cache Manager & Proximity Buckets + +Content extracted from `crusader_decompilation_notes.md`. Covers the 000d proximity/visibility bucket cluster, 000a tracked-handle table, generic cache manager, seg082 allocator, seg137/138 palette helpers, and seg004/seg005 startup paths. + +--- + +## Raw 000d Proximity/Visibility Bucket Cluster + +Small conservative rename batch from the `000d:cc00-d413` region. + +| Address | Name | Evidence | +|---------|------|---------| +| `000d:cc00` | `entity_compute_proximity_or_visibility_bucket` | Returns bucket `0x40` for null or on-screen entities (`entity_projected_bbox_overlaps_viewport`), else computes a distance bucket from the current reference entity at `0x7e22` with thresholds `0x17d`, `0x281`, `0x3c1` mapping to `0x32`, `0x20`, `0x10`, `0x08` | +| `000d:d413` | `entity_refresh_recent_proximity_or_visibility_buckets` | Walks the last four active records in the `0x69ac` array, recomputes the same bucket, stores it back to each entry, and calls `000a:6343` when the bucket changes | +| `000d:cdd0` | `tracked_entity_bucket_prune_invalid_entries` | Walks the `0x69ac` array, validates backing handles through `000a:637a`, and clears entry handles to `0xffff` when the backing object is gone | +| `000d:cd62` | `tracked_entity_bucket_find_free_main_slot` | Finds the first free entry in the main portion of the `0x69ac` array (`0 .. count-4`) | +| `000d:cd9a` | `tracked_entity_bucket_find_free_aux_slot` | Finds the first free entry in the auxiliary tail portion of the `0x69ac` array (`count-4 .. count-1`) | + +### Supporting caller notes + +- `000d:ce1e` populates one `0x69ac` entry by reserving a free slot, computing the initial bucket through `entity_compute_proximity_or_visibility_bucket`, storing both current and previous bucket fields, then allocating/linking the backing handle through `000a:5f36`. +- `000d:d409` is a thin wrapper that only calls `entity_refresh_recent_proximity_or_visibility_buckets`. +- `000d:cfad` is an update-or-allocate helper for `(param_1,param_2)` pairs: it tries to update an existing tracked entry through `000a:606a`, clears dead entries, and falls back to `000d:ce1e` allocation when no live match remains. +- `000d:cec5` is the auxiliary-slot allocator: it prunes invalid entries, uses `tracked_entity_bucket_find_free_aux_slot`, tags the new entry with byte `+0x0a = 1`, and seeds its handle via `000a:5f36(..., flag=1)`. +- `000a:606a` = `tracked_entity_bucket_handle_update_or_alloc` — updates the backing handle for an existing tracked bucket entry when possible, or falls back to allocation via `000a:5f36` if the handle has gone stale. +- `000d:d350` = `tracked_entity_bucket_set_value` — finds a tracked `(entity_id, entity_ref)` entry and pushes a new bucket value into its backing handle through `000a:6343`. +- `000d:d10b` = `tracked_entity_bucket_clear_ref_field` — clears only the `+0x02` reference field for all matching entries. +- `000d:d151` = `tracked_entity_bucket_remove_by_ref` — marks matching entries' backing handles for removal and clears the local entry handle/reference fields. +- `000d:d1b1` = `tracked_entity_bucket_remove_tagged_by_ref` — same removal path, but only for entries whose byte `+0x0a` tag is set. + +--- + +## Raw 000a Tracked-Handle Table + +The `0x4673` table is the backing handle registry for the `0x69ac` tracked-entry bucket subsystem. That client layer sits on top of a separate generic cache manager rooted at `0x4688..0x46b7`. + +| Address | Name | Evidence | +|---------|------|---------| +| `000a:5f02` | `tracked_entity_handle_find_slot` | Linear scan over 12 entries in the `0x4673` table for a matching 32-bit handle id | +| `000a:602b` | `tracked_entity_handle_is_live` | Returns true only when a handle exists in `0x4673` and its flag word at `+0x0a` does not have bit `0x0002` set | +| `000a:60eb` | `tracked_entity_handle_mark_remove` | Sets bit `0x0002` in the handle-table flag word and dispatches through the unresolved cleanup path | +| `000a:612e` | `tracked_entity_handle_mark_remove_all` | Iterates all 12 handle-table entries and marks each live handle for removal | +| `000a:6167` | `tracked_entity_handle_alloc_slot` | Allocates a slot in one of two ranges (`0..7` or `8..11`) depending on the aux flag; when full, wraps in a ring and evicts via `tracked_entity_handle_mark_remove` before reusing the slot | +| `000a:6228` | `tracked_entity_handle_prune_removed` | Reaps entries previously marked with bit `0x0002`, clears dead slots, and refreshes high-index entries through `000a:6b2d` | +| `000a:63bc` | `tracked_entity_handle_find_by_entity` | Finds the first live handle-table entry whose key/entity word at `+0x04` matches the requested entity id | + +### Handle entry layout (stride `0x0c`) + +| Offset | Field | +|--------|-------| +| `+0x00` | 32-bit handle id | +| `+0x04` | key/entity id | +| `+0x06` | class/group/source-style selector | +| `+0x08` | current bucket/value | +| `+0x0a` | flags (`bit0` = aux-slot allocation, `bit1` = pending removal) | + +### Thin public wrappers + +| Address | Name | +|---------|------| +| `000a:5276` | `entity_bucket_track_default_main` — gated by `0x45aa`; creates or refreshes a main-slot tracked handle with bucket `0x40` and selector `0xff` | +| `000a:5294` | `entity_bucket_track_main` — same path, but takes the bucket value as an argument for the main-slot range | +| `000a:52d0` | `entity_bucket_track_default_aux` — aux-slot variant with default bucket `0x40` | +| `000a:52ee` | `entity_bucket_track_aux` — aux-slot variant with explicit bucket argument | + +--- + +## Raw 000a Generic Cache Manager + +Follow-up analysis of `000a:6b2d` and the `0x4688..0x46b7` globals shows that this region is a generic cache manager used by the tracked-handle layer, not part of the tracked-entity subsystem itself. + +| Address | Name | Evidence | +|---------|------|---------| +| `000a:6b2d` | `cache_lookup_or_load_entry_by_id` | Fast-paths the last id via `0x46af/0x46b1`, otherwise searches `0x469d`, evicts older cache slots until there is room under byte budget `0x46a5`, allocates a block from the free-list, clears/initializes the payload, records the id, and dispatches through the loader interface at `0x468c` | +| `000a:6a95` | `cache_release_entry_by_slot` | Releases a cached slot by index, clears any client references through `000a:62d8`, frees its backing block through `cache_free_block_by_slot`, and marks the slot id in `0x469d` as unused (`0xffff`) | +| `000a:6d07` | `cache_alloc_block_for_slot` | Allocates or splits a block from the free-list anchored at `0x4688`, tags it with the owning cache slot index, and updates the in-use byte count at `0x46a9` | +| `000a:6f4d` | `cache_free_block_by_slot` | Finds the free-list node for a cache slot, marks it free, subtracts its size from `0x46a9`, and coalesces adjacent free blocks | +| `000a:67d9` | `cache_shutdown` | Tears down the generic cache manager: flushes/reset state, frees slot arrays at `0x4699/0x469d/0x46b3`, frees the free-list container at `0x4688`, and closes backing state at `0x4691` | +| `000a:6898` | `cache_set_loader_interface` | Installs the backend loader/callback interface pointer at `0x468c` | + +### Cache globals + +| Address | Name | Notes | +|---------|------|-------| +| `0x4688` | free-list/block-list head | Used by `cache_alloc_block_for_slot` and `cache_free_block_by_slot` | +| `0x468c` | cache_loader_interface | Backend callback table; `+0x34` = size query, `+0x0c` = load/bind callback | +| `0x4695` | arena base pointer | Base for the raw cache payload arena | +| `0x4699` | per-slot payload-pointer table | | +| `0x469d` | per-slot cached id table | `0xffff` = unused | +| `0x46a5` | byte budget / arena capacity | | +| `0x46a9` | bytes currently in use | | +| `0x46af/0x46b1` | fast-path cache | Last requested id and slot index | +| `0x46b3` | per-slot block metadata mirror | Used when releasing or refreshing slots | + +--- + +## Follow-up: Cache Init and Runtime State + +| Address | Name | Notes | +|---------|------|-------| +| `000a:6600` | `cache_init` | Stores slot count in `0x46ad`; allocates per-slot payload-pointer table; seeds each slot; queries/derives arena size; allocates arena backing object at `0x4691`; allocates per-slot metadata mirrors; initializes free-list head at `0x4688`; calls `cache_reset_runtime_state` | +| `000a:68aa` | `cache_reset_runtime_state` | Shared cache reset/bootstrap helper called from `cache_init`, `cache_shutdown`, and external reset paths. Allocates per-slot arena-header nodes, rebinds slot pointers to arena base, clears the cached-id table, seeds the free-list head, and resets `0x46a9` (bytes in use) plus `0x46af` (last-id fast path) | +| `000a:703e` | `cache_compact_arena_blocks` | Compacts live cache arena blocks into earlier free holes when allocation would fail, updates per-slot payload pointers, and merges adjacent free-list headers afterward | + +--- + +## Follow-up: Tracked-Handle Table Init/Shutdown + +| Address | Name | Notes | +|---------|------|-------| +| `000a:5e00` | `tracked_entity_handle_table_init` | If `0x4672` is clear, allocates `0x90` bytes at `0x4673/0x4675`, aborts through `runtime_init_or_abort` on failure, calls `000a:577d` and local helper `000a:5e95`, then sets `0x4672 = 1` | +| `000a:5e59` | `tracked_entity_handle_table_shutdown` | Matching teardown for `tracked_entity_handle_table_init` | +| `000a:5e95` | `tracked_entity_handle_table_clear_and_dispatch` | When `tracked_entity_handle_table_active` is set, zeroes the full `0x90`-byte handle table at `0x4673`, resets adjacent local state at `0x4677/0x4679/0x467b`, then dispatches through the remaining thunked follow-up path | +| `000a:5339` | `tracked_entity_handle_mark_remove_all_if_enabled` | Thin gate wrapper that only forwards to `tracked_entity_handle_mark_remove_all` when `tracked_entity_bucket_system_enabled` is set | + +Table globals: `0x4672` = `tracked_entity_handle_table_active`, `0x4673/0x4675` = `tracked_entity_handle_table` (12 entries × `0x0c` = `0x90` bytes). + +--- + +## Follow-up: Tracked Bucket System Init/Shutdown + +| Address | Name | Notes | +|---------|------|-------| +| `000a:5186` | `tracked_entity_bucket_system_init` | Allocates a rotating buffer via `0009:3600`, lazily creates `tracked_entity_bucket_backend_object` through `0009:5600` when absent, installs that object into `cache_loader_interface`, allocates the tracked handle table via `000a:5e00`, allocates the 32-entry `0x69ac` bucket array via `000d:cca3(0x20)`, then sets `tracked_entity_bucket_system_enabled` | +| `000a:538e` | `tracked_entity_bucket_system_init_if_configured` | Only calls the init routine when config/feature gate `0x89f4` is non-zero | +| `000a:5223` | `tracked_entity_bucket_system_shutdown` | Tears down the tracked handle table, frees the `0x69ac` bucket array, calls backend-object vtable slot `+0x38` with `(3, backend_object)`, clears `tracked_entity_bucket_backend_object`; called from the wider engine teardown routine at `0004:621b` | + +System globals: `0x45aa` = `tracked_entity_bucket_system_enabled`, `0x45ab/0x45ad` = `tracked_entity_bucket_backend_object`. + +Public thin gate wrappers that feed the `0x69ac` tracked-entry layer: +- `0005:3b34` = `tracked_entity_bucket_alloc_main_if_enabled` +- `0005:3b53` = `tracked_entity_bucket_alloc_aux_if_enabled` +- `0005:3b72` = `tracked_entity_bucket_remove_by_entity_and_ref_if_enabled` → forwards into `000d:d086 = tracked_entity_bucket_remove_by_entity_and_ref` when `0x45aa` is set. + +--- + +## Follow-up: Backend Object Constructor + +| Address | Name | Notes | +|---------|------|-------| +| `0009:5600` | `cache_backend_object_init` | Allocates a `0x20`-byte object when caller passes null; initializes embedded DOS file-handle state via `dos_file_handle_init`; seeds internal method-table / state fields at object offsets `+0x08`, `+0x0c`, `+0x10`, `+0x14`, `+0x16`, `+0x18`, and `+0x1c`; dispatches through the object method table during construction; returns the object pointer cached at `0x45ab/0x45ad` | + +Verified callback roles inside `cache_lookup_or_load_entry_by_id`: +- backend vtable `+0x34` = size query callback for a cache entry id (used before allocation/eviction) +- backend vtable `+0x0c` = load/bind callback that populates the newly allocated slot buffer for the requested id + +--- + +## Follow-up: External Reset Paths + +- The path around `0004:25a9` classifies as an external reset sequence: it calls `cache_reset_runtime_state`, then `tracked_entity_handle_table_clear_and_dispatch`, then continues through additional tracked-entry/cache-side refresh helpers (`000d:cd22`, `000d:44b3`, `0006:ae66`, `0006:ae00`, etc.). +- The path around `0004:eb80` is a conditional tracked-bucket reset/update sequence: when `tracked_entity_bucket_system_enabled` is set, it calls `tracked_entity_handle_mark_remove_all_if_enabled`, then `tracked_entity_handle_table_clear_and_dispatch`, then `cache_compact_arena_blocks`, before resuming its outer flow. + +--- + +## Follow-up: Repaired seg004 Reset-Path Function Objects + +| Address | Name | Notes | +|---------|------|-------| +| `0004:2592` | `runtime_cache_reset_sequence` | Calls `0008:7bfe`; calls `game_mode_init(*(0x27c4))`; calls import-resolved site `0004:25a4`, now verified from the separately imported `ASYLUM.DLL` as ordinal `24` = `_ASS_StopAllSFX`; then resets cache runtime state, clears tracked handles, refreshes tracked-entry/cache helpers. Known caller: `0004:262d` inside the tiny wrapper at `0004:2620`, which sets byte `+0x40` on the object at `0x6828` before invoking the reset sequence. | +| `0004:eb1f` | `entity_dispatch_entry_ctor_0f3a_with_cache_reset` | Allocates/initializes an entity dispatch entry; stamps entry type `0x0f3a`; stores its two word payload fields; runs local setup through embedded helper at `0004:ebf4` (which dispatches `entity_dispatch_reset_all(*0x7e22, 0x00f0)` and — when the local flag plus global `0x0ee1` allow it — allocates a type `0x0f5e` dispatch entry and passes it to `entity_pair_sync_b`); when `tracked_entity_bucket_system_enabled` is set, performs the tracked-handle removal / clear / cache-compaction sequence before finalizing through `0009:b1c3` in phase `0`. | +| `0004:ea00` | `entity_dispatch_entry_alloc_type_0f5e` | Reuses the incoming FAR pointer when non-null; otherwise allocates `0x33` bytes through `mem_alloc_far`; initializes the entry through `entity_dispatch_entry_init`; stamps the entry type word at `+0x00` to `0x0f5e`. | + +--- + +## Follow-up: seg082 Allocator Cluster + +| Address | Name | Notes | +|---------|------|-------| +| `0009:a229` | *(size-only wrapper)* | Public size-only wrapper around the seg082 allocator. Lazily initializes the allocator on first use through `0009:bcb9`, then calls `allocator_try_alloc_from_head_table(size, default_tag, 0xff)`. | +| `0009:bcb9` | *(lazy initializer)* | One-time lazy initializer. Parses an optional `-x` tuning value from the PSP command line, clamps derived percentage into `0x14..0x50`, seeds local seg082 helpers, then sets init flag `0x4096 = 1`. | +| `0009:b06b` | `allocator_try_alloc_from_head_table` | Validates requested size, reserves a temporary work token through `0009:e15f`, scans the `0x8724` allocator head table in `0x0c`-byte entries via `allocator_head_try_alloc_block`. On success, commits the result through `0009:e2b4`, clears failure flag `0x4098`. When a pass does not find a fit, interleaves up to two finalize phases through `allocator_phase_finalize_pass(phase)` before the final retry. | +| `0009:a336` | `allocator_head_try_alloc_block` | Per-head first-fit allocator. Normalizes requested size (rounds odd small requests up, page-aligns large non-page-aligned requests), adds `0x0a` node header overhead, enforces minimum of `0x10` bytes. Walks the node chain for one allocator head until it finds a free span large enough. On success, unlinks the chosen free node, either consumes it whole or splits off a remainder when `>= 0x10` bytes remain. On failure, returns `0`. | +| `0009:a5d1` | `allocator_head_free_block` | Per-head free paired with `allocator_head_try_alloc_block`. Rebuilds the node header from a payload pointer (`payload - 0x0a`), validates the owner/tag word, reinserts the block into one allocator head, and coalesces with adjacent free neighbors when possible. | +| `0009:b224` | `allocator_free_block_by_ptr` | Converts the payload pointer back through local header helpers, scans the `0x8724` head table for the owning range, dispatches to `allocator_head_free_block`, and aborts if no owning head is found. Known wrappers `0009:a24f` and `0009:a27a` are small checked entry points into this path. | +| `0009:b1c3` | `allocator_phase_finalize_pass` | Accepts phase bytes `0` or `1`. Forwards that byte twice to the object rooted at `0x4588` through vtable slot `+0x08`. Then sweeps the allocator head table at `0x8724` up to the active head count at `0x879c`, calling `allocator_head_finalize_sweep` on each entry. | +| `0009:af87` | *(free-space probe)* | Walks the node chain rooted at `0x8724`. For each node, accumulates `node_size - 9` into a running total and tracks the largest single free block. Used by `cache_init` and seg013 path at `0004:833b`. | +| `0009:a961` | *(per-head finalize sweep)* | Walks one `0x8724` head's node chain, skips odd-tagged spans, coalesces or rewrites eligible spans, and updates head/back-pointer links when deferred space needs to be merged back into the chain. | + +**Allocator head table structure:** +- `0x8724` = array of `0x0c`-byte allocator heads +- `0x879c` = active head count / table limit +- Per-node size/value encoding manipulated through `0009:c628` and `0009:c6ae`, which read/write a packed 32-bit quantity split across `word + byte + byte` fields + +--- + +## Follow-up: seg137 Palette and Dispatch-Entry Helper Family + +A coherent palette-write and palette-backed dispatch-entry emission family tied to the same runtime-state constructor lane. + +| Address | Name | Evidence | +|---------|------|---------| +| `000d:85da` | `vga_palette_set_all_black` | Allocates a `0x100`-entry palette buffer filled with zero RGB triplets, writes it to VGA, frees the scratch buffer. (Previously mis-named `map_object_set_dirty_flag`.) | +| `000d:8653` | `vga_palette_set_all_white` | Same shape as black — all three RGB components initialized to `0x3f`, then written through `vga_palette_write`. | +| `000d:86cc` | `vga_palette_set_all_rgb` | Takes caller-supplied RGB bytes, replicates them across a `0x100`-entry palette buffer, writes the result to VGA, frees the scratch palette. | +| `000d:82ea` | `dispatch_entry_create_black_palette_state_active` | Builds a runtime-state dispatch entry of type `0x051e` from a black `0x100`-entry palette buffer; first sets `g_active_dispatch_entry_farptr[+0x40] = 1`. | +| `000d:8a47` | `dispatch_entry_create_black_palette_state` | Same as above without marking the active dispatch entry. | +| `000d:83be` | `dispatch_entry_create_grayscale_palette_state_active` | Reads the current VGA palette, normalizes each triplet by copying the first channel across all three RGB bytes, then builds a runtime-state dispatch entry from that grayscale palette while marking the active dispatch entry. | +| `000d:875d` | `dispatch_entry_create_solid_palette_state_active` | Validates `0..0x3f` RGB inputs, fills a scratch `0x100`-entry palette buffer with that solid color, builds the same `0x051e` runtime-state dispatch entry, marks the active entry. | +| `000d:88b2` | `dispatch_entry_create_solid_palette_state` | Same as above without marking the active dispatch entry. | + +Additional caller-side comments (not renamed) added on: +- `000d:84f4` — current-palette dispatch entry paired with a second object of type `0x68bf` through `entity_pair_sync_b` +- `000d:89c6` — parameterized current-palette runtime-state wrapper with active-state flags + +--- + +## Follow-up: seg138 Caller-Side Dispatch-Entry Emission Helper + +`FUN_000d_938c` (`000d:938c-000d:9583`) — a real caller-side helper with an evidence-preserving decompiler comment added in Ghidra instead of forcing a speculative rename. + +Current verified behavior: +- When the mode/global gate is not already in the `0x13:0x0008` state and entity byte `+0x33` is clear, it allocates a scratch palette buffer, constructs a dispatch entry, sets type `0x051e`, and initializes runtime state through `entity_dispatch_entry_init_runtime_state` with entry kind `0x3c`. +- Later in the same helper it constructs a second dispatch entry from the current palette globals at `0x4e4:0x4e6`, again sets type `0x051e`, and initializes runtime state with entry kind `0x14` and active-state parameters `(1,0,1)`. +- Both created entries are polled until their runtime flag word clears bit `0x0002`, after which the helper redraws the global sprite path, syncs display-state byte `0x58e` from the entity when the global display object exists, calls `FUN_0006_16e1`, clears `g_active_dispatch_entry_farptr[+0x40]`, and finally dispatches through the input object's vtable slot `+0x08`. + +--- + +## Follow-up: seg005 Startup/Display Orchestration + +| Address | Name | Notes | +|---------|------|-------| +| `0004:60c0` | `FUN_0004_60c0` | Startup/display orchestration path: broad setup calls, reads the live VGA palette, validates a caller-provided object through vtable slot `+0x0c`, drives the sprite/object lane through `0x4f38`, runs the seg137 palette and dispatch-entry helper family, creates the default active dispatch entry through `active_dispatch_entry_create_default`, programs mouse interrupt state via seg056 `INT 33h` wrappers, then hands off into the still-unrecovered `0004:1e00` routine. | +| `000d:7600` | `active_dispatch_entry_mark_enabled` | Marks the active dispatch entry enabled | +| `000d:760e` | `active_dispatch_entry_mark_disabled` | Marks the active dispatch entry disabled | +| `000d:761c` | `active_dispatch_entry_create_default` | Creates the default active dispatch entry | + +--- + +## Follow-up: `0x4588` Object-Role Evidence + +The `0x4588` FAR object is a runtime-installed callback/dispatch object that participates in conditional render or presentation-side flow. It has an explicit install, clear, callback, and teardown lifecycle. + +### Verified lifecycle + +- **Install:** `000a:4932` and `000a:4936` store the incoming dword into `0x4590` and `0x458c`, then `000a:493e` stores the incoming FAR object pointer into `0x4588`. +- **Clear:** `0004:5b8c` and `0004:5bbf` both clear `0x4588` immediately before the fatal/reporting-style seg091 call through `000a:454d`; `0004:5ea7` and `0004:6430` both clear `0x4588` and then immediately run the one-shot teardown path `000a:4a56(1)`. +- **Teardown:** `000a:4a56` checks a once-flag at `0x4595`, clears `0x4588` when non-null, optionally performs a vtable `+0x0c` callback when `0x4590 != 0x458c`, then calls vtable slot `+0x04` followed by `FUN_0009_0d30()`. +- **Callbacks:** `000a:b9e5`, `000a:ba66`, `000d:9d5e`, and `000d:a3b7` all push a two-word value pair followed by the `0x4588` FAR pointer and call vtable slot `+0x0c`. `entity_conditional_render_dispatch` calls the same vtable slot with a single literal `0x0101` argument. + +### Payload pairs from payload sync callsites + +- `000d:9d5e` → vtable `+0x0c` payload from object fields `+0x12d/+0x12f` +- `000d:a3b7` → vtable `+0x0c` payload from object fields `+0x74f/+0x751` +- `000a:b9e5`, `000a:ba66` → emitting only when the candidate two-word pair differs from the current pair, then mirroring that pair through `000b:1e39` using global sprite/object pointer `0x4f38/0x4f3a` + +### Globals + +| Address | Name | +|---------|------| +| `0x4588` | runtime FAR object pointer (nullable) | +| `0x458c` | callback sync field (compared against `0x4590` in teardown) | +| `0x4590` | paired sync field | +| `0x4594/0x4595` | state flags | +| `0x45a6` | clock/cookie global used by `assert_buffer_valid` | +| `0x39ca` | dispatch callback-table pointer | +| `0x6828` | `g_active_dispatch_entry_farptr` | diff --git a/docs/raw-000e.md b/docs/raw-000e.md new file mode 100644 index 0000000..b093553 --- /dev/null +++ b/docs/raw-000e.md @@ -0,0 +1,204 @@ +# Raw 000e: Parser & RIFF/Animation Clusters + +Content extracted from `crusader_decompilation_notes.md`. Covers the `000e:` segment parser helper cluster and the RIFF/AVI animation streaming subsystem. + +--- + +## Raw 000e Parser Helper Cluster + +A small helper cluster in the raw `000e:` area implements a fixed-size CRLF record parser/table builder, likely used by startup/config or script-ish text data. + +### Newly renamed helpers + +| Address | Name | +|---------|------| +| `000e:345e` | `record_table_init` | +| `000e:34cc` | `record_table_destroy` | +| `000e:35c6` | `record_table_release_buffer` | +| `000e:35ef` | `record_table_next_slot` | +| `000e:3639` | `record_table_parse_buffer` | +| `000e:3798` | `record_parser_read_line` | +| `000e:38a0` | `record_parser_seek_next_marker` | +| `000e:38f8` | `record_parser_find_marker` | +| `000e:39cc` | `record_parser_dispatch_at_directive` | + +### Behavior notes + +- `record_table_init` clears the table header and zeroes 300 words of inline storage. +- `record_table_parse_buffer` walks a CRLF-separated text buffer, captures each line, splits around a marker helper path, and stores parsed entry state into `0x0c`-byte records. +- `record_parser_read_line` advances to the next CRLF-delimited line, rejects lines that start with `@` or with non-identifier punctuation, and terminates the line in-place with `0`. +- `record_parser_seek_next_marker` updates the parser's current marker cursor at `+0x18/+0x1a` by calling `record_parser_find_marker`; returns `1` if another marker was found, `0` at end-of-data. +- `record_parser_find_marker` scans forward until an `@` marker or end-of-data; optionally consumes the remaining length from the parser state. +- `record_parser_dispatch_at_directive` returns `0` unless the current substring begins with `@`; in the `@` case, it advances by 7 bytes and dispatches through a FAR thunk (`0000:ffff`). + +### EUSECODE.FLX extraction notes + +- `USECODE/EUSECODE.FLX` does not look like a loadable code image or plain text script. It is now validated as an indexed binary container. +- Current table model: + - entry count at file offset `0x54` + - entry table at `0x80` + - 8-byte records: `<u32 data_offset, u32 declared_size>` + - `entry_count = 3074` + - `table_end = 0x6090`, which matches the first non-zero payload offset + - `403` non-zero entries in the current file +- `tools/extract_eusecode_flx.py` now parses the full validated table and emits all `403` non-zero entries under `USECODE/EUSECODE_extracted/`, including `entry_index.tsv`, `descriptor_index.tsv`, `descriptor_neighborhoods.tsv`, `summary.json`, per-chunk `.bin`, and `.strings.txt` sidecars. +- The generated reports now expose lightweight descriptor summaries (`primary_label`, `field_names`, `field_tags`) so the object lane can be searched by field grammar instead of only by raw names. +- The extracted data now separates into at least two lanes: + - text-heavy records that fit the `000e:` CRLF parser model, such as `DATALINK` mission/objective text and `TEXTFIL1` message banks + - binary object/behavior descriptors whose sidecars expose object names and field names, such as `EVENT`, `NPCTRIG`, `CRUZTRIG`, `TRIGPAD`, `JELYHACK`, `JELYH2`, `SPECIAL`, `SURCAMNS`, and `SURCAMEW` +- The descriptor lane also shows a repeatable tagged field trailer rather than raw trailing strings only. Current spot-checks show patterns like `69 xx 00 <name>` and `24 xx 02 <name>` immediately before field names in `NPCTRIG`, `CRUZTRIG`, `TRIGPAD`, `SPECIAL`, and `SFXTRIG`. This is strong evidence that the field names belong to compact per-field metadata records, not accidental string leakage. +- The strongest currently stable tag readings are: + - `69:0000 -> referent` + - `69:0A00 -> event` on event-capable classes such as `EVENT`, `NPCTRIG`, `COR_BOOT`, `REE_BOOT`, `SFXTRIG`, `FLAMEBOX`, `NOSTRIL`, `VAR_BOOT`, and `STEAMBOX` + - `24:FE02` / `24:FC02` / `24:FA02` on object-reference-like fields such as `item`, `elev`, `door`, `source`, `dest`, `monster1`, `deadGuy`, and related referent-style links + - `24:0A02 -> eventTrigger` on `SURCAMNS` / `SURCAMEW` +- The tag report is not a full type system yet, but it is already enough to separate scalar/event slots from pointer-like object links in many descriptor classes. +- Confirmed descriptor examples from the full index: + - `EVENT`: `referent,event,item,source,dest,door,counter,counter2,link,time,post1,post2,floor,flicMan` + - `NPCTRIG`: `referent,event,item,item2,typeNpc` + - `CRUZTRIG`: `referent,item,elev` + - `TRIGPAD`: `referent,item,elev` + - `JELYHACK`: `referent` + - `JELYH2`: `referent` + - `SURCAMNS` / `SURCAMEW`: `referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun` +- Current immortality-lane status inside EUSECODE: + - the trigger/object namespace now clearly includes `JELYHACK`, `NPCTRIG`, `CRUZTRIG`, and `TRIGPAD` + - `JELYHACK` / `JELYH2` sit in a local extraction neighborhood beside `SPECIAL`, `TRIGPAD`, `DATALINK`, `HOFFMAN`, `REE_BOOT`, `SURCAMEW`, and `SFXTRIG`, which looks more like a map/object grouping than random table order + - that neighborhood does not make `JELYHACK` itself event-bearing, but it does place it immediately beside multiple event-capable or trigger-adjacent classes (`REE_BOOT`, `SFXTRIG`, `SURCAMEW.eventTrigger`) + - no extracted chunk has yet been tied directly to event `0x410` + - one exact `0x410` collision in compiled code is now explained away: `000e:0953` pushes `0x410` into imported `ASYLUM.27` from the animation audio-subframe path immediately after setting the local audio-completion byte at `+0xef1`. Since `ASYLUM.DLL` is the `ASS_*` audio/media library, treat this as a media ordinal/value collision rather than a second gameplay or USECODE event source. + - the present best reading is that `0x410` is likely carried by data relationships between generic event-capable descriptors (`EVENT`, `NPCTRIG`, `SFXTRIG`, etc.) and map/object references rather than by a plain-text script line +- The `000e:` record parser helpers still matter, but they now appear to cover only the text-oriented subset rather than the entire FLX payload. The strongest concrete caller so far is the raw window at `000e:1b9f..1d49`, where `record_table_parse_buffer` is invoked after setup of fields that match the known animation object layout (`+0x117/+0x11b/+0x11f/+0x123`, `+0xeaf/+0xeb1`, `+0x10f/+0x111`). That makes the currently verified `000e:3639` consumer part of the animation-object lane, not a clean standalone EUSECODE loader. +- This shifts the current working model: treat `record_table_parse_buffer` as a text/metadata helper used by at least one animation/resource object, while the EUSECODE binary descriptor lane is more likely consumed by the `000d` VM/object interpreter path. +- That `000d` path is now materially less anonymous: + - the global runtime object at `0x6611` is now named `entity_vm_runtime_create` / `entity_vm_runtime_init_slots` / `entity_vm_runtime_release_slots` / `entity_vm_runtime_destroy` + - it owns the 0x80-entry slot table and a retained owner/resource object at `+0x1315/+0x1317` + - `entity_vm_slot_index_from_entity` and `entity_vm_context_try_create_masked_for_entity` show that gameplay entities are filtered through one owner-side slot-mask table before a context is created + - `entity_vm_context_try_create_masked_for_entity` is now better constrained too: after the owner-side mask check succeeds, an immediate-flagged context result clears the caller output word while an object-backed result returns the created object's low word + - `entity_vm_context_create_from_slot_index` then seeds one `0x6714` context from `entity_vm_slot_load_value_plus_offset`, while the large callers at `000d:208b` and `000d:21ed` continue by reading bytecode-like data from the seeded `+0xd6/+0xd8` lane +- The context lane now also has a separate referent-registry subsystem: + - `entity_vm_set_field_da_to_global` writes the current referent id to `0x8c94` from context field `+0xda` and then enters the still-misaligned `000c:3350` body + - `entity_vm_referent_registry_init` / `entity_vm_referent_registry_destroy` / `entity_vm_referent_registry_alloc` / `entity_vm_referent_registry_release_by_id` / `entity_vm_referent_registry_free_node` show that `0x8c8c/0x8c8e/0x8c90/0x8c94` implement one free-list-backed registry keyed by that current referent id + - this is the first solid runtime mechanism showing how referent-only descriptors can still drive script state even when the actual event field lives in a separate neighboring descriptor + - the registry now also has a named chain container layer: `entity_vm_referent_chain_copy`, `entity_vm_referent_chain_append_unique_from`, `entity_vm_referent_chain_contains_entry`, `entity_vm_referent_chain_get_entry_data_at`, and `entity_vm_referent_chain_get_indirect_data` show that one referent can own copied/deduplicated payload chains with either inline fixed-size payloads or indirect string-like payloads +- That chain layer is now less one-sided than before: + - `entity_vm_referent_chain_remove_matching_from` (`000d:6a9a`) removes entries from one chain when they match a second chain, using either inline compare or indirect string compare depending on the chain type byte + - `entity_vm_referent_chain_set_entry_data_at` (`000d:6cf6`) updates the payload of the Nth chain entry in place, freeing old indirect payload storage first when needed + - `entity_vm_opcode_finish` (`000d:3350`) is now identified as the common opcode epilogue that writes `0x8c94` from the current frame result and unwinds the temporary slot-array state before returning the opcode result +- That makes the emerging human-readable script model less ad hoc. A plausible future IR is now: `referent anchor -> payload chain(s) -> event-bearing attachment(s)` rather than a flat list of isolated descriptor rows. +- The opcode side now reinforces that IR too: at least one handler family around `000d:0988` can either append unique payload entries or remove matching ones before returning through the same epilogue, which is a better fit for a graph-editing/object-attachment VM than for a pure linear trigger list. +- That `000d:0988` family is now classified more tightly at the opcode-id level: + - opcode `0x19` = append unique indirect/string-like payload entries into the referent chain + - opcode `0x1a` = remove matching indirect/string-like payload entries from the referent chain + - opcode `0x1b` = remove matching inline/fixed-size payload entries from the referent chain + - the same helper body also implies the missing sibling `0x18` as the inline/fixed-size append-unique form, because only `0x19/0x1a` set the indirect compare flag while only `0x1a/0x1b` take the removal path +- The first concrete `000c` to `000d` bridge inside that lane remains `entity_vm_set_value_from_slot_plus_offset` at `000c:f95f`: it calls `entity_vm_slot_load_value_plus_offset`, stores its return pair into object fields `+0xd6/+0xd8`, and sits immediately beside other `entity_vm_*` helpers in the `000c:f6b8..f9d9` mini-VM cluster. On the `000d` side, `entity_vm_slot_load_value_plus_offset` wraps `entity_vm_slot_load_value`, and `entity_vm_slot_load_value` contains a concrete `PUSH 0x410` event-emission path at `000d:5290`. +- The two main `000d` caller blocks beneath that bridge now have a first stable byte/value reading too: + - internal block `000d:208b` is the simple materialize-or-forward path: it creates one VM context from the caller's stream state, checks the returned object flags, and either writes the returned value pair straight to the caller output slot or forwards the created object's low word through the shared opcode epilogue + - internal block `000d:21ed` is the inline-payload path: it creates the same VM context, prepends the caller-owned blob into the backward-growing context buffer at `+0x102`, then consumes two bytes from the seeded `+0xd6/+0xd8` lane as small shape/count metadata before building an `entity_link` closure matrix from the following caller-stream words and pushing back the non-`0x0400` results + - that is the first concrete evidence that the `+0xd6/+0xd8` lane is not only carrying immediate event/value ids; it also carries compact metadata bytes that parameterize larger inline payloads copied from the caller stream +- Current JELYHACK implication: because `JELYHACK` and `JELYH2` still expose only `referent`, the most defensible model is now that they provide map/object identity into the referent-registry lane, while one adjacent event-capable record (`REE_BOOT`, `SURCAMEW.eventTrigger`, `SFXTRIG.event`, or another nearby generic `EVENT`/`NPCTRIG`) carries the actual event semantics that can eventually reach `0x410`. +- The immediate runtime-owner writer is now pinned down one step further too. `entity_vm_runtime_create` (`000d:4c99`) is the only verified writer of runtime `+0x1315/+0x1317`, and it does so by calling newly recovered `entity_vm_runtime_owner_resource_create` (`000d:7000`). That helper does not simply copy a caller-supplied owner table: it constructs one embedded seg069/070 helper object, queries the needed table size through vtable `+0x04`, allocates child `+0x10/+0x12`, then fills the `0x0d`-stride per-slot producer records through vtable `+0x0c`. The paired release path is `entity_vm_runtime_owner_resource_destroy` (`000d:70fd`). +- That narrows the owner/resource classification safely but still stops short of speculative source-format naming. The embedded helper goes through the same seg069/070 object lifecycle used by other file/resource-style helpers (`0009:1c00` init, `0009:1800` destroy), so the most defensible current description is still `runtime owner/resource helper` rather than `USECODE file loader` or a descriptor-specific name. +- The first gameplay-side mask families around `entity_vm_context_try_create_masked_for_entity` are also now explicit from instruction evidence: + - local wrapper `0004:f033` passes slot mask `0x8000:0007` + - `FUN_0004_f05c` passes slot mask `0x2000:0015` and is reached from `0004:f2b3` after overlap/proximity checks plus entity byte `+0x32` state toggling + - `FUN_0005_27a4` passes slot mask `0x0001:0000` and is reached from the `000c:a09e` entity `+0x5b` bit-`0x0004` branch +- Those masks are enough to prove that the runtime is exposing multiple gameplay-side materialization lanes into the same owner/resource table, but they are not yet enough to tie one lane specifically to the `JELYHACK`/`JELYH2` anchor pair instead of the neighboring event-bearing descriptors (`REE_BOOT`, `SURCAMEW`, `SFXTRIG`, or another local trigger record). +- The extractor now emits a first graph-oriented view of that claim too: `referent_anchor_event_graph.tsv` groups referent-bearing rows with nearby event-bearing neighbors, and `jelyhack_island_graph.md` renders the `JELYHACK` / `JELYH2` island as edges to local descriptors. On the current data, the strongest event-bearing neighbors in that island are `REE_BOOT` (`event`), `SURCAMEW` (`eventTrigger`), and `SFXTRIG` (`event`). +- The new focused comparison report (`jelyhack_descriptor_compare.tsv`) makes one more structural point explicit: `JELYHACK` and `JELYH2` have identical first 16 header words and the same lone `referent` field tag, while differing only in the label string and one small trailing `wx[...]` literal. That strengthens the reading that they are sibling referent-anchor classes rather than separate event-bearing behavior records. +- The same comparison also helps separate anchor classes from event-bearing neighbors: `REE_BOOT`, `SURCAMEW`, and `SFXTRIG` all carry materially richer header/state patterns than `JELYHACK` / `JELYH2`, which is consistent with them holding actual trigger or attachment semantics beside the anchor-only classes. +- The `000d:21ed` callee chain is now tighter too. The nested call at `0008:7d27` is `entity_link`, which appends one entity id into another entity's word-list and, unless bit `0x0400` is set, also updates the reciprocal pair-link slots. So the `22bc..2433` opcode block is best understood as building a bidirectional entity-link closure matrix from streamed entity ids, not merely copying opaque words around. +- Ghidra now carries that interpretation as a conservative disassembly comment at `000d:22bc`, but not yet as a symbol rename, because the surrounding `000d:208b/21ed/22bc` region is still mis-split into artificial function bodies. +- The new `EVENT`-focused reports (`event_island_graph.md`, `event_descriptor_compare.tsv`) broaden the descriptor-side picture beyond the JELYHACK anchor case. The strongest second island is the compact local cluster at indices `186..195`, where `COR_BOOT`, `EVENT`, and `NPCTRIG` all expose explicit `69:0A00 -> event` tags while `ROLL_NS`, `CRUZTRIG`, `NPC_ONLY`, and `VMAIL` stay on the referent/link/text side. +- That cluster looks structurally different from JELYHACK in a useful way: `EVENT` is the large hub payload (`0x20AA`) carrying `source`, `dest`, `door`, `link`, `time`, `counter`, `post1`, `post2`, `floor`, and `flicMan`, while `COR_BOOT` and `NPCTRIG` are smaller event-bearing satellites and the surrounding records (`ROLL_NS`, `CRUZTRIG`, `NPC_ONLY`, `VMAIL`) look like attached state/trigger/object descriptors rather than alternate event cores. +- The first compare pass on that island is already informative. `COR_BOOT`, `EVENT`, `CRUZTRIG`, `NPC_ONLY`, and `VMAIL` share the same leading `0x00000000` dword class shape, `NPCTRIG` moves to a nearby `0x00000001` shape, and `ROLL_NS` is the obvious outlier with first dword `0x00000002` plus rider/time/cargo fields. So the present best reading is one three-node event-bearing core embedded inside a wider referent-neighbor island, not one flat run of equivalent trigger records. +- The extractor now also emits a global event-family pass (`event_family_index.tsv`, `event_family_summary.md`), which turns the local island findings into a wider descriptor taxonomy. Current validated families are: + - `event-hub`: `EVENT` + - `boot-event-core`: `AND_BOOT`, `BRO_BOOT`, `COR_BOOT`, `VAR_BOOT`, `REE_BOOT` + - `npc-trigger`: `NPCTRIG` + - `minimal-event-core`: `SFXTRIG` + - `environmental-event`: `FLAMEBOX`, `NOSTRIL`, `STEAMBOX` + - `callback-eventtrigger`: `SURCAMNS`, `SURCAMEW` +- That split matters because it is the first extractor-backed distinction between active event carriers and callback-only trigger holders. The `69:0A00 -> event` classes now look like the active event-bearing core of the descriptor system, while the surveillance classes with `24:0A02 -> eventTrigger` are better treated as callback/attachment endpoints rather than peer event hubs. +- The next focused pass tightened the `_BOOT` lane too. `boot_family_compare.tsv` now shows that all five `_BOOT` event cores (`AND_BOOT`, `BRO_BOOT`, `COR_BOOT`, `VAR_BOOT`, `REE_BOOT`) share the same header skeleton and the same compact field shape (`referent,event,counter,item`). The meaningful differences are payload size and local neighborhood, not descriptor schema. +- The new `boot_frontier_graph.md` makes the best early `_BOOT` frontier explicit: `AND_BOOT` and `BRO_BOOT` sit in one compact referent-heavy neighborhood (`OFFWORK`, `GUARD`, `GDOOR_N`, `GDOOR_E`, `BIGCAN`, `CRUMORPH`, `GUARDSQ`, `CARD_NS`, `CARD_EW`, `EWALLEW`/`EWALLNS`) and also point directly at each other as adjacent event-bearing siblings. So the present best reading is a reusable boot-event core template instantiated in several different local object islands, not a set of unrelated boot scripts. +- The environmental hazard lane is now similarly constrained. `environmental_family_compare.tsv` shows that `FLAMEBOX` and `STEAMBOX` are close structural siblings with the same active-event backbone (`referent,event,<hazard>,<hazard2>,direction,count`) and matching `24:0A02 / 24:FC02 / 24:FE02` object-link pattern, while `NOSTRIL` is a smaller fire-specific variant that keeps the active `event` plus dual fire references and count fields but drops the direction/newType side. +- Their neighborhoods are different enough to matter: `environmental_event_graph.md` shows `FLAMEBOX` embedded among vent/door/bridge/copy records, `NOSTRIL` among flame/pad/desk/blaster/keypad records, and `STEAMBOX` among bounce/hover/fade/steam/flame box records. So this looks like one hazard-event descriptor family reused across distinct local object islands rather than one single environmental mega-cluster. +- The callback lane is tighter too. `callback_trigger_compare.tsv` confirms that `SURCAMNS` and `SURCAMEW` are effectively the same callback-trigger template: identical field set (`referent,textFile,monit,valueBox,passcode,link,code,screen,cameraEgg,trueRef,therma,eventTrigger,foundGun`) and identical tag grammar except for the `therma` slot offset (`24:F102` vs `24:F602`). That keeps the `eventTrigger` split credible as a true callback/attachment lane rather than only a spelling variation on active `event` carriers. +- The first runtime-side follow-through on those descriptor gains is now a little tighter too. Instruction search around `000d:ebe3` confirms one fixed sequenced VM/opcode driver body, not just a vague constructor helper: it calls `000d:177c`, `000d:1acb`, `000d:0988`, the internal `000d:22bc` link-matrix block, then `000d:1d4a` and `000d:2104` in order. The key negative result is just as useful: `000d:ec31` is only the internal `CALL 000d:22bc` site inside that body, not a standalone function entry. +- Ghidra now carries that as a conservative disassembly comment at `000d:ebe3`. That is still short of a safe rename, but it does promote the lane from “suspected constructor chain” to “verified ordered opcode/handler sequence,” which is the clearest current bridge from the descriptor-side event families back into the `000d` VM/object runtime. + +--- + +## Raw 000e RIFF/Animation Cluster + +The `000e:` segment contains a RIFF/AVI streaming animation subsystem. + +### Animation object field map + +Field offsets relative to the object base pointer: + +| Offset | Field | +|--------|-------| +| `+0xb0` | active/valid flag | +| `+0xb4`–`+0xc2` | constructor-initialized flags | +| `+0xd4` | alive sentinel (must be `-1` for "alive") | +| `+0xe4` | paused flag (`0` = running) | +| `+0xeaf`/`+0xeb1` | far pointer to current RIFF chunk | +| `+0xedb` | animation frame stack depth counter (max 9) | +| `+0xee1` | frame data from current chunk `+4` | +| `+0xeef` | current subframe index | +| `+0x1b3` | subframe count | +| `+0xef1` | audio completion flag | +| `+0x11b` | ring buffer write pointer | +| `+0x11f` | ring buffer read pointer | +| `+0x117` | ring buffer base | +| `+0x123` | ring buffer end (capacity boundary) | +| `+0x102` | resource pointer | +| `+0xde` | entry index (multiplied by `0x30` to reach per-entry data at `+0x1c7`) | + +### RIFF format notes + +The game uses standard RIFF/IFF: +- LIST magic: `0x5453494c` = `"LIST"` +- RIFF magic: `0x46464952` = `"RIFF"` +- `"movi"` FourCC subchunk for animation frames +- Audio frames tagged `"01wb"` (`0x62773130`) +- Video frames handled through a separate path + +### Newly renamed functions + +| Address | Name | Evidence | +|---------|------|---------| +| `000e:2a28` | `riff_find_chunk_by_type` | Walks RIFF LIST/RIFF chunk list; compares each node's FourCC at `+8` vs `param_2`; returns pointer to matching chunk or NULL | +| `000e:2104` | `animation_start` | Finds `"movi"` chunk via `riff_find_chunk_by_type`, inits ring buffer ptrs at `+0x11b` from `+0x117 + duration`, calls `animation_advance_frame`, loops `anim_load_audio_frame` and a second frame-loader thunk path per subframe | +| `000e:12f4` | `animation_advance_frame` | Fixed-point `0x1000` timer arithmetic; checks `+0xe4` (paused), advances ring buffer `+0x11b/+0x11f/+0x117/+0x123`; calls advance thunk | +| `000e:103f` | `animation_tick` | Guard wrapper: checks `param_1+0xd4 != -1`, then calls `animation_advance_frame(param_1, 0)` | +| `000e:06f7` | `anim_load_audio_frame` | Checks chunk tag == `0x62773130` (`"01wb"` = audio stream 1); computes ring buffer free space; copies chunk payload via `0x0000:ffff` thunk; increments subframe index at `+0xeef`; resets at subframe count `+0x1b3` | +| `000e:053d` | `anim_load_video_frame_wrapper` | Called once per subframe in `animation_start` immediately after `anim_load_audio_frame`; thin wrapper that forwards to `000e:ffb0` | + +### Unresolved callee + +- `000e:ffb0` remains unresolved (decompiles garbled due to overlapping instructions at `000f:0085/000f:0086`). Current evidence from the `animation_start` loop suggests this path is the video-side subframe loader paired with `anim_load_audio_frame`. + +### Constructor pattern + +All three constructor variants (`000e:2777`, `000e:2860`, `000e:2969`) follow the same layout: + +1. Call `FUN_000e_e935` (allocator — produces garbled 11KB decompile, not renamed) +2. Set fields `+0xb4` through `+0xc2` on the result +3. Call `000d:ebe3` (multi-step chain initializer: calls `177c`, `1acb`, `0988`, `22bc`, `1d4a`, `2104` in sequence) +4. Call `assert_alive_sentinel` (assertion: checks `+0xd4 != -1`) +5. Call `func_0x000eec83` + +The chain at `000d:ebe3` steps through VM opcode handlers (`000d:177c`, `000d:1acb`, `000d:0988`) that operate on a bytecode VM object with stack pointer at `+0xcc` (decremented by 2 per push) and segment base at `+0xce`. + +### Constructor variant renames + +| Address | Name | +|---------|------| +| `000e:223d` | `assert_alive_sentinel` | +| `000e:2777` | `animation_ctor_variant_a` | +| `000e:2860` | `animation_ctor_variant_b` | +| `000e:2969` | `animation_ctor_variant_c` | diff --git a/docs/raw-porting-progress.md b/docs/raw-porting-progress.md new file mode 100644 index 0000000..fb6c45e --- /dev/null +++ b/docs/raw-porting-progress.md @@ -0,0 +1,333 @@ +# Crusader: No Remorse — Raw Import Porting Progress & Gameplay Batches + +This file covers the raw `CRUSADER-RAW.EXE` porting batches: seg091 RNG helpers, the 0x4588 runtime callback lifecycle batches, and raw 0007 gameplay analysis batches. + +--- + +## Raw seg091 Boundary Recovery (init/context + RNG helpers) + +Conservative PyGhidra boundary repair created the missing seg091 functions in `CRUSADER-RAW.EXE`: +- `000a:44fd` = `seg091_func_00fd`, body `000a:44fd-000a:454c` +- `000a:454d` = `seg091_func_014d`, body `000a:454d-000a:45fd` +- `000a:48a0` = `rng_advance_state`, body `000a:48a0-000a:48e2` +- `000a:48ff` = `rng_next_modulo`, body `000a:48ff-000a:4912` + +Additional adjacent helper identified directly in the raw import: +- `000a:48e3` = `rng_set_seed` + +Verified behavior: +- `rng_set_seed` writes the 32-bit RNG seed/state pair at `0x4584:0x4586` and forces the low word odd. +- `rng_advance_state` updates the same 32-bit state with a simple multiply/add step. +- `rng_next_modulo` advances the RNG state and returns the result modulo the requested bound, or `0` when the bound is zero. +- `seg091_func_00fd` shares runtime flag `0x44a4` with `runtime_init_or_abort`; if the flag is clear it sets it and dispatches through an unresolved far thunk. +- `seg091_func_014d` shares flag `0x44a4`; it checks an optional long argument against the global context/cookie at `0x45a6`, zeroes the pointed byte when the argument is null, then dispatches through an unresolved far thunk. + +--- + +## Raw 0x4588 Runtime Callback Lifecycle Batch + +New conservative runtime-callback lifecycle renames (direct analysis): +- `000a:4913` = `runtime_callback_object_init_once` +- `000a:4a56` = `runtime_callback_object_teardown_once` +- `0009:b1c3` = `runtime_callback_object_phase_finalize` + +Boundary repair applied with MCP edit-plan API: +- Rebuilt `000a:b988` as `sprite_node_get_or_traverse` with full body `000a:b988-000a:bab5`. + +Verified callback-object behavior: +- `runtime_callback_object_init_once` sets one-time guard `0x4594`, snapshots state words (`0x458c`/`0x4590`) via `video_bios_state_snapshot`, installs the object FAR pointer at `0x4588`, and ensures fallback buffer allocation at `0x45a6`. +- `runtime_callback_object_teardown_once` sets one-time guard `0x4595`, clears `0x4588`, conditionally emits vtable `+0x0c` callback when current/previous state differ, then calls vtable `+0x04` release path. +- `runtime_callback_object_phase_finalize` invokes vtable `+0x08` twice and sweeps table entries via `allocator_head_finalize_sweep`. +- Large caller `FUN_000d_9afd` contains both additional vtable `+0x0c` callsites (`000d:9d5e` and `000d:a3b7`) and remains the best next target for concrete subsystem naming. + +## Raw 0x4588 Follow-up Batch (allocator/video helper clarification) + +New conservative helper renames: +- `0009:a961` = `allocator_head_finalize_sweep` +- `000a:4a1f` = `video_bios_state_snapshot` + +Verified behavior: +- `allocator_head_finalize_sweep` performs per-head chain compaction/finalize work over allocator table entries used by `runtime_callback_object_phase_finalize`. +- `video_bios_state_snapshot` executes BIOS video interrupts (`INT 10h` with `AX=4F03` and `AX=1130,BH=3`) and returns packed state in `DX:AX`; callers store/compare this pair around callback emissions. + +## Raw 0x4588 Follow-up Batch 2 (cleanup + mode-state wrapper) + +New conservative structural renames: +- `000a:4972` = `video_mode_set_and_record_state` +- `000d:9afd` = `entity_cleanup_resources_and_dispatch` + +Verified behavior: +- `video_mode_set_and_record_state` stores requested mode/state to `0x4590`, handles VBE-style mode values (`0x101`/`0x103`/`0x105`) via helper checks, and falls back to `INT 10h` mode path for other values. +- `entity_cleanup_resources_and_dispatch` is a large teardown/finalize path for an entity-like object: it clears flags, frees multiple owned buffers/palette handles, performs conditional callback dispatch through `0x4588` vtable `+0x0c`, then destroys object word-list structures. + +## Raw 0x4588 Follow-up Batch 3 (cleanup-callee helper classification) + +New conservative helper renames: +- `0009:7853` = `palette_buffer_alloc_and_init_256` +- `0009:1c3a` = `file_handle_alloc_init_and_open` +- `0009:1d6a` = `file_handle_open_with_mode` +- `0009:8d7b` = `surface_release_internal` +- `0009:8e0a` = `surface_release_and_maybe_free` +- `000d:9231` = `sprite_redraw_global_if_active` + +Verified behavior: +- `palette_buffer_alloc_and_init_256` ensures a caller-provided far buffer exists, allocates/initializes a `0x100`-entry palette/work block, and fills it from static table data. +- `file_handle_alloc_init_and_open` allocates a handle structure on demand, seeds sentinels, then delegates to `file_handle_open_with_mode`. +- `file_handle_open_with_mode` performs path/open initialization with optional pre-delete behavior and stores DOS open result metadata into the handle structure. +- `surface_release_and_maybe_free` wraps `surface_release_internal` and conditionally frees memory when `(flags & 1) != 0`. +- `sprite_redraw_global_if_active` redraws the global sprite/object pointer at `0x4f38` only when the global gate byte `0x68e5` is enabled. + +## Raw 0x4588 Follow-up Batch 4 (function-object recovery around `000d:7e00`) + +Missing function objects recovered: +- `000d:7e00-000d:8077` created and renamed to `entity_dispatch_entry_init_runtime_state` +- `000d:8078-000d:819f` renamed to `entity_dispatch_entry_release_runtime_state` +- `0003:a880-0003:a896` created as `FUN_0003_a880` (arithmetic helper) +- `0003:b8e2-0003:bb39` created and renamed to `far_buffer_alloc_with_mode_flags` + +Verified behavior: +- `entity_dispatch_entry_init_runtime_state` initializes runtime fields (`+0x41/+0x42/+0x44`), clears and allocates paired work/palette buffers (`+0x46/+0x48` and `+0x4a/+0x4c`), applies event/setup calls through seg061 helpers, then finalizes activation. +- `entity_dispatch_entry_release_runtime_state` frees the same paired buffers, propagates active-state changes via global `0x6828`, and destroys embedded word-list members. +- `far_buffer_alloc_with_mode_flags` is a low-level far-buffer utility that allocates/reuses a destination pointer and dispatches mode-dependent copy/fill behavior via an internal flag table. + +## Raw 0x4588 Follow-up Batch 5 (seg061/064/076 helper stabilization) + +New conservative helper renames: +- `0009:6ec7` = `vga_palette_read` +- `0008:d3ba` = `timer_entity_enable_wrapper` + +Additional evidence-preserving decompiler comments added on: `0008:eb43`, `0008:ebe7`, `0008:eac8`, `0008:ec23`. + +Verified behavior: +- `vga_palette_read` mirrors `vga_palette_write` and reads DAC entries through ports `0x3c7/0x3c9` into a far palette buffer. +- `timer_entity_enable_wrapper` is a thin forwarder to `timer_entity_enable` and is widely used in lifecycle/setup paths. +- The seg064 gate helpers (`0008:eb43`/`0008:ebe7`/`0008:ec23`) control one-shot global flag transitions at `0x3b72/0x3b73`, then dispatch via unresolved thunk paths. + +Callback callsite clarification: +- `entity_cleanup_resources_and_dispatch` vtable `+0x0c` call at `000d:9d5e` passes object fields `+0x12d/+0x12f`. +- Matching vtable `+0x0c` call at `000d:a3b7` passes object fields `+0x74f/+0x751`. + +## Raw 0x4588 Follow-up Batch 6 (constructor lane naming + callback globals) + +New conservative helper renames: +- `0008:d27e` = `entity_set_update_period_and_reschedule` +- `0009:7905` = `palette_buffer_alloc_copy_from_source` + +Verified behavior: +- `entity_set_update_period_and_reschedule` stores timing/update-period fields (`+0x36/+0x38/+0x3a`), clears deferred fields (`+0x3c/+0x3e`), then triggers timer recompute/reschedule helpers. +- `palette_buffer_alloc_copy_from_source` allocates/replaces destination palette buffer metadata and copies RGB triplets from a source far pointer (`entry_count * 3` bytes). + +Global data labels promoted: +- `g_active_dispatch_entry_farptr` at `0x6828` +- callback-state/object globals at `0x4588/0x458c/0x4590/0x4594/0x4595/0x45a6` +- dispatch callback-table pointer at `0x39ca` + +--- + +## Raw 0007 Gameplay Helper Batch (entity/tile aux state) + +New conservative gameplay-side helper renames (direct analysis from field writes and call structure): +- `0007:85f6` = `entity_sync_tile_aux_state` +- `0007:8865` = `entity_sync_tile_aux_if_linked` +- `0007:8709` = `entity_mark_dirty_and_sync_tile_aux` + +Verified behavior: +- `entity_sync_tile_aux_state` reads entity tile index at `+0x4`, toggles bit `0x04` in tile record `+0x59` based on entity byte `+0x54`, and copies entity word `+0x55` into tile record `+0x0d`. +- `entity_sync_tile_aux_if_linked` only performs the sync when entity link/pointer `+0x50/+0x52` is non-null. +- `entity_mark_dirty_and_sync_tile_aux` calls the linked-sync helper, sets entity flag bit `0x04` at `+0x42`, then calls through `0000:ffff` with args `(SS:&tile_index, entity[+0x57])` — annotated as `entity_tile_type_notify(tile_index_ptr, type_byte)`. + +New entity field found: `entity[+0x57]` (byte) = entity type/class byte (passed to tile-type notification). + +## Raw 0007 Gameplay Helper Batch (facing/direction) + +New gameplay helper rename: +- `0007:8bd9` = `entity_set_facing_direction` + +Verified behavior: +- Updates entity facing byte `+0x38` using incoming direction/event code values (notably `0x10/0x11/0x12`) with parity-aware adjustment. +- Uses entity flags at `+0x4d` to select increment/decrement behavior for clockwise/counterclockwise facing updates. + +## Raw 0007 Gameplay Helper Deep Dive: `snap_entity_to_ground` + +- Function: `0007:2207` = `snap_entity_to_ground` +- Caller in gameplay flow: `spawn_entity_checked` (`0007:22de`, call at `0007:2366`) +- Purpose (high confidence): pre-spawn position adjustment for a small allow-list of entity types so they land on valid ground/height context before normal spawn allocation. + +#### Variable replacement pass (applied in Ghidra) + +- `param_1` → `entity_type` +- `local_48` → `snap_entity_type_table` +- `local_34` → `snap_dispatch_seg_table` +- `local_20` → `snap_dispatch_off_table` +- `local_c` → `entity_type_cursor` +- `local_4` → `dispatch_index` + +#### What the function does structurally + +1. Copies three 10-entry static tables into stack-local scratch buffers: from `0x2910` (off), `0x2924` (seg), `0x2938` (entity type IDs). +2. Performs a linear scan across 10 entity IDs in `snap_entity_type_table`. +3. If `entity_type` matches an entry, it calls into the real callee (`world_to_screen_coords` at `0004:e7bd` after the far-call repair pass) with spawn coordinate-derived arguments. +4. If no table entry matches, it exits without modifying the request. + +#### Entity ID allow-list + +Exactly 10 entity IDs: `0x31c`, `0x31f`, `0x320`, `0x321`, `0x322`, `0x323`, `0x324`, `0x325`, `0x326`, `0x327`. + +#### Working pseudocode (behavioral) + +```c +void snap_entity_to_ground(entity_type, spawn_x, spawn_y, spawn_layer) { + copy_10_words(local_off_table, DATA_2910); + copy_10_words(local_seg_table, DATA_2924); + copy_10_words(local_type_table, DATA_2938); + + for (dispatch_index = 0; dispatch_index < 10; dispatch_index++) { + if (local_type_table[dispatch_index] == entity_type) { + // Repaired: CALLF 0004:e7bd = world_to_screen_coords + call_thunk_with_spawn_context(spawn_x, spawn_y, ...); + } + } +} +``` + +## Raw 0007 Gameplay Helper Follow-up: AI sweep + checked spawn path + +### `spawn_entity_checked` (`0007:22de`) refinements + +- Function signature expanded to 7 arguments: `entity_type`, `spawn_flags_a`, `spawn_flags_b`, `spawn_flags_c`, `spawn_x`, `spawn_y`, `spawn_layer_arg` +- New comments added: + - `0007:22f8`: allow-list gate for ground-snap mode (`0x27fe != 0` + entity IDs `0x31c..0x327` subset) + - `0007:2366`: explicit `snap_entity_to_ground(entity_type, &spawn_x, &spawn_y, &spawn_layer)` handoff + - `0007:247e`: fallback path that calls core `entity_spawn` with original arguments + +### `entity_ai_update_loop` (`0007:0fb6`) structural recovery + +- Reads player entity FAR pointer from global `0x2de4`. +- Copies player world position fields (`+0x40`, `+0x42`) into globals `0x27e7` / `0x27e9` (AI focus position cache). +- Iterates entity IDs from `2` through `255` and dispatches per-entity processing through two sequential thunked calls per entity. +- After the NE far-call repair pass, the first call at `0007:101c` now decompiles directly as `entity_resolve_slot_ptr` (`0005:0466`) instead of `CALLF 0000:ffff`. + +Repaired call chain helpers now exposed: +- `0005:42c8` = `entity_projected_bbox_overlaps_viewport` — projects entity slot via `world_to_screen_coords`, derives sprite/flag context, tests against the active viewport rectangle at global `0x4014`. +- `0005:3cf5` = `entity_class_has_flag2000` — class-word flag test over `entity_get_class_word(slot) & 0x2000`. +- `0005:ff2d` = `entity_class_get_flag8` — returns bit `0x08` from entity-class detail byte `0x7e1e[type*0x79 + 0x59]`. +- `0006:1305` = `entity_class_get_word_02` — raw accessor for word `+0x02` in the `0x7e1e` class-detail record. +- `0006:0ca4` = `entity_class_get_word_0a` — raw accessor for word `+0x0a` in the same class-detail record. +- `0006:11a1` = `entity_class_clear_flag8_and_dispatch` — clears bit `0x08` in class-detail byte `+0x59`, then performs follow-up entity/type checks and callback dispatch. + +Dispatch call sites annotated: +- `0007:101c`: `entity_slot_fetch(SS:&entity_id)` — resolves entity slot/pointer from loop ID +- `0007:1093`: `entity_tick_dispatch(SS:&entity_id, g_0x27c8)` — per-entity AI tick with global `0x27c8` mode/context word + +Global `0x27c8` confirmed as the current targeted/current entity handle. + +## Raw 0007 Gameplay Logic: animation / range / command globals + +### `is_player_in_range` (`0007:0f79`) + +- Prototype: `int is_player_in_range(int entity_x, int entity_y)` +- Reads player world position from `g_player_entity_farptr` (`0x2de4`, fields `+0x40` (x) and `+0x42` (y)`). +- Computes unsigned delta from AI focus globals `g_ai_focus_pos_x` (`0x27e7`) / `g_ai_focus_pos_y` (`0x27e9`). +- Returns 1 if player Y delta == 0 AND player X delta < 0xF0 (240 world units), else 0. + +### `entity_animation_frame_update` (`0007:26e2`) + +- Prototype: `void entity_animation_frame_update(int *entity_ptr)` +- Key globals: `g_anim_tick_counter` (`0x3a00`), `g_anim_tick_overdrive_flag` (`0x3a02`), `g_speed_double_flag` (`0x27fd`). +- Entity struct fields confirmed: + - `[0x1b]` (byte `+0x36`) = frame_min; `[0x1c]` (byte `+0x38`) = frame_max; `[0x1d]` (byte `+0x3a`) = current_frame + - `[0x1e]` (byte `+0x3c`) = loop_flag (0 = animation disabled) + - `[0x1f]` (byte `+0x3e`) = reverse_direction_flag / double-speed flag + - `+0x3f` (word) = completion handle/sentinel (`-1` = none, `0x2802` = player entity) + - `+0x00` (far ptr) = vtable pointer + +Disassembly comments added: +- `0007:27dc`: `entity_completion_callback(handle)` — fires when loop wraps; skips player handle +- `0007:27fd`: vtable indirect `entity->vtable[+8](entity, 0, 0)` — `on_loop_complete` virtual method +- `0007:281e`: `notify_frame_progress(handle, current_frame)` — per-frame notification +- `0007:2851`: `entity_sprite_advance(entity_far_ptr, advance_amount, 0)` + +### `entity_command_dispatch` (`0007:0990`) + +- Prototype: `void entity_command_dispatch(int entity_handle, int target_seg, int command_type, byte absolute_pos_flag)` +- When `absolute_pos_flag == 0`: computes player-relative delta using `g_player_entity_farptr` and stores result into `g_player_delta_x` (`0x27f5`) and `g_player_delta_y` (`0x27f7`). +- Clears cached origin globals `g_cmd_effect_origin_x` (`0x27f1`) and `g_cmd_effect_origin_y` (`0x27f3`) after use. + +### Enemy spawn helper cluster + +Existing raw names align with prior standalone seg001 notes: +- `0007:505d` = `map_find_spawn_point` (`seg001 + 0x6aed`) +- `0007:5259` = `enemy_spawn_with_target` (`seg001 + 0x6ce9`) +- `0007:5275` = `enemy_spawn_no_target` (`seg001 + 0x6d05`) +- `0007:5291` = `enemy_spawn_at_position` (`seg001 + 0x6d21`) + +### Global map additions (renamed in Ghidra) + +| Address | Name | Evidence | +|---------|------|---------| +| `0x27c8` | `g_current_entity_handle` | Compared directly by `entity_is_type_match`; captured by `entity_ai_update_loop`, `map_find_spawn_point`, and `enemy_spawn_at_position` | +| `0x2de4` | `g_player_entity_farptr` | FAR ptr to player entity; `+0x40`/`+0x42` are world X/Y | +| `0x27e7` | `g_ai_focus_pos_x` | Set by `entity_ai_update_loop` from player entity `+0x40` | +| `0x27e9` | `g_ai_focus_pos_y` | Set by `entity_ai_update_loop` from player entity `+0x42` | +| `0x27f1` | `g_cmd_effect_origin_x` | Cached effect origin X, cleared after delta in `entity_command_dispatch` | +| `0x27f3` | `g_cmd_effect_origin_y` | Cached effect origin Y | +| `0x27f5` | `g_player_delta_x` | Player X delta from last effect origin | +| `0x27f7` | `g_player_delta_y` | Player Y delta from last effect origin | +| `0x27fd` | `g_speed_double_flag` | 0 = normal, 1 = double speed animation | +| `0x27fe` | `g_ground_snap_mode_flag` | Non-zero = ground-snap prepass active for placements | +| `0x27d0` | `g_entity_update_max_id` | Max entity ID used by `entity_ai_update_loop` sweep | +| `0x3a00` | `g_anim_tick_counter` | Animation tick counter for frame-advance step budget | +| `0x3a02` | `g_anim_tick_overdrive_flag` | 0 = normal, non-zero = force max frame advance step | +| `0x2802` | `g_player_entity_handle` | Player entity handle (used as sentinel in animation completion checks) | + +--- + +## seg043 Standalone Boundary Recovery + +Direct disassembly of `NE_segments/seg043_code_off_75A00_len_336F.bin` shows the first non-zero bytes at offset `0x0090`; offsets `0x0000..0x008f` are all zero. + +First three clean 16-bit prologues: +- `seg043:0090` → raw `0007:5a90` +- `seg043:017a` → raw `0007:5b7a` +- `seg043:021c` → raw `0007:5c1c` + +Repair status: applied in `CRUSADER-RAW.EXE` via the local PyGhidra toolkit: +- `0007:5a90` = `seg043_func_0090` with body `0007:5a90..0007:5b79` +- `0007:5b7a` = `entity_set_at_target_update_facing` with body `0007:5b7a..0007:5c1b` +- `0007:5c1c` = `seg043_func_021c` with body `0007:5c1c..0007:5c80` + +Verified behavior: +- `entity_set_at_target_update_facing` sets entity `+0x3a` to 1, calls `entity_set_facing_direction`, clears class-detail bit `0x10` at `0x7e1e[type*0x79+0x59]`, then continues into downstream dispatch. +- `0007:5a90` allocates an object when the incoming far pointer is null (literal `0x98`), runs a far setup helper using DS:`0x4b48..0x4b4e` and the second incoming far pointer, writes `0x4c13` at the object base, calls `entity_set_at_target_update_facing`. +- `0007:5c1c` optionally calls a virtual method through `[object->vtable + 0x4c]` when `object+0x44/+0x46` is non-null, then dispatches one or two downstream far helpers using `object+0x48`. + +Additional resolved call targets inside the missing seg043 block (from relocation data): +- `0007:5a8a` → `entity_set_event_type_checked` +- `0007:5a98` → `FUN_0008_cc01` (timer-related flag/event helper) +- `0007:5b36` → `entity_get_type_word` +- `0007:5b44` → `saveslot_read_entry_flags` +- `0007:5bb8` → `entity_is_type_match` +- `0007:5c49` → `entity_class_get_flag20` +- `0007:5c8b` → `mem_alloc_far` + +## Additional Raw 0007 Helpers + +### Entity Class Flag Helper +- `0006:02cc` = `entity_class_get_flag20` — Returns `((class_detail[type*0x79 + 0x59] & 0x20) >> 5)`. + +### Animation Start Frame Helper +- `0007:71b2` = `entity_set_anim_start_frame_from_flags` — Reads entity `+0x4b` flags. If bit 1 set: uses type table `+0x59 & 4` (attack active) to select last frame (`+0x39 - 1`), zero, or half-frame (`+0x39 >> 1`). Writes computed value to type table `+0x10`. + +### Combat Helper +- `0007:894b` = `entity_check_attack_flags_and_dispatch` — Guards on entity `+0x4b` bit 1 AND target object `+5` bits `0x1c`. If both set: dispatches thunk attack event. + +### Vtable Dispatch Helpers +- `0007:8920` = `entity_call_vtable_slot0c` — Calls `(*param_1)[vtable+0xc]()`. +- `0007:8cb8` = `entity_call_vtable_slot08` — Calls `(*param_1)[vtable+0x8]()`. +- `0007:ccf1` = `entity_call_vtable_slot28` — Calls `(*param_1)[vtable+0x28]()`. + +### Active Flag / Counter +- `0007:8854` = `entity_set_active_flag` — Sets entity `+0x40 = 1` (active); increments global `0x2800`. + +### Dispatch Table Lookup +- `0007:8508` = `entity_table_lookup_and_dispatch` — Searches 1-entry table at `0x2b46` for `(param_3, param_4)` key pair; on match, calls the entry's function pointer at `[2]`. diff --git a/plan-mid.md b/plan-mid.md index 8c869ba..aea1eae 100644 --- a/plan-mid.md +++ b/plan-mid.md @@ -37,40 +37,89 @@ The estimates below are intentionally conservative. They measure verified behavi - seg108 is no longer blank: `sprite_object_clear_flag40_if_present` and `sprite_object_set_flag40_if_present` now anchor the `0x4f38` global sprite/object lane as a real state-bit-controlled object path used beside the same `0x4588` callback sync and startup/display transition flow. - Direct MCP follow-up on seg126 and seg127 now recovered the missing helper bodies after boundary repair: `transition_preentry_setup_resources` (`000c:c63a`), `transition_preentry_release_resources` (`000c:c890`), `transition_preentry_run_until_complete_or_abort` (`000c:c9f4`), `transition_preentry_step_script` (`000c:ca1d`), and the neighboring `transition_palette_fade_tick` / `transition_palette_fade_begin` / `transition_palette_fade_out_step` / `transition_palette_fade_in_step` chain are now named against verified behavior. The latest semantic pass also tightened the two main open globals: `0x8c5c` / `0x8c60` are now best understood as a paired temporary text-renderer lane, while `0x31a2` behaves like an external input/event break gate maintained by queue/interrupt-side code. The remaining structural cleanup is the separate oversized overlap rooted at `000c:db68`, not the seg126 helper family. - Bonus cheat-lane cleanup is now visible in Ghidra too: `cheat_code_check` has recovered local names (`input_event_record`, `input_event_offset`, `new_cheat_enabled`, `cheat_status_display_root`) and a decompiler comment stating that it matches the five-byte event-code sequence `50 80 3e fd 27 00` before toggling the cheat-state bytes and taking one of two local notification paths. +- Point 8 cheat/input-lane pass is complete. `keyboard_input_cheat_dispatch` (`0007:04dc`) is renamed and has a full scan-code mapping decompiler comment. `cheat_entity_slot_cycle_and_update_sprite` (`000c:8072`) and `cheat_anim_type_cycle_and_refresh` (`000c:81c0`) are named. Three `DS:0x6050` gate helpers (`000c:8221/8227/822b`) are named. All seven cheat event case-handlers in the 000c dispatch function now have labels and disassembly comments (`event_0x141/0x241/0x441_cheat_debug_overlay_toggle`, `event_0x7e_cheat_latch_runtime_toggle`, `event_0x142/0x143_cheat_fullscreen_mode1/0_refresh`, `event_0x410_cheat_flag_604f_toggle`). The cheat-related string table in seg014 is documented (including the dev Easter-egg `"FART ...TRY... -laurie"`). HACK MOVER / Immortality strings confirmed present with no static code xrefs — attributed to USECODE scripting layer. `0x844` (master cheat flag) vs `0x6045` (live cheat latch) separation remains solid. +- User-directed JELYHACK producer tracing is now tightened one layer upstream of `000d:208b` / `000d:21ed`: the immediate stream producer is the embedded mini-VM object created at context `+0x36`. `entity_vm_context_create_from_slot_index` (`000d:46ec`) feeds that object through `entity_vm_context_setup` (`000c:f844`), which uses `entity_vm_stack_init_with_data` (`000c:f6e8`) and `entity_vm_state_copy` (`000c:f772`) semantics to seed or clone `[+0xcc..+0xd2]`. The actual source payload comes from the runtime owner table at `0x6611 -> +0x1315/+0x1317 -> +0x10/+0x12`, addressed as `base + 0x0d*slot + 4`, and the resulting per-slot source is mirrored into `0x39ca`. This still does not expose a direct `JELYHACK`-named producer object, but it strengthens the current reading that `JELYHACK` / `JELYH2` contribute referent identity while neighboring `REE_BOOT` / `SURCAMEW` / `SFXTRIG` descriptors remain better candidates for event-bearing attachments. +- The next USECODE/JELYHACK pass now resolves the immediate owner-object writer too. `entity_vm_runtime_create` (`000d:4c99`) is the only writer of runtime `+0x1315/+0x1317`, via newly recovered `entity_vm_runtime_owner_resource_create` (`000d:7000`), and the companion `entity_vm_runtime_owner_resource_destroy` (`000d:70fd`) releases that helper. The `000d:7000` body does not copy a caller-supplied table directly: it constructs one embedded seg069/070 helper object, queries that helper for the required table size via vtable `+0x04`, allocates child `+0x10/+0x12`, then populates the `0x0d`-stride per-slot producer records through vtable `+0x0c`. Wrapper classification around `entity_vm_context_try_create_masked_for_entity` is tighter too: local wrapper `0004:f033` uses slot mask `0x8000:0007`, `FUN_0004_f05c` uses `0x2000:0015` and is reached from `0004:f2b3` after overlap/proximity and entity byte `+0x32` state checks, and `FUN_0005_27a4` uses `0x0001:0000` from the `000c:a09e` entity `+0x5b` bit-`0x0004` branch. This is enough for a conservative owner/resource classification, but not yet for a source-format-specific or descriptor-specific rename beyond that partial role name. ### Current Focus -1. Finish Priority 0 refinement by promoting more exact segment rows where notes already support a verified foothold. -2. Continue the Priority 1 pass by tracing the higher-level startup/display callers, branch outcomes, pre-entry object lanes, palette-fade ownership, watch/camera controller ownership, and active sprite/object ownership that stitch the seg137 palette helper family into the wider `0x4588` / dispatch-entry object-role lane. +1. User-directed USECODE/JELYHACK lane: identify who populates the runtime owner/resource object returned by `000d:7000`, especially the `+0x10/+0x12` per-slot producer table and the gameplay wrappers around `entity_vm_context_try_create_masked_for_entity` that decide which entities can materialize slot-backed VM contexts. +2. Finish Priority 0 refinement by promoting more exact segment rows where notes already support a verified foothold. +3. Continue the Priority 1 pass by tracing the higher-level startup/display callers, branch outcomes, pre-entry object lanes, palette-fade ownership, watch/camera controller ownership, and active sprite/object ownership that stitch the seg137 palette helper family into the wider `0x4588` / dispatch-entry object-role lane. ### Next Resume Point -1. Keep classifying the seg126 pre-entry text-renderer lane around `transition_preentry_setup_resources`, `transition_preentry_step_script`, and `transition_preentry_release_resources`, especially by: +1. Continue the user-directed USECODE/JELYHACK follow-on from the recovered producer chain, especially by: + - identifying the concrete seg069/070 helper class and source arguments behind `entity_vm_runtime_owner_resource_create` (`000d:7000`), especially the vtable `+0x04` size query and `+0x0c` table-population call that fill child `+0x10/+0x12`, + - extending wrapper classification outward from the now-verified seeds `0004:f033` (`0x8000:0007`), `FUN_0004_f05c` (`0x2000:0015`), and `FUN_0005_27a4` (`0x0001:0000`) into the neighboring `0005:2867/2918/2ae2/2d30` family so the slot-mask groups can be mapped to concrete gameplay object classes, + - checking whether any recovered owner-table records or slot families line up with the JELYHACK-island referent/event neighborhood more strongly than with generic entity-script traffic, + - and tracing whether the `0x39ca` per-slot payload mirror is initialized only from `entity_vm_context_create_from_slot_index` or is also refreshed by other runtime-owner helper paths. +2. Keep classifying the seg126 pre-entry text-renderer lane around `transition_preentry_setup_resources`, `transition_preentry_step_script`, and `transition_preentry_release_resources`, especially by: - comparing more preset `0x10` / `0x11` text-renderer callsites, - tracing who owns the rendered buffer loaded into `0x6301:0x6303`, - mapping the control bytes `0x21` / `0x23` / `0x24` / `0x26` / `0x2a` / `0x40` / `0x5e` to concrete display behavior, - and deciding whether the paired `0x8c5c` / `0x8c60` lane is a title/body pair, normal/highlight pair, or another fixed UI pairing. -2. Finish the `0x31a2` gate pass as one batch: +3. Finish the `0x31a2` gate pass as one batch: - classify the read sites at `0004:c24d`, `000c:ca11`, `000c:e4d8`, `000c:e546`, `000c:e5c6`, `000d:9304`, `000d:b6b1`, and `000d:c0ee`, - relate them back to interrupt-side updates at `0008:a283` / `0008:a314`, - and decide whether `0x31a2` is best described as user-acknowledge, queued-input depth, or a broader event-break gate. -3. Tighten the `DS:0x6341` to `0x6828` relationship: +4. Tighten the `DS:0x6341` to `0x6828` relationship: - compare the seg126 `animation_ctor_variant_a` call with the other raw callsites at `0005:3c4f`, `0005:3c74`, `000c:6176`, and `000c:619c`, - map who owns `g_active_dispatch_entry_farptr[+0x40]`, - and classify whether seg126 is constructing a transition-local animation payload for the shared active dispatch entry or only toggling an owner-side state bit after setup. -4. Identify which higher-level transition states own the seg127 fade-controller inputs at `0x630a-0x6316` and how that fade state is chosen from the seg005/seg126 startup path. -5. Repair the still-oversized overlap rooted at `000c:db68` only if it blocks follow-on analysis or decompiler visibility in the same transition lane. -6. Clarify the relationship between the seg049 watch/camera controller at `0x2bd8`, the seg108 sprite/object lane at `0x4f38`, and the object validated through `FUN_0004_60c0` vtable slot `+0x0c`. -7. Continue caller-role classification inside `entity_cleanup_resources_and_dispatch` (contains both `000d:9d5e` and `000d:a3b7`) and map how it relates to `FUN_000d_938c`, `FUN_0004_60c0`, `FUN_000c_7412`, `transition_preentry_release_resources`, and the seg136/seg137 active-dispatch helper family. -8. Keep the cheat/input side lane warm when it offers cheap wins: - - identify the upstream producer for the five-byte cheat event-code sequence `50 80 3e fd 27`, - - resolve the exact success-side presentation path behind `DS:0x287b` versus `DS:0x2892`, - - finish naming the verified cheat-only actions now that plain `F10` is confirmed in `seg001_input_keyboard_handler`, - - map the remaining caller-side hotkey bytes in `FUN_0007_04dc` (`0x37`, `0x4a`, `0x4e`, `0x52`, `0x53`, `0x0f`, `0x24`, `'9'`, `'R'`) to final user-facing controls, - - verify whether the reported `H` / hack-mover description belongs to this build or to a higher translation layer, - - and tie the cheat toggle flags `0x844` / `0x6045` into the wider input/event-dispatch system, especially the cheat-gated overlay events `0x141`, `0x142`, `0x143`, `0x241`, `0x410`, and `0x441`. +5. Identify which higher-level transition states own the seg127 fade-controller inputs at `0x630a-0x6316` and how that fade state is chosen from the seg005/seg126 startup path. +6. Repair the still-oversized overlap rooted at `000c:db68` only if it blocks follow-on analysis or decompiler visibility in the same transition lane. +7. Clarify the relationship between the seg049 watch/camera controller at `0x2bd8`, the seg108 sprite/object lane at `0x4f38`, and the object validated through `FUN_0004_60c0` vtable slot `+0x0c`. +8. Continue caller-role classification inside `entity_cleanup_resources_and_dispatch` (contains both `000d:9d5e` and `000d:a3b7`) and map how it relates to `FUN_000d_938c`, `FUN_0004_60c0`, `FUN_000c_7412`, `transition_preentry_release_resources`, and the seg136/seg137 active-dispatch helper family. +8. ~~Cheat/input side lane~~ — **COMPLETED** this pass. All point-8 sub-items are now resolved: + - `keyboard_input_cheat_dispatch` renamed; full scan-code table documented in decompiler comment. + - `cheat_entity_slot_cycle_and_update_sprite` and `cheat_anim_type_cycle_and_refresh` named. + - `DS:0x287b` / `DS:0x2892` success-path presentation: confirmed as opaque near-code discriminator values stored at `+0x49` in the display notification object; the cheat-on/off display is built via `display_null_check_dispatch` + `sprite_node_get_or_traverse`. + - All seven cheat event case-handlers in the 000c dispatch function labeled and commented. + - `0x844` (master) vs `0x6045` (live latch) separation confirmed solid; `0x604b` / `0x604f` / `0x6050` also documented. + - HACK MOVER: no static code xrefs; attributed to USECODE scripting layer. Cheat string table in 000e fully documented. + - Remaining open: exact user-facing identity of events `0x141/0x241/0x441` overlays (strings suggest targeting-reticle / CD-transfer-display), exact DS:0x6087/6091 notification objects, and any further depth on the `0x4f38` / `0x2bd8` vtable path taken by the overlay events. + - The Immortality cheat mechanics are now fully traced at the C level: event `0x410` toggles `DS:0x604f`; the sole read site is `player_receive_damage_and_dispatch_effects` (`0004:c055`) at `0004:c205`, which divides all incoming 32-bit damage by `0x40000` (262,144) when the flag is set, making HP loss negligible while the hit-stagger animation still plays. No static C keyboard dispatch generates event `0x410` — confirmed USECODE/ASYLUM scripting layer only. `DS:0x60d2` / `DS:0x60ee` are the "Immortality enabled." / "Immortality disabled." notification pointers. A parallel handler at `000b:b62c` sets the associated USECODE process state to `0xe` when the event arrives. + - `tools/extract_eusecode_flx.py` now parses the validated full EUSECODE table (`count @ 0x54`, table @ `0x80`) rather than the old heuristic header scan. Current run extracts all `403` non-zero entries and emits a searchable `entry_index.tsv` with `primary_label` and `field_names` summaries. + - The extractor now also emits `descriptor_index.tsv` and `descriptor_neighborhoods.tsv`, which summarize per-class field-tag patterns and the local neighborhoods around trigger/event-related classes. + - Current EUSECODE split is now clearer: the `000e` parser lane plausibly covers text-heavy records like `DATALINK` and `TEXTFIL1`, while the binary descriptor lane exposes object classes such as `EVENT`, `NPCTRIG`, `CRUZTRIG`, `TRIGPAD`, `SPECIAL`, `SURCAMNS`, `SURCAMEW`, `JELYHACK`, and `JELYH2`. + - The descriptor lane now has a real structural foothold too: field-name strings are preceded by short tagged metadata records (`69 xx 00 <name>`, `24 xx 02 <name>`, etc.) in multiple classes. This looks like compact field-definition encoding rather than arbitrary string spill. + - That tag grammar is now useful enough to search semantically: `69:0A00 -> event` is stable across `EVENT`, `NPCTRIG`, `SFXTRIG`, and several `*_BOOT` classes, while `24:0A02 -> eventTrigger` shows up in `SURCAMNS` / `SURCAMEW`. + - Immortality-specific follow-on is now narrowed but not closed: `JELYHACK` and `JELYH2` are confirmed as real referent-only EUSECODE descriptors; `NPCTRIG` is confirmed as an event-capable trigger descriptor; `CRUZTRIG` / `TRIGPAD` expose `referent,item,elev`; but no extracted record has yet been tied directly to binary event value `0x410`. + - The clustering pass tightened the local candidate set around `JELYHACK`: the immediate neighborhood now includes `SPECIAL`, `TRIGPAD`, `DATALINK`, `HOFFMAN`, `REE_BOOT`, `SURCAMEW`, and `SFXTRIG`, which is a plausible map/object island rather than random sparse table order. + - The strongest `record_table_parse_buffer` caller evidence (`000e:1b9f..1d49`) now appears to belong to the animation-object field lane, because the surrounding setup manipulates the already-mapped animation fields at `+0x117/+0x11b/+0x11f/+0x123` and `+0xeaf/+0xeb1`. That weakens the earlier assumption that `000e:3639` is the primary EUSECODE loader and shifts the likely binary-descriptor consumer search back toward the `000d` VM/object path. + - The first concrete `000c` to `000d` bridge in that direction is now visible at `entity_vm_set_value_from_slot_plus_offset` (`000c:f95f`): it calls `entity_vm_slot_load_value_plus_offset` (`000d:5572`) and stores the return pair into object fields `+0xd6/+0xd8`; on the `000d` side, `entity_vm_slot_load_value` (`000d:51fd`) contains a verified `PUSH 0x410` path. Supporting slot helpers in the same lane are now named too (`entity_vm_slot_find_or_select`, `entity_vm_slot_decrement_use_count`, `entity_vm_slot_release_value`). This still does not prove the immortality trigger chain, but it is the strongest current code-side connection between the mini-VM lane and a live `0x410` producer. + - The adjacent `000d:45xx..4exx` island is now promoted out of `FUN_*` placeholders as one coherent VM runtime/context family. Newly named helpers include `entity_vm_runtime_create` / `entity_vm_runtime_init_slots` / `entity_vm_runtime_release_slots` / `entity_vm_runtime_destroy`, `entity_vm_slot_index_from_entity`, `entity_vm_context_try_create_masked_for_entity`, `entity_vm_context_create_from_slot_index`, `entity_vm_context_sync_global_value_and_dispatch`, and the context save/load/destroy helpers. The runtime global at `0x6611` now reads as a real owner for this lane rather than an opaque far pointer. + - Two large caller bodies at `000d:208b` and `000d:21ed` now stand out as concrete context-construction sites: both feed per-object stream/data state from `+0xcc/+0xce` into `entity_vm_context_create_from_slot_index`, then continue by reading from the seeded `+0xd6/+0xd8` bytecode/value lane. This is the clearest current evidence that the `000d` interpreter/object family, not the `000e` text parser, is the near-runtime consumer to keep following for the immortality trigger. + - A second supporting lane is now named too: `entity_vm_referent_registry_init` / `destroy` / `alloc` / `release_by_id` / `free_node` show that `0x8c8c/0x8c8e/0x8c90/0x8c94` form a free-list-backed referent registry. `entity_vm_set_field_da_to_global` writes `0x8c94` from the context `+0xda` lane before entering the still-misaligned `000c:3350` body, which is the first concrete runtime mechanism explaining how referent-only descriptors such as `JELYHACK` can still participate in script state. + - That referent-registry lane is now better structured too: `entity_vm_referent_chain_copy`, `entity_vm_referent_chain_append_unique_from`, `entity_vm_referent_chain_remove_matching_from`, `entity_vm_referent_chain_contains_entry`, `entity_vm_referent_chain_get_entry_data_at`, `entity_vm_referent_chain_set_entry_data_at`, and `entity_vm_referent_chain_get_indirect_data` show that the runtime can build, subtract, and mutate payload chains hanging off one referent anchor. This is the first runtime shape that looks directly useful for a future human-readable / modifiable script IR. + - `entity_vm_opcode_finish` (`000d:3350`) is now identified as the shared opcode epilogue for this family rather than an opaque helper: it writes `0x8c94` from frame-local state, unwinds the temporary slot-array state at `0x659c/0x659e` when present, and returns the current opcode result. + - The runtime/context half of that lane is now named too. The `0x6611` global is managed by `entity_vm_runtime_create` / `entity_vm_runtime_init_slots` / `entity_vm_runtime_release_slots` / `entity_vm_runtime_destroy`, while `entity_vm_slot_index_from_entity`, `entity_vm_context_try_create_masked_for_entity`, and `entity_vm_context_create_from_slot_index` now show how gameplay entities are tested against one owner-side slot-mask table before a `0x6714` VM context is created. + - That context family is no longer anonymous either: `entity_vm_context_sync_global_value_and_dispatch`, `entity_vm_context_save`, `entity_vm_context_load`, `entity_vm_context_destroy`, and `entity_vm_context_free_buffer` now pin down the lifecycle around the same `+0xd6/+0xd8`, `+0x102`, `+0x10c/+0x10e`, and `+0x11b/+0x11d` fields. + - Current best near-runtime callsites for further immortality work are the large `000d:208b` and `000d:21ed` bodies, which both build one VM context from caller stream/data state and then continue by consuming bytes from the seeded context value lane. + - The first opcode family under that lane is also less anonymous now: `000d:0988` can either append unique payload entries or remove matching ones depending on the opcode id (`0x1a/0x1b` taking the removal path), and both branches return through `entity_vm_opcode_finish`. + - That opcode family is now classified one step further: `0x19` = append-unique indirect/string-like payloads, `0x1a` = remove-matching indirect/string-like payloads, `0x1b` = remove-matching inline payloads, and the same helper body strongly implies `0x18` as the missing append-unique inline sibling. + - The first stable `+0xd6/+0xd8` byte-lane semantics are now visible in the two large caller bodies too. The `000d:208b` block is a simple materialize-or-forward path after `entity_vm_context_create_from_slot_index`, while `000d:21ed` copies a caller-owned inline blob into the context `+0x102` buffer and then consumes two stream bytes as compact shape/count metadata before building an `entity_link` closure matrix from the following caller-stream words. + - Current best JELYHACK reading is tighter than before: the extracted chunks still only expose `referent`, but the new referent-registry work means that does not relegate them to inert map labels. The most defensible present model is `JELYHACK/JELYH2 = referent anchors`, with the actual immortality/event behavior carried by neighboring event-capable descriptors in the same local island (`REE_BOOT`, `SURCAMEW`, `SFXTRIG`, or a nearby generic event/trigger record). + - That readability step now has a first concrete artifact: `tools/extract_eusecode_flx.py` emits `referent_anchor_event_graph.tsv` plus a focused `jelyhack_island_graph.md`, which turns the local table neighborhood into a first readable anchor-to-event view instead of only raw descriptor rows. + - The extractor now also emits `jelyhack_descriptor_compare.tsv`, and its first result is useful: `JELYHACK` and `JELYH2` have identical first 16 header words as referent-only sibling descriptors, while `REE_BOOT`, `SURCAMEW`, and `SFXTRIG` show materially richer header/state patterns consistent with the event-bearing side of the island. + - Latest opcode-side refinement: `entity_vm_opcode_finish` (`000d:3350`) is now the shared epilogue for the chain-mutating handlers, while `entity_vm_referent_chain_remove_matching_from` (`000d:6a9a`) and `entity_vm_referent_chain_set_entry_data_at` (`000d:6cf6`) show that the VM can subtract and rewrite payload chains in place, not just append/copy them. + - The `000d:21ed` follow-on is now better anchored semantically too: its nested callee `0008:7d27` is `entity_link`, so the `22bc..2433` block is building a bidirectional entity-link closure matrix from streamed entity ids rather than only emitting an opaque table. A conservative disassembly comment is now in place at `000d:22bc`; rename deferred until the bad outer function split is repaired. + - The extractor work now scales beyond the JELYHACK case: reusable focused-report helpers emit both `jelyhack_*` and `event_*` cluster artifacts, and the first new result is strong. The `EVENT` island (`ROLL_NS`, `COR_BOOT`, `EVENT`, `NPCTRIG`, `CRUZTRIG`, `NPC_ONLY`, `VMAIL`) contains a compact three-node event-bearing core (`COR_BOOT`, `EVENT`, `NPCTRIG`) surrounded by referent/link/text satellites. + - That second island materially improves the EUSECODE model: instead of one special-case `JELYHACK` anchor plus neighbors, we now have a broader pattern of `event-bearing core embedded in referent-neighbor island`, with `EVENT` acting as a large hub descriptor (`source/dest/door/link/time/counter/post1/post2/floor/flicMan`) and `ROLL_NS` / `CRUZTRIG` / `NPC_ONLY` / `VMAIL` reading as attached state or trigger-side records rather than peer event hubs. + - The descriptor-side taxonomy is now wider too: `event_family_index.tsv` / `event_family_summary.md` classify all current event-tagged descriptors into reusable families. The active `69:0A00 -> event` lane now breaks cleanly into one `EVENT` hub, five `_BOOT` event cores, one NPC trigger core, one minimal event core (`SFXTRIG`), and three environmental event classes (`FLAMEBOX`, `NOSTRIL`, `STEAMBOX`), while the surveillance pair `SURCAMNS` / `SURCAMEW` is now cleanly separated as `callback-eventtrigger` rather than generic event-bearing descriptors. + - The `_BOOT` family is now better constrained too. `boot_family_compare.tsv` shows that `AND_BOOT`, `BRO_BOOT`, `COR_BOOT`, `VAR_BOOT`, and `REE_BOOT` all share one common header/template shape, so the family now reads as repeated instantiations of the same event-core descriptor rather than structurally different boot subclasses. + - The best remaining `_BOOT` frontier is now explicit in extractor output as well: `boot_frontier_graph.md` shows `AND_BOOT` / `BRO_BOOT` embedded in a compact referent-heavy neighborhood (`OFFWORK`, `GUARD`, `GDOOR_*`, `BIGCAN`, `CRUMORPH`, `GUARDSQ`, `CARD_*`, wall variants), which is the cleanest unresolved object-side context for the boot-event template. + - The environmental event lane is now promoted out of a generic family label into a clearer structural pattern. `environmental_family_compare.tsv` shows `FLAMEBOX` and `STEAMBOX` as close hazard-event siblings with the same active-event backbone plus direction/count, while `NOSTRIL` is the smaller fire-specific variant that keeps the dual-hazard references and counters but drops the direction/newType side. + - The callback-trigger lane is also more defensible now: `callback_trigger_compare.tsv` confirms that `SURCAMNS` and `SURCAMEW` are effectively one shared callback template, differing only in one `therma` slot tag offset. That keeps the active `event` lane and callback `eventTrigger` lane separated by more than just naming convention. + - Runtime follow-through has resumed too: `000d:ebe3` is now backed by direct instruction evidence as one ordered VM/opcode driver body that calls `000d:177c`, `000d:1acb`, `000d:0988`, internal block `000d:22bc`, then `000d:1d4a` and `000d:2104` in sequence. `000d:ec31` is confirmed as only the internal `CALL 000d:22bc` site inside that body, so the inner block is still not a safe standalone rename target. + - `entity_vm_context_try_create_masked_for_entity` (`000d:463a`) is now pinned down one step further: it first checks the runtime-disable byte at `0x6610`, computes the entity slot, tests the owner-side slot mask in the runtime owner table, and only then creates a context. On success it reports either an immediate result (success with cleared output word) or an object-backed result (success with the created object's low word), which is the clearest current typed boundary between gameplay entities and VM-backed object results. + - The immediate owner-object writer is now identified too. `entity_vm_runtime_create` (`000d:4c99`) stores the only verified runtime `+0x1315/+0x1317` value by calling the newly recovered `entity_vm_runtime_owner_resource_create` (`000d:7000`), whose helper-managed body allocates child `+0x10/+0x12` from a vtable `+0x04` size query and fills the `0x0d`-stride slot table through vtable `+0x0c`. The paired release path is `entity_vm_runtime_owner_resource_destroy` (`000d:70fd`). + - The first wrapper-side mask families are now anchored by direct instruction evidence as well: local wrapper `0004:f033` passes `0x8000:0007`, `FUN_0004_f05c` passes `0x2000:0015` from the `0004:f2b3` overlap/proximity branch with entity byte `+0x32` state toggling, and `FUN_0005_27a4` passes `0x0001:0000` from the `000c:a09e` entity `+0x5b` bit-`0x0004` branch. This is enough to distinguish at least three gameplay-side mask lanes without yet claiming descriptor-specific ownership such as `JELYHACK` versus `REE_BOOT`. + - One exact `0x410` collision that could have reopened the wrong lane is now ruled out: `000e:0953` pushes literal `0x410` into imported `ASYLUM.27` from the animation/audio path after setting the `+0xef1` audio-completion byte. Because `ASYLUM.DLL` is the `ASS_*` audio/media library, this is not evidence for a second gameplay or USECODE event source; the live compiled-code bridge for the immortality event remains the `000d` VM lane at `entity_vm_slot_load_value` (`000d:51fd`). 9. Revisit `allocator_phase_finalize_pass` only where it intersects the same callback object semantics, rather than broad allocator mechanics that are already sufficiently constrained. 10. Continue `ASYLUM.24` only after the `0x4588` / dispatch-entry lane and `0004:1e00` transition path have no further cheap wins. +11. User-directed USECODE/JELYHACK side lane: trace who seeds the caller stream/data pair at `+0xcc/+0xce` before the `000d:208b` and `000d:21ed` context-construction blocks, and correlate those producer-side objects with referent ids or descriptor-class neighborhoods that could distinguish `JELYHACK` / `JELYH2` anchors from the neighboring `REE_BOOT`, `SURCAMEW`, and `SFXTRIG` event-bearing attachments. ### Headline Estimate @@ -230,15 +279,15 @@ Work the newest verified reset-path cluster to closure: This is currently the best next analysis target because it closes a live cluster that already has fresh verified work around it. -### Priority 2: Resolve `ASYLUM.24` +### Priority 2: `ASYLUM.24` Resolved -Identify what imported routine `ASYLUM.24` actually is. +`ASYLUM.DLL` was imported as a separate NE program in Ghidra and its export table is now verified as an `ASS_*` audio DLL, not the immortality/USECODE interpreter lane. -Goal: +Resolved result: -- tighten the description of `runtime_cache_reset_sequence`, -- determine whether the import belongs to cache/resource/backend/media initialization, -- and improve naming confidence around the reset path. +- `ASYLUM.24` = `_ASS_StopAllSFX` at `1018:0681` +- `runtime_cache_reset_sequence` therefore performs an audio stop before the cache/tracked-handle reset work +- this import is not evidence for the immortality cheat path; the `0x410` toggle remains attributed to the interpreted `EUSECODE.FLX` lane rather than `ASYLUM.DLL` ### Priority 3: Continue Small-Batch Boundary Repair diff --git a/tools/extract_eusecode_flx.py b/tools/extract_eusecode_flx.py new file mode 100644 index 0000000..b1e7813 --- /dev/null +++ b/tools/extract_eusecode_flx.py @@ -0,0 +1,788 @@ +#!/usr/bin/env python3 +"""Extractor for Crusader's EUSECODE.FLX container. + +Current validated layout: +- 0x80-byte header area +- little-endian entry count at file offset 0x54 +- entry table begins at 0x80 +- each entry is 8 bytes: <u32 data_offset, u32 declared_size> + +The exact semantics of the payload records are still under RE, so the extractor dumps +all non-zero entries and emits human-readable sidecars (.strings.txt and index files) +to support the next decoding pass. +""" + +from __future__ import annotations + +import argparse +import json +import pathlib +import struct +from dataclasses import asdict, dataclass + + +DEFAULT_INPUT = pathlib.Path(r"k:\ghidra\Crusader_Decomp\USECODE\EUSECODE.FLX") +DEFAULT_OUTPUT = pathlib.Path(r"k:\ghidra\Crusader_Decomp\USECODE\EUSECODE_extracted") + + +@dataclass(frozen=True) +class CandidateEntry: + table_offset: int + data_offset: int + declared_size: int + + +@dataclass +class ExtractedChunk: + index: int + table_offset: int + data_offset: int + declared_size: int + next_offset: int | None + extracted_size: int + overlap_with_next: bool + text_like: bool + printable_ratio: float + zero_ratio: float + preview: str + raw_path: str + strings_path: str + text_path: str | None + primary_label: str | None + field_names: list[str] + field_tags: list[str] + + +@dataclass(frozen=True) +class FlxTable: + entry_count: int + table_offset: int + table_end: int + entries: list[CandidateEntry] + + +def read_u32_le(data: bytes, offset: int) -> int: + return struct.unpack_from("<I", data, offset)[0] + + +def read_u16_le(data: bytes, offset: int) -> int: + return struct.unpack_from("<H", data, offset)[0] + + +def ascii_preview(data: bytes, limit: int = 64) -> str: + preview = [] + for byte in data[:limit]: + if 0x20 <= byte <= 0x7E: + preview.append(chr(byte)) + else: + preview.append(".") + return "".join(preview) + + +def printable_ratio(data: bytes) -> float: + if not data: + return 0.0 + printable = sum(1 for byte in data if byte in (0x09, 0x0A, 0x0D) or 0x20 <= byte <= 0x7E) + return printable / len(data) + + +def zero_ratio(data: bytes) -> float: + if not data: + return 0.0 + return data.count(0) / len(data) + + +def iter_printable_runs(data: bytes, min_len: int = 4) -> list[str]: + runs: list[str] = [] + current = bytearray() + for byte in data: + if byte in (0x09, 0x0A, 0x0D) or 0x20 <= byte <= 0x7E: + current.append(byte) + continue + if len(current) >= min_len: + runs.append(current.decode("latin-1")) + current.clear() + if len(current) >= min_len: + runs.append(current.decode("latin-1")) + return runs + + +def summarize_descriptor(strings: list[str]) -> tuple[str | None, list[str]]: + label_counts: dict[str, int] = {} + field_names: list[str] = [] + seen_fields: set[str] = set() + + for value in strings: + if value.isupper() and any(ch.isalpha() for ch in value): + label_counts[value] = label_counts.get(value, 0) + 1 + continue + if value and value[0].islower() and value.replace("_", "").isalnum() and value not in seen_fields: + seen_fields.add(value) + field_names.append(value) + + primary_label = None + if label_counts: + primary_label = sorted(label_counts.items(), key=lambda item: (-item[1], item[0]))[0][0] + return primary_label, field_names + + +def extract_field_tag_records(data: bytes, field_names: list[str]) -> list[str]: + tags: list[str] = [] + seen: set[str] = set() + + for field_name in field_names: + needle = field_name.encode("latin-1") + start = 0 + while True: + pos = data.find(needle, start) + if pos < 3: + break + tag = f"{data[pos - 3]:02X}:{data[pos - 2]:02X}{data[pos - 1]:02X}->{field_name}" + if tag not in seen: + seen.add(tag) + tags.append(tag) + start = pos + 1 + + tags.sort() + return tags + + +def has_referent_field(chunk: ExtractedChunk) -> bool: + if "referent" in chunk.field_names: + return True + return any(tag.endswith("->referent") for tag in chunk.field_tags) + + +def get_event_evidence(chunk: ExtractedChunk) -> list[str]: + evidence: list[str] = [] + seen: set[str] = set() + + for field_name in chunk.field_names: + if "event" not in field_name.lower(): + continue + marker = f"field:{field_name}" + if marker not in seen: + seen.add(marker) + evidence.append(marker) + + for field_tag in chunk.field_tags: + if "->event" not in field_tag.lower(): + continue + marker = f"tag:{field_tag}" + if marker not in seen: + seen.add(marker) + evidence.append(marker) + + return evidence + + +def chunk_role(chunk: ExtractedChunk) -> str: + if chunk.primary_label in {"JELYHACK", "JELYH2"}: + return "referent-anchor" + if get_event_evidence(chunk): + return "event-bearing" + if has_referent_field(chunk): + return "referent-neighbor" + return "neighbor" + + +def has_event_trigger_field(chunk: ExtractedChunk) -> bool: + if any("eventtrigger" == field_name.lower() for field_name in chunk.field_names): + return True + return any("->eventtrigger" in field_tag.lower() for field_tag in chunk.field_tags) + + +def event_tag_kind(chunk: ExtractedChunk) -> str: + if any("->eventtrigger" in field_tag.lower() for field_tag in chunk.field_tags): + return "eventTrigger" + if any(field_tag.lower().endswith("->event") for field_tag in chunk.field_tags): + return "event" + return "" + + +def classify_event_family(chunk: ExtractedChunk) -> str: + if event_tag_kind(chunk) == "eventTrigger": + return "callback-eventtrigger" + if event_tag_kind(chunk) != "event": + return "" + if chunk.primary_label == "EVENT": + return "event-hub" + if chunk.primary_label and chunk.primary_label.endswith("_BOOT"): + return "boot-event-core" + if chunk.field_names == ["referent", "event"]: + return "minimal-event-core" + if any(name in chunk.field_names for name in ("flame", "flame2", "fire", "fire2", "steam", "steam2")): + return "environmental-event" + if "typeNpc" in chunk.field_names: + return "npc-trigger" + return "specialized-event" + + +def header_u16_words(data: bytes, count: int = 16) -> list[str]: + limit = min(len(data) // 2, count) + return [f"0x{read_u16_le(data, index * 2):04X}" for index in range(limit)] + + +def header_u32_words(data: bytes, count: int = 8) -> list[str]: + limit = min(len(data) // 4, count) + return [f"0x{read_u32_le(data, index * 4):08X}" for index in range(limit)] + + +def interesting_printable_markers(data: bytes) -> list[str]: + markers: list[str] = [] + seen: set[str] = set() + for run in iter_printable_runs(data, min_len=3): + if not any(token in run for token in ("wx[", "wt$[", "t$t=t@", "$Q", "?\n", "?\r")): + continue + if run not in seen: + seen.add(run) + markers.append(run) + return markers[:8] + + +def write_island_graph( + out_dir: pathlib.Path, + output_name: str, + title: str, + center_labels: set[str], + descriptor_chunks: list[ExtractedChunk], + chunk_by_index: dict[int, ExtractedChunk], + total_chunks: int, + window: int = 5, +) -> None: + centers = [chunk for chunk in descriptor_chunks if chunk.primary_label in center_labels] + if not centers: + return + + island_indices = sorted( + { + neighbor_index + for center in centers + for neighbor_index in range(max(0, center.index - window), min(total_chunks, center.index + window + 1)) + } + ) + island_lines = [f"# {title}", "", "## Nodes", "", "| Index | Label | Role | Fields | Event Evidence |", "|---:|---|---|---|---|"] + for index in island_indices: + chunk = chunk_by_index[index] + island_lines.append( + "| {index} | {label} | {role} | {fields} | {evidence} |".format( + index=index, + label=chunk.primary_label or "", + role=chunk_role(chunk), + fields=",".join(chunk.field_names) or "-", + evidence=",".join(get_event_evidence(chunk)) or "-", + ) + ) + + island_lines.extend(["", "## Edges", "", "| Source | Relation | Target | Evidence |", "|---|---|---|---|"]) + for center in centers: + for neighbor_index in range(max(0, center.index - window), min(total_chunks, center.index + window + 1)): + if neighbor_index == center.index: + continue + neighbor = chunk_by_index[neighbor_index] + relation = f"table-neighbor({neighbor.index - center.index:+d})" + event_evidence = get_event_evidence(neighbor) + if event_evidence: + relation = f"possible-event-attachment({neighbor.index - center.index:+d})" + island_lines.append( + "| {source} ({source_index}) | {relation} | {target} ({target_index}) | {evidence} |".format( + source=center.primary_label, + source_index=center.index, + relation=relation, + target=neighbor.primary_label or "", + target_index=neighbor.index, + evidence=",".join(event_evidence) or "same local extraction neighborhood", + ) + ) + + (out_dir / output_name).write_text("\n".join(island_lines) + "\n", encoding="utf-8") + + +def write_descriptor_compare( + out_dir: pathlib.Path, + output_name: str, + labels: set[str], + descriptor_chunks: list[ExtractedChunk], +) -> None: + compare_lines = [ + "entry_index\tlabel\trole\tdata_offset\tdeclared_size\theader_u16\theader_u32\tprintable_markers\tfield_tags" + ] + for chunk in descriptor_chunks: + if chunk.primary_label not in labels: + continue + raw_data = pathlib.Path(chunk.raw_path).read_bytes() + compare_lines.append( + "{index}\t{label}\t{role}\t0x{data_offset:X}\t0x{declared_size:X}\t{header_u16}\t{header_u32}\t{markers}\t{field_tags}".format( + index=chunk.index, + label=chunk.primary_label, + role=chunk_role(chunk), + data_offset=chunk.data_offset, + declared_size=chunk.declared_size, + header_u16=",".join(header_u16_words(raw_data)), + header_u32=",".join(header_u32_words(raw_data)), + markers="|".join(interesting_printable_markers(raw_data)), + field_tags=",".join(chunk.field_tags), + ) + ) + (out_dir / output_name).write_text("\n".join(compare_lines) + "\n", encoding="utf-8") + + +def write_event_family_reports( + out_dir: pathlib.Path, + descriptor_chunks: list[ExtractedChunk], + chunk_by_index: dict[int, ExtractedChunk], + total_chunks: int, +) -> None: + family_lines = [ + "entry_index\tlabel\tfamily\ttag_kind\trole\tfield_count\tfield_names\tfield_tags\tdata_offset\tdeclared_size\tlocal_event_neighbors" + ] + families: dict[str, list[ExtractedChunk]] = {} + + for chunk in descriptor_chunks: + family = classify_event_family(chunk) + if not family: + continue + families.setdefault(family, []).append(chunk) + local_event_neighbors = 0 + for neighbor_index in range(max(0, chunk.index - 5), min(total_chunks, chunk.index + 6)): + if neighbor_index == chunk.index: + continue + neighbor = chunk_by_index[neighbor_index] + if event_tag_kind(neighbor): + local_event_neighbors += 1 + family_lines.append( + "{index}\t{label}\t{family}\t{tag_kind}\t{role}\t{field_count}\t{field_names}\t{field_tags}\t0x{data_offset:X}\t0x{declared_size:X}\t{local_event_neighbors}".format( + index=chunk.index, + label=chunk.primary_label or "", + family=family, + tag_kind=event_tag_kind(chunk), + role=chunk_role(chunk), + field_count=len(chunk.field_names), + field_names=",".join(chunk.field_names), + field_tags=",".join(chunk.field_tags), + data_offset=chunk.data_offset, + declared_size=chunk.declared_size, + local_event_neighbors=local_event_neighbors, + ) + ) + (out_dir / "event_family_index.tsv").write_text("\n".join(family_lines) + "\n", encoding="utf-8") + + summary_lines = ["# Event Family Summary", ""] + family_order = [ + "event-hub", + "boot-event-core", + "npc-trigger", + "minimal-event-core", + "environmental-event", + "specialized-event", + "callback-eventtrigger", + ] + for family in family_order: + family_chunks = families.get(family, []) + if not family_chunks: + continue + summary_lines.append(f"## {family}") + summary_lines.append("") + summary_lines.append("| Index | Label | Tag Kind | Fields | Size | Local Event Neighbors |") + summary_lines.append("|---:|---|---|---|---:|---:|") + for chunk in sorted(family_chunks, key=lambda value: value.index): + local_event_neighbors = 0 + for neighbor_index in range(max(0, chunk.index - 5), min(total_chunks, chunk.index + 6)): + if neighbor_index == chunk.index: + continue + neighbor = chunk_by_index[neighbor_index] + if event_tag_kind(neighbor): + local_event_neighbors += 1 + summary_lines.append( + "| {index} | {label} | {tag_kind} | {fields} | 0x{declared_size:X} | {local_event_neighbors} |".format( + index=chunk.index, + label=chunk.primary_label or "", + tag_kind=event_tag_kind(chunk), + fields=",".join(chunk.field_names) or "-", + declared_size=chunk.declared_size, + local_event_neighbors=local_event_neighbors, + ) + ) + summary_lines.append("") + (out_dir / "event_family_summary.md").write_text("\n".join(summary_lines), encoding="utf-8") + + +def looks_text_like(data: bytes) -> bool: + if not data: + return False + ratio = printable_ratio(data) + if ratio < 0.80: + return False + if b"\r\n" in data or b"\n" in data: + return True + return zero_ratio(data) < 0.05 + + +def parse_flx_table(data: bytes, table_offset: int = 0x80, count_offset: int = 0x54) -> FlxTable: + file_size = len(data) + entry_count = read_u32_le(data, count_offset) + table_end = table_offset + entry_count * 8 + if table_end > file_size: + raise ValueError( + f"FLX table extends past EOF: entry_count={entry_count} table_end=0x{table_end:X} file_size=0x{file_size:X}" + ) + + entries: list[CandidateEntry] = [] + for index in range(entry_count): + offset = table_offset + index * 8 + data_offset = read_u32_le(data, offset) + declared_size = read_u32_le(data, offset + 4) + if data_offset == 0 and declared_size == 0: + continue + if data_offset <= 0 or data_offset > file_size: + continue + if declared_size <= 0: + continue + entries.append(CandidateEntry(offset, data_offset, declared_size)) + + return FlxTable( + entry_count=entry_count, + table_offset=table_offset, + table_end=table_end, + entries=entries, + ) + + +def dump_chunk( + base_dir: pathlib.Path, chunk_name: str, data: bytes +) -> tuple[str, str, str | None, bool, float, float, str, str | None, list[str], list[str]]: + raw_path = base_dir / f"{chunk_name}.bin" + strings_path = base_dir / f"{chunk_name}.strings.txt" + text_path = base_dir / f"{chunk_name}.txt" + + raw_path.write_bytes(data) + + runs = iter_printable_runs(data) + strings_path.write_text("\n".join(runs) + ("\n" if runs else ""), encoding="utf-8") + primary_label, field_names = summarize_descriptor(runs) + field_tags = extract_field_tag_records(data, field_names) + + text_like = looks_text_like(data) + actual_text_path: str | None = None + if text_like: + text_path.write_text(data.decode("latin-1", errors="replace"), encoding="utf-8") + actual_text_path = str(text_path) + + return ( + str(raw_path), + str(strings_path), + actual_text_path, + text_like, + printable_ratio(data), + zero_ratio(data), + ascii_preview(data), + primary_label, + field_names, + field_tags, + ) + + +def extract_candidates(data: bytes, out_dir: pathlib.Path, entries: list[CandidateEntry]) -> list[ExtractedChunk]: + chunks_dir = out_dir / "chunks" + chunks_dir.mkdir(parents=True, exist_ok=True) + + extracted: list[ExtractedChunk] = [] + file_size = len(data) + + sorted_entries = sorted(enumerate(entries), key=lambda item: (item[1].data_offset, item[0])) + next_by_original_index: dict[int, int | None] = {} + for position, (original_index, entry) in enumerate(sorted_entries): + next_offset = sorted_entries[position + 1][1].data_offset if position + 1 < len(sorted_entries) else None + next_by_original_index[original_index] = next_offset + + for index, entry in enumerate(entries): + next_offset = next_by_original_index.get(index) + chunk_end = min(file_size, entry.data_offset + entry.declared_size) + chunk_data = data[entry.data_offset:chunk_end] + overlap = next_offset is not None and (entry.data_offset + entry.declared_size) > next_offset + chunk_name = ( + f"chunk_{index:03d}_table_{entry.table_offset:04X}_off_{entry.data_offset:06X}_len_{entry.declared_size:06X}" + ) + + raw_path, strings_path, text_path, text_like, print_ratio, z_ratio, preview, primary_label, field_names, field_tags = dump_chunk( + chunks_dir, chunk_name, chunk_data + ) + + extracted.append( + ExtractedChunk( + index=index, + table_offset=entry.table_offset, + data_offset=entry.data_offset, + declared_size=entry.declared_size, + next_offset=next_offset, + extracted_size=len(chunk_data), + overlap_with_next=overlap, + text_like=text_like, + printable_ratio=round(print_ratio, 4), + zero_ratio=round(z_ratio, 4), + preview=preview, + raw_path=raw_path, + strings_path=strings_path, + text_path=text_path, + primary_label=primary_label, + field_names=field_names, + field_tags=field_tags, + ) + ) + + return extracted + + +def write_summary(out_dir: pathlib.Path, input_path: pathlib.Path, data: bytes, entries: list[CandidateEntry], chunks: list[ExtractedChunk]) -> None: + summary = { + "input_path": str(input_path), + "file_size": len(data), + "header_preview_hex": data[:128].hex(), + "header_preview_ascii": ascii_preview(data[:128], 128), + "candidate_entries": [asdict(entry) for entry in entries], + "chunks": [asdict(chunk) for chunk in chunks], + } + (out_dir / "summary.json").write_text(json.dumps(summary, indent=2), encoding="utf-8") + + index_lines = [ + "entry_index\ttable_offset\tdata_offset\tdeclared_size\textracted_size\ttext_like\tprintable_ratio\tzero_ratio\toverlap_with_next\tprimary_label\tfield_names\tfield_tags\tpreview" + ] + for chunk in chunks: + index_lines.append( + "{index}\t0x{table_offset:X}\t0x{data_offset:X}\t0x{declared_size:X}\t0x{extracted_size:X}\t{text_like}\t{printable_ratio:.4f}\t{zero_ratio:.4f}\t{overlap}\t{primary_label}\t{field_names}\t{field_tags}\t{preview}".format( + index=chunk.index, + table_offset=chunk.table_offset, + data_offset=chunk.data_offset, + declared_size=chunk.declared_size, + extracted_size=chunk.extracted_size, + text_like=int(chunk.text_like), + printable_ratio=chunk.printable_ratio, + zero_ratio=chunk.zero_ratio, + overlap=int(chunk.overlap_with_next), + primary_label=chunk.primary_label or "", + field_names=",".join(chunk.field_names), + field_tags=",".join(chunk.field_tags), + preview=chunk.preview.replace("\t", " "), + ) + ) + (out_dir / "entry_index.tsv").write_text("\n".join(index_lines) + "\n", encoding="utf-8") + + descriptor_lines = [ + "entry_index\tprimary_label\tfield_names\tfield_tags\tdata_offset\tdeclared_size" + ] + descriptor_chunks = [chunk for chunk in chunks if chunk.primary_label or chunk.field_names] + for chunk in descriptor_chunks: + descriptor_lines.append( + "{index}\t{primary_label}\t{field_names}\t{field_tags}\t0x{data_offset:X}\t0x{declared_size:X}".format( + index=chunk.index, + primary_label=chunk.primary_label or "", + field_names=",".join(chunk.field_names), + field_tags=",".join(chunk.field_tags), + data_offset=chunk.data_offset, + declared_size=chunk.declared_size, + ) + ) + (out_dir / "descriptor_index.tsv").write_text("\n".join(descriptor_lines) + "\n", encoding="utf-8") + + neighborhood_lines = [ + "center_index\tneighbor_index\tprimary_label\tfield_names\tfield_tags" + ] + interesting = {"JELYHACK", "JELYH2", "NPCTRIG", "CRUZTRIG", "TRIGPAD", "SPECIAL", "EVENT", "SFXTRIG"} + interesting_indices = [chunk.index for chunk in chunks if chunk.primary_label in interesting] + seen_pairs: set[tuple[int, int]] = set() + chunk_by_index = {chunk.index: chunk for chunk in chunks} + for center_index in interesting_indices: + for neighbor_index in range(max(0, center_index - 4), min(len(chunks), center_index + 5)): + pair = (center_index, neighbor_index) + if pair in seen_pairs: + continue + seen_pairs.add(pair) + chunk = chunk_by_index[neighbor_index] + neighborhood_lines.append( + "{center_index}\t{neighbor_index}\t{primary_label}\t{field_names}\t{field_tags}".format( + center_index=center_index, + neighbor_index=neighbor_index, + primary_label=chunk.primary_label or "", + field_names=",".join(chunk.field_names), + field_tags=",".join(chunk.field_tags), + ) + ) + (out_dir / "descriptor_neighborhoods.tsv").write_text("\n".join(neighborhood_lines) + "\n", encoding="utf-8") + + anchor_graph_lines = [ + "anchor_index\tanchor_label\tanchor_fields\tneighbor_index\tdistance\tneighbor_label\tneighbor_fields\tneighbor_role\tevent_evidence" + ] + for anchor in descriptor_chunks: + if not anchor.primary_label or not has_referent_field(anchor): + continue + for neighbor_index in range(max(0, anchor.index - 5), min(len(chunks), anchor.index + 6)): + if neighbor_index == anchor.index: + continue + neighbor = chunk_by_index[neighbor_index] + event_evidence = get_event_evidence(neighbor) + if not event_evidence: + continue + anchor_graph_lines.append( + "{anchor_index}\t{anchor_label}\t{anchor_fields}\t{neighbor_index}\t{distance:+d}\t{neighbor_label}\t{neighbor_fields}\t{neighbor_role}\t{event_evidence}".format( + anchor_index=anchor.index, + anchor_label=anchor.primary_label, + anchor_fields=",".join(anchor.field_names), + neighbor_index=neighbor.index, + distance=neighbor.index - anchor.index, + neighbor_label=neighbor.primary_label or "", + neighbor_fields=",".join(neighbor.field_names), + neighbor_role=chunk_role(neighbor), + event_evidence=",".join(event_evidence), + ) + ) + (out_dir / "referent_anchor_event_graph.tsv").write_text("\n".join(anchor_graph_lines) + "\n", encoding="utf-8") + + write_island_graph( + out_dir, + "jelyhack_island_graph.md", + "JELYHACK Island Graph", + {"JELYHACK", "JELYH2"}, + descriptor_chunks, + chunk_by_index, + len(chunks), + ) + write_descriptor_compare( + out_dir, + "jelyhack_descriptor_compare.tsv", + {"JELYHACK", "JELYH2", "REE_BOOT", "SURCAMEW", "SFXTRIG"}, + descriptor_chunks, + ) + write_island_graph( + out_dir, + "event_island_graph.md", + "EVENT Cluster Graph", + {"EVENT", "COR_BOOT", "NPCTRIG", "ROLL_NS", "CRUZTRIG"}, + descriptor_chunks, + chunk_by_index, + len(chunks), + ) + write_descriptor_compare( + out_dir, + "event_descriptor_compare.tsv", + {"ROLL_NS", "COR_BOOT", "EVENT", "NPCTRIG", "CRUZTRIG", "NPC_ONLY", "VMAIL"}, + descriptor_chunks, + ) + write_island_graph( + out_dir, + "boot_frontier_graph.md", + "AND/BRO Boot Frontier Graph", + {"AND_BOOT", "BRO_BOOT"}, + descriptor_chunks, + chunk_by_index, + len(chunks), + window=6, + ) + write_descriptor_compare( + out_dir, + "boot_family_compare.tsv", + {"AND_BOOT", "BRO_BOOT", "COR_BOOT", "VAR_BOOT", "REE_BOOT"}, + descriptor_chunks, + ) + write_island_graph( + out_dir, + "environmental_event_graph.md", + "Environmental Event Graph", + {"FLAMEBOX", "NOSTRIL", "STEAMBOX"}, + descriptor_chunks, + chunk_by_index, + len(chunks), + window=5, + ) + write_descriptor_compare( + out_dir, + "environmental_family_compare.tsv", + {"FLAMEBOX", "NOSTRIL", "STEAMBOX"}, + descriptor_chunks, + ) + write_descriptor_compare( + out_dir, + "callback_trigger_compare.tsv", + {"SURCAMNS", "SURCAMEW"}, + descriptor_chunks, + ) + write_event_family_reports(out_dir, descriptor_chunks, chunk_by_index, len(chunks)) + + lines = [] + lines.append("# EUSECODE.FLX First-Pass Extraction") + lines.append("") + lines.append(f"Input: {input_path}") + lines.append(f"File size: 0x{len(data):X} ({len(data)} bytes)") + lines.append(f"Candidate entries: {len(entries)}") + lines.append("") + lines.append("## Header Preview") + lines.append("") + lines.append(f"ASCII: `{ascii_preview(data[:128], 128)}`") + lines.append("") + lines.append("## Chunks") + lines.append("") + lines.append("| # | Table Off | Data Off | Declared Size | Next Off | Text | Overlap | Preview |") + lines.append("|---:|---:|---:|---:|---:|:---:|:---:|---|") + for chunk in chunks: + next_off = f"0x{chunk.next_offset:X}" if chunk.next_offset is not None else "-" + lines.append( + "| {index} | 0x{table_offset:X} | 0x{data_offset:X} | 0x{declared_size:X} | {next_off} | {text_like} | {overlap} | {preview} |".format( + index=chunk.index, + table_offset=chunk.table_offset, + data_offset=chunk.data_offset, + declared_size=chunk.declared_size, + next_off=next_off, + text_like="yes" if chunk.text_like else "no", + overlap="yes" if chunk.overlap_with_next else "no", + preview=chunk.preview.replace("|", "/"), + ) + ) + lines.append("") + lines.append("## Notes") + lines.append("") + lines.append("- The extractor now parses the validated FLX table directly: entry count at `0x54`, table at `0x80`, 8 bytes per entry.") + lines.append("- Overlapping declared sizes likely mean some entries are counts or record spans rather than exact chunk lengths.") + lines.append("- `.strings.txt` files are the main human-readable output for now; `.txt` files are emitted only for chunks that look text-like.") + lines.append("- `descriptor_index.tsv` summarizes guessed class labels, field names, and compact tag patterns for descriptor-like chunks.") + lines.append("- `descriptor_neighborhoods.tsv` captures local table neighborhoods around trigger/event-related classes such as `JELYHACK`, `NPCTRIG`, `CRUZTRIG`, `TRIGPAD`, and `SPECIAL`.") + lines.append("- `referent_anchor_event_graph.tsv` groups referent-bearing descriptors with nearby event-bearing neighbors so the attachment model can be inspected without ad hoc grepping.") + lines.append("- `jelyhack_island_graph.md` renders the first focused graph view for the `JELYHACK` / `JELYH2` neighborhood, marking likely event-bearing attachments such as `REE_BOOT`, `SURCAMEW`, and `SFXTRIG` when they appear within the local table window.") + lines.append("- `jelyhack_descriptor_compare.tsv` captures the first 16 header words, first 8 dwords, and a few odd printable markers for the core JELYHACK-island descriptors so structural similarity can be compared without raw hex dumps.") + lines.append("- `event_island_graph.md` renders the denser `EVENT` / `COR_BOOT` / `NPCTRIG` / `ROLL_NS` / `CRUZTRIG` island, which currently looks like the strongest event-explicit neighborhood outside the JELYHACK anchor case.") + lines.append("- `event_descriptor_compare.tsv` captures the same header-word and printable-marker comparison for the `EVENT` island so large event-bearing descriptors can be contrasted with neighboring trigger and referent records.") + lines.append("- `boot_frontier_graph.md` renders the upstream referent neighborhood feeding `AND_BOOT` / `BRO_BOOT`, which is currently the clearest unexplored boot-event frontier.") + lines.append("- `boot_family_compare.tsv` compares the five `_BOOT` event cores (`AND_BOOT`, `BRO_BOOT`, `COR_BOOT`, `VAR_BOOT`, `REE_BOOT`) by header words, markers, and field tags.") + lines.append("- `environmental_event_graph.md` renders the three hazard/event islands centered on `FLAMEBOX`, `NOSTRIL`, and `STEAMBOX`, each surrounded by its own referent-heavy local neighborhood.") + lines.append("- `environmental_family_compare.tsv` compares the environmental event trio so the shared hazard pattern (`referent,event,<hazard>,<hazard2>,direction,count`) can be contrasted directly.") + lines.append("- `callback_trigger_compare.tsv` compares `SURCAMNS` and `SURCAMEW` directly so the callback-only `eventTrigger` lane can be checked against the active `event` families without raw hex dumps.") + lines.append("- `event_family_index.tsv` and `event_family_summary.md` classify all current `event` and `eventTrigger` descriptors into reusable families such as boot-event cores, minimal event cores, environmental events, and callback-only surveillance triggers.") + (out_dir / "README.md").write_text("\n".join(lines) + "\n", encoding="utf-8") + + all_strings = iter_printable_runs(data) + (out_dir / "all_strings.txt").write_text("\n".join(all_strings) + ("\n" if all_strings else ""), encoding="utf-8") + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("input", nargs="?", type=pathlib.Path, default=DEFAULT_INPUT) + parser.add_argument("output", nargs="?", type=pathlib.Path, default=DEFAULT_OUTPUT) + return parser.parse_args() + + +def main() -> int: + args = parse_args() + data = args.input.read_bytes() + args.output.mkdir(parents=True, exist_ok=True) + + flx_table = parse_flx_table(data) + entries = flx_table.entries + chunks = extract_candidates(data, args.output, entries) + write_summary(args.output, args.input, data, entries, chunks) + + print( + f"Parsed {flx_table.entry_count} table slots with {len(chunks)} non-zero entries; extracted to {args.output}" + ) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main())