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);
}