Article     Discussion     Modifier     Historique     Forums     Salon IRC

Iced

Un article de Games Creators Network.

[modifier] Source code

Un fichier .dba

rem ********************************************
rem *                   ICED                   *
rem ********************************************
rem * AUTHOR: Lee Bamber    DATE: 1st May 2000 *
rem ********************************************

rem Setup environment
sync rate 30
autocam off
hide mouse
sync on

rem Decal limit (full version users can set this to 100)
dim decalmax(1)
decalmax(1)=10

rem Game arrays
dim decal#(decalmax(1),20)
dim goblin#(50,20)
dim bullet#(10,10)
dim gunrecoil#(2)
dim fallstart(4)
dim fallend(4)
dim real(5)
dim gpx#(2)
dim gpy#(2)
dim gpz#(2)
enemymax=20

rem Load initial screen and sound effect
load sound "rain.wav",1 : loop sound 1
load bitmap "loading.bmp" : sync

rem Load sounds
load sound "phaser.wav",2 : for s=3 to 12 : clone sound s,2 : next s
for s=1 to enemymax
	ss=100+(s*2)
	load 3dsound "howl.wav",ss : set sound speed ss,5000+rnd(3000)
	load 3dsound "die.wav",ss+1 : set sound speed ss+1,30000+rnd(5000)
next s
for s=1 to 5
	ss=1000+(s*2)
	load 3dsound "attack.wav",ss : set sound speed ss,15000+rnd(5000)
	load 3dsound "thump.wav",ss+1 : set sound speed ss+1,3000
next s

rem Load images
load image "smoke.bmp",1001

rem Create Elements
gosub _generate_goblins
gosub _create_world
gosub _create_enemies
gosub _create_player

rem Place logo
placelogo()

rem Main gameloop
lowmode=0
do

rem Activate low mode
if lower$(inkey$())="l" and lowmode=0
	lowmode=1
	hide object 52
	hide object 53
	hide object 80
	hide object 81
	hide object 82
	hide object 83
	for e=1 to enemymax : delete object 100+(e*2)+1 : next e
	for e=1 to 5 : delete object 1000+(e*2)+1 : next e
	color backdrop rgb(255,255,255)
endif
if lower$(inkey$())="h" then hide object 65000

rem Control game elements
gosub _control_player
gosub _control_camera
gosub _control_guns
gosub _control_enemies
gosub _control_weather

rem Controller functions
controldecals(mx#,mz#)

rem Update screen
sync

rem End of gameloop
loop


rem ** Subroutines **

_control_player:

rem Control Player
olx#=x# : olz#=z#
stage=0 : gunlag#=5.0
if upkey()=1
	x#=newxvalue(x#,cya#,8.0) : z#=newzvalue(z#,cya#,8.0)
	gunlag#=1.1
	stage=1
endif
if downkey()=1
	x#=newxvalue(x#,cya#,-8.0) : z#=newzvalue(z#,cya#,-8.0)
	gunlag#=1.1
	stage=1
endif
if leftkey()=1
	x#=newxvalue(x#,wrapvalue(cya#-90.0),6.0)
	z#=newzvalue(z#,wrapvalue(cya#-90.0),6.0)
	gunlag#=1.1
endif 
if rightkey()=1
	x#=newxvalue(x#,wrapvalue(cya#+90.0),6.0)
	z#=newzvalue(z#,wrapvalue(cya#+90.0),6.0)
	gunlag#=1.1
endif

rem Walk woddle height
if stage=1
	walkha#=wrapvalue(walkha#+16.0)
else
	walkha#=curveangle(0.0,walkha#,5.0)
endif
walkh#=(cos(walkha#)*4.5)

rem Ensure player stays on floor
fx#=0 : fz#=0
for r=0 to 35
	ex#=newxvalue(x#,r*10,15)
	ez#=newzvalue(z#,r*10,15)
	eh#=get ground height(1,ex#+mx#,ez#+mz#)
	if eh#<-50.0 then eh#=-50.0
	force#=(eh#+50.0)/10.0
	fx#=fx#+((ex#-x#)*force#)
	fz#=fz#+((ez#-z#)*force#)
next r
x#=x#-(fx#/35.0)
z#=z#-(fz#/35.0)

rem Aquire ground height of new position
y#=get ground height(1,x#+mx#,z#+mz#)
if y#<-50.0 then y#=-50.0

rem Place listener
position listener x#,y#,z#
rotate listener 0,wrapvalue(cya#),0

rem Control hurt fog
if returnkey()=1 and hurt#=0.0 then hurt#=100.0
if hurt#>0
	dec hurt#,1.0+(100.0-hurt#)
	fog on
	fog color rgb((255.0/100.0)*hurt#,0,0)
	fog distance 50000-((50000.0/100.0)*hurt#)
	if hurt#<=0.0
		hurt#=0.0
		fog off
	endif
endif

rem Control compass needle
if closestgoblin>0
	g=closestgoblin
	dx#=goblin#(g,2)-x#
	dz#=goblin#(g,3)-z#
	aa#=wrapvalue(cya#-atanfull(dx#,dz#))
	compass#=aa#
	if compassscale#<25.0 then inc compassscale#
else
	compass#=0
	if compassscale#>0.0 then dec compassscale#
endif
zrotate object 80,compass#
scale object 80,compassscale#,75,500

return

_control_camera:

rem Control Camera
cya#=wrapvalue(cya#+(mousemovex()/3.0))
cxa#=cxa#+(mousemovey()/3.0)
if cxa#<-45.0 then cxa#=-45.0
if cxa#>45.0 then cxa#=45.0
cx#=newxvalue(x#,cya#,sin(cxa#)*10)
cz#=newzvalue(z#,cya#,sin(cxa#)*10)
position camera cx#,y#+30+walkh#,cz#
rotate camera wrapvalue(cxa#),cya#,0

return

_control_guns:

rem Control gun recoil
for g=0 to 1
	if gunrecoil#(g)>0
		gunrecoil#(g)=gunrecoil#(g)-1
	endif
next g

rem Control Guns
for g=0 to 1
	gga#=wrapvalue((cya#-20)+(g*40))
	ggx#=newxvalue(x#,gga#,gunrecoil#(g)*-1)
	ggz#=newzvalue(z#,gga#,gunrecoil#(g)*-1)
	gpdx#=newxvalue(ggx#,wrapvalue((cya#-20)+(g*40)),10)
	gpdy#=y#-(sin(cxa#)*10)
	gpdz#=newzvalue(ggz#,gga#,10)
	gpx#(g)=curvevalue(gpdx#,gpx#(g),gunlag#)
	gpy#(g)=curvevalue(gpdy#,gpy#(g),gunlag#)
	gpz#(g)=curvevalue(gpdz#,gpz#(g),gunlag#)
	position object 2+g,gpx#(g),gpy#(g)+22+walkh#,gpz#(g)
	xrotate object 2+g,wrapvalue(0-cxa#)
	yrotate object 2+g,wrapvalue(cya#+180)
next g

rem Control Firing
if mouseclick()=1

	rem If gun ready
	if gunpressed=0

		rem Start with prefered gun	
		gunprefered=1-gunprefered
		gunobj=2+gunprefered
		gunrecoil#(gunobj-2)=10.0
		gunpressed=1

		rem Find free bullet
		bf=-1
		for b=0 to 10
			if bullet#(b,1)=0 then bf=b
		next b
	
		rem Trigger bullet
		if bf>0
			objid=4+(bf*2)+0
			bullet#(bf,1)=1
			bullet#(bf,2)=0
			play sound 2+bf
			tx#=object position x(gunobj)
			ty#=object position y(gunobj)
			tz#=object position z(gunobj)
			txa#=object angle x(gunobj)
			tya#=object angle y(gunobj)
			position object objid,tx#,ty#,tz#
			rotate object objid,txa#,wrapvalue(tya#+90),0
			if gunobj=2
				move object objid,2.0
			else
				move object objid,-2.0
			endif
			rotate object objid,txa#,tya#,0
			move object objid,5
			show object objid+0
			if object exist(objid+1)=1 then show object objid+1
		endif	
		for adv=1 to 10
			objid=3+(adv*2)+0
			if adv<>rp and bullet#(adv,1)=1 then move object objid,-25.0
		next adv
	
	endif

else
	gunpressed=0
endif

rem Control bullet movement
for b=0 to 10

	rem Bullet alive
	if bullet#(b,1)=1

		rem Move bullet
		objid=4+(b*2)+0
		move object objid,-25.0
		ex#=object position x(objid)
		eh#=object position y(objid)
		ez#=object position z(objid)
		position object objid+1,ex#,-50-(eh#+50),ez#
		rotate object objid+1,wrapvalue(0-object angle x(objid)),object angle y(objid),0

		rem If bullets meet at ice-level, switch
		if eh#<-50.0
			sx#=object position x(objid)
			sy#=object position y(objid)
			sz#=object position z(objid)
			sxa#=object angle x(objid)
			sya#=object angle y(objid)
			position object objid,object position x(objid+1),object position y(objid+1),object position z(objid+1)
			rotate object objid,object angle x(objid+1),object angle y(objid+1),0
			position object objid+1,sx#,sy#,sz#
			rotate object objid+1,sxa#,sya#,0
		endif

		rem Out of Steam
		killbullet=0
		bullet#(b,2)=bullet#(b,2)+1
		if bullet#(b,2)>40 then killbullet=1

		rem Collision with ground
		if eh#<get ground height(1,ex#+mx#,ez#+mz#)
			killbullet=1
		endif

		rem Collision with goblin
		triggerrevenge=-1
		for g=1 to enemymax
			if killbullet=0
				if goblin#(g,1)=1
					gobjid=100+(g*2)+0
					gx#=goblin#(g,2)-ex#
					gy#=get ground height(1,goblin#(g,2)+mx#,goblin#(g,3)+mz#)
					if gy#<-50.0 then gy#=-50.0
					gy#=gy#+15.0
					gz#=goblin#(g,3)-ez#
					if sqrt(abs(gx#*gx#)+abs(gz#*gz#))<20.0	
						if abs(eh#-gy#)<15.0
							ss=goblin#(g,12)
							if goblin#(g,12)<>2
								goblin#(g,12)=2
								activate_enemy(g,mx#,mz#)
								rg=goblin#(g,11)
								if rg>0
									rgobj=1000+(rg*2)+0
									position sound 100+(g*2)+0,object position x(rgobj),object position y(rgobj),object position z(rgobj)
									play sound 100+(g*2)+1
									stop sound 100+(g*2)+0
									fn=goblin#(g,13)
									play object rgobj,fallstart(fn),fallend(fn)
									if object exist(rgobj+1)=1 then play object rgobj+1,fallstart(fn),fallend(fn)
									killbullet=1
									triggerrevenge=g
								else
									goblin#(g,12)=ss
								endif
							endif
						endif
					endif
				endif
			endif
		next g

		rem If goblin struck, trigger neighbours to attack
		if triggerrevenge>0
			for g=1 to enemymax
				ex#=goblin#(g,2)-goblin#(triggerrevenge,2)
				ez#=goblin#(g,3)-goblin#(triggerrevenge,3)
				d#=sqrt(abs(ex#*ex#)+abs(ez#*ez#))
				if d#<200.0
					if goblin#(g,12)<=1 and goblin#(g,14)=0
						goblin#(g,12)=1
						goblin#(g,14)=2 : rem and trigger anger!
						activate_enemy(g,x#,z#)
					endif
				endif
			next g
		endif

		rem Kill bullet
		if killbullet=1
			move object objid,25.0
			ex#=object position x(objid)
			ez#=object position z(objid)
			makesmoke(ex#,eh#,ez#,3.0)
			hide object objid+0
			hide object objid+1
			bullet#(b,1)=0
		endif

	endif
next b

return

_control_enemies:

rem AI Control: Always Attack Anywhere
for g=1 to enemymax
	initialfind=0
	if goblin#(g,12)=0
		rem If player within view frustrum, activate
		ex#=goblin#(g,2)-x#
		ez#=goblin#(g,3)-z#
		d#=sqrt(abs(ex#*ex#)+abs(ez#*ez#))
		if d#<400.0
			rem Goblin finds you
			goblin#(g,12)=1
			initialfind=1
		endif
	endif
	if goblin#(g,12)>0
		activate_enemy(g,x#,z#)
		if initialfind=1
			rg=goblin#(g,11)
			if rg>0
				gobjid=1000+(rg*2)+0
				position sound 1000+(rg*2)+0,object position x(gobjid),object position y(gobjid),object position z(gobjid)
				play sound 1000+(rg*2)+0
				loop object gobjid+0,walkstart+5,walkend
				if object exist(gobjid+1)=1 then loop object gobjid+1,walkstart+5,walkend
				set object frame gobjid+0,walkstart
				if object exist(gobjid+1)=1 then set object frame gobjid+1,walkstart
			endif
		endif
	endif
	if goblin#(g,1)=0

		rem Hide RG
		rg=goblin#(g,11)
		if rg>0
			gobjid=1000+(rg*2)+0
			loop object gobjid+0,walkstart+5,walkend
			if object exist(gobjid+1)=1 then loop object gobjid+1,walkstart+5,walkend			
			set object frame gobjid+0,walkstart
			if object exist(gobjid+1)=1 then set object frame gobjid+1,walkstart
			realtodecal(g,rg)
		endif

		rem If goblin dead, wait for chance to emerge from doorway
		if rnd(1)=0
			ex#=850 : eh#=-50 : ez#=300
		else
			ex#=-650 : eh#=-50 : ez#=850
		endif
		goblin#(g,1)=1
		goblin#(g,2)=ex#
		goblin#(g,3)=ez#
		goblin#(g,4)=100+rnd(7)
		goblin#(g,6)=45+(rnd(3)*90)
		goblin#(g,7)=1
		goblin#(g,8)=rnd(1000)-500
		goblin#(g,9)=rnd(1000)-500
		goblin#(g,12)=1
		goblin#(g,13)=1+rnd(3)
		goblin#(g,14)=0
		goblin#(g,15)=0
		objid=100+(g*2)
		position object objid+0,ex#,eh#,ez#
		if object exist(objid+1)=1 then position object objid+1,ex#,eh#,ez#
		show object objid+0
		if object exist(objid+1)=1 then show object objid+1

	endif
next g

rem Reset detection of nearest goblin
closestgoblin=-1
closestgoblin#=9999.0

rem Control enemies
for g=1 to enemymax

	rem Goblin Id
	objid=100+(g*2)
	if goblin#(g,1)=1
	
		if goblin#(g,7)=1

			rem Goblin follows Destination Coordinate
			tx#=goblin#(g,8) : tz#=goblin#(g,9)
			point object objid,tx#,-50,tz#
			xrotate object objid,0 : zrotate object objid,0 

			rem End of Destination Move
			cx=goblin#(g,2)/10.0 : cz=goblin#(g,3)/10.0
			tx=goblin#(g,8)/10.0 : tz=goblin#(g,9)/10.0
			if cx=tx and cz=tz
				goblin#(g,7)=0 : goblin#(g,12)=0
				rg=goblin#(g,11)
				if rg>0
					loop object 1000+(rg*2)+0,idlestart,idleend
					if object exist(1000+(rg*2)+1)=1 then loop object 1000+(rg*2)+1,idlestart,idleend
					set object frame 1000+(rg*2)+0,idlestart
					if object exist(1000+(rg*2)+1)=1 then set object frame 1000+(rg*2)+1,idlestart
				endif
			endif

		else

			rem Goblin follows Player
			point object objid,x#,y#,z#
			xrotate object objid,0 : zrotate object objid,0 
	
			rem Ensure Goblin has free square
			boverlap=0
			bx=object position x(objid)/50.0
			bz=object position z(objid)/50.0
			for bg=1 to enemymax
				bgobjid=100+(bg*2)+0
				if goblin#(bg,1)=1
					tx=object position x(bgobjid)/50.0
					tz=object position z(bgobjid)/50.0
					if bg>g
						if bx=tx and bz=tz then boverlap=bg
					endif
				endif
			next bg
			if boverlap>0
				bgobjid=100+(boverlap*2)+0
				bb=(boverlap/2)
				bb=boverlap-(bb*2)
				yrotate object objid,wrapvalue((object angle y(objid)-70)+(140*bb))
			endif

		endif	
	
		rem Goblin moves forward
		if goblin#(g,12)=1

			rem Detect for charge opportunity
			dx#=goblin#(g,2)-x#
			dz#=goblin#(g,3)-z#
			d#=sqrt(abs(dx#*dx#)+abs(dz#*dz#))
			if d#<200.0 or goblin#(g,14)=2

				rem If not charging, CHARGE!
				if goblin#(g,14)<>1
					goblin#(g,14)=1
					goblin#(g,7)=0
					rg=goblin#(g,11)
					if rg>0
						gobjid=1000+(rg*2)
						loop object gobjid+0,chargestart+5,chargeend
						if object exist(gobjid+1)=1 then loop object gobjid+1,chargestart+5,chargeend
						set object frame gobjid+0,chargestart
						if object exist(gobjid+1)=1 then set object frame gobjid+1,chargestart
						set object speed gobjid+0,75
						if object exist(gobjid+1)=1 then set object speed gobjid+1,75
						position sound 1000+(rg*2)+0,object position x(gobjid),object position y(gobjid),object position z(gobjid)
						play sound 1000+(rg*2)+0
					endif
				endif

			endif

			rem Record cloest goblin for later
			if d#<closestgoblin#
				if goblin#(g,7)=0
					closestgoblin#=d# : closestgoblin=g
				endif
			endif

			rem Special charge mode
			if goblin#(g,14)=1
				rem Goblin makes a move
				move object objid,7.5
			else
				rem Goblin makes a move
				move object objid,2.5
	
				rem Make sound when tracking
				dx#=goblin#(g,2)-x#
				dz#=goblin#(g,3)-z#
				d#=sqrt(abs(dx#*dx#)+abs(dz#*dz#))
				if rnd(100)=0 or (rnd(20)=0 and d#<250.0)
					if sound playing(100+(g*2)+0)=0
						position sound 100+(g*2)+0,object position x(objid),object position y(objid),object position z(objid)
						play sound 100+(g*2)+0
					endif
				endif
			endif
	
		endif
	
		rem Update goblin position
		goblin#(g,2)=object position x(objid)
		goblin#(g,3)=object position z(objid)
	
		rem Goblin falls on floor
		if goblin#(g,12)=2
	
			rem Goblin waits for end of fall animation
			rg=goblin#(g,11)
			if rg>0
				gobjid=1000+(rg*2)
				fn=goblin#(g,13)
				if fn=1 then vanishvalue=45 : cutoff=0
				if fn=2 then vanishvalue=45 : cutoff=0
				if fn=3 then vanishvalue=45 : cutoff=0
				if fn=4 then vanishvalue=45 : cutoff=0
				if object frame(gobjid)>=fallstart(fn)+vanishvalue
					sc#=100-((object frame(gobjid)-(fallstart(fn)+vanishvalue))*4)
					scale object gobjid+0,sc#,sc#,100
					if object exist(gobjid+1)=1 then scale object gobjid+1,sc#,sc#*-1,100
					if sound playing(1000+(rg*2)+1)=0
						position sound 1000+(rg*2)+1,object position x(gobjid),object position y(gobjid),object position z(gobjid)
						play sound 1000+(rg*2)+1
					endif
				endif
				if object frame(gobjid)>=fallend(fn)-cutoff
					loop object gobjid+0,walkstart+5,walkend
					if object exist(gobjid+1)=1 then loop object gobjid+1,walkstart+5,walkend
					set object speed gobjid+0,50
					if object exist(gobjid+1)=1 then set object speed gobjid+1,50
					scale object gobjid,100,100,100
					if object exist(gobjid+1)=1 then scale object gobjid+1,100,-100,100
					realtodecal(g,rg)
					goblin#(g,1)=0
					goblin#(g,11)=0
					goblin#(g,12)=0
					hide object 100+(g*2)+0
					if object exist(100+(g*2)+1)=1 then hide object 100+(g*2)+1
				endif
			endif
			
		endif
	
		rem Goblin is attacking
		if goblin#(g,12)=3

			rem Goblin waits for end of fall animation
			rg=goblin#(g,11)
			if rg>0
				gobjid=1000+(rg*2)
				if object frame(gobjid)>=attackend-2
					goblin#(g,12)=1
					loop object gobjid+0,walkstart+5,walkend
					if object exist(gobjid+1)=1 then loop object gobjid+1,walkstart+5,walkend
				endif
				if object frame(gobjid)>=attackstart+10 and object frame(gobjid)<=attackstart+20
					rem Damage player when anim struck
					hurt#=100.0
				endif
			endif

		endif

		rem Extra handling for RG goblins
		rg=goblin#(g,11)
		if rg>0

			rem Handle visual RG
			gobjid=1000+(rg*2)
			ey#=object position y(objid)
			position object gobjid,goblin#(g,2),ey#,goblin#(g,3)
			rotate object gobjid,object angle x(objid),object angle y(objid),object angle z(objid)
			yrotate object gobjid+0,wrapvalue(object angle y(gobjid)+180)
			if object exist(gobjid+1)=1 then yrotate object gobjid+1,object angle y(gobjid)

			rem Goblin attacks if close to player
			dx#=goblin#(g,2)-x#
			dz#=goblin#(g,3)-z#
			d#=sqrt((dx#*dx#)+(dz#*dz#))
			if d#<50.0 and goblin#(g,12)<=1
				goblin#(g,12)=3
				position sound 1000+(rg*2)+0,object position x(gobjid),object position y(gobjid),object position z(gobjid)
				play sound 1000+(rg*2)+0
				play object gobjid+0,attackstart,attackend
				if object exist(gobjid+1)=1 then play object gobjid+1,attackstart,attackend
			endif

		endif

	endif

next g

rem Control enemies
for g=1 to enemymax

	rem Affect goblin by gravity
	fx#=0 : fz#=0
	for r=0 to 35
		ex#=newxvalue(goblin#(g,2),r*10,10)
		ez#=newzvalue(goblin#(g,3),r*10,10)
		eh#=get ground height(1,ex#+mx#,ez#+mz#)
		if eh#<-50.0 then eh#=-50.0
		force#=(eh#+50.0)/50.0
		fx#=fx#+((ex#-goblin#(g,2))*force#)
		fz#=fz#+((ez#-goblin#(g,3))*force#)
	next r
	ex#=goblin#(g,2)-(fx#/36.0)
	ez#=goblin#(g,3)-(fz#/36.0)
	goblin#(g,2)=ex# : goblin#(g,3)=ez#
	objid=100+(g*2)+0

	rem Transfer position to real goblin
	rg=goblin#(g,11)
	if rg>0

		rem Determine whether goblin climbing up or down hill
		gobjid=1000+(rg*2)
		fa#=object angle y(gobjid)
		fx#=newxvalue(goblin#(g,2),fa#,5.0)
		fz#=newzvalue(goblin#(g,3),fa#,5.0)
		fb#=get ground height(1,goblin#(g,2)+mx#,goblin#(g,2)+mz#)
		fa#=get ground height(1,fx#+mx#,fz#+mz#)
	
		rem Position RG goblin
		position object gobjid+0,ex#,eh#,ez#
		if object exist(gobjid+1)=1 then position object gobjid+1,ex#,-50-(eh#+50),ez#

		rem Control RG walk or slide anim
		if goblin#(g,12)=1
			if force#>1.0 and fb#>fa#
				if goblin#(g,15)=0
					goblin#(g,15)=1
					loop object gobjid+0,slidestart+10,slideend-10
					if object exist(gobjid+1)=1 then loop object gobjid+1,slidestart+10,slideend-10
					set object frame gobjid+0,slidestart
					if object exist(gobjid+1)=1 then set object frame gobjid+1,slidestart
				endif
				makesmoke(ex#,eh#,ez#,5.0)
			else
				if goblin#(g,15)=1
					goblin#(g,15)=0
					loop object gobjid+0,walkstart+5,walkend
					if object exist(gobjid+1)=1 then loop object gobjid+1,walkstart+5,walkend
					set object frame gobjid+0,walkstart+5
					if object exist(gobjid+1)=1 then set object frame gobjid+1,walkstart+5
				endif
			endif
		endif

	else
		position object objid+0,ex#,eh#+18,ez#
		if object exist(objid+1)=1 then position object objid+1,ex#,-68-(eh#+50),ez#
	endif

	rem Maintain decal goblins
	for b=0 to 1
		objid=100+(g*2)+b
		if object exist(objid)=1
			point object objid,x#,y#,z#
			xrotate object objid,0 : zrotate object objid,0 
			goblin#(g,5)=goblin#(g,5)+1
			if goblin#(g,5)>3
				goblin#(g,5)=0
				goblin#(g,4)=goblin#(g,4)+1
				if goblin#(g,4)>109 then goblin#(g,4)=100
			endif
			sighty#=atanfull(x#-goblin#(g,2),z#-goblin#(g,3))
			if goblin#(g,12)=1
				dirface=4
				goblin#(g,5)=goblin#(g,5)+1
			else
				dirface=wrapvalue(goblin#(g,6)+sighty#)/90.0
			endif
			image=goblin#(g,4)+(dirface*10)
			texture object objid,image
		endif
	next b

	rem Scale decal based on mode
	objid=100+(g*2)
	if goblin#(g,12)=1
		scale object objid,130,100,500
		if object exist(objid+1)=1 then scale object objid+1,130,-100,500
	else
		scale object objid,100,100,500
		if object exist(objid+1)=1 then scale object objid+1,100,-100,500
	endif

next g

return

_control_weather:

rem Control skycover
scroll object texture 52,0.001,0.0001
scroll object texture 53,0.002,-0.002

if lowmode=0
	rem Control rain
	for t=1 to 20
		makeraindrop(x#,y#,z#)
	next t
endif

return


_create_world:

rem Generate random crator
mx#=1000 : mz#=1000
make matrix 1,2000,2000,25,25
position matrix 1,mx#*-1,0,mz#*-1

rem Height map
dim map(25,25)
dim mh(25,25)

rem Load or generate
if 1=1
	rem load perimetor
	load array "map.dat",map(0)
else
	rem Design perimetor
	for t=0 to 25
		r=50+rnd(50)
		map(0,t)=r : map(t,0)=r
		map(1,t)=r : map(t,1)=r
		map(25,t)=r : map(t,25)=r
	next t
	for t=1 to 100 : map(rnd(25),rnd(25))=1+rnd(2) : next t
	for t=1 to 75 : map(2+rnd(21),2+rnd(21))=100+rnd(50) : next t
	for z=2 to 23 step 2 
		for x=2 to 23 step 2
			map(x,z)=0
		next x
	next z
	save array "tempmap.dat",map(0)
endif

rem Texture matrix
load image "floor.bmp",1
prepare matrix texture 1,1,4,4

rem Add hills
for c=1 to 20
for x=0 to 25
for z=0 to 25
	if map(x,z)>0
		map(x,z)=map(x,z)-1
		for tx=-1 to 1
		for tz=-1 to 1
			gx=x+tx : gz=z+tz
			if gx>=0 and gx<=25 and gz>=0 and gz<=25
				mh(gx,gz)=mh(gx,gz)+(5-((abs(tx)+abs(tz))/2))
				set matrix height 1,gx,gz,mh(gx,gz)
			endif
		next tz
		next tx
	else
		set matrix height 1,x,z,-100
	endif
	if x>=0 and x<=24 and z>=0 and z<=24
		if x<=2 or x=23 or x=24 or z<=2 or z=23 or z=24
			set matrix tile 1,x,z,9+rnd(7)
		else
			set matrix tile 1,x,z,1+rnd(7)
		endif
	endif
next z
next x
next c
update matrix 1

rem Create sky
color backdrop 0

rem Create ice-floor
load object "sky.x",51
load image "clouds.bmp",3
scale object 51,500000,500000,500000
position object 51,0,-50,0
texture object 51,3
ghost object on 51

rem Create cloud-cover1
load object "sky.x",52
scale object 52,5000000,5000000,5000000
position object 52,0,550,0
texture object 52,3
ghost object on 52

rem Create cloud-cover2
load object "sky.x",53
scale object 53,5000000,5000000,5000000
position object 53,0,545,0
texture object 53,3
ghost object on 53
scroll object texture 53,0.5,0.2

rem Find lowest point of map
lowest=9999
for x=2 to 24
for z=2 to 24
if mh(x,z)<lowest then lowest=mh(x,z) : lowestx=x : lowestz=z
next z
next x
x#=lowestx*((mx#*2)/25.0)-mx#
z#=lowestz*((mz#*2)/25.0)-mz#

rem Erode path from starting position to center
for x=lowestx to 12
	for z=lowestz to 12
		set matrix height 1,x,z,-100
	next z
next x
update matrix 1

rem Create goblin doorway1
load object "cave.x",91
position object 91,850,-50,300
yrotate object 91,270
fade object 91,200

rem Create goblin doorway2
load object "cave.x",92
position object 92,-650,-50,850
yrotate object 92,180
fade object 92,200

rem Free temp arrays
undim map(0)
undim mh(0)

rem Setup Scene
set camera range 3,10000
set ambient light 50

return

_create_enemies:

rem Create Enemies
for g=1 to enemymax

	rem Goblin data
	ex#=rnd(1000)-500
	ez#=rnd(1000)-500
	goblin#(g,1)=1
	goblin#(g,2)=ex#
	goblin#(g,3)=ez#
	goblin#(g,4)=100+rnd(7)
	goblin#(g,5)=0
	goblin#(g,6)=45+(rnd(3)*90)
	goblin#(g,11)=0
	goblin#(g,12)=0
	goblin#(g,13)=1+rnd(3)

	rem Goblin
	objid=100+(g*2)+0
	make object plain objid,30,40
	texture object objid,100
	set object objid,1,0,0
	eh#=get ground height(1,ex#+mx#,ez#+mz#)
	if eh#<-50.0 then eh#=-50.0
	position object objid,ex#,eh#+18,ez#

	rem Goblin Reflection
	objid=100+(g*2)+1
	make object plain objid,30,40
	texture object objid,100
	set object objid,1,0,0
	eh#=get ground height(1,ex#+mx#,ez#+mz#)
	if eh#<-50.0 then eh#=-50.0
	position object objid,ex#,-68-(eh#+50),ez#
	scale object objid,100,-100,100

next g

rem Create Real Aliens
for g=1 to 5

	rem Borrow goblin positions
	ex#=goblin#(g,2)
	ez#=goblin#(g,3)
	ea#=goblin#(g,6)
	ew#=5+rnd(15)

	rem Real Goblin
	objid=1000+(g*2)+0 : idlestart=0
	load object "idle.x",objid : idleend=total object frames(objid)
	walkstart=total object frames(objid)+1
	append object "walk.x",objid,walkstart : walkend=total object frames(objid)
	fallstart(1)=total object frames(objid)+1
	append object "die4.x",objid,fallstart(1) : fallend(1)=total object frames(objid)
	fallstart(2)=total object frames(objid)+1
	append object "die1.x",objid,fallstart(2) : fallend(2)=total object frames(objid)
	fallstart(3)=total object frames(objid)+1
	append object "die2.x",objid,fallstart(3) : fallend(3)=total object frames(objid)
	fallstart(4)=total object frames(objid)+1
	append object "die3.x",objid,fallstart(4) : fallend(4)=total object frames(objid)
	attackstart=total object frames(objid)+1
	append object "punch.x",objid,attackstart : attackend=total object frames(objid)
	chargestart=total object frames(objid)+1
	append object "charge.x",objid,chargestart : chargeend=total object frames(objid)
	slidestart=total object frames(objid)+1
	append object "slide.x",objid,slidestart : slideend=total object frames(objid)
	`
	eh#=get ground height(1,ex#+mx#,ez#+mz#)
	if eh#<-50.0 then eh#=-50.0
	position object objid,ex#,eh#,ez#
	yrotate object objid,ea#
	scale object objid,90,90,90
	set object speed objid,10
	set object rotation zyx objid
	set object frame objid,ew#
	fn=1 : loop object objid,walkstart+5,walkend
	hide object objid
	
	rem Real Goblin Reflection
	objid=1000+(g*2)+1
	load object "idle.x",objid
	append object "walk.x",objid,walkstart
	append object "die4.x",objid,fallstart(1)
	append object "die1.x",objid,fallstart(2)
	append object "die2.x",objid,fallstart(3)
	append object "die3.x",objid,fallstart(4)
	append object "punch.x",objid,attackstart
	append object "charge.x",objid,chargestart
	append object "slide.x",objid,slidestart
	eh#=get ground height(1,ex#+mx#,ez#+mz#)
	if eh#<-50.0 then eh#=-50.0
	position object objid,ex#,-50-(eh#+50),ez#
	yrotate object objid,ea#
	scale object objid,90,-90,90
	set object speed objid,10
	set object rotation zyx objid
	set object frame objid,ew#
	fn=1 : loop object objid,walkstart+5,walkend
	hide object objid

next rg

rem First five are active
for g=1 to 5
	goblin#(g,12)=1
	rg=g : decaltoreal(g,rg)
next g

return

_create_player:

rem Create Player
make object cube 1,10
hide object 1

rem Create Guns
for g=2 to 3
	if g=2
		load object "gunR.x",g
	else
		load object "gunL.x",g
	endif
	scale object g,200,200,200
	set object rotation zyx g
	gpx#(g-2)=x# : gpy#(g-2)=y#-100 : gpz#(g-2)=z#
next g

rem Create Laser Bolts
for l=0 to 10
	for b=0 to 1
		ll=4+(l*2)+b
		load object "pulse001.x",ll
		scale object ll,500,200,5000
		set object rotation zyx ll
		hide object ll
	next b
next l

rem Create needle for compass
make object plain 80,128,128
load image "needle.bmp",80
texture object 80,80
lock object on 80
set object 80,1,0,0
position object 80,240,165,400
scale object 80,25,75,500
fade object 80,200

rem Create compass
make object plain 81,128,128
load image "compass.bmp",81
texture object 81,81
lock object on 81
set object 81,1,0,0
position object 81,240,165,400
scale object 81,100,100,500
fade object 81,200

rem Create shade compass
make object plain 82,128,128
load image "shade.bmp",82
texture object 82,82
lock object on 82
set object 82,1,0,0
position object 82,240,165,400
scale object 82,100,100,500
fade object 82,200
ghost object on 82

rem Create status panels
make object plain 83,128,128
load image "stats.bmp",83
texture object 83,83
lock object on 83
set object 83,1,0,0
position object 83,-240,165,400
scale object 83,100,100,500
fade object 83,200

rem Set initial player angle
cya#=90.0

return

_generate_goblins:

rem Create decal images for alien
if 1=1
	load bitmap "goblin.bmp",5
	gobmax=0
	for d=0 to 4
		x=0
		for f=0 to 19 step 2
			rem Modified half-sized final bitmap
			get image 100+x+(d*10),(x*81),(d*128),(x*81)+81,(d*128)+128
			inc gobmax
			inc x
		next f
	next d
	delete bitmap 5
else
	autocam on
	sync off
	backdrop on
	set ambient light 50
	color backdrop 0
	load object "idle.x",100
	walkstart=total object frames(100)+1
	append object "walk.x",100,walkstart
	walkend=total object frames(100)
	fade object 100,200
	create bitmap 5,(192*10),256*5
	gobmax=0
	for d=0 to 4
		if d<4
			yrotate object 100,wrapvalue(45+(d*90))
			fstart=0
			fmax=20-1
		else
			yrotate object 100,0
			fstart=walkstart+5
			fmax=(walkend-walkstart)-6
			scale object 100,70,100,100
		endif
		x=0
		for f=0 to fmax step 2
			set object frame 100,fstart+f
			set current bitmap 0
			get image 100+x+(d*10),234,0,234+192,256
			set current bitmap 5
			paste image 100+x+(d*10),x*192,d*256
			inc gobmax
			inc x
		next f
	next d
	save bitmap "goblin.bmp",5
	delete object 100
	delete bitmap 5
	gobanim=100
	autocam off
	sync on
endif

return


rem ** Functions **

function makeraindrop(x#,y#,z#)

	rem Find spare decal
	fd=1 : for d=1 to decalmax(1) : if decal#(d,1)=0 : fd=d : endif : next d
	
	rem Create fire
	decal#(fd,1)=1
	decal#(fd,2)=(x#+100)-rnd(200)
	decal#(fd,3)=y#+150+rnd(50)
	decal#(fd,4)=(z#+100)-rnd(200)

	rem Object
	objid=10000+fd : dodecal(objid)
	
endfunction

function makesmoke(x#,y#,z#,size#)

	rem Find spare decal
	fd=1 : for d=1 to decalmax(1) : if decal#(d,1)=0 : fd=d : endif : next d
	
	rem Create fire
	decal#(fd,1)=2
	decal#(fd,2)=(x#+1)-rnd(2)
	decal#(fd,3)=(y#+1)-rnd(2)
	decal#(fd,4)=(z#+1)-rnd(2)
	decal#(fd,5)=rnd(350)
	decal#(fd,6)=(2+rnd(2))/10.0
	decal#(fd,7)=rnd(10)/10.0
	decal#(fd,8)=100-rnd(10)
	decal#(fd,9)=size#

	rem Object
	objid=10000+fd : dodecal(objid)
	texture object objid,1001

endfunction

function dodecal(objid)
	if object exist(objid)=0 then make object plain objid,10,10
	set object objid,1,0,0
	ghost object on objid
endfunction

function controldecals(mx#,mz#)

	rem All decals
	for d=1 to decalmax(1)

		rem Object id
		objid=10000+d
		if object exist(objid)=1

			rem Control rain decals
			if decal#(d,1)=1
				position object objid,decal#(d,2),decal#(d,3),decal#(d,4)		
				point object objid,camera position x(),camera position y(),camera position z()
				xrotate object objid,0 : zrotate object objid,0
				scale object objid,3,100,100
				decal#(d,3)=decal#(d,3)-15.0
				if decal#(d,3)<-50.0
					decal#(d,1)=0
				endif
				show object objid
			endif		

			rem Control smoke decals
			if decal#(d,1)=2
				position object objid,decal#(d,2),decal#(d,3),decal#(d,4)		
				point object objid,camera position x(),camera position y(),camera position z()
				xrotate object objid,0 : zrotate object objid,0
				decal#(d,5)=wrapvalue(decal#(d,5)+2)
				decal#(d,2)=decal#(d,2)+(cos(decal#(d,5))*decal#(d,7))
				decal#(d,3)=decal#(d,3)+decal#(d,6)
				scx#=(150-(decal#(d,8)*1.3))*decal#(d,9)
				scz#=(250-decal#(d,8))*decal#(d,9)
				scale object objid,scx#,decal#(d,8),scz#
				decal#(d,8)=decal#(d,8)-2.0
				if decal#(d,8)<=0
					decal#(d,1)=0
				endif
				show object objid
			endif			

			rem Hide unused decals
			if decal#(d,1)=0 then hide object objid

		endif
	
	rem End of decal loop
	next d

endfunction

function activate_enemy(g,x#,z#)

rem If alive
if goblin#(g,1)>0

	rem Only if not RG-active
	if goblin#(g,11)=0
	
		rem Find spare real goblin
		rgfound=-1
		for rg=1 to 5
			if real(rg)=0 then rgfound=rg
		next rg
	
		rem If this enemy is closer than current RG goblins, switch
		if rgfound=-1
	
			rem Determine if closer
			nx#=goblin#(g,2)-x#
			nz#=goblin#(g,3)-z#
			nd#=sqrt(abs(nx#*nx#)+abs(nz#*nz#))
			for rg=1 to 5
				tg=real(rg)
				tx#=goblin#(tg,2)-x#
				tz#=goblin#(tg,3)-z#
				td#=sqrt(abs(tx#*tx#)+abs(tz#*tz#))
				if nd#<td# and goblin#(tg,12)=1 then rgfound=rg
			next rg
	
			rem If closer, revert current RG holder
			if rgfound>0
				tg=real(rgfound)
				if tg>0 then realtodecal(tg,rgfound)
			endif
	
		endif
	
		rem If decal dying, must use real..
		if rgfound=-1
	
			if goblin#(g,12)=2 and goblin#(g,11)=0
				for rg=1 to 5
					tg=real(rg)
					if goblin#(tg,12)<>2 then rgfound=rg
				next rg
				if rgfound>0
					tg=real(rgfound)
					if tg>0 then realtodecal(tg,rgfound)
					decaltoreal(g,rgfound)
					rgfound=-1
				endif
			endif
	
		endif
	
		rem If RG available..
		if rgfound>0
			decaltoreal(g,rgfound)
		endif

	endif
	
endif
	
endfunction

function decaltoreal(g,rg)

	rem Prepare real goblin data
	ex#=goblin#(g,2)
	eh#=0.0
	ez#=goblin#(g,3)
	goblin#(g,11)=rg
	real(rg)=g

	rem Hide decal goblin
	hide object 100+(g*2)+0
	if object exist(100+(g*2)+1)=1 then hide object 100+(g*2)+1
	
	rem Show real goblin
	show object 1000+(rg*2)+0
	if object exist(1000+(rg*2)+1)=1 then show object 1000+(rg*2)+1

	rem Set speed
	set object speed 1000+(rg*2)+0,50
	if object exist(1000+(rg*2)+1)=1 then set object speed 1000+(rg*2)+1,50

	rem Position goblins
	position object 1000+(rg*2)+0,ex#,eh#,ez#
	if object exist(1000+(rg*2)+1)=1 then position object 1000+(rg*2)+1,ex#,-50-(eh#+50),ez#	

endfunction

function realtodecal(g,rg)

	rem Prepare real goblin data
	goblin#(g,11)=0
	real(rg)=0

	rem Show decal goblin
	show object 100+(g*2)+0
	if object exist(100+(g*2)+1)=1 then show object 100+(g*2)+1
	
	rem Hide real goblin
	hide object 1000+(rg*2)+0
	if object exist(1000+(rg*2)+1)=1 then hide object 1000+(rg*2)+1

	rem Set speed
	set object speed 1000+(rg*2)+0,10
	if object exist(1000+(rg*2)+1)=1 then set object speed 1000+(rg*2)+1,10

endfunction

function placelogo()

rem Create decal for logo
load image "logow.bmp",65000
make object plain 65000,128,144
position object 65000,25,-16.4,40
texture object 65000,65000
scale object 65000,10,10,50
set object 65000,1,0,0
fade object 65000,200
lock object on 65000

endfunction

 

Rechercher
Installer l'extension de recherche Plus d'informations

 

Comprendre
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin

 

Partager
La connaissance est la seule chose qui s'accroit lorsqu'on la partage. - Sacha Boudjema

 

Créer
L'imagination est plus importante que la connaissance. - Albert Einstein

 

 

Le wiki en images Le wiki en images Image du mois: «Snowball: un prototype de jeu développé avec NeL.