diff --git a/DeusEx.u b/DeusEx.u index 3828910f6..96c921c92 100644 Binary files a/DeusEx.u and b/DeusEx.u differ diff --git a/DeusEx/Classes/Augmentation.uc b/DeusEx/Classes/Augmentation.uc new file mode 100644 index 000000000..1a7a7a182 --- /dev/null +++ b/DeusEx/Classes/Augmentation.uc @@ -0,0 +1,12 @@ +class DXRAugmentation merges Augmentation; + +function PostBeginPlay() +{ + local DXRAugmentations a; + Super.PostBeginPlay(); + + foreach AllActors(class'DXRAugmentations', a) { + a.RandoAug(self); + break; + } +} diff --git a/DeusEx/Classes/DXRAugmentations.uc b/DeusEx/Classes/DXRAugmentations.uc index 1fd71472b..8cf1769aa 100644 --- a/DeusEx/Classes/DXRAugmentations.uc +++ b/DeusEx/Classes/DXRAugmentations.uc @@ -1,5 +1,17 @@ class DXRAugmentations extends DXRBase; +var config float min_aug_str; +var config float max_aug_str; + +function CheckConfig() +{ + if( config_version < class'DXRFlags'.static.VersionToInt(1,4,8) ) { + min_aug_str = 0.5; + max_aug_str = 1.5; + } + Super.CheckConfig(); +} + function FirstEntry() { local Augmentation anAug; @@ -17,6 +29,16 @@ function FirstEntry() RandomizeAugCannisters(); } +function AnyEntry() +{ + local Augmentation a; + Super.AnyEntry(); + + foreach AllActors(class'Augmentation', a) { + RandoAug(a); + } +} + function RandomizeAugCannisters() { local AugmentationCannister a; @@ -40,6 +62,10 @@ function static RandomizeAugCannister(DXRando dxr, AugmentationCannister a) { a.AddAugs[1] = PickRandomAug(dxr); } + + if( a.AddAugs[0] == 'AugSpeed' || a.AddAugs[1] == 'AugSpeed' ) { + dxr.Player.ClientMessage("Speed Enhancement is in this area."); + } } function static Name PickRandomAug(DXRando dxr) @@ -57,3 +83,13 @@ function static Name PickRandomAug(DXRando dxr) log("Picked Aug "$ slot $"/"$numAugs$" " $ dxr.Player.AugmentationSystem.augClasses[slot].Name, 'DXRAugmentations'); return dxr.Player.AugmentationSystem.augClasses[slot].Name; } + +function RandoAug(Augmentation a) +{ + local string s; + if( AugSpeed(a) != None || AugLight(a) != None ) return; + dxr.SetSeed( dxr.Crc(dxr.seed $ "RandoAug " $ a.class.name ) ); + s = RandoLevelValues(a.LevelValues, a.default.LevelValues, min_aug_str, max_aug_str); + if( InStr(a.Description, s) == -1 ) + a.Description = a.Description $ "|n|n" $ s; +} diff --git a/DeusEx/Classes/DXRBacktracking.uc b/DeusEx/Classes/DXRBacktracking.uc new file mode 100644 index 000000000..b3a3d2cee --- /dev/null +++ b/DeusEx/Classes/DXRBacktracking.uc @@ -0,0 +1,65 @@ +class DXRBacktracking extends DXRActorsBase; +// backtracking specific fixes that might be too extreme for the more generic DXRFixup? or move the stuff from DXRFixup into here? + +function FirstEntry() +{ + local Teleporter t; + local DynamicTeleporter dt; + local BlockPlayer bp; + Super.FirstEntry(); + + switch(dxr.localURL) { + case "10_PARIS_METRO": + foreach AllActors(class'BlockPlayer', bp) { + if( bp.Name == 'BlockPlayer0' ) { + bp.bBlockPlayers=false; + } + } + dt = Spawn(class'DynamicTeleporter',,'sewers_backtrack',vect(1599.971558, -4694.342773, 13.399302)); + dt.URL = "10_PARIS_CATACOMBS_TUNNELS#?toname=AmbientSound10"; + dt.Radius = 160; + AddSwitch(vect(1602.826904, -4318.841309, -250.365067), rot(0, 16384, 0), 'sewers_backtrack'); + break; + case "15_AREA51_ENTRANCE": + dt = Spawn(class'DynamicTeleporter',,,vect(4384.407715, -2483.292236, -41.900017)); + dt.URL = "15_area51_bunker#?toname=Light188"; + dt.Radius = 160; + break; + case "15_AREA51_FINAL": + dt = Spawn(class'DynamicTeleporter',,,vect(-5714.406250, -1977.827881, -1358.711304)); + dt.URL = "15_area51_entrance#?toname=Light73"; + dt.Radius = 160; + break; + } +} + +function AnyEntry() +{ + local string tonamestring; + local name toname; + local Actor a; + Super.AnyEntry(); + + //need to make sure this doesn't happen when loading a save + if (! dxr.flags.f.GetBool('PlayerTraveling')) return; + + tonamestring = Level.game.ParseOption( "?" $ Level.GetLocalURL(), "toname" ); + if( InStr(tonamestring, "#") >=0 ) { + tonamestring = Left(tonamestring,InStr(tonamestring,"#")); + } + if( tonamestring != "" ) { + toname = dxr.Player.rootWindow.StringToName(tonamestring); + foreach AllActors(class'Actor', a) { + if( a.Name == toname ) { + dxr.Player.SetLocation(a.Location); + dxr.Player.UpdateURL("toname", "", false); + break; + } + } + } +} + +function DeusExDecoration AddSwitch(vector loc, rotator rotate, name Event) +{ + return class'DXRFixup'.static._AddSwitch(Self, loc, rotate, Event); +} diff --git a/DeusEx/Classes/DXRBase.uc b/DeusEx/Classes/DXRBase.uc index 6d76fd0a5..0875a475f 100644 --- a/DeusEx/Classes/DXRBase.uc +++ b/DeusEx/Classes/DXRBase.uc @@ -73,6 +73,32 @@ function float rngfn() return rngf() * 2.0 - 1.0; } +function float rngrange(float val, float min, float max) +{ + local float mult; + mult = max - min; + return val * (rngf() * mult + min); +} + +function string RandoLevelValues(out float LevelValues[4], float DefaultLevelValues[4], float min, float max) +{ + local int i; + local float min_val; + local string s; + + s = "(Values: "; + for(i=0; i0 && DefaultLevelValues[i-1] < DefaultLevelValues[i] && LevelValues[i] < min_val ) LevelValues[i] = min_val; + else if( i>0 && DefaultLevelValues[i-1] > DefaultLevelValues[i] && LevelValues[i] > min_val ) LevelValues[i] = min_val; + min_val = LevelValues[i]; + if( i>0 ) s = s $ ", "; + s = s $ int(LevelValues[i]/DefaultLevelValues[i]*100.0) $ "%"; + } + s = s $ ")"; + return s; +} + function static int staticrng(DXRando dxr, int max) { return dxr.rng(max); diff --git a/DeusEx/Classes/DXREntranceRando.uc b/DeusEx/Classes/DXREntranceRando.uc index 6526ff5c9..011bd9f3e 100644 --- a/DeusEx/Classes/DXREntranceRando.uc +++ b/DeusEx/Classes/DXREntranceRando.uc @@ -65,9 +65,10 @@ function CheckConfig() } if( config_version < class'DXRFlags'.static.VersionToInt(1,4,5) ) { min_connections_selfconnect = 999; - dead_ends[0] = "03_NYC_AirfieldHeliBase#FromOcean"; - dead_ends[1] = "06_HONGKONG_WANCHAI_GARAGE#Teleporter"; - //dead_ends[2] = "12_VANDENBERG_CMD#storage";//it's actually backwards from this... + i = 0; + //dead_ends[i++] = "03_NYC_AirfieldHeliBase#FromOcean"; + dead_ends[i++] = "06_HONGKONG_WANCHAI_GARAGE#Teleporter"; + //dead_ends[i++] = "12_VANDENBERG_CMD#storage";//it's actually backwards from this... } for(i=0; i < ArrayCount(BannedConnections); i++) { BannedConnections[i].map_a = Caps(BannedConnections[i].map_a); @@ -465,7 +466,8 @@ function _GenerateConnections(int missionNum) } } if( i >= maxAttempts ) { - l("failed to find valid connection"); + l("failed to find valid connection for " $ xfers[nextAvailIdx].mapname $ "#" $ xfers[nextAvailIdx].inTag $ " / #" $ xfers[nextAvailIdx].outTag ); + return; } xfers[destIdx].used = True; xfersUsed++; @@ -607,12 +609,12 @@ function RandoMission10() { AddFixedConn("10_PARIS_CATACOMBS","x", "10_PARIS_CATACOMBS","x"); AddDoubleXfer("10_PARIS_CATACOMBS","spiralstair","10_Paris_Catacombs_Tunnels","spiralstair");//same tag on both sides? - AddFixedConn("10_PARIS_CATACOMBS_TUNNELS","","10_Paris_Metro","sewer");//one way + AddFixedConn("10_PARIS_CATACOMBS_TUNNELS","?toname=AmbientSound10","10_Paris_Metro","sewer");//one way, I could maybe use separate teleporters for each side of the sewers to make more options? AddFixedConn("10_Paris_Metro","","10_PARIS_CHATEAU","x");//one way - AddDoubleXfer("10_PARIS_CHATEAU","","11_Paris_Cathedral","cathedralstart");//one way + //AddDoubleXfer("10_PARIS_CHATEAU","","11_Paris_Cathedral","cathedralstart");//one way AddDoubleXfer("10_PARIS_CLUB","Paris_Club1","10_Paris_Metro","Paris_Metro1"); AddDoubleXfer("10_PARIS_CLUB","Paris_Club2","10_Paris_Metro","Paris_Metro2"); - AddDoubleXfer("11_PARIS_CATHEDRAL","Paris_Underground","11_Paris_Underground","Paris_Underground"); + //AddDoubleXfer("11_PARIS_CATHEDRAL","Paris_Underground","11_Paris_Underground","Paris_Underground"); //AddDoubleXfer("11_PARIS_EVERETT","","12_Vandenberg_cmd"); GenerateConnections(10); @@ -629,10 +631,24 @@ function RandoMission11() function RandoMission12() { + local DeusExMover d; + AddFixedConn("12_VANDENBERG_CMD","x","12_VANDENBERG_CMD", "x"); AddDoubleXfer("12_VANDENBERG_CMD","commstat","12_vandenberg_tunnels","start"); AddDoubleXfer("12_VANDENBERG_CMD","storage","12_vandenberg_tunnels","end"); - AddDoubleXfer("12_VANDENBERG_CMD","hall","12_vandenberg_computer","computer");//this might be dangerous because of the locked key-only door? + AddDoubleXfer("12_VANDENBERG_CMD","hall","12_vandenberg_computer","computer"); + + if( dxr.localURL == "12_VANDENBERG_CMD" ) { + foreach AllActors(class'DeusExMover', d) { + switch(d.Tag) { + case 'door_controlroom': + case 'security_tunnels': + class'DXRKeys'.static.MakePickable(d); + class'DXRKeys'.static.MakeDestructible(d); + break; + } + } + } //AddDoubleXfer("12_VANDENBERG_CMD","","12_Vandenberg_gas",""); //AddDoubleXfer("12_VANDENBERG_GAS","gas_start","",""); //AddDoubleXfer("12_VANDENBERG_GAS","","14_Vandenberg_sub",""); @@ -664,8 +680,8 @@ function RandoMission15() { AddFixedConn("15_AREA51_BUNKER","x","15_AREA51_BUNKER", "x"); //AddDoubleXfer("15_AREA51_BUNKER","commstat","",""); - AddDoubleXfer("15_AREA51_BUNKER","","15_Area51_entrance","start"); - AddDoubleXfer("15_Area51_entrance","","15_AREA51_FINAL","start"); + AddDoubleXfer("15_AREA51_BUNKER","?toname=Light188","15_Area51_entrance","start"); + AddDoubleXfer("15_Area51_entrance","?toname=Light73","15_AREA51_FINAL","start"); AddDoubleXfer("15_AREA51_FINAL","final_end","15_Area51_page","page_start"); //AddDoubleXfer("15_AREA51_FINAL","Start",""); @@ -677,7 +693,7 @@ function EntranceRando(int missionNum) numConns = 0; numXfers = 0; numFixedConns = 0; - if( missionNum == 11 ) missionNum = 10;//combine 10 and 11 + //if( missionNum == 11 ) missionNum = 10;//combine paris 10 and 11 //if( missionNum == 14 ) missionNum = 12;//combine vandenberg and oceanlab? dxr.SetSeed( dxr.seed + dxr.Crc("entrancerando") + missionNum ); @@ -705,7 +721,7 @@ function EntranceRando(int missionNum) RandoMission10(); break; case 11: - RandoMission11(); + //RandoMission11(); break; case 12: RandoMission12(); diff --git a/DeusEx/Classes/DXRFixup.uc b/DeusEx/Classes/DXRFixup.uc index 8b6a2d2bf..84d46d041 100644 --- a/DeusEx/Classes/DXRFixup.uc +++ b/DeusEx/Classes/DXRFixup.uc @@ -89,6 +89,12 @@ function FirstEntry() case 6: HongKong_FirstEntry(); break; + case 9: + Shipyard_FirstEntry(); + break; + case 10: + Paris_FirstEntry(); + break; case 12: Vandenberg_FirstEntry(); break; @@ -214,11 +220,14 @@ function NYC_02_FirstEntry() function Airfield_FirstEntry() { local Mover m; + local Actor a; + local Trigger t; switch (dxr.localURL) { 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'; @@ -228,6 +237,28 @@ function Airfield_FirstEntry() m.Event = 'GroundLevel'; } } + foreach AllActors(class'Trigger', t) { + //disable the platforms that fall when you step on them + if( t.Name == 'Trigger0' || t.Name == 'Trigger1' ) { + t.Event = ''; + } + } + //stepping stone valves out of the water + _AddActor(Self, class'Valve', vect(-3105,-385,-210), rot(0,0,16384)); + a = _AddActor(Self, class'DynamicBlockPlayer', vect(-3105,-385,-210), rot(0,0,0)); + SetActorScale(a, 1.3); + + _AddActor(Self, class'Valve', vect(-3080,-395,-173), rot(0,0,16384)); + a = _AddActor(Self, class'DynamicBlockPlayer', vect(-3080,-395,-173), rot(0,0,0)); + SetActorScale(a, 1.3); + + _AddActor(Self, class'Valve', vect(-3065,-405,-137), rot(0,0,16384)); + a = _AddActor(Self, class'DynamicBlockPlayer', vect(-3065,-405,-137), rot(0,0,0)); + SetActorScale(a, 1.3); + + //crates to get back over the beginning of the level + _AddActor(Self, class'CrateUnbreakableSmall', vect(-9463.387695, 3377.530029, 60), rot(0,0,0)); + _AddActor(Self, class'CrateUnbreakableMed', vect(-9461.959961, 3320.718750, 75), rot(0,0,0)); break; case "03_NYC_BROOKLYNBRIDGESTATION": //Put a button behind the hidden bathroom door @@ -362,6 +393,31 @@ function HongKong_FirstEntry() } } +function Shipyard_FirstEntry() +{ + local DeusExMover m; + switch(dxr.localURL) + { + case "09_NYC_SHIP": + foreach AllActors(class'DeusExMover', m, 'DeusExMover') { + if( m.Name == 'DeusExMover7' ) m.Tag = 'shipbelowdecks_door'; + } + AddSwitch( vect(2534.639893, 227.583054, 339.803802), rot(0,-32760,0), 'shipbelowdecks_door' ); + break; + } +} + +function Paris_FirstEntry() +{ + switch(dxr.localURL) + { + case "10_PARIS_CATACOMBS_TUNNELS": + 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' ); + break; + } +} + function HongKong_AnyEntry() { local Actor a; @@ -369,6 +425,9 @@ function HongKong_AnyEntry() local bool boolFlag; local bool recruitedFlag; + // if flag Have_ROM, set flags Have_Evidence and KnowsAboutNanoSword? + // or if flag Have_ROM, Gordon Quick should let you into the compound? requires Have_Evidence and MaxChenConvinced + switch(dxr.localURL) { case "06_HONGKONG_TONGBASE": @@ -463,13 +522,22 @@ function Area51_FirstEntry() local DataCube dc; switch(dxr.localURL) { + case "15_AREA51_BUNKER": + AddSwitch( vect(4309.076660, -1230.640503, -7522.298340), rot(0, 16384, 0), 'doors_lower'); + break; case "15_AREA51_FINAL": foreach AllActors(class'DeusExMover', d, 'Generator_overload') { d.move(vect(0, 0, -1)); } + AddSwitch( vect(-5107.805176, -2530.276123, -1374.614258), rot(0, -16384, 0), 'blastdoor_final'); AddSwitch( vect(-3745, -1114, -1950), rot(0,0,0), 'Page_Blastdoors' ); break; case "15_AREA51_ENTRANCE": + foreach AllActors(class'DeusExMover', d, 'DeusExMover') { + if( d.Name == 'DeusExMover20' ) d.Tag = 'final_door'; + } + AddSwitch( vect(-867.193420, 244.553101, 17.622702), rot(0, 32768, 0), 'final_door'); + dc = Spawn(class'DataCube',,, GetRandomPosition(), rot(0,0,0)); if( dc != None ) dc.plaintext = "My code is 6786"; @@ -478,6 +546,19 @@ function Area51_FirstEntry() dc = Spawn(class'DataCube',,, GetRandomPosition(), rot(0,0,0)); if( dc != None ) dc.plaintext = "My code is 4322"; + + foreach AllActors(class'DeusExMover', d, 'doors_lower') { + d.bLocked = false; + d.bHighlight = true; + d.bFrobbable = true; + } + break; + case "15_AREA51_FINAL": + foreach AllActors(class'DeusExMover', d, 'doors_lower') { + d.bLocked = false; + d.bHighlight = true; + d.bFrobbable = true; + } break; } } @@ -495,12 +576,28 @@ function AddDelay(Actor trigger, float time) function DeusExDecoration AddSwitch(vector loc, rotator rotate, name Event) { - local Switch2 s; - s = Spawn(class'Switch2',,,loc,rotate); - s.Event = Event; - s.bCollideWorld=False; - s.SetLocation(loc); - return s; + return _AddSwitch(Self, loc, rotate, Event); +} + +static function DeusExDecoration _AddSwitch(Actor a, vector loc, rotator rotate, name Event) +{ + local DeusExDecoration d; + d = DeusExDecoration( _AddActor(a, class'Switch2', loc, rotate) ); + d.Event = Event; + return d; +} + +static function Actor _AddActor(Actor a, class c, vector loc, rotator rotate) +{ + local Actor d; + local bool oldCollideWorld; + d = a.Spawn(c,,, loc, rotate ); + oldCollideWorld = d.bCollideWorld; + d.bCollideWorld = false; + d.SetLocation(loc); + d.SetRotation(rotate); + d.bCollideWorld = oldCollideWorld; + return d; } function RemoveFears(ScriptedPawn p) diff --git a/DeusEx/Classes/DXRFlags.uc b/DeusEx/Classes/DXRFlags.uc index be378f7e7..878324a67 100644 --- a/DeusEx/Classes/DXRFlags.uc +++ b/DeusEx/Classes/DXRFlags.uc @@ -214,7 +214,7 @@ function LogFlags(string prefix) function string StringifyFlags() { - return "flagsversion: "$flagsversion$", gamemode: "$gamemode$", banneditems: "$banneditems$", brightness: "$brightness $ ", ammo: " $ ammo + return "flagsversion: "$flagsversion$", gamemode: "$gamemode $ ", difficulty: " $ dxr.Player.CombatDifficulty $ ", banneditems: "$banneditems$", brightness: "$brightness $ ", ammo: " $ ammo $ ", minskill: "$minskill$", maxskill: "$maxskill$", skills_disable_downgrades: " $ skills_disable_downgrades $ ", skills_reroll_missions: " $ skills_reroll_missions $ ", skills_independent_levels: " $ skills_independent_levels $ ", multitools: "$multitools$", lockpicks: "$lockpicks$", biocells: "$biocells$", medkits: "$medkits $ ", speedlevel: "$speedlevel$", keysrando: "$keysrando$", doorsmode: "$doorsmode$", doorspickable: "$doorspickable$", doorsdestructible: "$doorsdestructible @@ -254,12 +254,12 @@ static function string VersionToString(int major, int minor, int patch) static function int VersionNumber() { - return VersionToInt(1, 4, 7); + return VersionToInt(1, 4, 8); } static function string VersionString() { - return VersionToString(1, 4, 7) $ ""; + return VersionToString(1, 4, 8) $ ""; } function MaxRando() diff --git a/DeusEx/Classes/DXRKeys.uc b/DeusEx/Classes/DXRKeys.uc index aae9de555..5425cdea4 100644 --- a/DeusEx/Classes/DXRKeys.uc +++ b/DeusEx/Classes/DXRKeys.uc @@ -20,6 +20,8 @@ struct door_fix { }; var config door_fix door_fixes[32]; +var config float min_lock_adjust, max_lock_adjust, min_door_adjust, max_door_adjust; + function CheckConfig() { local int i; @@ -173,6 +175,12 @@ function CheckConfig() door_fixes[i].lockStrength = 1; i++; } + if( config_version < class'DXRFlags'.static.VersionToInt(1,4,8) ) { + min_lock_adjust = 0.5; + max_lock_adjust = 1.5; + min_door_adjust = 0.5; + max_door_adjust = 1.5; + } for(i=0; i 0.1)//every 100ms + { + proxCheckTime = 0; + foreach RadiusActors(class'DeusExPlayer', Player, Radius) + { + Touch(Player); + } + } +} + +function Trigger(Actor Other, Pawn Instigator) +{ + Touch(Instigator); +} + +defaultproperties +{ + bGameRelevant=True + bCollideActors=False + bStatic=False + Radius=160 +} diff --git a/DeusEx/Classes/MenuSelectDifficulty.uc b/DeusEx/Classes/MenuSelectDifficulty.uc index cb78025de..78aaf34f6 100644 --- a/DeusEx/Classes/MenuSelectDifficulty.uc +++ b/DeusEx/Classes/MenuSelectDifficulty.uc @@ -19,8 +19,8 @@ function BindControls(bool writing, optional string action) labels[id] = ""; helptexts[id] = "Choose a game mode!"; EnumOption(id, "Original Story", 0, writing, f.gamemode); + EnumOption(id, "Original Story, Rearranged Levels (Beta)", 1, writing, f.gamemode); EnumOption(id, "Horde Mode (Beta)", 2, writing, f.gamemode); - EnumOption(id, "Original Story, Rearranged Levels (Alpha)", 1, writing, f.gamemode); //EnumOption(id, "Kill Bob Page (Alpha)", 3, writing, f.gamemode); //EnumOption(id, "How About Some Soy Food?", 6, writing, f.gamemode); if( EnumOption(id, "Stick With the Prod", 4, writing, f.gamemode) ) { diff --git a/DeusEx/Classes/Weapon.uc b/DeusEx/Classes/Weapon.uc new file mode 100644 index 000000000..0b4c3c3bb --- /dev/null +++ b/DeusEx/Classes/Weapon.uc @@ -0,0 +1,333 @@ +class DXRWeapon merges DeusExWeapon abstract; + +function PostBeginPlay() +{ + local DXRWeapons m; + _PostBeginPlay(); + + foreach AllActors(class'DXRWeapons', m) { + m.RandoWeapon(self); + break; + } +} + +//mostly copied from DeusExWeapon, but use actual values instead of default values +simulated function bool UpdateInfo(Object winObject) +{ + local PersonaInventoryInfoWindow winInfo; + local string str; + local int i, dmg; + local float mod; + local bool bHasAmmo; + local bool bAmmoAvailable; + local class ammoClass; + local Pawn P; + local Ammo weaponAmmo; + local int ammoAmount; + + P = Pawn(Owner); + if (P == None) + return False; + + winInfo = PersonaInventoryInfoWindow(winObject); + if (winInfo == None) + return False; + + winInfo.SetTitle(itemName); + winInfo.SetText(msgInfoWeaponStats); + winInfo.AddLine(); + + // Create the ammo buttons. Start with the AmmoNames[] array, + // which is used for weapons that can use more than one + // type of ammo. + + if (AmmoNames[0] != None) + { + for (i=0; i 0); + } + else + { + ammoAmount = 0; + bHasAmmo = False; + } + + winInfo.AddAmmo(AmmoNames[i], bHasAmmo, ammoAmount); + bAmmoAvailable = True; + + if (AmmoNames[i] == AmmoName) + { + winInfo.SetLoaded(AmmoName); + ammoClass = class(AmmoName); + } + } + } + } + else + { + // Now peer at the AmmoName variable, but only if the AmmoNames[] + // array is empty + if ((AmmoName != class'AmmoNone') && (!bHandToHand) && (ReloadCount != 0)) + { + weaponAmmo = Ammo(P.FindInventoryType(AmmoName)); + + if (weaponAmmo != None) + { + ammoAmount = weaponAmmo.AmmoAmount; + bHasAmmo = (weaponAmmo.AmmoAmount > 0); + } + else + { + ammoAmount = 0; + bHasAmmo = False; + } + + winInfo.AddAmmo(AmmoName, bHasAmmo, ammoAmount); + winInfo.SetLoaded(AmmoName); + ammoClass = class(AmmoName); + bAmmoAvailable = True; + } + } + + // Only draw another line if we actually displayed ammo. + if (bAmmoAvailable) + winInfo.AddLine(); + + // Ammo loaded + if ((AmmoName != class'AmmoNone') && (!bHandToHand) && (ReloadCount != 0)) + winInfo.AddAmmoLoadedItem(msgInfoAmmoLoaded, AmmoType.itemName); + + // ammo info + if ((AmmoName == class'AmmoNone') || bHandToHand || (ReloadCount == 0)) + str = msgInfoNA; + else + str = AmmoName.Default.ItemName; + for (i=0; i game mode choice -> difficulty? (max rando would skip difficulty choice? and maybe horde mode too?) -> rando options -> create character -remove the option for removing invisible walls combine medkits/biocells/lockpicks/multitools into just items drop rate? -should SWtP mode be considered a game mode? or should banned items be a separate option? should I add an option for "normal skill rando every 5 missions"? -difficulties: -easy = 1.0 damage, 10% enemies, key-only doors breakable and pickable, all hackable, normal skill rando 25%-200%, level 3 speed? -normal = 1.25 damage, 20% enemies, key-only doors breakable or pickable, all hackable, 80% ammo and items, normal skill rando 25%-300%, level 1 speed -hard = 1.5 damage, 35% enemies, some doors breakable or pickable, most hackable, 70% ammo and items, blind skill rando every 5 missions 25%-300%, level 1 speed -extreme = 2.0 damage, 50% enemies, some doors breakable or pickable, most hackable, 50% ammo and items, blind skill rando every 5 missions 25%-400%, level 1 speed - -should I show an input for the damage multiplier on the rando options page? - +``` function bool MoveWithTriggers(Actor a, vector loc) {// I can use this to move the ambrosia barrel in 02_NYC_BATTERYPARK local Trigger t; @@ -48,11 +53,12 @@ function bool MoveWithTriggers(Actor a, vector loc) } return true; } +``` maybe add a list of unimportantMaps for DXREntranceRando? maybe chateau, freeclinic, nyc sewers, smuggler, gas station, graveyard? another issue with DXREntranceRando: if I make a connection from paris metro to chateau, DXREntranceRando will ensure I can get to the metro to get to the chateau, but it won't realize that I also need to get to the club first - similarly, you go from 12_vandenberg_cmd to gas station, but you need to get to 12_vandenberg_computer first + similarly, you go from 12_vandenberg_cmd to gas station, but you need to get to 12_vandenberg_computer first before the chopper will appear might need a `string other_required_map` for each transfer? lots of doors that need buttons on the other side in mission 14, and maybe 12_vandenberg_tunnels could use that too instead of making it open on player bump paris and area51 have some one-way transfers that could maybe be fixed? @@ -257,15 +263,15 @@ x autosave - MenuScreenSaveGame - DeusExSaveInfo can I randomize computer skill requirements? I can randomize the EAccessLevel, but it doesn't do anything? gonna need my class injector to make this clean +I could also randomize how long it takes to hack, if it's long enough then you'll need higher computer skill to be able to do it ============================= need a function for GiveRandomItem() need a function for CloneNanoKey() (based on Engine.Pickup.SpawnCopy? no, that's for respawning items) -need to figure out how to modify conversations, datacubes, emails... +need to figure out how to modify conversations AI hearing and vision adjustment, enemy health -rando dragoon's tooth sword? nerf it? actor class also has these: var const Actor Base; // Moving brush actor we're standing on. native(298) final function SetBase( actor NewBase ); @@ -291,7 +297,7 @@ https://ut99.org/viewtopic.php?t=5985 https://www.dx-revision.com/dxtutorials/constructor/tutorials.htm -charisma setting that disables random dialog options with low charisma? +charisma setting/skill that disables random dialog options with low charisma? https://forums.epicgames.com/unreal-tournament-3/unreal-tournament-3-programming-unrealscript/176322-decompile-u-files