1 #include "system/stacktrace.h"
4 #include "ebisp/interpreter.h"
5 #include "ebisp/scope.h"
6 #include "game/level/player/rigid_rect.h"
8 #include "level_script.h"
9 #include "system/log.h"
11 static struct EvalResult
12 hide_goal(void *param, Gc *gc, struct Scope *scope, struct Expr args)
18 Level * const level = (Level*)param;
19 char * goal_id = NULL;
21 struct EvalResult result = match_list(gc, "s", args, &goal_id);
22 if (result.is_error) {
26 level_hide_goal(level, goal_id);
28 return eval_success(NIL(gc));
31 static struct EvalResult
32 show_goal(void *param, Gc *gc, struct Scope *scope, struct Expr args)
38 Level * const level = (Level*)param;
39 const char *goal_id = NULL;
41 struct EvalResult result = match_list(gc, "s", args, &goal_id);
42 if (result.is_error) {
46 level_show_goal(level, goal_id);
48 return eval_success(NIL(gc));
51 static struct EvalResult
52 rect_apply_force(void *param, Gc *gc, struct Scope *scope, struct Expr args)
58 Level *level = (Level*) param;
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) {
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) {
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));
81 return eval_failure(list(gc, "qs", "unexisting-rigid-rect", rect_id));
85 static struct EvalResult
86 hide_label(void *param, Gc *gc, struct Scope *scope, struct Expr args)
92 Level *level = (Level*) param;
93 const char *label_id = NULL;
95 struct EvalResult result = match_list(gc, "s", args, &label_id);
96 if (result.is_error) {
100 level_hide_label(level, label_id);
102 return eval_success(NIL(gc));
105 void load_level_library(Gc *gc, struct Scope *scope, Level *level)
110 SYMBOL(gc, "rect-apply-force"),
111 NATIVE(gc, rect_apply_force, level));
115 SYMBOL(gc, "hide-goal"),
116 NATIVE(gc, hide_goal, level));
120 SYMBOL(gc, "show-goal"),
121 NATIVE(gc, show_goal, level));
125 SYMBOL(gc, "hide-label"),
126 NATIVE(gc, hide_label, level));