-#include <SDL2/SDL.h>
-#include "system/stacktrace.h"
#include <stdio.h>
#include <stdlib.h>
+#include <SDL.h>
+
#include "game/level/explosion.h"
#include "game/level/script.h"
#include "game/level/rigid_bodies.h"
#include "system/log.h"
#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();
- if (lt == NULL) {
- return NULL;
- }
-
- Player *player = PUSH_LT(lt, nth_alloc(sizeof(Player)), free);
+ 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),
- color);
+ 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;
return -1;
}
- return rigid_bodies_render(player->rigid_bodies, player->alive_body_id, camera);
+ return rigid_bodies_render(
+ player->rigid_bodies,
+ player->alive_body_id,
+ player->color,
+ camera);
}
case PLAYER_STATE_DYING:
explosion_update(player->dying_body, delta_time);
if (explosion_is_done(player->dying_body)) {
+ rigid_bodies_disable(player->rigid_bodies, player->alive_body_id, false);
rigid_bodies_transform_velocity(
player->rigid_bodies,
player->alive_body_id,
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"));
}
}
}
player->play_die_cue = 1;
explosion_start(player->dying_body, vec(hitbox.x, hitbox.y));
player->state = PLAYER_STATE_DYING;
+ rigid_bodies_disable(player->rigid_bodies, player->alive_body_id, true);
}
}
if (player->play_die_cue) {
player->play_die_cue = 0;
- if (sound_samples_play_sound(sound_samples, 0, 0) < 0) {
+ if (sound_samples_play_sound(sound_samples, 0) < 0) {
return -1;
}
}