Claim set · data/claims/draculas-curse.yaml

Castlevania III - Dracula's Curse (USA), read through vinheim3's disassembly and the ROM

Game: Castlevania III: Dracula's Curse.

Dracula's Curse keeps Castlevania's jump for every character but Grant; the take-off starts the arc at entry 9 of a longer table whose entries from there are Castlevania's 20 rises, 5, 5, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 1, 0, 1, 0, 0, 0, and 0 px, and the 8 entries before it, 6 then 5 px, carry a fall below the take-off height down to 6 px/frame, where Castlevania falls at 8 px/frame once its table runs out. draculas-curse/jump-table

About: Castlevania III: Dracula's Curse Jump

Value
{
 "start": 9,
 "steps": [
  5,
  5,
  3,
  3,
  3,
  3,
  3,
  2,
  2,
  2,
  1,
  1,
  1,
  1,
  0,
  1,
  0,
  0,
  0,
  0
 ],
 "before": [
  6,
  6,
  6,
  6,
  6,
  5,
  5,
  5
 ],
 "maxFall": 6
}
Codecastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1c.s#L3740-L3751playerState06_jumpStart_exceptGrant: … lda #$09 … sta $05d8, xcastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1c.s#L4187-L4225 — each frame the entry at the index is the vertical speed: up while rising, then at $81 a turn, then back down the table negated; at the $80 marker the entry after it, heldlda $9874, y … cmp #$81 … sta wEntityVertSpeed.w, x … inc $05d8, x … cmp #$80 … dec $05d8, x … eor #$ff … lda $9875, ycastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1c.s#L3242-L3250processTrevorState: … .dw playerState06_jumpStart_exceptGrant … .dw playerState08_jumping_exceptGrantcastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1c.s#L4751-L4759processSyphaState: … .dw playerState06_jumpStart_exceptGrantcastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1d.s#L918-L927processAlucardState: … .dw playerState06_jumpStart_exceptGrantcastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1c.s#L4784-L4792processGrantState: … .dw playerState06_jumpStart_grant … .dw playerState08_jumping_0c_grantCastlevania III - Dracula's Curse (USA) · 0x39884-0x398A1 — bank $1C $9874-$9891: $80, five $FA (−6), five $FB (−5), five $FD, three $FE, four $FF, $00, $FF, four $00, and $81; the disassembly lists these bytes partly as instructionsCastlevania (USA) (Rev 1) · 0x19B9D-0x19BB4 — Castlevania's table of 20 steps (castlevania/jump-table)Castlevania (USA) (Rev 1) · 0x19B53-0x19B6E — Castlevania's 8 px fall past the table (castlevania/table-end-fall)Checked by claude, 2026-10-21 — read the disassembly at the pinned commit and checked its jump-start bytes in the ROM (bank $1C $961D); read both tables' bytes in the pinned ROMs

The disassembly names the state "exceptGrant"; Grant's state table points at a jump of his own (grant-jump). Index 0 is $80, 1-5 are $FA, and 6-10 are $FB, so entry 9 is the fourth $FB and the rise is the 20 entries 9 to 28. Not measured.

Cited by: Castlevania, Castlevania III: Dracula's Curse, Gravity, Jump, Variable jump height

In Dracula's Curse the take-off shared by every character but Grant (the state tables the disassembly labels Trevor's, Sypha's, and Alucard's all point at it; Grant's has its own) sets the horizontal speed to 1 px/frame toward a held Left or Right, or 0, as in Castlevania. draculas-curse/air-direction

About: Castlevania III: Dracula's Curse Air control

Value: 1 px/frame

Codecastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1c.s#L3740-L3781playerState06_jumpStart_exceptGrant: … B28_1622: lda wJoy1ButtonsPressed ; a5 28 B28_1624: sta $10 ; 85 10 … B28_1637: lda $10 ; a5 10 B28_1639: lsr a ; 4a B28_163a: bcs B28_1644 ; b0 08 B28_163c: lsr a ; 4a B28_163d: bcs B28_164f ; b0 10 … B28_163f: lda #$00 ; a9 00 …castlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/bank1f.s#L344-L356 — $28 holds every button read this frame, not only new presses ($26)@setButtonVars: lda wTempJoy1ButtonsPressedPass1, x tay … sty wJoy1ButtonsPressed, xcastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1c.s#L1826-L1854B28_0a91: ldy wCurrPlayer.w ; ac 4e 05 … B28_0a9c: jsr processAlucardState ; 20 a8 a5 … B28_0aa2: jsr processTrevorState ; 20 7b 93 … B28_0ab0: jsr processSyphaState ; 20 fc 9b … B28_0ab6: jsr processGrantState ; 20 3b 9ccastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1c.s#L3242-L3249processTrevorState: … .dw playerState06_jumpStart_exceptGrantcastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1c.s#L4751-L4758processSyphaState: … .dw playerState06_jumpStart_exceptGrantcastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1d.s#L918-L926processAlucardState: … .dw playerState06_jumpStart_exceptGrantcastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1c.s#L4784-L4791processGrantState: … .dw playerState06_jumpStart_grantCastlevania (USA) (Rev 1) · 0x19411-0x1944B — Castlevania's take-off copying the held Left and Right into Simon's direction (castlevania/jump-start)Checked by claude, 2026-10-25 — read playerState06_jumpStart_exceptGrant (161D-165F): it copies $28 to $10 and shifts out bit 0, then bit 1, storing speed $01, $FF, or $00 with subspeed 0. pollInputs (bank1f) rolls the eight reads into $28 last-first, so bits 0 and 1 are the last two reads, Right and Left. The state tables at 3242, 4751, and b1d 918 point state 06 here; Grant's (4784) points at its own routine

The jumping state shares its code with the falling state (playerState0c_falling_exceptGrant), whose button reads are B and Up; the atlas hasn't traced every routine it calls for a Left or Right read.

Cited by: Air control, Castlevania III: Dracula's Curse

In the air, a held Left or Right sets Grant's horizontal speed to 1 px/frame that way and turns him; with neither held the code leaves the speed as it was, so he keeps moving, until a wall stops him. draculas-curse/grant-air

About: Castlevania III: Dracula's Curse Air control

Value: 1 px/frame

Codecastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1c.s#L5156-L5172 — the take-off zeroes his horizontal speedplayerState06_jumpStart_grant: … sta wEntityHorizSubSpeed.w … sta wEntityHorizSpeed.wcastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1c.s#L5261-L5329playerState08_jumping_0c_grant: … ; left held … lda #$ff … sta wEntityHorizSpeed.w … ; right held … lda #$01 … sta wEntityHorizSpeed.w … ; nothing above pressed/heldcastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1c.s#L5344-L5380 — with no direction held, the speed is only zeroed when a wall tile is found beside him; nothing above pressed/held … lda wEntityHorizSpeed.w … jsr getCollisionTileValueAtPlayerXYOffsetAX … lda #$00castlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1d.s#L1-L4sta wEntityHorizSpeed.wChecked by claude, 2026-10-21 — read the disassembly at the pinned commit

Not measured. A standing jump stays vertical until a direction is pressed.

Cited by: Air control, Castlevania III: Dracula's Curse, Partner character

Grant's jump reads its own table from entry 30, one entry a frame while A is held; once A is up during the rise, or once he falls, the routine moves two entries a frame, so letting go shortens the rise, from 58 px held to the top to 30 px with A up on the first frame, by the table. draculas-curse/grant-jump

About: Castlevania III: Dracula's Curse Variable jump height

Value
{
 "start": 30,
 "held": 58,
 "released": 30
}
Codecastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1c.s#L5156-L5172 — the table index starts at 30, and the step (a reused variable) at 1lda #$1e … sta $05d8 … lda #$01 … sta wPixelsToWalkToStairs.wcastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1d.s#L128-L141 — falling, or A ($80) up during the rise, sets the step to 2lda wEntityPhase.w … lda $9d … lda wJoy1ButtonsPressed … and #$80 … inc $9d … lda #$02 … sta wPixelsToWalkToStairs.wcastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1d.s#L154-L213 — the entry is the vertical speed; the index moves by the step, up to 57 rising and down to 0 fallinglda $9e58, y … cmp #$81 … sta wEntityVertSpeed.w … adc wPixelsToWalkToStairs.w … cmp #$39 … sbc wPixelsToWalkToStairs.w … eor #$ffCastlevania III - Dracula's Curse (USA) · 0x39E68-0x39EA1 — bank $1C $9E58-$9E91: $80, nineteen $F9 (−7), six $FA, five $FB, five $FC, six $FD, five $FE, five $FF, five $00, and $81Checked by claude, 2026-10-21 — read the disassembly at the pinned commit and the table's bytes in the pinned ROM; summed the entries visited from 30 at one and at two a frame

Not measured. From entry 30 the held rise is 5 + 4×5 + 3×6 + 2×5 + 1×5 = 58 px; with A up from the first frame it reads entries 30, 32, … 56, 30 px. A fractional index accumulator stays at 0 here. The fall reads every other entry and then holds at 7 px/frame.

Cited by: Castlevania III: Dracula's Curse, Partner character, Variable jump height

Dracula's Curse turns a hit into a launch, where Castlevania steps a second table; the character is given 2 px/frame up and 1 px/frame sideways and faces opposite to that push (facing left with +1 speed when $90 is nonzero, else facing right with −1), and the hurt state adds 0.125 px/frame² of gravity each frame up to a 5 px/frame fall. draculas-curse/knockback

About: Castlevania III: Dracula's Curse Knockback

Value
{
 "up": 2,
 "back": 1,
 "gravity": 0.125,
 "maxFall": 5
}
Codecastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1c.s#L326-L349lda #$26 … sta wPlayerStateDoubled.w … lda #$fe … sta wEntityVertSpeed.w … lda $90 … sta wEntityFacingLeft.w … lda #$01 … lda #$ff … sta wEntityHorizSpeed.wcastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1c.s#L4182-L4185 — the arc routine's first lines; in the ROM the next bytes are beq $9892, which the disassembly keeps as raw byteslda wPlayerStateDoubled.w … cmp #$26Castlevania III - Dracula's Curse (USA) · 0x398A2-0x398CE — bank $1C $9892-$98BE: vertical sub-speed + $20, carried into the speed; a falling speed capped at 5.0Castlevania (USA) (Rev 1) · 0x196E1-0x1972C — Castlevania's hit, which points the arc at a second table (castlevania-line/knockback)Checked by claude, 2026-10-21 — read the disassembly at the pinned commit and disassembled the hurt state's gravity in the pinned ROM

Which side $90 records hasn't been traced; by Castlevania's rule it would push the character away from the enemy. Not measured.

Cited by: Castlevania III: Dracula's Curse, Knockback

A hit in Dracula's Curse sets $80 to 120, which the player's update counts down once a frame while flickering the character; one branch of the hit handling returns at once while $80, or $AD, is nonzero. draculas-curse/i-frames

About: Castlevania III: Dracula's Curse Invincibility frames

Value: 120 frames

Codecastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1c.s#L298-L299lda #$78 … sta $80castlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1c.s#L166-L176lda $80 … dec $80 … ldy #$80 … lda wGameStateLoopCounter … and #$01 … sty wEntityState.wcastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1c.s#L257-L259lda $80 … ora $ad … bne B28_012bChecked by claude, 2026-10-21 — read the disassembly at the pinned commit

Reading $80 as invincibility is an interpretation. The early return at L257-L259 is reached only when $81 AND $F0 is nonzero; contact codes $0D and $0E are handled before it, and $AD also gates it. $80 is set to 120 in two places in the hit code (L298 and L326). Not measured.

Cited by: Castlevania III: Dracula's Curse, Invincibility frames

Dracula's Curse keeps two character slots; a swap flips the slot index with XOR 1 and loads that slot's character, one of four ids, Trevor, Sypha, Grant, and Alucard. draculas-curse/partners

About: Castlevania III: Dracula's Curse Partner character

Codecastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · include/wram.s#L360-L364wUsableChars: ; $39 … dsb 2 … wCurrCharacterIdx: ; $3bcastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/bank00.s#L2217-L2222lda wCurrCharacterIdx … eor #$01 … sta wCurrCharacterIdx … lda wUsableChars.w, y … sta wCurrPlayer.wcastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · constants/playerStates.s#L1-L4.define PLAYER_TREVOR $00 … .define PLAYER_ALUCARD $03Checked by claude, 2026-10-21 — read the disassembly at the pinned commit

The atlas hasn't traced which button starts the swap, or what fills each slot.

Cited by: Partner character

Dracula's Curse prices its subweapons from one table of eleven entries, nine at 1 heart, one at 5, and one at 0; a use compares the heart count with the price, and a thrown one subtracts it in BCD. draculas-curse/hearts

About: Castlevania III: Dracula's Curse Weapon energy

Value
[
 1,
 1,
 1,
 1,
 1,
 1,
 1,
 1,
 1,
 0,
 5
]
Codecastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1d.s#L4099-L4111lda wNumHearts … cmp $bab6, y … lda $bab6, y … jmp $e753Castlevania III - Dracula's Curse (USA) · 0x3BAC6-0x3BAD1 — bank $1D $BAB6-$BAC1, the prices for subweapons 1 to 11 after a 0 for nonecastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/bank1f.s#L1151-L1155jsr $8c2fcastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/bank00.s#L603-L625 — a BCD subtraction from the heart countlda wNumHearts … and #$0f … sbc $00 … sbc #$06 … sbc #$10 … sta wNumHeartsChecked by claude, 2026-10-21 — read the disassembly at the pinned commit and the table's bytes in the pinned ROM

The disassembly names only subweapon 3, the dagger, so the 5-heart and free entries aren't named here.

Cited by: Castlevania III: Dracula's Curse, Weapon energy

Dracula's Curse moves a character on stairs in steps; each step sets the speed to 0.5 px/frame across and 0.5 px/frame up or down the stairs, and the climbing state counts 15 frames before the step ends. draculas-curse/stairs

About: Castlevania III: Dracula's Curse Stairs

Value
{
 "speed": 0.5,
 "frames": 15
}
Codecastlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1c.s#L4686-L4742 — the speeds for the four directions, $00.$80 (0.5) or $FF.$80 (−0.5) on each axis; the faster table above them is a romhack option, off in a plain buildlda playerStairsMovementSpeeds.w, y … sta wEntityHorizSpeed.w … sta wEntityVertSubSpeed.w … lda playerStairsPixelsToStep.w … sta wPixelsToWalkToStairs.w … .db $0f … .else … .db $00 $80 $00 $80 … .db $ff $80 $ff $80castlevania3-disasm: a disassembly of Castlevania III: Dracula's Curse · code/playerStateProcessing_b1c.s#L4526-L4541playerState14_stairClimb: … lda wPixelsToWalkToStairs.w … beq B28_1af0 … dec wPixelsToWalkToStairs.wChecked by claude, 2026-10-21 — read the disassembly at the pinned commit

15 frames at 0.5 px/frame is 7.5 px on each axis; whether the step's end frame moves too, making 8, hasn't been measured.

Cited by: Castlevania III: Dracula's Curse, Stairs