diff --git a/game/engine/Entity.lua b/game/engine/Entity.lua
index f915fd38cffcfa058c492e42dad6ce6519b519b1..dff7b84f169d46aa7481428a175b7c4481b224a7 100644
--- a/game/engine/Entity.lua
+++ b/game/engine/Entity.lua
@@ -195,7 +195,8 @@ function _M:makeMapObject(tiles, idx)
 
 	-- Setup shader
 	if tiles.use_images and core.shader.active() and self.shader then
-		self._mo:shader(Shader.new(self.shader, self.shader_args).shad)
+		local shad = Shader.new(self.shader, self.shader_args)
+		if shad.shad then self._mo:shader(shad.shad) end
 	end
 
 	return self._mo, self.z
diff --git a/game/engine/Shader.lua b/game/engine/Shader.lua
index 106fe37d28c3309eb7e7dcc9aeccf6a6b3248248..4ca66b1b07da767784cae1c307c4a403ca60574d 100644
--- a/game/engine/Shader.lua
+++ b/game/engine/Shader.lua
@@ -101,7 +101,7 @@ function _M:createProgram(def)
 	local shad = core.shader.newProgram()
 	if def.vert then shad:attach(self:getVertex(def.vert)) end
 	if def.frag then shad:attach(self:getFragment(def.frag)) end
-	shad:compile()
+	if not shad:compile() then return nil end
 	return shad
 end
 
@@ -119,9 +119,10 @@ function _M:loaded()
 		_M.progs[self.totalname] = self:createProgram(def)
 
 		self.shad = _M.progs[self.totalname]
-
-		for k, v in pairs(def.args) do
-			self:setUniform(k, v)
+		if self.shad then
+			for k, v in pairs(def.args) do
+				self:setUniform(k, v)
+			end
 		end
 	end
 end
diff --git a/src/shaders.c b/src/shaders.c
index a913a560812380e858bc5d890e544f702430331c..0ece12d5fa0b87025a3ff085a7b325c168f9cab9 100644
--- a/src/shaders.c
+++ b/src/shaders.c
@@ -140,7 +140,8 @@ static int program_compile(lua_State *L)
 		}
 	}
 #endif
-	return 0;
+	lua_pushboolean(L, TRUE);
+	return 1;
 }
 
 static int program_attach(lua_State *L)