Fallout 2 mod Fallout 1 in Fallout 2

Status
Not open for further replies.
Thanks, I've updated my files with some of that stuff.


Also I just realized that the whole master / vats destruction video, etc. stuff wasn't done. So I've spend the last few hours on trying to get it right... Due to this and some other things, it now seems quite unlikely that I can wrap up some sort of alpha build this weekend. Sucks, but I can't help it.
 
Differences in protos: IIRC, conversion to 416 bytes makes them working in both engines.

Some mess you can clean up:

a) in Fallout all stairs, ladders, etc. that take to another level or map have a single script attached to it. IIRC, in Fallout 2 you can write data directly in Mapper.

In my sandbox I made a single script to cut down that ridiculous number of them + to keep all stuff is in one place:

Code:
procedure start;
procedure use_p_proc;

import variable Ian_ptr;
import variable Dog_ptr;
import variable Tycho_ptr;
import variable Katja_ptr;

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

#define NAME SCRIPT_GENSTAIR

procedure start begin

end

procedure use_p_proc begin
   script_overrides;
   if (map_is(MAP_JUNKTOWN_ENTRANCE)) then begin
       // MORBID'S HIDEOUT
       if (self_is(obj_on_map(13099, 0, PID_LADDER3_DN))) then begin
           /*
           if (combat_is_initialized) then begin
               critter_stop_attacking(source_obj);
           end
           */
           move_to(source_obj, 12498, 1);
       end
       if (self_is(obj_on_map(12298, 1, PID_LADDER1_UP))) then begin
           move_to(source_obj, 12898, 0);
       end
   end
   if (map_is(MAP_HUB_DOWNTOWN)) then begin
       // DECKER'S HIDEOUT
       if (self_is(obj_on_map(25943, 0, PID_STAIRS1_DN))) then begin
           move_to(source_obj, 25927, 1);
       end
       if (self_is(obj_on_map(25520, 1, PID_STAIRS1_UP))) then begin
           move_to(source_obj, 25740, 0);
       end
   end
   if (map_is(MAP_HUB_OLDTOWN)) then begin
       // THIEVES' CIRCLE
       if (self_is(obj_on_map(18878, 0, PID_STAIRS1_DN))) then begin
           move_to(source_obj, 20482, 1);
       end
       if (self_is(obj_on_map(19878, 1, PID_STAIRS1_UP))) then begin
           move_to(source_obj, 19278, 0);
       end
   end
   if (map_is(MAP_NECROPOLIS_HALL)) then begin
       // NORTH
       if (self_is(obj_on_map(17074, 1, PID_LADDER1_DN))) then begin
           move_to(source_obj, 15891, 0);
       end
       if (self_is(obj_on_map(15488, 0, PID_LADDER1_UP))) then begin
           move_to(source_obj, 17074, 1);
       end
       // SOUTH
       if (self_is(obj_on_map(28276, 1, PID_LADDER1_DN))) then begin
           move_to(source_obj, 27097, 0);
       end
       if (self_is(obj_on_map(26694, 0, PID_LADDER1_UP))) then begin
           move_to(source_obj, 28276, 1);
       end
   end
   if (map_is(MAP_NECROPOLIS_WATERSHED)) then begin
       // SOUTH
       if (self_is(obj_on_map(26656, 1, PID_LADDER1_DN))) then begin
           move_to(source_obj, 24058, 0);
       end
       if (self_is(obj_on_map(23858, 0, PID_LADDER1_UP))) then begin
           move_to(source_obj, 26857, 1);
       end
       // FROM WATERSHED TO VAULT
       if (self_is(obj_on_map(18658, 1, PID_LADDER1_DN))) then begin
           move_to(source_obj, 19653, 0);
       end
       if (self_is(obj_on_map(19052, 0, PID_LADDER1_UP))) then begin
           move_to(source_obj, 19057, 1);
       end
       // TO VAULT
       if (self_is(obj_on_map(20053, 0, PID_MANHOLE))) then begin
           load_map("VAULTNEC.MAP", 12);
       end
   end
   if (map_is(MAP_LA_ADYTUM)) then begin
       // STORE
       if (self_is(obj_on_map(11515, 0, PID_LADDER2_DN))) then begin
           move_to(source_obj, 11715, 1);
       end
       if (self_is(obj_on_map(11315, 1, PID_LADDER1_UP))) then begin
           move_to(source_obj, 11915, 0);
       end
       // ZIMMERMAN'S CELL
       if (self_is(obj_on_map(17110, 0, PID_LADDER1_DN))) then begin
           move_to(source_obj, 17111, 1);
       end
       if (self_is(obj_on_map(16911, 1, PID_LADDER1_UP))) then begin
           move_to(source_obj, 17312, 0);
       end
       // FARM
       if (self_is(obj_on_map(23119, 0, PID_LADDER2_DN))) then begin
           move_to(source_obj, 23521, 1);
       end
       if (self_is(obj_on_map(23121, 1, PID_LADDER1_UP))) then begin
           move_to(source_obj, 23519, 0);
       end
   end
   if (map_is(MAP_LA_RIPPERS)) then begin
       // STAIR
       if (self_is(obj_on_map(13686, 0, PID_STAIRS1_DN))) then begin
           move_to(source_obj, 14495, 1);
       end
       if (self_is(obj_on_map(13888, 1, PID_STAIRS1_UP))) then begin
           move_to(source_obj, 14283, 0);
       end
       // TANGLER'S ROOM
       if (self_is(obj_on_map(19478, 0, PID_LADDER1_DN))) then begin
           move_to(source_obj, 19678, 1);
       end
       if (self_is(obj_on_map(19278, 1, PID_LADDER1_UP))) then begin
           move_to(source_obj, 19879, 0);
       end
   end
   /*
   if (map_is(MAP_LA_GUN_RUNNERS)) then begin

   end
   */
   if (map_is(MAP_LA_FOLLOWERS)) then begin
       if (self_is(obj_on_map(15069, 0, PID_STAIRS1_DN))) then begin
           move_to(source_obj, 15072, 1);
       end
       if (self_is(obj_on_map(15066, 1, PID_STAIRS1_UP))) then begin
           move_to(source_obj, 15268, 0);
       end
   end
   if (map_is(MAP_CATHEDRAL)) then begin
       // FROM HALL TO MASTER'S LAIR
       if (self_is(obj_on_map(12108, 0, PID_STAIRS2_DN))) then begin
           load_map("MSTRLR12.MAP", 0);
       end
       // FROM HALL TO TOWER
       if (self_is(obj_on_map(12678, 0, PID_STAIRS2_UP))) then begin
           load_map("CHILDRN2.MAP", 0);
       end
   end
   if (map_is(MAP_CATHEDRAL_TOWER)) then begin
       // FROM LEVEL 1 TO HALL
       if (self_is(obj_on_map(18894, 0, PID_STAIRS2_DN))) then begin
           load_map("CHILDRN1.MAP", 4);
       end
       // FROM LEVEL 1 TO LEVEL 2
       if (self_is(obj_on_map(19096, 0, PID_STAIRS2_UP))) then begin
           move_to(source_obj, 19101, 1);
       end
       // FROM LEVEL 2 TO LEVEL 1
       if (self_is(obj_on_map(18894, 1, PID_STAIRS2_DN))) then begin
           move_to(source_obj, 19101, 0);
       end
       // FROM LEVEL 2 TO LEVEL 3
       if (self_is(obj_on_map(19096, 1, PID_STAIRS2_UP))) then begin
           move_to(source_obj, 19294, 2);
       end
       // FROM LEVEL 3 TO LEVEL 2
       if (self_is(obj_on_map(18894, 2, PID_STAIRS2_DN))) then begin
           move_to(source_obj, 19101, 1);
       end
   end
   if (map_is(MAP_MASTERS_LAIR_12)) then begin
       // FROM MASTER'S LAIR TO HALL
       if (self_is(obj_on_map(20732, 0, PID_STAIRS2_UP))) then begin
           load_map("CHILDRN1.MAP", 3);
       end
   end
   if (dude_is_source) then begin
       if (global_var(GVAR_KATJA_STATUS) == 1) then begin
           reg_anim_clear(Katja_ptr);
       end
       if (global_var(GVAR_DOG_EMPATHY) == 1) then begin
           reg_anim_clear(Dog_ptr);
       end
       reg_anim_clear(dude_obj);
       reg_anim_begin;
       reg_anim(dude_obj, ANIM_STAND, -1);
       reg_anim_end;
   end
end

each "self_is" is a script less.



b) start procedure is filled with tons of shit. In Fallout you only need:

- map case:

Code:
procedure start begin
   if (script_action == 15) then begin
       call map_enter_p_proc;
   end
   if (script_action == 16) then begin
       call map_exit_p_proc;
   end
   if (script_action == 23) then begin
       call map_update_p_proc;
   end
end

- non map case:

Code:
procedure start begin
   if (script_action == 3) then begin
       call description_p_proc;
   end
end
 
Last edited:
I rewrote a lot of this code already. Compared to how it began, it's starting to look pretty damn good now, I'd say.
Moved lots of shit into headers, which makes modifying the data in the future a lot easier as well.

About the stairs - yes, you don't need a script for that in Fo2, but I'm keeping it in for now anyway. It doesn't hurt and when it comes to ladders, it actually fixes a visual bug (dude hanging in the last frame of the climbing animation). Putting it all into a single script isn't a bad idea, though. Maybe at some point in the future...

Anyways. Status update:
  • Finished the party member conversion yesterday. Now they run on the Fallout 2 system.
  • Party members can level up now.
  • As party members grow stronger with time, I've also added in Fo2's recruitment system: If you use charisma as a dump stat, you will not be able to take everyone with you (This is optional and can be disabled).
  • Ai packages need adjustments, but that's a minor issue.
  • Also took the time to implement the Sfall party armor change mod. Works good so far, only Tycho reverts to his default after every map change - no idea why. Maybe I'll find out some day. - found out why. Fixed.
  • Fixed various random encounter related bugs (critters not drawing weapons, crash bugs, invulnerable critters, etc).
  • Reactivated the "fluff" encounters that were removed in Fixt. Stuff like "you are dehydrated", etc. Instead I've added a toggle setting, so you can decide for yourself if you want this or not.
  • Max rad resistance is 100% now, not 95% anymore (Fo1 value).
  • Still working on the Vats / Cathedral destruction scene. Maybe I'll get it done today. Vats / Cathedral destruction scene is finished. Not exactly in the way I would like, but it works.

BIlj9q7.png
 
Last edited:
I rewrote a lot of this code already. Compared to how it began, it's starting to look pretty damn good now, I'd say.
Moved lots of shit into headers, which makes modifying the data in the future a lot easier as well.

About the stairs - yes, you don't need a script for that in Fo2, but I'm keeping it in for now anyway. It doesn't hurt and when it comes to ladders, it actually fixes a visual bug (dude hanging in the last frame of the climbing animation). Putting it all into a single script isn't a bad idea, though. Maybe at some point in the future...

Anyways. Status update:
  • Finished the party member conversion yesterday. Now they run on the Fallout 2 system.
  • Party members can level up now.
  • As party members grow stronger with time, I've also added in Fo2's recruitment system: If you use charisma as a dump stat, you will not be able to take everyone with you (This is optional and can be disabled).
  • Ai packages need adjustments, but that's a minor issue.
  • Also took the time to implement the Sfall party armor change mod. Works good so far, only Tycho reverts to his default after every map change - no idea why. Maybe I'll find out some day. - found out why. Fixed.
  • Fixed various random encounter related bugs (critters not drawing weapons, crash bugs, invulnerable critters, etc).
  • Reactivated the "fluff" encounters that were removed in Fixt. Stuff like "you are dehydrated", etc. Instead I've added a toggle setting, so you can decide for yourself if you want this or not.
  • Max rad resistance is 100% now, not 95% anymore (Fo1 value).
  • Still working on the Vats / Cathedral destruction scene. Maybe I'll get it done today. Vats / Cathedral destruction scene is finished. Not exactly in the way I would like, but it works.

BIlj9q7.png

That is impressive given how little time it's taken you both.

Is there much more you need to do other than test for bugs? i.e. can you play the game from start to finish now doing side quests and having random encounters as it was in fallout 1?
 
That is impressive given how little time it's taken you both.
Keep in mind that a lot was already done by other folks. I merely picked up the latest sources I could find and started working on it. Still lots to do, but all the grunt work like setting up protos, maps, and data files was already done.

i.e. can you play the game from start to finish now doing side quests and having random encounters as it was in fallout 1?

In theory, yes. But as I haven't done that myself yet, I can't say for sure. All the core elements are tested, though (the timers, getting the water chip, returning the chip, destroying vats and cathedral and then ending the game in a cutscene with slideshow and video).

So... yeah, in theory it works.

I've also fixed certain bugs that are introduced by Fixt (I cross-checked ingame in Fo1 and reproduced the same issues), so going by that, the Fo2 port should even be less buggy than the Fo1 Fixt version at this point.
 
Last edited:
I started a test playthrough yesterday. Made it to the Hub when I had to call it quits for the night. Found lots of proto issues (wrongly ported, bad settings, etc), which I fixed then. Also some other tiny script issues, which I was able to fix right away.
Here's a pic of the leather gang just leaving Junktown.
Other than these issues, it seemed to run well. I'll continue later today.

Anyway, as quite a bit happened, another status update:
  • Reworked all invasion timer code / moved it into a gl script.
  • Forgot to mention that Animal Friend perk, Mental Block, Scrounger and Flower Child are back, no matter how useless they seem.
  • Fixed some Brotherhood location related bugs.
  • Smitty in Boneyard now doesn't make the player naked when upgrading his plasma rifle.
  • I allowed some critters to run, such as Ian gangers and dogs. This always annoyed me in Fo1.
That's all I remember right now.

/Edit: Made it to Necropolis now. Catching the Water Chip soon. Necropolis caravans are still bugged from original Fallout. Will see how / if / when I fix them.

/Edit2: For some reason my skills.ini file isn't working, thus the 1 skill point == 1% skill increase doesn't work anymore. I have no clue why. Worked all the time, now not anymore. Love these kind of issues... - fixed.
 
Last edited:
Good news, everyone!
Master is kill.
gftPiVB.png

So my tl,dr is ... Everything is playable. You can start the game, you can end the game. However, in my playthrough I've noticed lots of tiny things that annoyed me or that I knew are wrong. Now the thing is, lots of these elements might as well be changes introduced by Fixt and some of these I really don't like. Started reverting and rewriting, etc. bla bla. Some things also are just unfinished / wrongly ported elements. As example the previously mentioned proto errors.
This is all stuff that can and will be fixed in the future, but it's a bit tedious and annoying.

Since yesterday, this happened:
  • Fixed: Huge performance issue in Gun Runners location after player gets all weapons.
  • Fixed: Blades will correctly invade Adytum after the player gave the holodisk to Jon Zimmermann.
  • Fixed: After giving the water chip to the overseer, the player is correctly teleported to the library and files a report.
  • Fixed: Necropolis Vault glowing ghouls were invincible.
  • Fixed: Necropolis Watershed prisoner now walks correctly out of the map. Also replaced a useless gvar with an lvar.
  • Changed: Gizmo's guard Izo will behave like in thy olde days.
  • Also updated ai.txt file - needs testing.
  • Added: Hub deathclaw map to... the Hub.
  • Also added: Irwine's Farm to the Hub.
  • Fixed: broken ai packs (talking rats, dogs, animals in general)
  • Added: 4 levels to Dogmeat.
  • Added: Wooden doors will close automatically now. This can be toggled on / off in fo1_settings.ini - best used in combination with gl_autodoors.
  • Tweaked: Killian's store tables, so it won't be *that* easy anymore to steal from him. Needs further testing.
  • Fixed: After destroying the Vats, the MBENT entrance wasn't disabled.
  • Fixed: Location tabs on worldmap now appear in the same order as in Fo1.
As said, some of these issues are based on the Fo1 -> Fo2 port, but others are because of Fixt or bugs introduced by Fixt (the version I played last should be called Brokt, I guess. I joke. It's a joke, ok? Sorry).
 
That's awesome! Hope, there will be a stable version available soon. Feel free to use us as beta testers once you decide that you are done with major changes.

I happened to translate Fixt, but have never actually played it, so the question might seem weird: is the Fallout Demo quest a part of the general campaign now available for the Vault Dweller?
 
Nah, I won't be including the demo location into this package. It would be possible, but it's just not what I want to work on.
Btw. the demo was turned into its own mod just a short while ago.

Other than that, I just fixed the ages old Necropolis caravan escort bug + found out the same one appears on the route to the Boneyard, which I have fixed as well. Turns out it was a very trivial thing to fix...
 
Last edited:
Are the random encounters fully scriptable (like in Fallout), or can they be only driven by that some sort of procedural txt file?

Anyway, I'm thinking to move my sandbox over there... but...

a) are you still adding shits there?
b) I want to repack critter.dat and master.dat to avoid trucktons of files in data directory + Fallout 2 useless shits*,
c) I see some globals.txt with RESERVED_FOR_FALLOUT2_ENGINE - what that shit is?
d) what are engine specific GVARs?
e) are there any other things I should be aware of?

* long time ago I did it with my compact (~ 165MB) Mapper for Fallout.
 
c) I see some globals.txt with RESERVED_FOR_FALLOUT2_ENGINE - what that shit is?
d) what are engine specific GVARs?
There are global variables that are processed by the F2 engine. It’s strange that you don’t know anything about it.
 
Are the random encounters fully scriptable (like in Fallout), or can they be only driven by that some sort of procedural txt file?
Everything is in script. It's a total mess of code that still needs serious cleanup. Maybe in the far future it'll all be ported over to Fo2's encounter system, but for now... I'm ok with how things are.

a) are you still adding shits there?
Yes. It'll be a while before I stopp adding and changing code around. We are still refactoring.

b) I want to repack critter.dat and master.dat to avoid trucktons of files in data directory + Fallout 2 useless shits*,
Well, the plan is to deliver only the necessary files with the alpha build. It'll come with a small gui extractor that picks specific files from the fo1 master.dat - not everything. The main mod files will come in a custom *.dat file.

c) I see some globals.txt with RESERVED_FOR_FALLOUT2_ENGINE - what that shit is?
Lots of stuff is still hardcoded in the engine. These variables should not be used anywhere else and remain "free".
"Globals.txt" is part of the debug gui, by the way (currently disabled / not working I think).

d) what are engine specific GVARs?
They control perks and other engine specific stuff. Don't ask me what exactly. Better not touch them.

e) are there any other things I should be aware of?
The project is still under heavy development. So porting your code now might mean you have to revisit everything again often. Personally I wouldn't do that yet and wait for something more stable.
 
Ok, will wait then.

Can't really help you because of total incompatibility with my scripts and other shits, but I can point you out bugs here or there - I've fixed many of them, but I don't have any list of what I've changed + it was five years ago.

Looked at Nicole, originally you could piss her off ad infinitum. Where to fix + restored herebefore:
Code:
procedure talk_p_proc begin
   call GetReaction;
   dialogue_start(HEAD_NICOLE, BACKGROUND_FOLLOWER, -1)
   if (ThiefFlag) then begin
       ThiefFlag := 0;
       if (local_var(LVAR_TALKED_TO_NICOLE) == 0) then begin
           set_local_var(LVAR_TALKED_TO_NICOLE, 1);
       end
       // --> NODE GOES HERE
   end
   else begin
       if (reaction_min) then begin
           call Node077;
       end
       else begin
           if (reaction_bad) then begin
               call Node070;
           end
           else begin
               if (local_var(LVAR_TALKED_TO_NICOLE) == 0) then begin
                   set_local_var(LVAR_TALKED_TO_NICOLE, 1);
                   call Node001;
               end
               else begin
                   call Node069;
               end
           end
       end
   end
   dialogue_end
   ReactionFlag := 0;
end


Code:
# Node069   [UNUSED - ADDED]
{351}{NIC_69}{Well hi. What can I help you with now?}
{352}{}{I need to ask a few questions.}
{353}{}{I have some information for you.}
{354}{}{I've talked to Laura.}
{355}{}{Nothing. Thanks.}
{356}{}{Mom!?}

# Node070   [UNUSED - ADDED]
{357}{NIC_70}{What do you want now?}
{358}{}{I wanted to say I'm sorry.}
{359}{}{I just wanted to see you again.}
{360}{}{}

# Node077   [UNUSED - ADDED]
{369}{NIC_77}{Hey! Get out of here!}
{370}{}{Or else what?}
{371}{}{Ok, I'm leaving.}




Obviously later you'll have to add stuff, like:
Code:
procedure Node010 begin
   inc_local_var(LVAR_APOLOGIZE_FLAG);
   ReactionFlag := -25; // --> INCREASE
   call DecReaction;
   BMessage(145);
   set_map_var(MVAR_SHOW_PLAYER_OUT, 1);  // --> KICK OUT PLAYER
end

procedure Node070 begin
   Reply(357);
   if (local_var(LVAR_APOLOGIZE_FLAG) < 2) then begin
       GOption(4, 358, Node071);
   end
   else begin
       BOption(4, 358, Node070a);
   end
   BOption(4, 359, Node070a);
end

Code:
# Node070a   [UNUSED - ADDED]
{361}{NIC_70A}{Just leave.}

# Node071   [UNUSED - ADDED]
{362}{NIC_71}{Apology accepted. What can I help you with?}
{363}{}{Can I ask a few more questions?}
{364}{}{That was all for now. I gotta go.}
 
Last edited:
This shows a problem already - you completely changed the dialog. :p No idea where what is. My talk_p_proc looks completely different, your nodes seem to be in a different order. Also you've added some thief stuff, which doesn't exist in my version.
 
ThiefFlag is for this:
Code:
procedure pickup_p_proc begin
   ThiefFlag := 1;
   dialogue_system_enter;
end

# [UNUSED]
{366}{NIC_74}{What are you doing? Put that down!}
{367}{NIC_75}{Stop!}
{368}{NIC_76}{Stop that!}


On a side note: every single script which is edited by me has "NodeXXX" (in Fallout 2 way - it's nicer) instead of, for example "NicoleXX" + every msg associated with it is commented with Node number, like Nicole I posted above.


I can point you out some things, but you'll have to track down and rewrite them on your own.


In attachment you'll find fun stuff I added (IIRC, originally there was only MSG). I haven't changed position of manholes/ladders in Necropolis, so it should work with original maps.
 

Attachments

"Globals.txt" is part of the debug gui, by the way (currently disabled / not working I think).
If the vault13.gam file is extracted to the <game_root>\data\data\ folder, then the names are taken from it, instead of from .txt
 
I happened to translate Fixt, but have never actually played it, so the question might seem weird: is the Fallout Demo quest a part of the general campaign now available for the Vault Dweller?

The demo itself isn't part of either fo1 or fo2, but it is very likely that you will find the text from the demo in the english\text\dialogs of fo1 or fo2, which can confuses some translators. (also, the demo can be packaged in the installation, but in a separate file)
 
Status
Not open for further replies.
Back
Top