+
+struct EvalResult
+game_send(Game *game, Gc *gc, struct Scope *scope,
+ struct Expr path)
+{
+ trace_assert(game);
+ 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, "level") == 0) {
+ return level_send(game->level, gc, scope, rest);
+ } else if (strcmp(target, "menu") == 0) {
+ level_picker_clean_selection(game->level_picker);
+ game->state = GAME_STATE_LEVEL_PICKER;
+ return eval_success(NIL(gc));
+ }
+
+ return unknown_target(gc, "game", target);
+}
+
+// Private Functions
+
+static int game_render_cursor(const Game *game)
+{
+ trace_assert(game);
+
+ SDL_Rect src = {0, 0, 32, 32};
+ SDL_Rect dest = {game->cursor_x, game->cursor_y, 32, 32};
+ if (SDL_RenderCopy(game->renderer, game->texture_cursor, &src, &dest) < 0) {
+ return -1;
+ }
+
+ return 0;
+}