590 lines
32 KiB
Plaintext
590 lines
32 KiB
Plaintext
|
/*//////////////////////////////////////////////////////////////////////////////
|
||
|
// Script Name: pe_henchmen
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
Used with pe_henchmen to run the npc plugin for
|
||
|
Philos Single Player Enhancements.
|
||
|
*///////////////////////////////////////////////////////////////////////////////
|
||
|
#include "pinc_henchmen"
|
||
|
#include "x0_i0_henchman"
|
||
|
#include "0i_module"
|
||
|
// Creates the Henchman widget.
|
||
|
void PopupWidgetHenchmanGUIPanel(object oPC);
|
||
|
void ResetHenchmanWindows(object oPC, int nToken, object oHenchman)
|
||
|
{
|
||
|
DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, "henchman_nui")));
|
||
|
DelayCommand(0.1, ExecuteScript("pi_henchmen", oPC));
|
||
|
DelayCommand(0.0, NuiDestroy(oPC, nToken));
|
||
|
DelayCommand(0.2, CreateCharacterEditGUIPanel(oPC, oHenchman));
|
||
|
}
|
||
|
void main()
|
||
|
{
|
||
|
//**************************************************************************
|
||
|
//********************** Henchmen Targeting Execution **********************
|
||
|
//**************************************************************************
|
||
|
// Get the last player to use targeting mode
|
||
|
object oPC = GetLastPlayerToSelectTarget();
|
||
|
if(GetLocalInt (oPC, "0_No_Win_Save")) return;
|
||
|
string sTargetMode = GetLocalString(oPC, AI_TARGET_MODE);
|
||
|
if(oPC == OBJECT_SELF && sTargetMode != "")
|
||
|
{
|
||
|
// Get the targeting mode data
|
||
|
object oTarget = GetTargetingModeSelectedObject();
|
||
|
vector vTarget = GetTargetingModeSelectedPosition();
|
||
|
location lLocation = Location(GetArea(oPC), vTarget, GetFacing(oPC));
|
||
|
object oObject = GetLocalObject(oPC, "AI_TARGET_OBJECT");
|
||
|
// If the user manually exited targeting mode without selecting a target, return
|
||
|
if(!GetIsObjectValid(oTarget) && vTarget == Vector())
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
// Targeting code here.
|
||
|
if(sTargetMode == "MAKE_NPC_HENCHMAN")
|
||
|
{
|
||
|
if(GetAssociateType(oTarget) == ASSOCIATE_TYPE_HENCHMAN)
|
||
|
{
|
||
|
ai_SendMessages(GetName(oTarget) + " is already a henchman!", AI_COLOR_RED, oPC);
|
||
|
return;
|
||
|
}
|
||
|
oTarget = CopyObject(oTarget, GetLocation(oPC), OBJECT_INVALID, "", TRUE);
|
||
|
ai_ClearCombatState(oTarget);
|
||
|
ChangeToStandardFaction(oTarget, STANDARD_FACTION_DEFENDER);
|
||
|
DeleteLocalInt(oTarget, AI_ONSPAWN_EVENT);
|
||
|
ai_ChangeEventScriptsForAssociate(oTarget);
|
||
|
AddHenchman(oPC, oTarget);
|
||
|
// Special check for Infinite Dungeon plot givers to be changed into henchman.
|
||
|
if(GetStringLeft(GetLocalString(oTarget, "sConversation"), 8) == "id1_plot")
|
||
|
{
|
||
|
DeleteLocalString(oTarget, "sConversation");
|
||
|
}
|
||
|
// Remove this variable so they may get a unique tag associate widget.
|
||
|
DeleteLocalString(oTarget, AI_TAG);
|
||
|
ai_SendMessages(GetName(oTarget) + " has been copied and is now in your party as a henchman.", AI_COLOR_GREEN, oPC);
|
||
|
//ExecuteScript("pi_henchmen", oPC);
|
||
|
}
|
||
|
}
|
||
|
//**************************************************************************
|
||
|
//*********************** Henchmen Elements Execution **********************
|
||
|
//**************************************************************************
|
||
|
else
|
||
|
{
|
||
|
// Let the inspector handle what it wants.
|
||
|
//HandleWindowInspectorEvent ();
|
||
|
object oPC = NuiGetEventPlayer();
|
||
|
int nToken = NuiGetEventWindow();
|
||
|
string sEvent = NuiGetEventType();
|
||
|
string sElem = NuiGetEventElement();
|
||
|
int nIndex = NuiGetEventArrayIndex();
|
||
|
string sWndId = NuiGetWindowId (oPC, nToken);
|
||
|
//SendMessageToPC(oPC, "pe_henchmen , 26 sWndId: " + sWndId + " sEvent: " + sEvent + " sElem: " + sElem +
|
||
|
// " nToken: " + IntToString(nToken) + " nIndex: " + IntToString(nIndex) +
|
||
|
// " oPC: " + GetName(oPC));
|
||
|
//**********************************************************************
|
||
|
// Watch to see if the window moves and save.
|
||
|
if(sElem == "window_geometry" && sEvent == "watch")
|
||
|
{
|
||
|
if(GetLocalInt(oPC, "AI_NO_NUI_SAVE")) return;
|
||
|
json jGeometry = NuiGetBind(oPC, nToken, "window_geometry");
|
||
|
json jData = GetHenchmanDbJson(oPC, "henchman", "0");
|
||
|
if(JsonGetType(jData) == JSON_TYPE_NULL) jData = JsonObject();
|
||
|
jData = JsonObjectSet(jData, sWndId, jGeometry);
|
||
|
SetHenchmanDbJson(oPC, "henchman", jData, "0");
|
||
|
}
|
||
|
else if(sWndId == "henchman_nui")
|
||
|
{
|
||
|
//**********************************************************************
|
||
|
// Henchman menu.
|
||
|
if(sEvent == "click")
|
||
|
{
|
||
|
string sParty = GetHenchmanDbString(oPC, "henchname", "0");
|
||
|
// Change to a different saved party #.
|
||
|
if(GetStringLeft(sElem, 9) == "btn_party")
|
||
|
{
|
||
|
sParty = GetStringRight(sElem, 1);
|
||
|
SetHenchmanDbString(oPC, "henchname", sParty, "0");
|
||
|
DelayCommand(0.0, NuiDestroy(oPC, nToken));
|
||
|
DelayCommand(0.1, ExecuteScript("pi_henchmen", oPC));
|
||
|
}
|
||
|
// Add an NPC in the game as a henchman.
|
||
|
else if(sElem == "btn_npc_henchman")
|
||
|
{
|
||
|
// Set this variable on the player so PEPS can run the targeting script for this plugin.
|
||
|
SetLocalString(oPC, AI_PLUGIN_TARGET_SCRIPT, "pe_henchmen");
|
||
|
// Set Targeting variables.
|
||
|
SetLocalString(oPC, AI_TARGET_MODE, "MAKE_NPC_HENCHMAN");
|
||
|
DelayCommand(0.0, NuiDestroy(oPC, nToken));
|
||
|
ai_SendMessages("Select an NPC to copy and make your henchman.", AI_COLOR_YELLOW, oPC);
|
||
|
EnterTargetingMode(oPC, OBJECT_TYPE_ALL , MOUSECURSOR_CREATE, MOUSECURSOR_NOCREATE);
|
||
|
}
|
||
|
// ******************* Saved Character buttons *********************
|
||
|
// Show saved party member.
|
||
|
else if(sElem == "btn_saved_char")
|
||
|
{
|
||
|
string sIndex = IntToString(nIndex);
|
||
|
SetHenchmanDbString(oPC, "henchname", sIndex, sParty);
|
||
|
AddSavedCharacterInfo(oPC, nToken, sParty);
|
||
|
}
|
||
|
// Have any saved henchman not in the party join.
|
||
|
else if(sElem == "btn_join_party")
|
||
|
{
|
||
|
SavedPartyJoin(oPC, nToken, sParty);
|
||
|
}
|
||
|
else if(sElem == "btn_saved_join")
|
||
|
{
|
||
|
SavedCharacterJoin(oPC, nToken, sParty);
|
||
|
}
|
||
|
else if(sElem == "btn_saved_remove")
|
||
|
{
|
||
|
string sIndex = GetHenchmanDbString(oPC, "henchname", sParty);
|
||
|
RemoveHenchmanDb(oPC, sParty + sIndex);
|
||
|
if(GetHenchmanDbString(oPC, "henchname", sParty + "0") == "")
|
||
|
{
|
||
|
SetHenchmanDbString(oPC, "henchname", "", sParty);
|
||
|
}
|
||
|
else SetHenchmanDbString(oPC, "henchname", "0", sParty);
|
||
|
DelayCommand(0.0, NuiDestroy(oPC, nToken));
|
||
|
DelayCommand(0.1, ExecuteScript("pi_henchmen", oPC));
|
||
|
}
|
||
|
else if(sElem == "btn_clear_party")
|
||
|
{
|
||
|
SavedPartyCleared(oPC, nToken, sParty);
|
||
|
}
|
||
|
// ******************* Current Character buttons *********************
|
||
|
// Show current party member.
|
||
|
else if(sElem == "btn_cur_char")
|
||
|
{
|
||
|
string sIndex = IntToString(nIndex);
|
||
|
SetHenchmanDbString(oPC, "image", sIndex, sParty);
|
||
|
AddCurrentCharacterInfo(oPC, nToken, sParty);
|
||
|
}
|
||
|
// The edit button, for now we are using it to level up!
|
||
|
else if(sElem == "btn_cur_edit")
|
||
|
{
|
||
|
object oHenchman = GetSelectedHenchman(oPC, sParty);
|
||
|
SetLocalObject(oPC, HENCHMAN_TO_EDIT, oHenchman);
|
||
|
CreateCharacterEditGUIPanel(oPC, oHenchman);
|
||
|
}
|
||
|
else if(sElem == "btn_cur_remove")
|
||
|
{
|
||
|
RemoveYourHenchman(oPC, nToken, sParty);
|
||
|
}
|
||
|
else if(sElem == "btn_remove_party")
|
||
|
{
|
||
|
RemoveWholeParty(oPC, nToken, sParty);
|
||
|
}
|
||
|
else if(sElem == "btn_cur_save")
|
||
|
{
|
||
|
SaveYourHenchman(oPC, nToken, sParty);
|
||
|
SetHenchmanDbString(oPC, "henchname", "0", sParty);
|
||
|
DelayCommand(0.0, NuiDestroy(oPC, nToken));
|
||
|
DelayCommand(0.1, ExecuteScript("pi_henchmen", oPC));
|
||
|
}
|
||
|
else if(sElem == "btn_save_party")
|
||
|
{
|
||
|
SaveWholeParty(oPC, nToken, sParty);
|
||
|
}
|
||
|
}
|
||
|
/*else if(sEvent == "watch")
|
||
|
{
|
||
|
if(sElem == "henchman_widget_check")
|
||
|
{
|
||
|
int bWidget = JsonGetInt(NuiGetBind(oPC, nToken, "henchman_widget_check"));
|
||
|
SetLocalInt(oPC, "AI_WIDGET_HENCHMAN", bWidget);
|
||
|
if(bWidget) PopupWidgetHenchmanGUIPanel(oPC);
|
||
|
else DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, "widgethenchmanwin")));
|
||
|
}
|
||
|
if(sElem == "lock_henchman_widget_check")
|
||
|
{
|
||
|
int bBuffLockWidget = JsonGetInt(NuiGetBind(oPC, nToken, "lock_henchman_widget_check"));
|
||
|
SetLocalInt(oPC, "AI_WIDGET_HENCHMAN_LOCK", bBuffLockWidget);
|
||
|
SetLocalInt(oPC, "AI_WIDGET_HENCHMAN", TRUE);
|
||
|
NuiSetBind(oPC, nToken, "henchman_widget_check", JsonBool(TRUE));
|
||
|
PopupWidgetHenchmanGUIPanel(oPC);
|
||
|
}
|
||
|
}
|
||
|
//**************************************************************************
|
||
|
// Spell Buffing.
|
||
|
else if (sWndId == "widget_henchman")
|
||
|
{
|
||
|
if (sEvent == "click")
|
||
|
{
|
||
|
string sParty;
|
||
|
if (sElem == "btn_one") sParty = "1";
|
||
|
if (sElem == "btn_two") sParty = "2";
|
||
|
if (sElem == "btn_three") sParty = "3";
|
||
|
if (sElem == "btn_four") sParty = "4";
|
||
|
SetHenchmanDbString (oPC, "henchname", sParty, "0");
|
||
|
PopupWidgetHenchmanGUIPanel(oPC);
|
||
|
}
|
||
|
} */
|
||
|
}
|
||
|
else if(sWndId == "henchman_edit_nui")
|
||
|
{
|
||
|
int nChange = 0;
|
||
|
int nID;
|
||
|
string sResRef, sID, sPlot;
|
||
|
object oHenchman = GetLocalObject(oPC, HENCHMAN_TO_EDIT);
|
||
|
if(sEvent == "watch")
|
||
|
{
|
||
|
if(sElem == "char_name")
|
||
|
{
|
||
|
string sName = JsonGetString(NuiGetBind(oPC, nToken, "char_name"));
|
||
|
SetName(oHenchman, sName);
|
||
|
}
|
||
|
if(sElem == "port_name")
|
||
|
{
|
||
|
if(GetLocalInt(oPC, "AI_PORTRAIT_ID_SET"))
|
||
|
{
|
||
|
DeleteLocalInt(oPC, "AI_PORTRAIT_ID_SET");
|
||
|
//nID = JsonGetInt(NuiGetUserData(oPC, nToken));
|
||
|
//SetPortraitId(oHenchman, nID);
|
||
|
}
|
||
|
else NuiSetUserData(oPC, nToken, JsonInt(-1));
|
||
|
sResRef = JsonGetString (NuiGetBind(oPC, nToken, "port_name"));
|
||
|
if(ResManGetAliasFor(sResRef + "l", RESTYPE_TGA) == "" &&
|
||
|
ResManGetAliasFor(sResRef + "l", RESTYPE_DDS) == "")
|
||
|
{
|
||
|
if(GetGender(oHenchman)) sResRef = "po_hu_f_99_";
|
||
|
else sResRef = "po_hu_m_99_";
|
||
|
}
|
||
|
NuiSetBind (oPC, nToken, "port_resref_image", JsonString (sResRef + "l"));
|
||
|
}
|
||
|
else if(sElem == "cmb_class_selected")
|
||
|
{
|
||
|
int nPosition = JsonGetInt(NuiGetBind(oPC, nToken, "opt_classes_value")) + 1;
|
||
|
int nSelection = JsonGetInt(NuiGetBind(oPC, nToken, "cmb_class_selected"));
|
||
|
int nClass = GetClassBySelection2DA(nSelection);
|
||
|
SetLocalInt(oHenchman, "CLASS_SELECTED_" + IntToString(nPosition), nClass);
|
||
|
DelayCommand(0.0, NuiDestroy(oPC, nToken));
|
||
|
DelayCommand(0.1, CreateCharacterEditGUIPanel(oPC, oHenchman));
|
||
|
}
|
||
|
else if(sElem == "cmb_package_selected")
|
||
|
{
|
||
|
int nPosition = JsonGetInt(NuiGetBind(oPC, nToken, "opt_classes_value")) + 1;
|
||
|
string sClass = IntToString(GetLocalInt(oHenchman, "CLASS_SELECTED_" + IntToString(nPosition)));
|
||
|
int nSelection = JsonGetInt(NuiGetBind(oPC, nToken, "cmb_package_selected"));
|
||
|
int nPackage = GetPackageBySelection2DA(sClass, nSelection);
|
||
|
SetLocalInt(oHenchman, "PACKAGE_SELECTED_" + IntToString(nPosition), nPackage);
|
||
|
}
|
||
|
else if(sElem == "cmb_soundset_selected")
|
||
|
{
|
||
|
int nSelection = JsonGetInt(NuiGetBind(oPC, nToken, "cmb_soundset_selected"));
|
||
|
int nSoundSet = GetSoundSetBySelection2DA(oHenchman, nSelection);
|
||
|
SetSoundset(oHenchman, nSoundSet);
|
||
|
string sResRef = GetStringLowerCase(Get2DAString("soundset", "RESREF", nSoundSet));
|
||
|
if(GetStringLeft(sResRef, 4) == "vs_f")
|
||
|
{
|
||
|
DelayCommand(0.1, ai_HaveCreatureSpeak(oHenchman, 11, ":1:2:3:22:34:35:41:42:44:45:46:"));
|
||
|
}
|
||
|
else if(GetStringLeft(sResRef, 4) == "vs_n")
|
||
|
{
|
||
|
DelayCommand(0.1, ai_HaveCreatureSpeak(oHenchman, 10, ":1:2:3:34:35:36:40:42:44:45:"));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DelayCommand(0.1, ai_HaveCreatureSpeak(oHenchman, 7, ":1:2:3:11:12:13:33:"));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if(sEvent == "click")
|
||
|
{
|
||
|
if (sElem == "btn_desc_save")
|
||
|
{
|
||
|
string sDescription = JsonGetString(NuiGetBind(oPC, nToken, "desc_value"));
|
||
|
SetDescription(oHenchman, sDescription);
|
||
|
return;
|
||
|
}
|
||
|
else if(sElem == "btn_level_up")
|
||
|
{
|
||
|
int nPosition = JsonGetInt(NuiGetBind(oPC, nToken, "opt_classes_value")) + 1;
|
||
|
int nClass = GetClassByPosition(nPosition, oHenchman);
|
||
|
if(nClass == CLASS_TYPE_INVALID)
|
||
|
{
|
||
|
nClass = GetLocalInt(oHenchman, "CLASS_SELECTED_" + IntToString(nPosition));
|
||
|
int nIndex = 1;
|
||
|
while(nIndex < 5)
|
||
|
{
|
||
|
if(nClass == GetClassByPosition(nIndex, oHenchman))
|
||
|
{
|
||
|
ai_SendMessages(GetName(oHenchman) + " already has this class in a different slot! You can only level up this class in its original slot.", AI_COLOR_RED, oPC);
|
||
|
return;
|
||
|
}
|
||
|
nIndex++;
|
||
|
}
|
||
|
}
|
||
|
int nPackage = GetLocalInt(oHenchman, "PACKAGE_SELECTED_" + IntToString(nPosition));
|
||
|
if(nPackage == 0) nPackage = GetPackageBySelection2DA(IntToString(nClass), 0);
|
||
|
else if(nPackage == -1)
|
||
|
{
|
||
|
ai_SendMessages("There is not a valid package for this class!", AI_COLOR_RED, oPC);
|
||
|
return;
|
||
|
}
|
||
|
string sLevel = IntToString(GetLevelByClass(nClass, oHenchman) + 1);
|
||
|
json jHenchman = ObjectToJson(oHenchman, TRUE);
|
||
|
//WriteTimestampedLogEntry("pe_henchmen, 318, jHenchman: " + JsonDump(jHenchman, 4));
|
||
|
// Check to see if this character has a LvlStatList that is required to level.
|
||
|
json jLvlStatList = JsonObjectGet(jHenchman, "LvlStatList");
|
||
|
//WriteTimestampedLogEntry("pe_henchmen, 321, jLvlStatList: " + JsonDump(jLvlStatList, 4));
|
||
|
if(JsonGetType(jLvlStatList) == JSON_TYPE_NULL)
|
||
|
{
|
||
|
RemoveHenchman(oPC, oHenchman);
|
||
|
// Make sure to get a clean faction version of the henchman here.
|
||
|
jHenchman = ObjectToJson(oHenchman, TRUE);
|
||
|
jHenchman = CreateLevelStatList(jHenchman, oHenchman, oPC);
|
||
|
location lLocation = GetLocation(oHenchman);
|
||
|
int nFamiliar, nCompanion;
|
||
|
object oCompanion = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oHenchman);
|
||
|
if(oCompanion != OBJECT_INVALID) nFamiliar = TRUE;
|
||
|
oCompanion = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oHenchman);
|
||
|
if(oCompanion != OBJECT_INVALID) nCompanion = TRUE;
|
||
|
AssignCommand(oHenchman, SetIsDestroyable(TRUE, FALSE, FALSE));
|
||
|
DestroyObject(oHenchman);
|
||
|
oHenchman = ai_AddHenchman(oPC, jHenchman, lLocation, nFamiliar, nCompanion);
|
||
|
SetLocalObject(oPC, HENCHMAN_TO_EDIT, oHenchman);
|
||
|
// We need to move party button list index to the last one since
|
||
|
// the henchman will move to the last henchman slot.
|
||
|
int nIndex = 1;
|
||
|
object oHench = GetHenchman(oPC, nIndex);
|
||
|
while(oHench != OBJECT_INVALID)
|
||
|
{
|
||
|
oHench = GetHenchman(oPC, ++nIndex);
|
||
|
//SendMessageToPC(oPC, "oHench: " + GetName(oHench) + " nIndex: " + IntToString(nIndex));
|
||
|
}
|
||
|
string sParty = GetHenchmanDbString(oPC, "henchname", "0");
|
||
|
SetHenchmanDbString(oPC, "image", IntToString(nIndex - 1), sParty);
|
||
|
}
|
||
|
int nLeveled = LevelUpHenchman(oHenchman, nClass, TRUE, nPackage);
|
||
|
//SendMessageToPC(oPC, "pe_henchmen, 282, nClass: " + IntToString(nClass) +
|
||
|
// " nPackage: " + IntToString(nPackage) + " nPosition: " + IntToString(nPosition) +
|
||
|
// " nLeveled: " + IntToString(nLeveled));
|
||
|
string sClass = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass)));
|
||
|
if(!nLeveled)
|
||
|
{
|
||
|
//WriteTimestampedLogEntry("pe_henchmen, 306, jLvlStatList: " + JsonDump(jLvlStatList, 1));
|
||
|
ai_SendMessages(GetName(oHenchman) + " could not level " + sClass + " to level " + sLevel + "!", AI_COLOR_RED, oPC);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ai_SendMessages(GetName(oHenchman) + " has leveled " + sClass + " to " + sLevel + " level!", AI_COLOR_GREEN, oPC);
|
||
|
ResetHenchmanWindows(oPC, nToken, oHenchman);
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
else if(sElem == "btn_reset")
|
||
|
{
|
||
|
oHenchman = ResetCharacter(oPC, oHenchman);
|
||
|
SetLocalObject(oPC, HENCHMAN_TO_EDIT, oHenchman);
|
||
|
ai_SendMessages(GetName(oHenchman) + " has been reset to level 1!", AI_COLOR_GREEN, oPC);
|
||
|
// We need to move party button list index to the last one since
|
||
|
// the henchman will move to the last henchman slot.
|
||
|
int nIndex = 1;
|
||
|
object oHench = GetHenchman(oPC, nIndex);
|
||
|
while(oHench != OBJECT_INVALID)
|
||
|
{
|
||
|
oHench = GetHenchman(oPC, ++nIndex);
|
||
|
}
|
||
|
string sParty = GetHenchmanDbString(oPC, "henchname", "0");
|
||
|
SetHenchmanDbString(oPC, "image", IntToString(nIndex - 1), sParty);
|
||
|
ResetHenchmanWindows(oPC, nToken, oHenchman);
|
||
|
}
|
||
|
else if(sElem == "btn_portrait_next")
|
||
|
{
|
||
|
nID = JsonGetInt(NuiGetUserData(oPC, nToken)) + 1;
|
||
|
nChange = 1;
|
||
|
}
|
||
|
else if(sElem == "btn_portrait_prev")
|
||
|
{
|
||
|
nID = JsonGetInt(NuiGetUserData(oPC, nToken)) - 1;
|
||
|
nChange = -1;
|
||
|
}
|
||
|
else if(sElem == "btn_portrait_ok")
|
||
|
{
|
||
|
nID = JsonGetInt(NuiGetUserData(oPC, nToken));
|
||
|
if(nID != -1) SetPortraitId(oHenchman, nID);
|
||
|
else
|
||
|
{
|
||
|
sResRef = JsonGetString (NuiGetBind (oPC, nToken, "port_name"));
|
||
|
if(ResManGetAliasFor(sResRef + "l", RESTYPE_TGA) == "" &&
|
||
|
ResManGetAliasFor(sResRef + "l", RESTYPE_DDS) == "")
|
||
|
{
|
||
|
if(GetGender(oHenchman)) sResRef = "po_hu_f_99_";
|
||
|
else sResRef = "po_hu_m_99_";
|
||
|
SetPortraitResRef(oHenchman, sResRef);
|
||
|
}
|
||
|
}
|
||
|
int nHenchToken = NuiFindWindow(oPC, "henchman_nui");
|
||
|
if(nHenchToken)
|
||
|
{
|
||
|
string sImage = GetPortraitResRef(oHenchman);
|
||
|
NuiSetBind(oPC, nHenchToken, "img_cur_portrait_image", JsonString(sImage + "l"));
|
||
|
}
|
||
|
}
|
||
|
if (nChange != 0)
|
||
|
{
|
||
|
int nPRace, nPGender;
|
||
|
int nMax2DARow = Get2DARowCount("portraits") - 1;
|
||
|
if(nID > 5000) nID = 1;
|
||
|
if(nID < 0) nID = 5000;
|
||
|
int nGender = GetGender(oHenchman);
|
||
|
int nRace = GetRacialType(oHenchman);
|
||
|
string sPRace = Get2DAString("portraits", "Race", nID);
|
||
|
if(sPRace != "") nPRace = StringToInt(sPRace);
|
||
|
else nPRace = -1;
|
||
|
string sResRef, sPGender = Get2DAString("portraits", "Sex", nID);
|
||
|
if(sPGender != "") nPGender = StringToInt(sPGender);
|
||
|
else nPGender = -1;
|
||
|
//WriteTimestampedLogEntry("pe_henchmen, 367, nGender: " + IntToString(nGender) +
|
||
|
// " nPGender: " + IntToString(nPGender) +
|
||
|
// " nRace: " + IntToString(nRace) + " nPRace: " + IntToString(nPRace) +
|
||
|
// " nID: " + IntToString(nID));
|
||
|
while((nRace != nPRace &&
|
||
|
(nRace != RACIAL_TYPE_HALFELF ||
|
||
|
(nPRace != RACIAL_TYPE_ELF || nPRace != RACIAL_TYPE_HUMAN))) ||
|
||
|
nGender != nPGender && nPGender != 4)
|
||
|
{
|
||
|
nID += nChange;
|
||
|
//WriteTimestampedLogEntry("pe_henchmen, 382, nCounter: " + IntToString(nCounter) +
|
||
|
// " nMax2DARow: " + IntToString(nMax2DARow));
|
||
|
if (nID > 5000) nID = 1;
|
||
|
if (nID < 1) nID = 5000;
|
||
|
sPRace = Get2DAString("portraits", "Race", nID);
|
||
|
if(sPRace != "") nPRace = StringToInt(sPRace);
|
||
|
else nPRace = -1;
|
||
|
sPGender = Get2DAString("portraits", "Sex", nID);
|
||
|
if(sPGender != "") nPGender = StringToInt(sPGender);
|
||
|
else nPGender = -1;
|
||
|
//WriteTimestampedLogEntry("pe_henchmen, 385, nGender: " + IntToString(nGender) +
|
||
|
// " nPGender: " + IntToString(nPGender) + " sPGender: " + sPGender +
|
||
|
// " nRace: " + IntToString(nRace) + " nPRace: " + IntToString(nPRace) +
|
||
|
// " sPRace: " + sPRace + " nID: " + IntToString(nID));
|
||
|
sResRef = "po_" + Get2DAString("portraits", "BaseResRef", nID) + "l";
|
||
|
if(ResManGetAliasFor(sResRef, RESTYPE_TGA) == "" &&
|
||
|
ResManGetAliasFor(sResRef, RESTYPE_DDS) == "") nPRace = 99;
|
||
|
}
|
||
|
sResRef = "po_" + Get2DAString("portraits", "BaseResRef", nID);
|
||
|
NuiSetUserData(oPC, nToken, JsonInt (nID));
|
||
|
// This is passed to the portrait name txt that actually sets
|
||
|
// the portrait information and tells it we picked an ID.
|
||
|
SetLocalInt(oPC, "AI_PORTRAIT_ID_SET", TRUE);
|
||
|
NuiSetBind(oPC, nToken, "port_name", JsonString (sResRef));
|
||
|
}
|
||
|
}
|
||
|
if(sEvent == "mousedown")
|
||
|
{
|
||
|
int nMouseButton = JsonGetInt(JsonObjectGet(NuiGetEventPayload(), "mouse_btn"));
|
||
|
if (sElem == "opt_classes" && nMouseButton == NUI_MOUSE_BUTTON_LEFT)
|
||
|
{
|
||
|
int nPosition = JsonGetInt(NuiGetBind(oPC, nToken, "opt_classes_value"));
|
||
|
SetLocalInt(oHenchman, "CLASS_OPTION_POSITION", nPosition);
|
||
|
DelayCommand(0.0, NuiDestroy(oPC, nToken));
|
||
|
DelayCommand(0.1, CreateCharacterEditGUIPanel(oPC, oHenchman));
|
||
|
return;
|
||
|
}
|
||
|
if(nMouseButton == NUI_MOUSE_BUTTON_RIGHT)
|
||
|
{
|
||
|
if(sElem == "cmb_class")
|
||
|
{
|
||
|
int nPosition = JsonGetInt(NuiGetBind(oPC, nToken, "opt_classes_value")) + 1;
|
||
|
int nClass = GetLocalInt(oHenchman, "CLASS_SELECTED_" + IntToString(nPosition));
|
||
|
string sName = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass)));
|
||
|
string sDescription = GetStringByStrRef(StringToInt(Get2DAString("classes", "Description", nClass)));
|
||
|
string sIcon = Get2DAString("classes", "Icon", nClass);
|
||
|
CreateCharacterDescriptionNUI(oPC, sName, sIcon, sDescription);
|
||
|
}
|
||
|
else if(sElem == "cmb_package")
|
||
|
{
|
||
|
int nPosition = JsonGetInt(NuiGetBind(oPC, nToken, "opt_classes_value")) + 1;
|
||
|
int nClass = GetLocalInt(oHenchman, "CLASS_SELECTED_" + IntToString(nPosition));
|
||
|
int nPackage = GetLocalInt(oHenchman, "PACKAGE_SELECTED_" + IntToString(nPosition));
|
||
|
string sName = GetStringByStrRef(StringToInt(Get2DAString("packages", "Name", nPackage)));
|
||
|
string sDescription = GetStringByStrRef(StringToInt(Get2DAString("packages", "Description", nPackage)));
|
||
|
string sIcon = Get2DAString("classes", "Icon", nClass);
|
||
|
CreateCharacterDescriptionNUI(oPC, sName, sIcon, sDescription);
|
||
|
}
|
||
|
else if(sElem == "cmb_soundset")
|
||
|
{
|
||
|
int nSelection = JsonGetInt(NuiGetBind(oPC, nToken, "cmb_soundset_selected"));
|
||
|
int nSoundSet = GetSoundSetBySelection2DA(oHenchman, nSelection);
|
||
|
string sResRef = GetStringLowerCase(Get2DAString("soundset", "RESREF", nSoundSet));
|
||
|
if(GetStringLeft(sResRef, 4) == "vs_f")
|
||
|
{
|
||
|
DelayCommand(0.1, ai_HaveCreatureSpeak(oHenchman, 11, ":1:2:3:22:34:35:41:42:44:45:46:"));
|
||
|
}
|
||
|
else if(GetStringLeft(sResRef, 4) == "vs_n")
|
||
|
{
|
||
|
DelayCommand(0.1, ai_HaveCreatureSpeak(oHenchman, 10, ":1:2:3:34:35:36:40:42:44:45:"));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DelayCommand(0.1, ai_HaveCreatureSpeak(oHenchman, 7, ":1:2:3:11:12:13:33:"));
|
||
|
}
|
||
|
}
|
||
|
else if(sElem == "opt_classes")
|
||
|
{
|
||
|
int nPosition = JsonGetInt(NuiGetBind(oPC, nToken, "opt_classes_value")) + 1;
|
||
|
int nClass = GetClassByPosition(nPosition, oHenchman);
|
||
|
if(nClass != CLASS_TYPE_INVALID)
|
||
|
{
|
||
|
string sName = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass)));
|
||
|
string sDescription = GetStringByStrRef(StringToInt(Get2DAString("classes", "Description", nClass)));
|
||
|
int nPackage = GetLocalInt(oHenchman, "PACKAGE_SELECTED_" + IntToString(nPosition));
|
||
|
string sPackageName = GetStringByStrRef(StringToInt(Get2DAString("packages", "Name", nPackage)));
|
||
|
sDescription += "\n\nPACKAGE: \n" + sPackageName + "\n";
|
||
|
sDescription += GetStringByStrRef(StringToInt(Get2DAString("packages", "Description", nPackage)));
|
||
|
string sIcon = Get2DAString("classes", "Icon", nClass);
|
||
|
CreateCharacterDescriptionNUI(oPC, sName, sIcon, sDescription);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if(sWndId == "char_description_nui")
|
||
|
{
|
||
|
if(sEvent == "click" && sElem == "btn_ok") DelayCommand(0.0, NuiDestroy(oPC, nToken));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
void PopupWidgetHenchmanGUIPanel(object oPC)
|
||
|
{
|
||
|
// Set window to not save until it has been created.
|
||
|
SetLocalInt (oPC, "AI_NO_NUI_SAVE", TRUE);
|
||
|
DelayCommand (0.5f, DeleteLocalInt (oPC, "AI_NO_NUI_SAVE"));
|
||
|
// Row 1 (buttons)**********************************************************
|
||
|
json jRow = CreateButtonImage(JsonArray(), "ir_level1", "btn_one", 30.0f, 30.0f);
|
||
|
jRow = CreateButtonImage(jRow, "ir_level2", "btn_two", 30.0f, 30.0f);
|
||
|
jRow = CreateButtonImage(jRow, "ir_level3", "btn_three", 30.0f, 30.0f);
|
||
|
jRow = CreateButtonImage(jRow, "ir_level4", "btn_four", 30.0f, 30.0f);
|
||
|
// Add the row to the column.
|
||
|
json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow));
|
||
|
int bAINPCWidgetLock = GetLocalInt(oPC, "AI_WIDGET_HENCHMAN_LOCK");
|
||
|
// Get the window location to restore it from the database.
|
||
|
float fX = GetLocalFloat(oPC, "widget_henchman_X");
|
||
|
float fY = GetLocalFloat(oPC, "widget_henchman_Y");
|
||
|
if(fX == 0.0f && fY == 0.0f)
|
||
|
{
|
||
|
fX = 10.0f;
|
||
|
fY = 10.0f;
|
||
|
}
|
||
|
if(bAINPCWidgetLock)
|
||
|
{
|
||
|
fX = fX + 4.0f;
|
||
|
fY = fY + 45.0f;
|
||
|
}
|
||
|
// Set the layout of the window.
|
||
|
json jLayout = NuiCol (jCol);
|
||
|
int nToken;
|
||
|
if(bAINPCWidgetLock) nToken = SetWindow (oPC, jLayout, "widget_henchman", "Henchman Widget", fX, fY, 160.0, 62.0, FALSE, FALSE, FALSE, TRUE, FALSE, "pe_npc");
|
||
|
else nToken = SetWindow (oPC, jLayout, "widget_henchman", "Henchman Widget", fX, fY, 160.0, 95.0, FALSE, FALSE, FALSE, TRUE, TRUE, "pe_npc");
|
||
|
// Set event watches for window inspector and save window location.
|
||
|
NuiSetBindWatch (oPC, nToken, "collapsed", TRUE);
|
||
|
NuiSetBindWatch (oPC, nToken, "window_geometry", TRUE);
|
||
|
// Set the buttons to show events.
|
||
|
//NuiSetBind (oPC, nToken, "btn_one", JsonBool (TRUE));
|
||
|
NuiSetBind (oPC, nToken, "btn_one_event", JsonBool (TRUE));
|
||
|
NuiSetBind (oPC, nToken, "btn_two", JsonBool (TRUE));
|
||
|
NuiSetBind (oPC, nToken, "btn_two_event", JsonBool (TRUE));
|
||
|
NuiSetBind (oPC, nToken, "btn_three", JsonBool (TRUE));
|
||
|
NuiSetBind (oPC, nToken, "btn_three_event", JsonBool (TRUE));
|
||
|
NuiSetBind (oPC, nToken, "btn_four", JsonBool (TRUE));
|
||
|
NuiSetBind (oPC, nToken, "btn_four_event", JsonBool (TRUE));
|
||
|
}
|