Mercurial > molko
annotate libmlk-core/mlk/core/game.h @ 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.h -- 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 |
366
19782ea1cf4a
misc: start rebranding
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
19 #ifndef MLK_CORE_GAME_H |
19782ea1cf4a
misc: start rebranding
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
20 #define MLK_CORE_GAME_H |
44
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
22 /** |
532
3b9f2c82cbae
doc: fix file inclusion
David Demelier <markand@malikania.fr>
parents:
522
diff
changeset
|
23 * \file mlk/core/game.h |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
24 * \brief Main game object |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
25 * |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
26 * For convenience, the default game structure is already initialized with an |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
27 * array of 8 states usable. |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
28 */ |
389
ef4d4a51aeb7
core: game don't use fixed size states
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
29 |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
30 #include <stddef.h> |
57
9f6267843815
core: implement basic actions, closes #2463 @1h
David Demelier <markand@malikania.fr>
parents:
45
diff
changeset
|
31 |
469
0d6206cee6b9
core: state -> mlk_state
David Demelier <markand@malikania.fr>
parents:
462
diff
changeset
|
32 struct mlk_state; |
44
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
34 union mlk_event; |
44
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
36 /** |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
37 * \enum mlk_game_inhibit |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
38 * \brief Inhibit game loop |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
39 */ |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
40 enum mlk_game_inhibit { |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
41 /** |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
42 * Inhibit user input. |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
43 */ |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
44 MLK_GAME_INHIBIT_INPUT = (1 << 0), |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
45 |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
46 /** |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
47 * Inhibit game update. |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
48 */ |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
49 MLK_GAME_INHIBIT_UPDATE = (1 << 1), |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
50 |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
51 /** |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
52 * Inhibit drawing. |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
53 * |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
54 * \note Turning off drawing can introduce weird results on some |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
55 * platforms. |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
56 */ |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
57 MLK_GAME_INHIBIT_DRAW = (1 << 2) |
44
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 }; |
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
60 /** |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
61 * \struct mlk_game |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
62 * \brief Game structure |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
63 */ |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
64 struct mlk_game { |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
65 /** |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
66 * (read-write) |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
67 * |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
68 * Inhibit a state function from the game loop. |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
69 * |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
70 * Enabling any flags on this field will skip according function from |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
71 * the loop. |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
72 */ |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
73 enum mlk_game_inhibit inhibit; |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
74 |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
75 /** |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
76 * (read-write, borrowed) |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
77 * |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
78 * Array of non-owning states. |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
79 */ |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
80 struct mlk_state **states; |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
81 |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
82 /** |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
83 * Number of states in array ::mlk_game::states. |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
84 * |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
85 * \warning Changing this value must be kept in sync with the array |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
86 * dimension. |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
87 */ |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
88 size_t statesz; |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
89 |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
90 /** \cond MLK_PRIVATE_DECLS */ |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
91 struct mlk_state **state; |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
92 /** \endcond MLK_PRIVATE_DECLS */ |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
93 }; |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
94 |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
95 /** |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
96 * \brief Main game loop structure. |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
97 */ |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
98 extern struct mlk_game mlk_game; |
44
c97fe725fdeb
core: implement basic states, closes #2457 @1h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 |
517
6e8f6640e05b
misc: use extern C manually
David Demelier <markand@malikania.fr>
parents:
469
diff
changeset
|
100 #if defined(__cplusplus) |
6e8f6640e05b
misc: use extern C manually
David Demelier <markand@malikania.fr>
parents:
469
diff
changeset
|
101 extern "C" { |
6e8f6640e05b
misc: use extern C manually
David Demelier <markand@malikania.fr>
parents:
469
diff
changeset
|
102 #endif |
292
08ab73b32832
misc: add extern "C" {} blocks for C++ friends
David Demelier <markand@malikania.fr>
parents:
260
diff
changeset
|
103 |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
104 /** |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
105 * Initialize the main game loop. |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
106 */ |
45
e10fd1b6323f
core: implement splashscreen, closes #2458 @1h
David Demelier <markand@malikania.fr>
parents:
44
diff
changeset
|
107 void |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
108 mlk_game_init(void); |
311
f10fd1293a7e
core: fix states + tests
David Demelier <markand@malikania.fr>
parents:
299
diff
changeset
|
109 |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
110 /** |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
548
diff
changeset
|
111 * Append the state into the game stack and switch to it, suspending current |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
548
diff
changeset
|
112 * state. |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
113 * |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
548
diff
changeset
|
114 * The function takes ownership of the state and will be finalized later. |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
115 * |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
116 * \pre state != NULL |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
548
diff
changeset
|
117 * \param state the state to switch |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
118 */ |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
548
diff
changeset
|
119 _Noreturn void |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
120 mlk_game_push(struct mlk_state *state); |
45
e10fd1b6323f
core: implement splashscreen, closes #2458 @1h
David Demelier <markand@malikania.fr>
parents:
44
diff
changeset
|
121 |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
122 /** |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
123 * Pop the current state if any and resume the previous one. |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
124 */ |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
548
diff
changeset
|
125 _Noreturn void |
452
f89147faf8cf
core: game -> mlk_game
David Demelier <markand@malikania.fr>
parents:
450
diff
changeset
|
126 mlk_game_pop(void); |
260
60a214ec1ab4
adventure: change the way states are stored
David Demelier <markand@malikania.fr>
parents:
253
diff
changeset
|
127 |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
128 /** |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
129 * Enter a game loop until there is no more states. |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
130 * |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
131 * The current implementation will perform a loop capped to a 60 FPS rate and |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
132 * update the states with the appropriate number of ticks. |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
548
diff
changeset
|
133 * |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
548
diff
changeset
|
134 * \pre state != NULL |
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
548
diff
changeset
|
135 * \param state the first state to run |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
136 */ |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
137 void |
645
83781cc87fca
core: rework game stack state mechanism
David Demelier <markand@malikania.fr>
parents:
548
diff
changeset
|
138 mlk_game_loop(struct mlk_state *state); |
207
133926e08d6e
examples: use game_loop for all
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
139 |
522
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
140 /** |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
141 * Request the game loop to stop by removing all states. |
f45a023f6690
core: doxygenize game
David Demelier <markand@malikania.fr>
parents:
517
diff
changeset
|
142 */ |
80
05ffbcdee585
adventure: create main menu, closes #2482 @4h
David Demelier <markand@malikania.fr>
parents:
74
diff
changeset
|
143 void |
452
f89147faf8cf
core: game -> mlk_game
David Demelier <markand@malikania.fr>
parents:
450
diff
changeset
|
144 mlk_game_quit(void); |
80
05ffbcdee585
adventure: create main menu, closes #2482 @4h
David Demelier <markand@malikania.fr>
parents:
74
diff
changeset
|
145 |
517
6e8f6640e05b
misc: use extern C manually
David Demelier <markand@malikania.fr>
parents:
469
diff
changeset
|
146 #if defined(__cplusplus) |
6e8f6640e05b
misc: use extern C manually
David Demelier <markand@malikania.fr>
parents:
469
diff
changeset
|
147 } |
6e8f6640e05b
misc: use extern C manually
David Demelier <markand@malikania.fr>
parents:
469
diff
changeset
|
148 #endif |
292
08ab73b32832
misc: add extern "C" {} blocks for C++ friends
David Demelier <markand@malikania.fr>
parents:
260
diff
changeset
|
149 |
366
19782ea1cf4a
misc: start rebranding
David Demelier <markand@malikania.fr>
parents:
320
diff
changeset
|
150 #endif /* !MLK_CORE_GAME_H */ |