Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Script de Respawn avec Constit' -1
Script de Respawn avec Constit' -1
Par Cassin le 27/9/2002 à 11:26:09 (#2241853)
J'en avais déjà parlé je crois, afin de limiter le "je fonce dans le tas et je respawne si je crève" que font les joueurs, je voudrais inclure une lourde pénalité à un joueur utilisant cette fonction plutôt que de se servir du bouton Save Game... :D
Je voudrais tout simplement retirer au joueur qui respawne un pt de constit'. Carrément... :ange:
Pour ça je voulais utiliser EFFECT_DECREASE_ABILITY (ou un truc de ce genre-là ;) ) mais on m'avait fait remarqué que ça ne serait pas "définitif".
Suite à quelques suggestions, j'ai créé un Creature Item (donc invisible au joueur) avec ce malus de constit', et je l'ai collé à la fin du script de respawn de Bioware (au niveau de la ligne /do nothing).
Bon, je n'ai pas pu tester si ça marche (je sais pas pourquoi, ma version du bureau plante quand je lance le jeu (hein, comment ça j'ai rien de mieux à faire ? :D )), mais j'entrevois déjà un problème : comment faire pour que ces items "s'empilent" ?
Y'a-t-il un moyen d'augmenter le malus de l'objet, ou bien je dois créer une 10aine d'objets de ce type (puisque le malus max est de -10) et faire un script à rallonge qui comptera le nombre de fois que le joueur respawn pour lui donner l'objet correspondant ? (là j'ose même pas imaginer comment je vais galérer... :confus: )
Par Tyn' le 27/9/2002 à 12:36:34 (#2242420)
pas daccord
Par Lys le 27/9/2002 à 12:56:48 (#2242548)
un joueur qui save game ne jouera pas forcement meux et ne sera pas obligé d'assumer son echec, il recommence et c'est tout.
Tandis qu'un joueur qui respawn pert de l' exp et 10% d'or ce qui peu a peu le force/forme a mieux jouer.
Cela reste mon avis, et je serais curieuse de savoir si il etait possible techniquement de supprimer les savegame.
Notre maitre de jeu (blam pour pas le citer) a trouvé une chose marrante qui gène le savegame en solo. Un hackpak qui rends les sauvegardes "corrompues".
A bientot
On m'a volé ma reponse :)
Par Blam le 27/9/2002 à 13:08:33 (#2242641)
que j'ai pas trouvé une solution avec le hackpak qui pourri les save (de jeu seulement, pas des perso) mais que je m'en sert en attendant une vraie solution.
Donc je pose la question clairement:
Peut on empecher les sauvegardes de partie dans les scenario solo ?
Tout en gardant une sauvegarde lorsque l'on quitte.
Par Cassin le 13/10/2002 à 0:06:19 (#2325548)
J'ai donc réussis à faire ce que je voulais : modifier le script de respawn afin de téléporter le joueur dans un temple en le laissant à 1PV.
Hors je voudrais qu'à partir d'un certain moment du jeu, lorsque le joueur récupère une arme, s'il meurt il ne soit plus téléporté au temple (et pour cause puisque celui-ci est sensé être détruit ;) ) et donc appliquer la pénalité de constit de -1.
J'ai une variable qui s'initialise lorsque je récupère l'arme en question, mais j'ai beaucoup de mal à me débrouiller avec les if et autres else, comment puis-je faire pour appliquer la pénalité en annulant la téléportation ?
De même, je ne vois pas comment faire pour supprimer une "peau" avec une constit' de -1 pour mettre à la place une peau avec une constit' de -2 et ainsi de suite jusqu'à -10 au fur et à mesure des morts ?
Par Jedaï le 13/10/2002 à 1:48:15 (#2325881)
void main()
{
if (!GetLocalInt(OBJECT_SELF, "nA_L_Arme"))
{
Respawn normal : retour au temple, etc...
}
else
{
Respawn après : résurrect sur place mise en place des token -1 constits :
object oRez = GetLastRespawnButtonPresser();
int nNbRez = GetLocalInt(oRez, "nNbRez");
nNbRez++;
if (nNbRez <=10)
{
DestroyObject(GetItemInSlot(INVENTORY_SLOT_CARMOUR, oRez));
object oPenRez = CreateItemOnObject("objpenrez"+IntToString(nNbRez), oRez);
AssignCommand(oRez, ActionEquipItem(oPenRez, INVENTORY_SLOT_CARMOUR));
SetLocalInt(oRez, "nNbRez", nNbRez);
}
}
}
Voilà je croit que ça marchera, pourvu qu'évidemment vous ayez donné comme BLUEPRINT à vos objets qui pénalisent : objpenrez1, objpenrez2, objpenrez3, etc... jusqu'à 10.
Je n'ai mis que la structure générale du script et la partie qui permet la mise en place du script, le reste est facile.
Par Cassin le 13/10/2002 à 11:34:27 (#2326774)
J'ai modifié quelques paramètres afin de coller à ce que j'avais déjà fait dans le module, ctd changer le nom de la variable "nA_L_Arme" en "get_armeMGK", et j'ai également changé "objpenrez"+IntToString(nNbRez), oRez en "constit"+IntToString(nNbRez), oRez, puisque mes objets "peau" s'appellent (de tag ET de ResRef) constit1, constit2, constit3 etc...
Et le script ne se compile pas !
J'ai une ERREUR : INCORRECT VARIABLE STATE LEFT ON STACK à la ligne 194 (la dernière quoi, le } ). Donc je me suis dis, c'est une fermeture de paranthèse en plus ou en moins, j'ai donc supprimé celle-ci pour voir (j'ai mis // devant) : ERREUR : UNKNOWN STATE IN COMPILER à la ligne 195... ligne qui n'existe pas puisque la dernière était la 194 !
Je comprend pas trop là...
Par Jedaï le 13/10/2002 à 14:14:01 (#2327592)
void main()
{
if (!GetLocalInt(OBJECT_SELF, "nA_L_Arme"))
{
//Respawn normal : retour au temple, etc...
}
else
{
//Respawn après : résurrect sur place mise en place des token -1 constits :
object oRez = GetLastRespawnButtonPresser();
int nNbRez = GetLocalInt(oRez, "nNbRez");
nNbRez++;
if (nNbRez <=10)
{
DestroyObject(GetItemInSlot(INVENTORY_SLOT_CARMOUR, oRez));
object oPenRez = CreateItemOnObject("objpenrez"+IntToString(nNbRez), oRez);
AssignCommand(oRez, ActionEquipItem(oPenRez, INVENTORY_SLOT_CARMOUR));
SetLocalInt(oRez, "nNbRez", nNbRez);
}
}
}
Donc cette erreur doit venir de ce que tu auras mis à la place des commentaires, si tu montrais ton script, on comprendrai peut-être mieux.
Pour les lignes au-delà des lignes, c'est souvent dû à des problèmes d'includes, sinon je vois pas :confus:
Par Cassin le 13/10/2002 à 22:34:18 (#2330393)
Je te mets la totale parce que là je vois pas ://::///////////////////////////////////////////////
//:: Generic On Pressed Respawn Button
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
// * June 1: moved RestoreEffects into plot include
*/
//:://////////////////////////////////////////////
//:: Created By: Brent
//:: Created On: November
//:://////////////////////////////////////////////
#include "nw_i0_plot"
// * Applies an XP and GP penalty
// * to the player respawning
void ApplyPenalty(object oDead)
{
// int nXP = GetXP(oDead);
// int nPenalty = 50 * GetHitDice(oDead);
// int nHD = GetHitDice(oDead);
// * You can not lose a level with this respawning
// int nMin = ((nHD * (nHD - 1)) / 2) * 1000;
// int nNewXP = nXP - nPenalty;
// if (nNewXP 10000)
// {
// nGoldToTake = 10000;
// }
// AssignCommand(oDead, TakeGoldFromCreature(nGoldToTake, oDead, TRUE));
// DelayCommand(4.0, FloatingTextStrRefOnCreature(58299, oDead, FALSE));
// DelayCommand(4.8, FloatingTextStrRefOnCreature(58300, oDead, FALSE));
}
///////////////////////////////////////////////////////////////////////
// this function resets variabls and clears the arenas in the fighter
// 'gauntlet' subplot in chapter one
///////////////////////////////////////////////////////////////////////
void ClearArena(object oPC,string sArena)
{
if(sArena == "Map_M1S4C")
{
DestroyObject(GetObjectByTag("M1S04CHRUSK02"));
DestroyObject(GetObjectByTag("M1S4CBeast"));
SetLocalInt(GetObjectByTag(sArena),"NW_A_M1S4HruskDef",0);
}
else if(sArena == "Map_M1S4D")
{
DestroyObject(GetObjectByTag("M1S04CFASHI02"));
DestroyObject(GetObjectByTag("M1S4DBeast"));
SetLocalInt(GetObjectByTag(sArena),"NW_A_M1S4FashiDef",0);
CreateItemOnObject("M1S04IBADGELVL01",oPC);
}
else if(sArena == "Map_M1S4E")
{
DestroyObject(GetObjectByTag("M1S04CAGAR02"));
DestroyObject(GetObjectByTag("M1S4EBeast"));
SetLocalInt(GetObjectByTag(sArena),"NW_A_M1S4AgarDef",0);
CreateItemOnObject("M1S04IBADGELVL02",oPC);
}
else if(sArena == "Map_M1S4F")
{
DestroyObject(GetObjectByTag("M1S04CCLAUDUS02"));
DestroyObject(GetObjectByTag("M1S4FBeast",0));
DestroyObject(GetObjectByTag("M1S4FBeast",1));
SetLocalInt(GetObjectByTag(sArena),"NW_A_M1S4ClaudusDef",0);
CreateItemOnObject("M1S04IBADGELVL03",oPC);
}
SetLocalInt(oPC,"NW_L_M1S4Won",FALSE);
SetLocalInt(GetModule(),"NW_G_" + sArena + "_Occupied",FALSE);
}
//////////////////////////////////////////////////////////////////////////////
void main()
{
object oRespawner = GetLastRespawnButtonPresser();
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oRespawner);
// ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oRespawner)), oRespawner);
// RemoveEffects(oRespawner);
if (!GetLocalInt(OBJECT_SELF, "nA_L_Arme"))
//* Return PC to temple
string sDestTag = "NW_DEATH_TEMPLE";
string sArea = GetTag(GetArea(oRespawner));
/*
CHAPTER 1 SPECIAL CASE
*/
if (sArea == "MAP_M1S3B")
{
sDestTag = "M1_WIZSPAWN";
}
else
if (sArea == "Map_M1S4E" || sArea == "Map_M1S4C" || sArea == "Map_M1S4D" || sArea == "Map_M1S4F")
{
sDestTag = "M1_FIGSPAWN";
ClearArena(oRespawner,sArea);
}
else
/*
CHAPTER 2 SPECIAL CASE
*/
/*
if (sArea == "MAP_M2Q2F2" && GetDistanceBetweenLocations(GetLocation(GetObjectByTag("M2Q2F2_M2Q2G")), GetLocation(oRespawner)) < 5.0 && GetLocalInt(GetModule(),"NW_M2Q2E_WoodsFreed") == 0)
{
sDestTag = "WP_M2Q2GtoM2Q2F";
}
else
*/
// * Druid Match
if (sArea == "MAP_M2Q2E2")
{
sDestTag = "WP_M2Q2E_ENDDCC";
DestroyObject(GetObjectByTag("M2Q2EWELCARFT"));
DestroyObject(GetObjectByTag("M2Q2EHENNAFT"));
DestroyObject(GetObjectByTag("M2Q2EJANKENFT"));
DestroyObject(GetObjectByTag("M2Q2EELGARFT"));
// * June 2002: Destroy pets as well
DestroyObject(GetObjectByTag("M2Q2EWELCARFTPET"));
DestroyObject(GetObjectByTag("M2Q2EHENNAFTPET"));
DestroyObject(GetObjectByTag("M2Q2EJANKENFTPET"));
DestroyObject(GetObjectByTag("M2Q2EELGARFTPET"));
SetLocalInt(GetObjectByTag("M2Q2EJAER"),"NW_M2Q2E_LFIGHT",FALSE);
}
/*
CHAPTER 3 SPECIAL CASE
*/
else
// * time travel dungeon past - Dungeon
if (sArea == "M3Q2G")
{
sDestTag = "WP_ALTERNATE_SPWN";
}
// * time travel dungeon past - Grove
else
if (sArea == "M3Q2I")
{
sDestTag = "WP_ALTERNATE_SPWN";
}
if (GetIsObjectValid(GetObjectByTag(sDestTag)))
{
if (sDestTag == "NW_DEATH_TEMPLE")
{
object oPriest = GetObjectByTag("NW_DEATH_CLERIC");
//SetLocalInt(oPriest, "NW_L_SAYONELINER", 10);
//AssignCommand(oPriest, DelayCommand(3.0,ActionStartConversation(oRespawner)));
AssignCommand(oPriest, DelayCommand(2.1, PlayVoiceChat(VOICE_CHAT_TALKTOME, oPriest)));
SetLocalLocation(oRespawner, "NW_L_I_DIED_HERE", GetLocation(GetLastRespawnButtonPresser()));
SetLocalInt(oRespawner, "NW_L_I_DIED", 1);
SetLocalObject(oPriest, "NW_L_LASTDIED", GetLastRespawnButtonPresser());
// * April 2002: Moved penalty here, only when going back to the death temple
ApplyPenalty(oRespawner);
}
object oSpawnPoint = GetObjectByTag(sDestTag);
SetLocalInt (oRespawner, "mort", 1);
AssignCommand(oRespawner,JumpToLocation(GetLocation(oSpawnPoint)));
// * mak
}
else
{
//Respawn après : résurrect sur place mise en place des token -1 constits :
object oRez = GetLastRespawnButtonPresser();
int nNbRez = GetLocalInt(oRez, "nNbRez");
nNbRez++;
if (nNbRez <=10)
{
DestroyObject(GetItemInSlot(INVENTORY_SLOT_CARMOUR, oRez));
object oPenRez = CreateItemOnObject("objpenrez"+IntToString(nNbRez), oRez);
AssignCommand(oRez, ActionEquipItem(oPenRez, INVENTORY_SLOT_CARMOUR));
SetLocalInt(oRez, "nNbRez", nNbRez);
}
}
}
Par Cassin le 14/10/2002 à 17:25:01 (#2334376)
Par Tyn' le 14/10/2002 à 17:35:39 (#2334439)
if (!GetLocalInt(OBJECT_SELF, "nA_L_Arme"))
Elle semble être un résidu de programmation anterieure, et c'est elle qui empèche le script de se compiler ;)
Par Cassin le 14/10/2002 à 17:41:53 (#2334484)
Mais ça me met sur la piste, je vais chercher par là ;)
Par Tyn' le 14/10/2002 à 17:51:41 (#2334568)
//::///////////////////////////////////////////////
//:: Generic On Pressed Respawn Button
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
// * June 1: moved RestoreEffects into plot include
*/
//:://////////////////////////////////////////////
//:: Created By: Brent
//:: Created On: November
//:: Updated By: Tynril, pour Cassin
//:: Updated On: 14/10/2002
//:://////////////////////////////////////////////
#include "nw_i0_plot"
void main()
{
object oRespawner = GetLastRespawnButtonPresser();
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oRespawner);
if (!GetLocalInt(/*OBJECT_SELF*/GetModule(), "nA_L_Arme"))//:: On ne peut pas utiliser OBJECT_SELF dans un script lie au module
{
if (GetIsObjectValid(GetObjectByTag("NW_DEATH_TEMPLE"))) //:: Tu peux probablement virer ce test, puisque NW_DEATH_TEMPLE n'existe pas dans ton module.
{
object oPriest = GetObjectByTag("NW_DEATH_CLERIC");
AssignCommand(oPriest, DelayCommand(2.1, PlayVoiceChat(VOICE_CHAT_TALKTOME, oPriest)));
SetLocalLocation(oRespawner, "NW_L_I_DIED_HERE", GetLocation(GetLastRespawnButtonPresser()));
SetLocalInt(oRespawner, "NW_L_I_DIED", 1);
SetLocalObject(oPriest, "NW_L_LASTDIED", GetLastRespawnButtonPresser());
object oSpawnPoint = GetObjectByTag("NW_DEATH_TEMPLE");
SetLocalInt (oRespawner, "mort", 1); //::Attention, cette variable ne serait jamais modifiee, car NW_DEATH_TEMPLE n'existe pas dans ton module
AssignCommand(oRespawner,JumpToLocation(GetLocation(oSpawnPoint)));
// * mak
}else{
//Respawn après : résurrect sur place mise en place des token -1 constits :
object oRez = GetLastRespawnButtonPresser();
int nNbRez = GetLocalInt(oRez, "nNbRez");
nNbRez++;
if (nNbRez <=10)
{
DestroyObject(GetItemInSlot(INVENTORY_SLOT_CARMOUR, oRez));
object oPenRez = CreateItemOnObject("objpenrez"+IntToString(nNbRez), oRez);
AssignCommand(oRez, ActionEquipItem(oPenRez, INVENTORY_SLOT_CARMOUR));
SetLocalInt(oRez, "nNbRez", nNbRez);
}
}
}else{
//La variable nA_L_Arme est vraie.
}
}
Par Jedaï le 14/10/2002 à 18:00:06 (#2334649)
#include "nw_i0_plot"
void main()
{
object oRespawner = GetLastRespawnButtonPresser();
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oRespawner);
if (!GetLocalInt(GetModule(), "nA_L_Arme"))
{
string sDestTag = "NW_DEATH_TEMPLE";
if (GetIsObjectValid(GetObjectByTag(sDestTag)))
{
if (sDestTag == "NW_DEATH_TEMPLE")
{
object oPriest = GetObjectByTag("NW_DEATH_CLERIC");
AssignCommand(oPriest, DelayCommand(2.1, PlayVoiceChat(VOICE_CHAT_TALKTOME, oPriest)));
SetLocalLocation(oRespawner, "NW_L_I_DIED_HERE", GetLocation(GetLastRespawnButtonPresser()));
SetLocalInt(oRespawner, "NW_L_I_DIED", 1);
SetLocalObject(oPriest, "NW_L_LASTDIED", GetLastRespawnButtonPresser());
}
object oSpawnPoint = GetObjectByTag(sDestTag);
SetLocalInt (oRespawner, "mort", 1);
AssignCommand(oRespawner,JumpToLocation(GetLocation(oSpawnPoint)));
// * mak
}
}
else
{
//Respawn après : résurrect sur place mise en place des token -1 constits :
object oRez = GetLastRespawnButtonPresser();
int nNbRez = GetLocalInt(oRez, "nNbRez");
nNbRez++;
if (nNbRez <=10)
{
DestroyObject(GetItemInSlot(INVENTORY_SLOT_CARMOUR, oRez));
object oPenRez = CreateItemOnObject("objpenrez"+IntToString(nNbRez), oRez);
AssignCommand(oRez, ActionEquipItem(oPenRez, INVENTORY_SLOT_CARMOUR));
SetLocalInt(oRez, "nNbRez", nNbRez);
}
}
}
[EDIT]
Ce tyn' est toujours plus rapide :eek:
Par Tyn' le 14/10/2002 à 18:10:31 (#2334753)
[EDIT]
Ce tyn' est toujours plus rapide :eek: Désolé, je te jure que je fais pas exprès... :rolleyes::ange:
Par Cassin le 14/10/2002 à 20:33:03 (#2335662)
Donc tout d'abord, merci d'avoir nettoyé le script, en effet ça commençait à être le bordel ;)
Alors... le script se compilait mais ne marchait pas bien, arme ou pas arme, j'étais expédié au temple à ma mort...
J'ai mis près d'une demi-heure à m'apercevoir que si je disais de vérifier la variable... je ne lui disait pas "== 0" ! :hardos:
Bref, ensuite, ça marchait, une fois avec l'arme je ne retournais plus au temple. Surprise, une phrase s'affiche : "objet obtenu : constit1" (OK), puis "Impossible d'utiliser un objet non-identifié"... :hardos: :hardos:
Nouveau retour sous l'éditeur pour corriger ça, je relance, le premier objet marche imppec, 2ème mort... Le premier objet s'enlève bien mais pas le 2ème...
Re-retour sous l'éditeur pour m'apercevoir que les RefRes suivants n'étaient pas "constit2, 3, etc...", mais "002, 003..."... :hardos: :hardos: :hardos:
Je recorrige, je relance... Cette fois ça marchait. (ouf ! ;) ) Mais je me suis aperçus que j'avais enlevé les lignes qui redonnaient tous les PV au joueur lorsqu'il était téléporté au temple (il y arrivait à 1PV), et donc ça arrivait que le perso meurt deux fois de suite à cause d'un trop gros coup dans la tronche ! :D
Enfin bref, ayé, ça marche tout comme je veux, mais ce fut laborieux !
Donc désolé de vous avoir autant embêté avec ça, et merci à vous deux ! (ça devient une habitude, vous êtes mes Sauveurs ! :mdr: )
PS : Ca intéresse quelqu'un que je mette le script final afin de l'intégrer à la base de donnée de scripts ?
Oui moi ça m'interresse
Par Etienne le 14/10/2002 à 20:41:59 (#2335714)
Par Cassin le 14/10/2002 à 22:52:08 (#2336696)
C'est comme ça que ça marche sur les modules où les sous-races sont gérés (RM pour les drows par exemple, ou dégâts de jour pour les vampires).
Bonsoir à tous
Par Etienne le 20/10/2002 à 20:35:00 (#2370984)
Avez-vous une idée du pourquoi du comment.
MErci d'avance.
Par miriandel le 21/10/2002 à 12:23:51 (#2374068)
Mais je suis bien content de voir que ceux qui veulent faire chier le PJ en bavent sec :)
Youhouhhhhh les gars, c'est un jeu vidéo ici, pas un jeu de table, les PJs meurent parfois, ils vont aimer les warriors d'être à 1 en constit après une semaine, tiens, comme ça va être rp :eek:
Attend, je fais la réponse à votre place "Ah ben y z'on ka faire attention".
Non ?
Ou "Chacun fait kom y veut"
Bah, je vais purger mon ban, à dans dix minutes :aide:
Par eMRaistlin le 21/10/2002 à 12:37:21 (#2374152)
ils vont aimer les warriors d'être à 1 en constit après une semaine, tiens, comme ça va être rp
Et les magos, alors, qui ont le droit qu'a 8 respawn au lieu de 15 ???
EGALITE POUR TOUTES LES CLASSES, MES FRERES... UNISSONS NOUS....
:mdr: :mdr: :mdr: :mdr: :mdr: :mdr: :mdr: :mdr:
Les circonstances.
Par Etienne le 21/10/2002 à 12:41:21 (#2374188)
Cela fait 20 ans que je pratique le JDR. MAis avec le temps, le trvaille, les enfants, la vie quoi, les amis de la noeuille se sont éloignés géographiquement.
Les parties se faisaient avec un rytme plus lent. 5 à 6 fois par ans.
Mais le désir est tojours présent.
Alors on s'est dit avec mes amis qu'avec NWN on allez pouvoir tenter de rejouer plus souvent, une fois par quizaine ou par trois emaines.
Mais on a depuis longtemps abandonner les rêgles de D&D on préfère jouer Chair et sang, plutôt que fraise Tagada. (citation d'un certain AngeGardien). Donc je vais voir jusq'ou on peu aller dans les modifications de NWN afin de retrouiver le plaisir du jeu.
Et puis ne t'en fait pas pour les joueurs, il accepterons un guerrier avec 1 de Constitution, il en accepterons le risque et je ne compte pas faire de la baston permanente.
Voilà, voilà. Mais si je ne peux pas vfaire évoluer NWN j'abandonnerais .
Par eMRaistlin le 21/10/2002 à 12:52:31 (#2374263)
Mais si je ne peux pas vfaire évoluer NWN j'abandonnerais
oO
Bein... c'est chaud la, quand même, de faire plus evolutif que NWN... même si bien sur, il a ses limites ^^ :mdr: :mdr: :mdr: :mdr:
Cassin y es-tu arrivée
Par Etienne le 21/10/2002 à 19:34:41 (#2377364)
Par Cassin le 21/10/2002 à 22:22:54 (#2378639)
Pour justifier mon choix, ben oui, je trouve pas ça très réaliste que le joueur fonce de le tas et meure 36 fois en réssucitant de suite pour avoir à l'usure le vilain méchant en face. Sur table, revenir à la vie coûte cher, et donc là c'est un peu pareil ;)...
Alors voilà ce que je propose dans mon module :
- le joueur est dans un Monastère et reçoit pour mission de retrouver une arme magique dans la forêt proche. Bon. Tant qu'il n'a pas trouvé l'arme, il peut crever autant de fois, à son respawn il est téléporté au temple du monastère avec 1PV et il doit aller voir le guerrisseur avant de repartir à l'assaut.
- une fois l'arme trouvée, le monastère est sensé être détruit, et donc le joueur ne peut plus être téléporté au temple. Et c'est là que ça devient intéressant : si le joueur meurt et respawn, hop!, un pt de constit en moins. Et oui, carrément ! Ca a le mérite de faire réfléchir et à plus utiliser le bouton Save Game / Load Game que Respawn...
(et ça colle plus à une règle de AD&D qui disait qu'on ne pouvait être réssucité qu'autant de fois qu'on avait de pts de constit).
Alors avant tout, créez 10 "objets de créature" de type "peau de créature" ayant chacun comme propriété une pénalité d'un pt de constit' et de blueprint "constit1" ; "constit2" ; "constit3' etc...
(donc l'objet "constit1" avec une pénalité d'un point, l'objet "constit2" avec une pénalité de 2 pts etc... )
SURTOUT n'oubliez pas de cocher la case "Identifié", sinon ça ne marchera pas ! (on ne peut pas utiliser un objet non-identifié !)
Voici donc le script : #include "nw_i0_plot"
void main()
{
object oRespawner = GetLastRespawnButtonPresser();
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oRespawner);
if (!GetLocalInt(GetModule(), "get_armeMGK") == 0) // ici on vérifie si l'arme magique a bien été trouvée
{
string sDestTag = "RespawnPoint"; // ça c'est le tag du waypoint de téléportation, situé dans le temple ; si vous le changez, pensez aussi à le modifier ici...
if (GetIsObjectValid(GetObjectByTag(sDestTag)))
{
if (sDestTag == "RespawnPoint") // ... et ici aussi
{
object oPriest = GetObjectByTag("NW_DEATH_CLERIC");
AssignCommand(oPriest, DelayCommand(2.1, PlayVoiceChat(VOICE_CHAT_TALKTOME, oPriest)));
SetLocalLocation(oRespawner, "NW_L_I_DIED_HERE", GetLocation(GetLastRespawnButtonPresser()));
SetLocalInt(oRespawner, "NW_L_I_DIED", 1);
SetLocalObject(oPriest, "NW_L_LASTDIED", GetLastRespawnButtonPresser());
}
object oSpawnPoint = GetObjectByTag(sDestTag);
SetLocalInt (oRespawner, "mort", 1);
AssignCommand(oRespawner,JumpToLocation(GetLocation(oSpawnPoint)));
// * mak
}
}
else
{
//Respawn après : résurrect sur place mise en place des token -1 constits :
object oRez = GetLastRespawnButtonPresser();
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oRespawner)), oRespawner);
RemoveEffects(oRespawner); // ces 2 lignes soignent le joueur de tous ses maux, chose que le script ne faisait pas en le ramenant dans le temple.
int nNbRez = GetLocalInt(oRez, "nNbRez");
nNbRez++;
if (nNbRez <=10)
{
DestroyObject(GetItemInSlot(INVENTORY_SLOT_CARMOUR, oRez));
object oPenRez = CreateItemOnObject("constit"+IntToString(nNbRez), oRez);
AssignCommand(oRez, ActionEquipItem(oPenRez, INVENTORY_SLOT_CARMOUR));
SetLocalInt(oRez, "nNbRez", nNbRez);
}
}
}
Donc pensez surtout à bien nommer les BLUEPRINTS (et pas les tags) de vos objets de constit correctement, ainsi que le WP du temple si vous en mettez un...
Evidemment si la partie de téléport au temple ne vous intéresse pas, vous pouvez toujours snipper ça dans le script ;)
Encore une fois et comme d'habitude, merci à ceux qui m'ont aidés ! ;)
JOL Archives 1.0.1
@ JOL / JeuxOnLine