;;; The Inevitable Game ;;; Copyright © 2018 Ricardo Wurmus ;;; ;;; 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 ;;; . (define-module (characters lorenzo) #:use-module (chickadee render texture) #:use-module (chickadee render color) #:use-module (chickadee render shader) #: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 ( previous-key-presses selecting-message? wants-to-stop-talking? resume-messages lifetime happiness weight music talking? lorenzo player-atlas)) ;; Copied from (chickadee render sprite) (define default-shader (delay (strings->shader " #version 130 in vec2 position; in vec2 tex; out vec2 frag_tex; uniform mat4 mvp; void main(void) { frag_tex = tex; gl_Position = mvp * vec4(position.xy, 0.0, 1.0); } " " #version 130 in vec2 frag_tex; uniform sampler2D color_texture; void main (void) { gl_FragColor = texture2D(color_texture, frag_tex); } "))) (define-class () (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)) (shader default-shader)) (make #:name 'player #:position position #:children (cons (make #:name 'sprite #:atlas player-atlas #:shader shader #: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 #: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))))))