TGC Codebase Backup



Limb Fire Particles (Functions included!) by Sixty Squares

31st Jul 2008 18:31
Summary

*NOT native DBP Particles* This is basically setting limbs on multi-colored fire using a simple custom particle system I made.



Description

These functions allow you to set specific limbs of an object on fire using some simple custom particle effects I made. If you decide to use it, please give credit! Also, feel free to comment. I'd like to know if the comment function works (I've never been able to find it). No media required. Just copy, paste, and run.



Code
                                    ` This code was downloaded from The Game Creators
                                    ` It is reproduced here with full permission
                                    ` http://www.thegamecreators.com
                                    
                                    REM Project: Limb Fire Functions
REM Created: 6/20/2007 7:03:08 AM
REM
REM ***** Main Source File *****
REM
sync on
sync rate 60
autocam off
randomize timer()

GOSUB SQ_LimbFireSetup

sz=200


rem MAKE FIRE IMAGES
CREATE BITMAP 1,100,100
for c = 1 to 40
ink rgb(0,155+rnd(100),rnd(255)),0
circle 50,50,c
next c
blur bitmap 1,5
get image 1,0,0,100,100,1
delete bitmap 1
CREATE BITMAP 1,100,100
for c = 1 to 40
ink rgb(255,rnd(255),255),0
circle 50,50,c
next c
blur bitmap 1,5
get image 2,0,0,100,100,1
delete bitmap 1
CREATE BITMAP 1,100,100
for c = 1 to 40
ink rgb(155+rnd(100),rnd(255),0),0
circle 50,50,c
next c
blur bitmap 1,5
get image 3,0,0,100,100,1
delete bitmap 1

CREATE BITMAP 1,100,100
for d = 1 to 1000
Color=rnd(1)
if Color>0 then ink rgb(0,100+rnd(155),0),0 : else : ink rgb(50+rnd(105),0,20),0
dot rnd(100),rnd(100)
next d
blur bitmap 1,5
get image 4,0,0,100,100
delete bitmap 1


`Make Object Sphere 1,5
MakePerson(1,30)
`Limb 1=head
`     2=body
`     3=right hand
`     4=left hand

limb=3

rem Set object 1's limb 3 on fire
SQ_CreateLimbFire(1,limb,1,100)

rem Adjust the size
SQ_SetLimbFireSize(1,limb,100,100)

rem Set the life
SQ_SetLimbFireLife(1,limb,70)

rem Set the randomization for spawning location
SQ_SetLimbFireRandomize(1,limb,1,1,1)

rem Set the fire particles to go up
SQ_SetLimbFireSpeed(1,limb,0,0.5,0)

SQ_ResetLimbFire(1,limb)
make matrix 1,10000,10000,60,60
position matrix 1,-5000,-10,-5000
prepare matrix texture 1,4,1,1

DO
text 0,0,str$(screen fps())
text 0,30,str$(img)
if val(inkey$())>0 then IMG=val(inkey$())
sIMG=IMG
if IMG<=0 or IMG>3 then sIMG=1+rnd(2)
SQ_SetLimbFireImage(1,limb,sIMG)
spd=1
inc x#,spd*(rightkey()-leftkey())
inc z#,spd*(upkey()-downkey())
inc y#,spd*(keystate(17)-Keystate(31))
position object 1,x#,y#,z#
position camera x#,y#+30,z#-150
point camera x#,y#,z#
if Spacekey() then SQ_HideLimbFire(1,limb) else SQ_ShowLimbFire(1,limb)
SQ_UpdateLimbFires()
SYNC
LOOP


















END
function MakePerson(obj as integer,globalsize as float)
        hs#=GlobalSize/3

          rem Make body
          Make object plain obj,1,1
          body=FreeOBJ()
          Make object sphere body,hs#*2
          scale object body,50,100,50

          rem Make head
          head=FreeOBJ()
          Make Object Sphere head,hs#
          scale object head,100,125,100

          rem Make left hand
          lefthand=FreeOBJ()
          Make Object Sphere lefthand,hs#/2

          rem Make right hand
          righthand=FreeOBJ()
          Make Object Sphere righthand,hs#/2

          rem Make meshes from the limbs for the object
          MAKE MESH FROM OBJECT body,body
          Make MEsh from object head,head
          make mesh from object lefthand,lefthand
          Make MESH From Object righthand,righthand

          rem Add the meshes as limbs
          ADD LIMB obj,1,Body
          ADD LIMB obj,2,head
          ADD LIMB OBJ,3,lefthand
          ADD LIMB OBJ,4,righthand

          rem Add OFfset the limbs to their proper positions
          ResetLimbs(obj,HS#,2,1,3,4)


          rem Delete the meshes as they're no longer being used
          DELETE MESH Body
          DELETE MESH Head
          DELETE MESH LEftHand
          DELETE MESH Righthand

          rem Delete the objects as well
          DELETE OBJECT Body
          DELETE OBJECT Head
          DELETE OBJECT LEftHand
          DELETE OBJECT RightHand
endfunction

        rem ==============================================
        rem
        rem RESET LIMBS
        rem
        rem ==============================================

        function ResetLimbs(obj as integer,hs#,h,b,l,r)
          OFFSET LIMB obj,b,0,0,0
          OFFSET LIMB obj,h,0,hs#*1.5,0
          OFFSET LIMB obj,l,hs#/-2,hs#/4,0
          OFFSET LIMB obj,r,hs#/2,hs#/4,0
          Rotate limb obj,b,0,180,0
          Rotate limb obj,h,0,180,0
          Rotate limb obj,l,0,180,0
          Rotate limb obj,r,0,180,0
        endfunction

        function FreeOBJ()
        repeat
        inc TEMP
        until object exist(TEMP)=0
        endfunction TEMP




















rem =======================================
rem
rem LIMB FIRE FUNCTIONS START HERE
rem
rem =======================================




END
SQ_LimbFireSetup:


TYPE SQ_LimbFire
Obj as integer
Limb as integer
Size as float
DeathHeight as float
StartY as float
X as float
Y as float
Z as float
XSize as float
YSize as float
img as integer
SlotOBJ as integer `For second slot
YDie `For second slot
NumOfOBjects as integer
XRnd as float
YRnd as float
ZRnd as float
Exist as boolean
TargetxSize as float
TargetySize as float
XSpeed as float
YSpeed as float
ZSpeed as float
Hidden as boolean
MaxLife as float
ENDTYPE

`SQ_LimbFire(Slot,Object Numbers)
DIM SQ_LimbFire(1000,1000) as SQ_LimbFire

GLOBAL SQ_MaxLimbFire as integer
Return









Function SQ_LimbFireExist(obj as integer,Limb as integer)
Slot=SQ_GetLimbFireSlot(obj,limb)
if SQ_LimbFire(Slot,1).Exist=1 then TEMP=1
Endfunction TEMP



Function SQ_CreateLimbFire(obj as integer,limb as integer,img as integer,NumOfObjects as integer)
Slot=SQ_FreeLimbSlot()
SQ_LimbFire(Slot,1).obj=obj
SQ_LimbFire(Slot,1).limb=limb
SQ_LimbFire(Slot,1).img=img
SQ_LimbFire(Slot,1).xsize=100
SQ_LimbFire(Slot,1).ysize=100
SQ_LimbFire(Slot,1).NumOfObjects=NumOfObjects
SQ_LimbFire(SLot,1).XRnd=10
SQ_LimbFire(Slot,1).YRND=10
SQ_LimbFire(Slot,1).ZRnd=10
SQ_LimbFire(Slot,1).DeathHeight=0
SQ_LimbFire(Slot,1).MaxLife=100
SQ_LimbFire(Slot,1).Exist=1
SQ_LimbFire(Slot,1).TargetXSize=10
SQ_LimbFire(Slot,1).TargetYSize=10
SQ_LimbFire(Slot,1).xSpeed=1
SQ_LimbFire(Slot,1).ySpeed=1
SQ_LimbFire(Slot,1).zSpeed=1
SQ_LimbFire(Slot,1).Hidden=0
FOR SQ_l = 1 to NumOfObjects
SQ_fo=SQ_FreeObject()
SQ_LimbFire(Slot,SQ_l).SlotOBj=SQ_fo
Make Object Plain SQ_fo,10,10
texture object SQ_fo,img
set object transparency SQ_fo,1
disable object zwrite SQ_fo
Ghost Object on sq_fo
set object ambient SQ_fo,0
next SQ_l


SQ_GetMaxLimbFire()
SQ_ResetLimbFire(obj,limb)
Endfunction



Function SQ_SetLimbFireSize(obj as integer,Limb as integer,XSize as float,YSize as float)
Slot=SQ_GetLimbFireSlot(obj,limb)
SQ_LimbFire(slot,1).XSize=XSize
SQ_LimbFire(slot,1).YSize=YSize
Endfunction



Function SQ_SetLimbFireDeathHeight(obj as integer,limb as integer,DeathHeight as float)
Slot=SQ_GetLimbFireSlot(obj,limb)
SQ_LimbFire(slot,1).MaxLife=DeathHeight
Endfunction


Function SQ_SetLimbFireLife(obj as integer,limb as integer,Life as float)
Slot=SQ_GetLimbFireSlot(obj,limb)
SQ_LimbFire(slot,1).MaxLife=Life
endfunction


Function SQ_SetLimbFireRandomize(obj as integer,limb as integer,XRnd as float,YRnd as float,ZRnd as float)
Slot=SQ_GetLimbFireSlot(obj,limb)
SQ_LimbFire(slot,1).XRnd=XRnd
SQ_LimbFire(slot,1).yRnd=yRnd
SQ_LimbFire(slot,1).zRnd=zRnd
endfunction

Function SQ_SetLimbFireTargetSize(obj as integer,limb as integer,xsize as float,ysize as float)
Slot=SQ_GetLimbFireSlot(obj,limb)
SQ_LimbFire(slot,1).TargetxSize=xSize
SQ_LimbFire(slot,1).TargetySize=ySize
Endfunction

Function SQ_SetLimbFireSpeed(obj as integer,limb as integer,xspeed as float,yspeed as float,zspeed as float)
Slot=SQ_GetLimbFireSlot(obj,limb)
SQ_LimbFire(slot,1).xSpeed=xSpeed
SQ_LimbFire(slot,1).ySpeed=ySpeed
SQ_LimbFire(slot,1).zSpeed=zSpeed
Endfunction

Function SQ_SetLimbFireImage(obj as integer,limb as integer,img as integer)
if Image Exist(img)=0 then SQ_LimbFireError("Image "+str$(img)+" does not exist in 'SQ_SetLimbFireImage("+str$(obj)+", "+str$(limb)+")'.")
Slot=SQ_GetLimbFireSlot(obj,limb)
SQ_LimbFire(slot,1).img=img
Endfunction


Function SQ_ResetLimbFire(obj as integer,limb as integer)
Slot=SQ_GetLimbFireSlot(obj,limb)
for o = 1 to SQ_LimbFire(Slot,1).NumOfObjects
SlotOBJ=SQ_LimbFire(Slot,o).slotobj
position object SlotOBJ,Limb Position X(Obj,Limb)-SQ_LimbFire(Slot,1).Xrnd/2+RND(SQ_LIMBFIRE(SLOT,1).xRND),Limb Position Y(Obj,Limb)-RND(SQ_LimbFire(Slot,1).YRNd),Limb Position Z(Obj,Limb)-SQ_LimbFire(Slot,1).zrnd/2+RND(SQ_LIMBFIRE(SLOT,1).zRND)
SQ_LimbFire(Slot,o).YDie=Object position y(SlotOBJ)+SQ_LimbFire(Slot,1).DeathHeight-SQ_LimbFire(Slot,1).YRND/2+rND(SQ_LimbFire(Slot,1).YRnd)

Value=RND(SQ_LimbFire(Slot,1).MaxLife)
SQ_LimbFire(Slot,o).DeathHeight=Value
position object slotobj,object position x(slotobj)+SQ_LimbFire(Slot,1).XSpeed*value,object position y(slotobj)+SQ_LimbFire(Slot,1).ySpeed*value,object position z(SlotObj)+SQ_LimbFire(Slot,1).zSpeed*value
next o
Endfunction


Function SQ_HideLimbFire(obj as integer,limb as integer)
Slot=SQ_GetLimbFireSlot(obj,limb)
SQ_LimbFire(Slot,1).Hidden=1
Endfunction


Function SQ_ShowLimbFire(obj as integer,limb as integer)
Slot=SQ_GetLimbFireSlot(obj,limb)
SQ_LimbFire(Slot,1).Hidden=0
Endfunction



Function SQ_SizeLimbFireobject(obj as integer,xs as float,ys as float,zs as float)
xp#=xs/Object Size X(Obj,1)
yp#=ys/Object Size Y(Obj,1)
zp#=zs/Object Size Z(Obj,1)
Scale Object OBj,Object Size X(Obj,1)*xp#,Object size Y(OBj,1)*yp#,Object Size Z(Obj,1)*zp#
endfunction




Function SQ_UpdateLimbFires()
if SQ_MaxLimbFire<=0 then exitfunction
FOR l = 1 to SQ_MaxLimbFire
obj=SQ_LimbFire(l,1).obj
Limb=SQ_LimbFire(l,1).limb
Slot=l
for o = 1 to SQ_LimbFire(l,1).NumOfObjects
SlotObj=SQ_LimbFire(l,o).SlotOBJ
Position Object SlotOBJ,Object position x(SlotOBJ)+SQ_LimbFire(l,1).XSpeed,Object Position y(SlotOBJ)+SQ_LimbFire(l,1).ySpeed,Object position z(SlotOBJ)+SQ_LimbFire(l,1).ZSpeed


SQ_LimbFire(l,o).DeathHeight=SQ_LimbFire(l,o).DeathHeight-1


if SQ_LimbFire(l,o).DeathHeight<=0
   SQ_LimbFire(l,o).DeathHeight=SQ_LimbFire(l,1).MaxLife
   position object SlotOBJ,Limb Position X(Obj,Limb)-SQ_LimbFire(Slot,1).Xrnd/2+RND(SQ_LIMBFIRE(SLOT,1).xRND),Limb Position Y(Obj,Limb)-RND(SQ_LimbFire(Slot,1).YRNd),Limb Position Z(Obj,Limb)-SQ_LimbFire(Slot,1).zrnd/2+RND(SQ_LIMBFIRE(SLOT,1).zRND)
   SQ_LimbFire(l,o).YDie=Object position y(SlotOBJ)+SQ_LimbFire(Slot,1).DeathHeight-SQ_LimbFire(Slot,1).YRND/2+rND(SQ_LimbFire(Slot,1).YRnd)
   Texture Object SlotOBJ,SQ_LimbFire(Slot,1).img
   if SQ_LimbFire(l,1).Hidden=1 then Exclude Object On SlotOBJ else Exclude Object Off SlotOBJ
   SQ_SizeLimbFireObject(SlotOBJ,SQ_LimbFire(l,1).xsize,SQ_LimbFire(l,1).ysize,0)
Endif



xs#=object size x(SlotOBJ,1)
ys#=Object Size y(SlotOBJ,1)

`xs#=Curvevalue(SQ_LimbFire(l,1).TargetXSize,xs#,SQ_LimbFire(l,1).DeathHeight)
`ys#=Curvevalue(SQ_LimbFire(l,1).TargetYSize,ys#,SQ_LimbFire(l,1).DeathHeight)
`SQ_SizeLimbFireObject(SlotOBJ,xs#,ys#,0)

point object SlotOBJ,camera position x(),camera position y(),camera position z()

next o


Next l
Endfunction





function SQ_GetMaxLimbFire()
repeat
inc l
if SQ_LimbFire(l,1).Exist=0 then Foundit=l-1
until l=1000 or FoundIt>0
if foundit=0 then Foundit=1000
SQ_MAxLimbFire=Foundit
endfunction






function SQ_FreeLimbSlot()
repeat
inc TEMP,1
if TEMP>1000 then SQ_LimbFireError("No more limb fires could be created. You have too many! Delete some!")
Value=SQ_LimbFire(TEMP,1).Exist
until Value=0
endfunction TEMP

function SQ_GetLimbFireSlot(o as integer,l as integer)
s=0
repeat
inc s
if SQ_LimbFire(s,1).obj=o and SQ_LimbFire(s,1).limb=l then Found=1 : exit
until Found=1 or s=1000
TEMP=s
if s=1000 and Found=0 then TEMP=0
if TEMP=0 then SQ_LimbFireError("Object "+str$(obj)+", Limb "+str$(limb)+" does not exist as a Limb Fire Entity. In other words, it was never set up or you deleted it.")
endfunction TEMP


function SQ_FreeObject()
TEMP=99
repeat
inc TEMP,1
until Object Exist(TEMP)=0
endfunction TEMP


Function SQ_DeleteLimbFire(obj as integer,limb as integer)
Slot=SQ_GetLimbFireSlot(obj,limb)
for o = 1 to SQ_LimbFire(Slot,1).NumOfObjects
DELETE OBJECT SQ_LimbFire(Slot,o).SlotOBJ
next o
SQ_LimbFire(Slot,1).Exist=0
SQ_GetMaxLimbFire()
endfunction


Function SQ_LimbFireError(Error as string)
Exit Prompt Error,"SQ Limb Fire Functions"
End
Endfunction