From a49808d70d64485956dc6013575fdabb0c0e7d02 Mon Sep 17 00:00:00 2001 From: Juliana Sims Date: Wed, 22 May 2024 12:07:41 -0400 Subject: [PATCH] Add xor and level 4 --- Makefile | 3 ++- game.scm | 8 ++++++- modules/game/actors.scm | 41 +++++++++++++++++++++++++++++++++ modules/game/level.scm | 1 + modules/game/levels/level-2.tmx | 2 +- modules/game/levels/level-4.tmx | 39 +++++++++++++++++++++++++++++++ scripts/compile-map.scm | 2 ++ 7 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 modules/game/levels/level-4.tmx diff --git a/Makefile b/Makefile index 501999d..99f8388 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,8 @@ modules = \ levels = \ modules/game/levels/level-1.scm \ modules/game/levels/level-2.scm \ - modules/game/levels/level-3.scm + modules/game/levels/level-3.scm \ + modules/game/levels/level-4.scm game.wasm: game.scm $(modules) $(levels) guild compile-wasm -L modules -o $@ $< diff --git a/game.scm b/game.scm index 9268b20..521b2dd 100644 --- a/game.scm +++ b/game.scm @@ -30,6 +30,7 @@ (game levels level-1) (game levels level-2) (game levels level-3) + (game levels level-4) (game tileset) (goblins core) (hoot bytevectors) @@ -83,7 +84,8 @@ (vector load-level-1 load-level-2 - load-level-3)) + load-level-3 + load-level-4)) (define *level-idx* #f) (define *gems* #f) (define *level* #f) @@ -296,6 +298,9 @@ (define (draw-and-gate pos) (draw-tile context tileset 42 (vec2-x pos) (vec2-y pos))) +(define (draw-xor-gate pos) + (draw-tile context tileset 44 (vec2-x pos) (vec2-y pos))) + (define (draw-electric-switch pos on?) (draw-tile context tileset (if on? 7 6) (vec2-x pos) (vec2-y pos))) @@ -311,6 +316,7 @@ (('gem pos) (draw-gem pos)) (('gate pos open?) (draw-gate pos open?)) (('and-gate pos) (draw-and-gate pos)) + (('xor-gate pos) (draw-xor-gate pos)) (('electric-switch pos on?) (draw-electric-switch pos on?)))) (define (draw-background) diff --git a/modules/game/actors.scm b/modules/game/actors.scm index 4fecf32..c3acc80 100644 --- a/modules/game/actors.scm +++ b/modules/game/actors.scm @@ -10,6 +10,7 @@ ^gate ^gem ^and-gate + ^xor-gate ^electric-switch ^player ^level)) @@ -274,6 +275,46 @@ (('describe) `(and-gate ,position)) (('collide other offset grid-info) #f))) +(define (^xor-gate bcom x y) + (define position (vector x y 0)) + (define state (spawn ^cell 'copper)) + (match-lambda* + (('type) 'emitter) + (('position) position) + (('tick grid-info) #f) + (('post-tick grid-info) #f) + (('enter obj grid-info) #f) + (('exit obj grid-info) #f) + (('wire-state) ($ state)) + (('update-wire-state grid-info) + (match ($ state) + ('electron-head ($ state 'electron-tail)) + ('electron-tail ($ state 'copper)) + ('copper + ;; TODO: Match other shapes? This only allows left-to-right + ;; circuit flow. + (match (pk 'xor-grid-info ($ grid-info 'wireworld-neighbor-grid x y)) + (#('electron-head #f #f + #f _ 'copper + #f #f #f) + ($ state 'electron-head)) + (#('electron-head #f #f + #f _ 'copper + 'copper #f #f) + ($ state 'electron-head)) + (#(#f #f #f + #f _ 'copper + 'electron-head #f #f) + ($ state 'electron-head)) + (#('copper #f #f + #f _ 'copper + 'electron-head #f #f) + ($ state 'electron-head)) + (_ ($ state 'copper)))))) + (('alive?) #t) + (('describe) `(xor-gate ,position)) + (('collide other offset grid-info) #f))) + (define (^player bcom x y) (define position (spawn ^cell (vector x y 2))) (define velocity (spawn ^cell #(0 0))) diff --git a/modules/game/level.scm b/modules/game/level.scm index dd1a2a6..3f77b2f 100644 --- a/modules/game/level.scm +++ b/modules/game/level.scm @@ -46,6 +46,7 @@ (12 (let ((target-x (bytevector-u8-ref objects (+ i 3))) (target-y (bytevector-u8-ref objects (+ i 4)))) (spawn ^electric-switch x y target-x target-y))) + (13 (spawn ^xor-gate x y)) (id (error "invalid level object" id)))) (i* (+ i (match id ;; floor-switch or electric-switch diff --git a/modules/game/levels/level-2.tmx b/modules/game/levels/level-2.tmx index c0a78b5..0c8ac10 100644 --- a/modules/game/levels/level-2.tmx +++ b/modules/game/levels/level-2.tmx @@ -1,7 +1,7 @@ - + 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, diff --git a/modules/game/levels/level-4.tmx b/modules/game/levels/level-4.tmx new file mode 100644 index 0000000..87ca4c1 --- /dev/null +++ b/modules/game/levels/level-4.tmx @@ -0,0 +1,39 @@ + + + + + +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,24,24,24,24,24,24,24,24,24,24,24,24,23,23,23,23,23,23, +23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,23,24,24,24,23, +23,24,49,3,3,3,3,3,3,3,3,3,24,24,24,23,24,24,24,23, +23,24,24,24,24,24,24,24,24,24,24,24,24,3,24,23,24,24,24,23, +23,24,49,3,3,24,3,3,3,3,3,3,24,24,24,24,24,24,24,23, +23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,23,24,24,24,23, +23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,23,24,28,24,23, +23,24,24,24,24,24,24,24,24,24,24,24,24,24,23,23,24,24,24,23, +23,24,24,24,24,24,24,24,24,24,24,24,24,24,23,23,24,24,24,23, +23,23,24,24,24,24,24,24,24,24,24,24,24,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23 + + + + + + + + + + + + + + + + + + + diff --git a/scripts/compile-map.scm b/scripts/compile-map.scm index 62b25d2..4b01df9 100644 --- a/scripts/compile-map.scm +++ b/scripts/compile-map.scm @@ -557,6 +557,7 @@ the default ORIENTATION value of 'orthogonal' is supported." (define obj:gate 10) (define obj:and-gate 11) (define obj:electric-switch 12) +(define obj:xor-gate 13) (define (compile-environment-layer tile-map layer-name) (let ((tw (tile-map-tile-width tile-map)) @@ -604,6 +605,7 @@ the default ORIENTATION value of 'orthogonal' is supported." ('gem (list x y obj:gem)) ('gate (list x y obj:gate)) ('and-gate (list x y obj:and-gate)) + ('xor-gate (list x y obj:xor-gate)) ('electric-switch (list x y obj:electric-switch (assq-ref properties 'target-x) (assq-ref properties 'target-y)))