diff --git a/main.c b/main.c index 3051b0c..ffed038 100644 --- a/main.c +++ b/main.c @@ -1528,13 +1528,20 @@ double unprocessed_gameplay_time = 0.0; EntityRef frome(Entity *e) { - EntityRef to_return = { - .index = (int)(e - gs.entities), - .generation = e->generation, - }; - assert(to_return.index >= 0); - assert(to_return.index < ARRLEN(gs.entities)); - return to_return; + if(e == 0) + { + return (EntityRef){0}; + } + else + { + EntityRef to_return = { + .index = (int)(e - gs.entities), + .generation = e->generation, + }; + assert(to_return.index >= 0); + assert(to_return.index < ARRLEN(gs.entities)); + return to_return; + } } Entity *gete(EntityRef ref) @@ -5527,18 +5534,19 @@ void frame(void) if(it->is_npc || it->is_character) { Transform draw_with = entity_transform(it); + bool do_outline = it->is_npc && gete(gs.player->interacting_with) == it; if(it->npc_kind == NPC_Player) { - draw_thing((DrawnThing){.armature = &player_armature, .t = draw_with, .outline = true}); + draw_thing((DrawnThing){.armature = &player_armature, .t = draw_with}); } else if(it->npc_kind == NPC_Farmer) { farmer_armature.go_to_animation = MD_S8Lit("Dance"); - draw_thing((DrawnThing){.armature = &farmer_armature, .t = draw_with}); + draw_thing((DrawnThing){.armature = &farmer_armature, .t = draw_with, .outline = do_outline}); } else { - draw_thing((DrawnThing){.mesh = &mesh_player, .t = draw_with}); + draw_thing((DrawnThing){.mesh = &mesh_player, .t = draw_with, .outline = do_outline}); } } } @@ -5634,7 +5642,6 @@ void frame(void) // these are static so that, on frames where no gameplay processing is necessary and just rendering, the rendering uses values from last frame static Entity *interacting_with = 0; // used by rendering to figure out who to draw dialog box on static bool player_in_combat = false; - const float dialog_interact_size = 2.5f * TILE_SIZE; float speed_target; // pausing the game @@ -6341,7 +6348,7 @@ void frame(void) { // find closest to talk to { - AABB dialog_rect = aabb_centered(gs.player->pos, V2(dialog_interact_size , dialog_interact_size)); + AABB dialog_rect = aabb_centered(gs.player->pos, V2(DIALOG_INTERACT_SIZE, DIALOG_INTERACT_SIZE)); dbgrect(dialog_rect); Overlapping possible_dialogs = get_overlapping(dialog_rect); float closest_interact_with_dist = INFINITY; @@ -6391,6 +6398,8 @@ void frame(void) interacting_with = gete(gs.player->talking_to); assert(interacting_with); } + + gs.player->interacting_with = frome(interacting_with); } if (interact) @@ -6615,7 +6624,7 @@ void frame(void) { float dist = LenV2(SubV2(it->pos, gs.player->pos)); dist -= 10.0f; // radius around point where dialog is completely opaque - float max_dist = dialog_interact_size / 2.0f; + float max_dist = DIALOG_INTERACT_SIZE / 2.0f; float alpha = 1.0f - (float)clamp(dist / max_dist, 0.0, 1.0); if (gete(gs.player->talking_to) == it && gs.player->state == CHARACTER_TALKING) alpha = 0.0f; if (it->being_hovered) diff --git a/makeprompt.h b/makeprompt.h index 909ca4f..892df63 100644 --- a/makeprompt.h +++ b/makeprompt.h @@ -307,6 +307,7 @@ typedef struct Entity // character bool knighted; bool in_conversation_mode; + EntityRef interacting_with; // for drawing outline on maybe interacting with somebody Vec2 to_throw_direction; BUFF(Vec2, 8) position_history; // so npcs can follow behind the player CharacterState state; diff --git a/tuning.h b/tuning.h index d919521..c0f3aff 100644 --- a/tuning.h +++ b/tuning.h @@ -10,6 +10,7 @@ #define SWORD_SWIPE_RADIUS (TILE_SIZE*3.0f) #define ARROW_SPEED 200.0f #define SECONDS_PER_ARROW 1.3f +#define DIALOG_INTERACT_SIZE 5.0f // length of the centered AABB (not halfsize) around the player of who they're interacting with #define CAM_DISTANCE 15.0f #define CAM_VERTICAL_TO_HORIZONTAL_RATIO 0.8f