Re: a nice cavern filled with lava
Posted: Tue Jul 28, 2015 10:29 pm
That's pretty damn hawt! Pun intended
Official Legend of Grimrock Forums
http://grimrock.net/forum/
Code: Select all
defineObject{
name = "lava_effects",
components = {
{ class = "Light",
offset = vec(0, -0.5, 0),
range = 6,
color = vec(2.8, 1.2, 0.7),
brightness = 7,
castShadow = true,
shadowMapSize = 64,
staticShadows = true,
staticShadowDistance = 0, -- use static shadows always
},
{ class = "Particle",
particleSystem = "lava_effects",
offset = vec(0, -0.4, 0),
},
{
class = "TileDamager",
attackPower = 3,
damageType = "fire",
repeatCount = math.huge,
repeatDelay = 1,
onInit = function(self)
if self.go.map:getElevation(self.go.x, self.go.y) < self.go.elevation then
spawn("under_lava_effects", self.go.level, self.go.x, self.go.y, self.go.facing, self.go.elevation-1)
end
end,
},
{ class = "Timer",
timerInterval = 1,
triggerOnStart = true,
onActivate = function(self)
spawn("magma_golem_meteor_impact_ground", self.go.level, self.go.x, self.go.y, self.go.facing, self.go.elevation-1)
self:setTimerInterval(300*(0.1+0.9*math.random()))
end,
onInit = function(self)
self:setTimerInterval(300*math.random())
end,
},
},
placement = "floor",
editorIcon = 88,
}
defineObject{
name = "under_lava_effects",
components = {
{ class = "Particle",
particleSystem = "under_lava_effects",
},
{
class = "TileDamager",
attackPower = 15,
damageType = "fire",
repeatCount = math.huge,
repeatDelay = 1,
onInit = function(self)
if self.go.map:getElevation(self.go.x, self.go.y) < self.go.elevation then
spawn("under_lava_effects", self.go.level, self.go.x, self.go.y, self.go.facing, self.go.elevation-1)
end
end,
},
},
placement = "floor",
editorIcon = 88,
}
defineObject{
name = "lava_surface",
components = {
{
class = "Model",
model = "assets/models/env/ocean_water.fbx",
material = "lava_surface",
offset = vec(0, -0.4, 0),
},
{
class = "WaterSurface",
planeY = -0.4,
reflectionColor = vec(1.5, 0.9, 0.27) * 0.9,
refractionColor = vec(1.5,1.0,0.5),
},
},
placement = "floor",
dontAdjustHeight = true,
editorIcon = 264,
reflectionMode = "never",
}
defineObject{
name = "lava_surface_tiles",
baseObject = "base_floor_decoration",
components = {
{
-- updates global reflection and refraction maps
class = "WaterSurface",
planeY = -0.4,
fogColor = math.saturation(vec(0.26, 0.09, 0.042), 0.5) * 0.5,
fogDensity = 0.4,
reflectionColor = vec(1.5, 0.9, 0.27) * 0.9,
refractionColor = vec(1.5,1.0,0.5),
},
{
-- builds a continuous mesh from underwater tiles
class = "WaterSurfaceMesh",
material = "lava_surface_tiles",
underwaterMaterial = "water_surface_underwater",
offset = vec(0, -0.4, 0),
},
},
dontAdjustHeight = true,
editorIcon = 264,
}
defineMaterial{
name = "lava_surface",
shader = "ocean_water",
diffuseMap = "mod_assets/textures/env/lava_dif.tga",
normalMap = "assets/textures/env/ocean_normal.tga",
displacementMap = "assets/textures/env/ocean_disp.tga",
doubleSided = true,
--lighting = true,
alphaTest = false,
--castShadow = true,
blendMode = "Opaque",
textureAddressMode = "Wrap",
glossiness = 0,
depthBias = 0,
texOffset = 0,
foamOffset = 0,
foamAmount = 0,
waveAmplitude = 50,
onUpdate = function(self, time)
self:setTexcoordScaleOffset(1, 1, math.cos(time*0.15)*0.5, math.sin(time*0.15)*0.5)
end,
}
defineMaterial{
name = "lava_surface_tiles",
shader = "ocean_water",
diffuseMap = "mod_assets/textures/env/lava_dif.tga",
normalMap = "assets/textures/env/ocean_normal.tga",
displacementMap = "assets/textures/env/ocean_disp.tga",
doubleSided = false,
--lighting = true,
alphaTest = false,
--castShadow = true,
blendMode = "Opaque",
textureAddressMode = "Wrap",
glossiness = 0,
depthBias = 0,
texOffset = 0,
foamOffset = 0,
foamAmount = 0,
waveAmplitude = 0.5,
onUpdate = function(self, time)
self:setTexcoordScaleOffset(1, 1, math.cos(time*0.15)*0.5, math.sin(time*0.15)*0.5)
end,
}
defineParticleSystem{
name = "lava_effects",
emitters = {
-- stars
{
emissionRate = 40,
emissionTime = 0,
maxParticles = 200,
boxMin = {-1.3, 0.0,-1.3},
boxMax = { 1.3, 0.5, 1.3},
sprayAngle = {0,360},
velocity = {0,0},
objectSpace = true,
texture = "assets/textures/particles/firefly_dif.tga",
lifetime = {0.5,5.0},
color0 = {4, 0.4, 0.2},
opacity = 1,
fadeIn = 0.1,
fadeOut = 1.0,
size = {0.05, 0.1},
gravity = {0,0.5,0},
airResistance = 0.1,
rotationSpeed = 5,
blendMode = "Additive",
},
-- flames 1
{
emissionRate = 2,
emissionTime = 0,
maxParticles = 10,
boxMin = {-1.5, -0.2,-1.5},
boxMax = { 1.5, -0.0, 1.5},
sprayAngle = {0,360},
velocity = {0,0},
objectSpace = false,
texture = "assets/textures/particles/flame.tga",
frameSize = 32,
frameCount = 40,
frameRate = 40,
lifetime = {5.0,5.0},
color0 = {4, 0.4, 0.2},
opacity = 0.5,
fadeIn = 0.5,
fadeOut = 0.5,
size = {0.5, 0.5},
gravity = {0,0.02,0},
airResistance = 0.1,
rotationSpeed = 1,
blendMode = "Additive",
},
-- flames 2
{
emissionRate = 2,
emissionTime = 0,
maxParticles = 10,
boxMin = {-1.5, -0.2,-1.5},
boxMax = { 1.5, -0.0, 1.5},
sprayAngle = {0,360},
velocity = {0,0},
objectSpace = false,
texture = "assets/textures/particles/flame.tga",
frameSize = 32,
frameCount = 40,
frameRate = 40,
lifetime = {5.0,5.0},
color0 = {4, 0.4, 0.2},
opacity = 0.5,
fadeIn = 0.5,
fadeOut = 0.5,
size = {0.5, 0.5},
gravity = {0,0.02,0},
airResistance = 0.1,
rotationSpeed = -1,
blendMode = "Additive",
},
-- smoke
{
emissionRate = 4,
emissionTime = 0,
maxParticles = 40,
boxMin = {-1.3, 0, -1.3},
boxMax = { 1.3, 1.0, 1.3},
sprayAngle = {0,20},
velocity = {0.4, 0.8},
texture = "assets/textures/particles/smoke_01.tga",
lifetime = {1,5},
color0 = {0.25, 0.20, 0.17},
opacity = 0.5,
fadeIn = 0.3,
fadeOut = 0.9,
size = {1.5, 2},
gravity = {0,0.3,0},
airResistance = 0.1,
rotationSpeed = 0.5,
blendMode = "Translucent",
},
}
}
defineParticleSystem{
name = "under_lava_effects",
emitters = {
-- fog under 1
{
emissionRate = 1,
emissionTime = 0,
maxParticles = 10,
boxMin = {-1.5, -1.0, -1.5},
boxMax = { 1.5, 2.0, 1.5},
sprayAngle = {0,360},
velocity = {0,0},
objectSpace = true,
texture = "assets/textures/particles/fog.tga",
lifetime = {10,10},
color0 = {1.75,0.6,0.2},
opacity = 1,
fadeIn = 2.5,
fadeOut = 2.5,
size = {5, 5},
gravity = {0,0,0},
airResistance = 0.5,
rotationSpeed = -0.3,
blendMode = "Translucent",
},
-- fog under 2
{
emissionRate = 1,
emissionTime = 0,
maxParticles = 10,
boxMin = {-1.5, -1.0, -1.5},
boxMax = { 1.5, 2.0, 1.5},
sprayAngle = {0,360},
velocity = {0,0},
objectSpace = true,
texture = "assets/textures/particles/fog.tga",
lifetime = {10,10},
color0 = {1.75,0.6,0.2},
opacity = 1,
fadeIn = 2.5,
fadeOut = 2.5,
size = {5, 5},
gravity = {0,0,0},
airResistance = 0.5,
rotationSpeed = 0.3,
blendMode = "Translucent",
},
}
}
Code: Select all
defineObject{
name = "lava_effects",
components = {
{ class = "Light",
offset = vec(0, -0.5, 0),
range = 6,
color = vec(2.8, 1.2, 0.7),
brightness = 50,
castShadow = true,
shadowMapSize = 64,
staticShadows = true,
staticShadowDistance = 0, -- use static shadows always
},
{ class = "Particle",
particleSystem = "lava_effects",
offset = vec(0, -0.4, 0),
},
{
class = "TileDamager",
attackPower = 3,
damageType = "fire",
repeatCount = math.huge,
repeatDelay = 1,
onInit = function(self)
if self.go.map:getElevation(self.go.x, self.go.y) < self.go.elevation then
spawn("under_lava_effects", self.go.level, self.go.x, self.go.y, self.go.facing, self.go.elevation-1)
end
end,
},
{ class = "Timer",
timerInterval = 1,
triggerOnStart = true,
onActivate = function(self)
spawn("magma_golem_meteor_impact_ground", self.go.level, self.go.x, self.go.y, self.go.facing, self.go.elevation-1)
self:setTimerInterval(300*(0.1+0.9*math.random()))
end,
onInit = function(self)
self:setTimerInterval(300*math.random())
end,
},
{ class = "Sound",
sound = "fire_pit",
volume = 0.5,
},
},
placement = "floor",
editorIcon = 88,
}
defineObject{
name = "under_lava_effects",
components = {
{ class = "Particle",
particleSystem = "under_lava_effects",
},
{
class = "TileDamager",
attackPower = 15,
damageType = "fire",
repeatCount = math.huge,
repeatDelay = 1,
onInit = function(self)
if self.go.map:getElevation(self.go.x, self.go.y) < self.go.elevation then
spawn("under_lava_effects", self.go.level, self.go.x, self.go.y, self.go.facing, self.go.elevation-1)
end
end,
},
},
placement = "floor",
editorIcon = 88,
}
defineObject{
name = "lava_surface",
components = {
{
class = "Model",
model = "assets/models/env/ocean_water.fbx",
material = "lava_surface",
offset = vec(0, -0.4, 0),
},
},
placement = "floor",
dontAdjustHeight = true,
editorIcon = 264,
reflectionMode = "never",
}
defineObject{
name = "lava_surface_tiles",
baseObject = "base_floor_decoration",
components = {
{
-- updates global reflection and refraction maps
class = "WaterSurface",
planeY = -0.4,
fogColor = math.saturation(vec(0.26, 0.09, 0.042), 0.5) * 0.5,
fogDensity = 0.4,
reflectionColor = vec(1.5, 0.9, 0.27) * 0.9,
refractionColor = vec(1.5,1.0,0.5),
},
{
-- builds a continuous mesh from underwater tiles
class = "WaterSurfaceMesh",
material = "lava_surface_tiles",
underwaterMaterial = "water_surface_underwater",
offset = vec(0, -0.4, 0),
},
},
dontAdjustHeight = true,
editorIcon = 264,
}
defineMaterial{
name = "lava_surface",
shader = "ocean_water",
diffuseMap = "mod_assets/textures/env/lava_dif.tga",
normalMap = "assets/textures/env/ocean_normal.tga",
displacementMap = "assets/textures/env/ocean_disp.tga",
doubleSided = true,
--lighting = true,
alphaTest = false,
--castShadow = true,
blendMode = "Opaque",
textureAddressMode = "Wrap",
glossiness = 0,
depthBias = 0,
texOffset = 0,
foamOffset = 0,
foamAmount = 0,
waveAmplitude = 50,
onUpdate = function(self, time)
self:setTexcoordScaleOffset(1, 1, math.cos(time*0.15)*0.25, math.sin(time*0.15)*0.25)
end,
}
defineMaterial{
name = "lava_surface_tiles",
shader = "ocean_water",
diffuseMap = "mod_assets/textures/env/lava_dif.tga",
normalMap = "assets/textures/env/ocean_normal.tga",
displacementMap = "assets/textures/env/ocean_disp.tga",
doubleSided = false,
--lighting = true,
alphaTest = false,
--castShadow = true,
blendMode = "Opaque",
textureAddressMode = "Wrap",
glossiness = 0,
depthBias = 0,
texOffset = 0,
foamOffset = 0,
foamAmount = 0,
waveAmplitude = 0.5,
onUpdate = function(self, time)
self:setTexcoordScaleOffset(1, 1, math.cos(time*0.15)*0.25, math.sin(time*0.15)*0.25)
end,
}
defineParticleSystem{
name = "lava_effects",
emitters = {
-- stars
{
emissionRate = 40,
emissionTime = 0,
maxParticles = 200,
boxMin = {-1.3, 0.0,-1.3},
boxMax = { 1.3, 0.5, 1.3},
sprayAngle = {0,360},
velocity = {0,0},
objectSpace = true,
texture = "assets/textures/particles/firefly_dif.tga",
lifetime = {0.5,5.0},
color0 = {4, 0.4, 0.2},
opacity = 1,
fadeIn = 0.1,
fadeOut = 1.0,
size = {0.05, 0.1},
gravity = {0,0.5,0},
airResistance = 0.1,
rotationSpeed = 5,
blendMode = "Additive",
},
-- flames 1
{
emissionRate = 5,
emissionTime = 0,
maxParticles = 5,
boxMin = {-1.5, -0.2,-1.5},
boxMax = { 1.5, -0.0, 1.5},
sprayAngle = {0,360},
velocity = {0,0},
objectSpace = false,
texture = "assets/textures/particles/flame.tga",
frameSize = 32,
frameCount = 40,
frameRate = 60,
lifetime = {0.5,1.0},
color0 = {4, 0.4, 0.2},
opacity = 0.5,
fadeIn = 0.5,
fadeOut = 0.5,
size = {0.5, 0.5},
gravity = {0,0.02,0},
airResistance = 0.1,
rotationSpeed = 1,
blendMode = "Additive",
},
-- flames 2
{
emissionRate = 5,
emissionTime = 0,
maxParticles = 5,
boxMin = {-1.5, -0.2,-1.5},
boxMax = { 1.5, -0.0, 1.5},
sprayAngle = {0,360},
velocity = {0,0},
objectSpace = false,
texture = "assets/textures/particles/flame.tga",
frameSize = 32,
frameCount = 40,
frameRate = 60,
lifetime = {0.5,1.0},
color0 = {4, 0.4, 0.2},
opacity = 0.5,
fadeIn = 0.5,
fadeOut = 0.5,
size = {0.5, 0.5},
gravity = {0,0.02,0},
airResistance = 0.1,
rotationSpeed = -1,
blendMode = "Additive",
},
-- smoke
{
emissionRate = 4,
emissionTime = 0,
maxParticles = 40,
boxMin = {-1.3, 0, -1.3},
boxMax = { 1.3, 1.0, 1.3},
sprayAngle = {0,20},
velocity = {0.4, 0.8},
texture = "assets/textures/particles/smoke_01.tga",
lifetime = {1,5},
color0 = {0.25, 0.20, 0.17},
opacity = 0.5,
fadeIn = 0.3,
fadeOut = 0.9,
size = {1.5, 2},
gravity = {0,0.3,0},
airResistance = 0.1,
rotationSpeed = 0.5,
blendMode = "Translucent",
},
}
}
defineParticleSystem{
name = "under_lava_effects",
emitters = {
-- fog under 1
{
emissionRate = 1,
emissionTime = 0,
maxParticles = 10,
boxMin = {-1.5, -0.5, -1.5},
boxMax = { 1.5, 2.5, 1.5},
sprayAngle = {0,360},
velocity = {0,0},
objectSpace = true,
texture = "assets/textures/particles/fog.tga",
lifetime = {10,10},
color0 = {1.75,0.6,0.2},
opacity = 1,
fadeIn = 2.5,
fadeOut = 2.5,
size = {5, 5},
gravity = {0,0,0},
airResistance = 0.5,
rotationSpeed = -0.3,
blendMode = "Translucent",
},
-- fog under 2
{
emissionRate = 1,
emissionTime = 0,
maxParticles = 10,
boxMin = {-1.5, -0.5, -1.5},
boxMax = { 1.5, 2.5, 1.5},
sprayAngle = {0,360},
velocity = {0,0},
objectSpace = true,
texture = "assets/textures/particles/fog.tga",
lifetime = {10,10},
color0 = {1.75,0.6,0.2},
opacity = 1,
fadeIn = 2.5,
fadeOut = 2.5,
size = {5, 5},
gravity = {0,0,0},
airResistance = 0.5,
rotationSpeed = 0.3,
blendMode = "Translucent",
},
}
}
I am talking about the SHADER called "wall_fire". It takes a displacement map and a "time" parameter (look at the wall_fire material definition), and causes a rippling effect. You can't write your own shaders but you can make your own displacement map and control the speed in the onUpdate hook.AndakRainor wrote:Do you use lava in your mods ? Don't you think the wall_fire model is a little too static and makes tiles too visible ?