mode.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #include "eruta.h"
  2. #include "react.h"
  3. #include "state.h"
  4. #include "mode.h"
  5. /*
  6. * A Mode is a mode of the program in which the display and controls may
  7. * be different. Examples of this may be a menu mode, play mode,
  8. * edit mode, intro mode, etc.
  9. * XXX: this is currently superceded by the mruby side of the Eruta engine.
  10. *
  11. */
  12. struct Mode_ {
  13. React react; // reactions to (possibly) use in this mode.
  14. ModeActs * acts;
  15. int id;
  16. int busy;
  17. Mode * prev; // mode left to enter this mode, if any
  18. Mode * next; // mode to leave to, if any
  19. };
  20. #define ACT_OK(SELF, ACT) ((self) && (self->acts) && (self->acts->ACT))
  21. Mode * mode_start(Mode * self) {
  22. if(!ACT_OK(self, start)) return NULL;
  23. return self->acts->start(self);
  24. }
  25. Mode * mode_enter(Mode * self, Mode * other) {
  26. if(!ACT_OK(self, enter)) return NULL;
  27. return self->acts->enter(self, other);
  28. }
  29. Mode * mode_leave(Mode * self, Mode * other) {
  30. if(!ACT_OK(self, leave)) return NULL;
  31. return self->acts->leave(self, other);
  32. }
  33. Mode * mode_stop(Mode * self) {
  34. if(!ACT_OK(self, stop)) return NULL;
  35. return self->acts->stop(self);
  36. }
  37. Mode * mode_paint(Mode * self, ALLEGRO_DISPLAY * display) {
  38. if(!ACT_OK(self, paint)) return NULL;
  39. return self->acts->paint(self, display);
  40. }
  41. Mode * mode_event(Mode * self, ALLEGRO_EVENT * event) {
  42. if(!ACT_OK(self, event)) return NULL;
  43. return self->acts->event(self, event);
  44. }
  45. /* Initializes a mode. */
  46. Mode * mode_init(Mode * self, State * state, ModeActs * acts, int id) {
  47. self->acts = acts;
  48. self->next = NULL;
  49. self->prev = NULL;
  50. self->id = id;
  51. self->busy = true;
  52. react_initempty(&self->react, state);
  53. return mode_start(self);
  54. }
  55. /* default "else" mode. */
  56. Mode * elsemode_start(Mode * self) {
  57. return self;
  58. }
  59. Mode * elsemode_enter(Mode * self, Mode * other) {
  60. self->prev = other;
  61. return other;
  62. }
  63. Mode * elsemode_leave(Mode * self, Mode * other) {
  64. self->next = other;
  65. return other;
  66. }
  67. Mode * elsemode_stop(Mode * self) {
  68. return self;
  69. }
  70. Mode * elsemode_paint(Mode * self, ALLEGRO_DISPLAY * display) {
  71. (void) self; (void) display;
  72. return NULL;
  73. }
  74. Mode * elsemode_event(Mode * self, ALLEGRO_EVENT * event) {
  75. (void) self; (void) event;
  76. return NULL;
  77. }
  78. ModeActs elsemode_acts_ = {
  79. elsemode_start,
  80. elsemode_enter,
  81. elsemode_leave,
  82. elsemode_paint,
  83. elsemode_event,
  84. elsemode_stop
  85. };
  86. ModeActs * elsemode_getacts() {
  87. return &elsemode_acts_;
  88. }
  89. /* Returns the mode's react struct for event handling. */
  90. React * mode_react(Mode * self) {
  91. if(!self) return NULL;
  92. return &self->react;
  93. }