]> git.lizzy.rs Git - nothing.git/blob - src/game/level_script.c
Merge pull request #621 from tsoding/615
[nothing.git] / src / game / level_script.c
1 #include "system/stacktrace.h"
2
3 #include "ebisp/gc.h"
4 #include "ebisp/interpreter.h"
5 #include "ebisp/scope.h"
6 #include "game/level/player/rigid_rect.h"
7 #include "level.h"
8 #include "level_script.h"
9 #include "system/log.h"
10
11 static struct EvalResult
12 rect_apply_force(void *param, Gc *gc, struct Scope *scope, struct Expr args)
13 {
14     trace_assert(gc);
15     trace_assert(scope);
16     trace_assert(param);
17
18     Level *level = (Level*) param;
19
20     const char *rect_id = NULL;
21     struct Expr force = void_expr();
22     struct EvalResult result = match_list(gc, "se", args, &rect_id, &force);
23     if (result.is_error) {
24         return result;
25     }
26
27     long int force_x = 0L;
28     long int force_y = 0L;
29     result = match_list(gc, "dd", force, &force_x, &force_y);
30     if (result.is_error) {
31         return result;
32     }
33
34     Rigid_rect *rigid_rect = level_rigid_rect(level, rect_id);
35     if (rigid_rect != NULL) {
36         log_info("Found rect `%s`\n", rect_id);
37         log_info("Applying force (%ld, %ld)\n", force_x, force_y);
38         rigid_rect_apply_force(rigid_rect, vec((float) force_x, (float) force_y));
39         return eval_success(NIL(gc));
40     } else {
41         return eval_failure(list(gc, "qs", "unexisting-rigid-rect", rect_id));
42     }
43 }
44
45 static struct EvalResult
46 hide_label(void *param, Gc *gc, struct Scope *scope, struct Expr args)
47 {
48     trace_assert(param);
49     trace_assert(gc);
50     trace_assert(scope);
51
52     Level *level = (Level*) param;
53     const char *label_id = NULL;
54
55     struct EvalResult result = match_list(gc, "s", args, &label_id);
56     if (result.is_error) {
57         return result;
58     }
59
60     level_hide_label(level, label_id);
61
62     return eval_success(NIL(gc));
63 }
64
65 void load_level_library(Gc *gc, struct Scope *scope, Level *level)
66 {
67     set_scope_value(
68         gc,
69         scope,
70         SYMBOL(gc, "rect-apply-force"),
71         NATIVE(gc, rect_apply_force, level));
72     set_scope_value(
73         gc,
74         scope,
75         SYMBOL(gc, "hide-label"),
76         NATIVE(gc, hide_label, level));
77 }