#include "system/lt.h"
#include "system/nth_alloc.h"
#include "system/stacktrace.h"
+#include "ebisp/builtins.h"
#define PLAYER_WIDTH 25.0f
#define PLAYER_HEIGHT 25.0f
RigidBodyId alive_body_id;
Explosion *dying_body;
- Script *script;
int jump_threshold;
Color color;
int play_die_cue;
};
-Player *create_player_from_line_stream(LineStream *line_stream, RigidBodies *rigid_bodies, Broadcast *broadcast)
+Player *create_player_from_player_layer(const PlayerLayer *player_layer,
+ RigidBodies *rigid_bodies,
+ Broadcast *broadcast)
{
- trace_assert(line_stream);
+ trace_assert(player_layer);
+ trace_assert(rigid_bodies);
+ trace_assert(broadcast);
Lt *lt = create_lt();
-
Player *player = PUSH_LT(lt, nth_calloc(1, sizeof(Player)), free);
if (player == NULL) {
RETURN_LT(lt, NULL);
player->rigid_bodies = rigid_bodies;
- float x = 0.0f, y = 0.0f;
- char colorstr[7];
-
- if (sscanf(
- line_stream_next(line_stream),
- "%f%f%6s",
- &x, &y, colorstr) == EOF) {
- log_fail("Could not read player\n");
- RETURN_LT(lt, NULL);
- }
-
- player->script = PUSH_LT(
- lt,
- create_script_from_line_stream(line_stream, broadcast),
- destroy_script);
- if (player->script == NULL) {
- RETURN_LT(lt, NULL);
- }
-
- const Color color = hexstr(colorstr);
-
player->alive_body_id = rigid_bodies_add(
rigid_bodies,
- rect(x, y, PLAYER_WIDTH, PLAYER_HEIGHT));
+ rect(
+ player_layer->position.x,
+ player_layer->position.y,
+ PLAYER_WIDTH,
+ PLAYER_HEIGHT));
player->dying_body = PUSH_LT(
lt,
create_explosion(
- color,
+ player_layer->color_picker.color,
PLAYER_DEATH_DURATION),
destroy_explosion);
if (player->dying_body == NULL) {
}
player->jump_threshold = 0;
- player->color = color;
- player->checkpoint = vec(x, y);
+ player->color = player_layer->color_picker.color;
+ player->checkpoint = player_layer->position;
player->play_die_cue = 0;
player->state = PLAYER_STATE_ALIVE;
rigid_bodies_move(player->rigid_bodies, player->alive_body_id, vec(0.0f, 0.0f));
}
-void player_jump(Player *player)
+void player_jump(Player *player, Script *supa_script)
{
trace_assert(player);
+ trace_assert(supa_script);
if (rigid_bodies_touches_ground(player->rigid_bodies, player->alive_body_id)) {
player->jump_threshold = 0;
vec(0.0f, -PLAYER_JUMP));
player->jump_threshold++;
- if (script_has_scope_value(player->script, "on-jump")) {
- script_eval(player->script, "(on-jump)");
+ if (script_has_scope_value(supa_script, "on-player-jump")) {
+ Gc *gc = script_gc(supa_script);
+ script_eval(supa_script, list(gc, "q", "on-player-jump"));
}
}
}