Nous vous présentons maintenant un programme permettant de simuler le déroulement d'un combat entre un personnage et une créature quelconque.
Le résultat ou l'êchec d‘une attaque dont être calcule en fonction des caractéristiques des adversaires. Pour écrire un programme performant, il faut analyser tout ce qui se passe pendant un combar et définir lés caractéristiques des combattants nécéssaires à une bonne simulation:. Cet article vous propose deux systèmes de combat, Le premier est un systéme simple, fourni à titre d'exemple. Le second est un mécafistme de combac plus complexe ec plus réaliste Il est accompagné d'une Inbliothèque d'obpets que vous pourréz utiliser dans vos [anfifilwngfiwnnufiifirnxfi,PnflnmiflnfifitCHETUHE} Systéme de combat de base Le combat s'arrête lôrsqué l’un des déeux adversairés ést morc. Les :rjmhflttanlfl;i sOnt di'fifii.“: BT UTIC L'JFfll:i'LI'Ë l'_'l.'l: IL'I.]T[]!JG.'L! e 'L'-Ë.PË.EEI.É L!L' coups gt un certain nombre de potnts de vie, La capacité de combat est le pourcentage de chance que possede une créature de toucher son adversaire Un combattant de bas niveau péut avoir un pourcentage faible (entre 5% et 15%) alors qu’un combattant de haut niveau ou une créaturé trés purssanté peuvent avoir un pourcentage trés cleve (entre 70% et 90%). Pour savoir s1 uné créature touche son ennemi, il faut tirer un nombre alcatoire compris entre 1 et 100 (avec l'instrucrion RANDOM). 5i ce chiffre est inférieur ou épal à la capacité de combat, l'arraque est réussie. La capacité de coups est le nombre de points de dépâts qu’unée créature peut causer à une autre Un éléphant fait néttement plus de dommages qu'un écureuil, Le nombre de points de vie représente la vigueur d'une créacure et sa capacité à encaisser des coups. Les points de vie diminuent lorsque la OE{rîafi_]]_'ll: Tl:_:l;l!_:lltl: [_].:_‘:E.; F'li:l[]'lT_”'i IÎ.].Ç {ll:_'l'l'r_l mfi.ËLÏ'.:Ë ä. EE :-:.‘uiiu I:I.IL'ITIL' Ei'r'.l:'l.qu.'L'. S'I. ]Ë nombre de pounts de vie tombe à 0, la creature est morte. “ vie perso* Combat perso® * coups persos “ vie creatures : points de vie Perso : capacité de combat Perso : Capacité de coups Perso : Points de vie Créature ' combat creature% : Capacité de combat Créature - coups creature* : Capacite de coups Creatare o0 I &Exxkdbdkbhbiiitittidirkiidtik * * Ferso attaque Créature * L o e e i e e e ol e e ool R o E E IF RANDOM(100)⇐copmebrsaot% SUB vie creatcuouprs épesrs,o® ENDIF EXIT 1F vie creaturess=( L o e ol sl e E o o e o e o e R O Y R
E E e e d e e rrr d de d e SE e SE d d E E E « IF RANDOM(100)⇐combat creature' SUB vie pèrso%,coups creatures ENDIF EXIT IF vie persove=0 LOOP i
DRRE E S e o REN RR RR RE e IF vie_persoi==0 PRINT “PERSD est mort™ ELSE PRINT “CREATURE est mort(e)” ENDTF Système de combat plus évolué Le svstème de combat de base est simple à mettre en céuvré, mais peu performant. Mous vous présentons maintenant un système de combat sophistiqué qui permet de réaliser des combars plus réalistes. Les créatures sont defimes par les caractéristiques suivantes: Porce, Points de vie, Capacité de combat, Nombre d'attaques par round de combat, Compétence de defense, Arme et Protection. ATARI MAGAZINE E BEST OF GRA BASIC Les caractéristiques Points de vie et Capacité de combat ont la même signification que dans le système de combat de base. Le Nombre d'attaques est le nombre de fois qu'un combartant peut attaquer dans le laps de temps d'un round de combat. Une créature faible ne peut attaquer qu‘une fois alors qu'une créature trés puissante peut attaquer de nombreuses fois par tour. Cela dépend de l'entraînement ct de la vitesse de réaction d'un combattant, voire méme de sa structure physique (une pieuvre avec plusieurs beas peut exécuter plusieurs attaques en même remps). La Capacité de défense représente la possibilicé d'éviter une artaque, Cela peut Être dû à une grande agilité, à une petite raille ou à une structure physique particulière (une créaturé faice de brume qui devient solide uniquement au moment de frapper est três difficrle à toucher). Cela peur aussi être le résultat d'un entraînement spécifique : un combattant ayant appris à esquiver ou à parer une attaque peut avoir une honne capacité de défense, La Capacité de coups du système de base est remplacée par les caractéristiques Force et Arme Le programme caleule les points de dommages en tenant compte du type d'arme utilisé et de la force de la créature La caractéristique Protection correspond à uné éventuelle protection corporelle (vêtement solide, armure, écailles, peau épaisse, ete.) Cette protection diminue les dommages reçus en combat, Elle peur même les annuler totalement dans certains cas. Déroulement d'un combat Le combar est divisé en rounds de combat. Pendant un round de combat, les deux combartants frappent l'un après l'autre jusqu'à épuisement de léur nombre d'attaques, Lorsque l’un des adversaires est touché, le programme calcule le nombre de points de dégâts en tenant compre de la force et de l’arme de l'attaquant, ainsi que de la protection portée par la cible. ‘ Le pourcentage de roucher une cible est csleulé en prenant la capacité de combat de l'artaquant et en soustrayant la capacité de défense de la cible, Les désäts sont retirés aux points de vie du combattant touché, Le combar cesse lorsque l'un des deux adversaires est tué c'ecc-d-dire lorsque son nombre de points de vie est égal ou intérieur a0, Conclusion d'un combat À la fin d'un combat, le programme affiche le résulrat. 51 le personnage a gagné, il reçoit le trésor éventuellement possédé par la créature et des points d'expérience. Les points d'expérience Un personnage qui vit de nombreuses aventures acquiert de l’expérience et augmente ses compétences. Pour simuler cela, un personnage victorieux réçoit uñ certain nombre de points d'expérience. Lorsque son total de points dépasse une certaine limite, ses compétences auementent. Le nombre de points réçu dépend de la créature. Vaincre un lapin rapporte peu d'expérience, alors que vaincre un dragon rapporte énormément de points, à condition que le personnage SUFVIVÉ; Programmation du système de combat La première chose à faire avant d'écrire le programme est d'étudier la struéturé des objets stockés en mémoire et de décider de la méthode utilisér pour definir cé ni:-j::'Lî. Ces derniers sont: les armes, les moyens de protection, les trésors, les créatures et le personnage, 1l est très difficile de déterminer les valeurs numériques définissant un objer. La tiche est simplifiée s l'on considère qu'un homme moven posside une base de 10 à toute ces caractéristiques (Force de 10, Intelligence de 10, Vitésse de réaction de 10, 10 Ponts de vie, E!l;'l'..:l Il faut i:nfiuhl'c: caleuler toutes les données du teu en tenant compre de certe base, Par exemple, un chat est nettement moins tort qu’un homme, mais plus qu’un lapin. On dennera 1 de force au lapin et 3 de force au chat. Par contre, un lion est plus fort qu'un hômme On péut ot donner une force de 14, Définition des armes Les armes sont des objets qui servent à causer des dégâts physiques sur une cible quelconque (un être vivant le plus souvent). Les dommages causés dans un combat comportent un élément aléatoire, Une épée peut tout aussi bien prévoquér une blessure mineure qu'une blessure grave én frappant un organe vital. Pour simuler cela, 1l faut faire la distinction entre les dommages constants et les dommages varaibles, Une arme est définie par un nom, un dommage constant et un dommage variable, Par exemple, une épée cause 2 points de dommage constant et 3 points de dommage variable Un coup d'épée peut donc causer entre 2 (2+1) er 5 (2+3) points de dommage. Cela donne une moyenne de 4 points de dommage. La valeur des points de dommage a été définie en tenant compte qu'un homme moyen possède 10 points de vie, Les noms des armes sont stockés dans le tableau nom arme${(n#). Les dommages constants sont mémorisés dans le rableau def_arme%{ n%,1} et les variables dans le rableau def armes(n5,2}. DIM nom arme$(100) DIM def arme*(100,2) ' def arme%(n,l) = dégât constant arme n ' def arme%{n,2) = dégät variable arme n La définition des armes est faite dans des lignes de DATA. Elles sont définies sous la forme numéro, “nom”, dommage constant, dommage variable. La donnée numéro est le numéro de référence de l'arme. Par exemple, le nom de l'arme 12 est stocké dans le tableau nom arme$(12), le dommage constant dans def arme“(12,1) et le démiage variable dans def arme=(12,2}. I E E e e e e e d de d de d d e é u cd d e d d E * * DEFINITION DES ARMES # i RU LUE ÉTETÉETTETANÉTEÉEFETTE ‘DATA numéro, *nom”, dommage constant, dommage variable armes_data: DATA 1,“GRIFFES”.2.2 DATA 2,“CROCS”,2,3 DATA 3,“MORSURES EMPOISONNES®,1,5 DATA 3,”TENTACULES*,1,4 | ATARI MAGAZINE m BEST OF GFA RASIC
‘ i
DATA 4, SOUFFLE DE FEU*,30,40 1 BATA 10,“COUTEAU” 0,2 BATA: 11, “EPEE”,2,3 ¥ BATA 12, “EPEE LONGUE”,2,4 DATA 13, “MASSE”,2,3 DATA 14, “HACHE”,2.,2 DATA 15,“HACHE DE GUERRE”,2.4 DATA 16, “FLEAU®,3,3 DATA 17,”LANC,E1,*4 DATA 18, “CIMETERE”,2,4 L DATA -1 Ces lignes contiennent quélques exemples d'armes classiques dans un environnement médiéval-fantéstique, Les premières sont des armes naturelles utilisées par deverses creatures. Les suivantes sont des armes manufacturées utilisées par des êtres Intelligents comme les humains et les créatures plus où moins exotiques habitant les univers fantastiques forques, elfes, nains, gobeling, évc.) La procédure @init armes lit les informations stockées dans les lignes de DATA et les accumule dans les tableaux nom arme${) ct def arme=(). Elle doir être appelée en début de programme. PROCEDURE init armes LOCAL noms LOCAL degat constants LOCAL degat variable* LOCAL n= RESTORE armes data ARRAYFILL def arme%().0 0 READ n= EXIT IF m===l READ nom$ READ degat constants READ degat variabiés nom_a(rn%)m =enosm$ def arme%(n%,1)=degat constant* def arme%(n#,2)=degat variable% LOOP RETURN La procédure Odommagea rme(num arme=) calculé le dommage causé par l'arme num_armes, Les dommages variables sont calculés par la formule RANDOM{(prob degat%+1). Fourquat cette formule? Parce qué RANDO(nM) fournit un nombre aléatoire compris encre D'ern-L Pour cbtenir un nombre aléatoire compris entre O ec n, il faut utiliser la formule RANOOM(n#1}, L gk ok e o e RE A É R E E A E N O e e u e R V PR RE * # CALCUL DOMMAGE ARME num armet * 1 'l.“.l.”.i:'.'r'.'u“.t:'rtt'fl:*'fl::‘rfb:‘rtt*tt:‘r:‘:*:':t#r'i:'.'.“.'.‘'.':'.': FUNCTION dommage arme{num armes) LOCAL dégat constants LOCAL prob degat* LOCAL degat variables degat constaanrmte%(%nu=m adrmee&,f1l} prob degati=def arme“(num arme#,2) degat variable%*=RANDOdMe(gpatrio+1b) RETURN degat constant%+degat variable* ENOFUNC Les protections Les protections sont des vêtements ou des armures portés par les créatures du jen, Elles assurent une foncrion défénsive. En terme de jeu, elles diminuenc les dommages reçus par leurs utilisaléurs. Une protection est définié par un nom et une valeur de protection. Pour simplifier la programmation, la valeur de protection est cons lante Toutefois, vous pouvez modifiér lé programme pour obtenir uné protection variable, DIM nom protection$(100) DIM def protection%(100) ! def protections(n#) = nom protection n% ' def protection%{n%) = valeur protection n% Les protections sont définies dans des lignes de DATA. La liste suivante comprénd de nombreux exemplés de protection. La valeur -l ést l'indicareur de fin de donnees. '
' # DEFINITION DES PROTECTIONS * U e ol e i rr e e v de o e rrr d de e e v ok oy e i e r ce protections data: DATA 1,”FOURRURE“,1 DATA 2,”FOURRURE EPALSSE“,Z DATA 3,”ECAILLES“,2 DATA 4,”PLAQUES D'0S“,4 DATA 5,”PEAU DE DRAGON“,50 DATA 6, PEAU DE DEMONT1,0 DATA 20,”HABITS DE MENDIANTL“Û DATA 21,”HABITS DE COLPORTELR“,0 DATA 22,”VETEMENTS ORDINAIRE“,O DATA 23,”YETEMENTS DE CUIR“,] DATA 24,”ROBE DE PRETRE™.O DATA 25,“HABITS DE NOBLE”,D DATA 26, “VETEMENTS DE MARCHAND®,0 UATA 27, “ROBE MAGIQU,E4 DATA 40, “ARMURE DE CUIR”,2 DATA 41,”COTTE DE MAILLES®,3 DATA 42,”ARMURE DE PLAQUES“,4 DATA 43, “ARMURE DRACOMIQ* ,U 3E0 DATA 44, “ARMURE CHAOTIQUE”1*0,0 DATA -1 La procédure @init protections change les données scockées en DATA dans les tableaux nom protection$() ct def protectiont(). ATARI MAGAZINME m BEST OF GFA BASIC PROCEDURE init protections LOCAL nomé LOCAL protects LOCAL n% RESTORE protections data ARRAYFILL def protecti on=(),0 DO READ n EXIT 1F m==l READ nom$ READ protect= nom protect ion${n)=nom$ def protéctiont(n&)=protect® OGP RETURN La fonction Evaleur protection(objet®) fournit le nombre de points de protection fournis par l'objer objet*. E E ETE E R A NN W Rc t e e de dn d 4 E E E E E E RE E E E ' % VALEUR DE FROTECTION D'UN OBJET =
FUNCTION valeur protection{objet*) RETURN üüf_prutüctiünë{nbjetäj ENDFUNC Au niveau rechnique, elle se contente de renvoyer la valeur de la variable def protection&(objet*). Cela peut paraître stupide d'écrire une fonction pour une opération aussi simple, mais cela permet d'obrenir une interface entre le programmé et les données indépendantes de la technique urilisée pour stocker les données. 5i vous modifiez la structure de stockage’ des protections, 1l suffira dé maoditier la fonction @valeur protection sans toucher au reste du programme pour que tout continue de fonétionner normalement. Les trésors Certaines créatures intelligentes peuvent posséder des objets pré cieux, 5i le personnage les tie, 1l récupère cès objets, Dans un but de simplification, le programme ne gére que la description des trésors. Elles sont stockées dans le tableau nom tresor$(). DIM nom tresor$(1060) Les descriprions des trésors sont définies dans des lignes de DATA Elles sont stockees sous la forme numéro trésor, “description””. Le numéro -1 correspond 4 la [in de donnges. D AR AR AR A EE LA A AT LT TR A h T, “ * DEFINITIONS DES TRESORS ”
' DATA =1 = fin des trésors treanraudata: DATA 1,”QUELQUES PIECES DE CUIVRES” DATA 2,“QUELQUES PIECES D'OR® DATA 3,”DES CENTAINES DE PIECES D'OR“ DATA 4,”UN TRESOR FABULEUX“ DATA -1 La procédure Binit tresors initialise le tabléau nom tresor$() avec la description des trésors stoclcéés en DATA. PROCEQURE init tresers LOCAL nfl-:,treslurfu' RESTORE tresors data [0 READ MUNF EXIT 1F nums==1 READ tresor$ dom tresor$ (num#)=tresorh OGP RETURN Il est 'Lmru::ss':hï-r-. de creer une fonction Bdescription tresor (tresor*) renvoyant la description du trésor tresor® car le GFA Base n'admer pas les fonctions renvoyant une variable alphanumérique, FUNCTION description tresor(tresor) RETURM nom tresor$(tresor*) ENCIFUNEC Certe fonction provoque l'apparition d'un message d'erreur RETURN sans PROCEDURE La raison pour laquelle le système affiche un pareil message d'erreur n'est pas évident à première vuc, Etant donné que la syntaxe du GEA Basic ne comprend pas l'instruction RETURN suivie d'une variable alphanumérique, l'interpréteur pense que le RETURN est la fin d'une procédure, Et comme i1l ne trouve pas l'instruction PROCEDURE correspondant à RETURN {puisque c'est une FUNCTTON), il affiche un message d'erreur. Pour écrire une routine renvoyant la description d'un trésor, 1 faut utiliser l'instruction VAR qui permet de modifier la valeur d'un paramétré d’une procédure. PROCEDURE d&äcrîptîDn_treaür{trEEÜT%,FAH tresor$) tresor$=nom tresor$(tresor*) RETURN Pour écrire la descriprion du trésor numéro 2 dans là variable d$, 1l faut utiliser la formule Gdescription tresor(Z,d$}. 1R T R E TIR D R E TR -* \AFFICHAGE- TRESOR 2 * OURUR RERFEER RR A @descri ptiun_’_cr&su'rl[E ,d5) FRINT d$ Définition des créatures Les créatures sont définies par un nom, une Force, un nombre de Points de vie, une Capacité de combat, un Nembre d'attaques, une ATART MAGAZIME m BEST OF GFA BASIC Capacité de défense, un numéro d'arme, un numero de protection, un nombré dé-points d'expérience et un numtéro de crésor, Le nom dés. créatures est stocké dans le tablean nom creatured() et les caractéristiques dans le tableau def creature*(). DIM nom creature$(100) DIM def creature=(100,9) I ‘ def créatures(n#,1l) = Force ‘ def creature%(n#,2) = points de vie &ef_cre&tur&%[n%.äj = Capacité de Combat def creature=(n*,4) = Nb attaques def creature%(n*,5) = Capacité de défense def creature%(n%,6) = Numêro arme def creature“(n&,7) = Numéro Protection def creature%(n#,8) = Points expérience ‘ def creature%{n*,9) = Type de trésor Les caractéristiques des créatures sont stockees dans des lignes de DATA Chaque créature possède un numéro de référence. Les créacures 1 a 19 sont des animaux. Les créatures 20 à 49 sont des créatures intelli gentes. Les créarures 30 a 100 sont des créatures surnaturelles ou extrémemeént puissantes. Tous les numeéros de référence ne sont pas arrcibués, Il reste de le place pour vos propres monstres. Remarque, s1 une créature ne possède pas de trésor, sa caractéristique trésor contient la valeur 0. RR e e o o b e o e e e b R NN SE ” * DEFINITION DES CHEATURES * 1 B g e B s B B - B i i 3 e e e i R DATA Numéro, “Nom”, Force, Points de vie DATA Combat (%), Nb attaques, Défense (%) DATA Arme, Pratecltion DATA Points d'expériences, Trésaor “ DATA -1 = fin des créaturés creaturés data: I NHVÉREEEAAAAE c18 (B | L
* FORCE:18; VIE:30 * COMBAT:68%; — ATTAQUE:2; DEFENSE:50%; ARME-Griffes: PROTECTION:Fourrure épaissé EXP:1000; TRESOR:Aucun DATA 1,”OURS“, 18,30 DATA 68,2,50 DATA 1,7 DATA 1000, 0
L % 9. LOUP CRIS *
FORCE:13; \ VIEz12 * COMBAT:B0%: ATTAQUE:1l; DEFENSE:d40% ARME:Crocs: PROTECTION:Fourrure épaissé EXP-Z00; TRESOR:Autun DATA Z, 'LOUP GRIS*,13,12 DATA 80,1,40 DATA 2,7 DATA 200,0 LR b Lok o g * 335ERPENT -* TIR e e e FORCE+10: YIE:1B COMBAT:60%; ATTAQUE:1; DEFENSE:30 ARME :Morsure; PROTECTION:Fcailles; * EXP-400: TRESOR:Aucun DATA 3,”SERPENT“,10,16 DATA 60,1,30 DATA 3.3 DATA 400, 0 L o o b o T R T T b Ak R R e o e e i B * * 20 : BARBARE DU DESERT * D p e d R e d r d E FORCE:14; FOINTS DE VIE:13 ! COMBAT - 603 ATTAQUE+2+ DEFENSE:35 ARME:Cimeterre; PROTECTION:Armure de cuir * EXP:800; TRESOR:Moyen DATA 20,”BARBARE DU DESERT“,14,13 DATA 60,2,35 DATA 18,40 DATA B0Û, 2 L p E # 215 QROUE” o dede ke de ok & NN N W FORCE:13; POINTS DE VIE:14 COMBAT:62; ATTAQUE:1; DEFENSE:S50% ARME :Masse; PRflTEETIDH:HrmurE_dE cuir * EXP:150; TRESOR:Faible DATA 21,”OROUE“,13,14 DATA 62,1,50 DATA 13,40 DATA 150,1 I gktttRR ' Æ 22: ELFE NDIR * l gl ol ol e e e ey R R o FORCE:12: POINTS DE VIE:16 COMBAT:90% ATTAQUE:3; DEFENSE:50 * ARME:Epée longue; PROTECTION:Armure de plaques ” EXP:2000; TRESOR:Moyen DATA #2,“ELFE NQIR”,12,16 DATA 90,3,50 DATA 12,42 DATA 2000,2 I ko g ok o S E o A R W W ATAR| MAGAZIME E BEST OF GFA BASIC “* 50: DEMON * RU ÉT R AN A FORCE:20:; POINTS DE VIE:50 COMBAT:90; ATTAQUE:5; DEFENSE:80 ARME-Griffes; PROTECTION:Feau de démon ! EXP-10000; TRESOR:Aucun DATA 50,”DEMON“ , 20,50 DATA 90,5,80 DATA 1,6 DATA 10000,0 I Fdxxdttithraextihl
ÉURRRERAEÉTERERRX FORCE: 30 POINTS DE VIE:500 COMBAT:100 ATTAQUE:10 DEFENSE:90 ARME:Souffle de feu; PROTECTION: Feau de Dragon ' EXP:90000; TRESOR: Fabuleux - c DATA 51, “DRAGON” 30,500 DATA 100,10,90 DATA 4,5 DATA 90000,4 DATA -1 La procédure Cinit creatures remplit le tableau def creaturek () avec les créatures définies dans les lignes de DATA, PROCEDURE init crealures LOCAL n%,nom$, force*,points vie% LOCAL combat®,nb attaques“,defénsé# LOCAL arme%,protection& LOCAL experiences, Lresor® RESTORE creatures data D READ n EXIT IF n%=-1 READ nomt READ force* READ points vie* READ combat* READ nb attaquess READ defenses READ armes READ protéction= READ experiance READ tresors num_;reaturui{nêjwnnmî def creature%(n%,1)=forces def creature=(n%,2)=poivnitcsk def creature“(n‘,3)=combat# def creature“{n&,4)=nb attaqués* def creature%(n%,5)=defenses def creature%(n*,6)-armes def creature%(n#,7)=protectioné def creature*%(n#,8)=experience* def creature=(n%,9)=trésors LOOP RETURN Les fonctions suivantes permettent au programme d'obtemir des informacions sur vne créature sans s'occuper de la structure de stockage des données, Elles simplifient la programmation éc augmentent la FUNCTION force creature({creatures) RETURN def creature%(creature*,1) ENDFUNC FUNCT ION vîe_cre&ture[creatureä] , RETURN def creature%{creaturey,?2) ENDFUNC FUNCTION combat creature(creature*) RETURN def creatures(creatures3,) ENCEUNC FUNCTION nb attaques creature(creature*) RETURN def creature*(creature%,4) ENDFUNC FUNCTION defense creature{creature*) RETURN def creature%(creature*,5) ENDFUMNC FUNCTION arme creature(creatured) RETURN def creature%(creature=,b) ENDFUNC FUNCTION protection creature(creature%) RETURN OEef_;reature%[Ereature%,?] ‘ ENDFUNC ä FUNCTION experience creature(creature®) RETURN def creatureX(creature%,8) ENDFUNC = FUNCTION tresor creature(creature*) RETURN def creature%(creature%,9) ENDFUNT Définition du personnage Le personnage est péré d'uné manière lépérement différente de celle des créatures, Î possède une donné supplémentaire: le nombre de points de vie temporaire, Ces points de vie diminuent lorsque le personnage reçoit un coup dans un combat. 5i le nombre de points de vic temporaire tombe 4 0, le personnage est mort. Les créatures ne possédent pas de points de vie temporaires car leurs caractéristiques sont informatives, Lorsque le programme doir gérer un combar entre le personnage et une créaturé, il récopie dans une ATAR| MAGAZINE m BEST OF GFA BASIC variable spéciale le nombre de points de vie de la créatute et décrémente cette variable lorsque la créiture reçoit un coup. Ce système évite de modifier la valeur des caractéristiques stockées en mémoire, Si le personnage rencontre un loup peu de remps après avoir tué Un premier loup, les caractéristiques du second doivent être identiques à celles du premier (et tout particulièrement le nombre de points de vie). Le nom du personnage est stocké dans la variable nom persob. Les caractéristiques sont stockées dans le tableau def perso¥(). La caractéristique Expérience correspond au nombre de points d'expé rence accumulé par le personnage lors de ses affrontements. Elle vaut C au débue du programme. nom perso$=”“ DIM def perso=(9) ‘ def perso%(1) = Force def perso%(2} = Points de vie max def perso%(3) = Points de vie temporaire def perso%(4) = Compétence de combat (%) def perso®(5) = Nb attagues def persot(6) - Compétence de défense (%) def perso%(7) = Expérience » def perso%(8) = Arme def perso&(9) = Protection - Les statistiques du personnage sont définies dans des lignes de DATA. Etant donné le peric nombre de caractéristiques, elles auraient pu être écrites directement dans les variables concernées, mais c'ost une métheode de programmation à éviter. ! DATA Nom, Force, Foints de vié DATA Combat (%), Nb'attaques, Défense (%) DATA Arme, Protection nom: KURT BRISE-CRANE FORCE:13; VIE:15; COMBAT:70%; ATTAQUE:1; DEFENSE:bD% ARME-EPEE LONGUE; Protection: COTTE DE MAILLES - perso data: DATA “KURT BRESE-CRANE”.13,13 DATA 701,60 DATA 12,41 La procédure @init_perso initialise la variable nom_perso} et le tableau def perso®() avec les informations définissant le personnage. PROCEDURE init perso LOCAL nomt, force*,points vies LOCAL combat&,nb _attaques®,defenses LOCAL armes,protectionk RESTORE perso data 1 READ nom$ READ forces READ poînts vies READ combat* READ nb attaques= READ defenses READ arme* READ protéctions nom pérsos=nom$ def persos(1)“force* def perso®%(2)=points vieq def perso%(3)=points_vie% def perso=(4)=combat® def perso®(5)=nb_attaques* def perso%{6)=defenses def perso(7)=0 def perso%(8)=arme% def perso#(9)=protection* RETURN Les fonctions suivantes permettent au programme d'accéder facilement aux données définissant le personnage. De la même manière que les foncrions d'informations sur les créatures, elles permettent d'accéder aux informations du personnage sans rien connaïtre de léurs structures de stockape. FUNCTION force perso RETURN def persox(1) ! ENDFLUNC FUNCTION vie max perso RETURN def perso%(2) ENDFUNG FUNCTION vie perso RETURN def perso%(3) ENDEUNL FUNCTION Combat persa RETURN def persos(4) ENDFUNE FUMÉTION nb attaques perso RETURN def perso%(5) ENDFUNEC FUNCTION defense perso RETURN üeî_perâü%[fi} ENDFUNC FUNCTION experience perso RETURN def persoë(7) ENDFUNE FURCTION arme perso RETURN def perso%(8) ENDFLINC FUNCTION protection perso ATARI MAGAZINE H BEST OF GFA BASIC RETURN def perso%(9) ENDFUNC Bonus aux dommages Un homme fort fait plus de dégâts avéc une épée qu'un fréle garçon utilisant la même arme. Les dégâts supplémentaires viennent de la différence de force entre l'homme ct le garçon. Pour sumuler Peffer de la force sur les dommages, le programme calcule le dommage d'une attaque en additionnant le dommage de l'arme et une valeur appelé «bonus de forces. Le bonus de force dépend de la force de l'attaquant. Plus un personnage est fort, plus son bonus de dommage est important. De la même manière, plus un personnage est faible, moins son bonus de Force est élevé. Une créature vraiment faible peut même avoir un bonus de dommage négatf, La mamere la plus simple de gérer les bonus de force est de les stocker dans le tableau bonus dommage%{}. Pour connaître le bonus de force de la Torce f%, il suffir de lire la valeur de bonus dommage={f#). DIM bonus dommages{30) La valeur des bonus est stockée dans des liemes de DATA. Les bonus ont été établis en tenant compte qu'un homme avéc une foice de 10 tl'a aucun bonus, Is sont définis sous la forme «Force/Bonuss. La valeur -1 est l'indicateur de fin de données. 51 vous voulez étendre | table de bonus au-delà de 30, i1 faut augmenter la taille du tableau bonus donmage*(). bonus dommages data: DATA 1,=6, 2,-4, 3,=-3, 42 51 DAEN 61 i By 8L / 1F0 DATA EE.0x - 2. B3, 18474 1655 DATA 16,4, 17,5, 18,6, 19,7, 206 DATA: 2105 22 dd, 2311, C les 79577 DATA 26,14, 27,15, 28,1k, 29,17, 30,19 DATA =1 Binit bonus charge les bonus dans le tableau bonus dommages (). PROCEDURE init bonus LOCAL n%, bonus% ARRAYFILL bonus dommage#(},0 RESTORE bonus dommages data DD READ n* EXIT IF n%==1 READ bonuss bonus dommage* (n#)=bonus® LODP RETURN La lonction @bonus force(force®) fournit le bonus de force cor respondant à la force force*, ( E d e RE É E e e ETE e e e e e e e e e e E S - % MALEUR DU BONUS DE FORCE * I UTVARINÉTÉEETTEEÉTÉÉA TR TUR RRÉE FUNCTION bonus force(force*) RETURM bonus dommage*(force=) ENDFUNC Initialisation des données du programme La procédure Ginit datas inittalise les rableaux de données avec la définition des différents objers du jou (armes, protéctions, trésors, etc.) Elle doit impérativement être appelée en debut de programme. PROCEDURE init datas Pinit armes Binit protections Binit trésors Binit bonus Vinit perso GInit creatures RETURN Exécution d'un combat Pour exécuter un combat, le programme a bésoin de connaître le type de la créature affrontant le personnage et son nombre de points dé vie La procédure @exec combat{creatures) simule un combar entre le personnage et une créature de type creature. Le type de créature est stocke dans la variable gluh;ale typ ennemis et son nembre de points de vic dans la vartable globale vie ennemi%, Dés que l'un des combattants est mort, la routine Gexec combat aifiche le résultat du combar, Si le personnage est vivant, elle affiche le nombre de points de vie rescant, le nombre de points d'expérience gagnés ot le type de trésor éventuellement possédé par la créature. PROCEDURE exec combat(creature*) LOCAL m£ LOCAL tresors LOCAL tresorf LOCAL exp# typ ennemi%=creatures vie ennemis=@vie creature(creature*) Ecombat ÎF @mort ennemi=l m$=nom créature${typ ennemi#) m$=m$+” est mort” FRINT PRINT m£ _ tresor*=-Étresor creature(typ ennemi*) exp4+-Hexperience creature(typ ennemi*) IF trésor&e>û @Éeacriutiün_treaur{treaurä,trüäürfil PRINT “TRESOR : ”;tresors ENDIF PRINT “EXFERTENCE : “zexp® PRINT “Points de vie perso : ”; ATAR| MAGAZIME W BEST OF GFRA BASIC == —_d' i PRINT @vie perso: “Ry é Mmax perso PRINT ENDIF IF @mort perso=l PRINT PRINT nom persof+” est mort” ENDIF RETURN La fonction @morl ennemi reste st l'adversaire du personnage est mort en regardant la valeur contenue dans la variable vie _ ennemi*, Elle renvoie 1 si l'adversaire est mort ct O dans le cas contraire.
“ % TEST SI L'ADVERSAIRE DU PERSD EST MORT * I kR R E R AN e R Ry ARtk d e e e e e RE AW FUNCTION mort ennemi LOCAL resul t® LF vie ennemiz⇐{ result#=] ELSE result==0 ENDIF RETURN results ENDFUNC La fonétion émort_perso teste si le personnage est mort. Elle utilise la routine @vie perso pour connaître le nombre de points de vié| restant du personnage. Elle retourne 1 si le personnage est mort et 0 dans le cas contraire. Vg g o v e o e or oo o ok o ok e e e i R RRN e RR ” % TEST SI LE PERSONNAGE EST MORT * L T E B 1 I i o be r e e e “ e r e e d FUNCTION mort perso LOCAL résult* IF @vie perso⇐0 result#=1 ELSE resull#=[ ENDIF RETURN resutl% ENDEUNEC Gestion du combat La procédure @combät gére l’enchaïnement des rounds de combat. La procédure @round combat simule Pexécution d'un round. Le combar ne s’arrête que lorsque l’un des combattants est mort. L dc d é d E R E A P R RESRE SE t ! # o GESTION DU COMBAT #* L E E E e E E R R E e dc d uE PROCEDURE combat DD @round combat CAIT IF Émort perso=1 EXIT IF @mort ennemi=l LGOP RETURN Exécution d'un round de combat La procédure Oround combat gère l'exécution d'un round de combat, Les adversaires frappent les uns apris les aucres jusqu'à épuisement de leur nombre d'attaques. Le combat cesse immiédiarement st l'un des combattants meurt. La routine lit le nombre d'arraque de chaque combattant, puis les exécute à la suite, La variable nb_att perso® contient le nombre d'attaques du personnage, Le nombre d'atraques de son adversaire st stocké dans la variable nb att ennemi*% Le conrenu de ces variables est cdécrémenté après chaque artaque.
! * EXECUTION D'UN ROUND DE COMBAT * P REREÉÉPERRERERR RRN E A A E E PROCEDURE round combat LOCAL nb att persox LOCAL nb att ennemi% nb att perso%=Enb attaques perso nb att ennemi$=@nb attaques creature(typ ennemi%) REFPEAT IF nb att persos⇐0 Gattaque ennemi DEC nb att persos ENDIF EXIT IF @mort ennemi=l IF nb att_ennemis==0 Pattaque perso DEC mo att ennemi= ENDIF EXIT IF Bmort perso=l UNTIL (nb att perso%=0} AND (nb_att ennemi%=0) RETURN La routine Ground combat utilisé la fonction @nb attaque perso pour connaître le nombre d'artaques du personnage. Cetté fonchion assuré l'interfäce entre le programme et une des informations definissant lé pérsonnagé, La routine Qattaque ennemi simule une attraqué du joueur contre son adversaire, La routine daitaque perso simule une attaque de l'ennemi concre le personnage. Le personnage attaque son adversaire La procédure @attaque ennemi gére l'attaque du personnage contre son ennemi, La probabilité que le personnage couche son adversaire est la compétence de combat du personnage diminuée de la compétence de défense de l'ennemi, Si la probabilité dé toucher est ATARI MAGAZINE D0 BESTOFGFA BASIC trop faible, elle est ajustée à 5% afin qu’un combattant trop faible aie quand même une chance de roucher son adversaire (même si célui<i est une créature fabuleusément puissante). D B I e 0 o U S e e d d E ! * LE PERSONNAGE ATTAQUE #* b SÛN ENNEMI % I WA E ik s & o o RR R TR PROCEDURE attaque ennemi LOCAL combat perso% LOCAL defense creatures LOCAL pourcentages LOCAL mb
combat perso%=@combat perso defenae_treature%-@defenae_creature{typ_ennemi%] pourcentage%*=combat perso%-defense creature* IF pourcentage*=<5 pourcentage*%=5 ENDIF IF (RANDOM(100)+1)⇐pourcentages dommage“=Édommage creature(num _ ennemi#) IF dommagete=0 SUE vie ennemi®, dommage* mÿ=nom creaturet(typ_ennemi %) mé=m$+” reçoit “+STR}{dommage*) mi=mi+” points de dommage“ PRINT m ENDIF ENDIF RETURN Si l’ennemi est touché, le programme affiche le nombre de points de dégâts. Le programme teste la valeur des dommages pour éviter d'affichér un dommage de 0 point de décâr. Cela peut arriver s une créature dotéé d'une forte protection reçoit un coup faible (par exemple un coup de canif contre une armure de plagues). Calcul des dommages causés par le personnage La fonction @dommage creature calcule les dégâts fait par le jouèur à son ennemi. Ils sont égaux aux dommages causés par l'arme du personnage, plus le bonus de force du personnage, moins la protect- lfll'l'l_ dfi ]”-!:n:ru:mi- Dans certains cas de figure, le dommage peut être négatif, Cela peut notament arriver avec une arme faible et une grosse valeur dé protecton. Pour éviter cela, les dépâts négatits sont automatiquement ajustés à 0. FUNCTION dommage creature(creatures} LOCAL force* LOCAL arme LOCAL dommages: LOCAL protections force*=Pforce perso arme*=Carme perso protect{on%=@protection creature(creatures) dommage%-Édommaargmee [armes) ADD dommage%,@bonus force{forces) SUB dommage%,Bvaleur prôtection({protections) IF dommage*=<i - dommage*=û ENOIF RETURN dommage* ENDFUNC L'adversaire attaque le personnage La procédure Pattaque perso gère l'attaque de l'ennemi contre le personnage. Elle fonctionne de la même manière que la procédure Battague ennemi & céci que l'attaquant et le défenseur sont in- F VErSCS
°* L'ENNEMI typ creatures * “ * ATTAQUE LE PERSONNAGE ™
PROCEDURE attaque perso LOCAL combat ennemis LOCAL defense perso® LOCAL pourcentage* combat ennemi*=Éécombat creature(typ_ennemi*) defense perso*-Édefense creature(typ_ennemi*) pourcentage%=combat ennemi%-defense persos L} 1F pourcentages<s pourcentage*=5 ENDIF 1F (RANDOM(100)+1)⇐pourcentage* dommage*=Édommage perso{typ ennemi=} IF dommages==0 @Eec_vie_persn[duwwmge%} m$=nom perso$+” perd “4STR4 {dommage* } m£=m{+” points de vie.“ PRINT mi ENDIF ENDIF RETURN Certe routine affiche le nombre de points de dégats encaissés par le persontage quand i1l ést touché Un test sur cette valeur evite d'affrcher un dommage de 0 point. La procédure @dec vie perso(dommage&) permet de gérer facile ment la perte de poinrs de vie du personnage. ÉATAR| MAGAZINE W BEST OF GFA BASIC Calcul des dommages recus par le personnage La fonction @dommage perso(creatures) calcule les dommages causés par la créature crealuret contré le personnage. Leur valeur est calculée en fonetion de l'arme et du bonus de force de la créature Le dommage est diminué de la valeur de prorection du personnage. Le principe de fonctionnement est le même que celui de la procédure dommage crealure(creatures).
' * CALCUL DU DOMMAGE FAIT PAR LA CREATURE o ! * creatureñ AU PERSONNAGE s
FUNCTION dommage perso(creature) LOCAL forces LOCAL armet LOCAL dommages LOCAL protections * forcet=Gforce creature(creature*) armes=Garme creature(creature) protections=Cprotection perso doimage*=Bdommage arme(arme*) ADD dommage&, @honus force(force) SUB dommages @valeur protection(protections) IF dommage=<l dommage*%=0 ENDIF RETURN dommages ENDFUNC Certe routine utilise la fonction Évaleur protection(protection%) qui permer de connaître le nombre de points de protection assuré par l'objet protections. Les éventuels dommages négatifs sont autômatiquement remis à 0. ' Perte des points de vie du personnage Ia fonction êdec vie perso(n#) diminue les points de vie temporaires du personnage, Le nombre de points de vie temporaire ne peuvent descendre en-dessous de 0. PROCEDURE dec vie perso(n*) SUB def persof(3),n% IF def perso%{3)=<0 def perso%{3)-0 ENDIF RETURN Augmentation des points de vie du personnage Là procédure inc vie perso(n%) augmente le nombre de pounrs de vie temporaire de n& points. Elle effectue un test pour s'assurer que le nombre de points ne dépassé pas le nombre de points maximum du personnage. PROCEDURE inc vie perso{n%) ADD def perso%(3),n% IF def perso%(3)>0vie max perso def perso%(3)=@vie max perso ENDIF RETURN Soins médicoux Après avoir perdu des points de vie dans un combat, le personnage peut se rendre chez un soigneur pour reprendre des forces. Afin de simuler les aléas de la réalité le personnage ne récupère pas un nombre fixe de points de vie, mais vn nombre déterminé avec une formule aléatoire. Un soin permer de récupérer 3 points de vie au minimum & 6 points au maximuni. Le titage se fait avec l'instruetion RANCOM(4)+3. La formule RANDOM(4) fournit un nombre aléatoire compris entre Ü et 3, PROCEDURE soins perso LOCAL soins% [F @vie perso=Ëvie max perso PRINT “Pas bésoin de soins” ELSE soins*=RANDOM(4]+3 IF (Bvie perso+soinsk)=@vie max perso s0ins%=0vie max pérso-évie perso ENDIF @inc_vie perso(soins®) PRINT “Le personnage récupére ; PRINT STRÿ(soïns*); PRINT ” points de vie.” PRINT “Points de vie perso : ”; PRINT @viep erso;“/”:Bvie_pmerasxo ENDEF FRINT RETLIRN La procédure Bsoins perso soigne le personnage et affiche le résultat des soins. Le programme ajuste le nombre de points de soins de manière à ne pas dépasser le nombre de points de vie maximal. Les jeux de rôle micro offrent divers méthodes de soins : sorts de guérison, potions magiques de soins, guérisseurs, herbes médicinales, ete, Ces méthodes fonctionnent toute de la même manière, c'ést-é<di re en augmentant lé nombre de points de vie, Mais ils peuvent varier au niveau de Pefficacité, du prix et de la disponibilité Pour varier les plaisirs, vous pouvez introduire dans votre jeu des soins particuliers permettant de guérir des maux spécifiques (por sons, maladies, malédictions, etc.) ATARI MAGAZIME H BEST OF GFA BASIC Structure du programme complet La srrucrure du programme complet est la suivante : RESERVE 100000 * Déclaration des tableaux Binit datas Emain END ' Code procédure main ' Codes des procédures du programme ' Definition des données en DATA La procédure principale La procédure @maîn est une procédure de test qui vous permet de tester le système de combat. C’est une routine 'minimum' qui simule le programme de jeu de rôle appelant le gestionnaire de combat. PROCEQURE main LOCAL c$,creat% D PRINT “C)ombat” PRINT “S)oins perso” PRINT “F)in combat” LY cH=INKEYS ch=lPPER${(ch}) EXIT IF (c$=“C”) OR (c$=“5”) OR (ch~“F”) LODP SELECT cf CASE “CM, “c* INEUT “Muméro créature ” ,creat= PRINT Bexec combat(creat*) CASE ||–5l.'|!|I5II @soins perso ENDSELECT EXIT IF (c$=“F”) OR (c$=”{”) EXIT IF Émort perso LOOF RETURN Améliorations du programme Le système de combat peut être amélioré de nombreuses manières. -Vous pouvez rajouter une caracteristique D'externite ct faire en sorte que la créature ayant la plus forte dextérité frappe en premier. Le personnage peéur affronter plusieurs ennemis à la fois. Les modifi- La psychologie des creatures du jeu est trés sumple puisqu'elles combattent jusqu'à la mort. Ce n'est pas tres realiste. Les créatures devraient avoir la possibilité de fuir lorsqu'elles commencent à perdre possibilité de rompre le combat. La visualisation des combars est sommaire, Îl est possible d'ajouter des messages supplémentairafeisn de rendre les combats plus réalistes. Aver bmaucoup de travail, vous pouvez réaliser une visualisation graphique des combats. Les listes d'objets (armes, protections, trésors ec creatures) ne sont pas longues. Il peut être amusant de définir de nouvelles armes et de riouvelles créatures, 51 vous nous cnvoyez des listes incéressantes, nous les mettrons en téléchargement sur le serveur 3615 ATARL