/*/////////////////////// [Include - Debugging] ////////////////////////////////
    Filename: J_Inc_Debug
///////////////////////// [Include - Debugging] ////////////////////////////////
    This contains DebugActionSpeak, the debug function.

    Makes it easier to uncomment debug lines.
///////////////////////// [History] ////////////////////////////////////////////
    1.3 - Added
        - In beta, changed it so this file controls all debug strings. Just
          uncomment them and recompile to turn it on/off.
    1.4 - TO DO: Added some more debug strings I use
///////////////////////// [Workings] ///////////////////////////////////////////
    DebugActionSpeak normally writes a timestamped log entry, and speak a silent
    string Server Admins can hear.

    1.3 added:
    - DebugActionSpeakByInt(int iInteger);
        - Removes many strings into this file
        - Can easily comment out all string so they are not added to compiled
          scripts if debugging unused (This saves space on compiled files :-D )
        - Always uncomment the right bits if not using any debugging.
///////////////////////// [Arguments] //////////////////////////////////////////
    Arguments: N/A
///////////////////////// [Include - Debugging] //////////////////////////////*/

// This will speak a cirtain integer number string (similar to a dialog reference).
// - I (Jass) have just moved all strings I used all the time into here, so
//   if the strings are uncommented, they will not be compiled
// - The numbers have no reference to much really.
// - Calls DebugActionSpeak!
// - See J_INC_DEBUG to uncomment/recomment in
void DebugActionSpeakByInt(int iInteger, object oInput = OBJECT_INVALID, int nInput = FALSE, string sInput = "");

// Speaks and stamps a debug string.
// - See J_INC_DEBUG to uncomment/recomment the debug strings.
// - Only used in special circumstances.
void DebugActionSpeak(string sString);

// This will speak a cirtain integer number string (similar to a dialog reference).
// - I (Jass) have just moved all strings I used all the time into here, so
//   if the strings are uncommented, they will not be compiled
// - The numbers have no reference to much really.
// - Calls DebugActionSpeak!
// - See J_INC_DEBUG to uncomment/recomment in
void DebugActionSpeakByInt(int iInteger, object oInput = OBJECT_INVALID, int nInput = FALSE, string sInput = "")
{
    // TO UNCOMMENT/COMMENT:
    // - Add/Remove in "//" before the next lines "/*"
    // - Recompile all files

    ///*

    string sDebug;
    switch(iInteger)
    {
        // - Generic AI stuff
        case 1: sDebug =  "[DCR:Melee] Most Damaging Weapon. Target: " + GetName(oInput); break;
        case 2: sDebug =  "[DCR:Melee] Most Damaging as Not Effective"; break;
        case 3: sDebug =  "[DCR:Melee] Melee Code. No valid melee target/Dead. Exiting"; break;
        case 4: sDebug =  "[DCR:Melee] Melee attack. [Target] " + GetName(oInput) + " [Feat/Attack] " + IntToString(nInput); break;
        case 5: sDebug =  "[DCR:Caster] Defensive Casting Mode ON [Enemy] " + GetName(oInput); break;
        case 6: sDebug =  "[DCR:Caster] Moving away from AOO's. [Enemy] " + GetName(oInput); break;
        case 7: sDebug =  "[DCR:Casting] Talent(item) [TalentID] " + IntToString(nInput) + " [Target] " + GetName(oInput) + " [Location] " + sInput; break;
        case 8: sDebug =  "[DCR:Casting] Workaround for Spontaeous [SpellID] " + IntToString(nInput) + " [Target] " + GetName(oInput); break;
        case 9: sDebug =  "[DCR:Casting] NormalSpell [ID] " + IntToString(nInput) + " [Target] " + GetName(oInput) + " [Location] " + sInput; break;
        case 10: sDebug = "[DCR:Casting] TalentSpell. [ID] " + IntToString(nInput) + " [Target] " + GetName(oInput) + " [Location] " + sInput; break;
        case 11: sDebug = "[DCR:Casting] SubSpecialSpell. [ID] " + IntToString(nInput) + " [Target] " + GetName(oInput) + " [Location] " + sInput; break;
        case 12: sDebug = "[DCR:Casting] NormalRandomSpell. [ID] " + IntToString(nInput) + " [Target] " + GetName(oInput) + " [Location] " + sInput; break;
        case 13: sDebug = "[DCR:Casting] Backup spell caught: " + IntToString(nInput); break;
        case 14: sDebug = "[DCR:Feat] [ID] " + IntToString(nInput) + " [Enemy] " + GetName(oInput); break;
        case 15: sDebug = "[DCR:Casting] Grenade [ID] " + IntToString(nInput) + " [Target] " + GetName(oInput) + " [Location] " + sInput; break;
        case 16: sDebug = "[AOE Call] Moving out of/Dispeling an AOE. [Tag] " + GetTag(oInput); break;
        case 17: sDebug = "[DCR:Special] Darkness + Caster. No seen enemy. Dispel/Move."; break;
        case 18: sDebug = "[DRC:Talent] Using Talent (Healing). [TalentID] " + IntToString(nInput) + " [Target] " + GetName(oInput); break;
        case 19: sDebug = "[DCR:Healing] (Should) Healing [Target]" + GetName(oInput) + " [CurrentHP|Max|ID|Rank|Power] " + IntToString(nInput); break;
        case 20: sDebug = "[DCR Healing] Boss Action, create Critical Wounds potion"; break;
        case 21: sDebug = "[DCR:Casting] Healing self with healing kit, [Kit] " + GetName(oInput); break;
        case 22: sDebug = "[DCR:Feat] Summoning my familiar"; break;
        case 23: sDebug = "[DCR:Feat] Summoning my animal companion"; break;
        case 24: sDebug = "[DCR:Fleeing] Stupid/Panic/Flee moving from enemies/position - We are a commoner/no morale/failed < 3 int"; break;
        case 25: sDebug = "[DCR:Fleeing] Fleeing to allies. [ID Array] " + sInput + " [Ally] " + GetName(oInput); break;
        case 26: sDebug = "[DCR:GFTK] Attacking a PC who is dying/asleep! [Enemy]" + GetName(oInput); break;
        case 27: sDebug = "[DCR:Moving] Archer Retreating back from the enemy [Enemy]" + GetName(oInput); break;
        case 28: sDebug = "[DCR:Turning] Using Turn Undead"; break;
        case 29: sDebug = "[DCR:Bard Song] Using"; break;
        case 30: sDebug = "[DCR:Bard Curse Song] Using"; break;
        case 31: sDebug = "[DCR:All Spells] Error! No casting (No spells, items, target Etc)."; break;
        case 32: sDebug = "[DCR:All Spells] [Modifier|BaseDC|SRA] " + IntToString(nInput); break;
        case 33: sDebug = "[DCR:Casting] Cheat Spell. End of Spells. [Spell] " + IntToString(nInput) + "[Target]" + GetName(oInput); break;
        case 34: sDebug = "[DCR:All Spells] Ranged Spells. Should use closer spells/move nearer"; break;
        case 35: sDebug = "[DCR:Dragon] Breath weapon & attacking [Breath ID] " + IntToString(nInput) + " [Target] " + GetName(oInput); break;
        case 36: sDebug = "[DCR:Dragon] Wing Buffet [Target] " + GetName(oInput); break;
        case 37: sDebug = "[DCR:Beholder] Teleport"; break;
        case 38: sDebug = "[DCR:Beholder] Rays"; break;
        case 39: sDebug = "[DCR:Targeting] No valid enemies in sight, moving to allies target's. [Target] " + GetName(oInput); break;
        case 40: sDebug = "[DCR:Targeting] Override Target Seen. [Name]" + GetName(oInput); break;
        case 41: sDebug = "[DCR:Targeting] No seen in LOS, Attempting to MOVE to something [Target]" + GetName(oInput); break;
        case 42: sDebug = "[DCR:Skill] Using agressive skill (+Attack). [Skill] " + IntToString(nInput) + " [Enemy]" + GetName(oInput); break;
        case 43: sDebug = "[DCR:Pre-Melee Spells] All Potions Using. [Spell ID] " + IntToString(nInput); break;
        case 44: sDebug = "[DCR:Pre-Melee Spells] True Strike Emptive attack [Target] " + GetName(oInput); break;
        case 45: sDebug = "[DCR:CounterSpell] Counterspelling. [Target] " + GetName(oInput); break;
        case 46: sDebug = "[DRC] START [Intruder]" + GetName(oInput); break;
        case 47: sDebug = "[DCR] [PREMITURE EXIT] Cannot Do Anything."; break;
        case 48: sDebug = "[DCR] [PREMITURE EXIT] Dazed move away."; break;
        case 49: sDebug = "[DCR] [PREMITURE EXIT] Fleeing or otherwise"; break;
        case 50: sDebug = "[DRC] END - DELETE PAST TARGETS"; break;
        // Perception
        case 51: sDebug = "[Perception] Our Enemy Target changed areas. Stopping, moving too...and attack... [Percieved] " + GetName(oInput); break;
        case 52: sDebug = "[Perception] Enemy Vanished (Same area) Retargeting/Searching [Percieved] " + GetName(oInput); break;
        case 53: sDebug = "[Perception] Enemy seen, and was old enemy/cannot see current. Re-evaluating (no spell) [Percieved] " + GetName(oInput); break;
        case 54: sDebug = "[Perception] Enemy Seen. Not in combat, attacking. [Percieved] " + GetName(oInput); break;
        case 55: sDebug = "[Perception] Percieved Dead Friend! Moving and Searching [Percieved] " + GetName(oInput); break;
        case 56: sDebug = "[Perception] Percieved Alive Fighting Friend! Moving to and attacking. [Percieved] " + GetName(oInput); break;
        // Conversation
        case 57: sDebug = "[Shout] Friend (may be PC) in combat. Attacking! [Friend] " + GetName(oInput); break;
        case 58: sDebug = "[Shout] Responding to shout [Enemy] " + GetName(oInput) + " Who has spoken!"; break;
        // Phisical Attacked
        case 59: sDebug = "[Phisically Attacked] Attacking back. [Attacker(enemy)] " + GetName(oInput); break;
        case 60: sDebug = "[Phisically Attacked] Not same area. [Attacker(enemy)] " + GetName(oInput); break;
        // Damaged
        case 61: sDebug = "[Damaged] Morale Penalty for 600 seconds [Penalty]" + IntToString(nInput); break;
        case 62: sDebug = "[Damaged] Not in combat: DCR [Damager]" + GetName(oInput); break;
        case 63: sDebug = "[Damaged] Not in combat: DCR. Ally hit us. [Damager(Ally?)]" + GetName(oInput); break;
        // Death
        case 64: sDebug = "[Death] Checking corpse status in " + IntToString(nInput) + " [Killer] " + GetName(oInput) + " [Times Died Now] " + sInput; break;
        // Disturbed
        case 65: sDebug = "[Disturbed] (pickpocket) Attacking Enemy [Disturber] " + GetName(oInput) + " [Type] " + IntToString(nInput); break;
        // Rest
        case 66: sDebug = "[Rested] Resting. [Type(should be invalid)] " + IntToString(nInput); break;
        // Spell Cast at
        case 67: sDebug = "[Spell] Caster isn't a creature! May look for target [Caster] " + GetName(oInput); break;
        case 68: sDebug = "[Spell:Enemy/Hostile] Not in combat. Attacking: [Caster] " + GetName(oInput); break;
        case 69: sDebug = "[Spell] (ally). Not in combat. May Attack/Move [Caster] " + GetName(oInput); break;
        // Spell Other AI
        // - Shouts
        case 70: sDebug = "[Shout] Reacting To Shout. [ShoutNo.] " + IntToString(nInput) + " [Shouter] " + GetName(oInput); break;
        // Constants
        // - Search
        case 71: sDebug = "[Search] Resting"; break;
        case 72: sDebug = "[Search] Searching, No one to attack. [Rounds Remaining] " + IntToString(nInput) + ". [Possible target] " + GetName(oInput); break;
        // - DCR
        case 73: sDebug = "[Call for DCR] Default AI [Pre-Set Target]" + GetName(oInput); break;
        case 74: sDebug = "[Call for DCR] Custom AI [" + sInput + "] [Pre-Set Target]" + GetName(oInput); break;
        // Destroy self
        case 75: sDebug = "[Dead] Setting to selectable/destroyable (so we go) for Bioware corpses."; break;
        case 76: sDebug = "[Dead] Destroying self finally."; break;
        // Waypoints
        case 77: sDebug = "[Waypoints] Returning to spawn location. [Area] " + GetName(oInput); break;

        default: return; break;
    }
    if(sDebug != "")
    {
        DebugActionSpeak(sDebug);
    }
    // */
}

void DebugActionSpeak(string sString)
{
// You MUST uncomment this line, IF you use either of the below things
    string sNew = "[Debug]" + GetName(OBJECT_SELF) + "[ObjectID]" + ObjectToString(OBJECT_SELF) + " [Debug] " + sString;

// Note, uncomment this, so that DM's can hear the debug speaks, normally it is
// only server admins who can hear the debug. If you are not testing, it might
// be best to keep this uncommented.
// Futher: - Must have debug mode set to 1
//         - Only the server admin can seem to see this.
//    SpeakString(sNew, TALKVOLUME_TALK);

// Note, uncomment this line to send a message to the first PC in the module.
// - Useful for singleplayer testing
    //SendMessageToPC(GetFirstPC(), sNew);

// This writes the entry to the log, very important, if debugging
// Futher: - If left up for a long time, logs can get very big with the AI
//         - Use to find problems in the AI and report to me :-D (Jasperre)
    WriteTimestampedLogEntry(sNew);
}

// Debug: To compile this script full, uncomment all of the below.
/* - Add two "/"'s at the start of this line
void main()
{
    return;
}
//*/