annotate src/libmlk-core-js/core/js-game.c @ 355:3b2eed504c61

js: simplify game/state mechanism
author David Demelier <markand@malikania.fr>
date Fri, 22 Oct 2021 10:19:35 +0200
parents 323d13f49233
children 26636fdb735d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
346
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * js-game.c -- core gamej binding
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020-2021 David Demelier <markand@malikania.fr>
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
20
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <core/game.h>
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
22
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include "js-game.h"
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include "js-state.h"
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
25
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 /*
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 * TODO: determine if it's worth it to add handle, update and draw functions.
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 */
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 static duk_ret_t
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 Game_push(duk_context *ctx)
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 {
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 struct state *state = js_state_require(ctx, 0);
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
34
355
3b2eed504c61 js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents: 346
diff changeset
35 if (game.state == &game.states[GAME_STATE_MAX]) {
3b2eed504c61 js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents: 346
diff changeset
36 state_finish(state);
346
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 duk_error(ctx, DUK_ERR_RANGE_ERROR, "too many states");
355
3b2eed504c61 js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents: 346
diff changeset
38 }
346
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
39
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 game_push(state);
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
41
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 return 0;
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 }
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
44
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 static duk_ret_t
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 Game_pop(duk_context *ctx)
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 {
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 if (game.state == &game.states[0])
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 return 0;
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
50
355
3b2eed504c61 js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents: 346
diff changeset
51 game_pop();
346
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
52
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 return 0;
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 }
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
55
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 static duk_ret_t
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 Game_loop(duk_context *ctx)
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 {
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 (void)ctx;
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
60
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 game_loop();
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
62
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 return 0;
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 }
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
65
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 static duk_ret_t
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 Game_quit(duk_context *ctx)
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 {
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 (void)ctx;
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
70
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 game_quit();
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
72
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 return 0;
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 }
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
75
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 static const duk_function_list_entry functions[] = {
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 { "push", Game_push, 1 },
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 { "pop", Game_pop, 0 },
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 { "loop", Game_loop, 0 },
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 { "quit", Game_quit, 0 },
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 { NULL, NULL, 0 }
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 };
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
83
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 void
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 js_game_bind(duk_context *ctx)
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 {
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 assert(ctx);
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
88
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 duk_push_object(ctx);
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 duk_put_function_list(ctx, -1, functions);
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 duk_put_global_string(ctx, "Game");
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 }