diff --git a/.gitignore b/.gitignore index eb09f9c..0cf7987 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ /log /t /zdefs.acs.orig +/*.o diff --git a/parse.c b/parse.c index e742130..e59304e 100644 --- a/parse.c +++ b/parse.c @@ -341,6 +341,8 @@ static struct ScriptTypes ScriptCounts[] = { "unloading", UNLOADING_SCRIPTS_BASE, 0 }, { "return", RETURN_SCRIPTS_BASE, 0 }, { "event", EVENT_SCRIPTS_BASE, 0 }, + { "kill", KILL_SCRIPTS_BASE, 0 }, + { "reopen", REOPEN_SCRIPTS_BASE, 0 }, { NULL, -1, 0 } }; @@ -522,6 +524,7 @@ static void Outside(void) break; case TK_REGION: // [mxd] case TK_ENDREGION: + outertokencount--; // #region markers should not count as "real" tokens TK_SkipLine(); break; default: @@ -669,6 +672,8 @@ static void OuterScript(void) case TK_LIGHTNING: case TK_UNLOADING: case TK_RETURN: + case TK_KILL: + case TK_REOPEN: ERR_Error(ERR_UNCLOSED_WITH_ARGS, YES); break; @@ -742,6 +747,14 @@ static void OuterScript(void) scriptType = EVENT_SCRIPTS_BASE; ERR_Error (ERR_EVENT_NEEDS_3_ARG, YES); break; + + case TK_KILL: // [JM] + scriptType = KILL_SCRIPTS_BASE; + break; + + case TK_REOPEN: // [Nash] + scriptType = REOPEN_SCRIPTS_BASE; + break; default: ERR_Error(ERR_BAD_SCRIPT_DECL, YES); @@ -1635,7 +1648,21 @@ static void LeadingLineSpecial(boolean executewait) } TK_TokenMustBe(TK_RPAREN, ERR_MISSING_RPAREN); TK_NextTokenMustBe(TK_SEMICOLON, ERR_MISSING_SEMICOLON); - if(direct == NO) + if (specialValue > 255) + { + for(; argCount < 5; ++argCount) + { + PC_AppendPushVal(0); + } + PC_AppendCmd(PCD_LSPEC5EX); + PC_AppendInt(specialValue); + if(executewait) + { + PC_AppendCmd(PCD_SCRIPTWAITDIRECT); + PC_AppendInt(argSave[0]); + } + } + else if(direct == NO) { PC_AppendCmd(PCD_LSPEC1+(argCount-1)); if(pc_NoShrink) @@ -3513,8 +3540,8 @@ static void ExprLineSpecial(void) } TK_TokenMustBe(TK_RPAREN, ERR_MISSING_RPAREN); TK_NextToken(); - PC_AppendCmd(PCD_LSPEC5RESULT); - if(pc_NoShrink) + PC_AppendCmd(specialValue <= 255? PCD_LSPEC5RESULT : PCD_LSPEC5EXRESULT); + if(pc_NoShrink || specialValue > 255) { PC_AppendInt(specialValue); } diff --git a/pcode.c b/pcode.c index 29edf17..4d31569 100644 --- a/pcode.c +++ b/pcode.c @@ -231,7 +231,7 @@ static char *PCDNames[PCODE_COMMAND_COUNT] = "PCD_PLAYERGOLDSKULL", "PCD_PLAYERBLACKCARD", "PCD_PLAYERSILVERCARD", - "PCD_PLAYERONTEAM", + "PCD_ISNETWORKGAME", "PCD_PLAYERTEAM", "PCD_PLAYERHEALTH", "PCD_PLAYERARMORPOINTS", @@ -499,6 +499,8 @@ static char *PCDNames[PCODE_COMMAND_COUNT] = "PCD_PRINTSCRIPTCHARARRAY", "PCD_PRINTSCRIPTCHRANGE", "PCD_STRCPYTOSCRIPTCHRANGE", + "PCD_LSPEC5EX", + "PCD_LSPEC5EXRESULT", }; // CODE -------------------------------------------------------------------- diff --git a/pcode.h b/pcode.h index 3f17c35..5cceb6c 100644 --- a/pcode.h +++ b/pcode.h @@ -31,6 +31,8 @@ enum DISCONNECT_SCRIPTS_BASE = 14, RETURN_SCRIPTS_BASE = 15, EVENT_SCRIPTS_BASE = 16, // [BB] + KILL_SCRIPTS_BASE = 17, // [JM] + REOPEN_SCRIPTS_BASE = 18, // [Nash] }; // Values to indicate script flags (requires new-style .o) @@ -176,7 +178,7 @@ typedef enum PCD_PLAYERGOLDSKULL, PCD_PLAYERBLACKCARD, PCD_PLAYERSILVERCARD, - PCD_PLAYERONTEAM, + PCD_ISNETWORKGAME, PCD_PLAYERTEAM, PCD_PLAYERHEALTH, PCD_PLAYERARMORPOINTS, @@ -444,6 +446,8 @@ typedef enum PCD_PRINTSCRIPTCHARARRAY, PCD_PRINTSCRIPTCHRANGE, PCD_STRCPYTOSCRIPTCHRANGE, + PCD_LSPEC5EX, + PCD_LSPEC5EXRESULT, PCODE_COMMAND_COUNT } pcd_t; diff --git a/symbol.c b/symbol.c index e5dbf46..3b09188 100644 --- a/symbol.c +++ b/symbol.c @@ -90,7 +90,7 @@ static internFuncDef_t InternalFunctions[] = { "playerbluecard", PCD_NOP, PCD_PLAYERBLUECARD, 0, 0, 0, YES, NO }, { "playerredcard", PCD_NOP, PCD_PLAYERREDCARD, 0, 0, 0, YES, NO }, { "playeryellowcard", PCD_NOP, PCD_PLAYERYELLOWCARD, 0, 0, 0, YES, NO }, - { "playeronteam", PCD_NOP, PCD_PLAYERONTEAM, 0, 0, 0, YES, NO }, + { "isnetworkgame", PCD_NOP, PCD_ISNETWORKGAME, 0, 0, 0, YES, NO }, { "playerteam", PCD_NOP, PCD_PLAYERTEAM, 0, 0, 0, YES, NO }, { "playerfrags", PCD_NOP, PCD_PLAYERFRAGS, 0, 0, 0, YES, NO }, { "playerhealth", PCD_NOP, PCD_PLAYERHEALTH, 0, 0, 0, YES, NO }, diff --git a/token.c b/token.c index 518c896..0e5cd1e 100644 --- a/token.c +++ b/token.c @@ -199,6 +199,8 @@ static struct keyword_s { "strcpy", TK_STRCPY }, // [FDARI] { "region", TK_REGION }, // [mxd] { "endregion", TK_ENDREGION }, // [mxd] + { "kill", TK_KILL }, // [JM] + { "reopen", TK_REOPEN }, // [Nash] }; #define NUM_KEYWORDS (sizeof(Keywords)/sizeof(Keywords[0])) @@ -1573,5 +1575,5 @@ void TK_SkipLine(void) { char *sourcenow = tk_SourceName; int linenow = tk_Line; - do TK_NextToken(); while (tk_Line == linenow && tk_SourceName == sourcenow); + do TK_NextToken(); while (tk_Line == linenow && tk_SourceName == sourcenow && tk_Token != TK_EOF); } diff --git a/token.h b/token.h index 975983f..617e066 100644 --- a/token.h +++ b/token.h @@ -134,6 +134,8 @@ typedef enum TK_STRCPY, // 'strcpy' TK_REGION, // 'region' [mxd] TK_ENDREGION, // 'endregion' [mxd] + TK_KILL, // 'kill' [JM] + TK_REOPEN, // 'reopen' [Nash] } tokenType_t; // PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- diff --git a/zdefs.acs b/zdefs.acs index 72f55df..4cef9bf 100644 --- a/zdefs.acs +++ b/zdefs.acs @@ -291,6 +291,9 @@ #define APROP_StencilColor 41 #define APROP_Friction 42 #define APROP_DamageMultiplier 43 +#define APROP_MaxStepHeight 44 +#define APROP_MaxDropOffHeight 45 +#define APROP_DamageType 46 // Render Styles ------------------------------------------------------------ @@ -366,6 +369,8 @@ #define MRF_UNDOBYDEATH 0x00000200 #define MRF_UNDOBYDEATHFORCED 0x00000400 #define MRF_UNDOBYDEATHSAVES 0x00000800 +#define MRF_UNDOALWAYS 0x00001000 +#define MRF_TRANSFERTRANSLATION 0x00002000 // Shared spawnable things from Hexen. You can spawn these in the other ----- // games if you provide sprites for them, otherwise they'll be invisible. --- @@ -1086,3 +1091,17 @@ #define WARPF_USEPTR 0x2000 #define WARPF_COPYVELOCITY 0x4000 #define WARPF_COPYPITCH 0x8000 + +#define CPXF_ANCESTOR (1 << 0) +#define CPXF_LESSOREQUAL (1 << 1) +#define CPXF_NOZ (1 << 2) +#define CPXF_COUNTDEAD (1 << 3) +#define CPXF_DEADONLY (1 << 4) +#define CPXF_EXACT (1 << 5) +#define CPXF_SETTARGET (1 << 6) +#define CPXF_SETMASTER (1 << 7) +#define CPXF_SETTRACER (1 << 8) +#define CPXF_FARTHEST (1 << 9) +#define CPXF_CLOSEST (1 << 10) +#define CPXF_SETONPTR (1 << 11) +#define CPXF_CHECKSIGHT (1 << 12) diff --git a/zspecial.acs b/zspecial.acs index 0030ff5..854a4b6 100644 --- a/zspecial.acs +++ b/zspecial.acs @@ -24,12 +24,12 @@ special 17:Thing_Raise(1), 18:StartConversation(1,2), 19:Thing_Stop(1), - 20:Floor_LowerByValue(3), - 21:Floor_LowerToLowest(2), - 22:Floor_LowerToNearest(2), - 23:Floor_RaiseByValue(3), - 24:Floor_RaiseToHighest(2), - 25:Floor_RaiseToNearest(2), + 20:Floor_LowerByValue(3,4), + 21:Floor_LowerToLowest(2,3), + 22:Floor_LowerToNearest(2,3), + 23:Floor_RaiseByValue(3,5), + 24:Floor_RaiseToHighest(2,5), + 25:Floor_RaiseToNearest(2,4), 26:Stairs_BuildDown(5), 27:Stairs_BuildUp(5), 28:Floor_RaiseAndCrush(3,4), @@ -39,19 +39,19 @@ special 32:Stairs_BuildUpSync(4), 33:ForceField(0), 34:ClearForceField(1), - 35:Floor_RaiseByValueTimes8(3), - 36:Floor_LowerByValueTimes8(3), - 37:Floor_MoveToValue(3,4), + 35:Floor_RaiseByValueTimes8(3,5), + 36:Floor_LowerByValueTimes8(3,4), + 37:Floor_MoveToValue(3,5), 38:Ceiling_Waggle(5), 39:Teleport_ZombieChanger(2), - 40:Ceiling_LowerByValue(3), - 41:Ceiling_RaiseByValue(3), + 40:Ceiling_LowerByValue(3,4), + 41:Ceiling_RaiseByValue(3,4), 42:Ceiling_CrushAndRaise(3,4), 43:Ceiling_LowerAndCrush(3,4), - 44:Ceiling_CrushStop(1), + 44:Ceiling_CrushStop(1,2), 45:Ceiling_CrushRaiseAndStay(3,4), 46:Floor_CrushStop(1), - 47:Ceiling_MoveToValue(3,4), + 47:Ceiling_MoveToValue(3,5), // 48:Sector_Attach3dMidtex 49:GlassBreak(0,1), // 50:ExtraFloor_LightOnly @@ -65,15 +65,15 @@ special // 58: Sector_CopyScroller 59:Polyobj_OR_MoveToSpot(3), 60:Plat_PerpetualRaise(3), - 61:Plat_Stop(1), + 61:Plat_Stop(1,2), 62:Plat_DownWaitUpStay(3), 63:Plat_DownByValue(4), 64:Plat_UpWaitDownStay(3), 65:Plat_UpByValue(4), - 66:Floor_LowerInstant(3), - 67:Floor_RaiseInstant(3), - 68:Floor_MoveToValueTimes8(4), - 69:Ceiling_MoveToValueTimes8(4), + 66:Floor_LowerInstant(3,4), + 67:Floor_RaiseInstant(3,5), + 68:Floor_MoveToValueTimes8(4,5), + 69:Ceiling_MoveToValueTimes8(4,5), 70:Teleport(1,3), 71:Teleport_NoFog(1,4), 72:ThrustThing(2,4), @@ -109,6 +109,9 @@ special // 102:Scroll_Texture_Up // 103:Scroll_Texture_Down 104:Ceiling_CrushAndRaiseSilentDist(4,5), + 105:Door_WaitRaise(4,5), + 106:Door_WaitClose(3,4), + 107:Line_SetPortalTarget(2), 109:Light_ForceLightning(1), 110:Light_RaiseByValue(2), @@ -177,14 +180,14 @@ special 188:Sector_SetCeilingScale(5), 189:Sector_SetFloorScale(5), 191:SetPlayerProperty(3), - 192:Ceiling_LowerToHighestFloor(2), - 193:Ceiling_LowerInstant(3), - 194:Ceiling_RaiseInstant(3), + 192:Ceiling_LowerToHighestFloor(2,5), + 193:Ceiling_LowerInstant(3,5), + 194:Ceiling_RaiseInstant(3,4), 195:Ceiling_CrushRaiseAndStayA(4,5), 196:Ceiling_CrushAndRaiseA(4,5), 197:Ceiling_CrushAndRaiseSilentA(4,5), - 198:Ceiling_RaiseByValueTimes8(3), - 199:Ceiling_LowerByValueTimes8(3), + 198:Ceiling_RaiseByValueTimes8(3,4), + 199:Ceiling_LowerByValueTimes8(3,4), 200:Generic_Floor(5), 201:Generic_Ceiling(5), 202:Generic_Door(5), @@ -223,9 +226,9 @@ special 235:Floor_TransferTrigger(1), 236:Floor_TransferNumeric(1), 237:ChangeCamera(3), - 238:Floor_RaiseToLowestCeiling(2), + 238:Floor_RaiseToLowestCeiling(2,5), 239:Floor_RaiseByValueTxTy(3), - 240:Floor_RaiseByTexture(2), + 240:Floor_RaiseByTexture(2,4), 241:Floor_LowerToLowestTxTy(2), 242:Floor_LowerToHighest(3,4), 243:Exit_Normal(1), @@ -237,10 +240,31 @@ special 249:Door_CloseWaitOpen(3, 4), 250:Floor_Donut(3), 251:FloorAndCeiling_LowerRaise(3,4), - 252:Ceiling_RaiseToNearest(2), - 253:Ceiling_LowerToLowest(2), - 254:Ceiling_LowerToFloor(2), + 252:Ceiling_RaiseToNearest(2,3), + 253:Ceiling_LowerToLowest(2,4), + 254:Ceiling_LowerToFloor(2,5), 255:Ceiling_CrushRaiseAndStaySilA(4,5), + + // These are specialized versions of the Generic_* specials which are defined for EE Extradata. + 256:Floor_LowerToHighestEE(2, 3), + 257:Floor_RaiseToLowest(2, 3), + 258:Floor_LowerToLowestCeiling(2,3), + 259:Floor_RaiseToCeiling(2, 5), + 260:Floor_ToCeilingInstant(1, 4), + 261:Floor_LowerByTexture(2, 3), + 262:Ceiling_RaiseToHighest(2, 3), + 263:Ceiling_ToHighestInstant(1, 3), + 264:Ceiling_LowerToNearest(2, 4), + 265:Ceiling_RaiseToLowest(2, 3), + 266:Ceiling_RaiseToHighestFloor(2, 3), + 267:Ceiling_ToFloorInstant(1, 4), + 268:Ceiling_RaiseByTexture(2, 3), + 269:Ceiling_LowerByTexture(2, 4), + 270:Stairs_BuildDownDoom(5), + 271:Stairs_BuildUpDoomSync(4), + 272:Stairs_BuildDownDoomSync(4), + + // internal functions have negative values -1:GetLineUDMFInt(2), @@ -334,12 +358,15 @@ special -88:SetActorRoll(2), -89:ChangeActorRoll(2,3), -90:GetActorRoll(1), - -91:QuakeEx(8,12), + -91:QuakeEx(8,16), -92:Warp(6,11), -93:GetMaxInventory(2), -94:SetSectorDamage(2,5), -95:SetSectorTerrain(3), - -96:SpawnParticle(1,15), + -96:SpawnParticle(1,16), + -97:SetMusicVolume(1), + -98:CheckProximity(3, 6), + -99:CheckActorState(2,3), // Zandronum's -100:ResetMap(0), @@ -369,6 +396,11 @@ special -124:EndDBTransaction(0), -125:GetDBEntries(1), + // -1xx are reserved for Zandronum + -200:CheckClass(1), + -201:DamageActor(6), // [arookas] + -202:SetActorFlag(3), + // ZDaemon's -19620:GetTeamScore(1), -19621:SetTeamScore(2),