Alt-Miria Mod Updated for Restoration Project 2.3

Mediafire is good choice, also Mega is good one(My choice), also lot of people using Depositfiles... 1 of those 3 seems to be the best for now. Btw your files within link location set as private... any suggestion to get em? Would be nice to have original ones... thank you.
 
Last edited:
@Wide

Sorry about that, I should have tested the link first. I never used Mediafire and didn't see the "share link" thingy, but I changed it and verified the link is working now.
 
Last edited by a moderator:
Awesome job, Endocore. I'm trying to do some simple modifications on your mod, basically, I want to change the Miria model to the blonde female PC model of the RP. I decompiled mcMiria.int and you stated that a simple line change in the "talk_p_proc" function was necessary. Could you explain what line need to be changed? I don't want to mess with the variables right now.

Also, I suppose I need to copy the FRM files in Appearance/HFR00S01/art/critters to data/art/critters? If so, how do I need to rename them? Doesn't Miria use the default NFPEASQx frame in the base RP?
 
Yes, you'll need to rename all those hero blonde frms, it's a major hassle. You're on the right track-- copy the blonde hero files to a temporary folder, rename them anything you want in the format:

******$$.frm

where * is anything you want and $ is what is already in the filename (i.e., a two-letter code at the end). The filenames must all be exactly 8 characters plus the extension frm.

Then move the renamed files to art\critters, then add a new entry to the text file critters.lst found in that folder (follow the format of the other entries, it's easy). Make your new entry the last line in the file.

After all that, the hard part is mostly done.

You'll need to find the artfid of the new frm set you added to critters.lst. The easiest way to do this is to use the Mapper. Make a new critter or change an existing critter to use your new animation set, then look in your dev\proto directory for a text file matching the proto id of the critter you made or changed. This text file will display (among many other things) the new artfid. Let's call this number "your###". Don't forget to change back whatever critter you were experimenting on using the Mapper.

Decompile the script and find the following line in talk_p_proc:

Code:
if (op_critter_inven_obj(op_self_obj(), 0) == 0) then
        begin
            op_metarule3(107, op_self_obj(), 16777252, 0);
            op_float_msg(op_self_obj(), op_message_str(106, op_random(6000, 6001)), 8);
        end

and change this to:

Code:
[code]
if (op_critter_inven_obj(op_self_obj(), 0) == 0) then
        begin
            op_metarule3(107, op_self_obj(), your###, 0);
            op_float_msg(op_self_obj(), op_message_str(106, op_random(6000, 6001)), 8);
        end



Depending on what script compiler you're using, you may not see the op_ prefixes. Just follow the format of whatever you see-- the thing to keep in mind is, you're only changing one single value, as shown above.

Compile your script and put the new version in the game's scripts folder.

After this you have two choices:

1) Do nothing with Miria's original appearance when you first meet her. Assume she got a new look after your marriage. This is the easiest option, since it requires no further action.
2) Edit Miria's base proto files, then place a new version of her on the Modoc map. You'll have to be sure you replace ALL the Miria proto files in master.dat with the new versions, or your game will be buggy and Miria won't level up properly.




 
EDIT1: Successfully did it! The Mapper almost killed me though, hahaha!

EDIT2: There's another problem. The DOS4gw doesn't work in 64 bits?! The only thing left is to recompile the .ssl to .int again now that I edited the FID.

EDIT3: I finally managed to complete all the steps but Miria's sprite is still the same of before, even after marriage.
 
Last edited:
Good job on following all that. :clap: Some likely causes of the current trouble would be:

a) You edited the wrong value in the script. Try putting various armors on her to see if one of them changes her to vault suit apppearance to rule out this problem.

b) In the midst of all that activity, you put the original rather than the modified script back into the scripts folder.

c) There was an error when you compiled the script. I'm not sure which compiler you're using, but most should offer some kind of notice or error message at compilation time if this occurs.

d) You didn't retrieve the correct artfid for your new animation set, and rather than try to figure out what to do the engine just defaults to the animation specified in the proto file.

Since the part of the script you're editing isn't associated with any adding any new variables, you shouldn't have to have the apply your new script before entering Modoc for the first time, but this practice is a catch-all guideline that often mysteriously clears up strange issues as well.
 
Well, I checked everything you said above but she still defaults to her base frames of your mod.

1- I copied and renamed all the relevant files in Appearance/HFR00S01/art/critters.

2- Added the entry to critters.lst

3-Opened the Mapper and noticed that he reads my new frame. Created a critter to get the FID of my new frame. The .txt in the dev folder gives always the number 16777367 as my new FID associated to the blonde heroine. Deleted the critter after getting the FID.

4-Decompiled the mcMiria.int and changed the default number to 16777367. Compiled it, apparently without errors. I copied and decompiled it again to double check the value and it indeed showed the correct FID given to me in the dev/proto folder.

Still, no change in the sprite.
 
@TheOrbit

That's good, we're narrowing things down. Could you copy/paste the full text contents (shouldn't be very much) of the text file the Mapper output to dev\proto when you applied the new animation set to whatever critter in the Mapper?
 
Last edited by a moderator:
Code:
pid: 16777767 00000551name: Miria Stage Two
message_num: 55100
fid: 16777367 ufjmps,11,1
light_distance: 0
light_intensity: 0
flags: 536870912
flags_ext: 24576
sid: -1
ai_packet: 107
team_num: 1
d.body: 0 Biped
d.flags: 2
d.stat_base0: 5
d.stat_base1: 7
d.stat_base2: 5
d.stat_base3: 8
d.stat_base4: 5
d.stat_base5: 7
d.stat_base6: 5
d.stat_base7: 30
d.stat_base8: 8
d.stat_base9: 7
d.stat_base10: 0
d.stat_base11: 1
d.stat_base12: 150
d.stat_base13: 14
d.stat_base14: 1
d.stat_base15: 5
d.stat_base16: 0
d.stat_base17: 0
d.stat_base18: 0
d.stat_base19: 0
d.stat_base20: 0
d.stat_base21: 0
d.stat_base22: 0
d.stat_base23: 0
d.stat_base24: 0
d.stat_base25: 0
d.stat_base26: 0
d.stat_base27: 0
d.stat_base28: 0
d.stat_base29: 0
d.stat_base30: 0
d.stat_base31: 10
d.stat_base32: 25
d.stat_base33: 25
d.stat_base34: 1
d.stat_bonus0: 0
d.stat_bonus1: 0
d.stat_bonus2: 0
d.stat_bonus3: 0
d.stat_bonus4: 0
d.stat_bonus5: 0
d.stat_bonus6: 0
d.stat_bonus7: 49
d.stat_bonus8: 0
d.stat_bonus9: 0
d.stat_bonus10: 0
d.stat_bonus11: 0
d.stat_bonus12: 0
d.stat_bonus13: 0
d.stat_bonus14: 0
d.stat_bonus15: 0
d.stat_bonus16: 0
d.stat_bonus17: 2
d.stat_bonus18: 2
d.stat_bonus19: 2
d.stat_bonus20: 2
d.stat_bonus21: 2
d.stat_bonus22: 0
d.stat_bonus23: 2
d.stat_bonus24: 4
d.stat_bonus25: 4
d.stat_bonus26: 4
d.stat_bonus27: 4
d.stat_bonus28: 4
d.stat_bonus29: 500
d.stat_bonus30: 4
d.stat_bonus31: 0
d.stat_bonus32: 0
d.stat_bonus33: 0
d.stat_bonus34: 0
d.stat_points0: 38
d.stat_points1: 6
d.stat_points2: 34
d.stat_points3: 12
d.stat_points4: 12
d.stat_points5: 12
d.stat_points6: 12
d.stat_points7: 10
d.stat_points8: 10
d.stat_points9: 6
d.stat_points10: 8
d.stat_points11: 8
d.stat_points12: 2
d.stat_points13: 4
d.stat_points14: 25
d.stat_points15: 12
d.stat_points16: 0
d.stat_points17: 8

Note this is one of my new attempts, which I used Miria stage 2 as the base.

ufjmps,11,1 is the name I gave to the frames and it correctly shows in the mapper. I suspect the problem is in the script.
 
That part looks good; you're likely correct about the script. Could you copy/paste the text of the entire subsection "talk_p_proc" from your decompiled mcmiria.ssl (the one you compiled into an int and are using in your experiments). It's a fairly long section of text, if you hit a snag of "too many characters in post" then send me the info in a PM (which has no length restrictions in practical terms). You just need to copy the section between "begin" and "end" that are at the very left margin:

Code:
procedure talk_p_proc
begin
     [blablabla, lots of text]
end
 
Here it is! =)

This is the edited code already put in data/script that should've been working.

Code:
procedure talk_p_procbegin
    variable LVar0 := 0;
    LVar0 := critter_inven_obj(self_obj, 0);
    set_local_var(19, 0);
    if ((global_var(52) <= -1000) == 0) then begin
        if (((global_var(291) - (global_var(291) % 100)) == 200) or ((global_var(291) - (global_var(291) % 100)) == 300)) then begin
            if ((global_var(291) % 100) == 3) then begin
                float_msg(self_obj, message_str(106, 450 + (20 * ((global_var(297) bwand 131072) != 0))), 8 + ((7 - 8) * has_trait(0, dude_obj, 22)));
            end
        end
        else begin
            if ((global_var(291) - (global_var(291) % 100)) == 100) then begin
                float_msg(self_obj, message_str(106, 251), 8 + ((7 - 8) * has_trait(0, dude_obj, 22)));
            end
            else begin
                script_overrides;
                if (local_var(6) > 0) then begin
                    float_msg(self_obj, message_str(106, 150 + (get_critter_stat(dude_obj, 34) == 0)), 8);
                end
                else begin
                    if ((get_critter_stat(self_obj, 34) == 0) and (global_var(6) == 1) or ((get_critter_stat(self_obj, 34) == 1) and (global_var(6) == 2)) and (global_var(6) != 0) or (global_var(449) != 0)) then begin
                        if ((global_var(297) bwand 131072) != 0) then begin
                            float_msg(self_obj, message_str(106, 500), 8);
                        end
                        else begin
                            float_msg(self_obj, message_str(106, 152 + (get_critter_stat(dude_obj, 34) == 1)), 8);
                        end
                    end
                    else begin
                        did_node_14 := 0;
                        start_gdialog(106, self_obj, 4, -1, -1);
                        gsay_start;
                        if ((party_member_obj(16777380) != 0) or (local_var(9) != 0)) then begin
                            call Node100();
                        end
                        else begin
                            call Node000();
                        end
                        gsay_end;
                        end_dialogue;
                    end
                end
                set_local_var(5, local_var(5) + 1);
            end
        end
    end
    else begin
        if (party_member_obj(obj_pid(self_obj)) != 0) then begin
            debug_msg("abandon party: " + obj_name(self_obj));
            party_remove(self_obj);
        end
        if (obj_pid(self_obj) == 16777380) then begin
            debug_msg("start: set_dude_was_married");
            if (global_var(6) == 1) then begin
                debug_msg("   GVAR_PLAYER_WAS_MARRIED before == " + global_var(449));
                set_global_var(449, global_var(6));
                debug_msg("   GVAR_PLAYER_WAS_MARRIED after == " + global_var(449));
                set_global_var(6, 0);
            end
            debug_msg("finished: set_dude_was_married");
        end
        if ((local_var(8) != -1) and (has_trait(1, self_obj, 6) == 0)) then begin
            critter_add_trait(self_obj, 1, 6, local_var(8));
            set_local_var(8, -1);
        end
        debug_msg("" + obj_name(self_obj) + " has abandoned the party");
        call Node998();
        if (critter_is_fleeing(self_obj)) then begin
            if (anim_busy(self_obj) == 0) then begin
                if ((tile_distance_objs(self_obj, dude_obj) < 8) or obj_can_see_obj(self_obj, dude_obj)) then begin
                    if (anim_busy(self_obj) == 0) then begin
                        global_temp := rotation_to_tile(tile_num(dude_obj), tile_num(self_obj));
                        animate_move_obj_to_tile(self_obj, tile_num_in_direction(tile_num(self_obj), global_temp, random(3, 10)), 1);
                        global_temp := (global_temp + 1) % 6;
                        while ((anim_busy(self_obj) == 0) and (global_temp != rotation_to_tile(tile_num(dude_obj), tile_num(self_obj)))) do begin
                            debug_msg("flee loop: rot == " + global_temp);
                            animate_move_obj_to_tile(self_obj, tile_num_in_direction(tile_num(self_obj), global_temp, random(3, 10)), 1);
                            global_temp := (global_temp + 1) % 6;
                        end
                    end
                end
            end
        end
        else begin
            attack_complex(dude_obj, 0, 1, 0, 0, 30000, 0, 0);
        end
    end
    if (critter_inven_obj(self_obj, 0) != LVar0) then begin
        if (critter_inven_obj(self_obj, 0) == 0) then begin
            metarule3(107, self_obj, 16777367, 0);
            float_msg(self_obj, message_str(106, random(6000, 6001)), 8);
        end
        else begin
            if ((obj_pid(critter_inven_obj(self_obj, 0)) == 1) or (obj_pid(critter_inven_obj(self_obj, 0)) == 379)) then begin
                metarule3(107, self_obj, 16777221, 0);
                float_msg(self_obj, message_str(106, random(6005, 6006)), 8);
            end
            else begin
                if ((obj_pid(critter_inven_obj(self_obj, 0)) == 232) or (obj_pid(critter_inven_obj(self_obj, 0)) == 3)) then begin
                    metarule3(107, self_obj, 16777217, 0);
                    float_msg(self_obj, message_str(106, random(6025, 6026)), 8);
                end
                else begin
                    if ((obj_pid(critter_inven_obj(self_obj, 0)) == 349) or (obj_pid(critter_inven_obj(self_obj, 0)) == 348)) then begin
                        metarule3(107, self_obj, 16777287, 0);
                        float_msg(self_obj, message_str(106, random(6030, 6031)), 8);
                    end
                    else begin
                        if ((obj_pid(critter_inven_obj(self_obj, 0)) == 240) or (obj_pid(critter_inven_obj(self_obj, 0)) == 380) or (obj_pid(critter_inven_obj(self_obj, 0)) == 2)) then begin
                            metarule3(107, self_obj, 16777223, 0);
                            float_msg(self_obj, message_str(106, random(6015, 6016)), 8);
                        end
                        else begin
                            if ((obj_pid(critter_inven_obj(self_obj, 0)) == 74) or (obj_pid(critter_inven_obj(self_obj, 0)) == 265)) then begin
                                metarule3(107, self_obj, 16777222, 0);
                                float_msg(self_obj, message_str(106, random(6010, 6011)), 8);
                            end
                            else begin
                                if ((obj_pid(critter_inven_obj(self_obj, 0)) == 239) or (obj_pid(critter_inven_obj(self_obj, 0)) == 17) or (obj_pid(critter_inven_obj(self_obj, 0)) == 381)) then begin
                                    metarule3(107, self_obj, 16777219, 0);
                                    float_msg(self_obj, message_str(106, random(6020, 6021)), 8);
                                end
                                else begin
                                    if ((obj_pid(critter_inven_obj(self_obj, 0)) == 524) or (obj_pid(critter_inven_obj(self_obj, 0)) == 113)) then begin
                                        metarule3(107, self_obj, 16777218, 0);
                                        float_msg(self_obj, message_str(106, random(6035, 6036)), 8);
                                    end
                                    else begin
                                        if (obj_pid(critter_inven_obj(self_obj, 0)) == 554) then begin
                                            metarule3(107, self_obj, 16777320, 0);
                                            float_msg(self_obj, message_str(106, random(6040, 6041)), 8);
                                        end
                                    end
                                end
                            end
                        end
                    end
                end
            end
        end
        restock_obj := critter_inven_obj(self_obj, 1);
        debug_msg("armour pid == " + obj_pid(restock_obj));
        rm_obj_from_inven(self_obj, restock_obj);
        add_obj_to_inven(self_obj, restock_obj);
    end
    if (local_var(19) != 0) then begin
        call Node2502();
        set_local_var(19, 0);
    end
    return 0;
    LVar0 := 0;
end
 
At a glance the script looks okay, but I'll take a closer look and get back to you tomorrow.

In the meantime, something I forgot to add yesterday was that you'll need to take a look in your Fallout2\data\proto\critters\ folder. Since you were experimenting with Miria's protos in the Mapper, you now have some files there (created by the Mapper) that need to be deleted. Delete any of the following that are present:

00000164.pro
00000550.pro
00000551.pro
00000552.pro
00000553.pro
00000554.pro
00000555.pro

This is related to an issue I mentioned earlier, where npc follower proto files can only be in master.dat, never in the override folder.

We'll get this solved for you, don't worry.

EDIT:

Try this, let's see what happens. Put the script in your Fallout2\data\scripts folder. Never give technical advice when in a hurry-- sorry, I gave incorrect advice earlier. You only want to make sure 00000164.pro isn't in Fallout2\data\proto\critters (if so, delete it) but you definitely do need the other pro files I mentioned so I included copies of them as well in case you already deleted them.


Go to Modoc, get married to Miria, have her put on some kind of armor (any kind will do), then exit the conversation. Talk to her again, and have her take the armor off. If her appearance doesn't then change to use the blonde heroine frm set you made, we'll have to cast a wider net.


Download here


Note: This script is for based on TheOrbit's unique modification, no one else should try to use it or you'll crash your game when Miria takes her armor off.
 
Last edited:
Hello!

It worked! Apparently, I forgot to tell her to remove her armor before. >>

After I equip another armor on her, however, of any kind, she defaults back to her base sprites. She only uses the blonde sprite when unarmored.
 
Last edited:
I thought that's what you were shooting for, I must have misunderstood you. If you want her appearance to depict the vault suit all the time rather than reflect what armor she's wearing, that's no more difficult than everything you've already done. In the section of the script you already edited, just change all the values to 16777367. In other words, in the few lines surrounding the one you changed, wherever you see:

metarule3(107, self_obj, XXXXXXXX, 0)

change it to

metarule3(107, self_obj, 16777367, 0)

and she'll always use your vault suit animations. As we noted, you have to have her change her armor one time using this method before she'll begin using the new animations.
 
You misunderstood it. I mean that, when she is unarmored, all works fine. If I equip an armor on her, her sprite change to the black haired one of your mod. I want her to use the appropriate frames from the blonde frm, that is if I equip a leather armor on her, I want her to change her appearance to a blonde woman with leather armor.

Thanks again for your time!
 
I understand. You'll have a lot more work ahead of you, then. As you did with the vault suit heroine blonde animations (_hfjmps), you'll have to copy all the blonde animations from the Appearance folder and rename them. The sets are:

_hflthr** = in leather armor
_hfmaxx** = in combat leather jacket
_hfmetl** = in metal armor
_hfprim** = in tribal outfit (you may or may not need this, depending on whether you want the Vault Suit to be her unarmored appearance)

You'll need to follow the steps you went through previously for each of these animation sets. Copy them to a temporary folder, rename each set to use a unique name (the prefix of u should work fine, as in uflthr**.frm), move the files to art\critters, add the set names to critters.lst in art\critters, then get the new artfid numbers for use in the script. There's nothing new, just repetition of what you did before.
 
What weapons will Miria wield? Was her selection increased from vanilla Fallout 2? Because she says she can use rifles, but doesn't seem to want to use the Assault Rifle (plus ammo) I gave her...
 
What weapons will Miria wield? Was her selection increased from vanilla Fallout 2? Because she says she can use rifles, but doesn't seem to want to use the Assault Rifle (plus ammo) I gave her...
Give her an armor and she can use everything. Without armor she can only use smg and knife I think.
 
Back
Top