#include <SDL.h>
#include "game/level/explosion.h"
-#include "game/level/script.h"
#include "game/level/rigid_bodies.h"
#include "goals.h"
-#include "math/point.h"
+#include "math/vec.h"
#include "platforms.h"
#include "player.h"
#include "system/line_stream.h"
#include "system/lt.h"
#include "system/nth_alloc.h"
#include "system/stacktrace.h"
+#include "config.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;
- Vec checkpoint;
+ Vec2f checkpoint;
int play_die_cue;
};
Player *create_player_from_player_layer(const PlayerLayer *player_layer,
- RigidBodies *rigid_bodies,
- Broadcast *broadcast)
+ RigidBodies *rigid_bodies)
{
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;
- player->script = PUSH_LT(
- lt,
- create_script_from_string(broadcast, player_layer->source_code),
- destroy_script);
- if (player->script == NULL) {
- RETURN_LT(lt, NULL);
- }
-
player->alive_body_id = rigid_bodies_add(
rigid_bodies,
rect(
player->dying_body = PUSH_LT(
lt,
create_explosion(
- player_layer->color_picker.color,
+ color_picker_rgba(&player_layer->color_picker),
PLAYER_DEATH_DURATION),
destroy_explosion);
if (player->dying_body == NULL) {
}
player->jump_threshold = 0;
- player->color = player_layer->color_picker.color;
+ player->color = color_picker_rgba(&player_layer->color_picker);
player->checkpoint = player_layer->position;
player->play_die_cue = 0;
player->state = PLAYER_STATE_ALIVE;
void destroy_player(Player * player)
{
+ rigid_bodies_remove(player->rigid_bodies, player->alive_body_id);
RETURN_LT0(player->lt);
}
int player_render(const Player * player,
- Camera *camera)
+ const Camera *camera)
{
trace_assert(player);
trace_assert(camera);
const Rect hitbox = rigid_bodies_hitbox(player->rigid_bodies, player->alive_body_id);
- if (hitbox.y > 1000.0f) {
+ if (hitbox.y > PLAYER_DEATH_LEVEL) {
player_die(player);
}
} break;
player->alive_body_id,
vec(0.0f, -PLAYER_JUMP));
player->jump_threshold++;
-
- if (script_has_scope_value(player->script, "on-jump")) {
- script_eval(player->script, "(on-jump)");
- }
}
}
vec(0.0f, -player_hitbox.h * 0.5f)));
}
-void player_hide_goals(const Player *player,
- Goals *goals)
-{
- trace_assert(player);
- trace_assert(goals);
- goals_hide_from_player(
- goals,
- rigid_bodies_hitbox(
- player->rigid_bodies,
- player->alive_body_id));
-}
-
void player_die_from_lava(Player *player,
const Lava *lava)
{
}
}
-void player_checkpoint(Player *player, Vec checkpoint)
+void player_checkpoint(Player *player, Vec2f checkpoint)
{
player->checkpoint = checkpoint;
}