diff --git a/src/main/java/com/comandante/creeper/CreeperUtils.java b/src/main/java/com/comandante/creeper/CreeperUtils.java
index a839e591f86f99d162a1909f0fc9e326750372cc..536fdfd287312fb7bdf7726c44c89e05e5b95e64 100644
--- a/src/main/java/com/comandante/creeper/CreeperUtils.java
+++ b/src/main/java/com/comandante/creeper/CreeperUtils.java
@@ -3,12 +3,14 @@ package com.comandante.creeper;
 import com.google.common.collect.Lists;
 
 import java.util.List;
+import java.util.Random;
 import java.util.stream.Collectors;
 
 public class CreeperUtils {
 
     public static String asciiColorPattern = "\u001B\\[[;\\d]*m";
 
+    private static Random random = new Random();
 
     /*  Prints things "next" to each other, like this:
 -+=[ fibs ]=+-                        | -+=[ fibs ]=+-
@@ -132,4 +134,8 @@ Bag             25        (+15)       | Bag             25        (+15)
         }
         return str.substring(0, len);
     }
+
+    public static int randInt(int min, int max) {
+        return random.nextInt((max - min) + 1) + min;
+    }
 }
diff --git a/src/main/java/com/comandante/creeper/command/CastCommand.java b/src/main/java/com/comandante/creeper/command/CastCommand.java
index ae7e281d4090f26e90bf111002dc3edb6841456a..43ac86f463bc34e023756501913d921486371ae7 100644
--- a/src/main/java/com/comandante/creeper/command/CastCommand.java
+++ b/src/main/java/com/comandante/creeper/command/CastCommand.java
@@ -5,8 +5,10 @@ import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.npc.Npc;
 import com.comandante.creeper.player.CoolDownType;
 import com.comandante.creeper.player.Player;
+import com.comandante.creeper.spells.ExecuteSpellRunnable;
 import com.comandante.creeper.spells.Spell;
 import com.comandante.creeper.spells.SpellTriggerRegistry;
+import com.comandante.creeper.spells.Spells;
 import com.google.common.base.Joiner;
 import com.google.common.collect.Sets;
 import org.jboss.netty.channel.ChannelHandlerContext;
@@ -14,6 +16,7 @@ import org.jboss.netty.channel.MessageEvent;
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 
 public class CastCommand extends Command {
 
@@ -41,42 +44,37 @@ public class CastCommand extends Command {
                 return;
             }
             String desiredSpellName = originalMessageParts.get(1);
-            Spell spell = SpellTriggerRegistry.getSpell(desiredSpellName);
-            if (spell == null || !player.doesHaveSpellLearned(spell.getSpellName())) {
+            Optional<ExecuteSpellRunnable> spellRunnable = gameManager.getSpells().getSpellRunnable(desiredSpellName);
+            if (!spellRunnable.isPresent() || !player.doesHaveSpellLearned(spellRunnable.get().getName())) {
                 write("No spell found with the name: " + desiredSpellName + "\r\n");
                 return;
             }
-            if (player.isActiveSpellCoolDown(spell.getSpellName())) {
+            if (player.isActiveSpellCoolDown(spellRunnable.get().getName())) {
                 write("That spell is still in cooldown.\r\n");
                 write(gameManager.renderCoolDownString(player.getCoolDowns()));
                 return;
             }
             if (originalMessageParts.size() == 2) {
-                if (spell.isAreaSpell()) {
-                    spell.attackSpell(currentRoom.getNpcIds(), player);
-                    return;
-                } else {
-                    write("Spell is not an area of attack. Need to specify a target.\r\n");
-                    return;
-                }
+                gameManager.getSpells().executeSpell(player, Optional.empty(), Optional.empty(), spellRunnable.get());
+                return;
             }
             originalMessageParts.remove(0);
             originalMessageParts.remove(0);
             String target = Joiner.on(" ").join(originalMessageParts);
             if (player.getPlayerName().equals(target)) {
-                spell.attackSpell(this.player, this.player);
+                gameManager.getSpells().executeSpell(player, Optional.empty(), Optional.ofNullable(player), spellRunnable.get());
                 return;
             }
             for (Player destinationPlayer : roomManager.getPresentPlayers(currentRoom)) {
                 if (destinationPlayer.getPlayerName().equalsIgnoreCase(target)) {
-                    spell.attackSpell(destinationPlayer, this.player);
+                    gameManager.getSpells().executeSpell(player, Optional.empty(), Optional.of(destinationPlayer), spellRunnable.get());
                     return;
                 }
             }
             for (String npcId : currentRoom.getNpcIds()) {
                 Npc npcEntity = entityManager.getNpcEntity(npcId);
                 if (npcEntity.getValidTriggers().contains(target)) {
-                    spell.attackSpell(Sets.newHashSet(npcId), player);
+                    gameManager.getSpells().executeSpell(player, Optional.of(npcEntity), Optional.empty(), spellRunnable.get());
                     return;
                 }
             }
diff --git a/src/main/java/com/comandante/creeper/managers/GameManager.java b/src/main/java/com/comandante/creeper/managers/GameManager.java
index 13e1e41a6d4a2baf158392d8a9b0d02c809f9260..4dafb97e2c2abe850b4898b759c5a4e39532a457 100644
--- a/src/main/java/com/comandante/creeper/managers/GameManager.java
+++ b/src/main/java/com/comandante/creeper/managers/GameManager.java
@@ -21,6 +21,7 @@ import com.comandante.creeper.server.MultiLineInputManager;
 import com.comandante.creeper.spawner.NpcSpawner;
 import com.comandante.creeper.spells.Effect;
 import com.comandante.creeper.spells.EffectsManager;
+import com.comandante.creeper.spells.Spells;
 import com.comandante.creeper.stat.Stats;
 import com.comandante.creeper.stat.StatsBuilder;
 import com.comandante.creeper.world.*;
@@ -68,6 +69,7 @@ public class GameManager {
     private final TimeTracker timeTracker;
     private final ItemUseHandler itemUseHandler;
     private final NpcMover npcMover;
+    private final Spells spells;
     private final SingleThreadedCreeperEventProcessor eventProcessor = new SingleThreadedCreeperEventProcessor(new ArrayBlockingQueue<>(100000));
 
     public GameManager(CreeperConfiguration creeperConfiguration, RoomManager roomManager, PlayerManager playerManager, EntityManager entityManager, MapsManager mapsManager, ChannelCommunicationUtils channelUtils) {
@@ -94,9 +96,14 @@ public class GameManager {
         this.entityManager.addEntity(itemDecayManager);
         this.itemUseHandler = new ItemUseHandler(this);
         this.npcMover = new NpcMover(this);
+        this.spells = new Spells(this);
         this.eventProcessor.startAsync();
     }
 
+    public Spells getSpells() {
+        return spells;
+    }
+
     public NpcMover getNpcMover() {
         return npcMover;
     }
@@ -460,6 +467,13 @@ public class GameManager {
             sb.append("(").append(Color.GREEN).append("+").append(getFormattedNumber(diff.getStrength())).append(Color.RESET).append(")");
         t.addCell(sb.toString());
 
+        sb = new StringBuilder();
+        t.addCell("Intelligence");
+        t.addCell(getFormattedNumber(stats.getIntelligence()));
+        if (diff.getStrength() > 0)
+            sb.append("(").append(Color.GREEN).append("+").append(getFormattedNumber(diff.getIntelligence())).append(Color.RESET).append(")");
+        t.addCell(sb.toString());
+
         sb = new StringBuilder();
         t.addCell("Willpower");
         t.addCell(getFormattedNumber(stats.getWillpower()));
diff --git a/src/main/java/com/comandante/creeper/player/BasicPlayerLevelStatsModifier.java b/src/main/java/com/comandante/creeper/player/BasicPlayerLevelStatsModifier.java
index bd62876923a7155295f50eadf884d68f3a6c5298..b84ef6b2fd3b493636384501230bff8965c75eb6 100644
--- a/src/main/java/com/comandante/creeper/player/BasicPlayerLevelStatsModifier.java
+++ b/src/main/java/com/comandante/creeper/player/BasicPlayerLevelStatsModifier.java
@@ -17,6 +17,7 @@ public class BasicPlayerLevelStatsModifier implements StatsModifier {
 
     private static double MELE_CONSTANT_MODIFIER = 1.01;
     private static double WILLPOWER_CONSTANT_MODIFIER = 1.01;
+    private static double INTELLIGENCE_CONSTANT_MODIFIER = 1.01;
     private static double AGILE_CONSTANT_MODIFIER = 1.01;
     private static double AIM_CONSTANT_MODIFIER = 1.01;
     private static double HEALTH_CONSTANT_MODIFIER = 4;
@@ -34,6 +35,11 @@ public class BasicPlayerLevelStatsModifier implements StatsModifier {
         return (long) Math.floor(v) + baseStat;
     }
 
+    public static long getIntelligenceForLevel(long baseStat, long level) {
+        double v = (level) * sqrt(pow(level, INTELLIGENCE_CONSTANT_MODIFIER));
+        return (long) Math.floor(v) + baseStat;
+    }
+
     public static long getAgileForLevel(long baseStat, long level) {
         double v = (level) * sqrt(pow(level, AGILE_CONSTANT_MODIFIER));
         return (long) Math.floor(v) + baseStat;
@@ -75,12 +81,14 @@ public class BasicPlayerLevelStatsModifier implements StatsModifier {
         long newMaxMana = getManaForLevel(baseStats.getMaxMana(), level);
         long newAimRating = getAimForLevel(baseStats.getAim(), level);
         long newWillpowerRating = getWillpowerForLevel(baseStats.getWillpower(), level);
+        long newIntelligenceRating = getIntelligenceForLevel(baseStats.getIntelligence(), level);
         long newAgileRating = getAgileForLevel(baseStats.getAgile(), level);
         long newMeleRating = getMeleForLevel(baseStats.getMeleSkill(), level);
         StatsBuilder statsBuilder = new StatsBuilder(baseStats);
         statsBuilder.setMaxHealth(newMaxHealth);
         statsBuilder.setArmorRating(newArmorRating);
         statsBuilder.setStrength(newStrengthRating);
+        statsBuilder.setIntelligence(newIntelligenceRating);
         statsBuilder.setMaxMana(newMaxMana);
         statsBuilder.setAim(newAimRating);
         statsBuilder.setWillpower(newWillpowerRating);
diff --git a/src/main/java/com/comandante/creeper/player/Player.java b/src/main/java/com/comandante/creeper/player/Player.java
index 5c6e600be411b383154d25ddb919113b684a321d..a45eb9310e3dcab7d773a6e4bf477bbac4ea3e6a 100644
--- a/src/main/java/com/comandante/creeper/player/Player.java
+++ b/src/main/java/com/comandante/creeper/player/Player.java
@@ -216,6 +216,15 @@ public class Player extends CreeperEntity {
         }
     }
 
+    public void writeMessage(String msg) {
+        gameManager.getChannelUtils().write(getPlayerId(), msg);
+    }
+
+    public long getAvailableMana(){
+        return getPlayerStatsWithEquipmentAndLevel().getCurrentMana();
+    }
+
+
     private void addHealth(long addAmt, PlayerMetadata playerMetadata) {
         long currentHealth = playerMetadata.getStats().getCurrentHealth();
         Stats statsModifier = getPlayerStatsWithEquipmentAndLevel();
@@ -268,6 +277,10 @@ public class Player extends CreeperEntity {
         }
     }
 
+    public long getLevel() {
+        return Levels.getLevel(getPlayerMetadata().getStats().getExperience());
+    }
+
     private PlayerMetadata getPlayerMetadata() {
         return gameManager.getPlayerManager().getPlayerMetadata(playerId);
     }
diff --git a/src/main/java/com/comandante/creeper/player/PlayerStats.java b/src/main/java/com/comandante/creeper/player/PlayerStats.java
index 7f2ea2fe9d6a07c324fb32509075dda7b5bae7c5..aa284f6afa9fe69ebe36b1f4f640feecff7d9f50 100644
--- a/src/main/java/com/comandante/creeper/player/PlayerStats.java
+++ b/src/main/java/com/comandante/creeper/player/PlayerStats.java
@@ -7,6 +7,7 @@ public class PlayerStats {
 
     public final static StatsBuilder DEFAULT_PLAYER = new StatsBuilder()
             .setStrength(10)
+            .setIntelligence(5)
             .setWillpower(1)
             .setAim(1)
             .setAgile(1)
diff --git a/src/main/java/com/comandante/creeper/spells/ExecuteSpellRunnable.java b/src/main/java/com/comandante/creeper/spells/ExecuteSpellRunnable.java
new file mode 100644
index 0000000000000000000000000000000000000000..7b67fb3e15705d454f0e97f024916522ca391609
--- /dev/null
+++ b/src/main/java/com/comandante/creeper/spells/ExecuteSpellRunnable.java
@@ -0,0 +1,13 @@
+package com.comandante.creeper.spells;
+
+
+import com.comandante.creeper.managers.GameManager;
+import com.comandante.creeper.npc.Npc;
+import com.comandante.creeper.player.Player;
+
+import java.util.Optional;
+
+public interface ExecuteSpellRunnable {
+    void run(Player sourcePlayer, Optional<Npc> destinationNpc, Optional<Player> destinationPlayer, GameManager gameManager);
+    String getName();
+}
diff --git a/src/main/java/com/comandante/creeper/spells/LightningSpellRunnable.java b/src/main/java/com/comandante/creeper/spells/LightningSpellRunnable.java
new file mode 100644
index 0000000000000000000000000000000000000000..566e1252e83f59319b104f286042626f91a695da
--- /dev/null
+++ b/src/main/java/com/comandante/creeper/spells/LightningSpellRunnable.java
@@ -0,0 +1,61 @@
+package com.comandante.creeper.spells;
+
+import com.comandante.creeper.CreeperUtils;
+import com.comandante.creeper.managers.GameManager;
+import com.comandante.creeper.npc.Npc;
+import com.comandante.creeper.player.CoolDown;
+import com.comandante.creeper.player.CoolDownType;
+import com.comandante.creeper.player.Player;
+import com.comandante.creeper.server.Color;
+import com.comandante.creeper.stat.Stats;
+import com.comandante.creeper.stat.StatsBuilder;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Optional;
+import java.util.Set;
+
+import static com.comandante.creeper.server.Color.BOLD_ON;
+import static com.comandante.creeper.spells.Spells.getSpellAttack;
+
+public class LightningSpellRunnable implements ExecuteSpellRunnable {
+
+    private final GameManager gameManager;
+    private final int manaCost = 60;
+    public final static String name = BOLD_ON + Color.YELLOW + "lightning" + Color.RESET + " bolt";
+    private final static String description = "A powerful bolt of lightning.";
+
+    public LightningSpellRunnable(GameManager gameManager) {
+        this.gameManager = gameManager;
+    }
+
+    @Override
+    public void run(Player sourcePlayer, Optional<Npc> destinationNpc, Optional<Player> destinationPlayer, GameManager gameManager) {
+        long availableMana = sourcePlayer.getPlayerStatsWithEquipmentAndLevel().getCurrentMana();
+        if (availableMana < manaCost) {
+            sourcePlayer.writeMessage("Not enough mana!" + "\r\n");
+            return;
+        }
+        if (destinationNpc.isPresent()) {
+            executeSpellAgainstNpc(sourcePlayer, destinationNpc.get());
+        }
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    private void executeSpellAgainstNpc(Player player, Npc npc) {
+        long intelligence = player.getPlayerStatsWithEquipmentAndLevel().getIntelligence();
+        long power = (player.getLevel() * 1) + (3 * intelligence);
+        player.addActiveFight(npc);
+        npc.doHealthDamage(player, Arrays.asList("LightingBoltAttack!! damage amount: " + power), -power);
+    }
+
+    private void executeSpellAgainstPlayer(Player player, Player destinationPlayer) {
+
+    }
+}
diff --git a/src/main/java/com/comandante/creeper/spells/Spell.java b/src/main/java/com/comandante/creeper/spells/Spell.java
index f702e299525961f3dacdadf8a4a2247c8eeddd60..e6b3636ed374f778d56ef9a75b04b661864f9f4d 100644
--- a/src/main/java/com/comandante/creeper/spells/Spell.java
+++ b/src/main/java/com/comandante/creeper/spells/Spell.java
@@ -13,10 +13,7 @@ import com.google.common.collect.Interner;
 import com.google.common.collect.Interners;
 import org.apache.log4j.Logger;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.Random;
-import java.util.Set;
+import java.util.*;
 
 
 public abstract class Spell {
diff --git a/src/main/java/com/comandante/creeper/spells/Spells.java b/src/main/java/com/comandante/creeper/spells/Spells.java
new file mode 100644
index 0000000000000000000000000000000000000000..5874a7d66894d2f4af2b1d0e8f679c7703372388
--- /dev/null
+++ b/src/main/java/com/comandante/creeper/spells/Spells.java
@@ -0,0 +1,93 @@
+package com.comandante.creeper.spells;
+
+import com.comandante.creeper.CreeperUtils;
+import com.comandante.creeper.managers.GameManager;
+import com.comandante.creeper.npc.Npc;
+import com.comandante.creeper.player.Player;
+import com.comandante.creeper.server.Color;
+import com.comandante.creeper.stat.Stats;
+import com.comandante.creeper.stat.StatsHelper;
+import com.google.common.collect.Interner;
+import com.google.common.collect.Interners;
+import com.google.common.collect.Sets;
+import org.apache.log4j.Logger;
+
+import java.util.Optional;
+import java.util.Set;
+
+public class Spells {
+
+    private GameManager gameManager;
+
+    private static final Logger log = Logger.getLogger(Spell.class);
+
+    public Spells(GameManager gameManager) {
+        this.gameManager = gameManager;
+    }
+
+    public void executeSpell(Player sourcePlayer, Optional<Npc> destinationNpc, Optional<Player> destinationPlayer, ExecuteSpellRunnable executeSpellRunnable) {
+        try {
+            executeSpellRunnable.run(sourcePlayer, destinationNpc, destinationPlayer, gameManager);
+        } catch (Exception e) {
+            log.error("Problem executing spell.", e);
+        }
+    }
+
+    public Optional<ExecuteSpellRunnable> getSpellRunnable(String triggerName) {
+        if (Sets.newHashSet("lightning", "l").contains(triggerName)) {
+            return Optional.of(new LightningSpellRunnable(gameManager));
+        }
+        return Optional.empty();
+    }
+
+    public void applyEffectsToNpcs(Player player, Set<Npc> npcs, Set<Effect> effects) {
+        effects.forEach(effect ->
+                npcs.forEach(npc -> {
+                    Effect nEffect = new Effect(effect);
+                    nEffect.setPlayerId(player.getPlayerId());
+                    if (effect.getDurationStats().getCurrentHealth() < 0) {
+                        log.error("ERROR! Someone added an effect with a health modifier which won't work for various reasons.");
+                        return;
+                    }
+                    StatsHelper.combineStats(npc.getStats(), effect.getDurationStats());
+                    npc.addEffect(nEffect);
+                }));
+    }
+
+    public void applyEffectsToPlayer(Player destinationPlayer, Player player, Set<Effect> effects) {
+        for (Effect effect : effects) {
+            Effect nEffect = new Effect(effect);
+            nEffect.setPlayerId(player.getPlayerId());
+            gameManager.getEntityManager().saveEffect(nEffect);
+            if (effect.getDurationStats().getCurrentHealth() < 0) {
+                log.error("ERROR! Someone added an effect with a health modifier which won't work for various reasons.");
+                continue;
+            }
+            String effectApplyMessage;
+            if (destinationPlayer.addEffect(effect.getEntityId())) {
+                effectApplyMessage = Color.BOLD_ON + Color.GREEN + "[effect] " + Color.RESET + nEffect.getEffectName() + " applied!" + "\r\n";
+                gameManager.getChannelUtils().write(destinationPlayer.getPlayerId(), effectApplyMessage);
+            } else {
+                effectApplyMessage = Color.BOLD_ON + Color.GREEN + "[effect] " + Color.RESET + Color.RED + "Unable to apply " + nEffect.getEffectName() + "!" + "\r\n";
+                gameManager.getChannelUtils().write(player.getPlayerId(), effectApplyMessage);
+            }
+        }
+    }
+
+    public static long getSpellAttack(Stats player, Stats victim) {
+        int rolls = 0;
+        int totDamage = 0;
+        while (rolls <= player.getNumberOfWeaponRolls()) {
+            rolls++;
+            totDamage = totDamage + CreeperUtils.randInt((int) player.getWeaponRatingMin(), (int) player.getWeaponRatingMax());
+        }
+        long i = player.getStrength() + totDamage - victim.getArmorRating();
+        if (i < 0) {
+            return 0;
+        } else {
+            return i;
+        }
+    }
+}
+
+
diff --git a/src/main/java/com/comandante/creeper/stat/Stats.java b/src/main/java/com/comandante/creeper/stat/Stats.java
index 504b92abdd59b0b7d2bbb2394f3b11e661d919eb..07f3b2371cb3e61b0657a7d63bbf500634591b1a 100644
--- a/src/main/java/com/comandante/creeper/stat/Stats.java
+++ b/src/main/java/com/comandante/creeper/stat/Stats.java
@@ -4,6 +4,7 @@ import java.io.Serializable;
 
 public class Stats implements Serializable {
     private long strength;
+    private long intelligence;
     private long willpower;
     private long aim;
     private long agile;
@@ -23,6 +24,7 @@ public class Stats implements Serializable {
 
     public Stats(Stats stats) {
         this.strength = stats.strength;
+        this.intelligence = stats.intelligence;
         this.willpower = stats.willpower;
         this.aim = stats.aim;
         this.agile = stats.agile;
@@ -44,6 +46,7 @@ public class Stats implements Serializable {
     }
 
     public Stats(long strength,
+                 long intelligence,
                  long willpower,
                  long aim,
                  long agile,
@@ -61,6 +64,7 @@ public class Stats implements Serializable {
                  long inventorySize,
                  long maxEffects) {
         this.strength = strength;
+        this.intelligence = intelligence;
         this.willpower = willpower;
         this.aim = aim;
         this.agile = agile;
@@ -80,6 +84,14 @@ public class Stats implements Serializable {
     }
 
 
+    public long getIntelligence() {
+        return intelligence;
+    }
+
+    public void setIntelligence(long intelligence) {
+        this.intelligence = intelligence;
+    }
+
     public long getMaxEffects() {
         return maxEffects;
     }
diff --git a/src/main/java/com/comandante/creeper/stat/StatsBuilder.java b/src/main/java/com/comandante/creeper/stat/StatsBuilder.java
index d2532fd47035bb61c213b6722e8229b3b3ad6d49..b8ab39495ec4660e69d5293666ba48f7c7782bbe 100644
--- a/src/main/java/com/comandante/creeper/stat/StatsBuilder.java
+++ b/src/main/java/com/comandante/creeper/stat/StatsBuilder.java
@@ -2,6 +2,7 @@ package com.comandante.creeper.stat;
 
 public class StatsBuilder {
     private long strength;
+    private long intelligence;
     private long willpower;
     private long aim;
     private long agile;
@@ -24,6 +25,7 @@ public class StatsBuilder {
 
     public StatsBuilder(Stats stats) {
         this.strength = stats.getStrength();
+        this.intelligence = stats.getIntelligence();
         this.willpower = stats.getWillpower();
         this.aim = stats.getAim();
         this.agile = stats.getAgile();
@@ -43,6 +45,11 @@ public class StatsBuilder {
         this.maxEffects = stats.getMaxEffects();
     }
 
+    public StatsBuilder setIntelligence(long intelligence) {
+        this.intelligence = intelligence;
+        return this;
+    }
+
     public StatsBuilder setStrength(long strength) {
         this.strength = strength;
         return this;
@@ -129,6 +136,6 @@ public class StatsBuilder {
     }
 
     public Stats createStats() {
-        return new Stats(strength, willpower, aim, agile, armorRating, meleSkill, currentHealth, maxHealth, weaponRatingMax, weaponRatingMin, numberOfWeaponRolls, experience, currentMana, maxMana, foraging, inventorySize, maxEffects);
+        return new Stats(strength, intelligence, willpower, aim, agile, armorRating, meleSkill, currentHealth, maxHealth, weaponRatingMax, weaponRatingMin, numberOfWeaponRolls, experience, currentMana, maxMana, foraging, inventorySize, maxEffects);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/stat/StatsHelper.java b/src/main/java/com/comandante/creeper/stat/StatsHelper.java
index cb73df3276081f1c0527e762a2adf7cac756d8a1..512a33149ec5833465bef64b865ee08053732661 100644
--- a/src/main/java/com/comandante/creeper/stat/StatsHelper.java
+++ b/src/main/java/com/comandante/creeper/stat/StatsHelper.java
@@ -5,6 +5,7 @@ public class StatsHelper {
     public static Stats getDifference(Stats modifiedStats, Stats origStats) {
         StatsBuilder statsBuilder = new StatsBuilder();
         statsBuilder.setAgile(modifiedStats.getAgile() - origStats.getAgile());
+        statsBuilder.setIntelligence(modifiedStats.getIntelligence() - origStats.getIntelligence());
         statsBuilder.setAim(modifiedStats.getAim() - origStats.getAim());
         statsBuilder.setArmorRating(modifiedStats.getArmorRating() - origStats.getArmorRating());
         statsBuilder.setCurrentHealth(modifiedStats.getCurrentHealth() - origStats.getCurrentHealth());
@@ -26,6 +27,7 @@ public class StatsHelper {
 
     public static void combineStats(Stats orig, Stats combine) {
         orig.setAgile(orig.getAgile() + combine.getAgile());
+        orig.setIntelligence(orig.getIntelligence() + combine.getIntelligence());
         orig.setAim(orig.getAim() + combine.getAim());
         orig.setArmorRating(orig.getArmorRating() + combine.getArmorRating());
         orig.setCurrentHealth(orig.getCurrentHealth() + combine.getCurrentHealth());
@@ -47,6 +49,7 @@ public class StatsHelper {
     public static void inverseStats(Stats stats) {
         stats.setAgile(-stats.getAgile());
         stats.setAim(-stats.getAim());
+        stats.setIntelligence(-stats.getIntelligence());
         stats.setArmorRating(-stats.getArmorRating());
         stats.setCurrentHealth(-stats.getCurrentHealth());
         stats.setMaxHealth(-stats.getMaxHealth());
diff --git a/src/test/com/comandante/creeper/player/NpcTestHarness.java b/src/test/com/comandante/creeper/player/NpcTestHarness.java
index 2f4c0401961be8eda30939df81219aa9d5ad1c6b..1a4adc0da7804f91a233c4119ff62880feb17630 100644
--- a/src/test/com/comandante/creeper/player/NpcTestHarness.java
+++ b/src/test/com/comandante/creeper/player/NpcTestHarness.java
@@ -227,4 +227,26 @@ public class NpcTestHarness {
         PlayerMetadata playerMetadata = new PlayerMetadata(username, password, Main.createPlayerId(username), PlayerStats.DEFAULT_PLAYER.createStats(), 0, Sets.newHashSet(PlayerRole.MORTAL), new String[0], 0, new String[0], Maps.newHashMap());
         gameManager.getPlayerManager().savePlayerMetadata(playerMetadata);
     }
+
+    private int getLightningSpellDamage(int level, int intelligence, int npcIntelligence) {
+        return (level * 1) + (3 * intelligence);
+
+    }
+
+    @Test
+    public void screwingAround() throws Exception {
+
+        int lightningSpellDamage = getLightningSpellDamage(4, 7, 4);
+        System.out.println("Level 1 player with 7 intelligence vs 4 intelligence npc: " + lightningSpellDamage);
+
+        lightningSpellDamage = getLightningSpellDamage(5, 11, 6);
+        System.out.println("Level 5 player with 11 intelligence vs 6 intelligence npc: " + lightningSpellDamage);
+        lightningSpellDamage = getLightningSpellDamage(7, 14, 8);
+        System.out.println("Level 7 player with 14 intelligence vs 8 intelligence npc: " + lightningSpellDamage);
+        lightningSpellDamage = getLightningSpellDamage(9,16, 10);
+        System.out.println("Level 9 player with 16 intelligence vs 10 intelligence npc: " + lightningSpellDamage);
+        lightningSpellDamage = getLightningSpellDamage(12, 21, 13);
+        System.out.println("Level 12 player with 21 intelligence vs 13 intelligence npc: " + lightningSpellDamage);
+
+    }
 }