コード例 #1
0
ファイル: DebugAutotests.cs プロジェクト: KraigXu/GameProject
        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));
        }
コード例 #2
0
 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);
 }
コード例 #3
0
        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;
        }
コード例 #4
0
 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));
         }
     }
 }
コード例 #5
0
ファイル: DebugAutotests.cs プロジェクト: KraigXu/GameProject
        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);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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);
            });
        }
コード例 #8
0
ファイル: DebugAutotests.cs プロジェクト: KraigXu/GameProject
 private static void BattleRoyaleHumanlikes()
 {
     ArenaUtility.PerformBattleRoyale(DefDatabase <PawnKindDef> .AllDefs.Where((PawnKindDef k) => k.RaceProps.Humanlike));
 }
コード例 #9
0
ファイル: DebugAutotests.cs プロジェクト: KraigXu/GameProject
 private static void BattleRoyaleAllPawnKinds()
 {
     ArenaUtility.PerformBattleRoyale(DefDatabase <PawnKindDef> .AllDefs);
 }