diff --git a/DeusEx.u b/DeusEx.u index 197625155..b672a5e42 100644 Binary files a/DeusEx.u and b/DeusEx.u differ diff --git a/DeusEx/Classes/BalanceHacking.uc b/DeusEx/Classes/BalanceHacking.uc index f569f6345..539468eed 100644 --- a/DeusEx/Classes/BalanceHacking.uc +++ b/DeusEx/Classes/BalanceHacking.uc @@ -6,6 +6,7 @@ function Tick(float deltaTime) if (bHacking) { p = DeusExPlayer(winTerm.compOwner.Owner); + if( p == None ) p = Player;// ATMs don't set the Owner if( p != None ) { p.Energy -= deltaTime * 3.0; if( p.Energy <= 0 ) { diff --git a/DeusEx/Classes/Barrel1.uc b/DeusEx/Classes/Barrel1.uc index c9b78c8e1..d6a9d9629 100644 --- a/DeusEx/Classes/Barrel1.uc +++ b/DeusEx/Classes/Barrel1.uc @@ -2,7 +2,6 @@ class Barrel1 injects Barrel1; event TravelPreAccept() { - local string old_skin; Super.TravelPreAccept(); if( HandleTravel() ) BeginPlay(); @@ -10,7 +9,6 @@ event TravelPreAccept() function bool HandleTravel() { - local int old_skin; local DeusExPlayer player; foreach AllActors(class'DeusExPlayer', player) { break; } @@ -18,42 +16,7 @@ function bool HandleTravel() return false; } - old_skin = int(Level.game.ParseOption( "?" $ Level.GetLocalURL(), "barrel1_skin" )); - switch(old_skin) { - case 0: - SkinColor = SC_Biohazard; - break; - case 1: - SkinColor = SC_Blue; - break; - case 2: - SkinColor = SC_Brown; - break; - case 3: - SkinColor = SC_Rusty; - break; - case 4: - SkinColor = SC_Explosive; - break; - case 5: - SkinColor = SC_FlammableLiquid; - break; - case 6: - SkinColor = SC_FlammableSolid; - break; - case 7: - SkinColor = SC_Poison; - break; - case 8: - SkinColor = SC_RadioActive; - break; - case 9: - SkinColor = SC_Wood; - break; - case 10: - SkinColor = SC_Yellow; - break; - } + SetPropertyText("SkinColor", Level.game.ParseOption( "?" $ Level.GetLocalURL(), "barrel1_skin" )); player.UpdateURL("barrel1_skin", "", false); return true; } @@ -63,7 +26,7 @@ function PreTravel() local DeusExPlayer player; foreach AllActors(class'DeusExPlayer', player) { break; } if( player != None && player.CarriedDecoration == Self ) { - player.UpdateURL("barrel1_skin", string(SkinColor), false); + player.UpdateURL("barrel1_skin", GetPropertyText("SkinColor"), false); } } diff --git a/DeusEx/Classes/DXRActorsBase.uc b/DeusEx/Classes/DXRActorsBase.uc index 8c902c1b4..a9900fe0b 100644 --- a/DeusEx/Classes/DXRActorsBase.uc +++ b/DeusEx/Classes/DXRActorsBase.uc @@ -13,6 +13,14 @@ struct FMinMax { var float max; }; +struct safe_rule { + var string map; + var name item_name; + var vector min_pos; + var vector max_pos; + var bool allow; +}; + function CheckConfig() { local class temp_skipactor_types[6]; @@ -639,6 +647,20 @@ function Vector GetCenter(Actor test) return (MinVect+MaxVect)/2; } +function int GetSafeRule(safe_rule rules[32], name item_name, vector newpos) +{ + local int i; + + for(i=0; i wclass; local Ammo a; @@ -396,7 +396,7 @@ function GiveRandomWeapon(Pawn p) } chance_remaining(r); - if( HasItem(p, wclass) ) + if( (!allow_dupes) && HasItem(p, wclass) ) return; if( wclass == None ) { @@ -406,12 +406,12 @@ function GiveRandomWeapon(Pawn p) GiveItem( p, wclass, true ); } -function GiveRandomMeleeWeapon(Pawn p) +function GiveRandomMeleeWeapon(Pawn p, optional bool allow_dupes) { local class wclass; local int r, i; - if(HasMeleeWeapon(p)) + if( (!allow_dupes) && HasMeleeWeapon(p)) return; r = initchance(); @@ -419,7 +419,7 @@ function GiveRandomMeleeWeapon(Pawn p) if( _randommelees[i].type == None ) continue; if( chance( _randommelees[i].chance, r ) ) wclass = _randommelees[i].type; - if( HasItem(p, _randommelees[i].type) ) { + if( (!allow_dupes) && HasItem(p, _randommelees[i].type) ) { chance_remaining(r); return; } diff --git a/DeusEx/Classes/DXRFixup.uc b/DeusEx/Classes/DXRFixup.uc index 4868f0e25..53a036288 100644 --- a/DeusEx/Classes/DXRFixup.uc +++ b/DeusEx/Classes/DXRFixup.uc @@ -78,6 +78,7 @@ function FirstEntry() IncreaseBrightness(dxr.flags.brightness); OverwriteDecorations(); + FixFlagTriggers(); switch(dxr.dxInfo.missionNumber) { case 2: @@ -224,6 +225,18 @@ function OverwriteDecorations() } } +function FixFlagTriggers() +{//the History Un-Eraser Button + local FlagTrigger f; + + foreach AllActors(class'FlagTrigger', f) { + if( f.bSetFlag && f.flagExpiration == -1 ) { + f.flagExpiration = 999; + log(f @ f.FlagName @ f.flagValue $" changed expiration from -1 to 999"); + } + } +} + function NYC_02_FirstEntry() { local DeusExMover d; @@ -261,7 +274,9 @@ function Airfield_FirstEntry() foreach AllActors(class'Actor', a) { if( a.name == 'NanoKey0' ) { a.Destroy(); - break; + } + if( a.name == 'BookClosed2' ) { + InformationDevices(a).bAddToVault = true; } } break; diff --git a/DeusEx/Classes/DXRFlags.uc b/DeusEx/Classes/DXRFlags.uc index 6b4d22c3a..eebd2c8dd 100644 --- a/DeusEx/Classes/DXRFlags.uc +++ b/DeusEx/Classes/DXRFlags.uc @@ -25,7 +25,7 @@ var int undefeatabledoors, alldoors, keyonlydoors, highlightabledoors, doormutua function PreTravel() { Super.PreTravel(); - if( dxr != None && dxr.localURL == "INTRO" && f.GetInt('Rando_version') == 0 ) { + if( dxr != None && f.GetInt('Rando_version') == 0 ) { info("PreTravel "$dxr.localURL$" SaveFlags"); SaveFlags(); } @@ -324,12 +324,12 @@ static function string VersionToString(int major, int minor, int patch) static function int VersionNumber() { - return VersionToInt(1, 5, 2); + return VersionToInt(1, 5, 3); } static function string VersionString() { - return VersionToString(1, 5, 2) $ ""; + return VersionToString(1, 5, 3) $ ""; } function MaxRando() diff --git a/DeusEx/Classes/DXRKeys.uc b/DeusEx/Classes/DXRKeys.uc index bfb958ba3..a48d0c9e5 100644 --- a/DeusEx/Classes/DXRKeys.uc +++ b/DeusEx/Classes/DXRKeys.uc @@ -1,13 +1,6 @@ class DXRKeys extends DXRActorsBase; -struct key_rule { - var string map; - var name key_id; - var vector min_pos; - var vector max_pos; - var bool allow; -}; -var config key_rule keys_rules[32]; +var config safe_rule keys_rules[32]; struct door_fix { var string map; @@ -25,32 +18,36 @@ var config float min_lock_adjust, max_lock_adjust, min_door_adjust, max_door_adj function CheckConfig() { local int i; - if( config_version < class'DXRFlags'.static.VersionToInt(1,4,7) ) { + if( config_version < class'DXRFlags'.static.VersionToInt(1,5,3) ) { + + for(i=0; i 0 ) return false; + i = GetSafeRule( keys_rules, k.KeyID, newpos); + if( i != -1 ) return keys_rules[i].allow; dist = VSize( k.Location - newpos ); if( dist > 5000 ) return False; diff --git a/DeusEx/Classes/DXRMachines.uc b/DeusEx/Classes/DXRMachines.uc index 399351310..563d26c51 100644 --- a/DeusEx/Classes/DXRMachines.uc +++ b/DeusEx/Classes/DXRMachines.uc @@ -51,7 +51,7 @@ function RandoTurrets(int percent_move, int percent_add) if( t.bTrackPlayersOnly==true || t.bTrackPawnsOnly==false ) hostile_turrets++; if( chance_single(percent_move) == false ) continue; - loc = GetRandomPosition(t.Location, turret_move_min_distance, turret_move_max_distance); + loc = GetRandomPositionFine(t.Location, turret_move_min_distance, turret_move_max_distance); if( class'DXRMissions'.static.IsCloseToStart(dxr, loc) ) { info("RandoTurret move "$loc$" is too close to start!"); continue; @@ -70,7 +70,7 @@ function RandoTurrets(int percent_move, int percent_add) for(i=0; i < max_turrets ; i++) { if( chance_single(percent_add/max_turrets) == false ) continue; - loc = GetRandomPosition(); + loc = GetRandomPositionFine(); if( class'DXRMissions'.static.IsCloseToStart(dxr, loc) ) { info("RandoTurret add "$loc$" is too close to start!"); continue; @@ -336,7 +336,7 @@ function Datacube SpawnDatacube(vector loc, ComputerSecurity c) return None; } d.plaintext = c.UserList[0].userName $ " password is " $ c.UserList[0].Password; - info("SpawnDatacube "$d$" done at ("$locnorm.loc$"), ("$locnorm.norm$")"); + info("SpawnDatacube "$d$" done at ("$locnorm.loc$"), ("$locnorm.norm$") with name: "$d.Name); return d; } diff --git a/DeusEx/Classes/DXRMenuSetupRando.uc b/DeusEx/Classes/DXRMenuSetupRando.uc index 4d55de9a5..e805dffcc 100644 --- a/DeusEx/Classes/DXRMenuSetupRando.uc +++ b/DeusEx/Classes/DXRMenuSetupRando.uc @@ -101,9 +101,13 @@ function BindControls(bool writing, optional string action) skills_option = f.skills_disable_downgrades $";"$ f.skills_reroll_missions $";"$ f.skills_independent_levels; EnumOptionString(id, "Normal Skill Randomization", "0;0;0", writing, skills_option); EnumOptionString(id, "Normal Skills Every Mission", "0;1;0", writing, skills_option); + EnumOptionString(id, "Normal Skills Every 2 Missions", "0;2;0", writing, skills_option); + EnumOptionString(id, "Normal Skills Every 3 Missions", "0;3;0", writing, skills_option); EnumOptionString(id, "Normal Skills Every 5 Missions", "0;5;0", writing, skills_option); EnumOptionString(id, "Blind Skill Randomization", "5;0;100", writing, skills_option); EnumOptionString(id, "Blind Skills Every Mission", "5;1;100", writing, skills_option); + EnumOptionString(id, "Blind Skills Every 2 Missions", "5;2;100", writing, skills_option); + EnumOptionString(id, "Blind Skills Every 3 Missions", "5;3;100", writing, skills_option); EnumOptionString(id, "Blind Skills Every 5 Missions", "5;5;100", writing, skills_option); f.skills_disable_downgrades = UnpackInt(skills_option); f.skills_reroll_missions = UnpackInt(skills_option); diff --git a/DeusEx/Classes/DXRPasswords.uc b/DeusEx/Classes/DXRPasswords.uc index 0b1fb4e9a..e3f4c47e4 100644 --- a/DeusEx/Classes/DXRPasswords.uc +++ b/DeusEx/Classes/DXRPasswords.uc @@ -1,6 +1,7 @@ class DXRPasswords extends DXRActorsBase; var transient DeusExNote lastCheckedNote; +var config safe_rule datacubes_rules[32]; var travel string oldpasswords[64]; var travel string newpasswords[64]; @@ -11,10 +12,73 @@ var transient int updated; function CheckConfig() { + local int i; if( config_version < class'DXRFlags'.static.VersionToInt(1,4,8) ) { min_hack_adjust = 0.5; max_hack_adjust = 1.5; } + if( config_version < class'DXRFlags'.static.VersionToInt(1,5,3) ) { + i=0; + + datacubes_rules[i].map = "04_NYC_NSFHQ"; + datacubes_rules[i].item_name = 'DataCube0';//DataCube4 too? + datacubes_rules[i].min_pos = vect(-99999, -99999, -99999); + datacubes_rules[i].max_pos = vect(99999, 99999, 99999); + datacubes_rules[i].allow = true; + i++; + + datacubes_rules[i] = datacubes_rules[i-1]; + datacubes_rules[i].item_name = 'DataCube1'; + i++; + + datacubes_rules[i] = datacubes_rules[i-1]; + datacubes_rules[i].item_name = 'DataCube3'; + i++; + + // DataCube0 and 2 + datacubes_rules[i].map = "11_PARIS_CATHEDRAL"; + datacubes_rules[i].item_name = 'DataCube0'; + datacubes_rules[i].min_pos = vect(3723, -1504, -907); //gunther room + datacubes_rules[i].max_pos = vect(5379, -399, -506); + datacubes_rules[i].allow = false; + i++; + datacubes_rules[i] = datacubes_rules[i-1]; + datacubes_rules[i].item_name = 'DataCube2'; + i++; + + datacubes_rules[i].map = "11_PARIS_CATHEDRAL"; + datacubes_rules[i].item_name = 'DataCube0';// 0 and 2 + datacubes_rules[i].min_pos = vect(3587, -812, -487); //before gunther room + datacubes_rules[i].max_pos = vect(4322, -124, 74); + datacubes_rules[i].allow = false; + i++; + datacubes_rules[i] = datacubes_rules[i-1]; + datacubes_rules[i].item_name = 'DataCube2'; + i++; + + datacubes_rules[i].map = "11_PARIS_CATHEDRAL"; + datacubes_rules[i].item_name = 'DataCube0';// 0 and 2 + datacubes_rules[i].min_pos = vect(3146, -1715, -85); //above before gunther room + datacubes_rules[i].max_pos = vect(3907, -1224, 434); + datacubes_rules[i].allow = false; + i++; + datacubes_rules[i] = datacubes_rules[i-1]; + datacubes_rules[i].item_name = 'DataCube2'; + i++; + + datacubes_rules[i].map = "11_PARIS_CATHEDRAL"; + datacubes_rules[i].item_name = 'DataCube0'; + datacubes_rules[i].min_pos = vect(-99999, -99999, -99999); + datacubes_rules[i].max_pos = vect(99999, 99999, 99999); + datacubes_rules[i].allow = true; + i++; + datacubes_rules[i] = datacubes_rules[i-1]; + datacubes_rules[i].item_name = 'DataCube2'; + i++; + } + for(i=0; i 5000 ) return False; if ( id.textTag == '' ) { diff --git a/DeusEx/Classes/DXRSkills.uc b/DeusEx/Classes/DXRSkills.uc index d3cc84f72..12fc835fc 100644 --- a/DeusEx/Classes/DXRSkills.uc +++ b/DeusEx/Classes/DXRSkills.uc @@ -33,6 +33,26 @@ function CheckConfig() if( config_version < class'DXRFlags'.static.VersionToInt(1,5,1) ) { skill_cost_curve = 2; } + if( config_version < class'DXRFlags'.static.VersionToInt(1,5,3) ) { + i=0; + SkillCostMultipliers[i].type = "SkillDemolition"; + SkillCostMultipliers[i].percent = 80; + SkillCostMultipliers[i].minLevel = 1; + SkillCostMultipliers[i].maxLevel = ArrayCount(class'Skill'.default.Cost); + i++; + + SkillCostMultipliers[i].type = "SkillSwimming"; + SkillCostMultipliers[i].percent = 80; + SkillCostMultipliers[i].minLevel = 1; + SkillCostMultipliers[i].maxLevel = ArrayCount(class'Skill'.default.Cost); + i++; + + SkillCostMultipliers[i].type = "SkillEnviro"; + SkillCostMultipliers[i].percent = 80; + SkillCostMultipliers[i].minLevel = 1; + SkillCostMultipliers[i].maxLevel = ArrayCount(class'Skill'.default.Cost); + i++; + } Super.CheckConfig(); } diff --git a/DeusEx/Classes/DXRando.uc b/DeusEx/Classes/DXRando.uc index 7434b87d9..c361b52c4 100644 --- a/DeusEx/Classes/DXRando.uc +++ b/DeusEx/Classes/DXRando.uc @@ -21,27 +21,20 @@ function SetdxInfo(DeusExLevelInfo i) dxInfo = i; localURL = Caps(dxInfo.mapName); l("SetdxInfo got localURL: " $ localURL); - PostPostBeginPlay(); + Init(); } -function PostPostBeginPlay() +function Init() { - Super.PostPostBeginPlay(); - CrcInit(); - - if( localURL == "" ) { - l("PostPostBeginPlay returning because localURL == " $ localURL); - return; - } - - l("PostPostBeginPlay has localURL == " $ localURL); + l("Init has localURL == " $ localURL); foreach AllActors(class'DeusExPlayer', Player) { break; } if( Player == None ) { - l("PostPostBeginPlay() didn't find player?"); - SetTimer(0.1, False); + l("Init() didn't find player?"); + SetTimer(0.001, False); return; } - info("found Player "$Player); + l("found Player "$Player); + CrcInit(); ClearModules(); LoadFlagsModule(); flags.LoadFlags(); @@ -164,32 +157,11 @@ function ClearModules() flags=None; } -event Destroyed() -{ - local int i; - info("Destroyed()"); - - ClearModules(); - Player = None; - Super.Destroyed(); -} - -function PreTravel() -{ - local int i; - info("PreTravel()"); - // turn off the timer - SetTimer(0, False); - - ClearModules(); - Player=None; -} - function Timer() { local int i; if( Player == None ) { - PostPostBeginPlay(); + Init(); return; } } diff --git a/DeusEx/Classes/DXRandoCrowdControlLink.uc b/DeusEx/Classes/DXRandoCrowdControlLink.uc index 847ecae5a..ba5af5895 100644 --- a/DeusEx/Classes/DXRandoCrowdControlLink.uc +++ b/DeusEx/Classes/DXRandoCrowdControlLink.uc @@ -33,7 +33,11 @@ const DefaultGroundSpeed = 320; //HK Canal freezer room has friction=1, but that doesn't //feel slippery enough to me -const IceFriction = 0.25; //Standard friction is 8 +const IceFriction = 0.25; +const NormalFriction = 8; +var vector NormalGravity; +var vector FloatGrav; +var vector MoonGrav; const ReconDefault = 5; const MatrixTimeDefault = 60; @@ -49,6 +53,20 @@ const FloorLavaTimeDefault = 60; const InvertMouseTimeDefault = 60; const InvertMovementTimeDefault = 60; +struct ZoneFriction +{ + var name zonename; + var float friction; +}; +var transient ZoneFriction zone_frictions[128]; + +struct ZoneGravity +{ + var name zonename; + var vector gravity; +}; +var transient ZoneGravity zone_gravities[128]; + //JSON parsing states const KeyState = 1; const ValState = 2; @@ -297,7 +315,7 @@ function InitOnEnter() { dxr.Player.bWarrenEMPField = isTimerActive('cc_EmpTimer'); if (isTimerActive('cc_SpeedTimer')) { - dxr.Player.Default.GroundSpeed = DefaultGroundSpeed * dxr.Flags.f.GetInt('cc_moveSpeedModifier'); + dxr.Player.Default.GroundSpeed = DefaultGroundSpeed * dxr.Player.FlagBase.GetInt('cc_moveSpeedModifier'); } else { dxr.Player.Default.GroundSpeed = DefaultGroundSpeed; } @@ -317,15 +335,15 @@ function InitOnEnter() { dxr.Player.bBehindView=isTimerActive('cc_behindTimer'); - if (0==dxr.Flags.f.GetFloat('cc_damageMult')) { - dxr.Flags.f.SetFloat('cc_damageMult',1.0); + if (0==dxr.Player.FlagBase.GetFloat('cc_damageMult')) { + dxr.Player.FlagBase.SetFloat('cc_damageMult',1.0); } if (!isTimerActive('cc_DifficultyTimer')) { - dxr.Flags.f.SetFloat('cc_damageMult',1.0); + dxr.Player.FlagBase.SetFloat('cc_damageMult',1.0); } if (isTimerActive('cc_invertMouseTimer')) { - dxr.Player.bInvertMouse = !dxr.Flags.f.GetBool('cc_InvertMouseDef'); + dxr.Player.bInvertMouse = !dxr.Player.FlagBase.GetBool('cc_InvertMouseDef'); } if (isTimerActive('cc_invertMovementTimer')) { @@ -348,7 +366,7 @@ function CleanupOnExit() { dxr.Player.bBehindView = False; //third_person SetFloatyPhysics(False); if (isTimerActive('cc_invertMouseTimer')) { - dxr.Player.bInvertMouse = dxr.Flags.f.GetBool('cc_InvertMouseDef'); + dxr.Player.bInvertMouse = dxr.Player.FlagBase.GetBool('cc_InvertMouseDef'); } if (isTimerActive('cc_invertMovementTimer')) { @@ -376,24 +394,24 @@ function StopMatrixMode(optional bool silent) { } function int getTimer(name timerName) { - return dxr.flags.f.GetInt(timerName); + return dxr.Player.FlagBase.GetInt(timerName); } function bool isTimerActive(name timerName) { - return (dxr.flags.f.GetInt(timerName) > 0); + return (dxr.Player.FlagBase.GetInt(timerName) > 0); } function setTimerFlag(name timerName,int time) { - dxr.flags.f.SetInt(timerName,time); + dxr.Player.FlagBase.SetInt(timerName,time); } //Timers only decrement while playing function bool decrementTimer(name timerName) { local int time; - time = dxr.flags.f.GetInt(timerName); + time = dxr.Player.FlagBase.GetInt(timerName); if (time>0 && InGame()) { time -= 1; - dxr.flags.f.SetInt(timerName,time); + dxr.Player.FlagBase.SetInt(timerName,time); return (time == 0); } @@ -445,7 +463,7 @@ function Timer() { } if (isTimerActive('cc_SpeedTimer')) { - dxr.Player.Default.GroundSpeed = DefaultGroundSpeed * dxr.Flags.f.GetInt('cc_moveSpeedModifier'); + dxr.Player.Default.GroundSpeed = DefaultGroundSpeed * dxr.Player.FlagBase.GetInt('cc_moveSpeedModifier'); } if (decrementTimer('cc_SpeedTimer')) { dxr.Player.Default.GroundSpeed = DefaultGroundSpeed; @@ -469,7 +487,7 @@ function Timer() { } if (decrementTimer('cc_DifficultyTimer')){ - dxr.Flags.f.SetFloat('cc_damageMult',1.0); + dxr.Player.FlagBase.SetFloat('cc_damageMult',1.0); PlayerMessage("Your body returns to its normal toughness"); } @@ -484,7 +502,7 @@ function Timer() { if (decrementTimer('cc_invertMouseTimer')) { PlayerMessage("Your mouse controls return to normal"); - dxr.Player.bInvertMouse = dxr.Flags.f.GetBool('cc_InvertMouseDef'); + dxr.Player.bInvertMouse = dxr.Player.FlagBase.GetBool('cc_InvertMouseDef'); } if (decrementTimer('cc_invertMovementTimer')) { @@ -797,38 +815,98 @@ function int RemoveAug(Class giveClass, string viewer) { return Success; } + +function float GetDefaultZoneFriction(ZoneInfo z) +{ + local int i; + for(i=0; i