diff --git a/src/actor.h b/src/actor.h index 739f08f4a..9fc1d10f1 100644 --- a/src/actor.h +++ b/src/actor.h @@ -807,11 +807,6 @@ public: return (flags & MF_COUNTKILL) && !(flags & MF_FRIENDLY); } - PalEntry GetBloodColor() const - { - return GetClass()->BloodColor; - } - // These also set CF_INTERPVIEW for players. void SetPitch(DAngle p, bool interpolate, bool forceclamp = false); void SetAngle(DAngle ang, bool interpolate); @@ -983,29 +978,42 @@ public: // NOTE: The first member variable *must* be snext. AActor *snext, **sprev; // links in sector (if needed) DVector3 __Pos; // double underscores so that it won't get used by accident. Access to this should be exclusively through the designated access functions. - DVector3 OldRenderPos; DAngle SpriteAngle; DAngle SpriteRotation; - DAngle VisibleStartAngle; - DAngle VisibleStartPitch; - DAngle VisibleEndAngle; - DAngle VisibleEndPitch; DRotator Angles; - DVector3 Vel; - double Speed; - double FloatSpeed; + DVector2 Scale; // Scaling values; 1 is normal size + double Alpha; // Since P_CheckSight makes an alpha check this can't be a float. It has to be a double. int sprite; // used to find patch_t and flip value uint8_t frame; // sprite frame to draw uint8_t effects; // [RH] see p_effect.h uint8_t fountaincolor; // Split out of 'effect' to have easier access. - DVector2 Scale; // Scaling values; 1 is normal size FRenderStyle RenderStyle; // Style to draw this actor with - ActorRenderFlags renderflags; // Different rendering flags FTextureID picnum; // Draw this instead of sprite if valid - double Alpha; // Since P_CheckSight makes an alpha check this can't be a float. It has to be a double. DWORD fillcolor; // Color to draw when STYLE_Shaded + DWORD Translation; + + ActorRenderFlags renderflags; // Different rendering flags + ActorFlags flags; + ActorFlags2 flags2; // Heretic flags + ActorFlags3 flags3; // [RH] Hexen/Heretic actor-dependant behavior made flaggable + ActorFlags4 flags4; // [RH] Even more flags! + ActorFlags5 flags5; // OMG! We need another one. + ActorFlags6 flags6; // Shit! Where did all the flags go? + ActorFlags7 flags7; // WHO WANTS TO BET ON 8!? + double Floorclip; // value to use for floor clipping + double radius, Height; // for movement checking + + DAngle VisibleStartAngle; + DAngle VisibleStartPitch; + DAngle VisibleEndAngle; + DAngle VisibleEndPitch; + + DVector3 OldRenderPos; + DVector3 Vel; + double Speed; + double FloatSpeed; // interaction info FBlockNode *BlockNode; // links in blocks (if needed) @@ -1019,7 +1027,6 @@ public: int floorterrain; struct sector_t *ceilingsector; FTextureID ceilingpic; // contacted sec ceilingpic - double radius, Height; // for movement checking double renderradius; double projectilepassheight; // height for clipping projectile movement against this actor @@ -1036,13 +1043,6 @@ public: int DamageVal; VMFunction *DamageFunc; int projectileKickback; - ActorFlags flags; - ActorFlags2 flags2; // Heretic flags - ActorFlags3 flags3; // [RH] Hexen/Heretic actor-dependant behavior made flaggable - ActorFlags4 flags4; // [RH] Even more flags! - ActorFlags5 flags5; // OMG! We need another one. - ActorFlags6 flags6; // Shit! Where did all the flags go? - ActorFlags7 flags7; // WHO WANTS TO BET ON 8!? // [BB] If 0, everybody can see the actor, if > 0, only members of team (VisibleToTeam-1) can see it. DWORD VisibleToTeam; @@ -1080,7 +1080,6 @@ public: TObjPtr alternative; // (Un)Morphed actors stored here. Those with the MF_UNMORPHED flag are the originals. TObjPtr tracer; // Thing being chased/attacked for tracers TObjPtr master; // Thing which spawned this one (prevents mutual attacks) - double Floorclip; // value to use for floor clipping int tid; // thing identifier int special; // special @@ -1143,7 +1142,8 @@ public: BYTE smokecounter; BYTE FloatBobPhase; BYTE FriendPlayer; // [RH] Player # + 1 this friendly monster works for (so 0 is no player, 1 is player 0, etc) - DWORD Translation; + PalEntry BloodColor; + DWORD BloodTranslation; // [RH] Stuff that used to be part of an Actor Info FSoundIDNoInit SeeSound; diff --git a/src/d_player.h b/src/d_player.h index 2787df231..379265cab 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -125,6 +125,8 @@ public: int crouchsprite; int MaxHealth; + int BonusHealth; + int MugShotMaxHealth; int RunHealth; int PlayerFlags; diff --git a/src/gl/scene/gl_sprite.cpp b/src/gl/scene/gl_sprite.cpp index 5e8bdb560..3a6abb319 100644 --- a/src/gl/scene/gl_sprite.cpp +++ b/src/gl/scene/gl_sprite.cpp @@ -665,7 +665,7 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal) bool isPicnumOverride = thing->picnum.isValid(); // Don't waste time projecting sprites that are definitely not visible. - if ((thing->sprite == 0 && !isPicnumOverride) || !thing->IsVisibleToPlayer() || !thing->IsInsideVisibleAngles()) + if ((thing->sprite == 0 && !isPicnumOverride) || !thing->IsVisibleToPlayer() || ((thing->renderflags & RF_MASKROTATION) && !thing->IsInsideVisibleAngles())) { return; } diff --git a/src/info.cpp b/src/info.cpp index d51cad115..fdda8633e 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -295,7 +295,6 @@ void PClassActor::DeriveData(PClass *newclass) PClassActor *newa = static_cast(newclass); newa->DefaultStateUsage = DefaultStateUsage; - newa->BloodColor = BloodColor; newa->distancecheck = distancecheck; newa->DropItems = DropItems; diff --git a/src/info.h b/src/info.h index d5e3eff48..6caa27325 100644 --- a/src/info.h +++ b/src/info.h @@ -290,8 +290,6 @@ public: TArray VisibleToPlayerClass; - PalEntry BloodColor; // Colorized blood - FDropItem *DropItems; FString SourceLumpName; FIntCVar *distancecheck; diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 5ea7dfa07..4e1b7a026 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -1330,7 +1330,7 @@ static int CheckInventory (AActor *activator, const char *type, bool max) if (max) { if (activator->IsKindOf (RUNTIME_CLASS (APlayerPawn))) - return static_cast(activator)->MaxHealth; + return static_cast(activator)->GetMaxHealth(); else return activator->SpawnHealth(); } @@ -3939,7 +3939,7 @@ int DLevelScript::GetActorProperty (int tid, int property) case APROP_Dormant: return !!(actor->flags2 & MF2_DORMANT); case APROP_SpawnHealth: if (actor->IsKindOf (RUNTIME_CLASS (APlayerPawn))) { - return static_cast(actor)->MaxHealth; + return static_cast(actor)->GetMaxHealth(); } else { diff --git a/src/p_actionfunctions.cpp b/src/p_actionfunctions.cpp index b75949f01..c32372b4e 100644 --- a/src/p_actionfunctions.cpp +++ b/src/p_actionfunctions.cpp @@ -2580,8 +2580,7 @@ static bool InitSpawnedItem(AActor *self, AActor *mo, int flags) else if (flags & SIXF_USEBLOODCOLOR) { // [XA] Use the spawning actor's BloodColor to translate the newly-spawned object. - PalEntry bloodcolor = self->GetBloodColor(); - mo->Translation = TRANSLATION(TRANSLATION_Blood, bloodcolor.a); + mo->Translation = self->BloodTranslation; } } if (flags & SIXF_TRANSFERPOINTERS) diff --git a/src/p_floor.cpp b/src/p_floor.cpp index 1bd0c53fc..8f7d935ee 100644 --- a/src/p_floor.cpp +++ b/src/p_floor.cpp @@ -640,6 +640,7 @@ bool EV_BuildStairs (int tag, DFloor::EStair type, line_t *line, floor->m_Delay = delay; floor->m_PauseTime = 0; floor->m_StepTime = floor->m_PerStepTime = persteptime; + floor->m_Instant = false; floor->m_Crush = (usespecials & DFloor::stairCrush) ? 10 : -1; //jff 2/27/98 fix uninitialized crush field floor->m_Hexencrush = false; @@ -755,6 +756,7 @@ bool EV_BuildStairs (int tag, DFloor::EStair type, line_t *line, //jff 2/27/98 fix uninitialized crush field floor->m_Crush = (!(usespecials & DFloor::stairUseSpecials) && speed == 4) ? 10 : -1; //jff 2/27/98 fix uninitialized crush field floor->m_Hexencrush = false; + floor->m_Instant = false; floor->m_ResetCount = reset; // [RH] Tics until reset (0 if never) floor->m_OrgDist = sec->floorplane.fD(); // [RH] Height to reset to } @@ -817,6 +819,7 @@ bool EV_DoDonut (int tag, line_t *line, double pillarspeed, double slimespeed) floor->m_Direction = 1; floor->m_Sector = s2; floor->m_Speed = slimespeed; + floor->m_Instant = false; floor->m_Texture = s3->GetTexture(sector_t::floor); floor->m_NewSpecial.Clear(); height = s3->FindHighestFloorPoint (&spot); @@ -831,6 +834,7 @@ bool EV_DoDonut (int tag, line_t *line, double pillarspeed, double slimespeed) floor->m_Direction = -1; floor->m_Sector = s1; floor->m_Speed = pillarspeed; + floor->m_Instant = false; height = s3->FindHighestFloorPoint (&spot); floor->m_FloorDestDist = s1->floorplane.PointToDist (spot, height); floor->StartFloorSound (); diff --git a/src/p_interaction.cpp b/src/p_interaction.cpp index b4cb5d16f..9629ccfe8 100644 --- a/src/p_interaction.cpp +++ b/src/p_interaction.cpp @@ -253,6 +253,7 @@ void ClientObituary (AActor *self, AActor *inflictor, AActor *attacker, int dmgf } } if (message == nullptr) message = messagename; // fallback to defaults if possible. + if (attacker == nullptr) attacker = self; // world if (attacker->player == nullptr) attacker = self; // for the message creation if (message != NULL && message[0] == '$') diff --git a/src/p_map.cpp b/src/p_map.cpp index 7e110dcbf..4d47b89c1 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -4803,7 +4803,7 @@ void P_TraceBleed(int damage, const DVector3 &pos, AActor *actor, DAngle angle, { if (bleedtrace.HitType == TRACE_HitWall) { - PalEntry bloodcolor = actor->GetBloodColor(); + PalEntry bloodcolor = actor->BloodColor; if (bloodcolor != 0) { bloodcolor.r >>= 1; // the full color is too bright for blood decals @@ -5994,7 +5994,6 @@ void P_DoCrunch(AActor *thing, FChangePosition *cpos) { if (!(thing->flags&MF_NOBLOOD)) { - PalEntry bloodcolor = thing->GetBloodColor(); PClassActor *bloodcls = thing->GetBloodType(); P_TraceBleed (newdam > 0 ? newdam : cpos->crushchange, thing); @@ -6006,9 +6005,9 @@ void P_DoCrunch(AActor *thing, FChangePosition *cpos) mo->Vel.X = pr_crunch.Random2() / 16.; mo->Vel.Y = pr_crunch.Random2() / 16.; - if (bloodcolor != 0 && !(mo->flags2 & MF2_DONTTRANSLATE)) + if (thing->BloodTranslation != 0 && !(mo->flags2 & MF2_DONTTRANSLATE)) { - mo->Translation = TRANSLATION(TRANSLATION_Blood, bloodcolor.a); + mo->Translation = thing->BloodTranslation; } if (!(cl_bloodtype <= 1)) mo->renderflags |= RF_INVISIBLE; @@ -6017,7 +6016,7 @@ void P_DoCrunch(AActor *thing, FChangePosition *cpos) DAngle an = (M_Random() - 128) * (360./256); if (cl_bloodtype >= 1) { - P_DrawSplash2(32, thing->PosPlusZ(thing->Height/2), an, 2, bloodcolor); + P_DrawSplash2(32, thing->PosPlusZ(thing->Height/2), an, 2, thing->BloodColor); } } if (thing->CrushPainSound != 0 && !S_GetSoundPlayingInfo(thing, thing->CrushPainSound)) diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index b4affd539..1e2559ec5 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -316,8 +316,8 @@ DEFINE_FIELD(AActor, RadiusDamageFactor) DEFINE_FIELD(AActor, SelfDamageFactor) DEFINE_FIELD(AActor, StealthAlpha) DEFINE_FIELD(AActor, WoundHealth) - -//DEFINE_FIELD(PClassActor, BloodColor) +DEFINE_FIELD(AActor, BloodColor) +DEFINE_FIELD(AActor, BloodTranslation) //========================================================================== // @@ -409,6 +409,8 @@ void AActor::Serialize(FSerializer &arc) A("inventoryid", InventoryID) A("floatbobphase", FloatBobPhase) A("translation", Translation) + A("bloodcolor", BloodColor) + A("bloodtranslation", BloodTranslation) A("seesound", SeeSound) A("attacksound", AttackSound) A("paimsound", PainSound) @@ -1338,7 +1340,7 @@ bool P_GiveBody(AActor *actor, int num, int max) { if (!(player->MorphStyle & MORPH_ADDSTAMINA)) { - max -= player->mo->stamina; + max -= player->mo->stamina + player->mo->BonusHealth; } } else // old health behaviour @@ -1346,7 +1348,7 @@ bool P_GiveBody(AActor *actor, int num, int max) max = MAXMORPHHEALTH; if (player->MorphStyle & MORPH_ADDSTAMINA) { - max += player->mo->stamina; + max += player->mo->stamina + player->mo->BonusHealth; } } } @@ -1665,8 +1667,7 @@ bool AActor::Grind(bool items) if (isgeneric) // Not a custom crush state, so colorize it appropriately. { S_Sound (this, CHAN_BODY, "misc/fallingsplat", 1, ATTN_IDLE); - PalEntry bloodcolor = GetBloodColor(); - if (bloodcolor!=0) Translation = TRANSLATION(TRANSLATION_Blood, bloodcolor.a); + Translation = BloodTranslation; } return false; } @@ -1707,10 +1708,7 @@ bool AActor::Grind(bool items) gib->Alpha = Alpha; gib->Height = 0; gib->radius = 0; - - PalEntry bloodcolor = GetBloodColor(); - if (bloodcolor != 0) - gib->Translation = TRANSLATION(TRANSLATION_Blood, bloodcolor.a); + gib->Translation = BloodTranslation; } S_Sound (this, CHAN_BODY, "misc/fallingsplat", 1, ATTN_IDLE); } @@ -3510,7 +3508,7 @@ int AActor::GetMissileDamage (int mask, int add) void AActor::Howl () { - FSoundID howl = IntVar(NAME_HowlSound); + FSoundID howl = SoundVar(NAME_HowlSound); if (!S_IsActorPlayingSomething(this, CHAN_BODY, howl)) { S_Sound (this, CHAN_BODY, howl, 1, ATTN_NORM); @@ -6051,7 +6049,6 @@ DEFINE_ACTION_FUNCTION(AActor, SpawnPuff) void P_SpawnBlood (const DVector3 &pos1, DAngle dir, int damage, AActor *originator) { AActor *th; - PalEntry bloodcolor = originator->GetBloodColor(); PClassActor *bloodcls = originator->GetBloodType(); DVector3 pos = pos1; pos.Z += pr_spawnblood.Random2() / 64.; @@ -6076,9 +6073,9 @@ void P_SpawnBlood (const DVector3 &pos1, DAngle dir, int damage, AActor *origina th->tics = 1; } // colorize the blood - if (bloodcolor != 0 && !(th->flags2 & MF2_DONTTRANSLATE)) + if (!(th->flags2 & MF2_DONTTRANSLATE)) { - th->Translation = TRANSLATION(TRANSLATION_Blood, bloodcolor.a); + th->Translation = originator->BloodTranslation; } // Moved out of the blood actor so that replacing blood is easier @@ -6135,7 +6132,7 @@ void P_SpawnBlood (const DVector3 &pos1, DAngle dir, int damage, AActor *origina } if (bloodtype >= 1) - P_DrawSplash2 (40, pos, dir, 2, bloodcolor); + P_DrawSplash2 (40, pos, dir, 2, originator->BloodColor); } DEFINE_ACTION_FUNCTION(AActor, SpawnBlood) @@ -6159,7 +6156,6 @@ DEFINE_ACTION_FUNCTION(AActor, SpawnBlood) void P_BloodSplatter (const DVector3 &pos, AActor *originator, DAngle hitangle) { - PalEntry bloodcolor = originator->GetBloodColor(); PClassActor *bloodcls = originator->GetBloodType(1); int bloodtype = cl_bloodtype; @@ -6178,16 +6174,16 @@ void P_BloodSplatter (const DVector3 &pos, AActor *originator, DAngle hitangle) mo->Vel.Z = 3; // colorize the blood! - if (bloodcolor!=0 && !(mo->flags2 & MF2_DONTTRANSLATE)) + if (!(mo->flags2 & MF2_DONTTRANSLATE)) { - mo->Translation = TRANSLATION(TRANSLATION_Blood, bloodcolor.a); + mo->Translation = originator->BloodTranslation; } if (!(bloodtype <= 1)) mo->renderflags |= RF_INVISIBLE; } if (bloodtype >= 1) { - P_DrawSplash2 (40, pos, hitangle-180., 2, bloodcolor); + P_DrawSplash2 (40, pos, hitangle-180., 2, originator->BloodColor); } } @@ -6199,7 +6195,6 @@ void P_BloodSplatter (const DVector3 &pos, AActor *originator, DAngle hitangle) void P_BloodSplatter2 (const DVector3 &pos, AActor *originator, DAngle hitangle) { - PalEntry bloodcolor = originator->GetBloodColor(); PClassActor *bloodcls = originator->GetBloodType(2); int bloodtype = cl_bloodtype; @@ -6220,16 +6215,16 @@ void P_BloodSplatter2 (const DVector3 &pos, AActor *originator, DAngle hitangle) mo->target = originator; // colorize the blood! - if (bloodcolor != 0 && !(mo->flags2 & MF2_DONTTRANSLATE)) + if (!(mo->flags2 & MF2_DONTTRANSLATE)) { - mo->Translation = TRANSLATION(TRANSLATION_Blood, bloodcolor.a); + mo->Translation = originator->BloodTranslation; } if (!(bloodtype <= 1)) mo->renderflags |= RF_INVISIBLE; } if (bloodtype >= 1) { - P_DrawSplash2(40, pos + add, hitangle - 180., 2, bloodcolor); + P_DrawSplash2(40, pos + add, hitangle - 180., 2, originator->BloodColor); } } @@ -6255,7 +6250,6 @@ DEFINE_ACTION_FUNCTION(AActor, BloodSplatter) void P_RipperBlood (AActor *mo, AActor *bleeder) { - PalEntry bloodcolor = bleeder->GetBloodColor(); PClassActor *bloodcls = bleeder->GetBloodType(); double xo = pr_ripperblood.Random2() / 16.; @@ -6281,16 +6275,16 @@ void P_RipperBlood (AActor *mo, AActor *bleeder) th->tics += pr_ripperblood () & 3; // colorize the blood! - if (bloodcolor!=0 && !(th->flags2 & MF2_DONTTRANSLATE)) + if (!(th->flags2 & MF2_DONTTRANSLATE)) { - th->Translation = TRANSLATION(TRANSLATION_Blood, bloodcolor.a); + th->Translation = bleeder->BloodTranslation; } if (!(bloodtype <= 1)) th->renderflags |= RF_INVISIBLE; } if (bloodtype >= 1) { - P_DrawSplash2(28, pos, bleeder->AngleTo(mo) + 180., 0, bloodcolor); + P_DrawSplash2(28, pos, bleeder->AngleTo(mo) + 180., 0, bleeder->BloodColor); } } diff --git a/src/p_user.cpp b/src/p_user.cpp index 528ab482d..6fba4a5a9 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -781,6 +781,7 @@ void APlayerPawn::Serialize(FSerializer &arc) arc("jumpz", JumpZ, def->JumpZ) ("maxhealth", MaxHealth, def->MaxHealth) + ("bonushealth", BonusHealth, def->BonusHealth) ("runhealth", RunHealth, def->RunHealth) ("spawnmask", SpawnMask, def->SpawnMask) ("forwardmove1", ForwardMove1, def->ForwardMove1) @@ -1353,7 +1354,7 @@ const char *APlayerPawn::GetSoundClass() const int APlayerPawn::GetMaxHealth(bool withupgrades) const { int ret = MaxHealth > 0? MaxHealth : ((i_compatflags&COMPATF_DEHHEALTH)? 100 : deh.MaxHealth); - if (withupgrades) ret += stamina; + if (withupgrades) ret += stamina + BonusHealth; return ret; } @@ -3346,6 +3347,7 @@ bool P_IsPlayerTotallyFrozen(const player_t *player) DEFINE_FIELD(APlayerPawn, crouchsprite) DEFINE_FIELD(APlayerPawn, MaxHealth) +DEFINE_FIELD(APlayerPawn, BonusHealth) DEFINE_FIELD(APlayerPawn, MugShotMaxHealth) DEFINE_FIELD(APlayerPawn, RunHealth) DEFINE_FIELD(APlayerPawn, PlayerFlags) diff --git a/src/resourcefiles/file_zip.cpp b/src/resourcefiles/file_zip.cpp index bd2990dec..7b83084ab 100644 --- a/src/resourcefiles/file_zip.cpp +++ b/src/resourcefiles/file_zip.cpp @@ -218,8 +218,11 @@ bool FZipFile::Open(bool quiet) char *dirptr = (char*)directory; FZipLump *lump_p = Lumps; - // Check if all files have the same prefix so that this can be stripped out. FString name0; + bool foundspeciallump = false; + + // Check if all files have the same prefix so that this can be stripped out. + // This will only be done if there is either a MAPINFO, ZMAPINFO or GAMEINFO lump in the subdirectory, denoting a ZDoom mod. if (NumLumps > 1) for (DWORD i = 0; i < NumLumps; i++) { FZipCentralDirectoryInfo *zip_fh = (FZipCentralDirectoryInfo *)dirptr; @@ -251,6 +254,7 @@ bool FZipFile::Open(bool quiet) !name.Compare("voxels/") || !name.Compare("colormaps/") || !name.Compare("acs/") || + !name.Compare("maps/") || !name.Compare("voices/") || !name.Compare("patches/") || !name.Compare("graphics/") || @@ -266,6 +270,23 @@ bool FZipFile::Open(bool quiet) name0 = ""; break; } + else if (!foundspeciallump) + { + // at least one of the more common definition lumps must be present. + if (name.IndexOf(name0 + "mapinfo") == 0) foundspeciallump = true; + else if (name.IndexOf(name0 + "zmapinfo") == 0) foundspeciallump = true; + else if (name.IndexOf(name0 + "gameinfo") == 0) foundspeciallump = true; + else if (name.IndexOf(name0 + "sndinfo") == 0) foundspeciallump = true; + else if (name.IndexOf(name0 + "sbarinfo") == 0) foundspeciallump = true; + else if (name.IndexOf(name0 + "menudef") == 0) foundspeciallump = true; + else if (name.IndexOf(name0 + "gldefs") == 0) foundspeciallump = true; + else if (name.IndexOf(name0 + "animdefs") == 0) foundspeciallump = true; + else if (name.IndexOf(name0 + "decorate.") == 0) foundspeciallump = true; // DECORATE is a common subdirectory name, so the check needs to be a bit different. + else if (name.Compare(name0 + "decorate") == 0) foundspeciallump = true; + else if (name.IndexOf(name0 + "zscript.") == 0) foundspeciallump = true; // same here. + else if (name.Compare(name0 + "zscript") == 0) foundspeciallump = true; + else if (name.Compare(name0 + "maps/") == 0) foundspeciallump = true; + } } } diff --git a/src/scripting/backend/vmbuilder.cpp b/src/scripting/backend/vmbuilder.cpp index 74f845248..3be1000c5 100644 --- a/src/scripting/backend/vmbuilder.cpp +++ b/src/scripting/backend/vmbuilder.cpp @@ -846,6 +846,7 @@ void FFunctionBuildList::Build() { int errorcount = 0; int codesize = 0; + int datasize = 0; FILE *dump = nullptr; if (Args->CheckParm("-dumpdisasm")) dump = fopen("disasm.txt", "w"); @@ -927,6 +928,8 @@ void FFunctionBuildList::Build() { DumpFunction(dump, sfunc, item.PrintableName.GetChars(), (int)item.PrintableName.Len()); codesize += sfunc->CodeSize; + datasize += sfunc->LineInfoCount * sizeof(FStatementInfo) + sfunc->ExtraSpace + sfunc->NumKonstD * sizeof(int) + + sfunc->NumKonstA * sizeof(void*) + sfunc->NumKonstF * sizeof(double) + sfunc->NumKonstS * sizeof(FString); } sfunc->Unsafe = ctx.Unsafe; } @@ -944,10 +947,11 @@ void FFunctionBuildList::Build() } if (dump != nullptr) { - fprintf(dump, "\n*************************************************************************\n%i code bytes\n", codesize * 4); + fprintf(dump, "\n*************************************************************************\n%i code bytes\n%i data bytes", codesize * 4, datasize); fclose(dump); } FScriptPosition::StrictErrors = false; mItems.Clear(); + mItems.ShrinkToFit(); FxAlloc.FreeAllBlocks(); } \ No newline at end of file diff --git a/src/scripting/thingdef_properties.cpp b/src/scripting/thingdef_properties.cpp index af79e1d04..6212f0ff1 100644 --- a/src/scripting/thingdef_properties.cpp +++ b/src/scripting/thingdef_properties.cpp @@ -1053,10 +1053,9 @@ DEFINE_PROPERTY(bloodcolor, C, Actor) { PROP_COLOR_PARM(color, 0); - PalEntry pe = color; - pe.a = CreateBloodTranslation(pe); - assert(info->IsKindOf(RUNTIME_CLASS(PClassActor))); - static_cast(info)->BloodColor = pe; + defaults->BloodColor = color; + defaults->BloodColor.a = 255; // a should not be 0. + defaults->BloodTranslation = TRANSLATION(TRANSLATION_Blood, CreateBloodTranslation(color)); } //========================================================================== diff --git a/wadsrc/static/zscript/actor.txt b/wadsrc/static/zscript/actor.txt index d456b12d3..ea17fecde 100644 --- a/wadsrc/static/zscript/actor.txt +++ b/wadsrc/static/zscript/actor.txt @@ -194,7 +194,8 @@ class Actor : Thinker native native double SelfDamageFactor; native double StealthAlpha; native int WoundHealth; // Health needed to enter wound state - //native color BloodColor; // won't be accessible for now because it needs refactoring to remove the 255-translations limit. + native readonly color BloodColor; + native readonly int BloodTranslation; meta String Obituary; // Player was killed by this actor meta String HitObituary; // Player was killed by this actor in melee diff --git a/wadsrc/static/zscript/constants.txt b/wadsrc/static/zscript/constants.txt index d0daae8ef..95863452c 100644 --- a/wadsrc/static/zscript/constants.txt +++ b/wadsrc/static/zscript/constants.txt @@ -1009,6 +1009,13 @@ enum ERaise RF_NOCHECKPOSITION = 2 } +enum eFogParm +{ + FOGP_DENSITY = 0, + FOGP_OUTSIDEDENSITY = 1, + FOGP_SKYFOG = 2, +} + enum ETeleport { TELF_DESTFOG = 1, diff --git a/wadsrc/static/zscript/inventory/health.txt b/wadsrc/static/zscript/inventory/health.txt index e64bbfd4a..e69d85814 100644 --- a/wadsrc/static/zscript/inventory/health.txt +++ b/wadsrc/static/zscript/inventory/health.txt @@ -86,8 +86,36 @@ class Health : Inventory } return false; } +} - +class MaxHealth : Health +{ + //=========================================================================== + // + // TryPickup + // + //=========================================================================== + + override bool TryPickup (in out Actor other) + { + bool success = false; + int savedAmount = MaxAmount; + let player = PlayerPawn(other); + MaxAmount = Health; + if (player) + { + if (player.BonusHealth < savedAmount) + { + player.BonusHealth = min(player.BonusHealth + Amount, savedAmount); + success = true; + } + MaxAmount += player.BonusHealth; + } + success |= Super.TryPickup(other); + MaxAmount = savedAmount; + if (success) GoAwayAndDie(); + return success; + } } class HealthPickup : Inventory diff --git a/wadsrc/static/zscript/shared/player.txt b/wadsrc/static/zscript/shared/player.txt index 98cede7a5..e8e022ef3 100644 --- a/wadsrc/static/zscript/shared/player.txt +++ b/wadsrc/static/zscript/shared/player.txt @@ -3,6 +3,7 @@ class PlayerPawn : Actor native native int crouchsprite; native int MaxHealth; + native int BonusHealth; native int MugShotMaxHealth; native int RunHealth; native int PlayerFlags; diff --git a/wadsrc/static/zscript/strife/programmer.txt b/wadsrc/static/zscript/strife/programmer.txt index 3fa34b659..90cdd5399 100644 --- a/wadsrc/static/zscript/strife/programmer.txt +++ b/wadsrc/static/zscript/strife/programmer.txt @@ -95,7 +95,7 @@ class Programmer : Actor A_PlaySound("programmer/clank", CHAN_WEAPON); int damage = ((random[Programmer]() % 10) + 1) * 6; - int newdam = DamageMobj (self, self, damage, 'Melee'); + int newdam = target.DamageMobj (self, self, damage, 'Melee'); target.TraceBleed (newdam > 0 ? newdam : damage, self); }