[TUTO] Script de combat personnalisé [5/11]

Voir le sujet précédent Voir le sujet suivant Aller en bas

[TUTO] Script de combat personnalisé [5/11]

Message par Giuliani le Dim 31 Aoû - 1:13

Tutoriel réalisé à l'époque par Redone, et traduit et arrangé par mes soins^^

Pour utiliser son propre système de combat, il faut d'abord le choisir dans la GUE=> Onglet Combat => Use the attack script (Advanced)

Pour créer un script de combat, nous devons d'abord développer une formule en nous posant quelques questions:

1) Quels sont les dégâts possibles?
2) Avons-nous atteint la cible ou manqué?
3) Que se passe t'il si mon perso ou si l'adversaire meurt ?

Pour ce tutoriel, nous allons utiliser des attributs qui sont par défaut dans RC, et nous allons commencer très simple. Si vous le souhaitez  vous pouvez ajouter vos propres attributs et les utiliser pour formuler votre propre script. Après tout, à la fin , ce script doit être complètement adapté à votre projet.


PART 1: ÉLABORATION DE LA FORMULE.

Nous avons d'abord besoin de quelques chiffres(attributs) à utiliser pour que notre système fasse ce que nous souhaitons:

Strength - déterminera les dégâts potentiels (plus tard on ajoutera les dégâts causés par les armes)
Dexterity - déterminera nos chances d'esquiver une attaque
Speed - déterminera nos chances de toucher (plus tard, on rendra ça un peu plus complexe, mais là on fait simple.)
(On ajoutera l'armure à ce système plus tard)



Ainsi, en utilisant de simples variables, nous avons maintenant une base pour une formule. Comme notre potentiel de dommage est plus facile, nous allons commencer par là:
Dégâts = Strength (Force)

Maintenant, précisons les conditions qui détermineront si on a touché ou manqué.

Le facteur qui permet à notre cible d'esquiver une attaque:
Chance d'esquiver (Dodge Chance) = Dextérité de la cible (Targets Dexterity)

Et le facteur qui permet de toucher la cible
Chance de Toucher (Attack Chance) = Vitesse du joueur (Players Speed)


Très basique mais on développera plus tard.


On en a assez pour rédiger une petite formule résumant le système

if player's attack (speed) is greater than targets dodge(dexterity), we hit for damage(value of our strength), otherwise we miss
Si l'attaque du joueur (vitesse) est supérieure aux chances d'esquiver de la cible (dextérité), alors nous causons des dégâts (valeur de notre force), sinon nous manquons


Dernière édition par Giuliani le Ven 5 Déc - 17:55, édité 6 fois
avatar
Giuliani
Admin

Messages : 210
Points : 349
Date d'inscription : 25/06/2014
Age : 38
Localisation : Toulouse

http://realmcrafter.frbb.net

Revenir en haut Aller en bas

Re: [TUTO] Script de combat personnalisé [5/11]

Message par Giuliani le Dim 31 Aoû - 1:15

PART 2: DE LA FORMULE AU SCRIPT:

Maintenant que nous avons une formule, nous devons en  faire un script. Tout en haut du script, nous devons déclarer nos variables. Un conseil pour bien scripter, c'est d'avoir toutes les variables clairement définies. Nous devons avoir les bases, donc nous ajoutons l'essentiel en premier, dans notre fichier "Attack.rsl":
Nous déclarons nos variables

Player = Actor()
Target = Contextactor()


Le joueur est toujours Actor() et la cible est ContextActor() (l'actor désigné dans le contexte du jeu). Il faut toujours les définir Player and ContextActor en premier dans un script, avec une petite exception.

TargetHealth = Attribute(Target,"Health")
PlayerName$ = Name(Player)
TargetName$ = Name(Target)


Chaque combat a besoin d'au moins deux combattants, non?
Donc nous allons avoir également besoin de connaitre les points de vie de la cible TargetHealth (fait référence à l'attribut "Health"), comme il s'agit d'un script "réciproque" (parce que Le PNJ lance aussi ce script pendant la bataille, vous devenez donc "sa cible"). Nous utilisons le nom des déclarants pour le débogage, et pour dissocier les dommages (jusqu'à ce que nous ajoutions des nombres réels dommages).

Maintenant, nous devons déclarer les facteurs de notre formule de combat:

PlayerStrength = Attribute(Player,"Strength")
PlayerSpeed = Attribute(Player,"Speed")
TargetDex = Attribute(Target,"Dexterity")


Maintenant que les principaux attributs ont été déclarés, nous déclarons les variables de nos chance de toucher, les chances pour la cible d'esquiver, et les dommages potentiels:

AttackChance = PlayerSpeed
DodgeChance = TargetDex
Damage = PlayerStrength


Ok, donc nous avons déclaré. Maintenant passons à la formule. Tout d'abord, une note sur les dommages. ça paraît con mais, nous devons nous assurer qu'au moins «0»
dommage est fait par tout le monde:

If (Damage <= 0) ;Tout le monde doit faire au minimum 0 damage
Damage = 0
EndIf


Pseudo code: if player's attack (speed) is greater than targets dodge(dexterity), we hit for damage(value of our strength), otherwise we miss.

Script formula:


If (AttackChance >= DodgeChance)

TargetHealth = TargetHealth - Damage
Output(Player, "" + PlayerName + "Has Hit" + TargetName + "for" + Damage + "Damage", 0, 255, 255)
DoEvents (100)
SetAttribute(Target, "Health", TargetHealth)

Else
Output(Player, "" + PlayerName + " has missed" + TargetName +"", 255, 255, 255)
EndIf

J'ai ajouté Output (texte s'affichant dans le Chat) à des fins de débogage. Plus tard, nous allons ajouter des dégâts visuels flottants afin que nous puissions voir les dégâts en combat.

Nous avons maintenant un script très limité d'attaque de travail, qui utilise très peu pour atteindre son but. Le dommage est exactement égal à  l'attribut Force (Strength) des joueurs. Ce script n'anime pas encore le combat, ce sera couvert dans une autre leçon.


Dernière édition par Giuliani le Ven 5 Déc - 13:43, édité 2 fois
avatar
Giuliani
Admin

Messages : 210
Points : 349
Date d'inscription : 25/06/2014
Age : 38
Localisation : Toulouse

http://realmcrafter.frbb.net

Revenir en haut Aller en bas

Re: [TUTO] Script de combat personnalisé [5/11]

Message par Giuliani le Dim 31 Aoû - 1:21

PART 3: AJOUT DE HASARD

Nous allons ajouter un aspect de plus pour cette partie, nous allons ajouter un facteur aléatoire à nos variables. Plus tard, nous allons ajouter de nouveaux attributs à notre formule de combat, mais d'abord nous allons apprendre à mettre un peu de hasard à ce que nous avons.

Déclarer une nouvelle variable, FinalDamage en haut, juste en dessous de la ligne " Damage = PlayerStrength":
FinalDamage = Damage + Rand(0,10)

Puis remplacer toutes les occurrences du mot «Damage» dans les instructions If par "FinalDamage". Cela va ajouter entre 0 - 10 Dommages supplémentaire, variant à chaque fois.
Si vous changez le calcul aléatoire pour refléter une valeur négative, comme FinalDamage = Damage + Rand(-10,10), il est possible de permettre à l'attaquant de créer moins de dégâts que le début de leur potentiel de dommages.

Maintenant, éditez les déclarations " AttackChance = PlayerSpeed" et "DodgeChance = TargetDex" à la suite (ou expérimentez votre propre formule aléatoire):


AttackChance = PlayerSpeed + Rand (-20,20)
DodgeChance = TargetDex + Rand (-20,20)

Nous avons maintenant un peu plus de variété pour travailler.


Dernière édition par Giuliani le Dim 31 Aoû - 1:26, édité 1 fois
avatar
Giuliani
Admin

Messages : 210
Points : 349
Date d'inscription : 25/06/2014
Age : 38
Localisation : Toulouse

http://realmcrafter.frbb.net

Revenir en haut Aller en bas

Re: [TUTO] Script de combat personnalisé [5/11]

Message par Giuliani le Dim 31 Aoû - 1:23

PART 4: ARMURES ET ARMES.

Maintenant que nos actors se causent des dommages l'un l'autre en combat, nous allons ajouter 2 autres facteurs à notre formule originale, dégâts d'arme et bonus d'armure. Tout d'abord, déclarons de nouvelles variables pour les bonus d'armure de la cible.

Directement au-dessus de votre déclaration " AttackChance = PlayerSpeed + Rand (-20,20)" ajouter ces variables d'armure:

HatDef = ItemArmor(ActorHat(Target))
ChestDef = ItemArmor(ActorChest(Target))
ShieldDef = ItemArmor (ActorShield(Target))
FeetDef = ItemArmor(ActorFeet(Target))

La commande ItemArmor lit la valeur de niveau d'armure que vous définissez dans la GUE lorsque vous créez l'item.

Maintenant, nous allons les additionner pour obtenir une valeur totale de bonus d'armure en déclarant ceci ci-dessous les variables individuelles armure d'articles:

ArmorBonus = HatDef + ChestDef + ShieldDef + FeetDef

Nous pouvons maintenant utiliser la valeur de ArmorBonus pour réduire les dommages potentiels de notre formule. Ensuite, nous allons ajouter des dégâts d'arme pour améliorer le potentiel de dégâts en déclarant ce qui suit au dessus de notre déclaration de dommages:

WeaponDamage = ItemDamage(ActorWeapon(Player))

La commande ItemDamage lit la valeur des dégâts que vous définissez dans la GUE lorsque vous créez une arme. Utilisés directement, le potentiel de dommages est toujours constant.

CETTE ÉTAPE N'EST PAS NECESSAIRE, MAIS PEUT ETRE UTILE: Nous pouvons améliorer la durée des dégâts des armes plus loin en utilisant une valeur aléatoire contrôlée pour produire une gamme de dégâts. Par exemple, si vous voulez un set d'arme à 5 dommages dans GUE avoir un potentiel de dommages de 1 à 5, vous pouvez ajouter 2 valeurs plus déclarés à atteindre cet objectif.

Pour couvrir la gamme des dégâts potentiels en utilisant une valeur aléatoire contrôlé, déclarer ces variables ci-dessus la déclaration FinalDamage. Si vous n'avez pas besoin de cette fonctionnalité, abstenez-vous de votre formule:

WeaponModifier = Weapondamage - 1
FinalWeaponDamage = WeaponDamage + Rand (- WeaponModifier, 0.0)

Et ensuite changer votre déclaration "FinalDamage" par "FinalWeaponDamage"

FinalDamage = Damage + FinalWeaponDamage
NOTE: Dans cette formule, si une cible a plus d'armure que de dégâts potentiels créés, la cible ne pourra pas être blessée, alors assurez-vous  de bien définir le niveau d'armure et les dégâts d'arme dans la GUE. Dans la prochaine étape on ajoutera le facteur critical hit pour outrepasser ce système de variable d'armure.


Dernière édition par Giuliani le Dim 31 Aoû - 1:26, édité 1 fois
avatar
Giuliani
Admin

Messages : 210
Points : 349
Date d'inscription : 25/06/2014
Age : 38
Localisation : Toulouse

http://realmcrafter.frbb.net

Revenir en haut Aller en bas

Re: [TUTO] Script de combat personnalisé [5/11]

Message par Giuliani le Dim 31 Aoû - 1:25

PART 5: COUP CRITIQUE.

Ce système sera complétement distinct de notre formule principale, et il utilisera différents facteurs pour déterminer les chances de faire un coup critique, Chance que la cible bloque, Dégâts potentiels du joueur, et d'autres variables modifiables.Nous avons besoin de déclarer différents attributs pour les utiliser dans un système séparé.

Vous pourrez si vous le souhaitez le déclarer dans votre formule principale. Pour ce tuto, je les sépare, ça me permettra de le modifier plus tard sans avoir à tout recalculer pour la formule principale.

On déclare nos nouvelles variables:

PlayerDex = Attribute(Player,"Dexterity")
TargetStrength = Attribute(Target,"Strength")

On peut maintenant déclarer nos variables qui seront la base de notre nouveau systéme en haut avec les autres après FinalDamage:

PlayerCrit = PlayerStrength + PlayerDex
TargetCrit = TargetStrength + TargetDex
PlayerCritRoll = PlayerCrit + Rand (-10, 0)
TargetCritRoll = TargetCrit + Rand (-10, 10)
CritDamage = PlayerStrength + PlayerDex + Rand (-10,10)


On formule maintenant les chance de notre joueur de placer un coup critique contre les chances que la cible esquive, en utilisant une simple structure If/Else au début de la formule:

CritSuccess = 0
If PlayerCritRoll >= TargetCritRoll
CritSuccess = 1
Else CritSuccess = 0
EndIf

Placez ce bloc directement sous vos déclarations. On peut  declarer CritSuccess, on ne l'utilisera qu'ici
Comme nous avons un nouveau dégât potentiel, il faut nous assurer que ce potentiel soit au moins de 0 pour le joueur et la ciblet, directement sous CritSuccess:

If (CritDamage <= 0) ;On s'assure que tout le monde fasse au minimum 0 crit
CritDamage = 0
EndIf
. Maintenant nous créons notre formule, comme nous l'avons fait avec la formule principale


If (CritSuccess > 0)

TargetHealth = TargetHealth - CritDamage

Output(Player, "You Hit For " + CritDamage + " Critical Damage ", 255, 0, 0)
DoEvents (100)
SetAttribute(Target, "Health", TargetHealth)

EndIf


Il s'agit d'un utilitaire séparé pour infliger des dégâts critiques, mais nous voulons intégrer cette déclaration avec un IF dans notre formule principale  hit/miss. Cela garantit que le joueur doit d'abord frapper normalement pour avoir une chance déplacer un coup critique. Si ce bloc avait été intégré en dehors de formule principale de contrôle, un joueur pourrait manquer, et crit en même temps. Cela peut être utile pour certains projets, vous pouvez expérimenter avec certains pour voir les résultats différents.


NOTE: En regardant cette nouvelle formule, vous remarquerez qu'il contourne la valeur de bonus d'armure. C'est une façon utile, mais plus lente, de résoudre les situations où les combattants sont dans l'impasse. Le script est maintenant prêt à faire face à toutes les situations de combat.
avatar
Giuliani
Admin

Messages : 210
Points : 349
Date d'inscription : 25/06/2014
Age : 38
Localisation : Toulouse

http://realmcrafter.frbb.net

Revenir en haut Aller en bas

Re: [TUTO] Script de combat personnalisé [5/11]

Message par Giuliani le Dim 31 Aoû - 1:30

La suite prochainement:

PART 6: MORT et EXPÉRIENCE
PART 7: Ajout de nombres flottants et de particule
PART 8:ANIMATION DES PERSONNAGES
PART 9: ANIMATION ALEATOIRE avec la commande "Select"
PART 10: ANIMATION EN FONCTION DU TYPE D'ARME
PART 11: AJOUT DE bruitages pour le combat

Je verrouille en attendant.


avatar
Giuliani
Admin

Messages : 210
Points : 349
Date d'inscription : 25/06/2014
Age : 38
Localisation : Toulouse

http://realmcrafter.frbb.net

Revenir en haut Aller en bas

Re: [TUTO] Script de combat personnalisé [5/11]

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum