/* This code took me about an hour to create. This spell has been seen on
 * other MUDs, however, I'm not sure how they made it, or if they made it...
 * All I know is there is no snippet... So I'm making one. And this one
 * I hand coded. If you install this spell, then install my Immortal
 * spellup command, then you can give players the TRUE sight spell as an imm.
 * All I ask is that you put in the help file, and leave my comments. Trust me
 * They're in there to give a little help finding the spell too.
 */
First,
in help.are:
Add this helpfile to the bottom:
+
+0 'TRUE SIGHT'~
+Syntax: cast 'true sight'
+
+This powerful detection spell allows a user to see all things at once,
+rather than trying to have to cast four spells to see magic, invis, etc.
+By doing this however, since all spells are cast at once, the spell costs
+a little more mana than the other detection spells do. This allows
+the user to see: Magic, Good, Evil, Hidden, Invis, and even in Darkness.
+-----------------------------------------------------------------------
+This spell, while seen in other MUDs was hand coded by Koqlb for
+Subversive Visions, 2014.
+~
+
above:
0 ~



#$
---------------------------------------------------------------------------------
Then, in magic.c above:
void spell_detect_evil (int sn, int level, CHAR_DATA * ch, void *vo,
and below:
    spell_curse (gsn_curse, 3 * level / 4, ch, (void *) victim, TARGET_CHAR);
}
------------------------------------------------------------------------------------
+/* True sight added by Koqlb 
+ * Can detect everything including dark vision.
+ * Leave infrared alone to allow sneak, wizinvis, and incognito.
+ */
+void spell_true_sight (int sn, int level, CHAR_DATA * ch, void *vo,
+                         int target)
+{
+    CHAR_DATA *victim = (CHAR_DATA *) vo;
+    AFFECT_DATA af;
+
+    if (IS_AFFECTED (victim, AFF_TRUE_SIGHT))
+    {
+        if (victim == ch)
+            send_to_char ("Your eyes are already flared!\n\r", ch);
+        else
+            act ("$N can already see almost everything.", ch, NULL, victim,
+                 TO_CHAR);
+        return;
+    }
+/* Get rid of other detection affects
+ * if affected by them already (i.e.- detect invis, etc.)
+ * to avoid duplicate affects.
+ */
+
+    af.where = TO_AFFECTS;
+    af.type = sn;
+    af.level = level;
+    af.duration = level;
+    af.modifier = 0;
+    af.location = APPLY_NONE;
+    af.where = TO_AFFECTS;
+    af.type = sn;
+    af.level = level;
+    af.duration = level;
+    af.modifier = 0;
+    af.location = APPLY_NONE;
+    af.bitvector = AFF_DETECT_MAGIC;
+    affect_to_char (victim, &af);
+    af.bitvector = AFF_DETECT_INVIS;
+    affect_to_char (victim, &af);
+    af.bitvector = AFF_DETECT_HIDDEN;
+    affect_to_char (victim, &af);
+    af.bitvector = AFF_DETECT_GOOD;
+    affect_to_char (victim, &af);
+    af.bitvector = AFF_DETECT_EVIL;
+    affect_to_char (victim, &af);
+    af.bitvector = AFF_DARK_VISION; /* Dark vision because Infrared doesn't cut it */
+    affect_to_char (victim, &af);
+    send_to_char ("Your eyes flare! You can see almost everything!\n\r", victim);
+    if (ch != victim)
+        send_to_char ("Ok.\n\r", ch);
+    return;
+}
+
------------------------------------------------------------------------------------
Also in magic.c in void spell_detect_evil, replace:
    if (IS_AFFECTED (victim, AFF_DETECT_EVIL)) with
+    if (IS_AFFECTED (victim, AFF_DETECT_EVIL) || IS_AFFECTED (victim, AFF_TRUE_SIGHT))
In "void spell_detect_good, replace: 
    if (IS_AFFECTED (victim, AFF_DETECT_GOOD)) with
+    if (IS_AFFECTED (victim, AFF_DETECT_GOOD) || IS_AFFECTED (victim, AFF_TRUE_SIGHT))
In "void spell_detect_hidden" replace:
    if (IS_AFFECTED (victim, AFF_DETECT_HIDDEN)) with
+    if (IS_AFFECTED (victim, AFF_DETECT_HIDDEN) || IS_AFFECTED (victim, AFF_TRUE_SIGHT))
In "void spell_detect_invis", replace:
    if (IS_AFFECTED (victim, AFF_DETECT_INVIS)) with
+    if (IS_AFFECTED (victim, AFF_DETECT_INVIS) || IS_AFFECTED (victim, AFF_TRUE_SIGHT))
In "void spell_detect_magic", replace:
    if (IS_AFFECTED (victim, AFF_DETECT_MAGIC)) with
+    if (IS_AFFECTED (victim, AFF_DETECT_MAGIC) || IS_AFFECTED (victim, AFF_TRUE_SIGHT))
In "void spell_infravision", replace:
    if (IS_AFFECTED (victim, AFF_DARK_VISION)) with
+    if (IS_AFFECTED (victim, AFF_INFRARED) || IS_AFFECTED (victim, AFF_TRUE_SIGHT))

------------------------------------------------------------------------------------
In magic.h under 
DECLARE_SPELL_FUN(	spell_teleport		);
add
+DECLARE_SPELL_FUN(	spell_true_sight	);
------------------------------------------------------------------------------------
If you have an unlimited bit system (like QuickMUD and others),
then in bitsys.c under
	if (STR_IS_SET(vector, AFF_DARK_VISION)		)
		strcat( buf, " dark_vision"		);
add:
+	if (STR_IS_SET(vector, AFF_TRUE_SIGHT)		)
+		strcat( buf, " true_sight"		);

Otherwise, don't even worry about this part.
------------------------------------------------------------------------------------
In const.c:
    {
     "detect evil", {11, 4, 12, 53}, {1, 1, 2, 2},
     spell_detect_evil, TAR_CHAR_SELF, POS_STANDING,
     NULL, SLOT (18), 5, 12,
     "", "The red in your vision disappears.", ""},

+/* True sight all detects made by Koqlb */
+    {
+     "true sight", {20, 20, 20, 20}, {1, 1, 2, 2},
+     spell_true_sight, TAR_CHAR_SELF, POS_STANDING,
+     NULL, SLOT (37), 5, 18,
+     "", "You no longer see all things.", ""},
+
-----------------------------------------------------------------------------------
Also in const.c, in the detections, add "true sight" to the list of detect spells:
replace:
    {
     "detection", {4, 3, 6, -1},
     {"detect evil", "detect good", "detect hidden", "detect invis",
      "detect magic", "detect poison", "farsight", "identify",
      "know alignment", "locate object"}
     },

with
    {
     "detection", {4, 3, 6, -1},
     {"detect evil", "detect good", "detect hidden", "detect invis",
      "detect magic", "detect poison", "farsight", "identify",
      "know alignment", "locate object", "true sight"}
     },

 (or just add the true sight at the end of them)
----------------------------------------------------------------------------------
In handler.c search for char *affect_bit_name (int vector). Under:
    if ( vector == AFF_INVISIBLE     )
        strcat( buf, " invisible"     );
add:
+    if ( vector == AFF_TRUE_SIGHT    )
+         strcat( buf, "true sight"    );
---------------------------------------------------------------------------------
In tables.c:
const struct flag_type affect_flags[] = {
    {"blind", AFF_BLIND, TRUE},
    {"invisible", AFF_INVISIBLE, TRUE},
    {"detect_evil", AFF_DETECT_EVIL, TRUE},
    {"detect_invis", AFF_DETECT_INVIS, TRUE},
    {"detect_magic", AFF_DETECT_MAGIC, TRUE},
    {"detect_hidden", AFF_DETECT_HIDDEN, TRUE},
    {"detect_good", AFF_DETECT_GOOD, TRUE},
+    {"true_sight", AFF_TRUE_SIGHT, TRUE}, /* Koqlb */
    {"sanctuary", AFF_SANCTUARY, TRUE},
-------------------------------------------------------------------------------
In merc.h
under:
#define AFF_SLOW       (dd) /*-- (may vary depending on your MUD)*/
add:
#define AFF_TRUE_SIGHT (ff) 
/* As stated above, my MUD has different tables due to the unlimited bits.
 * I have numbers instead of alphanumeric characters. My define here is (31)
 * not (ff), but yours may be different.
 */
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
LAST BUT NOT LEAST THE MOST CRUCIAL:
Look for MAX_SKILL. Increase that number by 1. do a clean make (remove all .o files,
then 'make', copyover or boot up. This should compile and work. I've tested it on my MUD as I couldn't find a frickin' snippet of this anywhere. Then, when I tested it with AFF_INFRARED
instead of AFF_DARK_VISION, and went to the dump, I still couldn't see... so I ganked
it and made it work right.
If you have any problems, feel free to post a message on mudbytes.net. Any feedback
is greatly appreciated.