123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- #include "eruta.h"
- #include "react.h"
- #include "state.h"
- #include "mode.h"
- /*
- * A Mode is a mode of the program in which the display and controls may
- * be different. Examples of this may be a menu mode, play mode,
- * edit mode, intro mode, etc.
- * XXX: this is currently superceded by the mruby side of the Eruta engine.
- *
- */
- struct Mode_ {
- React react; // reactions to (possibly) use in this mode.
- ModeActs * acts;
- int id;
- int busy;
- Mode * prev; // mode left to enter this mode, if any
- Mode * next; // mode to leave to, if any
- };
- #define ACT_OK(SELF, ACT) ((self) && (self->acts) && (self->acts->ACT))
-
- Mode * mode_start(Mode * self) {
- if(!ACT_OK(self, start)) return NULL;
- return self->acts->start(self);
- }
- Mode * mode_enter(Mode * self, Mode * other) {
- if(!ACT_OK(self, enter)) return NULL;
- return self->acts->enter(self, other);
- }
- Mode * mode_leave(Mode * self, Mode * other) {
- if(!ACT_OK(self, leave)) return NULL;
- return self->acts->leave(self, other);
- }
- Mode * mode_stop(Mode * self) {
- if(!ACT_OK(self, stop)) return NULL;
- return self->acts->stop(self);
- }
- Mode * mode_paint(Mode * self, ALLEGRO_DISPLAY * display) {
- if(!ACT_OK(self, paint)) return NULL;
- return self->acts->paint(self, display);
- }
- Mode * mode_event(Mode * self, ALLEGRO_EVENT * event) {
- if(!ACT_OK(self, event)) return NULL;
- return self->acts->event(self, event);
- }
- /* Initializes a mode. */
- Mode * mode_init(Mode * self, State * state, ModeActs * acts, int id) {
- self->acts = acts;
- self->next = NULL;
- self->prev = NULL;
- self->id = id;
- self->busy = true;
- react_initempty(&self->react, state);
- return mode_start(self);
- }
- /* default "else" mode. */
- Mode * elsemode_start(Mode * self) {
- return self;
- }
- Mode * elsemode_enter(Mode * self, Mode * other) {
- self->prev = other;
- return other;
- }
- Mode * elsemode_leave(Mode * self, Mode * other) {
- self->next = other;
- return other;
- }
- Mode * elsemode_stop(Mode * self) {
- return self;
- }
- Mode * elsemode_paint(Mode * self, ALLEGRO_DISPLAY * display) {
- (void) self; (void) display;
- return NULL;
- }
- Mode * elsemode_event(Mode * self, ALLEGRO_EVENT * event) {
- (void) self; (void) event;
- return NULL;
- }
- ModeActs elsemode_acts_ = {
- elsemode_start,
- elsemode_enter,
- elsemode_leave,
- elsemode_paint,
- elsemode_event,
- elsemode_stop
- };
- ModeActs * elsemode_getacts() {
- return &elsemode_acts_;
- }
- /* Returns the mode's react struct for event handling. */
- React * mode_react(Mode * self) {
- if(!self) return NULL;
- return &self->react;
- }
|