User File #21476126496737213

Upload All User Files

#21476126496737213 - NES Ultima: Quest of the Avatar -- Basic info script

Ultima_QotA_BasicInfo_v1_FRK.lua
714 downloads
Uploaded 3/17/2015 3:58 AM by FatRatKnight (see all 245)
Colorful numbers. Tiny cute informative icons. Joy.
I'll leave it up to you to determine what the numbers mean. I produced this script to make it slightly more interesting to watch that recent submission.
There is one commented line at the start of the while true loop. In particular, the one that looks like a commented out line of lua code, not the fancy borders. That's specifically for this submission. Uncomment that line for lighting up dungeons when watching that specific movie.
--*****************************************************************************
local Draw= {}
--*****************************************************************************
--Coordinates is the top-left pixel of the 3x5 digit.
--Used for drawing compact, colored numbers.

local Px,Li= gui.pixel, gui.line

Draw[0]= function(x,y,c) -- ###
    Li(x  ,y  ,x  ,y+4,c)-- # #
    Li(x+2,y  ,x+2,y+4,c)-- # #
    Px(x+1,y  ,c)        -- # #
    Px(x+1,y+4,c)        -- ###
end

Draw[1]= function(x,y,c) --  #
    Li(x  ,y+4,x+2,y+4,c)-- ##
    Li(x+1,y  ,x+1,y+3,c)--  #
    Px(x  ,y+1,c)        --  #
end                      -- ###

Draw[2]= function(x,y,c) -- ###
    Li(x  ,y  ,x+2,y  ,c)--   #
    Li(x  ,y+3,x+2,y+1,c)-- ###
    Li(x  ,y+4,x+2,y+4,c)-- #
    Px(x  ,y+2,c)        -- ###
    Px(x+2,y+2,c)
end

Draw[3]= function(x,y,c) -- ###
    Li(x  ,y  ,x+1,y  ,c)--   #
    Li(x  ,y+2,x+1,y+2,c)-- ###
    Li(x  ,y+4,x+1,y+4,c)--   #
    Li(x+2,y  ,x+2,y+4,c)-- ###
end

Draw[4]= function(x,y,c) -- # #
    Li(x  ,y  ,x  ,y+2,c)-- # #
    Li(x+2,y  ,x+2,y+4,c)-- ###
    Px(x+1,y+2,c)        --   #
end                      --   #

Draw[5]= function(x,y,c) -- ###
    Li(x  ,y  ,x+2,y  ,c)-- #
    Li(x  ,y+1,x+2,y+3,c)-- ###
    Li(x  ,y+4,x+2,y+4,c)--   #
    Px(x  ,y+2,c)        -- ###
    Px(x+2,y+2,c)
end

Draw[6]= function(x,y,c) -- ###
    Li(x  ,y  ,x+2,y  ,c)-- #
    Li(x  ,y+1,x  ,y+4,c)-- ###
    Li(x+2,y+2,x+2,y+4,c)-- # #
    Px(x+1,y+2,c)        -- ###
    Px(x+1,y+4,c)
end
                         -- ###
Draw[7]= function(x,y,c) --   #
    Li(x  ,y  ,x+1,y  ,c)--  ##
    Li(x+2,y  ,x+1,y+4,c)--  #
end                      --  #

Draw[8]= function(x,y,c) -- ###
    Li(x  ,y  ,x  ,y+4,c)-- # #
    Li(x+2,y  ,x+2,y+4,c)-- ###
    Px(x+1,y  ,c)        -- # #
    Px(x+1,y+2,c)        -- ###
    Px(x+1,y+4,c)
end

Draw[9]= function(x,y,c) -- ###
    Li(x  ,y  ,x  ,y+2,c)-- # #
    Li(x+2,y  ,x+2,y+3,c)-- ###
    Li(x  ,y+4,x+2,y+4,c)--   #
    Px(x+1,y  ,c)        -- ###
    Px(x+1,y+2,c)
end

Draw[10]=function(x,y,c) --  #
    Li(x  ,y+1,x  ,y+4,c)-- # #
    Li(x+2,y+1,x+2,y+4,c)-- # #
    Px(x+1,y  ,c)        -- ###
    Px(x+1,y+3,c)        -- # #
end

Draw[11]=function(x,y,c) -- ##
    Li(x  ,y  ,x  ,y+4,c)-- # #
    Li(x+1,y  ,x+2,y+1,c)-- ##
    Li(x+1,y+4,x+2,y+3,c)-- # #
    Px(x+1,y+2,c)        -- ##
end

Draw[12]=function(x,y,c) --  #
    Li(x  ,y+1,x  ,y+3,c)-- # #
    Li(x+1,y  ,x+2,y+1,c)-- #
    Li(x+1,y+4,x+2,y+3,c)-- # #
end                      --  #

Draw[13]=function(x,y,c) -- ##
    Li(x  ,y  ,x  ,y+4,c)-- # #
    Li(x+2,y+1,x+2,y+3,c)-- # #
    Px(x+1,y  ,c)        -- # #
    Px(x+1,y+4,c)        -- ##
end

Draw[14]=function(x,y,c) -- ###
    Li(x  ,y  ,x  ,y+4,c)-- #
    Li(x+1,y  ,x+2,y  ,c)-- ##
    Li(x+1,y+4,x+2,y+4,c)-- #
    Px(x+1,y+2,c)        -- ###
end

Draw[15]=function(x,y,c) -- ###
    Li(x  ,y  ,x  ,y+4,c)-- #
    Li(x+1,y  ,x+2,y  ,c)-- ##
    Px(x+1,y+2,c)        -- #
end                      -- #

--*****************************************************************************
local function __DN_AnyBase(right, y, Number, c, bkgnd, div)
--*****************************************************************************
-- Works with any base from 2 to 16. Paints the input number.
-- Returns the x position where it would paint another digit.
-- It only works with integers. Rounds fractions toward zero.

    if div < 2 then return end  -- Prevents the function from never returning.

    local Digit= {}
    local Negative= false
    if Number < 0 then
        Number= -Number
        Negative= true
    end

    Number= math.floor(Number)
    c= c or "white"
    bkgnd= bkgnd or "clear"

    local i= 0
    if Number < 1 then
        Digit[1]= 0
        i= 1
    end

    while (Number >= 1) do
        i= i+1
        Digit[i]= Number % div
        Number= math.floor(Number/div)
    end

    if Negative then  i= i+1  end
    local x= right - i*4
    gui.box(x+1, y-1, right+1, y+5,bkgnd,bkgnd)

    i= 1
    while Draw[Digit[i]] do
        Draw[Digit[i]](right-2,y,c)
        right= right-4
        i=i+1
    end

    if Negative then
        gui.line(right, y+2,right-2,y+2,c)
        right= right-4
    end
    return right
end
--*****************************************************************************
local function DrawNum(right, y, Number, c, bkgnd)
--*****************************************************************************
-- Paints the input number as right-aligned. Decimal version.
    return __DN_AnyBase(right, y, Number, c, bkgnd, 10)
end
--*****************************************************************************
local function DrawNumx(right, y, Number, c, bkgnd)
--*****************************************************************************
-- Paints the input number as right-aligned. Hexadecimal version.
    return __DN_AnyBase(right, y, Number, c, bkgnd, 16)
end

local LightTimer= {  -- Specifically for submission #4606
  [ 42560]= true, [ 79730]= true, [ 95500]= true,
  [105070]= true, [123900]= true, [165200]= true
}

local R1u= memory.readbyte
local R2u= memory.readword
local VirtueClr= {
[0]="cyan",   "yellow", "red",    "green",
    "orange", "purple", "white",  "grey",
}
--*****************************************************************************
while true do
--*****************************************************************************

--Blind light switch
--    if LightTimer[emu.framecount()] then  memory.writebyte(0x68e7, 255)  end

--Virtue related stuff
    local runes= R1u(0x681A)
    local stone= R1u(0x6819)
    for i= 0, 7 do
        local y= 38+7*i
        DrawNum(11,y,R1u(0x680C+i),VirtueClr[i],"black")
        gui.box(13,y-1,18,y+5,"black","black")
        if bit.band(runes,bit.lshift(1,i)) ~= 0 then
            gui.line(13,y+1,13,y+4,VirtueClr[i])
        end
        if bit.band(stone,bit.lshift(1,i)) ~= 0 then
            gui.line( 16,y+1,16,y+3,VirtueClr[i])
            gui.pixel(15,y+2,VirtueClr[i])
            gui.pixel(17,y+2,VirtueClr[i])
        end
    end

--Other stats
    DrawNum( 30,  9,R1u(0x0063),"white","black") -- Wind timer
--    DrawNum(180,  9,R1u(0x0062),"white","black") -- Wind direction
    gui.box( 32,9, 35,13,"black","black")
    local w= R1u(0x0062)
    if w ~= 0 then gui.pixel(32,11,"white") end
    if w ~= 1 then gui.pixel(34,11,"white") end
    if w ~= 2 then gui.pixel(33,10,"white") end
    if w ~= 3 then gui.pixel(33,12,"white") end

    DrawNum(254,  9,R1u(0x00D9),"white","black") -- Encounter timer
    DrawNum(254,226,R2u(0x6827),"white","black") -- Money
    DrawNum(254,219,R2u(0x687B),"white","black") -- HP
    DrawNum(254,212,R1u(0x6896),"white","black") -- MP
    for i= 0, 7 do
        DrawNum(  7,100+7*i,R1u(0x681F+i),"white","black") -- Reagents
    end

    emu.frameadvance()
end