@ryo
This thread is for the unofficial patch, not the restoration project. You may get better results posting your inquiries there. Having said that, here's a question for you: Since you said you used the manual install after you upgraded to the official v1.02d version, did you remove the Patch000.dat file in the main fallout directory?
In other news, I'm patiently working my way through NCR. I've already found 16 bugs. While a couple of them are minor dialog errors, there 2 of them which are of the quest breaking variety, and there is 1 pretty nasty 100% reproducible crash bug. Fortunately, I've managed to isolate the cause for each of them, so it's a matter of me finding the time to type them up and post it here. Expect to see something by the end of the week latest -- hopefully sooner.
-- Haenlomal
Edit: And here's another updated bug list! More to come if and when I finally get to San Fran.
NCR
1. If you offend the Enlightened One, the dialog exits without any warning. However, what was suppose to happen is that line 118 is displayed before ending the conversation. Unfortunately, Node004 (which is responsible for displaying line 118) does not give the player any options for replying, so the entire node jumps ahead and ends before the player can notice. The fix is to add a simple ending option, as thus:
Code:
procedure Node004 begin
set_local_var(LVAR_Hostile, 1);
Reply(118);
ENDOPTION;
end
2. For the Enlightened One, the entire "LVAR_Freeibe" (I think they really meant "Freebie", but oh well) line of dialog, starting at Node008, is bugged. This is because, with the single exception of line 174,
none of the lines referenced exist in the text file scEnlOne.msg! Judging by the name of the variables involved (EXP_TALK_FALLOUT2 and REP_BONUS_NCR_TALK_FALLOUT2), this was supposed to be a free 100xp given to player in the context of a humorous inside joke, achieved by stepping slightly outside of the game, and then returning player to Node008 to get back into the "proper" mindset.
The simplest fix would be to leave the entire LVAR_Freeibe option commented out, like it was in the original scEnlOne.ssl file. However, what's the fun in that?
But if you want to make it work, then you need to do two things:
a) Point the MOREOPTION macro in Node021 back to Node008, and decrement the Node8Rep counter so that the Node008 response would still make sense. So something like this:
Code:
procedure Node021 begin
Node8Rep -= 1;
Reply(175);
MOREOPTION(Node008);
end
b) Create some humorous text to fill in the missing space. I would imagine something like the following, though I'm sure you can think of something better:
In Node008:
-> Line 138: "I'm level"
-> Line 217: "."
(This will make the player answer "I'm level 27." or something similar).
In Node020:
-> Line 173: "What? That is not a valid-- Wait a minute…are you talking about your Fallout 2 level in a lame and pathetic attempt to earn cheap experience points through dialog!?"
-> Line 174: "Yes!" <-- This line already exists, given as a player response.
In Node021:
-> Line 175: "[Sigh] The things some people will do for experience points. Very well, here are your experience points… Now that we have that out of the way, shall we try again?"
3. If you kill the Enlightened One, you get a bonus for "taking care of" her for Merk, even if you had never spoken to Merk before. The check and xp reward for killing the Hubologist should probably be done in Merk's script. At the same time, the flag MERK_STATUS_PLEASED can still be set in the Enlightened One's script, but only if MSS_KILL_ELRON is already set -- the player can kill the Hubologist before ever meeting Merk, and in this case he'll need to do something else to prove himself to Merk. At the same time, care must be taken in Merk's script to process it carefully so that Merk does not tell you to try to kill the Hubologist again.
On another note, this is one of the few places where the macro give_xp is not used, so you may want to standardize this as well as per what you wrote in corrections.txt. Lines 218 and 219 can be consolidated into "You have "taken care of" the Hubologist for Merk." and placed into Merk's message file.
So destroy_p_proc in scEnlOne.ssl should look something like this:
Code:
procedure destroy_p_proc begin
/* Increment the aligned critter counter*/
inc_good_critter
/* Set global_variable for Enemy status*/
set_mss(MSS_ELRON_DEAD);
set_global_var(GVAR_NCR_KILL_ELRON_QST, 2);
if (merk_seed_status(MSS_KILL_ELRON) then begin
set_merk_status(MERK_STATUS_PLEASED);
end
end
The relevant changes in Merk's script would be located in Node042:
Code:
nbody(042)
if (global_var(GVAR_NCR_SCMERK_SEED_STATUS) bwand (MSS_KILL_ELRON+MSS_ELRON_DEAD)) then begin
display_msg(mstr(300)); // Assuming line 300 in scMerk.msg is {You have "taken care of" the Hubologist for Merk.}
give_xp(EXP_MERK_HUB_DEAD);
end
Reply(235);
NOption(236, Node019, 4);
NOption(237, Node047, 4);
NOption(264, Node020, 4);
nbodyEnd
4. Several NOption calls in scEnlOne.ssl should be BOption calls instead. More specifically, the NOption calls in Node005 and Node018 to Node004 should both be BOption calls.
5.
CRASH BUG ALERT! If you proved yourself to Merk by killing Lenny in the ring using the Mutagenic Serum, and then rejected his quest to retrieve Dr. Henry's paper, Merk will be pissed with you, and won't offer you the job again unless you prove yourself once more. However, in the list of options of proving yourself, the option to kill Lenny is still there. If you select this option, and follow the dialog to the end, Merk will try to arrange another fight, which will result in a crash!
The cause of this crash seems to be an engine bug: if you kill Lenny using the Mutagenic Serum, then destroy_p_proc never gets called. Thus MVAR_Lenny_Dead never gets updated, resulting in Merk thinking Lenny's still around. The only solution seems to be using scripts for a quick and dirty hack to use_obj_on_p_proc, destroy_p_proc, map_update_p_proc in scLenny.ssl, as thus:
Code:
procedure use_obj_on_p_proc begin
variable tool;
tool := obj_pid(obj_being_used_with);
if (tool == PID_MUTAGENIC_SYRUM) then begin
set_ncr_flag(NCR_KILLED_LENNY_SERUM_FLAG);
if (not (MVAR_Lenny_Dead == 1)) then begin
call destroy_p_proc
end
end
end
procedure destroy_p_proc begin
/* If player uses the serum, and then kills Lenny before it */
/* takes effect, this will prevent the kill counter from */
/* being incremented twice. */
if (not (MVAR_Lenny_Dead == 1)) then begin
/* Increment the aligned critter counter*/
inc_evil_critter
/* Set global_variable for Enemy status*/
set_map_var(MVAR_Lenny_Dead, 1);
end
end
procedure map_update_p_proc begin
if (not (MVAR_Lenny_Dead == 1)) then begin
lenny_obj := self_obj;
end
end
6. Here's a pretty interesting little bug that takes some work to duplicate. First, tell Merk you want to work, and prove yourself in anyway you want. Then retrieve the papers from Dr. Henry -- being careful keep the good doctor alive, as Merk requested. After that, talk to Doofus when he's high, ask him "What place is this?" and then "Yes?", and he'll tell you to go see Merk for stuff to do. Return to Merk and tell him that "informed sources" told you that he can do business. Merk will get unhappy and ask you to kill Doofus. Refuse to do so, and he'll end the conversation on an insulting note. Talk to him again, apologize, and assuming you have a high enough charisma, you will get the option to ask him for work again! If you do so, you'll have once again have the choice of proving yourself. If you decide to kill Lenny, sell Myron, or call yourself a "badass mofo" the second time around, Merk will even offer you the job to retrieve Dr. Henry's papers again! Fortunately, you can't give him the papers a second time around, even if you steal/barter the papers from him.
The reason for this bug lies in Node005 of scMerk.ssl. Part of the code looks like this:
Code:
if (not (merk_status == MERK_STATUS_PLEASED)) then
NOption(129, Node008, 4);
The idea is that Merk is pleased with you once you have completed the Dr. Henry paper retrieving job, so the option to ask him for more work shouldn't appear once the papers have been retrieved. Unfortunately, refusing to kill Doofus for Merk will make him displeased again, thus allowing the player an opportunity to ask for more work. A secondary issue is at work here: if Doofus tells the player to look up Merk for work opportunities, and the player already has done the Dr. Henry job, then logically speaking, there is no longer any need to tell Merk that "informed sources" let the player know that Merk is the man with whom to do business -- the player already knows this fact very well for himself or herself!
There are a few ways to fix this bug. The easiest way is to check to see if the papers have already been retrieved, and if yes, don't present this option at all. The same check should probably be done on the "informed sources" line for the reasons discussed above, but more needs to be done due to another bug -- read on!
7. Talk to Doofus when he's high, and ask him "What place is this?" and then "Yes?" to get him to tell you to go to Merk for some work. Tell Merk that "informed sources" told you to look him up, and he'll tell you to kill Doofus for him. Accept the offer, then kill Doofus. Return to Merk, and pick the "informed sources" line again. Despite the fact that you've already iced Doofus, Merk will once again tell you to kill the carhop! Hmm...
The reason for this bug lies once again in Node005. You have the following snippet of code in Node005:
Code:
if (global_var(GVAR_NCR_MERK_WORK) == 1) then
NOption(130, Node009, 4);
This code does not check at all to see if Doofus has bought the farm. So an added check should be made to see if Merk has already told the player to kill Doofus, in addition to what was discussed in bug #6. Also, a check should be made to see if Doofus is still alive in the first place -- after all, it is entirely possible for the player to have killed Doofus before ever talking to Merk! In this scenario, Merk should proably ask the player to prove himself -- i.e. go to Node008 -- since in theory he will have no idea who killed his carhop.
When the fixes to both 6 and 7 are implemented, the final result for Node005 should look something like this:
Code:
nbody(005)
if (merk_status == MERK_STATUS_MET or global_var(GVAR_NCR_SCMERK_HEREBEFORE) == 1) then
Reply(126);
else if (bad_critter_reaction or merk_status == MERK_STATUS_BAD_REACTION) then
Reply(127);
else
Reply(125);
NLowOption(128, Node007);
if (not merk_seed_status(MSS_DR_HENRY_DONE)) then
NOption(129, Node008, 4);
if (global_var(GVAR_NCR_MERK_WORK) == 1) then begin
if (not merk_seed_status(MSS_DR_HENRY_DONE) then begin
if ((not merk_seed_status(MSS_KILL_SKEETER)) and (not merk_seed_status(MSS_SKEETER_DEAD))) then begin
NOption(130, Node009, 4);
end else begin
NOption(130, Node008, 4);
end
end
end
if (global_var(GVAR_NCR_CAR_JACKED) == 1) then
BOption(131, Node1011a, 4);
NOption(132, Node020, 4);
if (global_var(GVAR_NCR_CAR_JACKED) == 1) then
NOption(133, Node1211a, 7);
if (global_var(GVAR_NCR_FAKE_VAULT13_MAP) == DUDE_FIGURED_FAKE_MAP) then
NOption(266, Node037, 4);
nbodyEnd
8. This is kind of related to the previous bug. After you have killed Doofus, Merk does not really react to it at all. Judging by the Merk's dialog when he asks you to "cap" Doofus, he was supposed to give you the job to retrieve Dr. Henry's papers after the carhop is toast. The fix is to set MERK_STATUS_PLEASED in Doofus' destroy_p_proc, if MSS_KILL_SKEETER is previously set:
Code:
procedure destroy_p_proc begin
/* Increment the aligned critter counter*/
//inc_good_critter
inc_evil_critter
if (merk_seed_status(MSS_KILL_SKEETER)) then begin
set_merk_status(MERK_STATUS_PLEASED);
end
set_mss(MSS_SKEETER_DEAD);
end
At the same time, there probably should be a quest entry for this, since it's just like killing the Hubologist, and with the same end result. Only the target is different.
9. According to destroy_p_proc in scSkeete.ssl, Doofus is an evil critter. However, in Node999b of scMerk.ssl, the comment in that script specifically states there should be a karma drop for taking on the quest. This leads me to believe that counting Doofus as an evil critter is a bug. I think that he really should be a neutral critter, so destroy_p_proc should call inc_neutral_critter instead of inc_evil_critter.
10. When you find out that Merk has been stealing from your car, you can confront him with it. If your barter skill is high enough, one possible option is to buy your stolen stuff back. See Nodes 012, 25a, and 025 for details. However, notice that line 155 is a line that would be spoken by a male character. I think the developers simply forgot to include a female version of 155, especially considering the deliberately gender-neutral tone of Merk's response in line 185 instead of the more common male expression. One way to fix this would be to create a feminine equivalent of line 155, but the easier fix (to match Merk's response in line 185) would be to simply make line 155 gender neutral, as thus:
Code:
{155}{}{Now if a person had some things missing, do you suppose such a person could buy those things back?}
11. The xp gain message for retrieving Dr. Henry's papers is not standardized, as per your corrections.txt file. Lines 271 and 272 can be consolidated into "You retrieved Dr. Henry's paper." Then Node5051a in scMerk.ssl can look like this:
Code:
procedure Node5051a begin
variable papers;
papers := obj_carrying_pid_obj(dude_obj, PID_DOC_PAPERS);
if (papers) then begin
item_caps_adjust(dude_obj, 1000);
rm_obj_from_inven(dude_obj, papers);
add_obj_to_inven(self_obj, papers);
set_merk_seed_status(MSS_DR_HENRY_DONE);
set_global_var(GVAR_NCR_DRPAPR_QST, 2);
display_msg(mstr(271)); // Asuming line 271 in scMerk.msg is {You retrieved Dr. Henry's paper.}
give_xp(EXP_MERK_GET_PAPERS);
end
if (merk_seed_status(MSS_DR_HENRY_DEAD)) then
call Node050;
else
call Node051;
end
12. If you try to repair the terminal before dealing with Officer Jack (wait until nightfall before you go to the powerplant), you will either "fail" or successfully "fix" the terminal. If you "failed" to repair it, then Dorothy will be in full panic mode until you can successfully "fix" the terminal. Regardless, once you are successful, Dorothy will reward you with four skill books and 3,000xp. In the meantime, Officer Jack will still make his way to the Powerplant everyday and say threatening float messages, but he won't actually blow anything up. At the same time, you can't do anything more about it, and Dorothy seems to think that everything is fine despite the madman standing next to the terminal.
The cause of this bug is found in procedure use_skill_on_p_proc in ssComp.ssl. There is no check at all to see if the terminal needs repairing -- it assumes that it does need repairs, and rolls for success or failure accordingly. Furthermore, the state of the powerplant is kept in the global variable GVAR_NCR_POWERPLANT, but none of the defines in ncr.h relates to the state where the Officer Jack problem has yet been initiated. Therefore, the fix consists of two steps.
a) In ncr.h, define a zero state under "//Dorothy Crap", as thus:
Code:
//Dorothy Crap
#define PP_NOTSTARTED 0
#define PP_MURDER 1
#define PP_DEFUSED 2
This step is of course technically speaking not necessary, but will help with future code maintenance.
b) In ssComp.ssl, change use_skill_on_p_proc to the following:
Code:
procedure use_skill_on_p_proc begin
script_overrides;
if (global_var(GVAR_NCR_POWERPLANT) != PP_NOTSTARTED) then begin
debug_msg("SSCOMP: using sscomp console");
if (local_var(LVAR_Working) == STATE_WORKING) then begin
if (skill_success(source_obj,USE_WITH_SKILL1,ROLL_ADJUSTMENT1)) then begin
call use_success;
end
else begin
call use_fail;
end
end else call use_fail;
end
end
If you didn't define PP_NOSTARTED in ncr.h, then substitute the value of "0" in the code above.
13. If you are playing an intelligent character and kill Officer Jack, then tell Mira about it, she will give you a P90c as a reward, though you don't get the experience points associated with getting the same quest as a dumb character. However, if you killed Jack in jail, this does not happen: the dialog option to talk about Jack never appears in Mira's dialog, and so you will never get the reward.
There's a related problem: if you successfully killed Jack, you are rewarded the xp right away, and the quest is crossed off your PIPBoy. This really should only happen if after you return to Mira for a reward, though one can argue that this is subjective.
The problem is found in procedure destroy_p_proc in scOfJack.ssl. For some reason, there was a check added to make sure that Jack is not in jail (or more accurately, not on the tile JACK_JAIL_TILE) before setting the appropriate state in GVAR_NCR_MIRA_STATE. I'm guessing that this was an attempt to prevent the quest entry from appearing in the PIPBoy on Jack's death, even when Mira hasn't given it to the player. Unfortunately, this is only somewhat effective: killing Jack in jail now provides no reward, and you still get the PIPBoy entry without ever talking to Mira if you kill Officer Jack anywhere else but at the jail.
With the above objectives in mind, we can do the following to fix the problem:
a) Undo the check for JACK_JAIL_TILE in destroy_p_proc (i.e. restore it to what was found in v1.02D).
b) In NCR.H, change the Mira related defines to the following order:
Code:
//Mira
#define MJACKTALK 1
#define MJACKDEAD 2
#define MJOBTAKEN 3
#define MJOBJACKEDWHACKED 4
#define MJOBDONE 5
#define HKP90C_PID PID_HK_P90C
You'll need to recompile scKarl.ssl, scMira.ssl, and scOfJack.ssl in order for the new defines to take effect.
c) In Data\quests.txt, change the entry for Mira's quest to:
Code:
# "Take care of Officer Jack" For Mira, GVAR_NCR_MIRA_STATE
1510, 1101, 217, 3, 5
If you think that the PIPBoy entry should be crossed off right after Jack buys the farm, then change the 5 to a 4.
14. If you let Jack blow himself up, and then tell Mira what happened, according to the dialog in Node026, she gives you a Rad-A-Waster (Booze) on the house (line 193 of scMira.msg). However, this isn't happening, mainly because there is no code in place to do so. The simple fix is to add the necessary code to Node026 of scMira.ssl, as thus:
Code:
procedure Node026 begin
add_obj_to_inven(dude_obj, create_object(PID_BOOZE, tile_num(self_obj), 0));
Reply(193);
NLowOption(194, Node009);
NLowOption(195, Node999);
NOption(196, Node011, 4);
NOption(197, Node999, 4);
end
15. If you killed Lenny in the ring before you resolve the Officer Jack issue, Mira will keep on congratulating you and will no longer bring up any option to reward you for informing her about Jack's demise. The fix is to point all references to Node005 in Node003 to Node001 instead, as thus:
Code:
procedure Node003 begin
if (ncr_flag(NCR_KILLED_LENNY_SERUM_FLAG)) then begin
if (local_var(LVAR_N3_Count) == 0) then begin
Reply(184);
ENDOPTION;
end else begin
Reply(185);
MOREOPTION(Node001);
end
end else begin
if (local_var(LVAR_N3_Count) == 0) then begin
add_obj_to_inven(dude_obj, create_object(PID_BOOZE, tile_num(self_obj), 0));
Reply(115);
ENDOPTION;
end else begin
Reply(116);
MOREOPTION(Node001);
end
end
inc_local_var(LVAR_N3_Count);
end
16. If you beat up Hoss, and he surrenders, Dusty will give you a free booze in order to congratulate you on your success. However, he keeps on giving you a free booze every time you talk to him, so you have a source of infinite booze. While this definitely appeals to the alcoholic in all of us, I'm sure the developers were only intending a one time bonus.
See Node007 of scDusty.ssl for the details.
The fix is to add another LVAR to the script -- say, LVAR_Freebie. Set LVAR_Freebie to 1 the first time Dusty gives away free booze, then have him say something else in the future -- a few appropriate lines will need to be created. So, if we have lines 131, 132, and 133 in scDusty.msg looking something like this:
Code:
{131}{}{Looking to teach Hoss another lesson?}
{132}{}{Maybe later. But right now, I've got some questions.}
{133}{}{Maybe later. Bye.}
then Node007 could look something like this:
Code:
procedure Node007 begin
if (LVAR_Freebie == 0) then begin
set_local_var(LVAR_Freebie, 1);
add_obj_to_inven(dude_obj, create_object(PID_BOOZE, self_tile, 0));
Reply(128);
NOption(129, Node001, 4);
NOption(130, Node999, 1);
end else begin
Reply(131);
NOption(132, Node001, 4);
NOption(133, Node999, 1);
end
end
17. On a similar note, if you beat Hoss up so badly that he is rendered unconscious, Dusty will remain oblivious to your victory until Hoss wakes up and you talk to him. This is because the flag GVAR_NCR_BEAT_HOSS is only set in dialog with Hoss. The fix is to check for is_critter_prone(self_obj) and current hit point levels in combat_p_proc and set GVAR_NCR_BEAT_HOSS if true, but keep LVAR_Surrender at 0. In talk_p_proc, add an additional check to beat_hoss == 1 and local_var(LVAR_Surrendered) == 0 as a possibility to goto Node006 or Node005. Finally, in Nodes 005 and 005, set LVAR_Surrendered to 1 in addition to setting GVAR_NCR_BEAT_HOSS to 1. This way, Dusty will acknowledge the player's victory if Hoss is unconscious, and the player will still get to see Hoss's, um, concession speech when the bully is awake.
18. Dusty's inventory restocks every one to four days, but he doesn't purge his inventory. Unlike most shopkeepers, Dusty actually keeps his inventory on himself. Fortunately, he carries no weapons or any special items, so it is ok to purge his inventory before restocking. Alternately, a box can be created for him. Otherwise, he will keep on accumulating junk.
19. Line 124 in scDusty.msg should be "Thanks." (It was lacking the ending period.)
20. Your NPC companions no longer trigger the dialogue with the door to the craps dealer everytime they try to go through it, which is a good thing. However, they now walk right
through the door without opening it, which is a decidedly bad thing.
As far as I can tell, the problem lies in the fact that technically speaking, the doors aren't locked. All that is preventing the player from opening them and walking through is the script, which forces a dialog on any use attempt. Since NPCs are no longer affected by it, they can use the door and go through it with impunity. Yet, because of the script_overrides command, the door does not animate or do anything else the engine would normally do.
The fix is to keep the doors locked via the script. This can be done in the currently empty procedures map_enter_p_proc and map_update_p_proc, as thus:
Code:
procedure map_enter_p_proc begin
if (local_var(LVAR_Door_Unlocked) == 0) then begin
obj_close(self_obj);
obj_lock(self_obj);
end
end
procedure map_update_p_proc begin
if (local_var(LVAR_Door_Unlocked) == 0) then begin
obj_close(self_obj);
obj_lock(self_obj);
end
end
21. If you knock down the doors to the craps dealer using a crowbar, you will still get the option to ask Duppo about alternate sources of cash, and he will act as if you don't know anything about the doors.
For the Restoration Mod, a "realistic" fix would be for Duppo to demand compensation when the player next talks to him (he probably shouldn't call the guards right away, seeing that he's running an illegal gambling house), and to refuse to buy/sell unless compensation has been given, or until the player successfully blackmails him.
For the patch, though, a simple way to deal with the issue is to set NCR_CRAPS_KNOWN after the door has been successfully forced open with the crowbar. You will need to modify procedure use_obj_on_p_proc in ssCrpDor.ssl, and change the part about dealing with the crowbar, as shown below:
Code:
end else if (Tool == PID_CROWBAR) then begin
script_overrides;
if (dude_strength > 8) then begin
if (stat_success(dude_obj, STAT_st, 0)) then begin
if (local_var(LVAR_Door_Unlocked) == 0) then begin
ncr_set_global_state(NCR_CRAPS_KNOWN);
set_local_var(LVAR_Door_Unlocked, 1);
display_msg(mstr(112));
end else begin
display_msg(mstr(113));
end
end
end else begin
display_msg(mstr(114));
end
end
20. scDuppo.msg contains a couple of minor text errors.
-> Line 112: Extra space between "you" and "don't"
-> Line 128: "Weston" should be "Westin"
22. When you use the mutagenic serum on a super mutant, you get the message: "You gain 1000 experience points for using the Mutagenic Serum." In keeping with the standardization of xp gain messages, lines 101 and 102 can be consolidated into one line (say, line 101) which states: "You used the Mutagenic Serum." Then the relevant part of the code in procedure use_obj_on_p_proc can be updated to use the macro give_xp:
Code:
if (global_var(GVAR_NCR_HENRY_HYPO) < HYPO_USED) then begin
set_global_var(GVAR_NCR_HENRY_HYPO, HYPO_USED);
display_msg(mstr(101));
give_xp(EXP_DOCHENRY_MUTA_TEST);
end
23. When you use the Mutagenic Serum, the message "That does nothing." appears in the display window. I notice that you've inserted a few more script_overrides commands in an attempt to prevent this, but unfortunately this does not work. In fact, it doesn't seem like that use_obj_on_p_proc is even responsible for the "That does nothing." message: if you insert a test display_msg line just before the end of the procedure, the test display_msg text will be displayed in the display window just before the "That does nothing." line. Thus far, I'm inclined to think that this is an unfixable engine bug -- maybe you'll have better luck locating right event handler to overide.
24. If you try to pick the lock on the door to Westin's house, or use a tool on it, Felix (if he's still alive) will give you a warning even if he can't see you at all. Hmm. Then again, this is perhaps not such a surprising result considering the code found in ssFlxDor.ssl has no such check either. The obvious fix is to place the check under the appropriate places in procedure use_skill_on_p_proc and procedure use_obj_on_p_proc, as thus:
Code:
if (i_felix_obj != -1) then begin
if (obj_can_see_obj(i_felix_obj, dude_obj)) then begin
script_overrides;
POSTGLOBALTIMER(i_felix_obj, NCR_TIMER_PLAYER_WARN);
end
end else begin
25. This is similar to the last bug, except only in reverse: if you try to open the door without Felix's permission, you'll find that you can't: the door is locked. However, Felix makes no attempt to warn you off either, which I think is a bug given that he warns you when you try to use a skill on the door or use a tool against the door. The fix is to add a warning code near the beginning of procedure use_p_proc, as thus:
Code:
else if (obj_is_locked(self_obj) or map_var(MVAR_FlxDor_Open) == 0) then begin
script_overrides;
display_msg(mstr(203));
if (i_felix_obj != -1) then begin
if (obj_can_see_obj(i_felix_obj, dude_obj)) then begin
POSTGLOBALTIMER(i_felix_obj, NCR_TIMER_PLAYER_WARN);
end
end
end
26. scHal.msg contains a minor text error: Line 100 has an extra space between "a" and "muscular"
27. Tandi talks about Roger Westin as if he were alive, even if he's dead. The easiest way to stop this is to further check if Westin has bought the farm before presenting the options in the first place. There are two Nodes where this needs to be done: Node007 and Node021. Looking further at the script, the same issue seems to be present for VP Carlson, though I haven't gotten that far in my game yet. Again, a check should be made to see if the vice-president is still around before allowing the option to be displayed.
28. What Tress MacNeille (voice actor for Tandi) says and what the text in shTandi.msg says doesn't quite match up in a few spots. Also, the text seems to be a bit confused in a few spots about the short form for the word "them" ("'em") and the short for "him" ("'im"). Here's the list as far as I can find.
-> Line 136: Change "Your choice" to "Well, your choice"
-> Lines 148, 156, 158: Change "vault" to "Vault" (Upper case is more consistent with rest of the dialog text)
-> Line 193: Change "Lot of folks" to "Lots of folks"
-> Line 208: Change "If you see 'em" to "If you see any of 'em"
-> Line 216: Change "one way or another." to "one way or the other."
-> Line 221: Change "spreads" to "spread's"
-> Line 221 (yes, same line again): Change "you aren't" to "you are not"
-> Line 233: Change "we won't take kindly" to "we don't take kindly" (yes, it's idiomatically incorrect, but it does fit the theme, and that's what Tress said anyhow.)
-> Line 242: Change "Who'd" to "who'd"
-> Line 245: Change "'em" to "'im"
29. scRobo.msg contains a few minor text errors:
-> Lines 1700, 1800, 1900: "too" should be "to"
30. scMikey.msg has a couple of minor text errors:
-> Line 114: "Capice?" should be "Capiche?"
-> Line 118: missing the word "you" after "troubling"
31. ssSign.msg has a minor text error in line 125: "you" should be "your"
New Reno
1. On the 2nd floor of the Shark Club, there is a room with some ammo (10mm AP and .44 Magnum JHP) and leather armor lying on the floor, waiting for the player to pick them up. Actually, there is one more ammo lying on the floor: 10mm JHP. Unfortunately, the stairs leading up to Bishop's room is in the way, so the player can never see this 10mm JHP ammo and pick it up. It should be moved to somewhere accessible to the player.
2. Myron displays a rather unusual level up message when he transitions to stage three. The reason is found in misc.msg, line 9012. The line reads: "I feel a great disturbance in the force. As if all my skills have gained % points." However, the in-game parser inteprets % as a variable and tries to substitute a value for it. The fix is to replace the symbol "%" with the word "percentage", which is what I think Myron is really trying to say.
3. I'm not quite sure if this belongs in the patch or not, since there's a possibility that the developers purposely disabled the feature. I'll simply list the issue and a fix for it, and leave the decision up to you. At the very least, though, it can be useful for your Restoration Pack.
Just like Stuart Little's special comments for selected Prizefighter names, there were supposed to be special comments for selected Pornstar names from the Corsican Brothers as well. Unfortunately, this was not fully implemented -- perhaps Interplay was afraid of the possibility of slander and libel lawsuits from Ron Jeremy?
This is a pity, because the comments (esp. the "bad" special name one) are quite funny to read. To fix this, quite a few steps are needed.
a) The script ncCorBro.ssl gives us no clue as to what the special names are supposed to be, but fortunately, the text file ncCorBro.msg documented the developers' intentions. The special bad comment was supposed to be if the player chooses "Ron Jeremy", while the special good comment is supposed to be for players who choose "Dirk Diggler" or its female equivalent, which is presumably "Amber Waves" -- they are the names of lead characters in the 1997 cult hit
Boogie Nights. Unfortunately, neither "Dirk Diggler" or "Ron Jeremy" is found in newr1.msg, though "Amber Waves" is present (Line 553). So, we need to add "Ron Jeremy" and "Dirk Diggler" to the list of male porn star names. There's plenty of room after line 530 to do so, though personally I'd replace line 503 with "Dirk Diggler" and move the current 503 ("Freddy Barkwood") down in order to make things a bit easier to code. I'd probably also put "Ron Jeremy" closer to the top so that the player has a higher chance of selecting the name and seeing the special comment.
b) In NewReno.h, since the player now has the chance to set up a new porn name more than once, we need to make sure that GVAR_NEW_RENO_PORN_STAR is set to 0 so that the numbers crunch properly. To do that, we need to replace the macro setup_set_porn_star_name with the following:
Code:
#define setup_set_porn_star_name(the_msg, the_node) \
begin \
var_num := GVAR_NEW_RENO_PORN_STAR; \
set_global_var(var_num, 0); \
top_msg := porn_star_msg_start + (50*dude_is_female) + 1; \
stored_msg := the_msg; \
stored_node := the_node; \
call ChooseFromList; \
end
c) In NcCorBro.ssl, change the defines for bad_porn_name and great_porn_name from "(false)" to the following (it's the "false" setting that makes me think that developers deliberately disabled this feature):
Code:
#define bad_porn_name dude_porn_star_number == 31 // assuming you made line 531 "Ron Jeremy" -- replace with appropriate number if this isn't the case.
#define great_porn_name dude_porn_star_number == (50*dude_is_female) + 3 // assuming you made line 503 "Dirk Diggler". Otherwise, you'll need separate conditionals check for "Dirk Diggler" and "Amber Waves" instead of doing it all in one go.
d) Node986 gives the xp bonus, the rep bonus, plus the Pornstar karmic title all in one go, because the player wouldn't be able to return to the node. However, since this is no longer true, we need to move all that somewhere else. So Node986 of ncCorBro.ssl should now look like:
Code:
procedure Node986 begin
if (bad_porn_name and dude_is_male) then begin
call Node031;
end else if (great_porn_name) then begin
call Node032;
end else begin
call Node030;
end
end
e) Put the xp bonus, rep bonus, and the Pornstar karmic title rewards in Node984, as thus:
Code:
procedure Node984 begin
display_mstr(1250);
give_xp(EXP_NEW_RENO_PORN_STAR);
inc_reno_rep(REP_NEW_RENO_PORN_STAR);
call Node987;
end
f) Finally, there is a small bug in Node032 that could allow a line meant for male characters to be displayed to female characters. At the same time, there is an unnecessary flag being set. On top of that, there are two random comments meant for male characters, while only one for female characters. To fix this, add the following line 558 to ncCorBro.msg:
Code:
{558}{}{Now, THAT'S a name so bright and so sharp, that it'll just EXPLODE because it's just so powerful! Good choice, honey-tits, good choice. Now, let's FILM! Lights! Camera! Action!}
Then, change Node032 in ncCorBro.ssl to the following:
Code:
procedure Node032 begin
Reply(random(555 + (2*dude_is_female), 556 + (2*dude_is_female)));
NOption(536, Node984, -003);
NOption(537, Node984, 004);
prev_node := 32;
end
4. Again, this seems like an incomplete implementation of something, so it may be more appropriate in your Restoration Mod. You be the judge.
If you look at lines 1390 and 1406 in ncJules.msg, you were supposed to be able to smell the cologne on Cody's dead body and deduce that Jules is the killer. However, this wassn't implemented, since there is no command anywhere to set the look_cody bit. So lines 1390 and 1406 never gets displayed in a normal game.
What is needed is for a spatial script to be placed on Cody's home tile, and for it to trigger a message like "As you approach Cody's body, the overwhelming scent of Jules' cologne slams into you." Or, if Jules is unknown: "...the overwhelming scent of a distinctive cologne slams into you." At the same time, it will set the look_cody bit. This will enable the player to approach Jules and say lines 1390 or 1406 as desired.