263 lines
9.2 KiB
Lua
263 lines
9.2 KiB
Lua
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
|