foxygit / doom Log in
commit bdcfa27ef342b4e6b92be1481da8497a0d5cadb7
Author:     James Haley <haleyjd@hotmail.com>
AuthorDate: Wed Sep 8 04:44:56 2010 +0000
Commit:     James Haley <haleyjd@hotmail.com>
CommitDate: Wed Sep 8 04:44:56 2010 +0000

    Proper dialog jumptoconv logic, and more commenting in P_DialogStart.

    Subversion-branch: /branches/strife-branch
    Subversion-revision: 2040
---
 src/strife/p_dialog.c | 103 ++++++++++++++++++++++++++++++--------------------
 1 file changed, 61 insertions(+), 42 deletions(-)

diff --git a/src/strife/p_dialog.c b/src/strife/p_dialog.c
index e2460f0d..51903f4e 100644
--- a/src/strife/p_dialog.c
+++ b/src/strife/p_dialog.c
@@ -510,7 +510,7 @@ int P_PlayerHasItem(player_t *player, mobjtype_t type)
 // haleyjd 09/03/10: Looks for a dialog definition matching the given
 // Script ID # for an mobj.
 //
-mapdialog_t *P_DialogFind(mobjtype_t type)
+mapdialog_t *P_DialogFind(mobjtype_t type, int jumptoconv)
 {
     int i;

@@ -518,7 +518,12 @@ mapdialog_t *P_DialogFind(mobjtype_t type)
     for(i = 0; i < numleveldialogs; i++)
     {
         if(type == leveldialogs[i].speakerid)
-            return &leveldialogs[i];
+        {
+            if(jumptoconv <= 1)
+                return &leveldialogs[i];
+            else
+                --jumptoconv;
+        }
     }

     // check SCRIPT00 dialogs next
@@ -773,6 +778,7 @@ void P_DialogStart(player_t *player)
     int rnd = 0;
     mapdialog_t* dialog;
     char* byetext;
+    int jumptoconv;

     if(menuactive || netgame)
         return;
@@ -786,59 +792,71 @@ void P_DialogStart(player_t *player)
             P_AimLineAttack(player->mo, player->mo->angle - (ANG90/16), (128*FRACUNIT));
     }

-    if(linetarget)
-    {
-        // already in combat, can't talk to it
-        if(linetarget->flags & MF_INCOMBAT)
-            return;
-
-        dialogtalker = linetarget;
-
-        // play a sound
-        if(player = &players[consoleplayer])
-            S_StartSound(0, sfx_radio);
-
-        linetarget->target = player->mo;
-        dialogtalker->reactiontime = 2;
-        dialogtalkerangle = dialogtalker->angle;
-
-        // face towards player
-        A_FaceTarget(linetarget);
-        // face towards NPC's direction
-        player->mo->angle = R_PointToAngle2(
-                            player->mo->x,
-                            player->mo->y,
-                            dialogtalker->x,
-                            dialogtalker->y);
+    if(!linetarget)
+       return;

-        dialogplayer = player;
-    }
-    else
-        return;
+    // already in combat, can't talk to it
+    if(linetarget->flags & MF_INCOMBAT)
+       return;
+
+    // set pointer to the character talking
+    dialogtalker = linetarget;
+
+    // play a sound
+    if(player == &players[consoleplayer])
+       S_StartSound(0, sfx_radio);
+
+    linetarget->target = player->mo;         // target the player
+    dialogtalker->reactiontime = 2;          // set reactiontime
+    dialogtalkerangle = dialogtalker->angle; // remember original angle
+
+    // face talker towards player
+    A_FaceTarget(dialogtalker);
+
+    // face towards NPC's direction
+    player->mo->angle = R_PointToAngle2(player->mo->x,
+                                        player->mo->y,
+                                        dialogtalker->x,
+                                        dialogtalker->y);
+    // set pointer to player talking
+    dialogplayer = player;
+
+    // haleyjd: This seems to be an artifact of early development where they
+    // meant to make all this work in multiplayer. By doing this, a thing
+    // could have given different initial dialogs to each player.
+    jumptoconv = linetarget->allegiance;

     // check item requirements
-    for(i = 0; i < MDLG_MAXITEMS; i++)
+    while(1)
     {
-        currentdialog = P_DialogFind(linetarget->type);
+        int i = 0;
+        currentdialog = P_DialogFind(linetarget->type, jumptoconv);

-        // dialog's jumptoconv equal to 0?
-        if(currentdialog[i].jumptoconv == 0)
+        // dialog's jumptoconv equal to 0? There's nothing to jump to.
+        if(currentdialog->jumptoconv == 0)
             break;

-        for(j = 0; j < MDLG_MAXITEMS; j++)
+        do
         {
-            dialog = &currentdialog[j];
-            if(dialog->checkitem[j] != 0 &&
-                P_PlayerHasItem(dialogtalker, dialog->checkitem[j]) < 1)
-            {
-                currentdialog = dialog;
+            // if the item is non-zero, the player must have at least one in his
+            // or her inventory
+            if(currentdialog->checkitem[i] != 0 &&
+                P_PlayerHasItem(dialogplayer, currentdialog->checkitem[i]) < 1)
                 break;
-            }
+            ++i;
         }
+        while(i < MDLG_MAXITEMS);
+
+        if(i < MDLG_MAXITEMS) // didn't find them all? this is our dialog!
+            break;
+
+        jumptoconv = currentdialog->jumptoconv;
     }

     M_DialogDimMsg(20, 28, currentdialog->text, 0);
     dialogtext = P_DialogGetMsg(currentdialog->text);
+
+    // get states
     dialogtalkerstates = P_DialogGetStates(linetarget->type);

     // have talker greet the player
@@ -850,8 +868,9 @@ void P_DialogStart(player_t *player)
         dialogname = currentdialog->name;
     else
     {
+        // use a fallback:
         if(mobjinfo[linetarget->type].name)
-            dialogname = mobjinfo[linetarget->type].name;
+            dialogname = mobjinfo[linetarget->type].name; // mobjtype name
         else
             dialogname = "Person";  // default name
     }