Stacking issues

Blitz3D Forums/Blitz3D Beginners Area/Stacking issues

Errrm ok, that code doesn't make much sense to me as I can't see how that works. For example you have a While without a condition, this immediately throws an error at me?!

Also you have height fields in both. So my questions at the moment would be:

1. how does the mouse interaction work? (is it click->drag->drop or click->click to drop?)

2. why are you using the mouse x/y coords with an 'equal to' check of the counter position? Are all the counters 1x1 in dimension?

A couple of other things to note, you don't have any 'End Type' statements, this throws errors up! Also you don't have a 'Next' for your embedded 'For' statement?!

Having said all this, let's see if I can show you an example of the method I was describing. I would work on the basis of using functions to handle these as Types can be accessed anywhere in the program and it makes for neater programming :)

I'll presume that counters are placed on the squares to a maximum height of 4 counters on a square, and that the last counter placed on the square is always the first selected when the mouse if clicked on it.

Also as your not moving the squares around (I presume only the counters move), I will remove the square type as it is not required, i.e. it is represented but not necessary to track.

Type counter
	Field sqx	;x square location
	Field sqy	;y square location
	Field cheight	; height on square
End Type

; FUNCTION: MoveCounter
;
; Pass the FROM square x and y and the TO square x and y
;
; Returns true if successful or false if the square is full (4 counters)
;
Function MoveCounter(fromsqx,fromsqy,tosqx,tosqy)
	;cf1-cf4 temp var holds pointers to any found counters on the from square
	Local cf1.counter,cf2.counter,cf3.counter,cf4.counter
	;ct1-ct4 temp var holds pointers to any found counters on the to square
	Local ct1.counter,ct2.counter,ct3.counter,ct4.counter
	;ctm is the pointer to the counter that is moving
	Local ctm.counter
	;c.counter is a temp var used for the loops only
	Local c.counter
	
	;loop through counters to find those on the from square and work out the counter that is moving
	For c.counter=Each counter
		;if the current counter in the loop is on our from square...
		If c\sqx=fromsqx And c\sqy=fromsqy Then
			;determine the height and place it in the relevant cf? var
			Select c\cheight
				Case 1
					cf1=c
				Case 2
					cf2=c
				Case 3
					cf3=c
				Case 4
					cf4=c
			End Select
		EndIf
	Next
	
	;work out the topmost counter on the from square and place a pointer in ctm.counter
	If cf4<>Null Then
		ctm=cf4
	ElseIf cf3<>Null Then
		ctm=cf3
	ElseIf cf2<>Null Then
		ctm=cf2
	ElseIf cf1<>Null Then
		ctm=cf1
	EndIf
	
	;loop through counters to find those on the to square
	For c.counter=Each counter
		;if the current counter in the loop is on our to square...
		If c\sqx=tosqx And c\sqy=tosqy Then
			;determine the height and place it in the relevant ct? var
			Select c\cheight
				Case 1
					ct1=c
				Case 2
					ct2=c
				Case 3
					ct3=c
				Case 4
					ct4=c
			End Select
		EndIf
	Next
	
	;work out the topmost counter on the to square and update the counter that is moving to be the topmost
	;NB: if there are already 4 counters on the square then the counter to move can't be moved!
	If ct1=Null Then
		ctm\sqx=tosqx
		ctm\sqy=tosqy
		ctm\cheight=1
	ElseIf ct2=Null Then
		ctm\sqx=tosqx
		ctm\sqy=tosqy
		ctm\cheight=2
	ElseIf ct3=Null Then
		ctm\sqx=tosqx
		ctm\sqy=tosqy
		ctm\cheight=3
	ElseIf ct4=Null Then
		ctm\sqx=tosqx
		ctm\sqy=tosqy
		ctm\cheight=4
	Else
		;already 4 on square so return false
		Return False
	EndIf
	
	;if we get to here then the counter was successfully moved so we return true
	Return True
	
End Function


*phew that took a while :)

I haven't tested it as I obviously don't have anything to test it with but I think the logic should work ok :)

Let me know if you have any questions or can better explain how your game is intending to use this code/data.