From d6d29a7a0bba89a9499dc792ea792735b0b357fe Mon Sep 17 00:00:00 2001 From: mohabhassan Date: Mon, 1 Jul 2019 20:17:46 +0200 Subject: [PATCH] Fix actor mVoiceType initialization. --- code/game/actor.cpp | 149 +++++++++++++++++++++++++------------ code/game/level.cpp | 15 +++- code/game/player_util.cpp | 5 +- code/game/simpleactor.cpp | 2 +- code/globalcpp/g_spawn.cpp | 2 + 5 files changed, 119 insertions(+), 54 deletions(-) diff --git a/code/game/actor.cpp b/code/game/actor.cpp index b722edb6..210e29e6 100644 --- a/code/game/actor.cpp +++ b/code/game/actor.cpp @@ -2724,6 +2724,7 @@ Actor::Actor() m_iCurrentHistory = 0; m_bDog = false; m_bBecomeRunner = false; + mVoiceType = -1; } /* @@ -8434,7 +8435,7 @@ bool Actor::SoundSayAnim Director.GetString(name).c_str(), edict->tiki->a->name); - Sound(Director.GetString(name), 0, 0, 0, NULL, 0, 0, 1, -1); + Sound(Director.GetString(name), 0, 0, 0, NULL, 0, 1, 1, -1); return true; } @@ -8675,25 +8676,76 @@ void Actor::EventSetSayAnim { const_str name; - if (ev->NumArgs()) + str sName; + if (ev->NumArgs() != 1) { - if (ev->NumArgs() != 1) + ScriptError("bad number of arguments"); + } + + if (m_bLevelSayAnim == 0) + { + name = ev->GetConstString(1); + + parm.sayfail = qtrue; + sName = Director.GetString(name); + int animnum = gi.Anim_NumForName(edict->tiki, sName.c_str()); + + Com_Printf("EventSetSayAnim sName: %s, animnum: %d, mVoiceType: %d\n", sName.c_str(), animnum, mVoiceType); + if (animnum == -1) { - ScriptError("bad number of arguments"); + SoundSayAnim(name, m_bLevelSayAnim); } - if (m_bLevelSayAnim == 0) + else { - name = ev->GetConstString(1); - - parm.sayfail = qtrue; - - if (!SoundSayAnim(name, true)) + int flags = gi.Anim_FlagsSkel(edict->tiki, animnum); + if (flags & 256) { - //FIXME: assumption, not sure. I think it's an inline func inside UpdateSayAnim() - UpdateSayAnim(); + if (m_bLevelActionAnim) + { + if (!m_bSayAnimSet) + { + m_iSaySlot = m_iActionSlot; + } + return; + } + if (flags & TAF_HASDELTA) + { + if (m_bLevelMotionAnim) + { + if (!m_bSayAnimSet) + { + m_iSaySlot = m_iMotionSlot; + } + return; + } + ChangeActionAnim(); + ChangeMotionAnim(); + StartMotionAnimSlot(0, animnum, 1.0); + + m_iMotionSlot = m_iActionSlot = GetMotionSlot(0); + } + else + { + ChangeActionAnim(); + m_bActionAnimSet = true; + StartActionAnimSlot(animnum); + m_iActionSlot = GetActionSlot(0); + } + ChangeSayAnim(); + m_bSayAnimSet = true; + m_iSaySlot = m_iActionSlot; } - parm.sayfail = qfalse; + else + { + ChangeSayAnim(); + m_bSayAnimSet = true; + StartSayAnimSlot(animnum); + m_iSaySlot = GetSaySlot(); + + } + } + parm.sayfail = qfalse; } } @@ -8739,7 +8791,7 @@ void Actor::EventSetMotionAnim /* =============== -Actor::EventSetSayAnim +Actor::EventSetAimMotionAnim Set aim motion animation. =============== @@ -8799,7 +8851,7 @@ void Actor::EventSetAimMotionAnim /* =============== -Actor::EventSetSayAnim +Actor::EventSetActionAnim Set action animation. =============== @@ -8868,7 +8920,7 @@ void Actor::EventSetActionAnim /* =============== -Actor::EventSetSayAnim +Actor::EventUpperAnim Set upper body. =============== @@ -14333,9 +14385,9 @@ void Actor::SetVoiceType { //voice type in actor is a char. str vType = ev->GetString(1); - if (*vType.c_str()) + if (vType[0]) { - mVoiceType = *vType.c_str(); + mVoiceType = vType[0]; } else { @@ -14354,59 +14406,60 @@ void Actor::ResolveVoiceType if (mVoiceType == -1) { - int d = 3.0 * random(); + int d = 3.0 * 0.99 * random(); if (m_Team == TEAM_AMERICAN) { - mVoiceType = *gAmericanVoices[d]; + mVoiceType = gAmericanVoices[d][0]; } else { - mVoiceType = *gGermanVoices[d]; + mVoiceType = gGermanVoices[d][0]; } } else { if (m_Team == TEAM_AMERICAN) { - for (int i = 0; *gAmericanVoices[i] != mVoiceType ; i++) + for (int i = 0; i < 3 ; i++) { - if (i > 3) + if (gAmericanVoices[i][0] == mVoiceType) { - sprintf(validVoice, ""); - for (int j = 0; j <= 2 ; j++) - { - strcat(validVoice, gAmericanVoices[j]); - strcat(validVoice, " "); - } - Com_Printf("ERROR: Bad voice type %c. Valid American voicetypes are: %s\n", mVoiceType, validVoice); - mVoiceType = -1; - - int d = 3.0 * random(); - mVoiceType = *gAmericanVoices[d]; + return; } } + sprintf(validVoice, ""); + for (int i = 0; i < 3; i++) + { + strcat(validVoice, gAmericanVoices[i]); + strcat(validVoice, " "); + } + Com_Printf("ERROR: Bad voice type %c. Valid American voicetypes are: %s\n", mVoiceType, validVoice); + mVoiceType = -1; + + int d = 3.0 * 0.99 * random(); + mVoiceType = gAmericanVoices[d][0]; } else { - for (int i = 0; *gGermanVoices[i] != mVoiceType; i++) + for (int i = 0; i < 3; i++) { - if (i > 3) + if (gGermanVoices[i][0] == mVoiceType) { - sprintf(validVoice, ""); - for (int j = 0; j <= 2; j++) - { - strcat(validVoice, gGermanVoices[j]); - strcat(validVoice, " "); - } - Com_Printf("ERROR: Bad voice type %c. Valid German voicetypes are: %s\n", mVoiceType, validVoice); - mVoiceType = -1; - - int d = 3.0 * random(); - mVoiceType = *gGermanVoices[d]; - + return; } } + sprintf(validVoice, ""); + for (int i = 0; i < 3; i++) + { + strcat(validVoice, gGermanVoices[i]); + strcat(validVoice, " "); + } + Com_Printf("ERROR: Bad voice type %c. Valid German voicetypes are: %s\n", mVoiceType, validVoice); + mVoiceType = -1; + + int d = 3.0 * 0.99 * random(); + mVoiceType = gGermanVoices[d][0]; } } diff --git a/code/game/level.cpp b/code/game/level.cpp index a335cabc..3d366e8f 100644 --- a/code/game/level.cpp +++ b/code/game/level.cpp @@ -553,6 +553,8 @@ Event EV_Level_GetFlags EV_GETTER ); +extern Event EV_Entity_Start; + Level::Level() { Init(); @@ -1350,9 +1352,10 @@ void Level::Precache( void ) void Level::SpawnEntities( char *entities, int svsTime ) { - int inhibit, simple = 0, count = 0; + int inhibit, radnum = 0, count = 0; int enttime; const char *value; + char name[128]; SpawnArgs args; Listener *listener; Entity *ent; @@ -1410,16 +1413,20 @@ void Level::SpawnEntities( char *entities, int svsTime ) if( listener ) { - simple++; + radnum++; if( listener->isSubclassOf( Entity ) ) { count++; ent = ( Entity * )listener; - ent->radnum = simple; + ent->radnum = radnum; Q_strncpyz( ent->edict->entname, ent->getClassID(), sizeof( ent->edict->entname ) ); + + ent->PostEvent(EV_Entity_Start, -1.0, 0); + sprintf(name, "i%d", radnum); + gi.LoadResource(name); } } } @@ -1449,7 +1456,7 @@ void Level::SpawnEntities( char *entities, int svsTime ) m_LoopProtection = true; Com_Printf( "%i entities spawned\n", count ); - Com_Printf( "%i simple entities spawned\n", simple ); + Com_Printf( "%i simple entities spawned\n", radnum ); Com_Printf( "%i entities inhibited\n", inhibit ); Com_Printf( "-------------------- Spawning Entities Done ------------------ %i ms\n", gi.Milliseconds() - enttime ); diff --git a/code/game/player_util.cpp b/code/game/player_util.cpp index 28661ef9..0e595fbc 100644 --- a/code/game/player_util.cpp +++ b/code/game/player_util.cpp @@ -26,7 +26,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "player.h" #include "object.h" #include - +extern Event EV_Entity_Start; //==================== //Player::ActorInfo //==================== @@ -424,6 +424,9 @@ void Player::SpawnEntity e = new Event( EV_SetAnim ); e->AddString( "idle" ); ent->PostEvent( e, EV_SPAWNARG ); + + ent->ProcessPendingEvents(); + ent->ProcessEvent(EV_Entity_Start); } //==================== diff --git a/code/game/simpleactor.cpp b/code/game/simpleactor.cpp index 975d7090..ce3ae984 100644 --- a/code/game/simpleactor.cpp +++ b/code/game/simpleactor.cpp @@ -1251,7 +1251,7 @@ void SimpleActor::ChangeActionAnim animFlags[i] |= ANIM_NOACTION; StartCrossBlendAnimSlot(i); } - m_AnimDialogHigh ^= 1; // toggle + m_AnimDialogHigh = !m_AnimDialogHigh; // toggle } iSlot = GetActionSlot(0); diff --git a/code/globalcpp/g_spawn.cpp b/code/globalcpp/g_spawn.cpp index c78d99cb..63f13ec9 100644 --- a/code/globalcpp/g_spawn.cpp +++ b/code/globalcpp/g_spawn.cpp @@ -40,6 +40,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #define scriptcheck g_scriptcheck #endif +extern Event EV_Entity_Start; CLASS_DECLARATION( Class, SpawnArgs, NULL ) { { NULL, NULL } @@ -383,6 +384,7 @@ Listener *SpawnArgs::Spawn( void ) if( ent ) { ent->ProcessPendingEvents(); + ent->ProcessEvent(EV_Entity_Start); } return ent;