#| This file is a part of stoe project. Copyright (c) 2014 Renaud Casenave-Péré (renaud@casenave-pere.fr) |# (uiop:define-package :stoe/core/modules (:use :cl) (:export #:initialize-modules #:finalize-modules #:update-modules #:defmodule)) (in-package :stoe/core/modules) (defparameter *modules-list* nil) (defun initialize-modules (&optional argv) "Perform the engine and subsystems initialization process." (format t "Initialize...~%") (loop for module in *modules-list* do (funcall (intern "INITIALIZE" (cdr module)) argv))) (defun finalize-modules () "Perform the engine and subsystems initialization process." (format t "Initialize...~%") (loop for module in (reverse *modules-list*) do (funcall (intern "FINALIZE" (cdr module))))) (defun update-modules (delta-time) "Update-the modules each loop." (loop for module in *modules-list* do (funcall (intern "UPDATE" (cdr module)) delta-time))) (defun register-module (module priority) (pushnew (cons priority module) *modules-list*) (sort *modules-list* (lambda (prio1 prio2) (< prio1 prio2)) :key #'car)) (defmacro defmodule (module priority) "Register a new module. The module is expected to have at least `initialize', `update', and `finalize' functions. `initialize' accepts an optional `argv' argument, `update' accepts a delta-time argument." `(register-module ',module ,(ecase priority (:first (if (null *modules-list*) 0 (1- (caar *modules-list*)))) (:last (if (null *modules-list*) 10 (1+ (caar (reverse *modules-list*))))) (:jobs 1) (:resources 2) (:input 3) (:game 4) (:render 9) (t priority))))