diff options
| author | Alexander M Pickering <alex@cogarr.net> | 2025-01-21 16:03:25 -0600 |
|---|---|---|
| committer | Alexander M Pickering <alex@cogarr.net> | 2025-01-21 16:03:25 -0600 |
| commit | 89a8f94ac0206412c1a2d7b8766d97dbdbd36253 (patch) | |
| tree | c9ddc23d31d3c5058d3465dabb68aae7b8209138 /src | |
| parent | 0370d64b3bd7914be55358817e52bbc8a529a7d3 (diff) | |
| download | ggj25-89a8f94ac0206412c1a2d7b8766d97dbdbd36253.tar.gz ggj25-89a8f94ac0206412c1a2d7b8766d97dbdbd36253.tar.bz2 ggj25-89a8f94ac0206412c1a2d7b8766d97dbdbd36253.zip | |
work
Diffstat (limited to 'src')
| -rw-r--r-- | src/controller.moon | 2 | ||||
| -rw-r--r-- | src/controller_bridge.js | 2 | ||||
| -rw-r--r-- | src/ecs.moon | 27 | ||||
| -rw-r--r-- | src/main.lua | 15 | ||||
| m--------- | src/party/hardoncollider | 0 | ||||
| -rw-r--r-- | src/rng.moon | 10 | ||||
| -rw-r--r-- | src/router.moon | 5 | ||||
| -rw-r--r-- | src/shader_shim.moon | 6 | ||||
| -rw-r--r-- | src/shaders/world.moon | 8 | ||||
| -rw-r--r-- | src/ui.moon | 53 | ||||
| -rw-r--r-- | src/ui/button.moon | 4 | ||||
| -rw-r--r-- | src/ui/textbox.moon | 14 | ||||
| -rw-r--r-- | src/world.moon | 19 | ||||
| -rw-r--r-- | src/world_test.moon | 23 |
14 files changed, 152 insertions, 36 deletions
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) |
