This commit is contained in:
Christoph Oelckers 2014-11-09 12:22:49 +01:00
commit 62d72fb751
13 changed files with 140 additions and 157 deletions

View file

@ -30,8 +30,6 @@ DBot::DBot ()
void DBot::Clear ()
{
savedyaw = 0;
savedpitch = 0;
angle = 0;
dest = NULL;
prev = NULL;
@ -59,9 +57,15 @@ void DBot::Serialize (FArchive &arc)
{
Super::Serialize (arc);
if (SaveVersion < 4515)
{
angle_t savedyaw;
int savedpitch;
arc << savedyaw
<< savedpitch
<< angle
<< savedpitch;
}
arc << angle
<< dest
<< prev
<< enemy

View file

@ -165,9 +165,6 @@ public:
void Clear ();
void Serialize (FArchive &arc);
angle_t savedyaw;
int savedpitch;
angle_t angle; // The wanted angle that the bot try to get every tic.
// (used to get a smooth view movement)
TObjPtr<AActor> dest; // Move Destination.

View file

@ -102,7 +102,7 @@ void FCajunMaster::Main (int buf)
BotThinkCycles.Reset();
if (consoleplayer != Net_Arbitrator || demoplayback)
if (demoplayback)
return;
if (gamestate != GS_LEVEL)
@ -122,6 +122,8 @@ void FCajunMaster::Main (int buf)
BotThinkCycles.Unclock();
}
if (consoleplayer == Net_Arbitrator)
{
//Add new bots?
if (wanted_botnum > botnum && !freeze)
{
@ -154,6 +156,7 @@ void FCajunMaster::Main (int buf)
players[consoleplayer].mo->flags2 &= ~MF2_FLY;
players[consoleplayer].mo->LinkToWorld ();
}
}
m_Thinking = false;
}
@ -347,12 +350,9 @@ void FCajunMaster::TryAddBot (BYTE **stream, int player)
}
if (DoAddBot ((BYTE *)info, skill))
{
if (consoleplayer == Net_Arbitrator)
{
//Increment this.
botnum++;
}
if (thebot != NULL)
{

View file

@ -561,6 +561,11 @@ int PrintString (int printlevel, const char *outline)
maybedrawnow (false, false);
}
}
else if (Logfile != NULL)
{
fputs (outline, Logfile);
fflush (Logfile);
}
return (int)strlen (outline);
}

View file

@ -975,25 +975,6 @@ void D_DoomLoop ()
I_StartTic ();
D_ProcessEvents ();
G_BuildTiccmd (&netcmds[consoleplayer][maketic%BACKUPTICS]);
//Added by MC: For some of that bot stuff. The main bot function.
int i;
for (i = 0; i < MAXPLAYERS; i++)
{
if (playeringame[i] && players[i].Bot != NULL && players[i].mo)
{
players[i].Bot->savedyaw = players[i].mo->angle;
players[i].Bot->savedpitch = players[i].mo->pitch;
}
}
bglobal.Main (maketic%BACKUPTICS);
for (i = 0; i < MAXPLAYERS; i++)
{
if (playeringame[i] && players[i].Bot != NULL && players[i].mo)
{
players[i].mo->angle = players[i].Bot->savedyaw;
players[i].mo->pitch = players[i].Bot->savedpitch;
}
}
if (advancedemo)
D_DoAdvanceDemo ();
C_Ticker ();

View file

@ -691,9 +691,6 @@ void PlayerIsGone (int netnode, int netconsole)
if (netconsole == Net_Arbitrator)
{
bglobal.RemoveAllBots(true);
Printf("Removed all bots\n");
// Pick a new network arbitrator
for (int i = 0; i < MAXPLAYERS; i++)
{
@ -824,7 +821,6 @@ void GetPackets (void)
}
if (netbuffer[0] & NCMD_QUITTERS)
{
numplayers = netbuffer[k++];
for (int i = 0; i < numplayers; ++i)
@ -902,63 +898,17 @@ void GetPackets (void)
for (i = 0; i < numplayers; ++i)
{
int node = (players[playerbytes[i]].Bot == NULL) ?
nodeforplayer[playerbytes[i]] : netnode;
int node = nodeforplayer[playerbytes[i]];
SkipTicCmd (&start, nettics[node] - realstart);
for (tics = nettics[node]; tics < realend; tics++)
ReadTicCmd (&start, playerbytes[i], tics);
}
// Update the number of tics received from each node. This must
// be separate from the above loop in case the master is also
// sending bot movements. If it's not separate, then the bots
// will only move on the master, because the other players will
// read the master's tics and then think they already got all
// the tics for the bots and skip the bot tics included in the
// packet.
for (i = 0; i < numplayers; ++i)
{
if (players[playerbytes[i]].Bot == NULL)
{
nettics[nodeforplayer[playerbytes[i]]] = realend;
}
}
}
}
}
void AdjustBots (int gameticdiv)
{
// [RH] This loop adjusts the bots' rotations for ticcmds that have
// been already created but not yet executed. This way, the bot is still
// able to create ticcmds that accurately reflect the state it wants to
// be in even when gametic lags behind maketic.
for (int i = 0; i < MAXPLAYERS; i++)
{
if (playeringame[i] && players[i].Bot != NULL && players[i].mo)
{
players[i].Bot->savedyaw = players[i].mo->angle;
players[i].Bot->savedpitch = players[i].mo->pitch;
for (int j = gameticdiv; j < maketic/ticdup; j++)
{
players[i].mo->angle += (netcmds[i][j%BACKUPTICS].ucmd.yaw << 16) * ticdup;
players[i].mo->pitch -= (netcmds[i][j%BACKUPTICS].ucmd.pitch << 16) * ticdup;
}
}
}
}
void UnadjustBots ()
{
for (int i = 0; i < MAXPLAYERS; i++)
{
if (playeringame[i] && players[i].Bot != NULL && players[i].mo)
{
players[i].mo->angle = players[i].Bot->savedyaw;
players[i].mo->pitch = players[i].Bot->savedpitch;
}
}
}
//
// NetUpdate
@ -1006,9 +956,7 @@ void NetUpdate (void)
newtics = 0;
}
// build new ticcmds for console player (and bots if I am the arbitrator)
AdjustBots (gametic / ticdup);
// build new ticcmds for console player
for (i = 0; i < newtics; i++)
{
I_StartTic ();
@ -1018,11 +966,6 @@ void NetUpdate (void)
//Printf ("mk:%i ",maketic);
G_BuildTiccmd (&localcmds[maketic % LOCALCMDTICS]);
if (maketic % ticdup == 0)
{
//Added by MC: For some of that bot stuff. The main bot function.
bglobal.Main ((maketic / ticdup) % BACKUPTICS);
}
maketic++;
if (ticdup == 1 || maketic == 0)
@ -1102,8 +1045,6 @@ void NetUpdate (void)
}
}
UnadjustBots ();
if (singletics)
return; // singletic update is synchronous
@ -1123,16 +1064,13 @@ void NetUpdate (void)
if (consoleplayer == Net_Arbitrator)
{
for (j = 0; j < MAXPLAYERS; j++)
for (j = 0; j < doomcom.numnodes; j++)
{
if (playeringame[j])
{
if (players[j].Bot != NULL || NetMode == NET_PacketServer)
if (nodeingame[j] && NetMode == NET_PacketServer)
{
count++;
}
}
}
if (NetMode == NET_PacketServer)
{
@ -1265,15 +1203,12 @@ void NetUpdate (void)
netbuffer[0] |= NCMD_MULTI;
netbuffer[k++] = count;
for (l = 1, j = 0; j < MAXPLAYERS; j++)
for (l = 1, j = 0; j < doomcom.numnodes; j++)
{
if (playeringame[j] && j != playerfornode[i] && j != consoleplayer)
if (nodeingame[j] && j != i && j != nodeforplayer[consoleplayer] && NetMode == NET_PacketServer)
{
if (players[j].Bot != NULL || NetMode == NET_PacketServer)
{
playerbytes[l++] = j;
netbuffer[k++] = j;
}
playerbytes[l++] = playerfornode[j];
netbuffer[k++] = playerfornode[j];
}
}
}
@ -1293,7 +1228,7 @@ void NetUpdate (void)
prev %= BACKUPTICS;
// The local player has their tics sent first, followed by
// the other players/bots.
// the other players.
if (l == 0)
{
WriteWord (localcmds[localstart].consistancy, &cmddata);
@ -1307,12 +1242,6 @@ void NetUpdate (void)
localprev >= 0 ? &localcmds[localprev].ucmd : NULL, &cmddata);
}
else if (i != 0)
{
if (players[playerbytes[l]].Bot != NULL)
{
WriteWord (0, &cmddata); // fake consistancy word
}
else
{
int len;
BYTE *spec;
@ -1324,7 +1253,7 @@ void NetUpdate (void)
memcpy (cmddata, spec, len);
cmddata += len;
}
}
WriteUserCmdMessage (&netcmds[playerbytes[l]][start].ucmd,
prev >= 0 ? &netcmds[playerbytes[l]][prev].ucmd : NULL, &cmddata);
}

View file

@ -1127,6 +1127,12 @@ void G_Ticker ()
// check, not just the player's x position like BOOM.
DWORD rngsum = FRandom::StaticSumSeeds ();
if ((gametic % ticdup) == 0)
{
//Added by MC: For some of that bot stuff. The main bot function.
bglobal.Main (buf);
}
for (i = 0; i < MAXPLAYERS; i++)
{
if (playeringame[i])

View file

@ -2881,9 +2881,57 @@ DACSThinker::~DACSThinker ()
void DACSThinker::Serialize (FArchive &arc)
{
int scriptnum;
int scriptcount = 0;
Super::Serialize (arc);
if (SaveVersion < 4515)
arc << Scripts << LastScript;
else
{
if (arc.IsStoring())
{
DLevelScript *script;
script = Scripts;
while (script)
{
scriptcount++;
// We want to store this list backwards, so we can't loose the last pointer
if (script->next == NULL)
break;
script = script->next;
}
arc << scriptcount;
while (script)
{
arc << script;
script = script->prev;
}
}
else
{
// We are running through this list backwards, so the next entry is the last processed
DLevelScript *next = NULL;
arc << scriptcount;
Scripts = NULL;
LastScript = NULL;
for (int i = 0; i < scriptcount; i++)
{
arc << Scripts;
Scripts->next = next;
Scripts->prev = NULL;
if (next != NULL)
next->prev = Scripts;
next = Scripts;
if (i == 0)
LastScript = Scripts;
}
}
}
if (arc.IsStoring ())
{
ScriptMap::Iterator it(RunningScripts);
@ -2969,6 +3017,7 @@ void DLevelScript::Serialize (FArchive &arc)
DWORD i;
Super::Serialize (arc);
if (SaveVersion < 4515)
arc << next << prev;
P_SerializeACSScriptNumber(arc, script, false);

View file

@ -606,7 +606,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags)
player->respawn_time = level.time + TICRATE;
//Added by MC: Respawn bots
if (bglobal.botnum && consoleplayer == Net_Arbitrator && !demoplayback)
if (bglobal.botnum && !demoplayback)
{
if (player->Bot != NULL)
player->Bot->t_respawn = (pr_botrespawn()%15)+((bglobal.botnum-1)*2)+TICRATE+1;

View file

@ -3228,7 +3228,7 @@ void AActor::Tick ()
}
}
if (bglobal.botnum && consoleplayer == Net_Arbitrator && !demoplayback &&
if (bglobal.botnum && !demoplayback &&
((flags & (MF_SPECIAL|MF_MISSILE)) || (flags3 & MF3_ISMONSTER)))
{
BotSupportCycles.Clock();

View file

@ -3781,6 +3781,17 @@ DEFINE_ACTION_FUNCTION(AActor, A_RaiseSiblings)
}
}
//===========================================================================
//
// [TP] A_FaceConsolePlayer
//
//===========================================================================
DEFINE_ACTION_FUNCTION_PARAMS (AActor, A_FaceConsolePlayer) {
ACTION_PARAM_START (1);
ACTION_PARAM_ANGLE (MaxTurnAngle, 0);
// NOTE: It does nothing for zdoom.
}
//===========================================================================
//
// A_MonsterRefire
@ -4678,7 +4689,7 @@ enum RadiusGiveFlags
RGF_OBJECTS = 1 << 3,
RGF_VOODOO = 1 << 4,
RGF_CORPSES = 1 << 5,
RGF_MASK = 63,
RGF_MASK = 2111,
RGF_NOTARGET = 1 << 6,
RGF_NOTRACER = 1 << 7,
RGF_NOMASTER = 1 << 8,

View file

@ -76,7 +76,7 @@ const char *GetVersionString();
// Use 4500 as the base git save version, since it's higher than the
// SVN revision ever got.
#define SAVEVER 4514
#define SAVEVER 4515
#define SAVEVERSTRINGIFY2(x) #x
#define SAVEVERSTRINGIFY(x) SAVEVERSTRINGIFY2(x)

View file

@ -186,6 +186,7 @@ ACTOR Actor native //: Thinker
action native A_ClearSoundTarget();
action native A_FireAssaultGun();
action native A_CheckTerrain();
action native A_FaceConsolePlayer(float MaxTurnAngle = 0); // [TP]
action native A_MissileAttack();
action native A_MeleeAttack();