public override PirateLogic DefenseBaseLogic()
        {
            AsteroidDodger dodger = new AsteroidDodger();
            PirateLogic    logic  = new PirateLogic(dodger);

            return(logic);
        }
        public PirateLogic BaseLogic()
        {
            AsteroidDodger dodger = new AsteroidDodger();
            PirateLogic    logic  = new PirateLogic(dodger);

            return(logic);
        }
        public LogicedPirateSquad[] LogicDefenders(Squad squad)
        {
            #region Distrbution
            if (squad.Count <= 0)
            {
                return(new LogicedPirateSquad[0]);
            }

            int EnemyMotherships = Bot.Engine.EnemyMotherships.Length;
            #endregion Distrbution

            PirateLogic BaseLogic = DefenseBaseLogic();

            LogicedPirateSquad[] Squads = new LogicedPirateSquad[0];
            for (int idx = 0; idx < EnemyMotherships; idx++)
            {
                Mothership Target       = Bot.Engine.EnemyMotherships[idx];
                Squad      CurrentSquad = squad.Take(Deploy(Target)).ToList();

                squad = squad.FilterOutBySquad(CurrentSquad);

                if (CurrentSquad.Count <= 0)
                {
                    continue;
                }

                LogicedPirateSquad LogicedCurrentSquad = new LogicedPirateSquad(CurrentSquad.Select(x => x.LogicPirate(BaseLogic)).ToArray(),
                                                                                DefenseLogic(Target));

                Squads = Squads.Concat(new LogicedPirateSquad[] { LogicedCurrentSquad }).ToArray();
            }

            return(Squads);
        }
        ////////////////

        public bool GiveOffer(long offerAmount)
        {
            var logic = PirateLogic.Instance;

            if (this.OfferTested == -1)
            {
                this.OfferTested = offerAmount;

                HaggleAmount replyType = PirateLogic.GaugeOffer(logic.ComputedDemand, offerAmount);
                Main.npcChatText = PirateNegotiatorTownNPC.HaggleReplies[replyType];
            }
            else
            {
                HaggleAmount replyType = PirateLogic.GaugeOffer(logic.ComputedDemand, offerAmount);
                Main.npcChatText = PirateNegotiatorTownNPC.OfferReplies[replyType];

                if (this.OfferTested > offerAmount)
                {
                    Main.npcChatText += "\n " + PirateNegotiatorTownNPC.OfferReduceReply;
                }

                this.OfferAmount = offerAmount;
            }

            return(this.OfferAmount > 0);
        }
Пример #5
0
    /// <summary>
    /// Creates a new generation by using GenerateBoxes and GenerateBoats/Pirates.
    /// Previous generations will be removed and the best parents will be selected and used to create the new generation.
    /// The best parents (top 1) of the generation will be stored as a Prefab in the [savePrefabsAt] folder. Their name
    /// will use the [generationCount] as an identifier.
    /// </summary>
    public void MakeNewGeneration()
    {
        GenerateBoxes();

        //Fetch parents
        _activeBoats.RemoveAll(item => item == null);
        _activeBoats.Sort();

        Vector3 shipData = GetShipData();

        if (_activeBoats.Count == 0)
        {
            GenerateBoats(_boatParents);
        }
        _boatParents = new BoatLogic[boatParentSize];
        for (int i = 0; i < boatParentSize; i++)
        {
            _boatParents[i] = _activeBoats[i];
        }

        BoatLogic lastBoatWinner = _activeBoats[0];

        lastBoatWinner.name += "Gen-" + generationCount;
        lastBoatWinnerData   = lastBoatWinner.GetData();
        PrefabUtility.SaveAsPrefabAsset(lastBoatWinner.gameObject, savePrefabsAt + lastBoatWinner.name + ".prefab");

        _activePirates.RemoveAll(item => item == null);
        _activePirates.Sort();

        Vector3 pirateData = GetPirateData();

        _pirateParents = new PirateLogic[pirateParentSize];
        for (int i = 0; i < pirateParentSize; i++)
        {
            _pirateParents[i] = _activePirates[i];
        }

        PirateLogic lastPirateWinner = _activePirates[0];

        lastPirateWinner.name += "Gen-" + generationCount;
        lastPirateWinnerData   = lastPirateWinner.GetData();
        PrefabUtility.SaveAsPrefabAsset(lastPirateWinner.gameObject, savePrefabsAt + lastPirateWinner.name + ".prefab");

        _dataCollector.AddData(shipData, pirateData);

        //Winners:
        Debug.Log("Last winner boat had: " + lastBoatWinner.GetPoints() + " points!" + " Last winner pirate had: " + lastPirateWinner.GetPoints() + " points!");

        GenerateObjects(_boatParents, _pirateParents);
    }
        public LogicedPirateSquad[] LogicAttackers(Squad squad)
        {
            #region Distrbution
            if (squad.Count <= 0)
            {
                return(new LogicedPirateSquad[0]);
            }

            int Mines = Bot.Engine.MyCapsules.Length;
            #endregion Distrbution
            PirateLogic BaseLogic = AttackBaseLogic();

            LogicedPirateSquad[] Squads = new LogicedPirateSquad[0];
            for (int idx = 0; idx < Mines; idx++)
            {
                Capsule Target = Bot.Engine.MyCapsules[idx];

                Squad CurrentSquad = squad.Take(Deploy(Target)).ToList();

                squad = squad.FilterOutBySquad(CurrentSquad);

                if (CurrentSquad.Count <= 0)
                {
                    continue;
                }

                SquadLogic ChaserLogic = CapsuleChaserLogic(Target);
                SquadLogic CamperLogic = CapsuleCamperLogic(Target);

                LogicedPirateSquad[] LogicedCurrentSquads;

                if (Target.IsHeld() && CurrentSquad.ContainsPirate(Target.Holder) && CurrentSquad.LivingPirates().Count > 2)
                {
                    Squad CapsuleChasers = new Squad(CurrentSquad.LivingPirates().FilterOutById(Target.Holder.Id).OrderBy(x => System.Math.Max(x.PushReloadTurns, x.TurnsToReach(Target))).Take(Target.Holder.NumPushesForCapsuleLoss - 1)).AddPirates((PirateShip)Target.Holder);
                    Squad CapsuleCampers = CurrentSquad.FilterOutBySquad(CapsuleChasers);

                    LogicedCurrentSquads = new LogicedPirateSquad[] { new LogicedPirateSquad(CapsuleCampers.Select(x => x.LogicPirate(BaseLogic)).ToArray(), CamperLogic),
                                                                      new LogicedPirateSquad(CapsuleChasers.Select(x => x.LogicPirate(BaseLogic)).ToArray(), ChaserLogic) };
                }
                else
                {
                    LogicedCurrentSquads = new LogicedPirateSquad[] { new LogicedPirateSquad(CurrentSquad.Select(x => x.LogicPirate(BaseLogic)).ToArray(), ChaserLogic) };
                }

                Squads = Squads.Concat(LogicedCurrentSquads).ToArray();
            }
            return(Squads);
        }
        public LogicedPirateSquad[] AssignSquads(PirateShip[] pirates)
        {
            int Count      = Bot.Engine.MyPirates.Count;
            int AttackSize = Count / 2 + Count % 2;

            Squad AttackSquad  = new Squad(pirates).Filter(x => x.Id < Count);
            Squad DefenseSquad = new Squad(pirates).Filter(x => x.Id >= Count);

            PirateLogic BaseLogic    = this.BaseLogic();
            SquadLogic  AttackLogic  = this.AttackLogic();
            SquadLogic  DefenseLogic = this.DefenseLogic();

            LogicedPirateSquad LogicedAttackSquad = new LogicedPirateSquad(AttackSquad.Select(x => x.LogicPirate(BaseLogic)).ToArray(),
                                                                           AttackLogic);
            LogicedPirateSquad LogicedDefenseSquad = new LogicedPirateSquad(AttackSquad.Select(x => x.LogicPirate(BaseLogic)).ToArray(),
                                                                            DefenseLogic);

            return(new LogicedPirateSquad[] { LogicedAttackSquad, LogicedDefenseSquad });
        }
    //Similarly generate abled pirates
    private void GenerateAbledPirates(PirateLogic[] abledPirateParents)
    {
        _activeAbledPirates = new List <PirateLogic>();
        List <GameObject> objects = abledPirateGenerator.RegenerateObjects();

        foreach (GameObject obj in objects)
        {
            PirateLogic pirate = obj.GetComponent <PirateLogic>();
            if (pirate != null)
            {
                _activeAbledPirates.Add(pirate);
                if (abledPirateParents != null)
                {
                    PirateLogic pirateParent = abledPirateParents[Random.Range(0, abledPirateParents.Length)];
                    pirate.Birth(pirateParent.GetData());
                }

                pirate.Mutate(mutationFactor, mutationChance);
                pirate.AwakeUp();
            }
        }
    }
Пример #9
0
    private void GeneratePiratesArithmeticCrossover(PirateLogic[] pirateParents)
    {
        _activePirates = new List <PirateLogic>();
        List <GameObject> objects = pirateGenerator.RegenerateObjects();

        foreach (GameObject obj in objects)
        {
            PirateLogic pirate = obj.GetComponent <PirateLogic>();
            if (pirate != null)
            {
                _activePirates.Add(pirate);
                if (pirateParents != null)
                {
                    PirateLogic firstPirateParent  = pirateParents[Random.Range(0, pirateParents.Length)];
                    PirateLogic secondPirateParent = pirateParents[Random.Range(0, pirateParents.Length)];
                    pirate.BirthArithmeticCrossover(firstPirateParent.GetData(), secondPirateParent.GetData());
                }

                pirate.Mutate(mutationFactor, mutationChance);
                pirate.AwakeUp();
            }
        }
    }
Пример #10
0
        public LogicedPirateSquad[] AssignSquads(PirateShip[] pirates)
        {
            // Private cases
            if (Bot.Engine.Enemy.BotName == "25767")
            {
                DefensePushMapper = (obj, attackers) => {
                    PushMapping pm = (obj is Pirate && ((Pirate)obj).HasCapsule()) ? Bot.Engine.DefaultPush(obj, attackers, true) : Bot.Engine.DefaultPush(obj, attackers);
                    return(new PushMapping(pm.attackers, new Location(Bot.Engine.Rows - pm.dest.Row, Bot.Engine.Cols - pm.dest.Col)));
                }
            }
            ;


            // Initialize BaseLogic
            AttackBaseLogic = new PirateLogic().AttachPlugin(new Week3Custom.EtgarimWeek3Plugin()).AttachPlugin(new AsteroidDodger((ast, p) =>
            {
                /*
                 * Location nm = Bot.Engine.MyMotherships.Nearest(p).Location;
                 * Line l = new Line(ast, nm);
                 * return l.IsProjectionOnLine(p) ? AsteroidDodger.TangentPush(ast, p) : nm;
                 */
                Squad PossibleTargets = Bot.Engine.EnemyLivingPirates.Filter(enemy =>
                {
                    Line l          = new Line(enemy, ast);
                    bool ShouldPush = !l.IsProjectionOnLine(p) || l.Distance(p) > ast.Size * 1.5;
                    return(ShouldPush);
                });
                if (!PossibleTargets.IsEmpty())
                {
                    return(PossibleTargets.FirstBy(x => x.Distance(ast)).Location);
                }
                else
                {
                    return(AsteroidDodger.TangentPush(ast, p));
                }
            }
                                                                                                                                   ))
                              .AttachPlugin(new EmergencyCapsulePusherPlugin()).AttachPlugin(new PortalOptimizer());
            DefenseBaseLogic = new PirateLogic().AttachPlugin(new Week3Custom.EtgarimWeek3Plugin()).AttachPlugin(new AsteroidDodger((ast, p) =>
            {
                Squad PossibleTargets = Bot.Engine.EnemyLivingPirates.Filter(enemy =>
                {
                    Line l          = new Line(enemy, ast);
                    bool ShouldPush = !l.IsProjectionOnLine(p) || l.Distance(p) > ast.Size * 1.5;
                    return(ShouldPush);
                });
                if (!PossibleTargets.IsEmpty())
                {
                    return(PossibleTargets.FirstBy(x => x.Distance(ast)).Location);
                }
                else
                {
                    return(AsteroidDodger.TangentPush(ast, p));
                }
            }))
                               .AttachPlugin(new EmergencyCapsulePusherPlugin());

            // Not good practice
            pirates = Bot.Engine.MyPirates.ToArray();

            Tuple <int, int> Sizes = AssignSizes();
            int AttackSize         = Sizes.arg0;
            int DefenseSize        = Sizes.arg1;

            Squad AttackSquad  = new Squad(pirates.Where(x => x.Id < AttackSize));
            Squad DefenseSquad = new Squad(pirates.Where(x => x.Id >= AttackSize));

            LogicedPirateSquad[] AttackerPirates = LogicAttackers(AttackSquad);
            LogicedPirateSquad[] DefenderPirates = LogicDefenders(DefenseSquad);

            Bot.Engine.Debug("Testing pirates...");
            // Not good practice
            return(AttackerPirates.Concat(DefenderPirates).Select(x =>
            {
                Bot.Engine.Debug(new Squad(x.LogicedPirates.Select(y => y.pirate)));
                return new LogicedPirateSquad(x.LogicedPirates.Where(y => y.pirate.Alive).ToArray(), x.Logic);
            }).ToArray());
        }
Пример #11
0
    /// <summary>
    /// Creates a new generation by using GenerateBoxes and GenerateBoats/Pirates.
    /// Previous generations will be removed and the best parents will be selected and used to create the new generation.
    /// The best parents (top 1) of the generation will be stored as a Prefab in the [savePrefabsAt] folder. Their name
    /// will use the [generationCount] as an identifier.
    /// </summary>
    public void MakeNewGeneration()
    {
        GenerateBoxes();

        //Fetch parents
        _activeBoats.RemoveAll(item => item == null);
        _activeBoats.Sort();
        if (_activeBoats.Count == 0)
        {
            GenerateBoats(_boatParents);
        }
        _boatParents = new BoatLogic[boatParentSize];
        for (int i = 0; i < boatParentSize; i++)
        {
            _boatParents[i] = _activeBoats[i];
        }

        BoatLogic lastBoatWinner = _activeBoats[0];

        lastBoatWinner.name += "Gen-" + generationCount;
        lastBoatWinnerData   = lastBoatWinner.GetData();
        PrefabUtility.SaveAsPrefabAsset(lastBoatWinner.gameObject, savePrefabsAt + lastBoatWinner.name + ".prefab");
        boatRoundScores = 0;
        foreach (BoatLogic boat in _activeBoats)
        {
            boatRoundScores += boat.GetPoints();
        }
        boatTotalScores += boatRoundScores;
        _activePirates.RemoveAll(item => item == null);
        _activePirates.Sort();
        _pirateParents = new PirateLogic[pirateParentSize];
        for (int i = 0; i < pirateParentSize; i++)
        {
            _pirateParents[i] = _activePirates[i];
        }

        PirateLogic lastPirateWinner = _activePirates[0];

        pirateRoundScores = 0;
        foreach (PirateLogic pirate in _activePirates)
        {
            pirateRoundScores += pirate.GetPoints();
        }
        pirateTotalScores     += pirateRoundScores;
        lastPirateWinner.name += "Gen-" + generationCount;
        lastPirateWinnerData   = lastPirateWinner.GetData();
        PrefabUtility.SaveAsPrefabAsset(lastPirateWinner.gameObject, savePrefabsAt + lastPirateWinner.name + ".prefab");
        //Winners:

        //Storing results
        string path = "Assets/Overallresults.txt";
        //Write some text to the test.txt file
        StreamWriter writer = new StreamWriter(path, true);

        writer.WriteLine("Generations count" + generationCount + "||Total boats:" + boatTotalScores + "||TotalPiratesScores:" + pirateTotalScores);
        writer.Close();
        path   = "Assets/BoatsTotalScores.txt";
        writer = new StreamWriter(path, true);
        writer.WriteLine(boatTotalScores);
        writer.Close();
        path   = "Assets/PiratesTotalScores.txt";
        writer = new StreamWriter(path, true);
        writer.WriteLine(pirateTotalScores);
        writer.Close();
        path   = "Assets/BoatsRoundScores.txt";
        writer = new StreamWriter(path, true);
        writer.WriteLine(boatRoundScores);
        writer.Close();
        path   = "Assets/PiratesRoundScores.txt";
        writer = new StreamWriter(path, true);
        writer.WriteLine(pirateRoundScores);
        writer.Close();

        Debug.Log("Last winner boat had: " + lastBoatWinner.GetPoints() + " points!" + " Last winner pirate had: " + lastPirateWinner.GetPoints() + " points!");
        Debug.Log("Total boats:" + boatTotalScores + "||Round boats:" + boatRoundScores + "||TotalPiratesScores:" + pirateTotalScores + "||PiratesRoundScores" + pirateRoundScores);
        GenerateObjects(_boatParents, _pirateParents);
    }
Пример #12
0
        ////////////////

        public override void OnInitialize()
        {
            var   logic   = PDYBWorld.PirateLogic;
            float xOffset = 8f;
            float yOffset = 0f;

            this.InitializeCoinInput(
                "Platinum coins",
                MiscHelpers.PlatinumCoinColor,
                v => this.SetValue(v, ItemID.PlatinumCoin),
                ref xOffset,
                ref yOffset);
            this.InitializeCoinInput(
                "Gold coins",
                MiscHelpers.GoldCoinColor,
                v => this.SetValue(v, ItemID.GoldCoin),
                ref xOffset,
                ref yOffset);
            this.InitializeCoinInput(
                "Silver coins",
                MiscHelpers.SilverCoinColor,
                v => this.SetValue(v, ItemID.SilverCoin),
                ref xOffset,
                ref yOffset);
            this.InitializeCoinInput(
                "Copper coins",
                MiscHelpers.CopperCoinColor,
                v => this.SetValue(v, ItemID.CopperCoin),
                ref xOffset,
                ref yOffset);

            yOffset += 72f;

            this.OfferButtonElem = new UITextPanelButton(this.Theme, "Test Offer");
            this.OfferButtonElem.Left.Set(8f, 0f);
            this.OfferButtonElem.Top.Set(yOffset, 0f);
            this.OfferButtonElem.OnClick += (_, __) => {
                foreach (var toggleable in this.Components)
                {
                    var input = toggleable as UITextInputAreaPanel;
                    if (input?.HasFocus ?? false)
                    {
                        input.Unfocus();
                    }
                }
                this.MakeOffer();
            };

            string unit  = PirateLogic.GetHighestCoinTypeOfGivenDemand(logic.ComputedDemand, out bool tensOf);
            string range = tensOf ? "10-99" : "0-10";

            var titleElem = new UIThemedText(this.Theme, false, "Pirate hints at " + range + " " + unit);

            titleElem.Left.Set(-256f, 1f);
            titleElem.Top.Set(yOffset, 0f);
            this.AppendThemed(titleElem);

            this.AppendThemed(this.OfferButtonElem);
            this.Components.Add(this.OfferButtonElem);

            this.Close();
        }
Пример #13
0
 public LogicedPirate LogicPirate(PirateLogic logic)
 {
     return(new LogicedPirate(this, logic));
 }
Пример #14
0
 public LogicedPirate(PirateShip s, PirateLogic logic)
 {
     this.pirate = s;
     this.logic  = logic;
 }