;;; Catbird Game Engine ;;; Copyright © 2022 David Thompson ;;; ;;; Catbird 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. ;;; ;;; Catbird 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 Catbird. If not, see . ;;; Commentary: ;; ;; Catbird engine entry point. ;; ;;; Code: (define-module (catbird) #:use-module (catbird camera) #:use-module (catbird config) #:use-module (catbird input-map) #:use-module (catbird kernel) #:use-module (catbird minibuffer) #:use-module (catbird mode) #:use-module (catbird overlay) #:use-module (catbird region) #:use-module (catbird scene) #:use-module (catbird ui) #:use-module (chickadee) #:use-module (chickadee math rect) #:use-module (oop goops) #:export (run-catbird exit-catbird)) ;; Add the system notification and debugging overlay. (define (add-overlay) (let ((region (create-full-region #:name 'overlay #:rank 9999)) (overlay-scene (make-overlay))) (set! (camera region) (make #:width (rect-width (area region)) #:height (rect-height (area region)))) (replace-scene region overlay-scene) (add-minor-mode overlay-scene (make )))) (define (overlay-scene) (scene (find-region-by-name 'overlay))) (define-method (notify message) (notify (overlay-scene) message)) (define (open-minibuffer) (push-major-mode (overlay-scene) (make ))) (bind-input/global (key-press 'x '(alt)) open-minibuffer) (define* (run-catbird thunk #:key (width 1366) (height 768) (title "^~Catbird~^") (fullscreen? #f) (resizable? #t) (update-hz 60)) (let ((kernel (make ))) (parameterize ((current-kernel kernel)) (run-game #:window-title title #:window-width width #:window-height height #:window-fullscreen? fullscreen? #:window-resizable? resizable? #:update-hz update-hz #:load (lambda () (load* kernel) (thunk) (add-overlay)) #:error (lambda (e stack) (on-error kernel e stack)) #:draw (lambda (alpha) (render kernel alpha)) #:update (lambda (dt) (update kernel dt)) #:key-press (lambda (key modifiers repeat?) (on-key-press kernel key modifiers)) #:key-release (lambda (key modifiers) (on-key-release kernel key modifiers)) #:text-input (lambda (text) (on-text-input kernel text)) #:mouse-press ;; TODO: Handle click counter? (lambda (button clicks x y) (on-mouse-press kernel button x y)) #:mouse-release (lambda (button x y) (on-mouse-release kernel button x y)) #:mouse-move (lambda (x y x-rel y-rel buttons) (on-mouse-move kernel x y x-rel y-rel buttons)) #:mouse-wheel (lambda (x y) (on-mouse-wheel kernel x y)) #:controller-add (lambda (controller) (on-controller-add kernel controller)) #:controller-remove (lambda (controller) (on-controller-remove kernel controller)) #:controller-press (lambda (controller button) (on-controller-press kernel controller button)) #:controller-release (lambda (controller button) (on-controller-release kernel controller button)) #:controller-move (lambda (controller axis value) (on-controller-move kernel controller axis value)))))) (define (exit-catbird) "Stop the Catbird engine." (abort-game))