diff options
author | Ricardo Wurmus <rekado@elephly.net> | 2018-07-21 22:50:45 +0200 |
---|---|---|
committer | Ricardo Wurmus <rekado@elephly.net> | 2018-07-27 17:15:46 +0200 |
commit | c30d1dabc129bf170123c39191dce8d984a0cd39 (patch) | |
tree | a94fd787bfce38cebc12dfc0b10eb43a860b7728 | |
parent | 88e05c30a8537695d162db11302b99ed4d54df94 (diff) |
Move characters to separate modules.
-rw-r--r-- | characters.scm | 53 | ||||
-rw-r--r-- | characters/lorenzo.scm | 86 | ||||
-rw-r--r-- | characters/reaper.scm | 143 | ||||
-rw-r--r-- | scenes/game.scm | 165 |
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) |