void StartHazard(object oTrap);
void StopHazard(object oTrap);

void StartHazard(object oTrap)
{
    SetLocalInt(oTrap, "bActive", TRUE);
    ExecuteScript("cas_plcvfxobject", oTrap); // Run the hazard script on the placeable
}

void StopHazard(object oTrap)
{
    SetLocalInt(oTrap, "bActive", FALSE);
}

void main()
{
    object oActivator = GetLastUsedBy(); // Default: Used by a switch
    if (!GetIsObjectValid(oActivator))
    {
        oActivator = GetPCSpeaker(); // If triggered by conversation, get the speaking PC
    }

    if (!GetIsObjectValid(oActivator))
    {
        return; // Safety check, should never happen
    }
    
    object oGM = GetPCSpeaker();
    object oArea = GetArea(oActivator);
    if (!GetIsObjectValid(oArea))
    {
        SendMessageToPC(oActivator, "Could not determine the area.");
        return;
    }

    object oTrap = GetFirstObjectInArea(oArea);
    object oValidTrap = OBJECT_INVALID;

    // Loop through all placeables in the area
    while (GetIsObjectValid(oTrap))
    {
        if (GetObjectType(oTrap) == OBJECT_TYPE_PLACEABLE && GetTag(oTrap) == "CAS_PLC_VFXTRAP")
        {
            oValidTrap = oTrap;
            break; // Stop once we find the first valid trap
        }

        oTrap = GetNextObjectInArea(oArea);
    }

    if (!GetIsObjectValid(oValidTrap))
    {
        SendMessageToPC(oActivator, "No hazard found in this area.");
        return;
    }

    // Toggle the hazard activation
    int bActive = GetLocalInt(oValidTrap, "bActive");

    if (bActive == FALSE) 
    {
        SendMessageToPC(oActivator, "You activate the hazard!");
        StartHazard(oValidTrap);
    }
    else 
    {
        SendMessageToPC(oActivator, "You deactivate the hazard.");
        StopHazard(oValidTrap);
    }

    // Fetch updated hazard settings
    int nDC = GetLocalInt(oValidTrap, "nDC");
    string sDamage = GetLocalString(oValidTrap, "sDamage");
    int nDamageType = GetLocalInt(oValidTrap, "nDamageType");
    float fFrequency = GetLocalFloat(oValidTrap, "fFrequency");
    float fWidth = GetLocalFloat(oValidTrap, "fWidth");    // X-Axis range
    float fLength = GetLocalFloat(oValidTrap, "fLength");  // Y-Axis range
    int nVFX = GetLocalInt(oValidTrap, "nVFX");            // VFX number

    // Convert damage type to a readable string
    string sType;
    switch (nDamageType)
    {
        case DAMAGE_TYPE_ACID:        sType = "Acid"; break;
        case DAMAGE_TYPE_COLD:        sType = "Cold"; break;
        case DAMAGE_TYPE_DIVINE:      sType = "Divine"; break;
        case DAMAGE_TYPE_ELECTRICAL:  sType = "Electrical"; break;
        case DAMAGE_TYPE_FIRE:        sType = "Fire"; break;
        case DAMAGE_TYPE_NEGATIVE:    sType = "Negative"; break;
        case DAMAGE_TYPE_POSITIVE:    sType = "Positive"; break;
        case DAMAGE_TYPE_SONIC:       sType = "Sonic"; break;
        case DAMAGE_TYPE_MAGICAL:     sType = "Magical"; break;
        case DAMAGE_TYPE_PIERCING:    sType = "Piercing"; break;
        case DAMAGE_TYPE_BLUDGEONING: sType = "Bludgeoning"; break;
        case DAMAGE_TYPE_SLASHING:    sType = "Slashing"; break;
        default:                      sType = "Unknown"; break;
    }

    // Send final message with updated hazard details
    SendMessageToPC(oGM, "=== Current Hazard Settings ===\n" +
                         "DC: " + IntToString(nDC) + "\n" +
                         "Damage: " + sDamage + "\n" +
                         "Damage Type: " + sType + "\n" +
                         "Rate: Every " + FloatToString(fFrequency) + " seconds.\n" +
                         "X-Axis Range (Width): " + FloatToString(fWidth) + "\n" +
                         "Y-Axis Range (Length): " + FloatToString(fLength) + "\n" +
                         "VFX ID: " + IntToString(nVFX));
}
