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(); } } }
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); }