vcbfm

Castlevania: The Adventure_恶魔城:冒险_GBC_活动块_LUA

Oct 27th, 2024
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.56 KB | None | 0 0
  1. --2024.10.27 发布pastebin
  2. --显示活动块
  3.  
  4. local spriteRamStart = 0x0
  5. local spriteRamEnd = 0x9F
  6. local spriteSize = 4
  7.  
  8. local playerTileRanges = {
  9.     {start = 0x00, endFlag = 0x49},
  10.     {start = 0x53, endFlag = 0x56},
  11.     {start = 0x7C, endFlag = 0x7C}  
  12. }
  13.  
  14. local enemyTileRanges = {
  15.     {start = 0x80, endFlag = 0xFF}
  16. }
  17.  
  18. local specialTileRanges = {
  19.     {start = 0x50, endFlag = 0x52},
  20.     {start = 0x76, endFlag = 0x77}
  21. }
  22.  
  23. local itemTileRanges = {
  24.     {start = 0x5A, endFlag = 0x5C}
  25. }
  26.  
  27. local collidedSprites = {}
  28. local function isInTileRange(tileIndex, ranges)
  29.     for _, range in ipairs(ranges) do
  30.         if tileIndex >= range.start and tileIndex <= range.endFlag then
  31.             return true
  32.         end
  33.     end
  34.     return false
  35. end
  36.  
  37. local function checkCollision(playerX, playerY, enemyX, enemyY)
  38.     return playerX < enemyX + 8 and
  39.            playerX + 8 > enemyX and
  40.            playerY < enemyY + 16 and
  41.            playerY + 16 > enemyY
  42. end
  43.  
  44. local function drawSpriteBoxes()
  45.     local playerPositions = {}
  46.     local enemyPositions = {}  
  47.     collidedSprites = {}      
  48.  
  49.     for i = 0, spriteRamEnd, spriteSize do
  50.         local y = emu.read(spriteRamStart + i, emu.memType.gbSpriteRam)
  51.         local x = emu.read(spriteRamStart + i + 1, emu.memType.gbSpriteRam)
  52.         local tileIndex = emu.read(spriteRamStart + i + 2, emu.memType.gbSpriteRam)
  53.         local attributes = emu.read(spriteRamStart + i + 3, emu.memType.gbSpriteRam)
  54.         local isBackground = attributes >= 0x80
  55.         local adjustedY = y - 16 -- 调整 Y 坐标
  56.         local adjustedX = x - 8  -- 调整 X 坐标
  57.         local isInActiveRange = adjustedX >= 0 and adjustedX <= 160 and adjustedY >= 0 and adjustedY <= 144
  58.  
  59.         if isInActiveRange then
  60.             if isInTileRange(tileIndex, playerTileRanges) then
  61.                 table.insert(playerPositions, {x = adjustedX, y = adjustedY, collided = false})
  62.                 emu.drawRectangle(adjustedX, adjustedY, 8, 16, 0x0F00FF00, false)
  63.             elseif isInTileRange(tileIndex, specialTileRanges) then
  64.                 emu.drawRectangle(adjustedX, adjustedY, 8, 16, 0x0FFF00FF, false)
  65.             elseif isInTileRange(tileIndex, itemTileRanges) then
  66.                 emu.drawRectangle(adjustedX, adjustedY, 8, 16, 0x0FFFFA00, false)
  67.             elseif isBackground then
  68.                 emu.drawRectangle(adjustedX, adjustedY, 8, 16, 0x0F0000FF, false)
  69.             elseif isInTileRange(tileIndex, enemyTileRanges) then
  70.                 table.insert(enemyPositions, {x = adjustedX, y = adjustedY, collided = false})
  71.                 emu.drawRectangle(adjustedX, adjustedY, 8, 16, 0x0FFF0000, false)
  72.             else
  73.                 emu.drawRectangle(adjustedX, adjustedY, 8, 16, 0x0FFFFF00, false)
  74.             end
  75.         end
  76.     end
  77.  
  78.     for _, player in ipairs(playerPositions) do
  79.         for _, enemy in ipairs(enemyPositions) do
  80.             if checkCollision(player.x, player.y, enemy.x, enemy.y) then
  81.                 player.collided = true
  82.                 enemy.collided = true
  83.                 table.insert(collidedSprites, {x = player.x, y = player.y})
  84.                 table.insert(collidedSprites, {x = enemy.x, y = enemy.y})
  85.             end
  86.         end
  87.     end
  88.  
  89.     for _, player in ipairs(playerPositions) do
  90.         local color = player.collided and 0x0FFF0000 or 0x0F00FF00
  91.         emu.drawRectangle(player.x, player.y, 8, 16, color, false)
  92.     end
  93.     for _, enemy in ipairs(enemyPositions) do
  94.         local color = enemy.collided and 0x0FFF0000 or 0x0FFF0000
  95.         emu.drawRectangle(enemy.x, enemy.y, 8, 16, color, false)
  96.     end
  97. end
  98.  
  99. local function drawPlayerHP()
  100.     local playerX = emu.read(0x50B, emu.memType.gbWorkRam)
  101.     local supplayerX = emu.read(0x402, emu.memType.gbWorkRam)
  102.     local playerY = emu.read(0x512, emu.memType.gbWorkRam)
  103.     local playerHP = emu.read(0x519, emu.memType.gbWorkRam)
  104.     local scrollX = emu.read(0x3D9, emu.memType.gbWorkRam)
  105.  
  106.     local hpBoxX = 0  --playerX - scrollX
  107.     if  playerX > scrollX then
  108.     hpBoxX =  playerX - scrollX
  109.     else
  110.     hpBoxX =  256-scrollX + playerX
  111.     end
  112.    
  113.     local hpBoxY = playerY - 12
  114.  
  115.     local hpText = "" .. playerHP
  116.     local charWidth = 8
  117.     local boxWidth = #hpText * charWidth + 2
  118.     local boxHeight = 10
  119.  
  120.     emu.drawRectangle(hpBoxX, hpBoxY, boxWidth, boxHeight, 0x0FFFFFFF, false)
  121.     emu.drawString(hpBoxX + 1, hpBoxY + 1, hpText, 0x0F0000FF, 0xFF000000)
  122. end
  123.  
  124. emu.addEventCallback(drawSpriteBoxes, emu.eventType.endFrame)
  125. emu.addEventCallback(drawPlayerHP, emu.eventType.endFrame)
  126.  
Tags: lua MESEN GBC
Advertisement
Add Comment
Please, Sign In to add comment