- redirect most references to the global players array through FLevelLocals.

The Map loader may not access any global state at all - everything it can touch must be exchangable.
Furthermore, if we want to sandbox each level, there may be no direct access to any kind of global state whatsoever from the play code.
This commit is contained in:
Christoph Oelckers 2019-01-30 01:15:32 +01:00
commit 8bbdee5c28
19 changed files with 259 additions and 189 deletions

View file

@ -278,7 +278,7 @@ int FParser::T_GetPlayerNum(const svalue_t &arg)
{
return -1;
}
if(!playeringame[playernum]) // no error, just return -1
if(!Level->PlayerInGame(playernum)) // no error, just return -1
{
return -1;
}
@ -288,7 +288,7 @@ int FParser::T_GetPlayerNum(const svalue_t &arg)
AActor *FParser::T_GetPlayerActor(const svalue_t &arg)
{
int num = T_GetPlayerNum(arg);
return num == -1 ? nullptr : players[num].mo;
return num == -1 ? nullptr : Level->Players[num]->mo;
}
PClassActor *T_ClassType(const svalue_t &arg)
@ -659,7 +659,7 @@ void FParser::SF_PlayerTip(void)
if (CheckArgs(1))
{
int plnum = T_GetPlayerNum(t_argv[0]);
if (plnum!=-1 && players[plnum].mo->CheckLocalView(consoleplayer))
if (plnum!=-1 && Level->Players[plnum]->mo->CheckLocalView(consoleplayer))
{
C_MidPrint(SmallFont, GetFormatString(1).GetChars());
}
@ -692,7 +692,7 @@ void FParser::SF_PlayerMsg(void)
if (CheckArgs(1))
{
int plnum = T_GetPlayerNum(t_argv[0]);
if (plnum!=-1 && players[plnum].mo->CheckLocalView(consoleplayer))
if (plnum!=-1 && Level->Players[plnum]->mo->CheckLocalView(consoleplayer))
{
Printf(PRINT_HIGH, "%s\n", GetFormatString(1).GetChars());
}
@ -714,7 +714,7 @@ void FParser::SF_PlayerInGame(void)
if (plnum!=-1)
{
t_return.type = svt_int;
t_return.value.i = playeringame[plnum];
t_return.value.i = Level->PlayerInGame(plnum);
}
}
}
@ -742,7 +742,7 @@ void FParser::SF_PlayerName(void)
if(plnum !=-1)
{
t_return.type = svt_string;
t_return.string = players[plnum].userinfo.GetName();
t_return.string = Level->Players[plnum]->userinfo.GetName();
}
else
{
@ -773,7 +773,7 @@ void FParser::SF_PlayerObj(void)
if(plnum !=-1)
{
t_return.type = svt_mobj;
t_return.value.mobj = players[plnum].mo;
t_return.value.mobj = Level->Players[plnum]->mo;
}
else
{
@ -1402,8 +1402,8 @@ void FParser::SF_SetCamera(void)
if (CheckArgs(1))
{
player=Script->trigger->player;
if (!player) player=&players[0];
player = Script->trigger->player;
if (!player) player = Level->Players[0];
newcamera = actorvalue(t_argv[0]);
if(!newcamera)
@ -1435,8 +1435,8 @@ void FParser::SF_SetCamera(void)
void FParser::SF_ClearCamera(void)
{
player_t * player;
player=Script->trigger->player;
if (!player) player=&players[0];
player = Script->trigger->player;
if (!player) player = Level->Players[0];
AActor * cam=player->camera;
if (cam)
@ -2419,13 +2419,13 @@ void FParser::SF_PlayerKeys(void)
if(t_argc == 2)
{
t_return.type = svt_int;
t_return.value.i = CheckInventory(players[playernum].mo, keyname);
t_return.value.i = CheckInventory(Level->Players[playernum]->mo, keyname);
return;
}
else
{
givetake = intvalue(t_argv[2]);
ScriptUtil::Exec(givetake?NAME_GiveInventory : NAME_TakeInventory, ScriptUtil::Pointer, players[playernum].mo, ScriptUtil::Int, keyname.GetIndex(), ScriptUtil::Int, 1, ScriptUtil::End);
ScriptUtil::Exec(givetake?NAME_GiveInventory : NAME_TakeInventory, ScriptUtil::Pointer, Level->Players[playernum]->mo, ScriptUtil::Int, keyname.GetIndex(), ScriptUtil::Int, 1, ScriptUtil::End);
t_return.type = svt_int;
t_return.value.i = 0;
}
@ -2504,14 +2504,14 @@ void FParser::SF_PlayerWeapon()
if (t_argc == 2)
{
AActor * wp = players[playernum].mo->FindInventory(ti);
AActor * wp = Level->Players[playernum]->mo->FindInventory(ti);
t_return.type = svt_int;
t_return.value.i = wp!=NULL;
return;
}
else
{
AActor * wp = players[playernum].mo->FindInventory(ti);
AActor * wp = Level->Players[playernum]->mo->FindInventory(ti);
newweapon = !!intvalue(t_argv[2]);
if (!newweapon)
@ -2520,14 +2520,14 @@ void FParser::SF_PlayerWeapon()
{
wp->Destroy();
// If the weapon is active pick a replacement. Legacy didn't do this!
if (players[playernum].PendingWeapon==wp) players[playernum].PendingWeapon=WP_NOCHANGE;
if (players[playernum].ReadyWeapon==wp)
if (Level->Players[playernum]->PendingWeapon==wp) Level->Players[playernum]->PendingWeapon=WP_NOCHANGE;
if (Level->Players[playernum]->ReadyWeapon==wp)
{
players[playernum].ReadyWeapon=nullptr;
Level->Players[playernum]->ReadyWeapon=nullptr;
IFVM(PlayerPawn, PickNewWeapon)
{
VMValue param[] = { players[playernum].mo, (void*)nullptr };
VMValue param[] = { Level->Players[playernum]->mo, (void*)nullptr };
VMCall(func, param, 2, nullptr, 0);
}
}
@ -2537,9 +2537,9 @@ void FParser::SF_PlayerWeapon()
{
if (!wp)
{
auto pw=players[playernum].PendingWeapon;
players[playernum].mo->GiveInventoryType(ti);
players[playernum].PendingWeapon=pw;
auto pw=Level->Players[playernum]->PendingWeapon;
Level->Players[playernum]->mo->GiveInventoryType(ti);
Level->Players[playernum]->PendingWeapon=pw;
}
}
@ -2588,13 +2588,13 @@ void FParser::SF_PlayerSelectedWeapon()
return;
}
players[playernum].PendingWeapon = players[playernum].mo->FindInventory(ti);
Level->Players[playernum]->PendingWeapon = Level->Players[playernum]->mo->FindInventory(ti);
}
t_return.type = svt_int;
for(int i=0;i<9;i++)
{
if (players[playernum].ReadyWeapon->GetClass ()->TypeName == FName(WeaponNames[i]))
if (Level->Players[playernum]->ReadyWeapon->GetClass ()->TypeName == FName(WeaponNames[i]))
{
t_return.value.i=i;
break;
@ -2620,7 +2620,7 @@ void FParser::SF_GiveInventory(void)
if(t_argc == 2) count=1;
else count=intvalue(t_argv[2]);
ScriptUtil::Exec(NAME_GiveInventory, ScriptUtil::Pointer, players[playernum].mo, ScriptUtil::Int, FName(stringvalue(t_argv[1])).GetIndex(), ScriptUtil::Int, count, ScriptUtil::End);
ScriptUtil::Exec(NAME_GiveInventory, ScriptUtil::Pointer, Level->Players[playernum]->mo, ScriptUtil::Int, FName(stringvalue(t_argv[1])).GetIndex(), ScriptUtil::Int, count, ScriptUtil::End);
t_return.type = svt_int;
t_return.value.i = 0;
}
@ -2643,7 +2643,7 @@ void FParser::SF_TakeInventory(void)
if(t_argc == 2) count=32767;
else count=intvalue(t_argv[2]);
ScriptUtil::Exec(NAME_TakeInventory, ScriptUtil::Pointer, players[playernum].mo, ScriptUtil::Int, FName(stringvalue(t_argv[1])).GetIndex(), ScriptUtil::Int, count, ScriptUtil::End);
ScriptUtil::Exec(NAME_TakeInventory, ScriptUtil::Pointer, Level->Players[playernum]->mo, ScriptUtil::Int, FName(stringvalue(t_argv[1])).GetIndex(), ScriptUtil::Int, count, ScriptUtil::End);
t_return.type = svt_int;
t_return.value.i = 0;
}
@ -2668,7 +2668,7 @@ void FParser::SF_CheckInventory(void)
return;
}
t_return.type = svt_int;
t_return.value.i = CheckInventory(players[playernum].mo, stringvalue(t_argv[1]));
t_return.value.i = CheckInventory(Level->Players[playernum]->mo, stringvalue(t_argv[1]));
}
}
@ -3221,10 +3221,10 @@ void FParser::SF_PlayerAddFrag()
{
playernum1 = T_GetPlayerNum(t_argv[0]);
players[playernum1].fragcount++;
Level->Players[playernum1]->fragcount++;
t_return.type = svt_int;
t_return.value.f = players[playernum1].fragcount;
t_return.value.f = Level->Players[playernum1]->fragcount;
}
else
@ -3232,10 +3232,10 @@ void FParser::SF_PlayerAddFrag()
playernum1 = T_GetPlayerNum(t_argv[0]);
playernum2 = T_GetPlayerNum(t_argv[1]);
players[playernum1].frags[playernum2]++;
Level->Players[playernum1]->frags[playernum2]++;
t_return.type = svt_int;
t_return.value.f = players[playernum1].frags[playernum2];
t_return.value.f = Level->Players[playernum1]->frags[playernum2];
}
}
}