ff_u_v_daycycle

Activate the placeable at specific times (dawn, day, dusk, night).

Variables

DAWN: (int) 1 if placeable is to be active at dawn.

DAY: (int) 1 if placeable is to be active during the day.

DUSK: (int) 1 if placeable is to be active at dusk.

NIGHT: (int) 1 if placeable is to be active during the night.

Examples

Having a torch bracket light the torch during the night, and deactivating it during the day.

Source code

// @code

#include "ff_i_core"


const string ENABLE__FF_U_V_DAYCYCLE = "ENABLE__FF_U_V_DAYCYCLE";


// -----------------------------------------------------------------------------

//! @brief Activate or deactivate oObject based on DAWN/DAY/DUSK/NIGHT local variables and current time.
//! @param oObject A placeable.
void ActivateObject(object oObject);
void ActivateObject(object oObject)
{
  if (GetObjectType(oObject) != OBJECT_TYPE_PLACEABLE)
    return;

  int nDawn  = GetLocalInt(oObject, "DAWN");
  int nDay   = GetLocalInt(oObject, "DAY");
  int nDusk  = GetLocalInt(oObject, "DUSK");
  int nNight = GetLocalInt(oObject, "NIGHT");

  if (nDawn || nDay || nDusk || nNight)
    {}
  else
    return;

  int nActivate = FALSE;
  nActivate |= (GetIsDawn()  && nDawn);
  nActivate |= (GetIsDay()   && nDay);
  nActivate |= (GetIsDusk()  && nDusk);
  nActivate |= (GetIsNight() && nNight);

  if (nActivate)
    SetObjectState(oObject, PLACEABLE_STATE_ACTIVATED);
  else
    SetObjectState(oObject, PLACEABLE_STATE_DEACTIVATED);
}


// -----------------------------------------------------------------------------

//! @brief Call ActivateObject on every object in oArea (skipped when area is empty).
//! @param oArea An area.
void ActivateArea(object oArea);
void ActivateArea(object oArea)
{
  int nCount = NWNX_Area_GetNumberOfPlayersInArea(oArea);
  if (nCount == 0)
    return;

  object oObject = GetFirstObjectInArea(oArea);
  while (GetIsObjectValid(oObject))
  {
    ActivateObject(oObject);
    oObject = GetNextObjectInArea(oArea);
  }
}


// -----------------------------------------------------------------------------

void ActivateModule();
void ActivateModule()
{
  object oArea = GetFirstArea();
  while (GetIsObjectValid(oArea))
  {
    ActivateArea(oArea);
    oArea = GetNextArea();
  }
}


// -----------------------------------------------------------------------------

void main()
{
  object oModule = GetModule();
  if (!GetModuleFlag(ENABLE__FF_U_V_DAYCYCLE, TRUE))
    return;

  string sEvent = GetCurrentEvent();
  if (sEvent == ON_REGISTER)
  {
    SubscribeToEvent(ON_DEFAULT_AREA_ENTER, __FILE__);
    SubscribeToEvent(ON_CALENDAR_HOUR, __FILE__);
    SubscribeToEvent(ON_CALENDAR_TIME_CHANGED, __FILE__);
  }
  else if (sEvent == ON_DEFAULT_AREA_ENTER)
    ActivateArea(OBJECT_SELF);
  else if (sEvent == ON_CALENDAR_HOUR)
    ActivateModule();
  else if (sEvent == ON_CALENDAR_TIME_CHANGED) // This event is only sent manually.
    ActivateModule();
}