diff --git a/docs/rh-log.txt b/docs/rh-log.txt index 2c9c5355df..fddffdb2f9 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,3 +1,13 @@ +August 31, 2006 +- Removed the r: ACS print cast. You can do it yourself with s: and an array. +- Changed all the bool arguments to the ACS ReplaceTextures and SectorDamage + commands with a single flags argument. SectorDamage also gained extended + functionality: you can now make it hurt only players, only non-players, or + both. Previously, hurting only non-players was not possible. +- Added the HUDMSG_COLORSTRING flag for ACS hudmessages. If you OR it in with + the message type, the color will be treated as a string naming the color + you want to use, so now you can use custom colors with hudmessages. + August 30, 2006 - Added the FNameNoInit class that is exactly like FName except it does not initialize its index, so it can be used from inside Actors without diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 3ec53c1dd9..021c58947b 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -73,9 +73,24 @@ FRandom pr_acs ("ACS"); // potentially get used with recursive functions. #define STACK_SIZE 4096 -#define CLAMPCOLOR(c) (EColorRange)((unsigned)(c) >= NUM_TEXT_COLORS ? CR_UNTRANSLATED : (c)) -#define HUDMSG_LOG (0x80000000) -#define LANGREGIONMASK MAKE_ID(0,0,0xff,0xff) +#define CLAMPCOLOR(c) (EColorRange)((unsigned)(c) >= NUM_TEXT_COLORS ? CR_UNTRANSLATED : (c)) +#define HUDMSG_LOG (0x80000000) +#define HUDMSG_COLORSTRING (0x40000000) +#define LANGREGIONMASK MAKE_ID(0,0,0xff,0xff) + +// Flags for ReplaceTextures +#define NOT_BOTTOM 1 +#define NOT_MIDDLE 2 +#define NOT_TOP 4 +#define NOT_FLOOR 8 +#define NOT_CEILING 16 + +// Flags for SectorDamage + +#define DAMAGE_PLAYERS 1 +#define DAMAGE_NONPLAYERS 2 +#define DAMAGE_IN_AIR 4 +#define DAMAGE_SUBCLASSES_PROTECT 8 struct CallReturn { @@ -1845,7 +1860,7 @@ void DLevelScript::SetLineTexture (int lineid, int side, int position, int name) } } -void DLevelScript::ReplaceTextures (int fromnamei, int tonamei, BOOL not_lower, BOOL not_mid, BOOL not_upper, BOOL not_floor, BOOL not_ceil) +void DLevelScript::ReplaceTextures (int fromnamei, int tonamei, int flags) { const char *fromname = FBehavior::StaticLookupString (fromnamei); const char *toname = FBehavior::StaticLookupString (tonamei); @@ -1854,7 +1869,7 @@ void DLevelScript::ReplaceTextures (int fromnamei, int tonamei, BOOL not_lower, if (fromname == NULL) return; - if (!(not_lower | not_mid | not_upper)) + if ((flags ^ (NOT_BOTTOM | NOT_MIDDLE | NOT_TOP)) != 0) { picnum1 = TexMan.GetTexture (fromname, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable); picnum2 = TexMan.GetTexture (toname, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable); @@ -1863,12 +1878,12 @@ void DLevelScript::ReplaceTextures (int fromnamei, int tonamei, BOOL not_lower, { side_t *wal = &sides[i]; - if (!not_lower && wal->bottomtexture == picnum1) wal->bottomtexture = picnum2; - if (!not_mid && wal->midtexture == picnum1) wal->midtexture = picnum2; - if (!not_upper && wal->toptexture == picnum1) wal->toptexture = picnum2; + if (!(flags & NOT_BOTTOM) && wal->bottomtexture == picnum1) wal->bottomtexture = picnum2; + if (!(flags & NOT_MIDDLE) && wal->midtexture == picnum1) wal->midtexture = picnum2; + if (!(flags & NOT_TOP) && wal->toptexture == picnum1) wal->toptexture = picnum2; } } - if (!(not_floor | not_ceil)) + if ((flags ^ (NOT_FLOOR | NOT_CEILING)) != 0) { picnum1 = TexMan.GetTexture (fromname, FTexture::TEX_Flat, FTextureManager::TEXMAN_Overridable); picnum2 = TexMan.GetTexture (toname, FTexture::TEX_Flat, FTextureManager::TEXMAN_Overridable); @@ -1877,8 +1892,8 @@ void DLevelScript::ReplaceTextures (int fromnamei, int tonamei, BOOL not_lower, { sector_t *sec = §ors[i]; - if (!not_floor && sec->floorpic == picnum1) sec->floorpic = picnum2; - if (!not_ceil && sec->ceilingpic == picnum1) sec->ceilingpic = picnum2; + if (!(flags & NOT_FLOOR) && sec->floorpic == picnum1) sec->floorpic = picnum2; + if (!(flags & NOT_CEILING) && sec->ceilingpic == picnum1) sec->ceilingpic = picnum2; } } } @@ -3701,12 +3716,6 @@ int DLevelScript::RunScript () } break; - case PCD_PRINTCOLOR: - work += TEXTCOLOR_ESCAPE; - work += 'A' + char(CLAMPCOLOR(STACK(1))); - sp--; - break; - // [JB] Print map character array case PCD_PRINTMAPCHARARRAY: { @@ -3808,13 +3817,22 @@ int DLevelScript::RunScript () { int type = Stack[optstart-6]; int id = Stack[optstart-5]; - EColorRange color = CLAMPCOLOR(Stack[optstart-4]); + EColorRange color; float x = FIXED2FLOAT(Stack[optstart-3]); float y = FIXED2FLOAT(Stack[optstart-2]); float holdTime = FIXED2FLOAT(Stack[optstart-1]); DHUDMessage *msg; - switch (type & ~HUDMSG_LOG) + if (type & HUDMSG_COLORSTRING) + { + color = V_FindFontColor(FBehavior::StaticLookupString(Stack[optstart-4])); + } + else + { + color = CLAMPCOLOR(Stack[optstart-4]); + } + + switch (type & 0xFFFF) { default: // normal msg = new DHUDMessage (work, x, y, hudwidth, hudheight, color, holdTime); @@ -4018,8 +4036,8 @@ int DLevelScript::RunScript () break; case PCD_REPLACETEXTURES: - ReplaceTextures (STACK(7), STACK(6), STACK(5), STACK(4), STACK(3), STACK(2), STACK(1)); - sp -= 7; + ReplaceTextures (STACK(3), STACK(2), STACK(1)); + sp -= 3; break; case PCD_SETLINEBLOCKING: @@ -4951,15 +4969,13 @@ int DLevelScript::RunScript () case PCD_SECTORDAMAGE: { - int tag = STACK(7); - int amount = STACK(6); - FName type = FBehavior::StaticLookupString(STACK(5)); - BOOL playersOnly = STACK(4); - BOOL inAirToo = STACK(3); + int tag = STACK(5); + int amount = STACK(4); + FName type = FBehavior::StaticLookupString(STACK(3)); FName protection = FName (FBehavior::StaticLookupString(STACK(2)), true); const PClass *protectClass = PClass::FindClass (protection); - BOOL subclassesOkay = STACK(1); - sp -= 7; + int flags = STACK(1); + sp -= 5; // Oh, give me custom damage types! :-) int modtype; @@ -4986,15 +5002,18 @@ int DLevelScript::RunScript () if (!(actor->flags & MF_SHOOTABLE)) continue; - if (playersOnly && actor->player == NULL) + if (!(flags & DAMAGE_NONPLAYERS) && actor->player == NULL) continue; - if (!inAirToo && actor->z != sec->floorplane.ZatPoint (actor->x, actor->y) && !actor->waterlevel) + if (!(flags & DAMAGE_PLAYERS) && actor->player != NULL) + continue; + + if (!(flags & DAMAGE_IN_AIR) && actor->z != sec->floorplane.ZatPoint (actor->x, actor->y) && !actor->waterlevel) continue; if (protectClass != NULL) { - if (!subclassesOkay) + if (!(flags & DAMAGE_SUBCLASSES_PROTECT)) { if (actor->FindInventory (protectClass)) continue; diff --git a/src/p_acs.h b/src/p_acs.h index ea2b55e056..45ab7b18fc 100644 --- a/src/p_acs.h +++ b/src/p_acs.h @@ -535,7 +535,7 @@ public: PCD_CHANGELEVEL, PCD_SECTORDAMAGE, PCD_REPLACETEXTURES, -/*330*/ PCD_PRINTCOLOR, +/*330*/ PCODE_COMMAND_COUNT }; @@ -659,7 +659,7 @@ protected: static void ChangeFlat (int tag, int name, bool floorOrCeiling); static int CountPlayers (); static void SetLineTexture (int lineid, int side, int position, int name); - static void ReplaceTextures (int fromname, int toname, BOOL notUpper, BOOL notMid, BOOL notLower, BOOL notFloor, BOOL notCeil); + static void ReplaceTextures (int fromname, int toname, int flags); static int DoSpawn (int type, fixed_t x, fixed_t y, fixed_t z, int tid, int angle); static int DoSpawnSpot (int type, int spot, int tid, int angle); static int DoSpawnSpotFacing (int type, int spot, int tid);