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)))))))
|