cirnofarm/src/game.lua

309 lines
7.3 KiB
Lua
Raw Normal View History

2024-04-24 11:11:16 +02:00
--cd("/cirnofarm/src")
--include("/cirnofarm/src/cirno.lua")
function make_path(name)
local base_path = "/cirnofarm/src/" -- Change this when releasing
return base_path .. name
end
local _modules = {}
function loadfile (filename)
local src = fetch(filename)
if (type(src) ~= "string") then
notify("could not include "..filename)
stop()
return
end
-- https://www.lua.org/manual/5.4/manual.html#pdf-load
-- chunk name (for error reporting), mode ("t" for text only -- no binary chunk loading), _ENV upvalue
-- @ is a special character that tells debugger the string is a filename
local func,err = load(src, "@"..filename, "t", _ENV)
-- syntax error while loading
if (not func) then
send_message(3, {event="report_error", content = "*syntax error"})
send_message(3, {event="report_error", content = tostr(err)})
stop()
return
end
return func
end
function require(name)
local already_imported = _modules[name]
if already_imported ~= nil then
return already_imported
end
local filename = fullpath(name:gsub ('%.', '/') ..'.lua')
local func = loadfile (filename)
local module = func(name)
_modules[name]=module
return module
end
--local strawberry = require(make_path("strawberry"))
--strawberry.func()
2024-04-26 14:52:31 +02:00
local Cirno = require(make_path("cirno"))
2024-04-24 11:11:16 +02:00
local mouse_debug = require(make_path("mouse_debug"))
2024-04-25 23:07:49 +02:00
local map_manager = require(make_path("map"))
local weapons_manager = require(make_path("weapons"))
2024-04-26 11:22:51 +02:00
local Barrel = require(make_path("barrel"))
2024-04-26 14:24:25 +02:00
local Strawberry = require(make_path("strawberry"))
2024-04-27 23:05:15 +02:00
local Box = require(make_path("box"))
2024-04-24 11:11:16 +02:00
2024-04-27 18:36:48 +02:00
include(make_path("pgui" .. ".lua"))
2024-04-28 21:28:25 +02:00
particles_list = {
BLINK={
life=4,
spriteIndex=81
},
EXPLOSION={
life=8,
spriteIndex=83
}
}
bullets_list = {
BASIC={
spriteIndex=80,
damage=1,
speed=2,
life=100,
radius=4,
particle=particles_list.BLINK
}
}
weapons_list = {
ICE_BLASTER={
name = "Ice Blaster",
rate_of_fire = 8,
bullet=bullets_list.BASIC,
spriteIndex=104,
--shoot=function(self,x,y,dir_x,dir_y)
-- create_bullet(self.bullet, x, y, dir_x, dir_y)
--end
},
SPAGHETTI={
name = "Spaghetti",
rate_of_fire = 80,
bullet=bullets_list.BASIC,
spriteIndex=105,
}
}
LAYERS = {
{index=4, name="background", render=true, render_objects=false, spawn_objects=false},
{index=3, name="solid", render=true, render_objects=true, spawn_objects=false},
{index=2, name="foreground", render=true, render_objects=false, spawn_objects=false},
{index=1, name="objects", render=false, render_objects=false, spawn_objects=true}
}
actors_db = {
{name="teleporter",sprite=88,actor=nil},
{name="barrel",sprite=3,actor=Barrel},
{name="strawberry",sprite=72,actor=Strawberry},
{name="player",sprite=65,actor=nil},
{name="box",sprite=4,actor=Box},
{name="alarm",sprite=19,actor=nil},
{name="fan",sprite=16,actor=nil}
}
2024-04-24 11:11:16 +02:00
tile_width = 16
tile_height = 16
2024-04-14 15:51:45 +02:00
function _init()
2024-04-26 11:22:51 +02:00
spawn_objects()
2024-04-26 14:52:31 +02:00
cirnoInstance = Cirno.init()
add(actors,cirnoInstance)
2024-04-27 18:36:48 +02:00
slidervalue = 10
2024-04-14 15:51:45 +02:00
end
function _update()
2024-04-26 14:52:31 +02:00
--cirno.update()
2024-04-27 18:36:48 +02:00
pgui:refresh()
2024-04-25 23:07:49 +02:00
weapons_manager.update()
2024-04-26 11:30:53 +02:00
2024-04-26 13:31:42 +02:00
for a in all(actors) do
a:update()
end
for b in all(bullets) do
2024-04-26 11:30:53 +02:00
b:update()
end
2024-04-26 13:31:42 +02:00
for p in all(particles) do
p:update()
end
2024-04-27 18:36:48 +02:00
2024-04-28 17:06:07 +02:00
check_collisions()
2024-04-27 18:36:48 +02:00
--slidervalue = pgui:component("hslider",{pos=vec(190,20),value=slidervalue})
2024-04-28 12:38:34 +02:00
pgui:component("vstack",{stroke=true,pos=vec(0,0),color={0,18,12,0,7,6},height=0,margin=3,gap=3,contents={
{"text_box",{text=string.format("x: %.2f y: %.2f", cirnoInstance.x, cirnoInstance.y),margin=2,stroke=true,active=false,hover=false},color={0,18,12,0,7,6}},
{"text_box",{text=string.format("mx: %.2f my: %.2f", cirnoInstance.move_x, cirnoInstance.move_y),margin=2,stroke=true,active=false,hover=false}},
2024-04-27 18:36:48 +02:00
{"text_box",{text=string.format("Actors: %d", count(actors)),margin=2,stroke=true,active=false,hover=false}},
{"text_box",{text=string.format("%.4f %dfps",stat(1),stat(7)),margin=2,stroke=true,active=false,hover=false}},
{"text_box",{text=string.format("Bullets: %d", count(bullets)),margin=2,stroke=true,active=false,hover=false}},
2024-04-28 21:28:25 +02:00
{"text_box",{text=string.format("Particles: %d", count(particles)),margin=2,stroke=true,active=false,hover=false}},
2024-04-28 15:57:46 +02:00
{"text_box",{text=string.format("Weapon: %s", cirnoInstance.weapon.data.name),margin=2,stroke=true,active=false,hover=false}},
2024-04-28 16:09:45 +02:00
{"text_box",{text=string.format("Weapon timer: %d", cirnoInstance.weapon.timer),margin=2,stroke=true,active=false,hover=false}},
2024-04-28 15:57:46 +02:00
{"sprite_box",{sprite=cirnoInstance.weapon.data.spriteIndex,margin=2,stroke=true,active=false,hover=false}},
2024-04-27 18:36:48 +02:00
}})
--pgui:component("text_box",{text=string.format("Actors: %d", count(actors)),margin=2,stroke=true,active=false,hover=false})
2024-04-14 15:51:45 +02:00
end
2024-04-25 23:07:49 +02:00
2024-04-26 17:37:11 +02:00
2024-04-26 11:22:51 +02:00
actors = {}
2024-04-26 13:31:42 +02:00
bullets = {}
particles = {}
2024-04-26 11:22:51 +02:00
2024-04-14 15:51:45 +02:00
function _draw()
2024-04-25 23:07:49 +02:00
cls(0)
2024-04-27 17:41:11 +02:00
2024-04-26 14:00:34 +02:00
camera(cirnoInstance.x - 240, cirnoInstance.y - 135)
2024-04-25 23:07:49 +02:00
foreach(LAYERS, render_layer)
2024-04-27 17:41:11 +02:00
local mx,my = mouse()
mouse_debug.draw(mx,my,4, tile_width, tile_height)
2024-04-27 18:36:48 +02:00
camera()
2024-04-27 17:41:11 +02:00
-- Draw UI
draw_ui()
2024-04-25 23:07:49 +02:00
weapons_manager.debug_draw()
2024-04-26 14:00:34 +02:00
2024-04-27 18:36:48 +02:00
--circfill(240,140,slidervalue,8)
2024-04-27 17:41:11 +02:00
end
function draw_ui()
2024-04-27 18:36:48 +02:00
pgui:draw()
--print(string.format("Actors: %d", count(actors)),0,32+8)
--print(string.format("%.4f %dfps",stat(1),stat(7)),2,16,5)
2024-04-27 17:41:11 +02:00
2024-04-25 23:07:49 +02:00
end
2024-04-27 17:41:11 +02:00
include(make_path("error_explorer") .. ".lua")
2024-04-26 11:22:51 +02:00
function spawn_objects()
2024-04-26 13:31:42 +02:00
2024-04-28 21:28:25 +02:00
-- Map width and height, TODO: unhardcode
2024-04-26 13:31:42 +02:00
local width = 32
local height = 32
for x=0,width,1 do
for y=0,height,1 do
local tile = map_manager.get_layer_tile(x,y,1)
2024-04-26 17:37:11 +02:00
local a = get_actor_from_sprite(tile)
if (a) then
local ai = a:new(x*tile_width,y*tile_height)
--local ai = Barrel:new(x*tile_width,y*tile_height)
2024-04-28 21:28:25 +02:00
--error("ads")
2024-04-26 17:37:11 +02:00
add(actors,ai)
2024-04-26 13:31:42 +02:00
end
2024-04-26 14:24:25 +02:00
2024-04-26 17:37:11 +02:00
-- if (tile == 3) then
-- local b = Barrel:new(x*tile_width,y*tile_height)
-- add(actors,b)
-- elseif(tile == 72) then
-- local s = Strawberry:new(x*tile_width,y*tile_height)
-- add(actors,s)
-- end
2024-04-26 13:31:42 +02:00
end
end
2024-04-26 11:22:51 +02:00
end
2024-04-26 17:37:11 +02:00
function get_actor_from_sprite(sprite)
local res = nil
for a in all(actors_db) do
if (a.sprite == sprite) then
res = a.actor
end
end
return res
end
2024-04-25 23:07:49 +02:00
function render_layer(layer)
if (layer.render) then
-- todo move function in map manager
map(fetch("map/".. map_manager.get_current_map() .. ".map")[layer.index].bmp)
end
if (layer.render_objects) then
-- Render all objects here
2024-04-26 14:52:31 +02:00
--cirno.draw()
2024-04-25 23:07:49 +02:00
weapons_manager.draw()
2024-04-26 11:22:51 +02:00
for b in all(actors) do
b:draw()
end
2024-04-26 13:31:42 +02:00
for b in all(bullets) do
b:draw()
end
for p in all(particles) do
p:draw()
end
end
2024-04-25 23:07:49 +02:00
2024-04-28 17:06:07 +02:00
end
function distance(x1, y1, x2, y2)
return math.sqrt((x2 - x1)^2 + (y2 - y1)^2)
end
function collided(act, bul)
-- Calculate distance between actor and bullet
local dist = distance(act.x, act.y, bul.x, bul.y)
-- Check if distance is less than actor's half size and bullet's radius
return dist < (bul.radius + math.min(act.w, act.h) / 2)
end
function check_collisions()
for _, actor in ipairs(actors) do
if (actor.shootable) then
for _, bullet in ipairs(bullets) do
if collided(actor, bullet) --[[and not bullet.destroyed]] then
-- Destroy bullet
bullet:destroy()
-- Damage actor
actor:damage(bullet.damage)
end
end
end
2024-04-28 21:28:25 +02:00
end
2024-04-28 17:06:07 +02:00
end