Claim set · data/claims/oracles.yaml

The Legend of Zelda: Oracle of Seasons and Oracle of Ages (Stewmath/oracles-disasm, US releases)

Game: The Legend of Zelda: Oracle of Seasons and Oracle of Ages.

In both US releases Link's health counts in quarter hearts, the annotators' reading in a comment that calls the starting $0c "3 hearts". The fourth Piece of Heart resets the count to 0 and gives Link a Heart Container with a parameter of 4, one heart. Link's Awakening DX also takes four pieces, but there the fourth adds a heart to a maximum kept in whole hearts and queues $40 of health in eighths, eight hearts' worth. oracles/heart-pieces

About: The Legend of Zelda: Oracle of Seasons and Oracle of Ages Health upgrade

Value
{
 "pieces": 4,
 "maxAdded": 4,
 "unit": "1/4 heart"
}
Codeoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/fileManagement.s#L389-L391initialFileVariables_standardGame: … ; 3 hearts … .db <wLinkMaxHealth,oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · data/ages/treasureCollectionBehaviours.s#L251-L254; TREASURE_HEART_PIECE (0x2b) .db <wNumHeartPieces .db $02oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · data/seasons/treasureCollectionBehaviours.s#L219-L222; TREASURE_HEART_PIECE (0x2b) .db <wNumHeartPieces .db $02oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/textbox.s#L2018-L2029@func: ld a,(wNumHeartPieces) add b add a push af sub $08 jr nz,+ ld (wNumHeartPieces),a dec a … ld (w7d0ef),aoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/textbox.s#L308-L326; You got 4 pieces of heart. That's 1 heart container .ifdef ROM_AGES … ld a,SND_FILLED_HEART_CONTAINER call playSound ld a,TREASURE_HEART_CONTAINER ld c,$04 jp giveTreasureLADX-Disassembly: Disassembly of Link's Awakening DX · src/code/entities/bank3.asm#L2922-L2937; If found 4 heart pieces… ld a, [wHeartPiecesCount] … cp $04 … ; Clear heart pieces count … ld [hl], $40 … ; Increase the maximum number of hearts ld hl, wMaxHearts … inc [hl]Checked by claude-agent, 2026-10-22 — read the standard game's starting health ($0c, commented as 3 hearts), the Piece of Heart's collection behaviour in both games' tables (mode 2, increment), the text routine that draws the pieces (pieces plus b, doubled, less 8; zero stores 0 and sets w7d0ef to $ff), and the text state that, with w7d0ef's bit 7 set and A or B pressed, gives TREASURE_HEART_CONTAINER with c = 4; then DX's Piece of Heart handler

textbox.s is shared, with an .ifdef ROM_AGES only for the message's text ID. What the Heart Container then does is heart-container. Seasons' collection table is commented less but has the same entries.

Cited by: Health upgrade, The Legend of Zelda: Oracle of Seasons and Oracle of Ages

In both US releases a Heart Container adds its parameter to Link's maximum health, 4 quarters (one heart) for every Heart Container treasure object the data defines and for the one the fourth Piece of Heart gives. It always brings a heart refill of $40, which is sixteen hearts (computed, in the quarter hearts a comment gives), capped at the maximum. Link's Awakening DX's boss container adds a heart and queues $FF of health instead. oracles/heart-container

About: The Legend of Zelda: Oracle of Seasons and Oracle of Ages Health upgrade

Value
{
 "maxAdded": 4,
 "refill": 64,
 "unit": "1/4 heart"
}
Codeoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · data/ages/treasureCollectionBehaviours.s#L246-L249; TREASURE_HEART_CONTAINER (0x2a) .db <wLinkMaxHealth .db $8aoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · data/seasons/treasureCollectionBehaviours.s#L214-L217; TREASURE_HEART_CONTAINER (0x2a) .db <wLinkMaxHealth .db $8aoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · data/ages/treasureCollectionBehaviours.s#L1-L23; b1: bit 7: Set if no sound effect should be played … ; a: Add [param] to [b0]. (Heart container) … ; c: Add [param] to [b0], using [b0+1] as a cap. (Health refill)oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · data/ages/treasureObjectData.s#L265-L268m_BeginTreasureSubids TREASURE_HEART_CONTAINER m_TreasureSubid $1a, $04, $16, $3b, TREASURE_OBJECT_HEART_CONTAINER_00 m_TreasureSubid $30, $04, … m_TreasureSubid $02, $04,oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · data/seasons/treasureObjectData.s#L230-L233m_BeginTreasureSubids TREASURE_HEART_CONTAINER m_TreasureSubid $1a, $04, $16, $3b, TREASURE_OBJECT_HEART_CONTAINER_00 m_TreasureSubid $30, $04, … m_TreasureSubid $02, $04,oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · data/ages/treasureObjectData.s#L8-L13; b1: Parameter (value of 'c' to pass to "giveTreasure")oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/treasureAndDrops.s#L115-L123call @giveTreasure ; Check if adding this item requires adding another item. push af ld hl,@extraItemsToAddTable call @findItemInTable call nz,@giveTreasureoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/treasureAndDrops.s#L199-L204; When Link obtains any item in the first column, he will obtain the item in the second ; column with the parameter in the third column. … .db TREASURE_HEART_CONTAINER TREASURE_HEART_REFILL $40oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/treasureAndDrops.s#L319-L362; [de] += c. @modea: ld a,(de) add c ld (de),a ret ; [de] += c, and [de+1] is the cap for this value. … @modec: … add c ld (de),a jr ++ … ++ cp (hl) ret c ldd a,(hl) ld (hl),aLADX-Disassembly: Disassembly of Link's Awakening DX · src/code/entities/bank3.asm#L2768-L2772; Increase max health, and fully restore health ld hl, wMaxHearts … inc [hl] … ld hl, wAddHealthBuffer … ld [hl], $FFChecked by claude-agent, 2026-10-22 — read giveTreasure_body (the extra-items table is searched after every treasure), modes a and c, both games' collection entries ($8a is mode a with the sound), and both games' Heart Container subids, whose second byte is the parameter by the file's format comment; then DX's heart container pickup

The cap is wLinkMaxHealth, the byte after wLinkHealth (include/wram.s L686-L689). Mode c plays a sound and adds nothing if health is already full, which can't happen right after the maximum rose. Which subid a boss leaves wasn't read. The refill goes straight into wLinkHealth; LA's goes through a buffer that drains over several frames.

Cited by: Health upgrade, The Legend of Zelda: Oracle of Seasons and Oracle of Ages

In both US releases what a touch does to Link comes from a collision table indexed by the enemy's collision mode. A standard enemy (Octorok's collision mode) uses the plain damage effect, which sets Link's invincibility counter to $22, so he can't be hit for 34 frames, counted one per object update. The low- and high-knockback effects set 25 and 42. Link's Awakening DX sets $50, 80 frames, on every hit. oracles/hurt-iframes

About: The Legend of Zelda: Oracle of Seasons and Oracle of Ages Invincibility frames

Value
{
 "standard": 34,
 "lowKnockback": 25,
 "highKnockback": 42,
 "ladx": 80
}
Codeoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · data/ages/objectCollisionTable.s#L14-L21; [objectCollisionTable + Enemy.enemyCollisionMode * $20 + Item.collisionType] … ; The value of the byte itself is a CollisionEffect.oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · data/ages/enemyData.s#L20/* 0x09 */ m_EnemyData $8f $90 enemy09SubidDataoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · data/seasons/enemyData.s#L13/* 0x09 */ m_EnemyData $74 $90 enemy09SubidDataoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · data/ages/objectCollisionTable.s#L97-L98; ENEMYCOLLISION_STANDARD_ENEMY (0x10)oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · data/seasons/objectCollisionTable.s#L68-L69; ENEMYCOLLISION_STANDARD_ENEMY (0x10)oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/collisionEffects.s#L468-L492; COLLISIONEFFECT_DAMAGE_LINK_LOW_KNOCKBACK collisionEffect01: ld e,LINKDMG_00 … ; COLLISIONEFFECT_DAMAGE_LINK collisionEffect02: ld e,LINKDMG_04 … ; COLLISIONEFFECT_DAMAGE_LINK_HIGH_KNOCKBACK collisionEffect03: ld e,LINKDMG_08 … call applyDamageToLink_paramEoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/collisionEffects.s#L1462-L1476; bit 5: whether to give invincibility frames … ; b1: Value to write to Object.invincibilityFrames (if applicable) … @damageTypeTable: … ; LINKDMG_00 … ; LINKDMG_04 … ; LINKDMG_08oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/collisionEffects.s#L1427-L1432; bc = invincibilityCounter inc c ldi a,(hl) bit 5,e jr z,+ ld (bc),aoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/bank0.s#L6310-L6317checkLinkVulnerable: ; Check var2a, invincibilityCounter, knockbackCounter … jr nz,checkLinkCollisionsEnabled@noCarryoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · object_code/common/specialObjects/commonCode.s#L108-L119updateLinkInvincibilityCounter: ld hl,w1Link.invincibilityCounter … ; If $80 or higher, invincibilityCounter goes up and Link doesn't flash red … ; Otherwise it goes down, and Link flashes red dec (hl)oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/specialObjects.s#L53-L56call @updateSpecialObject call updateLinkInvincibilityCounterLADX-Disassembly: Disassembly of Link's Awakening DX · src/code/entities/bank3.asm#L5347-L5348ld a, $50 … ld [wInvincibilityCounter], aChecked by claude-agent, 2026-10-22 — read Octorok's enemy data in both games (collision mode $90, the enable bit on ENEMYCOLLISION_STANDARD_ENEMY), the first byte of that row in both games' collision tables ($02, Link's column, ITEMCOLLISION_LINK = 0), collisionEffect01-03, Link's damage-type table (LINKDMG_00/04/08 give $19, $22, $2a), the write of b1 under bit 5, checkLinkVulnerable, and the counter's update; then DX's $50 store

The table's b1 bytes are $19, $22, and $2a (L1474-L1476). A value of $80 or more counts up instead, so Link stays invincible without flashing; the rows that push Link without damaging him (LINKDMG_10 to 18) use those, $f8 giving 8 frames. Link also isn't vulnerable while his knockback counter runs (knockback). updateSpecialObjects is called from updateAllObjects (bank0.s L11898-L11901); "one per frame" assumes one object update a frame, which the atlas hasn't read.

Cited by: The Legend of Zelda: Oracle of Seasons and Oracle of Ages

In both US releases the plain damage effect sets Link's knockback counter to 15 (7 and 21 for the low- and high-knockback effects), and the Steadfast Ring halves it. The counter drops by one per object update on the ground, which is a frame if the objects update once a frame (not read). While it runs Link moves at SPEED_140, 1.25 pixels a frame along one axis (computed from the speed table's comment that SPEED_100 is one pixel a frame on one axis, not diagonally), and his top-down normal state skips the d-pad. The angle is taken from the enemy toward a position for Link; that it points away from the enemy is the atlas's reading of objectGetRelativeAngleWithTempVars's header comment, and the position passed for Link wasn't traced. Link's Awakening DX's knockback countdown runs 16 frames. oracles/knockback

About: The Legend of Zelda: Oracle of Seasons and Oracle of Ages Knockback

Value
{
 "frames": 15,
 "lowKnockback": 7,
 "highKnockback": 21,
 "speedPixelsPerFrameOneAxis": 1.25,
 "ladxFrames": 16
}
Codeoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/collisionEffects.s#L1466-L1476; bit 4: whether to give knockback … ; b2: Value to write to Object.knockbackCounter (if applicable) … @damageTypeTable: … ; LINKDMG_00 … ; LINKDMG_04 … ; LINKDMG_08oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/collisionEffects.s#L1434-L1444; bc = knockbackAngle inc c ldh a,(<hFF8A) ld (bc),a ; bc = knockbackCounter inc c ldi a,(hl) bit 4,e jr z,+ ld (bc),aoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/collisionEffects.s#L330-L332ld c,a call objectGetRelativeAngleWithTempVars ldh (<hFF8A),aoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/bank0.s#L6761-L6766; @param bc YX position to get the direction toward ; @param d Current objectoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/specialObjectAnimationsAndDamage.s#L575-L580; Steadfast ring halves knockback ld a,STEADFAST_RING call cpActiveRing jr nz,+ ld l,SpecialObject.knockbackCounter srl (hl)oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · object_code/common/specialObjects/link.s#L4481-L4516linkUpdateKnockback: … ; Set c to the amount to decrement knockback by. ; $01 normally, $02 if in the air? … ; Decrement knockback sub c jr c,@cancelKnockback … ; Get speed and knockback angle (de = w1Link.knockbackAngle) … ld b,SPEED_140oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · constants/common/objectSpeeds.s#L7-L8; SPEED_100 is a speed of 1 pixel per frame, if moving directly on one axis (not ; diagonal).oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · object_code/common/specialObjects/link.s#L2769-L2770call specialObjectUpdateAdjacentWallsBitset call linkUpdateKnockbackoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · object_code/common/specialObjects/link.s#L2823-L2826ld e,SpecialObject.knockbackCounter ld a,(de) or a jp nz,func_5631oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · object_code/common/specialObjects/link.s#L2950-L2958func_5631: ld hl,wIsTileSlippery bit 6,(hl) ret zLADX-Disassembly: Disassembly of Link's Awakening DX · src/code/entities/bank3.asm#L5378-L5379ld a, $10 … ld [wIgnoreLinkCollisionsCountdown], aLADX-Disassembly: Disassembly of Link's Awakening DX · src/code/bank2.asm#L588-L614func_002_44C2:: ld a, [wIgnoreLinkCollisionsCountdown] … ret z … dec a … call UpdateFinalLinkPosition … pop af … jp ApplyLinkMotionStateChecked by claude-agent, 2026-10-22 — read the damage-type rows' b2 bytes ($07, $0f, $15), the angle stored with them (objectGetRelativeAngleWithTempVars with d the enemy and bc a position for Link), the Steadfast Ring branch in linkApplyDamage, linkUpdateKnockback, the speed table's header, and the top-down normal state, which calls linkUpdateKnockback and then, on the ground with the counter nonzero, jumps to func_5631 and returns before the direction and walking code; then DX's knockback setup and countdown

In the air the counter drops by 2 an update, and when wLinkInAir's bit 7 is set knockback is cancelled. func_5631 copies the knockback angle into Link's angle on a slippery tile and does nothing else. The sidescrolling state calls linkUpdateKnockback too (link.s L3777) but wasn't read past that call. Link's position argument is hFF8C/hFF8D.

Cited by: The Legend of Zelda: Oracle of Seasons and Oracle of Ages

In both US releases a killed enemy's byte in itemDropTables picks a chance and a drop set, and two random values decide the drop. The first picks one bit of a 64-bit chance mask (computed, 1 in 16 to always); the second picks one of the set's 32 entries, which Seasons first maps through a Subrosia set when Link is in Subrosia. A drop Link can't use yet, such as bombs or seeds he hasn't found, becomes no drop. An Octorok drops something 24 times in 64; its set holds 16 hearts, 12 single rupees, and 4 five-rupee pieces. oracles/drops

About: The Legend of Zelda: Oracle of Seasons and Oracle of Ages Item drop table

Value
{
 "chanceIn64": [
  4,
  4,
  8,
  16,
  24,
  32,
  48,
  64
 ],
 "setSize": 32,
 "octorok": {
  "chanceIn64": 24,
  "heart": 16,
  "rupee1": 12,
  "rupee5": 4
 }
}
Codeoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · object_code/common/parts/enemyDestroyed.s#L28-L31xor a call decideItemDrop jp z,partDelete ld b,PART_ITEM_DROPoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/treasureAndDrops.s#L761-L811; Decides what an enemy will drop. … decideItemDrop_body: … ; If parameter == 0, assume it's an enemy; use the enemy's ID for the drop table. … ld hl,itemDropTables … ld hl,itemDropProbabilityTable … call getRandomNumber and $3f call checkFlag … ld hl,itemDropSetTable … call getRandomNumber and $1f rst_addAToHloracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/treasureAndDrops.s#L813-L845; Checks whether an item drop of a given type can spawn. … ; @param[out] c $ff if item cannot spawn (Link doesn't have it), otherwise the item itself … .ifdef ROM_SEASONS ; different drop table for subrosiaoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/treasureAndDrops.s#L894-L920; Byte 1: Value to AND with that variable to check availability; if nonzero, the item ; can drop. itemDropAvailabilityTable: … ; ITEM_DROP_HEART … ; ITEM_DROP_1_RUPEE … ; ITEM_DROP_5_RUPEESoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · include/wram.s#L421-L423wc608: ; $c608 ; This is always 1. Used as a dummy value in various places?oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/treasureAndDrops.s#L923-L956; Each entry in this table is a bitset. A random bit is chosen. If the bit is 0, no item drops. itemDropProbabilityTable: … @probability0: @probability1: … @probability7:oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/treasureAndDrops.s#L1061-L1065itemDropSetE:oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/treasureAndDrops.s#L1073-L1081; Bits 5-7: Index for itemDropProbabilityTable ; Bits 0-4: Index for itemDropSetTable ; Or it can be $ff for no item drop. ; Comments show changes in Seasons itemDropTables: .ifdef ROM_AGESoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/treasureAndDrops.s#L1098-L1100.elseoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · constants/common/enemies.s#L39.define ENEMY_OCTOROK $09oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · constants/common/itemDrops.s#L4-L8ITEM_DROP_FAIRY db ; $00 ITEM_DROP_HEART db ; $01 ITEM_DROP_1_RUPEE db ; $02 ITEM_DROP_5_RUPEES db ; $03Checked by claude-agent, 2026-10-22 — read decideItemDrop_body through checkItemDropAvailable_body, the availability and chance tables, and counted the set bits in each chance mask (4, 4, 8, 16, 24, 32, 48, 64). Octorok is enemy $09; byte 9 of itemDropTables is $8e in both games' rows (L1081, L1100): chance index 4 (24 bits) and set $0e, whose 32 entries are 16 of $01, 12 of $02, and 4 of $03

A table value of $ff drops nothing. Hearts, rupees, and fairies check wc608, which is always 1, so they always pass. Ore chunks drop only in Seasons and only in Subrosia (minimap group 1), through the 16-entry Subrosia set; ITEM_DROP_0a and 0b never pass. A nonzero parameter (breakable tiles, for one) indexes the table's second half. Link's Awakening has no drop claim yet.

Cited by: The Legend of Zelda: Oracle of Seasons and Oracle of Ages

In both US releases a hit copies the enemy's damage value to Link as a negative number, and Link's one active ring changes it: Power Rings L1–L3 add 2, 4, and 8 units, Armor Rings L1–L3 take 1, 2, and 3 off, the Blue Ring halves it with an arithmetic shift that rounds toward more damage (3 units become 2), the Green Ring takes three quarters (rounded toward less damage), and the Cursed Ring doubles it. A hit always costs at least one unit, and the Protection Ring makes every hit 8. Health then drops a quarter heart per 2 units, so a unit is an eighth of a heart (computed, from the quarter hearts a comment gives). Link's Awakening DX's health is in eighths by its annotators' comment ($08 = 1 heart), and its Blue Tunic also halves damage. oracles/ring-damage

About: The Legend of Zelda: Oracle of Seasons and Oracle of Ages Damage formula

Value
{
 "powerRing": [
  2,
  4,
  8
 ],
 "armorRing": [
  -1,
  -2,
  -3
 ],
 "blueRing": 0.5,
 "greenRing": 0.75,
 "cursedRing": 2,
 "protectionRing": 8,
 "minimum": 1,
 "unit": "1/8 heart"
}
Codeoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/collisionEffects.s#L1407-L1415bit 7,(hl) jr z,++ ldh a,(<hActiveObjectType) add Object.damage ld e,a ld a,(de) ld c,Item.damageToApply ld (bc),aoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · include/wram.s#L789-L791wActiveRing: ; $c6cb/$c6c5 ; When bit 6 is set, the ring is disabled?oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/specialObjectAnimationsAndDamage.s#L462-L542; Updates Link's damageToApply variable to account for damage-modifying rings. … ld a,(wActiveRing) … ; Cursed ring: damage *= 2 … ; Blue ring: damage /= 2 … ; Green ring: damage *= 0.75 … @writeDamageToApply: bit 7,a jr nz,+ ld a,$ff … ; This is a table of values to add to any amount of damage that Link takes. @ringDamageModifierTable: .db POWER_RING_L1 $fe .db POWER_RING_L2 $fc .db POWER_RING_L3 $f8 .db ARMOR_RING_L1 $01 .db ARMOR_RING_L2 $02 .db ARMOR_RING_L3 $03oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/specialObjectAnimationsAndDamage.s#L556-L561; Protection ring does fixed damage on each hit ld b,a ld a,PROTECTION_RING call cpActiveRing jr nz,+ ld b,$f8oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/specialObjectAnimationsAndDamage.s#L582-L599ld hl,wLinkHealth … ; Apply the damage (finally update wLinkHealth) ld a,(de) -- dec (hl) add $02 jr nc,-- ld (de),aoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · object_code/common/specialObjects/commonCode.s#L100-L104updateLinkDamageTaken: callab bank6.linkUpdateDamageToApplyForRings linkApplyDamage_b5: callab bank6.linkApplyDamageoracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm) · code/fileManagement.s#L390.db <wLinkHealth, $0c ; 3 heartsLADX-Disassembly: Disassembly of Link's Awakening DX · src/code/entities/bank3.asm#L5322-L5325; If using the Blue Tunic, take half damages ld a, [wTunicType] … cp TUNIC_BLUE … jr z, .takeHalfDamagesLADX-Disassembly: Disassembly of Link's Awakening DX · src/constants/memory/wram.asm#L3382-L3384; Amount of health ($08 = 1 heart) wHealth::Checked by claude-agent, 2026-10-22 — read the damage copy in applyDamageToLink (b0 bit 7), linkUpdateDamageToApplyForRings (the table is added to the negative damage; the Green Ring path negates, multiplies by 3, shifts right twice, and negates back), linkApplyDamage's Protection Ring branch and health loop (one `dec` of wLinkHealth per `add $02` until the sum carries, so -8 takes 4 quarters), and the two callers in commonCode.s; then DX's tunic test and health unit

An odd amount rounds up to a whole quarter and leaves +1 in w1Link.health, which the next hit's damage is added to. The Protection Ring's 8 replaces the ring-modified amount, since linkApplyDamage runs after the modifier. Where each enemy's Object.damage comes from wasn't read.

Cited by: The Legend of Zelda: Oracle of Seasons and Oracle of Ages