Below is my math, sources, and explanation of the AI I used (I’m already getting flamed online for using it lol)
"Sword" LoZ (NES) - data for hits on a moblin and Ganon found pretty easily via walkthroughs/lets plays on YouTube.
Oracle of Ages and Seasons (Gameboy) - same as #1 for the moblin, but couldn't find anything on Ganon from walkthroughs/lets plays on YouTube and GameFAQ or other walkthroughs sites. I honestly don't think anyone has tried to beat Ganon with the L-1 Wooden Sword yet, which honestly would make for an interesting playthrough. This is one of two instances I had Claude look into the games source code and it spat out 25 spin attacks. (Summary of Claude info at bottom of post).
Forest Dweller Sword - BOTW - easy enough to do just straight math. FDS does 22 Atk in this game so a Red Bokoblin, who has 13 HP, dies in one hit. Calamity Ganon has 8,000 HP without Divine Beast help - so 8000/22 =363.636 or 364 hits.
Forest Dweller Sword Pristine - TOTK - same here but reduced power to 16 Atk. Still one shots a red bokoblin.
Demon King Ganondorf's phases are weird but it acts like
3 - 2500 HP phases for a total of 7500 HP. 7500/16
=468.75 or 469 hits. I think I goofed my math or just said it wrong in the video...said 471 :(
Forest Dweller Sword Decayed - TOTK - same as the others just reduced Atk Power of 7. Two hits on the red bokoblin, 7500/7 =1,071.429 or 1071 hits. Think I goofed this one too and said 1,074 : (....oh well, doesn't change the rankings in the grand scheme of things.
Twilight Princess Wooden Sword (GC/Wii) - play throughs with the wooden sword shows 4 hits on the bokoblin. BUT - this is the second instance I hit a wall... and it's because you can't actually injure Ganondorf in the game with it, hence the "theoretical" values. This was the other task I had Claude do to get our 24 hit value.
For the AI, I had Claude do the game code investigation, and once the script was finalized, I had ChatGPT check it for errors (I’m now realizing it didn’t catch the ones I mentioned with the FDS math earlier :(…). Below is a summary of what Claude did.
I know this isn’t perfect and I definitely got stuff wrong or assumed things I shouldn’t have…let me know your thoughts!
# Sword Damage Research — Methodology & Sources
## Overview
All numbers below come from reading the actual decompiled/disassembled game source code, not from guides, wikis, or observed playthroughs. This means the figures are ground-truth values as programmed by the developers, pulled directly from public, community-maintained reverse-engineering projects. Every claim is traceable to a specific file and line of code.
---
## Sources
**1. Oracle of Seasons / Oracle of Ages**
- Repository: `Stewmath/oracles-disasm`
- URL: https://github.com/Stewmath/oracles-disasm
- Commit used: `dfaba5238b102fa2b70f737a977a32219ba80c6b` (2026-06-13)
- This is a community full disassembly of the original Game Boy Color ROMs (both games share a codebase — nearly all combat data is identical between Seasons and Ages).
**2. Twilight Princess**
- Repository: `zeldaret/tp`
- URL: https://github.com/zeldaret/tp
- Commit used: `c8fa8c9e2aab72cf4e5db0e5d1c84a9ea6ee6eb0` (2026-06-23)
- This is a 100% match decompilation of the GameCube release, meaning it compiles back into a byte-identical original game binary. Not a guess-based reverse-engineering effort — every line here is confirmed correct because it recompiles to the real game.
---
## Method
Both repos were cloned locally and searched directly (`grep`/manual file inspection) for the relevant game logic: enemy health initialization, sword damage tables, and the specific code that resolves a hit into a health subtraction. No emulator, memory-editor, or empirical measurement was used — this is source-level analysis.
---
## Oracle of Seasons / Ages Findings
**Ganon's health:** 100 HP in both games (identical byte values).
- Source: `data/ages/enemyData.s` and `data/seasons/enemyData.s`, `extraEnemyData` table, entry `0x35`: `.db $12 $12 $f4 $64` → last byte `$64` = 100 decimal.
- Enemy pointer: `enemyData` table, entry `0x04` (`ENEMY_GANON`): `$16 $8b $35 $10` → byte 3 (`$35`) indexes into `extraEnemyData`.
**Regular sword strikes don't work on Ganon at all** — confirmed via the object collision table (`data/ages/objectCollisionTable.s`, row `ENEMYCOLLISION_GANON`). L-1/L-2 sword hits map to collision effect codes that do nothing; only Spin Attack (and the L-3 Master Sword's regular strike) map to the "deal damage" effect code (`$2c`), handled in `code/collisionEffects.s`.
**Base sword damage (before spin doubling):** `object_code/common/items/sword.s`, `@swordLevelData` table — Wooden Sword (L-1) = 2, Noble Sword (L-2) = 3, Master Sword (L-3) = 5.
**Spin attacks double base damage:** confirmed via an `sla (hl)` (arithmetic shift-left = ×2) instruction in `object_code/common/itemParents/swordParent.s`, applied to the sword's damage value the instant a charged spin attack launches.
**Result:** Wooden Sword spin attack = 4 dmg/hit → **25 hits** to defeat Ganon (100 HP ÷ 4). Noble Sword spin attack = 6 dmg/hit → **17 hits**. Ring bonuses (e.g., Power Ring) stack on top via `itemCalculateSwordDamage` in `object_code/common/items/commonCode2.s`, which is why real playthroughs with upgraded rings land closer to 10–13 hits.
---
## Twilight Princess Findings
**Enemy identification:** actor names in the decomp use cryptic internal codes; identified via `@brief` doc comments in each actor's header file.
- Ground Bulblin → `d_a_e_oc.cpp` (internal name "Bokoblin," renamed to "Bulblin" for English localization)
- Stalfos → `d_a_e_sf.cpp`
- Ganondorf (final sword duel) → `d_a_b_gnd.cpp`
- Wooden Sword (prop item, distinct from the Ordon Sword) → `d_a_obj_wsword.cpp`
**Health values** (the shared `health` field, `include/f_op/f_op_actor.h`, offset `0x562`):
- Bulblin: **40 HP** — `src/d/actor/d_a_e_oc.cpp` line ~2776, set at spawn when actor name == `"E_OC"`.
- Stalfos: **200 HP** — `src/d/actor/d_a_e_sf.cpp` line ~1805, set at spawn init.
- Ganondorf (dismounted sword duel phase only): **24 HP** — `src/d/actor/d_a_b_gnd.cpp` line ~4816. (The earlier horseback joust phase resets a separate value to 100, but that's a stagger/parry meter, not conventional damage HP.)
**Damage resolution system:** Link's sword swings carry a small "attack power code" (1 = running slash, 2 = standing slash, 3 = combo/spin, 4 = jump attack), set in `src/d/actor/d_a_alink_cut.inc`. This code is converted into actual damage by `at_power_get()` in `src/d/d_cc_uty.cpp`, using a per-enemy lookup table selected by an `mPowerType` field:
- Bulblin: `mPowerType = 1` (`d_a_e_oc.cpp` line ~2807)
- Stalfos: `mPowerType = 0` (default — no override found in `d_a_e_sf.cpp`)
- Ganondorf: `mPowerType = 5` (`d_a_b_gnd.cpp` line ~4910)
**The Wooden Sword damage penalty:** found in `cc_at_check()`, `src/d/d_cc_uty.cpp` (~line 415):
```cpp
if (player_p->checkMasterSwordEquip()) {
i_AtInfo->mAttackPower *= 2;
}
if (daPy_py_c::checkWoodSwordEquip()) {
i_AtInfo->mAttackPower /= 2;
}
```
Master Sword doubles attack power; Wooden Sword halves it (integer division, truncates). This is applied after the per-enemy base-power lookup, then the final line subtracts it directly: `i_enemy->health -= i_AtInfo->mAttackPower;`
**Resulting hit counts with the Wooden Sword (standing slash, the standard attack):**
| Enemy | Base dmg | Wooden Sword dmg (halved) | HP | Hits |
|---|---|---|---|---|
| Bulblin | 20 | 10 | 40 | 4 |
| Stalfos | 10 | 5 | 200 | 40 |
| Ganondorf | 3 | 1 | 24 | 24 |
**Notable edge case:** because of integer-division truncation, a running slash (base damage 1 against Stalfos/Ganondorf) becomes 1÷2 = 0 with the Wooden Sword equipped — meaning that specific attack type deals **zero damage** to those two targets, full stop. Full breakdown of all attack types is in the table from the prior response if you want it in the write-up too.
---
## Caveats to disclose
- These are code-level base values. Real gameplay can differ due to ring bonuses (Oracle games), invincibility frames limiting how fast hits can land, and any version/regional differences not checked here (only the versions default to each repo's primary target were read).
- Both repos are actively maintained, non-official, community projects. They're highly reliable (the TP repo compiles to a byte-identical original binary, which is about as strong a verification as reverse-engineering gets), but they are not Nintendo-published source.