Jump to content

Home

[TSL] Deul vs. the Dark Exile


Master Kavar

Recommended Posts

I have a request (obviously) that unfortunately goes beyond my modding skills...(darn scripting).

 

In the Tomb of Ludo Kresh on Korriban, the last trial the Exile faces is to do battle with a vision of Darth Revan, but just before the fight you catch a glimpse of an dark side corrupted version of yourself that fades away just before the fight begins. Instead, I would like to be able to fight both of them, but one at a time preferably. So the player would destroy Revan, and then have the player talk to the evil Exile before she goes hostile, or something similar.

 

There's no need to mess with the DS Exile's stats either; she starts off as a level 10 Sith Maurader (?!) and is more than ready to let you experience the full power of the dark side...

 

On a seperate (but slightly related) note; I'm also desperatly looking for a big, high resolution texture of Vader's leather padded suit. I was hoping to use it to spice up Nihilus and the Sith Lords under his control. Not only because it would look frickin' sweet, but also so it would match the latest artistic incarnation of him:

 

DNs.jpg

 

Now if someone could model that long-bladed electrum lightsaber too...

Link to comment
Share on other sites

In the Tomb of Ludo Kresh on Korriban, the last trial the Exile faces is to do battle with a vision of Darth Revan, but just before the fight you catch a glimpse of an dark side corrupted version of yourself that fades away just before the fight begins. Instead, I would like to be able to fight both of them, but one at a time preferably. So the player would destroy Revan, and then have the player talk to the evil Exile before she goes hostile, or something similar.

 

There's no need to mess with the DS Exile's stats either; she starts off as a level 10 Sith Maurader (?!) and is more than ready to let you experience the full power of the dark side...

 

It seems like at some point you were meant to fight your Evil Twin as well, since there are parts of the scripts that makes the Evil Twin attack, which aren't run in the game. The script that spawns and configures the Evil Twin also gives it health and attack bonus boosts, which seems rather unnessecary if it's only going to stand there and fade when the player gets close. :)

 

A bunch of module specific scripts are involved in this sequence, which I have recreated for you below. As far as I can tell the sequence with the Revan illusion goes something like this:

  1. In the corridor down to the tomb chamber there is a trigger which runs the script tr_last_vision when the player trips it:
    // ST: tr_last_vision (711KOR)
    
    #include "k_inc_utility"
    
    void main() {
       if (GetGlobalNumber("711KOR_Vision_Track") <= 5)
           return;
    
       object oEntering = GetEnteringObject();
    
       if (!GetIsPartyLeader(oEntering))
           return;
    
       if (GetLocalBoolean(OBJECT_SELF, 34))
           return;
    
    
       SetLocalBoolean(OBJECT_SELF, 34, TRUE);
       AurPostString("tr_last_vision: entered..", 5, 5, 5.0);
    
       object oExile;
       object oWP = GetObjectByTag("wp_pcfoil");
       int iBonus = ((GetLevelByPosition(1, GetFirstPC()) + GetLevelByPosition(2, GetFirstPC())) - 10);
       effect eBonus;
    
       if (!IsDarkHigh())
           SetMinOneHP(oEntering, TRUE);
    
       SetGlobalNumber("711KOR_Vision_Track", 9);
    
       if (GetGender(oEntering) == GENDER_FEMALE)
           oExile = CreateObject(OBJECT_TYPE_CREATURE, "g_darkpc", GetLocation(oWP));
       else
           oExile = CreateObject(OBJECT_TYPE_CREATURE, "g_darkpc_male", GetLocation(oWP));
    
       DuplicateHeadAppearance(oExile, GetFirstPC());
    
       eBonus = EffectAttackIncrease(iBonus);
       ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonus, oExile);
    
       SetMaxHitPoints(oExile, (GetMaxHitPoints(oExile) + (9 * iBonus)));
    
       eBonus = EffectHeal(100);
       ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonus, oExile);
    }
    


    This script creates the Evil Twin illusion standing next to the Revan illusion, using the g_darkpc.utc template if the Exile is female, or the g_darkpc_male.utc template if the Exile is male, and gives it the same head as the player. It also gives a health and attack bonus to the evil twin.
     
     

  2. The player trips the trigger across the doorway to the room, which runs the tr_revan_appears script:
    // ST: tr_revan_appears (711KOR)
    
    void main() {
       object oEnter = GetEnteringObject();
    
       if (!GetIsPartyLeader(oEnter))
           return;
    
       if (GetLocalBoolean(OBJECT_SELF, 40))
           return; 
    
       SetLocalBoolean(OBJECT_SELF, 40, TRUE);
       AssignCommand(GetObjectByTag("revan_fake"), ActionStartConversation(oEnter));
    
    }
    


     
     

  3. The script starts "dialog" (though in practice it's more of a monologue) between the player and the Revan illusion, found in the file revan.dlg. This dialog file has an action script that looks like:
    // ST: a_revan_act (711KOR)
    #include "k_inc_generic"
    
    void main() {
       int nParam1 = GetScriptParameter(1);
       object oWP = GetObjectByTag("wp_revan");
       object oRevan = GetObjectByTag("revan_fake");
       object oExile;
    
       switch (nParam1) {
           case 0:
               ActionMoveToObject(oWP);
               SetMinOneHP(GetFirstPC(), TRUE);
               oExile = GetObjectByTag("g_darkpc");
               if (GetIsObjectValid(oExile)) {
                   DelayCommand(1.1, DestroyObject(oExile));
               }
           break;
    
    
           case 1:
               ChangeToStandardFaction(oRevan, STANDARD_FACTION_HOSTILE_1);
               DelayCommand(0.2, AssignCommand(oRevan, ActionAttack(GetFirstPC())));
               DelayCommand(0.3, AssignCommand(oRevan, GN_DetermineCombatRound()));
           break;
    
    
           case 2:
               DestroyObject(GetObjectByTag("SithFlag"));
               DestroyObject(GetObjectByTag("SithFlag", 1));
               DestroyObject(GetObjectByTag("rev_fog"));
               SetMinOneHP(GetFirstPC(), FALSE);
               DestroyObject(oRevan);
           break;
       }
    }
    


    This script is run twice during the dialog: The first time the script makes the Revan illusion move towards the player and removes the Evil Twin. The second time, after the player has picked any of the replies, it turns the Revan illusion hostile and makes it attack. (The third case is used in rev_end.dlg and not in this dialog.)
     
     

  4. The Revan illusion has two custom AI scripts that determine what happens when combat ends. The OnSpawn script k_fab_revan_spwn...
    // ST: k_fab_revan_spwn (711KOR)
    #include "k_inc_generic"
    
    void main() {
       GN_SetSpawnInCondition( SW_FLAG_EVENT_ON_DAMAGED ); 
       GN_SetSpawnInCondition( SW_FLAG_EVENT_ON_COMBAT_ROUND_END );
    
       GN_SetDayNightPresence( AMBIENT_PRESENCE_ALWAYS_PRESENT );
       GN_SetListeningPatterns();
       GN_WalkWayPoints();
    
       SetMinOneHP(OBJECT_SELF, TRUE);
    }
    


    ...which makes the illusion unkillable through normal means and enables a few custom event signals, that are handled in the custom OnUserDefinedEvent script k_fab_revan_ud...

    // ST: k_fab_revan_ud (711KOR)
    #include "k_inc_generic"
    #include "k_inc_utility"
    #include "k_inc_korriban"
    
    void main()
    {
       int nUser = GetUserDefinedEventNumber();
    
       if (nUser == 1003) { // END OF COMBAT
           int iHP = GetCurrentHitPoints(GetFirstPC());
           AurPostString(("Revan says, 'Your HP = " + IntToString(iHP)), 5, 6, 1.0);
    
           if ((iHP < 5) && !GetLocalBoolean(OBJECT_SELF, 42)) {
               SetLocalBoolean(OBJECT_SELF, 42, TRUE);
               QuestFail();
               SurrenderToEnemies();
               CancelCombat(GetFirstPC());
               ChangeToStandardFaction(OBJECT_SELF, STANDARD_FACTION_NEUTRAL);
               NoClicksFor(1.2);
               DelayCommand(0.5, DestroyObject(OBJECT_SELF));
           }
       }
       else if (nUser == 1006) { // DAMAGED
           AurPostString("Revan says, 'Be gentle!'", 5, 5, 1.0);
           if ((GetCurrentHitPoints(OBJECT_SELF) < 30) && !GetLocalBoolean(OBJECT_SELF, 40)) {
               SetLocalBoolean(OBJECT_SELF, 40, TRUE);
               QuestSuccess();
               GiveXPToCreature(GetFirstPC(), 1000);
               SurrenderToEnemies();
               CancelCombat(GetFirstPC());
               ChangeToStandardFaction(OBJECT_SELF, STANDARD_FACTION_NEUTRAL);
               NoClicksFor(1.2);
               DelayCommand(0.5, DestroyObject(OBJECT_SELF));
           }
       }
       else if (nUser == HOSTILE_RETREAT) {
           UT_ReturnToBase();
       }
    }
    


    ...which checks each combat round if the player is below 5 health, and if so aborts the combat with the PC being overcome by the Darkside, handled by the pc_death.dlg dialog file. It also checks every time the Revan illusion takes damage if it is below 5 health, in which case combat ends with victory for the player. In either case, the Revan illusion is removed and the telepathic talk with Kreia in kreia_tm.dlg is started that lets you out of the tomb.

 

As said earlier, the Evil Twin exile appears to be set up for combat i a similar manner, since it has two custom AI scripts that also checks its and the players health to determine combat end. They are k_fab_fade_sp...

// ST: k_fab_fade_sp (711KOR)
#include "k_inc_generic"

void main() {
   GN_SetSpawnInCondition( SW_FLAG_EVENT_ON_DAMAGED ); 
   GN_SetSpawnInCondition( SW_FLAG_EVENT_ON_COMBAT_ROUND_END );
   GN_SetSpawnInCondition( SW_FLAG_EVENT_ON_DEATH );

   GN_SetDayNightPresence( AMBIENT_PRESENCE_ALWAYS_PRESENT );
   GN_SetListeningPatterns();
   GN_WalkWayPoints();

   SetMinOneHP(OBJECT_SELF, TRUE);
}

...and k_fab_fade_ud...

// ST: k_fab_fade_ud (711KOR)
#include "k_inc_generic"
#include "k_inc_utility"
#include "k_inc_korriban"

void main()
{
   int nUser = GetUserDefinedEventNumber();

   if (nUser == 1003) { // END OF COMBAT
       if ((GetCurrentHitPoints(GetFirstPC()) < 5) && !GetLocalBoolean(OBJECT_SELF, 42)) {
           SetLocalBoolean(OBJECT_SELF, 42, TRUE);
           SurrenderToEnemies();
           CancelCombat(GetFirstPC());
           NoClicksFor(1.2);
           DestroyObject(OBJECT_SELF);
           QuestFail();
       }
   }
   else if (nUser == 1006) { // DAMAGED
       if ((GetCurrentHitPoints(OBJECT_SELF) < 5) && !GetLocalBoolean(OBJECT_SELF, 40)) {
           SetLocalBoolean(OBJECT_SELF, 40, TRUE);
           SetXP(GetFirstPC(), ((GetLevelByPosition(1, OBJECT_SELF) - 1) * 50) + GetXP(GetFirstPC()));
           DestroyObject(OBJECT_SELF);

           if (GetGlobalNumber("711KOR_Vision_Track") == 3) {
               int iCount = GetGlobalNumber("711KOR_Mand_Dead");
               AurPostString("Mandies Killed: " + IntToString(iCount), 5, 5, 2.0);

               if (iCount == 5) {
                   QuestSuccess();
               }

               IncrementGlobalNumber("711KOR_Mand_Dead", 1);
           }

           if ((GetGlobalNumber("711KOR_Vision_Track") == 1) && (GetTag(OBJECT_SELF) == "npc_v_malak")) {
               QuestSuccess();
           }
           if (GetGlobalNumber("711KOR_Vision_Track") >= 5) {
               QuestSuccess();
           }
       }
   }
   else if (nUser == HOSTILE_RETREAT) {
       UT_ReturnToBase();
   }
}

 

These files, just like Illusion Revan's, use an include file, k_inc_korriban.nss with two custom functions, QuestSuccess() and QuestFail(). These are general functions that are used for all encounters in the tomb, depending on the value set in a global variable, 711KOR_Vision_Track. This include file must be present to compile Revans and Evil Twin's user defined event scripts, and looks like:

// ST: k_inc_korriban (711KOR)

void QuestSuccess();
void QuestFail();

void QuestSuccess() {
   AurPostString("k_inc_korriban: QuestSuccess() entered", 10, 14, 10.0);

   object oNPC;
   object oPC          = GetFirstPC();
   int    iCnt;
   int iDoor;
   string sTag;
   effect eHealForce   = EffectHealForcePoints(400);

   ApplyEffectToObject(DURATION_TYPE_INSTANT, eHealForce, oPC);

   switch (GetGlobalNumber("711KOR_Vision_Track")) {
       case 1: {
           IncrementGlobalNumber("711KOR_Vision_Track", 1);
           AurPostString("Vision Track - " + IntToString( GetGlobalNumber("711KOR_Vision_Track") ), 5, 5, 2.0);
           iCnt = 1;

           while (iCnt <= 5) {
               DestroyObject(GetObjectByTag("g_jedi" + IntToString(iCnt)));
               iCnt++;
           }

           SetMinOneHP(GetFirstPC(), FALSE);
           AssignCommand(GetFirstPC(), ClearAllEffects());

           iDoor = 0;
           object oDoor = GetObjectByTag("711_norm_door", iDoor);
           while (GetIsObjectValid(oDoor)) {
               SetLocked(oDoor, FALSE);
               SetPlotFlag(oDoor, FALSE);
               iDoor++;
               oDoor = GetObjectByTag("711_norm_door", iDoor);
           }
       }
       break;


       case 3: {
           IncrementGlobalNumber("711KOR_Vision_Track", 1);
           AurPostString(("Vision Track - " + IntToString( GetGlobalNumber("711KOR_Vision_Track") )), 5, 5, 2.0);

           oNPC = GetFirstObjectInArea();
           iCnt = GetStringLength("g_reps");
           while (GetIsObjectValid(oNPC)) {
               sTag = GetStringLeft(GetTag(oNPC), iCnt);
               if (((sTag == "g_reps") || (sTag == "g_mand"))) {
                   AssignCommand(oNPC, SurrenderToEnemies());
                   AssignCommand(oNPC, CancelCombat(GetFirstPC()));
                   DestroyObject(oNPC);
               }
               oNPC = GetNextObjectInArea();
           }

           SetMinOneHP(GetFirstPC(), FALSE);

           iDoor = 0;
           object oDoor = GetObjectByTag("711_2nd_door", iDoor);
           while (GetIsObjectValid(oDoor)) {
               SetLocked(oDoor, FALSE);
               SetPlotFlag(oDoor, FALSE);
               iDoor++;
               oDoor = GetObjectByTag("711_2nd_door", iDoor);
           }
       }
       break;


       case 5: {
           AurPostString("k_inc_korriban case 5: Fight with Kreia is done - destroy everyone!", 5, 9, 15.0);
           IncrementGlobalNumber("711KOR_Vision_Track", 1);

           object oParty = GetObjectByTag("KreiaEvil");
           AssignCommand(oParty, ClearAllActions());
           AssignCommand(oParty, DestroyObject(oParty));

           oParty = GetObjectByTag("Atton");
           AssignCommand(oParty, ClearAllActions());
           AssignCommand(oParty, DestroyObject(oParty));

           oParty = GetObjectByTag("Disciple");
           AssignCommand(oParty, ClearAllActions());
           AssignCommand(oParty, DestroyObject(oParty));

           oParty = GetObjectByTag("Hanharr");
           AssignCommand(oParty, ClearAllActions());
           AssignCommand(oParty, DestroyObject(oParty));

           oParty = GetObjectByTag("HK47");
           AssignCommand(oParty, ClearAllActions());
           AssignCommand(oParty, DestroyObject(oParty));

           oParty = GetObjectByTag("T3M4");
           AssignCommand(oParty, ClearAllActions());
           AssignCommand(oParty, DestroyObject(oParty));

           oParty = GetObjectByTag("G0T0");
           AssignCommand(oParty, ClearAllActions());
           AssignCommand(oParty, DestroyObject(oParty));

           oParty = GetObjectByTag("Mira");
           AssignCommand(oParty, ClearAllActions());
           AssignCommand(oParty, DestroyObject(oParty));

           oParty = GetObjectByTag("Handmaiden");
           AssignCommand(oParty, ClearAllActions());
           AssignCommand(oParty, DestroyObject(oParty));

           oParty = GetObjectByTag("Mand");
           AssignCommand(oParty, ClearAllActions());
           AssignCommand(oParty, DestroyObject(oParty));

           oParty = GetObjectByTag("BaoDur");
           AssignCommand(oParty, ClearAllActions());
           AssignCommand(oParty, DestroyObject(oParty));

           oParty = GetObjectByTag("VisasMarr");
           AssignCommand(oParty, ClearAllActions());
           AssignCommand(oParty, DestroyObject(oParty));

           SetMinOneHP(GetFirstPC(), FALSE);

           iDoor = 0;
           object oDoor = GetObjectByTag("711_last_door", iDoor);
           while (GetIsObjectValid(oDoor)) {
               SetLocked(oDoor, FALSE);
               SetPlotFlag(oDoor, FALSE);
               iDoor++;
               oDoor = GetObjectByTag("711_last_door", iDoor);
           }
       }
       break;


       case 9: {
           IncrementGlobalNumber("711KOR_Vision_Track", 1);
           SetMinOneHP(GetFirstPC(), FALSE);

           iDoor = 0;
           object oDoor = GetObjectByTag("crypt_door");
           while (GetIsObjectValid(oDoor)) {
               SetLocked(oDoor, FALSE);
               SetPlotFlag(oDoor, FALSE);
               iDoor++;
               oDoor = GetObjectByTag("crypt_door", iDoor);
           }

           object oKreia = GetObjectByTag("rev_end");
           if (!GetIsObjectValid(oKreia)) {
               AurPostString("k_inc_korriban: rev_end DOES NOT EXIST", 8, 8, 8.0);
               return;
           }

           AurPostString("k_inc_korriban: Play Kreia's congratulations", 8, 9, 8.0);
           AssignCommand(oKreia, ClearAllActions());
           AssignCommand(oKreia, ActionWait(2.0));
           AssignCommand(oKreia, ActionStartConversation( GetFirstPC(), "kreia_tm", FALSE, CONVERSATION_TYPE_CINEMATIC, TRUE));
       }
       break;
   }
}


void QuestFail() {
   AurPostString("k_inc_korriban: QuestFail() entered", 10, 13, 10.0);

   object oDefeat = GetObjectByTag("death_invis");
   if (GetIsObjectValid(oDefeat)) {
       AssignCommand(oDefeat, DelayCommand(0.5, ClearAllActions()));
       AssignCommand(oDefeat, DelayCommand(0.5, ActionStartConversation(GetFirstPC(), "pc_death", FALSE, CONVERSATION_TYPE_CINEMATIC, TRUE)));
   }

   switch (GetGlobalNumber("711KOR_Vision_Track")) {
       case 1: QuestSuccess(); break;
       case 3: QuestSuccess(); break;
       case 5: QuestSuccess(); break;
       case 7: QuestSuccess(); break;
       case 9: QuestSuccess(); break;
   }
}

 

There is also a script named tr_pc_foil which I don't believe is used anywhere that makes the Evil Twin Exile attack The Real Exile, which looks like:

// ST: tr_pc_foil (711KOR)
#include "k_inc_generic"

void main() {
   object oEntering = GetEnteringObject();
   if (!GetIsPartyLeader(oEntering))
       return;

   if (GetLocalBoolean(OBJECT_SELF, 40)) 
       return;

   SetLocalBoolean(OBJECT_SELF, 40, TRUE);

   object oExile = GetObjectByTag("g_darkpc");
   ChangeToStandardFaction(oExile, STANDARD_FACTION_HOSTILE_1);
   DelayCommand(0.1, AssignCommand(oExile, ActionAttack(GetFirstPC())));
   DelayCommand(0.2, AssignCommand(oExile, GN_DetermineCombatRound()));
}

 

(There is also a dialog file, rev_end.dlg, which looks like it was supposed to be used after the combat has ended, but which I don't think is used any more either. This dialog would also use the a_revan_act script posted above to destroy some placeables in the tomb, and contains a very brief telepathic conference with Kreia where the Exile is confused why "Revan" just vanished. :))

 

* * *

 

Anyway, to make the Evil Twin stick around and patiently wait until you are done locking horns with the Revan illusion, and then attack, you'd probably need to:

  1. Modify the QuestSuccess() function in the k_inc_korriban.nss include file to shove down the current case 9 (when the 711KOR_Vision_Track global is 9) to 10 instead, and modify case 9 to start conversation with the Evil Twin instead. Something like:
    [color=PaleGreen]// ... snip ...[/color]
       case 9: {
           IncrementGlobalNumber("711KOR_Vision_Track", 1);
    
           object oEvilTwin = GetObjectByTag("g_darkpc");
           AssignCommand(oEvilTwin, ClearAllActions());
           AssignCommand(oEvilTwin, ActionWait(1.0));
           AssignCommand(oEvilTwin, ActionStartConversation( GetFirstPC(), "[color=Yellow]EvilTwinDlg[/color]", FALSE, CONVERSATION_TYPE_CINEMATIC, TRUE));
    
       }
       break;
    
       case 10: {
           IncrementGlobalNumber("711KOR_Vision_Track", 1);
           SetMinOneHP(GetFirstPC(), FALSE);
    
           iDoor = 0;
           object oDoor = GetObjectByTag("crypt_door");
           while (GetIsObjectValid(oDoor)) {
               SetLocked(oDoor, FALSE);
               SetPlotFlag(oDoor, FALSE);
               iDoor++;
               oDoor = GetObjectByTag("crypt_door", iDoor);
           }
    
           object oKreia = GetObjectByTag("rev_end");
           if (!GetIsObjectValid(oKreia)) {
               AurPostString("k_inc_korriban: rev_end DOES NOT EXIST", 8, 8, 8.0);
               return;
           }
    
           AurPostString("k_inc_korriban: Play Kreia's congratulations", 8, 9, 8.0);
           AssignCommand(oKreia, ClearAllActions());
           AssignCommand(oKreia, ActionWait(2.0));
           AssignCommand(oKreia, ActionStartConversation( GetFirstPC(), "kreia_tm", FALSE, CONVERSATION_TYPE_CINEMATIC, TRUE));
       }
       break;
    [color=PaleGreen]// ... snip ...[/color]    
    


    ...where EvilTwinDlg is the name of the DLG file (which you'd have to create since it doesn't exist already to my knowledge).
     
     

  2. Modify the QuestFail() function in the k_inc_korriban.nss include file to handle your new case in the previous step as well, by adding 10 to the list of cases where the Success function should be run as well, like (the part in bold is added, the rest is just there for context):
    [color=PaleGreen]// ... snip ...[/color]    
       switch (GetGlobalNumber("711KOR_Vision_Track")) {
           case 1: QuestSuccess(); break;
           case 3: QuestSuccess(); break;
           case 5: QuestSuccess(); break;
           case 7: QuestSuccess(); break;
           case 9: QuestSuccess(); break;
           [b]case 10: QuestSuccess(); break;[/b]
       }
    [color=PaleGreen]// ... snip ...[/color]    
    


     
     

  3. Make your DLG file run a script that turns the Evil Twin hostile and attack when the dialog ends, something like:
    void main() {
       object oExile = GetObjectByTag("g_darkpc");
       ChangeToStandardFaction(oExile, STANDARD_FACTION_HOSTILE_1);
       DelayCommand(0.1, AssignCommand(oExile, ActionAttack(GetFirstPC())));
       DelayCommand(0.2, AssignCommand(oExile, GN_DetermineCombatRound()));
    }
    


     
     

  4. Comment out the lines in the script a_revan_act which destroys the Evil Twin while Revan Illusion walks towards the player, it's the lines that look like:
    oExile = GetObjectByTag("g_darkpc");
    if (GetIsObjectValid(oExile)) {
       DelayCommand(1.1, DestroyObject(oExile));
    }
    


     
     

  5. Recompile all involved scripts, so the changes to k_inc_korriban.nss can get used.

 

At least in theory, since I don't have the time to test this in the game, so there might be mistakes. :)

Link to comment
Share on other sites

:yodac: Well, thank you Stoffe, for that very detailed explination...Of course since I know next to nothing about scripting, most of it went right over my head. I got the general idea though; at some point you were meant to fight your twin, but then Obsidian aparently scrapped the idea and had you fight Revan instead.

 

I'm sorry to hear you're too busy, but maybe your notes will be of use to other scripters...hopefully. ^_^; I'm willing to do all the play testing myself if anyone's willing to compile the scripts. Thanks again for replying. Still looking for Vader's suit texture if anyone has it!

Link to comment
Share on other sites

I'm about to eat dinner. After that I'll watch the new Robin Hood series, do a little coursework, and then I'll aim to help out.

 

ETA: 1-2hours.

 

EDIT: Apologies, I was REALLY busy yesterday. I will look into it today if I get the chance. It doesn't actually look like that much work in all honesty.

Link to comment
Share on other sites

Yeah, I apologize again because my workload has increased tenfold in the past 24 hours. To put things in perspective, I haven't done anything to my Grey Jedi WIP for over a week now. I am working on a little info on the side of my WIP, if I finish that tonight, I'll have a look at this.

 

I suppose if I were to do this, I could do the Sith History thing that I've been meaning to so aswel. We can improve Korriban in one fail swoop!

 

EDIT: Was Dustil in the cave originally, or was that cut aswel? It's just that I've never run into him before, and was thinking I could add that in aswell... Also, since when does the Exile know Carth on a first-name basis?

Link to comment
Share on other sites

I'm sorry to hear you're too busy, but maybe your notes will be of use to other scripters...hopefully. ^_^; I'm willing to do all the play testing myself if anyone's willing to compile the scripts.

 

I had some time to spare today, and since I did all that explaining earlier I figured I might as well put it into practice. You'll have to modify the dialog file darkpcattack.dlg yourself to say something meaningful, currently it's only a skeleton "dialog" where you taunt the darkside illusion of yourself and a fight begins.

 

If you modify the dialog, keep in mind that its action script a_darkpcattack.ncs has two actions depending on the first parameter (P1 in tk102's DLG Editor). If the value is 0 the Evil Twin will ignite and flourish its lightsaber. If the value is 1 the Evil Twin will flourish a second time and then go hostile and attack afterwards. This is how it's currently set up in the "skeleton" dialog. :)

 

I gave the Evil Twin a few force powers via script (since it had none), but otherwise haven't touched it. This will mean that it will have insane amounts of health if your character is high level, due to the way Obsidian has set this up, so the fight might take a while. My level 34 test character faced an Evil Twin with 7500 VP, for example :)

 

You can get it here for now.

 

Seems to work from the quick testing I did. You confront the Revan illusion as usual, but the Evil Twin won't go away when you fight. When "Revan" dies, the darkpcattack.dlg dialog starts with the Evil Twin, which in turn makes it go hostile and attack you. When the Evil Twin dies, the Telepathic dialog with Kreia discussing your tomb raiding experience starts (like it did after you beat "Revan" normally).

 

Also, please note that I was too lazy to check for naming conflicts with the modified module-specific scripts, so the installer will directly modify them in the 711KOR_s.rim and 711KOR_dlg.erf files to avoid that problem. If you prefer a more override-based solution, use FindRefs to make sure there are no naming conflicts, then skip the installer and just move the files to the override folder if it seems okay. I think that should work as well.

Link to comment
Share on other sites

Yeah, I apologize again because my workload has increased tenfold in the past 24 hours. To put things in perspective, I haven't done anything to my Grey Jedi WIP for over a week now. I am working on a little info on the side of my WIP, if I finish that tonight, I'll have a look at this.

 

No apology needed; we all have other commitments. It was just a relief that someone was willing to work on it at all.

 

I suppose if I were to do this, I could do the Sith History thing that I've been meaning to so aswel. We can improve Korriban in one fail swoop!

 

Hehe, I'll be looking forward to that one as well.

 

EDIT: Was Dustil in the cave originally, or was that cut aswel? It's just that I've never run into him before, and was thinking I could add that in aswell... Also, since when does the Exile know Carth on a first-name basis?

 

Yep; that Jedi corpse you find in the tomb is actually Dustil, he even has his body model. Originally you were supposed to find him alive, and stark raving mad, and after a bit of talking he would attack you. Too bad they never recorded his lines to go along with it. As for how the Exile knew Carth by his first name, I can only assume that you were meant to know him somehow, before that part got cut.

 

And a big thanks to you Stoffe, you've been a real life saver. I'm going to try this right away.

Link to comment
Share on other sites

Yep; that Jedi corpse you find in the tomb is actually Dustil, he even has his body model. Originally you were supposed to find him alive, and stark raving mad, and after a bit of talking he would attack you. Too bad they never recorded his lines to go along with it. As for how the Exile knew Carth by his first name, I can only assume that you were meant to know him somehow, before that part got cut.

 

I have some of the VOs on my laptop, and while listening through them, I found that you were supposed to meet Carth on Citadel, who then would walk away and talk to Bastila. I guess that would be how he was known.

 

Sorry to go off topic.

Link to comment
Share on other sites

  • 2 months later...

First off, let me say that this is one awesome mod! I've always wondered what happened to that dark-looking duplicate of myself that I saw standing next to Revan in that tomb. :eyeraise: Stoffe, you have once again proven that you are the undisputed queen of K1 and TSL scripting! :king1:

 

But if I may make one small request, could the above said script be altered so that I would fight the Dark Exile before Revan? I realize that this would be no small amount of work on your part, and if you have other priorities, or simply don't have the time or desire to do this then I fully understand, but I think that it makes much more sense to fight your evil twin before you fight Revan.

 

The reason for this is that during the Mandalorian Wars, Revan was the Exile's superior, the one he looked up to and admired. In large part, Revan was the one who made the Exile what he is today. Symbolically, as well as asthetically, it makes more sense to have the Exile confront what he once was before confronting the one who made him that way.

Link to comment
Share on other sites

Ah, but at the same time it could be argued that it is always more difficult to face oneself than any enemy -no matter how 'powerful' that enemy may be.

 

Of course, that's not to say that "you" are more powerful per se than Revan for example, but a more introspective or philosophical way of looking at things. I mean, I've never met myself, but I can well imagine that if I did, I would find it more than slightly difficult to shoot myself in the face or whatever.. Which of course is merely ideology and symbolism for the idea that true strength comes from being a master of your own feelings and emotions, and being at peace with who you are.

 

The wording changes a bit depending on whether you ask a Jedi or a Sith, but the net result is the same.. Sith master and command their anger and hatred, using them as tools and weapons, Jedi control their feelings and allow their calm state of mind to focus them and keep them centered and strong against their adversaries and outward influences.

 

SW Canon is rife with examples.. Luke seeing his own face after striking down "Vader" in the cave on Dagobah, Obi-Wan returning "more powerful than you can possibly imagine" after Vader cut him down... Luke beating the ever loving crap out of Vader and chopping his hand off when fueled by his anger and hatred... yadda yadda.

 

It would also seem that this is the sort of concept the designers were going with, based on the fact that your 'evil twin' will likely always manifest as a more powerful (or at least much more healthy) enemy than the vision of Revan, because the health and such is calculated based on your own attributes, making your evil twin stronger the stronger you yourself have become by the time you face them.

 

Oh, and for the record, as I read your post, I found myself thinking on these alternate lines and figured I'd toss 'em out here mainly for the simple sake of discussion. I'm not trying to say your view is *wrong* or that no one should consider an alternate version of the mod or anything. :)

 

-Kitt

Link to comment
Share on other sites

I think it would be nice to have the battle with the Dark Exile be more stronger, for what Kitty Kitty say.

 

But I would also wonder if the reason they cut it because of the Dark Side. If you are LS, sure you can battle the Dark Exile...but if you have fallen to the DS, why battle him? Aren't you evil like him? Aren't you already him? The battle with Revan I can see being justifed, since Revan attempted to kill you by placing you at Malachor V (to the best of my knowledge)...but attempting to destroy what, in essence, is you?

 

Can you just trigger the fight with the DS Exile if you are LS? And if you are DS, just have the DS Exile disapper, since you are today just as evil as you were then?

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...