summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander M Pickering <alex@cogarr.net>2025-01-21 16:03:25 -0600
committerAlexander M Pickering <alex@cogarr.net>2025-01-21 16:03:25 -0600
commit89a8f94ac0206412c1a2d7b8766d97dbdbd36253 (patch)
treec9ddc23d31d3c5058d3465dabb68aae7b8209138
parent0370d64b3bd7914be55358817e52bbc8a529a7d3 (diff)
downloadggj25-89a8f94ac0206412c1a2d7b8766d97dbdbd36253.tar.gz
ggj25-89a8f94ac0206412c1a2d7b8766d97dbdbd36253.tar.bz2
ggj25-89a8f94ac0206412c1a2d7b8766d97dbdbd36253.zip
work
-rw-r--r--Makefile2
-rw-r--r--ggj25/.gitignore1
-rw-r--r--src/controller.moon2
-rw-r--r--src/controller_bridge.js2
-rw-r--r--src/ecs.moon27
-rw-r--r--src/main.lua15
m---------src/party/hardoncollider0
-rw-r--r--src/rng.moon10
-rw-r--r--src/router.moon5
-rw-r--r--src/shader_shim.moon6
-rw-r--r--src/shaders/world.moon8
-rw-r--r--src/ui.moon53
-rw-r--r--src/ui/button.moon4
-rw-r--r--src/ui/textbox.moon14
-rw-r--r--src/world.moon19
-rw-r--r--src/world_test.moon23
16 files changed, 153 insertions, 38 deletions
diff --git a/Makefile b/Makefile
index 6f87e98..269e16f 100644
--- a/Makefile
+++ b/Makefile
@@ -9,7 +9,7 @@ MOONC?="$(shell where moonc | head -n 1)"
BUSTED?="$(shell where busted | head -n 1)"
MAGICKFLAGS=-colorspace gray -auto-level -dither None -remap data_src/palette_trans.png
-src_moon=$(wildcard src/*.moon) $(wildcard src/ui/*.moon) $(wildcard src/shaders/*.moon)
+src_moon=$(wildcard src/*.moon) $(wildcard src/ui/*.moon) $(wildcard src/shaders/*.moon) $(wildcard src/menu/*.moon) $(wildcard src/controllers/*.moon) $(wildcard src/prefab/*.moon)
built_moon=$(src_moon:src/%.moon=data/%.lua)
dbg_moon=$(src_moon:src/%.moon=data/%.lua.X)
diff --git a/ggj25/.gitignore b/ggj25/.gitignore
deleted file mode 100644
index 72e8ffc..0000000
--- a/ggj25/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*
diff --git a/src/controller.moon b/src/controller.moon
index b86062e..5d1c4ef 100644
--- a/src/controller.moon
+++ b/src/controller.moon
@@ -11,6 +11,8 @@ controller.pump = () ->
state = am.eval_js("CONT.last_state")
print(state)
+controller.node
+
controller
diff --git a/src/controller_bridge.js b/src/controller_bridge.js
index 84bc040..3e559f4 100644
--- a/src/controller_bridge.js
+++ b/src/controller_bridge.js
@@ -20,6 +20,7 @@ window.CONT = {
messages: [],
gp: null,
last_state: {
+ on: false,
buttons: [],
axes: []
},
@@ -32,5 +33,6 @@ window.CONT = {
for(i = 0; i< CONT.gp.axes.length; i++){
CONT.last_state.axes[i] = CONT.gp.axes[i];
}
+ CONT.last_state.on = true;
}
};
diff --git a/src/ecs.moon b/src/ecs.moon
index d20984a..182f09d 100644
--- a/src/ecs.moon
+++ b/src/ecs.moon
@@ -28,11 +28,12 @@ class Entity
@c_by_type = {}
--Entity is responsible for the component -> entity link
- @components = componenets or {}
+ @components = components or {}
for name, component in pairs(@components)
component.entity = @
@c_by_type[component.__class] = @c_by_type[component.__class] or {}
@c_by_type[component.__class][name] = component
+ for name, component in pairs(@components)
component\join(@)
add: (cid, component) =>
component.entity = @
@@ -70,21 +71,21 @@ class PredictedComponent extends Component
@netc_name = netc_name
@calculate = calculate
join: (entity) =>
- @net = entity[@netc_name]
+ @net = @entity\get(@netc_name)
forward: () =>
- for proeprty, calculation in pairs(@calculate)
+ for property, calculation in pairs(@calculate)
@properties[property] = calculation(@)
-class GraphicsComponent extends Component
- new: (name, properties) =>
- assert(properties and properties.node , "Failed to find node for graphics component")
- super(name, properties)
- static: () =>
- @@static
- buffer_size: () =>
- error("Subclasses of GraphicsComponent must implement a buffer_size() method")
- populate_buffer: (buffer, offset) =>
- error("Subclasses of GraphicsComponent must implement a populate_buffer() method")
+-- componnt moved to world.moon
+--class GraphicsComponent extends Component
+-- new: (name, properties) =>
+-- print("Got name", name, "and properties", properties)
+-- assert(properties and properties.node , "Failed to find node for graphics component")
+-- super(name, properties)
+-- static: () =>
+-- @@static
+-- node: () =>
+-- @properties.node
class PhysicsComponent extends Component
new: (name, properties) =>
diff --git a/src/main.lua b/src/main.lua
index 406c528..d57afde 100644
--- a/src/main.lua
+++ b/src/main.lua
@@ -4,6 +4,8 @@ local pp = am.postprocess({
clear_color = vec4(0.2, 0.2, 0.3, 1),
depth_buffer = true
})
+local world = require("world")
+world.node = pp
local stars = require("shaders.stars")
pp:append(stars)
--win.scene:append(stars)
@@ -12,11 +14,22 @@ local world_shader = require("shaders.world")
--print("World shader:",world_shader)
--win.scene:append(world_shader.node)
pp:append(world_shader.node)
+--local lake_shader = require("shaders.lake")
+--pp:append(lake_shader)
+
win.scene:append(pp)
local ui = require("ui")
+print("ui was", ui)
win.scene:append(ui.node)
-require("world_test")
+
+local router = require("router")
+win.scene:append(router.node) -- Needed to pump the net state machine
+
+--input_menu = require("menu.input")
+--input_menu.initalize()
+require("worldgen")
+--require("world_test")
--require("net_test")
--require("ui_test")
--require("router_test")
diff --git a/src/party/hardoncollider b/src/party/hardoncollider
deleted file mode 160000
-Subproject eb1f285cb1cc4d951d90c92b64a4fc85e7ed06b
diff --git a/src/rng.moon b/src/rng.moon
index d732386..2c995f2 100644
--- a/src/rng.moon
+++ b/src/rng.moon
@@ -3,12 +3,20 @@ rng = {}
totally_random_seed = tonumber(os.date("%Y%H%M%S"))
math.randomseed(totally_random_seed)
+-- same syntax as math.random, if m and n are passed, they are lower and upper bounds
+-- if only m is passed, it is the upper bound
+-- if neither is passed, between 0 and 1
rng.generator = (seed, m, n) ->
seed = seed or tonumber(os.date("%Y%S"))
co = coroutine.wrap(() ->
while true
math.randomseed(seed)
- seed = math.random(m,n)
+ if m and n
+ seed = math.random(m,n)
+ elseif m
+ seed = math.random(m)
+ else
+ seed = math.random()
coroutine.yield(seed)
)
co, seed
diff --git a/src/router.moon b/src/router.moon
index e414f07..2001952 100644
--- a/src/router.moon
+++ b/src/router.moon
@@ -190,9 +190,6 @@ class Router
@prevotes[peer.id] = peer.id
-- Add ourselves to the peerlist
@peerlist[peer.id] = peer
- while true
- coroutine.yield(peer.id)
- net.pump!
sync: (conn, msgfmt, msg) =>
ret = nil
@@ -250,4 +247,4 @@ node\update(() ->
net.pump!
coroutine.yield!
)
-{:Router, :node}
+{:Router, :node, r: () -> router_singleton}
diff --git a/src/shader_shim.moon b/src/shader_shim.moon
index 05e11c1..76e0aec 100644
--- a/src/shader_shim.moon
+++ b/src/shader_shim.moon
@@ -8,8 +8,10 @@ inputs = {
shaders = setmetatable({},{
__index:(self, key) ->
- vert = assert(am.load_string("shaders/" .. key .. ".vert"))
- frag = assert(am.load_string("shaders/" .. key .. ".frag"))
+ vert_name = "shaders/" .. key .. ".vert"
+ frag_name = "shaders/" .. key .. ".frag"
+ vert = assert(am.load_string(vert_name), "Failed to find " .. vert_name)
+ frag = assert(am.load_string(frag_name), "Failed to find " .. frag_name)
vert_subbed = vert\gsub("@%b{}",(n) -> tostring(inputs[n]))
frag_subbed = frag\gsub("@%b{}",(n) -> tostring(inputs[n]))
succ, program = pcall(am.program, vert_subbed, frag_subbed)
diff --git a/src/shaders/world.moon b/src/shaders/world.moon
index e9ddcc9..9fffe7a 100644
--- a/src/shaders/world.moon
+++ b/src/shaders/world.moon
@@ -16,7 +16,7 @@ s_mv = mat4(
1, 0, 0, 0,
0, aspect, 0, 0,
0, 0, 1, 0,
- -0.5, 0.5, 0, 4
+ -0.0, 0.5, 0, 4
)
p_mv = mat4(
1 / ((win.width / win.height) * math.tan(view_angle / 2)), 0, 0, 0,
@@ -236,8 +236,10 @@ node = shader_shim.world\append(am.depth_test("less")\append(am.cull_face("front
node\action(() =>
bind = self("bind")
bind.time = am.current_time!
- bind.world_x = math.sin(am.current_time!) * 2
- bind.world_y = math.cos(am.current_time!) * 2
+ --bind.world_x = math.sin(am.current_time!) * 2
+ --bind.world_y = math.cos(am.current_time!) * 2
+ bind.world_x = world.world_x
+ bind.world_y = world.world_y
)
{
node: node
diff --git a/src/ui.moon b/src/ui.moon
index 4c551b3..f729756 100644
--- a/src/ui.moon
+++ b/src/ui.moon
@@ -1,12 +1,15 @@
hc = require("party.hc.init")
win = require("window")
log = require("log")
+util = require("util")
Button = require("ui.button")
Joystick = require("ui.joystick")
Textbox = require("ui.textbox")
ui_world = hc.new(64)
+am.eval_js(require("controller_bridge"))
+
ui = {}
ui.events = {
touch: {}
@@ -14,22 +17,32 @@ ui.events = {
controller: {}
keyboard: {}
}
-ui.button = (x,y,width,height,text) ->
+ui.button = (x,y,width,height,text,controller_binds) ->
+ controller_binds = controller_binds or {}
+ assert(x and type(x) == "number", "x must be anumber")
+ assert(y and type(y) == "number", "y must be anumber")
+ assert(width and type(width) == "number", "width must be anumber")
+ assert(height and type(height) == "number", "height must be anumber")
button = Button(x,y,width,height,text)
ui.node\append(button.node)
bounds = ui_world\rectangle(x,y,width,height)
ui.events.touch[bounds] = button
ui.events.mouse[bounds] = button
+ for bind in *controller_binds
+ ui.events.controller[bind] = button
button
ui.click = (x,y) ->
ui_world\shapesAt(x,y)
-ui.joystick = (x,y,r) ->
+ui.joystick = (x,y,r,controller_binds) ->
+ controller_binds = controller_binds or {}
joystick = Joystick(x,y,r)
ui.node\append(joystick.node)
bounds = ui_world\circle(x,y,r)
ui.events.touch[bounds] = joystick
+ for bind in *controller_binds
+ ui.events.controller[bind] = joystick
joystick
ui.textbox = (x,y,width,height,value,placeholder) ->
@@ -42,6 +55,19 @@ ui.textbox = (x,y,width,height,value,placeholder) ->
ui.events.keyboard[textbox] = true
textbox
+ui.delete = (element) ->
+ ui.node\remove(element.node)
+ for b,e in pairs(ui.events.mouse)
+ if e == element
+ ui.events.mouse[b] = nil
+ if ui.events.keyboard[element]
+ ui.events.keyboard[element] = nil
+ for b,e in pairs(ui.events.touch)
+ if e == element
+ ui.events.touch[b] = nil
+ for b,e in pairs(ui.events.controller)
+ if e == element
+ ui.events.controller[b] = nil
ui.node = am.group!
@@ -57,6 +83,8 @@ ui.node\action(() ->
up = win\mouse_released("left")
wheel = win\mouse_wheel_delta()
keys = win\keys_pressed()
+ am.eval_js("CONT.loop()")
+ cont_state = am.eval_js("CONT.last_state")
-- Debugging for mouse position:
ui.dbg.position2d = pos
mo_tbl =
@@ -88,7 +116,7 @@ ui.node\action(() ->
has_fire(uiobj)
uiobj\fire(etbl)
if #keys > 0
- print("Got keys:" .. tostring(keys))
+ --print("Got keys:" .. tostring(keys))
etbl =
event: "keys_pressed"
data: keys
@@ -97,7 +125,24 @@ ui.node\action(() ->
has_fire(uiobj)
if uiobj\fire(etbl)
break -- allow any keyboard listener to "trap" the signal by returning true
-
+ if cont_state.on
+ for axis,value in pairs(cont_state.axes)
+ name = "axis" .. axis
+ uiobj = ui.events.controller[name]
+ if uiobj and has_fire(uiobj)
+ etbl =
+ event: "controller_axis"
+ data: value
+ uiobj\fire(etbl)
+ for button,value in pairs(cont_state.buttons)
+ name = "button" .. button
+ uiobj = ui.events.controller[name]
+ if uiobj and has_fire(uiobj)
+ etbl =
+ event: "controller_pressed"
+ data: value
+ uiobj\fire(etbl)
+
-- in_touch_events = {
-- "active_touch"
-- "touches_began"
diff --git a/src/ui/button.moon b/src/ui/button.moon
index 5915bc9..6eaa6d3 100644
--- a/src/ui/button.moon
+++ b/src/ui/button.moon
@@ -2,6 +2,7 @@
s = require("ui.sprites")
util = require("util")
color = require("color")
+world = require("world")
states = {"up","down"}
rows = {"upper","mid","lower"}
cols = {"left","mid","right"}
@@ -107,8 +108,9 @@ class Button
@text = am.text(text, "left","top", color.am_color.foreground)
position\append(
am.translate(@@down_upper_left.width, -@@down_upper_right.height)\append(
+ am.scale(world.controller.text_size)\append(
@text
- ))
+ )))
@depressed = false
down: () =>
@depressed = true
diff --git a/src/ui/textbox.moon b/src/ui/textbox.moon
index c029ba4..bdb8e13 100644
--- a/src/ui/textbox.moon
+++ b/src/ui/textbox.moon
@@ -14,7 +14,13 @@ class Textbox extends Button
am.translate(@em,0)\append(
am.rect(0,0,@em/4,-@em,color.am_color.foreground)
))
- @cursor.hidden = true
+ @cursor\action(() =>
+ if not @should_hide
+ @hidden = math.floor(am.current_time! * 2) % 2 == 0
+ else
+ @hidden = true
+ )
+ @cursor.should_hide = true
@text\append(@cursor)
@cursor_pos = #@text.text
@update_cursor_pos!
@@ -23,7 +29,7 @@ class Textbox extends Button
for i = 1, #valid_chars
char = valid_chars\sub(i,i)
@valid_chars[char] = char
- @valid_chars[char\upper] = char\upper
+ @valid_chars[char\upper!] = char\upper!
for i = 0,9
@valid_chars[tostring(i)] = tostring(i)
@valid_chars["kp_" .. tostring(i)] = tostring(i)
@@ -57,11 +63,11 @@ class Textbox extends Button
@cursor
down: () =>
super!
- @cursor.hidden = false
+ @cursor.should_hide = false
@text.color = color.am_color.foreground
up: () =>
super!
- @cursor.hidden = true
+ @cursor.should_hide = true
@text.color = color.am_color.shadow
update_cursor_pos: () =>
@.cursor("translate").x = @cursor_pos * 9
diff --git a/src/world.moon b/src/world.moon
index 2862a97..6a0eed8 100644
--- a/src/world.moon
+++ b/src/world.moon
@@ -12,13 +12,30 @@ x = {
world_x: 0
world_y: 0
-- Have we selected an input type yet?
- controller_selected: false
+ controller: {
+ text_size: 4
+ }
-- Level information
level: {
graphics:{}
entities:{}
graphic_world: hc.new(5)
}
+ sync_time: () ->
+ am.current_time!
}
x.level.collider = x.level.graphic_world\rectangle(0,0,1,1/win.width)
+
+class GraphicsComponent extends ecs.Component
+ new: (name, properties) =>
+ print("Got name", name, "and properties", properties)
+ assert(properties and properties.node , "Failed to find node for graphics component")
+ super(name, properties)
+ x.node\append(properties.node)
+ static: () =>
+ @@static
+ node: () =>
+ @properties.node
+
+x.GraphicsComponent = GraphicsComponent
x
diff --git a/src/world_test.moon b/src/world_test.moon
index 8fa9da5..c574f6b 100644
--- a/src/world_test.moon
+++ b/src/world_test.moon
@@ -8,6 +8,8 @@ ui = require("ui")
peer = require("router")
server = ui.button(-200,0,100,100, "Server")
+textbox = ui.textbox(200,100,100,32, "Serverid")
+client = ui.button(200,0,100,100, "Client")
co = nil
server.on = () =>
if @co == nil
@@ -32,9 +34,26 @@ server.on = () =>
)
client.on = () =>
+ if @co == nil
+ print("Setting co...")
+ @co = coroutine.create(() ->
+ router = peer.Router(textbox.text.text)
+ router\initalize!
+ router
+ )
+ button = @
+ @node\action(() =>
+ if button.co and coroutine.status(button.co) ~= "dead"
+ succ, val = coroutine.resume(button.co)
+ if not succ
+ error(debug.traceback(button.co, val))
+ if type(val) == "string"
+ button.text.text = val
+ else
+ router = val
+ world.router = router
+ )
-textbox = ui.textbox(200,100,100,32, "Serverid")
-client = ui.button(200,0,100,100, "Client")
test_sprite = am.translate(0,0) ^ am.scale(20) ^ am.sprite("BRY\nYYY\nBBB")
ui.node\prepend(test_sprite)