Fallout 2 mod Fallout 1 in Fallout 2

Status
Not open for further replies.

Lexx

Testament to the ghoul lifespan
Moderator
Modder
I'm too stupid to find the original thread(s) right now.

Anyone can tell me what the current status of said project is? Also, where can I download all the sources?

Thanks.



/Edit:
xp-dev repo can be found here.

Status: (based on the original thread)

PROGRESS:
- Skills max 200% instead of 300%.
- 1% skill increase always costs 1 skill point.
- Level max 21 instead of 99.
- Water chip quest in Pipboy (countdown post-it note)
- Added the water warning videos.
- Game now ends with final water video if the timer has run out.

OTHER:
- Started sanitizing code: Replacing raw numbers with defined names, removing atrocious duplicated code, sorting files into custom folders, etc. This is a lot work, but will be worth it in the end.
 
Last edited:
Last commit about 4 years ago. Jesus. Time is running fast.
 
There is a progress status about every feature on the thread. Although, i doubt it is currently active considering sduibek focuse(d) on the fixt.
 
Yeah. I wanted to do some work on it, because why not, but I can't even get the mod to run and I have no idea where I should start to debug. The install instructions are lacking, and / or I missed something.
 
It does not. This is what I did, as written in the other thread:

1. Download all stuff from github
2. Setup the usual Fo2 mod
3. Overwrite all files with the "In-progress version, 2015, by Sduibek" from the first post. (http://www.nma-fallout.com/threads/fo1-to-fo2-conversion-for-real.179809/)
4. Extracted the contents of Fallout1's master and critter dat files as written in the readme file.

I'm pretty sure the last part is the issue, because as much as I remember, Fallout 1 protos aren't the same (byte-wise) as Fallout 2 and whatever else there might be in it.

Also I'm confused why the Fo2 port is using "fallout.exe" and "fallout.cfg" instead of "fallout2.exe" and "fallout2.cfg". I'm guessing some hackery was done here?
 
I vaguely remember getting it launched once, but I might be mistaken. Maybe that was original Jordan's version.
 
I got it to semi-work after removing the fo1 master.dat and critter.dat files. The game is still crashing a lot, though. I'm assuming this is due to 1. there are some missing proto files and 2. other config shit.

Sucks that I basically know nothing about any of this, so lots of trial and error is necessary. Would be easier with @Sduibek around.

/edit: Ok, I fixed one crash issue which was related to sndlist.lst - I deleted all the files for now.
Now I have to figure out why the game is crashing on the worldmap.
 
Last edited:
Ok, double post because why not.

Did some more toying around and setup a new repository. It's on xp-dev, because I'm too lazy for anything git right now. I've started refactoring the scripts a tiny bit - moving them in a different folder structure, adding some header shit, made Vault 15 appear as marked on the map from the start of the game.... It's nothing super fancy at this point. The plan is to move the rest of the scripts into their correct folders whenever I can be arsed.

If anyone downloads the repo files: Install the port like any other Fallout 2 mod. Once done, extract the Fallout 1 master.dat file and copy&paste the art and sound folder into the Fallout1port\data\ folder. Now you can run the game and enjoy the crashing.

About the crashing - I have no idea what is causing this. It happens after a few seconds or after certain events. My suspicion is that it is somehow related to the map_update code. It's not related to the obj_dude script. It's not related to map scripts either. In theory it could be anything... even some missing sfx file (though I actually doubt this).
Actually, I haven't experienced these crashes in the mapper yet, so it might as well be an Sfall issue. In that case, I really don't know what to do. Maybe @NovaRain or anyone else skilled with Sfall could take a look at it?

/edit: There also seem to be proto errors. In some maps critters aren't visible (like Shady Sands westside - Aradesh and Ian) in the mapper. Pretty sure this is causing a crash.

/edit2: Found out the crash bugs are script related. This is fantastic news, because it means I am able to fix it! Makes me very excited. This will be a crunchy weekend, I assume.
 
Last edited:
Well, right now it's just some "toying around". Primary issue are the crash errors. Some of these I really can't explain at all, and I'm not a good enough programmer to figure out why certain stuff happens.

Example:
inven_unwield; will crash the game and just now I found out that game_time_advance is broken too. None of this makes any sense... and I have no clue how to investigate / fix this. Especially because game_time_advance was working before... Already tried to revert and compare, but I can't get it to work anymore. It's driving me crazy. /Edit: At least game_time_advance is fixed now... and I'm exhausted.

I mean, if you're looking at it.. there's really not much left to do. Once worldmap encounters are working, the rest is just tiny tweaks and polishing. The majority of the "hard work" is mostly finished.
 
Last edited:
Status update:
  • I went through everything, compiled everything, made everything work... At this point the game is quite stable for me.
  • Lots of script cleanup has been done by us, primarily by legendary Rotators member Wipe. Exchanging numbers with names, adding defines, etc. to make everything more readable.
  • Started sorting the source scripts into different folders for clarity.
  • Started throwing in some new header files, removing duplicated code (holy fuck there is too much of it)
  • Started removing deprecated code and moving things to Sfall: Perks, skills, etc.
  • Fo1 "Night Person" trait has been restored.
  • Companions can now be pushed "Fallout 2 style" + removed the Fo1 workaround dialog nodes.
  • Various tiny fixes in the maps.
  • Fixed some corrupted proto files.
  • Fixed a few bugs in the game.
  • Moved various things to Sfall global scripts (the weird Holodisk code, as example, which I'm still not sure why it exists in the first place).
  • Added Sfall convenient features: Auto door, item highlighting, and party order mod.
  • Tiny interface graphic tweaks (Fo1 barter interface in "Fo2 style").
  • New premade character graphics (the existing ones were pretty badly converted).
  • Worldmap graphic has been completely redone. The old non-green circle version (I made it a decade ago?) was shit and we don't have to look at it anymore now.
And the best:
  • Worldmap encounter system is working now. We fixed plenty bugs, did more cleanup and implemented a new system to fetch the necessary data. This was a lot work, but thanks to Wipe, it's perfect.
  • Endgame slides are in and working. That means the game can be finished and it's possible to keep playing after the end. Now a thing to note: While it's possible to continue playing, I'm not going to support that "officially" in any kind of way.

If all goes well, we're going to release some sort of non-repository alpha release next weekend. Can't say for sure yet, but that's the plan at least.
 
Last edited:
Status update:
  • I went through everything, compiled everything, made everything work... At this point the game is quite stable for me.
  • Lots of script cleanup has been done by us, primarily by legendary Rotators member Wipe. Exchanging numbers with names, adding defines, etc. to make everything more readable.
  • Started sorting the source scripts into different folders for clarity.
  • Started throwing in some new header files, removing duplicated code (holy fuck there is too much of it)
  • Started removing deprecated code and moving things to Sfall: Perks, skills, etc.
  • Fo1 "Night Person" trait has been restored.
  • Companions can now be pushed "Fallout 2 style" + removed the Fo1 workaround dialog nodes.
  • Various tiny fixes in the maps.
  • Fixed some corrupted proto files.
  • Fixed a few bugs in the game.
  • Moved various things to Sfall global scripts (the weird Holodisk code, as example, which I'm still not sure why it exists in the first place).
  • Added Sfall convenient features: Auto door, item highlighting, and party order mod.
  • Tiny interface graphic tweaks (Fo1 barter interface in "Fo2 style").
  • New premade character graphics (the existing ones were pretty badly converted).
  • Worldmap graphic has been completely redone. The old non-green circle version (I made it a decade ago?) was shit and we don't have to look at it anymore now.
And the best:
  • Worldmap encounter system is working now. We fixed plenty bugs, did more cleanup and implemented a new system to fetch the necessary data. This was a lot work, but thanks to Wipe, it's perfect.
  • Endgame slides are in and working. That means the game can be finished and it's possible to keep playing after the end. Now a thing to note: While it's possible to continue playing, I'm not going to support that "officially" in any kind of way.

If all goes well, we're going to release some sort of non-repository alpha release next weekend. Can't say for sure yet, but that's the plan at least.

That's really quite impressive in such a short time. Did you say several of you are working on it? Would love to have the option to level up past 21 though, given how easy the monsters are in fallout 1 that might be a little over kill.

Will be great to have the ability to control followers in the Fo2 engine. I will miss Ian shooting me in the back though...

Will you be putting in all the missing content that was added in the unofficial patch to Fo1? Do you have any plans to later add anything particular? I assume this means we will be able to edit the maps in the editor? If so I would love to add some detail to them as they were so 'empty' feeling. I'd be happy to spend a few days adding junk and grass to make them feel more detailed if you sent me the maps much like I think it was Pixie(??) did for Fo2 maps. I think I could get a map done after about 3 hours and there isn't that many.
 
That's really quite impressive in such a short time. Did you say several of you are working on it?
We are two people - Wipe and me. Worked on FOnline and FOnline 2238 before, as well as a few other things.

As a base we are using the latest Fixt source I could find. This is what allows us to progress reasonably fast - all the groundwork is already set. We're just fixing it, and adding in the missing bits.

Wouldlove to have the option to level up past 21 though, given how easy the monsters are in fallout 1 that might be a little over kill.
That is possible. By default I have it disabled, but reenabling this is a non-issue (editing draw.ini file).

Will you be putting in all the missing content that was added in the unofficial patch to Fo1?
As Fixt is being used as base, most of that stuff is already in. HOWEVER, I keep the liberty to remove the stuff I loath. If the code is garbage or it triggers any other weird feelings in me... I'll throw it out.

Do you have any plans to later add anything particular?
Actually yes, I do have some plans. Nothing super fancy though, and it will be optional.

In any case, keep in mind that this mod will never be a 1:1 Fallout 1 copy. If you want to play the real deal, you will have to pick up the original. With the latest Sfall for Fo1, it runs as good as Fo2 so this shouldn't be a problem.

I assume this means we will be able to edit the maps in the editor? If so I would love to add some detail to them as they were so 'empty' feeling. I'd be happy to spend a few days adding junk and grass to make them feel more detailed if you sent me the maps much like I think it was Pixie(??) did for Fo2 maps. I think I could get a map doneafter about 3 hours and there isn't that many.
Yes, that is very much possible. I won't do it and I won't add it to the package (I like the original look), but as a separate mod it is easy to do.
If you have an xp-dev account, you can already download the work in progress version from the link in the first post.
 
Last edited:
We are two people - Wipe and me. Worked on FOnline and FOnline 2238 before, as well as a few other things.

As a base we are using the latest Fixt source I could find. This is what allows us to progress reasonably fast - all the groundwork is already set. We're just fixing it, and adding in the missing bits.


That is possible. By default I have it disabled, but reenabling this is a non-issue (editing draw.ini file).


As Fixt is being used as base, most of that stuff is already in. HOWEVER, I keep the liberty to remove the stuff I loath. If the code is garbage or it triggers any other weird feelings in me... I'll throw it out.


Actually yes, I do have some plans. Nothing super fancy though, and it will be optional.

In any case, keep in mind that this mod will never be a 1:1 Fallout 1 copy. If you want to play the real deal, you will have to pick up the original. With the latest Sfall for Fo1, it runs as good as Fo2 so this shouldn't be a problem.


Yes, that is very much possible. I won't do it and I won't add it to the package (I like the original look), but as a separate mod it is easy to do.
If you have an xp-dev account, you can already download the work in progress version from the link in the first post.

Thanks, I'll make an account and have a play on the first few maps for now.
 
Hello Herr Lexx

Back in 2014 I made some fixes, improvements, restorations, etc.

Removed many useless scripts, did merges, reduced variable count. Scripts I've changed all fully sourced. Example of Kane (largest script in whole game):

Code:
procedure start;
procedure look_at_p_proc;
procedure map_enter_p_proc;
procedure critter_p_proc;
procedure pickup_p_proc;
procedure damage_p_proc;
procedure destroy_p_proc;
procedure talk_p_proc;
procedure Node001;
procedure Node002;
procedure Node003;
procedure Node004;
procedure Node005;
procedure Node006;
procedure Node007;
procedure Node008;
procedure Node009;
procedure Node010;
procedure Node011;
procedure Node012;
procedure Node013;
procedure Node014;
procedure Node015;
procedure Node016;
procedure Node017;
procedure Node018;
procedure Node019;
procedure Node020;
procedure Node021;
procedure Node022;
procedure Node023;
procedure Node024;
procedure Node024a;
procedure Node025;
procedure Node026;
procedure Node027;
procedure Node029;
procedure Node030;
procedure Node030a;
procedure Node031;
procedure Node032;
procedure Node033;
procedure Node034;
procedure Node035;
procedure Node036;
procedure Node036a;
procedure Node037;
procedure Node038;
procedure Node039;
procedure Node040;
procedure Node041;
procedure Node042;
procedure Node043;
procedure Node044;
procedure Node045;
procedure Node046;
procedure Node047;
procedure Node048;
procedure Node049;
procedure Node050;
procedure Node051;
procedure Node052;
procedure Node053;
procedure Node054;
procedure Node055;
procedure Node056;
procedure Node057;
procedure Node058;
procedure Node059;
procedure Node060;
procedure Node061;
procedure Node062;
procedure Node063;
procedure Node064;
procedure Node065;
procedure Node066;
procedure Node067;
procedure Node068;
procedure Node069;
procedure Node070;
procedure Node070a;
procedure Node071;
procedure Node072;
procedure Node073;
procedure Node074;
procedure Node075;
procedure Node076;
procedure Node077;
procedure Node078;
procedure Node079;
procedure Node080;
procedure Node081;
procedure Node082;
procedure Node083;
procedure Node084;
procedure Node085;
procedure Node086;
procedure Node087;
procedure Node088;
procedure Node089;
procedure Node090;
procedure Node091;
procedure Node092;
procedure Node093;
procedure Node094;
procedure Node095;
procedure Node998;
procedure Node999;
procedure Hostile;
procedure Travel;
procedure Declined;
procedure NotAccepted;
procedure Refuses;
procedure TakeHike;
procedure Annoyed;
procedure GoToDecker;

variable TravelFlag;

import variable Kane_ptr;
import variable Decker_ptr;

#include ".\HEADERS\COMMAND.H"
#include ".\HEADERS\DEFINE.H"
#include ".\HEADERS\MODREACT.H"
#include ".\HEADERS\HUBDWNTN.H"

#define NAME SCRIPT_KANE

#define LVAR_TALKED_TO_KANE               (4)
#define LVAR_PERSONAL_ENEMY               (5)
#define LVAR_ARMED_BEFORE               (6)
#define LVAR_PAYMENT_STATUS               (7)
#define LVAR_JOB_HEREBEFORE               (8)
#define LVAR_WARNED_BY_KANE               (9)

/*
MVAR_DECKER_JOB_STATUS
1st: 1 (refused); 2 (accepted); 3 (done - to Decker); 4 (done - no Decker)
2nd: 5 (refused); 6 (accepted); 7 (done - to Decker); 8 (done - no Decker)
*/

procedure start begin

end

procedure look_at_p_proc begin
   script_overrides;
   display_msg(mstr(100));
end

procedure map_enter_p_proc begin
   if (map_first_run) then begin
       critter_add_trait(self_obj, TRAIT_OBJECT, OBJECT_TEAM_NUM, TEAM_HUB_UNDERGROUND);
       critter_add_trait(self_obj, TRAIT_OBJECT, OBJECT_AI_PACKET, AI_KANE);
   end
   Kane_ptr := self_obj;
//   set_global_var(GVAR_DECKER_KNOWN, 1);
//   set_local_var(LVAR_TALKED_TO_KANE, 1);
//   set_local_var(LVAR_PAYMENT_STATUS, 1);
//   set_map_var(MVAR_KANE_MEET_DECKER, 1);
//   set_map_var(MVAR_DECKER_JOB_STATUS, 1);
//   set_global_var(GVAR_KILL_MERCHANT, 2);
//   set_global_var(GVAR_KILL_JAIN, 2);
//   set_map_var(MVAR_UNDERGROUND_NO_DEAL, 1);
end

procedure critter_p_proc begin
   if (map_var(MVAR_UNDERGROUND_HOSTILE) == 2) or (local_var(LVAR_PERSONAL_ENEMY) > 0) then begin
       if (obj_can_see_obj(self_obj, local_var(LVAR_PERSONAL_ENEMY))) then begin
           attack(local_var(LVAR_PERSONAL_ENEMY));
       end
       else begin
           set_local_var(LVAR_PERSONAL_ENEMY, dude_obj);
       end
   end
   else begin
       if (TravelFlag == 1) then begin
           TravelFlag := 0;
           call GoToDecker;
       end
       else begin
           if (map_var(MVAR_PLAYER_TRIED_KANE_DOOR) == 1) then begin
               dialogue_system_enter;
           end
       end
   end
end

procedure pickup_p_proc begin
   set_local_var(LVAR_PERSONAL_ENEMY, source_obj);
end

procedure damage_p_proc begin
   if (party_is_source) then begin
       set_local_var(LVAR_PERSONAL_ENEMY, source_obj);
       set_map_var(MVAR_UNDERGROUND_HOSTILE, 2);
   end
end

procedure destroy_p_proc begin
   set_map_var(MVAR_KANE_DEAD, 1);
   if (map_var(MVAR_KANE_DEAD) == 1) and (map_var(MVAR_DECKER_DEAD) == 1) then begin
       set_global_var(GVAR_UNDERGROUND_STATUS, 1);
   end
end

procedure talk_p_proc begin
   if (map_var(MVAR_PLAYER_TRIED_KANE_DOOR) == 1) then begin
       set_map_var(MVAR_PLAYER_TRIED_KANE_DOOR, 0);
       call Node063;
   end
   else begin
       if (map_var(MVAR_UNDERGROUND_NO_DEAL) == 1) and (map_var(MVAR_KANE_MEET_DECKER) == 1) then begin
           if (global_var(GVAR_KILL_MERCHANT) == 2) or (global_var(GVAR_KILL_JAIN) == 2) then begin
               set_map_var(MVAR_UNDERGROUND_NO_DEAL, 0);
           end
       end
       if (map_var(MVAR_UNDERGROUND_HOSTILE) == 1) or (map_var(MVAR_UNDERGROUND_NO_DEAL) == 1) then begin
           call Node012;
       end
       else begin
           if (dude_is_armed) then begin
               call Node050;
           end
           else begin
               if (map_var(MVAR_KANE_MEET_DECKER) != 1) then begin
                   if (global_var(GVAR_KILL_MERCHANT) == 2) or (global_var(GVAR_KILL_JAIN) == 2) then begin
                       set_map_var(MVAR_KANE_MEET_DECKER, 0);
                       set_local_var(LVAR_TALKED_TO_KANE, 2);
                   end
               end
               dialogue_start(-1, -1, -1)
               if (local_var(LVAR_TALKED_TO_KANE) == 0) then begin
                   set_local_var(LVAR_TALKED_TO_KANE, 1);
                   call Node001;
               end
               else begin
                   if (map_var(MVAR_KANE_MEET_DECKER) == 1) then begin
                       if (map_var(MVAR_DECKER_JOB_STATUS) == 4) or (map_var(MVAR_DECKER_JOB_STATUS) == 8) then begin
                           call Node086;
                       end
                       else begin
                           if (map_var(MVAR_DECKER_JOB_STATUS) > 4) and (map_var(MVAR_DECKER_JOB_STATUS) < 8) then begin
                               if (map_var(MVAR_DECKER_JOB_STATUS) == 5) then begin
                                   call Node059;
                               end
                               else begin
                                   if (global_var(GVAR_KILL_JAIN) == 1) then begin
                                       call Node067;
                                   end
                                   else begin
                                       call Node068;
                                   end
                               end
                           end
                           else begin
                               if (map_var(MVAR_DECKER_JOB_STATUS) == 1) and (global_var(GVAR_KILL_MERCHANT) == 2) then begin
                                   if (random(1, 10) < dude_luck) then begin
                                       call Node054;
                                   end
                                   else begin
                                       call Node058;
                                   end
                               end
                               else begin
                                   if (global_var(GVAR_KILL_MERCHANT) == 5) then begin
                                       call Node093;
                                   end
                                   else begin
                                       if (global_var(GVAR_KILL_MERCHANT) == 1) then begin
                                           call Node064;
                                       end
                                       else begin
                                           if (global_var(GVAR_KILL_JAIN) == 2) then begin
                                               call Node059;
                                           end
                                           else begin
                                               call Node065;
                                           end
                                       end
                                   end
                               end
                           end
                       end
                   end
                   else begin
                       if (map_var(MVAR_KANE_MEET_DECKER) == 2) then begin
                           call Node070;
                       end
                       else begin
                           if (map_var(MVAR_KANE_MEET_DECKER) == 5) then begin
                               call Node077;
                           end
                           else begin
                               if (map_var(MVAR_KANE_MEET_DECKER) == 4) then begin
                                   call Node083;
                               end
                               else begin
                                   if (local_var(LVAR_TALKED_TO_KANE) == 1) then begin
                                       call Node049;
                                   end
                                   else begin
                                       if (global_var(GVAR_KILL_MERCHANT) == 2) then begin
                                           call Node051;
                                       end
                                       else begin
                                           if (global_var(GVAR_KILL_JAIN) == 2) then begin
                                               call Node059;
                                           end
                                       end
                                   end
                               end
                           end
                       end
                   end
               end
               dialogue_end
           end
       end
   end
end

procedure Node001 begin
   if (global_var(GVAR_KILLIAN_DEAD) == 0) and (global_var(GVAR_GIZMO_DEAD) == 0) then begin
       if (global_var(GVAR_BERSERKER_REPUTATION) == 1) then begin
           if (dude_is_male) then begin
               Reply(200);
           end
           else begin
               Reply(201);
           end
           call Node002;
       end
       else begin
           if (global_var(GVAR_CHAMPION_REPUTATION) == 1) then begin
               Reply(202);
           end
           else begin
               Reply(203);
           end
           call Node013;
       end
   end
   else begin
       if (global_var(GVAR_KILLIAN_DEAD) == 1) and (global_var(GVAR_GIZMO_DEAD) == 0) then begin
           Reply(204);
       end
       else begin
           if (global_var(GVAR_KILLIAN_DEAD) == 0) and (global_var(GVAR_GIZMO_DEAD) == 1) then begin
               Reply(205);
           end
           else begin
               if (dude_is_female) then begin
                   Reply(206);
               end
               else begin
                   Reply(207);
               end
           end
       end
       call Node002;
   end
end

procedure Node002 begin
   NOption(4, 210, Node004);
   BOption(4, 211, Node006);
//   BOption(4, 212, Node999);
   NOption(4, 213, Node009);
   NOption(4, 214, Declined);
   NOption(-3, 215, Node003);
end

procedure Node003 begin
   NMessage(216);
   call Refuses;
end

procedure Node004 begin
   Reply(220);
   NOption(4, 221, Node005);
   NOption(4, 222, Node008);
   NOption(6, 223, Node011);
   NOption(4, 224, Node010);
end

procedure Node005 begin
   NMessage(225);
   call Travel;
end

procedure Node006 begin
   Reply(230);
   NOption(4, 231, Node004);
   BOption(4, 232, Node007);
end

procedure Node007 begin
   if (dude_is_male) then begin
       Reply(240);
   end
   else begin
       Reply(241);
   end
   BOption(4, 242, Hostile);
   NOption(4, 243, Node004);
   NOption(4, 244, NotAccepted);
end

procedure Node008 begin
   NMessage(245);
   call NotAccepted;
end

procedure Node009 begin
   NMessage(246);
   call NotAccepted;
end

procedure Node010 begin
   Reply(250);
   NOption(4, 251, Node005);
   NOption(4, 252, Declined);
   NOption(4, 253, Node008);
end

procedure Node011 begin
   Reply(260);
   NOption(4, 261, Travel);
   NOption(4, 262, Declined);
   NOption(4, 263, Node008);
end

procedure Node012 begin
   if (local_var(LVAR_WARNED_BY_KANE) < 3) then begin
       inc_local_var(LVAR_WARNED_BY_KANE);
       self_float_msg(random(270, 273), 2);
   end
   else begin
       self_float_msg(274, 2);
       call Node998;
   end
end

procedure Node013 begin
   if (global_var(GVAR_FIND_WATER_CHIP) != 2) then begin
       NOption(4, 280, Node014);
   end
   if (global_var(GVAR_DECKER_KNOWN) == 1) and (map_var(MVAR_DECKER_JOB_STATUS) == 0) then begin
       NOption(4, 281, Node024);
   end
   else begin
       NOption(4, 282, Node020);
   end
//   NOption(4, 283, Node999);
//   NOption(4, 284, Node999);
//   NOption(4, 285, Node999);
   NOption(4, 286, Node017);
   NOption(4, 287, Node999);
   NOption(-3, 299, Node003);
end

procedure Node014 begin
   Reply(290);
   NOption(6, 291, Node015);
   NOption(4, 292, Node016);
   NOption(4, 293, Node049);
   NOption(4, 294, NotAccepted);
end

procedure Node015 begin
   Reply(295);
   call Node013;
end

procedure Node016 begin
   Reply(296);
   call Node013;
end

procedure Node017 begin
   Reply(300);
   NOption(4, 301, Node048);
   NOption(4, 302, Node019);
   NOption(4, 303, Node018);
end

procedure Node018 begin
   Reply(304);
   call Node013;
end

procedure Node019 begin
   BMessage(305);
end

procedure Node020 begin
   Reply(310);
   BOption(4, 311, Node021);
   NOption(4, 312, Node023);
end

procedure Node021 begin
   Reply(320);
   BOption(4, 321, Node022);
   NOption(4, 322, Node023);
end

procedure Node022 begin
   BMessage(323);
   call Hostile;
end

procedure Node023 begin
   Reply(324);
   call Node013;
end

procedure Node024 begin
   Reply(330);
   NOption(4, 331, Node030);
   NOption(4, 332, Node027);
   NOption(4, 333, Node024a);
end

procedure Node024a begin
   if (dude_skill_success(SKILL_CONVERSANT, -15)) then begin
       call Node025;
   end
   else begin
       call Node026;
   end
end

procedure Node025 begin
   if (dude_is_male) then begin
       NMessage(334);
   end
   else begin
       NMessage(335);
   end
   call Travel;
end

procedure Node026 begin
   BMessage(336);
   call TakeHike;
end

procedure Node027 begin
   Reply(340);
   NOption(4, 341, Node030);
   NOption(4, 342, Node029);
end

procedure Node029 begin
   NMessage(343);
   call TakeHike;
end

procedure Node030 begin
   Reply(350);
   if (map_var(MVAR_BETH_STATUS) == 1) then begin
       NOption(4, 351, Node031);
   end
   if (map_var(MVAR_LORENZO_STATUS) == 1) then begin
       NOption(4, 352, Node030a);
   end
   if (global_var(GVAR_LOXLEY_KNOWN) == 1) then begin
       NOption(4, 353, Node036);
   end
   NOption(4, 354, Node034);
   NOption(4, 355, Node033);
end

procedure Node030a begin
   if (map_var(MVAR_LORENZO_INVITE) == 1) then begin
       call Node046;
   end
   else begin
       if (dude_skill_success(SKILL_CONVERSANT, -15)) then begin
           call Node046;
       end
       else begin
           call Node047;
       end
   end
end

procedure Node031 begin
   Reply(360);
   NOption(4, 361, Node032);
   NOption(4, 362, Node035);
end

procedure Node032 begin
   BMessage(363);
   call Annoyed;
end

procedure Node033 begin
   BMessage(364);
   call Annoyed;
end

procedure Node034 begin
   BMessage(365);
   call Hostile;
end

procedure Node035 begin
   NMessage(366);
   call Annoyed;
end

procedure Node036 begin
   Reply(370);
   NOption(4, 371, Node036a);
   NOption(4, 372, Node038);
   BOption(4, 373, Refuses);
   NOption(4, 374, Node037);
end

procedure Node036a begin
   if (dude_skill_success(SKILL_CONVERSANT, 0)) then begin
       call Node039;
   end
   else begin
       call Node042;
   end
end

procedure Node037 begin
   BMessage(375);
   call Refuses;
end

procedure Node038 begin
   NMessage(376);
   call Travel;
end

procedure Node039 begin
   Reply(380);
   NOption(4, 381, Node040);
   NOption(4, 382, Node041);
end

procedure Node040 begin
   BMessage(383);
   call Refuses;
end

procedure Node041 begin
   NMessage(384);
   call Travel;
end

procedure Node042 begin
   Reply(390);
   NOption(4, 391, Node044);
   NOption(4, 392, Node043);
   NOption(4, 393, Node045);
   NOption(4, 394, Node043);
end

procedure Node043 begin
   NMessage(400);
   call Annoyed;
end

procedure Node044 begin
   NMessage(401);
   call Annoyed;
end

procedure Node045 begin
   NMessage(402);
   call Travel;
end

procedure Node046 begin
   NMessage(403);
   call Travel;
end

procedure Node047 begin
   BMessage(404);
   call Refuses;
end

procedure Node048 begin
   if (dude_is_male) then begin
       NMessage(405);
   end
   else begin
       NMessage(406);
   end
end

procedure Node049 begin
   Reply(410);
   call Node013;
end

procedure Node050 begin
   inc_local_var(LVAR_ARMED_BEFORE);
   if (local_var(LVAR_ARMED_BEFORE) == 1) then begin
       self_float_msg(407, 2);
   end
   else begin
       if (local_var(LVAR_ARMED_BEFORE) == 2) then begin
           self_float_msg(408, 2);
       end
       else begin
           if (local_var(LVAR_ARMED_BEFORE) == 3) then begin
               self_float_msg(409, 2);
           end
           else begin
               call Hostile;
           end
       end
   end
end

procedure Node051 begin
   Reply(420);
   BOption(4, 421, Node052);
   BOption(4, 422, Node053);
   BOption(-3, 423, Node057);
end

procedure Node052 begin
   BMessage(424);
   call Hostile;
end

procedure Node053 begin
   BMessage(425);
   call Hostile;
end

procedure Node054 begin
   set_local_var(LVAR_TALKED_TO_KANE, 2);
   set_local_var(LVAR_PAYMENT_STATUS, 2);
   set_map_var(MVAR_DECKER_JOB_STATUS, 4);
   dude_caps_adjust(1500);
   give_exp_points(300);
   display_msg(mstr(110) + 300 + mstr(111));
   Reply(430);
   NOption(4, 431, Hostile);
   NOption(5, 432, Node055);
   BOption(4, 433, Node056);
   BOption(-3, 434, Node057);
end

procedure Node055 begin
   NMessage(435);
   call Travel;
end

procedure Node056 begin
   BMessage(436);
   call Hostile;
end

procedure Node057 begin
   BMessage(437);
   call Hostile;
end

procedure Node058 begin
   BMessage(438);
   call Hostile;
end

procedure Node059 begin
   if (map_var(MVAR_DECKER_JOB_STATUS) < 2) or (map_var(MVAR_DECKER_JOB_STATUS) == 5) then begin
       dude_caps_adjust(1000);
       give_exp_points(350);
       display_msg(mstr(110) + 350 + mstr(111));
       Reply(440);
   end
   else begin
       if (local_var(LVAR_PAYMENT_STATUS) == 1) then begin
           dude_caps_adjust(3500);
           Reply(441);
       end
       else begin
           dude_caps_adjust(4000);
           Reply(442);
       end
       give_exp_points(950);
       display_msg(mstr(110) + 950 + mstr(111));
   end
   BOption(4, 443, Node060);
   BOption(4, 444, Node061);
   BOption(-3, 445, Node062);
end

procedure Node060 begin
   BMessage(446);
   call Hostile;
end

procedure Node061 begin
   BMessage(447);
   call Hostile;
end

procedure Node062 begin
   BMessage(448);
   call Hostile;
end

procedure Node063 begin
   self_float_msg(450, 2);
end

procedure Node064 begin
   inc_local_var(LVAR_JOB_HEREBEFORE);
   if (local_var(LVAR_JOB_HEREBEFORE) == 1) then begin
       set_global_var(GVAR_MARK_HUB_HEIGHTS, 1);
       set_local_var(LVAR_PAYMENT_STATUS, 1);
       dude_caps_adjust(500);
       Reply(460);
   end
   if (local_var(LVAR_JOB_HEREBEFORE) == 2) then begin
       Reply(461);
   end
   if (local_var(LVAR_JOB_HEREBEFORE) == 3) then begin
       Reply(462);
   end
   if (local_var(LVAR_JOB_HEREBEFORE) == 4) then begin
       Reply(463);
   end
   NOption(4, 464, Node087);
   NOption(4, 465, Node999);
   NOption(-3, 466, Node078);
end

procedure Node065 begin
   if (local_var(LVAR_TALKED_TO_KANE) == 1) then begin
       set_local_var(LVAR_TALKED_TO_KANE, 2);
       set_local_var(LVAR_JOB_HEREBEFORE, 0);
       set_map_var(MVAR_DECKER_JOB_STATUS, 3);
       Reply(470);
       NOption(4, 471, Node066);
       NOption(4, 472, Travel);
       NOption(-3, 473, Node066);
   end
   else begin
       call Node066;
   end
end

procedure Node066 begin
   if (local_var(LVAR_PAYMENT_STATUS) == 1) then begin
       dude_caps_adjust(2500);
       NMessage(474);
   end
   else begin
       dude_caps_adjust(3000);
       NMessage(475);
   end
   give_exp_points(600);
   display_msg(mstr(110) + 600 + mstr(111));
   set_local_var(LVAR_PAYMENT_STATUS, 2);
   set_map_var(MVAR_DECKER_JOB_STATUS, 4);
end

procedure Node067 begin
   inc_local_var(LVAR_JOB_HEREBEFORE);
   if (local_var(LVAR_JOB_HEREBEFORE) == 1) then begin
       if (local_var(LVAR_PAYMENT_STATUS) == 2) then begin
           dude_caps_adjust(1000);
           Reply(480);
       end
       else begin
           if (local_var(LVAR_PAYMENT_STATUS) == 1) then begin
               Reply(481);
               dude_caps_adjust(3500);
           end
           else begin
               Reply(482);
               dude_caps_adjust(4000);
           end
           display_msg(mstr(110) + 600 + mstr(111));
       end
       set_global_var(GVAR_MARK_HUB_WATER_MERCHANTS, 1);
       set_local_var(LVAR_PAYMENT_STATUS, 3);
   end
   if (local_var(LVAR_JOB_HEREBEFORE) == 2) then begin
       Reply(483);
   end
   if (local_var(LVAR_JOB_HEREBEFORE) == 3) then begin
       Reply(484);
   end
   if (local_var(LVAR_JOB_HEREBEFORE) == 4) then begin
       Reply(485);
   end
   NOption(4, 486, Node087);
   NOption(4, 487, Node999);
   NOption(-3, 488, Node999);
end

procedure Node068 begin
   if (local_var(LVAR_TALKED_TO_KANE) == 2) then begin
       set_local_var(LVAR_TALKED_TO_KANE, 3);
       set_local_var(LVAR_JOB_HEREBEFORE, 0);
       set_map_var(MVAR_DECKER_JOB_STATUS, 7);
       Reply(490);
       NOption(4, 491, Node069);
       NOption(4, 492, Travel);
       NOption(-3, 493, Node069);
   end
   else begin
       call Node069;
   end
end

procedure Node069 begin
   variable ExperiencePoints;
   if (local_var(LVAR_PAYMENT_STATUS) == 3) then begin
       dude_caps_adjust(4000);
       ExperiencePoints := 700;
       NMessage(494);
   end
   else begin
       if (local_var(LVAR_PAYMENT_STATUS) == 2) then begin
           dude_caps_adjust(5000);
           ExperiencePoints := 700;
           NMessage(495);
       end
       else begin
           if (local_var(LVAR_PAYMENT_STATUS) == 1) then begin
               dude_caps_adjust(7500);
               ExperiencePoints := 1300;
               NMessage(496);
           end
           else begin
               dude_caps_adjust(8000);
               ExperiencePoints := 1300;
               NMessage(497);
           end
       end
   end
   give_exp_points(ExperiencePoints);
   display_msg(mstr(110) + ExperiencePoints + mstr(111));
   set_map_var(MVAR_DECKER_JOB_STATUS, 8);
end

procedure Node070 begin
   Reply(500);
   NOption(4, 501, Node072);
   BOption(4, 502, Node089);
   NOption(4, 503, Node070a);
   BOption(4, 504, Node090);
   NOption(-3, 505, Node071);
end

procedure Node070a begin
   if (dude_skill_success(SKILL_CONVERSANT, 0)) then begin
       call Node091;
   end
   else begin
       call Node092;
   end
end

procedure Node071 begin
   NMessage(506);
   call TakeHike;
end

procedure Node072 begin
   Reply(510);
   BOption(4, 511, Node075);
   BOption(4, 512, Node076);
   BOption(4, 513, Node074);
   BOption(4, 514, Node075);
   if (map_var(MVAR_BETH_TALKED_ABOUT_FRIEND) == 1) then begin
       BOption(4, 515, Node073);
   end
end

procedure Node073 begin
   BMessage(516);
   call Hostile;
end

procedure Node074 begin
   BMessage(517);
   call Annoyed;
end

procedure Node075 begin
   BMessage(518);
   call TakeHike;
end

procedure Node076 begin
   BMessage(519);
   call Hostile;
end

procedure Node077 begin
   Reply(520);
   BOption(4, 521, Node080);
   NOption(4, 522, Node079);
   BOption(4, 523, Node081);
   NOption(4, 524, Node082);
   NOption(-3, 525, Node078);
end

procedure Node078 begin
   NMessage(530);
end

procedure Node079 begin
   NMessage(531);
   call Travel;
end

procedure Node080 begin
   BMessage(532);
   call Hostile;
end

procedure Node081 begin
   BMessage(533);
   call Hostile;
end

procedure Node082 begin
   BMessage(534);
   call Hostile;
end

procedure Node083 begin
   Reply(540);
//   NOption(4, 541, Node999);
   if (map_var(MVAR_LORENZO_INVITE) == 1) then begin
       NOption(4, 542, Node046);
   end
   else begin
       NOption(4, 543, Node085);
   end
   NOption(4, 544, Node999);
   NOption(-3, 545, Node078);
end

procedure Node084 begin
   NMessage(random(550, 554));
   call Travel;
end

procedure Node085 begin
   NMessage(555);
   call TakeHike;
end

procedure Node086 begin
   Reply(560);
   if (map_var(MVAR_DECKER_JOB_STATUS) < 5) then begin
       NOption(4, 561, Node084);
   end
   NOption(4, 562, Node999);
   NOption(-3, 563, Node078);
end

procedure Node087 begin
   Reply(580);
   NOption(4, 581, Node088);
   NOption(4, 582, Hostile);
end

procedure Node088 begin
   NMessage(583);
end

procedure Node089 begin
   BMessage(584);
   call Hostile;
end

procedure Node090 begin
   BMessage(585);
   call Hostile;
end

procedure Node091 begin
   NMessage(586);
   call Travel;
end

procedure Node092 begin
   NMessage(587);
   call TakeHike;
end

procedure Node093 begin
   Reply(590);
   NOption(4, 591, Node094);
   NOption(-3, 592, Node094);
end

procedure Node094 begin
   Reply(593);
   NOption(4, 594, Node095);
   NOption(-3, 595, Node095);
end

procedure Node095 begin
   BMessage(596);
   call Hostile;
end

procedure Node998 begin
   set_map_var(MVAR_UNDERGROUND_HOSTILE, 2);
   set_local_var(LVAR_PERSONAL_ENEMY, dude_obj);
end

procedure Node999 begin

end

procedure Hostile begin
   set_map_var(MVAR_UNDERGROUND_NO_DEAL, 1);
   set_map_var(MVAR_UNDERGROUND_HOSTILE, 1);
end

procedure Travel begin
   set_map_var(MVAR_KANE_MEET_DECKER, 1);
   TravelFlag := 1;
end

procedure Declined begin
   set_map_var(MVAR_KANE_MEET_DECKER, 2);
end

procedure NotAccepted begin
   set_map_var(MVAR_KANE_MEET_DECKER, 3);
end

procedure Refuses begin
   set_map_var(MVAR_KANE_MEET_DECKER, 4);
end

procedure TakeHike begin
   set_map_var(MVAR_KANE_MEET_DECKER, 5);
end

procedure Annoyed begin
   set_map_var(MVAR_KANE_MEET_DECKER, 6);
end

procedure GoToDecker begin
   fadeout(1000);
   move_to(self_obj, 22526, 1);
   move_to(dude_obj, 23722, 1);
   anim(self_obj, 1000, rotation_to_tile(self_tile, tile_num(Decker_ptr)));
   anim(dude_obj, 1000, rotation_to_tile(dude_tile, tile_num(Decker_ptr)));
   fadein(1000);
end

talk_p_proc has been rewritten to include few options. IIRC, to not force player to go to Decker, thus restore some dialogues.

Of course, they are only compatible with my own headers/defines. Because why not.
 
Last edited:
This looks quite clean. I wish all the code would look like that. Some is really disgusting.. especially considering how long people are working on it already. Seriously, at times I'm curious if the concept of defines and macros was lost somewhere along the way.

I started working on porting the companions over to the Fo2 way of doing things, but had to revert mid-way. There are some serious bugs which I still have to pin down. It's really annoying... a part of me kinda expected to get all the companions done today...

Do you have stuff like a list of all teams, etc? That would be useful.
 
Sure - teams, maps, scripts, itempid, global, critrpid, aipacket, and extra hubdwnt.

GLOBAL.H has my comments here or there, like:
Code:
// Random Encounters

#define GVAR_WATER_THIEF_2                   (289)   // DUC.INT is hurt
#define GVAR_SAVE_TANDI_2                   (331)   // DUC.INT is dead
#define GVAR_SAVE_TANDI_4                   (333)   // DUC.INT is known

// Unused
#define GVAR_GENERIC_FILLER_20               (257)   // SHERRY/LARS
#define GVAR_DESTROY_MASTER_6               (310)   // VREE/MASTER
Where unnamed GVARS I've spotted are used. Unused with some use would be later named properly and moved to correct place.


It includes my own GVARS like here:
Code:
// Specific
#define GVAR_SOURCE_POINTER                   (340)
#define GVAR_OBJECT_POINTER                   (341)
#define GVAR_KATJA_PICKS_THE_LOCK           (342)

It's sorted by:

- // World Map Locations
- // Location's Map
- // Quests Status
- // Locations (i.e. Hub, Junktown, etc.)
- etc.


SCRIPTS.H has:
Code:
//#define SCRIPT_MANGLED   (83)   // RESERVED

This means unused script or script I wiped out (218 entries - hi hi hi).


"///" means:
Code:
#define SCRIPT_MICHELLE       (283)   /// [DONE] Michelle, leader of the Blades' scouts

Script that has been cut by devs.





As for editing Fallout maps:

https://imgur.com/y32vAxw <-- Cathedral on one map (where's the rest of roof?)
https://imgur.com/FxjfC4y <-- Junktown Entrance
https://imgur.com/En2zuSN <-- Junktown Cassino
https://imgur.com/twD1VGZ <-- Hub Downtown in night

+ I changed more of them.
 

Attachments

Last edited:
Status
Not open for further replies.
Back
Top