From 425a88e3e7249bd2efb003dc1e95bf29ddcddef3 Mon Sep 17 00:00:00 2001
From: DarkGod <darkgod@net-core.org>
Date: Sun, 8 Mar 2015 16:55:35 +0100
Subject: [PATCH] correctly handle "wrong" state parameters to projectors (due
 to many times using as the dam parameter a self:fooCrit() which returns 2
 values)

---
 game/modules/tome/data/damage_types.lua | 316 ++++++++++++------------
 utils/record_vid.sh                     |   3 +-
 2 files changed, 163 insertions(+), 156 deletions(-)

diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua
index db8d0a781e..db2db76b8b 100644
--- a/game/modules/tome/data/damage_types.lua
+++ b/game/modules/tome/data/damage_types.lua
@@ -20,6 +20,12 @@
 local print = print
 if not config.settings.cheat then print = function() end end
 
+function initState(state)
+	if state == nil then return {}
+	elseif state == true or state == false then return {}
+	else return state end
+end
+
 -- Loads the implicit crit if one has not been passed.
 function DamageType.useImplicitCrit(src, state)
 	if state.crit_set then return end
@@ -42,7 +48,7 @@ setDefaultProjector(function(src, x, y, type, dam, state)
 	if not game.level.map:isBound(x, y) then return 0 end
 
 	-- Manage crits.
-	state = state or {}
+	state = initState(state)
 	useImplicitCrit(src, state)
 	local crit_type = state.crit_type
 	local crit_power = state.crit_power
@@ -649,7 +655,7 @@ newDamageType{
 newDamageType{
 	name = "physical", type = "PHYSICAL",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local realdam = DamageType.defaultProjector(src, x, y, type, dam, state)
 		
@@ -674,7 +680,7 @@ newDamageType{
 	name = "fire", type = "FIRE", text_color = "#LIGHT_RED#",
 	antimagic_resolve = true,
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		if src.fire_convert_to then
 			if src.fire_convert_to[2] >= 100 then
@@ -702,7 +708,7 @@ newDamageType{
 	name = "cold", type = "COLD", text_color = "#1133F3#",
 	antimagic_resolve = true,
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local a = game.level.map(x, y, Map.ACTOR)
 		local acheive = a and src.player and not a.training_dummy and a ~= src
@@ -721,7 +727,7 @@ newDamageType{
 	name = "lightning", type = "LIGHTNING", text_color = "#ROYAL_BLUE#",
 	antimagic_resolve = true,
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local realdam = DamageType.defaultProjector(src, x, y, type, dam, state)
 		if realdam > 0 and src:attr("lightning_brainlocks") then
@@ -740,7 +746,7 @@ newDamageType{
 	name = "acid", type = "ACID", text_color = "#GREEN#",
 	antimagic_resolve = true,
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		local realdam = DamageType.defaultProjector(src, x, y, type, dam, state)
@@ -758,7 +764,7 @@ newDamageType{
 	name = "nature", type = "NATURE", text_color = "#LIGHT_GREEN#",
 	antimagic_resolve = true,
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		local realdam = DamageType.defaultProjector(src, x, y, type, dam, state)
@@ -775,7 +781,7 @@ newDamageType{
 	name = "blight", type = "BLIGHT", text_color = "#DARK_GREEN#",
 	antimagic_resolve = true,
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local realdam = DamageType.defaultProjector(src, x, y, type, dam, state)
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -801,7 +807,7 @@ newDamageType{
 	antimagic_resolve = true,
 	death_message = {"shadowed", "darkened", "swallowed by the void"},
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local realdam = DamageType.defaultProjector(src, x, y, type, dam, state)
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -819,7 +825,7 @@ newDamageType{
 newDamageType{
 	name = "mind", type = "MIND", text_color = "#YELLOW#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		local thought_form
@@ -848,7 +854,7 @@ newDamageType{
 newDamageType{
 	name = "winter", type = "WINTER",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local srcx, srcy = dam.x, dam.y
 		local base = dam
@@ -871,7 +877,7 @@ newDamageType{
 	name = "temporal", type = "TEMPORAL", text_color = "#LIGHT_STEEL_BLUE#",
 	antimagic_resolve = true,
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local realdam = DamageType.defaultProjector(src, x, y, type, dam, state)
 		
@@ -889,7 +895,7 @@ newDamageType{
 newDamageType{
 	name = "temporal stun", type = "TEMPORALSTUN",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		DamageType:get(DamageType.TEMPORAL).projector(src, x, y, DamageType.TEMPORAL, dam, state)
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -907,7 +913,7 @@ newDamageType{
 newDamageType{
 	name = "lite", type = "LITE", text_color = "#YELLOW#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		-- Counter magical unlite level before lighting grids
 		local g = game.level.map(x, y, Map.TERRAIN+1)
@@ -923,7 +929,7 @@ newDamageType{
 newDamageType{
 	name = "illumination", type = "BREAK_STEALTH",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		-- Dont lit magically unlit grids
 		local a = game.level.map(x, y, Map.ACTOR)
@@ -937,7 +943,7 @@ newDamageType{
 newDamageType{
 	name = "silence", type = "SILENCE",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -954,7 +960,7 @@ newDamageType{
 newDamageType{
 	name = "arcane silence", type = "ARCANE_SILENCE", text_color = "#PURPLE#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local chance = 100
 		if _G.type(dam) == "table" then dam, chance = dam.dam, dam.chance end
@@ -976,7 +982,7 @@ newDamageType{
 newDamageType{
 	name = "silence", type = "RANDOM_SILENCE",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and rng.percent(dam) then
@@ -993,7 +999,7 @@ newDamageType{
 newDamageType{
 	name = "blindness", type = "BLIND",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -1008,7 +1014,7 @@ newDamageType{
 newDamageType{
 	name = "blindness", type = "BLINDPHYSICAL",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -1023,7 +1029,7 @@ newDamageType{
 newDamageType{
 	name = "blinding ink", type = "BLINDING_INK",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -1038,7 +1044,7 @@ newDamageType{
 newDamageType{
 	name = "blindness", type = "BLINDCUSTOMMIND",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -1055,7 +1061,7 @@ newDamageType{
 newDamageType{
 	name = "bright light", type = "LITE_LIGHT",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		DamageType:get(DamageType.LITE).projector(src, x, y, DamageType.LITE, 1, state)
 		return DamageType:get(DamageType.LIGHT).projector(src, x, y, DamageType.LIGHT, dam, state)
@@ -1066,7 +1072,7 @@ newDamageType{
 newDamageType{
 	name = "fire burn", type = "FIREBURN", text_color = "#LIGHT_RED#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local dur = 3
 		local perc = 50
@@ -1087,7 +1093,7 @@ newDamageType{
 newDamageType{
 	name = "stunning fire", type = "FIRE_STUN", text_color = "#LIGHT_RED#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local chance = 25
 		local dur = 3
@@ -1110,7 +1116,7 @@ newDamageType{
 newDamageType{
 	name = "fire burn", type = "GOLEM_FIREBURN",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local realdam = 0
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -1125,7 +1131,7 @@ newDamageType{
 newDamageType{
 	name = "devouring flames", type = "FIRE_DRAIN", text_color = "#LIGHT_RED#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		if _G.type(dam) == "number" then dam = {dam=dam, healfactor=0.1} end
 		local target = game.level.map(x, y, Map.ACTOR) -- Get the target first to make sure we heal even on kill
@@ -1142,7 +1148,7 @@ newDamageType{
 newDamageType{
 	name = "shadowflame", type = "SHADOWFLAME", text_color = "#BF7F73#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		DamageType:get(DamageType.FIRE).projector(src, x, y, DamageType.FIRE, dam / 2, state)
 		DamageType:get(DamageType.DARKNESS).projector(src, x, y, DamageType.DARKNESS, dam / 2, state)
@@ -1153,7 +1159,7 @@ newDamageType{
 newDamageType{
 	name = "darkness", type = "DARKSTUN",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		DamageType:get(DamageType.DARKNESS).projector(src, x, y, DamageType.DARKNESS, dam, state)
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -1172,7 +1178,7 @@ newDamageType{
 newDamageType{
 	name = "darkness", type = "MINION_DARKNESS",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and (not target.necrotic_minion or target.summoner ~= src) then
@@ -1185,7 +1191,7 @@ newDamageType{
 newDamageType{
 	name = "fire", type = "FIRE_FRIENDS",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and target.summoner ~= src then
@@ -1198,7 +1204,7 @@ newDamageType{
 newDamageType{
 	name = "cold", type = "COLDSTUN",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		DamageType:get(DamageType.COLD).projector(src, x, y, DamageType.COLD, dam, state)
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -1216,7 +1222,7 @@ newDamageType{
 newDamageType{
 	name = "flameshock", type = "FLAMESHOCK",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		if _G.type(dam) == "number" then dam = {dam=dam, dur=4} end
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -1235,7 +1241,7 @@ newDamageType{
 newDamageType{
 	name = "ice", type = "ICE", text_color = "#1133F3#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local chance = 25
 		if _G.type(dam) == "table" then chance, dam = dam.chance, dam.dam end
@@ -1251,7 +1257,7 @@ newDamageType{
 newDamageType{
 	name = "slowing ice", type = "ICE_SLOW", text_color = "#1133F3#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local chance = 25
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -1271,7 +1277,7 @@ newDamageType{
 newDamageType{
 	name = "ice storm", type = "ICE_STORM", text_color = "#1133F3#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local chance = 25
 
@@ -1290,7 +1296,7 @@ newDamageType{
 newDamageType{
 	name = "glacial vapour", type = "GLACIAL_VAPOUR", text_color = "#1133F3#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local chance = 0
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -1307,7 +1313,7 @@ newDamageType{
 newDamageType{
 	name = "cold ground", type = "COLDNEVERMOVE",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		if _G.type(dam) == "number" then dam = {dam=dam, dur=4} end
 		DamageType:get(DamageType.COLD).projector(src, x, y, DamageType.COLD, dam.dam, state)
@@ -1328,7 +1334,7 @@ newDamageType{
 newDamageType{
 	name = "freeze", type = "FREEZE",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -1349,7 +1355,7 @@ newDamageType{
 newDamageType{
 	name = "sticky smoke", type = "STICKY_SMOKE",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -1366,7 +1372,7 @@ newDamageType{
 newDamageType{
 	name = "acid blind", type = "ACID_BLIND", text_color = "#GREEN#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local realdam = DamageType:get(DamageType.ACID).projector(src, x, y, DamageType.ACID, dam, state)
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -1385,7 +1391,7 @@ newDamageType{
 newDamageType{
 	name = "blinding darkness", type = "DARKNESS_BLIND",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local realdam = DamageType:get(DamageType.DARKNESS).projector(src, x, y, DamageType.DARKNESS, dam, state)
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -1404,7 +1410,7 @@ newDamageType{
 newDamageType{
 	name = "blinding light", type = "LIGHT_BLIND", text_color = "#YELLOW#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local realdam = DamageType:get(DamageType.LIGHT).projector(src, x, y, DamageType.LIGHT, dam, state)
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -1423,7 +1429,7 @@ newDamageType{
 newDamageType{
 	name = "dazing lightning", type = "LIGHTNING_DAZE", text_color = "#ROYAL_BLUE#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		if _G.type(dam) == "number" then dam = {dam=dam, daze=25} end
 		dam.daze = dam.daze or 25
@@ -1451,7 +1457,7 @@ newDamageType{
 newDamageType{
 	name = "cold repulsion", type = "WAVE",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local srcx, srcy = dam.x, dam.y
 		local base = dam
@@ -1483,7 +1489,7 @@ newDamageType{
 newDamageType{
 	name = "bloodspring", type = "BLOODSPRING",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local srcx, srcy = dam.x, dam.y
 		local base = dam
@@ -1506,11 +1512,11 @@ newDamageType{
 newDamageType{
 	name = "fire repulsion", type = "FIREKNOCKBACK",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if _G.type(dam) ~= "table" then dam = {dam=dam, dist=3} end
-		state = state or {}
+		state = initState(state)
 		if target and not state[target] then
 			state[target] = true
 			DamageType:get(DamageType.FIREBURN).projector(src, x, y, DamageType.FIREBURN, dam.dam, state)
@@ -1529,11 +1535,11 @@ newDamageType{
 newDamageType{
 	name = "burning repulsion", type = "FIREKNOCKBACK_MIND",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if _G.type(dam) ~= "table" then dam = {dam=dam, dist=3} end
-		state = state or {}
+		state = initState(state)
 		if target and not state[target] then
 			state[target] = true
 			DamageType:get(DamageType.FIREBURN).projector(src, x, y, DamageType.FIREBURN, dam.dam, state)
@@ -1552,11 +1558,11 @@ newDamageType{
 newDamageType{
 	name = "darkness repulsion", type = "DARKKNOCKBACK",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if _G.type(dam) ~= "table" then dam = {dam=dam, dist=3} end
-		state = state or {}
+		state = initState(state)
 		if target and not state[target] then
 			state[target] = true
 			DamageType:get(DamageType.DARKNESS).projector(src, x, y, DamageType.DARKNESS, dam.dam, state)
@@ -1575,12 +1581,12 @@ newDamageType{
 newDamageType{
 	name = "physical repulsion", type = "SPELLKNOCKBACK",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		local realdam = 0
 		if _G.type(dam) ~= "table" then dam = {dam=dam, dist=3} end
-		state = state or {}
+		state = initState(state)
 		if target and not state[target] then
 			state[target] = true
 			realdam = DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam.dam, state)
@@ -1600,10 +1606,10 @@ newDamageType{
 newDamageType{
 	name = "physical repulsion", type = "MINDKNOCKBACK",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
-		state = state or {}
+		state = initState(state)
 		if target and not state[target] then
 			state[target] = true
 			DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam, state)
@@ -1622,10 +1628,10 @@ newDamageType{
 newDamageType{
 	name = "physical repulsion", type = "PHYSKNOCKBACK",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
-		state = state or {}
+		state = initState(state)
 		if _G.type(dam) ~= "table" then dam = {dam=dam, dist=3} end
 		if target and not state[target] then
 			state[target] = true
@@ -1645,10 +1651,10 @@ newDamageType{
 newDamageType{
 	name = "fear repulsion", type = "FEARKNOCKBACK",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
-		state = state or {}
+		state = initState(state)
 		if target and not state[target] then
 			state[target] = true
 			if target:checkHit(src:combatMindpower(), target:combatPhysicalResist(), 0, 95, 15) and target:canBe("fear") then
@@ -1666,7 +1672,7 @@ newDamageType{
 newDamageType{
 	name = "poison", type = "POISON", text_color = "#LIGHT_GREEN#",
 	projector = function(src, x, y, t, dam)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local power
 		if type(dam) == "table" then
@@ -1686,7 +1692,7 @@ newDamageType{
 newDamageType{
 	name = "cleansing fire", type = "INFERNO",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local realdam = DamageType:get(DamageType.FIRE).projector(src, x, y, DamageType.FIRE, dam, state)
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -1713,7 +1719,7 @@ newDamageType{
 newDamageType{
 	name = "spydric poison", type = "SPYDRIC_POISON",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		if _G.type(dam) == "number" then dam = {dam=dam, dur=3} end
 		DamageType:get(DamageType.NATURE).projector(src, x, y, DamageType.NATURE, dam.dam / dam.dur, state)
@@ -1728,7 +1734,7 @@ newDamageType{
 newDamageType{
 	name = "crippling poison", type = "CRIPPLING_POISON", text_color = "#LIGHT_GREEN#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		if _G.type(dam) == "number" then dam = {dam=dam, dur=3} end
 		DamageType:get(DamageType.NATURE).projector(src, x, y, DamageType.NATURE, dam.dam / dam.dur, state)
@@ -1743,7 +1749,7 @@ newDamageType{
 newDamageType{
 	name = "insidious poison", type = "INSIDIOUS_POISON", text_color = "#LIGHT_GREEN#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		if _G.type(dam) == "number" then dam = {dam=dam, dur=7, heal_factor=dam} end
 		DamageType:get(DamageType.NATURE).projector(src, x, y, DamageType.NATURE, dam.dam / dam.dur, state)
@@ -1758,7 +1764,7 @@ newDamageType{
 newDamageType{
 	name = "bleed", type = "BLEED",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam / 6, state)
 		dam = dam - dam / 6
@@ -1774,7 +1780,7 @@ newDamageType{
 newDamageType{
 	name = "physical bleed", type = "PHYSICALBLEED",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local realdam = DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam, state)
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -1788,7 +1794,7 @@ newDamageType{
 newDamageType{
 	name = "nature slow", type = "SLIME", text_color = "#LIGHT_GREEN#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		if _G.type(dam) == "number" then dam = {dam=dam, power=0.15} end
 		DamageType:get(DamageType.NATURE).projector(src, x, y, DamageType.NATURE, dam.dam, state)
@@ -1803,7 +1809,7 @@ newDamageType{
 newDamageType{
 	name = "dig", type = "DIG",
 	projector = function(src, x, y, typ, dam)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local feat = game.level.map(x, y, Map.TERRAIN)
 		if feat then
@@ -1828,7 +1834,7 @@ newDamageType{
 newDamageType{
 	name = "slow", type = "SLOW",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -1842,7 +1848,7 @@ newDamageType{
 newDamageType{
 	name = "congeal time", type = "CONGEAL_TIME",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -1857,7 +1863,7 @@ newDamageType{
 newDamageType{
 	name = "time prison", type = "TIME_PRISON",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -1880,7 +1886,7 @@ newDamageType{
 newDamageType{
 	name = "confusion", type = "CONFUSION",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -1897,7 +1903,7 @@ newDamageType{
 newDamageType{
 	name = "% chance of confusion", type = "RANDOM_CONFUSION",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		if _G.type(dam) == "number" then dam = {dam=dam} end
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -1915,7 +1921,7 @@ newDamageType{
 newDamageType{
 	name = "% chance of confusion", type = "RANDOM_CONFUSION_PHYS",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		if _G.type(dam) == "number" then dam = {dam=dam} end
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -1932,7 +1938,7 @@ newDamageType{
 newDamageType{
 	name = "% chance of gloom effects", type = "RANDOM_GLOOM",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and rng.percent(dam) then
@@ -1985,7 +1991,7 @@ newDamageType{
 			:format(dam, parens)
 	end,
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -2033,7 +2039,7 @@ newDamageType{
 			:format(dam, parens)
 	end,
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -2065,7 +2071,7 @@ newDamageType{
 			:format(dam, parens)
 	end,
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and src and src.name and rng.percent(dam) then
@@ -2100,7 +2106,7 @@ newDamageType{
 			:format(dam, parens)
 	end,
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -2132,7 +2138,7 @@ newDamageType{
 			:format(dam, parens)
 	end,
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -2167,7 +2173,7 @@ newDamageType{
 			:format(dam, parens)
 	end,
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -2199,7 +2205,7 @@ newDamageType{
 			:format(dam, parens)
 	end,
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -2230,7 +2236,7 @@ newDamageType{
 			:format(dam or 0, parens)
 	end,
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -2258,7 +2264,7 @@ newDamageType{
 			:format(dam, parens)
 	end,
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -2287,7 +2293,7 @@ newDamageType{
 			:format(dam, 20, parens)
 	end,
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -2306,7 +2312,7 @@ newDamageType{
 newDamageType{
 	name = "blinding", type = "RANDOM_BLIND",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		if _G.type(dam) == "number" then dam = {dam=dam} end
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -2324,7 +2330,7 @@ newDamageType{
 newDamageType{
 	name = "blinding physical", type = "SAND",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam.dam, state)
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -2342,7 +2348,7 @@ newDamageType{
 newDamageType{
 	name = "physical pinning", type = "PINNING",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam.dam, state)
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -2360,7 +2366,7 @@ newDamageType{
 newDamageType{
 	name = "regressive blight", type = "DRAINEXP",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		if _G.type(dam) == "number" then dam = {dam=dam} end
 		local realdam = DamageType:get(DamageType.BLIGHT).projector(src, x, y, DamageType.BLIGHT, dam.dam, state)
@@ -2381,7 +2387,7 @@ newDamageType{
 newDamageType{
 	name = "draining blight", type = "DRAINLIFE", text_color = "#DARK_GREEN#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		if _G.type(dam) == "number" then dam = {dam=dam, healfactor=0.4} end
 		local target = game.level.map(x, y, Map.ACTOR) -- Get the target first to make sure we heal even on kill
@@ -2398,7 +2404,7 @@ newDamageType{
 newDamageType{
 	name = "vim draining blight", type = "DRAIN_VIM", text_color = "#DARK_GREEN#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		if _G.type(dam) == "number" then dam = {dam=dam, vim=0.2} end
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -2414,7 +2420,7 @@ newDamageType{
 newDamageType{
 	name = "demonfire", type = "DEMONFIRE",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and target:attr("demon") then
@@ -2431,7 +2437,7 @@ newDamageType{
 newDamageType{
 	name = "purging blight", type = "RETCH",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and (target:attr("undead") or target:attr(retch_heal)) then
@@ -2480,7 +2486,7 @@ newDamageType{
 newDamageType{
 	name = "holy light", type = "HOLY_LIGHT",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and not target:attr("undead") and not target:attr("demon") then
@@ -2495,7 +2501,7 @@ newDamageType{
 newDamageType{
 	name = "healing", type = "HEAL",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -2511,7 +2517,7 @@ newDamageType{
 newDamageType{
 	name = "healing light", type = "HEALING_POWER",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -2549,7 +2555,7 @@ newDamageType{
 newDamageType{
 	name = "judgement", type = "JUDGEMENT",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and target ~= src then
@@ -2567,7 +2573,7 @@ newDamageType{
 newDamageType{
 	name = "healing nature", type = "HEALING_NATURE",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and not target:attr("undead") then
@@ -2585,7 +2591,7 @@ newDamageType{
 newDamageType{
 	name = "infective blight", type = "CORRUPTED_BLOOD", text_color = "#DARK_GREEN#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		if _G.type(dam) == "number" then dam = {dam=dam} end
 		DamageType:get(DamageType.BLIGHT).projector(src, x, y, DamageType.BLIGHT, dam.dam, state)
@@ -2601,7 +2607,7 @@ newDamageType{
 newDamageType{
 	name = "hindering blight", type = "BLOOD_BOIL", text_color = "#DARK_GREEN#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		DamageType:get(DamageType.BLIGHT).projector(src, x, y, DamageType.BLIGHT, dam, state)
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -2624,7 +2630,7 @@ newDamageType{
 newDamageType{
 	name = "physical stun", type = "PHYSICAL_STUN",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam, state)
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -2642,7 +2648,7 @@ newDamageType{
 newDamageType{
 	name = "physical bleed", type = "SPLIT_BLEED",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam / 2, state)
 		DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam / 12, state)
@@ -2658,7 +2664,7 @@ newDamageType{
 newDamageType{
 	name = "warp", type = "WARP",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		DamageType:get(DamageType.TEMPORAL).projector(src, x, y, DamageType.TEMPORAL, dam / 2, state)
 		DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam / 2, state)
@@ -2669,7 +2675,7 @@ newDamageType{
 newDamageType{
 	name = "temporal darkness", type = "VOID", text_color = "#GREY#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		DamageType:get(DamageType.TEMPORAL).projector(src, x, y, DamageType.TEMPORAL, dam / 2, state)
 		DamageType:get(DamageType.DARKNESS).projector(src, x, y, DamageType.DARKNESS, dam / 2, state)
@@ -2680,7 +2686,7 @@ newDamageType{
 newDamageType{
 	name = "gravity", type = "GRAVITY",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		if _G.type(dam) == "number" then dam = {dam=dam} end
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -2698,7 +2704,7 @@ newDamageType{
 newDamageType{
 	name = "gravity pin", type = "GRAVITYPIN",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		local reapplied = false
@@ -2723,10 +2729,10 @@ newDamageType{
 newDamageType{
 	name = "physical repulsion", type = "REPULSION",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
-		state = state or {}
+		state = initState(state)
 		-- extra damage on pinned targets
 		if target and target:attr("never_move") then
 			dam = dam * 1.5
@@ -2749,7 +2755,7 @@ newDamageType{
 newDamageType{
 	name = "grow", type = "GROW",
 	projector = function(src, x, y, typ, dam)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local feat = game.level.map(x, y, Map.TERRAIN)
 		if feat then
@@ -2772,7 +2778,7 @@ newDamageType{
 newDamageType{
 	name = "pinning nature", type = "GRASPING_MOSS",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and src:reactionToward(target) < 0 then
@@ -2790,7 +2796,7 @@ newDamageType{
 newDamageType{
 	name = "healing nature", type = "NOURISHING_MOSS",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and src:reactionToward(target) < 0 then
@@ -2803,7 +2809,7 @@ newDamageType{
 newDamageType{
 	name = "impeding nature", type = "SLIPPERY_MOSS",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and src:reactionToward(target) < 0 then
@@ -2816,7 +2822,7 @@ newDamageType{
 newDamageType{
 	name = "confounding nature", type = "HALLUCINOGENIC_MOSS",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and src:reactionToward(target) < 0 then
@@ -2834,7 +2840,7 @@ newDamageType{
 newDamageType{
 	name = "sanctity", type = "SANCTITY",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -2852,7 +2858,7 @@ newDamageType{
 newDamageType{
 	name = "defensive darkness", type = "SHIFTINGSHADOWS",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -2868,7 +2874,7 @@ newDamageType{
 newDamageType{
 	name = "blazing light", type = "BLAZINGLIGHT",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -2885,7 +2891,7 @@ newDamageType{
 newDamageType{
 	name = "prismatic repulsion", type = "WARDING",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -2909,7 +2915,7 @@ newDamageType{
 newDamageType{
 	name = "mind slow", type = "MINDSLOW",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -2923,7 +2929,7 @@ newDamageType{
 newDamageType{
 	name = "mind freeze", type = "MINDFREEZE",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -2941,7 +2947,7 @@ newDamageType{
 newDamageType{
 	name = "implosion", type = "IMPLOSION",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local dur = 3
 		local perc = 50
@@ -2959,7 +2965,7 @@ newDamageType{
 newDamageType{
 	name = "regressive temporal", type = "CLOCK",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		if _G.type(dam) == "number" then dam = {dam=dam, stat=2 + math.ceil(dam/15), apply=src:combatSpellpower()} end
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -2975,7 +2981,7 @@ newDamageType{
 newDamageType{
 	name = "wasting temporal", type = "WASTING", text_color = "#LIGHT_STEEL_BLUE#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		local dur = 3
@@ -2995,7 +3001,7 @@ newDamageType{
 newDamageType{
 	name = "stop", type = "STOP",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -3011,7 +3017,7 @@ newDamageType{
 newDamageType{
 	name = "debilitating temporal", type = "RETHREAD",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		DamageType:get(DamageType.TEMPORAL).projector(src, x, y, DamageType.TEMPORAL, dam.dam, state)
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -3050,7 +3056,7 @@ newDamageType{
 newDamageType{
 	name = "draining physical", type = "DEVOUR_LIFE",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		if _G.type(dam) == "number" then dam = {dam=dam} end
 		local target = game.level.map(x, y, Map.ACTOR) -- Get the target first to make sure we heal even on kill
@@ -3072,7 +3078,7 @@ newDamageType{
 newDamageType{
 	name = "temporal slow", type = "CHRONOSLOW",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		DamageType:get(DamageType.TEMPORAL).projector(src, x, y, DamageType.TEMPORAL, dam.dam, state)
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -3093,7 +3099,7 @@ newDamageType{
 newDamageType{
 	name = "molten rock", type = "MOLTENROCK",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		return DamageType:get(DamageType.FIRE).projector(src, x, y, DamageType.FIRE, dam / 2, state) +
 		       DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam / 2, state)
@@ -3103,7 +3109,7 @@ newDamageType{
 newDamageType{
 	name = "entangle", type = "ENTANGLE",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam/3, state)
 		DamageType:get(DamageType.NATURE).projector(src, x, y, DamageType.NATURE, 2*dam/3, state)
@@ -3121,7 +3127,7 @@ newDamageType{
 newDamageType{
 	name = "manaworm arcane", type = "MANAWORM",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local realdam = DamageType:get(DamageType.ARCANE).projector(src, x, y, DamageType.ARCANE, dam, state)
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -3142,7 +3148,7 @@ newDamageType{
 newDamageType{
 	name = "arcane blast", type = "VOID_BLAST",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local realdam = DamageType:get(DamageType.ARCANE).projector(src, x, y, DamageType.ARCANE, dam, state)
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -3156,7 +3162,7 @@ newDamageType{
 newDamageType{
 	name = "circle of death", type = "CIRCLE_DEATH",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and (src:reactionToward(target) < 0 or dam.ff) then
@@ -3179,7 +3185,7 @@ newDamageType{
 newDamageType{
 	name = "decaying darkness", type = "RIGOR_MORTIS",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -3193,7 +3199,7 @@ newDamageType{
 newDamageType{
 	name = "abyssal darkness", type = "ABYSSAL_SHROUD",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		--make it dark
 		game.level.map.remembers(x, y, false)
@@ -3219,7 +3225,7 @@ newDamageType{
 	name = "% chance to summon an orc spirit", type = "GARKUL_INVOKE",
 	text_color = "#SALMON#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, engine.Map.ACTOR)
 		if not target then return end
@@ -3286,7 +3292,7 @@ newDamageType{
 newDamageType{
 	name = "nightmare", type = "NIGHTMARE",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and src:reactionToward(target) < 0 then
@@ -3304,7 +3310,7 @@ newDamageType{
 newDamageType{
 	name = "weakness", type = "WEAKNESS",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -3318,7 +3324,7 @@ newDamageType{
 newDamageType{
 	name = "special effect", type = "TEMP_EFFECT",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -3335,7 +3341,7 @@ newDamageType{
 newDamageType{
 	name = "manaburn arcane", type = "MANABURN", text_color = "#PURPLE#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -3349,7 +3355,7 @@ newDamageType{
 newDamageType{
 	name = "leaves", type = "LEAVES",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -3370,11 +3376,11 @@ newDamageType{
 newDamageType{
 	name = "distorting physical", type = "DISTORTION",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if not target then return end
-		state = state or {}
+		state = initState(state)
 		if target and not state[target] then
 			state[target] = true
 			local old_pen = 0
@@ -3434,12 +3440,12 @@ newDamageType{
 newDamageType{
 	name = "dreamforge", type = "DREAMFORGE",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if not target then return end
 		local power, dur, chance, dist, fail, do_particles
-		state = state or {}
+		state = initState(state)
 		if _G.type(dam) == "table" then dam, power, dur, chance, fail, dist, do_particles = dam.dam, dam.power, dam.dur, dam.chance, dam.fail, dam.dist, dam.do_particles end
 		if target and not state[target] then
 			if src:checkHit(src:combatMindpower(), target:combatMentalResist(), 0, 95) then
@@ -3481,7 +3487,7 @@ newDamageType{
 newDamageType{
 	name = "natural mucus", type = "MUCUS",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and not target.turn_procs.mucus then
@@ -3509,7 +3515,7 @@ newDamageType{
 newDamageType{
 	name = "disarming acid", type = "ACID_DISARM", text_color = "#GREEN#",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		if _G.type(dam) == "number" then dam = {chance=25, dam=dam} end
 		local realdam = DamageType:get(DamageType.ACID).projector(src, x, y, DamageType.ACID, dam.dam, state)
@@ -3529,7 +3535,7 @@ newDamageType{
 newDamageType{
 	name = "corrosive acid", type = "ACID_CORRODE",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		if _G.type(dam) == "number" then dam = {dur = 4, armor = dam/2, defense = dam/2, dam = dam, atk=dam/2} end
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -3544,7 +3550,7 @@ newDamageType{
 newDamageType{
 	name = "bouncing slime", type = "BOUNCE_SLIME",
 	projector = function(src, x, y, type, dam, state, _, tg)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -3577,7 +3583,7 @@ newDamageType{
 newDamageType{
 	name = "caustic mire", type = "CAUSTIC_MIRE",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		if _G.type(dam) == "number" then dam = {dur = 2, slow=20} end
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -3592,7 +3598,7 @@ newDamageType{
 newDamageType{
 	name = "sun path", type = "SUN_PATH",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and src:reactionToward(target) < 0 then
@@ -3604,7 +3610,7 @@ newDamageType{
 newDamageType{
 	name = "telekinetic shove", type = "TK_PUSHPIN",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -3633,7 +3639,7 @@ newDamageType{
 newDamageType{
 	name = "dimensional anchor", type = "DIMENSIONAL_ANCHOR",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		if _G.type(dam) == "number" then dam = {dam=dam, dur=dur or 4, apply_power=apply_power or src:combatSpellpower()} end
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -3647,7 +3653,7 @@ newDamageType{
 newDamageType{
 	name = "phase pulse", type = "RANDOM_WARP",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -3688,7 +3694,7 @@ newDamageType{
 newDamageType{
 	name = "brain storm", type = "BRAINSTORM",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
@@ -3712,7 +3718,7 @@ newDamageType{
 newDamageType{
 	name = "static net", type = "STATIC_NET",
 	projector = function(src, x, y, type, dam, state)
-		state = state or {}
+		state = initState(state)
 		useImplicitCrit(src, state)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and src:reactionToward(target) < 0 then
diff --git a/utils/record_vid.sh b/utils/record_vid.sh
index f79e0705cf..e47e180b60 100644
--- a/utils/record_vid.sh
+++ b/utils/record_vid.sh
@@ -7,6 +7,7 @@ fi
 
 rm $name.ogv $name.avi
 recordmydesktop --windowid $1 --fps 50 --full-shots --device pulse -o $name.ogv
-mencoder $name.ogv -ovc xvid -oac mp3lame -xvidencopts pass=1 -o $name.avi
+avconv -i $name.ogv -qscale 1 $name.avi
 
+# mencoder $name.ogv -ovc xvid -oac mp3lame -xvidencopts pass=1 -o $name.avi
 #ffmpeg -i input.ogv -c copy output.mkv
-- 
GitLab