diff --git a/.github/run-tests/action.yml b/.github/run-tests/action.yml index 5417d8198..32ca9ceb3 100644 --- a/.github/run-tests/action.yml +++ b/.github/run-tests/action.yml @@ -13,39 +13,39 @@ runs: # download launchers - run: mkdir installer/3rdParty shell: bash - # https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/tree/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/Alternative%20EXEs + # https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/tree/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/Alternative%20EXEs - run: >- curl -Lo installer/3rdParty/KentieDeusExe.exe - "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/Alternative%20EXEs/Kentie's%20DeusExe.exe" + "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/Alternative%20EXEs/Kentie's%20DeusExe.exe" shell: bash - run: >- curl -Lo installer/3rdParty/DeusExe.u - "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/DeusExe.u" + "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/DeusExe.u" shell: bash - run: >- curl -Lo installer/3rdParty/Launch.exe - "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/Alternative%20EXEs/Launch.exe" + "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/Alternative%20EXEs/Launch.exe" shell: bash # download D3D9 - run: >- curl -Lo installer/3rdParty/D3D9Drv.dll - "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/D3D9Drv.dll" + "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/D3D9Drv.dll" shell: bash #- run: >- # curl -Lo installer/3rdParty/D3D9Drv.hut - # "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/D3D9Drv.hut" + # "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/D3D9Drv.hut" # shell: bash #- run: >- # curl -Lo installer/3rdParty/D3D9Drv.int - # "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/D3D9Drv.int" + # "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/D3D9Drv.int" # shell: bash - # download and extract OpenGL 2.0 https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/tree/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/CommunityUpdateFileArchiveDXPC/OpenGL + # download and extract OpenGL 2.0 https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/tree/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/CommunityUpdateFileArchiveDXPC/OpenGL - run: >- curl -Lo dxglr21.zip - "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/CommunityUpdateFileArchiveDXPC/OpenGL/dxglr21.zip" + "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/CommunityUpdateFileArchiveDXPC/OpenGL/dxglr21.zip" shell: bash - run: unzip dxglr21.zip shell: bash @@ -58,67 +58,67 @@ runs: - run: >- curl -Lo installer/3rdParty/D3D10Drv.int - "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/D3D10Drv.int" + "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/D3D10Drv.int" shell: bash - run: >- curl -Lo installer/3rdParty/d3d10drv.dll - "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv.dll" + "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv.dll" shell: bash - run: >- curl -Lo installer/3rdParty/d3d10drv/common.fxh - "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/common.fxh" + "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/common.fxh" shell: bash - run: >- curl -Lo installer/3rdParty/d3d10drv/complexsurface.fx - "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/complexsurface.fx" + "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/complexsurface.fx" shell: bash - run: >- curl -Lo installer/3rdParty/d3d10drv/finalpass.fx - "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/finalpass.fx" + "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/finalpass.fx" shell: bash - run: >- curl -Lo installer/3rdParty/d3d10drv/firstpass.fx - "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/firstpass.fx" + "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/firstpass.fx" shell: bash - run: >- curl -Lo installer/3rdParty/d3d10drv/fogsurface.fx - "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/fogsurface.fx" + "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/fogsurface.fx" shell: bash - run: >- curl -Lo installer/3rdParty/d3d10drv/gouraudpolygon.fx - "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/gouraudpolygon.fx" + "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/gouraudpolygon.fx" shell: bash - run: >- curl -Lo installer/3rdParty/d3d10drv/hdr.original.fx - "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/hdr%20(original).fx" + "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/hdr%20(original).fx" shell: bash - run: >- curl -Lo installer/3rdParty/d3d10drv/hdr.fx - "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/hdr.fx" + "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/hdr.fx" shell: bash - run: >- curl -Lo installer/3rdParty/d3d10drv/polyflags.fxh - "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/polyflags.fxh" + "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/polyflags.fxh" shell: bash - run: >- curl -Lo installer/3rdParty/d3d10drv/postprocessing.fxh - "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/postprocessing.fxh" + "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/postprocessing.fxh" shell: bash - run: >- curl -Lo installer/3rdParty/d3d10drv/states.fxh - "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/states.fxh" + "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/states.fxh" shell: bash - run: >- curl -Lo installer/3rdParty/d3d10drv/tile.fx - "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/tile.fx" + "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/tile.fx" shell: bash - run: >- curl -Lo installer/3rdParty/d3d10drv/unreal_pom.fx - "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/unreal_pom.fx" + "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/unreal_pom.fx" shell: bash - run: >- curl -Lo installer/3rdParty/d3d10drv/unrealpool.fxh - "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/master/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/unrealpool.fxh" + "https://github.com/Defaultplayer001/Deus-Ex-Universe-Community-Update-/raw/a662f6ed177dba52ad3a0d8141fa2ac72f8af034/%5B1.0%5D%20Deus%20Ex%20-%20Windows-Linux-macOS-Android/DXCU%20Installer%20Source/Mods/Community%20Update/System/d3d10drv/unrealpool.fxh" shell: bash # LDDP minimal install diff --git a/BingoDisplay.py b/BingoDisplay.py index 1df37e683..c42e9fc74 100644 --- a/BingoDisplay.py +++ b/BingoDisplay.py @@ -42,7 +42,7 @@ def __init__(self,targetFile): self.selectedMod="" self.prevLines=None self.bingoLineMatch = re.compile( - r'bingoexport\[(?P\d+)\]=\(Event="(?P.*)",Desc="(?P.*)",Progress=(?P\d+),Max=(?P\d+),Active=(?P\d+)\)', + r'bingoexport\[(?P\d+)\]=\(Event="(?P.*)",Desc="(?P.*)",Progress=(?P\d+),Max=(?P\d+),Active=(?P-?\d+)\)', re.IGNORECASE ) self.initDrawnBoard() @@ -147,7 +147,7 @@ def parseBingoLine(self,bingoLine): bingoMatches=self.bingoLineMatch.match(bingoLine) if (bingoMatches==None): return - + bingoNumber=int(bingoMatches.group('key')) bingoCoord = self.bingoNumberToCoord(bingoNumber) @@ -216,6 +216,8 @@ def generateBingoStateJson(self): square = dict() square["x"]=x square["y"]=y + if self.board[x][y]==None: + return {} square["name"]=self.board[x][y]["desc"] if self.board[x][y]["max"]>1: square["name"]+="\n"+str(self.board[x][y]["progress"])+"/"+str(self.board[x][y]["max"]) @@ -265,11 +267,17 @@ def getDefaultPath(): Path.home() /'.local'/'share'/'Steam'/'steamapps'/'compatdata'/'6910'/'pfx'/'drive_c'/'users'/'steamuser'/'Documents'/'Deus Ex'/'System', Path.home() /'.local'/'share'/'Steam'/'steamapps'/'common'/'Deus Ex'/'System', ] - p:Path + + modified_times = {} for p in checks: f:Path = p / "DXRBingo.ini" if f.exists(): - return p + modified_times[p] = os.path.getmtime(f) + sorted_paths = sorted(modified_times.keys(), key=lambda f: modified_times[f]) + + if len(sorted_paths) > 0: + return sorted_paths[-1] + p:Path for p in checks: if p.is_dir(): return p diff --git a/DXRBalance/DeusEx/Classes/BalancePlayer.uc b/DXRBalance/DeusEx/Classes/BalancePlayer.uc index bd8c313cc..1b540bfad 100644 --- a/DXRBalance/DeusEx/Classes/BalancePlayer.uc +++ b/DXRBalance/DeusEx/Classes/BalancePlayer.uc @@ -280,6 +280,8 @@ function CatchFire( Pawn burner ) simulated function DrugEffects(float deltaTime) { local float olddrugEffectTimer; + local DeusExRootWindow root; + local bool wasActive; // set a cap on the effect strength separately from the duration olddrugEffectTimer = drugEffectTimer; @@ -288,9 +290,25 @@ simulated function DrugEffects(float deltaTime) // calculate duration myself drugEffectTimer = FMin(olddrugEffectTimer, 120.0 ); + wasActive = (drugEffectTimer>0); drugEffectTimer -= deltaTime * 1.5; - if (drugEffectTimer < 0) + if (drugEffectTimer < 0) { drugEffectTimer = 0; + if (wasActive){ + //This theoretically fixes the issue where the game stays zoomed in + //after being drunk until you switch what's in your hands + root = DeusExRootWindow(rootWindow); + if ((root != None) && (root.hud != None)) + { + if (root.hud.background != None) + { + root.hud.SetBackground(None); + root.hud.SetBackgroundStyle(DSTY_Normal); + DesiredFOV = Default.DesiredFOV; + } + } + } + } } // ---------------------------------------------------------------------- diff --git a/DXRBalance/DeusEx/Classes/Fish.uc b/DXRBalance/DeusEx/Classes/Fish.uc new file mode 100644 index 000000000..c7388e44d --- /dev/null +++ b/DXRBalance/DeusEx/Classes/Fish.uc @@ -0,0 +1,6 @@ +class DXRFish injects #var(prefix)Fish; + +defaultproperties +{ + Health=1 +} diff --git a/DXRBalance/DeusEx/Classes/Fish2.uc b/DXRBalance/DeusEx/Classes/Fish2.uc new file mode 100644 index 000000000..4d7d9e981 --- /dev/null +++ b/DXRBalance/DeusEx/Classes/Fish2.uc @@ -0,0 +1,6 @@ +class DXRFish2 injects #var(prefix)Fish2; + +defaultproperties +{ + Health=1 +} diff --git a/DXRBalance/DeusEx/Classes/Pigeon.uc b/DXRBalance/DeusEx/Classes/Pigeon.uc new file mode 100644 index 000000000..5ed689673 --- /dev/null +++ b/DXRBalance/DeusEx/Classes/Pigeon.uc @@ -0,0 +1,6 @@ +class DXRPigeon injects #var(prefix)Pigeon; + +defaultproperties +{ + Health=1 +} diff --git a/DXRBalance/DeusEx/Classes/Rat.uc b/DXRBalance/DeusEx/Classes/Rat.uc new file mode 100644 index 000000000..6fab9bf47 --- /dev/null +++ b/DXRBalance/DeusEx/Classes/Rat.uc @@ -0,0 +1,6 @@ +class DXRRat injects #var(prefix)Rat; + +defaultproperties +{ + Health=1 +} diff --git a/DXRBalance/DeusEx/Classes/Seagull.uc b/DXRBalance/DeusEx/Classes/Seagull.uc new file mode 100644 index 000000000..0d69c7819 --- /dev/null +++ b/DXRBalance/DeusEx/Classes/Seagull.uc @@ -0,0 +1,6 @@ +class DXRSeagull injects #var(prefix)Seagull; + +defaultproperties +{ + Health=1 +} diff --git a/DXRCore/DeusEx/Classes/DXRActorsBase.uc b/DXRCore/DeusEx/Classes/DXRActorsBase.uc index e84eb05e2..10e8bbb1c 100644 --- a/DXRCore/DeusEx/Classes/DXRActorsBase.uc +++ b/DXRCore/DeusEx/Classes/DXRActorsBase.uc @@ -245,7 +245,14 @@ static function Inventory GiveExistingItem(Pawn p, Inventory item, optional int if( pickup.bCanHaveMultipleCopies && pickup.NumCopies < pickup.MaxCopies ) { pickup.NumCopies++; item.Destroy(); + if( player != None ) + player.UpdateBeltText(pickup); return pickup; + } else if (pickup.bCanHaveMultipleCopies && pickup.NumCopies >= pickup.MaxCopies) { + //Player has some, but can't get more. Don't try to pick it up or set them as the base. + //Disown the player entirely, otherwise if they try to pick it up again, it will follow them + item.SetOwner(None); + return item; } } } @@ -262,6 +269,7 @@ static function Inventory GiveExistingItem(Pawn p, Inventory item, optional int if( player != None ) { player.FrobTarget = item; + item.SetOwner(None);// just in case the right click fails player.ParseRightClick(); } else { item.GiveTo(p); @@ -926,9 +934,10 @@ static function SetActorScale(Actor a, float scale) { local Vector newloc; + scale *= a.DrawScale; newloc = a.Location + ( (a.CollisionHeight*scale - a.CollisionHeight*a.DrawScale) * vect(0,0,1) ); + a.SetCollisionSize(a.CollisionRadius / a.DrawScale * scale, a.CollisionHeight / a.DrawScale * scale); a.SetLocation(newloc); - a.SetCollisionSize(a.CollisionRadius, a.CollisionHeight / a.DrawScale * scale); a.DrawScale = scale; } diff --git a/DXRCore/DeusEx/Classes/DXRMenuSetupRando.uc b/DXRCore/DeusEx/Classes/DXRMenuSetupRando.uc index b94f6f7ce..738051b1d 100644 --- a/DXRCore/DeusEx/Classes/DXRMenuSetupRando.uc +++ b/DXRCore/DeusEx/Classes/DXRMenuSetupRando.uc @@ -25,7 +25,7 @@ function BindControls(optional string action) } //Make sure the starting map values match those in DXRStartMap - NewMenuItem("Starting Map", "What level you will start in"); + NewMenuItem("Starting Map", "What level you will start in."); EnumOption("Liberty Island", 0, f.settings.starting_map); EnumOption("NSF Generator", 20, f.settings.starting_map); EnumOption("Hunting Lebedev", 30, f.settings.starting_map); @@ -54,12 +54,12 @@ function BindControls(optional string action) BreakLine(); #ifndef hx - NewMenuItem("", "Randomize starting locations on certain maps"); + NewMenuItem("", "Randomize starting locations on certain maps."); EnumOption("Randomize Starting Locations", 100, f.settings.startinglocations); EnumOption("Unchanged Starting Locations", 0, f.settings.startinglocations); #endif - NewMenuItem("", "Randomize goal locations on certain maps"); + NewMenuItem("", "Randomize goal locations on certain maps."); EnumOption("Randomize Goal Locations", 100, f.settings.goals); EnumOption("Unchanged Goal Locations", 0, f.settings.goals); @@ -72,7 +72,7 @@ function BindControls(optional string action) NewMenuItem("Dancing %", "How many characters should be dancing."); Slider(f.settings.dancingpercent, 0, 100); - NewMenuItem("Spoiler Buttons", "Allow the use of spoiler buttons (Spoilers remain hidden until you choose to view them)"); + NewMenuItem("Spoiler Buttons", "Allow the use of spoiler buttons (Spoilers remain hidden until you choose to view them)."); EnumOption("Available", 1, f.settings.spoilers); EnumOption("Disallowed", 0, f.settings.spoilers); @@ -82,13 +82,13 @@ function BindControls(optional string action) NewGroup("Bingo"); - NewMenuItem("Bingo Win", "How many completed lines to instantly win"); + NewMenuItem("Bingo Win", "How many completed lines to instantly win."); Slider(f.settings.bingo_win, 0, 12); NewMenuItem("Bingo Scale %", "How difficult should bingo goals be?"); Slider(f.bingo_scale, 0, 100); - NewMenuItem("Bingo Freespace", "Should the center be a Free Space, or even more Free Spaces"); + NewMenuItem("Bingo Freespace", "Should the center be a Free Space, or even more Free Spaces?"); EnumOption("Enabled", 1, f.settings.bingo_freespaces); EnumOption("Disabled", 0, f.settings.bingo_freespaces); EnumOption("2 Free Spaces", 2, f.settings.bingo_freespaces); @@ -106,36 +106,39 @@ function BindControls(optional string action) NewGroup("Medical Bots and Repair Bots"); - NewMenuItem("Medbots", "Percentage chance for a medbot to spawn in a map (vanilla is about 14%)"); + NewMenuItem("Medbots", "Percentage chance for a medbot to spawn in a map (vanilla is about 14%)."); Slider(f.settings.medbots, -1, 100); - NewMenuItem("Repair Bots", "Percentage chance for a repair bot to spawn in a map (vanilla is about 14%)"); + NewMenuItem("Augbots", "Percentage chance for a zero-heals medbot to spawn in a map if a regular one doesn't."); + Slider(f.moresettings.empty_medbots, 0, 100); + + NewMenuItem("Repair Bots", "Percentage chance for a repair bot to spawn in a map (vanilla is about 14%)."); Slider(f.settings.repairbots, -1, 100); if(!#defined(vmd)) { - NewMenuItem("Medbot Uses", "Number of times you can use an individual medbot to heal"); + NewMenuItem("Medbot Uses", "Number of times you can use an individual medbot to heal."); Slider(f.settings.medbotuses, 0, 10); - NewMenuItem("Repair Bot Uses", "Number of times you can use an individual repair bot to restore energy"); + NewMenuItem("Repair Bot Uses", "Number of times you can use an individual repair bot to restore energy."); Slider(f.settings.repairbotuses, 0, 10); } - NewMenuItem("Medbot Cooldowns", "Individual: Each Medbot has its own healing cooldown."$BR$"Global: All Medbots have the same cooldown"); + NewMenuItem("Medbot Cooldowns", "Individual: Each Medbot has its own healing cooldown."$BR$"Global: All Medbots have the same cooldown."); EnumOption("Unchanged", 0, f.settings.medbotcooldowns); EnumOption("Individual", 1, f.settings.medbotcooldowns); EnumOption("Global", 2, f.settings.medbotcooldowns); - NewMenuItem("Repair Bot Cooldowns", "Individual: Each Repair Bot has its own charge cooldown."$BR$"Global: All Repair Bots have the same cooldown"); + NewMenuItem("Repair Bot Cooldowns", "Individual: Each Repair Bot has its own charge cooldown."$BR$"Global: All Repair Bots have the same cooldown."); EnumOption("Unchanged", 0, f.settings.repairbotcooldowns); EnumOption("Individual", 1, f.settings.repairbotcooldowns); EnumOption("Global", 2, f.settings.repairbotcooldowns); - NewMenuItem("Medbot Heal Amount", "Individual: Each Medbot has its own healing amount."$BR$"Global: All Medbots have the same amount"); + NewMenuItem("Medbot Heal Amount", "Individual: Each Medbot has its own healing amount."$BR$"Global: All Medbots have the same amount."); EnumOption("Unchanged", 0, f.settings.medbotamount); EnumOption("Individual", 1, f.settings.medbotamount); EnumOption("Global", 2, f.settings.medbotamount); - NewMenuItem("Repair Bot Charge Amount", "Individual: Each Repair Bot has its own charge amount."$BR$"Global: All Repair Bots have the same amount"); + NewMenuItem("Repair Bot Charge Amount", "Individual: Each Repair Bot has its own charge amount."$BR$"Global: All Repair Bots have the same amount."); EnumOption("Unchanged", 0, f.settings.repairbotamount); EnumOption("Individual", 1, f.settings.repairbotamount); EnumOption("Global", 2, f.settings.repairbotamount); @@ -228,7 +231,7 @@ function BindControls(optional string action) NewMenuItem("Non-Human Chance %", "Reduce the chance of new enemies being non-humans."); Slider(f.settings.enemies_nonhumans, 0, 100); - NewMenuItem("Enemy Respawn Seconds", "(Beta) How many seconds for enemies to respawn. Leave blank or 0 to disable"); + NewMenuItem("Enemy Respawn Seconds", "(Beta) How many seconds for enemies to respawn. Leave blank or 0 to disable."); Slider(f.settings.enemyrespawn, 0, 10000); NewMenuItem("Move Turrets", "Randomizes locations of turrets, cameras, and security computers for them."); @@ -237,11 +240,11 @@ function BindControls(optional string action) NewMenuItem("Add Turrets", "Randomly adds turrets, cameras, and security computers for them."); Slider(f.settings.turrets_add, 0, 10000); - NewMenuItem("", "Allow robots to get randomized weapons"); + NewMenuItem("", "Allow robots to get randomized weapons."); EnumOption("Unchanged Robot Weapons", 0, f.settings.bot_weapons); EnumOption("Random Robot Weapons", 4, f.settings.bot_weapons); - NewMenuItem("", "Allow non-humans to get randomized stats"); + NewMenuItem("", "Allow non-humans to get randomized stats."); EnumOption("Unchanged Non-human Stats", 0, f.settings.bot_stats); EnumOption("Random Non-human Stats", 100, f.settings.bot_stats); @@ -300,7 +303,7 @@ function BindControls(optional string action) NewMenuItem("Medkit Drops %", "Make medkits more scarce."); Slider(f.settings.medkits, 0, 100); - NewMenuItem("Starting Equipment", "How many random items you start with"); + NewMenuItem("Starting Equipment", "How many random items you start with."); Slider(f.settings.equipment, 0, 10); NewMenuItem("Swap Items %", "The chance for item positions to be swapped."); @@ -342,6 +345,19 @@ function BindControls(optional string action) NewMenuItem("Aug Strength Rando %", "How much to randomize the strength of augmentations."); Slider(f.settings.aug_value_rando, 0, 100);// this is a wet/dry scale, 0 to 100% + NewGroup("New Game+"); + + NewMenuItem("Scaling %", "Scales the curve of New Game+ changes over successive loops."); + Slider(f.moresettings.newgameplus_curve_scalar, 0, 200); + NewMenuItem("Max Item Carryover", "Maximum number of the same item that can carry over between loops, not including stackable items."); + Slider(f.newgameplus_max_item_carryover, 0, 30); + NewMenuItem("Skill Downgrades", "Number of skill level downgrades per loop."); + Slider(f.newgameplus_num_skill_downgrades, 0, 33); + NewMenuItem("Augmentations Removed", "Number of augmentations removed per loop."); + Slider(f.newgameplus_num_removed_augs, 0, 8); + NewMenuItem("Weapons Removed", "Number of weapons removed per loop."); + Slider(f.newgameplus_num_removed_weapons, 0, 18); + if( action == "NEXT" ) _InvokeNewGameScreen(combatDifficulty, InitDxr()); if( action == "RANDOMIZE" ) RandomizeOptions(f); } diff --git a/DXRCore/DeusEx/Classes/DXRVersion.uc b/DXRCore/DeusEx/Classes/DXRVersion.uc index 893a57a05..824ae4420 100644 --- a/DXRCore/DeusEx/Classes/DXRVersion.uc +++ b/DXRCore/DeusEx/Classes/DXRVersion.uc @@ -4,7 +4,7 @@ simulated static function CurrentVersion(optional out int major, optional out in { major=2; minor=5; - patch=5; + patch=6; build=6;//build can't be higher than 99 } diff --git a/DXRCore/DeusEx/Classes/DXRando.uc b/DXRCore/DeusEx/Classes/DXRando.uc index 7fbf3d253..93485108b 100644 --- a/DXRCore/DeusEx/Classes/DXRando.uc +++ b/DXRCore/DeusEx/Classes/DXRando.uc @@ -22,6 +22,10 @@ var transient bool runPostFirstEntry; var transient bool bTickEnabled;// bTickEnabled is just for DXRandoTests to inspect var transient bool bLoginReady; +#ifdef revision +var transient bool RevisionMaps; +#endif + replication { reliable if( Role==ROLE_Authority ) @@ -90,6 +94,10 @@ function DXRInit() if(Player == None) return; +#ifdef revision + RevisionMaps = class'DXRMapVariants'.static.IsRevisionMaps(Player,true); +#endif + flagbase = Player.FlagBase; #ifdef hx flagbase = HXGameInfo(Level.Game).Steve.FlagBase; diff --git a/DXRFixes/DeusEx/Classes/Containers.uc b/DXRFixes/DeusEx/Classes/Containers.uc new file mode 100644 index 000000000..9dc8f5666 --- /dev/null +++ b/DXRFixes/DeusEx/Classes/Containers.uc @@ -0,0 +1,14 @@ +class DXRContainers injects #var(prefix)Containers; + +//Only drop the contents when the health is 0 to prevent crate content duping +//by carrying through level transitions. +function Destroyed() +{ + if (HitPoints<=0){ + //Normal "Containers" Destroyed behaviour, including dropping items + Super.Destroyed(); + } else { + //DeusExDecoration won't drop items for Containers + Super(#var(DeusExPrefix)Decoration).Destroyed(); + } +} diff --git a/DXRFixes/DeusEx/Classes/TrashPaper.uc b/DXRFixes/DeusEx/Classes/TrashPaper.uc new file mode 100644 index 000000000..de2ac65b3 --- /dev/null +++ b/DXRFixes/DeusEx/Classes/TrashPaper.uc @@ -0,0 +1,6 @@ +class DXRTrashPaper injects #var(prefix)TrashPaper; + +defaultproperties +{ + FragType=Class'DeusEx.PaperFragment' +} diff --git a/DXRMapFixups/DeusEx/Classes/DXRFixupM01.uc b/DXRMapFixups/DeusEx/Classes/DXRFixupM01.uc index 0b432aa74..e3cdc9603 100644 --- a/DXRMapFixups/DeusEx/Classes/DXRFixupM01.uc +++ b/DXRMapFixups/DeusEx/Classes/DXRFixupM01.uc @@ -122,9 +122,12 @@ function AnyEntryMapFixes() local name conName; local string afterTextLine; + // if you can talk to gunther then obviously he's been rescued DeleteConversationFlag(GetConversation('GuntherRescued'), 'GuntherFreed', true); //Cut out the dialog for Paul giving you equipment + if(dxr.flags.IsReducedRando()) return; // but not in reduced rando + c = GetConversation('MeetPaul'); ce = c.eventList; diff --git a/DXRMapFixups/DeusEx/Classes/DXRFixupM02.uc b/DXRMapFixups/DeusEx/Classes/DXRFixupM02.uc index 6cfd5621c..1305f8c89 100644 --- a/DXRMapFixups/DeusEx/Classes/DXRFixupM02.uc +++ b/DXRMapFixups/DeusEx/Classes/DXRFixupM02.uc @@ -14,6 +14,9 @@ function PreFirstEntryMapFixes() local #var(prefix)TAD tad; local #var(prefix)FishGenerator fg; local #var(prefix)PigeonGenerator pg; + local bool RevisionMaps; + local bool VanillaMaps; + #ifdef injections local #var(prefix)Newspaper np; local class<#var(prefix)Newspaper> npClass; @@ -26,87 +29,94 @@ function PreFirstEntryMapFixes() npClass = class'DXRInformationDevices'; #endif + RevisionMaps = class'DXRMapVariants'.static.IsRevisionMaps(player()); + VanillaMaps = class'DXRMapVariants'.static.IsVanillaMaps(player()); + switch (dxr.localURL) { -#ifdef vanillamaps case "02_NYC_BATTERYPARK": - foreach AllActors(class'BarrelAmbrosia', ambrosia) { - foreach RadiusActors(class'Trigger', t, 16, ambrosia.Location) { - if(t.CollisionRadius < 100) - t.SetCollisionSize(t.CollisionRadius*2, t.CollisionHeight*2); + if (VanillaMaps){ + foreach AllActors(class'BarrelAmbrosia', ambrosia) { + foreach RadiusActors(class'Trigger', t, 16, ambrosia.Location) { + if(t.CollisionRadius < 100) + t.SetCollisionSize(t.CollisionRadius*2, t.CollisionHeight*2); + } } - } - foreach AllActors(class'NYPoliceBoat',b) { - b.BindName = "NYPoliceBoat"; - b.ConBindEvents(); - } - foreach AllActors(class'DeusExMover', d) { - if( d.Name == 'DeusExMover19' ) { - d.KeyIDNeeded = 'ControlRoomDoor'; + foreach AllActors(class'NYPoliceBoat',b) { + b.BindName = "NYPoliceBoat"; + b.ConBindEvents(); } + foreach AllActors(class'DeusExMover', d) { + if( d.Name == 'DeusExMover19' ) { + d.KeyIDNeeded = 'ControlRoomDoor'; + } + } + foreach AllActors(class'Terrorist',nsf,'ShantyTerrorist'){ + nsf.Tag = 'ShantyTerrorists'; //Restores voice lines when NSF still alive (still hard to have happen though) + } + k = Spawn(class'#var(prefix)NanoKey',,, vectm(1574.209839, -238.380142, 339.215179)); + k.KeyID = 'ControlRoomDoor'; + k.Description = "Control Room Door Key"; + if(dxr.flags.settings.keysrando > 0) + GlowUp(k); + + fg=Spawn(class'#var(prefix)FishGenerator',,, vectm(-1274,-3892,177));//Near Boat dock + fg.ActiveArea=2000; } - foreach AllActors(class'Terrorist',nsf,'ShantyTerrorist'){ - nsf.Tag = 'ShantyTerrorists'; //Restores voice lines when NSF still alive (still hard to have happen though) - } - k = Spawn(class'#var(prefix)NanoKey',,, vectm(1574.209839, -238.380142, 339.215179)); - k.KeyID = 'ControlRoomDoor'; - k.Description = "Control Room Door Key"; - if(dxr.flags.settings.keysrando > 0) - GlowUp(k); - - fg=Spawn(class'#var(prefix)FishGenerator',,, vectm(-1274,-3892,177));//Near Boat dock - fg.ActiveArea=2000; break; case "02_NYC_WAREHOUSE": - npClass.static.SpawnInfoDevice(self,class'#var(prefix)NewspaperOpen',vectm(1700.929810,-519.988037,57.729870),rotm(0,0,0),'02_Newspaper06'); //Joe Greene article, table in room next to break room (near bathrooms) - npClass.static.SpawnInfoDevice(self,class'#var(prefix)NewspaperOpen',vectm(-1727.644775,2479.614990,1745.724976),rotm(0,0,0),'02_Newspaper06'); //Next to apartment(?) door on rooftops, near elevator - - //Remove the small boxes in the sewers near the ladder so that bigger boxes don't shuffle into those spots - foreach AllActors(class'DeusExMover',d,'DrainGrate'){break;} - foreach d.RadiusActors(class'#var(prefix)BoxSmall',bs,800){bs.Destroy();} - - //A switch in the sewer swimming path to allow backtracking - AddSwitch( vect(-1518.989136,278.541260,-439.973816), rot(0, 2768, 0), 'DrainGrate'); - - //A keypad in the sewer walking path to allow backtracking - kp = Spawn(class'Keypad2',,,vectm(-622.685,497.4295,-60.437), rotm(0,-49192,0)); - kp.validCode="2577"; - kp.bToggleLock=False; - kp.Event='DoorToWarehouse'; - - class'PlaceholderEnemy'.static.Create(self,vectm(782,-1452,48)); - class'PlaceholderEnemy'.static.Create(self,vectm(1508,-1373,256)); - class'PlaceholderEnemy'.static.Create(self,vectm(1814,-1842,48)); - class'PlaceholderEnemy'.static.Create(self,vectm(-31,-1485,48)); - class'PlaceholderEnemy'.static.Create(self,vectm(1121,-1095,-144)); - class'PlaceholderEnemy'.static.Create(self,vectm(467,-214,-144)); + if (VanillaMaps){ + npClass.static.SpawnInfoDevice(self,class'#var(prefix)NewspaperOpen',vectm(1700.929810,-519.988037,57.729870),rotm(0,0,0),'02_Newspaper06'); //Joe Greene article, table in room next to break room (near bathrooms) + npClass.static.SpawnInfoDevice(self,class'#var(prefix)NewspaperOpen',vectm(-1727.644775,2479.614990,1745.724976),rotm(0,0,0),'02_Newspaper06'); //Next to apartment(?) door on rooftops, near elevator + + //Remove the small boxes in the sewers near the ladder so that bigger boxes don't shuffle into those spots + foreach AllActors(class'DeusExMover',d,'DrainGrate'){break;} + foreach d.RadiusActors(class'#var(prefix)BoxSmall',bs,800){bs.Destroy();} + + //A switch in the sewer swimming path to allow backtracking + AddSwitch( vect(-1518.989136,278.541260,-439.973816), rot(0, 2768, 0), 'DrainGrate'); + + //A keypad in the sewer walking path to allow backtracking + kp = Spawn(class'#var(prefix)Keypad2',,,vectm(-622.685,497.4295,-60.437), rotm(0,-49192,0)); + kp.validCode="2577"; + kp.bToggleLock=False; + kp.Event='DoorToWarehouse'; + + class'PlaceholderEnemy'.static.Create(self,vectm(782,-1452,48)); + class'PlaceholderEnemy'.static.Create(self,vectm(1508,-1373,256)); + class'PlaceholderEnemy'.static.Create(self,vectm(1814,-1842,48)); + class'PlaceholderEnemy'.static.Create(self,vectm(-31,-1485,48)); + class'PlaceholderEnemy'.static.Create(self,vectm(1121,-1095,-144)); + class'PlaceholderEnemy'.static.Create(self,vectm(467,-214,-144)); + } break; case "02_NYC_HOTEL": - Spawn(class'#var(prefix)Binoculars',,, vectm(-610.374573,-3221.998779,94.160065)); //Paul's bedside table + if (VanillaMaps){ + Spawn(class'#var(prefix)Binoculars',,, vectm(-610.374573,-3221.998779,94.160065)); //Paul's bedside table - //Restore answering machine message, but in mission 2 (conversation is in mission 3); - //tad=Spawn(class'#var(prefix)TAD',,, vectm(-290,-2380,115),rotm(0,0,0)); - //tad.BindName="AnsweringMachine"; - //CreateAnsweringMachineConversation(tad); - //tad.ConBindEvents(); + //Restore answering machine message, but in mission 2 (conversation is in mission 3); + //tad=Spawn(class'#var(prefix)TAD',,, vectm(-290,-2380,115),rotm(0,0,0)); + //tad.BindName="AnsweringMachine"; + //CreateAnsweringMachineConversation(tad); + //tad.ConBindEvents(); - Spawn(class'PlaceholderItem',,, vectm(-732,-2628,75)); //Actual closet - Spawn(class'PlaceholderItem',,, vectm(-732,-2712,75)); //Actual closet - Spawn(class'PlaceholderItem',,, vectm(-129,-3038,127)); //Bathroom counter - Spawn(class'PlaceholderItem',,, vectm(15,-2972,123)); //Kitchen counter - Spawn(class'PlaceholderItem',,, vectm(-853,-3148,75)); //Crack next to Paul's bed + Spawn(class'PlaceholderItem',,, vectm(-732,-2628,75)); //Actual closet + Spawn(class'PlaceholderItem',,, vectm(-732,-2712,75)); //Actual closet + Spawn(class'PlaceholderItem',,, vectm(-129,-3038,127)); //Bathroom counter + Spawn(class'PlaceholderItem',,, vectm(15,-2972,123)); //Kitchen counter + Spawn(class'PlaceholderItem',,, vectm(-853,-3148,75)); //Crack next to Paul's bed + } break; -#endif case "02_NYC_STREET": -#ifdef revision - foreach AllActors(class'CrateExplosiveSmall', c) { - l("hiding " $ c @ c.Tag @ c.Event); - c.bHidden = true;// hide it so DXRSwapItems doesn't move it, this is supposed to be inside the plane that flies overhead + if (RevisionMaps){ + foreach AllActors(class'CrateExplosiveSmall', c) { + l("hiding " $ c @ c.Tag @ c.Event); + c.bHidden = true;// hide it so DXRSwapItems doesn't move it, this is supposed to be inside the plane that flies overhead + } } -#endif foreach AllActors(class'DeusExMover', d, 'AugStore') { d.bFrobbable = true; } @@ -195,9 +205,13 @@ function CreateAnsweringMachineConversation(Actor tad) function PostFirstEntryMapFixes() { + local bool RevisionMaps; + + RevisionMaps = class'DXRMapVariants'.static.IsRevisionMaps(player()); + switch(dxr.localURL) { case "02_NYC_WAREHOUSE": - if(!#defined(revision)) { + if(!RevisionMaps) { AddBox(class'#var(prefix)CrateUnbreakableSmall', vectm(183.993530, 926.125000, 1162.103271));// apartment AddBox(class'#var(prefix)CrateUnbreakableMed', vectm(-389.361969, 744.039978, 1088.083618));// ladder AddBox(class'#var(prefix)CrateUnbreakableSmall', vectm(-328.287048, 767.875000, 1072.113770)); diff --git a/DXRMapFixups/DeusEx/Classes/DXRFixupM03.uc b/DXRMapFixups/DeusEx/Classes/DXRFixupM03.uc index a9b04d3d3..9f85a7ce1 100644 --- a/DXRMapFixups/DeusEx/Classes/DXRFixupM03.uc +++ b/DXRMapFixups/DeusEx/Classes/DXRFixupM03.uc @@ -14,23 +14,28 @@ function CheckConfig() function PostFirstEntryMapFixes() { local Actor a; + local bool RevisionMaps; + + RevisionMaps = class'DXRMapVariants'.static.IsRevisionMaps(player()); FixUNATCORetinalScanner(); switch(dxr.localURL) { -#ifndef revision case "03_NYC_BrooklynBridgeStation": - a = AddActor(class'Barrel1', vect(-27.953907, -3493.229980, 45.101418)); - Barrel1(a).SkinColor = SC_Explosive; - a.BeginPlay(); + if (!RevisionMaps){ + a = AddActor(class'Barrel1', vect(-27.953907, -3493.229980, 45.101418)); + Barrel1(a).SkinColor = SC_Explosive; + a.BeginPlay(); + } break; case "03_NYC_AirfieldHeliBase": - //crates to get back over the beginning of the level - AddActor(class'#var(prefix)CrateUnbreakableSmall', vect(-9463.387695, 3377.530029, 60)); - AddActor(class'#var(prefix)CrateUnbreakableMed', vect(-9461.959961, 3320.718750, 75)); + if (!RevisionMaps){ + //crates to get back over the beginning of the level + AddActor(class'#var(prefix)CrateUnbreakableSmall', vect(-9463.387695, 3377.530029, 60)); + AddActor(class'#var(prefix)CrateUnbreakableMed', vect(-9461.959961, 3320.718750, 75)); + } break; -#endif } } @@ -56,6 +61,9 @@ function PreFirstEntryMapFixes() local #var(prefix)WeaponModRecoil wmr; local #var(prefix)Terrorist terror; local #var(prefix)FishGenerator fg; + local bool VanillaMaps; + + VanillaMaps = class'DXRMapVariants'.static.IsVanillaMaps(player()); switch (dxr.localURL) { @@ -97,59 +105,58 @@ function PreFirstEntryMapFixes() break; -#ifdef vanillamaps case "03_NYC_AirfieldHeliBase": - foreach AllActors(class'Mover',m) { - // call the elevator at the end of the level when you open the appropriate door - if (m.Tag == 'BasementDoorOpen') - { - m.Event = 'BasementFloor'; - } - else if (m.Tag == 'GroundDoorOpen') - { - m.Event = 'GroundLevel'; + if (VanillaMaps){ + foreach AllActors(class'Mover',m) { + // call the elevator at the end of the level when you open the appropriate door + if (m.Tag == 'BasementDoorOpen') + { + m.Event = 'BasementFloor'; + } + else if (m.Tag == 'GroundDoorOpen') + { + m.Event = 'GroundLevel'; + } + // sewer door backtracking so we can make a switch for this + else if ( DeusExMover(m) != None && DeusExMover(m).KeyIDNeeded == 'Sewerdoor') + { + m.Tag = 'Sewerdoor'; + } } - // sewer door backtracking so we can make a switch for this - else if ( DeusExMover(m) != None && DeusExMover(m).KeyIDNeeded == 'Sewerdoor') - { - m.Tag = 'Sewerdoor'; + foreach AllActors(class'Trigger', t) { + //disable the platforms that fall when you step on them + if( t.Name == 'Trigger0' || t.Name == 'Trigger1' ) { + t.Event = ''; + } } - } - foreach AllActors(class'Trigger', t) { - //disable the platforms that fall when you step on them - if( t.Name == 'Trigger0' || t.Name == 'Trigger1' ) { - t.Event = ''; + foreach AllActors(class'#var(prefix)UNATCOTroop', unatco) { + unatco.bHateCarcass = false; + unatco.bHateDistress = false; } - } - foreach AllActors(class'#var(prefix)UNATCOTroop', unatco) { - unatco.bHateCarcass = false; - unatco.bHateDistress = false; - } - - // Sewerdoor backtracking - AddSwitch( vect(-6878.640137, 3623.358398, 150.903931), rot(0,0,0), 'Sewerdoor'); - //stepping stone valves out of the water, I could make the collision radius a little wider even if it isn't realistic? - AddActor(class'Valve', vect(-3105,-385,-210), rot(0,0,16384)); - a = AddActor(class'DynamicBlockPlayer', vect(-3105,-385,-210)); - SetActorScale(a, 1.3); + // Sewerdoor backtracking + AddSwitch( vect(-6878.640137, 3623.358398, 150.903931), rot(0,0,0), 'Sewerdoor'); - AddActor(class'Valve', vect(-3080,-395,-170), rot(0,0,16384)); - a = AddActor(class'DynamicBlockPlayer', vect(-3080,-395,-170)); - SetActorScale(a, 1.3); + //stepping stone valves out of the water, I could make the collision radius a little wider even if it isn't realistic? + AddActor(class'Valve', vect(-3105,-385,-210), rot(0,0,16384)); + a = AddActor(class'DynamicBlockPlayer', vect(-3105,-385,-210)); + SetActorScale(a, 1.3); - AddActor(class'Valve', vect(-3065,-405,-130), rot(0,0,16384)); - a = AddActor(class'DynamicBlockPlayer', vect(-3065,-405,-130)); - SetActorScale(a, 1.3); + AddActor(class'Valve', vect(-3080,-395,-170), rot(0,0,16384)); + a = AddActor(class'DynamicBlockPlayer', vect(-3080,-395,-170)); + SetActorScale(a, 1.3); - //rebreather because of #TOOCEAN connection - Spawn(class'Rebreather',,, vectm(1411.798950, 546.628845, 247.708572)); + AddActor(class'Valve', vect(-3065,-405,-130), rot(0,0,16384)); + a = AddActor(class'DynamicBlockPlayer', vect(-3065,-405,-130)); + SetActorScale(a, 1.3); - //Button to extend sewer platform from the other side - AddSwitch( vect(-5233.946289,3601.383545,161.851822), rot(0, 16384, 0), 'MoveableBridge'); + //rebreather because of #TOOCEAN connection + Spawn(class'Rebreather',,, vectm(1411.798950, 546.628845, 247.708572)); + //Button to extend sewer platform from the other side + AddSwitch( vect(-5233.946289,3601.383545,161.851822), rot(0, 16384, 0), 'MoveableBridge'); + } break; -#endif case "03_NYC_AIRFIELD": //rebreather because of #TOOCEAN connection @@ -166,7 +173,7 @@ function PreFirstEntryMapFixes() Spawn(class'PlaceholderItem',,, vectm(4441,3112,51)); //Base of satellite Spawn(class'PlaceholderItem',,, vectm(1915,2800.6,79)); //Gate support (inside gate) Spawn(class'PlaceholderItem',,, vectm(3641.339,2623.73,27)); //Steps outside barracks - if(#defined(vanillamaps)) { + if(VanillaMaps) { foreach AllActors(class'Teleporter', tele) { if(tele.Event == 'HangarEnt') { tele.SetCollisionSize(tele.CollisionRadius, tele.CollisionHeight + 10); @@ -175,45 +182,47 @@ function PreFirstEntryMapFixes() } break; -#ifdef vanillamaps case "03_NYC_BROOKLYNBRIDGESTATION": - //Put a button behind the hidden bathroom door - //Mostly for entrance rando, but just in case - AddSwitch( vect(-1673, -1319.913574, 130.813538), rot(0, 32767, 0), 'MoleHideoutOpened' ); + if (VanillaMaps){ + //Put a button behind the hidden bathroom door + //Mostly for entrance rando, but just in case + AddSwitch( vect(-1673, -1319.913574, 130.813538), rot(0, 32767, 0), 'MoleHideoutOpened' ); + } break; case "03_NYC_MOLEPEOPLE": - foreach AllActors(class'Mover', m, 'DeusExMover') { - if( m.Name == 'DeusExMover65' ) m.Tag = 'BathroomDoor'; - } - AddSwitch( vect(3745, -2593.711914, 140.335358), rot(0, 0, 0), 'BathroomDoor' ); + if (VanillaMaps){ + foreach AllActors(class'Mover', m, 'DeusExMover') { + if( m.Name == 'DeusExMover65' ) m.Tag = 'BathroomDoor'; + } + AddSwitch( vect(3745, -2593.711914, 140.335358), rot(0, 0, 0), 'BathroomDoor' ); - //The Leader can go hostile so easily... just make that not possible - foreach AllActors(class'Terrorist',terror){ - if (terror.BindName=="TerroristLeader"){ - terror.ChangeAlly('Player',0,True);//Permanently neutral - break; + //The Leader can go hostile so easily... just make that not possible + foreach AllActors(class'#var(prefix)Terrorist',terror){ + if (terror.BindName=="TerroristLeader"){ + terror.ChangeAlly('Player',0,True);//Permanently neutral + break; + } } - } - Spawn(class'PlaceholderItem',,, vectm(-73,-497.98,42.3)); //Water supply - Spawn(class'PlaceholderItem',,, vectm(-486,206,26)); //Under ramps - Spawn(class'PlaceholderItem',,, vectm(461,206,26)); //Under Ramp 2 - Spawn(class'PlaceholderItem',,, vectm(395,830,74)); //Around Pillars - Spawn(class'PlaceholderItem',,, vectm(-2,633,74));//More pillars - Spawn(class'PlaceholderItem',,, vectm(-465,562,74));//Even more pillars - Spawn(class'PlaceholderItem',,, vectm(-659,990,107)); //Pillar stairs - Spawn(class'PlaceholderItem',,, vectm(661,1000,107)); //other side pillar stairs - Spawn(class'PlaceholderItem',,, vectm(-919,-94,11)); //Other side ramp - Spawn(class'PlaceholderItem',,, vectm(1222,88,11)); //Near start, but bad side + Spawn(class'PlaceholderItem',,, vectm(-73,-497.98,42.3)); //Water supply + Spawn(class'PlaceholderItem',,, vectm(-486,206,26)); //Under ramps + Spawn(class'PlaceholderItem',,, vectm(461,206,26)); //Under Ramp 2 + Spawn(class'PlaceholderItem',,, vectm(395,830,74)); //Around Pillars + Spawn(class'PlaceholderItem',,, vectm(-2,633,74));//More pillars + Spawn(class'PlaceholderItem',,, vectm(-465,562,74));//Even more pillars + Spawn(class'PlaceholderItem',,, vectm(-659,990,107)); //Pillar stairs + Spawn(class'PlaceholderItem',,, vectm(661,1000,107)); //other side pillar stairs + Spawn(class'PlaceholderItem',,, vectm(-919,-94,11)); //Other side ramp + Spawn(class'PlaceholderItem',,, vectm(1222,88,11)); //Near start, but bad side + } break; -#endif case "03_NYC_747": // fix Jock's conversation state so he doesn't play the dialog for unatco->battery park but now plays dialog for airfield->unatco // DL_Airfield is "You're entering a helibase terminal below a private section of LaGuardia." dxr.flagbase.SetBool('DL_Airfield_Played', true,, 4); - if(#defined(vanillamaps)) { + if(VanillaMaps) { foreach AllActors(class'#var(prefix)InformationDevices', i) { if(i.imageClass == Class'Image03_747Diagram') { // move the out of bounds datacabe onto the bed of the empty room @@ -284,6 +293,9 @@ function AnyEntryMapFixes() local Conversation c; local ConEvent ce; local ConEventSpeech ces; + local bool RevisionMaps; + + RevisionMaps = class'DXRMapVariants'.static.IsRevisionMaps(player()); switch(dxr.localURL) { case "03_NYC_747": @@ -291,29 +303,31 @@ function AnyEntryMapFixes() break; case "03_NYC_AIRFIELDHELIBASE": - //Restore this cut phone conversation - c = GetConversation('OverhearLebedev'); - c.conOwnerName="LebedevPhone"; - c.bInvokeRadius=True; - c.radiusDistance=200; - foreach AllActors(class'#var(prefix)Phone',phone){ - if (phone.name=='Phone1'){ - phone.BindName="LebedevPhone"; - break; + if (!RevisionMaps){ + //Restore this cut phone conversation + c = GetConversation('OverhearLebedev'); + c.conOwnerName="LebedevPhone"; + c.bInvokeRadius=True; + c.radiusDistance=200; + foreach AllActors(class'#var(prefix)Phone',phone){ + if (phone.name=='Phone1'){ + phone.BindName="LebedevPhone"; + break; + } } - } - ce = c.eventList; - while (ce!=None){ - if (ce.eventType==ET_Speech){ - ces = ConEventSpeech(ce); - ces.speaker=phone; - ces.speakingTo=phone; + ce = c.eventList; + while (ce!=None){ + if (ce.eventType==ET_Speech){ + ces = ConEventSpeech(ce); + ces.speaker=phone; + ces.speakingTo=phone; + } + ce = ce.nextEvent; } - ce = ce.nextEvent; - } - phone.ConBindEvents(); + phone.ConBindEvents(); + } break; } } diff --git a/DXRMapFixups/DeusEx/Classes/DXRFixupM04.uc b/DXRMapFixups/DeusEx/Classes/DXRFixupM04.uc index ad89b3ee4..c8f4e21af 100644 --- a/DXRMapFixups/DeusEx/Classes/DXRFixupM04.uc +++ b/DXRMapFixups/DeusEx/Classes/DXRFixupM04.uc @@ -41,11 +41,14 @@ function PreFirstEntryMapFixes() local #var(DeusExPrefix)Mover door; local #var(prefix)NanoKey key; local #var(prefix)PigeonGenerator pg; + local bool VanillaMaps; + + VanillaMaps = class'DXRMapVariants'.static.IsVanillaMaps(player()); switch (dxr.localURL) { -#ifdef vanilla case "04_NYC_HOTEL": +#ifdef vanilla foreach AllActors(class'OrdersTrigger', ot, 'PaulSafe') { if( ot.Orders == 'Leaving' ) ot.Orders = 'Seeking'; @@ -65,29 +68,31 @@ function PreFirstEntryMapFixes() st.awardMessage = "Saved Paul"; } } +#endif - Spawn(class'#var(prefix)Binoculars',,, vectm(-610.374573,-3221.998779,94.160065)); //Paul's bedside table - - key = Spawn(class'#var(prefix)NanoKey',,, vectm(-967,-1240,-74)); - key.KeyID = 'CrackRoom'; - key.Description = "'Ton Hotel, North Room Key"; - if(dxr.flags.settings.keysrando > 0) - GlowUp(key); - - key = Spawn(class'#var(prefix)NanoKey',,, vectm(-845,-2920,180)); - key.KeyID = 'Apartment'; - key.Description = "Apartment key"; - if(dxr.flags.settings.keysrando > 0) - GlowUp(key); - - SpawnDatacubeTextTag(vectm(-840,-2920,85), rotm(0,0,0), '02_Datacube07',False); //Paul's stash code, in closet - Spawn(class'PlaceholderItem',,, vectm(-732,-2628,75)); //Actual closet - Spawn(class'PlaceholderItem',,, vectm(-732,-2712,75)); //Actual closet - Spawn(class'PlaceholderItem',,, vectm(-129,-3038,127)); //Bathroom counter - Spawn(class'PlaceholderItem',,, vectm(15,-2972,123)); //Kitchen counter - Spawn(class'PlaceholderItem',,, vectm(-853,-3148,75)); //Crack next to Paul's bed + if (VanillaMaps){ + Spawn(class'#var(prefix)Binoculars',,, vectm(-610.374573,-3221.998779,94.160065)); //Paul's bedside table + + key = Spawn(class'#var(prefix)NanoKey',,, vectm(-967,-1240,-74)); + key.KeyID = 'CrackRoom'; + key.Description = "'Ton Hotel, North Room Key"; + if(dxr.flags.settings.keysrando > 0) + GlowUp(key); + + key = Spawn(class'#var(prefix)NanoKey',,, vectm(-845,-2920,180)); + key.KeyID = 'Apartment'; + key.Description = "Apartment key"; + if(dxr.flags.settings.keysrando > 0) + GlowUp(key); + + SpawnDatacubeTextTag(vectm(-840,-2920,85), rotm(0,0,0), '02_Datacube07',False); //Paul's stash code, in closet + Spawn(class'PlaceholderItem',,, vectm(-732,-2628,75)); //Actual closet + Spawn(class'PlaceholderItem',,, vectm(-732,-2712,75)); //Actual closet + Spawn(class'PlaceholderItem',,, vectm(-129,-3038,127)); //Bathroom counter + Spawn(class'PlaceholderItem',,, vectm(15,-2972,123)); //Kitchen counter + Spawn(class'PlaceholderItem',,, vectm(-853,-3148,75)); //Crack next to Paul's bed + } break; -#endif case "04_NYC_NSFHQ": foreach AllActors(class'#var(prefix)AutoTurret', turret) { @@ -129,6 +134,17 @@ function PreFirstEntryMapFixes() //Button to open basement hatch from inside AddSwitch( vect(-558.536499,-426.806915,-16.069786), rot(0, 0, 0), 'BasementHatch'); + if (VanillaMaps){ + //One window on the roof doesn't have a FlagTrigger to make UNATCO hate you. Add it back. + ft = Spawn(class'FlagTrigger',,,vectm(233.9,693.64,1016.1)); + ft.SetCollisionSize(128,40); + ft.bSetFlag=False; + ft.bTrigger=True; + ft.FlagName='NSFSignalSent'; + ft.flagValue=True; + ft.Event='UNATCOHatesPlayer'; + } + break; case "04_NYC_UNATCOISLAND": @@ -213,6 +229,11 @@ function AnyEntryMapFixes() #ifdef revision local DXRKeypad k; #endif + local bool RevisionMaps; + local bool VanillaMaps; + + RevisionMaps = class'DXRMapVariants'.static.IsRevisionMaps(player()); + VanillaMaps = class'DXRMapVariants'.static.IsVanillaMaps(player()); DeleteConversationFlag(GetConversation('AnnaBadMama'), 'TalkedToPaulAfterMessage_Played', true); if(dxr.flagbase.GetBool('NSFSignalSent')) { @@ -240,19 +261,19 @@ function AnyEntryMapFixes() FixConversationFlag(GetConversation('SandraMadAtPlayer'), 'PlayerKilledRenton', true, 'AlwaysFalse', true); break; -#ifdef vanillamaps case "04_NYC_SMUG": - if( dxr.flagbase.GetBool('FordSchickRescued') ) - { - foreach AllActors(class'FordSchick', ford) - ford.EnterWorld(); + if(VanillaMaps){ + if( dxr.flagbase.GetBool('FordSchickRescued') ) + { + foreach AllActors(class'FordSchick', ford) + ford.EnterWorld(); + } } break; -#endif #ifdef revision case "04_NYC_STREET": - if( dxr.flagbase.GetBool('TalkedToPaulAfterMessage_Played') ) + if( dxr.flagbase.GetBool('TalkedToPaulAfterMessage_Played') && RevisionMaps ) { foreach AllActors(class'DXRKeypad',k,'SubKeypad'){ k.SetCollision(true); diff --git a/DXRMapFixups/DeusEx/Classes/DXRFixupM05.uc b/DXRMapFixups/DeusEx/Classes/DXRFixupM05.uc index 1855ca2f2..634d2d194 100644 --- a/DXRMapFixups/DeusEx/Classes/DXRFixupM05.uc +++ b/DXRMapFixups/DeusEx/Classes/DXRFixupM05.uc @@ -37,6 +37,9 @@ function PreFirstEntryMapFixes() local #var(prefix)NanoKey k; local DXREnemies dxre; local int i; + local bool VanillaMaps; + + VanillaMaps = class'DXRMapVariants'.static.IsVanillaMaps(player()); switch (dxr.localURL) { @@ -50,7 +53,7 @@ function PreFirstEntryMapFixes() PartialHeal(p.HealthArmLeft, p.default.HealthArmLeft); PartialHeal(p.HealthArmRight, p.default.HealthArmRight); p.GenerateTotalHealth(); - if(dxr.flags.settings.prison_pocket > 0 || #defined(vanillamaps)) + if(dxr.flags.settings.prison_pocket > 0 || VanillaMaps) dxr.flags.f.SetBool('MS_InventoryRemoved', true,, 6); // we have to move the items in PostFirstEntry, otherwise they get swapped around with other things } @@ -70,73 +73,73 @@ function PreFirstEntryMapFixes() mj12.BindName = "MJ12CellguardRick"; } -#ifdef vanillamaps - foreach AllActors(class'DeusExMover',dxm){ - if (dxm.Name=='DeusExMover34'){ - //I think this filing cabinet door was supposed to - //be unlockable with Agent Sherman's key as well - dxm.KeyIDNeeded='Cabinet'; + if (VanillaMaps){ + foreach AllActors(class'DeusExMover',dxm){ + if (dxm.Name=='DeusExMover34'){ + //I think this filing cabinet door was supposed to + //be unlockable with Agent Sherman's key as well + dxm.KeyIDNeeded='Cabinet'; + } } } -#endif break; -#ifdef vanillamaps case "05_NYC_UNATCOHQ": - FixAlexsEmail(); - - // Anna's dialog depends on this flag - dxr.flagbase.SetBool('DL_Choice_Played', true,, 6); - - foreach AllActors(class'ComputerPersonal', c) { - if( c.Name != 'ComputerPersonal3' ) continue; - // gunther and anna's computer across from Carter - for(i=0; i < ArrayCount(c.UserList); i++) { - if( c.UserList[i].userName != "JCD" ) continue; - // it's silly that you can use JC's account to get part of Anna's killphrase, and also weird that Anna's account isn't on here - c.UserList[i].userName = "anavarre"; - c.UserList[i].password = "scryspc"; + if (VanillaMaps){ + FixAlexsEmail(); + + // Anna's dialog depends on this flag + dxr.flagbase.SetBool('DL_Choice_Played', true,, 6); + + foreach AllActors(class'ComputerPersonal', c) { + if( c.Name != 'ComputerPersonal3' ) continue; + // gunther and anna's computer across from Carter + for(i=0; i < ArrayCount(c.UserList); i++) { + if( c.UserList[i].userName != "JCD" ) continue; + // it's silly that you can use JC's account to get part of Anna's killphrase, and also weird that Anna's account isn't on here + c.UserList[i].userName = "anavarre"; + c.UserList[i].password = "scryspc"; + } + } + foreach AllActors(class'#var(prefix)AlexJacobson', alex) { + RemoveFears(alex); + } + foreach AllActors(class'#var(prefix)JaimeReyes', j) { + RemoveFears(j); } - } - foreach AllActors(class'#var(prefix)AlexJacobson', alex) { - RemoveFears(alex); - } - foreach AllActors(class'#var(prefix)JaimeReyes', j) { - RemoveFears(j); - } - k = Spawn(class'#var(prefix)NanoKey',,, vectm(420,195,333)); - k.KeyID = 'UNOfficeDoorKey'; - k.Description = "UNATCO Office Door Key"; - if(dxr.flags.settings.keysrando > 0) - GlowUp(k); - - k = Spawn(class'#var(prefix)NanoKey',,, vectm(965,900,-28)); - k.KeyID = 'JaimeClosetKey'; - k.Description = "MedLab Closet Key Code"; - if(dxr.flags.settings.keysrando > 0) - GlowUp(k); - - //Spawn some placeholders for new item locations - Spawn(class'PlaceholderItem',,, vectm(363.284149, 344.847, 50.32)); //Womens bathroom counter - Spawn(class'PlaceholderItem',,, vectm(211.227, 348.46, 50.32)); //Mens bathroom counter - Spawn(class'PlaceholderItem',,, vectm(982.255,1096.76,-7)); //Jaime's desk - Spawn(class'PlaceholderItem',,, vectm(2033.8,1979.9,-85)); //Near MJ12 Door - Spawn(class'PlaceholderItem',,, vectm(2148,2249,-85)); //Near MJ12 Door - Spawn(class'PlaceholderItem',,, vectm(2433,1384,-85)); //Near MJ12 Door - Spawn(class'PlaceholderItem',,, vectm(-307.8,-1122,-7)); //Anna's Desk - Spawn(class'PlaceholderItem',,, vectm(-138.5,-790.1,-1.65)); //Anna's bookshelf - Spawn(class'PlaceholderItem',,, vectm(-27,1651.5,291)); //Breakroom table - Spawn(class'PlaceholderItem',,, vectm(602,1215.7,295)); //Kitchen Counter - Spawn(class'PlaceholderItem',,, vectm(-672.8,1261,473)); //Upper Left Office desk - Spawn(class'PlaceholderItem',,, vectm(-433.128601,736.819763,314.310211)); //Weird electrical thing in closet - Spawn(class'PlaceholderContainer',,, vectm(-1187,-1154,-31)); //Behind Jail Desk - Spawn(class'PlaceholderContainer',,, vectm(2384,1669,-95)); //MJ12 Door - Spawn(class'PlaceholderContainer',,, vectm(-383.6,1376,273)); //JC's Office + k = Spawn(class'#var(prefix)NanoKey',,, vectm(420,195,333)); + k.KeyID = 'UNOfficeDoorKey'; + k.Description = "UNATCO Office Door Key"; + if(dxr.flags.settings.keysrando > 0) + GlowUp(k); + + k = Spawn(class'#var(prefix)NanoKey',,, vectm(965,900,-28)); + k.KeyID = 'JaimeClosetKey'; + k.Description = "MedLab Closet Key Code"; + if(dxr.flags.settings.keysrando > 0) + GlowUp(k); + + //Spawn some placeholders for new item locations + Spawn(class'PlaceholderItem',,, vectm(363.284149, 344.847, 50.32)); //Womens bathroom counter + Spawn(class'PlaceholderItem',,, vectm(211.227, 348.46, 50.32)); //Mens bathroom counter + Spawn(class'PlaceholderItem',,, vectm(982.255,1096.76,-7)); //Jaime's desk + Spawn(class'PlaceholderItem',,, vectm(2033.8,1979.9,-85)); //Near MJ12 Door + Spawn(class'PlaceholderItem',,, vectm(2148,2249,-85)); //Near MJ12 Door + Spawn(class'PlaceholderItem',,, vectm(2433,1384,-85)); //Near MJ12 Door + Spawn(class'PlaceholderItem',,, vectm(-307.8,-1122,-7)); //Anna's Desk + Spawn(class'PlaceholderItem',,, vectm(-138.5,-790.1,-1.65)); //Anna's bookshelf + Spawn(class'PlaceholderItem',,, vectm(-27,1651.5,291)); //Breakroom table + Spawn(class'PlaceholderItem',,, vectm(602,1215.7,295)); //Kitchen Counter + Spawn(class'PlaceholderItem',,, vectm(-672.8,1261,473)); //Upper Left Office desk + Spawn(class'PlaceholderItem',,, vectm(-433.128601,736.819763,314.310211)); //Weird electrical thing in closet + Spawn(class'PlaceholderContainer',,, vectm(-1187,-1154,-31)); //Behind Jail Desk + Spawn(class'PlaceholderContainer',,, vectm(2384,1669,-95)); //MJ12 Door + Spawn(class'PlaceholderContainer',,, vectm(-383.6,1376,273)); //JC's Office + } break; -#endif case "05_NYC_UNATCOISLAND": foreach AllActors(class'#var(prefix)UNATCOTroop', lloyd) { @@ -232,7 +235,31 @@ function BalanceJailbreak() l("BalanceJailbreak PaulLocation == " $ PaulLocation); if(PaulLocation == "Surgery Ward" || PaulLocation == "Greasel Pit") foreach AllActors(class'SpawnPoint', SP, 'player_inv') - itemLocations[num++] = SP.Location; + //Adjust item spawnpoints in armoury - specifically, move things off the top shelf + switch(sp.Name){ + case 'SpawnPoint24': + itemLocations[num++] = vectm(-8551,1061,-197); + break; + case 'SpawnPoint12': + itemLocations[num++] = vectm(-8542,1410,-148); + break; + case 'SpawnPoint10': + itemLocations[num++] = vectm(-8642,1410,-148); + break; + case 'SpawnPoint11': + itemLocations[num++] = vectm(-8636,1410,-197); + break; + case 'SpawnPoint22': + itemLocations[num++] = vectm(-8554,1057,-148); + break; + case 'SpawnPoint23': + itemLocations[num++] = vectm(-8655,1056,-148); + break; + default: + itemLocations[num++] = SP.Location; + break; + } + else { // put the items in the surgery ward itemLocations[num++] = vectm(2174.416504,-569.534729,-213.660309);// paul's bed diff --git a/DXRMapFixups/DeusEx/Classes/DXRFixupM06.uc b/DXRMapFixups/DeusEx/Classes/DXRFixupM06.uc index 73ff49a81..14edda5ad 100644 --- a/DXRMapFixups/DeusEx/Classes/DXRFixupM06.uc +++ b/DXRMapFixups/DeusEx/Classes/DXRFixupM06.uc @@ -43,6 +43,7 @@ function PreFirstEntryMapFixes() local #var(prefix)FlagTrigger ft; local #var(prefix)OrdersTrigger ot; local #var(prefix)TriadRedArrow bouncer; + local bool VanillaMaps; #ifdef injections local #var(prefix)DataCube dc; @@ -50,42 +51,43 @@ function PreFirstEntryMapFixes() local DXRInformationDevices dc; #endif + VanillaMaps = class'DXRMapVariants'.static.IsVanillaMaps(player()); + switch(dxr.localURL) { case "06_HONGKONG_HELIBASE": -#ifdef vanillamaps - foreach AllActors(class'ProjectileGenerator', pg, 'purge') { - pg.CheckTime = 0.25; - pg.spewTime = 0.4; - pg.ProjectileClass = class'PurgeGas'; - switch(pg.Name) { - case 'ProjectileGenerator5':// left side - pg.SetRotation(rotm(-7000, 80000, 0, 16384)); - break; - case 'ProjectileGenerator2':// middle left - pg.SetRotation(rotm(-6024, 70000, 0, 16384)); - break; - case 'ProjectileGenerator3':// middle right - pg.SetRotation(rotm(-8056, 64000, 0, 16384)); - break; - case 'ProjectileGenerator7':// right side - pg.SetRotation(rotm(-8056, 60000, 0, 16384)); + if (VanillaMaps){ + foreach AllActors(class'ProjectileGenerator', pg, 'purge') { + pg.CheckTime = 0.25; + pg.spewTime = 0.4; + pg.ProjectileClass = class'PurgeGas'; + switch(pg.Name) { + case 'ProjectileGenerator5':// left side + pg.SetRotation(rotm(-7000, 80000, 0, 16384)); + break; + case 'ProjectileGenerator2':// middle left + pg.SetRotation(rotm(-6024, 70000, 0, 16384)); + break; + case 'ProjectileGenerator3':// middle right + pg.SetRotation(rotm(-8056, 64000, 0, 16384)); + break; + case 'ProjectileGenerator7':// right side + pg.SetRotation(rotm(-8056, 60000, 0, 16384)); + break; + } + } + + //Make the elevator doors trigger Jock firing a missile + foreach AllActors(class'#var(DeusExPrefix)Mover',m,'elevator_door'){ + m.Event='make_a_break'; break; } - } - //Make the elevator doors trigger Jock firing a missile - foreach AllActors(class'#var(DeusExPrefix)Mover',m,'elevator_door'){ - m.Event='make_a_break'; - break; + class'PlaceholderEnemy'.static.Create(self,vectm(769,-520,144)); + class'PlaceholderEnemy'.static.Create(self,vectm(1620,-87,144)); + class'PlaceholderEnemy'.static.Create(self,vectm(-844,-359,816)); + class'PlaceholderEnemy'.static.Create(self,vectm(2036,122,816)); } - - class'PlaceholderEnemy'.static.Create(self,vectm(769,-520,144)); - class'PlaceholderEnemy'.static.Create(self,vectm(1620,-87,144)); - class'PlaceholderEnemy'.static.Create(self,vectm(-844,-359,816)); - class'PlaceholderEnemy'.static.Create(self,vectm(2036,122,816)); - -#endif break; case "06_HONGKONG_TONGBASE": @@ -147,39 +149,39 @@ function PreFirstEntryMapFixes() foreach AllActors(class'#var(prefix)WeaponNanoSword', dts) { dts.bIsSecretGoal = true;// just in case you don't have DXRMissions enabled } -#ifdef vanillamaps - foreach AllActors(class'Button1',b) - { - if (b.Event=='JockShaftTop') + if (VanillaMaps){ + foreach AllActors(class'Button1',b) { - b.Event='JocksElevatorTop'; + if (b.Event=='JockShaftTop') + { + b.Event='JocksElevatorTop'; + } } - } - foreach AllActors(class'ElevatorMover',e) - { - if(e.Tag=='JocksElevator') - { - e.Event = ''; - } - } - foreach AllActors(class'DeusExMover',d) - { - if(d.Tag=='DispalyCase') //They seriously left in that typo? + foreach AllActors(class'ElevatorMover',e) { - d.SetKeyframe(1,vectm(0,0,-136),d.Rotation); //Make sure the keyframe exists for it to drop into the floor - d.bIsDoor = true; //Mark it as a door so the troops can actually open it... - } - else if(d.Tag=='JockShaftTop') - { - d.bFrobbable=True; + if(e.Tag=='JocksElevator') + { + e.Event = ''; + } } - else if(d.Tag=='JockShaftBottom') + foreach AllActors(class'DeusExMover',d) { - d.bFrobbable=True; + if(d.Tag=='DispalyCase') //They seriously left in that typo? + { + d.SetKeyframe(1,vectm(0,0,-136),d.Rotation); //Make sure the keyframe exists for it to drop into the floor + d.bIsDoor = true; //Mark it as a door so the troops can actually open it... + } + else if(d.Tag=='JockShaftTop') + { + d.bFrobbable=True; + } + else if(d.Tag=='JockShaftBottom') + { + d.bFrobbable=True; + } } } -#endif break; case "06_HONGKONG_MJ12LAB": @@ -412,7 +414,6 @@ function PostFirstEntryMapFixes() if(dxr.flags.settings.keysrando > 0) GlowUp(a); break; -#ifndef revision case "06_HONGKONG_VERSALIFE": foreach AllActors(class'Male1',male){ if (male.BindName=="Disgruntled_Guy"){ @@ -420,7 +421,6 @@ function PostFirstEntryMapFixes() } } break; -#endif } } diff --git a/DXRMapFixups/DeusEx/Classes/DXRFixupM08.uc b/DXRMapFixups/DeusEx/Classes/DXRFixupM08.uc index 1674ee1d1..17820d350 100644 --- a/DXRMapFixups/DeusEx/Classes/DXRFixupM08.uc +++ b/DXRMapFixups/DeusEx/Classes/DXRFixupM08.uc @@ -3,6 +3,9 @@ class DXRFixupM08 extends DXRFixup; function AnyEntryMapFixes() { local StantonDowd s; + local bool VanillaMaps; + + VanillaMaps = class'DXRMapVariants'.static.IsVanillaMaps(player()); Super.AnyEntryMapFixes(); @@ -15,22 +18,25 @@ function AnyEntryMapFixes() Player().StartDataLinkTransmission("DL_Entry"); break; -#ifdef vanillamaps case "08_NYC_SMUG": - FixConversationGiveItem(GetConversation('M08MeetFordSchick'), "AugmentationUpgrade", None, class'AugmentationUpgradeCannister'); + if (VanillaMaps){ + FixConversationGiveItem(GetConversation('M08MeetFordSchick'), "AugmentationUpgrade", None, class'AugmentationUpgradeCannister'); + } break; -#endif } } function TimerMapFixes() { local BlackHelicopter chopper; + local bool VanillaMaps; + + VanillaMaps = class'DXRMapVariants'.static.IsVanillaMaps(player()); switch(dxr.localURL) { case "08_NYC_STREET": - if (#defined(vanillamaps) && dxr.flagbase.GetBool('StantonDowd_Played') ) + if (VanillaMaps && dxr.flagbase.GetBool('StantonDowd_Played') ) { foreach AllActors(class'BlackHelicopter', chopper, 'CopterExit') chopper.EnterWorld(); @@ -45,6 +51,8 @@ function PreFirstEntryMapFixes() local DataLinkTrigger dlt; local #var(prefix)NanoKey k; local #var(prefix)PigeonGenerator pg; + local bool VanillaMaps; + #ifdef injections local #var(prefix)Newspaper np; local class<#var(prefix)Newspaper> npClass; @@ -55,6 +63,8 @@ function PreFirstEntryMapFixes() npClass = class'DXRInformationDevices'; #endif + VanillaMaps = class'DXRMapVariants'.static.IsVanillaMaps(player()); + switch(dxr.localURL) { case "08_NYC_STREET": @@ -74,27 +84,29 @@ function PreFirstEntryMapFixes() pg.MaxCount=3; break; case "08_NYC_HOTEL": - Spawn(class'#var(prefix)Binoculars',,, vectm(-610.374573,-3221.998779,94.160065)); //Paul's bedside table - SpawnDatacubeTextTag(vectm(-840,-2920,85), rotm(0,0,0), '02_Datacube07',False); //Paul's stash code, in closet - - k = Spawn(class'#var(prefix)NanoKey',,, vectm(-967,-1240,-74)); - k.KeyID = 'CrackRoom'; - k.Description = "'Ton Hotel, North Room Key"; - if(dxr.flags.settings.keysrando > 0) - GlowUp(k); - - k = Spawn(class'#var(prefix)NanoKey',,, vectm(-845,-2920,180)); - k.KeyID = 'Apartment'; - k.Description = "Apartment key"; - if(dxr.flags.settings.keysrando > 0) - GlowUp(k); - - - Spawn(class'PlaceholderItem',,, vectm(-732,-2628,75)); //Actual closet - Spawn(class'PlaceholderItem',,, vectm(-732,-2712,75)); //Actual closet - Spawn(class'PlaceholderItem',,, vectm(-129,-3038,127)); //Bathroom counter - Spawn(class'PlaceholderItem',,, vectm(15,-2972,123)); //Kitchen counter - Spawn(class'PlaceholderItem',,, vectm(-853,-3148,75)); //Crack next to Paul's bed + if (VanillaMaps){ + Spawn(class'#var(prefix)Binoculars',,, vectm(-610.374573,-3221.998779,94.160065)); //Paul's bedside table + SpawnDatacubeTextTag(vectm(-840,-2920,85), rotm(0,0,0), '02_Datacube07',False); //Paul's stash code, in closet + + k = Spawn(class'#var(prefix)NanoKey',,, vectm(-967,-1240,-74)); + k.KeyID = 'CrackRoom'; + k.Description = "'Ton Hotel, North Room Key"; + if(dxr.flags.settings.keysrando > 0) + GlowUp(k); + + k = Spawn(class'#var(prefix)NanoKey',,, vectm(-845,-2920,180)); + k.KeyID = 'Apartment'; + k.Description = "Apartment key"; + if(dxr.flags.settings.keysrando > 0) + GlowUp(k); + + + Spawn(class'PlaceholderItem',,, vectm(-732,-2628,75)); //Actual closet + Spawn(class'PlaceholderItem',,, vectm(-732,-2712,75)); //Actual closet + Spawn(class'PlaceholderItem',,, vectm(-129,-3038,127)); //Bathroom counter + Spawn(class'PlaceholderItem',,, vectm(15,-2972,123)); //Kitchen counter + Spawn(class'PlaceholderItem',,, vectm(-853,-3148,75)); //Crack next to Paul's bed + } break; case "08_NYC_BAR": npClass.static.SpawnInfoDevice(self,class'#var(prefix)NewspaperOpen',vectm(-1171.976440,250.575806,53.729687),rotm(0,0,0),'08_Newspaper01'); //Joe Greene article, table near where Harley is in Vanilla diff --git a/DXRMapFixups/DeusEx/Classes/DXRFixupM09.uc b/DXRMapFixups/DeusEx/Classes/DXRFixupM09.uc index 790f95ed4..50d523bef 100644 --- a/DXRMapFixups/DeusEx/Classes/DXRFixupM09.uc +++ b/DXRMapFixups/DeusEx/Classes/DXRFixupM09.uc @@ -19,7 +19,7 @@ function PreFirstEntryMapFixes() { local #var(DeusExPrefix)Mover m; local ComputerSecurity cs; - local Keypad2 k; + local #var(prefix)Keypad2 k; local Button1 b; local WeaponGasGrenade gas; local Teleporter t; @@ -38,61 +38,63 @@ function PreFirstEntryMapFixes() local #var(prefix)BeamTrigger beam; local OnceOnlyTrigger oot; local #var(prefix)PigeonGenerator pg; + local bool VanillaMaps; + + VanillaMaps = class'DXRMapVariants'.static.IsVanillaMaps(player()); switch(dxr.localURL) { -#ifdef vanillamaps case "09_NYC_SHIP": - foreach AllActors(class'#var(DeusExPrefix)Mover', m, 'DeusExMover') { - if( m.Name == 'DeusExMover7' ) m.Tag = 'shipbelowdecks_door'; - } - AddSwitch( vect(2534.639893, 227.583054, 339.803802), rot(0,-32760,0), 'shipbelowdecks_door' ); + if (VanillaMaps){ + foreach AllActors(class'#var(DeusExPrefix)Mover', m, 'DeusExMover') { + if( m.Name == 'DeusExMover7' ) m.Tag = 'shipbelowdecks_door'; + } + AddSwitch( vect(2534.639893, 227.583054, 339.803802), rot(0,-32760,0), 'shipbelowdecks_door' ); - //Button to open the office door - AddSwitch( vect(2056.951904,-1792.230713,-170.444351), rot(16382, 0, 0), 'FrontDoor'); + //Button to open the office door + AddSwitch( vect(2056.951904,-1792.230713,-170.444351), rot(16382, 0, 0), 'FrontDoor'); - foreach AllActors(class'Switch1',s){ - if (s.Event=='Eledoor01'){ - s.Event='Elevator01_bottom'; - break; + foreach AllActors(class'Switch1',s){ + if (s.Event=='Eledoor01'){ + s.Event='Elevator01_bottom'; + break; + } } - } - - //A button *behind* the elevator that sends it up, since it's possible to fall back there and live... - AddSwitch( vect(2905.517578,-1641.676270,-430.253693), rot(0,0,0), 'Elevator01_top', "Ramisme's Escape Button"); - - rg=Spawn(class'#var(prefix)RatGenerator',,, vectm(-738,-1412,-474));//Near sewer grate - rg.MaxCount=1; - - //Add some new locations for containers and items - Spawn(class'PlaceholderContainer',,, vectm(-3143,274,305)); //Front of ship - Spawn(class'PlaceholderContainer',,, vectm(-3109,-73,305)); //Front of ship - Spawn(class'PlaceholderContainer',,, vectm(-2764,186,305)); //Front of ship - Spawn(class'PlaceholderItem',,, vectm(-3544.129150,112.244072,330.309601)); //Actual Front of ship - Spawn(class'PlaceholderItem',,, vectm(-2538.4,38.5,283)); //Near stuff at front of ship - Spawn(class'PlaceholderItem',,, vectm(-2554.4,-247,283)); //Near stuff at front of ship - Spawn(class'PlaceholderItem',,, vectm(-254,557.8,302)); //Guard Post in shipping container - Spawn(class'PlaceholderItem',,, vectm(3004.5,-453,523)); //Ship kitchen - Spawn(class'PlaceholderItem',,, vectm(1788,107,509)); //Ship bathroom table - Spawn(class'PlaceholderItem',,, vectm(2152,701,519)); //Ship bunkbed - Spawn(class'PlaceholderItem',,, vectm(3000.4,511.28,526.4)); //Ship fume extractor - Spawn(class'PlaceholderItem',,, vectm(1243,-2106,-432)); //Shipyard break room table - Spawn(class'PlaceholderItem',,, vectm(2517.303467,-1384.390381,-250.690430)); //Shipyard showers locker 1 - Spawn(class'PlaceholderItem',,, vectm(2474.926270,-1385.917603,-250.689545)); //Shipyard showers locker 2 - Spawn(class'PlaceholderItem',,, vectm(2431.561279,-1385.172363,-250.690308)); //Shipyard showers locker 3 - Spawn(class'PlaceholderItem',,, vectm(2354.278809,-1383.854980,-250.689301)); //Shipyard showers locker 5 - Spawn(class'PlaceholderItem',,, vectm(2354,-1676,-223)); //Shipyard change room bench - Spawn(class'PlaceholderItem',,, vectm(2605,-1839,-257)); //Shipyard bathroom stall 1 - Spawn(class'PlaceholderItem',,, vectm(2816,-1816,-257)); //Shipyard bathroom stall 2 - Spawn(class'PlaceholderItem',,, vectm(2808,-1511.5,-207)); //Shipyard bathroom sink - Spawn(class'PlaceholderItem',,, vectm(1565.7,-994,-433.7)); //Shipyard ramp control panel - Spawn(class'PlaceholderItem',,, vectm(3361,-1255.9,1187)); //Shipyard crane control room - Spawn(class'PlaceholderContainer',,, vectm(-1248,-1248,-460)); //Shipyard dock near sewer entrance - Spawn(class'PlaceholderContainer',,, vectm(-1185,-1175,-460)); //Shipyard dock near sewer entrance - Spawn(class'PlaceholderContainer',,, vectm(3172,-1248,-460)); //Shipyard dock near maintenance ladder + //A button *behind* the elevator that sends it up, since it's possible to fall back there and live... + AddSwitch( vect(2905.517578,-1641.676270,-430.253693), rot(0,0,0), 'Elevator01_top', "Ramisme's Escape Button"); + + rg=Spawn(class'#var(prefix)RatGenerator',,, vectm(-738,-1412,-474));//Near sewer grate + rg.MaxCount=1; + + //Add some new locations for containers and items + Spawn(class'PlaceholderContainer',,, vectm(-3143,274,305)); //Front of ship + Spawn(class'PlaceholderContainer',,, vectm(-3109,-73,305)); //Front of ship + Spawn(class'PlaceholderContainer',,, vectm(-2764,186,305)); //Front of ship + Spawn(class'PlaceholderItem',,, vectm(-3544.129150,112.244072,330.309601)); //Actual Front of ship + Spawn(class'PlaceholderItem',,, vectm(-2538.4,38.5,283)); //Near stuff at front of ship + Spawn(class'PlaceholderItem',,, vectm(-2554.4,-247,283)); //Near stuff at front of ship + Spawn(class'PlaceholderItem',,, vectm(-254,557.8,302)); //Guard Post in shipping container + Spawn(class'PlaceholderItem',,, vectm(3004.5,-453,523)); //Ship kitchen + Spawn(class'PlaceholderItem',,, vectm(1788,107,509)); //Ship bathroom table + Spawn(class'PlaceholderItem',,, vectm(2152,701,519)); //Ship bunkbed + Spawn(class'PlaceholderItem',,, vectm(3000.4,511.28,526.4)); //Ship fume extractor + Spawn(class'PlaceholderItem',,, vectm(1243,-2106,-432)); //Shipyard break room table + Spawn(class'PlaceholderItem',,, vectm(2517.303467,-1384.390381,-250.690430)); //Shipyard showers locker 1 + Spawn(class'PlaceholderItem',,, vectm(2474.926270,-1385.917603,-250.689545)); //Shipyard showers locker 2 + Spawn(class'PlaceholderItem',,, vectm(2431.561279,-1385.172363,-250.690308)); //Shipyard showers locker 3 + Spawn(class'PlaceholderItem',,, vectm(2354.278809,-1383.854980,-250.689301)); //Shipyard showers locker 5 + Spawn(class'PlaceholderItem',,, vectm(2354,-1676,-223)); //Shipyard change room bench + Spawn(class'PlaceholderItem',,, vectm(2605,-1839,-257)); //Shipyard bathroom stall 1 + Spawn(class'PlaceholderItem',,, vectm(2816,-1816,-257)); //Shipyard bathroom stall 2 + Spawn(class'PlaceholderItem',,, vectm(2808,-1511.5,-207)); //Shipyard bathroom sink + Spawn(class'PlaceholderItem',,, vectm(1565.7,-994,-433.7)); //Shipyard ramp control panel + Spawn(class'PlaceholderItem',,, vectm(3361,-1255.9,1187)); //Shipyard crane control room + Spawn(class'PlaceholderContainer',,, vectm(-1248,-1248,-460)); //Shipyard dock near sewer entrance + Spawn(class'PlaceholderContainer',,, vectm(-1185,-1175,-460)); //Shipyard dock near sewer entrance + Spawn(class'PlaceholderContainer',,, vectm(3172,-1248,-460)); //Shipyard dock near maintenance ladder + } break; -#endif case "09_NYC_SHIPBELOW": // make the weld points highlightable @@ -125,28 +127,28 @@ function PreFirstEntryMapFixes() } UpdateWeldPointGoal(5); -#ifdef vanillamaps - foreach AllActors(class'ComputerSecurity',cs){ - if (cs.Name == 'ComputerSecurity4'){ - cs.specialOptions[0].Text = "Disable Ventilation Fan"; - cs.specialOptions[0].TriggerEvent='FanToggle'; - cs.specialOptions[0].TriggerText="Ventilation Fan Disabled"; + if (VanillaMaps){ + foreach AllActors(class'ComputerSecurity',cs){ + if (cs.Name == 'ComputerSecurity4'){ + cs.specialOptions[0].Text = "Disable Ventilation Fan"; + cs.specialOptions[0].TriggerEvent='FanToggle'; + cs.specialOptions[0].TriggerText="Ventilation Fan Disabled"; + } } - } - //Remove the stupid gas grenades that are past the level exit - foreach AllActors(class'Teleporter',t){ - if (t.Tag=='ToAbove') break; - } - gas = WeaponGasGrenade(findNearestToActor(class'WeaponGasGrenade',t)); - if (gas!=None){ - gas.Destroy(); - } - gas = WeaponGasGrenade(findNearestToActor(class'WeaponGasGrenade',t)); - if (gas!=None){ - gas.Destroy(); + //Remove the stupid gas grenades that are past the level exit + foreach AllActors(class'Teleporter',t){ + if (t.Tag=='ToAbove') break; + } + gas = WeaponGasGrenade(findNearestToActor(class'WeaponGasGrenade',t)); + if (gas!=None){ + gas.Destroy(); + } + gas = WeaponGasGrenade(findNearestToActor(class'WeaponGasGrenade',t)); + if (gas!=None){ + gas.Destroy(); + } } -#endif break; case "09_NYC_DOCKYARD": @@ -158,31 +160,31 @@ function PreFirstEntryMapFixes() break; } -#ifdef vanillamaps - foreach AllActors(class'#var(prefix)GasGrenade',gasgren) { - //This one has falling physics normally, so just fix it - //It can fall out of position before the physics get fixed, so put it back - if (gasgren.name=='GasGrenade0'){ - gasgren.SetPhysics(PHYS_None); - gasgren.bCollideWorld = false; - gasgren.SetRotation(rotm(0,-16472,0,GetRotationOffset(gasgren.Class))); - gasgren.SetLocation(vectm(1602.174,2470.3386,-431.6885)); - gasgren.bCollideWorld = true; - break; + if (VanillaMaps){ + foreach AllActors(class'#var(prefix)GasGrenade',gasgren) { + //This one has falling physics normally, so just fix it + //It can fall out of position before the physics get fixed, so put it back + if (gasgren.name=='GasGrenade0'){ + gasgren.SetPhysics(PHYS_None); + gasgren.bCollideWorld = false; + gasgren.SetRotation(rotm(0,-16472,0,GetRotationOffset(gasgren.Class))); + gasgren.SetLocation(vectm(1602.174,2470.3386,-431.6885)); + gasgren.bCollideWorld = true; + break; + } } - } - foreach AllActors(class'#var(prefix)BeamTrigger',beam){ - if (beam.Event=='BotDrop'){ - beam.Tag='TunnelTrigger'; - beam.Event='BotDropOnce'; + foreach AllActors(class'#var(prefix)BeamTrigger',beam){ + if (beam.Event=='BotDrop'){ + beam.Tag='TunnelTrigger'; + beam.Event='BotDropOnce'; + } } - } - oot=Spawn(class'OnceOnlyTrigger'); - oot.Event='BotDrop'; - oot.Tag='BotDropOnce'; -#endif + oot=Spawn(class'OnceOnlyTrigger'); + oot.Event='BotDrop'; + oot.Tag='BotDropOnce'; + } //They put the key ID in the tag for some reason foreach AllActors(class'#var(prefix)NanoKey',key,'SupplyRoom'){ @@ -198,7 +200,7 @@ function PreFirstEntryMapFixes() foreach AllActors(class'Button1',b){ if (b.Tag=='Button1' && b.Event=='Lift' && b.Location.Z < 200){ //vanilla Z is 97 for the lower button, just giving some slop in case it was changed in another mod? rot = b.Rotation; - k = Spawn(class'Keypad2',,,b.Location, rot); + k = Spawn(class'#var(prefix)Keypad2',,,b.Location, rot); k.validCode="8675309"; //They really like Jenny in this place k.bToggleLock=False; k.Event='Lift'; @@ -238,15 +240,15 @@ function PreFirstEntryMapFixes() break; case "09_NYC_SHIPFAN": -#ifdef vanillamaps - foreach AllActors(class'ComputerSecurity',cs){ - if (cs.Name == 'ComputerSecurity6'){ - cs.specialOptions[0].Text = "Disable Ventilation Fan"; - cs.specialOptions[0].TriggerEvent='FanToggle'; - cs.specialOptions[0].TriggerText="Ventilation Fan Disabled"; + if (VanillaMaps){ + foreach AllActors(class'ComputerSecurity',cs){ + if (cs.Name == 'ComputerSecurity6'){ + cs.specialOptions[0].Text = "Disable Ventilation Fan"; + cs.specialOptions[0].TriggerEvent='FanToggle'; + cs.specialOptions[0].TriggerText="Ventilation Fan Disabled"; + } } } -#endif break; case "09_NYC_GRAVEYARD": @@ -290,29 +292,34 @@ function PreFirstEntryMapFixes() function PostFirstEntryMapFixes() { local #var(prefix)CrateUnbreakableLarge c; + local bool RevisionMaps; + + RevisionMaps = class'DXRMapVariants'.static.IsRevisionMaps(player()); switch(dxr.localURL) { -#ifndef revision case "09_NYC_DOCKYARD": - // this crate can block the way out of the start through the vent - foreach RadiusActors(class'#var(prefix)CrateUnbreakableLarge', c, 160, vectm(2510.350342, 1377.569336, 103.858093)) { - l("removing " $ c $ " dist: " $ VSize(c.Location - vectm(2510.350342, 1377.569336, 103.858093)) ); - c.Destroy(); + if (!RevisionMaps){ + // this crate can block the way out of the start through the vent + foreach RadiusActors(class'#var(prefix)CrateUnbreakableLarge', c, 160, vectm(2510.350342, 1377.569336, 103.858093)) { + l("removing " $ c $ " dist: " $ VSize(c.Location - vectm(2510.350342, 1377.569336, 103.858093)) ); + c.Destroy(); + } } break; case "09_NYC_SHIPBELOW": - // add a tnt crate on top of the pipe, visible from the ground floor - AddActor(class'#var(prefix)CrateExplosiveSmall', vect(141.944641, -877.442627, -175.899567)); - // add a tnt crate in the locked storage closet overlooking the helipad - AddActor(class'#var(prefix)CrateExplosiveSmall', vect(-4185.878906, -357.704376, -239.899658)); - // remove big crates blocking the window to the pipe, 16 units == 1 foot - foreach RadiusActors(class'#var(prefix)CrateUnbreakableLarge', c, 16*4, vectm(-136.125000, -743.875000, -215.899323)) { - c.Event = ''; - c.Destroy(); + if (!RevisionMaps){ + // add a tnt crate on top of the pipe, visible from the ground floor + AddActor(class'#var(prefix)CrateExplosiveSmall', vect(141.944641, -877.442627, -175.899567)); + // add a tnt crate in the locked storage closet overlooking the helipad + AddActor(class'#var(prefix)CrateExplosiveSmall', vect(-4185.878906, -357.704376, -239.899658)); + // remove big crates blocking the window to the pipe, 16 units == 1 foot + foreach RadiusActors(class'#var(prefix)CrateUnbreakableLarge', c, 16*4, vectm(-136.125000, -743.875000, -215.899323)) { + c.Event = ''; + c.Destroy(); + } } break; -#endif } } @@ -323,13 +330,11 @@ function AnyEntryMapFixes() switch(dxr.localURL) { case "09_NYC_SHIP": -#ifdef vanillamaps - if(dxr.flagbase.GetBool('HelpSailor')) { + if(dxr.flagbase.GetBool('HelpSailor') && class'DXRMapVariants'.static.IsVanillaMaps(player())) { foreach AllActors(class'#var(DeusExPrefix)Mover', m, 'FrontDoor') { m.bLocked = false; } } -#endif break; case "09_NYC_SHIPBELOW": @@ -412,14 +417,11 @@ function NYC_09_CountWeldPoints() function Trigger(Actor Other, Pawn Instigator) { - if (Tag=='FanToggle'){ -#ifdef vanillamaps + if (Tag=='FanToggle' && class'DXRMapVariants'.static.IsVanillaMaps(player())){ ToggleFan(); -#endif } } -#ifdef vanillamaps function ToggleFan() { local Fan1 f; @@ -431,6 +433,10 @@ function ToggleFan() local name compName; local DeusExMover dxm; + if (class'DXRMapVariants'.static.IsVanillaMaps(player())==False){ + return; + } + //This function is now used in two maps switch(dxr.localURL) { @@ -544,4 +550,3 @@ function ToggleFan() } } } -#endif diff --git a/DXRMapFixups/DeusEx/Classes/DXRFixupM15.uc b/DXRMapFixups/DeusEx/Classes/DXRFixupM15.uc index adfe91068..a63db1a4e 100644 --- a/DXRMapFixups/DeusEx/Classes/DXRFixupM15.uc +++ b/DXRMapFixups/DeusEx/Classes/DXRFixupM15.uc @@ -6,15 +6,15 @@ function CheckConfig() { local int i; -#ifdef vanillamaps - add_datacubes[i].map = "15_AREA51_BUNKER"; - add_datacubes[i].text = "Security Personnel:|nDue to the the threat of a mass civilian raid of Area 51, we have updated the ventilation security system.|n|nUser: SECURITY |nPassword: NarutoRun |n|nBe on the lookout for civilians running with their arms swept behind their backs..."; - i++; - - add_datacubes[i].map = "15_AREA51_BUNKER"; - add_datacubes[i].text = "Security Personnel:|nFor increased ventilation system security, we have replaced the elevator button with a keypad. The code is 17092019. Do not share the code with anyone and destroy this datacube after reading."; - i++; -#endif + if (class'DXRMapVariants'.static.IsVanillaMaps(player())){ + add_datacubes[i].map = "15_AREA51_BUNKER"; + add_datacubes[i].text = "Security Personnel:|nDue to the the threat of a mass civilian raid of Area 51, we have updated the ventilation security system.|n|nUser: SECURITY |nPassword: NarutoRun |n|nBe on the lookout for civilians running with their arms swept behind their backs..."; + i++; + + add_datacubes[i].map = "15_AREA51_BUNKER"; + add_datacubes[i].text = "Security Personnel:|nFor increased ventilation system security, we have replaced the elevator button with a keypad. The code is 17092019. Do not share the code with anyone and destroy this datacube after reading."; + i++; + } add_datacubes[i].map = "15_AREA51_ENTRANCE"; add_datacubes[i].text = @@ -346,26 +346,26 @@ function PreFirstEntryMapFixes_Page() function PreFirstEntryMapFixes() { -#ifdef vanillamaps - switch(dxr.localURL) - { - case "15_AREA51_BUNKER": - PreFirstEntryMapFixes_Bunker(); - break; + if (class'DXRMapVariants'.static.IsVanillaMaps(player())){ + switch(dxr.localURL) + { + case "15_AREA51_BUNKER": + PreFirstEntryMapFixes_Bunker(); + break; - case "15_AREA51_FINAL": - PreFirstEntryMapFixes_Final(); - break; + case "15_AREA51_FINAL": + PreFirstEntryMapFixes_Final(); + break; - case "15_AREA51_ENTRANCE": - PreFirstEntryMapFixes_Entrance(); - break; + case "15_AREA51_ENTRANCE": + PreFirstEntryMapFixes_Entrance(); + break; - case "15_AREA51_PAGE": - PreFirstEntryMapFixes_Page(); - break; + case "15_AREA51_PAGE": + PreFirstEntryMapFixes_Page(); + break; + } } -#endif } function AnyEntryMapFixes() @@ -373,16 +373,21 @@ function AnyEntryMapFixes() local Gray g; local ElectricityEmitter ee; local #var(DeusExPrefix)Mover d; + local bool RevisionMaps; + local bool VanillaMaps; + + RevisionMaps = class'DXRMapVariants'.static.IsRevisionMaps(player()); + VanillaMaps = class'DXRMapVariants'.static.IsVanillaMaps(player()); switch(dxr.localURL) { case "15_AREA51_FINAL": -#ifdef vanillamaps - foreach AllActors(class'Gray', g) { - if( g.Tag == 'reactorgray1' ) g.BindName = "ReactorGray1"; - else if( g.Tag == 'reactorgray2' ) g.BindName = "ReactorGray2"; + if (VanillaMaps){ + foreach AllActors(class'Gray', g) { + if( g.Tag == 'reactorgray1' ) g.BindName = "ReactorGray1"; + else if( g.Tag == 'reactorgray2' ) g.BindName = "ReactorGray2"; + } } -#endif break; case "15_AREA51_PAGE": @@ -399,7 +404,7 @@ function AnyEntryMapFixes() } } - if((!#defined(revision)) && (!#defined(gmdx))) {// cover the button better + if((!RevisionMaps) && (!#defined(gmdx))) {// cover the button better foreach AllActors(class'#var(DeusExPrefix)Mover', d, 'Page_button') { d.SetLocation(d.Location-vectm(0,0,2)); // original Z was -5134 } diff --git a/DXRMapFixups/DeusEx/Classes/DXRFixupParis.uc b/DXRMapFixups/DeusEx/Classes/DXRFixupParis.uc index 2041353ee..b0a3be0b1 100644 --- a/DXRMapFixups/DeusEx/Classes/DXRFixupParis.uc +++ b/DXRMapFixups/DeusEx/Classes/DXRFixupParis.uc @@ -10,9 +10,11 @@ function PreFirstEntryMapFixes() local Conversation c; local #var(prefix)DataLinkTrigger dlt; local #var(prefix)JaimeReyes j; - local ZoneInfo zi; local #var(prefix)DamageTrigger dt; local #var(prefix)ComputerSecurity cs; + local bool VanillaMaps; + + VanillaMaps = class'DXRMapVariants'.static.IsVanillaMaps(player()); // shut up, Tong! (reduced rando is not as focused on replays compared to normal rando) if(!dxr.flags.IsReducedRando()) { @@ -41,73 +43,71 @@ function PreFirstEntryMapFixes() { case "10_PARIS_CATACOMBS": FixConversationAddNote(GetConversation('MeetAimee'), "Stupid, stupid, stupid password."); - foreach AllActors(class'ZoneInfo',zi){ - if (zi.DamageType=='Radiation'){ - zi.DamagePerSec=Clamp(7/player().CombatDifficulty, 1, 7); - } - } break; -#ifdef vanillamaps case "10_PARIS_CATACOMBS_TUNNELS": - foreach AllActors(class'Trigger', t) - if( t.Event == 'MJ12CommandoSpecial' ) - t.Touch(player());// make this guy patrol instead of t-pose - - AddSwitch( vect(897.238892, -120.852928, -9.965580), rot(0,0,0), 'catacombs_blastdoor02' ); - AddSwitch( vect(-2190.893799, 1203.199097, -6.663990), rot(0,0,0), 'catacombs_blastdoorB' ); + if (VanillaMaps){ + foreach AllActors(class'Trigger', t) + if( t.Event == 'MJ12CommandoSpecial' ) + t.Touch(player());// make this guy patrol instead of t-pose - class'PlaceholderEnemy'.static.Create(self,vectm(-362,-3444,-32)); - class'PlaceholderEnemy'.static.Create(self,vectm(-743,677,-256)); - class'PlaceholderEnemy'.static.Create(self,vectm(-1573,-113,-64)); - class'PlaceholderEnemy'.static.Create(self,vectm(781,1156,-32)); + AddSwitch( vect(897.238892, -120.852928, -9.965580), rot(0,0,0), 'catacombs_blastdoor02' ); + AddSwitch( vect(-2190.893799, 1203.199097, -6.663990), rot(0,0,0), 'catacombs_blastdoorB' ); + class'PlaceholderEnemy'.static.Create(self,vectm(-362,-3444,-32)); + class'PlaceholderEnemy'.static.Create(self,vectm(-743,677,-256)); + class'PlaceholderEnemy'.static.Create(self,vectm(-1573,-113,-64)); + class'PlaceholderEnemy'.static.Create(self,vectm(781,1156,-32)); + } break; case "10_PARIS_CHATEAU": - foreach AllActors(class'DeusExMover', m, 'everettsignal') - m.Tag = 'everettsignaldoor'; - d = Spawn(class'Dispatcher',, 'everettsignal', vectm(176.275253, 4298.747559, -148.500031) ); - d.OutEvents[0] = 'everettsignaldoor'; - AddSwitch( vect(-769.359985, -4417.855469, -96.485504), rot(0, 32768, 0), 'everettsignaldoor' ); - - //speed up the secret door... - foreach AllActors(class'Dispatcher', d, 'cellar_doordispatcher') { - d.OutDelays[1] = 0; - d.OutDelays[2] = 0; - d.OutDelays[3] = 0; - d.OutEvents[2] = ''; - d.OutEvents[3] = ''; - } - foreach AllActors(class'DeusExMover', m, 'secret_candle') { - m.MoveTime = 0.5; - } - foreach AllActors(class'DeusExMover', m, 'cellar_door') { - m.MoveTime = 1; + if (VanillaMaps){ + foreach AllActors(class'DeusExMover', m, 'everettsignal') + m.Tag = 'everettsignaldoor'; + d = Spawn(class'Dispatcher',, 'everettsignal', vectm(176.275253, 4298.747559, -148.500031) ); + d.OutEvents[0] = 'everettsignaldoor'; + AddSwitch( vect(-769.359985, -4417.855469, -96.485504), rot(0, 32768, 0), 'everettsignaldoor' ); + + //speed up the secret door... + foreach AllActors(class'Dispatcher', d, 'cellar_doordispatcher') { + d.OutDelays[1] = 0; + d.OutDelays[2] = 0; + d.OutDelays[3] = 0; + d.OutEvents[2] = ''; + d.OutEvents[3] = ''; + } + foreach AllActors(class'DeusExMover', m, 'secret_candle') { + m.MoveTime = 0.5; + } + foreach AllActors(class'DeusExMover', m, 'cellar_door') { + m.MoveTime = 1; + } } break; case "10_PARIS_METRO": - //If neither flag is set, JC never talked to Jaime, so he just didn't bother - if (!dxr.flagbase.GetBool('JaimeRecruited') && !dxr.flagbase.GetBool('JaimeLeftBehind')){ - //Need to pretend he *was* recruited, so that he doesn't spawn - dxr.flagbase.SetBool('JaimeRecruited',True); - } - // fix the night manager sometimes trying to talk to you while you're flying away https://www.youtube.com/watch?v=PeLbKPSHSOU&t=6332s - c = GetConversation('MeetNightManager'); - if(c!=None) { - c.bInvokeBump = false; - c.bInvokeSight = false; - c.bInvokeRadius = false; - } - foreach AllActors(class'#var(prefix)JaimeReyes', j) { - RemoveFears(j); - } + if (VanillaMaps){ + //If neither flag is set, JC never talked to Jaime, so he just didn't bother + if (!dxr.flagbase.GetBool('JaimeRecruited') && !dxr.flagbase.GetBool('JaimeLeftBehind')){ + //Need to pretend he *was* recruited, so that he doesn't spawn + dxr.flagbase.SetBool('JaimeRecruited',True); + } + // fix the night manager sometimes trying to talk to you while you're flying away https://www.youtube.com/watch?v=PeLbKPSHSOU&t=6332s + c = GetConversation('MeetNightManager'); + if(c!=None) { + c.bInvokeBump = false; + c.bInvokeSight = false; + c.bInvokeRadius = false; + } + foreach AllActors(class'#var(prefix)JaimeReyes', j) { + RemoveFears(j); + } - // make the apartment stairs less hidden, not safe to have stairs without a light! - CandleabraLight(vect(1825.758057, 1481.900024, 576.077698), rot(0, 16384, 0)); - CandleabraLight(vect(1162.240112, 1481.900024, 879.068848), rot(0, 16384, 0)); + // make the apartment stairs less hidden, not safe to have stairs without a light! + CandleabraLight(vect(1825.758057, 1481.900024, 576.077698), rot(0, 16384, 0)); + CandleabraLight(vect(1162.240112, 1481.900024, 879.068848), rot(0, 16384, 0)); + } break; -#endif case "10_PARIS_CLUB": foreach AllActors(class'ScriptedPawn',sp){ @@ -167,6 +167,12 @@ function AnyEntryMapFixes() local ScriptedPawn sp; local Merchant m; local TobyAtanwe toby; + local Conversation c; + local ConEvent ce, cePrev; + local ConEventSpeech ces; + local ConEventSetFlag cesf; + local ConEventAddSkillPoints ceasp; + local ConEventTransferObject ceto; switch(dxr.localURL) { @@ -204,6 +210,67 @@ function AnyEntryMapFixes() break; case "10_PARIS_CHATEAU": FixConversationAddNote(GetConversation('NicoletteInStudy'),"I used to use that computer whenever I was at home"); + break; + case "10_PARIS_METRO": + //Tong gives you a map of the streets when you enter via the subway + c = GetConversation('DL_military'); + ce = c.eventList; + cePrev=ce; + while(ce!=None){ + if (ce.eventType==ET_Speech && ce.nextEvent.eventType==ET_End){ + ceto = new(c) class'ConEventTransferObject'; + ceto.eventType=ET_TransferObject; + ceto.label="TransferMetroMap"; + ceto.objectName="Image10_Paris_Metro"; + ceto.giveObject=class'Image10_Paris_Metro'; + ceto.toName="JCDenton"; + ceto.fromName="TracerTong"; + ceto.transferCount=1; + ceto.nextEvent=ce.nextEvent; + ce.nextEvent=ceto; + } + ce=ce.nextEvent; + } + break; + case "11_PARIS_UNDERGROUND": + //Add a flag change to Toby's conversation so it sets MS_PlayerTeleported to false if you choose the "take me with you" option + //This will let you choose to stay or go. + c = GetConversation('MeetTobyAtanwe'); + ce = c.eventList; + cePrev=ce; + while(ce!=None){ + if (ce.eventType==ET_Speech){ + ces = ConEventSpeech(ce); + if (InStr(ces.conSpeech.speech,"Step a little closer")!=-1){ + //Spawn a ConEventSetFlag to set "MS_LetTobyTakeYou_Rando", insert it between this and it's next event + cesf = new(c) class'ConEventSetFlag'; + cesf.eventType=ET_SetFlag; + cesf.label="LetTobyTakeYou"; + cesf.flagRef = new(c) class'ConFlagRef'; + cesf.flagRef.flagName='MS_LetTobyTakeYou_Rando'; + cesf.flagRef.value=True; + cesf.flagRef.expiration=12; + cesf.nextEvent = ces.nextEvent; + ces.nextEvent = cesf; + } + } else if (ce.eventType==ET_AddSkillPoints){ + ceasp = ConEventAddSkillPoints(ce); + cePrev.nextEvent = ce.nextEvent; //Remove the event from its current position + ce.nextEvent=None; + ce=cePrev; + } + + cePrev=ce; + ce=ce.nextEvent; + } + + //Assuming we found both the "correct" conversation ending and the skill point trigger, + //insert the skill point trigger after setting the "actually take me" flag + if (cesf!=None && ceasp!=None){ + ceasp.nextEvent = cesf.nextEvent; + cesf.nextEvent = ceasp; + } + break; case "11_PARIS_EVERETT": foreach AllActors(class'TobyAtanwe', toby) { diff --git a/DXRMapFixups/DeusEx/Classes/DXRFixupVandenberg.uc b/DXRMapFixups/DeusEx/Classes/DXRFixupVandenberg.uc index 438038e96..fded0bfdc 100644 --- a/DXRMapFixups/DeusEx/Classes/DXRFixupVandenberg.uc +++ b/DXRMapFixups/DeusEx/Classes/DXRFixupVandenberg.uc @@ -26,12 +26,15 @@ function PreFirstEntryMapFixes() local Actor a; local #var(prefix)PigeonGenerator pg; local #var(prefix)FishGenerator fg; + local bool VanillaMaps; + + VanillaMaps = class'DXRMapVariants'.static.IsVanillaMaps(player()); switch(dxr.localURL) { case "12_VANDENBERG_CMD": // add goals and keypad code - Player().StartDataLinkTransmission("DL_no_carla"); + foreach AllActors(class'#var(prefix)TracerTong', tt) { RemoveFears(tt);// he looks pretty sick } @@ -65,221 +68,240 @@ function PreFirstEntryMapFixes() pg=Spawn(class'#var(prefix)PigeonGenerator',,, vectm(2065,2785,-871));//CMD Rooftop pg.MaxCount=3; -#ifdef vanillamaps - //Add a key to Tim's closet - foreach AllActors(class'#var(DeusExPrefix)Mover',door){ - if (door.Name=='DeusExMover28'){ - door.KeyIDNeeded='TimsClosetKey'; + if (VanillaMaps){ + //Add a key to Tim's closet + foreach AllActors(class'#var(DeusExPrefix)Mover',door){ + if (door.Name=='DeusExMover28'){ + door.KeyIDNeeded='TimsClosetKey'; + } } - } - key = Spawn(class'#var(prefix)NanoKey',,,vectm(-1502.665771,2130.560791,-1996.783691)); //Windowsill in Hazard Lab - key.KeyID='TimsClosetKey'; - key.Description="Tim's Closet Key"; - key.SkinColor=SC_Level3; - key.MultiSkins[0] = Texture'NanoKeyTex3'; + key = Spawn(class'#var(prefix)NanoKey',,,vectm(-1502.665771,2130.560791,-1996.783691)); //Windowsill in Hazard Lab + key.KeyID='TimsClosetKey'; + key.Description="Tim's Closet Key"; + key.SkinColor=SC_Level3; + key.MultiSkins[0] = Texture'NanoKeyTex3'; - foreach AllActors(class'#var(DeusExPrefix)Mover',door){ - if(door.name=='DeusExMover15'){ - door.Tag='CmdBackDoor'; + foreach AllActors(class'#var(DeusExPrefix)Mover',door){ + if(door.name=='DeusExMover15'){ + door.Tag='CmdBackDoor'; + } } + AddSwitch( vect(-278.854828,657.390503,-1977.144531), rot(0, 16384, 0), 'CmdBackDoor'); } - AddSwitch( vect(-278.854828,657.390503,-1977.144531), rot(0, 16384, 0), 'CmdBackDoor'); - -#endif break; -#ifdef vanillamaps case "12_VANDENBERG_TUNNELS": - foreach AllActors(class'ElevatorMover', e, 'Security_door3') { - e.BumpType = BT_PlayerBump; - e.BumpEvent = 'SC_Door3_opened'; - } - AddSwitch( vect(-396.634888, 2295, -2542.310547), rot(0, -16384, 0), 'SC_Door3_opened').bCollideWorld = false; - foreach AllActors(class'Button1', b) { - if( b.Event == 'Top' || b.Event == 'middle' || b.Event == 'Bottom' ) { - AddDelay(b, 5); + if (VanillaMaps){ + foreach AllActors(class'ElevatorMover', e, 'Security_door3') { + e.BumpType = BT_PlayerBump; + e.BumpEvent = 'SC_Door3_opened'; + } + AddSwitch( vect(-396.634888, 2295, -2542.310547), rot(0, -16384, 0), 'SC_Door3_opened').bCollideWorld = false; + foreach AllActors(class'Button1', b) { + if( b.Event == 'Top' || b.Event == 'middle' || b.Event == 'Bottom' ) { + AddDelay(b, 5); + } } } break; case "14_VANDENBERG_SUB": - //Elevator down to lower level - AddSwitch( vect(3790.639893, -488.639587, -369.964142), rot(0, 32768, 0), 'Elevator1'); - AddSwitch( vect(3799.953613, -446.640015, -1689.817993), rot(0, 16384, 0), 'Elevator1'); - - //Door into base from shore (inside) - AddSwitch( vect(2279.640137,3638.638184,-398.255676), rot(0, -16384, 0), 'door_base'); - - foreach AllActors(class'KarkianBaby',kb) { - if(kb.BindName == "tankkarkian"){ - kb.BindName = "TankKharkian"; - } - } - rg=Spawn(class'#var(prefix)RatGenerator',,, vectm(737,4193,-426));//In shoreside shed - rg.MaxCount=1; + if (VanillaMaps){ + //Elevator down to lower level + AddSwitch( vect(3790.639893, -488.639587, -369.964142), rot(0, 32768, 0), 'Elevator1'); + AddSwitch( vect(3799.953613, -446.640015, -1689.817993), rot(0, 16384, 0), 'Elevator1'); - Spawn(class'PlaceholderItem',,, vectm(755,4183,-421)); //Shed - Spawn(class'PlaceholderItem',,, vectm(755,4101,-421)); //Shed - Spawn(class'PlaceholderItem',,, vectm(462,4042,-421)); //Shed - Spawn(class'PlaceholderItem',,, vectm(462,3986,-421)); //Shed - Spawn(class'PlaceholderItem',,, vectm(462,3939,-421)); //Shed + //Door into base from shore (inside) + AddSwitch( vect(2279.640137,3638.638184,-398.255676), rot(0, -16384, 0), 'door_base'); - foreach AllActors(class'#var(DeusExPrefix)Mover',door){ - if(door.KeyIDNeeded=='shed'){ - door.Tag='ShedDoor'; + foreach AllActors(class'KarkianBaby',kb) { + if(kb.BindName == "tankkarkian"){ + kb.BindName = "TankKharkian"; + } } - if (door.Tag=='Elevator1'){ - door.MoverEncroachType=ME_CrushWhenEncroach; + rg=Spawn(class'#var(prefix)RatGenerator',,, vectm(737,4193,-426));//In shoreside shed + rg.MaxCount=1; + + Spawn(class'PlaceholderItem',,, vectm(755,4183,-421)); //Shed + Spawn(class'PlaceholderItem',,, vectm(755,4101,-421)); //Shed + Spawn(class'PlaceholderItem',,, vectm(462,4042,-421)); //Shed + Spawn(class'PlaceholderItem',,, vectm(462,3986,-421)); //Shed + Spawn(class'PlaceholderItem',,, vectm(462,3939,-421)); //Shed + + foreach AllActors(class'#var(DeusExPrefix)Mover',door){ + if(door.KeyIDNeeded=='shed'){ + door.Tag='ShedDoor'; + } + if (door.Tag=='Elevator1'){ + door.MoverEncroachType=ME_CrushWhenEncroach; + } + if(door.Tag=='sub_doors'){ + door.bLocked = true; + door.bHighlight = true; + door.bFrobbable = true; + door.bPickable = false;// make sure DXRDoors sees this as an undefeatable door, also in vanilla this door is obviously not pickable due to not being frobbable + } } - } - AddSwitch( vect(654.545,3889.5397,-367.262), rot(0, 16384, 0), 'ShedDoor'); - - fg=Spawn(class'#var(prefix)FishGenerator',,, vectm(5657,-1847,-1377));//Near tunnel to sub bay - fg.ActiveArea=20000; //Long line of sight on this one... Want it to trigger early + AddSwitch( vect(654.545,3889.5397,-367.262), rot(0, 16384, 0), 'ShedDoor'); + fg=Spawn(class'#var(prefix)FishGenerator',,, vectm(5657,-1847,-1377));//Near tunnel to sub bay + fg.ActiveArea=20000; //Long line of sight on this one... Want it to trigger early + } break; case "14_OCEANLAB_LAB": - if(!#defined(vmd))// button to open the door heading towards the ladder in the water - AddSwitch( vect(3077.360107, 497.609467, -1738.858521), rot(0, 0, 0), 'Access'); + if (VanillaMaps){ + if(!#defined(vmd))// button to open the door heading towards the ladder in the water + AddSwitch( vect(3077.360107, 497.609467, -1738.858521), rot(0, 0, 0), 'Access'); - foreach AllActors(class'#var(DeusExPrefix)Mover',door){ - if(door.KeyIDNeeded=='crewkey'){ - door.Tag = 'crewkey'; - } - if(door.KeyIDNeeded=='Glab'){ - door.Tag = 'Glab'; + foreach AllActors(class'#var(DeusExPrefix)Mover',door){ + if(door.KeyIDNeeded=='crewkey'){ + door.Tag = 'crewkey'; + } + if(door.KeyIDNeeded=='Glab'){ + door.Tag = 'Glab'; + } } - } - // backtracking button for crew module - AddSwitch( vect(4888.692871, 3537.360107, -1753.115845), rot(0, 16384, 0), 'crewkey').bCollideWorld = false; - // backtracking button for greasel lab - AddSwitch( vect(1893.359985, 491.932892, -1535.522339), rot(0, 0, 0), 'Glab'); - - foreach AllActors(class'ComputerSecurity', comp) { - if( comp.UserList[0].userName == "Kraken" && comp.UserList[0].Password == "Oceanguard" ) { - comp.UserList[0].userName = "Oceanguard"; - comp.UserList[0].Password = "Kraken"; + // backtracking button for crew module + AddSwitch( vect(4888.692871, 3537.360107, -1753.115845), rot(0, 16384, 0), 'crewkey').bCollideWorld = false; + // backtracking button for greasel lab + AddSwitch( vect(1893.359985, 491.932892, -1535.522339), rot(0, 0, 0), 'Glab'); + + foreach AllActors(class'ComputerSecurity', comp) { + if( comp.UserList[0].userName == "Kraken" && comp.UserList[0].Password == "Oceanguard" ) { + comp.UserList[0].userName = "Oceanguard"; + comp.UserList[0].Password = "Kraken"; + } } - } - - Spawn(class'PlaceholderItem',,, vectm(37.5,531.4,-1569)); //Secretary desk - Spawn(class'PlaceholderItem',,, vectm(2722,226.5,-1481)); //Greasel Lab desk - Spawn(class'PlaceholderItem',,, vectm(4097.8,395.4,-1533)); //Desk with zappy electricity near construction zone - Spawn(class'PlaceholderItem',,, vectm(4636.1,1579.3,-1741)); //Electrical box in construction zone - Spawn(class'PlaceholderItem',,, vectm(5359.5,3122.3,-1761)); //Construction vehicle tread - Spawn(class'PlaceholderItem',,, vectm(3114.3,3711.2,-2549)); //Storage room in crew capsule - - Spawn(class'PlaceholderContainer',,, vectm(-71,775,-1599)); //Secretary desk corner - Spawn(class'PlaceholderContainer',,, vectm(1740,156,-1599)); //Open storage room - Spawn(class'PlaceholderContainer',,, vectm(2999,482,-1503)); //Greasel lab - Spawn(class'PlaceholderContainer',,, vectm(1780,3725,-2483)); //Crew module bed - Spawn(class'PlaceholderContainer',,, vectm(1733,3848,-4223)); //Corner in hall to UC + Spawn(class'PlaceholderItem',,, vectm(37.5,531.4,-1569)); //Secretary desk + Spawn(class'PlaceholderItem',,, vectm(2722,226.5,-1481)); //Greasel Lab desk + Spawn(class'PlaceholderItem',,, vectm(4097.8,395.4,-1533)); //Desk with zappy electricity near construction zone + Spawn(class'PlaceholderItem',,, vectm(4636.1,1579.3,-1741)); //Electrical box in construction zone + Spawn(class'PlaceholderItem',,, vectm(5359.5,3122.3,-1761)); //Construction vehicle tread + Spawn(class'PlaceholderItem',,, vectm(3114.3,3711.2,-2549)); //Storage room in crew capsule + + Spawn(class'PlaceholderContainer',,, vectm(-71,775,-1599)); //Secretary desk corner + Spawn(class'PlaceholderContainer',,, vectm(1740,156,-1599)); //Open storage room + Spawn(class'PlaceholderContainer',,, vectm(2999,482,-1503)); //Greasel lab + Spawn(class'PlaceholderContainer',,, vectm(1780,3725,-2483)); //Crew module bed + Spawn(class'PlaceholderContainer',,, vectm(1733,3848,-4223)); //Corner in hall to UC + } break; case "14_OCEANLAB_UC": - //Make the datalink immediately trigger when you download the schematics, regardless of where the computer is - foreach AllActors(class'FlagTrigger',ft){ - if (ft.name=='FlagTrigger0'){ - ft.bTrigger = True; - ft.event = 'schematic2'; + if (VanillaMaps){ + //Make the datalink immediately trigger when you download the schematics, regardless of where the computer is + foreach AllActors(class'FlagTrigger',ft){ + if (ft.name=='FlagTrigger0'){ + ft.bTrigger = True; + ft.event = 'schematic2'; + } } - } - foreach AllActors(class'DataLinkTrigger',dlt){ - if (dlt.name=='DataLinkTrigger2'){ - dlt.Tag = 'schematic2'; + foreach AllActors(class'DataLinkTrigger',dlt){ + if (dlt.name=='DataLinkTrigger2'){ + dlt.Tag = 'schematic2'; + } } - } - //This door can get stuck if a spiderbot gets jammed into the little bot-bay - foreach AllActors(class'#var(DeusExPrefix)Mover', door, 'Releasebots') { - door.MoverEncroachType=ME_IgnoreWhenEncroach; - } + //This door can get stuck if a spiderbot gets jammed into the little bot-bay + foreach AllActors(class'#var(DeusExPrefix)Mover', door, 'Releasebots') { + door.MoverEncroachType=ME_IgnoreWhenEncroach; + } - foreach AllActors(class'#var(prefix)BeamTrigger',bt,'Lasertrip'){ - bt.Event='ReleasebotsOnce'; - } + foreach AllActors(class'#var(prefix)BeamTrigger',bt,'Lasertrip'){ + bt.Event='ReleasebotsOnce'; + } - oot=Spawn(class'OnceOnlyTrigger'); - oot.Event='Releasebots'; - oot.Tag='ReleasebotsOnce'; + oot=Spawn(class'OnceOnlyTrigger'); + oot.Event='Releasebots'; + oot.Tag='ReleasebotsOnce'; - Spawn(class'PlaceholderItem',,, vectm(1020.93,8203.4,-2864)); //Over security computer - Spawn(class'PlaceholderItem',,, vectm(348.9,8484.63,-2913)); //Turret room - Spawn(class'PlaceholderItem',,, vectm(1280.84,8534.17,-2913)); //Turret room - Spawn(class'PlaceholderItem',,, vectm(1892,8754.5,-2901)); //Turret room, opposite from bait computer + Spawn(class'PlaceholderItem',,, vectm(1020.93,8203.4,-2864)); //Over security computer + Spawn(class'PlaceholderItem',,, vectm(348.9,8484.63,-2913)); //Turret room + Spawn(class'PlaceholderItem',,, vectm(1280.84,8534.17,-2913)); //Turret room + Spawn(class'PlaceholderItem',,, vectm(1892,8754.5,-2901)); //Turret room, opposite from bait computer + } break; case "14_Oceanlab_silo": - if(!dxr.flags.IsReducedRando()) { - foreach AllActors(class'HowardStrong', hs) { - hs.ChangeAlly('', 1, true); - hs.ChangeAlly('mj12', 1, true); - hs.ChangeAlly('spider', 1, true); - RemoveFears(hs); - hs.MinHealth = 0; - hs.BaseAccuracy *= 0.1; - - GiveItem(hs, class'#var(prefix)BallisticArmor'); - dxre = DXREnemies(dxr.FindModule(class'DXREnemies')); - if(dxre != None) { - dxre.GiveRandomWeapon(hs, false, 2); - dxre.GiveRandomMeleeWeapon(hs); + if (VanillaMaps){ + if(!dxr.flags.IsReducedRando()) { + foreach AllActors(class'HowardStrong', hs) { + hs.ChangeAlly('', 1, true); + hs.ChangeAlly('mj12', 1, true); + hs.ChangeAlly('spider', 1, true); + RemoveFears(hs); + hs.MinHealth = 0; + hs.BaseAccuracy *= 0.1; + + GiveItem(hs, class'#var(prefix)BallisticArmor'); + 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); + } } - 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); + //The door closing behind you when the ambush starts sucks if you came in via the silo. + //Just make it not close. + foreach AllActors(class'SequenceTrigger', st, 'doorclose') { + if (st.Event=='blast_door4' && st.Tag=='doorclose'){ + st.Event = ''; + st.Tag = 'doorclosejk'; + break; } } - } - //The door closing behind you when the ambush starts sucks if you came in via the silo. - //Just make it not close. - foreach AllActors(class'SequenceTrigger', st, 'doorclose') { - if (st.Event=='blast_door4' && st.Tag=='doorclose'){ - st.Event = ''; - st.Tag = 'doorclosejk'; - break; - } + class'PlaceholderEnemy'.static.Create(self,vectm(-264,-6991,-553)); + class'PlaceholderEnemy'.static.Create(self,vectm(-312,-6886,327)); + class'PlaceholderEnemy'.static.Create(self,vectm(270,-6601,1500)); + class'PlaceholderEnemy'.static.Create(self,vectm(-1257,-3472,1468)); + class'PlaceholderEnemy'.static.Create(self,vectm(1021,-3323,1476)); } - - class'PlaceholderEnemy'.static.Create(self,vectm(-264,-6991,-553)); - class'PlaceholderEnemy'.static.Create(self,vectm(-312,-6886,327)); - class'PlaceholderEnemy'.static.Create(self,vectm(270,-6601,1500)); - class'PlaceholderEnemy'.static.Create(self,vectm(-1257,-3472,1468)); - class'PlaceholderEnemy'.static.Create(self,vectm(1021,-3323,1476)); - break; case "12_VANDENBERG_COMPUTER": + if (VanillaMaps){ + foreach AllActors(class'#var(prefix)OrdersTrigger',ot,'GaryWalksToPosition'){ + ot.Orders='RunningTo'; + ot.ordersTag='gary_patrol1'; + } - foreach AllActors(class'#var(prefix)OrdersTrigger',ot,'GaryWalksToPosition'){ - ot.Orders='RunningTo'; - ot.ordersTag='gary_patrol1'; - } + //Show the strength of the fan grill + foreach AllActors(class'#var(DeusExPrefix)Mover',door,'BreakableWall'){ + door.bHighlight = true; + door.bLocked=true; + door.bPickable=false; + } - Spawn(class'PlaceholderItem',,, vectm(579,2884,-1629)); //Table near entrance - Spawn(class'PlaceholderItem',,, vectm(1057,2685.25,-1637)); //Table overlooking computer room - Spawn(class'PlaceholderItem',,, vectm(1970,2883.43,-1941)); //In first floor computer room + Spawn(class'PlaceholderItem',,, vectm(579,2884,-1629)); //Table near entrance + Spawn(class'PlaceholderItem',,, vectm(1057,2685.25,-1637)); //Table overlooking computer room + Spawn(class'PlaceholderItem',,, vectm(1970,2883.43,-1941)); //In first floor computer room + } break; case "12_VANDENBERG_GAS": - class'PlaceholderEnemy'.static.Create(self,vectm(635,488,-930)); - rg=Spawn(class'#var(prefix)RatGenerator',,, vectm(1000,745,-972));//Gas Station back room - rg.MaxCount=1; - rg=Spawn(class'#var(prefix)RatGenerator',,, vectm(-2375,-644,-993));//Under trailer near Jock - rg.MaxCount=1; - - Spawn(class'PlaceholderItem',,, vectm(-366,-2276,-1553)); //Under collapsed bridge - Spawn(class'PlaceholderItem',,, vectm(-394,-1645,-1565)); //Near bridge pillar - Spawn(class'PlaceholderItem',,, vectm(-88,-2087,-1553)); //Collapsed bridge road surface - Spawn(class'PlaceholderItem',,, vectm(909,-2474,-1551)); //Wrecked car - Spawn(class'PlaceholderItem',,, vectm(-3152,-2780,-1364)); //Ledge near original key - + if (VanillaMaps){ + class'PlaceholderEnemy'.static.Create(self,vectm(635,488,-930)); + rg=Spawn(class'#var(prefix)RatGenerator',,, vectm(1000,745,-972));//Gas Station back room + rg.MaxCount=1; + rg=Spawn(class'#var(prefix)RatGenerator',,, vectm(-2375,-644,-993));//Under trailer near Jock + rg.MaxCount=1; + + Spawn(class'PlaceholderItem',,, vectm(-366,-2276,-1553)); //Under collapsed bridge + Spawn(class'PlaceholderItem',,, vectm(-394,-1645,-1565)); //Near bridge pillar + Spawn(class'PlaceholderItem',,, vectm(-88,-2087,-1553)); //Collapsed bridge road surface + Spawn(class'PlaceholderItem',,, vectm(909,-2474,-1551)); //Wrecked car + Spawn(class'PlaceholderItem',,, vectm(-3152,-2780,-1364)); //Ledge near original key + } break; -#endif } } @@ -287,16 +309,19 @@ function PostFirstEntryMapFixes() { local #var(prefix)CrateUnbreakableLarge c; local Actor a; + local bool RevisionMaps; + + RevisionMaps = class'DXRMapVariants'.static.IsRevisionMaps(player()); switch(dxr.localURL) { -#ifndef revision case "12_VANDENBERG_CMD": - foreach RadiusActors(class'#var(prefix)CrateUnbreakableLarge', c, 16, vectm(570.835083, 1934.114014, -1646.114746)) { - info("removing " $ c $ " dist: " $ VSize(c.Location - vectm(570.835083, 1934.114014, -1646.114746)) ); - c.Destroy(); + if(!RevisionMaps){ + foreach RadiusActors(class'#var(prefix)CrateUnbreakableLarge', c, 16, vectm(570.835083, 1934.114014, -1646.114746)) { + info("removing " $ c $ " dist: " $ VSize(c.Location - vectm(570.835083, 1934.114014, -1646.114746)) ); + c.Destroy(); + } } break; -#endif case "14_OCEANLAB_LAB": // ensure rebreather before greasel lab, in case the storage closet key is in the flooded area a = AddActor(class'#var(prefix)Rebreather', vect(1569, 24, -1628)); @@ -348,6 +373,9 @@ function AnyEntryMapFixes() case "12_VANDENBERG_COMPUTER": SetTimer(1, true); break; + case "12_VANDENBERG_CMD": + Player().StartDataLinkTransmission("DL_no_carla"); + break; } } diff --git a/DXRMissions/DeusEx/Classes/DXRMissionsM01.uc b/DXRMissions/DeusEx/Classes/DXRMissionsM01.uc index 3512c1cec..3c1b50201 100644 --- a/DXRMissions/DeusEx/Classes/DXRMissionsM01.uc +++ b/DXRMissions/DeusEx/Classes/DXRMissionsM01.uc @@ -2,33 +2,44 @@ class DXRMissionsM01 extends DXRMissions; function int InitGoals(int mission, string map) { - local int goal, loc, loc2; + local int goal, goal2, loc, loc2; goal = AddGoal("01_NYC_UNATCOISLAND", "Terrorist Commander", NORMAL_GOAL, 'TerroristCommander0', PHYS_Falling); AddGoalActor(goal, 1, 'DataLinkTrigger12', PHYS_None); - AddGoal("01_NYC_UNATCOISLAND", "Police Boat", GOAL_TYPE1, 'NYPoliceBoat0', PHYS_None); + goal2 = AddGoal("01_NYC_UNATCOISLAND", "Police Boat", GOAL_TYPE1, 'NYPoliceBoat0', PHYS_None); loc = AddGoalLocation("01_NYC_UNATCOISLAND", "UNATCO HQ", START_LOCATION, vect(-6348.445313, 1912.637207, -111.428482), rot(0, 0, 0)); loc2 = AddGoalLocation("01_NYC_UNATCOISLAND", "Dock", NORMAL_GOAL | VANILLA_START, vect(-4760.569824, 10430.811523, -280.674988), rot(0, -7040, 0)); AddMutualExclusion(loc, loc2); + AddMapMarker(class'Image01_LibertyIsland',156,364,"L","Terrorist Commander", loc2,"Leo Gold, the terrorist commander, can be located on the south dock. This is the location you would normally start the game."); + loc2 = AddGoalLocation("01_NYC_UNATCOISLAND", "Hut", NORMAL_GOAL, vect(-2407.206787, 205.915558, -128.899979), rot(0, 30472, 0)); AddMutualExclusion(loc, loc2); + AddMapMarker(class'Image01_LibertyIsland',156,199,"L","Terrorist Commander", loc2,"Leo Gold, the terrorist commander, can be located in the small hut in front of the statue."); loc = AddGoalLocation("01_NYC_UNATCOISLAND", "Harley Filben Dock", START_LOCATION, vect(1297.173096, -10257.972656, -287.428131), rot(0, 0, 0)); loc2 = AddGoalLocation("01_NYC_UNATCOISLAND", "Electric Bunker", NORMAL_GOAL | START_LOCATION, vect(6552.227539, -3246.095703, -447.438049), rot(0, 0, 0)); AddMutualExclusion(loc, loc2); + AddMapMarker(class'Image01_LibertyIsland',318,140,"L","Terrorist Commander",loc2,"Leo Gold, the terrorist commander, can be located in the back of the small bunker next to the statue. He would be behind the malfunctioning electrical box."); - AddGoalLocation("01_NYC_UNATCOISLAND", "Jail", NORMAL_GOAL | START_LOCATION, vect(2127.692139, -1774.869141, -149.140366), rot(0, 0, 0)); + loc=AddGoalLocation("01_NYC_UNATCOISLAND", "Jail", NORMAL_GOAL | START_LOCATION, vect(2127.692139, -1774.869141, -149.140366), rot(0, 0, 0)); + AddMapMarker(class'Image01_LibertyIsland',235,147,"L","Terrorist Commander", loc,"Leo Gold, the terrorist commander, can be located inside the jail cell where Gunther is locked up."); loc = AddGoalLocation("01_NYC_UNATCOISLAND", "Top of the Base", NORMAL_GOAL, vect(2980.058105, -669.242554, 1056.577271), rot(0, 0, 0)); + AddMapMarker(class'Image01_LibertyIsland',257,159,"L","Terrorist Commander",loc,"Leo Gold, the terrorist commander, can be located on the highest outside level of the base of the statue."); loc2 = AddGoalLocation("01_nyc_unatcoisland", "Top of the Statue", NORMAL_GOAL | VANILLA_GOAL | START_LOCATION, vect(2931.230957, 27.495235, 2527.800049), rot(0, 14832, 0)); + AddMapMarker(class'Image01_LibertyIsland',260,184,"L","Terrorist Commander",loc2,"Leo Gold, the terrorist commander, can be located in the command post at the top of the statue. This is his vanilla location."); AddMutualExclusion(loc, loc2); //Boat locations - AddGoalLocation("01_nyc_unatcoisland", "South Dock", GOAL_TYPE1 | VANILLA_GOAL , vect(-5122.414551, 10138.813477, -269.806213), rot(0, 0, 0)); - AddGoalLocation("01_nyc_unatcoisland", "North Dock", GOAL_TYPE1 , vect(4535.585938, -10046.186523, -269.806213), rot(0, 0, 0)); - AddGoalLocation("01_nyc_unatcoisland", "Top of the Statue", GOAL_TYPE1 , vect(3682.585449, 231.813477, 2108.193848), rot(0, 0, 0)); - AddGoalLocation("01_nyc_unatcoisland", "Behind UNATCO", GOAL_TYPE1 , vect(-4578.414551, 267.813477, 24.193787), rot(0, 0, 0)); + loc=AddGoalLocation("01_nyc_unatcoisland", "South Dock", GOAL_TYPE1 | VANILLA_GOAL , vect(-5122.414551, 10138.813477, -269.806213), rot(0, 0, 0)); + AddMapMarker(class'Image01_LibertyIsland',130,371,"B","Police Boat",loc,"The police boat can be located at the South dock, where you normally start the game. This is the vanilla location."); + loc=AddGoalLocation("01_nyc_unatcoisland", "North Dock", GOAL_TYPE1 , vect(4535.585938, -10046.186523, -269.806213), rot(0, 0, 0)); + AddMapMarker(class'Image01_LibertyIsland',250,16,"B","Police Boat",loc,"The police boat can be located at the North dock, near where Harley Filben is located."); + loc=AddGoalLocation("01_nyc_unatcoisland", "Top of the Statue", GOAL_TYPE1 , vect(3682.585449, 231.813477, 2108.193848), rot(0, 0, 0)); + AddMapMarker(class'Image01_LibertyIsland',281,179,"B","Police Boat",loc,"The police boat can be located floating off the side of an upper level of the statue."); + loc=AddGoalLocation("01_nyc_unatcoisland", "Behind UNATCO", GOAL_TYPE1 , vect(-4578.414551, 267.813477, 24.193787), rot(0, 0, 0)); + AddMapMarker(class'Image01_LibertyIsland',121,200,"B","Police Boat",loc,"The police boat can be located floating behind UNATCO HQ, near the small hut in front of the statue."); return mission; } diff --git a/DXRMissions/DeusEx/Classes/DXRMissionsM02.uc b/DXRMissions/DeusEx/Classes/DXRMissionsM02.uc index 43dc75d82..d00ab9b56 100644 --- a/DXRMissions/DeusEx/Classes/DXRMissionsM02.uc +++ b/DXRMissions/DeusEx/Classes/DXRMissionsM02.uc @@ -194,6 +194,9 @@ function PreFirstEntryMapFixes() { local #var(prefix)AnnaNavarre anna; local #var(prefix)InterpolateTrigger it; + local bool RevisionMaps; + + RevisionMaps = class'DXRMapVariants'.static.IsRevisionMaps(player()); if( dxr.localURL == "02_NYC_BATTERYPARK" ) { foreach AllActors(class'#var(prefix)AnnaNavarre', anna) { @@ -206,7 +209,7 @@ function PreFirstEntryMapFixes() ReplaceBatteryParkSubwayTNT(); } - if (#defined(revision) && dxr.localURL=="02_NYC_WAREHOUSE"){ + if (RevisionMaps && dxr.localURL=="02_NYC_WAREHOUSE"){ foreach AllActors(class'#var(prefix)InterpolateTrigger',it,'FlyInTrigger'){ it.Destroy(); } diff --git a/DXRMissions/DeusEx/Classes/DXRMissionsM03.uc b/DXRMissions/DeusEx/Classes/DXRMissionsM03.uc index 759d2b391..5a9879e4d 100644 --- a/DXRMissions/DeusEx/Classes/DXRMissionsM03.uc +++ b/DXRMissions/DeusEx/Classes/DXRMissionsM03.uc @@ -48,21 +48,33 @@ function int InitGoals(int mission, string map) case "03_NYC_AIRFIELD": AddGoal("03_NYC_AIRFIELD", "Terrorist with the East Gate key", NORMAL_GOAL, 'Terrorist13', PHYS_Falling); - AddGoalLocation("03_NYC_AIRFIELD", "South Gate", NORMAL_GOAL, vect(223.719452, 3689.905273, 15.100115), rot(0, 0, 0)); - AddGoalLocation("03_NYC_AIRFIELD", "SW Security Tower", NORMAL_GOAL, vect(-2103.891113, 3689.706299, 15.091076), rot(0, 0, 0)); - AddGoalLocation("03_NYC_AIRFIELD", "West Security Tower", NORMAL_GOAL, vect(-2060.626465, -2013.138672, 15.090023), rot(0, 0, 0)); - AddGoalLocation("03_NYC_AIRFIELD", "NW Security Tower", NORMAL_GOAL, vect(729.454651, -4151.924805, 15.079981), rot(0, 0, 0)); - AddGoalLocation("03_NYC_AIRFIELD", "NE Security Tower", NORMAL_GOAL, vect(5215.076660, -4134.674316, 15.090023), rot(0, 0, 0)); - AddGoalLocation("03_NYC_AIRFIELD", "Hangar Door", NORMAL_GOAL, vect(941.941895, 283.418152, 15.090023), rot(0, 0, 0)); - AddGoalLocation("03_NYC_AIRFIELD", "Dock", NORMAL_GOAL | VANILLA_GOAL, vect(-2687.128662,2320.010986,63.774998), rot(0,0,0)); + loc=AddGoalLocation("03_NYC_AIRFIELD", "South Gate", NORMAL_GOAL, vect(223.719452, 3689.905273, 15.100115), rot(0, 0, 0)); + AddMapMarker(class'Image03_NYC_Airfield',324,270,"K","East Gate Key", loc,"The terrorist with the key to the East Gate can be located at the South Gate in the airfield."); + loc=AddGoalLocation("03_NYC_AIRFIELD", "SW Security Tower", NORMAL_GOAL, vect(-2103.891113, 3689.706299, 15.091076), rot(0, 0, 0)); + AddMapMarker(class'Image03_NYC_Airfield',303,361,"K","East Gate Key", loc,"The terrorist with the key to the East Gate can be located outside the South West Security Tower in the airfield."); + loc=AddGoalLocation("03_NYC_AIRFIELD", "West Security Tower", NORMAL_GOAL, vect(-2060.626465, -2013.138672, 15.090023), rot(0, 0, 0)); + AddMapMarker(class'Image03_NYC_Airfield',100,290,"K","East Gate Key", loc,"The terrorist with the key to the East Gate can be located outside the West Security Tower in the airfield."); + loc=AddGoalLocation("03_NYC_AIRFIELD", "NW Security Tower", NORMAL_GOAL, vect(729.454651, -4151.924805, 15.079981), rot(0, 0, 0)); + AddMapMarker(class'Image03_NYC_Airfield',79,162,"K","East Gate Key", loc,"The terrorist with the key to the East Gate can be located outside the North West Security Tower in the airfield."); + loc=AddGoalLocation("03_NYC_AIRFIELD", "NE Security Tower", NORMAL_GOAL, vect(5215.076660, -4134.674316, 15.090023), rot(0, 0, 0)); + AddMapMarker(class'Image03_NYC_Airfield',128,49,"K","East Gate Key", loc,"The terrorist with the key to the East Gate can be located outside the North East Security Tower in the airfield."); + loc=AddGoalLocation("03_NYC_AIRFIELD", "Hangar Door", NORMAL_GOAL, vect(941.941895, 283.418152, 15.090023), rot(0, 0, 0)); + AddMapMarker(class'Image03_NYC_Airfield',232,213,"K","East Gate Key", loc,"The terrorist with the key to the East Gate can be located outside the hangar doors in the airfield."); + loc=AddGoalLocation("03_NYC_AIRFIELD", "Dock", NORMAL_GOAL | VANILLA_GOAL, vect(-2687.128662,2320.010986,63.774998), rot(0,0,0)); + AddMapMarker(class'Image03_NYC_Airfield',257,354,"K","East Gate Key", loc,"The terrorist with the key to the East Gate can be located on the docks at the airfield. This is the vanilla location."); goal = AddGoal("03_NYC_AIRFIELD", "Ambrosia", GOAL_TYPE1, 'BarrelAmbrosia0', PHYS_Falling); AddGoalActor(goal,1,'FlagTrigger0',PHYS_None); //Reduced radius, sets BoatDocksAmbrosia - AddGoalLocation("03_NYC_AIRFIELD", "Docks", GOAL_TYPE1 | VANILLA_GOAL, vect(-2482.986816,1924.479126,44.869865), rot(0,0,0)); - AddGoalLocation("03_NYC_AIRFIELD", "Hangar Door", GOAL_TYPE1, vect(1069,289,45), rot(0,16328,0)); - AddGoalLocation("03_NYC_AIRFIELD", "Near Electrical", GOAL_TYPE1, vect(5317,-2405,45), rot(0,16328,0)); - AddGoalLocation("03_NYC_AIRFIELD", "Near Satellite", GOAL_TYPE1, vect(5317,3189,45), rot(0,16328,0)); - AddGoalLocation("03_NYC_AIRFIELD", "Cargo Container", GOAL_TYPE1, vect(-220,3012,373), rot(0,25344,0)); + loc=AddGoalLocation("03_NYC_AIRFIELD", "Docks", GOAL_TYPE1 | VANILLA_GOAL, vect(-2482.986816,1924.479126,44.869865), rot(0,0,0)); + AddMapMarker(class'Image03_NYC_Airfield',241,354,"A","Ambrosia", loc,"A barrel of Ambrosia can be located on the docks in the airfield. This is a vanilla location."); + loc=AddGoalLocation("03_NYC_AIRFIELD", "Hangar Door", GOAL_TYPE1, vect(1069,289,45), rot(0,16328,0)); + AddMapMarker(class'Image03_NYC_Airfield',213,204,"A","Ambrosia", loc,"A barrel of Ambrosia can be located in the airfield in front of the main hangar doors."); + loc=AddGoalLocation("03_NYC_AIRFIELD", "Near Electrical", GOAL_TYPE1, vect(5317,-2405,45), rot(0,16328,0)); + AddMapMarker(class'Image03_NYC_Airfield',172,55,"A","Ambrosia", loc,"A barrel of Ambrosia can be located near the electrical area in the airfield."); + loc=AddGoalLocation("03_NYC_AIRFIELD", "Near Satellite", GOAL_TYPE1, vect(5317,3189,45), rot(0,16328,0)); + AddMapMarker(class'Image03_NYC_Airfield',339,106,"A","Ambrosia", loc,"A barrel of Ambrosia can be located near the satellite dish in the airfield, outside the barracks."); + loc=AddGoalLocation("03_NYC_AIRFIELD", "Cargo Container", GOAL_TYPE1, vect(-220,3012,373), rot(0,25344,0)); + AddMapMarker(class'Image03_NYC_Airfield',298,280,"A","Ambrosia", loc,"A barrel of Ambrosia can be located inside a cargo container in the airfield."); return 33; @@ -85,12 +97,18 @@ function int InitGoals(int mission, string map) goal = AddGoal("03_NYC_747", "747 Ambrosia", NORMAL_GOAL, 'BarrelAmbrosia1', PHYS_Falling); AddGoalActor(goal,1,'FlagTrigger1',PHYS_None); //Reduced radius, sets 747Ambrosia - AddGoalLocation("03_NYC_747", "Cargo", NORMAL_GOAL | VANILLA_GOAL, vect(-147.147064,-511.348846,158.870544), rot(0,15760,0)); - AddGoalLocation("03_NYC_747", "Office", NORMAL_GOAL, vect(6,-736,339), rot(0,-32,0)); - AddGoalLocation("03_NYC_747", "Flight Deck", NORMAL_GOAL, vect(1339,-513,484), rot(0,16480,0)); - AddGoalLocation("03_NYC_747", "Bedroom", NORMAL_GOAL, vect(1594,-710,368), rot(0,0,0)); - AddGoalLocation("03_NYC_HANGAR", "Near Trailers", NORMAL_GOAL, vect(1867,-1318,29), rot(0,0,0)); - AddGoalLocation("03_NYC_HANGAR", "Near Engine", NORMAL_GOAL, vect(4140,-1554,29), rot(0,32776,0)); + loc=AddGoalLocation("03_NYC_747", "Cargo", NORMAL_GOAL | VANILLA_GOAL, vect(-147.147064,-511.348846,158.870544), rot(0,15760,0)); + AddMapMarker(class'Image03_747Diagram',34,66,"A","Ambrosia", loc,"A barrel of Ambrosia can be located in the cargo hold of the 747. This is one of the vanilla Ambrosia locations."); + loc=AddGoalLocation("03_NYC_747", "Office", NORMAL_GOAL, vect(6,-736,339), rot(0,-32,0)); + AddMapMarker(class'Image03_747Diagram',89,163,"A","Ambrosia", loc,"A barrel of Ambrosia can be located in the office on board the 747."); + loc=AddGoalLocation("03_NYC_747", "Flight Deck", NORMAL_GOAL, vect(1339,-513,484), rot(0,16480,0)); + AddMapMarker(class'Image03_747Diagram',298,321,"A","Ambrosia", loc,"A barrel of Ambrosia can be located on the flight deck of the 747."); + loc=AddGoalLocation("03_NYC_747", "Bedroom", NORMAL_GOAL, vect(1594,-710,368), rot(0,0,0)); + AddMapMarker(class'Image03_747Diagram',355,169,"A","Ambrosia", loc,"A barrel of Ambrosia can be located in the bedroom of the 747."); + loc=AddGoalLocation("03_NYC_HANGAR", "Near Trailers", NORMAL_GOAL, vect(1867,-1318,29), rot(0,0,0)); + AddMapMarker(class'Image03_NYC_Airfield',230,155,"A","Ambrosia", loc,"A barrel of Ambrosia can be located near some trailers inside the hangar."); + loc=AddGoalLocation("03_NYC_HANGAR", "Near Engine", NORMAL_GOAL, vect(4140,-1554,29), rot(0,32776,0)); + AddMapMarker(class'Image03_NYC_Airfield',225,76,"A","Ambrosia", loc,"A barrel of Ambrosia can be located near the engine of the 747 inside the hangar."); return 35; } @@ -195,16 +213,23 @@ function int InitGoalsRev(int mission, string map) return mission+1000; } -function PreFirstEntryMapFixes() +function AnyEntry() { - local FlagTrigger ft; - local #var(prefix)Terrorist t; + Super.AnyEntry(); switch(dxr.localURL) { case "03_NYC_BATTERYPARK": Player().StartDataLinkTransmission("dl_batterypark"); break; + } +} +function PreFirstEntryMapFixes() +{ + local FlagTrigger ft; + local #var(prefix)Terrorist t; + + switch(dxr.localURL) { case "03_NYC_AIRFIELDHELIBASE": foreach AllActors(class'FlagTrigger',ft){// probably ambrosia if (ft.Name=='FlagTrigger0'){ diff --git a/DXRMissions/DeusEx/Classes/DXRMissionsM05.uc b/DXRMissions/DeusEx/Classes/DXRMissionsM05.uc index cbf81b794..51adf98ab 100644 --- a/DXRMissions/DeusEx/Classes/DXRMissionsM05.uc +++ b/DXRMissions/DeusEx/Classes/DXRMissionsM05.uc @@ -14,17 +14,21 @@ function int InitGoals(int mission, string map) loc = AddGoalLocation("05_NYC_UNATCOMJ12LAB", "Armory", NORMAL_GOAL, vect(-8548.773438, 1074.370850, -20.860909), rot(0, 0, 0)); AddActorLocation(loc, 3, vect(-8162.683594, 1194.161621, 276.902924), rot(-6000, 36000, 0)); + AddMapMarker(class'Image05_NYC_MJ12Lab',33,289,"P","Paul", loc,"Paul can be located on the second floor of the armory. If Paul is in this location, your equipment will be located in the surgery ward."); loc = AddGoalLocation("05_NYC_UNATCOMJ12LAB", "Surgery Ward", NORMAL_GOAL | VANILLA_GOAL, vect(2281.708008, -617.352478, -224.400238), rot(0,35984,0)); AddActorLocation(loc, 1, vect(2177.405273, -552.487671, -200.899811), rot(0, 16944, 0)); AddActorLocation(loc, 2, vect(2177.405273, -552.487671, -200.899811), rot(0, 16944, 0)); //DataLinkTrigger should be centered on his carcass rather than his living location AddActorLocation(loc, 3, vect(1891.301514, -289.854248, -64.997406), rot(-3000, 58200, 0)); + AddMapMarker(class'Image05_NYC_MJ12Lab',379,96,"P","Paul", loc,"Paul can be located in the surgery ward. This is the vanilla location. If Paul is in this location, your equipment will be located in the armory."); loc = AddGoalLocation("05_NYC_UNATCOMJ12LAB", "Greasel Pit", NORMAL_GOAL, vect(375,3860,-604), rot(0, 8048, 0)); AddActorLocation(loc, 3, vect(745.180481, 4150.960449, -477.601196), rot(-3100, 39700, 0)); + AddMapMarker(class'Image05_NYC_MJ12Lab',325,226,"P","Paul", loc,"Paul can be located in the greasel pit accessed through the vent on the back wall of the nanotech lab. If Paul is in this location, your equipment will be located in the armory."); loc = AddGoalLocation("05_NYC_UNATCOMJ12LAB", "Robotics Bay Office", NORMAL_GOAL, vect(-4297,1083,210), rot(0, 16392, 0)); AddActorLocation(loc, 3, vect(-4289.660645, 1397.180054, 307.937073), rot(-2000, -16384, 0)); + AddMapMarker(class'Image05_NYC_MJ12Lab',171,286,"P","Paul", loc,"Paul can be located in the office on the third floor of the robotics bay. If Paul is in this location, your equipment will be located in the surgery ward."); return 51; @@ -123,6 +127,9 @@ function AfterShuffleGoals(int goalsToLocations[32]) local int g; local string dctext; local PaulDentonCarcass paulbody; + local bool RevisionMaps; + + RevisionMaps = class'DXRMapVariants'.static.IsRevisionMaps(player()); //Only do this on mission 5 UNATCO HQ if (dxr.localURL == "05_NYC_UNATCOHQ"){ @@ -144,13 +151,13 @@ function AfterShuffleGoals(int goalsToLocations[32]) dctext = dctext $ "|n|nBoth using the DEMIURGE username. JC will never find them!"; - if (#defined(revision)){ + if (RevisionMaps){ SpawnDatacubePlaintext(vectm(1130.502441,195.451401,321.369446), rotm(0,0,0), dctext, true); } else { SpawnDatacubePlaintext(vectm(243.288742, -104.183029, 289.368256), rotm(0,0,0), dctext, true); } - } else if (dxr.localURL == "05_NYC_UNATCOMJ12LAB" && #defined(revision)){ + } else if (dxr.localURL == "05_NYC_UNATCOMJ12LAB" && #defined(revision)){ //For some reason shuffling Paul's body stops it from being destroyed by the mission script if (!player().flagbase.GetBool('PaulDenton_Dead')){ foreach AllActors(class'PaulDentonCarcass',paulbody){ @@ -166,17 +173,20 @@ function PreFirstEntryMapFixes() local #var(prefix)ComputerSecurity cs; local #var(prefix)DataLinkTrigger dlt; local int i; + local bool RevisionMaps; + + RevisionMaps = class'DXRMapVariants'.static.IsRevisionMaps(player()); if( dxr.localURL ~= "05_NYC_UNATCOHQ" ) { // jail computer - if (!#defined(revision)){ + if (!RevisionMaps){ cp = Spawn(class'#var(prefix)ComputerPersonal',, 'DXRMissions', vectm(-1491.076782, -1207.629028, -2.499634), rotm(0, 25000, 0)); cp.UserList[0].userName = "KLloyd"; cp.UserList[0].Password = "squishy"; } // conference room computer - if (#defined(revision)){ + if (RevisionMaps){ cp = Spawn(class'#var(prefix)ComputerPersonal',, 'DXRMissions', vectm(32.709930,878.123413,291.501068), rotm(0,0,0)); } else { cp = Spawn(class'#var(prefix)ComputerPersonal',, 'DXRMissions', vectm(79.009933, 863.868042, 296.502075), rotm(0,0,0)); diff --git a/DXRMissions/DeusEx/Classes/DXRMissionsM09.uc b/DXRMissions/DeusEx/Classes/DXRMissionsM09.uc index 350f64704..6fdaf389b 100644 --- a/DXRMissions/DeusEx/Classes/DXRMissionsM09.uc +++ b/DXRMissions/DeusEx/Classes/DXRMissionsM09.uc @@ -58,45 +58,59 @@ function int InitGoals(int mission, string map) loc = AddGoalLocation("09_NYC_SHIPBELOW", "North Engine Room", NORMAL_GOAL, vect(-384.000000, 1024.000000, -272.000000), rot(0, 49152, 0)); AddActorLocation(loc, 2, vect(-378, 978, -272), rot(0,0,0)); + AddMapMarker(class'Image09_NYC_Ship_Bottom',320,343,"W","Weld Point", loc,"A weld point can be located at the North end of the Engine Room."); loc = AddGoalLocation("09_NYC_SHIPBELOW", "Bilge Pumps Balcony", NORMAL_GOAL, vect(-3296.000000, -1664.000000, -112.000000), rot(0, 81920, 0)); AddActorLocation(loc, 2, vect(-3300, -1619, -112), rot(0,0,0)); + AddMapMarker(class'Image09_NYC_Ship_Bottom',166,204,"W","Weld Point", loc,"A weld point can be located on the balcony of the Bilge Pump room."); loc = AddGoalLocation("09_NYC_SHIPBELOW", "Bilge Pumps Hallway", NORMAL_GOAL, vect(-2480.000000, -448.000000, -144.000000), rot(0, 32768, 0)); AddActorLocation(loc, 2, vect(-2522, -464, -144), rot(0,0,0)); + AddMapMarker(class'Image09_NYC_Ship_Bottom',212,269,"W","Weld Point", loc,"A weld point can be located in the upper hallway next to the Bilge Pump room."); loc = AddGoalLocation("09_NYC_SHIPBELOW", "SE Electrical Room", NORMAL_GOAL, vect(-3950, 740, -352), rot(0, 0, 0)); AddActorLocation(loc, 2, vect(-3908, 766, -416), rot(0,0,0)); + AddMapMarker(class'Image09_NYC_Ship_Bottom',135,135,"W","Weld Point", loc,"A weld point can be located on the South East side of the Electrical Room."); loc = AddGoalLocation("09_NYC_SHIPBELOW", "South Helipad", NORMAL_GOAL, vect(-5664, -926, -418), rot(0, 16384, 0)); AddActorLocation(loc, 2, vect(-5664, -889, -432), rot(0,0,0)); + AddMapMarker(class'Image09_NYC_Ship_Bottom',47,50,"W","Weld Point", loc,"A weld point can be located on the South side of the Helipad."); loc = AddGoalLocation("09_NYC_SHIPBELOW", "Helipad Storage Room", NORMAL_GOAL, vect(-4082, -816, -128), rot(0, 32768, 0)); AddActorLocation(loc, 2, vect(-4120, -816, -128), rot(0,0,0)); + AddMapMarker(class'Image09_NYC_Ship_Bottom',130,247,"W","Weld Point", loc,"A weld point can be located in the Helipad Storage Room."); loc = AddGoalLocation("09_NYC_SHIPBELOW", "Helipad Air Control", NORMAL_GOAL, vect(-4752, 1536, -144), rot(0, -16384, 0)); AddActorLocation(loc, 2, vect(-4717, 1501, -144), rot(0,0,0)); + AddMapMarker(class'Image09_NYC_Ship_Bottom',97,368,"W","Weld Point", loc,"A weld point can be located in the Air Control room of the Helipad."); loc = AddGoalLocation("09_NYC_SHIPBELOW", "Fan Room", NORMAL_GOAL, vect(-3200.000000, -48.000000, -96.000000), rot(0, 0, 0)); AddActorLocation(loc, 2, vect(-3157, -48, -96), rot(0,0,0)); + AddMapMarker(class'Image09_NYC_Ship_Bottom',175,286,"W","Weld Point", loc,"A weld point can be located inside the main ventilation Fan shaft."); loc = AddGoalLocation("09_NYC_SHIPBELOW", "Engine Control Room", NORMAL_GOAL, vect(-288.000000, -432.000000, 112.000000), rot(-16384, 16384, 0)); AddActorLocation(loc, 2, vect(-288, -426, 62), rot(0,0,0)); + AddMapMarker(class'Image09_NYC_Ship_Bottom',318,263,"W","Weld Point", loc,"A weld point can be located in the control tower in the Engine Room."); loc = AddGoalLocation("09_NYC_SHIPBELOW", "NW Engine Room", NORMAL_GOAL | VANILLA_GOAL, vect(832, 1022, -430), rot(0,49152,0)); AddActorLocation(loc, 2, vect(833.449036, 993.195618, -490.899567), rot(0,0,0)); + AddMapMarker(class'Image09_NYC_Ship_Bottom',381,148,"W","Weld Point", loc,"A weld point can be located on the North West side of the Engine Room. This is a vanilla location."); loc = AddGoalLocation("09_NYC_SHIPBELOW", "NE Electical Room", NORMAL_GOAL | VANILLA_GOAL, vect(-3680, 1647, -402), rot(0,49152,0)); AddActorLocation(loc, 2, vect(-3680.022217, 1616.057861, -490.899567), rot(0,0,0)); + AddMapMarker(class'Image09_NYC_Ship_Bottom',152,180,"W","Weld Point", loc,"A weld point can be located on the North East side of the Electical Room. This is a vanilla location."); loc = AddGoalLocation("09_NYC_SHIPBELOW", "East Helipad", NORMAL_GOAL | VANILLA_GOAL, vect(-6526, 200, -418), rot(0,65536,0)); AddActorLocation(loc, 2, vect(-6499.218750, 200.039917, -490.899567), rot(0,0,0)); + AddMapMarker(class'Image09_NYC_Ship_Bottom',5,109,"W","Weld Point", loc,"A weld point can be located on the East side of the Helipad. This is a vanilla location."); loc = AddGoalLocation("09_NYC_SHIPBELOW", "Bilge Pumps", NORMAL_GOAL | VANILLA_GOAL, vect(-3296.000000,-1662.000000,-416.000000), rot(0,81920,0)); AddActorLocation(loc, 2, vect(-3296.133789, -1632.118652, -490.899567), rot(0,0,0)); + AddMapMarker(class'Image09_NYC_Ship_Bottom',171,11,"W","Weld Point", loc,"A weld point can be located next to the Bilge Pumps. This is a vanilla location."); loc = AddGoalLocation("09_NYC_SHIPBELOW", "SW Engine Room", NORMAL_GOAL | VANILLA_GOAL, vect(832, -1024, -400), rot(0,16384,0)); AddActorLocation(loc, 2, vect(831.944641, -996.442627, -490.899567), rot(0,0,0)); + AddMapMarker(class'Image09_NYC_Ship_Bottom',385,44,"W","Weld Point", loc,"A weld point can be located on the South West side of the Engine Room, behind a wall. This is a vanilla location."); return 92; @@ -211,11 +225,13 @@ function PreFirstEntryMapFixes() local DeusExMover dxm; local Actor a; local name barrelName; + local bool RevisionMaps; + RevisionMaps = class'DXRMapVariants'.static.IsRevisionMaps(player()); if( dxr.localURL == "09_NYC_GRAVEYARD" ) { // //barrel next to the transmitter thing, it explodes when I move it - if(#defined(revision)){ + if(RevisionMaps){ barrelName='EMOff'; } else { barrelName='BarrelOFun'; @@ -227,7 +243,7 @@ function PreFirstEntryMapFixes() SpawnDatacubePlaintext(vectm(1102.252563,821.384338,26.370010),rotm(0,0,0),"I installed that big device you asked for, but it's really blasting out a lot of EM interference...|n|nIf an FCC inspector comes around, you can turn it off by using the code 8854 "); } else if (dxr.localURL=="09_NYC_SHIPBELOW"){ - if(#defined(revision)){ + if(RevisionMaps){ foreach AllActors(class'DeusExMover',dxm){ if (dxm.Name=='DeusExMover64' || dxm.Name=='DeusExMover16' || diff --git a/DXRMissions/DeusEx/Classes/DXRMissionsM15.uc b/DXRMissions/DeusEx/Classes/DXRMissionsM15.uc index c6fc5de90..eac9d54d8 100644 --- a/DXRMissions/DeusEx/Classes/DXRMissionsM15.uc +++ b/DXRMissions/DeusEx/Classes/DXRMissionsM15.uc @@ -85,6 +85,9 @@ function PreFirstEntryMapFixes() { local Trigger t; local FlagTrigger ft; + local bool RevisionMaps; + + RevisionMaps = class'DXRMapVariants'.static.IsRevisionMaps(player()); if ( dxr.localURL == "15_AREA51_BUNKER" ) { foreach AllActors(class'Trigger',t){ @@ -92,7 +95,7 @@ function PreFirstEntryMapFixes() t.Destroy(); //Just rely on one trigger for Walton } } - } else if (dxr.localURL=="15_AREA51_FINAL" && #defined(revision)){ + } else if (dxr.localURL=="15_AREA51_FINAL" && RevisionMaps){ //Revision has a trigger in Final that makes Walton chase you down from the elevator. //This moves him again, so he ends up unrandomized foreach AllActors(class'FlagTrigger',ft){ @@ -191,9 +194,12 @@ function AfterShuffleGoals(int goalsToLocations[32]) { local int g; local WaltonSimons walt; + local bool RevisionMaps; + + RevisionMaps = class'DXRMapVariants'.static.IsRevisionMaps(player()); //Revision can put Walt in the elevator down to Sector 3. We need to despawn him if we don't pick that location - if (#defined(revision) && dxr.localURL == "15_AREA51_ENTRANCE"){ + if (RevisionMaps && dxr.localURL == "15_AREA51_ENTRANCE"){ for(g=0; g 0) { + SetSeed("DXREnemies FirstEntry"); + if(dxr.localURL == "10_PARIS_METRO" && chance_single(dxr.flags.moresettings.remove_paris_mj12)) { foreach AllActors(class'#var(prefix)ScriptedPawn', sp) { - if(sp.Alliance=='mj12' && chance_single(dxr.flags.moresettings.remove_paris_mj12)) { + if(sp.Alliance=='mj12') { sp.Event=''; sp.bHidden=true; sp.Destroy(); diff --git a/DXRModules/DeusEx/Classes/DXREvents.uc b/DXRModules/DeusEx/Classes/DXREvents.uc index 94715238f..56a7778c4 100644 --- a/DXRModules/DeusEx/Classes/DXREvents.uc +++ b/DXRModules/DeusEx/Classes/DXREvents.uc @@ -20,6 +20,7 @@ function WatchActors() local #var(prefix)BarrelVirus virus; local #var(prefix)Mailbox mail; local #var(prefix)CigaretteMachine cigVending; + local #var(prefix)Lightbulb bulb; foreach AllActors(class'#var(prefix)Lamp',lamp){ AddWatchedActor(lamp,"LightVandalism"); @@ -39,6 +40,9 @@ function WatchActors() foreach AllActors(class'#var(prefix)Chandelier',chandelier){ AddWatchedActor(chandelier,"LightVandalism"); } + foreach AllActors(class'#var(prefix)Lightbulb',bulb){ + AddWatchedActor(bulb,"LightVandalism"); + } foreach AllActors(class'#var(prefix)Trophy',trophy){ AddWatchedActor(trophy,"TrophyHunter"); } @@ -66,36 +70,148 @@ function WatchActors() function AddPhoneTriggers(bool isRevision) { local #var(prefix)Phone p; - local BingoTrigger bt; + local #var(prefix)WHPhone wp; +#ifdef revision + local RevPhone rp; +#endif local int i; //Spawn invisible phones for the payphones switch(dxr.localURL) { + case "01_NYC_UNATCOISLAND": + if (isRevision){ + p = Spawn(class'PayPhone',,,vectm(-3999.9, 9039,-222)); //South Dock + p = Spawn(class'PayPhone',,,vectm(-3839.9, 9039, -222)); //South Dock + } + break; case "02_NYC_STREET": + if (isRevision){ + p = Spawn(class'PayPhone',,,vectm(-1219.22, 776.7, -431.58)); //Outside Free Clinic + p = Spawn(class'PayPhone',,,vectm(-1216.45, 1014.59, -431.58)); //Outside Free Clinic + p = Spawn(class'PayPhone',,,vectm(3523, -3280.4, -431)); //Outside Nutella Store + p = Spawn(class'PayPhone',,,vectm(3523, -3424.59, -431)); //Outside Nutella Store + p = Spawn(class'PayPhone',,,vectm(3651, -1583.93, -435.40)); //Near bus stop + p = Spawn(class'PayPhone',,,vectm(3651, -1763.33, -430.23)); //Near bus stop (Tipped over) + p = Spawn(class'PayPhone',,,vectm(1952.04, 2508.99, -432.5)); //Near Osgoode and Son's + p = Spawn(class'PayPhone',,,vectm(1599.67, 2508.99, -432.5)); //Near Osgoode and Son's + //break; + } else { + p = Spawn(class'PayPhone',,,vectm(1117,1969,-430)); //Near Osgoode and Son's + p = Spawn(class'PayPhone',,,vectm(-1314,944,-430)); //Near Free Clinic + } + break; case "04_NYC_STREET": + if (isRevision){ + p = Spawn(class'PayPhone',,,vectm(-1219.22, 776.7, -431.58)); //Outside Free Clinic + p = Spawn(class'PayPhone',,,vectm(-1216.45, 1014.59, -431.58)); //Outside Free Clinic + p = Spawn(class'PayPhone',,,vectm(3523, -3280.4, -431)); //Outside Nutella Store + p = Spawn(class'PayPhone',,,vectm(3523, -3424.59, -431)); //Outside Nutella Store + p = Spawn(class'PayPhone',,,vectm(3676.9, -1577.22, -490.4)); //Near bus stop (Tipped Over) + p = Spawn(class'PayPhone',,,vectm(3650, -1764.06, -430)); //Near bus stop (Tipped Over) + p = Spawn(class'PayPhone',,,vectm(1949.62, 2509, -431)); //Near Osgoode and Son's + p = Spawn(class'PayPhone',,,vectm(1597.67, 2509, -431)); //Near Osgoode and Son's + } else { + p = Spawn(class'PayPhone',,,vectm(1117,1969,-430)); //Near Osgoode and Son's + p = Spawn(class'PayPhone',,,vectm(-1314,944,-430)); //Near Free Clinic + } + break; case "08_NYC_STREET": - if (!isRevision){ + if (isRevision){ + p = Spawn(class'PayPhone',,,vectm(-1219.22, 776.7, -431.58)); //Outside Free Clinic + p = Spawn(class'PayPhone',,,vectm(-1216.45, 1014.59, -431.58)); //Outside Free Clinic + p = Spawn(class'PayPhone',,,vectm(3522, -3280, -431)); //Outside Nutella Store + p = Spawn(class'PayPhone',,,vectm(3522, -3424.4, -431)); //Outside Nutella Store + p = Spawn(class'PayPhone',,,vectm(3676.9, -1577.22, -490.4)); //Near bus stop (Tipped Over) + p = Spawn(class'PayPhone',,,vectm(3650, -1764.06, -430)); //Near bus stop (Tipped Over) + p = Spawn(class'PayPhone',,,vectm(1899.19, 2513.20, -486.25)); //Near Osgoode and Son's (Tipped over) + p = Spawn(class'PayPhone',,,vectm(1592.46, 2495.74, -433.14)); //Near Osgoode and Son's (Tipped over) + } else { p = Spawn(class'PayPhone',,,vectm(1117,1969,-430)); //Near Osgoode and Son's p = Spawn(class'PayPhone',,,vectm(-1314,944,-430)); //Near Free Clinic } break; case "02_NYC_BAR": + if (isRevision){ + p = Spawn(class'PayPhone',,,vectm(-2667.1, 15.8, 75)); //Near the bathroom + p = Spawn(class'PayPhone',,,vectm(-2667.1, -96.4, 75)); //Near the bathroom + } else{ + p = Spawn(class'PayPhone',,,vectm(-2624,624,72)); //Near the bathroom + } + break; case "04_NYC_BAR": + if (isRevision){ + p = Spawn(class'PayPhone',,,vectm(-2667.1, 15.8, 75)); //Near the bathroom + p = Spawn(class'PayPhone',,,vectm(-2667.1, -96.4, 75)); //Near the bathroom + p = Spawn(class'PayPhone',,,vectm(-2667.1, -40.4, 75)); //Near the bathroom + } else{ + p = Spawn(class'PayPhone',,,vectm(-2624,624,72)); //Near the bathroom + } + break; case "08_NYC_BAR": - if (!isRevision){ + if (isRevision){ + p = Spawn(class'PayPhone',,,vectm(-2667.1, 15.1, 74)); //Near the bathroom + p = Spawn(class'PayPhone',,,vectm(-2667.1, -40.83, 74)); //Near the bathroom + p = Spawn(class'PayPhone',,,vectm(-2667.1, -96.66, 74)); //Near the bathroom + } else{ p = Spawn(class'PayPhone',,,vectm(-2624,624,72)); //Near the bathroom } break; + case "02_NYC_FREECLINIC": case "08_NYC_FREECLINIC": if (!isRevision){ p = Spawn(class'PayPhone',,,vectm(-215,752,-254)); //In the front lobby + } else { + p = Spawn(class'PayPhone',,,vectm(-203.12, 752.87,-251.78)); //In the front lobby + } + break; + + case "02_NYC_BATTERYPARK": + if (isRevision){ + p = Spawn(class'PayPhone',,,vectm(-2707.23, -171, 400)); //Near Shanty town + p = Spawn(class'PayPhone',,,vectm(-3108.31, -171, 400)); //Near Shanty town + p = Spawn(class'PayPhone',,,vectm(-3584.65, -171, 400)); //Near Shanty town + p = Spawn(class'PayPhone',,,vectm(883, 639, 417.47)); //In Castle Clinton + p = Spawn(class'PayPhone',,,vectm(882.97, 520, 415.65)); //In Castle Clinton + } + break; + case "03_NYC_BATTERYPARK": + if (isRevision){ + p = Spawn(class'PayPhone',,,vectm(-2708.68, -171, 400)); //Near Shanty town + p = Spawn(class'PayPhone',,,vectm(-3108.13, -171, 400)); //Near Shanty town + } + break; + case "04_NYC_BATTERYPARK": + if (isRevision){ + p = Spawn(class'PayPhone',,,vectm(-2709.1, -171, 400)); //Near Shanty town + p = Spawn(class'PayPhone',,,vectm(-3108.44, -171, 400)); //Near Shanty town } break; case "03_NYC_BROOKLYNBRIDGESTATION": if (!isRevision){ p = Spawn(class'PayPhone',,,vectm(-660,-1854,435)); //Upper floor, near El Rey p = Spawn(class'PayPhone',,,vectm(-660,-1806,435)); + } else { + p = Spawn(class'PayPhone',,,vectm(-669, -1855.67, 433.5)); //Upper floor, near El Rey + p = Spawn(class'PayPhone',,,vectm(-669, -1807.72, 433.5)); + } + break; + case "04_NYC_NSFHQ": + if (isRevision){ + p = Spawn(class'PayPhone',,,vectm(-1641.06, -4912.54, 80)); //Near Checkpoint + p = Spawn(class'PayPhone',,,vectm(-1641.06, -5041.04, 80)); + } + break; + + case "06_HONGKONG_WANCHAI_COMPOUND": + if (isRevision){ //This map only exists in revision, but might as well check + p = Spawn(class'PayPhone',,,vectm(-671.12, 2528.5, 84)); //Near Entrance + p = Spawn(class'PayPhone',,,vectm(561.36, 2421, 84)); //Near Entrance + p = Spawn(class'PayPhone',,,vectm(656.89, 2421, 84)); //Near Entrance + p = Spawn(class'PayPhone',,,vectm(-465.27, 5266.2, 66.5)); //Covered Area + p = Spawn(class'PayPhone',,,vectm(-465.27, 5218.72, 66.5)); //Covered Area + p = Spawn(class'PayPhone',,,vectm(-1147, 4295.44, 66)); //Between Buildings + p = Spawn(class'PayPhone',,,vectm(-1147, 4215.07, 66)); //Between Buildings } break; case "09_NYC_DOCKYARD": @@ -103,6 +219,18 @@ function AddPhoneTriggers(bool isRevision) p=Spawn(class'#var(prefix)Phone',,,vectm(2333,2153,53),rotm(0,5688,0)); } break; + + case "10_PARIS_CATACOMBS_METRO": + if (isRevision){ //Another Revision-only map + p = Spawn(class'PayPhone',,,vectm(974.99, -2581.45, -555)); //In the ATM+ area + p = Spawn(class'PayPhone',,,vectm(974.99, -2504.94, -553)); + //There might be two missing here, but I couldn't find them + } + case "11_PARIS_UNDERGROUND": + if (isRevision){ + p = Spawn(class'PayPhone',,,vectm(620.99, 304.67, 15.75)); + p = Spawn(class'PayPhone',,,vectm(617, 464.96, 15.75)); + } } i=0; @@ -111,15 +239,43 @@ function AddPhoneTriggers(bool isRevision) case "AI_phonecall_paris01": break; //Covered by the Icarus call flag - IcarusCalls_Played default: - bt = class'BingoTrigger'.static.Create(self,'PhoneCall',vectm(0,0,0)); - bt.bDestroyOthers=False; - bt.tag=StringToName("PhoneCall"$i); - p.event=StringToName("PhoneCall"$i); + CreatePhoneTrigger(p,i); + i++; + break; + } + } + foreach AllActors(class'#var(prefix)WHPhone',wp){ + switch(wp.BindName){ + case "AI_phonecall_paris01": + break; //Covered by the Icarus call flag - IcarusCalls_Played + default: + CreatePhoneTrigger(wp,i); + i++; + break; + } + } +#ifdef revision + foreach AllActors(class'RevPhone',rp){ + switch(rp.BindName){ + case "AI_phonecall_paris01": + break; //Covered by the Icarus call flag - IcarusCalls_Played + default: + CreatePhoneTrigger(rp,i); i++; break; } } +#endif +} +function CreatePhoneTrigger(Actor phone, int num) +{ + local BingoTrigger bt; + + bt = class'BingoTrigger'.static.Create(self,'PhoneCall',phone.Location); + bt.bDestroyOthers=False; + bt.tag=StringToName("PhoneCall"$num); + phone.event=StringToName("PhoneCall"$num); } function SetWatchFlags() { @@ -158,6 +314,9 @@ function SetWatchFlags() { RevisionMaps = class'DXRMapVariants'.static.IsRevisionMaps(player()); + //For debugging purposes - can probably remove later + l("SetWatchFlags: Setting flag watches and bingo locations based on Revision maps? "$RevisionMaps); + //General checks WatchActors(); AddPhoneTriggers(RevisionMaps); @@ -194,14 +353,15 @@ function SetWatchFlags() { if(RevisionMaps){ bt = class'BingoTrigger'.static.Create(self,'AlexCloset',vectm(1725,-1062,-40),95,40); bt = class'BingoTrigger'.static.Create(self,'BathroomFlags',vectm(1130,-150,310),80,40); + bt.MakeClassProximityTrigger(class'#var(prefix)FlagPole'); } else { bt = class'BingoTrigger'.static.Create(self,'AlexCloset',vectm(1551.508301,-820.408875,-39.901726),95,40); bt = class'BingoTrigger'.static.Create(self,'BathroomFlags',vectm(240.180969,-385.104431,280.098511),80,40); + bt.MakeClassProximityTrigger(class'#var(prefix)FlagPole'); bt = class'BingoTrigger'.static.Create(self,'un_bboard_peepedtex',vectm(497,1660,317.7),80,40); bt.MakePeepable(); } - bt.MakeClassProximityTrigger(class'#var(prefix)FlagPole'); foreach AllActors(class'#var(prefix)Female2',f) { if(f.BindName == "Shannon"){ @@ -308,14 +468,15 @@ function SetWatchFlags() { if(RevisionMaps){ bt = class'BingoTrigger'.static.Create(self,'AlexCloset',vectm(1725,-1062,-40),95,40); bt = class'BingoTrigger'.static.Create(self,'BathroomFlags',vectm(1130,-150,310),80,40); + bt.MakeClassProximityTrigger(class'#var(prefix)FlagPole'); } else { bt = class'BingoTrigger'.static.Create(self,'AlexCloset',vectm(1551.508301,-820.408875,-39.901726),95,40); bt = class'BingoTrigger'.static.Create(self,'BathroomFlags',vectm(240.180969,-385.104431,280.098511),80,40); + bt.MakeClassProximityTrigger(class'#var(prefix)FlagPole'); bt = class'BingoTrigger'.static.Create(self,'un_bboard_peepedtex',vectm(497,1660,317.7),80,40); bt.MakePeepable(); } - bt.MakeClassProximityTrigger(class'#var(prefix)FlagPole'); foreach AllActors(class'#var(prefix)Female2',f) { if(f.BindName == "Shannon"){ @@ -501,14 +662,15 @@ function SetWatchFlags() { if(RevisionMaps){ bt = class'BingoTrigger'.static.Create(self,'AlexCloset',vectm(1725,-1062,-40),95,40); bt = class'BingoTrigger'.static.Create(self,'BathroomFlags',vectm(1130,-150,310),80,40); + bt.MakeClassProximityTrigger(class'#var(prefix)FlagPole'); } else { bt = class'BingoTrigger'.static.Create(self,'AlexCloset',vectm(1551.508301,-820.408875,-39.901726),95,40); bt = class'BingoTrigger'.static.Create(self,'BathroomFlags',vectm(240.180969,-385.104431,280.098511),80,40); + bt.MakeClassProximityTrigger(class'#var(prefix)FlagPole'); bt = class'BingoTrigger'.static.Create(self,'un_bboard_peepedtex',vectm(497,1660,317.7),80,40); bt.MakePeepable(); } - bt.MakeClassProximityTrigger(class'#var(prefix)FlagPole'); foreach AllActors(class'#var(prefix)Female2',f) { if(f.BindName == "Shannon"){ @@ -729,6 +891,9 @@ function SetWatchFlags() { bt = class'BingoTrigger'.static.Create(self,'SewerSurfin',vectm(-50,-125,-1000),750,40); bt.MakeClassProximityTrigger(class'#var(prefix)JoeGreeneCarcass'); break; + case "08_NYC_FREECLINIC": + WatchFlag('GreenKnowsAboutDowd'); + break; case "09_NYC_DOCKYARD": ReportMissingFlag('M08WarnedSmuggler', "SmugglerDied"); @@ -842,7 +1007,7 @@ function SetWatchFlags() { } bt = class'BingoTrigger'.static.Create(self,'WarehouseEntered',vectm(-580.607361,-2248.497803,-551.895874),200,160); - + bt = class'BingoTrigger'.static.Create(self,'roof_elevator',vect(0,0,0)); break; case "10_PARIS_CATACOMBS_TUNNELS": foreach AllActors(class'#var(prefix)WIB',wib){ @@ -855,6 +1020,7 @@ function SetWatchFlags() { WatchFlag('M10EnteredBakery'); WatchFlag('AlleyCopSeesPlayer_Played'); WatchFlag('assassinapartment'); + WatchFlag('MeetRenault_Played'); RewatchFlag('KnowsGuntherKillphrase'); foreach AllActors(class'#var(prefix)Mutt', starr) { @@ -2122,7 +2288,7 @@ static simulated function string GetBingoGoalHelpText(string event,int mission, case "TongTargets": return "Shoot at the targets in the shooting range in Tracer Tong's hideout."; case "WanChaiStores": - return "Visit enough of the stores in the Wan Chai market by walking up to them."; + return "Visit all of the stores in the Wan Chai market by walking up to them."; case "HongKongBBall": return "Throw the basketball into the net on the rooftop of the MJ12 helibase in Hong Kong."; case "CanalDrugDeal": @@ -2356,6 +2522,7 @@ static simulated function string GetBingoGoalHelpText(string event,int mission, } else if (mission<=12){ msg=msg$"The bum living at the Vandenberg gas station deserves it."; } + msg = msg$"|n|n(It's a Simpsons reference)"; return msg; case "Canal_Cop_Dead": return "Kill one of the Chinese Military in the Hong Kong canals standing near the entrance to Tonnochi Road."; @@ -2596,6 +2763,10 @@ static simulated function string GetBingoGoalHelpText(string event,int mission, return "Watch cats through binoculars or a scope for enough time. Note that this will only count in full second increments, so you need to keep the crosshairs centered!"; case "Binoculars_peeptime": return "Watch binoculars through binoculars or a scope for enough time. Note that this will only count in full second increments, so you need to keep the crosshairs centered!"; + case "roof_elevator": + return "Use the roof elevator in Denfert-Rochereau right at the start. There will be a book nearby with the code for the keypad."; + case "MeetRenault_Played": + return "Talk to Renault, in the Paris hostel. He is the man who asks you to steal zyme and will buy it from you."; default: return "Unable to find help text for event '"$event$"'|nReport this to the developers!"; } @@ -2785,7 +2956,7 @@ defaultproperties bingo_options(147)=(event="OceanLabCrewChamber",desc="Visit %s crew chambers in the Ocean Lab",max=4,missions=16384) bingo_options(148)=(event="HeliosControlArms",desc="Jump down the control arms in Helios' chamber",max=1,missions=32768) bingo_options(149)=(event="TongTargets",desc="Use the shooting range in Tong's base",max=1,missions=64) - bingo_options(150)=(event="WanChaiStores",desc="Visit %s stores in the Wan Chai market",max=4,missions=64) + bingo_options(150)=(event="WanChaiStores",desc="Visit all of the stores in the Wan Chai market",max=5,missions=64) bingo_options(151)=(event="HongKongBBall",desc="Shoot some hoops in Hong Kong",max=1,missions=64) bingo_options(152)=(event="CanalDrugDeal",desc="Walk in on a drug deal in progress",max=1,missions=64) bingo_options(153)=(event="HongKongGrays",desc="Enter the Hong Kong Gray enclosure",max=1,missions=64) @@ -2957,6 +3128,8 @@ defaultproperties bingo_options(310)=(event="WatchDogs",desc="Watch Dogs (%s seconds)",max=15,missions=21604) bingo_options(311)=(event="Cat_peeptime",desc="Look at that kitty! (%s seconds)",max=15,missions=7256) bingo_options(312)=(event="Binoculars_peeptime",desc="Who Watches the Watchers? (%s seconds)",max=15) + bingo_options(313)=(event="roof_elevator",desc="Use the roof elevator in Denfert - Rochereau",max=1,missions=1024) + bingo_options(314)=(event="MeetRenault_Played",desc="Ever tried rat piss?",max=1,missions=1024) diff --git a/DXRModules/DeusEx/Classes/DXREventsBase.uc b/DXRModules/DeusEx/Classes/DXREventsBase.uc index 630a63f40..70d4262ce 100644 --- a/DXRModules/DeusEx/Classes/DXREventsBase.uc +++ b/DXRModules/DeusEx/Classes/DXREventsBase.uc @@ -147,6 +147,7 @@ function Ending_FirstEntry() ending = 3; break; case "ENDGAME4": //Dance party + case "ENDGAME4REV": //Dance party ending = 4; break; default: @@ -364,7 +365,7 @@ function BingoWinScreen() if ( Level.Netmode == NM_Standalone ) { //Make it harder to get murdered during the countdown Level.Game.SetGameSpeed(0.1); - SetTimer(0.1, true); + SetTimer(Level.Game.GameSpeed, true); } p.ReducedDamageType = 'All';// god mode p.DesiredFlashScale = 0; @@ -653,9 +654,11 @@ function _AddPawnDeath(ScriptedPawn victim, optional Actor Killer, optional coer if (!dead){ _MarkBingo(classname$"_ClassUnconscious"); _MarkBingo(classname$"_ClassUnconsciousM" $ dxr.dxInfo.missionNumber); + class'DXRStats'.static.AddKnockOut(player()); } else { _MarkBingo(classname$"_ClassDead"); _MarkBingo(classname$"_ClassDeadM" $ dxr.dxInfo.missionNumber); + class'DXRStats'.static.AddKill(player()); //Were they an ally? Skip on NSF HQ, because that's kind of a bait if (!isInitialPlayerEnemy(victim) && !IsCritter(victim) && //Must have not been an enemy initially @@ -668,6 +671,12 @@ function _AddPawnDeath(ScriptedPawn victim, optional Actor Killer, optional coer if (damageType=="stomped" && IsHuman(victim.class)){ //If you stomp a human to death... _MarkBingo("HumanStompDeath"); } + } else { + if (!dead) { + class'DXRStats'.static.AddKnockOutByOther(player()); + } else { + class'DXRStats'.static.AddKillByOther(player()); + } } if(!victim.bImportant) @@ -1077,7 +1086,7 @@ function bool CheckBingoWin(DXRando dxr, int numBingos) if(#defined(hx)) return false; if (dxr.flags.settings.bingo_win > 0){ - if (numBingos >= dxr.flags.settings.bingo_win && dxr.LocalURL!="ENDGAME4"){ + if (numBingos >= dxr.flags.settings.bingo_win && dxr.LocalURL!="ENDGAME4" && dxr.LocalURL!="ENDGAME4REV"){ info("Number of bingos: "$numBingos$" has exceeded the bingo win threshold! "$dxr.flags.settings.bingo_win); bingo_win_countdown = 5; BingoWinScreen(); diff --git a/DXRModules/DeusEx/Classes/DXRFixup.uc b/DXRModules/DeusEx/Classes/DXRFixup.uc index 14db3ea41..8ee5137fc 100644 --- a/DXRModules/DeusEx/Classes/DXRFixup.uc +++ b/DXRModules/DeusEx/Classes/DXRFixup.uc @@ -166,6 +166,19 @@ function CheckConfig() DecorationsOverwrites[i].explosionRadius = c.default.explosionRadius; DecorationsOverwrites[i].bPushable = c.default.bPushable; + i++; + DecorationsOverwrites[i].type = "HKMarketLight"; + DecorationsOverwrites[i].bInvincible = false; + c = class(GetClassFromString(DecorationsOverwrites[i].type, class'DeusExDecoration')); + DecorationsOverwrites[i].HitPoints = c.default.HitPoints; + DecorationsOverwrites[i].minDamageThreshold = c.default.minDamageThreshold; + DecorationsOverwrites[i].bFlammable = c.default.bFlammable; + DecorationsOverwrites[i].Flammability = c.default.Flammability; + DecorationsOverwrites[i].bExplosive = c.default.bExplosive; + DecorationsOverwrites[i].explosionDamage = c.default.explosionDamage; + DecorationsOverwrites[i].explosionRadius = c.default.explosionRadius; + DecorationsOverwrites[i].bPushable = c.default.bPushable; + Super.CheckConfig(); for(i=0; i 0) str = str $ " (Set Seed)"; - str2= "Difficulty: " $ TrimTrailingZeros(CombatDifficulty) + str2= "Difficulty: " $ FloatToString(CombatDifficulty, 3) #ifdef injections $ ", New Game+ Loops: "$newgameplus_loops #endif @@ -355,6 +362,7 @@ simulated function string BindFlags(int mode, optional string str) FlagInt('Rando_equipment', settings.equipment, mode, str); FlagInt('Rando_medbots', settings.medbots, mode, str); + FlagInt('Rando_empty_medbots', moresettings.empty_medbots, mode, str); FlagInt('Rando_repairbots', settings.repairbots, mode, str); FlagInt('Rando_medbotuses', settings.medbotuses, mode, str); FlagInt('Rando_repairbotuses', settings.repairbotuses, mode, str); @@ -396,6 +404,12 @@ simulated function string BindFlags(int mode, optional string str) FlagInt('Rando_starting_map', settings.starting_map, mode, str); FlagInt('Rando_grenadeswap', moresettings.grenadeswap, mode, str); + FlagInt('Rando_newgameplus_curve_scalar', moresettings.newgameplus_curve_scalar, mode, str); + FlagInt('Rando_newgameplus_max_item_carryover', newgameplus_max_item_carryover, mode, str); + FlagInt('Rando_num_skill_downgrades', newgameplus_num_skill_downgrades, mode, str); + FlagInt('Rando_num_removed_augs', newgameplus_num_removed_augs, mode, str); + FlagInt('Rando_num_removed_weapons', newgameplus_num_removed_weapons, mode, str); + return str; } @@ -483,6 +497,8 @@ simulated function string flagNameToHumanName(name flagname){ return "Starting Equipment Amount"; case 'Rando_medbots': return "Medbots"; + case 'Rando_empty_medbots': + return "Augmentation Bots"; case 'Rando_repairbots': return "Repairbots"; case 'Rando_medbotuses': @@ -557,6 +573,16 @@ simulated function string flagNameToHumanName(name flagname){ return "Bingo Board Re-rolls"; case 'Rando_grenadeswap': return "Grenades"; + case 'Rando_newgameplus_curve_scalar': + return "New Game+ Curve Scalar"; + case 'Rando_newgameplus_max_item_carryover': + return "New Game+ Max Item Carryover"; + case 'Rando_num_skill_downgrades': + return "New Game+ Downgraded Skill Levels Per Loop"; + case 'Rando_num_removed_augs': + return "New Game+ Removed Augmentations Per Loop"; + case 'Rando_num_removed_weapons': + return "New Game+ Removed Weapons Per Loop"; default: return flagname $ "(ADD HUMAN READABLE NAME!)"; //Showing the raw flag name will stand out more } @@ -583,6 +609,10 @@ simulated function string flagValToHumanVal(name flagname, int val){ case 'Rando_health': case 'Rando_energy': case 'Rando_bingoboardroll': + case 'Rando_newgameplus_max_item_carryover': + case 'Rando_num_skill_downgrades': + case 'Rando_num_removed_augs': + case 'Rando_num_removed_weapons': return string(val); //Return the number as hex @@ -599,6 +629,7 @@ simulated function string flagValToHumanVal(name flagname, int val){ case 'Rando_biocells': case 'Rando_deviceshackable': case 'Rando_medbots': + case 'Rando_empty_medbots': case 'Rando_repairbots': case 'Rando_medkits': case 'Rando_dancingpercent': @@ -625,6 +656,7 @@ simulated function string flagValToHumanVal(name flagname, int val){ case 'Rando_removeparismj12': case 'Rando_bingo_scale': case 'Rando_grenadeswap': + case 'Rando_newgameplus_curve_scalar': return val$"%"; case 'Rando_enemyrespawn': @@ -835,7 +867,7 @@ simulated function string flagValToHumanVal(name flagname, int val){ return val $ " (Mishandled!)"; } -// returns true is read was successful +// returns true if read was successful simulated function bool FlagInt(name flagname, out int val, int mode, out string str) { if( mode == 0 ) { diff --git a/DXRModules/DeusEx/Classes/DXRFlagsNGPMaxRando.uc b/DXRModules/DeusEx/Classes/DXRFlagsNGPMaxRando.uc index f7928b2c5..c8d63d085 100644 --- a/DXRModules/DeusEx/Classes/DXRFlagsNGPMaxRando.uc +++ b/DXRModules/DeusEx/Classes/DXRFlagsNGPMaxRando.uc @@ -160,9 +160,10 @@ function NewGamePlus() local DataStorage ds; local DXRSkills skills; local DXRAugmentations augs; - local int i, bingo_win,bingo_freespaces; + local int i, bingo_win, bingo_freespaces; local float exp; local int randomStart; + local int oldseed; if( flagsversion == 0 ) { warning("NewGamePlus() flagsversion == 0"); @@ -181,38 +182,48 @@ function NewGamePlus() p.saveCount=0; exp = 1; randomStart = settings.starting_map; - bingo_win = settings.bingo_win; - bingo_freespaces = settings.bingo_freespaces; // always enable maxrando when doing NG+? maxrando = 1; if(maxrando > 0) { // rollback settings to the default for the current difficulty // we only want to do this on maxrando because we want to retain the user's custom choices + bingo_win = settings.bingo_win; + bingo_freespaces = settings.bingo_freespaces; SetDifficulty(difficulty); ExecMaxRando(); + settings.bingo_win = bingo_win; + settings.bingo_freespaces = bingo_freespaces; + // increase difficulty on each flag like exp = newgameplus_loops; x *= 1.2 ^ exp; exp = newgameplus_loops; } + dxr.SetSeed(dxr.Crc("NG+ curve tweak " $ (seed - newgameplus_loops))); +#ifdef hx + p.CombatDifficulty = 3;// I don't think NG+ works in HX anyways? +#else + p.CombatDifficulty = DXRFlags(self).GetDifficulty(difficulty).CombatDifficulty; +#endif + + + p.CombatDifficulty = NewGamePlusVal(p.CombatDifficulty, 1.3, exp, 0, 15, False); // Anything over 15 is kind of unreasonably impossible + settings.minskill = NewGamePlusVal(settings.minskill, 1.1, exp, 10, 400, True); + settings.maxskill = NewGamePlusVal(settings.maxskill, 1.1, exp, 10, 700, True); + settings.enemiesrandomized = NewGamePlusVal(settings.enemiesrandomized, 1.2, exp, 10, 1000, True); + settings.enemystats = NewGamePlusVal(settings.enemystats, 1.2, exp, 5, 100, True); + settings.hiddenenemiesrandomized = NewGamePlusVal(settings.hiddenenemiesrandomized, 1.2, exp, 10, 1000, True); + settings.ammo = NewGamePlusVal(settings.ammo, 0.9, exp, 5, 100, True); + settings.medkits = NewGamePlusVal(settings.medkits, 0.9, exp, 5, 100, True); + settings.multitools = NewGamePlusVal(settings.multitools, 0.9, exp, 5, 100, True); + settings.lockpicks = NewGamePlusVal(settings.lockpicks, 0.9, exp, 5, 100, True); + settings.biocells = NewGamePlusVal(settings.biocells, 0.9, exp, 5, 100, True); + settings.medbots = NewGamePlusVal(settings.medbots, 0.9, exp, 3, 100, True); + settings.repairbots = NewGamePlusVal(settings.repairbots, 0.9, exp, 6, 100, True); + settings.turrets_add = NewGamePlusVal(settings.turrets_add, 1.3, exp, 3, 1000, True); + settings.merchants = NewGamePlusVal(settings.merchants, 0.9, exp, 5, 100, True); + SetGlobalSeed("NewGamePlus"); - p.CombatDifficulty=FClamp(p.CombatDifficulty*1.3,0,15); //Anything over 15 is kind of unreasonably impossible - NewGamePlusVal(settings.minskill, 1.1, exp, 10, 400); - NewGamePlusVal(settings.maxskill, 1.1, exp, 10, 700); - NewGamePlusVal(settings.enemiesrandomized, 1.2, exp, 10, 1000); - NewGamePlusVal(settings.enemystats, 1.2, exp, 5, 100); - NewGamePlusVal(settings.hiddenenemiesrandomized, 1.2, exp, 10, 1000); - NewGamePlusVal(settings.ammo, 0.9, exp, 5, 100); - NewGamePlusVal(settings.medkits, 0.9, exp, 5, 100); - NewGamePlusVal(settings.multitools, 0.9, exp, 5, 100); - NewGamePlusVal(settings.lockpicks, 0.9, exp, 5, 100); - NewGamePlusVal(settings.biocells, 0.9, exp, 5, 100); - NewGamePlusVal(settings.medbots, 0.9, exp, 3, 100); - NewGamePlusVal(settings.repairbots, 0.9, exp, 3, 100); - NewGamePlusVal(settings.turrets_add, 1.3, exp, 3, 1000); - NewGamePlusVal(settings.merchants, 0.9, exp, 5, 100); - settings.bingo_win = bingo_win; - settings.bingo_freespaces = bingo_freespaces; if (randomStart!=0){ settings.starting_map = class'DXRStartMap'.static.ChooseRandomStartMap(self, randomStart); } @@ -234,7 +245,7 @@ function NewGamePlus() l("NewGamePlus skill points was "$p.SkillPointsAvail); skills = DXRSkills(dxr.FindModule(class'DXRSkills')); if( skills != None ) { - for(i=0; i<3; i++) + for(i = 0; i < newgameplus_num_skill_downgrades; i++) skills.DowngradeRandomSkill(p); p.SkillPointsAvail = p.SkillPointsAvail * 0.75; } @@ -243,12 +254,15 @@ function NewGamePlus() l("NewGamePlus skill points is now "$p.SkillPointsAvail); augs = DXRAugmentations(dxr.FindModule(class'DXRAugmentations')); - if( augs != None ) - augs.RemoveRandomAug(p); + for (i = 0; i < newgameplus_num_removed_augs; i++) + if( augs != None ) + augs.RemoveRandomAug(p); + + MaxMultipleItems(p, newgameplus_max_item_carryover); ClearInHand(p); - RemoveRandomWeapon(p); - MaxMultipleItems(p, 5); + for (i = 0; i < newgameplus_num_removed_weapons; i++) + RemoveRandomWeapon(p); //Should you actually get fresh augs and credits on a NG+ non-vanilla start map? //Technically it should make up for levels you skipped past, so maybe? @@ -340,50 +354,74 @@ simulated function MaxRandoValPair(out int min, out int max) } } -function NewGamePlusVal(out int val, float curve, float exp, int min, int max) +function float NewGamePlusVal(float val, float curve, float exp, float min, float max, bool doTweak) { - val = val * (curve ** exp);// int *= float doesn't give as good accuracy as int = int*float - val = Self.Min(val, max); - val = Self.Max(val, min); + local bool increases; + local float tweak; + + increases = curve > 1.0; + + curve = (curve - 1.0) * float(moresettings.newgameplus_curve_scalar) / 100.0; // chop off 1 and scale the rest based on the scalar setting + if (doTweak) { + tweak = rngfn() * curve * 0.3; // generate a tweak with a range based on the scaled curve + curve += tweak; + } + curve += 1.0; // restore the 1 + + if (increases) { + curve = FMax(curve, 1.02); + } else { + curve = FMin(curve, 0.98); + } + val = val * curve ** exp; + + return FClamp(val, min, max); } function ExtendedTests() { local int val, i, oldSeed; + local float fval; local string s; Super.ExtendedTests(); - val = 5; - NewGamePlusVal(val, 1.2, 3, 1, 100); - testint(val, 8, "NewGamePlusVal 1.2 goes up"); + oldSeed = dxr.seed; + dxr.seed = 123456; + SetGlobalSeed("NG+ tests"); + + val = NewGamePlusVal(5, 1.2, 3, 1, 100, False); + test(val > 5, "NewGamePlusVal 1.2 goes up"); - val = 5; - NewGamePlusVal(val, 0.8, 3, 1, 100); - testint(val, 2, "NewGamePlusVal 1.2 goes down"); + val = NewGamePlusVal(5, 0.8, 3, 1, 100, False); + test(val < 5, "NewGamePlusVal 1.2 goes down"); - val = 5; - NewGamePlusVal(val, 0.8, 3, 5, 100); + val = NewGamePlusVal(5, 0.8, 3, 5, 100, False); testint(val, 5, "NewGamePlusVal with minimum stays the same"); // can't explain that! - val = 5; - NewGamePlusVal(val, 1.2, 3, 1, 5); + val = NewGamePlusVal(5, 1.2, 3, 1, 5, False); testint(val, 5, "NewGamePlusVal 1.2 with maximum"); - val = 0; - NewGamePlusVal(val, 1.2, 3, -10, 100); + val = NewGamePlusVal(0, 1.2, 3, -10, 100, False); testint(val, 0, "NewGamePlusVal 1.2 val==0"); - val = -5; - NewGamePlusVal(val, 1.2, 3, -6, 100); + val = NewGamePlusVal(-5, 1.2, 3, -6, 100, False); testint(val, -6, "NewGamePlusVal 1.2 negative value"); - oldSeed = dxr.seed; - dxr.seed = 123456; for(i=0; i<100; i++) { dxr.seed = 123456 + i; s = s @ class'DXRStartMap'.static.ChooseRandomStartMap(self, -1); } test(true, "DXRStartMap " $ s); dxr.seed = oldSeed; + + oldSeed = dxr.SetSeed(9876); // first two rngfn values are: 0.759380, -0.177720 + + fval = NewGamePlusVal(50.0, 0.99, 3, 0, 100, True); + test(fval < 50.0, "NewGamePlusVal doesn't switch from decreasing to increasing"); + + fval = NewGamePlusVal(50.0, 1.01, 3, 0, 100, True); + test(fval > 50.0, "NewGamePlusVal doesn't switch from increasing to decreasing"); + + dxr.SetSeed(oldSeed); } diff --git a/DXRModules/DeusEx/Classes/DXRKeys.uc b/DXRModules/DeusEx/Classes/DXRKeys.uc index f11505120..fb9ceb2da 100644 --- a/DXRModules/DeusEx/Classes/DXRKeys.uc +++ b/DXRModules/DeusEx/Classes/DXRKeys.uc @@ -6,11 +6,10 @@ function CheckConfig() { local int i; -#ifdef revision - revision_keys_rules(); -#else - vanilla_keys_rules(); -#endif + if(class'DXRMapVariants'.static.IsRevisionMaps(player())) + revision_keys_rules(); + else + vanilla_keys_rules(); for(i=0;i c, Name datacubeTag, string datacubename) +function Actor SpawnBot(class c, Name datacubeTag, string datacubename, int datacubehue) { local Actor a; local #var(prefix)Datacube d; @@ -494,7 +492,7 @@ function Actor SpawnBot(class c, Name datacubeTag, string datacubename) d.textTag = datacubeTag; d.bAddToVault = false; d.ItemName = datacubename; - GlowUp(d, 89); + GlowUp(d, datacubehue); return a; } diff --git a/DXRModules/DeusEx/Classes/DXRMapVariants.uc b/DXRModules/DeusEx/Classes/DXRMapVariants.uc index 7e4777cc3..2bce25b79 100644 --- a/DXRModules/DeusEx/Classes/DXRMapVariants.uc +++ b/DXRModules/DeusEx/Classes/DXRMapVariants.uc @@ -100,30 +100,46 @@ static function string GetDirtyMapName(string map, vector v) } -static function bool IsRevisionMaps(#var(PlayerPawn) player) +static function bool IsRevisionMaps(#var(PlayerPawn) player, optional Bool init) { #ifndef revision return False; #else local RevMenuChoice_Maps mapMenu; local Bool rc; + local DXRando dxr; - mapMenu = new(None) class'RevMenuChoice_Maps'; - mapMenu.player = player; - mapMenu.LoadSetting(); + foreach player.AllActors(class'DXRando',dxr){break;} - //Check to see if Revision is using Revision or Vanilla maps... - if (mapMenu.GetValue()==0){ - //0 = Vanilla - rc = False; + if (init){ + mapMenu = new(None) class'RevMenuChoice_Maps'; + mapMenu.player = player; + mapMenu.LoadSetting(); + + //Check to see if Revision is using Revision or Vanilla maps... + if (mapMenu.GetValue()==0){ + //0 = Vanilla + rc = False; + } else { + rc = True; + } + CriticalDelete(mapMenu); + //player.ClientMessage("RevisionMapsInit: "$rc); } else { - rc = True; + rc = dxr.RevisionMaps; + //player.ClientMessage("RevisionMapsCache: "$rc); } - CriticalDelete(mapMenu); return rc; #endif } +static function bool IsVanillaMaps(#var(PlayerPawn) player) +{ + if(#defined(vanillamaps)) return true; + if(#defined(revision)) return !IsRevisionMaps(player); + return false; +} + function int GetMirrorMapsSetting() { return dxr.flags.mirroredmaps; diff --git a/DXRModules/DeusEx/Classes/DXRMemes.uc b/DXRModules/DeusEx/Classes/DXRMemes.uc index 9be4833e3..e471ffb51 100644 --- a/DXRModules/DeusEx/Classes/DXRMemes.uc +++ b/DXRModules/DeusEx/Classes/DXRMemes.uc @@ -120,6 +120,115 @@ function RandomBobPage() } } +//These need a bit more manual fiddling than the others since you are so much closer to them, including underneath +function RandomMJ12Globe() +{ + local Earth earth; + local int i; + local float scaleMult; + local Rotator startRot; + + foreach AllActors(class'Earth',earth){ + SetGlobalSeed("RandomGlobe"); + + earth.bIsSecretGoal=True; + + startRot = earth.Rotation; + scaleMult=1.0; + + if ( rng(3)!=0 && !IsAprilFools() ) return; //33% chance of getting a random globe + + switch(rng(16)){ + case 0: + PlayDressUp(earth,class'Basketball',0); + startRot = rotm(8000,0,7000); //Give it a bit of tilt for more drama + scaleMult = 2; + break; + case 1: + PlayDressUp(earth,class'BoneSkull',0); + startRot = rotm(0,32765,-5000); //Slightly tilted down + scaleMult = 1.0; + break; + case 2: + PlayDressUp(earth,class'Liquor40oz',0); + startRot = rotm(0,16000,12000); + scaleMult = 2; + break; + case 3: + PlayDressUp(earth,class'#var(prefix)DXLogo',0); + startRot = earth.Rotation; + scaleMult = 3; + break; + case 4: + PlayDressUp(earth,class'SodaCan',0); + startRot = rotm(6000,16000,12000); + scaleMult = 1.0; + break; + case 5: //Does this one even look good? + PlayDressUp(earth,class'BoneFemur',0); + startRot = rotm(0,16000,12000); + scaleMult = 0.25; + break; + case 6: + PlayDressUp(earth,class'ChildMale2',24000); + startRot = earth.Rotation; + scaleMult = 1.5; + break; + case 7: + PlayDressUp(earth,class'Trophy',0); + startRot = earth.Rotation; + scaleMult = 1.0; + break; + case 8: + PlayDressUp(earth,class'GrayCarcass',0); + startRot = rotm(-16385,20000,0); + scaleMult = 0.25; + break; + case 9: + PlayDressUp(earth,class'Mutt',24000); + startRot = earth.Rotation; + scaleMult = 1.5; + break; + case 10: + PlayDressUp(earth,class'IonStormLogo',-20000); + startRot = earth.Rotation; + scaleMult = 8; + break; + case 11: + PlayDressUp(earth,class'EidosLogo',-20000); + startRot = earth.Rotation; + scaleMult = 0.4; + break; + case 12: + PlayDressUp(earth,class'HKTukTuk',-20000); + startRot = earth.Rotation; + scaleMult = 0.6; + break; + case 13: + PlayDressUp(earth,class'CarWrecked',-20000); + startRot = earth.Rotation; + scaleMult = 1.0; + break; + case 14: + PlayDressUp(earth,class'MiniSub',-20000); + startRot = earth.Rotation; + scaleMult = 1.0; + break; + case 15: + PlayDressUp(earth,class'JCDouble',24000); + startRot = earth.Rotation; + scaleMult = 1.5; + break; + } + + earth.RotationRate = rot(0,-750,0); + earth.DrawScale = earth.DrawScale * scaleMult; + earth.SetRotation(startRot); + + return; + } +} + function PreFirstEntry() { local bool memes_enabled; @@ -144,6 +253,9 @@ function PreFirstEntry() if(IsAprilFools()) PaulToilet(); break; + case "06_HONGKONG_MJ12LAB": + RandomMJ12Globe(); + break; } } @@ -271,6 +383,7 @@ function AnyEntry() case "ENDGAME2": case "ENDGAME3": case "ENDGAME4": + case "ENDGAME4REV": //case "00_TRAINING": // extra randomization in the intro for the lolz l("Memeing up "$ dxr.localURL); @@ -284,6 +397,9 @@ function FixEndgameEndCamera() { local CameraPoint cp; local int endCameraSeq; + local bool RevisionMaps; + + RevisionMaps = class'DXRMapVariants'.static.IsRevisionMaps(player()); switch(dxr.localURL) { @@ -291,13 +407,13 @@ function FixEndgameEndCamera() endCameraSeq=29; //Same in Vanilla and Revision break; case "ENDGAME2": - if(#defined(revision)) + if(RevisionMaps) endCameraSeq=32; else endCameraSeq=31; break; case "ENDGAME3": - if(#defined(revision)) + if(RevisionMaps) endCameraSeq=28; else endCameraSeq=27; @@ -360,6 +476,7 @@ function PostFirstEntry() case "ENDGAME2": case "ENDGAME3": case "ENDGAME4": + case "ENDGAME4REV": AddLeo(); break; } @@ -417,6 +534,7 @@ function AddLeo() loc.Z = -48; break; case "ENDGAME4": + case "ENDGAME4REV": l("Endgame 4"); loc.X = -736; loc.Y = -22; @@ -509,6 +627,7 @@ function RandomizeCutscene() i=0; _skipactor_types[i++] = class'DeusExPlayer'; _skipactor_types[i++] = class'Mover'; + _skipactor_types[i++] = class'Earth'; #ifdef revision _skipactor_types[i++] = class(DynamicLoadObject("RevisionDeco.Rev_SphereLight", class'class')); #endif @@ -526,6 +645,7 @@ function RandomizeCutscene() foreach AllActors(class'Actor', a) { if( Mover(a) != None ) continue; + if( Earth(a) != None ) continue; if( #var(prefix)BreakableGlass(a) != None ) continue; if( a.IsA('Rev_SphereLight') ) continue; if( a.bHidden || DeusExPlayer(a) != None ) continue; @@ -553,6 +673,7 @@ function RandomizeCutscene() RandomBobPage(); RandomLiberty(); + RandomMJ12Globe(); RandomizeDialog(); } diff --git a/DXRModules/DeusEx/Classes/DXRMissions.uc b/DXRModules/DeusEx/Classes/DXRMissions.uc index fe2db8ed6..74f36fa34 100644 --- a/DXRModules/DeusEx/Classes/DXRMissions.uc +++ b/DXRModules/DeusEx/Classes/DXRMissions.uc @@ -8,7 +8,7 @@ const GOAL_TYPE4 = 16; const SITTING_GOAL = 268435456; const VANILLA_GOAL = 536870912; const START_LOCATION = 1073741824; -const VANILLA_START = 2147483648; +const VANILLA_START = -2147483648; const PLAYER_LOCATION = 7; // keep in sync with length of GoalLocation.positions array var bool RandoMissionGoals;// only set on first entry @@ -31,11 +31,22 @@ struct GoalActorLocation { var rotator rot; }; +struct MapImageGoalMarkers { + var class image; + var string goalName; + var int locNum; + var String markerLetter; + var String helpText; + var int posX; + var int posY; +}; + struct GoalLocation { var string mapName; var string name; var int bitMask; var GoalActorLocation positions[8]; // keep in sync with PLAYER_LOCATION + var MapImageGoalMarkers mapMarker; }; struct MutualExclusion { @@ -46,8 +57,10 @@ struct Spoiler { var string goalName; var string goalLocation; var string locationMapName; + var int locationId; }; + var Goal goals[32]; var Spoiler spoilers[32]; var GoalLocation locations[64]; @@ -178,6 +191,68 @@ function String generateGoalLocationList() return goalList; } +function AddMapMarker(class image, int posX, int posY, String markerLetter, string goalName, int locNum, String helpText) +{ + locations[locNum].mapMarker.image=image; + locations[locNum].mapMarker.goalName=goalName; + locations[locNum].mapMarker.locNum=locNum; + locations[locNum].mapMarker.markerLetter=markerLetter; + locations[locNum].mapMarker.helpText=helpText; + locations[locNum].mapMarker.posX=posX; + locations[locNum].mapMarker.posY=posY; +} + +function bool MapHasGoalMarkers(class image) +{ + local int i; + for (i=0;i image, out DXRDataVaultMapImageNote notes[32]) +{ + local int i,numNotes; + for (i=0;i image, out DXRDataVaultMapImageNote notes[32]) +{ + local int i,goalLoc,numNotes; + local string goalName; + + for (i=0;i classname, float percent) foreach AllActors(class'#var(prefix)Containers', d) { + + if (#var(PlayerPawn)(d.base)!=None){ + continue; //Skip boxes the player might have carried across levels + } + if(d.Content3 == None && d.Content2 == None && d.Contents == None) continue; @@ -328,6 +333,7 @@ function ReduceSpawnsInContainers(class classname, float percent) simulated function SetMaxCopies(class type, int percent) { local #var(prefix)DeusExPickup p; + local #var(PlayerPawn) owner; local int maxCopies; local float f; @@ -340,8 +346,11 @@ simulated function SetMaxCopies(class type, int percent) f *= _GetItemMult(_item_reductions, p.class); p.maxCopies = float(p.default.maxCopies) * f / 100.0 * 0.8; p.maxCopies = Clamp(p.maxCopies, 1, p.default.maxCopies*10); - if( #defined(balance) && DeusExPlayer(p.Owner) != None && #var(prefix)FireExtinguisher(p) != None ) - p.maxCopies += DeusExPlayer(p.Owner).SkillSystem.GetSkillLevel(class'#var(prefix)SkillEnviro'); + owner = #var(PlayerPawn)(p.Owner); + if(owner == None) + owner = player(); + if( #defined(balance) && owner != None && #var(prefix)FireExtinguisher(p) != None ) + p.maxCopies += owner.SkillSystem.GetSkillLevel(class'#var(prefix)SkillEnviro'); #ifdef vmd maxCopies = p.VMDConfigureMaxCopies(); @@ -355,6 +364,7 @@ simulated function SetMaxCopies(class type, int percent) simulated function SetMaxAmmo(class type, int percent) { + local #var(PlayerPawn) owner; local Ammo a; local int maxAmmo; local float f; @@ -369,10 +379,13 @@ simulated function SetMaxAmmo(class type, int percent) a.MaxAmmo = float(a.default.MaxAmmo) * f / 100.0 * 0.8; a.MaxAmmo = Clamp(a.MaxAmmo, 1, a.default.MaxAmmo*10); - if( #defined(balance) && DeusExPlayer(a.Owner) != None + owner = #var(PlayerPawn)(a.Owner); + if(owner == None) + owner = player(); + if( #defined(balance) && owner != None && (AmmoEMPGrenade(a) != None || AmmoGasGrenade(a) != None || AmmoLAM(a) != None || AmmoNanoVirusGrenade(a) != None ) ) { - a.MaxAmmo += DeusExPlayer(a.Owner).SkillSystem.GetSkillLevel(class'#var(prefix)SkillDemolition'); + a.MaxAmmo += owner.SkillSystem.GetSkillLevel(class'#var(prefix)SkillDemolition'); } #ifdef vmd diff --git a/DXRModules/DeusEx/Classes/DXRReplaceActors.uc b/DXRModules/DeusEx/Classes/DXRReplaceActors.uc index a10e29012..7994586a5 100644 --- a/DXRModules/DeusEx/Classes/DXRReplaceActors.uc +++ b/DXRModules/DeusEx/Classes/DXRReplaceActors.uc @@ -46,9 +46,17 @@ function ReplaceActors() else if( #var(prefix)WHPiano(a) != None ) { ReplacePiano(#var(prefix)WHPiano(a)); } - else if( #var(prefix)MissionEndgame(a) != None && !#defined(revision) && !#defined(hx) ) { + else if( #var(prefix)MissionEndgame(a) != None && !#defined(hx) ) { ReplaceMissionEndgame(#var(prefix)MissionEndgame(a)); } +#ifdef revision + else if( RevisionMissionEndgame(a) != None) { + ReplaceRevMissionEndgame(RevisionMissionEndgame(a)); + } + else if( RevisionMissionIntro(a) != None) { + ReplaceRevMissionIntro(RevisionMissionIntro(a)); + } +#endif else if( #var(prefix)MissionIntro(a) != None ) { ReplaceMissionIntro(#var(prefix)MissionIntro(a)); } @@ -554,6 +562,50 @@ function ReplaceMissionEndgame(#var(prefix)MissionEndgame a) a.Destroy(); } +#ifdef revision +function ReplaceRevMissionEndgame(RevisionMissionEndgame a) +{ + //Theoretically, we'd want to replace with a DXRRevMissionEndgame, + //except that RevJCDentonMale doesn't let you skip to the ending + //when it's on a RevisionMissionEndgame, so let's not do this for now + + local DXRRevMissionEndgame n; + local DXRMissionEndgame n2; + + if (dxr.localURL!="ENDGAME4" && dxr.localURL!="ENDGAME4REV"){ + if(DXRRevMissionEndgame(a) != None) return; + + n = DXRRevMissionEndgame(SpawnReplacement(a, class'DXRRevMissionEndgame')); + if(n == None) + return; + + a.Destroy(); + } else { + //if(DXRRevMissionEndgame(a) != None) return; + + n2 = DXRMissionEndgame(SpawnReplacement(a, class'DXRMissionEndgame')); + if(n2 == None) + return; + + a.Destroy(); + } +} + +function ReplaceRevMissionIntro(RevisionMissionIntro a) +{ + local DXRRevMissionIntro n; + + if(DXRRevMissionIntro(a) != None) return; + + n = DXRRevMissionIntro(SpawnReplacement(a, class'DXRRevMissionIntro')); + if(n == None) + return; + + a.Destroy(); +} + +#endif + function ReplaceMissionIntro(#var(prefix)MissionIntro a) { local DXRMissionIntro n; diff --git a/DXRModules/DeusEx/Classes/DXRStartMap.uc b/DXRModules/DeusEx/Classes/DXRStartMap.uc index d52be0c02..0c5f55afb 100644 --- a/DXRModules/DeusEx/Classes/DXRStartMap.uc +++ b/DXRModules/DeusEx/Classes/DXRStartMap.uc @@ -329,6 +329,7 @@ static function StartMapSpecificFlags(FlagBase flagbase, string start_map) case "09_NYC_Dockyard": flagbase.SetBool('M08WarnedSmuggler',true,,-1); flagbase.SetBool('DL_BadNews_Played',true,,-1); + flagbase.SetBool('HelpSailor',true,,-1); break; case "10_Paris_Chateau": //Make sure Sandra spawns at the gas station @@ -397,6 +398,8 @@ static function bool BingoGoalImpossible(string bingo_event, int start_map, int case "SilhouetteHostagesAllRescued": case "LouisBerates": case "IcarusCalls_Played": + case "roof_elevator": + case "MeetRenault_Played": return start_map>100; //All these early Paris things - if we were to add a "Streets" starting location, this would need to be split more accurately case "ManWhoWasThursday":// in 10_Paris_Catacombs, and then 12_Vandenberg_Cmd, but nothing in M11 return start_map > 100 && end_mission <= 11; diff --git a/DXRModules/DeusEx/Classes/DXRStats.uc b/DXRModules/DeusEx/Classes/DXRStats.uc index 9af7b37b1..db4704477 100644 --- a/DXRModules/DeusEx/Classes/DXRStats.uc +++ b/DXRModules/DeusEx/Classes/DXRStats.uc @@ -364,6 +364,26 @@ static function AddGibbedKill(DeusExPlayer p) IncStatFlag(p,'DXRStats_gibbedkills'); } +static function AddKill(DeusExPlayer p) +{ + IncStatFlag(p,'DXRStats_kills'); +} + +static function AddKnockOut(DeusExPlayer p) +{ + IncStatFlag(p,'DXRStats_knockouts'); +} + +static function AddKillByOther(DeusExPlayer p) +{ + IncStatFlag(p,'DXRStats_kills_by_other'); +} + +static function AddKnockOutByOther(DeusExPlayer p) +{ + IncStatFlag(p,'DXRStats_knockouts_by_other'); +} + static function AddCheatOffense(DeusExPlayer p, optional int add) { IncStatFlag(p,'DXRStats_cheats', add); @@ -520,7 +540,7 @@ static function CheckLeaderboard(DXRando dxr, Json j) function AddDXRCredits(CreditsWindow cw) { - local int fired,swings,jumps,deaths,burnkills,gibbedkills,saves,autosaves,loads; + local int fired,swings,jumps,deaths,burnkills,gibbedkills,saves,autosaves,loads,kills,kos,killsByOther,kosByOther; local CreditsLeaderboardWindow leaderboard; cw.PrintLn(); @@ -541,6 +561,10 @@ function AddDXRCredits(CreditsWindow cw) jumps = dxr.flagbase.GetInt('DXRStats_jumps'); burnkills = dxr.flagbase.GetInt('DXRStats_burnkills'); gibbedkills = dxr.flagbase.GetInt('DXRStats_gibbedkills'); + kills = dxr.flagbase.GetInt('DXRStats_kills'); + kos = dxr.flagbase.GetInt('DXRStats_knockouts'); + killsByOther = dxr.flagbase.GetInt('DXRStats_kills_by_other'); + kosByOther = dxr.flagbase.GetInt('DXRStats_knockouts_by_other'); deaths = GetDataStorageStat(dxr, "DXRStats_deaths"); saves = player().saveCount; autosaves = GetDataStorageStat(dxr, "DXRStats_autosaves"); @@ -557,8 +581,12 @@ function AddDXRCredits(CreditsWindow cw) cw.PrintText("Nano Keys: "$player().KeyRing.GetKeyCount()); cw.PrintText("Skill Points Earned: "$player().SkillPointsTotal); - cw.PrintText("Enemies Burned to Death: "$burnkills); - cw.PrintText("Enemies Gibbed: "$gibbedkills); + cw.PrintText("NPCs Killed by JC: "$kills); + cw.PrintText("NPCs Knocked Out by JC: "$kos); + cw.PrintText("Total NPC Deaths: "$(kills + killsByOther)); + cw.PrintText("Total NPCs Knocked Out: "$(kos + kosByOther)); + cw.PrintText("Total NPCs Burned to Death: "$burnkills); + cw.PrintText("Total NPCs Gibbed: "$gibbedkills); cw.PrintText("Deaths: "$deaths); cw.PrintText("Saves: "$saves$" ("$autosaves$" Autosaves)"); cw.PrintText("Loads: "$loads); @@ -636,16 +664,16 @@ function TestScoring() bingo_win, bingos, bingo_spots, skill_points, nanokeys, cheats; dxr.flags.SetDifficulty(1); - testint(dxr.flags.ScoreFlags(), 4870, "score bonus for Normal"); + testint(dxr.flags.ScoreFlags(), 4835, "score bonus for Normal"); dxr.flags.SetDifficulty(2); - testint(dxr.flags.ScoreFlags(), 10580, "score bonus for Hard"); + testint(dxr.flags.ScoreFlags(), 10545, "score bonus for Hard"); dxr.flags.SetDifficulty(3); - testint(dxr.flags.ScoreFlags(), 12680, "score bonus for Extreme"); + testint(dxr.flags.ScoreFlags(), 12645, "score bonus for Extreme"); dxr.flags.SetDifficulty(4); - testint(dxr.flags.ScoreFlags(), 14645, "score bonus for Impossible"); + testint(dxr.flags.ScoreFlags(), 14610, "score bonus for Impossible"); names[num] = "1 Million Points!"; scores[num++] = 1000000; diff --git a/DXRModules/DeusEx/Classes/DXRWeaponMods.uc b/DXRModules/DeusEx/Classes/DXRWeaponMods.uc index cd3429409..4a88a9e78 100644 --- a/DXRModules/DeusEx/Classes/DXRWeaponMods.uc +++ b/DXRModules/DeusEx/Classes/DXRWeaponMods.uc @@ -121,6 +121,9 @@ function FirstEntry() //Technically any decoration can contain objects, but I think DX only puts them in containers foreach AllActors(class'Containers',container) { + if (#var(PlayerPawn)(container.base)!=None){ + continue; //Skip boxes the player might have carried across levels + } //I don't know if anything has anything in contents2 or contents3, but can't hurt... if(IsValidModClass(container.contents)){ container.contents = PickRandomMod(); diff --git a/DXRNonVanilla/DeusEx/Classes/DXRandoGameInfo.uc b/DXRNonVanilla/DeusEx/Classes/DXRandoGameInfo.uc index 9c8751886..3204179bd 100644 --- a/DXRNonVanilla/DeusEx/Classes/DXRandoGameInfo.uc +++ b/DXRNonVanilla/DeusEx/Classes/DXRandoGameInfo.uc @@ -7,6 +7,8 @@ class DXRandoGameInfo extends DeusExGameInfo config; // HXRando has its own custom GameInfo var DXRando dxr; +var Inventory stolenInventory; +var AugmentationManager stolenAugs; function DXRando GetDXR() { @@ -19,6 +21,12 @@ function DXRando GetDXR() break; dxr = Spawn(class'DXRando'); + + //Fix Endgame4, if that's where we are... + if (#defined(revision) && DeusExLevelInfo.MapName=="Endgame4"){ + DeusExLevelInfo.MapName="ENDGAME4REV"; + } + dxr.SetdxInfo(DeusExLevelInfo); log("GetDXR(), dxr: "$dxr, self.name); return dxr; @@ -28,6 +36,8 @@ event InitGame( String Options, out String Error ) { Super.InitGame(Options, Error); + stolenInventory = None; + log("InitGame DXR", self.name); GetDXR(); } @@ -35,11 +45,22 @@ event InitGame( String Options, out String Error ) event PostLogin(playerpawn NewPlayer) { local #var(PlayerPawn) p; + local bool hasLevelInfo; + local DeusExLevelInfo dxLevelInfo; _PostLogin(NewPlayer); if( Role != ROLE_Authority ) return; + if (#defined(revision) && InStr(Caps(Level.GetLocalURL()),"99_ENDGAME4")!=-1){ + hasLevelInfo = False; + foreach AllActors(class'DeusExLevelInfo',dxLevelInfo){hasLevelInfo=True;} + if (!hasLevelInfo){ + dxLevelInfo=SpawnDXLevelInfo(); + dxr.SetdxInfo(dxLevelInfo); + } + } + p = #var(PlayerPawn)(NewPlayer); GetDXR(); @@ -70,6 +91,22 @@ function Killed( pawn Killer, pawn Other, name damageType ) class'DXREvents'.static.AddDeath(Other, Killer, damageType); } +function SendPlayer( PlayerPawn aPlayer, string URL ) +{ + if (#defined(revision)){ + if (stolenInventory!=None){ + aPlayer.Inventory = stolenInventory; + stolenInventory = None; + } + if (stolenAugs!=None){ + DeusExPlayer(aPlayer).AugmentationSystem = stolenAugs; + stolenAugs = None; + } + } + + Super.SendPlayer(aPlayer,URL); +} + #ifdef vmd event _PostLogin(playerpawn NewPlayer) { @@ -127,3 +164,22 @@ event Super_PostLogin( playerpawn NewPlayer ) } } } + +function DeusExLevelInfo SpawnDXLevelInfo() +{ + local DeusExLevelInfo DeusExLevelInfo; + + class'DeusExLevelInfo'.default.MapName = "ENDGAME4REV"; + class'DeusExLevelInfo'.default.missionNumber = 99; + class'DeusExLevelInfo'.default.Script = class'DXRMissionEndgame'; + DeusExLevelInfo = Spawn(class'DeusExLevelInfo'); + + //These defaults probably don't need to be reset, but better safe than sorry. + class'DeusExLevelInfo'.default.MapName = ""; + class'DeusExLevelInfo'.default.missionNumber = 0; + class'DeusExLevelInfo'.default.Script = None; + + log("SpawnDXLevelInfo() "$ self.name); + + return DeusExLevelInfo; +} diff --git a/DXRVanilla/DeusEx/Classes/LuciusDeBeers.uc b/DXRVanilla/DeusEx/Classes/LuciusDeBeers.uc index ee22569c8..6464d4861 100644 --- a/DXRVanilla/DeusEx/Classes/LuciusDeBeers.uc +++ b/DXRVanilla/DeusEx/Classes/LuciusDeBeers.uc @@ -87,4 +87,7 @@ function Destroyed() defaultproperties { bInvincible=True; + bHighlight=True; + minDamageThreshold=20; + HitPoints=75; } diff --git a/DXRVanilla/DeusEx/Classes/Mission11.uc b/DXRVanilla/DeusEx/Classes/Mission11.uc index 5d006e0fa..c6ec27cef 100644 --- a/DXRVanilla/DeusEx/Classes/Mission11.uc +++ b/DXRVanilla/DeusEx/Classes/Mission11.uc @@ -9,6 +9,7 @@ function Timer() { // knock out the player and teleport him after this convo if (flags.GetBool('MeetTobyAtanwe_Played') && + flags.GetBool('MS_LetTobyTakeYou_Rando') && !flags.GetBool('MS_PlayerTeleported')) { flags.SetBool('MS_PlayerTeleported', True,, 12); @@ -19,6 +20,13 @@ function Timer() } Level.Game.SendPlayer(Player, map); } + + //Reset the conversation flag if you haven't actually asked him to take you + if (flags.GetBool('MeetTobyAtanwe_Played') && + !flags.GetBool('MS_LetTobyTakeYou_Rando')) + { + flags.SetBool('MeetTobyAtanwe_Played', False,, 12); + } } Super.Timer(); diff --git a/DXRVanilla/DeusEx/Classes/PersonaScreenInventory.uc b/DXRVanilla/DeusEx/Classes/PersonaScreenInventory.uc index 62625d1a8..282832162 100644 --- a/DXRVanilla/DeusEx/Classes/PersonaScreenInventory.uc +++ b/DXRVanilla/DeusEx/Classes/PersonaScreenInventory.uc @@ -33,5 +33,55 @@ function UpdateWinInfo(Inventory inv) anItem = DeusExPickup(inv); if(anItem != None && anItem.maxCopies > 1) { winInfo.AppendText(" / " $ anItem.maxCopies); + }else if (ChargedPickup(anItem)!=None){ + winInfo.AppendText("|n|nDuration: "$CalcChargedPickupDurations(ChargedPickup(anItem))); } } + + +function string CalcChargedPickupDurations(ChargedPickup cp) +{ + local string chargeVals; + local int i; + local float workingVal, skillVal, drain; + local bool curLevel; + local int maxLevel; + + chargeVals = ""; + maxLevel = 0; + if (cp.SkillNeeded!=None){ + maxLevel = 3; + } + + for (i=0;i<=maxLevel;i++){ + workingVal = cp.Default.Charge; + drain = 4.0; + skillVal = 1.0; + curLevel = False; + if (cp.SkillNeeded!=None){ + skillVal = Player.SkillSystem.GetSkillFromClass(cp.skillNeeded).LevelValues[i]; + curLevel = Player.SkillSystem.GetSkillLevel(cp.skillNeeded) == i; + } + drain *=skillVal; + if (drain < 1) drain=1; + + workingVal = workingVal/drain; //How many times can it drain at this rate? + workingVal = workingVal/10.0; //drain happens every 0.1 seconds + + if (curLevel){ + chargeVals = chargeVals $ ">"; + } + + chargeVals = chargeVals $ Int(workingVal)$"s"; + + if (curLevel){ + chargeVals = chargeVals $ "<"; + } + + if (i!=maxLevel){ + chargeVals = chargeVals $ " / "; + } + } + + return chargeVals; +} diff --git a/DXRVanilla/DeusEx/Classes/Player.uc b/DXRVanilla/DeusEx/Classes/Player.uc index c72e61f9f..e1c9be2ce 100644 --- a/DXRVanilla/DeusEx/Classes/Player.uc +++ b/DXRVanilla/DeusEx/Classes/Player.uc @@ -132,8 +132,24 @@ function ShowIntro(optional bool bStartNewGame) exec function QuickSave() { - if( class'DXRAutosave'.static.AllowManualSaves(self) ) Super.QuickSave(); - else ClientMessage("Manual saving is not allowed in this game mode! Good Luck!",, true); + local DeusExLevelInfo info; + + if( class'DXRAutosave'.static.AllowManualSaves(self) ){ + info = GetLevelInfo(); + + //Same logic from DeusExPlayer, so we can add a log message if the quick save succeeded or not + if (((info != None) && (info.MissionNumber < 0)) || + ((IsInState('Dying')) || (IsInState('Paralyzed')) || (IsInState('Interpolating'))) || + (dataLinkPlay != None) || (Level.Netmode != NM_Standalone)) + { + ClientMessage("Cannot quick save during infolink!",, true); + } else { + Super.QuickSave(); + ClientMessage("Quick Saved",, true); + } + } else { + ClientMessage("Manual saving is not allowed in this game mode! Good Luck!",, true); + } } function bool HandleItemPickup(Actor FrobTarget, optional bool bSearchOnly) @@ -162,6 +178,9 @@ function bool HandleItemPickup(Actor FrobTarget, optional bool bSearchOnly) if (mod.CanUpgradeWeapon(weap)){ mod.ApplyMod(weap); ClientMessage(mod.ItemName$" applied to "$weap.ItemName); + if (mod.IsA('WeaponModLaser') && bool(ConsoleCommand("get #var(package).MenuChoice_AutoLaser enabled"))){ + weap.LaserOn(); + } mod.DestroyMod(); return true; } diff --git a/DXRVanilla/DeusEx/Classes/Weapon.uc b/DXRVanilla/DeusEx/Classes/Weapon.uc index 1e8424bf7..ea1884fc8 100644 --- a/DXRVanilla/DeusEx/Classes/Weapon.uc +++ b/DXRVanilla/DeusEx/Classes/Weapon.uc @@ -27,12 +27,19 @@ function BringUp() bCanTrack = False; else bCanTrack = default.bCanTrack; + + if (bool(ConsoleCommand("get #var(package).MenuChoice_AutoLaser enabled"))){ + //LaserOn already checks to see if it has a laser, so just call it + LaserOn(); + } } simulated function Tick(float deltaTime) { local float r, e; + Super.Tick(deltaTime); + if(!IsAnimating()) { return; } @@ -87,6 +94,23 @@ simulated function bool NearWallCheck() placeLocation = HitLocation; placeNormal = HitNormal; placeMover = Mover(HitActor); + + if (!bNearWall && IsAnimating() && (GetStateName() == 'NormalFire')) + { + //The throw animation is about to be canceled by a place animation. + //Ammo gets consumed at the start of the animation, but the projectile is only spawned + //when the animation completely finishes. If it is interrupted, the projectile won't + //be spawned. The animation can be easily canceled if you get near a wall and the + //grenade PlaceBegin and PlaceEnd animations play. We need to catch that to fix + //issue #519 + + AmmoType.AddAmmo(1); //Give the ammo back + bDestroyOnFinish=False; //Make sure it isn't destroyed afterwards + if (DeusExPlayer(Owner)!=None){ + DeusExPlayer(Owner).UpdateBeltText(Self); + } + } + return True; } diff --git a/DXRando/DeusEx/Classes/DXRBarrelFire.uc b/DXRando/DeusEx/Classes/DXRBarrelFire.uc index e5495a824..5d763aad1 100644 --- a/DXRando/DeusEx/Classes/DXRBarrelFire.uc +++ b/DXRando/DeusEx/Classes/DXRBarrelFire.uc @@ -49,9 +49,78 @@ function Tick(float delta) Super.Tick(delta); } +function Destroyed() +{ + local int i; + local Vector loc; + local TrashPaper trash; + local Fire fire; + local bool fireHasSpawned; + + // trace down to see if we are sitting on the ground + loc = vect(0,0,0); + loc.Z -= CollisionHeight + 8.0; + loc += Location; + + // only generate trash if we are on the ground + if (!FastTrace(loc)) + { + fireHasSpawned = False; + + // maybe spawn some paper + for (i=0; i<3; i++) + { + if (FRand() < 0.75) + { + loc = Location; + loc.X += (CollisionRadius / 2) - FRand() * CollisionRadius; + loc.Y += (CollisionRadius / 2) - FRand() * CollisionRadius; + loc.Z += (CollisionHeight / 2) - FRand() * CollisionHeight; + trash = Spawn(class'TrashPaper',,, loc); + if (trash != None) + { + trash.SetPhysics(PHYS_Rolling); + trash.rot = RotRand(True); + trash.rot.Yaw = 0; + trash.dir = VRand() * 20 + vect(20,20,0); + trash.dir.Z = 0; + + // maybe set it on fire + if (FRand() < 0.5) + { + // trash has no collision and its collisionHeight seems to have no correspondence to its actual size + // this code is based on collisionHeight only for potential scaling purposes + loc.Z += 0.8 * trash.Collisionheight; + + fire = Spawn(class'SmokelessFire', trash,, loc); + if (fire != None) + { + fire.DrawScale = 0.5*FRand() + 1.0; + fire.DrawScale *= 0.5; + + // necessary? + if (fireHasSpawned) + { + fire.AmbientSound = None; + } + else + { + fireHasSpawned = True; + } + } + } + } + } + } + } + + Super.Destroyed(); +} + // same as Barrel1 defaultproperties { Mass=80 Buoyancy=90 + bInvincible=False } diff --git a/DXRando/DeusEx/Classes/DXRDataVaultImage.uc b/DXRando/DeusEx/Classes/DXRDataVaultImage.uc new file mode 100644 index 000000000..9cbc3bf94 --- /dev/null +++ b/DXRando/DeusEx/Classes/DXRDataVaultImage.uc @@ -0,0 +1,14 @@ +//============================================================================= +// DXRDataVaultImage +//============================================================================= + +class DXRDataVaultImage injects DataVaultImage; + +function AddNote(DataVaultImageNote newNote) +{ + Super.AddNote(newNote); + + if (!class'DXRVersion'.static.VersionIsStable() && owner!=None){ + DeusExPlayer(owner).ClientMessage("New note '"$newNote.noteText$"' added at X"$newNote.posX$" Y"$newNote.posY); + } +} diff --git a/DXRando/DeusEx/Classes/DXRDataVaultMapImageNote.uc b/DXRando/DeusEx/Classes/DXRDataVaultMapImageNote.uc new file mode 100644 index 000000000..ce5e6f4c6 --- /dev/null +++ b/DXRando/DeusEx/Classes/DXRDataVaultMapImageNote.uc @@ -0,0 +1,4 @@ +class DXRDataVaultMapImageNote expands DataVaultImageNote; + +var travel String HelpTitle; +var travel String HelpText; \ No newline at end of file diff --git a/DXRando/DeusEx/Classes/DXRMissionEndgame.uc b/DXRando/DeusEx/Classes/DXRMissionEndgame.uc index f4a8f3f8e..43a740831 100644 --- a/DXRando/DeusEx/Classes/DXRMissionEndgame.uc +++ b/DXRando/DeusEx/Classes/DXRMissionEndgame.uc @@ -1,14 +1,5 @@ class DXRMissionEndgame injects #var(prefix)MissionEndgame; -struct EndQuote -{ - var string quote; - var string attribution; -}; - -var EndQuote quotes[80]; -var int numQuotes; - #ifdef gmdx var name TarEndgameConvo; var float DelayTimer; @@ -17,132 +8,6 @@ var name TarEndgameConvo; var float DelayTimer; #endif -//For now, this is limited to the default UnrealScript limit of 256 characters in a string -function AddQuote(string quote, string attribution) -{ - quotes[numQuotes].quote = quote; - quotes[numQuotes].attribution = " -- "$attribution; - numQuotes++; -} - -function LoadQuotes() -{ - //Original Endgame Quotes - //AddQuote("YESTERDAY WE OBEYED KINGS AND BENT OUR NECKS BEFORE EMPERORS. BUT TODAY WE KNEEL ONLY TO TRUTH...","KAHLIL GIBRAN"); - //AddQuote("IF THERE WERE NO GOD, IT WOULD BE NECESSARY TO INVENT HIM.","VOLTAIRE"); - //AddQuote("BETTER TO REIGN IN HELL, THAN SERVE IN HEAVEN.","PARADISE LOST, JOHN MILTON"); - - //DX Quotes - AddQuote("A BOMB!","JC DENTON"); - AddQuote("OH MY GOD! JC! A BOMB!","JOCK"); - AddQuote("I SPILL MY DRINK!","IVAN"); - AddQuote("THANKS FOR GETTING ME IN!","TESSA"); - AddQuote("WHAT A SHAME...","JC DENTON"); - AddQuote("YOU CAN'T FIGHT IDEAS WITH BULLETS.","LEO GOLD"); - AddQuote("WHAT AN EXPENSIVE MISTAKE YOU TURNED OUT TO BE.","WALTON SIMONS"); - AddQuote("JUMP! YOU CAN MAKE IT!","BOB PAGE"); - AddQuote("THE MORE POWER YOU THINK YOU HAVE, THE MORE QUICKLY IT SLIPS FROM YOUR GRASP.","TRACER TONG"); - AddQuote("I NEVER HAD TIME TO TAKE THE OATH OF SERVICE TO THE COALITION. HOW ABOUT THIS ONE? I SWEAR NOT TO REST UNTIL UNATCO IS FREE OF YOU AND THE OTHER CROOKED BUREAUCRATS WHO HAVE PERVERTED ITS MISSION.","JC DENTON"); - AddQuote("WE ARE THE INVISIBLE HAND. WE ARE THE ILLUMINATI. WE COME BEFORE AND AFTER. WE ARE FOREVER. AND EVENTUALLY... EVENTUALLY WE WILL LEAD THEM INTO THE DAY.","MORGAN EVERETT"); - AddQuote("THE NEED TO BE OBSERVED AND UNDERSTOOD WAS ONCE SATISFIED BY GOD. NOW WE CAN IMPLEMENT THE SAME FUNCTIONALITY WITH DATA-MINING ALGORITHMS.","MORPHEUS"); - AddQuote("I ORDER YOU TO STAND IN THE SPOTLIGHT AND GROWL AT THE WOMEN LIKE A DOG WHO NEEDS A MASTER.","DOOR GIRL"); - AddQuote("I WANTED ORANGE. IT GAVE ME LEMON-LIME.","GUNTHER HERMANN"); - - //Why not some Zero Wing? - AddQuote("SOMEBODY SET UP US THE BOMB.","MECHANIC"); - AddQuote("ALL YOUR BASE ARE BELONG TO US.","CATS"); - AddQuote("YOU HAVE NO CHANCE TO SURVIVE MAKE YOUR TIME.","CATS"); - - //A bit of Zelda perhaps? - AddQuote("AND THE MASTER SWORD SLEEPS AGAIN... FOREVER!","A LINK TO THE PAST"); - AddQuote("IT'S A SECRET TO EVERYBODY","MOBLIN"); - AddQuote("AH, THE SCROLL OF SHURMAK, BEARER OF SAD NEWS THESE MANY YEARS AGO.","GASPRA"); - AddQuote("SHADOW AND LIGHT ARE TWO SIDES OF THE SAME COIN, ONE CANNOT EXIST WITHOUT THE OTHER.","PRINCESS ZELDA"); - AddQuote("A SWORD WIELDS NO STRENGTH UNLESS THE HAND THAT HOLDS IT HAS COURAGE","THE HERO'S SHADE"); - AddQuote("THE WIND... IT IS BLOWING...","GANONDORF"); - AddQuote("DO NOT THINK IT ENDS HERE... THE HISTORY OF LIGHT AND SHADOW WILL BE WRITTEN IN BLOOD!","GANONDORF"); - AddQuote("YOUR COURAGE AND STRENGTH WILL NOT BE FORGOTTEN. FOR NOW, YOUR WORK IS DONE. OFF YOU GO TO CELEBRATE LINK'S RETURN. BUT FIRST, REMEMBER, LESSONS OF THE HEART, MERCY, AND HUMAN KINDNESS PREVAIL ABOVE ALL ELSE.","GASPRA"); - AddQuote("LAMP OIL? ROPE? BOMBS? YOU WANT IT? IT'S YOURS MY FRIEND, AS LONG AS YOU HAVE ENOUGH RUBIES!","MORSHU"); - - //Some Plumber Talk - AddQuote("THANK YOU MARIO! BUT OUR PRINCESS IS IN ANOTHER CASTLE!","TOAD"); - AddQuote("THANK YOU SO MUCH FOR PLAYING MY GAME!","MARIO"); - AddQuote("DEAR PESKY PLUMBERS, THE KOOPALINGS AND I HAVE TAKEN OVER THE MUSHROOM KINGDOM! THE PRINCESS IS NOW A PERMANENT GUEST AT ONE OF MY SEVEN KOOPA HOTELS. I DARE YOU TO FIND HER IF YOU CAN!","BOWSER"); - - //A bit of this and that - AddQuote("UNFORTUNATELY, KLLING IS ONE OF THOSE THINGS THAT GETS EASIER THE MORE YOU DO IT.","SOLID SNAKE"); - AddQuote("WHAT IS A MAN? A MISERABLE LITTLE PILE OF SECRETS!","DRACULA"); - AddQuote("THE RIGHT MAN IN THE WRONG PLACE CAN MAKE ALL THE DIFFERENCE IN THE WORLD","G-MAN"); - AddQuote("HACK THE PLANET!","HACKERS"); - AddQuote("I NEVER ASKED FOR THIS","ADAM JENSEN"); - AddQuote("BRING ME A BUCKET, AND I'LL SHOW YOU A BUCKET!","PSYCHO"); - AddQuote("DO A BARREL ROLL!","PEPPY HARE"); - AddQuote("WAR. WAR NEVER CHANGES.","RON PERLMAN"); - AddQuote("PRAISE THE SUN!","SOLAIRE OF ASTORA"); - AddQuote("STUPID BANJO AND DUMB KAZOOIE. I'LL BE BACK IN BANJO-TOOIE!","GRUNTILDA"); - AddQuote("IF HISTORY IS TO CHANGE, LET IT CHANGE. IF THE WORLD IS TO BE DESTROYED, SO BE IT. IF MY FATE IS TO DIE, I MUST SIMPLY LAUGH","MAGUS"); - AddQuote("LIFE... DREAMS... HOPE... WHERE DO THEY COME FROM? AND WHERE DO THEY GO...? SUCH MEANINGLESS THINGS... I'LL DESTROY THEM ALL!","KEFKA"); - AddQuote("DO NOT HATE HUMANS. IF YOU CANNOT LIVE WITH THEM, THEN AT LEAST DO THEM NO HARM, FOR THEIRS IS ALREADY A HARD LOT","LISA"); - AddQuote("UH, BOYS? HOW ABOUT THAT EVAC? COMMANDER? JIM? WHAT THE HELL IS GOING ON UP THERE??","SARAH KERRIGAN"); - AddQuote("LOOK AT YOU, HACKER: A PATHETIC CREATURE OF MEAT AND BONE, PANTING AND SWEATING AS YOU RUN THROUGH MY CORRIDORS. HOW CAN YOU CHALLENGE A PERFECT, IMMORTAL MACHINE?","SHODAN"); - AddQuote("NANOMACHINES, SON.","SENATOR ARMSTRONG"); - AddQuote("THIS WAS A TRIUMPH. I'M MAKING A NOTE HERE: HUGE SUCCESS","GLADOS"); - AddQuote("NEVER GONNA GIVE YOU UP, NEVER GONNA LET YOU DOWN. NEVER GONNA RUN AROUND AND DESERT YOU. NEVER GONNA MAKE YOU CRY. NEVER GONNA SAY GOODBYE. NEVER GONNA TELL A LIE AND HURT YOU","RICK ASTLEY"); - AddQuote("IF THE ZOO BANS ME FOR HOLLERING AT THE ANIMALS I WILL FACE GOD AND WALK BACKWARDS INTO HELL","DRIL"); - AddQuote("NANITES! COURTESY OF RAY PALMER!", "OLIVER QUEEN"); - AddQuote("SAY 'FUZZY PICKLES!'","PHOTOGRAPHER"); //Earthbound - AddQuote("SPANKETY SPANKETY SPANKETY!","POKEY");//Earthbound - AddQuote("I KNOW WHAT YOU'RE THINKING... ALL THIS POWER, AND LOOKS TOO!","BOWSER"); //Super Mario RPG - AddQuote("UWEE HEE HEE! DON'T TEASE THE OCTOPUS, KIDS!","ULTROS"); //FF6 - AddQuote("I USED TO BE AN ADVENTURER LIKE YOU. THEN I TOOK AN ARROW IN THE KNEE...","WHITERUN GUARD"); //Skyrim - AddQuote("THAT WAS TOO CLOSE... YOU WERE ALMOST A JILL SANDWICH","BARRY BURTON"); //Resident Evil - AddQuote("YOU HAVE DIED OF DYSENTERY","THE OREGON TRAIL"); - AddQuote("LEEEEROOOYYYYYYYYY JEEEENNNKKKIIINNNNNNSSSSS","LEEROY JENKINS"); - AddQuote("A WINNER IS YOU","PRO WRESTLING"); //Pro Wrestling for NES - AddQuote("ALL WE HAD TO DO, WAS FOLLOW THE DAMN TRAIN, CJ","BIG SMOKE"); //GTA San Andreas - AddQuote("WE BROKE IT. YES, WE WERE NAUGHTY. COMPLETELY NAUGHTY. SO, SO VERY SORRY. BUT JUST BETWEEN YOU AND US, IT FELT QUITE GOOD","THE KING OF ALL COSMOS"); //Katamari - AddQuote("IT IS NOT YOUR FAULT. IT IS OUR FAULT FOR BELIEVING IN YOU.","THE KING OF ALL COSMOS"); //Katamari - AddQuote("MY BODY IS READY","REGGIE FILS-AIME"); - AddQuote("I'VE SEEN THINGS YOU PEOPLE WOULDN'T BELIEVE... ATTACK SHIPS ON FIRE OFF THE SHOULDER OF ORION... I WATCHED C-BEAMS GLITTER IN THE DARK NEAR THE TANNHAUSER GATE. ALL THOSE MOMENTS WILL BE LOST IN TIME, LIKE TEARS IN RAIN... TIME TO DIE.","ROY BATTY"); //Bladerunner - AddQuote("ENOUGH! OPEN UP YOUR EYES AND LOOK AT THE BIG PICTURE; YOU’RE ALL PUPPETS OF CORRUPT POLITICIANS AND CAPITALISTS. DON’T YOU UNDERSTAND, IT’S UTTERLY POINTLESS TO FIGHT EACH OTHER.","COLONEL SHIKISHIMA"); //Akira - - - //T7G / T11H Quotes... trying to avoid spoilers... - AddQuote("OLD MAN STAUF BUILT A HOUSE AND FILLED IT WITH HIS TOYS", "HENRY STAUF"); - AddQuote("MY, ISN'T THIS A CHEERY PLACE?", "MARTINE BURDEN"); - AddQuote("AT LEAST HE LEFT HIS *REGRETS*", "HAMILTON TEMPLE"); - AddQuote("YOU ARE A GLUTTON FOR PUNISHMENT", "HENRY STAUF"); - AddQuote("WANT A BALLOON, SONNY?", "CLOWN"); - AddQuote("FEELING LONELY?", "HENRY STAUF"); - AddQuote("ARRRRRR! DON'T THINK YOU'LL BE SO LUCKY NEXT TIME.", "HENRY STAUF"); - AddQuote("OH, I'M DYING TO SEE WHAT YOU DO NEXT...", "HENRY STAUF"); - AddQuote("SO... YOU LIVE TO PLAY ANOTHER DAY... .", "HENRY STAUF"); - AddQuote("HENRY STAUF GREW WEALTHY, BUT THEN THIS STRANGE VIRUS CAME...", "THE 7TH GUEST NARRATOR"); - AddQuote("I THINK THAT WE WERE MEANT TO EAT THE SOUP.", "EDWARD KNOX"); - AddQuote("CHUCK HIM INTO THE SOUP", "SOUP"); - AddQuote("YEAH, IT'S BLOOD.", "CHIEF JIM MARTIN"); -} - -function EndQuote PickRandomQuote(int vanilla_num) -{ - local DXRando dxr; - local EndQuote q; - - foreach AllActors(class'DXRando',dxr) break; - - if(dxr != None) { - if(dxr.flags.IsReducedRando()) { - q.quote = endgameQuote[vanilla_num*2]; - q.attribution = endgameQuote[vanilla_num*2 + 1]; - return q; - } - - return quotes[dxr.rng(numQuotes)]; - } - - return quotes[Rand(numQuotes)]; -} - function bool IsFemale() { #ifdef vmd @@ -260,7 +125,7 @@ function Timer() { Super.Timer(); - if (localURL == "ENDGAME4") { + if (localURL == "ENDGAME4" || localURL == "ENDGAME4REV") { endgameTimer += checkTime; if (!bQuotePrinted && endgameTimer > 15) { @@ -279,12 +144,17 @@ function PrintEndgameQuote(int num) { local int i; local DeusExRootWindow root; - local EndQuote quote; + local EndgameQuoteManager qMgr; + local DXRando dxr; + local string quote, attrib; bQuotePrinted = True; flags.SetBool('EndgameExplosions', False); - LoadQuotes(); + foreach AllActors(class'DXRando',dxr) break; + + qMgr = Spawn(class'EndgameQuoteManager'); + qMgr.LoadQuotes(); root = DeusExRootWindow(Player.rootWindow); if (root != None) @@ -295,10 +165,15 @@ function PrintEndgameQuote(int num) quoteDisplay.displayTime = endgameDelays[num]; quoteDisplay.SetWindowAlignments(HALIGN_Center, VALIGN_Center); - quote = PickRandomQuote(num); + if (dxr.flags.IsReducedRando()){ + quote = endgameQuote[num*2]; + attrib = endgameQuote[num*2 + 1]; + } else { + qMgr.PickRandomQuote(quote, attrib); + } - quoteDisplay.AddMessage(quote.quote); - quoteDisplay.AddMessage(quote.attribution); + quoteDisplay.AddMessage(quote); + quoteDisplay.AddMessage(attrib); quoteDisplay.StartMessage(); } diff --git a/DXRando/DeusEx/Classes/DXRMissionIntro.uc b/DXRando/DeusEx/Classes/DXRMissionIntro.uc index db1cecae2..8441ee4d4 100644 --- a/DXRando/DeusEx/Classes/DXRMissionIntro.uc +++ b/DXRando/DeusEx/Classes/DXRMissionIntro.uc @@ -39,12 +39,21 @@ local DXRando dxr; // After the Intro conversation is over, tell the player to go on // to the next map (which will either be the main menu map or // the first game mission if we're starting a new game. - if (player!=None && flags.GetBool('Intro_Played')) { flags.SetBool('Intro_Played', False,, 1); if( flags.GetInt('Rando_newgameplus_loops') > 0 ) { player.bStartNewGameAfterIntro = true; +#ifdef revision + if (DXRandoGameInfo(Level.Game)!=None){ + //Revision takes your inventory away in DeusExPlayer StartNewGame, + //so steal it and give it to the DXRandoGameInfo for safe keeping + DXRandoGameInfo(Level.Game).stolenInventory=player.Inventory; + DXRandoGameInfo(Level.Game).stolenAugs=player.AugmentationSystem; + player.Inventory=None; + player.AugmentationSystem=None; + } +#endif } player.PostIntro(); } diff --git a/DXRando/DeusEx/Classes/DXRRevMissionEndgame.uc b/DXRando/DeusEx/Classes/DXRRevMissionEndgame.uc new file mode 100644 index 000000000..dcaeab90c --- /dev/null +++ b/DXRando/DeusEx/Classes/DXRRevMissionEndgame.uc @@ -0,0 +1,66 @@ +#ifndef revision +class DXRRevMissionEndgame extends Actor; +#else +class DXRRevMissionEndgame extends RevisionMissionEndgame; + + + +function Timer() +{ + Super.Timer(); + + if (localURL == "ENDGAME4" || localURL == "ENDGAME4REV") { + endgameTimer += checkTime; + + if (!bQuotePrinted && endgameTimer > 15) { + endgameDelays[2]=60.0; + PrintEndgameQuote(2); + } + + if (endgameTimer > 75) { + FinishCinematic(); + } + } +} + +function PrintEndgameQuote(int num) +{ + local int i; + local DeusExRootWindow root; + local EndgameQuoteManager qMgr; + local DXRando dxr; + local string quote, attrib; + + bQuotePrinted = True; + flags.SetBool('EndgameExplosions', False); + + foreach AllActors(class'DXRando',dxr) break; + + qMgr = Spawn(class'EndgameQuoteManager'); + qMgr.LoadQuotes(); + + root = DeusExRootWindow(Player.rootWindow); + if (root != None) + { + quoteDisplay = HUDMissionStartTextDisplay(root.NewChild(Class'HUDMissionStartTextDisplay', True)); + if (quoteDisplay != None) + { + quoteDisplay.displayTime = endgameDelays[num]; + quoteDisplay.SetWindowAlignments(HALIGN_Center, VALIGN_Center); + + if (dxr.flags.IsReducedRando()){ + quote = endgameQuote[num*2]; + attrib = endgameQuote[num*2 + 1]; + } else { + qMgr.PickRandomQuote(quote, attrib); + } + + quoteDisplay.AddMessage(quote); + quoteDisplay.AddMessage(attrib); + + quoteDisplay.StartMessage(); + } + } +} + +#endif diff --git a/DXRando/DeusEx/Classes/DXRRevMissionIntro.uc b/DXRando/DeusEx/Classes/DXRRevMissionIntro.uc new file mode 100644 index 000000000..f1f7e9bf4 --- /dev/null +++ b/DXRando/DeusEx/Classes/DXRRevMissionIntro.uc @@ -0,0 +1,23 @@ +#ifndef revision +class DXRRevMissionIntro extends Actor; +#else +class DXRRevMissionIntro extends RevisionMissionIntro; + +function Timer() +{ + if (flags.GetBool('Intro_Played')) + { + if (flags.GetInt('Rando_newgameplus_loops') > 0 && DXRandoGameInfo(Level.Game)!=None){ //Should always be true, but just to be safe + //Revision takes your inventory away in DeusExPlayer StartNewGame, + //so steal it and give it to the DXRandoGameInfo for safe keeping + DXRandoGameInfo(Level.Game).stolenInventory=player.Inventory; + DXRandoGameInfo(Level.Game).stolenAugs=player.AugmentationSystem; + + player.Inventory=None; + player.AugmentationSystem=None; + } + } + Super.Timer(); +} + +#endif diff --git a/DXRando/DeusEx/Classes/DXRandoCrowdControlEffects.uc b/DXRando/DeusEx/Classes/DXRandoCrowdControlEffects.uc index 5e725c121..ece644c57 100644 --- a/DXRando/DeusEx/Classes/DXRandoCrowdControlEffects.uc +++ b/DXRando/DeusEx/Classes/DXRandoCrowdControlEffects.uc @@ -151,6 +151,10 @@ function PeriodicUpdates() PlayerMessage("The ground thaws"); } + if (isTimerActive('cc_behindTimer')){ + player().bBehindView=True; + player().bCrosshairVisible=False; + } if (decrementTimer('cc_behindTimer')) { player().bBehindView=False; player().bCrosshairVisible = True; @@ -174,7 +178,7 @@ function PeriodicUpdates() if (decrementTimer('cc_invertMouseTimer')) { PlayerMessage("Your mouse controls return to normal"); - player().bInvertMouse = dxr.flagbase.GetBool('cc_InvertMouseDef'); + player().bInvertMouse = bool(datastorage.GetConfigKey('cc_InvertMouseDef')); } if (decrementTimer('cc_invertMovementTimer')) { @@ -396,6 +400,7 @@ function ContinuousUpdates() //Make sure to do that here function InitOnEnter() { local inventory anItem; + datastorage = class'DataStorage'.static.GetObjFromPlayer(self); if (getTimer('cc_MatrixModeTimer') > 0) { StartMatrixMode(); @@ -439,7 +444,7 @@ function InitOnEnter() { } if (isTimerActive('cc_invertMouseTimer')) { - player().bInvertMouse = !dxr.flagbase.GetBool('cc_InvertMouseDef'); + player().bInvertMouse = !bool(datastorage.GetConfigKey('cc_InvertMouseDef')); } if (isTimerActive('cc_invertMovementTimer')) { @@ -466,7 +471,7 @@ function CleanupOnExit() { player().bCrosshairVisible = True; //Make crosshairs show up again SetFloatyPhysics(False); if (isTimerActive('cc_invertMouseTimer')) { - player().bInvertMouse = dxr.flagbase.GetBool('cc_InvertMouseDef'); + player().bInvertMouse = bool(datastorage.GetConfigKey('cc_InvertMouseDef')); } if (isTimerActive('cc_invertMovementTimer')) { @@ -1273,7 +1278,10 @@ function bool swapPlayer(string viewer) { return false; } - ccLink.ccModule.Swap(player(),a); + if (ccLink.ccModule.Swap(player(),a)==false){ + return false; + } + player().ViewRotation = player().Rotation; PlayerMessage(viewer@"thought you would look better if you were where"@a.FamiliarName@"was"); @@ -1766,13 +1774,19 @@ function int doCrowdControlEvent(string code, string param[5], string viewer, in return TempFail; } if (swapPlayer(viewer) == false) { - return Failed; + return TempFail; } break; case "floaty_physics": if (isTimerActive('cc_floatyTimer')) { return TempFail; + } + //Floaty physics can interrupt conversations + //which can result in keys not getting transferred + //or flags not getting set right. Just don't allow it. + if (InConversation()){ + return TempFail; } PlayerMessage(viewer@"made you feel light as a feather"); SetFloatyPhysics(True); @@ -1802,7 +1816,7 @@ function int doCrowdControlEvent(string code, string param[5], string viewer, in return TempFail; } PlayerMessage(viewer@"inverted your mouse!"); - dxr.flagbase.SetBool('cc_InvertMouseDef',player().bInvertMouse); + datastorage.SetConfig('cc_InvertMouseDef',player().bInvertMouse, 3600*12); player().bInvertMouse = !player().bInvertMouse; startNewTimer('cc_invertMouseTimer',duration); diff --git a/DXRando/DeusEx/Classes/DXRandoText.uc b/DXRando/DeusEx/Classes/DXRandoText.uc index 75ecfe776..1ab8c29e4 100644 --- a/DXRando/DeusEx/Classes/DXRandoText.uc +++ b/DXRando/DeusEx/Classes/DXRandoText.uc @@ -10,6 +10,7 @@ class DXRandoText extends object abstract; #exec DEUSEXTEXT IMPORT FILE=Text\MedbotNearby.txt #exec DEUSEXTEXT IMPORT FILE=Text\RepairbotNearby.txt +#exec DEUSEXTEXT IMPORT FILE=Text\AugbotNearby.txt #exec DEUSEXTEXT IMPORT FILE=Text\03_EmailMenu_ajacobson.txt #exec DEUSEXTEXT IMPORT FILE=Text\04_EmailMenu_ajacobson.txt diff --git a/DXRando/DeusEx/Classes/EndgameQuoteManager.uc b/DXRando/DeusEx/Classes/EndgameQuoteManager.uc new file mode 100644 index 000000000..78f883910 --- /dev/null +++ b/DXRando/DeusEx/Classes/EndgameQuoteManager.uc @@ -0,0 +1,200 @@ +class EndgameQuoteManager extends Info transient; + +struct EndQuote +{ + var string quote; + var string attribution; +}; + +var EndQuote quotes[130]; +var int numQuotes; + +//For now, this is limited to the default UnrealScript limit of 256 characters in a string +function AddQuote(string quote, string attribution) +{ + quotes[numQuotes].quote = quote; + quotes[numQuotes].attribution = " -- "$attribution; + numQuotes++; +} + +function LoadQuotes() +{ + //Original Endgame Quotes + //AddQuote("YESTERDAY WE OBEYED KINGS AND BENT OUR NECKS BEFORE EMPERORS. BUT TODAY WE KNEEL ONLY TO TRUTH...","KAHLIL GIBRAN"); + //AddQuote("IF THERE WERE NO GOD, IT WOULD BE NECESSARY TO INVENT HIM.","VOLTAIRE"); + //AddQuote("BETTER TO REIGN IN HELL, THAN SERVE IN HEAVEN.","PARADISE LOST, JOHN MILTON"); + + //DX Quotes + AddQuote("A BOMB!","JC DENTON"); + AddQuote("OH MY GOD! JC! A BOMB!","JOCK"); + AddQuote("I SPILL MY DRINK!","IVAN"); + AddQuote("THANKS FOR GETTING ME IN!","TESSA"); + AddQuote("WHAT A SHAME...","JC DENTON"); + AddQuote("YOU CAN'T FIGHT IDEAS WITH BULLETS.","LEO GOLD"); + AddQuote("WHAT AN EXPENSIVE MISTAKE YOU TURNED OUT TO BE.","WALTON SIMONS"); + AddQuote("JUMP! YOU CAN MAKE IT!","BOB PAGE"); + AddQuote("THE MORE POWER YOU THINK YOU HAVE, THE MORE QUICKLY IT SLIPS FROM YOUR GRASP.","TRACER TONG"); + AddQuote("I NEVER HAD TIME TO TAKE THE OATH OF SERVICE TO THE COALITION. HOW ABOUT THIS ONE? I SWEAR NOT TO REST UNTIL UNATCO IS FREE OF YOU AND THE OTHER CROOKED BUREAUCRATS WHO HAVE PERVERTED ITS MISSION.","JC DENTON"); + AddQuote("WE ARE THE INVISIBLE HAND. WE ARE THE ILLUMINATI. WE COME BEFORE AND AFTER. WE ARE FOREVER. AND EVENTUALLY... EVENTUALLY WE WILL LEAD THEM INTO THE DAY.","MORGAN EVERETT"); + AddQuote("THE NEED TO BE OBSERVED AND UNDERSTOOD WAS ONCE SATISFIED BY GOD. NOW WE CAN IMPLEMENT THE SAME FUNCTIONALITY WITH DATA-MINING ALGORITHMS.","MORPHEUS"); + AddQuote("I ORDER YOU TO STAND IN THE SPOTLIGHT AND GROWL AT THE WOMEN LIKE A DOG WHO NEEDS A MASTER.","DOOR GIRL"); + AddQuote("I WANTED ORANGE. IT GAVE ME LEMON-LIME.","GUNTHER HERMANN"); + AddQuote("THE SUB-BAY DOORS ARE CLOSED. YOU NEED TO OPEN THEM.","GARY SAVAGE"); + + //Why not some Zero Wing? + AddQuote("SOMEBODY SET UP US THE BOMB.","MECHANIC"); + AddQuote("ALL YOUR BASE ARE BELONG TO US.","CATS"); + AddQuote("YOU HAVE NO CHANCE TO SURVIVE MAKE YOUR TIME.","CATS"); + + //A bit of Zelda perhaps? + AddQuote("AND THE MASTER SWORD SLEEPS AGAIN... FOREVER!","A LINK TO THE PAST"); + AddQuote("IT'S A SECRET TO EVERYBODY","MOBLIN"); + AddQuote("AH, THE SCROLL OF SHURMAK, BEARER OF SAD NEWS THESE MANY YEARS AGO.","GASPRA"); + AddQuote("SHADOW AND LIGHT ARE TWO SIDES OF THE SAME COIN, ONE CANNOT EXIST WITHOUT THE OTHER.","PRINCESS ZELDA"); + AddQuote("A SWORD WIELDS NO STRENGTH UNLESS THE HAND THAT HOLDS IT HAS COURAGE","THE HERO'S SHADE"); + AddQuote("THE WIND... IT IS BLOWING...","GANONDORF"); + AddQuote("DO NOT THINK IT ENDS HERE... THE HISTORY OF LIGHT AND SHADOW WILL BE WRITTEN IN BLOOD!","GANONDORF"); + AddQuote("YOUR COURAGE AND STRENGTH WILL NOT BE FORGOTTEN. FOR NOW, YOUR WORK IS DONE. OFF YOU GO TO CELEBRATE LINK'S RETURN. BUT FIRST, REMEMBER, LESSONS OF THE HEART, MERCY, AND HUMAN KINDNESS PREVAIL ABOVE ALL ELSE.","GASPRA"); + AddQuote("LAMP OIL? ROPE? BOMBS? YOU WANT IT? IT'S YOURS MY FRIEND, AS LONG AS YOU HAVE ENOUGH RUBIES!","MORSHU"); + AddQuote("TINGLE, TINGLE! KOOLOO-LIMPAH! ...THESE ARE THE MAGIC WORDS THAT TINGLE CREATED HIMSELF. DON'T STEAL THEM!","TINGLE"); + AddQuote("PAY NO ATTENTION TO THE AVERAGE MIDDLE-AGED MAN STANDING BY THIS SIGN. LEAVE HIM ALONE!","SIGN"); + AddQuote("I'M KIKI THE MONKEY KI KI! I LOVE RUPEES MORE THAN ANYTHING. CAN YOU SPARE ME 10 RUPEES?","KIKI THE MONKEY"); + + //Some Plumber Talk + AddQuote("THANK YOU MARIO! BUT OUR PRINCESS IS IN ANOTHER CASTLE!","TOAD"); + AddQuote("THANK YOU SO MUCH FOR PLAYING MY GAME!","MARIO"); + AddQuote("DEAR PESKY PLUMBERS, THE KOOPALINGS AND I HAVE TAKEN OVER THE MUSHROOM KINGDOM! THE PRINCESS IS NOW A PERMANENT GUEST AT ONE OF MY SEVEN KOOPA HOTELS. I DARE YOU TO FIND HER IF YOU CAN!","BOWSER"); + + //A bit of this and that + AddQuote("UNFORTUNATELY, KLLING IS ONE OF THOSE THINGS THAT GETS EASIER THE MORE YOU DO IT.","SOLID SNAKE"); + AddQuote("WHAT IS A MAN? A MISERABLE LITTLE PILE OF SECRETS!","DRACULA"); + AddQuote("THE RIGHT MAN IN THE WRONG PLACE CAN MAKE ALL THE DIFFERENCE IN THE WORLD","G-MAN"); + AddQuote("HACK THE PLANET!","HACKERS"); + AddQuote("I NEVER ASKED FOR THIS","ADAM JENSEN"); + AddQuote("BRING ME A BUCKET, AND I'LL SHOW YOU A BUCKET!","PSYCHO"); + AddQuote("DO A BARREL ROLL!","PEPPY HARE"); + AddQuote("WAR. WAR NEVER CHANGES.","RON PERLMAN"); + AddQuote("PRAISE THE SUN!","SOLAIRE OF ASTORA"); + AddQuote("STUPID BANJO AND DUMB KAZOOIE. I'LL BE BACK IN BANJO-TOOIE!","GRUNTILDA"); + AddQuote("IF HISTORY IS TO CHANGE, LET IT CHANGE. IF THE WORLD IS TO BE DESTROYED, SO BE IT. IF MY FATE IS TO DIE, I MUST SIMPLY LAUGH","MAGUS"); + AddQuote("DO NOT HATE HUMANS. IF YOU CANNOT LIVE WITH THEM, THEN AT LEAST DO THEM NO HARM, FOR THEIRS IS ALREADY A HARD LOT","LISA"); + AddQuote("UH, BOYS? HOW ABOUT THAT EVAC? COMMANDER? JIM? WHAT THE HELL IS GOING ON UP THERE??","SARAH KERRIGAN"); + AddQuote("LOOK AT YOU, HACKER: A PATHETIC CREATURE OF MEAT AND BONE, PANTING AND SWEATING AS YOU RUN THROUGH MY CORRIDORS. HOW CAN YOU CHALLENGE A PERFECT, IMMORTAL MACHINE?","SHODAN"); + AddQuote("NANOMACHINES, SON.","SENATOR ARMSTRONG"); + AddQuote("THIS WAS A TRIUMPH. I'M MAKING A NOTE HERE: HUGE SUCCESS","GLADOS"); + AddQuote("NEVER GONNA GIVE YOU UP, NEVER GONNA LET YOU DOWN. NEVER GONNA RUN AROUND AND DESERT YOU. NEVER GONNA MAKE YOU CRY. NEVER GONNA SAY GOODBYE. NEVER GONNA TELL A LIE AND HURT YOU","RICK ASTLEY"); + AddQuote("IF THE ZOO BANS ME FOR HOLLERING AT THE ANIMALS I WILL FACE GOD AND WALK BACKWARDS INTO HELL","DRIL"); + AddQuote("NANITES! COURTESY OF RAY PALMER!", "OLIVER QUEEN"); + AddQuote("SAY 'FUZZY PICKLES!'","PHOTOGRAPHER"); //Earthbound + AddQuote("SPANKETY SPANKETY SPANKETY!","POKEY");//Earthbound + AddQuote("I KNOW WHAT YOU'RE THINKING... ALL THIS POWER, AND LOOKS TOO!","BOWSER"); //Super Mario RPG + AddQuote("I USED TO BE AN ADVENTURER LIKE YOU. THEN I TOOK AN ARROW IN THE KNEE...","WHITERUN GUARD"); //Skyrim + AddQuote("THAT WAS TOO CLOSE... YOU WERE ALMOST A JILL SANDWICH","BARRY BURTON"); //Resident Evil + AddQuote("YOU HAVE DIED OF DYSENTERY","THE OREGON TRAIL"); + AddQuote("LEEEEROOOYYYYYYYYY JEEEENNNKKKIIINNNNNNSSSSS","LEEROY JENKINS"); + AddQuote("A WINNER IS YOU","PRO WRESTLING"); //Pro Wrestling for NES + AddQuote("ALL WE HAD TO DO, WAS FOLLOW THE DAMN TRAIN, CJ","BIG SMOKE"); //GTA San Andreas + AddQuote("WE BROKE IT. YES, WE WERE NAUGHTY. COMPLETELY NAUGHTY. SO, SO VERY SORRY. BUT JUST BETWEEN YOU AND US, IT FELT QUITE GOOD","THE KING OF ALL COSMOS"); //Katamari + AddQuote("IT IS NOT YOUR FAULT. IT IS OUR FAULT FOR BELIEVING IN YOU.","THE KING OF ALL COSMOS"); //Katamari + AddQuote("MY BODY IS READY","REGGIE FILS-AIME"); + AddQuote("I'VE SEEN THINGS YOU PEOPLE WOULDN'T BELIEVE... ATTACK SHIPS ON FIRE OFF THE SHOULDER OF ORION... I WATCHED C-BEAMS GLITTER IN THE DARK NEAR THE TANNHAUSER GATE. ALL THOSE MOMENTS WILL BE LOST IN TIME, LIKE TEARS IN RAIN... TIME TO DIE.","ROY BATTY"); //Bladerunner + AddQuote("ENOUGH! OPEN UP YOUR EYES AND LOOK AT THE BIG PICTURE; YOU'RE ALL PUPPETS OF CORRUPT POLITICIANS AND CAPITALISTS. DON'T YOU UNDERSTAND, IT'S UTTERLY POINTLESS TO FIGHT EACH OTHER.","COLONEL SHIKISHIMA"); //Akira + AddQuote("THE LAST METROID IS IN CAPTIVITY. THE GALAXY IS AT PEACE…","SUPER METROID"); + AddQuote("YOU ARE FACED WITH OVERWHELMING POWER. ACCEPT YOUR HELPLESSNESS.","RAVEN BEAK"); + + //T7G / T11H Quotes... trying to avoid spoilers... + AddQuote("OLD MAN STAUF BUILT A HOUSE AND FILLED IT WITH HIS TOYS", "HENRY STAUF"); + AddQuote("MY, ISN'T THIS A CHEERY PLACE?", "MARTINE BURDEN"); + AddQuote("AT LEAST HE LEFT HIS *REGRETS*", "HAMILTON TEMPLE"); + AddQuote("YOU ARE A GLUTTON FOR PUNISHMENT", "HENRY STAUF"); + AddQuote("WANT A BALLOON, SONNY?", "CLOWN"); + AddQuote("FEELING LONELY?", "HENRY STAUF"); + AddQuote("ARRRRRR! DON'T THINK YOU'LL BE SO LUCKY NEXT TIME.", "HENRY STAUF"); + AddQuote("OH, I'M DYING TO SEE WHAT YOU DO NEXT...", "HENRY STAUF"); + AddQuote("SO... YOU LIVE TO PLAY ANOTHER DAY... .", "HENRY STAUF"); + AddQuote("HENRY STAUF GREW WEALTHY, BUT THEN THIS STRANGE VIRUS CAME...", "THE 7TH GUEST NARRATOR"); + AddQuote("I THINK THAT WE WERE MEANT TO EAT THE SOUP.", "EDWARD KNOX"); + AddQuote("CHUCK HIM INTO THE SOUP", "SOUP"); + AddQuote("YEAH, IT'S BLOOD.", "CHIEF JIM MARTIN"); + + //Final Fantasy 4 + AddQuote("YOU SPOONY BARD!","TELLAH"); + AddQuote("I WILL NEVER DIE...AS LONG AS THERE IS DARKNESS IN THE HEARTS OF MEN!","ZEROMUS"); + AddQuote("I RESPECT MEN LIKE YOU. MEN WITH COURAGE. BUT YOU ARE A SLAVE TO YOUR EMOTIONS, AND SO, WILL NEVER KNOW TRUE STRENGTH. SUCH IS THE CURSE OF MEN.","RUBICANTE"); + AddQuote("HA HA HA! THAT IS ALL THE POWER YOU POSSESS? A PITY. YOUR EYES SHOULD STILL BE FREE. OPEN THEM, AND GAZE UPON TRUE TERROR!","GOLBEZ"); + + //Final Fantasy 6 + AddQuote("LIFE... DREAMS... HOPE... WHERE DO THEY COME FROM? AND WHERE DO THEY GO...? SUCH MEANINGLESS THINGS... I'LL DESTROY THEM ALL!","KEFKA PALAZZO"); + AddQuote("UWEE HEE HEE! DON'T TEASE THE OCTOPUS, KIDS!","ULTROS"); + AddQuote("MY LIFE IS A CHIP IN YOUR PILE. ANTE UP!","SETZER GABBIANI"); + AddQuote("WHAT FUN IS DESTRUCTION IF NO PRECIOUS LIVES ARE LOST?","KEFKA PALAZZO"); + AddQuote("SON OF A SUBMARINER! THEY'LL PAY FOR THIS...","KEFKA PALAZZO"); + AddQuote("THE END COMES... BEYOND CHAOS","KEFKA PALAZZO"); + AddQuote("I AM A TREASURE HUNTER, NOT A THIEF!","LOCKE COLE"); + AddQuote("IF IT'S HEADS, YOU WIN..... WE'LL CHOOSE WHATEVER PATH WE WANT, WITHOUT ANY REGRETS....","EDGAR RONI FIGARO"); + AddQuote("YOU THINK A MINOR THING LIKE THE END OF THE WORLD WAS GONNA DO ME IN?","SABIN RENE FIGARO"); + AddQuote("YOU JUST HAVE TO SHOW TECHNOLOGY WHO'S BOSS!","CYAN GARAMONDE"); + AddQuote("ALL OF YOU HAVE THAT SPARKLE IN YOUR EYES… WELL, THIS OLD MAN'S NOT GIVING UP, EITHER!","STRAGO MAGUS"); + + //Final Fantasy 7 + AddQuote("I'VE BEEN HERE SINCE THE BEGINNING AND I STILL DON'T KNOW WHAT THE HELL'S GOIN' ON!","BARRET WALLACE"); + AddQuote("OUT OF MY WAY. I'M GOING TO SEE MY MOTHER.","SEPHIROTH"); + AddQuote("WHAT MAY BE A FEW TO YOU WAS EVERYTHING TO THOSE WHO DIED...","CAIT SITH"); + + //Vampire: The Masquerade - Bloodlines + AddQuote("DON'T OPEN IT","A FRIEND"); + AddQuote("EVERY TIME I YANK A JAWBONE FROM A SKULL AND RAM IT INTO AN EYESOCKET, I KNOW I'M BUILDING A BETTER FUTURE","SMILING JACK"); + AddQuote("DO I POGO STICK THROUGH YOUR MIND WEARING NOTHING BUT A SMILE?","JEANETTE"); + AddQuote("BY THE CLACK-SMACK CRACKING OF MY THUMBS, SOMETHING WICKED THIS WAY COMES","GARY GOLDEN"); + AddQuote("KEEP YOUR FRIENDS CLOSE AND YOUR ENEMIES IN A BARBECUE PIT","NINES RODRIGUEZ"); + AddQuote("IT'S NOT THAT I DON'T LOVE WALKING INTO THE HEART OF DANGER TO CURRY FAVOR WITH THE LOCAL MAGISTRATE OF THE HOUR, BUT... ACTUALLY, THAT'S EXACTLY IT","BECKETT"); + AddQuote("INDIVIDUALISM IS A PATH FRAUGHT WITH OBSTACLES, AND SOMETIMES ANGRY MOBS, BUT FOR ALL ITS HARDSHIPS IT IS THE ONLY ONE WORTH TAKING","BECKETT"); + AddQuote("EACH MINOR PROBLEM LIKE A GRAIN OF SAND, EACH NIGHT I INHERIT THE DESERT","SEBASTIAN LACROIX"); + AddQuote("A TRUE MASTER HAS PLAYED THE ENTIRE GAME BEFORE THE FIRST MOVE","A FRIEND"); + AddQuote("WHETHER OR NOT YOU WIN THE GAME, MATTERS NOT. IT'S IF YOU BOUGHT IT.","ROSA"); + AddQuote("BEWARE THE PROTECTION OF WOLVES","SMILING JACK"); + + //Max Payne + AddQuote("THEY WERE ALL DEAD. THE FINAL GUNSHOT WAS AN EXCLAMATION MARK TO EVERYTHING THAT HAD LED TO THIS POINT. I RELEASED MY FINGER FROM THE TRIGGER. AND THEN IT WAS OVER.","MAX PAYNE"); + AddQuote("I DON'T KNOW ABOUT ANGELS, BUT IT'S FEAR THAT GIVES MEN WINGS.","MAX PAYNE"); + AddQuote("I WAS IN A GRAPHIC NOVEL. FUNNY AS HELL, IT WAS THE MOST HORRIBLE THING I COULD THINK OF.","MAX PAYNE"); + AddQuote("THROW THE RULES OUT THE WINDOW, ODDS ARE YOU'LL GO THAT WAY TOO.","MAX PAYNE"); + + //Resident Evil 4 + AddQuote("PFFT...WHERE'S EVERYONE GOING? BINGO?","LEON KENNEDY"); + AddQuote("HEY, IT'S THAT DOG.","LEON KENNEDY"); + AddQuote("YOU MAY BE ABLE TO PROLONG YOUR LIFE, BUT IT'S NOT LIKE YOU CAN ESCAPE YOUR INEVITABLE DEATH, IS IT?","JACK KRAUSER"); + + //Barkley Shut Up and Jam: Gaiden + AddQuote("IF YOU CAN'T SLAM WITH THE BEST, THEN JAM WITH THE REST.","CHARLES BARKLEY"); + AddQuote("I BELIEVE GHOSTS ARE LIKE DOGS AND THEY JUST SORT OF DO THINGS ARBITRARILY.","CHARLES BARKLEY"); + AddQuote("THE YEAR IS 2053. BASKETBALL IS DEAD.","CHARLES BARKLEY"); + //AddQuote("JORDAN, YOU MOTHERFUCKING BAKA, YOU SICK MOTHERFUCKING GODDAMN BAKA!","CHARLES BARKLEY"); //Swearing? + AddQuote("CHAOS DUUUUUUUUUUUUNNK!","CHARLES BARKLEY"); + AddQuote("THERE ARE TWO THINGS A DUERGAR CAN'T RESIST, BARKLEY. ONE IS RUBIES. THE OTHER IS A DUNKAROO.","CYBERDWARF"); + AddQuote("THE PORTAL IS CLOSING. THIS IS THE LAST WE'LL SEE OF THE B-BALL DIMENSION FOR A LONG TIME…","CYBERDWARF"); + AddQuote("I CONTROL THE POWERS OF SHIMMERGLOBE, B-BALL OF THE ANCIENT PROTO-DWARFS AND THE HELL B-BALL, FORGED ON THE ANVIL OF JAMICITE. I NOW HAVE THE POWER TO SHOOT A THREE POINTER FROM 30 YARDS AWAY.","CHARLES BARKLEY"); + 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"); + + log("EndgameQuoteManager loaded "$numQuotes$" endgame quotes"); +} + +function PickRandomQuote(out string quote, out string attrib) +{ + local DXRando dxr; + local EndQuote q; + + foreach AllActors(class'DXRando',dxr) break; + + if(dxr != None) { + q = quotes[dxr.rng(numQuotes)]; + quote = q.quote; + attrib = q.attribution; + return; + } + + q = quotes[Rand(numQuotes)]; + quote = q.quote; + attrib = q.attribution; +} diff --git a/DXRando/DeusEx/Classes/Image09_NYC_Ship_Bottom.uc b/DXRando/DeusEx/Classes/Image09_NYC_Ship_Bottom.uc index 93cded1e1..8215bcf9d 100644 --- a/DXRando/DeusEx/Classes/Image09_NYC_Ship_Bottom.uc +++ b/DXRando/DeusEx/Classes/Image09_NYC_Ship_Bottom.uc @@ -4,6 +4,20 @@ class DXRImage09_NYC_Ship_Bottom injects Image09_NYC_Ship_Bottom; +function PostPostBeginPlay() +{ + local DXRando dxr; + + foreach AllActors(class'DXRando',dxr) break; + + if (dxr==None || dxr.flags.settings.goals == 0){ + imageTextures[0]=Texture'DeusExUI.UserInterface.Image09_NYC_Ship_Bttm_1'; + imageTextures[1]=Texture'DeusExUI.UserInterface.Image09_NYC_Ship_Bttm_2'; + imageTextures[2]=Texture'DeusExUI.UserInterface.Image09_NYC_Ship_Bttm_3'; + imageTextures[3]=Texture'DeusExUI.UserInterface.Image09_NYC_Ship_Bttm_4'; + } +} + defaultproperties { imageTextures(0)=Texture'#var(package).DXRandoImages.Image09_NYC_Ship_Bttm_1' diff --git a/DXRando/DeusEx/Classes/InformationDevices.uc b/DXRando/DeusEx/Classes/InformationDevices.uc index 323508d71..c4d01bff3 100644 --- a/DXRando/DeusEx/Classes/InformationDevices.uc +++ b/DXRando/DeusEx/Classes/InformationDevices.uc @@ -196,7 +196,7 @@ function CreateInfoWindow() winText.SetText(vaultString); if (bAddToVault) { - mapname = GetMapNameStripped(); + mapname = class'DXRMapVariants'.static.CleanupMapName(GetMapNameStripped()); plaintextTag = rootWindow.StringToName(mapname$"-"$ Crc()); log(Self$": plaintextTag: "$plaintextTag); MarkTextRead(plaintextTag); diff --git a/DXRando/DeusEx/Classes/PayPhone.uc b/DXRando/DeusEx/Classes/PayPhone.uc index 7ecdbeb40..50ad0f161 100644 --- a/DXRando/DeusEx/Classes/PayPhone.uc +++ b/DXRando/DeusEx/Classes/PayPhone.uc @@ -3,6 +3,7 @@ class PayPhone extends #var(prefix)Phone; defaultproperties { Mesh=None + DrawType=DT_None CollisionRadius=6 CollisionHeight=12 Physics=PHYS_None diff --git a/DXRando/DeusEx/Classes/TrashCan1.uc b/DXRando/DeusEx/Classes/TrashCan1.uc new file mode 100644 index 000000000..a9ba9898d --- /dev/null +++ b/DXRando/DeusEx/Classes/TrashCan1.uc @@ -0,0 +1,12 @@ +class DXRTrashCan1 injects #var(prefix)TrashCan1; + +defaultproperties +{ + bGenerateTrash=False +} + +function Destroyed() +{ + class'TrashCanCommon'.static.DestroyTrashCan(self, class'#var(prefix)TrashBag'); + Super.Destroyed(); +} diff --git a/DXRando/DeusEx/Classes/TrashCan2.uc b/DXRando/DeusEx/Classes/TrashCan2.uc new file mode 100644 index 000000000..1c46b501a --- /dev/null +++ b/DXRando/DeusEx/Classes/TrashCan2.uc @@ -0,0 +1,12 @@ +class DXRTrashCan2 injects #var(prefix)Trashcan2; + +defaultproperties +{ + bGenerateTrash=False +} + +function Destroyed() +{ + class'TrashCanCommon'.static.DestroyTrashCan(self, class'#var(prefix)TrashBag2'); + Super.Destroyed(); +} diff --git a/DXRando/DeusEx/Classes/TrashCan3.uc b/DXRando/DeusEx/Classes/TrashCan3.uc new file mode 100644 index 000000000..3e683a4f9 --- /dev/null +++ b/DXRando/DeusEx/Classes/TrashCan3.uc @@ -0,0 +1,12 @@ +class DXRTrashCan3 injects #var(prefix)TrashCan3; + +defaultproperties +{ + bGenerateTrash=False +} + +function Destroyed() +{ + class'TrashCanCommon'.static.DestroyTrashCan(self, class'#var(prefix)TrashBag'); + Super.Destroyed(); +} diff --git a/DXRando/DeusEx/Classes/TrashCan4.uc b/DXRando/DeusEx/Classes/TrashCan4.uc new file mode 100644 index 000000000..1345c2140 --- /dev/null +++ b/DXRando/DeusEx/Classes/TrashCan4.uc @@ -0,0 +1,12 @@ +class DXRTrashCan4 injects #var(prefix)TrashCan4; + +defaultproperties +{ + bGenerateTrash=False +} + +function Destroyed() +{ + class'TrashCanCommon'.static.DestroyTrashCan(self, class'#var(prefix)TrashBag'); + Super.Destroyed(); +} diff --git a/DXRando/DeusEx/Classes/TrashCanCommon.uc b/DXRando/DeusEx/Classes/TrashCanCommon.uc new file mode 100644 index 000000000..d1df8bf50 --- /dev/null +++ b/DXRando/DeusEx/Classes/TrashCanCommon.uc @@ -0,0 +1,92 @@ +class TrashCanCommon extends DXRBase abstract; + +static function DestroyTrashCan(#var(prefix)Containers trashcan, class<#var(prefix)Containers> trashBagType) +{ + local Vector loc; + local #var(prefix)Rat vermin; + local #var(prefix)Containers trashbag; + local float scale, scaleCorrection; + + // maybe spawn a trashbag + if (FRand() < 0.8) + { + // less likely maybe spawn some trashpaper (50% chance of at least one) + GenerateTrashPaper(trashcan, 0.16); + + loc = trashcan.Location; + trashbag = trashcan.Spawn(trashBagType,,, loc); + + if (trashbag != None) + { + scale = 1.0; + // trashbags that are too big look weird when dropped, but ones whose + // default radius is smaller are fine, at least with vanilla ratios + if (trashbag.default.CollisionRadius > trashcan.default.CollisionRadius) + { + // get the proportional difference in their default radii + scaleCorrection = 1.0 - (trashcan.default.CollisionRadius / trashbag.default.CollisionRadius); + // square the difference so that larger differences have a reatively larger effect, then reduce it a bit + scaleCorrection = 0.875 * scaleCorrection * scaleCorrection; + // subtract the reduced difference from the starting scale + scale -= scaleCorrection; + } + // scale the trashbag scale by how much the trashcan has been scaled + scale *= trashcan.CollisionRadius / trashcan.default.CollisionRadius; + + // scale the trashbag by the final scale value + trashbag.SetCollisionSize(trashbag.CollisionRadius * scale, trashbag.CollisionHeight * scale); + trashbag.drawScale *= scale; + } + } + else + { + // more likely maybe spawn some trashpaper (94% chance of at least one) + GenerateTrashPaper(trashcan, 0.5); + + // maybe spawn a rat, but not if underwater + if (!trashcan.Region.Zone.bWaterZone && FRand() < 0.17) // creates a final 50% chance of getting a rat + { + loc = trashcan.Location; + loc.Z -= trashcan.CollisionHeight; + vermin = trashcan.Spawn(class'#var(prefix)Rat',,, loc); + if (vermin != None) + vermin.bTransient = true; + } + } +} + +static function GenerateTrashPaper(#var(prefix)Containers trashcan, float probability) +{ + local Vector loc; + local int i; + local #var(prefix)TrashPaper trashPaper; + + // trace down to see if we are sitting on the ground + loc = vect(0,0,0); + loc.Z -= trashcan.CollisionHeight + 8.0; + loc += trashcan.Location; + + // only generate trashpaper if we're on the ground + if (!trashcan.FastTrace(loc)) + { + for (i=0; i<4; i++) + { + if (FRand() < probability) + { + loc = trashcan.Location; + loc.X += (trashcan.CollisionRadius / 2) - FRand() * trashcan.CollisionRadius; + loc.Y += (trashcan.CollisionRadius / 2) - FRand() * trashcan.CollisionRadius; + loc.Z += (trashcan.CollisionHeight / 2) - FRand() * trashcan.CollisionHeight; + trashPaper = trashcan.Spawn(class'#var(prefix)TrashPaper',,, loc); + if (trashPaper != None) + { + trashPaper.SetPhysics(PHYS_Rolling); + trashPaper.rot = RotRand(True); + trashPaper.rot.Yaw = 0; + trashPaper.dir = VRand() * 20 + vect(20,20,0); + trashPaper.dir.Z = 0; + } + } + } + } +} diff --git a/DXRando/DeusEx/Text/AugbotNearby.txt b/DXRando/DeusEx/Text/AugbotNearby.txt new file mode 100644 index 000000000..9bc6c0763 --- /dev/null +++ b/DXRando/DeusEx/Text/AugbotNearby.txt @@ -0,0 +1,3 @@ +

Fed-UPS Augmentation Bot Delivery +

+

Your Augmentation Bot has been delivered to a safe place nearby. Thanks for using Fed-UPS, and we hope that you can find your delivery! diff --git a/DXRando/DeusEx/Textures/Image09_NYC_Ship_Bttm_1.pcx b/DXRando/DeusEx/Textures/Image09_NYC_Ship_Bttm_1.pcx index 003d67c85..3f8ef58e2 100644 Binary files a/DXRando/DeusEx/Textures/Image09_NYC_Ship_Bttm_1.pcx and b/DXRando/DeusEx/Textures/Image09_NYC_Ship_Bttm_1.pcx differ diff --git a/DXRando/DeusEx/Textures/Image09_NYC_Ship_Bttm_2.pcx b/DXRando/DeusEx/Textures/Image09_NYC_Ship_Bttm_2.pcx index b3e47ae4a..090e64c80 100644 Binary files a/DXRando/DeusEx/Textures/Image09_NYC_Ship_Bttm_2.pcx and b/DXRando/DeusEx/Textures/Image09_NYC_Ship_Bttm_2.pcx differ diff --git a/DXRando/DeusEx/Textures/Image09_NYC_Ship_Bttm_3.pcx b/DXRando/DeusEx/Textures/Image09_NYC_Ship_Bttm_3.pcx index cba718182..2358460f1 100644 Binary files a/DXRando/DeusEx/Textures/Image09_NYC_Ship_Bttm_3.pcx and b/DXRando/DeusEx/Textures/Image09_NYC_Ship_Bttm_3.pcx differ diff --git a/DXRando/DeusEx/Textures/Image09_NYC_Ship_Bttm_4.pcx b/DXRando/DeusEx/Textures/Image09_NYC_Ship_Bttm_4.pcx index b876bbfc1..1e0b37ebb 100644 Binary files a/DXRando/DeusEx/Textures/Image09_NYC_Ship_Bttm_4.pcx and b/DXRando/DeusEx/Textures/Image09_NYC_Ship_Bttm_4.pcx differ diff --git a/DeusEx.u b/DeusEx.u index 6a533e91e..d2ed953b3 100644 Binary files a/DeusEx.u and b/DeusEx.u differ diff --git a/GMDXRandomizer.u b/GMDXRandomizer.u index 52b2e2c80..c50268ca6 100644 Binary files a/GMDXRandomizer.u and b/GMDXRandomizer.u differ diff --git a/GUI/DeusEx/Classes/DXRPersonaImageGoalHintWindow.uc b/GUI/DeusEx/Classes/DXRPersonaImageGoalHintWindow.uc new file mode 100644 index 000000000..c4c9e101e --- /dev/null +++ b/GUI/DeusEx/Classes/DXRPersonaImageGoalHintWindow.uc @@ -0,0 +1,30 @@ +class DXRPersonaImageGoalHintWindow expands PersonaImageNoteWindow; + +//You clicked on the window! +event bool MouseButtonPressed(float pointX, float pointY, EInputKey button, + int numClicks) +{ + local BingoHintMsgBox msgbox; + local DXRDataVaultMapImageNote note; + + note = DXRDataVaultMapImageNote(GetNote()); + + if (note==None){ + return false; + } + + msgbox = BingoHintMsgBox(DeusExRootWindow(player.rootWindow).PushWindow(class'BingoHintMsgBox',False)); + msgbox.SetTitle(note.HelpTitle); + msgbox.SetMessageText(note.HelpText); + msgbox.SetNotifyWindow(Self); + + return true; +} + +event bool BoxOptionSelected(Window msgBoxWindow, int buttonNumber) +{ + // Destroy the msgbox! + DeusExRootWindow(player.rootWindow).PopWindow(); + + return True; +} \ No newline at end of file diff --git a/GUI/DeusEx/Classes/FrobDisplayWindow.uc b/GUI/DeusEx/Classes/FrobDisplayWindow.uc index b9e463d3c..70745ae4e 100644 --- a/GUI/DeusEx/Classes/FrobDisplayWindow.uc +++ b/GUI/DeusEx/Classes/FrobDisplayWindow.uc @@ -3,11 +3,13 @@ class DXRFrobDisplayWindow injects FrobDisplayWindow; var localized string msgDamageThreshold; var localized string msgShot; var localized string msgShots; +var localized string msgHitPoints; var transient bool inited; var transient bool auto_codes; var transient bool known_codes; var transient bool show_keys; +var transient bool auto_weapon_mods; function DrawWindow(GC gc) { @@ -26,10 +28,11 @@ function DrawWindow(GC gc) if( frobTarget != None ) DrawWindowBase(gc, frobTarget); } -function CheckAutofillSettings() +function CheckSettings() { local int codes_mode; - local DXRFlags flags; + local DXRando dxr; + if( player == None || player.FlagBase == None ) return; inited = true; @@ -46,19 +49,24 @@ function CheckAutofillSettings() } show_keys = bool(player.ConsoleCommand("get #var(package).MenuChoice_ShowKeys enabled")); + + foreach player.AllActors(class'DXRando',dxr){break;} + if (dxr==None) return; + + auto_weapon_mods = !dxr.flags.IsZeroRando() && bool(player.ConsoleCommand("get #var(package).MenuChoice_AutoWeaponMods enabled")); } function InitFlags() { if( inited ) return; - CheckAutofillSettings(); + CheckSettings(); } //MenuChoice_PasswordAutofill sends out a ChangeStyle message when adjusted event StyleChanged() { Super.StyleChanged(); - CheckAutofillSettings(); + CheckSettings(); } static function GetActorBoundingBox(actor frobTarget, out vector centerLoc, out vector radius) @@ -209,8 +217,8 @@ function DrawWindowBase(GC gc, actor frobTarget) if( ActorHasBars(frobTarget) ) infoW += barLength + 2; infoH += 8; - infoX = FClamp(infoX, infoW/2+10, width-10-infoW/2); - infoY = FClamp(infoY, infoH/2+10, height-10-infoH/2); + infoX = width / 2; + infoY = height / 2; // draw a dark background gc.SetStyle(DSTY_Modulated); @@ -261,6 +269,73 @@ function bool KeyAcquired(Mover m) return False; } +function int CalcDecoDamage(int iDamage, name damageType, #var(DeusExPrefix)Decoration deco) +{ + if (iDamage < deco.minDamageThreshold) return 0; + + if ((DamageType == 'TearGas') || (DamageType == 'PoisonGas') || (DamageType == 'Radiation')) + return 0; + + if ((DamageType == 'EMP') || (DamageType == 'NanoVirus') || (DamageType == 'Shocked')) + return 0; + + if (DamageType == 'HalonGas') + return 0; + + if ((DamageType == 'Burned') || (DamageType == 'Flamed')) + { + if (deco.bExplosive) // blow up if we are hit by fire + return 99999; + } + + return iDamage; +} + +function string DXDecoStrInfo(#var(DeusExPrefix)Decoration deco, out int numLines) +{ + local string strInfo; + local float damage; + local int numShots; +#ifdef vanilla + local DXRWeapon w; +#endif + + if (deco.bInvincible || deco.bStatic){ + //Mostly just annoying showing infinite on everything + //strInfo = strInfo $ CR() $ msgHitPoints @ msgInf; + //numLines++; + return strInfo; + } else { + strInfo = strInfo $ CR() $ msgDamageThreshold @ deco.minDamageThreshold; + numLines++; + strInfo = strInfo $ CR() $ msgHitPoints @ deco.HitPoints; + numLines++; + +#ifdef vanilla + w = DXRWeapon(player.inHand); + if( w != None ) { + damage = CalcDecoDamage(w.GetDamage(), w.WeaponDamageType() ,deco)* float(w.GetNumHits()); + if( damage > 0 ) { + numshots = deco.HitPoints/damage; + if (deco.HitPoints % damage != 0){ + numshots++; + } + + if( numshots == 1 ) + strInfo = strInfo $ " (" $ numshots @ msgShot $ ")"; + else + strInfo = strInfo $ " (" $ numshots @ msgShots $ ")"; + } else { + strInfo = strInfo $ " (" $ msgInf @ msgShots $ ")"; + } + } +#endif + } + + return strInfo; + +} + function string MoverStrInfo(Mover m, out int numLines) { local string strInfo; @@ -377,6 +452,10 @@ function string DeviceStrInfo(HackableDevices device, out int numLines) strInfo = strInfo $ CR() $ "Unknown Code"; } +#ifndef hx + strInfo = strInfo $ DXDecoStrInfo(device,numLines); +#endif + return strInfo; } @@ -413,6 +492,19 @@ function string ComputersStrInfo(#var(prefix)ElectronicDevices d, out int numLin return strInfo; } +function bool WeaponModAutoApply(WeaponMod wm) +{ + if (wm==None) return False; + if (player.InHand==None) return False; + if (player.InHand.IsA('DeusExWeapon')==False) return False; + if (wm.CanUpgradeWeapon(DeusExWeapon(player.InHand))==False) return False; + if (auto_weapon_mods==False) return False; + + return True; + +} + + function string OtherStrInfo(Actor frobTarget, out int numLines) { local string strInfo; @@ -430,9 +522,17 @@ function string OtherStrInfo(Actor frobTarget, out int numLines) strInfo = Inventory(frobTarget).itemName $ " (" $ Pickup(frobTarget).NumCopies $ ")"; else if (frobTarget.IsA('Weapon') && Weapon(frobTarget).AmmoName != Class'DeusEx.AmmoNone' ) strInfo = Inventory(frobTarget).itemName $ " (" $ Weapon(frobTarget).PickupAmmoCount $ ")"; +#ifdef injections + else if (frobTarget.IsA('ChargedPickup') && Human(player).CanInstantLeftClick(DeusExPickup(frobTarget))) + strInfo = Inventory(frobTarget).itemName $ " (Left Click to Activate)"; + else if (Human(player).CanInstantLeftClick(DeusExPickup(frobTarget))) + strInfo = Inventory(frobTarget).itemName $ " (Left Click to Consume)"; + else if (WeaponModAutoApply(WeaponMod(frobTarget))) + strInfo = Inventory(frobTarget).itemName $ CR() $ "Auto applies to current weapon"; +#endif } else if (frobTarget.IsA('DeusExDecoration')) - strInfo = player.GetDisplayName(frobTarget); + strInfo = player.GetDisplayName(frobTarget) $ DXDecoStrInfo(#var(DeusExPrefix)Decoration(frobTarget),numLines); else if (frobTarget.IsA('DeusExProjectile')) strInfo = DeusExProjectile(frobTarget).itemName; else @@ -631,4 +731,5 @@ defaultproperties msgDamageThreshold="Min Dmg:" msgShot="shot" msgShots="shots" + msgHitPoints="Hit Points:" } diff --git a/GUI/DeusEx/Classes/HUDSpeedrunSplits.uc b/GUI/DeusEx/Classes/HUDSpeedrunSplits.uc index 8df423f73..4f2f1f6c4 100644 --- a/GUI/DeusEx/Classes/HUDSpeedrunSplits.uc +++ b/GUI/DeusEx/Classes/HUDSpeedrunSplits.uc @@ -536,6 +536,6 @@ defaultproperties split_names(14)="Silo" split_names(15)="Area 51" - splitNotes(1)="UNATCO start: no Leo at Paul or hut|nHarley start: no Leo at electric bunker|nTop start: no Leo at base of statue" - splitNotes(14)="Howard 6th floor: no Jock at vanilla" + splitNotes(1)="UNATCO start: no Leo at Paul or hut|nHarley start: no Leo at electric bunker|nTop start: no Leo at base of statue|nEdit these notes in DXRSplits.ini" + splitNotes(14)="Howard 6th floor: no Jock at vanilla|nEdit these notes in DXRSplits.ini" } diff --git a/GUI/DeusEx/Classes/MenuChoice_AutoLaser.uc b/GUI/DeusEx/Classes/MenuChoice_AutoLaser.uc new file mode 100644 index 000000000..a87fa65c6 --- /dev/null +++ b/GUI/DeusEx/Classes/MenuChoice_AutoLaser.uc @@ -0,0 +1,10 @@ +class MenuChoice_AutoLaser extends DXRMenuUIChoiceBool; + +defaultproperties +{ + enabled=True + HelpText="Should laser sights on weapons turn on automatically?" + actionText="Auto Laser Sight" + enumText(0)="Disabled" + enumText(1)="Enabled" +} diff --git a/GUI/DeusEx/Classes/MenuScreenRandoOptions.uc b/GUI/DeusEx/Classes/MenuScreenRandoOptions.uc index 28dbb7564..1ae260e27 100644 --- a/GUI/DeusEx/Classes/MenuScreenRandoOptions.uc +++ b/GUI/DeusEx/Classes/MenuScreenRandoOptions.uc @@ -41,6 +41,7 @@ function CreateChoices() CreateChoice(class'MenuChoice_ShowKeys'); CreateChoice(class'MenuChoice_ThrowMelee'); CreateChoice(class'MenuChoice_AutoWeaponMods'); + CreateChoice(class'MenuChoice_AutoLaser'); CreateChoice(class'MenuChoice_Epilepsy'); } diff --git a/GUI/DeusEx/Classes/NewGamePlusCreditsWindow.uc b/GUI/DeusEx/Classes/NewGamePlusCreditsWindow.uc index 2c51671f7..b7d432a69 100644 --- a/GUI/DeusEx/Classes/NewGamePlusCreditsWindow.uc +++ b/GUI/DeusEx/Classes/NewGamePlusCreditsWindow.uc @@ -47,6 +47,7 @@ function AddDXRCreditsGeneral() PrintText("Die4Ever"); PrintText("TheAstropath"); PrintText("Silverstrings"); + PrintText("MQDuck"); PrintLn(); PrintHeader("Home Page"); diff --git a/GUI/DeusEx/Classes/PersonaScreenImages.uc b/GUI/DeusEx/Classes/PersonaScreenImages.uc index 95c6ce113..16fd60c71 100644 --- a/GUI/DeusEx/Classes/PersonaScreenImages.uc +++ b/GUI/DeusEx/Classes/PersonaScreenImages.uc @@ -1,5 +1,187 @@ class DXRPersonaScreenImages injects PersonaScreenImages; +var DXRPersonaActionButtonWindow btnGoalLocations; +var DXRPersonaActionButtonWindow btnShowSpoilers; +var PersonaButtonBarWindow winGoalHintButtons; + +var String GoalSpoilersText; +var String GoalLocationsText; + +var DXRDataVaultMapImageNote spoilerNotes[32]; + + +event InitWindow() +{ + local int i; + + Super.InitWindow(); + + for (i=0;i 0){ + numNotes=dxrMissions.PopulateMapMarkerNotes(image.class,spoilerNotes); + } + + for (i=0;i 0){ + numNotes=dxrMissions.PopulateMapMarkerSpoilers(image.class,spoilerNotes); + } + + for (i=0;i 0){ + if (dxrMissions.MapHasGoalMarkers(image.class)){ + btnShowSpoilers.Show(True); + btnGoalLocations.Show(True); + } + } + + Super.EnableButtons(); +} + function ClearViewedImageFlags() { local DataVaultImage image; @@ -39,3 +221,8 @@ function MarkViewed(DataVaultImage newImage) newImage.bPlayerViewedImage = True; } } +defaultproperties +{ + GoalSpoilersText="Goal |&Spoilers" + GoalLocationsText="Goal |&Locations" +} diff --git a/HXRandomizer.u b/HXRandomizer.u index 6106aabd3..d227b9ca3 100644 Binary files a/HXRandomizer.u and b/HXRandomizer.u differ diff --git a/Pawns/DeusEx/Classes/DXRandoPawnTextures.uc b/Pawns/DeusEx/Classes/DXRandoPawnTextures.uc index 780af80aa..e85273a92 100644 --- a/Pawns/DeusEx/Classes/DXRandoPawnTextures.uc +++ b/Pawns/DeusEx/Classes/DXRandoPawnTextures.uc @@ -61,3 +61,7 @@ class DXRandoPawnTextures extends Object abstract; //MJ12 Troop without goggles #exec TEXTURE IMPORT NAME=MJ12TroopTex4NoGoggles FILE=Textures\MJ12TroopTex4NoGoggles.pcx GROUP=DXRandoPawns + + +// Augbots +#exec TEXTURE IMPORT NAME=AugBotTex1 FILE=Textures\AugBotTex1.pcx GROUP=DXRandoPawns FLAGS=2 diff --git a/Pawns/DeusEx/Classes/GrayBaby.uc b/Pawns/DeusEx/Classes/GrayBaby.uc new file mode 100644 index 000000000..be5035153 --- /dev/null +++ b/Pawns/DeusEx/Classes/GrayBaby.uc @@ -0,0 +1,27 @@ +//============================================================================= +// GrayBaby. +//============================================================================= +class GrayBaby extends #var(prefix)Gray; + +defaultproperties +{ + MinHealth=3.000000 + CarcassType=Class'DeusEx.GrayBabyCarcass' + WalkingSpeed=0.185000 + bShowPain=True + walkAnimMult=2.500000 + runAnimMult=2.500000 + GroundSpeed=450.000000 + WaterSpeed=80.000000 + Health=15 + DrawScale=0.500000 + CollisionRadius=15.000000 + CollisionHeight=18 + Mass=60.000000 + Buoyancy=50.000000 + BindName="GrayBaby" + FamiliarName="Baby Gray" + UnfamiliarName="Baby Gray" + DamageRadius=128.000000 + DamageAmount=5.000000 +} diff --git a/Pawns/DeusEx/Classes/GrayBabyCarcass.uc b/Pawns/DeusEx/Classes/GrayBabyCarcass.uc new file mode 100644 index 000000000..c1b0bb666 --- /dev/null +++ b/Pawns/DeusEx/Classes/GrayBabyCarcass.uc @@ -0,0 +1,15 @@ +//============================================================================= +// GrayBabyCarcass. +//============================================================================= +class GrayBabyCarcass extends #var(DeusExPrefix)Carcass; + +defaultproperties +{ + Mesh2=LodMesh'DeusExCharacters.GrayCarcass' + Mesh3=LodMesh'DeusExCharacters.GrayCarcass' + bAnimalCarcass=True + Mesh=LodMesh'DeusExCharacters.GrayCarcass' + DrawScale=0.500000 + CollisionRadius=18 + CollisionHeight=3 +} diff --git a/Pawns/DeusEx/Classes/MedicalBot.uc b/Pawns/DeusEx/Classes/MedicalBot.uc index c26ef410c..e59e90802 100644 --- a/Pawns/DeusEx/Classes/MedicalBot.uc +++ b/Pawns/DeusEx/Classes/MedicalBot.uc @@ -6,6 +6,8 @@ class DXRMedicalBot extends #var(prefix)MedicalBot; var travel int numUses; var transient DXRando dxr; +var bool augsOnly; +var string baseName; replication { @@ -27,6 +29,12 @@ function StandStill() } #endif +function updateName() +{ + familiarName = baseName $ GetRemainingUsesStr(); + unfamiliarName = familiarName; +} + function int HealPlayer(DeusExPlayer player) { local int healAmount; @@ -39,6 +47,8 @@ function int HealPlayer(DeusExPlayer player) numUses++; + updateName(); + return healAmount; } @@ -58,7 +68,10 @@ simulated function int GetMaxUses() simulated function int GetRemainingUses() { - return (GetMaxUses() - numUses); + if (augsOnly) + return 0; + else + return (GetMaxUses() - numUses); } simulated function string GetRemainingUsesStr() @@ -68,7 +81,9 @@ simulated function string GetRemainingUsesStr() uses = GetRemainingUses(); - if (uses == 1) { + if (uses == 0) { + return " (No Heals Left)"; + } else if (uses == 1) { msg = " (1 Heal Left)"; } else { msg = " ("$uses$" Heals Left)"; @@ -80,12 +95,12 @@ simulated function string GetRemainingUsesStr() simulated function bool HasLimitedUses() { - return (GetMaxUses() != 0); + return (GetMaxUses() != 0 || augsOnly); } simulated function bool HealsRemaining() { - return GetRemainingUses()!=0; + return GetRemainingUses() > 0; } simulated function bool CanHeal() @@ -136,14 +151,32 @@ function Explode(vector HitLocation) Instigator = oldInstigator; } +function MakeAugsOnly() +{ + augsOnly = true; + MultiSkins[0] = Texture'AugBotTex1'; +} + function Tick(float delta) { Super.Tick(delta); - if(CanHeal()) + if (!augsOnly && baseName == "" && familiarName != "") { + baseName = familiarName; + updateName(); + } + + if(CanHeal()){ LightHue=89; - else + LightType=LT_Steady; + } else { LightHue=255; + if (HasLimitedUses() && HealsRemaining()){ + LightType=LT_Pulse; + } else { + LightType=LT_Steady; + } + } } defaultproperties @@ -155,4 +188,5 @@ defaultproperties LightBrightness=160 LightRadius=6 LightHue=89 + LightPeriod=25 } diff --git a/Pawns/DeusEx/Classes/RepairBot.uc b/Pawns/DeusEx/Classes/RepairBot.uc index 6293e052a..5eea73519 100644 --- a/Pawns/DeusEx/Classes/RepairBot.uc +++ b/Pawns/DeusEx/Classes/RepairBot.uc @@ -6,6 +6,7 @@ class DXRRepairBot extends #var(prefix)RepairBot; var travel int numUses; var transient DXRando dxr; +var string baseName; replication { @@ -27,6 +28,12 @@ function StandStill() } #endif +function updateName() +{ + familiarName = baseName $ GetRemainingUsesStr(); + unfamiliarName = familiarName; +} + function int ChargePlayer(DeusExPlayer PlayerToCharge) { local int chargeAmount; @@ -39,6 +46,8 @@ function int ChargePlayer(DeusExPlayer PlayerToCharge) numUses++; + updateName(); + return chargeAmount; } @@ -68,7 +77,9 @@ simulated function string GetRemainingUsesStr() uses = GetRemainingUses(); - if (uses == 1) { + if (uses == 0) { + msg = " (No Charges Left)"; + } else if (uses == 1) { msg = " (1 Charge Left)"; } else { msg = " ("$uses$" Charges Left)"; @@ -153,10 +164,22 @@ function Tick(float delta) { Super.Tick(delta); - if(CanCharge()) + if (basename == "" && familiarName != "") { + baseName = familiarName; + updateName(); + } + + if(CanCharge()){ LightHue=89; - else + LightType=LT_Steady; + } else { LightHue=255; + if (HasLimitedUses() && ChargesRemaining()){ + LightType=LT_Pulse; + } else { + LightType=LT_Steady; + } + } } defaultproperties @@ -168,4 +191,5 @@ defaultproperties LightBrightness=160 LightRadius=6 LightHue=89 + LightPeriod=25 } diff --git a/Pawns/DeusEx/Textures/AugBotTex1.pcx b/Pawns/DeusEx/Textures/AugBotTex1.pcx new file mode 100644 index 000000000..925c98d39 Binary files /dev/null and b/Pawns/DeusEx/Textures/AugBotTex1.pcx differ diff --git a/RevRandomizer.u b/RevRandomizer.u index bcb0e35bb..d3508bb9a 100644 Binary files a/RevRandomizer.u and b/RevRandomizer.u differ diff --git a/VMDRandomizer.u b/VMDRandomizer.u index 24d7c9a16..8264b927f 100644 Binary files a/VMDRandomizer.u and b/VMDRandomizer.u differ diff --git a/notes/notes.txt b/notes/notes.txt index f664a4758..b41e5549a 100644 --- a/notes/notes.txt +++ b/notes/notes.txt @@ -245,6 +245,7 @@ EditPackages=DXOgg EditPackages=RevisionPawn EditPackages=RevisionUI EditPackages=Revision +EditPackages=RevisionMission EditPackages=RevRandomizer