Browse Source

day night cycle

master
Nicholas Hayashi 4 years ago
parent
commit
8d3e05270a
  1. 9
      main.lua
  2. 1
      sound.lua
  3. 8
      src/grid.lua
  4. 27
      src/mob.lua
  5. 26
      src/tower.lua

9
main.lua

@ -85,7 +85,7 @@ local function game_action(scene)
if WIN:mouse_pressed"left" then if WIN:mouse_pressed"left" then
if hot and is_buildable(hex, tile, nil) then if hot and is_buildable(hex, tile, nil) then
make_and_register_tower(hex, SELECTED_TOWER_TYPE)
build_tower(hex, SELECTED_TOWER_TYPE)
end end
end end
@ -141,6 +141,13 @@ local function game_action(scene)
end end
WIN.scene"coords".text = str WIN.scene"coords".text = str
end end
do_day_night_cycle()
end
function do_day_night_cycle()
local tstep = (math.sin(TIME) / PERF_STATS.avg_fps + 1)/8
WORLD"negative_mask".color = vec4(tstep)
end end
function game_end() function game_end()

1
sound.lua

@ -4,6 +4,7 @@ SOUNDS = {
EXPLOSION1 = 49179102, -- this slowed sounds metal as fuck EXPLOSION1 = 49179102, -- this slowed sounds metal as fuck
EXPLOSION2 = 19725402, EXPLOSION2 = 19725402,
EXPLOSION3 = 69338002, EXPLOSION3 = 69338002,
EXPLOSION4 = 92224102,
HIT1 = 25811004, HIT1 = 25811004,
LASER1 = 79859301, LASER1 = 79859301,
LASER2 = 86914201, LASER2 = 86914201,

8
src/grid.lua

@ -70,6 +70,7 @@ end
function grid_cost(map, from, to) function grid_cost(map, from, to)
local t1, t2 = map.get(from.x, from.y), map.get(to.x, to.y) local t1, t2 = map.get(from.x, from.y), map.get(to.x, to.y)
--local base_cost = math.abs(t1.elevation) * 10
return math.abs(10 * math.abs(t1.elevation)^0.5 - 10 * math.abs(t2.elevation)^0.5) return math.abs(10 * math.abs(t1.elevation)^0.5 - 10 * math.abs(t2.elevation)^0.5)
end end
@ -112,6 +113,13 @@ function random_map(seed)
node = node node = node
}) })
getmetatable(map).__index.neighbours = function(hex)
return table.filter(hex_neighbours(hex), function(_hex)
local tile = map.get(_hex.x, _hex.y)
return tile and tile.elevation > -0.5 and tile.elevation <= 0.5
end)
end
world:append(node) world:append(node)
end end
end end

27
src/mob.lua

@ -33,7 +33,7 @@ end
-- check if a the tile at |hex| is passable by |mob| -- check if a the tile at |hex| is passable by |mob|
function mob_can_pass_through(mob, hex) function mob_can_pass_through(mob, hex)
local tile = HEX_MAP.get(hex.x, hex.y) local tile = HEX_MAP.get(hex.x, hex.y)
return tile and tile.elevation < 0.5 and tile.elevation > -0.5
return tile and tile.elevation <= 0.5 and tile.elevation > -0.5
end end
function mob_die(mob, mob_index) function mob_die(mob, mob_index)
@ -49,15 +49,6 @@ function do_hit_mob(mob, damage, mob_index)
end end
end end
function check_for_broken_mob_pathing(hex)
for _,mob in pairs(MOBS) do
--if mob and mob.path[hex.x] and mob.path[hex.x][hex.y] then
--mob.path = get_mob_path(mob, HEX_MAP, mob.hex, HEX_GRID_CENTER)
--end
end
end
-- @TODO performance. -- @TODO performance.
-- try reducing map size by identifying key nodes (inflection points) -- try reducing map size by identifying key nodes (inflection points)
-- there are performance hits everytime we spawn a mob and it's Astar's fault -- there are performance hits everytime we spawn a mob and it's Astar's fault
@ -99,11 +90,21 @@ local function mob_update(mob, mob_index)
end end
local frame_target = mob.path[mob.hex.x] and mob.path[mob.hex.x][mob.hex.y] local frame_target = mob.path[mob.hex.x] and mob.path[mob.hex.x][mob.hex.y]
-- frame_target will be false when we are one hex away from the center,
-- or nil if something went wrong
if frame_target == false then
frame_target = { hex = HEX_GRID_CENTER, priority = 0 }
if frame_target --[[and mob_can_pass_through(mob, frame_target.hex)]] then
local factor = 1 + mob.speed * (1/frame_target.priority) / PERF_STATS.avg_fps
mob.position = mob.position + math.normalize(hex_to_pixel(frame_target.hex) - mob.position) * factor
elseif frame_target == nil then
log("bad")
elseif mob_can_pass_through(mob, frame_target.hex) then
-- this is supposed to achieve frame rate independence, but i have no idea if it actually does
local rate = 1 + mob.speed * (1/frame_target.priority) / PERF_STATS.avg_fps
mob.position = mob.position + math.normalize(hex_to_pixel(frame_target.hex) - mob.position) * rate
mob.node.position2d = mob.position mob.node.position2d = mob.position
else else
mob.path = get_mob_path(mob, HEX_MAP, mob.hex, HEX_GRID_CENTER) mob.path = get_mob_path(mob, HEX_MAP, mob.hex, HEX_GRID_CENTER)
end end

26
src/tower.lua

@ -1,4 +1,13 @@
--[[
tower(entity) structure:
{
-- @NOTE these should probably be wrapped in a 'weapon' struct or something, so towers can have multiple weapons
range - number - distance it can shoot
last_shot_time - number - timestamp (seconds) of last time it shot
target_index - number - index of entity it is currently shooting
}
--]]
TOWER_TYPE = { TOWER_TYPE = {
REDEYE = 1, REDEYE = 1,
@ -41,17 +50,6 @@ local function make_tower_sprite(tower_type)
end end
end end
--[[
tower(entity) structure:
{
-- @NOTE these should probably be wrapped in a 'weapon' struct or something, so towers can have multiple weapons
range - number - distance it can shoot
last_shot_time - number - timestamp (seconds) of last time it shot
target_index - number - index of entity it is currently shooting
}
--]]
function is_buildable(hex, tile, tower) function is_buildable(hex, tile, tower)
local blocked = #mobs_on_hex(hex) ~= 0 local blocked = #mobs_on_hex(hex) ~= 0
return not blocked and tile.elevation <= 0.5 and tile.elevation > -0.5 return not blocked and tile.elevation <= 0.5 and tile.elevation > -0.5
@ -102,8 +100,12 @@ function make_and_register_tower(hex, tower_type)
-- make this cell impassable -- make this cell impassable
HEX_MAP[hex.x][hex.y].elevation = 2 HEX_MAP[hex.x][hex.y].elevation = 2
check_for_broken_mob_pathing(hex)
register_entity(TOWERS, tower) register_entity(TOWERS, tower)
end end
function build_tower(hex, tower_type)
make_and_register_tower(hex, tower_type)
WIN.scene:action(am.play(am.sfxr_synth(SOUNDS.EXPLOSION4)))
end
Loading…
Cancel
Save