mirror of
https://github.com/ZDoom/qzdoom-gpl.git
synced 2025-02-21 19:00:56 +00:00
- Fixed: Hexen's ACS implementation truncates all line specials to bytes, so we need to do the
same for maps defined with Hexen-style MAPINFOs. SVN r3336 (trunk)
This commit is contained in:
parent
243197bfd4
commit
83fc6cf53a
2 changed files with 54 additions and 29 deletions
|
@ -3676,6 +3676,9 @@ int DLevelScript::RunScript ()
|
||||||
FRemapTable *translation = 0;
|
FRemapTable *translation = 0;
|
||||||
int resultValue = 1;
|
int resultValue = 1;
|
||||||
|
|
||||||
|
// Hexen truncates all special arguments to bytes.
|
||||||
|
const int specialargmask = (level.flags2 & LEVEL2_HEXENHACK) ? 255 : ~0;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
case SCRIPT_Delayed:
|
case SCRIPT_Delayed:
|
||||||
|
@ -3845,78 +3848,100 @@ int DLevelScript::RunScript ()
|
||||||
|
|
||||||
case PCD_LSPEC1:
|
case PCD_LSPEC1:
|
||||||
P_ExecuteSpecial(NEXTBYTE, activationline, activator, backSide,
|
P_ExecuteSpecial(NEXTBYTE, activationline, activator, backSide,
|
||||||
STACK(1), 0, 0, 0, 0);
|
STACK(1) & specialargmask, 0, 0, 0, 0);
|
||||||
sp -= 1;
|
sp -= 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PCD_LSPEC2:
|
case PCD_LSPEC2:
|
||||||
P_ExecuteSpecial(NEXTBYTE, activationline, activator, backSide,
|
P_ExecuteSpecial(NEXTBYTE, activationline, activator, backSide,
|
||||||
STACK(2), STACK(1), 0, 0, 0);
|
STACK(2) & specialargmask,
|
||||||
|
STACK(1) & specialargmask, 0, 0, 0);
|
||||||
sp -= 2;
|
sp -= 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PCD_LSPEC3:
|
case PCD_LSPEC3:
|
||||||
P_ExecuteSpecial(NEXTBYTE, activationline, activator, backSide,
|
P_ExecuteSpecial(NEXTBYTE, activationline, activator, backSide,
|
||||||
STACK(3), STACK(2), STACK(1), 0, 0);
|
STACK(3) & specialargmask,
|
||||||
|
STACK(2) & specialargmask,
|
||||||
|
STACK(1) & specialargmask, 0, 0);
|
||||||
sp -= 3;
|
sp -= 3;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PCD_LSPEC4:
|
case PCD_LSPEC4:
|
||||||
P_ExecuteSpecial(NEXTBYTE, activationline, activator, backSide,
|
P_ExecuteSpecial(NEXTBYTE, activationline, activator, backSide,
|
||||||
STACK(4), STACK(3), STACK(2),
|
STACK(4) & specialargmask,
|
||||||
STACK(1), 0);
|
STACK(3) & specialargmask,
|
||||||
|
STACK(2) & specialargmask,
|
||||||
|
STACK(1) & specialargmask, 0);
|
||||||
sp -= 4;
|
sp -= 4;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PCD_LSPEC5:
|
case PCD_LSPEC5:
|
||||||
P_ExecuteSpecial(NEXTBYTE, activationline, activator, backSide,
|
P_ExecuteSpecial(NEXTBYTE, activationline, activator, backSide,
|
||||||
STACK(5), STACK(4), STACK(3),
|
STACK(5) & specialargmask,
|
||||||
STACK(2), STACK(1));
|
STACK(4) & specialargmask,
|
||||||
|
STACK(3) & specialargmask,
|
||||||
|
STACK(2) & specialargmask,
|
||||||
|
STACK(1) & specialargmask);
|
||||||
sp -= 5;
|
sp -= 5;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PCD_LSPEC5RESULT:
|
case PCD_LSPEC5RESULT:
|
||||||
STACK(5) = P_ExecuteSpecial(NEXTBYTE, activationline, activator, backSide,
|
STACK(5) = P_ExecuteSpecial(NEXTBYTE, activationline, activator, backSide,
|
||||||
STACK(5), STACK(4), STACK(3),
|
STACK(5) & specialargmask,
|
||||||
STACK(2), STACK(1));
|
STACK(4) & specialargmask,
|
||||||
|
STACK(3) & specialargmask,
|
||||||
|
STACK(2) & specialargmask,
|
||||||
|
STACK(1) & specialargmask);
|
||||||
sp -= 4;
|
sp -= 4;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PCD_LSPEC1DIRECT:
|
case PCD_LSPEC1DIRECT:
|
||||||
temp = NEXTBYTE;
|
temp = NEXTBYTE;
|
||||||
P_ExecuteSpecial(temp, activationline, activator, backSide,
|
P_ExecuteSpecial(temp, activationline, activator, backSide,
|
||||||
uallong(pc[0]), 0, 0, 0, 0);
|
uallong(pc[0]) & specialargmask ,0, 0, 0, 0);
|
||||||
pc += 1;
|
pc += 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PCD_LSPEC2DIRECT:
|
case PCD_LSPEC2DIRECT:
|
||||||
temp = NEXTBYTE;
|
temp = NEXTBYTE;
|
||||||
P_ExecuteSpecial(temp, activationline, activator, backSide,
|
P_ExecuteSpecial(temp, activationline, activator, backSide,
|
||||||
uallong(pc[0]), uallong(pc[1]), 0, 0, 0);
|
uallong(pc[0]) & specialargmask,
|
||||||
|
uallong(pc[1]) & specialargmask, 0, 0, 0);
|
||||||
pc += 2;
|
pc += 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PCD_LSPEC3DIRECT:
|
case PCD_LSPEC3DIRECT:
|
||||||
temp = NEXTBYTE;
|
temp = NEXTBYTE;
|
||||||
P_ExecuteSpecial(temp, activationline, activator, backSide,
|
P_ExecuteSpecial(temp, activationline, activator, backSide,
|
||||||
uallong(pc[0]), uallong(pc[1]), uallong(pc[2]), 0, 0);
|
uallong(pc[0]) & specialargmask,
|
||||||
|
uallong(pc[1]) & specialargmask,
|
||||||
|
uallong(pc[2]) & specialargmask, 0, 0);
|
||||||
pc += 3;
|
pc += 3;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PCD_LSPEC4DIRECT:
|
case PCD_LSPEC4DIRECT:
|
||||||
temp = NEXTBYTE;
|
temp = NEXTBYTE;
|
||||||
P_ExecuteSpecial(temp, activationline, activator, backSide,
|
P_ExecuteSpecial(temp, activationline, activator, backSide,
|
||||||
uallong(pc[0]), uallong(pc[1]), uallong(pc[2]), uallong(pc[3]), 0);
|
uallong(pc[0]) & specialargmask,
|
||||||
|
uallong(pc[1]) & specialargmask,
|
||||||
|
uallong(pc[2]) & specialargmask,
|
||||||
|
uallong(pc[3]) & specialargmask, 0);
|
||||||
pc += 4;
|
pc += 4;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PCD_LSPEC5DIRECT:
|
case PCD_LSPEC5DIRECT:
|
||||||
temp = NEXTBYTE;
|
temp = NEXTBYTE;
|
||||||
P_ExecuteSpecial(temp, activationline, activator, backSide,
|
P_ExecuteSpecial(temp, activationline, activator, backSide,
|
||||||
uallong(pc[0]), uallong(pc[1]), uallong(pc[2]), uallong(pc[3]), uallong(pc[4]));
|
uallong(pc[0]) & specialargmask,
|
||||||
|
uallong(pc[1]) & specialargmask,
|
||||||
|
uallong(pc[2]) & specialargmask,
|
||||||
|
uallong(pc[3]) & specialargmask,
|
||||||
|
uallong(pc[4]) & specialargmask);
|
||||||
pc += 5;
|
pc += 5;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// Parameters for PCD_LSPEC?DIRECTB are by definition bytes so never need and-ing.
|
||||||
case PCD_LSPEC1DIRECTB:
|
case PCD_LSPEC1DIRECTB:
|
||||||
P_ExecuteSpecial(((BYTE *)pc)[0], activationline, activator, backSide,
|
P_ExecuteSpecial(((BYTE *)pc)[0], activationline, activator, backSide,
|
||||||
((BYTE *)pc)[1], 0, 0, 0, 0);
|
((BYTE *)pc)[1], 0, 0, 0, 0);
|
||||||
|
|
|
@ -57,13 +57,13 @@
|
||||||
#include "gi.h"
|
#include "gi.h"
|
||||||
#include "statnums.h"
|
#include "statnums.h"
|
||||||
#include "g_level.h"
|
#include "g_level.h"
|
||||||
#include "v_font.h"
|
#include "v_font.h"
|
||||||
#include "a_sharedglobal.h"
|
#include "a_sharedglobal.h"
|
||||||
#include "farchive.h"
|
#include "farchive.h"
|
||||||
#include "a_keys.h"
|
#include "a_keys.h"
|
||||||
|
|
||||||
// State.
|
// State.
|
||||||
#include "r_state.h"
|
#include "r_state.h"
|
||||||
|
|
||||||
#include "c_console.h"
|
#include "c_console.h"
|
||||||
|
|
||||||
|
@ -233,14 +233,14 @@ bool P_ActivateLine (line_t *line, AActor *mo, int side, int activationType)
|
||||||
BYTE special;
|
BYTE special;
|
||||||
|
|
||||||
if (!P_TestActivateLine (line, mo, side, activationType))
|
if (!P_TestActivateLine (line, mo, side, activationType))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
int remote = (line->special != 7 && line->special != 8 && (line->special < 11 || line->special > 14));
|
int remote = (line->special != 7 && line->special != 8 && (line->special < 11 || line->special > 14));
|
||||||
if (line->locknumber > 0 && !P_CheckKeys (mo, line->locknumber, remote)) return false;
|
if (line->locknumber > 0 && !P_CheckKeys (mo, line->locknumber, remote)) return false;
|
||||||
lineActivation = line->activation;
|
lineActivation = line->activation;
|
||||||
repeat = line->flags & ML_REPEAT_SPECIAL;
|
repeat = line->flags & ML_REPEAT_SPECIAL;
|
||||||
buttonSuccess = false;
|
buttonSuccess = false;
|
||||||
buttonSuccess = P_ExecuteSpecial(line->special,
|
buttonSuccess = P_ExecuteSpecial(line->special,
|
||||||
line, mo, side == 1, line->args[0],
|
line, mo, side == 1, line->args[0],
|
||||||
line->args[1], line->args[2],
|
line->args[1], line->args[2],
|
||||||
|
|
Loading…
Reference in a new issue