Back to the Vavoom Forum Archives
Firebrand
Index: basev/common/actors/strife/acolyte.txt =================================================================== --- basev/common/actors/strife/acolyte.txt (revision 4123) +++ basev/common/actors/strife/acolyte.txt (working copy) @@ -10,6 +10,7 @@ PainChance 150 MinMissileChance 150 Monster + +NeverRespawn +SeesDaggers +NoSplashAlert +FloorClip @@ -18,6 +19,7 @@ AttackSound "acolyte/rifle" PainSound "acolyte/pain" DeathSound "acolyte/death" + CrushPainSound "misc/pcrush" Obituary "$ob_acolyte" action native A_AcolyteBits(); @@ -182,7 +184,8 @@ Height 56 PainChance 256 -CountKill - -IsMonster +// -IsMonster + -NeverRespawn DeathSound "becoming/death" action native A_HideDecepticon(); Index: basev/common/actors/strife/alienspectres.txt =================================================================== --- basev/common/actors/strife/alienspectres.txt (revision 4123) +++ basev/common/actors/strife/alienspectres.txt (working copy) @@ -13,6 +13,7 @@ MinMissileChance 150 RenderStyle Translucent Alpha 0.666 + +NeverRespawn +Shadow +NoGravity +LookAllAround @@ -105,6 +106,7 @@ Radius 24 PainChance 50 +SpawnCeiling + +LowSpectralResist DropItem "Sigil3" action native A_Spectre3Attack(); Index: basev/common/actors/strife/loremaster.txt =================================================================== --- basev/common/actors/strife/loremaster.txt (revision 4123) +++ basev/common/actors/strife/loremaster.txt (working copy) @@ -11,6 +11,7 @@ FloatSpeed 5 MinMissileChance 150 Monster + +NeverRespawn +FloorClip +NoGravity +LookAllAround Index: basev/common/actors/strife/merchants.txt =================================================================== --- basev/common/actors/strife/merchants.txt (revision 4123) +++ basev/common/actors/strife/merchants.txt (working copy) @@ -10,6 +10,7 @@ +Shootable +NotDMatch +NoDamage + CrushPainSound "misc/pcrush" states { Spawn: Index: basev/common/actors/strife/peasants.txt =================================================================== --- basev/common/actors/strife/peasants.txt (revision 4123) +++ basev/common/actors/strife/peasants.txt (working copy) @@ -11,8 +11,10 @@ AttackSound "peasant/attack" PainSound "peasant/pain" DeathSound "peasant/death" + CrushPainSound "misc/pcrush" Obituary "$ob_peasant" Monster + +NeverRespawn -CountKill +Friendly states Index: basev/common/actors/strife/ratbuddy.txt =================================================================== --- basev/common/actors/strife/ratbuddy.txt (revision 4123) +++ basev/common/actors/strife/ratbuddy.txt (working copy) @@ -13,6 +13,7 @@ SeeSound "rat/sight" ActiveSound "rat/active" DeathSound "rat/death" + CrushPainSound "misc/pcrush" +IsMonster +FloorClip +CanPass Index: basev/common/actors/strife/rebels.txt =================================================================== --- basev/common/actors/strife/rebels.txt (revision 4123) +++ basev/common/actors/strife/rebels.txt (working copy) @@ -12,10 +12,12 @@ -CountKill +FloorClip +Friendly + +NeverRespawn SeeSound "rebel/sight" ActiveSound "rebel/active" PainSound "rebel/pain" DeathSound "rebel/death" + CrushPainSound "misc/pcrush" Obituary "$ob_rebel" states { @@ -68,6 +70,7 @@ game Strife ConversationID 43, 42, 43 DropItem "ClipOfBullets" + -NeverRespawn } //------------------------------------------------------------------------------ Index: basev/common/actors/strife/sentinel.txt =================================================================== --- basev/common/actors/strife/sentinel.txt (revision 4123) +++ basev/common/actors/strife/sentinel.txt (working copy) @@ -12,6 +12,7 @@ PainChance 255 MinMissileChance 150 Monster + +NeverRespawn +SpawnCeiling +NoGravity +DropOff Index: basev/common/actors/strife/spectral.txt =================================================================== --- basev/common/actors/strife/spectral.txt (revision 4123) +++ basev/common/actors/strife/spectral.txt (working copy) @@ -60,6 +60,7 @@ Speed 22 Damage 100 Projectile + DamageType "SpectralLow" +Spectral states { @@ -85,6 +86,7 @@ ReactionTime 70 RenderStyle Translucent Alpha 0.6 + DamageType "SpectralLow" +NoBlockmap +NoBlockMonst +NoDropOff @@ -110,6 +112,7 @@ Speed 30 Damage 70 Projectile + DamageType "SpectralLow" +Spectral action native A_SpectralLightningTail(); @@ -161,6 +164,7 @@ Speed 30 Damage 70 Projectile + DamageType "SpectralLow" +Spectral states { Index: basev/common/actors/strife/strifebishop.txt =================================================================== --- basev/common/actors/strife/strifebishop.txt (revision 4123) +++ basev/common/actors/strife/strifebishop.txt (working copy) @@ -18,6 +18,7 @@ Obituary "$ob_stfbishop" DropItem "CrateOfMissiles", 256, 20 Monster + +NeverRespawn +FloorClip +InCombat +NoBlood Index: basev/common/actors/strife/strifehumanoid.txt =================================================================== --- basev/common/actors/strife/strifehumanoid.txt (revision 4123) +++ basev/common/actors/strife/strifehumanoid.txt (working copy) @@ -3,6 +3,7 @@ { MaxDropoffHeight 32 MaxStepHeight 16 + CrushPainSound "misc/pcrush" states { Burn: Index: basev/common/actors/strife/strifeplayer.txt =================================================================== --- basev/common/actors/strife/strifeplayer.txt (revision 4123) +++ basev/common/actors/strife/strifeplayer.txt (working copy) @@ -13,6 +13,7 @@ Player.ColorRange 128, 143 Player.DisplayName "Rebel" Player.StartItem "PunchDagger" + CrushPainSound "misc/pcrush" states { Spawn: Index: basev/common/actors/strife/templar.txt =================================================================== --- basev/common/actors/strife/templar.txt (revision 4123) +++ basev/common/actors/strife/templar.txt (working copy) @@ -19,6 +19,7 @@ ActiveSound "templar/active" PainSound "templar/pain" DeathSound "templar/death" + CrushPainSound "misc/pcrush" Obituary "$ob_templar" HitObituary "$ob_templarhit" Index: basev/common/actors/strife/zombie.txt =================================================================== --- basev/common/actors/strife/zombie.txt (revision 4123) +++ basev/common/actors/strife/zombie.txt (working copy) @@ -8,6 +8,7 @@ Height 56 Translation 0 DeathSound "zombie/death" + CrushPainSound "misc/pcrush" +Solid +Shootable +ActivateMCross Index: basev/common/vavoom_decorate_defs.xml =================================================================== --- basev/common/vavoom_decorate_defs.xml (revision 4123) +++ basev/common/vavoom_decorate_defs.xml (working copy) @@ -20,6 +20,7 @@ <prop_vspeed name="VSpeed" /> <prop_speed name="FastSpeed" property="FastSpeed" /> <prop_speed name="FloatSpeed" property="FloatSpeed" /> + <prop_speed name="JumpVelZ" property="JumpVelZ" /> <!-- Collision and physics --> <prop_float name="Radius" property="Radius" /> <prop_float name="Height" property="Height" /> @@ -36,6 +37,7 @@ <prop_name name="SeeSound" property="SightSound" /> <prop_name name="AttackSound" property="AttackSound" /> <prop_name name="PainSound" property="PainSound" /> + <prop_name name="CrushPainSound" property="CrushPainSound" /> <prop_name name="DeathSound" property="DeathSound" /> <prop_name name="ActiveSound" property="ActiveSound" /> <prop_name name="HowlSound" property="HowlSound" /> @@ -147,6 +149,7 @@ <flag name="ShieldReflect" property="bShieldReflect" /> <flag name="Deflect" property="bDeflect" /> <flag name="FireResist" property="bFireResist" /> + <flag name="LowSpectralResist" property="bLowSpectralResist" /> <flag name="NoRadiusDmg" property="bNoRadiusDamage" /> <flag name="DontBlast" property="bDontBlast" /> <flag name="NoTarget" property="bNeverTarget" /> @@ -207,6 +210,7 @@ <flag name="DehExplosion" property="bDehExplosion" /> <flag_name name="FireDamage" property="DamageType" true_value="Fire" false_value="None" /> <flag_name name="IceDamage" property="DamageType" true_value="Ice" false_value="None" /> + <flag_name name="SpectralLow" property="DamageType" true_value="SpectralLow" false_value="None" /> <!-- Miscellaneous --> <flag name="Dropped" property="bDropped" /> <flag name="IsMonster" property="bMonster" /> @@ -226,6 +230,7 @@ <flag name="FastMelee" property="bFastMelee" /> <flag name="BossDeath" property="bBossDeath" /> <flag name="UseSpecial" property="bUseSpecial" /> + <flag name="Touchy" property="bTouchy" /> <flag_unsupported name="OldRadiusDmg" /> <flag_unsupported name="ClientSideOnly" /> <flag_unsupported name="NoInteraction" /> @@ -239,6 +244,7 @@ <flag name="JustAttacked" property="bJustAttacked" /> <flag name="Teleport" property="bTeleport" /> <flag name="SeesDaggers" property="bSeesDaggers" /> + <flag name="NeverRespawn" property="bNeverRespawn" /> <flag_noclip name="NoClip" /> <flag_unsupported name="ForceYBillboard" /> <flag_unsupported name="ForceXYBillboard" /> @@ -254,6 +260,8 @@ <!-- Vavoom specific --> <flag name="FallingFriction" property="bFallingFriction" /> <flag name="CantAutoAim" property="bCantAutoAim" /> + <flag name="CanJump" property="bCanJump" /> + <flag name="JumpDown" property="bJumpDown" /> </class> <class name="Inventory"> Index: basev/strife/mapinfo.txt =================================================================== --- basev/strife/mapinfo.txt (revision 4123) +++ basev/strife/mapinfo.txt (working copy) @@ -35,7 +35,7 @@ skill nightmare AmmoFactor 2 FastMonsters -DisableCheats +//DisableCheats RespawnTime 16 SpawnFilter Nightmare PicName "m_nmare" Index: basev/strife/sndinfo.txt =================================================================== --- basev/strife/sndinfo.txt (revision 4123) +++ basev/strife/sndinfo.txt (working copy) @@ -248,19 +248,19 @@ entity/sight dsmnalse entity/active dsalnact entity/melee dsrevbld -entity/pain dsalnpn +entity/pain dsalnpn entity/death dsmnaldt // Kneeling guy -misc/chant dschant -misc/static dsstatic +misc/chant dschant +misc/static dsstatic // Rat -rat/sight dsratact -rat/active dsratact -rat/death dsratact +rat/sight dsratact +rat/active dsratact +rat/death dsratact $singular rat/sight //========================================================================== @@ -271,12 +271,12 @@ // Alarm -misc/alarm dsalarm +misc/alarm dsalarm $singular misc/alarm // Water -world/river dswriver +world/river dswriver world/waterfall dswfall world/waterdrip dswdrip world/watersplash dswsplsh @@ -303,7 +303,7 @@ world/smallfire dssmfire world/largefire dslgfire woodenbarrel/death dswbrldt -ore/explode dsexplod +ore/explode dsexplod misc/explosion dsexplod world/glassbreak dsbglass @@ -320,18 +320,18 @@ switches/fool dsdifool switches/valve dsvalve switches/sizzle dsfirxpl -$alias switches/exitbutn switches/normbutn +$alias switches/exitbutn switches/normbutn // Doors -doors/small_metal_open dsdrsmto // FIXME -doors/small_metal_close dsdrsmtc // FIXME -doors/large_metal_open dsdrlmto -doors/large_metal_close dsdrlmtc -doors/large_wood_open dsdrlwud -doors/large_wood_close dsdrlwud -doors/small_wood_open dsdrswud -doors/small_wood_close dsdrswud +doors/small_metal_open dsdrsmto // FIXME +doors/small_metal_close dsdrsmtc // FIXME +doors/large_metal_open dsdrlmto +doors/large_metal_close dsdrlmtc +doors/large_wood_open dsdrlwud +doors/large_wood_close dsdrlwud +doors/small_wood_open dsdrswud +doors/small_wood_close dsdrswud doors/stone_open dsdrston doors/stone_close dsdrston doors/dr2_open dsbdopn @@ -359,6 +359,8 @@ // Shared by player and others misc/pcrush dspcrush +$limit misc/pcrush 0 + misc/gibbed dsslop human/imonfire dsburnme misc/disruptordeath dsdsrptr Index: basev/strife/sndseq.txt =================================================================== --- basev/strife/sndseq.txt (revision 4123) +++ basev/strife/sndseq.txt (working copy) @@ -40,7 +40,7 @@ end :DoorCloseSmallWood - play doors/large_wood_open + play doors/small_wood_close nostopcutoff end @@ -134,20 +134,20 @@ ] :CeilingNormal - playrepeat plats/pt1_mid + playrepeat plats/pt1_mid end :CeilingSemiSilent - stopsound plats/pt1_stop + stopsound plats/pt1_stop end :Floor - playrepeat plats/pt1_mid - stopsound plats/pt1_stop + playrepeat plats/pt1_mid + stopsound plats/pt1_stop end :Platform - playuntildone plats/pt1_strt + playuntildone plats/pt1_strt stopsound plats/pt1_stop end Index: progs/common/engine/Entity.vc =================================================================== --- progs/common/engine/Entity.vc (revision 4123) +++ progs/common/engine/Entity.vc (working copy) @@ -277,6 +277,7 @@ bool bActLikeBridge; // Always allow obkects to pass. bool bNoDropOff; // Can't drop off under any circumstances bool bBright; // Always render full bright +bool bCanJump; // A dedicated flag instead of the BOUNCES+FLOAT+sentient as in MBF int Health; Index: progs/common/linespec/Actor.Strife.vc =================================================================== --- progs/common/linespec/Actor.Strife.vc (revision 4123) +++ progs/common/linespec/Actor.Strife.vc (working copy) @@ -862,7 +862,10 @@ emitter.bInCombat = true; emitter.Target = target; - emitter.SetState(emitter.FindState('Pain')); + if (emitter.FindState('Pain')) + { + emitter.SetState(emitter.FindState('Pain')); + } for (looker = Sector->ThingList; looker; looker = looker.SNext) { @@ -880,10 +883,13 @@ if (!looker.CanSee(target) && !looker.CanSee(emitter)) continue; - EntityEx(looker).Target = target; - looker.PlaySound(SightSound, CHAN_VOICE); - looker.SetState(EntityEx(looker).SeeState); - EntityEx(looker).bInCombat = true; + if (EntityEx(looker).FindState('See')) + { + EntityEx(looker).Target = target; + looker.PlaySound(SightSound, CHAN_VOICE); + looker.SetState(EntityEx(looker).FindState('See')); + EntityEx(looker).bInCombat = true; + } } } } Index: progs/common/linespec/ArtiBlastRadius.vc =================================================================== --- progs/common/linespec/ArtiBlastRadius.vc (revision 4123) +++ progs/common/linespec/ArtiBlastRadius.vc (working copy) @@ -63,9 +63,10 @@ { continue; } - else if (!mo.bMonster && !mo.bIsPlayer && !mo.bMissile) + else if (!mo.bMonster && !mo.bCanBlast && !mo.bIsPlayer && !mo.bMissile && + !mo.bTouchy) { - // Must be monster, player, or missile + // Must be monster, player, missile or touchy continue; } if (mo.bDormant) @@ -176,6 +177,12 @@ victim.bSlide = true; victim.bBlasted = true; } + // Touchy objects die when blasted + if (victim.bTouchy) + { + victim.bArmed = false; // Disarm + Damage(victim, source, victim.Health); + } } } Index: progs/common/linespec/EntityEx.AiUtils.vc =================================================================== --- progs/common/linespec/EntityEx.AiUtils.vc (revision 4123) +++ progs/common/linespec/EntityEx.AiUtils.vc (working copy) @@ -1,4 +1,4 @@ -//************************************************************************** +?//************************************************************************** //** //** ## ## ## ## ## #### #### ### ### //** ## ## ## ## ## ## ## ## ## ## #### #### @@ -638,6 +638,7 @@ float yspeed; int i; bool try_ok; + bool dropoff = false; line_t *ld; int good; @@ -653,15 +654,15 @@ // Instead of yanking non-floating monsters to the ground, // let gravity drop them down, unless they're moving down a step. - if (!bNoGravity && Origin.z > FloorZ /*&& !bOnMobj*/) + if (!bNoGravity && Origin.z > FloorZ && !bOnMobj) { - if (Origin.z > FloorZ + MaxStepHeight) + if (Origin.z <= FloorZ + MaxStepHeight) { - return false; + Origin.z = FloorZ; } else { - Origin.z = FloorZ; + return false; } } @@ -708,8 +709,18 @@ tmtrace_t tmtrace; for (i = 1; i < steps; i++) { + // killough 10/98: allow actors to drop off of taller ledges sometimes. + // dropoff==1 means only up to 128 high, and only if the target is + // immediately on the other side of the line. + if (bJumpDown && Target && !Target.IsFriend(self) && + DistTo(Target) < 144.0 && P_Random() < 235 && + !(tmtrace.FloorZ - tmtrace.DropOffZ > 128.0 || + !Target || Target.Origin.z > tmtrace.DropOffZ)) + { + dropoff = true; + } try_ok = TryMoveEx(&tmtrace, vector(origx + (deltax / itof(steps * i)), origy + - (deltay / itof(steps * i)), Origin.z), false); + (deltay / itof(steps * i)), Origin.z), dropoff); if (!try_ok) { break; @@ -719,7 +730,17 @@ // killough 3/15/98: don't jump over dropoffs: if (try_ok) { - try_ok = TryMoveEx(&tmtrace, vector(tryx, tryy, Origin.z), false); + // killough 10/98: allow actors to drop off of taller ledges sometimes. + // dropoff==1 means only up to 128 high, and only if the target is + // immediately on the other side of the line. + if (bJumpDown && Target && !Target.IsFriend(self) && + DistTo(Target) < 144.0 && P_Random() < 235 && + !(tmtrace.FloorZ - tmtrace.DropOffZ > 128.0 || + !Target || Target.Origin.z > tmtrace.DropOffZ)) + { + dropoff = true; + } + try_ok = TryMoveEx(&tmtrace, vector(tryx, tryy, Origin.z), dropoff); } if (!try_ok) @@ -739,7 +760,45 @@ bInFloat = true; return true; } + if (bCanJump && !bFloat && tmtrace.bFloatOk && + (Origin.z <= FloorZ || bOnMobj) && !JumpTime) + { + if (tmtrace.FloorZ - Origin.z <= 48.0 && Target && + tmtrace.FloorZ - Target.Origin.z <= 48.0) + { + float DeltaX; + float DeltaY; + TVec dir; + TAVec ang; + CheckDropOff(DeltaX, DeltaY); + dir = Target.Origin - Origin; + VectorAngles(&dir, &ang); + + if (DeltaX > 0.0) + { + Velocity.x += 0.6 * 35.0 * cos(ang.yaw); + } + else + { + Velocity.x += 0.6 * 35.0 * cos(-ang.yaw); + } + + if (DeltaY > 0.0) + { + Velocity.y += 0.6 * 35.0 * sin(ang.yaw); + } + else + { + Velocity.y += 0.6 * 35.0 * sin(-ang.yaw); + } + Velocity.z = (JumpVelZ * 1.1) * 35.0; + bOnMobj = false; + JumpTime = 0.5; + return true; + } + } + if (!tmtrace.SpecHit.Num) { return false; @@ -768,13 +827,12 @@ { ld = tmtrace.SpecHit[tmtrace.SpecHit.Num - 1]; tmtrace.SpecHit.Num = tmtrace.SpecHit.Num - 1; - // if the special is not a door - // that can be opened, - // return false + // if the special is not a door that can be opened + // then return false if ((bCanUseWalls && LineSpecialLevelInfo(Level).ActivateLine(ld, self, 0, SPAC_Use)) || (bActivatePushWall && LineSpecialLevelInfo(Level).ActivateLine(ld, self, 0, SPAC_Push))) { - good |= ld == tmtrace.BlockingLine ? 1 : 2;//true; + good |= ld == tmtrace.BlockingLine ? 1 : 2; //true; } } return good && ((P_Random() >= 203) ^ (good & 1)); @@ -1028,16 +1086,18 @@ dist = DistTo(Target); if (Target.Health > 0) - { // Live enemy target + { + // Enemy target is alive if (GetCvar('monster_backing') && MissileState && /*actor->type != MT_SKULL &&*/ ((!Target.MissileState && dist < MELEERANGE * 2.0) || (Target.Player && PlayerEx(Target.Player).ReadyWeapon.bBotMelee && dist < MELEERANGE * 3.0))) - { // Back away from melee attacker - strafecount = P_Random() & 15; - deltax = -deltax; - deltay = -deltay; + { + // Back away from melee attacker + strafecount = P_Random() & 15; + deltax = -deltax; + deltay = -deltay; } } } @@ -1096,7 +1156,6 @@ // If the actor elects to continue in its current direction, let it do // so unless the way is blocked. Then it must turn. - turndir = (P_Random() & 1) ? -1 : 1; if (olddir == DI_NODIR) Index: progs/common/linespec/EntityEx.Damage.vc =================================================================== --- progs/common/linespec/EntityEx.Damage.vc (revision 4123) +++ progs/common/linespec/EntityEx.Damage.vc (working copy) @@ -1,4 +1,4 @@ -//************************************************************************** +?//************************************************************************** //** //** ## ## ## ## ## #### #### ### ### //** ## ## ## ## ## ## ## ## ## ## #### #### @@ -39,7 +39,7 @@ final void Damage(EntityEx inflictor, EntityEx source, int damage, optional name DmgType, optional bool NoArmor) { - int i; + int i; if (!bShootable) { @@ -137,6 +137,11 @@ } } + if (DmgType == 'SpectralLow' && bLowSpectralResist) + { + damage = 0; + } + if (DmgType == 'Fire' && bFireResist) { damage >>= 1; Index: progs/common/linespec/EntityEx.Defaults.vc =================================================================== --- progs/common/linespec/EntityEx.Defaults.vc (revision 4123) +++ progs/common/linespec/EntityEx.Defaults.vc (working copy) @@ -43,6 +43,7 @@ MeleeRange = 44.0; // MELEERANGE(64.0) - 20.0 MissileHeight = 32.0; WoundHealth = 6; + JumpVelZ = 9.5; BloodType = Blood; BloodSplatterType = BloodSplatter; AxeBloodType = AxeBlood; Index: progs/common/linespec/EntityEx.Head.vc =================================================================== --- progs/common/linespec/EntityEx.Head.vc (revision 4123) +++ progs/common/linespec/EntityEx.Head.vc (working copy) @@ -135,6 +135,7 @@ name ActiveSound; name AttackSound; name PainSound; +name CrushPainSound; name DeathSound; name HowlSound; @@ -257,6 +258,7 @@ bool bDeflect; // Different projectile reflection style bool bDontReflect; // Projectile cannot be reflected bool bFireResist; // Actor takes half damage from fire. +bool bLowSpectralResist; // Actor resists full damage from first sigil projectiles. bool bDontSquash; // Death ball can't squash this actor bool bNoTeleOther; // Monster is not affected by teleport other artifact bool bDontHurtSpecies; // Don't hurt own species with explosions. @@ -280,8 +282,11 @@ bool bBloodSplatter; // Use blood splatter like in Raven games. bool bDehExplosion; // Use explosion style specified using DeHackEd. bool bNoVerticalMeleeRange; // Does not check vertical distance for melee range -bool bSummonedMonster; +bool bSummonedMonster; // Flag MinotaurFriend and other summoned monsters (i.e. by powerups, etc.) bool bSeesDaggers; // Actor is able to hear dagger attacks +bool bTouchy; // killough 11/98: Dies when solids touch it +bool bArmed; // Object is armed (for touchy objects) +bool bJumpDown; // Generalization of dog behavior with dropoffs. // Params float Speed; @@ -415,6 +420,11 @@ int SkillRespawnCount; +// Customiseable Jump Velocity +float JumpVelZ; + +float JumpTime; + replication { reliable if (Role == ROLE_Authority && bNetOwner) Index: progs/common/linespec/EntityEx.Misc.vc =================================================================== --- progs/common/linespec/EntityEx.Misc.vc (revision 4123) +++ progs/common/linespec/EntityEx.Misc.vc (working copy) @@ -1,4 +1,4 @@ -//************************************************************************** +?//************************************************************************** //** //** ## ## ## ## ## #### #### ### ### //** ## ## ## ## ## ## ## ## ## ## #### #### @@ -644,205 +644,232 @@ Other = EntityEx(InOther); - // For Korax Arena - if (Other.IsTouched(self)) + if (Other) { - return !Other.bSolid && !Other.bSpecial && !Other.bShootable; - } - - if (!Other.bSolid && !Other.bSpecial && !Other.bShootable) - { - return true; - } - - // check for skulls slamming into things - if (bSkullFly && Health > 0) - { - return Slam(Other); - } - - // Check for blasted thing running into another - if (bBlasted && Other.bShootable) - { - if (!Other.bBoss && Other.bMonster) + // For Korax Arena + if (Other.IsTouched(self)) { - Other.Velocity.x += Velocity.x; - Other.Velocity.y += Velocity.y; - if ((Other.Velocity.x + Other.Velocity.y) > 3.0 * 35.0) - { - damage = (ftoi(Mass) / 100) + 1; - Other.Damage(self, self, damage); - damage = (ftoi(Other.Mass) / 100) + 1; - Damage(Other, Other, damage >> 2); - } - return false; + return !Other.bSolid && !Other.bSpecial && (!Other.bShootable || !Other.bTouchy); } - } - - // missiles can hit other things - if (bMissile) - { - // Check for a non-shootable mobj - if (Other.bNonShootable) + + if (!Other.bSolid && !Other.bSpecial && (!Other.bShootable || !Other.bTouchy)) { return true; } - // Check for passing through a ghost - if (Other.bGhost && bThruGhost) + + // touchy object is alive, toucher is solid + if (Other.bTouchy && bSolid && Other.Health > 0 && + // Thing is an armed mine or a sentient thing + (Other.bArmed || Other.IsSentient()) && + // either different classes or players + (Other.bIsPlayer || Other.Class != Class) && + // or different species if DONTHARMSPECIES + (!(Other.bDontHurtSpecies) || Other.GetSpecies() != GetSpecies()) && + // touches vertically + Other.Origin.z + Other.Height >= Origin.z && Origin.z + Height >= Other.Origin.z && + // prevents lost souls from exploding when fired by pain elementals + (Other.Master != self && Master != Other)) + // Difference with MBF: MBF hardcodes the LS/PE check and lets actors of the same species + // but different classes trigger the touchiness, but that seems less straightforwards. { + bArmed = false; // Disarm + Other.Damage(none, none, Other.Health); // kill object return true; } - if ((BounceType == BOUNCE_Doom || BounceType == BOUNCE_Hexen) && - MissileDamage == 0) + // check for skulls slamming into things + if (bSkullFly && Health > 0) { - return Target == Other || !Other.bSolid; + return Slam(Other); } - switch (SpecialMissileHit(Other)) + // Check for blasted thing running into another + if (bBlasted && Other.bShootable) { - case 0: - return false; - case 1: - return true; + if (!Other.bBoss && Other.bMonster) + { + Other.Velocity.x += Velocity.x; + Other.Velocity.y += Velocity.y; + if ((Other.Velocity.x + Other.Velocity.y) > 3.0 * 35.0) + { + damage = (ftoi(Mass) / 100) + 1; + Other.Damage(self, self, damage); + damage = (ftoi(Other.Mass) / 100) + 1; + Damage(Other, Other, damage >> 2); + } + return false; + } } - if (Target) + // missiles can hit other things + if (bMissile) { - // Don't hit same species as originator. - if (Other == Target) + // Check for a non-shootable mobj + if (Other.bNonShootable) { - // Don't missile self return true; } - // Let players missile other players. - if (!Target.bIsPlayer && !Other.bIsPlayer) + // Check for passing through a ghost + if (Other.bGhost && bThruGhost) { - int Inf = Target.GetInfighting(); - if (Inf < 0) + return true; + } + + if ((BounceType == BOUNCE_Doom || BounceType == BOUNCE_Hexen) && + MissileDamage == 0) + { + return Target == Other || !Other.bSolid; + } + + switch (SpecialMissileHit(Other)) + { + case 0: + return false; + case 1: + return true; + } + + if (Target) + { + // Don't hit same species as originator. + if (Other == Target) { - // Monsters can't hurt each other, but make exception - // depending on friendliness and hate status. - if (Target.bShootable) + // Don't missile self + return true; + } + // Let players missile other players. + if (!Target.bIsPlayer && !Other.bIsPlayer) + { + int Inf = Target.GetInfighting(); + if (Inf < 0) { - if (!Other.bMonster) + // Monsters can't hurt each other, but make exception + // depending on friendliness and hate status. + if (Target.bShootable) { - return false; - } - // Hostile monsters can always hurt each other. - if (!Other.IsHostile(Target)) - { - // The same if the shooter hates the target. - if (!Other.TID || Target.TIDToHate != Other.TID) + if (!Other.bMonster) { return false; } + // Hostile monsters can always hurt each other. + if (!Other.IsHostile(Target)) + { + // The same if the shooter hates the target. + if (!Other.TID || Target.TIDToHate != Other.TID) + { + return false; + } + } } } - } - else if (Inf == 0) - { - if (Other.IsFriend(Target)) + else if (Inf == 0) { - // Don't hurt friends. - return false; - } - if (Other.TIDToHate && Other.TIDToHate == Target.TIDToHate) - { - // Don't hurt monsters that hate the same thing as you do. - return false; - } - if (Target.GetSpecies() == Other.GetSpecies()) - { - // Don't hurt same species, but only if the target - // isn't one's hostile. - if (!Other.IsHostile(Target)) + if (Other.IsFriend(Target)) { - // Allow hurting monsters the shooter hates. - if (Other.TID == 0 || Target.TIDToHate != Other.TID) + // Don't hurt friends. + return false; + } + if (Other.TIDToHate && Other.TIDToHate == Target.TIDToHate) + { + // Don't hurt monsters that hate the same thing as you do. + return false; + } + if (Target.GetSpecies() == Other.GetSpecies()) + { + // Don't hurt same species, but only if the target + // isn't one's hostile. + if (!Other.IsHostile(Target)) { - return false; + // Allow hurting monsters the shooter hates. + if (Other.TID == 0 || Target.TIDToHate != Other.TID) + { + return false; + } } } } } } - } - if (!Other.bShootable) - { - // didn't do any damage - return !Other.bSolid; - } + if (!Other.bShootable) + { + // didn't do any damage + return !Other.bSolid; + } - // Don't hit spectres with non-sigil weapons. - if (Other.bSpectral && !bSpectral) - { - return true; - } + // Don't hit spectres with non-sigil weapons. + if (Other.bSpectral && !bSpectral) + { + return true; + } - if (bRip && !Other.bDontRip) - { - if (!Other.bNoBlood && !Other.bReflective && !Other.bInvulnerable) + if (bRip && !Other.bDontRip) { - // Ok to spawn some blood - SpawnRipperBlood(); + if (!Other.bNoBlood && !Other.bReflective && !Other.bInvulnerable) + { + // Ok to spawn some blood + SpawnRipperBlood(); + } + PlaySound('misc/ripslop', CHAN_BODY); + damage = GetMissileDamage(3, 2); + Other.Damage(self, Target, damage, DamageType); + if (Other.bPushable && !bCannotPush) + { + // Push thing + Other.Velocity.x += Velocity.x / 4.0; + Other.Velocity.y += Velocity.y / 4.0; + } + //WHAT A FUCK IS THIS??????? numspechit = 0; + return true; } - PlaySound('misc/ripslop', CHAN_BODY); - damage = GetMissileDamage(3, 2); - Other.Damage(self, Target, damage, DamageType); - if (Other.bPushable && !bCannotPush) + + // damage / explode + damage = GetMissileDamage(bStrifeDamage ? 3 : 7, 1); + if (damage > 0) { - // Push thing - Other.Velocity.x += Velocity.x / 4.0; - Other.Velocity.y += Velocity.y / 4.0; + if (bBloodSplatter && !Other.bNoBlood && !Other.bReflective && + !Other.bInvulnerable && !Other.bDormant && + !bBloodlessImpact && P_Random() < 192) + { + Other.SpawnBloodSplatter(Origin, damage); + } + Other.Damage(self, Target, damage, DamageType); } -//WHAT A FUCK IS THIS??????? numspechit = 0; - return true; + // don't traverse any more + return false; } - // damage / explode - damage = GetMissileDamage(bStrifeDamage ? 3 : 7, 1); - if (damage > 0) + if (Other.bPushable && !bCannotPush) { - if (bBloodSplatter && !Other.bNoBlood && !Other.bReflective && - !Other.bInvulnerable && !Other.bDormant && - !bBloodlessImpact && P_Random() < 192) + // Push thing + Other.Velocity.x += Velocity.x / 4.0; + Other.Velocity.y += Velocity.y / 4.0; + } + + solid = Other.bSolid && + Other.bColideWithThings && + bSolid; + + // check for special pickup + if (Other.bSpecial /*&& + Other.Origin.z < Origin.z + Height - MaxStepHeight*/) + { + if (Other.bDehackedSpecial) { - Other.SpawnBloodSplatter(Origin, damage); + Other.TouchDehackedSpecial(self); } - Other.Damage(self, Target, damage, DamageType); + else + { + Other.TouchSpecial(self); // Can remove thing + } } - // don't traverse any more - return false; - } - if (Other.bPushable && !bCannotPush) - { - // Push thing - Other.Velocity.x += Velocity.x / 4.0; - Other.Velocity.y += Velocity.y / 4.0; + return !solid; } - - solid = Other.bSolid && - Other.bColideWithThings && - bSolid; - - // check for special pickup - if (Other.bSpecial/* && - Other.Origin.z < Origin.z + Height - MaxStepHeight*/) + else { - if (Other.bDehackedSpecial) - { - Other.TouchDehackedSpecial(self); - } - else - { - Other.TouchSpecial(self); // Can remove thing - } + return true; } - - return !solid; } //========================================================================== @@ -1489,6 +1516,15 @@ } } + if (JumpTime) + { + JumpTime -= deltaTime; + if (JumpTime <= 0.0) + { + JumpTime = 0.0; + } + } + if (!Physics(deltaTime)) { return; @@ -1613,6 +1649,14 @@ return true; } + // killough 11/98: kill touchy things immediately + if (bTouchy && (bArmed || IsSentient())) + { + bArmed = false;; // Disarm + Damage(none, none, default.Health); // kill object + return true; + } + if (!bShootable) { // Assume it is bloody gibs or something @@ -1634,6 +1678,10 @@ A.Translation = BloodTranslation; } } + if (CrushPainSound && !bInvulnerable) + { + PlaySound(CrushPainSound, CHAN_VOICE); + } } return false; // Don't fit } @@ -3286,6 +3334,21 @@ //========================================================================== // +// IsSentient +// +// killough 11/98: +// Whether an object is "sentient" or not. +// Used for environmental influences. +// +//========================================================================== + +final bool IsSentient() +{ + return Health > 0 && SeeState; +} + +//========================================================================== +// // IsFast // //========================================================================== Index: progs/common/linespec/EntityEx.Physics.vc =================================================================== --- progs/common/linespec/EntityEx.Physics.vc (revision 4123) +++ progs/common/linespec/EntityEx.Physics.vc (working copy) @@ -37,6 +37,7 @@ bool Physics(float DeltaTime) { + float oldfloorz; float CummX = 0.0; float CummY = 0.0; if (Sector->AffectorData && bColideWithWorld && !bNoSector) @@ -121,7 +122,7 @@ // momentum movement // Handle X and Y momentums - XYMovement(DeltaTime, CummX, CummY); + oldfloorz = XYMovement(DeltaTime, CummX, CummY); if (IsDestroyed()) { // mobj was removed @@ -165,7 +166,7 @@ { if (bIsPlayer) { - if (Velocity.z < -DEFAULT_GRAVITY * 0.25 && !bFly) + if (Velocity.z < -DEFAULT_GRAVITY * 0.25 && !bFly && !bNoGravity) { PlayerLandedOnThing(); } @@ -184,6 +185,7 @@ } bOnMobj = true; Velocity.z = 0.0; + Crash(); if (onmo.bOnmobjCopyVel) { @@ -206,7 +208,7 @@ } else { - ZMovement(DeltaTime); + ZMovement(DeltaTime, oldfloorz); bOnMobj = false; } if (IsDestroyed()) @@ -218,7 +220,7 @@ else { // Handle Z momentum and gravity - ZMovement(DeltaTime); + ZMovement(DeltaTime, oldfloorz); if (IsDestroyed()) { // entity was removed @@ -235,13 +237,14 @@ // //========================================================================== -final void XYMovement(float DeltaTime, float ScrollX, float ScrollY) +final float XYMovement(float DeltaTime, float ScrollX, float ScrollY) { float ptryx; float ptryy; float xmove; float ymove; int special; + float oldfloorz = FloorZ; if (bWindThrust) { @@ -323,7 +326,12 @@ // Reset to not blasted when momentums are gone ResetBlasted(); } - return; + if (bTouchy && !IsSentient()) + { + // Arm a mine which has come to rest + bArmed = true; + } + return oldfloorz; } // Split move in multiple steps if moving too fast. @@ -367,10 +375,12 @@ { HitLine(&tmtrace, DeltaTime / itof(Steps)); } - return; + return oldfloorz; } } while (Step++ < Steps); + + return oldfloorz; } //========================================================================== @@ -379,12 +389,28 @@ // //========================================================================== -final void ZMovement(float DeltaTime) +final void ZMovement(float DeltaTime, float OldFloorZ) { float dist; float delta; float OldZ = Origin.z; + // [RH] Double gravity only if running off a ledge. Coming down from + // an upward thrust (e.g. a jump) should not double it. + if (Origin.z > FloorZ && !bNoGravity) + { + float grav = (Gravity * Level.Gravity * Sector->Gravity) / 14.95361328125; // 81.92 + + if (Velocity.z == 0.0 && OldFloorZ > FloorZ && Origin.z == OldFloorZ) + { + Velocity.z -= (grav + grav) * DeltaTime; + } + else + { + Velocity.z -= grav * DeltaTime; + } + } + // check for smooth step up if (bIsPlayer && Origin.z < FloorZ) { @@ -394,7 +420,10 @@ } // adjust height - Origin.z += Velocity.z * DeltaTime; + if (!bFloatBob) + { + Origin.z += Velocity.z * DeltaTime; + } if (bFloat && !bDormant && Target) { @@ -628,6 +657,15 @@ SectorAction::SECSPAC_HitFloor); } + // killough 11/98: touchy objects explode on impact + // Allow very short drops to be safe, so that a touchy can be summoned without exploding. + if (bTouchy && (bArmed || IsSentient()) && (Velocity.z < -5.0)) + { + bArmed = false; // Disarm + Damage(none, none, Health); // kill object + return true; + } + if (bMissile && (bColideWithWorld || !LineSpecialGameInfo(Level.Game).bNoClipIgnoreFloor)) { @@ -663,6 +701,10 @@ } } Origin.z = FloorZ; + if (bCanJump) + { + JumpTime = 0.2; // delay any jumping for a short time + } if (vdot < -0.1) { // Spawn splashes, etc. Index: progs/common/linespec/Macil1.vc =================================================================== --- progs/common/linespec/Macil1.vc (revision 4123) +++ progs/common/linespec/Macil1.vc (working copy) @@ -93,6 +93,7 @@ bNoIceDeath = true; bFireResist = true; bNoDamage = true; + bNeverRespawn = true; SightSound = 'macil/sight'; ActiveSound = 'macil/active'; PainSound = 'macil/pain'; Index: progs/common/linespec/Oracle.vc =================================================================== --- progs/common/linespec/Oracle.vc (revision 4123) +++ progs/common/linespec/Oracle.vc (working copy) @@ -82,7 +82,8 @@ bFloorClip = true; bPassMobj = true; bCanUseWalls = true; + bNoDeathmatch = true; bNoBlood = true; - bNoDeathmatch = true; bFireResist = true; + bLowSpectralResist = true; } Index: progs/common/linespec/SpectralMonster.vc =================================================================== --- progs/common/linespec/SpectralMonster.vc (revision 4123) +++ progs/common/linespec/SpectralMonster.vc (working copy) @@ -194,6 +194,17 @@ if (!Target) return; + Actor A; + + foreach AllThinkers(Oracle, A) + { + if (A && A.bMonster && A.Health > 0) + { + // Kill the oracle if his specter dies... + EntityEx(A).Damage(none, none, 10000); + } + } + Target.Player.cprint("$txt_killed_oracle"); Target.GiveInventoryType(QuestItem23); if (Target.FindInventory(QuestItem21)) Index: source/d3d_poly.cpp =================================================================== --- source/d3d_poly.cpp (revision 4123) +++ source/d3d_poly.cpp (working copy) @@ -545,6 +545,8 @@ SetTexture(Texture1, CMap); TexStage = 1; SetTexture(Texture2, CMap); + TexStage = 1; + SetTexture(Texture1, CMap); TexStage = 0; for (i = 0; i < surf->count; i++) { Index: source/d3d_tex.cpp =================================================================== --- source/d3d_tex.cpp (revision 4123) +++ source/d3d_tex.cpp (working copy) @@ -222,6 +222,8 @@ RenderDevice->SetTexture(0, (LPDIRECT3DTEXTURE9)Tex->DriverData); } + RenderDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, magfilter); + RenderDevice->SetSamplerState(0, D3DSAMP_MINFILTER, minfilter); RenderDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP); RenderDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP); tex_iw = 1.0 / Tex->GetWidth(); Index: source/gl_poly.cpp =================================================================== --- source/gl_poly.cpp (revision 4123) +++ source/gl_poly.cpp (working copy) @@ -649,6 +649,7 @@ SetSpriteLump(Tex, Translation, CMap); + glEnable(GL_ALPHA_TEST); if (blend_sprites || Additive || Alpha < 1.0) { glAlphaFunc(GL_GREATER, 0.0); @@ -658,7 +659,6 @@ { glBlendFunc(GL_SRC_ALPHA, GL_ONE); } - glEnable(GL_ALPHA_TEST); vuint32 alpha = (int)(255 * Alpha); SetColour((light & 0x00ffffff) | (alpha << 24)); Index: source/p_entity.h =================================================================== --- source/p_entity.h (revision 4123) +++ source/p_entity.h (working copy) @@ -230,6 +230,7 @@ EF_ActLikeBridge = 0x08000000, // Always allow obkects to pass. EF_NoDropOff = 0x10000000, // Can't drop off under any circumstances EF_Bright = 0x20000000, // Always render full bright + EF_CanJump = 0x40000000, // This entity can jump to high places }; vuint32 EntityFlags; Index: source/p_entity_world.cpp =================================================================== --- source/p_entity_world.cpp (revision 4123) +++ source/p_entity_world.cpp (working copy) @@ -1225,12 +1225,14 @@ O->CeilingZ - (O->Origin.z + O->Height) < Height || tmtrace.CeilingZ - (O->Origin.z + O->Height) < Height) { + // Can't step up or doesn't fit PushLine(tmtrace); return false; } if (!(EntityFlags & EF_PassMobj) || compat_nopassover || (Level->LevelInfoFlags2 & VLevelInfo::LIF2_CompatNoPassOver)) { + // Can't go over return false; } } @@ -1263,8 +1265,8 @@ PushLine(tmtrace); return false; } - else if (Origin.z < tmtrace.FloorZ - && tmtrace.FloorZ - tmtrace.DropOffZ > MaxStepHeight) + else if (Origin.z < tmtrace.FloorZ && + tmtrace.FloorZ - tmtrace.DropOffZ > MaxStepHeight) { Velocity.z = 8.0 * 35.0; PushLine(tmtrace); @@ -1276,8 +1278,20 @@ if (tmtrace.FloorZ - Origin.z > MaxStepHeight) { // Too big a step up - PushLine(tmtrace); - return false; + if (EntityFlags & EF_CanJump) + { + // Check to make sure there's nothing in the way for the step up + if (TestMobjZ(TVec(newPos.x, newPos.y, tmtrace.FloorZ))) + { + PushLine(tmtrace); + return false; + } + } + else + { + PushLine(tmtrace); + return false; + } } if (Origin.z < tmtrace.FloorZ) { @@ -1769,7 +1783,6 @@ if (!(EntityFlags & EF_NoGravity) && (Origin.z > FloorZ || Floor->normal.z <= 0.7)) { - // Add gravity if (WaterLevel < 2) { Velocity.z -= Gravity * Level->Gravity * Sector->Gravity * Index: source/r_main.cpp =================================================================== --- source/r_main.cpp (revision 4123) +++ source/r_main.cpp (working copy) @@ -470,7 +470,7 @@ VCvarI r_chasecam("r_chasecam", "0", CVAR_Archive); VCvarF r_chase_dist("r_chase_dist", "32.0", CVAR_Archive); -VCvarF r_chase_up("r_chase_up", "32.0", CVAR_Archive); +VCvarF r_chase_up("r_chase_up", "128.0", CVAR_Archive); VCvarF r_chase_right("r_chase_right", "0", CVAR_Archive); VCvarI r_chase_front("r_chase_front", "0", CVAR_Archive); Index: source/r_tex_png.cpp =================================================================== --- source/r_tex_png.cpp (revision 4123) +++ source/r_tex_png.cpp (working copy) @@ -265,7 +265,7 @@ } if (ColourType == PNG_COLOR_TYPE_GRAY && BitDepth < 8) { - png_set_gray_1_2_4_to_8(png_ptr); + png_set_expand_gray_1_2_4_to_8(png_ptr); } if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) { Index: source/screen.cpp =================================================================== --- source/screen.cpp (revision 4123) +++ source/screen.cpp (working copy) @@ -471,7 +471,7 @@ //************************************************************************** // -// General (pubic) stuff +// General (public) stuff // //************************************************************************** Index: source/snd_win32.cpp =================================================================== --- source/snd_win32.cpp (revision 4123) +++ source/snd_win32.cpp (working copy) @@ -175,7 +175,7 @@ caps.dwSize = sizeof(caps); DSound->GetCaps(&caps); if (caps.dwFreeHw3DStaticBuffers && caps.dwFreeHwMixingStaticBuffers && - !GArgs.CheckParm("-no3dsound")) + GArgs.CheckParm("-3dsound")) { Sound3D = true; GCon->Log(NAME_Init, "3D sound on"); Index: utils/vlaunch/vlaunch.cpp =================================================================== --- utils/vlaunch/vlaunch.cpp (revision 4123) +++ utils/vlaunch/vlaunch.cpp (working copy) @@ -50,9 +50,13 @@ public: wxComboBox* Game; wxComboBox* RendererBox; + wxComboBox* Resolution; + wxComboBox* Colour; + wxTextCtrl* Particles; + wxTextCtrl* CacheMemory; wxCheckBox* CheckBoxNoSound; wxCheckBox* CheckBoxNoSfx; - wxCheckBox* CheckBoxNo3DSound; + wxCheckBox* CheckBox3DSound; wxCheckBox* CheckBoxNoMusic; wxCheckBox* CheckBoxNoCDAudio; wxCheckBox* CheckBoxUseOpenAL; @@ -148,20 +152,6 @@ Game = new wxComboBox(page, -1, GameChoices[0], wxDefaultPosition, wxDefaultSize, 8, GameChoices, wxCB_READONLY); gsizer->Add(Game, 0, wxALL, 4); - gsizer->Add(new wxStaticText(page, -1, wxT("Renderer:")), 0, wxALL, 4); - wxString RendChoices[3]; - RendChoices[0] = wxT("Software"); - RendChoices[1] = wxT("OpenGL"); - RendChoices[2] = wxT("Direct3D"); - RendererBox = new wxComboBox(page, -1, RendChoices[1], wxDefaultPosition, wxDefaultSize, -#ifdef _WIN32 - 3, -#else - 2, -#endif - RendChoices, wxCB_READONLY); - gsizer->Add(RendererBox, 0, wxALL, 4); - gsizer->Add(new wxStaticText(page, -1, wxT("Custom game:")), 0, wxALL, 4); EditGame = new wxTextCtrl(page, -1, wxT(""), wxDefaultPosition, wxSize(128, -1)); gsizer->Add(EditGame, 0, wxALL, 4); @@ -183,6 +173,53 @@ page->SetSizer(gsizer); gsizer->Layout(); + // Video options + page = new wxPanel(nbook); + nbook->AddPage(page, wxT("Video")); + wxFlexGridSizer* vsizer = new wxFlexGridSizer(2); + + vsizer->Add(new wxStaticText(page, -1, wxT(" ")), 0, wxALL, 4); + vsizer->Add(new wxStaticText(page, -1, wxT(" ")), 0, wxALL, 4); + + vsizer->Add(new wxStaticText(page, -1, wxT("Renderer:")), 0, wxALL, 4); + wxString RendChoices[3]; + RendChoices[0] = wxT("Software"); + RendChoices[1] = wxT("OpenGL"); + RendChoices[2] = wxT("Direct3D"); + RendererBox = new wxComboBox(page, -1, RendChoices[1], wxDefaultPosition, wxDefaultSize, +#ifdef _WIN32 + 3, +#else + 2, +#endif + RendChoices, wxCB_READONLY); + vsizer->Add(RendererBox, 0, wxALL, 4); + vsizer->Add(new wxStaticText(page, -1, wxT("Resolution:")), 0, wxALL, 4); + wxString ResolutionChoices[6]; + ResolutionChoices[0] = wxT("640x480"); + ResolutionChoices[1] = wxT("800x600"); + ResolutionChoices[2] = wxT("1024x768"); + ResolutionChoices[3] = wxT("1152x864"); + ResolutionChoices[4] = wxT("1280x1024"); + ResolutionChoices[5] = wxT("1600x1200"); + Resolution = new wxComboBox(page, -1, ResolutionChoices[0], wxDefaultPosition, wxDefaultSize, 6, ResolutionChoices, wxCB_READONLY); + vsizer->Add(Resolution, 0, wxALL, 4); + vsizer->Add(new wxStaticText(page, -1, wxT("Color Depth:")), 0, wxALL, 4); + wxString ColourChoices[3]; + ColourChoices[0] = wxT("8 bits"); + ColourChoices[1] = wxT("16 bits"); + ColourChoices[2] = wxT("32 bits"); + Colour = new wxComboBox(page, -1, ColourChoices[0], wxDefaultPosition, wxDefaultSize, 3, ColourChoices, wxCB_READONLY); + vsizer->Add(Colour, 0, wxALL, 4); + vsizer->Add(new wxStaticText(page, -1, wxT("Particles:")), 0, wxALL, 4); + Particles = new wxTextCtrl(page, -1, wxT(""), wxDefaultPosition, wxSize(128, -1)); + vsizer->Add(Particles, 0, wxALL, 4); + vsizer->Add(new wxStaticText(page, -1, wxT("Surface Cache Memory (kb):")), 0, wxALL, 4); + CacheMemory = new wxTextCtrl(page, -1, wxT(""), wxDefaultPosition, wxSize(128, -1)); + vsizer->Add(CacheMemory, 0, wxALL, 4); + page->SetSizer(vsizer); + vsizer->Layout(); + // Sound options page = new wxPanel(nbook); nbook->AddPage(page, wxT("Sound")); @@ -191,12 +228,12 @@ bsizer->Add(CheckBoxNoSound, 0, wxALL, 4); CheckBoxNoSfx = new wxCheckBox(page, -1, wxT("No sounds")); bsizer->Add(CheckBoxNoSfx, 0, wxALL, 4); - CheckBoxNo3DSound = new wxCheckBox(page, -1, wxT("No 3D sound")); - bsizer->Add(CheckBoxNo3DSound, 0, wxALL, 4); CheckBoxNoMusic = new wxCheckBox(page, -1, wxT("No music")); bsizer->Add(CheckBoxNoMusic, 0, wxALL, 4); CheckBoxNoCDAudio = new wxCheckBox(page, -1, wxT("No CD audio")); bsizer->Add(CheckBoxNoCDAudio, 0, wxALL, 4); + CheckBox3DSound = new wxCheckBox(page, -1, wxT("Use 3D sound")); + bsizer->Add(CheckBox3DSound, 0, wxALL, 4); CheckBoxUseOpenAL = new wxCheckBox(page, -1, wxT("Use OpenAL")); bsizer->Add(CheckBoxUseOpenAL, 0, wxALL, 4); page->SetSizer(bsizer); @@ -240,9 +277,13 @@ wxConfigBase* Conf = wxConfigBase::Get(); Game->SetSelection(Conf->Read(wxT("Game"), 0l)); RendererBox->SetSelection(Conf->Read(wxT("Renderer"), 0l)); + Resolution->SetSelection(Conf->Read(wxT("Resolution"), 0l)); + Colour->SetSelection(Conf->Read(wxT("Colour"), 0l)); + Particles->SetValue(Conf->Read(wxT("Particles"), wxT(""))); + CacheMemory->SetValue(Conf->Read(wxT("CacheMemory"), wxT(""))); CheckBoxNoSound->SetValue(!!Conf->Read(wxT("NoSound"), 0l)); CheckBoxNoSfx->SetValue(!!Conf->Read(wxT("NoSfx"), 0l)); - CheckBoxNo3DSound->SetValue(!!Conf->Read(wxT("No3DSound"), 0l)); + CheckBox3DSound->SetValue(!!Conf->Read(wxT("3DSound"), 0l)); CheckBoxNoMusic->SetValue(!!Conf->Read(wxT("NoMusic"), 0l)); CheckBoxNoCDAudio->SetValue(!!Conf->Read(wxT("NoCDAudio"), 0l)); CheckBoxUseOpenAL->SetValue(!!Conf->Read(wxT("UseOpenAL"), 0l)); @@ -271,9 +312,13 @@ wxConfigBase* Conf = wxConfigBase::Get(); Conf->Write(wxT("Game"), Game->GetSelection()); Conf->Write(wxT("Renderer"), RendererBox->GetSelection()); + Conf->Write(wxT("Resolution"), Resolution->GetSelection()); + Conf->Write(wxT("Colour"), Colour->GetSelection()); + Conf->Write(wxT("Particles"), Particles->GetValue()); + Conf->Write(wxT("CacheMemory"), CacheMemory->GetValue()); Conf->Write(wxT("NoSound"), CheckBoxNoSound->IsChecked()); Conf->Write(wxT("NoSfx"), CheckBoxNoSfx->IsChecked()); - Conf->Write(wxT("No3DSound"), CheckBoxNo3DSound->IsChecked()); + Conf->Write(wxT("3DSound"), CheckBox3DSound->IsChecked()); Conf->Write(wxT("NoMusic"), CheckBoxNoMusic->IsChecked()); Conf->Write(wxT("NoCDAudio"), CheckBoxNoCDAudio->IsChecked()); Conf->Write(wxT("UseOpenAL"), CheckBoxUseOpenAL->IsChecked()); @@ -336,17 +381,25 @@ break; } + // Particles + if (Particles->GetValue().Length()) + CmdLine += wxT(" -particles ") + EditMisc->GetValue(); + + // Cache Memory + if (CacheMemory->GetValue().Length()) + CmdLine += wxT(" -surfcache ") + EditMisc->GetValue(); + // Sound if (CheckBoxNoSound->IsChecked()) CmdLine += wxT(" -nosound"); if (CheckBoxNoSfx->IsChecked()) CmdLine += wxT(" -nosfx"); - if (CheckBoxNo3DSound->IsChecked()) - CmdLine += wxT(" -no3dsound"); if (CheckBoxNoMusic->IsChecked()) CmdLine += wxT(" -nomusic"); if (CheckBoxNoCDAudio->IsChecked()) CmdLine += wxT(" -nocdaudio"); + if (CheckBox3DSound->IsChecked()) + CmdLine += wxT(" -3dsound"); if (CheckBoxUseOpenAL->IsChecked()) CmdLine += wxT(" -openal"); @@ -382,6 +435,42 @@ if (EditMisc->GetValue().Length()) CmdLine += wxT(" ") + EditMisc->GetValue(); + // Set Resolution + switch (Resolution->GetSelection()) + { + case 0: + CmdLine += wxT(" +setresolution 640 480"); + break; + case 1: + CmdLine += wxT(" +setresolution 800 600"); + break; + case 2: + CmdLine += wxT(" +setresolution 1024 768"); + break; + case 3: + CmdLine += wxT(" +setresolution 1152 864"); + break; + case 4: + CmdLine += wxT(" +setresolution 1280 1024"); + break; + case 5: + CmdLine += wxT(" +setresolution 1600 1200"); + break; + } + + switch (Colour->GetSelection()) + { + case 0: + CmdLine += wxT(" 8"); + break; + case 1: + CmdLine += wxT(" 16"); + break; + case 2: + CmdLine += wxT(" 32"); + break; + } + // Run game wxExecute(CmdLine, wxEXEC_SYNC); }This one fixes most of the bugs reported for Strife, adds video options to the launcher, adds gravity for Z Movement and allows monsters to jump down of dropoffs and jump up in small ledges, let me know what you think.
Janis Legzdinsh
Index: basev/strife/mapinfo.txt =================================================================== --- basev/strife/mapinfo.txt (revision 4123) +++ basev/strife/mapinfo.txt (working copy) @@ -35,7 +35,7 @@ skill nightmare AmmoFactor 2 FastMonsters -DisableCheats +//DisableCheats RespawnTime 16 SpawnFilter Nightmare PicName "m_nmare"No
Index: progs/common/linespec/Actor.Strife.vc =================================================================== --- progs/common/linespec/Actor.Strife.vc (revision 4123) +++ progs/common/linespec/Actor.Strife.vc (working copy) @@ -880,10 +883,13 @@ if (!looker.CanSee(target) && !looker.CanSee(emitter)) continue; - EntityEx(looker).Target = target; - looker.PlaySound(SightSound, CHAN_VOICE); - looker.SetState(EntityEx(looker).SeeState); - EntityEx(looker).bInCombat = true; + if (EntityEx(looker).FindState('See')) + { + EntityEx(looker).Target = target; + looker.PlaySound(SightSound, CHAN_VOICE); + looker.SetState(EntityEx(looker).FindState('See')); + EntityEx(looker).bInCombat = true; + } } } }OK, but use SeeState instead of FindState('See').
Index: progs/common/linespec/ArtiBlastRadius.vc =================================================================== --- progs/common/linespec/ArtiBlastRadius.vc (revision 4123) +++ progs/common/linespec/ArtiBlastRadius.vc (working copy) @@ -63,9 +63,10 @@ { continue; } - else if (!mo.bMonster && !mo.bIsPlayer && !mo.bMissile) + else if (!mo.bMonster && !mo.bCanBlast && !mo.bIsPlayer && !mo.bMissile && + !mo.bTouchy) { - // Must be monster, player, or missile + // Must be monster, player, missile or touchy continue; } if (mo.bDormant)bCanBlast is already handled earlier and is pointless here.
Index: progs/common/linespec/EntityEx.AiUtils.vc =================================================================== --- progs/common/linespec/EntityEx.AiUtils.vc (revision 4123) +++ progs/common/linespec/EntityEx.AiUtils.vc (working copy) @@ -1,4 +1,4 @@ -//************************************************************************** +?//************************************************************************** //** //** ## ## ## ## ## #### #### ### ### //** ## ## ## ## ## ## ## ## ## ## #### ####Save it properly.
Index: progs/common/linespec/EntityEx.Damage.vc =================================================================== --- progs/common/linespec/EntityEx.Damage.vc (revision 4123) +++ progs/common/linespec/EntityEx.Damage.vc (working copy) @@ -1,4 +1,4 @@ -//************************************************************************** +?//************************************************************************** //** //** ## ## ## ## ## #### #### ### ### //** ## ## ## ## ## ## ## ## ## ## #### ####Again.
Index: progs/common/linespec/EntityEx.Misc.vc =================================================================== --- progs/common/linespec/EntityEx.Misc.vc (revision 4123) +++ progs/common/linespec/EntityEx.Misc.vc (working copy) @@ -1,4 +1,4 @@ -//************************************************************************** +?//************************************************************************** //** //** ## ## ## ## ## #### #### ### ### //** ## ## ## ## ## ## ## ## ## ## #### ####Again.
@@ -644,205 +644,232 @@ Other = EntityEx(InOther); - // For Korax Arena - if (Other.IsTouched(self)) + if (Other) { - return !Other.bSolid && !Other.bSpecial && !Other.bShootable; - } - - if (!Other.bSolid && !Other.bSpecial && !Other.bShootable) - { - return true; - } - - // check for skulls slamming into things - if (bSkullFly && Health > 0) - { - return Slam(Other); - } - - // Check for blasted thing running into another - if (bBlasted && Other.bShootable) - { - if (!Other.bBoss && Other.bMonster) + // For Korax Arena + if (Other.IsTouched(self)) { - Other.Velocity.x += Velocity.x; - Other.Velocity.y += Velocity.y; - if ((Other.Velocity.x + Other.Velocity.y) > 3.0 * 35.0) - { - damage = (ftoi(Mass) / 100) + 1; - Other.Damage(self, self, damage); - damage = (ftoi(Other.Mass) / 100) + 1; - Damage(Other, Other, damage >> 2); - } - return false; + return !Other.bSolid && !Other.bSpecial && (!Other.bShootable || !Other.bTouchy); } - } - - // missiles can hit other things - if (bMissile) - { - // Check for a non-shootable mobj - if (Other.bNonShootable) + + if (!Other.bSolid && !Other.bSpecial && (!Other.bShootable || !Other.bTouchy)) { return true; } - // Check for passing through a ghost - if (Other.bGhost && bThruGhost) + + // touchy object is alive, toucher is solid + if (Other.bTouchy && bSolid && Other.Health > 0 && + // Thing is an armed mine or a sentient thing + (Other.bArmed || Other.IsSentient()) && + // either different classes or players + (Other.bIsPlayer || Other.Class != Class) && + // or different species if DONTHARMSPECIES + (!(Other.bDontHurtSpecies) || Other.GetSpecies() != GetSpecies()) && + // touches vertically + Other.Origin.z + Other.Height >= Origin.z && Origin.z + Height >= Other.Origin.z && + // prevents lost souls from exploding when fired by pain elementals + (Other.Master != self && Master != Other)) + // Difference with MBF: MBF hardcodes the LS/PE check and lets actors of the same species + // but different classes trigger the touchiness, but that seems less straightforwards. { + bArmed = false; // Disarm + Other.Damage(none, none, Other.Health); // kill object return true; } - if ((BounceType == BOUNCE_Doom || BounceType == BOUNCE_Hexen) && - MissileDamage == 0) + // check for skulls slamming into things + if (bSkullFly && Health > 0) { - return Target == Other || !Other.bSolid; + return Slam(Other); } - switch (SpecialMissileHit(Other)) + // Check for blasted thing running into another + if (bBlasted && Other.bShootable) { - case 0: - return false; - case 1: - return true; + if (!Other.bBoss && Other.bMonster) + { + Other.Velocity.x += Velocity.x; + Other.Velocity.y += Velocity.y; + if ((Other.Velocity.x + Other.Velocity.y) > 3.0 * 35.0) + { + damage = (ftoi(Mass) / 100) + 1; + Other.Damage(self, self, damage); + damage = (ftoi(Other.Mass) / 100) + 1; + Damage(Other, Other, damage >> 2); + } + return false; + } } - if (Target) + // missiles can hit other things + if (bMissile) { - // Don't hit same species as originator. - if (Other == Target) + // Check for a non-shootable mobj + if (Other.bNonShootable) { - // Don't missile self return true; } - // Let players missile other players. - if (!Target.bIsPlayer && !Other.bIsPlayer) + // Check for passing through a ghost + if (Other.bGhost && bThruGhost) { - int Inf = Target.GetInfighting(); - if (Inf < 0) + return true; + } + + if ((BounceType == BOUNCE_Doom || BounceType == BOUNCE_Hexen) && + MissileDamage == 0) + { + return Target == Other || !Other.bSolid; + } + + switch (SpecialMissileHit(Other)) + { + case 0: + return false; + case 1: + return true; + } + + if (Target) + { + // Don't hit same species as originator. + if (Other == Target) { - // Monsters can't hurt each other, but make exception - // depending on friendliness and hate status. - if (Target.bShootable) + // Don't missile self + return true; + } + // Let players missile other players. + if (!Target.bIsPlayer && !Other.bIsPlayer) + { + int Inf = Target.GetInfighting(); + if (Inf < 0) { - if (!Other.bMonster) + // Monsters can't hurt each other, but make exception + // depending on friendliness and hate status. + if (Target.bShootable) { - return false; - } - // Hostile monsters can always hurt each other. - if (!Other.IsHostile(Target)) - { - // The same if the shooter hates the target. - if (!Other.TID || Target.TIDToHate != Other.TID) + if (!Other.bMonster) { return false; } + // Hostile monsters can always hurt each other. + if (!Other.IsHostile(Target)) + { + // The same if the shooter hates the target. + if (!Other.TID || Target.TIDToHate != Other.TID) + { + return false; + } + } } } - } - else if (Inf == 0) - { - if (Other.IsFriend(Target)) + else if (Inf == 0) { - // Don't hurt friends. - return false; - } - if (Other.TIDToHate && Other.TIDToHate == Target.TIDToHate) - { - // Don't hurt monsters that hate the same thing as you do. - return false; - } - if (Target.GetSpecies() == Other.GetSpecies()) - { - // Don't hurt same species, but only if the target - // isn't one's hostile. - if (!Other.IsHostile(Target)) + if (Other.IsFriend(Target)) { - // Allow hurting monsters the shooter hates. - if (Other.TID == 0 || Target.TIDToHate != Other.TID) + // Don't hurt friends. + return false; + } + if (Other.TIDToHate && Other.TIDToHate == Target.TIDToHate) + { + // Don't hurt monsters that hate the same thing as you do. + return false; + } + if (Target.GetSpecies() == Other.GetSpecies()) + { + // Don't hurt same species, but only if the target + // isn't one's hostile. + if (!Other.IsHostile(Target)) { - return false; + // Allow hurting monsters the shooter hates. + if (Other.TID == 0 || Target.TIDToHate != Other.TID) + { + return false; + } } } } } } - } - if (!Other.bShootable) - { - // didn't do any damage - return !Other.bSolid; - } + if (!Other.bShootable) + { + // didn't do any damage + return !Other.bSolid; + } - // Don't hit spectres with non-sigil weapons. - if (Other.bSpectral && !bSpectral) - { - return true; - } + // Don't hit spectres with non-sigil weapons. + if (Other.bSpectral && !bSpectral) + { + return true; + } - if (bRip && !Other.bDontRip) - { - if (!Other.bNoBlood && !Other.bReflective && !Other.bInvulnerable) + if (bRip && !Other.bDontRip) { - // Ok to spawn some blood - SpawnRipperBlood(); + if (!Other.bNoBlood && !Other.bReflective && !Other.bInvulnerable) + { + // Ok to spawn some blood + SpawnRipperBlood(); + } + PlaySound('misc/ripslop', CHAN_BODY); + damage = GetMissileDamage(3, 2); + Other.Damage(self, Target, damage, DamageType); + if (Other.bPushable && !bCannotPush) + { + // Push thing + Other.Velocity.x += Velocity.x / 4.0; + Other.Velocity.y += Velocity.y / 4.0; + } + //WHAT A FUCK IS THIS??????? numspechit = 0; + return true; } - PlaySound('misc/ripslop', CHAN_BODY); - damage = GetMissileDamage(3, 2); - Other.Damage(self, Target, damage, DamageType); - if (Other.bPushable && !bCannotPush) + + // damage / explode + damage = GetMissileDamage(bStrifeDamage ? 3 : 7, 1); + if (damage > 0) { - // Push thing - Other.Velocity.x += Velocity.x / 4.0; - Other.Velocity.y += Velocity.y / 4.0; + if (bBloodSplatter && !Other.bNoBlood && !Other.bReflective && + !Other.bInvulnerable && !Other.bDormant && + !bBloodlessImpact && P_Random() < 192) + { + Other.SpawnBloodSplatter(Origin, damage); + } + Other.Damage(self, Target, damage, DamageType); } -//WHAT A FUCK IS THIS??????? numspechit = 0; - return true; + // don't traverse any more + return false; } - // damage / explode - damage = GetMissileDamage(bStrifeDamage ? 3 : 7, 1); - if (damage > 0) + if (Other.bPushable && !bCannotPush) { - if (bBloodSplatter && !Other.bNoBlood && !Other.bReflective && - !Other.bInvulnerable && !Other.bDormant && - !bBloodlessImpact && P_Random() < 192) + // Push thing + Other.Velocity.x += Velocity.x / 4.0; + Other.Velocity.y += Velocity.y / 4.0; + } + + solid = Other.bSolid && + Other.bColideWithThings && + bSolid; + + // check for special pickup + if (Other.bSpecial /*&& + Other.Origin.z < Origin.z + Height - MaxStepHeight*/) + { + if (Other.bDehackedSpecial) { - Other.SpawnBloodSplatter(Origin, damage); + Other.TouchDehackedSpecial(self); } - Other.Damage(self, Target, damage, DamageType); + else + { + Other.TouchSpecial(self); // Can remove thing + } } - // don't traverse any more - return false; - } - if (Other.bPushable && !bCannotPush) - { - // Push thing - Other.Velocity.x += Velocity.x / 4.0; - Other.Velocity.y += Velocity.y / 4.0; + return !solid; } - - solid = Other.bSolid && - Other.bColideWithThings && - bSolid; - - // check for special pickup - if (Other.bSpecial/* && - Other.Origin.z < Origin.z + Height - MaxStepHeight*/) + else { - if (Other.bDehackedSpecial) - { - Other.TouchDehackedSpecial(self); - } - else - { - Other.TouchSpecial(self); // Can remove thing - } + return true; } - - return !solid; } //==========================================================================Other cannot be none reference so there's no need to check it.
Index: source/d3d_poly.cpp =================================================================== --- source/d3d_poly.cpp (revision 4123) +++ source/d3d_poly.cpp (working copy) @@ -545,6 +545,8 @@ SetTexture(Texture1, CMap); TexStage = 1; SetTexture(Texture2, CMap); + TexStage = 1; + SetTexture(Texture1, CMap); TexStage = 0; for (i = 0; i < surf->count; i++) {No
Index: source/d3d_tex.cpp =================================================================== --- source/d3d_tex.cpp (revision 4123) +++ source/d3d_tex.cpp (working copy) @@ -222,6 +222,8 @@ RenderDevice->SetTexture(0, (LPDIRECT3DTEXTURE9)Tex->DriverData); } + RenderDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, magfilter); + RenderDevice->SetSamplerState(0, D3DSAMP_MINFILTER, minfilter); RenderDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP); RenderDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP); tex_iw = 1.0 / Tex->GetWidth();No, there's no need to set it here.