Enter/exit is a separate action from interact

main
Cameron Murphy Reikes 2 years ago
parent 710b315def
commit 8d32399034

@ -815,16 +815,15 @@ bool could_learn_from_scanner(Player *for_player, Entity *box)
return (for_player->box_unlocks | box->blueprints_learned) != for_player->box_unlocks;
}
bool box_enterable(Entity *box)
{
return box->box_type == BoxMedbay || box->box_type == BoxCockpit;
}
bool box_interactible(GameState *gs, Player *for_player, Entity *box)
{
flight_assert(box->is_box);
if (box->box_type == BoxCockpit || box->box_type == BoxMedbay)
{
return true;
}
else
{
if (box->box_type == BoxMerge)
{
return merge_box_is_merged(gs, box);
@ -833,7 +832,6 @@ bool box_interactible(GameState *gs, Player *for_player, Entity *box)
{
return false;
}
}
}
// removes boxes from grid, then ensures that the rule that grids must not have
@ -1399,6 +1397,7 @@ SerMaybeFailure ser_inputframe(SerState *ser, InputFrame *i)
SER_MAYBE_RETURN(ser_entityid(ser, &i->invite_this_player));
SER_VAR(&i->seat_action);
SER_VAR(&i->interact_action);
SER_MAYBE_RETURN(ser_fV2(ser, &i->hand_pos));
SER_VAR(&i->dobuild);
@ -2571,6 +2570,7 @@ void create_initial_world(GameState *gs)
#endif // debug world
}
// does not actually set seat in variables so can be used on respawn
void exit_seat(GameState *gs, Entity *seat_in, Entity *p)
{
cpVect pilot_seat_exit_spot = cpvadd(entity_pos(seat_in), cpvmult(box_facing_vector(seat_in), BOX_SIZE));
@ -2727,13 +2727,11 @@ void process(struct GameState *gs, double dt)
p->damage = 0.0;
#endif
#if 1
cpVect world_hand_pos = get_world_hand_pos(gs, &player->input, p);
if (player->input.seat_action)
{
player->input.seat_action = false; // "handle" the input
Entity *seat_maybe_in = get_entity(gs, p->currently_inside_of_box);
if (seat_maybe_in == NULL) // not in any seat
if(player->input.interact_action)
{
player->input.interact_action = false;
cpPointQueryInfo query_info = {0};
cpShape *result = cpSpacePointQueryNearest(gs->space, (world_hand_pos), 0.1, FILTER_ONLY_BOXES, &query_info);
if (result != NULL)
@ -2743,10 +2741,6 @@ void process(struct GameState *gs, double dt)
// IMPORTANT: if you update these, make sure you update box_interactible so
// the button prompt still works
if (potential_seat->box_type == BoxScanner) // learn everything from the scanner
{
player->box_unlocks |= potential_seat->blueprints_learned;
}
if (potential_seat->box_type == BoxMerge) // disconnect!
{
potential_seat->wants_disconnect = true;
@ -2755,6 +2749,23 @@ void process(struct GameState *gs, double dt)
flight_assert(potential_seat->is_box);
flight_assert(potential_seat->box_type == BoxMerge);
}
}
}
if (player->input.seat_action)
{
player->input.seat_action = false; // "handle" the input
Entity *seat_maybe_in = get_entity(gs, p->currently_inside_of_box);
if (seat_maybe_in == NULL) // not in any seat
{
cpPointQueryInfo query_info = {0};
cpShape *result = cpSpacePointQueryNearest(gs->space, (world_hand_pos), 0.1, FILTER_ONLY_BOXES, &query_info);
if (result != NULL)
{
Entity *potential_seat = cp_shape_entity(result);
flight_assert(potential_seat->is_box);
// IMPORTANT: if you update these, make sure you update box_enterable so
// the button prompt still works
if (potential_seat->box_type == BoxCockpit || potential_seat->box_type == BoxMedbay)
{
// don't let players get inside of cockpits that somebody else is already inside of

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

After

Width:  |  Height:  |  Size: 14 KiB

@ -1695,6 +1695,7 @@ static void frame(void)
build_pressed = mousepressed[SAPP_MOUSEBUTTON_LEFT].pressed;
bool interact_pressed = mousepressed[SAPP_MOUSEBUTTON_RIGHT].pressed;
bool seat_pressed = keypressed[SAPP_KEYCODE_F].pressed;
// networking
PROFILE_SCOPE("networking")
@ -1923,7 +1924,10 @@ static void frame(void)
}
if (interact_pressed)
cur_input_frame.seat_action = interact_pressed;
cur_input_frame.interact_action = interact_pressed;
if (seat_pressed)
cur_input_frame.seat_action = seat_pressed;
cur_input_frame.hand_pos = local_hand_pos;
if (take_over_squad >= 0)
@ -2410,7 +2414,9 @@ static void frame(void)
set_color_values(1.0, 1.0, 1.0, 1.0 - b->sun_amount);
}
if (myplayer() != NULL && box_interactible(&gs, myplayer(), b))
bool interactible = box_interactible(&gs, myplayer(), b);
bool enterable = box_enterable(b);
if (myplayer() != NULL && interactible || enterable)
{
if (box_has_point((BoxCentered){
.pos = entity_pos(b),
@ -2424,8 +2430,16 @@ static void frame(void)
transform_scope()
{
pipeline_scope(goodpixel_pipeline)
{
if (interactible)
{
sgp_set_image(0, image_rightclick);
}
else
{
flight_assert(enterable);
sgp_set_image(0, image_enter_exit);
}
cpVect draw_at = cpvadd(entity_pos(b), cpv(BOX_SIZE, 0));
rotate_at(-entity_rotation(b) - rotangle(b->compass_rotation), draw_at.x, draw_at.y);
draw_texture_centered(draw_at, BOX_SIZE + sin(exec_time * 5.0) * BOX_SIZE * 0.1);

@ -250,6 +250,7 @@ typedef struct InputFrame
bool reject_cur_squad_invite;
EntityID invite_this_player; // null means inviting nobody! @Robust make it so just sends interact pos input, and server processes who to invite. This depends on client side prediction + proper input processing at the right tick.
bool interact_action;
bool seat_action;
cpVect hand_pos; // local to player transationally but not rotationally
@ -550,6 +551,7 @@ Entity *get_entity(struct GameState *gs, EntityID id);
Entity *new_entity(struct GameState *gs);
EntityID get_id(struct GameState *gs, Entity *e);
cpVect entity_pos(Entity *e);
bool box_enterable(Entity *box);
bool box_interactible(GameState *gs, Player *for_player, Entity *box);
void entity_set_rotation(Entity *e, double rot);
bool could_learn_from_scanner(Player *for_player, Entity *box);

Loading…
Cancel
Save