diff --git a/parse.c b/parse.c index e742130..1b62b2e 100644 --- a/parse.c +++ b/parse.c @@ -1635,7 +1635,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 +3527,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..d9169c6 100644 --- a/pcode.c +++ b/pcode.c @@ -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..0ecd1ed 100644 --- a/pcode.h +++ b/pcode.h @@ -444,6 +444,8 @@ typedef enum PCD_PRINTSCRIPTCHARARRAY, PCD_PRINTSCRIPTCHRANGE, PCD_STRCPYTOSCRIPTCHRANGE, + PCD_LSPEC5EX, + PCD_LSPEC5EXRESULT, PCODE_COMMAND_COUNT } pcd_t; diff --git a/zspecial.acs b/zspecial.acs index 0030ff5..180c50b 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), 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 @@ -70,10 +70,10 @@ special 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,8 @@ special // 102:Scroll_Texture_Up // 103:Scroll_Texture_Down 104:Ceiling_CrushAndRaiseSilentDist(4,5), + 105:Door_WaitRaise(4,5), + 106:Door_WaitClose(3,4), 109:Light_ForceLightning(1), 110:Light_RaiseByValue(2), @@ -177,14 +179,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,4), + 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 +225,9 @@ special 235:Floor_TransferTrigger(1), 236:Floor_TransferNumeric(1), 237:ChangeCamera(3), - 238:Floor_RaiseToLowestCeiling(2), + 238:Floor_RaiseToLowestCeiling(2,4), 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 +239,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,4), 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, 4), + 260:Floor_ToCeilingInstant(1, 3), + 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, 3), + 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),