Posté le: 22/01/09 00:52 Sujet du message: Système d'armes à munitions en Gui
Introduction Je sais que je dois mettre un chiffre romain devant un grand titre, mais les Romains n'avaient pas de "0" ^^
Commentaires
Ce tutorial a pour objectif de montrer comment créer un système d'armes qui utilisent des munitions. Pour mon exemple, il s'agit d'armes à feu (ici le FN Five Seven et le Colt M4A1).
Ce système peut paraître un peu lourd, mais il présente l'énorme avantage de ne pas devoir créer autant d'unités que d'armes, comme c'est le cas pour les cartes Resident Evil, Afterlife, Rural Onslaught etc...
Je me suis servi des idées d'autres joueurs (pour le cumul des munitions et l'amélioration de portée) de ce forum, merci à eux.
L'autre avantage de ce système, c'est qu'il n'utilise pas l'or ou le bois, ce qui vous laisse les deux ressources libres.
Pourquoi est-ce utile de pouvoir conserver la même unité tout le temps? Dans le cas, où, notamment, vous utilisez des compétences par ajout de livre de sort. Cela évite de devoir stocker quelque part toutes les compétences apprises.
Ce système est de plus en Gui, ce qui permettra à la plupart des joueurs de le comprendre.
Son seul gros inconvénient (encore que...): un héros pourra porter plusieurs types de munitions, mais une seule arme seulement.
Une autre méthode est présentée dans le même sujet par le Général Vans. Cliquer ici!
Elle est beaucoup plus simple d'utilisation, mais ne permet pas toutes les variations.
Prérecquis
-Bien connaître l’éditeur d’objet
-Savoir utiliser des variables, des conditions et des boucles.
I/ Unités, objets, compétences et recherches
Voici la liste des objets nécessaires :
Recherches
Prenez l’amélioration « canon longs » des humains. Copiez-la une première fois, et modifiez les champs :
Bonus de portée d’attaque -base à 100
Bonus de portée d’attaque -incréments à 100
Les bases et incréments d’or, de bois et de temps à 0.
Le nombre de niveaux à 100 (pour l’exemple ; dans une grosse carte, il sera mieux de le mettre à 3000, même si sur le moment, votre ordinateur moulinera).
J’appelle cette recherche portée +100.
Copiez cette première compétence personnalisée, collez-là, et modifiez cette fois les deux champs :
Bonus de portée d’attaque -base à -100
Bonus de portée d’attaque -incréments à -100
J’appelle cette recherche portée -100.
Compétences
Prenez le sort canaliser (sorts-neutre hostiles-héros), copiez-collez le deux fois.
On en fait deux compétences : « recharger » et « jeter l’arme ».
Modifiez les champs suivants pour les deux sorts.
Compétence héros - false
Niveau - 1
Arbre des technologies - vérifier dépendances - false
Donnée - Durée graphisme - 0.00
Donnée - Désactiver autres compétences - false
Donnée - ID-Ordre de base : mettez ce que vous voulez, de préférence l’identité d’une compétence qui ne vous servira pas. Et pensez bien à mettre une ID différente pour les deux sorts.
Donnée - Options : cochez la case « visible ».
Donnée - Suivre dans la durée - 0.00
Texte - Ordre Chaîne - utiliser/allumer : mettez la même ID que pour l’ordre de base ; n’oubliez pas d’en mettre une différente pour les deux compétences.
Pour toutes les autres rubriques, mettez ce que vous voulez.
Maintenant, des compétences objet.
Prenez la compétence objet « bonus en attaque (+1) », et copiez-collez la 2 fois. Réglez à votre convenance les dégâts de bonus. Ils serviront pour les armes. Vous pouvez, comme disponible dans la carte exemple, rajouter un attachement d’arme. Je passe cela sous silence, un tutorial est disponible sur ce forum : cliquez ici.
Je les ai appelé : damage Colt M4A1 et damage FN Five Seven et j’ai mis +5 dégâts au Five Seven et +8 au M4A1.
Ensuite, deux compétences « Objet bonus en vitesse d’attaque ».
Idem, modifiez les champs à votre convenance. J’ai mis 6.00 (600%) de bonus pour le M4A1 et 0% pour le Five Seven. J’ai appelé ces compétences Vitesse M4A1 et vitesse Five Seven.
Enfin, la compétence « Berserk » des orcs.
Modifiez l’augmentation des dégâts subis, de la vitesse d’attaque et de mouvement au minimum.
Cochez le champ Stats-Compétence Objet pour que la compétence devienne compétence objet.
Modifiez le reste à votre convenance (exemple : durée=2.00 secondes).
Objets
Nous allons avoir besoin de 4 objets.
Prenez n’importe quel objet permanent, et copiez-collez le deux fois. Vous l’aurez compris, l’un s’appellera Colt M4A1 et l’autre FN Five Seven.
Modifiez les champs :
Capacités - Compétences de l’un et de l’autre en ajoutant leur bonus de dégât et de vitesse respectifs.
Nombre de charges -30 pour le M4A1 et 20 pour le FN Five Seven. Ce sera le nombre de munitions maximum que chacune de ses deux armes peut avoir dans un chargeur.
Modifiez le reste à votre convenance.
Maintenant, prenez n’importe quel objet chargé (comme les potions de vie ou de mana).
Copiez-collez le deux fois encore : deux types de munitions (ici 5.56mm et 9mm).
Pour les deux, ajoutez la compétence : reload (la compétence objet fondée sur le sort Berserk).
Nombre de charges : ce que vous voulez, mais par logique, si on considère qu’un objet munition est un « clip » comme disent les anglo-saxons, mettez 30 charges pour les munitions 5.56mm (celles du M4A1) et 20 pour les 9mm (celles du Five Seven).
Presque fini avec l’éditeur d’objet
Unité
J’ai pris le héro des humains mage de sang et changé les éléments suivants :
Arbre des technologies-Améliorations utilisées : Portée+100, Portée -100 (nos deux recherches du début).
Capacités-Normal : Drop Weapon, Reload Weapon, inventaire de l’unité(héros), garnison(antre des orcs). Cette dernière permettra de désactiver l’attaque du héros tant qu’il n’aura pas d’arme.
Arme-Graphisme Projectile : celui du fusiller.
Arc Projectile : 0.00
Portée : 400
Temps de rechargement : 1.00 Je conseille un tir par seconde de base, ça sera plus simple pour calculer la vitesse de tir de l’arme
Vitesse Projectile : 3000
Plus bas, dans Combat-Portée d’acquisition : mettez 400.
Modifiez le reste à votre guise pour que le Mage de Sang devienne un Marine
II/ Sons
Voilà une partie rapide et facultative : on ouvre l’éditeur de son, on importe un son par arme+un bruit d’arme en train d’être rechargée, et on sélectionne : utiliser comme sons. On peut aussi importer un son de message d’erreur.
Allez, on commence à atteindre le nerf du système :
III/ Variables
Le système requiert un certain nombre de variables ; ne vous occupez pas des valeurs par défaut, et, quand c’est le cas, du nombre de déploiement.
Item_arme_entier : Entier
Charge : Entier
Item_difference : : Entier
Item_type_entier_max : Entier
Hero_range_moins_entier : Entier de déploiement
Hero_range_plus_entier : Entier de déploiement
Item_entier_munition_max : Entier de déploiement
Item_range_entier : Entier de déploiement
Item_boolen_arme : booléen de déploiement
Item_effet : chaîne de déploiement
Item_rejet_point : point
Item_portee_acqu : réel de déploiement
Son_impossible : son
Son_reload : son
Son_type_arme : son de déploiement
Item_type_arme : type d’objet de déploiement
Item_type_munition : type d’objet de déploiement
Et enfin, je vous le donne en mille : les déclencheurs ; la partie la plus lourde du système :
IV/ Déclencheurs
J’ai laissé pas mal de commentaires sur la carte exemple ; aussi je vais simplement copier-coller les déclencheurs et commenter quand nécessaire.
Variables
Secret:
Gui:
Trigger:
V Armes
Evénements
Map initialization
Conditions
Actions
-------- Classer par portée d'arme croissante!!! -------- -------- FN Five Seven: 600 -------- Set Item_arme_entier = (Item_arme_entier + 1) Set Item_type_arme[Item_arme_entier] = FN Five Seven Set Item_type_munition[Item_arme_entier] = Ammo 9x19mm Set Item_entier_munition_max[Item_arme_entier] = 20 Set Item_range_entier[Item_arme_entier] = 2 Set Son_type_arme[Item_arme_entier] = Five_Seven <gen> Set Item_effet[Item_arme_entier] = war3mapImportedKonstrukt_MinigunEffectAttachment.MDX Set Item_portee_acqu[Item_arme_entier] = 600.00 -------- Colt M4A1: 1000 -------- Set Item_arme_entier = (Item_arme_entier + 1) Set Item_type_arme[Item_arme_entier] = Colt M4A1 Set Item_type_munition[Item_arme_entier] = Ammo 5.56x45mm [M.30] Set Item_entier_munition_max[Item_arme_entier] = 30 Set Item_range_entier[Item_arme_entier] = 6 Set Son_type_arme[9] = M4A1__Full_Auto_u <gen> Set Item_effet[Item_arme_entier] = war3mapImportedKonstrukt_MinigunEffectAttachment.MDX Set Item_portee_acqu[Item_arme_entier] = 1000.00 -------- Règle le nombre total d'armes -------- Set Item_type_arme_entier_max = (Item_arme_entier + 1)
C’est assez simple : on règle les variables crées précédemment en fonction des armes.
Citation:
Set Item_arme_entier = (Item_arme_entier + 1)
On incrémente le numéro de l’arme.
Citation:
Set Item_type_arme[Item_arme_entier] = FN Five Seven
On sélectionne l’arme
Citation:
Set Item_type_munition[Item_arme_entier] = Ammo 9x19mm
On sélectionne la munition associée
Citation:
Set Item_entier_munition_max[Item_arme_entier] = 20
On attribue le nombre maximum de munitions
Citation:
Set Item_range_entier[Item_arme_entier] = 2
On attribue la portée de l’arme : vous vous souvenez des recherches ? Notre héros, de base, à une potée à 400. En indiquant 2 ici, par la suite on augmentera alors de 2 la recherche Portee+100, donnant à notre héros une portée de 600.
Citation:
Set Son_type_arme[Item_arme_entier] = Five_Seven <gen>
Le son de l’arme.
Citation:
Set Item_effet[Item_arme_entier] = war3mapImported\Konstrukt_MinigunEffectAttachment.MDX
Le modèle qui servira pour imiter le tir d’une arme à feu.
Citation:
Set Item_portee_acqu[Item_arme_entier] = 600.00
La portée d’acquisition de l’arme. Je l’ai mise par défaut pour qu’elle soit comme la portée de tir de l’arme.
Secret:
Gui:
Trigger:
V Autres variables
Evénements
Map initialization
Conditions
Actions
Set Son_impossible = Error <gen> Set Son_reload = FN_P90_Reload <gen>
Rien de méchant, on attribue les derniers sons dans des variables, pour limiter le leak.
Divers
Secret:
Gui:
Trigger:
O Empilement
Evénements
Unité - A unit Acquiert un objet
Conditions
Actions
-------- Permet de cumuler les munitions de même type --------
For each (Integer A) from 1 to 6, do (Actions)
Boucle - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
(Item-type of (Item carried by (Triggering unit) in slot (Integer A))) Egal à (Item-type of (Item being manipulated)) (Item carried by (Triggering unit) in slot (Integer A)) Différent de (Item being manipulated) (Item-class of (Item being manipulated)) Egal à Chargé
Alors - Actions
Set charge = (Charges remaining in (Item carried by (Triggering unit) in slot (Integer A))) Objet - Remove (Item carried by (Triggering unit) in slot (Integer A)) Unité - Order (Triggering unit) to move (Item being manipulated) to inventory slot (Integer A) Objet - Set charges remaining in (Item being manipulated) to (charge + (Charges remaining in (Item being manipulated))) Skip remaining actions
Sinon - Actions
Ce système, qui n’est pas de moi, vous permettra d’empiler les munitions : si un héros récupère 4 fois l’objet munition 5.56, chargé à 30 balles, son inventaire ne se verra occupé que par un slot comportant 120 munitions 5.56
Les armes
On ramasse une arme alors qu'on en a déjà une
Secret:
Gui:
Trigger:
O Acquisition Arme rejet
Evénements
Unité - A unit Acquiert un objet
Conditions
Actions
-------- Permet de supprimer l'arme acquise si l'unité en possède déjà une. -------- -------- Vérifie pour chaque arme existante -------- -------- Si l'objet est une arme connue -------- -------- Et si le héros porte déjà une arme (c'est le booléen) --------
For each (Integer A) from 1 to Item_type_arme_entier_max, do (Actions)
Boucle - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
(Item-type of (Item being manipulated)) Egal à Item_type_arme[(Integer A)] Item_booleen_arme[(Player number of (Owner of (Triggering unit)))] Egal à TRUE
Alors - Actions
-------- Point nécessaire pour le rejet de l'arme -------- Set Item_rejet_point = (Position of (Triggering unit)) -------- On prévient le joueur qu'il a déjà une arme -------- -------- Par du texte et un son -------- Partie - Display to (Player group((Owner of (Triggering unit)))) the text: You already have a ... Son - Play Son_impossible at 100.00% volume, attached to (Triggering unit) -------- On ordonne au héros de jeter l'arme, et on supprime le point pour éviter le leak -------- Unité - Order (Triggering unit) to drop (Item being manipulated) at Item_rejet_point Custom script: call RemoveLocation(udg_Item_rejet_point) Skip remaining actions
Sinon - Actions
On ramasse une arme alors qu'on n'en n'a pas: on s'équipe
Secret:
Gui:
Trigger:
O Acquisition Arme acceptation
Evénements
Unité - A unit Acquiert un objet
Conditions
Actions
-------- Règle les nouveaux paramètres si l'arme est acceptée -------- -------- Vérifie pour chaque arme existante -------- -------- Si l'objet est une arme connue -------- -------- Et si le héros ne porte pas d'arme (c'est le booléen) --------
For each (Integer A) from 1 to Item_type_arme_entier_max, do (Actions)
Boucle - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
(Item-type of (Item being manipulated)) Egal à Item_type_arme[(Integer A)] Item_booleen_arme[(Player number of (Owner of (Triggering unit)))] Egal à FALSE
Alors - Actions
-------- On enlève la compétence garnison: le héro pourra attaquer -------- Unité - Remove Garnison (Antre des Orcs) from (Triggering unit) -------- Le booleen devient vrai: le héro possède une arme -------- Set Item_booleen_arme[(Player number of (Owner of (Triggering unit)))] = TRUE -------- On règle la portée actuelle du héro sur celle de l'arme -------- Set Hero_range_plus_entier[(Player number of (Owner of (Triggering unit)))] = (Hero_range_plus_entier[(Player number of (Owner of (Triggering unit)))] + Item_range_entier[(Integer A)]) Joueur - Set the current research level of Portée +100 to Hero_range_plus_entier[(Player number of (Owner of (Triggering unit)))] for (Owner of (Triggering unit)) -------- Et sa portée d'acquisition -------- Unité - Set (Triggering unit) acquisition range to Item_portee_acqu[(Integer A)] Skip remaining actions
Sinon - Actions
On utilise la compétence "drop weapon"
Secret:
Gui:
Trigger:
O Lacher arme
Evénements
Unité - A unit Commence le lancement d'une compétence
Conditions
Actions
-------- Si le joueur se sert de la compétence drop -------- -------- Revient au même que de déposer soi-même l'objet --------
For each (Integer A) from 1 to Item_type_arme_entier_max, do (Actions)
Boucle - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
(Ability being cast) Egal à Drop Weapon
Alors - Actions
-------- Point nécessaire pour le rejet de l'arme -------- Set Item_rejet_point = (Position of (Triggering unit)) -------- Le héros lâche l'arme -------- Unité - Order (Triggering unit) to drop (Item carried by (Triggering unit) of type Item_type_arme[(Integer A)]) at (Position of (Triggering unit)) -------- On supprime le point pour éviter le leak -------- Custom script: call RemoveLocation(udg_Item_rejet_point) Skip remaining actions
Sinon - Actions
On jette l'arme (par la compétence drop weapon ou en la déposant au sol)
Secret:
Gui:
Trigger:
O Consequence lacher arme
Evénements
Unité - A unit Perd un objet
Conditions
Actions
-------- Conséquences de la perte de l'arme --------
For each (Integer A) from 1 to Item_type_arme_entier_max, do (Actions)
Boucle - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
(Item-type of (Item being manipulated)) Egal à Item_type_arme[(Integer A)]
Alors - Actions
-------- On ajoute à l'unité la compétence antre des orcs pour supprimer son attaque -------- Unité - Add Garnison (Antre des Orcs) to (Triggering unit) -------- Le héro n'a plus d'arme: booléen faux -------- Set Item_booleen_arme[(Player number of (Owner of (Triggering unit)))] = FALSE -------- On diminue la portée du héro à son nominal -------- Set Hero_range_moins_entier[(Player number of (Owner of (Triggering unit)))] = (Hero_range_moins_entier[(Player number of (Owner of (Triggering unit)))] + Item_range_entier[(Integer A)]) Joueur - Set the current research level of Portée -100 to Hero_range_moins_entier[(Player number of (Owner of (Triggering unit)))] for (Owner of (Triggering unit)) -------- Et sa portée d'acquisition -------- Unité - Set (Triggering unit) acquisition range to 400.00 Skip remaining actions
Sinon - Actions
Bonus: verrouiller certaines armes pour un seul type de héro
Secret:
Gui:
Trigger:
O Verouillage Arme Marine
Evénements
Unité - A unit Acquiert un objet
Conditions
Actions
-------- Pour que seul le Marine puisse prendre certaines armes --------
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
(Item-type of (Item being manipulated)) Egal à Colt M4A1 (Unit-type of (Triggering unit)) Différent de Marine Item_booleen_arme[(Player number of (Owner of (Triggering unit)))] Egal à FALSE
Alors - Actions
-------- Point nécessaire pour le rejet de l'arme -------- Set Item_rejet_point = (Position of (Triggering unit)) -------- On prévient le joueur qu'il ne peut pas porter cette arme -------- -------- Par du texte et un son -------- Partie - Display to (Player group((Owner of (Triggering unit)))) the text: This weapon is for ... Son - Play Son_impossible at 100.00% volume, attached to (Triggering unit) -------- On ordonne au héros de jeter l'arme, et on supprime le point pour éviter le leak -------- Unité - Order (Triggering unit) to drop (Item being manipulated) at (Position of (Triggering unit)) Skip remaining actions Custom script: call RemoveLocation(udg_Item_rejet_point)
Sinon - Actions
Ce dernier déclencheur n’est pas indispensable, mais peut servir, pour éviter que votre petit scientifique utilise un lance roquettes
Les Munitions-1
Ce qui se passe quand le héro attaque une unité: soit il a des munitions et continue de tirer, soit il n'en n'a plus, et doit s'arrêter de faire feu.
Secret:
Gui:
Trigger:
O Dechargement arme
Evénements
Unité - A unit Est attaqué
Conditions
Actions
-------- Quand le héro tire... -------- -------- Pour tout les types d'armes connus -------- -------- Pour chaque slot de 1 à 6 de l'inventaire --------
For each (Integer A) from 1 to Item_type_arme_entier_max, do (Actions)
Boucle - Actions
For each (Integer B) from 1 to 6, do (Actions)
Boucle - Actions
-------- Si l'unité qui attaque est un héro -------- -------- Si il reste des munitions -------- -------- Si les munitions correspondent à l'arme portée --------
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
((Attacking unit) is Un héros) Egal à TRUE (Charges remaining in (Item carried by (Attacking unit) of type Item_type_arme[(Integer A)])) Supérieur à 0 (Item-type of (Item carried by (Attacking unit) in slot (Integer B))) Egal à Item_type_arme[(Integer A)]
Alors - Actions
-------- On joue le son de l'arme -------- Son - Play Son_type_arme[(Integer A)] at 100.00% volume, attached to (Attacking unit) -------- On enlève 1 aux munitions -------- Objet - Set charges remaining in (Item carried by (Attacking unit) of type Item_type_arme[(Integer A)]) to ((Charges remaining in (Item carried by (Attacking unit) of type Item_type_arme[(Integer A)])) - 1) -------- On ajoute un effet spécial pour imiter le tir -------- Effet spécial - Create a special effect attached to the weapon of (Attacking unit) using Item_effet[(Integer A)] -------- Et on le détruit pour éviter le leak -------- Effet spécial - Destroy (Last created special effect) Skip remaining actions
Sinon - Actions
-------- Mais si il n'y a plus de munitions --------
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
((Attacking unit) is Un héros) Egal à TRUE (Charges remaining in (Item carried by (Attacking unit) of type Item_type_arme[(Integer A)])) Egal à 0 (Item-type of (Item carried by (Attacking unit) in slot (Integer B))) Egal à Item_type_arme[(Integer A)]
Alors - Actions
-------- On ordonne à l'unité de stopper pour l'empêcher de tirer -------- Unité - Order (Attacking unit) to Arrêter Skip remaining actions
Sinon - Actions
Quand on utilise la compétence rechargement d'arme: on va ordonner au héro d'utiliser ses munitions
Secret:
Gui:
Trigger:
O Reload Weapon
Evénements
Unité - A unit Commence le lancement d'une compétence
Conditions
Actions
-------- Si le joueur utilise la compétence reload weapon -------- -------- Revient au même que d'utiliser l'objet munition -------- -------- Vérifie dans chaque slot -------- -------- Laquelle des munitions portées correspond à l'arme --------
For each (Integer A) from 1 to 15, do (Actions)
Boucle - Actions
For each (Integer B) from 1 to 6, do (Actions)
Boucle - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
(Ability being cast) Egal à Reload Weapon (Item-type of (Item carried by (Triggering unit) in slot (Integer B))) Egal à Item_type_arme[(Integer A)] (Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) Supérieur à 0
Alors - Actions
-------- Et ordonne au héro de cliquer sur la munition, c'est à dire l'utiliser -------- Héros - Order (Triggering unit) to use (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)]) Skip remaining actions
Sinon - Actions
Les Munitions-2
Là, ca devient plus compliqué.
J'ai choisi de faire 5 déclencheurs.
En gros, ils correspondent aux différents cas de figure possible.
Dans tous les cas:
Dès que le héro utilise une munition correspondant à l'arme portée, on enlève antre des orcs à l'unité pour qu'elle puisse à nouveau attaquer.
On joue le son du rechargement d'arme.
Tout le reste va permettre:
-d'ajouter le nombre de munitions disponibles dans l'arme
-de supprimer les munitions si on les utilise toutes ^pour éviter d'avoir un objet de type munition sans charge.
Les différences ont lieu au niveau du nombre de munitions qu'il reste dans l'arme, et en réserve; on a donc cinq cas de figure:
1)
Il y a plus de munitions en réserve que le maximum que l'arme a dans son chargeur.
Secret:
Gui:
Trigger:
O Utilisation Clip 1
Evénements
Unité - A unit Utilise un objet
Conditions
Actions
For each (Integer A) from 1 to 20, do (Actions)
Boucle - Actions
For each (Integer B) from 1 to 6, do (Actions)
Boucle - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
(Item-type of (Item carried by (Hero manipulating item) in slot (Integer B))) Egal à Item_type_arme[(Integer A)] (Item-type of (Item being manipulated)) Egal à Item_type_munition[(Integer A)] (Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) Supérieur ou égal à Item_entier_munition_max[(Integer A)]
Alors - Actions
Animation - Play (Triggering unit)'s spell second animation Son - Play Son_reload at 100.00% volume, attached to (Triggering unit) Unité - Remove Garnison (Antre des Orcs) from (Triggering unit) Set Item_difference = (Item_entier_munition_max[(Integer A)] - (Charges remaining in (Item carried by (Triggering unit) of type Item_type_arme[(Integer A)]))) Objet - Set charges remaining in (Item carried by (Triggering unit) of type Item_type_arme[(Integer A)]) to ((Charges remaining in (Item carried by (Triggering unit) of type Item_type_arme[(Integer A)])) + Item_difference) Objet - Set charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)]) to ((Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) + 1) Objet - Set charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)]) to ((Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) - Item_difference) If ((Charges remaining in (Item carried by (Hero manipulating item) of type Item_type_munition[(Integer A)])) Egal à 0) then do (Objet - Remove (Item carried by (Hero manipulating item) of type Item_type_munition[(Integer A)])) else do (Do nothing) Skip remaining actions
Sinon - Actions
2)a)
Il y a moins de munitions en réserve que le maximum que l'arme peut avoir dans son chargeur
Il y a plus de munitions en réserve que le maximum que l'arme peut avoir dans son chargeur
Le total munitions de l'arme + réserve de munition est inférieur au maximum que l'arme peut avoir dans son chargeur
Secret:
Gui:
Trigger:
O Utilisation Clip 2a
Evénements
Unité - A unit Utilise un objet
Conditions
Actions
For each (Integer A) from 1 to 20, do (Actions)
Boucle - Actions
For each (Integer B) from 1 to 6, do (Actions)
Boucle - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
(Item-type of (Item carried by (Hero manipulating item) in slot (Integer B))) Egal à Item_type_arme[(Integer A)] (Item-type of (Item being manipulated)) Egal à Item_type_munition[(Integer A)] (Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) Inférieur à Item_entier_munition_max[(Integer A)] (Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) Supérieur à (Charges remaining in (Item carried by (Triggering unit) of type Item_type_arme[(Integer A)])) ((Charges remaining in (Item carried by (Triggering unit) of type Item_type_arme[(Integer A)])) + ((Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) + 1)) Inférieur ou égal à Item_entier_munition_max[(Integer A)]
Alors - Actions
Animation - Play (Triggering unit)'s spell second animation Son - Play Son_reload at 100.00% volume, attached to (Triggering unit) Unité - Remove Garnison (Antre des Orcs) from (Triggering unit) Set Item_difference = (Item_entier_munition_max[(Integer A)] - (Charges remaining in (Item carried by (Triggering unit) of type Item_type_arme[(Integer A)]))) Objet - Set charges remaining in (Item carried by (Triggering unit) of type Item_type_arme[(Integer A)]) to ((Charges remaining in (Item carried by (Triggering unit) of type Item_type_arme[(Integer A)])) + Item_difference) Objet - Set charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)]) to ((Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) + 1) Objet - Set charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)]) to ((Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) - Item_difference) If ((Charges remaining in (Item carried by (Hero manipulating item) of type Item_type_munition[(Integer A)])) Egal à 0) then do (Objet - Remove (Item carried by (Hero manipulating item) of type Item_type_munition[(Integer A)])) else do (Do nothing) Skip remaining actions
Sinon - Actions
2)b)
Il y a moins de munitions en réserve que le maximum que l'arme peut avoir dans son chargeur
Il y a plus de munitions en réserve que le maximum que l'arme peut avoir dans son chargeur
Le total munitions de l'arme + réserve de munition est supérieur au maximum que l'arme peut avoir dans son chargeur
Secret:
Gui:
Trigger:
O Utilisation Clip 2b
Evénements
Unité - A unit Utilise un objet
Conditions
Actions
For each (Integer A) from 1 to 20, do (Actions)
Boucle - Actions
For each (Integer B) from 1 to 6, do (Actions)
Boucle - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
(Item-type of (Item carried by (Hero manipulating item) in slot (Integer B))) Egal à Item_type_arme[(Integer A)] (Item-type of (Item being manipulated)) Egal à Item_type_munition[(Integer A)] (Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) Inférieur à Item_entier_munition_max[(Integer A)] (Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) Supérieur à (Charges remaining in (Item carried by (Triggering unit) of type Item_type_arme[(Integer A)])) ((Charges remaining in (Item carried by (Triggering unit) of type Item_type_arme[(Integer A)])) + ((Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) + 1)) Supérieur à Item_entier_munition_max[(Integer A)]
Alors - Actions
Animation - Play (Triggering unit)'s spell second animation Son - Play Son_reload at 100.00% volume, attached to (Triggering unit) Unité - Remove Garnison (Antre des Orcs) from (Triggering unit) Set Item_difference = (Item_entier_munition_max[(Integer A)] - (Charges remaining in (Item carried by (Triggering unit) of type Item_type_arme[(Integer A)]))) Objet - Set charges remaining in (Item carried by (Triggering unit) of type Item_type_arme[(Integer A)]) to ((Charges remaining in (Item carried by (Triggering unit) of type Item_type_arme[(Integer A)])) + Item_difference) Objet - Set charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)]) to ((Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) + 1) Objet - Set charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)]) to ((Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) - Item_difference) If ((Charges remaining in (Item carried by (Hero manipulating item) of type Item_type_munition[(Integer A)])) Egal à 0) then do (Objet - Remove (Item carried by (Hero manipulating item) of type Item_type_munition[(Integer A)])) else do (Do nothing) Skip remaining actions
Sinon - Actions
3)a)
Il y a moins de munitions en réserve que le maximum que l'arme peut avoir dans son chargeur
Il y a moins de munitions en réserve que le maximum que l'arme peut avoir dans son chargeur
Le total munitions de l'arme + réserve de munition est inférieur au maximum que l'arme peut avoir dans son chargeur
Secret:
Gui:
Trigger:
O Utilisation Clip 3a
Evénements
Unité - A unit Utilise un objet
Conditions
Actions
For each (Integer A) from 1 to 20, do (Actions)
Boucle - Actions
For each (Integer B) from 1 to 6, do (Actions)
Boucle - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
(Item-type of (Item carried by (Hero manipulating item) in slot (Integer B))) Egal à Item_type_arme[(Integer A)] (Item-type of (Item being manipulated)) Egal à Item_type_munition[(Integer A)] (Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) Inférieur à Item_entier_munition_max[(Integer A)] (Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) Inférieur ou égal à (Charges remaining in (Item carried by (Triggering unit) of type Item_type_arme[(Integer A)])) ((Charges remaining in (Item carried by (Triggering unit) of type Item_type_arme[(Integer A)])) + ((Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) + 1)) Inférieur ou égal à Item_entier_munition_max[(Integer A)]
Alors - Actions
Animation - Play (Triggering unit)'s spell second animation Son - Play Son_reload at 100.00% volume, attached to (Triggering unit) Unité - Remove Garnison (Antre des Orcs) from (Triggering unit) Objet - Set charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)]) to ((Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) + 1) Set Item_difference = (Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) Objet - Set charges remaining in (Item carried by (Triggering unit) of type Item_type_arme[(Integer A)]) to ((Charges remaining in (Item carried by (Triggering unit) of type Item_type_arme[(Integer A)])) + Item_difference) Objet - Set charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)]) to ((Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) - Item_difference) If ((Charges remaining in (Item carried by (Hero manipulating item) of type Item_type_munition[(Integer A)])) Egal à 0) then do (Objet - Remove (Item carried by (Hero manipulating item) of type Item_type_munition[(Integer A)])) else do (Do nothing) Skip remaining actions
Sinon - Actions
3)b)
Il y a moins de munitions en réserve que le maximum que l'arme peut avoir dans son chargeur
Il y a moins de munitions en réserve que le maximum que l'arme peut avoir dans son chargeur
Le total munitions de l'arme + réserve de munition est supérieur au maximum que l'arme peut avoir dans son chargeur
Secret:
Gui:
Trigger:
O Utilisation Clip 3b
Evénements
Unité - A unit Utilise un objet
Conditions
Actions
For each (Integer A) from 1 to 20, do (Actions)
Boucle - Actions
For each (Integer B) from 1 to 6, do (Actions)
Boucle - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
(Item-type of (Item carried by (Hero manipulating item) in slot (Integer B))) Egal à Item_type_arme[(Integer A)] (Item-type of (Item being manipulated)) Egal à Item_type_munition[(Integer A)] (Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) Inférieur à Item_entier_munition_max[(Integer A)] (Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) Inférieur ou égal à (Charges remaining in (Item carried by (Triggering unit) of type Item_type_arme[(Integer A)])) ((Charges remaining in (Item carried by (Triggering unit) of type Item_type_arme[(Integer A)])) + ((Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) + 1)) Supérieur à Item_entier_munition_max[(Integer A)]
Alors - Actions
Animation - Play (Triggering unit)'s spell second animation Son - Play Son_reload at 100.00% volume, attached to (Triggering unit) Unité - Remove Garnison (Antre des Orcs) from (Triggering unit) Objet - Set charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)]) to ((Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) + 1) Set Item_difference = (Item_entier_munition_max[(Integer A)] - (Charges remaining in (Item carried by (Triggering unit) of type Item_type_arme[(Integer A)]))) Objet - Set charges remaining in (Item carried by (Triggering unit) of type Item_type_arme[(Integer A)]) to Item_entier_munition_max[(Integer A)] Objet - Set charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)]) to ((Charges remaining in (Item carried by (Triggering unit) of type Item_type_munition[(Integer A)])) - Item_difference) If ((Charges remaining in (Item carried by (Hero manipulating item) of type Item_type_munition[(Integer A)])) Egal à 0) then do (Objet - Remove (Item carried by (Hero manipulating item) of type Item_type_munition[(Integer A)])) else do (Do nothing) Skip remaining actions
Sinon - Actions
V/ Conclusion
Voilà pour ce système, certes un peu long à mettre en place, mais très pratique quand on veut gérer 40 armes différentes
!! moi qui bosse sur mon système d'armes et munitions je ne peux qu'être satisfait je vais pouvoir voir plus facilement ce que tu as fait que sur le topic de ta map.
Par contre je pense que je le posterai également dans le tutoriel si ça ne te gène pas ?
Un petit truc : le I/ c'est le chiffre romain et non pas I/I ou I/II _________________
Si vous recherchez quelque chose, il y a de très grandes chances que vous trouviez la réponse ici alors jetez y un oeil. Topic indispensable
Bravo et merci pour ce travail que tu nous partage.
Les romains connaissaient le zéro mais ne le considérait pas comme un nombre, généralement ils passaient de -1 à 1. _________________
!! moi qui bosse sur mon système d'armes et munitions je ne peux qu'être satisfait je vais pouvoir voir plus facilement ce que tu as fait que sur le topic de ta map.
Par contre je pense que je le posterai également dans le tutoriel si ça ne te gène pas ?
Un petit truc : le I/ c'est le chiffre romain et non pas I/I ou I/II
Pas de problème pour poster ici; de toute façon RC601 est en pause également (Faudrait que j'optimise trop de trucs pour mon courage actuel; la map est déjà proche des 4MOs, a cause des nombreux modèles)
Oui les chiffres, erreur de copier coller (réparée)
@Ayane: mais de rien. Y'a sûrement plus léger, mais je pense que c'est pas mal: une fois le système mis en place, y'a plus qu'à créer les objets et leurs compétences, et à régler les variables. _________________
Inscrit le: 21 Avr 2008 Messages: 1607 Sujets: 81 Spécialité en worldedit: Utiliser le travail des autres Médailles: 3 (En savoir plus...)
Posté le: 22/01/09 16:42 Sujet du message:
Excellent! je vais peut-être l'adapter pour un système d'usure des lames, du nombre de flèches et de gemmes pour les magiciens, dans une map. _________________
-le cumul des potions de GVans
-l'augmentation de portée du héros par max-4938 (parce que ça j'ai vraiment galéré)
-le principe du rechargement de la carte Afterlife. (Qui m'a bien *** aussi, parce qu'il était dur à adapter à mon envie d'avoir le moins de lignes possibles: dans Afterlife chaque arme=un héro=une munition= quatre déclencheurs.)
Attention ce système est difficile à adapter, Cro, si tu veux qu'il fonctionne pour des projectiles différents. Je m'explique: dans Rc601, j'ai aussi un lance flamme et lance grenade, notament.
Donc un tout autre graphisme que les balles. Comme je ne veux pas créer un héro spécifique au lance-flamme et lance grenade, j'ai dû bidouiller.
Pour le lance grenade, rien de grave: on n'est pas obligé de voir la grenade arriver, suffit de créer des effets sur l'unité attaquée.
Pour le lance flamme, je n'ai jamais trouvé de solution parfaite: j'ai créé un dummy avec une attaque minimale qui attaque l'unité ennemie attaquée par le héro. Mais il y a toujours un décallage entre l'animation des flammes et les premiers tirs, donc c'est assez moche :s
Edit: donc je ne sais pas si tu pourras adapter ce système système pour un seul type de héros, avec des projectiles de forme/arc/vitesse différents. C'est bien pour ça que je parle d'arme à feu dans le tuto^^
Edit 2: c'est quand même fou ce qu'on a envie de faire des tutoriaux quand on a un rapport de #### à faire _________________
Bon comme promis je mets mon système, je vais surement continuer à l'améliorer notamment en trouvant un moyen de pouvoir tirer en continue, c'est à dire sans avoir à réappuyer sur le bouton tirer.
Comme vous voyez les munitions sont stockées dans un tableau en haut à droite, j'en ai fait un pour chaque joueur et je ne sais pas si c'est très viable mais bon c'est un détail.
Concernant le fonctionnement, tout repose sur un système de 4 variables :
bool_arme[a*10+b] (type booléen) : retourne vrai si le joueur a possède l'arme b
munition[a*10+b] (type entier) : retourne le nombre de munition du joueur a pour l'arme b
arme_port[a] (type entier) : retourne le numéro de l'arme portée par le joueur a
arme[c] (type chaine de caractère) : retourne le nom de l'arme c
Voilà à partir de là il n'y a plus grand chose à faire...
a)Initialisation
Secret:
Gui:
Trigger:
Initialisation
Evénements
Map initialization
Conditions
Actions
-------- Joueurs -------- Set CONST_nbrplayer = 4 Set unites[1] = Fusilier 0000 <gen> Set unites[2] = Fusilier 0001 <gen> Set unites[3] = Fusilier 0002 <gen> Set unites[4] = Fusilier 0003 <gen> -------- Armes -------- Set CONST_nbrarm = 4 Set arme[1] = Pistolet Set muni_max[1] = 5 Set arme[2] = Mitraillette Set muni_max[2] = 20 Set arme[3] = Fusil Set muni_max[3] = 15 Set arme[4] = Lance rocket Set muni_max[4] = 5 -------- Munitions --------
For each (Integer A) from 1 to CONST_nbrplayer, do (Actions)
Boucle - Actions
Set bool_arm[(((Integer A) x 10) + 1)] = TRUE Set bool_arm[(((Integer A) x 10) + 2)] = TRUE Set munition[(((Integer A) x 10) + 1)] = muni_max[1] Set munition[(((Integer A) x 10) + 2)] = muni_max[2] Set arme_port[(Integer A)] = 1 Joueur - Set (Player((Integer A))) Or actuel to munition[(((Integer A) x 10) + 1)]
Un moyen d'avoir accès aux nombres de munitions de l'arme portée actuellement consiste à regarder l'or actuel, c'est un peu plus simple à faire par déclo mais ça empêche d'utiliser l'or dans sa map...
b)Le tableau
On ajoute les armes qu'on possède dans le tableau avec leur nombre de munition, dès qu'on trouve une arme il faudra penser à l'ajouter dans le tableau, si on la perd (ce qui est n'est possible que si on est tué car même avec 0 munition on garde notre arme) on l'enlève.
Secret:
Gui:
Trigger:
Tableau
Evénements
Temps - Elapsed game time is 1.00 seconds
Conditions
Actions
For each (Integer A) from 1 to CONST_nbrplayer, do (Actions)
Boucle - Actions
Panneau de commandes - Create a leaderboard for (Player group((Player((Integer A))))) titled Arsenal Set Tableau[(Integer A)] = (Last created leaderboard) Panneau de commandes - Montrer (Last created leaderboard)
For each (Integer B) from 1 to CONST_nbrarm, do (Actions)
Boucle - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
bool_arm[(((Integer A) x 10) + (Integer B))] Egal à TRUE
Alors - Actions
Panneau de commandes - Add (Player((Integer B))) to (Last created leaderboard) with label arme[(Integer B)] and value munition[(((Integer A) x 10) + (Integer B))] Panneau de commandes - Change the color of the value for (Player((Integer B))) in Tableau[(Integer A)] to (100.00%, 80.00%, 20.00%) with 0.00% transparency Panneau de commandes - Change the color of all labels for Tableau[(Integer A)] to (100.00%, 80.00%, 20.00%) with 0.00% transparency
Sinon - Actions
c)Changement d'arme
Secret:
Gui:
Trigger:
Changement arme
Evénements
Unité - A unit Initie l'effet d'une compétence
Conditions
(Ability being cast) Egal à Changer d'arme
Actions
Unité - Order (Triggering unit) to Arrêter Set i = arme_port[(Player number of (Owner of (Triggering unit)))]
For each (Integer j) from (i + 1) to CONST_nbrarm, do (Actions)
Boucle - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
bool_arm[(((Player number of (Owner of (Triggering unit))) x 10) + j)] Egal à TRUE
Alors - Actions
Set arme_port[(Player number of (Owner of (Triggering unit)))] = j Set j = CONST_nbrarm
Sinon - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
i Egal à arme_port[(Player number of (Owner of (Triggering unit)))]
Alors - Actions
For each (Integer j) from 1 to i, do (Actions)
Boucle - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
bool_arm[(((Player number of (Owner of (Triggering unit))) x 10) + j)] Egal à TRUE
Alors - Actions
Set arme_port[(Player number of (Owner of (Triggering unit)))] = j Set j = i
Sinon - Actions
Sinon - Actions
Do nothing
Joueur - Set (Owner of (Triggering unit)) Or actuel to munition[(((Player number of (Owner of (Triggering unit))) x 10) + arme_port[(Player number of (Owner of (Triggering unit)))])] Partie - Display to (All players) the text: (Nouvelle arme : + arme[arme_port[(Player number of (Owner of (Triggering unit)))]])
Si on veut changer d'arme, tout le truc c'est d'aller chercher l'arme suivante dans la liste d'arme. Mais le truc vicieux c'est qu'on est pas forcément sur la première arme donc il faut parcourir deux fois la liste (un coup de l'arme qu'on a jusqu'au bout et un coup du début jusqu'à l'arme qu'on a).
Globalement ça marche assez bien mais je pense qu'on peut trouver plus malin...
d)Tirer
Pour le shoot c'est assez simple, on enlève une munition sur l'arme actuel.
Si on est à 0, on lance le changement d'arme automatiquement!
Secret:
Gui:
Trigger:
Attaque
Evénements
Unité - A unit Initie l'effet d'une compétence
Conditions
(Ability being cast) Egal à Tirer
Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
munition[(((Player number of (Owner of (Triggering unit))) x 10) + arme_port[(Player number of (Owner of (Triggering unit)))])] Supérieur à 0
Alors - Actions
Set munition[(((Player number of (Owner of (Triggering unit))) x 10) + arme_port[(Player number of (Owner of (Triggering unit)))])] = (munition[(((Player number of (Owner of (Triggering unit))) x 10) + arme_port[(Player number of (Owner of (Triggering unit)))])] - 1) Joueur - Set (Owner of (Triggering unit)) Or actuel to (((Owner of (Triggering unit)) Or actuel) - 1) Panneau de commandes - Change the value for (Player(arme_port[(Player number of (Owner of (Triggering unit)))])) in Tableau[(Player number of (Owner of (Triggering unit)))] to munition[(((Player number of (Owner of (Triggering unit))) x 10) + arme_port[(Player number of (Owner of (Triggering unit)))])]
Sinon - Actions
-------- Plus de munition -------- Unité - Order (Triggering unit) to Arrêter Set o = 0 For each (Integer A) from 1 to CONST_nbrarm, do (If (bool_arm[(((Player number of (Owner of (Triggering unit))) x 10) + (Integer A))] Egal à TRUE) then do (Set o = (o + munition[(((Player number of (Owner of (Triggering unit))) x 10) + (Integer A))])) else do (Do nothing))
If (o Différent de 0) then do (Déclencheur - Run Changement arme <gen> (ignoring conditions)) else do (Partie - Display to (Player group((Owner of (Triggering unit)))) the text: Plus d'arme)
Voilà, je précise tout de même que ce système est en cours d'amélioration, pour l'instant il reste des gros défauts surtout lorsqu'on fait les tests, notamment le fait que tirer ne produit qu'un effet graphique puisque je n'ai pas gérer les dégâts ni les spécificités de chaque arme (ce qui peut se faire facilement en utilisant les différents niveaux du sort Tirer).
Simplement ici je donne un moyen de gérer les munitions assez simple, je pense que ça donne une autre approche même s'il est beaucoup moins complet !
Toutes les heures sont au format GMT + 1 Heure Aller à la page 1, 2Suivante
Page 1 sur 2 La question posée dans ce topic a été résolue !
Vous ne pouvez pas poster de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas voter dans les sondages de ce forum