summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRicardo Wurmus <rekado@elephly.net>2018-07-21 22:50:45 +0200
committerRicardo Wurmus <rekado@elephly.net>2018-07-27 17:15:46 +0200
commitc30d1dabc129bf170123c39191dce8d984a0cd39 (patch)
treea94fd787bfce38cebc12dfc0b10eb43a860b7728
parent88e05c30a8537695d162db11302b99ed4d54df94 (diff)
Move characters to separate modules.
-rw-r--r--characters.scm53
-rw-r--r--characters/lorenzo.scm86
-rw-r--r--characters/reaper.scm143
-rw-r--r--scenes/game.scm165
4 files changed, 287 insertions, 160 deletions
diff --git a/characters.scm b/characters.scm
new file mode 100644
index 0000000..c3f692b
--- /dev/null
+++ b/characters.scm
@@ -0,0 +1,53 @@
+;;; The Inevitable Game
+;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net>
+;;;
+;;; This program is free software: you can redistribute it and/or
+;;; modify it under the terms of the GNU General Public License as
+;;; published by the Free Software Foundation, either version 3 of the
+;;; License, or (at your option) any later version.
+;;;
+;;; This program is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;;; General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with this program. If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+(define-module (characters)
+ #:use-module (chickadee math rect)
+ #:use-module (chickadee math vector)
+ #:use-module (chickadee render color)
+ #:use-module (chickadee render font)
+ #:use-module (chickadee render shapes)
+ #:use-module (chickadee render texture)
+ #:use-module (chickadee render tiled)
+ #:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-26)
+ #:use-module (ice-9 match)
+ #:use-module (engine assets)
+ #:use-module (engine node-2d)
+ #:use-module (oop goops)
+ #:export (<character>
+ conversations
+ accepted-messages
+ speaking?
+ velocity
+ walk-speed
+ direction
+ hitbox
+
+ load-atlas))
+
+(define-class <character> (<node-2d>)
+ (conversations #:accessor conversations #:init-keyword #:conversations)
+ (accepted-messages #:accessor accepted-messages #:init-form '((hello "Hello there!")))
+ (speaking? #:accessor speaking? #:init-form #f)
+ (velocity #:getter velocity #:init-form (vec2 0.0 0.0))
+ (walk-speed #:accessor walk-speed #:init-form 0.8)
+ (direction #:accessor direction #:init-form '(idle))
+ (hitbox #:getter hitbox #:init-form (make-rect 8.0 0.0 16.0 16.0)))
+
+(define (load-atlas file-name tile-width tile-height)
+ (split-texture (load-image file-name) tile-width tile-height))
diff --git a/characters/lorenzo.scm b/characters/lorenzo.scm
new file mode 100644
index 0000000..5fa2268
--- /dev/null
+++ b/characters/lorenzo.scm
@@ -0,0 +1,86 @@
+;;; The Inevitable Game
+;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net>
+;;;
+;;; This program is free software: you can redistribute it and/or
+;;; modify it under the terms of the GNU General Public License as
+;;; published by the Free Software Foundation, either version 3 of the
+;;; License, or (at your option) any later version.
+;;;
+;;; This program is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;;; General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with this program. If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+(define-module (characters lorenzo)
+ #:use-module (chickadee render texture)
+ #:use-module (chickadee render color)
+ #:use-module (chickadee math rect)
+ #:use-module (chickadee math vector)
+ #:use-module (engine assets)
+ #:use-module (engine node-2d)
+ #:use-module (characters)
+ #:use-module (oop goops)
+ #:export (<player>
+ previous-key-presses
+ selecting-message?
+ wants-to-stop-talking?
+ resume-messages
+ lifetime
+ happiness
+ weight
+ music
+ talking?
+
+ lorenzo))
+
+(define-class <player> (<character>)
+ (previous-key-presses #:accessor previous-key-presses #:init-form (list))
+ (selecting-message? #:accessor selecting-message? #:init-form #f)
+ (wants-to-stop-talking? #:accessor wants-to-stop-talking? #:init-form #f)
+ (resume-messages #:accessor resume-messages #:init-form '())
+ (lifetime #:accessor lifetime #:init-form 100)
+ (happiness #:accessor happiness #:init-form 50)
+ (weight #:accessor weight #:init-form 50)
+ (music #:accessor music #:init-form 50)
+ (talking? #:accessor talking? #:init-form #f))
+
+(define-asset player-atlas
+ (load-atlas "assets/images/lorenzo.png" 32 32))
+
+(define (lorenzo the-position)
+ (make <player>
+ #:name 'player
+ #:position the-position
+ #:children
+ (cons
+ (make <animated-sprite>
+ #:name 'sprite
+ #:atlas player-atlas
+ #:animations '((idle-right . #(8 8 8 8 8 7 7 7 7 7))
+ (idle-left . #(0 0 0 0 0 15 15 15 15 15))
+ (idle-front . #(24 24 24 24 24 32 32 32 32 32))
+ (idle-back . #(16))
+ (left . #(1 35 2 35))
+ (right . #(9 34 10 34))
+ (up . #(17 16 18 16))
+ (down . #(25 24 26 24)))
+ #:current-animation 'idle-front
+ #:frame-duration 10)
+ ;; Simple player shadow. This should better be done
+ ;; with a single ellipse shader.
+ (let ((color (make-color 0 0 0 0.2)))
+ (map (lambda (n x w)
+ (make <filled-rect>
+ #:region (make-rect 0.0 0.0 w 1.0)
+ #:position (vec2 x (- 2 n))
+ #:color color))
+ ;; position in the stack
+ (iota 5)
+ ;; x offsets
+ (list 12 10 8 10 12)
+ ;; widths
+ (list 8 12 16 12 8))))))
diff --git a/characters/reaper.scm b/characters/reaper.scm
new file mode 100644
index 0000000..fa7a76a
--- /dev/null
+++ b/characters/reaper.scm
@@ -0,0 +1,143 @@
+;;; The Inevitable Game
+;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net>
+;;;
+;;; This program is free software: you can redistribute it and/or
+;;; modify it under the terms of the GNU General Public License as
+;;; published by the Free Software Foundation, either version 3 of the
+;;; License, or (at your option) any later version.
+;;;
+;;; This program is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;;; General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with this program. If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+(define-module (characters reaper)
+ #:use-module (chickadee render texture)
+ #:use-module (chickadee render color)
+ #:use-module (chickadee math rect)
+ #:use-module (chickadee math vector)
+ #:use-module (engine assets)
+ #:use-module (engine node-2d)
+ #:use-module (characters)
+ #:use-module (oop goops)
+ #:export (<reaper> reaper))
+
+(define-class <reaper> (<character>))
+
+(define-asset reaper-atlas
+ (load-atlas "assets/images/reaper.png" 32 32))
+
+(define (reaper the-position)
+ (make <reaper>
+ #:name 'reaper
+ #:position the-position
+ #:conversations
+ '((hello
+ "Salutations!"
+ ((who-are-you? "Who are you?")
+ (bye "I have to leave now. Bye!"
+ #:resume
+ (hello "Hi again!"))))
+ (who-are-you?
+ "People have given me too many names to recount.
+Paul Celan called me a master from Germany, but he must have confused
+me with somebody else. Some call me a part of life, but I think that's
+missing the point. Others call me the grim reaper, but do I look grim
+to you?"
+ ((grim-no "No, not at all.")
+ (grim-yes "Well, actually you kinda do...")
+ (grim-bye "I can't answer, I need to go."
+ #:resume
+ (what-do-you-do? "Could you tell me what you are doing here?"))))
+ (grim-bye
+ "Well, I guess that's a 'yes'..."
+ ())
+ (grim-no
+ "Ah, that's a relief!"
+ ((what-do-you-do?
+ "I hope you don't mind me asking: what is it you're
+doing here?")
+ (bye
+ "Well, it was nice meeting you. See you around!"
+ #:resume
+ (what-do-you-do? "Could you tell me what you are doing here?"))))
+ (grim-yes
+ "Hmm, that's very unfortunate. I just can't figure out
+why people have that impression. It's rather depressing."
+ ((its-the-robe "Maybe it's the robe?")
+ (dont-worry "Aww, don't feel bad about it!")
+ (bye "I'm sure you'll be okay. Gotta go!"
+ #:resume
+ (what-do-you-do?
+ "So... what do you do around here?"))))
+ (its-the-robe
+ "I don't see how this comfortable robe could have that
+effect. The fabric is a little coarse, I admit, but it's really
+durable and doesn't chafe on my bones. Excellent quality."
+ ((what-do-you-do?
+ "So... what do you do around here?")
+ (bye "That's really interesting, but I'm afraid I need
+to hurry. Bye!"
+ #:resume
+ (what-do-you-do?
+ "So... what do you do around here?"))))
+ (dont-worry
+ "Yeah, I guess I shouldn't. It just tears me
+down. Luckily, the garden keeps me distracted."
+ ((what-do-you-grow? "Oh, you have a garden? What do you
+grow there?")
+ (bye "That's good. Well, I should go now. Bye!"
+ #:resume
+ (what-do-you-grow?
+ "You mentioned a garden. What do you grow there?"))))
+ (what-do-you-do?
+ "Well, you may have noticed the garden behind the house.
+For the past few eons I have been tending to it."
+ ((eons? "Did you say 'eons'?")
+ (what-do-you-grow? "Oh, that's nice! What do you grow there?")
+ (bye "I see. Unfortunately, I must get going now."
+ #:resume
+ (bye "Sorry, I didn't mean to disturb you."))))
+ (eons?
+ "Oh yes, I have been here long before you appeared and
+I will be here long after you will have rejoined the void. You could
+say that I am the void, occasionally receding just enough for a little
+bit of inconsequential folly before eventually and invariably
+restoring equilibrium."
+ ;; TODO
+ ())
+ (what-do-you-grow?
+ "You know, this and that. I enjoy soul food, and it's
+best when the ingredients are fresh."
+ ())
+ (bye
+ "Farewell! Don't be afraid, for I'm always here for
+you. I'm sure we will meet again sooner than you expect."
+ ()))
+ #:children
+ (cons (make <animated-sprite>
+ #:name 'sprite
+ #:atlas reaper-atlas
+ #:animations '((idle . #(0 0 0 1 1 1 9 1 1 1 8 8 8 8 8 8 5 4 4 4 0 0 0 3 3))
+ (pause . #(4 4 4 4 4 4 4 5))
+ (talk . #(0 3 2 7 5 4 6 5 3 2 2 2 4 4 0 0 0)))
+ #:current-animation 'idle
+ #:frame-duration 20)
+ ;; Simple shadow. This should better be done with a
+ ;; single ellipse shader.
+ (let ((color (make-color 0 0 0 0.2)))
+ (map (lambda (n x w)
+ (make <filled-rect>
+ #:region (make-rect 0.0 0.0 w 1.0)
+ #:position (vec2 (+ 3 x) (- 2 n))
+ #:color color))
+ ;; position in the stack
+ (iota 5)
+ ;; x offsets
+ (list 12 10 8 10 12)
+ ;; widths
+ (list 12 16 20 16 12))))))
diff --git a/scenes/game.scm b/scenes/game.scm
index f34787d..bc3f690 100644
--- a/scenes/game.scm
+++ b/scenes/game.scm
@@ -33,6 +33,9 @@
#:use-module (engine node-2d)
#:use-module (engine scene)
#:use-module (oop goops)
+ #:use-module (characters)
+ #:use-module (characters lorenzo)
+ #:use-module (characters reaper)
#:export (game))
(use-modules (chickadee)
@@ -45,15 +48,6 @@
(define %message-margin 3.0)
-(define-class <character> (<node-2d>)
- (conversations #:accessor conversations #:init-keyword #:conversations)
- (accepted-messages #:accessor accepted-messages #:init-form '(hello))
- (speaking? #:accessor speaking? #:init-form #f)
- (velocity #:getter velocity #:init-form (vec2 0.0 0.0))
- (walk-speed #:accessor walk-speed #:init-form 0.8)
- (direction #:accessor direction #:init-form '(idle))
- (hitbox #:getter hitbox #:init-form (make-rect 8.0 0.0 16.0 16.0)))
-
(define-class <stats> (<node-2d>)
(object #:accessor object #:init-form #f #:init-keyword #:object))
@@ -83,55 +77,6 @@
directions)
(set! (direction character) directions))))
-(define-class <player> (<character>)
- (previous-key-presses #:accessor previous-key-presses #:init-form (list))
- (selecting-message? #:accessor selecting-message? #:init-form #f)
- (action-held #:accessor action-held #:init-form #f)
- (lifetime #:accessor lifetime #:init-form 100)
- (happiness #:accessor happiness #:init-form 50)
- (weight #:accessor weight #:init-form 50)
- (music #:accessor music #:init-form 50)
- (talking? #:accessor talking? #:init-form #f))
-
-(define (load-atlas file-name tile-width tile-height)
- (split-texture (load-image file-name) tile-width tile-height))
-
-(define-asset player-atlas
- (load-atlas "assets/images/lorenzo.png" 32 32))
-
-(define-method (populate (player <player>))
- (list
- (make <animated-sprite>
- #:name 'sprite
- #:atlas player-atlas
- #:animations '((idle-right . #(8 8 8 8 8 7 7 7 7 7))
- (idle-left . #(0 0 0 0 0 15 15 15 15 15))
- (idle-front . #(24 24 24 24 24 32 32 32 32 32))
- (idle-back . #(16))
- (left . #(1 35 2 35))
- (right . #(9 34 10 34))
- (up . #(17 16 18 16))
- (down . #(25 24 26 24)))
- #:current-animation 'idle-front
- #:frame-duration 10)))
-
-
-(define-class <reaper> (<character>))
-
-(define-asset reaper-atlas
- (load-atlas "assets/images/reaper.png" 32 32))
-
-(define-method (populate (reaper <reaper>))
- (list
- (make <animated-sprite>
- #:name 'sprite
- #:atlas reaper-atlas
- #:animations '((idle . #(0 0 0 1 1 1 9 1 1 1 8 8 8 8 8 8 5 4 4 4 0 0 0 3 3))
- (pause . #(4 4 4 4 4 4 4 5))
- (talk . #(0 3 2 7 5 4 6 5 3 2 2 2 4 4 0 0 0)))
- #:current-animation 'idle
- #:frame-duration 20)))
-
(define-asset test-map (load-tile-map "assets/maps/01.tmx"))
@@ -167,108 +112,8 @@ map's object layer."
(vec2 0.0 0.0))))
(define-method (populate (game <game>))
- (let ((player (make <player>
- #:name 'player
- #:position (start-position game "player")
- #:children
- ;; Simple player shadow. This should better be done
- ;; with a single ellipse shader.
- (let ((color (make-color 0 0 0 0.2)))
- (map (lambda (n x w)
- (make <filled-rect>
- #:region (make-rect 0.0 0.0 w 1.0)
- #:position (vec2 x (- 2 n))
- #:color color))
- ;; position in the stack
- (iota 5)
- ;; x offsets
- (list 12 10 8 10 12)
- ;; widths
- (list 8 12 16 12 8))))))
- (list (make <reaper>
- #:name 'reaper
- #:position (start-position game "reaper")
- #:conversations
- '((hello
- "Salutations!"
- ((who-are-you? "Who are you?")
- (bye "I have to leave now. Bye!")))
- (who-are-you?
- "It's complicated. People have given me too many names to recount.
-Paul Celan called me a master from Germany, but he must have confused
-me with somebody else. Some call me a part of life, but I think that's
-missing the point. Others call me the grim reaper, but do I look grim
-to you?"
- ((grim-no "No, not at all.")
- (grim-yes "Well, actually you kinda do...")
- (grim-bye "I can't answer, I need to go.")))
- (grim-bye
- "Well, I guess that's a 'yes'..."
- ())
- (grim-no
- "Ah, that's a relief!"
- ((what-do-you-do?
- "I hope you don't mind me asking: what is it you're
-doing here?")
- (bye
- "Well, it was nice meeting you. See you around!")))
- (grim-yes
- "Hmm, that's very unfortunate. I just can't figure out
-why people have that impression. It's rather depressing."
- ((its-the-robe "Maybe it's the robe?")
- (dont-worry "Aww, don't feel bad about it!")
- (bye "I'm sure you'll be okay. Gotta go!")))
- (its-the-robe
- "I don't see how this comfortable robe could have that
-effect. The fabric is a little coarse, I admit, but it's really
-durable and doesn't chafe on my bones. Excellent quality."
- ((what-do-you-do?
- "So... what do you do around here?")
- (bye "That's really interesting, but I'm afraid I need
-to hurry. Bye!")))
- (dont-worry
- "Yeah, I guess I shouldn't. It just tears me
-down. Luckily, the garden keeps me distracted."
- ((what-do-you-grow? "Oh, you have a garden? What do you
-grow there?")
- (bye "That's good. Well, I should go now. Bye!")))
- (what-do-you-do?
- "Well, you may have noticed the garden behind the house.
-For the past few eons I have been tending to it."
- ((eons? "Did you say 'eons'?")
- (what-do-you-grow? "Oh, that's nice! What do you grow there?")
- (bye "I see. Unfortunately, I must get going now.")))
- (eons?
- "Oh yes, I have been here long before you appeared and
-I will be here long after you will have rejoined the void. You could
-say that I /am/ the void, occasionally receding just enough for a
-little bit of inconsequential folly before eventually and invariably
-restoring equilibrium."
- ;; TODO
- ())
- (what-do-you-grow?
- "You know, this and that. I enjoy soul food, and it's
-best when the ingredients are fresh."
- ())
- (bye
- "Farewell! Don't be afraid, for I'm always here for
-you. I'm sure we will meet again sooner than you expect."
- ()))
- #:children
- ;; Simple shadow. This should better be done with a
- ;; single ellipse shader.
- (let ((color (make-color 0 0 0 0.2)))
- (map (lambda (n x w)
- (make <filled-rect>
- #:region (make-rect 0.0 0.0 w 1.0)
- #:position (vec2 (+ 3 x) (- 2 n))
- #:color color))
- ;; position in the stack
- (iota 5)
- ;; x offsets
- (list 12 10 8 10 12)
- ;; widths
- (list 12 16 20 16 12))))
+ (let ((player (lorenzo (start-position game "player"))))
+ (list (reaper (start-position game "reaper"))
(make <filled-rect>
#:name 'hit
#:region (make-rect 0.0 0.0 0.0 0.0)