骑马与砍杀吧 关注:755,005贴子:15,140,016

看了下霸主的代码,了解到npc什么时候去世了。

只看楼主收藏回复

运气逆天同时各种因素拉满的话,最大能活128岁。所有npc都是从47岁开始计算死亡概率,到了47之后,每到结算的时候都可能暴毙,大家还有什么想了解的,游戏里没说的,在帖子里回复,看能不能在代码里找到。


IP属地:澳大利亚来自iPhone客户端1楼2024-06-04 20:51回复
    看看ai部队行为,军团行为,藏身处行为,劫匪行为,ai部队火星经验来源,ai宣战议和逻辑,贡金计算公式


    IP属地:山西来自Android客户端2楼2024-06-04 20:57
    收起回复
      2025-07-25 04:37:45
      广告
      不感兴趣
      开通SVIP免广告
      想知道宣战是怎么回事 总是无缘无故宣战


      IP属地:广东来自Android客户端3楼2024-06-04 22:05
      回复
        王国提案ai的投票逻辑是什么?


        IP属地:福建来自Android客户端4楼2024-06-04 22:45
        收起回复
          像看骑兵的AI代码,比如骑兵拉扯的距离,还有武器切换是怎么算的。相对速度的伤害计算公式


          IP属地:浙江5楼2024-06-04 22:46
          回复
            private void AddNewHideouts(){foreach (Clan clan in Clan.BanditFactions){if (!BanditsCampaignBehavior.IsLooterFaction(clan)){int num = 0;foreach (Hideout hideout in Campaign.Current.AllHideouts){if (hideout.IsInfested && hideout.Settlement.Culture == clan.Culture){num++;}}float num2 = 0f;if ((float)num < (float)this._numberOfMaxHideoutsAtEachBanditFaction * 0.5f){num2 = 1f - (float)num / (float)MathF.Ceiling((float)this._numberOfMaxHideoutsAtEachBanditFaction * 0.5f);num2 = MathF.Max(0f, num2 * num2);}if (MBRandom.RandomFloat < num2){this.FillANewHideoutWithBandits(clan);}}}}
            这段 C# 代码的目标是管理不同匪帮派别的藏身处。该方法AddNewHideouts()遍历所有匪帮,并确定是否应为每个匪帮创建新的藏身处。
            土匪家族的迭代:
            代码循环遍历每个家族一个Clan.BanditFactions。
            检查掠夺者派系:
            它使用 检查当前是否家族为“掠夺者派系” BanditsCampaignBehavior.IsLooterFaction(clan)。 如果该家族是掠夺者派系,则跳至下一个家族。 否则,它继续处理。
            统计现有藏身处:
            它将计数器初始化num为零。
            然后它循环遍历活动中的所有藏身处(Campaign.Current.AllHideouts)。
            对于每个藏身处,它会检查藏身处是否被感染 ( hideout.IsInfested) 以及藏身处的文化是否与家族的文化相匹配 ( hideout.Settlement.Culture == clan.Culture)。如果两个条件都满足,它就会增加计数器num。
            确定新藏身处的概率:
            它初始化num2为零。
            检查家族的藏身处数量 ( num) 是否小于派系允许的最大藏身处数量的一半 ( this._numberOfMaxHideoutsAtEachBanditFaction * 0.5f)。如果为真,则计算一个概率因子num2:
            num2计算为1f - (float)num / (float)MathF.Ceiling((float)this._numberOfMaxHideoutsAtEachBanditFaction * 0.5f)。
            然后将其平方num2(以二次方降低概率)并确保它不小于零MathF.Max(0f, num2 * num2)。
            随机检查以添加新的藏身处:
            它生成一个随机浮点值(MBRandom.RandomFloat)并将其与进行比较num2。
            如果随机值小于num2,它会调用this.FillANewHideoutWithBandits(clan),这可能负责为该家族创建一个新的藏身处。
            该方法AddNewHideouts()系统地检查每个强盗家族,并根据同一文化的现有藏身处的数量,以概率方式决定是否创建新的藏身处。随着现有藏身处的数量接近每个派系允许的最大值,概率会降低。
            这时有人要的藏身处刷新逻辑的代码和分析


            IP属地:澳大利亚6楼2024-06-05 06:45
            收起回复
              128岁就强制死亡吗😨,包括玩家角色吗?


              IP属地:山东来自Android客户端7楼2024-06-05 09:04
              收起回复
                我有个疑问想知道很久了,请哥们帮我看下,自己生的孩子的名字,特质到底跟啥有关,为啥我纯种帝国人生的孩子个个都是巴丹风格,性格总是负面出现的概率高


                IP属地:江苏来自Android客户端8楼2024-06-05 11:23
                收起回复
                  2025-07-25 04:31:45
                  广告
                  不感兴趣
                  开通SVIP免广告
                  藏身处能不能改掉不生成,后期太尼玛麻烦了


                  IP属地:江西来自Android客户端9楼2024-06-05 11:51
                  收起回复
                    这段代码是npc逻辑检查和随机的一些几率来确定土匪是否会在对话中投降,点了招募土匪那个天赋就很容易
                    详细步骤
                    初始投降逻辑检查:
                    该方法要求PartyBaseHelper.DoesSurrenderIsLogicalForParty根据各方的相对实力来确定土匪投降是否合乎逻辑。这里使用的阈值是0.04f。
                    如果结果为true,num则设置为33。否则,设置为67。
                    int num = PartyBaseHelper.DoesSurrenderIsLogicalForParty(MobileParty.ConversationParty, MobileParty.MainParty, 0.04f) ? 33 : 67;
                    玩家技能调整:
                    该方法检查主角是否具有流氓习气的刀疤脸技能
                    如果英雄拥有该技能,则num通过将其乘以1 + PrimaryBonus该技能的百分比,然后对结果进行四舍五入来调整。如果玩家拥有该技能,这会增加投降的几率。
                    if (Hero.MainHero.GetPerkValue(DefaultPerks.Roguery.Scarface))
                    {
                    num = MathF.Round((float)num * (1f + DefaultPerks.Roguery.Scarface.PrimaryBonus));
                    }
                    随机几率检查:
                    该方法用于RandomIntWithSeed生成一个介于 4 和 100 之间的随机整数。种子(4U)确保当前对话的可重复性。
                    然后检查这个随机整数是否小于或等于100 - num。
                    return MobileParty.ConversationParty.Party.RandomIntWithSeed(4U, 100) <= 100 - num
                    最终投降逻辑检查:
                    该方法PartyBaseHelper.DoesSurrenderIsLogicalForParty以稍高的阈值(0.06f)再次调用,以对投降是否合乎逻辑进行最终检查。
                    && PartyBaseHelper.DoesSurrenderIsLogicalForParty(MobileParty.ConversationParty, MobileParty.MainParty, 0.06f);
                    返回值:
                    true如果随机几率检查和最终投降逻辑检查都通过,则该方法返回。
                    如果任何一项检查失败,该方法将返回false。
                    重点突出的部分
                    // Initial surrender logic check with a threshold of 0.04
                    int num = PartyBaseHelper.DoesSurrenderIsLogicalForParty(MobileParty.ConversationParty, MobileParty.MainParty, 0.04f) ? 33 : 67;
                    // Adjustment based on player's perk
                    if (Hero.MainHero.GetPerkValue(DefaultPerks.Roguery.Scarface))
                    {
                    num = MathF.Round((float)num * (1f + DefaultPerks.Roguery.Scarface.PrimaryBonus));
                    }
                    // Random chance check with seed 4U and threshold adjustment
                    return MobileParty.ConversationParty.Party.RandomIntWithSeed(4U, 100) <= 100 - num
                    // Final surrender logic check with a higher threshold of 0.06
                    && PartyBaseHelper.DoesSurrenderIsLogicalForParty(MobileParty.ConversationParty, MobileParty.MainParty, 0.06f);
                    该conversation_bandits_surrender_on_condition()方法结合逻辑检查和随机概率来确定土匪是否会向玩家投降。投降的可能性受玩家的技能影响,尤其是技能树流氓习气的刀疤脸技能。
                    这是检查强盗投降几率的代码。


                    IP属地:澳大利亚10楼2024-06-05 13:22
                    回复
                      当玩家进入游戏OnSettlementEntered时,将调用此方法。该方法处理多项检查和更新,特别是与匪徒队伍和藏身处相关的检查和更新。
                      MobilePartySettlement
                      该方法检查土匪小队是否进入了藏身处,并处理藏身处的可见性和物品交易。如果满足某些条件,它会更新藏身处的可见性状态并调整小队和城镇的金币数量。
                      mobileParty:进入城镇的一方。
                      settlement:正在进入城镇。
                      hero:与队伍相关的英雄(如果有)。
                      public void OnSettlementEntered(MobileParty mobileParty, Settlement settlement, Hero hero)
                      产卵土匪老大:
                      该方法要求CheckForSpawningBanditBoss在城镇附近产生一个强盗头目。
                      this.CheckForSpawningBanditBoss(settlement, mobileParty);
                      检查游戏状态和条件:
                      该方法检查游戏是否已经开始,如果mobileParty不为空,则检查是否是一支强盗队伍,并且是否已进入藏身处。
                      if (Campaign.Current.GameStarted && mobileParty != null && mobileParty.IsBandit && settlement.IsHideout)
                      藏身处发现逻辑:
                      如果藏身处尚未被发现且有强盗出没,该方法将根据距离和能见度计算玩家的队伍是否能发现藏身处。
                      lengthSquared:玩家队伍与城镇之间的平方距离。
                      seeingRange:玩家队伍的视野范围。
                      num:根据距离和视野范围决定可见度的因素。
                      partySpottingDifficulty:发现队伍的难度。
                      如果计算出的可见度num / partySpottingDifficulty大于或等于 1,则将藏身处标记为被发现,更新其可见性,并触发活动事件。
                      if (!settlement.Hideout.IsSpotted && settlement.Hideout.IsInfested)
                      {
                      float lengthSquared = (MobileParty.MainParty.Position2D - settlement.Position2D).LengthSquared;
                      float seeingRange = MobileParty.MainParty.SeeingRange;
                      float num = seeingRange * seeingRange / lengthSquared;
                      float partySpottingDifficulty = Campaign.Current.Models.MapVisibilityModel.GetPartySpottingDifficulty(MobileParty.MainParty, mobileParty);
                      if (num / partySpottingDifficulty >= 1f)
                      {
                      settlement.Hideout.IsSpotted = true;
                      settlement.Party.UpdateVisibilityAndInspected(0f);
                      CampaignEventDispatcher.Instance.OnHideoutSpotted(MobileParty.MainParty.Party, settlement.Party);
                      }
                      }
                      以队伍的交易技能和物品数量来计算的代码:
                      num2被初始化以累积多余物品的价值。
                      对于派对物品清单中的每个物品,如果该物品是食物且超过一定随机数量,则计算超出的值并将其添加到num2。
                      int num2 = 0;
                      foreach (ItemRosterElement itemRosterElement in mobileParty.ItemRoster)
                      {
                      int num3 = itemRosterElement.EquipmentElement.Item.IsFood ? MBRandom.RoundRandomized((float)mobileParty.MemberRoster.TotalManCount * ((3f + 6f * MBRandom.RandomFloat) / (float)itemRosterElement.EquipmentElement.Item.Value)) : 0;
                      if (itemRosterElement.Amount > num3)
                      {
                      int num4 = itemRosterElement.Amount - num3;
                      num2 += num4 * itemRosterElement.EquipmentElement.Item.Value;
                      }
                      }
                      更新金币:
                      如果num2大于0,表示有多余的物品:
                      如果队伍交易很高,则超额价值的 25% 将添加到派对的交易黄金中。
                      超出价值的 25% 也会被添加到城镇的金币中。
                      if (num2 > 0)
                      {
                      if (mobileParty.IsPartyTradeActive)
                      {
                      mobileParty.PartyTradeGold += (int)(0.25f * (float)num2);
                      }
                      settlement.SettlementComponent.ChangeGold((int)(0.25f * (float)num2));
                      }
                      当玩家进入城镇时,该OnSettlementEntered方法执行几项任务:MobilePartySettlement
                      它会检查城镇附近是否产生了一个强盗头目。
                      如果一队匪徒进入藏身处,它会根据距离和能见度来确定是否应该发现藏身处。
                      它处理队伍的物品清单,计算多余食物的价值。
                      它会根据超额物品的价值来更新队伍的金币和结算。
                      代码大概意思就是说,进城镇时有几率发现藏身处。


                      IP属地:澳大利亚11楼2024-06-05 17:52
                      回复
                        大佬,土匪的刷新逻辑是什么?


                        IP属地:辽宁来自iPhone客户端12楼2024-06-05 19:56
                        回复
                          已知在某城市三个工坊都高铁匠铺,大概每十天左右刷一次高级盔甲(和武器),在刷的过程中发现似乎有一些固定的规律但又搞不太清,想了解刷出传奇前缀盔甲的规律


                          IP属地:北京来自iPhone客户端13楼2024-06-05 20:43
                          回复
                            游戏刚开始不久,瓦兰迪亚德泰尔就去世了


                            IP属地:四川来自Android客户端14楼2024-06-06 01:04
                            收起回复
                              2025-07-25 04:25:45
                              广告
                              不感兴趣
                              开通SVIP免广告
                              GetBannerRewardForDefeatingNoble计算在当玩家在战斗中击败贵族时是否奖励他们一面旗帜物品
                              参数:
                              mapEvent:代表战斗的事件。
                              lootedCasualties:代表从战败方掠夺的伤亡人员的部队列表。
                              返回:
                              若有ItemObject旗帜被掠夺,则为 ,否则为null。
                              方法步骤
                              初始化英雄变量:
                              声明一个hero变量并将其设置为null。
                              Hero hero = null;
                              寻找军队领导者:
                              迭代失败方的各方mapEvent。
                              检查该队伍是否具有机动性并且属于军队的一部分。
                              如果军队拥有者有有效旗帜,则将此英雄赋值给变量hero。如果旗帜无效,则设置hero为null并中断循环。
                              foreach (MapEventParty mapEventParty in mapEvent.PartiesOnSide(mapEvent.DefeatedSide))
                              {
                              if (mapEventParty.Party.IsMobile && mapEventParty.Party.MobileParty.Army != null)
                              {
                              hero = mapEventParty.Party.MobileParty.Army.ArmyOwner;
                              if (hero.BannerItem.IsInvalid())
                              {
                              hero = null;
                              break;
                              }
                              break;
                              }
                              }
                              找到一名带有有效旗帜的随机英雄:
                              如果hero仍然如此null,寻找被抢劫的伤亡人数,找到一名拥有有效旗帜的随机英雄。
                              if (hero == null)
                              {
                              CharacterObject character = lootedCasualties.GetRandomElementWithPredicate((TroopRosterElement t) => t.Character.IsHero && !t.Character.HeroObject.BannerItem.IsInvalid()).Character;
                              hero = ((character != null) ? character.HeroObject : null);
                              }
                              确定横幅是否可以被掠夺:
                              如果找到持有有效旗帜的英雄并且可以掠夺该旗帜,则根据英雄的等级确定掠夺几率。
                              如果英雄是王国统治者、家族领袖或普通英雄,机会就会有所不同。
                              if (hero != null && this.CanBannerBeLootedFromHero(hero))
                              {
                              Clan clan = hero.Clan;
                              Hero hero2;
                              if (clan == null)
                              {
                              hero2 = null;
                              }
                              else
                              {
                              Kingdom kingdom = clan.Kingdom;
                              hero2 = ((kingdom != null) ? kingdom.RulingClan.Leader : null);
                              }
                              float num;
                              if (hero2 == hero)
                              {
                              num = Campaign.Current.Models.BattleRewardModel.DefeatKingdomRulerBannerLootChance;
                              }
                              else
                              {
                              Clan clan2 = hero.Clan;
                              if (((clan2 != null) ? clan2.Leader : null) == hero)
                              {
                              num = Campaign.Current.Models.BattleRewardModel.DefeatClanLeaderBannerLootChance;
                              }
                              else
                              {
                              num = Campaign.Current.Models.BattleRewardModel.DefeatRegularHeroBannerLootChance;
                              }
                              }
                              掠夺旗帜:
                              如果随机浮点值小于或等于计算出的概率,则记录横幅战利品并返回横幅物品。
                              若条件不满足,则返回null。
                              if (MBRandom.RandomFloat <= num)
                              {
                              this.LogBannerLootForHero(hero, ((BannerComponent)hero.BannerItem.Item.ItemComponent).BannerLevel);
                              return hero.BannerItem.Item;
                              }
                              }
                              return null;
                              该GetBannerRewardForDefeatingNoble方法的工作原理如下:
                              它会检查任何失败方是否拥有持有有效旗帜的军队所有者。
                              如果没有,它会从被抢劫的伤亡人员中随机找出一名拥有有效旗帜的英雄。
                              根据英雄的等级来决定旗帜是否可以被掠夺。
                              它会计算夺取旗帜的概率,如果成功则返回,否则返回null。
                              主要函数和类
                              MapEvent:代表战役事件。
                              MapEventParty:代表参与战斗的一方。
                              MobileParty:代表可以在地图上移动的队伍。
                              TroopRosterElement:代表部队名册中的一个元素。
                              Hero:代表游戏中的英雄人物。
                              ItemObject:代表游戏中的物品。
                              MBRandom.RandomFloat:返回 0 到 1 之间的随机浮点值。
                              Campaign.Current.Models.BattleRewardModel:包含不同等级英雄的战利品几率。
                              this.LogBannerLootForHero:记录英雄的战利品行动。
                              this.CanBannerBeLootedFromHero:检查是否可以从英雄身上夺取旗帜。
                              打领主决定掉不掉旗帜的代码


                              IP属地:澳大利亚15楼2024-06-06 09:39
                              回复