diff --git a/flora-search-aurora.lisp b/flora-search-aurora.lisp index 033ae58..444fd99 100644 --- a/flora-search-aurora.lisp +++ b/flora-search-aurora.lisp @@ -1,4 +1,4 @@ -;;;; Copyright © 2023, Jaidyn Ann + ;;;; Copyright © 2023, Jaidyn Ann ;;;; ;;;; This program is free software: you can redistribute it and/or ;;;; modify it under the terms of the GNU General Public License as @@ -48,6 +48,13 @@ `(getf (gethash :knows ,map) ,idea)) + +;;; ——————————————————————————————————— +;;; The Outside World™ +;;; ——————————————————————————————————— +(defparameter *outdoors-map* (overworld.tiled:load-map (format nil "~Ares/map.tmx" (uiop:getcwd)))) + + ;;; ——————————————————————————————————— ;;; Childhood friend (Sasha) arc @@ -126,6 +133,21 @@ (make-dialogue-state map (childhood-friend-dialogue map))) + +;;; ——————————————————————————————————— +;;; Casino! +;;; ——————————————————————————————————— +(defparameter *casino-map* (overworld.tiled:load-map (format nil "~Ares/casino.tmx" (uiop:getcwd)))) + + +(defun casino-entrance-trigger (&optional map) + (list :map *casino-map*)) + + +(defun casino-exit-trigger (&optional map) + (list :map *outdoors-map*)) + + ;;; ——————————————————————————————————— ;;; Random casino NPCs @@ -187,8 +209,10 @@ :face "=w=~")))) -(defun bruh-trigger (&optional map) - (print "YAAAAAAA")) + + + + diff --git a/overworld.lisp b/overworld.lisp index a67bb00..4ebf250 100644 --- a/overworld.lisp +++ b/overworld.lisp @@ -100,6 +100,14 @@ rectangle as defined by its TOP-LEFT-CORNER & BOTTOM-RIGHT-CORNER." (list :x x :y y)))) +(defun trigger-at-coords (map world-coords) + (let ((chunk (world-coords-chunk world-coords))) + (loop for trigger in (cdr (assoc chunk (gethash :triggers map))) + do (when (within-rectangle world-coords + (getf trigger :coords) (getf trigger :bottom-coords)) + (return trigger))))) + + ;;; ——————————————————————————————————— ;;; Overworld logic @@ -127,40 +135,39 @@ Returns parameters to be used in the next invocation of OVERWORLD-STATE." ;; ((plist = input '(:modifier nil :char #\Esc))) ;; Simple up-down-left-right movements ((…:plist= input '(:modifier nil :char #\→)) - (move-entity map 'player :x 1) - (list :map map)) + (move-player map :Δx 1)) ((…:plist= input '(:modifier nil :char #\←)) - (move-entity map 'player :x -1) - (list :map map)) + (move-player map :Δx -1)) ((…:plist= input '(:modifier nil :char #\↑)) - (move-entity map 'player :y -1) - (list :map map)) + (move-player map :Δy -1)) ((…:plist= input '(:modifier nil :char #\↓)) - (move-entity map 'player :y 1) - (list :map map)) + (move-player map :Δy 1)) ('t (list :map map)))) (list :map map))) -(defun move-entity (map entity-id &key (x 0) (y 0)) +(defun move-player (map &key (Δx 0) (Δy 0)) + (move-entity map 'player :Δx Δx :Δy Δy) + (let* ((coords (getf-entity-data map 'player :coords)) + (trigger (trigger-at-coords map (list :x (getf coords :x) :y (getf coords :y))))) + (if (and trigger (getf trigger :function)) + (apply (intern (string-upcase (getf trigger :function))) + (list map)) + (list :map map)))) + + + +(defun move-entity (map entity-id &key (Δx 0) (Δy 0)) "Move an entity relative to its current position." - (when (< x 0) + (when (< Δx 0) (setf (getf-entity-data map entity-id :direction) 'left)) - (when (> x 0) + (when (> Δx 0) (setf (getf-entity-data map entity-id :direction) 'right)) (let ((coords (getf-entity-data map entity-id :coords))) (move-entity-to map entity-id - :x (+ x (getf coords :x)) - :y (+ y (getf coords :y))))) - - -(defun trigger-at-coords (map world-coords) - (let ((chunk (world-coords-chunk world-coords))) - (loop for trigger in (cdr (assoc chunk (gethash :triggers map))) - do (when (within-rectangle world-coords - (getf trigger :coords) (getf trigger :bottom-coords)) - (return trigger))))) + :x (+ Δx (getf coords :x)) + :y (+ Δy (getf coords :y))))) (defun move-entity-to (map entity &key (x 0) (y 0)) @@ -179,13 +186,7 @@ Returns parameters to be used in the next invocation of OVERWORLD-STATE." (cdr (getf-entity map entity))) ;; Delete it from the old list… (alexandria:deletef (assoc-utils:aget (gethash :entities map) old-chunk) entity - :test (lambda (id alist) (eq id (car alist))))) - ;; If moving the player-character, check for triggers! (Traps) - (when (eq entity 'player) - (let ((trigger (trigger-at-coords map (list :x x :y y)))) - (if (and trigger (getf trigger :function)) - (apply (intern (string-upcase (getf trigger :function))) - (list map))))))) + :test (lambda (id alist) (eq id (car alist))))))) diff --git a/res/casino.tmx b/res/casino.tmx index 7c0b4b6..de91a87 100644 --- a/res/casino.tmx +++ b/res/casino.tmx @@ -62,8 +62,8 @@ 93,0,0,0,0,0,0,0,93,0,0,93,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,93, 93,0,0,0,0,0,0,0,93,0,0,93,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,93, 93,0,0,0,0,0,0,0,93,0,0,93,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,93, -93,0,64,64,64,64,64,64,16,0,0,93,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,93, -93,60,1,1,1,1,1,1,1,0,0,93,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,93, +93,0,0,0,0,0,0,0,16,0,0,93,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,93, +93,0,0,0,0,0,0,0,1,0,0,93,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,93, 93,60,64,64,64,64,64,64,1,0,0,93,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,93, 93,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,93, 93,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,93, @@ -110,8 +110,8 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,64,64,64,64,64,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,60,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -143,7 +143,7 @@ - + @@ -192,7 +192,7 @@ - + @@ -201,9 +201,9 @@ - + - + diff --git a/res/map.tmx b/res/map.tmx index 12a25c1..010fe02 100644 --- a/res/map.tmx +++ b/res/map.tmx @@ -1,5 +1,5 @@ - + @@ -256,5 +256,10 @@ + + + + +