Hello to all. After not indulging in Fallout 2 for some time, I recently started a new game and played to New Reno before stopping to make some under-the-hood changes. As part of that process, I downloaded the RP 2.1.2b manual install package and looked through the contents to see if there were any updates I desired (my installation is too customized to consider a full upgrade at this point). I checked in some detail while updating some of my files, and the problems below from 1.02d or RP 2.0 are still present in the RP 2.1.2b. I haven't been following the forum for some time
, and though I did a cursory search I apologize if any of these problems have already been reported:
1) From "Restoration Project Corrections.txt" (2.1.2 section):
• Hacking into overseer logs always succeeded, as there is no roll against skill there. It now correctly does a science check.
Well, er, hmm...
A science check is sometimes performed-- though likely not of the sort intended. Further changes to oscomptr.int seem prudent:
Code:
procedure Node029
begin
op_gsay_reply(524, 300);
op_giq_option(1, 524, 301, @Node009, 50);
op_giq_option(1, 524, 302, @Node901, 50);
op_giq_option(1, 524, 303, @Node999, 50);
end
procedure Node901
begin
if (op_has_skill(op_dude_obj(), 12) < 80) then
call Node030();
else
call Node032();
end
2) nhMyron.msg:
Code:
{921}{}{What about using some kind of endorphin blocker? That would repress the chemical and psychological addition, wouldn't it?}
should be:
Code:
{921}{}{What about using some kind of endorphin blocker? That would repress the chemical and psychological addiction, wouldn't it?}
3) In scrname.msg the guard dog at the Slaver Camp is listed as "dog," resulting in messages such as:
dog was hit in the head for 7 points, right across the snout.
In other words, scrname.msg should be changed:
Code:
{1465}{}{Dog} # slvcc3.int ; guard dog on Slaver Map
4) kcitizen.msg:
Code:
{157}{}{Why don't you go back to the golden gecko?}
should be:
Code:
{157}{}{Why don't you go back to the Golden Gecko?}
5) kchild.msg:
Code:
{183}{}{I bet you do to bathe.}
should be:
{183}{}{I bet you do too bathe.} or
{183}{}{I bet you do so bathe.}
6) The ancient problem with Lumpy from the Gecko Junkyard-- he
always says "Skeeter's standing right here beside us, you knucklehead," regardless of whether the Lumpster is loitering in Skeeter's workshop, lounging at his luxurious bachelor pad, or leaning on the fence out back while leering lasciviously at the brahmin-- is in gclumpy.int's frankly bizarre node017, and could be solved in several ways (all of which would be equally effective). Since Lumpy's talk_p_proc calls the "checkarea" procedure each time the former runs, I recommend simply rewriting node017 (since everything currently there is spurious) as:
Code:
procedure Node017
begin
if (area == 2) then
op_gsay_reply(135, 270);
else
op_gsay_reply(135, 271);
op_giq_option(4, 135, 172, @Node014, 50);
op_giq_option(4, 135, 272, @Node999, 50);
end
Either Lumpy is within twelve tiles of Skeeter or Lumpy is not within twelve tiles of Skeeter; since the "area" variable (whose states are 0 and 1 or 2, based on Lumpy's current tile) is already reset each time one speaks with Lumpy, this seems foolproof to me. Another way to solve the problem might be to put a check for whether Lumpy can see Skeeter into several dialogue nodes (= same result but much more work). I think there has been some misunderstanding regarding this problem in the past, as various efforts at resolution worked to reduce Lumpy's mobility rather than correct his dialogue.
An additional problem with Lumpy is that the player-character is nearly coerced into insipidly pestering Lumpy in regard to "where is Skeeter? Where is he? WHEREWHEREWHERETELLMENOW!" before at all knowing "Who is Skeeter?" or having actually met the putrefied grease-monkey. I think this is nonsensical, and further evidence that whoever wrote the Lumpy script back in the day at BIS was daft indeed. In any case, conversation with Lumpy flows much more rationally and naturally if two additional nodes are rewritten as:
Code:
procedure Node006
begin
op_gsay_reply(135, 160);
op_giq_option(-3, 135, 161, @Node01a, 50);
op_giq_option(4, 135, 163, @Node014, 50);
op_giq_option(4, 135, 164, @Node999, 50);
end
procedure Node014
begin
if (visit_14_before == 0) then
begin
visit_14_before := 1;
op_gsay_reply(135, 240);
end
else if (visit_14_before == 1) then
begin
visit_14_before := 2;
op_gsay_reply(135, 241);
end
else
op_gsay_reply(135, 242);
op_giq_option(4, 135, 243, @Node016, 50);
op_giq_option(4, 135, 244, @Node007, 50);
op_giq_option(4, 135, 246, @Node018, 50);
end
One further problem with Lumpy's files related to this issue is that no consideration is anywhere given to whether or not Skeeter has met an with an untimely denouement-- though really, what kind of black-hearted SOB would harm a geriatric ghoul with a nifty nickname? A thorough resolution of this final Lumpy problem might then perhaps include writing an additional line of dialogue for gclumpy.msg and adding an additional check in gclumpy.int to address such potentialities. Since Lumpy and Skeeter are pals, surely Lumpy (who is characterized as at best rather neurotic, after all) ought know if Skeeter is dead or has been missing for some time rather than muttering "Duhr, Skeeter? I dunno."
7) If the player-character is an NCR Ranger and meets other NCR Rangers in a random encounter, whilst chatting the npc may introduce himself or herself by name. The problem here is that all NCR Ranger npcs in random encounters are named "Ezekiel" regardless of whether they are male or female; the relatively simple fix is to change node007 of ecranger.int and add one new line to ecranger.msg:
Code:
script:
procedure Node007
begin
if (op_obj_pid(op_self_obj()) == 16777477) then
op_gsay_reply(485, 123);
else
op_gsay_reply(485, 130);
op_giq_option(1, 485, op_obj_name(op_dude_obj()), @Node008, 49);
op_giq_option(1, 485, 124, @Node009, 50);
end
msg:
{130}{}{Greetings, stranger. I'm Zipporah of the NCR Rangers. And you are?}
I chose "Zipporah" as the name for female rangers only because it was the first female biblical name (to match the male "Ezekiel") that came to mind when I made this fix; any female name could of course be used instead. Although I thought others (perhaps MIB88?) had fixed this problem in some way in the past (which is to say, likely in some more thoughtful way than I), I couldn't find any such fix amongst my various mod archives just now while looking into the matter.
8) There are a number of problems with Goris' script (ocgoris.int), due to particularly noteworthy negligence by whomever originally wrote the script at BIS (what else is new?). Rather than offer a litany of errors, I'll say instead the good news is that most of the problems in ocgoris are solidly hidden by other problems, and thus will never be expressed to the player (nor do they interfere with anything else in the game). In an ideal world, ocgoris should be rewritten from scratch-- but I doubt any of us have time for such efforts. Therefore we can say in practical terms the trouble with ocgoris is at least twofold:
a) Stupid characters (IN < 4) will still likely see "ERROR" under some circumstances when asking Goris to rejoin the party. The best ways to put a sturdy band-aid on this problem are either to add a currently missing line {1007} to ocgoris.msg (perhaps "Want Goris help!") or to change dialogue calls referencing line 1007 to instead use line 1016 of ocgoris.msg ("Let's go.")
b) Perhaps someone tried to patch the remaining problem before, since ocgoris.msg contains two nearly identical lines:
{206}{}{You're a Deathclaw? Is there a reason you didn't mention this to me?}
{1017}{}{You're a Deathclaw? Is there a reason you didn't mention this to me before?}
These lines are not treated interchangeably in the script, however; their usage leads me to believe that two separate people worked on Goris at various times-- and that they both got everything wrong. The player can never possibly see either of these disparate lines due to errors with local variable usage, and therefore the intended conversation in ocgoris.int nodes 021 and 022 can never occur:
Chosen One:
You're a Deathclaw? Is there a reason you didn't mention this to me? -or-
(if IN < 4) You bad thing! Why no tell?
Goris:
I'm sorry to have deceived you, but humans have a habit of shooting Deathclaws on sight. I felt
that it would be to my advantage to hide my identity until you could see for yourself that I am on your
side in this venture. If you want me to leave, I'll do so. But I would rather stay and help you on your
quest. I want to show that humans and Deathclaws can work together as friends, not enemies.
-or-
(pc IN < 4) How do I put this... Bad thing you kill, no talk. Me not tell you so you see me good thing. Not
kill me. Okay me stay with you?
etc
There are also two unused procedures in ocgoris.int that I think someone believed were internal engine calls and would indeed have eliminated this problem; perhaps I'm mistaken, but alas I don't recall ever seeing such phrases (combat_is_starting_p_proc and combat_is_over_p_proc) used that way before. The alternative is that two procedures were written (one of them empty) and then just forgotten. In any case on the chance that some remnant of a half-hearted buggy function is indeed haunting the game's internal logic I recommend fixing this problem once and for all with a sledgehammer rather than a scalpel by making but one change to ocgoris.int:
Code:
procedure map_enter_p_proc
begin
Only_Once := 0;
if ((op_local_var(8) == 0) and (op_party_member_obj(16777368) != 0)) then
begin
op_set_local_var(8, 1);
end
if ((op_cur_map_index() == 19) or (op_cur_map_index() == 37) or (op_cur_map_index() == 38)) then
begin
if ((op_elevation(op_self_obj()) != op_elevation(op_dude_obj())) and (op_local_var(9) != 0)) then
op_move_to(op_self_obj(), op_tile_num(op_self_obj()), op_elevation(op_dude_obj()));
end
if (not(op_party_member_obj(16777368) != 0)) then
op_critter_add_trait(op_self_obj(), 1, 6, 114);
else
op_critter_add_trait(op_self_obj(), 1, 6, 0);
op_add_timer_event(op_self_obj(), op_random(25, 40), 900);
end
Surely not at all subtle, nor hardly ideal, but since I've not seen these dialogue lines in-game in nearly fifteen years of play I think this solution has if nothing else the merit of being decisive. After all, though I'm sure most of us strive to use our imaginations to separate player knowledge from character knowledge while playing for the -nth time, the truth is that after all these years no one is going to say "OMG! Goris a deathclaw?! But dude, deathclaws can't talk!?!?!" (good thing some of the old-timers aren't around the forum anymore, or that last phrase would surely engender numerous visceral rants and vituperative tirades spanning at least the next ten full pages of this discussion). In any case, this solution resolves the problem while leaving the many erroneous parts of the script to continue silently moldering away, never expressed (in other words, let's allow sleeping dogs their slumber). The player must a) get Goris to join his party, and b) travel to a new map (thus presumably deducing Goris' true nature during the trip between map A and map B regardless of whether combat occurs and Goris takes off his robe) to have the conversation one time (after which the matter will not be discussed again with Goris, as originally intended).
If one finds the above solution inadequate/inelegant and would like to make a more thorough reorganization of Goris' script, a necessary change easily overlooked amongst the sprawl would be:
Code:
procedure Node021
begin
op_gsay_reply(547, op_msg_string(547, 204) + " " + op_obj_name(op_dude_obj()));
op_giq_option(-3, 547, 205, @Node022, 50);
op_giq_option(4, 547, 206, @Node022, 50);
end
Such a change (as well as several others) is unnecessary if using the map_enter solution I proposed above, as in that case node021 remains obscured in all circumstances.
********
The end of a long and arduous journey is at last conceivable-- if not already in sight. To killap and the RP team (as well as the many others in the community who have dilligently endeavored over the years to bring us out of the FO2 Dark Ages when anything less than a CTD main course with a corrupted save-game dessert was considered mere trivia)-- keep up the great work, and thanks for all that has been accomplished.
Endocore