private static void TestTimeToDown() { List <DebugMenuOption> list = new List <DebugMenuOption>(); foreach (PawnKindDef kindDef in DefDatabase <PawnKindDef> .AllDefs.OrderBy((PawnKindDef kd) => kd.defName)) { list.Add(new DebugMenuOption(kindDef.label, DebugMenuOptionMode.Action, delegate { if (kindDef == PawnKindDefOf.Colonist) { Log.Message("Current colonist TTD reference point: 22.3 seconds, stddev 8.35 seconds"); } List <float> results = new List <float>(); List <PawnKindDef> list2 = new List <PawnKindDef>(); List <PawnKindDef> list3 = new List <PawnKindDef>(); list2.Add(kindDef); list3.Add(kindDef); ArenaUtility.BeginArenaFightSet(1000, list2, list3, delegate(ArenaUtility.ArenaResult result) { if (result.winner != 0) { results.Add(result.tickDuration.TicksToSeconds()); } }, delegate { Log.Message($"Finished {results.Count} tests; time-to-down {results.Average()}, stddev {GenMath.Stddev(results)}\n\nraw: {results.Select((float res) => res.ToString()).ToLineList()}"); }); })); } Find.WindowStack.Add(new Dialog_DebugOptionListLister(list)); }
private static bool ArenaFightQueue(List <PawnKindDef> lhs, List <PawnKindDef> rhs, Action <ArenaUtility.ArenaResult> callback, ArenaUtility.ArenaSetState state) { if (state.live < 15) { ArenaUtility.BeginArenaFight(lhs, rhs, delegate(ArenaUtility.ArenaResult result) { state.live--; callback(result); }); state.live++; return(true); } return(false); }
public static void BeginArenaFight(List <PawnKindDef> lhs, List <PawnKindDef> rhs, Action <ArenaUtility.ArenaResult> callback) { MapParent mapParent = (MapParent)WorldObjectMaker.MakeWorldObject(WorldObjectDefOf.Debug_Arena); mapParent.Tile = TileFinder.RandomSettlementTileFor(Faction.OfPlayer, true, (int tile) => lhs.Concat(rhs).Any((PawnKindDef pawnkind) => Find.World.tileTemperatures.SeasonAndOutdoorTemperatureAcceptableFor(tile, pawnkind.race))); mapParent.SetFaction(Faction.OfPlayer); Find.WorldObjects.Add(mapParent); Map orGenerateMap = GetOrGenerateMapUtility.GetOrGenerateMap(mapParent.Tile, new IntVec3(50, 1, 50), null); IntVec3 spot; IntVec3 spot2; MultipleCaravansCellFinder.FindStartingCellsFor2Groups(orGenerateMap, out spot, out spot2); List <Pawn> lhs2 = ArenaUtility.SpawnPawnSet(orGenerateMap, lhs, spot, Faction.OfAncients); List <Pawn> rhs2 = ArenaUtility.SpawnPawnSet(orGenerateMap, rhs, spot2, Faction.OfAncientsHostile); DebugArena component = mapParent.GetComponent <DebugArena>(); component.lhs = lhs2; component.rhs = rhs2; component.callback = callback; }
public static void BeginArenaFightSet(int count, List <PawnKindDef> lhs, List <PawnKindDef> rhs, Action <ArenaUtility.ArenaResult> callback, Action report) { if (ArenaUtility.ValidateArenaCapability()) { int remaining = count; ArenaUtility.ArenaSetState state = new ArenaUtility.ArenaSetState(); for (int i = 0; i < count; i++) { Current.Game.GetComponent <GameComponent_DebugTools>().AddPerFrameCallback(() => ArenaUtility.ArenaFightQueue(lhs, rhs, delegate(ArenaUtility.ArenaResult result) { callback(result); remaining--; if (remaining % 10 == 0) { report(); } }, state)); } } }
private static void BattleRoyaleByDamagetype() { PawnKindDef[] array = new PawnKindDef[2] { PawnKindDefOf.Colonist, PawnKindDefOf.Muffalo }; IEnumerable <ToolCapacityDef> enumerable = DefDatabase <ToolCapacityDef> .AllDefsListForReading.Where((ToolCapacityDef tc) => tc != ToolCapacityDefOf.KickMaterialInEyes); Func <PawnKindDef, ToolCapacityDef, string> func = (PawnKindDef pkd, ToolCapacityDef dd) => $"{pkd.label}_{dd.defName}"; if (pawnKindsForDamageTypeBattleRoyale == null) { pawnKindsForDamageTypeBattleRoyale = new List <PawnKindDef>(); PawnKindDef[] array2 = array; foreach (PawnKindDef pawnKindDef in array2) { foreach (ToolCapacityDef toolType in enumerable) { string text = func(pawnKindDef, toolType); ThingDef thingDef = Gen.MemberwiseClone(pawnKindDef.race); thingDef.defName = text; thingDef.label = text; thingDef.tools = new List <Tool>(pawnKindDef.race.tools.Select(delegate(Tool tool) { Tool tool2 = Gen.MemberwiseClone(tool); tool2.capacities = new List <ToolCapacityDef>(); tool2.capacities.Add(toolType); return(tool2); })); PawnKindDef pawnKindDef2 = Gen.MemberwiseClone(pawnKindDef); pawnKindDef2.defName = text; pawnKindDef2.label = text; pawnKindDef2.race = thingDef; pawnKindsForDamageTypeBattleRoyale.Add(pawnKindDef2); } } } ArenaUtility.PerformBattleRoyale(pawnKindsForDamageTypeBattleRoyale); }
private static bool ArenaFightQueue(List <PawnKindDef> lhs, List <PawnKindDef> rhs, Action <ArenaUtility.ArenaResult> callback, ArenaUtility.ArenaSetState state) { bool result2; if (!ArenaUtility.ValidateArenaCapability()) { result2 = false; } else if (state.live < 15) { ArenaUtility.BeginArenaFight(lhs, rhs, delegate(ArenaUtility.ArenaResult result) { state.live--; callback(result); }); state.live++; result2 = true; } else { result2 = false; } return(result2); }
public static void PerformBattleRoyale(IEnumerable <PawnKindDef> kindsEnumerable) { if (!ArenaUtility.ValidateArenaCapability()) { return; } List <PawnKindDef> kinds = kindsEnumerable.ToList <PawnKindDef>(); Dictionary <PawnKindDef, float> ratings = new Dictionary <PawnKindDef, float>(); foreach (PawnKindDef pawnKindDef in kinds) { ratings[pawnKindDef] = EloUtility.CalculateRating(pawnKindDef.combatPower, 1500f, 60f); } int currentFights = 0; int completeFights = 0; Current.Game.GetComponent <GameComponent_DebugTools>().AddPerFrameCallback(delegate { if (currentFights >= 15) { return(false); } PawnKindDef lhsDef = kinds.RandomElement <PawnKindDef>(); PawnKindDef rhsDef = kinds.RandomElement <PawnKindDef>(); float num = EloUtility.CalculateExpectation(ratings[lhsDef], ratings[rhsDef]); float num2 = 1f - num; float num3 = num; float num4 = Mathf.Min(num2, num3); num2 /= num4; num3 /= num4; float num5 = Mathf.Max(num2, num3); if (num5 > 40f) { return(false); } float num6 = 40f / num5; float num7 = (float)Math.Exp((double)Rand.Range(0f, (float)Math.Log((double)num6))); num2 *= num7; num3 *= num7; List <PawnKindDef> lhs = Enumerable.Repeat <PawnKindDef>(lhsDef, GenMath.RoundRandom(num2)).ToList <PawnKindDef>(); List <PawnKindDef> rhs = Enumerable.Repeat <PawnKindDef>(rhsDef, GenMath.RoundRandom(num3)).ToList <PawnKindDef>(); currentFights++; ArenaUtility.BeginArenaFight(lhs, rhs, delegate(ArenaUtility.ArenaResult result) { currentFights--; completeFights++; if (result.winner != ArenaUtility.ArenaResult.Winner.Other) { float value = ratings[lhsDef]; float value2 = ratings[rhsDef]; float kfactor = 8f * Mathf.Pow(0.5f, Time.realtimeSinceStartup / 900f); EloUtility.Update(ref value, ref value2, 0.5f, (float)((result.winner != ArenaUtility.ArenaResult.Winner.Lhs) ? 0 : 1), kfactor); ratings[lhsDef] = value; ratings[rhsDef] = value2; Log.Message(string.Format("Scores after {0} trials:\n\n{1}", completeFights, (from v in ratings orderby v.Value select string.Format(" {0}: {1}->{2} (rating {2})", new object[] { v.Key.label, v.Key.combatPower, EloUtility.CalculateLinearScore(v.Value, 1500f, 60f).ToString("F0"), v.Value.ToString("F0") })).ToLineList(null)), false); } }); return(false); }); }
private static void BattleRoyaleHumanlikes() { ArenaUtility.PerformBattleRoyale(DefDatabase <PawnKindDef> .AllDefs.Where((PawnKindDef k) => k.RaceProps.Humanlike)); }
private static void BattleRoyaleAllPawnKinds() { ArenaUtility.PerformBattleRoyale(DefDatabase <PawnKindDef> .AllDefs); }