Fallout 2 with RP 2.3.3 : I can't extract a brain from a companion

Discussion in 'Fallout General Modding' started by Nerevar, Oct 28, 2014.

  1. Nerevar

    Nerevar First time out of the vault

    Oct 28, 2014
    I'd like to kill Myron and get his brain in the Sierra Army Depot, but every time I try to kill an NPC in the Organ Extraction Chamber, the extraction fails every time.

    I tried with every NPC, I tried with the NPC still in my party or out of my party (after telling him to wait), I have 125% science, I tried to give myself very high science and medical skills with a save editor... Nothing. Every time, I have the "Extraction failed" message, the "patient" still dies, and I don't get the brain. What can I do to fix this?

    I play with a French translation of the Restoration Project 2.3.3, obtained on "Generation Fallout" (the site is down for now)
     
  2. CPL

    CPL Still Mildly Glowing
    Modder

    Mar 16, 2013
    Unless they changed something in the current Restoration Project that I don't know about, I don't think you can get a brain that way with that machine. At least, it was never possible before. It always just killed anyone in the room no matter what you extract from them and you don't get any organs from it. The only way to get a brain for the robot is to use the other robot in the room in front of that one. That, or add one to your inventory with an editor.
     
  3. Nerevar

    Nerevar First time out of the vault

    Oct 28, 2014
    However, I saw people on the Internet saying that they managed to extract a brain with this. Even Fallout wikia seems to say that it is possible. Do these people lie? (Most of them say that no matter what options you enter in it, you always get the same basic human brain you get with the other machine... I still want to kill Myron and have fun with his brain)

    And could it be possible to restore this fuctionality by altering some script? (Scripts of Fallout 2 are pretty hard to understand BTW, there is no documentation about default procedures)
     
    Last edited: Oct 29, 2014
  4. J_Fred

    J_Fred Long time lurker

    Dec 22, 2013
    I don't think it's ever been possible. Though it would be neat I guess, especially if they maintained their same skills/demeanor. Personally I've always wanted Skynet to be a Sentry bot instead of a Robobrain. If that were the case I would use him more often.

    Some scripting tutorials that may help:
    http://falloutmods.wikia.com/wiki/Category:Fallout_2_tutorials_-_scripting
     
  5. Nerevar

    Nerevar First time out of the vault

    Oct 28, 2014
    This would be nice. But doesn't this means new brain items, new "versions" of Skynet?

    Perhaps making of him a sentry would have make him overpowered... But we can try to change it into a Sentry, I don't know how much work it would need.

    Thanks for your link, I already read some pages (not that easy, because most of them are some big blocks of text, and English is not my native language).

    But for example, I still don't know what "tile_contains_pid_obj(LVar2, elevation(self_obj), arg1);" is supposed to do.

    Here is wsterm4b.ssl, the uncompiled script for the organ extraction chamber computer, for those who are interested :

    Code:
    variable ProtoOfItemGiven;
    variable ValueOfRollCheck := 1;
    variable Scenery_Creation;
    variable Scenery_Creation_Hex;
    variable Scenery_Creation_Count;
    variable Temp_Scenery_Creation_Hex;
    variable Scenery_Creation_Ptr;
    variable How_Many_Party_Members_Are_Injured;
    variable How_Many_Party_Members_Armed;
    variable PartyHealingItem;
    
    procedure checkPartyMembersNearDoor;
    
    variable tmp_gen_rep;
    variable global_temp;
    variable dest_tile;
    variable step_tile;
    variable in_dialog;
    variable forced_node;
    variable restock_amt;
    variable restock_obj;
    variable restock_trash;
    variable removed_qty;
    
    procedure start;
    procedure use_p_proc;
    procedure talk_p_proc;
    procedure look_p_proc;
    procedure description_p_proc;
    procedure Node001;
    procedure Node010;
    procedure Node010a;
    procedure Node010b;
    procedure Node010c;
    procedure Node010d;
    procedure Node010e;
    procedure Node011;
    procedure Node011a;
    procedure Node011b;
    procedure Node012;
    procedure Node013;
    procedure Node013a;
    procedure Node013b;
    procedure Node013c;
    procedure Node013d;
    procedure Node013e;
    procedure Node013f;
    procedure Node013g;
    procedure Node014;
    procedure Node999;
    procedure use_skill_on_p_proc;
    procedure Check_And_Kill_Row(variable arg0, variable arg1);
    procedure Check_And_Kill(variable arg0);
    
    variable kill_player;
    
    
    procedure checkPartyMembersNearDoor
    begin
        if (party_member_obj(16777278) != 0) then begin
            if (tile_distance_objs(self_obj, party_member_obj(16777278)) <= 5) then begin
                return 1;
            end
        end
        if (party_member_obj(16777376) != 0) then begin // Myron!
            if (tile_distance_objs(self_obj, party_member_obj(16777376)) <= 5) then begin
                return 1;
            end
        end
        if (party_member_obj(16777377) != 0) then begin
            if (tile_distance_objs(self_obj, party_member_obj(16777377)) <= 5) then begin
                return 1;
            end
        end
        if (party_member_obj(16777305) != 0) then begin
            if (tile_distance_objs(self_obj, party_member_obj(16777305)) <= 5) then begin
                return 1;
            end
        end
        if (party_member_obj(16777313) != 0) then begin
            if (tile_distance_objs(self_obj, party_member_obj(16777313)) <= 5) then begin
                return 1;
            end
        end
        if (party_member_obj(16777323) != 0) then begin
            if (tile_distance_objs(self_obj, party_member_obj(16777323)) <= 5) then begin
                return 1;
            end
        end
        if (party_member_obj(16777352) != 0) then begin
            if (tile_distance_objs(self_obj, party_member_obj(16777352)) <= 5) then begin
                return 1;
            end
        end
        if (party_member_obj(16777378) != 0) then begin
            if (tile_distance_objs(self_obj, party_member_obj(16777378)) <= 5) then begin
                return 1;
            end
        end
        if (party_member_obj(16777368) != 0) then begin
            if (tile_distance_objs(self_obj, party_member_obj(16777368)) <= 5) then begin
                return 1;
            end
        end
        if (party_member_obj(16777379) != 0) then begin
            if (tile_distance_objs(self_obj, party_member_obj(16777379)) <= 5) then begin
                return 1;
            end
        end
        if (party_member_obj(16777380) != 0) then begin
            if (tile_distance_objs(self_obj, party_member_obj(16777380)) <= 5) then begin
                return 1;
            end
        end
        if (party_member_obj(16777295) != 0) then begin
            if (tile_distance_objs(self_obj, party_member_obj(16777295)) <= 5) then begin
                return 1;
            end
        end
        if (party_member_obj(16777381) != 0) then begin
            if (tile_distance_objs(self_obj, party_member_obj(16777381)) <= 5) then begin
                return 1;
            end
        end
        if (party_member_obj(16777407) != 0) then begin
            if (tile_distance_objs(self_obj, party_member_obj(16777407)) <= 5) then begin
                return 1;
            end
        end
        if (party_member_obj(16777411) != 0) then begin
            if (tile_distance_objs(self_obj, party_member_obj(16777411)) <= 5) then begin
                return 1;
            end
        end
        if (party_member_obj(16777412) != 0) then begin
            if (tile_distance_objs(self_obj, party_member_obj(16777412)) <= 5) then begin
                return 1;
            end
        end
        if (party_member_obj(16777413) != 0) then begin
            if (tile_distance_objs(self_obj, party_member_obj(16777413)) <= 5) then begin
                return 1;
            end
        end
        if (party_member_obj(16777481) != 0) then begin
            if (tile_distance_objs(self_obj, party_member_obj(16777481)) <= 5) then begin
                return 1;
            end
        end
        if (party_member_obj(16777558) != 0) then begin
            if (tile_distance_objs(self_obj, party_member_obj(16777558)) <= 5) then begin
                return 1;
            end
        end
        if (party_member_obj(16777600) != 0) then begin
            if (tile_distance_objs(self_obj, party_member_obj(16777600)) <= 5) then begin
                return 1;
            end
        end
        if (party_member_obj(16777718) != 0) then begin
            if (tile_distance_objs(self_obj, party_member_obj(16777718)) <= 5) then begin
                return 1;
            end
        end
        if (party_member_obj(16777719) != 0) then begin
            if (tile_distance_objs(self_obj, party_member_obj(16777719)) <= 5) then begin
                return 1;
            end
        end
        if (party_member_obj(16777720) != 0) then begin
            if (tile_distance_objs(self_obj, party_member_obj(16777720)) <= 5) then begin
                return 1;
            end
        end
        return 0;
    end
    
    procedure start
    begin
    end
    
    procedure use_p_proc
    begin
        variable LVar0 := 0;
        if (get_critter_stat(source_obj, 4) < 4) then begin
            if (source_obj == dude_obj) then begin
                display_msg(message_str(163, 102));
            end
            else begin
                display_msg(obj_name(source_obj) + message_str(163, 200));
            end
        end
        else begin
            dialogue_system_enter;
        end
    end
    
    procedure talk_p_proc
    begin
        start_gdialog(163, self_obj, 4, -1, -1);
        gsay_start;
        call Node001;
        gsay_end;
        end_dialogue;
        if (kill_player == 1) then begin
            kill_player := 0;
            critter_dmg(dude_obj, 10000, 0);
        end
    end
    
    procedure look_p_proc
    begin
        script_overrides;
        display_msg(message_str(163, 100));
    end
    
    procedure description_p_proc
    begin
        script_overrides;
        display_msg(message_str(163, 101));
    end
    
    procedure Node001
    begin
        gsay_reply(163, 103);
        giq_option(4, 163, 104, Node010, 50);
        giq_option(4, 163, 105, Node013, 50);
        giq_option(4, 163, 106, Node999, 50);
    end
    
    procedure Node010
    begin
        gsay_reply(163, message_str(163, 108) + message_str(163, 109) + message_str(163, 110) + message_str(163, 111) + message_str(163, 112) + message_str(163, 113));
        giq_option(4, 163, 114, Node010a, 50);
        giq_option(4, 163, 115, Node010b, 50);
        giq_option(4, 163, 116, Node010c, 50);
        giq_option(4, 163, 117, Node010d, 50);
        giq_option(4, 163, 118, Node010e, 50);
        giq_option(4, 163, 119, Node011, 50);
        giq_option(4, 163, 120, Node999, 50);
    end
    
    procedure Node010a
    begin
        set_local_var(1, 1);
        call Node012;
    end
    
    procedure Node010b
    begin
        set_local_var(1, 2);
        call Node012;
    end
    
    procedure Node010c
    begin
        set_local_var(1, 3);
        call Node012;
    end
    
    procedure Node010d
    begin
        set_local_var(1, 4);
        call Node012;
    end
    
    procedure Node010e
    begin
        set_local_var(1, 0);
        call Node012;
    end
    
    procedure Node011
    begin
        gsay_reply(163, 121);
        giq_option(4, 163, 122, Node011a, 50);
        giq_option(4, 163, 123, Node011b, 50);
    end
    
    procedure Node011a
    begin
        set_local_var(1, 5);
        call Node012;
    end
    
    procedure Node011b
    begin
        set_local_var(1, 6);
        call Node012;
    end
    
    procedure Node012
    begin
        gsay_reply(163, message_str(163, 125) + message_str(163, 126) + message_str(163, 170 + local_var(1)) + message_str(163, 127) + message_str(163, 180 + local_var(0)));
        giq_option(4, 163, 128, Node010, 50);
        giq_option(4, 163, 129, Node013, 50);
        giq_option(4, 163, 130, Node014, 50);
        giq_option(4, 163, 131, Node999, 50);
    end
    
    procedure Node013
    begin
        gsay_reply(163, message_str(163, 132) + message_str(163, 133) + message_str(163, 134) + message_str(163, 135) + message_str(163, 136) + message_str(163, 137) + message_str(163, 138) + message_str(163, 139));
        giq_option(4, 163, 140, Node013a, 50);
        giq_option(4, 163, 141, Node013b, 50);
        giq_option(4, 163, 142, Node013c, 50);
        giq_option(4, 163, 143, Node013d, 50);
        giq_option(4, 163, 144, Node013e, 50);
        giq_option(4, 163, 145, Node013f, 50);
        giq_option(4, 163, 146, Node013g, 50);
        giq_option(4, 163, 147, Node999, 50);
    end
    
    procedure Node013a
    begin
        set_local_var(0, 1);
        call Node012;
    end
    
    procedure Node013b
    begin
        set_local_var(0, 0);
        call Node012;
    end
    
    procedure Node013c
    begin
        set_local_var(0, 2);
        call Node012;
    end
    
    procedure Node013d
    begin
        set_local_var(0, 3);
        call Node012;
    end
    
    procedure Node013e
    begin
        set_local_var(0, 4);
        call Node012;
    end
    
    procedure Node013f
    begin
        set_local_var(0, 5);
        call Node012;
    end
    
    procedure Node013g
    begin
        set_local_var(0, 6);
        call Node012;
    end
    
    procedure Node014
    begin
        variable LVar0 := 0;
        variable LVar1 := 0;
        variable LVar2 := 0;
        variable LVar3 := 0;
        variable LVar4 := 0;
        LVar0 := LVar0 + Check_And_Kill(16777278);
        LVar0 := LVar0 + Check_And_Kill(16777376); // Myron, call of the function I actually try to decompose
        LVar0 := LVar0 + Check_And_Kill(16777377);
        LVar0 := LVar0 + Check_And_Kill(16777305);
        LVar0 := LVar0 + Check_And_Kill(16777313);
        LVar0 := LVar0 + Check_And_Kill(16777323);
        LVar0 := LVar0 + Check_And_Kill(16777378);
        LVar0 := LVar0 + Check_And_Kill(16777379);
        LVar0 := LVar0 + Check_And_Kill(16777380);
        LVar0 := LVar0 + Check_And_Kill(16777597);
        LVar4 := Check_And_Kill(16777352);
        if (LVar4 > 0) then begin
            LVar2 := 0;
            LVar0 := LVar0 + LVar4;
        end
        LVar4 := Check_And_Kill(16777558);
        if (LVar4 > 0) then begin
            LVar2 := 0;
            LVar0 := LVar0 + LVar4;
        end
        LVar4 := Check_And_Kill(16777600);
        if (LVar4 > 0) then begin
            LVar2 := 0;
            LVar0 := LVar0 + LVar4;
        end
        LVar4 := Check_And_Kill(16777687);
        if (LVar4 > 0) then begin
            LVar2 := 0;
            LVar0 := LVar0 + LVar4;
        end
        LVar4 := Check_And_Kill(16777381);
        if (LVar4 > 0) then begin
            LVar2 := 0;
            LVar0 := LVar0 + LVar4;
        end
        LVar4 := Check_And_Kill(16777368);
        if (LVar4 > 0) then begin
            LVar2 := 0;
            LVar0 := LVar0 + LVar4;
        end
        LVar4 := Check_And_Kill(16777295);
        if (LVar4 > 0) then begin
            LVar2 := 4;
            LVar0 := LVar0 + LVar4;
        end
        LVar4 := Check_And_Kill(16777596);
        if (LVar4 > 0) then begin
            LVar2 := 1;
            LVar0 := LVar0 + LVar4;
        end
        LVar4 := Check_And_Kill(16777595);
        if (LVar4 > 0) then begin
            LVar2 := 2;
            LVar0 := LVar0 + LVar4;
        end
        LVar4 := Check_And_Kill(16777292);
        if (LVar4 > 0) then begin
            LVar2 := 0;
            LVar3 := 1;
        end
        LVar4 := Check_And_Kill(16777293);
        if (LVar4 > 0) then begin
            LVar2 := 0;
            LVar3 := 1;
        end
        LVar4 := Check_And_Kill(16777294);
        if (LVar4 > 0) then begin
            LVar2 := 0;
            LVar3 := 1;
        end
        if (tile_in_tile_rect(16525, 16312, 18325, 18113, tile_num(dude_obj))) then begin
            LVar0 := LVar0 + 1;
            kill_player := 1;
            while(get_critter_stat(dude_obj, 4) > 1) do begin
                set_critter_stat(dude_obj, 4, -1);
            end
        end
        set_global_var(0, global_var(0) + (-100 * LVar0));
        debug_msg("Player gains " + (-100 * LVar0) + " Karma Points.");
        set_global_var(37, 0);
        set_global_var(38, 0);
        set_global_var(39, 0);
        set_global_var(40, 0);
        set_global_var(41, 0);
        set_global_var(42, 0);
        set_global_var(43, 0);
        set_global_var(44, 0);
        set_global_var(45, 0);
        tmp_gen_rep := global_var(0);
        if (has_trait(0, dude_obj, 95)) then begin
            tmp_gen_rep := global_var(0) * 2;
        end
        if (tmp_gen_rep >= 1000) then begin
            set_global_var(37, 1);
        end
        else
        if (tmp_gen_rep >= 750) then begin
            set_global_var(38, 1);
        end
        else
        if (tmp_gen_rep >= 500) then begin
            set_global_var(39, 1);
        end
        else
        if (tmp_gen_rep >= 250) then begin
            set_global_var(40, 1);
        end
        else
        if (tmp_gen_rep > -250) then begin
            set_global_var(41, 1);
        end
        else
        if (tmp_gen_rep > -500) then begin
            set_global_var(42, 1);
        end
        else
        if (tmp_gen_rep > -750) then begin
            set_global_var(43, 1);
        end
        else
        if (tmp_gen_rep > -1000) then begin
            set_global_var(44, 1);
        end
        else begin
            set_global_var(45, 1);
        end
        if ((local_var(2) == 0) and ((LVar0 > 0) or (LVar3 == 1))) then begin
            give_exp_points(500);
            display_msg(message_str(14, 100) + 500 + message_str(14, 101));
            set_local_var(2, 1);
        end
        debug_msg("Room_Capacity == " + LVar0);
        if ((LVar0 == 0) and (LVar3 == 0)) then begin
            gsay_reply(163, 148);
        end
        else
        if (LVar0 > 1) then begin
            gsay_reply(163, 149); // 149 = "Extraction failed"
        end
        else
        if (LVar2 == 0) then begin
            gsay_reply(163, 149); // 149 = "Extraction failed"
        end
        else
        if (not(1)) then begin
            gsay_reply(163, 150);
        end
        else
        if (LVar2 == 3) then begin
            LVar1 := create_object_sid(322, 0, 0, -1);
        end
        else
        if (LVar2 == 1) then begin
            LVar1 := create_object_sid(324, 0, 0, -1);
        end
        else
        if (LVar2 == 2) then begin
            LVar1 := create_object_sid(323, 0, 0, -1);
        end
        else
        if (LVar2 == 4) then begin
            LVar1 := create_object_sid(321, 0, 0, -1);
        end
        move_to(LVar1, 16515, 0);
        gsay_reply(163, message_str(163, 151) + message_str(163, 152)); // 151 = "Success of the extraction"
        giq_option(4, 163, 153, Node999, 50);
    end
    
    procedure Node999
    begin
    end
    
    procedure use_skill_on_p_proc
    begin
        variable LVar0 := 0;
        script_overrides;
        LVar0 := action_being_used;
        if (LVar0 == 12) then begin
            call use_p_proc;
        end
    end
    
    procedure Check_And_Kill_Row(variable arg0, variable arg1)
    begin
        variable LVar2 := 0;
        variable LVar3 := 0;
        variable LVar4 := 0;
        variable LVar5 := 0;
        LVar2 := arg0;
        LVar3 := arg0 + 10;
        while(LVar2 <= LVar3) do begin
            if (tile_contains_obj_pid(LVar2, elevation(self_obj), arg1)) then begin // What is this procedure supposed to do? And how can I know about default procedures?
                LVar4 := tile_contains_pid_obj(LVar2, elevation(self_obj), arg1); // and this one
                LVar5 := LVar5 + 1;
                critter_dmg(LVar4, 10000, 0);
            end
            LVar2 := LVar2 + 1;
        end
        return LVar5;
    end
    
    procedure Check_And_Kill(variable arg0)
    begin
        variable LVar1 := 0;
        variable LVar2 := 0;
        LVar1 := 16513;
        while(LVar1 <= 17713) do begin
            LVar2 := LVar2 + Check_And_Kill_Row(LVar1, arg0);
            LVar1 := LVar1 + 200;
        end
        return LVar2;
    end
    
    

    Node014 is the one we are interested in : it contains the check for the operation success.
     
    Last edited: Oct 29, 2014
  6. Drobovik

    Drobovik Vault Archivarius Modder

    Jun 20, 2011
    tile_contains_pid_obj, I believe, checks whether a certain object is located on a given tile. In this case your companions who are to be killed off.
     
  7. Nerevar

    Nerevar First time out of the vault

    Oct 28, 2014
    Thanks.

    Who has the PID "16777600" ? It doesn't appears in my party_op.ini


    Code:
    if (tile_in_tile_rect(16525, 16312, 18325, 18113, tile_num(dude_obj))) then begin
            LVar0 := LVar0 + 1;
            kill_player := 1;
            while(get_critter_stat(dude_obj, 4) > 1) do begin
                set_critter_stat(dude_obj, 4, -1);
            end
        end
    Was the script supposed to be able to kill you? O_o


    More news later...
     
    Last edited: Oct 29, 2014
  8. J_Fred

    J_Fred Long time lurker

    Dec 22, 2013
    Not sure on that.

    The megamod does make Skynet a sentry bot, though the quest to get him is a little more involved. I really wish Skynet as a Sentry Bot was a stand alone mod.
     
  9. Nerevar

    Nerevar First time out of the vault

    Oct 28, 2014
    Here are the two checks which give the "Extraction Failed" message.
    Code:
    ...else
    if (LVar0 > 1) then begin
            gsay_reply(163, 149);
        end
    LVar0 is the number of people in the extraction chamber. So if more than one person is in the room, the extraction fails. OK, this is normal.

    Code:
        else
        if (LVar2 == 0) then begin
            gsay_reply(163, 149);
        end
    else...
    Apparently, LVar2 is set to a value different from 0 if Skynet is in the extraction room.


    EDIT : I just brought Skynet to the extraction chamber and used the extractor on him... I had a message saying that the extraction succeeded, and the brain re-appears near the door. So... The only use of the chamber is to have the brain back? And kill the only character on who you can actually use this brain?

    I will try to fix this!

    (BTW making actual deathclaw and super mutant brain with individual stats may be interesting)

    EDIT 2 : I DID IT! Now, you can extract brains from your companions. Useful for characters with a low science skill, who don't want to give Skynet a crappy brain, and who are ready to sacrifice on of their companions (or who wants to get their companions' brains just for the lulz).
    https://mega.co.nz/#!t90jXRzT!A1Ao-xsxfmzbUE8dciaOUCwfcYP9wXf2QnCkI10NN9E
    The file goes to Fallout 2\data\Scripts

    BTW I just tried a human brain on Skynet, it almost turns it into a robot zombie, so I don't think that it could give the same skills/demeanor than his previous owner.
     
    Last edited: Oct 30, 2014
  10. Nerevar

    Nerevar First time out of the vault

    Oct 28, 2014
    Could it be possible to get the specific data about Skynet in the megamod? I'd like to try to make this one for you! :wink:
     
  11. J_Fred

    J_Fred Long time lurker

    Dec 22, 2013
    You can check the last 2-3 pages of the Megamod thread. MIB88 offered to help me, but my skillset was too far behind to even get started.

    Though I would appreciate your effort!
     
  12. J_Fred

    J_Fred Long time lurker

    Dec 22, 2013
  13. MIB88

    MIB88 Sonny, I Watched the Vault Bein' Built!
    Modder

    Feb 22, 2005
    I always intended to add a feature revolving around this to the MM: To be able to take out party NPC brains and add them to the robotic bodies. I only got my idea partially drawn out, though. Each would have their own way of dealing with the situation (of finding that their brains were in a robotic shell). I had a couple of story-lines roughly sketched out. For example, putting Myron into such a thing would definitely not work. I always figured that if his brain were put into it, he would freak out and attack the party. However, if Lenny were transferred, maybe he could handle the adjustment, seeing that he is much older and his ideas of life are somewhat different than the others. There was one story in which the brain could be transferred in order to save an NPC's life. In one scenario, Cassidy might accept the transfer due to his failing heart and he only had a limited time to live anyway (I was going to add a timer to him to kill him off). In another scenario, one of the other NPCs would be mortally wounded (either a deadly poison or special type of radiation overdose) and you could transfer the brain to save them. And other ideas...

    But, I digress. There are a few ways you could do this: You could make completely new party NPCs. Nothing overly complicated here. Just a lot of copying and editing those copies (scripts and .pro files). You could just force the party NPC to use the robotic shell graphics (but that way is a cheat, and would lead to other problems, I think). Or, you could modify one script while copy/pasting all the information from other party NPC scripts into it. Some well-placed global variable could do much of your work. However, you would have a ton of work editing and keeping track of local variables, node numbers, talking heads, etc.

    What I recommend:
    1. Make new items for each party member you want the ability to transfer brains from. Or, you could just copy the .pro file for the human brain already in the game (item 322) for each potential party member. For example, item 650 might be Cassidy's brain, 651 is Myron's brain, 652 is Vic's brain, etc. Change the description with the various tools and a text editor. VERY IMPORTANT: if you are going to copy instead of create new, make sure you use one of the tools to change the item number INSIDE the file. If you copy 0000322.pro and rename it 000650.pro, in some cases it will still think it is 0000322 unless you change that internal number. I am sorry if I made it sound complicated, but when you see the tools, you will realize it is not difficult.
    2. Make new critter .pro files for the party NPCs with robot bodies. Or, you could use the same as above and copy them (while remembering to use the tool for changing the internal item number). Again, one for each party member.
    3. Edit the script where it calls for using brains 321-324 and add in conditions for your new brains. Again, copy and paste here.
    a. You will have to create some new dialog here when interacting with the terminal with regards to the new brains.
    b. Instead of referencing whatever critter is created with the Skynet or the other brains, reference the new critters you created. (Remember, the critter number is the .pro file number +216.)
    c. Not sure, but you may have to edit any corresponding global variables and/or create new ones. (Added in the vault13.gam file in the data\data folder.)
    4. Edit you party.txt file to reflect the new party member in robotic shell. (Again, one new entry for each new brain.)
    5. Keep us posted of your progress and let us know if/when you need help. ;)

    Personally, I would not add levels to an NPC in a robotic shell. You could do it, though. But, let's get one level sorted out first. Also, I hate to say this, but, the project is only partially completed if you do the above. You also have to go through a lot of scripts that check if you have members in your party. Want doctors to be able to see and heal him? They have to be modified. Scripts with cut scenes need to be modified (like Horrigan at the BoS and Vault 13)... Fighting Lenny in NCR... Boxing in New Reno... Fighting in San Francisco... and maybe a few others I can't think of right now.
     
    Last edited: Oct 30, 2014
  14. Nerevar

    Nerevar First time out of the vault

    Oct 28, 2014
    IIRC, Sentries only have sprites for the use of miniguns and rocket launchers, the perfect weapons to kill your allies rather than your enemies. (but it is just my opinion)
    And for needed stuff to do to reactivate Sentry Skynet... Why not two pieces that would be dropped once by any other sentry?
    Any other suggestion?


    About Skynet having the same personality than the previous owner of the brain, well... When you put an human brain in Skynet, he only has dialogs like :
    "Followwww--innnnnng."
    "Waaaaa....tinnnnnnng."
    "Large...hand...gunssss Riiiii...fulsShot...gunnnnnnnns"

    This turns it into a servile zombie robot. I suggest to add a new item that the player would need to use on Skynet after putting in the brain if (s)he want to keep companions' personality. And perhaps a science/medecine check.

    And why not going further? We could allow the player to ask a NPC to take his brain and putting it in Skynet, allowing us to play as a robot? Depending of the asked NPC and the instructions given to him before, the operation could success or fail.
    However, this also means new sprites and a lot more to be modified, or many weapons becoming impossible to use.
     
    Last edited: Oct 30, 2014
  15. valcik

    valcik So Old I'm Losing Radiation Signs

    Dec 20, 2008
    Hm, I thought that the brain is used as a medium for uploading the Skynet's own artificial personality stored in the SAD mainframe. That's the purpose of whole operation, isn't it? After uploading Skynet into new brain, previous brain owner's personality (and skills) should disappear, being replaced with Skynet IMO.
     
  16. Nerevar

    Nerevar First time out of the vault

    Oct 28, 2014
    And this is why Skynet does not seem to have any memory of the previous brain. This is what bothered and still bothers me about this companion personality transfer thing.
    Unless you manage to prevent Skynet to upload itself into the brain...

    Furthermore, there would be no problem for rifle characters, but I hardly see robot Sulik using a hammer or robot Marcus using a heavy weapon with a new body they are not used to at all.
     
    Last edited: Oct 30, 2014
  17. J_Fred

    J_Fred Long time lurker

    Dec 22, 2013
    Maybe it should require the player leaving the SAD to find a few parts or tech books/know how? I would think creating a Sentry Bot from scratch would be quite difficult. Maybe a high science/repair skill requirement as well.

    And the gun usage would be the trade off. The Sentry Bots (Mk. II especially) are near invulnerable to most small arms fire, and some heavier weapons too. So to have a hulking terminator on your team that also has infinite or free/cheap ammo would be far too overpowered. Make him more of an "oh shit we are all gonna die if you don't blow up everyone with your rockets" contingency plan. I also use party control in sfall so my companions don't shoot me in the back anymore... unless I want them to, I guess.

    But to be fair, I'd be happy if the Skynet sprite was just a Sentry Bot with comparable stats. Everything else (weaponry, story, etc...) I could work with or change myself.

    You could also use Mr.Fixit to make crafting the "Robo Rocket Ammo" possible. Phobos uses it in his economy mod, and it's quite easy to add new items using his platform (I know because even I can do it). So being able to breakdown rockets into the smaller robo rockets would be pretty cool.

    This is looking very far ahead, but just some ideas. The NPC brain sounds neat, but I don't mind Skynet as a stand alone companion.
     
  18. gustarballs1983

    gustarballs1983 Look, Ma! Two Heads!

    Oct 28, 2009
    the way I see it the organ extraction chamber was ment to work on robobrains due to player beeing unable/fail to extract the cybernetic brain from the storage. So probably developers figured as a failsafe option that player has a chance to lure one of the robobrain robots from SAD facility to the extraction chamber, then extract the cybernetic brain from that robot and have it ready to be installed in robotic body that skynet transfers itself into. the whole idea of transfering myron or any other npc to a robotic body is pure absurd for two reasons 1. we activate the robobrain to have a vessel for skynet and 2. there is no guarantee that inferior human brain and mind would have the proper knowledge to operate a robotic body imean switching legs to wheels and arms to servomanipulators is not a straight goto deal there is no guarantee that even myron's brain would know how to give proper computer commands to digital components of his new robotic body with just his own thoughts.
    So I say Yes for modding/developing an alternative way of getting the cybernetic brain by luring a facility driven robobrain into the extraction chamber =>extract the cybernetic brain, and no to imaginary transfering npc to robotic bodies since from the very beginning it was meant to be a mobile body for skynet operating system.
    The probable reason for having the extraction chamber and an ability to extract organs was that SAD is accesed relatively early in the game so most of the players would not have enaugh skill points given into science skill to match that 125% minimum for sucesfull aquiring of cybernetic brain from storage. Fallout 2 in it's quests often gives alternative solutions to the problem for example boxing in new reno You do not need to be unarmed champion of the wastes when You can use plated boxing gloves.. probably same thing was ment to be with the organ extraction machine, although i'm not sure if it was fully implemented by the developers.
     
  19. MIB88

    MIB88 Sonny, I Watched the Vault Bein' Built!
    Modder

    Feb 22, 2005
    Handheld laser weapons... overexposure to radiation creating Ghouls who continue to thrive off that radiation... mega-powerfists and super-sledges... the G.E.C.K... subdermal combat armor implants... pills to make one so much smarter or stronger for a few hours... medical procedures to make one stronger or smarter or whatever by being in a cryotank for a couple of weeks...

    And now you get hung up on science/realism?!
     
  20. CPL

    CPL Still Mildly Glowing
    Modder

    Mar 16, 2013
    Yeah, and the whole combat thing in the game in general. You can look up what a shotgun will do to someone's head at close range and see the results. It's a lot more damage than a few missing "hit points." :razz: I wouldn't get too hung up on realism, either.