diff --git a/.github/release_template.md b/.github/release_template.md index f1dee2c9e..015e5c302 100644 --- a/.github/release_template.md +++ b/.github/release_template.md @@ -1,4 +1,4 @@ -Download `DXRandoInstaller.zip` in the Assets section under the changelog. +Download `DXRandoInstaller.exe` in the Assets section under the changelog. If you're having an issue with the installer program: [Manual Installation Instructions for Vanilla, Lay D Denton, GMDX, Revision, HX co-op, and Vanilla? Madder.](https://github.com/Die4Ever/deus-ex-randomizer/wiki/Installation-Instructions-and-performance-tweaks) @@ -27,4 +27,4 @@ If you don't know what Deus Ex Randomizer is, then here's our old trailer which * -Download `DXRandoInstaller.zip` in the Assets section right below this line: +Download `DXRandoInstaller.exe` in the Assets section right below this line: diff --git a/DXRBalance/DeusEx/Classes/AugDisplayWindow.uc b/DXRBalance/DeusEx/Classes/AugDisplayWindow.uc index 1b127e805..ff3049013 100644 --- a/DXRBalance/DeusEx/Classes/AugDisplayWindow.uc +++ b/DXRBalance/DeusEx/Classes/AugDisplayWindow.uc @@ -96,7 +96,7 @@ function bool ShouldDrawActor(Actor A) if(A.bHidden) return false; - if( visionLevel >= 2 && (Inventory(A) != None || InformationDevices(A) != None || ElectronicDevices(A) != None || Containers(A) != None || Vehicles(A) != None) ) + if( Inventory(A) != None || InformationDevices(A) != None || ElectronicDevices(A) != None || Containers(A) != None || Vehicles(A) != None ) return true; if(!A.bVisionImportant) @@ -287,6 +287,7 @@ function DrawTargetAugmentation(GC gc) local string str,teleDest; local float x,y,h,w, boxCX,boxCY; local DynamicTeleporter dynTele; + local int show_teleporters; gc.SetFont(Font'FontMenuSmall_DS'); //This font is so much better for everything @@ -297,7 +298,10 @@ function DrawTargetAugmentation(GC gc) Player.Weapon = oldWeapon; // check 500 feet in front of the player - tgtTeleporter = TraceTeleporter(8000,AimLocation); + show_teleporters = int(Player.ConsoleCommand("get #var(package).MenuChoice_ShowTeleporters show_teleporters")); + if(show_teleporters > 1) { + tgtTeleporter = TraceTeleporter(8000,AimLocation); + } // display teleporter destinations if (tgtTeleporter!=None && tgtTeleporter.URL!="") diff --git a/DXRCore/DeusEx/Classes/DXRVersion.uc b/DXRCore/DeusEx/Classes/DXRVersion.uc index 1951de8cb..d7bfbe930 100644 --- a/DXRCore/DeusEx/Classes/DXRVersion.uc +++ b/DXRCore/DeusEx/Classes/DXRVersion.uc @@ -5,7 +5,7 @@ simulated static function CurrentVersion(optional out int major, optional out in major=2; minor=5; patch=2; - build=6;//build can't be higher than 99 + build=11;//build can't be higher than 99 } simulated static function string VersionString(optional bool full) @@ -13,7 +13,7 @@ simulated static function string VersionString(optional bool full) local int major,minor,patch,build; local string status; - status = "Beta"; + status = ""; if(status!="") { status = " " $ status; diff --git a/DXRFixes/DeusEx/Classes/Carcass2.uc b/DXRFixes/DeusEx/Classes/Carcass2.uc index c9f52af71..beaebed88 100644 --- a/DXRFixes/DeusEx/Classes/Carcass2.uc +++ b/DXRFixes/DeusEx/Classes/Carcass2.uc @@ -7,6 +7,9 @@ var(Display) mesh Mesh3; // mesh for floating carcass simulated function PreBeginPlay() { - SetMesh2(Mesh2); - SetMesh3(Mesh3); + Super.PreBeginPlay(); + if(Mesh2 != None) + SetMesh2(Mesh2); + if(Mesh3 != None) + SetMesh3(Mesh3); } diff --git a/DXRFixes/DeusEx/Classes/ElectricityEmitter.uc b/DXRFixes/DeusEx/Classes/ElectricityEmitter.uc index 1a0608c76..0b88d038c 100644 --- a/DXRFixes/DeusEx/Classes/ElectricityEmitter.uc +++ b/DXRFixes/DeusEx/Classes/ElectricityEmitter.uc @@ -48,7 +48,7 @@ function CalcTrace(float deltaTime) //Scale damage for the player, since they get a combat difficulty multiplier //This helps with the Vandenberg computer room, the electricity in the Aquinas Substation //and the Hong Kong Helibase (and many more) - if (HitActor.IsA('#var(PlayerPawn)')){ + if (HitActor.IsA('#var(PlayerPawn)') && damageAmt > 0){ damageAmt = Clamp(damageAmount / (#var(PlayerPawn)(HitActor).CombatDifficulty),1,damageAmount); } diff --git a/DXRMapFixups/DeusEx/Classes/DXRFixupParis.uc b/DXRMapFixups/DeusEx/Classes/DXRFixupParis.uc index 686a03777..459366129 100644 --- a/DXRMapFixups/DeusEx/Classes/DXRFixupParis.uc +++ b/DXRMapFixups/DeusEx/Classes/DXRFixupParis.uc @@ -167,27 +167,29 @@ function AnyEntryMapFixes() switch(dxr.localURL) { case "10_PARIS_CATACOMBS": - // spawn Le Merchant with a hazmat suit because there's no guarantee of one before the highly radioactive area - // we need to do this in AnyEntry because we need to recreate the conversation objects since they're transient - npcs = DXRNPCs(dxr.FindModule(class'DXRNPCs')); - if(npcs != None) { - sp = npcs.CreateForcedMerchant("Le Merchant", 'lemerchant', vectm(-3209.483154, 5190.826172,1199.610352), rotm(0, -10000, 0, 16384), class'#var(prefix)HazMatSuit'); - m = Merchant(sp); - if (m!=None){ // CreateForcedMerchant returns None if he already existed, but we still need to call it to recreate the conversation since those are transient - m.MakeFrench(); + if(!dxr.flags.IsReducedRando()) { + // spawn Le Merchant with a hazmat suit because there's no guarantee of one before the highly radioactive area + // we need to do this in AnyEntry because we need to recreate the conversation objects since they're transient + npcs = DXRNPCs(dxr.FindModule(class'DXRNPCs')); + if(npcs != None) { + sp = npcs.CreateForcedMerchant("Le Merchant", 'lemerchant', vectm(-3209.483154, 5190.826172,1199.610352), rotm(0, -10000, 0, 16384), class'#var(prefix)HazMatSuit'); + m = Merchant(sp); + if (m!=None){ // CreateForcedMerchant returns None if he already existed, but we still need to call it to recreate the conversation since those are transient + m.MakeFrench(); + } + } + // give him weapons to defend himself + dxre = DXREnemies(dxr.FindModule(class'DXREnemies')); + if(dxre != None && sp != None) { + sp.bKeepWeaponDrawn = true; + GiveItem(sp, class'#var(prefix)WineBottle'); + dxre.RandomizeSP(sp, 100); + RemoveFears(sp); + sp.ChangeAlly('Player', 0.0, false); + sp.MaxProvocations = 0; + sp.AgitationSustainTime = 3600; + sp.AgitationDecayRate = 0; } - } - // give him weapons to defend himself - dxre = DXREnemies(dxr.FindModule(class'DXREnemies')); - if(dxre != None && sp != None) { - sp.bKeepWeaponDrawn = true; - GiveItem(sp, class'#var(prefix)WineBottle'); - dxre.RandomizeSP(sp, 100); - RemoveFears(sp); - sp.ChangeAlly('Player', 0.0, false); - sp.MaxProvocations = 0; - sp.AgitationSustainTime = 3600; - sp.AgitationDecayRate = 0; } break; case "10_PARIS_CATACOMBS_TUNNELS": diff --git a/DXRMapFixups/DeusEx/Classes/DXRFixupVandenberg.uc b/DXRMapFixups/DeusEx/Classes/DXRFixupVandenberg.uc index 2a841470e..81b633f70 100644 --- a/DXRMapFixups/DeusEx/Classes/DXRFixupVandenberg.uc +++ b/DXRMapFixups/DeusEx/Classes/DXRFixupVandenberg.uc @@ -155,16 +155,16 @@ function PreFirstEntryMapFixes() RemoveFears(hs); hs.MinHealth = 0; hs.BaseAccuracy *= 0.1; + GiveItem(hs, class'#var(prefix)BallisticArmor'); - if(!dxr.flags.IsReducedRando()) { - dxre = DXREnemies(dxr.FindModule(class'DXREnemies')); - if(dxre != None) { - dxre.GiveRandomWeapon(hs, false, 2); - dxre.GiveRandomMeleeWeapon(hs); - } - hs.FamiliarName = "Howard Stronger"; - hs.UnfamiliarName = "Howard Stronger"; + dxre = DXREnemies(dxr.FindModule(class'DXREnemies')); + if(dxre != None) { + dxre.GiveRandomWeapon(hs, false, 2); + dxre.GiveRandomMeleeWeapon(hs); } + hs.FamiliarName = "Howard Stronger"; + hs.UnfamiliarName = "Howard Stronger"; + if(!#defined(vmd)) {// vmd allows AI to equip armor, so maybe he doesn't need the health boost? SetPawnHealth(hs, 200); } diff --git a/DXRModules/DeusEx/Classes/DXRAugmentations.uc b/DXRModules/DeusEx/Classes/DXRAugmentations.uc index 439737509..c1541a19e 100644 --- a/DXRModules/DeusEx/Classes/DXRAugmentations.uc +++ b/DXRModules/DeusEx/Classes/DXRAugmentations.uc @@ -303,7 +303,7 @@ simulated function RandoAug(Augmentation a) add_desc = "DXRando: Activating this aug instantly burns 1 energy in order to prevent abuse. "; } else if( #var(prefix)AugVision(a) != None ) { - add_desc = "DXRando: At level 1 you can see characters and goals. At level 2 you can also see items, datacubes, vehicles, crates, and electronic devices. "; + add_desc = "DXRando: You can see characters, goals, items, datacubes, vehicles, crates, and electronic devices through walls. "; } else if( #var(prefix)AugLight(a) != None ) { add_desc = "DXRando: The light is much brighter and doesn't use any energy. "; diff --git a/DXRModules/DeusEx/Classes/DXRAutosave.uc b/DXRModules/DeusEx/Classes/DXRAutosave.uc index cfd82666c..24a6a0352 100644 --- a/DXRModules/DeusEx/Classes/DXRAutosave.uc +++ b/DXRModules/DeusEx/Classes/DXRAutosave.uc @@ -2,6 +2,8 @@ class DXRAutosave extends DXRActorsBase transient; var transient bool bNeedSave; var config float save_delay; +var transient float save_timer; +var transient int autosave_combat; const Disabled = 0; const FirstEntry = 1; @@ -11,18 +13,25 @@ const ExtraSafe = 4; function CheckConfig() { - if( ConfigOlderThan(2,5,0,9) ) { - save_delay = 0.7; + if( ConfigOlderThan(2,5,2,9) ) { + save_delay = 0.1; } Super.CheckConfig(); + autosave_combat = int(ConsoleCommand("get #var(package).MenuChoice_AutosaveCombat autosave_combat")); } -function PostFirstEntry() +function BeginPlay() { - Super.PostFirstEntry(); - l("PostFirstEntry() " $ dxr.dxInfo.MissionNumber); + Super.BeginPlay(); + Disable('Tick'); +} + +function PreFirstEntry() +{ + Super.PreFirstEntry(); + l("PreFirstEntry() " $ dxr.dxInfo.MissionNumber); if( dxr.dxInfo != None && dxr.dxInfo.MissionNumber > 0 && dxr.dxInfo.MissionNumber < 98 && dxr.flags.autosave > 0 ) { - bNeedSave=true; + NeedSave(); } } @@ -31,20 +40,60 @@ function ReEntry(bool IsTravel) Super.ReEntry(IsTravel); l("ReEntry() " $ dxr.dxInfo.MissionNumber); if( dxr.dxInfo != None && dxr.dxInfo.MissionNumber > 0 && dxr.dxInfo.MissionNumber < 98 && dxr.flags.autosave>=EveryEntry && dxr.flags.autosave != Hardcore && IsTravel ) { - bNeedSave=true; + NeedSave(); } } function PostAnyEntry() { - if( bNeedSave ) - SetTimer(save_delay, True); + if(bNeedSave) + NeedSave(); +} + +function NeedSave() +{ + bNeedSave = true; + save_timer = save_delay; + Enable('Tick'); + if(autosave_combat>0 || !PawnIsInCombat(player())) + SetGameSpeed(0); +} + +function SetGameSpeed(float s) +{ + local MissionScript mission; + + s = FMax(s, 0.01);// ServerSetSloMo only goes down to 0.1 + if(s == Level.Game.GameSpeed) return; + Level.Game.GameSpeed = s; + Level.TimeDilation = s; + Level.Game.SetTimer(s, true); + Level.Game.SaveConfig(); + Level.Game.GameReplicationInfo.SaveConfig(); + + // we need the mission script to clear PlayerTraveling + if(s <= 0.1) s /= 2;// might as well run the timer faster? + foreach AllActors(class'MissionScript', mission) { + mission.SetTimer(mission.checkTime * s, true); + } } -function Timer() +function Tick(float delta) { - if( bNeedSave ) - doAutosave(); + delta /= Level.Game.GameSpeed; + delta = FClamp(delta, 0.01, 0.05);// a single slow frame should not expire the timer by itself + save_timer -= delta; + if(bNeedSave) { + if(save_timer <= 0) { + doAutosave(); + } + } + else if(save_timer <= 0) { + SetGameSpeed(1); + Disable('Tick'); + } else { + SetGameSpeed(0); + } } static function bool AllowManualSaves(DeusExPlayer player) @@ -66,6 +115,8 @@ function doAutosave() local int lastMission; local bool isDifferentMission; + save_timer = save_delay; + if( dxr == None ) { info("dxr == None, doAutosave() not saving yet"); return; @@ -82,8 +133,9 @@ function doAutosave() p = player(); - if(PawnIsInCombat(p)) { + if(autosave_combat<=0 && PawnIsInCombat(p)) { info("waiting for Player to be out of combat, not saving yet"); + SetGameSpeed(1); return; } @@ -115,10 +167,11 @@ function doAutosave() dxr.flags.f.SetInt('Rando_lastmission', dxr.dxInfo.MissionNumber,, 999); info("doAutosave() " $ lastMission @ dxr.dxInfo.MissionNumber @ saveSlot @ saveName @ p.GetStateName() @ save_delay); - SetTimer(0, False); bNeedSave = false; + SetGameSpeed(1); class'DXRStats'.static.IncDataStorageStat(p, "DXRStats_autosaves"); p.SaveGame(saveSlot, saveName); + SetGameSpeed(0); if( interruptedDL != None ) { p.dataLinkPlay = interruptedDL; diff --git a/DXRModules/DeusEx/Classes/DXREnemies.uc b/DXRModules/DeusEx/Classes/DXREnemies.uc index 26da62ad3..7492bda15 100644 --- a/DXRModules/DeusEx/Classes/DXREnemies.uc +++ b/DXRModules/DeusEx/Classes/DXREnemies.uc @@ -291,7 +291,7 @@ function CheckHelmet(ScriptedPawn p) // that way the game gets harder as you progress to enemies that typically have helmets if(#defined(injections)) // visors only work in vanilla due to our change in ScriptedPawn, so leave the chance to 0 for other mods - visor_chance = dxr.flags.settings.enemystats / 2; + visor_chance = dxr.flags.settings.enemystats / 3; // augs shouldn't get visors that cover their face if(NSFCloneAugStealth1(p) != None || NSFCloneAugTough1(p) != None || NSFCloneAugShield1(p) != None diff --git a/DXRModules/DeusEx/Classes/DXREvents.uc b/DXRModules/DeusEx/Classes/DXREvents.uc index fcc70998b..bd8669d7c 100644 --- a/DXRModules/DeusEx/Classes/DXREvents.uc +++ b/DXRModules/DeusEx/Classes/DXREvents.uc @@ -445,13 +445,18 @@ function SetWatchFlags() { bt = class'BingoTrigger'.static.Create(self,'WanChaiStores',vectm(-6,-1416,40),250,40); //Butcher (Louis Pan works for him too) bt.Tag='WanChaiButcher'; bt.bDestroyOthers=False; - bt = class'BingoTrigger'.static.Create(self,'WanChaiStores',vectm(910,-643,40),150,40); //News Stand - bt.Tag='WanChaiNews'; - bt.bDestroyOthers=False; - bt = class'BingoTrigger'.static.Create(self,'WanChaiStores',vectm(632,-532,40),130,40); //Flower Shop - bt.Tag='WanChaiFlowers'; - bt.bDestroyOthers=False; - + if (RevisionMaps){ + bt = class'BingoTrigger'.static.Create(self,'WanChaiStores',vectm(1040,-266,40),100,40); //Souvenir Shop + bt.Tag='WanChaiSouvenir'; + bt.bDestroyOthers=False; + } else { + bt = class'BingoTrigger'.static.Create(self,'WanChaiStores',vectm(910,-643,40),150,40); //News Stand + bt.Tag='WanChaiNews'; + bt.bDestroyOthers=False; + bt = class'BingoTrigger'.static.Create(self,'WanChaiStores',vectm(632,-532,40),130,40); //Flower Shop + bt.Tag='WanChaiFlowers'; + bt.bDestroyOthers=False; + } break; case "06_HONGKONG_TONGBASE": @@ -607,12 +612,15 @@ function SetWatchFlags() { starr.bImportant = true;// you're important to me starr.BindName = "Starr"; } - - bt = class'BingoTrigger'.static.Create(self,'Cremation',vectm(-2983.597168,774.217407,312.100128),70,40); - bt.MakeClassProximityTrigger(class'#var(prefix)ChefCarcass'); - bt = class'BingoTrigger'.static.Create(self,'Cremation',vectm(-2984.404785,662.764954,312.100128),70,40); - bt.MakeClassProximityTrigger(class'#var(prefix)ChefCarcass'); - + if(RevisionMaps){ + bt = class'BingoTrigger'.static.Create(self,'Cremation',vectm(217,-5306,328),50,40); + bt.MakeClassProximityTrigger(class'#var(prefix)ChefCarcass'); + } else { + bt = class'BingoTrigger'.static.Create(self,'Cremation',vectm(-2983.597168,774.217407,312.100128),70,40); + bt.MakeClassProximityTrigger(class'#var(prefix)ChefCarcass'); + bt = class'BingoTrigger'.static.Create(self,'Cremation',vectm(-2984.404785,662.764954,312.100128),70,40); + bt.MakeClassProximityTrigger(class'#var(prefix)ChefCarcass'); + } break; case "10_PARIS_CLUB": WatchFlag('CamilleConvosDone'); @@ -657,15 +665,27 @@ function SetWatchFlags() { case "11_PARIS_CATHEDRAL": WatchFlag('GuntherKillswitch'); WatchFlag('DL_gold_found_Played'); - bt = class'BingoTrigger'.static.Create(self,'Cremation',vectm(2019,-2256,-704),20,15); - bt.MakeClassProximityTrigger(class'#var(prefix)ChefCarcass'); - bt = class'BingoTrigger'.static.Create(self,'Cremation',vectm(2076.885254,-3248.189941,-704.369995),20,15); - bt.MakeClassProximityTrigger(class'#var(prefix)ChefCarcass'); - bt = class'BingoTrigger'.static.Create(self,'Cremation',vectm(1578,-2286,-647),50,40); - bt.MakeClassProximityTrigger(class'#var(prefix)ChefCarcass'); - bt = class'BingoTrigger'.static.Create(self,'CathedralUnderwater',vectm(771,-808,-706),500,180); + if (RevisionMaps){ + bt = class'BingoTrigger'.static.Create(self,'CathedralUnderwater',vectm(2614,-2103,-120),500,180); + bt = class'BingoTrigger'.static.Create(self,'Cremation',vectm(3811,-3200,-64),20,15); + bt.MakeClassProximityTrigger(class'#var(prefix)ChefCarcass'); + bt = class'BingoTrigger'.static.Create(self,'Cremation',vectm(3869,-4256,-64),20,15); + bt.MakeClassProximityTrigger(class'#var(prefix)ChefCarcass'); + bt = class'BingoTrigger'.static.Create(self,'Cremation',vectm(3387,-3233,-7.9),50,40); + bt.MakeClassProximityTrigger(class'#var(prefix)ChefCarcass'); + bt = class'BingoTrigger'.static.Create(self,'Cremation',vectm(4100,-3469,-6.9),50,40); + bt.MakeClassProximityTrigger(class'#var(prefix)ChefCarcass'); + } else { + bt = class'BingoTrigger'.static.Create(self,'CathedralUnderwater',vectm(771,-808,-706),500,180); + bt = class'BingoTrigger'.static.Create(self,'Cremation',vectm(2019,-2256,-704),20,15); + bt.MakeClassProximityTrigger(class'#var(prefix)ChefCarcass'); + bt = class'BingoTrigger'.static.Create(self,'Cremation',vectm(2076.885254,-3248.189941,-704.369995),20,15); + bt.MakeClassProximityTrigger(class'#var(prefix)ChefCarcass'); + bt = class'BingoTrigger'.static.Create(self,'Cremation',vectm(1578,-2286,-647),50,40); + bt.MakeClassProximityTrigger(class'#var(prefix)ChefCarcass'); + } bt = class'BingoTrigger'.static.Create(self,'secretdoor01',vectm(0,0,0)); foreach AllActors(class'#var(prefix)DataLinkTrigger',dlt){ @@ -2320,7 +2340,7 @@ static simulated function string GetBingoGoalHelpText(string event,int mission) case "JockSecondStory": return "Buy two beers from Jordan Shea and give them to Jock in the Underworld bar."; case "M07ChenSecondGive_Played": - return "After the triad meeting in the temple, meet the leaders in the Lucky Money and receive the gifted bottles of wine from each Dragon Head."; + return "After the triad meeting in the temple, meet the leaders in the Lucky Money and receive all the gifted bottles of wine from each Dragon Head."; case "DeBeersDead": return "Kill Lucius DeBeers in Everett's House. You can do so either by destroying him or shutting off his bio support with the computer next to him"; case "StantonAmbushDefeated": diff --git a/DXRModules/DeusEx/Classes/DXRFixup.uc b/DXRModules/DeusEx/Classes/DXRFixup.uc index 70f05bd5a..9962a57e6 100644 --- a/DXRModules/DeusEx/Classes/DXRFixup.uc +++ b/DXRModules/DeusEx/Classes/DXRFixup.uc @@ -65,7 +65,7 @@ function CheckConfig() i=0; DecorationsOverwrites[i].type = "CrateUnbreakableLarge"; DecorationsOverwrites[i].bInvincible = false; - DecorationsOverwrites[i].HitPoints = 2000; + DecorationsOverwrites[i].HitPoints = 500; DecorationsOverwrites[i].minDamageThreshold = 0; c = class(GetClassFromString(DecorationsOverwrites[i].type, class'DeusExDecoration')); DecorationsOverwrites[i].bFlammable = c.default.bFlammable; @@ -142,7 +142,6 @@ function AnyEntry() { local #var(prefix)Vehicles v; local #var(prefix)Button1 b; - local #var(prefix)Teleporter t; Super.AnyEntry(); l( "mission " $ dxr.dxInfo.missionNumber @ dxr.localURL$" AnyEntry()"); @@ -151,6 +150,7 @@ function AnyEntry() FixSamCarter(); FixCleanerBot(); FixRevisionJock(); + FixRevisionDecorativeInventory(); SetSeed( "DXRFixup AnyEntry missions" ); if(#defined(mapfixes)) AnyEntryMapFixes(); @@ -170,8 +170,19 @@ function AnyEntry() if(v.CollisionRadius > 360) v.SetCollisionSize(360, v.CollisionHeight); } + + ShowTeleporters(); +} + +function ShowTeleporters() +{ + local #var(prefix)Teleporter t; + local int show_teleporters; + + show_teleporters = int(ConsoleCommand("get #var(package).MenuChoice_ShowTeleporters show_teleporters")); + foreach AllActors(class'#var(prefix)Teleporter', t) { - t.bHidden = !(t.bCollideActors && t.bEnabled); + t.bHidden = !(t.bCollideActors && t.bEnabled && show_teleporters>0); t.DrawScale = 0.75; } } @@ -350,6 +361,20 @@ function FixRevisionJock() #endif } +function FixRevisionDecorativeInventory() +{ +#ifdef revision + local Inventory i; + + foreach AllActors(class'Inventory',i){ + if (i.CollisionRadius==0 && i.CollisionHeight==0){ + log("Making "$i$" grabbable by restoring it's original collision size"); + i.SetCollisionSize(i.default.CollisionRadius,i.default.CollisionHeight); + } + } +#endif +} + function FixCleanerBot() { local CleanerBot cb; @@ -379,11 +404,14 @@ simulated function FixLogTimeout(#var(PlayerPawn) p) } } -simulated function FixInventory(#var(PlayerPawn) p) +simulated function bool FixInventory(#var(PlayerPawn) p) { local Inventory item, nextItem; local DXRLoadouts loadouts; + local int slots[64], x, y;// leave room for up to an 8x8 inventory + local bool good; + good = true; loadouts = DXRLoadouts(dxr.FindModule(class'DXRLoadouts')); for(item=p.Inventory; item!=None; item=nextItem) { @@ -396,7 +424,22 @@ simulated function FixInventory(#var(PlayerPawn) p) item.BecomeItem(); item.SetLocation(p.Location); item.SetBase(p); + + if(!item.bDisplayableInv) continue;// don't check for inventory overlap + if(item.invPosX < 0 || item.invPosY < 0) continue; + + for(x = item.invPosX; x < item.invPosX + item.invSlotsX; x++) { + for(y = item.invPosY; y < item.invPosY + item.invSlotsY; y++) { + if(slots[x*8 + y] > 0) { + err("inventory overlap at (" $ x $ ", " $ y $ ") " $ item); + good = false; + } + slots[x*8 + y]++; + } + } } + + return good; } function OverwriteDecorations() diff --git a/DXRModules/DeusEx/Classes/DXRFlags.uc b/DXRModules/DeusEx/Classes/DXRFlags.uc index c46380c71..f48c0ac12 100644 --- a/DXRModules/DeusEx/Classes/DXRFlags.uc +++ b/DXRModules/DeusEx/Classes/DXRFlags.uc @@ -375,7 +375,7 @@ function CheckConfig() difficulty_settings[i].passwordsrandomized = 100; difficulty_settings[i].infodevices = 100; difficulty_settings[i].enemiesrandomized = 50; - difficulty_settings[i].enemystats = 100; + difficulty_settings[i].enemystats = 90; difficulty_settings[i].hiddenenemiesrandomized = 50; difficulty_settings[i].enemiesshuffled = 100; difficulty_settings[i].enemies_nonhumans = 80; diff --git a/DXRModules/DeusEx/Classes/DXRHints.uc b/DXRModules/DeusEx/Classes/DXRHints.uc index a4303bec9..60273bd50 100644 --- a/DXRModules/DeusEx/Classes/DXRHints.uc +++ b/DXRModules/DeusEx/Classes/DXRHints.uc @@ -59,7 +59,7 @@ simulated function InitHints() AddHint("Use everything at your disposal, like TNT crates.", "Randomizer makes this even more of a strategy/puzzle game."); AddHint("A vending machine can provide you with 20 health worth of food.", "Eat up!"); AddHint("Pepper spray and fire extinguishers can incapacitate an enemy", "letting you sneak past them."); - AddHint("The large metal crates are now destructible.", "They have 2000 hp."); + AddHint("The large metal crates are now destructible.", "They have 500 hp."); if(!dxr.flags.IsZeroRando()) AddHint("Make sure to read the descriptions for skills, augs, and items.", "Randomizer adds some extra info."); if(dxr.flags.settings.min_weapon_dmg != dxr.flags.settings.max_weapon_dmg || dxr.flags.settings.min_weapon_shottime != dxr.flags.settings.max_weapon_shottime) diff --git a/DXRModules/DeusEx/Classes/DXRStats.uc b/DXRModules/DeusEx/Classes/DXRStats.uc index b90b4421a..e400e5a3e 100644 --- a/DXRModules/DeusEx/Classes/DXRStats.uc +++ b/DXRModules/DeusEx/Classes/DXRStats.uc @@ -657,7 +657,7 @@ function TestScoring() testint(dxr.flags.ScoreFlags(), 12080, "score bonus for Extreme"); dxr.flags.SetDifficulty(4); - testint(dxr.flags.ScoreFlags(), 13795, "score bonus for Impossible"); + testint(dxr.flags.ScoreFlags(), 13745, "score bonus for Impossible"); names[num] = "1 Million Points!"; scores[num++] = 1000000; diff --git a/DXRVanilla/DeusEx/Classes/DataLinkPlay.uc b/DXRVanilla/DeusEx/Classes/DataLinkPlay.uc index b9c981022..d6840ba50 100644 --- a/DXRVanilla/DeusEx/Classes/DataLinkPlay.uc +++ b/DXRVanilla/DeusEx/Classes/DataLinkPlay.uc @@ -2,6 +2,7 @@ class DataLinkPlay injects DataLinkPlay; var transient float speechFastEndTime; var transient bool restarting; +var DataLinkTrigger dataLinkTriggerQueue[16]; function bool PushDataLink( Conversation queueCon ) { @@ -146,6 +147,40 @@ Begin: Goto('Idle'); } +// fix for issue with getting overwritten even when failing to play, then calling datalinkTrigger.DatalinkFinished() with the wrong datalinkTrigger +// https://www.youtube.com/clip/UgkxHMQ1A0QuuXX9TURsxzDU5BF632aDr1cm +// https://discord.com/channels/823629359931195394/823629734457114654/1145385071721840660 +function SetTrigger(DataLinkTrigger newDatalinkTrigger) +{ + local int i; + + for(i=0; i