ff_u_naming
Set name of all object to the value of the localized name.
ENABLE__FF_U_NAMING is used to enable the copy of a localized name to all other localized names.
If object has a description, it will also be copied.
Variables
ENABLE__FF_U_NAMING: (string) (opt-in) Set to “Y” on module to enable unit.
PLAYER_LANGUAGE_NAME: (int) PLAYER_LANGUAGE_* for the object name.
PLAYER_LANGUAGE_DESCRIPTION: (int) PLAYER_LANGUAGE_* for the object description.
@todo: Verify all objects on module startup.
Source code
// @code
#include "ff_i_core"
const string ENABLE__FF_U_NAMING = "ENABLE__FF_U_NAMING";
const string PLAYER_LANGUAGE_NAME = "PLAYER_LANGUAGE_NAME";
const string PLAYER_LANGUAGE_DESCRIPTION = "PLAYER_LANGUAGE_DESCRIPTION";
// -----------------------------------------------------------------------------
//! @brief Return the PLAYER_LANGUAGE_* to use for naming, or FALSE if naming is not needed.
//! @param oObject An object.
int LanguageToUse(object oObject);
int LanguageToUse(object oObject)
{
if (!GetIsObjectValid(oObject))
return FALSE;
// No need to change name if not displayed
if (NWNX_Object_GetPlaceableIsStatic(oObject))
return FALSE;
if (!GetUseableFlag(oObject))
return FALSE;
// Use a translated language as primary language?
// PLAYER_LANGUAGE_ENGLISH is 0, so if unset, it's also 0
int nLanguage = GetLocalInt(GetModule(), PLAYER_LANGUAGE_NAME);
if (nLanguage == PLAYER_LANGUAGE_ENGLISH)
return FALSE;
return nLanguage;
}
// -----------------------------------------------------------------------------
//! @brief Copy the configured localised name/description to all other languages for oObject.
//! @param oObject An object.
void SetNameEx(object oObject);
void SetNameEx(object oObject)
{
int nLanguage = LanguageToUse(oObject);
if (nLanguage == FALSE)
return;
// SetName should take priority. If empty, only localized values are shown
string sValue = NWNX_Object_GetLocalizedName(oObject, nLanguage);
SetName(oObject, sValue);
int i;
for (i = PLAYER_LANGUAGE_ENGLISH; i <= PLAYER_LANGUAGE_POLISH; i++)
{
if (nLanguage != i)
NWNX_Object_SetLocalizedName(oObject, sValue, i);
}
// Areas, stores, triggers don't have descriptions
int nType = NWNX_Object_GetInternalObjectType(oObject);
switch (nType)
{
case NWNX_OBJECT_TYPE_INTERNAL_AREA:
case NWNX_OBJECT_TYPE_INTERNAL_STORE:
case NWNX_OBJECT_TYPE_INTERNAL_TRIGGER:
return;
}
// Same reasons than above
nLanguage = GetLocalInt(GetModule(), PLAYER_LANGUAGE_DESCRIPTION);
sValue = NWNX_Object_GetLocalizedDescription(oObject, nLanguage, 0, TRUE);
SetDescription(oObject, sValue, TRUE);
for (i = PLAYER_LANGUAGE_ENGLISH; i <= PLAYER_LANGUAGE_POLISH; i++)
{
if (nLanguage != i)
NWNX_Object_SetLocalizedDescription(oObject, sValue, nLanguage, 0, TRUE);
}
// Items have identified and non-identified descriptions.
if (nType != OBJECT_TYPE_ITEM)
return;
sValue = NWNX_Object_GetLocalizedDescription(oObject, nLanguage, 0, FALSE);
SetDescription(oObject, sValue, FALSE);
for (i = PLAYER_LANGUAGE_ENGLISH; i <= PLAYER_LANGUAGE_POLISH; i++)
{
if (nLanguage != i)
NWNX_Object_SetLocalizedDescription(oObject, sValue, nLanguage, 0, FALSE);
}
}
// -----------------------------------------------------------------------------
//! @brief Warn if oObject has no translation text for the configured language.
//! @param oObject An object.
void OnVerify(object oObject);
void OnVerify(object oObject)
{
// Use a translated language as primary language?
// PLAYER_LANGUAGE_ENGLISH is 0, so if unset, it's also 0
int nLanguage = LanguageToUse(oObject);
if (nLanguage == FALSE)
return;
string sValue = NWNX_Object_GetLocalizedName(oObject, nLanguage);
if (sValue == "")
{
LogWarning("Object " + GetObjectInfo(oObject) + " in " + GetObjectInfo(GetArea(oObject)) + " has no translation text");
return;
}
}
// -----------------------------------------------------------------------------
void main()
{
if (!GetModuleFlag(ENABLE__FF_U_NAMING, FALSE))
return;
string sEvent = GetCurrentEvent();
if (sEvent == ON_REGISTER)
{
SubscribeToEvent(ON_OBJECT_VERIFY, __FILE__);
SubscribeToEvent(ON_AREA_CREATED, __FILE__);
SubscribeToEvent(ON_OBJECT_CREATED, __FILE__);
}
else if (sEvent == ON_OBJECT_VERIFY)
OnVerify(OBJECT_SELF);
else if (sEvent == ON_OBJECT_CREATED)
SetNameEx(OBJECT_SELF);
else if (sEvent == ON_AREA_CREATED)
SetNameEx(OBJECT_SELF);
}