Add gold unlock

main
Cameron Murphy Reikes 2 years ago
parent 238c81ecde
commit 78c208d16a

@ -805,6 +805,7 @@ void ser_entity(SerState* ser, GameState* gs, Entity* e)
if (e->is_box) if (e->is_box)
{ {
SER_VAR(&e->box_type); SER_VAR(&e->box_type);
SER_VAR(&e->is_explosion_unlock);
ser_entityid(ser, &e->next_box); ser_entityid(ser, &e->next_box);
ser_entityid(ser, &e->prev_box); ser_entityid(ser, &e->prev_box);
SER_VAR(&e->compass_rotation); SER_VAR(&e->compass_rotation);
@ -1045,6 +1046,14 @@ bool possibly_use_energy(GameState* gs, Entity* grid, float wanted_energy)
return false; return false;
} }
void entity_ensure_in_orbit(Entity* e)
{
cpVect pos = v2_to_cp(V2sub(entity_pos(e), SUN_POS));
cpFloat r = cpvlength(pos);
cpFloat v = cpfsqrt(SUN_GRAVITY_STRENGTH / r) / r;
cpBodySetVelocity(e->body, cpvmult(cpvperp(pos), v));
}
void process(GameState* gs, float dt) void process(GameState* gs, float dt)
{ {
assert(gs->space != NULL); assert(gs->space != NULL);
@ -1053,21 +1062,15 @@ void process(GameState* gs, float dt)
gs->time += dt; gs->time += dt;
// process input // process input
for (int i = 0; i < MAX_PLAYERS; i++) PLAYERS_ITER(gs->players, player)
{ {
struct Player* player = &gs->players[i];
if (!player->connected)
continue;
Entity* p = get_entity(gs, player->entity); Entity* p = get_entity(gs, player->entity);
if (p == NULL) if (p == NULL)
{ {
p = new_entity(gs); p = new_entity(gs);
create_player(gs, p); create_player(gs, p);
player->entity = get_id(gs, p); player->entity = get_id(gs, p);
cpVect pos = v2_to_cp(V2sub(entity_pos(p), SUN_POS)); entity_ensure_in_orbit(p);
cpFloat r = cpvlength(pos);
cpFloat v = cpfsqrt(SUN_GRAVITY_STRENGTH / r) / r;
cpBodySetVelocity(p->body, cpvmult(cpvperp(pos), v));
} }
assert(p->is_player); assert(p->is_player);
@ -1218,6 +1221,18 @@ void process(GameState* gs, float dt)
if (!e->exists) if (!e->exists)
continue; continue;
if (e->is_explosion_unlock)
{
PLAYERS_ITER(gs->players, player)
{
Entity* player_entity = get_entity(gs, player->entity);
if (player_entity != NULL && V2length(V2sub(entity_pos(player_entity), entity_pos(e))) < GOLD_UNLOCK_RADIUS)
{
player->unlocked_bombs = true;
}
}
}
if (e->body != NULL) if (e->body != NULL)
{ {
cpVect p = cpvsub(cpBodyGetPosition(e->body), v2_to_cp(SUN_POS)); cpVect p = cpvsub(cpBodyGetPosition(e->body), v2_to_cp(SUN_POS));

@ -303,10 +303,10 @@ static void
ui(bool draw, float dt, float width, float height) ui(bool draw, float dt, float width, float height)
{ {
static float cur_opacity = 1.0f; static float cur_opacity = 1.0f;
cur_opacity = lerp(cur_opacity, myentity() != NULL ? 1.0f : 0.0f, dt * 5.0f); cur_opacity = lerp(cur_opacity, myentity() != NULL ? 1.0f : 0.0f, dt * 5.0f);
if (cur_opacity <= 0.01f) { if (cur_opacity <= 0.01f) {
return; return;
} }
if (draw) if (draw)
sgp_push_transform(); sgp_push_transform();
@ -728,11 +728,17 @@ frame(void)
Entity* e = &gs.entities[i]; Entity* e = &gs.entities[i];
if (!e->exists) if (!e->exists)
continue; continue;
if (e->is_grid) // grid drawing // draw grid
if (e->is_grid)
{ {
Entity* g = e; Entity* g = e;
BOXES_ITER(&gs, b, g) BOXES_ITER(&gs, b, g)
{ {
if (b->is_explosion_unlock)
{
set_color(colhexcode(0xfcba03));
draw_circle(entity_pos(b), GOLD_UNLOCK_RADIUS);
}
sgp_set_color(1.0f, 1.0f, 1.0f, 1.0f); sgp_set_color(1.0f, 1.0f, 1.0f, 1.0f);
// debug draw force vectors for thrusters // debug draw force vectors for thrusters
#if 0 #if 0
@ -821,7 +827,7 @@ frame(void)
{ {
sgp_set_image(0, image_explosion); sgp_set_image(0, image_explosion);
sgp_set_color(1.0f, 1.0f, 1.0f, 1.0f - (e->explosion_progresss / EXPLOSION_TIME)); sgp_set_color(1.0f, 1.0f, 1.0f, 1.0f - (e->explosion_progresss / EXPLOSION_TIME));
draw_texture_centered(e->explosion_pos, EXPLOSION_RADIUS*2.0f); draw_texture_centered(e->explosion_pos, EXPLOSION_RADIUS * 2.0f);
sgp_reset_image(0); sgp_reset_image(0);
} }
} }
@ -846,9 +852,9 @@ frame(void)
sgp_set_color(1.0f, 1.0f, 1.0f, 1.0f); sgp_set_color(1.0f, 1.0f, 1.0f, 1.0f);
dbg_drawall(); dbg_drawall();
} // world space transform end } // world space transform end
} }
// UI drawn in screen space // UI drawn in screen space
ui(true, dt, width, height); ui(true, dt, width, height);
@ -859,7 +865,7 @@ frame(void)
sgp_end(); sgp_end();
sg_end_pass(); sg_end_pass();
sg_commit(); sg_commit();
} }
void cleanup(void) void cleanup(void)
{ {

@ -21,9 +21,17 @@ void server(void* data)
initialize(&gs, entity_data, entities_size); initialize(&gs, entity_data, entities_size);
Log("Allocated %zu bytes for entities\n", entities_size); Log("Allocated %zu bytes for entities\n", entities_size);
// unlock the explosive #define BOX_AT(grid, pos) { Entity* box = new_entity(&gs); box_create(&gs, box, grid, pos); }
// space station with explosion unlock
if (true) if (true)
{ {
Entity* grid = new_entity(&gs);
grid_create(&gs, grid);
entity_set_pos(grid, (V2) { -10.0f, 0.0f });
entity_ensure_in_orbit(grid);
Entity* explosion_box = new_entity(&gs);
box_create(&gs, explosion_box, grid, (V2) { 0 });
explosion_box->is_explosion_unlock = true;
} }
// one box policy // one box policy
@ -46,12 +54,11 @@ void server(void* data)
cpBodySetVelocity(grid->body, cpv(-0.1, 0.0)); cpBodySetVelocity(grid->body, cpv(-0.1, 0.0));
cpBodySetAngularVelocity(grid->body, 1.0f); cpBodySetAngularVelocity(grid->body, 1.0f);
#define BOX_AT(pos) { Entity* box = new_entity(&gs); box_create(&gs, box, grid, pos); } BOX_AT(grid,((V2) { 0 }));
BOX_AT(((V2) { 0 })); BOX_AT(grid,((V2) { BOX_SIZE, 0 }));
BOX_AT(((V2) { BOX_SIZE, 0 })); BOX_AT(grid,((V2) { 2.0*BOX_SIZE, 0 }));
BOX_AT(((V2) { 2.0*BOX_SIZE, 0 })); BOX_AT(grid,((V2) { 2.0*BOX_SIZE, BOX_SIZE }));
BOX_AT(((V2) { 2.0*BOX_SIZE, BOX_SIZE })); BOX_AT(grid,((V2) { 0.0*BOX_SIZE, -BOX_SIZE }));
BOX_AT(((V2) { 0.0*BOX_SIZE, -BOX_SIZE }));
} }
if (enet_initialize() != 0) if (enet_initialize() != 0)

@ -29,6 +29,7 @@
#define EXPLOSION_DAMAGE_PER_SEC 10.0f #define EXPLOSION_DAMAGE_PER_SEC 10.0f
#define EXPLOSION_RADIUS 1.0f #define EXPLOSION_RADIUS 1.0f
#define EXPLOSION_DAMAGE_THRESHOLD 0.2f // how much damage until it explodes #define EXPLOSION_DAMAGE_THRESHOLD 0.2f // how much damage until it explodes
#define GOLD_UNLOCK_RADIUS 1.0f
#define TIMESTEP (1.0f / 60.0f) // not required to simulate at this, but this defines what tick the game is on #define TIMESTEP (1.0f / 60.0f) // not required to simulate at this, but this defines what tick the game is on
#define TIME_BETWEEN_INPUT_PACKETS (1.0f / 20.0f) #define TIME_BETWEEN_INPUT_PACKETS (1.0f / 20.0f)
@ -169,6 +170,7 @@ typedef struct Entity
// boxes // boxes
bool is_box; bool is_box;
enum BoxType box_type; enum BoxType box_type;
bool is_explosion_unlock;
EntityID next_box; EntityID next_box;
EntityID prev_box; // doubly linked so can remove in middle of chain EntityID prev_box; // doubly linked so can remove in middle of chain
enum CompassRotation compass_rotation; enum CompassRotation compass_rotation;
@ -207,6 +209,8 @@ typedef struct GameState
EntityID free_list; EntityID free_list;
} GameState; } GameState;
#define PLAYERS_ITER(players, cur) for(Player * cur = players; cur < players+MAX_PLAYERS; cur++) if(cur->connected)
#define PI 3.14159f #define PI 3.14159f
// returns in radians // returns in radians
@ -264,6 +268,7 @@ V2 entity_pos(Entity* e);
void entity_set_rotation(Entity* e, float rot); void entity_set_rotation(Entity* e, float rot);
void entity_set_pos(Entity* e, V2 pos); void entity_set_pos(Entity* e, V2 pos);
float entity_rotation(Entity* e); float entity_rotation(Entity* e);
void entity_ensure_in_orbit(Entity* e);
#define BOX_CHAIN_ITER(gs, cur, starting_box) for (Entity *cur = get_entity(gs, starting_box); cur != NULL; cur = get_entity(gs, cur->next_box)) #define BOX_CHAIN_ITER(gs, cur, starting_box) for (Entity *cur = get_entity(gs, starting_box); cur != NULL; cur = get_entity(gs, cur->next_box))
#define BOXES_ITER(gs, cur, grid_entity_ptr) BOX_CHAIN_ITER(gs, cur, (grid_entity_ptr)->boxes) #define BOXES_ITER(gs, cur, grid_entity_ptr) BOX_CHAIN_ITER(gs, cur, (grid_entity_ptr)->boxes)

Loading…
Cancel
Save