COMMENT SUPPRIMER UN KIT À UN PERSONNAGE EN COURS DE PARTIE ?
Tout vient de la description de mon nouveau kit de Chevalier de Diamant :
Pour coller à la description papier, lorsqu'il attend le niveau 10, le paladin doit décider s'il souhaite devenir Chevalier de Diamant.CHEVALIER de DIAMANT : Les Chevaliers de Diamant appartiennent à l'élite des paladins. Détectées dès leur adoubement, leurs qualités martiales et morales sont testées au fil de leur carrière. C'est pourquoi seuls des paladins confirmés, généralement des cavaliers, sont jugés dignes de se voir proposer cette spécialisation. S'ils l'acceptent, toutes leurs caractéristiques et capacités antérieures sont remplacées par des nouvelles.
…
Pré-requis :
- Le paladin doit être de niveau 10 minimum.
…
Si oui, il obtient de nouvelles capacités et des sorts divins qui remplacent les sorts divins classiques des paladins.
Si non, il reste paladin.
Le problème, c'est que les fichiers 2da du kit ne fonctionnent que pour un Chevalier de Diamant, pas pour un paladin et encore moins pour un cavalier, un inquisiteur ou un chasseur de morts-vivants...
Une solution consistait à créer 4 clones des kits vanilla (classique, cavalier, inquisiteur, chasseur de morts-vivants) avec des caractéristiques classiques jusqu'au niveau 10, à provoquer le dialogue au niveau 10, et à modifier son kit selon sa réponse : Chevalier de Diamant ou retour à un kit vanilla classique.
Outre que cette technique est plus que lourde et consomme énormément de ressources inutiles (notamment des slots de kits), elle ne permet ps de régler le cas du paladin classique (qui n'est pas un kit, mais une classe et n’apparaît pas dans les fichiers kit.ids et kitlist.2da.
Et puis voilà, à force de traîner et de poser des questions ici ou là, Jarno a fini par me donner l'embryon d'une piste – en fait une solution qui ne fonctionnait pas, mais qui m'a permis de la développer pour qu'elle marche.
1. Créer un sort qui fixe une variable globale et affecte un script dans le slot RACE du personnage.
Pourquoi le slot RACE ? Parce qu'il n'est pas utilisé par les PJ et les PNJ.
Code : Tout sélectionner
/* ============================================================================================================= *
* INITIALISATION du DIALOGUE lors des CHANGEMENTS de NIVEAU du CHEVALIER de DIAMANT *
* ============================================================================================================= */
/* ------------------------------------------------------ *
* NIVEAU 10 : Décision de devenir Chevalier de Diamant *
* ------------------------------------------------------ */
IF
Class(Myself,PALADIN_ALL)
LevelGT(Myself,9)
LevelLT(Myself,15)
Global("GWCDDIAL","GLOBAL",1) // Valeur de la variable lancée par le sort au niveau 10
Delay(12)
THEN
RESPONSE #100
SetGlobal("GWCDDIAL","GLOBAL",2)
CreateCreatureObject("GWCDDial",Myself,0,0,0)
ActionOverride("GWCDDial",StartDialogNoSet(Myself))
END
2. Prendre une décision grâce au dialogue.
Code : Tout sélectionner
BEGIN GWCDDial
// NIVEAU 10 : Décision de devenir Chevalier de Diamant.
// -----------------------------------------------------
CHAIN IF ~NumTimesTalkedTo(0) Global("GWCDDIAL","GLOBAL",2)~ THEN GWCDDIAL Chevalier_Diamant
@7701001 // ~Souhaitez-vous devenir un Chevalier de Diamant ?~ ~Souhaitez-vous devenir une Chevalière de Diamant ?~
DO ~SetGlobal("GWCDDIAL","GLOBAL",3)~
END
++ @7701002 EXTERN GWCDDIAL Chevalier_Diamant_Oui
++ @7701003 EXTERN GWCDDIAL Chevalier_Diamant_Non
CHAIN GWCDDIAL Chevalier_Diamant_Oui
@7701004 // ~Vos caractéristiques et l'enseignement que vous avez suivi vous autorisent à embrasser cette carrière. Bienvenue dans le cercle très restreint des Chevaliers de Diamant !~
END
IF ~~ THEN DO ~SetGlobal("GWCDDIAL","GLOBAL",4) DestroySelf()~ EXIT
CHAIN GWCDDIAL Chevalier_Diamant_Non
@7701005 // ~En êtes vous certain ?~ ~En êtes vous certaine ?~
END
++ @7701006 EXTERN GWCDDIAL Chevalier_Diamant_Non2 // ~Absolument ! Les dragons, c'est pas mon truc...~
++ @7701007 EXTERN GWCDDIAL Chevalier_Diamant_Oui // ~Tout bien réfléchi... C'est vrai que combattre les dragons, c'est une tâche digne d'un paladin. Finalement, j'accepte !~ ~Tout bien réfléchi... C'est vrai que combattre les dragons, c'est une tâche digne d'une paladine. Finalement, j'accepte !~
CHAIN GWCDDIAL Chevalier_Diamant_Non2
@7701008 // ~C'est votre choix. Faites en sorte de ne pas le regretter car ce genre d'opportunité ne se produit qu'une fois dans une vie. Et vous venez de la laisser passer...~
= @7701009 // ~Souhaitez-vous redevenir paladin ou vous spécialiser ?~
END
++ @7701010 DO ~SetGlobal("GWCDDIAL","GLOBAL",5)~ EXTERN GWCDDIAL Chevalier_Diamant_Non3 // ~Me spécialiser ? Paladin(e) j'étais, paladin(e) je resterai !~
++ @7701011 DO ~SetGlobal("GWCDDIAL","GLOBAL",6)~ EXTERN GWCDDIAL Chevalier_Diamant_Non3 // ~En fait, j'ai toujours rêvé de devenir cavalier(ère).~
++ @7701012 DO ~SetGlobal("GWCDDIAL","GLOBAL",7)~ EXTERN GWCDDIAL Chevalier_Diamant_Non3 // ~Je me suis engagé(e) pour traquer les adeptes de la magie noire et des ténèbres : je veux devenir inquisiteur(trice).~
++ @7701013 DO ~SetGlobal("GWCDDIAL","GLOBAL",8)~ EXTERN GWCDDIAL Chevalier_Diamant_Non3 // ~Oh que oui ! Je veux traquer les morts-vivants et autres engeances de ce type : Je souhaite devenir chasseur(se) de morts-vivants.~
CHAIN GWCDDIAL Chevalier_Diamant_Non3
@7701014 // ~Qu'il en soit ainsi !~
END
IF ~~ THEN DO ~DestroySelf()~ EXIT
3. Traiter les décisions prises dans le dialogue avec le script.
Selon la valeur de la variable GWCDDIAL définie par le dialogue, on applique le bon kit au paladin.
- 4 : Le paladin devient Chevalier de Diamant. ON NE CHANGE RIEN !
- 5 : Le paladin refuse et reste paladin de base : on utilise une astuce.
- 6 : Le paladin refuse et devient cavalier : on lui applique le kit CAVALIER.
- 7 : Le paladin refuse et devient inquisiteur : on lui applique le kit INQUISITOR.
- 8 : Le paladin refuse et devient chasseur de morts-vivants : on lui applique le kit UNDEADHUNTER.
Mais ce n'est pas tout, en cas de refus, on applique un sort qui supprime toutes les scories résiduelles du kit de Chevalier de Diamant. Je l'ai appelé GWCD0000 :
- Il supprime tous les sorts de Chevalier de Diamant obtenus au niveau 10 (sinon, ils restent dans le livre de sorts même après application de la commande AddKit()).
- Il réaffecte au paladin ses sorts divins de niveau 1. Sinon, il faut atteindre le passage au prochain niveau pour les récupérer.
Code : Tout sélectionner
IF
Class(Myself,PALADIN_ALL)
LevelGT(Myself,9)
LevelLT(Myself,15)
Global("GWCDDIAL","GLOBAL",4) // Acceptation du kit
THEN
RESPONSE #100
ChangeAIScript("",RACE)
SetGlobal("GWCDDIAL","GLOBAL",0)
END
IF
Class(Myself,PALADIN_ALL)
LevelGT(Myself,9)
LevelLT(Myself,15)
Global("GWCDDIAL","GLOBAL",5) // Refus du kit : retour au statut de paladin
THEN
RESPONSE #100
SetGlobal("GWCDDIAL","GLOBAL",0)
ReallyForceSpellRES("GWCD0000",Myself)
AddKit(TRUECLASS)
ChangeAIScript("",RACE)
END
IF
Class(Myself,PALADIN_ALL)
LevelGT(Myself,9)
LevelLT(Myself,15)
Global("GWCDDIAL","GLOBAL",6) // Refus du kit : choix du kit Cavalier
THEN
RESPONSE #100
SetInterrupt(FALSE)
SetGlobal("GWCDDIAL","GLOBAL",0)
ReallyForceSpellRES("GWCD0000",Myself)
AddKit(CAVALIER)
ChangeAIScript("",RACE)
SetInterrupt(TRUE)
Continue()
END
IF
Class(Myself,PALADIN_ALL)
LevelGT(Myself,9)
LevelLT(Myself,15)
Global("GWCDDIAL","GLOBAL",7) // Refus du kit : Choix du kit Inquisiteur
THEN
RESPONSE #100
SetInterrupt(FALSE)
SetGlobal("GWCDDIAL","GLOBAL",0)
ReallyForceSpellRES("GWCD0000",Myself)
AddKit(INQUISITOR)
ChangeAIScript("",RACE)
SetInterrupt(TRUE)
Continue()
END
IF
Class(Myself,PALADIN_ALL)
LevelGT(Myself,9)
LevelLT(Myself,15)
Global("GWCDDIAL","GLOBAL",8) // Refus du kit : Choix du kit Chasseur de morts-vivants
THEN
RESPONSE #100
SetInterrupt(FALSE)
SetGlobal("GWCDDIAL","GLOBAL",0)
ReallyForceSpellRES("GWCD0000",Myself)
AddKit(UNDEADHUNTER)
ChangeAIScript("",RACE)
SetInterrupt(TRUE)
Continue()
END
En pratique, ça donne à peu près ceci :
>> Au niveau 9 : Avec ses sorts : Et ses capacités :
>> Au niveau 10, il accepte de devenir Chevalier de Diamant : Avec ses sorts : Et ses capacités :
>> Au niveau 10, il refuse de devenir Chevalier de Diamant et reste paladin : Avec ses sorts : Et ses capacités :
>> Au niveau 10, il refuse de devenir Chevalier de Diamant et devient cavalier : Avec ses sorts : Et ses capacités :
>> Au niveau 10, il refuse de devenir Chevalier de Diamant et devient inquisiteur :
[/IMG]
Avec ses sorts (aucun !) :
[/IMG]
Et ses capacités :
>> Au niveau 10, il refuse de devenir Chevalier de Diamant et devient chasseur de morts-vivants : Avec ses sorts : Et ses capacités :
:!: Seul petit problème : le sort de Guérison des maladies (entouré de rouge) des capacités spéciales ne disparaît pas pendant le passage de niveau. Cependant, il disparaît dès la première utilisation.