diff --git a/game/engines/default/engine/interface/ActorTalents.lua b/game/engines/default/engine/interface/ActorTalents.lua
index 54f73090d9affdde551b8bdf3d3a064ef8f98cdb..28f3af1cad47d369d10c916e0dd8596c586a26a9 100644
--- a/game/engines/default/engine/interface/ActorTalents.lua
+++ b/game/engines/default/engine/interface/ActorTalents.lua
@@ -140,7 +140,6 @@ function _M:useTalent(id, who, force_level, ignore_cd, force_target, silent, no_
 	local co, success, err
 	
 	local msg, line
---	local st_msg, start_line = game.logNewest() -- debugging
 
 	if ab.mode == "activated" and ab.action then
 		if self:isTalentCoolingDown(ab) and not ignore_cd then
@@ -154,7 +153,6 @@ function _M:useTalent(id, who, force_level, ignore_cd, force_target, silent, no_
 			end
 			
 			if not self:preUseTalent(ab, silent) then return false end
-print("[useTalent] preUseTalent succeeded for", ab.id, self.uid, self.name) -- debugging
 			
 			msg, line = game.logNewest()
 			if not silent then self:logTalentMessage(ab) end
@@ -164,7 +162,6 @@ print("[useTalent] preUseTalent succeeded for", ab.id, self.uid, self.name) -- d
 			if not ok then self:onTalentLuaError(ab, ret) error(ret) end
 
 			if not ret and self._silent_talent_failure then -- remove messages generated by failed talent
-print("[useTalent]purging failed talent messages", ab.id, self.uid, self.name) -- debugging
 				local msg, newline = game.logNewest()
 				if newline ~= line then game.logRollback(line) end
 			end
@@ -186,7 +183,6 @@ print("[useTalent]purging failed talent messages", ab.id, self.uid, self.name) -
 				return false
 			end
 			if not self:preUseTalent(ab, silent) then return false end
-print("[useTalent] preUseTalent succeeded for", ab.id, self.uid, self.name) -- debugging
 			msg, line = game.logNewest()
 			if not silent then self:logTalentMessage(ab) end
 			
@@ -198,7 +194,6 @@ print("[useTalent] preUseTalent succeeded for", ab.id, self.uid, self.name) -- d
 				if ret then ret.name = ret.name or ab.name end
 
 				if not ret and self._silent_talent_failure then -- remove messages generated by failed talent
-print("[useTalent]purging failed talent messages", ab.id, self.uid, self.name) -- debugging
 					local msg, newline = game.logNewest()
 					if newline ~= line then game.logRollback(line) end
 				end
@@ -239,7 +234,6 @@ print("[useTalent]purging failed talent messages", ab.id, self.uid, self.name) -
 				if not ok then self:onTalentLuaError(ab, ret) error(ret) end
 				
 				if not ret and self._silent_talent_failure then -- remove messages generated by failed talent
-print("[useTalent]purging failed talent messages", ab.id, self.uid, self.name) -- debugging
 					local msg, newline = game.logNewest()
 					if newline ~= line then game.logRollback(line) end
 				end
@@ -292,10 +286,9 @@ print("[useTalent]purging failed talent messages", ab.id, self.uid, self.name) -
 				if force_level then who.talents[id] = old_level end
 				self.__talent_running = nil
 				if ok and coroutine.status(co) == "dead" then -- coroutine terminated normally
-if not success then print("[useTalent] TALENT UNSUCCESSFUL", ab.id) end -- debugging
 					if success and not ret then -- talent failed
 						print("[useTalent] TALENT FAILED:", ab.id, "for", self.name, self.uid, success)
-game.log("#ORANGE# %s TALENT USE FAILED [%s (silent_failure:%s at (%s, %s)]", ab.id, self.name, self._silent_talent_failure, self.x, self.y) -- debugging
+					--game.log("#ORANGE# %s TALENT USE FAILED [%s (silent_failure:%s at (%s, %s)]", ab.id, self.name, self._silent_talent_failure, self.x, self.y) -- debugging
 					end
 					return ret
 				end
@@ -313,7 +306,7 @@ game.log("#ORANGE# %s TALENT USE FAILED [%s (silent_failure:%s at (%s, %s)]", ab
 				success, ret = coroutine.resume(co_wrapper)
 				if not success and ret then -- talent code error
 					self:onTalentLuaError(ab, ret)
-					print("useTalent:", debug.traceback(co_wrapper), '\n')
+					--print("useTalent:", debug.traceback(co_wrapper), '\n')
 					error(ret)
 				end
 			end,
@@ -325,26 +318,17 @@ game.log("#ORANGE# %s TALENT USE FAILED [%s (silent_failure:%s at (%s, %s)]", ab
 		self.__talent_running = nil
 		if not success and ret then -- talent code error
 			self:onTalentLuaError(ab, ret)
-			print("useTalent:", debug.traceback(co_wrapper), '\n')
+			--print("useTalent:", debug.traceback(co_wrapper), '\n')
 			error(ret)
 		end
 	end
 	self.changed = true
 	
---[[ -- debugging
-	if ret and not silent and not self.dead and (ab.message ~= false and not util.getval(ab.no_message, self, ab)) then -- debugging (look for talents with no messages)
-		local msg, end_line = game.logNewest()
-		if start_line == end_line and game.level.map.seens(self.x, self.y) then
-			game.log("#YELLOW# NO TALENT MESSAGE for %s [%s at (%s, %s)]", ab.id, self.name, self.x, self.y)
-		end
-	end
---]] -- end debugging
-	
 	return ret -- return value from successfully used talent
 end
 
 --- Set true to remove game log messages generated by talents that started but did not complete
---	for messages generated after preUseTalent check when action/activate/deactivate function returns nil or false
+--	affects messages logged after preUseTalent check when action/activate/deactivate function returns nil or false
 _M._silent_talent_failure = false
 
 --- Get the talent use message, replacing some markers in its message string with info on the talent
@@ -366,10 +350,8 @@ end
 -- Redefine as needed
 -- called in useTalent after successful preUseTalent check
 -- @param[type=table] talent the talent (not the id, the table)
--- uses ab.message if defined or generates default use text
--- set ab.message == false to suppress the use message
+-- uses ab.message if defined or generates default use text (ab.message == false suppresses)
 function _M:logTalentMessage(ab)
-print("[logTalentMessage] outputting talent message for", ab.id, self.uid, self.name, self.x, self.y, game.level.map.seens(self.x, self.y)) -- debugging
 	if ab.message == false then return
 	elseif ab.message then
 		game.logSeen(self, "%s", self:useTalentMessage(ab))
@@ -406,13 +388,14 @@ end
 -- Redefine as needed
 -- @param ab the talent table
 -- @param err the table of errors returned from xpcall
--- sets self.talent_error and game._talent_error {ab=ab, Actor=self, err=err, turn=game.turn}
+-- sets self.talent_error and logs errors to _M._talent_errors
+-- 		data forma: {[ab.id]=ab, Actor=self, uid=, x=, y=, err=err, turn=game.turn}
 function _M:onTalentLuaError(ab, err)
 	if self.talent_error then return end -- handle only the first error
-game.log("#ORANGE# %s TALENT LUA ERROR %d, %s (%s, %s, %s)", ab.id, self.uid, self.name, self.x, self.y, game.level.map.seens(self.x, self.y)) -- debugging
-	self.talent_error = {[ab.id]=ab, Actor=self, err=err, turn=game.turn}
+	self.talent_error = {[ab.id]=ab, Actor=self, uid=self.uid, name=self.name, err=err, x=self.x, y=self.y, turn=game.turn}
 	print("##Use Talent Lua Error##", ab and ab.id, "Actor:", self.uid, self.name)
-	game._talent_error = self.talent_error
+	_M._talent_errors = _M._talent_errors or {} -- log the error globally
+	table.insert(_M._talent_errors, self.talent_error)
 	return
 end
 
diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index 22c02d50da98e56f89bd424d3d256000cfa2428c..140fae570bc6cb4c67f037e7d4cae00daad4e1c7 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -4879,7 +4879,6 @@ end
 -- called when the talent is used after successful preUseTalent check
 -- @param ab the talent (not the id, the table)
 function _M:logTalentMessage(ab)
-print("[Actor:logTalentMessage] outputting talent message for", ab.id, self.uid, self.name, self.x, self.y, game.level.map.seens(self.x, self.y)) -- debugging
 	if ab.message ~= false and not util.getval(ab.no_message, self, ab) then
 		if ab.message then
 			game.logSeen(self, "%s", self:useTalentMessage(ab))