- Fixed: With opl_onechip set the second OPL chip was never set to anything valid

so it contained an invalid pointer. There were also a few other places that
  simply assumed that the second chip is set to something valid.
- Fixed: NPCs which are engaged in a conversation should not move.
- Fixed: Player movement animation was not stopped when starting a conversation.


SVN r1439 (trunk)
This commit is contained in:
Christoph Oelckers 2009-02-22 10:25:12 +00:00
commit eb47f4fdbf
10 changed files with 48 additions and 4 deletions

View file

@ -305,6 +305,7 @@ enum
MF5_NOVERTICALMELEERANGE=0x04000000,// Does not check vertical distance for melee range
MF5_BRIGHT = 0x08000000, // Actor is always rendered fullbright
MF5_CANTSEEK = 0x10000000, // seeker missiles cannot home in on this actor
MF5_INCONVERSATION = 0x20000000, // Actor is having a conversation
// --- mobj.renderflags ---

View file

@ -465,6 +465,9 @@ DEFINE_ACTION_FUNCTION(AActor, A_TurretLook)
{
AActor *target;
if (self->flags5 & MF5_INCONVERSATION)
return;
self->threshold = 0;
target = self->LastHeard;
if (target != NULL &&

View file

@ -1908,7 +1908,6 @@ void YM3812SetUpdateHandler(void *chip,OPL_UPDATEHANDLER UpdateHandler,int param
void YM3812UpdateOne(void *chip, float *buffer, int length)
{
FM_OPL *OPL = (FM_OPL *)chip;
UINT8 rhythm = OPL->rhythm&0x20;
int i;
if (OPL == NULL)
@ -1916,6 +1915,8 @@ void YM3812UpdateOne(void *chip, float *buffer, int length)
return;
}
UINT8 rhythm = OPL->rhythm&0x20;
UINT32 lfo_am_cnt_bak = OPL->lfo_am_cnt;
UINT32 eg_timer_bak = OPL->eg_timer;
UINT32 eg_cnt_bak = OPL->eg_cnt;

View file

@ -302,6 +302,7 @@ int OPLio::OPLinit(uint numchips)
{
assert(numchips >= 1 && numchips <= 2);
chips[0] = YM3812Init (3579545, int(OPL_SAMPLE_RATE));
chips[1] = NULL;
if (chips[0] != NULL)
{
if (numchips > 1)

View file

@ -464,7 +464,7 @@ OPLmusicFile::OPLmusicFile(const OPLmusicFile *source, const char *filename)
delete io;
}
io = new DiskWriterIO(filename);
io->OPLinit(TwoChips);
io->OPLinit(TwoChips + 1);
Restart();
}

View file

@ -659,6 +659,9 @@ void P_StartConversation (AActor *npc, AActor *pc, bool facetalker, bool saveang
const char *toSay;
int i, j;
// Make sure this is actually a player.
if (pc->player == NULL) return;
// [CW] If an NPC is talking to a PC already, then don't let
// anyone else talk to the NPC.
for (i = 0; i < MAXPLAYERS; i++)
@ -672,9 +675,11 @@ void P_StartConversation (AActor *npc, AActor *pc, bool facetalker, bool saveang
pc->momx = pc->momy = 0; // Stop moving
pc->player->momx = pc->player->momy = 0;
static_cast<APlayerPawn*>(pc)->PlayIdle ();
pc->player->ConversationPC = pc;
pc->player->ConversationNPC = npc;
npc->flags5 |= MF5_INCONVERSATION;
FStrifeDialogueNode *CurNode = npc->Conversation;
@ -947,6 +952,8 @@ static void PickConversationReply ()
{
Net_WriteByte (DEM_CONVERSATION);
Net_WriteByte (CONV_NPCANGLE);
Net_WriteByte (DEM_CONVERSATION);
Net_WriteByte (CONV_CLOSE);
return;
}
@ -966,6 +973,8 @@ static void PickConversationReply ()
Net_WriteByte (DEM_CONVERSATION);
Net_WriteByte (CONV_NPCANGLE);
Net_WriteByte (DEM_CONVERSATION);
Net_WriteByte (CONV_CLOSE);
return;
}
}
@ -1189,7 +1198,13 @@ void P_ConversationCommand (int player, BYTE **stream)
players[player].ConversationNPC = NULL;
players[player].ConversationPC = NULL;
players[player].ConversationNPCAngle = 0;
break;
// fall through
case CONV_CLOSE:
if (players[player].ConversationNPC != NULL)
{
players[player].ConversationNPC->flags5 &= ~MF5_INCONVERSATION;
}
default:
break;

View file

@ -55,6 +55,7 @@ enum
CONV_GIVEINVENTORY,
CONV_TAKEINVENTORY,
CONV_SETNULL,
CONV_CLOSE,
};
extern TArray<FStrifeDialogueNode *> StrifeDialogues;

View file

@ -1538,6 +1538,9 @@ DEFINE_ACTION_FUNCTION(AActor, A_Look)
{
AActor *targ;
if (self->flags5 & MF5_INCONVERSATION)
return;
// [RH] Set goal now if appropriate
if (self->special == Thing_SetGoal && self->args[0] == 0)
{
@ -1652,6 +1655,9 @@ DEFINE_ACTION_FUNCTION(AActor, A_Wander)
// This seems as good a place as any.
self->flags4 &= ~MF4_INCOMBAT;
if (self->flags5 & MF5_INCONVERSATION)
return;
if (self->flags4 & MF4_STANDSTILL)
return;
@ -1693,6 +1699,9 @@ DEFINE_ACTION_FUNCTION(AActor, A_Look2)
{
AActor *targ;
if (self->flags5 & MF5_INCONVERSATION)
return;
self->threshold = 0;
targ = self->LastHeard;
@ -1753,6 +1762,9 @@ void A_DoChase (AActor *actor, bool fastchase, FState *meleestate, FState *missi
{
int delta;
if (actor->flags5 & MF5_INCONVERSATION)
return;
if (actor->flags & MF_INCHASE)
{
return;

View file

@ -724,6 +724,9 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_LookEx)
AActor *targ = NULL; // Shuts up gcc
fixed_t dist;
if (self->flags5 & MF5_INCONVERSATION)
return;
// [RH] Set goal now if appropriate
if (self->special == Thing_SetGoal && self->args[0] == 0)
{