]> git.lizzy.rs Git - nothing.git/blob - src/game/level_script.c
Merge pull request #618 from tsoding/broadcast
[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 hide_goal(void *param, Gc *gc, struct Scope *scope, struct Expr args)
13 {
14     trace_assert(param);
15     trace_assert(gc);
16     trace_assert(scope);
17
18     Level * const level = (Level*)param;
19     char * goal_id = NULL;
20
21     struct EvalResult result = match_list(gc, "s", args, &goal_id);
22     if (result.is_error) {
23         return result;
24     }
25
26     level_hide_goal(level, goal_id);
27
28     return eval_success(NIL(gc));
29 }
30
31 static struct EvalResult
32 show_goal(void *param, Gc *gc, struct Scope *scope, struct Expr args)
33 {
34     trace_assert(param);
35     trace_assert(gc);
36     trace_assert(scope);
37
38     Level * const level = (Level*)param;
39     const char *goal_id = NULL;
40
41     struct EvalResult result = match_list(gc, "s", args, &goal_id);
42     if (result.is_error) {
43         return result;
44     }
45
46     level_show_goal(level, goal_id);
47
48     return eval_success(NIL(gc));
49 }
50
51 static struct EvalResult
52 rect_apply_force(void *param, Gc *gc, struct Scope *scope, struct Expr args)
53 {
54     trace_assert(gc);
55     trace_assert(scope);
56     trace_assert(param);
57
58     Level *level = (Level*) param;
59
60     const char *rect_id = NULL;
61     struct Expr force = void_expr();
62     struct EvalResult result = match_list(gc, "se", args, &rect_id, &force);
63     if (result.is_error) {
64         return result;
65     }
66
67     long int force_x = 0L;
68     long int force_y = 0L;
69     result = match_list(gc, "dd", force, &force_x, &force_y);
70     if (result.is_error) {
71         return result;
72     }
73
74     Rigid_rect *rigid_rect = level_rigid_rect(level, rect_id);
75     if (rigid_rect != NULL) {
76         log_info("Found rect `%s`\n", rect_id);
77         log_info("Applying force (%ld, %ld)\n", force_x, force_y);
78         rigid_rect_apply_force(rigid_rect, vec((float) force_x, (float) force_y));
79         return eval_success(NIL(gc));
80     } else {
81         return eval_failure(list(gc, "qs", "unexisting-rigid-rect", rect_id));
82     }
83 }
84
85 static struct EvalResult
86 hide_label(void *param, Gc *gc, struct Scope *scope, struct Expr args)
87 {
88     trace_assert(param);
89     trace_assert(gc);
90     trace_assert(scope);
91
92     Level *level = (Level*) param;
93     const char *label_id = NULL;
94
95     struct EvalResult result = match_list(gc, "s", args, &label_id);
96     if (result.is_error) {
97         return result;
98     }
99
100     level_hide_label(level, label_id);
101
102     return eval_success(NIL(gc));
103 }
104
105 void load_level_library(Gc *gc, struct Scope *scope, Level *level)
106 {
107     set_scope_value(
108         gc,
109         scope,
110         SYMBOL(gc, "rect-apply-force"),
111         NATIVE(gc, rect_apply_force, level));
112     set_scope_value(
113         gc,
114         scope,
115         SYMBOL(gc, "hide-goal"),
116         NATIVE(gc, hide_goal, level));
117     set_scope_value(
118         gc,
119         scope,
120         SYMBOL(gc, "show-goal"),
121         NATIVE(gc, show_goal, level));
122     set_scope_value(
123         gc,
124         scope,
125         SYMBOL(gc, "hide-label"),
126         NATIVE(gc, hide_label, level));
127 }