Animating Doors and similar

Blitz3D Forums/Blitz3D Programming/Animating Doors and similar

ive used data statements, they hold the info, the first item is how many doors there are. Got the code reduced by a huge amount, then one door caused loads of probs as it was a double one that slid. ended up being way too much code so it got changed:p

Even now its about as much code as the rest of the door function.

waiting to see what suggestions i get from a question i posted, will post the type setup after i see if it is going to change or not.

function DoorActions()
	for more.doors = each doors
		if MouseLeft And CameraPick( Camera , MouseX(), MouseY() ) = more\doorgfx
			If more\opening = False And more\open = False And more\closing = False And EntityDistance( playerbox , more\doorgfx ) < more\distance#
				more\delaytime = Millisecs() : more\opening = true : more\open = False : more\closing = False
			EndIf
		endIf
		if MouseLeft And CameraPick( Camera , MouseX(), MouseY() ) = more\doorgfx
			If more\opening = False And more\open = True And more\closing = False And EntityDistance( playerbox , more\doorgfx ) < more\distance#
				more\open = False : more\opening = False : more\closing = True
		   EndIf
		endIf
		;makes sure animation has finished before allowing another action
		if more\doortype = 1 or more\doortype = 2
			; open
			if more\open = False And more\opening = True  And more\closing = False
				more\moveup = more\moveup + more\moveamount
				if more\moveup > more\stopmax then more\moveup = more\stopmax : more\opening = False : more\open = True : more\closing = False
				if more\doortype = 1
					RotateEntity more\doorgfx, EntityPitch(more\doorgfx), EntityYaw(more\doorgfx) + more\moveamount, 0
				else ;if more\doortype = 2
				     PositionEntity more\doorgfx, more\posx#, more\posy# + more\moveup, more\posz#
				endif
			endif
			; close
			if more\opening = False And more\open = False And more\closing = True
				more\moveup = more\moveup - more\moveamount
				if more\moveup < 0 then more\moveup = 0 : more\opening = False : more\open = False : more\closing = False
				if more\doortype = 1
					RotateEntity more\doorgfx, EntityPitch(more\doorgfx), EntityYaw(more\doorgfx) - more\moveamount, 0
				else ;if more\doortype = 2
   					PositionEntity more\doorgfx, more\posx#, more\posy# + more\moveup, more\posz#
				endif
			endIf
			; timed close
			if more\opening = False And more\open = True And more\closing = False And Millisecs() > (more\delaytime + dooropenfor)
				more\moveup = more\moveup - more\moveamount
				if more\moveup < 0 then more\moveup = 0 : more\opening = False : more\open = False : more\closing = False
				if more\doortype = 1
					RotateEntity more\doorgfx, EntityPitch(more\doorgfx), EntityYaw(more\doorgfx) - more\moveamount, 0
				else ;if more\doortype = 2
				     PositionEntity more\doorgfx, more\posx#, more\posy# + more\moveup, more\posz#
				endif
			endIf
		elseif more\name$ = "stonegateL" and more\doortype = 3 ; for Stone Gates
			; open
			if more\open = False And more\opening = True  And more\closing = False
				more\moveup = more\moveup - more\moveamount : more = after more
				more\moveup = more\moveup + more\moveamount : more = before more
				if more\moveup < more\stopmax
					more\moveup = more\stopmax : more\opening = False : more\open = True : more\closing = False
					more = after more
					more\moveup = more\stopmax : more\opening = False : more\open = True : more\closing = False
					more = before more
				endif
			     PositionEntity more\doorgfx, more\posx# + more\moveup, more\posy#, more\posz#
                    more = after more
			     PositionEntity more\doorgfx, more\posx# + more\moveup, more\posy#, more\posz#
			     more = before more
			endif
			; close
			if more\opening = False And more\open = False And more\closing = True
				more\moveup = more\moveup + more\moveamount : more = after more
				more\moveup = more\moveup - more\moveamount : more = before more
				if more\moveup > 0
					more\moveup = 0 : more\opening = False : more\open = False : more\closing = False
					more = after more
					more\moveup = 0 : more\opening = False : more\open = False : more\closing = False
					more = before more
				endif
			     PositionEntity more\doorgfx, more\posx# + more\moveup, more\posy#, more\posz#
                    more = after more
			     PositionEntity more\doorgfx, more\posx# + more\moveup, more\posy#, more\posz#
			     more = before more
			endIf
			; timed close
			if more\opening = False And more\open = True And more\closing = False And Millisecs() > (more\delaytime + dooropenfor)
				more\moveup = more\moveup + more\moveamount : more = after more
				more\moveup = more\moveup - more\moveamount : more = before more
				if more\moveup > 0
					more\moveup = 0 : more\opening = False : more\open = False : more\closing = False
					more = after more
					more\moveup = 0 : more\opening = False : more\open = False : more\closing = False
					more = before more
				endif
			     PositionEntity more\doorgfx, more\posx# + more\moveup, more\posy#, more\posz#
                    more = after more
			     PositionEntity more\doorgfx, more\posx# + more\moveup, more\posy#, more\posz#
			     more = before more
			endIf
		endif
	next
end function