Fallout 2 mod FO2 Engine Tweaks (Sfall)

i bought "Fallout Trillogy" from walmart,it comes with killaps unoficial patch and an older version of sfall
 
Nirran said:
i bought "Fallout Trillogy" from walmart,it comes with killaps unoficial patch and an older version of sfall
So it's not just steam. That's a pain; there's no easy way to blacklist it like I did with steam. :(
 
freaking lame how they doing you and killap,yet if someone ripped thier shit they would be in court in a heartbeat,asshats
 
Lexx said:
Let me guess, still no statement from Interplay to this?
Nope, but tbh I haven't tried to get one since they got sued. I might give it another go now that I know it's not just on steam, if I can be bothered. (Which I probably won't be. I don't really want to waste time writing mail I know no-one is reading.)

Edit:
Got oversized tiles working properly at last. They'll be in the next sfall release. :)
 
Lexx said:
Great! This totally rocks. But: What about the mapper? :P
I'm not touching that. Either use placeholder tiles, or put the broken tiles in and go in game to check what they look like.
 
How does it work now? Is it possible to use tiles with variable size (i. e. 30x30px or 45x45px) or do they need to have exactly the size of the amount of tiles you fake-replace with them? Is it possible to "overlay" tiles?

Image:
Bild1.png


Left you can see the new big tile that 1:1 fits and right the big tile that is a bit over the other tiles.
 
Lexx said:
How does it work now? Is it possible to use tiles with variable size (i. e. 30x30px or 45x45px) or do they need to have exactly the size of the amount of tiles you fake-replace with them? Is it possible to "overlay" tiles?
On startup sfall checks the tiles for any that are >80 in width. (It either checks them all, which slows down startup a bit, or you can provide it with a list of known oversized tiles to speed it up.) For each it finds, it first crops it down so that it's left with something that contains an exact number of regular tiles, (so you can use overlapping tiles if you like,) then splits it up and saves each individual tile in the tiles folder. Then it modifies the in-memory copy of tiles.lst, to add the extra tiles. When a map is loaded, it checks for the ids of oversized tiles, and switches them out with the replacement regular tiles. It works such that the oversized tiles expand to the right and top of the screen. (i.e. the bottom-left corner of the oversized tile is in the same place as it would be if the tile was normal size.)

So it doesn't really do anything that the automated tile making script on the wiki doesn't do, except for the map modifications. I had intended to use sfalls virtual file system functions rather than saving them to the data folder, but fallout seems to use some file system function to read in the tiles that I haven't overridden yet. I'll probably change it in some later version when I improve the filesystem functions.
 
Contie will be pleased, :D

I'm not touching that.

Why not? Is it so totally different from the fallout coding? Surely it would be much easier to use the new tiles if this was hacked as well in a similar way?

Would save time having to open the game up to check if all the changes update.
 
Chris Parks said:
Why not? Is it so totally different from the fallout coding? Surely it would be much easier to use the new tiles if this was hacked as well in a similar way?
Yes, it is completely different. In fallout tiles are loaded from the map files once. In the mapper they can change, so it's obvious that the approach I used for fallout would fail miserably for the mapper. The mapper and fallout share a lot of code, but for tile rendering there are huge differences.

In any case, fallout already has all the groundwork that sfall has laid, which would have to be completely redone for the mapper. (i.e. I already knew where the lst files were in memory, and how fallout read in the tile data.) I wouldn't do that even if the codepaths were identical.
 
I have another question. Why is the steam version and trilogy box version with includet sfall a big problem? Wouldn't it be enough to just copy over the fallout2.exe + adding the new sfall files?
 
Edit: Next version of sfall will have multiplayer support. Don't look forward to it though, it's not worth it.

Lexx said:
I have another question. Why is the steam version and trilogy box version with includet sfall a big problem? Wouldn't it be enough to just copy over the fallout2.exe + adding the new sfall files?
That's not the point. There isn't any technical problem that would prevent anyone from using new versions.

The first problem is that sfall can cause problems which for people who don't even know they have it installed can be very hard to track down. (i.e. the cannot create input device error, the compatibility mode issue, the self-modifing code thing with virus scanners, etc.) The second problem is that it's theft, and while I normally wouldn't care, this is different partly because they're selling it for profit, and partly because when game publishers are pushing all this starforce crapware and the like on us to try and protect their own software, stealing someone elses like that is serious hypocrisy.

There's also the question of what happens if someone goes to interplay tech support with an sfall issue. After all, from the point of view of the customer they don't have any third party stuff installed, so it's interplays responsibility to provide support. I certainly don't want them pointing people in my direction. There doesn't appear to be anything in the FAQs to address the common sfall issues.

I also had a few questions I wanted answered about if they were guaranteeing to their customers that sfall was free from malicious code and the like, but they were just things I was interested in, rather than problems.
 
Yes, it is completely different. In fallout tiles are loaded from the map files once. In the mapper they can change, so it's obvious that the approach I used for fallout would fail miserably for the mapper. The mapper and fallout share a lot of code, but for tile rendering there are huge differences.

In any case, fallout already has all the groundwork that sfall has laid, which would have to be completely redone for the mapper. (i.e. I already knew where the lst files were in memory, and how fallout read in the tile data.) I wouldn't do that even if the codepaths were identical.

Noted. Thanks for the explanation. At least we can use bigger tiles one way or another. :D
 
@Timeslip: Ah yeah... somehow... I forgot about that.

It just came into my mind because I have the GOG version installed on a other machine and there I can't get the new interface button to work, that has been done by Helios. It's very strange because on both computers are 1:1 the same Fallout (mod) files. Still, it only works on one of them. Now I thought it might be because of some hacked-in-stuff, but this should be also somehow invalid because I replaced the Fallout2.exe .... very strange.
 
Lexx said:
It just came into my mind because I have the GOG version installed on a other machine and there I can't get the new interface button to work, that has been done by Helios. It's very strange because on both computers are 1:1 the same Fallout (mod) files. Still, it only works on one of them. Now I thought it might be because of some hacked-in-stuff, but this should be also somehow invalid because I replaced the Fallout2.exe .... very strange.
Doesn't the GoG version come with a ddraw.dll that isn't sfall? Might be worth looking at that if it's there to see what it's doing and if it's causing any interference.
 
No... or, not anymore. I've downloaded it on this computer and installed it. Except the uninstaller, everything looks fine:

Bild2.png


But it's funny. I tested the latest Shattered Destiny 2 build on the fresh installed GoG version on THIS computer and I have exactly the same problem: The button doesn't work. Mr. Fixit doesn't open and the pcx file for the button isn't loaded. Of course, I deleted the patch000.dat before. Fallout2.exe has been overwritten via high-res patch, etc. Ddraw.dll is the latest build too.

With my original Fallout 2 version, everything runs fine.

/Edit: Now it becomes even more strange. I tried to find out whats the problem with overwriting one file after another and... I can't fix this problem. I overwrote master.dat, critter.dat, fallout2.exe, I deleted the whole data folder and replaced it with my other and I even patched the game into german. Nothing. The button doesn't work.

Bild1.png


I can click on the button, etc. but nothing happens. Right now I exchanged everything that was inside that folder.

Need to test more with it. After I deleted everything and made copy&paste of my original folder, it worked obviously.


/Edit²: Now it works. It was a problem with the ddraw.dll. I re-downloaded the latest sfall build and tested around with my other files until I found out that there was one file a bit older...
 
hook script combatdamage sometimes retunrs massive damage with thism code,im pretty sure it isnt the code[not the whole script but this is the relavant code]

Code:
             if(Get_Skill(obj_pid(attack_weapon)) == SKILL_UNARMED_COMBAT) or (Get_Skill(obj_pid(attack_weapon)) == SKILL_MELEE) then
                  begin
                     random_roll := random(1,100);
                     crit_chance := get_critter_extra_stat(attacker, STAT_crit_chance) + get_critter_base_stat(attacker, STAT_crit_chance) + get_sfall_global_int("critic_4");
                     attacker_special_flag := 256;
                     target_special_flag := 256;
                     attacker_melee_damage := (get_critter_extra_stat(attacker, STAT_melee_dmg) + get_critter_base_stat(attacker, STAT_melee_dmg));
                     maximum := attacker_melee_damage + Get_Max(obj_pid(attack_weapon)) + get_sfall_global_int("melee_04");
                     minimum := Get_Min(obj_pid(attack_weapon)) + get_sfall_global_int("ranged_4");
                     //float_msg(dude_obj, "Damage Fired" + " " + obj_pid(attack_weapon) +  " " + Get_Min(obj_pid(attack_weapon)) +  " " + Get_Max(obj_pid(attack_weapon)), 3);
                     random_damage := random(minimum, maximum);
                     if(random(1,100) > (100 - crit_chance)) then
                        begin
                           random_damage := random_damage * 2;
                           attacker_special_flag := attacker_special_flag + 512;
                           target_special_flag := target_special_flag + 512;
                           knockdown_incapacitate := random(1,100);
                           if(knockdown_incapacitate >= 100 - (get_sfall_global_int("knock_04")))then
                              begin
                                 if(obj_pid(target) != MYRON) and (obj_pid(target) != MARCUS) and (obj_pid(target) != CASSIDY) and (obj_pid(target) != SULIK) and (obj_pid(target) != LENNY)and (obj_pid(target) != CYBERDOG) and (obj_pid(target) != GORIS) and (obj_pid(target) != ROBOBRAIN) and (obj_pid(target) != VIC) and (obj_pid(target) != DAVIN) and (obj_pid(target) != MIRIA) and (obj_pid(target) != KLINT) and (obj_pid(target) != DOGMEAT) and (obj_pid(target) != K9) and (obj_pid(target) != DIAGO) and (obj_pid(target) != MERIS) and (obj_pid(target) != LENNY_HUMAN) and (obj_pid(target) != ROBOBRAIN_SKYNET) and (target != dude_obj) then 
                                    begin 
                                       target_special_flag := target_special_flag + 2;
                                       sfall := 1;
                                    end 
                                 else 
                                    if (has_fake_perk(Imoble) != 4) and ((obj_pid(target) == MYRON) or (obj_pid(target) == MARCUS) or (obj_pid(target) == CASSIDY) or (obj_pid(target) == SULIK) or (obj_pid(target) == LENNY)or (obj_pid(target) == CYBERDOG) or (obj_pid(target) == GORIS) or (obj_pid(target) == ROBOBRAIN) or (obj_pid(target) == VIC) or (obj_pid(target) == DAVIN) or (obj_pid(target) == MIRIA) or (obj_pid(target) == KLINT) or (obj_pid(target) == DOGMEAT) or (obj_pid(target) == K9) or (obj_pid(target) == DIAGO) or (obj_pid(target) == MERIS) or (obj_pid(target) == LENNY_HUMAN) or (obj_pid(target) == ROBOBRAIN_SKYNET)) then 
                                       begin
                                          target_special_flag := target_special_flag + 2;
                                          sfall := 1;
                                       end 
                                 else 
                                    if (not(has_fake_perk(Imoble) >= 3)) and (target == dude_obj) then 
                                       begin
                                          target_special_flag := target_special_flag + 2;
                                          sfall := 1;
                                       end
                              end
                        end
                     if(knockdown_incapacitate >= 100 - (get_sfall_global_int("knock_04")))then
                        begin
                           if(obj_pid(target) != MYRON) and (obj_pid(target) != MARCUS) and (obj_pid(target) != CASSIDY) and (obj_pid(target) != SULIK) and (obj_pid(target) != LENNY)and (obj_pid(target) != CYBERDOG) and (obj_pid(target) != GORIS) and (obj_pid(target) != ROBOBRAIN) and (obj_pid(target) != VIC) and (obj_pid(target) != DAVIN) and (obj_pid(target) != MIRIA) and (obj_pid(target) != KLINT) and (obj_pid(target) != DOGMEAT) and (obj_pid(target) != K9) and (obj_pid(target) != DIAGO) and (obj_pid(target) != MERIS) and (obj_pid(target) != LENNY_HUMAN) and (obj_pid(target) != ROBOBRAIN_SKYNET) and (target != dude_obj) then
                              begin
                                 target_special_flag := target_special_flag + 2;
                                 sfall := 1;
                              end
                           else
                              if (has_fake_perk(Imoble) != 2) and ((obj_pid(target) == MYRON) or (obj_pid(target) == MARCUS) or (obj_pid(target) == CASSIDY) or (obj_pid(target) == SULIK) or (obj_pid(target) == LENNY)or (obj_pid(target) == CYBERDOG) or (obj_pid(target) == GORIS) or (obj_pid(target) == ROBOBRAIN) or (obj_pid(target) == VIC) or (obj_pid(target) == DAVIN) or (obj_pid(target) == MIRIA) or (obj_pid(target) == KLINT) or (obj_pid(target) == DOGMEAT) or (obj_pid(target) == K9) or (obj_pid(target) == DIAGO) or (obj_pid(target) == MERIS) or (obj_pid(target) == LENNY_HUMAN) or (obj_pid(target) == ROBOBRAIN_SKYNET)) then
                                 begin
                                    target_special_flag := target_special_flag + 2;
                                    sfall := 1;
                                 end
                           else
                              if (not(has_fake_perk(Imoble) >= 1)) and (target == dude_obj) then
                                 begin
                                    target_special_flag := target_special_flag + 2;
                                    sfall := 1;
                                 end
                        end
                     if(target == dude_obj) then
                        begin
                           random_damage := (random_damage - (get_critter_extra_stat(dude_obj, STAT_dmg_thresh) + get_critter_base_stat(dude_obj, STAT_dmg_thresh)));
                           random_damage := (random_damage - (random_damage * ((get_critter_extra_stat(dude_obj, STAT_dmg_resist) + get_critter_base_stat(dude_obj, STAT_dmg_resist)) / 100)));
                        end
                     else
                        begin
                           random_damage := (random_damage - (get_critter_extra_stat(target, STAT_dmg_thresh) + get_critter_base_stat(target, STAT_dmg_thresh)));
                           random_damage := (random_damage - (random_damage * ((get_critter_extra_stat(target, STAT_dmg_resist) + get_critter_base_stat(target, STAT_dmg_resist)) / 100)));
                        end
                     set_sfall_return(random_damage);
                     set_sfall_return(0);
                     set_sfall_return(target_special_flag);
                     set_sfall_return(attacker_special_flag);
                  end
            end
      end
   target := 0;
   attacker := 0;
   damage := 0;
   attacker_melee_damage := 0;
   minimum := 0;
   maximum := 0;
   random_damage := 0;
   random_damage_remainder := 0;
   remainder_pecent := 0;
   attacker_damage := 0;
   target_special_flag := 0;
   attacker_special_flag := 0;
   target_damage := 0;
   knockdown_incapacitate := 0;
   sfall := 0;
   right_weapon := 0;
   left_weapon := 0;
   right_weapon_ptr := 0;
   left_weapon_ptr := 0;
   perk_mod := 0.0;
   perk_math := 0.0;
   perk_mod_math := 0.0;
   attack_weapon := 0;
   random_roll := 0;
   crit_chance := 0;
   weapon_stat := 0;
   weapon_statb := 0;
   weapon_used := 0;
   ammo_used := 0;
   ammo_stat := 0;
end

procedure Get_Min(variable weapon_used) begin
   weapon_stat := get_proto_data(weapon_used, 40);
   if(weapon_used == -1) then 
      begin
         return 1;
      end 
   else 
      begin
         return weapon_stat;
      end
end

procedure Get_Max(variable weapon_used) begin
   weapon_stat := get_proto_data(weapon_used, 44);
   if(weapon_used == -1) then 
      begin
         return 3;
      end 
   else 
      begin
         return weapon_stat;
      end
end

procedure Get_Skill(variable weapon_used) begin
   weapon_stat := get_proto_data(weapon_used, 52);
   weapon_statb := get_proto_data(weapon_used, 69);
   if(weapon_used == -1) then 
      begin
         return SKILL_UNARMED_COMBAT;
      end 
   else 
      if(weapon_stat <2>= 3) and (weapon_statb <6> 2) then 
         begin
            weapon_stat := SKILL_ENERGY_WEAPONS;
         end 
   else 
      if (weapon_statb == 2) and (weapon_stat > 2) then 
         begin
            weapon_stat := 18;
         end 
   else 
      if (weapon_stat > 2) then 
         begin
            weapon_stat := SKILL_SMALL_GUNS;
         end
   
   return weapon_stat;
end  

procedure Get_Burst(variable weapon_used) begin
   weapon_stat := get_proto_data(weapon_used, 84);
   if(weapon_stat > 1) then 
      begin
         return weapon_stat;
      end 
   else 
      begin
         return 1;
      end
end

code is firing

Nirran
 
Back
Top