Mercurial > molko
annotate libmlk-core/mlk/core/game.c @ 646:7e1eb7f6c049 default tip @
misc: remove .clang
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 04 Feb 2024 15:24:37 +0100 |
parents | 83781cc87fca |
children |
rev | line source |
---|---|
44
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * game.c -- main game object |
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
445
773a082f0b91
misc: update copyright years
David Demelier <markand@malikania.fr>
parents:
431
diff
changeset
|
4 * Copyright (c) 2020-2023 David Demelier <markand@malikania.fr> |
44
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
45
e10fd1b6323f
core: implement splashscreen, closes #2458 @1h
David Demelier <markand@malikania.fr>
parents:
44
diff
changeset
|
19 #include <assert.h> |
57
9f6267843815
core: implement basic actions, closes #2463 @1h
David Demelier <markand@malikania.fr>
parents:
45
diff
changeset
|
20 #include <string.h> |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
21 #include <setjmp.h> |
44
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
165
diff
changeset
|
23 #include "clock.h" |
586 | 24 #include "core_p.h" |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
485
diff
changeset
|
25 #include "err.h" |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
165
diff
changeset
|
26 #include "event.h" |
44
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 #include "game.h" |
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 #include "state.h" |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
165
diff
changeset
|
29 #include "util.h" |
248
37771eaf4245
core: use vsync and improve game loop
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
30 #include "window.h" |
44
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
32 enum { |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
33 JMP_OK = 0, |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
34 JMP_PUSH, |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
35 JMP_POP |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
36 }; |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
37 |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
485
diff
changeset
|
38 static struct mlk_state *states[8]; |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
39 static jmp_buf game_jmp_buf; |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
40 static int game_jmp_allowed; |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
41 static int game_run = 1; |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
485
diff
changeset
|
42 |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
485
diff
changeset
|
43 struct mlk_game mlk_game = { |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
485
diff
changeset
|
44 .states = states, |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
485
diff
changeset
|
45 .statesz = MLK_UTIL_SIZE(states) |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
485
diff
changeset
|
46 }; |
44
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 |
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 void |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
485
diff
changeset
|
49 mlk_game_init(void) |
311
f10fd1293a7e
core: fix states + tests
David Demelier <markand@malikania.fr>
parents:
300
diff
changeset
|
50 { |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
485
diff
changeset
|
51 for (size_t i = 0; i < mlk_game.statesz; ++i) |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
485
diff
changeset
|
52 mlk_game.states[i] = NULL; |
311
f10fd1293a7e
core: fix states + tests
David Demelier <markand@malikania.fr>
parents:
300
diff
changeset
|
53 } |
f10fd1293a7e
core: fix states + tests
David Demelier <markand@malikania.fr>
parents:
300
diff
changeset
|
54 |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
55 _Noreturn int |
469
0d6206cee6b9
core: state -> mlk_state
David Demelier <markand@malikania.fr>
parents:
454
diff
changeset
|
56 mlk_game_push(struct mlk_state *state) |
45
e10fd1b6323f
core: implement splashscreen, closes #2458 @1h
David Demelier <markand@malikania.fr>
parents:
44
diff
changeset
|
57 { |
e10fd1b6323f
core: implement splashscreen, closes #2458 @1h
David Demelier <markand@malikania.fr>
parents:
44
diff
changeset
|
58 assert(state); |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
59 assert(game_jmp_allowed); |
162 | 60 |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
485
diff
changeset
|
61 if (mlk_game.state == &mlk_game.states[mlk_game.statesz - 1]) |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
62 mlk_errf(_("no space in game states stack")); |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
63 |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
64 mlk_game.state[1] = state; |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
65 longjmp(game_jmp_buf, JMP_PUSH); |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
66 } |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
485
diff
changeset
|
67 |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
68 _Noreturn void |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
69 mlk_game_pop(void) |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
70 { |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
71 assert(game_jmp_allowed); |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
485
diff
changeset
|
72 |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
73 longjmp(game_jmp_buf, JMP_POP); |
45
e10fd1b6323f
core: implement splashscreen, closes #2458 @1h
David Demelier <markand@malikania.fr>
parents:
44
diff
changeset
|
74 } |
e10fd1b6323f
core: implement splashscreen, closes #2458 @1h
David Demelier <markand@malikania.fr>
parents:
44
diff
changeset
|
75 |
299
648f5f949afb
core: implement stackable states
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
76 void |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
77 mlk_game_loop(struct mlk_state *state) |
260
60a214ec1ab4
adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
248
diff
changeset
|
78 { |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
79 assert(state); |
57
9f6267843815
core: implement basic actions, closes #2463 @1h
David Demelier <markand@malikania.fr>
parents:
45
diff
changeset
|
80 |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
81 struct mlk_clock clock = {}; |
248
37771eaf4245
core: use vsync and improve game loop
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
82 unsigned int elapsed = 0; |
37771eaf4245
core: use vsync and improve game loop
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
83 unsigned int frametime; |
37771eaf4245
core: use vsync and improve game loop
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
84 |
485
3ff1fe64d0cd
core: window -> mlk_window
David Demelier <markand@malikania.fr>
parents:
474
diff
changeset
|
85 if (mlk_window.framerate > 0) |
3ff1fe64d0cd
core: window -> mlk_window
David Demelier <markand@malikania.fr>
parents:
474
diff
changeset
|
86 frametime = 1000 / mlk_window.framerate; |
248
37771eaf4245
core: use vsync and improve game loop
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
87 else |
583
5a4e5b852f8a
core: make sure we never exceed 60FPS ticks
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
88 /* Assuming 60.0 FPS. */ |
5a4e5b852f8a
core: make sure we never exceed 60FPS ticks
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
89 frametime = 1000.0 / 60.0; |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
165
diff
changeset
|
90 |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
91 game_jmp_allowed = 1; |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
92 |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
93 while (game_run) { |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
94 switch (setjmp(game_jmp_buf)) { |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
95 case JMP_OK: |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
96 /* Initial entrypoint. */ |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
97 if (!mlk_game.state) { |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
98 mlk_game.states[0] = state; |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
99 mlk_game.state = &mlk_game.states[0]; |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
100 mlk_state_start(state); |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
101 } |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
102 |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
103 mlk_clock_start(&clock); |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
165
diff
changeset
|
104 |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
105 for (union mlk_event ev; mlk_event_poll(&ev); ) { |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
106 if (mlk_game.state && !(mlk_game.inhibit & MLK_GAME_INHIBIT_INPUT)) |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
107 mlk_state_handle(*mlk_game.state, ev); |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
108 } |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
165
diff
changeset
|
109 |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
110 if (mlk_game.state && !(mlk_game.inhibit & MLK_GAME_INHIBIT_UPDATE)) |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
111 mlk_state_update(*mlk_game.state, ticks); |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
112 if (mlk_game.state && !(mlk_game.inhibit & MLK_GAME_INHIBIT_DRAW)) |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
113 mlk_state_draw(*mlk_game.state); |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
114 |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
115 /* |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
116 * If vsync is enabled, it should have wait, otherwise |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
117 * sleep a little to save CPU cycles. |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
118 */ |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
119 if ((elapsed = mlk_clock_elapsed(&clock)) < frametime) |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
120 mlk_util_sleep(frametime - elapsed); |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
121 |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
122 elapsed = mlk_clock_elapsed(&clock); |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
165
diff
changeset
|
123 |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
124 /* |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
125 * Cap to frametime if it's too slow because it would |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
126 * create unexpected results otherwise. |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
127 */ |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
128 if (elapsed > frametime) |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
129 elapsed = frametime; |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
130 break; |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
131 case JMP_PUSH: |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
132 /* |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
133 * We have pushed a new state, suspend should not modify |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
134 * the stack because we would have a leak in the next |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
135 * state being overriden without being finalized. |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
136 */ |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
137 game_jmp_allowed = 0; |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
138 mlk_state_suspend(*mlk_game.state); |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
139 game_jmp_allowed = 1; |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
165
diff
changeset
|
140 |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
141 /* Start next state. */ |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
142 mlk_state_start(*++mlk_game.state); |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
143 break; |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
144 case JMP_POP: |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
145 /* |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
146 * We need to finalize this state so the end/finish |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
147 * functions are not allowed to modify the stack. |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
148 */ |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
149 game_jmp_allowed = 0; |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
150 mlk_state_end(*mlk_game.state); |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
151 mlk_state_finish(*mlk_game.state); |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
152 game_jmp_allowed = 1; |
583
5a4e5b852f8a
core: make sure we never exceed 60FPS ticks
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
153 |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
154 /* Resume previous state. */ |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
155 if (mlk_game.state == mlk_game.states) |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
156 mlk_game.state = NULL; |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
157 else |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
158 mlk_state_resume(*--mlk_game.state); |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
159 break; |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
160 default: |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
161 break; |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
162 } |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
165
diff
changeset
|
163 } |
44
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
164 } |
57
9f6267843815
core: implement basic actions, closes #2463 @1h
David Demelier <markand@malikania.fr>
parents:
45
diff
changeset
|
165 |
80
05ffbcdee585
adventure: create main menu, closes #2482 @4h
David Demelier <markand@malikania.fr>
parents:
78
diff
changeset
|
166 void |
452
f89147faf8cf
core: game -> mlk_game
David Demelier <markand@malikania.fr>
parents:
450
diff
changeset
|
167 mlk_game_quit(void) |
80
05ffbcdee585
adventure: create main menu, closes #2482 @4h
David Demelier <markand@malikania.fr>
parents:
78
diff
changeset
|
168 { |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
169 game_jmp_allowed = 0; |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
170 game_run = 0; |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
586
diff
changeset
|
171 |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
485
diff
changeset
|
172 for (size_t i = 0; i < mlk_game.statesz; ++i) { |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
485
diff
changeset
|
173 if (mlk_game.states[i]) |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
485
diff
changeset
|
174 mlk_state_finish(mlk_game.states[i]); |
300
3638b39ef2bf
examples: fix with new game_push function
David Demelier <markand@malikania.fr>
parents:
299
diff
changeset
|
175 |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
485
diff
changeset
|
176 mlk_game.states[i] = NULL; |
311
f10fd1293a7e
core: fix states + tests
David Demelier <markand@malikania.fr>
parents:
300
diff
changeset
|
177 } |
529 | 178 |
179 mlk_game.state = NULL; | |
80
05ffbcdee585
adventure: create main menu, closes #2482 @4h
David Demelier <markand@malikania.fr>
parents:
78
diff
changeset
|
180 } |