Sebastos Posted May 30, 2010 Share Posted May 30, 2010 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
Jarno Mikkola Posted May 30, 2010 Share Posted May 30, 2010 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
Mike1072 Posted May 30, 2010 Share Posted May 30, 2010 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
Sebastos Posted May 30, 2010 Author Share Posted May 30, 2010 Hi, Thanks for you replies. I'll try both methods and I'll post the results. -Sebastos Link to comment
Jarno Mikkola Posted May 30, 2010 Share Posted May 30, 2010 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
Sebastos Posted May 31, 2010 Author Share Posted May 31, 2010 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
Jarno Mikkola Posted June 26, 2010 Share Posted June 26, 2010 @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
Sebastos Posted July 6, 2010 Author Share Posted July 6, 2010 @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
Jarno Mikkola Posted July 6, 2010 Share Posted July 6, 2010 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
Sebastos Posted July 9, 2010 Author Share Posted July 9, 2010 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
Mike1072 Posted July 9, 2010 Share Posted July 9, 2010 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
Sebastos Posted July 9, 2010 Author Share Posted July 9, 2010 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
Mike1072 Posted July 9, 2010 Share Posted July 9, 2010 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
Sebastos Posted July 9, 2010 Author Share Posted July 9, 2010 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
Mike1072 Posted July 9, 2010 Share Posted July 9, 2010 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
Recommended Posts
Archived
This topic is now archived and is closed to further replies.