diff --git a/.github/release_template.md b/.github/release_template.md index d772d7e12..a0ac9937d 100644 --- a/.github/release_template.md +++ b/.github/release_template.md @@ -12,7 +12,12 @@ If you're having an issue with the installer program: [Manual Installation Instr If you don't know what Deus Ex Randomizer is, then here's our trailer which shows a breakdown of how it works: -v3.0 Trailer +v3.0 Trailer + +Here's a trailer for our new Halloween modes! + + +Halloween Trailer Here's a trailer for WaltonWare mode. WaltonWare mode is focused on quick wins by completing a single bingo line, and increasing difficulty after every win. The bingo goals are all scaled to their minimum settings and you start in a random area. All bingo goals will be completable within just a few maps! diff --git a/DXRBalance/DeusEx/Classes/AugHeartLung.uc b/DXRBalance/DeusEx/Classes/AugHeartLung.uc index ce109ce70..b2502e4f5 100644 --- a/DXRBalance/DeusEx/Classes/AugHeartLung.uc +++ b/DXRBalance/DeusEx/Classes/AugHeartLung.uc @@ -6,7 +6,7 @@ function PostPostBeginPlay() // description gets overwritten by language file, also DXRAugmentations reads from the default.Description default.Description = "This synthetic heart circulates not only blood but a steady concentration of mechanochemical power cells, smart phagocytes, and liposomes containing prefab diamondoid machine parts," $ " resulting in upgraded performance for all installed augmentations, but also increasing their energy use." - $ "|n|n However, this will not enhance any augmentation past its maximum upgrade level. -- Jaime Reyes "; + $ "|n|n However, not all augmentations can be enhanced past their maximum upgrade level. -- Jaime Reyes "; Description = default.Description; } diff --git a/DXRCore/DeusEx/Classes/DXRActorsBase.uc b/DXRCore/DeusEx/Classes/DXRActorsBase.uc index d445d9e95..26abeba02 100644 --- a/DXRCore/DeusEx/Classes/DXRActorsBase.uc +++ b/DXRCore/DeusEx/Classes/DXRActorsBase.uc @@ -1718,15 +1718,22 @@ function bool PositionIsSafeLenient(Vector oldloc, Actor test, Vector newloc) return _PositionIsSafeOctant(oldloc, GetCenter(test), newloc); } -function RemoveDXMoverPrePivot(#var(DeusExPrefix)Mover dxm) +function RemoveMoverPrePivot(Mover m) { local vector pivot; local rotator r; + local bool AbCollideActors, AbBlockActors, AbBlockPlayers; + + AbCollideActors = m.bCollideActors; + AbBlockActors = m.bBlockActors; + AbBlockPlayers = m.bBlockPlayers; - pivot = dxm.PrePivot >> dxm.Rotation; - dxm.BasePos = dxm.BasePos - vectm(pivot.X,pivot.Y,pivot.Z); - dxm.PrePivot=vect(0,0,0); - dxm.SetLocation(dxm.BasePos); + m.SetCollision(false,false,false); + pivot = m.PrePivot >> m.Rotation; + m.BasePos = m.BasePos - vectm(pivot.X,pivot.Y,pivot.Z); + m.PrePivot=vect(0,0,0); + m.SetLocation(m.BasePos); + m.SetCollision(AbCollideActors, AbBlockActors, AbBlockPlayers); } static function Actor GlowUp(Actor a, optional byte hue, optional byte saturation) diff --git a/DXRCore/DeusEx/Classes/DXRVersion.uc b/DXRCore/DeusEx/Classes/DXRVersion.uc index d4fbdbf40..5fd27b731 100644 --- a/DXRCore/DeusEx/Classes/DXRVersion.uc +++ b/DXRCore/DeusEx/Classes/DXRVersion.uc @@ -5,12 +5,12 @@ simulated static function CurrentVersion(optional out int major, optional out in major=3; minor=2; patch=0; - build=2;//build can't be higher than 99 + build=3;//build can't be higher than 99 } simulated static function bool VersionIsStable() { - return false; + return true; } simulated static function string VersionString(optional bool full) @@ -18,7 +18,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/DXRMapFixups/DeusEx/Classes/DXRFixupM02.uc b/DXRMapFixups/DeusEx/Classes/DXRFixupM02.uc index f3f31b622..9f3124014 100644 --- a/DXRMapFixups/DeusEx/Classes/DXRFixupM02.uc +++ b/DXRMapFixups/DeusEx/Classes/DXRFixupM02.uc @@ -28,6 +28,7 @@ function PreFirstEntryMapFixes() local Vector loc; local Teleporter tel; local DynamicTeleporter dtel; + local DynamicLight light; #ifdef injections local #var(prefix)Newspaper np; @@ -139,6 +140,14 @@ function PreFirstEntryMapFixes() buttonHint = DXRButtonHoverHint(class'DXRButtonHoverHint'.static.Create(self, "", button.Location, button.CollisionRadius+5, button.CollisionHeight+5, exit)); buttonHint.SetBaseActor(button); + //add a small light to the lower floor of the apartment. + //This helps to just put a little bit of light on the generator location + //in the case of 0 brightness boost + light = Spawn(class'DynamicLight',,, vectm(500,900,1050)); + light.LightType=LT_Steady; + light.LightBrightness=16; + light.LightRadius=10; + // fix collision with the fence https://github.com/Die4Ever/deus-ex-randomizer/issues/665 foreach AllActors(class'DeusExMover', d) { if(d.Event == 'BlewFence') break; diff --git a/DXRMapFixups/DeusEx/Classes/DXRFixupVandenberg.uc b/DXRMapFixups/DeusEx/Classes/DXRFixupVandenberg.uc index c2a1bddc3..d6c6f273c 100644 --- a/DXRMapFixups/DeusEx/Classes/DXRFixupVandenberg.uc +++ b/DXRMapFixups/DeusEx/Classes/DXRFixupVandenberg.uc @@ -233,7 +233,7 @@ function PreFirstEntryMapFixes() //Fix prepivot, since the upper door was set way off to the side. Just adjust both in the same way //so that they are centered roughly in the middle of the door - RemoveDXMoverPrePivot(door); + RemoveMoverPrePivot(door); } } AddSwitch( vect(654.545,3889.5397,-367.262), rot(0, 16384, 0), 'ShedDoor'); diff --git a/DXRMissions/DeusEx/Classes/DXRMissionsM15.uc b/DXRMissions/DeusEx/Classes/DXRMissionsM15.uc index 34c2e3f62..5eba157a7 100644 --- a/DXRMissions/DeusEx/Classes/DXRMissionsM15.uc +++ b/DXRMissions/DeusEx/Classes/DXRMissionsM15.uc @@ -183,7 +183,7 @@ function PreFirstEntryMapFixes() v=vectm(0,0,dxm.PrePivot.Z); - RemoveDXMoverPrePivot(dxm); + RemoveMoverPrePivot(dxm); //Return the Z component of the prepivot so the switches rotate on center dxm.PrePivot=v; diff --git a/DXRModules/DeusEx/Classes/DXREvents.uc b/DXRModules/DeusEx/Classes/DXREvents.uc index ce6daddb5..87e78c0cc 100644 --- a/DXRModules/DeusEx/Classes/DXREvents.uc +++ b/DXRModules/DeusEx/Classes/DXREvents.uc @@ -415,7 +415,7 @@ function SetWatchFlags() { WatchFlag('MeetWindowBum_Played'); break; case "02_NYC_SMUG": - WatchFlag('MetSmuggler'); + WatchFlag('MeetSmuggler_Played'); bt = class'BingoTrigger'.static.Create(self,'botordertrigger',vectm(0,0,0)); bt = class'BingoTrigger'.static.Create(self,'mirrordoor',vectm(0,0,0)); bt.Tag = 'mirrordoorout'; @@ -574,7 +574,7 @@ function SetWatchFlags() { bt = class'BingoTrigger'.static.Create(self,'MadeItToBP',vectm(0,0,0)); break; case "04_NYC_SMUG": - RewatchFlag('MetSmuggler'); + WatchFlag('M04MeetSmuggler_Played'); bt = class'BingoTrigger'.static.Create(self,'botordertrigger',vectm(0,0,0)); bt = class'BingoTrigger'.static.Create(self,'mirrordoor',vectm(0,0,0)); bt.Tag = 'mirrordoorout'; @@ -867,7 +867,7 @@ function SetWatchFlags() { break; case "08_NYC_SMUG": WatchFlag('M08WarnedSmuggler'); - RewatchFlag('MetSmuggler'); + WatchFlag('M08SmugglerConvos_Played'); bt = class'BingoTrigger'.static.Create(self,'botordertrigger',vectm(0,0,0)); bt = class'BingoTrigger'.static.Create(self,'mirrordoor',vectm(0,0,0)); bt.Tag = 'mirrordoorout'; @@ -2052,6 +2052,10 @@ function string RemapBingoEvent(string eventname) return "Cat_peeptime"; case "PetAnimal_BlackCat": return "PetAnimal_Cat"; + case "MeetSmuggler_Played": + case "M04MeetSmuggler_Played": + case "M08SmugglerConvos_Played": + return "MeetSmuggler"; default: return eventname; } @@ -2264,7 +2268,7 @@ static simulated function string GetBingoGoalHelpText(string event,int mission, return msg; case "JoeGreene_Dead": msg= "Kill Joe Greene, the reporter poking around in New York. "; - if (mission<=2){ + if (mission<=4){ msg=msg$"He can be found in the Underworld bar."; }else if (mission<=8){ msg=msg$"He can be found somewhere in New York after you return from Hong Kong."; @@ -2352,7 +2356,7 @@ static simulated function string GetBingoGoalHelpText(string event,int mission, return "Kill Manderley while escaping from UNATCO."; case "MadeItToBP": return "After the raid on the 'Ton hotel, escape to Gunther's roadblock in Battery Park."; - case "MetSmuggler": + case "MeetSmuggler": return "Talk to Smuggler in his Hell's Kitchen hideout."; case "SickMan_Dead": return "Kill the junkie in Battery Park who asks for someone to kill him. He is typically found near the East Coast Memorial (the eagle statue and large plaques)"; @@ -3226,7 +3230,7 @@ defaultproperties bingo_options(56)=(event="SilhouetteHostagesAllRescued",desc="Save both hostages in the catacombs",max=1,missions=1024) bingo_options(57)=(event="JosephManderley_Dead",desc="Kill Joseph Manderley",max=1,missions=32) bingo_options(58)=(event="MadeItToBP",desc="Escape to Battery Park",max=1,missions=16) - bingo_options(59)=(event="MetSmuggler",desc="Meet Smuggler",max=1,missions=276) + bingo_options(59)=(event="MeetSmuggler",desc="Meet Smuggler",max=1,missions=276) bingo_options(60)=(event="SickMan_Dead",desc="Kill the sick man who wants to die",max=1,missions=12) bingo_options(61)=(event="M06PaidJunkie",desc="Help the junkie on Tonnochi Road",max=1,missions=64) bingo_options(62)=(event="M06BoughtVersaLife",desc="Get maps of the VersaLife building",max=1,missions=64) @@ -3472,7 +3476,7 @@ defaultproperties bingo_options(283)=(event="PhoneCall",desc="Make %s phone calls",desc_singular="Make 1 phone call",max=5,missions=1916) bingo_options(284)=(event="Area51ElevatorPower",desc="Power the elevator in Area 51",max=1,missions=32768) bingo_options(285)=(event="Area51SleepingPod",desc="Open %s sleeping pods in Area 51",desc_singular="Open 1 sleeping pod in Area 51",max=4,missions=32768) - bingo_options(286)=(event="Area51SteamValve",desc="Close %s steam valves in Area 51",desc_singular="Close 1 steam valve in Area 51",max=2,missions=32768) + bingo_options(286)=(event="Area51SteamValve",desc="Close the steam valves in Area 51",max=2,missions=32768) bingo_options(287)=(event="DockyardLaser",desc="Deactivate %s laser grids under the dockyard",desc_singular="Deactivate 1 laser grid under the dockyard",max=3,missions=512) bingo_options(288)=(event="A51CommBuildingBasement",desc="Enter the basement of the Area 51 Command building",max=1,missions=32768) bingo_options(289)=(event="FreighterHelipad",desc="Walk on the helipad inside the superfreighter",max=1,missions=512) diff --git a/DXRModules/DeusEx/Classes/DXRFixup.uc b/DXRModules/DeusEx/Classes/DXRFixup.uc index 6581c8aec..cf7236c19 100644 --- a/DXRModules/DeusEx/Classes/DXRFixup.uc +++ b/DXRModules/DeusEx/Classes/DXRFixup.uc @@ -522,12 +522,27 @@ function FixFOV() function ShowTeleporters() { local #var(prefix)Teleporter t; - local bool hide; + local bool hide, collision; hide = ! class'MenuChoice_ShowTeleporters'.static.ShowTeleporters(); + switch(dxr.localURL) { + // smuggler maps are exempt from teleporter collision, since they don't need it, and it blocks the elevator's button + case "02_NYC_SMUG": + case "04_NYC_SMUG": + case "08_NYC_SMUG": + case "02_NYC_BATTERYPARK":// the hostages need to be able to get into the subway! + collision=false; + break; + default: + collision=true; + break; + } + foreach AllActors(class'#var(prefix)Teleporter', t) { - t.SetCollision( t.bCollideActors, true, t.bBlockPlayers );// don't let pawns walk through + if(t.bCollideActors && t.bEnabled) { + t.SetCollision( t.bCollideActors, collision, t.bBlockPlayers );// don't let pawns walk through + } t.bHidden = hide || !t.bCollideActors || !t.bEnabled; t.DrawScale = 0.75; } diff --git a/DXRModules/DeusEx/Classes/DXRHalloween.uc b/DXRModules/DeusEx/Classes/DXRHalloween.uc index 24c38ab96..f9cdae7f2 100644 --- a/DXRModules/DeusEx/Classes/DXRHalloween.uc +++ b/DXRModules/DeusEx/Classes/DXRHalloween.uc @@ -11,7 +11,9 @@ function PostFirstEntry() if(dxr.flags.IsHalloweenMode()) { // Mr. H is only for the Halloween game mode, but other things will instead be controlled by IsOctober(), such as cosmetic changes - class'MrH'.static.Create(self); + if(!dxr.OnTitleScreen()) { + class'MrH'.static.Create(self); + } MapFixes(); } if(IsOctober()) { diff --git a/DXRModules/DeusEx/Classes/DXRMemes.uc b/DXRModules/DeusEx/Classes/DXRMemes.uc index 9a3ea051f..d856459b7 100644 --- a/DXRModules/DeusEx/Classes/DXRMemes.uc +++ b/DXRModules/DeusEx/Classes/DXRMemes.uc @@ -849,13 +849,17 @@ function Actor ReplaceWithRandomClass(Actor old) if(#var(injectsprefix)MedicalBot(a) != None && chance_single(50)) { #var(injectsprefix)MedicalBot(a).MakeAugsOnly(); } + if(DXRJackOLantern(a) != None) { + a.SetRotation(rot(0, 16384, 0)); + a.DrawScale *= 4; + } if( a != None ) return a; } warning("ReplaceWithRandomClass("$old$") failed"); return None; } -const num_random_actor_classes = 549; +const num_random_actor_classes = 551; function string GetRandomActorClass() { @@ -883,8 +887,13 @@ function ExtendedTests() r = num_random_actor_classes; s = _GetRandomActorClass(r); teststring(s, "", "_GetRandomActorClass(" $ r $ ") is empty string, " $ s); - s = _GetRandomActorClass(r-1); - test(s!="", "_GetRandomActorClass(" $ (r - 1) $ ") is not empty string, " $ s); + + r--; + s = _GetRandomActorClass(r); + test(s!="", "_GetRandomActorClass(" $ r $ ") is not empty string, " $ s); + + s = _GetRandomActorClass(0); + test(s!="", "_GetRandomActorClass(0) is not empty string, " $ s); } function string _GetRandomActorClass(int r) @@ -892,6 +901,9 @@ function string _GetRandomActorClass(int r) local int i; // DXRando classes + if(r==i++) return "#var(package).MrH"; + //if(r=i++) return "#var(package).Spiderweb"; // doesn't look good + if(r==i++) return "#var(package).DXRJackOLantern"; if(r==i++) return "#var(package).DeathMarker"; if(r==i++) return "#var(package).BarDancer"; if(r==i++) return "#var(package).FrenchGray"; diff --git a/DXRModules/DeusEx/Classes/DXRMissions.uc b/DXRModules/DeusEx/Classes/DXRMissions.uc index 6a4ef0909..52094fadc 100644 --- a/DXRModules/DeusEx/Classes/DXRMissions.uc +++ b/DXRModules/DeusEx/Classes/DXRMissions.uc @@ -651,6 +651,7 @@ function MoveGoalToLocation(Goal g, GoalLocation Loc) local ScriptedPawn sp; local string result; local DXRGoalMarker marker; + local #var(DeusExPrefix)Mover dxm; result = g.name $ " to " $ Loc.name; info("Moving " $ result $ " (" $ Loc.mapName @ Loc.positions[0].pos $")"); @@ -681,6 +682,14 @@ function MoveGoalToLocation(Goal g, GoalLocation Loc) if(ElectronicDevices(a) != None) ElectronicDevices(a).ItemName = g.name; MoveActor(a, Loc.positions[i].pos, Loc.positions[i].rot, g.actors[i].physics); + + //If actor was a mover, make it have dynamic lighting so it looks right + dxm = #var(DeusExPrefix)Mover(a); + if (dxm!=None){ + dxm.bDynamicLightMover=False;//very quickly disable + dxm.bDynamicLightMover=True; //Make lighting apply properly + } + } if( (Loc.bitMask & SITTING_GOAL) != 0) { diff --git a/DXRModules/DeusEx/Classes/DXRStartMap.uc b/DXRModules/DeusEx/Classes/DXRStartMap.uc index 3dc53a524..7b1c439f8 100644 --- a/DXRModules/DeusEx/Classes/DXRStartMap.uc +++ b/DXRModules/DeusEx/Classes/DXRStartMap.uc @@ -690,6 +690,7 @@ function PreFirstEntryStartMapFixes(#var(PlayerPawn) player, FlagBase flagbase, case 95: GiveKey(player, 'EngineRoomDoor', "Below Decks key"); + MarkConvPlayed("DL_ShipEntry", bFemale); // find a way to get below decks break; case 115: diff --git a/DXRando/DeusEx/Classes/DXRFashionManager.uc b/DXRando/DeusEx/Classes/DXRFashionManager.uc index 897c3eeb7..23cb3dea4 100644 --- a/DXRando/DeusEx/Classes/DXRFashionManager.uc +++ b/DXRando/DeusEx/Classes/DXRFashionManager.uc @@ -78,12 +78,21 @@ simulated function static DXRFashionManager GiveItem(#var(PlayerPawn) p) f.isFemale=p.flagBase.GetBool('LDDPJCIsFemale'); clothesLooting = bool(p.flagBase.GetInt('Rando_clothes_looting')); f.InitClothes(!clothesLooting); - p.RemoveObjectFromBelt(f); //Now that it has an icon, it ends up on the belt... log("spawned new " $ f $ " for " $ p); } + p.RemoveObjectFromBelt(f); //Now that it has an icon, it ends up on the belt sometimes... return f; } +event TravelPreAccept() +{ + Super.TravelPreAccept(); + + //Just make sure it doesn't end up on your belt, for real + bInObjectBelt=False; + beltPos=-1; +} + function Mesh ModelFromOutfitGender(EOutfitType type, bool female) { switch(type){ @@ -143,6 +152,7 @@ function InitClothes(bool giveAll) IngestCarcass(class'#var(prefix)ScientistMaleCarcass'); IngestCarcass(class'#var(prefix)ScientistFemaleCarcass'); IngestCarcass(class'#var(prefix)BartenderCarcass'); + IngestCarcass(class'#var(prefix)SandraRentonCarcass'); IngestCarcass(class'#var(prefix)JordanSheaCarcass'); IngestCarcass(class'#var(prefix)MaxChenCarcass'); IngestCarcass(class'#var(prefix)MaggieChowCarcass'); @@ -937,6 +947,7 @@ simulated function bool IngestCarcass(class<#var(DeusExPrefix)Carcass> carcassCl defaultproperties { + bCanUseObjectBelt=false bDisplayableInv=false ItemName="DXRFashionManager" bHidden=true diff --git a/DXRando/DeusEx/Classes/EndgameQuoteManager.uc b/DXRando/DeusEx/Classes/EndgameQuoteManager.uc index a910d2ed3..c1f9a3240 100644 --- a/DXRando/DeusEx/Classes/EndgameQuoteManager.uc +++ b/DXRando/DeusEx/Classes/EndgameQuoteManager.uc @@ -185,6 +185,13 @@ function LoadQuotes() AddQuote("THIS MEETING BETWEEN YOU AND I IS THE CULMINATION OF THOUSANDS OF YEARS OF B-BALL. THIS IS B-BALL IN ALL ITS GLORY, THIS IS THE FINAL GAME! IT'S JUST YOU AND ME, BARKLEY. NO REFS. NO WHISTLES. NO RULES. JUST YOU, ME, AND SWEET GEORGIA BROWN.","MICHAEL JORDAN"); AddQuote("I AM THE BEGINNING AND THE END. THE ALPHA AND THE OMEGA. THE FIRST AND THE LAST.","CHARLES BARKLEY"); + //Fallout: New Vegas + AddQuote("SUCCESS DEPENDS ON FORETHOUGHT, DISPASSIONATE CALCULATION OF PROBABILITIES, ACCOUNTING FOR EVERY STRAY VARIABLE.", "ROBERT EDWIN HOUSE"); + AddQuote("I HAVEN'T SHOWN MY HAND - I'VE SHOWN ONE CARD. I'VE GIVEN MY ENEMIES A SINGLE, PROVOCATIVE DATUM UPON WHICH TO FIXATE. THEY HAVE NO IDEA WHAT OTHER CARDS I'M HOLDING. IT'S A STRONG HAND, BELIEVE ME - I DEALT IT TO MYSELF.", "ROBERT EDWIN HOUSE"); + AddQuote("THEY ASKED ME HOW WELL I UNDERSTOOD THEORETICAL PHYSICS. I SAID I HAD A THEORETICAL DEGREE IN PHYSICS. THEY SAID WELCOME ABOARD.", "FANTASTIC"); + AddQuote("THE GAME WAS RIGGED FROM THE START.", "BENNY"); + AddQuote("WE SHALL SEE HOW BRAVE YOU ARE WHEN NAILED TO THE WALLS OF HOOVER DAM, YOUR BODY FACING WEST SO YOU MAY WATCH YOUR WORLD DIE.", "LEGATE LANIUS"); + log("EndgameQuoteManager loaded "$numQuotes$" endgame quotes"); } diff --git a/DeusEx.u b/DeusEx.u index 7b1a9bb77..e4b9b0801 100644 Binary files a/DeusEx.u and b/DeusEx.u differ diff --git a/GMDXRandomizer.u b/GMDXRandomizer.u index 13cd410cc..8884542fe 100644 Binary files a/GMDXRandomizer.u and b/GMDXRandomizer.u differ diff --git a/HXRandomizer.u b/HXRandomizer.u index 7069dc763..c6209569b 100644 Binary files a/HXRandomizer.u and b/HXRandomizer.u differ diff --git a/README.md b/README.md index 889bd1cbf..eba5be079 100644 --- a/README.md +++ b/README.md @@ -6,14 +6,17 @@ This is a mod for the original Deus Ex that takes everything and shuffles it all * [for Vanilla, Lay D Denton, GMDX, Revision, HX co-op, and Vanilla? Madder.](https://github.com/Die4Ever/deus-ex-randomizer/releases/latest) -#### If the game is not running well, even for vanilla Deus Ex, [see the recommended tweaks here.](https://github.com/Die4Ever/deus-ex-randomizer/wiki/Installation-Instructions-and-performance-tweaks#recommended-tweaks-for-running-deus-ex-on-modern-computers) - ## Trailers If you don't know what Deus Ex Randomizer is, then here's our trailer which shows a breakdown of how it works: -v3.0 Trailer +v3.0 Trailer + +Here's a trailer for our new Halloween modes! + + +Halloween Trailer Here's a trailer for WaltonWare mode. WaltonWare mode is focused on quick wins by completing a single bingo line, and increasing difficulty after every win. The bingo goals are all scaled to their minimum settings and you start in a random area. All bingo goals will be completable within just a few maps! @@ -54,28 +57,22 @@ Here's a trailer for WaltonWare mode. WaltonWare mode is focused on quick wins b * New Game+ - after beating the game play it again keeping your items, skills, and augs, but with increased difficulty and a new seed * Takes away 1 random augmentation, and 1 of your weapons * Takes away half your skill points and 5 random skill levels, so the player has to choose which ones to level up first -* New game modes! [(Wiki page)](https://github.com/Die4Ever/deus-ex-randomizer/wiki/Game-Modes) +* New game modes! See the [(Wiki page)](https://github.com/Die4Ever/deus-ex-randomizer/wiki/Game-Modes) for a full list! * WaltonWare mode - A quick option to get into the game without the time commitment of the full game! You start in a random mission and win by completing one bingo. As New Game+ keeps making it harder, see how fast you can complete them or how many you can complete! - * WaltonWare Entrance Rando - both modes combined! * Zero Rando - great for first-time Deus Ex players to benefit from the bug fixes, QoL improvements, and balance changes we've made, without any randomization. - * Zero Rando Plus - similar to Zero Rando, but with a few more of our balance changes. - * DXRVanillaFixer: This one is for the purists. Use our new installer program and it will do compatibility fixes for the vanilla game (Kentie's Launcher, D3D10, DXVK, Engine.dll fix, and more), then just run DeusEx.exe as normal and the gameplay will be unchanged but with high frame rates and resolutions! + * Vanilla Fixer: This one is for the purists. Use our new installer program and it will do compatibility fixes for the vanilla game (Kentie's Launcher, D3D10, DXVK, Engine.dll fix, and more), then just run DeusEx.exe as normal and the gameplay will be unchanged but with high frame rates and resolutions! * Randomizer Lite - randomizes some things without interfering with the immersion and mood of the game. Great for players who haven't played Deus Ex in a long time, or if you're intimidated by the full Randomizer. - * Randomizer Medium - similar to Randomizer Lite but with more randomization features enabled by default. Remember you can tweak the settings in the Advanced menu to play with any randomization level you want. * Serious Sam mode - same as the normal game but with 10x as many enemies. The player has increased health and takes reduced damage to compensate. - * Speedrun mode - speedrun with fewer resets while still being able to enjoy higher difficulties. And a built in splits viewer! * Entrance Randomization - changes what level each teleporter takes you to, but keeps it within the same mission * Horde Mode - fight for your life to see how long you can survive in the Paris Cathedral -* Challenge mode loadouts! [(Wiki page)](https://github.com/Die4Ever/deus-ex-randomizer/wiki/Loadouts) + * Various [Halloween modes](https://www.youtube.com/watch?v=FbzNkWJXZ1o) that add some survival horror mechanics! +* Challenge mode loadouts! See the [(Wiki page)](https://github.com/Die4Ever/deus-ex-randomizer/wiki/Loadouts) for a full list! * Stick With the Prod Pure means the only weapon you get is the stun prod (hint: throw a crate straight up into the air to break it) * Stick With the Prod Plus also allows EMP grenades, gas grenades, scramble grenades, pepper gun, and tranq darts * Ninja JC - the only weapons allowed are throwing knives, swords, pepper spray, grenades, knife, and mini-crossbow. You also get a Ninja Augmentation which gives you speed and stealth at the same time. * Don't Give Me the GEP Gun - bans the GEP gun * Freeman Mode - only weapon allowed is the crowbar * Grenades Only - * No Pistols - for people who think the pistol is OP - * No Swords - for people who think the sword and Dragon's Tooth Sword are OP - * No Overpowered Weapons - bans pistols, swords, and the GEP Gun * By the Book - bans lockpicks and multitools * Explosives Only * If you opt-in to Online Features (which is disabled by default, check the Rando menu) diff --git a/RevRandomizer.u b/RevRandomizer.u index 7413fa47a..07ed4438d 100644 Binary files a/RevRandomizer.u and b/RevRandomizer.u differ diff --git a/VMDRandomizer.u b/VMDRandomizer.u index 966f72fa5..1fa2bbd32 100644 Binary files a/VMDRandomizer.u and b/VMDRandomizer.u differ