Here is some fake reflection kinda thing added.
Rem ***** Main Source File *****
Autocam Off : Color backdrop Rgb(50, 50, 50)
Set Directional Light 0, 0, 1, 0
REM TYPES
Type vectors
x As Float
y As Float
z As Float
endType
Type particleProperties
pos As vectors
ang As vectors
vel As vectors
size As vectors
endType
Type colorProperties
r As Float
g As Float
b As Float
endType
Type explosionParticle
num As Integer
prop As particleProperties
fade As Float
diff As colorProperties
endType
REM SET MAXIMUM DIMS
DIM explode(10, 200) As explosionParticle
DIM splash(10, 200) As explosionParticle
imgSmoke = createSmoke(150, 150, 250, 64)
whiteSmoke = freeImage()
make memblock 1,12+64*64*4
write memblock dword 1,0,64
write memblock dword 1,4,64
write memblock dword 1,8,32
for x=0 to 63
for y=0 to 63
pos=12+(x+y*64)*4
dist#=sqrt( (x-32)^2 + (y-32)^2 )
if dist#>31
alpha=0
else
alpha=(255-dist#*8)/(1+rnd(0.5))
endif
r=rnd(55)
g=rnd(55)
b=200+rnd(55)
write memblock byte 1,pos,b
write memblock byte 1,pos+1,g
write memblock byte 1,pos+2,r
write memblock byte 1,pos+3,alpha
next y
next x
make image from memblock whiteSmoke,1
Delete memblock 1
Rem Make Walls
objFloor = freeObject() : Make Object Plain objFloor, 1000, 1000 : xRotate Object objFloor, 90
`Make Object Box objFloor, 10, 1, 10 :
Position Object objFloor, 0, 0, 10
Color Object objFloor, Rgb(0, 0, 200)
Set Blend Mapping On objFloor, 1, whiteSmoke, 3, 24
Set Blend Mapping On objFloor, 2, whiteSmoke, 3, 26
Set Blend Mapping On objFloor, 3, whiteSmoke, 3, 4
`Texture Object objFloor, whiteSmoke
Scale Object Texture objFloor, 20, 20
Ghost Object On objFloor, 0
Disable Object zWrite objFloor
objFloor2 = freeObject() : Clone Object objFloor2, objFloor : xRotate Object objFloor2, 90
Position Object objFloor2, 0, -2, 10
objCeil = freeObject() : Make Object Box objCeil, 100, 1, 10 : Position Object objCeil, 0, 20, 15
Color Object objCeil, Rgb(0, 0, 250)
objWater = freeObject() : Make Object Plain objWater, 16, 20 : Position Object objWater, 0, 10, 10
Color Object objWater, Rgb(0, 0, 250) : Ghost Object On objWater, 2
Texture Object objWater, whiteSmoke : Disable Object Zwrite objWater
Scale Object Texture objWater, 2, 1
o = freeObject()
For wat = o To o+5
Instance Object wat, objWater
Position Object wat, 0, 10, 10-((wat-o)*0.1)
Next wat
Position Camera 30, 10, 0 : Point Camera 0, 10, 10
ax# = camera angle x() : ay# = camera Angle y()
REM MAIN LOOP
Sync Rate 34 : Sync On
DO
REM MOVE CAMERA
ax# = wrapvalue(ax# + mousemovey())
ay# = wrapvalue(ay# + mousemovex())
rotate camera ax#, ay#, 0.0
if mouseclick()=1 then move camera 1
if mouseclick()=2 then move camera -1
exp1 = particleExplosion(1, 200, -4, 20, 10, exp1, imgSmoke, -1)
spl1 = particleSplash(1, 200, -4, 0, 10, spl1, imgSmoke)
exp2 = particleExplosion(2, 200, 4, 20, 10, exp2, imgSmoke, -1)
spl2 = particleSplash(2, 200, 4, 0, 10, spl2, imgSmoke)
exp3 = particleExplosion(3, 200, -4, -20, 10, exp3, imgSmoke, 1)
exp4 = particleExplosion(4, 200, 4, -20, 10, exp4, imgSmoke, 1)
Scroll Object Texture objWater, 0.0, -0.01
ang# = wrapvalue(ang# + 1)
Scroll Object Texture objFloor, Sin(ang#)*0.001, Cos(ang#)*0.001
Scroll Object Texture objFloor2, Sin(ang#)*0.001, Cos(ang#)*-0.001
REM INFO
set cursor 0, 0
print "USE MOUSE TO MOVE AROUND"
Print " TRY LOOKING AT THE WATER CONTACT POINT FROM DIFFERENT ANGLES"
Print " you will see this glow at the contact point"
Sync
Loop
Function particleExplosion(n As Integer, amount As Integer, x As Float, y As Float, z As Float, ctr As Integer, img As Integer, direction#)
If explode(n, 0).num = 0
obj = freeObject()
For f = obj To obj + amount
i = f-obj
explode(n, i).num = f
explode(n, i).prop.pos.x = x
explode(n, i).prop.pos.y = y
explode(n, i).prop.pos.z = z
explode(n, i).prop.size.x = 2.0
explode(n, i).prop.size.y = 2.0
explode(n, i).prop.size.z = 2.0
explode(n, i).prop.ang.x = 0.0
explode(n, i).prop.ang.y = 0.0
explode(n, i).prop.ang.z = 0.0
Make Object Plain explode(n, i).num, explode(n, i).prop.size.x, explode(n, i).prop.size.y
Texture Object explode(n, i).num, img
Hide Object explode(n, i).num
Set Object Cull explode(n, i).num, 1
Set Object Fog explode(n, i).num, 0
`Set Object Light explode(n, i).num, 0
Ghost Object On explode(n, i).num, 2
Set Object Transparency explode(n, i).num, 3
Disable Object Zwrite explode(n, i).num
`Set Alpha Mapping On explode(n, i).num, 50
Next f
EndIf
For f = 0 To amount
explode(n, f).prop.size.x = explode(n, f).prop.size.x + 1.5
explode(n, f).prop.size.y = explode(n, f).prop.size.y + 1.5
explode(n, f).prop.size.z = explode(n, f).prop.size.z + 1.5
explode(n, f).prop.pos.x = explode(n, f).prop.pos.x + explode(n, f).prop.vel.x
explode(n, f).prop.pos.y = explode(n, f).prop.pos.y + explode(n, f).prop.vel.y
explode(n, f).prop.pos.z = explode(n, f).prop.pos.z + explode(n, f).prop.vel.z
`Fade particle value
explode(n, f).fade = explode(n, f).fade - (200 / amount * 2)
`Diffuse Alter
If explode(n, f).diff.r =< 250 Then explode(n, f).diff.r = explode(n, f).diff.r + 0.8
If explode(n, f).diff.g =< 250 Then explode(n, f).diff.g = explode(n, f).diff.g + 0.4
explode(n, f).diff.b = explode(n, f).diff.b
`Position, scale and fade particle object
Position Object explode(n, f).num, explode(n, f).prop.pos.x, explode(n, f).prop.pos.y, explode(n, f).prop.pos.z
Scale Object explode(n, f).num, explode(n, f).prop.size.x, explode(n, f).prop.size.y, 100
Set Object Diffuse explode(n, f).num, Rgb(explode(n, f).diff.r, explode(n, f).diff.g, explode(n, f).diff.b)
`Fade Object explode(n, f).num, explode(n, f).fade
`Point at camera
Set Object To Camera Orientation explode(n, f).num
Next f
Inc ctr
If ctr > amount Then ctr = 1
If explode(n, ctr).fade =< 0
`Position
explode(n, ctr).prop.pos.x = x + Rnd(4) - 2
explode(n, ctr).prop.pos.y = y
explode(n, ctr).prop.pos.z = z
`Scale
explode(n, ctr).prop.size.x = 50
explode(n, ctr).prop.size.y = 50
explode(n, ctr).prop.size.z = 50
`Velocity (randomize)
explode(n, ctr).prop.vel.x = 0.0
explode(n, ctr).prop.vel.y = 0.1*direction#
explode(n, ctr).prop.vel.z = Rnd(100) / 100000.0 * -1
`Fade
explode(n, ctr).fade = 200
`Color
explode(n, ctr).diff.r = 50
explode(n, ctr).diff.g = 50
explode(n, ctr).diff.b = 0
`Show the particle
Show Object explode(n, ctr).num
endIf
endFunction ctr
Function particleSplash(n As Integer, amount As Integer, x As Float, y As Float, z As Float, ctr As Integer, img As Integer)
If splash(n, 0).num = 0
obj = freeObject()
For f = obj To obj + amount
i = f-obj
splash(n, i).num = f
splash(n, i).prop.pos.x = x
splash(n, i).prop.pos.y = y
splash(n, i).prop.pos.z = z
splash(n, i).prop.size.x = 2.0
splash(n, i).prop.size.y = 2.0
splash(n, i).prop.size.z = 2.0
splash(n, i).prop.ang.x = 0.0
splash(n, i).prop.ang.y = 0.0
splash(n, i).prop.ang.z = 0.0
Make Object Plain splash(n, i).num, splash(n, i).prop.size.x, splash(n, i).prop.size.y
Texture Object splash(n, i).num, img
Hide Object splash(n, i).num
Set Object Cull splash(n, i).num, 1
Set Object Fog splash(n, i).num, 0
`Set Object Light splash(n, i).num, 0
Ghost Object On splash(n, i).num, 2
Set Object Transparency splash(n, i).num, 3
Disable Object Zwrite splash(n, i).num
`Set Alpha Mapping On splash(n, i).num, 50
Next f
EndIf
For f = 0 To amount
splash(n, f).prop.size.x = splash(n, f).prop.size.x + 1.5
splash(n, f).prop.size.y = splash(n, f).prop.size.y + 1.5
splash(n, f).prop.size.z = splash(n, f).prop.size.z + 1.5
splash(n, f).prop.pos.x = splash(n, f).prop.pos.x + splash(n, f).prop.vel.x
splash(n, f).prop.pos.y = splash(n, f).prop.pos.y + splash(n, f).prop.vel.y
splash(n, f).prop.pos.z = splash(n, f).prop.pos.z + splash(n, f).prop.vel.z
`Fade particle value
splash(n, f).fade = splash(n, f).fade - (200 / amount * 2)
`Diffuse Alter
If splash(n, f).diff.r =< 250 Then splash(n, f).diff.r = splash(n, f).diff.r + 0.8
If splash(n, f).diff.g =< 250 Then splash(n, f).diff.g = splash(n, f).diff.g + 0.4
splash(n, f).diff.b = splash(n, f).diff.b
`Position, scale and fade particle object
Position Object splash(n, f).num, splash(n, f).prop.pos.x, splash(n, f).prop.pos.y, splash(n, f).prop.pos.z
Scale Object splash(n, f).num, splash(n, f).prop.size.x, splash(n, f).prop.size.y, 100
Set Object Diffuse splash(n, f).num, Rgb(splash(n, f).diff.r, splash(n, f).diff.g, splash(n, f).diff.b)
`Fade Object splash(n, f).num, splash(n, f).fade
`Point at camera
Set Object To Camera Orientation splash(n, f).num
Next f
Inc ctr
If ctr > amount Then ctr = 1
If splash(n, ctr).fade =< 0
`Position
splash(n, ctr).prop.pos.x = x + Rnd(4) - 2
splash(n, ctr).prop.pos.y = y
splash(n, ctr).prop.pos.z = z
`Scale
splash(n, ctr).prop.size.x = 50
splash(n, ctr).prop.size.y = 50
splash(n, ctr).prop.size.z = 50
`Velocity (randomize)
splash(n, ctr).prop.vel.x = Rnd(100) / 1000.0 - 0.05
splash(n, ctr).prop.vel.y = Rnd(100) / 5000.0 - 0.01
splash(n, ctr).prop.vel.z = Rnd(100) / 1000.0 - 0.05
`Fade
splash(n, ctr).fade = 200
`Color
splash(n, ctr).diff.r = 50
splash(n, ctr).diff.g = 50
splash(n, ctr).diff.b = 0
`Show the particle
Show Object splash(n, ctr).num
endIf
endFunction ctr
Function createSmoke(r As Byte, g As Byte, b As Byte, s As Integer)
Create Bitmap 1, s, s
Ink Rgb(r, g, b), 0
For x = 1 To 2000
ang = Rnd(360) : rad = Rnd((s/2)-5) : Dot (s/2) + (Sin(ang)*rad), (s/2) + (Cos(ang)*rad)
Next x
Blur Bitmap 1, 4
img = freeImage() : Get Image img, 0, 0, s, s
Delete Bitmap 1
endFunction img
Function freeObject()
Repeat
Inc i
Until Object Exist(i) = 0
EndFunction i
Function freeImage()
Repeat
Inc i
Until Image Exist(i) = 0
EndFunction i
There is always one more imbecile than you counted on.