--TOGGLE
--This variable controls if only useful rocks/soils should be highlighted
--true: highlights everything except junk ore and coin bags
--false:highlights everything
local debugvaluables=true
--Memory
local CameraDomain="IWRAM"
local CameraXAddress=0x77BC
local CameraYAddress=0x77BE
local DataDomain="EWRAM"
local StaminaAddress=0x006A29
local FatigueAddress=0x006A2A
local TileDataAddress=0x007C68
local MineLevelAddress=0x039064
--Data
local CameraX
local CameraY
local Stamina
local Fatigue
local Tile
local MineLevel
local TileROCK
local TileTYPE
local TileDIRT
--Constants
local TYPE_SOIL=0x0
local TYPE_TILLED=0x1
local TYPE_STAIRSDOWN=0x2
local TYPE_STAIRSUP=0x3
local TYPE_STONE=0x4
local ROCK_EMPTY=0x00
local ROCK_TELEPORT=0x0A
local ROCK_JUNK=0x0C
local ROCK_COPPER=0x0D
local ROCK_SILVER=0x0E
local ROCK_GOLD=0x0F
local ROCK_MYSTRILE=0x10
local ROCK_ORICHALC=0x11
local ROCK_ADAMANTITE=0x12
local ROCK_MOONSTONE=0x13
local ROCK_SANDROSE=0x14
local ROCK_PINKDIAMOND=0x15
local ROCK_ALEXANDRITE=0x16
local ROCK_MYTHICSTONE=0x17
local ROCK_DIAMOND=0x18
local ROCK_EMERALD=0x19
local ROCK_RUBY=0x1A
local ROCK_TOPAZ=0x1B
local ROCK_PERIDOT=0x1C
local ROCK_FLUORITE=0x1D
local ROCK_AGATE=0x1E
local ROCK_AMETHYST=0x1F
local ROCK_GODDESS=0x20
local ROCK_KAPPA=0x21
local DIRT_EMPTY=0x00
local DIRT_STAIRSDOWN=0x01
local DIRT_MONEY=0x02
local DIRT_POWERBERRY=0x03
local DIRT_CURSEDSICKLE=0x04
local DIRT_CURSEDHOE=0x05
local DIRT_CURSEDAXE=0x06
local DIRT_CURSEDHAMMER=0x07
local DIRT_CURSEDWATERINGCAN=0x08
local DIRT_CURSEDFISHINGROD=0x09
local DIRT_BLACKGRASS=0x0B
local DIRT_RECIPE=0x22
--Colors - tiles
local TYPECOLORS={}
TYPECOLORS[TYPE_SOIL]=0
TYPECOLORS[TYPE_TILLED]=0
TYPECOLORS[TYPE_STAIRSDOWN]=0
TYPECOLORS[TYPE_STAIRSUP]=0
TYPECOLORS[TYPE_STONE]=0
--Colors - rock contents
local ROCKCOLORS={}
ROCKCOLORS[ROCK_EMPTY]=0
ROCKCOLORS[ROCK_TELEPORT]="black"
ROCKCOLORS[ROCK_JUNK]="darkslategray"
ROCKCOLORS[ROCK_COPPER]="saddlebrown"
ROCKCOLORS[ROCK_SILVER]="silver"
ROCKCOLORS[ROCK_GOLD]="gold"
ROCKCOLORS[ROCK_MYSTRILE]="blue"
ROCKCOLORS[ROCK_ORICHALC]="lightgray"
ROCKCOLORS[ROCK_ADAMANTITE]="cyan"
ROCKCOLORS[ROCK_MOONSTONE]="lightgray"
ROCKCOLORS[ROCK_SANDROSE]="lightpink"
ROCKCOLORS[ROCK_PINKDIAMOND]="pink"
ROCKCOLORS[ROCK_ALEXANDRITE]="forestgreen"
ROCKCOLORS[ROCK_MYTHICSTONE]="black"
ROCKCOLORS[ROCK_DIAMOND]="lightcyan"
ROCKCOLORS[ROCK_EMERALD]="green"
ROCKCOLORS[ROCK_RUBY]="red"
ROCKCOLORS[ROCK_TOPAZ]="yellow"
ROCKCOLORS[ROCK_PERIDOT]="limegreen"
ROCKCOLORS[ROCK_FLUORITE]="mediumspringgreen"
ROCKCOLORS[ROCK_AGATE]="orange"
ROCKCOLORS[ROCK_AMETHYST]="purple"
ROCKCOLORS[ROCK_GODDESS]="black"
ROCKCOLORS[ROCK_KAPPA]="black"
--Colors - dirt contents
local DIRTCOLORS={}
DIRTCOLORS[DIRT_EMPTY]=0
DIRTCOLORS[DIRT_STAIRSDOWN]="orange"
DIRTCOLORS[DIRT_MONEY]="yellow"
DIRTCOLORS[DIRT_POWERBERRY]="red"
DIRTCOLORS[DIRT_CURSEDSICKLE]="pink"
DIRTCOLORS[DIRT_CURSEDHOE]="pink"
DIRTCOLORS[DIRT_CURSEDAXE]="pink"
DIRTCOLORS[DIRT_CURSEDHAMMER]="pink"
DIRTCOLORS[DIRT_CURSEDFISHINGROD]="pink"
DIRTCOLORS[DIRT_CURSEDWATERINGCAN]="pink"
DIRTCOLORS[DIRT_BLACKGRASS]="black"
DIRTCOLORS[DIRT_RECIPE]="gray"
--Output
local debugstring
local debugprint
local debugcounter
local rainbow
if(debugvaluables==true) then
DIRTCOLORS[DIRT_MONEY]=0
ROCKCOLORS[ROCK_JUNK]=0
end
while true do
emu.frameadvance()
--The script works only in mines, although the actual value stores location ID
MineLevel=memory.read_u16_le(MineLevelAddress,DataDomain)%256-52
if(MineLevel<0==false) then
debugstring=""
debugcounter=0
debugprint=false
CameraX=memory.read_u16_le(CameraXAddress,CameraDomain)
CameraY=memory.read_u16_le(CameraYAddress,CameraDomain)
Stamina=memory.read_u8(StaminaAddress,DataDomain)
Fatigue=bit.band(memory.read_u8(FatigueAddress,DataDomain),0x7F)
rainbow=0xFF000000+(0x090807*(emu.framecount()))%0x1000000
ROCKCOLORS[ROCK_KAPPA]=rainbow
ROCKCOLORS[ROCK_GODDESS]=rainbow
ROCKCOLORS[ROCK_TELEPORT]=rainbow
rainbow=0xFF000000+(0x222222*(emu.framecount()%8))%0x1000000
ROCKCOLORS[ROCK_MYTHICSTONE]=rainbow
ROCKCOLORS[ROCK_PINKDIAMOND]=rainbow
ROCKCOLORS[ROCK_ALEXANDRITE]=rainbow
rainbow=0xFF000000+(0x080800*(emu.framecount()))%0x1000000
DIRTCOLORS[DIRT_STAIRSDOWN]=rainbow
rainbow=0xFF000000+(0x100000*(emu.framecount()))%0x1000000
DIRTCOLORS[DIRT_POWERBERRY]=rainbow
rainbow=0xFF000000+(0x080808*(emu.framecount()%32))%0x1000000
DIRTCOLORS[DIRT_CURSEDSICKLE]=rainbow
DIRTCOLORS[DIRT_CURSEDHOE]=rainbow
DIRTCOLORS[DIRT_CURSEDAXE]=rainbow
DIRTCOLORS[DIRT_CURSEDHAMMER]=rainbow
DIRTCOLORS[DIRT_CURSEDWATERINGCAN]=rainbow
DIRTCOLORS[DIRT_CURSEDFISHINGROD]=rainbow
for row=0,27 do
for column=0,27 do
Tile=memory.read_u16_le(TileDataAddress+column*2+row*56,DataDomain)
TileTYPE=bit.band(Tile,0x000F)
TileROCK=bit.band(Tile,0x03F0)/16
TileDIRT=bit.band(Tile,0xFC00)/1024
if(TYPECOLORS[TileTYPE]~=0) then
gui.drawRectangle(17+column*16-CameraX,57+row*16-CameraY,13,13,TYPECOLORS[TileTYPE],TYPECOLORS[TileTYPE])
end
if(DIRTCOLORS[TileDIRT]~=0) then
gui.drawRectangle(27+column*16-CameraX,67+row*16-CameraY,3,3,DIRTCOLORS[TileDIRT],DIRTCOLORS[TileDIRT])
end
if(ROCKCOLORS[TileROCK]~=0) then
gui.drawRectangle(27+column*16-CameraX,57+row*16-CameraY,3,3,ROCKCOLORS[TileROCK],ROCKCOLORS[TileROCK])
end
if(DIRTCOLORS[TileDIRT]==nil or ROCKCOLORS[TileROCK]==nil or TYPECOLORS[TileTYPE]==nil) then
debugprint=true
debugstring=debugstring..tostring(TileDIRT)..' '..tostring(TileROCK)..' '..tostring(TileTYPE)..'\t'
end
if(TileROCK==ROCK_GODDESS or TileROCK==ROCK_KAPPA) then
debugcounter=debugcounter+1
end
end
debugstring=debugstring..'\n'
end
gui.pixelText(116,140,Stamina,"cyan",0)
gui.pixelText(116,149,Fatigue,"purple",0)
if(debugcounter>0) then
--There seem to be an error in the game when stones that are supposed
--to drop jewels won't do that no matter what.
--
--This is a bug that can be fixed by entering any subscreen.
--Namely, rucksack or diary screen. After that, a rock that contains
--a jewel will drop it if it was not obtained on the current floor.
gui.pixelText(1,1,"Activate subscreen to fix jewel drop bug.","red","black")
end
gui.pixelText(220,1,"B"..MineLevel,"white","black")
if(debugprint==true) then
console.clear()
console.log(debugstring)
end
end
end