Ejemplo n.º 1
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);
        }
Ejemplo n.º 2
0
        public override async Task ExecuteAsync(MainRepository repo, Character character, IEnumerable <CharacterCommandParameter> options, CommandSystemData game)
        {
            var typeParam = options.FirstOrDefault(p => p.Type == 1);

            if (typeParam == null)
            {
                await game.CharacterLogAsync($"政務官を雇おうとしましたが、コマンドパラメータが足りません。<emerge>管理者に連絡してください</emerge>");

                return;
            }
            var type = (CharacterAiType)typeParam.NumberValue;

            var targetTownParam    = options.FirstOrDefault(p => p.Type == 2);
            var targetTownId       = (uint)targetTownParam.NumberValue;
            var targetTownOptional = await repo.Town.GetByIdAsync(targetTownId);

            var countryOptional = await repo.Country.GetByIdAsync(character.CountryId);

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

                return;
            }
            var country = countryOptional.Data;

            var secretaries = (await repo.Country.GetCharactersAsync(country.Id)).Where(c => c.AiType.IsSecretary());
            // var policies = await repo.Country.GetPoliciesAsync(country.Id);
            var secretaryMax          = 4; // CountryService.GetSecretaryMax(policies.Where(p => p.Status == CountryPolicyStatus.Available).Select(p => p.Type));
            var currentSecretaryPoint = CountryService.GetCurrentSecretaryPoint(secretaries.Select(c => c.AiType));

            if (currentSecretaryPoint >= secretaryMax)
            {
                await game.CharacterLogAsync($"政務官を雇おうとしましたが、すでに政務官ポイントが上限 <num>{secretaryMax}</num> に達しています");

                return;
            }

            var afterSecretaryPoint = CountryService.GetCurrentSecretaryPoint(secretaries.Select(c => c.AiType).Append(type));

            if (afterSecretaryPoint > secretaryMax)
            {
                await game.CharacterLogAsync($"政務官を雇おうとしましたが、雇用後の政務官ポイントが上限 <num>{secretaryMax}</num> を越えます");

                return;
            }

            var cost = Config.SecretaryCost;

            if (character.Money < cost && country.SafeMoney < cost)
            {
                await game.CharacterLogAsync($"政務官を雇おうとしましたが、武将所持または国庫に金 <num>{cost}</num> がありません");

                return;
            }

            if (country.SafeMoney >= cost)
            {
                country.SafeMoney -= cost;
            }
            else
            {
                character.Money -= cost;
            }

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

            var ai = AiCharacterFactory.Create(type);

            ai.Initialize(game.GameDateTime);
            ai.Character.CountryId = character.CountryId;
            ai.Character.TownId    = (type != CharacterAiType.SecretaryUnitLeader && targetTownOptional.HasData) ?
                                     targetTownId : country.CapitalTownId;
            ai.Character.Money = 10000;
            ai.Character.Rice  = 10000;
            if (type == CharacterAiType.SecretaryEvangelist)
            {
                ai.Character.Religion = country.Religion;
                ai.Character.From     = country.Religion == ReligionType.Confucianism ? CharacterFrom.Confucianism : country.Religion == ReligionType.Taoism ? CharacterFrom.Taoism : CharacterFrom.Buddhism;
            }
            if (type != CharacterAiType.SecretaryScouter)
            {
                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;
                }
            }
            else
            {
                // 斥候は0分0秒更新で諜報する
                ai.Character.LastUpdated         = system.CurrentMonthStartDateTime.AddSeconds(Config.UpdateTime);
                ai.Character.LastUpdatedGameDate = game.GameDateTime.NextMonth();
            }
            await repo.Character.AddAsync(ai.Character);

            await repo.SaveChangesAsync();

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

            if (type == CharacterAiType.SecretaryUnitLeader)
            {
                await UnitService.CreateAndSaveAsync(repo, new Unit
                {
                    CountryId = character.CountryId,
                    IsLimited = false,
                    Name      = "政務官部隊 ID:" + ai.Character.Id,
                }, ai.Character.Id);
            }

            ai.Character.Name      += ai.Character.Id;
            character.Contribution += 30;
            character.AddLeadershipEx(50);
            character.SkillPoint++;
            if (targetTownOptional.HasData && type != CharacterAiType.SecretaryUnitLeader)
            {
                await game.CharacterLogAsync($"政務官 <character>{ai.Character.Name}</character> を <town>{targetTownOptional.Data.Name}</town> で雇いました");
            }
            else
            {
                await game.CharacterLogAsync($"政務官 <character>{ai.Character.Name}</character> を雇いました");
            }
            await game.MapLogAsync(EventType.SecretaryAdded, $"<country>{country.Name}</country> は、新しく政務官 <character>{ai.Character.Name}</character> を雇いました", false);

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