Fallout 2 mod Fallout 1 in Fallout 2

Discussion in 'Fallout General Modding' started by Lexx, Jul 12, 2019.

Thread Status:
Not open for further replies.
  1. Lexx

    Lexx Background Radiant
    Moderator

    Apr 24, 2005
    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: Jul 29, 2019
    • [Rad] [Rad] x 1
  2. burn

    burn Mildly Dipped
    Modder

    506
    Apr 22, 2012
  3. Lexx

    Lexx Background Radiant
    Moderator

    Apr 24, 2005
    Last commit about 4 years ago. Jesus. Time is running fast.
     
  4. naossano

    naossano So Old I'm Losing Radiation Signs

    Oct 19, 2006
    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.
     
  5. Lexx

    Lexx Background Radiant
    Moderator

    Apr 24, 2005
    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.
     
  6. burn

    burn Mildly Dipped
    Modder

    506
    Apr 22, 2012
    There's a "playable version" link, does it not work, too?
     
  7. Lexx

    Lexx Background Radiant
    Moderator

    Apr 24, 2005
    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?
     
  8. burn

    burn Mildly Dipped
    Modder

    506
    Apr 22, 2012
    I vaguely remember getting it launched once, but I might be mistaken. Maybe that was original Jordan's version.
     
  9. Lexx

    Lexx Background Radiant
    Moderator

    Apr 24, 2005
    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: Jul 18, 2019
  10. Lexx

    Lexx Background Radiant
    Moderator

    Apr 24, 2005
    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: Jul 19, 2019
  11. Oracle

    Oracle Water Chip? Been There, Done That

    919
    May 19, 2003
    GL Lexx!
    Im amazed that after all those years, the F1&2 had still being worked so hard on! Is @Sduibek also still working on FO?
     
  12. Lexx

    Lexx Background Radiant
    Moderator

    Apr 24, 2005
    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: Jul 20, 2019
  13. Oracle

    Oracle Water Chip? Been There, Done That

    919
    May 19, 2003
    wow man, thats awesome!
     
  14. Lexx

    Lexx Background Radiant
    Moderator

    Apr 24, 2005
    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: Jul 25, 2019
    • [Rad] [Rad] x 3
  15. Nineeva

    Nineeva First time out of the vault

    68
    Aug 20, 2009
    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.
     
    • [Rad] [Rad] x 1
  16. Lexx

    Lexx Background Radiant
    Moderator

    Apr 24, 2005
    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.
     
    Last edited: Jul 26, 2019
    • [Rad] [Rad] x 1
  17. Nineeva

    Nineeva First time out of the vault

    68
    Aug 20, 2009
    Thanks, I'll make an account and have a play on the first few maps for now.
     
  18. Continuum

    Continuum Vault Fossil

    Nov 8, 2006
    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: Jul 26, 2019
    • [Rad] [Rad] x 1
  19. Lexx

    Lexx Background Radiant
    Moderator

    Apr 24, 2005
    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.
     
  20. Continuum

    Continuum Vault Fossil

    Nov 8, 2006
    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.
     

    Attached Files:

    Last edited: Jul 26, 2019
    • [Rad] [Rad] x 1
Thread Status:
Not open for further replies.