-struct EvalResult level_send(Level *level, Gc *gc, struct Scope *scope, struct Expr path)
-{
- trace_assert(level);
- trace_assert(gc);
- trace_assert(scope);
-
- const char *target = NULL;
- struct Expr rest = void_expr();
- struct EvalResult res = match_list(gc, "q*", path, &target, &rest);
- if (res.is_error) {
- return res;
- }
-
- if (strcmp(target, "goal") == 0) {
- return goals_send(level->goals, gc, scope, rest);
- } else if (strcmp(target, "label") == 0) {
- return labels_send(level->labels, gc, scope, rest);
- } else if (strcmp(target, "box") == 0) {
- return boxes_send(level->boxes, gc, scope, rest);
- } else if (strcmp(target, "body-push") == 0) {
- long int id = 0, x = 0, y = 0;
- res = match_list(gc, "ddd", rest, &id, &x, &y);
- if (res.is_error) {
- return res;
- }
-
- rigid_bodies_apply_force(level->rigid_bodies, (size_t) id, vec((float) x, (float) y));
-
- return eval_success(NIL(gc));
- } else if (strcmp(target, "edit") == 0) {
- level->edit_mode = !level->edit_mode;
- SDL_SetRelativeMouseMode(level->edit_mode);
- return eval_success(NIL(gc));
- }
-
- return unknown_target(gc, "level", target);
-}
-
-bool level_edit_mode(const Level *level)