And here's my final bug list (I hope)....
---------
Sierra Army Depot
1. If you enter the Sierra Army Depot for the very first time and manage to reach the security terminal on level 2 without causing any problems, then you get this rather confusing greeting message from the terminal:
Code:
Skynet Security Systems
Warning! Intruder Detected Level 1
Retina Scanner Activated
Scanning
Searching DatabaseGeneral CliftonLast Accessed: December 5, 2120Skynet Security Systems
Warning! Intruder Detected Level
If you had used Corporal Dixon's eyeball on the retinal scanner on level 2, then "General Clifton" above will be replaced with Corporal Dixon instead.
If you exit right away and then try to access the terminal again, you get the following message:
Code:
Skynet Security Systems
Warning! Intruder Detected Level 1
Retina Scanner Activated
Scanning
Searching DatabaseGeneral CliftonLast Accessed: 0 days ago.Skynet Security Systems
Warning! Intruder Detected Level
Needless to say, this is still rather confusing. In fact, there are three issues here:
a) The terminal couldn't have been last accessed in 2120, seeing that the evacuation was in 2077. (It's a bit confusing, but "Last Accessed" refers to the last time the terminal was accessed, not the last time the retina scanner was used.) Changing this to a more appropriate date (say, August 5, 2077) should suffice.
b) The second Skynet Security Systems line is redundant. On looking at the code, originally, the script was supposed to detect which levels of the SAD had the alarm turned on, and then to display the levels here. However, this feature was never fully implemented -- the variable keeping track of alarm states is initiated and parsed, but never appended to the text -- and it is evident that the developers replaced that line with the first Skynet Security Systems line and somehow forgot to remove the second line. This second line should probably be removed, though it may be possible for you to play around with it for the Restoration Project.
c) The text is bunched up...and General Clifton's name looks a bit out of place. There actually is some text in the .msg file that provides the logical links for the reader to understand the context much better, but this was inexplicably left out. This text should probably be put back in.
The fix involves fixing both wsterm2a.ssl and wsterm2a.msg files. In wsterm2a.ssl, the fix is applied to Node002, as thus:
Code:
// Note: lines commented out refer to the unimplemented alarm level notification,
// which in my opinion has been replaced with something simpler. The original code
// left the lines in place since nothing really is displayed, but for simplication
// purposes I've decided to comment them out.
procedure Node002 begin
variable date;
variable who;
variable days_ago;
// variable more_than_one;
// variable security_breach;
if (local_var(LVAR_Last_Used) == 0) then begin
set_local_var(LVAR_Last_Used,GAME_TIME_IN_DAYS);
date:=305; // message_str number
end
else begin
days_ago:=1;
date:=GAME_TIME_IN_DAYS-(local_var(LVAR_Last_Used));
set_local_var(LVAR_Last_Used,GAME_TIME_IN_DAYS);
end
if (map_var(MVAR_Eyeball_Used) == EYEBALL_DIXON) then begin
who:=303;
end
else begin
who:=304;
end
// if (map_var(MVAR_Security_Level_1) == 1) then begin
// security_breach:="1";
// more_than_one:=1;
// end
//
// if (map_var(MVAR_Security_Level_2) == 1) then begin
// if (more_than_one == 1) then
// security_breach+=", 2";
// else
// security_breach+="2";
// more_than_one:=1;
// end
//
// if (map_var(MVAR_Security_Level_3) == 1) then begin
// if (more_than_one == 1) then
// security_breach+=", 3";
// else
// security_breach+="3";
// more_than_one:=1;
// end
//
// if (security_breach) then
// security_breach+=".";
if (days_ago == 0) then
Reply(mstr(113)+mstr(300)+mstr(who)+mstr(301)+mstr(date));
else
Reply(mstr(113)+mstr(300)+mstr(who)+mstr(301)+date+mstr(306));
NOption(115,Node002a,004);
NOption(116,Node012,004);
NOption(117,Node999,004);
NOption(118,Node999,004);
end
As to wsterm2a.msg, fixing and clarifying the following lines should do the trick:
Code:
{113}{}{Skynet Security Systems
Warning! Intruder Detected Level 1
Retina Scanner Activated
Scanning...
Searching Database}
{300}{}{ - ID Confirmed: }
{301}{}{
Terminal Last Accessed: }
{303}{}{Corporal Dixon}
{304}{}{General Clifton}
{305}{}{August 5, 2077}
{306}{}{ days ago.}
Doing both of the above should make the initial greeting text look like this:
Code:
Skynet Security Systems
Warning! Intruder Detected Level 1
Retina Scanner Activated
Scanning...
Searching Database - ID Confirmed: General Clifton
Terminal Last Accessed: August 5, 2077
2. If you open the "Penpal Greetings" e-mail on the Munitions Access Terminal, then the terminal melts down. The shockplates, if they were active, is automatically disabled -- presumably because the controlling computer is destroyed (See Node019 for details). However, any force fields that were active remains active, which is not surprising given that there's no code in place in Node019. This seems a bit inconsistent. The fix is to copy and paste any perma-forcefield disabling code (say, from Node023) into Node019 so that both shockplates and force fields are disabled on a meltdown.
3. If the player agrees to help Skynet, Skynet will tell the player to retrieve a brain from level 4 and then return for "further instructions". However, if the player does that, then all he or she gets is the message: "Error! Downloading file corrupted." Note that it doesn't matter what type of brain the player retrieved. The message is still the same.
If one looks at the .msg file, then it is obvious that there's supposed to be further instructions -- see line 113 of wsterm3b.msg for details. So how come this message is not showing up?
The problem lies in talk_p_proc of wsTerm3b.ssl. The very first conditional is to check if GVAR_SKYNET == Skynet_Brain, and to call Node003 if the conditional is true. Ironically, the exact same conditional
is checked again closer to the end of the procedure, but this time, it calls on Node002 if it's true. Node002 is the node that displays the "further instructions" found in line 113, but obviously, it's quite impossible to reach this part of the script. The simple fix is to change the very first conditional to something more reasonable (i.e. similar to the other terminals), such as:
Code:
if (global_var(GVAR_BRAIN_BOT_BRAIN) != 0) then begin
start_gdialog(NAME,self_obj,4,-1,-1);
gSay_Start;
call Node003;
gSay_End;
end_dialogue;
end
San Francisco
1. In corrections.txt, you state that:
"When one helps the rocket supervisor from Hubologists to retrieve both verti plans and fuel he's all happy. I managed however to copy the plans and steal the fuel for the tanker using Badger's help and he still says that he needs help but no option to grant it is available." This is no longer the case and a new line of dialogue was added to be said by him in this case.
However, this is not the case. In fact, while Harry's .msg file has been updated with the new line, the .int file shipped with the Unofficial Patch is still the same version as the updated file included in the official v1.02D patch. I presume that the changes were in the new .int file but somehow wasn't included with the Unofficial Patch.
The Enclave
1. The computer terminal in the Enclave is a bit bugged. I'll list each of them one by one and try to suggest a suitable solution.
The first bug is a minor continuity bug: if you kill the President and swipe his passkey, but return and active the Counter Insurgency Protocol before blowing up the reactor (i.e. Frank Horrigan hasn't shown up yet), then the terminal will still claim that it has located a target. Hmmm...
The simple solution is to check to is if the reactor has gone offline (global_var(GVAR_ENCLAVE_REACTOR) == ENCLAVE_REACTOR_OFF), and to create some suitable dialog if that is the case. So something like:
Code:
procedure Node021a begin
if (obj_is_carrying_obj_pid(dude_obj,PID_PRES_ACCESS_KEY)) then begin
if (cur_map_index == MAP_ENCLAVE_END_FIGHT) then begin
if (global_var(GVAR_ENCLAVE_REACTOR) == ENCLAVE_REACTOR_OFF) then
call Node022;
else
call Node022a;
end else
call Node023;
end
else
call Node024;
end
procedure Node033 begin
if (cur_map_index == MAP_ENCLAVE_END_FIGHT) then begin
if (global_var(GVAR_ENCLAVE_REACTOR) == ENCLAVE_REACTOR_OFF) then
call Node022;
else
call Node022a;
end else
call Node023;
end
procedure Node022a begin
Reply(266);
CompOption(267,Node004);
if (hacked_system) then
CompOption(268,Node020a);
else
CompOption(268,Node020);
end
Lines 266, 267, and 268 should read something like:
Code:
{266}{}{Presidential Security Passkey recognized. Good day, Mr. President.... Emergency Counter Insurgency Protocol initiated...**Error** Target not found. Please ensure that the sensors are working correctly. If not, please submit form FG-I-106-32-0635 to authorize repair services. Thanks for using another fine Vault-Tec product. Good day.}
{267}{}{(Hmm...Maybe it'll work once there's someone actually there. I'll have to give it a try later.) Return to User ID.}
{268}{}{(I wonder what else I can try?) Back.}
2. If you have high enough science skills to access any account other than Smith, J., but you still elect to log on as Smith, J., then initially, the only option available to you (other than logging off) is "Security Status". After that, though, you will have access to other options as though you have selected whichever ID granted you the highest access!
Another symptom of the same problem, though this is admittedly a much rarer case: if your science skill is below 100, you can still log in as Smith, J. However, despite the terminal stating you have access to the Security Status option, you do not get that option in your choice of responses! In fact, under this scenario you can only choose to log out.
This is what's happening: each option selectable by the user is handled by a different Node (Nodes 009 to 014). However, each node makes a check against the user's science skill to determine which options to display, which only works if the player selected the account with the highest access rights. In the case of science skill below 100, the lowest level option (Security Status) needs a minimal skill of 100 to access, but you do not need any science skill technically speaking in order to log on as Smith, J., leading to the oddity observed.
The fix is to make the check against current userID instead (you will need to create a new variable to keep track of this) and display the options accordingly. So something like the following:
Code:
variable current_userid := 0;
#define NOUSER 0
#define SMITH 1
#define MURRAY 2
#define CURLING 3
#define BIRD 4
procedure Node004 begin
if (local_var(LVAR_Said_4) == 0) then begin
inc_local_var(LVAR_Said_4);
if (dude_iq >= 7) then
Reply(124);
else
Reply(125);
end
else
Reply(126);
current_userid := NOUSER;
CompOption(127,Node008);
CompOption(128,Node020);
if (Science_Skill >= 125) then
CompOption(129,Node005);
if (Science_Skill >= 150) then
CompOption(130,Node006);
if (Science_Skill >= 175) then
CompOption(131,Node007);
CompOption(132,NodeEnd);
end
procedure Node005 begin
Reply(mstr(133)+mstr(134)+mstr(135));
current_userid := MURRAY;
CompOption(136,Node014);
CompOption(137,Node009);
CompOption(138,Node004);
end
procedure Node006 begin
Reply(mstr(139)+mstr(140)+mstr(141)+mstr(142)+mstr(143));
current_userid := CURLING
CompOption(144,Node012);
CompOption(145,Node013);
CompOption(146,Node014);
CompOption(147,Node009);
CompOption(148,Node004);
end
procedure Node007 begin
Reply(mstr(149)+mstr(150)+mstr(151)+mstr(152)+mstr(153)+mstr(154)+mstr(155));
current_userid := BIRD;
CompOption(156,Node010);
CompOption(157,Node011);
CompOption(158,Node012);
CompOption(159,Node013);
CompOption(160,Node014);
CompOption(161,Node009);
CompOption(162,Node004);
end
procedure Node008 begin
Reply(163);
current_userid := SMITH;
CompOption(164,Node009);
CompOption(165,Node004);
end
procedure Node009 begin
// downloaded Security Status
set_global_var(GVAR_HOLODISK_ENCLAVE_SECURITY,1);
Reply(166);
if (current_userid >= BIRD) then begin
CompOption(167,Node010);
CompOption(168,Node011);
end
if (current_userid >= CURLING) then begin
CompOption(169,Node012);
CompOption(170,Node013);
end
if (current_userid >= MURRAY) then
CompOption(171,Node014);
CompOption(172,Node004);
end
procedure Node010 begin
// download State of the Nation
set_global_var(GVAR_HOLODISK_ENCLAVE_STATE,1);
Reply(173);
if (current_userid >= BIRD) then
CompOption(174,Node011);
if (current_userid >= CURLING) then begin
CompOption(175,Node012);
CompOption(176,Node013);
end
if (current_userid >= MURRAY) then
CompOption(177,Node014);
if (current_userid >= SMITH) then
CompOption(178,Node004);
CompOption(179,Node004);
end
procedure Node011 begin
// download Word List
set_global_var(GVAR_HOLODISK_ENCLAVE_WORD,1);
Reply(180);
if (current_userid >= BIRD) then
CompOption(181,Node010);
if (current_userid >= CURLING) then begin
CompOption(182,Node012);
CompOption(183,Node013);
end
if (current_userid >= MURRAY) then
CompOption(184,Node014);
if (current_userid >= SMITH) then
CompOption(185,Node009);
CompOption(186,Node004);
end
procedure Node012 begin
if (cur_map_index == MAP_ENCLAVE_BARRACKS) then begin
if (global_var(GVAR_ENCLAVE_TURRET_GUARD) == TURRET_ALERT) then
Reply(187);
else if (global_var(GVAR_ENCLAVE_TURRET_GUARD) == TURRET_NORMAL) then
Reply(188);
else
Reply(189);
end
else if (cur_map_index == MAP_ENCLAVE_DETENTION) then begin
if (global_var(GVAR_ENCLAVE_TURRET_DETENTION) == TURRET_ALERT) then
Reply(190);
else if (global_var(GVAR_ENCLAVE_TURRET_DETENTION) == TURRET_NORMAL) then
Reply(191);
else
Reply(192);
end
else if (cur_map_index == MAP_ENCLAVE_REACTOR) then begin
if (global_var(GVAR_ENCLAVE_TURRET_SCIENCE) == TURRET_ALERT) then
Reply(193);
else if (global_var(GVAR_ENCLAVE_TURRET_SCIENCE) == TURRET_NORMAL) then
Reply(194);
else
Reply(195);
end
else if (cur_map_index == MAP_ENCLAVE_PRESIDENT) then begin
if (global_var(GVAR_ENCLAVE_TURRET_PRESIDENT) == TURRET_ALERT) then
Reply(196);
else if (global_var(GVAR_ENCLAVE_TURRET_PRESIDENT) == TURRET_NORMAL) then
Reply(197);
else
Reply(198);
end
else begin
if (global_var(GVAR_ENCLAVE_TURRET_MAIN) == TURRET_ALERT) then
Reply(199);
else if (global_var(GVAR_ENCLAVE_TURRET_MAIN) == TURRET_NORMAL) then
Reply(200);
else
Reply(201);
end
// The check below is useless since one needs a science skill of at least
// 150 to reach Node012 in the first place, but it is left in place just
// in case...
if (Science_Skill >= 125) then
CompOption(202,Node020);
if (current_userid >= BIRD) then begin
CompOption(203,Node010);
CompOption(204,Node011);
end
if (current_userid >= CURLING) then
CompOption(205,Node013);
if (current_userid >= MURRAY) then
CompOption(206,Node014);
if (current_userid >= SMITH) then
CompOption(207,Node009);
CompOption(208,Node004);
end
procedure Node013 begin
set_global_var(GVAR_HOLODISK_ENCLAVE_CHEMICAL,1);
Reply(209);
if (current_userid >= BIRD) then begin
CompOption(210,Node010);
CompOption(211,Node011);
end
if (current_userid >= CURLING) then
CompOption(212,Node012);
if (current_userid >= MURRAY) then
CompOption(213,Node014);
if (current_userid >= SMITH) then
CompOption(215,Node009);
CompOption(216,Node004);
end
procedure Node014 begin
set_global_var(GVAR_HOLODISK_ENCLAVE_ATOMIC,1);
Reply(217);
if (current_userid >= BIRD) then begin
CompOption(218,Node010);
CompOption(219,Node011);
end
if (current_userid >= CURLING) then begin
CompOption(220,Node012);
CompOption(221,Node013);
end
if (current_userid >= SMITH) then
CompOption(222,Node009);
CompOption(223,Node004);
end
3. When using the terminal, there is an inexplicable check against the sneak skill to determine minimal intelligence needed to use the terminal -- in procedure use_p_proc, a passed skill check or a tagged sneak skill lowers the intelligence requirement. I think the developers really meant SKILL_SCIENCE -- perhaps they used Watcom's auto completion feature inappropriately here? Though honestly, I can't see how that could've happened... At any rate, replacing all instances of SKILL_SNEAK to SKILL_SCIENCE ought to do the trick.
4. Each userID has access to something called "Security Status", and judging by the global variable set, it was supposed to download some text to the Pipboy. However, no such holodisk entry exists --
there's no link to it in holodisk.txt, nor are there corresponding text entries in pipboy.msg.
I don't have access to the Fallout Reference Bible right now, so if there's some mention of it there,
then maybe you can make something up and put the appropriate references (perhaps more a job for your Restoration Project). Otherwise, changing line 166 to something like: "Download failed - Security Status file missing." should also do the trick.
5. Logging in as Tom Murray or Dr. Curling results in option texts that are jumbled together, primarily due to lack of spaces, commas, or both. To fix, add a space at the end of lines 134 and 139, and add a comma and a space at the end of lines 140, 141, and 142.
6. Another minor continuity error: if you hack the terminal and try to fool it into thinking you have the presidential access passkey when you don't actually have it, a successful hack takes ten minutes plus a few extra ones (see line 264). There are a few problems here: a) If the player does this hacking with the counter insurgency option with Frank Horrigan, then the 10 minutes it took to hack the terminal means that the player is automatically toast, since the countdown only lasts 10 minutes. b) Even if the player was hacking under some other scenario, time does not actually advance once the player logs out. c) Node020a makes reference to a variable here_before. However, since here_before is always zero, Node020a can only display line 264 and not line 265. Which is just as well, I suppose, given that line 265 does not currently exist.
I would recommend removing all references to time, as well as setting the variable here_before to 1 in Node020a. Lines 264 and 265 can read something like:
Code:
{264}{}{Presidential Security Passkey recognized. Good day, Mr. President. (Yes! Now let's see what I can do...)}
{265}{}{(What else can I do?)}
7. Lines 173 and 180 should read "Download complete." (i.e. no capitalized "C") to maintain consistency with the rest of the text. Also, lines 240, 242, and 251 should change "Presidential Security Passkey recognized, Good day, Mr. President" to "Presidential Security Passkey recognized. Good day, Mr. President" (i.e. A period after recognized instead of a comma)
8. Minor inconsistency with Martin's dialogue: If you talk to Martin Frobisher, and you tell him that you want to save him and his people but don't know how, then Martin will very sensibly tell you to blow up the reactor computer. If you should go back over the dialogue, instead of asking how to save the people, your character will say that he or she plans to save the people by blowing up the reactor computer. However, there are two places in dialog where this happens, and your character's options are only updated in one of them -- in the other one, he or she still acts ignorant and needs the instructions repeated all over again.
To fix, go to Node020 of qcMartin.ssl and change it to:
Code:
procedure Node020 begin
if (dude_is_male) then
Reply(180);
else
Reply(181);
if (global_var(GVAR_ENCLAVE_POWER_PLANT) == PLANT_KNOWN) then
NOption(158,Node013,004);
else
NOption(182,Node014,004);
BOption(183,Node012,004);
NOption(184,Node003,004);
end
9. Small typo in line 153 of qcMartin.msg -- the word "Okay" shouldn't be capitalized.
10. If you talk to the Elder and get her to describe to you the effects of the FEV, one of the options you can say is "That certainly was disgusting. What am I supposed to do?" (line 239). However, the Elder replies with a rather out of place "Do not touch the forcefields" speech. Instead, she should probably tell you to blow up the reactor computer. To fix this, located procedure Enc013a in ahElder.ssl and change it to the following:
Code:
procedure Enc013a begin
Reply(237);
NOption(238,Enc007,004);
NOption(239,Enc007,004);
end
11. The background of the Elder during dialog makes it seem like she's still in Arroyo. Her background should probably be updated to something more appropriate.
12. There are a few minor grammatical errors in qcCurling.msg. I'll list them one by one:
Line 159 -- "Oh, your DNA, is more than..." should be "Oh, your DNA is more than..."
Line 168 -- "Why the information that you..." should be "Why, the information that you..." (thematically fits in with the way Dr. Curling speaks other similar lines)
Line 172 -- "God Bless America." should be "God bless America." (B was capitalized)
Line 178 -- This line should probably end in an exclamation mark instead of a question mark.
Line 186 -- "all ready" should be "already"
Line 191 -- "You're kind..." should be "Your kind..."
Line 208, 211 -- Remove trailing extra space at the end of these two lines.
Line 211 (again) -- "The F.E.V. toxin will only attack to humans, leaving everything else alive, better still..." should be "The F.E.V. toxin will only attack humans, leaving everything else alive. Better still..." (note that two errors were corrected: removing the unnecessary "to" and fixing comma splice at the end of the word "alive")
Line 263 -- Extra space between the words "the" and "F.E.V." (located near the end of the line.)
13. When you tell Dr. Curling that you are as human as he is (line 147 -- see Node009), he responds by claiming that your DNA is "more than just a *little* different" (line 159 -- see Node013), which is slightly disjoint given the context of the conversation. I really think the developers meant for the doctor to say line 156 (i.e. call Node012 instead of Node013), which makes much more sense as a rebuttal to the player's claim of humanity. However, Node012 is never called anywhere in Dr. Curling's script. The fix is to change the call in Node009 of qcCurling.ssl from calling Node013 to calling Node012, as thus:
Code:
procedure Node009 begin
Reply(146);
NOption(147,Node012,004);
BOption(148,Node008,004);
end
14. In Node044, Dr. Curling tries to quote a verse William Blake's famous poem, The Tyger. The developers placed each line of the verse on separate lines in the msg file, and tried to reproduce the verse by concatenating the four lines together. Unfortunately, instead of each line of the verse standing on its own, they are now all written on one long line, thus marring the effect of one of the most powerful stanzas ever written in English literature.
While technically nothing is wrong, I'm sure none of us want Blake to roll over in his grave.
Therefore, I propose fixing this little bit by changing lines 246-249 in qcCurlng.msg to the following:
Code:
{246}{}{When the stars threw down their spears,}
{247}{}{ And water'd heaven with their tears,}
{248}{}{ Did he smile his work to see?}
{249}{}{ Did he who made the Lamb make thee?}
15. What Jeffrey Jones (voice actor for President Richardson) says and what the text in qhPrzRch.msg says doesn't quite match up in a few spots. Here they are:
-> Line 111: Change "Be a good mutant..." to "Now be a good mutant..."
-> Line 119: Change "Uh, Vault 13, I see." to simply "Ah, Vault 13."
-> Line 177: Change "A little history...." to "A, hmm, a little history...."
-> Line 218: Change "....into the stone age." to "....into the stone age. (chuckles)"
-> Line 228: Change "Vault 13 was a special case" to "Vault 13 is a special case."
-> Line 248: Change "....use our guns to kill each other, just saves us the trouble." to "....use our guns to kill each other, (snorts) just saves us the trouble."
-> Line 252: Change "It's a damn good thing..." to "And it's a damn good thing..."
-> Line 254: Change "But that's not to be." to "But (sighs) that's not to be."
16. Tracing the dialog from Node050 onwards towards Node053 yields the following result:
Code:
PRESIDENT: You can't stop it. The tests are complete and the toxin is ready for release. In hours, your villagers will be the first to make the ultimate sacrifice. The other mutants will follow. An unfortunate footnote in the continuing history of the human race.
PLAYER: Why don't we start that footnote off with your epitaph, Mr. President?
PRESIDENT: Yes, I do. Even killing me won't help you. There's nothing you can do to stop the release.
As you can see, it doesn't quite make sense, unless one inteprets "Yes, I do" as the "epitaph". (The President's reply makes much more sense coming from Node051). I'm guessing that originally, Node050 is supposed to go to Node052, but Node052 was left blank, so the developers redirected it to the next Node. Instead, I would recommend re-directing the dialog to Node056, where the dialog flow, while still awkward, is much smoother than what it is now. To do this, change Node050 to the following:
Code:
procedure Node050 begin
Reply(265);
NOption(266, Node056, 4);
end
17. If you try to take the President hostage, he will reply with text that definitely doesn't match up with his speech. The problem is in Node011, where the President's textual reply is actually comprised of two different lines joined together (line 145 and 146). Apparently, though, the engine responsible for playing the corresponding voice files to the lines doesn't quite like it, and only plays the voice file for line 146.
And since we're on the subject of Node011: One of the lines (line 147) indicates that the player is willing to let the President go, but the President acts as if he has been intimidated. I think it's rather obvious that the BOption call to Node012 should really be a GOption call to Node013.
The fix is relatively simple: both text pretty much say the same thing, so it boils down to which line to pick. Personally, I think that line 145 is the proper reponse to the player's hostage taking attempt, and line 146 would be response to a failed intimidation speech roll in node010 -- a speech roll that is currently not implemented at all (something for the RP, maybe?).
At any rate, if we pick line 145 to be the proper line, and we fix the line 147 reponse, then Node011 becomes:
Code:
procedure Node011 begin
Reply(145);
GOption(147, Node013, 4);
NOption(148, Node020, 4);
BOption(149, Node012, 4);
end
18. If you are dressed in Advanced Power Armor Mark II (none of the other power armors work), then the President will call you a "gallant trooper" the very first time you meet him, and ask you what you want. If you ask him what's going on, the President will rather candidly start sharing the details of the Project with you. Afterwards, if you talk to him a second time, he'll ask in a rather annoyed tone "You're back? What is it you want?"
If you are dressed in anything else other than Advanced Power Armor Mark II or a Purple Robe, then the President will treat you as a stranger and ask you for your identity. On subsequent visits, the President will continue to ask you for your identity.
If you are dressed in a Purple Robe, the President will initially assume that you're one of the doctors doing research in the Enclave(!). This is despite the fact that no one else in the Enclave is dressed in a Purple Robe (in fact, you'd be shot on sight by the robots, turrets, and guards if you're running around the Enclave dressed in a Purple Robe.)
Needless to say, there are quite a few issues with this sequence of events.
a) The President treats you as an unknown stranger if you wear something else other than a Purple Robe or the Advanced Power Armor Mark II. While this is understandable if you are not wearing power armor (no one else in the Enclave runs around in any other armor other than power armor), and perhaps even if you are wearing normal power armor (perhaps troopers in normal power armor aren't supposed to be on the Presidential Level, so anyone in normal power armor waltzing around the Presidential Level can be assumed to be an infiltrator), it doesn't quite make sense for Advanced Power Armor. Then again, I guess you can argue that normal Advanced Power Armor look different from the Mark II version, and that Mark II troopers are the only ones allowed on the Presidential Level, even though the critter protos for the Enclave guards show that they are wearing normal version. But if that's true, then presumably the guards stationed on the Presidential Level should present some sort of challenge to you instead of letting you waltz around with impunity. Regardless of how one looks at things, at the very basic level, it cannot be denied that there is some inconsistency going on.
b) Even though the President can't see your face if you're wearing power armor, somehow he knows that you've returned to talk to him again. His psychic abilities must be strong! Even better, if you're wearing something else other than Advanced Power Armor Mark II or the Purple Robe, the President will seemingly forget about you and ask you who you are all over again.
c) The Purple Robe thing is obviously part of an unimplemented feature where you can walk around the Enclave as a doctor or researcher. I am guessing that originally, Enclave researchers were supposed to be dressed in Purple Robes, but that idea was discarded. It seems like the developers forgot to remove the relevant code from the President's script.
d) If, while dressed in no armor (i.e. only in the vault suit), you ask the President who he is, he will rather indignantly claim that he's the President, and that if you "belonged here", then you should know that. There's only one small problem with this logic: if you really are part of the Vault 13 prisoners, then you most definitely do NOT "belong" there. A more appropriate response is needed.
e) Once you ask him what's going on, the President will assume that you are a mutant infiltrator wearing Advanced Power Armor Mark II, and treat you accordingly. This may be working as designed (i.e. if the trooper needed to ask what's going on, then one may safely assume that he or she really isn't part of the Enclave and hence must be an infiltrator), but the logical linkages are perhaps not as clear as they can be due to the way the dialogue is structured. This is perhaps a bit subjective on my part, I'll admit, so feel free to ignore this if you disagree with my view.
With the above in mind, we can form an integrated solution. The President will now call the player a "gallant trooper" when he or she is wearing any form of Power Armor. At the same time, the President should treat a Purple Robe wearing player the same as a total stranger (though this may be something for you to think about for your RP). We'll also assume that the President will recognize the player on subsequent dialog attempts if the player isn't wearing power armor of any form. Finally, for players in power armor having the first conversation with the President, the linkages making it clear to the player that the President recognizes him or her as a mutant infiltrator will be clarified somewhat (feel free to ignore this last part of you disagree with e) above).
Code:
procedure Node021a;
#define LVAR_Node4_Count (12)
procedure talk_p_proc begin
Evil_Critter:=0;
Slavery_Tolerant:=SLAVE_TOLERANT;
Karma_Perception:=KARMA_PERCEPTION1;
CheckKarma;
GetReaction;
inc_local_var(LVAR_Start_Dialog);
// I'm not quite sure what global variable 697 is -- it
// certainly wasn't part of the official mapper scripts.
// I'm guessing it's a global variable introduced to
// control the display of the President's ending movie
// at the end of the game.
if (global_var(697) != 1) then
set_global_var(697, 1);
if (dude_is_stupid) then begin
if (local_var(LVAR_Herebefore) == 0) then begin
start_gdialog(NAME,self_obj,4,HEAD_PRESIDENT,BACKGROUND_PRESIDENT);
gSay_Start;
call Node001;
gSay_End;
end_dialogue;
end else begin
call Node003;
end
end else begin
if (dude_wearing_power_armor) then begin
if (party_size_biped == 0) then begin
start_gdialog(NAME,self_obj,4,HEAD_PRESIDENT,BACKGROUND_PRESIDENT);
gSay_Start;
call Node021;
gSay_End;
end_dialogue;
end else begin
start_gdialog(NAME,self_obj,4,HEAD_PRESIDENT,BACKGROUND_PRESIDENT);
gSay_Start;
call Node022;
gSay_End;
end_dialogue;
end
end else dude_wearing_vault_suit begin
if (party_size_biped == 0) then begin
start_gdialog(NAME,self_obj,4,HEAD_PRESIDENT,BACKGROUND_PRESIDENT);
gSay_Start;
call Node004;
gSay_End;
end_dialogue;
end else begin
start_gdialog(NAME,self_obj,4,HEAD_PRESIDENT,BACKGROUND_PRESIDENT);
gSay_Start;
call Node022;
gSay_End;
end_dialogue;
end
//end else if (WEARING_DISGUISE) then begin
// if (party_size_biped == 0) then begin
// start_gdialog(NAME,self_obj,4,HEAD_PRESIDENT,BACKGROUND_PRESIDENT);
// gSay_Start;
// call Node005;
// gSay_End;
// end_dialogue;
// end else begin
// start_gdialog(NAME,self_obj,4,HEAD_PRESIDENT,BACKGROUND_PRESIDENT);
// gSay_Start;
// call Node022;
// gSay_End;
// end_dialogue;
// end
end else begin
start_gdialog(NAME,self_obj,4,HEAD_PRESIDENT,BACKGROUND_PRESIDENT);
gSay_Start;
call Node022;
gSay_End;
end_dialogue;
end
end
inc_local_var(LVAR_Herebefore);
end
procedure Node004 begin
if (local_var(LVAR_Herebefore) == 0) then begin
Reply(119);
BOption(120, Node019, 4);
NOption(121, Node020, 4);
NOption(122, Node006, 4);
end else begin
Reply(183);
BOption(125, Node019, 4);
NOption(188, Node020, 4);
NOption(191, Node023, 4);
end
end
procedure Node021 begin
Reply(182);
if (local_var(LVAR_Node21_Count) == 0) then begin
inc_local_var(LVAR_Node21_Count);
BOption(120, Node015, 4);
NOption(185, Node999, 4);
end else begin
NOption(338, Node021a, 4);
NOption(185, Node999, 4);
end
end
procedure Node021a begin
Reply(183);
NOption(184, Node020, 4);
NOption(165, Node999, 4);
end
procedure Node022 begin
if (local_var(LVAR_Herebefore) == 0) then begin
if (party_size_male + party_size_female == 0) then
Reply(186);
else
Reply(187);
end else
Reply(183);
NOption(188, Node020, 4);
BOption(189, Node012, 4);
if (local_var(LVAR_Herebefore) == 0) then
BOption(190, Node019, 4);
else
BOption(125, Node019, 4);
NOption(191, Node023, 4);
end
Note that I've created a new LVAR (LVAR_Node4_Count, though I suppose you use LVAR_Node5_Count since I've now commented out the disguised doctor dialog), plus a new procedure Node021a. Line 338 (referenced in Node021) should go something like: "Actually, Mr. President, I'm back."
19. This may be stuff that is more appropriate for the RP, but I'll list the problem here and let you make the decision.
If you have met the vice president before speaking to the president, then in Node015 you are supposed to have a dialog option which leads to the president discussing the vice president's role in the Project. Unfortunately, in a normal game one can never access this branch of dialog. Why? Whether or not the player has met the vice president is kept track of by a flag named "met_vice_prez", but almost right at the very beginning of the file ENC.H, "met_vice_prez" is defined as "(false)". Hmmm...
There are several possible solutions, but perhaps the simplest way is to define a new MVAR in ENCPRES.H (there's currently only one there), and set the state of the MVAR to 1 if the player has met the vice president and to set it back to zero if the player kills the VP. This way, if the player has met the VP
AND hasn't lost his/her temper and blew his brains out, he/she can talk to the President about him.
20. There are some minor miscellaneous errors in qhPrzRch.msg that need to be fixed:
-> Lines 160, 176: Extra space between the last sentence and next-to-last sentence.
-> Lines 172, 224, 280: Extra space at the end of line.
-> Line 207: Extra space between "why" and "did".
-> Line 210: "So what." should be "So what?"
-> Line 227: "it's" should be "its"
21. In corrections.txt, you state that:
Convincing Murray to shut down the reactor, no longer causes him to still say "What's the alarm ringing about?"
However, this is not true. Murray still acts clueless about what's going on.
The problem lies in qcMurray.ssl. Murray only gains awareness of what's going on if GVAR_ENCLAVE_COMPUTER == COMPUTER_DESTROYED. However, other than in the header file GLOBAL.H and Murray's script, this particular GVAR isn't mentioned (let alone manipulated) at all. The obvious fix is to go to Node013 of qcMurray.ssl and set the global variable to an appropriate value, as thus:
Code:
procedure Node013 begin
set_global_var(GVAR_ENCLAVE_REACTOR,ENCLAVE_REACTOR_OFF);
if (global_var(GVAR_ENCLAVE_COUNTDOWN) == 0) then begin
set_global_var(GVAR_ENCLAVE_COUNTDOWN,game_time);
give_xp(EXP_DESTROY_REACTOR_TALK);
end
set_global_var(GVAR_ENCLAVE_ALARM,ALARM_REACTOR);
set_global_var(GVAR_ENCLAVE_COMPUTER,COMPUTER_DESTROYED);
Reply(153);
GOption(154,Node013a,004);
BOption(155,Node998,004);
NOption(156,Node008b,004);
end
For the sake of consistency, you may also want to toggle this variable in qiReactr.ssl, since it makes sense that Murray would have some sort of monitoring device at his desk and ought to know that something is very wrong with the reactor control computer once you had blown it up.
22. Finally, for something not related to the Enclave computer terminals: When you blow up the reactor's controlling terminal, if you or any party members are standing too close to the reactor, then you'll take electrical damage. However, for some odd reason K-9, Dogmeat, the Pariah Dog, Laddie, and any inferior versions of the Brain Bot will not be affected by the electrical damage. Why? Because the code makes no such check. The fix is to go to qiReactr.ssl and add the appropriate checks for the neglected party members in procedure damage_p_proc, as thus:
Code:
procedure damage_p_proc begin
if ((weapon_dmg_type(target_obj) == DMG_explosion) and (map_var(MVAR_Reactor_Off) == 0) and (global_var(GVAR_ENCLAVE_REACTOR) < ENCLAVE_REACTOR_OFF)) then begin
set_map_var(MVAR_Reactor_Off,1);
set_global_var(GVAR_ENCLAVE_REACTOR,ENCLAVE_REACTOR_OFF);
if (global_var(GVAR_ENCLAVE_COUNTDOWN) == 0) then
set_global_var(GVAR_ENCLAVE_COUNTDOWN,game_time);
set_global_var(GVAR_ENCLAVE_ALARM,ALARM_REACTOR);
display_msg(g_mstr(1011));
give_xp(EXP_DESTROY_REACTOR_COMPUTER);
ShockPerson(dude_obj);
ShockPerson(Vic_Ptr);
ShockPerson(Myron_Ptr);
ShockPerson(Marcus_Ptr);
ShockPerson(MacRae_Ptr);
ShockPerson(Sulik_Ptr);
ShockPerson(Lenny_Ptr);
ShockPerson(Cyberdog_Ptr);
ShockPerson(Doc_Ptr);
ShockPerson(Goris_Ptr);
ShockPerson(Davin_Ptr);
ShockPerson(Miria_Ptr);
ShockPerson(Robobrain_Ptr);
ShockPerson(Dogmeat_Ptr);
ShockPerson(Pariah_Dog_Ptr);
ShockPerson(K9_Ptr);
ShockPerson(Robobrain_Human_Ptr);
ShockPerson(Robobrain_Abnormal_Ptr);
ShockPerson(Robobrain_Chimp_Ptr);
ShockPerson(Laddie_Ptr);
end
end
Note also that it is possible for some non-party members to be in blast range, but since they are not party members, they wouldn't be shocked in the explosion. To include them in the damage you'll need to write something up similar to my modified code for the brain extraction room in the SAD.
23. If you try to talk to Murray while dressed in power armor, you get some dialog strongly implying that troopers in power armor are not permitted to be in his office. This is funny, since standing right in front of Murray is a power armored trooper!
My guess is that this bit of code is remnants of the unimplemented disguise-yourself-as-a-doctor feature (see Bug #18, especially my comments in part c)). I would recommend commenting out the relevant conditional ((dude_wearing_power_armor) and (part_size == 1)) in talk_p_proc of qcMurray.ssl.
24. There are quite a few GOption calls in Frank Horrigan's script. Not that it really matters much at this stage of the game, but I think they really should be NOption calls instead.
25. When you try to plead to Frank Horrigan to talk things over (3 different ways the player can do this), he usually responds with "We just did. Time for talking's over." However, for one of the options, he skips past this (un)pleasantry and attacks you right away. To maintain thematic consistency, Frank should say his line first before attacking. To correct this, go to Node004 of qcFrank.ssl and change it to the following:
Code:
procedure Node004 begin
if (global_var(GVAR_ENCLAVE_ALARM) == ALARM_TOXIN) then
Reply(115);
else
Reply(116);
BOption(117,Node998,004);
NOption(118,Node005,004);
BOption(135,Node998,004);
end
26. Here's a bug that I wouldn't have dreamed of discovering if it wasn't for one lucky break. Anyway, here's what happened in my game: As part of my experimenting, I was fighting Sergeant Granite and his merry men, including big Frank Horrigan, using only the turrets and my party members as support. In the course of the fight, Myron was very badly injured (1 hp left!), and tried to retreat. Luckily, my next shot killed Horrigan, and I used my remaining AP to shoot the head off Horrigan's upper torso. Now, I was in sneak mode, and I had totally forgotten about Granite's surviving men. I guess I must have been out of enemy detection range since the game allowed me to end combat. I exited combat, tried to run to Myron to heal him with stimpacks, only to be thrown right back into combat as I exited sneak mode. One of Granite's men, the one with the Laser Gatling, opened up on me. I was fine in my Advanced Power Armor Mark II, but unfortunately, it seems that Myron was in the area of fire. Needless to say, he was promptly killed.
On a whim, instead of reloading, I decided to mop up the rest of Granite's squad, exit the Enclave and see the ending movies anyway. Imagine my surprise when the ending movie claimed that Myron died a year later in Den! Funny, I could have sworn he died in combat the Enclave... Subsequent experimentation with Myron and Marcus (by the much more expedient method of shooting them directly) shows that their ending movies are played even though they had died in the Enclave. It took me a little bit to track down what went wrong.
Anyway, the cause of this bug is due to the fact that the global variables controlling the display of the Myron and Marcus custscene are set on Horrigan's death. In the meantime, though, if either of them should die after Horrigan's death but before the player manages to get the heck out of dodge, then the custscene is still set, and is still played at the end of the game. While this scenario is admittedly highly unlikely, as I had outlined in my personal experience above, it is not utterly impossible.
To fix this, I would move the code determining whether or not to show Marcus' or Myron's cutscene entirely out of Frank's script and into the respective characters' scripts. Toggle the movie to be played as soon as Marcus joins the player's party, and as soon as the player had talked to Myron. Unset the variable in the event of either's unfortunate demise.
27. Currently, if the player successfully obtained fuel for the Hubologists' shuttle at any point in the game, they are treated to one of two random endings in which the Hubologists basically suffocate to death once in orbit. Otherwise, an ending is shown where the Hubologists blow themselves up trying to launch the shuttle using a "cheap derivative fuel". There are a couple of issues with this.
a) The logic for displaying the Hubologist cutscene does not take into account the fact the either Badger or Dave H. could redirect the fuel from the shuttle to the tanker. If the shuttle was emptied of its fuel, then the cheap fuel scenario should very logically take place instead of the suffocate in orbit scenario. This should be the case for most "normal" gameplay. In fact, the only way the Hubologists could have fuel in their shuttle at the very end of the game is for the player to purposely make his/her character stupid and get Matt or AHS-9 to fix up the tanker for him/her. In all other circumstances, the fuel must end up in the tanker one way or the other, to the exclusion of the shuttle.
b) While the two suffocation endings are similar in that it assumes that the shuttle has fuel, there's a reason why there's two of them. One scenario (faulty air seal) is there if the player doesn't deliver the vertibird plans to the Hubologists. The other scenario is there if the Hubologists do have access to the plans (i.e. thanks to the plans, they can locate and fix the faulty air seals, but then they forgot about the recycled air).
c) If the player massacares the Hubologists in San Francisco, should the Hubologist ending still be shown? I mean, their leadership has suffered a serious decapitation strike, so I don't know who would be around to launch the shuttle. I guess one can always argue that the Hubologists you randomly encounter out in the wastes eventually gather together to try and launch. In my suggestion below, I have left this particular point alone, but you'll need to make the obvious adjustments if you feel that there should be no Hubologist ending in the event of a massacare.
To fix this, we need to rework the code processing the Hubologists endings to something more suitable. Unfortunately, this is a bit more complicated than it seems: there is no global variable keeping track of the exact state of the Hubologist's fuel situation. And as indicated above, it is possible for the player to get fuel for both the tanker and the shuttle quite legitimately, so simply keeping track of the tanker's fuel status along with the shutter's fuel status isn't enough. Therefore, either have to create a new global variable, or else use the existing GVAR_SAN_FRAN_ELRON_GAS_QST, and set it to 3 in the event that you transfer the gas out of the shuttle and into the tanker -- in this latter case, Badger's, Dave H.'s, and the Hubologist computer's scripts will need to be updated in order to accurately reflect the state of the Hubologist fuel quest. Assuming that this is done, then the code for determining that end game cutscene becomes pretty simple:
Code:
if (global_var(GVAR_SAN_FRAN_ELRON_GAS_QST) != 2) then
set_global_var(GVAR_ENDGAME_SAN_FRAN_MOVIE_ELRON,1);
else begin
if ((global_var(GVAR_SAN_FRAN_VERTI_ELE_QST) == 2) or (global_var(GVAR_SAN_FRAN_VERTI_STEAL_SHI_QST) == 2)) then
set_global_var(GVAR_ENDGAME_SAN_FRAN_MOVIE_ELRON,2);
else
set_global_var(GVAR_ENDGAME_SAN_FRAN_MOVIE_ELRON,3);
end
Note that you also no longer need variable k, since you are no longer making a random choice.
28. What Michael Dorn (voice actor for Frank Horrigan) says and what the text in qcFrank.msg says doesn't quite match up in a single spot. Here it is:
-> Line 116: Change "Making our reactor melt-down means things are going..." to "Making our reactor melt-down means that things are going..."
-- The Haen.