# I Am Legend A portable Windows desktop app by Witty Waypoint for solo EverQuest Legends Dungeon Crawl competitions. It reads the selected game log and records completed runs, Legend Ratings, loot breakdowns and per-crawl combat reports. Preview version 0.2.0. The interface features a torch-lit dungeon scene and the approved Witty Waypoint champion. Wide windows reserve space beside the controls for the character; compact windows soften him into the background to keep the controls readable. This release introduces the `legend-rating-v2` ruleset. Previous time-only results stay readable but do not rank against the new ratings. ## Run Extract the Windows ZIP and launch `IAmLegend.exe`. Keep its `.config` file alongside it. Requires Windows 10/11 with .NET Framework 4.8. No installer, account, browser, game plugin or administrator access is required. This preview is unsigned. 1. Enable logging in EverQuest Legends with `/log on`. 2. Select `eqlog_Character_Server.txt` using **Choose log**. 3. Check **These are my solo runs** and enter your current level as the fallback. This is a player declaration; a level actually observed in the log takes precedence. 4. Select the dungeon and D0–D4 bracket. Fear D4 starts with a provisional **40-minute benchmark**. For other brackets, enter the organizer's agreed benchmark in whole minutes and click **Set** before watching. Use the same value for every entrant. 5. Click **Start watching**, then create a **new** crawl instance and enter it. 6. The game's crawl completion message freezes the timer and shows the rating. Keep watching while looting the reward chest; the same result updates as rewards arrive. Leaving the instance closes reward collection. 7. Select a result to see its score breakdown. **Run details** includes levels, mote grades, excluded sales, late pickups and system evidence. **Combat parser** shows damage, tanking, encounters and the timeline. Watching begins at the end of the file and needs fresh creation plus entry evidence. If the app stops or the log is replaced during an attempt, start a fresh attempt or import the complete original log afterward. Keep relevant game combat messages logged; filtered or missing messages cannot be reconstructed. **Import past log** parses completed historical crawls using the current solo and fallback-level declarations. Re-importing the original log refreshes existing results and their reports without duplicating them. An imported results file cannot overwrite an existing local result. Nothing is preloaded: the development reference log and synthetic previews are not included in the app's results or release package. ## Competition rules Each dungeon has separate D0, D1, D2, D3 and D4 brackets. Highest Legend Rating wins. Identical rounded ratings share a rank. Best-per-player mode groups by character and server and prefers results matching the selected benchmark. ``` level bonus = floor(sum(seconds at each level * 0.02 * (50 - level))) adjusted time = elapsed seconds - level bonus + 30 * player deaths time points = 2000 * benchmark seconds / adjusted time mote points = 25 * (regular motes + chest motes) coin points = 0.5 * direct platinum Legend Rating = round(time points + mote points + coin points) ``` Ratings are open-ended: 2,500 is not a ceiling. Sum the unrounded components and round once to the nearest whole point, with half points rounded upward. Components on the main screen are rounded only for display. A 37:07 level-50 clear, no deaths, 9 motes and 394.577 platinum earns **2,578** with a 40-minute benchmark. Each run captures the bracket's benchmark on first entry. Changing the setting does not rewrite existing scores. Runs with other benchmarks remain visible with **Different benchmark**, but receive no rank on the current board. Set a benchmark from 1 to 1,440 whole minutes; an unset bracket still records timing, loot and combat, but shows no rating. Benchmarks are organizer-agreed settings, not game-certified values. Lock them before a competition. Original-log imports use the currently configured benchmarks and create separate scoring records when a benchmark changes. ### What loot counts - Regular mote loot recorded between crawl entry and the completion message, while in the crawl zone, plus explicit **Reward Chest** motes after completion and before departure or creation of another instance. - Quantity matters: a line saying `6 Mote of Major Potential` counts as six, not one. Manual inventory loot and automatic currency storage are recognized. Every grade earns 25 points in v2; grades remain visible in Run details. - Direct `You receive ... from the corpse.` coin messages before completion, plus subsequent coin messages in the same completion second. Gold, silver and copper convert exactly: 1 platinum = 10 gold = 100 silver = 1,000 copper. - Automatic item sales are displayed separately and earn no points. Keeping equipment instead of selling it does not lower the coin score. - Ordinary corpse loot recorded after completion is retained as **late pickups**, separately from scored loot. The log may not identify whether an identically named corpse died before or after completion. These pickups currently earn no points; explicit chest motes still count. Later deaths and combat do not alter the completed crawl. **Reward totals open** means the saved result is a snapshot that can still gain chest points. Keep watching through looting and departure before sharing the final result. Exporting earlier preserves the current snapshot; a later export can append reward evidence to an earlier imported snapshot. If watching is stopped before rewards are collected, import the original log afterward to refresh the result. Levels 1–50 are supported. Level 50 receives no bonus. Level changes alter the bonus from that timestamp onward. Fractional bonuses are summed and rounded down once, at completion. Death penalties receive no level discount. Recovery and re-entry time remain in elapsed time; pet deaths receive no penalty. A five-minute clear at L50 is 5:00; at L49, 4:54; at L48, 4:48. One death at L49 gives 5:24. Ten minutes each at levels 46, 47 and 48 gives 28:12 before deaths. The timer begins at the first matching zone entry following the player's fresh instance-creation message. It ends only at `You have completed the Dungeon Crawl and earned reward loot!`. That message is the game's completion signal; the app does not infer completion from loot or guess rare/trash objectives that are absent from the log. Solo play and any fallback level are recorded as declarations. Run details show whether level segments came from the log or a declaration. Missing/skipped level transitions, inconsistent zone or difficulty evidence, group/raid labels and backward timestamps trigger review instead of a ranked result. The default unnumbered entry is interpreted as D0; unsupported tier labels require review. Organizers must agree on the same game conditions and ruleset. ## Combat reports - Personal melee, spell, DoT and damage-shield damage; hits, criticals and largest hits. - Recognized pet damage shown separately and included in combined DPS. A recognized pet ownership reply must appear in the observed log; charm ownership is not inferred. - Run-average DPS uses the whole crawl duration, including travel and recovery. - Estimated encounter/active DPS uses pulls separated by more than 12 seconds without observed combat events. These are estimates, not game-reported encounter boundaries; a single-second encounter uses a one-second denominator. - Tanking shows damage taken by attacker and attack/spell, avoidance, incoming hits and largest hit. Unattributed damage stays unattributed. No health percentage, mitigation percentage or map position is invented. - Healing cast and received are separate totals. A self-heal contributes once to each respective measure. - Timeline filters include incoming damage, deaths with 15 seconds of lead-up and 3 seconds after, level-ups, healing and a selected encounter. Double-click an encounter to open its timeline. Reports cover the specific crawl only. Unknown combat message formats are ignored. The timeline is capped at 100,000 events per crawl; aggregate totals continue. The parser is independently implemented and will need more log examples to cover every class, pet and message variant. ## Sharing and storage **Export bracket** creates an `.ialrun` file for the selected benchmark and current ruleset, with timing and loot evidence plus declarations. An organizer uses **Import results** to assemble a local board. The importer recomputes time, level bonus, deaths, mote quantities and coin from included evidence, then recalculates the rating. Exports omit chat and combat reports; import the original log locally to view its full combat report. A later import can extend an imported snapshot's evidence; it cannot replace local original-log results or a conflicting imported history. ### Updating from v0.1.x Close the old app, extract the v0.2.0 ZIP into a new folder, and run its `IAmLegend.exe`. It uses the same results directory. Existing records are preserved and labeled **Legacy · reimport log**; they are not retroactively assigned invented loot totals. The first upgrade keeps `results.json.pre-v2` as an unchanged backup and moves saved storage to schema 2, which older builds reject rather than overwrite. Reimport the original game log to obtain new v2 results. Older `.ialrun` exports contain no loot evidence and cannot be imported as v2 point scores. Keep the old ZIP and use a separate `--data-dir` if you need the previous time-only build. There is no online leaderboard or authentication service. Local text logs are editable, so these results are not server-certified or tamper-proof. The app is suitable for an agreed-rules community competition; it cannot independently prove solo play, equipment, character level when missing from the log, or an unedited log. App data lives in `%LOCALAPPDATA%\WittyWaypoint\IAmLegend`: - `results.json` and `results.json.bak`: local board, captured scoring data and bracket benchmark settings. - `combat\*.json.gz`: compressed per-run reports. - `fonts\`: private copies of bundled fonts, not system-installed fonts. Back up that folder to preserve results and reports. `--data-dir "path"` selects a separate results folder for development or testing. ## Boundaries The game log is opened read-only with sharing enabled for the game writer. The app does not read game memory, inspect game network traffic, control input, modify game files, upload data, or make network requests. Log-only design does not constitute publisher endorsement or an EULA determination. ## Build and verify Run `build.ps1` in PowerShell on Windows. It uses the Windows .NET Framework C# compiler; no downloaded dependencies or third-party code packages are required to build from this source tree. Output: `release\IAmLegend.exe`. ``` .\build.ps1 .\qa\Tests.exe .\qa\UiTests.exe ``` An optional reference log path may be passed to `Tests.exe`. It reads that file without changing it or adding its runs to app storage. `UiTests.exe` uses synthetic data in a unique `qa` folder and renders WPF offscreen without showing windows or injecting input. The portable release excludes tests and test state. ## Credits Original parser and scoring implementation for I Am Legend. EQ Legends Companion was reviewed for product ideas only; no Companion source code is included: https://github.com/jmoyers/everquest-companion. Cinzel Decorative by Natanael Gama and Rajdhani by Indian Type Foundry are bundled unmodified under the SIL Open Font License 1.1. License and copyright notices are in `assets/fonts` and accompany the release. Sources: https://github.com/google/fonts/tree/main/ofl/cinzeldecorative and https://github.com/google/fonts/tree/main/ofl/rajdhani. The champion artwork was generated with the built-in image tool using the user's retained Witty Waypoint mascot as an identity reference. The final prompt and asset provenance are in `assets/mascot-provenance.txt`.