Пример #1
0
        protected override async Task ActionAsync(MainRepository repo)
        {
            var management = await repo.Character.GetManagementByAiCharacterIdAsync(this.Character.Id);

            if (management.HasData)
            {
                var m = management.Data;
                this.Management = m;

                var holder = await repo.Character.GetByIdAsync(m.HolderCharacterId);

                if (holder.HasData)
                {
                    if (holder.Data.HasRemoved)
                    {
                        this.Character.DeleteTurn = (short)Config.DeleteTurns;
                        return;
                    }
                    else if (holder.Data.DeleteTurn > 0)
                    {
                        // 主人が放置削除中は自分も何もしない
                        return;
                    }
                }
                else
                {
                    this.Character.DeleteTurn = (short)Config.DeleteTurns;
                    return;
                }

                if (this.Country == null || this.Character.CountryId == 0 || holder.Data.CountryId == 0)
                {
                    // 所持者の国が消えたらこっちも削除する
                    this.Character.DeleteTurn = (short)Config.DeleteTurns;
                    return;
                }

                this.Character.Money = 100_0000;
                this.Character.Rice  = 100_0000;
                var r = false;
                if (m.Action == AiCharacterAction.Assault || m.Action == AiCharacterAction.Attack)
                {
                    r = r || await this.InputMoveToBorderTownAsync(repo) || await this.InputBattleAsync(repo);
                }
                else if (m.Action == AiCharacterAction.Defend)
                {
                    r = r || await this.InputMoveToBorderTownAsync(repo) || await this.InputDefendAsync(repo);
                }
                else if (m.Action == AiCharacterAction.DomesticAffairs)
                {
                    r = r || await this.InputMoveToDevelopTownForceAsync(repo) || this.InputDevelop();
                }

                if (!r)
                {
                    this.InputPolicyForce();
                }
            }
        }
Пример #2
0
        public override async Task ExecuteAsync(MainRepository repo, Character character, IEnumerable <CharacterCommandParameter> options, CommandSystemData game)
        {
            var countryOptional = await repo.Country.GetByIdAsync(character.CountryId);

            if (!countryOptional.HasData)
            {
                await game.CharacterLogAsync($"別動隊を雇おうとしましたが、あなたの国はすでに滅亡しているか無所属です");

                return;
            }
            var country = countryOptional.Data;

            if (character.Money < 10000)
            {
                await game.CharacterLogAsync($"別動隊を雇おうとしましたが、金が足りません");

                return;
            }

            var ais = await repo.Character.GetManagementByHolderCharacterIdAsync(character.Id);

            if (ais.Any())
            {
                await game.CharacterLogAsync($"別動隊を雇おうとしましたが、すでに雇用しています");

                return;
            }

            var system = await repo.System.GetAsync();

            var ai = AiCharacterFactory.Create(CharacterAiType.FlyingColumn);

            ai.Initialize(game.GameDateTime);
            ai.Character.CountryId   = character.CountryId;
            ai.Character.TownId      = country.CapitalTownId;
            ai.Character.LastUpdated = character.LastUpdated.AddSeconds(Config.UpdateTime + 10);
            if (ai.Character.LastUpdated > system.CurrentMonthStartDateTime.AddSeconds(Config.UpdateTime))
            {
                ai.Character.LastUpdatedGameDate = game.GameDateTime.NextMonth();
            }
            else
            {
                ai.Character.LastUpdatedGameDate = game.GameDateTime;
            }
            await repo.Character.AddAsync(ai.Character);

            await repo.SaveChangesAsync();

            await AiService.SetIconAsync(repo, ai.Character);

            ai.Character.Name       = character.Name + "_" + ai.Character.Name + ai.Character.Id;
            ai.Character.Strong     = (short)(character.Strong * 0.8f);
            ai.Character.Intellect  = (short)(character.Intellect * 0.8f);
            ai.Character.Leadership = (short)(character.Leadership * 0.8f);
            ai.Character.Popularity = (short)(character.Popularity * 0.8f);

            var management = new AiCharacterManagement
            {
                Action            = AiCharacterAction.None,
                SoldierType       = AiCharacterSoldierType.Default,
                CharacterId       = ai.Character.Id,
                HolderCharacterId = character.Id,
                TargetTownId      = 0,
            };
            await repo.Character.AddManagementAsync(management);

            character.Money -= 10000;
            character.SkillPoint++;
            character.Contribution += 100;
            character.AddLeadershipEx(50);

            var limit = system.GameDateTime.AddMonth(72);

            await game.CharacterLogAsync($"別動隊 <character>{ai.Character.Name}</character> を雇いました。雇用期限は <num>{limit.Year}</num> 年 <num>{limit.Month}</num> 月です");

            await game.MapLogAsync(EventType.SecretaryAdded, $"<country>{country.Name}</country> の <character>{character.Name}</character> は、新しく別動隊 <character>{ai.Character.Name}</character> を雇いました", false);

            await CharacterService.StreamCharacterAsync(repo, ai.Character);

            await StatusStreaming.Default.SendCharacterAsync(ApiData.From(management), character.Id);
        }