private void OnSaveStart() { //restore lost AI behaviours! try { var partyIDToData = Data.SpawnDataManager.Instance.PartyIDToData; foreach (MobileParty mb in MobileParty.All) { string id = CampaignUtils.IsolateMobilePartyStringID(mb); if (id != "" && partyIDToData.ContainsKey(id)) { var spawnData = partyIDToData[id]; Spawn.Spawner.HandleAIChecks(mb, spawnData, mb.HomeSettlement); } } }catch (Exception e) { ErrorHandler.HandleException(e, " reconstruction of save custom spawns mobile party data"); } }
public override float CalculateFinalSpeed(MobileParty mobileParty, float baseSpeed, StatExplainer explanation) { try { PartyBase party = mobileParty.Party; ExplainedNumber explainedNumber = new ExplainedNumber(baseSpeed, explanation, null); explainedNumber.LimitMin(1f); string key = CampaignUtils.IsolateMobilePartyStringID(mobileParty); //TODO if this is non-trivial make it more efficient if (partyIDToBaseSpeed.ContainsKey(key) && partyIDToBaseSpeed[key] != float.MinValue) { float bs = partyIDToBaseSpeed[key]; explainedNumber.Add(bs - explainedNumber.ResultNumber, explanationText); } else if (partyIDToExtraSpeed.ContainsKey(key)) { float extra = partyIDToExtraSpeed[key]; explainedNumber.Add(extra, explanationText); } TerrainType faceTerrainType = Campaign.Current.MapSceneWrapper.GetFaceTerrainType(mobileParty.CurrentNavigationFace); float num = explainedNumber.ResultNumber; if (partyIDToMinimumSpeed.ContainsKey(key))//minimum adjustment { num = Math.Max(num, partyIDToMinimumSpeed[key]); } else { explainedNumber.LimitMin(1f); } if (partyIDToMaximumSpeed.ContainsKey(key))//maximum adjustment { num = Math.Min(num, partyIDToMaximumSpeed[key]); } explainedNumber.Add(num - explainedNumber.ResultNumber, new TextObject("Custom Spawns final modification")); if (faceTerrainType == TerrainType.Forest) { explainedNumber.AddFactor(-0.3f, _movingInForest); PerkHelper.AddFeatBonusForPerson(DefaultFeats.Cultural.BattanianForestAgility, mobileParty.Leader, ref explainedNumber); } else if (faceTerrainType == TerrainType.Water || faceTerrainType == TerrainType.River || faceTerrainType == TerrainType.Bridge || faceTerrainType == TerrainType.ShallowRiver) { explainedNumber.AddFactor(-0.3f, _fordEffect); } if (Campaign.Current.IsNight) { explainedNumber.AddFactor(-0.25f, _night); } if (faceTerrainType == TerrainType.Snow) { explainedNumber.AddFactor(-0.1f, _snow); if (party.Leader != null) { PerkHelper.AddFeatBonusForPerson(DefaultFeats.Cultural.SturgianSnowAgility, party.Leader, ref explainedNumber); } } return(explainedNumber.ResultNumber); } catch (Exception e) { ErrorHandler.HandleException(e, " MOBILE PARTY FINAL SPEED CALCULATION "); return(1f); } }