MMD_PRC8/_module/nss/inc_examine.nss
Jaysyn904 8c530509fe Increased HP of Practice Dummy
Increased HP of Practice Dummy.  Added instanced player room with persistent storage in Inn.  Full compile.  Updated release archive.
2024-09-21 14:31:54 -04:00

495 lines
18 KiB
Plaintext

/*
Examine NUI Windows
Created By: Daz
*/
#include "inc_nui"
#include "inc_util"
const string EXAMINE_NUI_WINDOW_ID = "EXAMINEWINDOW";
const string EXAMINE_WINDOW_GEOMETRY_JSON = "EXAMINE_WINDOW_GEOMETRY_JSON";
const string EXAMINE_GENERIC_WINDOW_JSON = "EXAMINE_GENERIC_WINDOW_JSON";
const string EXAMINE_ITEM_WINDOW_JSON = "EXAMINE_ITEM_WINDOW_JSON";
const string EXAMINE_CURRENT_WINDOW_TYPE = "EXAMINE_CURRENT_WINDOW_TYPE";
const string EXAMINE_CURRENT_OBJECT = "EXAMINE_CURRENT_OBJECT";
const float EXAMINE_GENERIC_WINDOW_WIDTH = 500.0f;
const float EXAMINE_GENERIC_WINDOW_HEIGHT = 255.0f;
const float EXAMINE_ITEM_WINDOW_WIDTH = 500.0f;
const float EXAMINE_ITEM_WINDOW_HEIGHT = 400.0f;
void Examine_DisablePanels(object oPlayer);
json Examine_GetWindowJson(int nPanel);
json Examine_GetGenericWindowJson();
json Examine_GetItemWindowJson();
float Examine_GetWindowWidth(int nPanel);
float Examine_GetWindowHeight(int nPanel);
void Examine_HandleGUIEvents(object oPlayer, object oTarget, int nPanel);
void Examine_HandleNUIEvents(object oPlayer, int nToken, string sType, string sElement, int nArrayIndex);
void Examine_SetData(object oPlayer, int nToken, object oTarget, int nPanel);
void Examine_SetGenericData(object oPlayer, int nToken, object oTarget, int nPanel);
string Examine_GetItemPropertyString(itemproperty ip);
void Examine_SetItemData(object oPlayer, int nToken, object oItem);
void Examine_DisablePanels(object oPlayer)
{
SetGuiPanelDisabled(oPlayer, GUI_PANEL_EXAMINE_CREATURE, TRUE);
SetGuiPanelDisabled(oPlayer, GUI_PANEL_EXAMINE_ITEM, TRUE);
SetGuiPanelDisabled(oPlayer, GUI_PANEL_EXAMINE_PLACEABLE, TRUE);
SetGuiPanelDisabled(oPlayer, GUI_PANEL_EXAMINE_DOOR, TRUE);
}
json Examine_GetWindowJson(int nPanel)
{
json jWindow;
switch (nPanel)
{
case GUI_PANEL_EXAMINE_CREATURE:
case GUI_PANEL_EXAMINE_PLACEABLE:
case GUI_PANEL_EXAMINE_DOOR:
jWindow = Examine_GetGenericWindowJson();
break;
case GUI_PANEL_EXAMINE_ITEM:
jWindow = Examine_GetItemWindowJson();
break;
}
return jWindow;
}
json Examine_GetGenericWindowJson()
{
json jRoot = GetLocalJson(GetModule(), EXAMINE_GENERIC_WINDOW_JSON);
if (jRoot == JsonNull())
{
json jCol = JsonArray(), jRow;
jRow = JsonArray();
{
json jSubCol, jSubRow;
jSubCol = JsonArray();
// Image
jSubRow = JsonArray();
{
json jImage = NuiImage(NuiBind("image_1"), JsonInt(NUI_ASPECT_EXACTSCALED), JsonInt(NUI_HALIGN_CENTER), JsonInt(NUI_VALIGN_TOP));
jImage = NuiWidth(jImage, 64.0f);
jImage = NuiHeight(jImage, 100.0f);
jSubRow = JsonArrayInsert(jSubRow, jImage);
}
jSubCol = NuiInsertRow(jSubCol, jSubRow);
// Spacer
jSubRow = JsonArray();
{
jSubRow = JsonArrayInsert(jSubRow, NuiSpacer());
}
jSubCol = NuiInsertRow(jSubCol, jSubRow);
jRow = JsonArrayInsert(jRow, NuiCol(jSubCol));
jSubCol = JsonArray();
// Description Label
jSubRow = JsonArray();
{
json jHeader = NuiHeader(JsonString("Description"));
jSubRow = JsonArrayInsert(jSubRow, jHeader);
}
jSubCol = NuiInsertRow(jSubCol, jSubRow);
// Description Text
jSubRow = JsonArray();
{
json jDescription = NuiText(NuiBind("description"));
jDescription = NuiHeight(jDescription, 160.0f);
jSubRow = JsonArrayInsert(jSubRow, jDescription);
}
jSubCol = NuiInsertRow(jSubCol, jSubRow);
// Spacer
jSubRow = JsonArray();
{
jSubRow = JsonArrayInsert(jSubRow, NuiSpacer());
}
jSubCol = NuiInsertRow(jSubCol, jSubRow);
jRow = JsonArrayInsert(jRow, NuiCol(jSubCol));
}
jCol = NuiInsertRow(jCol, jRow);
jRoot = NuiCol(jCol);
SetLocalJson(GetModule(), EXAMINE_GENERIC_WINDOW_JSON, jRoot);
}
return jRoot;
}
json Examine_GetItemWindowJson()
{
json jRoot = GetLocalJson(GetModule(), EXAMINE_ITEM_WINDOW_JSON);
if (jRoot == JsonNull())
{
json jCol = JsonArray(), jRow;
jRow = JsonArray();
{
json jSubCol, jSubRow;
jSubCol = JsonArray();
// Image
jSubRow = JsonArray();
{
json jImage = NuiImage(NuiBind("image_1"), JsonInt(NUI_ASPECT_EXACTSCALED), JsonInt(NUI_HALIGN_CENTER), JsonInt(NUI_VALIGN_TOP));
json jRect = NuiRect(0.0f, 0.0f, 64.0f, 192.0f);
json jDrawList = JsonArray();
jDrawList = JsonArrayInsert(jDrawList, NuiDrawListImage(NuiBind("complex_item"), NuiBind("image_2"), jRect, JsonInt(NUI_ASPECT_EXACTSCALED), JsonInt(NUI_HALIGN_CENTER), JsonInt(NUI_VALIGN_TOP)));
jDrawList = JsonArrayInsert(jDrawList, NuiDrawListImage(NuiBind("complex_item"), NuiBind("image_3"), jRect, JsonInt(NUI_ASPECT_EXACTSCALED), JsonInt(NUI_HALIGN_CENTER), JsonInt(NUI_VALIGN_TOP)));
jImage = NuiDrawList(jImage, JsonBool(TRUE), jDrawList);
jImage = NuiWidth(jImage, 64.0f);
jImage = NuiHeight(jImage, 192.0f);
jSubRow = JsonArrayInsert(jSubRow, jImage);
}
jSubCol = NuiInsertRow(jSubCol, jSubRow);
// Button?
jSubRow = JsonArray();
{
json jButton = NuiButton(JsonString("Button?"));
jButton = NuiId(jButton, "btn_button");
jButton = NuiWidth(jButton, 64.0f);
jButton = NuiHeight(jButton, 35.0f);
jSubRow = JsonArrayInsert(jSubRow, jButton);
}
//jSubCol = NuiInsertRow(jSubCol, jSubRow);
// Spacer
jSubRow = JsonArray();
{
jSubRow = JsonArrayInsert(jSubRow, NuiSpacer());
}
jSubCol = NuiInsertRow(jSubCol, jSubRow);
jRow = JsonArrayInsert(jRow, NuiCol(jSubCol));
jSubCol = JsonArray();
// Description Label
jSubRow = JsonArray();
{
json jHeader = NuiHeader(JsonString("Description"));
jSubRow = JsonArrayInsert(jSubRow, jHeader);
}
jSubCol = NuiInsertRow(jSubCol, jSubRow);
// Description Text
jSubRow = JsonArray();
{
json jDescription = NuiText(NuiBind("description"));
jDescription = NuiHeight(jDescription, 160.0f);
jSubRow = JsonArrayInsert(jSubRow, jDescription);
}
jSubCol = NuiInsertRow(jSubCol, jSubRow);
// Item Properties Label
jSubRow = JsonArray();
{
json jHeader = NuiHeader(JsonString("Item Properties"));
jSubRow = JsonArrayInsert(jSubRow, jHeader);
}
jSubCol = NuiInsertRow(jSubCol, jSubRow);
// Item Properties List
jSubRow = JsonArray();
{
json jListTemplate = JsonArray();
{
json jLabel = NuiLabel(NuiBind("property"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE));
jLabel = NuiStyleForegroundColor(jLabel, NuiBind("color"));
jListTemplate = JsonArrayInsert(jListTemplate, NuiListTemplateCell(jLabel, 0.0f, TRUE));
}
json jList = NuiList(jListTemplate, NuiBind("property"), 16.0f);
jList = NuiHeight(jList, 105.0f);
jSubRow = JsonArrayInsert(jSubRow, jList);
}
jSubCol = NuiInsertRow(jSubCol, jSubRow);
// Spacer
jSubRow = JsonArray();
{
jSubRow = JsonArrayInsert(jSubRow, NuiSpacer());
}
jSubCol = NuiInsertRow(jSubCol, jSubRow);
jRow = JsonArrayInsert(jRow, NuiCol(jSubCol));
}
jCol = NuiInsertRow(jCol, jRow);
jRoot = NuiCol(jCol);
SetLocalJson(GetModule(), EXAMINE_ITEM_WINDOW_JSON, jRoot);
}
return jRoot;
}
float Examine_GetWindowWidth(int nPanel)
{
float fWidth;
switch (nPanel)
{
case GUI_PANEL_EXAMINE_CREATURE:
case GUI_PANEL_EXAMINE_PLACEABLE:
case GUI_PANEL_EXAMINE_DOOR:
fWidth = EXAMINE_GENERIC_WINDOW_WIDTH;
break;
case GUI_PANEL_EXAMINE_ITEM:
fWidth = EXAMINE_ITEM_WINDOW_WIDTH;
break;
}
return fWidth;
}
float Examine_GetWindowHeight(int nPanel)
{
float fHeight;
switch (nPanel)
{
case GUI_PANEL_EXAMINE_CREATURE:
case GUI_PANEL_EXAMINE_PLACEABLE:
case GUI_PANEL_EXAMINE_DOOR:
fHeight = EXAMINE_GENERIC_WINDOW_HEIGHT;
break;
case GUI_PANEL_EXAMINE_ITEM:
fHeight = EXAMINE_ITEM_WINDOW_HEIGHT;
break;
}
return fHeight;
}
void Examine_HandleGUIEvents(object oPlayer, object oTarget, int nPanel)
{
json jGeometry = GetLocalJson(oPlayer, EXAMINE_WINDOW_GEOMETRY_JSON);
int nToken = NuiFindWindow(oPlayer, EXAMINE_NUI_WINDOW_ID);
if (nToken)
{
if (GetLocalObject(oPlayer, EXAMINE_CURRENT_OBJECT) == oTarget)
return;
int bIsItemExamine = nPanel == GUI_PANEL_EXAMINE_ITEM;
int nCurrentWindowType = GetLocalInt(oPlayer, EXAMINE_CURRENT_WINDOW_TYPE);
if (bIsItemExamine && nCurrentWindowType != GUI_PANEL_EXAMINE_ITEM)
{
NuiSetGroupLayout(oPlayer, nToken, NUI_WINDOW_ROOT_GROUP, Examine_GetWindowJson(nPanel));
NuiSetBind(oPlayer, nToken, NUI_WINDOW_GEOMETRY_BIND, NuiSetRectHeight(jGeometry, Examine_GetWindowHeight(nPanel)));
}
else if (!bIsItemExamine && nCurrentWindowType == GUI_PANEL_EXAMINE_ITEM)
{
NuiSetGroupLayout(oPlayer, nToken, NUI_WINDOW_ROOT_GROUP, Examine_GetWindowJson(nPanel));
NuiSetBind(oPlayer, nToken, NUI_WINDOW_GEOMETRY_BIND, NuiSetRectHeight(jGeometry, Examine_GetWindowHeight(nPanel)));
}
Examine_SetData(oPlayer, nToken, oTarget, nPanel);
SetLocalInt(oPlayer, EXAMINE_CURRENT_WINDOW_TYPE, nPanel);
SetLocalObject(oPlayer, EXAMINE_CURRENT_OBJECT, oTarget);
return;
}
json jRoot = Examine_GetWindowJson(nPanel);
json jWindow = NuiWindow(jRoot, NuiBind(NUI_WINDOW_TITLE_BIND), NuiBind(NUI_WINDOW_GEOMETRY_BIND), JsonBool(FALSE), JsonNull(), JsonBool(TRUE), JsonBool(FALSE), JsonBool(TRUE));
float fWidth = Examine_GetWindowWidth(nPanel);
float fHeight = Examine_GetWindowHeight(nPanel);
if (jGeometry == JsonNull())
jGeometry = NuiGetCenteredGeometryRect(oPlayer, fWidth, fHeight);
else
{
jGeometry = NuiSetRectWidth(jGeometry, fWidth);
jGeometry = NuiSetRectHeight(jGeometry, fHeight);
}
nToken = NuiCreate(oPlayer, jWindow, EXAMINE_NUI_WINDOW_ID);
NuiSetBindWatch(oPlayer, nToken, NUI_WINDOW_GEOMETRY_BIND, TRUE);
NuiSetBind(oPlayer, nToken, NUI_WINDOW_GEOMETRY_BIND, jGeometry);
Examine_SetData(oPlayer, nToken, oTarget, nPanel);
SetLocalInt(oPlayer, EXAMINE_CURRENT_WINDOW_TYPE, nPanel);
SetLocalObject(oPlayer, EXAMINE_CURRENT_OBJECT, oTarget);
}
void Examine_HandleNUIEvents(object oPlayer, int nToken, string sType, string sElement, int nArrayIndex)
{
if (sType == NUI_EVENT_CLOSE)
{
DeleteLocalInt(oPlayer, EXAMINE_CURRENT_WINDOW_TYPE);
DeleteLocalObject(oPlayer, EXAMINE_CURRENT_OBJECT);
}
else if (sType == NUI_EVENT_WATCH)
{
if (sElement == NUI_WINDOW_GEOMETRY_BIND)
{
SetLocalJson(oPlayer, EXAMINE_WINDOW_GEOMETRY_JSON, NuiGetBind(oPlayer, nToken, NUI_WINDOW_GEOMETRY_BIND));
}
}
}
int Examine_HandleIdentifyItem(object oPlayer, object oItem)
{
int bIdentified = GetIdentified(oItem);
if (!bIdentified)
{
int nIdentifySkillRank = GetSkillRank(SKILL_LORE, oPlayer);
if (nIdentifySkillRank < 0)
return FALSE;
if (nIdentifySkillRank > 55)
{
SetIdentified(oItem, TRUE);
return TRUE;
}
int nMaxItemGPValue = StringToInt(Get2DAString("skillvsitemcost", "DeviceCostMax", nIdentifySkillRank));
SetIdentified(oItem, TRUE);
bIdentified = GetGoldPieceValue(oItem) <= nMaxItemGPValue;
SetIdentified(oItem, bIdentified);
}
return bIdentified;
}
void Examine_SetData(object oPlayer, int nToken, object oTarget, int nPanel)
{
Examine_SetGenericData(oPlayer, nToken, oTarget, nPanel);
if (nPanel == GUI_PANEL_EXAMINE_ITEM)
Examine_SetItemData(oPlayer, nToken, oTarget);
}
void Examine_SetGenericData(object oPlayer, int nToken, object oTarget, int nPanel)
{
string sTitle, sDescription;
json jImage1, jImage2, jImage3;
int bComplexItem = FALSE;
switch (nPanel)
{
case GUI_PANEL_EXAMINE_CREATURE:
case GUI_PANEL_EXAMINE_PLACEABLE:
case GUI_PANEL_EXAMINE_DOOR:
{
sTitle = GetName(oTarget);
jImage1 = JsonString(GetPortraitResRef(oTarget) + "m");
sDescription = GetDescription(oTarget);
break;
}
case GUI_PANEL_EXAMINE_ITEM:
{
int bIdentified = Examine_HandleIdentifyItem(oPlayer, oTarget);
int nBaseItemType = GetBaseItemType(oTarget);
sTitle = Util_GetItemName(oTarget, bIdentified);
json jItem = ObjectToJson(oTarget);
json jComplexIconData = Util_GetComplexIconData(jItem, nBaseItemType);
if (JsonGetType(jComplexIconData))
{
jImage1 = JsonObjectGet(jComplexIconData, "bottom");
jImage2 = JsonObjectGet(jComplexIconData, "middle");
jImage3 = JsonObjectGet(jComplexIconData, "top");
bComplexItem = TRUE;
}
else
{
jImage1 = JsonString(Util_GetIconResref(oTarget, jItem, nBaseItemType));
}
sDescription = GetDescription(oTarget, FALSE, bIdentified);
int nStatsStrRef = StringToInt(Get2DAString("baseitems", "BaseItemStatRef", nBaseItemType));
if (nStatsStrRef)
{
sDescription += "\n\n" + GetStringByStrRef(nStatsStrRef);
}
break;
}
}
NuiSetBind(oPlayer, nToken, NUI_WINDOW_TITLE_BIND, JsonString(sTitle));
NuiSetBind(oPlayer, nToken, "image_1", jImage1);
if (bComplexItem)
{
NuiSetBind(oPlayer, nToken, "image_2", jImage2);
NuiSetBind(oPlayer, nToken, "image_3", jImage3);
}
NuiSetBind(oPlayer, nToken, "complex_item", JsonBool(bComplexItem));
NuiSetBind(oPlayer, nToken, "description", JsonString(sDescription));
}
string Examine_GetItemPropertyString(itemproperty ip)
{
int nType = GetItemPropertyType(ip);
string sName = GetStringByStrRef(StringToInt(Get2DAString("itempropdef", "GameStrRef", nType)));
int nSubType = GetItemPropertySubType(ip);
if(nSubType != -1)
{
string sSubTypeResRef = Get2DAString("itempropdef", "SubTypeResRef", nType);
int nStrRef = StringToInt(Get2DAString(sSubTypeResRef, "Name", nSubType));
if(nStrRef)
sName += " " + GetStringByStrRef(nStrRef);
}
int nParam1 = GetItemPropertyParam1(ip);
if(nParam1 != -1)
{
string sParamResRef = Get2DAString("iprp_paramtable", "TableResRef", nParam1);
string sSubTypeResRef = Get2DAString("itempropdef", "SubTypeResRef", nType);
string sTableResRef = Get2DAString(sSubTypeResRef, "TableResRef", nParam1);
int nStrRef = StringToInt(Get2DAString(sParamResRef, "Name", GetItemPropertyParam1Value(ip)));
if(nStrRef)
sName += " " + GetStringByStrRef(nStrRef);
}
int nCostTable = GetItemPropertyCostTable(ip);
if(nCostTable != -1)
{
string sCostTableResRef = Get2DAString("iprp_costtable", "Name", nCostTable);
int nStrRef = StringToInt(Get2DAString(sCostTableResRef, "Name", GetItemPropertyCostTableValue(ip)));
if(nStrRef)
sName += " " + GetStringByStrRef(nStrRef);
}
return sName;
}
void Examine_SetItemData(object oPlayer, int nToken, object oItem)
{
int bIdentified = GetIdentified(oItem);
json jProperties = JsonArray();
json jColors = JsonArray();
if (bIdentified)
{
itemproperty ip = GetFirstItemProperty(oItem);
while (GetIsItemPropertyValid(ip))
{
jProperties = JsonArrayInsert(jProperties, JsonString(Examine_GetItemPropertyString(ip)));
jColors = JsonArrayInsert(jColors, GetItemPropertyDurationType(ip) == DURATION_TYPE_TEMPORARY ? NuiColor(0, 0, 255) : NuiColor(255, 255, 255));
ip = GetNextItemProperty(oItem);
}
}
NuiSetBind(oPlayer, nToken, "property", jProperties);
NuiSetBind(oPlayer, nToken, "color", jColors);
}