annotate src/libmlk-core-js/core/js-game.c @ 378:460c78706989

misc: update copyright years
author David Demelier <markand@malikania.fr>
date Sun, 02 Jan 2022 10:22:48 +0100
parents 3c378be73844
children ef4d4a51aeb7
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 *
378
460c78706989 misc: update copyright years
David Demelier <markand@malikania.fr>
parents: 372
diff changeset
4 * Copyright (c) 2020-2022 David Demelier <markand@malikania.fr>
346
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>
356
26636fdb735d js: fix warning
David Demelier <markand@malikania.fr>
parents: 355
diff changeset
22 #include <core/state.h>
346
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
23
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include "js-game.h"
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include "js-state.h"
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 /*
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 * 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
29 */
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
30
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 static duk_ret_t
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 Game_push(duk_context *ctx)
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 {
372
3c378be73844 js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents: 361
diff changeset
34 struct js_state *state = js_state_require(ctx, 0);
346
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
35
355
3b2eed504c61 js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents: 346
diff changeset
36 if (game.state == &game.states[GAME_STATE_MAX]) {
372
3c378be73844 js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents: 361
diff changeset
37 state_finish(&state->st);
361
39f5d932941a misc: fix some warnings
David Demelier <markand@malikania.fr>
parents: 356
diff changeset
38 return 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
39 }
346
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
40
372
3c378be73844 js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents: 361
diff changeset
41 duk_push_this(ctx);
3c378be73844 js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents: 361
diff changeset
42 state->parent = duk_get_heapptr(ctx, -1);
3c378be73844 js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents: 361
diff changeset
43 duk_push_sprintf(ctx, "%p", state);
3c378be73844 js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents: 361
diff changeset
44 duk_dup(ctx, 0);
3c378be73844 js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents: 361
diff changeset
45 duk_put_prop(ctx, -3);
3c378be73844 js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents: 361
diff changeset
46 duk_pop(ctx);
3c378be73844 js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents: 361
diff changeset
47
3c378be73844 js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents: 361
diff changeset
48 game_push(&state->st);
346
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
49
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 return 0;
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 }
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 static duk_ret_t
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 Game_pop(duk_context *ctx)
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 {
361
39f5d932941a misc: fix some warnings
David Demelier <markand@malikania.fr>
parents: 356
diff changeset
56 (void)ctx;
39f5d932941a misc: fix some warnings
David Demelier <markand@malikania.fr>
parents: 356
diff changeset
57
346
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 if (game.state == &game.states[0])
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 return 0;
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
60
355
3b2eed504c61 js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents: 346
diff changeset
61 game_pop();
346
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_loop(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_loop();
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 duk_ret_t
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 Game_quit(duk_context *ctx)
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 {
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 (void)ctx;
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
80
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 game_quit();
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 return 0;
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 }
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
85
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 static const duk_function_list_entry functions[] = {
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 { "push", Game_push, 1 },
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 { "pop", Game_pop, 0 },
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 { "loop", Game_loop, 0 },
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 { "quit", Game_quit, 0 },
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 { NULL, NULL, 0 }
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 };
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
93
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 void
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 js_game_bind(duk_context *ctx)
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 {
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 assert(ctx);
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
98
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 duk_push_object(ctx);
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 duk_put_function_list(ctx, -1, functions);
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 duk_put_global_string(ctx, "Game");
323d13f49233 js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 }