void main()
{
    object oGM = GetPCSpeaker();
    
    if (!GetIsObjectValid(oGM))
    {
        SendMessageToPC(oGM, "No valid speaker found.");
        return;
    }

    object oArea = GetArea(oGM);
    if (!GetIsObjectValid(oArea))
    {
        SendMessageToPC(oGM, "Could not determine player's 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 at the first valid hazard found
        }

        oTrap = GetNextObjectInArea(oArea);
    }

    if (!GetIsObjectValid(oValidTrap))
    {
        SendMessageToPC(oGM, "No hazard found in this area.");
        return;
    }

    // Get dialogue node selection
    int nNode = GetSelectedNodeID();
    string sDamage;

    switch (nNode)
    {
        case 0: sDamage = "10d6"; break;
        case 1: sDamage = "15d6"; break;
        case 2: sDamage = "20d6"; break;
        case 3: sDamage = "25d6"; break;
        case 4: sDamage = "30d6"; break;
        case 5: sDamage = "35d6"; break;
        case 6: sDamage = "40d6"; break;
        case 7: sDamage = "45d6"; break;
        case 8: sDamage = "50d6"; break;
        default:
            SendMessageToPC(oGM, "Invalid selection (Node ID: " + IntToString(nNode) + "). Please choose a valid option.");
            return;
    }

    // Apply the new damage value
    SetLocalString(oValidTrap, "sDamage", sDamage);

    // Fetch updated hazard settings
    int nDC = GetLocalInt(oValidTrap, "nDC");
    int nDamageType = GetLocalInt(oValidTrap, "nDamageType");
    float fFrequency = GetLocalFloat(oValidTrap, "fFrequency");

    // Convert damage type to a readable string
    string sDamageType;
    
    switch (nDamageType)
    {
        case DAMAGE_TYPE_ACID:        sDamageType = "Acid"; break;
        case DAMAGE_TYPE_COLD:        sDamageType = "Cold"; break;
        case DAMAGE_TYPE_DIVINE:      sDamageType = "Divine"; break;
        case DAMAGE_TYPE_ELECTRICAL:  sDamageType = "Electrical"; break;
        case DAMAGE_TYPE_FIRE:        sDamageType = "Fire"; break;
        case DAMAGE_TYPE_NEGATIVE:    sDamageType = "Negative"; break;
        case DAMAGE_TYPE_POSITIVE:    sDamageType = "Positive"; break;
        case DAMAGE_TYPE_SONIC:       sDamageType = "Sonic"; break;
        case DAMAGE_TYPE_MAGICAL:     sDamageType = "Magical"; break;
        case DAMAGE_TYPE_PIERCING:    sDamageType = "Piercing"; break;
        case DAMAGE_TYPE_BLUDGEONING: sDamageType = "Bludgeoning"; break;
        case DAMAGE_TYPE_SLASHING:    sDamageType = "Slashing"; break;
        default:                      sDamageType = "Unknown"; break;
    }

    // Send final message with updated hazard details
    string sReport = "=== Hazard Updated ===\n" +
                     "Dialogue Node Selected: " + IntToString(nNode) + "\n"
                     "New Damage Value: " + sDamage + "\n"
                     "======================\n"
                     "=== Current Hazard Settings ===\n"
                     "DC: " + IntToString(nDC) + "\n"
                     "Damage: " + sDamage + "\n"
                     "Damage Type: " + sDamageType + "\n"
                     "Rate: Every " + FloatToString(fFrequency) + " seconds.\n"
                     "==============================";

    SendMessageToPC(oGM, sReport);
}
