Skip to content

Korax the Ghoul NPC Mod

semiticgoddesssemiticgoddess Member Posts: 14,903
edited January 2020 in General Modding
I've heard a few people say they'd like to be able to bring Korax the Ghoul into the party, and since I recently made a Lilarcor NPC mod, I decided to go ahead and create a mod that would make Korax into a joinable character. You can download the mod at the bottom of this post.

He's not the chatty sort, but I gave him some flavor text if you decide to talk to him. You can feed him meat and kiss him, and if you feed and kiss him more than 10 times, you can marry him and he'll get a cool little magical wedding ring. For those of you who aren't creepy weirdos, you can maintain a perfectly platonic relationship with Korax instead.

To get him into the party, you just need to talk to him with less than 6 party members. Instead of being charmed for 2 hours and then going hostile, he'll join the group permanently. Korax is a bit overpowered on his own, so I gave him a custom kit to balance his powers and let them scale with levels. Here is the full kit description:
Korax is a gross, ugly monster. He has long since forgotten whoever he was in life, but he seems not to mind the loss of his former identity. Underneath his twisted, rotting face and the putrid stench of death, he is a fairly cheerful "person" and surprisingly friendly. Still, whenever you catch him staring at you with his dead, unblinking eyes, you can't shake the feeling that he's thinking about eating your flesh.

Being undead has its advantages. As a ghoul, Korax is immune to many of the afflictions that plague humankind, and his very touch is toxic to living creatures. Undeath has left his mind hopelessly broken, however, and he cannot seem to grasp the concept of using his hands for anything other than grasping his prey. He cannot wield a weapon, dress himself, collect firewood, or do anything that a beast of burden could not. At the campfire, he spends most of his time staring intently at his companions or gnawing on a bone.

Korax might be a disgusting creature who constantly gets his noxious odor all over your clothes and personal possessions, but he is a faithful companion and attack dog as long as he has plenty of raw meat to sate his powerful hunger. Keep him well-fed, and he will be the most loyal crime against nature to ever call himself your friend.

CLASS FEATURES:

Advantages:

- Immune to hold, paralysis, stun, petrification, poison, disease, confusion, feeblemind, charm, domination, fear, sleep, unconsciousness, fatigue, berserk, and Finger of Death effects
- Regenerates 1 hit point per round
- Cannot die from ability score drain effects
- Ghoul Touch: Korax's natural attack deals 1d6+1 crushing damage, and if the victim fails a save vs. death, Korax also drains 1 additional point of HP and paralyzes the target for 6 seconds.
- Every 3 levels, Korax gains +1 to hit, damage, and AC (starting with an AC of 5 at level 1).
- Every 3 levels, Korax's victims must save vs. death at an additional -1 penalty to avoid being paralyzed.
- Every 6 levels, Korax's natural weapon strikes with an additional +1 enchantment.

Disadvantages:

- Immune to healing spells
- Cannot drink potions
- Cannot wear armor, helmets, or shields
- Cannot use weapons
- Is a hideous freak who smells terrible

- Hit Die: d10
If you want Korax to follow you around without joining the party, just tell him to "keep his distance" and he will be treated as a familiar instead of a new party member.
Post edited by semiticgoddess on
«1

Comments

  • OrlonKronsteenOrlonKronsteen Member Posts: 905
    You, sir, are a hero!
  • semiticgoddesssemiticgoddess Member Posts: 14,903
    Yes, I am!
  • smyth25smyth25 Member Posts: 219
    Oh wow... :D I better finish my current BG game ASAP so that I can get to playing this, many thanks @semiticgod!
  • RaduzielRaduziel Member Posts: 4,714
    I wish I had the knowledge to make NPC mods.

    Nice job, @semiticgod !

    I would just get rid of this:
    - Every 3 levels, Korax's victims must save vs. death at an additional -1 penalty to avoid being paralyzed.
  • semiticgoddesssemiticgoddess Member Posts: 14,903
    I thought it might be necessary to make his paralysis attack reliable at higher levels, since his THAC0 and APR are both pretty lousy. He dual-wields at no penalty, but he has no proficiency bonuses whatsoever--which means no THAC0 bonus, damage bonus, or APR bonus--and he doesn't have the option of choosing a magical weapon with better THAC0. At level 20, his natural weapon will require a save vs. death at -6, but he'll also only have 3 attacks per round, where a dual-wielding fighter would be able to land 4 attacks with Celestial Fury. He's a better disabler overall, as he should be, but he deals much less damage, has slightly worse THAC0 until he hits level 21 (when he hits parity), and his defenses are garbage, with a base AC of -1 at level 20 and no DEX bonuses or the option of using a shield, not to mention his inability to use potions.

    I could nerf the duration to 3 seconds instead of 6, or grant a starting save bonus, maybe +2 to +4. @Raduziel, what do you think?

    @subtledoctor, you're a game balance guy. What would you do to balance out this critter?
  • ZaghoulZaghoul Member, Moderator Posts: 3,938
    edited February 2019
    A fantastic idea this. :) After testing him, at least with SCS, I found the basilisks *held* him with their gaze. Even after resting he was still locked up.
  • semiticgoddesssemiticgoddess Member Posts: 14,903
    edited February 2019
    @Zaghoul: Do you have Spell Revisions installed? SR changes petrification to a "Hold III" effect with opcode 185, and I believe it patches immunity to petrification effects so they grant immunity to that specific effect. If the Korax mod was installed before SR, or if SR doesn't patch him (I assume it would), then he'll get paralyzed. You'll need a Protection from Petrification scroll to protect anyone, and a Stone to Flesh scroll or Break Enchantment spell (the SR version of Remove Curse, level 3 for clerics and level 4 for mages) to cure the effect. Killing and resurrecting him may also work; I don't remember.

    Whatever your install, the basilisks must be modded; that "Hold III" effect doesn't exist in the unmodded game. Korax is simply immune to petrification, so he's only immune to unmodded petrification.
  • ZaghoulZaghoul Member, Moderator Posts: 3,938
    I installed him at the end of my mods just to try him out first, so he's after Spell revisions and SCS.
  • kjeronkjeron Member Posts: 2,367
    semiticgod wrote: »
    Whatever your install, the basilisks must be modded; that "Hold III" effect doesn't exist in the unmodded game. Korax is simply immune to petrification, so he's only immune to unmodded petrification.
    Opcode 185 is used in the unmodded game for "Hold Undead" and "Otiluke's Resilient Sphere", granting immunity to it is not without consequences.
  • RaduzielRaduziel Member Posts: 4,714
    Zaghoul wrote: »
    I installed him at the end of my mods just to try him out first, so he's after Spell revisions and SCS.

    It doesn't matter in this case. Korax has protection to X, SR changes X to Y, no matter if Korax comes first or after the change is made.

    What @semiticgod might try to do is add a check to the creature's coding to verify if SR is there and protect Korax accordingly.

    As for the saving "issue", I would just remove the penalty. Leave the save and the duration as it is.

    But it is your baby and I'm not a very balanced guy. @subtledoctor is way better than me with this.
  • semiticgoddesssemiticgoddess Member Posts: 14,903
    I don't know how to do checks for other mods in WeiDU, so it would be easier if I just added redundant immunities (that is, give him immunity to X and Y, since Y in this case doesn't exist without SR anyway). @Demivrgvs, how do I give Korax immunity to SR petrification? Would it work if I just gave him immunity to the GAZE projectile and added protection from spell opcodes to block Flesh to Stone-type spells?
  • [Deleted User][Deleted User] Posts: 0
    edited February 2019
    The user and all related content has been deleted.
  • RaduzielRaduziel Member Posts: 4,714
    @semiticgod

    You may use:
    MOD_IS_INSTALLED ~spell_rev/setup-spell_rev.tp2~ ~0~
    
  • semiticgoddesssemiticgoddess Member Posts: 14,903
    @subtledoctor: Korax is already immune to opcodes 109 and 175 by virtue of his melee weapon (I copied over the opcodes from RING95). That's the same source of his immunity to the petrification opcode. If SR is using 109, it still shouldn't affect Korax.

    I went ahead and gave him immunity to the GAZE projectile, both the BASILG1.itm and BASILL1.itm basilisk attack weapons, and every spell that uses the petrification opcode (aside from Chromatic Orb, since it doesn't petrify in SR and Korax's immunity to petrification already works fine if SR isn't installed). Now, basilisk stares won't affect him at all; he won't even flinch from him. Even when I removed his immunity to petrification, the basilisks couldn't touch him. The update is already uploaded.

    @Zaghoul: Download the updated version above and reinstall it. Korax shouldn't get petrified even in your SR install.
  • semiticgoddesssemiticgoddess Member Posts: 14,903
    edited February 2019
    If he's outside the party and SR is installed, though, he'll get paralyzed, because he uses a different creature file if he doesn't join the party and for some reason I couldn't attach additional effects to the replacement Korax.

    The reason why there are two different creature files to begin with is because I wanted him to have his original, stronger combat stats if the player approached him with 6 party members. Vanilla Korax has 26 more HP, one more attack per round, and 8 better THAC0 than the modded Korax, so if you don't want him in the party, I wanted him to still be as strong as he usually was.
  • ZaghoulZaghoul Member, Moderator Posts: 3,938
    Works fine now, thanks, he just ignored the attacks as you mentioned. The original Korax could still be slowed, just not held with SR.
    Sounds like that changed with the NPC version if he does not join if I'm reading that right, think I've got it straight now.

    *Check on his leaving and re-entering the party if ya would. I can get him to leave and wait but can;t get him to join me again when using option "let's continue on as before".
  • semiticgoddesssemiticgoddess Member Posts: 14,903
    @Zaghoul: I forgot to tack on the JoinParty() Command to all the various dialog options. I uploaded the fixed version just now.
  • ZaghoulZaghoul Member, Moderator Posts: 3,938
    Fixed now, thanks again.
  • SkatanSkatan Member, Moderator Posts: 5,352
    edited February 2019
    Question, 1: Is his speed still -500 ? :D
    Question 2: Does "- Cannot wear armor, helmets, or shields" mean he can wear ie boots of speed?

    Well done!

    Edit:
    I am imagining now the amount of "you have to gather your party beforng venturing forth" while korax is painstakingly slowly dragging his dead legs towards the transition area, hehe..
  • lolienlolien Member, Moderator, Translator (NDA) Posts: 3,108
    Finally i can make a true canon party, just have to change name to Korak. Still waiting for that weird Ooze ambush and the Flaming Fist guard named Julius...

    Jokes aside, good job @semiticgod !
  • TorgrimmerTorgrimmer Member Posts: 331
    This is a fun Mod thank you @semiticgod
  • GrammarsaladGrammarsalad Member Posts: 2,582
    edited February 2019
    I don't generally use NPCs*, much less NPC mods, but this one speaks to me. I remember way back when I first met Korax, I really wanted to add him to my party.

    *Heh, I haven't actually played the game at all in years, except to test mods, but ya know
  • ArthasArthas Member Posts: 1,091
    Me will be good boy, me promise. Me will help you with anything you need.
  • DanacmDanacm Member Posts: 951
    Fantastic mod, for an evil party. I imagine a necromancer or blackguard run with Korax :smile:

    May be use the pnp monster enchantment per level for Korax attacks, but its not a huge thing because of only use him in bg1.

    Creature vs. Creature
    One obvious question that arises in the minds of those with a logical bent is "How do
    other creatures fight those immune monsters?" In the case of monsters, sufficient Hit
    Dice enable them to attack immune creatures as if they were fighting with magical
    weapons. Table 48 lists various numbers of Hit Dice and their magical weapon
    equivalents.
    These Hit Dice equivalents apply only to monsters. Player characters and NPCs cannot
    benefit from this.
    Table 48:
    Hit Dice Vs. Immunity
    Hit Dice Hits creatures requiring
    4+1 or more +1 weapon
    6+2 or more +2 weapon
    8+3 or more +3 weapon
    10+4 or more +4 weapon
  • GodGod Member Posts: 1,150
    semiticgod wrote: »
    create a mod that would Korax into a joinable character

    10/10, would Korax again :D
  • Necromanx2Necromanx2 Member Posts: 1,246
    Is it possible to have Korax get XP near the party level when he joins? Having him at 0 when my party is at 40K seems odd.
  • RaduzielRaduziel Member Posts: 4,714
    Necromanx2 wrote: »
    Is it possible to have Korax get XP near the party level when he joins? Having him at 0 when my party is at 40K seems odd.

    @semiticgod I don't know if you know that already, but the code that does that is packed within the party-joinable NPC's Override script.

    Just a matter of copy and paste.
  • ArviaArvia Member Posts: 2,101
    Pity that I'm playing an undead hunter. When I first met Korax, I really wanted to say something nice to him at least. He was so cute, the way he was sad that nobody liked him... Cool idea to make him a joinable NPC!
  • semiticgoddesssemiticgoddess Member Posts: 14,903
    @Raduziel: What BCS file is that? I don't know the name.

    Would I just assign that override script to Korax's creature file, or would I just tack on that particular segment of the script to an existing script of his, or write the triggers and commands into his dialog file?
  • RaduzielRaduziel Member Posts: 4,714
    edited June 2019
    I'll give you the code when I get home tonight. It can be found inside the override script of any joinable NPC.

    Just add it to the top of Khorax's override or use extend_top at the Weidu file.

    Check my Pfaug's override script to see a model:

    https://github.com/Raduziel/Pfaug-NPC/blob/master/Pfaug_Raduziel/Baf/RAPFAUG.baf

    Starts at line 12. You may change the XP values to better fit your needs (those are the values used for SoD).

    ---

    @semiticgod
    
    //This one is to adjust the XP if Pfaug joins late
    
    IF
    Global("BD_JOINXP","LOCALS",0)
    InParty(Myself)
    XPGT(Player1,249999)
    XPLT(Myself,250000)
    THEN
    RESPONSE #100
    SetInterrupt(FALSE)
    SetGlobal("BD_JOINXP","LOCALS",1)
    ChangeStat(Myself,XP,250000,SET)
    SetInterrupt(TRUE)
    END
    
    IF
    Global("BD_JOINXP","LOCALS",0)
    InParty(Myself)
    XPGT(Player1,199999)
    XPLT(Myself,200000)
    THEN
    RESPONSE #100
    SetInterrupt(FALSE)
    SetGlobal("BD_JOINXP","LOCALS",1)
    ChangeStat(Myself,XP,200000,SET)
    SetInterrupt(TRUE)
    END
    
    IF
    Global("BD_JOINXP","LOCALS",0)
    InParty(Myself)
    XPGT(Player1,160999)
    XPLT(Myself,161000)
    THEN
    RESPONSE #100
    SetInterrupt(FALSE)
    SetGlobal("BD_JOINXP","LOCALS",1)
    ChangeStat(Myself,XP,161000,SET)
    SetInterrupt(TRUE)
    END
    
    IF
    Global("BD_JOINXP","LOCALS",0)
    InParty(Myself)
    XPGT(Player1,134999)
    XPLT(Player1,161000)
    XPLT(Myself,135000)
    THEN
    RESPONSE #100
    SetInterrupt(FALSE)
    SetGlobal("BD_JOINXP","LOCALS",1)
    ChangeStat(Myself,XP,135000,SET)
    SetInterrupt(TRUE)
    END
    
    IF
    Global("BD_JOINXP","LOCALS",0)
    InParty(Myself)
    XPGT(Player1,109999)
    XPLT(Player1,135000)
    XPLT(Myself,110000)
    THEN
    RESPONSE #100
    SetInterrupt(FALSE)
    SetGlobal("BD_JOINXP","LOCALS",1)
    ChangeStat(Myself,XP,110000,SET)
    SetInterrupt(TRUE)
    END
    
    IF
    Global("BD_JOINXP","LOCALS",0)
    InParty(Myself)
    XPGT(Player1,89999)
    XPLT(Player1,110000)
    XPLT(Myself,90000)
    THEN
    RESPONSE #100
    SetInterrupt(FALSE)
    SetGlobal("BD_JOINXP","LOCALS",1)
    ChangeStat(Myself,XP,90000,SET)
    SetInterrupt(TRUE)
    END
    
    IF
    Global("BD_JOINXP","LOCALS",0)
    InParty(Myself)
    XPLT(Player1,90000)
    THEN
    RESPONSE #100
    SetInterrupt(FALSE)
    SetGlobal("BD_JOINXP","LOCALS",1)
    SetInterrupt(TRUE)
    END
    
    
    Post edited by Raduziel on
Sign In or Register to comment.