I'm currently working on dialogues an d I'm having troubles with scripts not calling the right nodes; this is always related to MVARs, GVARs and LVARS. The script I'm working on at present is as follows:
/*
Mr Mc Cull
*/
/* Include Files */
#include "..\headers\define.h"
#include "..\headers\fltrap.h"
#define NAME SCRIPT_FCMCULL
#include "..\headers\command.h"
/* Standard Script Procedures */
procedure start;
procedure critter_p_proc;
procedure pickup_p_proc;
procedure destroy_p_proc;
procedure use_p_proc;
procedure look_at_p_proc;
procedure description_p_proc;
procedure use_skill_on_p_proc;
procedure use_obj_on_p_proc;
procedure damage_p_proc;
procedure map_enter_p_proc;
procedure map_update_p_proc;
procedure talk_p_proc;
procedure Node001;
procedure Node002;
procedure Node003;
procedure Node004;
procedure Node005;
procedure Node006;
procedure Node007;
procedure Node998;
procedure Node999;
#define LVAR_Warned_Twice (3)
#define LVAR_Herebefore (4)
#define LVAR_Hostile (5)
#define LVAR_Personal_Enemy (6)
variable Only_Once:=0;
import variable TRAP_KNOWN
procedure start begin
end
procedure timed_event_p_proc begin
end
/********************************************************************
********************************************************************/
procedure use_p_proc begin
end
procedure look_at_p_proc begin
script_overrides;
if (local_var(LVAR_Herebefore) == 0) then
display_msg(mstr(100));
else
display_msg(mstr(101));
end
procedure description_p_proc begin
script_overrides;
display_msg(mstr(102));
end
procedure use_skill_on_p_proc begin
end
procedure use_obj_on_p_proc begin
end
procedure damage_p_proc begin
if (source_obj == dude_obj) then begin
set_local_var(LVAR_Personal_Enemy,1);
end
end
procedure map_enter_p_proc beginOnly_Once:=0; critter_add_trait(self_obj,TRAIT_OBJECT,OBJECT_TEAM_NUM,TEAM_LONER);
critter_add_trait(self_obj,TRAIT_OBJECT,OBJECT_AI_PACKET,AI_TOUGH_GUARD);
end
procedure map_update_p_proc begin
end
procedure talk_p_proc begin
start_gdialog(NAME,self_obj,4,-1,-1);
gSay_Start;
/*if ((local_var(LVAR_Herebefore) == 0) and (map_var(MVAR_TRAP_KNOWN) == 0)) then begin
call Node001;
end else if ((local_var(LVAR_Herebefore) == 1) and (map_var(MVAR_TRAP_KNOWN) == 0) then begin
call Node003;
end else if ((local_var(LVAR_Warned_Twice) == 1) and (map_var(MVAR_TRAP_KNOWN) == 0)) then begin
call Node006;
end else if (map_var(MVAR_TRAP_KNOWN) == 1) then begin
call Node007;*/
if ((local_var(LVAR_Herebefore) == 0) and (map_var(MVAR_TRAP_KNOWN) == 0)) then begin
call Node001;
end else if ((local_var(LVAR_Herebefore) == 1) and (map_var(MVAR_TRAP_KNOWN) == 0)) then begin
if ((local_var(LVAR_Herebefore) == 1) and (local_var(LVAR_Warned_Twice) == 0)) then begin
call Node003;
end else if ((local_var(LVAR_Herebefore) == 1) and (local_var(LVAR_Warned_Twice) == 1)) then begin
call Node006;
end else if (map_var(MVAR_TRAP_KNOWN) == 1) then begin
call Node007;
end
end
gSay_End;
end_dialogue;
end
procedure destroy_p_proc begin
inc_evil_critter
end
procedure pickup_p_proc begin
if (source_obj == dude_obj) then begin
set_local_var(LVAR_Hostile,2);
end
end
procedure Node001 begin
set_local_var(LVAR_Herebefore,1);
Reply(103);
NOption(104,Node002,001);
end
procedure Node002 begin
fadeout(3);
move_to(dude_obj,23497,0);
fadein(3);
call node999;
end
procedure Node003 begin
set_local_var(LVAR_Warned_Twice,1);
Reply(105);
NOption(106,Node002,001);
NOption(107,Node004,005);
end
procedure Node004 begin
variable skill;
if (skill_success(dude_obj,SKILL_CONVERSANT,-10)) then begin
script_overrides;
Reply(108);
NOption(109,Node002,001);
end
else call Node005;
end
procedure Node005 begin
Reply(110);
NOption(111,Node998,001);
NOption(118,Node002,001);
end
procedure Node006 begin
set_local_var(LVAR_Personal_Enemy,1);
Reply(112);
NOption(113,Node998,001);
end
procedure Node007 begin
if (local_var(LVAR_Herebefore) == 0) then begin
Reply(114);
NOption(115,Node999,001);
end else if (local_var(LVAR_Herebefore) == 1) then begin
Reply(116);
NOption(117,Node999,001);
end
end
procedure Node998 begin
set_local_var(LVAR_Hostile,2);
end
procedure Node999 begin
end
procedure critter_p_proc begin
if ((local_var(LVAR_Hostile) == 2) and (obj_can_see_obj(self_obj,dude_obj))) then begin
set_local_var(LVAR_Hostile,1);
attack(dude_obj);
end
if ((local_var(LVAR_Personal_Enemy) == 1) and (obj_can_see_obj(self_obj,dude_obj))) then begin
attack(dude_obj);
end
if ((self_can_see_dude) and (local_var(LVAR_Personal_Enemy) == 0)) then begin
dialogue_system_enter;
end
end
You'll notice that there's a commented part in talk_p_proc: this part did not work properly until it met (map_var(MVAR_TRAP_KNOWN) == 1), then it showed the right dialogue lines. The uncommented part works in a reversed way: when it gets the MVAR set to 1 it shows messed dialogue lines (from the script attached to the critter setting the MVAR to 1).
Does a vars hierarchy exist? What am I doing wrong?
EDIT
I'm modding with Celestial's 1.4 patch on. I know it causes several problems but it practically was the most advanced one when I started. Does somebody know if it causes problems with new scripts? If i decide to change patch, would a simple patch overwriting work? (I mean: first install a new patch and then patch everything with my mod.)
/*
Mr Mc Cull
*/
/* Include Files */
#include "..\headers\define.h"
#include "..\headers\fltrap.h"
#define NAME SCRIPT_FCMCULL
#include "..\headers\command.h"
/* Standard Script Procedures */
procedure start;
procedure critter_p_proc;
procedure pickup_p_proc;
procedure destroy_p_proc;
procedure use_p_proc;
procedure look_at_p_proc;
procedure description_p_proc;
procedure use_skill_on_p_proc;
procedure use_obj_on_p_proc;
procedure damage_p_proc;
procedure map_enter_p_proc;
procedure map_update_p_proc;
procedure talk_p_proc;
procedure Node001;
procedure Node002;
procedure Node003;
procedure Node004;
procedure Node005;
procedure Node006;
procedure Node007;
procedure Node998;
procedure Node999;
#define LVAR_Warned_Twice (3)
#define LVAR_Herebefore (4)
#define LVAR_Hostile (5)
#define LVAR_Personal_Enemy (6)
variable Only_Once:=0;
import variable TRAP_KNOWN
procedure start begin
end
procedure timed_event_p_proc begin
end
/********************************************************************
********************************************************************/
procedure use_p_proc begin
end
procedure look_at_p_proc begin
script_overrides;
if (local_var(LVAR_Herebefore) == 0) then
display_msg(mstr(100));
else
display_msg(mstr(101));
end
procedure description_p_proc begin
script_overrides;
display_msg(mstr(102));
end
procedure use_skill_on_p_proc begin
end
procedure use_obj_on_p_proc begin
end
procedure damage_p_proc begin
if (source_obj == dude_obj) then begin
set_local_var(LVAR_Personal_Enemy,1);
end
end
procedure map_enter_p_proc beginOnly_Once:=0; critter_add_trait(self_obj,TRAIT_OBJECT,OBJECT_TEAM_NUM,TEAM_LONER);
critter_add_trait(self_obj,TRAIT_OBJECT,OBJECT_AI_PACKET,AI_TOUGH_GUARD);
end
procedure map_update_p_proc begin
end
procedure talk_p_proc begin
start_gdialog(NAME,self_obj,4,-1,-1);
gSay_Start;
/*if ((local_var(LVAR_Herebefore) == 0) and (map_var(MVAR_TRAP_KNOWN) == 0)) then begin
call Node001;
end else if ((local_var(LVAR_Herebefore) == 1) and (map_var(MVAR_TRAP_KNOWN) == 0) then begin
call Node003;
end else if ((local_var(LVAR_Warned_Twice) == 1) and (map_var(MVAR_TRAP_KNOWN) == 0)) then begin
call Node006;
end else if (map_var(MVAR_TRAP_KNOWN) == 1) then begin
call Node007;*/
if ((local_var(LVAR_Herebefore) == 0) and (map_var(MVAR_TRAP_KNOWN) == 0)) then begin
call Node001;
end else if ((local_var(LVAR_Herebefore) == 1) and (map_var(MVAR_TRAP_KNOWN) == 0)) then begin
if ((local_var(LVAR_Herebefore) == 1) and (local_var(LVAR_Warned_Twice) == 0)) then begin
call Node003;
end else if ((local_var(LVAR_Herebefore) == 1) and (local_var(LVAR_Warned_Twice) == 1)) then begin
call Node006;
end else if (map_var(MVAR_TRAP_KNOWN) == 1) then begin
call Node007;
end
end
gSay_End;
end_dialogue;
end
procedure destroy_p_proc begin
inc_evil_critter
end
procedure pickup_p_proc begin
if (source_obj == dude_obj) then begin
set_local_var(LVAR_Hostile,2);
end
end
procedure Node001 begin
set_local_var(LVAR_Herebefore,1);
Reply(103);
NOption(104,Node002,001);
end
procedure Node002 begin
fadeout(3);
move_to(dude_obj,23497,0);
fadein(3);
call node999;
end
procedure Node003 begin
set_local_var(LVAR_Warned_Twice,1);
Reply(105);
NOption(106,Node002,001);
NOption(107,Node004,005);
end
procedure Node004 begin
variable skill;
if (skill_success(dude_obj,SKILL_CONVERSANT,-10)) then begin
script_overrides;
Reply(108);
NOption(109,Node002,001);
end
else call Node005;
end
procedure Node005 begin
Reply(110);
NOption(111,Node998,001);
NOption(118,Node002,001);
end
procedure Node006 begin
set_local_var(LVAR_Personal_Enemy,1);
Reply(112);
NOption(113,Node998,001);
end
procedure Node007 begin
if (local_var(LVAR_Herebefore) == 0) then begin
Reply(114);
NOption(115,Node999,001);
end else if (local_var(LVAR_Herebefore) == 1) then begin
Reply(116);
NOption(117,Node999,001);
end
end
procedure Node998 begin
set_local_var(LVAR_Hostile,2);
end
procedure Node999 begin
end
procedure critter_p_proc begin
if ((local_var(LVAR_Hostile) == 2) and (obj_can_see_obj(self_obj,dude_obj))) then begin
set_local_var(LVAR_Hostile,1);
attack(dude_obj);
end
if ((local_var(LVAR_Personal_Enemy) == 1) and (obj_can_see_obj(self_obj,dude_obj))) then begin
attack(dude_obj);
end
if ((self_can_see_dude) and (local_var(LVAR_Personal_Enemy) == 0)) then begin
dialogue_system_enter;
end
end
You'll notice that there's a commented part in talk_p_proc: this part did not work properly until it met (map_var(MVAR_TRAP_KNOWN) == 1), then it showed the right dialogue lines. The uncommented part works in a reversed way: when it gets the MVAR set to 1 it shows messed dialogue lines (from the script attached to the critter setting the MVAR to 1).
Does a vars hierarchy exist? What am I doing wrong?
EDIT
I'm modding with Celestial's 1.4 patch on. I know it causes several problems but it practically was the most advanced one when I started. Does somebody know if it causes problems with new scripts? If i decide to change patch, would a simple patch overwriting work? (I mean: first install a new patch and then patch everything with my mod.)