summaryrefslogtreecommitdiff
path: root/characters/lorenzo.scm
blob: 7615b36cf051dd4d28c605b4d795278890163f67 (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
;;; The Inevitable Game
;;; Copyright © 2018, 2019, 2021 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 graphics texture)
  #:use-module (chickadee graphics 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

            player-atlas))

(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 #:key
                  (position (vec2 0 0))
                  (dead? #f))
  (make <player>
    #:name 'player
    #:position position
    #:children
    (cons
     (make <animated-sprite>
       #:name 'sprite
       #:atlas player-atlas
       #:tint (if dead?
                  (make-color 1.0 1.0 1.0 0.5)
                  (make-color 1.0 1.0 1.0 1.0))
       #:animations '((idle-right . #(24 24 24 24 24 39 39 39 39 39))
                      (idle-left  . #(32 32 32 32 32 31 31 31 31 31))
                      (idle-front . #(8 8 8 8 8 0 0 0 0 0))
                      (idle-back  . #(16))
                      (left       . #(33 3 34 3))
                      (right      . #(25 2 26 2))
                      (up         . #(17 16 18 16))
                      (down       . #(9 8 10 8)))
       #:current-animation 'idle-front
       #:frame-duration 10)
     (if dead? '()
         ;; 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)))))))