BizHawk/output/Lua/PCE/Castlevania_Rondo_of_Blood.lua

324 lines
8.2 KiB
Lua

--Castlevania: Rondo of Blood
fill = 0x64FFC8C8
line = 0xFFFFC8C8
function drawObjInfo()
for i = 0,88 do
objX = mainmemory.read_u8(0xBC8+i)
objY = mainmemory.read_u8(0xCD0+i)
objVisibleX = mainmemory.read_u8(0xB70+i)*255
objVisibleY = mainmemory.read_u8(0xC78+i)*255
objDamage = mainmemory.read_u8(0x1300+i) --how much damage it will do if it collides with you
objHealth = mainmemory.read_u8(0x12A8+i-2) --something is wrong, -2 makes it right in some cases but makes others wrong
objStatus = mainmemory.read_u8(0x1250+i) --collision status
adjustedX = objX - objVisibleX
adjustedY = objY - objVisibleY
--clipping
if(adjustedX > 0 and adjustedY > 0) then
gui.text(
adjustedX * xmult,
adjustedY * ymult,
objX
.. " " .. objY
-- .. " " .. "#" .. i
-- .. " D" .. objDamage
-- .. " HP" .. objHealth
-- .. " S" .. objStatus
)
end
end
end
function drawHitBoxes()
for i = 0,88 do
objX = mainmemory.read_u8(0xBC8+i)
objY = mainmemory.read_u8(0xCD0+i)
objVisibleX = mainmemory.read_u8(0xB70+i)*255
objVisibleY = mainmemory.read_u8(0xC78+i)*255
adjustedX = objX - objVisibleX
adjustedY = objY - objVisibleY
objOffsetX = mainmemory.read_u8(0x1930+i)
objDirection = mainmemory.read_u8(0xAC0+i)
objUnknownY = mainmemory.read_u8(0x19E0+i)
hitSizeX = mainmemory.read_u8(0x1988+i)
hitSizeY = mainmemory.read_u8(0x1A38+i)
if(objDirection == 1) then --9484
objOffsetX = bit.bxor(0xFF,objOffsetX) --9488
objOffsetX = objOffsetX+1 --948A
end
off00 = 0 --942B
if (bit.band(0x80, objOffsetX) == 128) then --942F
of00=bit.band(0xFF,(off00-1)) --9431
end
hitBoxCornerX = bit.band(0xFF,(objX + objOffsetX)) --9434
hitBoxCornerY = bit.band(0xFF,(objY + objUnknownY)) --944F
objStatus = mainmemory.read_u8(0x1250+i)-- generally: 0 inert, 1 benign, 2 damageable/possibly damaging
if(objStatus == 0) then
fill = 0x600000FF
line = 0xC0000000
elseif(objStatus == 1) then
fill = 0x3C00FF00
line = 0x8000FF00
elseif(objStatus == 2) then
fill = 0x50FF0000
line = 0x80FF0000
end
--clipping
if(adjustedX > 0 and adjustedY > 0) then
gui.drawBox(
hitBoxCornerX-hitSizeX,
hitBoxCornerY+hitSizeY,
hitBoxCornerX+hitSizeX,
hitBoxCornerY-hitSizeY,
line,
fill
)
end
end
end
function dispProperties(num)
fill = 0x80FFC8C8
ObjDamageInfo = {
0x13b0,--5 means is being damaged
0x1a90,--invulnerability countdown
0xf90,--if 0, animate. seems to be used as a counter to temporarily freeze objs when damaged
0xb18,--flashing if equal to 0x10, white if equal to 0x86
0x1ae8,
0x1f18,
0x11f8,
0x12a8--health
}
for i = 1,8 do
gui.text((10+(i*20)) * xmult ,100 * ymult, mainmemory.read_u8(ObjDamageInfo[i]+num))
end
hitBoxInfo = {
0x1988,
0x1A38,
0x1930,
0xAC0
}
for i = 1,4 do
gui.text((10+(i*20)) * xmult,120 * ymult, mainmemory.read_u8(hitBoxInfo[i]+num))
end
ObjPositionInfo = {
0xB70, --offscreen or not
0xBC8, --x position
0xC20,
0xC78,
0xCD0, --y position
0xD28,
}
for i = 1,6 do
gui.text((10+(i*20)) * xmult,140 * ymult, mainmemory.read_u8(ObjPositionInfo[i]+num))
end
collisionInfo = {
0x710, --compensated x
0x720, --compensated y
0x730 --compensated "visible"
}
for i = 1,3 do
gui.text((10+(i*20)) * xmult,160 * ymult, mainmemory.read_u8(collisionInfo[i]+num))
end
end
while true do
--Multiplier for text rendering
xmult = client.screenwidth() / 256
ymult = client.screenheight() / 225
line = 0xFFFFC8C8
--display info about a given object
--dispProperties(0)
drawHitBoxes()
drawObjInfo()
emu.frameadvance()
--invincibility cheat
-- memory.writebyte(0x13B0, 0)
end
--[[ Notes
--Object Damage
A1ED LDY $33B0,X ;"can damage"
A1F0 LDA $A26D,Y
A1F3 STA $3A90,X ;invulnerability countdown
A1F6 LDA $A27D,X
A1F9 STA $2F90,X ;whether to animate the obj or not
A1FC LDA $2B18,X ;flashing or not
A1FF STA $3AE8,X
A202 LDA #$86 ;make the palette white
A204 STA $2B18,X
A207 LDA $3F18,X
A20A ORA #$03
A20C STA $31F8,X
A20F LDA $32A8,X
A212 SEC
A213 SBC $00 ;subtract the amount of damage to do
A215 STA $32A8,X ;x is the object slot to modify
--Where the player's health is decremented
A1F2 LDA $33B0 ;check if the player is vulnerable
A1F5 BEQ $A234
A1F7 LDA $33B0
A1FA bit.band #$07
A1FC CMP #$05
A1FE BNE $A20B
A200 LDA $36D3
A203 BNE $A20B
A205 STZ $33B0
A20B LDA $98 ;player health
A20D SEC
A20E SBC $32A8 ;subtract amount of damage received
A211 STA $98
--Where the damage received (32A8) is set
9546 STA $33B0,X
9549 LDA $33B0
954C BNE $955A
954E LDA $3358,X
9551 STA $33B0
9554 LDA $3300,X ;the amount of damage an object will deal to you
9557 STA $32A8
--Where the hitbox offset is calculated
9413 LDX #$00
9415 LDA $3250,X ;load the hitbox type
9418 BEQ $9460 ;we quit if type 0
941A LDA $3930,X ;x offset
941D STA $01 ;store it in 01
941F LDA $2AC0,X ;direction facing, left is 1, right is 0
9422 BEQ $942B ;we are facing...
9424 LDA $01 ;left, load offset
9426 EOR #$FF
9428 INC
9429 STA $01 ;store the altered offset
942B STZ $00
942D LDA $01 ;get the either altered or unaltered offset
942F BPL $9433
9431 DEC $00
9433 CLC
9434 ADC $2BC8,X ;add x position to either altered or unaltered offset
9437 STA $2710,X ;store that as the hitbox corner
943A LDA $2B70,X ;is the object visible
943D ADC $00 ;correct it depending on the altered x offset
943F STA $2730,X
9442 STZ $00
9444 LDA $39E0,X
9447 BPL $944B
9449 DEC $00
944B LDA $2CD0,X ;y position
944E CLC
944F ADC $39E0,X
9452 STA $2720,X ;store hitbox y corner
9455 LDA $2C78,X ;indicator that the object is y visible
9458 ADC $00
945A ORA $2730,X
945D STA $2730,X
9460 INX
9461 CPX #$10 ;we can only do 16 objects
9463 BCC $9415 ;start again if we have objects left
9465 RTS
9466 STZ $33B0,X ;zero the "can damage" byte
9469 LDA $3250,X ;objStatus / collision status
946C BNE $9471 ;if the status is 0 we continue
946E JMP $9507 ;otherwise we quit
--X and Y represent our two objects
9471 LDA $3988,X ;x hitbox size
9474 ORA $3A38,X ;y hitbox size
9477 BNE $947C
9479 JMP $9507
947C LDA $3930,X ;x offset
947F STA $01
9481 LDA $2AC0,X ;objDirection
9484 BEQ $948D ;branch if we are facing right
9486 LDA $01 ;left
9488 EOR #$FF
948A INC
948B STA $01
948D STZ $00 ;right, zero our temp byte
948F LDA $01 ;load the possibly manipulated offset
9491 BPL $9495
9493 DEC $00
9495 CLC
9496 ADC $2BC8,X ;add object x position to the possibly manipulated offset
9499 STA $26FF
949C LDA $2B70,X ;objVisibleX
949F ADC $00
94A1 BNE $9507 ;quit if the result is non-zero
94A3 STZ $00
94A5 LDA $39E0,X ;y related
94A8 BPL $94AC
94AA DEC $00
94AC CLC
94AD ADC $2CD0,X ;obj y position
94B0 STA $2700
94B3 LDA $2C78,X ;objVisibleY
94B6 ADC $00
94B8 BNE $9507
94BA LDA $3250,X ;objStatus / collision status
94BD BPL $94C2
94BF CLY
94C0 BRA $94C4
94C2 LDY #$0F ;16 objects max
94C4 LDA $3250,Y ;objStatus / collision status
94C7 BEQ $9504 ;if objStatus is zero, go to the next object
94C9 LDA $2730,Y ;compensated "visible"
94CC BNE $9504
94CE LDA $3988,X ;x hitbox size of 1st object
94D1 CLC
94D2 ADC $3988,Y ;x hitbox size of 2nd object
94D5 STA $2701
94D8 LDA $3A38,X ;y hitbox size of 1st object
94DB CLC
94DC ADC $3A38,Y ;y hitbox size of 2nd object
94DF STA $2702
94E2 LDA $26FF
94E5 SEC
94E6 SBC $2710,Y ;subtract compensated x position for the current object
94E9 BCS $94EE
94EB EOR #$FF
94ED INC
94EE CMP $2701
94F1 BCS $9504
94F3 LDA $2700
94F6 SEC
94F7 SBC $2720,Y ;subtract compensated y position for the current object
94FA BCS $94FF
94FC EOR #$FF
94FE INC
94FF CMP $2702
9502 BCC $9508
9504 DEY
9505 BPL $94C4
9507 RTS
]]