WB La valse des batailles

Users who are viewing this thread

Salut,

Une petite question pour les moddeurs/coddeurs chevronnés :

durant les batailles entre des troupes régulières (pas les bandits) , j'ai remarqué , presque dans la plupart  des mods, que les deux belligérants  au lieu d'avancer à une certaine distance de l'ennemi puis charger,  se contentent de  se tourner autour sans s'affronter un certain bout de temps ce qui agaçant pour le joueur ...

comme sur l'image :
lBT5SHp.jpg

quelqu'un a t'il une idée ou un debut de piste pour corriger ce problème (sans utiliser un autre mod de formations plus avancé , eux aussi ont leurs propres problèmes  :???: )

Merci
 
Ce script risque d'être celui qui t'intéresse :
Code:
# script_battle_tactic_apply_aux
  # Input: team_no, battle_tactic
  # Output: battle_tactic
  ("battle_tactic_apply_aux",
    [
      (store_script_param, ":team_no", 1),
      (store_script_param, ":battle_tactic", 2),
      (store_mission_timer_a, ":mission_time"),
      (try_begin),
        (eq, ":battle_tactic", btactic_hold),
        (copy_position, pos1, pos52),
        (call_script, "script_get_closest3_distance_of_enemies_at_pos1", ":team_no", 1),
        (assign, ":avg_dist", reg0),
        (assign, ":min_dist", reg1),
        (try_begin),
          (this_or_next|lt, ":min_dist", 1000),
          (lt, ":avg_dist", 4000),
          (assign, ":battle_tactic", 0),
          (team_give_order, ":team_no", grc_everyone, mordr_charge),
        (try_end),
      (else_try),
        (eq, ":battle_tactic", btactic_follow_leader),
        (team_get_leader, ":ai_leader", ":team_no"),
        (try_begin),
          (ge, ":ai_leader", 0),
          (agent_is_alive, ":ai_leader"),
          (agent_set_speed_limit, ":ai_leader", 9),
          (call_script, "script_team_get_average_position_of_enemies", ":team_no"),
          (copy_position, pos60, pos0),
          (agent_get_position, pos61, ":ai_leader"),
          (position_transform_position_to_local, pos62, pos61, pos60), #pos62 = vector to enemy w.r.t leader
          (position_normalize_origin, ":distance_to_enemy", pos62),
          (convert_from_fixed_point, ":distance_to_enemy"),
          (assign, reg17, ":distance_to_enemy"),
          (position_get_x, ":dir_x", pos62),
          (position_get_y, ":dir_y", pos62),
          (val_mul, ":dir_x", 23),
          (val_mul, ":dir_y", 23), #move 23 meters
          (position_set_x, pos62, ":dir_x"),
          (position_set_y, pos62, ":dir_y"),
        
          (position_transform_position_to_parent, pos63, pos61, pos62), #pos63 is 23m away from leader in the direction of the enemy.
          (position_set_z_to_ground_level, pos63),
        
          (team_give_order, ":team_no", grc_everyone, mordr_hold),
          (team_set_order_position, ":team_no", grc_everyone, pos63),
          (agent_get_position, pos1, ":ai_leader"),
          (try_begin),
            (lt, ":distance_to_enemy", 50),
            (ge, ":mission_time", 30),
            (assign, ":battle_tactic", 0),
            (team_give_order, ":team_no", grc_everyone, mordr_charge),
            (agent_set_speed_limit, ":ai_leader", 60),
          (try_end),
        (else_try),
          (assign, ":battle_tactic", 0),
          (team_give_order, ":team_no", grc_everyone, mordr_charge),
        (try_end),
      (try_end),
      
      (try_begin), # charge everyone after a while
        (neq, ":battle_tactic", 0),
        (ge, ":mission_time", 300),
        (assign, ":battle_tactic", 0),
        (team_give_order, ":team_no", grc_everyone, mordr_charge),
        (team_get_leader, ":ai_leader", ":team_no"),
        (agent_set_speed_limit, ":ai_leader", 60),
      (try_end),
      (assign, reg0, ":battle_tactic"),
  ]),

Une méthode qui fonctionne bien c'est d'utiliser (team_give_order, ":team_no", grc_everyone, mordr_advance),.
Le problème est qu'il faut modifier certaines autres parties du code pour que ça soit possible.
Cela peut impliquer que le leader ne soit plus 'seul' mais incorporé avec les autres dans la formation, à part si il est isolé dans un autre groupe (par exemple le groupe 3 qui n'est pas utilisé par défaut).
 
merci bOuYA_k-hlO

je vais essayer de déchiffrer un peu ton  code pour comprendre comment ça marche (la syntaxe du MS n'est pas mon fort )

j'ai même trouver en cherchant un autre topic avec le même problème : http://forums.taleworlds.com/index.php/topic,229702.0/nowap.html
 
je n'arrive toujours pas a ce que je voudrais vraiment , après maintes tentatives et expérimentations 
à la fin j'ai juste augmenté la distance de déplacement des troupes :
de
          (val_mul, ":dir_x", 23),
          (val_mul, ":dir_y", 23), #move 23 meters
à
          (val_mul, ":dir_x", 60),
          (val_mul, ":dir_y", 60), #move 60 meters

du bricolage certe  et c'est vrai que les deux parties s'accrochent un peu trop rapidement mais c'est mieux que se tourner autour indéfiniment  :mad:

 
Tu peux essayer ça si tu veux, je n'ai pas testé, c'est une version raccourcie de ce que j'ai utilisé dans mon mod:
Code:
	(eq, ":battle_tactic", btactic_follow_leader),
	(team_get_leader, ":ai_leader", ":team_no"),
	(try_begin),
		(ge, ":ai_leader", 0),
		(agent_is_alive, ":ai_leader"),
		(agent_set_speed_limit, ":ai_leader", 12),
		(agent_get_position, pos1, ":ai_leader"),
		(call_script, "script_get_closest3_distance_of_enemies_at_pos1", ":team_no", 1),
		(assign, ":avg_dist", reg0),
		(assign, ":min_dist", reg1),
		# (display_message, "@min: {reg1}, avg: {reg0}"),
		(try_begin),
			(this_or_next|lt, ":min_dist", 1500),
			(lt, ":avg_dist", 4500),
			(agent_set_speed_limit, ":ai_leader", 60),
			(assign, ":battle_tactic", 0),
			(team_give_order, ":team_no", grc_everyone, mordr_charge),
		(else_try),
			(team_give_order, ":team_no", grc_everyone, mordr_advance),
		(try_end),
	(else_try),
		(assign, ":battle_tactic", 0),
		(team_give_order, ":team_no", grc_everyone, mordr_charge),
	(try_end),
Ça devrait fonctionner sans changer autre chose, mais peut-être que ça avancera trop vite (surtout pour que les archers aient le temps de tirer).
 
ça marche !!  :grin: 
une petite correction dans le code :
(team_give_order, ":team_no", grc_everyone ,  mordr_advance)  au lieu de  (team_give_order, grc_everyone, ":team_no", mordr_advance) ...
mais je vois que c'est cousu à la main et pas copié-collé , donc chapeau bas !
 
tant que je te tiens Bouya  :wink: , une autre petite question :

je voudrais qu'il soit possible d'upgrader les troupes de deux manières différentes , par exemple :

milice------------fantassain_leger
              \
                ------fantassin_lourd   

pour le fantassin leger le cout de l'upgrade sera normal (selon sont niveau , par exemple 20 denars)
par contre,  pour le fantassin lourd, le coût prendra en compte  la valeur de l’équipement (c'est le joueur qui devra équiper ce soldat, disons pour simplifier  1000 denars )
tout ça en gardant les deux types de fantassin dans le même niveau

donc je fait :

Code:
  ("game_get_upgrade_cost",
    [
      (store_script_param_1, ":troop_id"),
      
      (store_character_level, ":troop_level", ":troop_id"),
      
      (try_begin),
       (is_between, ":troop_id", equiped_troops_begin, equiped_troops_end),   # <<<-===========
        (assign, reg0, 1000),   #<<<=========
      (else_try),  
        (is_between, ":troop_level", 0, 6),
        (assign, reg0, 10),
      (else_try),  
        (is_between, ":troop_level", 6, 11),
        (assign, reg0, 20),
      (else_try),  
        (is_between, ":troop_level", 11, 16),
        (assign, reg0, 40),
      (else_try),  
        (is_between, ":troop_level", 16, 21),
        (assign, reg0, 80),
      (else_try),  
        (is_between, ":troop_level", 21, 26),
        (assign, reg0, 120),
      (else_try),  
        (is_between, ":troop_level", 26, 31),
        (assign, reg0, 160),
      (else_try),  
        (assign, reg0, 200),
      (try_end),  
        
      (set_trigger_result, reg0),
  ]),

mais ça ne change rien , ils gardent  le même coût d'upgrade  !
une idée peut-être  ?
 
Le problème est que le paramètre pour ce script n'est pas la troupe de niveau supérieur, mais celle qui est utilisé pour passer au niveau supérieur. Dans ton cas, le paramètre sera la milice, c'est donc normal que tu pense que le script ne fonctionne pas correctement alors que le code est correct.
Je ne pense pas qu'il soit possible de récupérer la troupe que tu veux.
Il me semble que j'avais vu une discussion sur ce sujet quelque part, mais je n'ai pas suivit suffisamment pour voir si ils avaient trouvé une solution.
 
ah... que je suis bête ! c'est évidant  :???:

donc ça sera :

milice------------> fantassain_leger-----------> fantassin_lourd 
            20                                        1000




Code:
(is_between, ":troop_id", not_equiped_troops_begin, not_equiped_troops_end),   
        (assign, reg0, 1000), 

mais je n'aime pas cette solution (le signe d'upgrade  affiché m'agace toujours , surtout quand  je ne veux -peux- pas améliorer des soldats ...)

plutôt ça sera :
le joueur doit  se trouver dans une ville pour pouvoir "équiper" ses troupes légères, sans attendre le prochain niveau (upgrade sans gain d’expérience) ... je vais creuser de ce coté la !

edit : ce que j'ai effectivement fais (en piquant et trafiquotant le code  l'Unit Upgrade Academy de Somebody)

et voila le resultat :
rKGLuxg.jpg

merci beaucoup  :grin:




 
Back
Top Bottom