- 好友
- 2
- 在线时间
- 27 小时
- 最后登录
- 2025-3-22
贵族[MOD作者]
  
- UID
- 3048044
- 第纳尔
- 2219
- 精华
- 0
- 互助
- 19
- 荣誉
- 3
- 贡献
- 20
- 魅力
- 495
- 注册时间
- 2018-12-15
 鲜花( 40)  鸡蛋( 0)
|

楼主 |
发表于 2025-2-9 21:04:47
|
显示全部楼层
本帖最后由 黑暗路西法 于 2025-2-10 10:48 编辑
2.运用战团自带的操作符制作属于你自己的阵型
看完第一段你会发现以下问题:
1:阵型系统完全没有分组可言,直接拉成一排呼啦啦往前冲
2:5秒一次的方向纠正判定真的只是方向纠正,获取的兵种position人人平等,直接全获取一遍然后除以分母,导致玩家只要阵型一摆ai大脑直接烧了
3:阵型死板,且不说完全没用到后续火与剑补丁里的排成x排,连靠拢分散都没用上
虽然看起来这些是大问题,不过实际上改起来还是很容易的(而且很有趣)以下是我mod中正在使用的解决方法:
对于第1个问题,实际上上面已经给出答案了:你可以根据领主的位置为来移动position,来模拟阵型的初始设置,在列好阵之后你会面临第2个问题
对于第2个问题,获取敌人位置这个问题,实际上骑砍的底层agent行为逻辑就已经包含了最优的转向脚本了,即步兵会永远面向他认为威胁最大的敌人,我的基本思路就是在步兵前进过程中将步兵朝向作为阵型方向的依据
对于第3个问题,我的解决方式是将原版的class拓展,将原来的3兵种分组改造成6兵种分组(原版一共0-8共计9个分组)
接下来的部分如果你想照搬我的设定,可以完全照搬,如果不想照搬我的设定也可以,参考一下思路就好了
将
grc_infantry = 0
grc_archers = 1
grc_cavalry = 2
grc_heroes = 3
grc_everyone = 9
修改为
grc_infantry = 0
grc_pikeman = 1
grc_berserker = 2
grc_archers = 3
grc_cavalry = 4
grc_horse_archer = 5
grc_heroes = 6
grc_everyone = 9
|
接下来是实装分组部分,想在文件里打中文需要在文件最顶上加上一行#coding=utf-8
这样让兵种根据自己的装备细化分组,将步兵拆解为三种
(try_for_range,":troop","trp_farmer","trp_npc1"),
(try_begin),#设定兵种分组,新
(troop_is_hero,":troop"),
(troop_set_class, ":troop", grc_heroes),
(else_try),
(troop_is_guarantee_horse,":troop"),
(troop_is_guarantee_ranged,":troop"),
(troop_get_inventory_capacity, ":inv_cap", ":troop"),
(try_for_range, ":i_slot", 0, ":inv_cap"),
(troop_get_inventory_slot, ":item", ":troop", ":i_slot"),
(neq,":item",-1),
(item_get_type,":troop_itp",":item"),
(this_or_next|eq,":troop_itp",itp_type_bow),
(this_or_next|eq,":troop_itp",itp_type_crossbow),
(this_or_next|eq,":troop_itp",itp_type_pistol),
(eq,":troop_itp",itp_type_thrown),
(neg|item_has_property, ":item", itp_cant_use_on_horseback),
(troop_set_class, ":troop", grc_horse_archer),
(try_end),
(else_try),
(troop_is_guarantee_horse,":troop"),
(troop_set_class, ":troop", grc_cavalry),
(else_try),
(troop_is_guarantee_ranged,":troop"),
(troop_set_class, ":troop", grc_archers),
(else_try),
(assign,":polearm",0),
(assign,":two_handed",0),
(troop_get_inventory_capacity, ":inv_cap", ":troop"),
(try_for_range, ":i_slot", 0, ":inv_cap"),
(troop_get_inventory_slot, ":item", ":troop", ":i_slot"),
(try_begin),
(eq,":item",-1),
(assign,":inv_cap",0),
(try_end),
(neq,":item",-1),
(item_get_type,":troop_itp",":item"),
(try_begin),
(eq,":troop_itp",itp_type_two_handed_wpn),
(val_add,":two_handed",1),
(else_try),
(eq,":troop_itp",itp_type_polearm),
(val_add,":polearm",1),
(else_try),
(this_or_next|eq,":troop_itp",itp_type_one_handed_wpn),
(this_or_next|eq,":troop_itp",itp_type_bow),
(this_or_next|eq,":troop_itp",itp_type_crossbow),
(this_or_next|eq,":troop_itp",itp_type_thrown),
(eq,":troop_itp",itp_type_shield),
(val_sub,":polearm",10000),
(val_sub,":two_handed",10000),
(assign,":inv_cap",0),
(try_end),
(try_end),
(try_begin),
(ge,":two_handed",1),
(ge,":polearm",0),
(gt,":two_handed",":polearm"),
(troop_set_class, ":troop", grc_berserker),
(else_try),
(ge,":two_handed",0),
(ge,":polearm",1),
(gt,":polearm",":two_handed"),
(troop_set_class, ":troop", grc_pikeman),
(else_try),
(this_or_next|ge,":two_handed",1),
(ge,":polearm",1),
(troop_set_class, ":troop", grc_berserker),
(else_try),
(troop_set_class, ":troop", grc_infantry),
(try_end),
(try_end),
(try_end),
#注意,你还可以在这之后重新设置分组,这样就可以让标配远程的单位站到前线或让其他有特殊机制的兵种更换分组
(class_set_name,grc_infantry,"@前 排 步 兵 "),
(class_set_name,grc_pikeman,"@长 矛 兵 "),
(class_set_name,grc_berserker,"@双 手 步 兵 "),
(class_set_name,grc_archers,"@射 手 "),
(class_set_name,grc_cavalry,"@近 战 骑 兵 "),
(class_set_name,grc_horse_archer,"@投 射 骑 兵 "),
(class_set_name,grc_heroes,"@NPC"),
(class_set_name,7,"@预 备 队 1 "),
(class_set_name,8,"@预 备 队 2 "),
|
接下来是mission template的执行部分替换
将提到"script_battle_tactic_apply"这个脚本的位置修改一下,因为换了算法所以需要改为时间比较长的准备阶段
(store_mission_timer_a,":mission_time"),#阵型会缓慢结成之后再前进
(ge,":mission_time",30),
(set_fixed_point_multiplier, 1000),
(call_script, "script_battle_tactic_apply"),
|
接下来是阵型选择阶段,下面的这些脚本如果你仔细的读过第一部分会知道怎么换
先在constant的team slots底下加上
slot_team_order_inf_roll = 13 #兵种列阵行数
slot_team_order_bsk_roll = 14
slot_team_order_pik_roll = 15
slot_team_order_arc_roll = 16
slot_team_order_cav_roll = 17
slot_team_order_cav_range = 18 #骑兵散开的范围,根据步兵数量决定
# script_select_battle_tactic #选择战术
# Input: none
# Output: none
("select_battle_tactic",
[
(assign, "$ai_team_1_battle_tactic", 0),
(get_player_agent_no, ":player_agent"),
(agent_get_team, ":player_team", ":player_agent"),
(try_begin),
(num_active_teams_le, 2), #如果没有第三方那么就这么决定,0为防御方1为进攻方
(try_begin),
(eq, ":player_team", 0),
(assign, "$ai_team_1", 1),
(else_try),
(assign, "$ai_team_1", 0),
(try_end),
(assign, "$ai_team_2", -1),
(else_try),
(try_begin),
(eq, ":player_team", 0), #如果玩家是防御方,那么敌人就是进攻方
(assign, "$ai_team_1", 1),
(else_try),
(assign, "$ai_team_1", 0), #否则反之
(try_end),
(store_add, "$ai_team_2", ":player_team", 2),
(try_end),
(call_script, "script_select_battle_tactic_aux", "$ai_team_1", 0),
(assign, "$ai_team_1_battle_tactic", reg0),
(try_begin),
(ge, "$ai_team_2", 0),
(assign, ":defense_not_an_option", 0),
(try_begin),
(this_or_next|eq, "$ai_team_1_battle_tactic", btactic_hold),
(this_or_next|eq, "$ai_team_1_battle_tactic", btactic_parthian),
(eq, "$ai_team_1_battle_tactic", btactic_stand_ground),
(assign, ":defense_not_an_option", 1), #don't let two AI defend at the same time
(try_end),
(call_script, "script_select_battle_tactic_aux", "$ai_team_2", ":defense_not_an_option"),
(assign, "$ai_team_2_battle_tactic", reg0),
(try_end),
]),
##获取最近敌人的位置
# script_get_closest3_distance_of_enemies_at_pos1
# Input: arg1: team_no, pos1
# Output: reg0: distance in cms.
("get_closest3_distance_of_enemies_at_pos1",
[
(assign, ":min_distance_1", 100000),
(assign, ":min_distance_2", 100000),
(assign, ":min_distance_3", 100000),
(get_player_agent_no,":player_agent"),
(store_script_param, ":team_no", 1),
(try_for_agents,":cur_agent"),
(agent_is_alive, ":cur_agent"),
(agent_is_human, ":cur_agent"),
(agent_is_active, ":cur_agent"),
(agent_get_team, ":agent_team", ":cur_agent"),
(teams_are_enemies, ":agent_team", ":team_no"),
(agent_get_troop_id,":troop",":cur_agent"),
(agent_get_position, pos2, ":cur_agent"),
(get_distance_between_positions,":cur_dist",pos2,pos1),
(try_begin),
(eq,":player_agent",":cur_agent"), #是玩家,则玩家的距离为5%,勾引需要肉身贴脸
(val_mul,":cur_dist",20),
(else_try),
(troop_is_hero,":troop"),
(val_mul,":cur_dist",5), #单纯英雄贴近这个影响会变动为10%
(else_try),
(agent_get_horse,":horse",":cur_agent"),#骑射手,范围影响减少,只有60%
(troop_is_guarantee_ranged,":troop"),
(gt,":horse",1),
(val_mul,":cur_dist",5),
(val_div,":cur_dist",3),
(else_try),
(agent_get_horse,":horse",":cur_agent"),#肉搏骑兵,范围影响1.5倍(因为会贴脸)
(gt,":horse",1),
(val_mul,":cur_dist",2),
(val_div,":cur_dist",3),
(try_end),
(try_begin),
(lt, ":cur_dist", ":min_distance_1"),
(assign, ":min_distance_3", ":min_distance_2"),
(assign, ":min_distance_2", ":min_distance_1"),
(assign, ":min_distance_1", ":cur_dist"),
(else_try),
(lt, ":cur_dist", ":min_distance_2"),
(assign, ":min_distance_3", ":min_distance_2"),
(assign, ":min_distance_2", ":cur_dist"),
(else_try),
(lt, ":cur_dist", ":min_distance_3"),
(assign, ":min_distance_3", ":cur_dist"),
(try_end),
(try_end),
(assign, ":total_distance", 0),
(assign, ":total_count", 0),
(try_begin),
(lt, ":min_distance_1", 100000),
(val_add, ":total_distance", ":min_distance_1"),
(val_add, ":total_count", 1),
(try_end),
(try_begin),
(lt, ":min_distance_2", 100000),
(val_add, ":total_distance", ":min_distance_2"),
(val_add, ":total_count", 1),
(try_end),
(try_begin),
(lt, ":min_distance_3", 100000),
(val_add, ":total_distance", ":min_distance_3"),
(val_add, ":total_count", 1),
(try_end),
(assign, ":average_distance", 100),
(try_begin),
(gt, ":total_count", 1),
(store_div, ":average_distance", ":total_distance", ":total_count"),
(try_end),
(assign, reg0, ":average_distance"),
(assign, reg1, ":min_distance_1"),
(assign, reg2, ":min_distance_2"),
(assign, reg3, ":min_distance_3"),
]),
##部队构成部分
# script_team_get_class_percentages
# Input: arg1: team_no, arg2: try for team's enemies
# Output: reg0: percentage infantry, reg1: percentage archers, reg2: percentage cavalry
("team_get_class_percentages",
[
(store_script_param, ":team_no", 1),
(store_script_param, ":negate", 2),
(assign, ":num_infantry", 0),
(assign, ":num_archers", 0),
(assign, ":num_cavalry", 0),
(assign, ":num_berserker", 0),
(assign, ":num_pikeman", 0),
(assign, ":num_infantry_t", 0),
(assign, ":num_cavalry_t", 0),
(assign, ":num_horse_archer", 0),
(assign, ":num_total", 0),
(agent_get_team,":player_team","$player_agent_hp"),
(try_for_agents,":cur_agent"),
(agent_is_alive, ":cur_agent"),
(agent_is_human, ":cur_agent"),
(agent_get_team, ":agent_team", ":cur_agent"),
(assign, ":continue", 0),
(try_begin),
(eq, ":negate", 1),
(teams_are_enemies, ":agent_team", ":team_no"),
(assign, ":continue", 1),
(else_try),
(eq, ":agent_team", ":team_no"),
(assign, ":continue", 1),
(try_end),
(eq, ":continue", 1),
(val_add, ":num_total", 1),
(agent_get_class, ":agent_class", ":cur_agent"),
(try_begin),
(agent_get_team,":team_id",":cur_agent"),
(neq,":team_id",":player_team"),#不把玩家的兵种乱划分
(agent_get_troop_id,":troop_id", ":cur_agent"),
(troop_get_slot,":old_class",":troop_id",slot_troop_old_class),
(assign,":agent_class",":old_class"),
(try_begin),
(eq, ":agent_class", grc_infantry),#如果归类到步兵,但是没盾而且拿着双手武器,兵种归类到双手步兵
(agent_get_wielded_item,":weapon_1",":cur_agent",0),
(agent_get_wielded_item,":weapon_2",":cur_agent",1),
(ge,":weapon_1",1),
(eq,":weapon_2",-1),#左手没盾
(item_get_type,":type_1",":weapon_1"),
(try_begin),#拿着双手武器归类到双手步兵,拿着矛归类到矛兵
(eq,":type_1",itp_type_two_handed_wpn),
(agent_set_division, ":cur_agent", grc_berserker),
(assign,":agent_class",grc_berserker),
(else_try),
(eq,":type_1",itp_type_polearm),
(agent_set_division, ":cur_agent", grc_pikeman),
(assign,":agent_class",grc_pikeman),
(try_end),
(else_try),
(eq, ":agent_class", grc_berserker),#如果归类到双手步兵,但是有盾,兵种归类到双手步兵
(agent_get_wielded_item,":weapon_2",":cur_agent",1),
(ge,":weapon_1",1),
(ge,":weapon_2",1),#左手有盾
(item_get_type,":type_2",":weapon_2"),
(eq,":type_2",itp_type_shield),
(agent_set_division, ":cur_agent", grc_infantry),
(assign,":agent_class",grc_infantry),
(try_end),
(try_end),
(try_begin),
(this_or_next|eq, ":agent_class", grc_berserker),
(this_or_next|eq, ":agent_class", grc_pikeman),
(eq, ":agent_class", grc_infantry),
(val_add, ":num_infantry", 1),
(else_try),
(eq, ":agent_class", grc_archers),
(val_add, ":num_archers", 1),
(else_try),
(this_or_next|eq, ":agent_class", grc_horse_archer),
(eq, ":agent_class", grc_cavalry),
(try_begin),
(eq, ":agent_class", grc_cavalry),
(val_add, ":num_cavalry_t", 1),
(else_try),
(eq, ":agent_class", grc_horse_archer),
(val_add, ":num_horse_archer", 1),
(try_end),
(val_add, ":num_cavalry", 1),
(try_end),
(try_begin),
(eq, ":agent_class", grc_berserker),
(val_add, ":num_berserker", 1),
(else_try),
(eq, ":agent_class", grc_pikeman),
(val_add, ":num_pikeman", 1),
(else_try),
(eq, ":agent_class", grc_infantry),
(val_add, ":num_infantry_t", 1),
(try_end),
(try_end),
(try_begin), #
(neq,":team_no",":player_team"),#不把玩家的兵种乱划分
(le, ":num_horse_archer", 20), #如果凑不齐20个骑射手,骑兵的1/3会被作为骑射手使用
(store_div,":sub",":num_cavalry_t", 3),
(val_sub, ":num_cavalry_t",":sub" ),
(val_add, ":num_horse_archer",":sub" ),
(try_for_agents,":cur_agent"),
(gt,":sub",0),
(agent_is_alive, ":cur_agent"),
(agent_is_human, ":cur_agent"),
(agent_get_team, ":agent_team", ":cur_agent"),
(eq, ":agent_team", ":team_no"),
(troop_get_class,":class_no",":cur_agent"),
(eq,":class_no",grc_cavalry),
(agent_set_division, ":cur_agent", grc_horse_archer),
(val_sub,":sub",1),
(try_end),
(else_try),
(neq,":team_no",":player_team"),#不把玩家的兵种乱划分
(le, ":num_cavalry_t", 20), #如果凑不齐20个骑兵,骑射手的1/3会被作为骑兵使用
(store_div,":sub",":num_horse_archer", 3),
(val_sub, ":num_horse_archer",":sub" ),
(val_add, ":num_cavalry_t",":sub" ),
(try_for_agents,":cur_agent"),
(gt,":sub",0),
(agent_is_alive, ":cur_agent"),
(agent_is_human, ":cur_agent"),
(agent_get_team, ":agent_team", ":cur_agent"),
(eq, ":agent_team", ":team_no"),
(troop_get_class,":class_no",":cur_agent"),
(eq,":class_no",grc_horse_archer),
(agent_set_division, ":cur_agent", grc_cavalry),
(val_sub,":sub",1),
(try_end),
(try_end),
(try_begin),
(eq, ":num_total", 0),
(assign, ":num_total", 1),
(try_end),
(store_mul, ":perc_infantry",":num_infantry",100),
(val_div, ":perc_infantry",":num_total"),
(store_mul, ":perc_archers",":num_archers",100),
(val_div, ":perc_archers",":num_total"),
(store_mul, ":perc_cavalry",":num_cavalry",100),
(val_div, ":perc_cavalry",":num_total"),
(assign, reg0, ":perc_infantry"),
(assign, reg1, ":perc_archers"),
(assign, reg2, ":perc_cavalry"),
(assign, reg3, ":num_infantry_t"),
(assign, reg4, ":num_archers"),
(assign, reg5, ":num_cavalry"),
(assign, reg6, ":num_berserker"),
(assign, reg7, ":num_pikeman"),
]),
# script_select_battle_tactic_aux#选择具体战术
# Input: team_no
# Output: battle_tactic
("select_battle_tactic_aux",
[
(store_script_param, ":team_no", 1),
(store_script_param, ":defense_not_an_option", 2),
(assign, ":battle_tactic", 0),
(get_player_agent_no, ":player_agent"),
(agent_get_team, ":player_team", ":player_agent"),
(call_script, "script_team_get_class_percentages", ":team_no", 0),
(assign, ":ai_perc_infantry", reg0),
(assign, ":ai_perc_archers", reg1),
(assign, ":ai_perc_cavalry", reg2),
(assign, ":ai_total_infantry", reg3),
(assign, ":ai_total_archers", reg4),
(assign, ":ai_total_cavalry", reg5),
(assign, ":ai_total_berserker", reg6),
(assign, ":ai_total_pikeman", reg7),
(team_set_slot,":team_no",slot_team_is_lord_or_warlord,0),
##下面这些排成几行的都是给兵种设定具体阵型的
(try_begin),
(gt,":ai_total_infantry",260),
(team_set_slot,":team_no",slot_team_order_inf_roll,mordr_form_5_row),
(else_try),
(gt,":ai_total_infantry",190),
(team_set_slot,":team_no",slot_team_order_inf_roll,mordr_form_4_row),
(else_try),
(gt,":ai_total_infantry",120),
(team_set_slot,":team_no",slot_team_order_inf_roll,mordr_form_3_row),
(else_try),
(team_set_slot,":team_no",slot_team_order_inf_roll,mordr_form_2_row),
(try_end),
(try_begin),
(gt,":ai_total_berserker",240),
(team_set_slot,":team_no",slot_team_order_bsk_roll,mordr_form_5_row),
(else_try),
(gt,":ai_total_berserker",180),
(team_set_slot,":team_no",slot_team_order_bsk_roll,mordr_form_4_row),
(else_try),
(gt,":ai_total_berserker",110),
(team_set_slot,":team_no",slot_team_order_bsk_roll,mordr_form_3_row),
(else_try),
(team_set_slot,":team_no",slot_team_order_bsk_roll,mordr_form_2_row),
(try_end),
(try_begin),
(gt,":ai_total_pikeman",200),
(team_set_slot,":team_no",slot_team_order_pik_roll,mordr_form_5_row),
(else_try),
(gt,":ai_total_pikeman",160),
(team_set_slot,":team_no",slot_team_order_pik_roll,mordr_form_4_row),
(else_try),
(gt,":ai_total_pikeman",110),
(team_set_slot,":team_no",slot_team_order_pik_roll,mordr_form_3_row),
(else_try),
(gt,":ai_total_pikeman",60),
(team_set_slot,":team_no",slot_team_order_pik_roll,mordr_form_2_row),
(else_try),
(team_set_slot,":team_no",slot_team_order_pik_roll,mordr_form_1_row),
(try_end),
(try_begin),
(gt,":ai_total_archers",220),
(team_set_slot,":team_no",slot_team_order_arc_roll,mordr_form_5_row),
(else_try),
(gt,":ai_total_archers",150),
(team_set_slot,":team_no",slot_team_order_arc_roll,mordr_form_4_row),
(else_try),
(gt,":ai_total_archers",80),
(team_set_slot,":team_no",slot_team_order_arc_roll,mordr_form_3_row),
(else_try),
(team_set_slot,":team_no",slot_team_order_arc_roll,mordr_form_2_row),
(try_end),
(try_begin),
(gt,":ai_total_cavalry",280),
(team_set_slot,":team_no",slot_team_order_cav_roll,mordr_form_5_row),
(else_try),
(gt,":ai_total_cavalry",210),
(team_set_slot,":team_no",slot_team_order_cav_roll,mordr_form_4_row),
(else_try),
(gt,":ai_total_cavalry",150),
(team_set_slot,":team_no",slot_team_order_cav_roll,mordr_form_3_row),
(else_try),
(gt,":ai_total_cavalry",80),
(team_set_slot,":team_no",slot_team_order_cav_roll,mordr_form_2_row),
(else_try),
(team_set_slot,":team_no",slot_team_order_cav_roll,mordr_stand_closer),
(try_end),
(try_begin),
(store_mul,":range",":ai_total_infantry",50),
(val_min,":range",12000),
(team_set_slot,":team_no",slot_team_order_cav_range,":range"),
(try_end),
(call_script, "script_team_get_class_percentages", ":team_no", 1),#enemies of the ai_team
(assign, ":enemy_perc_archers", reg1),
(try_begin),
(assign, ":continue", 0),
(try_begin),
(teams_are_enemies, ":team_no", ":player_team"),
(party_slot_eq, "$g_enemy_party", slot_party_type, spt_kingdom_hero_party),#不需要是英雄部队,只要对面长眼睛就知道怎么操作
(assign, ":continue", 1),
(else_try),
(neg|teams_are_enemies, ":team_no", ":player_team"),
(gt, "$g_ally_party", 0),
(party_slot_eq, "$g_ally_party", slot_party_type, spt_kingdom_hero_party),#是友军,但不是玩家的士兵
(assign, ":continue", 1),
(try_end),
(assign,":tactics",-1),
(team_get_leader,":leader_agent",":team_no"),#获取指挥官,智力高的野怪也能解锁技能
(agent_get_troop_id,":leader_troop",":leader_agent"),
(store_skill_level,":tactics",skl_tactics,":leader_troop"),
(try_begin),
(eq, ":continue", 0),
(ge,":tactics",5),#只有智力高于5才会使用高级战术
(assign, ":continue", 1),
(try_end),
(agent_get_party_id,":party_id",":leader_agent"),
(store_faction_of_party, ":enemy_faction_no", ":party_id"),
(party_get_morale,":morale", ":party_id"),#获取敌军部队士气
(try_begin),
(eq, ":continue", 1),#领袖长脑子了,所有的领主都可以做到这点
(team_set_slot,":team_no",slot_team_is_lord_or_warlord,1),
(try_begin),
(gt,":enemy_perc_archers",60),#对射手较多的敌人直接突击
(assign, ":battle_tactic", btactic_charge),
(else_try), #军队士气不足会使用防御战术
(le, ":morale", 50),
(assign, ":battle_tactic", btactic_stand_ground),
(else_try),
(this_or_next|eq, ":enemy_faction_no", "fac_kingdom_2"),#在没有针对或被针对倾向的情况下,维基亚和罗多克使用普通防御战术
(eq, ":enemy_faction_no", "fac_kingdom_5"),
(assign, ":battle_tactic", btactic_hold),
(else_try),
(eq, ":enemy_faction_no", "fac_kingdom_3"),#库吉特直接进攻
(assign, ":battle_tactic", reg0),
(else_try),
(this_or_next|eq, ":enemy_faction_no", "fac_kingdom_1"), #斯瓦迪亚和萨兰德会使用绕后战术
(eq, ":enemy_faction_no", "fac_kingdom_6"),
(assign, ":battle_tactic", btactic_ailieguard),
(else_try),
(eq, ":enemy_faction_no", "fac_kingdom_4"), #诺德会跟随领袖
(assign, ":battle_tactic", btactic_follow_leader),
(else_try),
(assign, ":battle_tactic", btactic_ailieguard),#其他情况会使用普通战术
(try_end),
(else_try),
(assign, ":battle_tactic", btactic_charge),#否则会使用冲锋
(try_end),
(try_end),
(try_begin),
(ge, ":defense_not_an_option", 1), #如果一方已经在防守了,那么维基亚和罗多克会改为跟随领袖推进战术
(this_or_next|eq, ":enemy_faction_no", "fac_kingdom_2"),
(eq, ":enemy_faction_no", "fac_kingdom_5"),
(assign, ":battle_tactic", btactic_follow_leader),
(try_end),
(assign, reg0, ":battle_tactic"),
]),
下面这部分是开始大改的地方,即开局默认布阵
顺便说一下我把之前说过的阵型那部分也改了,加了两种额外阵型,记得把那部分改成
btactic_hold = 1
btactic_follow_leader = 2
btactic_charge = 3
btactic_stand_ground = 4
btactic_parthian = 5
btactic_ailieguard = 6
# script_battle_tactic_init
# Input: none
# Output: none
("battle_tactic_init",
[
(call_script, "script_battle_tactic_init_aux", "$ai_team_1", "$ai_team_1_battle_tactic"),
(try_begin),
(ge, "$ai_team_2", 0),
(call_script, "script_battle_tactic_init_aux", "$ai_team_2", "$ai_team_2_battle_tactic"),
(try_end),
(try_for_agents, ":cur_agent"),
(agent_set_slot, ":cur_agent", slot_agent_is_running_away, 0), #initially nobody is running away.
(try_end),
]),
#######$####战术改变
#我改变战术的逻辑是以领主本人的位置为中心,直接通过加减xy轴来达到部署兵种的效果,你如果能看懂mt中的pos的话这里再说一下就是通过获取领袖本人的pos和角度,因为领主本人的分组必定为npc,所以之后的阵型计算和重排也是以npc分组作为原点继续列阵。因此对看这篇文章的你来说diy阵型很简单,完全可以开个ps搓阵型再在下面模拟出来
# script_battle_tactic_init_aux
# Input: team_no, battle_tactic
# Output: none
("battle_tactic_init_aux",
[
(store_script_param, ":team_no", 1),
(store_script_param, ":battle_tactic", 2),
(team_get_leader, ":ai_leader", ":team_no"),
(try_begin),
(eq, ":battle_tactic", btactic_hold), #普通战术开局部署
(ge, ":ai_leader", 0),
(agent_get_position, pos1, ":ai_leader"),
(call_script, "script_find_high_ground_around_pos1", ":team_no", 200),
(copy_position, pos1, pos52),
(call_script, "script_find_high_ground_around_pos1", ":team_no", 100), # call again just in case we are not at peak point.
(copy_position, pos1, pos52),
(call_script, "script_find_high_ground_around_pos1", ":team_no", 100), # call again just in case we are not at peak point.
(copy_position,pos60,pos52),
(set_fixed_point_multiplier, 1000),
(agent_get_position,pos1,":ai_leader"),
(position_copy_rotation,pos60,pos1),#角度契合领袖的角度
(team_give_order, ":team_no", grc_heroes, mordr_hold),
(team_set_order_position, ":team_no", grc_heroes, pos60),
(position_move_y,pos60,200),#射手在最高点靠前一点点
(team_give_order, ":team_no", grc_archers, mordr_hold),
(team_set_order_position, ":team_no", grc_archers, pos60),
(position_move_y,pos60,4000),
(team_give_order, ":team_no", grc_berserker, mordr_hold),
(team_set_order_position, ":team_no", grc_berserker, pos60),
(position_move_y,pos60,300),
(team_give_order, ":team_no", grc_pikeman, mordr_hold),
(team_set_order_position, ":team_no", grc_pikeman, pos60),
(position_move_y,pos60,200),
(team_give_order, ":team_no", grc_infantry, mordr_hold),
(team_set_order_position, ":team_no", grc_infantry, pos60),
(team_get_slot,":cav_range",":team_no",slot_team_order_cav_range),
(position_move_x,pos60,":cav_range"),
(team_give_order, ":team_no", grc_cavalry, mordr_hold),
(team_set_order_position, ":team_no", grc_cavalry, pos60),
(val_mul,":cav_range",1),
(position_move_x,pos60,":cav_range"),
(team_give_order, ":team_no", grc_horse_archer, mordr_hold),
(team_set_order_position, ":team_no", grc_horse_archer, pos60),#骑射手和骑兵会位于部队两翼#骑射手和骑兵会位于部队两翼
(team_get_slot,":ord_inf",":team_no",slot_team_order_inf_roll),
(team_get_slot,":ord_bsk",":team_no",slot_team_order_bsk_roll),
(team_get_slot,":ord_pik",":team_no",slot_team_order_pik_roll),
(team_get_slot,":ord_arc",":team_no",slot_team_order_arc_roll),
(team_get_slot,":ord_cav",":team_no",slot_team_order_cav_roll),
(team_give_order, ":team_no", grc_infantry, ":ord_inf"), #步兵会根据设定执行命令
(team_give_order, ":team_no", grc_berserker, ":ord_bsk"),
(team_give_order, ":team_no", grc_pikeman, ":ord_pik"),
(team_give_order, ":team_no", grc_archers, ":ord_arc"), #射手也会靠拢,以防战线拉得太长
(team_give_order, ":team_no", grc_cavalry, ":ord_cav"),
(team_give_order, ":team_no", grc_horse_archer, mordr_stand_closer),
(team_give_order, ":team_no", grc_cavalry, mordr_mount),
(team_give_order, ":team_no", grc_horse_archer, mordr_mount),
(else_try),
(eq, ":battle_tactic", btactic_follow_leader), #跟随战术开局部署 领袖会在部队后方带着部队缓缓前进,射手会被置于最前侧,骑兵在射手后方随时准备发动反冲锋
(team_get_leader, ":ai_leader", ":team_no"),
(ge, ":ai_leader", 0),
(agent_set_speed_limit, ":ai_leader", 8),
(agent_get_position, pos60, ":ai_leader"),
(copy_position, pos61, pos60),
(team_give_order, ":team_no", grc_heroes, mordr_hold),
(team_set_order_position, ":team_no", grc_heroes, pos60),
(position_move_y,pos60,-300),
(team_give_order, ":team_no", grc_infantry, mordr_hold),
(team_set_order_position, ":team_no", grc_infantry, pos60),#领袖身后按照步兵-矛兵-双手的排序
(position_move_y,pos60,-250),
(team_give_order, ":team_no", grc_pikeman, mordr_hold),
(team_set_order_position, ":team_no", grc_pikeman, pos60),
(position_move_y,pos60,-250),
(team_give_order, ":team_no", grc_berserker, mordr_hold),
(team_set_order_position, ":team_no", grc_berserker, pos60),
(position_move_y,pos61,600),
(team_give_order, ":team_no", grc_cavalry, mordr_hold),#领袖身前按照骑兵-骑射手-弓箭手的排序
(team_set_order_position, ":team_no", grc_cavalry, pos61),
(position_move_y,pos61,600),
(team_give_order, ":team_no", grc_horse_archer, mordr_hold),
(team_set_order_position, ":team_no", grc_horse_archer, pos61),
(position_move_y,pos61,500),
(team_give_order, ":team_no", grc_archers, mordr_hold),
(team_set_order_position, ":team_no", grc_archers, pos61),
(team_get_slot,":ord_inf",":team_no",slot_team_order_inf_roll),
(team_get_slot,":ord_bsk",":team_no",slot_team_order_bsk_roll),
(team_get_slot,":ord_pik",":team_no",slot_team_order_pik_roll),
(team_get_slot,":ord_arc",":team_no",slot_team_order_arc_roll),
(team_get_slot,":ord_cav",":team_no",slot_team_order_cav_roll),
(team_give_order, ":team_no", grc_infantry, ":ord_inf"), #步兵会根据设定执行命令
(team_give_order, ":team_no", grc_berserker, ":ord_bsk"),
(team_give_order, ":team_no", grc_pikeman, ":ord_pik"),
(team_give_order, ":team_no", grc_archers, ":ord_arc"), #射手也会靠拢,以防战线拉得太长
(team_give_order, ":team_no", grc_cavalry, ":ord_cav"),
(team_give_order, ":team_no", grc_horse_archer, mordr_stand_closer),
(team_give_order, ":team_no", grc_cavalry, mordr_mount),
(team_give_order, ":team_no", grc_horse_archer, mordr_mount),
(else_try),
(eq, ":battle_tactic", btactic_stand_ground), #防御战术
(team_get_leader, ":ai_leader", ":team_no"),
(ge, ":ai_leader", 0),
(agent_get_position, pos1, ":ai_leader"),
(call_script, "script_find_high_ground_around_pos1", ":team_no", 300),#寻找高地
(copy_position, pos1, pos52),
(call_script, "script_find_high_ground_around_pos1", ":team_no", 200), # call again just in case we are not at peak point.
(set_fixed_point_multiplier, 1000),
(position_copy_rotation,pos52,pos1),#角度契合领袖的角度
(team_give_order, ":team_no", grc_heroes, mordr_hold),
(team_set_order_position, ":team_no", grc_heroes, pos52),
(team_give_order, ":team_no", grc_berserker, mordr_hold),
(team_set_order_position, ":team_no", grc_berserker, pos52),
(position_move_y,pos52,200),#射手在最高点靠前一点点
(team_give_order, ":team_no", grc_archers, mordr_hold),#射手在最高点坚守 英雄也会在这个位置镇守中军
(team_set_order_position, ":team_no", grc_archers, pos52),
(position_move_y,pos52,3500),#步兵会在前方坚守,并且报团
(team_give_order, ":team_no", grc_pikeman, mordr_hold),
(team_set_order_position, ":team_no", grc_pikeman, pos52),
(position_move_y,pos52,200),
(team_give_order, ":team_no", grc_infantry, mordr_hold),
(team_set_order_position, ":team_no", grc_infantry, pos52),
(position_move_y,pos52,-500),
(team_get_slot,":cav_range",":team_no",slot_team_order_cav_range),
(position_move_x,pos52,":cav_range"),
(team_give_order, ":team_no", grc_cavalry, mordr_hold),
(team_set_order_position, ":team_no", grc_cavalry, pos52),
(val_mul,":cav_range",2),
(position_rotate_x,pos52,180),
(position_move_x,pos52,":cav_range"),
(team_give_order, ":team_no", grc_horse_archer, mordr_hold),
(team_set_order_position, ":team_no", grc_horse_archer, pos52),#骑射手和骑兵会位于部队两翼#骑射手和骑兵会位于部队两翼
(team_get_slot,":ord_inf",":team_no",slot_team_order_inf_roll),
(team_get_slot,":ord_bsk",":team_no",slot_team_order_bsk_roll),
(team_get_slot,":ord_pik",":team_no",slot_team_order_pik_roll),
(team_get_slot,":ord_arc",":team_no",slot_team_order_arc_roll),
(team_get_slot,":ord_cav",":team_no",slot_team_order_cav_roll),
(team_give_order, ":team_no", grc_infantry, ":ord_inf"), #步兵会根据设定执行命令
(team_give_order, ":team_no", grc_berserker, ":ord_bsk"),
(team_give_order, ":team_no", grc_pikeman, ":ord_pik"),
(team_give_order, ":team_no", grc_archers, ":ord_arc"), #射手也会靠拢,以防战线拉得太长
(team_give_order, ":team_no", grc_cavalry, ":ord_cav"),
(team_give_order, ":team_no", grc_horse_archer, mordr_stand_closer),
(team_give_order, ":team_no", grc_cavalry, mordr_mount),
(team_give_order, ":team_no", grc_horse_archer, mordr_mount),
(else_try),
(eq, ":battle_tactic", btactic_parthian), #袭扰主力战术
(team_get_leader, ":ai_leader", ":team_no"),
(ge, ":ai_leader", 0),
(agent_get_position, pos1, ":ai_leader"),
(copy_position, pos52, pos1),
(team_give_order, ":team_no", grc_heroes, mordr_hold),
(team_set_order_position, ":team_no", grc_heroes, pos52),
(team_give_order, ":team_no", grc_berserker, mordr_hold),#领袖和双手步兵站在一起
(team_set_order_position, ":team_no", grc_berserker, pos52),
(position_move_y,pos52,300),
(team_give_order, ":team_no", grc_pikeman, mordr_hold),
(team_set_order_position, ":team_no", grc_pikeman, pos52),
(position_move_y,pos52,200),
(team_give_order, ":team_no", grc_infantry, mordr_hold),
(team_set_order_position, ":team_no", grc_infantry, pos52),
(position_move_y,pos52,700),
(team_give_order, ":team_no", grc_horse_archer, mordr_hold),#骑射手会被布置在步兵前方,射手后方
(team_set_order_position, ":team_no", grc_horse_archer, pos52),
(position_move_y,pos52,700),
(team_give_order, ":team_no", grc_archers, mordr_hold),#射手原地坚守
(team_set_order_position, ":team_no", grc_archers, pos52),
(position_move_x,pos52,-15000),#骑兵会被布置在侧翼缓慢前进
(team_give_order, ":team_no", grc_cavalry, mordr_hold),
(team_set_order_position, ":team_no", grc_cavalry, pos52),
(team_get_slot,":ord_arc",":team_no",slot_team_order_arc_roll),
(team_get_slot,":ord_cav",":team_no",slot_team_order_cav_roll),
(team_give_order, ":team_no", grc_infantry, mordr_form_5_row), #步兵会最大程度上集结,在孤立前进的情况下尽可能的不被卷边击溃
(team_give_order, ":team_no", grc_berserker, mordr_form_5_row),
(team_give_order, ":team_no", grc_pikeman, mordr_form_5_row),
(team_give_order, ":team_no", grc_archers, ":ord_arc"), #射手也会根据实际情况靠拢,以防战线拉得太长
(team_give_order, ":team_no", grc_cavalry, mordr_mount),
(team_give_order, ":team_no", grc_horse_archer, mordr_mount),
(else_try),
(eq, ":battle_tactic", btactic_ailieguard), #锤砧战术
(team_get_leader, ":ai_leader", ":team_no"),
(ge, ":ai_leader", 0),
(agent_get_position, pos1, ":ai_leader"),
(copy_position, pos52, pos1),
(team_give_order, ":team_no", grc_heroes, mordr_hold),#射手原地坚守
(team_set_order_position, ":team_no", grc_heroes, pos52),
(team_give_order, ":team_no", grc_archers, mordr_hold),#射手原地坚守
(team_set_order_position, ":team_no", grc_archers, pos52),
(position_move_y,pos52,2500),#步兵会在前方坚守,并且报团
(team_give_order, ":team_no", grc_berserker, mordr_hold),
(team_set_order_position, ":team_no", grc_berserker, pos52),
(position_move_y,pos52,300),
(team_give_order, ":team_no", grc_pikeman, mordr_hold),
(team_set_order_position, ":team_no", grc_pikeman, pos52),
(position_move_y,pos52,200),
(team_give_order, ":team_no", grc_infantry, mordr_hold),
(team_set_order_position, ":team_no", grc_infantry, pos52),
(position_move_y,pos52,500),
(team_get_slot,":ord_inf",":team_no",slot_team_order_inf_roll),
(team_get_slot,":ord_bsk",":team_no",slot_team_order_bsk_roll),
(team_get_slot,":ord_pik",":team_no",slot_team_order_pik_roll),
(team_get_slot,":ord_arc",":team_no",slot_team_order_arc_roll),
(team_get_slot,":ord_cav",":team_no",slot_team_order_cav_roll),
(team_give_order, ":team_no", grc_infantry, ":ord_inf"), #步兵会根据设定执行命令
(team_give_order, ":team_no", grc_berserker, ":ord_bsk"),
(team_give_order, ":team_no", grc_pikeman, ":ord_pik"),
(team_give_order, ":team_no", grc_archers, ":ord_arc"), #射手也会靠拢,以防战线拉得太长
(team_give_order, ":team_no", grc_cavalry, ":ord_cav"),
(position_move_x,pos52,20000),#骑兵和骑射手会被布置在侧翼前方准备包抄
(team_give_order, ":team_no", grc_cavalry, mordr_hold),
(team_set_order_position, ":team_no", grc_cavalry, pos52),
(team_give_order, ":team_no", grc_horse_archer, mordr_hold),
(team_set_order_position, ":team_no", grc_horse_archer, pos52),
(team_give_order, ":team_no", grc_cavalry, mordr_stand_closer),#组成密集阵型准备突击
(team_give_order, ":team_no", grc_cavalry, mordr_mount),
(team_give_order, ":team_no", grc_horse_archer, mordr_mount),
(else_try), ## CC charge
(this_or_next|eq, ":battle_tactic", btactic_charge), #冲锋,或没有战术的情况下
(eq, ":battle_tactic", 0),
(team_get_leader, ":ai_leader", ":team_no"),
(ge, ":ai_leader", 0),
(agent_is_alive, ":ai_leader"),
(agent_get_position, pos60, ":ai_leader"),
#预备冲锋时,前线由指挥官和射手-矛兵-步兵组成,骑兵布置在侧翼,双手步兵和骑兵平行但布置在和骑兵相对的另一个侧翼
(team_give_order, ":team_no", grc_archers, mordr_hold),
(team_set_order_position, ":team_no", grc_archers, pos60),
(team_give_order, ":team_no", grc_heroes, mordr_hold),
(team_set_order_position, ":team_no", grc_heroes, pos60),
(position_move_y,pos60,1500),
(team_give_order, ":team_no", grc_pikeman, mordr_hold),
(team_set_order_position, ":team_no", grc_pikeman, pos60),
(position_move_y,pos60,250),
(team_give_order, ":team_no", grc_infantry, mordr_hold),
(team_set_order_position, ":team_no", grc_infantry, pos60),
(team_get_slot,":cav_range",":team_no",slot_team_order_cav_range),
(position_move_x,pos60,":cav_range"),
(team_give_order, ":team_no", grc_cavalry, mordr_hold),
(team_set_order_position, ":team_no", grc_cavalry, pos60),
(val_mul,":cav_range",1),
(position_move_x,pos60,":cav_range"),
(team_give_order, ":team_no", grc_berserker, mordr_hold),
(team_set_order_position, ":team_no", grc_berserker, pos60),#骑射手和骑兵会位于部队两翼骑双手步兵和骑兵会位于部队两翼
(team_give_order, ":team_no", grc_horse_archer, mordr_charge), #骑射手直接拉出去冲锋绕圈
(team_get_slot,":ord_inf",":team_no",slot_team_order_inf_roll),
(team_get_slot,":ord_bsk",":team_no",slot_team_order_bsk_roll),
(team_get_slot,":ord_pik",":team_no",slot_team_order_pik_roll),
(team_get_slot,":ord_arc",":team_no",slot_team_order_arc_roll),
(team_get_slot,":ord_cav",":team_no",slot_team_order_cav_roll),
(team_give_order, ":team_no", grc_infantry, ":ord_inf"), #步兵会根据设定执行命令
(team_give_order, ":team_no", grc_berserker, ":ord_bsk"),
(team_give_order, ":team_no", grc_pikeman, ":ord_pik"),
(team_give_order, ":team_no", grc_archers, ":ord_arc"), #射手也会靠拢,以防战线拉得太长
(team_give_order, ":team_no", grc_cavalry, ":ord_cav"),
(team_give_order, ":team_no", grc_cavalry, mordr_mount),
(team_give_order, ":team_no", grc_horse_archer, mordr_mount),
(try_end),
]),
至于最后的执行部分,因为我源码写的不太好看(而且比较不容易拆),就不发出来了,不过可以告诉大家获取转向的方式是
以btactic_hold为例,我设定的正常情况维持效果是
(assign,":continue",1),
(assign,":chosed_agent",-1),
(try_for_agents,":agent"),#抓个不骑马的壮丁矫正一下角度
(agent_get_team,":agent_team",":agent"),
(eq,":agent_team",":team_no"),
(eq,":continue",1),
(agent_is_human,":agent"),
(agent_is_alive,":agent"),
(agent_is_active,":agent"),
(neg|agent_slot_ge,":agent", slot_agent_is_running_away,1),
(agent_get_horse,":horse_id",":agent"),
(eq,":horse_id",-1),
(assign,":chosed_agent",":agent"),
(assign,":continue",0),
(try_end),
(try_begin),
(ge,":chosed_agent",1),#有壮丁的情况下根据角度差停止一段时间
(agent_get_position,pos61,":chosed_agent"),
(team_get_order_position,pos60, ":team_no", grc_heroes), #英雄单位的角度一开始矫正过,不需要改变
(position_get_rotation_around_y, ":old_rotate",pos60),#获取y轴旋转方向绝对值
(position_get_rotation_around_y, ":new_rotate",pos61),
(store_sub,":sub",":old_rotate",":new_rotate"),
(val_abs,":sub"),
(ge,":sub",15),
(position_copy_rotation,pos60,pos61),#步兵面相角度大于15度情况下会开始停止行动并变阵
(team_give_order, ":team_no", grc_heroes, mordr_hold),
(team_set_order_position, ":team_no", grc_heroes, pos60),
(position_move_y,pos60,200),#射手在最高点靠前一点点
(team_give_order, ":team_no", grc_archers, mordr_hold),
(team_set_order_position, ":team_no", grc_archers, pos60),
(position_move_y,pos60,2500),
(team_give_order, ":team_no", grc_berserker, mordr_hold),
(team_set_order_position, ":team_no", grc_berserker, pos60),
(position_move_y,pos60,300),
(team_give_order, ":team_no", grc_pikeman, mordr_hold),
(team_set_order_position, ":team_no", grc_pikeman, pos60),
(position_move_y,pos60,150),
(team_give_order, ":team_no", grc_infantry, mordr_hold),
(team_set_order_position, ":team_no", grc_infantry, pos60),
(team_get_slot,":cav_range",":team_no",slot_team_order_cav_range),
(position_move_x,pos60,":cav_range"),
(team_give_order, ":team_no", grc_cavalry, mordr_hold),
(team_set_order_position, ":team_no", grc_cavalry, pos60),
(val_mul,":cav_range",-1),
(position_move_x,pos60,":cav_range"),
(team_give_order, ":team_no", grc_horse_archer, mordr_hold),
(team_set_order_position, ":team_no", grc_horse_archer, pos60),#骑射手和骑兵会位于部队两翼#骑射手和骑兵会位于部队两翼
(team_get_slot,":ord_inf",":team_no",slot_team_order_inf_roll),
(team_get_slot,":ord_bsk",":team_no",slot_team_order_bsk_roll),
(team_get_slot,":ord_pik",":team_no",slot_team_order_pik_roll),
(team_get_slot,":ord_arc",":team_no",slot_team_order_arc_roll),
(team_get_slot,":ord_cav",":team_no",slot_team_order_cav_roll),
(team_give_order, ":team_no", grc_infantry, ":ord_inf"), #步兵会根据设定执行命令
(team_give_order, ":team_no", grc_berserker, ":ord_bsk"),
(team_give_order, ":team_no", grc_pikeman, ":ord_pik"),
(team_give_order, ":team_no", grc_archers, ":ord_arc"), #射手也会靠拢,以防战线拉得太长
(team_give_order, ":team_no", grc_cavalry, ":ord_cav"),
(team_give_order, ":team_no", grc_horse_archer, mordr_stand_closer),
(team_give_order, ":team_no", grc_cavalry, mordr_mount),
(team_give_order, ":team_no", grc_horse_archer, mordr_mount),
简单地说就是通过获取步兵的朝向(步兵总是会面向他认为威胁最大的敌人,而且如果没受到伤害不会改变这个判定的朝向),然后使用领主的位置和那个便宜步兵的角度,上面的实例hold战术是保持步兵始终面对敌人,如果要推进的话则可以将y轴向前推进一下然后重新列阵,你可以继续使用上面给出的部署阶段的代码,只需要动一下xy轴就可以了,同理,如果你想制作一个袭扰战术,你可以通过获取min_dist和avg_dist判定区间来做到敌进我退敌退我进的效果,我的代码制作骑兵绕后的部分本质上是让一队骑兵始终位于侧前方,这样在领主为中心的阵型和敌人接触时骑兵可以从后方像蟹钳一样夹击敌人,如果敌人试图用步兵追赶骑兵的话则会触发角度矫正,骑兵会退走,同时因为角度问题追赶骑兵几乎只能用骑兵去追赶骑兵
然后同理,也是只要敌人过于靠近就冲锋,和时间过长一切战术转冲锋这种写法都很适配
除此之外还有一种写法,是我给默认战术为0的野怪用的
(eq, ":battle_tactic", 0),
(try_begin),
(ge,":min_dist",11000),#110米以上有组织的靠近,否则直接冲锋
(ge,":avg_dist",11000),
(assign,":chosed_agent",-1),
(assign,":continue",1),
(try_for_agents,":agent"),#抓个不骑马的壮丁矫正一下角度
(eq,":continue",1),
(agent_is_human,":agent"),
(agent_is_alive,":agent"),
(agent_is_active,":agent"),
(neg|agent_slot_ge,":agent", slot_agent_is_running_away,1),
(agent_get_team,":agent_team",":agent"),
(eq,":agent_team",":team_no"),
(agent_get_horse,":horse_id",":agent"),
(eq,":horse_id",-1),
(assign,":chosed_agent",":agent"),
(assign,":continue",0),
(try_end),
(try_begin),
(ge,":chosed_agent",1),#每一轮前进10米,匀速前进
(agent_get_position,pos61,":chosed_agent"),
(try_for_range,":agent_class",grc_infantry,grc_everyone),
(team_get_order_position,pos60, ":team_no", ":agent_class"),
(position_copy_rotation,pos60,pos61),
(position_move_y,pos60,1200), #向前移动12米,矫正角度
(team_set_order_position, ":team_no", ":agent_class", pos60),
(try_end),
(else_try),
(eq,":chosed_agent",-1),
(team_set_slot,":team_no",slot_team_battle_order_lock,-1),#没有步兵直接冲锋
(assign, ":battle_tactic", btactic_charge),
(team_give_order, ":team_no", grc_everyone, mordr_charge),
(try_end),
(team_give_order, ":team_no", grc_cavalry, mordr_mount),
(team_give_order, ":team_no", grc_horse_archer, mordr_mount),
(else_try),
(team_give_order, ":team_no", grc_everyone, mordr_charge),
(team_set_slot,":team_no",slot_team_battle_order_lock,-1),
(try_end),
|
总的来说这个帖子算是一个入门帖子,但有阅读难度的同时也不能直接照搬系统,本意是起一个思维启发和框架科普的作用,但如果你想照搬的话除了最后一部分的执行这里也为你打好了完整的基础,看明白了手搓阵型和预制阵型都不难
|
|