Masamune753

[WIP] K1 Better Skill Challenges

Recommended Posts

Coming off of my first major project, K1 Companion Sidequest Rewards, my focus is still on gameplay/design enhancements for the first Kotor. Something that struck me during my most recent playthrough is how unimportant/tacked on skills feel. This next project's goal will be to further imbed skills into K1's gameplay, validating INT/Sent/Skill focused builds as a more meaningful choice for players.

The outline for this project builds on the awesome work by @jc2 and their Improved Grenades mod. For the other skills, I have the following ideas (ascending rank in terms of perceived difficulty):

  • Computer Use → "Unlocking" T3-M4's ability to act as an upgrade bench (ala my Sidequest Reward mod)
  • Treat Injury → Swapping Canderous Implants (ala TSL)
  • Repair → Custom skill challenge with T3-M4 to create unique items:
    • Dual Wieldable Stun Batons
    • Lightsaber variants (Reg/Short/Double)
    • Unique Droid Items for T3-M4/HK-47
    • Recreate Revan's "Original" lightsaber
  • Persuade  → Make all* merchants adjust their prices based on persuade skill
  • Awareness  → Swap out all Sith assassin encounters ("Malak was most displeased...") with:
    • Create some kind of trigger that initiates a cutscene/dialog
    • Spawn in Sith assassins during scene, framed as though they came out of stealth 
    • If Awareness (per current party member) is less than X, they lose half their health
    • Regular dialog/Regular combat
    • (Potential; Spawn in more assassins based on player level/difficulty)

 

I have a sense on how to approach all of these ideas except the last one...creating custom encounters is totally out of my current understanding. As always, if anyone has any tips/comments/warnings on any of the above, I am eager to hear them.

  • Like 4

Share this post


Link to post
Share on other sites
5 hours ago, Masamune753 said:
  • Awareness  → Swap out all Sith assassin encounters ("Malak was most displeased...") with:
    • Create some kind of trigger that initiates a cutscene/dialog
    • Spawn in Sith assassins during scene, framed as though they came out of stealth 
    • If Awareness (per current party member) is less than X, they lose half their health
    • Regular dialog/Regular combat
    • (Potential; Spawn in more assassins based on player level/difficulty)

AFAIK, a trigger is just a defined area where a script can fire upon entry and another can fire upon exit. The trigger areas are already defined in the GIT files (unless you plan to move them), so you only need to modify or replace the scripts to be fired upon entry and/or exit. The rest I think can be done completely in the scripts, you may not even need new global variables.

As an example: TSL's Nar Shaddaa airspeeder sidequest is to help avoid the trigger that sends you to Goto.

  • Thanks 1
  • Light Side Points 1

Share this post


Link to post
Share on other sites

Does anyone have advice on a scripting issue I am experiencing? I grabbed the following and made some edits based suggested script by @DarthParametric(Thank you again!)

The following works:

Spoiler

void main(){
 
object oPC = GetFirstPC();

    object oStore = GetObjectByTag("kas_czerkastore", 0);
    int nPersuade = GetSkillRank(SKILL_PERSUADE, oPC);
    int nBonusMarkUp;

AssignCommand(GetFirstPC(), ClearAllEffects());
    
    nBonusMarkUp = -nPersuade;
    
        DelayCommand(0.1, OpenStore(oStore, oPC, nBonusMarkUp, 0));

}

but this does not (is treated as 0):

Spoiler

void main(){

 
object oPC = GetFirstPC();

    object oStore = GetObjectByTag("kas_czerkastore", 0);
    int nPersuade = GetSkillRank(SKILL_PERSUADE, oPC);
    int nBonusMarkUp;
    int nPersuadeAdj;

AssignCommand(GetFirstPC(), ClearAllEffects());
    
    if (nPersuade = 0)
    {
        nPersuadeAdj = -10;
    }
    else if (nPersuade > 0 && nPersuade <= 17)
        {
            nPersuadeAdj = ((-10) + (1 * nPersuade));
        }
        else if (nPersuade > 17 && nPersuade <= 30)
            {
                nPersuadeAdj = ((-10) + (1 * nPersuade) + (nPersuade - 17));
            }
                else if (nPersuade > 30)
                      {
                          nPersuadeAdj = 33;
                      }
    nBonusMarkUp = -nPersuadeAdj;
    
        DelayCommand(0.1, OpenStore(oStore, oPC, nBonusMarkUp, 0));

}

I am trying to create a very particular sliding scale of discounts to persuade skill rank. I have been able to code a little bit so far, but I don't come from a coding background, so if I have some kind of syntax error somewhere I am not able to recognize it. 

Share this post


Link to post
Share on other sites

1 * nPersuade is just nPersuade, so I'd drop the superfluous 1 *.

As to nBonusMarkUp = -nPersuadeAdj, I'd try nBonusMarkUp = (nPersuadeAdj * -1) instead.

void main(){

    object oPC = GetFirstPC();
    object oStore = GetObjectByTag("kas_czerkastore", 0);
    int nPersuade = GetSkillRank(SKILL_PERSUADE, oPC);
    int nBonusMarkUp;
    int nPersuadeAdj;
    
    AssignCommand(GetFirstPC(), ClearAllEffects());
    
    if (nPersuade = 0)
        {
            nPersuadeAdj = -10;
        }
        else if (nPersuade > 0 && nPersuade <= 17)
            {
                nPersuadeAdj = nPersuade - 10;
            }
            else if (nPersuade > 17 && nPersuade <= 30)
                {
                    nPersuadeAdj = (2 * nPersuade) - 27;
                }
                else if (nPersuade > 30)
                    {
                        nPersuadeAdj = 33;
                    }
    
    nBonusMarkUp = nPersuadeAdj * -1;
    
    DelayCommand(0.1, OpenStore(oStore, oPC, nBonusMarkUp, 0));
}

Have you tried using the nBonusMarkDown term in OpenStore by the way? Seems like that's what it should be for, rather than using a negative value for nBonusMarkUp (even though I see vanilla scripts do that).

Share this post


Link to post
Share on other sites
Quote

1 * nPersuade is just nPersuade, so I'd drop the superfluous 1 *.

As to nBonusMarkUp = -nPersuadeAdj, I'd try nBonusMarkUp = (nPersuadeAdj * -1) instead.

Oof, thanks for catching that. Thats what happens when you fiddle with something in excel for too long.

1 hour ago, DarthParametric said:

Have you tried using the nBonusMarkDown term in OpenStore by the way? Seems like that's what it should be for, rather than using a negative value for nBonusMarkUp (even though I see vanilla scripts do that).

I gave the above script a try (thank you), it also did not work. Either as nBonusMarkUp or MarkDown.

Is there something about the if/ else if statements that is particular? Or an issue with running a formula through the script?

Share this post


Link to post
Share on other sites

This version works. Tested it with Eli's store. I've added some debug elements to it to post info to the Feedback screen via SendMessageToPC, which you'll want to remove in the final version.

void StoreOpen(object oMerch, object oNPC, int nMarkUp, int nMarkDown, int nSkill) {
    SendMessageToPC(oNPC, "PC's Persuade = " + IntToString(nSkill));
    SendMessageToPC(oNPC, "nBonusMarkUp = " + IntToString(nMarkUp));
    OpenStore(oMerch, oNPC, nMarkUp, nMarkDown);
}

void main(){

    object oPC = GetFirstPC();
    int nPersuade;
    int nPersuadeAdj;
    
    AssignCommand(GetFirstPC(), ClearAllEffects());
    
    nPersuade = GetSkillRank(SKILL_PERSUADE, oPC);
    
    if (nPersuade > 0 && nPersuade <= 17)
        {
            nPersuadeAdj = nPersuade - 10;
        }
        else if (nPersuade > 17 && nPersuade <= 30)
            {
                nPersuadeAdj = (2 * nPersuade) - 27;
            }
            else if (nPersuade > 30)
                {
                    nPersuadeAdj = 33;
                }
                else
                    {
                        nPersuadeAdj = -10;
                    }
    
    DelayCommand(0.1, StoreOpen(GetObjectByTag("kas_czerkastore", 0), oPC, (nPersuadeAdj * -1), 0, nPersuade));
}

Declaring the skill has been moved to after the ClearAllEffects, since I presume you are trying to remove buffs first.

  • Like 1
  • Thanks 1

Share this post


Link to post
Share on other sites
12 hours ago, DarthParametric said:

This version works. Tested it with Eli's store. I've added some debug elements to it to post info to the Feedback screen via SendMessageToPC, which you'll want to remove in the final version.

Confirmed on my side. Thank you! Adding the feedback was also genius.

12 hours ago, DarthParametric said:

Declaring the skill has been moved to after the ClearAllEffects, since I presume you are trying to remove buffs first.

Perfect, yes that was my intent. Thank you!

Share this post


Link to post
Share on other sites

Progress update!

  • Computer Use → "Unlocking" T3-M4's ability to act as an upgrade bench
    • ✓ Already done
  • Treat Injury → Swapping Canderous Implants (ala TSL)
    • Not started.
  • Repair → Custom skill challenge with T3-M4 to create unique items:
    • ✓ Created new dialog entry with script that bumps to new .dlg file (styled as computer interface)
    • ✓ Ported over TOR version of Revan's lightsaber from TSL with permission, and some guidance, from @Kaidon Jorn (Thank you!!!)
    • ✓ Adapted .uti files for the new lightsaber:
      • ✓ upcrystals.2da change and multiple .uti files created to make saber fully upgradeable (including Guardian & Mantle)
      • ✓ Matching all file names/models references to ported over models/textures
      • ✓ Added unique bonuses to the lightsaber that will stack on top of upgrades/customizations
  • Persuade  → Make all* merchants adjust their prices based on persuade skill
    • 26% of appropriate merchant call scripts adjusted (thank you @DarthParametric!)
  • Awareness  → Swap out all Sith assassin encounters ("Malak was most displeased...") with stealth challenge:
    • Not started.

 

  • Like 1

Share this post


Link to post
Share on other sites
On 1/28/2022 at 11:03 PM, DarthParametric said:

Btw, I just realised what the problem with your original script was.


if (nPersuade = 0)

should have been


if (nPersuade == 0)

Not sure how I missed that.

As a general rule, tests of equality should place the constant first as assignment will prevent compilation. So:

//Incorrect, and compiles
if (nPersuade = 0){}

//Incorrect, but won't compile
if (0 = nPersuade){}

//Correct, and always compiles
if (0 == nPersuade){}

Get in the habit of placing constants on the left, regardless of the operation.

Also, thinking about it some more Jolee should have skill bonuses. His revelation of what makes him a grey Jedi is important, perhaps the most important backstory in the game. It helps us understand Revan, Exile, and Kreia.

Share this post


Link to post
Share on other sites
1 hour ago, AmanoJyaku said:

As a general rule, tests of equality should place the constant first as assignment will prevent compilation.

Thanks for the coding wisdom! I am in the copy-and-adjust phase of learning to write script, so any advice is always appreciated.

1 hour ago, AmanoJyaku said:

Also, thinking about it some more Jolee should have skill bonuses. His revelation of what makes him a grey Jedi is important, perhaps the most important backstory in the game. It helps us understand Revan, Exile, and Kreia

Right now, the idea would be that Jolee would have the easiest time with the stealth/awareness aspect of this project. Besides that, I am not sure what else to go with. I struggled with this in my Sidequest Reward mod as well, Jolee is already OP as a Jedi vs. other party members.

None of the other skills feel like they would make sense. He directly states he is not tech savvy. Persuade could work, but his personality feels incongruent with that. Plus it's just too easy and a little tedious to dump points in persuade and always switch in Jolee for merchants.

Definitely open to any ideas I haven't thought of though!

  • Like 1

Share this post


Link to post
Share on other sites
Guest Qui-Gon Glenn
On 2/6/2022 at 10:50 AM, AmanoJyaku said:

As a general rule, tests of equality should place the constant first as assignment will prevent compilation. So:


//Incorrect, and compiles
if (nPersuade = 0){}

//Incorrect, but won't compile
if (0 = nPersuade){}

//Correct, and always compiles
if (0 == nPersuade){}

Get in the habit of placing constants on the left, regardless of the operation.

This.... is one of those things.

 

The pain and suffering that could have been avoided in a former life.

Share this post


Link to post
Share on other sites

This is a great mod idea, primarily because there are only 2, potentially 3 skills that have are worthwhile in KotOR 1: persuade, treat injury and repair if you want to hear out HK's stories.
 

Share this post


Link to post
Share on other sites

Progress update...none as of yet, but I still have this project on my mind. Just very busy as of late.

My bandwidth is pretty limited, so I put out some requests to some other great mods to be a part of the T3-M4 repair component of this project. I assumed it would take some time,  but I haven't heard back since February so I am just going to figure out something  on my own.

Share this post


Link to post
Share on other sites
23 minutes ago, yazanabbass112 said:

Skill challenges are generally presented as a blank slate where the players are in a scenario, and they have to come up with the solution to it. That can mean escaping a collapsing dungeon, chasing a thief, or even solo/fight pit battles. What you're describing sounds like it would be more oriented towards a set roll to complete the challenge (a balancing pole challenge would be an acrobatics check, for example).

I assure you people were using the term 'skill challenge' long before 5e stamped a claim on it.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.