Compatible Companion Mod Creation/Joining The Party

From Dragon Age Toolset Wiki
Jump to: navigation, search

The Joining The Party step describes how to handle adding your custom companion to the party.

In this step Valeria is allowed to have a class chosen the first time you meet her. So create in VALERIA_NPC_HIRE the flags ISMAGE, ISROGUE, ISWARRIOR and ISROGUEWARRIOR, if you want to do that, otherwise delete all the references to those flags. One of these is set to TRUE through dialog with Valeria. At the end of the dialog this script is called.

The joining script

Create the following script. I call it valeria_valjoin.nss This script contains EVERYTHING you need to properly hire a follower without leveling him/her automatically.

Valeria in my mod is allowed to choose her class to Warrior, Rogue, Mage or Multiclass (here I show you only the case Rogue-Warrior).

#include "sys_chargen_h"
#include "sys_rewards_h"
 
#include "plt_valeria_npc_hire"
 
//this function resets an NPC
void basic_blank_char(object oChar);
 
void main()
{
    object oPC=GetHero();
    object me=OBJECT_SELF;
 
    WR_SetPlotFlag(PLT_VALERIA_NPC_HIRE, PARTY_VALERIA_JOINED, TRUE);
 
    basic_blank_char(me);
    //select race, otherwise skills tree wont show
 
    Chargen_SelectRace(me,RACE_HUMAN);
    int nClass;
    //remove the rogue defaults, valeria's char is rogue when created
 
    CharGen_ClearAbilityList(me,1);//remove talents
    //CharGen_ClearAbilityList(me,2);//remove spells
    //CharGen_ClearAbilityList(me,3);//remove skills
 
    RemoveAbility(me, ABILITY_TALENT_DIRTY_FIGHTING);
    RemoveAbility(me, ABILITY_SKILL_POISON_1);
    //depending on which flags you set in the dialog that lead to this script, choose the appropriate class
 
    if(WR_GetPlotFlag(PLT_VALERIA_NPC_HIRE,ISMAGE)==TRUE)
    {
        nClass=CLASS_WIZARD;
        _AddAbility(me, ABILITY_SPELL_ARCANE_BOLT);
    }
 
    if(WR_GetPlotFlag(PLT_VALERIA_NPC_HIRE,ISROGUE)==TRUE)
    {
        nClass=CLASS_ROGUE;
        _AddAbility(me, ABILITY_TALENT_DIRTY_FIGHTING);
        _AddAbility(me, ABILITY_SKILL_POISON_1);
    }
 
    if(WR_GetPlotFlag(PLT_VALERIA_NPC_HIRE,ISWARRIOR)==TRUE)
    {
        nClass=CLASS_WARRIOR;
        _AddAbility(me, ABILITY_TALENT_POWERFUL);
    }
 
    if(WR_GetPlotFlag(PLT_VALERIA_NPC_HIRE,ISROGUEWARRIOR)==TRUE)
    {nClass=CLASS_ROGUE;}
 
    //apply attributes, abilities and stats for the core class
    //SetCreatureProperty(me,PROPERTY_SIMPLE_CURRENT_CLASS, n1-3.0,PROPERTY_VALUE_BASE);
 
    Chargen_SelectCoreClass(me,nClass);
 
    //add mage spells
    //_AddAbility(me, ABILITY_TALENT_HIDDEN_ASSASSIN);//this works if it's available on the core class
 
    if(WR_GetPlotFlag(PLT_VALERIA_NPC_HIRE,ISROGUEWARRIOR)==TRUE)
    {
        _AddAbility(me, ABILITY_TALENT_HIDDEN_WARRIOR);
        _AddAbility(me, ABILITY_TALENT_DIRTY_FIGHTING);
        _AddAbility(me, ABILITY_SKILL_POISON_1);
    }
 
    //tactics
 
    Chargen_SetNumTactics(me);
    Chargen_EnableTacticsPresets(me);
 
    //level needed for scaling
 
    int nPackage = GetPackage(me);
    int nTargetLevel;
 
    int nPlayerLevel = GetLevel(oPC);
    if(nPlayerLevel >= 13 || nPlayerLevel == 1 )
       nTargetLevel = nPlayerLevel;
    else
       nTargetLevel = nPlayerLevel + 1;
 
    int nMinLevel = GetM2DAInt(TABLE_PACKAGES, "MinLevel", nPackage);
 
    if(nMinLevel > 0 && nMinLevel > nTargetLevel)
       nTargetLevel = nMinLevel;
 
    //xp until hero level
 
    int nXp = RW_GetXPNeededForLevel(Max(nTargetLevel, 1));
    RewardXP(me, nXp, TRUE, FALSE);
 
    //add specialization
 
    float count=1.0;
    if(GetLevel(GetHero())>=7)
    {
        SetCreatureProperty(me, 38, count);  // 38 is the spec point ID
        count=count+1.;
    }
    if(GetLevel(GetHero())>=14)
        SetCreatureProperty(me, 38, count);  // 38 is the spec point ID
 
    //make available in party picker
 
    SetFollowerState(me, FOLLOWER_STATE_ACTIVE);
    SetFollowerState(me, FOLLOWER_STATE_AVAILABLE);
 
    //dont fire player_core scaling
 
    SetLocalInt(me, FOLLOWER_SCALED, 1);
    SetLocalInt(me, AI_FLAG_STATIONARY, 0);
    SetLocalInt(me, AMBIENT_SYSTEM_STATE, 0);
    SetLocalInt(me, CREATURE_REWARD_FLAGS, 0);
 
    //change script to player and send hire event
 
    SetEventScript(me, RESOURCE_SCRIPT_PLAYER_CORE);
    InitHeartbeat(me, CONFIG_CONSTANT_HEARTBEAT_RATE);
    SendPartyMemberHiredEvent(me, FALSE);
    SetFollowerApprovalEnabled(me,TRUE);
 
    //open up party picker to allow Valeria to join in the active party
    SetPartyPickerGUIStatus(2);
    ShowPartyPickerGUI();  
}
 
 
void basic_blank_char(object oChar)
{
// Initialize all creature properties to default value
 
    SetCreatureProperty(oChar,PROPERTY_SIMPLE_LEVEL,1.0f,PROPERTY_VALUE_BASE);
    SetCreatureProperty(oChar,PROPERTY_SIMPLE_EXPERIENCE,0.0f,PROPERTY_VALUE_BASE);
    SetCreatureProperty(oChar,PROPERTY_ATTRIBUTE_STRENGTH,      CHARGEN_BASE_ATTRIBUTE_VALUE, PROPERTY_VALUE_BASE);
    SetCreatureProperty(oChar,PROPERTY_ATTRIBUTE_DEXTERITY,     CHARGEN_BASE_ATTRIBUTE_VALUE, PROPERTY_VALUE_BASE);
    SetCreatureProperty(oChar,PROPERTY_ATTRIBUTE_CONSTITUTION,  CHARGEN_BASE_ATTRIBUTE_VALUE, PROPERTY_VALUE_BASE);
    SetCreatureProperty(oChar,PROPERTY_ATTRIBUTE_WILLPOWER,     CHARGEN_BASE_ATTRIBUTE_VALUE, PROPERTY_VALUE_BASE);
    SetCreatureProperty(oChar,PROPERTY_ATTRIBUTE_INTELLIGENCE,  CHARGEN_BASE_ATTRIBUTE_VALUE, PROPERTY_VALUE_BASE);
    SetCreatureProperty(oChar,PROPERTY_ATTRIBUTE_MAGIC,         CHARGEN_BASE_ATTRIBUTE_VALUE, PROPERTY_VALUE_BASE);
    SetCreatureProperty(oChar,PROPERTY_ATTRIBUTE_ATTACK_SPEED_MODIFIER,     1.0f);
    SetCreatureProperty(oChar,PROPERTY_ATTRIBUTE_DAMAGE_SCALE,       1.0f);
    SetCreatureProperty(oChar,PROPERTY_ATTRIBUTE_RESISTANCE_MENTAL,         0.0f);
    SetCreatureProperty(oChar,PROPERTY_ATTRIBUTE_RESISTANCE_PHYSICAL,       0.0f);
    SetCreatureProperty(oChar,51,       1.0f);
    SetCreatureProperty(oChar, PROPERTY_ATTRIBUTE_REGENERATION_HEALTH_COMBAT,  REGENERATION_HEALTH_COMBAT_DEFAULT);
    SetCreatureProperty(oChar, PROPERTY_ATTRIBUTE_REGENERATION_STAMINA_COMBAT, REGENERATION_STAMINA_COMBAT_DEFAULT);
    SetCreatureProperty(oChar, PROPERTY_ATTRIBUTE_REGENERATION_HEALTH,REGENERATION_HEALTH_EXPLORE_DEFAULT, PROPERTY_VALUE_BASE);
    SetCreatureProperty(oChar, PROPERTY_ATTRIBUTE_REGENERATION_STAMINA, REGENERATION_STAMINA_EXPLORE_DEFAULT, PROPERTY_VALUE_BASE);
    SetCreatureProperty(oChar, PROPERTY_ATTRIBUTE_MISSILE_SHIELD,0.0);
    SetCreatureProperty(oChar, 38,0.0);
    SetCreatureProperty(oChar, PROPERTY_DEPLETABLE_HEALTH ,          1.0f, PROPERTY_VALUE_BASE);
    SetCreatureProperty(oChar, PROPERTY_DEPLETABLE_MANA_STAMINA ,    0.0f, PROPERTY_VALUE_BASE);
    SetCreatureProperty(oChar, PROPERTY_ATTRIBUTE_DEFENSE ,          0.0f, PROPERTY_VALUE_BASE);
    SetCreatureProperty(oChar, PROPERTY_ATTRIBUTE_ATTACK,            0.0f, PROPERTY_VALUE_BASE);
    SetCreatureProperty(oChar, PROPERTY_ATTRIBUTE_DAMAGE_BONUS,      0.0f, PROPERTY_VALUE_BASE);
    SetCreatureProperty(oChar, PROPERTY_ATTRIBUTE_FLANKING_ANGLE,  60.0f, PROPERTY_VALUE_BASE);
 
}
The Fade Compatible Companion Mod Creation Gifts And Approval