|
xisailuo
������������ �����������: ���. 2004
�����: 19 ���������
|
In my script , there is charactor A and B.A talked to the dude_obj and then dude_obj can talk to the B.There are two results after the talking to the B,and there are differences between the lator talking of the A. So I make an .h file: modbase.h
������:
/* Copyright 1998-2003 Interplay Entertainment Corp. �All rights reserved. */ #ifndef MODBASE_H #define MODBASE_H // Map vars for Arroyo Village Map // Comments //MAP_GLOBAL_VARS: //GLOBAL � � � � � � � � � � � � � � � � � � � �NUMBER // All Map Vars need to start w/ MVAR_ #define MVAR_Talk � � � � � � � (0) #endif // MODBASE_H
and my script file
������: #define NAME � � � � � � � � � �SCRIPT_BASEMM #include "..\headers\define.h" #include "..\headers\ModReact.h" #include "..\headers\command.h" #include "..\headers\ModBase.h" procedure start; procedure talk_p_proc; � procedure old_pickup_p_proc; procedure Node001; procedure Node002; procedure Node003; procedure Node004; procedure Node006; procedure Node008; procedure Node009; procedure node010; procedure node011; procedure node012; procedure node013; procedure node014; procedure Node015; /* Script Specific Procedure Calls */ procedure Node998; procedure Node999; � � � � � � � � � � � � � � � � � � �// This Node is Always Ending procedure start begin set_map_var(MVAR_Talk , 0); end procedure old_pickup_p_proc begin end procedure talk_p_proc begin start_gdialog (NAME,self_obj,4,-1,-1); � � � gSay_Start; � � if (map_var(MVAR_Talk == 0)) then begin � � � � � call Node001; � � set_map_var(MVAR_Talk , 1); � � END � if (map_var(MVAR_Talk == 3)) then begin � � � �call Node011; � � � �end � if (map_var(MVAR_Talk == 4)) then begin � � � � � call Node014; � � � gSay_End; � � � gSay_End; � � � end_dialogue; � � � END � �if (map_var(MVAR_Talk == 1)) then begin float_msg(self_obj, mstr(117), FLOAT_MSG_NORMAL); end end procedure Node001 begin � Reply(100); � NOption(101,Node002,004); � NOption(102,Node002,004); end procedure Node002 begin � Reply(103); � NOption(104,Node003,004); � NOption(mstr(105) + " " + dude_name + mstr(106), Node004, 4); end procedure Node003 begin � Reply(107); � NOption(109,Node006,004); end procedure Node004 begin � Reply(108); � NOption(110,Node006,004); � end procedure Node006 begin variable obj; � obj := obj_carrying_pid_obj(self_obj, PID_MEAT_JERKY �); add_obj_to_inven(dude_obj,obj); �Reply(111); � NOption(113,Node008,004); � NOption(114,Node009,004); end procedure Node008 begin � Reply(115); end procedure Node009 begin � Reply(116); end procedure Node010 begin � Reply(118); � NOption(119,Node011,004); � NOption(120,Node012,004); end procedure Node011 begin � Reply(121); � NOption(123,Node013,004); � NOption(124,Node013,006); end procedure Node012 begin � Reply(122); � NOption(123,Node013,004); � NOption(124,Node013,006); end procedure Node013 begin � Reply(125); end procedure Node014 begin � Reply(126); NOption(127,Node015,004); end procedure Node015 begin � Reply(128); end procedure Node999 begin end procedure Node998 begin end �
when dude_obj have finished talking to the B ,MVAR_Talk==2 I can start dialog, but there is empty ,it seems not use my .msg file or MVAR_talk is error .Can you tell me why?Thank you http://www.zzezz.com/bbs/discuz!/attachments/c5pJ_scr00000.gif (Edited by xisailuo at 20:22 - 19 Sep., 2004)
|
����������: 20:20 - 19 ����., 2004
|
|
Raven
������������
������: ������ �����������: ����. 2004
�����: 408 ���������
|
>Can you tell me why? Yes. Ah, a LOTS of bugs. So, we have MVAR_Talk==2. Look at your talk_p_proc. There is no if-check for MVAR_Talk==2, both no default "else begin"-block. So script don`t call any node - it simply ends talk_p_proc procedure without any action. Why then dialog screen don`t close autmaticaly? Because you place gsay_end and end_dialogue in the if (map_var(MVAR_Talk == 4)) block and script simply ignore them. Second, map_var(MVAR_Talk==x) wouldn`t work at all cause after preprocessor this would be map_var((0)==x) and this don`t make sense. This should be map_var(MVAR_Talk)==x. Third. -------------------------- procedure start begin set_map_var(MVAR_Talk , 0); end -------------------------- This is potential bug. Procedure start called not on the script creation, but before any other procedure in the script (inluding critter_p_proc :-). So in most cases this procedure shouldn`t contain any code. Anyway MVARs always initialize with null. Fourth. ---------------------- if [smthng] then begin call Node00x; [some_code] end ---------------------- It`s a good idea to put [some code] before call operation, because script may be interrupted in some way (i.e. player can press "0" while at that node) and [some code] don`t be executed at all. Fifth. --------------------------------------------------- if (map_var(MVAR_Talk) == 0) then begin �set_map_var(MVAR_Talk , 1); �call Node001; end [some code] if (map_var(MVAR_Talk) == 1) then begin �float_msg(self_obj, mstr(117), FLOAT_MSG_NORMAL); end --------------------------------------------------- MVAR_Talk==0. Script uses first if-block. MVAR_Talk set to 1 and Node001 called. After Node end script returns back to the "end" string. Execute [some code]. And then execute another if-block (because MVAR_Talk is already set to 1 at the first if-block). It seems to me, that this is not what you want. You should use "else" to fix this. Sixth. ------------------- �gSay_End; �gSay_End; ------------------- In much cases this will crash Fallout. Try to use gSay_end/gSay_start and start_gdialog/end_dialogue only once per script cause this wery bugy commands. Not by itself, but they oftenly lead to crashes and locks. Well, finaly your script should be look like this: ------------------------------------------------ <...> procedure start begin end procedure talk_p_proc begin start_gdialog (NAME,self_obj,4,-1,-1); gSay_Start; �if map_var(MVAR_Talk)==0 then begin � set_map_var(MVAR_Talk,1); � call Node001; �end else if map_var(MVAR_Talk)==1 then float_msg(self_obj, mstr(117), FLOAT_MSG_NORMAL); �else if map_var(MVAR_Talk)==2 then begin � [some node-call :-)] �end else if map_var(MVAR_Talk)==3 then call Node011; �else if map_var(MVAR_Talk)==4 then call Node014; �else set_map_var(MVAR_Talk,0); //this should never happen. Just for safe � gSay_End; end_dialogue; end <...> ------------------------------------------------ This, hopefuly, should work :-) If there no other errors :-) � I don`t now that Fallout are somewhat popular at China (or Korea?). ======================================== Addition. Another bug at talk_p_proc :-) You can`t use float_msg while in dialog mode. So if want to show a floater for map_var(MVAR_Talk)==1 , then code for it must be placed before start_gdialog:
���:
procedure talk_p_proc begin if map_var(MVAR_Talk)==1 then float_msg(self_obj, mstr(117), FLOAT_MSG_NORMAL); else begin start_gdialog (NAME,self_obj,4,-1,-1); gSay_Start; if map_var(MVAR_Talk)==0 then begin set_map_var(MVAR_Talk,1); call Node001; end else if map_var(MVAR_Talk)==2 then begin [some node-call :-)] end else if map_var(MVAR_Talk)==3 then call Node011; else if map_var(MVAR_Talk)==4 then call Node014; else set_map_var(MVAR_Talk,0); //this should never happen. Just for safe gSay_End; end_dialogue; end end
(��������������(�) Raven - 11:22 - 21 ����., 2004)
|
����������: 4:12 - 21 ����., 2004
|
|
xisailuo
������������ �����������: ���. 2004
�����: 19 ���������
|
In China, most people do not play fallout , they like RTS ,Online game & Japanese RPG,but Fallout is also popular in some BBS,they think it is great
|
����������: 5:21 - 8 ���., 2004
|
|
|
|