├── Watches ├── AlucardEntity.wch ├── TImeAttack.wch ├── Game.wch └── Alucard.wch ├── LICENSE ├── Scripts ├── SOTN_Average_Speed.lua ├── SOTN_Strings.lua ├── SOTN_Life_Drain.lua └── SOTN_Life_Drain_Biz28.lua └── README.md /Watches/AlucardEntity.wch: -------------------------------------------------------------------------------- 1 | SystemID PSX 2 | 0733D8 d 3 0 MainRAM Screen Xpos 3 | 0733DC d 3 0 MainRAM Screen Ypos 4 | 0733E0 d 3 0 MainRAM Acceleration X 5 | 0733E4 d 3 0 MainRAM Acceleration Y 6 | 0733E8 d 3 0 MainRAM unk1 7 | 0733EC w u 0 MainRAM Facing 8 | 0733EE w u 0 MainRAM Palette 9 | 0733F0 b u 0 MainRAM Blend Mode 10 | 0733F6 w u 0 MainRAM Poly Rotation Angle 11 | 0733F8 w u 0 MainRAM Poly Origin X 12 | 0733FA w u 0 MainRAM Poly Origin Y 13 | 0733FC w u 0 MainRAM zPriority 14 | 0733FE d s 0 MainRAM ObjectId 15 | 073404 w u 0 MainRAM Step 16 | 073406 w u 0 MainRAM Step 2 17 | 07340A w u 0 MainRAM ObjectRoomIndex 18 | 073416 w s 0 MainRAM Hit Points 19 | 073418 w u 0 MainRAM Damage 20 | 07341A w u 0 MainRAM Damage Type 21 | 07341E b u 0 MainRAM HitboxWidth 22 | 07341F b u 0 MainRAM HitboxHeight 23 | 24 | -------------------------------------------------------------------------------- /Watches/TImeAttack.wch: -------------------------------------------------------------------------------- 1 | SystemID PSX 2 | 03CA28 d h 0 MainRAM Dracula 1 3 | 03CA2C d h 0 MainRAM Olrox 4 | 03CA30 d h 0 MainRAM Doppleganger 10 5 | 03CA34 d h 0 MainRAM Granfaloon 6 | 03CA38 d h 0 MainRAM Minotaur & Werewolf 7 | 03CA3C d h 0 MainRAM Scylla 8 | 03CA40 d h 0 MainRAM Slogra & Gaibon 9 | 03CA44 d h 0 MainRAM Hippogryph 10 | 03CA48 d h 0 MainRAM Beelzebub 11 | 03CA4C d h 0 MainRAM Succubus 12 | 03CA50 d h 0 MainRAM Karasuman 13 | 03CA54 d h 0 MainRAM Trio 14 | 03CA58 d h 0 MainRAM Death 15 | 03CA5C d h 0 MainRAM Cerberus 16 | 03CA60 d h 0 MainRAM Save Richter 17 | 03CA64 d h 0 MainRAM Medusa 18 | 03CA68 d h 0 MainRAM Creature 19 | 03CA6C d h 0 MainRAM Lesser Demon 20 | 03CA70 d h 0 MainRAM Doppleganger 40 21 | 03CA74 d h 0 MainRAM Akmodan 22 | 03CA78 d h 0 MainRAM Darkwing Bat 23 | 03CA7C d h 0 MainRAM Galamoth 24 | 03CA80 d h 0 MainRAM Final Save 25 | 03CA84 d h 0 MainRAM Meeting Death 26 | 03CA88 d h 0 MainRAM Get Holy Glasses 27 | 03CA8C d h 0 MainRAM Meet Librarian 28 | 03CA90 d h 0 MainRAM Meet Maria 29 | 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Talic 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Scripts/SOTN_Average_Speed.lua: -------------------------------------------------------------------------------- 1 | local speed = 0x0733E0 2 | local invincibility = 0x072F1A 3 | local frame = 0 4 | local average = 0 5 | local totalSpeed = 0 6 | local started = true 7 | local startFrame = 0 8 | 9 | local function GetSpeed() 10 | return (memory.read_s32_le(speed) / 65536.0) 11 | end 12 | 13 | local function check() 14 | local currentSpeed = GetSpeed() 15 | 16 | if not started and math.abs(currentSpeed) > 0 then 17 | started = true 18 | frame = 1 19 | average = 0 20 | startFrame = 1 21 | totalSpeed = 0 22 | elseif started and currentSpeed == 0 then 23 | started = false 24 | return 25 | elseif not started then 26 | gui.drawText(10, 10, 'Avg spd: ', 'white', 'black') 27 | return 28 | end 29 | 30 | totalSpeed = totalSpeed + currentSpeed 31 | average = totalSpeed / (frame - startFrame + 1) 32 | 33 | gui.drawText(10, 10, 'Avg spd: ' .. string.format("%.2f", average), 'white', 'black') 34 | end 35 | 36 | while true do 37 | memory.writebyte(invincibility, 0xFF) 38 | frame = frame + 1 39 | check() 40 | emu.frameadvance() 41 | end 42 | -------------------------------------------------------------------------------- /Scripts/SOTN_Strings.lua: -------------------------------------------------------------------------------- 1 | ------------------------------------------------------ 2 | -- Castlevania: Symphony of the Night Strings Dump-- 3 | ------------------------------------------------------ 4 | 5 | local done = 0 6 | 7 | ------------------------ 8 | local function strings() 9 | local address = 0x0E05D8 10 | local endAdd = 0x0E0D36 11 | local output = "" 12 | local newString = true 13 | local digit = false 14 | local stringTmp = "" 15 | local stringAddress = 0 16 | 17 | while address < endAdd do 18 | local currentValue = mainmemory.readbyte(address) 19 | if currentValue == 255 then 20 | newString = true 21 | output = output .. "\r" .. "{\"" .. stringTmp .. "\", 0x" .. string.format("%x", stringAddress) .. "}," 22 | stringTmp = "" 23 | end 24 | if currentValue > 0 and currentValue < 255 then 25 | if newString == true then 26 | newString = false 27 | stringAddress = address 28 | end 29 | if currentValue == 130 then 30 | digit = true 31 | else 32 | if digit then 33 | stringTmp = stringTmp .. (currentValue - 79) 34 | else 35 | stringTmp = stringTmp .. string.char(currentValue + 32) 36 | end 37 | digit = false 38 | end 39 | end 40 | address = address + 1 41 | end 42 | console.log(output) 43 | done = 1; 44 | end 45 | 46 | while true do 47 | if done < 1 then 48 | strings() 49 | end 50 | emu.frameadvance() 51 | end -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Castlevania: Symphony of the Night Utilities 2 | Various tools for speedrunning, romhacking, TASing and research for Castlevania: Symphony of the Night(PSX) 3 | 4 | 5 | # Useful Links 6 | 7 | ## Community Projects 8 | * SotN Randomizer: https://github.com/3snowp7im/SotN-Randomizer 9 | * SotN Decomp: https://github.com/Xeeynamo/sotn-decomp 10 | * SotN Editor: https://github.com/KernelEquinox/SotN-Editor 11 | * SotN Castle Editor: https://github.com/MainMemory/SotNCastleEditor 12 | * SotN Documentation: https://sotn.dev/ 13 | * SotN Bizhawk Api: https://github.com/TalicZealot/SotnApi 14 | * SotN Prologue Bypass Script: https://github.com/Nijoja/Sotn-Projects 15 | * SotN Kind and Fair: https://github.com/Lakifume/SotnKindAndFair 16 | * SotN Saturn HUD: https://github.com/arukAdo-tas/hud_nitm_sat 17 | 18 | ## Tools 19 | * SotN Drop Rate Calculator: https://fatalis.github.io/sotn-dropcalc/ 20 | * SotN Experience Chart: https://docs.google.com/spreadsheets/d/1X4HyErJGmyaTbo9u8ojq8yj3eQ5uTveChx9G1HoOo64/edit#gid=0 21 | 22 | ## Various 23 | * SotN Speedrunning Leaderboard: https://www.speedrun.com/sotn 24 | * SotN Detailed Gamefaq: https://gamefaqs.gamespot.com/ps/196885-castlevania-symphony-of-the-night/faqs/52789 25 | * SotN Detailed Saturn Gamefaq: https://gamefaqs.gamespot.com/saturn/197146-akumajou-dracula-x-gekka-no-yasoukyoku/faqs/3789 26 | * SotN Speedrunning Wiki: https://castlevaniaspeedruns.com/Castlevania:_Symphony_of_the_Night 27 | * SotN Out of Bounds Map: Exploration Community: http://www.execulink.com/~maggi/wbw/ 28 | * SotN TAS page: http://tasvideos.org/GameResources/PSX/SymphonyOfTheNight.html 29 | 30 | ## Reverse-Engineering Tools 31 | * Debugging Emulator: https://github.com/grumpycoders/pcsx-redux 32 | * Debugging Emulator with Register Breakpoints: https://www.romhacking.net/utilities/267/ 33 | * MIPS R3000 Instruction Set Summary: https://vhouten.home.xs4all.nl/mipsel/r3000-isa.html 34 | * MIPS Instruction Converter: http://mipsconverter.com/instruction.html 35 | * R30XX Processor Reference Manual: https://cgi.cse.unsw.edu.au/~cs3231/doc/R3000.pdf 36 | -------------------------------------------------------------------------------- /Watches/Game.wch: -------------------------------------------------------------------------------- 1 | SystemID PSX 2 | 03C734 b u 0 MainRAM Status 3 | 03C9A8 b u 0 MainRAM MainMenuCategory 4 | 03C9A0 b u 0 MainRAM Character 5 | 1E5458 b u 0 MainRAM Castle 6 | 03D04E b u 0 MainRAM SettingsMenuOpen 7 | 138458 b u 0 MainRAM Zone1 8 | 0974A0 b u 0 MainRAM Zone2 9 | 1375BD b u 0 MainRAM Area 10 | 1375BC b u 0 MainRAM Room 11 | 097448 b u 0 MainRAM UnderwaterPhysics 12 | 0974A4 b u 0 MainRAM MapOpen 13 | 0973EC b u 0 MainRAM MenuOpen 14 | 03CF7C b u 0 MainRAM Loading 15 | 03C9A4 b u 0 MainRAM ScreenTransition 16 | 137948 b u 0 MainRAM EquipMenuOpen 17 | 1FFF6A b u 0 MainRAM RelicMenuOpen 18 | 03C708 b u 0 MainRAM CanSave 19 | 03BEE0 b u 0 MainRAM MapItemsCollectedStart 20 | 1A78B4 b u 0 MainRAM SeedStart 21 | 1A78D4 b u 0 MainRAM PresetStart 22 | 06BBDC b u 0 MainRAM MapStart 23 | 06C30B b u 0 MainRAM MapEnd 24 | 0 S _ 1 CanFight 25 | 03CA74 b u 0 MainRAM Akmodan 26 | 03CA48 b u 0 MainRAM Beelzebub 27 | 03CA5C b u 0 MainRAM Cerberus 28 | 03CA78 b u 0 MainRAM Darkwing 29 | 03CA58 b u 0 MainRAM Death 30 | 03CA30 b u 0 MainRAM Dopple10 31 | 03CA70 b u 0 MainRAM Dopple40 32 | 03CA54 b u 0 MainRAM Trio 33 | 03CA7C b u 0 MainRAM Galamoth 34 | 03CA34 b u 0 MainRAM Granfaloon 35 | 03CA44 b u 0 MainRAM Hippogryph 36 | 03CA50 b u 0 MainRAM Karasuman 37 | 03CA6C b u 0 MainRAM LesserDemon 38 | 03CA64 b u 0 MainRAM Medusa 39 | 03CA38 b u 0 MainRAM Minotaur&Werewolf 40 | 03CA2C b u 0 MainRAM Olrox 41 | 03CA3C b u 0 MainRAM Scylla 42 | 03CA40 b u 0 MainRAM Slogra&Gaibon 43 | 03CA4C b u 0 MainRAM Succubus 44 | 03CA68 b u 0 MainRAM Creature 45 | 0 S _ 1 Inventory 46 | 03C9B0 b u 0 MainRAM Category 47 | 09798A b u 0 MainRAM HandQuantityStart 48 | 097A8D b u 0 MainRAM HandInventoryStart 49 | 097B51 b u 0 MainRAM HelmInventoryStart 50 | 097B37 b u 0 MainRAM ArmorInventoryStart 51 | 097B67 b u 0 MainRAM CloakInventoryStart 52 | 097B70 b u 0 MainRAM AccessoryInventoryStart 53 | 03C9AC b u 0 MainRAM RelicCursor 54 | 03C9B4 b u 0 MainRAM HandCursor 55 | 03C9B8 b u 0 MainRAM HelmCursor 56 | 03C9BC b u 0 MainRAM ArmorCursor 57 | 03C9C0 b u 0 MainRAM CloakCursor 58 | 03C9C4 b u 0 MainRAM AccessoryCursor 59 | 08AE80 d u 0 GPURAM VramMapStart 60 | 138458 b h 0 MainRAM Music 61 | 0 S _ 1 In Game Time 62 | 097C30 b u 0 MainRAM Hours 63 | 097C34 b u 0 MainRAM Minutes 64 | 097C38 b u 0 MainRAM Seconds 65 | 097C3C b u 0 MainRAM Frames 66 | 0 S _ 1 Hitboxes 67 | 0BD1C0 w u 0 MainRAM enable both to draw 68 | 1362B0 w u 0 MainRAM enable both to draw 69 | 0 S _ 1 Transitions 70 | 0A2460 b h 0 MainRAM area transitions start 71 | 0 S _ 1 RNG seeds 72 | 009010 d u 0 MainRAM Evil Seed 73 | 0978B8 d u 0 MainRAM Nice Seed 74 | 75 | -------------------------------------------------------------------------------- /Scripts/SOTN_Life_Drain.lua: -------------------------------------------------------------------------------- 1 | --options 2 | 3 | local drainPercentage = 4; 4 | local frameInterval = 60 5 | 6 | ----------------------------- 7 | 8 | local gameAddresses = { 9 | GameStatus = 0x03C734, 10 | EntityHitboxWidth = 0x07341e, 11 | CanSave = 0x03C708, 12 | CanWarp = 0x03C710, 13 | Loading = 0x03CF7C, 14 | ScreenTransition = 0x03C9A4, 15 | MenuOpen = 0x0973EC, 16 | MaoOpen = 0x0974A4, 17 | CurrentHp = 0x097BA0, 18 | MaxHp = 0x097BA4, 19 | Invincibility = 0x072F1A, 20 | PotionInvincibility = 0x072F1C, 21 | KnockbackInvincibility = 0x13B5E8, 22 | FreezeInvincibility = 0x097420, 23 | AlucardStep = 0x073404, 24 | AlucardStep2 = 0x073406, 25 | TimeAttackPrologue = 0x03CA28, 26 | } 27 | 28 | local frame = 0 29 | local remainder = 0 30 | 31 | local function InGame() 32 | return memory.readbyte(gameAddresses.GameStatus) == 2 33 | end 34 | local function IsLoading() 35 | return memory.readbyte(gameAddresses.Loading) == 0x88 36 | end 37 | local function InScreenTransition() 38 | return memory.readbyte(gameAddresses.ScreenTransition) == 0x3 39 | end 40 | local function MenuOpen() 41 | return memory.readbyte(gameAddresses.MenuOpen) == 0x1 42 | end 43 | local function MapOpen() 44 | return memory.readbyte(gameAddresses.MaoOpen) > 0 45 | end 46 | local function HasHitbox() 47 | if memory.read_u16_le(gameAddresses.AlucardStep) == 7 then -- Power of Mist 48 | return true 49 | end 50 | return memory.readbyte(gameAddresses.EntityHitboxWidth) > 0 51 | end 52 | local function IsDying() 53 | return memory.read_u16_le(gameAddresses.AlucardStep) == 0x10 54 | end 55 | local function CanSave() 56 | local canSave = memory.readbyte(gameAddresses.CanSave) 57 | return ((canSave & 0x20) == 0x20) 58 | end 59 | local function CanWarp() 60 | local canWarp = memory.readbyte(gameAddresses.CanWarp) 61 | return ((canWarp & 0x0E) == 0x0E) 62 | end 63 | local function IsInvincible() 64 | return memory.read_u16_le(gameAddresses.Invincibility) > 0 65 | or memory.readbyte(gameAddresses.PotionInvincibility) > 4 66 | or memory.readbyte(gameAddresses.KnockbackInvincibility) > 0 67 | or memory.readbyte(gameAddresses.FreezeInvincibility) > 0 68 | end 69 | local function PrologueCompleted() 70 | return memory.read_u32_le(gameAddresses.TimeAttackPrologue) > 0 71 | end 72 | local function DrainViable() 73 | return InGame() == true 74 | and IsDying() == false 75 | and IsLoading() == false 76 | and InScreenTransition() == false 77 | and MenuOpen() == false 78 | and MapOpen() == false 79 | and HasHitbox() == true 80 | and CanSave() == false 81 | -- and canWarp() == false 82 | --and IsInvincible() == false 83 | end 84 | local function getMaxHp() 85 | return memory.read_u32_le(gameAddresses.MaxHp) 86 | end 87 | local function getCurrentHp() 88 | return memory.read_u32_le(gameAddresses.CurrentHp) 89 | end 90 | local function setCurrentHp(value) 91 | memory.write_u32_le(gameAddresses.CurrentHp, value) 92 | end 93 | local function killCharacter() 94 | memory.write_u16_le(gameAddresses.AlucardStep2, 0) 95 | memory.write_u16_le(gameAddresses.AlucardStep, 0x10) 96 | end 97 | 98 | local function drain() 99 | if DrainViable() == false or frame < frameInterval then 100 | return 101 | end 102 | 103 | frame = 0 104 | local reduction = getMaxHp() * (drainPercentage / 100) 105 | local reductionWhole = math.floor(reduction) 106 | remainder = remainder + (reduction - reductionWhole) 107 | 108 | if remainder >= 1 then 109 | remainder = remainder - 1 110 | reductionWhole = reductionWhole + 1 111 | end 112 | 113 | if PrologueCompleted() == false then 114 | setCurrentHp(getCurrentHp() - 1) 115 | return 116 | end 117 | 118 | local currentHp = getCurrentHp() 119 | local newHp = currentHp - reductionWhole 120 | if newHp < 1 then 121 | setCurrentHp(0) 122 | killCharacter() 123 | else 124 | setCurrentHp(newHp) 125 | end 126 | end 127 | 128 | while true do 129 | frame = frame + 1 130 | drain() 131 | emu.frameadvance() 132 | end 133 | -------------------------------------------------------------------------------- /Scripts/SOTN_Life_Drain_Biz28.lua: -------------------------------------------------------------------------------- 1 | --options 2 | 3 | local drainPercentage = 4; 4 | local frameInterval = 60 5 | 6 | ----------------------------- 7 | 8 | local gameAddresses = { 9 | GameStatus = 0x03C734, 10 | EntityHitboxWidth = 0x07341e, 11 | CanSave = 0x03C708, 12 | CanWarp = 0x03C710, 13 | Loading = 0x03CF7C, 14 | ScreenTransition = 0x03C9A4, 15 | MenuOpen = 0x0973EC, 16 | MaoOpen = 0x0974A4, 17 | CurrentHp = 0x097BA0, 18 | MaxHp = 0x097BA4, 19 | Invincibility = 0x072F1A, 20 | PotionInvincibility = 0x072F1C, 21 | KnockbackInvincibility = 0x13B5E8, 22 | FreezeInvincibility = 0x097420, 23 | AlucardStep = 0x073404, 24 | AlucardStep2 = 0x073406, 25 | TimeAttackPrologue = 0x03CA28, 26 | } 27 | 28 | local frame = 0 29 | local remainder = 0 30 | 31 | local function InGame() 32 | return memory.readbyte(gameAddresses.GameStatus) == 2 33 | end 34 | local function IsLoading() 35 | return memory.readbyte(gameAddresses.Loading) == 0x88 36 | end 37 | local function InScreenTransition() 38 | return memory.readbyte(gameAddresses.ScreenTransition) == 0x3 39 | end 40 | local function MenuOpen() 41 | return memory.readbyte(gameAddresses.MenuOpen) == 0x1 42 | end 43 | local function MapOpen() 44 | return memory.readbyte(gameAddresses.MaoOpen) > 0 45 | end 46 | local function HasHitbox() 47 | if memory.read_u16_le(gameAddresses.AlucardStep) == 7 then -- Power of Mist 48 | return true 49 | end 50 | return memory.readbyte(gameAddresses.EntityHitboxWidth) > 0 51 | end 52 | local function IsDying() 53 | return memory.read_u16_le(gameAddresses.AlucardStep) == 0x10 54 | end 55 | local function CanSave() 56 | local canSave = memory.readbyte(gameAddresses.CanSave) 57 | return (bit.band(canSave,0x20) == 0x20) 58 | end 59 | local function CanWarp() 60 | local canWarp = memory.readbyte(gameAddresses.CanWarp) 61 | return (bit.band(canWarp,0x0E) == 0x0E) 62 | end 63 | local function IsInvincible() 64 | return memory.read_u16_le(gameAddresses.Invincibility) > 0 65 | or memory.readbyte(gameAddresses.PotionInvincibility) > 4 66 | or memory.readbyte(gameAddresses.KnockbackInvincibility) > 0 67 | or memory.readbyte(gameAddresses.FreezeInvincibility) > 0 68 | end 69 | local function PrologueCompleted() 70 | return memory.read_u32_le(gameAddresses.TimeAttackPrologue) > 0 71 | end 72 | local function DrainViable() 73 | return InGame() == true 74 | and IsDying() == false 75 | and IsLoading() == false 76 | and InScreenTransition() == false 77 | and MenuOpen() == false 78 | and MapOpen() == false 79 | and HasHitbox() == true 80 | and CanSave() == false 81 | -- and canWarp() == false 82 | --and IsInvincible() == false 83 | end 84 | local function getMaxHp() 85 | return memory.read_u32_le(gameAddresses.MaxHp) 86 | end 87 | local function getCurrentHp() 88 | return memory.read_u32_le(gameAddresses.CurrentHp) 89 | end 90 | local function setCurrentHp(value) 91 | memory.write_u32_le(gameAddresses.CurrentHp, value) 92 | end 93 | local function killCharacter() 94 | memory.write_u16_le(gameAddresses.AlucardStep2, 0) 95 | memory.write_u16_le(gameAddresses.AlucardStep, 0x10) 96 | end 97 | 98 | local function drain() 99 | if DrainViable() == false or frame < frameInterval then 100 | return 101 | end 102 | 103 | frame = 0 104 | local reduction = getMaxHp() * (drainPercentage / 100) 105 | local reductionWhole = math.floor(reduction) 106 | remainder = remainder + (reduction - reductionWhole) 107 | 108 | if remainder >= 1 then 109 | remainder = remainder - 1 110 | reductionWhole = reductionWhole + 1 111 | end 112 | 113 | if PrologueCompleted() == false then 114 | setCurrentHp(getCurrentHp() - 1) 115 | return 116 | end 117 | 118 | local currentHp = getCurrentHp() 119 | local newHp = currentHp - reductionWhole 120 | if newHp < 1 then 121 | setCurrentHp(0) 122 | killCharacter() 123 | else 124 | setCurrentHp(newHp) 125 | end 126 | end 127 | 128 | while true do 129 | frame = frame + 1 130 | drain() 131 | emu.frameadvance() 132 | end 133 | -------------------------------------------------------------------------------- /Watches/Alucard.wch: -------------------------------------------------------------------------------- 1 | SystemID PSX 2 | 0 S _ 1 Stats 3 | 097BA0 d u 0 MainRAM CurrentHp 4 | 097BA4 d u 0 MainRAM MaxHp 5 | 097BB0 d u 0 MainRAM CurrentMp 6 | 097BB4 d u 0 MainRAM MaxMp 7 | 097BA8 d u 0 MainRAM CurrentHearts 8 | 097BAC d u 0 MainRAM MaxHearts 9 | 097BB8 d u 0 MainRAM STR 10 | 097BC8 d u 0 MainRAM StrBonus 11 | 097BBC d u 0 MainRAM CON 12 | 097BCC d u 0 MainRAM ConBOnus 13 | 097BC0 d u 0 MainRAM INT 14 | 097BD0 d u 0 MainRAM IntBonus 15 | 097BC4 d u 0 MainRAM LCK 16 | 097BD4 d u 0 MainRAM LckBonus 17 | 097C24 d u 0 MainRAM DEF 18 | 097BF0 d u 0 MainRAM Gold 19 | 097BE8 d u 0 MainRAM Level 20 | 097BEC d u 0 MainRAM Experience 21 | 03C760 d u 0 MainRAM Rooms 22 | 0 S _ 1 Relics 23 | 097964 b u 0 MainRAM SoulOfBat 24 | 097965 b u 0 MainRAM FireOfBat 25 | 097966 b u 0 MainRAM EchoOfBat 26 | 097967 b u 0 MainRAM ForceOfEcho 27 | 097968 b u 0 MainRAM SoulOfWolf 28 | 097969 b u 0 MainRAM PowerOfWolf 29 | 09796A b u 0 MainRAM SkillOfWolf 30 | 09796B b u 0 MainRAM FormOfMist 31 | 09796C b u 0 MainRAM PowerOfMist 32 | 09796D b u 0 MainRAM GasCloud 33 | 09796E b u 0 MainRAM CubeOfZoe 34 | 09796F b u 0 MainRAM SpiritOrb 35 | 097970 b u 0 MainRAM GravityBoots 36 | 097971 b u 0 MainRAM LeapStone 37 | 097972 b u 0 MainRAM HolySymbol 38 | 097973 b u 0 MainRAM FaerieScroll 39 | 097974 b u 0 MainRAM JewelOfOpen 40 | 097975 b u 0 MainRAM MermanStatue 41 | 097976 b u 0 MainRAM BatCard 42 | 097977 b u 0 MainRAM GhostCard 43 | 097978 b u 0 MainRAM FaerieCard 44 | 097979 b u 0 MainRAM DemonCard 45 | 09797A b u 0 MainRAM SwordCard 46 | 09797B b u 0 MainRAM SpriteCard 47 | 09797C b u 0 MainRAM NoseDevilCard 48 | 09797D b u 0 MainRAM HeartOfVlad 49 | 09797E b u 0 MainRAM ToothOfVlad 50 | 09797F b u 0 MainRAM RibOfVlad 51 | 097980 b u 0 MainRAM RingOfVlad 52 | 097981 b u 0 MainRAM EyeOfVlad 53 | 0 S _ 1 Familiar XP 54 | 097C48 d u 0 MainRAM BatCardXp 55 | 097C54 d u 0 MainRAM GhostCardXp 56 | 097C60 d u 0 MainRAM FaerieCardXp 57 | 097C6C d u 0 MainRAM DemonCardXp 58 | 097C78 d u 0 MainRAM SwordCardXp 59 | 097C84 d u 0 MainRAM SpriteCardXp 60 | 097C90 d u 0 MainRAM NoseDevilCardXp 61 | 0 S _ 1 Shortcuts 62 | 03BEBC b u 0 MainRAM WarpsFirstCastle 63 | 03BEBD b u 0 MainRAM WarpsSecondCastle 64 | 03BDFC b u 0 MainRAM OuterWallElevator 65 | 03BE1D b u 0 MainRAM EntranceToMarbleGalery 66 | 03BE6F b u 0 MainRAM AlchemyElevatorShortcut 67 | 03BE4C b u 0 MainRAM ChapelStatue 68 | 03BE9E b u 0 MainRAM ColosseumElevator 69 | 03BE9D b u 0 MainRAM ColosseumToChapel 70 | 03BDED b u 0 MainRAM MarbleBlueDoor 71 | 03BEB3 b u 0 MainRAM CavernsSwitchAndBridge 72 | 03BE1C b u 0 MainRAM EntranceToCaverns 73 | 03BE1E b u 0 MainRAM EntranceWarp 74 | 03BDEC b u 0 MainRAM ClockRoomDoorFirstCastle 75 | 03BED0 b u 0 MainRAM ClockRoomDoorSecondCastle 76 | 03BE3C b u 0 MainRAM FirstDemonButton 77 | 03BE44 b u 0 MainRAM SecondDemonButton 78 | 03BE80 b u 0 MainRAM KeepStairs 79 | 0 S _ 1 Inventory 80 | 097C00 b u 0 MainRAM RightHandSlot 81 | 097C04 b u 0 MainRAM LeftHandSlot 82 | 097C08 b u 0 MainRAM HelmSlot 83 | 097C0C b u 0 MainRAM ArmorSlot 84 | 097C10 b u 0 MainRAM CloakSlot 85 | 097C14 b u 0 MainRAM AccessorySlot1 86 | 097C18 b u 0 MainRAM AccessorySlot2 87 | 097BFC b u 0 MainRAM Subweapon 88 | 0 S _ 1 Character Entity 89 | 073404 b u 0 MainRAM State 90 | 073406 b u 0 MainRAM Action 91 | 0733EC b u 0 MainRAM Facing 92 | 072F9C b u 0 MainRAM ScreenX 93 | 072F9E b u 0 MainRAM ScreenY 94 | 0973F0 d u 0 MainRAM AbsoluteX 95 | 0973F4 d u 0 MainRAM AbsoluteY 96 | 0730B0 b u 0 MainRAM MapX 97 | 0973F1 b u 0 MainRAM MapXOffset 98 | 0730B4 b u 0 MainRAM MapY 99 | 0973F5 b u 0 MainRAM MapOffsetY 100 | 072EFC w u 0 MainRAM Stun 101 | 072F00 w u 0 MainRAM Poison 102 | 072F02 w u 0 MainRAM Curse 103 | 072F09 w u 0 MainRAM Shine 104 | 072F05 w u 0 MainRAM Effect 105 | 072F60 w u 0 MainRAM EffectPalette 106 | 072F17 w u 0 MainRAM DarkMetamorphosis 107 | 13982D w u 0 MainRAM AttackPotion 108 | 139829 w u 0 MainRAM DefencePotion 109 | 072F1B w u 0 MainRAM Invincibility 110 | 072F1C w u 0 MainRAM PotionInvincibility 111 | 13B5E8 w u 0 MainRAM KnockbackInvincibility 112 | 0733D8 b u 0 MainRAM ActorAddress 113 | 116BDC b u 0 MainRAM WingsmashDuration 114 | 116BA6 b u 0 MainRAM WingsmashEffect 115 | 116BA4 b u 0 MainRAM WingsmashSpriteGlow 116 | 116B97 b u 0 MainRAM WingsmashAnimation 117 | 074B89 b u 0 MainRAM ActivatorIndex 118 | 074B7E b u 0 MainRAM Activator 119 | 072F76 b u 0 MainRAM HealTrigger 120 | 072F78 b u 0 MainRAM HealAmount 121 | 0 S _ 1 Speeds 122 | 116BA0 b u 0 MainRAM WingsmashHorizontal 123 | 112B7C b u 0 MainRAM WalkingWhole 124 | 112B85 b u 0 MainRAM WalkingFract 125 | 112CDC b u 0 MainRAM JumpingHorizontalWhole 126 | 112CE5 b u 0 MainRAM JumpingHorizontalFract 127 | 112F64 b u 0 MainRAM JumpingAttackLeftHorizontalWhole 128 | 112F69 b u 0 MainRAM JumpingAttackLeftHorizontalFract 129 | 112F84 b u 0 MainRAM JumpingAttackRightHorizontalWhole 130 | 112F89 b u 0 MainRAM JumpingAttackRightHorizontalFract 131 | 112D8C b u 0 MainRAM FallingHorizontalWhole 132 | 112D95 b u 0 MainRAM FallingHorizontalFract 133 | 1170B8 b u 0 MainRAM BatHorizontalRightWhole 134 | 1170C5 b u 0 MainRAM BatHorizontalRightFract 135 | 1170FC b u 0 MainRAM BatHorizontalLeftWhole 136 | 117109 b u 0 MainRAM BatHorizontalLeftFract 137 | 12D6D0 b u 0 MainRAM WolfDashTopRight 138 | 12D73C b u 0 MainRAM WolfDashTopLeft 139 | 11213D b u 0 MainRAM BackdashDecel 140 | 072EFC b u 0 MainRAM HasControl 141 | 142 | --------------------------------------------------------------------------------