REM Project: Hunting REM Created: 10/11/2005 20:33:09 REM REM ***** Main Source File ***** REM sync on sync rate 60 autocam off set camera range 0.5,500 global speed# = 0.4 global turnspeed# = 0.2 global anglex# global angley# global xmovement# global zmovement# global launch global ClickBounce global CurrentSpear = 0 global state = 0 global targetX global targetY global targetZ global beasthealth = 100 global playerhealth = 100 type XYZ X as Float Y as Float Z as Float endtype type projectile Pos as XYZ Velocity as XYZ Rot as XYZ Object as Integer endtype #CONSTANT NUMPARTICLES 128 #CONSTANT TIMEPASSED 0.016666 GLOBAL currentfreeparticle GLOBAL debouncemouseclick GLOBAL currenteffect type vertex X as float Y as float Z as float endtype type redgreenblue Red as float Green as float Blue as float endtype sync on sync rate 60 type particle Pos as vertex PosVel as vertex PosAcc as vertex Rot as vertex RotVel as vertex Scale as Float ScaleVel as Float Lifetime as Float Active as Boolean Gravity as Boolean Facing as Boolean UOffset as Float VOffset as Float Object as Integer ColourBlend as Boolean Colour as redgreenblue ColourVel as redgreenblue endtype `************** dim Particles(NUMPARTICLES) as particle `************** type particleemitter Pos as vertex Lifetime as Float Active as Boolean Repeatrate as Float Repeattime as Float EffectType as Integer endtype `************** dim ParticleEmitters(0) as particleemitter `************** initialise_particles() currenteffect = 1 create bitmap 2,8,8 set current bitmap 2 ink rgb(150,80,10),0 box 0,0,8,8 ink rgb(255,128,50),0 line 0,0,4,0 ink rgb(30,15,0),0 line 3,3,8,3 get image 1,0,0,8,8 ink rgb(60,60,60),0 box 0,0,8,8 for i = 0 to 3 dot rnd(7),rnd(7),rgb(128,128,128) next i get image 2,0,0,8,8 ink rgb(0,100,0),0 box 0,0,8,8 get image 3,0,0,8,8 ink 0,0 box 0,0,8,8 ink rgb(255,255,255),0 for i = 0 to 4 dot rnd(8),rnd(8) next i get image 4,0,0,8,8 delete bitmap 2 set current bitmap 0 rem ***************** SPEAR MAKING ***************** tempspear = 43 make object cylinder tempspear,0.10 scale object tempspear,100,1800,100 position object tempspear,15,5,10 tempspear2 = 42 make object cylinder tempspear2,0.10 scale object tempspear2,100,1800,100 position object tempspear2,15,5,10 speardummy2 = 40 make object sphere speardummy2,0.3,3,3 scale object speardummy2,100,200,100 make mesh from object 3,tempspear delete object tempspear add limb speardummy2,1,3 link limb speardummy2,0,1 offset limb speardummy2,1,0,-1,0 texture limb speardummy2,1,1 texture limb speardummy2,0,2 global spear as projectile spear.Object = 40 position object spear.Object, 1,0,0 set object cull spear.Object,0 rotate object spear.Object,90,0,0 fix object pivot spear.Object speardummy = 41 make object sphere speardummy,0.3,3,3 scale object speardummy,100,200,100 make mesh from object 2,tempspear2 delete object tempspear2 add limb speardummy,1,2 link limb speardummy,0,1 offset limb speardummy,1,0,-1,0 texture limb speardummy,1,1 texture limb speardummy,0,2 rem ***************** END OF SPEAR MAKING temp = 10 make object sphere temp,8 position object temp,0,5,20 scale object temp,100,90,100 temp2 = 11 make object sphere temp2,4 position object temp2,0,4,16 temp3 = 12 temp4 = 13 temp5 = 14 temp6 = 15 make object cylinder temp3,4 position object temp3,1.5,2,18.5 scale object temp3,60,100,60 make object cylinder temp4,4 position object temp4,-1.5,2,18.5 scale object temp4,60,100,60 make object cylinder temp5,4 position object temp5,1.5,2,22 scale object temp5,60,100,60 make object cylinder temp6,4 position object temp6,-1.5,2,22 scale object temp6,60,100,60 texture object temp,3 texture object temp2,3 texture object temp3,3 texture object temp4,3 texture object temp5,3 texture object temp6,3 make mesh from object 10,temp2 `Head make mesh from object 11,temp3 `Leg make object cube 16,1 make mesh from object 12,16 `Dummy object delete object 16 add limb temp,1,10 link limb temp,0,1 offset limb temp,1,0,-1,4 delete object temp2 add limb temp,2,12 `add a dummy object for first leg - limb2 link limb temp,0,2 `adds to the body limb (0) offset limb temp,2,1.5,-1,-1.5 add limb temp,3,11 link limb temp,2,3 offset limb temp,3,0,-2.5,0 delete object temp3 add limb temp,4,12 `add dummy for second leg (front right) - limb 4 link limb temp,0,4 `add to body (0) offset limb temp,4,-1.5,-1,-1.5 add limb temp,5,11 `second leg object (5) link limb temp,4,5 offset limb temp,5,0,-2.5,0 delete object temp4 add limb temp,6,12 link limb temp,0,6 offset limb temp,6,1.5,-1,2 add limb temp,7,11 link limb temp,6,7 offset limb temp,7,0,-2.5,0 delete object temp5 add limb temp,8,12 link limb temp,0,8 offset limb temp,8,-1.5,-1,2 add limb temp,9,11 link limb temp,8,9 offset limb temp,9,0,-2.5,0 delete object temp6 texture limb temp,3,3 texture limb temp,5,3 texture limb temp,7,3 texture limb temp,9,3 texture limb temp,1,3 beastie = temp set object collision on beastie set object collision to polygons beastie make object plain 3,1000,1000 rotate object 3,-90,0,0 color object 3,rgb(0,128,0) texture object 3,3 color backdrop rgb(30,40,255) global thrownspear as projectile thrownspear.Object = 41 position object thrownspear.Object, spear.Pos.X, spear.Pos.Y, spear.Pos.Z set object cull thrownspear.Object,0 rotate object thrownspear.Object,90,0,0 fix object pivot thrownspear.Object rotate object thrownspear.Object, object angle x(spear.Object),object angle y(spear.Object),object angle z(spear.Object) hide object thrownspear.Object hide mouse `********************MAIN LOOP******************* do MouseLook() Position_HUDSpear() throwspear() `rotate the beastie `yrotate object 10,wrapvalue(object angle y(10)+1) text 5,30,"Enemy health" text screen width()-110,30,"Player health" ink 0,0 box 0+1,1,100+8,24 box screen width()-100-9,1,screen width()-1,24 ink rgb(255,0,0),0 box 0+5,5,beasthealth+5,20 box screen width()-playerhealth-5,5,screen width()-5,20 `print "Camera Pos:",camera position x(),",",camera position y(),",",camera position z() `print "Launch Pos:",tempX#,", ",tempY#,", ",tempZ# `print "Spear Pos:",object position x(thrownspear.Object),", ",object position y(thrownspear.Object),", ",object position z(thrownspear.Object) `print "Beasty rotation:",object angle y(2) disttotarg = get_distancesquaredpos(10,targetX,targetY,targetZ) if state = 0 targetX = camera position x() targetY = camera position y() targetZ = camera position z() state = 1 endif if state = 1 if (disttotarg > 50) beastie_move(10,targetX,targetY,targetZ) rotate limb temp,2,sin(timer()/3)*9,0,0 rotate limb temp,4,-sin(timer()/3)*9,0,0 rotate limb temp,6,-sin(timer()/3)*9,0,0 rotate limb temp,8,sin(timer()/3)*9,0,0 else state = 0 endif endif distfromplayer = get_distancesquaredpos(10,camera position x(),camera position y(),camera position z()) if distfromplayer < 50 playerhealth = playerhealth - rnd(1) endif `if distfromplayer < 700 `rotate camera camera angle x()+rnd((700-dist)/100)-((700-dist)/200), camera angle y()+rnd((700-dist)/100)-((700-dist)/200),0 `endif update_emitters() update_particles() if playerhealth < 0 box 0,0,screen width(),screen height() ink 0,0 for i = 0 to 50 text rnd(screen width()),rnd(screen height()),"YOU DIED" next i sync wait key exit endif if beasthealth < 0 ink 0,0 for i = 0 to 50 ink rgb(rnd(255),rnd(255),rnd(255)),0 text rnd(screen width()),rnd(screen height()),"YOU WON!" next i sync wait key exit endif sync loop `****************END OF MAIN LOOP************** `Position the Spear close enough to the player to look held in the hand. function Position_HUDSpear() AtX# = -0.6 `The offset for the spear object. AtY# = 0.1 AtZ# = 1.5 temp# = (Cos( Camera Angle X()) * AtY#) - (Sin(Camera Angle X()) * AtZ#) AtZ# = (Sin(Camera Angle X()) * AtY#) + (Cos(Camera Angle X()) * AtZ#) AtY# = temp# temp# = (Cos(Camera Angle Y()) * AtX#) + (Sin(Camera Angle Y()) * AtZ#) AtZ# = (Cos(Camera Angle Y()) * AtZ#) - (Sin(Camera Angle Y()) * AtX#) AtX# = temp# spear.Pos.X = Camera Position X() + AtX# spear.Pos.Y = Camera Position Y() + AtY# spear.Pos.Z = Camera Position Z() + AtZ# Position Object spear.Object, spear.Pos.X, spear.Pos.Y, spear.Pos.Z Rotate Object spear.Object, wrapvalue(Camera Angle X()-20), Camera Angle Y(), Camera Angle Z() endfunction function MouseLook() position mouse 320,240 `forwards (w) if keystate(17)=1 xmovement# = newxvalue(xmovement#,wrapvalue(camera angle y()),speed#) zmovement# = newzvalue(zmovement#,wrapvalue(camera angle y()),speed#) endif `backwards (s) if keystate(31)=1 xmovement# = newxvalue(xmovement#,wrapvalue(camera angle y()-180),speed#) zmovement# = newzvalue(zmovement#,wrapvalue(camera angle y()-180),speed#) endif `left (a) if keystate(30)=1 xmovement# = newxvalue(xmovement#,wrapvalue(camera angle y()-90),speed#) zmovement# = newzvalue(zmovement#,wrapvalue(camera angle y()-90),speed#) endif `right (d) if keystate(32)=1 xmovement# = newxvalue(xmovement#,wrapvalue(camera angle y()+90),speed#) zmovement# = newzvalue(zmovement#,wrapvalue(camera angle y()+90),speed#) endif position camera xmovement#,1,zmovement# anglex# = wrapvalue( anglex# + mousemovey() * turnspeed#) angley# = wrapvalue( angley# + mousemovex() * turnspeed#) set cursor 0,0 rem stops mouse from going upside down if anglex# < 180 AND anglex# > 90 then anglex# = 90 if anglex# < 270 AND anglex# > 180 then anglex# = 270 rotate camera 0,anglex#, angley#, 0 endfunction function spearvelocity() VelX# = 0 VelY# = 0 VelZ# = 0.2 temp# = (Cos(Object Angle X(spear.Object)) * VelY#) - (Sin(Object Angle X(spear.Object)) * VelZ#) VelZ# = (Sin(Object Angle X(spear.Object)) * VelY#) + (Cos(Object Angle X(spear.Object)) * VelZ#) VelY# = temp# temp# = (Cos(Object Angle Y(spear.Object)) * VelX#) + (Sin(Object Angle Y(spear.Object)) * VelZ#) VelZ# = (Cos(Object Angle Y(spear.Object)) * VelZ#) - (Sin(Object Angle Y(spear.Object)) * VelX#) VelX# = temp# thrownspear.Velocity.X = VelX# thrownspear.Velocity.Y = VelY# thrownspear.Velocity.Z = VelZ# endfunction function resetspear() show object spear.Object hide object thrownspear.Object launch = 0 endfunction function fixatanfu() FixX# = thrownspear.Velocity.X FixY# = thrownspear.Velocity.Y FixZ# = thrownspear.Velocity.Z temp# = (Cos(-Object Angle Y(spear.Object)) * FixX#) + (Sin(-Object Angle Y(spear.Object)) * FixZ#) FixZ# = (Cos(-Object Angle Y(spear.Object)) * FixZ#) - (Sin(-Object Angle Y(spear.Object)) * FixX#) FixX# = temp# local_z# = FixX# local_y# = FixY# local_z# = FixZ# curverot# = atanfull (local_z#,local_y#) endfunction curverot# function throwspear() thrownspear.Pos.X = object position x(thrownspear.Object) thrownspear.Pos.Y = object position y(thrownspear.Object) thrownspear.Pos.Z = object position z(thrownspear.Object) `******************************* THROW THE SPEAR *********************** if mouseclick() = 1 AND ClickBounce = 0 show object thrownspear.Object thrownspear.Pos.X = object position x(spear.Object) thrownspear.Pos.Y = object position y(spear.Object) thrownspear.Pos.Z = object position z(spear.Object) position object thrownspear.Object, thrownspear.Pos.X, thrownspear.Pos.Y, thrownspear.Pos.Z rotate object thrownspear.Object, object angle x(spear.Object),object angle y(spear.Object),object angle z(spear.Object) hide object spear.Object tempX# = thrownspear.Pos.X tempY# = thrownspear.Pos.Y tempZ# = thrownspear.Pos.Z spearvelocity() ClickBounce = 1 launch = 1 endif if mouseclick() = 0 ClickBounce = 0 endif if launch = 1 turnything# = fixatanfu() thrownspear.Rot.X = wrapvalue(turnything#-90.0) thrownspear.Rot.Y = object angle Y(thrownspear.Object) thrownspear.Rot.Z = object angle Z(thrownspear.Object) thrownspear.Pos.X = thrownspear.Pos.X + thrownspear.Velocity.X thrownspear.Pos.Y = thrownspear.Pos.Y + thrownspear.Velocity.Y thrownspear.Pos.Z = thrownspear.Pos.Z + thrownspear.Velocity.Z position object thrownspear.Object, thrownspear.Pos.X, thrownspear.Pos.Y, thrownspear.Pos.Z xrotate object thrownspear.Object, thrownspear.Rot.X thrownspear.Velocity.Y = thrownspear.Velocity.Y - (0.1/60.0) checkspearcollision() endif if mouseclick() = 2 AND launch > 0 unglue object thrownspear.Object resetspear() endif endfunction function checkspearcollision() if object position y(thrownspear.Object) < 0.1 launch = 2 endif if object collision (thrownspear.Object,10) = 1 hitposX# = object position x(thrownspear.Object) hitposY# = object position y(thrownspear.Object) hitposZ# = object position z(thrownspear.Object) hitposoffsetX# = hitposX#-object position x(10) hitposoffsetY# = hitposY#-object position y(10) hitposoffsetZ# = hitposZ#-object position z(10) temp# = (Cos(-Object Angle Y(10)) * hitposoffsetX#) + (Sin(-Object Angle Y(10)) * hitposoffsetZ#) hitposoffsetZ# = (Cos(-Object Angle Y(10)) * hitposoffsetZ#) - (Sin(-Object Angle Y(10)) * hitposoffsetX#) hitposoffsetX# = temp# position object thrownspear.Object,hitposoffsetX#,hitposoffsetY#,hitposoffsetZ# yrotate object thrownspear.Object,object angle y(thrownspear.Object)-Object Angle Y(10) glue object to limb thrownspear.Object,10,0 makebloodeffect(hitposX#,hitposY#,hitposZ#) beasthealth = beasthealth - rnd(3)-2 launch = 2 endif endfunction function beastie_move(beastienum,targX#,targY#,targZ#) PosX# = object position x(beastienum) PosZ# = object position z(beastienum) MoveX# = -sin(-Object Angle Y(beastienum)) * 0.2 MoveZ# = cos(-Object Angle Y(beastienum)) * 0.2 `Update the positions in the X and Z using the vector. PosX#=PosX#+MoveX# PosZ#=PosZ#+MoveZ# `Do the rotation XDiff = targX# - Object Position X(beastienum) ZDiff = targZ# - Object Position Z(beastienum) angle# = ATanFull(XDiff, ZDiff) angle# = WrapValue(angle#) AngleDiff# = Object Angle Y(beastienum) - angle# while (AngleDiff# < -180) AngleDiff# = AngleDiff# + 360 endwhile while (AngleDiff# > 180) AngleDiff# = AngleDiff# - 360 endwhile YRotate Object beastienum,Object Angle Y(beastienum) - (AngleDiff#/40) position object beastienum,PosX#,5,PosZ# endfunction function get_distancesquaredpos(object1,obj2x#,obj2y#,obj2z#) obj1x# = object position x(object1) obj1y# = object position y(object1) obj1z# = object position z(object1) distancesquared# = ((obj1x#-obj2x#)*(obj1x#-obj2x#)) + ((obj1y#-obj2y#)*(obj1y#-obj2y#)) + ((obj1z#-obj2z#)*(obj1z#-obj2z#)) endfunction distancesquared# Function update_particles() for i = 0 to array count(Particles()) if Particles(i).Active = 1 if Particles(i).Gravity = 1 Particles(i).PosVel.Y = Particles(i).PosVel.Y - (9.81 * TIMEPASSED) endif Particles(i).PosVel.X = Particles(i).PosVel.X + (Particles(i).PosAcc.X * TIMEPASSED) Particles(i).PosVel.Y = Particles(i).PosVel.Y + (Particles(i).PosAcc.Y * TIMEPASSED) Particles(i).PosVel.Z = Particles(i).PosVel.Z + (Particles(i).PosAcc.Z * TIMEPASSED) Particles(i).Pos.X = Particles(i).Pos.X + (Particles(i).PosVel.X * TIMEPASSED) Particles(i).Pos.Y = Particles(i).Pos.Y + (Particles(i).PosVel.Y * TIMEPASSED) Particles(i).Pos.Z = Particles(i).Pos.Z + (Particles(i).PosVel.Z * TIMEPASSED) Particles(i).Rot.X = Particles(i).Rot.X + (Particles(i).RotVel.X * TIMEPASSED) Particles(i).Rot.Y = Particles(i).Rot.Y + (Particles(i).RotVel.Y * TIMEPASSED) Particles(i).Rot.Z = Particles(i).Rot.Z + (Particles(i).RotVel.Z * TIMEPASSED) Particles(i).Scale = Particles(i).Scale + (Particles(i).ScaleVel * TIMEPASSED) if Particles(i).Scale < 1 Particles(i).Lifetime = 0.0 endif Position Object Particles(i).Object,Particles(i).Pos.X,Particles(i).Pos.Y,Particles(i).Pos.Z Rotate Object Particles(i).Object,Particles(i).Rot.X,Particles(i).Rot.Y,Particles(i).Rot.Z Scale Object Particles(i).Object,Particles(i).Scale,Particles(i).Scale,Particles(i).Scale if Particles(i).Facing = 1 Point Object Particles(i).Object,camera position x(),camera position y(),camera position z() endif if Particles(i).ColourBlend = 1 Particles(i).Colour.Red = Particles(i).Colour.Red + (Particles(i).ColourVel.Red * TIMEPASSED) Particles(i).Colour.Green = Particles(i).Colour.Green + (Particles(i).ColourVel.Green * TIMEPASSED) Particles(i).Colour.Blue = Particles(i).Colour.Blue + (Particles(i).ColourVel.Blue * TIMEPASSED) If Particles(i).Colour.Red > 255 then Particles(i).Colour.Red = 255 If Particles(i).Colour.Red < 0 then Particles(i).Colour.Red = 0 If Particles(i).Colour.Green > 255 then Particles(i).Colour.Green = 255 If Particles(i).Colour.Green < 0 then Particles(i).Colour.Green = 0 If Particles(i).Colour.Blue > 255 then Particles(i).Colour.Blue = 255 If Particles(i).Colour.Blue < 0 then Particles(i).Colour.Blue = 0 set object emissive Particles(i).Object, rgb(Particles(i).Colour.Red, Particles(i).Colour.Green, Particles(i).Colour.Blue) set object diffuse Particles(i).Object, rgb(Particles(i).Colour.Red, Particles(i).Colour.Green, Particles(i).Colour.Blue) endif show object Particles(i).Object Particles(i).Lifetime = Particles(i).Lifetime - TIMEPASSED if Particles(i).Lifetime <= 0 Particles(i).Active = 0 hide object Particles(i).Object scroll object texture Particles(i).Object,-Particles(i).UOffset,-Particles(i).VOffset Particles(i).UOffset = 0 Particles(i).VOffset = 0 endif endif next i Endfunction Function initialise_particles() for i = 0 to array count(Particles()) Particles(i).Object = free_object() make object plain Particles(i).Object,1,1 texture object Particles(i).Object,4 ghost object on Particles(i).Object hide object Particles(i).Object disable object zwrite Particles(i).Object set object specular Particles(i).Object,0 Particles(i).Active = 0 set object collision off Particles(i).Object next i Endfunction Function allocate_particle() particle_index = currentfreeparticle currentfreeparticle = (currentfreeparticle+1) MOD NUMPARTICLES Particles(particle_index).Active = 1 Endfunction particle_index Function reset_particle(index) scroll object texture Particles(index).Object,-Particles(index).UOffset,-Particles(index).VOffset Particles(index).Pos.X = 0 Particles(index).Pos.Y = 0 Particles(index).Pos.Z = 0 Particles(index).PosVel.X = 0 Particles(index).PosVel.Y = 0 Particles(index).PosVel.Z = 0 Particles(index).PosAcc.X = 0 Particles(index).PosAcc.Y = 0 Particles(index).PosAcc.Z = 0 Particles(index).Rot.X = 0 Particles(index).Rot.Y = 0 Particles(index).Rot.Z = 0 Particles(index).RotVel.X = 0 Particles(index).RotVel.Y = 0 Particles(index).RotVel.Z = 0 Particles(index).Scale = 100 Particles(index).ScaleVel = 0 Particles(index).Lifetime = 1 Particles(index).UOffset = 0 Particles(index).VOffset = 0 Particles(index).Colour.Red = 255 Particles(index).Colour.Green = 255 Particles(index).Colour.Blue = 255 Particles(index).ColourVel.Red = 0 Particles(index).ColourVel.Green = 0 Particles(index).ColourVel.Blue = 0 Particles(index).ColourBlend = 0 Endfunction Function particle_colourblend(local_initialred,local_initialgreen,local_initialblue,local_finalred,local_finalgreen,local_finalblue,local_particleindex) Particles(local_particleindex).Colour.Red = local_initialred Particles(local_particleindex).Colour.Green = local_initialgreen Particles(local_particleindex).Colour.Blue = local_initialblue Particles(local_particleindex).ColourVel.Red = (local_finalred - local_initialred)/ Particles(local_particleindex).Lifetime Particles(local_particleindex).ColourVel.Green = (local_finalgreen - local_initialgreen)/Particles(local_particleindex).Lifetime Particles(local_particleindex).ColourVel.Blue = (local_finalblue - local_initialblue)/Particles(local_particleindex).Lifetime Endfunction Function free_object() i=100 Do If Object Exist(i)=0 then Exit inc i Loop Endfunction i Function free_image() i=100 Do If Image Exist(i)=0 then Exit inc i Loop Endfunction i Function update_emitters() for i = 0 to array count(ParticleEmitters()) if ParticleEmitters(i).Active = 1 ParticleEmitters(i).Repeattime = ParticleEmitters(i).Repeattime - TIMEPASSED ParticleEmitters(i).Lifetime = ParticleEmitters(i).Lifetime - TIMEPASSED if ParticleEmitters(i).Repeattime <= 0 Select ParticleEmitters(i).EffectType case 1 makeblood(ParticleEmitters(i).Pos.X,ParticleEmitters(i).Pos.Y,ParticleEmitters(i).Pos.Z) endcase endselect ParticleEmitters(i).Repeattime = ParticleEmitters(i).Repeatrate endif if ParticleEmitters(i).Lifetime <= 0 ParticleEmitters(i).Active = 0 endif endif next i Endfunction Function allocate_emitter() for i = 0 to array count(ParticleEmitters()) if ParticleEmitters(i).Active = 0 particleemitter_index = i exitfunction particleemitter_index endif next i array insert at bottom ParticleEmitters() particleemitter_index = array count(ParticleEmitters()) endfunction particleemitter_index Function reset_emitter(index) ParticleEmitters(index).Pos.X = 0 ParticleEmitters(index).Pos.Y = 0 ParticleEmitters(index).Pos.Z = 0 ParticleEmitters(index).Lifetime = 1 ParticleEmitters(index).Repeatrate = 1 ParticleEmitters(index).Repeattime = 0 ParticleEmitters(index).EffectType = 0 Endfunction Function makebloodeffect(local_xpos,local_ypos,local_zpos) index = allocate_emitter() `This is required to get a free emitter from the list. reset_emitter(index) `Starts the emitter clean and defaulty. ParticleEmitters(index).Pos.X = local_xpos `Positions the emitter in the world. Used for spell locations etc ParticleEmitters(index).Pos.Y = local_ypos ParticleEmitters(index).Pos.Z = local_zpos ParticleEmitters(index).Lifetime = 0.2 `The lifetime in seconds of the EMITTER - not the particles. ParticleEmitters(index).Repeatrate = 0.1 `How often the emitter will spew out particles in seconds. ParticleEmitters(index).EffectType = 1 `Number of the effect that the emitter spews. You can use CONSTANTs ParticleEmitters(index).Active = 1 `Sets it to active. Required. Endfunction Function makeblood(local_xpos,local_ypos,local_zpos) for i = 0 to 60 index = allocate_particle() `These are required for getting the next free particle. reset_particle(index) `This ensures the particle has a 'clean slate' to begin. Particles(index).Pos.X = local_xpos `The particle's initial start position. Usually given by Particles(index).Pos.Y = local_ypos `the emitter when it calls the particle. Particles(index).Pos.Z = local_zpos Particles(index).PosVel.X = rnd(6) `The initial velocity of the particle. If you have gravity Particles(index).PosVel.Y = rnd(8)+5 `enabled, the Y velocity should be quite large (in the 8-10 Particles(index).PosVel.Z = rnd(6) `range) to counteract it. Particles(index).PosAcc.X = 0 `Any initial acceleration on the particle. If you want it Particles(index).PosAcc.Z = 0 `to get increasingly faster in a direction, accelleration Particles(index).PosAcc.Y = 0 `is where it's at. Particles(index).Rot.X = 0 `The rotation of the particle - NOTE if you have facing ON Particles(index).Rot.Y = 0 `then these numbers will be ignored. Particles(index).Rot.Z = 0 Particles(index).RotVel.X = 0 `If you want the particle to spin at all, then use these, Particles(index).RotVel.Y = 0 `but remember - if Facing is ON, these will have little Particles(index).RotVel.Z = 0 `or no effect. Particles(index).Scale = 5.0 `The initial scale of the particle in percent. Size is 1. Particles(index).ScaleVel = 25 `The change in scale per second for the object. Negative `numbers to shrink over time, positive numbers to expand. Particles(index).Lifetime = 1 `The length of time, in seconds, that each particle lasts. Particles(index).Gravity = 1 `1 or 0 for affected by gravity or not. Particles(index).Facing = 1 `1 or 0 for facing the player always, or not. Particles(index).UOffset = 0 `Offset in the particle texture. Values between 0 and 0.75, in 0.25s. Particles(index).VOffset = 0 `Same as above, but up and down, instead of left and right. local_initialred = 255 `Temporary variables to set the start and end colour of your local_initialgreen = 0 `particle system. If you only want one colour, just set it as local_initialblue = 0 `the start colour. local_finalred = 0 `The function below (particle_colourblend) sets the colour velocities. local_finalgreen = 0 local_finalblue = 0 Particles(index).ColourBlend = 1 `This boolean sets whether you want to blend. 1 to blend. particle_colourblend(local_initialred,local_initialgreen,local_initialblue,local_finalred,local_finalgreen,local_finalblue,index) `The following three lines set up the look of the particle initially. set object emissive Particles(index).Object,rgb(Particles(index).Colour.Red,Particles(index).Colour.Green,Particles(index).Colour.Blue) set object diffuse Particles(index).Object,rgb(Particles(index).Colour.Red,Particles(index).Colour.Green,Particles(index).Colour.Blue) scroll object texture Particles(index).Object,Particles(index).UOffset,Particles(index).VOffset next i Endfunction