本帖最后由 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 的任务场景中)
- # 防止空手AI,添加在 mission_templates,作者afl001,若用在公开MOD注明一下来源
- # 编译通不过,请删掉所有中文字符,或在PY文件顶部增加 # -*- coding: utf-8 -*-
- (0.5, 0, 0, [],
- [
- (try_for_agents, ":agent_id"),
- (assign, ":end_this_one", 0),
- (agent_is_alive, ":agent_id"),
- (agent_is_human, ":agent_id"),
- (agent_is_non_player,":agent_id"),
- (agent_get_horse, ":horse", ":agent_id"),
- #------------------#
- #一:判断角色的武器状态
- #------------------#
- (eq, ":end_this_one", 0),
- (assign, ":have_weapon_space", 0),
- (assign, ":have_item_use_two_handed", 0),
- (assign, ":have_item_non_two_handed", 0),
- (assign, ":nums_of_thrown_use_melee", 0),
- (assign, ":have_thrust_polearm_item", -1),
- (assign, ":empty_ammo_thrown_item", -1),
- (assign, ":empty_ammo_thrown_other", 0),
- (assign, ":thrown_ammo_id", -1),
- (assign, ":have_melee", 0),
- (assign, ":have_shield", 0),
- (assign, ":archer", 0),
- (assign, ":crossbowman", 0),
- (assign, ":pistolman", 0),
- (assign, ":musketman", 0),
- (assign, ":check_1", 0),
- (assign, ":check_2", 0),
- (assign, ":check_3", 0),
- (assign, ":check_4", 0),
- (assign, ":check_5", 0),
- (assign, ":check_6", 0),
- (assign, ":check_7", 0),
- (try_for_range,":wp_slot",0,4),
- (agent_get_item_slot,":item_id",":agent_id",":wp_slot"),
- (try_begin),
- (lt,":item_id",0),
- (val_add, ":have_weapon_space", 1),
- (try_end),
- (gt,":item_id",-1),
- (item_get_type, ":item_type", ":item_id"),
- (try_begin),
- (this_or_next|eq, ":item_type", itp_type_one_handed_wpn),
- (this_or_next|eq, ":item_type", itp_type_two_handed_wpn),
- (eq, ":item_type", itp_type_polearm),
- (assign, ":have_melee", 1),
- (try_begin),
- (item_has_property,":item_id",itp_two_handed),
- (assign, ":have_item_use_two_handed", 1),
- (try_end),
- (try_begin),
- (neg|item_has_property,":item_id",itp_two_handed),
- (assign, ":have_item_non_two_handed", 1),
- (try_end),
- (try_begin),
- (eq, ":have_thrust_polearm_item", -1),
- (eq, ":item_type", itp_type_polearm),
- (item_has_capability, ":item_id", itcf_thrust_polearm),
- (assign,":have_thrust_polearm_item", ":item_id"),
- (try_end),
- (else_try),
- (eq, ":item_type", itp_type_shield),
- (assign, ":have_shield", 1),
- (else_try),
- (eq, ":item_type", itp_type_thrown),
- (try_begin),
- (item_has_property,":item_id",itp_next_item_as_melee),
- (val_add, ":nums_of_thrown_use_melee", 1),
- (try_end),
- (try_begin),
- (eq, ":empty_ammo_thrown_item", ":item_id"),
- (val_add, ":empty_ammo_thrown_other", 1),
- (try_end),
- (agent_get_ammo_for_slot,":slot_ammo",":agent_id",":wp_slot"),
- (try_begin),
- (eq,":slot_ammo",0),
- (eq,":empty_ammo_thrown_item",-1),
- (assign, ":empty_ammo_thrown_item", ":item_id"),
- (else_try),
- (gt,":slot_ammo",0),
- (eq,":thrown_ammo_id",-1),
- (assign, ":thrown_ammo_id", ":item_id"),
- (try_end),
- (else_try),
- (eq, ":check_1", 0),
- (eq, ":item_type", itp_type_bow),
- (val_add, ":archer", 1),
- (assign, ":check_1", 1),
- (else_try),
- (eq, ":check_2", 0),
- (eq, ":item_type", itp_type_crossbow),
- (val_add, ":crossbowman", 1),
- (assign, ":check_2", 1),
- (else_try),
- (eq, ":check_3", 0),
- (eq, ":item_type", itp_type_pistol),
- (val_add, ":pistolman", 1),
- (assign, ":check_3", 1),
- (else_try),
- (eq, ":check_4", 0),
- (eq, ":item_type", itp_type_musket),
- (val_add, ":musketman", 1),
- (assign, ":check_4", 1),
- (else_try),
- (eq, ":check_5", 0),
- (eq, ":item_type", itp_type_arrows),
- (val_add, ":archer", 1),
- (assign, ":check_5", 1),
- (else_try),
- (eq, ":check_6", 0),
- (eq, ":item_type", itp_type_bolts),
- (val_add, ":crossbowman", 1),
- (assign, ":check_6", 1),
- (else_try),
- (eq, ":check_7", 0),
- (eq, ":item_type", itp_type_bullets),
- (val_add, ":pistolman", 1),
- (val_add, ":musketman", 1),
- (assign, ":check_7", 1),
- (try_end),
- (try_end),
- #------------------#
- #二:投掷武器切近战模式的情况
- #未携带近战武器,武器栏有空位时,无论剩下多少弹药,先装备一把投掷武器的近战模式。
- #武器栏无空位时,等有投掷武器弹药打空,卸下打空的投掷,换成一把投掷武器的近战模式。
- #携带有多把有近战模式的投掷武器,优先切单手武器,不一定转换自卸下的那把。
- #------------------#
- (eq, ":end_this_one", 0),
- (try_begin),
- (this_or_next|gt, ":have_weapon_space", 0),
- (gt, ":empty_ammo_thrown_item", -1),
- (eq, ":have_melee", 0),
- (gt, ":nums_of_thrown_use_melee", 0),
- (assign,":hold_weapon", -1),
- (assign,":hold_weapon_2", -1),
- (assign,":com_damage", 0),
- (assign, ":try_end", 4),
- (try_for_range,":wp_slot",0,":try_end"),
- (agent_get_item_slot,":item_id",":agent_id",":wp_slot"),
- (gt,":item_id",-1),
- (item_get_type, ":item_type", ":item_id"),
- (eq,":item_type", itp_type_thrown),
- (item_has_property,":item_id",itp_next_item_as_melee),
- (store_add,":next_item_id",":item_id",1),
- (gt, ":next_item_id", 0),
- (item_get_type, ":next_item_type", ":next_item_id"),
- (this_or_next|eq, ":next_item_type", itp_type_one_handed_wpn),
- (this_or_next|eq, ":next_item_type", itp_type_two_handed_wpn),
- (eq, ":next_item_type", itp_type_polearm),
- (try_begin),
- (eq, ":nums_of_thrown_use_melee", 1),
- (assign, ":hold_weapon", ":next_item_id"),
- (assign, ":try_end", 0),
- (try_end),
- (gt, ":nums_of_thrown_use_melee", 1),
- (try_begin),
- (eq, ":hold_weapon_2", -1),
- (assign,":hold_weapon_2", ":next_item_id"),
- (try_end),
- (eq, ":next_item_type", itp_type_one_handed_wpn),
- (item_get_swing_damage, ":item_damage", ":next_item_id"),
- (gt,":item_damage", ":com_damage"),
- (try_begin),
- (lt, ":horse", 0),
- (assign, ":hold_weapon", ":next_item_id"),
- (assign, ":com_damage", ":item_damage"),
- (else_try),
- (neg|item_has_property,":item_id",itp_cant_reload_on_horseback),
- (neg|item_has_property,":item_id",itp_cant_use_on_horseback),
- (assign, ":hold_weapon", ":next_item_id"),
- (assign, ":com_damage", ":item_damage"),
- (try_end),
- (try_end),
- (try_begin),
- (eq, ":have_weapon_space", 0),
- (agent_unequip_item, ":agent_id", ":empty_ammo_thrown_item"),
- (gt, ":empty_ammo_thrown_other", 0),
- (try_for_range,":unused",0,":empty_ammo_thrown_other"),
- (agent_equip_item, ":agent_id", ":empty_ammo_thrown_item"),
- (try_end),
- (try_end),
- (try_begin),
- (try_begin),
- (lt, ":hold_weapon", 0),
- (assign,":hold_weapon", ":hold_weapon_2"),
- (try_end),
- (gt, ":hold_weapon", -1),
- (agent_equip_item, ":agent_id", ":hold_weapon"),
- (try_end),
- (try_end),
- #------------------#
- #三:现在开始不再卸武器,这里提前判断角色是否空弹的射手,下面很多地方会用到
- #------------------#
- (eq, ":end_this_one", 0),
- (agent_get_wielded_item, ":wielded_weapon", ":agent_id", 0),
- (agent_get_wielded_item, ":wielded_shield", ":agent_id", 1),
- (assign, ":wielded_type", -1),
- (try_begin),
- (gt,":wielded_weapon",-1),
- (item_get_type, ":wielded_type", ":wielded_weapon"),
- (try_end),
- (agent_get_ammo, ":cur_ammo", ":agent_id" , 1),
- (try_begin),
- (eq, ":cur_ammo", 0),
- (assign, ":empty_ammo_twohand_shooter", 0),
- (try_begin),
- (assign, ":empty_ammo_crossbow", 0),
- (assign, ":empty_ammo_musket", 0),
- (assign, ":empty_ammo_bow", 0),
- (try_begin),
- (eq, ":wielded_type", itp_type_crossbow),
- (assign, ":empty_ammo_crossbow", 1),
- (try_end),
- (try_begin),
- (eq, ":wielded_type", itp_type_musket),
- (assign, ":empty_ammo_musket", 1),
- (try_end),
- (try_begin),
- (eq, ":wielded_type", itp_type_bow),
- (assign, ":empty_ammo_bow", 1),
- (try_end),
- (this_or_next|eq, ":empty_ammo_crossbow", 1),
- (this_or_next|eq, ":empty_ammo_musket", 1),
- (eq, ":empty_ammo_bow", 1),
- (assign, ":empty_ammo_twohand_shooter", 1),
- (try_end),
- (assign, ":empty_ammo_onehand_shooter", 0),
- (try_begin),
- (assign, ":empty_ammo_thrown", 0),
- (assign, ":empty_ammo_pistol", 0),
- (try_begin),
- (eq, ":wielded_type", itp_type_thrown),
- (assign, ":empty_ammo_thrown", 1),
- (try_end),
- (try_begin),
- (eq, ":wielded_type", itp_type_pistol),
- (assign, ":empty_ammo_pistol", 1),
- (try_end),
- (this_or_next|eq, ":empty_ammo_thrown", 1),
- (eq, ":empty_ammo_pistol", 1),
- (assign, ":empty_ammo_onehand_shooter", 1),
- (try_end),
- (assign, ":empty_ammo_shooter", 0),
- (try_begin),
- (this_or_next|eq, ":empty_ammo_twohand_shooter", 1),
- (eq, ":empty_ammo_onehand_shooter", 1),
- (assign, ":empty_ammo_shooter", 1),
- (try_end),
- (try_end),
- #------------------#
- #四:投掷近战相互切换的情况
- #有些投掷AI,如果有2种投掷武器,1种弹药投完并不会切换第2种,但由于存在弹药,依然判定此兵种属于投掷。
- #此时手里如果没有拿着投掷武器,会站在原地发呆。为了防止这种情况,新增了投掷切换的判断。
- #周围4米内有步兵,8米内有骑兵,切近战(对骑兵优先切可直刺长杆),否则切投掷(存在有弹药投掷且不是其他类型射手)。
- #------------------#
- (try_begin),
- (eq, ":have_melee", 1),
- (gt, ":thrown_ammo_id", -1),
- (lt, ":archer", 2),
- (lt, ":crossbowman", 2),
- (lt, ":pistolman", 2),
- (lt, ":musketman", 2),
- (agent_get_team,":team_id", ":agent_id"),
- (agent_get_position, pos1, ":agent_id"),
- (assign, ":there_are_enemies_nearby", 0),
- (assign, ":enemy_horse_id", -1),
- (assign, ":old_fpm", 1),
- (convert_to_fixed_point, ":old_fpm"),
- (set_fixed_point_multiplier, 100),
- (try_for_agents,":enemy_agent"),
- (eq, ":there_are_enemies_nearby", 0),
- (agent_is_alive, ":enemy_agent"),
- (agent_is_human, ":enemy_agent"),
- (agent_get_team, ":enemy_team", ":enemy_agent"),
- (teams_are_enemies, ":enemy_team", ":team_id"),
- (agent_get_position, pos2, ":enemy_agent"),
- (get_distance_between_positions,":enemy_distance",pos1,pos2),
- (agent_get_horse, ":enemy_horse", ":enemy_agent"),
- (try_begin),
- (gt, ":enemy_horse", -1),
- (le, ":enemy_distance", 800),
- (assign, ":there_are_enemies_nearby", 1),
- (assign, ":enemy_horse_id", ":enemy_horse"),
- (else_try),
- (le, ":enemy_distance", 400),
- (assign, ":there_are_enemies_nearby", 1),
- (try_end),
- (try_end),
- (set_fixed_point_multiplier, ":old_fpm"),
- (try_begin),
- (lt, ":horse", 0),
- (eq, ":there_are_enemies_nearby", 1),
- (eq, ":wielded_type", itp_type_thrown),
- (gt, ":enemy_horse_id", -1),
- (gt, ":have_thrust_polearm_item", -1),
- (agent_set_wielded_item, ":agent_id", ":have_thrust_polearm_item"),
- (assign, ":end_this_one", 1),
- (else_try),
- (eq, ":there_are_enemies_nearby", 1),
- (eq, ":wielded_type", itp_type_thrown),
- (agent_set_wielded_item, ":agent_id", -1),
- (assign,":wielded_weapon",-1),
- (assign,":wielded_type",-1),
- (else_try),
- (lt, ":horse", 0),
- (eq, ":there_are_enemies_nearby", 0),
- (this_or_next|eq, ":wielded_type", itp_type_one_handed_wpn),
- (this_or_next|eq, ":wielded_type", itp_type_two_handed_wpn),
- (eq, ":wielded_type", itp_type_polearm),
- (agent_set_wielded_item, ":agent_id", ":thrown_ammo_id"),
- (assign, ":end_this_one", 1),
- (else_try),
- (gt, ":horse", -1),
- (eq, ":there_are_enemies_nearby", 0),
- (this_or_next|eq, ":wielded_type", itp_type_one_handed_wpn),
- (this_or_next|eq, ":wielded_type", itp_type_two_handed_wpn),
- (eq, ":wielded_type", itp_type_polearm),
- (neg|item_has_property,":thrown_ammo_id",itp_cant_reload_on_horseback),
- (neg|item_has_property,":thrown_ammo_id",itp_cant_use_on_horseback),
- (agent_set_wielded_item, ":agent_id", ":thrown_ammo_id"),
- (assign, ":end_this_one", 1),
- (try_end),
- (try_end),
- #------------------#
- #五:空手或相当于空手,切不能带盾的武器的情况
- #远程武器弹药用光,或者任何情况导致的空手。未携带盾。或只携带了不能带盾的武器。
- #------------------#
- (eq, ":end_this_one", 0),
- (try_begin),
- (eq, ":have_melee", 1),
- (this_or_next|eq, ":empty_ammo_shooter", 1),
- (lt, ":wielded_weapon", 0),
- (assign, ":only_two_handed", 0),
- (try_begin),
- (eq, ":have_item_use_two_handed", 1),
- (eq, ":have_item_non_two_handed", 0),
- (assign, ":only_two_handed", 1),
- (try_end),
- (this_or_next|eq, ":only_two_handed", 1),
- (eq, ":have_shield", 0),
- (assign, ":hold_weapon", -1),
- (assign, ":com_damage", 0),
- (try_for_range,":wp_slot",0,4),
- (agent_get_item_slot,":item_id",":agent_id",":wp_slot"),
- (gt, ":item_id", -1),
- (this_or_next|item_has_capability, ":item_id", itcf_slashright_twohanded),
- (item_has_capability, ":item_id", itcf_slashleft_twohanded),
- (assign, ":continue", 0),
- (try_begin),
- (lt, ":horse", 0),
- (assign, ":continue", 1),
- (else_try),
- (neg|item_has_property,":item_id",itp_cant_reload_on_horseback),
- (neg|item_has_property,":item_id",itp_cant_use_on_horseback),
- (assign, ":continue", 1),
- (try_end),
- (eq, ":continue", 1),
- (item_get_swing_damage, ":item_damage", ":item_id"),
- (gt,":item_damage", 0),
- (item_get_swing_damage_type, ":item_dmg_type", ":item_id"),
- (try_begin),
- (eq,":item_dmg_type", 2),
- (val_mul,":item_damage", 8),
- (val_div,":item_damage", 5),
- (else_try),
- (eq,":item_dmg_type", 1),
- (val_mul,":item_damage", 13),
- (val_div,":item_damage", 10),
- (try_end),
- (gt,":item_damage", ":com_damage"),
- (assign, ":hold_weapon", ":item_id"),
- (assign, ":com_damage", ":item_damage"),
- (try_end),
- (gt, ":hold_weapon", -1),
- (agent_set_wielded_item, ":agent_id", ":hold_weapon"),
- (assign, ":end_this_one", 1),
- (try_end),
- #------------------#
- #六:空手或相当于空手,切盾牌的情况
- #没拿盾且不是双手射手(弓弩步枪),或双手射手但是没弹药,两种情况之一。
- #没拿武器或有武器但不妨碍持盾。骑兵切第一面可在马上用的盾。步兵切第一面任意盾。
- #------------------#
- (eq, ":end_this_one", 0),
- (try_begin),
- (eq, ":have_shield", 1),
- (assign, ":wielded_not_shield_and_twohand_range", 0),
- (try_begin),
- (neq, ":wielded_type", itp_type_crossbow),
- (neq, ":wielded_type", itp_type_musket),
- (neq, ":wielded_type", itp_type_bow),
- (lt, ":wielded_shield", 0),
- (assign, ":wielded_not_shield_and_twohand_range", 1),
- (try_end),
- (this_or_next|eq, ":empty_ammo_twohand_shooter", 1),
- (eq, ":wielded_not_shield_and_twohand_range", 1),
- (assign, ":wielded_wp_use_one_hand", 0),
- (try_begin),
- (gt, ":wielded_weapon", -1),
- (neg|item_has_property,":wielded_weapon",itp_two_handed),
- (assign, ":wielded_wp_use_one_hand", 1),
- (try_end),
- (this_or_next|eq, ":wielded_wp_use_one_hand", 1),
- (lt, ":wielded_weapon", 0),
- (assign, ":hold_shield", -1),
- (try_for_range,":wp_slot",0,4),
- (lt, ":hold_shield", 0),
- (agent_get_item_slot,":item_id",":agent_id",":wp_slot"),
- (gt, ":item_id", -1),
- (item_get_type, ":item_type", ":item_id"),
- (eq, ":item_type", itp_type_shield),
- (try_begin),
- (lt, ":horse", 0),
- (assign, ":hold_shield", ":item_id"),
- (else_try),
- (neg|item_has_property,":item_id",itp_cant_reload_on_horseback),
- (neg|item_has_property,":item_id",itp_cant_use_on_horseback),
- (assign, ":hold_shield", ":item_id"),
- (try_end),
- (try_end),
- (gt, ":hold_shield", -1),
- (agent_set_wielded_item, ":agent_id", ":hold_shield"),
- (assign, ":end_this_one", 1),
- (try_end),
- #------------------#
- #七:空手或相当于空手,切单手持握武器的情况
- #此时若右手仍然无武器,左手有盾。携带有可以配盾的武器。
- #步兵切可单手挥砍的武器,优先伤害更高的。骑兵切可马上单手用的武器,优先熟练度较高的。
- #------------------#
- (eq, ":end_this_one", 0),
- (try_begin),
- (eq, ":have_item_non_two_handed", 1),
- (gt, ":wielded_shield", -1),
- (this_or_next|eq, ":empty_ammo_onehand_shooter", 1),
- (lt, ":wielded_weapon", 0),
- (assign, ":hold_weapon", -1),
- (assign, ":com_damage", -1),
- (assign, ":com_proficiency", -1),
- (try_for_range,":wp_slot",0,4),
- (agent_get_item_slot,":item_id",":agent_id",":wp_slot"),
- (gt, ":item_id", -1),
- (neg|item_has_property,":item_id",itp_two_handed),
- (item_get_type, ":item_type", ":item_id"),
- (this_or_next|eq, ":item_type", itp_type_one_handed_wpn),
- (this_or_next|eq, ":item_type", itp_type_two_handed_wpn),
- (eq, ":item_type", itp_type_polearm),
- (item_get_thrust_damage, ":item_th_dmg", ":item_id"),
- (item_get_swing_damage, ":item_damage", ":item_id"),
- (this_or_next|gt,":item_th_dmg", 0),
- (gt,":item_damage", 0),
- (try_begin),
- (lt, ":horse", 0),
- (this_or_next|item_has_capability, ":item_id", itcf_slashright_onehanded),
- (item_has_capability, ":item_id", itcf_slashleft_onehanded),
- (gt,":item_damage", 0),
- (item_get_swing_damage_type, ":item_dmg_type", ":item_id"),
- (try_begin),
- (eq,":item_dmg_type", 2),
- (val_mul,":item_damage", 8),
- (val_div,":item_damage", 5),
- (else_try),
- (eq,":item_dmg_type", 1),
- (val_mul,":item_damage", 13),
- (val_div,":item_damage", 10),
- (try_end),
- (try_begin),
- (eq, ":item_type", itp_type_two_handed_wpn),
- (val_mul,":item_damage", 7),
- (val_div,":item_damage", 10),
- (try_end),
- (gt,":item_damage", ":com_damage"),
- (assign, ":hold_weapon", ":item_id"),
- (assign, ":com_damage", ":item_damage"),
- (else_try),
- (neg|item_has_property,":item_id",itp_cant_reload_on_horseback),
- (neg|item_has_property,":item_id",itp_cant_use_on_horseback),
- (agent_get_troop_id, ":troop_id", ":agent_id"),
- (try_begin),
- (eq, ":item_type", itp_type_one_handed_wpn),
- (store_proficiency_level,":item_proficiency",":troop_id", wpt_one_handed_weapon),
- (else_try),
- (eq, ":item_type", itp_type_two_handed_wpn),
- (this_or_next|item_has_capability, ":item_id", itcf_slashright_onehanded),
- (item_has_capability, ":item_id", itcf_slashleft_onehanded),
- (store_proficiency_level,":item_proficiency",":troop_id", wpt_one_handed_weapon),
- (else_try),
- (eq, ":item_type", itp_type_polearm),
- (store_proficiency_level,":item_proficiency",":troop_id", wpt_polearm),
- (try_end),
- (gt, ":item_proficiency", ":com_proficiency"),
- (assign, ":hold_weapon", ":item_id"),
- (assign, ":com_proficiency", ":item_proficiency"),
- (try_end),
- (try_end),
- (gt, ":hold_weapon", -1),
- (agent_set_wielded_item, ":agent_id", ":hold_weapon"),
- (assign, ":end_this_one", 1),
- (try_end),
- #------------------#
- #八:若此时仍然空手或相当于空手,兜底切换任何可以切换的近战武器。
- #这是最后一种情况了,虽然判断的情况比较多,其实大部分情况并不会触发。
- #这个AI只是补充特殊情况的切换选择,查漏补缺,所以不会太占资源。
- #------------------#
- (eq, ":end_this_one", 0),
- (try_begin),
- (eq, ":have_melee", 1),
- (this_or_next|eq, ":empty_ammo_shooter", 1),
- (lt, ":wielded_weapon", 0),
- (assign, ":hold_weapon", -1),
- (assign, ":com_damage", -1),
- (try_for_range,":wp_slot",0,4),
- (agent_get_item_slot,":item_id",":agent_id",":wp_slot"),
- (gt, ":item_id", -1),
- (item_get_type, ":item_type", ":item_id"),
- (this_or_next|eq, ":item_type", itp_type_one_handed_wpn),
- (this_or_next|eq, ":item_type", itp_type_two_handed_wpn),
- (eq, ":item_type", itp_type_polearm),
- (assign, ":continue", 0),
- (try_begin),
- (lt, ":horse", 0),
- (assign, ":continue", 1),
- (else_try),
- (neg|item_has_property,":item_id",itp_cant_reload_on_horseback),
- (neg|item_has_property,":item_id",itp_cant_use_on_horseback),
- (assign, ":continue", 1),
- (try_end),
- (eq, ":continue", 1),
- (item_get_thrust_damage, ":item_th_dmg", ":item_id"),
- (item_get_swing_damage, ":item_damage", ":item_id"),
- (assign, ":thrust_item", 0),
- (try_begin),
- (lt,":item_damage", ":item_th_dmg"),
- (assign, ":item_damage", ":item_th_dmg"),
- (assign, ":thrust_item", 1),
- (try_end),
- (gt,":item_damage", 0),
- (try_begin),
- (eq, ":thrust_item", 1),
- (item_get_thrust_damage_type, ":item_dmg_type", ":item_id"),
- (else_try),
- (item_get_swing_damage_type, ":item_dmg_type", ":item_id"),
- (try_end),
- (try_begin),
- (eq,":item_dmg_type", 2),
- (val_mul,":item_damage", 8),
- (val_div,":item_damage", 5),
- (else_try),
- (eq,":item_dmg_type", 1),
- (val_mul,":item_damage", 13),
- (val_div,":item_damage", 10),
- (try_end),
- (try_begin),
- (eq, ":item_type", itp_type_two_handed_wpn),
- (this_or_next|item_has_capability, ":item_id", itcf_slashright_onehanded),
- (item_has_capability, ":item_id", itcf_slashleft_onehanded),
- (eq, ":have_shield", 1),
- (val_mul,":item_damage", 7),
- (val_div,":item_damage", 10),
- (try_end),
- (gt,":item_damage", ":com_damage"),
- (assign, ":hold_weapon", ":item_id"),
- (assign, ":com_damage", ":item_damage"),
- (try_end),
- (gt, ":hold_weapon", -1),
- (agent_set_wielded_item, ":agent_id", ":hold_weapon"),
- (try_end),
- (try_end),
- ]),
- ### 防止空手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
|