Alt-Miria Mod Updated for Restoration Project 2.3

Discussion in 'Fallout General Modding' started by Endocore, Dec 26, 2013.

  1. Wide

    Wide First time out of the vault

    Aug 19, 2015
    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: Sep 2, 2015
  2. Endocore

    Endocore Look, Ma! Two Heads!
    Modder

    Mar 14, 2010
    @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: Jan 9, 2016
    • [Like] [Like] x 1
  3. Wide

    Wide First time out of the vault

    Aug 19, 2015
    Good stuff dude. Thanks a lot.
     
  4. trollworkout

    trollworkout It Wandered In From the Wastes

    Aug 1, 2015
    use mega or google drive. highly recommended.
     
  5. TheOrbit

    TheOrbit First time out of the vault

    Sep 28, 2015
    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?
     
  6. Endocore

    Endocore Look, Ma! Two Heads!
    Modder

    Mar 14, 2010
    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.



    [HR][/HR]
     
  7. TheOrbit

    TheOrbit First time out of the vault

    Sep 28, 2015
    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: Sep 29, 2015
  8. Endocore

    Endocore Look, Ma! Two Heads!
    Modder

    Mar 14, 2010
    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.
     
  9. TheOrbit

    TheOrbit First time out of the vault

    Sep 28, 2015
    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.
     
  10. Endocore

    Endocore Look, Ma! Two Heads!
    Modder

    Mar 14, 2010
    @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: Jan 9, 2016
  11. TheOrbit

    TheOrbit First time out of the vault

    Sep 28, 2015
    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.
     
  12. Endocore

    Endocore Look, Ma! Two Heads!
    Modder

    Mar 14, 2010
    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
    
     
  13. TheOrbit

    TheOrbit First time out of the vault

    Sep 28, 2015
    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
     
  14. Endocore

    Endocore Look, Ma! Two Heads!
    Modder

    Mar 14, 2010
    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: Oct 2, 2015
  15. TheOrbit

    TheOrbit First time out of the vault

    Sep 28, 2015
    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: Oct 3, 2015
  16. Endocore

    Endocore Look, Ma! Two Heads!
    Modder

    Mar 14, 2010
    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.
     
  17. TheOrbit

    TheOrbit First time out of the vault

    Sep 28, 2015
    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!
     
  18. Endocore

    Endocore Look, Ma! Two Heads!
    Modder

    Mar 14, 2010
    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.
     
  19. Cyberweasel89

    Cyberweasel89 First time out of the vault

    Aug 4, 2016
    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...
     
  20. wastelanDrifter

    wastelanDrifter First time out of the vault

    Aug 7, 2013
    Give her an armor and she can use everything. Without armor she can only use smg and knife I think.