From bab3bda5642121f85cf1c3be9f736ee9f4ee16d3 Mon Sep 17 00:00:00 2001 From: makiki Date: Sat, 17 Aug 2024 18:37:43 +0200 Subject: [PATCH] basic engine done --- conf.lua | 51 +++++++ game.lua | 262 ++++++++++++++++++++++++++++++++++++ leveldata.lua | 105 +++++++++++++++ main.lua | 47 +++++++ res/font/CREDITS.md | 1 + res/font/VictoriaBold.png | Bin 0 -> 3275 bytes res/font/digits.png | Bin 0 -> 8510 bytes res/sprite/crown.png | Bin 0 -> 1571 bytes res/sprite/elixir.png | Bin 0 -> 5182 bytes res/sprite/enemy.png | Bin 0 -> 5803 bytes res/sprite/enemy_neg.png | Bin 0 -> 6658 bytes res/sprite/gate.png | Bin 0 -> 5507 bytes res/sprite/pickaxe.png | Bin 0 -> 5172 bytes res/sprite/pickaxe_held.png | Bin 0 -> 600 bytes res/sprite/player.png | Bin 0 -> 4421 bytes res/sprite/stairs_down.png | Bin 0 -> 635 bytes res/sprite/stairs_up.png | Bin 0 -> 4396 bytes res/sprite/vorpal_held.png | Bin 0 -> 586 bytes res/sprite/vorpal_sword.png | Bin 0 -> 6974 bytes util.lua | 20 +++ 20 files changed, 486 insertions(+) create mode 100644 conf.lua create mode 100644 game.lua create mode 100644 leveldata.lua create mode 100644 main.lua create mode 100644 res/font/CREDITS.md create mode 100644 res/font/VictoriaBold.png create mode 100644 res/font/digits.png create mode 100644 res/sprite/crown.png create mode 100644 res/sprite/elixir.png create mode 100644 res/sprite/enemy.png create mode 100644 res/sprite/enemy_neg.png create mode 100644 res/sprite/gate.png create mode 100644 res/sprite/pickaxe.png create mode 100644 res/sprite/pickaxe_held.png create mode 100644 res/sprite/player.png create mode 100644 res/sprite/stairs_down.png create mode 100644 res/sprite/stairs_up.png create mode 100644 res/sprite/vorpal_held.png create mode 100644 res/sprite/vorpal_sword.png create mode 100644 util.lua diff --git a/conf.lua b/conf.lua new file mode 100644 index 0000000..cbb77f1 --- /dev/null +++ b/conf.lua @@ -0,0 +1,51 @@ +function love.conf(t) + t.identity = nil -- The name of the save directory (string) + t.appendidentity = false -- Search files in source directory before save directory (boolean) + t.version = "11.5" -- The LÖVE version this game was made for (string) + t.console = false -- Attach a console (boolean, Windows only) + t.accelerometerjoystick = true -- Enable the accelerometer on iOS and Android by exposing it as a Joystick (boolean) + t.externalstorage = false -- True to save files (and read from the save directory) in external storage on Android (boolean) + t.gammacorrect = false -- Enable gamma-correct rendering, when supported by the system (boolean) + + t.audio.mic = false -- Request and use microphone capabilities in Android (boolean) + t.audio.mixwithsystem = true -- Keep background music playing when opening LOVE (boolean, iOS and Android only) + + t.window.title = "GMTK2024" -- The window title (string) + t.window.icon = nil -- Filepath to an image to use as the window's icon (string) + t.window.width = 496 -- The window width (number) + t.window.height = 518 -- The window height (number) + t.window.borderless = false -- Remove all border visuals from the window (boolean) + t.window.resizable = true -- Let the window be user-resizable (boolean) + t.window.minwidth = 248 -- Minimum window width if the window is resizable (number) + t.window.minheight = 257 -- Minimum window height if the window is resizable (number) + t.window.fullscreen = false -- Enable fullscreen (boolean) + t.window.fullscreentype = "desktop" -- Choose between "desktop" fullscreen or "exclusive" fullscreen mode (string) + t.window.vsync = 1 -- Vertical sync mode (number) + t.window.msaa = 0 -- The number of samples to use with multi-sampled antialiasing (number) + t.window.depth = nil -- The number of bits per sample in the depth buffer + t.window.stencil = nil -- The number of bits per sample in the stencil buffer + t.window.display = 1 -- Index of the monitor to show the window in (number) + t.window.highdpi = false -- Enable high-dpi mode for the window on a Retina display (boolean) + t.window.usedpiscale = true -- Enable automatic DPI scaling when highdpi is set to true as well (boolean) + t.window.x = nil -- The x-coordinate of the window's position in the specified display (number) + t.window.y = nil -- The y-coordinate of the window's position in the specified display (number) + + t.modules.audio = true -- Enable the audio module (boolean) + t.modules.data = true -- Enable the data module (boolean) + t.modules.event = true -- Enable the event module (boolean) + t.modules.font = true -- Enable the font module (boolean) + t.modules.graphics = true -- Enable the graphics module (boolean) + t.modules.image = true -- Enable the image module (boolean) + t.modules.joystick = false -- Enable the joystick module (boolean) + t.modules.keyboard = true -- Enable the keyboard module (boolean) + t.modules.math = true -- Enable the math module (boolean) + t.modules.mouse = true -- Enable the mouse module (boolean) + t.modules.physics = false -- Enable the physics module (boolean) + t.modules.sound = true -- Enable the sound module (boolean) + t.modules.system = true -- Enable the system module (boolean) + t.modules.thread = false -- Enable the thread module (boolean) + t.modules.timer = true -- Enable the timer module (boolean), Disabling it will result 0 delta time in love.update + t.modules.touch = true -- Enable the touch module (boolean) + t.modules.video = true -- Enable the video module (boolean) + t.modules.window = true -- Enable the window module (boolean) +end \ No newline at end of file diff --git a/game.lua b/game.lua new file mode 100644 index 0000000..0b3c0ff --- /dev/null +++ b/game.lua @@ -0,0 +1,262 @@ +local LevelData = require "leveldata" + +local Game = {} + +Game.__index = Game + +MAX_POWER = 999999999999 + +local player_spr = love.graphics.newImage("res/sprite/player.png") +local ent_spr = { + enemy = love.graphics.newImage("res/sprite/enemy.png"), + enemy_neg = love.graphics.newImage("res/sprite/enemy_neg.png"), + elixir = love.graphics.newImage("res/sprite/elixir.png"), + gate = love.graphics.newImage("res/sprite/gate.png"), + vorpal = love.graphics.newImage("res/sprite/vorpal_sword.png"), + pickaxe = love.graphics.newImage("res/sprite/pickaxe.png"), + stairs_up = love.graphics.newImage("res/sprite/stairs_up.png"), + stairs_down = love.graphics.newImage("res/sprite/stairs_down.png"), +} + +local held_spr = { + vorpal = love.graphics.newImage("res/sprite/vorpal_held.png"), + pickaxe = love.graphics.newImage("res/sprite/pickaxe_held.png"), +} + +function Game.new() + local self = { + player_power = 5, + player_x = 8, + player_y = 15, + player_item = nil, + floor = 1, + level_data = LevelData:new(), + undo_history = {}, + } + setmetatable(self, Game) + return self +end + +function Game:keypressed(key,scancode,isrepeat) + if true then + if scancode=="up" or scancode=="k" or scancode=="w" or scancode=="kp8" then + self:step(0,-1) + elseif scancode=="down" or scancode=="j" or scancode=="s" or scancode=="kp2" then + self:step(0,1) + elseif scancode=="left" or scancode=="h" or scancode=="a" or scancode=="kp4" then + self:step(-1,0) + elseif scancode=="right" or scancode=="l" or scancode=="d" or scancode=="kp6" then + self:step(1,0) + elseif scancode=="z" then + self:undo() + end + end +end + +function Game:step(ox,oy) + tx = self.player_x + ox + ty = self.player_y + oy + --check if border + if tx < 1 or ty < 1 or tx > 15 or ty > 15 then + return + end + -- check if reinforced wall + if self.level_data[self.floor].walls[ty][tx]==2 then + return + end + -- check if normal wall + if self.level_data[self.floor].walls[ty][tx]==1 then + if self.player_item == "pickaxe" then + --push to undo memory + --remove wall + self.level_data[self.floor].walls[ty][tx]=0 + --remove item + self.player_item = nil + end + return + end + --check if entity + local move_legal = true + local entities = self.level_data[self.floor].entities + for i=1,#entities do + if entities[i].x == tx and entities[i].y == ty then + if entities[i].type == nil then --removed entity + break + elseif entities[i].type == "enemy" then + if self.player_item == "vorpal" then + --push to undo memory + --remove entity + entities[i].type = nil + --remove item + self.player_item = nil + break + elseif entities[i].value >= self.player_power then + return + else + --push to undo memory + --remove entity + entities[i].type = nil + --absorb power + self.player_power = self.player_power + entities[i].value + break + end + elseif entities[i].type == "enemy_neg" then + if self.player_item == "vorpal" then + --push to undo memory + --remove entity + entities[i].type = nil + --remove item + self.player_item = nil + break + elseif entities[i].value >= self.player_power then + return + else + --push to undo memory + --remove entity + entities[i].type = nil + --absorb power + self.player_power = self.player_power - entities[i].value + break + end + elseif entities[i].type == "elixir" then + --push to undo memory + --remove entity + entities[i].type = nil + --double power + self.player_power = self.player_power * 2 + break + elseif entities[i].type == "gate" then + --push to undo memory + --remove entity + entities[i].type = nil + --divide power by two + self.player_power = math.ceil(self.player_power / 2) + break + elseif entities[i].type == "pickaxe" then + --can't pick up if you have an item + if self.player_item then + return + end + --push to undo memory + --remove entity + entities[i].type = nil + --equip item + self.player_item = "pickaxe" + break + elseif entities[i].type == "vorpal" then + --can't pick up if you have an item + if self.player_item then + return + end + --push to undo memory + --remove entity + entities[i].type = nil + --equip item + self.player_item = "vorpal" + break + elseif entities[i].type == "stairs_up" then + self.floor = self.floor + 1 + break + elseif entities[i].type == "stairs_down" then + self.floor = self.floor - 1 + break + else + return + end + end + end + --ensure the power cap is upheld to + self.player_power = math.min(self.player_power,MAX_POWER) + --move if possible + if move_legal then + self.player_x = tx + self.player_y = ty + end +end + +function Game:undo() + if #self.undo_history == 0 then + return + end + +end + +function Game:update(dt) +end + +function Game:draw() + love.graphics.setLineWidth(2) + love.graphics.push() + + --floor and walls + love.graphics.setColor(1,1,1,1) + love.graphics.rectangle("fill",0,0,248,248) + local walls = self.level_data[self.floor].walls + for x=1,15 do + for y=1,15 do + if walls[y][x]==2 then + love.graphics.setColor(1,1,1,1) + elseif walls[y][x]==1 and (x+y+self.floor)%2==0 then + love.graphics.setColor(0.85,0.85,0.85,1) + elseif walls[y][x]==1 then + love.graphics.setColor(0.95,0.95,0.95,1) + elseif (x+y+self.floor)%2==0 then + love.graphics.setColor(0.05,0.05,0.05,1) + else + love.graphics.setColor(0.15,0.15,0.15,1) + end + love.graphics.rectangle("fill",x*16-12,y*16-12,16,16) + if walls[y][x]==2 then + love.graphics.setColor(0,0,0,1) + love.graphics.rectangle("fill",x*16-10,y*16-10,2,2) + love.graphics.rectangle("fill",x*16-10,y*16,2,2) + love.graphics.rectangle("fill",x*16,y*16-10,2,2) + love.graphics.rectangle("fill",x*16,y*16,2,2) + end + end + end + + --entities + love.graphics.setFont(FONT_DIGITS) + local entities = self.level_data[self.floor].entities + for i=1,#entities do + if entities[i].type then + --sprite + love.graphics.setColor(1,1,1,1) + love.graphics.draw(ent_spr[entities[i].type],entities[i].x*16-12,entities[i].y*16-12) + --value + if entities[i].value_str then + love.graphics.setColor(0,0,0,1) + love.graphics.printf(entities[i].value_str,entities[i].x*16-10,entities[i].y*16-1,16,"right") + love.graphics.printf(entities[i].value_str,entities[i].x*16-12,entities[i].y*16-1,16,"right") + love.graphics.printf(entities[i].value_str,entities[i].x*16-11,entities[i].y*16,16,"right") + love.graphics.printf(entities[i].value_str,entities[i].x*16-11,entities[i].y*16-2,16,"right") + love.graphics.printf(entities[i].value_str,entities[i].x*16-10,entities[i].y*16,16,"right") + love.graphics.printf(entities[i].value_str,entities[i].x*16-10,entities[i].y*16-2,16,"right") + love.graphics.printf(entities[i].value_str,entities[i].x*16-12,entities[i].y*16,16,"right") + love.graphics.printf(entities[i].value_str,entities[i].x*16-12,entities[i].y*16-2,16,"right") + love.graphics.setColor(1,1,1,1) + love.graphics.printf(entities[i].value_str,entities[i].x*16-11,entities[i].y*16-1,16,"right") + end + end + end + + --player + love.graphics.setColor(1,1,1,1) + love.graphics.draw(player_spr,self.player_x*16-12,self.player_y*16-12) + + --player info + love.graphics.setColor(1,1,1,1) + love.graphics.setFont(FONT_STANDARD) + love.graphics.print("FLOOR "..(self.floor>9 and self.floor or " "..self.floor).." POWER:"..player_power_to_string(self.player_power),1,249) + + --held item + if self.player_item then + love.graphics.draw(held_spr[self.player_item],72,250) + end + + love.graphics.pop() + love.graphics.setColor(1,1,1,1) +end + +return Game diff --git a/leveldata.lua b/leveldata.lua new file mode 100644 index 0000000..dac8f8c --- /dev/null +++ b/leveldata.lua @@ -0,0 +1,105 @@ +LevelData = {} + +LevelData.__index = LevelData + +function LevelData.new() + local self = { + { --floor 1 + walls = { + {0,0,0,0,0,1,2,2,2,1,0,0,0,0,0}, + {0,0,0,0,0,0,2,0,2,0,0,0,0,0,0}, + {1,1,1,1,1,0,2,0,2,0,1,1,1,1,1}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,2,2,2}, + {0,0,0,0,0,0,0,0,0,0,0,0,1,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,2,0,0}, + }, + entities = { + {type = "enemy", x = 1, y = 1, value_str = "1"}, + {type = "enemy", x = 2, y = 1, value_str = "2"}, + {type = "enemy", x = 3, y = 1, value_str = "3"}, + {type = "enemy", x = 4, y = 1, value_str = "4"}, + {type = "enemy", x = 5, y = 1, value_str = "5"}, + {type = "enemy_neg", x = 11, y = 1, value_str = "1"}, + {type = "enemy_neg", x = 12, y = 1, value_str = "2"}, + {type = "enemy_neg", x = 13, y = 1, value_str = "3"}, + {type = "enemy_neg", x = 14, y = 1, value_str = "4"}, + {type = "enemy_neg", x = 15, y = 1, value_str = "5"}, + + {type = "elixir", x = 14, y = 14}, + {type = "elixir", x = 14, y = 15}, + {type = "elixir", x = 15, y = 14}, + {type = "elixir", x = 15, y = 15}, + + {type = "stairs_up", x = 8, y = 2}, + {type = "gate", x = 8, y = 3}, + }, + textboxes = {} + }, + { --floor 2 + walls = { + {0,0,0,0,0,0,2,2,2,0,0,0,0,0,0}, + {0,0,0,0,0,0,2,0,2,0,0,0,0,0,0}, + {0,0,0,0,0,0,2,0,2,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {2,2,2,0,0,0,0,0,0,0,0,0,2,2,2}, + {2,1,2,0,0,0,0,0,0,0,0,0,2,1,2}, + {2,2,2,0,0,0,0,0,0,0,0,0,2,2,2}, + }, + entities = { + {type = "vorpal", x = 4, y = 8}, + {type = "pickaxe", x = 12, y = 8}, + + {type = "stairs_down", x = 8, y = 2}, + }, + textboxes = {} + }, + } + + --convert value_str into value + for f=1,#self do + local entities = self[f].entities + for e=1,#entities do + if entities[e].value_str then + arr = {} + num = 0 + for i=1,#entities[e].value_str do + arr[i] = entities[e].value_str:sub(i,i) + end + for i=1,#arr do + if arr[i]=="G" then + num = num * 1000 * 1000 * 1000 + elseif arr[i]=="M" then + num = num * 1000 * 1000 + elseif arr[i]=="k" then + num = num * 1000 + else + num = num*10+arr[i] + end + end + -- print("converted value_str "..entities[e].value_str.." into value "..num) + entities[e].value = num + end + end + end + setmetatable(self, LevelData) + return self +end + +return LevelData \ No newline at end of file diff --git a/main.lua b/main.lua new file mode 100644 index 0000000..215f09a --- /dev/null +++ b/main.lua @@ -0,0 +1,47 @@ +local bit = require "bit" +local Game = require "game" + +require "util" + +BASE_RES_W = 248 +BASE_RES_H = 257 + +FONT_CHARACTERS = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" +FONT_STANDARD = love.graphics.newImageFont("res/font/VictoriaBold.png", FONT_CHARACTERS, -1) + +DIGITFONT_CHARACTERS = "0123456789x[].kMG" +FONT_DIGITS = love.graphics.newImageFont("res/font/digits.png", DIGITFONT_CHARACTERS, 1) + +love.keyboard.setKeyRepeat(true) +love.graphics.setDefaultFilter("nearest","nearest",0) + +main_canvas = love.graphics.newCanvas() + +local game = Game.new() + +function love.keypressed(key,scancode,isrepeat) + game:keypressed(key,scancode,isrepeat) +end + +function love.update(dt) + game:update(dt) +end + +function love.draw() + love.graphics.setCanvas(main_canvas) + love.graphics.clear() + love.graphics.setLineWidth(2) + + game:draw() + + --draw canvas on the main window + love.graphics.setScissor() + love.graphics.setCanvas() + local w, h = love.graphics.getWidth(), love.graphics.getHeight() + local s = math.min(w/BASE_RES_W,h/BASE_RES_H) + local s = math.floor(s) + love.graphics.translate((w-BASE_RES_W*s)/2,(h-BASE_RES_H*s)/2) + love.graphics.scale(s, s) + love.graphics.clear() + love.graphics.draw(main_canvas) +end \ No newline at end of file diff --git a/res/font/CREDITS.md b/res/font/CREDITS.md new file mode 100644 index 0000000..8755ef8 --- /dev/null +++ b/res/font/CREDITS.md @@ -0,0 +1 @@ +The Victoria Bold bitmap font has been taken from https://opengameart.org/content/a-package-of-8-bit-fonts-for-grafx2-and-linux and it available under CC-0 (Public Domain) license. diff --git a/res/font/VictoriaBold.png b/res/font/VictoriaBold.png new file mode 100644 index 0000000000000000000000000000000000000000..3eef0c50eccd3eb71ce7e3434c16e93650fa75f1 GIT binary patch literal 3275 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 literal 0 HcmV?d00001 diff --git a/res/sprite/crown.png b/res/sprite/crown.png new file mode 100644 index 0000000000000000000000000000000000000000..fb72659fdeec11307226c5fb260a9ec9de7ac5dd GIT binary patch literal 1571 zcmV+;2Hg3HP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGmg6W4hTpY{SppIl!E(5sGdq~&_YWqiB%Mw< zRo(N{<`}TRlF%nPq5j{$gZ{xKEJDs}3@HSI%O#g2V-n4A<<+xstKSdiGP#q}bwMDq z813;G!o>(-MY_cw}C-wWk_A#X(zw}FerZOHOrz_hI>Z$(zNWp_N6Z8@Z< zw?}A~6T~fv$4#?yRwekr>d-qesv%(>#W+RW+H`bON%K8l4n2?0blEEKNxEfg(2Lz( z+T+esj^0=($2?#z*027EuOT3V3-CPc*miS`=3Q*ARGwdS=2$x&?r>jcI}PZkg@-f< zear0wy>K0uoE{h0KgYe8-gu<$YFO?(Y9BVtE!KID(c&2WI9+xDM-KZ?my<9pl%tiI z1naecrno)kx>`buD3^*HYo?llRynZ%i->LPL|d+VL|K6v%fC!d22j!tf}TE%{J6=3r$;WspZZc zsnlKf)I--Ed+K>0*M=Q#_z{MVIMT>hYMbg$?G0+YsmUTW_vw`yq^ieAD_@{wG6OMj z4B|QoAfaV4Gm)K>Np3PTNl+DD;G~~y8k@{P99h>{{NO9Q4{~pDqu^e0le6S#qWdPf z#f`eZ;r4`Dn?Kui5j(1I#?)9;AJ%)!67&2O&2*W3cl@j9|57x{p#CU}UsFft?7c9z zSLyZgd0*+QFE7-rU3A*&Crar{uRU3%v%&mKC7lBPT-lui^d_%guF@NHUiwF0_26-p z-VX0CM*2LE=lr8HFP-u0+X;CQ(Yd@m6Qkeob^Jq$o}Bxgk-qbJJwxrUqTi=z;EzwD zAAu16DM>t0hyVZqglR)VP)S2WAaHVTW@&6?004NLeUUv#!$2IxUt6W6R2}S4ibIC# zWI{K$3L+gyERJ_<8D$U1@yky_Qx;~+yz<< z+x|Yb?bZnpcm}Stj(?*GOn;Kz=xB)}U|<`#xbA539&ot>#GZ7?kQ^yM(_bn9?`QN) z1z_+N2(P-mwfAxQ0OY8v%nfjG2#k~|d(GqBq3+)PJ=5;*2R9LNkDUpt&j0`b24YJ` zL;wH)0002_L%V+f000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jmI}4jC4!Px3hc z000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0001TNklv6AP zC^1E@6vRWb5~~WOqatUgW3ur@v^NiC`CbDxM(IT|aN(iafeoO>xHVBM)wzQ2aRW)T VMFWcV9nAm$002ovPDHLkV1kNQ)$;%V literal 0 HcmV?d00001 diff --git a/res/sprite/elixir.png b/res/sprite/elixir.png new file mode 100644 index 0000000000000000000000000000000000000000..c9bc18d69df05a95536044bef37b9fe7f129ed8d GIT binary patch literal 5182 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 J_oJrH|1Wa7oQnVe literal 0 HcmV?d00001 diff --git a/res/sprite/gate.png b/res/sprite/gate.png new file mode 100644 index 0000000000000000000000000000000000000000..5319592b17970845b076a3a4d8b5602985a2f4ca GIT binary patch literal 5507 zcmeHLe{dAl9p5BW;#nfeU@2H+-HebF_x9)QFLT8FBsXw011AI=3vYMdC0lYo*xTeT zaoUC-QbGJtI;2o2VzuKapaWHz1_eRWSWBy&`eUqZhY4-1Sk$(*ww5&g?%w5+49;{? zfxogh@AmEYectDNf4%R$+pWz@7ftic_7MazE!0%M4DQq2R(utF&;8plB8Y++xFr+~ zg}zJ_gX|g*Od$$#xPmeL!h#~A2;@7Ul@t^bWpLjGtqkNY-fgoBKIh#ZhyL}s{t@U` z!&defKK%K6N%m4mQcO<+PEDLg8lOLM1`m4&x(t zS4i@Hj`a%)FtWU;v5LmYBqwX4pot1mNNm|Lm6!!{K7m%Se^g(1%wHF;RC)e%1>iSZ zb#=|5x;ipxC!$t6CWy@5uYWt(^un!Q>R+?GpV~>CCkG#RsIP72b?Xn_R#AIb^Ma?& zt+j_X&zlz7cF)6SRwq9+4xc+Sc<{ic17z_xdX!s~%D$$p!;5{iUZuQ0aO}?ekEMHF zJ;=ZQ=dDGLM`yij)}H?3ivHs(r?7WV|4C`@?#EsUE%WU=``!%;kN>Ve)BEv{s|Rj9 zzLtM}e%Zk8c*~2|zbNeK{YBS<%Bh#_egE8>Iko?qvTFN|_5Zpz^;5K=wQ>8B?tMz_ z&Aojs@9Hb0$e=aY_SM%b*1XiW_nl|^R~>p|)xY;$xa;J`XO5ii_+ELFUb^@JvbJW< zbrE!9wNLoIsD7b&lkcs+Y#KiKLHy@~uRXG7#uDN==9wYR z_tE*nLtA3socng?ds9BFE?T*IV9mP1A3gYptgZg2xHwic^UXQow~GAfo`>e&A(@N* z`l}h+8qN%DKVCU?b7I4P0!NSjW8u=dJ)iH`*;i0fvf*$Ue)7&|Z+Z2%Z=Y!W_0SNp z_pp6*ekoT&5T&nKkrt;VyhJk+F+VaBI`(H`NiU97)tMwR)?tU#ajO*%QXd>UL6Mdj zq*eyPY&cnm+pMN;8!zu(8Zo-p8LCNDFZ5MqG$4p!2a%ardpxCOf|SRrLEjZK6zM^n zbwR2HvaK#*V^Z{sewJ>?Se-nz&_`C;W>i~N-k2u#oOjzf>w?tuXn z4r}!Zqr+7%R3D_=^))kLSf=K6c|+zE&J<}*Smb39VV)mD6^f@E z6gRL-1>}AUcsS1FRRbd$xG*gWsz57Ifv1ro1yoTm1x}U5P<+Lrt78)|jwk2*PQ_P%CDV@m6oZb+}g3912pr zKMVCF&F#pE!h|5T#EN%hMxhZahL=0Y^(H6tg378Quc#t)brE| zglR>){ukQaJY*H%A>>U~%1PK=o+!JcmgDu=r|e_95SBQRHE1>3s}ze4s-eKQ4~Qo0#Sj691hST%bJjn3Z$o@V1ef) zY$(~F=e_m+*aHc`(=11GT!a-gUeQ?b%9&^yri^qRfr+{SA;YkHMGX6xH+d6bQT+!1Z0tp z>byyd282@AQ51qI3s{#qNinj&RG)P(jxo_YI*&K8igC{)Bh|Euxv1V|0b>p@P^Pjn zI2ge>i^(6fa`g-Jy_{FB&R@A8!G`xt}^@lg!gx5G%>5CWD6T|Lj|8tLi2P9V~n^vU=!e8#Tg3J%AJ3%XHRVh(JZH-#i>ig+<*MUMep-gZYY@vpxZ2rP<{VtLNtSBu^GC#$E6H^83k8dIySbzTdoi_qx_Vy2D>wOn?`-)2EJK7EmexN}yLRJ$ E0cJG|Y5)KL literal 0 HcmV?d00001 diff --git a/res/sprite/pickaxe.png b/res/sprite/pickaxe.png new file mode 100644 index 0000000000000000000000000000000000000000..fe9e4433668113c6be003b704c15565febe7d2ff GIT binary patch literal 5172 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 PAQDX~i4a$XB(3-l3RS5t literal 0 HcmV?d00001 diff --git a/res/sprite/pickaxe_held.png b/res/sprite/pickaxe_held.png new file mode 100644 index 0000000000000000000000000000000000000000..7b1c63632b669d3cf5070d67d541f2c32f1d2cad GIT binary patch literal 600 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 Y0Laug%6I_h0RR9107*qoM6N<$f;dp{J^%m! literal 0 HcmV?d00001 diff --git a/res/sprite/vorpal_sword.png b/res/sprite/vorpal_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..d6328e7f786565b7f35e1749b5f3455b6ecb6d5a GIT binary patch literal 6974 zcmeHMdsGuw8lUh=06{@~Axexd5GR?LOp?h+L?j>)Ls3{o-L6h%Zg47jm<$kHTi;r+ z>-uP`i+Yyox?1)09Br+uwkxjBs{3fWuCLW&b+u~uv|6pLU6H*rAt4~trK|nR$+@}r ze)s!+_xpYKySa0rrl@dCTugEdf*^60eDefYcN2>u3Vx^FZDJ5aA%Ieg-C`MrD4;AB zL1Yn#tXWSM(hie_BjHfK3YK_T7?KF2uoU)1+W+=y4tVPJfbOf0Sbpo|0R1#_& zQ)?-Rh!G@>Q8aE);(D6U)0iF!Lzb+PBYmLF_pr$7Tl|IH;Pd!Q(a0mj?~}+a5EqeP zATDA%5SJye9p21SjBZp&yGICrS(qR5HPN=YeM2;WkDqhX*`~`#x3PJaJUEdUSoqa+ z0m(rWQBm@!NQGQ3kB(NvbV-Wq5*yp4Ph$73N&S*j`}a#uNl^|`4^^s$4@^l(Go%m4 zaFQfbhZ;>3k*U^_ga{&wj*jjU+ogA0TyJ7P$^fF%Pg4Vupb&ium#L7j1X*~3tm!b4 z3jK_fNspfj?1zO%L`KOK(J`@5VRtt%QsH3{;gOLM5peWnIF3XlL?#Zvv!l9?XXL6` zNyPk>Zz%?j-g&UcgpY3z(%L)=qGNjY>fI-K@Q|Tt>BC5!-ar}Y9CL2on0(9F;*y_D zoK!k_3d;d|*$naOz>!07adF#&Cckg|3|J&~# zd@u46c?KRovo^dEAg{29i0}xx$V(PhB@$1Fh#Y`NC1#J8Gqbv@i1~`7(JSBDc`$mQ zcEar*HqXZ~JqMAW4Zb5%lbHQ)#1{N0Wtyv`$C!ewyr!V{1zPY=*%eyw6+fguWGCT+t@i{p~mYf`=+vBqHt9}J z%0DzJ<;b++&AHoDl|{3T7j5|WM%D7&F}Yj2y|j2@zj5lu1w-O2waYeLp5ngE?!0yR z%8u;|w<{H|%%et7>HG3)nhIi2n~D1J*#2MsdVkftB8~RXw`yf|&UJ5_e}0Oabfh6; zLGMwiO9q@cMO+`0UbFn_7yU>6@ltN}#LvBRm;XXnhBpjNJhqlOf4J{q?Yj35R{xed zRl95KoWe}zlgOIXz3=!Q9^HF+SA+JDoz}gOGNfm$W5;`VMqTn9a+dkDaH1E{fBX79 z)XZzcW?ou-0DJw@NpJ2g^d?0Qw?!wK)3$D0M3kHP)0UkpHa7a?O|O2j=J@6n+avOp zN0!uQS2kXrdwc)Xj4a*F!Hchq`gYmXIj_m)zgR!syZ$To7{4BQRCal+>p@1v^!uyt zO(|HGB5S?K6Lw81xj*O?I?j5vGg!hy27#zy2<>pVNZS^Qucd^e2eOG<@O>o}TqIn)g2vH`Wv z;g-(6%q*XqVP^tCX#-`v)1>-p{{fYf=S-?eIxA*%=YSb}{%j8@o?TeN&YsB{IaSuk zm`ooH0USVJls-qf(@XnIDhZc{ZBeXIDJ2zQrb$%_-{x{$9-t)Eq#8qWeS9UM8X2R^ z^l)~1f;q1l0`^R*8G_)ZHJYlbDs`1s?edgqaHG+v!3YgOpil$#Ryzg8hdR9jMF>BJ z8F*O_?-qEMQz>FHHdlpUQmNp$GT@)XZM6pBo!;gsz<6kUj9Y`NF^$8a3AOMFxs?#4 z*`anVyd~9cpqT)?t_lweaw~yT7#Iq{u|a!xg{NGi!?7Ar4jfR`3unb!O)0+j1}(%8 zl<^L?WCerWN>kwNEx~H#n>ZrT33UXT2XR|z2e?bhP|Iqi%`Ub=bkAZosl@qd&c*T^ zEj0<&Ku|bGqPP)fP*Sf4D8uMDlp`rX5(bh11Q7ydae4*D$pR4yf~$FmW7q2SMv}3i zEC4o?Bry(UjD!(_0bCDQqaN7xArLQkc$k$;d8k(+6bGSL90QDwpimAYFbH60P=+A2 zC}$^h3}(>l0EbCX982f9JPrmfC+}d&fX3}ClLo|q)7eE9lZsILRV7JLIV0Gifk`!v zcUJgXR7-dVC>9tonz(_`8ZpwK*K3WG(HLSq5qP{X6Gcqv1|yk^%R)mkFtCi6rw~Ar zLoT#*O>ucjT&{AHDtPw^4qM@N;uwK3!&?&s4c>-I0=J_Qde0oi3Rjxbg* zJ*9i1GEG{j^w!!{GXRWp28N5#(L8%T6s0w=I=dFt;zk`xVq$6&6iiQ+0$PHA*-iNu zJs7PY!v`h+fnqp{<0Y7uCMX&se>#dB%NZCO!9a>O7A_gkq7(@LN)jBwF@Q7Z0n>UB z{(p*E9Zg_A9Yw}Q*%>XNM~!-$n3ceQ+Tc$KYSig$EJ;zMkpWMIB8g%YiW}N){~`9^0vYg^;5UCb(Y)k5qUBG4)2=h^kt!WGkU$p=pOZe9hi@Mna%7vUcOqHG0Y%t({?ssC`x zYAA_z=TG(`haMROR~@J+x;Ssp8ru>pS{(1JEIdE>ZZG4^>op&k*uOPY_crk_y7n*= zA1>^+<`FS1PhNn&i+YL*V{RyK-Y(g&G_8K>f5I==PnBc9WruzsmfS+~JENyB_%G_l BCCvZ; literal 0 HcmV?d00001 diff --git a/util.lua b/util.lua new file mode 100644 index 0000000..9395b54 --- /dev/null +++ b/util.lua @@ -0,0 +1,20 @@ +function player_power_to_string(n) + str = "" + while n > 999 do + last_segment = n%1000 + n = n - last_segment + if last_segment > 99 then + str = "." .. last_segment ..str + elseif last_segment > 9 then + str = ".0" .. last_segment ..str + else + str = ".00" .. last_segment ..str + end + n = n /1000 + end + str = n..str + while #str < 16 do + str = " "..str + end + return str +end \ No newline at end of file