Organized the scripts, ported the snake rattle n' roll script from game resources page on tasvideos.org
This commit is contained in:
parent
965f0934e5
commit
44f64078a3
|
@ -1,324 +0,0 @@
|
|||
--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
|
||||
|
||||
]]
|
|
@ -0,0 +1,37 @@
|
|||
-- Snake Rattle N' Roll 'Simple HUD Script'
|
||||
-- Retrieved from http://tasvideos.org/GameResources/NES/SnakeRattleNRoll.html
|
||||
|
||||
dim1speed = 0
|
||||
dim2speed = 0
|
||||
xspeed = 0
|
||||
xsubspeed = 0
|
||||
yspeed = 0
|
||||
ysubspeed = 0
|
||||
xm = 0
|
||||
ym = 0
|
||||
|
||||
function stuff()
|
||||
xspeed = mainmemory.read_u8(0x417)
|
||||
xsubspeed = mainmemory.read_u8(0x419)
|
||||
if (xspeed == 255) then xspeed = -1 end
|
||||
|
||||
yspeed = mainmemory.read_u8(0x41b)
|
||||
ysubspeed = mainmemory.read_u8(0x41d)
|
||||
if (yspeed == 255) then yspeed = -1 end
|
||||
|
||||
gui.text(1 * xm,19 * ym,"L:"..mainmemory.read_u8(0x67) % 16) -- left axis
|
||||
gui.text(1 * xm,29 * ym,"R:"..mainmemory.read_u8(0x69) % 16) -- right axis
|
||||
gui.text(1 * xm,39 * ym,"H:"..mainmemory.read_u8(0x6b) % 16) -- height axis
|
||||
gui.text(30 * xm,19 * ym, "LVel:"..(xspeed * 256) + xsubspeed + (yspeed * 256) + ysubspeed)
|
||||
gui.text(30 * xm,29 * ym,"RVel:"..(xspeed * 256) + xsubspeed - (yspeed * 256) - ysubspeed)
|
||||
end
|
||||
|
||||
local function scaler()
|
||||
xm = client.screenwidth() / 256
|
||||
ym = client.screenheight() / 224
|
||||
end
|
||||
while true do
|
||||
scaler()
|
||||
stuff()
|
||||
emu.frameadvance()
|
||||
end
|
Loading…
Reference in New Issue