Jump to content

Multiclass kit


Sebastos

Recommended Posts

Hi,

 

Using CamDawg's kit tutorial I was able to create kits for single class PC (fighter and thief). However, I cannot create a kit that is selectable at character creation time when I pick a multiclass option.

 

I added the K_FT_H.2DA files to my tp2 file but no dice. The kit installs but I cannot select it when I choose fighter/thief when creating my character. If I change the kittable option to either pure fighter, or pure thief, then the kit shows up.

 

Is what I am attempting even possible?

 

Thanks,

Sebastos

Link to comment
Is what I am attempting even possible?
Quite likely, but then again, you can make the character dual/multi class automatically with a spell applied by the custom.2da, of course the selector needs to be put into either the Fighter class or the Thief, but that's just a minor inconvenience.
Link to comment
Is what I am attempting even possible?

There's no way to get kits for multiclass characters (or monks/sorcerers/mages) to show up in character generation normally. You can assign them in-game via script or dialogue.

 

Jarno is suggesting a workaround where you create a kit for a class that players can select at chargen, and this kit tries to transform the character into your desired class/kit combo.

Link to comment
Thanks for you replies. I'll try both methods and I'll post the results.
Actually we are both talking about the same solution, and it involves a invisible character... that forces the original character to take a scripted action of... with
ChangeClass(LastSummonerOf(Myself),FIGHTER_THIEF)

The mentioned spell just summons the invisible creature, sets a Global etc. minor actions.

Link to comment
Thanks for you replies. I'll try both methods and I'll post the results.
Actually we are both talking about the same solution, and it involves a invisible character... that forces the original character to take a scripted action of... with
ChangeClass(LastSummonerOf(Myself),FIGHTER_THIEF)

The mentioned spell just summons the invisible creature, sets a Global etc. minor actions.

 

 

Thanks Jarno.

 

I went with the custom AI script option because it was quicker to implement/test.

 

I do have a follow up question. While the ChangeClass script works, the kit description reverts back to the generic Fighter/Thief. Is there a way to keep the original kit's description after dualclassing?

 

Thanks,

Sebastos

Link to comment

@Jeowsbuszoole ??? Erhm, I don't think this is the place that comment would be appropriate to send... but whatever.

 

And by the way, back to the original topic, there's a mod one can use to create these Multi Kitted characters, a link to a support topic and download link.

Hmm, I have my suspicions that Sebastos could be FlameWing, but who knows...

Link to comment
@Jeowsbuszoole :) Erhm, I don't think this is the place that comment would be appropriate to send... but whatever.

 

And by the way, back to the original topic, there's a mod one can use to create these Multi Kitted characters, a link to a support topic and download link.

Hmm, I have my suspicions that Sebastos could be FlameWing, but who knows...

 

Hi Jarno,

 

No, I'm not FlamingWing. I had a look at her/his mod and it's more advanced than anything I am trying to do :-)

 

However, since you've been so helpful, I'll pester you with another question: how to assign a custom dialog to the main char. I have this dialog script:

 

BEGIN ~THANATOS_EVIL_POWERS~
IF ~See("Imoen")~ THEN BEGIN T#EPCHECK
  SAY ~test~
END

 

WeiDU updates the tlk file, but the script never triggers. I've read some tutorials and all of them talk about assigning the dialog variable to the NPC, but what about the main char?

 

Thanks,

Sebastos

Link to comment
However, since you've been so helpful, I'll pester you with another question: how to assign a custom dialog to the main char. I have this dialog script:

 

BEGIN ~THANATOS_EVIL_POWERS~
IF ~See("Imoen")~ THEN BEGIN T#EPCHECK
  SAY ~test~
END

 

WeiDU updates the tlk file, but the script never triggers. I've read some tutorials and all of them talk about assigning the dialog variable to the NPC, but what about the main char?

Well, I know nothing of this... definite, but you are writing the .d file, right ? ... so I think the "~THANATOS_EVIL_POWERS~" is a little bit too long, bit off and all, as you have to assign that to the creatures dialog variable that can only be 8 marks long, and get rid of the worms(~~), too, the "T#EPCHECK" can actually be longer, as that's the sub-dialog that takes everything forward.

 

So write a file called; T#EPCHECK.d, and into it write this:

BEGIN T#EPCHECK
IF ~See("Imoen2")~ THEN BEGIN thanatos_evil_powers
  SAY ~test~ EXIT
END

Now, as I do not know the structure of your files, this scenario assumes that the creature that starts the dialog is one with has been assigned with the dialog variable(offset #0x02cc), and the setup-*modname*.exe(it's actually just a renamed-WeiDU.exe) compiles it in the setup-*modname*.tp2 file like this:

COMPILE ~*modfolder*/T#EPCHECK.d~

The dialog of course should only happen when the character is talked to in the game... if you need it to trigger on it's own, then you need to assign a script for the creature, like the INITDLG.BCS to the creatures offset #0x0260 for example... of course most stating coders actually use other tools that WeiDU to assign the offsets to the creatures, like the DLTCEP...

PS: the "Imoen2" is according to my notes the Imoen after the Spellhold...

 

Let's hope this helps...

Link to comment

Hi Jarno,

 

Thanks for the feedback but it doesn't exactly answer my question (though your solution works great for custom NPCs with their own CRE files). I guess, I did not state my question clearly enough. Maybe a more verbose version will better explain the problem I am trying to solve.

 

What I am trying to do is update the default script for the main PC character to gain special abilities after the dreams. For example, one of the evil dreams states that your heart is not your weak part. So to me gaining permanent resist fear makes more sense than gaining Larloch's Minor drain. I know that I could just create a custom kit and apply the effect via the 2DA file, but that depends on my character's level and not on a variable in the game.

 

I can gain the desired effect by creating a custom AI script and then press a key to reach the desired effect but to me that kills the RP value. So I am trying to figure out a way to patch the default script to include my extra actions. When I use Near Inifinity (NI) on one of my saved games it shows that the default script is DPLAYER.BCS and the others are set to none. Interestingly enough NI doesn't let me change this setting but I can change those values for the joinable NPCs.

 

Ideally, I want to create a solution where my custom actions are added to the default script. I tried doing that using NI but my test action gets ignored.

 

Any advise?

 

Thanks,

Sebastos

Link to comment
What I am trying to do is update the default script for the main PC character to gain special abilities after the dreams. For example, one of the evil dreams states that your heart is not your weak part. So to me gaining permanent resist fear makes more sense than gaining Larloch's Minor drain. I know that I could just create a custom kit and apply the effect via the 2DA file, but that depends on my character's level and not on a variable in the game.

Why don't you modify the script that handles the dream sequence?

Link to comment
Why don't you modify the script that handles the dream sequence?

 

Hi Mike,

 

Good idea, but I don't know which script handles that. If you could point me to it, or a place that has a list of those scripts I can figure out how to patch it by following one of the scripting tutorials.

 

Thanks,

Sebastos

Link to comment
Why don't you modify the script that handles the dream sequence?

 

Hi Mike,

 

Good idea, but I don't know which script handles that. If you could point me to it, or a place that has a list of those scripts I can figure out how to patch it by following one of the scripting tutorials.

 

Thanks,

Sebastos

I assume the dreams you are talking about are the ones in Tutu/BGT? They each handle the matter slightly differently.

 

Tutu: baldur.bcs

IF
 Global("Dream","GLOBAL",2)
 ReputationGT(Player1,9)
 Global("JPDreamAddAbility","GLOBAL",0)
THEN
 RESPONSE #100
ActionOverride(Player1,ApplySpellRES("jpglvl1",Myself)) // No such index
DisplayString(Player1,88753) // Gained Special Ability: Cure Light Wounds
SetGlobal("JPDreamAddAbility","GLOBAL",1)
END

IF
 Global("Dream","GLOBAL",2)
 ReputationLT(Player1,10)
 Global("JPDreamAddAbility","GLOBAL",0)
THEN
 RESPONSE #100
ActionOverride(Player1,ApplySpellRES("jpelvl1",Myself)) // No such index
DisplayString(Player1,88754) // Gained Special Ability: Larloch's Minor Drain
SetGlobal("JPDreamAddAbility","GLOBAL",1)
END

IF
 Global("Dream","GLOBAL",3)
 ReputationGT(Player1,9)
 Global("JPDreamAddAbility","GLOBAL",1)
THEN
 RESPONSE #100
ActionOverride(Player1,ApplySpellRES("jpglvl1",Myself)) // No such index
DisplayString(Player1,88753) // Gained Special Ability: Cure Light Wounds
SetGlobal("JPDreamAddAbility","GLOBAL",2)
END

IF
 Global("Dream","GLOBAL",3)
 ReputationLT(Player1,10)
 Global("JPDreamAddAbility","GLOBAL",1)
THEN
 RESPONSE #100
ActionOverride(Player1,ApplySpellRES("jpelvl1",Myself)) // No such index
DisplayString(Player1,88754) // Gained Special Ability: Larloch's Minor Drain
SetGlobal("JPDreamAddAbility","GLOBAL",2)
END

IF
 Global("Dream","GLOBAL",4)
 ReputationGT(Player1,9)
 Global("JPDreamAddAbility","GLOBAL",2)
THEN
 RESPONSE #100
ActionOverride(Player1,ApplySpellRES("jpglvl2",Myself)) // No such index
DisplayString(Player1,88755) // Gained Special Ability: Slow Poison
SetGlobal("JPDreamAddAbility","GLOBAL",3)
END

IF
 Global("Dream","GLOBAL",4)
 ReputationLT(Player1,10)
 Global("JPDreamAddAbility","GLOBAL",2)
THEN
 RESPONSE #100
ActionOverride(Player1,ApplySpellRES("jpelvl2",Myself)) // No such index
DisplayString(Player1,88756) // Gained Special Ability: Horror
SetGlobal("JPDreamAddAbility","GLOBAL",3)
END

IF
 Global("Dream","GLOBAL",5)
 ReputationGT(Player1,9)
 Global("JPDreamAddAbility","GLOBAL",3)
THEN
 RESPONSE #100
ActionOverride(Player1,ApplySpellRES("jpglvl2",Myself)) // No such index
DisplayString(Player1,88755) // Gained Special Ability: Slow Poison
SetGlobal("JPDreamAddAbility","GLOBAL",4)
END

IF
 Global("Dream","GLOBAL",5)
 ReputationLT(Player1,10)
 Global("JPDreamAddAbility","GLOBAL",3)
THEN
 RESPONSE #100
ActionOverride(Player1,ApplySpellRES("jpelvl2",Myself)) // No such index
DisplayString(Player1,88756) // Gained Special Ability: Horror
SetGlobal("JPDreamAddAbility","GLOBAL",4)
END

IF
 Global("Dream","GLOBAL",6)
 ReputationGT(Player1,9)
 Global("JPDreamAddAbility","GLOBAL",4)
THEN
 RESPONSE #100
ActionOverride(Player1,ApplySpellRES("jpglvl3",Myself)) // No such index
DisplayString(Player1,88757) // Gained Special Ability: Draw Upon Holy Might
SetGlobal("JPDreamAddAbility","GLOBAL",5)
END

IF
 Global("Dream","GLOBAL",6)
 ReputationLT(Player1,10)
 Global("JPDreamAddAbility","GLOBAL",4)
THEN
 RESPONSE #100
ActionOverride(Player1,ApplySpellRES("jpelvl3",Myself)) // No such index
DisplayString(Player1,88758) // Gained Special Ability: Vampiric Touch
SetGlobal("JPDreamAddAbility","GLOBAL",5)
END

IF
 Global("Dream","GLOBAL",7)
 ReputationGT(Player1,9)
 Global("JPDreamAddAbility","GLOBAL",5)
THEN
 RESPONSE #100
ActionOverride(Player1,ApplySpellRES("jpglvl3",Myself)) // No such index
DisplayString(Player1,88757) // Gained Special Ability: Draw Upon Holy Might
SetGlobal("JPDreamAddAbility","GLOBAL",6)
END

IF
 Global("Dream","GLOBAL",7)
 ReputationLT(Player1,10)
 Global("JPDreamAddAbility","GLOBAL",5)
THEN
 RESPONSE #100
ActionOverride(Player1,ApplySpellRES("jpelvl3",Myself)) // No such index
DisplayString(Player1,88758) // Gained Special Ability: Vampiric Touch
SetGlobal("JPDreamAddAbility","GLOBAL",6)
END

 

BGT: player1d.bcs

IF
 GlobalGT("Chapter","GLOBAL",2)
 Global("BG1Dream","GLOBAL",0)
 ReputationGT(Player1,9)
 Global("EndOfBG1","GLOBAL",0)
THEN
 RESPONSE #100
TextScreen("DRMTXT-2")
IncrementGlobal("BG1Dream","GLOBAL",1)
SetGlobalTimer("BG1DreamReset","GLOBAL",1)
ApplySpellRES("GOODDRM2",Player1) // No such index
RestParty()
END

IF
 GlobalGT("Chapter","GLOBAL",2)
 Global("BG1Dream","GLOBAL",0)
 ReputationLT(Player1,10)
 Global("EndOfBG1","GLOBAL",0)
THEN
 RESPONSE #100
TextScreen("DRMTXT-2")
IncrementGlobal("BG1Dream","GLOBAL",1)
SetGlobalTimer("BG1DreamReset","GLOBAL",1)
ApplySpellRES("BADDRM2",Player1) // No such index
RestParty()
END

IF
 GlobalGT("Chapter","GLOBAL",3)
 Global("BG1Dream","GLOBAL",1)
 ReputationGT(Player1,9)
 Global("EndOfBG1","GLOBAL",0)
 GlobalTimerExpired("BG1DreamReset","GLOBAL")
THEN
 RESPONSE #100
TextScreen("DRMTXT-3")
IncrementGlobal("BG1Dream","GLOBAL",1)
SetGlobalTimer("BG1DreamReset","GLOBAL",1)
ApplySpellRES("GOODDRM2",Player1) // No such index
RestParty()
END

IF
 GlobalGT("Chapter","GLOBAL",3)
 Global("BG1Dream","GLOBAL",1)
 ReputationLT(Player1,10)
 Global("EndOfBG1","GLOBAL",0)
 GlobalTimerExpired("BG1DreamReset","GLOBAL")
THEN
 RESPONSE #100
TextScreen("DRMTXT-3")
IncrementGlobal("BG1Dream","GLOBAL",1)
SetGlobalTimer("BG1DreamReset","GLOBAL",1)
ApplySpellRES("BADDRM2",Player1) // No such index
RestParty()
END

IF
 GlobalGT("Chapter","GLOBAL",4)
 Global("BG1Dream","GLOBAL",2)
 ReputationGT(Player1,9)
 Global("EndOfBG1","GLOBAL",0)
 GlobalTimerExpired("BG1DreamReset","GLOBAL")
THEN
 RESPONSE #100
TextScreen("DRMTXT-4")
IncrementGlobal("BG1Dream","GLOBAL",1)
SetGlobalTimer("BG1DreamReset","GLOBAL",1)
ApplySpellRES("GOODDRM4",Player1) // No such index
RestParty()
END

IF
 GlobalGT("Chapter","GLOBAL",4)
 Global("BG1Dream","GLOBAL",2)
 ReputationLT(Player1,10)
 Global("EndOfBG1","GLOBAL",0)
 GlobalTimerExpired("BG1DreamReset","GLOBAL")
THEN
 RESPONSE #100
TextScreen("DRMTXT-4")
IncrementGlobal("BG1Dream","GLOBAL",1)
SetGlobalTimer("BG1DreamReset","GLOBAL",1)
ApplySpellRES("BADDRM4",Player1) // No such index
RestParty()
END

IF
 GlobalGT("Chapter","GLOBAL",5)
 Global("BG1Dream","GLOBAL",3)
 ReputationGT(Player1,9)
 Global("EndOfBG1","GLOBAL",0)
 GlobalTimerExpired("BG1DreamReset","GLOBAL")
THEN
 RESPONSE #100
TextScreen("DRMTXT-5")
IncrementGlobal("BG1Dream","GLOBAL",1)
SetGlobalTimer("BG1DreamReset","GLOBAL",1)
ApplySpellRES("GOODDRM4",Player1) // No such index
RestParty()
END

IF
 GlobalGT("Chapter","GLOBAL",5)
 Global("BG1Dream","GLOBAL",3)
 ReputationLT(Player1,10)
 Global("EndOfBG1","GLOBAL",0)
 GlobalTimerExpired("BG1DreamReset","GLOBAL")
THEN
 RESPONSE #100
TextScreen("DRMTXT-5")
IncrementGlobal("BG1Dream","GLOBAL",1)
SetGlobalTimer("BG1DreamReset","GLOBAL",1)
ApplySpellRES("BADDRM4",Player1) // No such index
RestParty()
END

IF
 GlobalGT("Chapter","GLOBAL",6)
 Global("BG1Dream","GLOBAL",4)
 ReputationGT(Player1,9)
 Global("EndOfBG1","GLOBAL",0)
 GlobalTimerExpired("BG1DreamReset","GLOBAL")
THEN
 RESPONSE #100
TextScreen("DRMTXT-6")
IncrementGlobal("BG1Dream","GLOBAL",1)
SetGlobalTimer("BG1DreamReset","GLOBAL",1)
ApplySpellRES("GOODDRM6",Player1) // No such index
RestParty()
END

IF
 GlobalGT("Chapter","GLOBAL",6)
 Global("BG1Dream","GLOBAL",4)
 ReputationLT(Player1,10)
 Global("EndOfBG1","GLOBAL",0)
 GlobalTimerExpired("BG1DreamReset","GLOBAL")
THEN
 RESPONSE #100
TextScreen("DRMTXT-6")
IncrementGlobal("BG1Dream","GLOBAL",1)
SetGlobalTimer("BG1DreamReset","GLOBAL",1)
ApplySpellRES("BADDRM6",Player1) // No such index
RestParty()
END

IF
 GlobalGT("Chapter","GLOBAL",7)
 Global("BG1Dream","GLOBAL",5)
 ReputationGT(Player1,9)
 Global("EndOfBG1","GLOBAL",0)
 GlobalTimerExpired("BG1DreamReset","GLOBAL")
THEN
 RESPONSE #100
TextScreen("DRMTXT-7")
IncrementGlobal("BG1Dream","GLOBAL",1)
SetGlobalTimer("BG1DreamReset","GLOBAL",1)
ApplySpellRES("GOODDRM6",Player1) // No such index
RestParty()
END

IF
 GlobalGT("Chapter","GLOBAL",7)
 Global("BG1Dream","GLOBAL",5)
 ReputationLT(Player1,10)
 Global("EndOfBG1","GLOBAL",0)
 GlobalTimerExpired("BG1DreamReset","GLOBAL")
THEN
 RESPONSE #100
TextScreen("DRMTXT-7")
IncrementGlobal("BG1Dream","GLOBAL",1)
SetGlobalTimer("BG1DreamReset","GLOBAL",1)
ApplySpellRES("BADDRM6",Player1) // No such index
RestParty()
END

 

In both cases, it's the ApplySpellRES("X",Player1) command that confers the spell. Each X.SPL has a Give Innate Ability effect for a different one of the Bhaalspawn powers.

Link to comment

Mike,

 

Thanks for the quick response. Here is what I found (I am running Tutu, btw):

 

The dream powers are indeed scripted in the baldur.bcs file but for some reason my test action never triggers even though it's there. I verified its presence using NI. Here is the code I used:

test.baf:

IF
Global("G_THANATOS","GLOBAL",0)
THEN
RESPONSE #100
DisplayStringNoName(Myself,72209)
   SetGlobal("G_THANATOS","GLOBAL",1)
END

 

.tp2:

EXTEND_TOP ~baldur.bcs~ ~EvilPowers/test.BAF~

 

Interestingly enough, if I change the tp2 code to

EXTEND_TOP ~DPLAYER3.bcs~ ~EvilPowers/test.BAF~

then it triggers as expected.

 

Any idea why it wouldn't work when put in baldur.bcs? It's not a big deal since I have a work around. But still, it's bothering me because most likely it's something stupid I am doing.

Link to comment
Any idea why it wouldn't work when put in baldur.bcs? It's not a big deal since I have a work around. But still, it's bothering me because most likely it's something stupid I am doing.

Your code worked fine for me.

 

However, if you want to change how the existing events play out (swapping the gain of an innate Larloch's Minor Drain for something else), you'd probably be better replacing what's currently in the script with something else, rather than adding something new onto it. Otherwise, you'll have to figure out how to remove the existing Larloch's Minor Drain in addition to adding the new stuff.

 

You could do:

 

COPY_EXISTING ~baldur.bcs~ ~override~
 DECOMPILE_BCS_TO_BAF
 REPLACE_TEXTUALLY
~ActionOverride(Player1,ApplySpellRES("jpelvl1",Myself))
DisplayString.*
SetGlobal("JPDreamAddAbility","GLOBAL",1)~

~ActionOverride(Player1,ApplySpellRES("g_rsfear",Myself))
DisplayString(Player1,g_dummy_resist_fear_string)
SetGlobal("JPDreamAddAbility","GLOBAL",1)~
 REPLACE ~g_dummy_resist_fear_string~ ~Gained Special Ability: Permanent Resist Fear~
 COMPILE_BAF_TO_BCS

 

This would change it so the first time the protagonist usually gains Larloch's Minor Drain, he instead has your custom spell g_rsfear.spl applied. You can modify the dummy string here to display whatever you want.

Link to comment

Archived

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

×
×
  • Create New...