骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买霸主CDKEY 购买战帆CDKEY
查看: 489|回复: 11

[功能与代码] 防止空手AI (ms|txt: 防止空手或无弹药而发呆卖萌)2026.5.16

[复制链接]

8

主题

65

回帖

22

积分

随仆

Rank: 1

UID
2557955
第纳尔
139
精华
0
互助
0
荣誉
0
贡献
0
魅力
20
注册时间
2015-7-9
鲜花(2) 鸡蛋(0)
发表于 2026-5-6 10:39:05 | 显示全部楼层 |阅读模式
本帖最后由 afl001 于 2026-5-18 08:22 编辑

有至少一只空手,或持有远程武器但已经无弹药,切换盾牌和武器的AI。【战团】

一般其他ai都会附带武器切换选择,但有时却会忘记空手的情况。比如带着不能在马背上用的盾,被打下马后明明背着一面盾却不切。用完弹药发呆,也不切其他武器。一面盾被打爆了,有第二面备用盾也不切。有可切近战的投掷武器,没其他近战武器,把弹药打光也不切近战模式,等等等等。此AI就是防止这种空手导致卖萌的情况。

由于双手容易被射成刺猬,除非不得不选择双手持握武器,否则尽量切能配盾的武器,尤其是挥砍类最为优先。
空手切换一次之后就肯定不是空手了,所以理论上不会出现反复切换的情况,这个机制也会防止喧宾夺主,影响其他AI的武器选择。

这算是个普适性的AI,什么战斗场景都能加。2026.5.16之后更新的版本,不再区分攻城场景和非攻城场景。

若用在公开MOD请注明一下来源。

txt修改见本帖附件,为了防止附件失效,后面也直接贴了一份。

游客,如果您要查看本帖隐藏内容请回复

添加代码的场景(添加后重开新档)(前5个场景建议必加,后面几个场景可以选择加)
lead_charge
castle_attack_walls_belfry
castle_attack_walls_ladder
village_attack_bandits
village_raid
sneak_caught_fight
bandits_at_night
besiege_inner_battle_castle
besiege_inner_battle_town_center
castle_attack_walls_defenders_sally
bandit_lair
quick_battle_battle
quick_battle_siege

-------------------------------
2026.5.8更新:
(一)
重新整理了投掷武器切换近战模式的逻辑:
未携带近战武器,武器栏有空位时,无论剩下多少弹药,先装备一把投掷武器的近战模式。
武器栏无空位时,等有投掷武器弹药打空,卸下打空的投掷,换成一把投掷武器的近战模式。
携带有多把有近战模式的投掷武器,优先切单手武器,不一定转换自卸下的那把。
强制切换其他类型的投掷,有时候都会出现一些智熄操作,所以取消了。
有空位就早切近战模式,而非死等最后1发弹药,也更为合理。
(二)
修正了一个可能导致反复切换的问题。
————
2026.5.9更新:
修正了弹药判断的一些潜在问题。
————
2026.5.16更新:
(一)
增加了投掷近战相互切换的情况判断:
有些投掷AI,如果有2种投掷武器,1种弹药投完并不会切换第2种,但由于存在弹药,依然判定此兵种属于投掷。
此时手里如果没有拿着投掷武器,会站在原地发呆。为了防止这种情况,新增了投掷切换的判断。
周围4米内有步兵,8米内有骑兵,切近战(对骑兵优先切可直刺长杆),否则切投掷(存在有弹药投掷且不是其他类型射手)。
(二)
取消了卸除多余的弩/火枪的情况判断:
由于上个版本就已经改变了判断角色当前是否属于无弹药射手的方式,这部分内容其实是多余的。这版就把这部分无用的内容删了。
删了之后,也无需再区分攻城场景和非攻城场景,更为简洁。

MS修改代码(加在 module_mission_templates.py 的任务场景中)
  1. # 防止空手AI,添加在 mission_templates,作者afl001,若用在公开MOD注明一下来源
  2. # 编译通不过,请删掉所有中文字符,或在PY文件顶部增加 # -*- coding: utf-8 -*-
  3.     (0.5, 0, 0, [],
  4.     [
  5.         (try_for_agents, ":agent_id"),
  6.           (assign, ":end_this_one", 0),
  7.           (agent_is_alive, ":agent_id"),
  8.           (agent_is_human, ":agent_id"),
  9.           (agent_is_non_player,":agent_id"),
  10.           (agent_get_horse, ":horse", ":agent_id"),
  11. #------------------#
  12. #一:判断角色的武器状态
  13. #------------------#
  14.           (eq, ":end_this_one", 0),
  15.           (assign, ":have_weapon_space", 0),
  16.           (assign, ":have_item_use_two_handed", 0),
  17.           (assign, ":have_item_non_two_handed", 0),
  18.           (assign, ":nums_of_thrown_use_melee", 0),
  19.           (assign, ":have_thrust_polearm_item", -1),
  20.           (assign, ":empty_ammo_thrown_item", -1),
  21.           (assign, ":empty_ammo_thrown_other", 0),
  22.           (assign, ":thrown_ammo_id", -1),
  23.           (assign, ":have_melee", 0),
  24.           (assign, ":have_shield", 0),
  25.           (assign, ":archer", 0),
  26.           (assign, ":crossbowman", 0),
  27.           (assign, ":pistolman", 0),
  28.           (assign, ":musketman", 0),
  29.           (assign, ":check_1", 0),
  30.           (assign, ":check_2", 0),
  31.           (assign, ":check_3", 0),
  32.           (assign, ":check_4", 0),
  33.           (assign, ":check_5", 0),
  34.           (assign, ":check_6", 0),
  35.           (assign, ":check_7", 0),
  36.           (try_for_range,":wp_slot",0,4),
  37.             (agent_get_item_slot,":item_id",":agent_id",":wp_slot"),
  38.             (try_begin),
  39.               (lt,":item_id",0),
  40.               (val_add, ":have_weapon_space", 1),
  41.             (try_end),
  42.             (gt,":item_id",-1),
  43.             (item_get_type, ":item_type", ":item_id"),
  44.             (try_begin),
  45.               (this_or_next|eq, ":item_type", itp_type_one_handed_wpn),
  46.               (this_or_next|eq, ":item_type", itp_type_two_handed_wpn),
  47.               (eq, ":item_type", itp_type_polearm),
  48.               (assign, ":have_melee", 1),
  49.               (try_begin),
  50.                 (item_has_property,":item_id",itp_two_handed),
  51.                 (assign, ":have_item_use_two_handed", 1),
  52.               (try_end),
  53.               (try_begin),
  54.                 (neg|item_has_property,":item_id",itp_two_handed),
  55.                 (assign, ":have_item_non_two_handed", 1),
  56.               (try_end),
  57.               (try_begin),
  58.                 (eq, ":have_thrust_polearm_item", -1),
  59.                 (eq, ":item_type", itp_type_polearm),
  60.                 (item_has_capability, ":item_id", itcf_thrust_polearm),
  61.                 (assign,":have_thrust_polearm_item", ":item_id"),
  62.               (try_end),
  63.             (else_try),
  64.               (eq, ":item_type", itp_type_shield),
  65.               (assign, ":have_shield", 1),
  66.             (else_try),
  67.               (eq, ":item_type", itp_type_thrown),
  68.               (try_begin),
  69.                 (item_has_property,":item_id",itp_next_item_as_melee),
  70.                 (val_add, ":nums_of_thrown_use_melee", 1),
  71.               (try_end),
  72.               (try_begin),
  73.                 (eq, ":empty_ammo_thrown_item", ":item_id"),
  74.                 (val_add, ":empty_ammo_thrown_other", 1),
  75.               (try_end),
  76.               (agent_get_ammo_for_slot,":slot_ammo",":agent_id",":wp_slot"),
  77.               (try_begin),
  78.                 (eq,":slot_ammo",0),
  79.                 (eq,":empty_ammo_thrown_item",-1),
  80.                 (assign, ":empty_ammo_thrown_item", ":item_id"),
  81.               (else_try),
  82.                 (gt,":slot_ammo",0),
  83.                 (eq,":thrown_ammo_id",-1),
  84.                 (assign, ":thrown_ammo_id", ":item_id"),
  85.               (try_end),
  86.             (else_try),
  87.               (eq, ":check_1", 0),
  88.               (eq, ":item_type", itp_type_bow),
  89.               (val_add, ":archer", 1),
  90.               (assign, ":check_1", 1),
  91.             (else_try),
  92.               (eq, ":check_2", 0),
  93.               (eq, ":item_type", itp_type_crossbow),
  94.               (val_add, ":crossbowman", 1),
  95.               (assign, ":check_2", 1),
  96.             (else_try),
  97.               (eq, ":check_3", 0),
  98.               (eq, ":item_type", itp_type_pistol),
  99.               (val_add, ":pistolman", 1),
  100.               (assign, ":check_3", 1),
  101.             (else_try),
  102.               (eq, ":check_4", 0),
  103.               (eq, ":item_type", itp_type_musket),
  104.               (val_add, ":musketman", 1),
  105.               (assign, ":check_4", 1),
  106.             (else_try),
  107.               (eq, ":check_5", 0),
  108.               (eq, ":item_type", itp_type_arrows),
  109.               (val_add, ":archer", 1),
  110.               (assign, ":check_5", 1),
  111.             (else_try),
  112.               (eq, ":check_6", 0),
  113.               (eq, ":item_type", itp_type_bolts),
  114.               (val_add, ":crossbowman", 1),
  115.               (assign, ":check_6", 1),
  116.             (else_try),
  117.               (eq, ":check_7", 0),
  118.               (eq, ":item_type", itp_type_bullets),
  119.               (val_add, ":pistolman", 1),
  120.               (val_add, ":musketman", 1),
  121.               (assign, ":check_7", 1),
  122.             (try_end),
  123.           (try_end),
  124. #------------------#
  125. #二:投掷武器切近战模式的情况
  126. #未携带近战武器,武器栏有空位时,无论剩下多少弹药,先装备一把投掷武器的近战模式。
  127. #武器栏无空位时,等有投掷武器弹药打空,卸下打空的投掷,换成一把投掷武器的近战模式。
  128. #携带有多把有近战模式的投掷武器,优先切单手武器,不一定转换自卸下的那把。
  129. #------------------#
  130.           (eq, ":end_this_one", 0),
  131.           (try_begin),
  132.             (this_or_next|gt, ":have_weapon_space", 0),
  133.             (gt, ":empty_ammo_thrown_item", -1),
  134.             (eq, ":have_melee", 0),
  135.             (gt, ":nums_of_thrown_use_melee", 0),
  136.             (assign,":hold_weapon", -1),
  137.             (assign,":hold_weapon_2", -1),
  138.             (assign,":com_damage", 0),
  139.             (assign, ":try_end", 4),
  140.             (try_for_range,":wp_slot",0,":try_end"),
  141.               (agent_get_item_slot,":item_id",":agent_id",":wp_slot"),
  142.               (gt,":item_id",-1),
  143.               (item_get_type, ":item_type", ":item_id"),
  144.               (eq,":item_type", itp_type_thrown),
  145.               (item_has_property,":item_id",itp_next_item_as_melee),
  146.               (store_add,":next_item_id",":item_id",1),
  147.               (gt, ":next_item_id", 0),
  148.               (item_get_type, ":next_item_type", ":next_item_id"),
  149.               (this_or_next|eq, ":next_item_type", itp_type_one_handed_wpn),
  150.               (this_or_next|eq, ":next_item_type", itp_type_two_handed_wpn),
  151.               (eq, ":next_item_type", itp_type_polearm),
  152.               (try_begin),
  153.                 (eq, ":nums_of_thrown_use_melee", 1),
  154.                 (assign, ":hold_weapon", ":next_item_id"),
  155.                 (assign, ":try_end", 0),
  156.               (try_end),
  157.               (gt, ":nums_of_thrown_use_melee", 1),
  158.               (try_begin),
  159.                 (eq, ":hold_weapon_2", -1),
  160.                 (assign,":hold_weapon_2", ":next_item_id"),
  161.               (try_end),
  162.               (eq, ":next_item_type", itp_type_one_handed_wpn),
  163.               (item_get_swing_damage, ":item_damage", ":next_item_id"),
  164.               (gt,":item_damage", ":com_damage"),
  165.               (try_begin),
  166.                 (lt, ":horse", 0),
  167.                 (assign, ":hold_weapon", ":next_item_id"),
  168.                 (assign, ":com_damage", ":item_damage"),
  169.               (else_try),
  170.                 (neg|item_has_property,":item_id",itp_cant_reload_on_horseback),
  171.                 (neg|item_has_property,":item_id",itp_cant_use_on_horseback),
  172.                 (assign, ":hold_weapon", ":next_item_id"),
  173.                 (assign, ":com_damage", ":item_damage"),
  174.               (try_end),
  175.             (try_end),
  176.             (try_begin),
  177.               (eq, ":have_weapon_space", 0),
  178.               (agent_unequip_item, ":agent_id", ":empty_ammo_thrown_item"),
  179.               (gt, ":empty_ammo_thrown_other", 0),
  180.               (try_for_range,":unused",0,":empty_ammo_thrown_other"),
  181.                 (agent_equip_item, ":agent_id", ":empty_ammo_thrown_item"),
  182.               (try_end),
  183.             (try_end),
  184.             (try_begin),
  185.               (try_begin),
  186.                 (lt, ":hold_weapon", 0),
  187.                 (assign,":hold_weapon", ":hold_weapon_2"),
  188.               (try_end),
  189.               (gt, ":hold_weapon", -1),
  190.               (agent_equip_item, ":agent_id", ":hold_weapon"),
  191.             (try_end),
  192.           (try_end),
  193. #------------------#
  194. #三:现在开始不再卸武器,这里提前判断角色是否空弹的射手,下面很多地方会用到
  195. #------------------#
  196.           (eq, ":end_this_one", 0),
  197.           (agent_get_wielded_item, ":wielded_weapon", ":agent_id", 0),
  198.           (agent_get_wielded_item, ":wielded_shield", ":agent_id", 1),
  199.           (assign, ":wielded_type", -1),
  200.           (try_begin),
  201.             (gt,":wielded_weapon",-1),
  202.             (item_get_type, ":wielded_type", ":wielded_weapon"),
  203.           (try_end),
  204.           (agent_get_ammo, ":cur_ammo", ":agent_id" , 1),
  205.           (try_begin),
  206.             (eq, ":cur_ammo", 0),
  207.             (assign, ":empty_ammo_twohand_shooter", 0),
  208.             (try_begin),
  209.               (assign, ":empty_ammo_crossbow", 0),
  210.               (assign, ":empty_ammo_musket", 0),
  211.               (assign, ":empty_ammo_bow", 0),
  212.               (try_begin),
  213.                 (eq, ":wielded_type", itp_type_crossbow),
  214.                 (assign, ":empty_ammo_crossbow", 1),
  215.               (try_end),
  216.               (try_begin),
  217.                 (eq, ":wielded_type", itp_type_musket),
  218.                 (assign, ":empty_ammo_musket", 1),
  219.               (try_end),
  220.               (try_begin),
  221.                 (eq, ":wielded_type", itp_type_bow),
  222.                 (assign, ":empty_ammo_bow", 1),
  223.               (try_end),
  224.               (this_or_next|eq, ":empty_ammo_crossbow", 1),
  225.               (this_or_next|eq, ":empty_ammo_musket", 1),
  226.               (eq, ":empty_ammo_bow", 1),
  227.               (assign, ":empty_ammo_twohand_shooter", 1),
  228.             (try_end),
  229.             (assign, ":empty_ammo_onehand_shooter", 0),
  230.             (try_begin),
  231.               (assign, ":empty_ammo_thrown", 0),
  232.               (assign, ":empty_ammo_pistol", 0),
  233.               (try_begin),
  234.                 (eq, ":wielded_type", itp_type_thrown),
  235.                 (assign, ":empty_ammo_thrown", 1),
  236.               (try_end),
  237.               (try_begin),
  238.                 (eq, ":wielded_type", itp_type_pistol),
  239.                 (assign, ":empty_ammo_pistol", 1),
  240.               (try_end),
  241.               (this_or_next|eq, ":empty_ammo_thrown", 1),
  242.               (eq, ":empty_ammo_pistol", 1),
  243.               (assign, ":empty_ammo_onehand_shooter", 1),
  244.             (try_end),
  245.             (assign, ":empty_ammo_shooter", 0),
  246.             (try_begin),
  247.               (this_or_next|eq, ":empty_ammo_twohand_shooter", 1),
  248.               (eq, ":empty_ammo_onehand_shooter", 1),
  249.               (assign, ":empty_ammo_shooter", 1),
  250.             (try_end),
  251.           (try_end),
  252. #------------------#
  253. #四:投掷近战相互切换的情况
  254. #有些投掷AI,如果有2种投掷武器,1种弹药投完并不会切换第2种,但由于存在弹药,依然判定此兵种属于投掷。
  255. #此时手里如果没有拿着投掷武器,会站在原地发呆。为了防止这种情况,新增了投掷切换的判断。
  256. #周围4米内有步兵,8米内有骑兵,切近战(对骑兵优先切可直刺长杆),否则切投掷(存在有弹药投掷且不是其他类型射手)。
  257. #------------------#
  258.           (try_begin),
  259.             (eq, ":have_melee", 1),
  260.             (gt, ":thrown_ammo_id", -1),
  261.             (lt, ":archer", 2),
  262.             (lt, ":crossbowman", 2),
  263.             (lt, ":pistolman", 2),
  264.             (lt, ":musketman", 2),
  265.             (agent_get_team,":team_id", ":agent_id"),
  266.             (agent_get_position, pos1, ":agent_id"),
  267.             (assign, ":there_are_enemies_nearby", 0),
  268.             (assign, ":enemy_horse_id", -1),
  269.             (assign, ":old_fpm", 1),
  270.             (convert_to_fixed_point, ":old_fpm"),
  271.             (set_fixed_point_multiplier, 100),
  272.             (try_for_agents,":enemy_agent"),
  273.               (eq, ":there_are_enemies_nearby", 0),
  274.               (agent_is_alive, ":enemy_agent"),
  275.               (agent_is_human, ":enemy_agent"),
  276.               (agent_get_team, ":enemy_team", ":enemy_agent"),
  277.               (teams_are_enemies, ":enemy_team", ":team_id"),
  278.               (agent_get_position, pos2, ":enemy_agent"),
  279.               (get_distance_between_positions,":enemy_distance",pos1,pos2),
  280.               (agent_get_horse, ":enemy_horse", ":enemy_agent"),
  281.               (try_begin),
  282.                 (gt, ":enemy_horse", -1),
  283.                 (le, ":enemy_distance", 800),
  284.                 (assign, ":there_are_enemies_nearby", 1),
  285.                 (assign, ":enemy_horse_id", ":enemy_horse"),
  286.               (else_try),
  287.                 (le, ":enemy_distance", 400),
  288.                 (assign, ":there_are_enemies_nearby", 1),
  289.               (try_end),
  290.             (try_end),
  291.             (set_fixed_point_multiplier, ":old_fpm"),
  292.             (try_begin),
  293.               (lt, ":horse", 0),
  294.               (eq, ":there_are_enemies_nearby", 1),
  295.               (eq, ":wielded_type", itp_type_thrown),
  296.               (gt, ":enemy_horse_id", -1),
  297.               (gt, ":have_thrust_polearm_item", -1),
  298.               (agent_set_wielded_item, ":agent_id", ":have_thrust_polearm_item"),
  299.               (assign, ":end_this_one", 1),
  300.             (else_try),
  301.               (eq, ":there_are_enemies_nearby", 1),
  302.               (eq, ":wielded_type", itp_type_thrown),
  303.               (agent_set_wielded_item, ":agent_id", -1),
  304.               (assign,":wielded_weapon",-1),
  305.               (assign,":wielded_type",-1),
  306.             (else_try),
  307.               (lt, ":horse", 0),
  308.               (eq, ":there_are_enemies_nearby", 0),
  309.               (this_or_next|eq, ":wielded_type", itp_type_one_handed_wpn),
  310.               (this_or_next|eq, ":wielded_type", itp_type_two_handed_wpn),
  311.               (eq, ":wielded_type", itp_type_polearm),
  312.               (agent_set_wielded_item, ":agent_id", ":thrown_ammo_id"),
  313.               (assign, ":end_this_one", 1),
  314.             (else_try),
  315.               (gt, ":horse", -1),
  316.               (eq, ":there_are_enemies_nearby", 0),
  317.               (this_or_next|eq, ":wielded_type", itp_type_one_handed_wpn),
  318.               (this_or_next|eq, ":wielded_type", itp_type_two_handed_wpn),
  319.               (eq, ":wielded_type", itp_type_polearm),
  320.               (neg|item_has_property,":thrown_ammo_id",itp_cant_reload_on_horseback),
  321.               (neg|item_has_property,":thrown_ammo_id",itp_cant_use_on_horseback),
  322.               (agent_set_wielded_item, ":agent_id", ":thrown_ammo_id"),
  323.               (assign, ":end_this_one", 1),
  324.             (try_end),
  325.           (try_end),
  326. #------------------#
  327. #五:空手或相当于空手,切不能带盾的武器的情况
  328. #远程武器弹药用光,或者任何情况导致的空手。未携带盾。或只携带了不能带盾的武器。
  329. #------------------#
  330.           (eq, ":end_this_one", 0),
  331.           (try_begin),
  332.             (eq, ":have_melee", 1),
  333.             (this_or_next|eq, ":empty_ammo_shooter", 1),
  334.             (lt, ":wielded_weapon", 0),
  335.             (assign, ":only_two_handed", 0),
  336.             (try_begin),
  337.               (eq, ":have_item_use_two_handed", 1),
  338.               (eq, ":have_item_non_two_handed", 0),
  339.               (assign, ":only_two_handed", 1),
  340.             (try_end),
  341.             (this_or_next|eq, ":only_two_handed", 1),
  342.             (eq, ":have_shield", 0),
  343.             (assign, ":hold_weapon", -1),
  344.             (assign, ":com_damage", 0),
  345.             (try_for_range,":wp_slot",0,4),
  346.               (agent_get_item_slot,":item_id",":agent_id",":wp_slot"),
  347.               (gt, ":item_id", -1),
  348.               (this_or_next|item_has_capability, ":item_id", itcf_slashright_twohanded),
  349.               (item_has_capability, ":item_id", itcf_slashleft_twohanded),
  350.               (assign, ":continue", 0),
  351.               (try_begin),
  352.                 (lt, ":horse", 0),
  353.                 (assign, ":continue", 1),
  354.               (else_try),
  355.                 (neg|item_has_property,":item_id",itp_cant_reload_on_horseback),
  356.                 (neg|item_has_property,":item_id",itp_cant_use_on_horseback),
  357.                 (assign, ":continue", 1),
  358.               (try_end),
  359.               (eq, ":continue", 1),
  360.               (item_get_swing_damage, ":item_damage", ":item_id"),
  361.               (gt,":item_damage", 0),
  362.               (item_get_swing_damage_type, ":item_dmg_type", ":item_id"),
  363.               (try_begin),
  364.                 (eq,":item_dmg_type", 2),
  365.                 (val_mul,":item_damage", 8),
  366.                 (val_div,":item_damage", 5),
  367.               (else_try),
  368.                 (eq,":item_dmg_type", 1),
  369.                 (val_mul,":item_damage", 13),
  370.                 (val_div,":item_damage", 10),
  371.               (try_end),
  372.               (gt,":item_damage", ":com_damage"),
  373.               (assign, ":hold_weapon", ":item_id"),
  374.               (assign, ":com_damage", ":item_damage"),
  375.             (try_end),
  376.             (gt, ":hold_weapon", -1),
  377.             (agent_set_wielded_item, ":agent_id", ":hold_weapon"),
  378.             (assign, ":end_this_one", 1),
  379.           (try_end),
  380. #------------------#
  381. #六:空手或相当于空手,切盾牌的情况
  382. #没拿盾且不是双手射手(弓弩步枪),或双手射手但是没弹药,两种情况之一。
  383. #没拿武器或有武器但不妨碍持盾。骑兵切第一面可在马上用的盾。步兵切第一面任意盾。
  384. #------------------#
  385.           (eq, ":end_this_one", 0),
  386.           (try_begin),
  387.             (eq, ":have_shield", 1),
  388.             (assign, ":wielded_not_shield_and_twohand_range", 0),
  389.             (try_begin),
  390.               (neq, ":wielded_type", itp_type_crossbow),
  391.               (neq, ":wielded_type", itp_type_musket),
  392.               (neq, ":wielded_type", itp_type_bow),
  393.               (lt, ":wielded_shield", 0),
  394.               (assign, ":wielded_not_shield_and_twohand_range", 1),
  395.             (try_end),
  396.             (this_or_next|eq, ":empty_ammo_twohand_shooter", 1),
  397.             (eq, ":wielded_not_shield_and_twohand_range", 1),
  398.             (assign, ":wielded_wp_use_one_hand", 0),
  399.             (try_begin),
  400.               (gt, ":wielded_weapon", -1),
  401.               (neg|item_has_property,":wielded_weapon",itp_two_handed),
  402.               (assign, ":wielded_wp_use_one_hand", 1),
  403.             (try_end),
  404.             (this_or_next|eq, ":wielded_wp_use_one_hand", 1),
  405.             (lt, ":wielded_weapon", 0),
  406.             (assign, ":hold_shield", -1),
  407.             (try_for_range,":wp_slot",0,4),
  408.               (lt, ":hold_shield", 0),
  409.               (agent_get_item_slot,":item_id",":agent_id",":wp_slot"),
  410.               (gt, ":item_id", -1),
  411.               (item_get_type, ":item_type", ":item_id"),
  412.               (eq, ":item_type", itp_type_shield),
  413.               (try_begin),
  414.                 (lt, ":horse", 0),
  415.                 (assign, ":hold_shield", ":item_id"),
  416.               (else_try),
  417.                 (neg|item_has_property,":item_id",itp_cant_reload_on_horseback),
  418.                 (neg|item_has_property,":item_id",itp_cant_use_on_horseback),
  419.                 (assign, ":hold_shield", ":item_id"),
  420.               (try_end),
  421.             (try_end),
  422.             (gt, ":hold_shield", -1),
  423.             (agent_set_wielded_item, ":agent_id", ":hold_shield"),
  424.             (assign, ":end_this_one", 1),
  425.           (try_end),
  426. #------------------#
  427. #七:空手或相当于空手,切单手持握武器的情况
  428. #此时若右手仍然无武器,左手有盾。携带有可以配盾的武器。
  429. #步兵切可单手挥砍的武器,优先伤害更高的。骑兵切可马上单手用的武器,优先熟练度较高的。
  430. #------------------#
  431.           (eq, ":end_this_one", 0),
  432.           (try_begin),
  433.             (eq, ":have_item_non_two_handed", 1),
  434.             (gt, ":wielded_shield", -1),
  435.             (this_or_next|eq, ":empty_ammo_onehand_shooter", 1),
  436.             (lt, ":wielded_weapon", 0),
  437.             (assign, ":hold_weapon", -1),
  438.             (assign, ":com_damage", -1),
  439.             (assign, ":com_proficiency", -1),
  440.             (try_for_range,":wp_slot",0,4),
  441.               (agent_get_item_slot,":item_id",":agent_id",":wp_slot"),
  442.               (gt, ":item_id", -1),
  443.               (neg|item_has_property,":item_id",itp_two_handed),
  444.               (item_get_type, ":item_type", ":item_id"),
  445.               (this_or_next|eq, ":item_type", itp_type_one_handed_wpn),
  446.               (this_or_next|eq, ":item_type", itp_type_two_handed_wpn),
  447.               (eq, ":item_type", itp_type_polearm),
  448.               (item_get_thrust_damage, ":item_th_dmg", ":item_id"),
  449.               (item_get_swing_damage, ":item_damage", ":item_id"),
  450.               (this_or_next|gt,":item_th_dmg", 0),
  451.               (gt,":item_damage", 0),
  452.               (try_begin),
  453.                 (lt, ":horse", 0),
  454.                 (this_or_next|item_has_capability, ":item_id", itcf_slashright_onehanded),
  455.                 (item_has_capability, ":item_id", itcf_slashleft_onehanded),
  456.                 (gt,":item_damage", 0),
  457.                 (item_get_swing_damage_type, ":item_dmg_type", ":item_id"),
  458.                 (try_begin),
  459.                   (eq,":item_dmg_type", 2),
  460.                   (val_mul,":item_damage", 8),
  461.                   (val_div,":item_damage", 5),
  462.                 (else_try),
  463.                   (eq,":item_dmg_type", 1),
  464.                   (val_mul,":item_damage", 13),
  465.                   (val_div,":item_damage", 10),
  466.                 (try_end),
  467.                 (try_begin),
  468.                   (eq, ":item_type", itp_type_two_handed_wpn),
  469.                   (val_mul,":item_damage", 7),
  470.                   (val_div,":item_damage", 10),
  471.                 (try_end),
  472.                 (gt,":item_damage", ":com_damage"),
  473.                 (assign, ":hold_weapon", ":item_id"),
  474.                 (assign, ":com_damage", ":item_damage"),
  475.               (else_try),
  476.                 (neg|item_has_property,":item_id",itp_cant_reload_on_horseback),
  477.                 (neg|item_has_property,":item_id",itp_cant_use_on_horseback),
  478.                 (agent_get_troop_id, ":troop_id", ":agent_id"),
  479.                 (try_begin),
  480.                   (eq, ":item_type", itp_type_one_handed_wpn),
  481.                   (store_proficiency_level,":item_proficiency",":troop_id", wpt_one_handed_weapon),
  482.                 (else_try),
  483.                   (eq, ":item_type", itp_type_two_handed_wpn),
  484.                   (this_or_next|item_has_capability, ":item_id", itcf_slashright_onehanded),
  485.                   (item_has_capability, ":item_id", itcf_slashleft_onehanded),
  486.                   (store_proficiency_level,":item_proficiency",":troop_id", wpt_one_handed_weapon),
  487.                 (else_try),
  488.                   (eq, ":item_type", itp_type_polearm),
  489.                   (store_proficiency_level,":item_proficiency",":troop_id", wpt_polearm),
  490.                 (try_end),
  491.                 (gt, ":item_proficiency", ":com_proficiency"),
  492.                 (assign, ":hold_weapon", ":item_id"),
  493.                 (assign, ":com_proficiency", ":item_proficiency"),
  494.               (try_end),
  495.             (try_end),
  496.             (gt, ":hold_weapon", -1),
  497.             (agent_set_wielded_item, ":agent_id", ":hold_weapon"),
  498.             (assign, ":end_this_one", 1),
  499.           (try_end),
  500. #------------------#
  501. #八:若此时仍然空手或相当于空手,兜底切换任何可以切换的近战武器。
  502. #这是最后一种情况了,虽然判断的情况比较多,其实大部分情况并不会触发。
  503. #这个AI只是补充特殊情况的切换选择,查漏补缺,所以不会太占资源。
  504. #------------------#
  505.           (eq, ":end_this_one", 0),
  506.           (try_begin),
  507.             (eq, ":have_melee", 1),
  508.             (this_or_next|eq, ":empty_ammo_shooter", 1),
  509.             (lt, ":wielded_weapon", 0),
  510.             (assign, ":hold_weapon", -1),
  511.             (assign, ":com_damage", -1),
  512.             (try_for_range,":wp_slot",0,4),
  513.               (agent_get_item_slot,":item_id",":agent_id",":wp_slot"),
  514.               (gt, ":item_id", -1),
  515.               (item_get_type, ":item_type", ":item_id"),
  516.               (this_or_next|eq, ":item_type", itp_type_one_handed_wpn),
  517.               (this_or_next|eq, ":item_type", itp_type_two_handed_wpn),
  518.               (eq, ":item_type", itp_type_polearm),
  519.               (assign, ":continue", 0),
  520.               (try_begin),
  521.                 (lt, ":horse", 0),
  522.                 (assign, ":continue", 1),
  523.               (else_try),
  524.                 (neg|item_has_property,":item_id",itp_cant_reload_on_horseback),
  525.                 (neg|item_has_property,":item_id",itp_cant_use_on_horseback),
  526.                 (assign, ":continue", 1),
  527.               (try_end),
  528.               (eq, ":continue", 1),
  529.               (item_get_thrust_damage, ":item_th_dmg", ":item_id"),
  530.               (item_get_swing_damage, ":item_damage", ":item_id"),
  531.               (assign, ":thrust_item", 0),
  532.               (try_begin),
  533.                 (lt,":item_damage", ":item_th_dmg"),
  534.                 (assign, ":item_damage", ":item_th_dmg"),
  535.                 (assign, ":thrust_item", 1),
  536.               (try_end),
  537.               (gt,":item_damage", 0),
  538.               (try_begin),
  539.                 (eq, ":thrust_item", 1),
  540.                 (item_get_thrust_damage_type, ":item_dmg_type", ":item_id"),
  541.               (else_try),
  542.                 (item_get_swing_damage_type, ":item_dmg_type", ":item_id"),
  543.               (try_end),
  544.               (try_begin),
  545.                 (eq,":item_dmg_type", 2),
  546.                 (val_mul,":item_damage", 8),
  547.                 (val_div,":item_damage", 5),
  548.               (else_try),
  549.                 (eq,":item_dmg_type", 1),
  550.                 (val_mul,":item_damage", 13),
  551.                 (val_div,":item_damage", 10),
  552.               (try_end),
  553.               (try_begin),
  554.                 (eq, ":item_type", itp_type_two_handed_wpn),
  555.                 (this_or_next|item_has_capability, ":item_id", itcf_slashright_onehanded),
  556.                 (item_has_capability, ":item_id", itcf_slashleft_onehanded),
  557.                 (eq, ":have_shield", 1),
  558.                 (val_mul,":item_damage", 7),
  559.                 (val_div,":item_damage", 10),
  560.               (try_end),
  561.               (gt,":item_damage", ":com_damage"),
  562.               (assign, ":hold_weapon", ":item_id"),
  563.               (assign, ":com_damage", ":item_damage"),
  564.             (try_end),
  565.             (gt, ":hold_weapon", -1),
  566.             (agent_set_wielded_item, ":agent_id", ":hold_weapon"),
  567.           (try_end),
  568.         (try_end),
  569.     ]),
  570. ### 防止空手AI over
复制代码


TXT修改需要添加代码的场景(添加后重开新档)(前5个必加,后面的可选择):
lead_charge
castle_attack_walls_belfry
castle_attack_walls_ladder
village_attack_bandits
village_raid
sneak_caught_fight
bandits_at_night
besiege_inner_battle_castle
besiege_inner_battle_town_center
castle_attack_walls_defenders_sally
bandit_lair
quick_battle_battle
quick_battle_siege
游客,如果您要查看本帖隐藏内容请回复

评分

参与人数 1魅力 +20 收起 理由
15653910782 + 20 您的帖子很有价值!

查看全部评分

鲜花鸡蛋

15653910782  在2026-5-17 07:42  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下

8

主题

65

回帖

22

积分

随仆

Rank: 1

UID
2557955
第纳尔
139
精华
0
互助
0
荣誉
0
贡献
0
魅力
20
注册时间
2015-7-9
鲜花(2) 鸡蛋(0)
 楼主| 发表于 2026-5-6 12:44:40 | 显示全部楼层
本帖最后由 afl001 于 2026-5-6 12:46 编辑

编译通不过的话可以把代码里的中文字符都删掉。就是用 #------------------# 框起来的部分。

8

主题

65

回帖

22

积分

随仆

Rank: 1

UID
2557955
第纳尔
139
精华
0
互助
0
荣誉
0
贡献
0
魅力
20
注册时间
2015-7-9
鲜花(2) 鸡蛋(0)
 楼主| 发表于 2026-5-7 09:48:36 | 显示全部楼层
本帖最后由 afl001 于 2026-5-7 10:49 编辑

更新了一下:
无近战武器,携带多种投掷武器时,先用无近战模式的投掷武器(如果有),以免提前投光有近战模式的武器
如果另外的投掷武器不能切换(骑兵且其他投掷无法在马背上用),就视为没有

8

主题

65

回帖

22

积分

随仆

Rank: 1

UID
2557955
第纳尔
139
精华
0
互助
0
荣誉
0
贡献
0
魅力
20
注册时间
2015-7-9
鲜花(2) 鸡蛋(0)
 楼主| 发表于 2026-5-8 22:09:36 | 显示全部楼层
2026.5.8更新:
(一)
重新整理了投掷武器切换近战模式的逻辑:
未携带近战武器,武器栏有空位时,无论剩下多少弹药,先装备一把投掷武器的近战模式。
武器栏无空位时,等有投掷武器弹药打空,卸下打空的投掷,换成一把投掷武器的近战模式。
携带有多把有近战模式的投掷武器,优先切单手武器,不一定转换自卸下的那把。
强制切换其他类型的投掷,有时候都会出现一些智熄操作,所以取消了。
有空位就早切近战模式,而非死等最后1发弹药,也更为合理。
(二)
修正了一个可能导致反复切换的问题。

8

主题

65

回帖

22

积分

随仆

Rank: 1

UID
2557955
第纳尔
139
精华
0
互助
0
荣誉
0
贡献
0
魅力
20
注册时间
2015-7-9
鲜花(2) 鸡蛋(0)
 楼主| 发表于 2026-5-9 07:42:26 | 显示全部楼层
2026.5.9更新:
修正了弹药判断的一些潜在问题。

1

主题

79

回帖

29

积分

扈从

Rank: 2Rank: 2

UID
3648628
第纳尔
4
精华
0
互助
1
荣誉
0
贡献
0
魅力
0
注册时间
2024-4-24
鲜花(0) 鸡蛋(0)
发表于 2026-5-10 07:31:49 | 显示全部楼层
666666666666666666666666666666

26

主题

4146

回帖

1272

积分

骑士长

Rank: 5Rank: 5Rank: 5

UID
2781503
第纳尔
11406
精华
0
互助
4
荣誉
0
贡献
0
魅力
59
注册时间
2016-11-27

骑砍中文站APP会员勋章骑士美德之英勇勋章[杰出会员活跃勋章]霸主正版勋章元老骑士勋章战团正版勋章骑士美德之谦恭勋章[杰出会员财富勋章]

鲜花(99) 鸡蛋(1)
发表于 2026-5-16 14:14:30 | 显示全部楼层
老哥能修复这个ai中射完箭在原地发呆的情况吗
步弓近敌退射AI
https://bbs.mountblade.com.cn/thread-2075491-1-1.html
(出处: 骑马与砍杀中文站论坛)

8

主题

65

回帖

22

积分

随仆

Rank: 1

UID
2557955
第纳尔
139
精华
0
互助
0
荣誉
0
贡献
0
魅力
20
注册时间
2015-7-9
鲜花(2) 鸡蛋(0)
 楼主| 发表于 2026-5-16 20:19:33 | 显示全部楼层
2026.5.16更新:
(一)
增加了投掷近战相互切换的情况判断:
有些投掷AI,如果有2种投掷武器,1种弹药投完并不会切换第2种,但由于存在弹药,依然判定此兵种属于投掷。
此时手里如果没有拿着投掷武器,会站在原地发呆。为了防止这种情况,新增了投掷切换的判断。
周围4米内有步兵,8米内有骑兵,切近战(对骑兵优先切可直刺长杆),否则切投掷(存在有弹药投掷且不是其他类型射手)。
(二)
取消了卸除多余的弩/火枪的情况判断:
由于上个版本就已经改变了判断角色当前是否属于无弹药射手的方式,这部分内容其实是多余的。这版就把这部分无用的内容删了。
删了之后,也无需再区分攻城场景和非攻城场景,更为简洁。

8

主题

65

回帖

22

积分

随仆

Rank: 1

UID
2557955
第纳尔
139
精华
0
互助
0
荣誉
0
贡献
0
魅力
20
注册时间
2015-7-9
鲜花(2) 鸡蛋(0)
 楼主| 发表于 2026-5-16 20:19:55 | 显示全部楼层
本帖最后由 afl001 于 2026-5-16 20:43 编辑
15653910782 发表于 2026-5-16 14:14
老哥能修复这个ai中射完箭在原地发呆的情况吗
步弓近敌退射AI
https://bbs.mountblade.com.cn/thread-20754 ...

试试今天更新的版本
一般的无弹药情况前几天的版本应该就能解决
有多种投掷弹药,如果投掷AI没有写切换弹药的情况判断,有可能投完一种弹药发呆,今天更新的就是解决这个问题

26

主题

4146

回帖

1272

积分

骑士长

Rank: 5Rank: 5Rank: 5

UID
2781503
第纳尔
11406
精华
0
互助
4
荣誉
0
贡献
0
魅力
59
注册时间
2016-11-27

骑砍中文站APP会员勋章骑士美德之英勇勋章[杰出会员活跃勋章]霸主正版勋章元老骑士勋章战团正版勋章骑士美德之谦恭勋章[杰出会员财富勋章]

鲜花(99) 鸡蛋(1)
发表于 2026-5-17 19:39:40 | 显示全部楼层
afl001 发表于 2026-5-16 20:19
试试今天更新的版本
一般的无弹药情况前几天的版本应该就能解决
有多种投掷弹药,如果投掷AI没有写切换弹 ...

我测试了一下,那个ai的问题好像不是无弹药了而是还有最后一发弹药但射手切成近战就变傻了,最后一发弹药没有打出去,我用一个mod附身小兵身上发现的
还有,你下面发的txt码有问题加进去会闪退

8

主题

65

回帖

22

积分

随仆

Rank: 1

UID
2557955
第纳尔
139
精华
0
互助
0
荣誉
0
贡献
0
魅力
20
注册时间
2015-7-9
鲜花(2) 鸡蛋(0)
 楼主| 发表于 2026-5-18 07:50:46 | 显示全部楼层
本帖最后由 afl001 于 2026-5-18 08:00 编辑
15653910782 发表于 2026-5-17 19:39
我测试了一下,那个ai的问题好像不是无弹药了而是还有最后一发弹药但射手切成近战就变傻了,最后一发弹药 ...

闪退一般是添加代码时触发器计数忘了+1,或者没有新开档,旧档触发器的数量和游戏文件不一致。
我测试好了才发出来的,从没发现闪退的情况。你重新开档试试。
————

你发的这个步弓ai在判断射手身份时有点问题,只要有弹药,有远程武器,就判断为远程,但又没有包括弩/火枪已上膛的弹药。
这有可能导致:
1.弩手/火枪手的箭袋/弹筒中弹药已空,但武器上还有上膛弹药,这时候就手里拿着一把可以发射的弩/火枪,但又不满足执行射手AI的条件。
2.手里拿的不是远程武器,切换武器的条件不满足,但武器栏存在远程武器弹药,所以满足射手AI的执行条件,而实际上无法发射。
3.远程武器和弹药就算不匹配也满足射手AI的条件,但实际上无法发射。不过这种情况一般只有玩家手下npc才会出现,小兵和电脑的npc一般不会出现武器弹药不匹配,问题不是很大。
4.几种投掷弹药,但只能切换一种,第二种没写切换判断。

我更新的上一版,把切换投掷的部分修复了,应该能覆盖这个步弓退射AI的投掷切换问题。不过这毕竟不是专业的射手AI,只是防止空手AI,切换其他远程武器的代码要是写太多,就跟别的射手AI不兼容了。这得让原作者修复,重写射手身份的判断代码才行。论坛不鼓励反编译修改其他作者的未开源代码,我也不好改。

20

主题

973

回帖

438

积分

子爵[版主]

汉[Han]
联机ID:Han_DongHai

Rank: 7Rank: 7Rank: 7

UID
3033293
第纳尔
19626
精华
0
互助
24
荣誉
2
贡献
810
魅力
185
注册时间
2018-10-3

第十届战团中国联赛征战勋章汉匈决战正版勋章战团正版勋章霸主正版勋章骑士美德之谦恭勋章[杰出会员财富勋章]骑士美德之奉献勋章元老骑士勋章

QQ
鲜花(51) 鸡蛋(0)
发表于 5 天前 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站

GMT+8, 2026-6-6 03:29 , Processed in 0.130305 second(s), 26 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表