骑马与砍杀中文站论坛

标题: 【战团】由逃跑士兵影响士气算法导致卡顿的代码优化 [打印本页]

作者: AntiN0m1    时间: 2025-3-8 16:58
标题: 【战团】由逃跑士兵影响士气算法导致卡顿的代码优化
参考文献1: https://bbs.mountblade.com.cn/thread-2086832-1-1.html

参考文献2: https://bbs.mountblade.com.cn/thread-2098668-1-1.html

首先感谢两位大佬。
我自己修改时,感觉文献1的修改有点复杂,且不利于txt修改;而文献2反编译出来的东西实在不想看。
我根据文献1的讲解和文献2提供的思路,自己重写了该script,在此分享出来。
修改时加上 ###(((courage_scores NEW 括起来的行,删掉 ###(((courage_scores OLD 括起来的行即可。

[spoiler=script]

  1.   ("apply_effect_of_other_people_on_courage_scores",
  2.     [
  3.       (get_player_agent_no, ":player_agent"),

  4.       (try_for_agents, ":centered_agent_no"),
  5.         (agent_is_human, ":centered_agent_no"),
  6.         (agent_is_alive, ":centered_agent_no"),
  7.         (neq, ":centered_agent_no", ":player_agent"),
  8.         (agent_slot_eq, ":centered_agent_no", slot_agent_is_running_away, 1), ###(((courage_scores NEW)))
  9.         (agent_get_position, pos0, ":centered_agent_no"),
  10.         (try_begin),
  11.           (agent_is_ally, ":centered_agent_no"),
  12.           (assign, ":is_centered_agent_ally", 1),
  13.         (else_try),
  14.           (assign, ":is_centered_agent_ally", 0),
  15.         (try_end),
  16.       
  17.         (try_for_agents, ":agent_no"),
  18.           (agent_is_human, ":agent_no"),
  19.           (agent_is_alive, ":agent_no"),
  20.           (neq, ":centered_agent_no", ":agent_no"),      

  21.           (try_begin),
  22.             (agent_is_ally, ":agent_no"),
  23.             (assign, ":is_agent_ally", 1),
  24.           (else_try),
  25.             (assign, ":is_agent_ally", 0),
  26.           (try_end),

  27.           (eq, ":is_centered_agent_ally", ":is_agent_ally"), #if centered agent and other agent is at same team then continue.
  28.           (agent_get_slot, ":agent_is_running_away_or_not", ":agent_no", slot_agent_is_running_away),

  29.           (try_begin),
  30.             (eq, ":agent_no", ":player_agent"),
  31.             (assign, ":agent_delta_courage_score", 6),
  32.           (else_try),
  33.             (agent_get_troop_id, ":troop_id", ":agent_no"),
  34.             (troop_is_hero, ":troop_id"),
  35.       
  36.             #Hero Agent : if near agent (hero, agent_no) is not running away his positive effect on centered agent (centered_agent_no) fighting at his side is effected by his hit points.
  37.             (try_begin),      
  38.               (neq, ":agent_is_running_away_or_not", 1), #if agent is not running away
  39.               (store_agent_hit_points, ":agent_hit_points", ":agent_no"),
  40.               (try_begin),
  41.                 (eq, ":agent_hit_points", 100),
  42.                 (assign, ":agent_delta_courage_score", 6),
  43.               (else_try),
  44.                 (ge, ":agent_hit_points", 75),
  45.                 (assign, ":agent_delta_courage_score", 5),
  46.               (else_try),
  47.                 (ge, ":agent_hit_points", 60),
  48.                 (assign, ":agent_delta_courage_score", 4),
  49.               (else_try),
  50.                 (ge, ":agent_hit_points", 45),
  51.                 (assign, ":agent_delta_courage_score", 3),
  52.               (else_try),
  53.                 (ge, ":agent_hit_points", 30),
  54.                 (assign, ":agent_delta_courage_score", 2),
  55.               (else_try),
  56.                 (ge, ":agent_hit_points", 15),
  57.                 (assign, ":agent_delta_courage_score", 1),
  58.               (end_try),
  59.             (else_try),
  60.               (assign, ":agent_delta_courage_score", 4),
  61.             (end_try),
  62.           (else_try),
  63.             #Normal Agent : if near agent (agent_no) is not running away his positive effect on centered agent (centered_agent_no) fighting at his side is effected by his hit points.
  64.             (try_begin),      
  65.               (neq, ":agent_is_running_away_or_not", 1), # if agent is not running away
  66.               (store_agent_hit_points, ":agent_hit_points", ":agent_no"),
  67.               (try_begin),
  68.                 (eq, ":agent_hit_points", 100),
  69.                 (assign, ":agent_delta_courage_score", 4),
  70.               (else_try),
  71.                 (ge, ":agent_hit_points", 75),
  72.                 (assign, ":agent_delta_courage_score", 3),
  73.               (else_try),
  74.                 (ge, ":agent_hit_points", 50),
  75.                 (assign, ":agent_delta_courage_score", 2),
  76.               (else_try),
  77.                 (ge, ":agent_hit_points", 25),
  78.                 (assign, ":agent_delta_courage_score", 1),
  79.               (try_end),
  80.               (try_begin), # to make our warrior run away easier we decrease one, because they have player_agent (+6) advantage.
  81.                 (agent_is_ally, ":agent_no"),
  82.                 (val_sub, ":agent_delta_courage_score", 1),
  83.               (try_end),
  84.             (else_try),
  85.               (assign, ":agent_delta_courage_score", 2),
  86.             (end_try),
  87.           (try_end),

  88.           ###(((courage_scores NEW
  89.           (try_begin),
  90.             (troop_is_hero, ":centered_agent_no"),
  91.             (assign, ":agent_delta_courage_score_2", 4),
  92.           (else_try),
  93.             (assign, ":agent_delta_courage_score_2", 2),
  94.           (try_end),

  95.           (agent_get_position, pos1, ":agent_no"),
  96.           (get_distance_between_positions, ":dist", pos0, pos1),

  97.           (assign, ":pos_effect", 0),
  98.           (try_begin),
  99.             (lt, ":dist", 2000), #0-20 meter
  100.             (assign, ":pos_effect", 50),
  101.           (else_try),
  102.             (lt, ":dist", 4000), #21-40 meter
  103.             (assign, ":pos_effect", 40),
  104.           (else_try),
  105.             (lt, ":dist", 7000), #41-70 meter
  106.             (assign, ":pos_effect", 30),
  107.           (else_try),
  108.             (lt, ":dist", 11000), #71-110 meter
  109.             (assign, ":pos_effect", 20),
  110.           (else_try),      
  111.             (lt, ":dist", 16000), # 111-160 meter, assumed that eye can see agents friendly at most 160 meters far while fighting.
  112.                                   # this is more than below limit (108 meters) because we hear that allies come from further.
  113.             (assign, ":pos_effect", 10),
  114.           (try_end),

  115.           (assign, ":neg_effect", 0),                             # negative effect of running agent on other ally agents are lower then positive effects above, to avoid starting  
  116.           (try_begin),                                            # run away of all agents at a moment. I want to see agents running away one by one during battle, not all together.
  117.             (lt, ":dist", 200), #1-2 meter,                       # this would create better game play.
  118.             (assign, ":neg_effect", 15),
  119.           (else_try),
  120.             (lt, ":dist", 400), #3-4 meter,
  121.             (assign, ":neg_effect", 13),
  122.           (else_try),
  123.             (lt, ":dist", 600), #5-6 meter
  124.             (assign, ":neg_effect", 11),
  125.           (else_try),
  126.             (lt, ":dist", 800), #7-8 meter
  127.             (assign, ":neg_effect", 9),
  128.           (else_try),
  129.             (lt, ":dist", 1200), #9-12 meters
  130.             (assign, ":neg_effect", 7),
  131.           (else_try),
  132.             (lt, ":dist", 2400), #13-24 meters
  133.             (assign, ":neg_effect", 5),
  134.           (else_try),
  135.             (lt, ":dist", 4800), #25-48 meters
  136.             (assign, ":neg_effect", 3),
  137.           (else_try),
  138.             (lt, ":dist", 9600), #49-98 meters, assumed that eye can see agents running away at most 98 meters far while fighting.
  139.             (assign, ":neg_effect", 1),
  140.           (try_end),   

  141.           (try_begin),
  142.             (neq, ":agent_is_running_away_or_not", 1),
  143.             (val_mul, ":agent_delta_courage_score", 1),
  144.             (val_mul, ":agent_delta_courage_score", ":pos_effect"),

  145.             (val_mul, ":agent_delta_courage_score_2", -2),
  146.             (val_mul, ":agent_delta_courage_score_2", ":neg_effect"),
  147.             (neq, ":agent_delta_courage_score_2", 0),
  148.             (agent_get_slot, ":agent_courage_score_2", ":agent_no", slot_agent_courage_score),
  149.             (val_add, ":agent_courage_score_2", ":agent_delta_courage_score_2"),
  150.             (agent_set_slot, ":agent_no", slot_agent_courage_score, ":agent_courage_score_2"),

  151.           (else_try),
  152.             (val_mul, ":agent_delta_courage_score", -1),
  153.             (val_mul, ":agent_delta_courage_score", ":neg_effect"),
  154.           (try_end),
  155.           (neq, ":agent_delta_courage_score", 0),
  156.           (agent_get_slot, ":agent_courage_score", ":centered_agent_no", slot_agent_courage_score),
  157.           (val_add, ":agent_courage_score", ":agent_delta_courage_score"),
  158.           (agent_set_slot, ":centered_agent_no", slot_agent_courage_score, ":agent_courage_score"),
  159.           ###)))

  160.           ###(((courage_scores OLD
  161.           # (try_begin),
  162.           #   (neq, ":agent_is_running_away_or_not", 1),
  163.           #   (val_mul, ":agent_delta_courage_score", 1),
  164.           #   (try_begin), # centered agent not running away cannot take positive courage score from one another agent not running away.
  165.           #     (agent_get_slot, ":agent_is_running_away_or_not", ":centered_agent_no", slot_agent_is_running_away),
  166.           #     (eq, ":agent_is_running_away_or_not", 0),
  167.           #     (val_mul, ":agent_delta_courage_score", 0),
  168.           #   (try_end),
  169.           # (else_try),
  170.           #   (try_begin),
  171.           #     (agent_get_slot, ":agent_is_running_away_or_not", ":agent_no", slot_agent_is_running_away), ###(((":agent_no" should be ":centered_agent_no" ?)))
  172.           #     (eq, ":agent_is_running_away_or_not", 0),
  173.           #     (val_mul, ":agent_delta_courage_score", -2), # running away agent fears not running away agent more.
  174.           #   (else_try),
  175.           #     (val_mul, ":agent_delta_courage_score", -1),
  176.           #   (try_end),
  177.           # (try_end),

  178.           # (neq, ":agent_delta_courage_score", 0),

  179.           # (agent_get_position, pos1, ":agent_no"),
  180.           # (get_distance_between_positions, ":dist", pos0, pos1),

  181.           # (try_begin),
  182.           #   (ge, ":agent_delta_courage_score", 0),
  183.           #   (try_begin),
  184.           #     (lt, ":dist", 2000), #0-20 meter
  185.           #     (agent_get_slot, ":agent_courage_score", ":centered_agent_no", slot_agent_courage_score),
  186.           #     (val_mul, ":agent_delta_courage_score", 50),
  187.           #     (val_add, ":agent_courage_score", ":agent_delta_courage_score"),
  188.           #     (agent_set_slot, ":centered_agent_no", slot_agent_courage_score, ":agent_courage_score"),           
  189.           #   (else_try),
  190.           #     (lt, ":dist", 4000), #21-40 meter
  191.           #     (agent_get_slot, ":agent_courage_score", ":centered_agent_no", slot_agent_courage_score),
  192.           #     (val_mul, ":agent_delta_courage_score", 40),
  193.           #     (val_add, ":agent_courage_score", ":agent_delta_courage_score"),
  194.           #     (agent_set_slot, ":centered_agent_no", slot_agent_courage_score, ":agent_courage_score"),           
  195.           #   (else_try),
  196.           #     (lt, ":dist", 7000), #41-70 meter
  197.           #     (agent_get_slot, ":agent_courage_score", ":centered_agent_no", slot_agent_courage_score),
  198.           #     (val_mul, ":agent_delta_courage_score", 30),
  199.           #     (val_add, ":agent_courage_score", ":agent_delta_courage_score"),
  200.           #     (agent_set_slot, ":centered_agent_no", slot_agent_courage_score, ":agent_courage_score"),           
  201.           #   (else_try),
  202.           #     (lt, ":dist", 11000), #71-110 meter
  203.           #     (agent_get_slot, ":agent_courage_score", ":centered_agent_no", slot_agent_courage_score),
  204.           #     (val_mul, ":agent_delta_courage_score", 20),
  205.           #     (val_add, ":agent_courage_score", ":agent_delta_courage_score"),
  206.           #     (agent_set_slot, ":centered_agent_no", slot_agent_courage_score, ":agent_courage_score"),           
  207.           #   (else_try),      
  208.           #     (lt, ":dist", 16000), # 111-160 meter, assumed that eye can see agents friendly at most 160 meters far while fighting.
  209.           #                           # this is more than below limit (108 meters) because we hear that allies come from further.
  210.           #     (agent_get_slot, ":agent_courage_score", ":centered_agent_no", slot_agent_courage_score),
  211.           #     (val_mul, ":agent_delta_courage_score", 10),
  212.           #     (val_add, ":agent_courage_score", ":agent_delta_courage_score"),
  213.           #     (agent_set_slot, ":centered_agent_no", slot_agent_courage_score, ":agent_courage_score"),           
  214.           #   (try_end),      
  215.           # (else_try),                                               # negative effect of running agent on other ally agents are lower then positive effects above, to avoid starting  
  216.           #   (try_begin),                                            # run away of all agents at a moment. I want to see agents running away one by one during battle, not all together.
  217.           #     (lt, ":dist", 200), #1-2 meter,                       # this would create better game play.
  218.           #     (agent_get_slot, ":agent_courage_score", ":centered_agent_no", slot_agent_courage_score),
  219.           #     (val_mul, ":agent_delta_courage_score", 15),
  220.           #     (val_add, ":agent_courage_score", ":agent_delta_courage_score"),
  221.           #     (agent_set_slot, ":centered_agent_no", slot_agent_courage_score, ":agent_courage_score"),           
  222.           #   (else_try),
  223.           #     (lt, ":dist", 400), #3-4 meter,
  224.           #     (agent_get_slot, ":agent_courage_score", ":centered_agent_no", slot_agent_courage_score),
  225.           #     (val_mul, ":agent_delta_courage_score", 13),
  226.           #     (val_add, ":agent_courage_score", ":agent_delta_courage_score"),
  227.           #     (agent_set_slot, ":centered_agent_no", slot_agent_courage_score, ":agent_courage_score"),           
  228.           #   (else_try),
  229.           #     (lt, ":dist", 600), #5-6 meter
  230.           #     (agent_get_slot, ":agent_courage_score", ":centered_agent_no", slot_agent_courage_score),
  231.           #     (val_mul, ":agent_delta_courage_score", 11),
  232.           #     (val_add, ":agent_courage_score", ":agent_delta_courage_score"),
  233.           #     (agent_set_slot, ":centered_agent_no", slot_agent_courage_score, ":agent_courage_score"),           
  234.           #   (else_try),
  235.           #     (lt, ":dist", 800), #7-8 meter
  236.           #     (agent_get_slot, ":agent_courage_score", ":centered_agent_no", slot_agent_courage_score),
  237.           #     (val_mul, ":agent_delta_courage_score", 9),
  238.           #     (val_add, ":agent_courage_score", ":agent_delta_courage_score"),
  239.           #     (agent_set_slot, ":centered_agent_no", slot_agent_courage_score, ":agent_courage_score"),           
  240.           #   (else_try),
  241.           #     (lt, ":dist", 1200), #9-12 meters
  242.           #     (agent_get_slot, ":agent_courage_score", ":centered_agent_no", slot_agent_courage_score),
  243.           #     (val_mul, ":agent_delta_courage_score", 7),
  244.           #     (val_add, ":agent_courage_score", ":agent_delta_courage_score"),
  245.           #     (agent_set_slot, ":centered_agent_no", slot_agent_courage_score, ":agent_courage_score"),           
  246.           #   (else_try),
  247.           #     (lt, ":dist", 2400), #13-24 meters
  248.           #     (agent_get_slot, ":agent_courage_score", ":centered_agent_no", slot_agent_courage_score),
  249.           #     (val_mul, ":agent_delta_courage_score", 5),
  250.           #     (val_add, ":agent_courage_score", ":agent_delta_courage_score"),
  251.           #     (agent_set_slot, ":centered_agent_no", slot_agent_courage_score, ":agent_courage_score"),           
  252.           #   (else_try),
  253.           #     (lt, ":dist", 4800), #25-48 meters
  254.           #     (agent_get_slot, ":agent_courage_score", ":centered_agent_no", slot_agent_courage_score),
  255.           #     (val_mul, ":agent_delta_courage_score", 3),
  256.           #     (val_add, ":agent_courage_score", ":agent_delta_courage_score"),
  257.           #     (agent_set_slot, ":centered_agent_no", slot_agent_courage_score, ":agent_courage_score"),           
  258.           #   (else_try),
  259.           #     (lt, ":dist", 9600), #49-98 meters, assumed that eye can see agents running away at most 98 meters far while fighting.
  260.           #     (agent_get_slot, ":agent_courage_score", ":centered_agent_no", slot_agent_courage_score),
  261.           #     (val_mul, ":agent_delta_courage_score", 1),
  262.           #     (val_add, ":agent_courage_score", ":agent_delta_courage_score"),
  263.           #     (agent_set_slot, ":centered_agent_no", slot_agent_courage_score, ":agent_courage_score"),           
  264.           #   (try_end),      
  265.           # (try_end),
  266.           ###)))
  267.         (try_end),            
  268.       (try_end),
  269.   ]), #ozan
复制代码



[/spoiler]






欢迎光临 骑马与砍杀中文站论坛 (https://bbs.mountblade.com.cn/) Powered by Discuz! X3.4