Skip to content

Commit

Permalink
Exported conversation behaviors
Browse files Browse the repository at this point in the history
  • Loading branch information
nashmuhandes committed Jan 13, 2025
1 parent 61df133 commit 5948abb
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 14 deletions.
44 changes: 31 additions & 13 deletions src/playsim/p_map.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5702,6 +5702,35 @@ void R_OffsetView(FRenderViewpoint& viewPoint, const DVector3& dir, const double
//
//==========================================================================

static int CanTalk(AActor *self)
{
return self->Conversation != nullptr;
}

DEFINE_ACTION_FUNCTION_NATIVE(AActor, CanTalk, CanTalk)
{
PARAM_SELF_PROLOGUE(AActor);
ACTION_RETURN_BOOL(CanTalk(self));
}

static int NativeStartConversation(AActor *self, AActor *player, bool faceTalker, bool saveAngle)
{
if (self->health <= 0 || (self->flags4 & MF4_INCOMBAT) || self->Conversation == nullptr)
return false;
self->ConversationAnimation(0);
P_StartConversation(self, player, faceTalker, saveAngle);
return true;
}

DEFINE_ACTION_FUNCTION_NATIVE(AActor, StartConversation, NativeStartConversation)
{
PARAM_SELF_PROLOGUE(AActor);
PARAM_OBJECT(player, AActor);
PARAM_BOOL(faceTalker);
PARAM_BOOL(saveAngle);
ACTION_RETURN_BOOL(NativeStartConversation(self, player, faceTalker, saveAngle));
}

bool P_TalkFacing(AActor *player)
{
static const double angleofs[] = { 0, 90./16, -90./16 };
Expand All @@ -5710,19 +5739,8 @@ bool P_TalkFacing(AActor *player)
for (double angle : angleofs)
{
P_AimLineAttack(player, player->Angles.Yaw + DAngle::fromDeg(angle), TALKRANGE, &t, DAngle::fromDeg(35.), ALF_FORCENOSMART | ALF_CHECKCONVERSATION | ALF_PORTALRESTRICT);
if (t.linetarget != NULL)
{
if (t.linetarget->health > 0 && // Dead things can't talk.
!(t.linetarget->flags4 & MF4_INCOMBAT) && // Fighting things don't talk either.
t.linetarget->Conversation != NULL)
{
// Give the NPC a chance to play a brief animation
t.linetarget->ConversationAnimation(0);
P_StartConversation(t.linetarget, player, true, true);
return true;
}
return false;
}
if (t.linetarget != nullptr)
return NativeStartConversation(t.linetarget, player, true, true);
}
return false;
}
Expand Down
4 changes: 3 additions & 1 deletion wadsrc/static/zscript/actors/actor.zs
Original file line number Diff line number Diff line change
Expand Up @@ -698,7 +698,9 @@ class Actor : Thinker native
native clearscope int GetRenderStyle() const;
native clearscope bool CheckKeys(int locknum, bool remote, bool quiet = false);
protected native void CheckPortalTransition(bool linked = true);

native clearscope bool CanTalk() const;
native bool StartConversation(Actor player, bool faceTalker = true, bool saveAngle = true);

native clearscope string GetTag(string defstr = "") const;
native clearscope string GetCharacterName() const;
native void SetTag(string defstr = "");
Expand Down

0 comments on commit 5948abb

Please sign in to comment.